U1dJRyAoU2ltcGxpZmllZCBXcmFwcGVyIGFuZCBJbnRlcmZhY2UgR2VuZXJhdG9yKQoKU2VlIENIQU5HRVMuY3VycmVudCBmb3IgY3VycmVudCB2ZXJzaW9uLgoKVmVyc2lvbiAxLjMuMzkgKDIxIE1hcmNoIDIwMDkpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMjAwOS0wMy0xOTogYmh5CiAgICAgICAgICAgIFtQeXRob25dIEZpeCB0aGUgbWVtb3J5IGxlYWsgcmVsYXRlZCB0byBQeXRob24gMyB1bmljb2RlIGFuZCBDIGNoYXIqIGNvbnZlcnNpb24sCiAgICAgICAgICAgIHdoaWNoIGNhbiBiZSBzaG93biBpbiB0aGUgZm9sbG93aW5nIGV4YW1wbGUgYmVmb3JlIHRoaXMgZml4OgogICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgZnJvbSBsaV9jc3RyaW5nIGltcG9ydCAqCiAgICAgICAgICAgICAgICAgIGk9MAogICAgICAgICAgICAgICAgICB3aGlsZSBUcnVlOgogICAgICAgICAgICAgICAgICAgICAgaSArPSAxCiAgICAgICAgICAgICAgICAgICAgICBuID0gc3RyKGkpKjEwCiAgICAgICAgICAgICAgICAgICAgICB0ZXN0MyhuKQoKICAgICAgICAgICAgVGhpcyBmaXggYWZmZWN0ZWQgU1dJR19Bc0NoYXJQdHJBbmRTaXplKCkgc28geW91IGNhbm5vdCBjYWxsIHRoaXMgZnVuY3Rpb24gd2l0aAogICAgICAgICAgICBhIG51bGwgYWxsb2MgYW5kIG5vbi1udWxsIGNwdHIgYXJndW1lbnQgaW4gUHl0aG9uIDMsIG90aGVyd2lzZSBhIHJ1bnRpbWUgZXJyb3IKICAgICAgICAgICAgd2lsbCBiZSByYWlzZWQuCgoyMDA5LTAzLTE4OiB3c2Z1bHRvbgoJICAgIFtDI10gc3RkOjp2ZWN0b3I8VD4gd3JhcHBlciBpbXByb3ZlbWVudHMgZm9yIC5ORVQgMiBhbmQgYWxzbyBwcm92aWRpbmcgdGhlCgkgICAgbmVjZXNzYXJ5IG1hY2hpbmVyeSB0byB1c2UgdGhlIHN0ZDo6dmVjdG9yPFQ+IHdyYXBwZXJzIHdpdGggbW9yZSBhZHZhbmNlZCBmZWF0dXJlcyBzdWNoCgkgICAgYXMgTElOUSAtIHRoZSBDIyBwcm94eSBjbGFzcyBub3cgZGVyaXZlcyBmcm9tIElFbnVtZXJhYmxlPD4uIFRoZSBkZWZhdWx0IGlzIG5vdyB0byAKCSAgICBnZW5lcmF0ZSBjb2RlIHJlcXVpcmluZyAuTkVUIDIgYXMgYSBtaW5pbXVtLCBhbHRob3VnaCB0aGUgQyMgY29kZSBjYW4gYmUgY29tcGlsZWQgCgkgICAgZm9yIC5ORVQgMSBieSBkZWZpbmluZyB0aGUgU1dJR19ET1RORVRfMSBDIyBwcmVwcm9jZXNzb3IgY29uc3RhbnQuIFNlZSB0aGUgCgkgICAgc3RkX3ZlY3Rvci5pIGZpbGUgZm9yIG1vcmUgZGV0YWlscy4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMjAwOS0wMy0xMjogd3NmdWx0b24KCSAgICBbUnVieV0gRml4ICMyNjc2NzM4IFNXSUcgZ2VuZXJhdGVkIHN5bWJvbCBuYW1lIGNsYXNoZXMuCgoyMDA5LTAzLTAxOiBiaHkKICAgICAgICAgICAgW1B5dGhvbl0gU29tZSBmaXhlcyBmb3IgUHl0aG9uIDMuMC4xIGFuZCBoaWdoZXIgc3VwcG9ydC4gSW4gMy4wLjEsIHRoZSBDIEFQSSBmdW5jdGlvbgogICAgICAgICAgICBQeU9iamVjdF9Db21wYXJlIGlzIHJlbW92ZWQsIHNvIFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbCBpcyB1c2VkIGZvciByZXBsYWNlbWVudC4KICAgICAgICAgICAgU3RydWN0IGluaXRpbGl6YXRpb24gb2YgU3dpZ1B5T2JqZWN0IGFuZCBTd2lnUHlPYmplY3RfYXNfbnVtYmVyIGNoYW5nZWQgdG8gcmVmbGVjdAogICAgICAgICAgICB0aGUgZHJvcCBvZiB0cF9jb21wYXJlIGFuZCBuYl9sb25nLgoKMjAwOS0wMy0wMTogYmh5CiAgICAgICAgICAgIFtQeXRob25dIEZpeCBTRiMyNTgzMTYwLiBOb3cgdGhlIGltcG9ydGVyIGluIFB5dGhvbiBzaGFkb3cgd3JhcHBlciB0YWtlIGNhcmUgb2YgdGhlCiAgICAgICAgICAgIGNhc2UgdGhhdCBtb2R1bGUgYWxyZWFkeSBpbXBvcnRlZCBhdCBvdGhlciBwbGFjZS4KCjIwMDktMDItMjg6IGJoeQogICAgICAgICAgICBbUHl0aG9uXSBGaXggU0YjMjYzNzM1Mi4gTW92ZSBzdHJ1Y3QgZGVjbGFyYXRpb24gb2YgU1dJR19tb2R1bGUgaW4gcHlpbml0LnN3ZyBiZWZvcmUKICAgICAgICAgICAgdGhlIG1ldGhvZCBjYWxscywgc2luY2Ugc29tZSBDIGNvbXBpbGVyIGRvbid0IGFsbG93IGRlY2xhcmF0aW9uIGluIG1pZGRsZSBvZiBmdW5jdGlvbgogICAgICAgICAgICBib2R5LgoKMjAwOS0wMi0yMTogd3NmdWx0b24KCSAgICBbQWxsZWdyb2NsXSBGaXggc2VnIGZhdWx0IHdyYXBwaW5nIHNvbWUgY29uc3RhbnQgdmFyaWFibGUgKCVjb25zdGFudCkgdHlwZXMuCgoyMDA5LTAyLTIwOiB3c2Z1bHRvbgoJICAgIFtDRkZJXSBGaXggc2VnIGZhdWx0cyB3aGVuIGZvciAlZXh0ZW5kIGFuZCB1c2luZyBzdGF0ZW1lbnRzLgoKMjAwOS0wMi0yMDogd3NmdWx0b24KCSAgICBGaXggU0YgIzI2MDU5NTU6IC1jbyBvcHRpb24gd2hpY2ggYnJva2UgaW4gMS4zLjM3LiAKCjIwMDktMDItMjA6IHdzZnVsdG9uCgkgICAgTmV3ICVpbnNlcnQoImJlZ2luIikgc2VjdGlvbiBhZGRlZC4gQWxzbyBjYW4gYmUgdXNlZCBhcyAlYmVnaW4uIFRoaXMgaXMgYSBuZXcKCSAgICBjb2RlIHNlY3Rpb24gcmVzZXJ2ZWQgZW50aXJlbHkgZm9yIHVzZXJzIGFuZCB0aGUgY29kZSB3aXRoaW4gdGhlIHNlY3Rpb24gaXMgZ2VuZXJhdGVkCgkgICAgYXQgdGhlIHRvcCBvZiB0aGUgQy9DKysgd3JhcHBlciBmaWxlIGFuZCBzbyBwcm92aWRlcyBhIG1lYW5zIHRvIHB1dCBjdXN0b20gY29kZQoJICAgIGludG8gdGhlIHdyYXBwZXIgZmlsZSBiZWZvcmUgYW55dGhpbmcgZWxzZSB0aGF0IFNXSUcgZ2VuZXJhdGVzLgoKMjAwOS0wMi0xNzogd3NmdWx0b24KCSAgICAnbWFrZSBjbGVhbi10ZXN0LXN1aXRlJyB3aWxsIG5vdyBydW4gY2xlYW4gb24gQUxMIGxhbmd1YWdlcy4gUHJldmlvdXNseSBpdCBvbmx5CgkgICAgcmFuIHRoZSBjb3JyZWN0bHkgY29uZmlndXJlZCBsYW5ndWFnZXMuIFRoaXMgd2F5IGl0IGlzIG5vdyBwb3NzaWJsZSB0byBjbGVhbiB1cAoJICAgIHByb3Blcmx5IGFmdGVyIHJ1bm5pbmcgJ21ha2UgcGFydGlhbGNoZWNrLXRlc3Qtc3VpdGUnLgoKMjAwOS0wMi0xNDogd3NmdWx0b24KCSAgICBFeHRlbmQgYXR0cmlidXRlIGxpYnJhcnkgc3VwcG9ydCBmb3Igc3RydWN0cy9jbGFzc2VzIGFuZCB0aGUgYWNjZXNzb3IgZnVuY3Rpb25zIHVzZQoJICAgIHBhc3MvcmV0dXJuIGJ5IHZhbHVlIHNlbWFudGljcy4gVHdvIG5ldyBtYWNyb3MgYXJlIGF2YWlsYWJsZSBhbmQgdXNhZ2UgaXMgaWRlbnRpY2FsCgkgICAgdG8gJWF0dHJpYnV0ZS4gVGhlc2UgYXJlICVhdHRyaWJ1dGV2YWwgZm9yIHN0cnVjdHMvY2xhc3NlcyBhbmQgJWF0dHJpYnV0ZXN0cmluZyBmb3IKCSAgICBzdHJpbmcgY2xhc3NlcywgbGlrZSBzdGQ6OnN0cmluZy4gU2VlIGF0dHJpYnV0ZS5zd2cgZm9yIG1vcmUgZGV0YWlscy4KCjIwMDktMDItMTM6IHdzZnVsdG9uCgkgICAgQWRkIHN1cHBvcnQgZm9yICVleHRlbmQgYW5kIG1lbWJlcmluIHR5cGVtYXBzLiBQcmV2aW91c2x5IHRoZSBtZW1iZXJpbiB0eXBlbWFwcyB3ZXJlCgkgICAgaWdub3JlZCBmb3IgbWVtYmVyIHZhcmlhYmxlcyB3aXRoaW4gYSAlZXh0ZW5kIGJsb2NrLgoKMjAwOS0wMi0xMjogd3NmdWx0b24KCSAgICBSZW1vdmUgdW5uZWNlc3NhcnkgdGVtcG9yYXJ5IHZhcmlhYmxlIHdoZW4gd3JhcHBpbmcgcmV0dXJuIHZhbHVlcyB0aGF0IGFyZSByZWZlcmVuY2VzLiAKCSAgICBFeGFtcGxlIG9mIGdlbmVyYXRlZCBjb2RlIGZvciB3cmFwcGluZzoKCgkgICAgICBzdHJ1Y3QgWFlaIHsKCQlzdGQ6OnN0cmluZyYgcmVmUmV0dXJuKCk7CgkgICAgICB9OwoKCSAgICB1c2VkIHRvIGJlOgoKICAgICAgICAgICAgICBzdGQ6OnN0cmluZyAqcmVzdWx0ID0gMCA7CiAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgJl9yZXN1bHRfcmVmID0gKGFyZzEpLT5yZWZSZXR1cm4oKTsKICAgICAgICAgICAgICAgIHJlc3VsdCA9IChzdGQ6OnN0cmluZyAqKSAmX3Jlc3VsdF9yZWY7CiAgICAgICAgICAgICAgfQoKCSAgICAgTm93IGl0IGlzOgoKICAgICAgICAgICAgICBzdGQ6OnN0cmluZyAqcmVzdWx0ID0gMCA7CiAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgcmVzdWx0ID0gKHN0ZDo6c3RyaW5nICopICYoYXJnMSktPnJlZlJldHVybigpOwoKMjAwOS0wMi0wODogYmh5CiAgICAgICAgICAgIENoYW5nZSB0aGUgU0laRSBtYXBwZWQgYnkgJXB5YnVmZmVyX211dGFibGVfYmluYXJ5IGFuZCAlcHlidWZmZXJfYmluYXJ5IGluIHB5YnVmZmVyLmkgZnJvbQogICAgICAgICAgICB0aGUgbGVuZ3RoIG9mIHRoZSBidWZmZXIgdG8gdGhlIG51bWJlciBvZiBpdGVtcyBpbiB0aGUgYnVmZmVyLgoKMjAwOS0wMi0wODogd3NmdWx0b24KICAgICAgICAgICAgRml4ICVmZWF0dXJlIG5vdCB3b3JraW5nIGZvciBjb252ZXJzaW9uIG9wZXJhdG9ycywgcmVwb3J0ZWQgYnkgTWF0dCBTcHJhZ3VlLCBmb3IgZXhhbXBsZToKCSAgICAgICVmZWF0dXJlKCJjczptZXRob2Rtb2RpZmllcnMiKSBvcGVyYXRvciBib29sICJwcm90ZWN0ZWQiOwoKMjAwOS0wMi0wNzogd3NmdWx0b24KICAgICAgICAgICAgW016U2NoZW1lXSBBcHBseSAjMjA4MTk2NyBjb25maWd1cmUgY2hhbmdlcyBmb3IgZXhhbXBsZXMgdG8gYnVpbGQgd2l0aCByZWNlbnQgUExUIHZlcnNpb25zLgoJICAgIEFsc28gZml4ZXMgTWFrZWZpbGUgZXJyb3JzIGJ1aWxkaW5nIFNXSUcgZXhlY3V0YWJsZSB3aGVuIG16c2NoZW1lIHBhY2thZ2UgaXMgaW5zdGFsbGVkIAoJICAgICh2ZXJzaW9uIDMuNzIgYXBwcm94IGFuZCBsYXRlcikuCgoyMDA5LTAyLTA0OiB0YWxieQogICAgICAgICAgICBbUGVybF0gRml4IFNGIzI1NjQxOTIgcmVwb3J0ZWQgYnkgRGF2aWQgS29sb3ZyYXRuay4KICAgICAgICAgICAgU1dJR19Bc0NoYXJQdHJBbmRTaXplKCkgbm93IGhhbmRsZXMgImdldCIgbWFnaWMuCgpWZXJzaW9uIDEuMy4zOCAoMzEgSmFudWFyeSAyMDA5KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMjAwOS0wMS0zMTogYmh5CiAgICAgICAgICAgIFtQeXRob25dIEZpeCBTRiMyNTUyNDg4IHJlcG9ydGVkIGJ5IEdhZXRhbiBMZWhtYW5uLiBOb3cgJXB5dGhvbnByZXBlbmQKICAgICAgICAgICAgYW5kICVweXRob25hcHBlbmQgaGF2ZSBjb3JyZWN0IGluZGVudGF0aW9uLgoKMjAwOS0wMS0zMTogYmh5CiAgICAgICAgICAgIFtQeXRob25dIEZpeCBTRiMyNTUyMDQ4IHJlcG9ydGVkIGJ5IEdhZXRhbiBMZWhtYW5uLiBUaGUgcGFyYW1ldGVyIGxpc3QKICAgICAgICAgICAgb2Ygc3RhdGljIG1lbWJlciBmdW5jdGlvbiBpbiBnZW5lcmF0ZWQgcHJveHkgY29kZSBzaG91bGQgbm90IGhhdmUgdGhlCiAgICAgICAgICAgICdzZWxmJyBwYXJhbWV0ZXIuCgoyMDA5LTAxLTI5OiB3c2Z1bHRvbgoJICAgIEZpeCByZWdyZXNzaW9uIGludHJvZHVjZWQgaW4gMS4zLjM3IHdoZXJlIHRoZSBkZWZhdWx0IG91dHB1dCBkaXJlY3RvcnkKCSAgICBmb3IgdGFyZ2V0IGxhbmd1YWdlIHNwZWNpZmljIGZpbGVzIChpbiB0aGUgYWJzZW5jZSBvZiAtb3V0ZGlyKSB3YXMgbm8KCSAgICBsb25nZXIgdGhlIHNhbWUgZGlyZWN0b3J5IGFzIHRoZSBnZW5lcmF0ZWQgYy9jKysgZmlsZS4KCjIwMDktMDEtMjg6IHdzZnVsdG9uCgkgICAgW0phdmEsIEMjXSBGaXggcHJveHkgY2xhc3Mgbm90IGJlaW5nIHVzZWQgd2hlbiB0aGUgZ2xvYmFsIHNjb3BlIG9wZXJhdG9yCgkgICAgd2FzIHVzZWQgZm9yIHBhcmFtZXRlcnMgcGFzc2VkIGJ5IHZhbHVlLiBSZXBvcnRlZCBieSBEYXZpZCBQaWVwZ3Jhc3MuCgoyMDA5LTAxLTE1OiB3c2Z1bHRvbgoJICAgIFtQZXJsXSBGaXggc2VnIGZhdWx0IHdoZW4gcnVubmluZyB3aXRoIC12IG9wdGlvbiwgcmVwb3J0ZWQgYnkgSm9obiBLeS4KClZlcnNpb24gMS4zLjM3ICgxMyBKYW51YXJ5IDIwMDkpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoyMDA5LTAxLTEzOiBtZ29zc2FnZQoJICAgIFtMdWFdIEFkZGVkIGNvbnRyYWN0IHN1cHBvcnQgZm9yIHJlcXVpcmluZyB0aGF0IHVuc2lnbmVkIG51bWJlcnMgYXJlID49MAoJICAgIFJld3JvdGUgbXVjaCBvZiBFeGFtcGxlcy9MdWEvZW1iZWQzLiAKCSAgICBBZGRlZCBhIGxvdCB0byB0aGUgTHVhIGRvY3VtZW50YXRpb24uCgoyMDA5LTAxLTEzOiB3c2Z1bHRvbgoJICAgIEZpeCBjb21waWxhdGlvbiBlcnJvciB3aGVuIHVzaW5nIGRpcmVjdG9ycyBvbiBwcm90ZWN0ZWQgdmlydHVhbCBvdmVybG9hZGVkIAoJICAgIG1ldGhvZHMgcmVwb3J0ZWQgYnkgU2FtIEhlbmRsZXkuCgoyMDA5LTAxLTEyOiBkcmpvZQogICAgICAgICAgICBbUl0gRml4ZWQgaGFuZGxpbmcgb2YgaW50ZWdlciBhcnJheXMKCjIwMDktMDEtMTA6IGRyam9lCgkgICAgW1JdIEZpeCBpbnRlZ2VyIGhhbmRsaW5nIGluIHIgdG8gZGVhbCBjb3JyZWN0bHkgd2l0aCBzaWduZWQKCSAgICBhbmQgdW5zaWduZWQgaXNzdWVzCgoyMDA5LTAxLTEwOiB3c2Z1bHRvbgoJICAgIFBhdGNoICAjMTk5Mjc1NiBmcm9tIENvbGluIE1jRG9uYWxkIC0gJWNvbnRyYWN0IG5vdCB3b3JraW5nIGZvciBjbGFzc2VzIAoJICAgIGluIG5hbWVzcGFjZQoKMjAwOS0wMS0wNTogb2xseQoJICAgIE1hcmsgU1dJR1BFUkw1LCBTV0lHUEhQNSwgYW5kIFNXSUdUQ0w4IGFzIGRlcHJlY2F0ZWQgaW4gdGhlIHNvdXJjZQoJICAgIGNvZGUgYW5kIHJlbW92ZSBkb2N1bWVudGF0aW9uIG9mIHRoZW0uCgoyMDA4LTEyLTMwOiB3c2Z1bHRvbgoJICAgIEJ1ZyAjMjQzMDc1Ni4gQWxsIHRoZSBsYW5ndWFnZXMgbm93IGRlZmluZSBhIG1hY3JvIGluIHRoZSBnZW5lcmF0ZWQgQy9DKysKCSAgICB3cmFwcGVyIGZpbGUgaW5kaWNhdGluZyB3aGljaCBsYW5ndWFnZSBpcyBiZWluZyB3cmFwcGVkLiBUaGUgbWFjcm8gbmFtZSBpcyB0aGUKCSAgICBzYW1lIGFzIHRob3NlIGRlZmluZWQgd2hlbiBTV0lHIGlzIHJ1biwgZWcgU1dJR0pBVkEsIFNXSUdPQ1RBVkUsIFNXSUdDU0hBUlAgZXRjCgkgICAgYW5kIGFyZSBsaXN0ZWQgaW4gdGhlICJDb25kaXRpb25hbCBDb21waWxhdGlvbiIgc2VjdGlvbiBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KCjIwMDgtMTItMjM6IHdzZnVsdG9uCgkgICAgW0phdmFdIEZpeCAjMjE1Mzc3MyAtICVub2phdmFleGNlcHRpb24gd2FzIGNsZWFyaW5nIHRoZSBleGNlcHRpb24gZmVhdHVyZQogICAgICAgICAgICBpbnN0ZWFkIG9mIGRpc2FibGluZyBpdC4gQ2xlYXJpbmcgY2hlY2tlZCBKYXZhIGV4Y2VwdGlvbnMgYWxzbyBkaWRuJ3Qgd29yay4gCgkgICAgVGhlIG5ldyAlY2xlYXJqYXZhZXhjZXB0aW9uIGNhbiBiZSB1c2VkIGZvciBjbGVhcmluZyB0aGUgZXhjZXB0aW9uIGZlYXR1cmUuCgoyMDA4LTEyLTIyOiB3c2Z1bHRvbgoJICAgIEZpeCAjMjQzMjgwMSAtIE1ha2UgU3dpZ1ZhbHVlV3JhcHBlciBleGNlcHRpb24gc2FmZSBmb3Igd2hlbiBjb3B5IGNvbnN0cnVjdG9ycwoJICAgIHRocm93IGV4Y2VwdGlvbnMuCgoyMDA4LTEyLTIxOiB3c2Z1bHRvbgoJICAgIEFwcGx5IHBhdGNoICMyNDQwMDQ2IHdoaWNoIGZpeGVzIHBvc3NpYmxlIHNlZyBmYXVsdHMgZm9yIG1lbWJlciBhbmQgZ2xvYmFsCgkgICAgdmFyaWFibGUgY2hhciBhcnJheXMgd2hlbiB0aGUgc3RyaW5ncyBhcmUgbGFyZ2VyIHRoYW4gdGhlIHN0cmluZyBhcnJheSBzaXplLgoKMjAwOC0xMi0yMDogd3NmdWx0b24KCSAgICBUaGUgY2NhY2hlIGNvbXBpbGVyIGNhY2hlIGhhcyBiZWVuIGFkYXB0ZWQgdG8gd29yayB3aXRoIFNXSUcgYW5kCgkgICAgbmFtZWQgY2NhY2hlLXN3aWcuIEl0IG5vdyB3b3JrcyB3aXRoIEMvQysrIGNvbXBpbGVycyBhcyB3ZWxsIGFzIFNXSUcKCSAgICBhbmQgY2FuIHJlc3VsdCBpbiBpbXByZXNzaXZlIHNwZWVkdXBzIHdoZW4gdXNlZCB0byByZWNvbXBpbGUgdW5jaGFuZ2VkCgkgICAgY29kZSB3aXRoIGVpdGhlciBhIEMvQysrIGNvbXBpbGVyIG9yIFNXSUcuIERvY3VtZW50YXRpb24gaXMgaW4gQ0NhY2hlLmh0bWwKCSAgICBvciB0aGUgaW5zdGFsbGVkIGNjYWNoZS1zd2lnIG1hbiBwYWdlLgoKMjAwOC0xMi0xMjogd3NmdWx0b24KCSAgICBBcHBseSBwYXRjaCBmcm9tIEthbHlhbm92IERtaXRyeSB3aGljaCBmaXhlcyBwYXJzaW5nIG9mIG5lc3RlZCBzdHJ1Y3RzCgkgICAgY29udGFpbmluZyBjb21tZW50cy4KCjIwMDgtMTItMTI6IHdzZnVsdG9uCgkgICAgRml4IGVycm9yIG1lc3NhZ2UgaW4gc29tZSBuZXN0ZWQgc3RydWN0IGFuZCAlaW5saW5lIHBhcnNpbmcgZXJyb3Igc2l0dWF0aW9ucwoJICAgIHN1Y2ggYXMgdW50ZXJtaW5hdGVkIHN0cmluZ3MgYW5kIGNvbW1lbnRzLgoKMjAwOC0xMi0wNzogb2xseQoJICAgIFtQSFBdIEZpeCB3YXJuaW5ncyB3aGVuIGNvbXBpbGluZyBnZW5lcmF0ZWQgd3JhcHBlciB3aXRoIEdDQyA0LjMuCgoyMDA4LTEyLTA2OiB3c2Z1bHRvbgoJICAgIFtQSFBdIERlcHJlY2F0ZSAlcHJhZ21hKHBocDQpLiBQbGVhc2UgdXNlICVwcmFnbWEocGhwKSBpbnN0ZWFkLgoJICAgIFRoZSBmb2xsb3dpbmcgdHdvIHdhcm5pbmdzIGhhdmUgYmVlbiByZW5hbWVkOgoJICAgIFdBUk5fUEhQNF9NVUxUSVBMRV9JTkhFUklUQU5DRSAtPiBXQVJOX1BIUF9NVUxUSVBMRV9JTkhFUklUQU5DRQoJICAgIFdBUk5fUEhQNF9VTktOT1dOX1BSQUdNQSAgICAgICAtPiBXQVJOX1BIUF9VTktOT1dOX1BSQUdNQQoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDA4LTEyLTA0OiBiaHkKICAgICAgICAgICAgW1B5dGhvbl0gQXBwbGllZCBwYXRjaCBTRiMyMTU4OTM4OiBhbGwgdGhlIFNXSUcgc3ltYm9sIG5hbWVzIHN0YXJ0ZWQgd2l0aCBQeQogICAgICAgICAgICBhcmUgY2hhbmdlZCwgc2luY2UgdGhleSBhcmUgaW5hcHByb3ByaWF0ZSBhbmQgZGlzY291cmFnZWQgaW4gUHl0aG9uCiAgICAgICAgICAgIGRvY3VtZW50YXRpb24gKGZyb20gaHR0cDovL3d3dy5weXRob24ub3JnL2RvYy8yLjUuMi9hcGkvaW5jbHVkZXMuaHRtbCk6CgogICAgICAgICAgICAiQWxsIHVzZXIgdmlzaWJsZSBuYW1lcyBkZWZpbmVkIGJ5IFB5dGhvbi5oIChleGNlcHQgdGhvc2UgZGVmaW5lZCBieQogICAgICAgICAgICB0aGUgaW5jbHVkZWQgc3RhbmRhcmQgaGVhZGVycykgaGF2ZSBvbmUgb2YgdGhlIHByZWZpeGVzICJQeSIgb3IgIl9QeSIuCiAgICAgICAgICAgIE5hbWVzIGJlZ2lubmluZyB3aXRoICJfUHkiIGFyZSBmb3IgaW50ZXJuYWwgdXNlIGJ5IHRoZSBQeXRob24gaW1wbGVtZW50YXRpb24KICAgICAgICAgICAgYW5kIHNob3VsZCBub3QgYmUgdXNlZCBieSBleHRlbnNpb24gd3JpdGVycy4gU3RydWN0dXJlIG1lbWJlciBuYW1lcyBkbwogICAgICAgICAgICBub3QgaGF2ZSBhIHJlc2VydmVkIHByZWZpeC4KCiAgICAgICAgICAgIEltcG9ydGFudDogdXNlciBjb2RlIHNob3VsZCBuZXZlciBkZWZpbmUgbmFtZXMgdGhhdCBiZWdpbiB3aXRoICJQeSIgb3IgIl9QeSIuCiAgICAgICAgICAgIFRoaXMgY29uZnVzZXMgdGhlIHJlYWRlciwgYW5kIGplb3BhcmRpemVzIHRoZSBwb3J0YWJpbGl0eSBvZiB0aGUgdXNlcgogICAgICAgICAgICBjb2RlIHRvIGZ1dHVyZSBQeXRob24gdmVyc2lvbnMsIHdoaWNoIG1heSBkZWZpbmUgYWRkaXRpb25hbCBuYW1lcyBiZWdpbm5pbmcKICAgICAgICAgICAgd2l0aCBvbmUgb2YgdGhlc2UgcHJlZml4ZXMuIgoKICAgICAgICAgICAgSGVyZSBpcyBhIGJyaWVmIGxpc3Qgb2Ygd2hhdCBjaGFuZ2VkOgoKICAgICAgICAgICAgICAgIFB5U3dpZyogLT4gU3dpZ1B5KgogICAgICAgICAgICAgICAgUHlPYmplY3RfcHRyIC0+IFN3aWdQdHJfUHlPYmplY3QKICAgICAgICAgICAgICAgIFB5T2JqZWN0X3ZhciAtPiBTd2lnVmFyX1B5T2JqZWN0CiAgICAgICAgICAgICAgICBQeVNlcXVlbmNlX0Jhc2UsIFB5U2VxdWVuY2VfQ29udCwgUHlTZXF1ZW5jZV9SZWYgLT4KICAgICAgICAgICAgICAgICAgICAgICAgU3dpZ1B5U2VxdWVuY2VfQmFzZSwgU3dpZ1B5U2VxdWVuY2VfQ29udCwgU3dpZ1B5U2VxdWVuY2VfUmVmCiAgICAgICAgICAgICAgICBQeU1hcCogLT4gU3dpZ1B5TWFwKgoKICAgICAgICAgICAgV2UgcHJvdmlkZWQgYSBweW5hbWVfY29tcGF0LmkgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuIFVzZXJzIHdob3NlIGNvZGUgaGF2aW5nCiAgICAgICAgICAgIHRoZXNlIHN5bWJvbHMgYW5kIGRvIG5vdCB3YW50IHRvIGNoYW5nZSBpdCBjb3VsZCBzaW1wbHkgaW5jbHVkZSB0aGlzIGZpbGUKICAgICAgICAgICAgYXQgZnJvbnQgb2YgeW91ciBjb2RlLiBBIGJldHRlciBzb2x1dGlvbiBpcyB0byBydW4gdGhlIGNvbnZlcnRpbmcgdG9vbCBvbgogICAgICAgICAgICB5b3VyIGNvZGUsIHdoaWNoIGhhcyBiZWVuIHB1dCBpbiBTV0lHJ3MgU1ZOIHRydW5rIChUb29scy9weW5hbWVfcGF0Y2gucHkpIGFuZAogICAgICAgICAgICB5b3UgY2FuIGRvd25sb2FkIGl0IGhlcmU6CiAgICAgICAgICAgIGh0dHBzOi8vc3dpZy5zdm4uc291cmNlZm9yZ2UubmV0L3N2bnJvb3Qvc3dpZy90cnVuay9Ub29scy9weW5hbWVfcGF0Y2gucHkgCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjIwMDgtMTItMDI6IHdzZnVsdG9uCgkgICAgW1B5dGhvbl0gQXBwbHkgcGF0Y2ggIzIxNDM3MjcgZnJvbSBTZXJnZSBNb25rZXdpdHogdG8gZml4IGltcG9ydGluZyBiYXNlIGNsYXNzZXMgCgkgICAgd2hlbiB0aGUgcGFja2FnZSBvcHRpb24gaXMgc3BlY2lmaWVkIGluICVtb2R1bGUgYW5kIHRoYXQgbW9kdWxlIGlzICVpbXBvcnQnZWQuCgoyMDA4LTExLTI4OiB3c2Z1bHRvbgoJICAgIFtVVExdIEZpeCAjMjA4MDQ5Ny4gU29tZSBpbmNvcnJlY3QgYWNjZXB0YW5jZSBvZiB0eXBlcyBpbiB0aGUgU1RMLCBlZyBhIGRvdWJsZSAqIGVsZW1lbnQKCSAgICBwYXNzZWQgaW50byBhIHZlY3RvcjxpbnQgKj4gY29uc3RydWN0b3Igd291bGQgYmUgYWNjZXB0ZWQsIGJ1dCB0aGUgZW5zdWluZyBiZWhhdmlvdXIKCSAgICB3YXMgdW5kZWZpbmVkLiBOb3cgdGhlIHR5cGUgY29udmVyc2lvbiBjb3JyZWN0bHkgcmFpc2VzIGFuIGV4Y2VwdGlvbi4KCjIwMDgtMTEtMjQ6IHdzZnVsdG9uCgkgICAgQWRkIC1vdXRjdXJyZW50ZGlyIG9wdGlvbi4gVGhpcyBzZXRzIHRoZSBkZWZhdWx0IG91dHB1dCBkaXJlY3RvcnkgdG8gdGhlIGN1cnJlbnQgCgkgICAgZGlyZWN0b3J5IGluc3RlYWQgb2YgdGhlIHBhdGggc3BlY2lmaWVkIGJ5IHRoZSBpbnB1dCBmaWxlLiBUaGlzIG9wdGlvbiBlbmFibGVzCgkgICAgYmVoYXZpb3VyIHNpbWlsYXIgdG8gYy9jKysgY29tcGlsZXJzLiBOb3RlIHRoYXQgdGhpcyBjb250cm9scyB0aGUgb3V0cHV0IGRpcmVjdG9yeSwKCSAgICBidXQgb25seSBpbiB0aGUgYWJzZW5jZSBvZiB0aGUgLW8gYW5kL29yIC1vdXRkaXIgb3B0aW9ucy4KCjIwMDgtMTEtMjM6IHdzZnVsdG9uCgkgICAgW3J1YnldIEFwcGx5IHBhdGNoICMyMjYzODUwIHRvIGZpeCBydWJ5L2ZpbGUuaSAuLi4gcnVieWlvLmggZmlsZW5hbWUgY2hhbmdlIGluIAoJICAgIHJ1YnkgMS45LgoKMjAwOC0xMS0yMzogd3NmdWx0b24KCSAgICBBcHBseSBwYXRjaCAjMjMxOTc5MCBmcm9tIEpvaGFuIEhha2UgdG8gZml4IHNoYXJlZF9wdHIgdXNhZ2UgaW4gc3RkOjp0cjEgbmFtZXNwYWNlLgoKMjAwOC0xMS0yMTogd3NmdWx0b24KCSAgICBUaGUgdXNlIG9mIHRoZSBpbmNsdWRlIHBhdGggdG8gZmluZCB0aGUgaW5wdXQgZmlsZSBpcyBub3cgZGVwcmVjYXRlZC4KCSAgICBUaGlzIG1ha2VzIHRoZSBiZWhhdmlvdXIgb2YgU1dJRyB0aGUgc2FtZSBhcyBDL0MrKyBjb21waWxlcnMgaW4gcHJlcGFyYXRpb24KCSAgICBmb3IgdXNlIHdpdGggY2NhY2hlLgoKMjAwOC0xMS0xNjogd3NmdWx0b24KCSAgICBGaXggLW5vcHJlcHJvY2VzcyBvcHRpb24gdG86CgkgICAgLSBjb3JyZWN0bHkgcmVwb3J0IGZpbGUgbmFtZXMgaW4gd2FybmluZyBhbmQgZXJyb3IgbWVzc2FnZXMuCgkgICAgLSB1c2UgdGhlIG9yaWdpbmFsIGlucHV0IGZpbGVuYW1lIHRoYXQgY3JlYXRlZCB0aGUgcHJlcHJvY2Vzc2VkIG91dHB1dCB3aGVuIAoJICAgICAgZGV0ZXJtaW5pbmcgdGhlIEMrKyB3cmFwcGVyIGZpbGUgbmFtZSAoaW4gdGhlIGFic2VuY2Ugb2YgLW8pLiBQcmV2aW91c2x5IAoJICAgICAgdGhlIG5hbWUgb2YgdGhlIGlucHV0IGZpbGUgY29udGFpbmluZyB0aGUgcHJlcHJvY2Vzc2VkIG91dHB1dCB3YXMgdXNlZC4KCjIwMDgtMTEtMTE6IHdzZnVsdG9uCgkgICAgW0phdmFdIEFkZCBwYXRjaCAjMjE1MjY5MSBmcm9tIE1BVFNVVVJBIFRha2Fub3JpIHdoaWNoIGZpeGVzIGNvbXBpbGVzIHVzaW5nIHRoZQoJICAgIEludGVsIGNvbXBpbGVyCgoyMDA4LTExLTAxOiB3c2Z1bHRvbgogICAgICAgICAgICBBZGQgcGF0Y2ggIzIxMjgyNDkgZnJvbSBBbmF0b2x5IFRlY2h0b25payB3aGljaCBjb3JyZWN0cyB0aGUgQy9DKysgcHJveHkKICAgICAgICAgICAgY2xhc3MgYmVpbmcgcmVwb3J0ZWQgZm9yIFB5dGhvbiBkb2NzdHJpbmdzIHdoZW4gJXJlbmFtZSBpcyB1c2VkLgoKMjAwOC0xMS0wMTogd3NmdWx0b24KICAgICAgICAgICAgQWRkIHRoZSBzdHJpcCBlbmNvZGVyIHBhdGNoIGZyb20gQW5hdG9seSBUZWNodG9uaWsgIzIxMzAwMTYuIFRoaXMgZW5hYmxlcyBhbiAKICAgICAgICAgICAgZWFzeSB3YXkgdG8gcmVuYW1lIHN5bWJvbHMgYnkgc3RyaXBwaW5nIGEgY29tbW9ubHkgdXNlZCBwcmVmaXggaW4gYWxsIHRoZQogICAgICAgICAgICBmdW5jdGlvbi9zdHJ1Y3QgbmFtZXMuIEl0IHdvcmtzIGluIHRoZSBzYW1lIHdheSBhcyB0aGUgb3RoZXIgZW5jb2RlcnMsIHN1Y2ggYXMKICAgICAgICAgICAgdGl0bGUsIGxvd2VyLCBjb21tYW5kIGV0YyBvdXRsaW5lZCBpbiBDSEFOR0VTIGZpbGUgZGF0ZWQgMTIvMzAvMjAwNS4gRXhhbXBsZQogICAgICAgICAgICBiZWxvdyB3aWxsIHJlbmFtZSB3eEFub3RoZXJXaWRnZXQgdG8gQW5vdGhlcldpZGdldCBhbmQgd3hEb1NvbWV0aGluZyB0byAKICAgICAgICAgICAgRG9Tb21ldGhpbmc6CgogICAgICAgICAgICAgICVyZW5hbWUoIiUoc3RyaXA6W3d4XSlzIikgIiI7IAoKICAgICAgICAgICAgICBzdHJ1Y3Qgd3hBbm90aGVyV2lkZ2V0IHsKICAgICAgICAgICAgICAgICAgdm9pZCB3eERvU29tZXRoaW5nKCk7CiAgICAgICAgICAgICAgfTsKCjIwMDgtMDktMjY6IG11dGFuZGl6CgkgICAgW2FsbGVncm9jbF0KCSAgICBMb3RzIG9mIHRlc3Qtc3VpdGUgd29yay4KCSAgICAtIEZpeCBvcmRlcmluZyBvZiB3cmFwcGVyIG91dHB1dCBhbmQgJXsgJX0gaGVhZGVyIG91dHB1dC4KCSAgICAtIEZpeCBkZWNsYXJhdGlvbnMgb2YgbG9jYWwgdmFycyBpbiBDIHdyYXBwZXJzLgoJICAgIC0gRml4IGRlY2xhcmF0aW9uIG9mIGRlZmluZWQgY29uc3RhbnRzIGluIEMgd3JhcHBlcnMuCgkgICAgLSBGaXggZGVjbGFyYXRpb24gb2YgRW51bVZhbHVlcyBpbiBDIHdyYXBwZXJzLgoJICAgIC0gYWRkIHNvbWUgY29uc3QgdHlwZW1hcHMgdG8gYWxsZWdyb2NsLnN3ZwoJICAgIC0gYWRkIHJlbmFtZSBmb3Igb3BlcmF0b3IgYm9vbCgpIG92ZXJsb2Fkcy4KCQoyMDA4LTA5LTI1OiBvbGx5CgkgICAgW1BIUDVdIEZpbGwgaW4gdHlwZW1hcHMgZm9yIFNXSUdUWVBFIGFuZCB2b2lkICogKFNGIzIwOTUxODYpLgoKMjAwOC0wOS0yMjogbXV0YW5kaXogKE1pa2VsIEJhbmNyb2Z0KQoJICAgIFthbGxlZ3JvY2xdCgkgICAgLSBTdXBwb3J0IHdyYXBwaW5nIG9mIHR5cGVzIHdob3NlIGRlZmluaXRpb25zIGFyZSBub3Qgc2VlbiBieQoJICAgIFNXSUcuIFRoZXkgYXJlIHRyZWF0ZWQgYXMgZm9yd2FyZC1yZWZlcmVuY2VkIGNsYXNzZXMgYW5kIGlmIGEKCSAgICBkZWZpbml0aW9uIGlzIG5vdCBzZWVuIGFyZSB0cmVhdGVkIGFzICgqIDp2b2lkKS4KCSAgICAtIERvbid0IHdyYXAgdGhlIGNvbnRlbnRzIG9mIHVubmFtZWQgbmFtZXNwYWNlcy4KCSAgICAtIE1vcmUgY29kZSBjbGVhbnVwLiBSZW1vdmVkIHNvbWUgZXh0cmFuZW91cyB3YXJuaW5ncy4KCSAgICAtIHN0YXJ0IHdvcmsgb24gaGF2aW5nIHRoZSBhbGxlZ3JvY2wgbW9kIHBhc3MgdGhlIGNwcCB0ZXN0LXN1aXRlLgoKMjAwOC0wOS0xOTogb2xseQoJICAgIFtQSFA1XSBBZGQgdHlwZW1hcHMgZm9yIGxvbmcgbG9uZyBhbmQgdW5zaWduZWQgbG9uZyBsb25nLgoKMjAwOC0wOS0xODogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBBZGRlZCBDIyBhcnJheSB0eXBlbWFwcyBwcm92aWRlZCBieSBBbnR0aSBLYXJhbnRhLgogICAgICAgICAgICBUaGUgYXJyYXlzIHByb3ZpZGUgYSB3YXkgdG8gdXNlIE1hcnNoYWxBcyhVbm1hbmFnZWRUeXBlLkxQQXJyYXkpCiAgICAgICAgICAgIGFuZCBwaW5uaW5nIHRoZSBhcnJheSB1c2luZyAnZml4ZWQnLiBTZWUgYXJyYXlzX2NzaGFycC5pIGxpYnJhcnkgZmlsZQogICAgICAgICAgICBmb3IgZGV0YWlscy4KCjIwMDgtMDktMTg6IHdzZnVsdG9uCgkgICAgRG9jdW1lbnQgdGhlIG9wdGlvbmFsIG1vZHVsZSBhdHRyaWJ1dGUgaW4gdGhlICVpbXBvcnQgZGlyZWN0aXZlLAogICAgICAgICAgICBzZWUgTW9kdWxlcy5odG1sLiBBZGQgYSB3YXJuaW5nIGZvciBQeXRob24gd3JhcHBlcnMgd2hlbiB0aGUKICAgICAgICAgICAgbW9kdWxlIG5hbWUgZm9yIGFuIGltcG9ydGVkIGJhc2UgY2xhc3MgaXMgbWlzc2luZywgcmVxdWlyaW5nIHRoZQogICAgICAgICAgICBtb2R1bGUgYXR0cmlidXRlIHRvIGJlIGFkZGVkIHRvICVpbXBvcnQsIGVnIAoKICAgICAgICAgICAgICAlaW1wb3J0KG1vZHVsZT0iRm9vTW9kdWxlIikgZm9vLmgKCjIwMDgtMDktMTg6IG9sbHkKCSAgICBbUEhQNV0gQ2hhbmdlIHRoZSBkZWZhdWx0IGlucHV0IHR5cGVtYXAgZm9yIGNoYXIgKiB0byB0dXJuIFBIUAoJICAgIE51bGwgaW50byBDIE5VTEwgKHByZXZpb3VzbHkgaXQgd2FzIGNvbnZlcnRlZCB0byBhbiBlbXB0eSBzdHJpbmcpLgoJICAgIFRoZSBuZXcgYmVoYXZpb3VyIGlzIGNvbnNpc3RlbnQgd2l0aCBob3cgdGhlIGNvcnJlc3BvbmRpbmcgb3V0cHV0CgkgICAgdHlwZW1hcCB3b3JrcyAoU0YjMjAyNTcxOSkuCgoJICAgIElmIHlvdSB3YW50IHRvIGtlZXAgdGhlIG9sZCBiZWhhdmlvdXIsIGFkZCB0aGUgZm9sbG93aW5nIHR5cGVtYXAKCSAgICB0byB5b3VyIGludGVyZmFjZSBmaWxlIChQSFAncyBjb252ZXJ0X3RvX3N0cmluZ19leCgpIGZ1bmN0aW9uIGRvZXMKCSAgICB0aGUgY29udmVydGluZyBmcm9tIFBIUCBOdWxsIHRvIGFuIGVtcHR5IHN0cmluZyk6CgoJICAgICV0eXBlbWFwKGluKSBjaGFyICogewoJCWNvbnZlcnRfdG9fc3RyaW5nX2V4KCRpbnB1dCk7CgkJJDEgPSBaX1NUUlZBTF9QUCgkaW5wdXQpOwoJICAgIH0KCjIwMDgtMDktMTg6IG9sbHkKCSAgICBbUEhQNV0gRml4IGV4dHJhIGNvZGUgYWRkZWQgdG8gcHJveHkgY2xhc3MgY29uc3RydWN0b3JzIGluIHRoZSBjYXNlCgkgICAgd2hlcmUgdGhlIG9ubHkgY29uc3RydWN0b3IgdGFrZXMgbm8gYXJndW1lbnRzLgoKMjAwOC0wOS0xODogb2xseQoJICAgIFtQSFA1XSBGaXggd3JhcHBpbmcgb2YgYSByZW5hbWVkIGVudW1lcmF0ZWQgdmFsdWUgb2YgYW4gZW51bSBjbGFzcwoJICAgIG1lbWJlciAoU0YjMjA5NTI3MykuCgoyMDA4LTA5LTE3OiBtdXRhbmRpeiAoTWlrZWwgQmFuY3JvZnQpCgkgICAgW2FsbGVncm9jbF0KCSAgICAtIEZpeCBob3cgZm9yd2FyZCByZWZlcmVuY2UgdHlwZWRlZnMgYXJlIGhhbmRsZWQsIHNvIGFzIG5vdCB0byBjb25mbGljdAoJICAgIHdpdGggb3RoZXIgbGVnaXQgdHlwZWRlZnMuCgkgICAgLSBEb24ndCAoZm9yIG5vdykgcGVyZm9ybSBhbiBmZml0eXBlIHR5cGVtYXAgbG9va3VwIHdoZW4gdHJ5aW5nIHRvCgkgICAgd2hlbiBjYWxsaW5nIGNvbXBvc2VfZm9yZWlnbl90eXBlKCkuIFRoaXMgaXMgYWN0dWFsbHkgYSB1c2VmdWwgdGhpbmcKCSAgICB0byBkbyBpbiBjZXJ0YWluIGNhc2VzLCB0aGUgdGVzdCBjYXNlcyBmb3Igd2hpY2ggSSBjYW4ndCBjdXJyZW50bHkKCSAgICBsb2NhdGUgOi8uIEl0J3MgYnJlYWtpbmcgc29tZSB3cmFwcGluZyBiZWhhdmlvciB0aGF0IGlzIG1vcmUgY29tbW9ubHkKCSAgICBzZWVuLCBob3dldmVyLiBJJ2xsIHJlYWRkIGluIGEgbW9yZSBhcHByb3ByaWF0ZSB3YXkgd2hlbiBJIGNhbgoJICAgIHJlY3JlYXRlIHRoZSBuZWVkZWQgdGVzdCBjYXNlLCBvciBhIHVzZXIgY29tcGxhaW5zICh3aGljaCBtZWFucwoJICAgIHRoZXkgcHJvYmFibHkgaGF2ZSBhIHRlc3QgY2FzZSkuCgkgICAgLSBkb2N1bWVudCB0aGUgLWlzb2xhdGUgY29tbWFuZC1saW5lIGFyZyBpbiB0aGUgJ3N3aWcgLWhlbHAnIG91dHB1dC4KCSAgICBJdCB3YXMgaW4gdGhlIGh0bWwgZG9jcywgYnV0IG5vdCB0aGVyZS4KCSAgICAtIHNtYWxsIGFtb3VudCBvZiBjb2RlIGNsZWFudXAsIHJlbW92ZWQgc29tZSB1bnVzZWQgY29kZS4KCSAgICAtIHNvbWUgbWlub3IgYWVzdGhldGljIGNoYW5nZXMuCgoyMDA4LTA5LTEyOiBiaHkKICAgICAgICAgICAgW1B5dGhvbl0gUHl0aG9uIDMuMCBzdXBwb3J0IGJyYW5jaCBtZXJnZWQgaW50byBTV0lHIHRydW5rLiBUaGFua3MgdG8KICAgICAgICAgICAgR29vZ2xlIFN1bW1lciBvZiBDb2RlIDIwMDggZm9yIHN1cHBvcnRpbmcgdGhpcyBwcm9qZWN0ISBCeSBkZWZhdWx0CiAgICAgICAgICAgIFNXSUcgd2lsbCBnZW5lcmF0ZSBpbnRlcmZhY2UgZmlsZXMgY29tcGF0aWJsZSB3aXRoIGJvdGggUHl0aG9uIDIueAogICAgICAgICAgICBhbmQgMy4wLiBBbmQgdGhlcmUncyBhbHNvIHNvbWUgUHl0aG9uIDMgbmV3IGZlYXR1cmVzIHRoYXQgY2FuIGJlCiAgICAgICAgICAgIGVuYWJsZWQgYnkgcGFzc2luZyBhICItcHkzIiBjb21tYW5kIGxpbmUgb3B0aW9uIHRvIFNXSUcuIFRoZXNlCiAgICAgICAgICAgIGZlYXR1cmVzIGFyZToKCiAgICAgICAgICAgICAgLSBGdW5jdGlvbiBhbm5vdGF0aW9uIHN1cHBvcnQKICAgICAgICAgICAgICAgICAgQWxzbywgdGhlIHBhcmFtZXRlciBsaXN0IG9mIHByb3h5IGZ1bmN0aW9uIHdpbGwgYmUgZ2VuZXJhdGVkLAogICAgICAgICAgICAgICAgICBldmVuIHdpdGhvdXQgdGhlICItcHkzIiBvcHRpb24uIEhvd2V2ZXIsIHRoZSBwYXJhbWV0ZXIgbGlzdAogICAgICAgICAgICAgICAgICB3aWxsIGZhbGxiYWNrIHRvICphcmdzIGlmIHRoZSBmdW5jdGlvbiAob3IgbWV0aG9kKSBpcyBvdmVybG9hZGVkLgogICAgICAgICAgICAgIC0gQnVmZmVyIGludGVyZmFjZSBzdXBwb3J0CiAgICAgICAgICAgICAgLSBBYnN0cmFjdCBiYXNlIGNsYXNzIHN1cHBvcnQKCiAgICAgICAgICAgIEZvciBkZXRhaWxzIG9mIFB5dGhvbiAzIHN1cHBvcnQgYW5kIHRoZXNlIGZlYXR1cmVzLCBwbGVhc2Ugc2VlIHRoZQogICAgICAgICAgICAiUHl0aG9uIDMgU3VwcG9ydCIgc2VjdGlvbiBpbiB0aGUgIlNXSUcgYW5kIFB5dGhvbiIgY2hhcHRlciBvZiB0aGUgU1dJRwogICAgICAgICAgICBkb2N1bWVudGF0aW9uLgoKICAgICAgICAgICAgVGhlICItYXBwbHkiIGNvbW1hbmQgbGluZSBvcHRpb24gYW5kIHN1cHBvcnQgb2YgZ2VuZXJhdGluZyBjb2RlcwogICAgICAgICAgICB1c2luZyBhcHBseSgpIGlzIHJlbW92ZWQuIFNpbmNlIHRoaXMgaXMgb25seSByZXF1aXJlZCBieSB2ZXJ5IG9sZAogICAgICAgICAgICBQeXRob24uCgogICAgICAgICAgICBUaGlzIG1lcmdlIGFsc28gcGF0Y2hlZCBTV0lHJ3MgcGFyc2VyIHRvIHNvbHZlIGEgYnVnLiBCeSB0aGlzIHBhdGNoLAogICAgICAgICAgICBTV0lHIGZlYXR1cmVzIGFibGUgdG8gYmUgY29ycmVjdGx5IGFwcGxpZWQgb24gQysrIGNvbnZlcnNpb24gb3BlcmF0b3IsCiAgICAgICAgICAgIHN1Y2ggbGlrZSB0aGlzOgogICAgICAgICAgICAgIAogICAgICAgICAgICAgICVmZWF0dXJlKCJzaGFkb3ciKSAgKjo6b3BlcmF0b3IgYm9vbCAleyAuLi4gJX0KCjIwMDgtMDktMDI6IHJpY2hhcmRiCgkgICAgW1B5dGhvbl0gQ29tbWl0IHBhdGNoICMyMDg5MTQ5OiBEaXJlY3RvciBleGNlcHRpb24gaGFuZGxpbmcgbWFuZ2xlcwoJICAgIHJldHVybmVkIGV4Y2VwdGlvbi4gIEV4Y2VwdGlvbnMgcmFpc2VkIGJ5IFB5dGhvbiBjb2RlIGluIGRpcmVjdG9ycwoJICAgIGFyZSBub3cgcGFzc2VkIHRocm91Z2ggdG8gdGhlIGNhbGxlciB3aXRob3V0IGNoYW5nZS4gIEFsc28sIHJlbW92ZQoJICAgIHRoZSAiOiAiIHByZWZpeCB3aGljaCB1c2VkIHRvIGJlIGFkZGVkIHRvIG90aGVyIGRpcmVjdG9yIGV4Y2VwdGlvbnMKCSAgICAoZWcsIHRob3NlIGR1ZSB0byBpbmNvcnJlY3QgcmV0dXJuIHR5cGVzKS4KCjIwMDgtMDktMDI6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIENvbW1pdCBwYXRjaCAjMTk4ODI5NiBHQ0l0ZW0gbXVsdGlwbGUgbW9kdWxlIGxpbmtpbmcgaXNzdWUgd2hlbiB1c2luZyAKICAgICAgICAgICAgZGlyZWN0b3JzLgoKMjAwOC0wOS0wMjogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBTdXBwb3J0IGZvciAndXNpbmcnIGFuZCAnZml4ZWQnIGJsb2NrcyBpbiB0aGUgJ2NzaW4nIHR5cGVtYXAgaXMgbm93CiAgICAgICAgICAgIHBvc3NpYmxlIHRocm91Z2ggdGhlIHVzZSBvZiB0aGUgcHJlIGF0dHJpYnV0ZSBhbmQgdGhlIG5ldyB0ZXJtaW5hdG9yIGF0dHJpYnV0ZSwgZWcKCiAgICAgICAgICAgICAgJXR5cGVtYXAoY3NpbiwgCiAgICAgICAgICAgICAgICAgICAgICAgcHJlPSIgICAgdXNpbmcgKENEYXRlIHRlbXAkY3NpbnB1dCA9IG5ldyBDRGF0ZSgkY3NpbnB1dCkpIHsiLAogICAgICAgICAgICAgICAgICAgICAgIHRlcm1pbmF0b3I9IiAgICB9IC8vIHRlcm1pbmF0ZSB0ZW1wJGNzaW5wdXQgdXNpbmcgYmxvY2siLAogICAgICAgICAgICAgICAgICAgICAgKSBjb25zdCBDRGF0ZSAmCiAgICAgICAgICAgICAgICAgICAgICAgIiRjc2NsYXNzbmFtZS5nZXRDUHRyKHRlbXAkY3NpbnB1dCkiCgogICAgICAgICAgICBTZWUgQ1NoYXJwLmh0bWwgZm9yIG1vcmUgaW5mby4KCjIwMDgtMDktMDE6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDRkZJXSBDb21taXQgcGF0Y2ggIzIwNzkzODEgc3VibWl0dGVkIGJ5IEJvcmlzIFNtaWxnYSAtIGNvbnN0YW50IGV4cHJzIHB1dCBpbnRvIAogICAgICAgICAgICBuby1ldmFsIGNvbnRleHQgaW4gREVGQ0VOVU0KCjIwMDgtMDgtMDI6IHd1enplYgogICAgICAgICAgICBbQ2hpY2tlbixBbGxlZ3JvXSBDb21taXQgUGF0Y2ggMjAxOTMxNAogICAgICAgICAgICBGaXhlcyBhIGJ1aWxkIGVycm9yIGluIGNoaWNrZW4sIGFuZCBzZXZlcmFsIGJ1aWxkIGVycm9ycyBhbmQgb3RoZXIgZXJyb3JzCiAgICAgICAgICAgIGluIEFsbGVncm8gQ0wKCjIwMDgtMDctMTk6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBidWlsZGluZyBvZiBUY2wgZXhhbXBsZXMvdGVzdC1zdWl0ZSBvbiBNYWMgT1NYIHJlcG9ydGVkIGJ5IEdpZGVvbiBTaW1wc29uLgoKMjAwOC0wNy0xNzogd3NmdWx0b24KICAgICAgICAgICAgRml4IFNGICMyMDE5MTU2IENvbmZpZ3VyaW5nIHdpdGggLS13aXRob3V0LW9jdGF2ZSBvciAtLXdpdGhvdXQtYWxsbGFuZwogICAgICAgICAgICBkaWQgbm90IGRpc2FibGUgb2N0YXZlLgoKMjAwOC0wNy0xNDogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEsIEMjXSBGaXggZGlyZWN0b3IgdHlwZW1hcHMgZm9yIHBvaW50ZXJzIHNvIHRoYXQgTlVMTCBwb2ludGVycyBhcmUgY29ycmVjdGx5IAogICAgICAgICAgICBtYXJzaGFsbGVkIHRvIEMjL0phdmEgbnVsbCBpbiBkaXJlY3RvciBtZXRob2RzLgoKMjAwOC0wNy0wNDogb2xseQoJICAgIFtQSFBdIEZvciBzdGRfdmVjdG9yLmkgYW5kIHN0ZF9tYXAuaSwgcmVuYW1lIGVtcHR5KCkgdG8gaXNfZW1wdHkoKQoJICAgIHNpbmNlICJlbXB0eSIgaXMgYSBQSFAgcmVzZXJ2ZWQgd29yZC4gIEJhc2VkIG9uIHBhdGNoIGZyb20gTWFyayBLbGVpbgoJICAgIGluIFNGIzE5NDM0MTcuCgoyMDA4LTA3LTA0OiBvbGx5CgkgICAgW1BIUF0gVGhlIGRlcHJlY2F0ZWQgY29tbWFuZCBsaW5lIG9wdGlvbiAiLW1ha2UiIGhhcyBiZWVuIHJlbW92ZWQuICAKCSAgICBTZWFyY2hlcyBvbiBHb29nbGUgY29kZXNlYXJjaCBzdWdnZXN0IHRoYXQgbm9ib2R5IGlzIHVzaW5nIGl0IG5vdwoJICAgIGFueXdheS4KCjIwMDgtMDctMDQ6IG9sbHkKCSAgICBbUEhQXSBUaGUgU1dJRyBjZGF0YS5pIGxpYnJhcnkgbW9kdWxlIGlzIG5vdyBzdXBwb3J0ZWQuCgoyMDA4LTA3LTAzOiBvbGx5CgkgICAgW1BIUF0gVGhlIGRlcHJlY2F0ZWQgY29tbWFuZCBsaW5lIG9wdGlvbiAiLXBocGZ1bGwiIGhhcyBiZWVuCgkgICAgcmVtb3ZlZC4gIFdlIHJlY29tbWVuZCBidWlsZGluZyB5b3VyIGV4dGVuc2lvbiBhcyBhIGR5bmFtaWNhbGx5CgkgICAgbG9hZGFibGUgbW9kdWxlLgoKMjAwOC0wNy0wMjogb2xseQoJICAgIFtQSFA0XSBTdXBwb3J0IGZvciBQSFA0IGhhcyBiZWVuIHJlbW92ZWQuICBUaGUgUEhQIGRldmVsb3BlcnMgYXJlCgkgICAgbm8gbG9uZ2VyIG1ha2luZyBuZXcgUEhQNCByZWxlYXNlcywgYW5kIHdvbid0IGV2ZW4gYmUgcHJvdmlkaW5nCgkgICAgcGF0Y2hlcyBmb3IgY3JpdGljYWwgc2VjdXJpdHkgaXNzdWVzIGFmdGVyIDIwMDgtMDgtMDguCgoyMDA4LTA3LTAyOiBvbGx5CgkgICAgW1B5dGhvbl0gSW1wb3J0IHRoZSBDIGV4dGVuc2lvbiBkaWZmZXJlbnRseSBmb3IgUHl0aG9uIDIuNiBhbmQKCSAgICBsYXRlciBzbyB0aGF0IGFuIGltcGxpY2l0IHJlbGF0aXZlIGltcG9ydCBkb2Vzbid0IHByb2R1Y2UgYQoJICAgIGRlcHJlY2F0aW9uIHdhcm5pbmcgZm9yIDIuNiBhbmQgYSBmYWlsdXJlIGZvciAyLjcgYW5kIGxhdGVyLgoJICAgIFBhdGNoIGZyb20gUmljaGFyZCBCb3VsdG9uIGluIFNGIzIwMDgyMjksIHBsdXMgZm9sbG93LXVwIHBhdGNoZXMKCSAgICBmcm9tIFJpY2hhcmQgYW5kIEhhb3l1IEJhaS4KClZlcnNpb24gMS4zLjM2ICgyNCBKdW5lIDIwMDgpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgowNi8yNC8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBSZW1vdmUgZGVwcmVjYXRlZCAtYyBjb21tYW5kbGluZSBvcHRpb24gKHJ1bnRpbWUgbGlicmFyeSBnZW5lcmF0aW9uKS4KCjA2LzI0LzIwMDg6IG9sbHkKCSAgICBbUEhQXSBGaXggYXNzZXJ0aW9uIGZhaWx1cmUgd2hlbiBoYW5kbGluZyAldHlwZW1hcChpbixudW1pbnB1dHM9MCkKCSAgICAodGVzdGNhc2UgaWdub3JlX3BhcmFtZXRlcikuCgowNi8yNC8yMDA4OiBvbGx5CgkgICAgW1BIUF0gRml4IHNlZ2ZhdWx0IHdoZW4gd3JhcHBpbmcgYSBub24tY2xhc3MgZnVuY3Rpb24gbWFya2VkIHdpdGgKCSAgICAlbmV3b2JqZWN0ICh0ZXN0Y2FzZSBjaGFyX3N0cmluZ3MpLgoKMDYvMjIvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEFkZCBhIHdheSB0byB1c2UgQXR0YWNoQ3VycmVudFRocmVhZEFzRGFlbW9uIGluc3RlYWQgb2YgQXR0YWNoQ3VycmVudFRocmVhZAogICAgICAgICAgICBpbiBkaXJlY3RvciBjb2RlLiBEZWZpbmUgdGhlIFNXSUdfSkFWQV9BVFRBQ0hfQ1VSUkVOVF9USFJFQURfQVNfREFFTU9OIG1hY3JvLCBzZWUKICAgICAgICAgICAgTGliL2phdmEvZGlyZWN0b3Iuc3dnLgoKMDYvMjEvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgW1J1YnldIEZpeCBjcmFzaGluZyBpbiB0aGUgU1RMIHdyYXBwZXJzIChyZWplY3QhIGFuZCBkZWxldGVfaWYgbWV0aG9kcykKCjA2LzE5LzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhLCBDI10gQyMgYW5kIEphdmEga2V5d29yZHMgd2lsbCBiZSByZW5hbWVkIGluc3RlYWQgb2YganVzdCBpc3N1aW5nIGEgd2FybmluZwogICAgICAgICAgICBhbmQgdGhlbiBnZW5lcmF0aW5nIHVuY29tcGlsZWFibGUgY29kZS4gV2FybmluZyAzMTQgZ2l2ZXMgdGhlIG5ldyBuYW1lIHdoZW4gYSAKICAgICAgICAgICAga2V5d29yZCBpcyBmb3VuZC4KCjA2LzE5LzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtSXSBLZXl3b3JkIGhhbmRsaW5nIGFkZGVkLiBSIEtleXdvcmRzIHdpbGwgYmUgcmVuYW1lZCBhcyBuZWNlc3NhcnkuCiAgICAgICAgICAgIFdhcm5pbmcgMzE0IGdpdmVzIHRoZSBuZXcgbmFtZSB3aGVuIGEga2V5d29yZCBpcyBmb3VuZC4KCjA2LzE3LzIwMDg6IG1nb3NzYWdlCiAgICAgICAgICAgIFtMdWFdIEFkZGVkIG1pc3Npbmcgc3VwcG9ydCBmb3IgYm9vbCYgYW5kIGJvb2wqLiBBZGRlZCBydW50ZXN0IGZvciBsaV90eXBlbWFwcyB0ZXN0Y2FzZS4KICAgICAgICAgICAgKEJ1ZyAjMTkzODE0MikKCjA2LzA3LzIwMDg6IGJoeQogICAgICAgICAgICBBZGRlZCB0ZXN0IGNhc2Uga2V5d29yZF9yZW5hbWUsIHRoZW4gbWFkZSB0aGUga2V5d29yZCByZW5hbWluZyB3b3JrcyBwcm9wZXJseQogICAgICAgICAgICBieSBmaXhpbmcgU3dpZ19uYW1lX21ha2UoKSBmb3IgYSBpbmNvbXBsZXRlIGNvbmRpdGlvbiBjaGVja2luZy4KCjA2LzAyLzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhLCBDI10gRml4IGVudW0gd3JhcHBlcnMgd2hlbiB1c2luZyAtbm9wcm94eS4KCjA1LzMwLzIwMDg6IGJoeQogICAgICAgICAgICBBZGRlZCBzdGQ6OndzdHJpbmcgaW50byBMaWIvdHlwZW1hcHMvcHJpbXR5cGVzLnN3Zywgc2luY2UgaXQgaXMgYWxzbyBhIHByaW1pdGl2ZSAKICAgICAgICAgICAgdHlwZSBpbiBTV0lHIC0gZml4ZWQgU0YgIzE5NzY5NzguCgowNS8yOS8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YSwgQyNdIEZpeCB2YXJpYWJsZSB3cmFwcGVycyB3aGVuIHVzaW5nIC1ub3Byb3h5LgoKMDUvMjkvMjAwODogYmh5CiAgICAgICAgICAgIFtQeXRob25dIEZpeGVkIGEgdHlwbyBvZiAlI2lmZGVmIGluIExpYi9weXRob24vcHljb250YWluZXIuc3dnLCB3aGljaCBpcyByZWxhdGVkIAogICAgICAgICAgICB0byAtZXh0cmFuYXRpdmUgU1dJRyBvcHRpb24gLSBTRiAjMTk3MTk3Ny4KCjA1LzIwLzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIE5ldyBwYXJ0aWFsY2hlY2sgbWFrZWZpbGUgdGFyZ2V0cyBmb3IgcGFydGlhbCB0ZXN0aW5nIG9mIHRoZSB0ZXN0LXN1aXRlLiBUaGVzZQogICAgICAgICAgICBqdXN0IGludm9rZSBTV0lHLCBpZSBubyBjb21waWxhdGlvbiBhbmQgbm8gcnVudGltZSB0ZXN0aW5nLiBJdCBjYW4gYmUgZmFzdGVyCiAgICAgICAgICAgIHdoZW4gZGV2ZWxvcGluZyBieSBqdXN0IGRvaW5nIGEgZGlyZWN0b3J5IGRpZmYgb2YgdGhlIGZpbGVzIFNXSUcgZ2VuZXJhdGVzCiAgICAgICAgICAgIGFnYWluc3QgdGhvc2UgZnJvbSBhIHByZXZpb3VzIHJ1bi4gRXhhbXBsZSB1c2FnZSBmcm9tIHRoZSB0b3AgbGV2ZWwgZGlyZWN0b3J5OgoKICAgICAgICAgICAgICBtYWtlIHBhcnRpYWxjaGVjay10ZXN0LXN1aXRlCiAgICAgICAgICAgICAgbWFrZSBwYXJ0aWFsY2hlY2stamF2YS10ZXN0LXN1aXRlCgogICAgICAgICAgICBUaGlzIGNoYW5nZSBhbHNvIGVuY29tcGFzc2VzIG1vcmUgZmxleGliaWxpdHkgaW4gcnVubmluZyB0aGUgdGVzdC1zdWl0ZSwgZWcKICAgICAgICAgICAgaXQgaXMgcG9zc2libGUgdG8gcHJlZml4IHRoZSBjb21tYW5kIGxpbmUgd2hpY2ggcnVucyBhbnkgdGFyZ2V0IGxhbmd1YWdlIHRlc3QKICAgICAgICAgICAgd2l0aCBhIHRvb2wuIFNlZSB0aGUgUlVOVE9PTCwgQ09NUElMRVRPT0wgYW5kIFNXSUdUT09MIHRhcmdldHMgaW4gdGhlIGNvbW1vbi5tawogICAgICAgICAgICBmaWxlIGFuZCBtYWtlZmlsZXMgaW4gdGhlIHRlc3Qtc3VpdGUgZGlyZWN0b3J5LiBGb3IgZXhhbXBsZSBpdCBpcyBwb3NzaWJsZSB0byAKICAgICAgICAgICAgcnVuIHRoZSBydW50aW1lIHRlc3RzIHRocm91Z2ggdmFsZ3JpbmQgdXNpbmc6CgogICAgICAgICAgICAgIG1ha2UgY2hlY2sgUlVOVE9PTD0idmFsZ3JpbmQgLS1sZWFrLWNoZWNrPWZ1bGwiCgogICAgICAgICAgICBvciBpbnZva2UgU1dJRyB1bmRlciB2YWxncmluZCB1c2luZzoKCiAgICAgICAgICAgICAgbWFrZSBjaGVjayBTV0lHVE9PTD0idmFsZ3JpbmQgLS10b29sPW1lbWNoZWNrIgoKMDUvMTkvMjAwODogZHJqb2UKICAgICAgICAgICAgW1JdIEZpeGVkIGRlZmluZSB0aGF0IHdhcyBicmVha2luZyBwcmUtMi43LiAgQ2hlY2tlZCBpbgogICAgICAgICAgICBwYXRjaCBmcm9tIFNvcmVuIFNvbm5lbmJ1cmcgdGhhdCBjcmVhdGVzIHN0cmluZ3MgaW4gIAoJICAgIHZlcnNpb24gaW5kZXBlbmRlbnQgd2F5CgowNS8xNS8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gRml4IHZhcmlhYmxlIG5hbWUgY2xhc2ggaW4gZGlyZWN0b3JzIC0gU0YgIzE5NjMzMTYgcmVwb3J0ZWQgYnkgVHJpc3Rhbi4KCjA1LzE0LzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZCBhbiBvcHRpbWlzYXRpb24gZm9yIGZ1bmN0aW9ucyB0aGF0IHJldHVybiBvYmplY3RzIGJ5IHZhbHVlLCByZWR1Y2luZwogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGNvcGllcyBvZiB0aGUgb2JqZWN0IHRoYXQgYXJlIG1hZGUuIEltcGxlbWVudGVkIHVzaW5nIGFuCiAgICAgICAgICAgIG9wdGlvbmFsIGF0dHJpYnV0ZSBpbiB0aGUgIm91dCIgdHlwZW1hcCBjYWxsZWQgIm9wdGltYWwiLiBEZXRhaWxzIGluIAogICAgICAgICAgICBUeXBlbWFwcy5odG1sLgoKMDUvMTEvMjAwODogb2xseQoJICAgIFtQSFBdIENoZWNrIGZvciAlZmVhdHVyZSgibm90YWJzdHJhY3QiKSB3aGVuIGdlbmVyYXRpbmcgUEhQNSBjbGFzcwoJICAgIHdyYXBwZXIuCgowNS8xMS8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggU0YgIzE5NDM2MDggLSAkc2VsZiBzdWJzdGl0dXRpb24gaW4gJWNvbnRyYWN0LCBwYXRjaCBzdWJtaXR0ZWQgYnkKICAgICAgICAgICAgVG9vbiBWZXJzdHJhZWxlbi4KCjA1LzA5LzIwMDg6IG9sbHkKCSAgICBbUEhQXSBGaXggY2hhciAqIHR5cGVtYXBzIHRvIHdvcmsgd2hlbiBhcHBsaWVkIHRvIHNpZ25lZCBjaGFyICogYW5kCgkgICAgdW5zaWduZWQgY2hhciAqICh1bmNvdmVyZWQgYnkgdGVzdGNhc2UgYXBwbHlfc3RyaW5ncykuCgowNS8wOS8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggd3JhcHBpbmcgb2YgY2hhciAqIG1lbWJlciB2YXJpYWJsZXMgd2hlbiB1c2luZyBhbGxwcm90ZWN0ZWQgbW9kZS4KICAgICAgICAgICAgQnVnIHJlcG9ydGVkIGJ5IFdhcnJlbiBXYW5nLgoKMDUvMDkvMjAwODogb2xseQoJICAgIFtQSFBdIEZpeCBiYWQgUEhQIGNvZGUgZ2VuZXJhdGVkIHdoZW4gd3JhcHBpbmcgYW4gZW51bSBpbiBhCgkgICAgbmFtZXNwYWNlICh1bmNvdmVyZWQgYnkgdGVzdGNhc2UgYXJyYXlzX3Njb3BlKS4KCjA1LzA5LzIwMDg6IG9sbHkKCSAgICBbUEhQXSBTV0lHIG5vdyBydW5zIHRoZSBQSFAgdGVzdHN1aXRlIHVzaW5nIFBIUDUsIG5vdCBQSFA0LiAgUEhQNAoJICAgIGlzIGVzc2VudGlhbGx5IG9ic29sZXRlIG5vdywgc28gd2UgY2FyZSBtdWNoIG1vcmUgYWJvdXQgc29saWQgUEhQNQoJICAgIHN1cHBvcnQuCgowNS8wNy8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBTVEwgZml4ZXMgd2hlbiB1c2luZyAlaW1wb3J0IHJhdGhlciB0aGFuICVpbmNsdWRlIGFuZCB0aGUgU29sYXJpcyBXb3Jrc2hvcAogICAgICAgICAgICBjb21waWxlciBhbmQgdGhlIFJvZ3Vld2F2ZSBTVEwuCgowNS8wNy8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggd3JhcHBpbmcgb2Ygb3ZlcmxvYWRlZCBwcm90ZWN0ZWQgbWV0aG9kcyB3aGVuIHVzaW5nIGFsbHByb3RlY3RlZCBtb2RlLgogICAgICAgICAgICBCdWcgcmVwb3J0ZWQgYnkgV2FycmVuIFdhbmcuCgowNS8wMy8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBDb21taXQgcGF0Y2ggIzE5NTY2MDcgdG8gYWRkIC1NVCBzdXBwb3J0IGZyb20gUmljaGFyZCBCb3VsdG9uLgogICAgICAgICAgICBUaGlzIHBhdGNoIG1pcnJvcnMgdGhlIGdjYyAtTVQgb3B0aW9uIHdoaWNoIGFsbG93cyBvbmUgdG8gY2hhbmdlIHRoZSBkZWZhdWx0CiAgICAgICAgICAgIE1ha2VmaWxlIHRhcmdldCBiZWluZyBnZW5lcmF0ZWQgd2hlbiBnZW5lcmF0aW5nIG1ha2VmaWxlcyB3aXRoIHRoZSAtTSBmYW1pbHkKICAgICAgICAgICAgb2Ygb3B0aW9ucy4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICQgc3dpZyAtamF2YSAtTU0gLU1UIG92ZXJpZGRlbm5hbWUgLWMrKyAgZXhhbXBsZS5pCiAgICAgICAgICAgICAgb3ZlcmlkZGVubmFtZTogXAogICAgICAgICAgICAgICBleGFtcGxlLmkgXAogICAgICAgICAgICAgICBleGFtcGxlLmggCgowNC8zMC8yMDA4OiBtZ29zc2FnZQoJICAgIFtMdWFdIFJlbW92ZWQgZ2VuZXJhdGlvbiBvZiBfd3JhcF9kZWxldGVfWFhYWFggKHdyYXBwZXJlZCBkZXN0cnVjdG9yKQoJICAgIHdoaWNoIHdhcyB1bnVzZWQgYW5kIGNhdXNpbmcgd2FybmluZyB3aXRoIGcrKyAtV2FsbC4KCSAgICBSZW1vdmVkIG90aGVyIHVudXNlZCB3YXJuaW5nIGluIHR5cGVtYXBzLmkgYW5kIG90aGVyIHBsYWNlcy4KCSAgICBBZGRlZCBFeGFtcGxlcy9sdWEvZW1iZWQzLCBhbmQgcnVuIHRlc3RzIGEgZmV3IHRlc3QgY2FzZXMuCgowNC8yNC8yMDA4OiBvbGx5CgkgICAgW1B5dGhvbl0gRml4IGdlbmVyYXRlZCBjb2RlIGZvciBJQk0ncyBDKysgY29tcGlsZXIgb24gQUlYIChwYXRjaAoJICAgIGZyb20gR29lcmFuIFVkZGVib3JnIGluIFNGIzE5MjgwNDgpLgoKMDQvMjQvMjAwODogb2xseQoJICAgIFJlbmFtZSBCU0laRSBpbiBFeGFtcGxlcy90ZXN0LXN1aXRlL2FycmF5c19zY29wZS5pIHRvIEJCU0laRSB0bwoJICAgIGF2b2lkIGEgY2xhc2ggd2l0aCBCU0laRSBkZWZpbmVkIGJ5IGhlYWRlcnMgb24gQUlYIHdpdGggUGVybAoJICAgIChyZXBvcnRlZCBpbiBTRiMxOTI4MDQ4KS4KCjA0LzIwLzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZCB0aGUgYWJpbGl0eSB0byB3cmFwIGFsbCBwcm90ZWN0ZWQgbWVtYmVycyB3aGVuIHVzaW5nIGRpcmVjdG9ycy4KICAgICAgICAgICAgUHJldmlvdXNseSBvbmx5IHRoZSB2aXJ0dWFsIG1ldGhvZHMgd2VyZSBhdmFpbGFibGUgdG8gdGhlIHRhcmdldCBsYW5ndWFnZS4KICAgICAgICAgICAgTm93IGFsbCBwcm90ZWN0ZWQgbWVtYmVycywgKHN0YXRpYyBhbmQgbm9uLXN0YXRpYyB2YXJpYWJsZXMsIG5vbi12aXJ0dWFsIG1ldGhvZHMKICAgICAgICAgICAgYW5kIHN0YXRpYyBtZXRob2RzKSBhcmUgd3JhcHBlZCB3aGVuIHVzaW5nIHRoZSBhbGxwcm90ZWN0ZWQgbW9kZS4gVGhlIGFsbHByb3RlY3RlZAogICAgICAgICAgICBtb2RlIGlzIHR1cm5lZCBvbiBpbiB0aGUgbW9kdWxlIGRlY2xhcmF0aW9uOgoKICAgICAgICAgICAgICAlbW9kdWxlKGRpcmVjdG9ycz0iMSIsIGFsbHByb3RlY3RlZD0iMSIpIG1vZHVsZW5hbWUKClZlcnNpb24gMS4zLjM1ICg3IEFwcmlsIDIwMDgpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgowNC8wNy8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBbTHVhXSBBZGQgbWlzc2luZyBwb2ludGVyIHJlZmVyZW5jZSB0eXBlbWFwcwoKMDQvMDYvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgRml4IHN0YWNrIG92ZXJmbG93IHdoZW4gdXNpbmcgdHlwZW1hcCB3YXJuaW5nIHN1cHByZXNzaW9uLCBlZyAKICAgICAgICAgICAgICAld2FybmZpbHRlcihTV0lHV0FSTl9UWVBFTUFQX0NIQVJMRUFLX01TRykKCjA0LzA1LzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIEZpeCBzaGFyZWRfcHRyIHR5cGVtYXBzIHNvIHRoYXQgJXB5dGhvbm5vbmR5bmFtaWMgY2FuIGJlIHVzZWQuIEFsc28gY29ycmVjdHMKICAgICAgICAgICAgZGlzcGxheSBvZiB0aGUgcHJveHkgY2xhc3MgdHlwZS4gUmVwb3J0ZWQgYnkgUm9iZXJ0IEx1cHRvbi4KCjA0LzA0LzIwMDg6IG9sbHkKCSAgICBbUHl0aG9uXSBBZGQgJW5ld29iamVjdCByZWZlcmVuY2UgdG8gcHl0aG9uIG1lbW9yeSBtYW5hZ2VtZW50IHN1YnNlY3Rpb24gb2YgbWFudWFsCgkgICAgKHBhdGNoIGZyb20gbWRiZWFjaHkgaW4gU0YjMTg5NDYxMCkuCgowMy8yNy8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBGaXggc2hhcmVkX3B0ciB0eXBlbWFwcyB3aGVyZSB0aGUgcG9pbnRlciB0eXBlIGlzIGEgdGVtcGxhdGVkIHR5cGUgd2l0aAogICAgICAgICAgICB3aXRoIG1vcmUgdGhhbiBvbmUgcGFyYW1ldGVyLiBSZXBvcnRlZCBieSBSb2JlcnQgTHVwdG9uLgoKMDMvMjcvMjAwODogbWdvc3NhZ2UKICAgICAgICAgICAgW0x1YV0gQWRkZWQgYSB0eXBlbWFwIERJU09XTiBmb3IgU1dJR1RZUEUqIGFuZCBTV0lHVFlQRVtdLCBhbmQgc3VwcG9ydCBmb3IgJWRlbG9iamVjdCBmZWF0dXJlLgogICAgICAgICAgICBBZGRlZCBFeGFtcGxlcy9sdWEvb3duZXIgd2hpY2ggZGVtb25zdHJhdGVzIHRoZSB1c2Ugb2YgdGhlIG1lbW9yeSBtYW5hZ2VtZW50LgoKMDMvMjYvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEFwcGx5IHBhdGNoICMxODQ0MzAxIGZyb20gTW9udHkgVGF5bG9yIHRvIHN1cHByZXNzIGVudW0gY29uc3RydWN0b3IKICAgICAgICAgICAgdW51c2VkIHdhcm5pbmdzLgoKMDMvMjYvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gQXBwbHkgcGF0Y2ggIzE5MjQ1MjQgZnJvbSBDYXNleSBSYXltb25kc29uIHdoaWNoIGVuc3VyZXMgdGhlCiAgICAgICAgICAgICJObyBjb25zdHJ1Y3RvciBkZWZpbmVkIiBtZXNzYWdlIGlzIGRpc3BsYXllZCB3aGVuIGF0dGVtcHRpbmcgdG8gY2FsbCBhCiAgICAgICAgICAgIGNvbnN0cnVjdG9yIG9uIGEgY2xhc3MgdGhhdCBkb2Vzbid0IGhhdmUgYSBjb25zdHJ1Y3RvciB3cmFwcGVyLCBlZyBpZgogICAgICAgICAgICB0aGUgQysrIGNsYXNzIGlzIGFic3RyYWN0LgoKMDMvMjYvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gQXBwbHkgcGF0Y2ggIzE5MjU3MDIgZnJvbSBDYXNleSBSYXltb25kc29uIHdoaWNoIHJlbW92ZXMgd2FybmluZyA1MTIKICAgICAgICAgICAgZm9yIHN0ZDo6dmVjdG9yIHdyYXBwZXJzLgoKMDMvMjYvMjAwODogb2xseQoJICAgIFtQeXRob25dIEFwcGx5IEdDQyA0LjMgd2FybmluZ3MgcGF0Y2ggZnJvbSBQaGlsaXBwIFRob21hcwoJICAgIChTRiMxOTI1MTIyKS4KCjAzLzIxLzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIFRocmVhZCBzYWZldHkgcGF0Y2ggZm9yIFNUTCBpdGVyYXRvcnMgZnJvbSBBYmhpbmFuZGFuIEphaW4uCgowMy8xNy8yMDA4OiBtZ29zc2FnZQogICAgICAgICAgICBbTHVhXSBBZGRlZCAlbHVhY29kZSBmZWF0dXJlIHRvIGFkZCBzb3VyY2UgY29kZSBpbnRvIHdyYXBwZXJzLgogICAgICAgICAgICBVcGRhdGVkIGRvY3VtZW50YXRpb24gdG8gZG9jdW1lbnQgdGhpcy4KICAgICAgICAgICAgQWRkZWQgRXhhbXBsZXMvbHVhL2FycmF5cyB0byBzaG93IGl0cyB1c2UgKGFuZCB0eXBlbWFwcykKCjAzLzE3LzIwMDg6IG9sbHkKCSAgICBGaXggbm9ucG9ydGFibGUgc2VkIHVzYWdlIHdoaWNoIGZhaWxlZCBvbiBNYWMgT1MgWCAoYW5kIHByb2JhYmx5CgkgICAgb3RoZXIgcGxhdGZvcm1zKS4gIEZpeGVzIFNGIzE5MDM2MTIuCgowMy8xNy8yMDA4OiBvbGx5CgkgICAgRml4IG1lbW9yeSBsZWFrIGluIFNXSUcncyBwYXJzZXIgKGJhc2VkIG9uIHBhdGNoIGZyb20gUnVzc2VsbAoJICAgIEJyeWFudCBpbiBTRiMxOTE0MDIzKS5gCgowMy8xMi8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggYnVnICMxODc4Mjg1IC0gdW5uZWNlc3NhcnkgY2FzdCBmb3IgQyBzdHJ1Y3QgY3JlYXRpb24gd3JhcHBlcnMuCgowMy8xMi8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBSZW1vdmUgZGVidWdnaW5nIGluZm8gd2hlbiB1c2luZyBzaGFyZWRfcHRyIHN1cHBvcnQKCjAzLzA2LzIwMDg6IG1nb3NzYWdlCiAgICAgICAgICAgIFtMdWFdIFVwZGF0ZWQgZG9jdW1lbnRhdGlvbiBmb3IgTHVhIGV4Y2VwdGlvbnMuCiAgICAgICAgICAgIEFkZGVkIEV4YW1wbGVzL2x1YS9leGNlcHRpb24gYW5kIEV4YW1wbGVzL2x1YS9lbWJlZDIuCiAgICAgICAgICAgIFNtYWxsIHVwZGF0ZXMgdG8gdGhlIHR5cGVtYXBzLgoKMDMvMDQvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEsIEMjXSBBZGQgY2hhciAqJiB0eXBlbWFwcy4KCjAzLzA0LzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBvY2Nhc2lvbmFsIHNlZyBmYXVsdCB3aGVuIGF0dGVtcHRpbmcgdG8gcmVwb3J0IG92ZXJsb2FkZWQgbWV0aG9kcyBhcyBiZWluZyBpZ25vcmVkLgoKMDIvMjkvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgW1BlcmxdIEZpeCAjMTkwNDUzNyBTd2lnIGNhdXNlcyBhIFBlcmwgd2FybmluZyAieCB1c2VkIG9ubHkgb25jZSIgaW4gUGVybCA1LjEwCiAgICAgICAgICAgIHJlcG9ydGVkIGJ5IEFyaSBKb2xtYQoKMDIvMjkvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gQWRkIHNoYXJlZF9wdHIgdmFyaW4vdmFyb3V0IHR5cGVtYXBzIGZvciB3cmFwcGluZyBnbG9iYWwgdmFyaWFibGVzLgoKMDIvMjUvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgRml4ICR3cmFwbmFtZSB0byB3b3JrIGluICVleGNlcHRpb24gKGZpeGVzIHNvbWUgd3JhcDpuYW1lIGFzc2VydGlvbnMpCgpWZXJzaW9uIDEuMy4zNCAoMjcgRmVicnVhcnkgMjAwOCkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgowMi8xMy8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBbUl0gRml4IHdyYXBwaW5nIG9mIGdsb2JhbCBmdW5jdGlvbiBwb2ludGVyIHZhcmlhYmxlcy4KCjAyLzEzLzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZCBuZXcgc3BlY2lhbCB2YXJpYWJsZXMgZm9yIHVzZSB3aXRoaW4gJWV4Y2VwdGlvbjoKICAgICAgICAgICAgICAkd3JhcG5hbWUgLSBsYW5ndWFnZSBzcGVjaWZpYyB3cmFwcGVyIG5hbWUKICAgICAgICAgICAgICAkb3Zlcm5hbWUgLSBpZiBhIG1ldGhvZCBpcyBvdmVybG9hZGVkIHRoaXMgY29udGFpbnMgdGhlIGV4dHJhIG1hbmdsaW5nIHVzZWQgb24gCiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG92ZXJsb2FkZWQgbWV0aG9kCiAgICAgICAgICAgICAgJGRlY2wgICAgIC0gdGhlIGZ1bGx5IHF1YWxpZmllZCBDL0MrKyBkZWNsYXJhdGlvbiBvZiB0aGUgbWV0aG9kIGJlaW5nIHdyYXBwZWQgCiAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aG91dCB0aGUgcmV0dXJuIHR5cGUKICAgICAgICAgICAgICAkZnVsbGRlY2wgLSB0aGUgZnVsbHkgcXVhbGlmaWVkIEMvQysrIGRlY2xhcmF0aW9uIG9mIHRoZSBtZXRob2QgYmVpbmcgd3JhcHBlZCAKICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRpbmcgdGhlIHJldHVybiB0eXBlCgowMi8xMi8yMDA4OiBkcmpvZQogICAgICAgICAgICBbUl0gTm93IHNldHRpbmcgUzQgZmxhZyBpbiBTV0lHIGNyZWF0ZWQgb2JqZWN0cy4gIFRoaXMKICAgICAgICAgICAgZml4ZXMgUi1TV0lHIGZvciAyLjYgYW5kIHdhcm5pbmcgZm9yIDIuNiBmYWlsdXJlIGhhcyBiZWVuIHJlbW92ZWQuCgowMi8xMS8yMDA4OiBtZ29zc2FnZQogICAgICAgICAgICBbTHVhXSBBZGRlZCBhIHBhdGNoIGJ5IFRvcnN0ZW4gTGFuZHNjaG9mZiB0byBmaXggdGhlIHVuYXJ5IG1pbnVzIGlzc3VlCiAgICAgICAgICAgIFJhbiAnYXN0eWxlIC0tc3R5bGU9a3IgLTInIGFjcm9zcyBsdWEuY3h4IHRvIG5lYXRlbiBpdCB1cAoKMDIvMTAvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgQnVtcCBTV0lHX1JVTlRJTUVfVkVSU0lPTiB0byA0LiBUaGlzIGlzIGJlY2F1c2Ugb2YgdGhlIHJlY2VudGx5IGludHJvZHVjZWQgQVBJIAogICAgICAgICAgICBjaGFuZ2UgaW4gdGhlIGNvbnZlcnNpb24gZnVuY3Rpb25zLCBpZSBjaGFuZ2UgaW4gZGVmaW5pdGlvbiBvZiBzd2lnX2NvbnZlcnRlcl9mdW5jLgogICAgICAgICAgICBBbnlvbmUgY2FsbGluZyBTV0lHX1R5cGVDYXN0IG11c3QgcGFzcyBpbiBhIHZhbGlkIHZhbHVlIGZvciB0aGUgbmV3IGFkZGl0aW9uYWwKICAgICAgICAgICAgKHRoaXJkKSBwYXJhbWV0ZXIgYW5kIHRoZW4gaGFuZGxlIHRoZSBuZXdseSBjcmVhdGVkIG1lbW9yeSBpZiB0aGUgcmV0dXJuZWQgdmFsdWUKICAgICAgICAgICAgaXMgc2V0IHRvIFNXSUdfQ0FTVF9ORVdfTUVNT1JZIGVsc2UgYSBtZW1vcnkgbGVhayB3aWxsIGVuc3VlLgoKMDIvMDkvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gRXhwZXJpbWVudGFsIHNoYXJlZF9wdHIgdHlwZW1hcHMgYWRkZWQuIFVzYWdlIGlzIHRoZSBzYW1lIGFzIHRoZSByZWNlbnRseQogICAgICAgICAgICBhZGRlZCBKYXZhIGFuZCBDIyBzaGFyZWRfcHRyIHR5cGVtYXBzLiBUd28gbWFjcm9zIGFyZSBhdmFpbGFibGUsIGFsdGhvdWdoIHRoZXNlCiAgICAgICAgICAgIG1heSB3ZWxsIGNoYW5nZSBpbiBhIGZ1dHVyZSB2ZXJzaW9uOgoKICAgICAgICAgICAgRm9yIGJhc2UgY2xhc3NlcyBvciBjbGFzc2VzIG5vdCBpbiBhbiBpbmhlcml0YW5jZSBjaGFpbjoKICAgICAgICAgICAgICBTV0lHX1NIQVJFRF9QVFIoUFJPWFlDTEFTUywgVFlQRSkKICAgICAgICAgICAgRm9yIGRlcml2ZWQgY2xhc3NlczoKICAgICAgICAgICAgICBTV0lHX1NIQVJFRF9QVFJfREVSSVZFRChQUk9YWUNMQVNTLCBCQVNFQ0xBU1NUWVBFLCBUWVBFKQoKICAgICAgICAgICAgVGhlIFBST1hZQ0xBU1MgaXMgdGhlIG5hbWUgb2YgdGhlIHByb3h5IGNsYXNzLCBidXQgaXMgb25seSByZXF1aXJlZCBmb3IgSmF2YS9DIy4KICAgICAgICAgICAgRXhhbXBsZSB1c2FnZToKCiAgICAgICAgICAgICAgJWluY2x1ZGUgImJvb3N0X3NoYXJlZF9wdHIuaSIKCiAgICAgICAgICAgICAgU1dJR19TSEFSRURfUFRSKEtsYXNzLCBTcGFjZTo6S2xhc3MpCiAgICAgICAgICAgICAgU1dJR19TSEFSRURfUFRSX0RFUklWRUQoS2xhc3NEZXJpdmVkLCBTcGFjZTo6S2xhc3MsIFNwYWNlOjpLbGFzc0Rlcml2ZWQpCgogICAgICAgICAgICAgIG5hbWVzcGFjZSBTcGFjZSB7CiAgICAgICAgICAgICAgICBzdHJ1Y3QgS2xhc3MgeyAuLi4gfTsKICAgICAgICAgICAgICAgIHN0cnVjdCBLbGFzc0Rlcml2ZWQgOiBLbGFzcyB7IC4uLiB9OwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIEZ1cnRoZXIgZGV0YWlscyB0byBmb2xsb3cgaW4gZnV0dXJlIGRvY3VtZW50YXRpb24sIGJ1dCB0aGUgZm9sbG93aW5nIGZlYXR1cmVzCiAgICAgICAgICAgIHNob3VsZCBiZSBub3RlZDoKCiAgICAgICAgICAgIC0gTm90IHJlc3RyaWN0ZWQgdG8gYm9vc3Q6OnNoYXJlZF9wdHIsIGVnIHN0ZDo6dHIxOjpzaGFyZWRfcHRyIGNhbiBhbHNvIGJlIHVzZWQuCiAgICAgICAgICAgIC0gQXZhaWxhYmxlIHR5cGVtYXAgZ3JvdXBzOgogICAgICAgICAgICAgIChhKSBUeXBlbWFwcyBmb3Igc2hhcmVkX3B0ciBwYXNzZWQgYnkgdmFsdWUsIHJlZmVyZW5jZSwgcG9pbnRlciBhbmQgcG9pbnRlciAKICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlLgogICAgICAgICAgICAtIChiKSBUeXBlbWFwcyBmb3IgcGFzc2luZyBieSByYXcgdmFsdWUsIHJhdyBwb2ludGVyLCByYXcgcmVmZXJlbmNlLCByYXcgcG9pbnRlcgogICAgICAgICAgICAgICAgICByZWZlcmVuY2UuIAogICAgICAgICAgICAtIFRoZSBjb2RlIGJlaW5nIHdyYXBwZWQgZG9lcyBub3QgZXZlbiBoYXZlIHRvIHVzZSBzaGFyZWRfcHRyLCBTV0lHIGNhbiB1c2UKICAgICAgICAgICAgICBzaGFyZWRfcHRyIGFzIHRoZSB1bmRlcmx5aW5nIHN0b3JhZ2UgbWVjaGFuaXNtIGluc3RlYWQgb2YgYSByYXcgcG9pbnRlciBkdWUgdG8gCiAgICAgICAgICAgICAgdGhlIHR5cGVtYXBzIGluIGdyb3VwIChiKSBhYm92ZS4KICAgICAgICAgICAgLSBObyBhcnJheSBzdXBwb3J0IGFzIHNoYXJlZF9wdHIgZG9lcyBub3Qgc3VwcG9ydCBhcnJheXMuCiAgICAgICAgICAgIC0gVGhpcyB3b3JrcyBxdWl0ZSBkaWZmZXJlbnRseSB0byB0aGUgdXN1YWwgU1dJRyBzbWFydCBwb2ludGVyIHN1cHBvcnQgd2hlbgogICAgICAgICAgICAgIG9wZXJhdG9yLT4gaXMgcGFyc2VkIGJ5IFNXSUc6CiAgICAgICAgICAgICAgLSBBbiBhZGRpdGlvbmFsIHNtYXJ0IHBvaW50ZXIgY2xhc3MgaXMgbm90IGdlbmVyYXRlZCByZWR1Y2luZyBjb2RlIGJsb2F0IGluCiAgICAgICAgICAgICAgICB0aGUgd3JhcHBlcnMuCiAgICAgICAgICAgICAgLSBVc2luZyBzbWFydCBwb2ludGVycyBhbmQgcmF3IHBvaW50ZXJzIGNhbiBiZSBtaXhlZCBzZWFtbGVzc2x5LgogICAgICAgICAgICAgIC0gTWlzc2luZyBjb25zdHJ1Y3RvcnMgZm9yIHRoZSBzbWFydCBwb2ludGVycyBpcyBubyBsb25nZXIgYSBwcm9ibGVtIGFuZCBzbwogICAgICAgICAgICAgICAgc2VwYXJhdGUgZmFjdG9yeSB0eXBlIGZ1bmN0aW9ucyBkbyBub3QgaGF2ZSB0byBiZSB3cml0dGVuIGFuZCB3cmFwcGVkLgogICAgICAgICAgICAgIC0gVGhlIGltcGxpY2l0IEMrKyBzaGFyZWRfcHRyPCBkZXJpdmVkIGNsYXNzID4gdG8gc2hhcmVkX3B0cjwgYmFzZSBjbGFzcyA+CiAgICAgICAgICAgICAgICBjYXN0IGFsc28gd29ya3MgaW4gdGhlIHRhcmdldCBsYW5ndWFnZS4gVGhpcyBuZWdhdGVzIHRoZSBuZWNlc3NpdHkgdG8gd3JpdGUKICAgICAgICAgICAgICAgIGFuIGV4cGxpY2l0IGhlbHBlciBjYXN0IGZ1bmN0aW9uIHByb3ZpZGluZyB0aGUgdXBjYXN0IHdoaWNoIHdvdWxkIG5lZWQKICAgICAgICAgICAgICAgIGNhbGxpbmcgcHJpb3IgdG8gcGFzc2luZyBhIGRlcml2ZWQgY2xhc3MgdG8gYSBtZXRob2QgdGFraW5nIGEgc2hhcmVkX3B0ciB0bwogICAgICAgICAgICAgICAgYSBiYXNlIGNsYXNzLgoKMDIvMDkvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gQWRkIHN1cHBvcnQgZm9yIG92ZXJyaWRpbmcgdGhlIGNsYXNzIHJlZ2lzdHJhdGlvbiBmdW5jdGlvbiB2aWEgYSBuZXcKICAgICAgICAgICAgInNtYXJ0cHRyIiBmZWF0dXJlLiBUaGlzIGlzIGEgdmVyeSBsb3cgbGV2ZWwgb2YgY3VzdG9taXNhdGlvbiBtb3N0IHVzZXJzCiAgICAgICAgICAgIHdvdWxkIG5ldmVyIG5lZWQgdG8ga25vdy4gVGhlIGZlYXR1cmUgd2lsbCB0eXBpY2FsbHkgYmUgdXNlZCBmb3IgaW50cnVzaXZlIAogICAgICAgICAgICBzbWFydCBwb2ludGVycyBhbG9uZyB3aXRoIGFkZGl0aW9uYWwgdHlwZW1hcHMuIEV4YW1wbGUgdXNhZ2Ugb2YgdGhlIGZlYXR1cmU6CgogICAgICAgICAgICAgICVmZWF0dXJlKCJzbWFydHB0ciIsIG5vYmxvY2s9MSkgRm9vIHsgYm9vc3Q6OnNoYXJlZF9wdHI8IEZvbyA+IH0KICAgICAgICAgICAgICBjbGFzcyBGb28ge307CgogICAgICAgICAgICBUaGUgZ2VuZXJhdGVkIEZvb19zd2lncmVnaXN0ZXIgZnVuY3Rpb24gd2lsbCB0aGVuIHJlZ2lzdGVyIGJvb3N0OjpzaGFyZWQgPCBGb28gPgogICAgICAgICAgICAoU1dJR1RZUEVfcF9ib29zdF9fc2hhcmVkX3B0clRGb29fdCBpbnN0ZWFkIG9mIFNXSUdUWVBFX3BfRm9vKSBhcyB0aGUgdW5kZXJseWluZwogICAgICAgICAgICB0eXBlIGZvciBpbnN0YW50aWF0aW9ucyBvZiBGb28uCgowMi8wOS8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBGZWF0dXJlcyBub3cgc3VwcG9ydHMgdGhlIG9wdGlvbmFsICdub2Jsb2NrJyBhdHRyaWJ1dGUgZm9yIGFsbCB1c2FnZSBvZiAlZmVhdHVyZS4gCiAgICAgICAgICAgIFdoZW4gc3BlY2lmaWVkLCB0aGUgeyB9IGJyYWNlcyBhcmUgcmVtb3ZlZCBmcm9tIHRoZSBmZWF0dXJlIGNvZGUuIFRoaXMgaXMgaWRlbnRpY2FsCiAgICAgICAgICAgIGluIGJlaGF2aW91ciB0byB1c2FnZSBvZiAnbm9ibG9jaycgaW4gdHlwZW1hcHMgYW5kIGlzIHVzZWQgd2hlbiB0aGUgcHJlcHJvY2Vzc29yCiAgICAgICAgICAgIGlzIHJlcXVpcmVkIHRvIG9wZXJhdGUgb24gdGhlIGNvZGUgaW4gdGhlIGZlYXR1cmUgYW5kIHRoZSBlbmNsb3NpbmcgeyB9IGJyYWNlcwogICAgICAgICAgICBhcmUgbm90IHJlcXVpcmVkLiBFeGFtcGxlOgoKICAgICAgICAgICAgICAjZGVmaW5lIEZPTyBmb28KICAgICAgICAgICAgICAlZmVhdHVyZSgic21hcnRwdHIiLCBub2Jsb2NrPSIxIikgeyBGT086OmJhciB9CgogICAgICAgICAgICBUaGUgcHJlcHJvY2Vzc29yIHRoZW4gcmVkdWNlcyB0aGlzIGFzIGlmIHRoaXMgaGFkIGJlZW4gdXNlZCBpbnN0ZWFkOgoKICAgICAgICAgICAgICAlZmVhdHVyZSgic21hcnRwdHIiKSAiZm9vOjpiYXIiCgowMi8wMS8yMDA4OiBvbGx5CgkgICAgW1B5dGhvbl0gRml4IGZvcm1hdCBzdHJpbmcgYnVnIChTRiMxODgyMjIwKS4KCjAxLzMxLzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZGl0aW9ucyB0byB0aGUgJXR5cGVzIGRpcmVjdGl2ZS4gTm93IHRoZSBjb252ZXJzaW9uIC8gY2FzdGluZyBjb2RlIGNhbiBiZQogICAgICAgICAgICBvdmVycmlkZGVuIHRvIHNvbWUgY3VzdG9tIGNvZGUgaW4gdGhlICV0eXBlcyBkaXJlY3RpdmUsIGxpa2Ugc286CgogICAgICAgICAgICAgICV0eXBlcyhmcm9tdHlwZSA9IHRvdHlwZSkgJXsKICAgICAgICAgICAgICAgIC4uLiBjb2RlIHRvIGNvbnZlcnQgZnJvbXR5cGUgdG8gdG90eXBlIGFuZCByZXR1cm4gLi4uCiAgICAgICAgICAgICAgJX0KCiAgICAgICAgICAgIFRoZSBzcGVjaWFsIHZhcmlhYmxlICRmcm9tIHdpbGwgYmUgcmVwbGFjZWQgYnkgdGhlIG5hbWUgb2YgdGhlIHBhcmFtZXRlciBvZiB0aGUKICAgICAgICAgICAgdHlwZSBiZWluZyBjb252ZXJ0ZWQgZnJvbS4gVGhlIGNvZGUgbXVzdCByZXR1cm4gdGhlIHRvdHlwZSBjYXN0IHRvIHZvaWQgKi4gRXhhbXBsZToKCiAgICAgICAgICAgICAgY2xhc3MgVGltZTsKICAgICAgICAgICAgICBjbGFzcyBEYXRlOwogICAgICAgICAgICAgIERhdGUgJlRpbWU6OmRhdGVGcm9tVGltZSgpOwoKICAgICAgICAgICAgICAldHlwZXMoVGltZSA9IERhdGUpICV7CiAgICAgICAgICAgICAgICBUaW1lICp0ID0gKFRpbWUgKikkZnJvbTsKICAgICAgICAgICAgICAgIERhdGUgJmQgPSB0LT5kYXRlRnJvbVRpbWUoKTsKICAgICAgICAgICAgICAgIHJldHVybiAodm9pZCAqKSAmZDsKICAgICAgICAgICAgICAlfQoKICAgICAgICAgICAgcmVzdWx0aW5nIGluIHRoZSBjb252ZXJzaW9uIC8gY2FzdGluZyBjb2RlIGxvb2tpbmcgc29tZXRoaW5nIGxpa2U6CgogICAgICAgICAgICAgIHN0YXRpYyB2b2lkICpfcF9UaW1lVG9fcF9EYXRlKHZvaWQgKngpIHsKICAgICAgICAgICAgICAgIFRpbWUgKnQgPSAoVGltZSAqKXg7CiAgICAgICAgICAgICAgICBEYXRlICZkID0gdC0+ZGF0ZUZyb21UaW1lKCk7CiAgICAgICAgICAgICAgICByZXR1cm4gKHZvaWQgKikgJmQ7CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgVGhpcyBpcyBhZHZhbmNlZCB1c2FnZSwgcGxlYXNlIHVzZSBvbmx5IGlmIHlvdSB1bmRlcnN0YW5kIHRoZSBydW50aW1lIHR5cGUgc3lzdGVtLgoKMDEvMzAvMjAwODogbWdvc3NhZ2UKCSAgICBTbWFsbCB1cGRhdGUgdG8gZG9jdW1lbnRhdGlvbiBpbiBUeXBlbWFwcy5odG1sLCB0byB3YXJuIGFib3V0IHVzZSBvZiBsb2NhbCAKCSAgICB2YXJpYWJsZXMgaW4gdHlwZW1hcHMgZm9yIG11bHRpcGxlIHR5cGVzLgoKMDEvMjUvMjAwODogd3NmdWx0b24KCSAgICBbSmF2YV0gRml4IGJ1ZyByZXBvcnRlZCBieSBLZXZpbiBNaWxscyBpbiBBUlJBWVNPRkNMQVNTRVMgdHlwZW1hcHMgd2hlcmUgYW55CiAgICAgICAgICAgIGNoYW5nZXMgbWFkZSB0byBhbiBhcnJheSBlbGVtZW50IHBhc3NlZCBmcm9tIEphdmEgdG8gQyBhcmUgbm90IHJlZmxlY3RlZCBiYWNrCiAgICAgICAgICAgIGludG8gSmF2YS4KCjAxLzI0LzIwMDg6IG1nb3NzYWdlCgkgICAgTW9yZSB1cGRhdGVzIHRvIHRoZSBjb25maWd1cmUgc2NyaXB0IGZvciBkZXRlY3RpbmcgbHVhLgoJICAgIEFsc28gbG9va3MgaW4gL3Vzci9pbmNsdWRlL2x1YSoKCSAgICBBbHNvIGNoYW5nZWQgdHlwZW1hcHMuaSBub3QgdG8gY2hlY2sgZm9yIE5VTEwgYmVmb3JlIGZyZWVpbmcgYSBwb2ludGVyCgowMS8yMS8yMDA4OiB3c2Z1bHRvbgoJICAgIFtQeXRob25dIEZvciBTVEwgY29udGFpbmVycywgU1dJRyBubyBsb25nZXIgYXR0ZW1wdHMgdG8gY29udmVydCBmcm9tIG9uZQogICAgICAgICAgICBTVEwgY29udGFpbmVyIHRvIGFub3RoZXIsIGVnIGZyb20gc3RkOjp2ZWN0b3I8aW50PiB0byBzdGQ6OnZlY3Rvcjxkb3VibGU+CiAgICAgICAgICAgIG9yIHN0ZDo6bGlzdDxpbnQ+IHRvIHN0ZDo6dmVjdG9yPGludD4gb3IgZXZlbiBzdGQ6OnZlY3RvcjxGb28+IHRvCiAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEJhcj4gYXMgaXQgcHJldmlvdXNseSBkaWQuIEluIGZhY3QgU1dJRyBubyBsb25nZXIgYXR0ZW1wdHMgdG8KICAgICAgICAgICAgY29udmVydCBhbnkgU1dJRyB3cmFwcGVkIEMrKyBwcm94eSBjbGFzcyB0aGF0IGlzIGFsc28gYSBQeXRob24gc2VxdWVuY2UsCiAgICAgICAgICAgIHdoZXJlYXMgcHJldmlvdXNseSBpdCB3b3VsZC4gQW55IG5vbi1TV0lHIFB5dGhvbiBzZXF1ZW5jZSB3aWxsIHN0aWxsIGJlCiAgICAgICAgICAgIGFjY2VwdGVkIHdoZXJldmVyIGFuIFNUTCBjb250YWluZXIgaXMgYWNjZXB0ZWQuIE92ZXJsb2FkZWQgbWV0aG9kcyB1c2luZwogICAgICAgICAgICBjb250YWluZXJzIHNob3VsZCBiZSBmYXN0ZXIuCgowMS8xOC8yMDA4OiB3c2Z1bHRvbgoJICAgIFtDI10gQWRkICdkaXJlY3RvcmluYXR0cmlidXRlcycgYW5kICdkaXJlY3Rvcm91dGF0dHJpYnV0ZXMnIHR5cGVtYXAgYXR0cmlidXRlcwogICAgICAgICAgICBmb3IgdGhlIGltdHlwZSB0eXBlbWFwLiBUaGVzZSBzaG91bGQgY29udGFpbiBDIyBhdHRyaWJ1dGVzIHdoaWNoIHdpbGwKICAgICAgICAgICAgYmUgZ2VuZXJhdGVkIGludG8gdGhlIEMjIGRpcmVjdG9yIGRlbGVnYXRlIG1ldGhvZHMuCgowMS8xOC8yMDA4OiBvbGx5CgkgICAgRml4IGhhbmRsaW5nIG9mIGJ5dGUgdmFsdWUgMjU1IGluIGlucHV0IGZpbGVzIG9uIHBsYXRmb3JtcyB3aGVyZQoJICAgIGNoYXIgaXMgc2lnbmVkIChpdCB3YXMgZ2V0dGluZyBtYXBwZWQgdG8gRU9GKS4gIEZpeGVzIFNGIzE1MTgyMTkuCgowMS8xNi8yMDA4OiB3c2Z1bHRvbgoJICAgIEZpeCB0ZW1wbGF0ZSBtZW1iZXIgdmFyaWFibGVzIHdyYXBwZWQgYnkgYSBzbWFydCBwb2ludGVyLiBCdWcgcmVwb3J0ZWQgCiAgICAgICAgICAgIGJ5IFJvYmVydCBMdXB0b24uCgowMS8xNC8yMDA4OiBtZ29zc2FnZQoJICAgIFN1YnN0YW50aWFsIGNoYW5nZXMgdG8gY29uZmlndXJlIHNjcmlwdCBmb3IgZGV0ZWN0aW5nIGx1YS4KCSAgICAgIENvZGUgY2FuIG5vdyBsaW5rIHRvIGxpYmx1YS5hLCBsaWJsdWE1MC5hIG9yIGxpYmx1YTUxLmEKCSAgICAgIEl0J3MgYWxzbyBhIGxvdCBuZWF0ZXIgbm93LgoKMTIvMTYvMjAwNzogd3NmdWx0b24KCSAgICBbUGVybF0gQmFja2VkIG91dCAjMTc5ODcyOCAtIG51bWJlcnMgY2FuIGJlIHBhc3NlZCB0byBmdW5jdGlvbnMgdGFraW5nIGNoYXIgKgoKMTIvMTYvMjAwNzogd3NmdWx0b24KCSAgICBGaXggIzE4MzI2MTMgLSBUZW1wbGF0ZXMgYW5kIHNvbWUgdHlwZWRlZnMgaW52b2x2aW5nIHBvaW50ZXJzIG9yIGZ1bmN0aW9uIHBvaW50ZXJzCgoxMi8xMi8yMDA3OiB3c2Z1bHRvbgoJICAgIFtKYXZhXSBGaXggIzE2MzI2MjUgLSBDb21waWxhdGlvbiBlcnJvcnMgb24gVmlzdWFsIEMrKyA2IHdoZW4gdXNpbmcgZGlyZWN0b3JzLgoKMTIvMTIvMjAwNzogd3NmdWx0b24KCSAgICBbUGVybF0gRml4ICMxNzk4NzI4IC0gbnVtYmVycyBjYW4gYmUgcGFzc2VkIHRvIGZ1bmN0aW9ucyB0YWtpbmcgY2hhciAqLgoKMTIvMTIvMjAwNzogd3NmdWx0b24KCSAgICBGaXggIzE4MTk4NDcgJXRlbXBsYXRlIHdpdGgganVzdCBvbmUgZGVmYXVsdCB0ZW1wbGF0ZSBwYXJhbWV0ZXIgCgogICAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQgPSBpbnQ+IGNsYXNzIEZvbyB7Li4ufTsKICAgICAgICAgICAgICAldGVtcGxhdGUoRm9vRGVmYXVsdCkgRm9vPD47CgoxMi8xMi8yMDA3OiBtZ29zc2FnZQoJICAgIFtMdWFdIFNtYWxsIGNvcnJlY3Rpb24gb24gTHVhLmh0bWwKCjEyLzA5LzIwMDc6IHdzZnVsdG9uCgkgICAgQXBwbHkgcGF0Y2ggIzE4MzgyNDggZnJvbSBNb250eSBUYXlsb3IgZm9yIHZwYXRoIGJ1aWxkcyBvZiBTV0lHLgoKMTIvMDgvMjAwNzogd3NmdWx0b24KCSAgICBbTHVhXSBGaXhlcyB0byByZW1vdmUgZ2NjLTQuMiB3YXJuaW5ncwoKMTIvMDYvMjAwNzogd3NmdWx0b24KCSAgICBGaXggIzE3MzQ0MTUgLSB0ZW1wbGF0ZSB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIHdpdGggZGVmYXVsdCBhcmd1bWVudHMgc3VjaCBhczoKCiAgICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgdF9pdGVtLCB0ZW1wbGF0ZTx0eXBlbmFtZT4gY2xhc3MgdF9hbGxvYyA9IHBmYzo6YWxsb2NfZmFzdCA+CiAgICAgICAgICAgICAgICBjbGFzcyBsaXN0X3QgOiBwdWJsaWMgbGlzdF9pbXBsX3Q8dF9pdGVtLHBmYzo6YXJyYXlfdDx0X2l0ZW0sdF9hbGxvYz4gPiB7IC4uLiB9OwoKMTIvMDQvMjAwNzogbWdvc3NhZ2UKCSAgICBbbHVhXSBGaXggYSBidWcgaW4gdGhlIGNsYXNzIGhpZXJhY2h5IGNvZGUsIHdoZXJlIHRoZSBtZXRob2RzIHdlcmUgbm90IHByb3BhZ2F0ZWQsIAoJICAgIGlmIHRoZSBuYW1lIG9yZGVyaW5nIHdhcyBpbiBhIGNlcnRhaW4gb3JkZXIuCgkgICAgQWRkZWQgbmV3IGV4YW1wbGUgcHJvZ3JhbXMgKGR1YWwsIGVtYmVkKSBhbmQgcnVudGltZSB0ZXN0cyBmb3IgdGVzdC1zdWl0ZS4KCjExLzMwLzIwMDc6IHdzZnVsdG9uCgkgICAgRml4IHVzaW5nIHN0YXRlbWVudHMgdXNpbmcgYSBiYXNlIGNsYXNzIG1ldGhvZCB3aGVyZSB0aGUgbWV0aG9kcyB3ZXJlIG92ZXJsb2FkZWQuCiAgICAgICAgICAgIERlcGVuZGluZyBvbiB0aGUgb3JkZXIgb2YgdGhlIHVzaW5nIHN0YXRlbWVudHMgYW5kIG1ldGhvZCBkZWNsYXJhdGlvbnMsIHRoZXNlCiAgICAgICAgICAgIHdlcmUgcHJldmlvdXNseSBnZW5lcmF0aW5nIHVuY29tcGlsZWFibGUgd3JhcHBlcnMsIGVnOgoKICAgICAgICAgICAgICBzdHJ1Y3QgRGVyaXZlZCA6IEJhc2UgewogICAgICAgICAgICAgICAgdmlydHVhbCB2b2lkIGZ1bmsoKTsKICAgICAgICAgICAgICAgIHVzaW5nIEJhc2U6OmZ1bms7CiAgICAgICAgICAgICAgfTsKClZlcnNpb24gMS4zLjMzIChOb3ZlbWJlciAyMywgMjAwNykKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMTEvMjEvMjAwNzogbWlrZWwKCSAgICBbYWxsZWdyb2NsXSBvbWl0IHByaXZhdGUgc2xvdCB0eXBlIGluZm8gaW4gdGhlIGNsYXNzZXMvdHlwZXMKCSAgICBkZWZpbmVkIG9uIHRoZSBsaXNwIHNpZGUuIEZpeCBidWcgaW4gbWFwcGluZyBvZiBDLysrIHR5cGVzCgkgICAgdG8gbGlzcCB0eXBlcy4gRml4IHR5cG8gaW4gbW9kdWxlcyBnZW5lcmF0ZWQgZGVmcGFja2FnZSBmb3JtLgoJICAgIEhhdmUgc3RkOjpzdHJpbmcgKidzIGF1dG9tYXRpY2FsbHkgbWFyc2hhbGxlZCBiZXR3ZWVuIGZvcmVpZ24KCSAgICBhbmQgbGlzcCBzdHJpbmdzLgoJCjExLzIwLzIwMDc6IG9sbHkKCSAgICBbUHl0aG9uXSBGaWxsIGluIFB5dGhvbiBEaWN0aW9uYXJ5IGZ1bmN0aW9ucyBsaXN0IChwYXRjaCBmcm9tCgkgICAgSmVsbWVyIFZlcm5vb2lqIHBvc3RlZCB0byBzd2lnLWRldmVsKS4KCjExLzIwLzIwMDc6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYSBidWcgaW4gdGhlIEMgc2Nhbm5lciByZWxhdGVkIHRvIGJhY2tzbGFzaCBjaGFyYWN0ZXJzLgoKMTEvMTkvMjAwNzogd3NmdWx0b24KCSAgICBbUGVybF0gRml4IGJyb2tlbiBjb21waWxhdGlvbiBvZiBDKysgd3JhcHBlcnMgb24gc29tZSBjb21waWxlcnMuCgoxMS8xNi8yMDA3OiBvbGx5CgkgICAgW1B5dGhvbl0gRG9uJ3QgcGFzcyBQeV9zc2l6ZV90IGZvciBhICVkIHByaW50Zi1saWtlIGZvcm1hdCBhcwoJICAgIHRoYXQncyB1bmRlZmluZWQgYmVoYXZpb3VyIHdoZW4gc2l6ZW9mKFB5X3NzaXplX3QpICE9IHNpemVvZihpbnQpLgoKVmVyc2lvbiAxLjMuMzIgKE5vdmVtYmVyIDE1LCAyMDA3KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoxMS8xNC8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbUl0gUGFja2FnZSBuYW1lIGFuZCBkbGwgbmFtZSBpcyBub3cgdGhlIHNhbWUgYXMgdGhlIFNXSUcgbW9kdWxlCiAgICAgICAgICAgIG5hbWUuIEl0IHVzZWQgdG8gYmUgdGhlIG1vZHVsZSBuYW1lIHdpdGggX3dyYXAgYXMgYSBzdWZmaXguIFRoZSBwYWNrYWdlCiAgICAgICAgICAgIGFuZCBkbGwgbmFtZXMgY2FuIGJlIG1vZGlmaWVkIHVzaW5nIHRoZSAtcGFja2FnZSBhbmQgLWRsbCBjb21tYW5kbGluZQogICAgICAgICAgICBvcHRpb25zLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoxMS8xMS8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbUl0gQWRkIHN1cHBvcnQgZm9yIFdpbmRvd3MgKFZpc3VhbCBDKysgOCB0ZXN0ZWQpCgoxMS8xMC8yMDA3OiBvbGx5CgkgICAgW3BocF0gRml4IG1ha2VmaWxlIGdlbmVyYXRlZCBieSAtbWFrZSAoU0YjMTYzMzY3OSkuICBVcGRhdGUKCSAgICBkb2N1bWVudGF0aW9uIHRvIG1hcmsgIi1tYWtlIiBhcyBkZXByZWNhdGVkIChub25lIG9mIHRoZSBvdGhlcgoJICAgIFNXSUcgYmFja2VuZHMgc2VlbSB0byBvZmZlciBzdWNoIGEgZmVhdHVyZSwgaXQgY2FuJ3QgcmVhbGlzdGljYWxseQoJICAgIGdlbmVyYXRlIGEgZnVsbHkgcG9ydGFibGUgbWFrZWZpbGUsIGFuZCB0aGUgY29tbWFuZHMgdG8gYnVpbGQgYW4KCSAgICBleHRlbnNpb24gYXJlIGVhc3kgZW5vdWdoIHRvIHdyaXRlIGZvciB0aGUgdXNlcidzIHByZWZlcnJlZCBidWlsZAoJICAgIHRvb2wpLiAgQWxzbyByZWNvbW1lbmQgYWdhaW5zdCB0aGUgdXNlIG9mICItcGhwZnVsbCIgKGl0J3Mgb25seQoJICAgIHJlYWxseSB1c2VmdWwgd2hlbiBzdGF0aWMgbGlua2luZywgYW5kIGEgZHluYW1pY2FsbHkgbG9hZGFibGUKCSAgICBtb2R1bGUgaXMgdmlydHVhbGx5IGFsd2F5cyB0aGUgYmV0dGVyIGFwcHJvYWNoKS4KCjExLzA5LzIwMDc6IG9sbHkKCSAgICBGaXggLS1oZWxwIG91dHB1dCB0byBub3RlIHRoYXQgYGV4cG9ydCBTV0lHX0ZFQVRVUkVTJyBpcyByZXF1aXJlZC4KCjEwLzI5LzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtSXSBGaXggc2VnIGZhdWx0IG9uIFdpbmRvd3MKICAgICAgICAgICAgW1JdIEV4YW1wbGVzIFIgc2NyaXB0cyBhcmUgbm93IHBsYXRmb3JtIGluZGVwZW5kZW50CgoxMC8zMC8yMDA3OiBtZ29zc2FnZQoJICAgIFtsdWFdIGZpeGVkIGJ1ZyBpbiB0ZW1wbGF0ZSBjbGFzc2VzIHdoaWNoIGNhc2VzIHRlbXBsYXRlX2RlZmF1bHQyCgkgICAgYW5kIHRlbXBsYXRlX3NwZWNpYWxpemF0aW9uX2RlZmFyZyB0byBmYWlsLgoJICAgIEFkZGVkIHNldmVyYWwgd2FybmluZyBmaWx0ZXJzIGludG8gdGhlIG92ZXJsb2FkJ3MgdGVzdCBjYXNlcy4KCSAgICBBZGRlZCBydW50aW1lIHRlc3RzIGZvciBzZXZlcmFsIGNvZGVzLgoJICAgIFlvdSBjYW4gbm93IG1ha2UgY2hlY2stbHVhLXRlc3Qtc3VpdGUgd2l0aCBubyBlcnJvcnMgYW5kIG9ubHkgYSBmZXcgd2FybmluZ3MuCgoxMC8zMC8yMDA3OiBvbGx5CgkgICAgW2d1aWxlXSBGaXggdGhlIGNvbmZpZ3VyZSB0ZXN0IHRvIHB1dCBHVUlMRUxJTksgaW4gTElCUyBub3QgTERGTEFHUwoJICAgIChTRiMxODIyNDMwKS4KCjEwLzMwLzIwMDc6IG9sbHkKCSAgICBbZ3VpbGVdIEZpeCB0aGUgZ3VpbGUgZXhhbXBsZXMgb24gNjQtYml0IHBsYXRmb3Jtcy4KCjEwLzI5LzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gRml4IG1lbWJlciBwb2ludGVycyBvbiA2NCBiaXQgcGxhdGZvcm1zLgoKMTAvMjgvMjAwNzogb2xseQoJICAgIFtsdWFdIEZpeCBzd2lnX2x1YV9jbGFzcyBpbnN0YW5jZXMgdG8gYmUgc3RhdGljIHRvIGFsbG93IG11bHRpcGxlCgkgICAgU1dJRyB3cmFwcGVycyB0byBiZSBjb21waWxlZCBpbnRvIHRoZSBzYW1lIGV4ZWN1dGFibGUgc3RhdGljYWxseS4KCSAgICBQYXRjaCBmcm9tIEFuZHJlYXMgRnJlZHJpa3Nzb24gKHBvc3RlZCB0byB0aGUgc3dpZyBtYWlsaW5nIGxpc3QpLgoKMTAvMjgvMjAwNzogb2xseQoJICAgIFtsdWFdIEZpeCBFeGFtcGxlcy9sdWEgdG8gcGFzcyBTUkNTIGZvciBDIHRlc3RzIHJhdGhlciB0aGFuIENYWFNSQ1MuCgkgICAgVGhlIGNvZGUgYXMgaXQgd2FzIGhhcHBlbmVkIHRvIHdvcmsgb24geDg2LCBidXQgYnJva2Ugb24geDg2XzY0IChhbmQKCSAgICBwcm9iYWJseSBhbnkgb3RoZXIgcGxhdGZvcm1zIHdoaWNoIHJlcXVpcmUgLWZQSUMpLgoKMTAvMjgvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEsIEMjXSBOZXcgYXBwcm9hY2ggZm9yIGZpeGluZyB1bmluaXRpYWxpc2VkIHZhcmlhYmxlIHVzYWdlIG9uIGVycm9yIGluIGRpcmVjdG9yCiAgICAgICAgICAgIG1ldGhvZHMgdXNpbmcgdGhlIG5ldyB0ZW1wbGF0ZWQgaW5pdGlhbGlzYXRpb24gZnVuY3Rpb24gU3dpZ1ZhbHVlSW5pdCgpLgoKMTAvMjgvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW1BlcmxdIFVzZSBtb3JlIGVmZmljaWVudCBTdlBWX25vbGVuKHgpIGluc3RlYWQgb2YgU3ZQVih4LFBMX25hKSBpZiBTdlBWX25vbGVuIGlzCiAgICAgICAgICAgIHN1cHBvcnRlZC4KCjEwLzI2LzIwMDc6IHd1enplYgoJICAgIFtDaGlja2VuXSBGaXggZ2xvYmFsIHZhcmlhYmxlcyBvZiBjbGFzcyBtZW1iZXIgZnVuY3Rpb24gcG9pbnRlcnMuCgkgICAgT3RoZXIgbWlub3IgZml4ZXMsIHNvIGFsbCB0ZXN0cyBpbiB0aGUgY2hpY2tlbiB0ZXN0IHN1aXRlIG5vdyBwYXNzCgoxMC8yNS8yMDA3OiBvbGx5CgkgICAgRml4IFVUTCB0eXBlY2hlY2sgbWFjcm8gZm9yIGEgZnVuY3Rpb24gdGFraW5nIGNoYXJbXSBvciBjb25zdAoJICAgIGNoYXJbXSAoU0YjMTgyMDEzMikuCgoxMC8yMi8yMDA3OiBta29lcHBlCgkgICAgW0d1aWxlXSBGaWx0ZXIgb3V0IC1hbnNpIC1wZWRhbnRpYyBmcm9tIENGTEFHUyB3aGlsZSBjb21waWxpbmcgdGVzdCBwcm9ncmFtcyBmb3IgR3VpbGUKCSAgICBpbiBjb25maWd1cmUuICBUaGlzIGVuYWJsZXMgcnVubmluZyB0aGUgdGVzdCBzdWl0ZSBmb3IgR3VpbGUgaWYgaXQgaXMgaW5zdGFsbGVkIGFuZAoJICAgIHVzYWJsZS4KCjEwLzIyLzIwMDc6IG1rb2VwcGUKCSAgICBbR3VpbGUgLXNjbV0gRml4IHRlc3RjYXNlcyBhcHBseV9zaWduZWRfY2hhciBhbmQgYXBwbHlfc3RyaW5ncwoJICAgIGJ5IGFkZGluZyBleHBsaWNpdCBjYXN0cyB0byB0aGUgYXBwcm9wcmlhdGUgJGx0eXBlLgoKMTAvMjIvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEsIEMjXSBGaXggdW5pbml0aWFsaXNlZCB2YXJpYWJsZSB1c2FnZSBvbiBlcnJvciBpbiBkaXJlY3RvciBtZXRob2RzLgoKMTAvMTkvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEsIEMjXSBCdWcgIzE3OTQyNDcgLSBmaXggZ2VuZXJhdGVkIGNvZGUgZm9yIGRlcml2ZWQgY2xhc3NlcyB3aGVuIGNzYmFzZSBvciBqYXZhYmFzZQogICAgICAgICAgICB0eXBlbWFwcyBhcmUgdXNlZCB3aXRoIHRoZSByZXBsYWNlPSIxIiBhdHRyaWJ1dGUuCgoxMC8xOS8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBEb2NzIHVwZGF0ZWQgdG8gc3VnZ2VzdCB1c2luZyBkaXN0dXRpbHMuIFBhdGNoICMxNzk2NjgxIGZyb20gQ2hyaXN0b3BoZXIgQmFya2VyLgoKMTAvMTkvMjAwNzogb2xseQoJICAgIFtwZXJsNV0gQ2xlYXIgZXJybm8gYmVmb3JlIGNhbGxzIHRvIHN0cnRvbCgpLCBzdHJ0b3VsKCksIHN0cnRvbGwoKQoJICAgIGFuZCBzdHJ0b3VsbCgpIHdoaWNoIHdlIGNoZWNrIGVycm5vIGFmdGVyIHRvIGF2b2lkIHNlZWluZyBhIGp1bmsKCSAgICB2YWx1ZSBvZiBlcnJubyBpZiB0aGVyZSBpc24ndCBhbiBlcnJvciBpbiB0aGUgY2FsbC4KCjEwLzE2LzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIERlcHJlY2F0ZSAlYXR0cmlidXRlX3JlZiBhbmQgcmVwbGFjZSB3aXRoICVhdHRyaWJ1dGVyZWYuIFRoZXJlIGlzIGp1c3QgYW4gYXJndW1lbnQKICAgICAgICAgICAgb3JkZXIgY2hhbmdlIGluIG9yZGVyIHRvIG1haW50YWluIGNvbnNpc3RlbmN5IHdpdGggJWF0dHJpYnV0ZSwgZnJvbToKCiAgICAgICAgICAgICAgJWF0dHJpYnV0ZV9yZWYoQ2xhc3MsIEF0dHJpYnV0ZVR5cGUsIEFjY2Vzc29yTWV0aG9kLCBBdHRyaWJ1dGVOYW1lKQogICAgICAgICAgICB0bwogICAgICAgICAgICAgICVhdHRyaWJ1dGVyZWYoQ2xhc3MsIEF0dHJpYnV0ZVR5cGUsIEF0dHJpYnV0ZU5hbWUsIEFjY2Vzc29yTWV0aG9kKQoKMTAvMTYvMjAwNzogb2xseQoJICAgIFtUY2xdIEZpeCBzZXZlcmFsIG9jdXJyZW5jZXMgb2YgIndhcm5pbmc6IGRlcHJlY2F0ZWQgY29udmVyc2lvbgoJICAgIGZyb20gc3RyaW5nIGNvbnN0YW50IHRvICdjaGFyKiciIGZyb20gR0NDIDQuMiBpbiBnZW5lcmF0ZWQgQy9DKysKCSAgICBjb2RlLgoKMTAvMTYvMjAwNzogb2xseQoJICAgIFtQSFBdIEZpeCBtYW55IG9jY3VycmVuY2VzIG9mICJ3YXJuaW5nOiBkZXByZWNhdGVkIGNvbnZlcnNpb24gZnJvbQoJICAgIHN0cmluZyBjb25zdGFudCB0byAnY2hhcionIiBmcm9tIEdDQyA0LjIgaW4gZ2VuZXJhdGVkIEMvQysrIGNvZGUKCSAgICB3aGVuIGNvbXBpbGluZyB3aXRoIGEgbmV3IGVub3VnaCB2ZXJzaW9uIG9mIFBIUCA1ICh0ZXN0ZWQgd2l0aAoJICAgIFBIUCA1LjIuMywgYnV0IFBIUCA1LjIuMSBpcyBwcm9iYWJseSB0aGUgbWluaW11bSByZXF1aXJlbWVudCkuCgoxMC8xNS8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBQYXRjaCAjMTc5NzEzMyBmcm9tIERhdmlkIFBpZXBncmFzcyBmaXhlcyAlYXR0cmlidXRlIHdoZW4gdGhlIGdldHRlciBoYXMgdGhlIHNhbWUgbmFtZQogICAgICAgICAgICBhcyB0aGUgYXR0cmlidXRlIG5hbWUgYW5kIG5vIGxvbmdlciBnZW5lcmF0ZSBub24tZnVuY3Rpb25hbCBzZXR0ZXIgZm9yIHJlYWQtb25seSBhdHRyaWJ1dGVzLgoKMTAvMTUvMjAwNzogb2xseQoJICAgIFtUY2xdIFByZXZlbnQgU1dJR19UY2xfQ29udmVydFB0ciBmcm9tIGNhbGxpbmcgdGhlIHVua25vd24gcHJvYy4KCSAgICBBZGQgRXhhbXBsZXMvdGNsL3N0ZF92ZWN0b3IvIHdoaWNoIHRoaXMgY2hhbmdlIGZpeGVzLiAgUGF0Y2gKCSAgICBpcyBmcm9tICJDbGlmZiBDIiBpbiBTRiMxODA5ODE5LgoKMTAvMTIvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEFkZCBEZXRhY2hDdXJyZW50VGhyZWFkIGJhY2sgaW4gZm9yIGRpcmVjdG9ycy4gU2VlIGVudHJ5IGRhdGVkIDA4LzExLzIwMDYgYW5kCiAgICAgICAgICAgIHNlYXJjaCBmb3IgRGV0YWNoQ3VycmVudFRocmVhZCBvbiB0aGUgbWFpbGluZyBsaXN0cyBmb3IgZGV0YWlscy4gVGhlIGNyYXNoZXMgb24gU29sYXJpcwogICAgICAgICAgICBzZWVtIHRvIGJlIG9ubHkgcHJlc2VudCBpbiBqZGstMS40LjIgYW5kIGxvd2VyIChqZGstMS41LjAgYW5kIGpkay0xLjYuMCBhcmUgb2theSksIHNvCiAgICAgICAgICAgIGFueW9uZSB1c2luZyBkaXJlY3RvcnMgc2hvdWxkIHVzZSBhIHJlY2VudCBqZGsgb24gU29sYXJpcywgb3IgZGVmaW5lIChzZWUgZGlyZWN0b3Iuc3dnKQogICAgICAgICAgICBTV0lHX0pBVkFfTk9fREVUQUNIX0NVUlJFTlRfVEhSRUFEIHRvIHRoZSBDKysgY29tcGlsZXIgdG8gZ2V0IG9sZCBiZWhhdmlvdXIuCgoxMC8xMi8yMDA3OiB3c2Z1bHRvbgoJICAgIFtKYXZhXSBFbnN1cmUgdGhlIHByZW1hdHVyZSBnYXJiYWdlIGNvbGxlY3Rpb24gcHJldmVudGlvbiBwYXJhbWV0ZXIgKHBnY3BwKSBpcyBnZW5lcmF0ZWQKICAgICAgICAgICAgd2hlbiB0aGVyZSBhcmUgQyBjb21tZW50cyBpbiB0aGUganR5cGUgYW5kIGpzdHlwZSB0eXBlbWFwcy4KCjEwLzEyLzIwMDc6IHd1enplYgoJICAgIEFkZGVkIGEgdGVzdHN1aXRlIGVudHJ5IGZvciBCdWcgIzE3MzU5MzEKCjEwLzA5LzIwMDc6IG9sbHkKCSAgICBBdXRvbWF0aWNhbGx5IHJlcnVuIGF1dG9nZW4uc2ggaWYgY29uZmlndXJlLmluIGlzIG1vZGlmaWVkLgoKMTAvMDkvMjAwNzogb2xseQoJICAgIEVuaGFuY2UgY2hlY2stJS10ZXN0LXN1aXRlIHJ1bGUgYW5kIGZyaWVuZHMgdG8gZ2l2ZSBhIG1vcmUgaGVscGZ1bAoJICAgIGVycm9yIG1lc3NhZ2UgaWYgeW91IHRyeSB0aGVtIGZvciBhIGxhbmd1YWdlIHdoaWNoIGRvZXNuJ3QgZXhpc3QKCSAgICAoZS5nLiAibWFrZSBjaGVjay1waHAtdGVzdC1zdWl0ZSIgcmF0aGVyIHRoYW4gdGhlIGNvcnJlY3QKCSAgICAibWFrZSBjaGVjay1waHA0LXRlc3Qtc3VpdGUiKS4KCjEwLzA5LzIwMDc6IG9sbHkKCSAgICBBZGQgbWFrZSBydWxlIHRvIHJlZ2VuZXJhdGUgTWFrZWZpbGUgZnJvbSBNYWtlZmlsZS5pbiBpZiBpdCBoYXMKCSAgICBjaGFuZ2VkLgoKMTAvMDkvMjAwNzogb2xseQoJICAgIFtwaHBdIEZpeCBsb25nLXN0YW5kaW5nIG1lbW9yeSBsZWFrIGluIHdyYXBwZWQgY29uc3RydWN0b3JzIGFuZAoJICAgIHdyYXBwZWQgZnVuY3Rpb25zL21ldGhvZHMgd2hpY2ggcmV0dXJuIGFuIG9iamVjdC4KCjEwLzA4LzIwMDc6IG9sbHkKCSAgICBGaXggTWFrZWZpbGUuaW4gdG8gcmVhZCBjaGVjay5saXN0IGZpbGVzIGNvcnJlY3RseSBpbiBhIFZQQVRICgkgICAgYnVpbGQuCgoxMC8wNy8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyMsIEphdmFdIEV4cGVyaW1lbnRhbCBzaGFyZWRfcHRyIHR5cGVtYXBzIGFkZGVkCgowOS8yNy8yMDA3OiBtZ29zc2FnZQoJICAgIFtsdWFdIGFkZGVkIG1vcmUgdmVyYm9zZSBlcnJvciBtZXNzYWdlcyBmb3IgaW5jb3JyZWN0IHR5cGVjaGVja3MuCgkgICAgQWRkZWQgYSByb3V0aW5lIHdoaWNoIGNoZWNrcyB0aGUgZXhhY3QgbnVtYmVyIG9mIHBhcmFtZXRlcnMgcGFzc2VkIHRvIGEgZnVuY3Rpb24KCSAgICAoYnJlYWtzIG9wZXJhdG9yX292ZXJsb2FkaW5nIGZvciB1bmFyeSBtaW51cyBvcGVyYXRvciwgY3VycmVudGx5IGRpc2FibGVkKS4KCSAgICBSZW9yZ2FuaXNlZCB0aGUgbHVhdHlwZW1hcHMuc3dnIHRvIHRpZHkgaXQgdXAuCgkgICAgQWRkZWQgYSBsb3Qgb2YgJWlnbm9yZXMgb24gdGhlIG9wZXJhdG9ycyBub3Qgc3VwcG9ydGVkIGJ5IGx1YS4KCSAgICBBZGRlZCBzdXBwb3J0IGZvciBjb25zdGFudCBtZW1iZXIgZnVuY3Rpb24gcG9pbnRlcnMgJiBydW50ZXN0IGZvciBtZW1iZXJfcG9pbnRlci5pCgkgICAgQWRkZWQgZmlyc3QgdmVyc2lvbiBvZiB3Y2hhci5pCgowOS8yNS8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyMsIEphdmFdIHRocm93cyB0eXBlbWFwcyBmb3Igc3RkOjp3c3RyaW5nIHVzaW5nIEMjIHBhdGNoICMxNzk5MDY0IGZyb20gRGF2aWQgUGllcGdyYXNzCgowOS8yNC8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbVGNsXSBBcHBseSAjMTc3MTMxMyB0byBmaXggYnVnICMxNjUwMjI5IC0gZml4ZXMgbG9uZyBsb25nIGFuZCB1bnNpZ25lZCBsb25nIGxvbmcKICAgICAgICAgICAgaGFuZGxpbmcuCgowOS8yMC8yMDA3OiBvbGx5CgkgICAgW0phdmFdIEVsaW1pbmF0ZSBzb21lIHVubmVjZXNzYXJ5IHVzZXMgb2YgYSB0ZW1wb3JhcnkgYnVmZmVyCgkgICAgYWxsb2NhdGVkIHVzaW5nIG5ld1tdLiAgU0YjMTc5NjYwOS4KCjA5LzE5LzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gVGhlICRjc2lucHV0IHNwZWNpYWwgdmFyaWFibGUgY2FuIGJlIHVzZWQgaW4gdGhlIGNzdmFyaW4gdHlwZW1hcCB3aGVyZSBpdCBpcyBhbHdheXMKICAgICAgICAgICAgZXhwYW5kZWQgdG8gJ3ZhbHVlJy4KCjA5LzE5LzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gRml4IGJ1ZyByZXBvcnRlZCBieSBHbGVubiBBIFdhdHNvbiBhbmQgIzE3OTUyNjAgd2hlcmUgdGhlIGNzdHlwZSB0eXBlbWFwIHVzZWQgdGhlICdyZWYnCiAgICAgICAgICAgIGtleXdvcmQgaW4gdGhlIHR5cGVtYXAgYm9keSwgaXQgcHJvZHVjZWQgdW5jb21waWxhYmxlIEMjIHByb3BlcnRpZXMgKHZhcmlhYmxlIHdyYXBwZXJzKS4KICAgICAgICAgICAgVGhlIHR5cGUgZm9yIHRoZSBwcm9wZXJ0eSBub3cgY29ycmVjdGx5IGNvbWVzIGZyb20gdGhlICdvdXQnIGF0dHJpYnV0ZSBpbiB0aGUgY3N0eXBlIHR5cGVtYXAuCgowOS8xOS8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gRml4IGNvbnN0IHN0ZDo6d3N0cmluZyYgdHlwZW1hcHMKCjA5LzE5LzIwMDc6IHdzZnVsdG9uCgkgICAgW0phdmFdIEVuc3VyZSB0aGUgcHJlbWF0dXJlIGdhcmJhZ2UgY29sbGVjdGlvbiBwcmV2ZW50aW9uIHBhcmFtZXRlciAocGdjcHApIGlzIGdlbmVyYXRlZAogICAgICAgICAgICB3aGVyZSBhIHBhcmFtZXRlciBpcyBwYXNzZWQgYnkgcG9pbnRlciByZWZlcmVuY2UsIGVnIGluIHRoZSBzdGQ6OnZlY3RvciB3cmFwcGVycy4gVGhlIHBnY3BwCiAgICAgICAgICAgIGlzIGFsc28gZ2VuZXJhdGVkIG5vdyB3aGVuIHVzZXIncyBjdXN0b20gdHlwZW1hcHMgdXNlIGEgcHJveHkgY2xhc3MgaW4gdGhlIGpzdHlwZSB0eXBlbWFwCiAgICAgICAgICAgIGFuZCBhICdsb25nJyBpbiB0aGUganR5cGUgdHlwZW1hcC4KCjA5LzE4LzIwMDc6IG9sbHkKCSAgICBbcGhwXSBBZGQgdHlwZW1hcHMgZm9yIGhhbmRsaW5nIHBhcmFtZXRlcnMgb2YgdHlwZSBzdGQ6OnN0cmluZyAmCgkgICAgd2hpY2ggYXJlIG1vZGlmaWVkIGJ5IHRoZSB3cmFwcGVkIGZ1bmN0aW9uLgoKMDkvMTcvMjAwNzogb2xseQoJICAgIFtweXRob25dIFNwbGl0IHBvdGVudGlhbGx5IGxvbmcgc3RyaW5nIGxpdGVyYWxzIHRvIGF2b2lkIGhpdHRpbmcKCSAgICBNU1ZDJ3MgbG93IGZpeGVkIGxpbWl0IG9uIHN0cmluZyBsaXRlcmFsIGxlbmd0aCAtIHBhdGNoIGZyb20KCSAgICBTRiMxNzIzNzcwLCBhbHNvIHJlcG9ydGVkIGFzIFNGIzE2MzA4NTUuCgowOS8xNy8yMDA3OiBvbGx5CgkgICAgW29jYW1sXSBGaXggcmVuYW1pbmcgb2Ygb3ZlcmxvYWRlZCBtZXRob2RzIGluIHRoZSBtZXRob2RfdGFibGUgLQoJICAgIG15IHBhdGNoIGZyb20gU0YjOTQwMzk5LgoKMDkvMTcvMjAwNzogb2xseQoJICAgIFtweXRob25dIFNpbXBsZXIgY29kZSBmb3IgU1dJR19Bc1ZhbF9ib29sKCkgd2hpY2ggZml4ZXMgYSAic3RyaWN0CgkgICAgYWxpYXNpbmciIHdhcm5pbmcgZnJvbSBHQ0MgLSBwYXRjaCBmcm9tIFNGIzE3MjQ1ODEgYnkgQW5kcmV3CgkgICAgQmF1bWFubi4KCjA5LzE3LzIwMDc6IG9sbHkKCSAgICBbcGVybDVdIFVzZSBzdl9zZXRwdm4oKSB0byBzZXQgYSBzY2FsYXIgZnJvbSBhIHBvaW50ZXIgYW5kIGxlbmd0aAoJICAgIC0gcGF0Y2ggZnJvbSBTRiMxNzQ0NjAgYnkgIm1hdHN1YmFyYXkiLgoKMDkvMTcvMjAwNzogb2xseQoJICAgIFdoZW4gd3JhcHBpbmcgQysrIGNvZGUsIGdlbmVyYXRlIGNvZGUgd2hpY2ggdXNlcwoJICAgIHN0ZDo6c3RyaW5nOjphc3NpZ24oUFRSLCBMRU4pIHJhdGhlciB0aGFuIGFzc2lnbmluZwoJICAgIHN0ZDo6c3RyaW5nKFBUUiwgTEVOKS4gIFVzaW5nIGFzc2lnbiBnZW5lcmF0ZXMgbW9yZSBlZmZpY2llbnQgY29kZQoJICAgICh0ZXN0ZWQgd2l0aCBHQ0MgNC4xLjIpLgoKMDkvMDcvMjAwNzogd3NmdWx0b24KCSAgICBGaXggJWlnbm9yZSBvbiBjb25zdHJ1Y3RvcnMgd2hpY2ggYXJlIG5vdCBleHBsaWNpdGx5IGRlY2xhcmVkIFtTRiAjMTc3NzcxMl0KCjA5LzA1LzIwMDc6IHd1enplYiAoSm9obiBMZW56KQoJICAgIC0gQ2hhbmdlIHJfbHR5cGUgaW4gdHlwZXN5cy5jIHRvIHN0b3JlIGEgaGFzaHRhYmxlIGluc3RlYWQgb2YgYSBzaW5nbGUgdmFsdWUuCgkgICAgICBzZXZlcmFsIHZlcnkgc3VidGxlIGJ1Z3Mgd2VyZSBiZWluZyBjYXVzZWQgYnkgbXVsdGlwbGUgbHR5cGVzIGJlaW5nIG1hcHBlZAoJICAgICAgdG8gYSBzaW5nbGUgbWFuZ2xlZCB0eXBlLCBtb3N0bHkgd2hlbiB1c2luZyB0eXBlZGVmZWQgdGVtcGxhdGUgcGFyYW1ldGVycy4KCSAgICAgIE5vdywgcl9sdHlwZSBzdG9yZXMgYSBoYXNodGFibGUgb2YgcG9zc2libGUgbHR5cGVzLCBhbmQgd2hlbiBnZW5lcmF0aW5nIHRoZQoJICAgICAgdHlwZSB0YWJsZSwgYWxsIHRoZSBsdHlwZXMgYXJlIGFkZGVkIGludG8gdGhlIHN3aWdfdHlwZV9pbmZvIHN0cnVjdHVyZS4KCjA4LzMxLzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFNGICMxNzU0OTY3IGZyb20gSmFtZXMgQmlnbGVyLgogICAgICAgICAgICAtIEZpeCBidWcgaW4gdHVybmluZyBvbiB3YXJuaW5ncyB0aGF0IHdlcmUgdHVybmVkIG9mZiBieSBkZWZhdWx0LiBFZyAnc3dpZyAtdyszMDknIHdpbGwgbm93CiAgICAgICAgICAgICAgdHVybiBvbiB0aGUgbm9ybWFsbHkgc3VwcHJlc3NlZCB3YXJuaW5nIDMwOS4KCiAgICAgICAgICAgIC0gTmV3IC1XZXh0cmEgY29tbWFuZGxpbmUgb3B0aW9uIHdoaWNoIGVuYWJsZXMgdGhlIGV4dHJhIHdhcm5pbmcgbnVtYmVyczoKICAgICAgICAgICAgICAyMDIsMzA5LDQwMyw1MTIsMzIxLDMyMiAodGhpcyBpcyB0aGUgbGlzdCBvZiB3YXJuaW5ncyB0aGF0IGhhdmUgYWx3YXlzIGJlZW4gc3VwcHJlc3NlZCBieQogICAgICAgICAgICAgIGRlZmF1bHQpLiBCeSBzcGVjaWZ5aW5nIC1XZXh0cmEsIGFsbCB3YXJuaW5ncyB3aWxsIGJlIHR1cm5lZCBvbiwgYnV0IHVubGlrZSAtV2FsbCwKICAgICAgICAgICAgICB3YXJuaW5ncyBjYW4gc3RpbGwgYmUgc2VsZWN0aXZlbHkgdHVybmVkIG9uL29mZiB1c2luZyAld2FybmZpbHRlciwKICAgICAgICAgICAgICAjcHJhZ21hIFNXSUcgbm93YXJuIG9yIGZ1cnRoZXIgLXcgY29tbWFuZGxpbmUgb3B0aW9ucywgZWc6CiAgICAgICAgICAgICAgICBzd2lnIC1XZXh0cmEgLXczMDkKICAgICAgICAgICAgICB3aWxsIHR1cm4gb24gYWxsIHdhcm5pbmdzIGV4Y2VwdCAzMDkuCgowOC8yOC8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICAtIE5ldyBkZWJ1Z2dpbmcgb3B0aW9ucywgLWRlYnVnLW1vZHVsZSA8bj4gYW5kIC1kZWJ1Zy10b3AgPG4+IHRvIGRpc3BsYXkgdGhlIHBhcnNlIHRyZWUgYXQKICAgICAgICAgICAgICB2YXJpb3VzIHN0YWdlcywgd2hlcmUgPG4+IGlzIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2Ygc3RhZ2VzIDEtNC5Gb3IgZXhhbXBsZSwgdG8KICAgICAgICAgICAgICBkaXNwbGF5IHRvcCBvZiBwYXJzZSB0cmVlIGF0IHN0YWdlcyAxIGFuZCAzOgogICAgICAgICAgICAgICAgc3dpZyAtZGVidWctdG9wIDEsMwoKICAgICAgICAgICAgLSBEZXByZWNhdGUgdGhlIGZvbGxvd2luZyBvcHRpb25zIHdoaWNoIGhhdmUgZXF1aXZhbGVudHMgYmVsb3c6CiAgICAgICAgICAgICAgLWR1bXBfcGFyc2VfbW9kdWxlICAgID0+ICAgLWRlYnVnLW1vZHVsZSAxCiAgICAgICAgICAgICAgLWR1bXBfbW9kdWxlICAgICAgICAgID0+ICAgLWRlYnVnLW1vZHVsZSA0CiAgICAgICAgICAgICAgLWR1bXBfcGFyc2VfdG9wICAgICAgID0+ICAgLWRlYnVnLXRvcCAxCiAgICAgICAgICAgICAgLWR1bXBfdG9wICAgICAgICAgICAgID0+ICAgLWRlYnVnLXRvcCA0CgogICAgICAgICAgICAtIFJlbmFtZWQgc29tZSBjb21tYW5kbGluZSBvcHRpb25zIGZvciBuYW1pbmcgY29uc2lzdGVuY3kgYWNyb3NzIGFsbCBvcHRpb25zOgogICAgICAgICAgICAgIC1kZWJ1Z190ZW1wbGF0ZSAgPT4gICAtZGVidWctdGVtcGxhdGUKICAgICAgICAgICAgICAtZGVidWdfdHlwZW1hcCAgID0+ICAgLWRlYnVnLXR5cGVtYXAKICAgICAgICAgICAgICAtZHVtcF9jbGFzc2VzICAgID0+ICAgLWRlYnVnLWNsYXNzZXMKICAgICAgICAgICAgICAtZHVtcF90YWdzICAgICAgID0+ICAgLWRlYnVnLXRhZ3MKICAgICAgICAgICAgICAtZHVtcF90eXBlZGVmICAgID0+ICAgLWRlYnVnLXR5cGVkZWYKICAgICAgICAgICAgICAtZHVtcF9tZW1vcnkgICAgID0+ICAgLWRlYnVnLW1lbW9yeQoKMDgvMjUvMjAwNzogb2xseQoJICAgIFtQSFA1XSBGaXggaGFuZGxpbmcgb2YgZG91YmxlIG9yIGZsb2F0IHBhcmFtZXRlcnMgd2l0aCBhbiBpbnRlZ2VyCgkgICAgZGVmYXVsdCB2YWx1ZS4KCjA4LzI1LzIwMDc6IG9sbHkKCSAgICBbUEhQNV0gR2VuZXJhdGUgX19pc3NldCgpIG1ldGhvZHMgZm9yIHNldHRlcnMgZm9yIFBIUCA1LjEgYW5kIGxhdGVyLgoKMDgvMjAvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEgQyNdIEZpeCBkaXJlY3RvciBidWcgIzE3NzY2NTEgcmVwb3J0ZWQgYnkgU3RlcGhhbmUgUm91dGVsb3VzIHdoaWNoIG9jY3VycmVkIHdoZW4KICAgICAgICAgICAgdGhlIGRpcmVjdG9yIGNsYXNzIG5hbWUgaXMgdGhlIHNhbWUgYXMgdGhlIHN0YXJ0IG9mIHNvbWUgb3RoZXIgc3ltYm9scyB1c2VkIHdpdGhpbgogICAgICAgICAgICB0aGUgZGlyZWN0b3IgY2xhc3MuCgowOC8xNy8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBDb3JyZWN0IGJlaGF2aW91ciBmb3IgdGVtcGxhdGVkIG1ldGhvZHMgdXNlZCB3aXRoICVyZW5hbWUgb3IgJWlnbm9yZSBhbmQgdGhlIGVtcHR5CiAgICAgICAgICAgIHRlbXBsYXRlIGRlY2xhcmF0aW9uIC0gJXRlbXBsYXRlKCkuIEEgd2FybmluZyBpcyBpc3N1ZWQgaWYgdGhlIG1ldGhvZCBoYXMgbm90IGJlZW4KICAgICAgICAgICAgcmVuYW1lZC4KCjA4LzE2LzIwMDc6IG11dGFuZGl6IChNaWtlbCBCYW5jcm9mdCkKCSAgICBbYWxsZWdyb2NsXSBOYW1lIGdlbmVyYXRlZCBjbCBmaWxlIGJhc2VkIG9uIGlucHV0IGZpbGUgcmF0aGVyIHRoYW4gYnkKCSAgICBtb2R1bGUgbmFtZS4gSXQgd2FzIHBvc3NpYmxlIHRvIGVuZCB1cCB3aXRoIGEgbXlwYWNrYWdlLmNsIGFuZCBhIHRlc3Rfd3JhcC5jCgkgICAgd2hlbiBwYXJzaW5nIGEgdGVzdC5pIGlucHV0IGZpbGUuIENvbmZ1c2luZy4gQWxzbywgaW5jbHVkZSBleHRlcm5hbC1mb3JtYXQKCSAgICB0ZW1wbGF0ZXMgZm9yIDpmYXQgYW5kIDpmYXQtbGUgYXV0b21hdGljYWxseSB0byBhdm9pZCB0aGVzZSBiZWluZyBjb21waWxlZAoJICAgIGF0IHJ1bnRpbWUuCgowOC8xNS8yMDA3OiBlZnV6enlvbmUKICAgICAgICAgICAgW2NmZmldIEFwcGx5IHBhdGNoICMxNzY2MDc2IGZyb20gTGVpZ2ggU21pdGggYWRkaW5nIHN1cHBvcnQgZm9yIG5ld2x5IGludHJvZHVjZWQKICAgICAgICAgICAgaW4gY2ZmaSA6bG9uZy1sb25nIGFuZCA6dW5zaWduZWQtbG9uZy1sb25nLgoKMDgvMTAvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEFkZCBkb2N1bWVudGF0aW9uIHBhdGNoICMxNzQzNTczIGZyb20gSmVmZnJleSBTb3JlbnNlbi4gSXQgY29udGFpbnMgYSBuZWF0CiAgICAgICAgICAgIGlkZWEgd2l0aCByZXNwZWN0IHRvIGJldHRlciBtZW1vcnkgbWFuYWdlbWVudCBieSB0aGUgSlZNIG9mIEMrKyBhbGxvY2F0ZWQgbWVtb3J5LgoKMDgvMTAvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW1BlcmxdIEFwcGx5IHBhdGNoICMxNzcxNDEwIGZyb20gV2FkZSBCcmFpbmVyZCB0byBmaXggdHlwZWRlZiBYUyhTd2lnUGVybFdyYXBwZXIpIGluCiAgICAgICAgICAgIHBlcmxydW4uc3dnIGZvciBBY3RpdmVTdGF0ZSBQZXJsIGJ1aWxkIDgyMiBhbmQgUGVybCA1LjguOSBhbmQgNS4xMCBicmFuY2hlcy4KCjA4LzEwLzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtMdWFdIGNvbnN0IGVudW0gcmVmZXJlbmNlIHR5cGVtYXBzIGZpeGVkLgoKMDgvMDkvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBBZGRlZCBtaXNzaW5nIHN1cHBvcnQgZm9yIEMrKyBjbGFzcyBtZW1iZXIgcG9pbnRlcnMuCgowOC8wOS8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyMsIEphdmFdIEFkZCBzdXBwb3J0IGZvciAkb3duZXIgaW4gdGhlICJvdXQiIHR5cGVtYXBzIGxpa2UgaW4gdGhlIHRoZSBzY3JpcHRpbmcKICAgICAgICAgICAgbGFuZ3VhZ2UgbW9kdWxlcy4gTm90ZSB0aGF0ICRvd25lciBoYXMgYWx3YXlzIGJlZW4gc3VwcG9ydGVkIGluIHRoZSAiamF2YW91dCIgLyAiY3NvdXQiCiAgICAgICAgICAgIHR5cGVtYXBzLgoKMDgvMDEvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgRml4IHNtYXJ0IHBvaW50ZXIgaGFuZGxpbmcgZm9yIGNsYXNzZXMgdGhhdCBoYXZlIHRlbXBsYXRlZCBtZXRob2RzIHdpdGhpbiB0aGUgc21hcnQKICAgICAgICAgICAgcG9pbnRlciB0eXBlLiBQcm9ibGVtIHJlcG9ydGVkIGJ5IGNyYWlnZG8gYXQgZWUud2FzaGluZ3Rvbi5lZHUuCgowNy8zMS8yMDA3OiBlZnV6enlvbmUKICAgICAgICAgICAgW2NmZmldIGZpeGVkIG1lbW9yeSBhY2Nlc3MgYWZ0ZXIgYmVpbmcgZnJlZWQgYnVnLiB0aGFua3MgdG8gTWFydGluIFBlcmNvc3NpLgogICAgICAgICAgICBwYWNrYWdlIG5hbWUgY2xvcyBjaGFuZ2VkIHRvIGNsLiB0aGFua3MgdG8gUmFsZiBNYXR0ZXMKCjA3LzI0LzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFBhcmFsbGVsIG1ha2Ugc3VwcG9ydCBhZGRlZCBmb3IgdGhlIGV4YW1wbGVzIGFuZCB0ZXN0LXN1aXRlIGZvciBkZXZlbG9wZXJzIHdobyBoYXZlCiAgICAgICAgICAgIG1vcmUgdGhhbiBvbmUgQ1BVLiBOb3cgcGFyYWxsZWwgbWFrZSBjYW4gYmUgdXNlZCBmb3IgY2hlY2tpbmcgaW4gYWRkaXRpb24gdG8gYnVpbGRpbmcKICAgICAgICAgICAgdGhlIFNXSUcgZXhlY3V0YWJsZS4gU29tZSB0eXBpY2FsIGNoZWNraW5nIGV4YW1wbGVzOgoKICAgICAgICAgICAgICBtYWtlIC1qOCAtayBjaGVjawogICAgICAgICAgICAgIG1ha2UgLWo0IGNoZWNrLWphdmEtdGVzdC1zdWl0ZQogICAgICAgICAgICAgIG1ha2UgLWoyIGNoZWNrLWphdmEtZXhhbXBsZXMKCjA3LzE5LzIwMDc6IG1nb3NzYWdlCiAgICAgICAgICAgIEZpeGVkIGJ1ZyB0aGF0IHN0b3BwZWQgY29uZmlndXJlIHdvcmtpbmcgb24gbWluZ3cgKGFwcGxpZWQgZG9zMnVuaXggdG8gY29uZmlndXJlLmluKQoKMDcvMTAvMjAwNzogbWdvc3NhZ2UKICAgICAgICAgICAgW2x1YV0gRXh0cmEgY29tcGF0aWJpbGl0eSB3aXRoIEx1YSA1LjEgKHVwZGF0ZWQgU1dJR19pbml0LCBkb2NzLCBleGFtcGxlcywgdGVzdCBzdWl0ZSkKCSAgICBSZW1vdmVkIG5hbWUgY2xhc2ggZm9yIHN0YXRpYyBsaW5rIG9mIG11bHRpcGxlIG1vZHVsZXMKCjA3LzA1LzIwMDc6IG1nb3NzYWdlCiAgICAgICAgICAgIFtsdWFdIEZpeCBhIGJ1ZyBpbiBTV0lHX0FMTE9DX0FSUkFZKCkKICAgICAgICAgICAgaW1wcm92ZWQgdGhlIGVycm9yIG1lc3NhZ2VzIGZvciBpbmNvcnJlY3QgYXJndW1lbnRzLgogICAgICAgICAgICBDaGFuZ2VkIHRoZSBvdXRwdXQgb2Ygc3dpZ190eXBlKCkgdG8gdXNlIHRoZSBodW1hbiByZWFkYWJsZSBmb3JtIG9mIHRoZSB0eXBlLAoJICAgIHJhdGhlciB0aGFuIHRoZSByYXcgc3dpZyB0eXBlLgoKMDcvMDMvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBGaXggZGlyZWN0b3JzIGZvciBzb21lIG92ZXJsb2FkZWQgbWV0aG9kcyB3aGVyZSB0aGUgaW10eXBlIHJlc3VsdGVkIGluIGlkZW50aWNhbAogICAgICAgICAgICBtZXRob2RzIGJlaW5nIGdlbmVyYXRlZCBpbiB0aGUgQyMgZGlyZWN0b3IgY2xhc3MsIGVnIHZvaWQgZm9vKGludCAqKSBhbmQgdm9pZCBmb28oZG91YmxlICopCiAgICAgICAgICAgIHVzZWQgdG8gZ2VuZXJhdGVkIHR3byBvZiB0aGVzZToKCiAgICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIFN3aWdEaXJlY3RvcmZvbyhJbnRQdHIgcCkgeyAuLi4gfQoKMDYvMjUvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEsIEMjXSBTb21lIHBhcmFtZXRlciBuYW1lIGNoYW5nZXMgaW4gc3RkX3ZlY3Rvci5pIGFsbG93aW5nIGJldHRlciB0YXJnZXRpbmcKICAgICAgICAgICAgb2YgdHlwZW1hcHMgZm9yIG1ldGhvZCBwYXJhbWV0ZXJzIChmb3IgbWVtb3J5IG1hbmFnZW1lbnQgb2YgY29udGFpbmVycyBvZiBwb2ludGVycykuCgowNi8wNy8yMDA3OiBtdXRhbmRpeiAoTWlrZWwgQmFuY3JvZnQpCgkgICAgW2FsbGVncm9jbF0KCSAgICBmaXggZm9yZWlnbi10eXBlIGNvbnN0cnVjdG9yIHRvIHByb3Blcmx5IGxvb2sgZm9yIGZmaXR5cGUgdHlwZW1hcAoJICAgIGJpbmRpbmdzLiBmaXggaW5vdXRfdHlwZW1hcHMuaSBmb3Igc3RyaW5ncy4KCjA2LzA2LzIwMDc6IG9sbHkKCSAgICBbUnVieV0KCSAgICBVc2Ugd2hpY2hldmVyIG9mICJsb25nIiBvciAibG9uZyBsb25nIiBpcyB0aGUgc2FtZSBzaXplIGFzICJ2b2lkKiIKCSAgICB0byBob2xkIHBvaW50ZXJzIGFzIGludGVnZXJzLCByYXRoZXIgdGhhbiB3aGljaGV2ZXIgbWF0Y2hlcyBvZmZfdC4KCSAgICBGaXhlcyBjb21waWxhdGlvbiBvbiBPUyBYIGFuZCBHQ0Mgd2FybmluZ3Mgb24gcGxhdGZvcm1zIHdoZXJlCgkgICAgc2l6ZW9mKHZvaWQqKSA8IHNpemVvZihvZmZfdCkgKFNGIHBhdGNoICMxNzMxOTc5KS4KCjA2LzA2LzIwMDc6IG9sbHkKCSAgICBbUEhQNV0KCSAgICBGaXggaGFuZGxpbmcgb2YgYSBwYXJ0aWN1bGFyIGNhc2UgaW52b2x2aW5nIG92ZXJsb2FkZWQgZnVuY3Rpb25zCgkgICAgd2l0aCBkZWZhdWx0IHBhcmFtZXRlcnMuCgowNi8wNS8yMDA3OiBtdXRhbmRpeiAoTWlrZWwgQmFuY3JvZnQpCgkgICAgW2FsbGVncm9jbF0KCSAgICBGaXggY2FzZSB3aGVyZSB3ZSdkIHBhc3MgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXJzCgkgICAgKGkuZS4gTlMxOjpOUzI6OkZPTykgdG8gc3dpZy1pbnNlcnQtaWQuIEFsbCBuYW1lc3BhY2VzCgkgICAgc2hvdWxkIGJlIHN0cmlwcGVkLgoKCSAgICBGaXggYnVnIGluIFR5cGVkZWZIYW5kbGVyIGludHJvZHVjZWQgYnkgbGFzdCBmaXguCgowNi8wNS8yMDA3OiBvbGx5CgkgICAgRml4IHJlcG9ydGluZyBvZiBmaWxlbmFtZXMgaW4gZXJyb3JzIGFmdGVyICVpbmNsdWRlIChwYXRjaCBmcm9tCgkgICAgTGVpZ2ggU21pdGggaW4gIzE3MzEwNDA7IGFsc28gcmVwb3J0ZWQgYXMgIzE2OTk5NDApLgoKMDUvMzEvMjAwNzogb2xseQoJICAgIFtQeXRob25dCgkgICAgRml4ICJtaXNzaW5nIGluaXRpYWxpc2VyIiB3YXJuaW5nIHdoZW4gY29tcGlsaW5nIGdlbmVyYXRlZCBDL0MrKwoJICAgIHdyYXBwZXIgY29kZSB3aXRoIFB5dGhvbiAyLjUgd2l0aCB3YXJuaW5ncyBlbmFibGVkIChwYXRjaCBmcm9tCgkgICAgYnVnIzE3Mjc2NjggZnJvbSBMdWtlIE1vb3JlKS4KCjA1LzI5LzIwMDc6IG9sbHkKCSAgICBbUHl0aG9uXQoJICAgIFNwbGl0IGRvY3N0cmluZ3MgaW50byBzZXBhcmF0ZSBzdHJpbmcgbGl0ZXJhbHMgYXQgZWFjaCBuZXdsaW5lIHdoZW4KCSAgICBnZW5lcmF0aW5nIEMvQysrIHdyYXBwZXIgY29kZSAodGhlIEMvQysrIGNvbXBpbGVyIHdpbGwganVzdCBjb21iaW5lCgkgICAgdGhlbSBiYWNrIGludG8gYSBzaW5nbGUgc3RyaW5nIGxpdGVyYWwpLiAgVGhpcyBhdm9pZHMgTVNWQwoJICAgIGNvbXBsYWluaW5nIHRoYXQgdGhlIHN0cmluZ3MgYXJlIHRvbyBsb25nIChwcm9ibGVtIHJlcG9ydGVkIGJ5CgkgICAgQm8gUGVuZyBvbiB0aGUgbWFpbGluZyBsaXN0KS4KCjA1LzI4LzIwMDc6IG9sbHkKCSAgICBbUHl0aG9uXQoJICAgIEVzY2FwZSBiYWNrc2xhc2hlcyBpbiBkb2NzdHJpbmdzLgoKMDUvMjYvMjAwNzogb2xseQoJICAgIFtQeXRob25dCgkgICAgRml4IGF1dG9kb2MgZ2VuZXJhdGlvbiBvZiBlbnVtcyB0byBiZSBtb3JlIGNvbnNpc3RlbnQgd2l0aCBob3cgdGhlCgkgICAgZW51bXMgYXJlIHdyYXBwZWQgLSBwYXRjaCAjMTY5NzIyNiBmcm9tIEpvc2ggQ2hlcnJ5LgoKMDUvMjYvMjAwNzogb2xseQoJICAgIFtQSFA1XQoJICAgIEZpeCB3cmFwcGluZyBvZiBtZXRob2RzIGFuZCBmdW5jdGlvbnMgd2hpY2ggcmV0dXJuIGEgcG9pbnRlciB0byBhCgkgICAgY2xhc3MgKGJ1ZyMxNzAwNzg4KSBhbmQgdGhvc2Ugd2hpY2ggaGF2ZSBvdmVybG9hZGVkIGZvcm1zIHJldHVybmluZwoJICAgIGJvdGggY2xhc3NlcyBhbmQgbm9uLWNsYXNzZXMgKGJ1ZyMxNzEyNzE3LCB0aGFua3MgdG8gU2ltb24KCSAgICBCZXJ0aGlhdW1lIGZvciB0aGUgcGF0Y2gpLgoKMDUvMjUvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgRml4ZWQgJXJlbmFtZSBpbmNvbnNpc3RlbmN5IGluIGNvbnZlcnNpb24gb3BlcmF0b3JzIGFzIHJlcG9ydGVkIGJ5IFpob25nIFJlbi4gVGhlIG1hdGNoaW5nCiAgICAgICAgICAgIGlzIG5vdyBkb25lIG9uIHRoZSBvcGVyYXRvciBuYW1lIGluIHRoZSBzYW1lIHdheSBhcyBpdCBpcyBkb25lIGZvciBwYXJhbWV0ZXJzLiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgJXJlbmFtZShvcEFCQykgU3BhY2U6OkFCQzo6b3BlcmF0b3IgQUJDKCkgY29uc3Q7CiAgICAgICAgICAgICAgJXJlbmFtZShtZXRob2RBQkMpIFNwYWNlOjpBQkM6Om1ldGhvZChBQkMgYSkgY29uc3Q7CiAgICAgICAgICAgICAgbmFtZXNwYWNlIFNwYWNlIHsKICAgICAgICAgICAgICAgIGNsYXNzIEFCQyB7CiAgICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICB2b2lkIG1ldGhvZChBQkMgYSkgY29uc3Qge30KICAgICAgICAgICAgICAgICAgICBvcGVyYXRvciBBQkMoKSBjb25zdCB7IEFCQyBhOyByZXR1cm4gYTsgfQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICB9CgogICAgICAgICAgICBOb3RlIHRoYXQgcXVhbGlmeWluZyB0aGUgY29udmVyc2lvbiBvcGVyYXRvciBwcmV2aW91c2x5IG1heSBvciBtYXkgbm90IGhhdmUgbWF0Y2hlZC4KICAgICAgICAgICAgTm93IGl0IGRlZmluaXRlbHkgd29uJ3QsIHNvIHRoaXMgd2lsbCBub3QgbWF0Y2g6CgogICAgICAgICAgICAgICVyZW5hbWUob3BBQkMpIFNwYWNlOjpBQkM6Om9wZXJhdG9yIFNwYWNlOjpBQkMoKSBjb25zdDsKCiAgICAgICAgICAgIGluIHRoZSBzYW1lIHdheSB0aGF0IHRoaXMgZG9lcyBub3QgbWF0Y2g6CgogICAgICAgICAgICAgICVyZW5hbWUobWV0aG9kQUJDKSBTcGFjZTo6QUJDOjptZXRob2QoU3BhY2U6OkFCQyBhKSBjb25zdDsKCiAgICAgICAgICAgIFRoZSBkb2N1bWVudGF0aW9uIGhhcyBiZWVuIGltcHJvdmVkIHdpdGggcmVzcGVjdCB0byAlcmVuYW1lLCBuYW1lc3BhY2VzIGFuZCB0ZW1wbGF0ZXMuCiAgICAgICAgICAgIENvbnZlcnNpb24gb3BlcmF0b3JzIGRvY3VtZW50YXRpb24gdG9vLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgowNS8xNi8yMDA3OiBtdXRhbmRpegoJICAgIFthbGxlZ3JvY2xdCgkgICAgRml4IGJhZCBnZW5lcmF0aW9uIG9mIGxvY2FsIHZhciBsdHlwZSdzIGluIGZ1bmN0aW9uV3JhcHBlcigpLgoJICAgIFRyeSB0byB3b3JrIGJldHRlciB3aXRoIHRoZSBiYWNrd2FyZCBvcmRlciBpbiB3aGljaCBzd2lnCgkgICAgdW5yb2xscyBuZXN0ZWQgY2xhc3MgZGVmaW5pdGlvbnMuCgkgICAgY2xlYW5lZCB1cCBhIGxpdHRsZSB1bm5lY2Vzc2FyeSBjb2RlL2RlYnVnIHByaW50ZidzLgoJICAgIFJlbW92ZSB3YXJuaW5nIHdoZW4gcmVwbGFjaW5nICRsZGVzdHJ1Y3RvciBmb3IgZmY6Zm9yZWlnbi1wb2ludGVyCgowNS8xMi8yMDA3OiBvbGx5CgkgICAgW1B5dGhvbl0KCSAgICBzd2lnIC1weXRob24gLXRocmVhZHMgbm93IGdlbmVyYXRlcyBDL0MrKyBjb2RlIHdoaWNoIHVzZXMgUHl0aG9uJ3MKCSAgICBvd24gdGhyZWFkaW5nIGFic3RyYWN0aW9uIChmcm9tIHB5dGhyZWFkLmgpIHJhdGhlciB0aGFuIE9TIHNwZWNpZmljCgkgICAgY29kZS4gIFRoZSBvbGQgY29kZSBmYWlsZWQgdG8gY29tcGlsZSBvbiBNUyBXaW5kb3dzLiAgKFNlZSBTRiBwYXRjaAoJICAgIHRyYWNrZXIgIzE3MTAzNDEpLgoKMDUvMDQvMjAwNzogZ2dhCgkgICAgW1J1YnldCgkgICAgQ2hhbmdlZCBTVEwgcmVuYW1lcyB0byBiZSBnbG9iYWwgcmVuYW1lcy4gIFRoaXMgZml4ZXMKCSAgICBTVEwgZnVuY3Rpb25zIG5vdCBiZWluZyByZW5hbWVkIHdoZW4gYXV0b3JlbmFtZSBpcyBvbi4KICAgICAgICAgICAgVGhpcyBpcyBhIG5vdCBhIHRvdGFsbHkgcGVyZmVjdCB3b3JrLWFyb3VuZCwgYnV0IGJldHRlci4KCSAgICBTb21lb25lIHJlYWxseSBuZWVkcyB0byBmaXggdGhlIHRlbXBsYXRlIHJlbmFtaW5nIGNvZGUuCgkgICAgKFNlZSBidWcgIzE1NDU2MzQpCgowNS8wNC8yMDA3ICBnZ2EKCSAgICBbQWxsXQogICAgICAgICAgICBDaGFuZ2VkICVyZW5hbWUoIiUodW5kZXJjYXNlKXMiKSBhIGxpdHRsZSBzbyB0aGF0IHNpbmdsZQoJICAgIG51bWJlcnMgYXQgdGhlIGVuZCBvZiBhIGZ1bmN0aW9uIGFyZSBub3QgdW5kZXJjYXNlZC4gIFRoYXQgaXM6CgkJZ2V0U29tZXRoaW5nIC0+IGdldF9zb21ldGhpbmcKCQlnZXQyRAkgICAgIC0+IGdldF8yZAoJCWdldDIzNAkgICAgIC0+IGdldF8yMzQKCSAgICBCVVQ6CgkJYXNGbG9hdDIgICAgIC0+IGFzX2Zsb2F0MgoJICAgIChCdWcgIzE2OTk3MTQpCgowNS8wMy8yMDA3OiBnZ2EKCSAgICBbUnVieV0KCSAgICBNYWRlIF9fc3dpZ3R5cGVfXyA9PiBAX19zd2lndHlwZV9fIHNvIGl0IGNhbiBiZSBhY2Nlc3NlZAoJICAgIGZyb20gdGhlIHNjcmlwdGluZyBsYW5ndWFnZSAoYW5kIGZvbGxvd3MgUnVieSdzIG9mZmljaWFsCiAgICAgICAgICAgIGRvY3VtZW50YXRpb24sIGp1c3QgaW4gY2FzZSkuCgkgICAgTWFkZSB0cmFja2luZyA9PiBAX190cmFja2luZ3NfXyBmb3Igc2FtZSByZWFzb24uCgkgICAgQ3VycmVudGx5IHN0b3JpbmcgaXZhcnMgd2l0aG91dCB0aGUgQCBzZWVtcyB2YWxpZCwgYnV0CgkgICAgdGhlIFBpY2tBeGUgc2F5cyB0aGlzIGlzIG5vdCBjb3JyZWN0LCBzbyBqdXN0IGluIGNhc2UuLi4KCjA1LzAzLzIwMDc6IGdnYQoJICAgIFtSdWJ5XQoJICAgIEFwcGxpZWQgcGF0Y2ggZm9yIC1taW5oZXJpdCBidWcgYW5kIGV4Y2VwdGlvbiBjbGFzc2VzLgoJICAgIFRoaXMgaXNzdWUgc2hvdWxkIGJlIHJldmlzaXRlZCBtb3JlIGNsb3NlbHksIGFzIE11bHRpcGxlCgkgICAgSW5oZXJpdGFuY2UgaW4gUnVieSBpcyBzdGlsbCBwcm9ibGVtYXRpYy4KCSAgICAocGF0Y2gvYnVnICMxNjA0ODc4KQoKMDUvMDMvMjAwNzogZ2dhCgkgICAgW1J1YnldCgkgICAgT3ZlcmxvYWRlZCBmdW5jdGlvbnMgaW4gcnVieSB3aWxsIG5vdyByZXBvcnQgdG8gdGhlIHVzZXIKICAgICAgICAgICAgdGhlIHBvc3NpYmxlIHByb3RvdHlwZXMgd2hlbiB0aGUgdXNlciBtaXN0eXBlcyB0aGUgbnVtYmVyIG9yCiAgICAgICAgICAgIHR5cGUgb2YgYSBwYXJhbWV0ZXIuCgowNS8wMy8yMDA3OiBnZ2EKCSAgICBbUnVieV0KCSAgICBGb3Jnb3QgdG8gZG9jdW1lbnQgdGhlIGJ1ZyBmaXhpbmcgb2YgYW4gb2xkIGJ1ZyByZWdhcmRpbmcKCSAgICBleGNlcHRpb25zLgoJICAgIChidWcgIzE0NTgyNDcpCgowNS8wMy8yMDA3OiBnZ2EKCSAgICBbUnVieV0KCSAgICBGaXhlZCBSdWJ5IGRvY3VtZW50YXRpb24gdG8gdXNlIHRoZSBwcm9wZXIgY3NzIHN0eWxlcyBmb3IKCSAgICBlYWNoIHNlY3Rpb24uIEFkZGVkIGF1dG9kb2Mgc2VjdGlvbiB0byBSdWJ5J3MgZG9jcyB0bwoJICAgIGRvY3VtZW50IHRoZSBmZWF0dXJlcyBzdXBwb3J0ZWQgYnkgUnVieSBpbiBkb2N1bWVudGluZyBpdHMgbW9kdWxlcy4KCSAgICBNYWRlIHJkb2MgZG9jdW1lbnRhdGlvbiBzcGl0IG91dCB0aGUgZnVsbCBuYW1lIG9mIHRoZSBjbGFzcyArCgkgICAgbWV0aG9kIG5hbWUuICBBbGJlaXQgdGhpcyB3aWxsIG1ha2UgdGhlIGN1cnJlbnQgcmRvYyBub3QgcmVjb2duaXplCiAgICAgICAgICAgIHRoZSBtZXRob2QsIHRoaXMgaXMgc3RpbGwgbmVlZGVkIHRvIGRpc2FtYmlndWF0ZSBiZXR3ZWVuIGRpZmZlcmVudAogICAgICAgICAgICBjbGFzc2VzIHdpdGggc2ltaWxhciBtZXRob2RzIChyZG9jIHdhcyBjcmVhdGVkIHRvIGRvY3VtZW50IHRoZQoJICAgIHJ1Ynkgc291cmNlIHdoaWNoIG9ubHkgY29udGFpbnMgb25lIGNsYXNzIHBlciBjIGZpbGUsIHVubGlrZSBzd2lnKQogICAgICAgICAgICBJIGhhdmUgcGF0Y2hlZCByZG9jIHRvIG1ha2UgaXQgbW9yZSBmcmllbmRseSB0byBzd2lnLiAgVGhpcwogICAgICAgICAgICBwYXRjaCBuZWVkcyB0byBiZSBtZXJnZWQgaW4gdGhlIHJ1Ynkgc3RkIGxpYnJhcnkgbm93LgoKMDUvMDMvMjAwNzogZ2dhCgkgICAgW1J1YnldCgkgICAgQ2hhbmdlZCBmbGFnIC1mZWF0dXJlIHRvIGJlIC1pbml0X25hbWUgdG8gYmV0dGVyIHJlZmxlY3QgaXRzCgkgICAgcHVycG9zZSBhbmQgYXZvaWQgY29uZnVzaW9uIHdpdGggLWZlYXR1cmVzLgoKMDUvMDMvMjAwNzogZ2dhCgkgICAgW1J1YnldCgkgICAgSW1wcm92ZWQgYXV0b2RvYyBnZW5lcmF0aW9uLgoJICAgIEFkZGVkIGF1dG9kb2MgLnN3ZyBmaWxlcyB0byBSdWJ5IGxpYnJhcnkgZm9yIGVhc2lseSBhZGRpbmcKCSAgICBkb2N1bWVudGF0aW9uIHRvIGNvbW1vbiBSdWJ5IG1ldGhvZHMgYW5kIFNUTCBtZXRob2RzLgoJICAgIEZpeGVkIGF1dG9kb2MgZG9jdW1lbnRpbmcgb2YgZ2V0dGVycyBhbmQgc2V0dGVycyBhbmQgbW9kdWxlLgoJICAgIE1hZGUgdGVzdCBzdWl0ZSBhbHdheXMgZ2VuZXJhdGUgYXV0b2RvY3MuCgowNS8wMy8yMDA3OiBnZ2EKCSAgICBbUnVieV0KCSAgICBSZW1vdmVkIHNvbWUgd2FybmluZ3MgZnJvbSBTVEwgYW5kIHRlc3Qgc3VpdGUuCgowNS8wMi8yMDA3OiBtZ29zc2FnZQogICAgICAgICAgICBbTHVhXSBGaXhlZCBpc3N1ZXMgd2l0aCBDKysgY2xhc3NlcyBhbmQgaGllcmFjaGllcyBhY3Jvc3MgbXVsdGlwbGUKCSAgICBzb3VyY2UgZmlsZXMuIEZpeGVkIGltcG9ydHMgdGVzdCBjYXNlICYgYWRkZWQgcnVuIHRlc3QuCgkgICAgQWRkZWQgRXhhbXBsZXMvaW1wb3J0cy4KCSAgICBBZGRlZCB0eXBlbmFtZSBmb3IgcmF3IGx1YV9TdGF0ZSoKCSAgICBBZGRlZCBkb2N1bWVudGF0aW9uIG9uIG5hdGl2ZSBmdW5jdGlvbnMuCgowNS8wMi8yMDA3OiBnZ2EKCSAgICBbUnVieV0KCSAgICBEb2NzdHJpbmdzIGFyZSBub3cgc3VwcG9ydGVkLgoJICAgICVmZWF0dXJlKCJhdXRvZG9jIikgYW5kICVmZWF0dXJlKCJkb2NzdHJpbmciKSBhcmUgbm93CgkgICAgcHJvcGVybHkgc3VwcG9ydGVkIGluIFJ1YnkuICBUaGVzZSBmZWF0dXJlcyB3aWxsIGdlbmVyYXRlCgkgICAgYSBfd3JhcC5jeHggZmlsZSB3aXRoIHJkb2MgY29tbWVudHMgaW4gdGhlbS4KCjA1LzAyLzIwMDc6IGdnYQoJICAgIFtSdWJ5XQoJICAgIFNUTCBmaWxlcyBoYXZlIGJlZW4gdXBncmFkZWQgdG8gZm9sbG93IHRoZSBuZXcgc3dpZy9weXRob24KCSAgICBMaWIvc3RkIGNvbnZlbnRpb25zLgoJICAgIFRoaXMgbWVhbnMgc3RkOjp2ZWN0b3IsIHN0ZDo6c2V0LCBzdGQ6Om1hcCwgc2V0OjptdWx0aW1hcCwKCSAgICBzdGQ6Om11bHRpc2V0LCBzdGQ6OmRlcXVlIGFuZCBzdGQ6OnN0cmluZyBhcmUgbm93IHByb3Blcmx5CgkgICAgc3VwcG9ydGVkLCBpbmNsdWRpbmcgdGhlaXIgaXRlcmF0b3JzLCBzdXBwb3J0IGZvciBjb250YWluaW5nCgkgICAgcnVieSBvYmplY3RzIChzd2lnOjpHQ19WQUxVRSkgYW5kIHNldmVyYWwgb3RoZXIgcnVieQoJICAgIGVuaGFuY2VtZW50cy4KCSAgICBzdGQ6OmNvbXBsZXgsIHN0ZDo6aW9zLCBzdGQ6Omlvc3RyZWFtLCBzdGQ6Omlvc3RyZWFtYnVmIGFuZAoJICAgIHN0ZDo6c3N0cmVhbSBhcmUgbm93IGFsc28gc3VwcG9ydGVkLgoJICAgIHN0ZDo6d3N0cmluZywgc3RkOjp3aW9zLCBzdGQ6Ondpb3N0cmVhbSwgc3RkOjp3aW9zdHJlYW1idWYKCSAgICBhbmQgc3RkOjp3c3N0cmVhbSBhcmUgc3VwcG9ydGVkIHZlcmJhdGltIHdpdGggbm8gdW5pY29kZQoJICAgIGNvbnZlcnNpb24uCgoJICAgIHN0ZF92ZWN0b3IuaSBub3cgbWltaWNzIHRoZSBiZWhhdmlvciBvZiBSdWJ5IEFycmF5cyBtdWNoIG1vcmUKCSAgICBjbG9zZWx5LCBzdXBwb3J0aW5nIHNsaWNpbmcsIHNoaWZ0aW5nLCB1bnNoaWZ0aW5nLAogICAgICAgICAgICBtdWx0aXBsZSBpbmRleGluZyBhbmQgcHJvcGVyIHJldHVybiB2YWx1ZXMgb24gYXNzaWdubWVudC4KCgkgICAgQ09NUEFUQUJJTElUWSBOT1RFOiB0aGlzIGNoYW5nZXMgdGhlIG9sZGVyIGFwaSBhIGxpdHRsZSBiaXQgaW4KCSAgICB0aGF0IGltcHJvcGVyIGluZGV4aW5nIHdvdWxkIHByZXZpb3VzbHkgKGluY29ycmVjdGx5KSByYWlzZQoJICAgIGV4Y2VwdGlvbnMuICBOb3csIG5pbCBpcyByZXR1cm5lZCBpbnN0ZWFkLCBmb2xsb3dpbmcgcnVieSdzCgkgICAgc3RhbmRhcmQgQXJyYXkgYmVoYXZpb3IuCgowNS8wMi8yMDA3OiBnZ2EKCSAgICBbUnVieV0KCSAgICBDaGFuZ2VkIHRoZSB2YWx1ZSBvZiBTV0lHX1RZUEVDSEVDS19CT09MIHRvIGJlIDEwMDAwIChpZS4gaGlnaGVyCgkgICAgdGhhbiB0aGF0IG9mIGFsbCBpbnRlZ2VycykuCgkgICAgVGhpcyBpcyBiZWNhdXNlIFJ1YnkgYWxsb3dzIHR5cGVjYXN0aW5nCgkgICAgaW50ZWdlcnMgZG93biB0byBib29sZWFucyB3aGljaCBjYW4gbWFrZSBvdmVybG9hZGVkIGZ1bmN0aW9ucyBvbgoJICAgIGJvb2xzIGFuZCBpbnRlZ2VycyB0byBmYWlsLgoJICAgIChidWcjIDE0ODgxNDIpCgowNS8wMi8yMDA3OiBnZ2EKCSAgICBbUnVieV0KCSAgICBGaXhlZCBhIHN1YnRsZSBidWcgaW4gbXVsdGlwbGUgYXJnb3V0cyB0aGF0IGNvdWxkIGdldCB0cmlnZ2VyZWQgaWYKCSAgICB0aGUgdXNlciByZXR1cm5lZCB0d28gb3IgbW9yZSBhcmd1bWVudHMgYW5kIHRoZSBmaXJzdCBvbmUgd2FzIGFuCgkgICAgYXJyYXkuCgowNS8wMS8yMDA3OiBnZ2EKCSAgICBbUnVieV0KCSAgICBJbXByb3ZlZCB0aGUgZG9jdW1lbnRhdGlvbiB0byBkb2N1bWVudCB0aGUgbmV3IGZlYXR1cmVzCiAgICAgICAgICAgIGFkZGVkLCBhZGQgZGlyZWN0b3Jpbi9vdXQvYXJnb3V0IHR5cGVtYXBzLCBldGMuCgowNS8wMS8yMDA3OiBnZ2EKCSAgICBbUnVieV0KCSAgICBBZGRlZCAlaW5pdHN0YWNrIGFuZCAlaWdub3Jlc3RhY2sgZGlyZWN0aXZlcyBmb3IgZGlyZWN0b3IKCSAgICBmdW5jdGlvbnMuICBUaGVzZSBhbGxvdyB5b3UgdG8gY29udHJvbCB3aGV0aGVyIGEgZGlyZWN0b3IKCSAgICBmdW5jdGlvbiBzaG91bGQgcmUtaW5pdCB0aGUgUnVieSBzdGFjay4KCSAgICBUaGlzIGlzIHNvbWV0aW1lcyBuZWVkZWQgZm9yIGFuIGVtYmVkZGVkIFJ1Ynkgd2hlcmUgdGhlCgkgICAgZGlyZWN0b3IgbWV0aG9kIGlzIHVzZWQgYXMgYSBDKysgY2FsbGJhY2sgYW5kIG5vdCBjYWxsZWQKICAgICAgICAgICAgYnkgdGhlIHVzZXIgZnJvbSBydWJ5IGNvZGUuCgkgICAgRXhwbGFuYXRpb246CgkgICAgUnVieSdzIEdDIG5lZWRzIHRvIGJlIGF3YXJlIG9mIHRoZSBydW5uaW5nIE9TIHN0YWNrIGluIG9yZGVyIHRvCgkgICAgbWFyayBhbnkgVkFMVUUgKFJ1Ynkgb2JqZWN0cykgaXQgZmluZHMgdGhlcmUgdG8gYXZvaWQgY29sbGVjdGlvbgoJICAgIG9mIHRoZW0uICBUaGlzIGFsbG93cyB0aGUgcnVieSBBUEkgdG8gYmUgdmVyeSBzaW1wbGUgYW5kIGFsbG93cwoJICAgIHlvdSB0byB3cml0ZSBjb2RlIGxpa2UgIlZBTFVFIGEgPSBzdGgiIGFueXdoZXJlIHdpdGhvdXQgbmVlZGluZwoJICAgIHRvIGRvIHRoaW5ncyBsaWtlIHJlZmNvdW50aW5nIGxpa2UgcHl0aG9uLgoJICAgIEJ5IGRlZmF1bHQsIHRoZSBzdGFydCBvZiB0aGUgc3RhY2sgaXMgc2V0IHdoZW4gcnVieV9pbml0KCkgaXMKCSAgICBjYWxsZWQuICAgSWYgcnVieSBpcyBpbml0ZWQgd2l0aGluIG1haW4oKSwgYXMgaXQgdXN1YWxseSBpcyB0aGUKCSAgICBjYXNlIHdpdGggdGhlIG1haW4gcnVieSBleGVjdXRhYmxlLCBydWJ5IHdpbGwgYmUgYWJsZSB0byBjYWxjdWxhdGUKCSAgICBpdHMgc3RhY2sgcHJvcGVybHkuICBIb3dldmVyLCB3aGVuIHRoaXMgaXMgbm90IHBvc3NpYmxlLCBhcyB3aGVuCgkgICAgcnVieSBpcyBlbWJlZGRlZCBhcyBhIHBsdWdpbiB0byBhbiBhcHBsaWNhdGlvbiB3aGVyZSBtYWluIGlzIG5vdAoJICAgIGF2YWlsYWJsZSwgcnVieV9pbml0KCkgd2lsbCBiZSBjYWxsZWQgaW4gdGhlIHdyb25nIHBsYWNlLCBhbmQKCSAgICBydWJ5IHdpbGwgYmUgaW5jb3JyZWN0bHkgdHJhY2tpbmcgdGhlIHN0YWNrIGZyb20gdGhlIGZ1bmN0aW9uCgkgICAgdGhhdCBjYWxsZWQgcnVieV9pbml0KCkgZm9yd2FyZHMgb25seSwgd2hpY2ggY2FuIGxlYWQgdG8KCSAgICBhbGwgc29ydHMgb2Ygd2VpcmQgY3Jhc2hlcyBvciB0byBydWJ5IHRoaW5raW5nIGl0IGhhcyBydW4gb3V0IG9mCgkgICAgc3RhY2sgc3BhY2UgaW5jb3JyZWN0bHkuCgkgICAgVG8gYXZvaWQgdGhpcywgZGlyZWN0b3IgKGNhbGxiYWNrKSBmdW5jdGlvbnMgY2FuIG5vdyBiZSB0YWdnZWQKCSAgICB0byB0cnkgdG8gcmVzZXQgdGhlIHJ1Ynkgc3RhY2ssIHdoaWNoIHdpbGwgc29sdmUgdGhlIGlzc3Vlcy4KCSAgICBOT1RFOiBydWJ5MS44LjYgc3RpbGwgY29udGFpbnMgYSBidWcgaW4gaXQgaW4gdGhhdCBpdHMgZnVuY3Rpb24KCSAgICB0byByZXNldCB0aGUgc3RhY2sgd2lsbCBub3QgYWx3YXlzIGRvIHNvLiAgVGhpcyBidWcgaXMgdHJpZ2dlcmVkCgkgICAgdmVyeSByYXJlbHksIHdoZW4gcnVieSBpcyBjYWxsZWQgZnJvbSB0d28gdmVyeSBkaXN0aW5jdCBwbGFjZXMKCSAgICBpbiBtZW1vcnksIGxpa2UgYSBicmFuY2ggb2YgbWFpbigpIGFuZCBhbm90aGVyIGRzby4gIFRoaXMgYnVnCgkgICAgaGFzIG5vdyBiZWVuIHJlcG9ydGVkIHRvIHJ1YnktY29yZSBhbmQgaXMgcGVuZGluZyBmdXJ0aGVyCgkgICAgaW52ZXN0aWdhdGlvbi4KCSAgICAoYnVnICMxNzAwNTM1IGFuZCBwYXRjaCAjMTcwMjkwNykKCjA0LzMwLzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjMTcwNzU4MiAtIFJlc3RvcmUgYnVpbGRpbmcgZnJvbSByZWFkLW9ubHkgc291cmNlIGRpcmVjdG9yaWVzLgoKMDQvMzAvMjAwNzogZ2dhCgkgICAgW1J1YnldCgkgICAgUnVieSB3aWxsIG5vdyByZXBvcnQgdGhlIHBhcmFtZXRlciBpbmRleCBwcm9wZXJseSBvbiB0eXBlCgkgICAgZXJyb3JzIGFzIHdlbGwgYXMgdGhlIGNsYXNzIGFuZCB2YWx1ZSBvZiB0aGUgaW5jb3JyZWN0CgkgICAgYXJndW1lbnQgcGFzc2VkLgoJICAgIChmZWF0dXJlIHJlcXVlc3QgIzE2OTk2NzApCgowNC8zMC8yMDA3OiBnZ2EKCSAgICBbUnVieV0KCSAgICBSdWJ5IG5vIGxvbmdlciBjcmVhdGVzIHRoZSBmcmVlX0NsYXNzIGZ1bmN0aW9uIGlmIHRoZSBjbGFzcwoJICAgIGNvbnRhaW5zIGl0cyBvd24gdXNlciBkZWZpbmVkIGZyZWUgZnVuY3Rpb24gKCVmcmVlZnVuYykuCgkgICAgKGJ1ZyAjMTcwMjg4MikKCjA0LzMwLzIwMDc6IGdnYQoJICAgIFtSdWJ5XQoJICAgIE1hZGUgZGlyZWN0b3JzIHJhaXNlIGEgcnVieSBleGNlcHRpb24gZm9yIGluY29ycmVjdCBhcmdvdXQKCSAgICByZXR1cm5lZCB2YWx1ZXMgaWYgUlVCWV9FTUJFRERFRCBpcyBzZXQsIGluc3RlYWQgb2YgdGhyb3dpbmcKCSAgICBhbiBhY3R1YWwgU3dpZ0RpcmVjdG9yIGV4Y2VwdGlvbi4KCSAgICBUaGlzIHdpbGwgcHJldmVudCBjcmFzaGVzIHdoZW4gcnVieSBpcyBlbWJlZGRlZCBhbmQgdW5hd2FyZQoJICAgIG9mIHRoZSBTd2lnRGlyZWN0b3IgZXhjZXB0aW9uLgoKMDQvMzAvMjAwNzogZ2dhCgkgICAgW1J1YnldCgkgICAgUmVtb3ZlZCB0aGUgbmVlZCBmb3IgLURTV0lHRVhURVJOLgoJICAgIENoYW5nZWQgc3dpZ19ydWJ5X3RyYWNraW5ncyB0byBiZSBhIHN0YXRpYyB2YXJpYWJsZSwgYnV0IGFsc28KCSAgICBiZSBrZXB0IHdpdGhpbiBhIGhpZGRlbiBpbnN0YW5jZSB2YXJpYWJsZSBpbiB0aGUgU1dJRyBtb2R1bGUuCgkgICAgVGhpcyBhbGxvd3MgcHJvcGVybHkgZGVhbGluZyB3aXRoIHRyYWNraW5ncyBhY3Jvc3MgbXVsdGlwbGUKCSAgICBEU09zLCB3aGljaCB3YXMgcHJldmlvdXNseSBicm9rZW4uCgkgICAgKGJ1ZyAjMTcwMDUzNSBhbmQgaW1wcm92ZW1lbnQgdG8gcGF0Y2ggIzE3MDI5MDcpCgowNC8yOS8yMDA3OiBnZ2EKCSAgICBbUnVieV0gRml4ZWQgR0MgbWVtb3J5IGlzc3VlcyB3aXRoIHRyYWNraW5ncyB0aGF0IGNvdWxkIGxlYWQKCSAgICB0byBzZWdmYXVsdHMgd2hlbiBkZWFsaW5nLCBtYWlubHksIHdpdGggc3RhdGljIHZhcmlhYmxlcy4KCSAgICAoYnVnICMxNzAwNTM1IGFuZCBwYXRjaCAjMTcwMjkwNykKCjA0LzI5LzIwMDc6IGdnYQoJICAgIFtSdWJ5XQoJICAgIEZpeGVkIFN0cmluZyBjb252ZXJzaW9uIHVzaW5nIG9sZCBydWJ5MS42IG1hY3Jvcy4gIE5vdwoJICAgIFN0cmluZ1ZhbHVlUHRyKCkgaXMgdXNlZCBpZiBhdmFpbGFibGUuICBUaGlzIHJlbW92ZXMgd2FybmluZ3MKCSAgICB3aGVuIGNvbnZlcnRpbmcgc3RyaW5ncyB3aXRoIFwwIGluIHRoZW0uCgkgICAgKGJ1ZyAjMTcwMDUzNSBhbmQgcGF0Y2ggIzE3MDI5MDcpCgowNC8yOS8yMDA3OiBnZ2EKCSAgICBbUnVieV0KCSAgICBGaXhlZCB0aGUgYXJnb3V0IGNvdW50IGluIGRpcmVjdG9ycyBmb3IgUnVieS4gIFByZXZpb3VzbHksCgkgICAgaWdub3JlZCBvciAibnVtaW5wdXRzPTAiIHR5cGVtYXBzIHdvdWxkIGluY29ycmVjdGx5IG5vdCBnZXQKCSAgICBjb3VudGVkIHRvd2FyZHMgdGhlIGFyZ291dCBjb3VudC4KCSAgICAoYnVnL3BhdGNoICMxNTQ1NTg1KQoKMDQvMjkvMjAwNzogZ2dhCgkgICAgW1J1YnldCgkgICAgVXBncmFkZWQgUnVieSBjb252ZXJ0ZXIgdG8gcmVjb2duaXplICJudW1pbnB1dHM9MCIuICBQcmV2aW91c2x5LAoJICAgIG9ubHkgdGhlIG9sZCAiaWdub3JlIiBmbGFnIHdhcyBjaGVja2VkICh3aGljaCB3b3VsZCBjdXJyZW50bHkKCSAgICBzdGlsbCB3b3JrIHByb3Blcmx5LCBidXQgaXMgZGVwcmVjYXRlZCkuCgowNC8yOS8yMDA3OiBnZ2EKCSAgICBbUnVieSAtIGJ1dCBzaG91bGQgYmUgbWFkZSBnZW5lcmljXQoKCSAgICAlZmVhdHVyZSgibnVtb3V0cHV0cyIsIjAiKSBhZGRlZC4KCgkgICAgVGhpcyBmZWF0dXJlIGFsbG93cyB5b3UgdG8gaWdub3JlIHRoZSBvdXRwdXQgb2YgYSBmdW5jdGlvbiBzbwoJICAgIHRoYXQgaXQgaXMgbm90IGFkZGVkIHRvIGEgbGlzdCBvZiBvdXRwdXQgdmFsdWVzCgkgICAgKCBpZS4gYXJnb3V0cyApLgoJICAgIFRoaXMgc2hvdWxkIGFsc28gYmVjb21lIGEgZmVhdHVyZSBvZiAldHlwZW1hcChkaXJlY3Rvcm91dCkKCSAgICBhcyAibnVtb3V0cHV0cyI9MCwganVzdCBsaWtlICJudW1pbnB1dHMiPTAgZXhpc3RzLgoKCSAgICAlZmVhdHVyZSgiZGlyZWN0b3JzIj0xKQoKCSAgICAlaW5jbHVkZSA8dHlwZW1hcHMuaT4KCgkgICAgJWZlYXR1cmUoIm51bW91dHB1dHMiLCIwIikgeyBDbGFzczo6bWVtYmVyX2Z1bmN0aW9uMSB9OwoJICAgICV0eXBlbWFwKG91dCkgTVN0YXR1cyB7IC8vIHNvbWUgY29kZSwgbGlrZSBjaGVjayBtc3RhdHVzCgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIHJhaXNlIGV4Y2VwdGlvbiBpZiB3cm9uZyB9OwoKCSAgICAlaW5saW5lICV7CgkgICAgICB0eXBlZGVmIGludCBNU3RhdHVzOwoJICAgICAgY2xhc3MgQ2xhc3MgewoKCSAgICAgIC8vIG9uZSBhcmd1bWVudCByZXR1cm5lZCwgYnV0IGRpcmVjdG9yIG91dCBjb2RlIGFkZGVkCgkgICAgICAvLyBNU3RhdHVzIGlzIGRpc2NhcmRlZCBhcyBhIHJldHVybiAob3V0KSBwYXJhbWV0ZXIuCgkgICAgICB2aXJ0dWFsIE1TdGF0dXMgbWVtYmVyX2Z1bmN0aW9uMSggaW50JiBPVVRQVVQgKTsKCgkgICAgICAvLyB0d28gYXJndW1lbnRzIHJldHVybmVkLCBkaXJlY3RvciBvdXQgY29kZSBhZGRlZAoJICAgICAgLy8gTVN0YXR1cyBpcyBub3QgZGlzY2FyZGVkCgkgICAgICB2aXJ0dWFsIE1TdGF0dXMgbWVtYmVyX2Z1bmN0aW9uMiggaW50JiBPVVRQVVQgKTsKCSAgICAgIH07CiAgICAgICAgICAgICV9CgoKMDQvMjEvMjAwNzogb2xseQoJICAgIEZpeCBwYXJzaW5nIG9mIGZsb2F0IGNvbnN0YW50cyB3aXRoIGFuIGV4cG9uZW50IChlLmcuIDFlLTAyZikKCSAgICAoYnVnICMxNjk5NjQ2KS4KCjA0LzIwLzIwMDc6IG9sbHkKCSAgICBbUHl0aG9uXSBGaXggbGFjayBvZiBnZW5lcmF0aW9uIG9mIGRvY3N0cmluZ3Mgd2hlbiAtTyBpcyB1c2VkLgoJICAgIEFsc28sIGZpeCBnZW5lcmF0aW9uIG9mIGRvY3N0cmluZ3MgY29udGFpbmluZyBhIGRvdWJsZSBxdW90ZQoJICAgIGNoYXJhY3Rlci4gIFBhdGNoIGZyb20gUmljaGFyZCBCb3VsdG9uIGluIGJ1ZyMxNzAwMTQ2LgoKMDQvMTcvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEsIEMjXSBTdXBwb3J0IGZvciBhZGRpbmcgaW4gSmF2YS9DIyBjb2RlIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIGludGVybWVkaWFyeSBjYWxsLAogICAgICAgICAgICBzcGVjaWZpY2FsbHkgcmVsYXRlZCB0byB0aGUgbWFyc2hhbGxpbmcgb2YgdGhlIHByb3h5IHR5cGUgdG8gdGhlIGludGVybWVkaWFyeSB0eXBlLgogICAgICAgICAgICBUaGUgamF2YWluL2NzaW4gdHlwZW1hcCBub3cgc3VwcG9ydHMgdGhlICdwcmUnIGFuZCAncG9zdCcgYXR0cmlidXRlcyB0byBhY2hpZXZlIHRoaXMuCiAgICAgICAgICAgIFRoZSBqYXZhaW4gdHlwZW1hcCBhbHNvIHN1cHBvcnRzIGFuIG9wdGlvbmFsICdwZ2NwcG5hbWUnIGF0dHJpYnV0ZSBmb3IgcHJlbWF0dXJlIGdhcmJhZ2UKICAgICAgICAgICAgY29sbGVjdGlvbiBwcmV2ZW50aW9uIHBhcmFtZXRlciBuYW1pbmcgYW5kIHRoZSBjc2luIHR5cGVtYXAgc3VwcG9ydHMgYW4gb3B0aW9uYWwgJ2NzaGluJwogICAgICAgICAgICBhdHRyaWJ1dGUgZm9yIHRoZSBwYXJhbWV0ZXIgdHlwZSB1c2VkIGluIGEgY29uc3RydWN0b3IgaGVscGVyIGdlbmVyYXRlZCB3aGVuIHRoZSB0eXBlIGlzIHVzZWQKICAgICAgICAgICAgaW4gYSBjb25zdHJ1Y3Rvci4gRGV0YWlscyBpbiB0aGUgSmF2YS5odG1sIGFuZCBDU2hhcnAuaHRtbCBkb2N1bWVudGF0aW9uLgoKMDQvMTYvMjAwNzogb2xseQoJICAgIERvbid0IHRyZWF0IGByZXN0cmljdCcgYXMgYSByZXNlcnZlZCBpZGVudGlmaWVyIGluIEMrKyBtb2RlCgkgICAgKGJ1ZyMxNjg1NTM0KS4KCjA0LzE2LzIwMDc6IG9sbHkKCSAgICBbUEhQNV0gRml4IGhvdyB6ZW5kX3Rocm93X2V4Y2VwdGlvbigpIGlzIGNhbGxlZCAoYnVnICMxNzAwNzg1KS4KCjA0LzEwLzIwMDc6IG9sbHkKCSAgICBEZWZpbmUgU1dJR1RFTVBMQVRFRElTQU1CSUdVQVRPUiB0byB0ZW1wbGF0ZSBmb3IgYUNDIChyZXBvcnRlZCBvbgoJICAgIHN3aWctdXNlciB0aGF0IHRoaXMgaXMgbmVlZGVkKS4KCjA0LzA0LzIwMDc6IG9sbHkKCSAgICBbUEhQNV0gSWYgWlRTIGlzIGVuYWJsZWQsIHJlbGVhc2UgPG1vZHVsZT5fZ2xvYmFsc19pZCBpbiBNU0hVVERPV04KCSAgICB0byBhdm9pZCBQSFAgaW50ZXJwcmV0ZXIgY3Jhc2ggb24gc2h1dGRvd24uICBUaGlzIHNvbHV0aW9uIHdhcwoJICAgIHN1Z2dlc3RlZCBoZXJlOiBodHRwOi8vYnVncy5waHAubmV0L2J1Zy5waHA/aWQ9NDA5ODUKCjA0LzAzLzIwMDc6IG9sbHkKCSAgICBbUEhQNF0gQWRkIG1pc3NpbmcgWlRTIGFubm90YXRpb25zIHRvIGdlbmVyYXRlZCBDKysgd3JhcHBlciBjb2RlCgkgICAgdG8gZml4IGNvbXBpbGF0aW9uIGZhaWx1cmVzIHdoZW4gdXNpbmcgWlRTIGVuYWJsZWQgU1dJRyAoTGludXgKCSAgICBkaXN0cmlidXRpb25zIHRlbmQgdG8gZGlzYWJsZSBaVFMsIGJ1dCBub3RhYmx5IHRoZSBXaW5kb3dzIGJ1aWxkCgkgICAgdXNlcyBpdCBieSBkZWZhdWx0KS4KCjA0LzAxLzIwMDc6IGVmdXp6eW9uZQogICAgICAgICAgICBbQ0ZGSV0gUGF0Y2ggIzE2ODQyNjE6IGZpeGVzIGhhbmRsaW5nIG9mIHVuc2lnbmVkIGludCBsaXRlcmFscywgdGhhbmtzIExlaWdoIFNtaXRoLgogICAgICAgICAgICBBbHNvLCBpbXByb3ZlZCBkb2N1bWVudGF0aW9uLgoKMDMvMzAvMjAwNzogb2xseQoJICAgIEF2b2lkIGdlbmVyYXRpbmcgJzw6JyB0b2tlbiB3aGVuIHVzaW5nIFN3aWdWYWx1ZVdyYXBwZXI8PiBvbiBhIHR5cGUKCSAgICB3aGljaCBzdGFydHMgd2l0aCAnOjonIChwYXRjaCAjMTY5MDk0OCkuCgowMy8yNS8yMDA3OiB3dXp6ZWIgKEpvaG4gTGVueikKCSAgICBbcGVybDVdIEFkZCBTV0lHX2ZhaWwgdG8gdGhlIFNXSUdfZXhjZXB0aW9uIG1hY3JvLiAgRml4ZXMgYSBmZXcgcHJvYmxlbXMgcmVwb3J0ZWQKCSAgICBvbiB0aGUgbWFpbGluZyBsaXN0LgoKMDMvMjMvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgU3RyaW5nIGNvcHlpbmcgcGF0Y2ggZnJvbSBKb3NoIENoZXJyeSByZWR1Y2luZyBtZW1vcnkgY29uc3VtcHRpb24gYnkgYWJvdXQgMjUlLgoKMDMvMjEvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEFwcGx5IHBhdGNoICMxNjMxOTg3IGZyb20gVWxyaWsgUGV0ZXJzb24gLSBib29sIElOT1VUIHR5cGVtYXBzCiAgICAgICAgICAgIGZhaWwgb24gYmlnIGVuZGlhbiBtYWNoaW5lcy4KCjAzLzE2LzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBzZWcgZmF1bHQgZ2l2ZW4gZG9kZ3kgQysrIGNvZGU6IG5hbWVzcGFjZSBhYmM6OmRlZiB7IH0KCjAzLzE2LzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBGaXhlcyBzbyB0aGF0IEFSUkFZU09GQ0xBU1NFUyBhbmQgQVJSQVlTT0ZFTlVNUyBpbiBhcnJheXNfamF2YS5pIGNhbiBiZSBhcHBsaWVkCiAgICAgICAgICAgIHRvIHBvaW50ZXIgdHlwZXMuCgowMy8wMy8yMDA3OiBvbGx5CgkgICAgW1BIUDVdIFdoZW4gd2Uga25vdyB0aGUgbGl0ZXJhbCBudW1lcmljIHZhbHVlIGZvciBhIGNvbnN0YW50LCB1c2UKCSAgICB0aGF0IHRvIGluaXRpYWxpc2UgdGhlIGNvbnN0IG1lbWJlciBpbiB0aGUgUEhQIHdyYXBwZXIgY2xhc3MuCgowMy8wMi8yMDA3OiBvbGx5CgkgICAgW1BIUDVdIEZpeCBQSFAgd3JhcHBlciBjb2RlIGdlbmVyYXRlZCBmb3IgY2VydGFpbiBjYXNlcyBvZgoJICAgIG92ZXJsb2FkZWQgZm9ybXMgd2l0aCBkZWZhdWx0IGFyZ3VtZW50cy4KCjAyLzI2LzIwMDc6IGVmdXp6eW9uZQogICAgICAgICAgICBbQ0ZGSV0gUGF0Y2ggIzE2NTYzOTU6IGZpeGVkIGhleCBhbmQgb2N0YWwgdmFsdWVzIGJ1ZywgdGhhbmtzIHRvIEFydGh1ciBTbXlsZXMuCgowMi8yMi8yMDA3OiBtZ29zc2FnZQogICAgICAgICAgICBbTHVhXSBGaXhlZCBidWcgaW4gdHlwZW1hcHMgd2hpY2ggY2F1c2VkIGRlcml2ZWRfYnl2YWx1ZSBhbmQgcm5hbWUgdGVzdCBjYXNlcyB0byBmYWlsLgoJICAgIFVwZGF0ZWQgZGVyaXZlZF9ieXZhbHVlLmkgdG8gZXhwbGFpbiBob3cgdG8gZmluZCBhbmQgZml4IHRoZSBwcm9ibGVtCgowMS8yNS8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzE1Mzg1MjIgYW5kICMxMzM4NTI3LCBmb3J3YXJkIHRlbXBsYXRlZCBjbGFzcyBkZWNsYXJhdGlvbnMgd2l0aG91dCBhCiAgICAgICAgICAgIG5hbWUgZm9yIHRoZSB0ZW1wbGF0ZWQgY2xhc3MgcGFyYW1ldGVycywgc3VjaCBhczoKCiAgICAgICAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lLCBjbGFzcz4gY2xhc3MgWDsKCjAxLzIzLzIwMDc6IG1nb3NzYWdlCiAgICAgICAgICAgIFtMdWFdIFBhdGNoICMxNjQwODYyOiA8bWFsbG9jLmg+IHJlcGxhY2VkIGJ5IDxzdGRsaWIuaD4KCSAgICBQYXRjaCAjMTU5ODA2MyBUeXBvIGluIHR5cGVtYXBzLmkKCjAxLzIyLzIwMDc6IG1nb3NzYWdlCiAgICAgICAgICAgIFtMdWFdIEFkZGVkIGEgbHVhIHNwZWNpZmljIGNhcnJheXMuaSB3aGljaCBhZGRzIHRoZSBvcGVyYXRvcltdIHN1cHBvcnQuCgkgICAgbW9kaWZpZWQgdGhlIG1haW4gY29kZSB0byBtYWtlIGl0IG5vdCBlbWl0IGFsbCB0aGUgY2xhc3MgbWVtYmVyIGZ1bmN0aW9ucyAmIGFjY2Vzc29ycwoJICAgIE5vdGU6IEMgc3RydWN0cyBhcmUgY3JlYXRlZCB1c2luZyBuZXdfWFhYKCkgd2hpbGUgQysrIGNsYXNzZXMgdXNlIFhYWCgpIChzaG91bGQgYmUgc3RhbmRhcmRpc2VkKQoJICAgIFVwZGF0ZWQgdGVzdCBjYXNlOiBsaV9jYXJyYXlzCgkgICAgVXBkYXRlZCB0aGUgZG9jdW1lbnRhdGlvbi4KCjAxLzEyLzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQaHBdIEFkZCBzdXBwb3J0IGZvciBuZXdmcmVlIHR5cGVtYXBzIChzb21ldGltZXMgdXNlZCBieSAlbmV3b2JqZWN0KQoKMDEvMTIvMjAwNzogYmVhemxleQogICAgICAgICAgICBOZXcgY29tbWFuZCBsaW5lIG9wdGlvbiAtbWFjcm9lcnJvcnMuICAgV2hlbiBzdXBwbGllZCwgdGhpcyB3aWxsIGZvcmNlCiAgICAgICAgICAgIHRoZSBDIHNjYW5uZXIvcGFyc2VyIHRvIHJlcG9ydCBwcm9wZXIgbG9jYXRpb24gaW5mb3JtYXRpb24gZm9yIGNvZGUgY29udGFpbmVkCiAgICAgICAgICAgIGluc2lkZSBTV0lHIG1hY3JvcyAoZGVmaW5lZCB3aXRoICVkZWZpbmUpLiAgQnkgZGVmYXVsdCwgU1dJRyBtZXJlbHkgcmVwb3J0cwogICAgICAgICAgICBlcnJvcnMgb24gdGhlIGxpbmUgYXQgd2hpY2ggYSBtYWNybyBpcyB1c2VkLiAgV2l0aCB0aGlzIG9wdGlvbiwgeW91CiAgICAgICAgICAgIGNhbiBleHBhbmQgdGhlIGVycm9yIGJhY2sgdG8gaXRzIHNvdXJjZS0tLXNvbWV0aGluZyB3aGljaCBtYXkgc2ltcGxpZnkKICAgICAgICAgICAgZGVidWdnaW5nLgoKMDEvMTIvMjAwNzogYmVhemxleQogICAgICAgICAgICBbSW50ZXJuYWxzXSBNYWpvciBvdmVyaGF1bCBvZiBDL0MrKyBzY2FubmluZyBpbXBsZW1lbnRhdGlvbi4gIEZvciBxdWl0ZQogICAgICAgICAgICBzb21lIHRpbWUsIFNXSUcgY29udGFpbmVkIHR3byBjb21wbGV0ZWx5IGluZGVwZW5kZW50IEMvQysrIHRva2VuaXplcnMtLQogICAgICAgICAgICB0aGUgbGVnYWN5IHNjYW5uZXIgaW4gQ1BhcnNlL2NzY2FubmVyLmMgYW5kIGEgZ2VuZXJhbCBwdXJwb3NlIHNjYW5uZXIKICAgICAgICAgICAgaW4gU3dpZy9zY2FubmVyLmMuIFNXSUcgc3RpbGwgaGFzIHR3byBzY2FubmluZyBtb2R1bGVzLCBidXQgdGhlIEMgcGFyc2VyCiAgICAgICAgICAgIHNjYW5uZXIgKENQYXJzZS9jc2Nhbm5lci5jKSBub3cgcmVsaWVzIHVwb24gdGhlIGdlbmVyYWwgcHVycG9zZQogICAgICAgICAgICBzY2FubmVyIGZvdW5kIGluIFN3aWcvc2Nhbm5lci5jLiAgQXMgYSByZXN1bHQsIGl0IGlzIG11Y2ggc21hbGxlciBhbmQKICAgICAgICAgICAgbGVzcyBjb21wbGljYXRlZC4gIFRoaXMgY2hhbmdlIGFsc28gbWFrZXMgaXQgcG9zc2libGUgdG8gbWFpbnRhaW4gYWxsCiAgICAgICAgICAgIG9mIHRoZSBsb3ctbGV2ZWwgQyB0b2tlbml6aW5nIGluIG9uZSBjZW50cmFsIGxvY2F0aW9uIGluc3RlYWQgb2YgdHdvCiAgICAgICAgICAgIHBsYWNlcyBhcyBiZWZvcmUuCgogICAgICAgICAgICAqKipQT1RFTlRJQUwgRkxBS0lORVNTKioqCiAgICAgICAgICAgIFRoaXMgY2hhbmdlIG1heSBjYXVzZSBwcm9ibGVtcyB3aXRoIGFjY3VyYXRlIGxpbmUgbnVtYmVyIHJlcG9ydGluZwogICAgICAgICAgICBhcyB3ZWxsIGFzIGVycm9yIHJlcG9ydGluZyBtb3JlIGdlbmVyYWxseS4gSSBoYXZlIHRyaWVkIHRvIHJlc29sdmUgdGhpcwogICAgICAgICAgICBhcyBtdWNoIGFzIHBvc3NpYmxlLCBidXQgdGhlcmUgbWlnaHQgYmUgc29tZSBjb3JuZXIgY2FzZXMuCgowMS8xMi8yMDA3OiBtZ29zc2FnZQogICAgICAgICAgICBbTHVhXSBBZGRlZCB0eXBlbWFwIHRocm93cyBmb3Igc3RkOjpzdHJpbmcqLCB0eXBlbWFwIGZvciBTV0lHVFlQRSBEWU5BTUlDLAoJICAgIGNoYW5nZWQgdGhlIGV4aXN0aW5nIHRocm93cyB0eXBlbWFwIHRvIHRocm93IGEgc3RyaW5nIGluc3RlYWQgb2YgbWFraW5nIGEgY29weSBvZgoJICAgIHRoZSBvYmplY3QgKHVwZGF0aW5nIGEgZmV3IHRlc3QgY2FzZXMgdG8gZGVhbCB3aXRoIHRoZSBjaGFuZ2UpLgoJICAgIGZpeGVkIHRlc3QgY2FzZTogZHluYW1pY19jYXN0cywgZXhjZXB0aW9uX3BhcnRpYWxfaW5mbywgbGlfc3RkX3N0cmluZywgc2l6ZV90CgowMS8wMy8yMDA3OiBiZWF6bGV5CiAgICAgICAgICAgIFtJbnRlcm5hbHNdLiAgVXNlIG9mIHN3aWdrZXlzLmMvLmggdmFyaWFibGVzIGlzIHJldm9rZWQuICBQbGVhc2UgdXNlCiAgICAgICAgICAgIHNpbXBsZSBzdHJpbmdzIGZvciBhdHRyaWJ1dGUgbmFtZXMuCgoxMi8zMC8yMDA2OiBiZWF6bGV5CiAgICAgICAgICAgIEludGVybmFsIEFQSSBmdW5jdGlvbnMgSGFzaEdldEF0dHIoKSBhbmQgSGFzaENoZWNrQXR0cigpIGhhdmUgYmVlbiByZXZva2VkLgogICAgICAgICAgICBQbGVhc2UgdXNlIEdldGF0dHIoKSB0byByZXRyaWV2ZSBhdHRyaWJ1dGVzLiAgVGhlIGZ1bmN0aW9uIENoZWNrYXR0cigpIGNhbgogICAgICAgICAgICBiZSB1c2VkIHRvIGNoZWNrIGF0dHJpYnV0ZXMuICBOb3RlOiAgVGhlc2UgZnVuY3Rpb25zIGhhdmUgYmVlbiByZXZva2VkCiAgICAgICAgICAgIGJlY2F1c2UgdGhleSBvbmx5IGFkZGVkIGEgbWFyZ2luYWwgcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnQgYXQgdGhlIGV4cGVuc2UKICAgICAgICAgICAgY29kZSBjbGFyaXR5LgoKMTIvMjYvMjAwNjogbWdvc3NhZ2UKICAgICAgICAgICAgW0x1YV0gQWRkZWQgbW9yZSBTVEwgKG1vcmUgZXhjZXB0aW9ucywgbWFwLCBzaXplX3QpLAoJICAgIGZpeGVkIHRlc3QgY2FzZTogY29udmVyc2lvbl9uc190ZW1wbGF0ZS4KCjEyLzIxLzIwMDY6IG1nb3NzYWdlCiAgICAgICAgICAgIFtMdWFdIFVwZGF0ZSB0byB0aHJvdyBlcnJvcnMgd2hlbiBzZXR0aW5nIGltbXV0YWJsZXMsCgkgICAgYW5kIGFsbG93aW5nIHVzZXIgYWRkaXRpb24gb2YgbW9kdWxlIHZhcmlhYmxlcy4KCjEyLzIwLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCB0eXBlZGVmJ2QgdmFyaWFibGUgd3JhcHBlcnMgdGhhdCB1c2UgJW5hdHVyYWx2YXIsIGVnLCBzdGQ6OnN0cmluZy4KCjEyLzE0LzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gQWRkIHN0ZDo6d3N0cmluZyBhbmQgd2NoYXJfdCB0eXBlbWFwcwoKMTIvMTQvMjAwNjogb2xseQoJICAgIFtwaHBdIEZpeCBidWcgIzE2MTM2NzMgKGJhZCBQSFA1IGNvZGUgZ2VuZXJhdGVkIGZvciBnZXR0ZXJzIGFuZAoJICAgIHNldHRlcnMpLgoKMTIvMDIvMjAwNjogd3NmdWx0b24sIEpvaG4gTGVueiwgRGF2ZSBCZWF6bGV5CiAgICAgICAgICAgIE1vdmUgZnJvbSBjdnMgdG8gU3VidmVyc2lvbiBmb3Igc291cmNlIGNvbnRyb2wKCjExLzMwLzIwMDY6IGJlYXpsZXkKICAgICAgICAgICAgQ2xlYW5lZCB1cCBzd2lnd2FybmluZ3Muc3dnIGZpbGUgbm90IHRvIHVzZSBuZXN0ZWQgbWFjcm8KICAgICAgICAgICAgZGVmaW5pdGlvbnMuCgoxMS8xMi8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YSwgQyNdIEZpeCBmb3IgJWV4dGVuZCB0byB3b3JrIGZvciBzdGF0aWMgbWVtYmVyIHZhcmlhYmxlcy4KClZlcnNpb24gMS4zLjMxIChOb3ZlbWJlciAyMCwgMjAwNikKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMTEvMTIvMjAwNjogTHVpZ2kgQmFsbGFiaW8KICAgICAgICAgICAgW1B5dGhvbl0gQWx0ZXJuYXRlIGZpeCBmb3IgUHl0aG9uIGV4Y2VwdGlvbnMgYnVnICMxNTc4MzQ2ICh0aGUgcHJldmlvdXMgb25lIGJyb2tlIFB5dGhvbgogICAgICAgICAgICBwcm9wZXJ0aWVzIGluIG1vZGVybiBjbGFzc2VzKQoKMTEvMTIvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgLWZha2V2ZXJzaW9uIGNvbW1hbmRsaW5lIG9wdGlvbiBub3cgZ2VuZXJhdGVzIHRoZSBmYWtlIHZlcnNpb24gaW50byB0aGUgZ2VuZXJhdGVkIHdyYXBwZXJzCiAgICAgICAgICAgIGFzIHdlbGwgYXMgZGlzcGxheWluZyBpdCB3aGVuIHRoZSAtdmVyc2lvbiBjb21tYW5kbGluZSBvcHRpb24gaXMgdXNlZC4KCjE0LzExLzIwMDY6IG1nb3NzYWdlCgkgICAgW2x1YV0gdXBkYXRlIHRvIHR5cGVtYXAgZm9yIG9iamVjdCBieSB2YWx1ZSwgdG8gbWFrZSBpdCBjODkgY29tcGxpYW50CgpWZXJzaW9uIDEuMy4zMCAoTm92ZW1iZXIgMTMsIDIwMDYpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjExLzEyLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtqYXZhXSBSZW1vdmUgRGV0YWNoQ3VycmVudFRocmVhZCBwYXRjaCBmcm9tICAwOC8xMS8yMDA2IC0gaXQgY2F1c2VzIHNlZ2ZhdWx0cwogICAgICAgICAgICBvbiBzb21lIHN5c3RlbXMuCgoxMS8xMi8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbcHl0aG9uXSBGaXggIzE1NzgzNDYgLSBQeXRob24gZXhjZXB0aW9ucyB3aXRoIC1tb2Rlcm4KCjExLzEwLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjMTU5MzI5MSAtIFNtYXJ0IHBvaW50ZXJzIGFuZCBpbmhlcml0aW5nIGZyb20gdGVtcGxhdGVzIAoKMTEvMDkvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgRml4IGRpcmVjdG9yIG9wZXJhdG9yIHBvaW50ZXIvcmVmZXJlbmNlIGNhc3RzIC0gIzE1OTIxNzMuCgoxMS8wNy8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBBZGQgJHNlbGYgc3BlY2lhbCB2YXJpYWJsZSBmb3IgJWV4dGVuZCBtZXRob2RzLiBQbGVhc2UgdXNlIHRoaXMgaW5zdGVhZCBvZiBqdXN0ICdzZWxmJwogICAgICAgICAgICBhcyB0aGUgQysrICd0aGlzJyBwb2ludGVyLgoKMTEvMDcvMjAwNjogbXV0YW5kaXoKCSAgICBbYWxsZWdyb2NsXSAKCSAgICBhbGxlZ3JvY2wuc3dnOiBzd2lnLWRlZnZhciB1cGRhdGVkIHRvIGFsbG93IHNwZWNpZnlpbmcgb2YKCSAgICAJCSAgIG5vbi1kZWZhdWx0IGZvcmVpZ24gdHlwZSAodmlhIDpmdHlwZSBrZXl3b3JkIGFyZykuCgkgICAgYWxsZWdyb2NsLmN4eDogU3BlY2lmeSBwcm9wZXIgYWNjZXNzIHR5cGUgZm9yIGVudW0gdmFsdWVzLgoKMTEvMDMvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEvQyNdIEZpeCBjb25zdCBzdGQ6OnN0cmluZyYgcmV0dXJuIHR5cGVzIGZvciBkaXJlY3RvcnMgYXMgcmVwb3J0ZWQgYnkKICAgICAgICAgICAgTWFyayBEb25zZWx6bWFubgoKMTAvMjkvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIFJlbW92ZSBEZWxldGVMb2NhbFJlZiBmcm9tIGVuZCBvZiBkaXJlY3RvciBtZXRob2RzIGZvciBub3cgYXMgaXQgaXMgY2F1c2luZyBhCiAgICAgICAgICAgIHNlZyBmYXVsdCB3aGVuIHJ1biBvbiBTb2xhcmlzIDguCgoxMC8yOS8yMDA2OiB3dXp6ZWIgKEpvaG4gTGVueikKCSAgICBbR3VpbGVdIFBhdGNoIGZyb20gQ2hyaXMgU2hvZW1ha2VyIHRvIGNsZWFuIHVwIHNvbWUgd2FybmluZ3MgaW4gdGhlIGdlbmVyYXRlZCBjb2RlLgoKMTAvMjkvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEltcG9ydGFudCBmaXggdG8gcHJldmVudCBlYXJseSBnYXJiYWdlIGNvbGxlY3Rpb24gb2YgdGhlIEphdmEgcHJveHkgY2xhc3MKICAgICAgICAgICAgd2hpbGUgaXQgaXMgYmVpbmcgdXNlZCBpbiBhIG5hdGl2ZSBtZXRob2QuIFRoZSBmaW5hbGl6ZXIgY291bGQgZGVzdHJveSB0aGUgdW5kZXJseWluZwogICAgICAgICAgICBDKysgb2JqZWN0IHdoaWxlIGl0IHdhcyBiZWluZyB1c2VkLiBUaGUgcHJvYmxlbSBvY2N1cnMgd2hlbiB0aGUgcHJveHkgY2xhc3MgaXMgbm8KICAgICAgICAgICAgbG9uZ2VyIHN0cm9uZ2x5IHJlYWNoYWJsZSBhZnRlciBhIG5hdGl2ZSBjYWxsLiAgVGhlIHByb2JsZW0gc2VlbXMgdG8gb2NjdXIgaW4KICAgICAgICAgICAgbWVtb3J5IHN0cmVzcyBzaXR1YXRpb25zIG9uIHNvbWUgSlZNcy4gSXQgZG9lcyBub3Qgc2VlbSB0byBvY2N1ciBvbiB0aGUKICAgICAgICAgICAgU3VuIGNsaWVudCBKVk0gdXAgdG8gamRrIDEuNS4gSG93ZXZlciB0aGUgMS42IGNsaWVudCBqZGsgaGFzIGEgbW9yZSBhZ2dyZXNzaXZlIGdhcmJhZ2UKICAgICAgICAgICAgY29sbGVjdG9yIGFuZCBzbyB0aGUgcHJvYmxlbSBkb2VzIG9jY3VyLiBJdCBkb2VzIG9jY3VyIG9uIHRoZSBTdW4gc2VydmVyCiAgICAgICAgICAgIEpWTXMgKGNlcnRhaW5seSAxLjQgb253YXJkcykuIFRoZSBmaXggZW50YWlscyBwYXNzaW5nIHRoZSBwcm94eSBjbGFzcyBpbnRvIHRoZSBuYXRpdmUKICAgICAgICAgICAgbWV0aG9kIGluIGFkZGl0aW9uIHRvIHRoZSBDKysgcG9pbnRlciBpbiB0aGUgbG9uZyBwYXJhbWV0ZXIsIGFzIEphdmEgY2xhc3NlcyBhcmUgbm90CiAgICAgICAgICAgIGNvbGxlY3RlZCB3aGVuIHRoZXkgYXJlIHBhc3NlZCBpbnRvIEpOSSBtZXRob2RzLiBUaGUgZXh0cmEgcGFyYW1ldGVyIGNhbiBiZSBzdXBwcmVzc2VkCiAgICAgICAgICAgIGJ5IHNldHRpbmcgdGhlIG5vcGdjcHAgYXR0cmlidXRlIGluIHRoZSBqdHlwZSB0eXBlbWFwIHRvICIxIiBvciB1c2luZyB0aGUgbmV3IC1ub3BnY3BwCiAgICAgICAgICAgIGNvbW1hbmRsaW5lIG9wdGlvbi4KCiAgICAgICAgICAgIFNlZSBKYXZhLmh0bWwjamF2YV9wZ2NwcCBmb3IgZnVydGhlciBkZXRhaWxzIG9uIHRoaXMgdG9waWMuCgoxMC8yNC8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIEZpeCBzbWFydCBwb2ludGVyIHdyYXBwZXJzLiBUaGUgdmlydHVhbC9vdmVycmlkZS9uZXcga2V5d29yZCBpcyBub3QgZ2VuZXJhdGVkCiAgICAgICAgICAgIGZvciBlYWNoIG1ldGhvZCBhcyB0aGUgc21hcnQgcG9pbnRlciBjbGFzcyBkb2VzIG5vdCBtaXJyb3IgdGhlIHVuZGVybHlpbmcgcG9pbnRlcgogICAgICAgICAgICBjbGFzcyBpbmhlcml0YW5jZSBoaWVyYXJjaHkuIFNGICMxNDk2NTM1CgoxMC8yNC8yMDA2OiBtZ29zc2FnZQogICAgICAgICAgICBbbHVhXSBhZGRlZCBzdXBwb3J0IGZvciBuYXRpdmUgbWV0aG9kcyAmIG1lbWJlciBmdW5jdGlvbiBwb2ludGVycy4KICAgICAgICAgICAgZml4ZWQgdGVzdCBjYXNlcyBhcnJheXNfZGltZW5zaW9ubGVzcyAmIGNwcF9iYXNpYy4gQWRkZWQgbmV3IGV4YW1wbGUgKGZ1bmN0b3IpLgogICAgICAgICAgICB0aWRpZWQgdXAgYSBsaXR0bGUgb2YgdGhlIGNvZGUgKGFyb3VuZCBjbGFzc0hhbmRsZXIpLgoKMTAvMTcvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW0MjLCBKYXZhXSBkaXJlY3Rvcm91dCB0eXBlbWFwIGNoYW5nZXMgdG8gZmFsbCBpbiBsaW5lIHdpdGggdGhlIG90aGVyIGRpcmVjdG9yCiAgICAgICAgICAgIGxhbmd1YWdlcy4gJHJlc3VsdCBpcyBub3cgdXNlZCB3aGVyZSAkMSB1c2VkIHRvIGJlIHVzZWQuIFBsZWFzZSBjaGFuZ2UgeW91ciB0eXBlbWFwcwogICAgICAgICAgICBpZiB5b3UgaGF2ZSBhIGN1c3RvbSBkaXJlY3Rvcm91dCB0eXBlbWFwLgoKMTAvMTgvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgU29tZSBmaXhlcyBmb3IgYXBwbHlpbmcgdGhlIGNoYXIgYXJyYXkgdHlwZW1hcHMgdG8gdW5zaWduZWQgY2hhciBhcnJheXMuCgoxMC8xNy8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyMsIEphdmFdIEFkZCBpbiBjb25zdCBzaXplX3QmIGFuZCBjb25zdCBzdGQ6OnNpemVfdCYgdHlwZW1hcHMuCgoxMC8xNS8yMDA2OiBlZnV6enlvbmUgCiAgICAgICAgICAgIFtDRkZJXSBTdXBwcmVzcyBnZW5lcmF0aW5nIGRlZmN0eXBlIGZvciBlbnVtcywgdGhhbmtzIHRvIEFydGh1ciBTbXlsZXMuIFBhdGNoIDE1NjA5ODMuIAoKMTAvMTQvMjAwNjogd3V6emViIChKb2huIExlbnopCiAgICAgICAgICAgIFtDaGlja2VuXSBNaW5vciBmaXggdG8gbWFrZSBTV0lHIHdvcmsgd2l0aCB0aGUgKGFzIHlldCB1bnJlbGVhc2VkKSBjaGlja2VuIDIuNQoKICAgICAgICAgICAgW0d1aWxlLENoaWNrZW5dIEZpeCBTRiBCdWcgMTU3Mzg5Mi4gIEFkZGVkIGFuIGV4dF90ZXN0IHRvIHRoZSB0ZXN0IHN1aXRlIHRvIHRlc3QKICAgICAgICAgICAgdGhpcyBidWcsIGJ1dCB0aGlzIHRlc3QgY2FuIG5vdCByZWFsbHkgYmUgbWFkZSBnZW5lcmljIGJlY2F1c2UgdGhlIGV4dGVybmFsIGNvZGUgbXVzdAogICAgICAgICAgICBwbHVnIGludG8gdGhlIHRhcmdldCBsYW5ndWFnZSBpbnRlcnByZXRlciBkaXJlY3RseS4KICAgICAgICAgICAgU2VlIEV4YW1wbGVzL3Rlc3Qtc3VpdGUvY2hpY2tlbi9leHRfdGVzdC5pIGFuZCBleHRfdGVzdF9leHRlcm5hbC5jeHgKCiAgICAgICAgICAgIEFkZGVkIGEgJS5leHRlcm5hbHRlc3QgdG8gY29tbW9uLm1rLCBhbmQgYW55IGludGVyZXN0ZWQgbGFuZ3VhZ2UgbW9kdWxlcyBjYW4KICAgICAgICAgICAgY29weSBhbmQgc2xpZ2h0bHkgbW9kaWZ5IGVpdGhlciB0aGUgY2hpY2tlbiBvciB0aGUgZ3VpbGUgZXh0X3Rlc3QuaQoKMTAvMTQvMjAwNjogbWdvc3NhZ2UKICAgICAgICAgICAgW0x1YV0gYWRkZWQgT1VUUFVUJiBmb3IgYWxsIG51bWJlciB0eXBlcywgYWRkZWQgYSBsb25nIGxvbmcgdHlwZQogICAgICAgICAgICBmaXhlZCBzZXZlcmFsIHRlc3QgY2FzZXMuCiAgICAgICAgICAgIHVwZGF0ZTogY2hhbmdlZCB0eXBlbWFwcyB0byB1c2UgU1dJR19Db252ZXJ0UHRyIHJhdGhlciB0aGFuIFNXSUdfTXVzdEdldFBvaW50ZXIKICAgICAgICAgICAgc3RhcnRlZCBzcGxpdGluZyBsdWEuc3dnIGludG8gc21hbGxlciBwYXJ0cyB0byBtYWtlIGl0IG5lYXRlcgoKMTAvMTMvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW0MjLCBKYXZhXSBNYXJnaW5hbGx5IGJldHRlciBzdXBwb3J0IGZvciBtdWx0aXBsZSBpbmhlcml0YW5jZSBvbmx5IGluIHRoYXQgeW91IGNhbgogICAgICAgICAgICBjb250cm9sIHdoYXQgdGhlIGJhc2UgY2xhc3MgaXMuIFRoaXMgaXMgZG9uZSB1c2luZyB0aGUgbmV3ICdyZXBsYWNlJyBhdHRyaWJ1dGUgaW4gdGhlIAogICAgICAgICAgICBqYXZhYmFzZS9jc2Jhc2UgdHlwZW1hcCwgZWcgaW4gdGhlIGZvbGxvd2luZywgJ01lJyB3aWxsIGJlIHRoZSBiYXNlIGNsYXNzLAogICAgICAgICAgICBubyBtYXR0ZXIgd2hhdCBGb28gaXMgcmVhbGx5IGRlcml2ZWQgZnJvbSBpbiB0aGUgQysrIGxheWVyLgoKICAgICAgICAgICAgICAldHlwZW1hcChqYXZhYmFzZSwgcmVwbGFjZT0iMSIpIEZvbyAiTWUiOwogICAgICAgICAgICAgICV0eXBlbWFwKGNzYmFzZSwgcmVwbGFjZT0iMSIpIEZvbyAiTWUiOwoKICAgICAgICAgICAgUHJldmlvdXNseSBpdCB3YXMgbm90IHBvc3NpYmxlIGZvciB0aGUgamF2YWJhc2UvY3NiYXNlIHR5cGVtYXBzIHRvIG92ZXJyaWRlIHRoZSBDKysgYmFzZS4KCjEwLzEyLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBSZW1vdmUgcG90ZW50aWFsIHJhY2UgY29uZGl0aW9uIG9uIHRoZSBwcm94eSBjbGFzcycgZGVsZXRlKCkgbWV0aG9kIAogICAgICAgICAgICAoaXQgaXMgbm93IGEgc3luY2hyb25pemVkIG1ldGhvZCwgYnV0IGlzIG5vdyBjdXN0b21pc2FibGUgYnkgY2hhbmdpbmcgdGhlIAogICAgICAgICAgICBtZXRob2Rtb2RpZmllcnMgYXR0cmlidXRlIGluIHRoZSB0aGUgamF2YWRlc3RydWN0IG9yIGphdmFkZXN0cnVjdF9kZXJpdmVkIHR5cGVtYXApCgogICAgICAgICAgICBbQyNdIFJlbW92ZSBwb3RlbnRpYWwgcmFjZSBjb25kaXRpb24gb24gdGhlIHByb3h5IGNsYXNzJyBEaXNwb3NlKCkgbWV0aG9kLCAKICAgICAgICAgICAgc2ltaWxhciB0byBKYXZhJ3MgZGVsZXRlKCkgYWJvdmUuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjEwLzEyLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtSdWJ5LCBQeXRob25dIFJlbW92ZSByZWR1bmRhbnQgZGlyZWN0b3IgY29kZSBpbiAlZXh0ZW5kIG1ldGhvZHMgKCVleHRlbmQKICAgICAgICAgICAgbWV0aG9kcyBjYW5ub3QgYmUgZGlyZWN0b3IgbWV0aG9kcykKCjEwLzEyLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtSdWJ5LCBQeXRob25dIEZpeCAjMTUwNTU5NCAtIGRpcmVjdG9yIG9iamVjdHMgbm90IHJldHVybmVkIGFzIGRpcmVjdG9yIG9iamVjdHMKICAgICAgICAgICAgaW4gJWV4dGVuZCBtZXRob2RzLgoKMTAvMTEvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEZpeCAjMTIzODc5OCAtIERpcmVjdG9ycyB1c2luZyB1bnNpZ25lZCBsb25nIGxvbmcgb3IgYW55IG90aGVyIHR5cGUKICAgICAgICAgICAgbWFyc2hhbGxlZCBhY3Jvc3MgdGhlIEpOSSBib3VuZGFyeSB1c2luZyBhIEphdmEgY2xhc3MgKHdoZXJlIHRoZSBqbmkgdHlwZW1hcCAKICAgICAgICAgICAgY29udGFpbnMgam9iamVjdCkuCgoxMC8wNi8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzExNjIxOTQgLSAjaW5jbHVkZS8laW5jbHVkZSB3aXRoaW4gYSBzdHJ1Y3R1cmUKCjEwLzA2LzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjMTQ1MDY2MSwgc3RyaW5nIHRydW5jYXRpb24gaW4gU3RyaW5nX3NlZWsgdHJ1bmNhdGluZyBKYXZhL0MjIGVudW1zLgoKMTAvMDYvMjAwNjogbWdvc3NhZ2UKICAgICAgICAgICAgW0x1YV0gRml4ICMxNTY5NTg3LiBUaGUgbmFtZSBpcyBub3cgY29ycmVjdC4KCjEwLzA0LzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIERpcmVjdG9yIGZpeGVzIGZvciB2aXJ0dWFsIGNvbnZlcnNpb24gb3BlcmF0b3JzCgoxMC8wNC8yMDA2OiBvbGx5CgkgICAgW3BocF0gRml4ICMxNTY5NTg3IGZvciBQSFAuICBEb24ndCB1c2Ugc2l6ZW9mKCkgZXhjZXB0IHdpdGggc3RyaW5nCgkgICAgbGl0ZXJhbHMuICBDaGFuZ2Ugc29tZSAiLy8iIGNvbW1lbnRzIHRvICIvKiAqLyIgZm9yIHBvcnRhYmlsaXR5LgoKMTAvMDQvMjAwNjogbWdvc3NhZ2UKICAgICAgICAgICAgW0x1YV0gUGFydGlhbCBGaXggIzE1Njk1ODcuIFRoZSB0eXBlIGlzIG5vdyBjb3JyZWN0LCBidXQgdGhlIG5hbWUgaXMgc3RpbGwgbm90IGNvcnJlY3QuCgoxMC8wMy8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbUnVieV0gRml4ICMxNTI3ODg1IC0gT3ZlcmxvYWRlZCBkaXJlY3RvciB2aXJ0dWFsIG1ldGhvZHMgc29tZXRpbWVzIHByb2R1Y2VkCiAgICAgICAgICAgIHVuY29tcGlsZWFibGUgY29kZSB3aGVuIHVzZWQgd2l0aCB0aGUgZGlyZWN0b3I6ZXhjZXB0IGZlYXR1cmUuCgoxMC8wMy8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBEaXJlY3RvcnM6IERpcmVjdG9ycyBhcmUgb3V0cHV0IGluIHRoZSBvcmRlciBpbiB3aGljaCB0aGV5IGFyZSBkZWNsYXJlZCBpbiAKICAgICAgICAgICAgdGhlIEMrKyBjbGFzcyByYXRoZXIgdGhhbiBpbiBzb21lIHBzZXVkby1yYW5kb20gb3JkZXIuCgoxMC8wMy8yMDA2OiBtbWF0dXMKICAgICAgICAgICAgRml4ICMxNDg2MjgxIGFuZCAjMTQ3MTAzOS4KCjEwLzAzLzIwMDY6IG9sbHkKCSAgICBbUGVybF0gRml4IGZvciBoYW5kbGluZyBzdHJpbmdzIHdpdGggemVybyBieXRlcyBmcm9tIFN0ZXBoZW4gSHV0c2FsLgoKMDkvMzAvMjAwNjogZWZ1enp5b25lCiAgICAgICAgICAgIFtDRkZJXSBCaXRmaWVsZCBzdXBwb3J0IGFuZCB2YXJhcmcgc3VwcG9ydCBkdWUgdG8gQXJ0aHVyIFNteWxlcy4KICAgICAgICAgICAgQyBleHByZXNzaW9uIHRvIExpc3AgY29udmVyc2lvbiwgdGhhbmtzIHRvIEFydGh1ciBTbXlsZXMgZm9yIHRoZSBpbml0aWFsCiAgICAgICAgICAgIGlkZWEsIGl0IG5vdyBzdXBwb3J0cyBjb252ZXJzaW9uIGZvciBhIHdob2xlIHJhbmdlIG9mIEMgZXhwcmVzc2lvbnMuIAoKMDkvMjgvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMxNTA4MzI3IC0gT3ZlcmxvYWRlZCBtZXRob2RzIGFyZSBoaWRkZW4gd2hlbiB1c2luZyAtZnZpcnR1YWwgb3B0aW1pc2F0aW9uLgogICAgICAgICAgICBPdmVybG9hZGVkIG1ldGhvZHMgYXJlIG5vIGxvbmdlciBjYW5kaWRhdGVzIGZvciBlbGltaW5hdGlvbiAtIHRoaXMgbWltaWNzCiAgICAgICAgICAgIEMrKyBiZWhhdmlvdXIgd2hlcmUgYWxsIG92ZXJsb2FkZWQgbWV0aG9kcyBtdXN0IGJlIGRlZmluZWQgYW5kIGltcGxlbWVudGVkCiAgICAgICAgICAgIGluIGEgZGVyaXZlZCBjbGFzcyBpbiBvcmRlciBmb3IgdGhlbSB0byBiZSBhdmFpbGFibGUuCgowOS8yNS8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbUnVieSwgUHl0aG9uLCBPY2FtbF0gRml4ICMxNTA1NTkxIFRocm93aW5nIGV4Y2VwdGlvbnMgaW4gZXh0ZW5kZWQgZGlyZWN0b3JzCgowOS8yNS8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzEwNTYxMDAgLSB2aXJ0dWFsIG9wZXJhdG9ycy4gCgowOS8yNC8yMDA2OiBvbGx5CgkgICAgRG9uJ3QgYWNjaWRlbnRhbGx5IGNyZWF0ZSBhICI8OiIgdG9rZW4gKHdoaWNoIGlzIHRoZSBzYW1lIGFzICJbIiBpbiBDKyspLgoJICAgIEZpeGVzIGJ1ZyAjIDE1MjE3ODguCgowOS8yMy8yMDA2OiBvbGx5CgkgICAgW1J1YnldIFN1cHBvcnQgYnVpbGRpbmcgd2l0aCByZWNlbnQgdmVyc2lvbnMgb2YgdGhlIFJ1YnkgMS45CgkgICAgZGV2ZWxvcG1lbnQgYnJhbmNoLiAgRml4ZXMgYnVnICMxNTYwMDkyLgoKMDkvMjMvMjAwNjogb2xseQoJICAgIFRlbXBsYXRlcyBjYW4gbm93IGJlIGluc3RhbnRpYXRlZCB1c2luZyBuZWdhdGl2ZSBudW1iZXJzIGFuZAoJICAgIGNvbnN0YW50IGV4cHJlc3Npb25zLCBlLmcuOgoKCSAgICB0ZW1wbGF0ZTxpbnQgcT4gY2xhc3MgeCB7fTsKCSAgICAldGVtcGxhdGUoeF9taW51czEpIHg8LTE+OwoJICAgICV0ZW1wbGF0ZSh4XzFwbHVzMikgeDwxKzI+OwoKCSAgICBBbHNvLCBjb25zdGFudCBleHByZXNzaW9ucyBjYW4gbm93IGluY2x1ZGUgY29tcGFyaXNvbnMgKD4sIDwsID49LAoJICAgIDw9LCAhPSwgPT0pLCBtb2R1bHVzICglKSwgYW5kIHRlcm5hcnkgY29uZGl0aW9uYWxzIChhID8gYiA6IGMpLgoKCSAgICBGaXhlcyBidWdzICM2NDYyNzUsICM5MjU1NTUsICM5NTYyODIsICM5OTQzMDEuCgowOS8yMi8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggJWlnbm9yZSBvbiBkaXJlY3RvciBtZXRob2RzIC0gQnVncyAjMTU0NjI1NCwgIzE1NDM1MzMKCjA5LzIwLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAlaWdub3JlIG9uIGRpcmVjdG9yIGNvbnN0cnVjdG9ycwoKMDkvMjAvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgRml4IHNlZyBmYXVsdHMgYW5kIGFzc2VydHMgd2hlbiBkaXJlY3RvciBtZXRob2RzIGFyZSBpZ25vcmVkICgjMTU0MzUzMykKCjA5LzIwLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBvdXQgb2Ygc291cmNlIGJ1aWxkcyAtIGJ1ZyAjMTU0NDcxOAoKMDkvMjAvMjAwNjogb2xseQoJICAgIFRyZWF0IGEgbmVzdGVkIGNsYXNzIGRlZmluaXRpb24gYXMgYSBmb3J3YXJkIGRlY2xhcmF0aW9uIHJhdGhlcgoJICAgIHRoYW4gaWdub3JpbmcgaXQgY29tcGxldGVseSwgc28gdGhhdCB3ZSBnZW5lcmF0ZSBjb3JyZWN0IGNvZGUgZm9yCgkgICAgcGFzc2luZyBvcGFxdWUgcG9pbnRlcnMgdG8gdGhlIG5lc3RlZCBjbGFzcyAoZml4ZXMgU0YgYnVnICM5MDkzODcpLgoKMDkvMjAvMjAwNjogb2xseQogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCSAgICBbcGhwXSBPdmVybG9hZCByZXNvbHV0aW9uIG5vdyB3b3Jrcy4gIEhvd2V2ZXIgdG8gYWxsb3cgdGhpcywgU1dJRwoJICAgIGdlbmVyYXRlZCB3cmFwcGVycyBubyBsb25nZXIgY29lcmNlIFBIUCB0eXBlcyAod2hpY2ggcmV2ZXJ0cyBhIGNoYW5nZQoJICAgIG1hZGUgaW4gMS4zLjI2KS4gIFNvIGZvciBleGFtcGxlLCBpZiBhIG1ldGhvZCB0YWtlcyBhIHN0cmluZywgeW91CgkgICAgY2FuIG5vIGxvbmdlciBwYXNzIGEgbnVtYmVyIHdpdGhvdXQgZXhwbGljaXRseSBjb252ZXJ0aW5nIGl0IHRvIGEKCSAgICBzdHJpbmcgaW4gUEhQIHVzaW5nOiAoc3RyaW5nKXgKCjA5LzE4LzIwMDY6IG1nb3NzYWdlCiAgICAgICAgICAgIFtBTExdIGZpeCBvbiBzd2lnaW5pdC5zd2csIGhhcyBiZWVuIHJlcG9ydGVkIHRvIGNyYXNoIG9uIHNldmVyYWwgdGVzdCBjYXNlcwoJICAgIGZvdW5kIGFuZCBmaXhlZCBwcm9ibGVtIGluIGltcG9ydHMgdW5kZXIgcHl0aG9uIChtaW5ndykKCjA5LzE2LzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIFBhdGNoIGZyb20gTWljaGFsIE1hcmVrIGZvciBQeXRob24gMi41IHRvIGZpeCA2NCBiaXQgYXJyYXkgaW5kZXhlcyBvbgogICAgICAgICAgICA2NCBiaXQgbWFjaGluZXMuCgowOS8xMy8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBUaGUgZXhwbGljaXRjYWxsIGZlYXR1cmUgaGFzIGJlZW4gc2NyYXBwZWQuIFRoaXMgZmVhdHVyZSB3YXMgaW50cm9kdWNlZCBwcmltYXJpbHkKICAgICAgICAgICAgdG8gc29sdmUgcmVjdXJzaXZlIGRpcmVjdG9yIG1ldGhvZCBjYWxscy4gRGlyZWN0b3IgdXBjYWxsIGltcHJvdmVtZW50cyBtYWRlIGluc3RlYWQ6CgogICAgICAgICAgICBbUHl0aG9uLCBSdWJ5LCBPY2FtbF0gVGhlIHN3aWdfdXAgZmxhZyBpcyBubyBsb25nZXIgdXNlZC4gVGhlIHJlcXVpcmVkIG11dGV4ZXMKICAgICAgICAgICAgd3JhcHBpbmcgdGhpcyBmbGFnIGFyZSBhbHNvIG5vIGxvbmdlciBuZWVkZWQuIFRoZSByZWN1cnNpdmUgY2FsbHMgZ29pbmcgZnJvbSBDKysKICAgICAgICAgICAgdG8gdGhlIHRhcmdldCBsYW5ndWFnZSBhbmQgYmFjayBhZ2FpbiBldGMgYXJlIG5vdyBhdm9pZGVkIGJ5IGEgc3VidGxlbHkgZGlmZmVyZW50CiAgICAgICAgICAgIGFwcHJvYWNoLiBJbnN0ZWFkIG9mIHVzaW5nIHRoZSBzd2lnX3VwIGZsYWcgaW4gZWFjaCBkaXJlY3RvciBtZXRob2QgdG8gaW5kaWNhdGUKICAgICAgICAgICAgd2hldGhlciB0aGUgZXhwbGljaXQgQysrIGNhbGwgdG8gdGhlIGFwcHJvcHJpYXRlIGJhc2UgY2xhc3MgbWV0aG9kIG9yIGEgbm9ybWFsCiAgICAgICAgICAgIHBvbHltb3JwaGljIEMrKyBjYWxsIHNob3VsZCBiZSBtYWRlLCB0aGUgbmV3IGFwcHJvYWNoIG1ha2VzIG9uZSBvZiB0aGVzZSBjYWxscwogICAgICAgICAgICBkaXJlY3RseSBmcm9tIHRoZSB3cmFwcGVyIG1ldGhvZC4KCiAgICAgICAgICAgIFtKYXZhLCBDI10gVGhlIHJlY3Vyc2l2ZSBjYWxsIHByb2JsZW0gd2hlbiBjYWxsaW5nIGEgQysrIGJhc2UgY2xhc3MgbWV0aG9kIGZyb20KICAgICAgICAgICAgSmF2YS9DIyBpcyBub3cgZml4ZWQuIFRoZSBpbXBsZW1lbnRhdGlvbiBpcyBzbGlnaHRseSBkaWZmZXJlbnQgdG8gdGhlIG90aGVyIGxhbmd1YWdlcwogICAgICAgICAgICBhcyB0aGUgZGV0ZWN0aW9uIGFzIHRvIHdoZXRoZXIgdGhlIGV4cGxpY2l0IGNhbGwgb3IgYSBub3JtYWwgcG9seW1vcnBoaWMgY2FsbCBpcyBtYWRlCiAgICAgICAgICAgIGluIHRoZSBKYXZhL0MjIGxheWVyIHJhdGhlciB0aGFuIGluIHRoZSBDKysgbGF5ZXIuCgowOS8xMS8yMDA2OiBtZ29zc2FnZQogICAgICAgICAgICBbQUxMXSB1cGRhdGVkIHN3aWdpbml0LnN3ZyB0byBhbGxvdyBtdWx0aXBsZSBpbnRlcnByZXRlcnMgdG8gdXNlIG11bHRpcGxlCgkgICAgc3dpZyBtb2R1bGVzIGF0IG9uY2UuIFRoaXMgaGFzIGJlZW4gdGVzdGVkIGluIEx1YSAobWluZ3cgJiBsaW51eCksCgkgICAgcGVybDUgJiBweXRob24gKGxpbnV4KSBvbmx5LgoKMDkvMTEvMjAwNjogbWdvc3NhZ2UKICAgICAgICAgICAgW2x1YV0gYWRkZWQgc3VwcG9ydCBmb3IgcGFzc2luZyBmdW5jdGlvbiBwb2ludGVycyBhcyB3ZWxsIGFzIG5hdGl2ZSBsdWEgb2JqZWN0CiAgICAgICAgICAgIGludG8gd3JhcHBlcmVkIGZ1bmN0aW9uLgogICAgICAgICAgICBBZGRlZCBleGFtcGxlIGZ1bmNwdHIzIHRvIGRlbW9uc3RyYXRlIHRoaXMgZmVhdHVyZQoKMDkvMDUvMjAwNjogb2xseQoJICAgIFtwaHBdIFJlbmFtZSBFcnJvckNvZGUgYW5kIEVycm9yTXNnICNkZWZpbmUtcyB0byBTV0lHX0Vycm9yQ29kZQoJICAgIGFuZCBTV0lHX0Vycm9yTXNnIHRvIGF2b2lkIGNsYXNoZXMgd2l0aCBjb2RlIHRoZSB1c2VyIG1pZ2h0IGJlCgkgICAgd3JhcHBpbmcgKHBhdGNoIGZyb20gRGFycmVuIFdhcm5lciBpbiBTRiBidWcgIzE0NjYwODYpLiAgQW55CgkgICAgdXNlciB0eXBlbWFwcyB3aGljaCB1c2UgRXJyb3JDb2RlIGFuZC9vciBFcnJvck1zZyBkaXJlY3RseSB3aWxsCgkgICAgbmVlZCBhZGp1c3RpbmcgLSB5b3UgY2FuIGVhc2lseSBmaXggdGhlbSB0byB3b3JrIHdpdGggYm90aCBvbGQKCSAgICBhbmQgbmV3IFNXSUcgYnkgY2hhbmdpbmcgdG8gdXNlIFNXSUdfRXJyb3JNc2cgYW5kIGFkZGluZzoKCgkJI2lmbmRlZiBTV0lHX0Vycm9yTXNnCgkJI2RlZmluZSBTV0lHX0Vycm9yTXNnKCkgRXJyb3JNc2coKQoJCSNlbmRpZgoKMDgvMjkvMjAwNjogb2xseQoJICAgIFtwaHBdIE1vdmUgY29uc3RhbnQgaW5pdGlhbGlzYXRpb24gZnJvbSBSSU5JVCB0byBNSU5JVCB0byBmaXggYQoJICAgIHdhcm5pbmcgd2hlbiB1c2luZyBBcGFjaGUgYW5kIG1vZF9waHAuICBXZSBvbmx5IG5lZWQgdG8gY3JlYXRlCgkgICAgUEhQIGNvbnN0YW50cyBvbmNlIHdoZW4gd2UncmUgZmlyc3QgaW5pdGlhbGlzZWQsIG5vdCBmb3IgZXZlcnkgSFRUUAoJICAgIHJlcXVlc3QuCgowOC8yMS8yMDA2OiBtZ29zc2FnZQogICAgICAgICAgICBbTHVhXQoJICAgIEJ1Z2ZpeCAjMTU0MjQ2NiBhZGRlZCBjb2RlIHRvIGFsbG93IG1hcHBpbmcgTHVhIG5pbCdzIDwtPiBDL0MrKyBOVUxMJ3MKCSAgICB1cGRhdGVkIHZhcmlvdXMgdHlwZW1hcHMgdG8gd29yayBjb3JyZWN0bHkgd2l0aCB0aGUgY2hhbmdlcwoJICAgIGFkZGVkIHZvaWR0ZXN0X3J1bm1lLmx1YSB0byBzaG93IHRoZSBmZWF0dXJlcyB3b3JraW5nCgowOC8xOS8yMDA2OiB3dXp6ZWIgKEpvaG4gTGVueikKCSAgICBbR3VpbGVdIEFkZCBmZWF0dXJlOmNvbnN0YXN2YXIgdG8gZXhwb3J0IGNvbnN0YW50cyBhcyB2YXJpYWJsZXMgaW5zdGVhZCBvZiBmdW5jdGlvbnMKICAgICAgICAgICAgdGhhdCByZXR1cm4gdGhlIGNvbnN0YW50IHZhbHVlLgoKMDgvMTEvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIERldGFjaEN1cnJlbnRUaHJlYWQgY2FsbHMgaGF2ZSBiZWVuIGFkZGVkIHNvIHRoYXQgbmF0aXZlbHkgY3JlYXRlZCB0aHJlYWRzCiAgICAgICAgICAgIG5vIGxvbmdlciBwcmV2ZW50IHRoZSBKVk0gZnJvbSBleGl0aW5nLiBCdWcgcmVwb3J0ZWQgYnkgVGhvbWFzIER1ZHppYWsgYW5kCiAgICAgICAgICAgIFBhdWwgTm9sbC4KCjA4LzEwLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gRml4IGRpcmVjdG9yIHByb3RlY3RlZCBtZXRob2RzIHNvIHRoZXkgd29yawoKMDcvMjUvMjAwNjogbXV0YW5kaXoKCSAgICBbYWxsZWdyb2NsXQoJICAgIG1vcmUgYWRkaXRpb25zIHRvIHN0ZDo6c3RyaW5nLCBzb21lIHR3ZWFrcyBhbmQgc21hbGwgYnVnIGZpeGVzCgkgICAgLW5vY3dyYXAgbW9kZS4KCjA3LzIxLzIwMDY6IG1nb3NzYWdlCiAgICAgICAgICAgIFtMdWFdCgkgICAgQnVnZml4ICMxNTI2MDIyIHBkYXRlZCBzdGQ6OnN0cmluZyB0byBzdXBwb3J0IHN0cmluZ3Mgd2l0aCAnXDAnIGluc2lkZSB0aGVtCgkgICAgdXBkYXRlZCB0eXBlbWFwcy5pIHRvIGFkZCBzdXBwb3J0IGZvciBwb2ludGVyIHRvIHBvaW50ZXJzCgowNy8xOS8yMDA2OiBtdXRhbmRpegoJICAgIFthbGxlZ3JvY2xdCgkgICAgLSBBZGQgc3RkX3N0cmluZy5pIHN1cHBvcnQuCgkgICAgLSBBZGQgbmV3b2JqZWN0IHBhdGNoIHN1Ym1pdHRlZCBieSBta29lcHBlICh0aGFua3MhKQoJICAgIC0gRml4IHR5cGUgbmFtZSBtaXNtYXRjaCBpc3N1ZSBmb3IgbmVzdGVkIHR5cGUgZGVmaW5pdGlvbnMuCgkgICAgICBzcGVjaWZpY2FsbHkgdHlwZWRlZnMgaW4gdGVtcGxhdGVkIGNsYXNzIGRlZm5zLgoKMDcvMTgvMjAwNjogbWdvc3NhZ2UKCSAgICBCdWdmaXggIzE1MjI4NTgKCSAgICB1cGRhdGVkIGx1YS5jeHggdG8gc3VwcG9ydCAtZXh0ZXJuYWwtcnVudGltZSBjb21tYW5kCgowNy8xNC8yMDA2OiB3dXp6ZWIgKEpvaG4gTGVueikKCSAgICBJbmNyZW1lbnQgdGhlIFNXSUdfUlVOVElNRV9WRVJTSU9OIHRvIDMsIGJlY2F1c2Ugb2YgdGhlCgkgICAgYWRkaXRpb24gb2YgdGhlIG93bmRhdGEgbWVtYmVyIGluIHN3aWdfdHlwZV9pbmZvLgoJICAgIFJlcG9ydGVkIGJ5OiBQcmFiaHUgUmFtYWNoYW5kcmFuCgowNy8wNS8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBTZWFyY2ggcGF0aCBmaXhlczoKICAgICAgICAgICAgLSBGaXggc2VhcmNoIHBhdGggZm9yIGxpYnJhcnkgZmlsZXMgdG8gYmVoYXZlIGFzIGRvY3VtZW50ZWQgaW4gTGlicmFyeS5odG1sLgogICAgICAgICAgICAtIEZpeCBtaW5ndy9tc3lzIGJ1aWxkcyB3aGljaCBkaWQgbm90IGZpbmQgdGhlIFNXSUcgbGlicmFyeSB3aGVuIGluc3RhbGxlZC4KICAgICAgICAgICAgLSBXaW5kb3dzIGJ1aWxkcyBhbHNvIG91dHB1dCB0aGUgbWluZ3cvbXN5cyBpbnN0YWxsIGxvY2F0aW9uIHdoZW4gcnVubmluZwogICAgICAgICAgICAgIHN3aWcgLXN3aWdsaWIuCiAgICAgICAgICAgIC0gVGhlIG5vbi1leGlzdGVudCBhbmQgdW5kb2N1bWVudGVkIGNvbmZpZyBkaXJlY3RvcnkgaW4gdGhlIHNlYXJjaCBwYXRoIGhhcwogICAgICAgICAgICAgIGJlZW4gcmVtb3ZlZC4KCjA3LzA1LzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAkc3ltbmFtZSBzcGVjaWFsIHZhcmlhYmxlIGV4cGFuc2lvbi4KCjA3LzA0LzIwMDY6IHd1enplYiAoSm9obiBMZW56KQoJICAgIFtDaGlja2VuXQoJICAgIEFkZCAlZmVhdHVyZSgiY29uc3Rhc3ZhciIpLCB3aGljaCBpbnN0ZWFkIG9mIGV4cG9ydGluZyBhIGNvbnN0YW50IGFzIGEKCSAgICBzY2hlbWUgZnVuY3Rpb24sIGV4cG9ydHMgdGhlIGNvbnN0YW50IGFzIGEgc2NoZW1lIHZhcmlhYmxlLiAgVXBkYXRlIHRoZQoJICAgIGRvY3VtZW50YXRpb24gYXMgd2VsbC4KCjA3LzA0LzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtTZWUgZW50cnkgb2YgMDkvMTMvMjAwNiAtIGV4cGxpY2l0Y2FsbCBmZWF0dXJlIGFuZCBkb2N1bWVudGF0aW9uIHRvIGl0IHJlbW92ZWRdCiAgICAgICAgICAgIE5ldyBleHBsaWNpdGNhbGwgZmVhdHVyZSB3aGljaCBnZW5lcmF0ZXMgYWRkaXRpb25hbCB3cmFwcGVycyBmb3IgdmlydHVhbCBtZXRob2RzCiAgICAgICAgICAgIHRoYXQgY2FsbCB0aGUgbWV0aG9kIGV4cGxpY2l0bHksIG5vdCByZWx5aW5nIG9uIHBvbHltb3JwaGlzbSB0byBtYWtlIHRoZSBtZXRob2QKICAgICAgICAgICAgY2FsbC4gVGhlIGZlYXR1cmUgaXMgYSBmZWF0dXJlIGZsYWcgYW5kIGlzIGVuYWJsZWQgbGlrZSBhbnkgb3RoZXIgZmVhdHVyZSBmbGFnLgogICAgICAgICAgICBJdCBhbHNvIHJlY29nbmlzZXMgYW4gYXR0cmlidXRlLCAic3VmZml4IiBmb3IgbWFuZ2xpbmcgdGhlIGZlYXR1cmUgbmFtZSwgc2VlCiAgICAgICAgICAgIFNXSUdQbHVzLmh0bWwjU1dJR1BsdXNfZXhwbGljaXRjYWxsIGRvY3VtZW50YXRpb24gZm9yIG1vcmUgZGV0YWlscy4KCiAgICAgICAgICAgIFtKYXZhLCBDI10KICAgICAgICAgICAgVGhlIGV4cGxpY2l0Y2FsbCBmZWF0dXJlIGlzIGFsc28gYSB3b3JrYXJvdW5kIGZvciBzb2x2aW5nIHRoZSByZWN1cnNpdmUgY2FsbHMKICAgICAgICAgICAgcHJvYmxlbSB3aGVuIGEgZGlyZWN0b3IgbWV0aG9kIG1ha2VzIGEgY2FsbCB0byBhIGJhc2UgY2xhc3MgbWV0aG9kLiBTZWUKICAgICAgICAgICAgSmF2YS5odG1sI2phdmFfZGlyZWN0b3JzX2V4cGxpY2l0Y2FsbCBmb3IgdXBkYXRlZCBkb2N1bWVudGF0aW9uLgoKMDYvMjgvMjAwNjogam9lIChKb3NlcGggV2FuZykKCSAgICBbcl0gSW5pdGlhbCBzdXBwb3J0IGZvciBSCgowNi8yMC8yMDA2OiB3dXp6ZWIgKEpvaG4gTGVueikKCSAgICBbQ2hpY2tlbl0KICAgICAgICAgICAgTWlub3IgZml4ZXMgdG8gZ2V0IGFwcGx5X3N0cmluZ3MuaSB0ZXN0c3VpdGUgdG8gcGFzcwoJICAgIFJlbW92ZSBpbnRlZ2Vyc19ydW5tZS5zY20gZnJvbSB0aGUgdGVzdHN1aXRlLCBiZWNhdXNlIFNXSUcgYW5kIENoaWNrZW4gZG9lcwogICAgICAgICAgICBoYW5kbGUgb3ZlcmZsb3dzLgoKMDYvMTkvMjAwNTogb2xseQoJICAgIFtwaHBdIEFkZCBzdXBwb3J0IGZvciBnZW5lcmF0aW5nIFBIUDUgY2xhc3Mgd3JhcHBlcnMgZm9yIEMrKwoJICAgIGNsYXNzZXMgKHVzZSAic3dpZyAtcGhwNSIpLgoKMDYvMTcvMjAwNjogb2xseQoJICAgIFtwaHBdIEFkZGVkIHNvbWUgbWlzc2luZyBrZXl3b3JkcyB0byB0aGUgUEhQNCBrZXl3b3JkIGxpc3QsIGFuZAoJICAgIGZpeGVkIF9fTElORV9fIGFuZCBfX0ZJTEVfXyB3aGljaCB3ZXJlIGluIHRoZSB3cm9uZyBjYXRlZ29yeS4KCSAgICBBbHNvIGFkZGVkIGFsbCB0aGUga2V5d29yZHMgbmV3IGluIFBIUDUsIGFuZCBhZGRlZCBjb21tZW50cwoJICAgIG5vdGluZyB0aGUgUEhQNCBrZXl3b3JkcyB3aGljaCBhcmVuJ3Qga2V5d29yZHMgaW4gUEhQNS4KCjA2LzE3LzIwMDY6IG9sbHkKCSAgICBbcGhwXSBEb24ndCBzZWdmYXVsdCBpZiBQSFAgTnVsbCBpcyBwYXNzZWQgYXMgdGhpcyBwb2ludGVyIChlLmcuCgkgICAgQ2xhc3NfbWV0aG9kKE51bGwpKSAtIGdpdmUgYSBQSFAgRXJyb3IgaW5zdGVhZC4KCjA2LzE1LzIwMDY6IG11dGFuZGl6CgkgICAgW2FsbGVncm9jbF0KCSAgICBBZGQgaW5pdGlhbCBzdXBwb3J0IGZvciBzdGQ6Omxpc3QgY29udGFpbmVyIGNsYXNzLgoJICAgIEZpeCBhIGZldyBidWdzIGluIGhlbHBlciBmdW5jdGlvbnMuCgowNS8xMy8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gUmVwbGFjZSBKTklFWFBPUlQgd2l0aCBTV0lHRVhQT1JULCB0aGVyZWJ5IGVuYWJsaW5nIHRoZSBwb3NzaWJpbGl0eQogICAgICAgICAgICBvZiB1c2luZyBnY2MgLWZ2aXNpYmlsaXR5PWhpZGRlbiBmb3IgcG90ZW50aWFsbHkgc21hbGxlciBmYXN0ZXIgbG9hZGluZyB3cmFwcGVycy4KCjA1LzEzLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBmb3IgTWFrZWZpbGVzIGZvciBhdXRvY29uZi0yLjYwIGJldGEKCjA1LzEzLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFZsYWRpbWlyIE1lbnNoYWtvdiBwYXRjaCBmb3IgY29tcGlsaW5nIHdyYXBwZXJzIHdpdGggcHl0aG9uLTIuNSBhbHBoYS4KCjA1LzEyLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBidWZmZXIgb3ZlcmZsb3cgZXJyb3Igd2hlbiB1c2luZyBsYXJnZSAlZmVhdHVyZShkb2NzdHJpbmcpIHJlcG9ydGVkCiAgICAgICAgICAgIGJ5IEpvc2VwaCBXaW5zdG9uLgoKMDUvMTIvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW1BlcmxdIE9wZXJhdG9yIG92ZXJsb2FkIGZpeCBmcm9tIERhbmllbCBNb29yZS4KCjA1LzI1LzIwMDY6IG11dGFuZGl6CgkgICAgW2FsbGVncm9jbF0KCSAgICBGaXggYnVnIGluIGdlbmVyYXRpb24gb2YgQ0xPUyB0eXBlIGRlY2xhcmF0aW9ucyBmb3IgdW5pb25zCgkgICAgYW5kIGVxdWl2YWxlbnQgdHlwZXMuCgowNS8yNC8yMDA2OiBtdXRhbmRpegoJICAgIFthbGxlZ3JvY2xdCgkgICAgRG9uJ3QgcmVxdWlyZSBhIGZ1bGwgY2xhc3MgZGVmaW5pdGlvbiB0byBnZW5lcmF0ZSBhIENMT1Mgd3JhcHBlci4KCjA1LzIwLzIwMDY6IG9sbHkKCSAgICBbcGhwXSBHQ0MgVmlzaWJpbGl0eSBzdXBwb3J0IG5vdyB3b3JrcyB3aXRoIFBIUC4KCjA1LzE5LzIwMDY6IG9sbHkKCSAgICBbcGhwXSBSZW1vdmVkIHN1cHBvcnQgZm9yIC1kbG5hbWUgKHVzZSAtbW9kdWxlIGluc3RlYWQpLiAgRml4ZWQKCSAgICBuYW1pbmcgb2YgUEhQIGV4dGVuc2lvbiBtb2R1bGUgdG8gYmUgY29uc2lzdGVudCB3aXRoIFBIUAoJICAgIGNvbnZlbnRpb25zIChubyAicGhwXyIgcHJlZml4IG9uIFVuaXg7IG9uIFBIUCA+PSA0LjMuMCwgaGFuZGxlIFVuaXgKCSAgICBwbGF0Zm9ybXMgd2hpY2ggdXNlIHNvbWV0aGluZyBvdGhlciB0aGFuICIuc28iIGFzIHRoZSBleHRlbnNpb24uKQoKMDUvMTMvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBEaXJlY3RvciBzdXBwb3J0IGFkZGVkCgowNS8wNy8yMDA2OiBvbGx5CgkgICAgW3BocF0gRG9uJ3Qgc2VnZmF1bHQgaWYgUEhQIE51bGwgaXMgcGFzc2VkIHdoZXJlIGEgQysrIHJlZmVyZW5jZQoJICAgIGlzIHdhbnRlZC4KCjA1LzA1LzIwMDY6IG9sbHkKCSAgICBbcGhwXSBGaXggd3JhcHBlcnMgZ2VuZXJhdGVkIGZvciBnbG9iYWwgJ2NoYXInIHZhcmlhYmxlcyB0byBub3QKCSAgICBpbmNsdWRlIGEgdGVybWluYXRpbmcgemVybyBieXRlIGluIHRoZSBQSFAgc3RyaW5nLgoKMDUvMDMvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgTW9kaWZ5IHR5cGVtYXBzIHNvIHRoYXQgY2hhciAqIGNhbiBiZSBhcHBsaWVkIHRvIHVuc2lnbmVkIGNoYXIgKiBvciBzaWduZWQgY2hhciAqCiAgICAgICAgICAgIHR5cGVzIGFuZCB2aXNhIHZlcnNhLgoKMDUvMDMvMjAwNjogZWZ1enp5b25lCgkgICAgW2NmZmldVGhhbmtzIHRvIEx1a2UgSiBDcm9vayBmb3IgdGhpcyBpZGVhLgogICAgICAgICAgICAgLSBhIHN0cnVjdC9lbnVtL3VuaW9uIGlzIHJlcGxhY2VkIHdpdGggOnBvaW50ZXIgb25seSBpZgogICAgICAgICAgICAgICB0aGF0IHNsb3QgaXMgYWN0dWFsbHkgYSBwb2ludGVyIHRvIHRoYXQgdHlwZS4gU28sOiAKICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYV9zdHJ1Y3QgeyBpbnQgeDsgfSBhbmQKICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYl9zdHJ1Y3QgeyBhX3N0cnVjdCBzdHJ1Y3RfMTsgfTsgCiAgICAgICAgICAgICAgIHdpbGwgYmUgY29udmVydGVkIGFzOgogICAgICAgICAgICAgICAgICAgKGNmZmk6ZGVmY3N0cnVjdCBiX3N0cnVjdAogICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RydWN0XzEgYV9zdHJ1Y3QpKQogICAgICAgICAgICAgLSBPdGhlciBtaW5vciBmaXhlcyBpbiBsaXNwaWZ5aW5nIG5hbWVzLgoKMDUvMDIvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgRml4IHBvc3NpYmxlIHJlZGVmaW5pdGlvbiBvZiBfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEUgZm9yIFZDKysuCgowNC8xNC8yMDA2OiBlZnV6enlvbmUKCSAgICBbY2ZmaV0KICAgICAgICAgICAgVGhhbmtzIHRvIFRob21hcyBXZWlkbmVyIGZvciB0aGUgcGF0Y2guCiAgICAgICAgICAgIC0gd2hlbiBmZWF0dXJlIGV4cG9ydCBpcyBzZXQgKGV4cG9ydCAnZm9vKSBpcyAKICAgICAgICAgICAgICBnZW5lcmF0ZWQgZm9yIGV2ZXJ5IHN5bWJvbAogICAgICAgICAgICAtIHdoZW4gZmVhdHVyZSBpbmxpbmUgaXMgc2V0IChkZWNsYWltIChpbmxpbmUgZm9vKSkgaXMgCiAgICAgICAgICAgICAgZ2VuZXJhdGVkIGJlZm9yZSBldmVyeSBmdW5jdGlvbiBkZWZpbml0aW9uCiAgICAgICAgICAgIC0gd2hlbiBmZWF0dXJlIGludGVybl9mdW5jdGlvbiBpcyBzZXQgCiAgICAgICAgICAgICAgIy4odmFsdWUtb2YtaW50ZXJuLWZ1bmN0aW9uICJuYW1lIiAibm9kZVR5cGUiIHBhY2thZ2UpCiAgICAgICAgICAgICAgaXMgZW1pdHRlZCBpbnN0ZWFkIG9mIHRoZSBwbGFpbiBzeW1ib2wuIEEgc2FtcGxlIHN3aWctbGlzcGlmeSAKICAgICAgICAgICAgICBpcyBwcm92aWRlZC4KICAgICAgICAgICAgLSBldmVyeSBzeW1ib2wgaXMgcHJlZml4ZWQgYnkgaXQncyBwYWNrYWdlLgoKMDQvMTMvMjAwNjogZWZ1enp5b25lCgkgICAgW2NmZmldCgkgICAgRml4ZWQgdGhlIGdlbmVyYXRpb24gb2Ygd3JhcHBlcnMgZm9yIGdsb2JhbCB2YXJpYWJsZXMuIAogICAgICAgICAgICBBZGRlZCB0aGUgb3B0aW9uIFtub11zd2lnLWxpc3Agd2hpY2ggdHVybnMgb24vb2ZmIGdlbmVyYXRpb24gCiAgICAgICAgICAgIG9mIGNvZGUgZm9yIHN3aWcgaGVscGVyIGxpc3AgbWFjcm8sIGZ1bmN0aW9ucywgZXRjLgoKVmVyc2lvbiAxLjMuMjkgKE1hcmNoIDIxLCAyMDA2KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgowNC8wNS8yMDA2OiBtdXRhbmRpegoJICAgIFthbGxlZ3JvY2xdCgkgICAgRml4IG91dHB1dCB0eXBlbWFwIG9mIGNoYXIgc28gaXQgcHJvZHVjZXMgYSBjaGFyYWN0ZXIgaW5zdGVhZAoJICAgIG9mIGFuIGludGVnZXIuIEFsc28gYWRkcyBpbnB1dC9vdXRwdXQgdHlwZW1hcHMgZm9yICdjaGFyIConLgoKCSAgICBhZGQgY29tbWFuZC1saW5lIGFyZ3VtZW50IC1pc29sYXRlIHRvIGdlbmVyYXRlIGFuIGludGVyZmFjZQoJICAgIGZpbGUgdGhhdCB3b24ndCBpbnRlcmZlcmUgd2l0aCBvdGhlciBTV0lHIGdlbmVyYXRlZCBmaWxlcyB0aGF0CgkgICAgbWF5IGJlIHVzZWQgaW4gdGhlIHNhbWUgYXBwbGljYXRpb24uCgowMy8yMC8yMDA1OiBtdXRhbmRpegoJICAgIFthbGxlZ3JvY2xdCgkgICAgTW9yZSB0d2Vha3MgdG8gSU5QVVQvT1VUUFVUIHR5cGVtYXBzIGZvciBib29sLgoKCSAgICBGaXggY29uc3RhbnRXcmFwcGVyIGZvciBjaGFyIGFuZCBzdHJpbmcgbGl0ZXJhbHMuCgoJICAgIGZpbmQtZGVmaW5pdGlvbiBrZXliaW5kaW5ncyBzaG91bGQgd29yayBpbiBFTEkvU0xJTUUuCgkgICAgT3V0cHV0IChpbi1wYWNrYWdlIDxtb2R1bGUtbmFtZT4pIHRvIGxpc3Agd3JhcHBlcgoJICAgIGluc3RlYWQgb2YgKGluLXBhY2thZ2UgIy4qc3dpZy1tb2R1bGUtbmFtZSopLgoKCSAgICBzbGlnaHQgcmV3b3JrIG9mIG11bHRpcGxlIHJldHVybiB2YWx1ZXMuCgoJICAgIGRvYyB1cGRhdGVzLgoKMDMvMTcvMjAwNTogbXV0YW5kaXoKCSAgICBbYWxsZWdyb2NsXQoJICAgIG1hbmdsZSBuYW1lcyBvZiBjb25zdGFudHMgZ2VuZXJhdGVkIHZpYSBjb25zdGFudFdyYXBwZXIuCgkgICAgCgkgICAgV2hlbiB1c2luZyBPVVRQVVQgdHlwZW1hcHMgYW5kIHRoZSBmdW5jdGlvbiBoYXMgYSBub24tdm9pZAoJICAgIHJldHVybiB2YWx1ZSwgaXQgc2hvdWxkIGJlIGZpcnN0IGluIHRoZSB2YWx1ZXMtbGlzdCwgZm9sbG93ZWQKCSAgICBieSB0aGUgT1VUUFVUIG1hcHBlZCB2YWx1ZXMuCgoJICAgIEZpeCBidWcgd2l0aCBib29sZWFuIHBhcmFtZXRlcnMsIHdoaWNoIG5lZWRlZCB0byBiZQoJICAgIHBhc3NlZCBpbiBhcyBpbnQgdmFsdWVzLCByYXRoZXIgdGhhbiBUIG9yIE5JTC4KCjAzLzE1LzIwMDY6IG11dGFuZGl6CgkgICAgW2FsbGVncm9jbF0KCSAgICBHZW5lcmF0ZSB3cmFwcGVycyBmb3IgY29uc3RhbnRzIHdoZW4gaW4gQysrIG9yIC1jd3JhcCBtb2RlLgoJICAgIE1ha2UgLWN3cmFwIHRoZSBkZWZhdWx0LCBzaW5jZSBpdCBpcyBtb3N0IGNvcnJlY3QuIFVzZXJzCgkgICAgY2FuIHVzZSB0aGUgLW5vY3dyYXAgb3B0aW9uIHRvIGF2b2lkIHRoZSBjcmVhdGlvbiBvZiBhIC5jeHgKCSAgICBmaWxlIHdoZW4gaW50ZXJmYWNpbmcgdG8gQyBjb2RlLgoKCSAgICBXaGVuIGluIC1ub2N3cmFwIG1vZGUsIGltcHJvdmUgdGhlIGhhbmRsaW5nIG9mIGNvbnZlcnRpbmcKIAkgICAgaW5maXggbGl0ZXJhbHMgdG8gcHJlZml4IG5vdGF0aW9uIGZvciBsaXNwLiBUaGlzIGlzIHZlcnkKCSAgICBiYXNpYyBhbmQgbm90IGxpa2VseSB0byBiZSBpbXByb3ZlZCB1cG9uIHNpbmNlIHRoaXMgb25seQoJICAgIGFwcGxpZXMgdG8gdGhlIC1ub2N3cmFwIGNhc2UuIExpdGVyYWxzIHdlIGNhbid0IGZpZ3VyZSBvdXQKCSAgICB3aWxsIHJlc3VsdCBpbiBhIHdhcm5pbmcgYW5kIGJlIGluY2x1ZGVkIGluIHRoZSBnZW5lcmF0ZWQKCSAgICBjb2RlLgoKCSAgICB2YWxpZElkZW50aWZpZXIgbm93IG1vcmUgY2xvc2VseSBhcHByb3hpbWF0ZXMgd2hhdCBtYXkgYmUKCSAgICBhIGxlZ2FsIGNvbW1vbiBsaXNwIHN5bWJvbC4KCgkgICAgRml4IHR5cGVtYXAgZXJyb3IgaW4gYWxsZWdyb2NsLnN3ZwoJICAgIAowMy8xMi8yMDA2OiBtdXRhbmRpegoJICAgIFthbGxlZ3JvY2xdCgkgICAgZml4IHVwIElOUFVUL09VVFBVVCB0eXBlbWFwcyBmb3IgYm9vbC4KCSAgICBHZW5lcmF0ZSBjKysgc3R5bGUgd3JhcHBlciBmdW5jdGlvbnMgZm9yIHN0cnVjdC91bmlvbiBtZW1iZXJzCgkgICAgd2hlbiAtY3dyYXAgb3B0aW9uIHNwZWNpZmllZC4KCjAzLzEwLzIwMDY6IG11dGFuZGl6CgkgICAgW2FsbGVncm9jbF0KCSAgICBGaXggYnVnIGluIEMgd3JhcHBlciBnZW5lcmF0aW9uIGludHJvZHVjZWQgYnkgbGFzdCBhbGxlZ3JvY2wKCSAgICBjb21taXQuCgowMy8xMC8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0KICAgICAgICAgICAgQ29tbWl0ICMxNDQ3MzM3IC0gRGVsZXRlIExvY2FsUmVmcyBhdCB0aGUgZW5kIG9mIGRpcmVjdG9yIG1ldGhvZHMgdG8gZml4IHBvdGVudGlhbCBsZWFrCgowMy8xMC8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzE0NDQ5NDkgLSBjb25maWd1cmUgZG9lcyBub3QgaG9ub3IgLS1wcm9ncmFtLXByZWZpeC4KICAgICAgICAgICAgUmVtb3ZlZCBub24tc3RhbmRhcmQgY29uZmlndXJlIG9wdGlvbiAtLXdpdGgtcmVsZWFzZS1zdWZmaXguIEZpeCB0aGUgYXV0b2NvbmYgc3RhbmRhcmQKICAgICAgICAgICAgb3B0aW9ucyAtLXByb2dyYW0tcHJlZml4IGFuZCAtLXByb2dyYW0tc3VmZml4IHdoaWNoIHdlcmUgYmVpbmcgc2hvd24gaW4gdGhlIGhlbHAsCiAgICAgICAgICAgIGJ1dCB3ZXJlIGJlaW5nIGlnbm9yZWQuIFVzZSAtLXByb2dyYW0tc3VmZml4IGluc3RlYWQgb2YgLS13aXRoLXJlbGVhc2Utc3VmZml4IG5vdy4KCjAzLzEwLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXQogICAgICAgICAgICBGaXggIzE0NDYzMTkgd2l0aCBwYXRjaCBmcm9tIGFuZHJlYXN0aCAtIG1vcmUgdGhhbiBvbmUgd3N0cmluZyBwYXJhbWV0ZXIgaW4gZGlyZWN0b3IgbWV0aG9kcwoKMDMvMDcvMjAwNjogbWtvZXBwZQoJICAgIFtHdWlsZV0gCgkgICAgRml4IGZvciBtb2R1bGUgbmFtZXMgY29udGFpbmluZyBhICItIiBpbiBub24tInNoYWRvdyIgbW9kZS4KCSAgICBQYXRjaCBmcm9tIEFhcm9uIFZhbkRldmVuZGVyICgjMTQ0MTQ3NCkuCgowMy8wNC8yMDA2OiBtbWF0dXMKCSAgICAtIEFkZCAtTyB0byB0aGUgbWFpbiBwcm9ncmFtLCB3aGljaCBub3cgZW5hYmxlcyAtZmFzdGRpc3BhdGNoCgkgICAgCgkgICAgW1B5dGhvbl0KCgkgICAgLSBBZGQgdGhlIC1mYXN0aW5pdCBvcHRpb24gdG8gZW5hYmxlIGZhc3RlciBfX2luaXRfXwogICAgICAgICAgICAgIG1ldGhvZHMuIFNldHRpbmcgJ3RoaXMnIGFzICdzZWxmLnRoaXMuYXBwZW5kKHRoaXMpJyBpbiB0aGUgcHl0aG9uCgkgICAgICBjb2RlIGNvbmZ1c2VzIFB5THVjZW5lLiBOb3cgdGhlIGluaXRpYWxpemF0aW9uIGlzIGRvbmUgaW4gdGhlCgkgICAgICB0aGUgQysrIHNpZGUsIGFzIHJlcG9ydGVkIGJ5IEFuZGkgYW5kIFJvYmluLgoKCSAgICAtIEFkZCB0aGUgLWZhc3RxdWVyeSBvcHRpb24gdG8gZW5hYmxlIGZhc3RlciBTV0lHX1R5cGVRdWVyeSB2aWEgYQogICAgICAgICAgICAgIHB5dGhvbiBkaWN0IGNhY2hlLCBhcyBwcm9wb3NlZCBieSBBbmRpIFZhamRhCgoJICAgIC0gQXZvaWQgdG8gY2FsbCBQeU9iamVjdF9HZXRBdHRyIGluc2lkZSBTV0lHX1B5dGhvbl9HZXRTd2lnVGhpcywKCSAgICAgIHNpbmNlIHRoaXMgY29uZnVzZXMgUHlMdWNlbmUsIGFzIHJlcG9ydGVkIGJ5IEFuZGkgVmFqZGEuCgkgICAgCjAzLzAyLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXQogICAgICAgICAgICBSZW1vdmVkIGV4dHJhICh2b2lkICopIGNhc3Qgd2hlbiBjYXN0aW5nIHBvaW50ZXJzIHRvIGFuZCBmcm9tIGpsb25nIGFzIHRoaXMKICAgICAgICAgICAgd2FzIHN1cHByZXNzaW5nIGdjYydzICJkZXJlZmVyZW5jaW5nIHR5cGUtcHVubmVkIHBvaW50ZXIgd2lsbCBicmVhayBzdHJpY3QtYWxpYXNpbmcgcnVsZXMiCiAgICAgICAgICAgIHdhcm5pbmcuIFRoaXMgd2FybmluZyBjb3VsZCBiZSBpZ25vcmVkIGluIHZlcnNpb25zIG9mIGdjYyBwcmlvciB0byA0LjAsIGJ1dCBub3cgdGhlCiAgICAgICAgICAgIHdhcm5pbmcgaXMgdXNlZnVsIGFzIGdjYyAtTzIgYW5kIGhpZ2hlciBvcHRpbWlzYXRpb24gbGV2ZWxzIGluY2x1ZGVzIC1mc3RyaWN0LWFsaWFzaW5nIHdoaWNoCiAgICAgICAgICAgIGdlbmVyYXRlcyBjb2RlIHRoYXQgZG9lc24ndCB3b3JrIHdpdGggdGhlc2UgY2FzdHMuIFRoZSBhc3NpZ25tZW50IGlzIHNpbXBseSBuZXZlciBtYWRlLgogICAgICAgICAgICBQbGVhc2UgdXNlIC1mbm8tc3RyaWN0LWFsaWFzaW5nIHRvIGJvdGggc3VwcHJlc3MgdGhlIHdhcm5pbmcgYW5kIGZpeCB0aGUgYmFkIGFzc2VtYmx5CiAgICAgICAgICAgIGNvZGUgZ2VuZXJhdGVkLiBOb3RlIHRoYXQgdGhlIHdhcm5pbmcgaXMgb25seSBnZW5lcmF0ZWQgYnkgdGhlIEMgY29tcGlsZXIsIGJ1dCBub3QKICAgICAgICAgICAgdGhlIEMrKyBjb21waWxlciwgeWV0IHRoZSBDKysgY29tcGlsZXIgd2lsbCBhbHNvIGdlbmVyYXRlIGJyb2tlbiBjb2RlLiBBbHRlcm5hdGl2ZWx5IHVzZSAKICAgICAgICAgICAgLVduby1zdHJpY3QtYWxpYXNpbmcgdG8gc3VwcHJlc3MgdGhlIHdhcm5pbmcgZm9yIGdjYy0zLnguIFRoZSB0eXBlbWFwcyBhZmZlY3RlZAogICAgICAgICAgICBhcmUgdGhlICJpbiIgYW5kICJvdXQiIHR5cGVtYXBzIGluIGphdmEuc3dnIGFuZCBhcnJheXNfamF2YS5zd2cuIFVzZXJzIG91Z2h0IHRvIGZpeAogICAgICAgICAgICB0aGVpciBvd24gdHlwZW1hcHMgdG8gZG8gdGhlIHNhbWUuIE5vdGUgdGhhdCByZW1vdmFsIG9mIHRoZSB2b2lkICogY2FzdCBzaW1wbHkgcHJldmVudHMKICAgICAgICAgICAgc3VwcHJlc3Npb24gb2YgdGhlIHdhcm5pbmcgZm9yIHRoZSBDIGNvbXBpbGVyIGFuZCBub3RoaW5nIGVsc2UuIFR5cGljYWwgY2hhbmdlOgoKICAgICAgICAgICAgRnJvbToKICAgICAgICAgICAgICAldHlwZW1hcChpbikgU1dJR1RZUEUgKiAleyAkMSA9ICooJCYxX2x0eXBlKSh2b2lkICopJiRpbnB1dDsgJX0KICAgICAgICAgICAgVG86CiAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIFNXSUdUWVBFICogJXsgJDEgPSAqKCQmMV9sdHlwZSkmJGlucHV0OyAlfQoKICAgICAgICAgICAgRnJvbToKICAgICAgICAgICAgICAldHlwZW1hcChvdXQpIFNXSUdUWVBFICogJXsgKigkJjFfbHR5cGUpKHZvaWQgKikmJHJlc3VsdCA9ICQxOyAlfSAKICAgICAgICAgICAgVG86CiAgICAgICAgICAgICAgJXR5cGVtYXAob3V0KSBTV0lHVFlQRSAqICV7ICooJCYxX2x0eXBlKSYkcmVzdWx0ID0gJDE7ICV9IAoKMDMvMDIvMjAwNjogbWtvZXBwZQoJICAgIFtHdWlsZSAtc2NtXQoJICAgIEFkZCB0eXBlbWFwcyBmb3IgImxvbmcgbG9uZyI7IHdoZXRoZXIgdGhlIGdlbmVyYXRlZCBjb2RlIGNvbXBpbGVzLCBob3dldmVyLCBkZXBlbmRzCgkgICAgb24gdGhlIHZlcnNpb24gYW5kIGNvbmZpZ3VyYXRpb24gb2YgR3VpbGUuCgowMy8wMi8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdCiAgICAgICAgICAgIEFkZCBzdXBwb3J0IGZvciBpbm5lciBleGNlcHRpb25zLiBJZiBhbnkgb2YgdGhlIGRlbGVnYXRlcyBhcmUgY2FsbGVkIHdoaWNoIGNvbnN0cnVjdAogICAgICAgICAgICBhIHBlbmRpbmcgZXhjZXB0aW9uIGFuZCB0aGVyZSBpcyBhbHJlYWR5IGEgcGVuZGluZyBleGNlcHRpb24sIGl0IHdpbGwgY3JlYXRlIHRoZSBuZXcKICAgICAgICAgICAgZXhjZXB0aW9uIHdpdGggdGhlIHBlbmRpbmcgZXhjZXB0aW9uIGFzIGFuIGlubmVyIGV4Y2VwdGlvbi4KCjAzLzAyLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQaHBdCiAgICAgICAgICAgIEFkZGVkIHN1cHBvcnQgZm9yIFBocDUgZXhjZXB0aW9ucyBpZiBjb21waWxpbmcgYWdhaW5zdCBQaHA1IChwYXRjaCBmcm9tIE9sbHkgQmV0dHMpLgoKMDMvMDEvMjAwNjogbW1hdHVzCgkgICAgVXNlIHRoZSBHQ0MgdmlzaWJpbGl0eSBhdHRyaWJ1dGUgaW4gU1dJR0VYUE9SVC4KCgkgICAgTm93IHlvdSBjYW4gY29tcGlsZSAod2l0aCBnY2MgMy40IG9yIGxhdGVyKSB1c2luZwoJICAgIENGTEFHUz0iLWZ2aXNpYmlsaXR5PWhpZGRlbiIuCgkgICAgCgkgICAgQ2hlY2sgdGhlIGRpZmZlcmVuY2UgZm9yIHRoZSAnc3RkX2NvbnRhaW5lcnMuaScgcHl0aG9uIAoJICAgIHRlc3QgY2FzZToKIAogICAgICAgICAgICBTaXplczoKCgkgICAgICAzMzA1NDMyIF9zdGRfY29udGFpbmVycy5zbwoJICAgICAgMjM4Mzk5MiBfc3RkX2NvbnRhaW5lcnMuc28uaGlkZGVuCgoJICAgIEV4cG9ydGVkIHN5bWJvbHMgKG5tIC1EIDxmaWxlPi5zbyB8IHdjIC1sKToKCiAgICAgICAgICAgICAgNjE0NiBfc3RkX2NvbnRhaW5lcnMuc28gCiAgICAgICAgICAgICAgMTc0ICBfc3RkX2NvbnRhaW5lcnMuc28uaGlkZGVuIAoKCSAgICBFeGNlY3V0aW9uIHRpbWVzOgoKCSAgICAgIHJlYWwgMG0wLjA1MHMgdXNlciAwbTAuMDM5cyBzeXMgMG0wLjAwNXMgICBfc3RkX2NvbnRhaW5lcnMuc28KICAgICAgICAgICAgICByZWFsIDBtMC4wMzlzIHVzZXIgMG0wLjAyNnMgc3lzIDBtMC4wMDdzICAgX3N0ZF9jb250YWluZXJzLnNvLmhpZGRlbgoKCSAgICBSZWFkIGh0dHA6Ly9nY2MuZ251Lm9yZy93aWtpL1Zpc2liaWxpdHkgZm9yIG1vcmUgZGV0YWlscy4KCgowMi8yNy8yMDA2OiBtdXRhbmRpegoJICAgIFthbGxlZ3JvY2xdCgkgICAgQWRkIHN1cHBvcnQgZm9yIElOUFVULCBPVVRQVVQsIGFuZCBJTk9VVCB0eXBlbWFwcy4KCSAgICBGb3IgT1VUUFVUIHZhcmlhYmxlcywgdGhlIGxpc3Agd3JhcHBlciByZXR1cm5zIG11bHRpcGxlCgkgICAgdmFsdWVzLgoKMDIvMjYvMjAwNjogbW1hdHVzCgoJICAgIFtSdWJ5XSBhZGQgYXJnY2FyZ3YuaSBsaWJyYXJ5IGZpbGUuCgkgICAgCgkgICAgVXNlIGl0IGFzIGZvbGxvdzoKCgkJJWluY2x1ZGUgYXJnY2FyZ3YuaQoJICAgICAgCQkJCQkJCQkJIAogICAJICAgICAgICAlYXBwbHkgKGludCBBUkdDLCBjaGFyICoqQVJHVikgeyAoc2l6ZV90IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2KSB9IAoJICAgICAgCQkJCQkJCQkJIAogICAJICAgICAgICAlaW5saW5lIHsJCQkJCiAgIAkgICAgICAgICAgaW50IG1haW5BcHAoc2l6ZV90IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2KSAJCiAgIAkgICAgICAgICAgewkJCQkJCQogICAJICAgICAgICAgICAgcmV0dXJuIGFyZ2M7CQkJCQkKICAgCSAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CQkJCQkJCQoJICAgICAgCQkJCQkJCQogICAJICAgIHRoZW4gaW4gdGhlIHJ1Ynkgc2lkZToJCQkJCQoJICAgICAgCQkJCQkJCQkKICAgCSAgICAgICAgYXJncyA9IFsiYXNkZiIsICJhc2RmMiJdCQkJCQogICAJICAgICAgICBuID0gbWFpbkFwcChhcmdzKTsKCQoKCSAgICBUaGlzIGlzIHRoZSBzaW1pbGFyIHRvIHRoZSBweXRob24gdmVyc2lvbiBMaWIvcHl0aG9uL2FyZ2Nhcmd2LmkKCjAyLzI0LzIwMDY6IG1nb3NzYWdlCgoJICAgIFNtYWxsIHVwZGF0ZSBMdWEgZG9jdW1lbnRzIG9uIHRyb3VibGVzaG9vdGluZyBwcm9ibGVtcwoJICAgIAowMi8yMi8yMDA2OiBtbWF0dXMgCgoJICAgIEZpeCBhbGwgdGhlIGVycm9ycyByZXBvcnRlZCBmb3IgMS4zLjI4LgoJICAgIC0gZml4IGJ1ZyAjMTE1ODE3OAoJICAgIC0gZml4IGJ1ZyAjMTA2MDc4OQoJICAgIC0gZml4IGJ1ZyAjMTI2MzQ1NwoJICAgIC0gZml4ICdjb25zdCAgY2hhciomJyB0eXBlbWFwIGluIHRoZSBVVEwsIHJlcG9ydGVkIGJ5IEdlb2ZmIEh1dGNoaXNvbgoJICAgIC0gZml4ZXMgZm9yIHB5dGhvbiAyLjEgYW5kIHRoZSBydW50aW1lIGxpYnJhcnkKCSAgICAtIGZpeCBjb3B5Y3RvciArIHRlbXBsYXRlIGJ1ZyAjMTQzMjEyNQoJICAgIC0gZml4IFsgMTQzMjE1MiBdICVyZW5hbWUgZnJpZW5kIG9wZXJhdG9ycyBpbiBuYW1lc3BhY2UKCSAgICAtIGZpeCBnY2Mgd2FybmluZyByZXBvcnRlZCBieSBSLiBCZXJuc3RlaW4KCSAgICAtIGF2b2lkIGFzc2VydCB3aGVuIGZpbmRpbmcgYSByZWN1cnNpdmUgc2NvcGUgaW5oZXJpdGFuY2UsCgkgICAgICBlbWl0IGEgd2FybmluZyBpbiB0aGUgd29yc3QgY2FzZSwgcmVwb3J0ZWQgYnkgTml0cm8gCgkgICAgLSBmaXggcHJlbWF0dXJlIG9iamVjdCBkZWxldGlvbiByZXBvcnRlZCBieSBQYXVsIGluIHRjbDNkCgkgICAgLSBmaXggd2FybmluZyByZXBvcnRlZCBieSBOaXRybyBpbiBWQzcKCSAgICAtIG1vcmUgZml4ZXMgZm9yIG9sZCBTb2xhcmlzIGNvbXBpbGVyCgkgICAgLSBmaXggZm9yIHB5dGhvbiAyLjMgYW5kIGdjX3JlZnMgaXNzdWUgcmVwb3J0ZWQgYnkgTHVpZ2kKCSAgICAtIGZpeCBmYXN0cHJveHkgZm9yIG1ldGhvZHMgdXNpbmcga3dhcmdzCgkgICAgLSBmaXggb3ZlcmxvYWQgKyBwcm90ZWN0ZWQgbWVtYmVyIGlzc3VlIHJlcG9ydGVkIGJ5IENvbGluIE1jRG9uYWxkCgkgICAgLSBmaXggc2V0ZXJyb3Jtc2cgYXMgcmVwb3J0ZWQgYnkgQ29saW4gTWNEb25hbGQKCSAgICAtIGZpeCBkaXJlY3RvcnMsIG5vdyB0aGUgdGVzdC1zdWl0ZSBydW5zIGFnYWluIHVzaW5nIC1kaXJlY3RvcnMKCSAgICAtIGZpeCBmb3IgZnJpZW5kIG9wZXJhdG9yIGFuZCBWaXN1YWwgc3R1ZGlvIGFuZCBidWcgMTQzMjE1MgoJICAgIC0gZml4IGJ1ZyAjMTQzNTA5MAoJICAgIC0gZml4IHVzaW5nICsgJWV4dGVuZCBhcyByZXBvcnRlZCBieSBXaWxsaWFtCgkgICAgLSBmaXggYnVnICMxMDk0OTY0CgkgICAgLSBmaXggZm9yIFB5X05vdEltcGxlbWVudGVkIGFzIHJlcG9ydGVkIGJ5IE9sbHkgYW5kIEFtYXVyeQoJICAgIC0gZml4IG5lc3RlZCBuYW1lc3BhY2UgaXNzdWUgcmVwb3J0ZWQgYnkgQ2hhcmxpZQoKCSAgICBhbmQgYWxzbzoKCSAgICAKCSAgICAtIGFsbG93IGRpcmVjdG9yIHByb3RlY3RlZCBtZW1iZXJzIGJ5IGRlZmF1bHQKCSAgICAtIGRlbGV0ZSBleHRyYSBuZXcgbGluZXMgaW4gc3dpZ21hY3Jvc1tVVExdCgkgICAgLSBjb3NtZXRpYyBmb3IgZ2VuZXJhdGVkIHB5dGhvbiBjb2RlCgkgICAgLSBhZGQgdGhlIGZhY3RvcnkuaSBsaWJyYXJ5IGZvciBVVEwKCSAgICAtIGFkZCBzd2lncmVnaXN0ZXIgcHJveHkgbWV0aG9kIGFuZCBtb3ZlIF9fcmVwcl9fIHRvIGEKCSAgICAgIHNpbmdsZSBnbG9iYWwgbW9kdWxlICBbcHl0aG9uXQoKMDIvMjIvMjAwNjogbW1hdHVzIAoKCSAgICBXaGVuIHVzaW5nIGRpcmVjdG9ycywgbm93IHN3aWcgd2lsbCBlbWl0IGFsbCB0aGUgdmlydHVhbAoJICAgIHByb3RlY3RlZCBtZXRob2RzIGJ5IGRlZmF1bHQuIAoKCSAgICBJbiBwcmV2aW91cyByZWxlYXNlcywgeW91IG5lZWRlZCB0byB1c2UgdGhlICdkaXJwcm90JwoJICAgIG9wdGlvbiB0byBhY2hlaXZlIHRoZSBzYW1lLgoKCSAgICBJZiB5b3Ugd2FudCwgeW91IGNhbiBkaXNhYmxlIHRoZSBuZXcgZGVmYXVsdCBiZWhhdmlvdXIsCgkgICAgdXNlIHRoZSAnbm9kaXJwcm90JyBvcHRpb246IAoKCSAgICAgICBzd2lnIC1ub2RpcnByb3QgLi4uCgoJICAgIGFuZC9vciB0aGUgJW5vZGlyZWN0b3IgZmVhdHVyZSBmb3Igc3BlY2lmaWMgbWV0aG9kcywgaS5lLjoKCgkgICAgICAgJW5vZGlyZWN0b3IgRm9vOjpiYXI7CgoJICAgICAgIHN0cnVjdCBGb28gewoJICAgICAgICAgdmlydHVhbCB+Rm9vKCk7CgoJICAgICAgIHByb3RlY3RlZDoKCSAgICAgICAgIHZpcnR1YWwgdm9pZCBiYXIoKTsKCSAgICAgICB9OwoJICAgIAoKCSAgICBBcyBiZWZvcmUsIHB1cmUgYWJzdHJhY3QgcHJvdGVjdGVkIG1lbWJlcnMgYXJlIGFsbHdheXMKCSAgICBlbWl0dGVkLCBpbmRlcGVuZGVudCBvZiB0aGUgJ2RpcnByb3Qvbm9kaXJwcm90JyBvcHRpb25zLgoKCjAyLzIyLzIwMDY6IG1tYXR1cwoJICAgIEFkZCB0aGUgZmFjdG9yeS5pIGxpYnJhcnkgZm9yIGxhbmd1YWdlcyB1c2luZyB0aGUgVVRMIChweXRob24sdGNsLHJ1YnkscGVybCkuCgkgICAgCiAgICAgICAgICAgIGZhY3RvcnkuaSBpbXBsZW1lbnRzIGEgbW9yZSBuYXR1cmFsIHdyYXAgZm9yIGZhY3RvcnkgbWV0aG9kcy4gCgoJICAgIEZvciBleGFtcGxlLCBpZiB5b3UgaGF2ZToJCQkJCQkJICAgIAoJICAgIAkJCQkJCQkJICAgIAogIAkgICAgLS0tLSAgZ2VvbWV0cnkuaCAtLS0tLS0tLQkJCQkJICAgIAogIAkgICAgICAgICBzdHJ1Y3QgR2VvbWV0cnkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgCQkgICAgCiAgCSAgICAgICAgICAgZW51bSBHZW9tVHlwZXsJCQkgICAgIAkJCSAgICAKICAJICAgICAgICAgICAgIFBPSU5ULAkJCQkgICAgIAkJICAgIAogIAkgICAgICAgICAgICAgQ0lSQ0xFCQkJCSAgICAgCQkgICAgCiAgCSAgICAgICAgICAgfTsJCQkJCSAgICAgCQkgICAgCiAgCSAgICAgICAgICAgCQkJCQkgICAgIAkJICAgIAogIAkgICAgICAgICAgIHZpcnR1YWwgfkdlb21ldHJ5KCkge30gICAgCQkgICAgIAkJICAgIAogIAkgICAgICAgICAgIHZpcnR1YWwgaW50IGRyYXcoKSA9IDA7CQkJCSAgICAKICAJICAgIAkgCQkJCQkJCSAgICAKICAJICAgIAkgLy8JCQkJCQkJICAgIAogIAkgICAgCSAvLyBGYWN0b3J5IG1ldGhvZCBmb3IgYWxsIHRoZSBHZW9tZXRyeSBvYmplY3RzCQkgICAgCiAgCSAgICAJIC8vCQkJCQkJCSAgICAKICAJICAgICAgICAgICBzdGF0aWMgR2VvbWV0cnkgKmNyZWF0ZShHZW9tVHlwZSBpKTsgICAgIAkJICAgIAogIAkgICAgICAgICB9OwkJCQkJICAgICAJCSAgICAKICAJICAgICAgICAgCQkJCQkgICAgIAkJCSAgICAKICAJICAgICAgICAgc3RydWN0IFBvaW50IDogR2VvbWV0cnkgIHsJCSAgICAgCQkgICAgCiAgCSAgICAgICAgICAgaW50IGRyYXcoKSB7IHJldHVybiAxOyB9CQkgICAgIAkJICAgIAogIAkgICAgICAgICAgIGRvdWJsZSB3aWR0aCgpIHsgcmV0dXJuIDEuMDsgfSAgICAJICAgICAJCSAgICAKICAJICAgICAgICAgfTsJCQkJCSAgICAgCQkgICAgCiAgCSAgICAgICAgIAkJCQkJICAgICAJCQkgICAgCiAgCSAgICAgICAgIHN0cnVjdCBDaXJjbGUgOiBHZW9tZXRyeSAgewkJICAgICAJCSAgICAKICAJICAgICAgICAgICBpbnQgZHJhdygpIHsgcmV0dXJuIDI7IH0JCSAgICAgCQkgICAgCiAgCSAgICAgICAgICAgZG91YmxlIHJhZGl1cygpIHsgcmV0dXJuIDEuNTsgfSAgICAgICAgICAJCSAgICAKICAJICAgICAgICAgfTsgCQkJCQkgICAgIAkJICAgIAogIAkgICAgICAgICAJCQkJCQkJCSAgICAKICAJICAgICAgICAgLy8JCQkJCQkJICAgIAogIAkgICAgICAgICAvLyBGYWN0b3J5IG1ldGhvZCBmb3IgYWxsIHRoZSBHZW9tZXRyeSBvYmplY3RzCQkgICAgCiAgCSAgICAgICAgIC8vCQkJCQkJCSAgICAKICAJICAgICAgICAgR2VvbWV0cnkgKkdlb21ldHJ5OjpjcmVhdGUoR2VvbVR5cGUgdHlwZSkgewkJICAgIAogIAkgICAgICAgICAgIHN3aXRjaCAodHlwZSkgewkJCSAgICAgCQkgICAgCiAgCSAgICAgICAgICAgY2FzZSBQT0lOVDogcmV0dXJuIG5ldyBQb2ludCgpOwkgICAgIAkJICAgIAogIAkgICAgICAgICAgIGNhc2UgQ0lSQ0xFOiByZXR1cm4gbmV3IENpcmNsZSgpOyAJICAgICAJCSAgICAKICAJICAgICAgICAgICBkZWZhdWx0OiByZXR1cm4gMDsJCQkgICAgIAkJICAgIAogIAkgICAgICAgICAgIH0JCQkJCSAgICAgCQkgICAgCiAgCSAgICAgICAgIH0JCQkJCSAgICAJCSAgICAKICAJICAgIC0tLS0gIGdlb21ldHJ5LmggLS0tLS0tLS0JCQkJCSAgICAKCSAgICAJCQkJCQkJCSAgICAKCSAgICAJCQkJCQkJCSAgICAKCSAgICBZb3UgY2FuIHVzZSB0aGUgJWZhY3Rvcnkgd2l0aCB0aGUgR2VvbWV0cnk6OmNyZWF0ZSBtZXRob2QgYXMgZm9sbG93czoKCSAgICAJCQkJCQkJCSAgICAKICAJICAgICAgJW5ld29iamVjdCBHZW9tZXRyeTo6Y3JlYXRlOwkJCQkgICAgCiAgCSAgICAgICVmYWN0b3J5KEdlb21ldHJ5ICpHZW9tZXRyeTo6Y3JlYXRlLCBQb2ludCwgQ2lyY2xlKTsJICAgIAogIAkgICAgICAlaW5jbHVkZSAiZ2VvbWV0cnkuaCIJCQkJCSAgICAKCSAgICAJCQkJCQkJCSAgICAKICAJICAgIGFuZCBHZW9tZXRyeTo6Y3JlYXRlIHdpbGwgcmV0dXJuIGEgJ1BvaW50JyBvciAnQ2lyY2xlJyBpbnN0YW5jZSAgIAogIAkgICAgaW5zdGVhZCBvZiB0aGUgcGxhaW4gJ0dlb21ldHJ5JyB0eXBlLiBGb3IgZXhhbXBsZSwgaW4gcHl0aG9uOgkgICAgCgkgICAgCQkJCQkJCQkgICAgCiAgCSAgICAgIGNpcmNsZSA9IEdlb21ldHJ5LmNyZWF0ZShHZW9tZXRyeS5DSVJDTEUpCQkJICAgIAogIAkgICAgICByID0gY2lyY2xlLnJhZGl1cygpCQkJCQkJICAgIAoJICAgIAkJCQkJCQkJICAgIAogIAkgICAgd2hlcmUgJ2NpcmNsZScgbm93IGlzIGEgQ2lyY2xlIHByb3h5IGluc3RhbmNlLgkgICAgCQkgICAgCgoKMDIvMTcvMjAwNjogbWtvZXBwZQoJICAgIFtNelNjaGVtZV0gVHlwZW1hcHMgZm9yIGFsbCBpbnRlZ3JhbCB0eXBlcyBub3cgYWNjZXB0IHRoZSBmdWxsIHJhbmdlIG9mIGludGVncmFsCgkgICAgdmFsdWVzLCBhbmQgdGhleSBzaWduYWwgYW4gZXJyb3Igd2hlbiBhIHZhbHVlIG91dHNpZGUgdGhlIHZhbGlkIHJhbmdlIGlzIHBhc3NlZC4KCSAgICBbR3VpbGVdIFR5cGVtYXBzIGZvciBhbGwgaW50ZWdyYWwgdHlwZXMgbm93IHNpZ25hbCBhbiBlcnJvciB3aGVuIGEgdmFsdWUgb3V0c2lkZQoJICAgIHRoZSB2YWxpZCByYW5nZSBpcyBwYXNzZWQuCgowMi8xMy8yMDA2OiBtZ29zc2FnZQogICAgICAgICAgICBbRG9jdW1lbnRzXSB1cGRhdGVkIHRoZSBleHRlbmRpbmcgZG9jdW1lbnRzIHRvIGdpdmUgYSBza2VsZXRvbiBzd2lnZ2luZyBjb2RlCiAgICAgICAgICAgIHdpdGggYSBmZXcgdHlwZW1hcHMuCiAgICAgICAgICAgIFtMdWFdIGFkZGVkIGFuIGV4dHJhIHR5cGVtYXAgZm9yIHZvaWQqIFtpbl0sIHNvIGEgZnVuY3Rpb24gd2hpY2ggcmVxdWlyZXMgYSB2b2lkKgogICAgICAgICAgICBjYW4gdGFrZSBhbnkga2luZCBvZiBwb2ludGVyCgpWZXJzaW9uIDEuMy4yOCAoRmVicnVhcnkgMTIsIDIwMDYpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjAyLzExLzIwMDY6IG1tYXR1cwoJICAgIEZpeCBtYW55IGlzc3VlcyB3aXRoIGxpbmUgY291bnRpbmcgYW5kIGVycm9yIHJlcG9ydHMuCgowMi8xMS8yMDA2OiBtbWF0dXMKCSAgICBbUHl0aG9uXSBCZXR0ZXIgc3RhdGljIGRhdGEgbWVtYmVyIHN1cHBvcnQsIGlmIHlvdSBoYXZlCgkgICAgCiAgICAgICAgICAgICAgICBzdHJ1Y3QgRm9vIHsKICAgICAgICAgICAgICAgICAgc3RhdGljIGludCBiYXI7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgdGhlbiBub3cgaXMgdmFsaWQgdG8gYWNjZXNzIHRoZSBzdGF0aWMgZGF0YSBtZW1iZXIsIGllOgoKICAgICAgICAgICAgICAgIGYgPSBGb28oKQogICAgICAgICAgICAgICAgZi5iYXIgPSAzCgoJICAgIGp1c3QgYXMgaW4gQysrLgoKCjAyLzExLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQZXJsXQogICAgICAgICAgICBGaXhlZCBjb2RlIGdlbmVyYXRpb24gdG8gd29yayBhZ2FpbiB3aXRoIG9sZCB2ZXJzaW9ucyBvZiBQZXJsCiAgICAgICAgICAgICg1LjAwNCBhbmQgbGF0ZXIgdGVzdGVkKQoKMDIvMDQvMjAwNjogbW1hdHVzCgkgICAgW1B5dGhvbl0gQWRkIHRoZSAlZXh0ZW5kX3NtYXJ0X3BvaW50ZXIoKSBkaXJlY3RpdmUgdG8gZXh0ZW5kCgkgICAgU1dJRyBzbWFydCBwb2ludGVyIHN1cHBvcnQgaW4gcHl0aG9uLiAKCgkgICAgRm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlIGEgc21hcnQgcG9pbnRlciBhczoKCSAgICAKCSAgICAgIHRlbXBsYXRlIDxjbGFzcyBUeXBlPiBjbGFzcyBSQ1B0ciB7CgkgICAgICBwdWJsaWM6CgkgICAgICAgIC4uLgoJICAgICAgICBSQ1B0cihUeXBlICpwKTsKCQlUeXBlICogb3BlcmF0b3ItPigpIGNvbnN0OwoJCS4uLgoJICAgICAgfTsKCSAgICAgIAoJICAgIHlvdSB1c2UgdGhlICVleHRlbmRfc21hcnRfcG9pbnRlciBkaXJlY3RpdmUgYXM6CgkgICAgCgkgICAgICAlZXh0ZW5kX3NtYXJ0X3BvaW50ZXIoUkNQdHI8QT4pOwoJICAgICAgJXRlbXBsYXRlKFJDUHRyX0EpICBSQ1B0cjxBPjsKCSAgICAKCSAgICB0aGVuLCBpZiB5b3UgaGF2ZSBzb21ldGhpbmcgbGlrZToKCgkgICAgICBSQ1B0cjxBPiBtYWtlX3B0cigpOwoJICAgICAgaW50IGZvbyhBICopOwoKCSAgICB5b3UgY2FuIGRvIHRoZSBmb2xsb3dpbmc6CgoJICAgICAgYSA9IG1ha2VfcHRyKCk7CgkgICAgICBiID0gZm9vKGEpOwoKICAgICAgICAgICAgaWUsIHN3aWcgd2lsbCBhY2NlcHQgYSBSQ1B0cjxBPiBvYmplY3Qgd2hlcmUgYSAnQSAqJyBpcwogICAgICAgICAgICBleHBlY3RlZC4KCgkgICAgQWxzbywgd2hlbiB1c2luZyB2ZWN0b3JzCgkgICAgCgkgICAgICAlZXh0ZW5kX3NtYXJ0X3BvaW50ZXIoUkNQdHI8QT4pOwoJICAgICAgJXRlbXBsYXRlKFJDUHRyX0EpIFJDUHRyPEE+OwoJICAgICAgJXRlbXBsYXRlKHZlY3Rvcl9BKSBzdGQ6OnZlY3RvcjxSQ1B0cjxBPiA+OwoJCQoJICAgIHlvdSBjYW4gdHlwZQoKCSAgICAgIGEgPSBBKCk7CgkgICAgICB2ID0gdmVjdG9yX0EoMikKCSAgICAgIHZbMF0gPSBhCgogICAgICAgICAgICBpZSwgYW4gJ0EgKicgb2JqZWN0IGlzIGFjY2VwdGVkLCB2aWEgaW1wbGljaXQgY29udmVyc2lvbiwgCgkgICAgd2hlcmUgYSBSQ1B0cjxBPiBvYmplY3QgaXMgZXhwZWN0ZWQuIEFkZGl0aW9uYWxseQoKCSAgICAgIHggPSB2WzBdCgoJICAgIHJldHVybnMgKGFuZCBzZXRzICd4JyBhcykgYSBjb3B5IG9mIHZbMF0sIG1ha2luZyByZWZlcmVuY2UKCSAgICBjb3VudGluZyBwb3NzaWJsZSBhbmQgY29uc2lzdGVudC4KCgkgICAgJWV4dGVuZF9zbWFydF9wb2ludGVyIGlzIGp1c3QgYSBjb2xsZWN0aW9ucyBvZiBuZXcvb2xkCgkgICAgdHJpY2tzLCBpbmNsdWRpbmcgJXR5cGVtYXBzIGFuZCB0aGUgbmV3ICVpbXBsaWNpdGNvbnYKCSAgICBkaXJlY3RpdmUuCgowMi8wMi8yMDA2OiBtZ29zc2FnZQogICAgICAgICAgICBidWdmaXggIzEzNTY1NzcsIGNoYW5nZWQgZG91YmxlPT5sdWFfbnVtYmVyIGluIGEgZmV3IHBsYWNlcy4KICAgICAgICAgICAgYWRkZWQgdGhlIHN0ZDo6cGFpciB3cmFwcGluZwoKMDEvMzAvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgc3RkOjpzdHJpbmcgYW5kIHN0ZDo6d3N0cmluZyBtZW1iZXIgdmFyaWFibGVzIGFuZCBnbG9iYWwgdmFyaWFibGVzIG5vdyB1c2UKICAgICAgICAgICAgJW5hdHVyYWx2YXIgYnkgZGVmYXVsdCwgbWVhbmluZyB0aGV5IHdpbGwgbm93IGJlIHdyYXBwZWQgYXMgZXhwZWN0ZWQgaW4gYWxsIGxhbmd1YWdlcy4KICAgICAgICAgICAgUHJldmlvdXNseSB0aGVzZSB3ZXJlIHdyYXBwZWQgYXMgYSBwb2ludGVyIHJhdGhlciB0aGFuIGEgdGFyZ2V0IGxhbmd1YWdlIHN0cmluZy4KICAgICAgICAgICAgSXQgaXMgbm8gbG9uZ2VyIG5lY2Vzc2FyeSB0byBhZGQgdGhlIGZvbGxvd2luZyB3b3JrYXJvdW5kIHRvIHdyYXAgdGhlc2UgYXMgc3RyaW5nczoKCgkJJWFwcGx5IGNvbnN0IHN0ZDo6c3RyaW5nICYgeyBzdGQ6OnN0cmluZyAqfQoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgICoqKgoKMDEvMjgvMjAwNjogbWtvZXBwZQoJICAgIFtHdWlsZSAtc2NtXSAKCSAgICBBZGQgdHlwZW1hcHMgZm9yIGhhbmRsaW5nIG9mIG1lbWJlciBmdW5jdGlvbiBwb2ludGVycy4KCjAxLzI0LzIwMDY6IG1tYXR1cwoJICAgIC0gQmV0dGVyIHN1cHBvcnQgZm9yIHRoZSAlbmF0dXJhbHZhciBkaXJlY3RpdmUsIG5vdyBpdAoJICAgICAgd29ya3Mgd2l0aCB0aGUgc2NyaXB0aW5nIGxhbmd1YWdlcyBhcyB3ZWxsIGFzCgkgICAgICBKYXZhL0MjLgoJICAgICAgCgkgICAgICBOb3csIGl0IGNhbiBhbHNvIGJlIGFwcGxpZWQgdG8gY2xhc3MgdHlwZXM6CgoJICAgICAgICAlbmF0dXJhbHZhciBzdGQ6OnN0cmluZzsKCSAgICAgICAgJWluY2x1ZGUgPHN0ZF9zdHJpbmcuaT4KCSAgICAgIAogICAgICAgICAgICAgIHRoYXQgd2lsbCB0ZWxsIHN3aWcgdG8gdXNlIHRoZSB0aGUgJ25hdHVyYWwnIHdyYXBwaW5nCiAgICAgICAgICAgICAgbWVjaGFuaXNtIHRvIGFsbCBzdGQ6OnN0cmluZyBnbG9iYWwgYW5kIG1lbWJlcgogICAgICAgICAgICAgIHZhcmlhYmxlcy4KCgkgICAgLSBBZGQgc3VwcG9ydCBmb3IgdGhlICVhbGxvd2V4Y2VwdCBmZWF0dXJlIGFsb25nIHRoZQogICAgICAgICAgICAgIHNjcmlwdGluZyBsYW5ndWFnZXMsIHdoaWNoIGFsbG93cyB0aGUgJWV4Y2VwdGlvbiBmZWF0dXJlCiAgICAgICAgICAgICAgdG8gYmUgYXBwbGllZCB0byB0aGUgdmFyaWFibGUgYWNjZXNzIG1ldGhvZHMuIEFsc28sIGFkZAogICAgICAgICAgICAgIHRoZSAlZXhjZXB0aW9udmFyIGRpcmVjdGl2ZSB0byBzcGVjaWZ5IGEgZGlzdGludGljCiAgICAgICAgICAgICAgZXhjZXB0aW9uIG1lY2hhbmlzbSBvbmx5IGZvciB2YXJpYWJsZXMuCgkgICAgICAKCSAgICAKCSAgICAtIEFkZCBtb3JlIGRvY3MgZm9yIHRoZSAlZGVsb2JqZWN0IGRpcmVjdGl2ZSB0byBtYXJrIGEgbWV0aG9kIGFzIGEKCSAgICAgIGRlc3RydWN0b3IsICdkaXNvd25pbmcnIHRoZSBmaXJzdCBhcmd1bWVudC4gRm9yIGV4YW1wbGU6CgoJICAgICAgICAlbmV3b2JqZWN0IGNyZWF0ZV9mb287CgkgICAgICAgICVkZWxvYmplY3QgZGVzdHJveV9mb287CgoJICAgICAgICBGb28gKmNyZWF0ZV9mb28oKSB7IHJldHVybiBuZXcgRm9vKCk7IH0KCSAgICAgICAgdm9pZCBkZXN0cm95X2ZvbyhGb28gKmZvbykgeyBkZWxldGUgZm9vOyB9CgoJICAgICAgb3IgaW4gYSBtZW1iZXIgbWV0aG9kIGFzOgoKCSAgICAgICAgJWRlbG9iamVjdCBGb286OmRlc3Ryb3k7CgoJICAgICAgICBjbGFzcyBGb28gewoJICAgICAgICBwdWJsaWM6CgkgICAgICAgICAgdm9pZCBkZXN0cm95KCkgeyBkZWxldGUgdGhpczt9CgoJICAgICAgICBwcml2YXRlOgoJICAgICAgICAgIH5Gb28oKTsKICAgICAgICAgICAgICAgfTsKCgowMS8yNC8yMDA2OiBtZ29zc2FnZQogICAgICAgICAgICBbTHVhXQoJICAgIC0gUmVtb3ZlZCB0aGUgdHlwZSBzd2lnX2x1YV9jb21tYW5kX2luZm8gJiByZXBsYWNlIHdpdGggbHVhTF9yZWcKCSAgICAgICh3aGljaCB0aGVuIGJyb2tlIHRoZSBjb2RlKSwgZml4ZWQgdGhpcwoJICAgIC0gYWRkZWQgYW4gYWRkaXRpb25hbCBjYXN0IGluIHRoZSB0eXBlbWFwcyBmb3IgZW51bSdzCgkgICAgICBkdWUgdG8gdGhlIGlzc3VlIHRoYXQgVkMuTmV0IHdpbGwgbm90IGFsbG93IGNhc3Rpbmcgb2YKCSAgICAgIGEgZG91YmxlIHRvIGFuIGVudW0gZGlyZWN0bHkuIFRoZXJlZm9yZSBjYXN0IHRvIGludCB0aGVuIHRvIGVudW0KCSAgICAgICh0aGFua3MgdG8gSmFzb24gUmVnbyBmb3IgdGhpcyBvYnNlcnZhdGlvbikKCjAxLzE2LzIwMDY6IG1tYXR1cyAoQ2hhbmdlIGRpc2FibGVkLi4uIHdpbGwgYmUgYmFjayBpbiBDVlMgc29vbikKCSAgICBBZGQgaW5pdGlhbCBzdXBwb3J0IGZvciByZWdleHAgdmlhIHRoZSBleHRlcm5hbCBsaWJyYXJ5CgkgICAgUnhTcGVuY2VyLiBTV0lHIGRvZXNuJ3QgcmVxdWlyZSB0aGlzIGxpYnJhcnkgdG8gY29tcGlsZQoJICAgIGFuZC9vciBydW4uIEJ1dCBpZiB5b3Ugc3BlY2lmeSAtLXdpdGgtcnhzcGVuY2VyLCBhbmQgdGhlCgkgICAgbGlicmFyeSBpcyBmb3VuZCBkdXJpbmcgaW5zdGFsbGF0aW9uLCB0aGVuIHN3aWcgd2lsbCB1c2UKCSAgICBpdCBpbiB0aHJlZSBwbGFjZXM6CgoJICAgIC0gSW4gJXJlbmFtZXMgcnVsZXMsIHZpYSB0aGUgbmV3IHJ4c21hdGNoIHJ1bGVzLCBmb3IgZXhhbXBsZToKCSAgICAJICAKCSAgICAJICAlcmVuYW1lKCIlKGxvd2VyY2FzZSkiLHJ4c21hdGNoJG5hbWU9IkdTTF8uKiIpICIiOwoJICAgIAkgICVyZW5hbWUoIiUobG93ZXJjYXNlKSIscnhzbWF0Y2gkbm9kZVR5cGU9ImVudW0gR1NMXy4qIikgIiI7CgkgICAgCSAKICAgICAgICAgICAgICByeHNtYXRjaCBpcyBzaW1pbGFyIHRvIHRoZSBtYXRjaCBydWxlLCBpdCBqdXN0IHVzZXMKICAgICAgICAgICAgICB0aGUgUnhTcGVuY2VyIHJlZ2V4cCBsaWJyYXJ5IHRvIGRlY2lkZSBpZiB0aGVyZSBpcyBhCiAgICAgICAgICAgICAgbWF0Y2ggd2l0aCB0aGUgcHJvdmlkZWQgcmVnZXhwLiBBcyB3aXRoIHRoZSBtYXRjaAogICAgICAgICAgICAgIHJ1bGUsIHlvdSBjYW4gYWxzbyB1c2UgdGhlIG5lZ2F0ZSBydWxlIG5vdHJ4c21hdGNoLgoKCSAgICAtIEluIHRoZSAlcmVuYW1lIHRhcmdldCBuYW1lIHZpYSB0aGUgcnhzdGFyZ2V0IG9wdGlvbiwgZm9yIGV4YW1wbGU6CgkgICAgCQkgCgkgICAgCSAgJXJlbmFtZSgiJShsb3dlcmNhc2UpIixyeHN0YXJnZXQ9MSkgIkdTTF8uKiI7CgoJICAgIAl3aGVyZSB0aGUgdGFyZ2V0IG5hbWUgIkdTTC4qIiBpcyBub3cgdW5kZXJzdG9vZCBhcyBhCgkgICAgCXJlZ2V4cCB0byBiZSBtYXRjaGVkLiAgCgkgICAgCSAKICAgICAgICAgICAgLSBJbiB0aGUgbmV3IGVuY29kZXIgInJ4c3BlbmNlciIsIHdoaWNoIGxvb2tzIGxpa2U6CgoJICAgIAkgICUocnhzcGVuY2VyOltyZWdleHBdW3JlcGxhY2VdKXMKCgkgICAgCXdoZXJlICJyZWdleHAiIGlzIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gYW5kICJyZXBsYWNlIgoJICAgIAlpcyBhIHN0cmluZyB1c2VkIGFzIGEgcmVwbGFjZW1lbnQsIHdoZXJlIHRoZSBAMCxAMSwuLi4sQDkKCSAgICAJcHNldWRvIGFyZ3VtZW50cyBhcmUgdXNlZCB0byByZXByZXNlbnQgdGhlCgkgICAgCWNvcnJlc3BvbmRpbmcgbWF0Y2hpbmcgaXRlbXMgaW4gdGhlIHJlZyBleHByZXNzaW9uLgoKCSAgICAJRm9yIGV4YW1wbGU6CgkgICAgCQkgICAgICAKCSAgICAgICAgJShyeHNwZW5jZXI6W0dTTC4qXVtAMF0pcyAgICAgICA8LSBIZWxsbyAgICAtPiAKCSAgICAgICAgJShyeHNwZW5jZXI6W0dTTC4qXVtAMF0pcyAgICAgICA8LSBHU0xIZWxsbyAtPiBHU0xIZWxsbwoJICAgICAgICAlKHJ4c3BlbmNlcjpbR1NMKC4qKV1bQDFdKXMgICAgIDwtIEdTTEhlbGxvIC0+IEhlbGxvCgkgICAgICAgICUocnhzcGVuY2VyOltHU0woLiopXVtnc2xAMV0pcyAgPC0gR1NMSGVsbG8gLT4gZ3NsSGVsbG8KCgkgICAgCUFub3RoZXIgZXhhbXBsZSBjb3VsZCBiZToKCiAgICAgICAgICAgICAgICAlcmVuYW1lKCIlKGxvd2VyY2FzZSlzIixzb3VyY2VmbXQ9IiUocnhzcGVuY2VyOltHU0xfKC4qKV1bQDFdKXMiLCUkaXNmdW5jdGlvbikgIiI7CgoJICAgIAl3aGljaCB0YWtlIG91dCB0aGUgcHJlZml4ICJHU0xfIiBhbmQgcmV0dXJucyBhbGwgdGhlCgkgICAgCWZ1bmN0aW9uIG5hbWVzIGluIGxvd2VyIGNhc2VzLCBhcyBmb2xsb3dpbmc6CgoJICAgIAkgICAgdm9pZCBHU0xfSGVsbG8oKTsgICAtPiAgIGhlbGxvKCk7CgkgICAgCSAgICB2b2lkIEdTTF9IaSgpOyAgICAgIC0+ICAgaGkoKTsKCSAgICAJICAgIGNvbnN0IGludCBHU0xfTUFYOyAgLT4gICBHU0xfTUFYOyAgLy8gbm8gY2hhbmdlLCBpcyBub3QgYSBmdW5jdGlvbgoJCgkgICAgV2UgdXNlIHRoZSBSeFNwZW5jZXIgYXMgYW4gaW5pdGlhbCB0ZXN0IGJlZCB0bwogICAgICAgICAgICBpbXBsZW1lbnRpb24gd2hpbGUgd2UgZGVjaWRlIHdoaWNoIGxpYnJhcnkgd2lsbCBiZQogICAgICAgICAgICBmaW5hbGx5IGFkZGVkIHRvIHN3aWcuCgogICAgICAgICAgICBZb3UgY2FuIG9idGFpbiB0aGUgUnhTcGVuY2VyIGxpYnJhcnkgZnJvbSAKCSAgICAKCSAgICAgIGh0dHA6Ly9hcmdsaXN0LmNvbS9yZWdleCAoVW5peCkKCgkgICAgb3IKCSAgICAgCgkgICAgICBodHRwOi8vZ251d2luMzIuc291cmNlZm9yZ2UubmV0L3BhY2thZ2VzLmh0bWwgKFdpbmRvd3MpCgoJICAgIE9uY2UgaW5zdGFsbGVkLCB1c2UgIm1hbiByeHNwZW5jZXIiIHRvIGdldCBtb3JlIGluZm8KCSAgICBhYm91dCB0aGUgcmVnZXhwIGZvcm1hdCwgb3IganVzdCBnb29nbGUgcnhzcGVuY2VyLgoKCSAgICBTaW5jZSBub3cgeW91IGNhbiBlbmFibGUgdGhlIHJ4c21hdGNoIHJ1bGVzIChzZWUgYWJvdmUpLAogICAgICAgICAgICB0aGUgc2ltcGxlIG9yICd8JyBzdXBwb3J0IGZvciB0aGUgbWF0Y2ggcnVsZXMKICAgICAgICAgICAgKDAxLzEyLzIwMDY6IG1tYXR1cykgaXMgZGlzYWJsZWQuIFN0aWxsLCBpZiB5b3UgaGF2ZQogICAgICAgICAgICBwcm9ibGVtcyB3aXRoIHRoZSByeHNwZW5jZXIgbGlicmFyeSwgeW91IGNhbiByZS1lbmFibGUKICAgICAgICAgICAgdGhlIHNpbXBsZSAnbWF0Y2ggb3InIHN1cHBvcnQgdXNpbmcKICAgICAgICAgICAgLURTV0lHX1VTRV9TSU1QTEVfTUFUQ0hPUi4KCSAgCgowMS8xNi8yMDA2OiBtbWF0dXMKCSAgICBDaGFuZ2UgdGhlICVyZW5hbWUgcHJlZGljYXRlcyB0byB1c2UgdGhlIHByZWZpeCAnJSQnLCBhcyBpbjoKCSAgICAKCSAgICAgICVyZW5hbWUoIiUodXRpdGxlKXMiLCUkaXNmdW5jdGlvbiwlJGlzbWVtYmVyKSAiIjsgCgkgICAJCiAgICAgICAgICAgIHRvIGF2b2lkIGNsYXNoaW5ncyB3aXRoIG90aGVyIHN3aWcgbWFjcm9zL2RpcmVjdGl2ZXMuCgowMS8xNC8yMDA2OiBjZmlzYXZhZ2UKICAgICAgICAgICAgW1J1YnldCgkgICAgQWRkZWQgc3VwcG9ydCBmb3IgUnVieSBiYW5nISBtZXRob2RzIHZpYSBhIG5ldyAlYmFuZyBmZWF0dXJlLgoJICAgIEJhbmcgbWV0aG9kcyBlbmQgaW4gZXhjbGFtYXRpb24gcG9pbnRzIGFuZCBpbmRpY2F0ZSB0aGF0IHRoZQoJICAgIG9iamVjdCBiZWluZyBwcm9jZXNzZWQgd2lsbCBiZSBtb2RpZmllZCBpbi1wbGFjZSBhcyAKCSAgICBvcHBvc2VkIHRvIGJlaW5nIGNvcGllZC4KCjAxLzEyLzIwMDY6IGNmaXNhdmFnZQogICAgICAgICAgICBbUnVieV0KCSAgICBVcGRhdGVkIHRoZSBSdWJ5IG1vZHVsZSB0byBhdXRvbWF0aWNhbGx5IGNvbnZlcnQKCSAgICBtZXRob2QgbmFtZXMgdG8gbG93ZXJfY2FzZV93aXRoX3VuZGVyc2NvcmVzIHVzaW5nIHRoZQoJICAgIG5ldyAlcmVuYW1lIGZ1bmN0aW9uYWxpdHkuCgowMS8xMi8yMDA2OiBtbWF0dXMKCSAgICAtIEFkZCBhbGlhc2VzIGZvciAnY2FzZScgZW5jb2RlcnMgdXNlZCB3aXRoICVyZW5hbWUvJW5hbWV3YXJuCgoJICAgICAgJSh1cHBlcmNhc2UpcyAgIGhlbGxvX3dvcmxkIC0+IEhFTExPX1dPUkxECgkgICAgICAlKGxvd2VyY2FzZSlzICAgSGVsbG9Xb3JsZCAgLT4gaGVsbG93b3JsZAoJICAgICAgJShjYW1lbGNhc2UpcyAgIGhlbGxvX3dvcmxkIC0+IEhlbGxvV29ybGQKCSAgICAgICUodW5kZXJjYXNlKXMgICBIZWxsb1dvcmxkICAtPiBoZWxsb193b3JsZAoKCjAxLzEyLzIwMDY6IG1tYXR1cwoJICAgIC0gQWRkIHRoZSAtZHVtcF9wYXJzZV9tb2R1bGUgYW5kIC1kdW1wX3BhcnNlX3RvcCBvcHRpb25zLAoJICAgIHdoaWNoIGFyZSBzaW1pbGFyIHRvIC1kdW1wX21vZHVsZSBhbmQgLWR1bXBfdG9wLCBidXQgdGhleQoJICAgIGR1bXAgdGhlIG5vZGUgdHJlZXMganVzdCBhZnRlciBwYXJzaW5nLCBzaG93aW5nIG9ubHkgdGhlIAoJICAgIGF0dHJpYnV0ZXMgdmlzaWJsZSBhdCB0aGUgcGFyc2luZyBzdGFnZSwgYW5kIG5vdCB0aGUgYWRkZWQKCSAgICBsYXRlciBpbiB0eXBlbWFwLmN4eCwgYWxsb2NhdGUuY3h4LCBsYW5nLmN4eCBvciBlbHNld2hlcmUuCgkgICAgCgkgICAgQmVzaWRlcyBkZWJ1Z2dpbmcgcG9ycHVzZXMsIHRoZXNlIG9wdGlvbnMgYXJlIHZlcnkgdXNlZnVsCgkgICAgaWYgeW91IHBsYW4gdG8gdXNlICVyZW5hbWUgaW4gYW4gImFkdmFuY2Ugd2F5Iiwgc2luY2UgaXQKCSAgICBzaG93cyBvbmx5IGFuZCBhbGwgdGhlIG5vZGUncyBhdHRyaWJ1dGVzIHlvdSBjYW4gdXNlCgkgICAgaW5zaWRlIHRoZSBtYXRjaCBydWxlcy4KCgowMS8xMi8yMDA2OiBtbWF0dXMKCSAgICAtIEFkZCBwcmVkaWNhdGVzIHRvICVyZW5hbWUsIHNvLCB5b3UgZG9uJ3QgbmVlZCB0bwoJICAgICAgcmVtZW1iZXIsIGZvciBleGFtcGxlLCBob3cgdG8gbWF0Y2ggYSBtZW1iZXIgZnVuY3Rpb24uCgoJICAgICAgTm93IGl0IGlzIGVhc3ksIGZvciBleGFtcGxlIHRvIHVzZSB0aGUgJ3V0aXRsZScgZW5jb2RlciAKCSAgICAgIGluIGFsbCB0aGUgbWVtYmVyIG1ldGhvZHMsIHlvdSB0eXBlOgoKCSAgICAgICAgJXJlbmFtZSgiJSh1dGl0bGUpcyIsJWlzZnVuY3Rpb24sJWlzbWVtYmVyKSAiIjsKCgkgICAgICBvciB0byBpZ25vcmUgYWxsIHRoZSBlbnVtaXRlbXMgaW4gYSBnaXZlbiBjbGFzczoKCgkgICAgICAgICVyZW5hbWUoIiRpZ25vcmUiLCAlaXNlbnVtaXRlbSwgJWNsYXNzbmFtZT0iTXlDbGFzcyIpICIiOyAgCgoJICAgICAgQXZhaWxhYmxlIHByZWRpY2F0ZXMgYXJlIChzZWUgc3dpZy5zd2cpOgoKICAgICAgICAgICAgICAgICVpc2VudW0gICAgICAgICAKCQklaXNlbnVtaXRlbSAgICAgCgkJJWlzYWNjZXNzICAgICAgIAoJCSVpc2NsYXNzICAgICAgICAKCQklaXNleHRlbmQgICAgICAgCgkJJWlzZXh0ZW5kICAgICAgIAoJCSVpc2NvbnN0cnVjdG9yICAKCQklaXNkZXN0cnVjdG9yICAgCgkJJWlzbmFtZXNwYWNlICAgIAoJCSVpc3RlbXBsYXRlICAgICAKCQklaXNjb25zdGFudCAgICAgCgkJCQkJCgkJJWlzdW5pb24gICAgICAgIAoJCSVpc2Z1bmN0aW9uICAgICAKCQklaXN2YXJpYWJsZSAgICAgCgkJJWlzaW1tdXRhYmxlICAgIAoJCQkJCQoJCSVpc3N0YXRpYyAgICAgICAKCQklaXNmcmllbmQgICAgICAgCgkJJWlzdHlwZWRlZiAgICAgIAoJCSVpc3ZpcnR1YWwgICAgICAKCQklaXNleHBsaWNpdCAgICAgCgkJJWlzZXh0ZXJuICAgICAgIAoJCQkJCQoJCSVpc21lbWJlciAgICAgICAKCQklaXNnbG9iYWwgCgkJJWlubmFtZXNwYWNlCgoJCSVpc3B1YmxpYyAgICAKCQklaXNwcm90ZWN0ZWQgCgkJJWlzcHJpdmF0ZSAgIAoJCQkJICAgICAKCQklY2xhc3NuYW1lICAgCgogICAgICAgICAgICAgIFRoZXNlIHByZWRpY2F0ZXMgY29ycmVzcG9uZCB0byBzcGVjaWZpYyAnbWF0Y2gnCiAgICAgICAgICAgICAgZGVjbGFyYXRpb25zLCB3aGljaCBzb21ldGltZXMgYXJlIG5vdCBhcyBldmlkZW50IGFzIHRoZQogICAgICAgICAgICAgIHByZWRpY2F0ZXMgbmFtZXMuCgoKICAgICAgICAgICAgLSBBZGQgdGhlIG9yICd8JyBvcGVyYXRpb24gaW4gJXJlbmFtZSBtYXRjaCwgZm9yCiAgICAgICAgICAgICAgZXhhbXBsZSB0byBjYXBpdGFsaXplIGFsbCB0aGUgY29uc3RhbnRzICglY29uc3RhbnQgb3IKICAgICAgICAgICAgICBjb25zdCBjZGVjbCk6CgogICAgICAgICAgICAgICAgICVyZW5hbWUoIiUodXBwZXIpcyIsbWF0Y2g9ImNkZWNsfGNvbnN0YW50IiwlaXNpbW11dGFibGUpICIiOwogICAgICAgICAgICAgICAgCgoKMDEvMTIvMjAwNjogbWdvc3NhZ2UKCSAgICAtCVBhcnRpYWwgZml4ZWQgb2YgZXJyb3JzIHVuZGVyIEM4OSwgYnVnICMxMzU2NTc0CgkgICAgCShjb252ZXJ0ZWQgQysrIHN0eWxlIGNvbW1lbnRzIHRvIEMgc3R5bGUpCgkgICAgLQlBZGRlZCBwYXRjaGVzIGZyb20gbmVvbWFudHJhQHVzZXJzLnNmLm5ldCAjMTM3OTk4OCBhbmQgIzEzODgzNDMKCSAgICAJbWlzc2luZyBhICdyZXR1cm4nIHN0YXRlbWVudCBmb3IgZXJyb3IgY29uZGl0aW9ucwoJICAgIAlhbHNvIHVwZGF0ZWQgdGhlICVpbml0IGJsb2NrIGJ1ZyAjMTM1NjU4NgoJCSAKMDEvMTAvMjAwNjogbW1hdHVzCgkgICAgLSBBZGQgdGhlICd1dGl0bGUnIGVuY29kZXIsIGFzIGFuIGV4YW1wbGUgb2YgaG93IHRvIGFkZAoJICAgICAgeW91ciBvd24gZW5jb2Rlci4gSSBhZGRlZCB0aGUgZW5jb2RlciBtZXRob2QgaW4gbWlzYy5jIAoJICAgICAgYnV0IGRldmVsb3BlcnMgY2FuIGFkZCBvdGhlcnMsIHRoZSBzYW1lIHdheSwgaW5zaWRlIGFueQoJICAgICAgdGFyZ2V0IGxhbmd1YWdlLgoJICAgICAgCgkgICAgICBXZWxsLCAndXRpdGxlJyBpcyB0aGUgcmV2ZXJzZSBvZiAnY3RpdGxlJywgaWU6CgoJICAgICAgICAgJXJlbmFtZSgiJShjdGl0bGUpcyIpIGNhbWVsX2Nhc2U7ICAtPiBDYW1lbENhc2U7CgkgICAgICAgICAlcmVuYW1lKCIlKHV0aXRsZSlzIikgQ2FtZWxDYXNlOyAgIC0+IGNhbWVsX2Nhc2U7CgkJIAoKMDEvMTAvMjAwNjogY2Zpc2F2YWdlCiAgICAgICAgICAgIFtSdWJ5XQogICAgICAgICAgICBVcGRhdGVkIFJ1YnkgRXhjZXB0aW9uIGhhbmRsaW5nLiAgQ2xhc3NlcyB0aGF0IGFyZSBzcGVjaWZpZWQgaW4gdGhyb3dzIGNsYXVzZXMsIAogICAgICAgICAgICBvciBhcmUgbWFya2VkIGFzICVleGNlcHRpb25jbGFzcywgYXJlIG5vdyBpbmhlcml0ZWQgZnJvbSByYl9lUnVudGltZUVycm9yLiAKICAgICAgICAgICAgVGhpcyBhbGxvd3MgaW5zdGFuY2VzIG9mIHRoZXNlIGNsYXNzZXMgdG8gYmUgcmV0dXJuZWQgdG8gUnVieSBhcyBleGNlcHRpb25zLiAKICAgICAgICAgICAgVGh1cyBpZiBhIEMrKyBtZXRob2QgdGhyb3dzIGFuIGluc3RhbmNlIG9mIE15RXhjZXB0aW9uLCB0aGUgY2FsbGluZyBSdWJ5IAogICAgICAgICAgICBtZXRob2Qgd2lsbCBnZXQgYmFjayBhIE15RXhjZXB0aW9uIG9iamVjdC4gIFRvIHNlZSBhbiBleGFtcGxlLCAKICAgICAgICAgICAgbG9vayBhdCBydWJ5L2V4YW1wbGVzL2V4Y2VwdGlvbl9jbGFzcy4KCjAxLzEwLzIwMDY6IG1tYXR1cwoJICAgIAogICAgICAgICAgICAtIEFkZCB0aGUgJWNhdGNoZXMgZGlyZWN0aXZlLCB3aGljaCBjb21wbGVtZW50cyB0aGUgJWV4Y2VwdGlvbgoJICAgIGRpcmVjdGl2ZSBpbiBhIG1vcmUgYXV0b21hdGljIHdheS4gRm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlCgogICAgICAgICAgICAgICAgaW50IGZvbygpIHRocm93KEUxKTsKCiAgICAgICAgICAgIHN3aWcgZ2VuZXJhdGVzIHRoZSBwcm9wZXIgdHJ5L2NhdGNoIGNvZGUgdG8gZGlzcGF0Y2ggRTEuCgkgICAgCgkgICAgQnV0IGlmIHlvdSBoYXZlOgoKCgkgICAgICAgICAgaW50IGJhcmZvbyhpbnQgaSkgewogICAgICAgICAgICAgICAgICAgIGlmIChpID09IDEpIHsKCSAgICAgICAgICAgICAgIHRocm93IEUxKCk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKCSAgICAgICAgICAgICAgdGhyb3cgRTIoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGllLCB3aGVyZSB0aGVyZSBpcyBubyBleHBsaWNpdCBleGNlcHRpb24gc3BlY2lmaWNhdGlvbiBpbiB0aGUgZGVjbCwgeW91IAoJICAgIGVuZCB1cCBkb2luZzoKCQkgIAogICAgICAgICAgICAgICAlZXhjZXB0aW9uIGJhcmZvbyB7CQkJCgkgICAgICAgICB0cnkgewkJCQkKCSAgICAgICAgICAgJGFjdGlvbgkJCQoJICAgICAgICAgfSBjYXRjaChFMSkgewkuLi4gfQkJCQkgIAoJICAgICAgICAgfSBjYXRjaChFMikgewkuLi4gfQkJCQkgIAoJICAgICAgIH0JCQkJCgkgICAgCgkgICAgd2hpY2ggaXMgdmVyeSB0ZWRpb3VzLiBXZWxsLCB0aGUgJWNhdGNoZXMgZGlyZWN0aXZlIGRlZmluZXMKCSAgICB0aGUgbGlzdCBvZiBleGNlcHRpb25zIHRvIGNhdGNoLCBhbmQgZnJvbSBzd2lnOgogCQoJICAgICAgICVjYXRjaGVzKEUxLEUyKSBiYXJmb28oaW50IGkpOwoJICAgICAgIGludCBiYXJmb28oaW50IGkpOwoKICAgICAgICAgICAgaXMgZXF1aXZhbGVudCB0byAKCgkgICAgICAgaW50IGJhcmZvbyhpbnQgaSkgdGhyb3coRTEsRTIpOwoKCSAgICBOb3RlLCBob3dldmVyLCB0aGF0IHRoZSAlY2F0Y2hlcyBsaXN0IGRvZXNuJ3QgaGF2ZSB0bwoJICAgIGNvcnJlc3BvbmQgdG8gdGhlIEMrKyBleGNlcHRpb24gc3BlY2lmaWNhdGlvbi4gRm9yIGV4YW1wbGUsIGlmIHlvdQoJICAgIGhhdmU6CgoJCXN0cnVjdCBFIHt9OwoJCXN0cnVjdCBFMSA6IEUge307CgkJc3RydWN0IEUyIDogRSB7fTsKCiAgCSAgICAgICAgaW50IGJhcmZvbyhpbnQgaSkgdGhyb3coRTEsRTIpOwoKICAgICAgICAgICAgeW91IGNhbiBkZWZpbmUKCSAgICAgICAgCgkJJWNhdGNoZXMoRSkgYmFyZm9vKGludCBpKTsKCQoJICAgIGFuZCBzd2lnIHdpbGwgZ2VuZXJhdGUgYW4gYWN0aW9uIGNvZGUgZXF1aXZhbGVudCB0bwoKCSAgICAgICAgIHRyeSB7CQkJCQoJICAgICAgICAgICAkYWN0aW9uCQkJCgkgICAgICAgICB9IGNhdGNoKEUgJl9lKSB7IAoJCSAgIDxyYWlzZSBfZT47CgkJIH0JCgogICAgICAgICAgICBPZiBjb3Vyc2UsIHlvdSBzdGlsbCBoYXZlIHRvIHNhdGlzZnkgdGhlIEMrKyByZXN0cmljdGlvbnMsCgkgICAgYW5kIHRoZSBjYXRjaGVzIGxpc3QgbXVzdCBiZSBjb21wYXRpYmxlIChub3QgdGhlIHNhbWUpCgkgICAgYXMgdGhlIG9yaWdpbmFsIGxpc3Qgb2YgdHlwZXMgaW4gdGhlIGV4Y2VwdGlvbiBzcGVjaWZpY2F0aW9uLgoKCSAgICBBbHNvLCB5b3UgY2FuIG5vdyBzcGVjaWZ5IHRoYXQgeW91IHdhbnQgdG8gY2F0Y2ggdGhlCgkgICAgdW5rbm93biBleGNlcHRpb24gJy4uLicsIGZvciBleGFtcGxlOgoKCSAgICAgICAlY2F0Y2hlcyhFMSxFMiwuLi4pIGJhcmZvbyhpbnQpOwoKCSAgICBJbiBhbnkgY2FzZSwgdGhlICVjYXRjaGVzIGRpcmVjdGl2ZSB3aWxsIGVtaXQgdGhlCgkgICAgY29kZSB0byBjb252ZXJ0IGludG8gdGhlIHRhcmdldCBsYW5ndWFnZSBlcnJvci9leGNlcHRpb24KICAgICAgICAgICAgdXNpbmcgdGhlICd0aHJvd3MnIHR5cGVtYXAuCgoJICAgIEZvciB0aGUgJy4uLicgY2FzZSB0byB3b3JrLCB5b3UgbmVlZCB0bwoJICAgIHdyaXRlIHRoZSBwcm9wZXIgdHlwZW1hcCBpbiB5b3VyIHRhcmdldCBsYW5ndWFnZS4gSW4gdGhlCgkgICAgVVRMLCB0aGlzIGxvb2tzIGxpa2U6CgoJICAgICAgJXR5cGVtYXAodGhyb3dzKSAoLi4uKSB7CgkgICAgICAgIFNXSUdfZXhjZXB0aW9uKFNXSUdfUnVudGltZUVycm9yLCJ1bmtub3duIGV4Y2VwdGlvbiIpOwogICAgICAgICAgICAgIH0KCjAxLzA5LzIwMDY6IG11dGFuZGl6CgkgICAgW0FsbGVncm9jbF0KCiAgICAgICAgICAgIEZpeGVzIGEgbnVtYmVyIG9mIFNFR1ZzIHByaW1hcmlseSBpbiB0aGUgaGFuZGxpbmcgb2YKICAgICAgICAgICAgdmFyaW91cyBhbm9ueW1vdXMgdHlwZXMuIEZvdW5kIGluIGEgcGFzcyB0aHJvdWdoIHRoZQogICAgICAgICAgICBzd2lnIHRlc3Qtc3VpdGUuIFN0aWxsIG1vcmUgdG8gZG8gaGVyZSwgYnV0IHRoaXMgaXMgYQogICAgICAgICAgICBnb29kIGNoZWNrcG9pbnQuCgogICAgICAgICAgICBBZGRzIC1jd3JhcCBhbmQgLW5vY3dyYXAgYXMgYW4gYWxsZWdyb2NsIHNwZWNpZmljCiAgICAgICAgICAgIGNvbW1hbmQtbGluZSBhcmd1bWVudC4gQ29udHJvbHMgZ2VuZXJhdGluZyBvZiBhIEMKICAgICAgICAgICAgd3JhcHBlciBmaWxlIHdoZW4gd3JhcHBpbmcgQyBjb2RlLiBCeSBkZWZhdWx0IG9ubHkgYQogICAgICAgICAgICBsaXNwIGZpbGUgaXMgY3JlYXRlZCBmb3IgQyBjb2RlIHdyYXBwaW5nLgoKICAgICAgICAgICAgRG9jIHVwZGF0ZXMgZm9yIHRoZSBjb21tYW5kLWxpbmUgYXJndW1lbnRzIGFuZCBmaXhlcyBhcwogICAgICAgICAgICBwb2ludGVkIG91dCBvbiBzd2lnLWRldmVsCgowMS8wNS8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gRml4IHVuc2lnbmVkIGxvbmcgbG9uZyBhbmQgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICYgdHlwZW1hcHMKICAgICAgICAgICAgLSBCdWcgIzEzOTgzOTQgIHdpdGggcGF0Y2ggZnJvbSBEcmllcyBEZWNvY2sKCjAxLzA2LzIwMDY6IG1tYXR1cwoJICAgIEFkZCAnbmFtZWQnIHdhcm5pbmcgY29kZXMsIG5vdyBpbiBhZGRpdGlvbiB0bzoKCSAgICAKCSAgICAgICV3YXJuZmlsdGVyKDgxMyk7CgkgICAKCSAgICB5b3UgY2FuIHVzZQoKCSAgICAgICV3YXJuZmlsdGVyKFNXSUdXQVJOX0pBVkFfTVVMVElQTEVfSU5IRVJJVEFOQ0UpOwoKCSAgICBqdXN0IHVzZSB0aGUgc2FtZSBjb2RlIG5hbWUgZm91bmQgaW4gIFNvdXJjZS9JbmNsdWRlL3N3aWd3YXJuLmggCgkgICAgcGx1cyB0aGUgJ1NXSUcnIHByZWZpeC4KCgkgICAgSWYgYSBkZXZlbG9wZXIgYWRkcyBhIG5ldyB3YXJuaW5nIGNvZGUsIHRoZSBMaWIvc3dpZ3dhcm4uc3dnIGZpbGUKICAgICAgICAgICAgd2lsbCBiZSBnZW5lcmF0ZWQgd2hlbiBydW5uaW5nIHRoZSB0b3AgbGV2ZWwgbWFrZS4KCjAxLzA1LzIwMDY6IGNmaXNhdmFnZQogICAgICAgICAgICBbUnVieV0KCSAgICBSZWltcGxlbWVudGVkIG9iamVjdCB0cmFja2luZyBmb3IgUnVieS4gIFRoZSBuZXcgaW1wbGVtZW50YXRpb24gd29ya3MKCSAgICBieSBleHBhbmRpbmcgdGhlIHN3aWdfY2xhc3Mgc3RydWN0dXJlIGZvciBSdWJ5IGJ5IGFkZGluZyBhIHRyYWNrT2JqZWN0cwoJICAgIGZpZWxkLiAgVGhpcyBmaWVsZCBjYW4gYmUgc2V0L3Vuc2V0IHZpYSAldHJhY2tvYmplY3RzIGFzIGV4cGxhaW5lZAoJICAgIGluIHRoZSBSdWJ5IGRvY3VtZW50YXRpb24uICBUaGUgbmV3IGltcGxlbWVudGF0aW9uIGlzIG1vcmUgcm9idXN0CgkgICAgYW5kIHRha2VzIGxlc3MgY29kZSB0byBpbXBsZW1lbnQuCgkJCjAxLzA1LzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBmb3IgJWV4dGVuZCBhbmQgc3RhdGljIGNvbnN0IGludGVncmFsIHR5cGVzLCBlZzoKCiAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICVleHRlbmQgewogICAgICAgICAgICAgICAgICAgIHN0YXRpYyBjb25zdCBpbnQgYmFyID0gNDI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfTsgCgoxMi8zMC8yMDA1OiBtbWF0dXMKCgkgIC0gQWRkIGluZm8gZm9yIG9sZCBhbmQgbmV3IGRlYnVnIG9wdGlvbnM6CiAgICAgICAgICAgICAgCiAgICAgICAgICAgIC1kdW1wX3RvcCAgICAgICAtIFByaW50IGluZm9ybWF0aW9uIG9mIHRoZSBlbnRpcmUgbm9kZSB0cmVlLCBpbmNsdWRpbmcgc3lzdGVtIG5vZGVzICAgIAogICAgIAkgICAgLWR1bXBfbW9kdWxlICAgIC0gUHJpbnQgaW5mb3JtYXRpb24gb2YgdGhlIG1vZHVsZSBub2RlIHRyZWUsIGF2b2lkaW5nIHN5c3RlbSBub2RlcyAgICAgCiAgICAgCSAgICAtZHVtcF9jbGFzc2VzICAgLSBQcmludCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY2xhc3NlcyBmb3VuZCBpbiB0aGUgaW50ZXJmYWNlCSAgICAgICAKICAgICAJICAgIC1kdW1wX3R5cGVkZWYgICAtIFByaW50IGluZm9ybWF0aW9uIGFib3V0IHRoZSB0eXBlcyBhbmQgdHlwZWRlZnMgZm91bmQgaW4gdGhlIGludGVyZmFjZQogICAgIAkgICAgLWR1bXBfdGFncyAgICAgIC0gUHJpbnQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHRhZ3MgZm91bmQgaW4gdGhlIGludGVyZmFjZQkgICAgICAgCiAgICAgCSAgICAtZGVidWdfdHlwZW1hcCAgLSBQcmludCBpbmZvcm1hdGlvbiBmb3IgZGVidWdnaW5nIHR5cGVtYXBzCQkJICAgICAgIAogICAgICAgICAgICAtZGVidWdfdGVtcGxhdGUgLSBQcmludCBpbmZvcm1hdGlvbiBmb3IgZGVidWdnaW5nIHRlbXBsYXRlcwkJCSAgICAgICAgCgoJICAtIEFkZCB0aGUgZmFrZXZlcnNpb24uIElmIHlvdSBoYXZlIGEgcHJvamVjdCB0aGF0IHVzZXMKICAgICAgICAgICAgY29uZmlndXJlL3NldHVwLnB5LCBvciBhbm90aGVyIGF1dG9tYXRpYyBidWlsZGluZyBzeXN0ZW0KICAgICAgICAgICAgYW5kIHJlcXVpcmVzIGEgc3BlY2lmaWMgc3dpZyB2ZXJzaW9uLCBsZXQgc2F5IDEuMy4yMiAKCSAgICB5b3UgY2FuIHVzZToKCgkgICAgICAgU1dJR19GRUFUVVJFUz0iLWZha2V2ZXJzaW9uIDEuMy4yMiIKCgkgICAgIG9yCiAKICAgICAgICAgICAgICAgc3dpZyAtZmFrZXZlcnNpb24gMS4zLjIyCgogICAgICAgICAgICAgYW5kIHRoZW4gc3dpZyAtdmVyc2lvbiB3aWxsIHJlcG9ydCAxLjMuMjIgaW5zdGVhZCBvZiB0aGUKICAgICAgICAgICAgIGN1cnJlbnQgdmVyc2lvbi4KCgkgICAgIFR5cGljYWwgdXNlIHdvdWxkIGJlCgoJICAgICAgIFNXSUdfRkVBVFVSRVM9Ii1mYWtldmVyc2lvbiAxLjMuMjIiIC4vY29uZmlndXJlIAkgICAgIAoKMTIvMzAvMjAwNTogbW1hdHVzCgoJICAtIEFkZCBvcHRpb24vZm9ybWF0IHN1cHBvcnQgdG8gJXJlbmFtZSBhbmQgJW5hbWV3YXJuLgkKCSAgICBOb3cgJW5hbWV3YXJuIGNhbiBmb3JjZSByZW5hbWluZywgZm9yIGV4YW1wbGU6CgoJICAgICAgJW5hbWV3YXJuKCIzMTQ6IGltcG9ydCBpcyBhIGtleXdvcmQiLHJlbmFtZT0iXyVzIikgImltcG9ydCI7CgkgICAgCgkgICAgYW5kIHJlbmFtZSBjYW4gYWxzbyBzdXBwb3J0IGZvcm1hdCBmb3JtczoKCgkgICAgICAgJXJlbmFtZSgic3dpZ18lcyIpIGltcG9ydDsKCgkgICAgTm93LCBzaW5jZSB0aGUgZm9ybWF0IGlzIHByb2Nlc3NlZCB2aWEgc3dpZyBQcmludGYsIHlvdQoJICAgIGNhbiB1c2UgZW5jb2RlcnMgYXMgZm9sbG93czoKCgkgICAgICAgJXJlbmFtZSgiJSh0aXRsZSlzIikgIGltcG9ydDsgICAgIC0+IEltcG9ydAoJICAgICAgICVyZW5hbWUoIiUodXBwZXIpcyIpICBpbXBvcnQ7ICAgICAtPiBJTVBPUlQKCSAgICAgICAlcmVuYW1lKCIlKGxvd2VyKXMiKSAgSW1wb3J0OyAgICAgLT4gaW1wb3J0CgkgICAgICAgJXJlbmFtZSgiJShjdGl0bGUpcyIpIGNhbWVsX2Nhc2U7IC0+IENhbWVsQ2FzZQoJICAgICAgIAoJICAgIFRoaXMgd2lsbCBhbGxvdyB1cyB0byBhZGQgbW9yZSBlbmNvZGVycywgYXMgdGhlIAoJICAgIGV4cGVjdGVkIG9uZSBmb3IgcmVndWxhciBleHByZXNzaW9ucy4gCgoJICAtIEFkZCB0aGUgYWJvdmUgJ2N0aXRsZScgZW5jb2Rlciwgd2hpY2ggZG9lcyB0aGUgY2FtZWwgY2FzZToKCgkgICAgICAgIGNhbWVsX2Nhc2UgLT4gQ2FtZWxDYXNlCiAgCgkgIC0gQWxzbywgd2hpbGUgd2UgZ2V0IHRoZSByZWdleHAgc3VwcG9ydCwgYWRkIHRoZSAnY29tbWFuZCcgZW5jb2RlciwKICAgICAgICAgICAgeW91IGNhbiB1c2UgaXQgYXMgZm9sbG93cwoKICAgICAgICAgICAgICAgJXJlbmFtZSgiJShjb21tYW5kOnNlZCAtZSAncy9cKFthLXpdXCkvXFVcXDEvJyA8PDwgKXMiKSBpbXBvcnQ7IAoKCSAgICB0aGVuIHN3aWcgd2lsbCBwb3BlbiB0aGUgY29tbWFuZAoJICAgIAoJCSJzZWQgLWUgJ3MvXChbYS16XVwpL1xVXFwxLycgPDw8IGltcG9ydCIKCQkKICAgICAgICAgICAgc2VlIGJlbG93IGZvciBhbm9ueW1vdXMgcmVuYW1lcyBmb3IgYmV0dGVyIGV4YW1wbGVzLgkJCgogICAgICAgICAgLSBUaGUgcmVuYW1lIGRpcmVjdGl2ZSBub3cgYWxzbyBhbGxvd3M6CgoJICAgIC0gc2ltcGxlIG1hdGNoOiBvbmx5IGFwcGx5IHRoZSByZW5hbWUgaWYgYSB0eXBlIG1hdGNoCgkgICAgICBoYXBwZW4sIGZvciBleGFtcGxlCgoJCSAlcmVuYW1lKCUodGl0bGUpcyxtYXRjaD0iZW51bWl0ZW0iKSBoZWxsbzsKCgkJIGVudW0gSGVsbG8gewoJCSAgIGhpLCBoZWxsbyAgLT4gIGhpLCBIZWxsbyAgCgkJIH07CgkJIGludCBoZWxsbygpICAtPiAgaGVsbG87IAoKCSAgICAtIGV4dGVuZGVkIG1hdGNoOiBvbmx5IGFwcGx5IHRoZSByZW5hbWUgaWYgdGhlICdleHRlbmRlZCBhdHRyaWJ1dGUnIG1hdGNoCgkgICAgICBvY2N1cnJlZCwgZm9yIGV4YW1wbGU6IAoKCSAgICAgICAgIC8vIHNhbWUgYXMgc2ltcGxlIG1hdGNoIAkJCgkJICVyZW5hbWUoJSh0aXRsZSlzLG1hdGNoJG5vZGVUeXBlPSJlbnVtaXRlbSIpIGhlbGxvOyAKCgkJIGVudW0gSGVsbG8gewoJCSAgIGhpLCBoZWxsbyAgLT4gIGhpLCBIZWxsbyAgCgkJIH07CgoJICAgICAgIE5vdGUgdGhhdCB0aGUgc3ltYm9sICckJyBpcyB1c2VkIHRvIGRlZmluZSB0aGUgYXR0cmlidXRlIG5hbWUgaW4KCSAgICAgICBhICdyZWN1cnNpdmUnIHdheSwgZm9yIGV4YW1wbGU6CgoJCSAvLyBtYXRjaCBvbmx5IGhlbGxvIGluICdlbnVtIEhlbGxvJwoJCSAlcmVuYW1lKCUodGl0bGUpcyxtYXRjaCRwYXJlbnROb2RlJHR5cGU9ImVudW0gSGVsbG8iKSBoZWxsbzsgCgoJCSBlbnVtIEhlbGxvIHsKIAkJICAgaGksIGhlbGxvICAtPiAgaGksIEhlbGxvICAgLy8gbWF0Y2gKCQkgfTsKCgkJIGVudW0gSGkgewogCQkgICBoaSwgaGVsbG8gIC0+ICBoaSwgaGVsbG8gICAvLyBubyBtYXRjaAoJCSB9OwoKICAgICAgICAgICAgICAgaGVyZSwgZm9yIEhlbGxvOjpoaSwgdGhlICJwYXJlbnROb2RlIiBpcyAiSGVsbG8iLCBhbmQgaXRzICJ0eXBlIgogICAgICAgICAgICAgICBpcyAiZW51bSBIZWxsbyIuCgkgICAgICAgCgkgICAgICAgCiAgICAgICAgICAgIC0gQW5vbnltb3VzIHJlbmFtZXM6IHlvdSBjYW4gdXNlICdhbm9ueW1vdXMnIHJlbmFtZSBkaXJlY3RpdmVzLCBmb3IgZXhhbXBsZTogCgoJICAgICAgICAgLy8gcmVuYW1lIGFsbCB0aGUgZW51bSBpdGVtcyBpbiBIZWxsbwoJCSAlcmVuYW1lKCUodGl0bGUpcyxtYXRjaCRwYXJlbnROb2RlJHR5cGU9ImVudW0gSGVsbG8iKSAiIjsgCgoJCSBlbnVtIEhlbGxvIHsKIAkJICAgaGksIGhlbGxvICAtPiAgSGksIEhlbGxvICAgLy8gbWF0Y2ggYm90aAoJCSB9OwoKCQkgZW51bSBIaSB7CiAJCSAgIGhpLCBoZWxsbyAgLT4gIGhpLCBoZWxsbyAgIC8vIG5vIG1hdGNoCgkJIH07CgkJIAoJICAgICAgICAgLy8gcmVuYW1lIGFsbCB0aGUgZW51bSBpdGVtcyAKCQkgJXJlbmFtZSglKHRpdGxlKXMsbWF0Y2gkbm9kZVR5cGU9ImVudW1pdGVtIikgIiI7IAoKCSAgICAgICAgIC8vIHJlbmFtZSBhbGwgdGhlIGl0ZW1zIGluIGdpdmVuIGNvbW1hbmQgKHNsb29vb3csIGJ1dC4uLikKCQkgJXJlbmFtZSglKGNvbW1hbmQ6PG15IGV4dGVybmFsIGNtZD4pcykgIiI7IAoKCQoJICAgICAgQW5vbnltb3VzIHJlbmFtZXMgd2l0aCBjb21tYW5kcyBjYW4gYmUgdmVyeSBwb3dlcmZ1bCwgc2luY2UgeW91CgkgICAgICBjYW4gJ291dHNvdXJjZScgYWxsIHRoZSByZW5hbWluZyBtZWNoYW5pc20gKG9yIHBhcnQgb2YgaXQpIHRvIGFuCgkgICAgICBleHRlcm5hbCBwcm9ncmFtOgoJICAgICAgCgkgICAgICAgIC8vIFVwcGVyY2FzZSBhbGwgKGFuZCBvbmx5KSB0aGUgbmFtZXMgdGhhdCBzdGFydCB3aXRoICdpJwoJICAgICAgICAlcmVuYW1lKCIlKGNvbW1hbmQ6YXdrICcvXmkve3ByaW50IHRvdXBwZXIoJDEpfScgPDw8KXMiKSAiIjsgICAKCSAgICAgICAKCSAgICAgICAgaW50IGltcG9ydGVkKCkgLT4gSU1QT1JURUQ7CgkgICAgICAgIGludCBoZWxsbygpICAgIC0+IGhlbGxvCgoJICAgICAgTm90ZSB0aGF0IGlmIHRoZSAnY29tbWFuZCcgZW5jb2RlciByZXR1cm5zIGFuIGVtcHR5IHN0cmluZywgc3dpZwoJICAgICAgdW5kZXJzdGFuZHMgdGhhdCBubyByZW5hbWUgaXMgbmVjZXNzYXJ5LgoKCSAgICAgIEFsc28gbm90ZSB0aGF0ICVyZW5hbWUgJ3Bhc3NlcycgdGhlIG1hdGNoZWQgbmFtZS4gRm9yIGV4YW1wbGUsIGluCgkgICAgICB0aGlzIGNhc2UKCgkgICAgICAgIG5hbWVzcGFjZSBuczEgewoJCSAgaW50IGZvbygpOwoJCX0KCgkgICAgICAgIG5hbWVzcGFjZSBuczIgewoJCSAgaW50IGJhcigpOwoJCX0KCgkgICAgICB0aGUgZXh0ZXJuYWwgcHJvZ3JhbSBvbmx5IHJlY2VpdmVzICJmb28iIGFuZCAiYmFyIi4gSWYgbmVlZGVkLAoJICAgICAgaG93ZXZlciwgeW91IGNhbiByZXF1ZXN0IHRoZSAnZnVsbG5hbWUnIAoJICAgICAgIAkKCSAgICAgICAgJXJlbmFtZSgiJShjb21tYW5kOmF3ayAnYXdrICcvbnMxOjove2w9c3BsaXQoJDEsYSwiOjoiKTsgcHJpbnQgdG91cHBlcihhW2xdKX0nJyA8PDwpcyIsZnVsbG5hbWU9MSkgIiI7ICAgCiAgICAgICAgICAgICAgICAKCQluczE6OmZvbyAtPiBGT08KCQluczI6OmJhciAtPiBiYXIJCgkKCSAgICAtIE1peGluZyBlbmNvZGVycyBhbmQgbWF0Y2hpbmc6IG9mIGNvdXJzZSwgeW91IGNhbiBkbyBtaXggY29tbWFuZHMKCSAgICAgIGFuZCBtYXRjaCBmaWVsZHMsIGZvciBleGFtcGxlOgoKCSAgICAgICAgJXJlbmFtZSgiJSg8bXkgZW5jb2RlciBmb3IgZm5jcz4pIixtYXRjaD0iY2RlY2wiKSAiIjsKCSAgICAgICAgJXJlbmFtZSgiJSg8bXkgZW5jb2RlciBmb3IgZW51bXM+KSIsbWF0Y2g9ImVudW1pdGVtIikgIiI7CgkgICAgICAgICVyZW5hbWUoIiUoPG15IGVuY29kZXIgZm9yIGVudW1zIGluc2lkZSBhIGNsYXNzPikiLG1hdGNoPSJlbnVtaXRlbSIsCgkJICAgICAgICBtYXRjaCRwYXJlbnROb2RlJHBhcmVudE5vZGUkbm9kZVR5cGU9ImNsYXNzIikgIiI7CgkJCgkgICAgICBVc2UgInN3aWcgLWR1bXBfcGFyc2VfbW9kdWxlIiB0byBzZWUgdGhlIGF0dHJpYnV0ZSBuYW1lcyB5b3UgY2FuIHVzZSB0bwoJICAgICAgbWF0Y2ggYSBzcGVjaWZpYyBjYXNlLgoJCiAgICAgICAgICAgIC0gJ3NvdXJjZWZtdCcgYW5kICd0YXJnZXRmbXQnOiBzb21ldGltZXMgeW91IG5lZWQgdG8KICAgICAgICAgICAgICBwcm9jZXNzIHRoZSAnc291cmNlJyBuYW1lIGJlZm9yZSBjb21wYXJpbmcsIGZvciBleGFtcGxlCgoJICAgICAgICAlbmFtZXdhcm4oIjMxNDogZW1wdHkgaXMgYSBrZXl3b3JkIixzb3VyY2VmbXQ9IiUobG93ZXIpcyIpICJlbXB0eSI7CgoJICAgICAgdGhlbiBpZiB5b3UgaGF2ZQoKCSAgICAgICAgaW50IEVtcHR5KCk7ICAvLyAiRW1wdHkiIGlzIHRoZSBzb3VyY2UgCgkJCgkgICAgICB5b3Ugd2lsbCBnZXQgdGhlIGtleXdvcmQgd2FybmluZyBzaW5jZSAnRW1wdHknIHdpbGwgYmUKCSAgICAgIGxvd2VyIGNhc2VkLCB2aWEgdGhlIHNvdXJjZWZtdD0iJShsb3dlcilzIiBvcHRpb24sCgkgICAgICBiZWZvcmUgYmVlbiBjb21wYXJlZCB0byB0aGUgJ3RhcmdldCcgImVtcHR5Ii4KCgkgICAgICBUaGVyZSBpcyBhbiBhZGRpdGlvbmFsICd0YXJnZXRmbXQnIG9wdGlvbiB0byBwcm9jZXNzIHRoZQoJICAgICAgJ3RhcmdldCcgYmVmb3JlIGNvbXBhcmluZy4KCgkgICAgLSBjb21wbGVtZW50aW5nICdtYXRjaCc6IHlvdSBjYW4gdXNlICdub3RtYXRjaCcsIGZvciBleGFtcGxlCgkgICAgICAKCSAgICAgICAgJW5hbWV3YXJuKCIzMTQ6IGVtcHR5IGlzIGEga2V5d29yZCIsc291cmNlZm10PSIlKGxvd2VyKXMiLG5vdG1hdGNoPSJuYW1lc3BhY2UiKSAiZW1wdHkiOwoKCSAgICAgIGhlcmUsIHRoZSBuYW1lIHdhcm5pbmcgd2lsbCBiZSBhcHBsaWVkIHRvIGFsbCB0aGUgc3ltYm9scyBleGNlcHQgbmFtZXNwYWNlcy4KCSAgICAKICAgICAgCQoxMi8zMC8yMDA1OiBtbWF0dXMKCgkgIC0gQWRkIGluaXRpYWwgc3VwcG9ydCBmb3IgZ2NqIGFuZCBKYXZhIC0+IDx0YXJnZXQgbGFuZ3VhZ2U+IG1lY2hhbmlzbS4KCgkgICAgU2VlCWV4YW1wbGVzIGluOiAgCgkgIAoJCUV4YW1wbGVzL3B5dGhvbi9qYXZhCgkJRXhhbXBsZXMvcnVieS9qYXZhCgkJRXhhbXBsZXMvdGNsL2phdmEKCiAgICAgICAgICAgIHRvIHNlZSBob3cgdG8gdXNlIGdjaitzd2lnIHRvIGV4cG9ydCBqYXZhIGNsYXNzZXMgaW50bwogICAgICAgICAgICBweXRob24vcnVieS90Y2wuCgkgICAgCgkgICAgVGhlIGlkZWEgaXMgdG8gcHV0IGFsbCB0aGUgY29tbW9uIGNvZGUgZm9yIGdjaiBpbnNpZGUKCgkgICAgICAgICAgTGliL2djagoKICAgICAgICAgICAgYW5kIGxvY2FsaXplIHNwZWNpZmljIHR5cGVzIHN1Y2ggYXMganN0cmluZywgYXMgY2FuIGJlIGZvdW5kCiAgICAgICAgICAgIGluCgoJICAgICAgICAgTGliL3B5dGhvbi9qc3RyaW5nLmkKCSAgICAgICAgIExpYi9ydWJ5L2pzdHJpbmcuaQoJICAgICAgICAgTGliL3RjbC9qc3RyaW5nLmkKCiAgICAgICAgICAgIFVzaW5nIHRoZSBVVEwsIHRoaXMgaXMgdmVyeSBlYXN5LCBhbmQgdGhlIHBlcmwgdmVyc2lvbiBmb3IKICAgICAgICAgICAganN0cmluZy5pIHdpbGwgYmUgbmV4dC4KCQkgCSAgICAKCjEyLzI5LzIwMDU6IG1tYXR1cwoJICAtIEFkZCB0aGUgY29weWN0b3IgZmVhdHVyZS9kaXJlY3RpdmUvb3B0aW9uIHRvIGVuYWJsZSB0aGUgYXV0b21hdGljCgkgICAgZ2VuZXJhdGlvbiBvZiBjb3B5IGNvbnN0cnVjdG9ycy4gVXNlIGFzIGluOgoKCSAgICAgICVjb3B5Y3RvciBBOwoKCSAgICAgIHN0cnVjdCBBIHsKCiAgICAgICAgICAgICAgfTsKCgkgICAgdGhlbiB0aGlzIHdpbGwgd29yawoKCSAgICAgIGExID0gQSgpOwoJICAgICAgYTIgPSBBKGExKTsKCgkgICAgQWxzbywgc2luY2UgaXQgaXMgYSBmZWF0dXJlLCBpZiB5b3UganVzdCB0eXBlCgoJICAgICAgJWNvcHljdG9yOwoKCSAgICB0aGF0IHdpbGwgIGVuYWJsZSB0aGUgYXV0b21hdGljIGdlbmVyYXRpb24gZm9yIGFsbCB0aGUKCSAgICBjbGFzc2VzLiBJdCBpcyBhbHNvIGVxdWl2YWxlbnQgdG8KCgkgICAgICAgc3dpZyAtY29weWN0b3IgLWMrKyAuLi4KCgkgICAgTm90ZXM6IAoKCSAgICAxLi0gVGhlIGZlYXR1cmUgb25seSB3b3JrcyBpbiBDKysgbW9kZS4KCgkgICAgMi4tIFRoZSBhdXRvbWF0aWMgY3JlYXRpb24gb2YgdGhlIGNvcHkgY29uc3RydWN0b3Igd2lsbAoJICAgICAgICB1c3VhbGx5IHByb2R1Y2Ugb3ZlcmxvYWRpbmcuIEhlbmNlLCBpZiB0aGUgdGFyZ2V0CgkgICAgICAgIGxhbmd1YWdlIGRvZXNuJ3Qgc3VwcG9ydCBvdmVybG9hZGluZywgYSBzcGVjaWFsIG5hbWUKCSAgICAgICAgd2lsbCBiZSB1c2VkIChBX2NvcHkpLgoJICAgIAoJICAgIDMuLSBGb3IgdGhlIG92ZXJsb2FkaW5nIHJlYXNvbnMgYWJvdmUsIGl0IGlzIHByb2JhYmx5IG5vdAogICAgICAgICAgICAgICAgYSBnb29kIGlkZWEgdG8gdXNlIHRoZSBmbGFnIHdoZW4sIGZvciBleGFtcGxlLCB5b3UgYXJlCgkJdXNpbmcga2V5d29yZHMgaW4gUHl0aG9uLgoKICAgICAgICAgICAgNC4tIFRoZSBjb3B5Y3RvciBhdXRvbWF0aWMgbWVjaGFuaXNtIGZvbGxvd3MgbW9yZSBvciBsZXNzCgkgICAgICAgIHRoZSBzYW1lIHJ1bGVzIGFzIHRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yIG1lY2hhbmlzbSwKCSAgICAgICAgaS5lLiwgYSBjb3B5IGNvbnN0cnVjdG9yIHdpbGwgbm90IGJlIGFkZGVkIGlmIHRoZQoJICAgICAgICBjbGFzcyBpcyBhYnN0cmFjdCBvciBpZiB0aGVyZSBpcyBhIHBlcnRpbmVudCBub24tcHVibGljIAoJCWNvcHkgY3RvciBpbiB0aGUgY2xhc3Mgb3IgaXRzIGhpZXJhcmNoeS4KCgkJSGVuY2UsIGl0IG1pZ2h0IGJlIG5lY2Vzc2FyeSBmb3IgeW91IHRvIGNvbXBsZXRlIHRoZQoJCWNsYXNzIGRlY2xhcmF0aW9uIHdpdGggdGhlIHByb3BlciBub24tcHVibGljIGNvcHkgY3RvcgoJCXRvIGF2b2lkIGEgd3JvbmcgY29uc3RydWN0b3IgYWRkaXRpb24uCgkJCiAgICAgICAgICAtIEZpeCBmZWF0dXJlcy9yZW5hbWUgZm9yIHRlbXBsYXRlcyBjdG9yL2R0b3IgYW5kIG90aGVyCiAgICAgICAgICAgIHRoaW5ncyBhcm91bmQgd2hpbGUgYWRkaW5nIHRoZSBjb3B5Y3RvciBtZWNoYW5pc20uCgkgICAgCgoxMi8yNy8yMDA1OiBtbWF0dXMKCSAgLSBBZGQgdGhlICdtYXRjaCcgb3B0aW9uIHRvIHR5cGVtYXBzLiBBc3N1bWUgeW91IGhhdmU6CgoJICAgICAgJXR5cGVtYXAoaW4pIFNXSUdUWVBFICogKGludCByZXMpIHsuLn0KCSAgICAgICV0eXBlbWFwKGZyZWVhcmcpIFNXSUdUWVBFICogeyBpZiAocmVzJGFyZ251bSkgLi4ufQoKCSAgICB0aGVuIGlmIHlvdSBkbwogCgkgICAgICAldHlwZW1hcChpbikgQSAqIHsuLi59CgoJICAgIHN3aWcgd2lsbCAnb3ZlcmxvYWQgdGhlICdpbicgdHlwZW1hcCwgYnV0IHRoZSAnZnJlZWFyZycgCgkgICAgdHlwZW1hcCB3aWxsIGJlIGFsc28gYXBwbGllZCwgZXZlbiB3aGVuIHRoaXMgaXMgd3JvbmcuIFRoZSBvbGQKCSAgICBzb2x1dGlvbnMgaXMgdG8gd3JpdGU6CgoJICAgICAgJXR5cGVtYXAoaW4pIEEgKiB7Li4ufQogIAkgICAgICAldHlwZW1hcChmcmVlYWcpIEEgKiAiIjsKCgkgICAgb3ZlcmxvYWQgJ2ZyZWVhcmcnIHdpdGggYW4gZW1wdHkgZGVmaW5pdGlvbi4KCgkgICAgVGhlIHByb2JsZW0gaXMsIGhvd2V2ZXIsIHRoZXJlIGlzIG5vIHdheSB0byBrbm93IHlvdSBuZWVkCgkgICAgdG8gZG8gdGhhdCB1bnRpbCB5b3Ugc3RhcnQgZ2V0dGluZyBicm9rZW4gQysrIGNvZGUsIG9yCgkgICAgd29yc2UsIGJyb2tlbiBydW50aW1lIGNvZGUuCgoJICAgIFRoZSBzYW1lIGFwcGxpZXMgdG8gdGhlIGluZmFtb3VzICd0eXBlY2hlY2snIHR5cGVtYXAsCgkgICAgd2hpY2ggYWx3YXlzIGNvbmZ1c2VzIHBlb3BsZSwgc2luY2UgdGhlIGZpcnN0IHRoaW5nIHlvdSBkbwoJICAgIGlzIHRvIGp1c3Qgd3JpdGUgdGhlICdpbicgdHlwZW1hcC4KCgkgICAgVGhlICdtYXRjaCcgb3B0aW9uIHNvbHZlcyB0aGUgcHJvYmxlbSwgYW5kIGlmIGluc3RlYWQgeW91IHdyaXRlOgoKCSAgICAgICV0eXBlbWFwKGluKSBTV0lHVFlQRSAqIChpbnQgcmVzKSB7Li59CgkgICAgICAldHlwZW1hcChmcmVlYXJnLG1hdGNoPSJpbiIpIFNXSUdUWVBFICogeyBpZiAocmVzJGFyZ251bSkgLi4ufQoJICAgICAgJXR5cGVtYXAodHlwZWNoZWNrLG1hdGNoPSJpbiIscHJlY2VkZW5jZS4uLikgU1dJR1RZUEUgKiB7Li4ufQoJICAgIAoJICAgIGl0IHdpbGwgdGVsbCBzd2lnIHRvIGFwcGx5IHRoZSAnZnJlZWFyZy90eXBlY2hlY2snCgkgICAgdHlwZW1hcHMgb25seSBpZiB0aGV5ICdtYXRjaCcgdGhlIHR5cGUgb2YgdGhlICdpbicKCSAgICB0eXBlbWFwLiBUaGUgc2FtZSBjYW4gYmUgZG9uZSB3aXRoIG90aGVyIHR5cGVtYXBzIGFzOgoKCSAgICAgICV0eXBlbWFwKGRpcmVjdG9yb3V0KSBTV0lHVFlQRSAqIHsuLi59CgkgICAgICAldHlwZW1hcChkaXJlY3RvcmZyZWUsbWF0Y2g9ImRpcmVjdG9yb3V0IikgU1dJR1RZUEUgKiB7Li4ufQoJICAgIAoKMTIvMjcvMjAwNTogbW1hdHVzCgkgIC0gQWRkIHRoZSAnbmF0dXJhbHZhcicgb3B0aW9uL21vZGUvZmVhdHVyZSB0byB0cmVhdCBtZW1iZXIKCSAgICB2YXJpYWJsZXMgaW4gYSBtb3JlIG5hdHVyYWwgd2F5LCBpZSwgc2ltaWxhciB0byB0aGUgZ2xvYmFsCgkgICAgdmFyaWFibGUgYmVoYXZpb3IuCgoJICAgIFlvdSBjYW4gdXNlIGl0IGluIGEgZ2xvYmFsIHdheSB2aWEgdGhlIGNvbW1hbmQgbGluZQoKCSAgICAgIHN3aWcgLW5hdHVyYWx2YXIgLi4uCgoJICAgIG9yIHRoZSBtb2R1bGUgbW9kZSBvcHRpb24KIAoJICAgICAgJW1vZHVsZShuYXR1cmFsdmFyPTEpCgoJICAgIGJvdGggZm9ybXMgbWFrZSBzd2lnIHRyZWF0IGFsbCB0aGUgbWVtYmVyIHZhcmlhYmxlcyBpbiB0aGUKCSAgICBzYW1lIHdheSBpdCB0cmVhdHMgZ2xvYmFsIHZhcmlhYmxlcy4gCgoJICAgIEFsc28sIHlvdSBjYW4gdXNlIGl0IGluIGEgY2FzZSBieSBjYXNlIGFwcHJvYWNoIGZvcgoJICAgIHNwZWNpZmljIG1lbWJlciB2YXJpYWJsZXMgdXNpbmcgdGhlIGRpcmVjdGl2ZSBmb3JtOgoKCSAgICAgICVuYXR1cmFsdmFyIEJhcjo6czsKCSAgICAKCSAgICBUaGVuLCBpbiB0aGUgZm9sbG93aW5nIGNhc2UgZm9yIGV4YW1wbGU6CgoJICAgICAgIHN0ZDo6c3RyaW5nIHM7CgkgICAgICAgc3RydWN0IEJhciB7CgkJIHN0ZDo6c3RyaW5nIHM7CiAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICB5b3UgY2FuIGRvOiAgCgoJICAgICAgIGIgPSBCYXIoKQoJICAgICAgIGIucyA9ImhlbGxvIgoJICAgICAgIGN2YXIucyA9ICJoZWxsbyIKCSAgICAgICAKCSAgICAgICBpZiAoYi5zICE9IGN2YXIucyk6CgkgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yCgoJCSAgCiAgICAgICAgICAgIFRoaXMgaXMgdmFsaWQgZm9yIGFsbCB0aGUgbGFuZ3VhZ2VzLCBhbmQgdGhlCiAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIGlzIGJhc2VkIG9uIGZvcmNpbmcgdGhlIHVzZSBvZiB0aGUgCiAgICAgICAgICAgIGNvbnN0IFNXSUdUWVBFJiAoQysrKS9TV0lHVFlQRSAoQykgdHlwZW1hcHMgZm9yIHRoZQogICAgICAgICAgICBnZXQvc2V0IG1ldGhvZHMgaW5zdGVhZCBvZiB0aGUgU1dJR1RZUEUgKiB0eXBlbWFwcy4KCSAgICBIZW5jZSwgZm9yICduYXR1cmFsdmFyJyB0byB3b3JrLCBlYWNoIHRhcmdldCBsYW5ndWFnZQoJICAgIG11c3QgaW1wbGVtZW50ICd0eXBlbWFwKGluL291dCkgY29uc3QgVHlwZSYnIHByb3Blcmx5LgoKCSAgICBUaGUgJ25hdHVyYWx2YXInIG9wdGlvbiByZXBsYWNlcyBvciBtYWtlcyB3b3JrYXJvdW5kcyBzdWNoICBhczoKCSAgICAKCQklYXBwbHkgY29uc3Qgc3RkOjpzdHJpbmcgJiB7IHN0ZDo6c3RyaW5nICp9CgogICAgICAgICAgICB1bm5lY2Vzc2FyeS4KCgkgICAgTm90ZTE6IElmIHlvdXIgaW50ZXJmYWNlIGhhcyBvdGhlciBraW5kcyBvZiB3b3JrYXJvdW5kcyB0bwoJICAgIGRlYWwgd2l0aCB0aGUgb2xkICd1bm5hdHVyYWwnIHdheSB0byBkZWFsIHdpdGggbWVtYmVyCgkgICAgdmFyaWFibGVzIChyZXR1cm5pbmcvZXhwZWN0aW5nIHBvaW50ZXJzKSwgdGhlCgkgICAgJ25hdHVyYWx2YXInIG9wdGlvbiBjb3VsZCBicmVhayB0aGVtLgoJICAgIAoJICAgIE5vdGUyOiB0aGUgb3B0aW9uIGhhcyBubyBlZmZlY3Qgb24gdW5uYW1lZCB0eXBlcywgc3VjaAoJICAgIGFzIHVubmFtZWQgbmVzdGVkIHVuaW9ucy4KCSAgICAKCSAgCjEyLzI3LzIwMDU6IG1tYXR1cwoJICAtIEFkZCBtb3JlICdleHByZXNzaXZlJyByZXN1bHQgc3RhdGVzIGZvciB0aGUgdHlwZW1hcAogICAgICAgICAgICBsaWJyYXJpZXMuCgoJICAgIEluIHRoZSBwYXN0LCBmb3Igc2NyaXB0aW5nIGxhbmd1YWdlcywgeW91IHdvdWxkIGRvIGNoZWNraW5nIHNvbWV0aGluZyBsaWtlOgoKCSAgICAgIGlmIChDb252ZXJ0UHRyKG9iaiwmdnB0cix0eSxmbGFncykgIT0gLTEpIHsKCSAgICAgICAgLy8gc3VjY2VzcwogICAgICAgICAgICAgIH0gZWxzZSB7CgkgICAgICAgIC8vIGVycm9yCgkgICAgICB9CgoJICAgIE5vdyB0aGUgcmVzdWx0IHN0YXRlIGNhbiBjYXJyeSBtb3JlIGluZm9ybWF0aW9uLAoJICAgIGluY2x1ZGluZzoKCgkgICAgICAtIEVycm9yIHN0YXRlOiBsaWtlIHRoZSBvbGQgLTEvMCwgYnV0IHdpdGggZXJyb3IgY29kZXMgZnJvbSBzd2lnZXJyb3JzLnN3Zy4KCgkgICAgICAgICBpbnQgcmVzID0gQ29udmVydFB0cihvYmosJnZwdHIsdHksZmxhZ3MpOwoJCSBpZiAoU1dJR19Jc09LKHJlcykpIHsKCQkgICAvLyBzdWNjZXNzIGNvZGUKICAgICAgICAgICAgICAgICB9IGVsc2UgewoJCSAgIFNXSUdfRXJyb3IocmVzKTsgLy8gcmVzIGNhcnJpZXMgdGhlIGVycm9yIGNvZGUKICAgICAgICAgICAgICAgICB9CgoJICAgICAgLSBDYXN0IHJhbms6IHdoZW4gcmV0dXJuaW5nIGEgc2ltcGxlIHN1Y2Nlc3NmdWwKICAgICAgICAgICAgICAgIGNvbnZlcnNpb24sIHlvdSBqdXN0IHJldHVybiBTV0lHX09LLCBidXQgaWYgeW91IG5lZWQKICAgICAgICAgICAgICAgIHRvIGRvIGEgJ2Nhc3QnLCB5b3UgY2FuIGFkZCB0aGUgY2FzdGluZyByYW5rLCBpZToKCQkKCQkgIGlmIChQeUZsb2F0X0NoZWNrKG9iaikpIHsKCQkgICAgdmFsdWUgPSBQeUZsb2F0X0FzRG91YmxlKG9iaik7CgkJICAgIHJldHVybiBTV0lHX09LOwoJCSAgfSBlbHNlIGlmIChQeUludF9DaGVjayhvYmopKSB7CgkJICAgIHZhbHVlID0gKGRvdWJsZSkgUHlJbnRfQXNMb25nKG9iaik7CgkJICAgIHJldHVybiBTV0lHX0FkZENhc3QoU1dJR19PSyk7CQkgICAgCiAgICAgICAgICAgICAgICAgIH0KCQkKCQlsYXRlciwgdGhlIGNhc3RpbmcgcmFuayBpcyB1c2VkIHRvIHByb3Blcmx5IGRpc3BhdGNoCgkJdGhlIG92ZXJsb2FkZWQgZnVuY3Rpb24sIGZvciBleGFtcGxlLiBUaGlzIG9mIGNvdXJzZQoJCXJlcXVpcmVzIHlvdXIgbGFuZ3VhZ2UgdG8gc3VwcG9ydCBhbmQgdXNlIHRoZSBuZXcKCQlkaXNwYXRjaCBjYXN0L3JhbmsgbWVjaGFuaXNtIChOb3cgbWFpbmx5IHN1cHBvcnRlZCBpbgoJCXBlcmwgYW5kIHB5dGhvbiwgYW5kIGVhc2lseSBleHBhbmRhYmxlIHRvIHJ1YnkgYW5kIHRjbCkuCgkgICAgICAKCSAgLSBbVVRMXSBBZGQgc3VwcG9ydCBmb3IgdGhlIG5ldyAnZXhwcmVzc2l2ZScgcmVzdWx0IHN0YXRlcy4KCjEyLzI3LzIwMDU6IG1tYXR1cwoJICAtIEFkZCBzdXBwb3J0IGZvciB0aGUgQysrIGltcGxpY2l0IGNvbnZlcnNpb24gbWVjaGFuaXNtLCB3aGljaAogICAgICAgICAgICByZXF1aXJlZCBzb21lIG1vZGlmaWNhdGlvbnMgaW4gcGFyc2VyLnkgKHRvIHJlY29nbml6ZQogICAgICAgICAgICAnZXhwbGljaXQnKSBhbmQgb3ZlcmxvYWQuY3h4ICh0byByZXBsYWNlICRpbXBsaWNpdGNvbnYgYXMKICAgICAgICAgICAgbmVlZGVkKS4KCSAgICAKCSAgICBTdGlsbCwgcmVhbCBzdXBwb3J0IGluIGVhY2ggdGFyZ2V0IGxhbmd1YWdlIHJlcXVpcmVzIGVhY2gKCSAgICB0YXJnZXQgbGFuZ3VhZ2UgdG8gYmUgbW9kaWZpZWQuIFB5dGhvbiBwcm92aWRlcyBhbiBleGFtcGxlLAogICAgICAgICAgICBzZWUgYmVsb3cuCgoKCSAgLSBBZGQgc3VwcG9ydCBmb3IgbmF0aXZlIEMrKyBpbXBsaWNpdCBjb252ZXJzaW9ucywgaWUsIGlmIHlvdQogICAgICAgICAgICBoYXZlCgoJICAgICAgICAlaW1wbGljaXRjb252IEE7CgoJICAgICAgICBzdHJ1Y3QgQSB7CgkJICAgaW50IGlpOwoJCSAgIEEoKSB7aWkgPSAxO30KCQkgICBBKGludCkge2lpID0gMjt9CgkJICAgQShkb3VibGUpIHtpaSA9IDM7fQoJCSAgIGV4cGxpY2l0IEEoY2hhciAqcykge2lpID0gNDt9CgkJfTsKCQkKCQlpbnQgZ2V0KGNvbnN0IEEmIGEpIHtyZXR1cm4gYS5paTt9CgogICAgICAgICAgICB5b3UgY2FuIGNhbGw6CgoJICAgICAgICBhID0gQSgpCgkgICAgICAgIGFpID0gQSgxKQoJICAgICAgICBhZCA9IEEoMS4wKQoJICAgICAgICBhcyA9IEEoImhlbGxvIikKCQkKCQkjIG9sZCBmb3JtcwoJICAgICAgICBnZXQoYSkgIC0+IDEKCSAgICAgICAgZ2V0KGFpKSAtPiAyCgkgICAgICAgIGdldChhZCkgLT4gMwoJICAgICAgICBnZXQoYXMpIC0+IDQKCQkKCQkjaW1wbGljaXQgY29udmVyc2lvbnMKCSAgICAgICAgZ2V0KDEpICAgICAgIC0+IDIKCSAgICAgICAgZ2V0KDEuMCkgICAgIC0+IDMKCSAgICAgICAgZ2V0KCJoZWxsbyIpIC0+IEVycm9yLCBleHBsaWNpdCBjb25zdHJ1Y3RvcgoKICAgICAgICAgICAgQWxzbywgYXMgaW4gQysrLCBub3cgaW1wbGljaXQgY29udmVyc2lvbnMgYXJlIHN1cHBvcnRlZCBpbgogICAgICAgICAgICB2YXJpYWJsZSBhc3NpZ21lbnRzLCBhbmQgaWYgeW91IGhhdmU6CgoJICAgICAgQSBnYTsKCSAgICAgIHN0cnVjdCBCYXIgewoJICAgICAgICBBIGE7CiAgICAgICAgICAgICAgfTsKCgkgICAgeW91IGNhbiBkbzoKCgkgICAgICBjdmFyLmdhID0gQSgxKQoJICAgICAgY3Zhci5nYSA9IDEKCSAgICAgIGN2YXIuZ2EgPSAxLjAKCSAgICAgIGN2YXIuZ2EgPSBBKCJoZWxsbyIpIAoJICAgICAgY3Zhci5nYSA9ICJoZWxsbyIgLT4gZXJyb3IsIGV4cGxpY2l0IGNvbnN0cnVjdG9yCgoJICAgICAgYiA9IEJhcigpCgkgICAgICBiLmEgPSBBKCJoZWxsbyIpCgkgICAgICBiLmEgPSAxCgkgICAgICBiLmEgPSAxLjAKCSAgICAgIGIuYSA9ICJoZWxsbyIgLT4gZXJyb3IsIGV4cGxpY2l0IGNvbnN0cnVjdG9yCgoJICAgIE5vdGUgdGhhdCB0aGUgbGFzdCBjYXNlLCBhc3NpZ25pbmcgYSBtZW1iZXIgdmFyIGRpcmVjdGx5LCAKCSAgICBhbHNvIHJlcXVpcmVzIHRoZSAnbmF0dXJhbHZhcicgb3B0aW9uLgoKCSAgICBUaGlzIHN1cHBvcnQgbm93IG1ha2VzIHRoZSBvbGQgJyVpbXBsaWNpdCcgbWFjcm8sIHdoaWNoCgkgICAgd2FzIGZvdW5kIGluICdpbXBsaWNpdC5pJyBhbmQgaXQgd2FzIGZyYWdpbGUgaW4gbWFueSB3YXlzLAoJICAgIG9ic29sZXRlLCBhbmQgeW91IHNob3VsZCB1c2UgdGhlIG5ldyAnJWltcGxpY2l0Y29udicKCSAgICBkaXJlY3RpdmUgaW5zdGVhZC4KCgkgICAgTm90ZSB0aGF0IHdlIGZvbGxvdyB0aGUgQysrIGNvbnZlbnRpb25zLCBpZSwgaW4gdGhlCgkgICAgZm9sbG93aW5nIHRoZSBpbXBsaWNpdCBjb252ZXJzaW9uIGlzIGFsbG93ZWQ6CgoJCWludCBnZXQoQSBhKSB7cmV0dXJuIGEuaWk7fQoJCWludCBnZXQoY29uc3QgQSYgYSkge3JldHVybiBhLmlpO30KCSAgICAKCSAgICBidXQgbm90IGluIHRoZXNlIGNhc2VzOgoKCQlpbnQgZ2V0KEEgKmEpIHtyZXR1cm4gYS0+aWk7fQoJCWludCBnZXQoQSYgYSkge3JldHVybiBhLmlpO30KCQkKCSAgICBBbHNvLCBpdCB3b3JrcyBmb3IgZGlyZWN0b3IgbWV0aG9kcyB0aGF0IHJldHVybiBhIGJ5IHZhbHVlCgkgICAgcmVzdWx0LCBpZSwgdGhlIGZvbGxvd2luZyB3aWxsIHdvcms6CgogICAgICAgICAgICAgICAgdmlydHVhbCBBIGdldF9hKCkgPSAwOwoKCQlkZWYgZ2V0X2Eoc2VsZik6CgkJICAgcmV0dXJuIDEKCiAgICAgICAgICAgIGJ1dCBub3QgaW4gdGhpcyBjYXNlOgoKICAgICAgICAgICAgICAgIHZpcnR1YWwgY29uc3QgQSYgZ2V0X2EoKSA9IDA7CiAgICAgICAgICAgICAgICB2aXJ0dWFsIEEmIGdldF9hKCkgPSAwOwogICAgICAgICAgICAgICAgdmlydHVhbCBBKiBnZXRfYSgpID0gMDsKCSAgICAKCSAgTm90ZXM6CgoJICAtIHRoZSBpbXBsaWNpdGNvbnYgbWVjaGFuaXNtIGlzIGltcGxlbWVudGVkIGJ5IGRpcmVjdGx5CgkgICAgY2FsbGluZy9kaXNwYXRjaGluZyB0aGUgcHl0aG9uIGNvbnN0cnVjdG9yLCB0cmlnZ2VyaW5nIGEKCSAgICBjYWxsIHRvIHRoZSBfX2luaXRfX21ldGhvZC4gSGVuY2UsIGlmIHlvdSBleHBhbmRlZCB0aGUKCSAgICBfX2luaXRfXyBtZXRob2QsIGxpa2UgaW46CgoJICAgICAgICBjbGFzcyBBOgoJCSAgIGRlZiBfX2luaXRfXyhzZWxmLGFyZ3MpOgoJCSAgICAgIDxzd2lnIGNvZGU+CgkJICAgICAgPG15IGNvZGUgaGVyZT4KCiAgICAgICAgICAgIHRoZW4gJ215IGNvZGUnIHdpbGwgYWxzbyBiZSBleGVjdXRlZC4KCSAgICAKCSAgLSBTaW5jZSB0aGUgJWltcGxpY2l0Y29udiBkaXJlY3RpdmUgaXMgYSBTV0lHIGZlYXR1cmUsIGlmIHlvdSB0eXBlOgoJICAgIAogIAkgICAgICAgJWltcGxpY2l0Y29udjsgIAoKCSAgICB0aGF0IHdpbGwgZW5hYmxlIGltcGxpY2l0IGNvbnZlcnNpb24gZm9yIGFsbCB0aGUgY2xhc3NlcyBpbgoJICAgIHlvdXIgbW9kdWxlLgoKCSAgICBCdXQgaWYgeW91IGFyZSB3b3JyaWVkIGFib3V0IHBlcmZvcm1hbmNlLCBtYXliZSB0aGF0IHdpbGwgYmUKCSAgICB0b28gbXVjaCwgZXNwZWNpYWxseSBpZiB5b3UgaGF2ZSBvdmVybG9hZGVkIG1ldGhvZHMsIHNpbmNlCgkgICAgdG8gcmVzb2x2ZSB0aGUgZGlzcGF0Y2hpbmcgcHJvYmxlbSwgcHl0aG9uIHdpbGwgZWZlY3RpdmVseQoJICAgIHRyeSB0byBjYWxsIGFsbCB0aGUgaW1wbGljaXQgY29uc3RydWN0b3JzIGFzIG5lZWRlZC4KCgkgIC0gRm9yIHRoZSBzYW1lIHJlYXNvbiwgaXQgaXMgaGlnaGx5IHJlY29tbWVuZGVkIHRoYXQgeW91IHVzZQogICAgICAgICAgICB0aGUgbmV3ICdjYXN0bW9kZScgd2hlbiBtaXhpbmcgaW1wbGljaXQgY29udmVyc2lvbiBhbmQKICAgICAgICAgICAgb3ZlcmxvYWRpbmcuCgoJIC0gW3B5dGhvbl0gVGhlICVpbXBsaWNpdCBkaXJlY3RpdmUgaXMgZGVjbGFyZWQgb2Jzb2xldGUsIGFuZAogICAgICAgICAgIHlvdSBzaG91bGQgdXNlICVpbXBsaWNpdGNvbnYgaW5zdGVhZC4gSWYgeW91IGluY2x1ZGUKCSAgIHRoZSBpbXBsaWNpdC5pIGZpbGUsIGEgd2FybmluZyB3aWxsIHJlbWluZCB5b3Ugb2YgdGhpcy4KCgkgICBOb3RlOiBTaW5jZSAlaW1wbGljaXQgaXMgZnJhZ2lsZSwganVzdCByZXBsYWNpbmcgaXQgYnkKCSAgICVpbXBsaWNpdGNvbnYgY291bGQgbGVhZCB0byBkaWZmZXJlbnQgYmVoYXZpb3IuIEhlbmNlLCB3ZQoJICAgZG9uJ3QgYXV0b21hdGljYWxseSBzd2l0Y2ggZnJvbSB0byB0aGUgb3RoZXIsIGFuZCB0aGUgdXNlcgoJICAgbXVzdCBtaWdyYXRlIHRvIHRoZSBuZXcgJWltcGxpY2l0Y29udiBkaXJlY3RpdmUgbWFudWFsbHkuCgoKMTIvMjYvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjXQogICAgICAgICAgICBNb2RpZnkgc3RkOjp2ZWN0b3Igd3JhcHBlcnMgdG8gdXNlIHN0ZDo6dmVjdG9yOjp2YWx1ZV90eXBlIGFzIHRoaXMgaXMKICAgICAgICAgICAgY2xvc2VyIHRvIHRoZSByZWFsIFNUTCBkZWNsYXJhdGlvbnMgZm9yIHNvbWUgbWV0aG9kcywgZWcgZm9yIHB1c2hfYmFjaygpLgogICAgICAgICAgICBGaXhlcyBzb21lIGNvbXBpbGF0aW9uIGVycm9ycyBmb3Igc29tZSBjb21waWxlcnMgZWcgd2hlbiB0aGUgdGVtcGxhdGVkCiAgICAgICAgICAgIHR5cGUgaXMgYSBwb2ludGVyLgoKICAgICAgICAgICAgW0phdmFdCiAgICAgICAgICAgIHN0ZDo6dmVjdG9yIGltcHJvdmVtZW50cyAtIGEgZmV3IG1vcmUgbWV0aG9kcyBhcmUgd3JhcHBlZCBhbmQgc3BlY2lhbGl6YXRpb25zIGFyZQogICAgICAgICAgICBubyBsb25nZXIgcmVxdWlyZWQuIFRoZSBzcGVjaWFsaXplX3N0ZF92ZWN0b3IgbWFjcm8gaXMgbm8gbG9uZ2VyIG5lZWRlZCAoYQogICAgICAgICAgICB3YXJuaW5nIGlzIGlzc3VlZCBpZiBhbiBhdHRlbXB0IGlzIG1hZGUgdG8gdXNlIGl0KS4KCjEyLzI2LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhLCBDI10KICAgICAgICAgICAgQWRkIGluIHBvaW50ZXIgcmVmZXJlbmNlIHR5cGVtYXBzLiBUaGlzIGFsc28gZW5hYmxlcyBvbmUgdG8gZWFzaWx5IHdyYXAKICAgICAgICAgICAgc3RkOjp2ZWN0b3I8VD4gd2hlcmUgVCBpcyBhIHBvaW50ZXIuCgoxMi8yNC8yMDA1OiBlZnV6enlvbmUKICAgICAgICAgICAgW0NGRkldIFRoZSBjZmZpIG1vZHVsZSBmb3IgU1dJRzoKICAgICAgICAgICAgICAtIEZ1bGx5IHN1cHBvcnRzIEMsIGJ1dCBwcm92aWRlcyBsaW1pdGVkIHN1cHBvcnRzIGZvciBDKyssIGluCiAgICAgICAgICAgICAgIHBhcnRpY3VsYXIgQysrIHN1cHBvcnQgZm9yIHRlbXBsYXRlcyBhbmQgb3ZlcmxvYWRpbmcgbmVlZHMgdG8KICAgICAgICAgICAgICAgYmUgd29ya2VkIHVwb24uIAoKMTIvMjMvMjAwNTogbW1hdHVzCgkgICAgW3B5dGhvbl0gQWRkIHRoZSBjYXN0bW9kZSB0aGF0IGFsbG93cyB0aGUgcHl0aG9uCgkgICAgdHlwZSBjYXN0aW5nIHRvIG9jY3VyLgoKCSAgICBGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUgJ2ludCBmb28oaW50KScsIG5vdwoJICAgIAoJICAgICAgY2xhc3MgQWkoKToKCSAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLHgpOiAKCQkgICAgc2VsZi54ID0geAoJICAgICAgICAgZGVmIF9faW50X18oc2VsZik6IAoJCSAgICByZXR1cm4gc2VsZi54CgoJICAgICAgZm9vKDEpICAgLy8gT2sKCSAgICAgIGZvbygxLjApIC8vIE9rCgkgICAgICBmb28oMS4zKSAvLyBFcnJvcgoJICAgICAgYSA9IEFpKDQpCiAgICAgICAgICAgICAgZm9vKGFpKSAgLy8gT2sKCiAgICAgICAgICAgIFRoZSBjYXN0bW9kZSwgd2hpY2ggY2FuIGJlIGVuYWJsZWQgZWl0aGVyIHdpdGggdGhlCiAgICAgICAgICAgICctY2FzdG1vZGUnIG9wdGlvbiBvciB0aGUgJW1vZHVsZSgiY2FzdG1vZGUiKSBvcHRpb24sIHVzZXMKICAgICAgICAgICAgdGhlIG5ldyBjYXN0L3JhbmsgZGlzcGF0Y2ggbWVjaGFuaXNtLiBIZW5jZSwgbm93IGlmIHlvdQogICAgICAgICAgICBoYXZlICdpbnQgZm9vKGludCk7IGludCBmb28oZG91YmxlKTsnLCB0aGUgZm9sbG93aW5nIHdvcmtzCiAgICAgICAgICAgIGFzIGV4cGVjdGVkOgoKCSAgICAgIGZvbygxKSAgIC0+IGZvbyhpbnQpCgkgICAgICBmb28oMS4wKSAtPiBmb28oZG91YmxlKQoJICAgICAgYWkgPSBBaSg0KQoJICAgICAgZm9vKGFpKSAgLT4gZm9vKGludCkKCgkgICAgTm90ZTE6IHRoZSAnY2FzdG1vZGUnIGNvdWxkIGRpc3J1cHQgc29tZSBzcGVjaWFsaXplZAoJICAgIHR5cGVtYXBzLiBJbiBwYXJ0aWN1bGFyLCB0aGUgImltcGxpY2l0LmkiIGxpYnJhcnkgc2VlbXMgdG8KCSAgICBoYXZlIHByb2JsZW0gd2l0aCB0aGUgY2FzdG1vZGUuIEJ1dCBiZXNpZGVzIHRoYXQgb25lLCB0aGUKCSAgICBlbnRpcmUgdGVzdC1zdWl0ZSBjb21waWxlcyBmaW5lIHdpdGggYW5kIHdpdGhvdXQgdGhlCgkgICAgY2FzdG1vZGUuCgogCSAgICBOb3RlMjogdGhlIGNhc3QgbW9kZSBjYW4ndCBiZSBjb21iaW5lZCB3aXRoIHRoZSBmYXN0CgkgICAgZGlzcGF0Y2ggbW9kZSwgaWUsIHRoZSAtZmFzdGRpc3BhdGNoIG9wdGlvbiBoYXMgbm8gZWZmZWN0CgkgICAgd2hlbiB0aGUgY2FzdCBtb2RlIGlzIHNlbGVjdGVkLiBUaGUgcGVuYWx0aWVzLCBob3dldmVyLAoJICAgIGFyZSBtaW5pbXVtIHNpbmNlIHRoZSBjYXN0IGRpc3BhdGNoIGNvZGUgaXMgYWxyZWFkeSBiYXNlZAoJICAgIG9uIHRoZSBzYW1lIGZhc3QgZGlzcGF0Y2ggbWVjaGFuaXNtLgoKCSAgICBTZWUgdGhlIGZpbGUgb3ZlcmxvYWRfZGlzcGF0Y2hfY2FzdF9ydW5tZS5weSBmaWxlIGZvcgoJICAgIG5ldyBjYXNlcyBhbmQgZXhhbXBsZXMuCgoxMi8yMi8yMDA1OiBtbWF0dXMKCSAgICBBZGQgdGhlIGNhc3QgYW5kIHJhbmsgbWVjaGFuaXNtIHRvIGRpc3BhdGNoIG92ZXJsb2FkaW5nCgkgICAgZnVuY3Rpb25zLiBUaGUgVVRGIHN1cHBvcnRzIGl0IG5vdywgYnV0IGZvciBlYWNoIGxhbmd1YWdlCgkgICAgaXQgbXVzdCBiZSBkZWNpZGVkIGhvdyB0byBpbXBsZW1lbnQgYW5kL29yIHdoZW4gdG8gdXNlIGl0LgoKCSAgICBbcGVybF0gTm93IHBlcmwgdXNlcyB0aGUgbmV3IGNhc3QgYW5kIHJhbmsgZGlzcGF0Y2gKCSAgICBtZWNoYW5pc20sIHdoaWNoIHNvbHZlcyBhbGwgdGhlIHBhc3QgcHJvYmxlbXMga25vd24gCgkgICAgaW4gcGVybCwgc3VjaCBhcyB0aGUgb2xkICcrIDEnIHByb2JsZW06CgoJICAgICAgICBpbnQgZm9vKGludCk7CgkgICAgCgkJJG4gPSAxCiAgICAgICAgICAgICAgICAkbiA9ICRuICsgMQogICAgICAgICAgICAgICAgJHIgPSBmb28obikKCiAgICAgICAgICAgIGFsc28gd29ya3M6CgogICAgICAgICAgICAgICAgIGZvbygxKTsKICAgICAgICAgICAgICAgICBmb28oIjEiKTsKICAgICAgICAgICAgICAgICBmb28oMS4wKTsKICAgICAgICAgICAgICAgICBmb28oIjEuMCIpOwoKICAgICAgICAgICAgIGJ1dCBmYWlscwoKICAgICAgICAgICAgICAgICBmb28oImwiKTsKCiAgICAgICAgICAgICBhbmQgd2hlbiBvdmVybG9hZGluZyAgZm9vKGludCkgYW5kIGZvbyhkb3VibGUpOwoKICAgICAgICAgICAgICAgICBmb28oMSkgLT4gZm9vKGludCkKICAgICAgICAgICAgICAgICBmb28oMS4wKSAtPiBmb28oZG91YmxlKQogICAgICAgICAgICAgICAgIGZvbygiMSIpIC0+IGZvbyhpbnQpCiAgICAgICAgICAgICAgICAgZm9vKCIxLjAiKSAtPiBmb28oZG91YmxlKQogICAgICAgICAgICAgICAgIGZvbygibCIpIC0+IGVycm9yCgkJIGZvbygkbikgLT4gZm9vKGludCkgIGZvciBnb29kIHBlcmwgdmVyc2lvbnMKCQkgZm9vKCRuKSAtPiBmb28oZG91YmxlKSAgZm9yIG9sZCBiYWQgcGVybCB2ZXJzaW9ucwoKCSAgICAgd2hlbiBvdmVybG9hZGluZyBmb28oaW50KSwgZm9vKGNoYXIqKSBhbmQgZm9vKGRvdWJsZSk6CgogICAgICAgICAgICAgICAgIGZvbygxKSAtPiBmb28oaW50KQogICAgICAgICAgICAgICAgIGZvbygxLjApIC0+IGZvbyhkb3VibGUpCiAgICAgICAgICAgICAgICAgZm9vKCIxIikgLT4gZm9vKGNoYXIqKQogICAgICAgICAgICAgICAgIGZvbygiMS4wIikgLT4gZm9vKGNoYXIqKQogICAgICAgICAgICAgICAgIGZvbygibCIpIC0+IGZvbyhjaGFyKikKCiAgICAgICAgICAgICBOb3RlOiBJbiBwZXJsIHRoZSBvbGQgZGlzcGF0Y2ggbWVjaGFuaXNtIHdhcyBicm9rZW4sCiAgICAgICAgICAgICBzbywgd2UgZG9uJ3QgcHJvdmlkZSBhbiBvcHRpb24gdG8gZW5hYmxlIHRoZSBvbGQgb25lCgkgICAgIHNpbmNlLCBhZ2FpbiwgaXQgd2FzIHJlYWxseSByZWFsbHkgYnJva2VuLgoKCSAgICAgU2VlICdvdmVybG9hZF9zaW1wbGVfcnVubWUucGwnIGZvciBtb3JlIGNhc2VzIGFuZCB0ZXN0cy4KCgkgICAgIFBTOiBhbGwgdGhlIG9sZCBrbm93biBpc3N1ZXMgYXJlIGRlY2xhcmVkIHJlc29sdmVkLCBhbnkKCSAgICAgbmV3ICJwcm9ibGVtIiB0aGF0IGNvdWxkIGJlIGRpc2NvdmVyZWQgaXMgZGVjbGFyZWQsIAoJICAgICBhIHByaW9yaSwgYXMgImZlYXR1cmVzIiBvZiB0aGUgbmV3IGRpc3BhdGNoIG1lY2hhbmlzbQoJICAgICAodW50aWwgd2UgZmluZCBhbm90aGVyIHNvbHV0aW9uIGF0IGxlYXN0KS4KCSAgICAgCgkgICAgIAogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAgKioqCgoJICAgIEFzIHdpdGggdGhlIGludHJvZHVjdGlvbiBvZiB0aGUgVVRGLCBzb21lIHRoaW5ncyBjb3VsZAoJICAgIG5vdyBzdGFydCB0byB3b3JrIGFzIGV4cGVjdGVkLCBhbmQgcGVvcGxlIHVzZWQgdG8gZGVhbCBvcgoJICAgIHdvcmthcm91bmQgcHJldmlvdXMgYnVncyByZWxhdGVkIHRvIHRoZSBkaXNwYXRjaAoJICAgIG1lY2hhbmlzbSwgY291bGQgc2VlIG5vdyBhIGRpZmZlcmVuY2UgaW4gcGVybCBiZWhhdmlvci4KCjEyLzIxLzIwMDU6IG1tYXR1cwoJICAtIFRoZSAnLW5vZGVmYXVsdCcgZmxhZyAocHJhZ21hIGFuZCBmZWF0dXJlKSBub3cgZ2VuZXJhdGVzCgkgICAgYSB3YXJuaW5nLCBhbmQgcmVjb21tZW5kcyB0byB1c2UgdGhlIGV4cGxpY2l0CgkgICAgLW5vZGVmYXVsdGN0b3IgYW5kICAtbm9kZWZhdWx0ZHRvciBvcHRpb25zLgoJICAgIAoJICAgIFRoZSByZWFzb24gdG8gc3BsaXQgdGhlICdub2RlZmF1bHQnIGJlaGF2aW9yIGlzIHRoYXQsIGluCgkgICAgZ2VuZXJhbCwgaWdub3JpbmcgdGhlIGRlZmF1bHQgZGVzdHJ1Y3RvciBnZW5lcmF0ZXMgbWVtb3J5CgkgICAgbGVha3MgaW4gdGhlIHRhcmdldCBsYW5ndWFnZS4gSGVuY2UsIGlzIHRvbyByaXNreSBqdXN0IHRvCgkgICAgZGlzYWJsZSBib3RoIHRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yIGFuZCBkZXN0cnVjdG9yCgkgICAgYXQgdGhlIHNhbWUgdGltZS4KCgkgICAgSWYgeW91IG5lZWQgdG8gZGlzYWJsZSB0aGUgZGVmYXVsdCBkZXN0cnVjdG9yLCBpdCBpcwoJICAgIGFsc28gcmVjb21tZW5kZWQgeW91IHVzZSB0aGUgZGlyZWN0aXZlIGZvcm06CgoJICAgICAgICVub2RlZmF1bHRkdG9yICBNeVZlcnlTcGVjaWFsQ2xhc3M7CgogICAgICAgICAgICBmb3Igc3BlY2lmaWMgY2xhc3NlcywgYW5kIGFsd2F5cyBhdm9pZCB1c2luZyB0aGUgZ2xvYmFsCiAgICAgICAgICAgIC1ub2RlZmF1bHQgYW5kIC1ub2RlZmF1bHRkdG9yIG9wdGlvbnMuCgkgICAgCjEyLzIxLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhLCBDI10KICAgICAgICAgICAgRml4IGluY29ycmVjdCBjb2RlIGdlbmVyYXRpb24gd2hlbiB0aGUgaW50ZXJtZWRpYXJ5IGNsYXNzbmFtZSBpcyBjaGFuZ2VkCiAgICAgICAgICAgIGluIHRoZSBtb2R1bGUgZGlyZWN0aXZlIGZyb20gaXRzIGRlZmF1bHQuIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAlbW9kdWxlKGpuaWNsYXNzbmFtZT0ibXlpbWNsYXNzbmV3bmFtZSIpICJteW1vZHVsZSIgLy8gSmF2YQogICAgICAgICAgICAgICVtb2R1bGUoaW1jbGFzc25hbWU9Im15aW1jbGFzc25ld25hbWUiKSAibXltb2R1bGUiIC8vIEMjCgogICAgICAgICAgICBBZGQgaW4gbmV3IHNwZWNpYWwgdmFyaWFibGUgJGltY2xhc3NuYW1lLiBTZWUgZG9jcy4KCjEyLzE3LzIwMDU6IG1tYXR1cwoJICBbUHl0aG9uXQoJICAtIEFkZCB0aGUgLWFsaWFzb2JqMC8tbm9hbGlhc29iajAgb3B0aW9ucyB0byB1c2Ugd2l0aAoJICAgIC1mYXN0dW5wYWNrIGFuZC9vciAtTyBhbmQgb2xkIHR5cGVtYXBzIHRoYXQgdXNlICdvYmowJwoJICAgIGRpcmVjdGx5LgoKCSAgICBTbywgaWYgeW91IGNvbXBpbGUgeW91ciBjb2RlIHVzaW5nIC1PIGFuZCBnZXQgZXJyb3JzIGFib3V0CgkgICAgdGhlIHVuZGVjbGFyZWQgJ29iajAnIHZhcmlhYmxlLCBydW4gYWdhaW4gdXNpbmcgCgoJCXN3aWcgLU8gLWFsaWFzb2JqMCAtcHl0aG9uIC4uLi4KCSAgICAKCSAgICBGb3IgbmV3IHR5cGVtYXBzLCBuZXZlciB1c2UgJ29iajAnIGRpcmVjdGx5LCBpZiBuZWVkZWQsCgkgICAgdXNlIHRoZSAnJHNlbGYnIG5hbWUgdGhhdCB3aWxsIGJlIHByb3Blcmx5ICBleHBhbmRlZCB0bwoJICAgICdvYmowJyAobm9mYXN0dW5wYWNrKSBvciAnc3dpZ19vYmpbMF0nIChmYXN0dW5wYWNrKS4gCiAgCgkgICAgSWYgeW91IGhhdmUgbm8gaWRlYSB3aGF0IEkgYW0gdGFsa2luZyBhYm91dCwgYmV0dGVyLCB0aGF0CgkgICAgbWVhbnMgeW91IGhhdmUgbm8gdHlwZW1hcCB3aXRoIHRoaXMgcHJvYmxlbS4KCgoxMi8xNC8yMDA1OiBtbWF0dXMgCSAKCSAgW1B5dGhvbl0KCSAgLSBBZGQgdGhlIC1mYXN0dW5wYWNrLy1ub2Zhc3R1bnBhY2sgb3B0aW9ucyB0byBlbmFibGUvZGlzYWJsZQoJICAgIHRoZSB1c2Ugb2YgdGhlIGludGVybmFsIFVucGFja1R1cGxlIG1ldGhvZCwgaW5zdGVhZCBvZgoJICAgIGNhbGxpbmcgdGhlIG9uZSBmcm9tIHRoZSBweXRob24gQyBBUEkuCgoJICAgIFRoZSBvcHRpb24gLU8gbm93IGFsc28gaW1wbGllcyAtZmFzdHVucGFjay4KCSAgICAKCjEyLzExLzIwMDU6IG1tYXR1cyAKCSAgW1B5dGhvbl0KCSAgLSBBZGQgdGhlIC1wcm94eWRlbC8tbm9wcm94eWRlbCBvcHRpb25zIHRvIGVuYWJsZS9kaXNhYmxlCgkgICAgdGhlIGdlbmVyYXRpb24gb2YgcHJveHkvc2hhZG93IF9fZGVsX18gbWV0aG9kcywgZXZlbgoJICAgIHdoZW4gbm93IHRoZXkgYXJlIHJlZHVuZGFudCwgc2luY2UgdGhleSBhcmUgZW1wdHkuCgkgICAgSG93ZXZlciwgb2xkIGludGVyZmFjZXMgY291bGQgcmVseSBvbiBjYWxsaW5nIHRoZW0uCgoJICAgIFRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzIHRvIGdlbmVyYXRlIHRoZSBfX2RlbF9fIG1ldGhvZHMKCSAgICBhcyBpbiAxLjMuMjcgb3Igb2xkZXIgc3dpZyB2ZXJzaW9ucy4KCgkgICAgVGhlIG9wdGlvbiAtTyBub3cgYWxzbyBpbXBsaWVzIC1ub3Byb3h5ZGVsLgoKMTIvMTAvMjAwNTogbW1hdHVzIAoJICBbVVRGXQogICAgICAgICAgLSBGaXggdW5uZWNjZXNzYXJ5IGNhbGxzIHRvIFNXSUdfVHlwZVF1ZXJ5IGZvciAnY2hhciAqJwoJICAgIGFuZCAnd2NoYXJfdCAqJywgcHJvYmxlbSBmb3VuZCBieSBDbGF5IEN1bHZlciB3aGlsZQoJICAgIHByb2ZpbGluZyB0aGUgUHlPZ3JlIHByb2plY3QuCgoJICAKCSAgW1B5dGhvbl0gCgkgIC0gQWRkIHRoZSAtZGlydnRhYmxlLy1ub2RpcnZ0YWJsZSB0byBlbmFibGUvZGlzYWJsZQoJICAgIGEgcHNldWRvIHZpcnR1YWwgdGFibGUgdXNlZCBmb3IgZGlyZWN0b3JzLCBhdm9pZGluZwoJICAgIHRoZSBuZWVkIHRvIHJlc29sdmUgdGhlIHB5dGhvbiBtZXRob2QgYXQgZWFjaCBjYWxsLgoJICAgIAoJICAtIEFkZCB0aGUgLXNhZmVjc3RyaW5ncy8tbm9zYWZlY3N0cmluZ3Mgb3B0aW9ucyB0bwoJICAgIGVuYWJsZS9kaXNhYmxlIHRoZSB1c2Ugb2Ygc2FmZSBjb252ZXJzaW9ucyBmcm9tIFB5U3RyaW5nCgkgICAgdG8gY2hhciAqLiBQeXRob24gcmVxdWlyZXMgeW91IHRvIG5ldmVyIGNoYW5nZSB0aGUgaW50ZXJuYWwKCSAgICBidWZmZXIgZGlyZWN0bHksIGFuZCBoZW5jZSAnc2FmZWN0cmluZ3MnIHdhcnJhbnRpZXMgdGhhdAoJICAgIGJ1dCByZXR1cm5pbmcgYSBjb3B5IG9mIHRoZSBpbnRlcm5hbCBweXRob24gc3RyaW5nIGJ1ZmZlci4KCgkgICAgVGhlIGRlZmF1bHQsIGFzIGluIHByZXZpb3VzIHJlbGVhc2VzLCBpcyB0byByZXR1cm4gYQoJICAgIHBvaW50ZXIgdG8gdGhlIGJ1ZmZlciAobm9zYWZlY3N0cmluZ3MpLCBzbywgaXQgaXMgdGhlIHVzZXIncwoJICAgIHJlc3BvbnNpYmlsaXR5IHRvIGF2b2lkIGl0cyBtb2RpZmljYXRpb24uCgkgICAgCgkgIC0gQWRkIHRoZSAtTyBvcHRpb24gdG8gZW5hYmxlIGFsbCB0aGUgb3B0aW1pemF0aW9uIG9wdGlvbnMKCSAgICBhdCBvbmNlLCBpbml0aWFsbHkgZXF1aXZhbGVudCB0bwoKCSAgICAtbW9kZXJuIC1mYXN0ZGlzcGF0Y2ggLWRpcnZ0YWJsZSAtbm9zYWZlY3N0cmluZ3MgLWZ2aXJ0dWFsCgoxMi8wOC8yMDA1OiBtbWF0dXMgCgoJICAtIEFkZCB0aGUgLWZhc3RkaXNwYXRjaCBvcHRpb24gKGZhc3RkaXNwYXRjaCBmZWF0dXJlKS4gVGhpcwoJICAgIGVuYWJsZXMgdGhlICJmYXN0IGRpc3BhdGNoIiBtZWNoYW5pc20gZm9yIG92ZXJsb2FkZWQKCSAgICBtZXRob2RzIHByb3ZpZGVkIGJ5IFNhbHZhZG9yIEZhbmRpfm5vIEdhcmMnaWEgKCM5MzA1ODYpLgoKCSAgICBUaGUgcmVzdWx0aW5nIGNvZGUgaXMgc21hbGxlciBhbmQgZmFzdGVyIHNpbmNlIGxlc3MgdHlwZQoJICAgIGNoZWNraW5nIGlzIHBlcmZvcm1lZC4gSG93ZXZlciwgdGhlIGVycm9yIG1lc3NhZ2VzIHlvdQoJICAgIGdldCB3aGVuIHRoZSBvdmVybG9hZGluZyBpcyBub3QgcmVzb2x2ZWQgY291bGQgYmUKCSAgICBkaWZmZXJlbnQgZnJvbSB3aGF0IHRoZSB0cmFkaXRpb25hbCBtZXRob2QgcmV0dXJucy4KCgkgICAgV2l0aCB0aGUgb2xkIG1ldGhvZCB5b3UgYWx3YXlzIGdldCBhbiBlcnJvciBzdWNoIGFzIAoKCSAgICAgICAiTm8gbWF0Y2hpbmcgZnVuY3Rpb24gZm9yIG92ZXJsb2FkZWQgLi4uIgoKICAgICAgICAgICAgd2l0aCB0aGUgbmV3IG1ldGhvZCB5b3UgY2FuIGFsc28gZ2V0IGVycm9ycyBzdWNoIGFzCgoJICAgICAgICJUeXBlIGVycm9yIGluIGFyZ3VtZW50IDEgb2YgdHlwZSAuLi4iCgoJICAgIFNlZSBidWcgcmVwb3J0ICM5MzA1ODYgZm9yIG1vcmUgZGV0YWlscy4KICAgICAgICAgICAgCiAgCSAgICBTbywgdGhpcyBvcHRpbWl6YXRpb24gbXVzdCBiZSBleHBsaWNpdGx5IGVuYWJsZWQgYnkgdXNlcnMuCgoJICAgIFRoZSBuZXcgbWVjaGFuaXNtIGNhbiBiZSB1c2VkIGFzOgoKICAgICAgICAgICAgICBzd2lnIC1mYXN0ZGlzcGF0Y2gKCiAgICAgICAgICAgIG9yIHVzaW5nIHRoZSBmZWF0dXJlIGZvcm0KCgkgICAgICAlZmVhdHVyZSgiZmFzdGRpc3BhdGNoIikgbWV0aG9kOwogICAgICAgICAgICBvcgogICAgICAgICAgICAgICVmYXN0ZGlzcGF0Y2ggbWV0aG9kOwoJICAgIAoKMTIvMDYvMjAwNTogbW1hdHVzIAoKICAgICAgICAgIC0gU2V2ZXJhbCBtZW1vcnkgYW5kIHNwZWVkIGltcHJvdmVtZW50cywgc3BlY2lhbGx5IGZvcgoJICAgIHRlbXBsYXRlcy4gTm93IHN3aWcgaXMgdXAgdG8gMjAgZmFzdGVyIHRoYW4gYmVmb3JlIGZvcgoJICAgIGxhcmdlIHRlbXBsYXRlIGludGVyZmFjZXMsIHN1Y2ggYXMgdGhlIHN0ZF9jb250YWluZXJzLmkKCSAgICBhbmQgdGVtcGxhdGVfbWF0cml4LmkgZmlsZXMgaW4gdGhlIHB5dGhvbiB0ZXN0LXN1aXRlLgoKCSAgICBNZW1vcnkgZm9vdHByaW50IGlzIGFsc28gcmVkdWNlZCBpbiBjb25zaWRlcmF0aW9uIG9mIHNtYWxsCgkgICAgcGNzL2FyY2hpdGVjdHVyZXMuCgoJICAtIGFkZCBjb21tYW5kbGluZSBvcHRpb25zIC1jcHBlcnJhc3dhcm4gYW5kIC1ub2NwcGVycmFzd2FybiIgdG8gZm9yY2UKICAgICAgICAgICAgdGhlIHN3aWcgcHJlcHJvY2Vzc29yIHRvIHRyZWF0IHRoZSAjZXJyb3IgZGlyZWN0aXZlIGFzIGEgI3dhcm5pbmcuCgkgICAgCgkgICAgdGhlIHByYWdtYXMKCiAgICAgICAgICAgICAgICNwcmFnbWEgU1dJRyBjcHBlcnJhc3dhcm49MQogICAgICAgICAgICAgICAjcHJhZ21hIFNXSUcgY3BwZXJyYXN3YXJuPTAKCSAgICAgICAKCSAgICBhcmUgZXF1aXZhbGVudCB0byB0aGUgY29tbWFuZCBsaW5lIG9wdGlvbnMsIHJlc3BlY3RpdmVseS4KICAgICAgICAgICAgIAoKMTIvMDYvMjAwNTogbW1hdHVzCgkgICAgW1B5dGhvbl0gVGhlIGdlbmVyYXRlZCBjb2RlIGlzIG5vdyBtb3JlIHBvcnRhYmxlLCBlc3BlY2lhbGx5CgkgICAgZm9yIFdpbmRvd3MuIEZvbGxvd2luZyAKCiAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5weXRob24ub3JnL2RvYy9mYXEvd2luZG93cy5odG1sCgogICAgICAgICAgICBQeV9Ob25lIGlzIG5ldmVyIGFjY2Vzc2VkIGFzIGEgc3RydWN0dXJlLCBwbHVzIG90aGVyCiAgICAgICAgICAgIHRyaWNrcyBtZW50aW9uZWQgdGhlcmUuCgoxMi8wNi8yMDA1OiBtbWF0dXMKCSAgICBbUHl0aG9uXSBBZGRlZCBpbml0aWFsIHN1cHBvcnQgZm9yIHRocmVhZHMgYmFzZWQgaW4gdGhlCgkgICAgcHJvcG9zYWwgYnkgSm9zZXBoIFdpbnN0b24uCgoJICAgIFRoZSB1c2VyIGludGVyZmFjZSBpcyBhcyBmb2xsb3dzOgoKCSAgICAxLi0gdGhlIG1vZHVsZSB0aHJlYWQgc3VwcG9ydCBpcyBlbmFibGUgdmlhIHRoZSAidGhyZWFkcyIgbW9kdWxlCiAgICAgICAgICAgICAgICBvcHRpb24sIGkuZS4KCiAgICAgICAgICAgICAgICAgICVtb2R1bGUoInRocmVhZHMiPTEpCgogICAgICAgICAgICAyLi0gRXF1aXZhbGVudCB0byB0aGF0LCBpcyB0aGUgbmV3ICctdGhyZWFkcycgc3dpZyBvcHRpb24KCiAgICAgICAgICAgICAgICAgIHN3aWcgLXRocmVhZHMgLXB5dGhvbiAuLi4KCiAgICAgICAgICAgIDMuLSBZb3UgY2FuIHBhcnRpYWxseSBkaXNhYmxlIHRocmVhZCBzdXBwb3J0IGZvciBhIGdpdmVuCiAgICAgICAgICAgICAgICBtZXRob2QgdXNpbmc6CgogICAgICAgICAgICAgICAgICAlZmVhdHVyZSgibm90aHJlYWQiKSBtZXRob2Q7CiAgICAgICAgICAgICAgICBvcgoJCSAgJW5vdGhyZWFkIG1ldGhvZDsKCiAgICAgICAgICAgICAgICBhbHNvLCB5b3UgY2FuIGRpc2FibGUgc2VjdGlvbnMgb2YgdGhlIHRocmVhZCBzdXBwb3J0LCAKICAgICAgICAgICAgICAgIGZvciBleGFtcGxlCgogICAgICAgICAgICAgICAgICAlZmVhdHVyZSgibm90aHJlYWRibG9jayIpIG1ldGhvZDsKICAgICAgICAgICAgICAgIG9yCgkJICAlbm90aHJlYWRibG9jayBtZXRob2Q7CgogICAgICAgICAgICAgICAgICAlZmVhdHVyZSgibm90aHJlYWRhbGxvdyIpIG1ldGhvZDsKICAgICAgICAgICAgICAgIG9yCgkJICAlbm90aHJlYWRhbGxvdyBtZXRob2Q7CgogICAgICAgICAgICAgICAgdGhlIGZpcnN0IGRpc2FibGVzIHRoZSBDKysvcHl0aG9uIHRocmVhZCBwcm90ZWN0aW9uLCBhbmQgdGhlCiAgICAgICAgICAgICAgICBzZWNvbmQgZGlzYWJsZXMgdGhlIHB5dGhvbi9DKysgdGhyZWFkIHByb3RlY3Rpb24uIAoKICAgICAgICAgICAgNC4tIFRoZSBjdXJyZW50IHRocmVhZCBzdXBwb3J0IGlzIGJhc2VkIGluIHRoZSBQeUdJTAogICAgICAgICAgICAgICAgZXh0ZW5zaW9uIHByZXNlbnQgaW4gcHl0aG9uIHZlcnNpb24gMi4zIG9yIGxhdGVyLCBidXQKICAgICAgICAgICAgICAgIHlvdSBjYW4gcHJvdmlkZSB0aGUgdGhyZWFkIGNvZGUgZm9yIG9sZGVyIHZlcnNpb25zIGJ5CiAgICAgICAgICAgICAgICBkZWZpbmluZyB0aGUgbWFjcm9zIGluIHB5dGhyZWFkcy5zd2cuCgoJCUlmIHlvdSBnZXQgYSB3b3JraW5nIGltcGxlbWVudGF0aW9uIGZvciBvbGRlciB2ZXJzaW9ucywKCQlwbGVhc2Ugc2VuZCB1cyBhIHBhdGNoLgoKICAgICAgICAgICAgRm9yIHRoZSBjdXJpb3VzIGFib3V0IHBlcmZvcm1hbmNlLCBoZXJlIGFyZSBzb21lIG51bWJlcnMKICAgICAgICAgICAgZm9yIHRoZSBwcm9maWxldGVzdC5pIHRlc3QsIHdoaWNoIGlzIHVzZWQgdG8gY2hlY2sgdGhlIHNwZWVkCgkgICAgb2YgdGhlIHdyYXBwZWQgY29kZToKCgkgICAgICAgIG5vdGhyZWFkICAgICAgICAgICA5LjZzICAobm8gdGhyZWFkIGNvZGUpCgkJbm90aHJlYWRibG9jayAgICAgMTIuMnMgIChvbmx5ICdhbGxvdycgY29kZSkKCQlub3RocmVhZGFsbG93ICAgICAxMy42cyAgKG9ubHkgJ2Jsb2NrJyBjb2RlKQogICAgICAgICAgICAgICAgZnVsbCB0aHJlYWQgICAgICAgMTUuNXMgICgnYWxsb3cnICsgJ2Jsb2NrJyBjb2RlKQoJICAgIAoJICAgIGkuZS4sIGZ1bGwgdGhyZWFkIGNvZGUgZGVjcmVhc2VzIHRoZSB3cmFwcGluZyBwZXJmb3JtYW5jZSBieQoJICAgIGFyb3VuZCA2MCUuIElmIHRoYXQgaXMgaW1wb3J0YW50IHRvIHlvdXIgYXBwbGljYXRpb24sIHlvdQoJICAgIGNhbiB0dW5lIGVhY2ggbWV0aG9kIHVzaW5nIHRoZSBkaWZmZXJlbnQgJ25vdGhyZWFkJywKCSAgICAnbm90aHJlYWRibG9jaycgb3IgJ25vdGhyZWFkYWxsb3cnIGZlYXR1cmVzIGFzCgkgICAgbmVlZGVkLiBOb3RlIHRoYXQgZm9yIHNvbWUgbWV0aG9kcyBkZWFjdGl2YXRpbmcgdGhlCgkgICAgJ3RocmVhZCBibG9jaycgb3IgJ3RocmVhZCBhbGxvdycgY29kZSBpcyBub3QgYW4gb3B0aW9uLAoJICAgIHNvLCBiZSBjYXJlZnVsLgoJICAgIAoKMTEvMjYvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgU1dJRyBsaWJyYXJ5IGZpbGVzIHVzZSBzeXN0ZW0gYW5nbGUgYnJhY2tldHMgZXZlcnl3aGVyZSBmb3IgJWluY2x1ZGUsIGVnCiAgICAgICAgICAgICAgJWluY2x1ZGUgInN0ZF9jb21tb24uaSIKICAgICAgICAgICAgYmVjb21lcwogICAgICAgICAgICAgICVpbmNsdWRlIDxzdGRfY29tbW9uLmk+CgoxMS8yNi8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YSwgQyNdCiAgICAgICAgICAgIFR5cGVzYWZlIGVudW1zIGFuZCBwcm9wZXIgZW51bXMgaGF2ZSBhbiBleHRyYSBjb25zdHJ1Y3RvciBzbyB0aGF0IGVudW0gaXRlbSB2YWx1ZXMgdGhhdAogICAgICAgICAgICBhcmUgaW5pdGlhbGlzZWQgYnkgYW5vdGhlciBlbnVtIGl0ZW0gdmFsdWUgY2FuIGJlIHdyYXBwZWQgd2l0aG91dCBoYXZpbmcgdG8gdXNlICVqYXZhY29uc3R2YWx1ZS8KICAgICAgICAgICAgJWNzY29uc3R2YWx1ZSBmb3Igd2hlbiB1c2luZyAlamF2YWNvbnN0KDEpLyVjc2NvbnN0KDEpLiBTdWdnZXN0aW9uIGJ5CiAgICAgICAgICAgIEJvYiBNYXJpbmllci9Eb3VnbGFzIFBlYXJzb24uCiAgICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICB0eXBlZGVmIGVudW0KICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgeHl6LAogICAgICAgICAgICAgICAgIGxhc3QgPSB4eXoKICAgICAgICAgICAgICB9IHJlcGVhdDsKCjExLzIxLzIwMDU6IG1tYXR1cwoJICAgIFtydWJ5ICsgcHl0aG9uXQoKCSAgICBGaXhlcyBmb3IgZGlyZWN0b3JzICsgcG9pbnRlcnMuIFRoaXMgaXMgYW4gdWdseSBwcm9ibGVtIHdpdGhvdXQgYW4gZWFzeQoJICAgIHNvbHV0aW9uLiBCZWZvcmUgd2UgaWRlbnRpZmllZCB0aGlzIGNhc2UgYXMgcHJvYmxlbWF0aWM6CgoJICAgICAgICAgIHZpcnR1YWwgY29uc3QgTXlDbGFzcyYgbXlfbWV0aG9kKCk7CgogICAgICAgICAgICBidXQgaXQgdHVybnMgb3V0IHRoYXQgYWxsIHRoZSBjYXNlcyB3aGVyZSBhIHBvaW50ZXIsIGFycmF5IG9yCiAgICAgICAgICAgIHJlZmVyZW5jZSBpcyByZXR1cm5lZCwgYXJlIHByb2JsZW1hdGljLCBldmVuIGZvciAKCSAgICBwcmltaXRpdmUgdHlwZXMgKGFzIGludCwgZG91YmxlLCBjaGFyKiwgZXRjKS4KCgkgICAgVG8gdHJ5IHRvIGZpeCB0aGUgaXNzdWUsIGEgbmV3IHR5cGVtYXAgd2FzIGFkZGVkLAoJICAgICdkaXJlY3RvcmZyZWUnLCB3aGljaCBpcyB1c2VkIHRvICdmcmVlJyB0aGUgcmVzb3VyY2VzCgkgICAgYWxsb2NhdGVkIGR1cmluZyB0aGUgJ2RpcmVjdG9yb3V0JyBwaGFzZS4gQXQgdGhlIHNhbWUKCSAgICB0aW1lLCBhIHByaW1pdGl2ZSBnYXJiYWdlIGNvbGxlY3RvciBlbmdpbmUgd2FzIGFkZGVkIHRvCgkgICAgZGVhbCB3aXRoIG9ycGhhbmVkIGFkZHJlc3Nlcywgd2hlbiBuZWVkZWQuCgkgICAgCgkgICAgVGhlIHNpdHVhdGlvbiBpcyBtdWNoIGJldHRlciBub3csIGJ1dCBzdGlsbCBpdCBpcyBwb3NzaWJsZSB0byBoYXZlCgkgICAgbWVtb3J5IGV4aGF1c3RhdGlvbiBpZiByZWN1cnNpb24gaXMgdXNlZC4KCgkgICAgU28sIHN0aWxsIHlvdSBuZWVkIHRvIGF2b2lkIHJldHVybmluZyBwb2ludGVycywgYXJyYXlzIG9yCgkgICAgcmVmZXJlbmNlcyB3aGVuIHVzaW5nIGRpcmVjdG9yIG1ldGhvZHMuCgoJICAgIC0gQWRkZWQgc3RkaW50LmkgLSB0eXBlbWFwcyBmb3IgbGF0ZXN0IEM5OSBpbnRlZ3JhbCB0eXBlcyBmb3VuZCBpbiBzdGRpbnQuaC4KCSAgICAKMTEvMTQvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgTW9yZSB0eXBlcyBhZGRlZCB0byB3aW5kb3dzLmksIGVnIFVJTlQ4LCBXT1JELCBCWVRFIGV0Yy4gCiAgICAgICAgICAgIEluY2x1ZGluZyB3aW5kb3dzLmkgd2lsbCBhbHNvIGVuYWJsZSBTV0lHIHRvIHBhcnNlIHRoZSBfX2RlY2xzcGVjIE1pY3Jvc29mdAogICAgICAgICAgICBleHRlbnNpb24sIGVnIF9fZGVjbHNwZWMoZGxsaW1wb3J0KS4gQWxzbyBvdGhlciBXaW5kb3dzIGNhbGxpbmcgY29udmVudGlvbnMKICAgICAgICAgICAgc3VjaCBhcyBfX3N0ZGNhbGwuCgoxMS8xMC8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBOZXcgbGlicmFyeSBmaWxlIGZvciBXaW5kb3dzIC0gd2luZG93cy5pLiBUaGlzIGZpbGUgd2lsbCBjb250YWluIHVzZWZ1bCB0eXBlCiAgICAgICAgICAgIGluZm9ybWF0aW9uIGZvciB1c2VycyB3aG8gaW5jbHVkZSB3aW5kb3dzLmguIEluaXRpYWwgc3VwcG9ydCBpcyBmb3IgdGhlCiAgICAgICAgICAgIG5vbiBJU08gaW50ZWdyYWwgdHlwZXM6IF9faW50OCwgX19pbnQxNiwgX19pbnQzMiwgX19pbnQ2NCBhbmQgdW5zaWduZWQgdmVyc2lvbnMuCiAgICAgICAgICAgIFRoZSB1bnNpZ25lZCB2ZXJzaW9ucyBwcmV2aW91c2x5IGNvdWxkIG5vdCBiZSBwYXJzZWQgYnkgU1dJRy4gIFNGICM4NzIwMTMuCgoxMS8wOS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YSwgQyNdIFBvcnRhYmlsaXR5IHdhcm5pbmcgZm9yIGZpbGVzIHdoaWNoIHdpbGwgb3ZlcndyaXRlIGVhY2ggb3RoZXIgb24gY2FzZQogICAgICAgICAgICBpbnNlbnNpdGl2ZSBmaWxlIHN5c3RlbXMgc3VjaCBhcyBGQVQzMi9OVEZTLiBUaGlzIHdpbGwgb2NjdXIsIGZvciBleGFtcGxlLCB3aGVuIHR3bwogICAgICAgICAgICBjbGFzcyBuYW1lcyBhcmUgdGhlIHNhbWUgYmFycmluZyBjYXNlLiBUaGUgd2FybmluZyBpcyBpc3N1ZWQgb24gYWxsIHBsYXRmb3JtcyBhbmQKICAgICAgICAgICAgY2FuIGJlIHN1cHByZXNzZWQgd2l0aCB0aGUgdXN1YWwgd2FybmluZyBzdXBwcmVzc2lvbiB0ZWNobmlxdWVzLiBTRiBidWcgIzEwODQ1MDcuCgoxMS8wOS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICAuL2NvbmZpZ3VyZSAtLXdpdGgtcHl0aG9uIC0td2l0aC1ydWJ5IC0td2l0aC1wZXJsNSBldGMgZW5hYmxlIHRoZXNlIGxhbmd1YWdlcywKICAgICAgICAgICAgaWUgdGhlIC0td2l0aC14eHh4IG9wdGlvbnMsIHdoZXJlIG5vIHBhdGggaXMgc3BlY2lmaWVkLCB3b3JrIHRoZSBzYW1lIGFzIGlmIAogICAgICAgICAgICB0aGUgb3B0aW9uIHdhcyBub3Qgc3BlY2lmaWVkIGF0IGFsbC4gQmFzZWQgb24gcGF0Y2hlcyAjMTMzNTA0MiAjMTMyOTA0OCAjMTMyOTA0Ny4KCjExLzA5LzIwMDU6IGRhbmN5CgoJICAgIFtBbGxlZ3JvY2xdCgkgICAgQWRkIEMrKyBzdXBwb3J0IHRvIHRoZSBBbGxlZ3JvY2wgbW9kdWxlLiBGdXJ0aGVyCgkgICAgZW5oYW5jZXMgdGhlIEMgc3VwcG9ydCBhcyB3ZWxsLiBTb21lIG9mIHRoZQoJICAgIGZlYXR1cmVzOgoKCSAgICAtIE1VQ0ggYmV0dGVyIGdlbmVyYXRpb24gb2YgZm9yZWlnbiB0eXBlcyBiYXNlZCBvbgoJICAgIHRoZSBDL0MrKyB0eXBlcyBmb3IgdXNlIGluIGRlZmluaW5nIHRoZSBGRkkgb24KCSAgICB0aGUgbGlzcCBzaWRlLiBXZSBkb24ndCBwYXNzIGV2ZXJ5dGhpbmcgYXMgYSAoKiA6dm9pZCkKCSAgICBhbnkgbG9uZ2VyLgoKCSAgICAtIFVzZXMgdHlwZW1hcHMgZm9yIGJldHRlciBjb250cm9sIG9mIHR5cGUgY29udmVyc2lvbnMKCSAgICBhbmQgY29kZSBnZW5lcmF0aW9uIGluIHRoZSBnZW5lcmF0ZWQgbGlzcCBhbmQgYysrIHdyYXBwZXIKCSAgICBjb2RlLgoKCSAgICAtIENMT1Mgd3JhcHBpbmcgb2YgcG9pbnRlcnMgcmV0dXJuZWQgZnJvbSBmb3JlaWduIHNwYWNlCgkgICAgbWFrZXMgaXQgZWFzaWVyIHRvIGRpZmZlcmVudGlhdGUgcG9pbnRlcnMgaW4gdXNlciBjb2RlLgoJICAgIFRoZSB3cmFwcGluZyBvYmplY3RzIGNhbiBiZSBwYXNzZWQgZGlyZWN0bHkgdG8gRkYgY2FsbHMuCgoJICAgIC0gRGVmdW4gd3JhcHBpbmcgb2YgRkYgY2FsbHMsIGFsbG93aW5nIGZvciBtb3JlIGxpc3B5CgkgICAgaW50ZXJmYWNlLiBDb252ZXJzaW9uLCBHQ2luZywgb2YgbGlzcCBvYmplY3RzIHRvIAoJICAgIGZvcmVpZ24gb2JqZWN0cyBjYW4gYmUgZG9uZSBpbiB0aGUgd3JhcHBpbmcgZGVmdW4gdmlhCgkgICAgdGhlIHVzZSBvZiB0eXBlbWFwcy4KCSAgICAKCSAgICAtIG92ZXJsb2FkIGRpc3BhdGNoaW5nIGltcGxlbWVudGVkIG9uIHRoZSBsaXNwIHNpZGUKCSAgICB1c2luZyBnZW5lcmljIGZ1bmN0aW9ucy4KCgkgICAgLSBUZW1wbGF0ZXMgYW5kIHN5bm9ueW1vdXMgdHlwZXMgc3VwcG9ydGVkLgoKMTEvMDcvMjAwNTogbW1hdHVzCgoJICAgIFtQeXRob25dIEFkZGluZyBwcm9wZXIgc3VwcG9ydCBmb3IgbXVsdGktaW5oZXJpdGFuY2UgaW4KCSAgICB0aGUgcHl0aG9uIHNpZGUsIGllLCBpZiB5b3UgaGF2ZSB0d28gQysrIHdyYXBwZWQgY2xhc3MsIEZvbwoJICAgIGFuZCBCYXIsIG5vdzoKCgkgICAgICAgY2xhc3MgTXlQeXRob25DbGFzcyhGb28sQmFyKToKCSAgICAgICAgICAuLi4uCgogICAgICAgICAgICB3aWxsIHByb3Blcmx5IHdvcmssIGV2ZW4gd2l0aCBkaXJlY3RvcnMsIGFuZCB0aGUKICAgICAgICAgICAgZGVhbGxvY2F0aW9uIG9mIEZvby50aGlzIGFuZCBCYXIudGhpcyB3aWxsIGZvbGxvdwogICAgICAgICAgICBjb3JyZWN0bHkuIEJlZm9yZSwgYSBjbGFzcyBjb3VsZCBvbmx5IGhhdmUgb25lICd0aGlzJwogICAgICAgICAgICBpbnN0YW5jZSAodW5saWtlIEMrKyksIG9ubHkgdGhlIGxhc3QgYmFzZSBjbGFzcyB3YXMKICAgICAgICAgICAgcHJvcGVybHkgZGVsZXRlZCwgb3IgZGV0ZWN0ZWQgd2l0aCBkaXJlY3RvcnMuCgoJICAgIE5vdyAnc2VsZi50aGlzJyBjYW4gYmUgYSBsaXN0LCB3aGljaCB3aWxsIGNvbnRhaW4gdGhlIEMrKwoJICAgIGluc3RhbmNlIHBvaW50ZXJzIGZvciBhbGwgdGhlIGJhc2UgY2xhc3Nlcy4KCSAgICAKCSAgICBBbHNvLCBzd2lnLnRoaXMgaXMgcmVzcG9uc2libGUgZm9yIGRlYWxsb2NhdGluZyB0aGUgQysrCgkgICAgaW5zdGFuY2UocyksIGFuZCB0aGUgX19kZWxfXyBtZXRob2QgaXMgbm90IGVtaXR0ZWQgdW5sZXNzCgkgICAgdGhlIHVzZXIgcHJlcHBlbmQvYXBwZW5kIHNvbWUgY29kZSB0byBpdC4KCgkgIC0gU3dpZyBjYW4gbm93IGRldGVjdCBtZW1vcnkgbGVha3MsIGllLCBpZiB5b3Ugc3RpbGwKCSAgICBkb24ndCB1c2UgcHJveHkvc2hhZG93IGNsYXNzZXMsIGFuZCB0eXBlIHNvbWV0aGluZyBsaWtlCgkgICAgCgkgICAgICAgICBpbXBvcnQgX2V4YW1wbGUKCSAgICAgICAgIGYgPSBfZXhhbXBsZS5uZXdfRm9vKCkKCgkgICAgYW5kIGZvcmdldCB0byBjYWxsIF9leGFtcGxlLmRlbGV0ZV9Gb28oZiksIHRoZW4gc3dpZyB3aWxsCgkgICAgdGVsbCB5b3UgdGhhdCB0aGVyZSBpcyBhIG1lbW9yeSBsZWFrLgoKCSAgICBPdGhlcndpc2UsIGlmIHlvdSBhbHdheXMgdXNlIHRoZSBwcm94eSBjbGFzc2VzLCB5b3UgcHJvYmFibHkKCSAgICB5b3Ugd2lsbCBuZXZlciBldmVyIHNlZSB0aGlzIHdhcm5pbmcgdW5sZXNzIHRoZXJlIGlzCgkgICAgc29tZXRoaW5nIHdyb25nIGluc2lkZSB0aGUgc3dpZyB3cmFwcGluZyBjb2RlLgoJICAgICAgIAoJCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoJICAgIAoJICAgIElmIHlvdSBvdmVybG9hZGVkIHRoZSBfX2RlbF9fIG1ldGhvZCwgYW5kIGNhbGwgdGhlIGJhc2UKCSAgICBvbmUJIHdpdGhvdXQgYSB0cnkgYmxvY2ssIGFzIGluCgoJICAgICAgICAgICBjbGFzcyBNeUNsYXNzKFN3aWdDbGFzcyk6CgoJICAgICAgICAgICAgICBkZWYgX19kZWxfXyhzZWxmKToKCQkgICAgICAgICAgPHlvdXIgY29kZSBoZXJlPgoJCSAgICAgICAgICBTd2lnQ2xhc3MuX19kZWxfXyhzZWxmKQoJCQkgIAogICAgICAgICAgICBweXRob24gY291bGQgY29tcGxhaW4gdGhhdCB0aGUgbWV0aG9kIFN3aWdDbGFzcy5fX2RlbF9fIGlzCiAgICAgICAgICAgIHVuZGVmaW5lZC4gVHJ5IHRvIHVzZSBpbnN0ZWFkOgoJICAgIAoJICAgICAgICAgICAgICBkZWYgX19kZWxfXyhzZWxmKToKCQkgICAgICAgICAgPHlvdXIgY29kZSBoZXJlPgoJCSAgICAgICAgICB0cnk6IFN3aWdDbGFzcy5fX2RlbF9fKHNlbGYpCgkJCSAgZXhjZXB0OiBwYXNzCgoJICAgIG9yIHNpbXBseSAJCSAgCgoJICAgICAgICAgICAgICBkZWYgX19kZWxfXyhzZWxmKToKCQkgICAgICAgICAgPHlvdXIgY29kZSBoZXJlPgoKMTEvMDIvMjAwNTogbW1hdHVzCgoJICAgIFtQeXRob25dIEFkZGluZyBtb3JlIGZ1biB0byBTVEwvU1REIGNvbnRhaW5lcnMsIG5vdyB5b3UKCSAgICBjYW4gZG8KCgkgICAgICAgJXRlbXBsYXRlKHB5c2V0KSBzdGQ6OnNldDxQeU9iamVjdCAqPjsJCQoJICAgICAgICV0ZW1wbGF0ZShweXZlY3Rvcikgc3RkOjp2ZWN0b3I8UHlPYmplY3QgKj47CQoJICAgICAgICV0ZW1wbGF0ZSgpIHN0ZDo6cGFpcjxQeU9iamVjdCAqLFB5T2JqZWN0ICo+OwkKCSAgICAgICAldGVtcGxhdGUocHl2ZWN0b3IpIHN0ZDo6bWFwPFB5T2JqZWN0ICosUHlPYmplY3QgKj47CgkgICAgICAgLi4uLgoKCSAgICBUaGUgc2FtZSAgYXBwbGllcyB0byBzdGQ6Omxpc3QsIHN0ZDo6ZGVxdWUsIHN0ZDo6bXVsdGlzZXQsIGV0Yy4KCgkgICAgVGhlbiwgYXQgdGhlIHB5dGhvbiBzaWRlIHlvdSBjYW4gZG8gbm93OgoKCSAgICAgICAjIEMrKyBzdGQ6OnZlY3RvciBhcyBuYXRpdmUgcHl0aG9uIHNlcXVlbmNlCgkgICAgICAgdiA9IHB5dmVjdG9yKFsxLCJoZWxsbyIsKDEsMildKQoJICAgICAgIHByaW50IHZbMV0KCSAgICAgICA+PiAnaGVsbG8nCgkgICAgICAgcHJpbnQgdlsyXQoJICAgICAgID4+ICgxLDIpCgkgICAgICAgCQkJCQkgICAKCSAgICAgICAjIEMrKyBzdGQ6OnNldCBhcyBuYXRpdmUgcHl0aG9uIHNlcXVlbmNlCgkgICAgICAgcyA9IHB5c2V0KCkJCQkgICAKCSAgICAgICBzLmluc2VydCgoMSwyKSkJCSAgIAoJICAgICAgIHMuaW5zZXJ0KDEpCQkJICAgCgkgICAgICAgcy5pbnNlcnQoImhlbGxvIikKCSAgICAgICBzdW09KCkKCSAgICAgICBmb3IgaSBpbiBzOgoJICAgICAgICAgc3VtICs9KGksKQoJICAgICAgIHByaW50IHN1bQoJICAgICAgID4+PiAoMSwgJ2hlbGxvJywgKDEsIDIpKQoJICAgICAgIAkJCQkgICAKCSAgICAgICAjIEMrKyBzdGQ6Om1hcCBhcyBuYXRpdmUgcHl0aG9uIHNlcXVlbmNlCgkgICAgICAgbSA9IHB5bWFwKCkJCQkgICAKCSAgICAgICBtWyJmb28iXSA9ICJoZWxsbyIJCSAgIAoJICAgICAgIG1bMV0gPSAoMSwyKQoJICAgICAgIHBtID0ge30KCSAgICAgICBmb3IgayBpbiBtOgkgICAgCSAgIAoJICAgICAgICAgcG1ba10gPSBtW2tdCgkgICAgICAgcHJpbnQgcG0KCSAgICAgICA+Pj4gezE6ICgxLCAyKSwgJ2Zvbyc6ICdoZWxsbyd9CgoJICAgIGllLCB0aGUgU1REL1NUTCBjb250YWluZXJzIHdvcmsgYXMgcmVhbCBuYXRpdmUgcHl0aG9uCgkgICAgY29udGFpbmVyLCB3aXRoIGFyYml0cmFyeSBpdGVtIHR5cGVzIGFuZCBzby4KCgkgICAgQnV0IHNpbmNlIG5vcm1hbCBDKysgY29udGFpbmVycyBkbyBub3QgcHJvcGVybHkgcmVmL3VucmVmCgkgICAgdGhlaXIgaXRlbXMsIHlvdSBzaG91bGQgdXNlIHRoZSBzYWZlciB2ZXJzaW9uczoKCSAgICAKCSAgICAgICV0ZW1wbGF0ZShweXNldCkgc3RkOjpzZXQ8c3dpZzo6UHlPYmplY3RfcHRyPjsKCSAgICAgICV0ZW1wbGF0ZShweXZlY3Rvcikgc3RkOjp2ZWN0b3I8c3dpZzo6UHlPYmplY3RfcHRyPjsKCSAgICAgICV0ZW1wbGF0ZSgpIHN0ZDo6cGFpcjxzd2lnOjpQeU9iamVjdF9wdHIsIHN3aWc6OlB5T2JqZWN0X3B0cj47CgkgICAgICAldGVtcGxhdGUocHl2ZWN0b3IpIHN0ZDo6bWFwPHN3aWc6OlB5T2JqZWN0X3B0cixzd2lnOjpQeU9iamVjdF9wdHI+OwoJICAgICAgLi4uLgoKCSAgICB3aGVyZSBzd2lnOjpQeU9iamVjdF9wdHIgaXMgYSBQeU9iamVjdCAqIGVudmVsb3BlIGNsYXNzIHByb3ZpZGVkCgkgICAgdG8gc2FmZWx5IGluY3JlZi9kZWNyZWYgdGhlIHB5dGhvbiBvYmplY3QuIAoJICAgIAoJICAgIFNvLCBub3cgeW91IGNhbiB1c2UgYWxsIHRoZSBTVEwvU1REIGNvbnRhaW5lcnMgYXMgbmF0aXZlCgkgICAgUHl0aG9uIGNvbnRhaW5lcnMuIAoKCSAgICBOb3RlIDE6IHN0ZDo6bWFwLCBzdGQ6OnNldCBhbmQgdGhlIG90aGVyICdvcmRlcmVkJwoJICAgIGNvbnRhaW5lcnMgd2lsbCBwcm9wZXJseSB1c2UgUHlPYmplY3RfQ29tcGFyZSBmb3Igc29ydGluZywKCSAgICB3aGVuIG5lZWRlZC4KCgkgICAgTm90ZSAyOiBhbGwgdGhlIFNUTC9TVEQgY29udGFpbmVycyBoYXZlIGEgbGltaXQgc2l6ZSBvZgoJICAgIFNJWkVfTUFYLCBpZSwgeW91IGNhbiBoYXZlIG1hbmFnZSBjb250YWluZXJzIGxhcmdlciB0aGFuCgkgICAgSU5UX01BWCwgdGhlIHB5dGhvbiBsaW1pdC4KCSAgICAKCSAgICAgIAoxMS8wMi8yMDA1OiBtbWF0dXMKCgkgICAgW1B5dGhvbl0KCSAgICAtIGFkZCAnaXRlcmF0b3IoKScgbWV0aG9kIGZvciBhbGwgc2VxdWVuY2VzIGFuZCBhZGRpdGlvbmFsbHkKCSAgICAgICdrZXlfaXRlcmF0b3IoKScgZm9yIG1hcHMuCgoJICAgICAgJ2l0ZXJhdG9yKCknIHdpbGwgYWx3YXlzIHJldHVybiB0aGUgbmF0aXZlIEMrKyBpdGVyYXRvci4KCSAgICAgIEFkZGl0aW9uYWxseSwgaW4gbWFwcywgJ2tleV9pdGVyYXRvcigpJyB3aWxsIHJldHVybiBhIHB5dGhvbgoJICAgICAgaXRlcmF0b3IgdXNpbmcgb25seSB0aGUgbWFwIGtleXMuCgkgICAgICAKCSAgICAgIEluIGdlbmVyYWwgdGhlIHNlcXVlbmNlIG1ldGhvZCBfX2l0ZXJfXyB3aWxsIGNhbGwKCSAgICAgICdpdGVyYXRvcigpJywgcmV0dXJuaW5nIHRoZSBuYXRpdmUgQysrIGl0ZXJhdG9yLCBidXQgaW4KCSAgICAgIG1hcHMgaXQgd2lsbCBjYWxsICdrZXlfaXRlcmF0b3IoKScsIG1haW50YWluaW5nCgkgICAgICBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgoKCSAgICAgIEhlbmNlLCBmb3Igc3RkOjptYXBzLCB5b3UgY2FuIHBsYXkgdGhlbiB3aXRoIHRoZSBuYXRpdmUKCSAgICAgIEMrKyBpdGVyYXRvciwgd2hpY2ggdmFsdWUgaXMgYSAoa2V5LCB2YWx1ZSkgcGFpciwgYnkKCSAgICAgIGNhbGxpbmcgbWFwLml0ZXJhdG9yKCksIGFzIHdpdGggbWFwLmJlZ2luKCksIG1hcC5lbmQoKSwgZXRjLgoKCSAgICAgIFRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgbWFwLml0ZXJhdG9yKCkgcmV0dXJucyBhIHNhZmUKCSAgICAgICdjbG9zZWQnIGl0ZXJhdG9yLCB3aGlsZSBtYXAuYmVnaW4oKSBhbmQgbWFwLmVuZCgpIGFyZQoJICAgICAgJ29wZW4nIGl0ZXJhdG9ycy4KCgkgICAgICBBICdjbG9zZWQnIGl0ZXJhdG9yIGtub3dzIHRoZSBiZWdpbiBhbmQgdGhlIGVuZCBvZiB0aGUKCSAgICAgIHNlcXVlbmNlLCBhbmQgaXQgbmV2ZXIgY2FuIHNlZy4gZmF1bHQuIEFuICdvcGVuJwoJICAgICAgaXRlcmF0b3IsIGFzIGluIEMrKywgY2FuIHNlZy4gZmF1bHQgYXQgdGhlIEMrKyBzaWRlLgoKCSAgICAgICAgICMgYSBjbG9zZWQgaXRlcmF0b3IgaXMgc2FmZSBpbiB0aGUgZm9sbG93aW5nIGV4YW1wbGUuCgkJICMgdGhlIG5leHQoKSBtZXRob2Qgd2lsbCB0aHJvdyBhIFN0b3BJdGVyYXRpb24KCSAgICAgICAgICMgZXhjZXB0aW9uIGFzIG5lZWRlZAoJCgkgICAgICAgICBpID0gc2VxLml0ZXJhdG9yKCkKCQkgdHJ5OgogICAgICAgICAgICAgICAgICAgICAgd2hpbGUgVHJ1ZToKCQkgICAgICAgIHN1bSArPSBpLm5leHQoKQoJCSBleGNlcHQ6IHBhc3MKCQkgCgkJICMgYW4gb3BlbiBpdGVyYXRvciBhbHdheXMgbmVlZCB0byBiZSBjaGVja2VkLAoJCSAjIG9yIGl0IHdpbGwgY3Jhc2ggYXQgdGhlIEMrKyBzaWRlCgoJICAgICAgICAgY3VycmVudCA9IHNlcS5iZWdpbigpCiAgICAgICAgICAgICAgICAgZW5kID0gc2VxLmVuZCgpCgkJIHdoaWxlIChjdXJyZW50ICE9IGVuZCk6CgkJICAgIHN1bSArPSBjdXJyZW50Lm5leHQoKQoJICAgICAgCgkgICAgICAKCSAgICBbUHl0aG9uXQoJICAgIC0gRmluYWxseSwgd2hlbiB3ZSBjYWxsIAoKCSAgICAgICAgZiA9IEZvbygpCgoJICAgICAgdGhlIGNvbnN0cnVjdGlvbiBpcyAnb25lLXdheScuIEJlZm9yZSBjb25zdHJ1Y3Rpb24gIHdhcyBkb25lCgkgICAgICBzb21ldGhpbmcgbGlrZQoKCSAgICAgICAgICBGb28oKSAocHl0aG9uKSAtPiBfbmV3X0ZvbygpIChDKyspIAogICAgICAgICAgICAgICAgICBuZXdfRm9vKCkgKEMrKykgLT4gRm9vUHRyKCkgKHB5dGhvbikgCiAgICAgICAgICAgICAgICAgIEZvb1B0cigpIChweXRob24pIC0+IEZvbygpIChweXRob24pCgogICAgICAgICAgICAgIGFuZCByZXR1cm5pbmcgYSBwb2ludGVyIHdhcyBkb25lIGxpa2UKCiAgICAgICAgICAgICAgICAgIE5ld1BvaW50ZXJPYmooKSAoQysrKSAtPiBGb29QdHIoKSAocHl0aG9uKQogICAgICAgICAgICAgICAgICBGb29QdHIocHl0aG9uKSAtPiBGb28oKSAocHl0aG9uKQogICAgICAgICAgICAgICAgICAJCSAgCgoJICAgICAgaWUsIHdlIHdoZW4gZ29pbmcgYmFjayBhbmQgZm9yd2FyZCBiZXR3ZWVuIHRoZSBDKysgYW5kCgkgICAgICBweXRob24gc2lkZS4KCgkgICAgICBOb3cgc2luY2UgdGhlcmUgaXMgbm8gRm9vUHRyIHRoZSBjb25zdHJ1Y3Rpb24gcHJvY2VzcyBpcwoKCSAgICAgICAgICBGb28oKSAocHl0aG9uKSAtPiBfbmV3X0ZvbygpIChDKyspCiAgICAgICAgICAgICAgICAgIF9uZXdfRm9vKCkgKEMrKykgLT4gTmV3UG9pbnRlck9iaigpIChDKyspIChubyBzaGFkb3cgY2xhc3MpCgogICAgICAgICAgICAgIGFuZCByZXR1cm5pbmcgYSBwb2ludGVyIGlzIGRvbmUKCiAgICAgICAgICAgICAgICAgIE5ld1BvaW50ZXJPYmooKSAoQysrKSAod2l0aCBzaGFkb3cgY2xhc3MpIC0+IE5ld0luc3RhY2VPYmooKSAoQysrKQoKCSAgICAgIHdoZXJlIE5ld0luc3RhbmNlT2JqIGNyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugd2l0aG91dAoJICAgICAgY2FsbGluZyBfX2luaXRfXyBhbmQgaXQgZG9lc24ndCBnbyAnYmFjaycgdG8gcHl0aG9uLCBpcwoJICAgICAgJ3B1cmUnIEMgQVBJLgoKCSAgICAgLSBXaXRoIHRoaXMgY2hhbmdlLCBhbmQgdGhlIG90aGVyIG9uZXMgaW4gdGhlCiAgICAgICAgICAgICAgIFB5U3dpZ09iamVjdCB0eXBlLCB3aGljaCBub3cgY2FycmllcyB0aGUgdGhpc293biBhbmQKICAgICAgICAgICAgICAgc3dpZ190eXBlX2luZm8gcG9pbnRlciwgdGhlIGdlbmVyYXRlZCBjb2RlIHNob3VsZCBiZSBhcwogICAgICAgICAgICAgICBmYXN0IGFzIGJvb3N0OjpQeXRob24gYW5kL29yIHRoZSBvdGhlciBweXRob24gd3JhcHBlcnMKICAgICAgICAgICAgICAgYmFzZWQgaW4gcHVyZSBQeXRob24vQyBBUEkgY2FsbHMuCgoJICAgICAgIEFzIGEgcmVmZXJlbmNlLCB0aGUgcHJvZmlsZXRlc3RfcnVubWUucHkgZXhhbXBsZSwgd2hpY2gKCSAgICAgICBkb2VzIGEgc2ltcGxlIGNhbGwgZnVuY3Rpb24gbWFueSB0aW1lcywgc3VjaCBhcyB0aGlzIGNvZGU6CgogICAgICAgICAgICAgICAgICAgIGltcG9ydCBwcm9maWxldGVzdCAgICAgICAKCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAoJCSAgICBhID0gcHJvZmlsZXRlc3QuQSgpICAgICAgCgkJICAgIGIgPSBwcm9maWxldGVzdC5CKCkgICAgICAKCQkgICAgZm9yIGkgaW4gcmFuZ2UoMCwxMDAwMDAwKQoJICAgICAgICAgICAgICBhID0gYi5mbihhKSAgICAgICAgICAgIAoKCgkgICAgICAgd2hlcmUgZm4gaXMgZGVmaW5lZCBhcyAnQSogQjo6Zm4oQSAqYSkge3JldHVybiBhO30nLAoJICAgICAgIHByb2R1Y2VzICB0aGUgZm9sbG93aW5nIHRpbWVzCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9tb2Rlcm4gICAgbW9kZXJuCgkgICAgICAgICBzd2lnLTEuMy4yNiAgICAxOS43MHMgICAgICA1Ljk4cwogICAgICAgICAgICAgICAgIHN3aWctQ1ZTICAgICAgICAwLjk5cyAgICAgIDAuOThzCgkgICAgICAgCgoJICAgICAgIENsZWFybHksIHRoZXJlIGlzIGEgbGFyZ2UgaW1wcm92ZW1lbnQgZm9yIHRoZSBweXRob24KCSAgICAgICAnbm9tb2Rlcm4nIG1vZGUuIFN0aWxsLCB0aGUgJ21vZGVybicgbW9kZSBpcyBhcm91bmQKCSAgICAgICA2IHRpbWVzIGZhc3RlciB0aGFuIGJlZm9yZS4gRm9yIHRoZSBzYW1lIHRlc3QsIGJ1dAoJICAgICAgIHVzaW5nIHRoZSBub24tc2hhZG93IHZlcnNpb24gb2YgdGhlIG1vZHVsZSwgd2UgZ2V0CgoJICAgICAgICAgICAgICAgICAgICAgICBfcHJvZmlsZXRlc3QgKG5vbi1zaGFkb3cpCgkgICAgICAgICBzd2lnLTEuMy4yNiAgICAgMC44MHMgCiAgICAgICAgICAgICAgICAgc3dpZy1DVlMgICAgICAgIDAuNjBzIAoKCSAgICAgICBIZW5jZSwgbm93IGZvciBwcmFjdGljYWwgcHVycG9zZXMsIHRoZSBwcm94eSBvdmVyaGVhZAoJICAgICAgIGlzIGluc2lnbmlmaWNhbnQuCgoJICAgICAgIE5vdGUgdGhhdCB0aGUgcGVyZm9ybWFuY2UgbnVtYmVycyB3ZSBhcmUgc2hvd2luZyBpcyBmb3IKCSAgICAgICBhIHNpbXBsZSBtb2R1bGUgKHR3byB0eXBlcykgYW5kIGEgc2ltcGxlIGZ1bmN0aW9uIChvbmUKCSAgICAgICBhcmd1bWVudCkuIEZvciByZWFsIHNpdHVhdGlvbnMsIGZvciBtb2R1bGVzIHdpdGggbWFueQoJICAgICAgIG1vcmUgdHlwZXMgYW5kL29yIGZ1bmN0aW9ucyB3aXRoIG1hbnkgbW9yZSBwYXJhbWV0ZXJzLAoJICAgICAgIHlvdSB3aWxsIHNlZSBldmVuIGJldHRlciByZXN1bHRzLgoJICAgICAgIAoJCSAgCSAgICAgIAoxMC8zMS8yMDA1OiBtbWF0dXMKCSAgICBbUHl0aG9uXQoKCSAgICAtIEZpbmFsbHksIG5vIG1vcmUgQ2xhc3NQdHIgcHJveHkgY2xhc3Nlcy4gWW91IHdpbGwgc2VlCgkgICAgICBvbmx5IGEgY2xlYW4gQ2xhc3MgcHJveHkgY2xhc3MgaW4gdGhlIC5weSBmaWxlLgoKCSAgICAtIE5vIG1vcmUgJ3JlYWwnIHRoaXNvd24gYXR0cmlidXRlIGVpdGhlciwgdGhlIFB5U3dpZ09iamVjdCBub3cKICAgICAgICAgICAgICBjYXJyaWVzIHRoZSBvd25lcnNoaXAgaW5mby4KCgkgICAgICBZb3UgY2FuIGFsc28gZG8gc29tZXRoaW5nIGxpa2UKCgkgICAgICAgICAgcHJpbnQgc2VsZi50aGlzLm93bigpIAoJCSAgPj4+IFRydWUKCQkgIAoJCSAgc2VsZi50aGlzLmRpc293bigpCgkJICBzZWxmLnRoaXMub3duKDApCgkgICAgICAgICAgcHJpbnQgc2VsZi50aGlzLm93bigpIAoJCSAgPj4+IEZhbHNlCQkgIAoKCQkgIHNlbGYudGhpcy5hY3F1aXJlKCkKCQkgIHNlbGYudGhpcy5vd24oMSkKCSAgICAgICAgICBwcmludCBzZWxmLnRoaXMub3duKCkgCgkJICA+Pj4gVHJ1ZQoKCSAgICAgIFN0aWxsIHRoZSBvbGQgd2F5LAoJICAgICAgCgkgICAgICAgICAgcHJpbnQgc2VsZi50aGlzb3duCgkJICA+Pj4gVHJ1ZQoKCQkgIHNlbGYudGhpc293biA9IDAKCSAgICAgICAgICBwcmludCBzZWxmLnRoaXNvd24KCQkgID4+PiBGYWxzZQkJICAKCgkJICBzZWxmLnRoaXNvd24gPSAxCgkgICAgICAgICAgcHJpbnQgc2VsZi50aGlzb3duCgkJICA+Pj4gVHJ1ZQoKICAgICAgICAgICAgICBpcyBzdXBwb3J0ZWQsIGFuZCBweXRob24gZGlzcGF0Y2hlcyB0aGUgcHJvcGVyIG1ldGhvZAogICAgICAgICAgICAgIGNhbGxzIGFzIG5lZWRlZC4gCQkgIAoJICAgICAgIAoKCSAgICAtIFN1cHBvcnQgZm9yIGl0ZXJhdG9ycyBpbiBTVEwvU1REIGNvbnRhaW5lcnMsIGZvciBleGFtcGxlLCBpZiB5b3UgaGF2ZQoKICAgICAgICAgICAgICAgICAgICAldGVtcGxhdGU8c2V0X3N0cmluZz4gc3RkOjpzZXQ8c3RkOjpzdHJpbmc+OwoJICAgICAgICAgIAogICAgICAgICAgICAgICB5b3UgY2FuIHVzZSB0aGUgQysrIGl0ZXJhdG9ycyBhczogIAoKICAgICAgICAgICAgICAgICAgICAgcyA9IHNldF9zdHJpbmcoKQoJCSAgICAgICAgICAgICAgICAgICAgIAoJCSAgICAgcy5hcHBlbmQoImMiKSAgIAoJCSAgICAgcy5hcHBlbmQoImEiKSAgIAoJICAgICAgICAgICAgIHMuYXBwZW5kKCJiIikKCiAgICAgICAgICAgICAgICAgICAgIGIgPSBzLmJlZ2luKCkgICAgICAKCQkgICAgIGUgPSBzLmVuZCgpICAgICAgICAKCQkgICAgIHN1bSA9ICIiICAgICAgICAgICAKCQkgICAgIHdoaWxlIChiICE9IGUpOiAgICAKICAgICAgICAgICAgICAgICAgICAgICAgIHN1bSArPSBiLm5leHQoKSAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgIHByaW50IHN1bQoKICAgICAgICAgICAgICAgICAgICAgPj4+ICJhYmMiIAoKCQlhZHZhbmNlIHRoZSBpdGVyYXRvciBhcyBpbiBDKysKCiAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBzLmJlZ2luKCkgICAgICAKCQkgICAgIGN1cnJlbnQgKz0gMQogICAgICAgICAgICAgICAgICAgICBwcmludCBjdXJyZW50LnZhbHVlKCkKCQkgICAgID4+PiAiYiIKCQkgICAgIAoJCW5vdyB1c2luZyB0aGUgcmV2ZXJzZSBvcGVyYXRvcnMKCiAgICAgICAgICAgICAgICAgICAgIGIgPSBzLnJiZWdpbigpICAgICAgCgkJICAgICBlID0gcy5yZW5kKCkgICAgICAgIAoJCSAgICAgc3VtID0gIiIgICAgICAgICAgIAoJCSAgICAgd2hpbGUgKGIgIT0gZSk6ICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgc3VtICs9IGIubmV4dCgpICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgcHJpbnQgc3VtCgogICAgICAgICAgICAgICAgICAgICA+Pj4gImNiYSIgCgoJICAgICAgICBvciB0aGUgJ3ByZXZpb3VzJyBtZXRob2QKCiAgICAgICAgICAgICAgICAgICAgIGIgPSBzLmJlZ2luKCkgICAgICAKCQkgICAgIGUgPSBzLmVuZCgpICAgICAgICAKCQkgICAgIHN1bSA9ICIiICAgICAgICAgICAKCQkgICAgIHdoaWxlIChiICE9IGUpOiAgICAKICAgICAgICAgICAgICAgICAgICAgICAgIHN1bSArPSBlLnByZXZpb3VzKCkKICAgICAgICAgICAgICAgICAgICAgcHJpbnQgc3VtCgogICAgICAgICAgICAgICAgICAgICA+Pj4gImNiYSIgCgogICAgICAgICAgICAgICAgb3IganVzdCBhcyBpbiBhIHB5dGhvbiBmYXNoaW9uCgogICAgICAgICAgICAgICAgICAgICBmb3IgaSBpbiBzOgogICAgICAgICAgICAgICAgICAgICAgICAgc3VtICs9IGkgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIE5vdGUgMTogSXRlcmF0b3JzIGluIEMrKyBhcmUgdmVyeSBwb3dlcmZ1bCwgYnV0CiAgICAgICAgICAgICAgICBkYW5nZXJvdXMgdG9vLiBBbmQgaW4gcHl0aG9uIHlvdSBjYW4gc2hvb3QgeW91cnNlbGYgaW4gdGhlIGZvb3QKICAgICAgICAgICAgICAgIGp1c3QgbGlrZSBpbiBDKyssIHNvLCBiZSBjYXJlZnVsLgoJCQoJCU5vdGUgMjogdGhlIGl0ZXJhdG9ycyBhcmUgJ2xpZ2h0JywgaWUsIHRoZXkgZG8gbm90CgkJY29udmVydCBzZXF1ZW5jZSBlbGVtZW50cyB1bnRpbCB5b3UgcmVxdWVzdCB0byBkbyBzbywgdmlhCgkJbmV4dCgpLCB2YWx1ZSgpIG9yIHByZXZpb3VzKCkuIElmIHlvdSBqdXN0IGluY3JlbWVudC9kZWNyZW1lbnQgb25lCgkJbm8gY29udmVyc2lvbiBpcyBwZXJmb3JtZWQsIGZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICBiID0gcy5iZWdpbigpICAgICAgCgkgICAgICAgICAgICAgYiArPSAxCiAgICAgICAgICAgICAgICAgICAgIGIuaW5jcigpCiAgICAgICAgICAgICAgICAgICAgIGIuaW5jcigyKQoJCSAgICAgYi5kZWNyKDIpCiAgICAgICAgICAgICAgICAgICAgIGIuZGVjcigpCiAgICAgICAgICAgICAgICAgICAgIGIgLT0gMQoKCQkgb25seSB0aGUgaXRlcmF0b3IgaXMgbW9kaWZpZWQsIGFuZCBub3QgdmFsdWUgd3JhcHBlcgoJCSBpcyBnZW5lcmF0ZWQuIE90aGVyIHR5cGljYWwgQysrIG9wZXJhdGlvbnMgYXJlIGFsc28gCgkJIGF2YWlsYWJsZSwgc3VjaCBhczoKCgkJICAgICBwcmludCBzLmVuZCgpIC0gcy5iZWdpbigpCgkJICAgICA+Pj4gMwoJCSAgICAgZiA9IHMuYmVnaW4oKSArIDEKCQkgICAgIHByaW50IGYudmFsdWUoKQoJCSAgICAgPj4+ICJiIgoJCSAgICAgbCA9IHMuZW5kKCkgLSAxCgkJICAgICBwcmludCBsLnZhbHVlKCkKCQkgICAgID4+PiAiYyIKCQkgCgkJIGV0Yy4gIE9mIGNvdXJzZSwgdGhlICdmaW5kJywgJ2luc2VydCcsICdlcmFzZScsIGFuZAoJCSBzbyBvbiBtZXRob2RzIGFsc28gc3VwcG9ydHMgaXRlcmF0b3JzIG5vdywgaWU6CgoJCSAgICAgIGkgPSBzLmJlZ2luKCkKCQkgICAgICBpICs9IDEKCQkgICAgICBzLmVyYXNlKGkpCiAgICAgICAgICAgICAgICAgICAgICBmb3IgaSBpbiBzOgogICAgICAgICAgICAgICAgICAgICAgICAgc3VtICs9IGkKCQkgICAgICBwcmludCBzdW0KCQkgICAgICA+Pj4gImFjIgoJCSAgICAgIAogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCgkgICAgVGhlcmUgaXMgbm8gbW9yZSAndGhpc293bicgYXR0cmlidXRlLiBJZiB5b3UgdXNlIGl0LCBweXRob24KCSAgICB3aWxsIHRyYW5zbGF0ZSB0aGUgZm9sbG93aW5nIGNvZGUgYXMgZm9sbG93czoKCiAgICAgICAgICAgICAgICBpZiAoc2VsZi50aGlzb3duKTogICA9PT4gICBpZiAoc2VsZi50aGlzLm93bigpKToKCQlzZWxmLnRoaXNvd24gPSAxICAgICA9PT4gICBzZWxmLnRoaXMub3duKDEpCiAgICAgICAgICAgICAgICBzZWxmLnRoaXNvd24gPSAwICAgICA9PT4gICBzZWxmLnRoaXMub3duKDApCgoJICAgIFN0aWxsLCBtYXliZSBpbiBzb21lIHVudXN1YWwgY2FzZXMgdGhlIHRyYW5zbGF0aW9uIHdpbGwgbm90IGJlCgkgICAgMTAwJSBjb3JyZWN0LCBzbyBpZiB5b3UgaGF2ZSBhIHByb2JsZW0sIHBsZWFzZSByZXBvcnQgaXQKCSAgICBhbmQvb3IgdXNlIHRoZSBuZXcgJ3NlbGYudGhpcy5vd24oKScgYWNjZXNzb3IuCgkgICAgCgkgICAgCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoJICAgIAoJICAgIFRoZXJlIGlzIG5vIG1vcmUgQ2xhc3NQdHIgY2xhc3NlcyBpbiB0aGUgcHl0aG9uIGNvZGUuIEhlbmNlLAoJICAgIGlmIGluIHRoZSBwYXN0IHlvdSBuZWVkZWQgdG8gcmVzb3J0IHRvIHNvbWUga2luZCBvZiB0cmlja2VyeQoJICAgIHdpdGggdGhlbSwgb3Igb3ZlcmNvbWUgdGhlaXIgcHJlc2VuY2UsIGl0IGlzIG5vIGxvbmdlcgoJICAgIHJlcXVpcmVkLCBidXQgdGhlIGV4dHJhIGNvZGUgeW91IGFkZGVkIGNvdWxkIG5vdyBicmVhawoJICAgIHRoaW5ncy4KCgkgICAgSWYgbmVlZGVkLCB5b3UgY2FuIHVzZSB0aGUgb3B0aW9uIC1jbGFzc3B0ciwgaS5lLiwKCiAgICAgICAgICAgICAgIHN3aWcgLWNsYXNzcHRyIC1weXRob24gLi4uCgoJICAgIHRvIGdlbmVyYXRlIHRoZSBvbGQgQ2xhc3NQdHIgY2xhc3Nlcy4KCgoxMC8zMC8yMDA1OiBta29lcHBlIAoJICAgIFtHdWlsZV0gTWFrZSBkZWNsYXJlZCBhbmQgZGVmaW5lZCBsaW5rYWdlIG9mIFNXSUdfaW5pdCBjb25zaXN0ZW50LiAgCgkgICAgUmVwb3J0ZWQgYnkgU3RldmVuIEcuIEpvaG5zb24gKFNGIHBhdGNoIDEzMTU0OTgpLgoKMTAvMjYvMjAwNTogbW1hdHVzCgoJICAtIEFkZGVkIHRoZSBhdHRyaWJ1dGUuaSBmaWxlIHRvIHRoZSBnbG9iYWwgbGlicmFyeSBkaXJlY3Rvci4KCSAgICBOb3cgaXQgY2FuIGJlIHVzZWQgZnJvbSBvdGhlciBsYW5ndWFnZXMgdGhhdCBkbyBub3QgdXNlCgkgICAgdGhlIHVuaWZpZWQgdHlwZW1hcCBsaWJyYXJ5IGFzIHdlbGwuCgoJICAgIFNvLCBpZiB5b3UgaGF2ZSBzb21ldGhpbmcgbGlrZToKCgkgICAgICAgJWluY2x1ZGUgYXR0cmlidXRlLmkKCiAgICAgICAgICAgICAgICVhdHRyaWJ1dGUoQSwgaW50LCBhLCBnZXRfYSwgc2V0X2EpOwoJICAgICAgIAkJCQkgICAgICAJICAKCSAgICAgICBzdHJ1Y3QgQQkJCSAgICAgIAkgIAoJICAgICAgIHsgICAgCQkJCSAgCgkgICAgICAgICBpbnQgZ2V0X2EoKSBjb25zdDsgCQkgIAoJICAgICAgICAgdm9pZCBzZXRfYShpbnQgYWEpOyAJCSAgCgkgICAgICAgfTsJCQkJICAKCiAgICAgICAgICAgICAgICVhdHRyaWJ1dGVfcmVmKEIsIGludCwgYyk7CgkgICAgICAgCQkJCQoJICAgICAgIHN0cnVjdCBCCQkJCgkgICAgICAgeyAgICAJCQkKCSAgICAgICAgIGludCYgYygpOyAJCQoJICAgICAgIH07IAoKCSAgICB0aGVuIGluIHRoZSB0YXJnZXQgbGFuZ3VhZ2UgdGhlICdBLmEnIGFuZCAnQi5jJyBhdHRyaWJ1dGVzIHdpbGwKCSAgICBiZSB2aXNpYmxlLCBpZSwgeW91IGNhbiBhY2Nlc3MgdGhlbSBhcyBwbGFpbiB2YXJpYWJsZXM6CgogICAgICAgICAgICAgICBmICAgPSBBKCkKICAgICAgICAgICAgICAgZi5hID0gMwogICAgICAgICAgICAgICBnICAgPSBCKCkKICAgICAgICAgICAgICAgZy5jID0gMyAKICAgICAgICAgICAKCSAgICAgICBoICAgPSBmLmEgKyBnLmMKCgkgICAgYW5kIHRoZSBwcm9wZXIgZ2V0L3NldCBtZXRob2RzIHdpbGwgYmUgZGlzcGF0Y2hlZC4gU2VlCgkgICAgYXR0cmlidXRlLmkgZm9yIG1vcmUgaW5mby4KICAgCiAgICAgICAgICAtIE1vcmUgY2xlYW51cHMgYXJvdW5kIGFuZCBhZGRpbmcgbW9yZSB0ZXN0LWNhc2VzLiBUaGUKICAgICAgICAgICAgRElTT1dOIHR5cGVtYXAgbm93IGlzIHRlc3RlZCBhbmQgd29ya2luZyBpbiBhbGwgdGhlCiAgICAgICAgICAgIGxhbmd1YWdlcyB0aGF0IHVzZSB0aGUgdW5pZmllZCB0eXBlbWFwIGxpYnJhcnksIGllLCB0Y2wsCiAgICAgICAgICAgIHJ1YnksIHBlcmwgYW5kIHB5dGhvbi4KCSAgICAKCjEwLzI1LzIwMDU6IG1tYXR1cwoKCSAgICAtIFBlcmwsIGNvbXBsZXRlIHRoZSBESVNPV04gdHlwZW1hcC4KCSAgICAKCSAgICAtIGFkZGVkIHRoZSBhdHRyaWJ1dGUuaSBmaWxlIHRvIHRoZSB1bmlmaWVkIHR5cGVtYXAKICAgICAgICAgICAgICBsaWJyYXJ5IChiZWZvcmUgd2FzIG9ubHkgdXNhYmxlIGZyb20gcHl0aG9uKS4KCgkgICAgLSB1bmlmeSB0aGUgbmFtZXMgZm9yIHRoZSBzZXR0ZXIgYW5kIGdldHRlciBtZXRob2RzIGluCgkgICAgICBwZXJsLHRjbCxydWJ5IGFuZCBweXRob24sIHNvLCB0aGUgYXR0cmlidXRlLmkgbGlicmFyeQoJICAgICAgY2FuIHdvcmsgYWNyb3NzIHRoZW0uCgkgICAgICAKCSAgICAtIHNlZSB0aGUgbGlfYXR0cmlidXRlLmkgdGVzdC1jYXNlIG9yIHRoZSBsaWJyYXJ5IGZpbGUKCiAJICAgICAgICBMaWIvdHlwZW1hcHMvYXR0cmlidXRlLnN3ZwoKICAgICAgICAgICAgICBmb3IgbW9yZSBpbmZvIGFib3V0IGhvdyB0byB1c2UgaXQuCgogCgkgICAgICAKCjEwLzI0LzIwMDU6IG1tYXR1cwoKCSAgICAtIFBlcmwgbm93IHVzZXMgdGhlIHVuaWZpZWQgdHlwZW1hcCBsaWJyYXJ5LgoKCSAgICAtIENoYW5nZXMgaW4gcnVieSB0byB1c2UgdGhlICR0cmFjayBvcHRpb24gaW4gdHlwZW1hcHMuCgoJICAgIC0gQ2hhbmdlcyBpbiB0aGUgdW5pZmllZCB0eXBlbWFwIGxpYnJhcnkgdG8gZm9sbG93IHRoZQoJICAgICAgY29udmVudGlvbiB0aGF0IGFsbCBtYWNyb3MgdGhhdCBhcmUgbm90IHVzZWQgaW4gdGhlCgkgICAgICBDL0MrKyBzaWRlIHN0YXJ0cyB3aXRoICUsIHN1Y2ggYXMKCgkgICAgICAgICAgICVkZWxldGUKCQkgICAlbmV3X2FycmF5CgogICAgICAgICAgICAgIGV0Yy4KCSAgICAgIAoJICAgIC0gRG9jdW1lbnRpbmcgZnJhZ21lbnRzLCBzZWUgZnJhZ21lbnRzLnN3Zy4KCgkgICAgLSBDbGVhbmVyIHdheSB0byB1c2UgdGhlIHVuaWZpZWQgdHlwZW1hcCBsaWJyYXJ5LCBpbmNsdWRlCgkgICAgICBqdXN0IDx0eXBlbWFwcy9zd2lndHlwZXMuc3dnPi4KCgkgICAgICBDaGVjayBzb21lIG9mIHRoZSBzdXBwb3J0ZWQgbGFuZ3VhZ2VzOiBwZXJsLCB0Y2wsIHJ1YnksCgkgICAgICBweXRob24uCgoJICAgICAgQWx3YXlzIHN0YXJ0IHdpdGggdGhlIGhlYWQgZmlsZSwgc3VjaCBhcwoKCSAgICAgICAgIHB5dGhvbi9weXRob24uc3dnCgkgICAgICAgICB0Y2wvdGNsOC5zd2cKCSAgICAgICAgIHJ1YnkvcnVieS5zd2cKCSAgICAgICAgIHBlcmw1L3Blcmw1LnN3ZwoKICAgICAgICAgICAgICBhbmQgdGhlIHByaW5jaXBhbCBmaWxlIHRoYXQgaW52b2tlcyB0aGUgdW5pZmllZCBsaWJyYXJ5LCBzdWNoIGFzCgoJICAgICAgICAgcHl0aG9uL3B5dHlwZW1hcHMuc3dnCSAgICAKCSAgICAgICAgIHRjbC90Y2x0eXBlbWFwcy5zd2cJICAgIAoJICAgICAgICAgcnVieS9ydWJ5dHlwZW1hcHMuc3dnCSAgICAKCSAgICAgICAgIHBlcmwvcGVybHR5cGVtYXBzLnN3ZwkgICAgCgkgICAgCgkgICAgICBUaGUgZmlsZSB0aGF0IHByb3ZpZGUgdGhlIHNwZWNpYWxpemF0aW9uIGZvciBlYWNoCgkgICAgICBsYW5ndWFnZSBhcmUgdGhlIG9uZSB0aGF0IHByb3ZpZGVzIHRoZSBiYXNpYyB0eXBlczoKCgkgICAgICAgICBweXRob24vcHlwcmltdHlwZXMuc3dnCQoJICAgICAgICAgcnVieS9ydWJ5cHJpbXR5cGVzLnN3ZwkKCSAgICAgICAgIHRjbC90Y2xwcmltdHlwZXMuc3dnCQoJICAgICAgICAgcGVybDUvcGVybHByaW10eXBlcy5zd2cKCgkgICAgICBhbmQgdGhlIHN0cmluZyBtYW5pcHVsYXRpb246ICAJIAoJICAgIAoJICAgICAgICAgcHl0aG9uL3B5c3RyaW5ncy5zd2cJCgkgICAgICAgICBydWJ5L3J1YnlzdHJpbmdzLnN3ZwkKCSAgICAgICAgIHRjbC90Y2xzdHJpbmdzLnN3ZwkKCSAgICAgICAgIHBlcmw1L3BlcmxzdHJpbmdzLnN3ZwoKCQkgCgkgICAgICBUaGUgcmVzdCBvZiB0aGUgZmlsZXMsIHN1Y2ggYXMgY2FycmF5LmksIGFyZSBtb3N0bHkgb25lIAoJICAgICAgbGluZSBmaWxlcyB0aGF0IGluY2x1ZGUgdGhlIHByb3BlciB0eXBlbWFwIGxpYnJhcnkKCSAgICAgIHZlcnNpb24uCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBpbiBQZXJsICoqKgoKCSAgICBTb21lIG1pc3Npbmcvd3JvbmcgdHlwZW1hcHMgY291bGQgc3RhcnQgd29ya2luZyBwcm9wZXJseSwKCSAgICBhbmQgY2hhbmdlIHRoZSBvbGQgZXhwZWN0ZWQgYmVoYXZpb3IgaW4gUGVybC4KCjEwLzIzLzIwMDU6IHd1enplYgogICAgICAgICAgICBDaGlja2VuOgogICAgICAgICAgICAgICsgcG9pbnRlcnMgdG8gbWVtYmVyIGZ1bmN0aW9ucyBmaW5hbGx5IHdvcmsgcHJvcGVybHkKICAgICAgICAgICAgICArIGFkZCB0ZXN0IG9mIG1lbWJlciBmdW5jdGlvbiBwb2ludGVycyB0byBjcHBfYmFzaWMuaQoKMTAvMjAvMjAwNTogZGFuY3kKCSAgICBbYWxsZWdyb2NsXSBBZGRlZCBDKysgc3VwcG9ydC4gTGFyZ2UgdXBkYXRlLCBtYW55IGNoYW5nZXMuIFNlZQoJICAgIG5ld2x5IGFkZGVkIEFsbGVncm8gQ29tbW9uIExpc3Agc2VjdGlvbiBpbiBsaXNwLmh0bWwKCjEwLzIwLzIwMDU6IG1tYXR1cwoJICAgIFJ1YnksIFRjbCwgUHl0aG9uOgoKCSAgICAtIFVuaWZvcm0gd2F5IHRvIGZhaWwgKGxhYmVsIGZhaWw6KSwgbm93IGZpbmFsbHkKCSAgICAgIFNXSUdfZXhjZXB0aW9uIHdvcmtzIGFjcm9zcyB0aGUgdGhyZWUgbGFuZ3VhZ2VzIGFuZCBhbGwKCSAgICAgIHRoZSB0eXBlbWFwcy4KCgkgICAgLSBBZGQgcHJvcGVyIGNsZWFudXAgY29kZSB0byBydWJ5CgoJICAgIC0gTW9yZSB2YWxncmluZCBmaXhlcwoKCSAgICAtIFNpbXBsaWZ5IHRoZSBpbmxpbmUgdXNlLCBpdCBzZWVtcyBhIHNtYWxsIGludGVyZmFjZSBvZgoJICAgICAgMjAsMDAwIGxpbmVzIChwbHVzIG1hbnkgbWFueSB0ZW1wbGF0ZXMpIGNhbiBicmVhayAKCSAgICAgIGdjYyAtTzMgZWFzaWx5LgoKCSAgICAtIEZpbmFsaXplIHRoZSB0eXBlbWFwcyBsaWJyYXJ5LiBBbGwgdGhlIG9sZCAgKi5pIGZpbGVzCgkgICAgICAoY2FycmF5LmksIGNwb2ludGVyLmksIGV4Y2VwdGlvbi5pKSBoYWQgYmVlbiBpbXBsZW1lbnRlZAoJICAgICAgaW4gdGhlIG5ldyB0eXBlbWFwcyBsaWJyYXJ5LgoJICAgIAoKMTAvMTkvMjAwNTogd3V6emViCgkgICAgVXBkYXRlIHRoZSBSdW50aW1lIFR5cGVtYXAgZG9jdW1lbnRhdGlvbiBpbiBUeXBlbWFwcy5odG1sCgoxMC8xOC8yMDA1OiB3dXp6ZWIKCSAgICBDaGlja2VuOgoJICAgICAgLSBDb3JyZWN0bHkgaGFuZGxlICVpZ25vcmVkIGNsYXNzZXMKICAgICAgICAgICAgICAtIENvcnJlY3RseSBjb252ZXJ0IGxvbmcsIGxvbmcgbG9uZywgdW5zaWduZWQgbG9uZywgZXRjCiAgICAgICAgICAgICAgICB0byBjaGlja2VuIHByaW1pdGl2ZXMuIChUaGFua3MgdG8gRmVsaXggV2lua2VsbWFubikKICAgICAgICAgICAgICAtIFVzaW5nIGFyZ291dCBwYXJhbWV0ZXJzIHdoZW4gdGhlIHJldHVybiB2YWx1ZSB3YXMgYQogICAgICAgICAgICAgICAgd3JhcHBlZCBwb2ludGVyIGNhdXNlZCBhIG1lbW9yeSBjb3JydXB0aW9uLiAgVGhlIGNoaWNrZW4KICAgICAgICAgICAgICAgIGdhcmJhZ2UgY29sbGVjdG9yIG1vdmVkIGEgcG9pbnRlciBvdXQgZnJvbSB1bmRlciB1cy4KICAgICAgICAgICAgICAgIFRoaXMgaXMgbm93IGZpeGVkIGJ5IHJ1bm5pbmcgYWxsIHRoZSBwcm94eSBjcmVhdGlvbgogICAgICAgICAgICAgICAgZnVuY3Rpb25zIGFzIGNvbnRpbnVhdGlvbnMgYWZ0ZXIgdGhlIHdyYXBwZXIgZnVuY3Rpb24KICAgICAgICAgICAgICAgIHJldHVybnMuICBBcyBwYXJ0IG9mIHRoaXMsIHdlIG5vIGxvbmdlciBuZWVkIHRoZQogICAgICAgICAgICAgICAgY2hpY2tlbmZhc3Rwcm94eSBmbGFnIG9uIG91dHB1dCB0eXBlbWFwcy4KICAgICAgICAgICAgICAtIHVzaW5nIC1wcm94eSBhbmQgLW5vY29sbGVjdGlvbiB0b2dldGhlciB3b3JrcyBub3cKICAgICAgICAgICAgICAgIEJlZm9yZSwgaXQgd2FzIG5vdCBleHBvcnRpbmcgdGhlIGRlc3RydWN0b3IgaW4gdGhlIHByb3h5CiAgICAgICAgICAgICAgICB3cmFwcGVyLgoKMTAvMTgvMjAwNTogbW1hdHVzCgkgICAgCgkgICAgQWRkZWQgdGhlIFVuaWZpZWQgVHlwZW1hcCBMaWJyYXJ5IChVVEwpLiBJdCB1bmlmaWVzIHRoZSB0eXBlbWFwcyBmb3IKCiAJICAgICAgICBweXRob24sIHJ1YnksIHRjbAoKCSAgICBhbmQgaW4gdGhlIHByb2Nlc3MsIGZpeGVzIHNldmVyYWwgcHJvYmxlbXMgaW4gZWFjaCBvZiB0aGUgdGhyZWUKCSAgICBsYW5ndWFnZXMgdG8gd29yayBpbiBhICJjYW5vbmljYWwiIHdheSBub3cgZXN0YWJsaXNoZWQgaW4KCSAgICB0aGUgdHlwZW1hcCBsaWJyYXJ5CgkgICAgCgkgICAgICAgU1dJRy9MaWIvdHlwZW1wYXMKCgkgICAgVGhlIGN1cnJlbnQgc3RhdHVzIG9mIHRoZSB1bmlmaWNhdGlvbiBpcyB0aGF0IGV2ZXJ5dGhpbmcKCSAgICBjb21waWxlcyBhbmQgcnVucyBpbnNpZGUgdGhlIHRlc3Qtc3VpdGUgYW5kIGV4YW1wbGVzCgkgICAgZGlyZWN0b3JpZXMuIEFuZCBmb3IgdGhlIGZpcnN0IHRpbWUgd2UgaGF2ZSB0aHJlZQoJICAgIGxhbmd1YWdlcyB0aGFuIHBhc3MgdGhlIHByaW1pdGl2ZV90eXBlcy5pIGNhc2UuCgoJICAgIEFsc28sIHdlIGhhdmUgYSB1bmlmb3JtIHdheSB0byB0cmVhdCB0aGUgZXJyb3JzLCBmb3IgZXhhbXBsZQoJICAgIGlmIHlvdSBkbyBzb21ldGhpbmcgbGlrZQoKCSAgICAgID4+PiBmcm9tIHByaW1pdGl2ZV90eXBlcyBpbXBvcnQgKgogICAgICAgICAgICAgID4+PiBwcmludCB2YWxfdWNoYXIoMTApCiAgICAgICAgICAgICAgMTAKCSAgICAgID4+PiBwcmludCB2YWxfdWNoYXIoMTAwMCkKICAgICAgICAgICAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CQkgICAgICAKCSAgICAgICAgRmlsZSAiPHN0ZGluPiIsIGxpbmUgMSwgaW4gPwkJCSAgICAKCSAgICAgIE92ZXJmbG93RXJyb3I6IGluIGFyZ3VtZW50IDEgb2YgdHlwZSAndW5zaWduZWQgY2hhcicKCgkgICAgeW91IGdldCB0aGUgc2FtZSBleGNlcHRpb24gaW4gYWxsIHRoZSB0aHJlZSBsYW5ndWFnZXMuCgkgICAgCgkgICAgQW5kIHdlbGwsIG1hbnkgbW9yZSBnb29kIHRoaW5ncyB3aWxsIGNvbWUgZnJvbSB0aGlzCgkgICAgdW5pZmljYXRpb24sIGZvciBleGFtcGxlLCBwcm9wZXIgc3VwcG9ydCBvZiB0aGUgU1RML1NURCBjbGFzc2VzCgkgICAgZm9yIGFsbCB0aGUgbGFuZ3VhZ2VzLCBhbmQgaG9wZWZ1bGx5LCB3ZSBjYW4ga2VlcAoJICAgIGFkZGluZyBvdGhlciBsYW5ndWFnZXMuCgoJICAgIFRoZSBoYXJkZXN0IHBhcnQsIHdyaXRpbmcgYSBjb21tb24gdHlwZW1hcCBsaWJyYXJ5CgkgICAgdGhhdCBzdWl0ZXMgdGhlIHRocmVlIGRpZmZlcmVudCBsYW5ndWFnZXMsIGlzIGRvbmUsCgkgICAgYW5kIGFkZGluZyBhbm90aGVyIGxhbmd1YWdlIHNob3VsZCBub3cgYmUgZWFzeS4gCgoJICAgIFN0aWxsIHRoZSBnbG9iYWwgdW5pZmljYXRpb24gaXMgbm90IGNvbXBsZXRlLCB0aGUgU1RML1NURCAKCSAgICBwYXJ0IGlzIG5leHQsIGFuZCBwcm9iYWJseSBhcyB3ZWxsIGFzIGFkZGluZyBvbmUgb3IgdHdvIG1vcmUKCSAgICBsYW5ndWFnZXMuCgoJICAgIElmIHlvdSBhcmUgY3VyaW91cywgbG9vayBhdCB0aGUgcHl0aG9uLCBydWJ5IGFuZC9vciB0Y2wKCSAgICBkaXJlY3RvcmllcyB0byBzZWUgd2hhdCBpcyBuZWVkZWQgdG8gc3VwcG9ydCB0aGUgbmV3CgkgICAgY29tbW9uIHR5cGVtYXBzIGxpYnJhcnkuICBTdGlsbCwgdGhlIGZpbmFsIHdheSB0bwoJICAgIGludGVncmF0ZSBhIG5ldyBsYW5ndWFnZSBjb3VsZCBjaGFuZ2UgYXMgd2UgbW92ZSB0bwoJICAgIGludGVncmF0ZSB0aGUgU1REL1NUTC4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIGluIFJ1YnkvVGNsICoqKgoKCSAgICBTb21lIG1pc3Npbmcvd3JvbmcgdHlwZW1hcHMgY291bGQgc3RhcnQgd29ya2luZyBwcm9wZXJseSwKCSAgICBhbmQgY2hhbmdlIHRoZSBvbGQgYmVoYXZpb3IsIHNwZWNpYWxseSBpbiBydWJ5IGFuZCB0Y2wuCgpWZXJzaW9uIDEuMy4yNyAoT2N0b2JlciAxNSwgMjAwNSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoxMC8xNS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gRml4IGZvciB0eXBlc2FmZSBlbnVtIHdyYXBwaW5nIHNvIHRoYXQgaXQgaXMgcG9zc2libGUgdG8KICAgICAgICAgICAgb3ZlcmxvYWQgYSBtZXRob2Qgd2l0aCAyIGRpZmZlcmVudCBlbnVtIHR5cGVzLgoKMTAvMTUvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgRml4IGZvciAlZmVhdHVyZSgiaW1tdXRhYmxlIiwiMCIpIGF0dGVtcHRpbmcgdG8gZ2VuZXJhdGUgc2V0dGVycwogICAgICAgICAgICBmb3IgY29uc3RhbnRzLgoKICAgICAgICAgICAgUmVzdG9yZWQgJWltbXV0YWJsZSBhbmQgJW1ha2VkZWZhdWx0IHRvIGNsZWFyIHRoZSBmZWF0dXJlIGFzIGl0CiAgICAgICAgICAgIGJlaGF2ZWQgaW4gU1dJRy0xLjMuMjUgYW5kIGVhcmxpZXIuCgoxMC8xNC8yMDA1OiBtbWF0dXMKICAgICAgICAgICAgRml4IGJ1ZyBpbiBhbm9ueW1vdXMgdHlwZWRlZiBzdHJ1Y3R1cmVzIHdoaWNoIHdhcyBsZWFkaW5nIHRvCiAgICAgICAgICAgIHN0cmFuZ2UgYmVoYXZpb3VyLgoKMTAvMTMvMjAwNTogbW1hdHVzCgkgICAgU2V2ZXJhbCBtaW5vciBjaGFuZ2VzOgoJICAgIAoJICAgIC0gSW1wcm92ZSB0aGUgd2NoYXJfdCB0eXBlIHN1cHBvcnQKCSAgICAtIEFkZCBhIHdhcm5pbmcgZm9yIHdoZW4geW91IGRlZmluZSB0aGUgJ2luJyB0eXBlbWFwIGJ1dAoJICAgICAgeW91IGRvbid0IGRlZmluZSB0aGUgJ3R5cGVjaGVjaycgb25lLiBWZXJ5IGNvbW1vbiBtaXN0YWtlLgoJICAgIC0gQWRkIHByb3BlciBkZWZhdWx0IHJ1bGUgZm9yIGZ1bmN0aW9uIHBvaW50ZXJzLCBub3cgeW91CgkgICAgICBjYW4gZGVmaW5lIGEgdHlwZW1hcCBzdWNoIGFzOgoKCSAgICAgICV0eXBlbWFwKGluKSBTV0lHVFlQRSAoKCopKEFOWSkpIHsuLi59CgoJICAgICAgVGhhdCB3aWxsIGFwcGx5IHRvIGFsbCB0aGUgcG9pbnRlciB0byBmdW5jdGlvbnMuIFRoZQoJICAgICAgcnVsZSBpbiBDKysgYWxzbyBhcHBseSB0byB0aGUgZnVuY3Rpb24gJ3JlZmVyZW5jZScsIGllLAoJICAgICAgaW4gYm90aCBjYXNlcwoKCSAgICAgICAgdHlwZWRlZiAgaW50ICgqZnB0cikoaW50IGEpOwoJICAgICAgICB0eXBlZGVmICBpbnQgKGZ1bmMpKGludCBhKTsKCgkgICAgICBUaGlzIHdhcyBuZWVkZWQgc2luY2UgaXQgc2VlbXMgdG8gYmUgJ2lsbGVnYWwnIGluIEMrKyB0bwoJICAgICAgZG8gc29tZXRoaW5nIGxpa2U6CgoJICAgICAgICAgdm9pZCAqcHRyID0gc3RhdGljX2Nhc3Q8dm9pZCAqPihmcHRyKTsKCgkgICAgICBhbmQgcHJvYmFibHksIGFzIGZvciBtZW1iZXIgZnVuY3Rpb25zLCBpdCBpcyBub3QKCSAgICAgIHdhcnJhbnRpZWQgdGhhdCB0aGUgcG9pbnRlciBzaXplcyB3aWxsIG1hdGNoLgoKCSAgICAtIEFkZCB0aGUgI2Vycm9yLyN3YXJuaW5nIGRpcmVjdGl2ZXMgdG8gc3dpZydzIGNwcC4KCgkgICAgLSBBZGQgdGhlIG5vYmxvY2sgb3B0aW9uIGZvciB0eXBlbWFwcywgd2hpY2ggaXMgdXNlZCBhcwogICAgICAgICAgICAgIGZvbGxvd3M6IHN1cHBvc2VkIHlvdSBhIHR5cGVtYXAsIGxpa2UgdGhpcwoKCSAgICAgIAoJICAgICAgJXR5cGVtYXAoaW4sbm9ibG9jaz0xKSBIZWxsbyB7CQkJICAgCgkgICAgICAgICAuLi4uCiAgICAgICAgICAgICAgfQoKCSAgICAgIHRoZW4gdGhlIHR5cGVtYXAgd2lsbCBiZSBpbnNlcnRlZCB3aXRob3V0IHRoZSBibG9jawoJICAgICAgaW1wb3NlZCBieSB0aGUgYnJhY2tldHMsIHNpbWlsYXIgdG8KCgkgICAgICAgJXR5cGVtYXAoaW4pIEhlbGxvICIuLi4iOwoKCSAgICAgIFNvLCB3aHkgeW91IGRvbid0IGp1c3QgdXNlIHRoZSBxdW90ZSBzdHlsZT8sIGJlY2F1c2U6CgkgICAgICAKCSAgICAgICAgIDEuLSBUaGUgcXVvdGUgc3R5bGUgZG9lc24ndCBnZXQgcHJlcHJvY2Vzc2VkLCBmb3IgZXhhbXBsZQoJICAgICAgCgkgICAgICAgICAgICAgICV0eXBlbWFwKGluKSBIZWxsbyAiJDE9IFNXSUdfbWFjcm8oJDEpOyI7CgkgICAgICAKCSAgICAgICAgICAgICBoZXJlLCBTV0lHX21hY3JvIGRvZXNuJ3QgZ2V0IGV4cGFuZGVkCgogICAgICAgICAgICAgICAgIDIuLSBJbnNpZGUgYSBxdW90ZSB0eXBlbWFwLCB5b3UgaGF2ZSB0byB1c2UgCiAgICAgICAgICAgICAgICAgICAgIHF1b3RlcyBjYXJlZnVsbHkKCgkJICAgICAgJXR5cGVtYXAoaW4pIEhlbGxvICIkMSA9IFwiaGVsbG9cIiAiOwoKCQkgMy4tIFlvdSBjYW4ndCBtYWtlIGVtYWNzIGFuZC9vciBvdGhlciBlZGl0b3JzCgkJICAgICB0byBpbmRlbnQgaW5zaWRlIGEgc3RyaW5nIS4gCgoKCSAgICAgIFNvLCB3aHkgZG8geW91IHdhbnQgdG8gcmVtb3ZlIHRoZSBibG9jaz8sIGJlY2F1c2UgYW4gZXh0cmEKCSAgICAgIGJsb2NrIHdoZW4gbm90IG5lZWRlZCAobm8gbG9jYWwgdmFyaWFibGVzIGluIGl0KToKCgkgICAgICAgICAgMS4tIG1ha2VzIHRoZSBjb2RlIGhhcmRlciB0byByZWFkCiAgICAgICAgICAgICAgICAgIDIuLSBtYWtlcyB0aGUgY29kZSBsYXJnZXIKICAgICAgICAgICAgICAgICAgMy4tIG9yIGluIHNob3J0LCBmb3IgdGhlIHNhbWUgcmVhc29uIHdlIGhhdmUgdGhlIHF1b3RlIHN0eWxlLgoKVmVyc2lvbiAxLjMuMjYgKE9jdG9iZXIgOSwgMjAwNSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjEwLzA4LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQaHBdIEFkZGVkICd0aHJvd3MnIHR5cGVtYXBzLgoKMTAvMDgvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgRml4ZXMgZm9yIGxhbmd1YWdlcyB0aGF0IGRvbid0IHN1cHBvcnQgbXVsdGlwbGUgaW5oZXJpdGFuY2UuIFRoZQogICAgICAgICAgICBmaXJzdCBub24taWdub3JlZCBjbGFzcyBpbiB0aGUgcHVibGljIGJhc2UgY2xhc3MgbGlzdCBpcyB1c2VkIGZvciBpbmhlcml0YW5jZS4KICAgICAgICAgICAgYnkgdGhlIHByb3h5IGNsYXNzLiBQcmV2aW91c2x5LCBpZiB0aGUgZmlyc3QgY2xhc3MgaW4gdGhlIGxpc3Qgd2FzIGlnbm9yZWQsIHRoZW4KICAgICAgICAgICAgdGhlIHByb3h5IGNsYXNzIHdvdWxkbid0IGhhdmUgYW55IGJhc2UgY2xhc3Nlcy4KCjEwLzA3LzIwMDU6IG1tYXR1cwoJICAgICBVcGRhdGUgbW9yZSBmZWF0dXJlcyB0byBmb2xsb3cgbmV3IGNvbnZlbnRpb24sIGluY2x1ZGluZzoKCgkgICAgICAgY2FsbGJhY2sKCSAgICAgICByZWYvdW5yZWYKCSAgICAgICBleGNlcHQKCSAgICAKCSAgICAgQWxsIG9mIHRoZW0gdXNlIG5vdCBvbmx5IHRoZSBmZWF0dXJlIGFzIGEgZmxhZywgYnV0IGFsc28KCSAgICAgYXMgY29kZSB2YWx1ZS4gVG8gZGVhbCB3aXRoIHRob3NlIGZlYXR1cmVzLCB3ZSB1c2Ugbm93CgkgICAgIEdldEZsYWdBdHRyLCB3aGljaCBpcyBzaW1pbGFyIHRvIEdldEZsYWcsIGJ1dCBpbnN0ZWFkIG9yCgkgICAgIHJldHVybmluZyAxIG9yIDAsIGl0IHJldHVybnMgdGhlIGF0dHIgdmFsdWUsIGlmIGhhcHBlbnMKCSAgICAgdG8gYmUgZGlmZmVyZW50IG9mICIwIiBvZiBjb3Vyc2UuCgoJICAgICBOb3cgdGhlcmUgYXJlIGFsc28gbW9yZSB1bmlmb3JtIGRpcmVjdGl2ZSBuYW1lcyBmb3IgdGhlIAoJICAgICBvbmVzIGJhc2VkIGluIGZlYXR1cmVzLCBmb3IgZXhhbXBsZSwgZm9yIHRoZSBvbGQKCSAgICAgJW5ld29iamVjdCBkaXJlY3RpdmUgbm93IHdlIGhhdmUgdHJlZSBkaXJlY3RpdmVzIGRlZmluZWQ6CgkgICAgIAoKCSAgICAgI2RlZmluZSAlbmV3b2JqZWN0ICAgICAgICAlZmVhdHVyZSgibmV3IikKCSAgICAgI2RlZmluZSAlbm9uZXdvYmplY3QgICAgICAlZmVhdHVyZSgibmV3IiwiMCIpCgkgICAgICNkZWZpbmUgJWNsZWFybmV3b2JqZWN0ICAgJWZlYXR1cmUoIm5ldyIsIiIpCgoJICAgICBhbmQgc28gb24gZm9yIGFsbCB0aGUgb3RoZXIgZmVhdHVyZSBkaXJlY3RpdmVzLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgowOS8zMC8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBTdWJ0bGUgY2hhbmdlIHRvIHNvbWUgZmVhdHVyZXMuIFByZXZpb3VzbHkgaXQgd2FzIG5vdCBwb3NzaWJsZSB0byBkaXNhYmxlIG1hbnkKICAgICAgICAgICAgZmVhdHVyZXMgb25jZSB0aGV5IGhhZCBiZWVuIGVuYWJsZWQuIFRoaXMgd2FzIGZvciBtb3N0IGZlYXR1cmVzIHRoYXQgYmVoYXZlIGFzCiAgICAgICAgICAgIGZsYWdzLiBUaGVzZSBmZWF0dXJlcyBub3cgd29yayBhcyBmb2xsb3dzOgoKICAgICAgICAgICAgICAlZmVhdHVyZSgibmFtZSIpICAgICAgICAgICAgICAvLyBlbmFibGVzIHRoZSBmZWF0dXJlCiAgICAgICAgICAgICAgJWZlYXR1cmUoIm5hbWUiLCAiMSIpICAgICAgICAgLy8gZW5hYmxlcyB0aGUgZmVhdHVyZQogICAgICAgICAgICAgICVmZWF0dXJlKCJuYW1lIiwgIjAiKSAgICAgICAgIC8vIGRpc2FibGVzIHRoZSBmZWF0dXJlCiAgICAgICAgICAgICAgJWZlYXR1cmUoIm5hbWUiLCAiIikgICAgICAgICAgLy8gY2xlYXJzIHRoZSBmZWF0dXJlCgogICAgICAgICAgICBJbiBmYWN0IGFueSBub24tZW1wdHkgdmFsdWUgb3RoZXIgdGhhbiAiMCIgd2lsbCBlbmFibGUgdGhlIGZlYXR1cmUgKGxpa2UgQyBib29sZWFuIGxvZ2ljKS4KICAgICAgICAgICAgUHJldmlvdXNseSAiMSIsICIwIiBvciBhbnkgb3RoZXIgbm9uLWVtcHR5IHZhbHVlIHdvdWxkIGVuYWJsZSB0aGUgZmVhdHVyZSBhbmQgaXQgd291bGQKICAgICAgICAgICAgb25seSBiZSBwb3NzaWJsZSB0byBkaXNhYmxlIHRoZSBmZWF0dXJlIGJ5IGNsZWFyaW5nIGl0IChhc3N1bWluZyB0aGVyZSB3YXMgbm8gZ2xvYmFsIGVuYWJsZSkuCgogICAgICAgICAgICBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBhZmZlY3RlZDoKCiAgICAgICAgICAgICAgYWxsb3dleGNlcHQKICAgICAgICAgICAgICBjb21wYWN0ZGVmYXVsdGFyZ3MKICAgICAgICAgICAgICBjbGFzc2ljICAgICAgICAgICAgICAgIChQeXRob24pCiAgICAgICAgICAgICAgY3M6Y29uc3QgICAgICAgICAgICAgICAoQyMpCiAgICAgICAgICAgICAgZGlyZWN0b3IKICAgICAgICAgICAgICBleGNlcHRpb25jbGFzcyAgICAgICAgIChQeXRob24pCiAgICAgICAgICAgICAgaWdub3JlCiAgICAgICAgICAgICAgaW1tdXRhYmxlCiAgICAgICAgICAgICAgamF2YTpjb25zdCAgICAgICAgICAgICAoSmF2YSkKICAgICAgICAgICAgICBqYXZhOmRvd25jYXN0ICAgICAgICAgIChKYXZhKQogICAgICAgICAgICAgIGt3YXJncwogICAgICAgICAgICAgIG1vZGVybiAgICAgICAgICAgICAgICAgKFB5dGhvbikKICAgICAgICAgICAgICBuZXcKICAgICAgICAgICAgICBub2F1dG9kb2MgICAgICAgICAgICAgIChQeXRob24pCiAgICAgICAgICAgICAgbm9kZWZhdWx0CiAgICAgICAgICAgICAgbm9kaXJlY3RvcgogICAgICAgICAgICAgIG5vcmVmCiAgICAgICAgICAgICAgbm90YWJzdHJhY3QKICAgICAgICAgICAgICBub3VucmVmCiAgICAgICAgICAgICAgbm92YWx1ZXdyYXBwZXIKICAgICAgICAgICAgICBweXRob246bWF5YmVjYWxsICAgICAgIChQeXRob24pCiAgICAgICAgICAgICAgcHl0aG9uOm5vbmR5bmFtaWMgICAgICAoUHl0aG9uKQogICAgICAgICAgICAgIG1vZHVsYTM6bXVsdGlyZXR2YWwgICAgKE1vZHVsYTMpCiAgICAgICAgICAgICAgcHJlZGljYXRlICAgICAgICAgICAgICAoUnVieSkKICAgICAgICAgICAgICB0cmFja29iamVjdHMgICAgICAgICAgIChSdWJ5KQogICAgICAgICAgICAgIHZhbHVld3JhcHBlcgoKICAgICAgICAgICAgSXQgaXMgbm93IHBvc3NpYmxlLCBmb3IgZXhhbXBsZSB0byBpZ25vcmUgYWxsIG1ldGhvZHMvY2xhc3NlcyBpbiBhIGhlYWRlciBmaWxlLCBleGNlcHQgZm9yIGEKICAgICAgICAgICAgZmV3IHRhcmdldHRlZCBtZXRob2RzLCBmb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgJWZlYXR1cmUoImlnbm9yZSIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIGFsbCBtZXRob2RzL2NsYXNzZXMKICAgICAgICAgICAgICAlZmVhdHVyZSgiaWdub3JlIiwiMCIpIHNvbWVfZnVuY3Rpb24oaW50LCBkb3VibGUpOyAvLyBkbyBub3QgaWdub3JlIHRoaXMgZnVuY3Rpb24KICAgICAgICAgICAgICAlZmVhdHVyZSgiaWdub3JlIiwiMCIpIFNvbWVDbGFzczsgICAgICAgICAgICAgICAgICAvLyBkbyBub3QgaWdub3JlIHRoaXMgQ2xhc3MKICAgICAgICAgICAgICAlZmVhdHVyZSgiaWdub3JlIiwiMCIpIFNvbWVDbGFzczo6bWV0aG9kOyAgICAgICAgICAvLyBkbyBub3QgaWdub3JlIHRoaXMgbWV0aG9kCiAgICAgICAgICAgICAgJWluY2x1ZGUgImJpZ2hlYWRlci5oIgoKICAgICAgICAgICAgUmVtb3ZlZCAlcHl0aG9uZHluYW1pYyAtIGl0IG5ldmVyIHdvcmtlZCBwcm9wZXJseS4gVXNlICVweXRob25ub25keW5hbWljIGluc3RlYWQuCiAgICAgICAgICAgIFJlbW92ZWQgJWZlYXR1cmUoIm5va3dhcmdzIikgLSBpdCB3YXNuJ3QgZnVsbHkgaW1wbGVtZW50ZWQgIC0gdXNlICVmZWF0dXJlKCJrd2FyZ3MiLCIwIikgaW5zdGVhZC4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMDkvMjUvMjAwNTogbWtvZXBwZQoJICAgIFtHdWlsZV0gQWRkICJ0aHJvd3MiIHR5cGVtYXBzLgoKMDkvMjQvMjAwNTogY2Zpc2F2YWdlCiAgICAgICAgICAgIFtSdWJ5XSBBZGRzIG5ldyAldHJhY2tvYmplY3RzIGZ1bmN0aW9uYWxpdHkgdGhhdCBtYXBzIEMrKyBvYmplY3RzIHRvCiAgICAgICAgICAgIFJ1Ynkgb2JqZWN0cy4gIFRoaXMgZnVuY3Rpb25hbGl0eSBtYWtlcyBpdCBtdWNoIGVhc2llciB0byBpbXBsZW1lbnQKICAgICAgICAgICAgbWFyayBmdW5jdGlvbnMgZm9yIHRoZSBnYXJiYWdlIGNvbGxlY3Rvci4gIEZvciBtb3JlIGluZm9ybWF0aW9uCiAgICAgICAgICAgIHJlZmVyIHRvIHRoZSB1cGRhdGUgZG9jdW1lbnRhdGlvbiBhbmQgZXhhbXBsZXMuCiAgICAgICAgICAgIAowOS8yMC8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbUGVybF0gUGF0Y2ggMTExNjQzMSBmcm9tIEpvc2ggQ2hlcnJ5LiBGaXhlcyBub24gbWVtYmVyIGZ1bmN0aW9ucyBpbmFkdmVydGVudGx5CiAgICAgICAgICAgIGJlaW5nIGNhbGxlZCBpbnN0ZWFkIG9mIG1lbWJlciBmdW5jdGlvbnMuCgowOS8yMC8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbTHVhXSBQYXRjaCBmcm9tIE1hcmsgR29zc2FnZSB0byBhZGQgc3VwcG9ydCBmb3IgTHVhLTUuMSwgc3RkOjpzdHJpbmcsCiAgICAgICAgICAgIHN0ZDo6dmVjdG9yLCBzdGQ6OmV4Y2VwdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KCjA5LzE0LzIwMDU6IG1tYXR1cwoJICAgIFtQeXRob25dIEFkZCAtbm9jcHBjYXN0LiBOb3cgdGhlIGRlZmF1bHQgYmVoYXZpb3IgaXMgdG8KCSAgICBhbHdheXMgdXNlIHRoZSBjcHBjYXN0IG9wZXJhdG9ycy4gQmVmb3JlIHRoYXQgd2FzIHRoZSBjYXNlCgkgICAgb25seSB3aGVuIHlvdSB1c2VkIHRoZSAtY3BwY2FzdCBvcHRpb24uCgogICAgICAgICAgICBJZiB0aGlzIHNlZW1zIHRvIGJyZWFrIHlvdXIgY29kZS4uLiB5b3VyIHdlbGNvbWUhLCBpdAoJICAgIG1lYW5zIGl0IHdhcyBicm9rZW4gYmVmb3JlLCBhbmQgeW91IG5ldmVyIG5vdGljZS4gCgoJICAgIElmIHlvdSB0aGluZyB0aGUgZXJyb3IgaXMgZHVlIHRvIG9uZSBvZiB0aGUgU1dJRyB0eXBlbWFwcywKCSAgICBzZW5kIHVzIGFuIGV4YW1wbGUuCgoJICAgIFVzZSAtbm9jcHBjYXN0IG9ubHkgd2l0aCB2ZXJ5IG9sZCBDKysgY29tcGlsZXJzIHRoYXQKCSAgICBkbyBub3Qgc3VwcG9ydCB0aGUgY3BwY2FzdCBvcGVyYXRpb25zLiAKCgkgICAgU28sIGhlcmUgYXBwbGllczoKCgkJVGhpcyBjaGFuZ2UgZG9lc24ndCBicmVhayBjb21wYXRpYmlsaXR5LCBpdCB3YXMgYnJva2VuIGJlZm9yZS4KCjA5LzEzLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBGaXggZm9yIGRpcmVjdG9yIG1ldGhvZHMgd2hlbiBhIGNsYXNzIGlzIHBhc3NlZCBieSB2YWx1ZSBhcyBhCiAgICAgICAgICAgIHBhcmFtZXRlci4KCjA5LzExLzIwMDU6IG1tYXR1cwogICAgICAgICAgICBBZGRpbmcgdGhlIG1vZHVsZSBvcHRpb24gdG8gdGhlICVpbXBvcnQgZGlyZWN0aXZlLiBOb3cgeW91CiAgICAgICAgICAgIGNhbiB1c2UgaXQgYXMKCgkgICAgICAgICVpbXBvcnQobW9kdWxlPSJCaWdNb2R1bGUiKSBmb28uaQoKCSAgICB3aGVyZSBzdWJmaWxlIGNvdWxkIChvciBub3QpIGRlZmluZSB0aGUgbW9kdWxlIG5hbWUgdmlhCgkgICAgdGhlICVtb2R1bGUgZGlyZWN0aXZlLiBUaGUgbW9kdWxlIG9wdGlvbiB0YWtlIHByZWNlZGVuY2UKCSAgICBhbmQgaXQgaGFzIHRoZSBzYW1lIGVmZmVjdHMgdGhhbiBoYXZpbmcgdGhlIGRpcmVjdGl2ZSAKCgkgICAgICAgICVtb2R1bGUgQmlnTW9kdWxlICAKCgkgICAgaW5zaWRlIHRoZSBpbXBvcnRlZCBmaWxlIGZvby5pLgoKCSAgICBZb3UgY2FuIHVzZSB0aGUgb3B0aW9uIGluIG1haW5seSB0d28gY2FzZXM6CgoJICAgIDEuLSBZb3UgdXNlZCB0aGUgLW1vZHVsZSBvcHRpb24gd2hlbiB5b3UgZ2VuZXJhdGVkIHRoZQogICAgICAgICAgICAgICAgbW9kdWxlIHRvIGJlIGltcG9ydGVkLCBhbmQgaGVuY2UgdGhlIG1vZHVsZSBuYW1lIGluCiAgICAgICAgICAgICAgICB0aGUgaW1wb3J0ZWQgJW1vZHVsZSBkaXJlY3RpdmUgaXMgbm90IHJlYWxseSB1c2VmdWwuCgoJICAgIDIuLSBUaGUgbW9kdWxlIHlvdSB3YW50IHRvIGltcG9ydCBpcyB2ZXJ5IGxhcmdlLCBhbmQgaXQKICAgICAgICAgICAgICAgIGhhcyBzZXZlcmFsIC5pLy5oIGZpbGVzLiBUaGVuLCBpZiB5b3UganVzdCBvbmUgdG8KICAgICAgICAgICAgICAgIGltcG9ydCBhIGNsYXNzIG9yIHNvIGZyb20gdGhlIG1vZHVsZSwgc2F5cyAnZm9vJywgYW5kCiAgICAgICAgICAgICAgICBub3QgdGhlIGVudGlyZSBtb2R1bGUgdmlhIGltcG9ydGluZyB0aGUgbWFpbgogICAgICAgICAgICAgICAgQmlnTW9kdWxlLmkgZmlsZSwgdGhlbiB5b3UganVzdCBkbzoKCiAJCSAgICAlaW1wb3J0KG1vZHVsZT0iQmlnTW9kdWxlIikgZm9vLmgKCiAgIAkgICAgICAgIG9yCgkJCiAJCSAgICAlaW1wb3J0KG1vZHVsZT0iQmlnTW9kdWxlIikgZm9vLmkKCgkJd2hlcmUgZm9vLmkgY29udGFpbnMgdGhlICdmb28nIGRlY2xhcmF0aW9uIGFuZCBtYXliZSBhCgkJY291cGxlIG9mIGV4dHJhICVpbmNsdWRlIGRpcmVjdGl2ZXMsIGFzIG5lZWRlZC4KCgkgICAgCjA5LzExLzIwMDU6IG1tYXR1cwoJICAgIEZpeCBidWcgIzEyODI2MzcsIGFib3V0IHRoZSAtbW9kdWxlIG9wdGlvbiBub3QgaGF2aW5nIGVmZmVjdAoJICAgIGluIHBsYWNlcyB3aGVyZSBpdCB3YXMgbmVlZGVkLgoKMDkvMTEvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgV2hlbiB3cmFwcGluZyB2YXJpYWJsZXMsIGVuc3VyZSB0aGF0IG5vbmUgb2YgdGhlIHR5cGVtYXBzIHVzZWQgZm9yIHRoZQogICAgICAgICAgICBzZXQgd3JhcHBlcnMgYXJlIHVzZWQgd2hlbiBnZW5lcmF0aW5nIHRoZSBnZXQgd3JhcHBlcnMuIEkgZG91YnQgdGhpcyB3YXMgYQogICAgICAgICAgICBwcm9ibGVtIGZvciBhbnkgbGFuZ3VhZ2VzIGV4Y2VwdCBmb3IgdGhlIHJlY2VudGx5IGludHJvZHVjZWQgbnVsbCBhdHRyaWJ1dGUKICAgICAgICAgICAgaW4gdGhlIG91dCB0eXBlbWFwIChDIyBvbmx5KS4KCjA5LzA4LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIE1vcmUgZGVzY3JpcHRpdmUgZXJyb3IgbWVzc2FnZXMgd2hlbiBmaWxlcyBmYWlsIHRvIG9wZW4uCgowOS8wNi8yMDA1OiBtbWF0dXMgCgoJICAgIEFsbG93IGEgJWRlZmluZSBhIG1hY3JvIGluc2lkZSBhbm90aGVyICVkZWZpbmUgbWFjcm8sIGZvciBleGFtcGxlCgoJICAgICAgJWRlZmluZSBoZWxsbyhuYW1lLCBUeXBlKQoJICAgICAgJWRlZmluZSBuYW1lICMjIGEoVHlwZSkKCSAgICAgICV0eXBlbWFwKGluKSBUeXBlICJoZWxsbzsiOwoJICAgICAgJWVuZGRlZgoJICAgICAgJWVuZGRlZgoJICAgICAgCgkgICAgVG8gbGVhcm4gaG93IHRvIHVzZSB0aGlzIG5ldyBmZWF0dXJlcyBpbiB5b3VyIG93biB0eXBlbWFwcyBsaWJyYXJ5LCBzZWUKCSAgICBweXRob24vY3N0cmluZy5pLCBweXRob24vY3dzdHJpbmcuaSBhbmQgcHl0aG9uL2N3c3RyYmFzZS5pLgkgICAgCgogICAgICAgICAgICBbUHl0aG9uXSBOb3JtYWxpemUgdGhlIGNzdHJpbmcuaSBpbXBsZW1lbnRhdGlvbiB0byB1c2UgZnJhZ21lbnRzLCBhbmQgYWRkCiAgICAgICAgICAgIGN3c3RyaW5nLmksIHdoaWNoIGltcGxlbWVudHMgdGhlIHNhbWUgdHlwZW1hcHMgYnV0IGZvciB3Y2hhcl90IHN0cmluZ3MuCgoJICAgIFtQeXRob25dIEJ1ZyBmaXhlZDogMTI0NzQ3NywgMTI0NTU5MSwgMTI0OTg3OCBhbmQgb3RoZXJzLgoKMDgvMTgvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW1J1YnldIEltcGxlbWVudCBzdXBwb3J0IGZvciBTV0lHVFlQRSogRElTT1dOIHR5cGVtYXAgKGxpa2UgaW4gUHl0aG9uKSBmb3IKICAgICAgICAgICAgYmV0dGVyIGNvbnRyb2wgb2YgbWVtb3J5IG1hbmFnZW1lbnQsIGVnIHdoZW4gYWRkaW5nIGFuIG9iamVjdCBjcmVhdGVkIGluIFJ1YnkKICAgICAgICAgICAgdG8gYSBDKysgY29udGFpbmVyLiBQYXRjaCAjMTI2MTY5MiBmcm9tIENoYXJsaWUgU2F2YWdlLgoKMDgvMTgvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW1RjbF0gNjQgYml0IHBsYXRmb3JtIGZpeGVzIGZvciB0aGUgdmFyYXJncyBoYW5kbGluZyBpbiBTV0lHX0dldEFyZ3MuIFRoaXMgaXMgYW4KICAgICAgICAgICAgaW1wcm92ZWQgZml4IGZvciBidWcgIzEwMTE2MDQgYXMgc3VnZ2VzdGVkIGJ5IEplcmVteSBMaW4uCgowOC8xOC8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbVGNsXSBCdWcgIzEyNDA0NjkgLSAlbmV3b2JqZWN0IHN1cHBvcnQgZm9yIFRjbC4gUGF0Y2ggZnJvbSBCb2IgTWFyaW5pZXIuCgowOC8xNi8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbUGVybF0gQnVnICMxMjU0NDk0IC0gRml4IGZvciBnbG9iYWwgbmFtZXNwYWNlIHBvbGx1dGlvbiBieSBwZXJsIGhlYWRlciBmaWxlcwogICAgICAgICAgICAoYm9vbCBkZWZpbmUpIHByZXZlbnRlZCBTVEwgaGVhZGVycyBmcm9tIGJlaW5nIHVzZWQgb24gc29tZSBzeXN0ZW1zLCBlZwogICAgICAgICAgICBXaW5kb3dzIHdpdGggVmlzdWFsIFN0dWRpby4KCjA4LzE2LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBCdWcgIzEyNDA5MzcgLSBSZWRlZmluaXRpb24gb2YgX19pbnQ2NCB0eXBlZGVmIGZvciBJbnRlbCBjb21waWxlcnMuCgowOC8xNS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbWG1sXSBCdWcgIzEyNTE4MzIgLSAgQysrIHRlbXBsYXRlIG1heSBnZW5lcmF0ZSBpbnZhbGlkIFhNTCBmaWxlCgowOC8xNS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbTHVhXSBTdXBwb3J0IGFkZGVkIGZvciBMdWEuIFBhdGNoICMxMjQyNzcyIGZyb20gTWFyayBHb3NzYWdlLgogICAgICAgICAgICBJdCBzdXBwb3J0cyBtb3N0IEMvQysrIGZlYXR1cmVzIChmdW5jdGlvbnMsIHN0cnVjdCwgY2xhc3NlcywgYXJyYXlzLCBwb2ludGVycywKICAgICAgICAgICAgZXhjZXB0aW9ucyksIGFzIHdlbGwgYXMgbG90cyBvZiBkb2N1bWVudGF0aW9uIGFuZCBhIGZldyB0ZXN0IGNhc2VzICYgZXhhbXBsZXMuCgowOC8xNC8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbWG1sXSBGaXggaW5jb3JyZWN0IHhtbCBlc2NhcGluZyBpbiBiYXNlIGNsYXNzIG5hbWUgd2hlbiBiYXNlIGNsYXNzIGlzIGEgdGVtcGxhdGUuCgowOC8xMy8yMDA1OiBlZnV6enlvbmUKCSAgICBbQ0xJU1BdIEFkZGVkIHN1cHBvcnQgZm9yIGhhbmRsaW5nIGVudW1zLiBEb2VzIG5vdCBhZGRzIHRoZSByZXR1cm4gdHlwZSBkZWNsYXJhdGlvbgoJICAgIHRvIHRoZSBmdW5jdGlvbiBkZWZpbml0aW9uLCBpZiBhIGZ1bmN0aW9uIHJldHVybnMgdm9pZC4KCjA4LzA5LzIwMDU6IG1rb2VwcGUKCSAgICBOZXcgbGFuZ3VhZ2UgbW9kdWxlLCBDb21tb24gTGlzcCB3aXRoIFVGRkksIGZyb20gVXR6LVV3ZSBIYXVzLgoKMDgvMDkvMjAwNTogbWtvZXBwZQoJICAgIEZpeCB0aGUgTGlzcCBzLWV4cHJlc3Npb24gb3V0cHV0IG1vZHVsZTsgaXQgbm8gbG9uZ2VyIGNvbXBsYWlucyBhYm91dCAidW5rbm93biB0YXJnZXRzIi4KCjA3LzI3LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIE1vZGlmaWNhdGlvbnMgdG8gU1RMIHdyYXBwZXJzIHNvIHRoYXQgaXQgaXMgcG9zc2libGUgZm9yIGEgdXNlcidzICVleGNlcHRpb24gZGlyZWN0aXZlCiAgICAgICAgICAgIHRvIGJlIGFwcGxpZWQgdG8gdGhlIFNUTCB3cmFwcGVyIG1ldGhvZHMuIFByZXZpb3VzbHkgdGhlIGZvbGxvd2luZyBnbG9iYWwgJWV4Y2VwdGlvbgogICAgICAgICAgICBkaXJlY3RpdmUgd291bGQgbm90IGJlIHVzZWQgb24gdGhlIHdyYXBwZXIgbWV0aG9kczoKCiAgICAgICAgICAgICAgICAlZXhjZXB0aW9uIHsgCiAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgJGFjdGlvbgogICAgICAgICAgICAgICAgICB9IGNhdGNoICguLi4pIHsKICAgICAgICAgICAgICAgICAgICAvLyBoYW5kbGUgdW5jYXVnaHQgZXhjZXB0aW9ucwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICBUaGlzIGhhcyBiZWVuIGltcGxlbWVudGVkIGJ5IHJlcGxhY2luZyAlZXhjZXB0aW9uIGRpcmVjdGl2ZXMgZm9yIHNwZWNpZmljIFNUTCB3cmFwcGVyCiAgICAgICAgICAgIG1ldGhvZHMgd2l0aCBhbiBleGNlcHRpb24gc3BlY2lmaWNhdGlvbiBkZWNsYXJlZCBvbiB0aGUgd3JhcHBlciBtZXRob2RzLiB0aHJvd3MgdHlwZW1hcHMKICAgICAgICAgICAgYXJlIG5vdyBzdXBwbGllZCBmb3IgaGFuZGxpbmcgdGhlIFNUTCBleGNlcHRpb24gc3BlY2lmaWNhdGlvbi4gVGhlc2UgY2FuIGFsc28gYmUgZWFzaWx5CiAgICAgICAgICAgIG92ZXJyaWRkZW4sIGZvciBleGFtcGxlIHRoZSBzdGQ6Om91dF9vZl9yYW5nZSBleGNlcHRpb24sIHdoaWNoIGlzIHVzZWQgYSBsb3QgaW4gdGhlIFNUTAogICAgICAgICAgICB3cmFwcGVycywgY2FuIGJlIGN1c3RvbWlzZWQgZWFzaWx5OgoKICAgICAgICAgICAgICAlaW5jbHVkZSAic3RkX3ZlY3Rvci5pIgogICAgICAgICAgICAgICV0eXBlbWFwKHRocm93cykgc3RkOjpvdXRfb2ZfcmFuZ2UgewogICAgICAgICAgICAgICAgLy8gY3VzdG9tIGV4Y2VwdGlvbiBoYW5kbGVyCiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICV0ZW1wbGF0ZShWZWN0SW50KSBzdGQ6OnZlY3RvcjxpbnQ+OwoKMDcvMjIvMjAwNTogZWZ1enp5b25lCiAgICAgICAgICAgIFtDTElTUF0gVGhlIGNsaXNwIG1vZHVsZSBmb3IgU1dJRzoKICAgICAgICAgICAgICAtIEl0IGNhbiBvbmx5IGhhbmRsZSBDLCBjbGlzcCBjdXJyZW50bHkgZG9lcyBub3Qgc3VwcG9ydHMgZmZpIGJpbmRpbmdzIHRvIEMrKy4KICAgICAgICAgICAgICAtIEl0IGhhcyB0d28gb3B0aW9ucywgKGEpIC1leHRlcm4tYWxsIHRoaXMgd2lsbCBnZW5lcmF0ZSB3cmFwcGVycyBmb3IgYWxsIGZ1bmN0aW9ucwogICAgICAgIAlhbmQgdmFyaWFibGVzdGlvbnMsIChiKSAtZ2VuZXJhdGUtdHlwZWRlZiB0aGlzIHdpbGwgZ2VuZXJhdGUgd3JhcHBlcnMgImRlZi1jLXR5cGUiCgkgICAgICAgIHdyYXBwZXJzIGZvciB0eXBlZGVmcwoJICAgICAgLSBDYW4gaGFuZGxlIHBvaW50ZXJzIHRvIGZ1bmN0aW9ucywgY29tcGxleCB0eXBlcyBzdWNoIGFzIG4tZGltZW5zaW9uYWwgYXJyYXlzIG9mIAoJIAlwb2ludGVycyBvZiBkZXB0aCBkCgkgICAgICAtIEdlbmVyYXRlcyB3cmFwcGVycyBmb3IgY29uc3RhbnRzIGFzIHdlbGwgYXMgdmFyaWFibGVzCgkgICAgICAtIENvcnJlY3RseSBkaXN0aW5ndWlzaGVzIGJldHdlZW4gdGhlIGRlY2xhcmF0aW9uIG9mIHZhcmlhYmxlcyBpbiBzdHJ1Y3R1cmVzIGFuZCBmdW5jdGlvbnMKCSAgICAgIC0gQ3JlYXRlcyBhIGRlZnBhY2thZ2UgImRlY2xhcmF0aW9uIiB3aXRoIHRoZSBtb2R1bGUgbmFtZSBhcyB0aGUgcGFja2FnZSBuYW1lLCB0aGUgY3JlYXRlZCAKCSAgICAJcGFja2FnZSBleHBvcnRzIGJvdGggZnVuY3Rpb25zIGFuZCB2YXJpYWJsZXMKCSAgICAgIC0gdHJpZXMgdG8gZ3Vlc3Mgd2hlbiBzaG91bGQgYSBwb2ludGVyIHZhcmlhYmxlIGJlIGRlY2xhcmVkIGFzIGMtcHRyIG9yIGMtcG9pbnRlcgoKMDcvMjIvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBDaGFuZ2VzIHRvIHN1cHBvcnQgQyMgc3RydWN0cyByZXR1cm5lZCBieSB2YWx1ZS4gVGhlIGNoYW5nZXMgcmVxdWlyZWQgYXJlOgogICAgICAgICAgICAgIC0gVXNpbmcgYW4gb3B0aW9uYWwgJ251bGwnIGF0dHJpYnV0ZSBpbiB0aGUgb3V0IHR5cGVtYXAuIElmIHRoaXMgYXR0cmlidXRlIGlzIHNwZWNpZmllZCwKICAgICAgICAgICAgICAgIHRoZW4gaXQgaXMgdXNlZCBmb3IgdGhlICRudWxsIHNwZWNpYWwgdmFyaWFibGUgc3Vic3RpdHV0aW9uLgogICAgICAgICAgICAgIC0gVGhlIGN0eXBlIHVzZWQgaW4gdGhlIEMvQysrIHdyYXBwZXJzIGlzIG5vIGxvbmdlciBpbml0aWFsaXNlZCB0byAwIG9uIGRlY2xhcmF0aW9uLgogICAgICAgICAgICBCb3RoIG9mIHRoZXNlIGNoYW5nZXMgZml4IHRoZSBzaXR1YXRpb25zIHdoZXJlIGFuIGF0dGVtcHQgd2FzIG1hZGUgdG8gYXNzaWduIDAgdG8gdGhlCiAgICAgICAgICAgIHJldHVybmVkIHN0cnVjdC4gTWFyc2hhbGxpbmcgc3RydWN0cyBhcyB2YWx1ZSB0eXBlcyBzdGlsbCByZXF1aXJlcyB1c2VyIGRlZmluZWQgdHlwZW1hcHMuCiAgICAgICAgICAgIFNlZSBkb2N1bWVudGF0aW9uIGZvciBhbiBleGFtcGxlLgoKMDcvMjIvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjLCBKYXZhXSBGaXggU1dJR19leGNlcHRpb24gdXNhZ2UgdG8gd29yayB3aXRoIGNvbXBpbGVycyB0aGF0IGRvbid0IHN1cHBvcnQgZW1wdHkgbWFjcm8KICAgICAgICAgICAgYXJndW1lbnRzLiBVbmZvcnR1bmF0ZWx5IHRoaXMgZml4IHdpbGwgc3RvcCB1c2FnZSBvZiBTV0lHX2V4Y2VwdGlvbiBiZWluZyB1c2VkIHdpdGhpbiB0eXBlbWFwcwogICAgICAgICAgICB0aGF0IHVzZSAiIiBvciAleyAlfSBkZWxpbWl0ZXJzLCBidXQgY29udGludWVzIHRvIHdvcmsgd2l0aCB0eXBlbWFwcyB1c2luZyB7fSBkZWxpbWl0ZXJzLgogICAgICAgICAgICBQbGVhc2UgdXNlIHRoZSBTV0lHX0NTaGFycFNldFBlbmRpbmdFeGNlcHRpb25Bcmd1bWVudCBvciBTV0lHX0phdmFUaHJvd0V4Y2VwdGlvbiBtZXRob2RzIGluc3RlYWQKICAgICAgICAgICAgYXMgU1dJR19leGNlcHRpb24gaXMgcmVhbGx5IGludGVuZGVkIGFzIGEgcGxhdGZvcm0gaW5kZXBlbmRlbnQgbWFjcm8gZm9yIHRoZSBTV0lHIGxpYnJhcnkgd3JpdGVycy4KCjA3LzE2LzIwMDU6IG1rb2VwcGUKCSAgICBbQWxsZWdybyBDTF0gVXNlIHNwZWNpZmljIGZvcmVpZ24gdHlwZXMgcmF0aGVyIHRoYW4gKCogOnZvaWQpLiAKCSAgICBVc2UgKnN3aWctaWRlbnRpZmllci1jb252ZXJ0ZXIqLgoKMDYvMjcvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgRnVuY3Rpb25zIGRlY2xhcmVkIGFzICdleHRlcm4nIG5vIGxvbmdlciBoYXZlIGFuIGFkZGl0aW9uYWwgZnVuY3Rpb24gZGVjbGFyYXRpb24gYWRkZWQgdG8gdGhlIAogICAgICAgICAgICB3cmFwcGVyIGZpbGVzLiBUaGVyZSBhcmUgc29tZSBjYXNlcyB3aGVyZSBTV0lHIGRvZXMgbm90IGdldCB0aGlzIHJpZ2h0LCBlZyBidWcgIzEyMDU4NTkgKGV4dGVybgogICAgICAgICAgICBmdW5jdGlvbnMgd2l0aCBkZWZhdWx0IGFyZ3VtZW50cyBkZWNsYXJlZCBpbiBhIG5hbWVzcGFjZSkuIEFsc28gU1dJRyBjYW5ub3QgZ2V0IG5vbi1zdGFuZGFyZAogICAgICAgICAgICBjYWxsaW5nIGNvbnZlbnRpb25zIGNvcnJlY3QsIGVnIFdpbmRvd3MgY2FsbGluZyBjb252ZW50aW9ucyBhcmUgdXN1YWxseSBoYW5kbGVkIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgJXsKICAgICAgICAgICAgICAjZGVmaW5lIERMTElNUE9SVCBfX2RlY2xzcGVjKGRsbGltcG9ydCkKICAgICAgICAgICAgICAjZGVmaW5lIFNURENBTEwgX19zdGRjYWxsCiAgICAgICAgICAgICAgJX0KICAgICAgICAgICAgICAjZGVmaW5lIERMTElNUE9SVAogICAgICAgICAgICAgICNkZWZpbmUgU1REQ0FMTAogICAgICAgICAgICAgICVpbmxpbmUgJXsKICAgICAgICAgICAgICBETExJTVBPUlQgZXh0ZXJuIFNURENBTEwgdm9pZCBmdW5jdGlvbihpbnQpOwogICAgICAgICAgICAgICV9CgogICAgICAgICAgICBTV0lHIGluY29ycmVjdGx5IGdlbmVyYXRlczoKCiAgICAgICAgICAgIGV4dGVybiB2b2lkIGZ1bmN0aW9uKGludCk7CgogICAgICAgICAgICBUbyB3aGljaCB0aGVyZSBpcyBubyBzb2x1dGlvbiBhcyBTV0lHIGRvZXNuJ3QgaGFuZGxlIG5vbi1zdGFuZGFyZCBjYWxsaW5nIGNvbnZlbnRpb25zLiBUaGUgZXh0cmEKICAgICAgICAgICAgJ2V4dGVybicgZnVuY3Rpb24gdGhhdCBTV0lHIGdlbmVyYXRlcyBpcyBzdXBlcmZsdW91cyB1bmxlc3MgYSB1c2VyIGhhcyBmb3Jnb3R0ZW4gdG8gYWRkIHRoZSBmdW5jdGlvbgogICAgICAgICAgICBkZWNsYXJhdGlvbiBpbnRvIHRoZSB3cmFwcGVycy4KCiAgICAgICAgICAgIFRoZSAtbm9leHRlcm4gY29tbWFuZGxpbmUgYXJndW1lbnQgaXMgbm93IHJlZHVuZGFudCBhbmQgYSBuZXcgY29tbWFuZGxpbmUgYXJndW1lbnQgLWFkZGV4dGVybiBjYW4KICAgICAgICAgICAgYmUgdXNlZCB0byBvYnRhaW4gdGhlIG9yaWdpbmFsIGJlaGF2aW91ci4gVGhpcyBzaG91bGRuJ3QgYmUgbmVjZXNzYXJ5IHVubGVzcyB0aGUgaGVhZGVyIGZpbGUKICAgICAgICAgICAgY29udGFpbmluZyB0aGUgZnVuY3Rpb24gZGVjbGFyYXRpb24gd2FzIGluYWR2ZXJ0ZW50bHkgbm90IGFkZGVkIHRvIHRoZSB3cmFwcGVycy4gVG8gZml4IHRoaXMKICAgICAgICAgICAgYWRkIHRoZSBmdW5jdGlvbiBkZWNsYXJhdGlvbiBpbnRvIHlvdXIgd3JhcHBlcnMsIEZvciBleGFtcGxlLCByZXBsYWNlOgoKICAgICAgICAgICAgICBleHRlcm4gdm9pZCBmb28oaW50KTsKCiAgICAgICAgICAgIHdpdGg6CgogICAgICAgICAgICAgICVpbmxpbmUgJXsKICAgICAgICAgICAgICBleHRlcm4gdm9pZCBmb28oaW50KTsKICAgICAgICAgICAgICAlfQoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgowNi8yMi8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyMsIEphdmEsIE1vZHVsYTMsIE9jYW1sXQogICAgICAgICAgICBUaGUgaW50ZXJtZWRpYXJ5IGZ1bmN0aW9uIG5hbWVzIGhhdmUgYmVlbiBjaGFuZ2VkIHdoZW4gd3JhcHBpbmcgdmFyaWFibGVzIHRvCiAgICAgICAgICAgIG1hdGNoIHRoZSBvdGhlciBsYW5ndWFnZSBtb2R1bGVzIHNvIHRoYXQgJWV4dGVuZCBmb3IgYSBtZW1iZXIgdmFyaWFibGUgd29ya3MKICAgICAgICAgICAgdW5pZm9ybWx5IGFjcm9zcyBhbGwgbGFuZ3VhZ2UgbW9kdWxlcywgZWc6CgogICAgICAgICAgICAgICVleHRlbmQgRXh0ZW5kTWUgewogICAgICAgICAgICAgICAgVmFyOwogICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICV7CiAgICAgICAgICAgICAgICB2b2lkIEV4dGVuZE1lX1Zhcl9zZXQoRXh0ZW5kTWUgKiwgZG91YmxlKSB7Li4ufQogICAgICAgICAgICAgICAgZG91YmxlIEV4dGVuZE1lX1Zhcl9nZXQoRXh0ZW5kTWUgKikgey4uLn0KICAgICAgICAgICAgICAlfQoKICAgICAgICAgICAgVGhlIG1ldGhvZHMgaW1wbGVtZW50aW5nIHRoZSBnZXQvc2V0IHVzZWQgdG8gYmU6CgogICAgICAgICAgICAgICV7CiAgICAgICAgICAgICAgICB2b2lkIHNldF9FeHRlbmRNZV9WYXIoRXh0ZW5kTWUgKiwgZG91YmxlKSB7Li4ufQogICAgICAgICAgICAgICAgZG91YmxlIGdldF9FeHRlbmRNZV9WYXIoRXh0ZW5kTWUgKikgey4uLn0KICAgICAgICAgICAgICAlfQoKICAgICAgICAgICAgVGhpcyBhbHNvIGNoYW5nZXMgdGhlIG5hbWUgb2YgdmFyaWFibGUgd3JhcHBlciBmdW5jdGlvbnMgd2hlbiB1c2luZyAtbm9wcm94eS4KICAgICAgICAgICAgVGhlIG9yaWdpbmFsIG5hbWVzIGNhbiBiZSBnZW5lcmF0ZWQgd2l0aCB0aGUgLW9sZHZhcm5hbWVzIGNvbW1hbmRsaW5lIG9wdGlvbi4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKVmVyc2lvbiAxLjMuMjUgKEp1bmUgMTEsIDIwMDUpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMDYvMTEvMjAwNjogbWtvZXBwZQoJICAgIFtHdWlsZV0gRml4IGhhbmRsaW5nIG9mIGFub255bW91cy1lbnVtIHZhcmlhYmxlcy4KCjA2LzEwLzIwMDU6IG1rb2VwcGUKCSAgICBbR3VpbGVdIEZpeCBmb3IgZnVuY3Rpb24gYXJndW1lbnRzIHRoYXQgYXJlIHBhc3NlZCBieQoJICAgIGNvcHktb2YtdmFsdWUuICBGaXggZm9yIGdsb2JhbCAiY29uc3QgY2hhciAqIiB2YXJpYWJsZXMuCgkgICAgRml4IHRlc3RjYXNlcyBhcnJheXNfZGltZW5zaW9ubGVzcywgYXJyYXlzX2dsb2JhbC4KCjA2LzA4LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBmb3Igd2hlbiBhIGJhc2UgY2xhc3MgZGVmaW5lcyBhIHN5bWJvbCBhcyBhIG1lbWJlciB2YXJpYWJsZSBhbmQgYSBkZXJpdmVkIGNsYXNzIGRlZmluZXMKICAgICAgICAgICAgdGhlIHNhbWUgc3ltYm9sIGFzIGEgbWVtYmVyIG1ldGhvZC4KCjA2LzA4LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gTW9yZSBmaXhlcyBmb3IgdmlydHVhbC9uZXcvb3ZlcnJpZGUgbW9kaWZpZXJzIC0gd2hlbiBhIG1ldGhvZCBoYXMgcHJvdGVjdGVkIGFjY2VzcyAKICAgICAgICAgICAgaW4gYmFzZSBhbmQgcHVibGljIGFjY2VzcyBpbiBkZXJpdmVkIGNsYXNzLgoKMDYvMDIvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMxMDY2MzYzIC0gRm9sbG93IGNvbnZlbnRpb24gb2YgcmVsZWFzZSB0YXJiYWxsIG5hbWUgbWF0Y2hpbmcgZGlyZWN0b3J5IG5hbWUuCgowNi8wMi8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyMsIEphdmFdIEZpeCAjMTIxMTM1MyAtIHR5cGVzYWZlIGVudW1zIChhbmQgSmF2YSBwcm9wZXIgZW51bXMpIHdyYXBwZXJzIHdoZW4gZW51bSB2YWx1ZQogICAgICAgICAgICBpcyBuZWdhdGl2ZS4KCjA1LzI3LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIE1vZGVybmlzZWQgYW5kIHRpZGllZCB1cCBXaW5kb3dzIG1hY3JvcyAtLT4gU1dJR0VYUE9SVCwgU1dJR1NURENBTEwuIFRoZXkgY2FuIGJlIG92ZXJyaWRkZW4KICAgICAgICAgICAgYnkgdXNlcnMgdmlhIC1EIGNvbXBpbGVyIGRpcmVjdGl2ZXMgaWYgbmVlZCBiZS4KCjA1LzI2LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgICVjc21ldGhvZG1vZGlmaWVycyBjYW4gYmUgYXBwbGllZCB0byB2YXJpYWJsZXMgYXMgd2VsbCBhcyBtZXRob2RzIG5vdy4KCiAgICAgICAgICAgIEluIGFkZGl0aW9uIHRvIHRoZSBkZWZhdWx0ICdwdWJsaWMnIG1vZGlmaWVyIHRoYXQgU1dJRyBnZW5lcmF0ZXMsICVjc21ldGhvZG1vZGlmaWVycyB3aWxsIGFsc28KICAgICAgICAgICAgcmVwbGFjZSB0aGUgdmlydHVhbC9uZXcvb3ZlcnJpZGUgbW9kaWZpZXJzIHRoYXQgU1dJRyB0aGlua3MgaXMgYXBwcm9wcmlhdGUuIFRoaXMgZmVhdHVyZSBpcwogICAgICAgICAgICB1c2VmdWwgZm9yIHNvbWUgb2JzY3VyZSBjYXNlcyB3aGVyZSBTV0lHIG1pZ2h0IGdldCB0aGUgbW9kaWZpZXJzIGluY29ycmVjdCwgZm9yIGV4YW1wbGUKICAgICAgICAgICAgd2l0aCBtdWx0aXBsZSBpbmhlcml0YW5jZSBhbmQgb3ZlcnJpZGluZyBhIG1ldGhvZCBpbiB0aGUgYmFzZSBjbGFzcy4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBDIyBNT0RVTEUgKioqCgowNS8yNS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBBZGRlZCBtaXNzaW5nIGNvbnN0cnVjdG9ycyB0byBzdGQ6OnBhaXIgd3JhcHBlcnMgKHN0ZF9wYWlyLmkpIGZvciBhbGwgbGFuZ3VhZ2VzLgoKMDUvMjUvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBBZGRlZCBzdGQ6OnBhaXIgd3JhcHBlcnMgaW4gc3RkX3BhaXIuaQoKMDUvMjUvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBUaGUgQyMgJ25ldycgYW5kICdvdmVycmlkZScgbW9kaWZpZXJzIHdpbGwgYmUgZ2VuZXJhdGVkIHdoZW4gYSBDKysgY2xhc3MgaW5oZXJpdHMgbWV0aG9kcwogICAgICAgICAgICB2aWEgYSBDKysgJ3VzaW5nJyBkZWNsYXJhdGlvbi4KCjA1LzI1LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBmb3IgZXhjZXB0aW9uIHNwZWNpZmljYXRpb25zIHByZXZpb3VzbHkgYmVpbmcgaWdub3JlZCBpbiBjbGFzc2VzIHRoYXQgaW5oZXJpdGVkIG1ldGhvZHMKICAgICAgICAgICAgZnJvbSAndXNpbmcnIGRlY2xhcmF0aW9ucywgZWcgY2FsbHMgdG8gRGVyaXZlZDo6YmFyIGJlbG93IHdpbGwgY29udmVydCBDKysgZXhjZXB0aW9ucyBpbnRvCiAgICAgICAgICAgIGEgdGFyZ2V0IGxhbmd1YWdlIGV4Y2VwdGlvbi9lcnJvciwgbGlrZSBpdCBhbHdheXMgaGFzIGRvbmUgZm9yIEJhc2U6OkJhci4KCiAgICAgICAgICAgIGNsYXNzIEJhc2UgewogICAgICAgICAgICAgIHZpcnR1YWwgYmFyKCkgdGhyb3cgKHN0ZDo6c3RyaW5nKTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgY2xhc3MgRGVyaXZlZCA6IHB1YmxpYyBCYXNlIHsKICAgICAgICAgICAgICB1c2luZyBCYXNlOjpiYXI7CiAgICAgICAgICAgIH07CgowNS8yMy8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXhlcyBmb3IgZGV0ZWN0aW5nIHZpcnR1YWwgbWV0aG9kcyBpbiAlZXh0ZW5kIGZvciB0aGUgLWZ2aXJ0dWFsIG9wdGlvbiBhbmQgQyMgb3ZlcnJpZGUgYW5kIG5ldwogICAgICAgICAgICBtZXRob2QgbW9kaWZpZXJzLgoKMDUvMjMvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBUaGUgJ25ldycgbW9kaWZpZXIgaXMgbm93IGdlbmVyYXRlZCBvbiB0aGUgcHJveHkgbWV0aG9kIHdoZW4gYSBtZXRob2QgaW4gYSBkZXJpdmVkCiAgICAgICAgICAgIGNsYXNzIGlzIG5vdCBwb2x5bW9ycGhpYyBhbmQgdGhlIHNhbWUgbWV0aG9kIGV4aXN0cyBpbiB0aGUgZGVyaXZlZCBjbGFzcyAoaWUgaXQgaGlkZXMKICAgICAgICAgICAgdGhlIGJhc2UgY2xhc3MnIG5vbi12aXJ0dWFsIG1ldGhvZCkuCgowNS8yMy8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YSwgQyNdIEZpeGVzIHRvIGRldGVjdGlvbiBvZiBjb3ZhcmlhbnQgcmV0dXJuIHR5cGVzIC0gd2hlbiB0aGUgY2xhc3MgaGllcmFyY2h5IGlzIG1vcmUKICAgICAgICAgICAgdGhhbiAyIGNsYXNzZXMgZGVlcC4KCjA1LzIxLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBzdGQ6OndzdHJpbmcgdHlwZW1hcHMgbW92ZWQgZnJvbSBzdGRfc3RyaW5nLmkgdG8gc3RkX3dzdHJpbmcuaQoKMDUvMjEvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgRml4IGZvciBjcmFzaCBpbiBEb2hTdHJzdHIsIGJ1ZyAjMTE5MDkyMQoKMDUvMjEvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW1RDTF0gRml4IGZvciBtZXRob2RzIHdpdGggc2ltaWxhciBuYW1lcyB3aGVuIHNob3dpbmcgbGlzdCBvZiBuYW1lcyBvbiBlcnJvciAtIGJ1ZyAjMTE5MTgyOC4KICAgICAgICAgICAgUGF0Y2ggZnJvbSBKZXJvZW4gRG9iYmVsYWVyZS4KCjA1LzIxLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtUQ0xdIGxvbmcgbG9uZyBvdmVybG9hZGluZyBmaXggLSBidWcgIzExOTE4MzUsIHBhdGNoIGZyb20gSmVyb2VuIERvYmJlbGFlcmUuCgowNS8yMS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggYnVnICMxMTk2NzU1IHRvIHJlbW92ZSBkZWJ1ZyBmcm9tIHN3aWd0Y2w4LnN3Zy4KCjA1LzE5LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDIyBhbmQgLWZ2aXJ0dWFsIG9wdGlvbl0gRml4IGZvciB0aGUgb3ZlcnJpZGUga2V5IG5vdCBiZWluZyBnZW5lcmF0ZWQgaW4gdGhlIGRlcml2ZWQgY2xhc3Mgd2hlbiBhCiAgICAgICAgICAgIHZpcnR1YWwgbWV0aG9kJ3MgcmV0dXJuIHR5cGUgd2FzIGEgdHlwZWRlZiBpbiBlaXRoZXIgdGhlIGJhc2Ugb3IgZGVyaXZlZCBjbGFzcy4gQWxzbyBlbnN1cmVzIHRoZQogICAgICAgICAgICBtZXRob2QgaXMgZWxpbWluYXRlZCB3aGVuIHVzaW5nIHRoZSAtZnZpcnR1YWwgb3B0aW9uLiBGb3IgZXhhbXBsZSwgRGVyaXZlZC5tZXRob2Qgbm93IGhhcyB0aGUgQyMKICAgICAgICAgICAgb3ZlcnJpZGUga2V5d29yZCBnZW5lcmF0ZWQ6CgogICAgICAgICAgICAgIHR5cGVkZWYgaW50KiBJbnRlZ2VyUHRyOwoKICAgICAgICAgICAgICBzdHJ1Y3QgQmFzZSB7CiAgICAgICAgICAgICAgICB2aXJ0dWFsIEludGVnZXJQdHIgbWV0aG9kKCk7CiAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgc3RydWN0IERlcml2ZWQgOiBCYXNlIHsKICAgICAgICAgICAgICAgIGludCAqIG1ldGhvZCgpIGNvbnN0OwogICAgICAgICAgICAgIH07CgogICAgICAgICAgICBbQyNdIEZpeCBmb3IgdGhlIG92ZXJyaWRlIGtleSBiZWluZyBpbmNvcnJlY3RseSBnZW5lcmF0ZWQgZm9yIHZpcnR1YWwgbWV0aG9kcyB3aGVuIGEgYmFzZSBjbGFzcwogICAgICAgICAgICBpcyBpZ25vcmVkIHdpdGggJWlnbm9yZS4KCjA1LzEzLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBGaXhlcyB0byByZW1vdmUgImRlcmVmZXJlbmNpbmcgdHlwZS1wdW5uZWQgcG9pbnRlciB3aWxsIGJyZWFrIHN0cmljdC1hbGlhc2luZyBydWxlcyIKICAgICAgICAgICAgd2FybmluZ3MgaW4gQyB3cmFwcGVycyB3aGVuIGNvbXBpbGluZyBDIGNvZGUgd2l0aCAnZ2NjIC1XYWxsIC1mc3RyaWN0LWFsaWFzaW5nJy4gUGF0Y2ggZnJvbQogICAgICAgICAgICBNaWNoYWVsIENhaGlsbC4gVGhpcyBtb2RpZmllcyBtYW55IG9mIHRoZSBjYXN0cyBzbGlnaHRseSwgZm9yIGV4YW1wbGUKICAgICAgICAgICAgICBhcmcxID0gKihEQl9FTlYgKiopJmphcmcxOwogICAgICAgICAgICB0bwogICAgICAgICAgICAgIGFyZzEgPSAqKERCX0VOViAqKikodm9pZCAqKSZqYXJnMTsKCjA1LzEyLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gU3VwcG9ydCBmb3IgQyMgYXR0cmlidXRlcy4gQyMgYXR0cmlidXRlcyBjYW4gYmUgZ2VuZXJhdGVkOgogICAgICAgICAgICAxKSBPbiBhIEMvQysrIHR5cGUgYmFzaXMgYnkgc3BlY2lmeWluZyBhbiBpbmF0dHJpYnV0ZXMgYW5kL29yIG91dGF0dHJpYnV0ZXMgdHlwZW1hcCBhdHRyaWJ1dGUKICAgICAgICAgICAgICAgaW4gdGhlIGltdHlwZSBvciBjc3R5cGUgdHlwZW1hcHMgKGZvciBDIyByZXR1cm4gdHlwZSBvciBDIyBwYXJhbWV0ZXIgdHlwZSBhdHRyaWJ1dGVzKS4KICAgICAgICAgICAgMikgT24gYSB3cmFwcGVkIG1ldGhvZCBvciB2YXJpYWJsZSBieSBzcGVjaWZ5aW5nIGEgY3NhdHRyaWJ1dGVzIGZlYXR1cmUgKCVmZWF0dXJlKS4KICAgICAgICAgICAgMykgT24gYSB3cmFwcGVkIHByb3h5IGNsYXNzIG9yIGVudW0gYnkgc3BlY2lmeWluZyBhIGNzYXR0cmlidXRlcyB0eXBlbWFwLgoKICAgICAgICAgICAgRXhhbXBsZXMgYXJlIGluIHRoZSBDIyBkb2N1bWVudGF0aW9uIChDU2hhcnAuaHRtbCkuCgowNC8yOS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBOZXcgY29uZmlndXJlIG9wdGlvbiB0byB0dXJuIG9mZiB0aGUgZGVmYXVsdCBtYXhpbXVtIGNvbXBpbGVyIHdhcm5pbmcgYXMKICAgICAgICAgICAgdGhleSBjb3VsZG4ndCBiZSByZW1vdmVkIGV2ZW4gd2hlbiBvdmVycmlkaW5nIENGTEFHUyBhbmQgQ1hYRkxBR1Mgd2l0aCBjb25maWd1cmUKICAgICAgICAgICAgKC4vY29uZmlndXJlIENGTEFHUz0gQ1hYRkxBR1M9KS4gVG8gdHVybiB0aGUgbWF4aW11bSB3YXJuaW5ncyBvZmYsIHJ1bjogIAoKICAgICAgICAgICAgICAuL2NvbmZpZ3VyZSAtLXdpdGhvdXQtbWF4aW11bS1jb21waWxlLXdhcm5pbmdzCgowNC8yOC8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBQYXRjaCBmcm9tIFNjb3R0IE1pY2hlbCB3aGljaCByZXdvcmtzIHRoZSBKYXZhIGNvbnN0cnVjdG9yIGFuZCBmaW5hbGl6ZS9kZXN0cnVjdG9yIHR5cGVtYXBzLAogICAgICAgICAgICBmb3IgZGlyZWN0b3JzIHRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIG92ZXJhbGwgSmF2YSB0eXBlbWFwcy4gQWRkZWQgdGhlIGRpcmVjdG9yX3Rha2UgYW5kIAogICAgICAgICAgICBkaXJlY3Rvcl9yZWxlYXNlIHR5cGVtYXBzIHRvIGVtdWxhdGUgb3RoZXIgbW9kdWxlcycgX19kaXNvd25fXyBmdW5jdGlvbmFsaXR5LgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEpBVkEgRElSRUNUT1JTICoqKgoKMDQvMjgvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBGaXhlZCBwcm9ibGVtcyBkdWUgdG8gdGhlIG92ZXIgZWFnZXIgZ2FyYmFnZSBjb2xsZWN0b3IuIE9jY2FzaW9uYWxseSB0aGUKICAgICAgICAgICAgZ2FyYmFnZSBjb2xsZWN0b3Igd291bGQgY29sbGVjdCBhIEMjIHByb3h5IGNsYXNzIGluc3RhbmNlIHdoaWxlIGl0IHdhcyBiZWluZyB1c2VkCiAgICAgICAgICAgIGluIHVubWFuYWdlZCBjb2RlIGlmIHRoZSBvYmplY3Qgd2FzIHBhc3NlZCBhcyBhIHBhcmFtZXRlciB0byBhIHdyYXBwZWQgZnVuY3Rpb24uCiAgICAgICAgICAgIE5lZWRsZXNzIHRvIHNheSB0aGlzIGNhdXNlZCBoYXZvYyBhcyB0aGUgQyMgcHJveHkgY2xhc3MgY2FsbHMgdGhlIEMrKyBkZXN0cnVjdG9yCiAgICAgICAgICAgIHdoZW4gaXQgaXMgY29sbGVjdGVkLiBQcm94eSBjbGFzc2VzIGFuZCB0eXBlIHdyYXBwZXIgY2xhc3NlcyBub3cgdXNlIGEgSGFuZGxlUmVmLAogICAgICAgICAgICB3aGljaCBob2xkcyBhbiBJbnRQdHIsIGluc3RlYWQgb2YgYSBwbGFpbiBJbnRQdHIgdG8gbWFyc2hhbCB0aGUgQysrIHBvaW50ZXIgdG8gdW5tYW5hZ2VkCiAgICAgICAgICAgIGNvZGUuIFRoZXJlIGRvZXNuJ3QgYXBwZWFyIHRvIGJlIGFueSBwZXJmb3JtYW5jZSBkZWdyYWRhdGlvbiBhcyBhIHJlc3VsdCBvZiB0aGlzCiAgICAgICAgICAgIG1vZGlmaWNhdGlvbi4KCiAgICAgICAgICAgIFRoZSBjaGFuZ2VzIGFyZSBpbiB0aGUgcHJveHkgYW5kIHR5cGUgd3JhcHBlciBjbGFzc2VzLiBUaGUgc3dpZ0NQdHIgaXMgbm93IG9mIHR5cGUgSGFuZGxlUmVmCiAgICAgICAgICAgIGluc3RlYWQgb2YgSW50UHRyIGFuZCBjb25zZXF1ZW50bHkgdGhlIGdldENQdHIgbWV0aG9kIHJldHVybiB0eXBlIGhhcyBhbHNvIGNoYW5nZWQuIFRoZSBuZXQKICAgICAgICAgICAgZWZmZWN0IGlzIHRoYXQgYW55IGN1c3RvbSB3cml0dGVuIHR5cGVtYXBzIG1pZ2h0IGhhdmUgdG8gYmUgbW9kaWZpZWQgdG8gc3VpdGUuIEFmZmVjdGVkIHVzZXJzCiAgICAgICAgICAgIHNob3VsZCBub3RlIHRoYXQgdGhlIGltcGxlbWVudGF0aW9uIHVzZXMgdGhlIG5ldyAnb3V0JyBhdHRyaWJ1dGUgaW4gdGhlIGltdHlwZSB0eXBlbWFwIGFzIHRoZQogICAgICAgICAgICBpbnB1dCB0eXBlIGlzIG5vdyBhIEhhbmRsZVJlZiBhbmQgdGhlIG91dHB1dCB0eXBlIGlzIHN0aWxsIGFuIEludFB0ci4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBDIyBNT0RVTEUgKioqCgowNC8yOC8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIFN1cHBvcnQgZm9yIGFzeW1tZXRyaWMgdHlwZSBtYXJzaGFsbGluZyBhZGRlZC4gU29tZXRpbWVzIHRoZSBvdXRwdXQgdHlwZSBuZWVkcyB0byBiZQogICAgICAgICAgICBkaWZmZXJlbnQgdG8gdGhlIGlucHV0IHR5cGUuIFN1cHBvcnQgZm9yIHRoaXMgY29tZXMgaW4gdGhlIGZvcm0gb2YgYSBuZXcgb3B0aW9uYWwgJ291dCcKICAgICAgICAgICAgYXR0cmlidXRlIGZvciB0aGUgY3R5cGUsIGltdHlwZSBhbmQgY3N0eXBlIHR5cGVtYXBzLiBJZiB0aGlzIHR5cGVtYXAgYXR0cmlidXRlIGlzIG5vdAogICAgICAgICAgICBzcGVjaWZpZWQsIHRoZW4gdGhlIHR5cGUgdXNlZCBmb3IgYm90aCBpbnB1dCBhbmQgb3V0cHV0IGlzIHRoZSB0eXBlIHNwZWNpZmllZCBpbiB0aGUKICAgICAgICAgICAgdHlwZW1hcCwgYXMgaGFzIGFsd2F5cyBwcmV2aW91c2x5IGJlZW4gdGhlIGNhc2UuIElmIHRoaXMgdHlwZW1hcCBhdHRyaWJ1dGUgaXMgc3BlY2lmaWVkLAogICAgICAgICAgICB0aGVuIHRoZSB0eXBlIHNwZWNpZmllZCBpbiB0aGUgYXR0cmlidXRlIGlzIHVzZWQgZm9yIG91dHB1dCB0eXBlcyBhbmQgdGhlIHR5cGUgc3BlY2lmaWVkCiAgICAgICAgICAgIGluIHRoZSB0eXBlbWFwIGl0c2VsZiBpcyB1c2VkIGZvciB0aGUgaW5wdXQgdHlwZS4gQW4gb3V0cHV0IHR5cGUgaXMgYSByZXR1cm4gdmFsdWUgZnJvbQogICAgICAgICAgICBhIHdyYXBwZWQgbWV0aG9kIG9yIHdyYXBwZWQgY29uc3RhbnQgYW5kIGFuIGlucHV0IHR5cGUgaXMgYSBwYXJhbWV0ZXIgaW4gYSB3cmFwcGVkIG1ldGhvZC4KCiAgICAgICAgICAgIEFuIGV4YW1wbGUgc2hvd3MgdGhhdCBjaGFyICogY291bGQgYmUgbWFyc2hhbGxlZCBpbiBkaWZmZXJlbnQgd2F5cywgCgogICAgICAgICAgICAgICV0eXBlbWFwKGltdHlwZSwgb3V0PSJJbnRQdHIiKSBjaGFyICogInN0cmluZyIKICAgICAgICAgICAgICBjaGFyICogZnVuY3Rpb24oY2hhciAqKTsKCiAgICAgICAgICAgIFRoZSBvdXRwdXQgdHlwZSBpcyB0aHVzIEludFB0ciBhbmQgdGhlIGlucHV0IHR5cGUgaXMgc3RyaW5nLiBUaGUgcmVzdWx0aW5nIGludGVybWVkaWFyeSBDIyBjb2RlIGlzOgoKICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIGV4dGVybiBJbnRQdHIgZnVuY3Rpb24oc3RyaW5nIGphcmcxKTsKCjA0LzIyLzIwMDU6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbR3VpbGVdIEZpeCBnZW5lcmF0aW9uIG9mICJkZWZpbmUtbWV0aG9kIiBmb3IgbWV0aG9kcyBvZgoJICAgIGNsYXNzZXMgd2l0aCBhIGNvbnN0cnVjdG9yLiAgUmVwb3J0ZWQgYnkgTHVpZ2kgQmFsbGFiaW8uCgowNC8xNS8yMDA1OiB3dXp6ZWIgKEpvaG4gTGVueikKCSAgICBbQ2hpY2tlbl0KCSAgICBGb3Igd3JhcHBlZCBmdW5jdGlvbnMgdGhhdCByZXR1cm4gbXVsdGlwbGUgdmFsdWVzICh1c2luZyBhcmdvdXQpLAoJICAgIFNXSUcgQ0hJQ0tFTiBub3cgcmV0dXJucyB0aGVtIGFzIG11bHRpcGxlIHZhbHVlcyBpbnN0ZWFkIG9mIGFzCgkgICAgYSBsaXN0LiAgVGhleSBjYW4gdGhlbiBiZSBhY2Nlc3NlZCB1c2luZyAoY2FsbC13aXRoLXZhbHVlcykuCgowNC8xNC8yMDA1OiB3dXp6ZWIgKEpvaG4gTGVueikKICAgICAgICAgICAgW0NoaWNrZW5dCiAgICAgICAgICAgICsgQWRkZWQgYSB3aG9sZSBidW5jaCBvZiBuZXcgX3J1bm1lIHNjcmlwdHMgaW50byB0aGUgY2hpY2tlbiB0ZXN0CiAgICAgICAgICAgIHN1aXRlLiAgQWxzbyBmaXggc29tZSBidWdzIHRoZXNlIG5ldyBzY3JpcHRzIHR1cm5lZCB1cC4KCiAgICAgICAgICAgICsgQWRkZWQgb3B0aW1pemF0aW9uIHdoZW4gcmV0dXJuaW5nIGEgd3JhcHBlZCBwcm94eSBjbGFzcy4gIEJlZm9yZSwKICAgICAgICAgICAgYSBtaW5vciBnYXJiYWdlIGNvbGxlY3Rpb24gd2FzIGludm9rZWQgZXZlcnkgdGltZSBhIGZ1bmN0aW9uIHJldHVybmVkLgoKCSAgICArIEFsbCB0aGUgY2hpY2tlbiBFeGFtcGxlcyBzaG91bGQgbm93IHJ1biBjb3JyZWN0bHkKCjA0LzE0LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gTW9yZSBmaXhlcyBmb3IgdHlwZW1hcCBtYXRjaGluZyB3aGVuIHdyYXBwaW5nIHZhcmlhYmxlcywgaW4gcGFydGljdWxhcgogICAgICAgICAgICBzdGQ6OnN0cmluZywgc28gdGhhdCBzdGQ6OnN0cmluZyB2YXJpYWJsZXMgY2FuIGJlIGVhc2lseSBtYXJzaGFsbGVkIHdpdGgKICAgICAgICAgICAgYSBDIyBzdHJpbmcgcHJvcGVydHkgdXNpbmc6CgogICAgICAgICAgICAgICVpbmNsdWRlICJzdGRfc3RyaW5nLmkiCiAgICAgICAgICAgICAgJWFwcGx5IGNvbnN0IHN0ZDo6c3RyaW5nICYgeyBzdGQ6OnN0cmluZyAqdmFyaWFibGVfbmFtZSB9OwogICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHZhcmlhYmxlX25hbWU7CgogICAgICAgICAgICAoUmVjYWxsIHRoYXQgYWxsIGNsYXNzIHZhcmlhYmxlcyBhcmUgd3JhcHBlZCB1c2luZyBwb2ludGVycykKCjA0LzA1LzIwMDU6IHd1enplYiAoSm9obiBMZW56KQoJICAgIFtDaGlja2VuXQoJICAgICsgQWRkZWQgRXhhbXBsZXMvY2hpY2tlbi9lZ2csIGFuIGV4YW1wbGUgb24gaG93IHRvIGJ1aWxkIGEgY2hpY2tlbgoJICAgICAgZXh0ZW5zaW9uIGxpYnJhcnkgaW4gdGhlIGZvcm0gb2YgYW4gZWdnLiAgQWxzbyB1cGRhdGVkIHRoZQoJICAgICAgZG9jdW1lbnRhdGlvbiBvbiB0aGUgZGlmZmVyZW50IGxpbmtpbmcgb3B0aW9ucy4KCgkgICAgKyBjaGlja2VuIHRlc3Qtc3VpdGUgbm93IGhhcyBzdXBwb3J0IHRvIGNoZWNrIFNXSUcgd2l0aCB0aGUgLXByb3h5CgkgICAgICBhcmd1bWVudCBpZiB0aGVyZSBleGlzdHMgYSBfcHJveHlfcnVubWUuc3MgZmlsZS4KCgkgICAgKyBNb3JlIGZpeGVzIGZvciBvdmVybG9hZGVkIGZ1bmN0aW9ucyBhbmQgLXByb3h5CgowMy8zMS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBUdXJuZWQgb24gZXh0cmEgdGVtcGxhdGUgZmVhdHVyZXMgZm9yIGFsbCBsYW5ndWFnZXMgd2hpY2ggd2VyZQogICAgICAgICAgICBwcmV2aW91c2x5IG9ubHkgYXZhaWxhYmxlIHRvIFB5dGhvbi4KCiAgICAgICAgICAgIFRoaXMgZW5hYmxlcyB0eXBlbWFwcyBkZWZpbmVkIHdpdGhpbiBhIHRlbXBsYXRlZCBjbGFzcyB0byBiZSB1c2VkIGFzCiAgICAgICAgICAgIGV4cGVjdGVkLiBSZXF1aXJlcyAldGVtcGxhdGUgb24gdGhlIHRlbXBsYXRlZCBjbGFzcywgJXRlbXBsYXRlKCkgd2lsbAogICAgICAgICAgICBhbHNvIHBpY2sgdXAgdGhlIHR5cGVtYXBzLiBFeGFtcGxlOgoKICAgICAgICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RydWN0IEZvbyB7CiAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSBGb28gImluIHR5cGVtYXAgZm9yIEZvbzxUPiAiCiAgICAgICAgICAgICAgICBvcgogICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIEZvbzxUPiAiaW4gdHlwZW1hcCBmb3IgRm9vPFQ+ICIKICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgIAogICAgICAgICAgICAgICV0ZW1wbGF0ZShGb29faSkgRm9vPGludD47CiAgICAgICAgICAgICAgJXRlbXBsYXRlKCkgRm9vPGRvdWJsZT47CiAgICAgICAgICAgICAgCiAgICAgICAgICAgIHdpbGwgZ2VuZXJhdGUgdGhlIHByb3BlciAnaW4nIHR5cGVtYXBzIHdoZXJldmVyIEZvbzxpbnQ+IGFuZCBGb288ZG91YmxlPgogICAgICAgICAgICBhcmUgdXNlZC4KCjAzLzMwLzIwMDU6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbTXpTY2hlbWVdIFBhdGNoIGZyb20gSGFucyBPZXN0ZXJob2x0IGZvciBzdXBwb3J0aW5nIE16U2NoZW1lIDMweC4KCjAzLzI5LzIwMDU6IHd1enplYiAoSm9obiBMZW56KQoJICAgIFtDaGlja2VuXQoJICAgICsgUmVhbGxvdyBvbGRlciB2ZXJzaW9ucyBvZiBjaGlja2VuICgxLjQwIHRvIDEuODkpIGJ5IHBhc3NpbmcgLW5vY29sbGVjdGlvbgoJICAgICAgYXJndW1lbnQgdG8gU1dJRwoJICAgICsgJWltcG9ydCBub3cgd29ya3MgY29ycmVjdGx5IHdpdGggdGlueWNsb3MuICAoZGVjbGFyZSAodXNlcyAuLi4pKSB3aWxsIGJlCgkgICAgICBleHBvcnRlZCBjb3JyZWN0bHkuCgkgICAgKyBUaW55Q0xPUyBwcm94eSBjbGFzc2VzIG5vdyB3b3JrIGNvcnJlY3RseSB3aXRoIG92ZXJsb2FkZWQgZnVuY3Rpb25zCgkgICAgICBhbmQgY29uc3RydWN0b3JzLgoKMDMvMjkvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIFBhdGNoIGZyb20gU2NvdHQgTWljaGVsIGZvciBkaXJlY3Rvcm91dCB0eXBlbWFwcy4gSmF2YSBkaXJlY3RvcnMKICAgICAgICAgICAgcmVxdWlyZSB0aGUgZGlyZWN0b3JvdXQgdHlwZW1hcHMgbGlrZSB0aGUgb3RoZXIgbGFuZ3VhZ2VzIG5vdy4gVGhlIG5ldwogICAgICAgICAgICB0eXBlbWFwcyBwcm92aWRlIGZpeGVzIGZvciBtZXRob2RzIHdoZXJlIHRoZSByZXR1cm4gdHlwZSBpcyByZXR1cm5lZAogICAgICAgICAgICBieSByZWZlcmVuY2UgKHRoaXMgY2Fubm90IGF1dG9tYXRpY2FsbHkgYmUgbWFkZSB0aHJlYWQgc2FmZSB0aG91Z2gpLgoKMDMvMjIvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgRW51bSBjYXN0aW5nIGZpeGVzLiBWaXN1YWwgQysrIGRpZG4ndCBsaWtlIHRoZSBDIHR5cGUgY2FzdGluZyBTV0lHIHByb2R1Y2VkCiAgICAgICAgICAgIHdoZW4gd3JhcHBpbmcgQysrIGVudW0gcmVmZXJlbmNlcywgYXMgcmVwb3J0ZWQgYnkgQWRtaXJlIEthbmRhd2FzdmlrYS4KCjAzLzIxLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQZXJsXSBTRiAjMTEyNDQ5MC4gRml4IFBlcmwgbWFjcm8gY2xhc2hlcyB3aGVuIHVzaW5nIFZpc3VhbCBTdHVkaW8ncyBTVEwgc3RyaW5nLAogICAgICAgICAgICBzbyBub3cgcHJvamVjdHMgY2FuICNpbmNsdWRlIDxzdHJpbmc+LgoKMDMvMjEvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgRml4ZWQgJXZhcmFyZ3Mgd2hpY2ggZ290IGJyb2tlbiB3aXRoIHRoZSByZWNlbnQgZGVmYXVsdCBhcmd1bWVudCBjaGFuZ2VzLgogICAgICAgICAgICBBbHNvIHdvcmtzIGZvciBKYXZhIGFuZCBDIyBmb3IgdGhlIGZpcnN0IHRpbWUgbm93LgoKMDMvMTcvMjAwNTogd3V6emViIChKb2huIExlbnopCiAgICAgICAgICAgIFtDaGlja2VuXSAKCSAgICArIEZpeCBhIHdob2xlIGJ1bmNoIG9mIGJ1Z3MgaW4gdGhlIGNoaWNrZW4gbW9kdWxlLiAgVGhlIGVudGlyZQogICAgICAgICAgICAgIHRlc3Qgc3VpdGUgbm93IGNvbXBpbGVzLCB3aXRoIHRoZSBleGNlcHRpb24gb2YgdGhlIHRlc3RzIHRoYXQgcmVxdWlyZQoJICAgICAgc3RkX3ZlY3Rvci5pLCBzdGRfZGVxdWUuaSwgYW5kIHNvIG9uLCB3aGljaCBjaGlja2VuIGRvZXMgbm90IGhhdmUgeWV0LgoKCSAgICArIEFkZCBzdXBwb3J0IGZvciAlZXhjZXB0aW9uIGFuZCAldHlwZW1hcChleGNlcHRpb25zKS4gIEV4Y2VwdGlvbnMgYXJlCgkgICAgICB0aHJvd24gd2l0aCBhIGNhbGwgdG8gKGFib3J0KSBhbmQgY2FuIGJlIGhhbmRsZWQgYnkgKGhhbmRsZS1leGNlcHRpb25zKQoKMDMvMTUvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIFBhdGNoIGZyb20gU2NvdHQgTWljaGVsIGZvciBkaXJlY3RvcnMuIE1vZGlmaWNhdGlvbnMgdG8gdGhlIHR5cGVtYXBzCiAgICAgICAgICAgIGdpdmluZyB1c2VycyBmaW5lIGNvbnRyb2wgb3ZlciBtZW1vcnkgb3duZXJzaGlwIGFuZCBsaWZldGltZSBvZiBkaXJlY3RvciBjbGFzc2VzLgogICAgICAgICAgICBEaXJlY3RvciBjbGFzc2VzIG5vIGxvbmdlciBsaXZlIGZvcmV2ZXIgYnkgZGVmYXVsdCBhcyB0aGV5IGFyZSBub3cgY29sbGVjdGFibGUKICAgICAgICAgICAgYnkgdGhlIEdDLgoKMDMvMTUvMjAwNTogd3V6emViIChKb2huIExlbnopCgkgICAgW0NoaWNrZW5dIEFkZCBzdXBwb3J0IGZvciBhZGRpbmcgZmluYWxpemVycyBnYXJiYWdlIGNvbGxlY3RlZCBvYmplY3RzLgoJICAgIEZ1bmN0aW9ucyB0aGF0IHJldHVybiBuZXcgb2JqZWN0cyBzaG91bGQgYmUgbWFya2VkIHdpdGggJW5ld29iamVjdCBhbmQKCSAgICBpbnB1dCBhcmd1bWVudHMgd2hpY2ggY29uc3VtZSAob3IgdGFrZSBvd25lcnNoaXApIG9mIGEgcG9pbnRlciBzaG91bGQKCSAgICBiZSBtYXJrZWQgd2l0aCB0aGUgRElTT1dOIHR5cGVtYXAuCgoJICAgIEFsc28gYWRkIHN1cHBvcnQgZm9yIGNvcnJlY3RseSBjaGVja2luZyB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cyBwYXNzZWQKCSAgICB0byBhIGZ1bmN0aW9uLCBhbmQgcmFpc2luZyBhbiBlcnJvciBpZiB0aGUgd3JvbmcgbnVtYmVyIGFyZSBwYXNzZWQuCgowMy8xNC8yMDA1OiB3dXp6ZWIgKEpvaG4gTGVueikKICAgICAgICAgICAgQWRkIC0td2l0aG91dC1hbGxsYW5nIG9wdGlvbiB0byBjb25maWd1cmUuaW4sIHdoaWNoIGlzIHRoZSBzYW1lIGFzCiAgICAgICAgICAgIHBhc3NpbmcgYWxsIHRoZSAtLXdpdGhvdXQtcHl0aG9uIC0td2l0aG91dC1wZXJsNSBldGMuLi4gdGhhdCBNYXR0aGlhcyBhZGRlZC4KCjAzLzA5LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQaHBdIE1lbW9yeSBsZWFrIGZpeCBmb3IgZnVuY3Rpb25zIHJldHVybmluZyBjbGFzc2VzL3N0cnVjdHMgYnkgdmFsdWUuCgowMy8wOC8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbUGVybF0gRml4IGZvciBQZXJsIGluY29ycmVjdGx5IHRha2luZyBtZW1vcnkgb3duZXJzaGlwIGZvciByZXR1cm4gdHlwZXMgdGhhdAogICAgICAgICAgICBhcmUgdHlwZWRlZnMgdG8gYSBzdHJ1Y3QvY2xhc3MgcG9pbnRlci4gUmVwb3J0ZWQgYnkgSm9zaCBDaGVycnkuCgowMy8wNy8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIFZhcmlvdXMgZXhjZXB0aW9uIGNoYW5nZXMgZm9yIHRoZSBzdGQ6OnZlY3RvciB3cmFwcGVycy4gVGhlc2Ugbm93IG1vcmUKICAgICAgICAgICAgYWNjdXJhdGVseSBtaXJyb3IgdGhlIHNhbWUgZXhjZXB0aW9ucyB0aGF0IFN5c3RlbS5Db2xsZWN0aW9ucy5BcnJheUxpc3QgdGhyb3cuCgowMy8wNy8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIEZpeCB1bmRlZmluZWQgYmVoYXZpb3VyIGFmdGVyIGFueSBvZiB0aGUgc3RkOjp2ZWN0b3IgbWV0aG9kcwogICAgICAgICAgICB0aHJvdyBhbiBleGNlcHRpb24uCgowMy8wNy8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIFdoZW4gbnVsbCBpcyBwYXNzZWQgZm9yIGEgQysrIHJlZmVyZW5jZSBvciB2YWx1ZSBwYXJhbWV0ZXIsIHRoZSAKICAgICAgICAgICAgZXhjZXB0aW9uIHRocm93biBoYXMgYmVlbiBjb3JyZWN0ZWQgdG8gYW4gQXJndW1lbnROdWxsRXhjZXB0aW9uIGluc3RlYWQKICAgICAgICAgICAgb2YgTnVsbFJlZmVyZW5jZUV4Y2VwdGlvbiBhcyByZWNvbW1lbmRlZCBpbiB0aGUgLk5FVCBGcmFtZXdvcmsgZG9jdW1lbnRhdGlvbi4KCiAgICAgICAgICAgIFRoZSBkZWZhdWx0IHRocm93cyB0eXBlbWFwcyB0dXJuIGEgQysrIGV4Y2VwdGlvbiBpbnRvIGFuIEFwcGxpY2F0aW9uRXhjZXB0aW9uLAogICAgICAgICAgICBub3QgYSBTeXN0ZW1FeGNlcHRpb24gbm93LgoKMDMvMDcvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBOdW1lcm91cyBjaGFuZ2VzIGluIEMjIGV4Y2VwdGlvbiBoYW5kbGluZyBoYXZlIGJlZW4gbWFkZSBvdmVyIHRoZSBwYXN0CiAgICAgICAgICAgIGZldyB3ZWVrcy4gQSBzdW1tYXJ5IGZvbGxvd3M6CgogICAgICAgICAgICBUaGUgd2F5IGluIHdoaWNoIEMrKyBleGNlcHRpb25zIGFyZSBtYXBwZWQgdG8gQyMgZXhjZXB0aW9ucyBpcyBxdWl0ZSBkaWZmZXJlbnQuCiAgICAgICAgICAgIFRoZSBjaGFuZ2UgaXMgdG8gZml4IEMjIGV4Y2VwdGlvbnMgc28gdGhhdCB0aGUgQysrIGV4Y2VwdGlvbiBzdGFjayBpcyBjb3JyZWN0bHkKICAgICAgICAgICAgdW53b3VuZCBhcyBwcmV2aW91c2x5IEMrKyBleGNlcHRpb25zIHdlcmUgYmVpbmcgdGhyb3duIGFjcm9zcyB0aGUgQyBQSW52b2tlIGxheWVyCiAgICAgICAgICAgIGludG8gdGhlIG1hbmFnZWQgd29ybGQuCgogICAgICAgICAgICBOZXcgdHlwZW1hcCBhdHRyaWJ1dGVzIChjYW50aHJvdyBhbmQgZXhjb2RlKSBoYXZlIGJlZW4gaW50cm9kdWNlZCB0byBjb250cm9sIHRoZQogICAgICAgICAgICBtYXBwaW5nIG9mIEMrKyB0byBDIyBleGNlcHRpb25zLiBFc3NlbnRpYWxseSBhIGNhbGxiYWNrIGludG8gdGhlIHVubWFuYWdlZCB3b3JsZAogICAgICAgICAgICBpcyBtYWRlIHRvIHNldCBhIHBlbmRpbmcgZXhjZXB0aW9uLiBUaGUgZXhjZXB0aW9uIHRvIHRocm93IGlzIHN0b3JlZCBpbiB0aHJlYWQgbG9jYWwKICAgICAgICAgICAgc3RvcmFnZSAoc28gdGhlIGFwcHJvYWNoIGlzIHRocmVhZC1zYWZlKS4gVGhlIHR5cGVtYXBzIGFyZSBleHBlY3RlZCB0byByZXR1cm4KICAgICAgICAgICAgZnJvbSB1bm1hbmFnZWQgY29kZSBhcyBzb29uIGFzIHRoZSBwZW5kaW5nIGV4Y2VwdGlvbiBpcyBzZXQuIEFueSBwZW5kaW5nIGV4Y2VwdGlvbnMKICAgICAgICAgICAgYXJlIGNoZWNrZWQgZm9yIGFuZCB0aHJvd24gb25jZSBtYW5hZ2VkIGNvZGUgc3RhcnRzIGV4ZWN1dGluZy4gVGhlcmUgc2hvdWxkCiAgICAgICAgICAgIGJlIG1pbmltYWwgaW1wYWN0IG9uIGV4ZWN1dGlvbiBzcGVlZCBkdXJpbmcgbm9ybWFsIGJlaGF2aW91ci4gRnVsbCBkZXRhaWxzIHdpbGwgYmUKICAgICAgICAgICAgZG9jdW1lbnRlZCBpbiBDU2hhcnAuaHRtbC4KCiAgICAgICAgICAgIFRoZSBTV0lHX0NTaGFycFRocm93RXhjZXB0aW9uKCkgZnVuY3Rpb24gaGFzIGJlZW4gcmVtb3ZlZCBhbmQgcmVwbGFjZWQgd2l0aCB0aGUKICAgICAgICAgICAgU1dJR19DU2hhcnBTZXRQZW5kaW5nRXhjZXB0aW9uQXJndW1lbnQoKSBhbmQgU1dJR19DU2hhcnBTZXRQZW5kaW5nRXhjZXB0aW9uKCkKICAgICAgICAgICAgZnVuY3Rpb25zLiBUaGUgb3JpZ2luYWwgbmFtZSBoYXMgYmVlbiBkZWxpYmVyYXRlbHkgY2hhbmdlZCB0byBicmVhayBvbGQgY29kZSBhcwogICAgICAgICAgICB0aGUgb2xkIGFwcHJvYWNoIHdhcyBzb21ld2hhdCBmbGF3ZWQuIEFueSB1c2VyIGRlZmluZWQgZXhjZXB0aW9ucyB0aGF0IGZvbGxvdyB0aGUKICAgICAgICAgICAgc2FtZSBwYXR0ZXJuIGFzIHRoZSBvbGQgYXBwcm9hY2ggc2hvdWxkIGFsc28gYmUgZml4ZWQuCgogICAgICAgICAgICBOdW1lcm91cyBuZXcgLk5FVCBmcmFtZXdvcmsgZXhjZXB0aW9ucyBhcmUgbm93IGF2YWlsYWJsZSBmb3IgZWFzeSB0aHJvd2luZyBmcm9tIAogICAgICAgICAgICB1bm1hbmFnZWQgY29kZS4gVGhlIGNvbXBsZXRlIGxpc3QgaXM6IAoKICAgICAgICAgICAgICBBcHBsaWNhdGlvbkV4Y2VwdGlvbiwgQXJpdGhtZXRpY0V4Y2VwdGlvbiwgRGl2aWRlQnlaZXJvRXhjZXB0aW9uLCAKICAgICAgICAgICAgICBJbmRleE91dE9mUmFuZ2VFeGNlcHRpb24sIEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24sIElPRXhjZXB0aW9uLCAKICAgICAgICAgICAgICBOdWxsUmVmZXJlbmNlRXhjZXB0aW9uLCBPdXRPZk1lbW9yeUV4Y2VwdGlvbiwgT3ZlcmZsb3dFeGNlcHRpb24sIAogICAgICAgICAgICAgIFN5c3RlbUV4Y2VwdGlvbiwgQXJndW1lbnRFeGNlcHRpb24sIEFyZ3VtZW50TnVsbEV4Y2VwdGlvbiBhbmQKICAgICAgICAgICAgICBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24uCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgQyMgTU9EVUxFICoqKgoKMDUvMDUvMjAwNTogbW1hdHVzCgkgICAgCgkgICAgRml4IHNldmVyYWwgbWVtb3J5IGxlYWtzIGFyb3VuZC4gRXZlbiB3aGVuIHdlIHN1cnZpdmUgIGtub3duaW5nCgkgICAgc3dpZyBpcyBhIG1lbW9yeSBsZWFrIGZhY3RvcnksIGl0IHdhcyBhIGxpdHRsZSBvdXQgb2YKCSAgICBjb250cm9sLiBUbyBydW4gc3RkX2NvbnRhaW5lcnMuaSBpbiB0aGUgcHl0aG9uIHRlc3Qtc3VpdGUsCgkgICAgc3dpZyB3YXMgdXNpbmcgfjI2ME1CLCBub3cgaXQgdXNlcyAnb25seScgfjQwTUIsIHdoaWNoIGlzCgkgICAgdGhlIHNhbWUgYW1tb3VudCB0aGF0IGcrKyB1c2VzLCBzbywgaXMgbm90IHRoYXQgYmFkLgoJICAgIEluIHRoZSBwcm9jZXNzLCBJIGZvdW5kIGEgY291cGxlIG9mIGV4dHJhIERlbGV0ZXMsIHdoaWNoCgkgICAgaW4gc29tZSBjYXNlcyBjb3VsZCB0cmlnZ2VyIHNlZy4gZmF1bHRzIGFuZC9vcgoJICAgIERPSC9hc3NlcnRzLgoJICAgIAoJICAgIFtweXRob25dIEJldHRlciBzdXBwb3J0IGZvciBkaXJlY3RvcnMgKyBleGNlcHRpb24uIE1vcmUKCSAgICB2ZXJib3NlIGVycm9ycyBhbmQgYWRkZWQgYW4gdW5leHBlY3RlZCBleGNlcHRpb24gaGFuZGxlci4KCgkgICAgW3B5dGhvbl0gRml4IG1lbW9yeSBsZWFrIGZvciB0aGUKCgkgICAgCSAgICBzdGQ6OnZlY3RvcjxzdGQ6OnZlY3RvcjxpbnQ+ID4gCgoJICAgIGNhc2UscmVwb3J0ZWQgYnkgQm8gUGVuZy4KCgkgICAgW3B5dGhvbl0gRml4IFN3aWdQeU9iamVjdCBjb21wYXJlIHByb2JsZW0gcmVwb3J0ZSBieQoJICAgIENhbWVyb24gUGF0cmljay4gCgoJICAgIFtweXRob25dIEZpeCBzZXZlcmFsIHdhcm5pbmdzIGluIHRoZSBnZW5lcmF0ZWQgY29kZSAKCSAgICBmb3IgZ251LWdjYywgSW50ZWwgYW5kIFZDNy4xICBjb21waWxlcnMuCgoKMDIvMjUvMjAwNTogd3V6emViIChKb2huIExlbnopCgkgICAgVXBkYXRlIGRvY3VtZW50YXRpb24gdG8gdXNlIENTUyBhbmQgPGRpdj4gaW5zdGVhZCBvZiA8YmxvY2txdW90ZT4KCSAgICBJIHVzZWQgYSBzY3JpcHQgdG8gY29udmVydCB0aGUgZG9jcywgYW5kIGl0IHNldCBhbGwgdGhlIGJveCBjbGFzc2VzCgkgICAgdG8gYmUgImNvZGUiLiAgVGhlcmUgYXJlIGFjdHVhbGx5IDQgZGlmZmVyZW50IGNsYXNzZXMsCgkgICAgInNoZWxsIiwgImNvZGUiLCAidGFyZ2V0bGFuZyIsIGFuZCAiZGlhZ3JhbSIuICBXZSBuZWVkIHRvIGdvIHRocm91Z2gKCSAgICBhbmQgY29udmVydCB0aGUgZGl2cyBkZXBlbmRpbmcgb24gd2hhdCB0aGV5IGNvbnRhaW4uCgowMi8yMy8yMDA1OiBtbWF0dXMKCgkgICAgW1B5dGhvbl0gQWRkZWQgb3B0aW9uIC1ub3J0dGkgdG8gZGlzYWJsZSB0aGUgdXNlIG9mIG5hdGl2ZQoJICAgIEMrKyBSVFRJIHdpdGggZGlyZWN0b3JzIChkeW5hbWljX2Nhc3Q8PiBpcyBub3QgdXNlZCkuCgoJICAgIEFkZCBtb3JlIGNvZGUgZm9yIGRpcmVjdG9ycyB0byBkZXRlY3QgYW5kIHJlcG9ydCBlcnJvcnMgaW4KCSAgICB0aGUgcHl0aG9uIHNpZGUuCgoJICAgIEV4dGVuZCB0aGUgdXNlIG9mIFNXSUdJTlRFUk4gd2hlbmV2ZXIgaXMgcG9zc2libGUuCgoJICAgIFJlbW92ZSB0ZW1wbGF0ZSB3YXJuaW5ncyByZXBvcnRlZCBieSBWQzcuMS4KCgkgICAgUmVtb3ZlIHdhcm5pbmdzIHJlcG9ydGVkIGJ5IGdjYy9nKysuIEZpbmFsbHkgeW91IGNhbgoJICAgIGNvbXBpbGUgdXNpbmcKCgkgICAgICAgZysrIC1XIC1XYWxsIC1jIG15bW9kdWxlX3dyYXAuY3h4CgoJICAgIGFuZCBubyBzcHVyaW91cyBlcnJvcnMgd2lsbCBiZSBnZW5lcmF0ZWQgaW4gdGhlIHdyYXBwZXIKCSAgICBjb2RlLgoKMDIvMjMvMjAwNTogd3V6emViIChKb2huIExlbnopCgkgICAgQWRkZWQgLWV4dGVybmFsLXJ1bnRpbWUgYXJndW1lbnQuICBUaGlzIGFyZ3VtZW50IGlzIHVzZWQgdG8gZHVtcAoJICAgIG91dCBhbGwgdGhlIGNvZGUgbmVlZGVkIGZvciBleHRlcm5hbCBhY2Nlc3MgdG8gdGhlIHJ1bnRpbWUgc3lzdGVtLAoJICAgIGFuZCBpdCByZXBsYWNlcyBpbmNsdWRpbmcgdGhlIGZpbGVzIGRpcmVjdGx5LiAgVGhpcyBjaGFuZ2UgYWRkcwoJICAgIHR3byBuZXcgdmlydHVhbCBmdW5jdGlvbnMgdG8gdGhlIExhbmd1YWdlIGNsYXNzLCB3aGljaCBhcmUgdXNlZAoJICAgIHRvIGZpbmQgdGhlIGxhbmd1YWdlIHNwZWNpZmljIHJ1bnRpbWUgY29kZS4gIEkgYWxzbyB1cGRhdGVkCgkgICAgYWxsIGxhbmd1YWdlcyB0aGF0IHVzZSB0aGUgcnVudGltZSB0byBpbXBsZW1lbnQgdGhlc2UgdHdvIGZ1bmN0aW9ucy4KCjAyLzIyLzIwMDU6IG1tYXR1cyAKCSAgICBGaXggJXRlbXBsYXRlICsgcHJpdmF0ZSBlcnJvciBTRiMxMDk5OTc2LgoKMDIvMjEvMjAwNTogbW1hdHVzIAoKCSAgICBGaXggc3dpZ3J1bi5zd2cgd2FybmluZ3MgcmVwb3J0ZWQgd2hlbiB1c2luZyAiZ2NjIC1XIC1XYWxsIgoJICAgIChzdGF0aWMvaW5saW5lIG5vdCB1c2VkIGluIGZyb250IG9mIGEgZnVuY3Rpb24KCSAgICBkZWNsYXJhdGlvbiksIGFuZCBhZGQgU1dJR1VOVVNFRCBhdHRyaWJ1dGUgdG8gYXZvaWQKCSAgICB1bnVzZWQgd2FybmluZ3MgZWxzZXdoZXJlLgoKCSAgICBGaXggdW51c2VkIHZhcmlhYmxlIHdhcm5pbmdzLgoKCSAgICBbUHl0aG9uXSBVc2UgbmV3IFNXSUdVTlVTRUQgYXR0cmlidXRlIHRvIGF2b2lkIHdhcm5pbmdzIGluCgkgICAgU1dJR0lOVEVSTiBtZXRob2RzLgoKCSAgICBbUHl0aG9uXSBGaXggUHlPU19zbnByaW50ZiBmb3IgcHl0aG9uIHZlcnNpb25zIDwgMi4yIChTRiAjMTEwNDkxOSkuCgoJICAgIFtQeXRob25dIEZpeCBtYXAvbXVsdGltYXAgdG8gYWxsb3cgZW1wdHkgbWFwcyAocmVwb3J0ZWQgYnkKICAJICAgIFBoaWxpcHBlIEhldHJveSkuCgoJICAgIFtEb2NzXSBBZGQgc29tZSBkb2N1bWVudGF0aW9uIHRvIFB5dGhvbi5odG1sIGFuZAoJICAgIFNXSUdQbHVzLmh0bWwsIGluY2x1ZGluZyBmb3IgZXhhbXBsZSB0aGUgZmFjdCB0aGF0CgkgICAgJ2ZyaWVuZHMnIGFyZSBub3cgc3VwcG9ydGVkLgoKMDIvMjEvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW1BIUF0gUGF0Y2ggZnJvbSBPbGx5IEJldHRzLCBzbyB0aGF0IHdyYXBwZXJzIGNvbXBpbGUgd2l0aCBaZW5kIHRocmVhZCBzYWZldHkgZW5hYmxlZC4KCjAyLzE3LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIE1lbW9yeSBsZWFrIGZpeCBpbiBzb21lIG9mIHRoZSBzY3JpcHRpbmcgbGFuZ3VhZ2UgbW9kdWxlcyB3aGVuIHVzaW5nIGRlZmF1bHQKICAgICAgICAgICAgYXJndW1lbnRzIGluIGNvbnN0cnVjdG9ycy4gVGhlIHNjcmlwdGluZyBsYW5ndWFnZSB3YXMgbm90IHRha2luZyBvd25lcnNoaXAgb2YgdGhlCiAgICAgICAgICAgIEMrKyBvYmplY3QgbWVtb3J5IHdoZW4gYW55IG9mIHRoZSBjb25zdHJ1Y3RvcnMgdGhhdCB1c2UgZGVmYXVsdCBhcmd1bWVudHMgd2FzIGNhbGxlZC4KCjAyLzE2LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFNGICMxMTE1MDU1OiBGYWlsZWQgbWFrZSBpbnN0YWxsLiBQYXRjaCBmcm9tIFJvYiBTdG9uZS4KCjAyLzE2LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBTRiAjMTEyMzQxNiBmcm9tIFBhdWwgTW9vcmUuIENvcnJlY3QgbWVtb3J5IGFsbG9jYXRpb24gZm9yIFNUUklOR0FSUkFZCiAgICAgICAgICAgIHR5cGVtYXBzIGluIHZhcmlvdXMuaS4KCjAyLzE1LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIERpc2FibGVkIHR5cGVtYXAgc2VhcmNoIGNoYW5nZXMgZm9yIG5vdyAoc2VlIGVudHJ5IDE5LzEyLzIwMDQpLiBJdCBicmVha3MKICAgICAgICAgICAgb2xkIHR5cGVtYXBzLCBsZW5ndGhlbnMgdGhlIGV4ZWN1dGlvbiB0aW1lIGJ5IGFib3V0IDI1JSBhbmQgaW50cm9kdWNlcwogICAgICAgICAgICBpbmNvbnNpc3RlbmNpZXMuCgowMi8xNS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBzd2lnIC1oZWxwIGZvbGxvd3Mgb3RoZXIgc29mdHdhcmUgYnkgcHJpbnRpbmcgdG8gc3Rkb3V0IGluc3RlYWQgb2Ygc3RkZXJyIG5vdy4KICAgICAgICAgICAgc3dpZyAtdmVyc2lvbiBhbHNvIGRpc3BsYXlzIHRvIHN0ZG91dCBpbnN0ZWFkIG9mIHN0ZGVyciBub3cuCiAgICAgICAgICAgIEJlaGF2aW91ciByZXBvcnRlZCBieSBUb3JzdGVuIExhbmRzY2hvZmYuCgowMi8xNS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbUnVieV0gRml4IGZvciB0aGUgbGVzcyBjb21tb25seSB1c2VkIG9yZGVyaW5nIG9mICVpbmNsdWRlIGFuZCAjaW5jbHVkZSwgc28KICAgICAgICAgICAgdGhhdCB0aGUgZ2VuZXJhdGVkIGNvZGUgY29tcGlsZXMuIEJ1ZyByZXBvcnRlZCBieSByZXBvcnRlZCBieSBNYXggQm93c2hlci4KICAgICAgICAgICAgICAlaW5jbHVkZSBmb28uaAogICAgICAgICAgICAgICV7CiAgICAgICAgICAgICAgI2luY2x1ZGUgZm9vLmgKICAgICAgICAgICAgICAlfSAKCjAyLzE1LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDIywgSmF2YV0gU1dJR19leGNlcHRpb24gbWFjcm8gd2lsbCBub3cgcmV0dXJuIGZyb20gdW5tYW5hZ2VkIGNvZGUgLyBuYXRpdmUgY29kZQogICAgICAgICAgICBhcyBzb29uIGFzIGl0IGlzIGNhbGxlZC4gRml4ZXMgcG9zc2libGUgSlZNIGNyYXNoZXMgYW5kIG90aGVyIGNvZGUgdW5leHBlY3RlZGx5CiAgICAgICAgICAgIGJlaW5nIGV4ZWN1dGVkLiBOb3RlIFNXSUdfZXhjZXB0aW9uIGlzIG9ubHkgb2NjYXNpb25hbGx5IHVzZWQgYnkgU1dJRyBsaWJyYXJ5CiAgICAgICAgICAgIHdyaXRlcnMsIGFuZCBpcyBiZXN0IGF2b2lkZWQgYnkgU1dJRyB1c2Vycy4KCjAyLzE1LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDIywgSmF2YV0gVHlwZW1hcHMgY2FuIG5vdyBiZSB0YXJnZXRlZCBhdCBnbG9iYWwgdmFyaWFibGUgbmFtZXMKICAgICAgICAgICAgYW5kIHN0YXRpYyBtZW1iZXIgdmFyaWFibGUgbmFtZXMuIFByZXZpb3VzbHkgdGhlIHR5cGVtYXBzIGZvciAKICAgICAgICAgICAgdGhlIHNldHRlcnMgd2VyZSBpZ25vcmVkLCBmb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIGludCBnbG9iYWxpbnQgIi4uLiIKICAgICAgICAgICAgICBpbnQgZ2xvYmFsaW50OwoKMDIvMTMvMjAwNTogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtHdWlsZV0gQWRkICV0eXBlY2hlY2sgZm9yIFNXSUdUWVBFLCBhZGQgJXR5cGVjaGVjayBmb3IgcHRyZGlmZl90LCBmaXgKCSAgICB0eXBlbWFwcyBmb3Igc2l6ZV90LgoKCSAgICBbUGlrZV0gTWVyZ2UgcGF0Y2ggZnJvbSBUb3JzdGVuIExhbmRzY2hvZmYgZm9yIGltcHJvdmVkIFBpa2UgY29uZmlndXJhdGlvbi4KCjAyLzEyLzIwMDU6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBOZXcgY29uZmlndXJlIHN3aXRjaGVzIC0td2l0aG91dC10Y2wsIC0td2l0aG91dC1weXRob24gZXRjLiBhbGxvdyB0bwogICAgICAgICAgICBkaXNhYmxlIHRoZSBzZWFyY2ggZm9yIGluc3RhbGxlZCBsYW5ndWFnZXMuCgowMS8zMS8yMDA1OiB3dXp6ZWIgKEpvaG4gTGVueikKICAgICAgICAgICAgLSBBZGQgRG9oU29ydExpc3QgdG8gRE9ICgkgICAgCgkgICAgLSBJbXByb3ZlIHRoZSBydW50aW1lIHR5cGUgc3lzdGVtOgogICAgICAgICAgICAgICArIFNwZWVkLiBUeXBlIGxvYWRpbmcgaXMgbm93IE8obiBsb2cgbikgaW5zdGVhZCBvZiBPKE5eMiksIHdoaWNoCgkgICAgICAgICBmb3IgbGFyZ2UgbW9kdWxlcyBpcyBhIGh1Z2UgaW1wcm92ZW1lbnQuCiAgICAgICAgICAgICAgICsgQSB3aG9sZSBidW5jaCBvZiBmdW5jdGlvbnMgaW4gc3dpZ3J1bi5zd2cgbm8gbG9uZ2VyIG5lZWQgdGhlIAogICAgICAgICAgICAgICAgIHN3aWdfdHlwZV9saXN0X2hhbmRsZSBwYXNzZWQgdG8gdGhlbS4gIFRoZSBvbmx5IG9uZSBsZWZ0IGlzIAoJCSBUeXBlUXVlcnkuICBUaGlzIGFsc28gbWFrZXMgcnVudGltZS5zd2cgYSBsb3Qgc21hbGxlci4KCSAgICAgICArIFNwbGl0IHVwIHN3aWdfdHlwZV9pbmZvIHN0cnVjdHVyZSBpbnRvIHR3byBzdHJ1Y3R1cmVzCgkgICAgICAgICAoc3dpZ190eXBlX2luZm8gYW5kIHN3aWdfY2FzdF9pbmZvKQoJICAgICAgICsgU3RvcmUgYSBwb2ludGVyIHRvIGEgc3dpZ190eXBlX2luZm8gcmF0aGVyIHRoYW4ganVzdCB0aGUgdHlwZQoJICAgICAgICAgbmFtZSBzdHJpbmcgaW4gdGhlIGxpbmtlZCBsaXN0IG9mIGNhc3RzLiBGaXJzdCBvZmYsIHRoaXMgbWFrZXMKCSAgICAgICAgIHRoZSBndWlsZSBtb2R1bGUgYSBsaXR0bGUgZmFzdGVyLCBhbmQgc2Vjb25kLCB0aGUKCSAgICAgICAgIFNXSUdfVHlwZUNsaWVudERhdGEoKSBmdW5jdGlvbiBpcyBmYXN0ZXIgdG9vLiAKCSAgICAgICArIEFkZCB0aGUgaWRlYSBvZiBhIG1vZHVsZSBpbnRvIHRoZSB0eXBlIHN5c3RlbS4gIEJlZm9yZSwgYWxsIHRoZQoJICAgICAgICAgdHlwZXMgd2VyZSBzdG9yZWQgaW4gb25lIGh1Z2UgbGlua2VkIGxpc3QuIE5vdywgYW5vdGhlciBsZXZlbCBpcwoJICAgICAgICAgYWRkZWQsIGFuZCB0aGUgdHlwZSBzeXN0ZW0gc3RvcmVzIGEgbGlua2VkIGxpc3Qgb2YgbW9kdWxlcywgZWFjaAoJICAgICAgICAgb2Ygd2hpY2ggc3RvcmVzIGFuIGFycmF5IG9mIHR5cGVzIGFzc29jaWF0ZWQgd2l0aCBpdC4KCSAgICAgICArIEZvciBtb3JlIGluZm9ybWF0aW9uIG9mIGhvdyB0aGUgcnVudGltZSB0eXBlIHN5c3RlbSBub3cgd29ya3MsCgkgICAgICAgICBwbGVhc2Ugc2VlIERvYy9NYW51YWwvdHlwZW1hcHMuaHRtbCBhbmQgRG9jL0RldmVsL3J1bnRpbWUudHh0CgkJIAoJICAgIC0gVXBkYXRlIGFsbCBsYW5ndWFnZSBtb2R1bGVzIHRvIHVzZSB0aGUgbmV3IHR5cGUgc3lzdGVtLiAgVGhlIGNoYW5nZXMKCSAgICAgIHRvIGVhY2ggbGFuZ3VhZ2UgbW9kdWxlIGFyZSBtaW5vci4gIEFsbCBsYW5ndWFnZXMgYXJlIG5vdyBhYmxlIHRvCgkgICAgICB1c2UgcnVudGltZS5zd2cgZm9yIGV4dGVybmFsIGFjY2VzcyB0byB0aGUgdHlwZSBzeXN0ZW0uICBCZWZvcmUKCSAgICAgIG9ubHkgcHl0aG9uIGFuZCBwZXJsIGRpZC4KCgkgICAgLSBbZ3VpbGUsIG16c2NoZW1lLCBvY2FtbCwgYW5kIHBocDRdICBUaGVzZSBsYW5ndWFnZXMgb3BlbmVkIHVwIHRoZQoJICAgICAgaW5pdCBmdW5jdGlvbiBpbnNpZGUgdGhlIC5jeHggY29kZSwgYW5kIGFueSBjb2RlIGluIHRoZSAuc3dnIGZpbGVzCgkgICAgICBpbiB0aGUgaW5pdCBzZWN0aW9uIHdhcyBpbnNpZGUgdGhpcyBmdW5jdGlvbi4gIFRoaXMgd2FzIGEgcHJvYmxlbQoJICAgICAgZm9yIHN3aWdpbml0LnN3Zywgd2hpY2ggbmVlZHMgdG8gYmUgaW5zZXJ0ZWQgYmVmb3JlIHRoZSBTV0lHX2luaXQKCSAgICAgIGZ1bmN0aW9uIGlzIG9wZW5lZC4gIFRodXMgSSBjaGFuZ2VkIHRoZXNlIGxhbmd1YWdlcyB0byBiZSBsaWtlCgkgICAgICBweXRob24gb3IgcGVybCwgd2hlcmUgdGhlIGluaXQgZnVuY3Rpb24gaXMgZGVjbGFyZWQgaW4gdGhlIC5zd2cKCSAgICAgIGZpbGUuCgkgICAgICAKCSAgICAtIFtSdWJ5XSBJbnN0ZWFkIG9mIG1vdmluZyB0aGUgaW5pdCBmdW5jdGlvbiB0byB0aGUgLnN3ZyBmaWxlLCBJCgkgICAgICBhZGRlZCBhIG5ldyBzZWN0aW9uIGluaXRiZWZvcmVmdW5jLCBhbmQgdGhlbiBhZGRlZAoJICAgICAgJWluc2VydChpbml0YmVmb3JlZnVuYykgInN3aWdpbml0LnN3ZyIKCgkgICAgLSBbTXpTY2hlbWVdIEZpeCBlbnVtcyBhbmQgZml4IEV4YW1wbGVzL01ha2VmaWxlLmluIHNvIHRoYXQgaWYKCSAgICAgIG11bHRpcGxlIC1JIGFyZ3VtZW50cyBhcmUgc3BlY2lmaWVkIGluIHRoZSBJTkNMVURFUyB2YXJpYWJsZSwgZWFjaAoJICAgICAgZ2V0cyBhICsrY2NmLgoKCSAgICAtIFtHdWlsZSBHSF0gVXBkYXRlIEd1aWxlIEdIIHRvIHVzZSB0aGUgbmV3IHR5cGUgc3lzdGVtLiAgU2VlCgkgICAgICBEb2MvTWFudWFsL0d1aWxlLmh0bWwgZm9yIGhvdyBzbW9icyBhcmUgbm93IHVzZWQuCgowMS8xMS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIE5ldyB0eXBlbWFwIGNhbGxlZCAnY3Njb25zdHJ1Y3QnLiBUaGUgY29kZSBpbiB0aGlzIHR5cGVtYXBzIHdhcyBwcmV2aW91c2x5IGhhcmQKICAgICAgICAgICAgY29kZWQgYW5kIGNvdWxkIG5vdCBiZSBjdXN0b21pc2VkIGJ5IGEgdXNlci4gVGhpcyB0eXBlbWFwIGNvbnRhaW5zIHRoZSBjb2RlIHRoYXQgaXMKICAgICAgICAgICAgZ2VuZXJhdGVkIGludG8gYSBwcm94eSBjbGFzcydzIGNvbnN0cnVjdG9yLgoKICAgICAgICAgICAgW0phdmFdIE5ldyB0eXBlbWFwIGNhbGxlZCAnamF2YWNvbnN0cnVjdCcuIFRoZSBjb2RlIGluIHRoaXMgdHlwZW1hcHMgd2FzIHByZXZpb3VzbHkgaGFyZAogICAgICAgICAgICBjb2RlZCBhbmQgY291bGQgbm90IGJlIGN1c3RvbWlzZWQgYnkgYSB1c2VyLiBUaGlzIHR5cGVtYXAgY29udGFpbnMgdGhlIGNvZGUgdGhhdCBpcwogICAgICAgICAgICBnZW5lcmF0ZWQgaW50byBhIHByb3h5IGNsYXNzJ3MgY29uc3RydWN0b3IuIEFub3RoZXIgdHlwZW1hcCBuYW1lZCAnamF2YWNvbnN0cnVjdF9kaXJlY3RvcicKICAgICAgICAgICAgaXMgdXNlZCBpbnN0ZWFkIHdoZW4gdGhlIHByb3h5IGNsYXNzIGlzIGEgZGlyZWN0b3IgY2xhc3MuCgogICAgICAgICAgICBbQyMsIEphdmFdIElmIGEgQysrIGNsYXNzIGRpZCBub3QgaGF2ZSBhIGRlZmF1bHQgY29uc3RydWN0b3IsIGEgcHJvdGVjdGVkIGRlZmF1bHQgY29uc3RydWN0b3IKICAgICAgICAgICAgd2FzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IFNXSUcuIFRoaXMgc2VlbXMgaXMgdW5uZWNlc3NhcnkgYW5kIGhhcyBiZWVuIHJlbW92ZWQKICAgICAgICAgICAgYW5kIHRoZXJlYnkgZ2l2aW5nIHRoZSB1c2VyIGFsbW9zdCBjb21wbGV0ZSBjb250cm9sIG92ZXIgdGhlIGdlbmVyYXRlZCBjb2RlIGFsb25nIHdpdGggdGhlCiAgICAgICAgICAgIG5ldyB0eXBlbWFwcyBhYm92ZS4KCjE5LzEyLzIwMDQ6IG1tYXR1cwogICAgICAgICAgICBbRGlzYWJsZWQsIHNlZSBlbnRyeSAwMi8xNS8yMDA0XQogICAgICAgICAgICAtIEZpeCB0eXBlbWFwIHNlYXJjaCwgbm93IHRoZSAib3V0IiB0eXBlbWFwIHNlYXJjaCBpcyBkb25lIGFzIGZvbGxvd3MKCiAgICAgICAgICAgICAgICAgaW50ICpGb286OmZvbyhpbnQgYmFyKSAgIC0+ICBpbnQgKkZvbzo6Zm9vKGludCBiYXIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+ICBpbnQgKkZvbzo6Zm9vCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+ICBpbnQgKmZvbyhpbnQgYmFyKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiAgaW50ICpmb28KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gIGludCAqCgogICAgICAgICAgICAgICB0aGVuLCBub3cgeW91IGNhbiBiZSBtb3JlIHNwZWNpZmljLCBhbmQgZGVmaW5lCgogICAgICAgICAgICAgIC8qIGFwcGx5IG9ubHkgZm9yICAnRm9vOjpmb28nIG1ldGhvZCAqLwogICAgICAgICAgICAgICV0eXBlbWFwKG91dCkgaW50ICogRm9vOjpmb28oaW50ICpiYXIpIC4uLjsgCgogICAgICAgICAgICAgIC8qIGFwcGx5IGZvciBhbGwgJ2ZvbycgZnVuY3Rpb25zL21ldGhvZHMgKi8KICAgICAgICAgICAgICAldHlwZW1hcChvdXQpIGludCAqIGZvbyhpbnQgKmJhcikgLi4uOyAKCiAgICAgICAgICAgICAgJWlubGluZSB7CiAgICAgICAgICAgICAgICBzdHJ1Y3QgRm9vIHsKICAgICAgICAgICAgICAgICAgIGludCAqZm9vKGludCAqYmFyKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgfQoJICAKCjE1LzEyLzIwMDQ6IG1tYXR1cwogICAgICAgICAgICAtIE1vcmUgZml4ZXMgZm9yIHRlbXBsYXRlcyBhbmQgdGVtcGxhdGUgZGVmYXVsdCBhcmdzLgogICAgICAgICAgICAgIFNlZSB0ZW1wbGF0ZV9kZWZhdWx0LmkgZm9yIHNjYXJ5IGNhc2VzIHRoYXQgbm93IGFyZSAKICAgICAgICAgICAgICBzdXBwb3J0ZWQsIGJlc2lkZXMgdGhlIGFscmVhZHkgdWdseSBTVEwvc3RkIGNhc2VzLgogICAgICAgICAgICAgIAogICAgICAgICAgICAtIENvc21ldGljcyBhbmQgbW9yZSB1c2Ugb2YgJ2NvbnN0JyB3aGVyZSBpdCB3YXMgaW1wbGljaXQuCiAgICAgICAgICAgIC0gT3RoZXIgZml4ZXMgZm9yIE9TUywgd2hpY2ggaXMgbm93IHdvcmtpbmcgYWdhaW4gd2l0aCAxLjMuMjUuCgkKVmVyc2lvbiAxLjMuMjQgKERlY2VtYmVyIDE0LCAyMDA0KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoxMi8xMi8yMDA0OiB3dXp6ZWIgKEpvaG4gTGVueikKICAgICAgICAgICAgW0NoaWNrZW5dIEZpeCBhIGJ1bmNoIG9mIGJ1Z3MgcmVsYXRpbmcgdG8gLXByb3h5IHN1cHBvcnQKCSAgICAgICsgbm9uLWNsYXNzIHZhcmlhYmxlcyBub3cgZXhwb3J0IHByb3Blcmx5IHVzaW5nIC1wcm94eQoJICAgICAgKyBzdGF0aWMgbWVtYmVyIGZ1bmN0aW9ucyBub3cgZXhwb3J0IHByb3Blcmx5IHVzaW5nIC1wcm94eQoJICAgICAgKyBtZW1iZXIgY2xhc3MgdmFyaWFibGVzIG5vdyBleHBvcnQgcHJvcGVybHkgdXNpbmcgLXByb3h5CgkgICAgICArIGFkZGVkIGEgLW5vdW5pdCBhcmd1bWVudCwgd2hpY2ggZG9lcyBub3QgZXhwb3J0IHRoZSAoZGVjbGFyZSAodW5pdCAuLi4pKQoJICAgICAgKyBjb3JyZWN0bHkgaW5zdGFsbCBzd2lnY2xvc3ByZWZpeC5zY20KCSAgICAgICsgY29uc3RhbnRzIChlbnVtcywgZGVmaW5lcykgbm93IGNvcnJlY2x5IGV4cG9ydCB3aGVuIHVzaW5nIC1wcm94eQoKMTIvMTEvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgY29uZmlndXJlIGZpeCBmb3Igd2hlbiBtb3JlIHRoYW4gb25lIHZlcnNpb24gb2Ygam5pX21kLmggaXMgZm91bmQKICAgICAgICAgICAgaW4gdGhlIEphdmEgaW5jbHVkZSBkaXJlY3RvcnkgKHdhcyBnZW5lcmF0aW5nIGxvdHMgb2Ygc2VkIGVycm9yCiAgICAgICAgICAgIG1lc3NhZ2VzKS4KCjEyLzA4LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBGaXhlcyB0byBhcnJheXNfamF2YS5pIHNvIHRoYXQgb25lIGNhbiBhcHBseSB0aGUgYXJyYXkKICAgICAgICAgICAgdHlwZW1hcHMgdG8gZnVuY3Rpb25zIHRha2luZyBwb2ludGVycyBhcyBpbnB1dCwgZWcKCiAgICAgICAgICAgICAgICAlaW5jbHVkZSAiYXJyYXlzX2phdmEuaSIKICAgICAgICAgICAgICAgICVhcHBseSBpbnRbXSB7aW50Kn07CiAgICAgICAgICAgICAgICB2b2lkIGZvbyhpbnQgKmEpOwoKMTIvMDUvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIERpcmVjdG9yIG1vZHMgY29udHJpYnV0ZWQgYnkgU2NvdHQgTWljaGVsLiBOZXcgdHlwZW1hcHMKICAgICAgICAgICAgZGlyZWN0b3JkaXNjb25uZWN0IGFuZCBkaXJlY3RvcmRpc2Nvbm5lY3RfZGVyaXZlZCBmb3IgdGhlIAogICAgICAgICAgICBzd2lnRGlyZWN0b3JEaXNjb25uZWN0KCkgbWV0aG9kLiBBbHNvIGZpeCB0byBnZXQgdGhlIGphdmFwYWNrYWdlCiAgICAgICAgICAgIHR5cGVtYXAgd29ya2luZyBhZ2Fpbi4KCjEyLzA1LzIwMDQ6IG1tYXR1cwoJICAgIC0gRmluaXNoaW5nIHRoZSBmaXhlcyBmb3IgdGVtcGxhdGVzICsgZGVmYXVsdCB0ZW1wbGF0ZQoJICAgICAgYXJncyArIHNwZWNpYWxpemF0aW9ucy4KCiAgICAgICAgICAgIC0gW1B5dGhvbl0gTm93IHdlIHVzZSB0aGUgbmV3IHRlbXBsYXRlcyArIGRlZmF1bHQgdGVtcGxhdGUKCSAgICAgIGFyZ3MgaW4gdGhlIHN0ZC9TVEwgbGlicmFyeS4gVGhhdCBtZWFucyB0aGUgaW50ZXJuYWwKCSAgICAgIHN3aWcgZmlsZXMgYXJlIGdldHRpbmcgdWdsaWVyIHNpbmNlIHdlIG5vdyBzdXBwb3J0IHRoZQoJICAgICAgb3JpZ2luYWwgZGVjbGFyYXRpb25zOgoKCSAgICAgICAgdGVtcGxhdGU8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2MgPSBzdGQ6OmFsbG9jYXRvcjwgX1RwID4gPgoJCWNsYXNzIHZlY3RvciB7CgkJLi4uLgoJCX07CgkgICAgICAJICAgICAKICAgICAgICAgICAgICAgIHRlbXBsYXRlPGNsYXNzIF9LZXksIGNsYXNzIF9UcCwgY2xhc3MgX0NvbXBhcmUgPSBzdGQ6Omxlc3M8X0tleSA+LAoJICAgICAgICBjbGFzcyBfQWxsb2MgPSBzdGQ6OmFsbG9jYXRvcjxzdGQ6OnBhaXI8Y29uc3QgX0tleSwgX1RwID4gPiA+CiAgICAgICAgICAgICAgICBjbGFzcyBtYXAgewoJCS4uLi4KCQl9OwogCiAgICAgICAgICAgICAgYW5kIHRoZSB1c2VyIGNhbiB1c2UgdGhlICV0ZW1wbGF0ZSBkaXJlY3RpdmUgYXMKCgkgICAgICAgICV0ZW1wbGF0ZSgpIHN0ZDo6dmVjdG9yPGludD47CgkgICAgICAgICV0ZW1wbGF0ZSgpIHN0ZDo6dmVjdG9yPGludCwgc3RkOjphbGxvY2F0b3I8aW50PiA+OwoJICAgICAgICAldGVtcGxhdGUoKSBzdGQ6OnZlY3RvcjxpbnQsIE15QWxsb2NhdG9yPGludD4gPjsKCiAgICAgICAgICAgICAgTm93IHdlIGFyZSBjbG9zZXIgdG8gdGhlIGNsZWFuaW5nL3Jld3JpdGluZyBvZiB0aGUKCSAgICAgIHB5dGhvbiBzdGQvU1RMIHN1cHBvcnQsIHN1Y2ggdGhhdCB3ZSByZWNvdmVyIHN1cHBvcnQgZm9yCgkgICAgICBNU1ZDKysgNi4wLCBhbmQgd2UgY2FuIGFkZCBzdXBwb3J0IGZvciBvdGhlciBsYW5ndWFnZXMKCSAgICAgIHRvby4KCgoxMi8wMi8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gRml4IGZvciBkaXJlY3RvcnMgd2hlbiB3cmFwcGluZyBtZXRob2RzIHVzaW5nIGEgbWVtYmVyIGVudW0KICAgICAgICAgICAgYW5kIHR5cGVzYWZlL3Byb3BlciBlbnVtcyBlbmFibGVkLgoKMTIvMDEvMjAwNDogbW1hdHVzCgkgICAgLSBGaXggdHlwZW1hcHMgdG8gd29yayB3aXRoIHRlbXBsYXRlcyBhbmQgZGVmYXVsdCB0ZW1wbGF0ZQoJICAgICAgYXJncywgaWUKCgkgICAgICAgdGVtcGxhdGUgPGNsYXNzIEEsIGNsYXNzIEIgPSBpbnQ+CiAgICAgICAgICAgICAgIHN0cnVjdCBGb28gewoJICAgICAgIH07CgoJICAgICAgICV0eXBlbWFwKGluKSBGb288aW50PiAqey4uLn0KCSAgICAgICAldHlwZW1hcChvdXQpIEZvbzxpbnQsaW50PiAqey4uLn0KCgkgICAgICAgRm9vPGludD4gKiBmb28oIEZvbzxpbnQ+ICpmMSwgRm9vPGludCxpbnQ+ICpmMik7CgoJICAgICAgbm93ICdmMScsICdmMicgYW5kIHRoZSByZXR1cm4gdmFsdWUgcmVzb2x2ZSB0aGUgcHJvdmlkZWQKCSAgICAgIHR5cGVtYXBzIHByb3Blcmx5LgoKCSAgICAgIFRoaXMgaXMgaGlnaGx5IG5lZWRlZCBmb3IgcHJvcGVyIFNUTCBzdXBwb3J0LCBzZWUgbmV3IAoJICAgICAgc3RkX2Jhc2ljX3N0cmluZy5pLCBzdGRfc3N0cmVhbS5pLCBldGMuCgoJICAgIC0gQWRkZWQgc3RkX3NzdHJlYW0uaSwgYW5kIGZpeCBzdGRfYmFzaWNfc3RyaW5nLmkgdG8gdXNlCgkgICAgICB0aGUgbmV3IHR5cGVtYXBzICsgdGVtcGxhdGUgZGVmLiBhcmcgbWVjaGFuaXNtLiBBbHNvLAoJICAgICAgYWRkZWQgdGhlIG5lZWRlZCBzdGRfYWxsb2MuaS4gTm93LCBhbGwgdGhlIGNvbnRhaW5lcnMKCSAgICAgIGNhbiBiZSBtb2RpZmllZCB0byBzdXBwb3J0IHN0ZDo6YWxsb2NhdG9yLCBsaWtlIGluOgoJICAgICAgCgkgICAgICAgIHRlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIEEgPSBzdGQ6OmFsbG9jYXRvcjxUID4gPgoJCWNsYXNzIHZlY3RvciB7CgkJcHVibGljOgoJCS4uLi4KCQl9OwoJICAgICAgCgkgICAgICBUaGlzIGNoYW5nZSBpcyBvbmx5IGNvbXBsZXRlZCBieSBub3cgZm9yIGJhc2ljX3N0cmluZy4KCgkgICAgLSBGaXggZm9yIHNtYXJ0IHBvaW50ZXJzICsgbWVtYmVycyArIGV4dGVuc2lvbnM6CgoJICAgICAgJWV4dGVuZCBGb28gewoJICAgICAgICBpbnQgZXh0ZW5zaW9uKGludCBpLCBpbnQgaikgeyByZXR1cm4gaTsgfQoJCWludCBleHRlbnNpb24oKSB7IHJldHVybiAxOyB9CgkgICAgICB9CgoJICAgICAgJWlubGluZSAlewoKCSAgICAgIGNsYXNzIEZvbyB7CgkgICAgICBwdWJsaWM6CgkJaW50IHk7CgkJc3RhdGljIGNvbnN0IGludCB6OwoJICAgICAgfTsKICAKCSAgICAgIGNsYXNzIEJhciB7CgkgICAgICAgIEZvbyAqZjsKCSAgICAgIHB1YmxpYzoKCSAgICAgICAgQmFyKEZvbyAqZikgOiBmKGYpIHsgfQoJCUZvbyAqb3BlcmF0b3ItPigpIHsKCQkgIHJldHVybiBmOwoJCX0KCSAgICAgIH07CgoJICAgICAgbm93IHlvdSBjYW4gCgkgICAgIAoJICAgICAgZiA9IEZvbygpCgkgICAgICBmLnkgPSAzCgkgICAgICBhID0gZi56CgkgICAgICBmLT5leHRlbnNpb24oKQogCgkgICAgICBiID0gQmFyKGYpCgkgICAgICBiLnkgPSAzCgkgICAgICBhID0gYi56CgkgICAgICBiLT5leHRlbnNpb24oKQoKCSAgICAtIE90aGVyIHNtYWxsIGVycm9ycyBmaXhlcywgbW9zdGx5IHB5dGhvbi4KCjExLzI1LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBOdW1lcm91cyBkaXJlY3RvciBidWcgZml4ZXMgc28gdGhhdCB0aGUgY29ycmVjdCBqYXZhIHR5cGVzCiAgICAgICAgICAgIGFuZCBjYW5vbmljYWxpemVkIHR5cGVzIGluIHRoZSBKTkkgY29kZSBhcmUgZW1pdHRlZC4gVXNlIG9mIHRoZQogICAgICAgICAgICAkamF2YWNsYXNzbmFtZSBzcGVjaWFsIHZhcmlhYmxlcyBpbiB0aGUgZGlyZWN0b3IgdHlwZW1hcHMgbm93CiAgICAgICAgICAgIGNvbnNpc3RlbnQgd2l0aCB0aGUgbm9uLWRpcmVjdG9yIHR5cGVtYXBzLiBUaGUgdHlwZXMgdXNlZCBmb3IgCiAgICAgICAgICAgIHR5cGVtYXAgbG9va3VwcyBhcmUgYWxzbyBjb3JyZWN0ZWQgaW4gYSBmZXcgcGxhY2VzLiBJZiB5b3UgCiAgICAgICAgICAgIHByZXZpb3VzbHkgaGFkIHlvdXIgb3duIGRpcmVjdG9yIHR5cGVtYXBzLCBlbnN1cmUgdGhleSBhcmUgdXNpbmcgdGhlCiAgICAgICAgICAgIGNvcnJlY3QgQysrIHR5cGUuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgSkFWQSBESVJFQ1RPUlMgKioqCgoxMS8yNS8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBjb25zdCBlbnVtIFNXSUdUWVBFICYgdHlwZW1hcHMgYWRkZWQuIFRoZXNlIHdyYXAgY29uc3QgZW51bSByZWZlcmVuY2VzCiAgICAgICAgICAgIGFzIGlmIHRoZXkgd2VyZSBwYXNzZWQgYnkgdmFsdWUuIENvbnN0IGVudW0gcmVmZXJlbmNlcyB0aHVzIHdvcmsgdGhlCiAgICAgICAgICAgIHNhbWUgYXMgY29uc3QgcmVmZXJlbmNlIHByaW1pdGl2ZSB0eXBlcyBzdWNoIGFzIGNvbnN0IGRvdWJsZSAmLCAKICAgICAgICAgICAgY29uc3QgaW50ICYgZXRjLiBUeXBlbWFwcyBhZGRlZCBmb3IgSmF2YSwgQyMsIFJ1YnksIFRjbCwgUGVybCBhbmQgUGlrZS4KCjExLzI1LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhLCBDI10gTmV3IHNwZWNpYWwgdmFyaWFibGU6ICQqamF2YWNsYXNzbmFtZSwgc2ltaWxhciB0byAkamF2YWNsYXNzbmFtZQogICAgICAgICAgICBhbmQgJCZqYXZhY2xhc3NuYW1lLiBUaGUgbmV3IG9uZSByZW1vdmVzIGEgcG9pbnRlciBmcm9tIHRoZSBDIHR5cGUgYmVmb3JlCiAgICAgICAgICAgIG9idGFpbmluZyB0aGUgSmF2YSBjbGFzcyBuYW1lLiBPbmUgb3IgbW9yZSBvZiAkamF2YWNsYXNzbmFtZSwKICAgICAgICAgICAgJCZqYXZhY2xhc3NuYW1lIG9yICQqamF2YWNsYXNzbmFtZSBtYXkgbm93IGFwcGVhciBpbiBhIHR5cGVtYXAuIExpa2V3aXNlIGZvcgogICAgICAgICAgICBDIyB1c2luZyBjc2NsYXNzbmFtZSBpbnN0ZWFkIG9mIGphdmFjbGFzc25hbWUuCgoxMS8yNS8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBUaGUgbGFzdCB2ZXN0aWdlcyBvZiBlbnVtcyBiZWluZyBoYW5kbGVkIGFzIGludGVnZXJzIHJlbW92ZWQgZnJvbSB0aGUKICAgICAgICAgICAgaW50ZXJuYWxzLiBUaGUgd3JhcHBlciBtZXRob2RzIHVzZSB0aGUgZW51bSB0eXBlIHJhdGhlciB0aGFuIGFuIGludAogICAgICAgICAgICBub3cuIFRoZSBuZXQgcmVzdWx0IGlzIGFkZGVkIHR5cGUgc2FmZXR5IGZvciBlbnVtcyB3aGVuIGhhbmRsZWQgYXMKICAgICAgICAgICAgcG9pbnRlcnMsIHJlZmVyZW5jZXMgZXRjLiBQcmV2aW91c2x5IGluIHNpdHVhdGlvbnMgc3VjaCBhcyBhIG1ldGhvZAogICAgICAgICAgICB0YWtpbmcgYSBwb2ludGVyIHRvIGFuIGVudW0sIGEgcG9pbnRlciB0byBhbiBpbnQgb3IgYSBwb2ludGVyIHRvIGFuCiAgICAgICAgICAgIGVudW0gb2Ygc29tZSBvdGhlciB0eXBlIGNvdWxkIGluYWR2ZXJ0YW50bHkgYmUgcGFzc2VkIHRvIHRoZSBtZXRob2QuCiAgICAgICAgICAgIFRoaXMgaXMgbm93IGZpeGVkIGFzIHRoZSBkZXNjcmlwdG9yIGZvciBhbiBlbnVtIGlzIG5vIGxvbmdlciBiYXNlZCBvbgogICAgICAgICAgICBhbiBpbnQsIGJ1dCB0aGUgZW51bSB0eXBlIGluc3RlYWQuIEFub255bW91cyBlbnVtcyBhcmUgc3RpbGwgaGFuZGxlZAogICAgICAgICAgICBhcyBpbnRlZ2Vycy4KCiAgICAgICAgICAgIFRoZSBjb25zZXF1ZW5jZSBmb3Igc2NyaXB0aW5nIGxhbmd1YWdlIHVzZXJzIGluIGNvcnJlY3QgdXNhZ2Ugb2YgZW51bXMKICAgICAgICAgICAgc2hvdWxkIG5vdCBiZSBub3RpY2VhYmxlLiBUaGVyZSBpcyBubyBjaGFuZ2UgZm9yIGFueSBvZiB0aGUgbGFuZ3VhZ2VzCiAgICAgICAgICAgIHdoZXJlIGVudW1zIGFyZSBwYXNzZWQgYnkgdmFsdWUgLSBtb3N0IG9mIHRoZSBzY3JpcHRpbmcgbGFuZ3VhZ2VzIHdpbGwKICAgICAgICAgICAgc3RpbGwgYWNjZXB0IGFuIGludGVnZXIgZm9yIGFuIGVudW0gdmFsdWUgYW5kIHRoZSBzdHJvbmdseSB0eXBlZAogICAgICAgICAgICBsYW5ndWFnZXMgc3RpbGwgdXNlIGVpdGhlciB0eXBlc2FmZSBlbnVtcywgaW50ZWdlcnMgb3IgcHJvcGVyIGVudW1zCiAgICAgICAgICAgIGRlcGVuZGluZyBvbiB3aGF0IHRoZSB1c2VyIGNvbmZpZ3VyZXMuIEZvciBKYXZhIGFuZCBDIyB1c2VycyBhIGNoYW5nZQogICAgICAgICAgICBpbiB0aGUgdHlwZXdyYXBwZXIgY2xhc3MgbmFtZSBoYXMgb2NjdXJyZWQgKGZvciBlbnVtIHBvaW50ZXJzLAogICAgICAgICAgICByZWZlcmVuY2VzIGV0YykuIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICBlbnVtIE51bWJlcnMgeyBvbmU9MSwgdHdvIH07CiAgICAgICAgICAgICAgZW51bSBOdW1iZXJzKiBudW1iZXIoKTsKCiAgICAgICAgICAgIEluIEphdmEgYW5kIEMjIHRoaXMgbXVzdCBub3cgYmUgY29kZWQgYXMKCiAgICAgICAgICAgICAgU1dJR1RZUEVfcF9OdW1iZXJzIG4gPSBtb2R1bGVuYW1lLm51bWJlcigpOwoKICAgICAgICAgICAgcmF0aGVyIHRoYW4KCiAgICAgICAgICAgICAgU1dJR1RZUEVfcF9pbnQgbiA9IG1vZHVsZW5hbWUubnVtYmVyKCk7CgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjExLzIxLzIwMDQ6IHdzZnVsdG9uL21tYXR1cwogICAgICAgICAgICBBZGRlZCBtaXNzaW5nIGRlcHJlY2F0ZWQgd2FybmluZyBmb3IgJW5hbWUgYW5kIHJlbW92ZSByZW1haW5pbmcgJW5hbWUKICAgICAgICAgICAgdXNhZ2UgaW4gdGhlIFNXSUcgbGlicmFyaWVzLgoKMTEvMjEvMDQ6IG1tYXR1cwoJICAgIC0gW1B5dGhvbl0gQWRkaW5nIHRoZSBQeVN3aWdPYmplY3QgdG8gYmUgdXNlZCBmb3IgY2FycnlpbmcKCSAgICAgIHRoZSBpbnN0YW5jZSBDL0MrKyBwb2ludGVycy4gVGhpcyBpcyB1c2VkIGluc3RlYWQgb2YKCSAgICAgIHN0cmluZyBhbmQgUHlDT2JqZWN0cy4KCgkgICAgICBUaGUgbmV3IFB5U3dpZ09iamVjdCBpcyBldmVuIHNhZmVyIHRoYW4gUHlDT2JqZWN0LCBhbmQKCSAgICAgIG1vcmUgZnJpZW5kbHkgdGhhbiBwbGFpbiBzdHJpbmdzOgoKCSAgICAgIG5vdyB5b3UgY2FuIGRvCgoJICAgICAgICBwcmludCBhLnRoaXMKCQk8U3dpZyBPYmplY3QgYXQgXzAwNjkxNjA4X3BfQT4KCgkJcHJpbnQgc3RyKGEudGhpcykKCQlfMDA2OTE2MDhfcF9BCgoJCXByaW50IGxvbmcoYS50aGlzKQoJCTEzNTY4NjQwMAoKCQlwcmludCAiJXMgMHgleCIgJSAoYS50aGlzLCBhLnRoaXMpCgkJXzAwNjkxNjA4X3BfQSAweDgxNjY5MDAKCgkgICAgICB0aGUgbGFzdCBvbmUgaXMgdmVyeSB1c2VmdWwgd2hlbiBkZWJ1Z2dpbmcgdGhlIEMvQysrCgkgICAgICBzaWRlLCBzaW5jZSBpcyB0aGUgcG9pbnRlciB2YWx1ZSB5b3Ugd2lsbCB1c3VhbGx5IGdldAoJICAgICAgZnJvbSB0aGUgZGVidWdnZXIuCgoJICAgICAgQWxzbywgaWYgeW91IGhhdmUgc29tZSBvbGQgY29kZSB0aGF0IHVzZXMgdGhlIHN0cmluZwoJICAgICAgcmVwcmVzZW50YXRpb24gIl8wMDY5MTYwOF9wX0EiLCB5b3UgY2FuIHVzZSBpdCBub3cgYWdhaW4KCSAgICAgIHVzaW5nICdzdHIocHRyKScsIG9yIGJ5IGNhbGxpbmcgJ3N0ciA9IFB5T2JqZWN0X1N0cihvYmopJwoJICAgICAgaW4gdGhlIEMvQysrIHNpZGUuCiAKCSAgICAgIFRoaXMgY2hhbmdlIGlzIG1haW5seSBmb3Igbm9zdGFsZ2ljIHN3aWcgdXNlcnMgdGhhdCBtaXNzCgkgICAgICB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uLCBidXQgYWxzbyBhbGxvd3MgdG8gc2F5IGFnYWluCgoJICAgICAgICBpZiBhLnRoaXMgPT0gYi50aGlzOgoJCSAgcmV0dXJuICJhIGlzIGIiCgoJICAgICAgYW5kIHdlbGwsIHNpbmNlIHRoZSBjaGFuZ2Ugd2VyZSByZWFsbHkgc2ltcGxlLCBtYXliZSBpbgoJICAgICAgdGhlIGZ1dHVyZSB3ZSB3aWxsIGJlIGFibGUgdG8gZG8KICAgCgkJbmV4dCA9IGEudGhpcyArIDEKCgkgICAgICBvciBhZGQgbmF0aXZlIHB5dGhvbiBpdGVyYXRpb24gb3ZlciBuYXRpdmUgQy9DKysgYXJyYXlzLAoJICAgICAgaWUsIG5vIG5lZWQgdG8gY3JlYXRlL2NvcHkgbmV3IHR1cGxlcyB3aGVuIHJldHVybmluZyBhbmQKCSAgICAgIGFycmF5IG9yIHZlY3Rvci4KCgkgICAgICBBbHNvLCBhIFB5U3dpZ1BhY2tlZCBvYmplY3Qgd2FzIGFkZGluZyB0byBjYXJyeSBhIG1lbWJlcgoJICAgICAgbWV0aG9kIHBvaW50ZXIsIGJ1dCB0aGlzIGlzIHByb2JhYmx5IGEgdGVtcG9yYWwgc29sdXRpb24KCSAgICAgIHVudGlsIGEgbW9yZSBnZW5lcmFsIG9iamVjdCBmb3IgbWV0aG9kcyBpcyBhZGRlZC4KCgkgICAgICBCZSBhd2FyZSB0aGF0IHRvIHNpbXBsaWZ5IG1haW50YWluaW5nIGFuZCBjb21wYXRpYmlsaXR5CgkgICAgICB3aXRoIG90aGVyIHRvb2xzLCB0aGUgb2xkIHN0cmluZyBhbmQgUHlDT2JqZWN0cwoJICAgICAgcmVwcmVzZW50YXRpb24gY291bGQgZGlzYXBwZWFyIHZlcnkgc29vbiwgYW5kIHRoZQoJICAgICAgU1dJR19DT0JKRUNUU19UWVBFUyBvciBTV0lHX05PX09CSkVDVF9UWVBFUyBtYWNyb3Mgd2lsbAoJICAgICAgaGF2ZSBubyBlZmZlY3QgYXQgY29tcGlsYXRpb24gdGltZS4gU3RpbGwsIHRoZSB0aHJlZQoJICAgICAgbWVjaGFuaXNtcyBhcmUgcHJlc2VudCBpbiB0aGUgY29kZSBqdXN0IGZvciB0ZXN0aW5nLAoJICAgICAgZGVidWdnaW5nIGFuZCBjb21wYXJpc29uIHB1cnBvc2VzLgoJICAgICAgCjExLzIxLzA0OiBtbWF0dXMKCgkgICAgLSBbUHl0aG9uXSBBZGRpbmcgYmFjayBzdXBwb3J0IGZvciB1c2luZyB0aGUgc3dpZyBydW50aW1lIGNvZGUKCSAgICAgIGluc2lkZSB0aGUgdXNlciBjb2RlLiBXZSBqdXN0IGFsbG93IHRoZSB1c2VyIHRvIGluY2x1ZGUKCSAgICAgIHRoZSBtaW5pbWFsIGNvZGUgbmVlZGVkIHRvIGltcGxlbWVudCB0aGUgcnVudGltZQoJICAgICAgbWVjaGFuaXNtIHN0YXRpY2FsbHksIGp1c3QgYXMgaW4gZG9uZSBpbiB0aGUgc3dpZwoJICAgICAgbW9kdWxlcy4KCSAgICAgIAoJICAgICAgVG8gdXNlIHRoZSBzd2lnIHJ1bnRpbWUgY29kZSwgZm9yIGV4YW1wbGUgd2l0aCBweXRob24sCgkgICAgICB0aGUgdXNlciBuZWVkcyBpbmNsdWRlIHRoZSBmb2xsb3dpbmc6CiAKICAgICAgICAgICAgICAgI2luY2x1ZGUgPFB5dGhvbi5oPiAgICAgICAgIC8vIG9yIHVzaW5nIHlvdXIgZmF2b3JpdGUgbGFuZ3VhZ2UKICAgICAgICAgICAgICAgI2luY2x1ZGUgPHN3aWdydW4uc3dnPgogICAgICAgICAgICAgICAjaW5jbHVkZSA8cHl0aG9uL3B5cnVuLnN3Zz4gLy8gb3IgdXNpbmcgeW91ciBmYXZvcml0ZSBsYW5ndWFnZQogICAgICAgICAgICAgICAjaW5jbHVkZSA8cnVudGltZS5zd2c+CgoJICAgICAgdGhlIGZpbGVzIHN3aWdydW4uc3dnLCBweXJ1bi5zd2cgYW5kIHJ1bnRpbWUuc3dnIGNhbiAKCSAgICAgIGJlIGNoZWNrZWQgb3V0IGJ5IHVzaW5nIHN3aWcgLWNvLCBvciB0aGV5IGNhbiBzaW1wbHkgCgkgICAgICBiZSBmb3VuZCBieSBhZGRpbmcgdGhlIHN3aWcgbGliIGRpcmVjdG9yeSB0byB0aGUKCSAgICAgIGNvbXBpbGVyIGluY2x1ZGUgZGlyZWN0b3J5IGxpc3QsIGZvciBleGFtcGxlCgoJICAgICAgIFNXSUdMSUI9YHN3aWcgLXN3aWdsaWJgCgkgICAgICAgYysrIC1JJHtTV0lHTElCfSAuLgoKCSAgICAgIG9mIGJldHRlciwgdXNpbmcgdGhlIENQUEZMQUdTLCBidXQgdGhhdCBkZXBlbmRzIG9uIHlvdXIKCSAgICAgIGVudmlyb25tZW50LgoJICAgICAgIAoJICAgICAgVGhpcyBjaGFuZ2UgY2FuIGJlIHBvcnRlZCB0byB0aGUgb3RoZXIgbGFuZ3VhZ2VzIHRvbywKCSAgICAgIHlvdSBqdXN0IG5lZWQgdG8gaXNvbGF0ZSB0aGUgbmVlZGVkIHJ1bnRpbWUgY29kZSBpbgoJICAgICAgYSBzaW5nbGUgZmlsZSBsaWtlICdweXJ1bi5zd2cnLCBhbmQgcHJvdmlkZSB0aGUgCgkgICAgICBTV0lHX1J1bnRpbWVfR2V0VHlwZUxpc3QoKSBtZXRob2QuIExvb2sgYXQgdGhlCgkgICAgICBMaWIvcHl0aG9uL3B5cnVuLnN3ZyBmaWxlIGFuZCB0aGUgRXhhbXBsZXMvcHl0aG9uL3N3aWdydW4KCSAgICAgIGV4YW1wbGUuCgoxMS8xNS8wNDogbW1hdHVzCgkgICAgLSBGaXggbWl4ZWRfdHlwZXMuaSArIGdjYy0zLjQsIGllLCBhcnJheXMgKyByZWZlcmVuY2VzICsKCSAgICAgIHR5cGVkZWZzCgoJICAgIC0gRml4IG11bHRpZGltIGFycmF5cyArIHR5cGVkZWZzLGllCgoJICAgICAgIHR5cGVkZWYgY2hhciBjaGFyYWN0ZXJbMV07CgkgICAgICAgdHlwZWRlZiBjaGFyYWN0ZXIgd29yZFs2NF07CgoJICAgIC0gUHJvY2VzcyBwcm90ZWN0ZWQvcHJpdmF0ZSBiYXNlcyBpbiB0aGUgc2FtZSB3YXkgYmVmb3JlCgkgICAgICB3ZSBwcm9jZXNzIHByb3RlY3RlZC9wcml2YXRlIG1lbWJlcnMsIGllLCB3ZSBjaGVjawoJICAgICAgZm9yIGNvbnN0cnVjdG9ycywgb3BlcmF0b3IgbmV3LCB2aXJ0dWFsIG1lbWJlcnMsIGV0Yy4KICAgCgkgICAgLSBGaXggUnVieS9KYXZhIHRvIHdvcmsgKG9yIGlnbm9yZSkgbXVsdGktaW5oZXJpdGFuY2UgKwogICAgICAgICAgICAgIGRpcmVjdG9ycy4gQWxsb3cgb3RoZXIgbGFuZ3VhZ2VzIHRvIGRlZmluZSBpZiBpdCBpcwogICAgICAgICAgICAgIHN1cHBvcnRlZCBvciBub3QuCgkgICAgCgkgICAgLSBOb3cgeW91IGNhbiBydW4KCiAgICAgICAgICAgICAgICBTV0lHX0ZFQVRVUkVTPSItZGlyZWN0b3JzIC1kaXJwcm90IiAKICAgICAgICAgICAgICAgIG1ha2UgY2hlY2stcnVieS10ZXN0LXN1aXRlCiAgICAgICAgICAgICAgICBtYWtlIGNoZWNrLXB5dGhvbi10ZXN0LXN1aXRlCiAgICAgICAgICAgICAgICBtYWtlIGNoZWNrLWphdmEtdGVzdC1zdWl0ZQogICAgICAgICAgICAgICAgbWFrZSBjaGVjay1vY2FtbC10ZXN0LXN1aXRlCgoJICAgICAgYW5kIHlvdSB3aWxsIGdldCBvbmx5ICdyZWFsJyBlcnJvcnMuIHJ1YnkgYW5kIHB5dGhvbgoJICAgICAgY29tcGlsZSB3aXRoIG5vIGVycm9ycywgamF2YSBzaG93cyBzb21lIHByb2JsZW1zLgkKClZlcnNpb24gMS4zLjIzIChOb3ZlbWJlciAxMSwgMjAwNCkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMTEvMDUvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgUGF0Y2ggIzk4Mjc1MyBmcm9tIEZhYnJpY2UgU2FsdmFpcmU6IEFkZHMgZGVwZW5kZW5jaWVzIGdlbmVyYXRpb24gZm9yCiAgICAgICAgICAgIGNvbnN0cnVjdGluZyBtYWtlZmlsZXMuIE5ldyBjb21tYW5kIGxpbmUgb3B0aW9ucyAtTUYgLU1EIC1NTUQgdG8gd29yawogICAgICAgICAgICB3aXRoIHRoZSBjdXJyZW50IG9wdGlvbnMgLU0gYW5kIC1NTS4gVGhlc2Ugb3B0aW9ucyBhcmUgbmFtZWQgdGhlIHNhbWUKICAgICAgICAgICAgYW5kIHdvcmsgdGhlIHNhbWUgYXMgaW4gZ2NjLgoKMTEvMDUvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgJWlnbm9yZS8lcmVuYW1lIGNoYW5nZXMgZm9yIG1ldGhvZHMgd2l0aCBkZWZhdWx0IGFyZ3VtZW50cyB0byBtaXJyb3IKICAgICAgICAgICAgJWZlYXR1cmUgYmVoYXZpb3VyLiBTZWUgcHJldmlvdXMgZW50cnkuCgogICAgICAgICAgICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoxMS8wNC8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICAlZmVhdHVyZSBpbXByb3ZlbWVudHMgZm9yIGZpbmUgdHVuaW5nIHdoZW4gd3JhcHBpbmcgbWV0aG9kcyB3aXRoCiAgICAgICAgICAgIGRlZmF1bHQgYXJndW1lbnRzLiBBbnkgJWZlYXR1cmUgdGFyZ2V0aW5nIGEgbWV0aG9kIHdpdGggZGVmYXVsdCBhcmd1bWVudHMKICAgICAgICAgICAgd2lsbCBhcHBseSB0byBhbGwgdGhlIGV4dHJhIG92ZXJsb2FkZWQgbWV0aG9kcyB0aGF0IFNXSUcgZ2VuZXJhdGVzIGlmIHRoZQogICAgICAgICAgICBkZWZhdWx0IGFyZ3VtZW50cyBhcmUgc3BlY2lmaWVkIGluIHRoZSBmZWF0dXJlLiBJZiB0aGUgZGVmYXVsdCBhcmd1bWVudHMgYXJlCiAgICAgICAgICAgIG5vdCBzcGVjaWZpZWQgaW4gdGhlIGZlYXR1cmUsIHRoZW4gdGhlIGZlYXR1cmUgd2lsbCBtYXRjaCB0aGF0IGV4YWN0CiAgICAgICAgICAgIHdyYXBwZXIgbWV0aG9kIG9ubHkgYW5kIG5vdCB0aGUgZXh0cmEgb3ZlcmxvYWRlZCBtZXRob2RzIHRoYXQgU1dJRyBnZW5lcmF0ZXMuCiAgICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAlZmVhdHVyZSgiZXhjZXB0Iikgdm9pZCBoZWxsbyhpbnQgaT0wLCBkb3VibGUgZD0wLjApOwogICAgICAgICAgICAgIHZvaWQgaGVsbG8oaW50IGk9MCwgZG91YmxlIGQ9MC4wKTsKCiAgICAgICAgICAgd2lsbCBhcHBseSB0aGUgZmVhdHVyZSB0byBhbGwgdGhyZWUgd3JhcHBlciBtZXRob2RzLCB0aGF0IGlzOgoKICAgICAgICAgICAgICB2b2lkIGhlbGxvKGludCBpLCBkb3VibGUgZCk7CiAgICAgICAgICAgICAgdm9pZCBoZWxsbyhpbnQgaSk7CiAgICAgICAgICAgICAgdm9pZCBoZWxsbygpOwoKICAgICAgICAgICBJZiB0aGUgZGVmYXVsdCBhcmd1bWVudHMgYXJlIG5vdCBzcGVjaWZpZWQgaW4gdGhlIGZlYXR1cmU6CgogICAgICAgICAgICAgICVmZWF0dXJlKCJleGNlcHQiKSB2b2lkIGhlbGxvKGludCBpLCBkb3VibGUgZCk7CiAgICAgICAgICAgICAgdm9pZCBoZWxsbyhpbnQgaT0wLCBkb3VibGUgZD0wLjApOwoKICAgICAgICAgICB0aGVuIHRoZSBmZWF0dXJlIHdpbGwgb25seSBhcHBseSB0byB0aGlzIHdyYXBwZXIgbWV0aG9kOgoKICAgICAgICAgICAgICB2b2lkIGhlbGxvKGludCBpLCBkb3VibGUgZCk7CgogICAgICAgICAgIGFuZCBub3QgdGhlc2Ugd3JhcHBlciBtZXRob2RzOgoKICAgICAgICAgICAgICB2b2lkIGhlbGxvKGludCBpKTsKICAgICAgICAgICAgICB2b2lkIGhlbGxvKCk7CgogICAgICAgICAgIFRoaXMgaGFzIGJlZW4gaW50cm9kdWNlZCB0byBtYWtlICVmZWF0dXJlIG1vcmUgcG93ZXJmdWwgdG8gZWFzZSB0aGUgbWlncmF0aW9uCiAgICAgICAgICAgdG8gbmV3IGRlZmF1bHQgYXJndW1lbnRzIHdyYXBwaW5nIGFwcHJvYWNoLgoKICAgICAgICAgICAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKICAgICAgICAgICBJZiB5b3UgcHJldmlvdXNseSBoYWQgYSAlZmVhdHVyZSBhbmQgZGlkbid0IHNwZWNpZnkgdGhlIGRlZmF1bHQgYXJndW1lbnRzLAogICAgICAgICAgIHlvdSB3aWxsIGhhdmUgdG8gYWRkIHRoZW0gaW4gbm93IG9yIHlvdSBjYW4gb2J0YWluIHRoZSBvcmlnaW5hbCBiZWhhdmlvdXIKICAgICAgICAgICBieSB1c2luZyAlZmVhdHVyZSgiY29tcGFjdGRlZmF1bHRhcmdzIikuCgoxMS8wNC8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIFR5cGVtYXBzIGZvciBzdGQ6OnZlY3RvciBhZGRlZCBpbnRvIHN0ZF92ZWN0b3IuaS4gVGhlIHByb3h5IGNsYXNzZXMKICAgICAgICAgICAgZ2VuZXJhdGVkIGFyZSBtb2RlbGxlZCBvbiB0aGUgLk5FVCBBcnJheUxpc3QgY2xhc3MuIFRoaXMgaXNuJ3QgcXVpdGUKICAgICAgICAgICAgcmVhZHkgZm9yIGdlbmVyYWwgY29uc3VtcHRpb24geWV0LCBidXQgd2lsbCB3b3JrIHdpdGggdmVjdG9ycyBvZiBwcmltaXRpdmUKICAgICAgICAgICAgdHlwZXMgYW5kIHNvbWUgY2xhc3Nlcy4KCjEwLzMvMjAwNDogd3V6emViIChKb2huIExlbnopCiAgICAgICAgICAgIFtHVUlMRV0gVGhlIC1zY20gaW50ZXJmYWNlIGlzIG5vdyB0aGUgZGVmYXVsdC4gIFRoZSBvbGQgR0ggaW50ZXJmYWNlIGNhbgoJICAgIHN0aWxsIGJlIGVuYWJsZWQgYnkgcGFzc2luZyAtZ2ggdG8gU1dJRy4KCjEwLzIvMjAwNDogbW1hdHVzCgoJICAgIC0gTW9yZSBmaXhlcyBmb3IgbmFtZXNwYWNlICsgY2xhc3MgZGVjbGFyYXRpb25zLgoJICAgICAgQXMgYW4gZXh0cmEgYm9udXMsIHdlIGdldCAldGVtcGxhdGUgc3VwcG9ydCBmb3Igc3RhdGljL21lbWJlcnMgY2xhc3MKCSAgICAgIG1ldGhvZHMsIGllLCBub3cgeW91IGNhbiBzYXk6CgoJICAgICAgICBuYW1lc3BhY2Ugc3BhY2UgewogICAgICAgICAgICAgICAgIHN0cnVjdCBBCQkJICAgIAoJICAgICAgICAgewkJCQkgICAgCgkgICAgICAgICAgIHRlbXBsYXRlIDxjbGFzcyBZPgkgICAgCgkgICAgICAgICAgIHN0YXRpYyB2b2lkIGZvb1QoWSB5KSB7IH0KCSAgICAgICAgIH07CQoJCX0JCQkgICAgCgkgICAgICAJICAgICAgCQkJICAgIAoJICAgICAgICBzdHJ1Y3QgQgkJCSAgICAKCSAgICAgICAgewkJCQkgICAgCgkgICAgICAgICAgdGVtcGxhdGUgPGNsYXNzIFk+CQkgICAgCgkgICAgICAgICAgdm9pZCBiYXJUKFkgeSkge30gCgkgICAgICAgIH07ICAgICAgICAgICAgICAgICAgICAgICAgICAgCgoJCSV0ZW1wbGF0ZShmb28pIHNwYWNlOjpBOjpmb29UPGRvdWJsZT47CgkJJXRlbXBsYXRlKGZvbykgc3BhY2U6OkE6OmZvb1Q8aW50PjsKCQkldGVtcGxhdGUoZm9vKSBzcGFjZTo6QTo6Zm9vVDxjaGFyPjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKCQkldGVtcGxhdGUoYmFyKSBCOjpiYXJUPGRvdWJsZT47CgkJJXRlbXBsYXRlKGJhcikgQjo6YmFyVDxpbnQ+OwoJCSV0ZW1wbGF0ZShiYXIpIEI6OmJhclQ8Y2hhcj47CgoJICAgICAgYW5kIGNhbGwKCgkgICAgICAgIEEuZm9vKDEpCgkJYiA9IEIoKQoJCWIuYmFyKDEpCgkgICAgICAKCSAgICAgIG5vdGUgdGhlIHRoZSBtZXRob2RzIGFyZSBlbWl0dGVkIGluc2lkZSB0aGUgY2xhc3NlcywKCSAgICAgIGFuZCBoZW5jZSwgdGhlICV0ZW1wbGF0ZSBuYW1lIHJlZmVycyB0byB0aGUgJ21lbWJlcicKCSAgICAgIG1ldGhvZCBuYW1lLCBub3QgYSBnbG9iYWwgbmFtZXNwYWNlIG5hbWUuCgoxMC8zMS8yMDA0OiBtbWF0dXMKCSAgICAtIFNvbHZlIG5hbWVzcGFjZSArIGNsYXNzIGRlY2xhcmF0aW9ucywgYXMgaW4KCgkgICAgICAgbmFtZXNwYWNlIGZvbyB7CiAgICAgICAgICAgICAgICAgc3RydWN0IEJhcjsKCQkgc3RydWN0IEZvbyB7CiAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgc3RydWN0IGZvbzo6QmFyIDogRm9vIHsKICAgICAgICAgICAgICAgfTsKCgkgICAgICAgc2VlIG5hbWVzcGFjZV9jbGFzcy5pIGZvciBtb3JlIGV4YW1wbGVzLgoKICAgICAgICAgICAgLSBGaXggJXRlbXBsYXRlIGRpcmVjdGl2ZSB0byBwcm9wZXJseSB1c2UgbmFtZXNwYWNlcywKICAgICAgICAgICAgICBpbmNsdWRpbmcgdGhlIGNhc2U6CgoJCSAgIG5hbWVzcGFjZSBvbmUKCQkgICB7CgkJICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgoJCSAgICAgICBzdHJ1Y3QgUHRyIHt9OwogICAgICAgICAgICAgICAgICAgfQoKCQkgICBuYW1lc3BhY2Ugb25lCgkJICAgewkJICAKCQkgICAgICAgc3RydWN0IE9iajEge307CgkJICAgICAgIHR5cGVkZWYgUHRyPE9iajE+IE9iajFfcHRyOwogIAkJICAgICAgICV0ZW1wbGF0ZShPYmoxX3B0cikgUHRyPE9iajE+OyAKCQkgICB9CQkJCSAgCgkJICAgCQkJCSAgCgkJICAgbmFtZXNwYWNlIHR3byAgCgkJICAgewoJCSAgICAgICBzdHJ1Y3QgT2JqMiB7fTsJCgkJICAgICAgIHR5cGVkZWYgb25lOjpQdHI8T2JqMj4gT2JqMl9wdHI7CgkJICAgICAgICV0ZW1wbGF0ZShPYmoyX3B0cikgb25lOjpQdHI8T2JqMj47CgkJICAgfQoKCSAgICAgIHRoaXMgaXMgZG9uZSBieSB1c2luZyB0aGUgbmFtZXNwYWNlIG5hbWUgJ29uZScgdG8gY3JlYXRlCiAgICAgICAgICAgICAgYSBuYW1lc3BhY2Ugbm9kZSB0byBlbWl0IHRoZSB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9uLAogICAgICAgICAgICAgIGp1c3QgYXMgYmVmb3JlLCBidXQgdGhlIHRlbXBsYXRlIHBhcmFtZXRlcnMgYXJlIHJlc29sdmVkCiAgICAgICAgICAgICAgYW5kIHF1YWxpZmllZCBpbiB0aGUgY3VycmVudCBuYW1lc3BhY2UgKCdvbmUnIG9yICd0d28nKS4KICAgICAgICAgICAgICBUaGlzIGlzIHNhbWUgd2F5IHRoYXQgdHlwZWRlZiB3b3Jrcy4gCgoJICAgICAgVGhpcyByZXNvbHZlIHRoZSBzbWFydF9wb2ludGVyX25hbWVzcGFjZTIuaSBjYXNlLCBhbmQgYXQKICAgICAgICAgICAgICB0aGUgc2FtZSB0aW1lLCBzZXZlcmFsIG90aGVyIG9uZXMgd2hlcmUgYmVmb3JlIHN3aWcgd2FzCiAgICAgICAgICAgICAgZ2VuZXJhdGluZyB0aGUKCgkgICAgICAgICJDYW4ndCBpbnN0YW50aWF0ZSB0ZW1wbGF0ZSAneHgnIGluc2lkZSBuYW1lc3BhY2UgJ3l5JyIKCSAgICAgIAoJICAgICAgZXJyb3IgbWVzc2FnZS4gSW4gZmFjdCwgdGhhdCBlcnJvciBkb2Vzbid0IGV4aXN0CgkgICAgICBhbnltb3JlLiBZb3UgY2FuIG9ubHkgZ2V0IGFuIGVycm9yIGlmIHlvdSB1c2UgYSBiYWQKCSAgICAgIG5hbWVzcGFjZSBuYW1lIG9yIHNvLgoKMTAvMzAvMjAwNDogbW1hdHVzCgkgICAgLSBbcnVieV0gRGlyZWN0b3JzIGZpeGVzOgoJICAgICAgLSBlbnVtcyBhbmQgc3RkOjpzdHJpbmdzIGFyZSB3b3JraW5nIG5vdyAoc2V2ZXJhbAoJICAgICAgICByZXBvcnRzIGluIGJ1ZyB0cmFjayBzeXN0ZW0pCgkgICAgICAtIGFkZGVkIHBhdGNoIDEwMjU4NjEgZm9yIGRpcmVjdG9yICsgZXhjZXB0aW9ucwoJCQogICAgICAgICAgICAgICoqKiBBdHRlbnRpb24gKioqOiBydWJ5IHdpdGggZGlyZWN0b3JzICsgcHJvdGVjdGVkCiAgICAgICAgICAgICAgbWVtYmVycyB3b3JrIHdpdGggdmVyc2lvbiAxLjcrLiBPbGRlciB2ZXJzaW9ucyBzZWVtcyB0bwogICAgICAgICAgICAgIGhhdmUgYSBicm9rZW4gc2lnbmF0dXJlIGZvcidyYl9wcm90ZWN0Jy4KCQkKCSAgICAgIElmIHlvdSBuZWVkIHRvIHVzZSBhbiBvbGQgdmVyc2lvbiwgbG9vayBhdAoKCSAgICAgIGh0dHA6Ly9leGNydWJ5LnNvdXJjZWZvcmdlLm5ldC9kb2NzL2h0bWwvcnVieV9faGFja3NfOGhwcC1zb3VyY2UuaHRtbAogIAkgICAgICBmb3Igd29ya2Fyb3VuZHMuCgkgICAgICAKICAgICAgICAgICAgLSBbcnVieV0gRml4IG1lbW9yeSBhbGxvY2F0aW9uIHByb2JsZW0gaW4gdHlwZW1hcCAoYnVnIDEwMzcyNTkpCgoJICAgIC0gW3RjbF0gRml4IChlbnVtc3xjb25zdGFudHMpICsgbmFtZXNwYWNlIG9wdGlvbiAKCSAgICAgICAgICAgIChyZXBvcnRlZCBieSBqYXNvbi5tLnN1cnByaXNlQGludGVsLmNvbSkuCgogICAgICAgICAgICAtIFtwZXJsXSBBZGQgcGF0Y2ggOTYyMTY4IGZvciBtdWx0aXBsZSBpbmhlcmV0YW5jZQoJICAgIAoJICAgIC0gRml4ICdkZWZpbmVkJyBhcyB2YXJpYWJsZSBuYW1lLgoKMTAvMjkvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgU2VnIGZhdWx0IGZpeCBmb3IgZ2xvYmFsIHNjb3BlIG9wZXJhdG9yIHVzZWQgZm9yIGZyaWVuZCBtZXRob2RzOgoKICAgICAgICAgICAgICBjbGFzcyBCIHsKICAgICAgICAgICAgICAgIGZyaWVuZCB2b2lkIDo6Z2xvYmFsc2NvcGUoKTsKICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgIH07CgoxMC8yOC8yMDA0Om1tYXR1cwoJICAgIC0gQWRkZWQgbW9kdWxlIGFuZCBzd2lnIG9wdGlvbiAidGVtcGxhdGVyZWR1Y2UiIHRvIGZvcmNlIHN3aWcKCSAgICAgIHRvIHJlZHVjZSBhbnkgdHlwZSBuZWVkZWQgd2l0aCB0ZW1wbGF0ZXMsIGllLCBpbiB0aGVzZSBjYXNlcwoKICAgICAgICAgICAgICAgICVtb2R1bGUoInRlbXBsYXRlcmVkdWNlIikgdGVzdAoKICAgICAgICAgICAgICAgIHRlbXBsYXRlIDxjbGFzcyBUPiBzdHJ1Y3QgQSB7IH07CgogICAgICAgICAgICAgICAgdHlwZWRlZiBpbnQgSW50OwoJICAgICAgICAldGVtcGxhdGUoQV9JbnQpIEE8SW50PiAgPT0+ICAldGVtcGxhdGUoQV9JbnQpIEE8aW50PgoKICAgICAgICAgICAgICAgIHR5cGVkZWYgQiogQnA7CgkgICAgICAgICV0ZW1wbGF0ZShBX0JwKSBBPEJwPiAgPT0+ICAldGVtcGxhdGUoQV9CcCkgQTxCKj4KCiAgICAgICAgICAgICAgc3dpZyByZWR1Y2VzIHRoZSB0eXBlcyBJbnQgYW5kIEJwIHRvIHRoZWlyIHByaW1pdGl2ZXMKICAgICAgICAgICAgICBpbnQgYW5kIEIqLiBUaGlzIGlzIGNsb3NlciB0byB0aGUgdXN1YWwgY29tcGlsZXIKICAgICAgICAgICAgICByZXNvbHV0aW9uIG1lY2hhbmlzbSwgYW5kIGl0IGlzIHJlYWxseSBuZWVkZWQgc29tZXRpbWVzCiAgICAgICAgICAgICAgd2hlbiB5b3UgbWl4IHRlbXBsYXRlcyArIHR5cGVkZWZzICsgc3BlY2lhbGl6YXRpb25zLgoKCSAgICAgIERvbid0IHVzZSBpdCBpZiB5b3UgZG9uJ3QgaGF2ZSBhbnkgcHJvYmxlbSBhbHJlYWR5LAoJICAgICAgc2luY2UgdGhlIHR5cGUgcmVkdWN0aW9uIGNhbiBpbnRlcmZlcmUgd2l0aCBzb21lCgkgICAgICB1c2VyIHR5cGVtYXBzLCBzcGVjaWFsbHkgaWYgeW91IGRlZmluZWQgc29tZXRoaW5nIGxpa2UKCgkJICAgdHlwZWRlZiBpbnQgSW50OwoJCSAgICV0eXBlbWFwKGluKSBJbnQgLi4uOwoKICAgICAgICAgICAgICBpbiB0aGlzIGNhc2UsIHdoZW4geW91IHVzZSB0aGUgInRlbXBsYXRlcmVkdWNlIiBvcHRpb24sCgkgICAgICBzd2lnIHdpbGwgaWdub3JlIHRoZSB1c2VyIHR5cGVtYXAsIHNpbmNlIHRoZSAidHlwZWRlZiBpbnQgSW50IgoJICAgICAgd2lsbCB0YWtlIHByZWNlZGVuY2UsIGFuZCB0aGUgdXN1YWwgImludCIgdHlwZW1hcCB3aWxsIGJlCgkgICAgICBhcHBsaWVkLiAKCgkgICAgICBOb3RlIHRoYXQgdGhlIHByZXZpb3VzIGNhc2UgaXMgbm90IGNvbW1vbiwgYW5kIHNob3VsZCBiZQoJICAgICAgYXZvaWRlZCwgaWUsIGlzIG5vdCByZWNvbW1lbmRlZCB0byB1c2UgYSB0eXBlZGVmIGFuZCBhCgkgICAgICB0eXBlbWFwIGF0IHRoZSBzYW1lIHRpbWUsIHNwZWNpYWxseSBpZiB5b3UgYXJlIGdvaW5nIHRvCgkgICAgICB1c2UgdGVtcGxhdGVzICsgc3BlY2lhbGl6YXRpb25zLgoKCSAgICAtIERpcmVjdG9yczoKCgkgICAgICAgIHZpcnR1YWwgZGVzdHJ1Y3RvciBpcyBhbHdheXMgZW1pdHRlZCBub3csIHRoaXMgZG9lc24ndAoJICAgICAgICBjYXVzZSBhbnkgaGFybSwgYW5kIGNvdWxkIHNvbHZlIHNvbWUgbmFzdHkgYW5kCgkgICAgICAgIG15c3RlcmlvdXMgZXJyb3JzLCBsaWtlIHRoZSBvbmUgbWVudGlvbmVkIGJ5IFNjb3R0LgoKCQlhbHNvIHRoZSBkZXN0cnVjdG9yIGlzIG5vdCBpbi1saW5lZCwgc28sIHRoYXQgY2FuIHNvbHZlCgkJc29tZSBvdGhlciBteXN0ZXJpb3VzIGVycm9ycyB3aGVuIG1peGluZyBkaXJlY3RvcnMgKwoJCWltcG9ydHMgKyBlbWJlZGRlZCBhcHBsaWNhdGlvbnMgKyBzb21lIHNwZWNpZmljIGNvbXBpbGVycy4KCQkKMTAvMjcvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSB0eXBlbWFwcy5pIGxpYnJhcnkgZmlsZSB3aXRoIElOUFVULCBPVVRQVVQgYW5kIElOT1VUIHR5cGVtYXBzIGFkZGVkLgoKMTAvMjcvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIHN0ZDo6d3N0cmluZyB0eXBlbWFwIGZpeGVzIGluIHN0ZF9zdHJpbmcuaSBmcm9tIFJ1c3NlbGwgS2VpdGgtTWFnZWUuCgoxMC8yNS8yMDA0OiBtbWF0dXMgCgoJICAgIC0gVXNpbmcgKyBuYW1lc3BhY2UgaXMgd29ya2luZyBub3cgKHVzaW5nX25hbWVzcGFjZS5pKS4KCgkgICAgLSBEZXJpdmVkICsgbmVzdGVkIGNsYXNzZXMgaXMgd29ya2luZyBub3cKCSAgICAgIChkZXJpdmVyX25lc3RlZC5pKSwgYnV0IG9mIGNvdXJzZSwgd2UgYXJlIHN0aWxsIHdhaXRpbmcKCSAgICAgIGZvciB0aGUgbmVzdGVkIGNsYXNzIHN1cHBvcnQuCgkgICAgCgkgICAgLSBEaXJlY3RvcnM6CgkgICAgICAtIHVubmFtZWQgcGFyYW1ldGVycyBzdXBwb3J0LAoKCSAgICAgIC0gcHJvdGVjdGVkIGNvbnN0cnVjdG9yIHN1cHBvcnQgKGF1dG9tYXRpYyBhbmQgd2l0aAogICAgICAgICAgICAgICAgZGlycHJvdCBtb2RlKSwKCgkgICAgICAtIGRldGVjdGlvbiBvZiByZWFsbHkgbmVlZGVkIHByb3RlY3RlZCBkZWNsYXJhdGlvbnMKICAgICAgICAgICAgICAgIChtZW1iZXJzIGFuZCBjb25zdHJ1Y3RvcnMpIG5vdyBpcyBkb25lIGF1dG9tYXRpY2FsbHkuCiAgICAgICAgICAgICAgICBFdmVuIGlmIHlvdSBkb24ndCB1c2UgdGhlICdkaXJwcm90JyBtb2RlLCBzd2lnIHdpbGwKICAgICAgICAgICAgICAgIHdyYXAgd2hhdCBpcyBtaW5pbWFsbHkgbmVlZGVkIChhbmQgcHJvdGVjdGVkKSBmb3IgdGhlCiAgICAgICAgICAgICAgICBjb2RlIHRvIGNvbXBpbGUuCgkJCgkJd2hhdCBpcyBwdWJsaWMsIGFzIHVzdWFsLCBpcyBhbHdheXMgd3JhcHBlZCwgYW5kIGlmCgkJeW91IHVzZSB0aGUgJ2RpcnBvcnQnCgkJCgoJICAgIC0gRmluYWwgZml4ZXMgZm9yIHRoZSBPU1MgdG8gY29tcGlsZSB3aXRoIFNXSUcgMS4zLjIzIChteQoJICAgICAgdmVyeSB2ZXJ5IHVnbHkgQysrICsgdGVtcGxhdGVzICsgZXZlcnl0aGluZyBtb3VudGVycyB3cmFwKS4KCjEwLzI1LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gTmV3IGNvbW1hbmRsaW5lIG9wdGlvbiAtZGxsaW1wb3J0LiBUaGlzIGVuYWJsZXMgb25lIHRvIHNwZWNpZnkKICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIERMTCBmb3IgdGhlIERsbEltcG9ydCBhdHRyaWJ1dGUuIE5vcm1hbGx5IHRoaXMgbmFtZQogICAgICAgICAgICBjb21lcyBmcm9tIHRoZSBtb2R1bGUgbmFtZSwgc28gbm93IGl0IGlzIHBvc3NpYmxlIHRvIG92ZXJyaWRlIHRoaXM6CgogICAgICAgICAgICAgIHN3aWcgLWNzaGFycCAtZGxsaW1wb3J0IHh5eiBleGFtcGxlLmkKCiAgICAgICAgICAgIHdpbGwgZ2VuZXJhdGUgZm9yIGFsbCB0aGUgd3JhcHBlZCBQSW52b2tlIG1ldGhvZHM6CgogICAgICAgICAgICAgIFtEbGxJbXBvcnQoInh5eiIsIEVudHJ5UG9pbnQ9Ii4uLiIpXQogICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZXh0ZXJuIC4uLgoKICAgICAgICAgICAgVGhlIHdyYXBwZXJzIGZyb20gbWFueSBkaWZmZXJlbnQgU1dJRyBpbnZvY2F0aW9ucyBjYW4gdGh1cyBiZSBjb21waWxlZAogICAgICAgICAgICBpbnRvIG9uZSBETEwuCgogICAgICAgICAgICBBIG5ldyBzcGVjaWFsIHZhcmlhYmxlICRkbGxpbXBvcnQgY2FuIGFsc28gYmUgdXNlZCBpbiB0eXBlbWFwcywgcHJhZ21hcywKICAgICAgICAgICAgZmVhdHVyZXMgZXRjLiBUaGlzIHdpbGwgZ2V0IHRyYW5zbGF0ZWQgaW50byB0aGUgdmFsdWUgc3BlY2lmaWVkIGJ5IC1kbGxpbXBvcnQKICAgICAgICAgICAgaWYgc3BlY2lmaWVkLCBvdGhlcndpc2UgdGhlIG1vZHVsZSBuYW1lLgoKMTAvMjIvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIFBhdGNoICMxMDQ5NDk2IGZyb20gU2NvdHQgTWljaGVsIGZpeGVzIGRpcmVjdG9ycyBtZXRob2RzIHdpdGggCiAgICAgICAgICAgIGVudW1zIHdoZW4gd3JhcHBlZCB3aXRoIHR5cGVzYWZlIG9yIHByb3BlciBKYXZhIGVudW1zLgoKMTAvMjEvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgRml4ZXMgZm9yIGRlZmF1bHQgYXJndW1lbnRzIGluIGRpcmVjdG9yIGNvbnN0cnVjdG9ycyAoUHl0aG9uLCBSdWJ5LCBPY2FtbCkuCgoxMC8yMS8yMDA0OiBtbWF0dXMKCSAgICAtIFtQeXRob25dIEFkZCB0aGUgJy1jcGx1c2Nhc3QnIG9wdGlvbiB0byBlbmFibGUgdGhlICduZXcnCgkgICAgICBDKysgY2FzdGluZyBvcGVyYXRvcnMsIHN1Y2ggYXMgJ3N0YXRpY19jYXN0JywgaW5zaWRlIHRoZQoJICAgICAgdHlwZW1hcHMuIEJ5IGRlZmF1bHQgc3dpZyB1c2UgdGhlIG9sZCBDIGNhc3Qgc3R5bGUsIGV2ZW4KCSAgICAgIHdoZW4gcGFyc2luZyBDKysuCgkgICAgICAKCSAgICAtIFtQeXRob25dIEFkZCB0aGUgJy1uZXdfdndtJyBvcHRpb24gdG8gZW5hYmxlIHRoZSBuZXcKICAgICAgICAgICAgICBTd2lnVmFsdWVXcmFwcGVyIG1vZGUuIE5vdyB0aGlzIGlzIG1haW5seSBmb3IgdGVzdGluZwogICAgICAgICAgICAgIHRoYXQgdGhlIHR5cGVtYXBzIGFyZSByZWFsbHkgc2FmZSBmb3IgYW55IGZ1dHVyZQogICAgICAgICAgICAgIHNvbHV0aW9uLCBidXQgeW91IGNhbiB1c2UgaXQgaWYgeW91IGhhdmUgYSB2ZXJ5IHN0cmFuZ2UKICAgICAgICAgICAgICBlcnJvciB3aXRoIGRlZmF1bHQgY29zbnRydWN0b3JzIG1pc3NpbmcgKyAlYXBwbHkgKwogICAgICAgICAgICAgICV0eXBlbWFwLCBhbmQgaWYgZXZlcnl0aGluZyBlbHNlIGZhaWxzIChzZWUKICAgICAgICAgICAgICB2YWx1d3JhcHBlcl9vcGFxdWUuaSBmb3IgYWx0ZXJuYXRpdmUgYW5kIGN1cnJlbnQKICAgICAgICAgICAgICBzb2x1dGlvbnMpLiBJZiB5b3UgYXJlIGEgdXNlciB0aGF0IGRvbid0IGtub3cgd2hhdCBpcwogICAgICAgICAgICAgIFN3aWdWYWx1ZVdyYXBwZXIsIGRvbid0IGV2ZW4gdHJ5IGl0LgoKCSAgICAtIFtQeXRob25dIEFkZCB0aGUgJy1ub2gnIG9wdGlvbiB0byBiZSB1c2VkIHdpdGggZGlyZWN0b3JzCgkgICAgICBhbmQgd2hlbiB5b3UgcHJlZmVyIHRvIGRpc2FibGUgdGhlIGdlbmVyYXRpb24gb2YgdGhlCgkgICAgICBkaXJlY3RvciBoZWFkZXIgZmlsZS4gSWYgbm90IHVzZWQsIHN3aWcgd2lsbCB3b3JrIGFzCgkgICAgICB1c3VhbCBnZW5lcmF0aW5nIGJvdGggdGhlIHdyYXAuY3h4IGFuZCB3cmFwLmggZmlsZXMuIElmCgkgICAgICB5b3UgdXNlIGl0LCBzd2lnIHdpbGwgb25seSBnZW5lcmF0ZSB3cmFwLmN4eC4KCjEwLzIxLzIwMDQ6IHd1enplYiAoSm9obiBMZW56KQogICAgICAgICAgICAtIElmIHlvdSBkZWZpbmUgU1dJR19UWVBFX1RBQkxFIHdoZW4gY29tcGlsaW5nIGEgd3JhcHBlciBmaWxlLAoJICAgICAgdGhlIHJ1bnRpbWUgdHlwZXMgd2lsbCBiZSBzdG9yZWQgaW4gdGhlIGdpdmVuIHR5cGUgdGFibGUgbmFtZS4KCSAgICAgIFVzaW5nIHRoaXMsIHlvdSBjYW4gc2VwZXJhdGUgZGlmZmVyZW50IG1vZHVsZXMgdG8gc2hhcmUgdGhlaXIKCSAgICAgIG93biB0eXBlIHN5c3RlbXMuICAtRFNXSUdfVFlQRV9UQUJMRT1NeXRhYmxlCgoJICAgIC0gW1B5dGhvbl0gSWYgeW91IGRlZmluZSBTV0lHX1NUQVRJQ19SVU5USU1FIHRoZW4gdGhlIHR5cGUgaW5mb3JtYXRpb24KCSAgICAgIHdpbGwgYmUgc3RhdGljIHRvIHRoaXMgd3JhcHBlci4gIE5vdGhpbmcgd2lsbCBiZSBzaGFyZWQgd2l0aCBhbnkKCSAgICAgIG90aGVyIG1vZHVsZXMKCgkgICAgLSBbUHl0aG9uXSBJZiB5b3UgZGVmaW5lIFNXSUdfTElOS19SVU5USU1FLCB0aGVuIGluc3RlYWQgb2YgdXNpbmcKCSAgICAgIHRoZSBuZXcgd2F5IG9mIHNoYXJpbmcgdHlwZSBpbmZvcm1hdGlvbiwgdGhlIHdyYXBwZXIgd2lsbCBleHBlY3QKCSAgICAgIHRvIGJlIGxpbmtlZCBhZ2FpbnN0IHRoZSBMaWIvbGlua3J1bnRpbWUuYyBmaWxlLiAgQW55IG1vZHVsZXMgY29tcGlsZWQKCSAgICAgIHdpdGggU1dJR19MSU5LX1JVTlRJTUUgYW5kIGxpbmtlZCBhZ2FpbnN0IGxpbmtydW50aW1lLmMgd2lsbCBhbGwKCSAgICAgIHNoYXJlIHR5cGUgaW5mb3JtYXRpb24uCgoxMC8yMC8yMDA0OiBtbWF0dXMKCSAgICAtIFtQeXRob25dIEluaXRpYWwgZml4IGZvciBweXRob24vaW1wb3J0IGV4YW1wbGUuIFBsZWFzZQoJICAgICAgdXBkYXRlIHRoZSBNYWtlZmlsZSAoYXV0b2NvbmYsIGNvbmZpZ3VyZSwgZXRjLCBleHBlcnQpLAoJICAgICAgc2luY2Ugbm93IHByb2JhYmx5IGlzIG9ubHkgd29ya2luZyB3aXRoIGcrKywgaWNjIGFuZCBhCgkgICAgICBmZXcgb3RoZXIgY29tcGlsZXJzIHRoYXQgaGF2ZSB0aGUgLXNoYXJlZCBvcHRpb24uCgoJICAgICAgV2UgbmVlZCB0byBjcmVhdGUgYWRkaXRpb25hbCBzaGFyZWQgbGlicmFyaWVzIGZvciB0aGUKCSAgICAgIHZpcnR1YWwgZGVzdHJ1Y3RvcnMuIE9sZCBhbmQgdXN1YWxseSBmb3Jnb3R0ZW4gQysrCgkgICAgICByZXF1aXJlbWVudC4KCSAgICAgIAoJICAgICAgU2FtZSBmaXggbmVlZCB0byBiZSB1c2VkIGluIHBlcmwsIEkgdGhpbmsuCgogICAgICAgICAgICAtIFtQeXRob25dIEZpeCBnZW5lcmF0aW9uIG9mIGhlYWRlciBmaWxlIGZvciBkaXJlY3RvcnMsCiAgICAgICAgICAgICAgbm93IGRpcmVjdG9ycy5zd2cgaXMgYWxzbyBpbmNsdWRlZCwgc28sIGl0IGNhbiBiZSByZWFsbHkKCSAgICAgIHVzZWQgZnJvbSBDKyssIGFuZCBpdCBzb2x2ZXMgc29tZSBwcm9ibGVtIHdpdGggY29tcGlsZXIKCSAgICAgIHRoYXQgcmVxdWlyZSB0aGF0LCBldmVuIHdpdGggdGhlIHNpbXBsZSBzd2lnIGluY2x1c2lvbi4gIAoKICAgICAgICAgICAgLSBbUHl0aG9uXSBSZW9yZGVyaW5nIHRoZSBtZXRob2RzIGFuZCBtb3Zpbmcgc29tZSBib2RpZXMKICAgICAgICAgICAgICBvdXRzaWRlIHRoZSBjbGFzcyBkZWNsYXJhdGlvbi4gVGhpcyBpcyBuZWVkZWQgZHVlIHRvCiAgICAgICAgICAgICAgc29tZSBnY2MtMi45NiBpbnRlcm5hbCBjb21waWxlciBlcnJvcnMuIEl0IHNlZW1zIHRoZQogICAgICAgICAgICAgIFBZVEhPTiBjbGFzcyBpcyBnZXR0aW5nIHRvbyBsYXJnZSB0byBiZWVuIGRlY2xhcmVkIGFuZAogICAgICAgICAgICAgIGRlZmluZWQgYXQgdGhlIHNhbWUgdGltZS4KCgkgICAgLSBBZGQgdGhlIC1vaCBvcHRpb24gdG8gY2hhbmdlIHRoZSBvdXRwdXQgaGVhZGVyIGZpbGUgbmFtZQogICAgICAgICAgICAgIGlmIG5lZWRlZDoKCiAgICAgICAgICAgICAgICAgc3dpZyAtYysrIC1weXRob24gdGVzdC5pIC1vIHRlc3QuQ0MgLW9oIHRlc3QuSEgKCSAgICAgIAogICAgICAgICAgICAgIHRoaXMgaXMgbWFpbmx5IG5lZWRlZCB3aGVuIHVzaW5nIGRpcmVjdG9ycywgYW5kIGlmIHRoZQogICAgICAgICAgICAgIGN1cnJlbnQgZGVmYXVsdCBoZWFkZXIgZmlsZSBuYW1lIGlzIG5vdCBnb29kIGZvciB5b3UsCiAgICAgICAgICAgICAgd2hpY2ggaXMgZ2VuZXJhdGVkIGFzIGZvbGxvdzoJICAgICAgCgogICAgICAgICAgICAgICAgIHN3aWcgLWMrKyAtcHl0aG9uIHRlc3QuaSAgICAgICAgICAgICA9PiB0ZXN0X3dyYXAuaAogICAgICAgICAgICAgICAgIHN3aWcgLWMrKyAtcHl0aG9uIHRlc3QuaSAtbyB0ZXN0LkNDICA9PiB0ZXN0LmgKCgoxMC8yMC8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICAxKSBDb21wYWN0IGRlZmF1bHQgYXJndW1lbnRzIGZlYXR1cmUgYWRkZWQuIFRoaXMgZmVhdHVyZSBhbGxvd3Mgb25lCiAgICAgICAgICAgICAgdG8gdXNlIHRoZSBkZWZhdWx0IGFyZ3VtZW50IGNvZGUgZ2VuZXJhdGlvbiB0aGF0IHdhcyB1c2VkIGluCiAgICAgICAgICAgICAgU1dJRy0xLjMuMjIgYW5kIGVhcmxpZXIgdmVyc2lvbnMuIEl0IHByb2R1Y2VzIG1vcmUgY29tcGFjdCB3cmFwcGVycwogICAgICAgICAgICAgIGFzIG9ubHkgb25lIHdyYXBwZXIgbWV0aG9kIGlzIGdlbmVyYXRlZCBmb3IgYW55IG1ldGhvZCB3aXRoIGRlZmF1bHQKICAgICAgICAgICAgICBhcmd1bWVudHMuIFNvIHRoZSBhZHZhbnRhZ2UgaXMgaXQgZ2VuZXJhdGVzIGxlc3MgY29kZSBidXQgaGFzIHRoZQogICAgICAgICAgICAgIG9yaWdpbmFsIGxpbWl0YXRpb25zLCBsaWtlIGl0IGl0IGRvZXMgbm90IHdvcmsgd2l0aCBhbGwgZGVmYXVsdCBhcmd1bWVudHMKICAgICAgICAgICAgICBhbmQgZGVmYXVsdCBhcmd1bWVudHMgY2Fubm90IGJlIHRha2VuIGFkdmFudGFnZSBvZiBpbiB0aGUgc3Ryb25nbHkgdHlwZWQKICAgICAgICAgICAgICBsYW5ndWFnZXMgKEMjIGFuZCBKYXZhKS4gSXQgaXMgaW1wbGVtZW50ZWQgdmlhIHRoZSB1c3VhbCAlZmVhdHVyZSBtZWNoYW5pc206CgogICAgICAgICAgICAgICAgJWZlYXR1cmUoImNvbXBhY3RkZWZhdWx0YXJncyIpOwoKICAgICAgICAgICAgMikgS2V5d29yZCBhcmd1bWVudHMgKGt3YXJncykgYXJlIHdvcmtpbmcgYWdhaW4gZm9yIGRlZmF1bHQgYXJndW1lbnRzCiAgICAgICAgICAgICAgIGluIHRoZSBsYW5ndWFnZXMgdGhhdCBzdXBwb3J0IGl0LCBpZSwgUHl0aG9uIGFuZCBSdWJ5LiBUaGUgbmV3IGRlZmF1bHQKICAgICAgICAgICAgICAgYXJndW1lbnQgd3JhcHBpbmcgYXBwcm9hY2ggdXNpbmcgb3ZlcmxvYWRlZCBtZXRob2RzIGNhbm5vdCBzdXBwb3J0IGt3YXJncwogICAgICAgICAgICAgICBzbyB0aGUgY29tcGFjdCBkZWZhdWx0IGFyZ3VtZW50IGZlYXR1cmUgaXMgYXV0b21hdGljYWxseSB0dXJuZWQgb24gd2hlbgogICAgICAgICAgICAgICBrd2FyZ3MgYXJlIHNwZWNpZmllZCwgYnkgJWZlYXR1cmUoImt3YXJncyIpLgoKICAgICAgICAgICAgMykgQ29tcGFjdCBkZWZhdWx0IGFyZ3VtZW50cyBhcmUgYWxzbyBhdXRvbWF0aWNhbGx5IHR1cm5lZCBvbiB3aGVuIHdyYXBwaW5nCiAgICAgICAgICAgICAgIEMgKG5vdCBDKyspIGNvZGUuIFRoaXMgaXMgdG8gc3VwcG9ydCB0aGUgYml6YXJyZSBub3Rpb24gb2YgZGVmYXVsdCBhcmd1bWVudHMKICAgICAgICAgICAgICAgZm9yIEMgY29kZS4KCjEwLzIwLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIE92ZXJsb2FkZWQgdGVtcGxhdGVkIGZ1bmN0aW9ucyBpbiBuYW1lc3BhY2VzIGFsc28gd29ya2luZyBub3cuCiAgICAgICAgICAgIFRlbXBsYXRlZCBmdW5jdGlvbnMgd2l0aCBkZWZhdWx0IGFyZ3VtZW50cyBpbiBuYW1lc3BhY2VzIHRvby4KCjEwLzE5LzIwMDQ6IG1tYXR1cwoKCSAgICAtIEFsbG93IHRvIGRpc2FibGUgdGhlIG5ldyBTd2lnVmFsdWVXcmFwcGVyIG1lY2hhbmlzbSwKCSAgICAgIGlmIHlvdSBhZGQgdGhlIGZvbGxvd2luZyBsaW5lIGluIHlvdXIgbGFuZ3VhZ2UgbWFpbi4KCgkJIC8qIFR1cm4gb24gc2FmZSB2YWx1ZSB3cmFwcGVyIHVzZSBtb2RlICovCiAgICAgICAgICAgICAgICAgU3dpZ192YWx1ZV93cmFwcGVyX21vZGUoMSk7CgoJICAgICAgCgkgICAgICBOb3cgaXMgb25seSBhY3RpdmUgaW4gcHl0aG9uLiBBbGwgdGhlIG90aGVyIGxhbmd1YWdlcwoJICAgICAgYXJlIHVzaW5nIHRoZSBvbGQgcmVzb2x1dGlvbiwgYnV0IHRoZXkgIGNhbiBhbHNvIHVzZSB0aGUKCSAgICAgICJ2YWx1ZXdyYXBwZXIiLyJub3ZhbHVld3JhcHBlciIgZmVhdHVyZXMgdG8gZml4IHNvbWUKCSAgICAgIG9mIHRoZSBvbGQgYnJva2VuIGNhc2VzLiBOb3RlLCBob3dldmVyLCAgdGhhdCBub3QgYWxsIAoJICAgICAgdGhlIGJyb2tlbiBjYXNlcyBjYW4gYmUgc29sdmVkIGluIHRoYXQgd2F5LgoKCSAgICAgIFRoZSBuZXcgbWVjaGFuaXNtIHNlZW1zIHRvIGJlIHdvcmtpbmcgZmluZSBpbiBwZXJsLCBydWJ5CgkgICAgICBhbmQgdGNsLCBidXQgZmFpbGluZyBpbiBzb21lIHR5cGVtYXBzIGluIGphdmEuCgoJICAgICAgSGVuY2UsIGlzIHVwdG8gdGhlIGxhbmd1YWdlIG1haW50YWluZXIgdG8gdGVzdCBpdCwgYW5kCgkgICAgICBkZWNpZGUgdG8gZW5hYmxlIGl0IG9yIG5vdC4KCgkgICAgICBMb29rIGF0IHRoZSB2YWx1ZXdyYXBwZXJfb3BhcXVlLmkgZm9yIGV4YW1wbGVzLgoKCSAgICAtIEZpeCBtb3JlIFN3aWdWYWx1ZVdyYXBwZXIgY2FzZXMgd2hlbiB0aGUgbmV3IG1lY2hhbmlzbQoJICAgICAgaXMgYWN0aXZlLiBOb3cgaXQgYWxzbyBjaGVjayBmb3IgbG9jYWwgdHlwZW1hcAoJICAgICAgdmFyaWFibGVzLCBzZWUgdmFsdWV3cmFwcGVyX29wYXF1ZS5pIGZvciBhbiBleGFtcGxlIHdoZW4KCSAgICAgIHRoaXMgaXMgbmVlZGVkLiBCdXQgYWdhaW4sIHRoaXMgZXh0cmEgY2hlY2tpbmcgd2lsbCBvbmx5CgkgICAgICBiZSBhY3RpdmF0ZWQgd2hlbiB1c2luZyB0aGUgbmV3IHZhbHVlIHdyYXBwZXIgbW9kZS4KCgkgICAgLSBbUHl0aG9uXSBGaXggdmFyaWFibGUgd3JhcHBpbmcgb2YgY2xhc3NlcyB3aXRoIHByaXZhdGUKCSAgICAgIGFzc2lnbiBvcGVyYXRvcnMuIEl0IHNob3VsZCBiZSBlYXN5IHRvIGZpeCBpbiBhbGwgdGhlIAoJICAgICAgb3RoZXIgbW9kdWxlcywgaW5zdGVhZCBvZiBjaGVja2luZwoKCSAgICAgICAgIGlmICghR2V0YXR0cihuLCJpbW11dGFibGUiKSkgLi4uCgkKCSAgICAgIHlvdSBuZWVkIHRvIHZlcmlmeQoKCSAgICAgICAgIGlmIChpc19hc3NpZ25hYmxlKG4pKSAuLi4KCgkgICAgICBMb29rIGF0IHRoZSBwcml2YXRlX2Fzc2lnbi5pIGZvciBhbiBleGFtcGxlLgoKMTAvMTgvMjAwNDogbW1hdHVzCgkgICAgLSAlZmVhdHVyZXMgImRpcmVjdG9yIi8ibm9kaXJlY3RvciIgbm93IHdvcmsgYXMgZXhwZWN0ZWQuCiAgICAgICAgICAgIC0gR2VuZXJhbCBmaXhlcyBpbiAlZmVhdHVyZSB0byByZXNvbHZlIGZ1bmN0aW9uIGRlY2wKCSAgICAgIHByb3Blcmx5LAoJICAgICAgCgkgICAgICAgICVmZWF0dXJlKCJoZWxsbyIpIGZvbygpOwoJICAgICAgICBjaGFyIGZvbygpIC0+ICBmKCkgICAgLy8gd2FzIHdvcmtpbmcKCSAgICAgICAgY2hhciAqZm9vKCkgLT4gZigpLnAgIC8vIGl0IHdhc24ndAogCgogICAgICAgICAgICAtIFRlbXBsYXRlICsgc3BlY2lhbGl6YXRpb24gKyBkZWZhdWx0IHRlbXBsYXRlIGFyZ3Mgbm93IGlzCgkgICAgICB3b3JraW5nLCAoZG9uJ3QgY29uZnVzZSB3aXRoIHRlbXBsYXRlICsgZGVmYXVsdCBhcmcKCSAgICAgIHZhbHVlcywgdGhhdCB3YXMgc29sdmVkIGJlZm9yZSksIG5vdyB0aGlzIHVnbHkgY2FzZSBpcwoJICAgICAgd29ya2luZzoKCgkgICAgICAgIHRlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBBID0gQWxsb2M8VD4gPgoJCXN0cnVjdCBWZWN0b3IKCQl7CgkJICAgVmVjdG9yKFQgYSl7fQoJCX07CQkgICAKCgkJdGVtcGxhdGUgPD4KCQlzdHJ1Y3QgVmVjdG9yPGRvdWJsZT4KCQl7CgkJICBWZWN0b3IoKXt9CgkJICBpbnQgZm9vKCkgeyByZXR1cm4gMDsgfQogICAgICAgICAgICAgICAgfTsKCgkgICAgICAgICV0ZW1wbGF0ZShWX2MpIFZlY3RvcjxjaGFyLCBBbGxvYzxjaGFyPiA+OwoJICAgICAgICAldGVtcGxhdGUoVl9pKSBWZWN0b3I8aW50PjsgICAgLy8gcGlja3MgVmVjdG9yPGludCxBbGxvYzxpbnQ+ID4KCSAgICAgICAgJXRlbXBsYXRlKFZfZCkgVmVjdG9yPGRvdWJsZT47IC8vIHBpY2tzIHRoZSBzcGVjaWFsaXphdGlvbgoJICAgICAgCiAgICAgICAgICAgICAgdGhpcyBpcyBuZWVkZWQgZm9yIGF1dG9tYXRpYyBTVEwgc3VwcG9ydCAobGF0ZXIgd2lsbAogICAgICAgICAgICAgIGJlKS4KCgkgICAgLSBGaXggdGhlIHRlbXBsYXRlICsgdHlwZWRlZiBlcnJvcnMgaW4gdGVzdC1zdWl0ZSwgd2hpY2gKICAgICAgICAgICAgICBwcm9iYWJseSB3aWxsIGZpeCBhbm90aGVyIGdyb3VwIG9mIHN0cmFuZ2UgdGVtcGxhdGUgKwogICAgICAgICAgICAgIG5hbWVzcGFjZXMgKyB0eXBlZGVmcyBlcnJvcnMuCgoJICAgIC0gJXdhcm5maWx0ZXIgaXMgd29ya2luZyBiZXR0ZXIgbm93LCBwYXJzZXIueSB0cmllcyB0byB1c2UKCSAgICAgIHRoZW0gd2hlbiBuZWVkZWQuCgoJICAgIC0gKioqKiBOZXcgZGVmYXVsdCB0eXBlIHJlc29sdXRpb24gbWV0aG9kIChzdHlwZS5jKSAqKioqKiAKCgkgICAgICBJdCBwcmVzZXJ2ZXMgdGhlIG9yaWdpbmFsIG1peGVkIHR5cGVzLCB0aGVuIGl0IGdvZXMKCSAgICAgICdiYWNrd2FyZCcgZmlyc3QgZGVsZXRpbmcgdGhlIHF1YWxpZmllciwgdGhlbiB0aGUgaW5uZXIKCSAgICAgIHR5cGVzLCBmb3IgZXhhbXBsZToKICAgIAkJIAkJCQkJCQkgIAogICAgCQkgdHlwZWRlZiBBICpBcHRyOwkJCQkgIAogICAgCQkgY29uc3QgQXB0ciY7CQkJCQkJCiAgICAJCSByLnEoY29uc3QpLkFwdHIgICAgICAgLT4gci5xKGNvbnN0KS5wLlNXSUdUWVBFCQkKICAgIAkJIHIucShjb25zdCkucC5TV0lHVFlQRSAtPiByLnAuU1dJR1RZUEUJCQkKICAgIAkJIHIucC5TV0lHVFlQRSAgICAgICAgICAtPiByLlNXSUdUWVBFCQkJCiAgICAJCSByLlNXSUdUWVBFICAgICAgICAgICAgLT4gU1dJR1RZUEUJCQkKCQkgCQkJCQkJCQogICAgCQkgZW51bSBIZWxsbyB7fTsJCQkJCQkKICAgIAkJIGNvbnN0IEhlbGxvJiBoaTsJCQkJCQogICAgCQkgci5xKGNvbnN0KS5IZWxsbyAgICAgICAgICAtPiByLnEoY29uc3QpLmVudW0gU1dJR1RZUEUJCiAgICAJCSByLnEoY29uc3QpLmVudW0gU1dJR1RZUEUgIC0+IHIuZW51bSBTV0lHVFlQRQkJCiAgICAJCSByLmVudW0gU1dJR1RZUEUgICAgICAgICAgIC0+IHIuU1dJR1RZUEUJCQogICAgCQkgci5TV0lHVFlQRSAgICAgICAgICAgICAgICAtPiBTV0lHVFlQRQkJCQoJCSAJCQkJCQkJCiAgICAJCSBpbnQgYVsyXVs0XTsJCQkJCQkKICAgIAkJIGEoMikuYSg0KS5pbnQgICAgICAgICAgIC0+IGEoQU5ZKS5hKEFOWSkuU1dJR1RZUEUJCiAgICAJCSBhKEFOWSkuYShBTlkpLlNXSUdUWVBFICAtPiBhKEFOWSkuYSgpLlNXSUdUWVBFCQkKICAgIAkJIGEoQU5ZKS5hKCkuU1dJR1RZUEUgICAgIC0+IGEoQU5ZKS5wLlNXSUdUWVBFCQkKICAgIAkJIGEoQU5ZKS5wLlNXSUdUWVBFICAgICAgIC0+IGEoQU5ZKS5TV0lHVFlQRQkJCiAgICAJCSBhKEFOWSkuU1dJR1RZUEUgICAgICAgICAtPiBhKCkuU1dJR1RZUEUJCQogICAgCQkgYSgpLlNXSUdUWVBFICAgICAgICAgICAgLT4gcC5TV0lHVFlQRQkJCQogICAgCQkgcC5TV0lHVFlQRSAgICAgICAgICAgICAgLT4gU1dJR1RZUEUgICAgICAgICAgICAgICAgICAgIAoKCSAgICAgIGJlZm9yZSBpdCBhbHdheXMgc3RvcHMgYWZ0ZXIgZmluZGluZyByZWYvcG9pbnRlci9lbnVtL2FycmF5L2V0Yy4KCSAgICAgICAKCSAgICAgIE5vdywgdGhlbiwgeW91IGNhbiBkZWZpbmUgKHVzZSBhbmQgYXBwbHkpICdoaWdoZXInIHR5cGVtYXBzIHN1Y2ggYXM6CgogICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIFNXSUdUWVBFKiBjb25zdCYgIAoJICAgICAgICAldHlwZW1hcChvdXQpIGNoYXIgRklYU0laRVtBTlldCiAgICAgICAgICAgICAgICAldHlwZW1hcChpbikgU1dJR1RZUEUqIGNvbnN0JiAgCgkgICAgICAgICV0eXBlbWFwKGluKSBjb25zdCBlbnVtIFNXSUdUWVBFJgoJICAgICAgICAldHlwZW1hcChpbikgU1dJR1RZUEVbQU5ZXVtBTlldCgkgICAgICAgICV0eXBlbWFwKGluKSBjb25zdCBjaGFyICgmKVtBTlldCgkgICAgICAgCgkgICAgICBJdCBpcyBwb3NzaWJsZSB3aXRoIHRoaXMgY2hhbmdlIHRoYXQgcHJldmlvdXMgdHlwZW1hcHMKCSAgICAgIHRoYXQgd2VyZSBkZWZpbmVkIChidXQgaWdub3JlZCksIG5vdyB3aWxsIHN0YXJ0IHRvIHdvcmsuCgoJICAgICAgQWxzbywgaXQgaXMgbmVjZXNzYXJ5IGNoZWNrIGZvciB0aGUgJyV0eXBlbWFwKHZhcmluKSBTV0lHVFlQRVtdJywKCSAgICAgIGJlZm9yZSBpdCB3YXMgdXN1YWxseSBub3QgZGVmaW5lZCAoYnV0IGNoYXJbXSB3YXMpLAoJICAgICAgYW5kIHRoYXQgY2FuIHByb2R1Y2Ugc29tZSBpbmNvbnNpc3RlbmNpZXMuCgogICAgICAgICAgICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoJICAgICAgVGhpcyBjaGFuZ2Ugd2FzIG5lZWRlZCBmb3IgU1RMLCBzaW5jZSBzdGQ6OnZlY3RvcjxlbnVtIEhlbGxvPiAKCSAgICAgIHN0ZDo6dmVjdG9yPEEqPiwgZXRjLCB3aWxsIGFsd2F5cyBnZW5lcmF0ZSBtZXRob2RzIHRoYXQKCSAgICAgIG1peCBjb25zdCByZWZlcmVuY2VzIHdpdGggdGhlIHZlY3RvciB0eXBlLgoKCSAgICAgIE5vdyB0aGF0IGlzIHdvcmtpbmcsIGFsbCB0aGUgc3RkOjpjb250YWluZXI8VCo+CgkgICAgICBzcGVjaWFsaXphdGlvbiB3aWxsIG5vdCBiZSBuZWVkZWQgYW55bW9yZSwgd2VsbCwgaW4KCSAgICAgIHRoZW9yeS4gCgoJICAgICAgSW4gdGhlIHByYWN0aWNlLCBldmVyeXRoaW4gaXMgd29ya2luZyBhcyBiZWZvcmUgdW50aWwKCSAgICAgIHRoZSBwcm9wZXIgbWl4ZWQgdHlwZXMgYXJlIGRlZmluZWQgYW5kIHRoZSBsaWJyYXJpZXMKCSAgICAgIHNpbXBsaWZpZWQgdG8gdXNlIHRoZW0uCgoJICAgIC0gQ2hhbmdlIHRoZSBiZWhhdmlvciBvZiBleHRlcm4gImphdmEiLyJmb3J0cmFuIi8iZXRjIiwgCgkgICAgICBub3cgc3dpZyBwcm9kdWNlcyBhIHdhcm5pbmcsIGFuZCB1c2UgZXh0ZXJuICJDIiBpbnN0ZWFkLgoJICAgICAgVGhlIHdhcm5pbmcgY2FuIGFsc28gYmUgZGlzYWJsZSB3aXRoIHRoZSAiLXcgMzEzIiBmbGFnLgoJICAgICAgKFdBUk5fUEFSU0VfVU5ERUZJTkVEX0VYVEVSTikuCgoJICAgIC0gU3dpZ1ZhbHVlV3JhcHBlciBpcyBub3cgbW9yZSBzZWxlY3RpdmUgKGxhbmcuY3h4KS4KCiAgICAgICAgICAgIFtQZXJsL1RjbF0KCSAgICAtIEZpeCBzb21lIHR5cGVtYXBzIChwZXJsL3RjbCkgdG8gd29yayBwcm9wZXJseSB3aXRoCgkgICAgICBTd2lnVmFsdWVXcmFwcGVyLiBUaGlzIHdhcyBub3QgYSBwcm9ibGVtIHdpdGgKCSAgICAgIFN3aWdWYWx1ZVdyYXBwZXIsIGJ1dCB3aXRoIHRoZSB0eXBlbWFwcyB0aGF0IG5vdyBhcmUKCSAgICAgIHNhZmUgdG8gdXNlIHdpdGggJWFwcGx5LgoKCSAgICBbUHl0aG9uXQoKICAgICAgICAgICAgLSBGaXggJWNhbGxiYWNrLyVweXRob25jYWxsYmFjayB3b3JrIG5vdyBhcyBiZWZvcmUgYWZ0ZXIKCSAgICAgIHRoZSBkZWYgYXJncyBjaGFuZ2VzLiBBbHNvLCAlY2FsbGJhY2sgbm93IGlzIGFuIGFsaWFzCgkgICAgICBmb3IgJXB5dGhvbmNhbGxiYWNrLCBzbywgdGhleSBkbyB0aGUgc2FtZS4KCgkgICAgW1B5dGhvbi9SdWJ5XQoJICAgIC0gJWNhbGxiYWNrIGlzIG1vcmUgdXNhYmxlIGFuZCB1bmlmb3JtOgoKICAgICAgICAgICAgICAgICAlY2FsbGJhY2soIiVzX2NiIikgZm9vKCk7ICAvLyBmb3IgYm90aCwgcHl0aG9uL3J1YnkKICAgICAgICAgICAgICAgICAlY2FsbGJhY2soIiVzX2NiIik7ICAgICAgICAvLyBmb3IgYm90aCwgcHl0aG9uL3J1YnkKICAgICAgICAgICAgICAgICAlY2FsbGJhY2soMSkgZm9vKCk7ICAgICAgICAvLyBvbmx5IGluIHB5dGhvbi4KCjEwLzE3LzIwMDQ6IGFydHkKCSAgICBbT0NBTUxdCgkgICAgLSBUd2VhayB0byBlbnVtIHR5cGluZyBmb3Igc291bmRuZXNzIGluIHRoZSBwcmVzZW5jZSBvZiBtdWx0aXBsZQoJICAgICAgbW9kdWxlcy4KCSAgICAtIGdsb2JhbCBmdW5jdGlvbnMgYXJlIG5vdyB1bmFtYmlndW91cyBpbiBtdWx0aXBsZSBsb2FkZWQgbW9kdWxlcy4KCSAgICAtIEZpeGVkIHRlc3QgY2FzZSBjb2RlIHRvIGJ1aWxkIG11bHRpbW9kdWxlIHRlc3QgY2FzZXMgY29ycmVjdGx5LgoJICAgIC0gVGhlcmUgaXMgbm8gd2F5IHRvIHNoYXJlIG92ZXJsb2FkIHJlc29sdXRpb24gYWNyb3NzIG1vZHVsZXMKCSAgICAgIGJlY2F1c2Ugb2Ygc291bmRuZXNzIGlzc3Vlcy4gIElmIHRoZSB1c2VyIHdhbnRzIHRvIGNhbGwgc29tZQoJICAgICAgZnVuY3Rpb24gZm9vIGZyb20gYW4gYXJiaXRyYXJ5IG1vZHVsZSBiYXIsIHRoZXkgd2lsbCBoYXZlIHRvCgkgICAgICB1c2UgQmFyLl9mb28gdG8gY2FsbCBpdCBjb3JyZWN0bHkuICBMYXRlciBJIHdpbGwgZml4IHRoZSAKCSAgICAgIGNhbWxwNCBtb2R1bGUgdG8gZG8gc29tZXRoaW5nIGNsZXZlciBpbiB0aGlzIGNhc2UuICAKICAgICAgICAgICAgLSBQcm9taWRlZCBwZXJmb3JtYW5jZSBvdmVyaGF1bCBvZiBjbGFzcyBtZWNoYW5pc20uCgkgICAgLSBSZW1vdmVkIHN5bWJvbCBoYWNrIGZvciBvY2FtbC0zLjA3IGFuZCBiZWxvdyB3aGljaCBpcyBub3QgbmVlZGVkCgkgICAgICBmb3Igb2NhbWwtMy4wOCBhbmQgYWJvdmUuCgoxMC8xNi8yMDA0OiB3dXp6ZWIgKEpvaG4gTGVueikKICAgICAgICAgICAgW0NISUNLRU5dCgkgICAgLSBDb21wbGV0bHkgY2hhbmdlIGhvdyBjaGlja2VuLmN4eCBoYW5kbGVzIENMT1MgYW5kIGdlbmVyaWMgY29kZS4KCSAgICAgIGNoaWNrZW4gbm8gbG9uZ2VyIGV4cG9ydHMgLWNsb3Muc2NtIGFuZCAtZ2VuZXJpYy5zY20uICBUaGUgY2xvcwoJICAgICAgY29kZSBpcyBleHBvcnRlZCBkaXJlY3RseSBpbnRvIHRoZSBtb2R1bGUuc2NtIGZpbGUgaWYgLXByb3h5IGlzIHBhc3NlZC4KCSAgICAtIFRoZSBjb2RlIG5vdyBhbHdheXMgZXhwb3J0cyBhIHVuaXQuICBSdW5uaW5nIHRoZSB0ZXN0LXN1aXRlIGlzIG5vdwoJICAgICAgbWFqb3JseSBicm9rZW4sIGFuZCBuZWVkcyB0byBiZSBmaXhlZC4KCSAgICAtIENMT1Mgbm93IGdlbmVyYXRlcyB2aXJ0dWFsIHNsb3RzIGZvciBtZW1iZXIgdmFyaWFibGVzIHNpbWlsYXIgdG8gaG93CgkgICAgICBHT09QUyBzdXBwb3J0IHdvcmtzIGluIHRoZSBndWlsZSBtb2R1bGUuCgkgICAgLSBjaGlja2VuIG5vIGxvbmdlciBwcmVmaXhlcyBzeW1ib2xzIGJ5IHRoZSBtb2R1bGUgbmFtZSwgYW5kIG5vIGxvbmdlcgoJICAgICAgZm9yY2VzIGFsbCBuYW1lcyB0byBsb3dlciBjYXNlLiAgSXQgbm93IGhhcyAtdXNlY2xhc3NwcmVmaXggYW5kIC1jbG9zcHJlZml4CgkgICAgICBzaW1pbGFyIHRvIGhvdyBndWlsZSBoYW5kbGVzIEdPT1BTIG5hbWVzLgoKMTAvMTYvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgVGVtcGxhdGVkIGZ1bmN0aW9ucyB3aXRoIGRlZmF1bHQgYXJndW1lbnRzIHdvcmtpbmcgd2l0aCBuZXcgZGVmYXVsdCBhcmd1bWVudAogICAgICAgICAgICB3cmFwcGluZyBhcHByb2FjaC4gVGhlIG5ldyBhcHByb2FjaCBubyBsb25nZXIgZmFpbHMgd2l0aCB0aGUgZm9sbG93aW5nIGRlZmF1bHQKICAgICAgICAgICAgYXJndW1lbnQgcGF0dGVybiAocHJldmlvdXNseSBmYWlsZWQgd2l0aCBzb21lIHByaW1pdGl2ZSB0eXBlcywgbGlrZSAKICAgICAgICAgICAgdW5zaWduZWQgcHJpbWl0aXZlIHR5cGVzKToKCiAgICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gaW50IGZvbyhjb25zdCBUJiB1ID0gVCgpKTsKICAgICAgICAgICAgICAldGVtcGxhdGUoZm9vKSBmb288dW5zaWduZWQgaW50PjsKCiAgICAgICAgICAgIFRoaXMgcmVsaWVzIG9uIHRoZSB0ZW1wbGF0ZWQgZnVuY3Rpb24gb3ZlcmxvYWRpbmcgc3VwcG9ydCBqdXN0IGFkZGVkLCBzbyBhbGwKICAgICAgICAgICAgdGhlIGNvbWJpbmF0aW9ucyBvZiBvdmVybG9hZGluZyBieSB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIGFuZCBub3JtYWwgcGFyYW1ldGVycwogICAgICAgICAgICBhcyB3ZWxsIGFzIG92ZXJsb2FkaW5nIHdpdGggZGVmYXVsdCBwYXJhbWV0ZXJzIHdvcmtzLgoKMTAvMTYvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgQWRkZWQgc3VwcG9ydCBmb3IgdGhlIGxhcmdlIHJhbmdlIG9mIHRlbXBsYXRlZCBmdW5jdGlvbiBvdmVybG9hZGluZyB0aGF0IEMrKwogICAgICAgICAgICBzdXBwb3J0cy4KCiAgICAgICAgICAgIC0gT3ZlcmxvYWRlZCB0ZW1wbGF0ZWQgZnVuY3Rpb25zLCBlZwoKICAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBpbnQgb3ZlcmxvYWQoVCB0KTsKICAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBpbnQgb3ZlcmxvYWQoVCB0LCBjb25zdCBUICZyKTsKCiAgICAgICAgICAgIC0gRml4ZXMgd2hlcmUgdGhlIHRlbXBsYXRlZCB0eXBlIGlzIG5vdCB1c2VkIGluIHRoZSBwYXJhbWV0ZXIgbGlzdCwgZWcKCiAgICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gdm9pZCB4eXooKTsKICAgICAgICAgICAgICB0ZW1wbGF0ZTw+IHZvaWQgeHl6PGRvdWJsZT4oKTsKCiAgICAgICAgICAgIC0gRml4ZXMgZm9yIG92ZXJsb2FkaW5nIG9mIHBsYWluIGZ1bmN0aW9ucyBieSBhIHRlbXBsYXRlZCBmdW5jdGlvbjoKCiAgICAgICAgICAgICAgdm9pZCBhYmMoZG91YmxlIGQpOwogICAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IHZvaWQgYWJjKFQgdCk7CgogICAgICAgICAgICAtIE92ZXJsb2FkaW5nIGJ5IHRlbXBsYXRlZCBwYXJhbWV0ZXJzIGZpeGVkOgoKICAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiB2b2lkIGZvbyhUIHQpIHt9CiAgICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4gdm9pZCBmb28oVCB0LCBVIHUpIHt9CgogICAgICAgICAgICAgICV0ZW1wbGF0ZShmb28pIGZvbzxkb3VibGUsIGRvdWJsZT47CgogICAgICAgICAgICAtIEFsbCBjb21iaW5hdGlvbnMgb2YgdGhlIGFib3ZlIGFsc28gd29ya2luZyBpbmNsdWRpbmcgc3BlY2lhbGl6YXRpb25zLCBlZzoKCiAgICAgICAgICAgICAgdm9pZCBhYmMoZG91YmxlIGQpOwogICAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IHZvaWQgYWJjKFQgdCk7CiAgICAgICAgICAgICAgdGVtcGxhdGU8PiB2b2lkIGFiYzxkb3VibGU+KGRvdWJsZSB0KTsKICAgICAgICAgICAgICB0ZW1wbGF0ZTw+IHZvaWQgYWJjKGludCB0KTsKCjEwLzE2LzIwMDQ6IHd1enplYiAoSm9obiBMZW56KQogICAgICAgICAgICAtIFJlbW92ZSB0aGUgYWJpbGl0eSB0byBzaGFyZSB0eXBlIGluZm9ybWF0aW9uIGJ5IHVzaW5nIGMgbGlua2luZy4KICAgICAgICAgICAgICBBbGwgdHlwZSBzaGFyaW5nIGhhcHBlbnMgdGhyb3VnaCBhIGdsb2JhbCB2YXJpYWJsZSBpbiB0aGUgdGFyZ2V0IGxhbmd1YWdlLgogICAgICAgICAgICAgICAgKyBSZW1vdmUgU1dJR19OT0lNUE9SVCwgU1dJR19SVU5USU1FLCBhbmQgcmVsYXRlZCBkZWZpbmVzLgogICAgICAgICAgICAgICAgKyBEZXByZWNpYXRlIC1ydW50aW1lLCAtbm9ydW50aW1lIGNvbW1hbmQgbGluZSBvcHRpb25zCiAgICAgICAgICAgICAgICArIFVwZGF0ZSB0ZXN0LXN1aXRlIGNvbW1vbi5tayB0byBjb3JyZWN0bHkgYnVpbGQgbXVsdGljcHB0ZXN0CiAgICAgICAgICAgICAgICArIFJlbW92ZSByZWZlcmVuY2UgdG8gcHJlY29tbW9uLnN3ZwogICAgICAgICAgICAgICAgKyBVcGRhdGUgdGhlIGd1aWxlX2doIGludGVyZmFjZSB0byBzaGFyZSBkYXRhIGJ5IGEgZ2xvYmFsIHZhciBpbnN0ZWFkCiAgICAgICAgICAgICAgICAgIG9mIGMgbGlua2FnZS4KCiAgICAgICAgICAgIC0gUmVtb3ZlIEFkdmFuY2VkLmh0bWwsIHNpbmNlIGV2ZXJ5dGhpbmcgaW4gaXQgaXMgbm93IG9ic29sZXRlCgoxMC8wOS8yMDA0OiBtbWF0dXMKCSAgICAtIFNwbGl0IHRoZSBweXRob24gc3RkL1NUTCBDKysgbGlicmFyeSBmaWxlcywgbm93CgkgICAgICBhbGwgdGhlIGxhbmd1YWdlIGluZGVwZW5kZW50IGRlZmluaXRpb25zIGFyZSB1bmRlcgoJICAgICAgdGhlIGRpcmVjdG9yeQoJICAgICAgCgkJTGliL3N0ZAoKCSAgICAgIGFuZCBoZW5jZSwgY2FuIGJlIHVzZWQgZnJvbSBvdGhlciBsYW5ndWFnZXMuCgoJICAgIC0gQWRkIG1vcmUgZG9jdW1lbnRhdGlvbiB0byB0aGUgUHl0aG9uIFNUTCwgYW5kCgkgICAgICBjbGVhbiB1bm5lY2Vzc2FyeSBjb2RlLgoKCSAgICAtIEFkZCBpbml0aWFsIEM5OSBjb21wbGV4IHN1cHBvcnQsIGFuZCBzb21lIGZpeGVzCgkgICAgICBmb3IgbG9uZyBkb3VibGUuCgoxMC8wOC8yMDA0OiBtbWF0dXMKCSAgICAtIEZpeCB0aGUgU3dpZ1ZhbHVlV3JhcHBlciBmb3Igb3BhcXVlIHR5cGVzLCBub3cgaXQgaXMgCgkgICAgICBhcHBsaWVkIGZvciBvcGFxdWUgdGVtcGxhdGVzIGFuZCBjbGFzc2VzLCBmb3Igd2hpY2ggd2UKCSAgICAgIGRvbid0IGtub3cgaWYgdGhlcmUgaXMgb3Igbm90IGEgZGVmYXVsdCBjb25zdHJ1Y3RvciwgaWUKCiAgICAgICAgICAgICAgICAgc3RydWN0IEEgeyAKICAgICAgICAgICAgICAgICAgIEEoaW50KTsKICAgICAgICAgICAgICAgICB9OwogCiAgICAgICAgICAgICAgU3RpbGwsIGlmIHlvdSBrbm93IHRoYXQgeW91IGNsYXNzIGhhcyBhIGRlZmF1bHQKICAgICAgICAgICAgICBjb25zdHJ1Y3RvciwgYW5kIGZvciBzb21lIHZlcnkgdmVyeSBwYXJ0aWN1bGFyIHJlYXNvbgogICAgICAgICAgICAgIHlvdSB3YW50IHRvIGF2b2lkIHRoZSBTd2lnVmFsdWVXcmFwcGVyLCBhbmQgeW91IGRvbid0CiAgICAgICAgICAgICAgd2FudCBvciBjYW4ndCBleHBvc2UgdGhlIGNsYXNzIHRvIHN3aWcsIG5vdyB5b3UgY2FuCiAgICAgICAgICAgICAgc2F5CgogICAgICAgICAgICAgICAgICVmZWF0dXJlKCJub3ZhbHVld3JhcHBlciIpIEE7ICAgIAogICAgICAgICAgICAgICAgIGNsYXNzIEE7CiAgICAgICAgICAgICAgIAogICAgICAgICAgICAgIG9yIHRoZSBvdGhlciB3YXkgYXJvdW5kLCBpZiB0aGUgY2xhc3MgaGFzIGEgZGVmYXVsdAogICAgICAgICAgICAgIGNvbnN0cnVjdG9yLCBidXQgeW91IHdhbnQgdG8gdXNlIHRoZSB2YWx1ZSB3cmFwcGVyLCB5b3UKICAgICAgICAgICAgICBjYW4gc2F5CgogICAgICAgICAgICAgICAgICVmZWF0dXJlKCJ2YWx1ZXdyYXBwZXIiKSBBOwogICAgICAgICAgICAgICAgIHN0cnVjdCBBIHsgCiAgICAgICAgICAgICAgICAgICBBKCk7CgkJICAgLi4uLgogICAgICAgICAgICAgICAgIH07ICAgCiAgICAgIAoJICAgIC0gRml4IGZvciBjaGFyID4gMTI4LCBpZQoKICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgdGlsZGVfYSA9ICdcMzQxJzsKCiAgICAgICAgICAgIC0gQWRkIHBhdGNoIDEwNDE4NTggZm9yICRsZXh0eXBlLCB3aGljaCBjYXJyaWVzIHRoZSAKICAgICAgICAgICAgICBsaXRlcmFsIHR5cGUgb2YgYSBzeW1ib2wuIFNlZSBsZXh0eXBlLmkgaW4gdGhlCiAgICAgICAgICAgICAgdGVzdC1zdWl0ZSBmb3IgbW9yZSBkZXRhaWxzLgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogCgoxMC8wNy8yMDA0OiB3c2Z1bHRvbgoJICAgIHtSdWJ5LCBKYXZhXSBGaXggZGlyZWN0b3IgKyAnZW1wdHknIHRocm93cwoKCQkgICAgc3RydWN0IEEgewoJCSAgICAgIEEoKSB0aHJvdygpOwoJCSAgICAgIHZpcnR1YWwgfkEoKSB0aHJvdygpOwoJCSAgICAgIGludCBmb28oKSB0aHJvdygpOwoJCSAgICB9OwoKCjEwLzA2LzIwMDQ6IHd1enplYiAoSm9obiBMZW56KQogICAgICAgICAgICBbVENMXQogICAgICAgICAgICAtIEZpeCBidWcgcmVwb3J0ZWQgYnkgV2lsbGlhbSBBLiBIb2ZmbWFuIHByb3BhZ2F0aW5nIGNsaWVudGRhdGEKICAgICAgICAgICAgYmV0d2VlbiBtb2R1bGVzLiAgQWRkZWQgY2xpZW50ZGF0YV9wcm9wLm11bHRpY3BwdGVzdCB0byBjaGVjayBmb3IKICAgICAgICAgICAgdGhpcyBidWcuICBUaGUgZml4IGludm9sdmVkIHRoZSBmb2xsb3dpbmcgY2hhbmdlczoKICAgICAgICAgICAgICAgICsgU3dpZ1R5cGVfY2xpZW50ZGF0YV9jb2xsZWN0IGRvZXMgbm90IG5lZWQgdG8gY2hlY2sKICAgICAgICAgICAgICAgIHR5cGVzIGluIHJfcmVzb2x2ZWQgYmVjYXVzZSB3ZSBvbmx5IHdhbnQgdG8gcHJvcGFnYXRlIGNsaWVudGRhdGEKICAgICAgICAgICAgICAgIHRvIHR5cGVkZWZlZCBjbGFzc2VzLCBhbmQgcl9tYW5nbGVkIGFscmVhZHkgdGFrZXMgY2FyZSBvZiB0eXBlZGVmcy4KCiAgICAgICAgICAgICAgICArIFNXSUdfVHlwZVJlZ2lzdGVyIG5vdyBjb3BpZXMgdGhlIGNsaWVudGRhdGEgZmllbGQgY29ycmVjdGx5CgogICAgICAgICAgICAgICAgKyBNb3ZlIFNXSUdfR3VpbGVfUHJvcGFnYXRlQ2xpZW50RGF0YSBmdW5jdGlvbiBmcm9tIGd1aWxlIG1vZHVsZQogICAgICAgICAgICAgICAgaW50byBjb21tb24uc3dnLCBiZWNhdXNlIHdlIG5lZWQgdG8gY2FsbCBpdCBmcm9tIGJvdGggZ3VpbGUgYW5kIHRjbC4KCiAgICAgICAgICAgICAgICArIEFkZCBiYXNlX25hbWVzIHRvIHN3aWdfY2xhc3MgdG8gZGVsYXkgdGhlIGxvb2t1cCBvZiBiYXNlcy4gIFNXSUcKICAgICAgICAgICAgICAgIG5vdyBleHBvcnRzIHRoZSBiYXNlIG5hbWVzIGFuZCBvbmx5IHdoZW4gdGhlIGJhc2Ugc3dpZ19jbGFzcyBpcwogICAgICAgICAgICAgICAgbmVlZGVkIGlzIFNXSUdfVHlwZVF1ZXJ5KG5hbWUpLT5jbGllbnRkYXRhIGxvb2tlZCB1cC4KCiAgICAgICAgICAgIC0gY29udmVyc2lvbl9uc190ZW1wbGF0ZSB0ZXN0c3VpdGUgdGVzdCB3YXMgZmFpbGluZyBiZWNhdXNlCiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSB3cmFwcGVkIGNvbnN0cnVjdG9yIGZ1bmN0aW9uIHdhcyBub3QgY2FsY3VsYXRlZAogICAgICAgICAgICBjb3JyZWN0bHkgZm9yIHN0cnVjdHMuICBGaXhlZC4KCjEwLzA2LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeGVzIGZvciBkZWZhdWx0IGFyZ3VtZW50cyB1c2VkIGluIGRpcmVjdG9ycyAtIGluIHZpcnR1YWwKICAgICAgICAgICAgbWV0aG9kcyBhbmQgZGlyZWN0b3IgY29uc3RydWN0b3JzLgoKMTAvMDYvMjAwNDogbW1hdHVzCgkgICAgRml4IHRoZSBfX2NwbHVzcGx1cyBtYWNybywgYW5kIGJ1ZyAxMDQxMTcwLgoJICAgIE5vdyBpdCBpcyB3b3JraW5nIGFzIHN1cHBvc2VkLCBpZSwgeW91IGNhbiBzYWZlbHkgdXNlCgoJICAgICAgI2lmZGVmIF9fY3BsdXNwbHVzCgkgICAgICAuLi4KCSAgICAKCSAgICBhbGwgb3ZlciBzd2lnLCBpbmNsdWRpbmcgaW5zaWRlICVkZWZpbmVzIGFuZCAleyAlfSBib2RpZXMuCgoJICAgIAogICAgICAgICAgICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoJICAgIFRoZSBvbGQgdHJpY2sgb2YgdXNpbmcKCgkgICAgICAjaWYgX19jcGx1c3BsdXMKCgkgICAgZG9lc24ndCB3b3JrIGFueSBtb3JlLiBTbywgaWYgeW91IGhhdmUgeW91ciBvd24gdHlwZW1hcHMKCSAgICB1c2luZyB0aGF0IHN5bnRheCwgeW91IHdpbGwgbmVlZCB0byBtaWdyYXRlIHRoZW0gdG8gdXNlCgkgICAgIiNpZmRlZiBfX2NwbHVzcGx1cyIuCgoxMC8wNS8yMDA0OiB3dXp6ZWIgKEpvaG4gTGVueikKICAgICAgICAgICAgLSBSZW9yZ2FuaXplIGhvdyBydW50aW1lIHR5cGUgaW5mb3JtYXRpb24gaXMgc3RvcmVkIGFuZCBzaGFyZWQKCSAgICBiZXR3ZWVuIG1vZHVsZXMuICBGb3IgY2hpY2tlbiBhbmQgbXpzY2hlbWUsIEkgcmVtb3ZlZAoJICAgIHRoZSBhYmlsaXR5IHRvIHVzZSBydW50aW1lIGxpYnJhcmllcywgd2hpbGUgcGVybCwgdGNsLCBweXRob24sIGFuZAoJICAgIHJ1YnkgZGVmYXVsdCB0byB1c2luZyB0aGUgbmV3IG1ldGhvZCBidXQgY2FuIGdvIGJhY2sgdG8gdGhlIG9sZAoJICAgIG1ldGhvZCBieSBkZWNsYXJpbmcgU1dJR19BTExPV19SVU5USU1FLgoKCSAgICAtIGxpbmUgNTgyIGluIG16c2NoZW1lLmN4eCB3YXMgZ2VuZXJhdGluZyBhIHNlZ2ZhdWx0IG9uIAoJICAgIGltcG9ydHMubXVsdGljcHB0ZXN0LCBzbyBJIGZpeGVkIGl0LgoKMTAvMDUvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgRml4ZXMgZm9yICVleHRlbmQgYW5kIG92ZXJsb2FkZWQgc3RhdGljIG1ldGhvZHMgd2l0aCBkZWZhdWx0CiAgICAgICAgICAgIGFyZ3VtZW50cy4KCjEwLzA1LzIwMDQ6IG1tYXR1cwoJICAgIC0gW3B5dGhvbl0gRml4IGRpcmVjdG9yICsgbWV0aG9kIHdpdGggJ2VtcHR5JyB0aHJvdywgaWUKCgkJICAgIHN0cnVjdCBBIHsKCQkgICAgICB2aXJ0dWFsIGludCBmb28oKSB0aHJvdygpOwoJCSAgICB9OwoJCSAgICAKCSAgICAgIG90aGVyIGxhbmd1YWdlcyBzaG91bGQgYWxzbyBlYXN5IHRvIGZpeCwgbG9vayBmb3IKCSAgICAgIEdldGF0dHIobiwidGhyb3ciKSBpbiBweXRob24uY3h4LgoKCSAgICAtIEZpeCBkaXJlY3RvciArIGRlc3RydWN0b3Igd2l0aCAnZW1wdHknIHRocm93CgoJCSAgICBzdHJ1Y3QgQSB7CgkJICAgICAgdmlydHVhbCB+QSgpIHRocm93KCk7CgkJICAgIH07CgoJICAgIC0gTm93IFNXSUdfRkVBVFVSRVMgcGFyc2UgYWxsIGFuZCB0aGUgc2FtZSAgb3B0aW9ucyB5b3UKICAgICAgICAgICAgICBjYW4gcGFzcyB0byBzd2lnIGluIHRoZSBjb21tYW5kIGxpbmUuCgkgICAgICAKCSAgICAtIE5ldyBjb21tYW5kIGxpbmUgZmxhZzogLWZlYXR1cmVzIDxsaXN0PiwgYXMgaW4KCgkgICAgICAgIHN3aWcgLWZlYXR1cmVzIGF1dG9kb2M9MyxkaXJlY3RvcgoKCSAgICAgIGllLCBhbnkgZ2xvYmFsIGZlYXR1cmUgY2FuIGJlIGluaXRpYWxpemVkIGZyb20gdGhlCgkgICAgICBjb21tYW5kIGxpbmUuIFRoaXMgaXMgbWFpbmx5IGZvciB0ZXN0aW5nLCBidXQgdXNlcnMKCSAgICAgIGNhbiBhbHNvIHRha2UgYWR2YW50YWdlIG9mIGl0LgoKMTAvMDQvMjAwNDogbW1hdHVzCgkgICAgLSBQcm9wZXJseSBxdWFsaWZ5IHR5cGUgaW4gc3ludGF4IGFzICdsb25nKDIpJyBvciAnRm9vKCknLAoJICAgICAgdGhpcyBzb2x2ZSBvbGQgcHJvYmxlbSB3aXRoIGRlZmF1bHQgYXJncywgYW5kIHByb2JhYmx5CgkgICAgICBvdGhlciBwcm9ibGVtcyBhcm91bmQuIEhvd2V2ZXIsIHRoZSBkZWZhdWx0IGFyZyBwcm9ibGVtCgkgICAgICB3YXMgYWxzbyBhbHJlYWR5IHNvbHZlZCBieSBXaWxsaWFtIChzZWUgYmVsbG93KS4KCgkgICAgLSBGaXggZmVhdHVyZV9zZXQgYW5kIGZlYXR1cmVfZ2V0IG1ldGhvZHMuIEJlZm9yZQoJICAgICAgdGhleSBsb29rIGZyb20gcGFydGljdWxhciB0byBnZW5lcmFsIGFuZCBrZWVwIHRoZSBmaXJzdAoJICAgICAgZmVhdHVyZSBmb3VuZC4gVGhpcyBkaWRuJ3Qgd29yayB3ZWxsIHdpdGggdGVtcGxhdGVzLgoJICAgICAgTm93IHRoZSBtZXRob2RzIGxvb2sgZnJvbSBnZW5lcmFsIHRvIHBhcnRpY3VsYXIsIGFuZAoJICAgICAgb3ZlcnJpZGUgYW55IGZvdW5kIGZlYXR1cmUuCgogICAgICAgICAgICAtIFByZXZpb3VzbHkgYSBmZWF0dXJlIGNvdWxkIG5vdCBiZSBhcHBsaWVkIHRvIGNvbnN0cnVjdG9ycwogICAgICAgICAgICAgIG9yIGRlc3RydWN0b3JzIHRoYXQgd2VyZW4ndCBleHBsaWNpdGx5IGRlY2xhcmVkIGluIHRoZSBjbGFzcy4KICAgICAgICAgICAgICBUaGlzIGlzIG5vdyBmaXhlZCwgZm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgJWZlYXR1cmUoImZlYXR1cmVuYW1lIikgRm9vKCkgIi4uLiIKICAgICAgICAgICAgICAgICVmZWF0dXJlKCJmZWF0dXJlbmFtZSIpIH5Gb28oKSAiLi4uIgogICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgICAgLy8gaW1wbGljaXQgRm9vKCkgYW5kIH5Gb28oKQogICAgICAgICAgICAgICAgfTsKCgkgICAgLSBGaXggbWlzc2luZyBmZWF0dXJlcyBmb3IgZGVmYXVsdCBjb25zdC9kZXN0LCBieSByZWFsbHkKCSAgICAgICdjcmVhdGluZycgdGhlIG1ldGhvZHMgYW5kIGFwcGx5aW5nIHRoZSBmZWF0dXJlcy4KCgkgICAgLSBGaXggcmV0dXJuX2NvbnN0X3ZhbHVlLmkgY2FzZSBieSBhZGRpbmcgU3dpZ1ZhbHVlV3JhcHBlcjxjb25zdCBUPgoJICAgICAgc3BlY2lhbGl6YXRpb24uCgoJICAgIC0gRml4ICVleHRlbmQgKyBvdmVybG9hZCwgaW5jbHVkaW5nIG92ZXJsb2FkaW5nIGFjdHVhbAogICAgICAgICAgICAgIGNsYXNzIG1ldGhvZHMuIAoKCSAgICAtIEFkZGluZyBtb3JlIGNhc2VzIGluIHJlbGF0ZWQgZmlsZXMgaW4gdGhlIHRlc3Qtc3VpdGUuICAKCjEwLzA0LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIENoYW5nZXMgdG8gdGhlIHdheSBkZWZhdWx0IGFyZ3VtZW50cyBhcmUgd3JhcHBlZC4gUHJldmlvdXNseSBhIHNpbmdsZQogICAgICAgICAgICBtZXRob2Qgd2FzIGdlbmVyYXRlZCBmb3IgZWFjaCBtZXRob2QgdGhhdCBoYWQgZGVmYXVsdCBhcmd1bWVudHMuIElmCiAgICAgICAgICAgIGEgbWV0aG9kIGhhZCA1IGFyZ3VtZW50cywgc2F5LCBvZiB3aGljaCAxIGhhZCBhIGRlZmF1bHQgYXJndW1lbnQKICAgICAgICAgICAgdGhlbiB0aGUgY2FsbCB0byB0aGUgd3JhcHBlZCBtZXRob2Qgd291bGQgcGFzcyA1IGFyZ3VtZW50cy4gVGhlIGRlZmF1bHQKICAgICAgICAgICAgdmFsdWUgd2FzIGNvcGllZCBpbnRvIHRoZSB3cmFwcGVyIG1ldGhvZCBhbmQgdXNlZCBpZiB0aGUgc2NyaXB0aW5nCiAgICAgICAgICAgIGxhbmd1YWdlIHBhc3NlZCBqdXN0IDQgYXJndW1lbnRzLiBIb3dldmVyLCB0aGlzIHdhcyBmbGF3ZWQgYXMgdGhlCiAgICAgICAgICAgIGRlZmF1bHQgYXJndW1lbnQgc29tZXRpbWVzIGRvZXMgbm90IGhhdmUgZ2xvYmFsIGFjY2VzcywgZm9yIGV4YW1wbGUKICAgICAgICAgICAgU1dJRyB3b3VsZCBnZW5lcmF0ZSBjb2RlIHRoYXQgY291bGRuJ3QgY29tcGlsZSB3aGVuIHdyYXBwaW5nOgoKICAgICAgICAgICAgICBjbGFzcyBUcmlja3kgewogICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgIHZvaWQgZm9vKGludCB2YWwgPSBwcml2YXRldmFsdWUpOwogICAgICAgICAgICAgICAgdm9pZCBiYXIoaW50IHZhbCA9IFRyaWNreTo6Z2V0RGVmYXVsdCgpKTsKICAgICAgICAgICAgICBwcml2YXRlOgogICAgICAgICAgICAgICAgc3RhdGljIGludCBnZXREZWZhdWx0KCk7CiAgICAgICAgICAgICAgICBlbnVtIHsgcHJpdmF0ZXZhbHVlID0gMjAwIH07CiAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIEFsc28gYnVncyBpbiByZXNvbHZpbmcgc3ltYm9scyBnZW5lcmF0ZWQgY29kZSB0aGF0IHdvdWxkbid0IGNvbXBpbGUsIGZvciBleGFtcGxlCiAgICAgICAgICAgIChwcm9iYWJseSBmaXhhYmxlIHRob3VnaCk6CgogICAgICAgICAgICAgIG5hbWVzcGFjZSBTcGFjZSB7CiAgICAgICAgICAgICAgICBjbGFzcyBLbGFzcyB7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgS2xhc3MgY29uc3RydWN0b3JjYWxsKGNvbnN0IEtsYXNzJiBrID0gS2xhc3MoKSk7CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgVGhlIGFwcHJvYWNoIGFsc28gZG9lcyBub3Qgd29yayBmb3Igc3RhdGljYWxseSB0eXBlZCBsYW5ndWFnZXMgKEMjIGFuZCBKYXZhKQogICAgICAgICAgICBhcyB0aGVzZSBsYW5ndWFnZXMgZG8gbm90IGFsbG93IG1ldGhvZHMgdG8gaGF2ZSB2YXJpYWJsZSBudW1iZXIgb2YgYXJndW1lbnRzLgogICAgICAgICAgICBBbHRob3VnaCBDIyBoYXMgYSBtZWNoYW5pc20gdG8gcGFzcyBhIHZhcmlhYmxlIG51bWJlciBvZiBhcmd1bWVudHMgdGhleQogICAgICAgICAgICBtdXN0IGJlIG9mIHRoZSBzYW1lIHR5cGUgYW5kIGFyZSBtb3JlIGxpa2UgdmFyYXJncy4KCiAgICAgICAgICAgIFRoZSBuZXcgYXBwcm9hY2ggc29sdmVzIHRoZSBhYm92ZSBwcm9ibGVtcyBhbmQgd3JhcHMgbWV0aG9kcyB3aXRoIGRlZmF1bHQKICAgICAgICAgICAgYXJndW1lbnRzIGFzIGlmIHRoZSBtZXRob2Qgd2FzIG92ZXJsb2FkZWQuIFNvIFNXSUcgd2lsbCBub3cgdHJlYXQKCiAgICAgICAgICAgICAgdm9pZCBmb28oaW50IHZhbD0wKTsKCiAgICAgICAgICAgIGFzIGlmIGl0IGhhZCBwYXJzZWQ6CgogICAgICAgICAgICAgIHZvaWQgZm9vKGludCk7CiAgICAgICAgICAgICAgdm9pZCBmb28oKTsKCiAgICAgICAgICAgIFRoZSBjb2RlIGdlbmVyYXRlZCBpcyB0aGVuIGV4YWN0bHkgdGhlIHNhbWUgYXMgaWYgU1dJRyBoYWQgcGFyc2VkIHRoZSB0d28KICAgICAgICAgICAgb3ZlcmxvYWRlZCBtZXRob2RzLiBUaGUgc2NyaXB0aW5nIGxhbmd1YWdlcyBjb3VudCB0aGUgYXJndW1lbnRzIHBhc3NlZCBhbmQgY2FsbAogICAgICAgICAgICB0aGUgYXBwcm9wcmlhdGUgbWV0aG9kLCBqdXN0IGxpa2Ugb3ZlcmxvYWRlZCBtZXRob2RzLiBDIyBhbmQgSmF2YSBhcmUgbm93IGFibGUKICAgICAgICAgICAgdG8gcHJvcGVybHkgd3JhcCBtZXRob2RzIHdpdGggZGVmYXVsdCBhcmd1bWVudHMgYnkgZ2VuZXJhdGluZyBleHRyYSBtZXRob2RzLAogICAgICAgICAgICBhZ2FpbiBhcyBpZiB0aGUgbWV0aG9kIHdhcyBvdmVybG9hZGVkLCBzbyBmb3I6CgogICAgICAgICAgICAgIHZvaWQgYmFyKHN0cmluZyBzPSJoZWxsbyIsIGRvdWJsZSBkPTEwLjAsIGludCBpPTApOwoKICAgICAgICAgICAgdGhlIGZvbGxvd2luZyBwcm94eSBtZXRob2RzIGFyZSBnZW5lcmF0ZWQ6CgogICAgICAgICAgICAgIHZvaWQgYmFyKHN0cmluZyBzLCBkb3VibGUgZCwgaW50IGkpOwogICAgICAgICAgICAgIHZvaWQgYmFyKHN0cmluZyBzLCBkb3VibGUgZCk7CiAgICAgICAgICAgICAgdm9pZCBiYXIoc3RyaW5nIHMpOwogICAgICAgICAgICAgIHZvaWQgYmFyKCk7CgogICAgICAgICAgICBUaGUgbmV3IGFwcHJvYWNoIGNvbWVzIHdpdGggYSBjb3VwbGUgb2YgbWlub3Iga25vY2sgb24gZWZmZWN0cy4KCiAgICAgICAgICAgIDEpIFNXSUcgc3VwcG9ydCBmb3IgZGVmYXVsdCBhcmd1bWVudHMgZm9yIEMgKG5vdCBDKyspIGNvZGUgbm8gbG9uZ2VyIHdvcmtzLgogICAgICAgICAgICBQcmV2aW91c2x5IHlvdSBjb3VsZCBoYXZlIHRoaXMgaW50ZXJmYWNlOgoKICAgICAgICAgICAgICAlewogICAgICAgICAgICAgIHZvaWQgZm9vKGludCB2YWwpOwogICAgICAgICAgICAgICV9CiAgICAgICAgICAgICAgdm9pZCBmb28oaW50IHZhbD0wKTsKCiAgICAgICAgICAgIGFuZCBjYWxsIHRoZSB3cmFwcGVkIG1ldGhvZCBmcm9tIGEgc2NyaXB0aW5nIGxhbmd1YWdlIGFuZCBwYXNzIG5vIGFyZ3VtZW50cwogICAgICAgICAgICB3aGVyZXVwb24gdGhlIGRlZmF1bHQgb2YgMCB3YXMgdXNlZC4gWW91IGNhbiBnZXQgdGhlIHNhbWUgYmVoYXZpb3VyIGZvciBDCiAgICAgICAgICAgIGNvZGUgYnkgdXNpbmcgdGhlICJkZWZhdWx0IiB0eXBlbWFwOgoKICAgICAgICAgICAgICAldHlwZW1hcChkZWZhdWx0KSBpbnQgdmFsICIkMSA9IDA7IjsKICAgICAgICAgICAgICAlewogICAgICAgICAgICAgIHZvaWQgZm9vKGludCB2YWwpOwogICAgICAgICAgICAgICV9CiAgICAgICAgICAgICAgdm9pZCBmb28oaW50IHZhbCk7CgogICAgICAgICAgICBvciB5b3UgY291bGQgb2YgY291cnNlIGNvbXBpbGUgeW91ciBjb2RlIGFzIEMrKyBpZiB5b3Ugd2FudCBDKysgZmVhdHVyZXMgOikgOgoKICAgICAgICAgICAgICAlewogICAgICAgICAgICAgIHZvaWQgZm9vKGludCB2YWw9MCk7CiAgICAgICAgICAgICAgJX0KICAgICAgICAgICAgICB2b2lkIGZvbyhpbnQgdmFsPTApOwoKICAgICAgICAgICAgQSBjb3VwbGUgb2YgU1dJRydzIGxpYnJhcmllcyB1c2VkIHRoaXMgQyBleHRlbnNpb24gYW5kIHRoZXNlIGhhdmUgYmVlbiBtb2RpZmllZAogICAgICAgICAgICB0byB1c2UgdGhlICJkZWZhdWx0IiB0eXBlbWFwLiBUaGUgImRlZmF1bHQiIHR5cGVtYXAgaXMgdGh1cyB1bmNoYW5nZWQgKGFuZCBzdGlsbAogICAgICAgICAgICBpcyBub3QgYW5kIGlzIG5vdCBmdWxseSBzdXBwb3J0ZWQgYnkgQyMgYW5kIEphdmEsIGFuZCBpcyBsaWtlbHkgdG8gcmVtYWluIHNvKS4KCgogICAgICAgICAgICAyKSBBbGwgZmVhdHVyZXMgKCVmZWF0dXJlLCAlcmVuYW1lLCAlaWdub3JlIGV0Yykgbm8gbG9uZ2VyIHdvcmsgYXMgaWYgdGhlIG1ldGhvZAogICAgICAgICAgICB3aXRoIGRlZmF1bHQgYXJndW1lbnRzIGlzIGp1c3Qgb25lIG1ldGhvZC4gRm9yIGV4YW1wbGUsIHByZXZpb3VzbHkKCiAgICAgICAgICAgICAgJWlnbm9yZSBmb28oaW50KTsKCiAgICAgICAgICAgIHdvdWxkIGhhdmUgaWdub3JlZCB0aGUgbWV0aG9kIGNvbXBsZXRlbHkuIE5vdyBpdCB3aWxsIG9ubHkgaWdub3JlIGZvbyhpbnQpIGJ1dAogICAgICAgICAgICBub3QgdGhlIGV4dHJhIGZvbygpIG1ldGhvZC4gSW5zdGVhZCB1c2U6CgogICAgICAgICAgICAgICVpZ25vcmUgZm9vOwoKICAgICAgICAgICAgdG8gaWdub3JlIHRoZW0gYWxsLiBvcgoKICAgICAgICAgICAgICAlaWdub3JlIGZvbyhpbnQpOwogICAgICAgICAgICAgICVpZ25vcmUgZm9vKCk7CgogICAgICAgICAgICBUaGlzIG9mIGNvdXJzZSBhbGxvd3Mgb25lIHRvIGZpbmUgdHVuZSB0aGUgd3JhcHBpbmcsIGZvciBleGFtcGxlIG9uZSBjb3VsZCB1c2U6CgogICAgICAgICAgICAgICVyZW5hbWUoZm9vaW50KSBmb28oaW50KTsKICAgICAgICAgICAgICAlcmVuYW1lKGZvb2RlZmF1bHRzKSBmb28oKTsKICAgICAgICAgICAgICB2b2lkIGZvbyhpbnQgdmFsPTApOwoKICAgICAgICAgICAgYW5kIGNhbGwgdGhlbSBmcm9tIGFueSBsYW5ndWFnZSBsaWtlIHNvOgoKICAgICAgICAgICAgICBmb29pbnQoMjAwKQogICAgICAgICAgICAgIGZvb2RlZmF1bHRzKCkKCiAgICAgICAgICAgIG9yIGZvciBleGFtcGxlIGlnbm9yZSB0aGUgZXh0cmEgb3ZlcmxvYWRlZCBtZXRob2QsIHNvIHRoZSBkZWZhdWx0cyBjYW5ub3QgYmUgdXNlZDoKCiAgICAgICAgICAgICAgJWlnbm9yZSBmb28oKTsKICAgICAgICAgICAgICB2b2lkIGZvbyhpbnQgdmFsPTApOwoKICAgICAgICAgICAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMTAvMi8yMDA0OiBtbWF0dXMKCSAgIFtQeXRob25dCgkgICAtIE1vcmUgY2xlYW5pbmcgdXAgYW5kIHVuaWZvcm1hdGlvbiBvbiB0aGUgUHl0aG9uIExpYgoKCSAgIC0gQWRkZWQgUm9iaW4ncyBkb2NzdHJpbmcgcGF0Y2gsIHBsdXMgc29tZSBmaXhlcywgcGx1cwoJICAgICBzb21lIGV4dGVuc2lvbnMsIHNlZSBhdXRvZG9jLmkgZXhhbXBsZSBpbiB0aGUgdGVzdC1zdWl0ZSwKCSAgICAgYW5kIHRyeSB1c2luZyAlZmVhdHVyZSgiYXV0b2RvYyIsImV4dGVuZGVkIikuCgkgICAgCgkgICAgIFRoaXMgcGF0Y2ggaXMgbm90IGEgY29tcGxldGUgc29sdXRpb24gZm9yIHRoZQoJICAgICBkb2N1bWVudGF0aW9uIHByb2JsZW0sIGp1c3QgZW5vdWdoIHRvIGluZm9ybSBweXRob24gYWJvdXQKCSAgICAgdGhlIHBhcmFtZXRlciBsaXN0LgoKCSAgICAgVGhlIGV4cGVjdGVkIHN3aWcgZG9jdW1lbnRhdGlvbiBzdXBwb3J0IGlzIGZhciBmYXIgYXdheSB5ZXQuCgkgICAgIAoKMTAvMS8yMDA0OiBtbWF0dXMKCSAgIC0gRml4IHRoZSAlY2FsbGJhY2sgZmVhdHVyZSAob25seSB1c2VkIGluIHJ1YnkgYW5kIHB5dGhvbiBleGFtcGxlcywKCSAgICAgYnkgbm93LCBidXQgaXQgc2hvdWxkIGJlIGdlbmVyaWMpLCBub3cgbWVtYmVyIGNhbGxiYWNrcwoJICAgICBhcmUgd29ya2luZyBhZ2FpbgoJICAgICAKCSAgIC0gRml4IHdyYXBwaW5nIG9mIGZ1bmN0aW9ucyBwb2ludGVycyBsaWtlCgoJCSBzdGQ6Om9zdHJlYW0mIHN0ZDo6ZW5kbChzdGQ6Om9zdHJlYW0mKTsKCgkgICAgIGllLCB0aGUgb25lcyB0aGF0IHJldHVybiByZWZlcmVuY2VzIG9yIGVudW1zLgoJIAoJICAgW1B5dGhvbl0gQWRkIHRoZSAlcHl0aG9uY2FsbGJhY2sgZGlyZWN0aXZlLCB3aGljaCBpcyAKCSAgIGFuIGltcHJvdmVkIHZlcnNpb24gb2YgJWNhbGxiYWNrLCBpZSwKCgkgICAgICVweXRob25jYWxsYmFjaygxKSBmb287CgkgICAgICVweXRob25jYWxsYmFjaygxKSBBOjpiYXI7CgkgICAgICVweXRob25jYWxsYmFjaygxKSBBOjpiYXJtOwoKCSAgICAgaW50IGZvbyhpbnQgYSkgewoJICAgICAgICAgcmV0dXJuIGE7CgkgICAgIH0KICAKCSAgICAgc3RydWN0IEEgCgkgICAgIHsKCSAgICAgICBzdGF0aWMgaW50IGJhcihpbnQgYSk7CgkgICAgICAgaW50IGJhcm0oaW50IGEpOwoKCSAgICAgfTsKCiAgICAgICAgICAgICBpbnQgZm9vYmFyKGludCBhLCBpbnQgKCpwZikoaW50IGEpKTsKCgkgICBpbiBweXRob24geW91IGNhbiB1c2UKCiAgICAgICAgICAgICBmb28oMikKCSAgICAgZm9vYmFyKDIsZm9vKQogICAgICAgICAgICAgQS5iYXIoMikKCSAgICAgZm9vYmFyKDIsQS5iYXIpCiAgICAgICAgICAKICAgICAgICAgICBpZSwgbm8gYWRkaXRpb25hbCBwb2ludGVyIGVsZW1lbnRzIGFyZSBjcmVhdGVkLCBhbmQKCSAgIHRoZSBvcmlnaW5hbCAnZm9vJyBhbmQgJ0EuYmFyJyBjYW4gYmUgdXNlZCBhcyBwYXJhbWV0ZXJzLgoKCSAgIEluIHRoZSBjYXNlIG9mIG1lbWJlciBmdWNudGlvbiBob3dldmVyLCBzdGlsbCB5b3UgbmVlZAoJICAgdG8gdXNlIHRoZSBzcGVjaWFsIHZhcmlhYmxlIENsYXNzOjo8Zm5jX25hbWU+X2NiX3B0ciwgaWU6CgogCSAgICAgZm9vYmFybSgzLCBhLCBBLmJhcm1fY2JfcHRyKQoJICAgCgkgICB3ZSB3aWxsIHRyeSB0byBmaXggdGhpcyBzaXR1YXRpb24gYWxzbywgYnV0IGxhdGVyLiAgCgoJICAgW1B5dGhvbl0gQWRkIG1vcmUgZWxlbWVudHMgZnJvbSB0aGUgU1RMIGxpYnJhcnksIG5vdwoJICAgeW91IGNhbiB1c2UKCgkgICAgIGltcG9ydCBzdGQKCSAgICAgc3RkLmNvdXQgPDwgImhlbGxvICIgPDwgMTIzIDw8IHN0ZC5lbmRsCgoJICAgW1B5dGhvbl0gRml4IGluL291dCByZXR1cm4gbWVjaGFuaXNtLCBub3cgc3dpZyB3aWxsIGJlaGF2ZQoJICAgYXMgMS4zLjIxIGJ1dCB1c2luZyBhIHB5dGhvbiBsaXN0IHdoZW4gbmVlZGVkLiBUaGUgcHJvYmxlbQoJICAgaXMgdGhhdCB0aGUgdHlwZXMgc3RkOjpwYWlyLHN0ZDo6dmVjdG9yLGV0YywgdXNlIHR1cGxlcywKCSAgIGFuZCB0aGV5IGludGVyZmVyIHdpdGggdGhlIHByZXZpb3VzIGlub3V0IHR1cGxlIHR5cGUuCgoJICAgQnkgdXNpbmcgbGlzdHMgd2Ugc29sdmUgdGhlIGNvbmZsaWN0cywgc3dpZyBhY3RzIGFzIGJlZm9yZSwKCSAgIGJ1dCByZXR1cm5zIGEgbGlzdCB3aGVuIG1vcmUgdGhhbiBvbmUgcGFyYW1ldGVyIGFyZSB1c2luZwoJICAgdGhlIE9VVCB0eXBlbWFwLiBTZWUgdGhlIG5ldyBpbm91dC5pIGV4YW1wbGUgaW4gdGhlCgkgICB0ZXN0LXN1aXRlLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIFBZVEhPTiBNT0RVTEUgKioqCgkJICAgCiAgICAgICAgICAgW1B5dGhvbl0gTXVjaCBiZXR0ZXIgZXJyb3IgbWVzc2FnZXMgZm9yIGJhZCBhcmd1bWVudHMsIG5vdwoJICAgeW91IGFsd2F5cyBnZXQgdGhlIGFyZ3VtZW50IG51bWJlciB3aGVyZSB0aGUgZXJyb3Igb2NjdXJyZWQuCgowOS8yNy8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBQYXRjaCBmcm9tIEJpbGwgQ2xhcmtlIC0KICAgICAgICAgICAgMSkgV2FybmluZyBlbWl0dGVkIHdoZW4gLWltcG9ydGFsbCBhbmQgLWluY2x1ZGVhbGwgaXMgdXNlZCB0b2dldGhlciwKICAgICAgICAgICAgICAgd2l0aCAtaW5jbHVkZWFsbCB0YWtpbmcgcHJlY2VkZW5jZS4KICAgICAgICAgICAgMikgRW5zdXJlIFNXSUdJTVBPUlRFRCBpcyBhbHdheXMgZGVmaW5lZCB3aGVuIGEgZmlsZSBpcyBiZWluZwogICAgICAgICAgICAgICBpbXBvcnRlZCB3aXRoICVpbXBvcnQuIE5vdGUgdGhhdCB0aGlzIGlzIG5vdCB0aGUgc2FtZSBhcyBTV0lHSU1QT1JULAogICAgICAgICAgICAgICB3aGljaCBnZXRzIGRlZmluZWQgaW4gYWxsIGdlbmVyYXRlZCB3cmFwcGVyIGZpbGVzLgoKMDkvMjYvMjAwNDogbW1hdHVzCgoJICAgIC0gYWRkICVmZWF0dXJlKCJleGNlcHRpb25jbGFzcyIpIHRvIGlkZW50aWZ5IGEgY2xhc3MgdXNlZAoJICAgICAgYXMgZXhjZXB0aW9uLiBCZWZvcmUgc3dpZyBpZGVudGlmaWVkIGFuZCBtYXJrZWQgYSBjbGFzcwoJICAgICAgdXNpbmcgdGhlICJjcGx1czpleGNlcHRpb25jbGFzcyIgYXR0cmlidXRlLiBIb3dldmVyLCB0aGUKCSAgICAgIGNsYXNzIG5lZWRlZCB0byBhcHBlYXIgb24gYW4gdGhyb3coKSBzdGF0ZW1lbnQuICBOb3cKCSAgICAgIHN3aWcga2VlcHMgdHJ5aW5nIHRvIGlkZW50aWZ5IHRoZSBleGNlcHRpb24gY2xhc3NlcywgYXMKCSAgICAgIGJlZm9yZSwgYnV0IGl0IGFsc28gYWxsb3dzIHRoZSB1c2VyIHRvIG1hcmsgYSBjbGFzcyBieQoJICAgICAgdXNpbmcgdGhlICVmZWF0dXJlIGV4cGxpY2l0bHkuIChtb3N0bHkgcmVsZXZhbnQgZm9yCgkgICAgICBweXRob24gYW5kIGNoaWNrZW4pCgoJICAgIFtQeXRob25dCgoJICAgIC0gZml4IC1tb2Rlcm4gb3B0aW9uICsgZXhjZXB0aW9ucywgd2hpY2ggbWl4IG9sZCBjbGFzcwoJICAgICAgc3R5bGUgd2l0aCB0aGUgbmV3IG9uZS4gU28sIHdlIGFsd2F5cyBuZWVkIHRvIGVtaXQKCSAgICAgIHRoZSAibm9ubW9kZXJuIiBweXRob24gY29kZS4KCgkgICAgLSBhZGQgdGhlICJweXRob246bm9uZHluYW1pYyIgZmVhdHVyZSBhbmQgaXRzIGhhbmRsZXIKCgkgICAgICBub3cgaWYgeW91IGhhdmUKCSAgICAgIAoJICAgICAgJXB5dGhvbm5vbmR5bmFtaWMoMSkgQTsKCSAgICAgIAoJICAgICAgc3RydWN0IEEgewoJICAgICAgIGludCBhOwoJICAgICAgIGludCBiOwoJICAgICAgfTsKCgkgICAgICB0aGVuLCBpbiB0aGUgcHl0aG9uIHNpZGUKCSAgICAgIAoJICAgICAgYWEgPSBBKCkKCSAgICAgIAoJICAgICAgYWEuYSA9IDEgIyBvawoJICAgICAgYWEuYiA9IDIgIyBvawoJICAgICAgYWEuYyA9IDMgIyBlcnJvciwgdGhlIGNsYXNzIGNhbiBub3QgYmUgZXh0ZW5kZWQgZHluYW1pY2FsbHkuCgoJICAgIAoJICAgIFNpbmNlIHRoaXMgaXMgYSBmZWF0dXJlLCB5b3UgY2FuIHVzZQoKCSAgICAgICVweXRob25ub25keW5hbWljKDEpOwoKICAgICAgICAgICAgb3IgCgoJICAgICAgJXB5dGhvbmR5bmFtaWMoMCk7IFsgTm90ZTogJXB5dGhvbmR5bmFtaWMgc2luY2UgZGVwcmVjYXRlZCBdCiAgIAoJICAgIHRvIGZvcmNlIGFsbCB0aGUgd3JhcHBlZCBjbGFzc2VzIHRvIGJlICJub25keW5hbWljIiBvbmVzLgoKCSAgICBUaGUgZGVmYXVsdCwgYXMgaW4gcmVndWxhciBweXRob24sIGlzIHRoYXQgYWxsIHRoZSB3cmFwcGVkCgkgICAgY2xhc3NlcyBhcmUgZHluYW1pY3MuIFNvLCBjYXJlZnVsIHdpdGggeW91ciBzcGVsbGluZy4KCjA5LzE0LzIwMDQ6IG1tYXR1cyAKCSAgICAtIFN1cHBvcnQgdGhlIC1JLSBvcHRpb24uCgoJICAgIC0gRGlmZmVyZW50aWF0ZSBiZXR3ZWVuICVpbmNsdWRlIDxmaWxlPiBhbmQgJWluY2x1ZGUgImZpbGUiLgoJICAgICAgVGhpcyBmaXggc2V2ZXJhbCBjb3JuZXIgY2FzZXMuCgoJICAgIAoJICAgIFtQeXRob25dIFNldmVyYWwgcGF0Y2hlczoKCgkgICAgLSBOb3JtYWxpemUgdGhlIExpYiBmaWxlIG5hbWVzOiAKCQkqLnN3ZyBpbnRlcm5hbCBmaWxlcywgCgkJKi5pICAgdXNlciBmaWxlcy4KCgkgICAgLSBGaXggQ2hhcltBTlldIHR5cGVtYXBzLCBzbyB0aGV5IGFsc28gZGVsZXRlIGFueSBleHRyYSAnXDAnIGNoYXJzLAoJICAgICAgbm93IHRoZXkgYmVoYXZlIGFzIGJlZm9yZSAoMS4zLjIxKS4gU3RpbGwsIHlvdSBjYW4gdXNlCgkgICAgICB0aGUgU1dJR19QUkVTRVJWRV9DQVJSQVlfU0laRSBtYWNybyBpZiB5b3UgbmVlZCB0bwoJICAgICAgcHJlc2VydmUgdGhlIG9yaWdpbmFsIHNpemUgKHNlZSBweXN0cmJhc2Uuc3dnKS4KCgkgICAgLSBBZGQgdGhlIENoYXIgRklYU0laRVtBTlldIHR5cGVtYXBzLCB0byBwcmVzZXJ2ZSB0aGUKICAgICAgICAgICAgICBvcmlnaW5hbCBDIGFycmF5IHNpemVzIChzZWUgYWJvdmUpLiBUaG91Z2gsIHlvdSBjYW4ndAogICAgICAgICAgICAgIHVzZSB0aGVtIHlldCBzaW5jZSAlYXBwbHkgYW5kIGFycmF5cyBhcmUgbm90IHdvcmtpbmcKICAgICAgICAgICAgICB0b2dldGhlci4KCiAgICAgICAgICAgIC0gQWRkIHB5ZnJhZ21lbnRzLnN3Zywgbm93IHRoZSB1c2VyIGNhbiBhZGQgZnJhZ21lbnRzCgkgICAgICB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCBvbmVzLgoKMDkvMTAvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgUGF0Y2ggZnJvbSBCaWxsIENsYXJrZSB3aGljaCBmaXhlcyBzcHVyaW91cyBwcmVwcm9jZXNzb3IgYnVnIHdoaWNoCiAgICAgICAgICAgIHNob3dzIG9uIFNvbGFyaXMgYW5kIGdjYywgZWc6CiAgICAgICAgICAgICAgICBXYXJuaW5nKDIwMik6IENvdWxkIG5vdCBldmFsdWF0ZSAnIWRlZmluZWQoU1dJR0pBVkEpICYmCiAgICAgICAgICAgICAgICAhKGRlZmluZWQoU1dJR0NTSEFSUCknCiAgICAgICAgICAgIEFsc28gZml4ZXMgYSBidWcgd2hlcmUgJyNpZiAiYSIgPT0gImIiID09IDEnIHdvdWxkbid0IGhhdmUgd29ya2VkIAoKMDkvMTAvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgUmVzdG9yZWQgbXVsdGlwbGUgYnVpbGQgZGlyZWN0b3JpZXMgZm9yIHRoZSB0ZXN0LXN1aXRlLiBQYXRjaCBmcm9tCiAgICAgICAgICAgIEJpbGwgQ2xhcmtlLgoKMDkvMDYvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgQWRkZWQgdGhlIG1pc3NpbmcgcnVudGltZS5kc3AgVmlzdWFsIFN0dWRpbyBwcm9qZWN0IGZpbGVzIGZvciB0aGUKICAgICAgICAgICAgaW1wb3J0IGV4YW1wbGVzIHRvIHdvcmsuCgoKVmVyc2lvbiAxLjMuMjIgKFNlcHRlbWJlciA0LCAyMDA0KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgowOS8wMy8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBUaGUgc3dpZy5tNCBtYWNybyBmb3IgdXNlIHdpdGggdGhlIEF1dG9jb25mL0F1dG9tYWtlL0xpYnRvb2wgaGFzCiAgICAgICAgICAgIGJlZW4gcmVtb3ZlZCBhbmQgaXMgbm8gbG9uZ2VyIGluc3RhbGxlZC4gUGxlYXNlIHVzZSB0aGUgbmV3IGFuZCBiZXR0ZXIKICAgICAgICAgICAgbWFpbnRhaW5lZCB2ZXJzaW9uIGRlcml2ZWQgZnJvbSBzd2lnLm00IGluIHRoZSBBdXRvY29uZiBtYWNybyBhcmNoaXZlLgogICAgICAgICAgICBTZWUgaHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2FjLWFyY2hpdmUvaHRtbGRvYy9hY19wa2dfc3dpZy5odG1sIGFuZAogICAgICAgICAgICBodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvYWMtYXJjaGl2ZS9odG1sZG9jL2FjX3B5dGhvbl9kZXZlbC5odG1sLgoKMDkvMDEvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW1BlcmxdIEFwcGxpZWQgcGF0Y2ggIzEwMTk2NjkgZnJvbSBDaHJpc3RvcGggRmxhbW0uIEFkZHMgc3VwcG9ydAogICAgICAgICAgICBmb3IgJWZlYXR1cmUoInNoYWRvdyIpIGluIHRoZSBzYW1lIHdheSBhcyBpdCB3b3JrcyBpbiBQeXRob24uIFRoaXMKICAgICAgICAgICAgZW5hYmxlcyBvbmUgdG8gb3ZlcnJpZGUgdGhlIGdlbmVyYXRlZCBzaGFkb3cvcHJveHkgbWV0aG9kcywgaW5jbHVkaW5nCiAgICAgICAgICAgIGNvbnN0cnVjdG9ycyBhbmQgZGVzdHJ1Y3RvcnMuIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAvKiBMZXQncyBtYWtlIHRoZSBjb25zdHJ1Y3RvciBvZiB0aGUgY2xhc3MgU3F1YXJlIG1vcmUgdmVyYm9zZSAqLwoKICAgICAgICAgICAgICAlZmVhdHVyZSgic2hhZG93IikgU3F1YXJlKGRvdWJsZSB3KQogICAgICAgICAgICAgICV7CiAgICAgICAgICAgICAgICBzdWIgbmV3IHsKICAgICAgICAgICAgICAgICAgbXkgJHBrZyA9IHNoaWZ0OwogICAgICAgICAgICAgICAgICBteSAkc2VsZiA9IGV4YW1wbGVjOjpuZXdfU3F1YXJlKEBfKTsKICAgICAgICAgICAgICAgICAgcHJpbnQgU1RERVJSICJDb25zdHJ1Y3RlZCBhbiBAe1tyZWYoJHNlbGYpXX1cbiI7CiAgICAgICAgICAgICAgICAgIGJsZXNzICRzZWxmLCAkcGtnIGlmIGRlZmluZWQoJHNlbGYpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICV9CgogICAgICAgICAgICAgIGNsYXNzIFNxdWFyZSB7CiAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgU3F1YXJlKGRvdWJsZSB3KTsKICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgIH07CgowOC8zMS8yMDA0OiBtbWF0dXMgCgkgICAgW1B5dGhvbl0gSW5jb21wYXRpYmlsaXR5IHJlcG9ydGVkIGJ5IEJpbGwgQ2xhcmtlIChsbGliQGNvbXB1dGVyLm9yZyk6CgkgICAgCgkgICAgSWYgeW91IGFyZSB1c2luZyBTdW4gU3R1ZGlvIDggKGFuZCBwb3NzaWJseSBlYXJsaWVyCgkgICAgdmVyc2lvbnMpIHRvIGNvbXBpbGUgdGhlIG91dHB1dCBwcm9kdWNlZCBieSBzd2lnCgkgICAgMS4zLjIycmMxLCBhbmQgeW91IGFyZSB1c2luZyBDKysgYW5kIFNUTCB0ZW1wbGF0ZXMgdGhlbgoJICAgIHlvdSBuZWVkIHRvIHVzZSBlaXRoZXIgIi1ydW50aW1lIiBvciAiLW5vcnVudGltZSIuICBJZiB5b3UKCSAgICB1c2UgbmVpdGhlciBvZiB0aGVzZSBvcHRpb25zIHRoZW4geW91IHdpbGwgcHJvYmFibHkgZ2V0CgkgICAgY29tcGlsZXIgZXJyb3JzIHdoZW4gdHJ5aW5nIHRvIGNvbXBpbGUgdGhlIHdyYXBwZXIgZmlsZTsKCSAgICB0aGUgZXJyb3IgbWVzc2FnZSB3aWxsIGJlIGxpa2UgdGhpczogVGhlIG5hbWUKCSAgICBTV0lHX1B5dGhvbl9Db252ZXJ0UHRyWy4uLl0gaXMgdW51c2FibGUgaW4gc3RhdGljCgkgICAgc3dpZ3B5Ojp0cmFpdHNfYXNwdHJbLi4uXSAgSWYgeW91IGdldCB0aGlzIGVycm9yIG1lc3NhZ2UsCgkgICAgeW91IG5lZWQgdG8gcmVnZW5lcmF0ZSB5b3VyIHdyYXBwZXIgZmlsZSB1c2luZyAnc3dpZwoJICAgIC1ydW50aW1lJyBvciAnc3dpZyAtbm9ydW50aW1lJy4KCgkgICAgWW91IHNob3VsZG4ndCBnZXQgdGhpcyBwcm9ibGVtIHdpdGggU3VuIFN0dWRpbyA5LgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIFBZVEhPTiBNT0RVTEUgKioqCgkgICAgCjA4LzI2LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQZXJsXSBBcHBsaWVkICM5MzIzMzMgZnJvbSBJa2VnYW1pIFRzdXRvbXUuIEZpeGVzIGxvbmcgbG9uZyAqT1VUUFVUCiAgICAgICAgICAgIGFuZCB1bnNpZ25lZCBsb25nIGxvbmcgKk9VVFBVVCB0eXBlbWFwcyBpbiB0eXBlbWFwcy5pLgoKMDgvMjYvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgQXBwbGllZCBwYXRjaCAjODU3MzQ0IGZyb20gQXJ0IFllcmtlcy4gV29ya2Fyb3VuZCBmb3IgYXV0b2NvbmYgYnVnIHdoZW4KICAgICAgICAgICAgcnVubmluZyAnbWFrZSBpbnN0YWxsJy4KCjA4LzI2LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQZXJsXSBQYXJ0IG9mIHBhdGNoICM5ODI3NTMgYXBwbGllZC4gVGhpcyBpbXBsZW1lbnRzIGEgJXBlcmxjb2RlIGRpcmVjdGl2ZS4KICAgICAgICAgICAgSXQgYWxsb3dzIG9uZSB0byBhZGQgUGVybCBjb2RlIHRvIHRoZSBnZW5lcmF0ZWQgLnBtIGZpbGUuIFdvcmtzIHRoZSBzYW1lIAogICAgICAgICAgICBhcyAlcHl0aG9uY29kZS4KCjA4LzI2LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBGaXggZm9yIGRpcmVjdG9ycyB3aGVuIHdyYXBwaW5nIHZpcnR1YWwgbWV0aG9kcyB3aXRoIGV4Y2VwdGlvbgogICAgICAgICAgICBzcGVjaWZpY2F0aW9ucyB0aGF0IHdlcmUgbm90IHNpbXBsZSB0eXBlcy4gUHJldmlvdXNseSBjb2RlIHdhcyBnZW5lcmF0ZWQgdGhhdAogICAgICAgICAgICBkaWRuJ3QgY29tcGlsZSwgZm9yIGV4YW1wbGUgd2hlbiB0aGUgZXhjZXB0aW9uIHNwZWNpZmljYXRpb24gd2FzIGEgcG9pbnRlci4KCjA4LzI1LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gVHlwZW1hcCBmaXggZm9yIG1ldGhvZHMgdGhhdCByZXR1cm4gY2hhciAqLiBUaGUgQ0xSIHdvdWxkIGluY29ycmVjdGx5CiAgICAgICAgICAgIGRlbGV0ZSB0aGUgbWVtb3J5IHBvaW50ZWQgdG8gYnkgY2hhciAqLiBBbHNvIGFwcGxpZWQgdGhlIHNhbWUgY29ycmVjdGlvbiB0bwogICAgICAgICAgICB0aGUgY2hhciBhcnJheSB0eXBlbWFwcy4KCjA4LzI0LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeGVzIGZvciAtZm1pY3Jvc29mdCBlcnJvci93YXJuaW5nIG1lc3NhZ2UgZGlzcGxheTogCiAgICAgICAgICAgIC0gRW5kIG9mIGZpbGUgKEVPRikgd2FybmluZyBtZXNzYWdlcyBub3QgZGlzcGxheWluZyBpbiBjb3JyZWN0IGZvcm1hdAogICAgICAgICAgICAtIFNvbWUgbWVzc2FnZXMgY29udGFpbmluZyBhIGZpbGUgcGF0aCB3ZXJlIGRpc3BsYXlpbmcgYSBkb3VibGUgYmFja3NsYXNoCiAgICAgICAgICAgICAgaW5zdGVhZCBvZiBhIHNpbmdsZSBiYWNrc2xhc2gKCjA4LzIzLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIEFwcGxpZWQgcGF0Y2ggIzEwMTE2MDQgc3VibWl0dGVkIGJ5IENoYXJsZXMgU2Nod2lldGVycy4gRml4IGZvciA2NCBiaXQgdGNsCiAgICAgICAgICAgIGludGVycHJldGVycy4KCjA4LzIzLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBmb3IgYnVnICM4NzU1ODMgLSBlbnVtIGZvcndhcmQgZGVjbGFyYXRpb25zIHByZXZpb3VzbHkgZ2F2ZSBhIHN5bnRheCBlcnJvci4KCjA4LzIzLzIwMDQ6IG1rb2VwcGUKCSAgICBbQWxsZWdybyBDTF0gVXNlIHR5cGVtYXBzICJmZml0eXBlIiBhbmQgImxpc3B0eXBlIiB0byBkZXRlcm1pbmUgdGhlIEZGSSB0eXBlCgkgICAgc3BlY2lmaWVycyBmcm9tIHRoZSBDIHR5cGUuICBUaGlzIG1ha2VzIGl0IHBvc3NpYmxlLCBmb3IgaW5zdGFuY2UsIHRvIGNvbnRyb2wKCSAgICB3aGV0aGVyIGEgQyAiY2hhciIgYXJndW1lbnQgdGFrZXMgYSBMaXNwIGNoYXJhY3RlciBvciBhIExpc3AgaW50ZWdlciB2YWx1ZS4KCSAgICBUaGUgZGVmYXVsdCAodGFraW5nIExpc3AgY2hhcmFjdGVycykgaXMgZG9uZSBieSB0aGVzZSBidWlsdC1pbiB0eXBlbWFwczoKCSAgICAgICV0eXBlbWFwKGZmaXR5cGUpIGNoYXIgIjpjaGFyIjsgJXR5cGVtYXAobGlzcHR5cGUpIGNoYXIgImNoYXJhY3RlciI7CgkgICAgSWYgY2hhciBtZWFucyBhbiBpbnRlZ2VyIGluc3RlYWQsIHVzZSB0aGVzZSB0eXBlbWFwczoKCSAgICAgICV0eXBlbWFwKGZmaXR5cGUpIGNoYXIgIjpjaGFyIjsgJXR5cGVtYXAobGlzcHR5cGUpIGNoYXIgImludGVnZXIiOwoKMDgvMjIvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgQXMgZGlzY3Vzc2VkIGluIGJ1ZyAjNzcyNDUzLCB0aGUgU1dJRyBsaWJyYXJ5IGRpcmVjdG9yeSBpcyBub3cgaW5zdGFsbGVkCiAgICAgICAgICAgIGludG8gYSBkaWZmZXJlbnQgZGVmYXVsdCBkaXJlY3RvcnkuIFRoZSBsaWJyYXJ5IHVzZWQgdG8gYmUgaW5zdGFsbGVkIHRvCiAgICAgICAgICAgIC91c3IvbG9jYWwvbGliL3N3aWcxLjMuIEl0IGlzIG5vdyBpbiB0aGUgbW9yZSB1c3VhbCBhcmNoaXRlY3R1cmUgaW5kZXBlbmRlbnQKICAgICAgICAgICAgZGlyZWN0b3J5IGFuZCBJIGhhdmUgYWRkaXRpb25hbGx5IHVzZWQgYSB2ZXJzaW9uIHNwZWNpZmljIHN1YmRpcmVjdG9yeSBhcwogICAgICAgICAgICB0aGUgbGlicmFyeSB3aWxsIHJhcmVseSB3b3JrIHdpdGggb2xkZXIgdmVyc2lvbnMgb2YgU1dJRy4gVGhpcyByZWxlYXNlCiAgICAgICAgICAgIHdpbGwgdGh1cyB1c2UgL3Vzci9sb2NhbC9zaGFyZS9zd2lnLzEuMy4yMiBieSBkZWZhdWx0LCB3aGljaCBjYW4gYmUKICAgICAgICAgICAgdGFpbG9yZWQgYXMgYmVmb3JlIHVzaW5nICcuL2NvbmZpZ3VyZSAtLXN3aWdsaWJkaXInLgoKMDgvMTcvMjAwNDogbWtvZXBwZQoJICAgIFtNelNjaGVtZV0gQWRkIHN1cHBvcnQgdG8gY3JlYXRlIG5hdGl2ZSBNelNjaGVtZSBzdHJ1Y3R1cmVzIGZyb20gQyBzdHJ1Y3R1cmVzLgoJICAgIFRvIGNvbnZlcnQgYSBDIHN0cnVjdHVyZSB0byBhbiBNelNjaGVtZSBzdHJ1Y3R1cmUsIHVzZSB0aGUgbmV3IHJ1bnRpbWUgbWFjcm8KCSAgICBTV0lHX05ld1N0cnVjdEZyb21QdHIgaW4gYSB0eXBlbWFwLiAgUGF0Y2ggZnJvbSBEbWl0cml5IFphdmluLiAKCjA4LzEyLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFBhdGNoICM4Mzc3MTUgZnJvbSBCZW4gUmVzZXIgdG8gY29ycmVjdGx5IGRldGVjdCBQeXRob24gbGliIGRpcmVjdG9yeQogICAgICAgICAgICBvbiA2NCBiaXQgc3lzdGVtcy4KCjA4LzEyLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDIyBhbmQgSmF2YV0gUHJldmVudCBtZW1vcnkgbGVha3MgaW4gdGhlIGNhc2Ugb2YgZWFybHkgcmV0dXJuCiAgICAgICAgICAgIGZyb20gd3JhcHBlciBtZXRob2RzIHVzaW5nIGNvbnN0IHN0ZDo6c3RyaW5nICYgcGFyYW1ldGVycy4gTW9kaWZpZWQKICAgICAgICAgICAgTWFyayBUcmF1ZHQgcGF0Y2ggIzk1MTU2NS4KCjA4LzEyLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIEJ1ZyAjOTQzNzgzIHdpdGggcGF0Y2ggZml4ZXMgcGhwIGNoYXIgKiBvdXQgdHlwZW1hcCBOVUxMIHZhbHVlcy4KCjA4LzAzLzIwMDQ6IEFobW9uIERhbmN5ICA8ZGFuY3lAZGFuY3k+CgogICAgICAgICAgICBbYWxsZWdyb2NsXSBBZGRpdGlvbmFsIGNhc2UgbW9kZSBmaXhlcy4gIEFsc28sIG1ha2Ugc3VyZQoJICAgIGZvcmVpZ24gdHlwZXMgYXJlIGV4cG9ydGVkLgoKMDcvMjQvMjAwNDogbWtvZXBwZSAKCSAgICBbR3VpbGVdIEluIC1zY20gbW9kZSwgU1dJRyBtb2R1bGVzIG5vdyBleGNoYW5nZSB0aGVpciBwb2ludGVyIHR5cGUKCSAgICBpbmZvcm1hdGlvbiB2aWEgdGhlIEd1aWxlIGludGVycHJldGVyLiAgSXQgaXMgbm8gbG9uZ2VyIG5lY2Vzc2FyeSB0byBidWlsZCBhCgkgICAgcnVudGltZSBsaWJyYXJ5IG9yIHRvIHVzZSAtbm9ydW50aW1lIGFuZCAtcnVudGltZSBldGMuCgkgICAgCgkgICAgVGhlIG1vZHVsZSAoU3dpZyBzd2lncnVuKSB3aGljaCB3YXMgaW50cm9kdWNlZCBpbiB0aGUgY2hhbmdlIG9mIDA1LzE3LzIwMDQgaXMKCSAgICBubyBsb25nZXIgYXV0b21hdGljYWxseSBidWlsdC4gIElmIHlvdSBuZWVkIGl0LCBydW4gU1dJRyBvbiB0aGUgaW50ZXJmYWNlIGZpbGUKCSAgICBzd2lncnVuLmkuIAoKMDcvMjMvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBCdWcgIzkxNzYwMSBNYXBwaW5nIEMrKyBib29sIGZpeCBmcm9tIE1hcmsgVHJhdWR0CgowNy8yMy8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBSUE0gZml4ZXMgZm9yIGxhdGVzdCBDVlMgdmVyc2lvbiBpbmNsdWRpbmcgcmVtb3ZhbCBvZiBydW50aW1lCiAgICAgICAgICAgIGxpYnJhcnkuCgowNy8yMy8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBQYXRjaCAjOTA4OTU1IGZyb20gUm9iZXJ0IEggRGUgVnJpZXMuCiAgICAgICAgICAgIFJQTSBmaWxlIGdlbmVyYXRpb24gZml4IGZvciBGZWRvcmUgQ29yZSAxIGFuZCBSZWRoYXQgQVMyLjEuCgowNy8xMi8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBQYXRjaCAjODY0Njg5IGZyb20gUm9iaW4gRHVubjoKCiAgICAgICAgICAgIFRoaXMgcGF0Y2ggY29ycmVjdHMgdHdvIHByb2JsZW1zIGluIHRoZSBYTUwgb3V0cHV0IG9mIFNXSUc6CiAgICAgICAgICAgICAKICAgICAgICAgICAgICAxLiBUaGVyZSB3ZXJlIG9mdGVuIGV4dHJhICcvPlxuJyBpbiB0aGUgb3V0cHV0LgogICAgICAgICAgICAgIAogICAgICAgICAgICAgIDIuIHZhbHVlIGF0dHJpYnV0ZXMgd2VyZSBvdXRwdXQgd2l0aCAnXG4nIGluIHRoZW0gYnV0CiAgICAgICAgICAgICAgc2luY2UgdGhhdCBpcyBub3QgdGVjaG5pY2FsbHkgbGVnYWwgbW9zdCAoYWxsPykgWE1MCiAgICAgICAgICAgICAgcGFyc2VycyB3aWxsIHN0cmlwIHRoZW0gb3V0LiBSZXBsYWNpbmcgdGhlICdcbicgd2l0aAogICAgICAgICAgICAgIHRoZSAnJiMxMDsnIGVudGl0eSByZWZlcmVuY2Ugc29sdmVzIHRoaXMgYXMgdGhhdCBpcwogICAgICAgICAgICAgIGxlZ2FsIGFuZCBYTUwgcGFyc2VycyB3aWxsIGNvbnZlcnQgaXQgdG8gYSAnXG4nIHdoZW4KICAgICAgICAgICAgICByZWFkaW5nIHRoZSB2YWx1ZXMgYmFjayBpbi4KICAgICAgICAgICAgICAKICAgICAgICAgICAgICBUaGlzIHBhdGNoIGFsc28gYWRkcyBhIG5ldyBnbG9iYWwgY29tbWFuZCBsaW5lIG9wdGlvbgogICAgICAgICAgICAgIHRoYXQgd2lsbCBhbGxvdyB0aGUgcGFyc2UgdHJlZSB0byBiZSB3cml0dGVuIG91dCBpbiBYTUwKICAgICAgICAgICAgICAqYWZ0ZXIqIHNvbWUgb3RoZXIgbGFuZ3VhZ2UgbW9kdWxlIGhhcyBiZWVuIHJ1biwgaW4KICAgICAgICAgICAgICBvcmRlciB0byBiZSBhYmxlIHRvIGdldCBleHRyYSBpbmZvIHRoYXQgdGhlIGxhbmd1YWdlCiAgICAgICAgICAgICAgbW9kdWxlIHB1dHMgaW4gdGhlIHRyZWUuIEluIHRoaXMgd2F5IHRoZSBYTUwgaXMgYQogICAgICAgICAgICAgIHBvc3QtcHJvY2Vzc2VkIHZlcnNpb24gb2YgdGhlIHRyZWUgcmF0aGVyIHRoYW4gYQogICAgICAgICAgICAgIHByZS1wcm9jZXNzZWQgdmVyc2lvbi4gCiAKICAgICAgICAgICAgICBDb21tYW5kIGxpbmUgb3B0aW9uIGlzIC1kdW1wX3htbCBvciAteG1sb3V0IDxmaWxlPgoKMDcvMTIvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIFBhdGNoIGZyb20gU2NvdHQgTWljaGVsIHRvIGZpeCB0eXBlc2FmZSBlbnVtcyBhbmQgcHJvcGVyIGVudW1zCiAgICAgICAgICAgIHdpdGggZGlyZWN0b3JzLgoKMDcvMTIvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgSFRNTCBkb2N1bWVudGF0aW9uIChtYWtlY2hhcC5weSkgZmlsZSBnZW5lcmF0b3IgbWlzc2luZyBlbmQgb2YgbGluZQogICAgICAgICAgICBwYXRjaCAjOTA4OTUxIGZyb20gUm9iZXJ0IGRlIFZyaWVzLgoKMDcvMDgvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgVGhlIGRlcHJlY2F0ZWQgcnVudGltZSBsaWJyYXJ5IGJ1aWxkIGhhcyBiZWVuIHJlbW92ZWQuIFRoaXMgYWxzbyByZW1vdmVzCiAgICAgICAgICAgIHRoZSBkZXBlbmRlbmN5IG9uIExpYnRvb2wuIExpYnRvb2wgaXMgbm8gbG9uZ2VyIHJlcXVpcmVkIHRvIGJ1aWxkIFNXSUcuCiAgICAgICAgICAgIFRoZSBhc3NvY2lhdGVkIC1sZGZsYWdzIFNXSUcgY29tbWFuZGxpbmUgb3B0aW9uIGhhcyBhbHNvIGJlZW4gcmVtb3ZlZC4KCiAgICAgICAgICAgIFRoZSBleGFtcGxlcyBhbmQgdGVzdC1zdWl0ZSB0ZXN0Y2FzZXMgdGhhdCB1c2VkIHRoZSBydW50aW1lIGxpYnJhcnkgaGF2ZQogICAgICAgICAgICBiZWVuIHVwZGF0ZWQgdG8gdXNlIHRoZSByZXBsYWNlbWVudCBhcHByb2FjaCB0byB1c2luZyBTV0lHIGFjcm9zcyAKICAgICAgICAgICAgbXVsdGlwbGUgbW9kdWxlcywgdGhhdCBpcyB0aGV5IHVzZSB0aGUgLW5vcnVudGltZSBhbmQgLXJ1bnRpbWUgY29tbWFuZGxpbmUKICAgICAgICAgICAgb3B0aW9ucywgc2VlIE1vZHVsZXMuaHRtbC4gRWZmZWN0aXZlbHkgdGhleSBidWlsZCB0aGVpciBvd24gcnVudGltZQogICAgICAgICAgICBsaWJyYXJpZXMgdXNpbmcgLXJ1bnRpbWUuIFRoZSBleGFtcGxlcyBhcmUgaW1wb3J0IGFuZCBpbXBvcnRfdGVtcGxhdGUuCiAgICAgICAgICAgIFRoZSB0ZXN0IGNhc2VzIGFyZSBpbiB0aGUgaW1wb3J0cyBhbmQgdGVtcGxhdGVfdHlwZWRlZl9pbXBvcnQgZGlyZWN0b3JpZXMuCgogICAgICAgICAgICBBbnlvbmUgd2hvIHdhbnRzIHRoZSBvcmlnaW5hbCBydW50aW1lIGxpYnJhcmllcyBjYW4gZWl0aGVyIHJ1biB0aGUgdGVzdC1zdWl0ZQogICAgICAgICAgICBvciBidWlsZCB0aGUgZXhhbXBsZXMgYW5kIHVzZSB0aGUgYXBwcm9wcmlhdGUgc2hhcmVkIG9iamVjdC9ETEwgdGhhdCBpcwogICAgICAgICAgICBnZW5lcmF0ZWQgd2l0aCB0aGUgLXJ1bnRpbWUgY29tbWFuZGxpbmUgb3B0aW9uLiBGb3IgZXhhbXBsZSBsaWJpbXBvcnRzX3J1bnRpbWUuc28KICAgICAgICAgICAgKFB5dGhvbiBjYWxscyBpdCBsaWJfaW1wb3J0c19ydW50aW1lLnNvKSBpcyBnZW5lcmF0ZWQgYWZ0ZXIgcnVubmluZyB0aGUgCiAgICAgICAgICAgICdtYWtlIGltcG9ydHMubXVsdGljcHB0ZXN0JyB0ZXN0Y2FzZSBpbiB0aGUgRXhhbXBsZXMvdGVzdC1zdWl0ZS88bGFuZz4KICAgICAgICAgICAgZGlyZWN0b3J5LiBPciB1c2UgbGlicnVudGltZS5zbyAvIHJ1bnRpbWUuZGxsIGFmdGVyIGJ1aWxkaW5nIHRoZSBpbXBvcnQKICAgICAgICAgICAgZXhhbXBsZXMgaW4gRXhhbXBsZXMvPGxhbmc+L2ltcG9ydC4KCjA3LzA3LzIwMDQ6IG1rb2VwcGUKCSAgICBbQWxsZWdybyBDTF0gQ29udmVydCBjaGFyYWN0ZXIgYW5kIHN0cmluZyBsaXRlcmFscyBpbiBjb25zdGFudHMgdG8gCgkgICAgQ0wgc3ludGF4LiAgRml4IEZGOkRFRi1GT1JFSUdOLUNBTEwgZm9yIG1peGVkLWNhc2UgQyBmdW5jdGlvbnMuCgowNi8yNy8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gTmV3IGZlYXR1cmUgZm9yIEphdmEgZXhjZXB0aW9ucyB3aXRoIGZvcm1hdCAlamF2YWV4Y2VwdGlvbihleGNlcHRpb25jbGFzc2VzKS4KICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGlzIGEgc2xpZ2h0IGVuaGFuY2VtZW50IHRvICVleGNlcHRpb24gYW5kIHRoZSBvbmx5IGRpZmZlcmVuY2UgaXMgdGhlIAogICAgICAgICAgICBhZGRpdGlvbiBvZiB0aGUgZXhjZXB0aW9uIGNsYXNzZXMgd2hpY2ggYXJlIGdlbmVyYXRlZCBpbnRvIGEgdGhyb3dzIGNsYXVzZS4KICAgICAgICAgICAgVGhlICdleGNlcHRpb25jbGFzc2VzJyBpcyBhIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIGNsYXNzZXMgd2hpY2ggd2lsbCBiZQogICAgICAgICAgICBhZGRlZCB0byB0aGUgYXNzb2NpYXRlZCBwcm94eSBtZXRob2QncyB0aHJvd3MgY2xhdXNlLiBUaGUgJ2V4Y2VwdGlvbmNsYXNzZXMnCiAgICAgICAgICAgIGFyZSBzcGVjaWZpZWQgbGlrZSB0aGUgZXhjZXB0aW9uIGNsYXNzZXMgaW4gdGhlICd0aHJvd3MnIGF0dHJpYnV0ZSBpbiB0aGUKICAgICAgICAgICAgdHlwZW1hcHMuIFRoaXMgZmVhdHVyZSBzaG91bGQgYmUgdXNlZCBmb3IgY29ycmVjdGx5IGhhbmRsaW5nIGNoZWNrZWQgZXhjZXB0aW9ucwogICAgICAgICAgICB0aHJvd24gZnJvbSBKTkkgY29kZS4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICVqYXZhZXhjZXB0aW9uKCJqYXZhLmxhbmcuRXhjZXB0aW9uIikgdGhyb3dFeGNlcHRpb24gJXsKICAgICAgICAgICAgICAgIC4uLiBjb252ZXJ0IGEgc3RkOjpsb2dpY19lcnJvciBpbnRvIGEgamF2YS5sYW5nLkV4Y2VwdGlvbiB1c2luZyBKTkkgY29kZSAuLi4KICAgICAgICAgICAgICAlfQoKICAgICAgICAgICAgICAjaW5jbHVkZSA8c3RkZXhjZXB0PgogICAgICAgICAgICAgIHZvaWQgdGhyb3dFeGNlcHRpb24oKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBzdGQ6OmxvZ2ljX2Vycm9yKCJMb2dpYyBlcnJvciEiKTsKICAgICAgICAgICAgICB9CgogICAgICAgICAgICB3aWxsIGdlbmVyYXRlIGEgbWV0aG9kIHdpdGggYSB0aHJvd3MgY2xhdXNlIGluIHRoZSBtb2R1bGUgY2xhc3M6CgogICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB0aHJvd0V4Y2VwdGlvbigpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uIHsgLi4uIH0KCjA2LzI3LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gTmV3ICVjc2NvbnN0dmFsdWUodmFsdWUpIGZlYXR1cmUgZGlyZWN0aXZlIGZvciB1c2Ugd2l0aCBjb25zdGFudHMgYW5kCiAgICAgICAgICAgIGVudW1zLiBUaGlzIHdvcmtzIHRoZSBzYW1lIHdheSBhcyAlamF2YWNvbnN0dmFsdWUuIEZvciBDIywgdGhpcyBkaXJlY3RpdmUKICAgICAgICAgICAgaXMgdGhlIG9ubHkgd2F5IHRoYXQgb25lIGNhbiBmaXggd3JhcHBpbmcgb2YgQy9DKysgZW51bXMgd2l0aCBwcm9wZXIgQyMKICAgICAgICAgICAgZW51bXMgaWYgdGhlIGVudW0gaXRlbSdzIGluaXRpYWxpc2VyIGNhbm5vdCBjb21waWxlIGFzIEMjIGNvZGUuIFRoaXMgaXMKICAgICAgICAgICAgYmVjYXVzZSBKYXZhIGVudW1zIGNhbiB1c2UgYSBjYWxsIGludG8gQyBjb2RlIHRvIGluaXRpYWxpc2UgdGhlIGVudW0gaXRlbSwKICAgICAgICAgICAgd2hlcmVhcyBpbiBDIywgdGhlIGVudW0gdmFsdWUgbXVzdCBiZSBhIGNvbXBpbGUgdGltZSBjb25zdGFudC4gVGhhdCBpcywKICAgICAgICAgICAgdXNpbmcgJWNzY29uc3QoMCkgY2Fubm90IGJlIHVzZWQgaW4gQyMgdG8gaW5pdGlhbGlzZSB0aGUgQyMgZW51bSBpdGVtIHZpYQogICAgICAgICAgICBhIFBJTlZPS0UgY2FsbC4KCjA2LzI3LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBOZXcgJWphdmFjb25zdHZhbHVlKHZhbHVlKSBmZWF0dXJlIGRpcmVjdGl2ZSBmb3IgdXNlIHdpdGggY29uc3RhbnRzIGFuZAogICAgICAgICAgICBlbnVtcy4gU29tZXRpbWVzIHRoZSB1c2Ugb2YgJWphdmFjb25zdCgxKSB3aWxsIHByb2R1Y2UgY29kZSB0aGF0IHdvbid0IGNvbXBpbGUKICAgICAgICAgICAgdW5kZXIgSmF2YS4gSWYgYSBjb21waWxlIHRpbWUgY29uc3RhbnQgaXMgcmVxdWlyZWQsICVqYXZhY29uc3QoMCkgaXMgbm90IGFuCiAgICAgICAgICAgIG9wdGlvbi4gVGhlICVqYXZhY29uc3R2YWx1ZSBkaXJlY3RpdmUgYWNoaWV2ZXMgdGhpcyBnb2FsIGFuZCB0aGUgdmFsdWUgc3BlY2lmaWVkCiAgICAgICAgICAgIGlzIGdlbmVyYXRlZCBhcyBKYXZhIGNvZGUgdG8gaW5pdGlhbGlzZSB0aGUgY29uc3RhbnQuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgJWphdmFjb25zdCgxKTsKICAgICAgICAgICAgICAlamF2YWNvbnN0dmFsdWUoMTAwMCkgQklHOwogICAgICAgICAgICAgICVqYXZhY29uc3R2YWx1ZSgibmV3IGphdmEubWF0aC5CaWdJbnRlZ2VyKFwiMjAwMFwiKSIpIExBUkdFOwogICAgICAgICAgICAgICVqYXZhY29uc3R2YWx1ZSgxMCkgYmFyOwogICAgICAgICAgICAgICV7CiAgICAgICAgICAgICAgICBjb25zdCBpbnQgYmFyID0gMTA7CiAgICAgICAgICAgICAgJX0KICAgICAgICAgICAgICAlaW5saW5lICV7CiAgICAgICAgICAgICAgICAjZGVmaW5lIEJJRyAxMDAwTEwKICAgICAgICAgICAgICAgICNkZWZpbmUgTEFSR0UgMjAwMFVMTAogICAgICAgICAgICAgICAgZW51bSBGb28geyBCQVIgPSA6OmJhciB9OwogICAgICAgICAgICAgICV9CgogICAgICAgICAgICBHZW5lcmF0ZXM6CgogICAgICAgICAgICAgIHB1YmxpYyBpbnRlcmZhY2UgZXhhbXBsZUNvbnN0YW50cyB7CiAgICAgICAgICAgICAgICBwdWJsaWMgZmluYWwgc3RhdGljIGxvbmcgQklHID0gMTAwMDsKICAgICAgICAgICAgICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgamF2YS5tYXRoLkJpZ0ludGVnZXIgTEFSR0UgPSBuZXcgamF2YS5tYXRoLkJpZ0ludGVnZXIoIjIwMDAiKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgcHVibGljIGZpbmFsIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICBwdWJsaWMgZmluYWwgc3RhdGljIEZvbyBCQVIgPSBuZXcgRm9vKCJCQVIiLCAxMCk7CiAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICB9CgogICAgICAgICAgICBQcmV2aW91c2x5LCBub25lIG9mIEJJRywgTEFSR0Ugb3IgQkFSIHdvdWxkIGhhdmUgcHJvZHVjZWQgY29tcGlsZWFibGUgY29kZQogICAgICAgICAgICB3aGVuIHVzaW5nICVqYXZhY29uc3QoMSkuCgowNi8yNy8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICAlZmVhdHVyZSBlbmhhbmNlbWVudHMuIEZlYXR1cmVzIGNhbiBub3cgdGFrZSBhbiB1bmxpbWl0ZWQgbnVtYmVyIG9mIGF0dHJpYnV0ZXMKICAgICAgICAgICAgaW4gYWRkaXRpb24gdG8gdGhlIGZlYXR1cmUgbmFtZSBhbmQgZmVhdHVyZSB2YWx1ZS4gVGhlIGF0dHJpYnV0ZXMgYXJlIG9wdGlvbmFsIAogICAgICAgICAgICBhbmQgYXJlIG11Y2ggdGhlIHNhbWUgYXMgdGhlIHR5cGVtYXAgYXR0cmlidXRlcy4gRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcKICAgICAgICAgICAgc3BlY2lmaWVzIHR3byBvcHRpb25hbCBhdHRyaWJ1dGVzLCBhdHRyaWIxIGFuZCBhdHRyaWIyOgoKICAgICAgICAgICAgICVmZWF0dXJlKGZlYXR1cmVuYW1lLCBhdHRyaWIxPSJhdHRyaWJ2YWwxIiwgYXR0cmliMj0iYXR0cmlidmFsMiIpIG5hbWUgInZhbCI7CiAgICAgICAgICAgICAlZmVhdHVyZShmZWF0dXJlbmFtZSwgdmFsLCBhdHRyaWIxPSJhdHRyaWJ2YWwxIiwgYXR0cmliMj0iYXR0cmlidmFsMiIpIG5hbWU7CgowNi8yNy8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICAlZmVhdHVyZSBpbXByb3ZlbWVudHMgZm9yIHRoZSBzeW50YXggdGhhdCB0YWtlcyB0aGUgZmVhdHVyZSB2YWx1ZSB3aXRoaW4gdGhlCiAgICAgICAgICAgICVmZWF0dXJlKCkgYnJhY2tldHMuIFRoZSB2YWx1ZSBzcGVjaWZpZWQgaXMgbm8gbG9uZ2VyIHJlc3RyaWN0ZWQgdG8gYmVpbmcganVzdAogICAgICAgICAgICBhIHN0cmluZy4gSXQgY2FuIGJlIGEgc3RyaW5nIG9yIGEgbnVtYmVyLiBGb3IgZXhhbXBsZSwgdGhpcyBpcyBub3cgYWNjZXB0YWJsZQogICAgICAgICAgICBzeW50YXg6CiAgICAgICAgICAgICAgJWZlYXR1cmUoImZlYXR1cmVuYW1lIiwyMC4wKTsKICAgICAgICAgICAgd2hlcmVhcyBwcmV2aW91c2x5IGl0IHdvdWxkIGhhdmUgdG8gaGF2ZSBiZWVuOgogICAgICAgICAgICAgICVmZWF0dXJlKCJmZWF0dXJlbmFtZSIsIjIwLjAiKTsKICAgICAgICAgICAgVXNlZnVsIGZvciBmZWF0dXJlcyB0aGF0IGFyZSBpbXBsZW1lbnRlZCBhcyBhIG1hY3JvLCBmb3IgZXhhbXBsZToKICAgICAgICAgICAgICAjZGVmaW5lICVzb21lZmVhdHVyZSh2YWx1ZSkgICAgICAlZmVhdHVyZSgic29tZWZlYXR1cmUiLHZhbHVlKQogICAgICAgICAgICBUaGVzZSB3aWxsIG5vdyB3b3JrIGFjY2VwdGluZyBlaXRoZXIgYSBzdHJpbmcgb3IgYSBudW1iZXI6CiAgICAgICAgICAgICAgJXNvbWVmZWF0dXJlKCJGcmVkIik7CiAgICAgICAgICAgICAgJXNvbWVmZWF0dXJlKDQpOwoKMDYvMDYvMjAwNDogd3V6emViIChKb2huIExlbnopCiAgICAgICAgICAgIFtDaGlja2VuLCBHdWlsZV0KICAgICAgICAgICAgIC0gQ3JlYXRlZCB0aGUgRXhhbXBsZXMvdGVzdC1zdWl0ZS9zY2hlbWVydW5tZSBkaXJlY3RvcnksIHdoaWNoIGhvbGRzIGFsbCB0aGUKCSAgICAgICBydW5tZSBzY3JpcHRzIGZvciBndWlsZSBhbmQgY2hpY2tlbiAoYW5kIHBvc3NpYmx5IG16c2NoZW1lLi4uKS4gIFRoZSBndWlsZQoJICAgICAgIGFuZCBjaGlja2VuIF9ydW5tZSBmaWxlcyB0aGVuIChsb2FkICIuLi9zY2hlbWVydW5tZS9mb28uc2NtIikuCiAgICAgICAgICAgICAtIEluIGNoaWNrZW4gbW9kdWxlLCBmaXggYSBmZXcgYnVncyBpbnZsb2x2aW5nIGR5bmFtaWMgY2FzdHMuCgowNi8wMy8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBQYXRjaCB0byBmaXggd3JhcHBpbmcgb2YgdGVtcGxhdGVkIG1ldGhvZHMuIElTTyBjb21wbGlhbnQgY29tcGlsZXJzLCBsaWtlCiAgICAgICAgICAgIENvbWVhdSBhbmQgR0NDLTMuNC4wLCBkb24ndCBsaWtlIHRoZSB0ZW1wbGF0ZSBzcGVjaWZpZXIgdGhhdCBTV0lHIHdhcyBnZW5lcmF0aW5nCiAgICAgICAgICAgIHdoZW4gY2FsbGluZyB0aGUgbWV0aG9kLiBUaGlzIGZpeCBtYXkgYnJlYWsgc29tZSBub24gc3RhbmRhcmQgY29tcGxpYW50IGNvbXBpbGVycywKICAgICAgICAgICAgZm9yIGV4YW1wbGUsIFN1biB3b3Jrc2hvcCBjb21waWxlcnMgcHJpb3IgdG8gdmVyc2lvbiA2LjIucDIuIFBhdGNoIHN1Ym1pdHRlZAogICAgICAgICAgICBieSBCaWxsIENsYXJrZS4KCjA2LzAzLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhLCBDI10gVW5kb2N1bWVudGVkIHNwZWNpYWwgdmFyaWFibGUgJGltY2xhc3NuYW1lIHJlbW92ZWQuCiAgICAgICAgICAgIE5ldyBzcGVjaWFsIHZhcmlhYmxlICRtb2R1bGUgaXMgcmVwbGFjZWQgYnkgdGhlIG1vZHVsZSBuYW1lLCBhcyBzcGVjaWZpZWQKICAgICAgICAgICAgYnkgJW1vZHVsZSBvciAtbW9kdWxlIGNvbW1hbmRsaW5lIG9wdGlvbi4gJGltY2xhc3NuYW1lIGNhbiBiZSBjcmVhdGVkIGZyb20gJG1vZHVsZS4KCjA2LzAzLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gU2FtZSBhcyBmb3IgSmF2YSBiZWxvdy4gVGhlIG5ldyB0eXBlbWFwcyBhcmUgbmFtZWQgZGlmZmVyZW50bHksIG5hbWVseSwKICAgICAgICAgICAgY3Nib2R5IGFuZCBjc2JvZHlfZGVyaXZlZC4gVGhlIGRlcHJlY2F0ZWQgdHlwZW1hcHMgYXJlIGNzZ2V0Y3B0ciBhbmQKICAgICAgICAgICAgY3NwdHJjb25zdHJ1Y3Rvcm1vZGlmaWVycy4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBDIyBNT0RVTEUgKioqCgowNi8wMy8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gVHlwZW1hcCBjaGFuZ2VzIGZvciB0aGUgSmF2YSBwcm94eSAvIHR5cGV3cmFwcGVyIGFuZCBlbnVtIGNsYXNzZXMuIEEgbmV3CiAgICAgICAgICAgIHR5cGVtYXAgY2FsbGVkIGphdmFib2R5IGNvbnRhaW5zIHRoZSBlc3NlbnRpYWwgc3VwcG9ydCBjb2RlIGZvciBnZW5lcmF0aW9uIGludG8gdGhlIGJvZHkKICAgICAgICAgICAgb2YgdGhlc2UgY2xhc3Nlcy4gVGhlcmUgaXMgYWxzbyBhIG5ldyBqYXZhYm9keV9kZXJpdmVkIHR5cGVtYXAgd2hpY2ggaXMgdXNlZCBpbnN0ZWFkIGZvcgogICAgICAgICAgICB3cmFwcGVkIGNsYXNzZXMgdGhhdCBoYXZlIGEgd3JhcHBlZCBiYXNlIGNsYXNzLiBUaGUgY29kZSBpcyBiYXNpY2FsbHksIHRoZSBnZXRDUHRyKCkKICAgICAgICAgICAgbWV0aG9kIGFuZCBzd2lnQ1B0ciBhbmQgc3dpZ0NNZW1Pd24gbWVtYmVyIHZhcmlhYmxlcy4gVGhlc2UgdXNlZCB0byBiZSBoYXJkIGNvZGVkCiAgICAgICAgICAgIHdpdGggbm8gd2F5IHRvIG1vZGlmeSB0aGUgY29kZS4gVGhlIGludHJvZHVjdGlvbiBvZiB0aGlzIHR5cGVtYXAgbWFrZXMgaXQgcG9zc2libGUgZm9yCiAgICAgICAgICAgIHRoZSB1c2VyIHRvIHRhaWxvciBuZWFybHkgZXZlcnkgYXNwZWN0IG9mIHRoZSBjb2RlIGdlbmVyYXRpb24uCiAgICAgICAgICAgIFRoZSBleGNlcHRpb24gbm93IGlzIHRoZSBjb2RlIGZvciBkaXJlY3RvciBjbGFzc2VzLgoKICAgICAgICAgICAgVGhlIGphdmFnZXRjcHRyIGFuZCBqYXZhcHRyY29uc3RydWN0b3Jtb2RpZmllcnMgdHlwZW1hcHMgYXJlIGRlcHJlY2F0ZWQgYW5kIGFyZQogICAgICAgICAgICBubyBsb25nZXIgdXNlZCBhcyB0aGUgY29kZSB0aGF0IHRoZXNlIGdlbmVyYXRlZCBjYW4gYmUgcHV0IGluIHRoZSBtb3JlIGZsZXhpYmxlCiAgICAgICAgICAgIGphdmFib2R5IGFuZCBqYXZhYm9keV9kZXJpdmVkIHR5cGVtYXBzLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEpBVkEgTU9EVUxFICoqKgoKICAgICAgICAgICAgVGhlIGZvbGxvd2luZyBtYWNyb3MgY29udHJpYnV0ZWQgYnkgU2NvdHQgTWljaGVsIG1heSBoZWxwIHlvdSB1cGdyYWRlIGlmIHlvdSBoYXZlIHVzZWQKICAgICAgICAgICAgdGhlIGphdmFnZXRjcHRyIHR5cGVtYXA6CgogICAgICAgICAgICAgICAgLyogVXRpbGl0eSBtYWNybyBmb3IgbWFuaXB1bGF0aW5nIHRoZSBKYXZhIGJvZHkgY29kZSBtZXRob2QgYXR0cmlidXRlcyAqLwogICAgICAgICAgICAgICAgJWRlZmluZSBTV0lHSkFWQV9BVFRSSUJTKFRZUEVOQU1FLCBDVE9SX0FUVFJJQiwgR0VUQ1BUUl9BVFRSSUIpCiAgICAgICAgICAgICAgICAldHlwZW1hcChqYXZhYm9keSkgVFlQRU5BTUUgJXsKICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBsb25nIHN3aWdDUHRyOwogICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBzd2lnQ01lbU93bjsKCiAgICAgICAgICAgICAgICAgIENUT1JfQVRUUklCICRqYXZhY2xhc3NuYW1lKGxvbmcgY1B0ciwgYm9vbGVhbiBjTWVtb3J5T3duKSB7CiAgICAgICAgICAgICAgICAgICAgc3dpZ0NNZW1Pd24gPSBjTWVtb3J5T3duOwogICAgICAgICAgICAgICAgICAgIHN3aWdDUHRyID0gY1B0cjsKICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgR0VUQ1BUUl9BVFRSSUIgc3RhdGljIGxvbmcgZ2V0Q1B0cigkamF2YWNsYXNzbmFtZSBvYmopIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gKG9iaiA9PSBudWxsKSA/IDAgOiBvYmouc3dpZ0NQdHI7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICV9CgogICAgICAgICAgICAgICAgJXR5cGVtYXAoamF2YWJvZHlfZGVyaXZlZCkgVFlQRU5BTUUgJXsKICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBsb25nIHN3aWdDUHRyOwoKICAgICAgICAgICAgICAgICAgQ1RPUl9BVFRSSUIgJGphdmFjbGFzc25hbWUobG9uZyBjUHRyLCBib29sZWFuIGNNZW1vcnlPd24pIHsKICAgICAgICAgICAgICAgICAgICBzdXBlcigkbW9kdWxlSk5JLlNXSUckamF2YWNsYXNzbmFtZVVwY2FzdChjUHRyKSwgY01lbW9yeU93bik7CiAgICAgICAgICAgICAgICAgICAgc3dpZ0NQdHIgPSBjUHRyOwogICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICBHRVRDUFRSX0FUVFJJQiBzdGF0aWMgbG9uZyBnZXRDUHRyKCRqYXZhY2xhc3NuYW1lIG9iaikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAob2JqID09IG51bGwpID8gMCA6IG9iai5zd2lnQ1B0cjsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJX0KICAgICAgICAgICAgICAgICVlbmRkZWYKCiAgICAgICAgICAgICAgICAvKiBUaGUgZGVmYXVsdCBpcyBwcm90ZWN0ZWQgZ2V0Q1B0ciwgcHJvdGVjdGVkIGNvbnN0cnVjdG9yICovCiAgICAgICAgICAgICAgICBTV0lHSkFWQV9BVFRSSUJTKFNXSUdUWVBFLCBwcm90ZWN0ZWQsIHByb3RlY3RlZCkKCiAgICAgICAgICAgICAgICAvKiBQdWJsaWMgZ2V0Q1B0ciBtZXRob2QsIHByb3RlY3RlZCBjb25zdHJ1Y3RvciAqLwogICAgICAgICAgICAgICAgJWRlZmluZSBQVUJMSUNfR0VUQ1BUUihUWVBFTkFNRSkKICAgICAgICAgICAgICAgIFNXSUdKQVZBX0FUVFJJQlMoVFlQRU5BTUUsIHByb3RlY3RlZCwgcHVibGljKQogICAgICAgICAgICAgICAgJWVuZGRlZgoKICAgICAgICAgICAgICAgIC8qIFB1YmxpYyBnZXRDUHRyIG1ldGhvZCwgcHVibGljIGNvbnN0cnVjdG9yICovCiAgICAgICAgICAgICAgICAlZGVmaW5lIFBVQkxJQ19CT0RZTUVUSE9EUyhUWVBFTkFNRSkKICAgICAgICAgICAgICAgIFNXSUdKQVZBX0FUVFJJQlMoVFlQRU5BTUUsIHB1YmxpYywgcHVibGljKQogICAgICAgICAgICAgICAgJWVuZGRlZgoKMDYvMDMvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEsIEMjXSBUaGUgY29udGVudHMgb2YgdGhlIGNsYXNzIG1vZGlmaWVyIHR5cGVtYXBzIGFuZCBwcmFnbWFzIGhhdmUgY2hhbmdlZC4KICAgICAgICAgICAgVGhleSBtdXN0IG5vdyBpbmNsdWRlIHRoZSBjbGFzcyB0eXBlLiBQcmV2aW91c2x5ICdjbGFzcycgd2FzIGhhcmQgY29kZWQuCiAgICAgICAgICAgIFRoaXMgY2hhbmdlIGVuYWJsZXMgZmxleGliaWxpdHkgaW50byB3aGF0IHR5cGUgb2YgY2xhc3MgaXMgZ2VuZXJhdGVkLAogICAgICAgICAgICBmb3IgZXhhbXBsZSB0aGUgcHJveHkgY2xhc3MgY291bGQgYmUgYW4gaW50ZXJmYWNlIGluc3RlYWQgb2YgYSBjbGFzcy4KCiAgICAgICAgICAgIEZvciBKYXZhIHRoaXMgYWZmZWN0cyB0aGUgamF2YWNsYXNzbW9kaWZpZXJzIHR5cGVtYXAgYW5kIHRoZSBqbmljbGFzc2NsYXNzbW9kaWZpZXJzCiAgICAgICAgICAgIGFuZCBtb2R1bGVjbGFzc21vZGlmaWVycyBwcmFnbWFzLgoKICAgICAgICAgICAgRm9yIEMjIHRoaXMgYWZmZWN0cyB0aGUgY3NjbGFzc21vZGlmaWVycyB0eXBlbWFwIGFuZCB0aGUgaW1jbGFzc2NsYXNzbW9kaWZpZXJzCiAgICAgICAgICAgIGFuZCBtb2R1bGVjbGFzc21vZGlmaWVycyBwcmFnbWFzLgoKICAgICAgICAgICAgVW5sZXNzIHlvdSBoYXZlIG92ZXJyaWRkZW4gdGhlIGRlZmF1bHQgdmVyc2lvbnMgb2YgdGhlc2UgdHlwZW1hcHMgb3IgcHJhZ21hcywgeW91CiAgICAgICAgICAgIHNob3VsZG4ndCBiZSBhZmZlY3RlZC4gSG93ZXZlciwgaWYgeW91IGhhdmUsIHVwZ3JhZGluZyBpcyBlYXN5LCBmb3IgZXhhbXBsZQoKICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7fTsKICAgICAgICAgICAgICAgICV0eXBlbWFwKGphdmFjbGFzc21vZGlmaWVycykgRm9vICJwdWJsaWMgZmluYWwiCgogICAgICAgICAgICBtdXN0IG5vdyBiZToKCiAgICAgICAgICAgICAgICBjbGFzcyBGb28ge307CiAgICAgICAgICAgICAgICAldHlwZW1hcChqYXZhY2xhc3Ntb2RpZmllcnMpIEZvbyAicHVibGljIGZpbmFsIGNsYXNzIgoKCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBDIyBNT0RVTEUgKioqCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBKQVZBIE1PRFVMRSAqKioKCjA1LzMxLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBmb3IgQysrIGV4Y2VwdGlvbiBzcGVjaWZpY2F0aW9ucyB0aGF0IGFyZSByZWZlcmVuY2VzLiBQcm9ibGVtIHJlcG9ydGVkIGJ5CiAgICAgICAgICAgIE9yZW4gTWlsbGVyLiBBbHNvIGltcHJvdmVzIHRoZSBnZW5lcmF0ZWQgZXhjZXB0aW9uIGRlY2xhcmF0aW9ucyBpbiB0aGUKICAgICAgICAgICAgY2F0Y2ggaGFuZGxlciBmb3IgcG9pbnRlcnMgLSBhIHBvaW50ZXIgaXMgdXNlZCBpbnN0ZWFkIG9mIGEgcmVmZXJlbmNlIHRvCiAgICAgICAgICAgIGEgcG9pbnRlci4gQWRkZWQgZGVmYXVsdCB0aHJvd3MgdHlwZW1hcHMgZm9yIFNXSUdUWVBFICYsIFNXSUdUWVBFICogYW5kCiAgICAgICAgICAgIFNXSUdUWVBFW0FOWV0gKEphdmEgYW5kIEMjKS4KCjA1LzMxLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhLCBDI10gU29tZSBtaW5vciB0eXBlc2FmZSBlbnVtIGltcHJvdmVtZW50cywgaW5jbHVkaW5nIHN0b3JpbmcgdGhlIG5hbWUgb2YKICAgICAgICAgICAgdGhlIGVudW0gaXRlbS4gVGhlIHRvU3JpbmcoKSAvIFRvU3RyaW5nKCkgbWV0aG9kcyBhcmUgb3ZlcnJpZGRlbiB0byByZXR1cm4gdGhpcyBuYW1lLgoKMDUvMzAvMjAwNDogd3V6emViIChKb2huIExlbnopCiAgICAgICAgICAgIFtDaGlja2VuXSAKCSAgICAgLSBVcGRhdGUgaG93IGV4YW1wbGVzIGFuZCB0aGUgdGVzdCBzdWl0ZSBhcmUgYnVpbHQuCgkgICAgIC0gU3ltYm9sIG5hbWVzIGFyZSBubyBsb25nZXIgY29udmVydGVkIHRvIGxvd2VyIGNhc2UKCSAgICAgLSBBZGRlZCB1bmlvbl9ydW5tZS5zcywgd2hpY2ggd2FzIGNvcGllZCBhbmQgbW9kaWZpZWQgZnJvbSB0aGUgZ3VpbGUgbW9kdWxlCgowNS8yNi8yMDA0OiBsYmFsbGFiaW8gKEx1aWdpIEJhbGxhYmlvKQogICAgICAgICAgICBDb21taXR0ZWQgb24gYmVoYWxmIG9mIE1hcmNlbG8gKHdobyBzdGlsbCBoYXMgcHJvYmxlbXMgd2l0aCAKCSAgICB0aGUgU291cmNlRm9yZ2UgQ1ZTLikKCgkgICAgQWRkZWQgUHl0aG9uIHR5cGVtYXBzIGZvciBGSUxFKiB3aXRoIChQeXRob24tb25seSkgdGVzdC4KCjUvMjQvMjAwNDogIGRhbmN5CgoJKiBBbGxlZ3JvIENMIG1vZHVsZTogIE5vdyB1c2luZyBzb21lIG1hY3JvcyAoZGVmaW5lZCBpbgoJTGliL2FsbGVncm9jbC9hbGxlZ3JvY2wuc3dnKSwgc3dpZy1kZWZjb25zdGFudCBhbmQgc3dpZy1kZWZ1biwgZm9yCglkZWZpbmluZyBjb25zdGFudHMgYW5kIGZvcmVpZ24gZnVuY3Rpb25zLiAgVGhpcyBtYWtlcyB0aGUKCWdlbmVyYXRlZCBmaWxlIGEgYml0IG5lYXRlci4gICAgCgoJTm93IHN0cmlwcyBhIGxheWVyIG9mIHBhcmVudGhlc2lzIGZyb20gY29uc3RhbnRzLgoKCVVzZXMgKCogOnZvaWQpIGluc3RlYWQgb2YgOmZvcmVpZ24tYWRkcmVzcyBub3cuCgowNS8yMC8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBVbm5hbWVkIGVudW0gZ2xvYmFsIHZhcmlhYmxlcyBhcmUgbm93IHN1cHBvcnRlZCBpbiBhZGRpdGlvbgogICAgICAgICAgICB0byB0aGUgcmVjZW50bHkgYWRkZWQgc3VwcG9ydCBmb3IgdW5uYW1lZCBlbnVtIG1lbWJlciB2YXJpYWJsZXMuCiAgICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgIHN0cnVjdCBGb28gewogICAgICAgICAgICAgICAgICBlbnVtIHsgZW51bTEsIGVudW0yIH0gTWVtYmVySW5zdGFuY2U7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgZW51bSB7IGVudW0zLCBlbnVtNCB9IEdsb2JhbEluc3RhbmNlOwoKICAgICAgICAgICAgVGhlIGludCB0eXBlbWFwcyBhcmUgdXNlZCBmb3Igd3JhcHBpbmcgdGhlIGdldC9zZXQgYWNjZXNzb3IgbWV0aG9kcy4KICAgICAgICAgICAgSWYgdGhlIHNpemVvZiBhbiBlbnVtIGlzIG5vdCB0aGUgc2FtZSBzaXplIGFzIGFuIGludCB0aGVuIHNldHRpbmcgdGhlCiAgICAgICAgICAgIHZhcmlhYmxlIHdpbGwgc2lsZW50bHkgZG8gbm90aGluZyBhcyB0aGUgY2FzdHMgY2Fubm90IGJlIGVhc2lseSBhbmQgcG9ydGFibHkKICAgICAgICAgICAgZ2VuZXJhdGVkLiBJZiB5b3UgbmVlZCB0byBzb2x2ZSB0aGlzIGhpZ2hseSBvYnNjdXJlIHNpdHVhdGlvbiwgd3JpdGUKICAgICAgICAgICAgdGhlIGFzc2lnbm1lbnQgdXNpbmcgdGhlICVleGNlcHRpb24gZmVhdHVyZS4KCjA1LzIwLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gQyMgZW51bSB3cmFwcGluZyBtb2RzLiBTaW1pbGFyIHRvIHRoZSBKYXZhIG1vZHVsZSwgZW51bXMgY2FuIGJlIHdyYXBwZWQgdXNpbmcKICAgICAgICAgICAgb25lIG9mIDMgYXBwcm9hY2hlczoKCiAgICAgICAgICAgIDEpIFByb3BlciBDIyBlbnVtcyAtIHVzZSAlaW5jbHVkZSAiZW51bXMuc3dnIgogICAgICAgICAgICAyKSBUeXBlc2FmZSBlbnVtcyAtIHVzZSAlaW5jbHVkZSAiZW51bXR5cGVzYWZlLnN3ZyIKICAgICAgICAgICAgMykgU2ltcGxlIGNvbnN0YW50IGludGVnZXJzIChvcmlnaW5hbCBhcHByb2FjaCkgLSB1c2UgJWluY2x1ZGUgImVudW1zaW1wbGUuc3dnIgoKICAgICAgICAgICAgU2VlIGVhY2ggb2YgdGhlc2UgZmlsZXMgZm9yIGZ1cnRoZXIgZGV0YWlscy4gRWFjaCBvZiB0aGVzZSBmaWxlcyB1c2UgdHlwZW1hcHMKICAgICAgICAgICAgYW5kIGEgbmV3IGZlYXR1cmUgdG8gY29udHJvbCB0aGUgZ2VuZXJhdGVkIGNvZGUuIFRoZSBmZWF0dXJlIGlzOgoKICAgICAgICAgICAgICAgICVjc2VudW0od3JhcGFwcHJvYWNoKTsKCiAgICAgICAgICAgIHdoZXJlIHdyYXBhcHByb2FjaCBzaG91bGQgYmUgb25lIG9mOiAicHJvcGVyIiwgInR5cGVzYWZlIiwgInR5cGV1bnNhZmUiIG9yICJzaW1wbGUiLgogICAgICAgICAgICBbTm8gaW1wbGVtZW50YXRpb24gZGVlbWVkIG5lY2Vzc2FyeSBmb3IgdHlwZSB1bnNhZmUgZW51bXNdLgoKICAgICAgICAgICAgVGhlIGRlZmF1bHQgYXBwcm9hY2ggaXMgcHJvcGVyIEMjIGVudW1zLiBBbm9ueW1vdXMgZW51bXMgYXJlIGFsd2F5cyB3cmFwcGVkIGJ5CiAgICAgICAgICAgIGNvbnN0YW50IGludGVnZXJzLiAKCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBDIyBNT0RVTEUgKioqCgowNS8yMC8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gSmF2YSBlbnVtIHN1cHBvcnQgYWRkZWQuIFRoZXJlIGFyZSBub3cgNCB3YXlzIGluIHdoaWNoIGVudW1zIGNhbiBiZSB3cmFwcGVkOgoKICAgICAgICAgICAgMSkgUHJvcGVyIEphdmEgZW51bXMgLSB1c2UgJWluY2x1ZGUgImVudW1zLnN3ZyIKICAgICAgICAgICAgMikgVHlwZXNhZmUgZW51bXMgLSB1c2UgJWluY2x1ZGUgImVudW10eXBlc2FmZS5zd2ciCiAgICAgICAgICAgIDMpIFR5cGUgdW5zYWZlIGVudW1zIChjb25zdGFudCBpbnRlZ2VycykgLSB1c2UgJWluY2x1ZGUgImVudW10eXBldW5zYWZlLnN3ZyIKICAgICAgICAgICAgNCkgU2ltcGxlIGNvbnN0YW50IGludGVnZXJzIChvcmlnaW5hbCBhcHByb2FjaCkgLSB1c2UgJWluY2x1ZGUgImVudW1zaW1wbGUuc3dnIgoKICAgICAgICAgICAgU2VlIGVhY2ggb2YgdGhlc2UgZmlsZXMgZm9yIGZ1cnRoZXIgZGV0YWlscy4gRWFjaCBvZiB0aGVzZSBmaWxlcyB1c2UgdHlwZW1hcHMKICAgICAgICAgICAgYW5kIGEgbmV3IGZlYXR1cmUgdG8gY29udHJvbCB0aGUgZ2VuZXJhdGVkIGNvZGUuIFRoZSBmZWF0dXJlIGlzOgoKICAgICAgICAgICAgICAgICVqYXZhZW51bSh3cmFwYXBwcm9hY2gpOwoKICAgICAgICAgICAgd2hlcmUgd3JhcGFwcHJvYWNoIHNob3VsZCBiZSBvbmUgb2Y6ICJwcm9wZXIiLCAidHlwZXNhZmUiLCAidHlwZXVuc2FmZSIgb3IgInNpbXBsZSIuCiAgICAgICAgICAgIFRoZSBkZWZhdWx0IHR5cGVtYXBzIHdpbGwgaGFuZGxlIGVudW1zIHRoYXQgbWF5IG9yIG1heSBub3QgaGF2ZSBzcGVjaWZpZWQgaW5pdGlhbAogICAgICAgICAgICB2YWx1ZXMsIGZvciBleGFtcGxlIHRlbiBpcyBzcGVjaWZpZWQ6CgogICAgICAgICAgICAgICAgZW51bSBOdW1iZXJzIHsgemVybywgdGVuKDEwKSB9OwoKICAgICAgICAgICAgSG93ZXZlciwgdGhlIGFtb3VudCBvZiBnZW5lcmF0ZWQgSmF2YSBjb2RlIGNhbiBiZSBjdXQgZG93biwgYnkgbW9kaWZ5aW5nIHRoZXNlIHR5cGVtYXBzCiAgICAgICAgICAgIGlmIG5vbmUgb2YgdGhlIGVudW1zIGhhdmUgaW5pdGlhbCB2YWx1ZXMgKHByb3BlciBKYXZhIGVudW1zIGFuZCB0eXBlc2FmZSBlbnVtcyBhcHByb2FjaCkuCiAgICAgICAgICAgIAogICAgICAgICAgICBUaGUgZGVmYXVsdCBhcHByb2FjaCBpcyB0eXBlc2FmZSBlbnVtcy4gQW5vbnltb3VzIGVudW1zIGFyZSBhbHdheXMgd3JhcHBlZCBieQogICAgICAgICAgICBjb25zdGFudCBpbnRlZ2Vycy4gCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgSkFWQSBNT0RVTEUgKioqCgowNS8xMS8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YSwgQyNdIEZpeCBidWcgdXNpbmcgJXJlbmFtZSBvbiBlbnVtIGl0ZW1zIGFuZCB3aGVuIHVzaW5nCiAgICAgICAgICAgICVqYXZhY29uc3QoMSkgLyAlY3Njb25zdCgxKQogICAgICAgICAgICBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyB1c2VkIHRvIGdlbmVyYXRlIGNvZGUgdGhhdCB3b3VsZG4ndCBjb21waWxlOgoKICAgICAgICAgICAgICAgICVyZW5hbWUoT2JqKSBPYmplY3Q7CiAgICAgICAgICAgICAgICBlbnVtIEdyYW1tYXIgeyBTdWJqZWN0LCBPYmplY3QgfTsKCjA0LzI4LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhLCBDI10gTWlub3IgZml4ZXMgd2hlbiB1c2luZyBjb21iaW5hdGlvbnMgb2YgdGhlIAogICAgICAgICAgICBqYXZhaW50ZXJmYWNlcywgamF2YWJhc2UsIGNzaW50ZXJmYWNlcyBhbmQgY3NiYXNlIHR5cGVtYXBzLgoKMDUvMTgvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEpWTSBsaW5rIGZhaWx1cmUgb24gc29tZSBzeXN0ZW1zIGZpeGVkIHdoZW4gdXNpbmcgc3RkX3ZlY3Rvci5pLgogICAgICAgICAgICBBbHNvIGFkZHMgZGVmYXVsdCB2ZWN0b3IgY29uc3RydWN0b3IgZm9yIHVzZSBmcm9tIEphdmEuCgowNS8xNy8yMDA0OiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgoJICAgIFtHdWlsZV0gTmV3IHJ1bnRpbWUgZnVuY3Rpb25zIFNXSUdfUG9pbnRlckFkZHJlc3MsCgkgICAgU1dJR19Qb2ludGVyVHlwZSwgU1dJR19Jc1BvaW50ZXJPZlR5cGUsIFNXSUdfSXNQb2ludGVyLgoKCSAgICBbR3VpbGVdIEluIC1zY20gbW9kZSwgd3JhcCBzZXZlcmFsIFNXSUcgcnVudGltZSBmdW5jdGlvbnMKCSAgICBhbmQgZXhwb3J0IHRoZW0gaW50byB0aGUgbW9kdWxlIChTd2lnIHN3aWdydW4pLiAgVGhlCgkgICAgcnVudGltZSBtb2R1bGUgaXMgbm93IGJ1aWx0IHdpdGggIm1vZHVsZSIgbGlua2FnZS4KCgkgICAgW0d1aWxlXSBHT09QUyBwcm94eSBvYmplY3RzIG5vdyBhbHNvIHByaW50IHRoZSBwb2ludGVyCgkgICAgYWRkcmVzcyBvZiB0aGUgQyBvYmplY3QuCgowNS8xNC8yMDA0OiBseWxlCiAgICAgICAgICAgIEFkZGVkIEtvdSdzIHBhdGNoIGZvciB0aGUgUnVieSAlaW1wb3J0IGRpcmVjdGl2ZSBzbyB0aGF0IG1vZHVsZXMKICAgICAgICAgICAgd2l0aCAibmVzdGVkIiBuYW1lcyBhcmUgaGFuZGxlZCBwcm9wZXJseS4gQ29uc2lkZXIgYW4gaW50ZXJmYWNlCiAgICAgICAgICAgIGZpbGUgZm9vLmkgdGhhdCBoYXMgdGhpcyAlbW9kdWxlIGRlY2xhcmF0aW9uIGF0IGl0cyB0b3A6CgogICAgICAgICAgICAgICAgJW1vZHVsZSAibWlzYzo6dGV4dDo6Zm9vIgoKICAgICAgICAgICAgTm93IGNvbnNpZGVyIGFub3RoZXIgaW50ZXJmYWNlIGZpbGUgc3BhbS5pIHRoYXQgaW1wb3J0cyBmb28uaToKCiAgICAgICAgICAgICAgICAlaW1wb3J0IGZvby5pCiAgICAgICAgICAgIAogICAgICAgICAgICBCZWZvcmUgdGhpcyBwYXRjaCwgdGhpcyB3b3VsZCByZXN1bHQgaW4gdGhlIGZvbGxvd2luZyBjb2RlIGJlaW5nCiAgICAgICAgICAgIGdlbmVyYXRlZCBmb3Igc3BhbV93cmFwLmM6CgogICAgICAgICAgICAgICAgcmJfcmVxdWlyZSgibWlzYzo6dGV4dDo6Zm9vIik7CgogICAgICAgICAgICBXaXRoIHRoaXMgcGF0Y2gsIGhvd2V2ZXIsIHlvdSdsbCBnZXQgdGhlIGNvcnJlY3QgcGF0aCBuYW1lCiAgICAgICAgICAgIGZvciB0aGUgY2FsbCB0byByYl9yZXF1aXJlKCksIGUuZy4KCiAgICAgICAgICAgICAgICByYl9yZXF1aXJlKCJtaXNjL3RleHQvZm9vIik7CgogICAgICAgICAgICBTZWUgU291cmNlRm9yZ2UgQnVnICM5MjgyOTkuCgowNS8xMi8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBQYXRjaCBmb3IgZW1pdHRpbmcgZGlyZWN0b3JzIHdoZW4gJWZlYXR1cmUoImRpcmVjdG9yIikgc3BlY2lmaWVkCiAgICAgICAgICAgIGZvciBhIGNsYXNzIHdpdGggbm8gdmlydHVhbCBtZXRob2RzLCBidXQgZG9lcyBoYXZlIGEgdmlydHVhbCBkZXN0cnVjdG9yLgogICAgICAgICAgICBTdWJtaXR0ZWQgYnkgS2V2aW4gU21pdGguCgowNS8wNi8yMDA0OiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgTmV3IFNXSUcgcnVudGltZSBmdW5jdGlvbiBTV0lHX1R5cGVQcmV0dHlOYW1lLCB3aGljaCAKCSAgICByZXR1cm5zIGFuIHVubWFuZ2xlZCB0eXBlIG5hbWUgZm9yIGEgc3dpZ190eXBlX2luZm8KCSAgICBvYmplY3QuIAoKCSAgICBbR3VpbGVdOiBVc2UgaXQgZm9yIHByaW50aW5nIHBvaW50ZXIgb2JqZWN0cy4KCjA1LzAzLzIwMDQ6ICBkYW5jeSAoQWhtb24gRGFuY3kpCgoJKiBMaWIvYWxsZWdyb2NsL2FsbGVncm9jbC5zd2c6ICBVcGRhdGVkIGNvbW1lbnRzIGFib3V0IGlkZW50aWZlcgoJY29udmVyc2lvbi4gIAoKCSogU291cmNlcy9Nb2R1bGVzL2FsbGVncm9jbC5jeHg6ICBSZWdpc3RlciAvZGV2L251bGwgZm9yICJoZWFkZXIiCgl0YXJnZXQuICAgQWxzbywgZGlzcmVnYXJkICJjb25zdCIgcXVhbGlmaWVycyBkdXJpbmcgdHlwZQoJY29udmVyc2lvbi4gIAoKCQowNS8wMi8yMDA0OiB3dXp6ZWIgKEpvaG4gTGVueikKCSAgICBbQ2hpY2tlbl0gRml4IGJ1ZyA3ODI0NjguCgkgICAgVG8gZml4IHRoaXMgYnVnLCB0aGUgcnVudGltZSBjb2RlIGhhcyBiZWVuIHJld3JpdHRlbiwgYW5kCgkgICAgcG9pbnRlcnMgYXJlIG5vdyByZXByZXNlbnRlZCBhcyBhIENfU1dJR19QT0lOVEVSX1RZUEUuCgoJICAgIENoaWNrZW4gdmVyc2lvbiA+IDEuNDAgaXMgbm93IHJlcXVpcmVkIQoKCSAgICAqIFR5cGVtYXAgaW5jb21wYXRpYmlsaXR5OiAgdHlwZW1hcHMgbm8gbG9uZ2VyIHVzZSBjaGlja2VuX3dvcmRzLgoJICAgICAgSWYgYSB0eXBlbWFwIG5lZWRzIHNvbWUgc3BhY2UsIGl0IHNob3VsZCBqdXN0IGNhbGwgQ19hbGxvYwoKCSAgICAqIGFyZ291dCB0eXBlbWFwcyBubyBsb25nZXIgdXNlIHRoZSAvKiBpZiBPTkUgKi8gY29uc3RydWN0IHRvCgkgICAgICBidWlsZCBhbiBvdXRwdXQgbGlzdC4gIEEgU1dJR19BUFBFTkRfVkFMVUUgbWFjcm8sIGV4YWN0bHkgbGlrZQoJICAgICAgZ3VpbGUgYW5kIG16c2NoZW1lIGlzIG5vdyB1c2VkLgoKMDQvMjUvMjAwNDogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtHdWlsZV0gSW4gdGhlIGdlbmVyYXRlZCBHT09QUyBjb2RlLCBkb24ndCBjcmVhdGUgbWV0aG9kcwoJICAgIHRoYXQgd291bGQgbm90IHNwZWNpYWxpemUgYW55IGFyZ3VtZW50czsgc2ltcGx5IHJlLWV4cG9ydAoJICAgIHRoZSBwcmltaXRpdmUgZnVuY3Rpb25zLiAgKFRoaXMgaXMgYSBwZXJmb3JtYW5jZQoJICAgIG9wdGltaXphdGlvbiB3aGljaCByZWR1Y2VzIGxvYWQgdGltZSBhbmQgZXhlY3V0aW9uIHRpbWUuKQoKCSAgICBbR3VpbGVdIEluIC1naCBtb2RlLCBmaXggdGhlICJ0b28gbWFueSBpbml0aWFsaXplcnMiIGVycm9yCgkgICAgd2hpY2ggd2FzIGNhdXNlZCBieSBhbiBpbmNvbXBhdGlibGUgc3dpZ190eXBlX2luZm8gbGF5b3V0LgoKCSAgICBbR3VpbGVdIFRoZSB0eXBlbWFwIGZvciBGSUxFICogaW4gcG9ydHMuaSBub3cgYWxzbyBhY2NlcHRzCgkgICAgYSByZWd1bGFyIEZJTEUgKiBwb2ludGVyIG9iamVjdC4gIEFsc28gYSBidWcgd2l0aCBTY2hlbWUKCSAgICBmaWxlIHBvcnRzIHRoYXQgYXJlIG9wZW4gZm9yIGlucHV0IGFuZCBvdXRwdXQgaGFzIGJlZW4KCSAgICBmaXhlZC4gCgowNC8yNS8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBDaGFuZ2UgZW50cnkgMDMvMjEvMjAwNCByZXZva2VkLiBUaGUgY2hhbmdlIGludHJvZHVjZWQgYW5vdGhlcgogICAgICAgICAgICBpbmNvbnNpc3RlbmN5IChyZWZlcmVuY2UgdHlwZW1hcHMgYmVpbmdzIHVzZWQgaW5zdGVhZCBvZgogICAgICAgICAgICBwb2ludGVyIHR5cGVtYXBzIGZvciBtZW1iZXIgdmFyaWFibGVzIGFzIHdlbGwgYXMgc3RhdGljCiAgICAgICAgICAgIG1lbWJlciB2YXJpYWJsZXMgYW5kIGdsb2JhbCB2YXJpYWJsZXMgZm9yIHNvbWUgbGFuZ3VhZ2VzLAogICAgICAgICAgICBidXQgb25seSBmb3IgQysrIGFuZCBub3QgQykuIFRoaXMgd291bGQgYnJlYWsgdXNlcidzIGN1cnJlbnQKICAgICAgICAgICAgdHlwZW1hcHMgYW5kIGludHJvZHVjZSBmdXJ0aGVyIGluY29uc2lzdGVuY2llcy4gQWx0ZXJuYXRpdmUKICAgICAgICAgICAgc29sdXRpb24gcmVxdWlyZWQgYW5kIGJlaW5nIGRpc2N1c3NlZC4KCjA0LzEwLzIwMDQ6IG1tYXR1cyAoTWFyY2VsbyBNYXR1cykgCgkgICAgCgkgICAgQWRkZWQgdGhlIC1kaXJlY3RvcnMgZmxhZy4gVGhpcyBlbmFibGVzIHRoZSBkaXJlY3RvcgoJICAgIG1vZGUgZm9yIHRoZSBpbnRlcmZhY2UgYW5kIGFsbCB0aGUgY2xhc3NlcyB0aGF0CgkgICAgZG9uJ3Qgc2V0IHRoZSAiZmVhdHVyZTpub2RpcmVjdG9yIiBleHBsaWNpdGx5LgoKCSAgICBZb3UgY2FuIHVzZSB0aGlzIGluIHlvdXIgbW9kdWxlIGlmIHlvdSB3YW50IHRvIHVzZSB0aGUKCSAgICBkaXJlY3RvciBmZWF0dXJlIGluIGFsbCB5b3VyIGNsYXNzZXMsIGJ1dCBpdCBpcyBtb3N0CgkgICAgaW50ZW5kZWQgZm9yIHRlc3RpbmcgcHVycG9zZXMsIGxpa2U6CgoJICAgICAgbWFrZSBjaGVjay1weXRob24tdGVzdC1zdWl0ZSBTV0lHPSIuLi8uLi8uLi9zd2lnICAtZGlyZWN0b3JzIgoJICAgICAgbWFrZSBjaGVjay1ydWJ5LXRlc3Qtc3VpdGUgU1dJRz0iLi4vLi4vLi4vc3dpZyAgLWRpcmVjdG9ycyIKCSAgICAgIG1ha2UgY2hlY2stamF2YS10ZXN0LXN1aXRlIFNXSUc9Ii4uLy4uLy4uLy4uL3N3aWcgIC1kaXJlY3RvcnMiCgoJICAgIFRoZXNlIGNvbW1hbmRzIHdpbGwgcnVuIHRoZSBlbnRpcmUgdGVzdC1zdWl0ZSB1c2luZwoJICAgIGRpcmVjdG9ycywgYW5kIG5vdCBvbmx5IHRoZSBzcGVjaWZpYyAnZGlyZWN0b3JzXyonCgkgICAgY2FzZXMuIFRoaXMgc2hvdWxkIGJlIGRvbmUgZnJvbSB0aW1lIHRvIHRpbWUuCgowNC8xMC8yMDA0OiBtbWF0dXMgKE1hcmNlbG8gTWF0dXMpIAoJICAgIAoJICAgIFtweXRob25dIEFkZGVkIHN1cHBvcnQgZm9yIHN0ZDo6d3N0cmluZyBhbmQgd2NoYXJfdCwKCSAgICBmb3IgY29tcGlsZXIgYW5kIHB5dGhvbiB2ZXJzaW9ucyB0aGF0IHN1cHBvcnQgdGhlbS4KCSAgICAKCSAgICBXaGVuIG5lZWRlZCwgdXNlIAoKCSAgICAgJWlubGN1ZGUgc3RkX3N0cmluZy5pICAgICAgLy8gJ2NoYXInIHN0cmluZ3MKCSAgICAgJWlubGN1ZGUgc3RkX3dzdHJpbmcuaSAgICAgLy8gJ3djaGFyX3Q7IHN0cmluZ3MKCSAgICAKCjA0LzEwLzIwMDQ6IG1tYXR1cyAoTWFyY2VsbyBNYXR1cykgCgkgICAgCgkgICAgW3B5dGhvbl0gRml4IHRoZSBkZWZhdWx0IGJlaGF2aW91ciAoc2VnLiBmYXVsdCkgd2hlbiBhbgoJICAgIGlucGxhY2Ugb3BlcmF0b3IgKCs9LC09LC4uLikgd2FzIHdyYXBwZWQsIGFzIHJlcG9ydGVkIGJ5CgkgICAgTHVjcml6IChsdWNyaXpAc2l0aWxhbmRpYS5pdCksIHdoZW4gdGhlIG1vc3QgY29tbW9uCgkgICAgZm9ybSB3YXMgdXNlZDoKCiAgICAgICAgICAgICAgICAgICBBJiAgQTo6b3BlcmF0b3IrPShpbnQgaSkgeyAuLi47IHJldHVybiAqdGhpczsgfQogICAgICAgICAgICAgICAgICBeXl5eICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXl5eXl5eCgkgICAgCgoJICAgIGllLCBhbiBvYmplY3QgaXMgcmV0dXJuZWQgYW5kIGl0cyBjb250YWlucyB0aGUgc2FtZSAndGhpcycKCSAgICB2YWx1ZSB0aGFuIHRoZSBpbnB1dCBvYmplY3QsIHdoaWNoIGlzIGRlbGV0ZWQgYWZ0ZXIgdGhlCgkgICAgb3BlcmF0aW9uICJhICs9IGIiLCBsZWF2aW5nIHRoZSByZXN1bHQgd2l0aCBubyByZWFsCgkgICAgb2JqZWN0LCBidXQgYSBzZWcuIGZhdWx0LgoKCSAgICBUbyBmaXggaXQsIHdlIG5lZWRlZCB0byBpbnRyb2R1Y2UgYSBuZXcgZmVhdHVyZSBhbmQgdXNlIGFuCgkgICAgb2xkIG9uZToKCiAgICAgICAgICAgICAgICVmZWF0dXJlKCJzZWxmOmRpc293biIpIEE6Om9wZXJhdG9yKz07CiAgICAgICAgICAgICAgICVmZWF0dXJlKCJuZXciKSBBOjpvcGVyYXRvcis9OwoJICAgIAoJICAgIGhlcmUsICJzZWxmOmRpc293biIgZGlzYWJsZSB0aGUgb3duZXJzaGlwIG9mIHRoZSAnc2VsZicKCSAgICBvciBpbnB1dCBvYmplY3QsIGFuZCB0aGUgIm5ldyIgZmVhdHVyZSB0cmFuc2ZlcnMgdGhlCgkgICAgb3duZXJzaGlwIHRvIHRoZSByZXN1bHQgb2JqZWN0LgoJICAgIAoJICAgIFRoZSBmZWF0dXJlL3NvbHV0aW9uIGNvdWxkIGFsc28gYmUgdXNlZCBpbiBvdGhlciBsYW5ndWFnZXMKCSAgICB0aGF0IHVzZSBnYyBhbmQgaW1wbGVtZW50IHRoZSBpbnBsYWNlIG9wZXJhdG9ycywgb3Igb3RoZXIKCSAgICBvcGVyYXRvcnMsIGluIGEgc2ltaWxhciB3YXkuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgUHl0aG9uIE1PRFVMRSAqKioKCgkgICAgSWYgeW91IGFscmVhZHkgYXJlIHVzaW5nIHRoZSBpbnBsYWNlIG9wZXJhdG9ycyBpbiBweXRob24sCgkgICAgYW5kIHlvdSBpbXBsZW1lbnRlZCBzb21lIGtpbmQgb2Ygd29ya2Fyb3VuZCB0byB0aGUgcHJvYmxlbQoJICAgIGZpeGVkIGhlcmUsIGl0IGlzIHBvc3NpYmxlIHlvdSBjb3VsZCBlbmQgd2l0aCAnZnJlZScKCSAgICBvYmplY3RzIHRoYXQgbmV2ZXIgZ2V0IGRlbGV0ZWQuIElmIHRoYXQgaXMgdGhlIGNhc2UsIGFuZAoJICAgIHlvdSB3YW50IHRvIGRpc2FibGUgdGhlIGN1cnJlbnQgZml4LCB1c2U6CgogICAgICAgICAgICAgICAlZmVhdHVyZSgic2VsZjpkaXNvd24iLCIiKSBBOjpvcGVyYXRvcis9OwogICAgICAgICAgICAgICAlZmVhdHVyZSgibmV3IiwiIikgQTo6b3BlcmF0b3IrPTsKCgowNC8wNy8yMDA0OiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0MjXSBDKysgZW51bXMgYXJlIG5vIGxvbmdlciB3cmFwcGVkIGJ5IGludGVnZXJzLCB0aGV5IGFyZSBub3cgd3JhcHBlZCBieSAKICAgICAgICAgICAgQyMgZW51bXMuIEZvciBFeGFtcGxlLCBnaXZlbiBDKys6CgogICAgICAgICAgICAgICAgZW51bSBBbkVudW0geyBmb28sIGJhciB9OwogICAgICAgICAgICAgICAgdHlwZWRlZiBBbkVudW0gQW5FbnVtZXJhdGlvbjsKICAgICAgICAgICAgICAgIHZvaWQgc29tZXRoaW5nKEFuRW51bSBlLCBBbkVudW1lcmF0aW9uIGYpOwoKICAgICAgICAgICAgVGhlIGZvbGxvd2luZyBpcyBnZW5lcmF0ZWQ6CgogICAgICAgICAgICAgICAgcHVibGljIGVudW0gQW5FbnVtIHsKICAgICAgICAgICAgICAgICAgZm9vLAogICAgICAgICAgICAgICAgICBiYXIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzb21ldGhpbmcoQW5FbnVtIGUsIEFuRW51bSBmKSB7Li4ufQoKICAgICAgICAgICAgTm90ZSB0aGF0IGEgZ2xvYmFsIGVudW0gbGlrZSBBbkVudW0gYWJvdmUgaXMgZ2VuZXJhdGVkIGludG8gaXRzIG93bgogICAgICAgICAgICBmaWxlIGNhbGxlZCBBbkVudW0uY3MuIEVudW1zIGRlZmluZWQgd2l0aGluIGEgQysrIGNsYXNzIGFyZSBkZWZpbmVkCiAgICAgICAgICAgIHdpdGhpbiB0aGUgQyMgcHJveHkgY2xhc3MuIFNvbWUgb2YgdGhlIHR5cGVtYXBzIGZvciBtb2RpZnlpbmcgQyMgcHJveHkKICAgICAgICAgICAgY2xhc3NlcyBhbHNvIHdvcmsgZm9yIGVudW1zLiBGb3IgZXhhbXBsZSBnbG9iYWwgZW51bXMgY2FuIHVzZQoKICAgICAgICAgICAgICAgICV0eXBlbWFwKGNzaW1wb3J0cykgdG8gYWRkIGluIGV4dHJhIHVzaW5nIHN0YXRlbWVudHMuCgogICAgICAgICAgICBHbG9iYWwgZW51bXMgYW5kIGNsYXNzIGVudW1zIGNhbiB1c2UKCiAgICAgICAgICAgICAgICAldHlwZW1hcChjc2NsYXNzbW9kaWZpZXJzKSB0byBtYWtlIHRoZSBlbnVtIHByaXZhdGUsIHB1YmxpYyBldGMuCiAgICAgICAgICAgICAgICAldHlwZW1hcChjc2Jhc2UpIHRvIGNoYW5nZSB0aGUgdW5kZXJseWluZyBlbnVtIHR5cGUgKGVudW0gYmFzZSkKCiAgICAgICAgICAgIElmIHdlIGFkZCB0aGlzIGZvciB0aGUgYWJvdmUgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAldHlwZW1hcChjc2NsYXNzbW9kaWZpZXJzKSBBbkVudW0gInByb3RlY3RlZCIKICAgICAgICAgICAgICAgICV0eXBlbWFwKGNzYmFzZSkgQW5FbnVtICJsb25nIgoKICAgICAgICAgICAgdGhlIGZvbGxvd2luZyBpcyBnZW5lcmF0ZWQ6CiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgcHJvdGVjdGVkIGVudW0gQW5FbnVtIDogbG9uZyB7CiAgICAgICAgICAgICAgICAgIGZvbywKICAgICAgICAgICAgICAgICAgYmFyCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgQyMgTU9EVUxFICoqKgoKMDQvMDcvMjAwNDogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFNlZyBmYXVsdCBmaXggZm9yIGVtcHR5IGVudW1zLCBsaWtlCiAgICAgICAgICAgICAgICBlbnVtIEZvbyB7fTsKCjAzLzIxLzIwMDQ6IG1tYXR1cwogICAgICAgICAgICBbTm90ZTogdGhpcyBjaGFuZ2UgcmV2b2tlZCBvbiAwNC8yNS8yMDA0XQoJICAgIFtQeXRob25dIE1ha2VzIHRoZSBmb2xsb3dpbmcgJ3ZhcicgY2FzZXMgbW9yZSB1bmlmb3JtOgoKICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGdhOwogCiAgICAgICAgICAgICAgICBzdHJ1Y3QgQSB7CiAgICAgICAgICAgICAgICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBzYTsKICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbWE7CiAgICAgICAgICAgICAgICB9OwoKCiAgICAgICAgICAgIG5vdyB0aGUgdGhyZWUgdmFyaWFibGVzIChnYSwgc2EsIG1hKSBjYW4gYmUgYXNzaWduZWQgYXM6CgoKICAgICAgICAgICAgICAgICAgY3Zhci5nYSA9ICJoZWxsbyI7CiAgICAgICAgICAgICAgICAgIEEuc2EgPSAiaGVsbG8iOwogICAgICAgICAgICAgICAgICBhLm1hID0gImhlbGxvIjsKCiAgICAgICAgICAgIGllLCBub3cgJ21hJyB3aWxsIGFsc28gdXNlIGEgc3RkOjpzdHJpbmcgdHlwZW1hcCAnaW4nIGlmCiAgICAgICAgICAgIGRlZmluZWQsIGJlZm9yZSBpdCB3YXMgb25seSBhY2NlcHRpbmcgYSAncF9zdGRfc3RyaW5nJwogICAgICAgICAgICBwb2ludGVyLiAgTm90ZSwgaG93ZXZlciwgdGhhdCAnbWEnIHdpbGwgbm90IHVzZSB0aGUKICAgICAgICAgICAgJ3ZhcmluL3Zhcm91dCcgdHlwZW1hcHMgKHRoYXQgcHJvYmFibHkgY291bGQgYmUgbW9yZQogICAgICAgICAgICBuYXR1cmFsKSwgYnV0IGl0IHdpbGwgcGljayB1cCB0aGUgJ2luJyB0eXBlbWFwIGZvciBjb25zdAogICAgICAgICAgICBzdGQ6OnN0cmluZyYgKHdoaWNoIGlzIGVhc2llcikuCgoJICAgIFRoZSBjaGFuZ2VzIGluIGN3cmFwLmMgYW5kIGxhbmcuY3h4IHdpbGwgcHJvYmFibHkgZml4IHRoZQoJICAgIGJlaGF2aW91ciBpbiBvdGhlciBsYW5ndWFnZXMgdGhhdCBkbyBub3Qgb3ZlcmxvYWQgdGhlCgkgICAgbWVtYmVydmFySGFuZGxlciBtZXRob2QgInRvbyBtdWNoIi4KIAogICAgICAgICAgICAKMDMvMjEvMjAwNDogbW1hdHVzCgkgICAgW1B5dGhvbl0gRGlzYWJsaW5nIHRoZSBkZWZhdWx0IGluc3RhbnRpYXRpb25zIGxpa2U6CgoJICAgICAgJXRlbXBsYXRlKCkgc3RkOjpwYWlyPGludCxpbnQ+OwoKICAgICAgICAgICAgZm9yIGFsbCB0aGUgcHJpbWl0aXZlIHR5cGVzIGFuZCBTVEwgY29udGFpbmVycy9jbGFzc2VzLgoJICAgIFRoZXkgYXJlIGV4cGVuc2l2ZSwgc3BlY2lhbGx5IGZvciBwYWlyIGFuZCBtYXAsIGFuZCB0aGUKCSAgICBwcmV2aW91cyBiZWhhdmlvdXIgYWxzbyByZXF1aXJlcyB0aGUgdXNlciB0byBwZXJmb3JtCgkgICAgbWFudWFsIGluc3RhbnRpYXRpb25zLiBTdGlsbCwgaWYgdGhlIHNwZWVkIGRpZmZlcmVuY2UgaXMKCSAgICBub3QgaW1wb3J0YW50LCBpdCBjYW4gYmUgcmUtZW5hYmxlZCBieSBkZWZpbmluZyB0aGUgbWFjcm8KCSAgICBTV0lHX1NURF9ERUZBVUxUX0lOU1RBTlRJQVRJT04gKHNlZSBzdGRfY29tbW9uLmkpLgoKCSAgICBBbHNvLCBub3JtYWxpemluZyB0aGUgSU5QVVQvT1VUUFVUL0lOT1VUIHR5cGVtYXBzLiBOb3cKCSAgICB0aGV5IHVzZSB0aGUgc2FtZSBjb252ZXJzb3JzIHRoYW4gdGhlIHJlc3Qgb2YgdGhlCgkgICAgdHlwZW1hcHMsIGFuZCB5b3UgY2FuIHVzZSB0aGVtIGZvciBzdGQ6OnBhaXIsIHN0ZDo6c3RyaW5nCgkgICAgYW5kIGFsbCB0aGUgb3RoZXIgU1RMIHR5cGVzLCBsaWtlIGluOgoKCSAgICAgIHZvaWQgcF9pbm91dGQoc3RkOjpwYWlyPGRvdWJsZSwgZG91YmxlPiAqSU5PVVQpOwoKCSAgICBBZGRlZCB0aGUgYXR0cmlidXRlLmkgYW5kIGltcGxpY2l0LmkgZmlsZXMgd2l0aCBtYWNyb3MgdG8KCSAgICB0cmFuc2Zvcm0gZnVuY3Rpb25zIHBhaXJzIGxpa2UgJ3NldF94Jy8nZ2V0X3gnIAoJICAgIChvciAnVCYgeCgpJy8nY29uc3QgVCYgeCgpIGNvbnN0JykgaW50byBhbiBhdHRyaWJ1dGUsCgkgICAgYW5kIGFsbG93aW5nIHRoZSB1c2Ugb2YgaW1wbGljaXQgY29uc3RydWN0b3JzIGluIHR5cGVtYXBzCgkgICAgKHNlZSB0aGUgZmlsZXMgZm9yIG1vcmUgZGV0YWlscykuCgowMy8yMS8yMDA0OiBta29lcHBlCgkgICAgW0d1aWxlXSBGaXggdGhlIGRvY3VtZW50YXRpb24gc3RyaW5ncyBvZiBmdW5jdGlvbnMgd2l0aAoJICAgIGFub255bW91cyBhcmd1bWVudHMuCgowMy8xOC8yMDA0OiBtbWF0dXMKCSAgICBbUHl0aG9uXSBNb3JlIGdlbmVyYWwgc3RkX3N0cmluZy5pIGludGVyZmFjZS4KCSAgICBOb3cgeW91IGNhbiB3cmFwIGl0IHVzaW5nCgoJICAgICAgJXRlbXBsYXRlKHN0cmluZykgc3RkOjpiYXNpY19zdHJpbmc8Y2hhcj47CgogICAgICAgICAgICBhbmQgdXNlIHRoZSBzdGQ6OnN0cmluZyBhcyBhIGJhc2UgY2xhc3M6CgoJICAgICAgc3RydWN0IEEgOiBzdGQ6OnN0cmluZyB7CiAgICAgICAgICAgICAgfTsKCgkgICAgQnV0IG1vcmUgaW1wb3J0YW50LCBzd2lnIHdpbGwgcmVjb2duaXplIAoJICAgIGJvdGggc3RkOjpiYXNpY19zdHJpbmc8Y2hhcj4gYW5kIHN0ZDo6c3RyaW5nIGFzCgkgICAgdGhlIHNhbWUgdHlwZS4KCjAzLzE2LzIwMDQ6IG1tYXR1cwoJICAgIFByZXZpb3VzbHkgYWRkZWQsIGJ1dCBub3QgbWVudGlvbmVkIGJlZm9yZToKCgkgICAgLSBmcmllbmQgZGVjbGFyYXRpb24gc3VwcG9ydCwgc3dpZyBub3cgZW1pdHMgYSBnbG9iYWwKCSAgICAgIGZ1bmN0aW9uIGluIHRoZSBzYW1lIGNsYXNzIHNjb3BlLgoKCSAgICAtIHJlZi91bnJlZiBmZWF0dXJlczogdG8gbWl4IHJlZiBjb3VudGluZyBDKysgY2xhc3NlcwoJICAgICAgYW5kIG5hdGl2ZSBzY3JpcHQgcmVmIGNvdW50aW5nIG1lY2hhbmlzbXMgKGxpa2UgaW4gcHl0aG9uKS4KCSAgICAKCSAgICAgIFVzZSBpdCBsaWtlOgoKIAkgICAgICAgICVmZWF0dXJlKCJyZWYiKSAgIFJDT2JqICIkdGhpcy0+cmVmKCk7IgogICAgICAgICAgICAgICAgJWZlYXR1cmUoInVucmVmIikgUkNPYmogIiR0aGlzLT51bnJlZigpOyIKCgkgICAgICBBbmQgdGhlIGNsYXNzIFJDT2JqLCBhbmQgYWxsIHRoZSBkZXJpdmVkIG9uZXMsIHdpbGwKCSAgICAgIHBlcmZvcm0gdGhlIHJpZ2h0IHJlZi91bnJlZiBjYWxscyB3aGVuIGEgbmV3IHBvaW50ZXIgIAoJICAgICAgaXMgcmV0dXJuZWQgdG8gdGhlIHRhcmdldCBsYW5ndWFnZSwgb3Igd2hlbiB0aGUgdGFyZ2V0CgkgICAgICBsYW5ndWFnZSBhdHRlbXB0cyB0byBkZWxldGUgdGhlIG9iamVjdC4KCSAgICAgIAoJICAgICAgU2VlIHRoZSByZWZjb3VudC5pIGZpbGUgaW4gdGhlIHRlc3Qtc3VpdGUgZm9yIG1vcmUKCSAgICAgIGRldGFpbHMuCgoJICAgIAowMy8xNi8yMDA0OiBtbWF0dXMKCSAgICBbUHl0aG9uXSBVc2luZyB0aGUgbmV3ICVmcmFnbWVudCBzdXBwb3J0LCBtYWpvciByZXdyb3RlIAoJICAgIG9mIHRoZSBweXRob24gc3dpZyBsaWJyYXJ5LCBpbmNsdWRpbmc6CgoJICAgIC0gQWxtb3N0IGF1dG9tYXRpYyB0ZW1wbGF0ZS90eXBlbWFwIGluc3RhbnRpYXRpb24gZm9yCgkgICAgICB0aGUgU1RMIGNvbXBvbmVudHMuIEZvciBleGFtcGxlLCBub3cgeW91IGNhbiB3cml0ZToKCgkJICAgJXRlbXBsYXRlKHZlY3Rvcl9pKSBzdGQ6OnZlY3RvcjxpbnQ+OwoKICAgICAgICAgICAgICBhbmQgYSBzcGVjaWFsaXplZCB2ZWN0b3JfaSBjbGFzcyBpcyBlbWl0dGVkIHdpdGggYWxsCgkgICAgICB0aGUgbmVlZGVkIHR5cGVtYXBzLiBObyBuZWVkIHRvIHVzZSB0aGUgb2xkCgkgICAgICAnc3BlY2lhbGl6ZV92ZWN0b3InIG1hY3Jvcy4KCgkgICAgICBOb3RlIHlvdSBjYW4gYWxzbyBkZWZpbmUKCgkgICAgICAgICAgJXRlbXBsYXRlKG1hdHJpeF9pKSAgIHN0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPGludD4gPjsKCSAgICAgICAgICAldGVtcGxhdGUodmVjdG9yX3BpaSkgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPGludCxpbnQ+ID47CgoJICAgIC0gVGhlIGVtcHR5IHRlbXBsYXRlIGluc3RhbnRpYXRpb24gCiAJIAogICAgICAgICAgIAkgICV0ZW1wbGF0ZSgpIHN0ZDo6dmVjdG9yPGludD47CgoJICAgICAgZGVmaW5lcyB0aGUgdmVjdG9yIHR5cGVtYXBzLCBidXQgbm8gcHJveHkgY2xhc3MuIEZvciBhbGwgdGhlCiAgICAgICAgICAgICAgZnVuZGFtZW50YWwgdHlwZXMsIHRoZSBlbXB0eSB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9uIGFyZQogICAgICAgICAgICAgIGRlZmluZWQsIHNvLCB5b3UgY2FuIHNheQoKCSAgICAgICVpbmNsdWRlIHN0ZF92ZWN0b3IKCgkgICAgICBpbnQgZnVuYyhjb25zdCBzdGQ6OnZlY3RvcjxpbnQ+JiBhKTsKCSAgICAgIAoJICAgICAgd2hlcmUgdGhlIHByb3BlciB0eXBlbWFwIGlzIGFwcGxpZWQgdG8gJ2EnLCBidXQgbm8KCSAgICAgIHN0ZDo6dmVjdG9yPGludD4gcHJveHkgaXMgZ2VuZXJhdGVkLgoJICAgICAgCgogICAgICAgICAgICAtIEFsbCB0aGUgU1RMIGNvbnRhaW5lcnMgcHJlc2VudCBhIG1vcmUgdW5pZm9ybSBiZWhhdmlvciBhbmQKCSAgICAgIG1vcmUgY29tcGxldGUgaW50ZXJmYWNlIGRlY2xhcmF0aW9uLiBUaGUgZm9sbG93aW5nIGFyZSAKCSAgICAgIG5vdyBzdXBwb3J0ZWQ6CgoJCSAgc3RkOjp2ZWN0b3I8VD4KCQkgIHN0ZDo6bGlzdDxUPgoJCSAgc3RkOjpkZXF1ZTxUPgoJCSAgc3RkOjpzZXQ8VD4KCQkgIHN0ZDo6bXVsdGlzZXQ8VD4KCQkgIHN0ZDo6bWFwPFQ+CgkJICBzdGQ6Om11bHRpbWFwPFQ+CiAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgbm90IGEgY29udGFpbmVyLCBidXQgYWxzbyBzdXBwb3J0ZWQ6CgoJCSAgc3RkOjpwYWlyPFQsVT4KCiAgICAgICAgICAgICAgYWxzbywgbW9yZSB0eXBlbWFwcyBhcmUgZGVmaW5lZCBmb3IgYWxsIG9mIHRoZW0sCgkgICAgICBpbmNsdWRpbmcgdmFyaW4sIHZhcm91dCwgdHlwZWNoZWNrLCBldGMuCgogICAgICAgICAgICAtIEluaXRpYWwgYXR0ZW1wdCB0byBpbXBsZW1lbnQgdGhlIFNUTCBjb250YWluZXJzCiAgICAgICAgICAgICAgY29uc2lkZXJpbmcgYWxsb2NhdG9ycywgaWU6CgoJICAgICAgICAgIHN0ZDo6dmVjdG9yPFQsQT4JCQkKCgkgICAgICBpdCBpcyBwYXJ0aWFsbHkgd29ya2luZywgYnV0IGl0IGlzIGp1c3QgYSB3b3JrYXJvdW5kCgkgICAgICB3aGlsZSBzd2lnIGltcHJvdmVzIGl0cyB0ZW1wbGF0ZSB0eXBlIHN1cHBvcnQuCgkgICAgICAKCSAgICAgIAoJICAgICBQbGVhc2UgdGVzdCB3aXRoIHlvdXIgcGFydGljdWxhciBzZXR1cC4gSXQgc2VlbXMgdG8gYmUKCSAgICAgd29ya2luZyB3aXRoIGcrKyAzLjIuMiwgZysrIDIuOTYsIEludGVsIGljYyBhbmQgU0dJIENDCgkgICAgIGNvbXBpbGVycywgcGx1cyBweXRob24gMS41LjIsIDIuMCBhbmQgMi4zLCBidXQgc2luY2UKCSAgICAgd2UgYXJlIHVzaW5nIHRlbXBsYXRlcywgdGhlcmUgaXMgYSBjaGFuY2UgeW91IGNhbiBmaW5kCgkgICAgIHNvbWUgcHJvYmxlbXMgd2hlbiB1c2luZyB3aXRoIGFuIG9sZCBDKysgY29tcGlsZXIuCgowMy8xNi8yMDA0OiBtbWF0dXMKCiAgICAgICAgICAgIC0gQWxsb3dpbmcgdGhlIGVtcHR5ICV0ZW1wbGF0ZSBkaXJlY3RpdmUsIHN1Y2ggYXMKCiAgICAgICAgICAgICAgICAgJXRlbXBsYXRlKCkgc3RkOjp2ZWN0b3I8aW50PjsKCgkgICAgICB0byBwcm9jZXNzIHRoZSBjbGFzcyAidHlwZWRlZiJzIGFuZCAidHlwZW1hcCJzLiBCZWZvcmUKCSAgICAgIG9ubHkgdGhlIGludGVybmFsICJ0eXBlZGVmInMgd2VyZSBwcm9jZXNzZWQuCgogICAgICAgICAgICAgIFRoaXMgbWFrZXMgcG9zc2libGUgdG8gZW1pdCB0aGUgZGVmYXVsdCBpbi9vdXQKICAgICAgICAgICAgICB0eXBlbWFwcyB3aXRob3V0IHRoZSBuZWVkIG9mIHdyYXBwaW5nIGFuIHNwZWNpYWxpemVkCiAgICAgICAgICAgICAgdmVjdG9yIGluc3RhbmNlLgoKCSAgICAtIEFkZGluZyB0aGUgcHJlcHJvY2Vzc29yIGV4dGVuc2lvbiAjQCB3aGljaCBtYW5nbGVzIHRoZQogICAgICAgICAgICAgIGZvbGxvd2luZyBtYWNybyBhcmd1bWVudCwgbGlrZSBpbjoKCiAgICAgICAgICAgICAgICAjZGVmaW5lIG1hY3JvKFgpICAjQFgKICAgICAgICAgICAgICAgIG1hY3JvKGludCkgICAgICAgICAtPiBpbnQKICAgICAgICAgICAgICAgIG1hY3JvKHN0ZDo6c3RyaW5nKSAtPiBzdGRfc19zX3N0cmluZwogICAgICAgICAgICAgICAgCgkgICAgLSBGcmFnbWVudHMgY2FuIG5vdyBiZSAidHlwZSBzcGVjaWFsaXplZCIsIGFzIHRoZSB0eXBlbWFwcy4gVGhlCgkgICAgICBzeW50YXggaXMgYXMgZm9sbG93cwogCiAgICAgICAgICAgICAgICAlZnJhZ21lbnQoIm5hbWUiLCJoZWFkZXIiKSAKICAgICAgICAgICAgICAgICAgeyAvKiBhIHR5cGUgaW5kZXBlbmRlbnQgZnJhZ21lbnQgKG9sZCBzeW50YXgpICovIH0KICAgICAgICAgICAgICAgICVmcmFnbWVudCgibmFtZSIge1R5cGV9LCAiaGVhZGVyIikgCiAgICAgICAgICAgICAgICAgIHsgLyogdGhlIGZyYWdtZW50IGlzIHR5cGUgZGVwZW5kZW50ICovfQogCiAgICAgICAgICAgICAgTm93IGZyYWdtZW50cyBjYW4gYWxzbyBiZSB1c2VkIGluc2lkZSB0ZW1wbGF0ZXM6IAoKICAgICAgICAgICAgICAgIHRlbXBsYXRlIDxjbGFzcyBUPgogICAgICAgICAgICAgICAgc3RydWN0IEEgewogICAgICAgICAgICAgICAgICAgJWZyYWdtZW50KCJpbmNvZGUie0E8VD59LCJoZWFkZXIiKSB7CgkJICAgICAgLyogJ2luY29kZScgc3BlY2lhbGl6ZWQgZnJhZ21lbnQgKi8KCQkgICB9CiAKCQkgICAldHlwZW1hcChpbixmcmFnbWVudD0iaW5jb2RlIntBPFQ+fSkgewoJCSAgICAgIC8qCgkJICAgICAgICAgaGVyZSB3ZSB1c2UgdGhlICd0eXBlIHNwZWNpYWxpemVkJyAKICAgICAgICAgICAgICAgICAgICAgICAgIGZyYWdtZW50ICJpbmNvZGUie0E8VD59CiAgICAgICAgICAgICAgICAgICAgICAqLwoJCSAgICB9CiAgICAgICAgICAgICAgICB9OwoJCQkgICAgIAkKCjAzLzExLzIwMDQ6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gRGlyZWN0b3IgYnVnIHdoaWNoIG1lYW50IHRoYXQgc29tZSB2aXJ0dWFsIGZ1bmN0aW9ucyBvdmVycmlkZGVuIGluCiAgICAgICAgICAgIEphdmEgd2VyZSBub3QgYmVpbmcgY2FsbGVkIG9uIHNvbWUgb3BlcmF0aW5nIHN5c3RlbXMuIEJ1ZyByZXBvcnRlZCBhbmQgZml4ZWQKICAgICAgICAgICAgYnkgUm9iZXJ0IGRlIFZyaWVzIGFuZCBTY290dCBNaWNoZWwuCgowMy8wMi8yMDA0OiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW0d1aWxlXSBJbiAtc2NtIG1vZGUsIGRvbid0IGZvcmdldCB0byBjaGVjayB0aGUgdHlwZSBvZiBzdHJpbmcgYXJndW1lbnRzLgoKMDIvMjQvMjAwNDogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtDI10gTmV3IGNvbW1hbmRsaW5lIG9wdGlvbiAtbmFtZXNwYWNlIDxuYW1lPi4gVGhpcyBhbGxvd3Mgb25lIHRvIHNwZWNpZnkKICAgICAgICAgICAgYSBDIyBuYW1lc3BhY2UgaW50byB3aGljaCBhbGwgQyMgY2xhc3NlcyBhcmUgZ2VuZXJhdGVkLgoKMDIvMjMvMjAwNDogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKSAKCSAgICBbTXpTY2hlbWVdIFVzZSBGVU5DX05BTUUgcmF0aGVyIHRoYW4gYSBib2d1cyB0eXBlbWFwIHZhcmlhYmxlIGZvciBzaWduYWxsaW5nCgkgICAgZXJyb3JzLiAgQ2FsbCBzY2hlbWVfd3JvbmdfdHlwZSB3aXRoIGEgemVyby1iYXNlZCBhcmd1bWVudCBudW1iZXIuICAKCSAgICBSZXBvcnRlZCBieSBPbmRyZWogUGFjb3Zza3ksIFNGICM5MDI2MjEuCgoJICAgIFtHdWlsZV0gRGVmaW5lIEZVTkNfTkFNRSBhbHNvIGluIHRoZSBkaXNwYXRjaCB3cmFwcGVyIGZvciBvdmVybG9hZGVkCgkgICAgZnVuY3Rpb25zLiAgUGF0Y2ggYnkgSm9obiBMZW56LCBTRiAjODk2MjU1LgoKMDIvMjIvMjAwNDogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtHdWlsZV0gSW4gLXNjbSBtb2RlLCBkb24ndCB0cnkgdG8gaW52b2tlIGEgbnVsbCBkZXN0cnVjdG9yIGZ1bmN0aW9uLgoKMDIvMjAvMjAwNDogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIEZpeGVzIHNvIHRoYXQgdGhlIFNXSUcgc291cmNlIHdpbGwgY29tcGlsZSB1c2luZyB0aGUgRGlnaXRhbCBNYXJzIENvbXBpbGVyCiAgICAgICAgICAgIChmb3JtZXJseSBTeW1hbnRpYyBjb21waWxlcikgb24gV2luZG93cy4gU3VibWl0dGVkIGJ5IFNjb3R0IE1pY2hlbC4KCjAyLzEzLzIwMDQ6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbTXpTY2hlbWVdIE5ldyBjb21tYW5kLWxpbmUgYXJndW1lbnQgLW5vaW5pdC4gIFVzZSBpdCBmb3IgYnVpbGRpbmcKCSAgICB0aGUgcnVudGltZSBsaWJyYXJ5LCB3aGVyZSB3ZSBkb24ndCB3YW50IHRvIGRlZmluZSB0aGUgZnVuY3Rpb25zCgkgICAgc2NoZW1lX2luaXRpYWxpemUgZXRjLiAgUmVwb3J0ZWQgYnkgVGltIEJyb3duLCBTRiAjODkxNzU0LgoKCSAgICBbTXpTY2hlbWVdIERvbid0IHByb2R1Y2UgaW52YWxpZCBDIGNvZGUgd2hlbiBpbnZva2VkIHdpdGggdGhlCgkgICAgLWRlY2xhcmVtb2R1bGUgb3B0aW9uLiAgUmVwb3J0ZWQgYnkgVGltIEJyb3duLCBTRiAjODkxMTA4LgoJICAgIAoJICAgIFtHdWlsZV0gQnVpbGQgdGhlIHJ1bnRpbWUgbGlicmFyeSB3aXRoIHBhc3NpdmUgbGlua2FnZSwgdG8gcmVuYW1lCgkgICAgdGhlIFNXSUdfaW5pdCBmdW5jdGlvbiB1bmlxdWVseS4KCjAyLzEyLzIwMDQ6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YSwgQyNdIFBhdGNoIHN1Ym1pdHRlZCBieSBCaWxsIEhvZmZtYW4gd2hpY2ggcHJldmVudHMgU1dJRyBmcm9tIGNyYXNoaW5nCiAgICAgICAgICAgIHdoZW4gYSBmaWxlIGZvciB0aGUgdHlwZXdyYXBwZXIgY2xhc3MgY2Fubm90IGJlIG9wZW5lZC4KCjAyLzExLzIwMDQ6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YSwgQyNdIE92ZXJsb2FkaW5nIGNoYW5nZXM6CiAgICAgICAgICAgICAgLSBNZXRob2RzIHdoaWNoIGFyZSBvdmVybG9hZGVkIGluIGNvbnN0IG9ubHkgbm8gbG9uZ2VyIGdlbmVyYXRlIEphdmEKICAgICAgICAgICAgICAgIGNvZGUgdGhhdCB3b24ndCBjb21waWxlIC0gdGhlIGZpcnN0IG1ldGhvZCBwYXJzZWQgaXMgdXNlZCBhbmQgYQogICAgICAgICAgICAgICAgd2FybmluZyBpcyBkaXNwbGF5ZWQuIE5vdGUgdGhhdCB0aGlzIGJlaGF2aW91ciBpcyBzbGlnaHRseSBkaWZmZXJlbnQKICAgICAgICAgICAgICAgIHRvIHRoZSBzY3JpcHRpbmcgbGFuZ3VhZ2VzIHdoaWNoIGFsd2F5cyB1c2VzIHRoZSBub24tY29uc3QgbWV0aG9kLgogICAgICAgICAgICAgIC0gV2FybmluZyBtZXNzYWdlcyA1MDkgYW5kIDUxMiByZXBsYWNlZCBieSBuZXcgd2FybmluZyBudW1iZXIgNTE2LCB3aGljaCAKICAgICAgICAgICAgICAgIGlzIG1vcmUgcmVsZXZhbnQgdG8gdGhlc2Ugc3RhdGljYWxseSB0eXBlZCBsYW5ndWFnZXMgYXMgdGhlIG92ZXJsb2FkZWQKICAgICAgICAgICAgICAgIG1ldGhvZHMgYXJlbid0ICdzaGFkb3dlZCcsIHRoZXkgYXJlIGlnbm9yZWQuCgowMS8yMy8yMDA0OiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW0d1aWxlXSBSZXBsYWNlIHRoZSAia25vd25fY2xhc3NlcyIgaGFzaCB0YWJsZSBieSBhIG5vZGUKCSAgICBhdHRyaWJ1dGUuICBNZXRob2RzIG9mIGNsYXNzZXMgaW4gQysrIG5hbWVzcGFjZXMgbm93IGdldAoJICAgIHRoZSBwcm9wZXIgc3BlY2lhbGl6ZXIgaW4gdGhlIEdPT1BTIGRlY2xhcmF0aW9uLgoJICAgIFJlcG9ydGVkIGJ5IHJtQG1oLWZyZWlidXJnLmRlLgoKMDEvMjMvMjAwNDogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtHdWlsZV0gVW5pcXVpZnkgdGhlIGFyZ3VtZW50IG5hbWVzIGluIEdPT1BTIHNoYWRvdyBtZXRob2QKCSAgICBkZWNsYXJhdGlvbnMuICBSZXBvcnRlZCBieSBybUBtaC1mcmVpYnVyZy5kZS4KCjAxLzIxLzIwMDQ6IHN1bnNoaW5lIChFcmljIFN1bnNoaW5lKQogICAgICAgICAgICBSZXZpdmVkIHRoZSBOZXh0U3RlcCBwb3J0IG9mIFNXSUcuCgogICAgICAgICAgICBGaXhlZCBmYXRhbCBwcm9ibGVtIGluIERvaFN0cnN0cigpIGNhdXNlZCBieSBkaWZmZXJlbmNlIGluIHN0cnN0cigpCiAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIHdoaWNoIG1hZGUgJWFwcGx5IGJlY29tZSBlbnRpcmVseSBkeXNmdW5jdGlvbmFsLiAgT24KICAgICAgICAgICAgTmV4dFN0ZXAsIHN0cnN0cigiZm9vIiwiIikgZXZhbHVhdGVzIHRvIE5VTEw7IHdoZXJlYXMsIG9uIG1vZGVybgogICAgICAgICAgICBwbGF0Zm9ybXMsIGl0IGV2YWx1YXRlcyB0byAiZm9vIi4gICVhcHBseSByZWxpZXMgZXh0ZW5zaXZlbHkgdXBvbgogICAgICAgICAgICBzdHJzdHIoImZvbyIsIiIpIGV2YWx1YXRpbmcgdG8gbm9uLU5VTEwsIHRoZXJlZm9yZSBpdCBmYWlsZWQKICAgICAgICAgICAgY2F0YXN0cm9waGljYWxseSB3aGVuIGZhY2VkIHdpdGggTmV4dFN0ZXAncyBzdHJzdHIoKS4KCiAgICAgICAgICAgIEFkZGVkIGBib29sJyBjaGVjayB0byBjb25maWd1cmUuaW4gc2luY2UgTmV4dFN0ZXAncyBDKysgY29tcGlsZXIKICAgICAgICAgICAgZG9lcyBub3Qgc3VwcGx5IHRoaXMgdHlwZS4gIHN3aWcuaCBub3cgZmFrZXMgdXAgYGJvb2wnIGlmIG5lZWRlZC4KCiAgICAgICAgICAgIFdvcmtlZCBhcm91bmQgTmV4dFN0ZXAgQysrIGNvbXBpbGVyIGJ1ZyBpbiB3aGljaCBDKysgY29kZSBpcwogICAgICAgICAgICBkaXNhbGxvd2VkIGluc2lkZSBleHRlcm4gIkMiIGZ1bmN0aW9ucy4gIFRoaXMgcHJvYmxlbSBhZmZlY3RlZCBhbGwKICAgICAgICAgICAgbGFuZ3VhZ2UgbW9kdWxlcywgc2luY2UgdGhleSBwdWJsaXNoIGhvb2sgZnVuY3Rpb25zIG9mIHRoZSBmb3JtOgogICAgICAgICAgICAgICAgZXh0ZXJuICJDIiBMYW5ndWFnZSAqc3dpZ19mb28odm9pZCkgeyByZXR1cm4gbmV3IEZPTygpOyB9CiAgICAgICAgICAgIEZpeGVkIGJ5IGNyZWF0aW5nIGEgQysrIHdyYXBwZXI6CiAgICAgICAgICAgICAgICBzdGF0aWMgTGFuZ3VhZ2UgKm5ld19zd2lnX2ZvbygpIHsgcmV0dXJuIG5ldyBGT08oKTsgfQogICAgICAgICAgICAgICAgZXh0ZXJuICJDIiBMYW5ndWFnZSAqc3dpZ19mb28odm9pZCkgeyByZXR1cm4gbmV3X3N3aWdfZm9vKCk7IH0KCiAgICAgICAgICAgIEVuc3VyZWQgdGhhdCBTd2lnX2NvcHlfc3RyaW5nKCkgaXMgdXNlZCBpbiBwbGFjZSBvZiBzdHJkdXAoKSBzaW5jZQogICAgICAgICAgICBOZXh0U3RlcCBkb2VzIG5vdCBzdXBwbHkgc3RyZHVwKCkuCgogICAgICAgICAgICBGaXhlZCBkZXRlY3Rpb24gb2YgUnVieSBsaWJyYXJ5IG5hbWUgYW5kIGxvY2F0aW9uIGluIGNvbmZpZ3VyZS5pbi4KICAgICAgICAgICAgUHJvYmxlbSAxOiBBc3N1bWVkIHRoYXQgbGlicmFyeSBhbHdheXMgcmVzaWRlZCBpbiBSdWJ5J3MgImFyY2hkaXIiLAogICAgICAgICAgICB3aGljaCB3YXMgY29ycmVjdCBmb3IgUnVieSAxLjYueCwgYnV0IHdoaWNoIGlzIGluY29ycmVjdCBmb3IgUnVieQogICAgICAgICAgICAxLjgueCwgaW4gd2hpY2ggY2FzZSB0aGUgbGlicmFyeSBub3JtYWxseSByZXNpZGVzIGluIFJ1YnkncwogICAgICAgICAgICAibGliZGlyIi4gIFByb2JsZW0gMjogQXNzdW1lZCB0aGF0IHRoZSBsaWJyYXJ5IGNvdWxkIGFsd2F5cyBiZQogICAgICAgICAgICBsaW5rZWQgdmlhICItbCIrUlVCWV9JTlNUQUxMX05BTUUgKHdoZXJlIFJVQllfSU5TVEFMTF9OQU1FCiAgICAgICAgICAgIHR5cGljYWxseSBpcyAicnVieSIpLCBob3dldmVyIHRoaXMgZmFpbGVkIGZvciBwbGF0Zm9ybXMsIHN1Y2ggYXMKICAgICAgICAgICAgTmV4dFN0ZXAsIHdoaWNoIGRvIG5vdCBzdXBwb3J0IHNoYXJlZCBsaWJyYXJpZXMuICBJbiB0aGlzIGNhc2UsIHRoZQogICAgICAgICAgICBzdGF0aWMgbGlicmFyeSBuYW1lIGluIDEuOC54IGlzIGxpYnJ1Ynktc3RhdGljLmEsIHRodXMKICAgICAgICAgICAgLWxydWJ5LXN0YXRpYyBpcyByZXF1aXJlZC4gIFRoZSBuZXcgbG9naWMgd29ya3MgY29ycmVjdGx5IGZvcgogICAgICAgICAgICBzdGF0aWMgYW5kIHNoYXJlZCBsaWJyYXJpZXMgZm9yIDEuNi54IGFuZCAxLjgueC4KCiAgICAgICAgICAgIEZpeGVkIGRldGVjdGlvbiBvZiBQZXJsIENGTEFHUyBpbiBjb25maWd1cmUuaW4gZm9yIE5leHRTdGVwLgogICAgICAgICAgICBEZXRlY3Rpb24gY29kZSBleHRyYWN0ZWQgQ0ZMQUdTIGZyb20gUGVybCdzICVDb25maWcgaGFzaCBidXQKICAgICAgICAgICAgbmVnbGVjdGVkIHRvIGFkZCBhIG5ld2xpbmUgdG8gdGhlIHZhbHVlIGJlZm9yZSBwYXNzaW5nIGl0IHRocm91Z2gKICAgICAgICAgICAgYHNlZCcuICBOZXh0U3RlcCdzIGFuY2llbnQgYHNlZCcgZGlzY2FyZHMgaW5wdXQgd2hpY2ggaXMgbm90CiAgICAgICAgICAgIHRlcm1pbmF0ZWQgd2l0aCBhIG5ld2xpbmUsIHRodXMgUGVybCBDRkxBR1MgYWx3YXlzIGV2YWx1YXRlZCB0byB0aGUKICAgICAgICAgICAgZW1wdHkgc3RyaW5nLgoKMDEvMTYvMjAwNDogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFRpZHkgdXAgaW4gdGhlIGV4Y2VwdGlvbiBoYW5kbGluZyBjb2RlIHRoYXQgaXMgZ2VuZXJhdGVkIHdoZW4KICAgICAgICAgICAgQysrIGV4Y2VwdGlvbiBzcGVjaWZpY2F0aW9ucyBhcmUgd3JhcHBlZCB3aXRoIHRoZSB0aHJvd3MgdHlwZW1hcC4KICAgICAgICAgICAgVGhpcyByZWR1bmRhbnQgY29kZSBpcyBubyBsb25nZXIgZ2VuZXJhdGVkOgoKICAgICAgICAgICAgICAgIGNhdGNoKC4uLikgewogICAgICAgICAgICAgICAgICAgIHRocm93OyAKICAgICAgICAgICAgICAgIH0KCjAxLzEyLzIwMDQ6IHdzZnVsdG9uIG9uIGJlaGFsZiBvZiBtbWF0dXMgKG1hcmNlbG8gbWF0dXMpIAogICAgICAgICAgICBpZiBhIG1ldGhvZCB1c2VzICVleGNlcHRpb24gYW5kIHRoZSBtZXRob2QgcmVxdWlyZXMgdGhlIHVzZQogICAgICAgICAgICBvZiB0aGUgdGhyb3dzIHR5cGVtYXAsIHRoZSBjb2RlIGluIGEgdGhyb3dzIHR5cGVtYXAgd2lsbCBiZQogICAgICAgICAgICBnZW5lcmF0ZWQgaW5zaWRlIHRoZSB0cnkgYm9keS4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICVleGNlcHRpb24gbWV0aG9kIHsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgIC8vIG1ldGhvZCBhY3Rpb24gCiAgICAgICAgICAgICAgICAgICRhY3Rpb24KICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGludCBpKSB7CiAgICAgICAgICAgICAgICAgIC8vIG1ldGhvZCBpbnQgY2F0Y2ggaGFuZGxlcgogICAgICAgICAgICAgICAgfSBjYXRjaCAoLi4uKSB7CiAgICAgICAgICAgICAgICAgIC8vIG1ldGhvZCBnZW5lcmljIGNhdGNoIGhhbmRsZXIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgJXR5cGVtYXAodGhyb3dzKSBFeGNlcHQgJXsKICAgICAgICAgICAgICAgIC8vIHRocm93cyB0eXBlbWFwIEV4Y2VwdCBjYXRjaCBoYW5kbGVyCiAgICAgICAgICAgICAgJX0KCiAgICAgICAgICAgICAgJWlubGluZSAlewogICAgICAgICAgICAgIGNsYXNzIEV4Y2VwdCB7fTsKICAgICAgICAgICAgICB2b2lkIG1ldGhvZChpbnQgaSkgdGhyb3cgKEV4Y2VwdCk7CgogICAgICAgICAgICBXaWxsIGdlbmVyYXRlOgoKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAvLyBtZXRob2QgYWN0aW9uIAogICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QoYXJnMSk7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICBjYXRjaChFeGNlcHQgJl9lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhyb3dzIHR5cGVtYXAgRXhjZXB0IGNhdGNoIGhhbmRsZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICB9IGNhdGNoIChpbnQgaSkgewogICAgICAgICAgICAgICAgICAgICAgLy8gbWV0aG9kIGludCBjYXRjaCBoYW5kbGVyCiAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKC4uLikgewogICAgICAgICAgICAgICAgICAgICAgLy8gbWV0aG9kIGdlbmVyaWMgY2F0Y2ggaGFuZGxlcgogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQoKCiAgICAgICAgICAgIEFzIGNhbiBiZSBzZWVuLCB0aGUgaW5uZXIgdHJ5IGNhdGNoIGJsb2NrIGlzIGZvciB0aGUgdGhyb3dzIHR5cGVtYXBzLgogICAgICAgICAgICBQcmV2aW91c2x5LCB0aGlzIHdhcyByZXZlcnNlZCBzbyB0aGF0IHRoZSBpbm5lciB0cnkgY2F0Y2ggYmxvY2sKICAgICAgICAgICAgd2FzIHRoZSAlZXhjZXB0aW9uIGNvZGUuIEluIHRoZSBleGFtcGxlIGFib3ZlLCBpdCB3b3VsZCBoYXZlIGJlZW4KICAgICAgICAgICAgaW1wb3NzaWJsZSB0byBjYXRjaCBFeGNlcHQgYXMgdGhlIGNhdGNoIGFsbCAoLi4uKSB3b3VsZCBjYXRjaCB0aGUKICAgICAgICAgICAgZXhjZXB0aW9uIGluc3RlYWQuCgpWZXJzaW9uIDEuMy4yMSAoSmFudWFyeSAxMSwgMjAwNCkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgowMS8xMC8yMDA0OiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgVGhlIG91dHB1dCBmb3JtYXQgZm9yIGJvdGggd2FybmluZ3MgYW5kIGVycm9ycyBjYW4gYmUgc2VsZWN0ZWQgZm9yCiAgICAgICAgICAgIGludGVncmF0aW9uIHdpdGggeW91ciBmYXZvdXJpdGUgSURFL2VkaXRvci4gRWRpdG9ycyBhbmQgSURFcyBjYW4gdXN1YWxseQogICAgICAgICAgICBwYXJzZSBlcnJvciBtZXNzYWdlcyBhbmQgaWYgaW4gdGhlIGFwcHJvcHJpYXRlIGZvcm1hdCB3aWxsIGVhc2lseSB0YWtlIHlvdSAKICAgICAgICAgICAgZGlyZWN0bHkgdG8gdGhlIHNvdXJjZSBvZiB0aGUgZXJyb3IuIFRoZSBzdGFuZGFyZCBmb3JtYXQgaXMgdXNlZCBieSAKICAgICAgICAgICAgZGVmYXVsdCBleGNlcHQgb24gV2luZG93cyB3aGVyZSB0aGUgTWljcm9zb2Z0IGZvcm1hdCBpcyB1c2VkIGJ5IGRlZmF1bHQuCiAgICAgICAgICAgIFRoZXNlIGNhbiBiZSBvdmVycmlkZGVuIHVzaW5nIGNvbW1hbmQgbGluZSBvcHRpb25zLCBmb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAkIHN3aWcgLXB5dGhvbiAtRnN0YW5kYXJkIGV4YW1wbGUuaQogICAgICAgICAgICAgICAgZXhhbXBsZS5pOjQ6IFN5bnRheCBlcnJvciBpbiBpbnB1dC4KICAgICAgICAgICAgICAgICQgc3dpZyAtcHl0aG9uIC1GbWljcm9zb2Z0IGV4YW1wbGUuaQogICAgICAgICAgICAgICAgZXhhbXBsZS5pKDQpOiBTeW50YXggZXJyb3IgaW4gaW5wdXQuCgowMS8wOS8yMDA0OiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgODcxOTA5IF0gc2ltcGxlIG5hbWVzcGFjZSBwcm9ibGVtLgogICAgICAgICAgICBUaGlzIHdhcyBhIHByb2JsZW0gdXNpbmcgYW5vbnltb3VzIHN0cnVjdHVyZXMgaW4gYSBuYW1lc3BhY2UuCiAgICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgIG5hbWVzcGFjZSBucyB7CiAgICAgICAgICAgICAgICAgICB0eXBlZGVmIHN0cnVjdCAgewogICAgICAgICAgICAgICAgICAgICAgaW50IG47CiAgICAgICAgICAgICAgICAgICB9IFM7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgUmVwb3J0ZWQgYnkgSm9zaCBDaGVycnkuCgowMS8wOS8yMDA0OiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHNvbWUgYnJva2VuIFBlcmwgZXhhbXBsZXMuCgoxMi8yOC8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmEgYW5kIEMjXSBGaXhlcyBmb3Igd3JhcHBpbmcgY292YXJpYW50IChwb2x5bW9ycGhpYykgcmV0dXJuIHR5cGVzLgogICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICBzdHJ1Y3QgQmFzZSB7CiAgICAgICAgICAgICAgICAgIHZpcnR1YWwgfkJhc2UoKTsKICAgICAgICAgICAgICAgICAgdmlydHVhbCBCYXNlKiBjb3B5KCkgY29uc3QgPSAwOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHN0cnVjdCBEZXJpdmVkIDogQmFzZSB7CiAgICAgICAgICAgICAgICAgIHZpcnR1YWwgRGVyaXZlZCogY29weSgpIGNvbnN0OwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFRoZSBEZXJpdmVkOjpjb3B5IHByb3h5IG1ldGhvZCByZXR1cm5zIEJhc2Ugbm90IERlcml2ZWQuIEEgd2FybmluZyBpcyBpc3N1ZWQKICAgICAgICAgICAgYWJvdXQgdGhpcy4gUHJldmlvdXNseSB0aGUgcG9pbnRlciB1c2VkIGJ5IHRoZSBwcm94eSBjbGFzcyB3YXMgaW5jb3JyZWN0bHkKICAgICAgICAgICAgdHJlYXRlZCBhcyBhIEJhc2UqIGluc3RlYWQgb2YgYSBEZXJpdmVkKi4KCjEyLzE4LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBGaXggc28gdGhhdCBXaW5kb3dzIHBhdGhzIGFyZSBkaXNwbGF5ZWQgY29ycmVjdGx5IHdoZW4gcmVwb3J0aW5nIGVycm9ycy4KICAgICAgICAgICAgQW4gZXJyb3IgcHJldmlvdXNseSB3b3VsZCBoYXZlIGJlZW4gc2hvd24gc29tZXRoaW5nIGxpa2U6CgogICAgICAgICAgICAgIC4/eGFtcGxlLmk6MTQ6IFN5bnRheCBlcnJvciBpbiBpbnB1dC4KCiAgICAgICAgICAgIGluc3RlYWQgb2Y6CgogICAgICAgICAgICAgIC5cZXhhbXBsZS5pOjE0OiBTeW50YXggZXJyb3IgaW4gaW5wdXQuCgoKVmVyc2lvbiAxLjMuMjAgKERlY2VtYmVyIDE3LCAyMDAzKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoxMi8xNy8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIExhc3QgbWludXRlIG1vZGlmaWNhdGlvbnMuICAgUGVybDUgbW9kdWxlIG5vdyBnZW5lcmF0ZXMgc2hhZG93IGNsYXNzZXMKICAgICAgICAgICAgYnkgZGVmYXVsdCBsaWtlIGFsbCBvZiB0aGUgb3RoZXIgbW9kdWxlcy4gIFBIUDQgd3JhcHBlcnMgbm8gbG9uZ2VyCiAgICAgICAgICAgIGluY2x1ZGUgImNvbmZpZy5oIi4gCgoxMi8xNC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIFdlYWtlbmVkIHdhcm5pbmcgbWVzc2FnZSByZWxhdGVkIHRvIGNvbnN0cnVjdG9yIG5hbWVzIHNvIHRoYXQgYW4KICAgICAgICAgICAgdW51c3VhbCBuZXN0ZWQtY2xhc3Mgd3JhcHBpbmcgdGVjaG5pcXVlIHdvdWxkIHdvcmsgYWdhaW4gKGFwcGFyZW50bHkKICAgICAgICAgICAgaXQgd29ya2VkIGluIHNvbWUgb2xkZXIgU1dJRyByZWxlYXNlcykuICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICBjbGFzcyBTY29wZSB7CiAgICAgICAgICAgICAgICAgICBjbGFzcyBDbGFzc0E7CiAgICAgICAgICAgICAgICAgICBjbGFzcyBDbGFzc0I7CiAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgIGNsYXNzIFNjb3BlOjpDbGFzc0EgewogICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgY2xhc3MgU2NvcGU6OkNsYXNzQiB7CiAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICB9CgogICAgICAgICAgICBOb3RlOiAgVGhlcmUgaXMgc3RpbGwgc29tZSBvZGQgaW50ZXJhY3Rpb24gd2l0aCB0aGUgU1dJRyBzeW1ib2wKICAgICAgICAgICAgdGFibGUvdHlwZSBzeXN0ZW0gdGhhdCB3aWxsIG5lZWQgdG8gYmUgbG9va2VkIGF0IGluIGEgZnV0dXJlIHJlbGVhc2UuCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IEd1c3Rhdm8gTmllbWV5ZXIuCgoKMTIvMTEvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBQcm90ZWN0ZWQgY2xhc3MgbWV0aG9kcyBhcmUgd3JhcHBlZCBhcyBwcm90ZWN0ZWQgSmF2YSBtZXRob2RzIAogICAgICAgICAgICB3aGVuIHVzaW5nIHRoZSBkaXJwcm90IGRpcmVjdG9yIGZlYXR1cmUuIFRoaXMgY2FuIGJlIGNoYW5nZWQgdXNpbmcKICAgICAgICAgICAgJWphdmFtZXRob2Rtb2RpZmllcnMgdG8gc29tZXRoaW5nIGVsc2Ugc2hvdWxkIHRoZSBuZWVkIGFyaXNlLCBmb3IKICAgICAgICAgICAgZXhhbXBsZSwgcHJpdmF0ZSBvciBwYWNrYWdlIGFjY2Vzcy4KCjEyLzExLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YSwgQyNdIAogICAgICAgICAgICAlamF2YW1ldGhvZG1vZGlmaWVycyAoSmF2YSkgYW5kICVjc21ldGhvZG1vZGlmaWVycyAoQyMpIG9wZXJhdGUgc2xpZ2h0bHkgCiAgICAgICAgICAgIGRpZmZlcmVudGx5LiBQcmV2aW91c2x5IHRoaXMgZmVhdHVyZSBoYWQgdG8gYmUgcHJlc2VudCB0byBzZXQgdGhlIG1ldGhvZAogICAgICAgICAgICBtb2RpZmllcnMuIE5vdyBpdCBpcyBvbmx5IHVzZWQgaWYgaXQgZXhpc3RzIGZvciB0aGUgbWV0aG9kIGJlaW5nIHdyYXBwZWQuCiAgICAgICAgICAgIFRoZSBkZWZhdWx0IGlzICJwdWJsaWMiIGFzIHByZXZpb3VzIGhvd2V2ZXIsIHdoZW4gd3JhcHBpbmcgcHJvdGVjdGVkCiAgICAgICAgICAgIGRpcmVjdG9yIG1ldGhvZHMgaXQgaXMgInByb3RlY3RlZCIuIFRoaXMgY2hhbmdlIHdpbGwgbm90IGFmZmVjdCBleGlzdGluZwogICAgICAgICAgICB1c2Ugb2YgdGhlICVqYXZhbWV0aG9kbW9kaWZpZXJzIG9yICVjc21ldGhvZG1vZGlmaWVycy4KCjEyLzExLzIwMDM6IG1tYXR1cyAoTWFyY2VsbyBNYXR1cykKCgkgICAgVGhpcyBmaXggc29tZSByZWN1cnJpbmcgcmVwb3J0cyBhYm91dCBrZXl3b3JkcyBub3QgYmVlbgoJICAgIHByb3Blcmx5IGlkZW50aWZpZWQgYW5kIHdhcm5lZCwgYW5kIGl0IHNvbHZlcyB0aGUgcHJvYmxlbQoJICAgIG9mIGhvdyB0byBhZGQgYSB0ZXN0IGZpbGUgdG8gdGhlIHRlc3Qtc3VpdGUgc3VjaCB0aGF0IGl0CgkgICAgZG9lc24ndCB1c2UgYW55IGtleXdvcmQgb2YgYWxsIHRoZSBzdXBwb3J0ZWQgbGFuZ3VhZ2VzCgkgICAgKGFuZCBkb2luZyBpdCB3aXRob3V0IGNvbXBpbGluZyB0aGUgdGVzdCBmb3IgYWxsIHRoZQoJICAgIHN1cHBvcnRlZCBsYW5ndWFnZXMsIHRoaW5nIHRoYXQgaXMgbm90IGFsd2F5cyBwb3NzaWJsZSwKCSAgICBhbmQgd2l0aG91dCByZXF1aXJpbmcgeW91IHRvIGtub3cgYWxsIHRoZSBzdXBwb3J0ZWQKCSAgICBsYW5ndWFnZSBrZXl3b3JkcywgdGhpbmcgdGhhdCBpcyBhbHdheXMgaW1wb3NzaWJsZSkuCgoJICAgIFNvIHRoZXNlIGFyZSB0aGUgY2hhbmdlcyBnbG9iYWxseSBzcGVha2luZzoKCgkgICAgLSBVbmlmb3JtIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBrZXl3b3JkIHdhcm5pbmdzIHRocm91Z2gKCSAgICAgIHRoZSBzdXBwb3J0ZWQgbGFuZ3VhZ2VzOiBhbGwgdGhlIGxhbmd1YWdlcyBoYXMgbm93IGEKCSAgICAgIHNlcGFyYXRlIGZpbGUgdGhhdCBkZWZpbmVzIHRoZSBrZXl3b3JkcyBvciBiYWQgbmFtZXM6CgoJCSAgcHl0aG9uL3B5dGhvbmt3LnN3ZwoJCSAgY2hpY2tlbi9jaGlja2Vua3cuc3dnCiAgICAgICAgICAgICAgICAgIC4uLi4KCgkgICAgLSBBZGRlZCBrZXl3b3JkIGxpc3QgZm9yIG1vc3Qgb2YgdGhlIGxhbmd1YWdlcyB0aGF0IGRpZG4ndAoJICAgICAgaGF2ZSBvbmUgKHVzaW5nIHRoZSBuZXcgc2VwYXJhdGVkIGZpbGUpLgoJCSAgICAJICAgIAoJICAgIC0gQWRkZWQgdGhlICJBbGwga2V5d29yZHMiIHdhcm5pbmcgc3VwcG9ydDogLVdhbGxrdyBvcHRpb24uCgogICAgICAgICAgICAgIFRoaXMgb3B0aW9uIGFsbG93cyB5b3UgdG8gaW5jbHVkZSBhbGwgdGhlIGtub3duIGtleXdvcmRzCgkgICAgICBmb3IgYWxsIHRoZSBzdXBwb3J0ZWQgbGFuZ3VhZ2VzLCBhbmQgY2FuIGJlIHVzZWQgYXM6CgogICAgICAgICAgICAgICAgIHN3aWcgLVdhbGxrdyAuLi4uCgkgICAgCgkgICAgICBUaGlzIHdpbGwgaGVscCB0byB0aGUgcHJvY2VzcyBvZiBhZGRpbmcgYSB0ZXN0LXN1aXRlCgkgICAgICBmaWxlIHRoYXQgY2FuIGJlIGNvbXBpbGVkIGluIGFsbCB0aGUgc3dpZyBzdXBwb3J0ZWQKCSAgICAgIGxhbmd1YWdlcywgYW5kIGl0IHdpbGwgYmUgYWxzbyBoZWxwZnVsIGZvciB1c2VycyB3aG8KCSAgICAgIHdhbnQgdG8gY3JlYXRlIG11bHRpLWxhbmd1YWdlIGxpYnJhcmllcy4KCSAgICAKCSAgICBBbmQgdGhlc2UgYXJlIHRoZSBkZXRhaWxlZCBjaGFuZ2VzIChtb3N0bHkgZmlsZSBhZGRpdGlvbik6CgoJICAgIC0gRm9yIHRoZSBsYW5ndWFnZXMgdGhhdCBhbHJlYWR5IGhhdmUgc29tZSBzb3J0IG9mIGtleXdvcmQKCSAgICAgIHdhcm5pbmcgbGlzdCwgbW92ZSBpdCB0byBhbiBleHRlcm5hbCBsYW5ndWFnZWt3LnN3ZwoJICAgICAgZmlsZSwgaWU6CgkgICAgCgkgICAgICAgICBtb3ZlIGtleXdvcmRzIGZyb20gcHl0aG9uLnN3ZyAtPiBweXRob25rdy5zd2cKCSAgICAgICAgIG1vdmUga2V5d29yZHMgZnJvbSBjaGlja2VuLnN3ZyAtPiBjaGlja2Vua3cuc3dnCgkgICAgICAgICBtb3ZlIGtleXdvcmRzIGZyb20gdGNsOC5zd2cgLT4gdGNsa3cuc3dnCiAKICAgICAgICAgICAgICBhbmQgcmUtaW5jbHVkZSBsYW5ndWFnZWt3LnN3ZyBmcm9tIGxhbmd1YWdlLnN3Zy4KCSAgICAKCSAgICAtIEZvciB0aGUgbGFuZ3VhZ2UgdGhhdCBkaWRuJ3QgaGF2ZSBhIGtleXdvcmQgbGlzdCwgYW5kCgkgICAgICBmb3IgdGhlIG9uZXMgdGhhdCBJIGNvdWxkIGZpbmQgYSBsaXN0LCBhZGQgdGhlCgkgICAgICBsYW5ndWFnZWt3LnN3ZyBmaWxlLCBpZToKCiAgICAgICAgICAgICAgICAgY3NoYXJwL2NzaGFycGt3LnN3ZwogICAgICAgICAgICAgICAgIGphdmEvamF2YWt3LnN3ZwogICAgICAgICAgICAgICAgIHBocDQvcGhwa3cuc3dnCgkJIHBpa2UvcGlrZWt3LnN3ZwkgCgkJIHJ1YnkvcnVieWt3LnN3ZwoKCiAgICAgICAgICAgICAgYWxzbyBhZGQgYSBsaW5lIGluIGxhbmd1YWdlLnN3ZyB0byBpbmNsdWRlCgkgICAgICBsYW5ndWFnZWt3LnN3ZywgYnV0IG5vdyBpdCBpcyBjb21tZW50ZWQhISEsIGxpa2UgaW4KCSAgICAgIGphdmEuc3dnOgoKICAgICAgICAgICAgICAgICAgLyogamF2YSBrZXl3b3JkcyAqLwogICAgICAgICAgICAgICAgICAvKiBwbGVhc2UgdGVzdCBhbmQgYWN0aXZhdGUgKi8KICAgICAgICAgICAgICAgICAgLy8laW5jbHVkZSAiamF2YWt3LnN3ZyIKCgkgICAgICBpZSwgdGhlcmUgd2lsbCBiZSBubyBjaGFuZ2UgaW4gaG93IHN3aWcgcnVucyBub3JtYWxseQoJICAgICAgdW50aWwgdGhlIGxhbmd1YWdlIG1haW50YWluZXIgdGVzdCBhbmQgdW5jb21tZW50IHRoYXQKCSAgICAgIGxpbmUuCgkgICAgICAKCSAgICAgIFNvLCBwbGVhc2UgY2hlY2sgZWFjaCBsYW5ndWFnZWt3LnN3ZyBmaWxlIChJIGxlZnQgdGhlCgkgICAgICBsaW5rIHRvIHRoZSBrZXl3b3JkIGxpc3Qgc291cmNlIGZvciBjaGVja2luZyksIGFuZCBhZnRlcgoJICAgICAgdGVzdGluZywgdW5jb21tZW50IHRoZSAlaW5jbHVkZSBsaW5lLgoKCSAgICAtIEFkZGVkIHRoZSBmaWxlIGFsbGt3LnN3Zywgd2hpY2ggaW5jbHVkZXMgYWxsIHRoZQogICAgICAgICAgICAgIGxhbmd1YWdla3cuc3dnIGZpbGVzLgoKCSAgICAgIEZvciB0aGUgbGFuZ3VhZ2VzIHRoYXQgaGFzIG5vIGxhbmd1YWdla3cuc3dnIGZpbGUgcmlnaHQKCSAgICAgIG5vdywgYW5kIGlmIHRoZXkgbmVlZCBvbmUsIGFkZCB0aGUgZmlsZSBpbnRvIHRoZQoJICAgICAgbGFuZ3VhZ2UgZGlyZWN0b3J5LCBhbmQgYWRkIHRoZSBjb3JyZXNwb25kaW5nIGluY2x1ZGUKCSAgICAgIGxpbmUgaW50byB0aGUgYWxsa3cuc3dnIGZpbGUuCgkgICAgICAKCSAgICAtIEFkZGVkIHRoZSAtV2FsbGt3IHRoYXQgaW5jbHVkZXMgdGhlIGFsbGt3LnN3ZyBmaWxlLgoJICAgICAgTm90ZSB0aGF0IHRoZSBvbGQgLWxhbGxrdy5zd2cgb3B0aW9uIGNvdWxkbid0IGJlIHVzZWQKCSAgICAgIHNpbmNlIGl0IGluY2x1ZGUgdGhlIGZpbGUgYWZ0ZXIgaXQgd291bGQgYmUgbmVlZGVkLgoKCgkgICAgSG9wZWZ1bGx5LCB0aGUgLVdhbGxrdyBvcHRpb24gd2lsbCBiZSBhZGRlZCB0byB0aGUgZGVmYXVsdAoJICAgIHJ1bGVzIGluIHRoZSByZWxhdGVkIHRlc3Qtc3VpdGUgTWFrZWZpbGVzLCBzbywgd2hlbgoJICAgIGNyZWF0aW5nIGEgbmV3IHRlc3QsIG9yIGFkZGluZyBhIG5ldyBzd2lnIGxpYnJhcnkgZmlsZQoJICAgIChsaWtlIF9zdGRfZGVxdWUuaSksIHN3aWcgd2lsbCB3YXJuIHlvdSBpZiB5b3UgYXJlIHVzaW5nIGEKCSAgICBiYWQgbmFtZSwgY29uc2lkZXJpbmcgYWxsIHRoZSBsYW5ndWFnZSB3aGVyZSBpdCBuZWVkcyB0bwoJICAgIHJ1bi4KCSAgICAKCSAgICBSaWdodCBub3cgeW91IGNhbiB0ZXN0IGl0IGJ5IHVzaW5nOgoKICAgICAgICAgICAgICAgbWFrZSBjaGVjay1weXRob24tdGVzdC1zdWl0ZSBTV0lHPSJzd2lnIC1XYWxsa3ciCgoJICAgIG9yIHVzaW5nIHlvdXIgZmF2b3JpdGUgdGFyZ2V0IGxhbmd1YWdlLCBpdCBkb2Vzbid0IG1hdHRlci4KCgkgICAgQW5kIHllcywgdGhlcmUgYXJlIHNldmVyYWwgZXhhbXBsZXMgdGhhdCBhcmUgdXNpbmcKCSAgICByZXNlcnZlZCBrZXl3b3Jkcywgc3BlY2lhbGx5IGZyb20gY3NoYXJwLgogICAgICAgICAgCgkgICAgKioqIFJlbWVtYmVyICoqKio6IHRoZSBuZXcga2V5d29yZCB3YXJuaW5nIGxpc3RzIGFyZSBub3QKCSAgICBpbmNsdWRlZCBieSBkZWZhdWx0IGluIGFueSBvZiBsYW5ndWFnZSB0aGF0IGJlZm9yZSBkaWRuJ3QKCSAgICBoYXZlIG9uZS4gVG8gZW5hYmxlIHRoZSBrZXl3b3JkIHdhcm5pbmdzIGFzIHRoZSBkZWZhdWx0CgkgICAgYmVoYXZpb3IsIHRoZSBpbmNsdXNpb24gb2YgdGhlIGxhbmd1YWdla3cuc3dnIGZpbGUgaGFzIHRvCgkgICAgYmUgdW5jb21tZW50ZWQgYXQgZWFjaCBsYW5ndWFnZS5zd2cgZmlsZS4KCgkgICAgU28sIGFsbCB0aGUgbGFuZ3VhZ2UgbWFpbnRhaW5lcnMsIHBsZWFzZSBjaGVjayB0aGUKCSAgICBrZXl3b3JkcyBsaXN0LiAKCgkgICAgQWxzbywgeW91IGNhbiBhZGQgYnVpdC1pbiBuYW1lcywgYW5kIG5vdCBvbmx5IGtleXdvcmRzLCBsaWtlCgkgICAgJ1RydWUvRmFsc2UnIGluIHB5dGhvbi4gIFJlbWVtYmVyIHRoYXQgeW91IGNhbiBiZSBtb3JlCgkgICAgc3BlY2lmaWMgYW5kIHJlZmVyIG9ubHkgdG8gbWVtYmVyIG5hbWVzLCBsaWtlICo6OmNvbmZpZ3VyZQoJICAgIG9yICo6OmNnZXQgKHNlZSBhbiBleGFtcGxlIGluIHRoZSB0Y2w4L3RjbDhrdy5zd2cgZmlsZSksCgkgICAgb3Igb25seSBnbG9iYWwgbmFtZXMsIGxpa2UgOjpyYW5nZSAoc2VlIGFuIGV4YW1wbGUgaW4gdGhlCgkgICAgcHl0aG9uL3B5dGhvbmt3LnN3ZyBmaWxlLgoKCSAgICBKdXN0IHRvIGJlIGNvbnNpc3RlbnQsIHVzZSB0aGUgZm9sbG93aW5nIGNvZGVzOgoKCSAgICAtIFVzZSBjb2RlIDMxNCBmb3Iga2V5d29yZCBhbmQvb3IgZmF0YWwgYmFkIG5hbWVzLgoJICAgIC0gVXNlIGNvZGUgMzIxIGZvciBidWl0LWluIGFuZC9vciBub3QgZmF0YWwgYmFkIG5hbWVzLgogICAgICAgICAgIAogICAgICAgICAgICBzbywgdGhleSBjYW4ndCBiZSBkaXNhYmxlZC9lbmFibGVkIGluZGVwZW5kZW50bHkgKHNlZQoJICAgIHB5dGhvbi9weWh0b25rdy5zd2cgZm9yIGV4YW1wbGVzKS4KCgkgICAgKioqKiBBbmQgZG9uJ3QgYWRkIGFueSBuZXcgdGVzdCBmaWxlIHdpdGhvdXQgY2hlY2tpbmcgaXQKCSAgICB3aXRoIHRoZSAtV2FsbGt3IG9wdGlvbiEhICh0aGF0IGluY2x1ZGVzIG1lKSAqKioqKi4KCSAgCgoxMi8xMS8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgU0YgYnVnICM4NTQ2MzQKICAgICAgICAgICAgQWRkZWQgc3VwcG9ydCBmb3IgYWNjZXB0aW5nIHRoZSBVbml4IGRpcmVjdG9yeSBzZXBhcmF0b3IgJy8nIG9uIAogICAgICAgICAgICBXaW5kb3dzIGFuZCB0aGUgTWFjIGluIGFkZGl0aW9uIHRvIHRoZSBuYXRpdmUgb25lICggJ1wnIG9uIAogICAgICAgICAgICBXaW5kb3dzKS4gVGhpcyBjYW4gYmUgdXNlZCBpbiAlaW1wb3J0LCAlaW5jbHVkZSBhbmQgY29tbWFuZGxpbmUgCiAgICAgICAgICAgIG9wdGlvbnMgdGFraW5nIGEgcGF0aCwgZm9yIGV4YW1wbGUgLUkuIE9uIEN5Z3dpbiwgYm90aCB0aGUgV2luZG93cwogICAgICAgICAgICBhbmQgVW5peCBkaXJlY3Rvcnkgc2VwYXJhdG9yIGNhbiBub3cgYmUgdXNlZCAod2FzICcvJyBvbmx5KS4KICAgICAgICAgICAgCjEyLzEwLzIwMDM6IG1tYXR1cyAoTWFyY2VsbyBNYXR1cykKCiAgICAgICAgICAgIFtweXRob25dIEltcGxlbWVudGluZyB0aGUgcnVudGltZSAicmVwcm90ZWN0ZWQiIGRpcmVjdG9yCgkgICAgbWVtYmVycywgaWYgeW91IGhhdmU6CiAgICAKICAgICAgICAgICAgICAgICVmZWF0dXJlKCJkaXJlY3RvciIpIEI7CgogICAgICAgICAgICAgICAgY2xhc3MgQmFyIHsKICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgdmlydHVhbCB+QmFyKCk7CiAgICAgICAgICAgICAgICAgIHZpcnR1YWwgaW50IGhlbGxvKCkgeyByZXR1cm4gZG9faGVsbG8oKTspCgogICAgICAgICAgICAgICAgcHJvdGVjdGVkOgogICAgICAgICAgICAgICAgICB2aXJ0dWFsIGludCBkb19oaSgpIHtyZXR1cm4gMDt9CiAgICAgICAgICAgICAgICAgIHZpcnR1YWwgaW50IGRvX2hlbGxvKCkge3JldHVybiAwO30KICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICB0aGVuLCBhdCB0aGUgcHl0aG9uIHNpZGUKCiAgICAgICAgICAgICAgICBpbXBvcnQgbXlfbW9kdWxlCgogICAgICAgICAgICAgICAgY2xhc3MgRm9vKG15X21vZHVsZS5CYXIpOgogICAgICAgICAgICAgICAgICBkZWYgZG9faGVsbG8oc2VsZik6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDEKICAgICAgICAgICAgICAgICAgcGFzcwogICAgICAgICAgICAgICAgIAoJICAgICAgICBiID0gQmFyKCkgIyBQdXJlIEMrKyBEaXJlY3RvciBjbGFzcwogICAgICAgICAgICAgICAgZiA9IEZvbygpICMgQysrIERpcmVjdG9yICsgcHl0aG9uIG1ldGhvZHMKCiAgICAgICAgICAgICAgICBiLmhlbGxvKCkgIyBPaywgYW5kIGl0IGNhbGxzIEMrKyBCYXI6OmRvX2hlbGxvKCkKICAgICAgICAgICAgICAgIGYuaGVsbG8oKSAjIE9rLCBhbmQgaXQgY2FsbHMgUHl0aG9uIEZvbzo6ZG9faGVsbG8oKQoKICAgICAgICAgICAgICAgIGIuZG9faGkoKSAjIFJ1bnRpbWVFcnJvciwgZG9faGkoKSBpcyBwcm90ZWN0ZWQhIQogICAgICAgICAgICAgICAgZi5kb19oaSgpICMgUnVudGltZUVycm9yLCBkb19oaSgpIGlzIHByb3RlY3RlZCEhCiAKICAgICAgICAgICAgICAgIGIuZG9faGVsbG8oKSAjIFJ1bnRpbWVFcnJvciwgZG9faGVsbG8oKSBpcyBwcm90ZWN0ZWQhIQogICAgICAgICAgICAgICAgZi5kb19oZWxsbygpICMgT2ssIHNpbmNlIGl0IGl0cyByZWRlZmluZWQgaW4gcHl0aG9uLgoKICAgICAgICAgICAgSGVyZSBCYXIuZG9faGVsbG8gaXMgYWx3YXlzIHByb3RlY3RlZCwgYnV0IEZvby5kb19oZWxsbwogICAgICAgICAgICBpcyAicHVibGljIiwgYmVjYXVzZSBpdCBpcyByZWRlZmluZWQgaW4gcHl0aG9uLiBCZWZvcmUsCgkgICAgYWxsIHRoZSAnZG9faGVsbG8nIG1ldGhvZHMgd2VyZSBwdWJsaWMuCgoJICAgIFRoaXMgc2VlbXMgdG8gYmUgYSBnb29kIGNvbXByb21pc2UgYmV0d2VlbiBDKysgYW5kIHB5dGhvbgoJICAgIHBoaWxvc29waGllcywgaWUsIGFsbCB0aGUgZGlyZWN0b3IgcHJvdGVjdGVkIG1ldGhvZHMga2VlcAoJICAgIHByb3RlY3RlZCBhdCB0aGUgdXNlciBzaWRlIChDKysgd2F5KSB1bnRpbCB0aGV5IGFyZQoJICAgIHJlZGVmaW5lZCAocHl0aG9uIHdheSwgd2VyZSBhbGwgZGVmaW5lZCBtZXRob2RzIGFyZSBhbHdheXMKCSAgICBwdWJsaWMpLiBBbmQgdGhpcyBpcyBub3Qgb25seSBhIGdvb2QgY29tcHJvbWlzZSwgaXQgYWxzbwoJICAgIHNlZW1zIHRvIGJlIHRoZSBvbmx5IHdheSB0byBkbyBpdCA6KS4KCgkgICAgTm93IHJ1YnkgaGFzIG5hdGl2ZSBkaXJlY3RvciBwcm90ZWN0ZWQgbWVtYmVycywgYW5kIHB5dGhvbgoJICAgIHB1cmUgcnVudGltZSBzdXBwb3J0LiBJIGd1ZXNzIHRoZXNlIGFyZSB0aGUgdHdvIHBvc3NpYmxlCgkgICAgZXh0cmVtZSBjYXNlcy4gQW5kIGhvcGVmdWxseSwgdGhleSBjb3VsZCBiZSB1c2VkIGFzCgkgICAgdGVtcGxhdGVzIHRvIG1vZGlmeSB0aGUgb3RoZXIgbGFuZ3VhZ2VzIHRoYXQgc3VwcG9ydAoJICAgIGRpcmVjdG9ycywgc28gdGhleSBjYW4gInJlcHJvdGVjdCIgdGhlIHByb3RlY3RlZCBkaXJlY3RvcgoJICAgIG1lbWJlcnMgYXQgdGhlIHRhcmdldCBsYW5ndWFnZSBzaWRlLgoKCSAgICBUaGlzIGZpbmlzaGVkIHRoZSBkaXJlY3RvciBwcm90ZWN0ZWQgc3VwcG9ydCBmb3IgdGhlIAoJICAgIHB5dGhvbiBsYW5ndWFnZS4gT2NhbG0gd2lsbCBuZWVkIHRvIGFkZCB0aGUKCSAgICAicmVwcm90ZWN0aW9uIiBsYXRlci4KCjEyLzEwLzIwMDM6IG1tYXR1cyAoTWFyY2VsbyBNYXR1cykKCgkgICAgVGhlIGZvbGxvd2luZyBjYXNlIChyZXBvcnRlZCBieSBMeWxlIEpvaG5zb24pIHdhcyBmaXhlZDoKCgkgICAgICAlcmVuYW1lKHgpIEZvbzo6eSgpOwogCgkgICAgICBjbGFzcyBGb28geyAKCSAgICAgIHB1YmxpYzoKCSAgICAgICAgdm9pZCB5KCk7CgoJICAgICAgcHJvdGVjdGVkOgoJICAgICAgICBpbnQgeDsKCSAgICAgIH07CgoJICAgc3dpZyB3YXJuZWQgdGhhdCB0aGUgc3ltYm9sICd4JyB3YXMgYWxyZWFkeSBkZWZpbmVkLCBhbmQKICAgICAgICAgICB0aGUgcmVuYW1pbmcgZmFpbHMuICd4JyB3YXMgbm90IGVtaXR0ZWQsIHNpbmNlIGl0IGlzCiAgICAgICAgICAgcHJvdGVjdGVkLCBidXQgaXQgd2FzIGtlcHQgaW4gdGhlIHN5bWJvbCB0YWJsZSB3aXRoIHRvbwogICAgICAgICAgIG11Y2ggaW5mb3JtYXRpb24uCgoJICAgTm93IHN3aWcgd29ya3MgZm9yIGFsbCB0aGUgY2FzZXMgKHBsYWluLCBkaXJlY3RvciBhbmQKCSAgIGRpcnByb3QpIGFnYWluLiBUaGlzIHdhcyBmaXhlZCBieSBhbGxvd2luZyB0aGUgcGFyc2VyLnkgdG8KCSAgIGRlY2lkZSBtdWNoIGNsb3NlciB3aGF0IHRvIGRvIHdpdGggJ3gnLiBCZWZvcmUgYWxsIHRoZQoJICAgZGlzY2FyZGluZyBvciBnZW5lcmF0aW9uIHdhcyByZXNvbHZlZCBhdCB0aGUgbGFuZy5jeHgKCSAgIHN0YWdlLiBBbHNvIHRoZSBjaGFuZ2VzIGluIHBhcnNlci55IHRvIGltcGxlbWVudCB0aGUKCSAgIGRpcmVjdG9yIHByb3RlY3RlZCBtb2RlIGFyZSBub3cgbXVjaCBtb3JlIGVuY2Fwc3VsYXRlZCwgYW5kCgkgICB0aGV5IGdldCBkaXNhYmxlZCBpZiB0aGUgbW9kZSBpcyBub3QgZW5hYmxlZC4gQmVmb3JlIHRoZQoJICAgZGVhY3RpdmF0aW9uIHdhcyBkb25lIGF0IHRoZSBnZW5lcmF0aW9uIHN0YWdlIChsYW5nLmN4eCkuCgoJICAgQnkgdGhlIG90aGVyIGhhbmQsIGlmIHRoZSBkaXJlY3RvciBtb2RlIGlzIGVuYWJsZWQsIGFuZAoJICAgJXJlbmFtZSBpcyBkb25lLCByZXVzaW5nIGEgcHJvdGVjdGVkIG1lbWJlciBuYW1lLCB0aGVyZSBpcwoJICAgYSBwYXRob2xvZ2ljYWwgY2FzZToKCgkgICAgICVyZW5hbWUoeCkgRm9vOjp5KCk7CiAKICAgICAgICAgICAgIGNsYXNzIEZvbyA6IHB1YmxpYyBBIHsKCSAgICAgcHVibGljOgoJICAgICAgIHZvaWQgeSgpOwoKCSAgICAgcHJvdGVjdGVkOgoJICAgICAgIGludCB4OyAgICAgICAgICAgIC8qIHdvcmtzICovCgkgICAgICAgc3RhdGljICBpbnQgeDsgICAgLyogd29ya3MgKi8KCSAgICAgICBzdGF0aWMgIHZvaWQgeCgpOyAvKiB3b3JrcyAqLwoJICAgICAgIHR5cGVkZWYgdm9pZCB4KCk7IC8qIHdvcmtzICovCgoJICAgICAgIHZpcnR1YWwgdm9pZCB4KCk7IC8qIGFsd2F5cyBmYWlscywgYXMgaXQgc2hvdWxkLCBzaW5jZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb286OngoKSB3aWxsIGJlIGVtaXR0ZWQgaW4gdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdG9yICovCgoJICAgICAgIHZvaWQgeCgpOyAvKiBhbHdheXMgZmFpbHMsIGJ1dCBzb21ldGltZXMgaXQgc2hvdWxkbid0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2luY2UgdGhlIEZvbzo6eCgpIHdpbGwgbm90IGJlIGVtaXR0ZWQgaWYKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0IGlzIG5vdCB2aXJ0dWFsICovCgoJICAgICB9OwoKCSAgIFRoZSBsYXN0IGNhc2UgaXMgbm90IGFsd2F5cyByaWdodCBiZWNhdXNlIGF0IHRoZSBwYXJzZXIucHkKCSAgIHN0YWdlIGl0IGlzIG5vdCBwb3NzaWJsZSB0byBkZWNpZGUgaWYgdGhlIHByb3RlY3RlZCBtZW1iZXIKCSAgIEZvbzo6eCgpIGNvdWxkIG9yIG5vdCBjb25mbGljdCB3aXRoIHRoZSByZW5hbWVkIEZvbzo6eSgpLAoJICAgc2luY2UgRm9vOjp4KCkgY291bGQgYmUgdmlydHVhbCBieSBpbmhlcml0YW5jZS4KCgkgICBJIGd1ZXNzIHRoaXMganVzdCBhbiBpbnRyaW5zaWMgbGltaXRhdGlvbiwgYW5kIG5vIG11Y2ggY2FuCgkgICBiZSBkb25lIGFib3V0IGl0IHdpdGhvdXQgcmVzb3J0aW5nIGludG8gbGFyZ2VyIGNoYW5nZXMgdG8KCSAgIHBvc3Rwb25lLCB1bmRlciBjZXJ0YWluIGNvbmRpdGlvbnMsIHRoZSBtdWx0aXBseSBzeW1ib2wKCSAgIGRldGVjdGlvbiAobGFuZy5jeHggc3RhZ2UpLgoJICAgCgkgICBTbywgYnkgbm93LCBpdCBpcyBqdXN0IGNvbnNpZGVyZWQgYSB3ZWxsIGtub3duICJmZWF0dXJlIiBpbgoJICAgdGhlIGRpcmVjdG9yIHByb3RlY3RlZCBtb2RlLiBUaGUgZ29vZCBuZXdzIGlzIHRoYXQgaXQgc2VlbXMKCSAgIHRvIGJlIGEgcmFyZSBjYXNlLCBhbmQgaXQgY2FuIGJlIGF2b2lkZWQgYnkgdGhlIHVzZXIgYnkKCSAgIGhpZGluZyAneCcgYmVmb3JlIHJlbmFtaW5nICd5JzoKCgkgICAgICVyZW5hbWUoX3gpIEZvbzo6eCgpOwoJICAgICAlcmVuYW1lKHgpIEZvbzo6eSgpOwoJICAgCgoxMi8wOC8yMDAzOiBtbWF0dXMgKE1hcmNlbG8gTWF0dXMpCgkgICAgVGhlIHZpcnR1YWwgbWV0aG9kIGRldGVjdGlvbnMgbm93IHByb3Blcmx5CgkgICAgdHJlYXRzIHRoZSBmb2xsb3dpbmcgY2FzZXM6CgogICAgICAgICAgICAgbmFtZXNwYWNlIGZvbyB7IHR5cGVkZWYgaW50IEludDsgfQoJICAgICBzdHJ1Y3QgQSB7fTsKCSAgICAgdHlwZWRlZiBBIEI7CgogICAgICAgICAgICAgc3RydWN0IEZvbyB7CiAgICAgICAgICAgICAgIHZpcnR1YWwgfkZvbygpIHt9CgogICAgICAgICAgICAgICB2aXJ0dWFsIEZvbyogY2xvbmVyKCkgPSAwOwoJICAgICAgIHZpcnR1YWwgaW50IGdldF92YWx1ZSgpID0gMDsKCSAgICAgICB2aXJ0dWFsIEEqIGdldF9jbGFzcygpID0gMDsKCSAgICAgICB2aXJ0dWFsIHZvaWQganVzdF9kb19pdCgpID0gMDsKCSAgICAgfTsKCiAgICAgICAgICAgICBzdHJ1Y3QgQmFyIDogRm9vCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgIEJhciogY2xvbmVyKCk7CiAgICAgICAgICAgICAgIGZvbzo6SW50IGdldF92YWx1ZSgpOwogICAgICAgICAgICAgICBCKiBnZXRfY2xhc3MoKTsKICAgICAgICAgICAgICAgdm9pZCBqdXN0X2RvX2l0KCk7CiAgICAgICAgICAgICB9OwogCiAgICAgICAgICAgIEFsbCB0aGUgRm9vIGFuZCBCYXIgbWV0aG9kcyBhcmUgdmlydHVhbC4gIEEgbmV3IGF0dHJpYnV0ZQoJICAgICJ2aXJ0dWFsOnR5cGUiIHJlY29yZCB0aGUgYmFzZSBwb2x5bW9ycGhpYyB0eXBlLiBJbiB0aGUKCSAgICBwcmV2aW91cyBjYXNlcyB3ZSBoYXZlOgoKCSAgICAgICB0eXBlIDogQmFyICAgICAgIHZpcnR1YWw6dHlwZSA6IEZvbwoJICAgICAgIHR5cGUgOiBmb286OkludCAgdmlydHVhbDp0eXBlIDogaW50CgkgICAgICAgdHlwZSA6IEIgICAgICAgICB2aXJ0dWFsOnR5cGUgOiBBCgkgICAgICAgdHlwZSA6IHZvaWQgICAgICB2aXJ0dWFsOnR5cGUgOiB2b2lkCgogICAgICAgICAgICBUaGlzIGF0dHJpYnV0ZSBpcyB1c2VmdWwgaW4gbGFuZ3VhZ2VzIChqYXZhK2RpcmVjdG9ycykKCSAgICB0aGF0IGNvdWxkIGhhdmUgcHJvYmxlbXMgcmVkZWZpbmluZyBCYXIqIEJhcjo6Y2xvbmVyKCkuCgoJICAgIElmIHlvdSBuZXZlciBoYWQgY29kZSBsaWtlIHRoZSBhYm92ZSwgeW91IHdpbGwgc2VlIG5vCgkgICAgZWZmZWN0cy4gQnV0IGlmIHlvdSBoYXZlIHNvbWUgY29kZSBsaWtlIHRoYXQsIHlvdQoJICAgIHdpbGwgc2VlIHNvbWUgZWZmZWN0cyBzaW5jZSBzb21lIG1ldGhvZHMgdGhhdAoJICAgIGJlZm9yZSB3ZXJlIG5vdCBwcm9wZXJseSB0cmVhdGVkIGFzIHZpcnR1YWwsCgkgICAgd2lsbCBzdGFydCB0byBhY3QgbGlrZSB0aGF0LiBUaGlzIGNvdWxkIGVubGFyZ2UKCSAgICB5b3VyIGRpcmVjdG9yIGNsYXNzZXMuCgkgICAgCgoxMi8wOC8yMDAzOiBtbWF0dXMgKE1hcmNlbG8gTWF0dXMpCgkgICAgVGhlIGRpcmVjdG9yIHByb3RlY3RlZCBtZW1iZXIgc3VwcG9ydCAoZGlycHJvdCkKCSAgICBpcyBkaXNhYmxlZCBieSBkZWZhdWx0LgoJICAgIAoJICAgIEl0IGNhbiBiZSBlbmFibGUgYnkgdXNpbmcgJy1kaXJwcm90JyBvciBieSBhZGRpbmcKCSAgICB0aGUgb3B0aW9uIHRvIHRoZSBtb2R1bGUgZGVjbGFyYXRpb24sIGxpa2U6CgogICAgICAgICAgICAlbW9kdWxlKGRpcmVjdG9ycz0iMSIsZGlycHJvdD0iMSIpIG15X21vZHVsZQoKCSAgICBUaGlzIG1vZHVsZSBvcHRpb24gd2FzIGFkZGVkIHRvIHByb3Blcmx5IGNvbXBpbGUgdGhlCgkgICAgZGlyZWN0b3JfcHJvdGVjdGVkLmkgYW5kIGRpcmVjdG9yX25lc3RlZC5pIGV4YW1wbGVzLgoJICAgIAoJICAgIFRoZSBmZWF0dXJlIGhhcyBiZWVuIHRlc3RlZCB3aXRoIHB5dGhvblsyLjIsMi4zXSAKCSAgICBhbmQgcnVieVsxLjYuN10sIGJvdGggYXQgY29tcGlsYXRpb24gYW5kIHJ1bnRpbWUsIGFuZCAKCSAgICBqYXZhW2oyc2RrMS40LjFfMDFdLCBidXQgb25seSBhdCBjb21waWxhdGlvbiAobXkgamF2YQoJICAgIGluc3RhbGxhdGlvbiBkb2Vzbid0IHJ1biBhbnkgb2YgdGhlIGRpcmVjdG9yIGV4YW1wbGVzLAoJICAgIG9sZHMgbm9yIG5ld3MpLgoKCSAgICBQbGVhc2UgdGVzdCBmb3Igb2NhbWwgYW5kIGphdmEuCgkgICAgCgkgICAgVGhlIGVycm9ycyByZXBvcnRlZCBieSBXaWxsaWFtIGFuZCBTY290dCB3ZXJlIGZpeGVkLAoJICAgIGV4Y2VwdCBmb3IgYSB3YXJuaW5nIGFib3V0ICBTV0lHX0phdmFUaHJvd0V4ZWNwdGlvbigpCgkgICAgbXVsdGlwbHkgZGVmaW5lZC4gSSBjYW4ndCByZXByb2R1Y2UgdGhpcyBlcnJvciB3aXRoIG15CgkgICAgZXhhbXBsZXMuIFdlIHdpbGwgd2FpdCBmb3IgU2NvdHQgdG8gc2VuZCB1cyBhIG1pbmltYWwKCSAgICBjYXNlLgoKCjEyLzA3LzIwMDM6IG1tYXR1cyAoTWFyY2VsbyBNYXR1cykKCSAgICBUaGUgZGlyZWN0b3IgcHJvdGVjdGVkIG1lbWJlciBzdXBwb3J0IGhhcyBiZWVuCgkgICAgY29tcGxldGx5IG1vdmVkIG91dCBmcm9tIHB5dGhvbi5jeHgsIGFuZCBub3cKCSAgICByZXNpZGVzIGluIHRoZSBjb21tb24gbGFuZy5jeHgsIGVtaXQuY3h4IGFuZAoJICAgIGFsbG9jYXRlLmN4eCBmaWxlcy4gCgoJICAgIFRoaXMgbWVhbnMgaXQgc2hvdWxkIHdvcmsgZm9yIGFsbCB0aGUgb3RoZXIgbGFuZ3VhZ2VzCgkgICAgdGhhdCBjdXJyZW50bHkgc3VwcG9ydCBkaXJlY3RvcnMsIGllLCBweXRob24sIGphdmEsIG9jYWxtCgkgICAgYW5kIHJ1YnkuCgoJICAgIFRoZSBjaGFuZ2UgaGFzIGJlZW4gdGVzdGVkIHdpdGggcHl0aG9uIChjb21waWxhdGlvbitydW50aW1lKQoJICAgIGFuZCBqYXZhIChqdXN0IGNvbXBpbGF0aW9uKS4KCSAgICAKCSAgICBQbGVhc2UgYWRkIHJ1bnRpbWUgdGVzdHMgZm9yIHRoZSBtaXNzaW5nIGxhbmd1YWdlcyAKCSAgICBhbmQgdGVzdCBpdC4KCgkgICAgVGhlICctbm9kaXJwcm90JyBvcHRpb24gd2FzIG1vdmVkIHRvIHRoZSBwcmluY2lwYWwgbWFpbiwKCSAgICBhbmQgY2FuIGJlIHVzZWQgZnJvbSBhbGwgdGhlIGxhbmd1YWdlcy4KCjEyLzA3LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gRml4ZWQgYW5kIGltcHJvdmVkIGVycm9yIGNoZWNraW5nIG9mIFNUUklOR19PVVQgdHlwZW1hcHMgaW4gCiAgICAgICAgICAgIHZhcmlvdXMuaS4KCjEyLzA0LzIwMDM6IG1tYXR1cyAoTWFyY2VsbyBNYXR1cykKCgkgICAgLSBOb3cgdGhlIHZpcnR1YWwgbWVtYmVycyB3aXRoIG5vIGV4cGxpY2l0IGRlY2xhcmF0b3IKCSAgICBhcmUgcHJvcGVybHkgaWRlbnRpZmllZDoKCSAgICAKICAgICAgICAgICAgICAgIHN0cnVjdCBBICB7CiAgICAgICAgICAgICAgICAgdmlydHVhbCBpbnQgZigpID0gMDsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgc3RydWN0IEIgOiBBIHsKICAgICAgICAgICAgICAgICAgaW50IGYoKTsKICAgICAgICAgICAgICAgIH07CgoJICAgIEhlcmUsIEI6OmYoKSBpcyB2aXJ0dWFsLCBhbmQgdGhlIGRpcmVjdG9yIGFuZCB0aGUKCSAgICB2aXJ0dWFsIGVsaW1pbmF0aW9uIG1lY2hhbmlzbSBub3cgcmVjb2duaXplIHRoYXQuCgogICAgICAgICAgICAtIFtDI10gVGhpcyBmaXggYWxzbyBmaXhlcyB0aGUgcHJvYmxlbSB3aGVyZSAnb3ZlcnJpZGUnIHdhcyBub3QgYmVpbmcgCiAgICAgICAgICAgIHVzZWQgb24gYW55IG92ZXJyaWRkZW4gdmlydHVhbCBtZXRob2QsIHNvIGZvciBzdHJ1Y3QgQiBhYm92ZSwgCiAgICAgICAgICAgIHRoaXMgQyMgY29kZSBpcyBnZW5lcmF0ZWQ6CgogICAgICAgICAgICAgICAgcHVibGljIGNsYXNzIEIgOiBBIHsKICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgZigpIHsKICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgIH0KCgkgICAgLSBJbml0aWFsIHN1cHBvcnQgZm9yIHByb3RlY3RlZCB2aXJ0dWFsIG1ldGhvZHMuIFRoZXkgYXJlIG5vdwoJICAgIHByb3Blcmx5IGVtaXR0ZWQgd2hlbiB1c2luZyB3aXRoIGRpcmVjdG9yIChweXRob24gb25seSBieQoJICAgIG5vdykuCgkgICAgCiAgICAgICAgICAgICAgICAlZmVhdHVyZSgiZGlyZWN0b3IiKSBBOyAgICAKICAgICAgICAgICAgICAgIHN0cnVjdCBBICB7CiAgICAgICAgICAgICAgICBwcm90ZWN0ZWQ6CiAgICAgICAgICAgICAgICAgdmlydHVhbCBpbnQgZjEoKSA9IDA7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICVmZWF0dXJlKCJkaXJlY3RvciIpIEI7CiAgICAgICAgICAgICAgICBzdHJ1Y3QgQiA6IEF7CiAgICAgICAgICAgICAgICBwcm90ZWN0ZWQ6CiAgICAgICAgICAgICAgICAgIGludCBmMSgpOwogICAgICAgICAgICAgICAgICB2aXJ0dWFsIGYyKCk7CiAgICAgICAgICAgICAgICB9OwoKCSAgICBUaGlzIGNhbiBiZSBkaXNzYWJsZWQgYnkgdXNpbmcgdGhlICctbm9kaXJwcm90JyBvcHRpb24uCgoJICAgIC0gVGhlIGZlYXR1cmUgJ25vZGlyZWN0b3InIGlzIHdvcmtpbmcgbm93IGF0IHRoZSB0b3AgbGV2ZWwsCgkgICAgc28sIGl0IG11c3Qgd29yayBmb3IgYWxsIHRoZSBsYW5ndWFnZXM6CgogICAgICAgICAgICAgICAgJWZlYXR1cmUoImRpcmVjdG9yIikgQTsKICAgICAgICAgICAgICAgICVmZWF0dXJlKCJub2RpcmVjdG9yIikgQTo6ZjI7CgogICAgICAgICAgICAgICAgc3RydWN0IEEgewogICAgICAgICAgICAgICAgIHZpcnR1YWwgaW50IGYxKCk7CiAgICAgICAgICAgICAgICAgdmlydHVhbCBpbnQgZjIoKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAKCSAgICBpbiB0aGlzIGNhc2UsIG9ubHkgJ2YxJyBpcyBleHBvcnRlZCB0byB0aGUgZGlyZWN0b3IgY2xhc3MuCgkgICAgCgkgICAgLSBBZGRlZCBkaXJlY3RvciBzdXBwb3J0IGZvciBjb25zdCBUWVBFJiBhcmd1bWVudHMgKHB5dGhvbikuCgoxMi8wMi8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEZpeCBmb3IgSU5PVVQgYW5kIE9VVFBVVCB0eXBlbWFwcyBpbiB0eXBlbWFwcy5pIGZvciB3aGVuIHRoZSBKTkkgdHlwZSAKICAgICAgICAgICAgaXMgYmlnZ2VyIHRoYW4gdGhlIEMgdHlwZS4gRm9yIGV4YW1wbGUsIHVuc2lnbmVkIGxvbmcgKDMyYml0cyBvbiBtb3N0IHN5c3RlbXMpCiAgICAgICAgICAgIGlzIG1hcHBlZCB0byBqbG9uZyAoNjRiaXRzKS4gUmV0dXJuZWQgdmFsdWUgd2FzIGluY29ycmVjdC4gQnVnIHJlcG9ydGVkIGJ5IAogICAgICAgICAgICBCcmlhbiBIYXdsZXkuCgoxMi8wMi8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0MjIGFuZCBKYXZhXSBCZXR0ZXIgZml4IGZvciBlbnRyeSBkYXRlZCAwNS8xMS8yMDAzLiBGaXhlcyB0aGUgZm9sbG93aW5nCiAgICAgICAgICAgIHR5cGVtYXBzOgoKICAgICAgICAgICAgSmF2YTogamF2YWJhc2UsIGphdmFpbnRlcmZhY2VzLCBqYXZhaW1wb3J0cywgamF2YWNsYXNzbW9kaWZpZXJzLAogICAgICAgICAgICBqYXZhcHRyY29uc3RydWN0b3Jtb2RpZmllcnMsIGphdmFmaW5hbGl6ZSwgamF2YWdldGNwdHIgJiBqYXZhY29kZS4KICAgICAgICAgICAgQyM6IGNzYmFzZSwgY3NpbnRlcmZhY2VzLCBjc2ltcG9ydHMsIGNzY2xhc3Ntb2RpZmllcnMsCiAgICAgICAgICAgIGNzcHRyY29uc3RydWN0b3Jtb2RpZmllcnMsIGNzZmluYWxpemUsIGNzZ2V0Y3B0ciAmIGNzY29kZS4KCiAgICAgICAgICAgIEl0IGFsc28gZml4ZXMgYnVnIGluIHVzaW5nIGFycmF5cyBvZiBDIHN0cnVjdHMgd2l0aCBhcnJheXNfamF2YS5pIAogICAgICAgICAgICBhcyByZXBvcnRlZCBTY290dCBNaWNoZWwuCgoxMi8wMi8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIFtQZXJsXSBGaXhlZCBbIDg1MjExOSBdIHJlY3Vyc2l2ZSBpbmhlcml0YW5jZSBpbiBvdXRwdXQgLnBtLCBwZXJsNS4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgV2lsbGlhbSBEb3dsaW5nLgoKMTIvMDIvMjAwMzogYmVhemxleQogICAgICAgICAgICBbVGNsXSBGaXhlZCBbIDc1NTM4MiBdIGNhbGxpbmcgZnVuYyhjb25zdCB2ZWN0b3I8VD4mIHApIGV2YWx1YXRlcyBwWzBdIGluIGludGVycC4KICAgICAgICAgICAgVGhlIFRjbCB0eXBlIGNoZWNrZXIgd2FzIGltcHJvcGVybHkgaGFuZGxpbmcgdGhlIGludGVycHJldGVyIHJlc3VsdCB3aGVuCiAgICAgICAgICAgIHR5cGUgdmlvbGF0aW9ucyB3ZXJlIHN1cHBvc2VkIHRvIGJlIGlnbm9yZWQuCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IEZsYXZpdSBQb3BwLU5vd2FrLgoKMTEvMzAvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIEZpeGVkIFsgNTQ1MDU4IF0gY29uZmlndXJlJ3MgLS13aXRoLXRjbGluY2wgaGFzIG5vIGVmZmVjdAoKMTEvMzAvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBGaXhlZCBbIDc2NjQwOSBdIG1pc3Npbmcgc3ltYm9sIFNXSUdfSmF2YVRocm93RXhjZXB0aW9uIGR1cmluZyBtb2R1bGUgbG9hZAogICAgICAgICAgICBTV0lHcyBpbnRlcm5hbCBmdW5jdGlvbnMgYXJlIGFsbCBzdGF0aWMgYXMgdGhlcmUgaXMgbm8gbmVlZCBmb3IgZGlmZmVyZW50IFNXSUcKICAgICAgICAgICAgZ2VuZXJhdGVkIG1vZHVsZXMgdG8gc2hhcmUgYW55IGNvZGUgYXQgcnVudGltZS4KCjExLzMwLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgW1RjbF0gQWRkZWQgc3VwcG9ydCBmb3IgQysrIHBvaW50ZXJzIHRvIG1lbWJlcnMuCgoxMS8yOC8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgRml4ZWQgWyA4NDgzMzUgXSBEaXJlY3RvcnM6ICNpbmNsdWRlIHdyYXBwZXIgLmggZmlsZSAtIHdhcyBpbmNvcnJlY3RseQogICAgICAgICAgICBhZGRpbmcgYSBkaXJlY3RvcnkgdG8gdGhlIGdlbmVyYXRlZCAjaW5jbHVkZSAiZm9vX3dyYXAuaCIgc3RhdGVtZW50CiAgICAgICAgICAgIGluIHNvbWUgc2l0dWF0aW9ucy4KCjExLzI4LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gRml4ZWQgWyA4NDkwNjQgXSBKQVZBIDogQWNjZXNzIG1vZGlmaWVyIGZvciBkZXJpdmVkIGNsYXNzIHdyb25nLgogICAgICAgICAgICBUaGUgZGVsZXRlKCkgbWV0aG9kIGlzIGFsd2F5cyBwdWJsaWMgbm93LiBJdCB1c2VkIHRvIGJlIHByb3RlY3RlZCB3aGVuZXZlciBhIAogICAgICAgICAgICBkZXN0cnVjdG9yIHdhcyBub24gcHVibGljLiBBbiBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBydW50aW1lIAogICAgICAgICAgICBleGNlcHRpb24gaXMgdGhyb3duIGluc3RlYWQgb2YgbWFraW5nIGRlbGV0ZSgpIHByb3RlY3RlZCBub3cuCgoxMS8yOC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIFtQZXJsNV0gQWRkZWQgc3VwcG9ydCBmb3IgQysrIHBvaW50ZXJzIHRvIG1lbWJlcnMuCgoxMS8yOC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgODUwMTUxIF0gUFlWRVJTSU9OIHdpdGggcHl0aG9uMi4zIGluIGNvbmZpZ3VyZSBvZiBTV0lHIDEuMy4xOSAoTWF5YmUpLgoKMTEvMjgvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCAgWyA4NTA2NjYgXSAjaW5jbHVkZSBleHRyYSBsaW5lIGFkZGVkLiAgCiAgICAgICAgICAgIFRoaXMgc2hvdWxkIGZpeCBzb21lIHByb2JsZW1zIHdpdGggZ2V0dGluZyBjb3JyZWN0IGxpbmUgbnVtYmVycyBvbgogICAgICAgICAgICBlcnJvciBtZXNzYWdlcy4KCjExLzI2LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYW5vdGhlciBvbmUgb2YgTWFyY2VsbydzIGV2aWwgdGVtcGxhdGUgYnVncyAoaW5maW5pdGUKICAgICAgICAgICAgcmVjdXJzaW9uKS4gWyA4NDk1MDQgXSB0ZW1wbGF0ZSBhbmQgdHlwZWRlZiAtPiBpbmYuIHJlY3Vyc2lvbi4KCjExLzI2LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgcGFyc2luZyBwcm9ibGVtIHdpdGggZGVjbGFyYXRpb25zIGxpa2UgdGhpczoKCgkgICAgICAgICBpbnQgKnggPSAmc29tZWFycmF5WzBdOwoKMTEvMjUvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDc1NjU1MiBdIG1pc3NpbmcgZGVmYXVsdCBhcmd1bWVudCBjbGFzcyBzY29wZSB3aXRoICJ8Ii4KICAgICAgICAgICAgVGhpcyBpcyByZWFsbHkgb25seSBhIGJhbmQtYWlkIGZpeCBmb3IgdXNlIG9mIGNsYXNzLWVudW1zIGluCiAgICAgICAgICAgIGV4cHJlc3Npb25zLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICBjbGFzcyBBIHsKICAgICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICBlbnVtIEZsYWcgeyBmbGFnMSA9IDB4MSwgZmxhZzIgPSAweDIgfTsKICAgICAgICAgICAgICAgICAgICAgdm9pZCBmb28oaW50IHggPSBmbGFnMSB8IGZsYWcyKTsKICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIE5vdGU6IHRoZXJlIGFyZSBzdGlsbCBzb21lIChtb3JlIHN1YnRsZSkgY2FzZXMgdGhhdCBhcmUgYnJva2VuLAogICAgICAgICAgICBidXQgaGFyZCB0byBmaXggZHVlIHRvIGFuIGlzc3VlIHdpdGggdGVtcGxhdGUgZXhwYW5zaW9uLiBXaWxsCiAgICAgICAgICAgIGFkZHJlc3MgbGF0ZXIuCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IERtaXRyeSBNaXJvbm92LgoKMTEvMjUvMjAwMzogYmVhemxleQogICAgICAgICAgICBJbmNvcnBvcmF0ZWQgWyA4NDA4NzggXSBzdXBwb3J0IGZvciAlaW5saW5lIHsgLi4uIH0gKFBBVENIKS4KICAgICAgICAgICAgVGhpcyBhZGRzIHN1cHBvcnQgZm9yIHRoZSBmb2xsb3dpbmc6CgogICAgICAgICAgICAgICAgICAlaW5saW5lIHsKICAgICAgICAgICAgICAgICAgICAgIC4uLiBzb21lIGNvZGUgLi4uCiAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhpcyBhbmQgJWlubGluZSAleyAuLi4gJX0gaXMgdGhhdCB0aGUKICAgICAgICAgICAgZW5jbG9zZWQgdGV4dCBpcyBwcm9jZXNzZWQgYnkgdGhlIFNXSUcgcHJlcHJvY2Vzc29yLiAgIFRoaXMKICAgICAgICAgICAgYWxsb3dzIHNwZWNpYWwgbWFjcm9zIGFuZCBvdGhlciBwcm9jZXNzaW5nIHRvIGJlIHVzZWQgaW4gCiAgICAgICAgICAgIGNvbmp1bmN0aW9uIHdpdGggJWlubGluZS4KICAgICAgICAgICAgQ29udHJpYnV0ZWQgYnkgU2FsdmFkb3IgRmFuZGlubyBHYXJjaWEuCgoxMS8yNS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgODM2OTAzIF0gQysrIGluY29uc2lzdGVuY3kgKHdpdGggdm9pZCBhcmd1bWVudHMpLgogICAgICAgICAgICBTV0lHIHdhcyBoYXZpbmcgZGlmZmljdWx0eSB3aXRoIGYoKSB2cyBmKHZvaWQpIGluIEMrKyBwcm9ncmFtcy4KICAgICAgICAgICAgRm9yIGluc3RhbmNlOgoKICAgICAgICAgICAgICAgICAgY2xhc3MgQSB7CiAgICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBmKHZvaWQpID0gMDsKICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgIGNsYXNzIEIgewogICAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgZigpOyAgICAvLyBOb3QgbWF0Y2hlZCB0byBmKHZvaWQpIGNvcnJlY3RseQogICAgICAgICAgICAgICAgICB9OyAKCiAgICAgICAgICAgIFRoZSBwYXJzZXIgbm93IG5vcm1hbGl6ZXMgYWxsIGRlY2xhcmF0aW9ucyBvZiB0aGUgZm9ybSBmKHZvaWQpIAogICAgICAgICAgICBpbiBDKysgY2xhc3NlcyB0byBmKCkuICBUaGlzIHNob3VsZCBmaXggYSB2YXJpZXR5IG9mIHN1YnRsZSAKICAgICAgICAgICAgcHJvYmxlbXMgd2l0aCBpbmhlcml0YW5jZSwgb3B0aW1pemF0aW9ucywgb3ZlcmxvYWRpbmcsIGV0Yy4KICAgICAgICAgICAgUHJvYmxlbSByZXBvcnRlZCBieSBQYXJ0aG8gQmhvd21pY2suCiAKMTEvMjUvMjAwMzogYmVhemxleQogICAgICAgICAgICBbUGVybDVdIEluY29ycG9yYXRlZCBbIDg0MTA3NCBdIGJldHRlciBjcm9ha2luZyAoUEFUQ0gpLiAgVGhpcyBmaXhlcyBzb21lIHByb2JsZW1zCiAgICAgICAgICAgIHdpdGggc3RyaW5ncyBhbmQgcHJvdmlkZXMgc29tZSBuZXcgZXJyb3IgZnVuY3Rpb25zLiAKICAgICAgICAgICAgQ29udHJpYnV0ZWQgYnkgU2FsdmFkb3IgRmFuZGlubyBHYXJjaWEuCiAgICAgICAgICAgIAoxMS8yNS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNzkxODM1IF0gRGVmYXVsdCBhcmd1bWVudCB3aXRoIGNhc3Q6IHR4dCA9IChjaGFyICopInR4dCIgc3ludGF4IEVycm9yLgogICAgICAgICAgICBUaGUgcGFyc2VyIHNob3VsZCBub3cgYWNjZXB0IHRoaW5ncyBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgIHZvaWQgZm9vKGNoYXIgKnMgPSAoY2hhciAqKSAiSGVsbG8iKTsKCiAgICAgICAgICAgIFByb2JsZW0gcmVwb3J0ZWQgYnkgQ2xhdWRpdXMgU2Nobm9yci4KCjExLzI0LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgW1RjbF0gRml4ZWQgcHJvYmxlbSB3aXRoIGNyb3NzIG1vZHVsZSBsaW5raW5nLiAgUHJldmlvdXNseSBtb2R1bGVzIHJlZmVycmVkCiAgICAgICAgICAgIHRvIGJhc2UgY2xhc3NlcyB0aHJvdWdoIGEgZ2xvYmFsIHZhcmlhYmxlLiAgIE5vdywgdGhlIG1vZHVsZSBsb29rcyB1cCBiYXNlCiAgICAgICAgICAgIGNsYXNzZXMgdGhyb3VnaCB0aGUgdHlwZSBzeXN0ZW0gaXRzZWxmLS0tYXZvaWRpbmcgdGhlIG5lZWQgdG8gbGluayB0byBhIGdsb2JhbAogICAgICAgICAgICBsaWtlIGJlZm9yZS4gIENhdmVhdDogIG1vZHVsZXMgd2l0aCBiYXNlIGNsYXNzZXMgbXVzdCBiZSBsb2FkZWQgYmVmb3JlCiAgICAgICAgICAgIG1vZHVsZXMgd2l0aCBkZXJpdmVkIGNsYXNzZXMuCiAKMTEvMjQvMjAwMzogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtHdWlsZV0gSW4gLXNjbSBtb2RlLCB1c2UgKCkgdG8gcmVwcmVzZW50IG51bGwgcG9pbnRlcnMsCgkgICAgYXMgaXQgaXMgZG9uZSBpbiAtZ2ggbW9kZS4KCjExLzIzLzIwMDM6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBBZGQgYSBnZW5lcmF0ZWQgc2NyaXB0ICJwcmVpbnN0LXN3aWciLCB3aGljaCBjYW4gYmUgdXNlZAoJICAgIHRvIGludm9rZSBTV0lHIGJlZm9yZSBpdCBoYXMgYmVlbiBpbnN0YWxsZWQuICBJdCBhcnJhbmdlcwoJICAgIHRoYXQgdGhlIHJ1bnRpbWUgbGlicmFyaWVzIGZyb20gdGhlIHNvdXJjZSBkaXJlY3RvcnkgYXJlCgkgICAgdXNlZC4gCgoxMS8yMy8yMDAzOiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW0d1aWxlXSBJbiAtZ2ggbW9kZSwgZG9uJ3QgZm9yZ2V0IHRvIGNhbGwgU1dJR19HdWlsZV9Jbml0LgoJICAgIEFkZCBhIFNXSUdfY29udHJhY3RfYXNzZXJ0IG1hY3JvLgoKMTEvMjMvMjAwMzogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtNelNjaGVtZV0gVXBkYXRlIHRoZSBjb25maWd1cmUgY2hlY2sgZm9yIHRoZSBkeW5leHQgb2JqZWN0IHRvIHdvcmsKCSAgICB3aXRoIE16U2NoZW1lIDIwNS4KCjExLzIwLzIwMDM6IG1tYXR1cwoJICAgIEZpeGVkIHRoZSBpbmNsdWRlL2ltcG9ydCBlcnJvciByZXBvcnRlZCBieSBLZXJpbSBCb3JjaGFldiwKCSAgICB3aGVyZSB0d28gZmlsZXMgd2l0aCBuYW1lcyBsaWtlCgoJICAgICdkaXIxL2hlbGxvLmknCgkgICAgJ2RpcjIvaGVsbG8uaScKCSAgICAKCSAgICBjYW4gbm90IGJlIGluY2x1ZGUgYXQgdGhlIHNhbWUgdGltZS4gU3dpZyB3YXMgaW5jbHVkaW5nCgkgICAganVzdCB0aGUgZmlyc3Qgb25lLCBhc3N1bWluZyB0aGUgc2Vjb25kIG9uZSB3YXMgbm90IGEKCSAgICBkaWZmZXJlbnQgb25lLCBzaW5jZSBpdCB3YXMgY2hlY2tpbmcva2VlcGluZyBqdXN0IHRoZQoJICAgIGJhc2VuYW1lICdoZWxsby5pJy4KCjExLzE5LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgQ2hhbmdlcyB0byB0aGUgU1dJRyBydW50aW1lIGxpYnJhcnkgc3VwcG9ydC4gCiAgICAgICAgICAgICAgLSAgVGhlIC1jIGNvbW1hbmQgbGluZSBvcHRpb24gaGFzIGJlZW4gcmVuYW1lZCB0byAtbm9ydW50aW1lCiAgICAgICAgICAgICAgLSAgTmV3IGNvbW1hbmQgbGluZSBvcHRpb246IC1ydW50aW1lLiAgV2hlbiBzdXBwbGllZCwgdGhpcwogICAgICAgICAgICAgICAgIGluc2VydHMgdGhlIHN5bWJvbCBTV0lHX0dMT0JBTCBpbnRvIHRoZSB3cmFwcGVyIGNvZGUuICBUaGlzLAogICAgICAgICAgICAgICAgIGluIHR1cm4sIG1ha2VzIGFsbCBvZiB0aGUgcnVudGltZSBzdXBwb3J0IGZ1bmN0aW9ucyBnbG9iYWxseQogICAgICAgICAgICAgICAgIHZpc2libGUuCiAgICAgICAgICAgICAgIC0gTmV3IGxpYnJhcnkgZmlsZTogc3dpZ3J1bi5pLiAgIFVzZWQgdG8gY3JlYXRlIG1vZHVsZXMKICAgICAgICAgICAgICAgICBmb3IgcnVudGltZSBsaWJyYXJ5IChpZiBuZWVkZWQpLgogICAgCjExLzE4LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICAnbWFrZSBzcmNycG0nIHJwbWJ1aWxkIGZpeCAtIHBhdGNoIGZyb20gSm9lIENvb3BlcgoKMTEvMTgvMjAwMzogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtHdWlsZV0gQ2hhbmdlIG1lYW5pbmcgb2YgY29uZmlndXJlIG9wdGlvbiAtLXdpdGgtZ3VpbGUgdG8KCSAgICB0aGUgbmFtZSBvZiB0aGUgR3VpbGUgZXhlY3V0YWJsZS4gIFRoZSBuZXcgb3B0aW9uIC0td2l0aC1ndWlsZS1wcmVmaXggCgkgICAgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgdHJlZSB3aGVyZSBHdWlsZSBpcwoJICAgIGluc3RhbGxlZC4gIChIb3dldmVyLCB1c3VhbGx5IGl0IHN1ZmZpY2VzIHRvIHVzZSB0aGUKCSAgICBzaW5nbGUgb3B0aW9uIC0td2l0aC1ndWlsZS1jb25maWcuKSAgCgkgICAgV2hlbiBydW5uaW5nIHRoZSBydW4gdGVzdHMgdGVzdC1zdWl0ZSwgbWFrZSBzdXJlIHRvIHVzZSB0aGUKCSAgICB2ZXJzaW9uIG9mIEd1aWxlIHRoYXQgU1dJRyB3YXMgY29uZmlndXJlZCBmb3IuCgoxMS8xNy8yMDAzOiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW0d1aWxlXSBJbXByb3ZlbWVudHMgdG8gb2JqZWN0LW93bmVyc2hpcCBtYW5hZ2VtZW50IGluIAoJICAgICItc2NtIiBtb2RlLiAgKFRoZXkgZG8gbm90IGFwcGx5IHRvIHRoZSBkZWZhdWx0ICItZ2giIG1vZGUuKQoJICAgICogUmVuYW1lZCB0aGUgc21vYiB0eXBlIHRoYXQgaW5kaWNhdGVzIHRoYXQgdGhlIG9iamVjdCBjYW4KCSAgICAgIGJlIGdhcmJhZ2UgY29sbGVjdGVkIGZyb20gImNvbGxlY3RlZCBzd2lnIiB0byAiY29sbGVjdGFibGUKCSAgICAgIHN3aWciLCB3aGljaCBpcyBtb3JlIHByZWNpc2UuICAKCSAgICAqIEV4cG9ydCB0aGUgZGVzdHJ1Y3RvciBmdW5jdGlvbnMgYWdhaW4uICBJdCBpcyBub3cKIAkgICAgICBhbGxvd2VkIHRvIGV4cGxpY2l0bHkgY2FsbCBkZXN0cnVjdG9ycywgZXZlbiBmb3IKCSAgICAgIGdhcmJhZ2UtY29sbGVjdGVkIHBvaW50ZXIgb2JqZWN0cy4gIEEgcG9pbnRlciBvYmplY3QKCSAgICAgIHRoYXQgaGFzIGJlZW4gcGFzc2VkIHRvIGEgZGVzdHJ1Y3RvciBpcyBtYXJrZWQgaW4gYQoJICAgICAgc3BlY2lhbCB3YXkgdXNpbmcgYSBuZXcgc21vYiB0eXBlLCAiZGVzdHJveWVkIHN3aWciLgoJICAgICAgKFRoaXMgaGVscHMgYXZvaWQgbmFzdHkgbWVtb3J5IGJ1Z3MsIHdoZXJlIHJlZmVyZW5jZXMgdG8KCSAgICAgIGRlYWQgQyBvYmplY3RzIGFyZSBzdGlsbCBoZWxkIGluIFNjaGVtZS4gTW9yZW92ZXIsIHRoZQoJICAgICAgZ2FyYmFnZSBjb2xsZWN0b3Igd2lsbCBub3QgdHJ5IHRvIGZyZWUgYSBkZXN0cm95ZWQKCSAgICAgIG9iamVjdCBvbmNlIG1vcmUuKQoJICAgICogRGVzdHJ1Y3Rvci1saWtlIGZ1bmN0aW9ucyBjYW4gYWxzbyBtYXJrIHRoZWlyIGFyZ3VtZW50cyAKCSAgICAgIGFzIGRlc3Ryb3llZCBieSBhcHBseWluZyB0aGUgdHlwZW1hcCBTV0lHVFlQRSAqREVTVFJPWUVELgoJICAgICAgKEl0IGNhbGxzIHRoZSBmdW5jdGlvbiBTV0lHX0d1aWxlX01hcmtQb2ludGVyRGVzdHJveWVkLikKCSAgICAqIEZ1bmN0aW9ucyB0aGF0ICJjb25zdW1lIiB0aGVpciBvYmplY3RzIChvciB0aGF0ICJvd24iCgkgICAgICB0aGVtIGFmdGVyIHRoZSBjYWxsKSBjYW4gbWFyayB0aGVpciBhcmd1bWVudHMgYXMKCSAgICAgIG5vdCBnYXJiYWdlIGNvbGxlY3RhYmxlLiAgVGhpcyBjYW4gYmUgZG9uZSBieSBhcHBseWluZwoJICAgICAgdGhlIHR5cGVtYXAgU1dJR1RZUEUgKkNPTlNVTUVELiAgKEl0IGNhbGxzIHRoZSBmdW5jdGlvbgoJICAgICAgU1dJR19HdWlsZV9NYXJrUG9pbnRlck5vbmNvbGxlY3RhYmxlLikKCSAgICAqIFRoZSBtYWNybyBUWVBFTUFQX1BPSU5URVJfSU5QVVRfT1VUUFVUIGZyb20gbGlicmFyeQoJICAgICAgcG9pbnRlci1pbi1vdXQuaSBjcmVhdGVzIGFkZGl0aW9uYWwgdHlwZW1hcHMgCgkgICAgICBQVFJUWVBFICpJTlBVVF9DT05TVU1FRCwgUFRSVFlQRSAqSU5QVVRfREVTVFJPWUVELgoJICAgICAgVGhleSBtYXJrIHRoZSBwYXNzZWQgcG9pbnRlciBvYmplY3QgbGlrZXdpc2UuCgkgICAgICBUaGUgdHlwZW1hcCBQVFJUWVBFICpPVVRQVVQgY3JlYXRlcyBhIGdhcmJhZ2UtY29sbGVjdGFibGUKCSAgICAgIHBvaW50ZXIgb2JqZWN0LCBsaWtlICVuZXdvYmplY3QgZG9lcyBmb3IgYSByZXR1cm5lZCAKCSAgICAgIHBvaW50ZXIuICBVc2UgdGhlIG5ldyB0eXBlbWFwIFBUUlRZUEUgKk9VVFBVVF9OT05DT0xMRUNUQUJMRQoJICAgICAgdG8gY3JlYXRlIGEgcG9pbnRlciBvYmplY3QgdGhhdCB3aWxsIG5vdCBiZSBnYXJiYWdlIGNvbGxlY3RlZC4KCjExLzE3LzIwMDM6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbR3VpbGVdIEhhbmRsZSAkaW5wdXQgaW4gImZyZWVhcmciIHR5cGVtYXBzLgoJICAgIE5ldmVyIHF1YWxpZnkgR09PUFMgc2xvdCBuYW1lcyB3aXRoIHRoZSBjbGFzcyBuYW1lLiAKCSAgICBIYW5kbGUgb3B0aW9uYWwgYXJndW1lbnRzIHByb3Blcmx5IGluIHRoZSBHT09QUyBtZXRob2RzLgoKMTEvMTYvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIEZpeGVzIGZvciBpbnN0YWxsYXRpb24gdG8gd29yayB3aXRoIHRoZSB1cGNvbWluZyBBdXRvbWFrZS0xLjguCiAgICAgICAgICAgIG1raW5zdGFsbGRpcnMgd2FzIGJlaW5nIHVzZWQgYnkgYSBub24tQXV0b21ha2UgbWFrZWZpbGUuIAogICAgICAgICAgICBta2luc3RhbGxkaXJzIGlzIGJlaW5nIHBoYXNlZCBvdXQgYW5kIHNvIHdhcyBub3QgYmVpbmcKICAgICAgICAgICAgY3JlYXRlZCBieSBBdXRvbWFrZS4gaW5zdGFsbC1zaCB1c2VkIGluc3RlYWQuCgoxMS8xNi8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIE51bWVyb3VzIGRpcmVjdG9yIGltcHJvdmVtZW50cywgdHdlYWtzIGFuZCBidWcgZml4ZXMgc2luY2UgCiAgICAgICAgICAgIHRoZSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGhhdmUgYmVlbiBjb250cmlidXRlZCBieSBTY290dCBNaWNoZWwuCgoxMS8xMi8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIFtQeXRob25dIFdoZW4gJWZlYXR1cmUoInNoYWRvdyIpIGlzIHVzZWQgdG8gYWRkIGNvZGUgdG8gc2hhZG93CiAgICAgICAgICAgIGNsYXNzZXMsIHRoZSBzcGVjaWFsIHZhcmlhYmxlICRhY3Rpb24gZXhwYW5kcyB0byB0aGUgbmFtZSBvZiB0aGUKICAgICAgICAgICAgdW5kZXJseWluZyB3cmFwcGVyIGZ1bmN0aW9uIHRoYXQgd291bGQgaGF2ZSBiZWVuIGNhbGxlZCBub3JtYWxseS4KCjExLzEyLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgW1B5dGhvbl0gV2hlbiBnZW5lcmF0aW5nIHByb3h5IGNsYXNzIGNvZGUsIFNXSUcgZW1pdHMgYSBmZXcKICAgICAgICAgICAgZGVmYXVsdCBtZXRob2RzIGZvciBfX3JlcHJfXygpIGFuZCBvdGhlciBQeXRob24gc3BlY2lhbAogICAgICAgICAgICBtZXRob2RzLiAgU29tZSBvZiB0aGVzZSBtZXRob2RzIGFyZSBlbWl0dGVkIGFmdGVyIGFsbCBvZiB0aGUKICAgICAgICAgICAgY29udGVudHMgb2YgYSBjbGFzcy4gSG93ZXZlciwgdGhpcyBtYWtlcyBpdCBoYXJkIHRvIG92ZXJyaWRlCiAgICAgICAgICAgIHRoZSBtZXRob2RzIHVzaW5nICVweXRob25jb2RlIGFuZCBzb21lIG90aGVyIGRpcmVjdGl2ZXMgdGhhdAogICAgICAgICAgICBhbGxvdyBjb2RlIHRvIGJlIGluc2VydGVkIGludG8gYSBjbGFzcy4gIFRoZXNlIHNwZWNpYWwgbWV0aG9kcwogICAgICAgICAgICBhcmUgbm93IGVtaXR0ZWQgaW50byB0aGUgY29kZSAqYmVmb3JlKiBhbGwgb2YgdGhlIG90aGVyIG1ldGhvZHMuCiAgICAgICAgICAgIFN1Z2dlc3RlZCBieSBFcmljIEpvbmVzLgogCjExLzExLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgUHJlcHJvY2Vzc29yIGVuaGFuY2VtZW50LiAgIEZvciBpbmNsdWRlIHN0YXRlbWVudHMgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgICAgJWluY2x1ZGUgImZvby9iYXIuaSIKCiAgICAgICAgICAgIHRoZSBkaXJlY3RvcnkgImZvbyIgaXMgbm93IGFkZGVkIHRvIHRoZSBzZWFyY2ggcGF0aCB3aGlsZSAKICAgICAgICAgICAgcHJvY2Vzc2luZyB0aGUgY29udGVudHMgb2YgYmFyLmkuICBUaHVzLCBpZiBiYXIuaSBpbmNsdWRlcyBvdGhlcgogICAgICAgICAgICBmaWxlcyBpbiB0aGUgc2FtZSBkaXJlY3RvcnksIHRoZXkgd2lsbCBiZSBmb3VuZC4gUHJldmlvdXNseSwKICAgICAgICAgICAgeW91IHdvdWxkIGhhdmUgdG8gYWRkIGFkZGl0aW9uYWwgZGlyZWN0b3JpZXMgdXNpbmcgLUkgdG8gbWFrZSB0aGlzCiAgICAgICAgICAgIHdvcmsgY29ycmVjdGx5LiAgTm90ZTogdGhlIEMgcHJlcHJvY2Vzc29yIHNlZW1zIHRvIGJlaGF2ZSBpbgogICAgICAgICAgICBhbiBpZGVudGljYWwgbWFubmVyIG9uIG1hbnkgKG1vc3Q/IGFsbD8pIHN5c3RlbXMuCiAgICAgICAgICAgIFN1Z2dlc3RlZCBieSBLZXJpbSBCb3JjaGFldi4KCjExLzExLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgQ29uZmlndXJhdGlvbiBjaGFuZ2VzIHRvIG1ha2UgU1dJRyB3b3JrIG9uIE1hYyBPU1ggMTAuMy54IChQYW50aGVyKS4KICAgICAgICAgICAgVGVzdGVkIHdpdGggUHl0aG9uLCBUY2wsIFBlcmwsIGFuZCBSdWJ5LS0tYWxsIG9mIHdoaWNoIHNlZW0gdG8gd29yay4KCjExLzA4LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gRml4ZWQgdGhlIHR5cGVtYXBzIGluIHZhcmlvdXMuaSB3aGljaCB3ZXJlIG1vc3RseSBicm9rZW4uCiAgICAgICAgICAgIGNoYXIgKipTVFJJTkdfSU4gYW5kIGNoYXIgKipTVFJJTkdfUkVUIHR5cGVtYXBzIHJlcGxhY2VkIHdpdGggCiAgICAgICAgICAgIFNUUklOR19BUlJBWS4gZmxvYXQgKkZMT0FUX0FSUkFZX1JFVFVSTiB0eXBlbWFwIHJlbW92ZWQuCgoxMS8wOC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIFtUY2xdIFRjbCBtb2R1bGUgbm93IGVtaXRzIGEgc2FmZSBtb2R1bGUgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24gYnkKICAgICAgICAgICAgZGVmYXVsdC4gIEl0IGNhbiBiZSByZW1vdmVkIGJ5IHJ1bm5pbmcgJ3N3aWcgLW5vc2FmZScuCgoxMS8wNC8yMDAzOiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW0d1aWxlXSBPbmx5IHVzZSB0aGUgU0NNXyBBUEkgd2hlbiB0aGUgZnVuY3Rpb24KCSAgICBgc2NtX3Nsb3RfZXhpc3RzX3AnIGV4aXN0cyAobmVlZGVkIGZvciBHT09QUyBzdXBwb3J0KS4gIAoJICAgIFRoaXMgZnVuY3Rpb24gd2FzIHJlbmFtZWQgZHVyaW5nIHRoZSBHdWlsZSAxLjUgc2VyaWVzCgkgICAgZnJvbSBgc2NtX3Nsb3RzX2V4aXN0c19wJy4KCSAgICBSZXBvcnQgdGhlIHJpZ2h0IHJ1bnRpbWUgbGlicmFyeSB3aGVuIGludm9rZWQgd2l0aAoJICAgIC1zY20gLWxkZmxhZ3MuCgoxMS8wMy8yMDAzOiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW0NoaWNrZW5dIEZpeCAjNzgyMDUyLiAgVGhlIC0td2l0aC1jaGlja2VuY2ZnIGNvbmZpZ3VyZQoJICAgIG9wdGlvbiAoYW5kIG90aGVycykgd2VyZSBub3QgYWNjZXB0ZWQuCgoxMS8wMi8yMDAzOiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW0d1aWxlXSBNZXJnZSBuZXcgc2V0IG9mIEdPT1BTIGNoYW5nZXMgYnkgSm9obiBMZW56LgoJICAgIEdPT1BTIG9iamVjdHMgYXJlIG5vdyBtYW5pcHVsYXRlZCBkaXJlY3RseSBieSB0aGUgQyBjb2RlLgoJICAgIFNvbWUgZml4ZXMgdG8gdHlwZW1hcC1HT09QUyBpbnRlcmFjdGlvbi4KCjExLzAyLzIwMDM6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbR3VpbGVdIFJlbW92ZSB0aGUgZmlsZSBhcmd1bWVudCB0byAtc2Ntc3R1YiBhbmQgLWdvb3BzLgoJICAgIFRoZSBTY2hlbWUgZmlsZXMgYXJlIG5vdyBhbHdheXMgY2FsbGVkIE1PRFVMRS5zY20gb3IKCSAgICBNT0RVTEUtcHJpbWl0aXZlLnNjbSwgd2hlcmUgTU9EVUxFIGlzIHRoZSBtb2R1bGUgbmFtZSBhbmQgCgkgICAgInByaW1pdGl2ZSIgY2FuIGJlIGNoYW5nZWQgYnkgdGhlIC1wcmltc3VmZml4IG9wdGlvbi4KCSAgICBUaGUgU2NoZW1lIGZpbGVzIGFyZSBub3cgcGxhY2VkIGluIHRoZSBkaXJlY3RvcnkgZ2l2ZW4gYnkKCSAgICB0aGUgLW91dGRpciBvcHRpb24sIG9yIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4KCSAgICAoUGF0Y2ggYnkgSm9obiBMZW56LCBzbGlnaHRseSBtb2RpZmllZC4pCgoJICAgICoqKiBJTkNPTVBBVElCSUxJVFkgW0d1aWxlXSAqKioKCjExLzAyLzIwMDM6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBVbmlmeSB0aGUgcG9pbnRlci1jb252ZXJzaW9uIHJ1bnRpbWUgQVBJLiAgVGhlIHN0YW5kYXJkCgkgICAgZnVuY3Rpb25zIGFyZToKCSAgICAgKiBTV0lHX05ld1BvaW50ZXJPYmogKFBPSU5URVIsIFRZUEUsIEZMQUdTKQoJICAgICAgICAtLSBDcmVhdGUgYW4gc2NyaXB0aW5nIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgYSB0eXBlZAoJCSAgIHBvaW50ZXIuIEZMQUdTIGFyZSBsYW5ndWFnZSBzcGVjaWZpYy4KCSAgICAgKiBTV0lHX0NvbnZlcnRQdHIgKElOUFVULCBSRVNVTFQsIFRZUEUsIEZMQUdTKQoJICAgICAgICAtLSBHZXQgYSBwb2ludGVyIGZyb20gdGhlIHNjcmlwdGluZyBvYmplY3QgSU5QVVQgYW5kCgkJICAgc3RvcmUgaXQgaW4gdGhlIHBsYWNlIFJFU1VMVC4gIFdoZW4gYSB0eXBlIG1pc21hdGNoIAoJCSAgIG9jY3VycywgcmV0dXJuIG5vbnplcm8uCgkgICAgICogU1dJR19NdXN0R2V0UHRyIChJTlBVVCwgVFlQRSwgQVJHTlVNLCBGTEFHUykKCSAgICAgICAgLS0gR2V0IGEgcG9pbnRlciBmcm9tIHRoZSBzY3JpcHRpbmcgb2JqZWN0IElOUFVUIGFuZAoJCSAgIHJldHVybiBpdC4gIFdoZW4gYSB0eXBlIG1pc21hdGNoIG9jY3VycywgdGhyb3cgYW4KCQkgICBleGNlcHRpb24uICBJZiBBUkdOVU0gPiAwLCByZXBvcnQgaXQgYXMgdGhlIAoJCSAgIGFyZ3VtZW50IG51bWJlciB0aGF0IGhhcyB0aGUgdHlwZSBtaXNtYXRjaC4KICAgICAgICAgICAgW0d1aWxlXTogICAgTm8gY2hhbmdlcy4KCSAgICBbTXpTY2hlbWVdOiBObyBjaGFuZ2VzLgoJICAgIFtQZXJsXTogICAgIEFkZCB0aGUgZnVuY3Rpb24gU1dJR19OZXdQb2ludGVyT2JqLgoJCSAgICAgICAgVGhlIGZ1bmN0aW9uIFNXSUdfTWFrZVB0ciBpcyBrZXB0LgoJCQlUaGUgZnVuY3Rpb24gU1dJR19NdXN0R2V0UHRyIGlzIGN1cnJlbnRseSBub3QKCQkJc3VwcG9ydGVkLgoJICAgIFtQeXRob25dOiAgIEFkZCB0aGUgZnVuY3Rpb24gU1dJR19NdXN0R2V0UHRyLgoJICAgIFtSdWJ5XTogICAgIEFkZCB0aGUgZnVuY3Rpb24gU1dJR19NdXN0R2V0UHRyLgoJICAgIFtUY2xdOiAgICAgIFJlbW92ZSB0aGUgImludGVycCIgYXJndW1lbnQgb2YKCQkgICAgICAgIFNXSUdfTmV3SW5zdGFuY2VPYmosIFNXSUdfQ29udmVydFB0ciwKCQkgICAgICAgIFNXSUdfQ29udmVydFBhY2tlZCwgYW5kIFNXSUdfQ29udmVydFB0ckZyb21TdHJpbmcuCgkJCVRoZSBmdW5jdGlvbiBTV0lHX011c3RHZXRQdHIgaXMgY3VycmVudGx5IAoJCQlub3Qgc3VwcG9ydGVkLgoJICAgIE5vIGNoYW5nZXMgdG8gUGlrZSBiZWNhdXNlIGl0cyBwb2ludGVyIGNvbnZlcnNpb24gY29kZSBkaWQKCSAgICBub3QgbG9vayBjb21wbGV0ZS4gIE5vIGNoYW5nZXMgdG8gUEhQNCwgYmVjYXVzZSBJIGRpZCBub3QKCSAgICB1bmRlcnN0YW5kIGl0cyBydW50aW1lIGNvZGUuICBObyBjaGFuZ2VzIHRvIENoaWNrZW4KCSAgICBiZWNhdXNlIG1ham9yIGNoYW5nZXMgYXJlIGV4cGVjdGVkIHNvb24gYW55d2F5LiAgTm8KCSAgICBjaGFuZ2VzIHRvIEphdmEsIE9DYW1sLCBDIyBiZWNhdXNlIHRoZXkgZG8gbm90IHNlZW0gdG8KCSAgICBoYXZlIGEgcG9pbnRlci1jb252ZXJzaW9uIHJ1bnRpbWUgQVBJLgoKICAgICAgICAgICAgKioqIElOQ09NUEFUSUJJTElUWSBbVGNsXSAqKioKCjExLzAyLzIwMDM6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbUGVybDUsIFBIUDQsIFBpa2UsIFB5dGhvbiwgUnVieSwgVGNsXTogVXNlIHRoZQoJICAgIHByZXByb2Nlc3NvciB0byByZW5hbWUgZXh0ZXJuYWwgZnVuY3Rpb25zIG9mIHRoZSBTV0lHCgkgICAgcnVudGltZSBBUEkgdG8gZm9sbG93IHRoZSBuYW1pbmcgY29udmVudGlvbgoJICAgIFNXSUdfPGxhbmd1YWdlPl88ZnVuY3Rpb24+LiAgVGhpcyBzaG91bGQgYWxsb3cgbGlua2luZwoJICAgIG1vcmUgdGhhbiBvbmUgaW50ZXJwcmV0ZXIgaW50byBhIHByb2dyYW0uCgoxMC8zMS8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0MjXSBGaXggc2luY2UgaW50cm9kdWNpbmcgdGhlIGV4Y2VwdGlvbiBhbmQgc3RkOjpzdHJpbmcgZGVsZWdhdGVzLgogICAgICAgICAgICBUaGUgZml4IG92ZXJjb21lcyBsaW5rZXIgZXJyb3JzIHdoZW4gdXNpbmcgbW9yZSB0aGFuIG9uZSBTV0lHIG1vZHVsZS4KICAgICAgICAgICAgUHJvYmxlbSByZXBvcnRlZCBieSBBbmRyZWFzIFNjaPZyay4KCjEwLzMxLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgSW5jb3Jwb3JhdGVkIHBhdGNoOiBbIDgyMzMwMiBdIEluY3IgVGNsIHN1cHBvcnQuCiAgICAgICAgICAgIENvbnRyaWJ1dGVkIGJ5IEFsZXhleSBEeWFjaGVua28uCiAgICAgICAgICAgIE5vdGU6IG5lZWRzIGRvY3VtZW50YXRpb24uCgoxMC8zMS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEluY29ycG9yYXRlZCBwYXRjaDogWyA4MjkzMjUgXSBuZXcgUHl0aG9uIE1vZHVsZSBvcHRpb25zIGFuZCBmZWF0dXJlcy4KICAgICAgICAgICAgUm9iaW4gRHVubiB3cml0ZXM6CgogICAgICAgICAgICBUaGlzIHBhdGNoIG1ha2VzIGEgbnVtYmVyIG9mIGNoYW5nZXMgdG8gdGhlIFNXSUcgcHl0aG9uIG1vZHVsZS4KCiAgICAgICAgICAgIDEuIEFkZCAtYXBwbHkgb3B0aW9uLCBhbmQgY2hhbmdlIHRoZSBkZWZhdWx0IGNvZGUKICAgICAgICAgICAgb3V0cHV0IHRvIHVzZSB0aGUgZm9vKCphcmdzLCAqKmt3KSBjYWxsaW5nIHN5bnRheAogICAgICAgICAgICBpbnN0ZWFkIG9mIHVzaW5nIGFwcGx5KCkuIElmIHRoZSAtYXBwbHkgb3B0aW9uIGlzCiAgICAgICAgICAgIGdpdmVuIHRoZW4gY29kZSBpcyBnZW5lcmF0ZWQgYXMgYmVmb3JlLiBUaGlzIGlzIHZlcnkKICAgICAgICAgICAgc2ltaWxhciB0byBQYXRjaCAjNzM3MjgxIGJ1dCB0aGUgbmV3IC1tb2Rlcm4gb3B0aW9uCiAgICAgICAgICAgIG1ha2VzIHRoZSBzZWNvbmQgaGFsZiBvZiB0aGF0IHBhdGNoIHVubmVjZXNzYXJ5IHNvIGl0CiAgICAgICAgICAgIGlzIG5vdCBpbmNsdWRlZCBoZXJlLgoJICAgIAogICAgICAgICAgICAyLiBBZGQgLW5ld19yZXByIG9wdGlvbi4gVGhpcyBpcyB0aGUgc2FtZSBhcyBteSBQYXRjaAogICAgICAgICAgICAjNzk3MDAyIHdoaWNoIEkgd2lsbCBtYXJrIGFzIGNsb3NlZCBzaW5jZSBpdCBpcyBubwogICAgICAgICAgICBsb25nZXIgbmVlZGVkLiBXaGVuIHRoaXMgbmV3IG9wdGlvbiBpcyB1c2VkIHRoZW4gdGhlCiAgICAgICAgICAgIF9fcmVwcl9fIG1ldGhvZHMgdGhhdCBhcmUgZ2VuZXJhdGVkIGZvciBwcm94eSBjbGFzc2VzCiAgICAgICAgICAgIHdpbGwgYmUgbW9yZSBpbmZvcm1hdGl2ZSBhbmQgZ2l2ZSBkZXRhaWxzIGFib3V0IHRoZQogICAgICAgICAgICBweXRob24gY2xhc3MgYW5kIHRoZSBDKysgY2xhc3MuCgkgICAgCiAgICAgICAgICAgIDMuIEFkZCAlZmVhdHVyZSgiYWRkdG9mdW5jIikuIEl0IGFsbG93cyB5b3UgdG8gaW5zZXJ0CiAgICAgICAgICAgIG9uZSBvciBtb3JlIGxpbmVzIG9mIGNvZGUgaW5zaWRlIHRoZSBzaGFkb3cgbWV0aG9kIG9yCiAgICAgICAgICAgIGZ1bmN0aW9uIHRoYXQgaXMgYWxyZWFkeSBnZW5lcmF0ZWQsIGluc3RlYWQgb2YKICAgICAgICAgICAgcmVwbGFjaW5nIHRoZSB3aG9sZSB0aGluZyBsaWtlICVmZWF0dXJlKCJzaGFkb3ciKSBkb2VzLgogICAgICAgICAgICBGb3IgX19pbml0X18gaXQgZ29lcyBhdCB0aGUgZW5kLCBmb3IgX19kZWxfXyBpdCBnb2VzCiAgICAgICAgICAgIGF0IHRoZSBiZWdpbmluZyBhbmQgZm9yIGFsbCBvdGhlcnMgdGhlIGNvZGUgZ2VuZXJhdGVkCiAgICAgICAgICAgIGlzIGV4cGFuZGVkIG91dCB0byBiZSBsaWtlCgkgICAgCiAgICAgICAgICAgIGRlZiBCYXIoKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICAgICAgdmFsID0gX21vZHVsZS5Gb29fQmFyKCphcmdzLCAqKmt3YXJncykKICAgICAgICAgICAgcmV0dXJuIHZhbAoJICAgIAogICAgICAgICAgICBhbmQgdGhlICJhZGR0b2Z1bmMiIGNvZGUgaXMgaW5zZXJ0ZWQganVzdCBiZWZvcmUgdGhlCiAgICAgICAgICAgIHJldHVybiBzdGF0ZW1lbnQuIElmIHRoZSBmZWF0dXJlIGlzIG5vdCB1c2VkIGZvciBhCiAgICAgICAgICAgIHBhcnRpY3VsYXIgbWV0aG9kIG9yIGZ1bmN0aW9uIHRoZW4gdGhlIHNob3J0ZXIgY29kZSBpcwogICAgICAgICAgICBnZW5lcmF0ZWQganVzdCBsaWtlIGJlZm9yZS4KCSAgICAKICAgICAgICAgICAgNC4gQSBsaXR0bGUgYml0IG9mIHJlZmFjdG9yaW5nIHRvIG1ha2UgaW1wbGVtZW50aW5nCiAgICAgICAgICAgIGFkZHRvZnVuYyBhIGxpdHRsZSBlYXNpZXIuCgkgICAgCiAgICAgICAgICAgIDUuIEFkZGVkIGEgLW1vZGVybiBjb21tYW5kLWxpbmUgZmxhZyB0aGF0IHdpbGwgY2F1c2UKICAgICAgICAgICAgU1dJRyB0byBvbWl0IHRoZSBjcnVmdCBpbiB0aGUgcHJveHkgbW9kdWxlcyB0aGF0IGFsbG93cwogICAgICAgICAgICBpdCB0byB3b3JrIHdpdGggdmVyc2lvbnMgb2YgUHl0aG9uIHByaW9yIHRvIDIuMi4gVGhlCiAgICAgICAgICAgIHJlc3VsdCBpcyBhIHNpbXBsZXIsIGNsZWFuZXIgYW5kIGZhc3RlciBweXRob24gcHJveHkKICAgICAgICAgICAgbW9kdWxlLCBidXQgb25lIHRoYXQgcmVxdWlyZXMgUHl0aG9uIDIuMiBvciBncmVhdGVyLiAKCjEwLzMxLzIwMDM6IGJlYXpsZXkgCiAgICAgICAgICAgIEluY29ycG9yYXRlZCBwYXRjaDogWyA4MjkzMTkgXSBYTUwgbW9kdWxlIHR3ZWFrcy4KICAgICAgICAgICAgVGhpcyBhZGRzIGEgbmV3IGNvbW1hbmQgbGluZSBvcHRpb24gLXhtbGxpdGUgdGhhdCAKICAgICAgICAgICAgZ3JlYXRseSByZWR1Y2VzIHRoZSBhbW91bnQgb2YgZW1pdHRlZCBYTUwgY29kZSBieQogICAgICAgICAgICBlbGltaW5hdGluZyBzb21lIGZpZWxkcyBtb3N0bHkgdXNlZCBpbiBTV0lHJ3MKICAgICAgICAgICAgaW50ZXJuYWwgcHJvY2Vzc2luZy4gIENvbnRyaWJ1dGVkIGJ5IFJvYmluIER1bm4uCgoxMC8zMS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEluY29ycG9yYXRlZCBwYXRjaDogWyA4MjkzMTcgXSBBZGRzIERvaFNwbGl0TGluZXMgZnVuY3Rpb24uCiAgICAgICAgICAgIENvbnRyaWJ1dGVkIGJ5IFJvYmluIER1bm4uCgoxMC8yOS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgODI3OTA3IF0gYXJnb3V0IG9iamVjdHMgbm90IGJlaW5nIHdyYXBwZWQgcHJvcGVybHkgKFBBVEgpLgogICAgICAgICAgICBQYXRjaCBjb250cmlidXRlZCBieSBTYWx2YWRvciBGYW5kafFvIEdhcmPtYS4KCSAgICAgCjEwLzI5LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA4MjY5OTYgXSBwZXJsIHR5cGUgY2hlY2tpbmcgaWdub3JlcyBwZXJsIHN1YmNsYXNzZXMuCiAgICAgICAgICAgIFRoaXMgZW5oYW5jZW1lbnQgbWFrZXMgaXQgc28gd3JhcHBlZCBjbGFzc2VzIGFuZCBzdHJ1Y3RzIGNhbgogICAgICAgICAgICBiZSBzdWJjbGFzc2VkIGluIFBlcmwgYW5kIHVzZWQgbm9ybWFsbHkuIAogICAgICAgICAgICBQYXRjaCBjb250cmlidXRlZCBieSBTYWx2YWRvciBGYW5kafFvIEdhcmPtYS4KCjEwLzE2LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbQyNdIEludFB0ciBtYXJzaGFsbGVkIHdpdGggYSB2b2lkKiBpbnN0ZWFkIG9mIGludCBpbiBDIGZ1bmN0aW9uIAogICAgICAgICAgICBkZWNsYXJhdGlvbnMuIFRoZSBjYXN0cyB0aHVzIGxvb2sgbW9yZSBjb252ZW50aW9uYWwsIGZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgIC8vIG9sZAogICAgICAgICAgICAgICAgRGxsRXhwb3J0IGRvdWJsZSBTV0lHU1REQ0FMTCBDU2hhcnBfZ2V0X1NoYXBlX3goaW50IGphcmcxKSB7CiAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICAgU2hhcGUgKmFyZzEgPSAoU2hhcGUgKikgMCA7CiAgICAgICAgICAgICAgICAgICAgYXJnMSA9ICooU2hhcGUgKiopJmphcmcxOyAKICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vIG5ldwogICAgICAgICAgICAgICAgRGxsRXhwb3J0IGRvdWJsZSBTV0lHU1REQ0FMTCBDU2hhcnBfZ2V0X1NoYXBlX3godm9pZCAqIGphcmcxKSB7CiAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICAgU2hhcGUgKmFyZzEgPSAoU2hhcGUgKikgMCA7CiAgICAgICAgICAgICAgICAgICAgYXJnMSA9IChTaGFwZSAqKWphcmcxOyAKICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgIH0KCgoxMC8xNC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGEgc3VidGxlIHByb2JsZW0gd2l0aCBvdmVybG9hZGVkIG1ldGhvZHMgYW5kIHNtYXJ0IHBvaW50ZXJzLgogICAgICAgICAgICBJZiBhIGNsYXNzIGhhcyBvdmVybG9hZGVkIG1ldGhvZHMgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgaW50IGJhcihpbnQgeCk7CiAgICAgICAgICAgICAgICAgICAgIHN0YXRpYyBpbnQgYmFyKGludCB4LCBpbnQgeSk7CiAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIGFuZCB0aGUgY2xhc3MgaXMgdXNlZCBhcyBhIHNtYXJ0IHBvaW50ZXI6CgogICAgICAgICAgICAgICAgY2xhc3MgRm9vUHRyIHsKICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgRm9vICpvcGVyYXRvci0+KCk7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgVGhlIFNXSUcgd291bGQgdHJ5IHRvIGV4cG9zZSB0aGUgc3RhdGljIG1lbWJlciBGb286OmJhcgogICAgICAgICAgICB0aHJvdWdoIEZvb1B0ci0tLXJlc3VsdGluZyBib2d1cyB3cmFwcGVyIGNvZGUgYW5kIGEgY29tcGlsZXIKICAgICAgICAgICAgZXJyb3IuCgogICAgICAgICAgICBEdWUgdG8gdGhlIHdheSBpbiB3aGljaCBvdmVybG9hZGluZyBpcyBoYW5kbGVkLCBpdCBpcwogICAgICAgICAgICBleHRyZW1lbHkgZGlmZmljdWx0IHRvIGVsaW1pbmF0ZSB0aGUgc3RhdGljIG1ldGhvZCBpbgogICAgICAgICAgICB0aGlzIGNhc2UuICBUaGVyZWZvcmUsIGl0IGlzIHN0aWxsIGV4cG9zZWQuICBIb3dldmVyLAogICAgICAgICAgICB0aGUgZ2VuZXJhdGVkIGNvZGUgbm93IGNvbXBpbGVzIGFuZCB3b3Jrcy4KCjEwLzA1LzIwMDM6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbR3VpbGUsIE16U2NoZW1lLCBDaGlja2VuXTogUmVtb3ZlIHN5bWJvbCBjbGFzaGVzIGJldHdlZW4KCSAgICB0aGUgcnVudGltZSBsaWJyYXJpZXMgYnkgcmVuYW1pbmcgYWxsIGV4dGVybiBjb21tb24uc3dnCgkgICAgZnVuY3Rpb25zIHdpdGggdGhlIHByZXByb2Nlc3Nvci4KCjEwLzA1LzIwMDM6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbR3VpbGVdIEFkZGVkIGJhc2ljIEdPT1BTIHN1cHBvcnQsIGNvbnRyaWJ1dGVkIGJ5IEpvaG4gTGVuei4KCSAgICBTZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIGRldGFpbHMuCgkgICAgCiAgICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjEwLzA0LzIwMDM6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbR3VpbGVdIE5ldyBvcHRpb24sIC1vbmx5LXNldHRlcnMsIHdoaWNoIGRpc2FibGVzCgkgICAgdHJhZGl0aW9uYWwgZ2V0dGVyIGFuZCBzZXR0ZXIgcHJvY2VkdXJlcyBmb3Igc3RydWN0dXJlIHNsb3RzLgoKMTAvMDMvMjAwMzogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtHdWlsZV0gQWRkZWQgcnVuIHRlc3QgZm9yIHJlZmVyZW5jZV9nbG9iYWxfdmFycyBieSBKb2huIExlbnouCgowOS8zMC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIFBhcnRpYWwgc29sdXRpb24gdG8gWyA3OTIxODAgXSBDKysgc21hcnQtcG9pbnRlci9uYW1lc3BhY2UgbWl4dXAgcmV2aXNpdGVkLgogICAgICAgICAgICBUaGUgcHJvYmxlbSBpcyBub3QgZWFzeSB0byBmaXggKGF0IGxlYXN0IGl0IGRvZXNuJ3Qgc2VlbSBzbyksIGJ1dCBpcwogICAgICAgICAgICByZWxhdGVkIHRvIHRoZSBpbnN0YW50aWF0aW9uIG9mIHF1YWxpZmllZCB0ZW1wbGF0ZXMgaW5zaWRlIG9mIG90aGVyCiAgICAgICAgICAgIG5hbWVzcGFjZXMuICAgU1dJRyBub3cgZ2VuZXJhdGVzIGFuIGVycm9yIG1lc3NhZ2UgaW4gdGhpcyBjYXNlIHJhdGhlcgogICAgICAgICAgICB0aGFuIGdlbmVyYXRpbmcgYnJva2VuIHdyYXBwZXJzLgoKMDkvMzAvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDgwMDAxMiBdIEVOVEVSIG1hY3JvIGZyb20gQ09SRS9zY29wZS5oIGNsYXNoZXMgd2l0aCBsaWJjIHNlYXJjaC5oLgogICAgICAgICAgICBSZXBvcnRlZCBieSBCcml0dG9uIExlbyBLZXJpbi4KCjA5LzMwLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA4MTE1MTggXSBDYXN0aW5nIGludHMgdG8gZG91YmxlcyAody8gc29sdXRpb24/KQogICAgICAgICAgICBBZGRyZXNzZXMgYSBwcm9ibGVtIHdpdGggb3ZlcmxvYWRpbmcgaW4gdGhlIFBlcmwgbW9kdWxlLgogICAgICAgICAgICBSZXBvcnRlZCBieSBHZXJhbGQgRGFsbGV5LgoKMDkvMjgvMjAwMzogbWtvZXBwZQoJICAgIFtHdWlsZSB3aXRoIC1zY20gb3B0aW9uXSBGaXggdHlwbyBpbiBnZW5lcmF0ZWQgY29kZSBmb3IKCSAgICBwcm9jZWR1cmVzLXdpdGgtc2V0dGVycy4gIFJlcG9ydGVkIGJ5IEpvaG4gTGVuei4KCjA5LzI2LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA4MTI1MjggXSBleHRlcm5zIG5vdCBjb3JyZWN0IHdoZW4gdGhyb3cgaXMgaW4gc2lnbmF0dXJlLgogICAgICAgICAgICBSZXBvcnRlZCBieSBKb3NlcGggV2luc3Rvbi4KICAgICAgICAgICAgCjA5LzIzLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBTV0lHIHdhcyBnZW5lcmF0aW5nIGEgbnVtYmVyIG9mIHN5bWJvbHMgdGhhdCBkaWRuJ3QgY29tcGx5IHdpdGggCiAgICAgICAgICAgIHRoZSBJU08gQy9DKysgc3RhbmRhcmQsIGluIHBhcnRpY3VsYXIgSVNPL0lFQyAxNDg4MjoxOTk4KEUpIDE3LjQuMy4xLjIKICAgICAgICAgICAgd2hlcmUgZG91YmxlIHVuZGVyc2NvcmVzIGFyZSBmb3JiaWRkZW4gYXMgd2VsbCBhcyBzeW1ib2xzIHN0YXJ0aW5nIHdpdGgKICAgICAgICAgICAgYW4gdW5kZXJzY29yZSBmb2xsb3dlZCBieSBhbiB1cHBlciBjYXNlIGxldHRlci4gTW9zdCBvZiB0aGVzZSBoYXZlCiAgICAgICAgICAgIGJlZW4gcm9vdGVkIG91dC4gU2VlIG5ldyBzZWN0aW9uIGFkZGVkIHRvIGludGVybmFscy5odG1sIGRldmVsb3BtZW50CiAgICAgICAgICAgIG1hbnVhbCAnU3ltYm9sIE5hbWluZyBHdWlkZWxpbmVzIGZvciBHZW5lcmF0ZWQgQy9DKysgQ29kZScuCgowOS8yMy8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgRGlyZWN0b3IgdHlwZW1hcCBuYW1lIGNoYW5nZXM6CiAgICAgICAgICAgIGludiAgICAgPT4gZGlyZWN0b3JpbgogICAgICAgICAgICBvdXR2ICAgID0+IGRpcmVjdG9yb3V0CiAgICAgICAgICAgIGFyZ291dHYgPT4gZGlyZWN0b3JhcmdvdXQKCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMDkvMTkvMjAwMzogbXJvc2UgKE1hcmsgUm9zZSkKICAgICAgICAgICAgW1B5dGhvbl0gRGlyZWN0b3IgY29uc3RydWN0b3JzIG5vdyBkZWZhdWx0IHRvIF9fZGlzb3duID0gMCwgCgkgICAgd2hpY2ggaXMgdGhlIGludGVuZGVkIGJlaGF2aW9yIGFuZCBmaXhlcyB0aGUgZGlyZWN0b3JfZmluYWxpemVyIAoJICAgIHRlc3QgY2FzZSB1bmRlciBweXRob24uCgowOS8xMi8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0MjXSAtIFR5cGVtYXBzIGFkZGVkIGZvciBzdGQ6OnN0cmluZyBhbmQgY29uc3Qgc3RkOjpzdHJpbmcgJi4KICAgICAgICAgICAgICAgICAtIE5ldyBkZWxlZ2F0ZSBmb3IgY3JlYXRpbmcgYSBDIyBzdHJpbmcgZ2l2ZW4gYSBjaGFyICouIEl0CiAgICAgICAgICAgICAgICAgICBjYW4gYmUgdXNlZCBieSBjYWxsaW5nIFNXSUdfY3NoYXJwX3N0cmluZ19jYWxsYmFjayBhcyBzaG93bgogICAgICAgICAgICAgICAgICAgaW4gdGhlIHN0ZDo6c3RyaW5nICdvdXQnIHR5cGVtYXAuIFVzZWZ1bCBpZiB0aGUgcmV0dXJuIHR5cGUgaXMKICAgICAgICAgICAgICAgICAgIG1hcHBlZCB0byBhIEMjIHN0cmluZyBhbmQgdGhlIGNhbGxpbmcgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgCiAgICAgICAgICAgICAgICAgICBmb3IgY2xlYW5pbmcgdXAgbWVtb3J5IGFzIHRoZSBDIyBnYXJiYWdlIGNvbGxlY3RvciBkb2Vzbid0CiAgICAgICAgICAgICAgICAgICBmcmVlIHRoZSBtZW1vcnkgY3JlYXRlZCBpbiBDL0MrKyBhbmQgdGhlbiByZXR1cm5lZCBhcyBhIEMjIHN0cmluZy4KICAgICAgICAgICAgICAgICAtIFRoZSBleGNlcHRpb24gZGVsZWdhdGVzIGhhdmUgbW92ZWQgaW50byBhbiBpbm5lciBjbGFzcyBpbiB0aGUKICAgICAgICAgICAgICAgICAgIGludGVybWVkaWF0ZSBjbGFzcywgdGhlcmVieSBmcmVlaW5nIHVwIHRoZSBzdGF0aWMgY29uc3RydWN0b3IuCgowOS8xMS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIChJbnRlcm5hbHMpCiAgICAgICAgICAgIE1ham9yIHJlZmFjdG9yaW5nIG9mIGl0ZXJhdGlvbiBvdmVyIGxpc3RzIGFuZCBoYXNoZXMuICBUaGUKICAgICAgICAgICAgRE9IIGxpYnJhcnkgbm93IHVzZXMgaXRlcmF0b3JzLiAgVGhleSB3b3JrIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICBMaXN0ICpsID0gKHNvbWUgbGlzdCk7CgogICAgICAgICAgICAgICAgSXRlcmF0b3IgaTsKICAgICAgICAgICAgICAgIGZvciAoaSA9IEZpcnN0KGwpOyBpLml0ZW07IGkgPSBOZXh0KGkpKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gaS5pdGVtIGNvbnRhaW5zIHRoZSBhY3R1YWwgbGlzdCBpdGVtLgogICAgICAgICAgICAgICAgICAgIC8vIGkuaXRlbSBpcyBOVUxMIGF0IGVuZCBvZiBsaXN0CiAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgSGFzaCAqaCA9IChzb21lIGhhc2gpOwogICAgICAgICAgICAgICAgSXRlcmF0b3IgajsKICAgICAgICAgICAgICAgIGZvciAoaiA9IEZpcnN0KGgpOyBqLml0ZW07IGogPSBOZXh0KGopKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gai5pdGVtIGNvbnRhaW5zIGhhc2ggdGFibGUgaXRlbQogICAgICAgICAgICAgICAgICAgIC8vIGoua2V5ICBjb250YWlucyBoYXNoIHRhYmxlIGtleQogICAgICAgICAgICAgICAgICAgIC8vIEJvdGggai5pdGVtIGFuZCBqLmtleSBhcmUgTlVMTCBhdCBlbmQKICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICBUaGUgb2xkIGl0ZXJhdGlvbiBmdW5jdGlvbnMgRmlyc3RpdGVtKCksIE5leHRpdGVtKCksIEZpcnN0a2V5KCksCiAgICAgICAgICAgIGFuZCBOZXh0a2V5KCkgYXJlIGdvbmUuICAKCiAgICAgICAgICAgIFRoZSBuZXcgaXRlcmF0b3JzIGFyZSBzaW1wbGVyLCByZXN1bHQgaW4gYmV0dGVyIG1lbW9yeSB1c2UsCiAgICAgICAgICAgIGFuZCBtYXkgYmUgZmFzdGVyLiAgQWxzbywgdGhlcmUgYXJlIG5vIGxvbmdlciBhbnkgcHJvYmxlbXMKICAgICAgICAgICAgaXRlcmF0aW5nIG92ZXIgdGhlIHNhbWUgbGlzdC9oYXNoIGluIG11bHRpcGxlIHBsYWNlcyBhdAogICAgICAgICAgICB0aGUgc2FtZSB0aW1lLiAgRm9yIGV4YW1wbGUsIHRoaXMgaXMgZmluZToKCiAgICAgICAgICAgICAgICAgSXRlcmF0b3IgaSxqOwogICAgICAgICAgICAgICAgIGZvciAoaSA9IEZpcnN0KGwpOyBpLml0ZW07IGkgPSBOZXh0KGkpKSB7CiAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gRmlyc3QobCk7IGouaXRlbTsgaiA9IE5leHQoaikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAoVGhpcyBuZXZlciB3b3JrZWQgaW4gcHJldmlvdXMgdmVyc2lvbnMpLgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKiouICBUaGlzIHdpbGwgcHJvYmFibHkgYnJlYWsgCiAgICAgICAgICAgIHRoaXJkIHBhcnR5IGV4dGVuc2lvbnMgdG8gU1dJRyAob3IgZ2l2ZSB0aGVtIGZ1cnRoZXIgZW5jb3VyYWdlbWVudAogICAgICAgICAgICB0byBqb2luIHRoZSBTV0lHIENWUy10cmVlIDotKS4KCjA5LzEwLzIwMDM6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbR3VpbGVdIEZpeCBtZW1vcnkgbGVha3MgaW4gdGhlICJsaXN0LXZlY3Rvci5pIiB0eXBlbWFwcy4KCjA5LzA5LzIwMDM6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbQ2hpY2tlbl0gVXNlIENfbWtfYm9vbCByYXRoZXIgdGhhbiBDX21rYm9vbC4gIFRoaXMgZml4ZXMKCSAgICB0aGUgd3JhcHBpbmcgb2YgYm9vbGVhbiB2YWx1ZXMgZm9yIENoaWNrZW4gMS4xMCBhbmQgbmV3ZXIuCgkgICAgUmVwb3J0ZWQgYnkgRGF2ZSA8aHVuZG9AeWFob28uY29tPiAvIEZlbGl4IFdpbmtlbG1hbm4KCSAgICA8ZmVsaXhAcHJveGltYS1tdC5kZT4uCgowOS8wNS8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIERpcmVjdG9ycyBpbXBsZW1lbnRlZCBmb3IgSmF2YS4gSW4gc3VtbWFyeSB0aGlzIGlzIGEgYmlnIG5ldyBmZWF0dXJlIAogICAgICAgICAgICB3aGljaCBzdXBwb3J0cyB1cGNhbGxzIGZyb20gQysrIHRvIEphdmEuIENvZGUgaXMgZ2VuZXJhdGVkIHRvIHN1cHBvcnQgQysrIAogICAgICAgICAgICBjYWxsYmFja3MgdG8gY2FsbCBpbnRvIEphdmEgYW5kIHRydWUgcG9seW1vcnBoaWMgYmVoYXZpb3VyIGZvciBKYXZhIGNsYXNzZXMgCiAgICAgICAgICAgIGRlcml2ZWQgZnJvbSBDKysgY2xhc3Nlcy4gU2VlIGphdmEuaHRtbCBmb3IgZGV0YWlscy4gQ29udHJpYnV0ZWQgYnkgCiAgICAgICAgICAgIFNjb3R0IE1pY2hlbC4KCjA5LzA1LzIwMDM6IFRpZ2VyCiAgICAgICAgICAgIENyZWF0ZWQgY29udHJhY3QgZXhhbXBsZSBkaXJlY3RvcnkgYXQgL1NXSUcvRXhhbXBsZXMvY29udHJhY3QKICAgICAgICAgICAgQWRkZWQgc2ltcGxlIGNvbnRyYWN0IGV4YW1wbGVzIChzaW1wbGVfYyAmIHNpbXBsZV9jeHgpCiAgICAgICAgICAgIE1vZGlmaWVkIGNvbnRyYWN0IG1vZHVsZSdzIG91dHB1dCBmb3JtYXQKCiAgICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjA5LzAxLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBUZXN0LXN1aXRlIGJ1aWxkIGltcHJvdmVtZW50czoKICAgICAgICAgICAgLSBNdWx0aXBsZSBidWlsZCBkaXJlY3RvcmllcyB3b3JraW5nIGZvciB0aGUgdGVzdCBzdWl0ZSwgc28gaXQgaXMgbm93CiAgICAgICAgICAgICAgcG9zc2libGUgdG8gcnVuIGNvbmZpZ3VyZSBpbiBtdWx0aXBsZSBzdWJkaXJlY3RvcmllcyBhbmQgcnVuIHRoZSB0ZXN0CiAgICAgICAgICAgICAgc3VpdGUgaW4gZWFjaCBvZiB0aGVzZSBzdWIgZGlyZWN0b3JpZXMuCiAgICAgICAgICAgIC0gJ21ha2UgZGlzdGNsZWFuJyBmaXhlZCBzbyBpdCBkb2Vzbid0IGJvbWIgb3V0IG9uIHRoZSBFeGFtcGxlcyBkaXJlY3RvcnkKICAgICAgICAgICAgICB3aGVuIHVzaW5nIG11bHRpcGxlIHN1YmRpcmV0b3J5IGJ1aWxkcy4gUmVxdWlyZWQgdGhlIGZvbGxvd2luZyBkaXJlY3RvcmllcwogICAgICAgICAgICAgIHRvIGJlIG1vdmVkOgogICAgICAgICAgICAgICAgRXhhbXBsZXMvR0lGUGxvdC9QZXJsIC0+IEV4YW1wbGVzL0dJRlBsb3QvUGVybDUKICAgICAgICAgICAgICAgIEV4YW1wbGVzL0dJRlBsb3QvUGhwICAtPiBFeGFtcGxlcy9HSUZQbG90L1BocDQKICAgICAgICAgICAgICBUaGVzZSBuZXcgZGlyZWN0b3JpZXMgdXNlZCB0byBiZSBzeW1ib2xpYyBsaW5rcyB0byB0aGUgb2xkIGRpcmVjdG9yeS4KICAgICAgICAgICAgICBBbHNvIHRoZSBFeGFtcGxlcy90ZXN0LXN1aXRlL1Blcmwgc3ltYm9saWMgbGluayBoYXMgYmVlbiByZW1vdmVkLgogICAgICAgICAgICAtIFJ1bm5pbmcgdGhlIHRlc3Qtc3VpdGUsIG90aGVyIHRoYW4gZnJvbSB0aGUgcm9vdCBkaXJlY3RvcnksIHNheQogICAgICAgICAgICAgIGluIEV4YW1wbGVzL3Rlc3Qtc3VpdGUvcHl0aG9uIHdpbGwgbm93IGRpc3BsYXkgYWxsIHRoZSBjb2RlIGJlaW5nCiAgICAgICAgICAgICAgZXhlY3V0ZWQuCiAgICAgICAgICAgIC0gVGhlIGZvbGxvd2luZyAzIEMjIGNvbXBpbGVycyBhcmUgZGV0ZWN0ZWQgZHVyaW5nIGNvbmZpZ3VyZSBhbmQgd29yayB3aXRoIAogICAgICAgICAgICAgIHRoZSB0ZXN0LXN1aXRlOiBNb25vLCBQb3J0YWJsZS5ORVQgYW5kIE1pY3Jvc29mdC4KCjA5LzAxLzIwMDM6IFRpZ2VyCiAgICAgICAgICAgIEFkZGVkIGluaGVyaXRhbmNlIHN1cHBvcnQgZm9yIGRlc2lnbiBieSBjb250cmFjdCBmZWF0dXJlLgoKMDkvMDEvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDc5NDkxNCBdIFdyb25nIHR5cGVzIGluIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uLgogICAgICAgICAgICBTV0lHIHdhcyBub3QgaGFuZGxpbmcgYXJndW1lbnRzIGNvcnJlY3RseSBpbiB0ZW1wbGF0ZSAKICAgICAgICAgICAgcGFydGlhbCBzcGVjaWFsaXphdGlvbi4gIEZvciBleGFtcGxlLAoKICAgICAgICAgICAgICAgIHRlbXBsYXRlPGNsYXNzIFQ+IGNsYXNzIEZvbzxUICo+IHsKICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICBUICpibGFoKCk7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICV0ZW1wbGF0ZShGb29JbnQpIEZvbzxpbnQgKj47CgogICAgICAgICAgICBpbiB0aGlzIGNsYXNzLCB0aGUgcmV0dXJuIHR5cGUgb2YgYmxhaCB3YXMgc2V0IHRvCiAgICAgICAgICAgICdpbnQgKionLCBidXQgaXQgc2hvdWxkIHJlYWxseSBiZSAnaW50IConLiAgVGhpcyBoYXMgYmVlbgogICAgICAgICAgICBmaXhlZCwgYnV0IGl0IHdpbGwgYWZmZWN0IGFsbCBwcmlvciB1c2VzIG9mIHBhcnRpYWwKICAgICAgICAgICAgc3BlY2lhbGl6YXRpb24uCiAKMDkvMDEvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDc4NjM5NCBdIFBhdGNoIGZvciBnZW5lcmF0ZWQgcGVybCBjb2RlIGRvZXMgbm90IGNvbXBpbGUgdW5kZXIgUmVkSGF0OS4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgU2NvdHQgRmlubmVyYW4uCgowOS8wMS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNzkxNTc5IF0gKHVuc2lnbmVkKSBsb25nIGxvbmcgaGFuZGxlZCBpbmNvcnJlY3RseSAoVGNsKS4KICAgICAgICAgICAgVGhpcyB3YXMgYW4gZXJyb3IgaW4gdGhlIFRjbCB0eXBlbWFwcy5pIGZpbGUuIAogICAgICAgICAgICBSZXBvcnRlZCBieSBLamVsbCBXb29kaW5nLgogICAgICAgIAowOS8wMS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNzk3NTczIF0gbm8gd2F5IHRvIHJlbmFtZSBjbGFzc2VzIGNvbWluZyBmcm9tIEMgc3RydWN0dXJlcy4KICAgICAgICAgICAgVGhpcyBwcm9ibGVtIHJlbGF0ZXMgdG8gcmVuYW1pbmcgb2YgYW5vbnltb3VzIHN0cnVjdHVyZXMgd2l0aCBhCiAgICAgICAgICAgIHR5cGVkZWYuICBGb3IgZXhhbXBsZTogCgogICAgICAgICAgICAgICAgICAlcmVuYW1lKEJhcikgRm9vOwogICAgICAgICAgICAgICAgICB0eXBlZGVmIHN0cnVjdCB7CiAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICB9IEZvbzsKCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IEJyaXR0b24gTGVvIEtlcmluLgogICAgICAgICAgICAKMDkvMDEvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDc5NzU3NiBdIC1oZWxwIHNlZW1zIHRvIGltcGx5IHRoYXQgb25seSB0Y2wtc3BlY2lmaWMgb3B0aW9ucyBleGlzdC4KICAgICAgICAgICAgQWRkZWQgYSBjb21tZW50IHRvIGFsZXJ0IHVzZXIgdG8gb3RoZXIgb3B0aW9ucy4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgQnJpdHRvbiBMZW8gS2VyaW4uCgowOS8wMS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNzk4MjA1IF0gU2VnZmF1bHQgaW4gU1dJR19Db252ZXJ0UHRyLgogICAgICAgICAgICBSZXBvcnRlZCBieSBQcmFiaHUgUmFtYWNoYW5kcmFuLgoKMDgvMzAvMjAwMzogbXJvc2UgKE1hcmsgUm9zZSkKICAgICAgICAgICAgTW9kaWZpZWQgdGhlIGRpcmVjdG9yIHR5cGVtYXBzIGluIHB5dGhvbi9zdGRfY29tcGxleC5pIHRvIHVzZSB0aGUgCgkgICAgbmV3LXN0eWxlIG1hY3JvIGFuZCBjb252ZXJzaW9uIGZ1bmN0aW9ucywgd2hpY2ggZWxpbWluYXRlZCBzb21lCgkgICAgcmVkdW5kYW50IGNvZGUuICBGaXhlZCBhIGZldyBidWdzIGluIHRoZXNlIHR5cGVtYXBzIGFzIHdlbGwsIGFsdGhvdWdoCgkgICAgbW9yZSB0ZXN0aW5nIGlzIG5lZWRlZC4KCjA4LzI5LzIwMDM6IG1yb3NlIChNYXJrIFJvc2UpCiAgICAgICAgICAgIENvbXBsZXRlZCBpbml0aWFsIHN1cHBvcnQgZm9yIHdyYXBwaW5nIGFic3RyYWN0IGNsYXNzZXMgd2l0aCBkaXJlY3RvcnMuCgkgICAgQ29uc3RydWN0b3Igd3JhcHBlcnMgd2lsbCBiZSBnZW5lcmF0ZWQgZm9yIGFic3RyYWN0IGNsYXNzZXMgdGhhdCBoYXZlCgkgICAgZGlyZWN0b3JzLCBhbmQgaW5zdGFuY2VzIG9mIHRoZSBkaXJlY3RvciBjbGFzc2VzIHdpbGwgYmUgY3JlYXRlZCByZWdhcmRsZXNzCgkgICAgb2Ygd2hldGhlciB0aGUgcHJveHkgY2xhc3MgaGFzIGJlZW4gc3ViY2xhc3NlZCBpbiB0aGUgdGFyZ2V0IGxhbmd1YWdlLgoJICAgIE5vIGNoZWNrcyBhcmUgbWFkZSBkdXJpbmcgY29uc3RydWN0aW9uIHRvIGVuc3VyZSB0aGF0IGFsbCBwdXJlIHZpcnR1YWwKCSAgICBtZXRob2RzIGFyZSBpbXBsZW1lbnRlZCBpbiB0aGUgdGFyZ2V0IGxhbmd1YWdlLiAgSW5zdGVhZCwgY2FsbHMgdG8KCSAgICB1bmltcGxlbWVudGVkIG1ldGhvZHMgd2lsbCB0aHJvdyBTV0lHX0RJUkVDVE9SX1BVUkVfVklSVFVBTF9FWENFUFRJT04KCSAgICBleGNlcHRpb25zIGluIEMrKy4KCgkgICAgSW50ZWdyYXRlZCBQcmFiaHUgUmFtYWNoYW5kcmFuJ3MgdHlwZW1hcCBwYXRjaGVzLCB3aGljaCBwcm92aWRlIGRpcmVjdG9yCgkgICAgdHlwZW1hcCBzdXBwb3J0IGZvciBlbnVtcyBhbmQgc3RkOjpzaXplX3QsIGFuZCBmaXggYSBjb3VwbGUgYnVncyBpbiB0aGUgCgkgICAgZGlyZWN0b3Igc3RkOjp2ZWN0b3I8PiB0eXBlbWFwcy4KCjA4LzI5LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbQyNdIEltcGxlbWVudGVkIGV4Y2VwdGlvbiBoYW5kbGluZyBmb3IgdGhyb3dpbmcgQyMgZXhjZXB0aW9ucyBmcm9tIEMvQysrIGNvZGUuCiAgICAgICAgICAgIEEgZmV3IGRlbGVnYXRlIGZ1bmN0aW9ucyBhcmUgYXZhaWxhYmxlIGZvciBjYWxsaW5nIHdoaWNoIHRoZW4gdGhyb3cgdGhlIEMjCiAgICAgICAgICAgIGV4Y2VwdGlvbi4gVXNlIHRoZSBTV0lHX0NTaGFycFRocm93RXhjZXB0aW9uIGZ1bmN0aW9uIGZyb20gQy9DKysgdHlwZW1hcHMuCiAgICAgICAgICAgIFNlZSB0aGUgZ2VuZXJhdGVkIHdyYXBwZXIgY29kZSBvciBjc2hhcnBoZWFkLnN3ZyBmb3IgYWxsIGF2YWlsYWJsZSBleGNlcHRpb25zLgogICAgICAgICAgICBFeGFtcGxlOgoKICAgICAgICAgICAgICBTV0lHX0NTaGFycFRocm93RXhjZXB0aW9uKFNXSUdfQ1NoYXJwRXhjZXB0aW9uLCAiZXhjZXB0aW9uIGRlc2NyaXB0aW9uIik7CgogICAgICAgICAgICBUaGUgJ3Rocm93cycgdHlwZW1hcHMgYXJlIGFsc28gbm93IGltcGxlbWVudGVkLCBzbyBjb2RlIGlzIGF1dG9tYXRpY2FsbHkgCiAgICAgICAgICAgIGdlbmVyYXRlZCB0byBjb252ZXJ0IGFueSBDKysgZXhjZXB0aW9uIGludG8gYSBDIyBTeXN0ZW0uRXhjZXB0aW9uIHdoZW4gdGhlIEMrKyAKICAgICAgICAgICAgbWV0aG9kIGRlY2xhcmVzIGFuIGV4Y2VwdGlvbiBzcGVjaWZpY2F0aW9uIHN1Y2ggYXM6CgogICAgICAgICAgICAgICBpbnQgZm9vKCkgdGhyb3coQmFyKTsKCiAgICAgICAgICAgIEFsc28gYW55IHBhcmFtZXRlcnMgdGhhdCBhcmUgcmVmZXJlbmNlcyB0byBhIEMrKyBjbGFzcyBvciBhIGNsYXNzIHBhc3NlZCBieSB2YWx1ZQogICAgICAgICAgICBhbmQgYXJlIHBhc3NlZCBhcyBhIEMjIG51bGwgd2lsbCBub3cgdGhyb3cgYSBDIyBOdWxsUmVmZXJlbmNlRXhjZXB0aW9uLgoKMDgvMjkvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtDI10gRml4IHRvIG1hdGNoIHRoZSBjYWxsaW5nIGNvbnZlbnRpb24gb2YgYWxsIHBpbnZva2UgbWV0aG9kcyBzbyB0aGF0IHRoZXkKICAgICAgICAgICAgbWF0Y2ggdGhlIGNhbGxpbmcgY29udmVudGlvbiB1c2VkIGJ5IGRlZmF1bHQgaW4gdGhlIEMjICdzdGF0aWMgZXh0ZXJuJyBkZWNsYXJhdGlvbnMgCiAgICAgICAgICAgIChfX3N0ZGNhbGwgaXMgdXNlZCBvbiBXaW5kb3dzKS4KCjA4LzE5LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gUmV3b3JrZWQgc3RkOjpzdHJpbmcgdHlwZW1hcHMuIEZpeGVzIGEgbnVtYmVyIG9mIHN0cmluZyBpbiBzdGQgbmFtZXNwYWNlIAogICAgICAgICAgICBwcm9ibGVtcy4gRm9yIGV4YW1wbGUgJXRlbXBsYXRlIHZlY3RvcjxzdHJpbmc+LiBUaGUgdGVtcGxhdGVkIGNsYXNzJyBnZXQgbWV0aG9kIAogICAgICAgICAgICB3YXNuJ3QgcmV0dXJuaW5nIGEgSmF2YSBTdHJpbmcsIGJ1dCBhIFNXSUdUWVBFX3Bfc3RyaW5nLiBSZXBvcnRlZAogICAgICAgICAgICBieSBaYWNoIEJhdW0uCgowOC8xNS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNzYzNTIyIF0gMS4zLjE5IHNlZ2ZhdWx0IGluIFN3aWdUeXBlX2FkZF9wb2ludGVyL0RvaEluc2VydGl0ZW0uCiAgICAgICAgICAgIFJlbGF0ZWQgdG8gcHJvYmxlbSB3aXRoIHVubmFtZWQgY2xhc3MgaGFuZGxpbmcgaW4gUGVybCBtb2R1bGUuCgowOC8xNS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNzYzNTYzIF0gTWlzc2luZyBpbmRpY2F0aW9uIG9mIG9wdGlvbmFsIGFyZ3VtZW50cy4KICAgICAgICAgICAgVGNsIG1vZHVsZS4gIFJlcG9ydGVkIGJ5IEtyenlzenRvZiBLb3ptaW5za2kuCgowOC8xNS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNzg3NDMyIF0gbG9uZyBwYXJhbSBoYW5kbGVkIGFzIGludC4gIFRjbCBtb2R1bGUKICAgICAgICAgICAgbm93IHVzZXMgVGNsX0dldExvbmdGcm9tT2JqIHRvIGNvbnZlcnQgaW50ZWdlciB2YWx1ZXMuCgowOC8xMS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNzc1OTg5IF0gbnVtZXJpYyB0ZW1wbGF0ZSBwYXJhbWV0ZXJzLiAgIFRoZXJlIHdlcmUKICAgICAgICAgICAgc29tZSBlcnJvcnMgaW4gdGVtcGxhdGUgZXhwYW5zaW9uIHJlbGF0ZWQgdG8gdGhlIHVzZSBvZgogICAgICAgICAgICBhcnJheXMgd2hlcmUgdGhlIGFycmF5IGRpbWVuc2lvbiB3YXMgYSB0ZW1wbGF0ZSBwYXJhbWV0ZXIuCiAgICAgICAgICAgIEl0IHNob3VsZCB3b3JrIG5vdy4gIFJlcG9ydGVkIGJ5IEJyeWFuIEdyZWVuLgoKMDgvMTAvMjAwMzogbXJvc2UgKE1hcmsgUm9zZSkKICAgICAgICAgICAgQWRkZWQgYSBkaXJlY3RvciB0eXBlbWFwIChvdXR2KSBmb3IgcmV0dXJuIGJ5IHZhbHVlIGFuZCBjbGVhbmVkIHVwIHVwIGEgZmV3IAoJICAgIG9mIHRoZSBjb21tZW50ZWQgZGlyZWN0b3IgdHlwZW1hcHMuCgowOC8xMC8yMDAzOiBtcm9zZSAoTWFyayBSb3NlKQogICAgICAgICAgICBGaXhlZCBjb25zdHJ1Y3RvciBnZW5lcmF0aW9uIGZvciBkaXJlY3RvciBjbGFzc2VzIHRvIGlnbm9yZSBwcml2YXRlCgkgICAgY29uc3RydWN0b3JzLiAgUHJvdGVjdGVkIGNvbnN0cnVjdG9ycyBhcmUgYWxzbyBpZ25vcmVkIGZvciBub3csIHBlbmRpbmcKCSAgICBhIHNvbHV0aW9uIHRvIHRoZSBwcm9ibGVtIG9mIHdyYXBwaW5nIGNsYXNzZXMgdGhhdCBvbmx5IGRlZmluZSBwcm90ZWN0ZWQKCSAgICBjb25zdHJ1Y3RvcnMuCgowOC8wNy8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgTmV3IGNvbW1hbmRsaW5lIG9wdGlvbiAtb3V0ZGlyIDxkaXI+IHRvIHNwZWNpZnkgd2hlcmUgdGhlIGxhbmd1YWdlIHNwZWNpZmljCiAgICAgICAgICAgIGZpbGVzIGFyZSB0byBiZSBnZW5lcmF0ZWQuIFRoaXMgaXMgdXNlZnVsIGZvciB0YXJnZXQgbGFuZ3VhZ2VzIGxpa2UgUHl0aG9uLAogICAgICAgICAgICBKYXZhIGV0YyB3aGljaCBnZW5lcmF0ZSBwcm94eSBmaWxlcyBpbiB0aGUgYXBwcm9wcmlhdGUgbGFuZ3VhZ2UuCiAgICAgICAgICAgIFRoaXMgb3B0aW9uIGRvZXMgbm90IGFwcGx5IHRvIHRoZSBDL0MrKyB3cmFwcGVyIGZpbGUuCgowOC8wNy8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgT24gV2luZG93cyB0aGUgZ2VuZXJhdGVkIGZpbGVzIChvdGhlciB0aGFuIHRoZSBfd3JhcC5jIG9yIF93cmFwLmN4eCBmaWxlcykKICAgICAgICAgICAgd2VyZSBzb21ldGltZXMgaW5jb3JyZWN0bHkgYmVpbmcgZ2VuZXJhdGVkIGludG8gdGhlIGN1cnJlbnQgZGlyZWN0b3J5IHVubGVzcwogICAgICAgICAgICB0aGUgaW5wdXQgZmlsZSB1c2VkIHRoZSBVbml4IHBhdGggc2VwYXJhdG9yLiBUaGUgV2luZG93cyBwYXRoIHNlcGFyYXRvciAKICAgICAgICAgICAgc2hvdWxkIG5vdyBiZSB1c2VkLiBCdWcgcmVwb3J0ZWQgYnkgUm9iZXJ0IERhdmllcy4KCjA4LzA3LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgQWRkZWQgYXJyYXkgdmFyaWFibGUgc2V0IHR5cGVtYXAgdG8gUGVybCBtb2R1bGUuCgowOC8wNy8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNzc1Njc3IF0gQXJyYXkgaW5pdCBjYXVzZXMgY29kZWdlbiBidWcuLgoKMDgvMDcvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDc3OTA2MiBdIENsYXNzIlxuIjo6Zm9vIG5vdCBzdXBwb3J0ZWQuICBTV0lHCiAgICAgICAgICAgIHNob3VsZCBub3cgY29ycmVjdGx5IGhhbmRsZSB3aGl0ZXNwYWNlIGluIGJldHdlZW4gCiAgICAgICAgICAgIG5hbWVzcGFjZSBxdWFsaWZpZXJzLiAgRm9yIGV4YW1wbGUgIkEgOjogRm9vIDo6IEJhciIuCiAgICAgICAgICAgIAowNy8zMS8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgRml4ZXMgZm9yIHBhcmFtZXRlcnMgd2hpY2ggYXJlIGNsYXNzZXMgdGhhdCBhcmUgcGFzc2VkIGJ5IHZhbHVlIGFuZCBoYXZlIAogICAgICAgICAgICBhIGRlZmF1bHQgdmFsdWUuIEEgY29weSBjb25zdHJ1Y3RvciBmb3IgU3dpZ1ZhbHVlV3JhcHBlciBpcyByZXF1aXJlZCAKICAgICAgICAgICAgKFNGICM3ODAwNTYpLiBBbHNvIGZpeGVkIG1lbW9yeSBsZWFrIGluIHRoZXNlIGNpcmN1bXN0YW5jZXMuIFRoZXNlIG1vZHMKICAgICAgICAgICAgYWxzbyBmaXggU0YgIzc4MDA1NC4KCjA3LzI4LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgSW1wcm92ZWQgcnVuLXRpbWUgZXJyb3IgbWVzc2FnZSBmb3IgcG9pbnRlcnMgaW4gUHl0aG9uIG1vZHVsZS4KICAgICAgICAgICAgQ29udHJpYnV0ZWQgYnkgWm9va28uCgowNy8xMC8yMDAzOiBiYWxsYWJpbyAoTHVpZ2kgQmFsbGFiaW8pCiAgICAgICAgICAgIFtBbG1vc3QgYWxsIGxhbmd1YWdlc10gV3JhcHBlcnMgZm9yIHN0ZDo6cGFpciBhZGRlZC4KCSAgICBUeXBlbWFwcyBmb3IgUHl0aG9uLCBSdWJ5LCBHdWlsZSBhbmQgTXpTY2hlbWUuCgowNy8wMS8yMDAzOiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW0NoaWNrZW5dIEhhbmRsZSB0aGUgY2FzZSBvZiBtb3JlIHRoYW4gb25lIGFyZ291dCB0eXBlbWFwCgkgICAgcGVyIGZ1bmN0aW9uLgoKMDYvMjkvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhLCBDI10gU0YgIzY3MDk0OSByZXF1ZXN0LiBUaGUgZGVzdHJ1Y3RvciB3cmFwcGVyIGZ1bmN0aW9uIG5hbWUgaXMgbm93IAogICAgICAgICAgICBjb25maWd1cmFibGUuICBBIG5ldyBhdHRyaWJ1dGUgY2FsbGVkIG1ldGhvZG5hbWUgaW4gdGhlIAogICAgICAgICAgICBqYXZhZGVzdHJ1Y3QvamF2YWRlc3RydWN0X2Rlcml2ZWQgKEphdmEpIG9yIGNzZGVzdHJ1Y3QvY3NkZXN0cnVjdF9kZXJpdmVkIChDIykKICAgICAgICAgICAgdHlwZW1hcHMgc3BlY2lmaWVzIHRoZSBtZXRob2QgbmFtZS4gRm9yIGV4YW1wbGUgaW4gSmF2YSB0aGUgZGVzdHJ1Y3RvciBpcyAKICAgICAgICAgICAgd3JhcHBlZCBieSBkZWZhdWx0IHdpdGggdGhlIGRlbGV0ZSBtZXRob2Q6CgogICAgICAgICAgICAgICAgJXR5cGVtYXAoamF2YWRlc3RydWN0LCBtZXRob2RuYW1lPSJkZWxldGUiKSBTV0lHVFlQRSB7Li4ufQoKMDYvMjcvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhLCBDI10gVGhlIHRocm93cyBhdHRyaWJ1dGUgZm9yIGFkZGluZyBleGNlcHRpb24gY2xhc3NlcyB0byB0aGUgdGhyb3dzCiAgICAgICAgICAgIGNsYXVzZSBhbHNvIG5vdyB3b3JrcyB3aXRoIHRoZSBmb2xsb3dpbmcgdHlwZW1hcHM6IAogICAgICAgICAgICBuZXdmcmVlCiAgICAgICAgICAgIGphdmFpbiwgamF2YW91dCAoSmF2YSkKICAgICAgICAgICAgY3NpbiwgY3NvdXQgKEMjKQoKICAgICAgICAgICAgRm9yIGV4YW1wbGUsIHRoZSAnQW5FeGNlcHRpb24nIHdpbGwgYmUgYWRkZWQgdG8gdGhlIHRocm93cyBjbGF1c2UgaW4gdGhlCiAgICAgICAgICAgIHByb3h5IGZ1bmN0aW9uOgoKICAgICAgICAgICAgJXR5cGVtYXAoamF2YW91dCwgdGhyb3dzPSJBbkV4Y2VwdGlvbiIpIGludCB7CiAgICAgICAgICAgICAgICBpbnQgcmV0dXJuVmFsdWU9JGpuaWNhbGw7CiAgICAgICAgICAgICAgICBpZiAocmV0dXJuVmFsdWU9PTApIHRocm93IG5ldyBBbkV4Y2VwdGlvbigiVmFsdWUgbXVzdCBub3QgYmUgemVybyIpOwogICAgICAgICAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlOwogICAgICAgICAgICB9CgowNi8yNS8yMDAzOiBtcm9zZSAoTWFyayBSb3NlKQogICAgICAgICAgICBbUHl0aG9uXSBEaXJlY3RvciB0eXBlbWFwIG1hcnNoYWxsaW5nIGNoZWNrcyBmb3IgbnVsbCBwb2ludGVycyB3aGVuCgkgICAgd2Fsa2luZyB0aGUgcGFyYW1ldGVyIGxpc3QgaW5zdGVhZCBvZiByZWx5aW5nIHNvbGV5IG9uIHRoZSBwYXJhbWV0ZXIKCSAgICBjb3VudC4gIEN1cmVzIGEgc2VnZmF1bHQgdGhhdCBvY2N1cmVkIGZvciBtdWx0aXBsZSBhcmd1bWVudCBpbnYgdHlwZW1hcHMuCgkgICAgU29tZW9uZSB3aXRoIG1vcmUgU3dpZyBleHBlcmllbmNlIHNob3VsZCBwcm9iYWJseSByZXZpZXcgdGhpcyBjb2RlLgoKMDYvMjQvMjAwMzogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtDaGlja2VuXSBEb24ndCBlbWl0IGNhbGxzIHRvICJDX2NoZWNrX2Zvcl9pbnRlcnJ1cHQiLAoJICAgIHdoaWNoIG1heSByZXN1bHQgaW4gYW4gZW5kbGVzcyBsb29wLiAgUGF0Y2ggYnkgZmVsaXhAcHJveGltYS1tdC5kZS4KCjA2LzIwLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbQyNdIEZpbmFsaXplcnMgbm93IHVzZSBkZXN0cnVjdG9yIHN5bnRheCBhcyB0aGUgb3ZlcnJpZGUgd2hpY2ggd2FzIHVzZWQgaW4gCiAgICAgICAgICAgIHRoZSBGaW5hbGl6ZSBtZXRob2QgaXMgbm90IGluIHRoZSBFQ01BIHN0YW5kYXJkcywgc3BvdHRlZCBieSB0aGUgTVMgY29tcGlsZXIuCgowNi8xMC8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0MjXSBBIG51bWJlciBvZiBjaGFuZ2VzIGhhdmUgYmVlbiBtYWRlIHRvIHJlbW92ZSB0aGUgSmF2YSBuYW1pbmcgCiAgICAgICAgICAgIHRoYXQgd2FzIHVzZWQgaW4gdGhlIEMjIG1vZHVsZS4KICAgICAgICAgICAgCiAgICAgICAgICAgIFR5cGVtYXAgbmFtZSBjaGFuZ2VzOgogICAgICAgICAgICBqbmkgICAgICAgICAgICAgICAgICAgICAgICAgLT4gY3R5cGUKICAgICAgICAgICAganR5cGUgICAgICAgICAgICAgICAgICAgICAgIC0+IGltdHlwZQogICAgICAgICAgICBqc3R5cGUgICAgICAgICAgICAgICAgICAgICAgLT4gY3N0eXBlCiAgICAgICAgICAgIGphdmFpbiAgICAgICAgICAgICAgICAgICAgICAtPiBjc2luCiAgICAgICAgICAgIGphdmFvdXQgICAgICAgICAgICAgICAgICAgICAtPiBjc291dAogICAgICAgICAgICBqYXZhaW50ZXJmYWNlcyAgICAgICAgICAgICAgLT4gY3NpbnRlcmZhY2VzCiAgICAgICAgICAgIGphdmFiYXNlICAgICAgICAgICAgICAgICAgICAtPiBjc2Jhc2UKICAgICAgICAgICAgamF2YWNsYXNzbW9kaWZpZXJzICAgICAgICAgIC0+IGNzY2xhc3Ntb2RpZmllcnMKICAgICAgICAgICAgamF2YWNvZGUgICAgICAgICAgICAgICAgICAgIC0+IGNzY29kZQogICAgICAgICAgICBqYXZhaW1wb3J0cyAgICAgICAgICAgICAgICAgLT4gY3NpbXBvcnRzCiAgICAgICAgICAgIGphdmFwdHJjb25zdHJ1Y3Rvcm1vZGlmaWVycyAtPiBjc3B0cmNvbnN0cnVjdG9ybW9kaWZpZXJzCiAgICAgICAgICAgIGphdmFnZXRjcHRyICAgICAgICAgICAgICAgICAtPiBjc2dldGNwdHIKICAgICAgICAgICAgamF2YWZpbmFsaXplICAgICAgICAgICAgICAgIC0+IGNzZmluYWxpemUKCiAgICAgICAgICAgIEZlYXR1cmUgbmFtZSBjaGFuZ2VzOgogICAgICAgICAgICBqYXZhY29uc3QgICAgICAgICAgICAgICAgICAgLT4gY3Njb25zdAogICAgICAgICAgICBqYXZhbWV0aG9kbW9kaWZpZXJzICAgICAgICAgLT4gY3NtZXRob2Rtb2RpZmllcnMKCiAgICAgICAgICAgIFByYWdtYSBjaGFuZ2VzOgogICAgICAgICAgICBwcmFnbWEoamF2YSkgICAgICAgICAgICAgICAgLT4gcHJhZ21hKGNzaGFycCkKICAgICAgICAgICAgam5pY2xhc3NiYXNlICAgICAgICAgICAgICAgIC0+IGltY2xhc3NiYXNlCiAgICAgICAgICAgIGpuaWNsYXNzY2xhc3Ntb2RpZmllcnMgICAgICAtPiBpbWNsYXNzY2xhc3Ntb2RpZmllcnMKICAgICAgICAgICAgam5pY2xhc3Njb2RlICAgICAgICAgICAgICAgIC0+IGltY2xhc3Njb2RlCiAgICAgICAgICAgIGpuaWNsYXNzaW1wb3J0cyAgICAgICAgICAgICAtPiBpbWNsYXNzaW1wb3J0cwogICAgICAgICAgICBqbmljbGFzc2ludGVyZmFjZXMgICAgICAgICAgLT4gaW1jbGFzc2ludGVyZmFjZXMKCiAgICAgICAgICAgIFNwZWNpYWwgdmFyaWFibGUgbmFtZSBjaGFuZ2VzOgogICAgICAgICAgICAkamF2YWNsYXNzbmFtZSAgICAgICAgICAgICAgLT4gJGNzY2xhc3NuYW1lCiAgICAgICAgICAgICRqYXZhaW5wdXQgICAgICAgICAgICAgICAgICAtPiAkY3NpbnB1dAogICAgICAgICAgICAkam5pY2FsbCAgICAgICAgICAgICAgICAgICAgLT4gJGltY2FsbAoKICAgICAgICAgICAgVGhpcyB3aWxsIGJyZWFrIFNXSUcgaW50ZXJmYWNlIGZpbGVzIHRoYXQgdXNlIHRoZXNlIHR5cGVtYXBzLCBmZWF0dXJlcwogICAgICAgICAgICBhbmQgcHJhZ21hcy4gUGxlYXNlIHVwZGF0ZSB5b3VyIGNvZGUgb3IgdXNlIG1hY3JvcyBmb3IgYmFja3dhcmRzCiAgICAgICAgICAgIGNvbXBhdGliaWxpdHkuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgQyMgTU9EVUxFICoqKgoKMDYvMTAvMjAwMzogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtNelNjaGVtZV0gQXBwbGllZCBNelNjaGVtZSBtb2R1bGUgdXBkYXRlcyBjb250cmlidXRlZCBieQoJICAgIEpvaG4gTGVueiA8amVsZW56QHN0dWRlbnRzLndpc2MuZWR1Pi4KCiAgICAgICAgICAgIC0gVXBkYXRlZCBtenNjaGVtZSB0byB1c2UgU1dJRydzIGNvbW1vbiBydW50aW1lIHR5cGUKICAgICAgICAgICAgICBzeXN0ZW0gZnJvbSBjb21tb24uc3dnLiAKCgkgICAgLSBUaGUgTGliL216c2NoZW1lIGRpcmVjdG9yeSBoYXMgYmVlbiByZW9yZ2FuaXplZCB0bwogICAgICAgICAgICAgIHN0YW5kYXJkaXplIG5hbWVzIGFjcm9zcyB0aGUgbGFuZ3VhZ2UgbW9kdWxlczoKICAgICAgICAgICAgICBtenNjaGVtZS5pIHdhcyBtb3ZlZCB0byBtenNjaGVtZS5zd2csIG16c2NoZW1lLnN3ZyBhbmQKICAgICAgICAgICAgICBtenNjaGVtZWRlYy5zd2cgaGF2ZSBiZWVuIHJlbW92ZWQsIG16cnVuLnN3ZyAod2hpY2gKICAgICAgICAgICAgICBjb250YWlucyB0aGUgcnVudGltZSBjb2RlKSBoYXMgYmVlbiBhZGRlZC4KCiAgICAgICAgICAgIC0gVGhlIHN3aWdfcHJveHkgc3RydWN0dXJlIHdhcyByZW5hbWVkIHRvIHN3aWdfbXpfcHJveHkuCiAgICAgICAgICAgICAgc3dpZ19tel9wcm94eSBub3cgY29udGFpbnMgYSBwb2ludGVyIHRvIGEgc3dpZ190eXBlX2luZm8KICAgICAgICAgICAgICBzdHJ1Y3R1cmUuICAKCgkgICAgLSBBZGRlZCB2YXJpbiBhbmQgdmFyb3V0IHR5cGVtYXBzIGZvciBTV0lHVFlQRSBbXSBhbmQKICAgICAgICAgICAgICBTV0lHVFlQRSAmLgoKCSAgICAtIEdhcmJhZ2UgY29sbGVjdGlvbiBieSBjYWxsaW5nIHNjaGVtZV9hZGRfZmluYWxpemVyKCkgaGFzCiAgICAgICAgICAgICAgYmVlbiBhZGRlZC4KCgkgICAgKioqIE5FVyBGRUFUVVJFIFtNelNjaGVtZV0gKioqCgowNi8xMC8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIE5ldyB0eXBlbWFwczogamF2YWRlc3RydWN0IGFuZCBqYXZhZGVzdHJ1Y3RfZGVyaXZlZAogICAgICAgICAgICBmb3IgdGhlIEMrKyBkZXN0cnVjdG9yIHdyYXBwZXIuIFRoZSBqYXZhZGVzdHJ1Y3QgdmVyc2lvbiBnZXRzIHVzZWQgYnkKICAgICAgICAgICAgY2xhc3NlcyBhdCB0aGUgdG9wIG9mIGFuIGluaGVyaXRhbmNlIGNoYWluIGFuZCB0aGUgamF2YWRlc3RydWN0X2Rlcml2ZWQgCiAgICAgICAgICAgIHZlcnNpb24gZ2V0cyB1c2VkIGJ5IG90aGVyIGNsYXNzZXMuCgogICAgICAgICAgICBbQyNdIGNpbGRpc3Bvc2UgYW5kIGNpbGRpc3Bvc2VvdmVycmlkZSB0eXBlbWFwcyByZXBsYWNlZCBieQogICAgICAgICAgICBjc2Rlc3RydWN0IGFuZCBjc2Rlc3RydWN0X2Rlcml2ZWQgdHlwZW1hcHMuIFRoZSBkZWxldGUoKQogICAgICAgICAgICBtZXRob2QgaGFzIGJlZW4gcmVtb3ZlZCBhbmQgaXRzIGZ1bmN0aW9uYWxpdHkgcHV0IGludG8gdGhlc2UKICAgICAgICAgICAgdHlwZW1hcHMgZGVzaWduZWQgZm9yIHRoZSBEaXNwb3NlKCkgbWV0aG9kLgoKICAgICAgICAgICAgLSBOZXcgdHlwZW1hcHMgY3NpbnRlcmZhY2VzIGFuZCBjc2ludGVyZmFjZXNfZGVyaXZlZCByZXBsYWNlCiAgICAgICAgICAgIHRoZSBqYXZhaW50ZXJmYWNlcyB0eXBlbWFwLiBBbHNvIGZpeGVzIHRoZSBwZWN1bGlhcml0eSBvZiBhbGwgY2xhc3NlcwogICAgICAgICAgICBpbiBhbiBpbmhlcml0YW5jZSBjaGFpbiBpbmRpdmlkdWFsbHkgZGVyaXZpbmcgZnJvbSB0aGUgSURpc3Bvc2FibGUgCiAgICAgICAgICAgIGludGVyZmFjZS4KCiAgICAgICAgICAgIC0gTmV3IHR5cGVtYXAgY3NmaW5hbGl6ZSBmb3IgZmluYWxpemVycy4gQysrIGRlc3RydWN0b3JzIGFyZSBub3cgY2FsbGVkCiAgICAgICAgICAgIGJ5IGdhcmJhZ2UgY29sbGVjdG9yIGR1cmluZyBmaW5hbGl6YXRpb24uIFByb2JsZW0gcmVwb3J0ZWQgYnkgCiAgICAgICAgICAgIEFuZHJlYXMgU2No9nJrLgoKMDYvMTAvMjAwMzogVGlnZXIKCSAgICBNb2RpZmllZCBjb250cmFjdCBjb2RlIGZvciBlcnJvciBtZXNzYWdlIG91dHB1dC4KICAgICAgICAgICAgQ29udHJhY3QgY29kZSBjYW4gbm93IHByaW50IG91dCBzaW1wbGUgZXJyb3IgbWVzc2FnZS4KICAgICAgICAgICAgTW9kaWZpZWQgY29udHJhY3QgY29kZSB0byBwcmVwYXJlIGZvciBpbmhlcml0YW5jZQogICAgICAgICAgICAKMDYvMDMvMjAwMzogbWtvZXBwZQoJICAgIFtHdWlsZV0gQXBwbGllZCBHdWlsZSBtb2R1bGUgdXBkYXRlcyBjb250cmlidXRlZCBieSAKCSAgICBKb2huIExlbnogPGplbGVuekBzdHVkZW50cy53aXNjLmVkdT4uIAoKCSAgICAtIFNXSUcgY3VycmVudGx5IHVzZXMgR3VpbGUncyBnaF8gQVBJLCB3aGljaCBpcyBtYXJrZWQgYXMKCSAgICAgIGRlcHJlY2F0ZWQgaW4gR3VpbGUgMS42IGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gR3VpbGUKCSAgICAgIDEuOS4gIFRoaXMgY2hhbmdlIGludHJvZHVjZXMgYSBjb21tYW5kLWxpbmUgZmxhZyAiLXNjbSIKCSAgICAgIHdoaWNoIGNhdXNlcyBTV0lHIHRvIGdlbmVyYXRlIHdyYXBwZXJzIHRoYXQgdXNlIEd1aWxlJ3MKCSAgICAgIFNDTSBBUEkgaW5zdGVhZDsgdGhpcyByZXF1aXJlcyBHdWlsZSA+PSAxLjYuCgkgICAgCgkgICAgLSBUaGUgTGliL2d1aWxlIGRpcmVjdG9yeSBoYXMgYmVlbiByZW9yZ2FuaXplZCB0bwogICAgICAgICAgICAgIHN0YW5kYXJkaXplIG5hbWVzIGFjcm9zcyBsYW5ndWFnZSBtb2R1bGVzOiBndWlsZWRlYy5zd2cKICAgICAgICAgICAgICBhbmQgZ3VpbGUuc3dnIGhhdmUgYmVlbiBtb3ZlZCBpbnRvIGd1aWxlX2doX3J1bi5zd2csCiAgICAgICAgICAgICAgZ3VpbGUuaSBoYXMgYmVlbiBtb3ZlZCB0byBndWlsZV9naC5zd2csIGd1aWxlX3NjbS5zd2cKICAgICAgICAgICAgICBhbmQgZ3VpbGVfc2NtX3J1bi5zd2cgd2hpY2ggY29udGFpbiB0aGUgU0NNIEFQSSBzdHVmZgogICAgICAgICAgICAgIGhhdmUgYmVlbiBhZGRlZAoKCSAgICAtIGdoaW50ZXJmYWNlLmksIHdoaWNoIGNvbnRhaW5zIHRoZSBkZWZpbmVzIGZyb20gdGhlIGdoXwogICAgICAgICAgICAgIGZ1bmN0aW9ucyB0byB0aGUgc2NtX2Z1bmN0aW9ucyBoYXMgYmVlbiBhZGRlZAoKCSAgICAtIFRoZSBBUEkgZm9yIGRlYWxpbmcgd2l0aCBwb2ludGVyIG9iamVjdHMgaXMgbm93CgkgICAgICBTV0lHX0NvbnZlcnRQdHIsIFNXSUdfTXVzdEdldFB0ciwgU1dJR19OZXdQb2ludGVyT2JqLgoKICAgICAgICAgICAgLSBBZGRlZCB2YXJpbiBhbmQgdmFyb3V0IHR5cGVtYXBzIGZvciBTV0lHVFlQRSBbXSBhbmQgU1dJR1RZUEUgJgoKICAgICAgICAgICAgLSBHYXJiYWdlIGNvbGxlY3Rpb24gaGFzIGJlZW4gYWRkZWQuCgogICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgW0d1aWxlXSAqKioKCSAgICAJCjA2LzAxLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBEaW1lbnNpb25sZXNzIGFycmF5cyBzdWNoIGFzIAoKICAgICAgICAgICAgICAgIGludCBmb29bXSA9IHsxLCAyfTsKICAgICAgICAgICAgICAgIGV4dGVybiBpbnQgYmFyW107CgogICAgICAgICAgICBwcm9kdWNlIGEgd2FybmluZyB0aGF0IHRoZSB2YXJpYWJsZSBpcyByZWFkLW9ubHkuIERlcGVuZGluZyBvbiB0aGUgdGFyZ2V0CiAgICAgICAgICAgIGxhbmd1YWdlLCB0aGlzIHVzZWQgdG8gY2F1c2UgY29tcGlsZSBlcnJvcnMgb3IgZ2VuZXJhdGUgYSBzZXR0ZXIgdGhhdAogICAgICAgICAgICBnZW5lcmF0ZWQgYSBydW50aW1lIGVycm9yLiBBIHNldHRlciBjYW5ub3QgYmUgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQKICAgICAgICAgICAgYmVjYXVzZSB0aGUgYXJyYXkgc2l6ZSBjYW5ub3QgYmUgZGV0ZXJtaW5lZCBieSBTV0lHLiBBIHZhcmluLCBnbG9iYWxpbiAKICAgICAgICAgICAgb3IgbWVtYmVyaW4gdHlwZW1hcCAoZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQgbGFuZ3VhZ2UpIG11c3QgYmUgd3JpdHRlbiAKICAgICAgICAgICAgYnkgdGhlIHVzZXIuCgowNS8yOS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIFJlZmluZW1lbnQgdG8gZGVmYXVsdCB0eXBlbWFwIG1hdGNoaW5nIGFuZCBhcnJheXMuICBXaGVuIGFuCiAgICAgICAgICAgIGFycmF5IGlzIGRlY2xhcmVkIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAgICAgICAgaW50IGZvb1s0XTsKCiAgICAgICAgICAgIFRoZSBkZWZhdWx0IHR5cGVtYXAgbm93IHJlc29sdmVzIHRvIAoKICAgICAgICAgICAgICAgICAgICAgICBTV0lHVFlQRSBbQU5ZXQoKICAgICAgICAgICAgSWYgbm8gbWF0Y2ggaXMgZm91bmQgZm9yIHRoYXQsIGl0IHRoZW4gcmVzb2x2ZXMgdG8KCiAgICAgICAgICAgICAgICAgICAgICAgU1dJR1RZUEUgW10KCiAgICAgICAgICAgIElmIG5vIGFycmF5IGRpbWVuc2lvbiBpcyBzcGVjaWZpZWQgaW4gdGhlIG9yaWdpbmFsIGRlY2xhcmF0aW9uLAogICAgICAgICAgICB0aGUgU1dJR1RZUEUgW10gaXMgdXNlZCByaWdodCBhd2F5LiAKCiAgICAgICAgICAgIE5vdGU6IFRoaXMgY2hhbmdlIGhhcyBiZWVuIG1hZGUgdG8gcmVzb2x2ZSBwcm9ibGVtcyByZWxhdGVkIHRvCiAgICAgICAgICAgIGFycmF5cyB3aXRoIGFuZCB3aXRob3V0IGRpbWVuc2lvbnMuICBGb3IgZXhhbXBsZSwgc29tZXRpbWVzIFNXSUcKICAgICAgICAgICAgd2FzIGdlbmVyYXRpbmcgc2V0dGVyIGZ1bmN0aW9ucyBmb3IgYXJyYXkgdmFyaWFibGVzIHdpdGggbm8gZGltZW5zaW9ucwogICAgICAgICAgICAoYW4gZXJyb3IpLiBMaWtld2lzZSwgU1dJRyBzb21ldGltZXMgbWFkZSBhcnJheXMgd2l0aCBkaW1lbnNpb25zCiAgICAgICAgICAgIHJlYWQtb25seSAoYWxzbyBhbiBlcnJvcikuICBUaGlzIGZpeGVzIHRoZSBhcnJheXNfZ2xvYmFsIHRlc3QKICAgICAgICAgICAgcHJvYmxlbS4KICAgICAgICAgICAgICAgICAgICAgICAgCjA1LzI4LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgc3VidGxlIHR5cGUgaGFuZGxpbmcgYnVnIHdpdGggcmVmZXJlbmNlcyBhbmQgcG9pbnRlcnMuCiAgICAgICAgICAgIElmIHlvdSBoYWQgZnVuY3Rpb25zIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAgIHR5cGVkZWYgRm9vIEJhcjsKCiAgICAgICAgICAgICAgICAgIEZvbyAqZnVuYzEoKTsKICAgICAgICAgICAgICAgICAgdm9pZCBmdW5jMihCYXIgJngpOwoKICAgICAgICAgICAgVGhlbiBmdW5jMigpIHdvdWxkbid0IGFjY2VwdCBvYmplY3RzIHJldHVybmVkIGJ5IGZ1bmMxKCkKICAgICAgICAgICAgYmVjYXVzZSBvZiBhIHR5cGUgZXJyb3IuICAgSXQgc2hvdWxkIHdvcmsgbm93LgogICAgICAgICAgICBSZXBvcnRlZCBieSBCcmlhbiBZYW5nLgoKMDUvMjEvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIEZpeGVzIHRvIHNvbWUgb2YgdGhlIFZpc3VhbCBDKysgZXhhbXBsZSBwcm9qZWN0IGZpbGVzIHdoaWNoIHdvdWxkIG5vdCAKICAgICAgICAgICAgd29yayB3aXRoIHNwYWNlcyBpbiB0aGUgcGF0aHMgaGVsZCBpbiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIHVzZWQgdG8gCiAgICAgICAgICAgIHBvaW50IHRvIHRoZSB0YXJnZXQgbGFuZ3VhZ2UncyBsaWJyYXJ5IC8gaW5jbHVkZSBkaXJlY3RvcnkuCiAgICAgICAgICAgIFNGIGJ1ZyAjNzQwNzY5CgowNS8yMS8yMDAzOiAgc29uZ3lhbmYgKFRpZ2VyKQogICAgICAgICAgICBBZGRlZCAtY29udHJhY3RzIG9wdGlvbi4KICAgICAgICAgICAgRmlyc3QgdHJ5IG9mIHRoZSBpZGVhIG9mICJXcmFwIGJ5IENvbnRyYWN0IjogCiAgICAgICAgICAgIGJ1aWxkIHVwIHJlYWxpYWJsZSBjcm9zcy1sYW5ndWFnZSBtb2R1bGUgYnkgd3JhcHBpbmcgd2l0aCBTV0lHLgogICAgICAgICAgICBJbXBsZW1lbnRlZCBiYXNpYyBhc3NlcnRpb24KICAgICAgICAgICAgKHByZWFzc2VydGlvbiAmIHBvc3Rhc3NlcnRpb24gJiBpbnZhcmlhbnQpCiAgICAgICAgICAgIGZvciBzaW1wbGUgQy9DKysgZnVuY3Rpb25zLgogICAgICAgICAgICAKICAgICAgICAgICAgQ3VycmVudCBmb3JtYXQgb2YgY29udHJhY3RzIGFyZToKICAgICAgICAgICAgJWNvbnRyYWN0IGNsYXNzX25hbWUgOjogZnVuY19uYW1lIChwYXJhcy4uLikgewogICAgICAgICAgICByZXF1aXJlOgogICAgICAgICAgICAgICAgICAgYm9vbGVhbiBleHByczsKICAgICAgICAgICAgICAgICAgIGV4cHJzOwogICAgICAgICAgICBlbnN1cmU6CiAgICAgICAgICAgICAgICAgICBib29sZWFuIGV4cHI7CiAgICAgICAgICAgICAgICAgICBleHByczsKICAgICAgICAgICAgaW52YXJpYW50OgogICAgICAgICAgICAgICAgICAgYm9vbGVhbiBleHByOwogICAgICAgICAgICAgICAgICAgZXhwcnM7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCSAgICAJCjA1LzE5LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBCdWlsZCB0d2Vha3MuIFRoZXJlIHdlcmUgYSBmZXcgcHJlcHJvY2Vzc29yIGRlZmluaXRpb25zIHdoaWNoIHdlcmUKICAgICAgICAgICAgc3BlY2lmaWVkIGluIHRoZSBNYWtlZmlsZSBmb3IgcGFzc2luZyBvbiB0aGUgY29tbWFuZGxpbmUgd2hlbiBjb21waWxpbmcuCiAgICAgICAgICAgIFRoZXNlIGFyZSBub3cgYWxsIGRlZmluZWQgaW4gc3dpZ2NvbmZpZy5oLiBBdXRvY29uZiBkb2Vzbid0IG5vcm1hbGx5IAogICAgICAgICAgICBhbGxvdyBpbnN0YWxsYXRpb24gZGlyZWN0b3JpZXMgdG8gYmUgZGVmaW5lZCBpbiB0aGlzIGNvbmZpZyBoZWFkZXIgZmlsZSwgCiAgICAgICAgICAgIGJ1dCBhbiBhdXRvY29uZiBhcmNoaXZlIG1hY3JvIGVuYWJsZXMgdGhpcy4gVGhpcyBtYWNybyBhbG9uZyB3aXRoIGZ1dHVyZSAKICAgICAgICAgICAgYXV0b2NvbmYgbWFjcm9zIGFyZSBnb2luZyB0byBiZSBwdXQgaW4gdGhlIFRvb2xzL2NvbmZpZyBkaXJlY3RvcnkuCgogICAgICAgICAgICAnc3dpZyAtdmVyc2lvbicgbm93IHJlcG9ydHMgdGhlIHRhcmdldCBidWlsZCBwbGF0Zm9ybS4KCjA1LzExLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbQyMgYW5kIEphdmFdIEZpeCB0byB0aGUgZm9sbG93aW5nIHR5cGVtYXBzOgoKICAgICAgICAgICAgamF2YWJhc2UsIGphdmFpbnRlcmZhY2VzLCBqYXZhaW1wb3J0cywgamF2YWNsYXNzbW9kaWZpZXJzLAogICAgICAgICAgICBqYXZhcHRyY29uc3RydWN0b3Jtb2RpZmllcnMsIGphdmFmaW5hbGl6ZSwgamF2YWdldGNwdHIgJiBqYXZhY29kZS4KCiAgICAgICAgICAgIFRoZXNlIGFyZSB0aGUgdHlwZW1hcHMgZm9yIG1vZGlmeWluZy9nZW5lcmF0aW5nIHByb3h5IGNsYXNzZXMuCiAgICAgICAgICAgIFByZXZpb3VzbHkgdGhlIHR5cGVtYXBzIHdvdWxkIHVzZSB0aGUgcHJveHkgY2xhc3MgbmFtZSBhbmQgbm90IHRoZSAKICAgICAgICAgICAgQysrIHR5cGUsIHdoaWNoIHdhcyBpbmNvbnNpc3RlbnQgd2l0aCBhbGwgb3RoZXIgdHlwZW1hcHMuIAoKICAgICAgICAgICAgSW4gbW9zdCBjaXJjdW1zdGFuY2VzIHRoZSBwcm94eSBjbGFzcyBuYW1lIGFuZCB0aGUgQysrIGNsYXNzIG5hbWUvdHlwZSAKICAgICAgICAgICAgaXMgdGhlIHNhbWUgZXhjZXB0IGZvciBjbGFzc2VzIGluIG5hbWVzcGFjZSwgdGVtcGxhdGVkIGNsYXNzZXMgZXRjLiBzbwogICAgICAgICAgICB0aGlzIHNob3VsZG4ndCBhZmZlY3QgbW9zdCBjYXNlcy4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBKQVZBIGFuZCBDIyBNT0RVTEVTICoqKgoKMDUvMDkvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFZpc3VhbCBDKysgUHJvamVjdCBmaWxlcyBoYXZlIGJlZW4gYWRkZWQgc28gdGhhdCB0aGUgcnVudGltZSBsaWJyYXJpZXMKICAgICAgICAgICAgY2FuIGJlIGJ1aWx0IG9uIFdpbmRvd3MgKGZvciBUY2wsIFBlcmwsIFB5dGhvbiBhbmQgUnVieSkuCgowNS8wMS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHByb2JsZW0gd2l0aCByZXR1cm4gYnkgdmFsdWUsIGNvbnN0LCBhbmQgcHJpdmF0ZSBjb25zdHJ1Y3RvcnMuCiAgICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgIGNsYXNzIEIgewogICAgICAgICAgICAgICAgcHJpdmF0ZToKICAgICAgICAgICAgICAgICAgIEIoKTsKICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgIEIoY29uc3QgQiYpOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICBjbGFzcyBBIHsKICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgY29uc3QgQiByZXR1cm5CKCkgY29uc3Q7CiAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBQcm9ibGVtIGFuZCBwYXRjaCBzdWdnZXN0aW9uIHJlcG9ydGVkIGJ5IEJpbGwgSG9mZm1hbi4KCjA0LzI5LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBCdWlsZCBjaGFuZ2VzOgogICAgICAgICAgICAtIFNpbmdsZSBhdXRvY29uZiBpbnZvY2F0aW9uIC0gYXV0b2NvbmYgaW4gdGhlIFRvb2xzIGRpcmVjdG9yeSBoYXMgZ29uZS4KCiAgICAgICAgICAgIC0gTGlidG9vbCBib290c3RyYXBwZWQgd2hlbiBydW5uaW5nIGF1dG9nZW4uc2guIFRoaXMgcmVxdWlyZXMgYW55b25lCiAgICAgICAgICAgICAgdXNpbmcgdGhlIGN2cyB2ZXJzaW9uIG9mIFNXSUcgdG8gaGF2ZSBsaWJ0b29sIGluc3RhbGxlZCBvbiB0aGVpcgogICAgICAgICAgICAgIG1hY2hpbmUuIFN1Z2dlc3QgdmVyc2lvbiAxLjQuMiBvciBoaWdoZXIsIHByZWZlcmFibHkgdGhlIGxhdGVzdCAtIDEuNS4KCiAgICAgICAgICAgIC0gQXV0b21ha2UgaXMgbm93IHVzZWQgdG8gYnVpbGQgdGhlIHJ1bnRpbWUgbGlicmFyaWVzIGluIGNvbmp1bmN0aW9uIAogICAgICAgICAgICAgIHdpdGggbGlidG9vbC4KCiAgICAgICAgICAgIC0gUnVudGltZSBsaWJyYXJpZXMgYXJlIG5vdyBzdWNjZXNzZnVsbHkgYnVpbHQgYXMgRExMcyBvbiBDeWd3aW4uCgogICAgICAgICAgICAtIFNraXBwaW5nIGxhbmd1YWdlcyBpcyBubyBsb25nZXIganVzdCBkZXRlcm1pbmVkIGluIHRoZSB0b3AgbGV2ZWwgCiAgICAgICAgICAgICAgbWFrZWZpbGUgYnV0IGluIGNvbmZpZ3VyZS5pbi4gVGhpcyBpbmZvIGlzIHVzZWQgZm9yIGJ1aWxkaW5nCiAgICAgICAgICAgICAgdGhlIHJ1bnRpbWUgbGlicmFyaWVzIGFuZCBmb3IgcnVubmluZyB0aGUgZXhhbXBsZXMgYW5kIHRlc3Qtc3VpdGUuCgogICAgICAgICAgICAtIFRoZXNlIGNoYW5nZXMgaGF2ZSBmaXhlZCBtdWx0aXBsZSBidWlsZCBkaXJlY3RvcnkgYnVpbGRzLCB0aGF0IGlzCiAgICAgICAgICAgICAgYnVpbGRpbmcgZnJvbSBkaXJlY3RvcmllcyBvdGhlciB0aGFuIHRoZSB0b3AgbGV2ZWwgZGlyZWN0b3J5LiAKICAgICAgICAgICAgICBJbnN0YWxsYXRpb24gZnJvbSBtdWx0aXBsZSBidWlsZCBkaXJlY3RvcmllcyBhbHNvIHdvcmtpbmcuIEFuIGluaXRpYWwKICAgICAgICAgICAgICBjb25maWd1cmUgaW4gdGhlIHRvcCBsZXZlbCBkaXJlY3RvcnkgaXMgbm8gbG9uZ2VyIG5lZWRlZCBhcyBkZXNjcmliZWQKICAgICAgICAgICAgICBpbiAwNC8wMi8yMDAzIGVudHJ5LiBBICdtYWtlIGRpc3RjbGVhbicgd2lsbCBiZSBuZWVkZWQgYmVmb3JlIGJ1aWxkaW5nCiAgICAgICAgICAgICAgaW4gYSBkaXJlY3Rvcnkgb3RoZXIgdGhhbiB0aGUgdG9wIGxldmVsIGRpcmVjdG9yeSBpZiB0aGUgYXV0b3Rvb2xzIAogICAgICAgICAgICAgIGhhdmUgYmVlbiBydW4gZnJvbSB0aGlzIHRvcCBsZXZlbCBkaXJlY3RvcnkgYXQgc29tZSBwb2ludCwgYnV0IAogICAgICAgICAgICAgIGF1dG9jb25mIHdpbGwgdGVsbCB5b3UgdGhpcy4gTm90ZSB0aGF0ICdtYWtlIGNoZWNrJyBvbmx5IHdvcmtzIGZyb20gCiAgICAgICAgICAgICAgdGhlIHRvcCBsZXZlbCBkaXJlY3RvcnkgYXQgdGhlIG1vbWVudC4KCjA0LzI4LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA3MjM0NzEgXSBXcmFwcGVyX3ByaW50KCkgZmFpbHMgd2l0aCBwcmVwcm9jZXNzb3IgZGlyZWN0aXZlcy4KCjA0LzI4LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgTWlub3IgcmVmaW5lbWVudCBvZiBjb25zdCBzdGF0aWMgbWVtYmVyIHZhcmlhYmxlIGhhbmRsaW5nIAogICAgICAgICAgICBkZXNjcmliZWQgaW4gQ0hBTkdFUyAwOC8xMS8yMDAyLiAgIFByZXZpb3VzbHksIFNXSUcgbWVyZWx5CiAgICAgICAgICAgIGNoZWNrZWQgdG8gc2VlIGlmIHRoZXJlIHdhcyBhbiBpbml0aWFsaXplciBpbiB0aGUgZGVjbGFyYXRpb24uCiAgICAgICAgICAgIE5vdywgU1dJRyBhZGRpdGlvbmFsbHkgY2hlY2tzIHRvIG1ha2Ugc3VyZSB0aGUgc3RhdGljIG1lbWJlcgogICAgICAgICAgICBpcyBjb25zdC4KCjA0LzI1LzIwMDM6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBBZGRlZCBhIGtpbmQgb2YgbGltaXRlZCBzdXBwb3J0IGZvciBtdWx0aXBsZSBpbmhlcml0YW5jZSwKICAgICAgICAgICAgYWN0aXZhdGVkIHVzaW5nIHRoZSAtbWluaGVyaXQgY29tbWFuZC1saW5lIG9wdGlvbi4gSSd2ZSBhbHNvIHVwZGF0ZWQKICAgICAgICAgICAgdGhlICJDKysgSW5oZXJpdGFuY2UiIHNlY3Rpb24gb2YgdGhlIFJ1YnkgZG9jdW1lbnRhdGlvbiB0byBkaXNjdXNzCiAgICAgICAgICAgIGhvdyB0aGlzIHdvcmtzLCBhbmQgaXRzIGxpbWl0YXRpb25zLiBBbHNvIGFsc28gbW9kaWZpZWQgdGhlIG1pbmhlcml0LmkKICAgICAgICAgICAgdGVzdCBjYXNlIHRvIHJ1biBhZ2FpbnN0IHRoaXMuCgowNC8yNS8yMDAzOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gQWRkZWQgdGhlIC1nbG9iYWxtb2R1bGUgY29tbWFuZC1saW5lIG9wdGlvbiBmb3IgdGhlIFJ1YnkKICAgICAgICAgICAgbW9kdWxlLCBmb3Igd3JhcHBpbmcgc3R1ZmYgaW50byB0aGUgZ2xvYmFsIG1vZHVsZSAoS2VybmVsKSBpbnN0ZWFkCiAgICAgICAgICAgIG9mIGEgbmVzdGVkIG1vZHVsZS4gVXBkYXRlZCBkb2N1bWVudGF0aW9uIGFjY29yZGluZ2x5LgoKMDQvMjMvMjAwMzogbXJvc2UgKE1hcmsgUm9zZSkKICAgICAgICAgICAgRml4ZWQgc3ltbmFtZSBlcnJvciBpbiBkaXJlY3RvciBjYWxscyB0byBQeXRob24gbWV0aG9kcwoJICAgIHRoYXQgZXh0ZW5kIEMrKyBvcGVyYXRvcnMuCgoJICAgIFN0b3BwZWQgZGlyZWN0b3IgZGVzdHJ1Y3RvciB3cmFwcGVycyBmcm9tIGNhbGxpbmcgX19zZXRfdXAsCgkgICAgd2hpY2ggd2FzIGxlYXZpbmcgdGhlIGRpcmVjdG9yIGZsYWcgaW4gYW4gaW5jb25zaXN0ZW50IHN0YXRlLgoKMDQvMjMvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBwcm9ibGVtIHdpdGggbmFtZXNwYWNlIHJlc29sdXRpb24gYW5kIG5lc3RlZCBuYW1lc3BhY2VzLgogICAgICAgICAgICBSZXBvcnRlZCBieSBBbGZyZWQgTG9yYmVyIChhbmQgTWFyY2VsbyBNYXR1cykuCgowNC8xNi8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgUGF0Y2ggZm9yIEphdmEgZXhhbXBsZXMgYW5kIHRlc3Qtc3VpdGUgdG8gcnVuIG9uIE1hYyBPUyBYLgoKMDQvMTUvMjAwMzogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIEluY29ycG9yYXRlZCBOb2J1IE5ha2FkYSdzIHBhdGNoZXMgZm9yIHN1cHBvcnRpbmcgdGhlIFJ1YnkKICAgICAgICAgICAgMS44IGFsbG9jYXRpb24gZnJhbWV3b3JrLgoKMDQvMTUvMjAwMzogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIFJlcGxhY2VkIGFsbCB1c2VzIG9mIHRoZSBkZXByZWNhdGVkIFNUUjJDU1RSKCkgbWFjcm8gd2l0aCB0aGUKICAgICAgICAgICAgc2FmZXIgU3RyaW5nVmFsdWVQdHIoKSBtYWNyby4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBydWJ5LXRhbGs6NjcwNTkKICAgICAgICAgICAgYW5kIGZvbGxvdy11cHMgdG8gdGhhdCBwb3N0LgoKMDQvMTEvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBwcm9ibGVtIHdpdGggcHJlcHJvY2Vzc29yIG1hY3JvIGV4cGFuc2lvbi4gIEZvciBleGFtcGxlOgogCiAgICAgICAgICAgICAgICAjZGVmaW5lIG1pbih4LHkpICgoeCkgPCAoeSkpID8gKHgpIDogKHkpIAogICAgICAgICAgICAgICAgaW50IGYoaW50IG1pbik7CgogICAgICAgICAgICBSZXBvcnRlZCBieSBTZWJhc3RpZW4gUmVjaW8uCgowNC8xMC8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEFkZGVkIGEgcnVudGltZSBjaGVjayB0byB0eXBlbWFwcyBpbiBhcnJheXNfamF2YS5pIGxpYnJhcnkgdG8gY2hlY2sgCiAgICAgICAgICAgIHRoYXQgdGhlIEphdmEgYXJyYXkgcGFzc2VkIGluIGlzIHRoZSBzYW1lIHNpemUgYXMgdGhlIEMgYXJyYXkgYW5kIHRocm93IGFuIAogICAgICAgICAgICBleGNlcHRpb24gaWYgbm90LgoKICAgICAgICAgICAgQWxzbyBmaXggdG8gdXNlIGRlbGV0ZSBpbnN0ZWFkIG9mIGZyZWUgZm9yIGFycmF5cyBjcmVhdGVkIHVzaW5nIG5ldy4KCjA0LzA3LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBSZW1vdmUgR0NDMyB3YXJuaW5nIHdoZW4gY29tcGlsaW5nIHRoZSBleGFtcGxlcyBhbmQgdGVzdC1zdWl0ZToKCiAgICAgICAgICAgICAgY2MxcGx1czogd2FybmluZzogY2hhbmdpbmcgc2VhcmNoIG9yZGVyIGZvciBzeXN0ZW0gZGlyZWN0b3J5ICIvdXNyL2luY2x1ZGUiCiAgICAgICAgICAgICAgY2MxcGx1czogd2FybmluZzogYXMgaXQgaGFzIGFscmVhZHkgYmVlbiBzcGVjaWZpZWQgYXMgYSBub24tc3lzdGVtIGRpcmVjdG9yeSAKCiAgICAgICAgICAgIFNlZSBTRiBwYXRjaCAjNzE1NTMxIHN1Ym1pdHRlZCBieSBHZXJhbGQgV2lsbGlhbXMKCjA0LzAzLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbQyNdIEltcHJvdmVkIHdyYXBwaW5nIG9mIGVudW1zIGFuZCBjb25zdGFudHMuIFRoZXNlIHdlcmUgcHJldmlvdXNseQogICAgICAgICAgICB3cmFwcGVkIGFzIEMjIHZhcmlhYmxlcyByYXRoZXIgdGhhbiBjb25zdGFudHMuIEVpdGhlciB0aGVzZSBhcmUgd3JhcHBlZAogICAgICAgICAgICBhcyByZWFkb25seSAocnVudGltZSkgY29uc3RhbnRzIG9yIGNvbXBpbGUgdGltZSBjb25zdGFudHMsIGRlcGVuZGluZyBvbgogICAgICAgICAgICB0aGUgJWphdmFjb25zdCBkaXJlY3RpdmUgKFRoZSBkaXJlY3RpdmUgaXMgbGlrZWx5IHRvIGNoYW5nZSBuYW1lIHNvb24pLgogICAgICAgICAgICBGb3IgZXhhbXBsZSB3cmFwcGluZzoKICAgICAgICAgICAgICAlamF2YWNvbnN0KDApOwogICAgICAgICAgICAgICNkZWZpbmUgQUJDIDIyCiAgICAgICAgICAgICAgJWphdmFjb25zdCgxKSBYWVo7CiAgICAgICAgICAgICAgI2RlZmluZSBYWVogMzMKICAgICAgICAgICAgaXMgbm93OgogICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaW50IEFCQyA9IGV4YW1wbGVQSU5WT0tFLmdldF9BQkMoKTsKICAgICAgICAgICAgICBwdWJsaWMgY29uc3QgaW50IFhZWiA9IDMzOwoKMDQvMDMvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBHbG9iYWwgY29uc3RhbnRzIGFuZCBlbnVtcyBhcmUgcHV0IGluIHRoZWlyIG93biBpbnRlcmZhY2UgY2FsbGVkCiAgICAgICAgICAgIHh4eENvbnN0YW50cywgd2hlcmUgeHh4IGlzIHRoZSBtb2R1bGUgbmFtZS4gVGhpcyBpcyBhbiBpbXByb3ZlbWVudCBhcyAKICAgICAgICAgICAgaXQgaXMgcG9zc2libGUgdG8gZGVyaXZlIChpbXBsZW1lbnQpIGEgSmF2YSBjbGFzcyBmcm9tIHRoZSB4eHhDb25zdGFudHMKICAgICAgICAgICAgaW50ZXJmYWNlIHRvIGltcHJvdmUgdGhlIHN5bnRheDsgbmFtZWx5IHdoZW4gd3JhcHBpbmc6CiAgICAgICAgICAgICAgZW51bSB7T05FPTEsIFRXTywgVEhSRUV9OwogICAgICAgICAgICBhY2Nlc3NpbmcgdGhlc2UgZnJvbSBhIEphdmEgY2xhc3MgaW1wbGVtZW50aW5nIHh4eENvbnN0YW50cyBpcyBuZWF0ZXI6CiAgICAgICAgICAgICAgaW50IG51bWJlciA9IE9ORTsKICAgICAgICAgICAgdGhhbiB0aGUgcHJldmlvdXM6CiAgICAgICAgICAgICAgaW50IG51bWJlciA9IHh4eC5PTkU7CgogICAgICAgICAgICBQYXRjaCBzdWJtaXR0ZWQgYnkgRGF2ZSBEcmliaW4uCgowNC8wMi8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgQnVpbGQgaW1wcm92ZW1lbnRzIGZvciBtdWx0aXBsZSBidWlsZHMuIFRoaXMgYWxsb3dzIG9uZSB0byBidWlsZAogICAgICAgICAgICB0aGUgU1dJRyBleGVjdXRhYmxlIGFuZCBydW50aW1lIGxpYnJhcmllcyBmb3IgZGlmZmVyZW50IHBsYXRmb3Jtcy9jb21waWxlcnMgCiAgICAgICAgICAgIGV0YyBieSBydW5uaW5nIGNvbmZpZ3VyZSBpbiBkaWZmZXJlbnQgZGlyZWN0b3JpZXMuIFRoaXMgaXNuJ3QgMTAwJSBqdXN0IAogICAgICAgICAgICB5ZXQgYW5kIHdvbid0IGJlIHVudGlsIGxpYnRvb2wgaXMgYmV0dGVyIGNvbmZpZ3VyZWQuLi4gYSAnY29uZmlndXJlJyBhbmQgCiAgICAgICAgICAgICdtYWtlIGRpc3RjbGVhbicgbmVlZHMgdG8gYmUgcnVuIGluIHRoZSByb290IGRpcmVjdG9yeSBiZWZvcmUgaXQgYWxsIHdvcmtzLgogICAgICAgICAgICBGb3IgZXhhbXBsZToKICAgICAgICAgICAgICAkIC4vY29uZmlndXJlCiAgICAgICAgICAgICAgJCBtYWtlIGRpc3RjbGVhbgogICAgICAgICAgICAgICQgbWtkaXIgY29uZmlnMTsgY2QgY29uZmlnMTsgLi4vY29uZmlndXJlIENDPWdjYyBDWFg9ZysrOyBtYWtlOyBjZCAuLgogICAgICAgICAgICAgICQgbWtkaXIgY29uZmlnMjsgY2QgY29uZmlnMjsgLi4vY29uZmlndXJlIENDPWNjIENYWD1jKys7IG1ha2U7IGNkIC4uCiAgICAgICAgICAgIAogICAgICAgICAgICBUbyBiZSBpbXByb3ZlZC4gQSAnbWFrZSBjaGVjaycgZG9lcyBub3Qgd29yayB5ZXQgZWl0aGVyLiAKCjA0LzAxLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgdGVtcGxhdGUgcGFydGlhbCBzcGVjaWFsaXphdGlvbiBhcmd1bWVudCBleHBhbnNpb24gYnVnLgogICAgICAgICAgICBUaGlzIHNob3dlZCB1cCB3aGVuIHRyeWluZyB0byB1c2Ugc3RkX3ZlY3Rvci5pIHdpdGggdmVjdG9ycwogICAgICAgICAgICBvZiBwb2ludGVycy4KCjAzLzMxLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBGaXggZm9yIHBhcmFsbGVsIG1ha2UgYnVpbGRzIG9mIFNXSUcsIGZvciBleGFtcGxlCiAgICAgICAgICAgICAgbWFrZSAtaiA0CiAgICAgICAgICAgIEJ1aWxkIGZhaWx1cmUgcmVwb3J0ZWQgYnkgQmlsbCBDbGFya2UuCgowMy8yOC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIFJlbGVhc2VkIDEuMy4xOS4KCgoKVmVyc2lvbiAxLjMuMTkgKE1hcmNoIDI4LCAyMDAzKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgowMy8yOC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIFZhcmlldHkgb2YgbWlub3IgYnVnIGZpeGVzIHRvIHRoZSAxLjMuMTggcmVsZWFzZSBpbmNsdWRpbmc6CgogICAgICAgICAgICAgICAgLSBTZWdtZW50YXRpb24gZmF1bHQgd2l0aCAlZXh0ZW5kIGRpcmVjdGl2ZS4KICAgICAgICAgICAgICAgIC0gVHlwZW1hcCB2YXJpYWJsZSBzdWJzdGl0dXRpb24gYnVnLgogICAgICAgICAgICAgICAgLSBFeHByZXNzaW9uIGV2YWx1YXRpb24gYnVnLgogICAgICAgICAgICAgICAgLSBMYXJnZSBtZW1vcnkgbGVhayB3aXRoIHRlbXBsYXRlIGV4cGFuc2lvbi4KClZlcnNpb24gMS4zLjE4IChNYXJjaCAyMywgMjAwMykKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMDMvMjEvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCB0d28gcHJvYmxlbXMgd2l0aCB0aGUgJWV4dGVuZCBkaXJlY3RpdmUsIG92ZXJsb2FkaW5nLCBhbmQKICAgICAgICAgICAgdGVtcGxhdGUgZXhwYW5zaW9uLiAgU2VlIHRoZSAndGVtcGxhdGVfZXh0ZW5kX292ZXJsb2FkJyBhbmQKICAgICAgICAgICAgJ3RlbXBsYXRlX2V4dGVuZF9vdmVybG9hZF8yJyB0ZXN0cyBpbiBFeGFtcGxlcy90ZXN0LXN1aXRlIGZvcgogICAgICAgICAgICBkZXRhaWxzLgoKMDMvMjAvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtDI10gQWRkZWQgc29tZSB0eXBlbWFwcyBhcyBzdWdnZXN0ZWQgYnkgQW5kcmVhcyBTY2hvZXJrIGZvciBoYW5kbGluZwogICAgICAgICAgICBwYXJhbWV0ZXJzIHRoYXQgYXJlIHBhc3NlZCBhcyBwb2ludGVycyBvciBieSByZWZlcmVuY2UuIFRoZXNlIGhhdmUKICAgICAgICAgICAgYmVlbiBwdXQgaW4gdHlwZW1hcHMuaS4KCjAzLzIwLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYSBDKysgc2NvcGluZyBidWcgcmVsYXRlZCB0byBjb2RlIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICBpbnQgRm9vOjpiYXIoKTsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBQcmV2aW91c2x5LCBTV0lHIGp1c3QgdG9zc2VkIG91dCB0aGUgRm9vOjpiYXIoKSBkZWNsYXJhdGlvbi4gTm93LAogICAgICAgICAgICB0aGUgZGVjbGFyYXRpb24gaXMgd3JhcHBlZCBwcm92aWRlZCB0aGF0IHRoZSBwcmVmaXggaXMgZXhhY3RseSB0aGUKICAgICAgICAgICAgc2FtZSBhcyB0aGUgY3VycmVudCBzY29wZSAoaW5jbHVkaW5nIGFueSBlbmNsb3NpbmcgbmFtZXNwYWNlcykuCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IEJydWNlIExvd2VyeS4KCjAzLzIwLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgSW5jb3Jwb3JhdGVkIFsgNjk2NTE2IF0gRW5hYmxpbmcgZXhjZXB0aW9uIHByb2Nlc3NpbmcgZm9yIGRhdGEgbWVtYmVyIGFjY2Vzcy4KICAgICAgICAgICAgSW4gc29tZSBjb21waWxlcnMsIGF0dHJpYnV0ZSBhY2Nlc3MgY2FuIGdlbmVyYXRlIGV4Y2VwdGlvbnMuICBIb3dldmVyLAogICAgICAgICAgICBTV0lHIG9yZGluYXJpbHkgYXNzdW1lcyB0aGF0IG5vIGV4Y2VwdGlvbnMgd2lsbCBiZSByYWlzZWQuICBUbyBkaXNhYmxlIHRoaXMsCiAgICAgICAgICAgIHVzZSB0aGUgJWZlYXR1cmUoImFsbG93ZXhjZXB0IikuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgICVmZWF0dXJlKCJhbGxvd2V4Y2VwdCIpIEZvbzo6eDsKICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgIGludCB4OyAgICAgLyogRXhjZXB0aW9uIGhhbmRsaW5nIGVuYWJsZWQgKi8KICAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgUGF0Y2ggY29udHJpYnV0ZWQgYnkgWWFrb3YgTWFya292aXRjaC4gCiAKMDMvMjAvMjAwMzogYmVhemxleQogICAgICAgICAgICBJbmNvcnBvcmF0ZWQgUGF0Y2guIFsgNzAxODYwIF0gSW1wcm92ZSBQZXJmb3JtYW5jZSAocHl0aG9uIHByb3hpZXMpLgogICAgICAgICAgICBHaXZlcyBhIHBlcmZvcm1hbmNlIGJvb3N0IHRvIHByb3h5IGNsYXNzIGNvZGUgYW5kIHRoZSBtYW5hZ2VtZW50IG9mIHRoZQogICAgICAgICAgICAudGhpcyBhbmQgLnRoaXNvd24gYXR0cmlidXRlcy4gIENvbnRyaWJ1dGVkIGJ5IE1pa2UgUm9tYmVyZy4KCjAzLzE5LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbQyMgYW5kIEphdmFdIEFkZGVkIG1pc3NpbmcgdmFyYXJnIHN1cHBvcnQuCgowMy8xOC8yMDAzOiBtcm9zZSAoTWFyayBSb3NlKQogICAgICAgICAgICBSZW1vdmVkIGNvZGUgcmVsYXRlZCB0byB0YWdnaW5nIGluZGl2aWR1YWwgbWV0aG9kcyBmb3IgZGlyZWN0b3JzLgoJICAgIFRoZSBjb25jZXB0IG9mIGhhdmluZyBkaXJlY3RvcnMgZm9yIHNvbWUgYnV0IG5vdCBhbGwgdmlydHVhbCBtZXRob2RzCgkgICAgb2YgYSBjbGFzcyBpcyBkZWVwbHkgZmxhd2VkLiAgVGhlICVmZWF0dXJlKCJub2RpcmVjdG9yIikgdGFnIGlzIGFsc28KCSAgICBnb25lLiAgCgkgICAgCgkgICAgRGlyZWN0b3JzIGFyZSBvZmYgYnkgZGVmYXVsdC4gIFRvIGVuYWJsZSB0aGVtIGZvciBhIGNsYXNzLCBpc3N1ZQoJICAgICVmZWF0dXJlKCJkaXJlY3RvciIpIGNsYXNzbmFtZTsgd2hpY2ggd2lsbCBjcmVhdGUgZGlyZWN0b3IgbWV0aG9kcwoJICAgIGZvciBldmVyeSB2aXJ0dWFsIG1ldGhvZCBpbiB0aGUgaGllcmFyY2h5IG9mIHRoZSBjbGFzcy4KCjAzLzE3LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYSBzdWJ0bGUgcHJvYmxlbSB3aXRoIHBhc3NpbmcgYXJndW1lbnRzIG9mIHR5cGUgZnVuY3Rpb24uICBGb3IKICAgICAgICAgICAgZXhhbXBsZToKCiAgICAgICAgICAgICAgIGludCBmb28oaW50IHgoaW50LCBpbnQpKTsKCiAgICAgICAgICAgIG9yCgogICAgICAgICAgICAgICB0eXBlZGVmIGludCBiaW5vcF90KGludCwgaW50KTsKICAgICAgICAgICAgICAgaW50IGZvbyhiaW5vcF90IHgpOwoKICAgICAgICAgICAgSW4gb2xkIHZlcnNpb25zLCB0aGlzIHdvdWxkIHByb2R1Y2UgY29kZSB0aGF0IHdvdWxkbid0IGNvbXBpbGUuICBOb3csCiAgICAgICAgICAgIFNXSUcgbWVyZWx5IGFkZHMgYW4gZXh0cmEgcG9pbnRlciwgbWFraW5nIHRoZXNlIGRlY2xhcmF0aW9ucyB0aGUgc2FtZQogICAgICAgICAgICBhczoKCiAgICAgICAgICAgICAgIGludCBmb28oaW50ICgqeCkoaW50LCBpbnQpKTsKCiAgICAgICAgICAgICAgIHR5cGVkZWYgaW50IGJpbm9wX3QoaW50LCBpbnQpOwogICAgICAgICAgICAgICBpbnQgZm9vKGJpbm9wX3QgKngpOwoKICAgICAgICAgICAgUmVwb3J0ZWQgYnkgR2FydGggQnVzaGVsbC4KCjAzLzE3LzIwMDM6IG1yb3NlIChNYXJrIFJvc2UpCiAgICAgICAgICAgIEZpeGVkIHRoZSByZXR1cm4gc3RhdGVtZW50IGZvciBkaXJlY3RvciBiYXNlIGNsYXNzIGNhbGxzIHRoYXQgaGF2ZSBubwogICAgICAgICAgICByZXR1cm4gdmFsdWUuCgowMy8xNS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGEgcHJvYmxlbSB3aXRoIGNvbnN0IHNtYXJ0LXBvaW50ZXIgd3JhcHBpbmcuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgaW50IHg7CiAgICAgICAgICAgICAgICAgICAgdm9pZCBiYXIoKSBjb25zdDsKICAgICAgICAgICAgICAgICAgICB2b2lkIHNwYW0oKTsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgY2xhc3MgQmxhaCB7CiAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgIGNvbnN0IEZvbyAqb3BlcmF0b3ItPigpOwogICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgSW4gdGhpcyBjYXNlLCBvbmx5ICJ4IiBhbmQgImJhciIgYXJlIHZpc2libGUgZnJvbSBCbGFoIChzaW5jZSBhcHBsaWNhdGlvbgogICAgICAgICAgICBvZiBzcGFtIHZpb2xhdGVzIGNvbnN0bmVzcykuICBNb3Jlb3ZlciwgYWNjZXNzIHRvICJ4IiBpcyByZWFkLW9ubHkuCiAgICAgICAgICAgCjAzLzE1LzIwMDM6IG1yb3NlIChNYXJrIFJvc2UpCiAgICAgICAgICAgIENsZWFuZWQgdXAgdHdvIHNpZ25lZCB2ZXJzdXMgdW5zaWduZWQgY29tcGFyaXNvbnMgaW4gcHl0aG9uL3N0ZF92ZWN0b3IuaS4KCSAgICAKMDMvMTUvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtDI10gR2xvYmFsIHZhcmlhYmxlcyBhcmUgd3JhcHBlZCB1c2luZyBwcm9wZXJ0aWVzIGluc3RlYWQgb2YgZ2V0IGFuZCBzZXQgbWV0aG9kcy4KICAgICAgICAgICAgTWVtYmVyIHZhcmlhYmxlIHdyYXBwaW5nIGJ1ZyBmaXhlcywgZm9yIGV4YW1wbGUgd3JhcHBpbmcgcG9pbnRlcnMgd29yayBub3cuCiAgICAgICAgICAgIFR5cGVtYXBzIGFyZSB1c2VkIGZvciBhbGwgdmFyaWFibGUgd3JhcHBpbmcgdG8gZ2VuZXJhdGUgdGhlIHByb3BlcnR5IGNvZGUuCgowMy8xMy8yMDAzOiBtcm9zZSAoTWFyayBSb3NlKQogICAgICAgICAgICBGaXhlZCBhIGJ1ZyBpbiB0aGUgdmlydHVhbCBtZXRob2QgdW5yb2xsaW5nIGZvciBkaXJlY3RvcnMuIAoJICAgIFRoZSBvcmRlciBvZiB1bnJvbGxpbmcgaXMgbm93IGZyb20gYmFzZSB0byBkZXJpdmVkLCB0byBlbnN1cmUKCSAgICB0aGF0IHRoZSBtb3N0IGRlcml2ZWQgaW1wbGVtZW50YXRpb24gb2YgYSBkaXJlY3RvciBtZXRob2QgaXMKCSAgICBmb3VuZC4KCgkgICAgRGlyZWN0b3IgbWV0aG9kcyBmb3IgcHVyZSB2aXJ0dWFsIG1ldGhvZHMgbm93IHRocm93CgkgICAgRElSRUNUT1JfUFVSRV9WSVJUVUFMX0VYQ0VQVElPTiBpZiBfdXAgaXMgc2V0LgoKMDMvMTIvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtDI10gUG9seW1vcnBoaXNtIGZpeDogdmlydHVhbCBmdW5jdGlvbnMgbm93IHVzZSB0aGUgYXBwcm9wcmlhdGUKICAgICAgICAgICAga2V5d29yZCBpbiB0aGUgQyMgcHJveHkgY2xhc3MsIHZpcnR1YWwgb3Igb3ZlcnJpZGUuCiAgICAgICAgICAgIFNvbWUgJ3VzaW5nIFN5c3RlbTsnIHN0YXRlbWVudCBmaXhlcyBuZWVkZWQgYnkgdGhlIE1vbm8gY29tcGlsZXIuCgowMy8xMS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHN1YnRsZSBidWcgaW4gdGhlIGFwcGxpY2F0aW9uIG9mIFN3aWdWYWx1ZVdyYXBwZXI8PiB0bwogICAgICAgICAgICB0ZW1wbGF0ZSBjbGFzc2VzIHdpdGggZGVmYXVsdCBjb25zdHJ1Y3RvcnMuICBSZXBvcnRlZCBieQogICAgICAgICAgICBCcnVjZSBMb3dlcnkuCgowMy8xMS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIFRoZSAkZGVzY3JpcHRvcih0eXBlKSB2YXJpYWJsZSBpcyBub3cgZXhwYW5kZWQgaW4gY29kZSBzdXBwbGllZCB0bwogICAgICAgICAgICAlZXh0ZW5kLiAgVGhpcyBpcyB1c2VmdWwgZm9yIGNlcnRhaW4ga2luZHMgb2YgYWR2YW5jZWQgd3JhcHBpbmcgCiAgICAgICAgICAgIChlc3BlY2lhbGx5IGNvbnRhaW5lciBjbGFzc2VzKS4KCjAzLzExLzIwMDM6IGx1aWdpCiAgICAgICAgICAgIFN1cHBvcnQgZm9yIHN0ZDo6bWFwLgogICAgICAgICAgICAoYSkgSW50ZWdyYXRpb24gd2l0aCBzY3JpcHRpbmcgbGFuZ3VhZ2UgKGEgbGEgc3RkOjp2ZWN0b3IpIGZvcgogICAgICAgICAgICAgICAgUHl0aG9uLCBSdWJ5LCBNelNjaGVtZSwgYW5kIEd1aWxlOwogICAgICAgICAgICAoYikgU2ltcGxlIHdyYXBwZXIgZm9yIG90aGVyIGxhbmd1YWdlcwoKMDMvMTAvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBwcm9ibGVtIHdpdGggZXNjYXBlIHNlcXVlbmNlcyBpbiBzdHJpbmcgYW5kIGNoYXJhY3RlciBjb25zdGFudHMuICBTV0lHCiAgICAgICAgICAgIHdhc24ndCBwYXJzaW5nIGNlcnRhaW4gb2N0YWwgY29kZXMgY29ycmVjdGx5LgoKMDMvMDcvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBhIHZhcmlldHkgb2Ygc3VidGxlIHByZXByb2Nlc3NvciBwcm9ibGVtcyByZXBvcnRlZCBieQogICAgICAgICAgICBTZWJhc3RpZW4gUmVjaW8uCgogICAgICAgICAgICAoYSkgRW1wdHkgcHJlcHJvY2Vzc29yIHZhbHVlcyBubyBsb25nZXIgZ2VuZXJhdGUgImJhZCBjb25zdGFudAogICAgICAgICAgICB2YWx1ZSIgZXJyb3JzLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICAjZGVmaW5lIEZPTwogICAgICAgICAgICAgICAgICAjZGVmaW5lIEZPTyBCQVIKCiAgICAgICAgICAgIChiKSBNYWNybyBuYW1lcyBjYW4gbm93IHNwYW4gbXVsdGlwbGUgbGluZXMgKHRlY2huaWNhbGx5IHZhbGlkLAogICAgICAgICAgICBhbHRob3VnaCBxdWVzdGlvbmFibGUgcHJhY3RpY2UpLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICAjZGVmaW5lIEFfTE9OR19NQUNST19cCiAgICAgICAgICAgICAgICAgIE5BTUUgNDIKCiAgICAgICAgICAgIChjKSBXaGl0ZXNwYWNlIGlzIG5vIGxvbmdlciByZXF1aXJlZCBiZWZvcmUgY2VydGFpbiBtYWNybyB2YWx1ZXMuCiAgICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAgI2RlZmluZSBGT08iSGVsbG8iCiAgICAgICAgICAgICAgICAgICNkZWZpbmUgQkFSXAogICAgICAgICAgICAgICAgICAiSGVsbG8iCiAKMDMvMDcvMjAwMzogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIEFkZGVkIG1pc3NpbmcgbG9uZyBsb25nIGFuZCB1bnNpZ25lZCBsb25nIGxvbmcgdHlwZW1hcHMKICAgICAgICAgICAgaW4gdGhlIExpYi9ydWJ5L3R5cGVtYXBzLmkgbGlicmFyeSBmaWxlLgoKMDMvMDcvMjAwMzogbXJvc2UgKE1hcmsgUm9zZSkKICAgICAgICAgICAgQWRkZWQgRXhhbXBsZXMvcHl0aG9uL2NhbGxiYWNrIHRvIGRlbW9zdHJhdGUgaG93IGRpcmVjdG9ycyBjYW4KCSAgICBiZSB1c2VkIHRvIGltcGxlbWVudCBjYWxsYmFja3MgaW4gUHl0aG9uCgkgICAgQWRkZWQgRXhhbXBsZXMvcHl0aG9uL2V4dGVuZCB0byBkZW1vbnN0cmF0ZSB2aXJ0dWFsIG1ldGhvZAoJICAgIGNhbGxzIGZyb20gQysrIHRvIFB5dGhvbiAocmVhbGx5IHRoZSBzYW1lIGFzIHRoZSBjYWxsYmFjawoJICAgIGV4YW1wbGUsIGp1c3QgYSBkaWZmZXJlbnQgY29udGV4dCkuCgkgICAgQWRkZWQgZm91ciB0ZXN0cyBmb3IgdmVyeSBiYXNpYyBkaXJlY3RvciBmdW5jdGlvbmFsaXR5LiAgVGhlc2UKCSAgICBoYXZlIHJ1bnRpbWUgdGVzdHMgdW5kZXIgcHl0aG9uLgoJICAgIFRoZSBQeXRob24gbW9kdWxlIG5vdyBlbWl0cyAjZGVmaW5lIFNXSUdfRElSRUNUT1JTIG5lYXIgdGhlCgkgICAgdG9wIG9mIHRoZSBvdXRwdXQgZmlsZSBpZiBkaXJlY3RvcnMgYXJlIGVuYWJsZWQuICBUaGlzIGlzIHVzZWZ1bAoJICAgIGZvciBkaXNhYmxpbmcgcGFydHMgb2YgdGVzdHMgaW4gdGFyZ2V0IGxhbmd1YWdlcyB0aGF0IGRvbid0CgkgICAgc3VwcG9ydCBkaXJlY3RvcnMuCgowMy8wNi8yMDAzOiBtcm9zZSAoTWFyayBSb3NlKQogICAgICAgICAgICBBZGRlZCBhIHNlY3Rpb24gdG8gRG9jL01hbnVhbC9QeXRob24uaHRtbCBvbiBjcm9zcyBsYW5ndWFnZQoJICAgIHBvbHltb3JwaGlzbSAoZGlyZWN0b3JzKS4KCjAzLzA2LzIwMDM6IG1yb3NlIChNYXJrIFJvc2UpCiAgICAgICAgICAgIFRoZSBzaG9ydC1saXZlZCAiLWZkaXJlY3RvcnMiIGNvbW1hbmQgbGluZSBvcHRpb24gaGFzIGJlZW4KCSAgICByZW1vdmVkLiAgVG8gZW5hYmxlIGRpcmVjdG9ycywgaW5zdGVhZCB1c2UgdGhlIGV4dGVuZGVkICVtb2R1bGUgCgkgICAgZGlyZWN0aXZlIGFzIGZvbGxvd3M6CgoJICAgICAgICAlbW9kdWxlKGRpcmVjdG9ycz0iMSIpIG1vZHVsZW5hbWUKCjAzLzA2LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBUaGUgbG9uZyBsb25nIHR5cGVtYXBzIGhhdmUgYmVlbiByZXdyaXR0ZW4gc28gdGhhdCB0aGV5IGNhbiBiZSBtb3JlCiAgICAgICAgICAgIGVhc2lseSB1c2VkIHdpdGggbm9uIElTTyBjb21waWxlcnMsIGxpa2UgVmlzdWFsIEMrKy4gRm9yIGV4YW1wbGUKICAgICAgICAgICAgaWYgeW91IGFyZSB3cmFwcGluZyB0aGUgV2luZG93cyA2NCBiaXQgdHlwZSBfX2ludDY0IHRoZSBsb25nIGxvbmcKICAgICAgICAgICAgdHlwZW1hcHMgY2FuIGJlIHVzZWQgd2l0aCAlYXBwbHk6CgogICAgICAgICAgICAgICAgJWFwcGx5IGxvbmcgbG9uZyB7IF9faW50NjQgfTsKICAgICAgICAgICAgICAgIF9faW50NjQgdmFsdWUxKF9faW50NjQgeCk7CgogICAgICAgICAgICBfX2ludDY0IHdpbGwgbm93IGFwcGVhciBpbiB0aGUgZ2VuZXJhdGVkIGNvZGUgaW5zdGVhZCBvZiBsb25nIGxvbmcuCiAgICAgICAgICAgIAowMy8wNi8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgICoqKiBERVZFTE9QRVIgQ0hBTkdFICoqKgogICAgICAgICAgICBTd2lnIG1vZHVsZSBtdXRhdGlvbiBoYXMgYmVlbiBjaGFuZ2VkIHNsaWdodGx5LiAgV2hlbiBhIGxhbmd1YWdlCiAgICAgICAgICAgIGNsYXNzIG1ldGhvZCB3YW50cyB0byBzYXZlIG5vZGUgYXR0cmlidXRlcywgaXQgbm93IHVzZXMgb25lIG9mIHRoZQogICAgICAgICAgICBmb2xsb3dpbmcgZnVuY3Rpb25zOgoKICAgICAgICAgICAgICAgICAgU3dpZ19yZXF1aXJlKCkKICAgICAgICAgICAgICAgICAgU3dpZ19zYXZlKCkKCiAgICAgICAgICAgIFRoZSBmaXJzdCBhcmd1bWVudCB0byB0aGVzZSBmdW5jdGlvbnMgaXMgYSBuYW1lc3BhY2UgaW4gd2hpY2gKICAgICAgICAgICAgc2F2ZWQgYXR0cmlidXRlcyBhcmUgcGxhY2VkLiAgRm9yIGV4YW1wbGUsdGhpcyBjb2RlCgogICAgICAgICAgICAgICAgICBOb2RlICpuOwogICAgICAgICAgICAgICAgICBTd2lnX3NhdmUoImNEZWNsYXJhdGlvbiIsbiwidHlwZSIsInBhcm1zIiwibmFtZSIsTklMKTsKCiAgICAgICAgICAgIHNhdmVzIHRoZSBhdHRyaWJ1dGVzIGFzICJjRGVjbGFyYXRpb246dHlwZSIsICJjRGVjbGFyYXRpb246cGFybXMiLAogICAgICAgICAgICBhbmQgc28gZm9ydGguICAgSWYgbmVjZXNzYXJ5LCBhIGxhbmd1YWdlIG1vZHVsZSBjYW4gcmVmZXIgdG8KICAgICAgICAgICAgb2xkIHZhbHVlcyBieSB1c2luZyB0aGlzIHNwZWNpYWwgbmFtZXNwYWNlIHF1YWxpZmllci4KCiAgICAgICAgICAgIEluIGFkZGl0aW9uIHRvIHRoaXMsIGEgc3BlY2lhbCBhdHRyaWJ1dGUgInZpZXciIGNvbnRhaW5zIHRoZSBuYW1lCiAgICAgICAgICAgIG9mIHRoZSBsYXN0IG5hbWVzcGFjZSB1c2VkIHRvIHNhdmUgYXR0cmlidXRlcy4gIEluIHRoZSBhYm92ZSAKICAgICAgICAgICAgZXhhbXBsZSwgInZpZXciIHdvdWxkIGhhdmUgdGhlIHZhbHVlICJjRGVjbGFyYXRpb24iLiAgIFRoZSB2YWx1ZQogICAgICAgICAgICBvZiAiY0RlY2xhcmF0aW9uOnZpZXciIHdvdWxkIGhhdmUgdGhlIHByZXZpb3VzIHZpZXcgYW5kIHNvIGZvcnRoLgoKICAgICAgICAgICAgU3dpZ19yZXN0b3JlKG4pIHJlc3RvcmVzIGEgbm9kZSB0byB0aGUgc3RhdGUgYmVmb3JlIHRoZSBsYXN0CiAgICAgICAgICAgIFN3aWdfcmVxdWlyZSgpIG9yIFN3aWdfc2F2ZSgpIGNhbGwuCgogICAgICAgICAgICBOb3RlOiAgVGhpcyBjaGFuZ2UgbWFrZXMgaXQgZWFzaWVyIGZvciBsYW5ndWFnZSBtb2R1bGVzIHRvIHJlZmVyCiAgICAgICAgICAgIHRvIG9sZCB2YWx1ZXMgb2YgYXR0cmlidXRlcy4gIAoKCjAzLzA2LzIwMDM6IG1yb3NlIChNYXJrIFJvc2UpCiAgICAgICAgICAgIE1lcmdlZCB0aGUgY3Jvc3MtbGFuZ3VhZ2UgcG9seW1vcnBoaXNtIHBhdGNoLiAgV2hlbiBlbmFibGVkLCBDKysgCgkgICAgInByb3h5IiBjbGFzc2VzIChjYWxsZWQgZGlyZWN0b3JzKSBhcmUgZ2VuZXJhdGVkIGZvciBlYWNoIHNwZWNpZmllZCAKCSAgICBDKysgY2xhc3MuICBEaXJlY3RvcnMgcGFzcyBtZXRob2QgY2FsbHMgZnJvbSBDKysgdG8gUHl0aG9uLCBzaW1pbGFyIAoJICAgIHRvIHRoZSB3YXkgdGhlIHVzdWFsIHByb3h5IChzaGFkb3cpIGNsYXNzZXMgcGFzcyBtZXRob2QgY2FsbHMgZnJvbSAKCSAgICBQeXRob24gdG8gQysrLiAgVG9nZXRoZXIsIHRoZXNlIHR3byB0eXBlcyBvZiBwcm94aWVzIGFsbG93IEMrKyAKCSAgICBjbGFzc2VzIHRoYXQgYXJlIGV4dGVuZGVkIGluIFB5dGhvbiB0byBiZWhhdmUganVzdCBsaWtlIG9yZGluYXJ5IAoJICAgIEMrKyBjbGFzc2VzIGFuZCBiZSB1c2VkIGluIEMrKyBsaWtlIG5hdGl2ZSBvYmplY3RzLiAgCgkgICAgCgkgICAgVGhpcyBmZWF0dXJlIGlzIHN0aWxsIHZlcnkgZXhwZXJpbWVudGFsIGFuZCBpcyBkaXNhYmxlZCBieSBkZWZhdWx0LgoJICAgIFRvIGVuYWJsZSBkaXJlY3RvciBzdXBwb3J0LCBzcGVjaWZ5ICctZmRpcmVjdG9ycycgb24gdGhlIFNXSUcgY29tbWFuZAoJICAgIGxpbmUgb3IgaW4gdGhlIFNXSUdfRkVBVFVSRVMgZW52aXJvbm1lbnQgdmFyaWFibGUuICBJbiB0aGUgaW50ZXJmYWNlCgkgICAgZmlsZSwgYWRkICVmZWF0dXJlKCJkaXJlY3RvciIpIHRvIGdlbmVyYXRlIGRpcmVjdG9ycyBmb3IgYWxsIGNsYXNzZXMKCSAgICB0aGF0IGhhdmUgdmlydHVhbCBtZXRob2RzLiAgCgkgICAgCgkgICAgU2VlIGh0dHA6Ly9zdG0ubGJsLmdvdi9+dG0yL3N3aWcvUHJveHlEb2MuaHRtbCBmb3IgbW9yZSBkZXRhaWxzLgoJICAgIAoKMDMvMDMvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBhIHNtYWxsIGdsaXRjaCBpbiB0eXBlbWFwIGxvY2FsIHZhcmlhYmxlIHJlcGxhY2VtZW50LiAgSWYgeW91IGhhZAogICAgICAgICAgICBhIHR5cGVtYXAgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgICAldHlwZW1hcChpbikgdHlwZSAoJDFfdHlwZSB0ZW1wKSB7CiAgICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgICAgIHRlbXAgPSAuLi47CiAgICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICBhbmQgbm8gb2NjdXJyZW5jZSBvZiAiJDFfdHlwZSIgYXBwZWFyZWQgaW4gdGhlIGJvZHksIHRoZW4gdGhlIGxvY2FsCiAgICAgICAgICAgIHZhcmlhYmxlIHR5cGUgd291bGRuJ3QgYmUgc3Vic3RpdHV0ZWQuCgowMy8wMy8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0MjXSBOZXcgdmVyc2lvbiBvZiB0aGUgQ1NoYXJwIG1vZHVsZSB3aGljaCBpcyB0eXBlbWFwIGJhc2VkLgogICAgICAgICAgICBJdCBhbHNvIHVzZXMgRUNNQSBDIyBhbmQgbm8gbG9uZ2VyIHVzZXMgTWljcm9zb2Z0IFZpc3VhbCBDKysuTkVUIAogICAgICAgICAgICBnbHVlLiBUaGlzIG1lYW5zIHRoYXQgaXQgd2lsbCB3b3JrIG9uIG5vbi1XaW5kb3dzIHBsYXRmb3Jtcy4KICAgICAgICAgICAgQ29udHJpYnV0ZWQgYnkgTmVpbCBDYXdzZS4KCjAyLzI3LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA2NTM1NDggXSBlcnJvciBwYXJzaW5nIGNhc3Rpbmcgb3BlcmF0b3IgZGVmaW5pdGlvbi4KICAgICAgICAgICAgU1dJRyBub3cgaWdub3JlcyBjYXN0aW5nIG9wZXJhdG9ycyBkZWNsYXJlZCBvdXRzaWRlIG9mIGEgY2xhc3MuCiAgICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgIGlubGluZSBBOjpvcGVyYXRvciBjaGFyICooKSB7IC4uLiB9CgogICAgICAgICAgICBCdWcgcmVwb3J0ZWQgYnkgTWFydGluIENhc2Fkby4KCjAyLzI3LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgQWRkZWQgc3VwcG9ydCBmb3IgYW5vbnltb3VzIGJpdC1maWVsZHMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgc3RydWN0IEZvbyB7CiAgICAgICAgICAgICAgICAgICAgICBpbnQgeCA6IDQ7CiAgICAgICAgICAgICAgICAgICAgICBpbnQgICA6IDQ7CiAgICAgICAgICAgICAgICAgICAgICBpbnQgeSA6IDg7CiAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIEFub255bW91cyBiaXQtZmllbGRzIGFyZSBpZ25vcmVkIGJ5IFNXSUcuICAgUHJvYmxlbQogICAgICAgICAgICByZXBvcnRlZCBieSBGcmFueiBI9nBmaW5nZXIuCgowMi8yNi8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEJldHRlciB0eXBlbWFwcyBpbiB0aGUgRXhhbXBsZXMvamF2YS90eXBlbWFwIGV4YW1wbGUgYW5kIGFsc28gCiAgICAgICAgICAgIGZpeGVzIHN1YnRsZSBidWcgd2hlbiB1c2luZyB0aGUgU3RyaW5nQnVmZmVyIHR5cGVtYXBzIG1vcmUgdGhhbiBvbmNlLgoKMDIvMjYvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDY0MjExMiBdIENvbnN0YW50cyBjaGFyIGJ1Zy4KCjAyLzI2LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA2NzUzMzcgXSBQYXJ0aWFsIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIG5vdCBlbnRpcmVseSB3b3JraW5nLgogICAgICAgICAgICBUaGVyZSB3YXMgYSBzdWJ0bGUgcHJvYmxlbSByZWxhdGVkIHRvIHRoZSBuYW1pbmcgYW5kIG9yZGVyaW5nIG9mCiAgICAgICAgICAgIHRlbXBsYXRlIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24gYXJndW1lbnRzLiAgTWF0Y2hpbmcgd29ya2VkIG9rYXksCiAgICAgICAgICAgIHRoZSByZXN1bHRpbmcgdGVtcGxhdGVzIHdlcmVuJ3QgZXhwYW5kZWQgY29ycmVjdGx5LgoKMDIvMjUvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBwcm9ibGVtIHdpdGggcGFyc2luZyAoYW5kIGdlbmVyYXRpbmcgY29kZSkgZm9yIAogICAgICAgICAgICByZWZlcmVuY2VzIHRvIGFycmF5cy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgIGludCBmb28oaW50ICgmeClbMTBdKTsKICAKMDIvMjUvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDYzNTM0NyBdIENvbXBpbGF0aW9uIHdhcm5pbmcgZnJvbSBsaWJweS5jLgogICAgICAgICAgICBSZXBvcnRlZCBieSBEYW5pZWwgTC4gUmFsbC4KIAowMi8yNS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGEgc3VidGxlIHByb2JsZW0gd2l0aCB2aXJ0dWFsIG1ldGhvZCBpbXBsZW1lbnRhdGlvbgogICAgICAgICAgICBjaGVja2luZyBhbmQgdHlwZWRlZi4KCiAgICAgICAgICAgICAgICAgdHlwZWRlZiBpbnQgKmludHB0cjsKCiAgICAgICAgICAgICAgICAgc3RydWN0IEEgewogICAgICAgICAgICAgICAgICAgIHZpcnR1YWwgaW50ICpmb28oKSA9IDA7CiAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICBzdHJ1Y3QgQiA6IHB1YmxpYyBBIHsKICAgICAgICAgICAgICAgICAgICB2aXJ0dWFsIGludHB0ciBmb28oKSB7IH07CiAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFNXSUcgd2FzIHRyZWF0aW5nIHRoZXNlIGRlY2xhcmF0aW9ucyBhcyBkaWZmZXJlbnQgZXZlbiB0aG91Z2gKICAgICAgICAgICAgdGhleSBhcmUgdGhlIHNhbWUgKHZpYSB0eXBlZGVmKS4KCjAyLzI1LzIwMDM6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBBZGRlZCByYW5nZSBjaGVja2luZyBmb3IgdGhlIE5VTTJVU0hSVCBtYWNybywgcGVyIFsgNjc1MzUzIF0uCgowMi8yNC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGEgc3VidGxlIHByb2JsZW0gd2l0aCB0aGUgY29kZSB0aGF0IGRldGVybWluZWQgaWYgYSBjbGFzcyBpcyBhYnN0cmFjdAogICAgICAgICAgICBhbmQgY2FuIGJlIGluc3RhbnRpYXRlZC4gICAgSWYgeW91IGhhZCBjbGFzc2VzIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAgIHN0cnVjdCBBIHsKICAgICAgICAgICAgICAgICAgICAgdmlydHVhbCBpbnQgZm9vKGludCkgPSAwOwogICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICBzdHJ1Y3QgQiA6IHZpcnR1YWwgQSB7CiAgICAgICAgICAgICAgICAgICAgIHZpcnR1YWwgaW50IGZvbyhpbnQpOwogICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICAgc3RydWN0IEMgOiB2aXJ0dWFsIEEgeyAKICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgIC8qIE5vdGUgb3JkZXIgb2YgYmFzZSBjbGFzc2VzICovCQogICAgICAgICAgICAgICAgICBzdHJ1Y3QgRCA6IEIsIEMgeyB9OyAgICAvKiBPayAqLwogICAgICAgICAgICAgICAgICBzdHJ1Y3QgRSA6IEMsIEIgeyB9OyAgICAvKiBCcm9rZW4gKi8KCiAgICAgICAgICAgIHRoZW4gU1dJRyBkZXRlcm1pbmVkIHRoYXQgaXQgY291bGQgaW5zdGFudGlhdGUgRCgpLCBidXQgbm90IEUoKS4KICAgICAgICAgICAgVGhpcyBpbmNvbnNpc3RlbmN5IGFyb3NlIGZyb20gdGhlIGRlcHRoLWZpcnN0IHNlYXJjaCBvZiB0aGUgCiAgICAgICAgICAgIGluaGVyaXRhbmNlIGhpZXJhcmNoeSB0byBsb2NhdGUgdGhlIGltcGxlbWVudGF0aW9ucyBvZiB2aXJ0dWFsCiAgICAgICAgICAgIG1ldGhvZHMuICAgVGhpcyBwcm9ibGVtIHNob3VsZCBub3cgYmUgZml4ZWQtLS1TV0lHIHdpbGwgYXR0ZW1wdAogICAgICAgICAgICB0byBsb2NhdGUgYW55IHZhbGlkIGltcGxlbWVudGF0aW9uIG9mIGEgdmlydHVhbCBtZXRob2QgYnkKICAgICAgICAgICAgdHJhdmVyc2luZyBvdmVyIHRoZSBlbnRpcmUgaGllcmFyY2h5LgoKMDIvMjIvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBGaXggZm9yIHVzaW5nIGVudW0gdHlwZW1hcHMuIFRoZSBKYXZhIGZpbmFsIHN0YXRpYyB2YXJpYWJsZSB0eXBlCiAgICAgICAgICAgIGNhbiBiZSBzZXQgdXNpbmcgdGhlIGpzdHlwZSB0eXBlbWFwLCBlbmFibGluZyBlbnVtcyB0byBiZSBtYXBwZWQgdG8gCiAgICAgICAgICAgIHNvbWV0aGluZyBvdGhlciB0aGFuIGludC4gQnVnIHJlcG9ydGVkIGJ5IEhlaW5lciBQZXRpdGguCgowMi8yMS8yMDAzOiBzb25neWFuZiAoVGlnZXIpCiAgICAgICAgICAgIEFkZGVkIENTaGFycCAoQyMpIG1vZHVsZSBwcm90b3R5cGUKICAgICAgICAgICAgaS5lLiBjc2hhcnAuY3h4ICYgY3NoYXJwLmggYXQgU291cmNlL01vZHVsZXMvLgogICAgICAgICAgICBUaGV5IGFyZSBmb3IgdGVzdCB1c2FnZSBvbmx5IG5vdyBhbmQgbmVlZCBpbXByb3ZlbWVudC4KICAgICAgICAgICAgVGhlIGludGVyZmFjZSBhbHNvIG5lZWQgdG8gYmUgbW9kaWZpZWQuCgogICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCiAgICAgICAgCjAyLzIwLzIwMDM6IHNvbmd5YW5mIChUaWdlcikKICAgICAgICAgICAgRml4ZWQgcHJvYmxlbSB3aXRoIHR5cGVkZWYgd2l0aCAtZnZpcnR1YWwuCiAgICAgICAgICAgIFNpbWlsYXIgYXMgYmVhemxleSdzIG1vZGlmaWNhdGlvbiB0b2RheS4KCjAyLzIwLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgQWRkZWQgc3VwcG9ydCBmb3IgZ2NjLXN0eWxlIHZhcmlhZGljIHByZXByb2Nlc3NvciBtYWNyb3MuICAKICAgICAgICAgICAgUGF0Y2ggWyA2MjMyNTggXSBHQ0Mtc3R5bGUgdmFyYXJnIG1hY3JvIHN1cHBvcnQuCiAgICAgICAgICAgIENvbnRyaWJ1dGVkIGJ5IEpvZSBNYXNvbi4KCjAyLzIwLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA2MDUxNjIgXSBUeXBlbWFwIGxvY2FsIHZhcmlhYmxlcy4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgTHlsZSBKb2huc29uLgoKMDIvMjAvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBwcm9ibGVtIHdpdGggYWJzdHJhY3QgY2xhc3NlcyBhbmQgdHlwZWRlZi4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgZm9vKGludCB4KSA9IDA7CiAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICB0eXBlZGVmIGludCBJbnRlZ2VyOwogICAgICAgICAgICAgICBjbGFzcyBCYXIgOiBwdWJsaWMgRm9vIHsKICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgZm9vKEludGVnZXIgeCk7CiAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBTV0lHIHdhcyBnZXR0aW5nIGNvbmZ1c2VkIGFib3V0IHRoZSBsYXR0ZXIgbWV0aG9kLS0tbWFraW5nIEJhcgogICAgICAgICAgICBhYnN0cmFjdC4gIFJlcG9ydGVkIGJ5IE1hcmNlbG8gTWF0dXMuCgowMi8xOS8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdICVqYXZhY29uc3QoZmxhZykgY2FuIGFsc28gYmUgdXNlZCBvbiBlbnVtcyBhcyB3ZWxsIGFzIGNvbnN0YW50cy4KICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGVuYWJsZXMgdHJ1ZSBKYXZhIGNvbXBpbGVyIGNvbnN0YW50cyBzbyB0aGF0IHRoZXkgY2FuIGJlIAogICAgICAgICAgICB1c2VkIGluIEphdmEgc3dpdGNoIHN0YXRlbWVudHMuIFRoYW5rcyB0byBIZWluZXIgUGV0aXRoIGZvciBwYXRjaGVzLgoKMDIvMTkvMjAwMzogc29uZ3lhbmYgKFRpZ2VyKQogICAgICAgICAgICBNb2RpZmllZCAtZmNvbXBhY3QgZmVhdHVyZSB0byBkZWFsIHdpdGggUFAgbGluZXMKCjAyLzE4LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA2ODkwNDAgXSBNaXNzaW5nIHJldHVybiB2YWx1ZSBpbiBzdGRfdmVjdG9yLmkuCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IFJvYmVydCBILiBkZSBWcmllcy4KCjAyLzE4LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYSBmZXcgZXZpbCBzY29waW5nIHByb2JsZW1zIHdpdGggdGVtcGxhdGVzLCBuYW1lc3BhY2VzLCBhbmQgdGhlCiAgICAgICAgICAgICVleHRlbmQgZGlyZWN0aXZlLiAgUHJvYmxlbSByZXBvcnRlZCBieSBMdWlnaSBCYWxsYWJpby4KCgowMi8xOC8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW1J1YnldIEltcHJvdmVkIHN1cHBvcnQgZm9yIFZpc3VhbCBDKysgYW5kIG90aGVyIG5hdGl2ZSBXaW5kb3dzIGNvbXBpbGVycy4gCiAgICAgICAgICAgIEl0IGlzIG5vIGxvbmdlciBuZWNlc3NhcnkgdG8gc3BlY2lmeSAiL0VYUE9SVDpJbml0Xzxtb2R1bGU+Iiwgd2hlcmUgPG1vZHVsZT4gaXMgdGhlCiAgICAgICAgICAgIHN3aWcgbW9kdWxlIG5hbWUgd2hlbiBsaW5raW5nIHVzaW5nIHRoZXNlIG5hdGl2ZSBXaW5kb3dzIGNvbXBpbGVycy4KCjAyLzE1LzIwMDM6IHNvbmd5YW5mIChUaWdlcikKICAgICAgICAgICAgQWRkZWQgLWZ2aXJ0dWFsIG9wdGlvbi4KICAgICAgICAgICAgUmVkdWNlIHRoZSBsaW5lcyBhbmQgc2l6ZSBvZiB0aGUgd3JhcHBlciBmaWxlCiAgICAgICAgICAgIGJ5IG9taXR0aW5nIHJlZGlmaW5lZCB2aXJ0dWFsIGZ1bmN0aW9uIGluIGNoaWxkcmVuIGNsYXNzZXMuCgogICAgICAgICAgICBNb2RpZmllZCAtY29tcGFjdCBvcHRpb24gdG8gLWZjb21wYWN0IG9wdGlvbgoKICAgICAgICAgICAgQWRkZWQgLXNtYWxsIG9wdGlvbi4KICAgICAgICAgICAgLXNtYWxsID0gLWZ2aXJ0dWFsIC1mY29tcGFjdAogICAgICAgICAgICBBbmQgaXQgY2FuIGJlIGV4dGVuZGVkIGJ5IGZ1dHVyZSBmZWF0dXJlIG9wdGlvbnMsCiAgICAgICAgICAgIHdoaWNoIGFyZSB1c2VkIHRvIHJlZHVjZSB3cmFwcGVyIGZpbGUgc3ppZS4KCiAgICAgICAgICAgIEFkZGVkIFNXSUdfRkVBVFVSRVMgZW52aXJvbm1lbnQgdmFyaWFibGUgY2hlY2suCiAgICAgICAgICAgIFRvIGR5bmFtaWNhbGx5IHNldCB0aGUgZmVhdHVyZSBvcHRpb25zIHN1Y2ggYXMgLWZjb21wYWN0ICYgLWZ2aXJ0dWFsCiAgICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjAyLzEzLzIwMDM6IGxlbnoKICAgICAgICAgICAgVXBkYXRlZCBEb2MvTWFudWFsL1Blcmw1Lmh0bWwgdG8gdGFsayBhYm91dCBDKysgY29tcGlsZSBwcm9ibGVtcwogICAgICAgICAgICBjb25maWd1cmUuaW4gbm93IGNoZWNrcyBmb3IgUEVSTDVfQ0NGTEFHUwogICAgICAgICAgICBSdW50aW1lL01ha2VmaWxlLmluIGFuZCBFeGFtcGxlL01ha2VmaWxlLmluIG5vdyB1c2UgUEVSTDVfQ0NGTEFHUwogICAgICAgICAgICBBZGRlZCBMaWIvcGVybDUvbm9lbWJlZC5oIHdoaWNoIGNvbnRhaW5zIGFsbCB0aGUga25vd24gbWFjcm8gY29uZmxpY3RzCgowMi8xMi8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNjg1NDEwIF0gQysrIEV4cGxpY2l0IHRlbXBsYXRlIGluc3RhbnRpYXRpb24gY2F1c2VzIFNXSUcgdG8gZXhpdC4KICAgICAgICAgICAgRml4ZXMgYSBzeW50YXggZXJyb3Igd2l0aCBkZWNsYXJhdGlvbnMgc2ltaWxhciB0byB0aGlzOgoKICAgICAgICAgICAgICAgICB0ZW1wbGF0ZSBjbGFzcyBzdGQ6OnZlY3RvcjxpbnQ+OwoKICAgICAgICAgICAgU1dJRyBub3cgaWdub3JlcyB0aGUgaW5zdGFudGlhdGlvbiBhbmQgZ2VuZXJhdGVzIGEgd2FybmluZyBtZXNzYWdlLgogICAgICAgICAgICBXZSBtaWdodCBkbyBtb3JlIGxhdGVyLiAgUmVwb3J0ZWQgYnkgVGhvbWFzIFdpbGxpYW1zb24uCgowMi8xMS8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgUmV3cm90ZSBib29sIHR5cGVtYXBzIHRvIHJlbW92ZSBwZXJmb3JtYW5jZSB3YXJuaW5nIGZvciBjb21waWxpbmcgZ2VuZXJhdGVkIGNvZGUKICAgICAgICAgICAgdW5kZXIgVmlzdWFsIEMrKy4KCjAyLzExLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBGaXggZm9yIHdyYXBwaW5nIHJlZmVyZW5jZSB2YXJpYWJsZXMgKGNvbnN0IG5vbi1wcmltaXRpdmUgYW5kIGFsbCBub24tY29uc3QgdHlwZXMpIAogICAgICAgICAgICBmb3IgZXhhbXBsZToKICAgICAgICAgICAgICBpbnQmIGk7CiAgICAgICAgICAgICAgQ2xhc3MmIGM7CiAgICAgICAgICAgICAgY29uc3QgQ2xhc3MmIGM7CgowMi8xMS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIG1vcmUgdmVyeSBzdWJ0bGUgcHJlcHJvY2Vzc29yIGNvcm5lciBjYXNlcyByZWxhdGVkIHRvIHJlY3Vyc2l2ZQogICAgICAgICAgICBtYWNybyBleHBhbnNpb24uICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgICAjZGVmaW5lIGNhdCh4LHkpIHggIyMgeQoKICAgICAgICAgICAgICAgICAgIGNhdChjYXQoMSwyKSwzKSAgICAvLyBQcm9kdWNlczogY2F0KDEsMikzCiAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICNkZWZpbmUgeGNhdCh4LHkpIGNhdCh4LHkpCgogICAgICAgICAgICAgICAgICAgeGNhdCh4Y2F0KDEsMiksMykgIC8vIFByb2R1Y2VzIDEyMwoKICAgICAgICAgICAgU2VlIEsmUiwgMm5kIEVkLiBwLiAyMzEuCgowMi8xMC8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgRml4ZWQgWyA2ODM4ODIgXSAtIHBhdGNoIHN1Ym1pdHRlZCBieSBGLiBQb3N0bWEgZm9yIFNXSUcgdG8gY29tcGlsZSBvbiBIUC1VWC4KCjAyLzEwLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgc3VidGxlIHByZXByb2Nlc3NvciBhcmd1bWVudCBleHBhbnNpb24gYnVnLiBSZXBvcnRlZCBieSBNYXJjZWxvIE1hdHVzLgoKMDIvMTAvMjAwMzogc29uZ3lhbmYKICAgICAgICAgICAgQWRkZWQgLWNvbXBhY3Qgb3B0aW9uLgogICAgICAgICAgICBSZWR1Y2UgdGhlIGxpbmVzIGFuZCBzaXplIG9mIHRoZSB3cmFwcGVyIGZpbGUKICAgICAgICAgICAgYnkgb21pdHRpbmcgY29tbWVudHMgYW5kIGNvbWJpbmluZyBzaG9ydCBsaW5lcy4KICAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgogCjAyLzA3LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA2NTEzNTUgXSBTeW50YXggZXJyb3Igd2l0aCBjc3RyaW5nLmkKICAgICAgICAgICAgUmVwb3J0ZWQgYnkgT21yaSBCYXJlbC4KCjAyLzA3LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA2NjM2MzIgXSBpbmNvbXBhdGliaWxpdHkgd2l0aCBzdGFuZGFyZCBjcHAuCiAgICAgICAgICAgIFRoaXMgaXMgYSByZWZpbmVtZW50IHRoYXQgZml4ZXMgdGhpcyBwcm9ibGVtOgoKICAgICAgICAgICAgICAgICAvLyBTb21lIG1hY3JvIHdpdGggYW4gYXJndW1lbnQKICAgICAgICAgICAgICAgICAjZGVmaW5lIEZPTyh4KSAgICAgICB4CgogICAgICAgICAgICAgICAgIGludCBGT087ICAgICAgICAvKiBOb3QgYSBtYWNyby0tLW5vIGFyZ3VtZW50cyAqLwogCjAyLzA1LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA2NzU0OTEgXSBwYXJzZSBlcnJvciB3aXRoIGdsb2JhbCBuYW1lc3BhY2UgcXVhbGlmaWNhdGlvbi4KICAgICAgICAgICAgU3VibWl0dGVkIGJ5IEplcmVteSBZYWxsb3AuCgowMi8wNC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGJ1ZyBpbiB2YXJhcmdzIHByb2Nlc3NpbmcgaW50cm9kdWNlZCBieSB0aGUgbnVtaW5wdXRzIHR5cGVtYXAgcGFyYW1ldGVyLgoKMDEvMDgvMjAwMzogdHRuCgkgICAgW3htbF0gRml4IHN0cmluZy1yZXBsYWNlbWVudCBvcmRlcmluZyBidWdsZXQuCgkgICAgVGhhbmtzIHRvIEdhcnkgSGVycm9uLgoKMTIvMjMvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIEZ1cnRoZXIgYnVpbGQgY2hhbmdlczoKICAgICAgICAgICAgLSBUaGUgU1dJRyBleGVjdXRhYmxlIGlzIG5vdyBidWlsdCB1c2luZyBhIHNpbmdsZSBNYWtlZmlsZS4KICAgICAgICAgICAgLSBUaGlzIG1ha2VmaWxlIGlzIGdlbmVyYXRlZCBieSBBdXRvbWFrZSAoU291cmNlL01ha2VmaWxlLmFtKS4KICAgICAgICAgICAgLSBEZXBlbmRlbmN5IHRyYWNraW5nIGFuZCB0YWdzIHN1cHBvcnQgYXJlIGluIHRoaXMgbWFrZWZpbGUuCiAgICAgICAgICAgIC0gQXV0b21ha2UgMS43LjIgYW5kIEF1dG9jb25mIDIuNTQgbWluaW11bSB2ZXJzaW9ucyBhcmUgbmVlZGVkIHRvIGJ1aWxkIFNXSUcgZnJvbSBDVlMuCiAgICAgICAgICAgIC0gUnVubmluZyAuL2F1dG9nZW4uc2ggbm93IGluc3RhbGxzIEF1dG9jb25mL0F1dG9tYWtlIHN1cHBvcnQgZmlsZXMgaW50bwogICAgICAgICAgICAgIFRvb2xzL2NvbmZpZyBhbmQgdGhlc2UgZmlsZXMgYXJlIG5vIGxvbmdlciBzdG9yZWQgaW4gQ1ZTLgogICAgICAgICAgICAtIEJ1ZyBmaXhlcyBpbiAnbWFrZSBpbnN0YWxsJyBmb3Igc3lzdGVtcyB1c2luZyAuZXhlIGV4ZWN1dGFibGUgZXh0ZW5zaW9uIGFuZAogICAgICAgICAgICAgIC4vY29uZmlndXJlIC0td2l0aC1yZWxlYXNlLXN1ZmZpeD13aGF0ZXZlcgoKMTIvMTYvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIE1vcmUgYnVpbGQgY2hhbmdlczoKICAgICAgICAgICAgLSBBdXRvY29uZidzIEFDX0NBTk9OSUNBTF9IT1NUIHJlcGxhY2VzIHByb3ByaWV0YXJ5IGFwcHJvYWNoIGZvciBkZXRlY3RpbmcgYnVpbGQgaG9zdC4KICAgICAgICAgICAgLSBBdXRvY29uZiBzdXBwb3J0IGZpbGVzIG1vdmVkIHRvIFRvb2xzL2NvbmZpZy4KCjEyLzE2LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBNb2RpZmljYXRpb25zIHRvIHJ1biBvbiBNYWNPUywgc3VibWl0dGVkIGJ5IEJlcm5hcmQgRGVzZ3JhdXBlcy4KICAgICAgICAgICAgTWFpbmx5IGVuc3VyaW5nIGdlbmVyYXRlZCBmaWxlcyBhcmUgb3V0cHV0IGluIHRoZSBhcHByb3ByaWF0ZSBkaXJlY3RvcnkgZm9yCiAgICAgICAgICAgIHNvbWUgbW9kdWxlcy4KCjEyLzExLzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBWYXJpb3VzIGJ1aWxkIG1vZGlmaWNhdGlvbnMgYW5kIGJ1ZyBmaXhlczoKICAgICAgICAgICAgLSBTaW1wbGlmaWNhdGlvbiBvZiB2ZXJzaW9uIHN0cmluZy4gVXNlIGF1dG9jb25mJ3MgUEFDS0FHRV9WRVJTSU9OIGluc3RlYWQuCiAgICAgICAgICAgIC0gQnVpbGQgdGltZSByZW1vdmVkIGZyb20gU1dJRyB2ZXJzaW9uLgogICAgICAgICAgICAtIFVzaW5nIHN0YW5kYXJkIGF1dG9jb25mIGNvbmZpZyBoZWFkZXIgZ2VuZXJhdGlvbi4KICAgICAgICAgICAgLSBVcGRhdGVkIG9sZCBhdXRvY29uZiBtYWNyb3MgYXMgcmVwb3J0ZWQgYnkgYXV0b3VwZGF0ZS4KICAgICAgICAgICAgLSBSZW1vdmVkICRwcmVmaXggaW4gYXV0b2NvbmYgZnJvbSBzZWFyY2ggcGF0aHMgYXMgYXV0b2NvbmYgd29uJ3QgZXhwYW5kIHRoZW0uCiAgICAgICAgICAgIC0gU3VidGxlIGJ1ZyBmaXggd2hlcmUgJ21ha2UgcHJlZml4PS9zb21ld2hlcmU7IG1ha2UgY2xlYW47IG1ha2UgcHJlZml4PS9zb213aGVyZS9lbHNlJwogICAgICAgICAgICAgIHByb2R1Y2VkIGFuIGV4ZWN1dGFibGUgdXNpbmcgdGhlIGluY29ycmVjdCBsaWJyYXJ5IGRpcmVjdG9yaWVzLgogICAgICAgICAgICAtIEFkZGVkIC1sZGZsYWdzIGNvbW1hbmRsaW5lIG9wdGlvbiBmb3IgTXpTY2hlbWUsIE9jYW1sLCBQaWtlIGFuZCBQSFAuCiAgICAgICAgICAgIC0gRml4ZWQgcmVwb3J0aW5nIG9mIGNvbXBpbGVyIHVzZWQgd2hlbiB1c2luZyAtdmVyc2lvbiBjb21tYW5kbGluZSBvcHRpb24uCiAgICAgICAgICAgIC0gU1dJRyB3ZWIgYWRkcmVzcyBhZGRlZCB0byAtdmVyc2lvbiBjb21tYW5kbGluZSBvcHRpb24uCgoxMi8xMS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE1pbm9yIGZpeCB0byBUY2wgZHluYW1pYyBjYXN0IHR5cGVtYXBzLiBSZXBvcnRlZCBieQogICAgICAgICAgICBLcmlzdG9waGVyIEJsb20uCgoxMi8xMC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHN1YnRsZSB0ZW1wbGF0ZSBhcmd1bWVudCByZXBsYWNlIGJ1Zy4gIFJlcG9ydGVkIGJ5CiAgICAgICAgICAgIENocmlzIEZsYXRsZXkuCgoxMi8xMC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFJldmVydGVkIENIQU5HRVMgMDkvMDMvMjAwMiwgcHJlcHJvY2Vzc29yIGFyZ3VtZW50IGV2YWx1YXRpb24uICBBcmd1bWVudHMKICAgICAgICAgICAgYXJlIG5vdCBldmFsdWF0ZWQgZHVyaW5nIGNvbGxlY3Rpb24sIEsmUiwgcC4gMjMwLgoKMTIvMDYvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDY0OTAyMiBdIENvbXBpbGF0aW9uIHByb2JsZW1zIHdpdGggS0FJL0tDQwoKMTIvMDIvMjAwMjogYmVhemxleQogICAgICAgICAgICBTV0lHICdyZWwtMS0zJyBDVlMgYnJhbmNoIG1lcmdlZCBiYWNrIGludG8gdGhlIG1haW4gYnJhbmNoLgoKClZlcnNpb24gMS4zLjE3IChOb3ZlbWJlciAyMiwgMjAwMikKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMTEvMTkvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDYxMzkyMiBdIHByZXByb2Nlc3NvciBlcnJvcnMgd2l0aCBIQVZFX0xPTkdfTE9ORy4KICAgICAgICAgICAgCjExLzE5LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA2MTU0ODAgXSBtenNjaGVtZSBTV0lHX011c3RHZXRQdHJfLgoKMTEvMTkvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDYzNTExOSBdIFNXSUdfY3JvYWsgY2F1c2VzIGNvbXBpbGVyIHdhcm5pbmcuCgoxMS8xNi8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEFkZGVkIHR5cGVtYXBzIGZvciBwb2ludGVycyB0byBjbGFzcyBtZW1iZXJzLgoKMTEvMTUvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBCdWcgZml4OiBPdmVybG9hZGVkIEMrKyBmdW5jdGlvbnMgd2hpY2ggY2Fubm90IGJlIG92ZXJsb2FkZWQgaW4gSmF2YSAKICAgICAgICAgICAgb25jZSBhZ2FpbiBpc3N1ZSBhIHdhcm5pbmcuCgoxMS8xNC8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEhhbmRsaW5nIG9mIE5VTEwgcG9pbnRlcnMgaXMgaW1wcm92ZWQuIEEgamF2YSBudWxsIG9iamVjdCB3aWxsIG5vdwogICAgICAgICAgICBiZSB0cmFuc2xhdGVkIHRvIGFuZCBmcm9tIGEgTlVMTCBDL0MrKyBwb2ludGVyIGJ5IGRlZmF1bHQuIFByZXZpb3VzbHkgd2hlbiAKICAgICAgICAgICAgd3JhcHBpbmc6CgogICAgICAgICAgICAgICAgY2xhc3MgU29tZUNsYXNzIHsuLi59OwogICAgICAgICAgICAgICAgdm9pZCBmb28oU29tZUNsYXNzICpzKTsKCiAgICAgICAgICAgIGFuZCBpdCB3YXMgY2FsbGVkIGZyb20gSmF2YSB3aXRoIG51bGw6CgogICAgICAgICAgICAgICAgbW9kdWxlbmFtZS5mb28obnVsbCkKCiAgICAgICAgICAgIGEgSmF2YSBOdWxsUG9pbnRlckV4Y2VwdGlvbiB3YXMgdGhyb3duLiBFeHRyYSB0eXBlbWFwcyBoYWQgdG8gYmUgd3JpdHRlbiBpbgogICAgICAgICAgICBvcmRlciB0byBvYnRhaW4gYSBOVUxMIHBvaW50ZXIgdG8gcGFzcyB0byBmdW5jdGlvbnMgbGlrZSB0aGlzIG9uZS4gTm93IHRoZSAKICAgICAgICAgICAgZGVmYXVsdCB3cmFwcGluZyB3aWxsIGRldGVjdCAnbnVsbCcgYW5kIHRyYW5zbGF0ZSBpdCBpbnRvIGEgTlVMTCBwb2ludGVyLgogICAgICAgICAgICBBbHNvIGlmIGEgZnVuY3Rpb24gcmV0dXJucyBhIE5VTEwgcG9pbnRlciwgZWc6CiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgU29tZUNsYXNzICpiYXIoKSB7IHJldHVybiBOVUxMOyB9CiAgICAgICAgICAgIAogICAgICAgICAgICBUaGVuIHRoaXMgdXNlZCB0byBiZSB3cmFwcGVkIHdpdGggYSBTb21lQ2xhc3MgcHJveHkgY2xhc3MgaG9sZGluZyBhIE5VTEwKICAgICAgICAgICAgcG9pbnRlci4gTm93IG51bGwgaXMgcmV0dXJuZWQgaW5zdGVhZC4gVGhlc2UgY2hhbmdlcyBhcmUgc3VidGxlIGJ1dCB1c2VmdWwuCiAgICAgICAgICAgIFRoZSBvcmlnaW5hbCBiZWhhdmlvdXIgY2FuIGJlIG9idGFpbmVkIGJ5IHVzaW5nIHRoZSBvcmlnaW5hbCB0eXBlbWFwczoKCiAgICAgICAgICAgICAgICAldHlwZW1hcChqYXZhb3V0KSBTV0lHVFlQRSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyAkJmphdmFjbGFzc25hbWUoJGpuaWNhbGwsIHRydWUpOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAldHlwZW1hcChqYXZhb3V0KSBTV0lHVFlQRSAqLCBTV0lHVFlQRSAmLCBTV0lHVFlQRSBbXSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyAkamF2YWNsYXNzbmFtZSgkam5pY2FsbCwgJG93bmVyKTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJXR5cGVtYXAoamF2YWdldGNwdHIpIFNXSUdUWVBFLCBTV0lHVFlQRSAqLCBTV0lHVFlQRSAmLCBTV0lHVFlQRSBbXSAlewogICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgc3RhdGljIGxvbmcgZ2V0Q1B0cigkamF2YWNsYXNzbmFtZSBvYmopIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2JqLnN3aWdDUHRyOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAlfQoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEpBVkEgTU9EVUxFICoqKgoKCjExLzEyLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgcHJvYmxlbSB3aXRoIGFic3RyYWN0IG1ldGhvZHMgYW5kIHNpZ25hdHVyZXMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgIGNsYXNzIGFic3RyYWN0X2ZvbyB7IAogICAgICAgICAgICBwdWJsaWM6IAogICAgICAgICAgICAgICAgdmlydHVhbCBpbnQgICBtZXRoKGludCBtZXRoX3BhcmFtKSA9IDA7IAogICAgICAgICAgICB9OyAKIAogCiAgICAgICAgICAgIGNsYXNzIGFic3RyYWN0X2JhciA6IHB1YmxpYyBhYnN0cmFjdF9mb28geyAKICAgICAgICAgICAgcHVibGljOiAKICAgICAgICAgICAgICAgIGludCBtZXRoKGludCBtZXRoX3BhcmFtXzEsIGludCBtZXRoX3BhcmFtXzIpIHsgcmV0dXJuIDA7IH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIEluIHRoaXMgY2FzZSwgYWJzdHJhY3RfYmFyIGlzIHN0aWxsIGFic3RyYWN0LgoKICAgICAgICAgICAgRml4ZXMgWyA2Mjg0MzggXSBEZXJpdmVkIGFic3RyYWN0IGNsYXNzIG5vdCBhYnN0cmFjdC4KICAgICAgICAgICAgUmVwb3J0ZWQgYW5kIHBhdGNoZWQgYnkgU2NvdHQgTWljaGVsLgoKMTEvMTEvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBhIG1hdGNoaW5nIHByb2JsZW0gd2l0aCB0eXBlbWFwcyBhbmQgYXJyYXkgZGltZW5zaW9ucy4gIEZvciBleGFtcGxlLCBpZiB5b3UKICAgICAgICAgICAgaGFkIHRoaXM6CgogICAgICAgICAgICAgICB0eXBlZGVmIGNoYXIgYmxhaFsyMF07CgogICAgICAgICAgICBhbmQgYSB0eXBlbWFwOgoKICAgICAgICAgICAgICAgJXR5cGVtYXAoKSBjaGFyIFtBTlldIHsKICAgICAgICAgICAgICAgICAgIC4uLiAkMV9kaW0wIC4uLgogICAgICAgICAgICAgICB9CgogICAgICAgICAgICB0aGVuICQxX2RpbSogdmFyaWFibGVzIHdlcmVuJ3QgYmUgZXhwYW5kZWQgcHJvcGVybHkuICBJdCBzaG91bGQgd29yayBub3cuCiAgICAgICAgICAgIFByb2JsZW0gcmVwb3J0ZWQgYnkgUGFua2FqIEt1bWFyIEdvZWwuCiAgICAgICAgICAgICAgIAoxMS8wNy8yMDAyOiBta29lcHBlCgkgICAgQWRkZWQgYW4gZXhwZXJpbWVudGFsIG5ldyBtb2R1bGUgdGhhdCBkdW1wcyBTV0lHJ3MgcGFyc2UKCSAgICB0cmVlIGFzIChDb21tb24pIExpc3Agcy1leHByZXNzaW9ucy4gIFRoZSBtb2R1bGUgaXMKCSAgICBpbnZva2VkIHdpdGggU1dJRydzIC1zZXhwIGNvbW1hbmQtbGluZSBzd2l0Y2guICBUaGUgb3V0cHV0CgkgICAgY2FuIGJlIHJlYWQgaW50byBDb21tb24gTGlzcC4gIFRoZXJlIGlzIChwcm90b3R5cGUpCgkgICAgZXhhbXBsZSBMaXNwIGNvZGUgdGhhdCBnZW5lcmF0ZXMgRm9yZWlnbiBGdW5jdGlvbiBJbnRlcmZhY2UKCSAgICBkZWZpbml0aW9ucyBmb3IgdXNlIHdpdGggS2V2aW4gUm9zZW5iZXJnJ3MgVUZGSS4KCgkgICAgKioqIEVYUEVSSU1FTlRBTCBORVcgRkVBVFVSRSAqKioKCjExLzA3LzIwMDI6IG1rb2VwcGUKCSAgICBSZW1vdmVkIGR1cGxpY2F0ZSBkZWNsYXJhdGlvbiBvZiAiY3BwX3RlbXBsYXRlX2RlY2wiIGluCgkgICAgcGFyc2VyLnk7IGJpc29uIDEuNzUgY29tcGxhaW5lZC4KCjExLzA2LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gRGVmYXVsdCBwcmltaXRpdmUgYXJyYXkgaGFuZGxpbmcgaGFzIGNoYW5nZWQgbGlrZSBhcnJheXMgb2YgY2xhc3Nlcy4gCiAgICAgICAgICAgIEMgcHJpbWl0aXZlIGFycmF5cyBhcmUgbm8gbG9uZ2VyIHdyYXBwZWQgYnkgYSBKYXZhIGFycmF5IGJ1dCB3aXRoIGEgcG9pbnRlciAKICAgICAgICAgICAgKHR5cGUgd3JhcHBlciBjbGFzcykuIEFnYWluIHRoZSBjaGFuZ2VzIGhhdmUgYmVlbiBtYWRlIGZvciBlZmZpY2llbmN5IHJlYXNvbnMuIAogICAgICAgICAgICBUaGUgb3JpZ2luYWwgdHlwZW1hcHMgaGF2ZSBiZWVuIG1vdmVkIGludG8gYXJyYXlzX2phdmEuaSwgc28gdGhlIG9yaWdpbmFsIAogICAgICAgICAgICBiZWhhdmlvdXIgY2FuIGJlIG9idGFpbmVkIG1lcmVseSBpbmNsdWRpbmcgdGhpcyBmaWxlOgoKICAgICAgICAgICAgICAgICVpbmNsdWRlICJhcnJheXNfamF2YS5pIgoKICAgICAgICAgICAgVGhlIGFycmF5IHN1cHBvcnQgZnVuY3Rpb25zIGFyZSBubyBsb25nZXIgZ2VuZXJhdGVkIGJ5IGRlZmF1bHQuIFRoZXkgYXJlIG9ubHkKICAgICAgICAgICAgZ2VuZXJhdGVkIHdoZW4gaW5jbHVkaW5nIHRoaXMgZmlsZSwgdGh1cyB0aGlzIG9mdGVuIHVudXNlZCBjb2RlIGlzIG9ubHkKICAgICAgICAgICAgZ2VuZXJhdGVkIHdoZW4gc3BlY2lmaWNhbGx5IHJlcXVpcmluZyB0aGlzIHR5cGUgb2YgYXJyYXkgc3VwcG9ydC4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBKQVZBIE1PRFVMRSAqKioKCjExLzA1LzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBBZGRlZCBzdXBwb3J0IGZvciBuZXN0ZWQgbW9kdWxlIGRlY2xhcmF0aW9ucyAoYXMgd2FzCiAgICAgICAgICAgIHByZXZpb3VzbHkgYWRkZWQgZm9yIHRoZSBQZXJsIG1vZHVsZSkuIFNvIGEgJW1vZHVsZSBkaXJlY3RpdmUKICAgICAgICAgICAgb2YgdGhlIGZvcm06CgogICAgICAgICAgICAgICAgJW1vZHVsZSAiT3V0ZXI6OklubmVyOjpGb28iCgogICAgICAgICAgICB3aWxsIG5lc3QgZXZlcnl0aGluZyBhcyAoaW4gUnVieSBjb2RlKToKCiAgICAgICAgICAgICAgICBtb2R1bGUgT3V0ZXIKICAgICAgICAgICAgICAgICAgbW9kdWxlIElubmVyCiAgICAgICAgICAgICAgICAgICAgbW9kdWxlIEZvbwogICAgICAgICAgICAgICAgICAgICAgIyBzdHVmZiBnb2VzIGhlcmUKICAgICAgICAgICAgICAgICAgICBlbmQKICAgICAgICAgICAgICAgICAgZW5kCiAgICAgICAgICAgICAgICBlbmQKIAoxMS8wNS8yMDAyOiBta29lcHBlIAoJICAgIFtNelNjaGVtZV0gQWRkIGFuIGFyZ3VtZW50ICgtZGVjbGFyZW1vZHVsZSkgdGhhdCBnZW5lcmF0ZXMKCSAgICBjb2RlIHRvIGNvcnJlY3RseSBkZWNsYXJlIGEgcHJpbWl0aXZlIG1vZHVsZSBleHRlbnNpb24uCgkgICAgUGF0Y2ggc3VibWl0dGVkIGJ5IEJydWNlIEJ1dHRlcmZpZWxkLgoKMTEvMDIvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBBZGRlZCBwYXRjaCBzdWJtaXR0ZWQgYnkgTWljaGFlbCBDYWhpbGwgdG8gcmVtb3ZlIHVudXNlZCBwYXJhbWV0ZXIKICAgICAgICAgICAgd2FybmluZ3MgZm9yIHRoZSBqZW52IGFuZCBjbHMgcGFyYW1ldGVycy4gVGhpcyBwYXRjaCBhbHNvIGFsc28gYWxsb3dzIG9uZQogICAgICAgICAgICB0byB1c2UgInZvaWQiIGluIHRoZSBqbmkgdHlwZW1hcCBmb3IgYW55IHR5cGUgd2l0aG91dCBjb2RlIGJlaW5nIGdlbmVyYXRlZAogICAgICAgICAgICBhdHRlbXB0aW5nIHRvIHJldHVybiBhIHZhbHVlLgoKMTAvMjkvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBBcnJheSBoYW5kbGluZyBpcyBkaWZmZXJlbnQuIEFycmF5cyBvZiBjbGFzc2VzIGFyZSBubyBsb25nZXIgd3JhcHBlZAogICAgICAgICAgICB3aXRoIHByb3h5IGFycmF5cywgZWcgd3JhcHBpbmcKCiAgICAgICAgICAgICAgICBjbGFzcyBYIHsuLi59OwogICAgICAgICAgICAgICAgWCBmb29bMTBdOwogICAgICAgICAgICAKICAgICAgICAgICAgdXNlZCB0byBiZSB3cmFwcGVkIHdpdGggdGhlc2UgSmF2YSBnZXR0ZXJzIGFuZCBzZXR0ZXJzOgoKICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRGb28oWFtdIHZhbHVlKSB7Li4ufQogICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBYW10gZ2V0Rm9vKCkgey4uLn0KCiAgICAgICAgICAgIFRoaXMgYXBwcm9hY2ggaXMgdmVyeSBpbmVmZmljaWVudCBhcyB0aGUgZW50aXJlIGFycmF5IGlzIGNvcGllZCBudW1lcm91cwogICAgICAgICAgICB0aW1lcyBvbiBlYWNoIGludm9jYXRpb24gb2YgdGhlIGdldHRlciBvciBzZXR0ZXIuIFRoZXNlIGFycmF5cyBhcmUgbm93CiAgICAgICAgICAgIHdyYXBwZWQgd2l0aCBhIHBvaW50ZXIgc28gaXQgaXMgb25seSBwb3NzaWJsZSB0byBhY2Nlc3MgdGhlIGZpcnN0IGFycmF5IGVsZW1lbnQgCiAgICAgICAgICAgIHVzaW5nIGEgcHJveHkgY2xhc3M6CgogICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldEZvbyhYIHZhbHVlKSB7Li4ufQogICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBYIGdldEZvbygpIHsuLi59CgogICAgICAgICAgICBBcnJheXMgb2YgZW51bXMgaGF2ZSBhbHNvIGJlZW4gc2ltaWxhcmx5IGNoYW5nZWQuIFRoaXMgYmVoYXZpb3VyIGlzIG5vdyBsaWtlIHRoZSAKICAgICAgICAgICAgb3RoZXIgU1dJRyBsYW5ndWFnZSdzIGltcGxlbWVudGF0aW9uIGFuZCB0aGUgYXJyYXkgbGlicmFyeSBzaG91bGQgYmUgdXNlZCB0byAKICAgICAgICAgICAgYWNjZXNzIHRoZSBvdGhlciBlbGVtZW50cy4gVGhlIG9yaWdpbmFsIGJlaGF2aW91ciBjYW4gYmUgYWNoaWV2ZWQgdXNpbmcgdGhlIAogICAgICAgICAgICBtYWNyb3MgYW5kIHR5cGVtYXBzIGluIGFycmF5c19qYXZhLmksIGZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICVpbmNsdWRlICJhcnJheXNfamF2YS5pIgogICAgICAgICAgICAgICAgSkFWQV9BUlJBWVNPRkNMQVNTRVMoWCkKICAgICAgICAgICAgICAgIGNsYXNzIFggey4uLn07CiAgICAgICAgICAgICAgICBYIGZvb1sxMF07CgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgSkFWQSBNT0RVTEUgKioqCgoxMC8yOS8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIFR3byBuZXcgdHlwZW1hcHMgamF2YWluIGFuZCBqYXZhb3V0IGZvciBnZW5lcmF0aW5nIHRoZSBwcm94eSBjbGFzcyAKICAgICAgICAgICAgYW5kIHR5cGUgd3JhcHBlciBjbGFzcyBtZXRob2QgY2FsbHMgdG8gdGhlIEpOSSBjbGFzcy4gVGhlIG5ldyB0eXBlbWFwcyBhcmUgCiAgICAgICAgICAgIHJlYWxseSB1c2VkIGZvciB0cmFuc2Zvcm1pbmcgdGhlIGpzdHlwZSAodXNlZCBpbiBwcm94eSBjbGFzcyBhbmQgdHlwZSB3cmFwcGVyCiAgICAgICAgICAgIGNsYXNzZXMpIHRvIHRoZSBqdHlwZSAodXNlZCBpbiB0aGUgSk5JIGNsYXNzKSBhbmQgdmlzYSB2ZXJzYS4gQSBqYXZhaW4gdHlwZW1hcAogICAgICAgICAgICBpcyByZXF1aXJlZCB3aGVuZXZlciBhbiBpbiB0eXBlbWFwIGlzIHdyaXR0ZW4gYW5kIHNpbWlsYXJseSBqYXZhb3V0IGZvciBhbiBvdXQKICAgICAgICAgICAgdHlwZW1hcC4gQW4gZXhhbXBsZSBpcyBwcm9iYWJseSBiZXN0IHRvIHNob3cgdGhlbSB3b3JraW5nOgoKICAgICAgICAgICAgICAgICV0eXBlbWFwKGphdmFpbikgQ2xhc3MgIkNsYXNzLmdldENQdHIoJGphdmFpbnB1dCkiCiAgICAgICAgICAgICAgICAldHlwZW1hcChqYXZhaW4pIHVuc2lnbmVkIHNob3J0ICIkamF2YWlucHV0IgogICAgICAgICAgICAgICAgJXR5cGVtYXAoamF2YW91dCkgQ2xhc3MgKiB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDbGFzcygkam5pY2FsbCwgJG93bmVyKTsKICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICVpbmxpbmUgJXsKICAgICAgICAgICAgICAgICAgICBjbGFzcyBDbGFzcyB7fTsKICAgICAgICAgICAgICAgICAgICBDbGFzcyAqIGJhcihDbGFzcyBjbHMsIHVuc2lnbmVkIHNob3J0IHVzaCkgeyByZXR1cm4gbmV3IENsYXNzKCk7IH07CiAgICAgICAgICAgICAgICAlfQoKICAgICAgICAgICAgVGhlIGdlbmVyYXRlZCBwcm94eSBjb2RlIGlzIHRoZW46CgogICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBDbGFzcyBiYXIoQ2xhc3MgY2xzLCBpbnQgdXNoKSB7CiAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ2xhc3MoZXhhbXBsZUpOSS5iYXIoQ2xhc3MuZ2V0Q1B0cihjbHMpLCB1c2gpLCBmYWxzZSk7CiAgICAgICAgICAgICAgICB9CgoKICAgICAgICAgICAgU29tZSBuZXcgc3BlY2lhbCB2YXJpYWJsZXMgaGF2ZSBiZWVuIGludHJvZHVjZWQgaW4gb3JkZXIgdG8gdXNlIHRoZXNlIHR5cGVtYXBzLgogICAgICAgICAgICBIZXJlICRqYXZhaW5wdXQgaGFzIGJlZW4gcmVwbGFjZWQgYnkgJ2NscycgYW5kICd1c2gnLiAkam5pY2FsbCBoYXMgYmVlbiByZXBsYWNlZCBieSAKICAgICAgICAgICAgdGhlIG5hdGl2ZSBtZXRob2QgY2FsbCwgJ2V4YW1wbGVKTkkuYmFyKC4uLiknIGFuZCAkb3duZXIgaGFzIGJlZW4gcmVwbGFjZWQgYnkgJ2ZhbHNlJy4KICAgICAgICAgICAgJGphdmFpbnB1dCBpcyBhbmFsb2dvdXMgdG8gdGhlICRpbnB1dCBzcGVjaWFsIHZhcmlhYmxlLiBJdCBpcyByZXBsYWNlZCBieSB0aGUgcGFyYW1ldGVyIG5hbWUuCiAgICAgICAgICAgICRqbmljYWxsIGlzIGFuYWxvZ291cyB0byAkYWN0aW9uIGluICVleGNlcHRpb24uIEl0IGlzIHJlcGxhY2VkIGJ5IHRoZSBjYWxsIHRvIHRoZSBuYXRpdmUKICAgICAgICAgICAgbWV0aG9kIGluIHRoZSBKTkkgY2xhc3MuCiAgICAgICAgICAgICRvd25lciBpcyByZXBsYWNlZCBieSBlaXRoZXIgdHJ1ZSBpZiAlbmV3b2JqZWN0IGhhcyBiZWVuIHVzZWQgb3RoZXJ3aXNlIGZhbHNlLgoKICAgICAgICAgICAgVGhlIGphdmEuc3dnIGZpbGUgY29udGFpbnMgZGVmYXVsdCBqYXZhaW4gYW5kIGphdm91dCB0eXBlbWFwcyB3aGljaCB3aWxsIHByb2R1Y2UgdGhlIHNhbWUgY29kZQogICAgICAgICAgICBhcyBwcmV2aW91c2x5LiBUaGlzIGNoYW5nZSBpcyBvbmx5IG9mIGNvbmNlcm4gdG8gdGhvc2Ugd2hvIGhhdmUgd3JpdHRlbiB0aGVpciBvd24gdHlwZW1hcHMgYXMKICAgICAgICAgICAgeW91IHdpbGwgdGhlbiBtb3N0IGxpa2VseSBoYXZlIHRvIHdyaXRlIHlvdXIgb3duIGphdmFpbiBhbmQgamF2YW91dCB0eXBlbWFwcy4KCiAgICAgICAgICAgIFRoZSBqYXZhb3V0IHR5cGVtYXAgYWxzbyBtYWtlcyBpdCBwb3NzaWJsZSB0byB1c2UgYSBKYXZhIGRvd25jYXN0IHRvIGJlIHVzZWQgb24gYWJzdHJhY3QgCiAgICAgICAgICAgIHByb3h5IGJhc2UgY2xhc3Nlcy4gU2VlIHRoZSBKYXZhIGRvY3VtZW50YXRpb24gb24gZHluYW1pY19jYXN0LgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEpBVkEgTU9EVUxFICoqKgoKMTAvMjQvMjAwMjogdHRuCgkgICAgW01ldGhvZG9sb2d5XSBVcGdhZGVkIHRvIGxpYnRvb2wgMS40LjMsIHByZXN1bWFibHkgdy8gYmV0dGVyCgkgICAgc3VwcG9ydCBmb3IgbmV3aXNoIHBsYXRmb3JtcyAobGlrZSBNYWNPUyBYKS4KCjEwLzIxLzIwMDI6IHR0bgoJICAgIEZpeGVkIFJ1bnRpbWUvTWFrZWZpbGUuaW4gYnVnIC0tIHRoYW5rcyB0byBSaWNoYXJkIENhbG1iYWNoLgoKMTAvMTgvMjAwMjogdHRuCgkgICAgRml4ZWQgdHlwbyBpbiBkb2guaCAtLSB0aGFua3MgdG8gTWF4IEhvcm4uCgpWZXJzaW9uIDEuMy4xNiAoT2N0b2JlciAxNCwgMjAwMikKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoxMC8xMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGJ1ZyB3aXRoICVleHRlbmQgZGlyZWN0aXZlIGFuZCAlZmVhdHVyZSByZXBvcnRlZAogICAgICAgICAgICBieSBXaWxsaWFtIEZ1bHRvbi4KCjEwLzEzLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgQWRkZWQgT3BlblZNUyBidWlsZCBkaXJlY3RvcnkgKHZtcykuICBDb250cmlidXRlZCBieSAKICAgICAgICAgICAgSmVhbi1GcmFu529pcyBQaWVyb25uZS4KCjEwLzA5LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gQWRkZWQgdGhyb3dzIGNsYXVzZSB0byB0aGUgbmF0aXZlIGZ1bmN0aW9ucyBpbiB0aGUgSk5JIGNsYXNzLgogICAgICAgICAgICBUaGUgdGhyb3dzIGNsYXVzZSBpcyB0aGUgc2FtZSBhcyB0aGUgb25lIGdlbmVyYXRlZCBmb3IgcHJveHkgZnVuY3Rpb25zCiAgICAgICAgICAgIGFuZCBtb2R1bGUgY2xhc3MgZnVuY3Rpb25zLgoKMDkvMjcvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBzb21lIHByb2JsZW1zIHdpdGggdGhlICVpbXBvcnQgZGlyZWN0aXZlIGFuZCBjbGFzc2VzIHRoYXQKICAgICAgICAgICAgd2VyZSBkZWZpbmVkIGJ1dCBub3Qgd3JhcHBlZC4gIFByb2JsZW0gcmVwb3J0ZWQgYnkgTGVzbGllIEJyb29rcywKICAgICAgICAgICAgR2VycnkgV29vZHMsIGFuZCBvdGhlcnMuCgowOS8yMy8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIFNvbWUgZXJyb3IgY2hlY2tpbmcgYWRkZWQ6CiAgICAgICAgICAgIDEpIE91dE9mTWVtb3J5RXhjZXB0aW9uIGNoZWNrIGluIHRoZSBjaGFyICogdHlwZW1hcHMuIAogICAgICAgICAgICAyKSBBcyBTV0lHIHRyZWF0cyBwb2ludGVycywgcmVmZXJlbmNlcyBhbmQgcGFzc2luZyBieSB2YWx1ZSBhbGwgdGhlCiAgICAgICAgICAgIHNhbWUsIGl0IGlzIHBvc3NpYmxlIHRvIHBhc3MgYSBOVUxMIHBvaW50ZXIgdG8gYSBmdW5jdGlvbiB0aGF0IGV4cGVjdHMKICAgICAgICAgICAgYW4gb2JqZWN0IHBhc3NlZCBieSB2YWx1ZSBvciBieSByZWZlcmVuY2UuIEEgTnVsbFBvaW50ZXJFeGNlcHRpb24gaXMgCiAgICAgICAgICAgIG5vdyB0aHJvd24gdW5kZXIgdGhpcyBzY2VuYXJpby4KCjA5LzIwLzIwMDI6IHR0bgoJICAgIFtNZXRob2RvbG9neV0gUmV3b3JrZWQgIm1ha2UgY2xlYW4iIGFuZCAibWFrZSBpbnN0YWxsIgoJCQkgIHRvIGJlIG1vcmUgdGFibGUgZHJpdmVuLgoJICAgIFtEb2NzXSBFeHBsYWluIGhvdyB0byBleHRlbmQgIm1ha2UgaW5zdGFsbCIgdy8gZXh0cmEtaW5zdGFsbC5saXN0LgoKMDkvMTUvMjAwMjogYmVhemxleQogICAgICAgICAgICBEZXByZWNhdGlvbiBvZiB0aGUgImlnbm9yZSIgdHlwZW1hcC4gICBUaGUgImlnbm9yZSIgdHlwZW1hcCBoYXMKICAgICAgICAgICAgYmVlbiBkZXByZWNhdGVkIGluIGZhdm9yIG9mIGEgZ2VuZXJhbGl6YXRpb24gb2YgdGhlICJpbiIgdHlwZW1hcC4KICAgICAgICAgICAgVG8gaWdub3JlIGFuIGFyZ3VtZW50LCB1c2Ugc29tZXRoaW5nIGxpa2UgdGhpcyBpbnN0ZWFkOgoKICAgICAgICAgICAgICAgICV0eXBlbWFwKGluLG51bWlucHV0cz0wKSBpbnQgKm91dHB1dCAoaW50IHRlbXApIHsKICAgICAgICAgICAgICAgICAgICAgJDEgPSAmdGVtcDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFRoaXMgY2hhbmdlIGZpeGVzIGEgbnVtYmVyIG9mIHN1YnRsZSBidWdzIHJlbGF0ZWQgdG8gdGhlIGludGVyYWN0aW9uCiAgICAgICAgICAgIG9mIHRoZSAiaW4iIGFuZCAiaWdub3JlIiB0eXBlbWFwcyAod2hpY2ggd2VyZSBzdXBwb3NlZCB0byBiZQogICAgICAgICAgICBtdXR1YWxseSBleGNsdXNpdmUpLgoKICAgICAgICAgICAgVGhlIHVzZSBvZiB0aGUgbnVtaW5wdXRzIGFyZ3VtZW50IGlzIHJlc2VydmVkIGZvciBmdXR1cmUgZXhwYW5zaW9uLgogICAgICAgICAgICBDdXJyZW50bHksIHZhbHVlcyA+MSB3aWxsIGdlbmVyYXRlIGFuIGVycm9yLiAgSG93ZXZlciwgZnV0dXJlCiAgICAgICAgICAgIHJlbGVhc2VzIG9mIFNXSUcgbWF5IHV0aWxpemUgdGhhdCB0byBzdXBwb3J0IG11bHRpLWlucHV0IHR5cGVtYXBzLgoKICAgICAgICAgICAgJXR5cGVtYXAoaWdub3JlKSBzdGlsbCB3b3JrcywgYnV0IGdlbmVyYXRlcyBhIHdhcm5pbmcgbWVzc2FnZSBhbmQgaXMKICAgICAgICAgICAgdHJhbnNsYXRlZCB0byAldHlwZW1hcChpbixudW1pbnB1dHM9MCkuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKICAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKMDkvMTUvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBzZWdtZW50YXRpb24gZmF1bHQgZm9yIHVubmFtZWQgc3RydWN0dXJlcy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgdHlwZWRlZiBzdHJ1Y3QgewogICAgICAgICAgICAgICB9ICpibGFoOwoKCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IFJvZ2VyIEdpYnNvbi4KICAgICAgICAgICAgTm90ZTogd2UgbWlnaHQgYmUgYWJsZSB0byBnZW5lcmF0ZSB3cmFwcGVycyBpbiBzcGVjaWFsIGNhc2VzLgoKMDkvMTMvMjAwMjogYmVhemxleQogICAgICAgICAgICBNaW5vciBtb2RpZmljYXRpb24gdG8gZ2VuZXJhdGVkIHdyYXBwZXIgZnVuY3Rpb25zLiAgUG9pbnRlciBhcmd1bWVudHMgYXJlIG5vdwogICAgICAgICAgICBhbHdheXMgc2V0IHRvIGFuIGluaXRpYWwgdmFsdWUgb2YgMC4gICBTaW1wbGlmaWVzIHR5cGVtYXAgd3JpdGluZyBhbmQgY2xlYW51cAogICAgICAgICAgICBjb2RlIChzaW5jZSB5b3UgY2FuIHJlbHkgb24gemVyby12YWx1ZSBpbml0aWFsaXphdGlvbikuICAgVGhpcyBhbHNvIGdyZWF0bHkKICAgICAgICAgICAgcmVkdWNlcyB0aGUgbmVlZCB0byBldmVyIHdyaXRlIGFuICJhcmdpbml0IiB0eXBlbWFwLgoKMDkvMTIvMjAwMjogYmVhemxleQogICAgICAgICAgICBNaW5vciBlbmhhbmNlbWVudCB0byBzbWFydC1wb2ludGVyIHN1cHBvcnQuICBJZiBvcGVyYXRvci0+KCkKICAgICAgICAgICAgaXMgcGFydCBvZiBhbiBpZ25vcmVkIGJhc2UgY2xhc3MgbGlrZSB0aGlzLAoKICAgICAgICAgICAgICAgICAlaWdub3JlIEJhcjsKCiAgICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgIGludCBibGFoKCk7CiAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgY2xhc3MgQmFyIHsgICAgICAgICAvKiBJZ25vcmVkICovCiAgICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgICAgRm9vICpvcGVyYXRvci0+KCk7CiAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgIGNsYXNzIFNwYW0gOiBwdWJsaWMgQmFyIHsgfTsKCiAgICAgICAgICAgIHRoZW4gbWV0aG9kcyBmcm9tIEZvbyBhcmUgc3RpbGwgYXZhaWxhYmxlLiAgRm9yIGV4YW1wbGUsCgogICAgICAgICAgICAgICAgID4+PiBzID0gU3BhbSgpCiAgICAgICAgICAgICAgICAgPj4+IHMuYmxhaCgpCiAgICAgICAgICAgICAgICAgMAogICAgICAgICAgICAgICAgID4+PgoKICAgICAgICAgICAgIFRoZSBvbmx5IGNhdGNoIGlzIHRoYXQgdGhlIG9wZXJhdG9yLT4oKSBpdHNlbGYgaXMgbm90IGF2YWlsYWJsZQogICAgICAgICAgICAgKHNpbmNlIGl0IHdhc24ndCB3cmFwcGVkKS4gICBUaGVyZWZvcmUsIHRoZXJlIHdvbid0IGJlIGFueQogICAgICAgICAgICAgX19kZXJlZl9fKCkgb3BlcmF0aW9uIHVubGVzcyBpdCBpcyBleHBsaWNpdGx5IGFkZGVkIHRvIFNwYW0KICAgICAgICAgICAgIChlaXRoZXIgdXNpbmcgJWV4dGVuZCBvciBqdXN0IHBsYWNpbmcgb3BlcmF0b3ItPigpIGluIHRoZQogICAgICAgICAgICAgZGVmaW5pdGlvbiBvZiBTcGFtKS4KCjA5LzExLzIwMDI6IHR0bgoJICAgIFtNZXRob2RvbG9neV0gUmV3b3JrZWQgIm1ha2UgY2hlY2siIHRvIGJlIG1vcmUgdGFibGUgZHJpdmVuLgoJICAgIFtEb2NzXSBEb2N1ZW1lbnRlZCBtZXRob2RvbG9neSBpbiBNYW51YWwvRXh0ZW5kaW5nLmh0bWwuCgowOS8xMS8yMDAyOiB0dG4KCSAgICBbRG9jc10gUHJlZml4ZWQgTWFudWFsLyouaHRtbCB3aXRoICI8IURPQ1RZUEUgaHRtbCAuLi4+IiB0bwoJICAgIHBhbmRlciBkb3RpbmdseSB0byAob3Zlci0pc2Vuc2l0aXZlIGVkaXRvcnMuCgowOS8xMC8yMDAyOiB0dG4KCSAgICBbR3VpbGVdIENvbnZlcnRlZCBFeGFtcGxlcy9ndWlsZS9zaW1wbGUgIm1ha2UgY2hlY2siCgkgICAgYmVoYXZpb3IgdG8gYWN0dWFsbHkgY2hlY2sgZXhlY3V0aW9uIHJlc3VsdHMuICBSZWR1Y2VkCgkgICAgaXRlcmF0aW9uIGNvdW50cyBzbyB0aGF0IHRoZSB0ZXN0IGRvZXNuJ3QgdGFrZSB0b28gbG9uZy4KCjA5LzEwLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgU1dJRy0xLjMuMTUgcmVsZWFzZWQuCgoKVmVyc2lvbiAxLjMuMTUgKFNlcHRlbWJlciA5LCAyMDAyKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgowOS8wOS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIG5hc3R5IHJ1bnRpbWUgdHlwZSBjaGVja2luZyBidWcgd2l0aCBzdWJ0eXBlcyBhbmQgaW5oZXJpdGFuY2UKICAgICAgICAgICAgYW5kIHRlbXBsYXRlcy4gCgowOS8wOS8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEphdmEgZXhjZXB0aW9uIGNsYXNzZXMgZm9yIGEgbWV0aG9kJ3MgdGhyb3dzIGNsYXVzZSBjYW4gYmUgZ2VuZXJhdGVkIGJ5IAogICAgICAgICAgICBzcGVjaWZ5aW5nIHRoZW0gaW4gYSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBpbiB0aGUgdGhyb3dzIGF0dHJpYnV0ZSBpbiBhbnkgb25lCiAgICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgdHlwZW1hcHM6IGluLCBvdXQsIGNoZWNrLCBmcmVlYXJnLCBhcmdvdXQgYW5kIHRocm93cy4gQSBjbGFzc2ljCiAgICAgICAgICAgIGV4YW1wbGUgd291bGQgYmUgdG8gY29udmVydCBDKysgZXhjZXB0aW9ucyBpbnRvIGEgc3RhbmRhcmQgSmF2YSBleGNlcHRpb246CgogICAgICAgICAgICAgICAgJXR5cGVtYXAodGhyb3dzLCB0aHJvd3M9ImphdmEuaW8uSU9FeGNlcHRpb24iKSBmaWxlX2V4Y2VwdGlvbiB7CiAgICAgICAgICAgICAgICAgICAgamNsYXNzIGV4Y2VwID0gamVudi0+RmluZENsYXNzKCJqYXZhL2lvL0lPRXhjZXB0aW9uIik7CiAgICAgICAgICAgICAgICAgICAgaWYgKGV4Y2VwKQogICAgICAgICAgICAgICAgICAgICAgICBqZW52LT5UaHJvd05ldyhleGNlcCwgJDEud2hhdCgpKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJG51bGw7IC8vIG9yIHVzZSBTV0lHX2ZhaWwKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjbGFzcyBmaWxlX2V4Y2VwdGlvbiB7Li4ufTsKICAgICAgICAgICAgICAgIHZvaWQgb3Blbihjb25zdCBjaGFyICpmaWxlbmFtZSkgdGhyb3coZmlsZV9leGNlcHRpb24pOwoKICAgICAgICAgICAgVGhlIEphdmEgbWV0aG9kIHdpbGwgdGhlbiBiZSBkZWNsYXJlZCB3aXRoIGEgdGhyb3dzIGNsYXVzZToKCiAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgb3BlbihTdHJpbmcgZmlsZW5hbWUpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsuLi59CgowOS8wOC8yMDAyOiBta29lcHBlCgkgICogW0d1aWxlXSBJbXByb3ZlZCB0aGUgZG9jdW1lbnRhdGlvbiBzeXN0ZW0uICBUaGUgYXJnbGlzdCBubwoJICAgIGxvbmdlciBnZXRzIGNsdXR0ZXJlZCB3aXRoIHR5cGUgc3BlY2lmaWNhdGlvbiwgbWFraW5nIGl0CgkgICAgbW9yZSByZWFkYWJsZS4gIChBbHNvIHRoZSBJTElTUCBmdW5jdGlvbiBDLXUgTS14CgkgICAgYGFyZ2xpc3QtbGlzcCcgUkVUIHdvcmtzIGJldHRlciB0aGlzIHdheS4pICBUaGUgdHlwZXMgb2YKCSAgICBhcmd1bWVudHMgYXJlIGV4cGxhaW5lZCBpbiBhbiBleHRyYSBzZW50ZW5jZSBhZnRlciB0aGUKCSAgICBhcmdsaXN0LiAKCSAgICAKCSAgICBUaGVyZSBhcmUgbm93IHR3byBkb2N1bWVudGF0aW9uLXJlbGF0ZWQgdHlwZW1hcCBhcmd1bWVudHM6CgoJICAgICAgICAldHlwZW1hcChpbiwgZG9jPSIkTkFNRSBpcyBhIHZlY3RvciBvZiBpbnRlZ2VycyIsIAoJCQkgYXJnbGlzdD0iJG5hbWUiKSAgaW50ICpWRUNUT1IgeyAuLi4gfQoJCQkgCiAgICAgICAgICAgIFRoZSAiYXJnbGlzdCIgdGV4dHMgb2YgYWxsIGFyZ3VtZW50cyBvZiBhIGZ1bmN0aW9uIG1ha2UgdXAKCSAgICBpdHMgYXJnbGlzdCBpbiB0aGUgZG9jdW1lbnRhdGlvbi4gIFRoZSAiZG9jIiB0ZXh0cyBvZiBhbGwKCSAgICBhcmd1bWVudHMgYXJlIGNvbGxlY3RlZCB0byBtYWtlIGEgc2VudGVuY2UgdGhhdCBkZXNjcmliZXMKCSAgICB0aGUgdHlwZXMgb2YgdGhlIGFyZ3VtZW50cy4gIFJlYXNvbmFibGUgZGVmYXVsdHMgYXJlCgkgICAgcHJvdmlkZWQuIAoKCSAgICBBcyB1c3VhbCwgJG5hbWUgaXMgc3Vic3RpdHV0ZWQgYnkgdGhlIG5hbWUgb2YgdGhlCgkgICAgYXJndW1lbnQuIFRoZSBuZXcgdHlwZW1hcCB2YXJpYWJsZSAkTkFNRSBpcyBsaWtlICRuYW1lLAoJICAgIGJ1dCBtYXJrZWQtdXAgYXMgYSB2YXJpYWJsZS4gIFRoaXMgbWVhbnMgdGhhdCBpdCBpcwoJICAgIHVwcGVyLWNhc2VkOyBpbiBUZVhpbmZvIG1vZGUgKCItcHJvY2RvY2Zvcm1hdCB0ZXhpbmZvIikgaXQKCSAgICBjb21lcyBvdXQgYXMgQHZhcntuYW1lfS4gCgkgICAgCgkgICAgVGhlIGRpcmVjdGl2ZXMgJXZhbHVlc19hc19saXN0LCAldmFsdWVzX2FzX3ZlY3RvciwKCSAgICAlbXVsdGlwbGVfdmFsdWVzIG5vdyBhbHNvIGhhdmUgYW4gZWZmZWN0IG9uIHRoZQoJICAgIGRvY3VtZW50YXRpb24uIChUaGlzIGlzIGFjaGlldmVkIHZpYSB0aGUgbmV3IHByYWdtYXMKCSAgICByZXR1cm5fbm90aGluZ19kb2MsIHJldHVybl9vbmVfZG9jLCByZXR1cm5fbXVsdGlfZG9jLikKCgkgICAgRG9jdW1lbnRhdGlvbiBoYXMgYWxzbyBpbXByb3ZlZCBmb3IgdmFyaWFibGVzIHRoYXQgYXJlCgkgICAgd3JhcHBlZCBhcyBwcm9jZWR1cmVzLXdpdGgtc2V0dGVycyAoY29tbWFuZC1saW5lIHN3aXRjaAoJICAgICItZW1pdC1zZXR0ZXJzIikuCgogICAgICAgICAgKiBbR3VpbGVdIEVtaXQgY29uc3RhbnRzIGFzIF9pbW11dGFibGVfIHZhcmlhYmxlcy4gIChUaGlzCiAgICAgICAgICAgIHdhcyBicm9rZW4gcmVjZW50bHkuKQoKMDkvMDcvMjAwMjogbWtvZXBwZQoJICAgIFtHdWlsZV0gVXBkYXRlZCB0aGUgdHlwZW1hcHMgaW4gbGlzdC12ZWN0b3IuaS4KCjA5LzA3LzIwMDI6IG1rb2VwcGUKCSAgICBTaG9ydC1jaXJjdWl0IHRoZSB0eXBlY2hlY2tzIGZvciBvdmVybG9hZGVkIGZ1bmN0aW9ucy4KCSAgICAoVGhlIGNoYW5nZXMgaW4gY29kZSBnZW5lcmF0aW9uIGFyZSB2aXNpYmxlIGluIHRoZSBuZXcKCSAgICB0ZXN0Y2FzZSAib3ZlcmxvYWRfY29tcGxpY2F0ZWQiLikKCjA5LzA2LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gU29sdXRpb24gZm9yIFsgNTk2NDEzIF0KICAgICAgICAgICAgTmV3IHR5cGVtYXAgc28gdGhhdCB0aGUgSmF2YSBwcm94eSBjbGFzc2VzIGFuZCB0eXBlIHdyYXBwZXIgY2xhc3NlcwogICAgICAgICAgICB3cmFwcGVyIGNvbnN0cnVjdG9yIG1vZGlmaWVyIGNhbiBiZSB0YWlsb3JlZCBieSB1c2Vycy4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgCiAgICAgICAgICAgIHByb3RlY3RlZC4gTm9ybWFsbHkgU1dJRyBnZW5lcmF0ZXMgYSBjb25zdHJ1Y3RvciBsaWtlIHRoaXMgd2hpY2ggY2FuIG9ubHkgCiAgICAgICAgICAgIGJlIGFjY2Vzc2VkIHdpdGhpbiBvbmUgcGFja2FnZToKCiAgICAgICAgICAgICAgcHJvdGVjdGVkIEJhcihsb25nIGNQdHIsIGJvb2xlYW4gY01lbW9yeU93bikgewogICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgICAgIElmIHlvdSBhcmUgdXNpbmcgU1dJRyBhY3Jvc3MgbXVsdGlwbGUgcGFja2FnZXMgb3Igd2FudCB0byB1c2UgdGhpcyBjb25zdHJ1Y3RvcgogICAgICAgICAgICBhbnl3YXksIGl0IGNhbiBub3cgYmUgYWNjZXNzZWQgb3V0c2lkZSB0aGUgcGFja2FnZS4gVG8gbW9kaWZ5IHVzZSBmb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgJXR5cGVtYXAoamF2YXB0cmNvbnN0cnVjdG9ybW9kaWZpZXJzKSBTV0lHVFlQRSAicHVibGljIgoKICAgICAgICAgICAgdG8gY2hhbmdlIHRvIHB1YmxpYyBmb3IgYWxsIHByb3h5IGNsYXNzZXMgYW5kIHNpbWlsYXJseSBmb3IgYWxsIHR5cGUgd3JhcHBlciBjbGFzc2VzOgogICAgICAgICAgICAKICAgICAgICAgICAgICAldHlwZW1hcChqYXZhcHRyY29uc3RydWN0b3Jtb2RpZmllcnMpIFNXSUdUWVBFLCBTV0lHVFlQRSAqLCBTV0lHVFlQRSAmLCBTV0lHVFlQRSBbXSAicHVibGljIgoKMDkvMDYvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBBZGRlZCB0aHJvd3MgdHlwZW1hcHMgZm9yIHRoZSBKYXZhIG1vZHVsZS4gQysrIGV4Y2VwdGlvbnMgZ2V0IGNvbnZlcnRlZCBpbnRvCiAgICAgICAgICAgIGphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uIEphdmEgZXhjZXB0aW9ucy4gCiAgICAgICAgICAgIAogICAgICAgICAgICBXYXJuaW5nOiBUaGlzIG1heSBjaGFuZ2UgZnJvbSBqYXZhLmxhbmcuUnVudGltZSBleGNlcHRpb24gaW4gdGhlIGZ1dHVyZS4KCjA5LzA1LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gRml4IGZvciB2YXJpYWJsZXMgZGVjbGFyZWQgYXMgcmVmZXJlbmNlcy4KCjA5LzA1LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA2MDUxNjIgXSBUeXBlbWFwIGxvY2FsIHZhcmlhYmxlcy4gUmVwb3J0ZWQgYnkgTHlsZSBKb2huc29uLgoKMDkvMDUvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIE1vcmUgdXBkYXRlcyB0byB0aGUgUnVieSBtb2R1bGUgZG9jdW1lbnRhdGlvbiwgaW5jbHVkaW5nCgkgICAgYSBuZXcgdHlwZW1hcCBleGFtcGxlIHRoYXQgZGVtb25zdHJhdGVzIGhvdyB0byBjb2xsZWN0IGtleS12YWx1ZQoJICAgIHBhaXJzIGZyb20gYW4gYXJndW1lbnQgbGlzdCBpbnRvIGEgSGFzaC4KCjA5LzA1LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYnVnIHdpdGggdGVtcGxhdGUgZXhwYW5zaW9uIGFuZCBjb25zdHJ1Y3RvcnMuCgogICAgICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgVD4gY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICBGb288VD4oKSB7IH0KICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBUaGUgZXh0cmEgPFQ+IGluIHRoZSBjb25zdHJ1Y3RvciB3YXMgY2FycmllZCB0aHJvdWdoIGluIHRoZQogICAgICAgICAgICBuYW1lLS1jYXVzaW5nIHJ1bnRpbWUgcHJvYmxlbXMgaW4gZ2VuZXJhdGVkIG1vZHVsZXMuCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IEpvcmRpIEFybmFiYXQgQmVuZWRpY3RvLgogCjA5LzA1LzIwMDI6IG1rb2VwcGUKCSAgICBbR3VpbGVdIFN1cHBvcnQgb3ZlcmxvYWRpbmcuCgowOS8wNC8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gVXBkYXRlZCB0eXBlbWFwcyBmb3IgbG9uZyBsb25nIGFuZCB1bnNpZ25lZCBsb25nIGxvbmcgdHlwZXMKCSAgICB0byB1c2UgUnVieSAxLjcgc3VwcG9ydCBmb3IgdGhlc2UgdHlwZXMgd2hlbiBhdmFpbGFibGUuCgowOS8wNC8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gQWRkZWQgb3V0cHV0IHR5cGVtYXBzIGZvciBjb25zdCByZWZlcmVuY2UgdG8gcHJpbWl0aXZlCgkgICAgdHlwZXMuCgowOS8wNC8yMDAyOiBta29lcHBlCgkgICAgW0d1aWxlXSBGaXggcGFzcy1ieS12YWx1ZSB0eXBlbWFwcy4gIFJlcG9ydGVkIGJ5IEFybm8KCSAgICBQZXRlcnMgdmlhIERlYmlhbiBidWd0cmFja2luZyAoIzE1NjkwMiksIHBhdGNoIGJ5IFRvcnN0ZW4KCSAgICBMYW5kc2Nob2ZmIDx0b3JzdGVuQGRlYmlhbi5vcmc+LgoKMDkvMDMvMjAwMjogc2FtamFtIChTYW0gTGlkZGljb3R0KQoJICAgIEJldHRlciByZWZlcmVuY2Ugc3VwcG9ydC4KCSAgICBGdW5jdGlvbnMgdGhhdCB3YW50IGEgdm9pZCoqIGNhbiB0YWtlIGEgTlVMTCBieSByZWZlcmVuY2UgYW5kCgkgICAgdGhlIHZvaWQqIHdpbGwgYmUgbWFkZSBmb3IgeW91IGFuZCB0aGVuIHBhc3NlZC1ieS1yZWZlcmVuY2UKCgkgICAgQWxzbyBhbGwgaW50ZWdlci1jbGFzcyBuYXRpdmUgdHlwZXMgY2FuIGJlIHBhc3NlZCBieSByZWZlcmVuY2UKCSAgICB3aGVyZSBhbiBpbnQqIG9yIGludCYgZXRjIGlzIG5lZWRlZAoKMDkvMDMvMjAwMjogYmVhemxleQogICAgICAgICAgICBDaGFuZ2VkIHRoZSBldmFsdWF0aW9uIG9yZGVyIG9mIHByZXByb2Nlc3NvciBtYWNybyBhcmd1bWVudHMuCiAgICAgICAgICAgIEFyZ3VtZW50cyBhcmUgbm93IGV4cGFuZGVkIGJ5IHRoZSBwcmVwcm9jZXNzb3IgKmJlZm9yZSogdGhleQogICAgICAgICAgICBhcmUgcGFzc2VkIHRvIG1hY3JvIGV4cGFuc2lvbi4gIFRoaXMgZml4ZXMgYSBzdWJ0bGUgZXhwYW5zaW9uCiAgICAgICAgICAgIGJ1ZyByZXBvcnRlZCBieSBBbnRob255IEhlYWRpbmcuCgowOS8wMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHRoZSBmaWxlIGluY2x1ZGUgb3JkZXIgKGFnYWluLCBhcHBhcmVudGx5KS4gU2VlIDIvMjcvOTkuCgowOS8wMi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFtQZXJsXSBCZXR0ZXIgZXhjZXB0aW9uIGhhbmRsaW5nIHN1cHBvcnQuICBTaW5jZSBQZXJsIGVycm9yIGhhbmRsaW5nCiAgICAgICAgICAgIHJlbGllcyBvbiBzZXRqbXAvbG9uZ2ptcCwgd3JhcHBlciBmdW5jdGlvbnMgaGF2ZSBiZWVuIG1vZGlmaWVkIHNsaWdodGx5CiAgICAgICAgICAgIHRvIHByb3ZpZGUgYW4gZXh0cmEgYmxvY2sgc2NvcGU6CgogICAgICAgICAgICAgICAgWFMoZm9vKSB7CiAgICAgICAgICAgICAgICAgICBjaGFyIF9zd2lnbXNnW1NXSUdfTUFYX0VSUk1TR10gPSAiIjsKICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKl9zd2lnZXJyID0gX3N3aWdtc2c7CiAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAvKiBOb3JtYWwgd3JhcHBlciBmdW5jdGlvbiBoZXJlICovCiAgICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgICAgIFNXSUdfY3JvYWsoIkFuIGVycm9yIG9jY3VycmVkXG4iKTsKICAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgICAgWFNSRVRVUk4oYXJndmkpOyAgICAgIC8qIFN1Y2Nlc3NmdWwgcmV0dXJuICovCiAgICAgICAgICAgICAgICAgICAgICBmYWlsOgogICAgICAgICAgICAgICAgICAgICAgICAvKiBjbGVhbnVwIGNvZGUgKi8KICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgIGNyb2FrKF9zd2lnX2Vycik7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICBUaGUgbWFjcm8gU1dJR19jcm9hayh4KSBzZXRzIHRoZSB2YWx1ZSBvZiBfc3dpZ2VyciB0byB4IGFuZAogICAgICAgICAgICBleGVjdXRlcyBhICJnb3RvIGZhaWwiLiAgVGhlIHdob2xlIHdyYXBwZXIgZnVuY3Rpb24gaXMgZW5jbG9zZWQKICAgICAgICAgICAgYmxvY2sgc2NvcGUgdG8gcHJvdmlkZSBwcm9wZXIgY2xlYW51cCBvZiBDKysgb2JqZWN0cy4gIFNpbmNlCiAgICAgICAgICAgIGNyb2FrIGV4ZWN1dGVzIGEgbG9uZ2ptcCgpLCB0aGVyZSBpcyBubyB3YXkgdG8gcHJvcGVybHkgcmVjbGFpbQogICAgICAgICAgICByZXNvdXJjZXMgaWYgdGhpcyBleGVjdXRlcyBpbiB0aGUgc2FtZSBzY29wZSBhcyB0aGUgd3JhcHBlcgogICAgICAgICAgICBmdW5jdGlvbi4KCiAgICAgICAgICAgIFRoZSBfc3dpZ21zZ1tdIHZhcmlhYmxlIGlzIG5vcm1hbGx5IHVudXNlZCwgYnV0IGNhbiBiZSB1c2VkCiAgICAgICAgICAgIHRvIHN0b3JlIHNtYWxsIGVycm9yIG1lc3NhZ2VzIHVzaW5nIHNwcmludGYgb3Igc25wcmludGYuIEl0CiAgICAgICAgICAgIGhhcyBhIGNhcGFjaXR5IG9mIGF0IGxlYXN0IDI1NiBieXRlcyAoU1dJR19NQVhfRVJSTVNHKS4KICAgICAgICAgICAgCjA5LzAyLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgW1RjbF0gQWRkZWQgYmV0dGVyIHN1cHBvcnQgZm9yIGV4Y2VwdGlvbnMuICBJbnN0ZWFkIG9mIHJldHVybmluZyBUQ0xfRVJST1IsCiAgICAgICAgICAgIHVzZSB0aGUgbWFjcm8gU1dJR19mYWlsIHRvIHJldHVybiB3aXRoIGFuIGVycm9yLiAgVGhpcyBlbnN1cmVzIHRoYXQKICAgICAgICAgICAgYXJndW1lbnRzIGFyZSBwcm9wZXJseSBjbGVhbmVkIHVwLiAgRXhjZXB0aW9uIHNwZWNpZmllcnMgYXJlIG5vdwogICAgICAgICAgICBoYW5kbGVkIGJ5IGRlZmF1bHQuCgowOS8wMi8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gVGhlIHR5cGUtY2hlY2tpbmcgc3lzdGVtIGZvciB0aGUgUnVieSBtb2R1bGUgaGFzIGhhZCBhIGZsYXcKCSAgICBpbiB0aGF0IHNvbWUgdHlwZXMgd2hpY2ggc2hvdWxkIGJlIGNvbnNpZGVyZWQgZXF1aXZhbGVudAoJICAgIHdlcmVuJ3QuIFRoaXMgYnVnIHdhcyBiZXN0IGRlbW9uc3RyYXRlZCBieSB0aGUgaW5oZXJpdF9taXNzaW5nLmkKCSAgICB0ZXN0IHN1aXRlIGNhc2UsIHdoaWNoIGRlZmluZXMgYSBiYXNlIGNsYXNzICJGb28iIHRoYXQgaXMKCSAgICBzdWJjbGFzc2VkIGJ5ICJCYXIiLiBUaGUgIkZvbyIgY2xhc3MgaXNuJ3QgYWN0dWFsbHkgd3JhcHBlZCAoaS5lLgoJICAgIGl0J3Mgbm90IGRpcmVjdGx5IGFjY2Vzc2libGUgZnJvbSBSdWJ5KSBidXQgd2UnZCBzdGlsbCBsaWtlIHRvIGJlCgkgICAgYWJsZSB0byBwYXNzICJCYXIiIGluc3RhbmNlcyB0byBmdW5jdGlvbnMgZXhwZWN0aW5nIEZvb3MgYW5kIGhhdmUKCSAgICB0aGF0IHdvcms7IGl0IHdhc24ndC4gVGhlIHJldmlzZWQgaW1wbGVtZW50YXRpb24gKHNpbWlsYXIgdG8gdGhhdAoJICAgIHVzZWQgZm9yIHNvbWUgb3RoZXIgbGFuZ3VhZ2UgbW9kdWxlcykgYWRkcyBhIG5ldyBpbnN0YW5jZSB2YXJpYWJsZQoJICAgIChfX3N3aWd0eXBlX18pIHRvIGVhY2ggb2JqZWN0IHRoYXQgaW5kaWNhdGVzIGl0cyBTV0lHIHR5cGU7CgkgICAgdGhhdCBpcywgZWFjaCAiQmFyIiBpbnN0YW5jZSB3aWxsIG5vdyBoYXZlIGEgc3RyaW5nIGluc3RhbmNlCgkgICAgdmFyaWFibGUgY2FsbGVkICJfX3N3aWd0eXBlX18iIHdob3NlIHZhbHVlIGlzICJfcF9CYXIiLgoKICAgICAgICAgICAgVW5sZXNzIGRldmVsb3BlcnMgd2VyZSB0YWtpbmcgYWR2YW50YWdlIG9mIHRoaXMgbG93LWxldmVsCgkgICAgaW1wbGVtZW50YXRpb24gZGV0YWlsLCB0aGV5IHNob3VsZG4ndCBub3RpY2UgYW55IGNvbXBhdGliaWxpdHkKCSAgICBwcm9ibGVtczsgbmV2ZXJ0aGVsZXNzLCBJJ20gbWFya2luZyBpdCBhcyBhICJwb3RlbnRpYWwKCSAgICBpbmNvbXBhdGliaWxpdHkiLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgowOS8wMS8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gRml4ZWQgU0YgQnVnICM2MDMxOTkuCgowOC8wOC8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEFkZGVkIE9VVFBVVCwgSU5QVVQgYW5kIElOT1VUIHR5cGVtYXBzIGluIHR5cGVtYXBzLmkgZm9yIEMrKyAKICAgICAgICAgICAgcmVmZXJlbmNlcy4KCjA4LzI3LzIwMDI6IG1rb2VwcGUKCSAgICBbR3VpbGVdIEZpeGVkIGVycm9yIGluICJsaWJfc3RkX3ZlY3RvciIgdGVzdGNhc2UgYW5kCgkgICAgY29tcGlsZXIgd2FybmluZyBpbiAibGliX2NkYXRhIiB0ZXN0Y2FzZS4KCjA4LzI3LzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBBZGRlZCB0aGUgIiVtaXhpbiIgZGlyZWN0aXZlLCB3aGljaCBhbGxvd3MgdGhlIHVzZXIgdG8KCSAgICBzcGVjaWZ5IGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgbW9kdWxlIG5hbWVzIHRvIG1peC1pbiB0byBhCgkgICAgY2xhc3MuIFNvLCBmb3IgZXhhbXBsZSwgaWYgeW91J2QgbGlrZSB0byBzcGVjaWZ5IHRoYXQgUnVieSdzCgkgICAgRW51bWVyYWJsZSBtb2R1bGUgc2hvdWxkIGJlIG1peGVkLWluIHRvIHlvdXIgY2xhc3MgRm9vLCB5b3UnZAoJICAgIHdyaXRlOgoJICAgIAoJICAgICAgICAlbWl4aW4gRm9vICJFbnVtZXJhYmxlIjsKCQkKICAgICAgICAgICAgb3IgdG8gc3BlY2lmeSB0aGF0IHRoZSBtb2R1bGVzIEZlZSwgRmllIGFuZCBGbyBzaG91bGQgYmUgbWl4ZWQKCSAgICBpbiB0byBGb286CgkgICAgCgkgICAgICAgICVtaXhpbiBGb28gIkZlZSxGaWUsRm8iOwoJCQoJICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjA4LzI3LzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBNb2RpZmllZCB0aGUgJWFsaWFzIGRpcmVjdGl2ZSBzbyB0aGF0IG11bHRpcGxlIGFsaWFzZXMKCSAgICBjYW4gYmUgc3BlY2lmaWVkIGZvciBhbiBpbnN0YW5jZSBtZXRob2QgYnkgdXNpbmcgYSBjb21tYS1zZXBhcmF0ZWQKCSAgICBsaXN0IG9mIGFsaWFzZXMuCgowOC8yNy8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gQWRkZWQgInRocm93IiB0eXBlbWFwcyBmb3IgdGhlIFJ1YnkgbW9kdWxlLgoKMDgvMjYvMjAwMjogYmVhemxleQogICAgICAgICAgICBUd28gbmV3IGNvbW1hbmQgbGluZSBvcHRpb25zIGZvciBwcmludGluZyBkZXBlbmRlbmNpZXMuCiAgICAgICAgICAgICdzd2lnIC1NJyBsaXN0cyBhbGwgZmlsZSBkZXBlbmRlbmNpZXMuICAnc3dpZyAtTU0nIGxpc3RzCiAgICAgICAgICAgIGRlcGVuZGVuY2llcywgYnV0IGV4Y2x1ZGVzIGZpbGVzIGluIHRoZSBTV0lHIGxpYnJhcnkuIAogICAgICAgICAgICBFeGFtcGxlOgoKICAgICAgICAgICAgICAgJSBzd2lnIC1NIC1weXRob24gZXhhbXBsZS5pCiAgICAgICAgICAgICAgIGV4YW1wbGVfd3JhcC5jeHg6IFwKICAgICAgICAgICAgICAgIC91MC9iZWF6bGV5L1Byb2plY3RzL2xpYi9zd2lnMS4zL3N3aWcuc3dnIFwKICAgICAgICAgICAgICAgIC91MC9iZWF6bGV5L1Byb2plY3RzL2xpYi9zd2lnMS4zL3B5dGhvbi9weXRob24uc3dnIFwKICAgICAgICAgICAgICAgIGV4YW1wbGUuaSBcCiAgICAgICAgICAgICAgICBleGFtcGxlLmggCgogICAgICAgICAgICAgICAlIHN3aWcgLU1NIC1weXRob24gZXhhbXBsZS5pCiAgICAgICAgICAgICAgIGV4YW1wbGVfd3JhcC5jeHg6IFwKICAgICAgICAgICAgICAgIGV4YW1wbGUuaSBcCiAgICAgICAgICAgICAgICBleGFtcGxlLmggCgogICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgowOC8yNi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNTk3NTk5IF0gdW5pb24gaW4gY2xhc3M6IGluY29ycmVjdCBzY29wZS4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgQXJ0IFllcmtlcy4KCjA4LzI2LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA2MDAxMzIgXSBEZWZhdWx0IGFyZ3VtZW50IHdpdGggbmFtZXNwYWNlLiAKICAgICAgICAgICAgUmVwb3J0ZWQgYnkgU2hpYnVrYXdhIFlvc2hpa2kuCiAKMDgvMjQvMjAwMjogYmVhemxleQogICAgICAgICAgICBBdXRvbWF0aWMgQysrIGV4Y2VwdGlvbiBoYW5kbGluZyBlbmFibGVkIGZvciBhbGwgbGFuZ3VhZ2UgbW9kdWxlcy4gICAgVGhpcyBpcwogICAgICAgICAgICBwcmV0dHkgc2ltcGxlLiAgSWYgeW91IGhhdmUgYSBjbGFzcyBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBjbGFzcyBCYXIgewogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgIHZvaWQgYmxhaCgpIHRocm93KEZvbyk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICB0aGVuIHRoZSBnZW5lcmF0ZWQgd3JhcHBlciBjb2RlIGxvb2tzIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAgIHdyYXBfQmFyX2JsYWgoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnMS0+YmxhaCgpOwogICAgICAgICAgICAgICAgICAgICAgIH0gCiAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKEZvbyAmX2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogInRocm93IiB0eXBlbWFwIGNvZGUgaW5zZXJ0ZWQuICQxID0gX2UgKi8KICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKC4uLikgewogICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93OwogICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICBUaGUgInRocm93IiB0eXBlbWFwIGNhbiBiZSB1c2VkIHRvIHJhaXNlIGFuIGVycm9yIGluIHRoZSB0YXJnZXQgCiAgICAgICAgICAgIGxhbmd1YWdlLiAgSXQgY2FuIGRvIGFueXRoaW5nLiAgSGVyZSBpcyBhIHZlcnkgc2ltcGxlIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICV0eXBlbWFwKCJ0aHJvdyIpIEZvbyB7CiAgICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsICJGb28gZXhjZXB0aW9uIik7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFRvIG1ha2UgdGhpcyB3b3JrIGluIGVhY2ggbGFuZ3VhZ2UgbW9kdWxlLCBzaW1wbHkgZGVmaW5lIGEgZmV3IGRlZmF1bHQKICAgICAgICAgICAgInRocm93IiB0eXBlbWFwcyBmb3IgU1dJR1RZUEUsIFNXSUdUWVBFICosIGludCwgY29uc3QgY2hhciAqLCBhbmQgYQogICAgICAgICAgICBmZXcgY29tbW9uIGV4Y2VwdGlvbiB0eXBlcy4gICBUaGF0J3MgYWxsIHRoZXJlIGlzIHRvIGl0LgoKICAgICAgICAgICAgQXV0b21hdGljIGV4Y2VwdGlvbiBoYW5kbGluZyBjYW4gYmUgZGlzYWJsZWQgdXNpbmcgLW5vZXhjZXB0IG9yCiAgICAgICAgICAgIHNldHRpbmcgdGhlIE5vRXhjZXB0IGdsb2JhbCB2YXJpYWJsZSB0byAxLgogICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgowOC8yMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFsgUHl0aG9uIF0KICAgICAgICAgICAgQXV0b21hdGljIHRyYW5zbGF0aW9uIG9mIEMrKyBleGNlcHRpb24gc3BlY2lmaWNhdGlvbnMgaW50byBlcnJvciBoYW5kbGluZyBjb2RlLgogICAgICAgICAgICBGb3IgZXhhbXBsZToKIAogICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBjbGFzcyBCYXIgewogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgIHZvaWQgYmxhaCgpIHRocm93KEZvbyk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICBJbiB0aGlzIGNhc2UsIEZvbyBpcyB3cmFwcGVkIGFzIGEgY2xhc3NpYy1zdHlsZSBjbGFzcyAoY29tcGF0aWJsZQogICAgICAgICAgICB3aXRoIGV4Y2VwdGlvbiBoYW5kbGluZykuICBGdXJ0aGVybW9yZSwgeW91IGNhbiB3cml0ZSBQeXRob24gY29kZQogICAgICAgICAgICBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgYiA9IEJhcigpCiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgYi5ibGFoKCk7CiAgICAgICAgICAgICAgICBleGNlcHQgRm9vLGU6ICAgICAjIE5vdGUgdXNlIG9mIGV4Y2VwdGlvbiBjbGFzcyBoZXJlIQogICAgICAgICAgICAgICAgICAgICMgSGFuZGxlIEZvbyBlcnJvcgogICAgICAgICAgICAgICAgICAgIC4uLgoKICAgICAgICAgICAgVGhlIG9iamVjdCAiZSIgaW4gdGhlIGV4Y2VwdGlvbiBoYW5kbGVyIGlzIGp1c3QgYSB3cmFwcGVkIEZvbwogICAgICAgICAgICBvYmplY3QuICBBY2Nlc3MgaXQgbGlrZSBhIG5vcm1hbCBvYmplY3QuCgogICAgICAgICAgICBJZiBhbiBleGNlcHRpb24gaXMgbm90IHdyYXBwZWQgYXMgYSBjbGFzcywgYSBSdW50aW1lRXJyb3IKICAgICAgICAgICAgZXhjZXB0aW9uIGlzIHJhaXNlZC4gIFRoZSBhcmd1bWVudCB0byB0aGlzIGV4Y2VwdGlvbiBpcwogICAgICAgICAgICB0aGUgZXhjZXB0aW9uIG9iamVjdC4gIEZvciBleGFtcGxlOgogCiAgICAgICAgICAgICAgICBjbGFzcyBCYXIgewogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgIHZvaWQgYmxhaCgpIHRocm93KGludCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgYiA9IEJhcigpCiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICBiLmJsYWgoKTsKICAgICAgICAgICAgICAgIGV4Y2VwdCBSdW50aW1lRXJyb3IsZToKICAgICAgICAgICAgICAgICAgIHByaW50IGUuYXJnc1swXSAgICAgICAjIEludGVnZXIgZXhjZXB0aW9uIHZhbHVlCgogICAgICAgICAgICBDb21tZW50czoKCiAgICAgICAgICAgICAgICAtICBJZiBhIGNsYXNzIGlzIHVzZWQgYXMgYW4gZXhjZXB0aW9uLCBpdCAqbXVzdCogYmUgd3JhcHBlZAogICAgICAgICAgICAgICAgICAgYXMgYSBQeXRob24gY2xhc3NpYy1zdHlsZSBjbGFzcyAobmV3IGNsYXNzZXMgZG9uJ3Qgd29yaykuCgogICAgICAgICAgICAgICAgLSAgQXV0b21hdGljIGV4Y2VwdGlvbiBoYW5kbGluZyBpcyBjb21wYXRpYmxlIHdpdGggJWV4Y2VwdGlvbi4KCiAgICAgICAgICAgICAgICAtICBVc2UgLW5vZXhjZXB0IHRvIHR1cm4gb2ZmIHRoaXMgZmVhdHVyZS4KCiAgICAgICAgICAgICAgICAtICBUaGUgbmV3bHkgaW50cm9kdWNlZCAidGhyb3ciIHR5cGVtYXAgaXMgdXNlZCB0byByYWlzZQogICAgICAgICAgICAgICAgICAgUHl0aG9uIGVycm9ycyAobmF0dXJhbGx5KS4KCiAgICAgICAgICAgICoqKiBFWFBFUklNRU5UQUwgTkVXIEZFQVRVUkUgKioqCgowOC8yMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEluZm9ybWF0aW9uIGZyb20gdGhyb3coKSBzcGVjaWZpZXJzIGlzIG5vdyBzdG9yZWQgaW4gdGhlIHBhcnNlCiAgICAgICAgICAgIHRyZWUuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICBpbnQgYmxhaCgpIHRocm93KHNwYW0sYmFyKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFRoZSBzdG9yZWQgaW5mb3JtYXRpb24gaXMgZnVsbHkgY29ycmVjdGVkIGZvciBuYW1lc3BhY2VzIGFuZCB3b3JrcwogICAgICAgICAgICB3aXRoIHRlbXBsYXRlcy4gIFVzZXMgd2lsbCBmb2xsb3cuCiAgICAgICAgICAgIAowOC8yMi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEV4Y2VwdGlvbiBoYW5kbGluZyBjb2RlIGlzIG5vIGxvbmdlciBhcHBsaWVkIHRvIG1lbWJlciBhY2Nlc3MKICAgICAgICAgICAgZnVuY3Rpb24uICBGb3IgZXhhbXBsZSwgaW4gdGhpcyBjb2RlCgogICAgICAgICAgICAgICAgJWV4Y2VwdGlvbiB7CiAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgJGFjdGlvbgogICAgICAgICAgICAgICAgICAgfSBjYXRjaCh3aGF0ZXZlcikgewogICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICBpbnQgeDsKICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFRoZSBleGNlcHRpb24gaGFuZGxpbmcgY29kZSBpcyBub3QgYXBwbGllZCB0byBhY2Nlc3NvciBmdW5jdGlvbnMKICAgICAgICAgICAgZm9yIEZvbzo6eC4gICBUaGlzIHNob3VsZCByZWR1Y2UgdGhlIGFtb3VudCBvZiBleHRyYSBjb2RlCiAgICAgICAgICAgIGdlbmVyYXRlZC4KCiAgICAgICAgICAgIENhdmVhdDogIEV4Y2VwdGlvbiBoYW5kbGluZyBjb2RlICppcyogdXNlZCB3aGVuIGF0dHJpYnV0ZXMgYXJlCiAgICAgICAgICAgIGFjY2Vzc2VkIHRocm91Z2ggYSBzbWFydC1wb2ludGVyIG9yIGEgc3ludGhlc2l6ZWQgYXR0cmlidXRlZAogICAgICAgICAgICBhZGRlZCB3aXRoICVleHRlbmQgaXMgdXNlZC4KCjA4LzIyLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTWFkZSBtb3JlIHBhdGNoZXMgdG8gaG9wZWZ1bGx5IGVsaW1pbmF0ZSBwcm9ibGVtcyB3aGVuIGNvbXBpbGluZyBTV0lHIAogICAgICAgICAgICBhcyBhIDY0LWJpdCBleGVjdXRhYmxlLgoKMDgvMjIvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBhIGJ1ZyB3aXRoIGNvbnN0IHJlZmVyZW5jZSBtZW1iZXJzLCB2YXJpYWJsZXMsIGFuZCBzdGF0aWMgbWVtYmVycy4KICAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljIGNvbnN0IGludCAmcmVmOwogICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgU1dJRyB3YXMgdHJ5aW5nIHRvIGdlbmVyYXRlICJzZXQiIGZ1bmN0aW9ucyB3aGljaCB3b3VsZG4ndCBjb21waWxlLiAKCjA4LzIxLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTWFkZSB0aGUgd2FybmluZyBtZXNzYWdlIGZvciAiQ2xhc3MgWCBtaWdodCBhYnN0cmFjdCIgb2ZmIGJ5IGRlZmF1bHQuCiAgICAgICAgICAgIEVuYWJsZSB3aXRoIC1XYWxsLgoKMDgvMjEvMjAwMjogYmVhemxleQogICAgICAgICAgICBSZWZpbmVkIGhhbmRsaW5nIG9mIGNvbnN0IGFuZCBub24tY29uc3Qgb3ZlcmxvYWRlZCBtZXRob2RzLiAgSWYKICAgICAgICAgICAgYSBjbGFzcyBkZWZpbmVzIGEgbWV0aG9kIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgIGludCBiYXIoaW50KTsKICAgICAgICAgICAgICAgICAgICBpbnQgYmFyKGludCkgY29uc3Q7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICBUaGVuIHRoZSBub24tY29uc3QgbWV0aG9kIGlzICphbHdheXMqIHNlbGVjdGVkIGluIG92ZXJsb2FkaW5nIGFuZAogICAgICAgICAgICB0aGUgY29uc3QgbWV0aG9kIHNpbGVudGx5IGRpc2NhcmRlZC4gIElmIHJ1bm5pbmcgd2l0aCAtV2FsbCwgYSB3YXJuaW5nCiAgICAgICAgICAgIG1lc3NhZ2Ugd2lsbCBiZSBnZW5lcmF0ZWQuCgowOC8xOS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEJldHRlciBzdXBwb3J0IGZvciB1c2luZyBkZWNsYXJhdGlvbnMgYW5kIGluaGVyaXRhbmNlLiAgIENvbnNpZGVyIHRoaXM6CgogICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgIGludCBibGFoKGludCB4KTsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgY2xhc3MgQmFyIHsKICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBibGFoKGRvdWJsZSB4KTsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgY2xhc3MgRm9vQmFyIDogcHVibGljIEZvbywgcHVibGljIEJhciB7CiAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgICBjaGFyICpibGFoKGNoYXIgKngpOwogICAgICAgICAgICAgICAgICAgICAgdXNpbmcgRm9vOjpibGFoOwogICAgICAgICAgICAgICAgICAgICAgdXNpbmcgQmFyOjpibGFoOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIE5vdyBTV0lHIHdyYXBzIEZvb0Jhcjo6YmxhaCBhcyBhbiBvdmVybG9hZGVkIG1ldGhvZCB0aGF0IHVzZXMgYWxsCiAgICAgICAgICAgIGFjY2Vzc2libGUgdmVyc2lvbnMgb2YgYmxhaCgpLiAgU2VlIHNlY3Rpb24gMTUuMi4yIGluIFN0cm91c3RydXAsIDNyZCBFZC4KCiAgICAgICAgICAgIFNXSUcgYWxzbyBzdXBwb3J0cyBhY2Nlc3MgY2hhbmdlIHRocm91Z2ggdXNpbmcgZGVjbGFyYXRpb25zLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgIHByb3RlY3RlZDoKICAgICAgICAgICAgICAgICAgICAgaW50IHg7CiAgICAgICAgICAgICAgICAgICAgIGludCBibGFoKGludCB4KTsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgY2xhc3MgQmFyIDogcHVibGljIEZvbyB7CiAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgIHVzaW5nIEZvbzo6eDsKICAgICAgICAgICAgICAgICAgICAgdXNpbmcgRm9vOjpibGFoOwogICAgICAgICAgICAgICAgfTsKCgogICAgICAgICAgICBDYXZlYXQ6ICAgU1dJRyBkb2VzIG5vdCBhY3R1YWxseSBjaGVjayB0byBzZWUgaWYgZGVjbGFyYXRpb25zIGltcG9ydGVkCiAgICAgICAgICAgIHZpYSAndXNpbmcnIGFyZSBpbiB0aGUgaW5oZXJpdGFuY2UgaGllcmFyY2h5LiAgSWYgdGhpcyBvY2N1cnMsIHRoZQogICAgICAgICAgICB3cmFwcGVyIGNvZGUgd29uJ3QgY29tcGlsZSBhbnl3YXlzLS0tbm90IHN1cmUgaXQncyB3b3J0aCB3b3JyeWluZyBhYm91dC4KICAgICAgICAgIAowOC8xOC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE1vZGlmaWVkIG92ZXJsb2FkaW5nIGRpc3BhdGNoIHRvIG5vdCBpbmNsdWRlIG5vZGVzIHdpdGggYW4gImVycm9yIiBhdHRyaWJ1dGUuCiAgICAgICAgICAgIEEgbGFuZ3VhZ2UgbW9kdWxlIGNhbiBzZXQgdGhpcyBpZiBhIG5vZGUgY291bGRuJ3QgYmUgd3JhcHBlZCBhbmQgeW91IGRvbid0IHdhbnQKICAgICAgICAgICAgaXQgaW5jbHVkZWQgaW4gdGhlIGRpc3BhdGNoIGZ1bmN0aW9uLgoKMDgvMTgvMjAwMjogYmVhemxleQogICAgICAgICAgICBFbmhhbmNlbWVudCB0byBvdmVybG9hZGVkIGZ1bmN0aW9uIGRpc3BhdGNoLiAgIFRoZSBkaXNwYXRjaGVyIGlzIG5vdyBhd2FyZSBvZgogICAgICAgICAgICBpbmhlcml0YW5jZSByZWxhdGlvbnNoaXBzLiAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7IH07CiAgICAgICAgICAgICAgICAgICBjbGFzcyBCYXIgOiBwdWJsaWMgRm9vIHsgfTsKICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgIHZvaWQgc3BhbShGb28gKmYpOwogICAgICAgICAgICAgICAgICAgdm9pZCBzcGFtKEJhciAqYik7CgogICAgICAgICAgICBJbiB0aGlzIGNhc2UsIHRoZSBkaXNwYXRjaGVyIHJlLW9yZGVycyB0aGUgZnVuY3Rpb25zIHNvIHRoYXQgc3BhbShCYXIgKmIpIGlzCiAgICAgICAgICAgIGNoZWNrZWQgZmlyc3QtLS1pdCBpcyBtb3JlIHNwZWNpZmljIHRoYW4gc3BhbShGb28gKmYpLgoKMDgvMTcvMjAwMjogYmVhemxleQogICAgICAgICAgICBBZGRlZCAtV2Vycm9yIGNvbW1hbmQgbGluZSBvcHRpb24uICAgSWYgc3VwcGxpZWQsIHdhcm5pbmcgbWVzc2FnZXMgYXJlIHRyZWF0ZWQKICAgICAgICAgICAgYXMgZXJyb3JzIGFuZCBTV0lHIHdpbGwgcmV0dXJuIGEgbm9uLXplcm8gZXhpdCBjb2RlLgoKMDgvMTcvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDU5NjEzNSBdIFR5cGVkZWYgb2YgcmVmZXJlbmNlIGNhbid0IGNvbXBpbGUuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgdHlwZWRlZiBpbnQgJkludFJlZjsKICAgICAgICAgICAgICAgICB2b2lkIGZvbyhJbnRSZWYgaSk7CgogICAgICAgICAgICBTV0lHLTEuMy4xNCBnZW5lcmF0ZWQgY29kZSB0aGF0IHdvdWxkbid0IGNvbXBpbGUuCgpWZXJzaW9uIDEuMy4xNCAoQXVndXN0IDEyLCAyMDAyKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMDgvMTEvMjAwMjogbW1hdHVzCgkgICAgU3RhdGljIGNvbnN0IG1lbWJlcnMgaW5pdGlhbGl6ZWQgZHVyaW5nIGRlY2xhcmF0aW9uLCBhbmQKCSAgICBvbmx5IHRoZW0sIGllOgoKCSAgICBzdHJ1Y3QgQQoJICAgIHsJCSAKCQlzdGF0aWMgY29uc3QgaW50IGEgPSAxIDsgIC8vIHRoaXMgb25lCgkJc3RhdGljIGNvbnN0IGludCBiOyAgICAgICAvLyBub3QgdGhpcyBvbmUKICAgICAgICAgICAgfTsgICAgIAoKCSAgICBhcmUgZW1pdHRlZCBsaWtlIGNvbnN0YW50cyAoZXF1aXZhbGVudCB0byBlbnVtcyBvcgoJICAgIGV4cGxpY2l0ICVjb25zdGFudCkuCgkgICAgCgkgICAgVGhpcyBpcyBiZWNhdXNlIHRoZXkgY2Fubm90IGJlIGFkZGVkIGRpcmVjdGx5IHRvICdjdmFyJwoJICAgIHNpbmNlIHRoZXkgbGFjayB0aGUgbmVlZGVkIHJlZmVyZW5jZSAod2VsbCwgeW91IGNhbiBmb3JjZQoJICAgIHRoZW0gdG8gaGF2ZSBhIHJlYWwgcmVmZXJlbmNlLCBidXQgaW4gYW4gdWdseSB3YXkgd2hpY2gKCSAgICBnb2VzIGNvbXBsZXRlbHkgYWdhaW4gdGhlIG9yaWdpbmFsIHB1cnBvc2Ugb2YgaW5pdGlhbGl6ZQoJICAgIHRoZW0gZHVyaW5nIGRlY2xhcmF0aW9uLCB5b3UgYWxzbyBoYXZlIHRvIGRlYWwgd2l0aCBleHRyYQoJICAgIGxpbmtpbmcgbWF0dGVycywgYW5kIGl0IHRha2UgYSB3aGlsZSB0byBmaWd1cmUgb3V0IHdoYXQgaXMKCSAgICB0aGUgcHJvYmxlbSBhbmQgaG93IHRvIHNvbHZlIGl0KS4KCSAgICAKCSAgICBQbGVhc2UgdGVzdCBpdCB3aXRoIHlvdXIgcHJlZmVycmVkIHRhcmdldCBsYW5ndWFnZSwgYW5kCgkgICAgbm90IG9ubHkgdGhlIGNvZGUgZ2VuZXJhdGlvbiwgYnV0IHJlYWxseSBydW4gdGhlIGV4YW1wbGUKCSAgICBpbiB0aGUgdGVzdC1zdWl0ZSAoc3RhdGljLWNvbnN0LW1lbWJlci0yLmkpIGJlY2F1c2UgdGhlCgkgICAgcHJvYmxlbSBhbmQgdGhlIHNvbHV0aW9uIGNhbm5vdCBiZSAiZnVsbHkiIGFwcHJlY2lhdGVkCgkgICAgdW50aWwgeW91IHRyeSB0byBsb2FkIHRoZSBtb2R1bGUgYW5kIHJ1biBpdC4KCgkgICAgSW4gc29tZSB0YXJnZXQgbGFuZ3VhZ2VzIChweXRob24gc3BlY2lhbGx5KSwgdGhpcyBjYW4KCSAgICBwcm9kdWNlcyBhIGRpZmZlcmVuY2UgaW4gdGhlIHdheSB0aGF0IHRoZSBzdGF0aWMgY29uc3RhbnQKCSAgICBtZW1iZXJzICdhJyBhbmQgJ2InIGFyZSBpbnRlcm5hbGx5IHdyYXBwZWQuIEhvcGVmdWxseSwKCSAgICB0aGV5IHN0aWxsIGNhbiBiZSBhY2Nlc3NlZCBpbiB0aGUgc2FtZSB3YXkuCgoKMDgvMTEvMjAwMjogbW1hdHVzCgkgICAgW3B5dGhvbl0gTm93IHN0YXRpYyBjb25zdCBtZW1iZXJzIGNhbiBiZSBhY2Nlc3NlZCBpbiBhIG1vcmUKCSAgICBuYXR1cmFsIHdheSwgaWUsIGlmIHlvdSBoYXZlCgoJICAgIHN0cnVjdCBBCiAgICAgICAgICAgICB7CQkgCgkJdHlwZWRlZiB1bnNpZ25lZCBpbnQgdmlld2ZsYWdzOwoJCXN0YXRpYyBjb25zdCB2aWV3ZmxhZ3MgZm9yd2FyZF9maWVsZCA9IDA7CgkJc3RhdGljIGNvbnN0IHZpZXdmbGFncyBiYWNrd2FyZF9maWVsZDsKICAgICAgICAgICAgfTsgICAgIAoJICAgIAoJICAgIG5vdyB5b3UgY2FuIGRvOgoKCQlwcmludCBBLmJhY2t3YXJkX2ZpZWxkCgoJICAgIGFuZCBhbHNvCgoJICAgICAgICBhID0gQSgpCgkJcHJpbnQgYS5mb3J3YXJkX2ZpZWxkCgkJCgkgICAgTm90ZSB0aGF0IGlmIHRoZSBzdGF0aWMgY29uc3QgbWVtYmVycyBkb24ndCBoYXZlIGFuCgkgICAgaW5pdGlhbGl6ZXIgKGxpa2UgYmFja3dhcmRfZmllbGQpLCBzdGlsbCB5b3UgY2FuIGFjY2VzcwoJICAgIHRoZW0gaW4gdGhlIHNhbWUgd2F5IGluIHRoZSBweXRob24gc2lkZSwgYnV0IHRoZQoJICAgIGltcGxlbWVudGF0aW9uIGlzIGEgcXVpdGUgZGlmZmVyZW50OiBiYWNrd2FyZF9maWVsZCB3aWxsCgkgICAgc3RpbGwgYXBwZWFyIGluIHRoZSBjdmFyIGVudGl0eSwgYW5kIGFsc28sIHlvdSBhcmUgCgkgICAgcmVzcG9uc2libGUgdG8gaW5pdGlhbGl6ZSBpdCBpbiBzb21lIGNvZGUgdW5pdCwgYW5kIGxpbmsgaXQKCSAgICBwcm9wZXJseS4gZm9yd2FyZF9maWVsZCwgYnkgdGhlIG90aGVyIGhhbmQsIHdpbGwgbm90CgkgICAgYXBwZWFyIGluIHRoZSBjdmFyIGVudGl0eSBidXQgb25seSBhcyBhIEEgbWVtYmVyLCBzaW1pbGFyCgkgICAgdG8gd2hhdCBoYXBwZW4gd2l0aCBlbnVtIG9yICVjb25zdGFudCBtZW1iZXJzLgoKMDgvMTEvMjAwMjogbW1hdHVzCgkgICAgW3B5dGhvbl0gQ29tbW9uIGNvZGUgaW4gdGhlIF9fc2V0YXR0cl9fL19fZ2V0YXR0cl9fIG5vdwoJICAgIGdvZXMgdG8gdHdvICJmcmVlIiBtZXRob2RzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHByb3h5CgkgICAgZmlsZSwgZnJvbSB3aGVyZSBlYWNoIGNsYXNzIHVzZSBpdC4gVGhpcyBjaGFuZ2UgcmVkdWNlcwoJICAgIHRoZSBzaXplIG9mIHRoZSBwcm94eSBmaWxlLCBzcGVjaWFsbHkgaWYgeW91IHdyYXAgYSBsb3Qgb2YKCSAgICBzbWFsbCBjbGFzc2VzIGluIG9uZSBtb2R1bGUgKHVwIHRvIDMzJSBpbiBzb21lIGNhc2VzKSwKCSAgICBtYWtpbmcgaXQgZmFzdGVyIHRvIGxvYWQgdG9vLgoKMDgvMDkvMjAwMjogYmVhemxleQogICAgICAgICAgICBbUGVybDVdIElmIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGNoYXIgKiByZXR1cm5zIE5VTEwsCiAgICAgICAgICAgIHVuZGVmIGlzIHJldHVybmVkIHRvIHRoZSBQZXJsIGludGVycHJldGVyLgogCjA4LzA5LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4IHRvIGNvbnZlcnNpb24gb3BlcmF0b3JzIGFuZCBuYW1lc3BhY2VzLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgbmFtZXNwYWNlIG5zIHsKICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgRm9vIHsgfTsKICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgQmFyIHsKICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0b3IgRm9vKigpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICBJbiB0aGUgd3JhcHBlciBjb2RlLCBTV0lHIHdhcyB1c2luZyAtPm9wZXJhdG9yIEZvbyooKQogICAgICAgICAgICB3aGVuIGl0IHNob3VsZCBoYXZlIGJlZW4gdXNpbmcgLT5vcGVyYXRvciBuczo6Rm9vKigpLgoKICAgICAgICAgICAgTm90ZTogaWYgdXNpbmcgJXJlbmFtZSB3aXRoIGEgY29udmVyc2lvbiBvcGVyYXRvciwgeW91CiAgICAgICAgICAgIG1pZ2h0IGhhdmUgdG8gZG8gdGhpczoKCiAgICAgICAgICAgICAgICVyZW5hbWUodG9Gb29QdHIpIG5zOjpvcGVyYXRvciBuczo6Rm9vKigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgXl5eXiBub3RlIGV4dHJhIHF1YWxpZmllcgogICAgICAgICAgICAgICBuYW1lc3BhY2UgbnMgewogICAgICAgICAgICAgICAgICAgIC4uLgoKICAgICAgICAgICAgCjA4LzA5LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgW1B5dGhvbl0gTWlub3IgZW5oYW5jZW1lbnQgdG8gJ2NvbnN0JyB2YXJpYWJsZSBkZWNsYXJhdGlvbnMuIAogICAgICAgICAgICBOb3JtYWxseSBjb25zdCBkZWNsYXJhdGlvbnMgYXJlIHdyYXBwZWQgYXMgcmVhZC1vbmx5IHZhcmlhYmxlcwogICAgICAgICAgICBhY2Nlc3NpYmxlIG9ubHkgdGhyb3VnaCB0aGUgY3ZhciBhdHRyaWJ1dGUgKHNlZSBTV0lHLmh0bWwgZm9yCiAgICAgICAgICAgIGEgZGlzY3Vzc2lvbiBvZiB3aHkpLiAgSG93ZXZlciwgaW4gbWFueSBwcm9ncmFtcywgImNvbnN0IiAKICAgICAgICAgICAgZGVjbGFyYXRpb25zIG1heSBqdXN0IGJlIGNvbnN0YW50cy0tLW1ha2luZyB0aGUgY3Zhci4gYWNjZXNzCiAgICAgICAgICAgIGF3a3dhcmQuICBUbyBmaXggdGhpcywgImNvbnN0IiBkZWNsYXJhdGlvbnMgYXJlIG5vdyBhdmFpbGFibGUKICAgICAgICAgICAgYm90aCB0aHJvdWdoIGN2YXIuIGFuZCBhcyBhIHNpbXBsZSBuYW1lLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgIGNvbnN0IGludCBGT08gPSA0MjsKCiAgICAgICAgICAgIEluIFB5dGhvbjoKCiAgICAgICAgICAgICAgICAgPj4+IHByaW50IGV4YW1wbGUuY3Zhci5GT08KICAgICAgICAgICAgICAgICA0MgogICAgICAgICAgICAgICAgID4+PiBwcmludCBleGFtcGxlLkZPTwogICAgICAgICAgICAgICAgIDQyCgogICAgICAgICAgICBOb3RlOiBUaGVyZSBhcmUgY2FzZXMgd2hlcmUgdGhlIHZhbHVlIG9mIGEgImNvbnN0IiB2YXJpYWJsZQogICAgICAgICAgICBtaWdodCBjaGFuZ2UuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgY2hhciAqY29uc3QgQkFSID0gIkhlbGxvIFdvcmxkIjsKCiAgICAgICAgICAgIEluIHRoaXMgY2FzZSwgdGhlIHBvaW50ZXIgaXRzZWxmIGNhbiBub3QgY2hhbmdlLCBidXQgdGhlIAogICAgICAgICAgICBkYXRhIGJlaW5nIHBvaW50ZWQgdG8gY291bGQgYmUgbW9kaWZpZWQuICBJbiB0aGVzZSBzaXR1YXRpb25zLAogICAgICAgICAgICBjdmFyLkJBUiBzaG91bGQgYmUgYWNjZXNzZWQgdG8gb2J0YWluZWQgdGhlIGN1cnJlbnQgdmFsdWUuCgowOC8wOC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFtQeXRob25dIEZpeGVkIGdlbmVyYXRpb24gb2YgdGhlIHByb3h5IGNvZGUgKC5weSBmaWxlcykgdG8gbW9yZQogICAgICAgICAgICBjbG9zZWx5IGZvbGxvdyB0aGUgb3JkZXIgb2YgZGVjbGFyYXRpb25zIGFzIHRoZXkgYXBwZWFyIGluCiAgICAgICAgICAgIHRoZSAuaSBmaWxlLiAgIEluIHRoZSBwYXN0LCBhbGwgb2YgdGhlIGNsYXNzIHdyYXBwZXJzIGFwcGVhcmVkCiAgICAgICAgICAgIGZpcnN0LCBmb2xsb3dlZCBieSBmdW5jdGlvbiBzdHVicywgaW5zZXJ0ZWQgUHl0aG9uIGNvZGUsIGFuZAogICAgICAgICAgICBvdGhlciBkZXRhaWxzLgoKMDgvMDgvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBQcm94eSBtZXRob2QgX2RlbGV0ZSgpIGNoYW5nZWQgdG8gZGVsZXRlKCkuIFRoZXJlIHNob3VsZG4ndCBldmVyCiAgICAgICAgICAgIGJlIGEgd3JhcHBlZCBmdW5jdGlvbiBjYWxsZWQgZGVsZXRlKCkgYXMgaXQgaXMgYSBDKysga2V5d29yZCBhbmQgdGhlcmUKICAgICAgICAgICAgaXMgbm8gc3VjaCB0aGluZyBhcyBhIG1lbWJlciBmdW5jdGlvbiBpbiBDLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEpBVkEgTU9EVUxFICoqKgoKICAgICAgICAgICAgQmFja3dhcmRzIGNvbXBhdGliaWxpdHkgY2FuIGJlIGFjaGlldmVkIGJ5IGFkZGluZyB0aGUgZnVuY3Rpb24gYmFjayBpbgogICAgICAgICAgICBmb3IgYWxsIHByb3h5IGNsYXNzZXM6CiAgICAgICAgICAgICV0eXBlbWFwKGphdmFjb2RlKSBTV0lHVFlQRSAlewogICAgICAgICAgICAgIHB1YmxpYyB2b2lkIF9kZWxldGUoKSB7CiAgICAgICAgICAgICAgICBkZWxldGUoKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICV9CgogICAgICAgICAgICBKYXZhIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHN1bW1hcnkKICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICAgICAgICAgICBUaGVyZSBhcmUgYSBudW1iZXIgb2YgY2hhbmdlcyB0aGF0IGhhdmUgYmVlbiBtYWRlIGluIGltcHJvdmluZyB0aGUgSmF2YSBtb2R1bGUgCiAgICAgICAgICAgIGZvciB2ZXIgMS4zLjE0LiAgSWYgYXQgYWxsIHBvc3NpYmxlIGNoYW5nZSB5b3VyIGNvZGUgdG8gdGFrZSBhZHZhbnRhZ2VzIG9mIHRoZSAKICAgICAgICAgICAgaW1wcm92ZW1lbnRzLiBJZiB5b3Ugd2VyZSB1c2luZyBwcm94eSBjbGFzc2VzIHlvdSBtYXkgbm90IG5vdGljZSBhbnkgYmFja3dhcmRzIAogICAgICAgICAgICBjb21wYXRpYmlsaXR5IGlzc3Vlcy4gSGVyZSBpcyBhbiBleGFtcGxlIHdoaWNoIHdpbGwgaGVscCB3aXRoIG1vc3QgYmFja3dhcmRzIAogICAgICAgICAgICBjb21wYXRpYmlsaXR5IHByb2JsZW1zIHdoZXJlIGl0IGlzIG5vdCBwb3NzaWJsZSB0byBtb2RpZnkgdGhlIGNvZGUgdGhhdCB1c2VzCiAgICAgICAgICAgIHRoZSBnZW5lcmF0ZWQgb3V0cHV0OgoKICAgICAgICAgICAgUmVwbGFjZToKICAgICAgICAgICAgICAgICVtb2R1bGUgbW9kdWxlbmFtZQoKICAgICAgICAgICAgV2l0aDoKICAgICAgICAgICAgICAgICVtb2R1bGUgKGpuaWNsYXNzbmFtZT0ibW9kdWxlbmFtZSIpIG1vZHVsZW5hbWU7CiAgICAgICAgICAgICAgICAldHlwZW1hcChqYXZhY29kZSkgU1dJR1RZUEUgJXsKICAgICAgICAgICAgICAgICAgICBwdWJsaWMgbG9uZyBnZXRDUHRyJGphdmFjbGFzc25hbWUoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzd2lnQ1B0cjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgX2RlbGV0ZSgpIHsKICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICV9CiAgICAgICAgICAgICAgICAlcHJhZ21hKGphdmEpIGpuaWNsYXNzY2xhc3Ntb2RpZmllcnM9InB1YmxpYyI7CgogICAgICAgICAgICBUaGUgcHJveHkgY29uc3RydWN0b3JzIHRoYXQgdG9vayBwYXJhbWV0ZXJzIChsb25nIGNQdHIsIGJvb2xlYW4gY01lbW9yeU93bikKICAgICAgICAgICAgd2VyZSBwdWJsaWMgYW5kIGFyZSBub3cgcHJvdGVjdGVkLiBJZiB5b3Ugd2VyZSBtYWtpbmcgdXNlIG9mIHRoZXNlIHRoZW4geW91J2xsIAogICAgICAgICAgICBoYXZlIHRvIG1vZGlmeSB5b3VyIGNvZGUgYW5kIHRoZSBiZXN0IHNvbHV0aW9uIHdvdWxkIGJlIHRvIHVzZSB0aGUgbmV3IHR5cGUgCiAgICAgICAgICAgIHdyYXBwZXIgY2xhc3Nlcy4KCiAgICAgICAgICAgIFRoZSBvdGhlciBtYWluIGFyZWFzIGFyZSB0aGUgcHJhZ21hcyBhbmQgZ2xvYmFsIHZhcmlhYmxlIHdyYXBwaW5nLiBSZXBsYWNlIAogICAgICAgICAgICB0aGUgcHJhZ21hcyB3aXRoIG9uZSBvZiB0aGUgbmV3IGRpcmVjdGl2ZXMgb3IgdHlwZW1hcHMgbWVudGlvbmVkIGJlbG93IGFuZCB1c2UKICAgICAgICAgICAgJXJlbmFtZSBvbiB0aGUgdmFyaWFibGVzLgoKICAgICAgICAgICAgSWYgeW91IHdlcmUgbm90IHVzaW5nIHByb3h5IGNsYXNzZXMsIHlvdSB3aWxsIGhhdmUgdG8gZGVmaW5lIGEganN0eXBlIHR5cGVtYXAKICAgICAgICAgICAgYXMgd2VsbCBhcyBhIGp0eXBlIHR5cGVtYXAuCgowOC8wOC8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEZpeCBmb3Igd3JhcHBpbmcgdHdvIGRpbWVuc2lvbiBhcnJheSB2YXJpYWJsZXMuCgowOC8wNy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFtQeXRob24sVGNsXQogICAgICAgICAgICBPYmplY3QgbWFuYWdlbWVudCBub3cgaGFzIGEgbXVjaCBiZXR0ZXIgc2Vuc2Ugb2Ygb3duZXJzaGlwLgogICAgICAgICAgICBPd25lcnNoaXAgYml0cyBpcyBjaGFuZ2VkIHdoZW5ldmVyIGFuIG9iamVjdCBpcyBzdG9yZWQgaW4gYQogICAgICAgICAgICBnbG9iYWwgdmFyaWFibGUgb3Igc3RydWN0dXJlIG1lbWJlci4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgIHN0cnVjdCBGb28gewogICAgICAgICAgICAgICAgICAgIGludCB2YWw7CiAgICAgICAgICAgICAgICAgICAgRm9vICpuZXh0OwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIE5vdyBpbiBQeXRob24KCiAgICAgICAgICAgICAgID4+PiBmID0gRm9vKCkKICAgICAgICAgICAgICAgPj4+IGYudGhpc293bgogICAgICAgICAgICAgICAxCiAgICAgICAgICAgICAgID4+PiBnID0gRm9vKCkKICAgICAgICAgICAgICAgPj4+IGcubmV4dCA9IGYgICAgICAgICAgIyBBc3NpZ24gYSBwb2ludGVyCiAgICAgICAgICAgICAgID4+PiBmLnRoaXNvd24gICAgICAgICAgICMgTm90aWNlIG93bmVyc2hpcCBjaGFuZ2UKICAgICAgICAgICAgICAgMAogICAgICAgICAgICAgICA+Pj4KCiAgICAgICAgICAgIFRoaXMgc2NoZW1lIGlzIG1vc3RseSBhIGNvbnNlcnZhdGl2ZSBoZXVyaXN0aWMgZGVzaWduZWQgdG8gCiAgICAgICAgICAgIHByb3ZpZGUgc2VnbWVudGF0aW9uIGZhdWx0cy4gIEl0IGNvdWxkIGNhdXNlIGEgbWVtb3J5IGxlYWsKICAgICAgICAgICAgaWYgb3duZXJzaGlwIGlzIGNoYW5nZWQgdW5uZWNlc3NhcmlseS4gIEluIHRoaXMgY2FzZSwgeW91IGNhbgogICAgICAgICAgICBlaXRoZXIgd3JpdGUgYSB0eXBlbWFwICh0aGF0IGRvZXNuJ3QgY2hhbmdlIG93bmVyc2hpcCksIG9yCiAgICAgICAgICAgIG1hbnVhbGx5IHNldCB0aGUgdGhpc293biBhdHRyaWJ1dGUgYmFjayB0byAxLgoKMDgvMDcvMjAwMjogYmVhemxleQogICAgICAgICAgICBbVGNsXSBNYWpvciB1c2FiaWxpdHkgaW1wcm92ZW1lbnRzIHRvIHRoZSBvYmplY3QgaW50ZXJmYWNlLgogICAgICAgICAgICBTdXBwb3NlIHlvdSBoYWQgY29kZSBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgIHN0cnVjdCBGb28geyAKICAgICAgICAgICAgICAgICAgICAgaW50IHg7CiAgICAgICAgICAgICAgICAgICAgIGludCBzcGFtKCk7CiAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgdm9pZCAgYmxhaChGb28gKmYpOwoKICAgICAgICAgICAgSW4gcGFzdCB2ZXJzaW9ucyBvZiBTV0lHLCB5b3UgY291bGQgY3JlYXRlIG9iamVjdHMgYW5kIHVzZQogICAgICAgICAgICB0aGVtIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAlIEZvbyBmCiAgICAgICAgICAgICAgICAlIGYgY29uZmlndXJlIC14IDMKICAgICAgICAgICAgICAgICUgZiBzcGFtCiAgICAgICAgICAgICAgICAzNwogICAgCiAgICAgICAgICAgIFRoZSBvbmx5IHByb2JsZW0gaXMgdGhhdCBpZiB5b3UgdHJpZWQgdG8gY2FsbCBibGFoKCksIGl0IGRpZG4ndAogICAgICAgICAgICB3b3JrOgoKICAgICAgICAgICAgICAgICUgYmxhaCBmCiAgICAgICAgICAgICAgICBUeXBlIEVycm9yLiBFeHBlY3RlZCBfcF9Gb28KICAgICAgICAgICAgICAgICUKCiAgICAgICAgICAgIEluc3RlYWQsIHlvdSBoYWQgdG8gZG8gdGhpczoKCiAgICAgICAgICAgICAgICAlIGJsYWggW2YgY2dldCAtdGhpc10KICAKICAgICAgICAgICAgU1dJRyBub3cgYXV0b21hdGljYWxseSBleHRyYWN0cyB0aGUgLXRoaXMgcG9pbnRlciwgYXZvaWRpbmcgdGhpcwogICAgICAgICAgICBwcm9ibGVtLiAgVGhpcyBtZWFucyB0aGF0IHNheWluZyAiYmxhaCBmIiBpcyBwZXJmZWN0bHkgbGVnYWwgYW5kCiAgICAgICAgICAgIGV2ZXJ5dGhpbmcgd2lsbCBzdGlsbCB3b3JrIG5vcm1hbGx5LgoKICAgICAgICAgICAgQ2F2ZWF0OiBTaW5jZSBwb2ludGVyIHN0cmluZ3Mgc3RhcnQgd2l0aCBhIGxlYWRpbmcgdW5kZXJzY29yZSAoXyksCiAgICAgICAgICAgIGRvbid0IHVzZSB0aGlzIGluIG9iamVjdCBuYW1lcy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICUgRm9vIF9mIAogICAgICAgICAgICAgICAgJSBibGFoIF9mICAgICAgICAjIFBvdGVudGlhbCBjcmFzaAoKICAgICAgICAgICAgT2JqZWN0cyBub3cgaGF2ZSBhIC10aGlzb3duIGF0dHJpYnV0ZSB0aGF0IHNob3dzIHRoZSBvd25lcnNoaXAuCiAgICAgICAgICAgIFRoaXMgYnVpbGRzIHVwb24gdGhlIENIQU5HRVMgMTEvMjQvMjAwMSBlbnRyeS4KCjA4LzA3LzIwMDI6IHNhbWphbSwgU2FtIExpZGRpY290dAogICAgICAgICAgICBQcm9wZXJseSBpbXBsZW1lbnRlZCBwb2ludGVyIHN5c3RlbSB1c2luZyBwaHAgcmVzb3VyY2VzLgogICAgICAgICAgICBTdGlsbCBuZWVkIHRvIHdvcmsgb3V0IHdoZXRoZXIgb3Igbm90IHRvIGxldCBzY3JpcHQtdXNlcnMgY2FsbAogICAgICAgICAgICBkZXN0cnVjdG9ycyBkaXJlY3RseQoKMDgvMDYvMjAwMjogYmVhemxleQogICAgICAgICAgICBVcGdyYWRlZCBtenNjaGVtZSBtb2R1bGUgdG8gc3VwcG9ydCB2ZXJzaW9uIDIwMSBhbmQgYWRkZWQKICAgICAgICAgICAgb3ZlcmxvYWRpbmcgc3VwcG9ydC4KCjA4LzA1LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgQWRkZWQgcGFyc2luZyBzdXBwb3J0IGZvciBleHRyYSBncm91cGluZyAoaW4gdmVyeSBsaW1pdGVkIGNhc2VzKS4KICAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICAgIHR5cGVkZWYgaW50IChGdW5jUHRyKShpbnQsIGRvdWJsZSk7CgogICAgICAgICAgICAqKiogRVhQRVJJTUVOVEFMICoqKgogICAgICAgICAgICAKMDgvMDMvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIFVwZGF0ZXMgdG8gdHlwZW1hcHMuaSBhcyB0aG9zZSBkb25lIHByZXZpb3VzbHkgZm9yIFBlcmwsCiAgICAgICAgICAgIFB5dGhvbiBhbmQgVGNsIG1vZHVsZXMuIE5vdyBzdXBwb3J0cyByZWZlcmVuY2UgdHlwZXMgd2l0aCBJTlBVVCwKICAgICAgICAgICAgT1VUUFVUIGFuZCBJTk9VVCB0eXBlbWFwcy4KCjA4LzAyLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTmV3IGxpYnJhcnkgZmlsZSBjc3RyaW5nLmkgYWRkZWQuICBQcm92aWRlcyBtYWNyb3MgZm9yCiAgICAgICAgICAgIG1hbmlwdWxhdGluZyBjaGFyICogZGF0YS4KIAowOC8wMi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIERlcHJlY2F0ZWQgdGhlICVuZXcgZGlyZWN0aXZlLiAgVXNlICVuZXdvYmplY3QgaW5zdGVhZC4gIEZvcgogICAgICAgICAgICBleGFtcGxlOgoKICAgICAgICAgICAgICAgJW5ld29iamVjdCBmb287CiAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICBjaGFyICpmb28oKTsKCiAgICAgICAgICAgICVuZXdvYmplY3QgZm9sbG93cyB0aGUgc2FtZSBydWxlcyBhcyAlcmVuYW1lLCAlaWdub3JlLCAlZmVhdHVyZSwKICAgICAgICAgICAgZXRjLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgowOC8wMS8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIE5ldyBhdHRyaWJ1dGUgJ2puaWNsYXNzbmFtZScgZm9yIHRoZSBtb2R1bGUgZGlyZWN0aXZlIGFsbG93cyBhIHdheSBvZgogICAgICAgICAgICBjaGFuZ2luZyB0aGUgSk5JIGNsYXNzIG5hbWUgZnJvbSB0aGUgZGVmYXVsdCB3aGljaCB1c2VzIHRoZSBtb2R1bGVuYW1lIHdpdGggSk5JCiAgICAgICAgICAgIGFwcGVuZGVkIGFmdGVyIGl0LgoKICAgICAgICAgICAgICAgICVtb2R1bGUgKGpuaWNsYXNzbmFtZT0ibmFtZSIpIG1vZHVsZW5hbWUKCiAgICAgICAgICAgIElmICduYW1lJyBpcyB0aGUgc2FtZSBhcyAnbW9kdWxlbmFtZScgdGhlbiB0aGUgbW9kdWxlIGNsYXNzIG5hbWUgZ2V0cyBjaGFuZ2VkCiAgICAgICAgICAgIGZyb20gJ21vZHVsZW5hbWUnIHRvIG1vZHVsZW5hbWVNb2R1bGUuCgowOC8wMS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHByb2JsZW0gd2l0aCBmaWxlIGluY2x1ZGUgb3JkZXIuICBMYW5ndWFnZSBzcGVjaWZpYwogICAgICAgICAgICBkaXJlY3RvcmllcyBzaG91bGQgdGFrZSBwcmVjZWRlbmNlIG92ZXIgZ2VuZXJpYyBkaXJlY3Rvcmllcy4KICAgICAgICAgICAgRm9yIGV4YW1wbGU6ICAic3dpZ19saWIvcHl0aG9uL2Zvby5pIiBzaG91bGQgYmUgbG9hZGVkIGJlZm9yZQogICAgICAgICAgICAic3dpZ19saWIvZm9vLmkiLiAgICBJIHRob3VnaHQgdGhpcyB3YXMgdGhlIGNhc2UgYWxyZWFkeSwgYnV0CiAgICAgICAgICAgIGFwcGFyZW50bHkgaXQgaGFzIGJlZW4gYnJva2VuIGZvciBxdWl0ZSBzb21lIHRpbWUuCgowOC8wMS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEFkZGVkIHN0ZF9kZXF1ZS5pIGxpYnJhcnkgZmlsZS4gIFdvcmsgaW4gcHJvZ3Jlc3MuCgowOC8wMS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFtQeXRob24sVGNsLFBlcmxdCiAgICAgICAgICAgIEltcHJvdmVtZW50cyB0byB0eXBlbWFwcy5pLiAgSU5QVVQvSU5PVVQgdHlwZW1hcHMgcGVyZm9ybSBiZXR0ZXIKICAgICAgICAgICAgZXJyb3IgY2hlY2tpbmcuICBUeXBlbWFwcyBhcmUgbm93IHN1cHBsaWVkIGZvciByZWZlcmVuY2VzIGxpa2UgCiAgICAgICAgICAgIGludCAmT1VUUFVULCBkb3VibGUgJklOT1VULCBldGMuCiAgICAgICAgICAKMDgvMDEvMjAwMjogYmVhemxleQogICAgICAgICAgICBbUHl0aG9uXSBEZXByZWNhdGVkIHRoZSBUXyogYW5kIExfKiB0eXBlbWFwcyBpbiB0eXBlbWFwcy5pLgogICAgICAgICAgICBNdWx0aXBsZSByZXR1cm4gdmFsdWVzIGFyZSBhbHdheXMgcGxhY2VkIGluIGEgdHVwbGUuIERlcHJlY2F0ZWQKICAgICAgICAgICAgdGhlIEJPVEggdHlwZW1hcHMuICBUaGlzIGlzIG5vdyBJTk9VVCAoZS5nLiwgaW50ICpJTk9VVCkuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgUFlUSE9OIE1PRFVMRSAqKioKCjA4LzAxLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRGVwcmVjYXRlZCB0aGUgYXJyYXkuaSwgY2FycmF5LmksIGFuZCB0aW1lci5pIGxpYnJhcnkgZmlsZXMuCgowOC8wMS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIERlcHJlY2F0ZWQgdGhlIHBvaW50ZXIuaSBsaWJyYXJ5IGZpbGUuICBVc2UgY3BvaW50ZXIuaSBpbnN0ZWFkLgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKICAgICAgICAgICAgCjA4LzAxLzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gRm9yIGNvbnNpc3RlbmN5IHRoZSBnbG9iYWwgdmFyaWFibGUgZ2V0dGVycyBhbmQgc2V0dGVycyB1c2UgdGhlIEphdmFCZWFuIAogICAgICAgICAgICBwcm9wZXJ0eSBkZXNpZ24gcGF0dGVybiBsaWtlIG1lbWJlciB2YXJpYWJsZXMgYWx3YXlzIGhhdmUuIFRoaXMgbWVhbnMgaWYgeW91IGFyZSAKICAgICAgICAgICAgd3JhcHBpbmcgYSB2YXJpYWJsZSBjYWxsZWQgZm9vLCB0aGUgZ2V0dGVyIGlzIGNhbGxlZCBnZXRGb28oKSBhbmQgdGhlIHNldHRlciBpcyAKICAgICAgICAgICAgY2FsbGVkIHNldEZvbygpLiBCZWZvcmUgdGhlIHJlY2VudCBjaGFuZ2VzIHRvIHRoZSBKYXZhIG1vZHVsZSB0aGUgZ2V0dGVycyBhbmQgCiAgICAgICAgICAgIHNldHRlcnMgd2VyZSBjYWxsZWQgZ2V0X2ZvbygpIGFuZCBzZXRfZm9vKCkuIElmIHlvdSByZWFsbHkgd2FudCB0aGUgb3JpZ2luYWwgCiAgICAgICAgICAgIGZ1bmN0aW9uIG5hbWVzIHVzZSB0aGUgJXJlbmFtZSBkaXJlY3RpdmUgbGlrZSB0aGlzOiAlcmVuYW1lKF9mb28pIEZvbzsKCjA3LzMxLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgY2FzdGluZyBwcm9ibGVtIHdpdGggbXVsdGlwbGUgaW5oZXJpdGFuY2UuICBJZiB5b3UgaGFkIHRoaXMsCgogICAgICAgICAgICAgICAgICBjbGFzcyBmb28ge307CiAgICAgICAgICAgICAgICAgIGNsYXNzIGJhciA6IHB1YmxpYyBmb28ge307CiAgICAgICAgICAgICAgICAgIGNsYXNzIGJheiA6IHB1YmxpYyBmb28ge307CiAgICAgICAgICAgICAgICAgIGNsYXNzIHNwYW0gOiBwdWJsaWMgYmFyLCBwdWJsaWMgYmF6IHt9OwoKICAgICAgICAgICAgdGhlbiB0aGUgd3JhcHBlcnMgd291bGRuJ3QgY29tcGlsZSBkdWUgdG8gYW4gYW1iaWd1b3VzIGNhc3QuCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IEFydCBZZXJrZXMuCgowNy8zMC8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIER1ZSB0byBuZXcgc3RhdGljIHR5cGVjaGVja2luZyBhbGwgcG9pbnRlcnMgaGVsZCBpbiBhIEphdmEgbG9uZyBhcmUgcGFydCBvZiAKICAgICAgICAgICAgdGhlIGludGVybmFsIHdvcmtpbmdzIGFuZCB0aGlzIHBvaW50ZXIgdmFsdWUgaW4gdGhlIEphdmEgbG9uZyBoYXMgYmVjb21lIGFic3RyYWN0ZWQKICAgICAgICAgICAgZGF0YS4gVGhlIHR5cGUgd3JhcHBlciBjb25zdHJ1Y3RvciBhbmQgZ2V0Q1B0cigpIG1ldGhvZHMgYXJlIGFzIHN1Y2ggcHJvdGVjdGVkLgogICAgICAgICAgICBJZiB5b3UgbmVlZCB0byBtZXNzIGFyb3VuZCB3aXRoIHBvaW50ZXJzIGZyb20gSmF2YSBvciBmb3IgZXhhbXBsZSBjcmVhdGUgYSBwcm94eSAKICAgICAgICAgICAgY2xhc3Mgb3IgdHlwZSB3cmFwcGVyIGNsYXNzIGFyb3VuZCBhIG51bGwgcG9pbnRlciwgYWRkIGEgZnVuY3Rpb24vY29uc3RydWN0b3IgCiAgICAgICAgICAgIHRvIGRvIHNvIHdpdGggdGhlICVqYXZhY29kZSB0eXBlbWFwLiBZb3UgY2FuIGFsc28gbWFrZSBnZXRDUHRyKCkgcHVibGljIGFnYWluIHdpdGgKICAgICAgICAgICAgdGhlICVqYXZhZ2V0Y3B0ciB0eXBlbWFwLgoKMDcvMzAvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBGaXhlcyBmb3IgJXR5cGVtYXAoaWdub3JlKS4gSW4gcGFydGljdWxhciB3aGVuIGlnbm9yaW5nIHRoZSBsYXN0IHBhcmFtZXRlcgogICAgICAgICAgICBpbiBhIGZ1bmN0aW9uLiBBbHNvIGZvciBhbGwgcGFyYW1ldGVycyBpbiBjb25zdHJ1Y3RvcnMuIFRoZXNlIG1vZHMgaGF2ZSBhbHNvIGZpeGVkCiAgICAgICAgICAgIG11bHRpLWFyZ3VtZW50IHR5cGVtYXBzIGZvciBwcm94eSBjbGFzc2VzIC0gU0YgNTgxNzkxLgoKMDcvMzAvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSAlbmV3b2JqZWN0IChyZXBsYWNlbWVudCBmb3IgJW5ldykgbm93IGltcGxlbWVudGVkIGZvciBKYXZhLiAKCjA3LzI5LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgcHJvYmxlbSB3aXRoIHR5cGVtYXAgY29waWVzLCAlYXBwbHksIGFuZCAlY2xlYXIgaW5zaWRlCiAgICAgICAgICAgIEMrKyBuYW1lc3BhY2VzLgoKMDcvMjgvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBUaGUgSk5JIGNsYXNzIG5vdyBoYXMgcGFja2FnZSBhY2Nlc3MgYXMgdGhlIGNsYXNzIG1vZGlmaWVyCiAgICAgICAgICAgIGhhcyBiZWVuIGNoYW5nZWQgZnJvbSAicHVibGljIiB0byBub3RoaW5nLiBUaGlzIGhhcyBiZWVuIGRvbmUKICAgICAgICAgICAgYXMgdGhpcyBjbGFzcyBpcyBub3cgbW9yZSBmb3IgdGhlIGludGVybmFsIHdvcmtpbmdzIG9mIFNXSUcgc2luY2UgdGhlIG1vZHVsZQogICAgICAgICAgICBjbGFzcyBoYXMgc3RhdGljIHR5cGUgY2hlY2tpbmcgZm9yIGFsbCB0eXBlcy4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBKQVZBIE1PRFVMRSAqKioKCiAgICAgICAgICAgIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGNhbiBiZSBhY2hpZXZlZCBieSB1c2luZyB0aGUgJWpuaWNsYXNzY2xhc3Ntb2RpZmllciAKICAgICAgICAgICAgcHJhZ21hIHRvIGNoYW5nZSBpdCBiYWNrIHRvICJwdWJsaWMiLgoKMDcvMjgvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBQcm94eS9TaGFkb3cgY2xhc3NlcyBhcmUgZ2VuZXJhdGVkIGJ5IGRlZmF1bHQuIFRoZSAtcHJveHkgYW5kIAogICAgICAgICAgICAtc2hhZG93IGNvbW1hbmQgbGluZSBvcHRpb25zIGFyZSBkZXByZWNhdGVkLiBJZiB5b3Ugd2FudCB0byB1c2UgdGhlIAogICAgICAgICAgICBsb3ctbGV2ZWwgZnVuY3Rpb25hbCBpbnRlcmZhY2UgdGhlbiB1c2UgdGhlIG5ldyAtbm9wcm94eSBjb21tYW5kbGluZSBvcHRpb24uCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgSkFWQSBNT0RVTEUgKioqCgowNy8yOC8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIFJlbWFpbmluZyBwcmFnbWFzIHNoYWtldXAuIFRoZXNlIHdlcmUgdGhlIHJlbWFpbmluZyBwcmFnbWFzIGFuZCB0aGVpcgogICAgICAgICAgICBuZXcgbmFtZXMgd2hlcmUgY2hhbmdlZDoKCiAgICAgICAgICAgIG1vZHVsZWJhc2UKICAgICAgICAgICAgbW9kdWxlY29kZQogICAgICAgICAgICBtb2R1bGVjbGFzc21vZGlmaWVycwogICAgICAgICAgICBtb2R1bGVpbXBvcnQgPT4gbW9kdWxlaW1wb3J0cwogICAgICAgICAgICBtb2R1bGVpbnRlcmZhY2UgPT4gbW9kdWxlaW50ZXJmYWNlcwoKICAgICAgICAgICAgVGhlIG1vZHVsZWltcG9ydHMgd29ya3Mgc2xpZ2h0bHkgZGlmZmVyZW50bHkgdG8gaG93IHRoZSBtb2R1bGVpbXBvcnQgcHJhZ21hIHdvcmtlZC4gCiAgICAgICAgICAgIE5vdyBpdCBhY3R1YWxseSB0YWtlcyBjb2RlIHdoaWNoIGdldHMgcGxhY2VkIGJlZm9yZSB0aGUgY2xhc3MgZGVmaW5pdGlvbiBzbyB0aGUgCiAgICAgICAgICAgIHdob2xlIGltcG9ydCBzdGF0ZW1lbnQgaGFzIHRvIGJlIGdpdmVuLCBmb3IgZXhhbXBsZToKCiAgICAgICAgICAgICVwcmFnbWEoamF2YSkgbW9kdWxlaW1wb3J0cz0lewogICAgICAgICAgICBpbXBvcnQgamF2YS5pby4qOwogICAgICAgICAgICBpbXBvcnQgamF2YS5tYXRoLio7CiAgICAgICAgICAgICV9CgogICAgICAgICAgICBUaGUgbW9kdWxlaW50ZXJmYWNlcyBpcyBzbGlnaHRseSBkaWZmZXJlbnQgdG8gdGhlIG9sZCBtb2R1bGVpbnRlcmZhY2UgaW4gdGhhdCBpZiAKICAgICAgICAgICAgbW9yZSB0aGFuIG9uZSBpbnRlcmZhY2UgaXMgcmVxdWlyZWQgdGhleSBtdXN0IGJlIGNvbW1hIHNlcGFyYXRlZCBpbiBvbmUgdXNlIG9mIAogICAgICAgICAgICB0aGUgcHJhZ21hLCBmb3IgZXhhbXBsZToKCiAgICAgICAgICAgICVwcmFnbWEoamF2YSkgbW9kdWxlaW50ZXJmYWNlcz0iU2VyaWFsaXphYmxlLCBNeUludGVyZmFjZSIKCiAgICAgICAgICAgIFRoZXNlIGxhc3QgdHdvIHByYWdtYXMgYXJlIGNvbnNpc3RlbnQgd2l0aCB0aGUgamF2YWludGVyZmFjZXMgYW5kIGphdmFpbXBvcnRzIAogICAgICAgICAgICB0eXBlbWFwLgoKICAgICAgICAgICAgQSBzaW1pbGFyIHNldCBvZiBwcmFnbWFzIGhhcyBiZWVuIGludHJvZHVjZWQsIG5hbWVseToKCiAgICAgICAgICAgIGpuaWNsYXNzYmFzZQogICAgICAgICAgICBqbmljbGFzc2NvZGUKICAgICAgICAgICAgam5pY2xhc3NjbGFzc21vZGlmaWVycwogICAgICAgICAgICBqbmljbGFzc2ltcG9ydAogICAgICAgICAgICBqbmljbGFzc2ludGVyZmFjZQoKICAgICAgICAgICAgVGhlc2Ugd29yayBpbiB0aGUgc2FtZSB3YXkgYXMgdGhlaXIgbW9kdWxlIGNvdW50ZXJwYXJ0cy4gTm90ZSB0aGF0IHByZXZpb3VzbHkKICAgICAgICAgICAgdGhlIG1vZHVsZVhYWCBwcmFnbWFzIHdvcmtlZCBvbiB0aGUgb2xkIG1vZHVsZSBjbGFzcyB3aGljaCBpcyBub3cgY2FsbGVkIHRoZQogICAgICAgICAgICBKTkkgY2xhc3MgKHRoZSBjbGFzcyB3aXRoIHRoZSBuYXRpdmUgZnVuY3Rpb25zKS4gVGhlIGpuaWNsYXNzWFhYIHByYWdtYXMgbm93IAogICAgICAgICAgICB3b3JrIG9uIHRoZSBuZXcgbW9kdWxlIGNsYXNzICh0aGUgY2xhc3MgdGhhdCBoYXMgYWxsIHRoZSBnbG9iYWwgZnVuY3Rpb25zIGFuZAogICAgICAgICAgICBnbG9iYWwgdmFyaWFibGUgZ2V0dGVycyBhbmQgc2V0dGVycyB3aGVuIHVzaW5nIHByb3h5IGNsYXNzZXMsIHBsdXMgYWxsIG90aGVyCiAgICAgICAgICAgIHJlbWFpbmluZyBmdW5jdGlvbnMgd2hlbiB1c2luZyB0aGUgbG93LWxldmVsIHByb2NlZHVyYWwgaW50ZXJmYWNlKS4KCiAgICAgICAgICAgIEluIHN1bW1hcnkgdGhlIGNvbnRlbnRzIG9mIHRoZSBwcmFnbWFzIG1ha2UgdXAgYSBjbGFzcyBsaWtlIHRoaXM6CgogICAgICAgICAgICA8am5pY2xhc3NpbXBvcnRzPgogICAgICAgICAgICA8am5pY2xhc3Ntb2RpZmllcnM+IGNsYXNzIG1vZHVsZW5hbWUgZXh0ZW5kcyA8am5pY2xhc3NiYXNlPiBpbXBsZW1lbnRzIDxqbmljbGFzc2ludGVyZmFjZXM+IHsKICAgICAgICAgICAgICAgIDxqbmljbGFzc2NvZGU+CiAgICAgICAgICAgICAgICAuLi4gU1dJRyBnZW5lcmF0ZWQgZnVuY3Rpb25zIC4uLgogICAgICAgICAgICB9Cn0KICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEpBVkEgTU9EVUxFICoqKgoKMDcvMjgvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBEZXByZWNhdGVkIG1vZHVsZW1ldGhvZG1vZGlmaWVycyBwcmFnbWEgYW5kIHJlcGxhY2VkIHdpdGggCiAgICAgICAgICAgIGEgYmV0dGVyICVmZWF0dXJlIGJhc2VkIGRpcmVjdGl2ZSBjYWxsZWQgJWphdmFtZXRob2Rtb2RpZmllcnMuCiAgICAgICAgICAgIEEgdXNlZnVsIGV4YW1wbGUgd291bGQgYmUgZm9yIHN5bmNocm9uaXNhdGlvbiBpbiBtdWx0aS10aHJlYWRlZCBhcHBzOgoKICAgICAgICAgICAgJWphdmFtZXRob2Rtb2RpZmllcnMgZm9vKGludCBhKSAicHVibGljIHN5bmNocm9uaXplZCI7CgogICAgICAgICAgICBDaGFuZ2VzIHRoaXMgZnVuY3Rpb24gZnJvbSB0aGUgZGVmYXVsdCAoInB1YmxpYyIpIHRvICJwdWJsaWMgc3luY2hyb25pemVkIi4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBKQVZBIE1PRFVMRSAqKioKCjA3LzI2LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgU2V2ZXJhbCBkaXJlY3RpdmVzIG5vdyBhbGxvdyBvcHRpb25hbCBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMuCiAgICAgICAgICAgIFRoZXNlIGluY2x1ZGU6CgogICAgICAgICAgICAgICAgJW1vZHVsZShuYW1lPSJ2YWx1ZSIsIG5hbWU9InZhbHVlIiwgLi4uKSBtb2R1bGVuYW1lCiAgICAgICAgICAgICAgICAlaW1wb3J0KG5hbWU9InZhbHVlIiwgLi4uKSAiZmlsZW5hbWUuaSIKICAgICAgICAgICAgICAgICVleHRlbmQobmFtZT0idmFsdWUiLCAuLi4pIGNsYXNzbmFtZSB7CiAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFRoZXNlIGN1cnJlbnRseSBoYXZlIG5vIGVmZmVjdCBhbmQgYXJlIHJlc2VydmVkIGZvcgogICAgICAgICAgICBmdXR1cmUgZXhwYW5zaW9uLgogICAgICAgICAgICAgICAKMDcvMjYvMjAwMjogYmVhemxleQogICAgICAgICAgICBFbmhhbmNlbWVudHMgdG8gc21hcnQtcG9pbnRlciBoYW5kbGluZy4gIFNXSUcgb25seSBwcm92aWRlcwogICAgICAgICAgICBleHRyYSBzdXBwb3J0IGZvciBhIHNtYXJ0LXBvaW50ZXIgaWYgb3BlcmF0b3ItPigpIHJldHVybnMKICAgICAgICAgICAgYSBwcm9wZXIgcG9pbnRlci4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICBGb28gKm9wZXJhdG9yLT4oKTsKCiAgICAgICAgICAgIElmIG9wZXJhdG9yLT4oKSByZXR1cm5zIGFuIG9iamVjdCBieSB2YWx1ZSBvciByZWZlcmVuY2UsCiAgICAgICAgICAgIHRoZW4gU1dJRyBleGFtaW5lcyB0aGUgcmV0dXJuZWQgb2JqZWN0IHRvIHNlZSBpZiBpdCBhbHNvCiAgICAgICAgICAgIGltcGxlbWVudHMgb3BlcmF0b3ItPigpLiAgSWYgc28sIFNXSUcgY2hhc2VzIG9wZXJhdG9yLT4oKQogICAgICAgICAgICB1bnRpbCBpdCBjYW4gZmluZCBvbmUgdGhhdCByZXR1cm5zIGEgcG9pbnRlci4gIFRoaXMgYWxsb3dzCiAgICAgICAgICAgIGNhc2VzIGxpa2UgdGhpcyB0byB3b3JrOgoKICAgICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgdm9pZCBibGFoKCk7CiAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgY2xhc3MgQmFyIHsKICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgRm9vICpvcGVyYXRvci0+KCk7CiAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICBjbGFzcyBTcGFtIHsKICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgQmFyIG9wZXJhdG9yLT4oKTsKICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgPj4+IHMgPSBTcGFtKCkKICAgICAgICAgICAgICAgICA+Pj4gcy5ibGFoKCkgICAgICAjIEludm9rZXMgRm9vOjpibGFoKCkKCiAgICAgICAgICAgIFRoZSBzLmJsYWgoKSBjYWxsIGFjdHVhbGx5IGludm9rZXM6CgogICAgICAgICAgICAgICAgICAoKHMub3BlcmF0b3ItPigpKS5vcGVyYXRvci0+KCkpLT5ibGFoKCk7CiAKMDcvMjYvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBhIGJ1ZyB3aXRoIHR5cGVkZWYgYW5kIHJlZmVyZW5jZXMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgdHlwZWRlZiBGb28gJiBGb29SZWY7CiAgICAgICAgICAgICAgICAgRm9vUmVmIGJsYWgoKTsKCiAgICAgICAgICAgIFByZXZpb3VzIHZlcnNpb25zIG9mIFNXSUcgZ2VuZXJhdGVkIGNvZGUgdGhhdCB3b3VsZG4ndAogICAgICAgICAgICBjb21waWxlLgoKMDcvMjUvMjAwMjogYmVhemxleQogICAgICAgICAgICBXcmFwcGluZyBvZiBzdGF0aWMgbWV0aG9kcyBoYXMgYmVlbiBpbXByb3ZlZCBpbiBwcm94eSBjbGFzc2VzLiAgSW4gb2xkZXIKICAgICAgICAgICAgdmVyc2lvbnMgb2YgU1dJRywgaWYgeW91IGhhZCB0aGlzOgoKICAgICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICBzdGF0aWMgdm9pZCBiYXIoKTsKICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFRoZSBzdGF0aWMgbWV0aG9kIHdhcyBvbmx5IGF2YWlsYWJsZSBhcyBhIGZ1bmN0aW9uIEZvb19iYXIoKS4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAgPj4+IEZvb19iYXIoKQoKICAgICAgICAgICAgTm93LCB0aGUgc3RhdGljIG1ldGhvZCBjYW4gYWxzbyBiZSBpbnZva2VkIHRocm91Z2ggYW4gaW5zdGFuY2UgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgICAgPj4+IGYgPSBGb28oKQogICAgICAgICAgICAgICAgICA+Pj4gZi5iYXIoKSAgICAgICAgIyBJbnZva2VzIHN0YXRpYyBtZXRob2QKCiAgICAgICAgICAgIFRoaXMgd29ya3Mgd2l0aCBhbGwgdmVyc2lvbnMgb2YgUHl0aG9uLiAgQWRkaXRpb25hbGx5LCBmb3IgUHl0aG9uLTIuMiwKICAgICAgICAgICAgdGhlIHN0YXRpYyBtZXRob2QgY2FuIGJlIGludm9rZWQgYXM6CgogICAgICAgICAgICAgICAgICA+Pj4gRm9vLmJhcigpCgogICAgICAgICAgICBUaGUgb2xkLXN0eWxlIGZ1bmN0aW9uIGlzIHN0aWxsIHN1cHBvcnQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LiBJZgogICAgICAgICAgICB5b3UgY2FyZSBhYm91dCBtYWtpbmcgeW91ciBjb2RlIGFjcm9zcyBkaWZmZXJlbnQgdmVyc2lvbnMgb2YgUHl0aG9uLAogICAgICAgICAgICBlaXRoZXIgdXNlIEZvb19iYXIoKSBvciBhY2Nlc3MgdGhlIG1ldGhvZCB0aHJvdWdoIGFuIGluc3RhbmNlLgogCjA3LzI1LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgQ2hhbmdlcyB0byB0aGUgUHl0aG9uIG1vZHVsZS4gIFByb3h5IGNsYXNzZXMgbm93IHV0aWxpemUgbmV3IFB5dGhvbi0yLjIKICAgICAgICAgICAgZmVhdHVyZXMgaW5jbHVkaW5nIHByb3BlcnRpZXMgYW5kIHN0YXRpYyBtZXRob2RzLiAgSG93ZXZlciwgdGhlc2UgZmVhdHVyZXMKICAgICAgICAgICAgYXJlIHN1cHBvcnRlZCBpbiBhIHdheSB0aGF0IHByb3ZpZGVzIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHdpdGggb2xkZXIKICAgICAgICAgICAgUHl0aG9uIHZlcnNpb25zLiAgSW4gb3RoZXIgd29yZHMsIHByb3h5IGNsYXNzZXMgd29yayB3aXRoIGFsbCB2ZXJzaW9ucwogICAgICAgICAgICBvZiBQeXRob24gYW5kIG9ubHkgdXNlIG5ldyBmZWF0dXJlcyB3aGVuIHJ1bm5pbmcgb24gUHl0aG9uLTIuMi4KCgowNy8yNS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE1vZGlmaWVkICVleHRlbmQgc28gdGhhdCBvdmVybG9hZGVkIG1ldGhvZHMgY2FuIGJlIGFkZGVkLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgJWV4dGVuZCBGb28gewogICAgICAgICAgICAgICAgICAgICB2b2lkIGJhcihpbnQgeCkgeyB9OwogICAgICAgICAgICAgICAgICAgICB2b2lkIGJhcihjaGFyICpzKSB7IH07CiAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgVGhpcyB3b3JrcyB3aXRoIGJvdGggQysrICphbmQqIEMuCgowNy8yNC8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIE1vcmUgbmV3IHR5cGVtYXBzIHNvIHRoYXQgdGhlIEphdmEgcHJveHkgY2xhc3NlcyBhbmQgdHlwZSB3cmFwcGVyIGNsYXNzZXMKICAgICAgICAgICAgY2FuIGJlIGZ1cnRoZXIgdGFpbG9yZWQgYnkgdXNlcnMuIFRoZXNlIGFyZSB0aGUgZGVmYXVsdCBjb2RlIGZvciBnZW5lcmF0aW5nIHRoZSAKICAgICAgICAgICAgZmluYWxpemUoKSBtZXRob2RzIChwcm94eSBjbGFzc2VzIG9ubHkpIGFuZCB0aGUgZ2V0Q1B0cigpIG1ldGhvZHMgZm9yIHByb3h5IAogICAgICAgICAgICBjbGFzc2VzIGFuZCB0eXBlIHdyYXBwZXIgY2xhc3NlczoKCiAgICAgICAgICAgICV0eXBlbWFwKGphdmFmaW5hbGl6ZSkgU1dJR1RZUEUgJXsKICAgICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpIHsKICAgICAgICAgICAgICAgIF9kZWxldGUoKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICV9CiAgICAgICAgICAgIAogICAgICAgICAgICAldHlwZW1hcChqYXZhZ2V0Y3B0cikgU1dJR1RZUEUsIFNXSUdUWVBFICosIFNXSUdUWVBFICYsIFNXSUdUWVBFIFtdICV7CiAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBsb25nIGdldENQdHIoJGphdmFjbGFzc25hbWUgb2JqKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gb2JqLnN3aWdDUHRyOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgJX0KCiAgICAgICAgICAgIFRoZSBqYXZhZ2V0Y3B0ciB0eXBlbWFwIHdpbGwgZW5hYmxlIHVzZXJzIHRvIGhhbmRsZSBKYXZhIG51bGwgYnkgb3ZlcnJpZGluZwogICAgICAgICAgICB0aGlzIHR5cGVtYXAgLSBhIHJlcXVlc3RlZCBmZWF0dXJlLgoKICAgICAgICAgICAgVGhlIC1ub2ZpbmFsaXplIGNvbW1hbmRsaW5lIG9wdGlvbiBoYXMgYmVlbiBkZXByZWNhdGVkLiBUaGUgamF2YWZpbmFsaXplCiAgICAgICAgICAgIHR5cGVtYXAgaXMgbW9yZSBwb3dlcmZ1bCBhcyBpdCB3aWxsIGFsbG93IHRoZSByZW1vdmFsIG9mIHRoZSBmaW5hbGl6ZSBtZXRob2RzIAogICAgICAgICAgICBmb3IgYWxsIG9yIGFueSBvbmUgb3IgbW9yZSBwYXJ0aWN1bGFyIHByb3h5IGNsYXNzLgoKMDcvMjMvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBUaGUgZ2V0Q1B0clhYWCgpIGZ1bmN0aW9uIGhhcyBiZWVuIGNoYW5nZWQgdG8gYSBzdGF0aWMgZnVuY3Rpb24gYW5kCiAgICAgICAgICAgIGlzIG5vdyBvZiB0aGUgZm9ybToKCiAgICAgICAgICAgIHByb3RlY3RlZCBzdGF0aWMgbG9uZyBnZXRDUHRyKFhYWCBvYmopIHsuLi59CgogICAgICAgICAgICBUaGlzIGlzIGEgcmVxdWVzdGVkIGNoYW5nZSB3aGljaCB3aWxsIGFsbG93IEphdmEgbnVsbCBwb2ludGVycyB0byBiZSB1c2VkIGFzIG51bGwKICAgICAgICAgICAgY2FuIGJlIHBhc3NlZCBpbiBmb3Igb2JqLiBIb3dldmVyLCB0byBhY2hpZXZlIHRoaXMgdGhlIGFwcHJvcHJpYXRlIGNvZGUgbXVzdCBiZQogICAgICAgICAgICB3cml0dGVuIHVzaW5nIHRoZSBuZXcgamF2YWdldGNwdHIgdHlwZW1hcCBkaXJlY3RpdmUuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgSkFWQSBNT0RVTEUgKioqCgogICAgICAgICAgICBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBjYW4gYmUgYWNoaWV2ZWQgYnkgYWRkaW5nIHRoaXMgZnVuY3Rpb24gYmFjayBpbiB1c2luZyB0aGUKICAgICAgICAgICAgbmV3IGphdmFjb2RlIHR5cGVtYXA6CgogICAgICAgICAgICAldHlwZW1hcChqYXZhY29kZSkgU1dJR1RZUEUgJXsKCiAgICAgICAgICAgICAgLy8gU1dJRy0xLjMuMTIgYW5kIFNXSUctMS4zLjEzCiAgICAgICAgICAgICAgcHVibGljIGxvbmcgZ2V0Q1B0ciRqYXZhY2xhc3NuYW1lKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHN3aWdDUHRyOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAvLyBTV0lHLTEuMy4xMSBhbmQgZWFybGllcgogICAgICAgICAgICAgIHB1YmxpYyBsb25nIGdldENQdHIoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gc3dpZ0NQdHI7CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgJX0KCgowNy8yMy8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIE5ldyBkaXJlY3RpdmUgdG8gY29udHJvbCBjb25zdGFudCBjb2RlIGdlbmVyYXRpb24gLSAlamF2YWNvbnN0LgogICAgICAgICAgICBUaGUgZGVmYXVsdCBoYW5kbGluZyBmb3IgaGFuZGxpbmcgY29uc3RhbnRzIGlzIHRvIGdldCB0aGUgdmFsdWUgdGhyb3VnaAogICAgICAgICAgICBhIEpOSSBjYWxsLCBlZwoKICAgICAgICAgICAgI2RlZmluZSBZRUxMT1cgNQogICAgICAgICAgICAjZGVmaW5lIEJJRyAxMjM0TEwKCiAgICAgICAgICAgIHJlc3VsdHMgaW46CgogICAgICAgICAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBZRUxMT1cgPSBtb2R1bGVuYW1lLmdldF9ZRUxMT1coKTsKICAgICAgICAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBsb25nIEJJRyA9IG1vZHVsZW5hbWUuZ2V0X0JJRygpOwoKICAgICAgICAgICAgRWFybGllciB2ZXJzaW9ucyBvZiB0aGUgSmF2YSBtb2R1bGUgaW5pdGlhbGlzZWQgdGhlIHZhbHVlIHVzaW5nIHRoZSBDIHZhbHVlOgoKICAgICAgICAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgWUVMTE9XID0gNTsKICAgICAgICAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBsb25nIEJJRyA9IDEyMzRMTDsKCiAgICAgICAgICAgIFRoaXMgd29ya3MgaW4gbW9zdCBjYXNlcywgYnV0IHRoZSB2YWx1ZSBmb3IgQklHIHdvbid0IGNvbXBpbGUgYXMgMTIzNExMIGlzIG5vdAogICAgICAgICAgICB2YWxpZCBKYXZhIGNvZGUgYW5kIHRoaXMgaXMgb25lIG9mIHRoZSByZWFzb25zIHdoeSB0aGUgZGVmYXVsdCBpcyBub3cgdG8gZ2V0IHRoZSAKICAgICAgICAgICAgdmFsdWVzIHRocm91Z2ggYSBKTkkgY2FsbC4gVGhlIHNpZGUgZWZmZWN0IGlzIHRoYXQgdGhlc2UgJ2NvbnN0YW50cycgY2Fubm90IGJlIHVzZWQgCiAgICAgICAgICAgIGluIHN3aXRjaCBzdGF0ZW1lbnRzLiBUaGUgJWphdmFjb25zdCBkaXJlY3RpdmUgYWxsb3dzIG9uZSB0byBzcGVjaWZ5IHRoZQogICAgICAgICAgICB3YXkgdGhlIGNvbnN0YW50IHZhbHVlIGlzIGluaXRpYWxpc2VkIGFuZCB3b3JrcyBsaWtlIG90aGVyICVmZWF0dXJlCiAgICAgICAgICAgIGRpcmVjdGl2ZXMsIGVnCgogICAgICAgICAgICAlamF2YWNvbnN0KDApOyAgICAgLy8gYWxsIGNvbnN0YW50cyBmcm9tIHRoaXMgcG9pbnQgb24gYXJlIGluaXRpYWxpc2VkIHVzaW5nIHRoZSBDIHZhbHVlCiAgICAgICAgICAgICVqYXZhY29uc3QoMSkgQklHOyAvLyBqdXN0IEJJRyBpbml0aWFsaXNlZCB1c2luZyBKTkkgY2FsbCAobXVzdCBiZSBwYXJzZWQgYmVmb3JlIEJJRyBpcyBkZWZpbmVkKQoKMDcvMjMvMjAwMjogYmVhemxleQogICAgICAgICAgICAqKiogSU1QT1JUQU5UIENIQU5HRVMgVE8gVEhFIFBZVEhPTiBNT0RVTEUgKioqCgogICAgICAgICAgICAoMSkgVGhlIFB5dGhvbiBtb2R1bGUgbm93IGVuYWJsZXMgc2hhZG93L3Byb3h5IGNsYXNzZXMgYnkgZGVmYXVsdC4KICAgICAgICAgICAgVGhpcyBtZWFucyB0aGF0IHR3byBmaWxlcyBhcmUgYWx3YXlzIGNyZWF0ZWQgYnkgU1dJRy4gIEZvcgogICAgICAgICAgICBpbnN0YW5jZSwgaWYgeW91IGhhdmUgdGhpczoKCiAgICAgICAgICAgICAgICAgLy8gZmlsZTogZm9vLmkKICAgICAgICAgICAgICAgICAlbW9kdWxlIGZvbwogICAgICAgICAgICAgICAgIC4uLgoKICAgICAgICAgICAgVGhlbiBzd2lnIGdlbmVyYXRlcyB0d28gZmlsZXMgImZvb193cmFwLmMiIGFuZCAiZm9vLnB5Ii4KCiAgICAgICAgICAgICgyKSBUaGUgbmFtZSBvZiB0aGUgbG93LWxldmVsIEMgZXh0ZW5zaW9uIG1vZHVsZSBoYXMgYmVlbiBjaGFuZ2VkCiAgICAgICAgICAgIHRvIHN0YXJ0IHdpdGggYSBsZWFkaW5nIHVuZGVyc2NvcmUuICAgVGhpcyBtZWFucyB0aGF0IHlvdSBoYXZlCiAgICAgICAgICAgIHRvIGNvbXBpbGUgdGhlIG1vZHVsZSBhcyBmb2xsb3dzOgoKICAgICAgICAgICAgICAgICQgY2MgLWMgLUkvdXNyL2xvY2FsL2luY2x1ZGUvcHl0aG9uMi4yIGZvb193cmFwLmMKICAgICAgICAgICAgICAgICQgY2MgLXNoYXJlZCBmb29fd3JhcC5vICQoT0JKUykgLW8gX2Zvby5zbwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeXl5eCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGUgZXh0cmEgdW5kZXJzY29yZQoKICAgICAgICAgICAgVGhpcyBuYW1pbmcgc2NoZW1lIGlzIGNvbnNpc3RlbnQgd2l0aCBvdGhlciBQeXRob24gbW9kdWxlcyB0aGF0CiAgICAgICAgICAgIHV0aWxpemUgZXh0ZW5zaW9uIGNvZGUuICBGb3IgaW5zdGFuY2UsIHRoZSBzb2NrZXQgbW9kdWxlIGNvbnNpc3RzCiAgICAgICAgICAgIG9mICJfc29ja2V0LnNvIiBhbmQgInNvY2tldC5weSIuICBJbiBwcmV2aW91cyB2ZXJzaW9ucyBvZiBTV0lHLAogICAgICAgICAgICB0aGUgc2hhcmVkIG9iamVjdCBmaWxlIHdhcyBuYW1lZCAiZm9vY21vZHVsZS5zbyIuCgogICAgICAgICAgICAoMykgQSBuZXcgZGlyZWN0aXZlIGNhbiBiZSB1c2VkIHRvIGluc2VydCBQeXRob24gY29kZSBpbnRvCiAgICAgICAgICAgIHRoZSBjb3JyZXNwb25kaW5nIC5weSBmaWxlLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgJXB5dGhvbmNvZGUgJXsKICAgICAgICAgICAgICAgIGRlZiBmb28oKToKICAgICAgICAgICAgICAgICAgICBwcmludCAiSGVsbG8gV29ybGQiCiAgICAgICAgICAgICAgICAlfQoKICAgICAgICAgICAgIFRoaXMgZGlyZWN0aXZlIGFsbG93cyB5b3UgdG8gY3JlYXRlIG1vZHVsZXMgYXMgYSBtaXggb2YgQyBhbmQgUHl0aG9uLgogICAgICAgICAgICAgUHl0aG9uIGNvZGUgaXMgc2VhbWxlc3NseSBhZGRlZCB0byB0aGUgbW9kdWxlLgoKICAgICAgICAgICAgKDQpIFRoZSAtc2hhZG93IGNvbW1hbmQgbGluZSBvcHRpb24gaXMgZGVwcmVjYXRlZC4gIFRoaXMgaXMgdHVybmVkIG9uCiAgICAgICAgICAgIGJ5IGRlZmF1bHQuCgogICAgICAgICAgICAoNSkgVG8gZGlzYWJsZSB0aGUgZ2VuZXJhdGlvbiBvZiB0aGUgZXh0cmEgcHl0aG9uIGZpbGUsIHVzZSB0aGUgIi1ub3Byb3h5IgogICAgICAgICAgICBjb21tYW5kIGxpbmUgb3B0aW9uLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCiAgICAgICAgICAgIFRoaXMgY2hhbmdlIHdpbGwgbGlrZWx5IGJyZWFrIHRoZSBidWlsZCBlbnZpcm9ubWVudCBvZiBwcm9qZWN0cyB0aGF0CiAgICAgICAgICAgIHV0aWxpemUgc2hhZG93IGNsYXNzZXMuICAgVG8gZml4IHRoaXMsIHlvdSBwcm9iYWJseSBvbmx5IG5lZWQgdG8KICAgICAgICAgICAgY2hhbmdlIHRoZSBuYW1lIG9mIHRoZSB0YXJnZXQgLnNvIGZpbGUuICBGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUKICAgICAgICAgICAgTWFrZWZpbGUgaW5mb3JtYXRpb24gbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgICAgIFRBUkdFVCA9IGV4YW1wbGVjbW9kdWxlLnNvCgogICAgICAgICAgICBKdXN0IGNoYW5nZSBpdCB0bzoKCiAgICAgICAgICAgICAgICAgICBUQVJHRVQgPSBfZXhhbXBsZS5zbwoKICAgICAgICAgICAgKioqIERPQ1VNRU5UQVRJT04gVVBEQVRFICoqKgogICAgICAgICAgICBUaGUgZmlsZSBEb2MvTWFudWFsL1B5dGhvbi5odG1sIGhhcyBiZWVuIHVwZGF0ZWQgdG8gZGVzY3JpYmUgdGhlc2UgY2hhbmdlcy4KCgowNy8yMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEFkZGVkIC1ub2V4dGVybiBvcHRpb24uICAgSWYgc3VwcGxpZWQsIFNXSUcgd2lsbCBub3QgZ2VuZXJhdGUKICAgICAgICAgICAgZXh0cmEgZXh0ZXJuIGRlY2xhcmF0aW9ucy4gIFRoaXMgaXMgc29tZXRpbWVzIGFuIGlzc3VlIG9uIAogICAgICAgICAgICBub24tdW5peCBwbGF0Zm9ybXMuCgowNy8yMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEFkZGVkIGEgd2FybmluZyBmb3IgaWdub3JlZCBmcmllbmQgZnVuY3Rpb25zLgoKMDcvMjMvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDU3NDQ5OCBdIC1wcm94eSBhbmQgJWluY2x1ZGUgInBvaW50ZXIuaSIgY2xhc2guCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IERhdmlkIENyZWFzeS4KCjA3LzIzLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA1NzYxMDMgXSBnbG9iYWwgZGVzdHJ1Y3Rpb24gd2FybmluZyB3aXRoIHNoYWRvdy4KICAgICAgICAgICAgUGVybCBleHRlbnNpb25zIHNob3VsZCBubyBsb25nZXIgcmVwb3J0IHRoZSB3YXJuaW5nCgogICAgICAgICAgICAgICAiVXNlIG9mIHVuaW5pdGlhbGl6ZWQgdmFsdWUgZHVyaW5nIGdsb2JhbCBkZXN0cnVjdGlvbi4iCiAKICAgICAgICAgICAgd2hlbiBydW5uaW5nIHdpdGggInBlcmwgLXciLiAgUmVwb3J0ZWQgYnkKICAgICAgICAgICAgQnJldHQgV2lsbGlhbXMuCgowNy8yMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEluIEMrKyBtb2RlLCBTV0lHIG5vdyBhbHdheXMgZGVmaW5lcyBuYW1lc3BhY2Ugc3RkLiAgQnkgZGVmYXVsdCwKICAgICAgICAgICAgaXQncyBlbXB0eS4gIEhvd2V2ZXIsIHRoaXMgd2lsbCBzaWxlbmNlIGVycm9ycyBmcm9tIHByb2dyYW1zCiAgICAgICAgICAgIHRoYXQgaW5jbHVkZSBzdGF0ZW1lbnRzIHN1Y2ggYXMgInVzaW5nIG5hbWVzcGFjZSBzdGQ7Ii4KICAgICAgICAgICAgVGhpcyBmaXhlcyBCdWcgWyA1ODQwMTcgXSB1c2luZyBuYW1lc3BhY2Ugc3RkIGdlbmVyYXRlcyBlcnJvci4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgSm9zZXBoIFdpbnN0b24uCgowNy8yMi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEFkZGVkIGEgbmV3IHdhcm5pbmcgbWVzc2FnZSBmb3IgJWFwcGx5LiAgSWYgeW91IHVzZSAlYXBwbHkgYnV0IG5vIHR5cGVtYXBzCiAgICAgICAgICAgIGFyZSBkZWZpbmVkLCB5b3Ugd2lsbCBnZXQgYSB3YXJuaW5nIG1lc3NhZ2UuICBUaGlzIHNob3VsZCBoZWxwIHdpdGgKICAgICAgICAgICAgcHJvYmxlbXMgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgICAgICVhcHBseSBjaGFyICpPVVRQVVQgeyAuLi4gfTsKCiAgICAgICAgICAgIEluIG9sZCB2ZXJzaW9ucyBvZiBTV0lHLCB0aGlzIHNpbGVudGx5IGRpZCBub3RoaW5nLiAgTm93IHlvdSBnZXQgYW4gZXJyb3IgbGlrZSB0aGlzOgogIAogICAgICAgICAgICAgICAgICAgZmlsZTpsaW5lLiBXYXJuaW5nLiBDYW4ndCBhcHBseSAoY2hhciAqT1VUUFVUKS4gTm8gdHlwZW1hcHMgYXJlIGRlZmluZWQuCgowNy8yMi8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIFN0YXJ0ZWQgSmF2YSBwcmFnbWEgZGVwcmVjYXRpb24uIFJlcGxhY2VtZW50cyB1c2UgJXR5cGVtYXAgYmFzZWQgCiAgICAgICAgICAgIGRpcmVjdGl2ZXMgYW5kIGVuYWJsZSBwcm94eSBjbGFzc2VzIGFuZCB0aGUgbmV3IHR5cGUgd3JhcHBlciBjbGFzc2VzIHRvIGJlIAogICAgICAgICAgICB0YWlsb3JlZCBpbiB2YXJpb3VzIHdheXMuIFRoZXNlIGFyZSB0aGUgbmV3IHR5cGVtYXBzOgogICAgICAgICAgICAKICAgICAgICAgICAgJXR5cGVtYXAoamF2YWJhc2UpICAgICAgICAgICAtIGJhc2UgKGV4dGVuZHMpIGZvciBKYXZhIGNsYXNzCiAgICAgICAgICAgICV0eXBlbWFwKGphdmFjbGFzc21vZGlmaWVycykgLSBjbGFzcyBtb2RpZmllcnMgZm9yIHRoZSBKYXZhIGNsYXNzOiBkZWZhdWx0IGlzICJwdWJsaWMiCiAgICAgICAgICAgICV0eXBlbWFwKGphdmFjb2RlKSAgICAgICAgICAgLSBqYXZhIGNvZGUgaXMgY29waWVkIHZlcmJhdGltIHRvIHRoZSBKYXZhIGNsYXNzCiAgICAgICAgICAgICV0eXBlbWFwKGphdmFpbXBvcnRzKSAgICAgICAgLSBpbXBvcnQgc3RhdGVtZW50cyBmb3IgSmF2YSBjbGFzcwogICAgICAgICAgICAldHlwZW1hcChqYXZhaW50ZXJmYWNlcykgICAgIC0gaW50ZXJmYWNlcyAoZXh0ZW5kcykgZm9yIEphdmEgY2xhc3MKICAgICAgICAgICAgCiAgICAgICAgICAgIEFuZCB0aGVzZSBhcmUgdGhlICVwcmFnbWEgZGlyZWN0aXZlcyBiZWluZyBkZXByZWNhdGVkOgogICAgICAgICAgICBhbGxzaGFkb3diYXNlCiAgICAgICAgICAgIGFsbHNoYWRvd2NsYXNzbW9kaWZpZXJzCiAgICAgICAgICAgIGFsbHNoYWRvd2NvZGUKICAgICAgICAgICAgYWxsc2hhZG93aW1wb3J0CiAgICAgICAgICAgIGFsbHNoYWRvd2ludGVyZmFjZQogICAgICAgICAgICBzaGFkb3diYXNlCiAgICAgICAgICAgIHNoYWRvd2NsYXNzbW9kaWZpZXJzCiAgICAgICAgICAgIHNoYWRvd2NvZGUKICAgICAgICAgICAgc2hhZG93aW1wb3J0CiAgICAgICAgICAgIHNoYWRvd2ludGVyZmFjZQogICAgICAgICAgICAKICAgICAgICAgICAgTm90ZSB0aGF0IGl0IGlzIHBvc3NpYmxlIHRvIHRhcmdldCBhIHBhcnRpY3VsYXIgcHJveHkgY2xhc3M6CiAgICAgICAgICAgICV0eXBlbWFwKGphdmFpbXBvcnRzKSBGb28gImltcG9ydCBqYXZhLnV0aWwuKiI7CiAgICAgICAgICAgIG9yIGEgcGFydGljdWxhciB0eXBlIHdyYXBwZXIgY2xhc3M6CiAgICAgICAgICAgICV0eXBlbWFwKGphdmFpbXBvcnRzKSBkb3VibGUqICJpbXBvcnQgamF2YS5tYXRoLioiOwogICAgICAgICAgICBOb3RlIHRoYXQgJGphdmFjbGFzc25hbWUgaW4gdGhlc2UgdHlwZW1hcHMgYXJlIHN1YnN0aXR1dGVkIHdpdGggZWl0aGVyIHRoZSBwcm94eSAKICAgICAgICAgICAgY2xhc3NuYW1lIHdoZW4gdXNpbmcgcHJveHkgY2xhc3NlcyBvciB0aGUgU1dJR1RZUEUgY2xhc3MgbmFtZS4KCjA3LzE4LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gSmF2YSBtb2R1bGUgb3ZlcmhhdWwgdG8gaW1wbGVtZW50IHN0YXRpYyB0eXBlIGNoZWNraW5nIG9mIGFsbCAKICAgICAgICAgICAgdHlwZXMuIAogICAgICAgICAgICAKICAgICAgICAgICAgMSkgQ2hhbmdlcyB3aGVuIHVzaW5nIEphdmEgUHJveHkgY2xhc3NlcwogICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICAgICAgICAgICBQcmV2aW91c2x5IHdoZW4gd3JhcHBpbmcgZ2xvYmFsIGZ1bmN0aW9uczogCgogICAgICAgICAgICBjbGFzcyBTb21lQ2xhc3N7fTsKICAgICAgICAgICAgdm9pZCBmb28oU29tZUNsYXNzKiBzKTsKICAgICAgICAgICAgU29tZUNsYXNzKiBiYXIoKTsKCiAgICAgICAgICAgIFRoZSBuYXRpdmUgbWV0aG9kIHByb3RvdHlwZXMgdXNlZCBhIGxvbmcgZm9yIHBvaW50ZXJzIGFuZCBsb29rZWQgbGlrZSB0aGlzOgoKICAgICAgICAgICAgcHVibGljIGNsYXNzIG1vZHVsZW5hbWUgIHsKICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBuYXRpdmUgdm9pZCBmb28obG9uZyBqYXJnMSk7CiAgICAgICAgICAgICAgICBwdWJsaWMgZmluYWwgc3RhdGljIG5hdGl2ZSBsb25nIGJhcigpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBhbmQgdW5saWtlIG1lbWJlciBmdW5jdGlvbnMgb2YgYSBDKysgY2xhc3MgdGhlcmUgd2FzIG5vIHdyYXBwZXIgYXJvdW5kIHRoZSBuYXRpdmUgY2FsbHMgCiAgICAgICAgICAgIHRvIG1ha2UgdGhlIHVzZSBvZiB0aGVtIG1vcmUgdXNlciBmcmllbmRseS4gVGhleSB3b3VsZCBiZSB1c2VkIGZyb20gSmF2YSBsaWtlIHRoaXM6CgogICAgICAgICAgICBTb21lQ2xhc3MgcyA9IG5ldyBTb21lQ2xhc3MobW9kdWxlbmFtZS5iYXIoKSwgZmFsc2UpOwogICAgICAgICAgICBtb2R1bGVuYW1lLmZvbyhzLmdldENQdHJTb21lQ2xhc3MoKSk7CgogICAgICAgICAgICBOb3RlIHRoYXQgdGhlIGZvbGxvd2luZyB3aWxsIGhhdmUgdGhlIHNhbWUgZWZmZWN0LCBidXQgdGhlbiBpdCB3b3VsZCBub3QgaGF2ZSAKICAgICAgICAgICAgYmVlbiBwb3NzaWJsZSB0byBjYWxsIGFueSBwcm94eSBtZW1iZXIgZnVuY3Rpb25zIGluIFNvbWVDbGFzczoKCiAgICAgICAgICAgIGxvbmcgcyA9IG1vZHVsZW5hbWUuYmFyKCk7CiAgICAgICAgICAgIG1vZHVsZW5hbWUuZm9vKHMpOwoKICAgICAgICAgICAgTm93IHdyYXBwZXIgZnVuY3Rpb25zIGFyZSBnZW5lcmF0ZWQ6CgogICAgICAgICAgICBwdWJsaWMgY2xhc3MgbW9kdWxlbmFtZSAgewogICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIGZvbyhTb21lQ2xhc3MgcykgewogICAgICAgICAgICAgICAgICAgIC8vIGNhbGxzIHRoZSBuYXRpdmUgZnVuY3Rpb24KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIFNvbWVDbGFzcyBiYXIoKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gY2FsbHMgdGhlIG5hdGl2ZSBmdW5jdGlvbgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBXaGljaCBtZWFucyB0aGVzZSBmdW5jdGlvbnMgY2FuIG5vdyBiZSB1c2VkIG1vcmUgbmF0dXJhbGx5IHdpdGggcHJveHkgY2xhc3NlczoKCiAgICAgICAgICAgIFNvbWVDbGFzcyBzID0gbW9kdWxlbmFtZS5iYXIoKTsKICAgICAgICAgICAgbW9kdWxlbmFtZS5mb28ocyk7CgogICAgICAgICAgICAyKSBDaGFuZ2VzIHdoZW4gbm90IHVzaW5nIEphdmEgUHJveHkgY2xhc3NlcwogICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAgICAgICAgICAgVGhlIHNvIGNhbGxlZCBsb3ctbGV2ZWwgaW50ZXJmYWNlIHdhcyByYXRoZXIgbG93LWxldmVsIGluZGVlZC4gVGhlIAogICAgICAgICAgICBuZXcgc3RhdGljIHR5cGUgY2hlY2tpbmcgaW1wbGVtZW50YXRpb24gbWFrZXMgaXQgbGVzcyBzbyBidXQgaXQgcmVtYWlucyBhCiAgICAgICAgICAgIGZ1bmN0aW9uYWwgaW50ZXJmYWNlIHRvIHRoZSBDL0MrKyB3b3JsZC4gUHJveHkgY2xhc3NlcyBhcmUgdGhlIG9idmlvdXMgd2F5IHRvIHVzZQogICAgICAgICAgICBTV0lHIGdlbmVyYXRlZCBjb2RlLCBidXQgZm9yIHRob3NlIHdobyB3YW50IGEgZnVuY3Rpb25hbCBpbnRlcmZhY2UgYWxsIG5vbi1wcmltaXRpdmUKICAgICAgICAgICAgdHlwZXMgbm93IGhhdmUgYSBzaW1wbGUgSmF2YSBjbGFzcyB3cmFwcGVyIGFyb3VuZCB0aGUgQy9DKysgdHlwZS4gUG9pbnRlcnMgYW5kCiAgICAgICAgICAgIHJlZmVyZW5jZXMgdG8gcHJpbWl0aXZlIHR5cGVzIGFyZSBhbHNvIHdyYXBwZWQgYnkgdHlwZSB3cmFwcGVyIGNsYXNzZXMuIFRoZSB0eXBlCiAgICAgICAgICAgIHdyYXBwZXIgY2xhc3NuYW1lcyBhcmUgYmFzZWQgb24gdGhlIFNXSUcgZGVzY3JpcHRvcnMgdXNlZCBieSB0aGUgb3RoZXIgbGFuZ3VhZ2UgCiAgICAgICAgICAgIG1vZHVsZXMuIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgQy9DKysgdHlwZSAgICAgIEphdmEgdHlwZSB3cmFwcGVyIGNsYXNzIG5hbWUKICAgICAgICAgICAgLS0tLS0tLS0tLSAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgICAgaW50KiAgICAgICAgICAgIFNXSUdUWVBFX3BfaW50CiAgICAgICAgICAgIGRvdWJsZSoqICAgICAgICBTV0lHVFlQRV9wX3BfZG91YmxlCiAgICAgICAgICAgIFNvbWVDbGFzcyogICAgICBTV0lHVFlQRV9wX1NvbWVDbGFzcwogICAgICAgICAgICBTb21lQ2xhc3MmICAgICAgU1dJR1RZUEVfcF9Tb21lQ2xhc3MKICAgICAgICAgICAgU29tZUNsYXNzICAgICAgIFNXSUdUWVBFX3BfU29tZUNsYXNzCgogICAgICAgICAgICBOb3RlIHRoYXQgZXZlcnl0aGluZyB3cmFwcGVkIGJ5IFNXSUcgaXMgYWNjZXNzZWQgdmlhIGEgcG9pbnRlciBldmVuIHdoZW4gd3JhcHBpbmcgCiAgICAgICAgICAgIGZ1bmN0aW9ucyB0aGF0IHBhc3MgYnkgdmFsdWUgb3IgcmVmZXJlbmNlLiBTbyB0aGUgcHJldmlvdXMgZXhhbXBsZSB3b3VsZCBub3cgYmUgCiAgICAgICAgICAgIHVzZWQgbGlrZSB0aGlzOgoKICAgICAgICAgICAgU1dJR1RZUEVfcF9Tb21lQ2xhc3MgcyA9IGV4YW1wbGUuYmFyKCk7CiAgICAgICAgICAgIGV4YW1wbGUuZm9vKHMpOwoKICAgICAgICAgICAgTm90ZSB0aGF0IHR5cGVkZWZzIHRoYXQgU1dJRyBrbm93cyBhYm91dCBhcmUgcmVzb2x2ZWQsIHNvIHRoYXQgaWYgb25lIGhhcyAKCiAgICAgICAgICAgIGNsYXNzIEZvb3t9OwogICAgICAgICAgICB0eXBlZGVmIEZvbyBCYXI7CgogICAgICAgICAgICB0aGVuIGFueSB1c2Ugb2YgQmFyIHdpbGwgcmVxdWlyZSBvbmUgdG8gdXNlIFNXSUdUWVBFX3BfRm9vOwoKICAgICAgICAgICAgU29tZSBjb25zaWRlcmF0aW9uczoKICAgICAgICAgICAgTWFrZSBzdXJlIHlvdSBtYWtlIGEgZmlybSBkZWNpc2lvbiB0byB1c2UgZWl0aGVyIHByb3h5IGNsYXNzZXMgb3IgdGhlIGZ1bmN0aW9uYWwgCiAgICAgICAgICAgIGludGVyZmFjZSBlYXJseSBvbiBhcyB0aGUgY2xhc3NuYW1lcyBhcmUgZGlmZmVyZW50LgoKICAgICAgICAgICAgMykgUG9pbnRlcnMgYW5kIG5vbi1wYXJzZWQgdHlwZXMKICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgICAgU29tZXRpbWVzIFNXSUcgY2Fubm90IGdlbmVyYXRlIGEgcHJveHkgY2xhc3MuIFRoaXMgb2NjdXJzIHdoZW4gdGhlIGRlZmluaXRpb24gb2YgCiAgICAgICAgICAgIGEgdHlwZSBpcyBub3QgcGFyc2VkIGJ5IFNXSUcsIGJ1dCBpcyB0aGVuIHVzZWQgYXMgYSB2YXJpYWJsZSBvciBhIHBhcmFtZXRlci4gCiAgICAgICAgICAgIEZvciBleGFtcGxlLAoKICAgICAgICAgICAgdm9pZCBmb28oU25henp5IHNkcyk7CgogICAgICAgICAgICBJZiBTV0lHIGhhcyBub3QgcGFyc2VkIFNuYXp6eSBpdCBoYW5kbGVzIGl0IHNpbXBseSBhcyBhIHBvaW50ZXIgdG8gYSBTbmF6enkuCiAgICAgICAgICAgIFRoZSBKYXZhIG1vZHVsZSBnaXZlcyBpdCBhIHR5cGUgd3JhcHBlciBjbGFzcyBhcm91bmQgdGhlIHBvaW50ZXIgYW5kIGNhbGxzIGl0IAogICAgICAgICAgICBTV0lHVFlQRV9wX1NuYXp6eS4gSW4gb3RoZXIgd29yZHMgaXQgaGFuZGxlcyBpdCBpbiB0aGUgc2FtZSBtYW5uZXIgYXMgdHlwZXMgYXJlIAogICAgICAgICAgICBoYW5kbGVkIGluIHRoZSBsb3ctbGV2ZWwgZnVuY3Rpb25hbCBpbnRlcmZhY2UuIFRoaXMgYXBwcm9hY2ggaXMgdXNlZCBmb3IgYWxsIAogICAgICAgICAgICBub24tcHJveHkgY2xhc3NlcywgZWcgYWxsIHBvaW50ZXIgdG8gcG9pbnRlcnMgYW5kIHBvaW50ZXJzIHRvIHByaW1pdGl2ZSB0eXBlcy4KCiAgICAgICAgICAgIDQpIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5CiAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGlzIG5vdCBhbiBpc3N1ZSBpZiB5b3UgaGF2ZSBiZWVuIHVzaW5nIHByb3h5IGNsYXNzZXMgYW5kIAogICAgICAgICAgICBubyBnbG9iYWwgdmFyaWFibGVzL2Z1bmN0aW9ucy4gT3RoZXJ3aXNlIHNvbWUgY2hhbmdlcyB3aWxsIGhhdmUgdG8gYmUgbWFkZS4gCiAgICAgICAgICAgIFRoZSBuYXRpdmUgbWV0aG9kcyBzdGlsbCBleGlzdCBidXQgdGhleSBhcmUgbm93IGluIGEgSk5JIGNsYXNzLCB3aGljaCBpcyBjYWxsZWQgCiAgICAgICAgICAgIG1vZHVsZW5hbWVKTkkuIEFzIHRoaXMgY2xhc3MgaXMgcmVhbGx5IHBhcnQgb2YgdGhlIGludGVybmFsIHdvcmtpbmdzLAogICAgICAgICAgICBpdCBzaG91bGQgbm90IGJlIHJlcXVpcmVkIHNvIHRoZSBjbGFzcyBoYXMgYmVjb21lIHByb3RlY3RlZC4gU29tZSBwcmFnbWFzL2RpcmVjdGl2ZXMKICAgICAgICAgICAgd2lsbCBob3BlZnVsbHkgYmUgYWRkZWQgdG8gaGVscCB3aXRoIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEpBVkEgTU9EVUxFICoqKgoKMDcvMTgvMjAwMjogYmVhemxleQogICAgICAgICAgICBNb2RpZmllZCB3cmFwcGluZyBvZiB1bmluc3RhbnRpYXRlZCB0ZW1wbGF0ZXMgcmV0dXJuZWQgYnkKICAgICAgICAgICAgdmFsdWUuICBKdXN0IHRvIGJlIHNhZmUsIHRoZXkgYXJlIG5vdyB3cmFwcGVkIGJ5IFN3aWdWYWx1ZVdyYXBwZXI8PgogICAgICAgICAgICBqdXN0IGluIGNhc2UgdGhleSBkb24ndCBkZWZpbmUgYSBkZWZhdWx0IGNvbnN0cnVjdG9yLiAgVGhpcwogICAgICAgICAgICB3b3VsZCBiZSB1c2VkIGlmIHlvdSBoYWQgY29kZSBsaWtlIHRoaXMKCiAgICAgICAgICAgICAgICAgRm9vPGludD4gYmxhaCgpOwogICAgICAgICAgICAgICAgIHZvaWQgICAgIG1vcmVibGFoKEZvbzxpbnQ+IHgpOwoKICAgICAgICAgICAgYnV0IHlvdSBkaWRuJ3QgaW5zdGFudGlhdGUgRm9vPGludD4gdXNpbmcgJXRlbXBsYXRlLiAgCiAgICAgICAgICAgIFdlIHNob3VsZCBwcm9iYWJseSBhZGQgYSB3YXJuaW5nIGZvciB0aGlzLgoKMDcvMTcvMjAwMjogYmVhemxleQogICAgICAgICAgICBBZGRlZCBhbiBlcnJvciBjaGVjayB0byBkZXRlY3Qgc2hhZG93ZWQgdGVtcGxhdGUgcGFyYW1hdGVycy4KICAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBUPiBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgICAgIGludCBUOwogICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgVGhpcyByZXN1bHRzIGluIGFuIGVycm9yLCBub3QgYSB3YXJuaW5nLiAgVGhpcyB3YXJuaW5nIGlzCiAgICAgICAgICAgIGFsc28gbmVlZGVkIHRvIGZpeCBzb21lIHJhdGhlciBpbnNpZGlvdXMgcHJvYmxlbXMgbGlrZQogICAgICAgICAgICB0aGlzOgoKICAgICAgICAgICAgICAgICBzdHJ1Y3QgVCB7CiAgICAgICAgICAgICAgICAgICAgICBpbnQgIGJsYWg7CiAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgVD4gY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgICB0eXBlZGVmIFQgVHJhaXRzOyAgICAvLyBXaGljaCBUIGlzIHRoaXM/Pz8/CiAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIEluIHRoaXMgY2FzZSwgdGhlIHRlbXBsYXRlIHBhcmFtZXRlciBUIHNoYWRvd3MgdGhlIG91dGVyCiAgICAgICAgICAgIHN0cnVjdHVyZSAod2hpY2ggaXMgd2hhdCB5b3Ugd2FudCkuCgowNy8xNi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEltcHJvdmVkIHN1cHBvcnQgZm9yIHRlbXBsYXRlcyB3aXRoIGludGVnZXIgYXJndW1lbnRzLiAgU1dJRyBpcwogICAgICAgICAgICBtdWNoIG1vcmUgYXdhcmUgb2Ygc2l0dWF0aW9ucyBzdWNoIGFzIHRoaXM6CgogICAgICAgICAgICAgICAgY29uc3QgaW50IFNpemUgPSAxMDA7CgogICAgICAgICAgICAgICAgJXRlbXBsYXRlKEZvbzEwMCkgRm9vPDEwMD47CiAgICAgICAgICAgICAgICB2b2lkIGJhcihGb288U2l6ZT4gKngpOyAgIC8vIEtub3dzIHRoYXQgRm9vPFNpemU+IGlzIHRoZSBzYW1lIGFzIEZvbzwxMDA+OwoKMDcvMTUvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBidWcgd2l0aCAlZmVhdHVyZS8laWdub3JlLyVyZW5hbWUgYW5kIG5hbWVzcGFjZXMuCiAgICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICVpZ25vcmUgRm9vOjpCYXIKICAgICAgICAgICAgICAgIG5hbWVzcGFjZSBGb28gewogICAgICAgICAgICAgICAgICAgICBjbGFzcyBCYXIgewogICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IE1hcmNlbG8gTWF0dXMuCgowNy8wOS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEFkZGVkIHBhcnNpbmcgc3VwcG9ydCBmb3IgY29uc3RydWN0b3JzIHRoYXQgdHJ5IHRvIGNhdGNoCiAgICAgICAgICAgIGV4Y2VwdGlvbnMgaW4gaW5pdGlhbGl6ZXJzLiAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgIEJhciBiOwogICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICBGb28oaW50IHgpIHRyeSAKICAgICAgICAgICAgICAgICAgICAgOiBiKHgpIHsgLi4uIH0KICAgICAgICAgICAgICAgICBjYXRjaChpbnQpIHsKICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFRoaXMgaGFzIG5vIGVmZmVjdCBvbiB0aGUgZ2VuZXJhdGVkIHdyYXBwZXJzLiAgSG93ZXZlciwgdGhlIHRyeSBhbmQgY2F0Y2gKICAgICAgICAgICAgcGFydHMgb2YgdGhlIGRlY2xhcmF0aW9uIGFyZSBpZ25vcmVkLiAgU2VlIFN0cm91c3RydXAsIDNyZCBFZCwgc2VjdGlvbiAKICAgICAgICAgICAgMTQuNC42LjEgZm9yIGRldGFpbHMuCiAgICAgICAgICAgICAgICAgICAKMDcvMDYvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBidWcgaW4gdGVtcGxhdGUgc3ltYm9sIHRhYmxlIG1hbmFnZW1lbnQuICBUaGlzIGZpeGVzCiAgICAgICAgICAgIHR3byBidWdzLiAgRmlyc3QsIG1peGluZyBhYnN0cmFjdCBtZXRob2RzLCB0ZW1wbGF0ZXMsIGFuZCAKICAgICAgICAgICAgaW5oZXJpdGFuY2Ugbm8gbG9uZ2VyIGdlbmVyYXRlcyBhIGZhaWxlZCBhc3NlcnRpb24uCiAKICAgICAgICAgICAgICAgIHRlbXBsYXRlIDxjbGFzcyBUPgogICAgICAgICAgICAgICAgY2xhc3MgQSB7CiAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgZm9vKCkgPSAwOwogICAgICAgICAgICAgICAgfTsKIAogICAgICAgICAgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgVD4KICAgICAgICAgICAgICAgY2xhc3MgQiA6IHB1YmxpYyBBPFQ+CiAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgJXRlbXBsYXRlKEFfaW50KSBBPGludD47CiAgICAgICAgICAgICAgICV0ZW1wbGF0ZShCX2ludCkgQjxpbnQ+OwoKICAgICAgICAgICAgVGhpcyBmaXggYWxzbyBmaXhlcyBhIHN1YnRsZSBwcm9ibGVtIHdpdGggZGVmYXVsdCB2YWx1ZXMgYW5kCiAgICAgICAgICAgIHRlbXBsYXRlcy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgdGVtcGxhdGUgPGNsYXNzIEM+CiAgICAgICAgICAgICAgIHN0cnVjdCBCIHsKICAgICAgICAgICAgICAgICAgIHR5cGVkZWYgdW5zaWduZWQgaW50IHNpemVfdHlwZTsKICAgICAgICAgICAgICAgICAgIHN0YXRpYyBjb25zdCBzaXplX3R5cGUgbmluZGV4ID0gc3RhdGljX2Nhc3Q8c2l6ZV90eXBlPigtMSk7CiAgICAgICAgICAgICAgICAgICB2b2lkIGZvbyhzaXplX3R5cGUgaW5kZXggPSBuaW5kZXgpOwogICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgQnVncyByZXBvcnRlZCBieSBNYXJjZWxvIE1hdHVzLgoKCjA3LzA1LzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBDaGFuZ2VkIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBTV0lHX0NvbnZlcnRQdHIoKSBmdW5jdGlvbgoJICAgIGZvciB0aGUgU1dJRy9SdWJ5IHJ1bnRpbWUgc3VwcG9ydCBzbyB0aGF0IGl0IGxvb2tzIGxpa2UgdGhlCgkgICAgUHl0aG9uIHZlcnNpb24uIElmIHRoZSBsYXN0IGFyZ3VtZW50IChmbGFncykgaXMgbm9uLXplcm8sCgkgICAgU1dJR19Db252ZXJ0UHRyKCkgd2lsbCByYWlzZSBhbiBleGNlcHRpb24gZm9yIHR5cGUgbWlzbWF0Y2hlcwoJICAgIGFzIGJlZm9yZS4gSWYgZmxhZ3MgaXMgemVybywgdGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiAtMSBmb3IKCSAgICB0eXBlIG1pc21hdGNoZXMgd2l0aG91dCByYWlzaW5nIGFuIGV4Y2VwdGlvbi4gCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgUlVCWSBNT0RVTEUgKioqCgowNy8wNC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE92ZXJsb2FkZWQgZnVuY3Rpb25zL21ldGhvZHMvY29uc3RydWN0b3JzIG5vdyB3b3JrIGluIG1hbnkgbGFuZ3VhZ2UKICAgICAgICAgICAgbW9kdWxlcy4gIFRoZSBzdXBwb3J0IGlzIGNvbXBsZXRlbHkgdHJhbnNwYXJlbnQtLWp1c3QgY2FsbCB0aGUKICAgICAgICAgICAgZnVuY3Rpb24gbm9ybWFsbHkgYW5kIFNXSUcgd2lsbCBkaXNwYXRjaCB0byB0aGUgY29ycmVjdCBpbXBsZW1lbnRhdGlvbi4KICAgICAgICAgICAgVGhlcmUgYXJlIGEgdmFyaWV0eSBvZiBpc3N1ZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMuICBQbGVhc2UgcmVmZXIKICAgICAgICAgICAgdG8gdGhlIG92ZXJsb2FkaW5nIHNlY3Rpb24gb2YgRG9jL01hbnVhbC9TV0lHUGx1cy5odG1sIGZvciBkZXRhaWxzLgogICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCiAgICAgICAgICAgIAowNy8wNC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGEgYnVnIHdpdGggbmFtZXNwYWNlcywgZW51bXMsIGFuZCB0ZW1wbGF0ZXMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgIG5hbWVzcGFjZSBoZWxsbyB7CiAgICAgICAgICAgICAgICAgIGVudW0gSGVsbG8geyBIaSwgSG9sYSB9OwogCiAgICAgICAgICAgICAgICAgIHRlbXBsYXRlIDxIZWxsbyBIPgogICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHRyYWl0cwogICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVkZWYgZG91YmxlIHZhbHVlX3R5cGU7CiAgICAgICAgICAgICAgICAgICAgICB9OwogCiAgICAgICAgICAgICAgICAgdHJhaXRzPEhpPjo6dmFsdWVfdHlwZSBzYXlfaGkoKQogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJhaXRzPEhpPjo6dmFsdWVfdHlwZSgxKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgU1dJRyB3YXNuJ3QgZ2VuZXJhdGluZyB3cmFwcGVycyB0aGF0IHByb3Blcmx5IHF1YWxpZmllZCAKICAgICAgICAgICAgdHJhaXRzPEhpPi4gIFJlcG9ydGVkIGJ5IE1hcmNlbG8gTWF0dXMuICAgICAgICAgCgowNi8zMC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFN1cHBsaWVkIGFycmF5IHZhcmlhYmxlIHR5cGVtYXBzIGZvciBUY2wgbW9kdWxlLiAgIElmIHlvdSBoYXZlIGEKICAgICAgICAgICAgdmFyaWFibGUgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgIGludCBmb29bMTBdOwoKICAgICAgICAgICAgdGhlbiBhIHNldCBmdW5jdGlvbiBsaWtlIHRoaXMgaXMgZ2VuZXJhdGVkOgoKICAgICAgICAgICAgICAgIHZvaWQgZm9vX3NldChpbnQgKngpIHsKICAgICAgICAgICAgICAgICAgIG1lbW1vdmUoZm9vLHgsMTAqc2l6ZW9mKGludCkpOwogICAgICAgICAgICAgICAgfQoKMDYvMzAvMjAwMjogYmVhemxleQogICAgICAgICAgICBOZXcgJWZyYWdtZW50IGRpcmVjdGl2ZS4gICBXaGVuIHdyaXRpbmcgdHlwZW1hcHMsIGl0IGNhbiBiZSBlYXN5IHRvCiAgICAgICAgICAgIGdldCBjYXJyaWVkIGF3YXkgYW5kIHdyaXRlIGEgbG90IG9mIGNvZGUuICBIb3dldmVyLCBkb2luZyBzbyBjYXVzZXMKICAgICAgICAgICAgdHJlbWVuZG91cyBjb2RlIGJsb2F0LiAgIEEgY29tbW9uIHdheSB0byBzb2x2ZSB0aGlzIGlzIHRvIHdyaXRlIAogICAgICAgICAgICBoZWxwZXIgZnVuY3Rpb25zLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgJXsKICAgICAgICAgICAgICAgIHZvaWQgc29tZV9oZWxwZXJfZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJX0KCiAgICAgICAgICAgICAgICAldHlwZW1hcChpbikgdHlwZSB7CiAgICAgICAgICAgICAgICAgICBzb21lX2hlbHBlcl9mdW5jdGlvbiguLi4pOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgVGhlIG9ubHkgcHJvYmxlbSB3aXRoIHRoaXMgaXMgdGhhdCB0aGUgd3JhcHBlciBmaWxlIGdldHMgcG9sbHV0ZWQKICAgICAgICAgICAgd2l0aCBoZWxwZXIgZnVuY3Rpb25zIGV2ZW4gaWYgdGhleSBhcmVuJ3QgdXNlZC4gICAgVG8gZml4IHRoaXMsCiAgICAgICAgICAgIGEgbmV3IGZyYWdtZW50IGRpcmVjdGl2ZSBpcyBhdmFpbGFibGUuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgIChjb3JyZWN0ZWQgdHlwbyBpbiBsaW5lIGJlbG93IC0gMDYvMjYvMjAwOCkKICAgICAgICAgICAgICAgJWZyYWdtZW50KCJ0eXBlX2hlYWRlciIsImhlYWRlciIpICV7CiAgICAgICAgICAgICAgICAgIHZvaWQgc29tZV9oZWxwZXJfZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAlfQoKICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4sIGZyYWdtZW50PSJ0eXBlX2hlYWRlciIpIHR5cGUgewogICAgICAgICAgICAgICAgICAgc29tZV9oZWxwZXJfZnVuY3Rpb24oLi4uKTsKICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgSW4gdGhpcyBjYXNlLCB0aGUgY29kZSBmcmFnbWVudCBpcyBvbmx5IGVtaXR0ZWQgaWYgdGhlIHR5cGVtYXAgaXMKICAgICAgICAgICAgYWN0dWFsbHkgdXNlZC4gICBBIHNpbWlsYXIgY2FwYWJpbGl0eSBpcyBwcm92aWRlZCBmb3IgZGVjbGFyYXRpb24KICAgICAgICAgICAgYW5ub3RhdGlvbiBhbmQgdGhlICVmZWF0dXJlIGRpcmVjdGl2ZS4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgJWZlYXR1cmUoImZyYWdtZW50IiwidHlwZV9oZWFkZXIiKSAgU29tZURlY2xhcmF0aW9uOwoKICAgICAgICAgICAgVGhlIGZpcnN0IGFyZ3VtZW50IHRvICVmcmFnbWVudCBpcyB0aGUgZnJhZ21lbnQgbmFtZS4gIFRoZSBzZWNvbmQgYXJndW1lbnQKICAgICAgICAgICAgaXMgdGhlIGZpbGUgc2VjdGlvbiB3aGVyZSB0aGUgZnJhZ21lbnQgc2hvdWxkIGJlIGVtaXR0ZWQuICAKCiAgICAgICAgICAgIFRoZSBwcmltYXJ5IHVzZSBvZiB0aGlzIGRpcmVjdGl2ZSBpcyBmb3Igd3JpdGVycyBvZiBsYW5ndWFnZSBtb2R1bGVzCiAgICAgICAgICAgIGFuZCBhZHZhbmNlZCB1c2VycyB3YW50aW5nIHRvIHN0cmVhbWxpbmUgdHlwZW1hcCBjb2RlLgoKICAgICAgICAgICAgKioqIEVYUEVSSU1FTlRBTCBORVcgRkVBVFVSRSAqKioKCjA2LzMwLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgU3VwcGxpZWQgbWVtYmVyaW4gdHlwZW1hcHMgZm9yIGFsbCBhcnJheXMgaW4gYW4gYXR0ZW1wdCB0byBlbGltaW5hdGUKICAgICAgICAgICAgY29uZnVzaW9uIGFib3V0IHRoZWlyIHVzZS4KCjA2LzI5LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRXhwZXJpbWVudGFsIHN1cHBvcnQgZm9yIHNtYXJ0LXBvaW50ZXJzLiAgV2hlbiBhIGNsYXNzIGRlZmluZXMKICAgICAgICAgICAgb3BlcmF0b3ItPigpIGxpa2UgdGhpcwoKICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgIEJhciAqb3BlcmF0b3ItPigpOwogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFNXSUcgbG9jYXRlcyBjbGFzcyBCYXIgYW5kIHRyaWVzIHRvIHdyYXAgaXRzIG1lbWJlciB2YXJpYWJsZXMgYW5kCiAgICAgICAgICAgIG1ldGhvZHMgYXMgcGFydCBvZiBGb28uICBGb3IgZXhhbXBsZSwgaWYgQmFyIHdhcyBkZWZpbmVkIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgIGNsYXNzIEJhciB7CiAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICBpbnQgeDsKICAgICAgICAgICAgICAgICAgICBpbnQgc3BhbSgpOwogICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgWW91IGNvdWxkIGRvIHRoaXMgKGluIHRoZSB0YXJnZXQgbGFuZ3VhZ2UpOgoKICAgICAgICAgICAgICBmID0gRm9vKCkKICAgICAgICAgICAgICBmLnggPSA0ICAgICAgICAgICAgIyBBY2Nlc3NlcyBCYXI6OngKICAgICAgICAgICAgICBmLnNwYW0oKSAgICAgICAgICAgIyBBY2Nlc3NlcyBCYXI6OnNwYW0KCiAgICAgICAgICAgIFRoZSBwcmltYXJ5IHVzZSBvZiB0aGlzIGZlYXR1cmUgaXMgdG8gZW11bGF0ZSB0aGUgYmVoYXZpb3Igb2YgQysrCiAgICAgICAgICAgIHNtYXJ0LXBvaW50ZXJzLS0td2hpY2ggYWxsb3cgYXR0cmlidXRlcyB0byBhY2Nlc3NlZCB0cmFuc3BhcmVudGx5CiAgICAgICAgICAgIHRocm91Z2ggb3BlcmF0b3ItPi4KCiAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYXV0b21hdGljYWxseSBpbiBTV0lHLS0tbm8gc3BlY2lhbCBkaXJlY3RpdmVzCiAgICAgICAgICAgIGFyZSBuZWVkZWQuICAgVG8gZGlzYWJsZSB0aGlzIGJlaGF2aW9yLiAgVXNlICVpZ25vcmUgdG8gaWdub3JlIAogICAgICAgICAgICBvcGVyYXRvci0+LgogICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgowNi8yNi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIERlcHJlY2F0ZWQgdGhlICVleGNlcHQgZGlyZWN0aXZlLiAgICVleGNlcHRpb24gc2hvdWxkIGJlIHVzZWQgaW5zdGVhZC4KCjA2LzI1LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTWFqb3IgY2xlYW51cCBvZiB0aGUgbW9kdWxlcyBkaXJlY3RvcnkuICBFbGltaW5hdGVkIG1vc3QKICAgICAgICAgICAgaGVhZGVyIGZpbGVzLCBjb25zb2xpZGF0ZWQgbW9kdWxlIGNvZGUgaW50byBzaW5nbGUgZmlsZXMuCgowNi8yNC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFJld29ya2VkIHRoZSBpbnN0YW50aWF0aW9uIG9mIGxhbmd1YWdlIG1vZHVsZXMuICBBbGwgbGFuZ3VhZ2UKICAgICAgICAgICAgbW9kdWxlcyBtdXN0IG5vdyBkZWZpbmUgYSBmYWN0b3J5IGZ1bmN0aW9uIHNpbWlsYXIgdG8gdGhpczoKCiAgICAgICAgICAgICAgICBleHRlcm4gIkMiIExhbmd1YWdlICoKICAgICAgICAgICAgICAgIHN3aWdfcHl0aG9uKHZvaWQpIHsKICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUFlUSE9OKCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIGlzIHRoZW4gcGxhY2VkIGluIGEgdGFibGUgYW5kIGFzc29jaWF0ZWQgd2l0aAogICAgICAgICAgICBhIGNvbW1hbmQgbGluZSBvcHRpb24gaW4gc3dpZ21haW4uY3h4LiAgCgogICAgICAgICAgICBUaGlzIGFwcHJvYWNoIGhhcyBhIG51bWJlciBvZiBiZW5lZml0cy4gIEl0IGRlY291cGxlcyB0aGUgCiAgICAgICAgICAgIFNXSUcgbWFpbiBwcm9ncmFtIGZyb20gaGF2aW5nIHRvIGtub3cgYWJvdXQgdGhlIGNsYXNzCiAgICAgICAgICAgIGRlZmluaXRpb25zIGZvciBlYWNoIG1vZHVsZS4gIEFsc28sIGJ5IHVzaW5nIGEgZmFjdG9yeQogICAgICAgICAgICBmdW5jdGlvbiwgaXQgd2lsbCBiZSBlYXNpZXIgdG8gaW1wbGVtZW50IGR5bmFtaWMgbG9hZGluZwogICAgICAgICAgICBvZiBtb2R1bGVzIChzaW1wbHkgbG9hZCB0aGUgZmlsZSBhbmQgaW52b2tlIHRoZSBmYWN0b3J5CiAgICAgICAgICAgIGZ1bmN0aW9uKS4KCjA2LzI0LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgc3ludGF4IGVycm9yIGZvciByZWZlcmVuY2UgY29udmVyc2lvbnMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgICAgIG9wZXJhdG9yIEZvbyAmKCk7CgowNi8yNC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHN5bnRheCBlcnJvciBmb3Igb3BlcmF0b3IgbmV3W10gYW5kIG9wZXJhdG9yIGRlbGV0ZVtdLgoKMDYvMjQvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBjb2RlIGdlbmVyYXRpb24gcHJvYmxlbSBmb3IgY29uc3RhbnRzIGFuZCBkZWZhdWx0IGFyZ3VtZW50cwogICAgICAgICAgICBpbnZvbHZpbmcgdGVtcGxhdGVzLgoKMDYvMTkvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIEZpeGVkIGEgYnVnIGZvciB0aGUgJy1mZWF0dXJlJyBjb21tYW5kIGxpbmUgYXJndW1lbnQ7CiAgICAgICAgICAgIHRoYXQgc2V0dGluZyB3YXMgZWZmZWN0aXZlbHkgYmVpbmcgaWdub3JlZCBhbmQgc28gdGhlIGZlYXR1cmUKICAgICAgICAgICAgbmFtZSB3YXMgYWx3YXlzIHNldCBlcXVhbCB0byB0aGUgbW9kdWxlIG5hbWUuCgowNi8xNy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHByb2JsZW1zIHdpdGggc3RhdGljIG1lbWJlcnMgYW5kIGVudW1zIGluIHRlbXBsYXRlcy4KClZlcnNpb24gMS4zLjEzIChKdW5lIDE3LCAyMDAyKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjA2LzE2LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYSBidWcgd2l0aCBfX0ZJTEVfXyBleHBhbnNpb24gaW4gdGhlIHByZXByb2Nlc3Nvci4gICBPbiBXaW5kb3dzLAogICAgICAgICAgICB0aGUgYmFja3NsYXNoIChcKSBpcyBub3cgY29udmVydGVkIHRvIChcXCkgaW4gdGhlIHN0cmluZyBsaXRlcmFsCiAgICAgICAgICAgIHVzZWQgZm9yIF9fRklMRV9fLiAgUmVwb3J0ZWQgYnkgU3RldmUgR2xhc2VyLgoKMDYvMTQvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCB3YXJuaW5nIG1lc3NhZ2UgYWJvdXQgJ25hbWUgcHJpdmF0ZSBpbiB0aGlzIGNvbnRleHQnLiAgVGhlCiAgICAgICAgICAgIHdhcm5pbmcgaXMgb25seSBnZW5lcmF0ZWQgZm9yIHB1YmxpYyBtZXRob2RzLiAgUmVwb3J0ZWQgYnkKICAgICAgICAgICAgU2NvdHQgTWljaGVsLgogCjA2LzE0LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgc29tZSBwcm9ibGVtcyByZWxhdGVkIHRvIHRlbXBsYXRlIGluc3RhbnRpYXRpb24gCiAgICAgICAgICAgIGFuZCBuYW1lc3BhY2VzLiAgIFdoZW4gU1dJRyBleHBhbmRzIGEgdGVtcGxhdGUsIGl0IGRvZXMKICAgICAgICAgICAgc28gd2l0aCBmdWxseSByZXNvbHZlZCB0eXBlcy4gIEZvciBleGFtcGxlLCBpZiB5b3UgaGF2ZSB0aGlzOgoKICAgICAgICAgICAgICAgIHRlbXBsYXRlPGNsYXNzIFQ+IGNsYXNzIGZvbyB7IH07CiAgICAgICAgICAgICAgICB0eXBlZGVmIGRvdWJsZSBEb3VibGU7CiAgICAgICAgICAgICAgICAldGVtcGxhdGUoZm9vX2QpIGZvbzxEb3VibGU+OwoKICAgICAgICAgICAgdGhlbiwgaXQgaXMgaGFuZGxlZCBhcyBmb288ZG91YmxlPiBpbiB0aGUgdHlwZXN5c3RlbS4KICAgICAgICAgICAgVGhpcyBmaXhlcyBhIG51bWJlciBvZiBzdWJ0bGUgcHJvYmxlbXMgd2l0aCBpbmhlcml0YW5jZQogICAgICAgICAgICBhbmQgdGVtcGxhdGVzLgoKMDYvMTQvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIEFkZGVkIG1pc3NpbmcgYm9vbCB0eXBlbWFwcyBmb3IgSU5QVVQsIE9VVFBVVCBhbmQKCSAgICBJTk9VVCBpbiBMaWIvcnVieS90eXBlbWFwcy5pLgoKMDUvMjkvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBGaXggZm9yIGEgY291cGxlIG9mIGJyb2tlbiBwcmFnbWFzLgoKMDUvMjkvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIEZpeCBmb3IgdW5uZWNlc3NhcnkgY2FzdCB3aGVuIHdyYXBwaW5nIGdsb2JhbCB2YXJpYWJsZSB3aGVyZSAKICAgICAgICAgICAgdGhlIHR5cGUgaXMgbm90IHBhcnNlZCBieSBTV0lHIC0gSmF2YSB2YXJpYWJsZXMgZXhhbXBsZSAKICAgICAgICAgICAgZmFpbHVyZSBhcyByZXBvcnRlZCBieSBMYXJyeSBWaXJkZW4uCgowNi8xMC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE1vZGlmaWVkICV0ZW1wbGF0ZSB0byBhbGxvdyBmb3IgZW1wdHkgaW5zdGFudGlhdGlvbnMuCgogICAgICAgICAgICAgICAgICAldGVtcGxhdGUoKSBmb288aW50LGludD47CgogICAgICAgICAgICBUaGlzIHJlZ2lzdGVycyBmb288aW50LGludD4gd2l0aCB0aGUgdHlwZSBzeXN0ZW0sIGJ1dAogICAgICAgICAgICBkb2Vzbid0IHdyYXAgaXQgKHNhbWUgYXMgJWlnbm9yZSkuICAgVGhpcyBtYXkgb25seSBiZSBhCiAgICAgICAgICAgIHRlbXBvcmFyeSBtZWFzdXJlLiAgIFNXSUcgbWlnaHQgYmUgYWJsZSB0byBhdXRvbWF0aWNhbGx5CiAgICAgICAgICAgIGluc3RhbnRpYXRlIHRlbXBsYXRlcyBpbiBjZXJ0YWluIGNhc2VzLgoKMDYvMTAvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBmdW5jdGlvbiBwcm90b3R5cGUgcHJvYmxlbXMgd2l0aCBUY2wgOC40CgowNi8wOS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHByb2JsZW0gd2l0aCB0ZW1wbGF0ZXMgYW5kIGxvY2F0aW9uIG9mIGJhc2UgY2xhc3Nlcy4gIAogICAgICAgICAgICBUaGlzIG9uZSBpcyBhIGxpdHRsZSBtaW5kLWJlbmRpbmcsIGJ1dCBoZXJlIGlzIGFuIGV4YW1wbGUKICAgICAgICAgICAgdGhhdCBpbGx1c3RyYXRlczoKIAogICAgICAgICAgICAgdGVtcGxhdGUgPGNsYXNzIEFyZ1R5cGUsIGNsYXNzIFJlc1R5cGU+CiAgICAgICAgICAgICBzdHJ1Y3QgdHJhaXRzCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgIHR5cGVkZWYgQXJnVHlwZSBhcmdfdHlwZTsKICAgICAgICAgICAgICAgICAgdHlwZWRlZiBSZXNUeXBlIHJlc190eXBlOwogICAgICAgICAgICAgfTsKIAogICAgICAgICAgICAgdGVtcGxhdGUgPGNsYXNzIEFyZ1R5cGUsIGNsYXNzIFJlc1R5cGU+CiAgICAgICAgICAgICBzdHJ1Y3QgRnVuY3Rpb24KICAgICAgICAgICAgIHsKICAgICAgICAgICAgIH07CiAKICAgICAgICAgICAgIHRlbXBsYXRlIDxjbGFzcyBBRiwgY2xhc3MgQUc+CiAgICAgICAgICAgICBzdHJ1Y3QgQ2xhc3MgOiBGdW5jdGlvbjx0eXBlbmFtZSB0cmFpdHM8QUYsIEFHPjo6YXJnX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSB0cmFpdHM8QUYsIEFHPjo6cmVzX3R5cGU+CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICV0ZW1wbGF0ZSh0cmFpdHNfZGQpIHRyYWl0cyA8ZG91YmxlLCBkb3VibGU+OwogICAgICAgICAgICAgJXRlbXBsYXRlKEZ1bmN0aW9uX2RkKSBGdW5jdGlvbiA8ZG91YmxlLCBkb3VibGU+OwogICAgICAgICAgICAgJXRlbXBsYXRlKENsYXNzX2RkKSBDbGFzcyA8ZG91YmxlLCBkb3VibGU+OwoKCiAgICAgICAgICAgIEluIHRoaXMgZXhhbXBsZSwgdGhlIGJhc2UgY2xhc3Mgb2YgJ0NsYXNzJyBpcyBkZXRlcm1pbmVkIGZyb20KICAgICAgICAgICAgdGhlIEZ1bmN0aW9uIHRlbXBsYXRlLCBidXQgdGhlIHR5cGVzIGFyZSBvYnRhaW5lZCB0aHJvdWdoIHR5cGVkZWZzLgogICAgICAgICAgICBCZWNhdXNlIG9mIHRoaXMsIFNXSUcgY291bGQgbm90IGxvY2F0ZSB0aGUgd3JhcHBlZCBiYXNlIGNsYXNzCiAgICAgICAgICAgIChGdW5jdGlvbjxkb3VibGUsZG91YmxlPikuICAgU2hvdWxkIGJlIGZpeGVkIGluIDEuMy4xMyBldmVuCiAgICAgICAgICAgIHRob3VnaCBJIGNhbiB0aGluayBvZiBhIG1pbGxpb24gb3RoZXIgdGhpbmdzIHRoYXQgbWlnaHQKICAgICAgICAgICAgYWxzbyBiZSBicm9rZW4uCgowNi8wNy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGEgcHJvYmxlbSB3aXRoIGNvbnZlcnNpb24gb3BlcmF0b3JzLiAgSWYgeW91IGhhZCBhbgogICAgICAgICAgICBvcGVyYXRvciBsaWtlIHRoaXMsCgogICAgICAgICAgICAgICAgICBvcGVyYXRvciBkb3VibGUoKSBjb25zdDsKCiAgICAgICAgICAgIFNXSUcgd2FzIG9tbWl0dGluZyB0aGUgImNvbnN0IiBxdWFsaWZpZXIuICBUaGlzIGFmZmVjdGVkCiAgICAgICAgICAgICVyZW5hbWUgYW5kIG90aGVyIGRpcmVjdGl2ZXMuICBSZXBvcnRlZCBieSBaaG9uZyBSZW4uCgowNi8wNy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIExlc3NlbmVkIHRoZSBzdHJpY3RuZXNzIG9mIGFic3RyYWN0IGNsYXNzIGNoZWNraW5nLiAgSWYKICAgICAgICAgICAgeW91IGhhdmUgY29kZSBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgIHZpcnR1YWwgaW50IG1ldGhvZCgpID0gMDsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgY2xhc3MgQmFyIDogcHVibGljIEZvbyB7CiAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgQmFyKCk7CiAgICAgICAgICAgICAgICAgICB+QmFyKCk7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgIFNXSUcgd2lsbCBnbyBhaGVhZCBhbmQgZ2VuZXJhdGUgY29uc3RydWN0b3IvZGVzdHJ1Y3RvcnMKICAgICAgICAgICAgIGZvciBCYXIuICBIb3dldmVyLCBpdCB3aWxsIGFsc28gZ2VuZXJhdGUgYSB3YXJuaW5nIG1lc3NhZ2UgCiAgICAgICAgICAgICB0aGF0ICJCYXIiIG1pZ2h0IGJlIGFic3RyYWN0IChzaW5jZSBtZXRob2QoKSBpc24ndCBkZWZpbmVkKS4KICAgICAgICAgICAgIEluIFNXSUctMS4zLjEyLCBTV0lHIHJlZnVzZWQgdG8gZ2VuZXJhdGUgYSBjb25zdHJ1Y3RvciBhdCBhbGwuCgowNi8wNy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIENoYW5nZSB0byAldGVtcGxhdGUgZGlyZWN0aXZlLiAgSWYgeW91IHNwZWNpZnkgc29tZXRoaW5nIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAldGVtcGxhdGUodmkpIHN0ZDo6dmVjdG9yPGludD47CgogICAgICAgICAgICBJdCBpcyAqZXhhY3RseSogdGhlIHNhbWUgYXMgdGhpczoKIAogICAgICAgICAgICAgICAgbmFtZXNwYWNlIHN0ZCB7CiAgICAgICAgICAgICAgICAgICAgJXRlbXBsYXRlKHZpKSB2ZWN0b3I8aW50PjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFNXSUctMS4zLjEyIHRyaWVkIHRvIGluc3RhbnRpYXRlIHRoZSB0ZW1wbGF0ZSBvdXRzaWRlIG9mIHRoZSBuYW1lc3BhY2UKICAgICAgICAgICAgdXNpbmcgc29tZSB0cmljay4gIEhvd2V2ZXIsIHRoaXMgd2FzIGV4dHJlbWVseSBwcm9ibGVtYXRpYyBhbmQgZnVsbAogICAgICAgICAgICBob2xlcy4gICBUaGlzIHZlcnNpb24gaXMgc2FmZXIuCgowNi8wNy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGJ1ZyB3aXRoIHNjb3BlIHF1YWxpZmljYXRpb24gYW5kIHRlbXBsYXRlcy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICBBPEI6OkM+OjpERAoKICAgICAgICAgICAgQmVmb3JlLCB0aGlzIHdhcyBzZXBhcmF0ZWQgYXMgc2NvcGVzIEE8QiwgQz4sIGFuZCBERC4gIEZpeGVkIG5vdy4KCjA2LzA2LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgQWxsb3cgdGhlIGZvbGxvd2luZyBzeW50YXg6IAogICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgY2xhc3MgQSB7IH07CiAgICAgICAgICAgICAgIHN0cnVjdCBCIDogQSB7IC4uLiB9OwoKICAgICAgICAgICAgQSBiYXNlIGNsYXNzIHdpdGhvdXQgYSBzcGVjaWZpZXIgaXMgYXNzdW1lZCB0byBiZSBwdWJsaWMgZm9yIGEgc3RydWN0LgogCjA2LzA2LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgc3ludGF4IGVycm9yIHdpdGggdGVtcGxhdGUgY29uc3RydWN0b3IgaW5pdGlhbGl6ZXJzLgogICAgICAgICAgICBSZXBvcnRlZCBieSBNYXJjZWxvIE1hdHVzLgoKMDYvMDYvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBidWcgd2l0aCBkZWZhdWx0IHRlbXBsYXRlIGFyZ3VtZW50cy4gCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IE1hcmNlbG8gTWF0dXMuCgowNi8wNS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHN1YnRsZSBwcm9ibGVtcyB3aXRoICVyZW5hbWUgZGlyZWN0aXZlIGFuZCB0ZW1wbGF0ZQogICAgICAgICAgICBleHBhbnNpb24uCgogICAgICAgICAgICBDb2RlIGxpa2UgdGhpcyBzaG91bGQgbm93IHdvcms6CgogICAgICAgICAgICAgICAlcmVuYW1lKGJsYWgpIGZvbzxkb3VibGU+OjptZXRob2Q7CiAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBUPiBjbGFzcyBmb28gewogICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICB2b2lkIG1ldGhvZCgpOwogICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgJXRlbXBsYXRlKHdoYXRldmVyKSBmb288ZG91YmxlPjsKCjA2LzA1LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgUmVzb2x2ZWQgc29tZSB0cmlja3kgaXNzdWVzIG9mIG11bHRpLXBhc3MgY29tcGlsYXRpb24gYW5kIAogICAgICAgICAgICBhbmQgaW5oZXJpdGFuY2UuICBUaGUgZm9sbG93aW5nIHNpdHVhdGlvbiBub3cgZ2VuZXJhdGVzCiAgICAgICAgICAgIGFuIGVycm9yOgoKICAgICAgICAgICAgICAgICAgY2xhc3MgRm9vIDogcHVibGljIEJhciB7CiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICAgY2xhc3MgQmFyIHsKICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBUaGUgZm9sbG93aW5nIGNvZGUgZ2VuZXJhdGVzIGEgd2FybmluZyBhYm91dCBpbmNvbXBsZXRlIGNsYXNzZXMuCgogICAgICAgICAgICAgICAgICBjbGFzcyBCYXI7CiAgICAgICAgICAgICAgICAgIGNsYXNzIEZvbyA6IHB1YmxpYyBCYXIgeyB9OwoKICAgICAgICAgICAgVGhlIGZvbGxvd2luZyBjb2RlIGdlbmVyYXRlcyBhIHdhcm5pbmcgYWJvdXQgYW4gdW5kZWZpbmVkIGNsYXNzLgoKICAgICAgICAgICAgICAgICAgY2xhc3MgRm9vIDogcHVibGljIEJhciB7IH07ICAvLyBCYXIgdW5kZWZpbmVkCgogICAgICAgICAgICBUaGlzIGZpeGVzIGEgZmFpbGVkIGFzc2VydGlvbiBidWcgcmVwb3J0ZWQgYnkgSmFzb24gU3Rld2FydC4KCjA2LzA1LzIwMDI6IGxqb2huc29uCiAgICAgICAgICAgIFtSdWJ5XSBBZGRlZCBhIHdhcm5pbmcgbWVzc2FnZSBmb3IgdGhlIFJ1YnkgbW9kdWxlIGFib3V0IHRoZSBsYWNrCiAgICAgICAgICAgIG9mIHN1cHBvcnQgZm9yIG11bHRpcGxlIGluaGVyaXRhbmNlLiBPbmx5IHRoZSBmaXJzdCBiYXNlIGNsYXNzCiAgICAgICAgICAgIGxpc3RlZCBpcyB1c2VkIGFuZCB0aGUgb3RoZXJzIGFyZSBpZ25vcmVkLiAoUmVwb3J0ZWQgYnkgQ3JhaWcKICAgICAgICAgICAgRmlsZXMpLgogICAgICAgICAgICAKMDYvMDMvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBhIGJ1ZyB3aXRoIHN0cnVjdCBkZWNsYXJhdGlvbnMgYW5kIHR5cGVkZWYuIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICB0eXBlZGVmIHN0cnVjdCBGb28gRm9vOwogICAgICAgICAgICAgICAgIHN0cnVjdCBGb28gewogICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBBIGZldyBvdGhlciBzdWJ0bGUgc3RydWN0IHJlbGF0ZWQgdHlwaW5nIHByb2JsZW1zIHdlcmUKICAgICAgICAgICAgYWxzbyByZXNvbHZlZC4KClZlcnNpb24gMS4zLjEyIChKdW5lIDIsIDIwMDIpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAgICAgICAgIAowNS8zMC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHByb2JsZW0gcmVsYXRlZCB0byBmb3J3YXJkIHRlbXBsYXRlIGNsYXNzIGRlY2xhcmF0aW9ucyBhbmQKICAgICAgICAgICAgbmFtZXNwYWNlcy4gIEJ1ZyByZXBvcnRlZCBieSBNYXJjZWxvIE1hdHVzLgoKMDUvMzAvMjAwMjogYmVhemxleQogICAgICAgICAgICBBZGRlZCAnbWFrZSB1bmluc3RhbGwnIHRhcmdldC4gIENvbnRyaWJ1dGVkIGJ5IEpvZWwgUmVlZC4KCjA1LzI5LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgcmF0aGVyIGluc2lkaW91cyBidWcgd2l0aCAlcmVuYW1lLCAlZmVhdHVyZSBhbmQgdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24uCiAgICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICVleGNlcHRpb24gdmVjdG9yOjpfX2dldGl0ZW1fXyB7CiAgICAgICAgICAgICAgICAgICAgIC4uLiBzb21lIGV4Y2VwdGlvbiAuLi4KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBUPiBjbGFzcyB2ZWN0b3IgewogICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgIFQgX19nZXRpdGVtX18oaW50IGluZGV4KTsgICAgICAgLy8gRmluZQogICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTw+IGNsYXNzIHZlY3RvcjxpbnQ+IHsKICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgICBUIF9fZ2V0aXRlbV9fKGludCBpbmRleCk7ICAgICAgIC8vIE9vcHMuCiAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgTm93LCB0aGUgJWV4Y2VwdGlvbiBkaXJlY3RpdmUgKGFuZCBvdGhlciBmZWF0dXJlcykgc2hvdWxkIGNvcnJlY3RseSBhcHBseSB0bwogICAgICAgICAgICBib3RoIHZlY3RvciBhbmQgc3BlY2lhbGl6YXRpb25zLgoKMDUvMjkvMjAwMjogYmVhemxleQogICAgICAgICAgICBTdWJ0bGUgY2hhbmdlcyB0byAldGVtcGxhdGUoKSBkaXJlY3RpdmUuICAgVGVtcGxhdGUgYXJndW1lbnRzIGFyZSBub3cKICAgICAgICAgICAgcmVkdWNlZCB0byBwcmltaXRpdmUgdHlwZXMgaW4gdGVtcGxhdGUgbWF0Y2hpbmcuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgIHRlbXBsYXRlPGNsYXNzIFQ+IGNsYXNzIHZlY3RvcjxUICo+IHsKICAgICAgICAgICAgICAgIC4uLiBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uIC4uLgogICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICB0eXBlZGVmIGludCAqSW50UHRyOyAgICAgLy8gR3Jvc3MgdHlwZWRlZgoKICAgICAgICAgICAgICAgLy8gR2V0cyB0aGUgYWJvdmUgcGFydGlhbCBzcGVjaWFsaXphdGlvbgogICAgICAgICAgICAgICAldGVtcGxhdGUodmVjdG9ySW50UHRyKSB2ZWN0b3I8SW50UHRyPjsKCiAgICAgICAgICAgIFRoaXMgY2hhbmdlIGlzIGV4dHJlbWVseSBzdWJ0bGUsIGJ1dCBpdCBmaXhlcyBhIG51bWJlciBvZiBwb3RlbnRpYWwKICAgICAgICAgICAgaG9sZXMgaW4gTHVpZ2kncyBTVEwgbGlicmFyeSBtb2R1bGVzLiAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICB0eXBlZGVmIGludCBJbnRlZ2VyOwogICAgICAgICAgICAgICAgJXRlbXBsYXRlKHZlY3RvcmkpIHZlY3RvcjxpbnQ+OwoKMDUvMjkvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCByYXRoZXIgaW5zaWRpb3VzIHR5cGVtYXAgYnVnIHJlbGF0ZWQgdG8gY29uc3QuICBjb25zdAogICAgICAgICAgICB3YXMgYmVpbmcgZGlzY2FyZGVkIHRocm91Z2ggdHlwZWRlZnMuCgowNS8yOS8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gQWRkZWQgaW5wdXQgdHlwZW1hcHMgZm9yIGNvbnN0IHJlZmVyZW5jZXMgdG8gcHJpbWl0aXZlCiAgICAgICAgICAgIHR5cGVzIChpbiBMaWIvcnVieS9ydWJ5LnN3ZykuCgowNS8yOS8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIFRoZSBqYXZhIGFycnJheSBzdXBwb3J0IGZ1bmN0aW9ucyBhcmUgZW5jbG9zZWQgYnkgCiAgICAgICAgICAgIGEgU1dJR19OT0FSUkFZUyAjZGVmaW5lLiBVc2VmdWwgaWYgbm90IHVzaW5nIGFycmF5cyBhbmQgCiAgICAgICAgICAgIGl0IGlzIGRlc2lyYWJsZSB0byBtaW5pbWlzZSB0aGUgYW1vdW50IG9mIGNvbXBpbGVkIGNvZGUuCgowNS8yOS8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEVudW1zIHdlcmUgbm90IHJlbmFtZWQgd2hlbiB1c2luZyAlbmFtZSBvciAlcmVuYW1lCiAgICAgICAgICAgIGZpeC4KCjA1LzI4LzIwMDI6IGxqb2huc29uCiAgICAgICAgICAgIFtSdWJ5XSBNb2RpZmllZCB0aGUgbmFtZSBvZiB0aGUgd3JhcHBlciBmdW5jdGlvbnMgZm9yIHRoZQoJICAgICJuZXciIHNpbmdsZXRvbiBtZXRob2QgYW5kICJpbml0aWFsaXplIiBpbnN0YW5jZSBtZXRob2QgZm9yCgkgICAgY29uc2lzdGVuY3kgd2l0aCB0aGUgb3RoZXIgbGFuZ3VhZ2UgbW9kdWxlcy4gVGhlIHdyYXBwZXIgbmFtZQoJICAgIGZvciB0aGUgZnVuY3Rpb24gdGhhdCBpbXBsZW1lbnRzICJuZXciIGlzIGFsbG9jX2NsYXNzbmFtZSBhbmQKCSAgICB0aGUgd3JhcHBlciBuYW1lIGZvciB0aGUgZnVuY3Rpb24gdGhhdCBpbXBsZW1lbnRzICJpbml0aWFsaXplIgoJICAgIGlzIG5ld19jbGFzc25hbWUuCgoKMDUvMjcvMjAwMjogYmVhemxleQogICAgICAgICAgICBDaGFuZ2VzIHRvIHJ1bnRpbWUuICBQb2ludGVyIGNvbnZlcnNpb24vY3JlYXRpb24gZnVuY3Rpb25zCiAgICAgICAgICAgIG5vdyBhbG1vc3QgYWx3YXlzIGhhdmUgYW4gZXh0cmEgImZsYWdzIiBhcmd1bWVudC4gIEZvcgogICAgICAgICAgICBleGFtcGxlOgoKICAgICAgICAgICAgICBTV0lHX0NvbnZlcnRQdHIob2JqLCB2b2lkICoqLCBzd2lnX3R5cGVfaW5mbyAqdHksIGludCBmbGFncyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeXl5eXl5eXl5eCiAgICAgICAgICAgIFRoaXMgZXh0cmEgcGFyYW1ldGVyIGlzIHJlc2VydmVkIGZvciBmdXR1cmUgZXhwYW5zaW9uIGFuZCB3aWxsCiAgICAgICAgICAgIGJlIHVzZWQgZm9yIG1vcmUgY29udHJvbCBvdmVyIHBvaW50ZXJzIGluIGZ1dHVyZSB2ZXJzaW9ucy4KCjA1LzI3LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4IGZvciBDKysgY2xhc3NlcyB3aXRoIHByaXZhdGUgYXNzaWdubWVudCBvcGVyYXRvcnMuICBJdAogICAgICAgICAgICBpcyBub3cgcG9zc2libGUgdG8gc2FmZWx5IHJldHVybiBvYmplY3RzIGxpa2UgdGhpcyBieSB2YWx1ZS4KICAgICAgICAgICAgQ2F2ZWF0OiAgdGhlIGNsYXNzIG11c3QgcHJvdmlkZSBhIGNvcHkgY29uc3RydWN0b3IuCgkgICAgCjA1LzI2LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgLXByb3h5IG9wdGlvbiBhZGRlZCB0byBtYW55IGxhbmd1YWdlIG1vZHVsZXMuICBUaGlzIGlzIHRoZQogICAgICAgICAgICBzYW1lIGFzIC1zaGFkb3cuICBXZSBhcmUgbWVyZWx5IGNoYW5naW5nIHRlcm1pbm9sb2d5LgogICAgICAgICAgICAKMDUvMjYvMjAwMjogYmVhemxleQogICAgICAgICAgICBbcGVybF0gRml4ZWQgc29tZSBpbmNvbnNpc3RlbmNpZXMgaW4gdGhlIC1wYWNrYWdlIG9wdGlvbi4KICAgICAgICAgICAgLXBhY2thZ2UgbWVyZWx5IHNldHMgdGhlIHBhY2thZ2UgbmFtZSB0byBiZSB1c2VkIG9uIHRoZQogICAgICAgICAgICB3cmFwcGVycy4gIEl0IGRvZXMgbm90IGNoYW5nZSB0aGUgbmFtZSBvZiB0aGUgc2hhcmVkIGxpYnJhcnkKICAgICAgICAgICAgZmlsZSBvciB0aGUgbmFtZSBvZiB0aGUgZ2VuZXJhdGVkIC5wbSBmaWxlLiAgVGhpcyB3YXMKICAgICAgICAgICAgYnJva2VuIGF0IHNvbWUgcG9pbnQsIGJ1dCB3b3JrcyBhZ2FpbiBub3cuCgowNS8yNS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFtwZXJsXSBGaXhlZCBbIDQ3NTQ1MiBdIG1lbW9yeSBsZWFrIGluIHJldHVybi1ieS12YWx1ZS4KICAgICAgICAgICAgUHJvYmxlbSByZWxhdGVkIHRvIHN0YXRpYyBtZW1iZXIgdmFyaWFibGVzIHJldHVybmluZyBuZXdseQogICAgICAgICAgICBhbGxvY2F0ZWQgb2JqZWN0cy4gUmVwb3J0ZWQgYnkgUm95IExlY2F0ZXMuCiAKMDUvMjUvMjAwMjogYmVhemxleQogICAgICAgICAgICBbcGVybF0gRml4ZWQgWyA1MTMxMzQgXSAlQkxFU1NFRE1FTUJFUlMgaXNuJ3QgYWx3YXlzIHJpZ2h0LgogICAgICAgICAgICBSZXBvcnRlZCBieSBGbGV1ciBEaWFuYSBEcmFnYW4uCgowNS8yNS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNTQwNzM1IF0gLWltcG9ydGFsbCBhbmQgdGhlIC1JIG9wdGlvbi4KCjA1LzI1LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgW2d1aWxlXSBGaXhlZCBbIDUzMjcyMyBdIERlZmF1bHQgYXJnIGZvciBjaGFyKiBjYW4gU2VnVi4gIAogICAgICAgICAgICBFcnJvciBpbiBndWlsZSBtb2R1bGUuICBSZXBvcnRlZCBieSBCcmV0dCBXaWxsaWFtcy4KCjA1LzI1LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgU3VidGxlIGNoYW5nZSB0byB0eXBlbWFwIGFwcGxpY2F0aW9uIGNvZGUuICBUaGUgImZyZWVhcmciCiAgICAgICAgICAgIHR5cGVtYXAgbXVzdCBleGFjdGx5IG1hdGNoIHVwIHdpdGggdGhlICJpbiIgb3IgImlnbm9yZSIKICAgICAgICAgICAgdHlwZW1hcC4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAldHlwZW1hcChpbikgKGNoYXIgKmRhdGEsIGludCBsZW4pIHsgLi4uIH07CiAgICAgICAgICAgICAgICAgJXR5cGVtYXAoZnJlZWFyZykgY2hhciAqZGF0YSB7IC4uLiB9OyAKCiAgICAgICAgICAgICAgICAgdm9pZCBmb28oY2hhciAqZGF0YSwgaW50IGxlbik7CgogICAgICAgICAgICAgSW4gdGhpcyBjYXNlLCB0aGUgImluIiB0eXBlbWFwIGlzIGFwcGxpZWQsIGJ1dCB0aGUKICAgICAgICAgICAgIGZyZWVhcmcgdHlwZW1hcCBpcyBub3QuICBUaGlzIGlzIGJlY2F1c2UgdGhlIGZyZWVhcmcKICAgICAgICAgICAgIHR5cGVtYXAgZG9lc24ndCBtYXRjaCB1cCB3aXRoIHRoZSBpbnB1dCBhcmd1bWVudCBzZXF1ZW5jZS4KCjA1LzI1LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA1NDgyNzIgXSBEZWZhdWx0IGFyZ3VtZW50IGNvZGUgbWlzc2luZyBicmFjZXMuCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IEJyZXR0IFdpbGxpYW1zLgoKMDUvMjUvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDU0NzczMCBdIFN3aWdWYWx1ZVdyYXBwZXIgbmVlZGVkIGZvciBjb25zdHJ1Y3RvcnMuCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IFdpbGxpYW0gRnVsdG9uLgoKMDUvMjUvMjAwMjogYmVhemxleQogICAgICAgICAgICBVbmRlZmluZWQgaWRlbnRpZmllcnMgbm93IGV2YWx1YXRlIHRvIDAgd2hlbiBldmFsdWF0aW5nCiAgICAgICAgICAgIHByZXByb2Nlc3NvciBleHByZXNzaW9ucy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAgI2lmICFGT08KICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICNlbmRpZgogICAgICAKICAgICAgICAgICAgd2hlcmUgRk9PIGlzIHVuZGVmaW5lZCBvciBzZXQgdG8gc29tZSBub24tbnVtZXJpYyB2YWx1ZS4KCiAgICAgICAgICAgIEZpeGVzIFsgNTQwODY4IF0gI2lmIGRlZmluZWQgd2hhdGV2ZXIgLSBub3QgcGFyc2VkLgogICAgICAgICAgICBSZXBvcnRlZCBieSBBZGFtIEh1cHAuCgogCjA1LzI0LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgU1dJRyBub3cgaWdub3JlcyB0aGUgQysrICdleHBvcnQnIGtleXdvcmQuCgowNS8yMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFNvbWUgcmVmaW5lbWVudCBvZiB0eXBlLW5hbWUgbWFuZ2xpbmcgdG8gYWNjb3VudCBmb3IgcG9pbnRlcnMsIGFycmF5cywKICAgICAgICAgICAgcmVmZXJlbmNlcywgYW5kIG90aGVyIGVtYmVkZGVkIHR5cGUgY29uc3RydWN0cy4KCjA1LzIzLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgSW5pdGlhbCBhdHRlbXB0IGF0IHN1cHBvcnRpbmcgdGVtcGxhdGUgcGFydGlhbCBzcGVjaWFsaXphdGlvbi4gIEF0CiAgICAgICAgICAgIHRoZSB2ZXJ5IGxlYXN0LCBpdCBpcyBwYXJzZWQgYW5kIHRoZSBjbGFzc2VzIGFyZSBzdG9yZWQuICBNYXRjaGluZwogICAgICAgICAgICBvZiBpbnN0YW50aWF0aW9ucyB0byBzcGVjaWFsaXplZCB2ZXJzaW9uIGlzIG1vcmUgbGltaXRlZCBhbmQgYmFzZWQgb24KICAgICAgICAgICAgdGhlIFNXSUcgZGVmYXVsdCB0eXBlbWFwIHJ1bGVzOgoKICAgICAgICAgICAgICAgICAgICAgU1dJR1RZUEUgKgogICAgICAgICAgICAgICAgICAgICBTV0lHVFlQRSBbXQogICAgICAgICAgICAgICAgICAgICBTV0lHVFlQRSAmCgogICAgICAgICAgICBOb3csIHdoeSBpbiB0aGUgd29ybGQgd291bGQgeW91IHdhbnQgdG8gdXNlIHRoaXMgZmVhdHVyZT8gIE90aGVyCiAgICAgICAgICAgIHRoYW4gYWxsb3dpbmcgZm9yIHNsaWdodGx5IG1vZGlmaWVkIGNsYXNzIEFQSXMsIHRoaXMgY2FwYWJpbGl0eSBpcwogICAgICAgICAgICBwcmltYXJpbHkgdXNlZCB0byBwcm92aWRlIGFkdmFuY2VkIHdyYXBwaW5nIHN1cHBvcnQgZm9yIFNUTC1saWtlCiAgICAgICAgICAgIG9iamVjdHMuICBJdCBjYW4gYWxzbyBiZSBtaXhlZCB3aXRoIHR5cGVtYXBzLiAgSGVyZSBpcyBhbiBleGFtcGxlOgoKCiAgICAgICAgICAgICAgICAvKiBHZW5lcmljIHZlcnNpb24gKi8KICAgICAgICAgICAgICAgIHRlbXBsYXRlPGNsYXNzIFQ+IGNsYXNzIHZlY3RvciB7CiAgICAgICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIHZlY3RvcjxUPiAqIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBjb250YWluZXIgb2Ygb2JqZWN0cyAKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgLyogUGFydGlhbCBzcGVjaWFsaXphdGlvbiAocG9pbnRlcnMpICovCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBUPiBjbGFzcyB2ZWN0b3I8VCAqPiB7CiAgICAgICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIHZlY3RvcjxUPiAqIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBjb250YWluZXIgb2YgcG9pbnRlcnMgdG8gb2JqZWN0cy4KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgLyogU3BlY2lhbGl6YXRpb24gKGludGVnZXJzKS4gKi8KICAgICAgICAgICAgICAgIHRlbXBsYXRlPD4gY2xhc3MgdmVjdG9yPGludD4gewogICAgICAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSB2ZWN0b3I8aW50PiAqIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBjb250YWluZXIgb2YgaW50ZWdlcnMuCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAqKiogRVhQRVJJTUVOVEFMIEZFQVRVUkUgKioqCiAgICAgICAgICAgIAowNS8yMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEVuaGFuY2VtZW50IHRvIHR5cGVtYXBzLiAgIE5vcm1hbGx5LCB0eXBlbWFwIHZhcmlhYmxlcyBhcmUKICAgICAgICAgICAgcmVuYW1lZCB0byBhdm9pZCBjb25mbGljdHMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSBpbnQgKiAoaW50IHRlbXApIHsKICAgICAgICAgICAgICAgICAgICAkMSA9ICZ0ZW1wOwogICAgICAgICAgICAgICB9CgogICAgICAgICAgICBUaGlzIHJlc3VsdHMgaW4gY29kZSB0aGF0IGNyZWF0ZXMgYW5kIHVzZXMgdmFyaWFibGVzICJ0ZW1wMSIsInRlbXAyIiwgCiAgICAgICAgICAgICJ0ZW1wMyIgYW5kIHNvIGZvcnRoIGRlcGVuZGluZyBvbiBob3cgbWFueSB0aW1lcyB0aGUgdHlwZW1hcCBpcyB1c2VkLgogICAgICAgICAgICBTb21ldGltZXMgeW91IHdhbnQgYSBzaW5nbGUgdmFyaWFibGUgaW5zdGVhZC4gIFRvIGRvIHRoYXQsIHVzaW5nCiAgICAgICAgICAgIHRoZSBmb2xsb3dpbmcgbmFtaW5nIHNjaGVtZToKCiAgICAgICAgICAgICAgICAldHlwZW1hcChpbikgaW50ICooaW50IF9nbG9iYWxfdGVtcCkgewogICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgIElzIHRoaXMgY2FzZSwgYSBzaW5nbGUgdmFyaWFibGUgX2dsb2JhbF90ZW1wIGlzIGVtaXR0ZWQgaW4gdGhlCiAgICAgICAgICAgIHdyYXBwZXIgZnVuY3Rpb25zLiAgSXQgaXMgc2hhcmVkIGFjcm9zcyBhbGwgdHlwZW1hcHMuICBSZXBlYXRlZAogICAgICAgICAgICB0eXBlbWFwcyBkbyBub3QgcmVwbGljYXRlIHRoZSB2YXJpYWJsZS0tLXRoZXkgdXNlIHRoZSBmaXJzdCBvbmUKICAgICAgICAgICAgZW1pdHRlZC4KICAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgogICAgICAgICAgIAowNS8yMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE1pbm9yIGVuaGFuY2VtZW50IHRvIHR5cGVtYXBzLiAgSWYgeW91IGhhdmUgdGhpcyBjb2RlLAoKICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIEZvbyAoaW50IHNvbWV2YXIgPSAzKSB7CiAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICB9CgogICAgICAgICAgICB0aGUgZGVmYXVsdCB2YWx1ZSBmb3Igc29tZXZhciBpcyBub3cgZW1pdHRlZCBpbnRvIHRoZSB3cmFwcGVyIGNvZGUuCgowNS8yMi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkICVleHRlbmQgdG8gYmUgYmV0dGVyIGJlaGF2ZWQgaW4gbmFtZXNwYWNlcy4gIElmIHlvdSBoYXZlIGNvZGUKICAgICAgICAgICAgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgIG5hbWVzcGFjZSBmb28gewogICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYmFyIHsKICAgICAgICAgICAgICAgICAgICAgICAgJWV4dGVuZCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCBibGFoKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CiAgCiAgICAgICAgICAgIFNXSUcgbWF0Y2hlcyB0aGUgYmxhaCgpIG1ldGhvZCB0byBhIEMgZnVuY3Rpb24gbmFtZWQgCiAgICAgICAgICAgIHZvaWQgZm9vX2Jhcl9ibGFoKGZvbzo6YmFyICpzZWxmKS4KCiAgICAgICAgICAgIFRoaXMgaXMgY29uc2lzdGVudCB3aXRoIHRoZSBub24tbmFtZXNwYWNlIHZlcnNpb24uCiAgICAgICAgICAgIEJ1ZyByZXBvcnRlZCBieSBNYXJjZWxvIE1hdHVzLgoKMDUvMjIvMjAwMjogYmVhemxleQogICAgICAgICAgICBOZXcgbGlicmFyeSBmaWxlczogY3BvaW50ZXIuaSwgY2FycmF5cy5pLCBjbWFsbG9jLmkuICBUaGVzZQogICAgICAgICAgICBwcm92aWRlIGFjY2VzcyB0byBDIHBvaW50ZXJzIGFuZCBtZW1vcnkgYWxsb2NhdGlvbiBmdW5jdGlvbnMuCiAgICAgICAgICAgIFNlZSBEb2MvTWFudWFsL0xpYnJhcnkuaHRtbCBmb3IgZGV0YWlscy4KCjA1LzIyLzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gQyB0eXBlIGNoYXIgbm8gbG9uZ2VyIG1hcHMgdG8gSmF2YSB0eXBlIGJ5dGUsIGJ1dCB0byBKYXZhIHR5cGUgY2hhci4KICAgICAgICAgICAgSXQgaXMgbm93IHRyZWF0ZWQgYXMgYSBjaGFyYWN0ZXIgcmF0aGVyIHRoYW4gYSBzaWduZWQgbnVtYmVyLiBUaGlzIGZpdHMgaW4KICAgICAgICAgICAgd2l0aCB0aGUgb3RoZXIgbGFuZ3VhZ2UgbW9kdWxlcyBhbmQgaXMgYSBtb3JlIG5hdHVyYWwgbWFwcGluZyBhcyBjaGFyKiBpcyAKICAgICAgICAgICAgbWFwcGVkIGFzIGEgc3RyaW5nIG9mIGNoYXJhY3RlcnMuIE5vdGUgdGhhdCB0aGUgQyBzaWduZWQgY2hhciB0eXBlIGlzIHN0aWxsCiAgICAgICAgICAgIG1hcHBlZCB0byBhIEphdmEgYnl0ZS4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBKQVZBIE1PRFVMRSAqKioKCjA1LzIyLzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gSW1wcm92ZWQgY29uc3RhbnRzIHdyYXBwaW5nLiBDb25zdGFudHMgKCNkZWZpbmUgYW5kICVjb25zdGFudCkgdmFsdWVzIAogICAgICAgICAgICBhcmUgbm93IG9idGFpbmVkIHRocm91Z2ggYSBKTkkgY2FsbC4gUHJldmlvdXNseSB0aGUgdmFsdWUgd2FzIGNvbXBpbGVkIGFzIAogICAgICAgICAgICBKYXZhIGNvZGUsIGJ1dCB0aGlzIGRpZG4ndCB3b3JrIGZvciBhbGwgY2FzZXMsIGVnICNkZWZpbmUgMTIzVUxMLgoKMDUvMjIvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBib2d1cyBlcnJvciBtZXNzYWdlIHdpdGggJWV4dGVuZCBkaXJlY3RpdmUgYW5kIEMrKwogICAgICAgICAgICBhY2Nlc3Mgc3BlY2lmaWVycy4gIFJlcG9ydGVkIGJ5IE1hcmNlbG8gTWF0dXMuCgowNS8yMi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE5hbWVzcGFjZXMgYW5kIGVudW1zIG5vdyB3b3JrIGNvcnJlY3RseS4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgIG5hbWVzcGFjZSBGb28gewogICAgICAgICAgICAgICAgICAgIGVudW0gQmFyIHsgQSwgQiB9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgQnVnIHJlcG9ydGVkIGJ5IE1hcmNlbG8gTWF0dXMuCgowNS8yMS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFRoZSAldHlwZXMgZGlyZWN0aXZlIGNhbiBub3cgYmUgdXNlZCB0byBzcGVjaWZ5IGluaGVyaXRhbmNlIHJlbGF0aW9uc2hpcHMKICAgICAgICAgICAgaW4gdGhlIHJ1bnRpbWUgdHlwZSBzeXN0ZW0uICBGb3IgZXhhbXBsZSwKCiAgICAgICAgICAgICAgICAldHlwZXMoRm9vID0gQmFyKTsKCiAgICAgICAgICAgIHNwZWNpZmllcyB0aGF0IEZvbyBpc2EgQmFyLiAgICBVc2luZyB0aGlzIGlzIHBvdGVudGlhbGx5IHF1aXRlIGRhbmdlcm91cy4KICAgICAgICAgICAgSG93ZXZlciwgdGhpcyBpcyB1c2VmdWwgaW4gY2VydGFpbiBjYXNlcyAoYW5kIGluIHRoZSBTV0lHIGxpYnJhcnkpLgogICAgICAgICAgICAKMDUvMjAvMjAwMjogYmVhemxleQogICAgICAgICAgICAlbm9kZWZhdWx0IGFuZCAlbWFrZWRlZmF1bHQgZGlyZWN0aXZlcyBub3cgcmVxdWlyZSBhIHRyYWlsaW5nIHNlbWljb2xvbi4KICAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgJW5vZGVmYXVsdDsKICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgJW1ha2VkZWZhdWx0OwoKICAgICAgICAgICAgSW4gYWRkaXRpb24gYm90aCBkaXJlY3RpdmVzIGNhbiB0YWtlIGEgY2xhc3MgbmFtZS4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICVub2RlZmF1bHQgRm9vOwoKICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7ICAgLyogTm8gZGVmYXVsdCBjb25zdHJ1Y3Rvci9kZXN0cnVjdG9yICovCiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIGNsYXNzIEJhciB7ICAvKiBEZWZhdWx0IGNvbnN0cnVjdG9yL2Rlc3RydWN0b3IgZ2VuZXJhdGVkICovCiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCiAgICAgICAgICAgIElmIHlvdSBkb24ndCB1c2UgdGhlIHRyYWlsaW5nIHNlbWljb2xvbiwgdGhpbmdzIHdpbGwgbXlzdGVyaW91c2x5IGJyZWFrLgoKMDUvMjAvMjAwMjogYmVhemxleQogICAgICAgICAgICBNb3JlIGltcHJvdmVtZW50cyB0byB0eXBlIHN5c3RlbSBoYW5kbGluZy4gIFNXSUcgbm93IGNvcnJlY3RseSBoYW5kbGVzCiAgICAgICAgICAgIHRlbXBsYXRlIG5hbWVzIGFuZCBwYXJhbWV0ZXJzIGluIGEgbmFtZXNwYWNlLiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICBuYW1lc3BhY2UgZm9vIHsKICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBUPiBjbGFzcyBiYXIgeyB9OwogICAgICAgICAgICAgICAgICAgIHR5cGVkZWYgaW50IEludGVnZXI7CgogICAgICAgICAgICAgICAgICAgIHZvaWQgYmxhaChiYXI8SW50ZWdlcj4gKngpOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIEluIHRoZSBnZW5lcmF0ZWQgY29kZSwgYWxsIG9mIHRoZSB0eXBlbmFtZXMgYXJlIHByb3Blcmx5IHF1YWxpZmllZC4KCjA1LzE3LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gZGVwcmVjYXRlZCBicm9rZW4gLWpuaWMgYW5kIC1qbmljcHAgY29tbWFuZGxpbmUgb3B0aW9ucy4gVGhlIEMgb3IgQysrIAogICAgICAgICAgICBKTkkgY2FsbGluZyBjb252ZW50aW9uIGlzIG5vdyBkZXRlcm1pbmVkIGZyb20gdGhlIC1jKysgY29tbWFuZGxpbmUgb3B0aW9uLgoKMDUvMTYvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBUaGUgSkNBTEwgbWFjcm9zIHdoaWNoIGV4aXN0IHNvIHRoYXQgdGhlIHNhbWUgdHlwZW1hcHMgY2FuIGJlIHVzZWQKICAgICAgICAgICAgZm9yIGdlbmVyYXRpbmcgYm90aCB0aGUgQyBhbmQgQysrIEpOSSBjYWxsaW5nIGNvbnZlbnRpb25zIG5vIGxvbmdlciBhcHBlYXIKICAgICAgICAgICAgaW4gdGhlIGdlbmVyYXRlZCBjb2RlLiBUaGlzIGlzIGJlY2F1c2UgdGhlIG91dHB1dCBpcyBub3cgcGFzc2VkIHRocm91Z2ggdGhlIAogICAgICAgICAgICBTV0lHIHByZXByb2Nlc3NvciB3aGljaCBkb2VzIHRoZSBtYWNybyBleHBhbnNpb24gZm9yIGVpdGhlciBDIG9yIEMrKyAoZGVwZW5kaW5nCiAgICAgICAgICAgIG9uIHdoZXRoZXIgLWMrKyBpcyBwYXNzZWQgb24gdGhlIFNXSUcgY29tbWFuZGxpbmUpLgoKICAgICAgICAgICAgVGhlIGdlbmVyYXRpb24gb2YgdGhlIGZ1bmN0aW9ucyB1c2VkIGluIHRoZSBhcnJheSB0eXBlbWFwcyBoYXZlIGJlZW4gYWRqdXN0ZWQgCiAgICAgICAgICAgIHRvIHRha2UgYWNjb3VudCBvZiB0aGlzLiBUaGUgc2lkZSBlZmZlY3QgaXMgdGhhdCBhbnkgdHlwZW1hcHMgd2hpY2ggY29udGFpbmVkIAogICAgICAgICAgICBKQ0FMTCBtYWNyb3Mgd2l0aGluICV7ICV9IGJyYWNrZXRzIHdpbGwgaGF2ZSB0byBiZSBtb3ZlZCB3aXRoaW4ge30gYnJhY2tldHMgCiAgICAgICAgICAgIHNvIHRoYXQgdGhlIFNXSUcgcHJlcHJvY2Vzc29yIGNhbiBleHBhbmQgdGhlIG1hY3Jvcy4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBKQVZBIE1PRFVMRSAqKioKCjA1LzEzLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgQ2xhc3MgdGVtcGxhdGVzIG1heSBub3cgYmUgdXNlZCBhcyB0ZW1wbGF0ZSBwYXJhbWV0ZXJzLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgIHRlbXBsYXRlPGNsYXNzIFQsIHRlbXBsYXRlPGNsYXNzPiBjbGFzcyBDPiBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgIHRlbXBsYXRlPGNsYXNzIFQ+IGNsYXNzIEJhciB7CiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICV0ZW1wbGF0ZShGb29pKSBGb288aW50LCBCYXI+OwogICAgIAogICAgICAgICAgICBTV0lHIGRvZXNuJ3QgcmVhbGx5IGRvIGFueXRoaW5nIHNwZWNpYWwgd2l0aCB0aGlzLS0taXQncyBqdXN0CiAgICAgICAgICAgIGFub3RoZXIgd2F5IG9mIHNwZWNpZnlpbmcgYSB0ZW1wbGF0ZSBwYXJhbWV0ZXIuICAKICAgICAgICAgCjA1LzEzLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTWlub3IgcmVmaW5lbWVudCBvZiB0ZW1wbGF0ZSBzdXBwb3J0LiAgVGVtcGxhdGUgcGFyYW1ldGVyIG5hbWVzIGFyZSBubyBsb25nZXIKICAgICAgICAgICAgcmVxdWlyZWQgZm9yIHR5cGVzLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgdGVtcGxhdGU8Ym9vbD4gY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBPYnZpb3VzbHksIG5hbWVzIGFyZSByZXF1aXJlZCBmb3IgdGVtcGxhdGU8Y2xhc3MgVD47CgowNS8xMi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE5ldyBtYWNybyBleHBhbnNpb24gaW4gdHlwZW1hcHMuICBUaGUgc2VxdWVuY2U6CgogICAgICAgICAgICAgICAgJGRlc2NyaXB0b3IodHlwZSkKCiAgICAgICAgICAgIFdpbGwgZXhwYW5kIGludG8gdGhlIFNXSUcgdHlwZSBkZXNjcmlwdG9yIHN0cnVjdG9yIGZvcgogICAgICAgICAgICB0aGUgZ2l2ZW4gdHlwZS4gIFR5cGUgbWF5IGJlIGFueSBhYnN0cmFjdCBkYXRhdHlwZS4KICAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgJGRlc2NyaXB0b3IoaW50ICopCiAgICAgICAgICAgICAgICAkZGVzY3JpcHRvcihpbnQgKCopKGludCxkb3VibGUpKQogICAgICAgICAgICAgICAgJGRlc2NyaXB0b3IodmVjdG9yPGludD4gKikKCiAgICAgICAgICAgIENhdmVhdDogSXQgaXMgKk5PVCogY3VycmVudGx5IGxlZ2FsIHRvIHVzZSBvdGhlciB0eXBlbWFwCiAgICAgICAgICAgIHN1YnN0aXR1dGlvbiB2YXJpYWJsZXMgaW4gdGhlIG1hY3JvLiAgRm9yIGV4YW1wbGUgCiAgICAgICAgICAgICRkZXNjcmlwdG9yKCQxX3R5cGUpLgoKICAgICAgICAgICAgVGhlIHByaW1hcnkgcHVycG9zZSBvZiB0aGlzIG1vZGlmaWNhdGlvbiBpcyB0byBiZXR0ZXIKICAgICAgICAgICAgc3VwcG9ydCB0eXBlbWFwcyBmb3IgY29udGFpbmVyIG9iamVjdHMgb3IgdG8gYWxsb3cgdHlwZW1hcHMKICAgICAgICAgICAgdGhhdCBtaWdodCBiZSBwZXJmb3JtaW5nIHR5cGUgY29udmVyc2lvbnMuCiAgICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjA1LzExLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgVGhlIHdyYXBwaW5nIG9mIHJlZmVyZW5jZXMgdG8gcHJpbWl0aXZlIHR5cGVzIGhhcyBiZWVuCiAgICAgICAgICAgIGNoYW5nZWQgYXMgZm9sbG93czoKCiAgICAgICAgICAgIEFyZ3VtZW50cyBvZiB0eXBlICdjb25zdCBwcmltaXRpdmUgJicgYXJlIG5vdyBwYXNzZWQKICAgICAgICAgICAgYnkgdmFsdWUgYXMgb3Bwb3NlZCB0byBwb2ludGVycy4gIFJldHVybiB2YWx1ZXMgb2YKICAgICAgICAgICAgdHlwZSAnY29uc3QgcHJpbWl0aXZlICYnIGFyZSByZXR1cm5lZCBhcyB2YWx1ZXMgaW5zdGVhZCBvZgogICAgICAgICAgICBwb2ludGVycy4KCiAgICAgICAgICAgICdwcmltaXRpdmUnIGlzIGFueSBvbmUgb2YgaW50LCBzaG9ydCwgbG9uZywgbG9uZyBsb25nLAogICAgICAgICAgICBjaGFyLCBmbG9hdCwgZG91YmxlLCBib29sIChhcyB3ZWxsIGFzIHVuc2lnbmVkIHZhcmlhbnRzKS4KICAgICAgICAgICAgCiAgICAgICAgICAgIFRoaXMgY2hhbmdlIGlzIGJlaW5nIG1hZGUgdG8gYmV0dGVyIHN1cHBvcnQgQysrIHdyYXBwaW5nLS1lc3BlY2lhbGx5CiAgICAgICAgICAgIGNvZGUgdGhhdCBtYWtlcyB1c2Ugb2YgdGVtcGxhdGVzIGFuZCB0aGUgU1RMLgogICAgICAgICAgICAKMDUvMTEvMjAwMjogYmVhemxleQogICAgICAgICAgICBUaGUgJXRlbXBsYXRlIGRpcmVjdGl2ZSBjYW4gbm93IGJlIHVzZWQgdG8gYWNjZXNzIHRlbXBsYXRlcwogICAgICAgICAgICBpbiBhIG5hbWVzcGFjZS4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgIG5hbWVzcGFjZSBzdGQgewogICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlPGNsYXNzIFQ+IGNsYXNzIGNvbXBsZXggewogICAgICAgICAgICAgICAgICAgICAgIFQgcmUsIGltOwogICAgICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV4KFQgX3IgPSBUKCksIFQgX2kgPSBUKCkpIDogcmUoX3IpLCBpbShfaSkgeyB9CiAgICAgICAgICAgICAgICAgICAgICAgVCByZWFsKCkgeyByZXR1cm4gcmU7IH0KICAgICAgICAgICAgICAgICAgICAgICBUIGltYWcoKSB7IHJldHVybiBpbTsgfQogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJXRlbXBsYXRlKGNvbXBsZXgpIHN0ZDo6Y29tcGxleDxkb3VibGU+OwoKICAgICAgICAgICAgTm90ZTogVGhlcmUgYXJlIHNvbWUgdmVyeSBzdWJ0bGUgbmFtZXNwYWNlL3N5bWJvbCB0YWJsZSAKICAgICAgICAgICAgbWFuYWdlbWVudCBpc3N1ZXMgaW52b2x2ZWQgaW4gdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMuCiAgICAgICAgICAgIEl0IG1heSBub3Qgd29yayBpbiBjZXJ0YWluIGNhc2VzLgoKMDUvMTAvMjAwMjogYmVhemxleQogICAgICAgICAgICBNZW1iZXIgdGVtcGxhdGUgY29uc3RydWN0b3Igc3VwcG9ydCBhZGRlZC4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1QxLCB0eXBlbmFtZSBfVDI+IAogICAgICAgICAgICAgICBzdHJ1Y3QgcGFpciB7CiAgICAgICAgICAgICAgICAgX1QxIGZpcnN0OwogICAgICAgICAgICAgICAgIF9UMiBzZWNvbmQ7CiAgICAgICAgICAgICAgICAgcGFpcigpIDogZmlyc3QoX1QxKCkpLCBzZWNvbmQoX1QyKCkpIHsgfQogICAgICAgICAgICAgICAgIHRlbXBsYXRlPGNsYXNzIF9VMSwgY2xhc3MgX1UyPiBwYWlyKGNvbnN0IHBhaXI8X1UxLF9VMj4gJngpOwogICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgVG8gaW5zdGFudGlhdGUgdGhlIHRlbXBsYXRlLCB1c2UgJXRlbXBsYXRlIGFuZCAlZXh0ZW5kLgogICAgICAgICAgICBGb3IgZXhhbXBsZSwgdGhpcyBleHBhbmRzIHRoZSBjb25zdHJ1Y3RvciBpbnRvIGEgZGVmYXVsdAogICAgICAgICAgICBjb3B5IGNvbnN0cnVjdG9yOgoKICAgICAgICAgICAgICAgJWV4dGVuZCBwYWlyIHsKICAgICAgICAgICAgICAgICAgJXRlbXBsYXRlKHBhaXIpIHBhaXI8X1QxLF9UMj47CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgICAgIEhpZ2hseSBleHBlcmltZW50YWwuICBPdGhlciB1c2VzIG1heSBiZSBicm9rZW4uCgowNS8xMC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFRoZSAlZXh0ZW5kICglYWRkbWV0aG9kcykgZGlyZWN0aXZlIG5vIGxvbmdlciB3b3JrcyB1bmxlc3MKICAgICAgICAgICAgaXQgYXBwZWFycyBpbiB0aGUgcHVibGljIHNlY3Rpb24gb2YgYSBjbGFzcy4gICBBbiBlcnJvcgogICAgICAgICAgICBtZXNzYWdlIGlzIG5vdyBnZW5lcmF0ZWQgKGFzIG9wcG9zZWQgdG8gYSBzZWdtZW50YXRpb24gZmF1bHQpLgoKMDUvMDkvMjAwMjogYmVhemxleQogICAgICAgICAgICBOZXcgJXdhcm5maWx0ZXIoKSBkaXJlY3RpdmUuICBUaGlzIGRpcmVjdGl2ZSBhdHRhY2hlcyBhIHdhcm5pbmcKICAgICAgICAgICAgZmlsdGVyIHRvIHNwZWNpZmljIGRlY2xhcmF0aW9ucyBhbmQgaGFzIHRoZSBzYW1lIHNlbWFudGljcyBhcwogICAgICAgICAgICAlcmVuYW1lLCAlaWdub3JlLCAlZmVhdHVyZSwgYW5kIHNvIGZvcnRoLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAld2FybmZpbHRlcig1MDEpIGZvbzsgICAvLyBTdXBwcmVzcyBvdmVybG9hZGVkIHdhcm5pbmcKICAgICAgICAgICAgICAgaW50IGZvbyhpbnQpOwogICAgICAgICAgICAgICBpbnQgZm9vKGRvdWJsZSk7IAoKICAgICAgICAgICAgb3IKCiAgICAgICAgICAgICAgICV3YXJuZmlsdGVyKDUwMSkgT2JqZWN0Ojpmb28oZG91YmxlKTsKICAgICAgICAgICAgICAgY2xhc3MgT2JqZWN0IHsKICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICBpbnQgZm9vKGludCk7CiAgICAgICAgICAgICAgICAgIGludCBmb28oZG91YmxlKTsKICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBvbmx5IHN1cHByZXNzZXMgd2FybmluZ3MgaW4gbGF0ZXIgc3RhZ2VzIG9mIGNvZGUKICAgICAgICAgICAgZ2VuZXJhdGlvbi4gIEl0IGRvZXMgbm90IHN1cHByZXNzIHdhcm5pbmdzIHJlbGF0ZWQgdG8gcHJlcHJvY2Vzc2luZwogICAgICAgICAgICBvciBwYXJzaW5nLgogICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgowNS8wOS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFNXSUcgbm93IHN1cHBvcnRzIEM5OSB2YXJpYWRpYyBwcmVwcm9jZXNzb3IgbWFjcm9zLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAjZGVmaW5lIGRlYnVnZihmbXQsLi4uKSBmcHJpbnRmKHN0ZGVycixmbXQsX19WQV9BUkdTX18pCgogICAgICAgICAgICBUaGUgYXJndW1lbnQgIi4uLiIgaXMgdXNlZCB0byBpbmRpY2F0ZSB2YXJpYWJsZSBhcmd1bWVudHMgd2hpY2gKICAgICAgICAgICAgYXJlIGFsbCBwbGFjZWQgaW50byB0aGUgc3BlY2lhbCBhcmd1bWVudCBuYW1lIF9fVkFfQVJHU19fIGluCiAgICAgICAgICAgIHRoZSBtYWNybyBleHBhbnNpb24uICAKCiAgICAgICAgICAgIFNXSUcgYWxzbyBpbXBsZW1lbnRzIHRoZSBHTlUgKCMjKSBleHRlbnNpb24gZm9yIHN3YWxsb3dpbmcgdGhlCiAgICAgICAgICAgIHByZWNlZGluZyBjb21tYSB3aGVuIF9fVkFfQVJHU19fIGlzIGVtcHR5LiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICNkZWZpbmUgZGVidWdmKGZtdCwuLi4pIGZwcmludGYoc3RkZXJyLGZtdCwgIyNfX1ZBX0FSR1NfXykKCiAgICAgICAgICAgIEhlcmUgaXMgaG93IHRoaXMgaXMgZXhwYW5kZWQ6CgogICAgICAgICAgICAgICBkZWJ1Z2YoIiVkIiwgMykgIC0tPiBmcHJpbnRmKHN0ZGVyciwiJWQiLDMpCiAgICAgICAgICAgICAgIGRlYnVnZigiSGVsbG8iKSAgLS0+IGZwcmludGYoc3RkZXJyLCJIZWxsbyIgKQoKICAgICAgICAgICAgKG5vdGljZSB0aGUgZGVsZXRlZCBjb21tYSkuCiAgICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjA1LzA4LzIwMDI6IHNhbWphbSAoU2FtIExpZGRpY290dCkKICAgICAgICAgICAgTWFueSBjaGFuZ2VzIHRvIHBocCBtb2R1bGUuICBTaGFkb3cgY2xhc3NlcyBhcmUgbm93IGltcGxlbWVudGVkCiAgICAgICAgICAgIGVudGlyZWx5IGluIG5hdGl2ZSBDIGFuZCBubyBuZWVkIGZvciBwaHAtY29kZSBzaGFkb3cgd3JhcHBlcnMKICAgICAgICAgICAgUG9wdWxhdGVkIHRlbXBsYXRlIGNvbmZpZy5tNCBhbmQgTWFrZWZpbGUuaW4gYXMgbmVlZGVkIGJ5CiAgICAgICAgICAgIHBocGl6ZSBhcmUgZ2VuZXJhdGVkLgoKMDUvMDgvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIEEgY29weSBjb25zdHJ1Y3RvciBpcyBub3cgdHVybmVkIGludG8gYSAiY2xvbmUiCiAgICAgICAgICAgIGluc3RhbmNlIG1ldGhvZCAoc2VlIERhdmUncyBjaGFuZ2UgZm9yIGNvcHkgY29uc3RydWN0b3JzCiAgICAgICAgICAgIGRhdGVkIDQvNy8yMDAyKS4gVGhpcyBzZWVtcyBsaWtlIHRoZSBhcHByb3ByaWF0ZSB0aGluZwogICAgICAgICAgICB0byBkbyBmb3IgUnVieSBjb2RlLgoKMDUvMDgvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIEZpeGVkIFsgNTUzODY0IF0gSW5saW5lIGRlc3RydWN0b3IgY29kZSBub3Qgd3JpdHRlbi4KCjA1LzA4LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgJWlnbm9yZSBiZWhhdmVzIGJldHRlciB3aXRoIGNvbnN0cnVjdG9ycywgZGVzdHJ1Y3RvcnMsIGFuZCB0aGUKICAgICAgICAgICAgdHlwZSBzeXN0ZW0gaW4gZ2VuZXJhbC4gICBGb3IgY29uc3RydWN0b3JzIGFuZCBkZXN0cnVjdG9ycywKICAgICAgICAgICAgJWlnbm9yZSBub3cgc3VwcHJlc3NlcyB0aGUgY3JlYXRpb24gb2YgYSBkZWZhdWx0IGNvbnN0cnVjdG9yCiAgICAgICAgICAgIG9yIGRlc3RydWN0b3IuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgJWlnbm9yZSB+Rm9vOwogICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICBGb28oKTsKICAgICAgICAgICAgICAgICAgICB+Rm9vKCk7CiAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBJbiBTV0lHLTEuMy4xMSwgfkZvbygpIHNpbXBseSAiZGlzYXBwZWFyZWQiIGFuZCB0aGUgY29kZSBnZW5lcmF0b3IKICAgICAgICAgICAgY3JlYXRlZCBhIHdyYXBwZXIgZm9yIGEgZGVmYXVsdCBkZXN0cnVjdG9yIChhcyBpZiBpdCB3YXMgbmV2ZXIKICAgICAgICAgICAgZGVjbGFyZWQgaW4gdGhlIGludGVyZmFjZSkuICBJbiBTV0lHLTEuMy4xMiwgJWlnbm9yZSBzdXBwcmVzc2VzCiAgICAgICAgICAgIHRoZSBjcmVhdGlvbiBvZiBhIGRlc3RydWN0b3IgaWYgb25lIGlzIGFjdHVhbGx5IGRlZmluZWQuIAoKICAgICAgICAgICAgU2ltaWxhcmx5LCBldmVuIHRob3VnaCBhIGRlY2xhcmF0aW9uIGlzIGlnbm9yZWQsIGluZm9ybWF0aW9uCiAgICAgICAgICAgIG1heSBzdGlsbCBiZSBuZWVkZWQgdG8gcHJvcGVybHkgaGFuZGxlIHR5cGVzLiBGb3IgZXhhbXBsZSwgaGVyZQogICAgICAgICAgICBpcyBhIHZlcnkgc3VidGxlIGVycm9yIHRoYXQgaXMgZml4ZWQgYnkgdGhpcyBjaGFuZ2U6CgogICAgICAgICAgICAgICAgJWlnbm9yZSBzdGQ6OnN0cmluZzsgICAgICAgICAvLyBQcmV2ZW50IGNsYXNzIHdyYXBwaW5nCiAgICAgICAgICAgICAgICBuYW1lc3BhY2Ugc3RkIHsKICAgICAgICAgICAgICAgICAgIGNsYXNzIHN0cmluZyB7CiAgICAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSBzdHJpbmcgKiB7CiAgICAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2b2lkIGZvbyhzdGQ6OnN0cmluZyAqcyk7ICAgLy8gQnJva2VuLgoKICAgICAgICAgICAgQmVmb3JlIHRoaXMgZml4LCAlaWdub3JlIHdvdWxkIGNhdXNlIHRoZSBjbGFzcyBkZWZpbml0aW9uIHRvIGRpc2FwcGVhci4KICAgICAgICAgICAgVGhpcywgaW4gdHVybiwgd291bGQgY2F1c2UgdGhlIHR5cGVtYXAgdG8gYmUgbWlzYXBwbGllZC4gCiAKMDUvMDgvMjAwMjogYmVhemxleQogICAgICAgICAgICBNaW5vciBjaGFuZ2VzIHRvICVyZW5hbWUsICVpZ25vcmUsICVmZWF0dXJlLCBhbmQgcmVsYXRlZCBkaXJlY3RpdmVzCiAgICAgICAgICAgIGZvciBiZXR0ZXIgc3VwcG9ydCBvZiBkZXN0cnVjdG9ycy4gIERlc3RydWN0b3JzIGNhbiBub3cgYmUgcHJlY2lzZWx5CiAgICAgICAgICAgIHRhZ2dlZC4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAgJWlnbm9yZSBGb286On5Gb287CiAgICAgICAgICAgICAgICAgICVmZWF0dXJlKCJhY3Rpb24iKSB+QmFyIHsKICAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAKICAgICAgICAgICAgKkRldmVsb3BlciB3YXJuaW5nKiAKICAgICAgICAgICAgT3BlcmF0aW9ucyBzdWNoIGFzIHJlbmFtaW5nIGFuZCBmZWF0dXJlIGF0dGFjaG1lbnQgZm9yIGNsYXNzZXMgdXNlZCB0bwogICAgICAgICAgICBiZSBhcHBsaWVkIHRvIGRlc3RydWN0b3JzIGFzIHdlbGwuICBGb3IgaW5zdGFuY2UsIGlmIHlvdSBkaWQgdGhpczoKIAogICAgICAgICAgICAgICAgICVyZW5hbWUoQmFyKSBGb287CgogICAgICAgICAgICBUaGUgb3BlcmF0aW9uIGFwcGxpZWQgdG8gdGhlIGNsYXNzIGl0c2VsZiwgdGhlIGNvbnN0cnVjdG9yLCBhbmQKICAgICAgICAgICAgdGhlIGRlc3RydWN0b3IuICAgVGhpcyBpcyBubyBsb25nZXIgdGhlIGNhc2UuICBOb3cgc3VjaCBvcGVyYXRpb25zCiAgICAgICAgICAgIHdpbGwgb25seSBhcHBseSB0byB0aGUgY2xhc3MgYW5kIHRoZSBjb25zdHJ1Y3Rvci4gIE5vdGU6IGlmIHlvdQogICAgICAgICAgICB3ZXJlIHJlbHlpbmcgb24gdGhpcyBmb3IgY2xhc3MgcmVuYW1pbmcsIGJlIGF3YXJlIHRoYXQgcmVuYW1lZAogICAgICAgICAgICBjbGFzc2VzIHNob3VsZCByZWFsbHkgb25seSBiZSBoYW5kbGVkIGF0IHRoZSBsZXZlbCBvZiB0aGUgY2xhc3MgaXRzZWxmCiAgICAgICAgICAgIGFuZCBub3QgdGhlIGxldmVsIG9mIGluZGl2aWR1YWwgZGVjbGFyYXRpb25zIGluIHRoZSBjbGFzcyAoYWx0aG91Z2gKICAgICAgICAgICAgdGhleSBjYW4gYmUgcmVuYW1lZCBpbmRpdmlkdWFsbHkgaWYgbmVlZGVkKS4gIEFzIGZhciBhcyBJIGtub3csCiAgICAgICAgICAgIHRoZSBMYW5ndWFnZSBjbGFzcyBpcyBhbHJlYWR5IHRha2luZyBjYXJlIG9mIHRoaXMgY2FzZSBjb3JyZWN0bHkuCgowNS8wNy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE5ldyBzZXQgb2YgdGVzdHMuICBUaGUgRXhhbXBsZXMvdGVzdC1zdWl0ZS9lcnJvcnMgZGlyZWN0b3J5IGNvbnRhaW5zCiAgICAgICAgICAgIHRlc3RzIHRoYXQgdHJ5IHRvIGV4ZXJjaXNlIGFsbCBvZiBTV0lHJ3MgZXJyb3IgYW5kIHdhcm5pbmcgbWVzc2FnZXMuCgowNS8wNy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFN0YXJ0IG9mIGEgd2FybmluZyBmcmFtZXdvcmsuICBXYXJuaW5nIG1lc3NhZ2VzIGFyZSBub3cgYXNzaWduZWQgbnVtZXJpYyB2YWx1ZXMKICAgICAgICAgICAgdGhhdCBhcmUgc2hvd24gaW4gd2FybmluZyBtZXNzYWdlcy4gICBUaGVzZSBjYW4gYmUgc3VwcHJlc3NlZCB1c2luZyB0aGUKICAgICAgICAgICAgLXcgb3B0aW9uLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgIHN3aWcgLXczMDIgZXhhbXBsZS5pCiAgICAgICAgICAgICAgICAgc3dpZyAtdzMwMiwzMDUgZXhhbXBsZS5pCgogICAgICAgICAgICBBbHRlcm5hdGl2ZWx5LCB0aGUgI3ByYWdtYSBwcmVwcm9jZXNzb3IgZGlyZWN0aXZlIGNhbiBiZSB1c2VkIHRvIGRpc2FibGUgdGhpczoKCiAgICAgICAgICAgICAgICAgI3ByYWdtYSBTV0lHIG5vd2Fybj0zMDIKICAgICAgICAgICAgICAgICAjcHJhZ21hIFNXSUcgbm93YXJuPTMwMiwzMDUKCiAgICAgICAgICAgIE5vdGU6IFNpbmNlIFNXSUcgaXMgYSBtdWx0aS1wYXNzIGNvbXBpbGVyLCB0aGlzIHByYWdtYSBzaG91bGQKICAgICAgICAgICAgb25seSBiZSB1c2VkIHRvIGNoYW5nZSBnbG9iYWwgc2V0dGluZ3Mgb2YgdGhlIHdhcm5pbmcgZmlsdGVyLiAgSXQgc2hvdWxkCiAgICAgICAgICAgIG5vdCBiZSB1c2VkIHRvIHNlbGVjdGl2ZWx5IGVuYWJsZS9kaXNhYmxlIHdhcm5pbmdzIGluIGFuIGludGVyZmFjZSBmaWxlLgogICAgICAgICAgICBUaGUgaGFuZGxpbmcgb2YgI3ByYWdtYSBvY2N1cnMgaW4gdGhlIEMrKyBwcmVwcm9jb2Vzc29yIGFuZCBhZmZlY3RzIGFsbCAKICAgICAgICAgICAgc3Vic2VxdWVudCBzdGFnZXMgb2YgY29tcGlsYXRpb24uCgogICAgICAgICAgICBUaGUgLVdhbGwgb3B0aW9uIHR1cm5zIG9uIGFsbCB3YXJuaW5ncyBhbmQgb3ZlcnJpZGVzIGFueSBmaWx0ZXJzIHRoYXQKICAgICAgICAgICAgbWlnaHQgaGF2ZSBiZWVuIHNldC4KCiAgICAgICAgICAgIFdhcm5pbmdzIGNhbiBiZSBpc3N1ZWQgZnJvbSBhbiBpbnRlcmZhY2UgdXNpbmcgJXdhcm4uICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgJXdhcm4gIjExMDolc2VjdGlvbiBpcyBkZXByZWNhdGVkIgoKICAgICAgICAgICAgVGhlIGZpcnN0IHBhcnQgb2YgYSB3YXJuaW5nIG1lc3NhZ2UgaXMgYW4gb3B0aW9uYWwgd2FybmluZyBudW1iZXIuCiAgICAgICAgICAgIEEgY29tcGxldGUgc2V0IG9mIHdhcm5pbmcgbnVtYmVycyBpcyBmb3VuZCBpbiBTb3VyY2UvSW5jbHVkZS9zd2lnd2Fybi5oLgogICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgowNS8wNy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEludGVybmFsIHBhcnNpbmcgY2hhbmdlLiAgIERpcmVjdGl2ZXMgdG8gaW5jbHVkZSBmaWxlcyBub3cgdXNlIGJyYWNrZXRzIFsgLi4uIF0KICAgICAgICAgICAgaW5zdGVhZCBvZiB7IC4uLiB9LiAgIAoKICAgICAgICAgICAgICAgICAgJWluY2x1ZGVmaWxlICJmb28uaSIgWwogICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgXQoKICAgICAgICAgICAgVGhlIHVzZSBvZiB7IC4uLiB9IHdhcyBhIGJhZCBjaG9pY2UgYmVjYXVzZSB0aGV5IHdlcmUgaW5jbHVkZWQgaW1wbGljaXRseSBieQogICAgICAgICAgICB0aGUgcHJlcHJvY2Vzc29yIGFuZCBtYWRlIGl0IGltcG9zc2libGUgdG8gcHJvcGVybHkgZGV0ZWN0IGxlZ2l0aW1hdGUgbWlzc2luZyAnfScgCiAgICAgICAgICAgIGVycm9ycy4KCjA0LzE2LzIwMDItCjA1LzAyLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgU1dJRyBFdXJvcGVhbiBUb3VyOiBQYXJpcy1BbXN0ZXJkYW0tQmF0aC4KCjA0LzIzLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgVGhlICVhZGRtZXRob2RzIGRpcmVjdGl2ZSBoYXMgYmVlbiByZW5hbWVkIHRvICVleHRlbmQuCiAgICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgJWV4dGVuZCBGb28gewogICAgICAgICAgICAgICAgICAgaW50IGJsYWgoKSB7IC4uLiB9OwogICAgICAgICAgICAgICAgICAgaW50IGJhcigpIHsgLi4uIH07CiAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBNb3RpdmF0aW9uOiB0aGUgJWFkZG1ldGhvZHMgZGlyZWN0aXZlIGNhbiBiZSB1c2VkIGZvciBtYW55CiAgICAgICAgICAgIG90aGVyIHRhc2tzIGluY2x1ZGluZyBhZGRpbmcgc3ludGhlc2l6ZWQgYXR0cmlidXRlcywgY29uc3RydWN0b3JzLAogICAgICAgICAgICBhbmQgdHlwZW1hcHMuIEJlY2F1c2Ugb2YgdGhpcywgImFkZG1ldGhvZHMiIGlzIHNvbWV3aGF0IG1pc2xlYWRpbmcuCiAgICAgICAgICAgICVleHRlbmQgbW9yZSBwcmVjaXNlbHkgZGVzY3JpYmVzIHRoaXMgb3BlcmF0aW9uLS0tZXh0ZW5zaW9uIG9mIGEKICAgICAgICAgICAgY2xhc3Mgb3Igc3RydWN0dXJlLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCiAgICAgICAgICAgICVhZGRtZXRob2RzIHN0aWxsIHdvcmtzIHZpYSBhIG1hY3JvIGRlZmluaXRpb24uICAgSG93ZXZlciwKICAgICAgICAgICAgYSB3YXJuaW5nIG1lc3NhZ2UgbWF5IGJlIGdlbmVyYXRlZC4gICBFcnJvcnMgaW52b2x2aW5nICVhZGRtZXRob2RzCiAgICAgICAgICAgIHdpbGwgYWN0dWFsbHkgcmVmZXIgdG8gdGhlICVleHRlbmQgZGlyZWN0aXZlLiAgCiAgICAgICAgICAgIAowNC8yMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZ1cnRoZXIgcmVmaW5lbWVudCBvZiB0aGUgdHlwZSBzeXN0ZW0uICBUeXBlZGVmIG5vdwogICAgICAgICAgICBwcm9wYWdhdGVzIHRocm91Z2ggZnVuY3Rpb25zLCBwb2ludGVycyB0byBmdW5jdGlvbnMsCiAgICAgICAgICAgIGFuZCBwb2ludGVycyB0byBtZW1iZXIgZnVuY3Rpb25zLgogICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgIHR5cGVkZWYgaW50IEludGVnZXI7CiAgICAgICAgICAgICAgIHZvaWQgZm9vKGludCAoKngpKGludCksIEludGVnZXIgKCp5KShJbnRlZ2VyKSk7CgogICAgICAgICAgICBJbiB0aGlzIGNhc2UsIGFyZ3VtZW50cyAneCcgYW5kICd5JyBoYXZlIGV4YWN0bHkKICAgICAgICAgICAgdGhlIHNhbWUgdHlwZSAoYW5kIHdvdWxkIG9idmlvdXNseSBhY2NlcHQgb2JqZWN0cwogICAgICAgICAgICBvZiBlaXRoZXIgdHlwZSkuCgogICAgICAgICAgICBTaW1pbGFybHksIGNvbnNpZGVyIHRoaXM6CgogICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgdHlwZWRlZiBGb28gQmFyOwogICAgICAgICAgICAgICB2b2lkIGJhcihpbnQgKEZvbzo6KngpKGludCksIGludCAoQmFyOjoqeSkoaW50KSk7CgogICAgICAgICAgICBJbiB0aGlzIGNhc2UsIGFyZ3VtZW50cyB4IGFuZCB5IGFyZSB0aGUgc2FtZSAKICAgICAgICAgICAgdHlwZSAodmlhIHR5cGVkZWYpLgogICAgICAgICAgICAKMDQvMjIvMjAwMjogYmVhemxleQogICAgICAgICAgICBTV0lHIG5vdyBnZW5lcmF0ZXMgYSB3YXJuaW5nIG1lc3NhZ2UgaWYgYW55IHBhcnQgb2YKICAgICAgICAgICAgYW4gZXhwcmVzc2lvbiBpbnZvbHZlcyB2YWx1ZXMgZnJvbSBhIHByaXZhdGUgcGFydCBvZiBhIGNsYXNzLgogICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgcHJpdmF0ZToKICAgICAgICAgICAgICAgICAgICBzdGF0aWMgaW50IFg7CiAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgIHZvaWQgYmxhaChpbnQgYSwgaW50IGIgPSBYKTsgICAvLyBXYXJuaW5nCiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgSW4gdGhpcyBjYXNlLCB0aGUgZGVmYXVsdCBhcmd1bWVudCBpcyBpZ25vcmVkLiAgVGhlcmUKICAgICAgICAgICAgYXJlIHdvcmthcm91bmRzLCBidXQgdGhleSBhcmUgcmF0aGVyIGNsdW1zeS4gIEZvciBpbnN0YW5jZSwKICAgICAgICAgICAgeW91IG1pZ2h0IGRvIHRoaXM6CgogICAgICAgICAgICAgICAgICAgICVmZWF0dXJlKCJhY3Rpb24iKSBibGFoKGludCxpbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICBpZiAoJG5hcmdzID09IDEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBibGFoKGFyZzEpOwogICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gYmxhaChhcmcxLGFyZzIpOwogICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdm9pZCBibGFoKGludCBhLCBpbnQgYiA9IDApOwoKCjA0LzIxLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgVXNlIG9mIHRoZSAlaW5saW5lIGRpcmVjdGl2ZSBpbnNpZGUgYSBuYW1lc3BhY2UgaXMKICAgICAgICAgICAgZm9yYmlkZGVuIGFuZCBub3cgZ2VuZXJhdGVzIGFuIGVycm9yIG1lc3NhZ2UuICAgVGhpcyBpcwogICAgICAgICAgICBub3QgYWxsb3dlZCBzaW5jZSB0aGUgaW5saW5lZCBjb2RlIHRoYXQgaXMgZW1pdHRlZCBpcwogICAgICAgICAgICBub3QgcGxhY2VkIGluc2lkZSBhIG5hbWVzcGFjZS4gIFRoaXMgY29uZnVzZXMgb3RoZXIKICAgICAgICAgICAgc3RhZ2VzIG9mIHBhcnNpbmcuCiAgICAgICAgICAgICAgICAgICAgCjA0LzIxLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgU29tZSBidWcgZml4ZXMgdG8gY2FzdGluZyBvcGVyYXRpb25zIGFuZCBleHByZXNzaW9uCiAgICAgICAgICAgIHBhcnNpbmcuICAgRHVlIHRvIHNvbWUgcGFyc2luZyBpc3N1ZXMsIGl0IGlzIG5vdCAKICAgICAgICAgICAgY3VycmVudGx5IHBvc3NpYmxlIHRvIHVzZSBjYXN0cyBmb3IgYWxsIHBvc3NpYmxlCiAgICAgICAgICAgIGRhdGF0eXBlcy4gICBIb3dldmVyLCB0aGUgY29tbW9uIGNhc2VzIHdvcmsuCgowNC8yMC8yMDAyOiBiZWF6bGV5IChBbXN0ZXJkYW0pCiAgICAgICAgICAgIE1lbWJlciB0ZW1wbGF0ZXMgbm93IHdvcmsuICBTaW1wbHkgdXNlIHRoZSAldGVtcGxhdGUKICAgICAgICAgICAgZGlyZWN0aXZlIGluc2lkZSBhIGNsYXNzIG9yICVhZGRtZXRob2RzIHRvIGNyZWF0ZQogICAgICAgICAgICBpbnN0YW50aWF0aW9ucyAoc2VlIERvYy9NYW51YWwvU1dJR1BsdXMuaHRtbCkuICBTdXBwb3J0aW5nCiAgICAgICAgICAgIHRoaXMgd2FzIGVhc3ktLS1lYXJsaWVyIGNoYW5nZXMgdG8gdGVtcGxhdGVzIG1hZGUgaXQKICAgICAgICAgICAgcG9zc2libGUgdXNpbmcgb25seSBhIHR3by1saW5lIG1vZGlmaWNhdGlvbiB0byB0aGUgcGFyc2VyCiAgICAgICAgICAgIGFuZCBhIGZldyBtaW5vciBtb2RpZmljYXRpb25zIGVsc2V3aGVyZS4gIEhtbW0sIGNvbWUgdG8gCiAgICAgICAgICAgIHRoaW5rIG9mIGl0LCB0aGUgc21va2Ugd2FzIHJhdGhlciB0aGljayBpbiB0aGF0IEludGVybmV0ICJjYWZlIi4KICAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgogICAgICAgICAgICAKMDQvMTkvMjAwMjogYmVhemxleSAoVEdWKQogICAgICAgICAgICBJbXByb3ZlZCBoYW5kbGluZyBvZiBub24tdHlwZSB0ZW1wbGF0ZSBwYXJhbWV0ZXJzLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgIHZlY3RvcjxpbnQsMTAwPjsKCiAgICAgICAgICAgIFNpbXBsZSBudW1iZXJzIGFuZCBzdHJpbmdzIGNhbiBiZSB1c2VkIHdpdGggdGhlICV0ZW1wbGF0ZQogICAgICAgICAgICBkaXJlY3RpdmUgYXMgd2VsbC4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAldGVtcGxhdGUodmVjaW50MTAwKSB2ZWN0b3I8aW50LDEwMD47CgogICAgICAgICAgICBOb3RlOiBBcml0aG1ldGljIGV4cHJlc3Npb25zIGFyZSBub3QgY3VycmVudGx5IGFsbG93ZWQuCiAgICAgICAgICAgIAogICAgICAgICAgICBEZWZhdWx0IHRlbXBsYXRlIGFyZ3VtZW50cyBub3cgd29yayBhbmQgZG8gbm90IGhhdmUgdG8KICAgICAgICAgICAgYmUgZ2l2ZW4gdG8gJXRlbXBsYXRlLgogICAgICAgICAgICAgICAgICAgICAgICAKMDQvMTgvMjAwMjogYmVhemxleSAoUGFyaXMpCiAgICAgICAgICAgIENoYW5nZSBpbiBpbnRlcm5hbCB0ZW1wbGF0ZSBoYW5kbGluZy4gIFRlbXBsYXRlCiAgICAgICAgICAgIHBhcmFtZXRlcnMgYXJlIG5vdyBmdWxseSBpbnRlZ3JhdGVkIGludG8gdGhlIHR5cGUKICAgICAgICAgICAgc3lzdGVtIGFuZCBhcmUgYXdhcmUgb2YgdHlwZWRlZnMsIGV0Yy4gIFRoaXMgYnVpbGRzCiAgICAgICAgICAgIHVwb24gdGhlIGNoYW5nZSBiZWxvdy4gICAKCiAgICAgICAgICAgICoqKiBERVZFTE9QRVIgV0FSTklORyAqKioKICAgICAgICAgICAgV29yZCBvZiBjYXV0aW9uIHRvIGxhbmd1YWdlIG1vZHVsZSB3cml0ZXJzLiAgVGhlICJuYW1lIgogICAgICAgICAgICBwYXJhbWV0ZXIgb2YgY2VydGFpbiBwYXJzZSB0cmVlIG5vZGVzIChjbGFzc2VzLCBmdW5jdGlvbnMsIGV0Yy4pCiAgICAgICAgICAgIG1heSBiZSBwYXJhbWV0ZXJpemVkIHdpdGggdHlwZXMuICAgVGhpcyBwYXJhbWV0ZXJpemF0aW9uIGlzCiAgICAgICAgICAgIGRvbmUgdXNpbmcgU1dJRyB0eXBlLXN0cmluZ3MgYW5kIG5vdCB0aGUgdW5kZXJseWluZyBDIHZlcnNpb24uCiAgICAgICAgICAgIEZvciBleGFtcGxlLAoKICAgICAgICAgICAgICAgaW50IG1heDxpbnQgKj4oaW50ICosaW50ICopICAKCiAgICAgICAgICAgIGhhcyBhIG5hbWUgb2YgIm1heDwocC5pbnQpPiIuICBJZiB5b3UgdXNlIHRoZSBuYW1lIGRpcmVjdGx5LAogICAgICAgICAgICB5b3UgbWF5IGdldCBzeW50YXggZXJyb3JzIGluIHRoZSBnZW5lcmF0ZWQgY29kZS4gIFRvIGZpeCB0aGlzLAogICAgICAgICAgICB1c2UgU3dpZ1R5cGVfbmFtZXN0cihuYW1lKSB0byBjb252ZXJ0IGEgcGFyYW1ldGVyaXplZCBuYW1lIAogICAgICAgICAgICB0byBhIEMgbmFtZSB3aXRoIHZhbGlkIHN5bnRheC4gIFRoZSBpbnRlcm5hbCB2ZXJzaW9uIGlzCiAgICAgICAgICAgIHVzZWQgdG8gcmVkdWNlIHRlbXBsYXRlIHR5cGVzIHRvIGEgY29tbW9uIHJlcHJlc2VudGF0aW9uIAogICAgICAgICAgICBhbmQgdG8gaGFuZGxlIGlzc3VlcyBvZiB0eXBlZGVmLgogICAgICAgICAgICAKMDQvMTYvMjAwMjogYmVhemxleSAoc29tZXdoZXJlIG92ZXIgdGhlIEF0bGFudGljKQogICAgICAgICAgICBFbmhhbmNlbWVudCBvZiB0eXBlZGVmIHJlc29sdXRpb24uICBUaGUgdHlwZSBzeXN0ZW0gaXMgbm93CiAgICAgICAgICAgIGF3YXJlIG9mIHRlbXBsYXRlIGFyZ3VtZW50cyBhbmQgdHlwZWRlZi4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAgdHlwZWRlZiBpbnQgSW50ZWdlcjsKICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgZm9vKHZlY3RvcjxpbnQ+ICp4LCB2ZWN0b3I8SW50ZWdlcj4gKnkpOwoKICAgICAgICAgICAgSW4gdGhpcyBjYXNlLCB2ZWN0b3I8aW50PiBhbmQgdmVjdG9yPEludGVnZXI+IGFyZQogICAgICAgICAgICB0aGUgc2FtZSB0eXBlLiAgIFRoZXJlIGlzIHNvbWUgaW50ZXJhY3Rpb24gYmV0d2VlbiB0aGlzCiAgICAgICAgICAgIG1lY2hhbmlzbSBhbmQgdGhlIGltcGxlbWVudGF0aW9uIG9mIHR5cGVtYXBzLiAgRm9yIGV4YW1wbGUsCiAgICAgICAgICAgIGEgdHlwZW1hcCBkZWZpbmVkIGZvciB2ZWN0b3I8aW50PiAqIHdvdWxkIGFwcGx5IHRvIGVpdGhlciB0eXBlLgogICAgICAgICAgICBIb3dldmVyLCBhIHR5cGVtYXAgZm9yIHZlY3RvcjxJbnRlZ2VyPiAqIHdvdWxkIG9ubHkgYXBwbHkgdG8KICAgICAgICAgICAgdGhhdCB0eXBlLgoKICAgICAgICAgICAgVHlwZWRlZnMgYW5kIHR5cGVtYXBzIGFuZCBtYXRjaGVkIGJ5IGxlZnQtbW9zdCBleHBhbnNpb24uCiAgICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICB2ZWN0b3I8SW50ZWdlcixJbnRlZ2VyPiAtLT4gCiAgICAgICAgICAgICAgdmVjdG9yPGludCwgSW50ZWdlcj4gLS0+CiAgICAgICAgICAgICAgdmVjdG9yPGludCwgaW50PgoKCjA0LzI0LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gQ2hhbmdlcyB0byBKYXZhIHNoYWRvdyBjbGFzc2VzLgogICAgICAgICAgICBPdmVyY29tZXMgYSBidWcgd2hlcmUgdGhlIG1vZHVsZSBhc3N1bWVkIHRoYXQgYSBwb2ludGVyIHRvIGEgZGVyaXZlZAogICAgICAgICAgICBjbGFzcyBjb3VsZCBiZSB1c2VkIGluIHBsYWNlIG9mIGEgcG9pbnRlciB0byBhIGJhc2UgY2xhc3MuIFRoYW5rcyAKICAgICAgICAgICAgdG8gU3RlcGhlbiBNY0NhdWwgZm9yIGFuYWx5c2luZyB0aGUgYnVnIGFuZCBzdWJtaXR0aW5nIHBhdGNoZXMuCgogICAgICAgICAgICBBIGNvbnNlcXVlbmNlIGlzIHRoYXQgdGhlIGdldENQdHIoKSBtZXRob2QgaW4gZWFjaCBzaGFkb3cgY2xhc3MgaGFzCiAgICAgICAgICAgIGRpc2FwcGVhcmVkIGFuZCBoYXMgYmVlbiByZXBsYWNlZCB3aXRoIGEgZ2V0Q1B0clhYWCgpLCB3aGVyZSBYWFggaXMgdGhlIAogICAgICAgICAgICBzaGFkb3cgY2xhc3MgbmFtZS4gSWYgeW91IGhhdmUgY29kZSB0aGF0IHByZXZpb3VzbHkgdXNlZCBnZXRDUHRyKCksIAogICAgICAgICAgICBhbmQgdGhlIGFzc29jaWF0ZWQgY2xhc3MgaXMgd3JhcHBpbmcgYSBDIHN0cnVjdCBvciBhIEMrKyBjbGFzcyB0aGF0CiAgICAgICAgICAgIGlzIG5vdCBpbnZvbHZlZCBpbiBhbiBpbmhlcml0YW5jZSBjaGFpbiwganVzdCB1c2UgdGhlIG5ldyBtZXRob2QuIElmCiAgICAgICAgICAgIGhvd2V2ZXIsIHRoZSBjbGFzcyBpcyBpbnZvbHZlZCBpbiBhbiBpbmhlcml0YW5jZSBjaGFpbiwgeW91J2xsIGhhdmUKICAgICAgICAgICAgdG8gY2hvb3NlIHdoaWNoIHBvaW50ZXIgeW91IHJlYWxseSB3YW50LiBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eSAKICAgICAgICAgICAgaGFzIGJlZW4gYnJva2VuIGFzIG5vdCB1c2luZyB0aGUgY29ycmVjdCBwb2ludGVyIGNhbiBsZWFkIHRvIHdlaXJkIGJ1Z3MKICAgICAgICAgICAgdGhyb3VnaCBpbGwtZGVmaW5lZCBiZWhhdmlvdXIuIElmIHlvdSBhcmUgc3VyZSB5b3Ugd2FudCB0aGUgb2xkIG1ldGhvZHMsIAogICAgICAgICAgICB5b3UgY291bGQgYWRkIHRoZW0gYmFjayBpbnRvIGFsbCBzaGFkb3cgY2xhc3NlcyBieSBhZGRpbmcgdGhpcyBhdCB0aGUgCiAgICAgICAgICAgIGJlZ2lubmluZyBvZiB5b3VyIGludGVyZmFjZSBmaWxlOgoKICAgICAgICAgICAgJXByYWdtYShqYXZhKSBhbGxzaGFkb3djb2RlPSV7CiAgICAgICAgICAgICAgcHVibGljIGxvbmcgZ2V0Q1B0cigpewogICAgICAgICAgICAgICAgcmV0dXJuIHN3aWdDUHRyOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgJX0KCiAgICAgICAgICAgIFBsZWFzZSBzZWUgZW50cnkgZGF0ZWQgMDcvMjMvMjAwMiB0byBzZWUgaG93IHRvIGRvIHRoaXMgYWZ0ZXIgdGhlIGRlcHJlY2F0aW9uCiAgICAgICAgICAgIG9mIHRoZSBhbGxzaGFkb3djb2RlIHByYWdtYS4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBKQVZBIE1PRFVMRSAqKioKCjA0LzEzLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgcHJvYmxlbSB3aXRoIGRlZmF1bHQgYXJndW1lbnRzIGFuZCByZWZlcmVuY2VzLiAgIERlY2xhcmF0aW9ucyBzdWNoIAogICAgICAgICAgICBhcyB0aGlzIHNob3VsZCBub3cgd29yazoKCiAgICAgICAgICAgICAgICB2b2lkIGZvbyhjb25zdCBzdHJpbmcgJnggPSAiSGVsbG8iKTsKCjA0LzEyLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgQWRkZWQgdHlwZW1hcCAkKiBzdWJzdGl0dXRpb25zIGZvciB0eXBlbWFwcyBpbnZvbHZpbmcgYXJyYXlzLgogICAgICAgICAgICBSZXF1ZXN0ZWQgYnkgV2lsbGlhbSBGdWx0b24uCgowNC8xMS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIGlzIG5vdyBzdXBwb3J0ZWQuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgIHRlbXBsYXRlPD4gY2xhc3MgdmVjdG9yPGludD4gewogICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFdoZW4gdGhlICV0ZW1wbGF0ZSBkaXJlY3RpdmUgaXMgdXNlZCwgaXQgd2lsbCB1c2UgYSBzcGVjaWFsaXphdGlvbgogICAgICAgICAgICBpZiBvbmUgaXMgZGVmaW5lZC4gICBUaGVyZSBhcmUgc3RpbGwgc29tZSBsaW1pdGF0aW9ucy4gUGFydGlhbAogICAgICAgICAgICBzcGVjaWFsaXphdGlvbiBpcyBub3Qgc3VwcG9ydGVkLiAgQSB0ZW1wbGF0ZSBvZiB0eXBlIDx2b2lkICo+IGRvZXMKICAgICAgICAgICAgbm90IG1hdGNoIGFsbCBwb2ludGVycy4KICAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKMDQvMTEvMjAwMjogYmVhemxleQogICAgICAgICAgICBNYWpvciBjaGFuZ2UgdG8gdGVtcGxhdGUgd3JhcHBpbmcgaW50ZXJuYWxzLiBUZW1wbGF0ZSBkZWNsYXJhdGlvbnMgYXJlCiAgICAgICAgICAgIG5vIGxvbmdlciBwcm9jZXNzZWQgYXMgbWFjcm9zIGJ1dCBub3cgcmVzdWx0IGluIHJlYWwgcGFyc2UtdHJlZQogICAgICAgICAgICBub2Rlcy4gIFRoZSAldGVtcGxhdGUgZGlyZWN0aXZlIGV4cGFuZHMgdGhlc2Ugbm9kZXMgaW50byBhCiAgICAgICAgICAgIHNwZWNpZmljIGluc3RhbnRpYXRpb24uICAgVGhpcyBjaGFuZ2UgZW5hYmxlcyBhIG51bWJlciBvZgogICAgICAgICAgICBuZXcgYW5kIGludGVyZXN0aW5nIGNhcGFiaWxpdGllczoKCiAgICAgICAgICAgIERpcmVjdGl2ZXMgc3VjaCBhcyAlcmVuYW1lLCAlZmVhdHVyZSwgYW5kICVhZGRtZXRob2RzIGNhbgogICAgICAgICAgICBub3cgYmUgYXBwbGllZCB0byB1bmluc3RhbnRpYXRlZCB0ZW1wbGF0ZXMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgJXJlbmFtZShiYXJzaXplKSB2ZWN0b3I6OmJhcihjaGFyICpidWYsIGludCBsZW4pOwogICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IGNsYXNzIHZlY3RvciB7CiAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgIHZvaWQgYmFyKGNoYXIgKmJ1Zik7CiAgICAgICAgICAgICAgICAgdm9pZCBiYXIoY2hhciAqYnVmLCBpbnQgbGVuKTsgICAvLyBSZW5hbWVkCiAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgJXRlbXBsYXRlKGludHZlY3RvcikgdmVjdG9yPGludD47ICAgLy8gUmVuYW1pbmcgY2FycmllcyB0aHJvdWdoCgogICAgICAgICAgICAKICAgICAgICAgICAgQnkgcGFyc2luZyB0ZW1wbGF0ZXMgaW50byBhbiBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZSwgaXQgd2lsbAogICAgICAgICAgICBiZSBwb3NzaWJsZSB0byBzdXBwb3J0IHNwZWNpYWxpemF0aW9uIChhbmQgbWF5YmUgcGFydGlhbAogICAgICAgICAgICBzcGVjaWFsaXphdGlvbikuCiAgICAgICAgICAgIAogICAgICAgICAgICBUaGlzIGlzIGhpZ2hseSBleHBlcmltZW50YWwgYW5kIGEgd29yayBpbiBwcm9ncmVzcy4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgogICAgICAgICAgICBJbiBTV0lHLTEuMy4xMSwgdGVtcGxhdGUgZGVjbGFyYXRpb25zIHdlcmUgc2ltcGx5IHByb2Nlc3NlZAogICAgICAgICAgICBhcyB3ZWlyZCBtYWNyb3MuICBObyBvdGhlciBpbmZvcm1hdGlvbiB3YXMgcmV0YWluZWQuICAgVGhpcyAKICAgICAgICAgICAgbWFkZSBpdCBpbXBvc3NpYmxlIHRvIHN1cHBvcnQgbW9yZSBhZHZhbmNlZCBmZWF0dXJlcyBhbmQgCiAgICAgICAgICAgIGNvbXBsaWNhdGVkIG1hbnkgb3RoZXIgcGFydHMgb2YgdGhlIGltcGxlbWVudGF0aW9uLgoKMDQvMDkvMjAwMjogYmVhemxleQogICAgICAgICAgICBDaGFuZ2UgdG8gdGVtcGxhdGUgY2xhc3Mgd3JhcHBpbmcuICAgVGhlcmUgd2VyZSBhIHZhcmlldHkgb2YKICAgICAgICAgICAgImlzc3VlcyIgd2l0aCB0aGUgb2xkIGFwcHJvYWNoIHJlbGF0ZWQgdG8gcGFyc2luZywgdGhlIHR5cGUKICAgICAgICAgICAgc3lzdGVtLCBhbmQgbmFtZXNwYWNlcy4gICBUaGVzZSBjaGFuZ2VzIGFyZSBtZWFudCB0byByZWN0aWZ5CiAgICAgICAgICAgIHNvbWUgb2YgdGhlc2UgcHJvYmxlbXM6CgogICAgICAgICAgICBBIHNwZWNpZmljIGluc3RhbnRpYXRpb24gb2YgYSB0ZW1wbGF0ZSBjYW4gbm93IGJlIHNwZWNpZmllZAogICAgICAgICAgICBieSBpbmNsdWRpbmcgdGhlIGNsYXNzIGlubGluZSBsaWtlIHRoaXM6CiAKICAgICAgICAgICAgICAgICAgY2xhc3MgdmVjdG9yPGludD4gewogICAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yKCk7CiAgICAgICAgICAgICAgICAgICAgICB+dmVjdG9yKCk7CiAgICAgICAgICAgICAgICAgICAgICAgLi4uIHdoYXRldmVyIC4uLgoJICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFRoaXMgaXMgdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24sIGJ1dCBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uIGlzCiAgICAgICAgICAgIG5vdCB5ZXQgaW1wbGVtZW50ZWQuCiAgICAgICAgICAgIAogICAgICAgICAgICBUaGUgJXRlbXBsYXRlIGRpcmVjdGl2ZSBoYXMgYmVlbiBtb2RpZmllZCB0byBleHBhbmQgcm91Z2hseSBhcwogICAgICAgICAgICBmb2xsb3dzOgoKICAgICAgICAgICAgICAgICAldGVtcGxhdGUodmVjaW50KSB2ZWN0b3I8aW50PjsKCiAgICAgICAgICAgIGJlY29tZXMKCiAgICAgICAgICAgICAgICAgJXJlbmFtZSh2ZWNpbnQ+IHZlY3RvcjxpbnQ+OwogICAgICAgICAgICAgICAgIGNsYXNzIHZlY3RvcjxpbnQ+IHsKICAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgIHZlY3RvcigpOwogICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgTm90ZSB0aGF0IHRoaXMgc2ltcGx5IGJ1aWxkcyB1cG9uIHRoZSBjb2RlIGFib3ZlICh0ZW1wbGF0ZXMKICAgICAgICAgICAgaW5jbHVkZWQgaW5saW5lKS4KCiAgICAgICAgICAgIFRoaXMgbW9kaWZpZWQgYXBwcm9hY2ggdG8gd3JhcHBpbmcgZml4ZXMgc29tZSBzdWJ0bGUgdHlwZQogICAgICAgICAgICBpc3N1ZXMuICBGb3IgaW5zdGFuY2UsIHlvdSBjYW4gbm93IGRlZmluZSB0eXBlbWFwcyBhbmQgdHlwZWRlZnMKICAgICAgICAgICAgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgICAldHlwZW1hcChpbikgdmVjdG9yPGludD4gKiB7CiAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHR5cGVkZWYgdmVjdG9yPGludD4gaW50dmVjdG9yOwogICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgIHZvaWQgYmxhaChpbnR2ZWN0b3IgKnYpOyAgIC8vIEdldHMgdGhlIGFib3ZlIHR5cGVtYXAKCiAgICAgICAgICAgIFRoaXMgZGlkIG5vdCB3b3JrIGluIFNXSUctMS4zLjExIGR1ZSB0byBhIHBlY3VsaWFyaXR5IG9mCiAgICAgICAgICAgIHRoZSB0ZW1wbGF0ZSBpbXBsZW1lbnRhdGlvbi4KCiAgICAgICAgICAgICV0ZW1wbGF0ZShuYW1lKSBubyBsb25nZXIgaW5zdGFsbHMgdGhlIHRlbXBsYXRlIGFzIGEgY2xhc3MKICAgICAgICAgICAgd2l0aCBuYW1lICJuYW1lIi4gICBUaGlzIG1pZ2h0IGJyZWFrICVhZGRtZXRob2RzIGFzIGRlc2NyaWJlZAogICAgICAgICAgICBpbiB0aGUgbWFudWFsLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICV0ZW1wbGF0ZSh2ZWNpbnQpIHZlY3RvcjxpbnQ+OwogICAgICAgICAgICAgICAgICVhZGRtZXRob2RzIHZlY2ludCB7ICAgIC8vIEZhaWxzLiB2ZWNpbnQgbm90IGEgY2xhc3MKICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgCiAgICAgICAgICAgIFRvIGZpeCB0aGlzLCBqdXN0IHVzZSB0aGUgdGVtcGxhdGUgbmFtZSBpbnN0ZWFkOgoKICAgICAgICAgICAgICAgICAlYWRkbWV0aG9kcyB2ZWN0b3I8aW50PiB7CiAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIE5vdGU6IFRoaXMgdGVjaG5pcXVlIG1pZ2h0IGJlIGEgd2F5IHRvIGltcGxlbWVudCBzb21lIGJpemFycmUKICAgICAgICAgICAgdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24gdGVjaG5pcXVlcy4gICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgJWFkZG1ldGhvZHMgdmVjdG9yPGludD4gewogICAgICAgICAgICAgICAgICAgICAvLyBPbmx5IGFwcGxpZWQgaWYgdmVjdG9yPGludD4gaW5zdGFudGlhdGVkIGxhdGVyCiAgICAgICAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSB2ZWN0b3I8aW50PiAqIHsKICAgICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgogICAgICAgICAgICAgCjA0LzA4LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA1NDA4NjggXSAjaWYgZGVmaW5lZCB3aGF0ZXZlciAtIG5vdCBwYXJzZWQuICBTV0lHIHNob3VsZAogICAgICAgICAgICBub3cgY29ycmVjdGx5IGhhbmRsZSBwcmVwcm9jZXNzb3IgZGlyZWN0aXZlcyBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgI2lmIGRlZmluZWQgX19jcGx1c3BsdXMKICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgI2VuZGlmCiAgICAgICAgICAgICAKICAgICAgICAgICAgTm90ZTogd2FzIGltcGxlbWVudGVkIHByZXZpb3VzbHksIGJ1dCB0aGVyZSB3YXMgYSBtaW5vciBidWcuCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IEFkYW0gSHVwcC4KICAgICAgICAgICAgICAgICAgIAowNC8wNy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgICVyZWFkb25seSBhbmQgJXJlYWR3cml0ZSBhcmUgZGVwcmVjYXRlZCBkdWUgdG8gYSBjaGFuZ2UgaW4gdGhlIAogICAgICAgICAgICBpbXBsZW1lbnRhdGlvbi4gIEluc3RlYWQgb2YgYmVpbmcgcHJhZ21hcywgbXV0YWJpbGl0eSBpcyBub3cKICAgICAgICAgICAgY29udHJvbGxlZCBhcyBhICJmZWF0dXJlIiB1c2luZyB0aGUgZm9sbG93aW5nIHR3byBkaXJlY3RpdmVzOgoKICAgICAgICAgICAgICAgICAlaW1tdXRhYmxlOwogICAgICAgICAgICAgICAgIGludCB4OyAgICAgICAgICAgLy8gcmVhZC1vbmx5IHZhcmlhYmxlCiAgICAgICAgICAgICAgICAgaW50IHk7ICAgICAgICAgICAvLyByZWFkLW9ubHkgdmFyaWFibGUKICAgICAgICAgICAgICAgICAlbXV0YWJsZTsKICAgICAgICAgICAgICAgICBpbnQgejsgICAgICAgICAgIC8vIE1vZGlmaWFibGUKCiAgICAgICAgICAgICVpbW11dGFibGUgYW5kICVtdXRhYmxlIGFyZSBtdWNoIG1vcmUgcG93ZXJmdWwgdGhhbiB0aGVpciBvbGRlcgogICAgICAgICAgICBjb3VudGVycGFydHMuICBUaGV5IGNhbiBub3cgcGlucG9pbnQgYSBzcGVjaWZpYyBkZWNsYXJhdGlvbiBsaWtlCiAgICAgICAgICAgIHRoaXM6CgogICAgICAgICAgICAgICAlaW1tdXRhYmxlICB4OyAgICAgICAgIC8qIEFueSB4ICovCiAgICAgICAgICAgICAgICVpbW11dGFibGUgIEZvbzo6eDsgICAgLyogeCBpbiBjbGFzcyBGb28gKi8KCiAgICAgICAgICAgIEluIGZhY3QsIHRoZSBtYXRjaGluZyBhbGdvcml0aG0gaXMgdGhlIHNhbWUgYXMgZm9yICVyZW5hbWUsIAogICAgICAgICAgICAlaWdub3JlLCBhbmQgb3RoZXIgZGlyZWN0aXZlcy4gICBUaGlzIG1lYW5zIHRoYXQgdGhlIGRlY2xhcmF0aW9uCiAgICAgIAogICAgICAgICAgICAgICAlaW1tdXRhYmxlICBGb286Ong7CgogICAgICAgICAgICB3b3VsZCBub3Qgb25seSBhcHBseSB0byBjbGFzcyBGb28gYnV0IHRvIGFsbCBkZXJpdmVkIGNsYXNzZXMKICAgICAgICAgICAgYXMgd2VsbC4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgogICAgICAgICAgICAlaW1tdXRhYmxlIGFuZCAlbXV0YWJsZSBtdXN0IGJlIHRlcm1pbmF0ZWQgYnkgYSBzZW1pLWNvbG9uLiAgVGhpcwogICAgICAgICAgICBkaWZmZXJzIHNsaWdodGx5IGZyb20gdGhlIG9sZGVyICVyZWFkb25seSBhbmQgJXJlYWR3cml0ZSBkaXJlY3RpdmVzLgogICAgICAgICAgICBTaW5jZSAlaW1tdXRhYmxlIGFuZCAlbXV0YWJsZSBjYW4gYmUgYXBwbGllZCB0byBkZWNsYXJhdGlvbnMgdGhlCiAgICAgICAgICAgIHNlbWljb2xvbiBpcyBuZWVkZWQgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBhIGdsb2JhbCBmZWF0dXJlIGFuZCAKICAgICAgICAgICAgb25lIHRhcmdldGVkIHRvIGEgc2luZ2xlIGRlY2xhcmF0aW9uLiAgTm90ZTogdGhpcyBpbmNvbXBhdGliaWxpdHkgaXMgdGhlCiAgICAgICAgICAgIHByaW1hcnkgcmVhc29uIGZvciBjaGFuZ2luZyB0aGUgbmFtZSBvZiB0aGUgZGlyZWN0aXZlLgoKMDQvMDcvMjAwMjogYmVhemxleQogICAgICAgICAgICBOZXcgaGFuZGxpbmcgb2YgY29weSBjb25zdHJ1Y3RvcnMuICBJZiBhIGNsYXNzIGRlZmluZXMgCiAgICAgICAgICAgIGNvbnN0cnVjdG9ycyBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgIEZvbygpOwogICAgICAgICAgICAgICAgICAgICAgRm9vKGNvbnN0IEZvbyAmKTsgICAgICAgLy8gQ29weSBjb25zdHJ1Y3RvcgogICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgU1dJRyBub3cgZ2VuZXJhdGVzIGEgZnVuY3Rpb24gY29weV9Gb28oKSBmb3IgdGhlIGNvcHkKICAgICAgICAgICAgY29uc3RydWN0b3IuCgogICAgICAgICAgICBJbiBwcmV2aW91cyB2ZXJpb25zLCB0aGlzIGdlbmVyYXRlZCBhIG5hbWUtY2xhc2ggYW5kIGFuCiAgICAgICAgICAgIGVycm9yIG1lc3NhZ2UuICAgVG8gcHJlc2VydmUgYmFja3dhcmRzIGNvbXBhdGliaWxpdHksIFNXSUcKICAgICAgICAgICAgZG9lcyBub3QgY2hhbmdlIHRoZSBiZWhhdmlvciBpZiAlcmVuYW1lIGlzIHVzZWQgdG8gcmVzb2x2ZQogICAgICAgICAgICB0aGUgbmFtZSBjb25mbGljdC4gICBIb3dldmVyLCBpZiBubyBuYW1lIHJlc29sdXRpb24gaXMgbWFkZSwKICAgICAgICAgICAgdGhpcyBuZXcgYXBwcm9hY2ggaXMgdXNlZC4KCiAgICAgICAgICAgIENvcHkgY29uc3RydWN0b3JzIG1heSBiZSBoYW5kbGVkIGFzIGEgc3BlY2lhbCBjYXNlIGluIHRoZQogICAgICAgICAgICB0YXJnZXQgbGFuZ3VhZ2UuICBIb3dldmVyLCB0aGlzIGlzIHVwIHRvIHRoZSBsYW5ndWFnZSBtb2R1bGUKICAgICAgICAgICAgaXRzZWxmLgogICAgICAgICAgICAgICAgICAKMDQvMDcvMjAwMjogYmVhemxleQogICAgICAgICAgICBUaGUgJXRlbXBsYXRlIGRpcmVjdGl2ZSBpcyBub3cgbmFtZXNwYWNlIGF3YXJlLiAgIFRoaXMgYWxsb3dzCiAgICAgICAgICAgIGNvZGUgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgIG5hbWVzcGFjZSBmb28gewogICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IG1heChUIGEsIFQgYikgeyByZXR1cm4gYSA+IGIgPyBhIDogYjsgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHVzaW5nIG5hbWVzcGFjZSBmb287CiAgICAgICAgICAgICAgICAldGVtcGxhdGUobWF4aW50KSBtYXg8aW50PjsgICAgICAgICAgICAvLyBPawoKICAgICAgICAgICAgICAgIG5hbWVzcGFjZSBiYXIgewogICAgICAgICAgICAgICAgICAgdXNpbmcgZm9vOjptYXg7CiAgICAgICAgICAgICAgICAgICAldGVtcGxhdGUobWF4ZG91YmxlKSBtYXg8ZG91YmxlPjsgICAvLyBPawogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgQ2F2ZWF0OiB0aGUgdGVtcGxhdGUgbmFtZSBzdXBwbGllZCB0byAldGVtcGxhdGUgbXVzdCBiZSBkZWZpbmVkIGluIHRoZQogICAgICAgICAgICBzYW1lIHNjb3BlIGluIHdoaWNoIHRoZSAldGVtcGxhdGUgZGlyZWN0aXZlIGFwcGVhcnMuICAgVGhpcyBjb2RlIGlzCiAgICAgICAgICAgIGlsbGVnYWw6CgogICAgICAgICAgICAgICAgJXRlbXBsYXRlKG1heGludCkgZm9vOjptYXg8aW50PjsKCjA0LzA3LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTWlub3IgZW5oYW5jZW1lbnQgdG8gcHJlcHJvY2Vzc29yLiAgIFRoZSBwcmVwcm9jZXNzb3IgY2FuIG5vdyBwZXJmb3JtCiAgICAgICAgICAgIHN0cmluZyBjb21wYXJpc29uLiAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgI2RlZmluZSBBICJoZWxsbyIKICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICNpZiBBID09ICJoZWxsbyIKICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICNlbmRpZgoKICAgICAgICAgICAgVGhlIHByaW1hcnkgdXNlIG9mIHRoaXMgaXMgaW4gU1dJRyBtYWNyb3MuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgJWRlZmluZSBGT08oeCkgCiAgICAgICAgICAgICAgI2lmICN4ID09ICJpbnQiCiAgICAgICAgICAgICAgLyogU3BlY2lhbCBoYW5kbGluZyBmb3IgaW50ICovCiAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgI2VuZGlmCiAgICAgICAgICAgICAgJWVuZGRlZgoKICAgICAgICAgICAgTm9ybWFsIHVzZXJzIGNhbiBwcm9iYWJseSBzYWZlbHkgaWdub3JlIHRoaXMgZmVhdHVyZS4gIEhvd2V2ZXIsIGl0IG1heQogICAgICAgICAgICBiZSB1c2VkIGluIHBhcnRzIG9mIHRoZSBTV0lHIGxpYnJhcnkuCgowNC8wNy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZ1cnRoZXIgcmVmaW5lbWVudCBvZiBkZWZhdWx0IGNvbnN0cnVjdG9yL2Rlc3RydWN0b3Igd3JhcHBlciBnZW5lcmF0aW9uLgogICAgICAgICAgICBTV0lHIGlzIG5vdyBtdWNoIG1vcmUgYXdhcmUgb2YgcHVyZSB2aXJ0dWFsIG1ldGhvZHMuIEZvciBpbnN0YW5jZToKCiAgICAgICAgICAgICAgY2xhc3MgQSB7ICAgICAgICAgICAgIC8qIEFic3RyYWN0ICovCiAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBtZXRob2QxKCkgPSAwOwogICAgICAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBtZXRob2QyKCkgPSAwOwogICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgY2xhc3MgQiA6IHB1YmxpYyBBIHsgIC8qIEFic3RyYWN0ICovCiAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBtZXRob2QxKCkgeyB9OwogICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgIGNsYXNzIEMgOiBwdWJsaWMgQiB7ICAvKiBPayAqLwogICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgbWV0aG9kMigpIHsgfTsKICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgSW4gdGhpcyBjYXNlLCBTV0lHIHdpbGwgb25seSBnZW5lcmF0ZSBkZWZhdWx0IGNvbnN0cnVjdG9ycyBmb3IgQy4KICAgICAgICAgICAgRXZlbiB0aG91Z2ggQiBsb29rcyBmaW5lLCBpdCdzIG1pc3NpbmcgYSByZXF1aXJlZCBtZXRob2QgYW5kIGlzIGFic3RyYWN0LgoKMDQvMDQvMjAwMjogYmVhemxleQogICAgICAgICAgICBTdWJ0bGUgY2hhbmdlIHRvIHN0cnVjdHVyZSBkYXRhIG1lbWJlciBhY2Nlc3MuICBJZiB5b3UKICAgICAgICAgICAgaGF2ZSBhIHN0cnVjdHVyZSBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgc3RydWN0IEZvbyB7CiAgICAgICAgICAgICAgICAgICAgQmFyICAgYjsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBUaGUgYWNjZXNzb3IgZnVuY3Rpb25zIGZvciBiIGFyZSBnZW5lcmF0ZWQgYXMgZm9sbG93czoKCiAgICAgICAgICAgICgxKSBJZiBiIGlzICpub3QqIGRlZmluZWQgYXMgYSBzdHJ1Y3R1cmUgb3IgY2xhc3M6CgogICAgICAgICAgICAgICAgQmFyIEZvb19iX2dldChGb28gKnNlbGYpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi0+YjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZvaWQgRm9vX2Jfc2V0KEZvbyAqc2VsZiwgQmFyIHZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi0+YiA9IHZhbHVlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgKDIpIElmIGIgKmlzKiBkZWZpbmVkIGFzIGEgc3RydWN0dXJlIG9yIGNsYXNzOgoKICAgICAgICAgICAgICAgIEJhciAqRm9vX2JfZ2V0KEZvbyAqc2VsZikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAmc2VsZi0+YjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZvaWQgRm9vX2Jfc2V0KEZvbyAqc2VsZiwgQmFyICp2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgIHNlbGYtPmIgPSAqdmFsdWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIFNlZSB0aGUgIlN0cnVjdHVyZSBkYXRhIG1lbWJlcnMiIHNlY3Rpb24gb2YgRG9jL01hbnVhbC9TV0lHLmh0bWwKICAgICAgICAgICAgZm9yIGZ1cnRoZXIgZGV0YWlscy4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgogICAgICAgICAgICBUaGlzIG1heSBicmVhayBpbnRlcmZhY2VzIHRoYXQgcmVsaWVkIG9uIGEgbG90IG9mIGEgdW5kZWNsYXJlZAogICAgICAgICAgICBzdHJ1Y3R1cmUgYW5kIGNsYXNzIG5hbWVzLiAgICBUbyBnZXQgdGhlIG9sZCBiZWhhdmlvciwgc2ltcGx5CiAgICAgICAgICAgIHVzZSBhIGZvcndhcmQgZGVjbGFyYXRpb24gc3VjaCBhcyAic3RydWN0IEJhcjsiCiAgICAgICAgICAgIAowNC8wNC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEMrKyBuYW1lc3BhY2Ugc3VwcG9ydCBhZGRlZC4gIFNXSUcgc3VwcG9ydHMgYWxsIGFzcGVjdHMgb2YKICAgICAgICAgICAgbmFtZXNwYWNlcyBpbmNsdWRpbmcgbmFtZXNwYWNlLCB1c2luZywgYW5kIG5hbWVzcGFjZSBhbGlhcwogICAgICAgICAgICBkZWNsYXJhdGlvbnMuICAgIFRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIFNXSUcgaXMgdG8gZmxhdHRlbgogICAgICAgICAgICBuYW1lc3BhY2VzIGluIHRoZSB0YXJnZXQgbGFuZ3VhZ2UuICBIb3dldmVyLCBuYW1lc3BhY2VzIGFyZQogICAgICAgICAgICBmdWxseSBzdXBwb3J0ZWQgYXQgdGhlIEMrKyBsZXZlbCBhbmQgaW4gdGhlIHR5cGUgc3lzdGVtLgogICAgICAgICAgICBTZWUgRG9jL01hbnVhbC9TV0lHUGx1cy5odG1sIGZvciBkZXRhaWxzIG9uIHRoZSBpbXBsZW1lbnRhdGlvbi4KICAgICAKMDQvMDIvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBTdW4gaGFzIG1vZGlmaWVkIGphdmFjIGluIGpkazEuNCB0byBubyBsb25nZXIgY29tcGlsZQogICAgICAgICAgICBhbiBpbXBvcnQgb2YgYW4gdW5uYW1lZCBuYW1lc3BhY2UuIFRvIGZpeCB0aGlzIFNXSUcgbm8gbG9uZ2VyIAogICAgICAgICAgICBnZW5lcmF0ZXMgdGhlIGltcG9ydCBmb3IgcGFja2FnZWxlc3MgY2xhc3Nlcy4KICAgICAgICAgICAgaHR0cDovL2RldmVsb3Blci5qYXZhLnN1bi5jb20vZGV2ZWxvcGVyL2J1Z1BhcmFkZS9idWdzLzQzNjE1NzUuaHRtbAogICAgICAgICAgICBBcyByZXBvcnRlZCBTRiAjNTM4NDE1LgoKMDMvMjcvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIEFkZGVkIHN1cHBvcnQgZm9yIHBvaW50ZXItdG8tbWVtYmVyLCBzaW1pbGFyIHRvIHRoYXQKICAgICAgICAgICAgZm9yIHRoZSBQeXRob24gbW9kdWxlLiBSZW1hcmthYmx5IHNpbWlsYXIuIEFsc28gYWRkZWQgYSBuZXcKICAgICAgICAgICAgZXhhbXBsZSBmb3IgdGhpcyAoRXhhbXBsZXMvcnVieS9tcG9pbnRlciksIHdoaWNoIGlzIHJlbWFya2FibHkKICAgICAgICAgICAgc2ltaWxhciB0byB0aGUgUHl0aG9uIGV4YW1wbGUgb2YgdGhlIHNhbWUgbmFtZS4KCjAzLzI2LzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBNYWRlIGEgZmV3IG1pbm9yIGVkaXRzIHRvIHRoZSAiQWR2YW5jZWQgVG9waWNzIgogICAgICAgICAgICBjaGFwdGVyIG9mIHRoZSBTV0lHIG1hbnVhbCBhbmQgYWRkZWQgYSBuZXcgbWFqb3Igc2VjdGlvbgogICAgICAgICAgICBhYm91dCBob3cgdG8gY3JlYXRlIG11bHRpLW1vZHVsZSBSdWJ5IHBhY2thZ2VzIHdpdGggU1dJRy4KCjAzLzI2LzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBSZW1vdmVkIGFsbCBvZiB0aGUgb2xkIFJ1YnkgcHJhZ21hcy4gSWYgYW55IG9mIHRoaXMKICAgICAgICAgICAgZnVuY3Rpb25hbGl0eSBpcyB0cnVseSBtaXNzZWQgd2UgY2FuIHJlc3VycmVjdCBpdCwgcHJlZmVyYWJseQogICAgICAgICAgICB3aXRoIHNvbWUga2luZCBvZiBmZWF0dXJlLWJhc2VkIGRpcmVjdGl2ZS4KICAgICAgICAgICAgCjAzLzI1LzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBGaXhlZCBTV0lHIGV4Y2VwdGlvbiBsaWJyYXJ5IHN1cHBvcnQgZm9yIFJ1YnksIHdoaWNoCiAgICAgICAgICAgIGhhcyBhcHBhcmVudGx5IGJlZW4gYnJva2VuIGZvciBzb21lIHRpbWUuIEx1Y2tpbHksIG5vIG9uZSBzZWVtcwogICAgICAgICAgICB0byBoYXZlIG5vdGljZWQuCgowMy8yMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEMrKy1uYW1lc3BhY2Ugc3VwcG9ydCBpbiBTV0lHIGRpcmVjdGl2ZXMuCgogICAgICAgICAgICAlYWRkbWV0aG9kczogCgogICAgICAgICAgICBUaGUgJWFkZG1ldGhvZHMgZGlyZWN0aXZlIG5vdyBhY2NlcHRzIGEgZnVsbHkgcXVhbGlmaWVkIGNsYXNzbmFtZQogICAgICAgICAgICBhbmQgY2FuIGJlIHVzZWQgaW5zaWRlIEMrKyBuYW1lc3BhY2UgZGVjbGFyYXRpb25zLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgIC8vIEF0dGFjaGVzIHRvIHRoZSBjbGFzcyBGb286OkJhciBiZWxvdwogICAgICAgICAgICAgICAgICVhZGRtZXRob2RzIEZvbzo6QmFyIHsKICAgICAgICAgICAgICAgICAgICAgaW50IHNvbWVtZXRob2QoKSB7IC4uLiB9CiAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgbmFtZXNwYWNlIEZvbyB7CiAgICAgICAgICAgICAgICAgICAgY2xhc3MgQmFyIHsKICAgICAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgLy8gQXR0YWNoZXMgdG8gdGhlIGNsYXNzIEJhciBhYm92ZQogICAgICAgICAgICAgICAgICAgICVhZGRtZXRob2RzIEJhciB7CiAgICAgICAgICAgICAgICAgICAgICBpbnQgb3RoZXJtZXRob2QoKSB7IC4uLiB9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAlZmVhdHVyZSwgJXJlbmFtZSwgJWlnbm9yZSwgJWV4Y2VwdGlvbiwgYW5kIHJlbGF0ZWQgZGlyZWN0aXZlczoKCiAgICAgICAgICAgIE5hbWVzcGFjZXMgYXJlIGZ1bGx5IGludGVncmF0ZWQgaW50byB0aGUgdGhlIHJlbmFtaW5nIGFuZCBkZWNsYXJhdGlvbgogICAgICAgICAgICBtYXRjaGVyLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICVyZW5hbWUoZGlzcGxheSkgRm9vOjpwcmludDsgICAgICAgICAgLy8gUmVuYW1lIGluIG5hbWVzcGFjZSBGb28KICAgICAgICAgICAgICAgICAlaWdub3JlIEZvbzo6QmFyOjpibGFoOyAgICAgICAgICAgICAgIC8vIElnbm9yZSBhIGRlY2xhcmF0aW9uCgogICAgICAgICAgICAlcmVuYW1lIGRpcmVjdGl2ZXMgY2FuIGJlIHBsYWNlZCBpbnNpZGUgbmFtZXNwYWNlIGJsb2NrcyBhcyB3ZWxsLiBGb3IKICAgICAgICAgICAgZXhhbXBsZToKCiAgICAgICAgICAgICAgICBuYW1lc3BhY2UgRm9vIHsKICAgICAgICAgICAgICAgICAgICVyZW5hbWUoZGlzcGxheSkgcHJpbnQ7ICAgICAgICAgLy8gQXBwbGllcyB0byBwcmludCBiZWxvdwoKICAgICAgICAgICAgICAgICAgIHZvaWQgcHJpbnQoKTsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBNb3N0IG90aGVyIFNXSUcgZGlyZWN0aXZlcyBzaG91bGQgd29yayBwcm9wZXJseSBpbnNpZGUgbmFtZXNwYWNlcy4KICAgICAgICAgICAgTm8gb3RoZXIgY2hhbmdlcyBhcmUgbmVlZGVkLgogICAgICAKMDMvMjIvMjAwMjogYmVhemxleQogICAgICAgICAgICBTb21lIGNoYW5nZXMgdG8gaW50ZXJuYWwgc3ltYm9sIHRhYmxlIGhhbmRsaW5nLiAgIFNXSUcgbm8gbG9uZ2VyCiAgICAgICAgICAgIG1hbmFnZXMgc3RydWN0dXJlcyBhbmQgdW5pb25zIGluIGEgc2VwYXJhdGUgbmFtZXNwYWNlIHRoYW4gbm9ybWFsCiAgICAgICAgICAgIGRlY2xhcmF0aW9ucyBsaWtlIEFOU0kgQy4gIFRoaXMgbWVhbnMgeW91IGNhbid0IGhhdmUgYSBzdHJ1Y3R1cmUKICAgICAgICAgICAgd2l0aCB0aGUgc2FtZSBuYW1lIGFzIGEgZnVuY3Rpb24uICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgc3RydWN0IEZvbyB7CiAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgaW50IEZvbygpIHsgLi4uIH0KCiAgICAgICAgICAgIFRoaXMgYXBwcm9hY2ggaXMgbW9yZSBsaWtlIEMrKy4gICBJdCdzIG5vdCBjbGVhciB0aGF0IFNXSUcgZXZlcgogICAgICAgICAgICByZWFsbHkgc3VwcG9ydGVkIHRoZSBBTlNJIEMgYW55d2F5cy0tLXVzaW5nIHRoZSBzYW1lIG5hbWUgd291bGQKICAgICAgICAgICAgYWxtb3N0IGNlcnRhaW5seSBnZW5lcmF0ZSBhIG5hbWUtY2xhc2ggaW4gdGhlIHRhcmdldCBsYW5ndWFnZS4KCjAzLzIyLzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBGaXhlZCBbIDUxNzMwMiBdIGZvciBoYW5kbGluZyBvZiByZW5hbWVkIG92ZXJsb2FkZWQKICAgICAgICAgICAgY29uc3RydWN0b3JzLiBOb3csIHJlbmFtZWQgb3ZlcmxvYWRlZCBjb25zdHJ1Y3RvcnMgYXJlIGNvbnZlcnRlZAogICAgICAgICAgICBpbnRvIGNsYXNzIHNpbmdsZXRvbiBtZXRob2RzIChiYXNpY2FsbHkgYWN0aW5nIGFzICJmYWN0b3J5IgogICAgICAgICAgICBtZXRob2RzKS4KCjAzLzIxLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA1MzI5NTcgXSAlaWdub3JlIHBhcnNlIGVycm9yIGFuZCBjYXN0aW5nIG9wZXJhdG9yLgogICAgICAgICAgICBSZXBvcnRlZCBieSBXaWxsaWFtIEZ1bHRvbi4KCjAzLzE4LzIwMDI6IGJlYXpsZXkgKCoqIEFEVkFOQ0VEIFVTRVJTIE9OTFkgKiopCiAgICAgICAgICAgIEFkZGVkIHN1cHBvcnQgZm9yIGR5bmFtaWMgY2FzdGluZyBpbiByZXR1cm4gdmFsdWVzLiAgQSBzb21ld2hhdAogICAgICAgICAgICBjb21tb24gcHJvYmxlbSBpbiBjZXJ0YWluIEMrKyBwcm9ncmFtcyBpcyBmdW5jdGlvbnMgdGhhdCBoaWRlCiAgICAgICAgICAgIHRoZSBpZGVudGl0eSBvZiB1bmRlcmx5aW5nIG9iamVjdHMgd2hlbiB0aGV5IGFyZSByZXR1cm5lZCAKICAgICAgICAgICAgZnJvbSBtZXRob2RzIGFuZCBmdW5jdGlvbnMuICBGb3IgZXhhbXBsZSwgYSBwcm9ncmFtIG1pZ2h0IGluY2x1ZGUKICAgICAgICAgICAgc29tZSBnZW5lcmljIG1ldGhvZCBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgICAgICAgTm9kZSAqZ2V0Tm9kZSgpOwoKICAgICAgICAgICAgSG93ZXZlciwgTm9kZSAqIG1heSBqdXN0IGJlIGJhc2UgY2xhc3MgdG8gYSB3aG9sZSBoaWVyYXJjaHkKICAgICAgICAgICAgb2YgZGlmZmVyZW50IG9iamVjdHMuICAgSW5zdGVhZCBvZiByZXR1cm5pbmcgdGhpcyBnZW5lcmljIE5vZGUgKiwKICAgICAgICAgICAgaXQgbWlnaHQgYmUgbmljZSB0byBhdXRvbWF0aWNhbGx5IGRvd25jYXN0IHRoZSBvYmplY3QgaW50byB0aGUKICAgICAgICAgICAgYXBwcm9wcmlhdGUgdHlwZSB1c2luZyBzb21lIGtpbmQgZHluYW1pYyBjYXN0LgoKICAgICAgICAgICAgQXNzdW1pbmcgeW91IHVuZGVyc3RhbmQgdGhlIHBlcmlsIGludm9sdmVkLCBhIGRvd25jYXN0IGNhbiBub3cKICAgICAgICAgICAgYmUgcGVyZm9ybWVkIHVzaW5nIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb24gaW4gdGhlIHJ1bi10aW1lIHR5cGUKICAgICAgICAgICAgY2hlY2tlcjoKCiAgICAgICAgICAgICAgc3dpZ190eXBlX2luZm8gKlNXSUdfVHlwZUR5bmFtaWNDYXN0KHN3aWdfdHlwZV9pbmZvICosIHZvaWQgKipwdHIpOwoKICAgICAgICAgICAgVGhpcyBmdW5jdGlvbiBjaGVja3MgdG8gc2VlIGlmIHRoZSB0eXBlIGNhbiBiZSBjb252ZXJ0ZWQgdG8gYW5vdGhlcgogICAgICAgICAgICB0eXBlLiAgSWYgc28sIGEgZGlmZmVyZW50IHR5cGUgZGVzY3JpcHRvciAoZm9yIHRoZSBjb252ZXJ0ZWQgdHlwZSkKICAgICAgICAgICAgaXMgcmV0dXJuZWQuICAgVGhpcyB0eXBlIGRlc2NyaXB0b3Igd291bGQgdGhlbiBiZSB1c2VkIHRvIGNyZWF0ZQogICAgICAgICAgICBhIHBvaW50ZXIgaW4gdGhlIHRhcmdldCBsYW5ndWFnZS4KCiAgICAgICAgICAgIFRvIHVzZSB0aGlzLCB5b3Ugd291bGQgd3JpdGUgYSB0eXBlbWFwIHNpbWlsYXIgdG8gdGhpczoKCiAgICAgICAgICAgICAgJXR5cGVtYXAob3V0KSBOb2RlICogewogICAgICAgICAgICAgICAgc3dpZ190eXBlX2luZm8gKnR5ID0gU1dJR19UeXBlRHluYW1pY0Nhc3QoJDFfZGVzY3JpcHRvciwgKHZvaWQgKiopICYkMSk7CiAgICAgICAgICAgICAgICAkcmVzdWx0ID0gU1dJR19OZXdQb2ludGVyT2JqKCQxLCB0eSk7CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgQWx0ZXJuYXRpdmVseSwKCiAgICAgICAgICAgICAgJXR5cGVtYXAob3V0KSBOb2RlICogPSBTV0lHVFlQRSAqRFlOQU1JQzsKCiAgICAgICAgICAgIFRvIG1ha2UgdGhlIHR5cGVtYXAgaGF2ZSBhbnkgZWZmZWN0LCB5b3UgaGF2ZSB0byB3cml0ZSBhIHN1cHBvcnRpbmcgCiAgICAgICAgICAgIGZ1bmN0aW9uIHRoYXQga25vd3MgaG93IHRvIHBlcmZvcm0gZG93bmNhc3RpbmcuIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAlewogICAgICAgICAgICAgIHN0YXRpYyBzd2lnX3R5cGVfaW5mbyAqCiAgICAgICAgICAgICAgTm9kZV9keW5hbWljX2Nhc3Qodm9pZCAqKnB0cikgewogICAgICAgICAgICAgICAgIE5vZGUgKipucHRyID0gKE5vZGUgKiopIHB0cjsKICAgICAgICAgICAgICAgICBFbGVtZW50ICplID0gZHluYW1pY19jYXN0PEVsZW1lbnQgKj4oKm5wdHIpOwogICAgICAgICAgICAgICAgIGlmIChlKSB7CiAgICAgICAgICAgICAgICAgICAgKnB0ciA9ICh2b2lkICopIGU7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNXSUdUWVBFX3BfRWxlbWVudDsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgRGF0YSAqZCA9IGR5bmFtaWNfY2FzdDxEYXRhICo+KCpucHRyKTsKICAgICAgICAgICAgICAgICBpZiAoZCkgewogICAgICAgICAgICAgICAgICAgICpwdHIgPSAodm9pZCAqKSBkOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBTV0lHVFlQRV9wX0RhdGE7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAlfQoKICAgICAgICAgICAgVGhlcmUgaXMgbm8gcmVzdHJpY3Rpb24gb24gaG93IHR5cGVzIGFyZSBkZXRlcm1pbmVkLiBkeW5hbWljX2Nhc3Q8PgogICAgICAgICAgICB1c2VzIEMrKyBSVFRJLiAgSG93ZXZlciwgaWYgeW91IGhhZCBzb21lIG90aGVyIG1lY2hhbmlzbSBmb3IgZGV0ZXJtaW5pbmcKICAgICAgICAgICAgdGhlIHR5cGUsIHlvdSBjb3VsZCB1c2UgdGhhdCBoZXJlLiAgTm90ZTogaXQgaXMgaW1wb3J0YW50IHRvIHNhdmUKICAgICAgICAgICAgdGhlIG5ldyBwb2ludGVyIHZhbHVlIGJhY2sgaW50byB0aGUgYXJndW1lbnQgYXMgc2hvd24uICBXaGVuIGRvd25jYXN0aW5nLAogICAgICAgICAgICB0aGUgdmFsdWUgb2YgdGhlIHBvaW50ZXIgY291bGQgY2hhbmdlLiAKCiAgICAgICAgICAgIEZpbmFsbHksIHRvIG1ha2UgdGhlIGNhc3RpbmcgZnVuY3Rpb24gYXZhaWxhYmxlLCB5b3UgaGF2ZSB0byByZWdpc3RlcgogICAgICAgICAgICBpdCB3aXRoIHRoZSBydW4tdGltZSB0eXBlIGNoZWNrZXIuIFB1dCB0aGlzIG1hY3JvIGluIHlvdXIgaW50ZXJmYWNlIGZpbGUuCgogICAgICAgICAgICAgICBEWU5BTUlDX0NBU1QoU1dJR1RZUEVfcF9Ob2RlLCBOb2RlX2R5bmFtaWNfY2FzdCk7CgogICAgICAgICAgICBOb3RlOiB0aGlzIGZlYXR1cmUgZG9lcyBub3QgaW50cm9kdWNlIGEgcGVyZm9ybWFuY2UgcGVuYWx0eSBvbiAKICAgICAgICAgICAgbm9ybWFsIFNXSUcgb3BlcmF0aW9uLiAgVGhlIGZlYXR1cmUgaXMgb25seSBlbmFibGVkIGJ5IHdyaXRpbmcKICAgICAgICAgICAgYSBuZXcgdHlwZW1hcCB0aGF0IGV4cGxpY2l0bHkgY2FsbHMgU1dJR19UeXBlRHluYW1pY0Nhc3QoKSB0bwogICAgICAgICAgICBtYWtlIGEgY29udmVyc2lvbi4gCiAgCiAgICAgICAgICAgIEV4YW1wbGVzL3Rlc3Qtc3VpdGUvZHluYW1pY19jYXN0LmkgY29udGFpbnMgYSBzaW1wbGUgZXhhbXBsZS4KICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhlIEphdmEgbW9kdWxlIGR1ZSB0byBkaWZmZXJlbmNlcwogICAgICAgICAgICBpbiB0aGUgdHlwZS1jaGVja2luZyBpbXBsZW1lbnRhdGlvbi4KCiAgICAgICAgICAgICoqKiBFWFBFUklNRU5UQUwgRkVBVFVSRSAqKioKCjAzLzE3LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgU21hbGwgY2hhbmdlIHRvIHR5cGUtbmFtZSBoYW5kbGluZyBvZiB1bm5hbWVkIHN0cnVjdHVyZXMgYW5kCiAgICAgICAgICAgIHR5cGVkZWYuICBJZiBhIHN0cnVjdHVyZSBvZiB0aGlzIGZvcm0gYXBwZWFyczoKCiAgICAgICAgICAgICAgICAgICB0eXBlZGVmIHN0cnVjdCB7CiAgICAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgfSBGb287CgogICAgICAgICAgICBUaGVuICdGb28nIGlzIHVzZWQgYXMgdGhlIHByb3BlciB0eXBlbmFtZSBmb3IgdGhlIHN0cnVjdHVyZS4KICAgICAgICAgICAgRnVydGhlcm1vcmUsIEZvbyBjYW4gbm93IGJlIHVzZWQgYXMgYSBuYW1lIGluIEMrKyBpbmhlcml0YW5jZS4KICAgICAgICAgICAgU1dJRyB3YXMgYWxyZWFkeSBraW5kIG9mIGRvaW5nIHRoaXMsIGJ1dCB0aGlzIG1vZGlmaWNhdGlvbiByZWZpbmVzCiAgICAgICAgICAgIHRoZSBpbXBsZW1lbnRhdGlvbiB0byBtb3JlIGNsb3NlbHkgZm9sbG93IHRoZSBDKysgQVJNLCBzZWN0aW9uCiAgICAgICAgICAgIDcuMS4zLCBwLiAxMDYuICBUaGlzIGZpeGVzIGEgY291cGxlIG9mIG9ic2N1cmUgY29ybmVyIGNhc2VzLgoKMDMvMTYvMjAwMjogYmVhemxleQogICAgICAgICAgICBNb2RpZmllZCBDKysgaW5oZXJpdGFuY2Ugd2l0aCBhIGZldyBlbmhhbmNlbWVudHMuICBGaXJzdCwgdHlwZSBpbmZvcm1hdGlvbgogICAgICAgICAgICBuZWVkZWQgZm9yIGNhc3RpbmcgYW5kIHR5cGUtZXF1aXZhbGVuY2UgaXMgZ2VuZXJhdGVkIGV2ZW4gd2hlbiBiYXNlLWNsYXNzZXMKICAgICAgICAgICAgYXJlbid0IGRlZmluZWQgaW4gdGhlIGludGVyZmFjZS4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgIGNsYXNzIEZvbyA6IHB1YmxpYyBCYXIgIHsgICAgLyogQmFyIHVuc3BlY2lmaWVkICovCiAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgIHZvaWQgYmxhaChCYXIgKmIpOwoKICAgICAgICAgICAgSW4gdGhpcyBjYXNlLCB0aGUgYmxhaCgpIGZ1bmN0aW9uIHN0aWxsIGFjY2VwdHMgRm9vICogZXZlbiB0aG91Z2ggbm90aGluZwogICAgICAgICAgICBpcyByZWFsbHkga25vd24gYWJvdXQgQmFyLiAgIFByZXZpb3VzIFNXSUcgdmVyc2lvbnMgd291bGQganVzdCBnZW5lcmF0ZQogICAgICAgICAgICBhIHR5cGUgZXJyb3IuCgogICAgICAgICAgICBJbmhlcml0YW5jZSBoYXMgYWxzbyBiZWVuIG1vZGlmaWVkIHRvIHdvcmsgdGhyb3VnaCB0eXBlZGVmLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICBjbGFzcyBCYXIgewogICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgdHlwZWRlZiBCYXIgT3RoZXJCYXI7CiAgICAgICAgICAgICAgIGNsYXNzIEZvbzogcHVibGljIE90aGVyQmFyIHsKICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgSW4gdGhpcyBjYXNlLCB0aGUgYmFzZSBjbGFzcyBvZiBPdGhlckJhciBpcyBjb3JyZWN0bHkgcmVzb2x2ZWQgYmFjayB0bwogICAgICAgICAgICBCYXIuICAgVGhlIHVzZSBvZiB0aGUgbmFtZSBPdGhlckJhciBpcyBsb3N0IGluIHRoaXMgcmVzb2x1dGlvbiAodGhlIHdyYXBwZXJzCiAgICAgICAgICAgIHdpbGwgc2ltcGx5IHVzZSBCYXIgaW5zdGVhZCBvZiB0aGUgdHlwZWRlZiBuYW1lIE90aGVyQmFyKS4KICAgICAgICAgICAKMDMvMTMvMjAwMjogYmVhemxleQogICAgICAgICAgICAldHlwZW1hcCwgJWFwcGx5LCBhbmQgcmVsYXRlZCBkaXJlY3RpdmVzIGNhbiBub3cgYXBwZWFyIGluc2lkZQogICAgICAgICAgICBjbGFzcyBkZWZpbml0aW9ucy4gICAKCjAzLzEzLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYSB2YXJpZXR5IG9mIHByb2JsZW1zIHJlbGF0ZWQgdG8gY29tcGlsaW5nIFNXSUcgb24gNjQtYml0CiAgICAgICAgICAgIHBsYXRmb3Jtcy4KCjAzLzEyLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgcHJvYmxlbSB3aXRoICJpZ25vcmUiIGFuZCAiaW4iIHR5cGVtYXBzLiAgTG9jYWwgdmFyaWFibGVzCiAgICAgICAgICAgIGFzc29jaWF0ZWQgd2l0aCAiaW4iIHdlcmUgYmVpbmcgYWRkZWQgdG8gdGhlIHdyYXBwZXIgZnVuY3Rpb24gZXZlbgogICAgICAgICAgICB0aG91Z2ggdGhleSB3ZXJlIG5ldmVyIHVzZWQuICAgTW9zdGx5IGhhcm1sZXNzLCBidXQgaXQgd291bGQgbGVhZAogICAgICAgICAgICB0byBhIHZhcmlldHkgb2YgY29tcGlsYXRpb24gd2FybmluZ3MuCiAgCjAzLzEyLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgU29tZSBjaGFuZ2VzIHRvIHRoZSBpbnRlcm5hbCB0eXBlIHN5c3RlbSBhbmQgaGFuZGxpbmcgb2YgbmVzdGVkIEMrKwogICAgICAgICAgICB0eXBlcy4gICBJbiBwcmV2aW91cyB2ZXJzaW9ucyBvZiBTV0lHLCBpZiB5b3UgaGFkIHRoZSBmb2xsb3dpbmc6CgogICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICAgdHlwZWRlZiBpbnQgQmxhaDsKICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgIGNsYXNzIEJhciA6IHB1YmxpYyBGb28gewogICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgICB2b2lkIHNvbWVtZXRob2QoQmxhaCB4KTsKICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgVGhlIGFyZ3VtZW50IHR5cGUgaW4gc29tZW1ldGhvZCgpIHdvdWxkIGltcGxpY2l0bHkgYmUgc2V0IHRvIEJhcjo6QmxhaC4KICAgICAgICAgICAgQWx0aG91Z2ggdGhpcyBpcyB0ZWNobmljYWxseSBhbGxvd2VkLCBpdCBicmVha3MgdHlwZW1hcHMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIEZvbzo6QmxhaCB7IC4uLiB9CgogICAgICAgICAgICBkb2Vzbid0IG1hdGNoIGxpa2UgeW91IGV4cGVjdC4gICBUaGlzIGhhcyBiZWVuIGNoYW5nZWQgaW4gU1dJRy0xLjMuMTIuCiAgICAgICAgICAgIE5vdywgdHlwZXMgYXJlIGV4cGFuZGVkIHVzaW5nIHRoZSBjbGFzcyBpbiB3aGljaCB0aGV5IHdlcmUgZGVmaW5lZC4KICAgICAgICAgICAgU28sIHRoZSBhcmd1bWVudCB0eXBlIGluIHNvbWVtZXRob2QoKSB3aWxsIGJlIEZvbzo6QmxhaC0tLXNpbmNlIHRoZQogICAgICAgICAgICB0eXBlIEJsYWggd2FzIGRlZmluZWQgaW4gRm9vLgogCjAzLzEwLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgc29tZSBzdWJ0bGUgdHlwZSBzY29waW5nIHByb2JsZW1zIHdpdGggdHlwZWRlZiBhbmQgQysrIGNsYXNzZXMuCiAgICAgICAgICAgIEZvciBleGFtcGxlOgogCiAgICAgICAgICAgICAgICB0eXBlZGVmIGludCBCbGFoOwogICAgICAgICAgICAgICAgY2xhc3MgQmFyIHsKICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICB0eXBlZGVmIGRvdWJsZSBCbGFoOwogICAgICAgICAgICAgICAgICAgIHZvaWQgZm9vKEJsYWggeCwgOjpCbGFoIHkpOwogICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICB9CgowMy8xMC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEhpZ2hseSBleHBlcmltZW50YWwgY2hhbmdlIHRvIGhhbmRsZSB2YXJpYWJsZSBsZW5ndGggYXJndW1lbnRzLgogICAgICAgICAgICBGaXJzdCwgdGhlcmUgaXMgbm8gcG9ydGFibGUgb3IgcmVsaWFibGUgd2F5IHRvIHdyYXAKICAgICAgICAgICAgYSB2YXJhcmdzIGZ1bmN0aW9uIGluIGZ1bGwgZ2VuZXJhbGl0eS4gIEhvd2V2ZXIsIHlvdSAqY2FuKiBjaGFuZ2UKICAgICAgICAgICAgdGhlIGZ1bmN0aW9uIHNpZ25hdHVyZSB1c2luZyAldmFyYXJncy4KCiAgICAgICAgICAgICAgICV2YXJhcmdzKGNoYXIgKikgZnByaW50ZjsKICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgIHZvaWQgZnByaW50ZihGSUxFICpmLCBjaGFyICpmbXQsIC4uLik7CgogICAgICAgICAgICBJbiB0aGlzIGNhc2UsIHRoZSB2YXJpYWJsZSBsZW5ndGggcGFyYW1ldGVyICIuLi4iIGlzCiAgICAgICAgICAgIHNpbXBseSByZXBsYWNlZCBieSB0aGUgcGFyYW1ldGVycyBnaXZlbiBpbiAldmFyYXJncy4gVGhpcwogICAgICAgICAgICByZXN1bHRzIGluIGEgZnVuY3Rpb24gbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgdm9pZCBmcHJpbnRmKEZJTEUgKmYsIGNoYXIgKmZtdCwgY2hhciAqcyk7CgogICAgICAgICAgICBNb3JlIHRoYW4gb25lIGFyZ3VtZW50IGNhbiBiZSB1c2VkIGFuZCBkZWZhdWx0IHZhbHVlcwogICAgICAgICAgICBjYW4gYmUgZGVmaW5lZC4gIEZvciBleGFtcGxlLCB0aGlzIGNvZGUgc3BlY2lmaWVzIGEKICAgICAgICAgICAgbWF4aW11bSBvZiBmb3VyIGFyZ3VtZW50cy4KCiAgICAgICAgICAgICAgICV2YXJhcmdzKGNoYXIgKngxID0gMCwgY2hhciAqeDIgPSAwLCBjaGFyICp4MyA9IDAsIGNoYXIgKng0ID0gMCkgZnByaW50ZjsKIAogICAgICAgICAgICAqKiogRVhQRVJJTUVOVEFMIE5FVyBGRUFUVVJFICoqKgogCjAzLzEwLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgQ2hhbmdlIHRvIGhhbmRsaW5nIG9mIHZhcmlhYmxlIGxlbmd0aCBhcmd1bWVudHMuICB2YXJhcmdzCiAgICAgICAgICAgIGlzIG5vdyBoYW5kbGVkIGFzIGEgcHJvcGVyIHBhcmFtZXRlciBhbmQgaXMgcGFzc2VkIHRvIHRoZQogICAgICAgICAgICBjb2RlIGdlbmVyYXRvci4gIEhvd2V2ZXIsIGl0IHN0aWxsIGNhbid0IGJlIGhhbmRsZWQgY29ycmVjdGx5CiAgICAgICAgICAgIChhbmQgd2lsbCBnZW5lcmF0ZSBhIHR5cGVtYXAgd2FybmluZykuICAgVGhpcyBjaGFuZ2UgaGFzIGJlZW4KICAgICAgICAgICAgbWFkZSB0byBiZXR0ZXIgaW5jb3Jwb3JhdGUgdmFyaWFibGUgbGVuZ3RoIGFyZ3VtZW50cyB3aXRoIG90aGVyCiAgICAgICAgICAgIGRpcmVjdGl2ZXMgc3VjaCBhcyAlaWdub3JlLCAlcmVuYW1lLCAlZmVhdHVyZSwgYW5kIHNvIGZvcnRoLgoKMDMvMTAvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDUyMjU1NSBdIFN5bnRheCBlcnJvciBwYXJzaW5nICJkZWZpbmUiIGNvbnN0cnVjdC4gU1dJRwogICAgICAgICAgICBpcyBhIGxpdHRsZSBtb3JlIHJlc3RyaWN0aXZlIGluIGRldGVybWluaW5nICNkZWZpbmUgc3RhdGVtZW50cwogICAgICAgICAgICB0aGF0IHdpbGwgYmUgd3JhcHBlZCBhcyBjb25zdGFudHMuICBBbHNvIGFkZGVkIGEgYmV0dGVyIHBhcnNlcgogICAgICAgICAgICBlcnJvciBydWxlIGZvciBoYW5kbGluZyBiYWQgY29uc3RhbnRzLgoKMDMvMDgvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBCdWcgZml4OiBDbGFzc2VzIHJlbmFtZWQgd2l0aCAlcmVuYW1lIHRoYXQgYXJlIGRlcml2ZWQgZnJvbSAKICAgICAgICAgICAgYW5vdGhlciBjbGFzcyBnZW5lcmF0ZSBtb3JlIGFwcHJvcHJpYXRlIHNoYWRvdyBjbGFzcyBjb2RlLgoKMDMvMDgvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBGaXhlZCBTRiBbICM1MjM2MzIgXSBhbmQgWyAjNTEzMzM1IF0gYm90aCByZXBvcnRlZCBieSBJc3JhZWwgCiAgICAgICAgICAgIFRhbm5lci4gU3VwcG9ydCBmb3IgdHlwZXMgdGhhdCBhcmUgdXNlZCB3aGljaCBhcmUgaW4gYSB0eXBlZGVmLiBUaGUKICAgICAgICAgICAgYXBwcm9wcmlhdGUgc2hhZG93IGNsYXNzIG5hbWUgaXMgZ2VuZXJhdGVkLiBBbHNvIGdlbmVyYXRlZCBjb3JyZWN0CiAgICAgICAgICAgIHNoYWRvdyBjbGFzc25hbWUgd2hlbiBhIHRlbXBsYXRlZCBjbGFzcyBpcyB1c2VkIHdpdGhpbiBhbm90aGVyIAogICAgICAgICAgICB0ZW1wbGF0ZWQgY2xhc3MuIFNlZSB0aGUgY3BwX3R5cGVkZWYuaSB0ZXN0Y2FzZS4KCjAzLzA4LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gQnVnIGZpeDogTm8gdHlwZSB3YXMgZ2VuZXJhdGVkIGluIHNoYWRvdyBjbGFzc2VzIGZvciB0eXBlcyAKICAgICAgICAgICAgdGhhdCB3ZXJlbid0IHdyYXBwZWQgYnkgU1dJRy4gIFRoZSB0eXBlIGlzIHRyZWF0ZWQgYXMgYSByYXcgCiAgICAgICAgICAgIHBvaW50ZXIsIGllIG5vIHNoYWRvdyBjbGFzcy4KCjAyLzIyLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgUmVmaW5lZCB0aGUgbWF0Y2hpbmcgYWxnb3JpdGhtIHVzZWQgYnkgJXJlbmFtZSwgJWlnbm9yZSwgYW5kCiAgICAgICAgICAgICVmZWF0dXJlLiAgIElmIGEgdHlwZSBzaWduYXR1cmUgaXMgc3VwcGxpZWQsIGl0IG11c3QgZXhhY3RseQogICAgICAgICAgICBtYXRjaCB0aGF0IHVzZWQgaW4gdGhlIGRlY2xhcmF0aW9uLS0taW5jbHVkaW5nIGFueSB1c2Ugb2YKICAgICAgICAgICAgY29uc3QuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAlcmVuYW1lKGZvbzEpICAgZm9vKGludCk7CiAgICAgICAgICAgICAgICAlcmVuYW1lKGJhcjEpICAgYmFyKGludCkgY29uc3Q7CgogICAgICAgICAgICAgICAgY2xhc3MgQmxhaCB7CiAgICAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgICB2b2lkIGZvbyhpbnQpOyAgICAgICAvLyBNYXRjaGVkIC0tPiBmb28xCiAgICAgICAgICAgICAgICAgICAgICB2b2lkIGZvbyhpbnQpIGNvbnN0OyAvLyBOb3QgbWF0Y2hlZCAKICAgICAgICAgICAgICAgICAgICAgIHZvaWQgYmFyKGludCk7ICAgICAgIC8vIE5vdCBtYXRjaGVkCiAgICAgICAgICAgICAgICAgICAgICB2b2lkIGJhcihpbnQpIGNvbnN0OyAvLyBNYXRjaGVkIC0tPiBiYXIxCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICBJbiBwcmV2aW91cyB2ZXJzaW9ucywgYSBub24tY29uc3Qgc3BlY2lmaWNhdGlvbiB3b3VsZCBtYXRjaAogICAgICAgICAgICBib3RoIHRoZSBub24tY29uc3QgYW5kIGNvbnN0IGRlY2xhcmF0aW9ucy4gIEhvd2V2ZXIsIHRoZSB3aG9sZQogICAgICAgICAgICBwb2ludCBvZiAlcmVuYW1lIGFuZCByZWxhdGVkIGRpcmVjdGl2ZXMgaXMgdGhhdCB0aGV5IGJlIGFibGUKICAgICAgICAgICAgdG8gcHJlY2lzZWx5IHBpbnBvaW50IGV4YWN0IGRlY2xhcmF0aW9ucyBpbiBhbiBpbnRlcmZhY2UuICBUaGlzCiAgICAgICAgICAgIGZpeGVzIHRoZSBwcm9ibGVtLgoKMDIvMjEvMjAwMjogYmVhemxleQogICAgICAgICAgICBSZXdvcmtlZCB0aGUgaGFuZGxpbmcgb2YgZGVmYXVsdCBjb25zdHJ1Y3RvciBhbmQgZGVzdHJ1Y3RvcnMuCiAgICAgICAgICAgIFNXSUcgbm93IG1ha2VzIGEgcHJlbGltaW5hcnkgcGFzcyBvdmVyIHRoZSBwYXJzZSB0cmVlIHRvIGRpc2NvdmVyCiAgICAgICAgICAgIHdoaWNoIGNsYXNzZXMgc3VwcG9ydCBkZWZhdWx0IGFsbG9jYXRpb24uICAgVGhpcyBmaXhlcyBhIG51bWJlcgogICAgICAgICAgICBvZiB2ZXJ5IHN1YnRsZSBpc3N1ZXMgaW4gY29kZSBnZW5lcmF0aW9uIGFuZCBjYWxsL3JldHVybiBieSB2YWx1ZS4KCjAyLzE4LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBJbXByb3ZlZCBzdXBwb3J0IG9uIEN5Z3dpbjogUGVybCwgUHl0aG9uLCBUY2wsIFJ1YnkgYW5kIEphdmEgc2hvdWxkCiAgICAgICAgICAgIHdvcmsgb3V0IG9mIHRoZSBib3gsIGJhcnJpbmcgdGhlIHJ1bnRpbWUgbGlicmFyeS4gUmVtb3ZlZCBkbGx3cmFwIAogICAgICAgICAgICBhbmQgcmVwbGFjZWQgd2l0aCBuZXdseSB3b3JraW5nIGdjYyAtc2hhcmVkIGluc3RlYWQgZm9yIEN5Z3dpbi4gCiAgICAgICAgICAgIEFsbCB0aGlzIHdpbGwgcmVxdWlyZSB0aGUgbmV3IGltcHJvdmVkIGJpbnV0aWxzIDIwMDEwODAyIGFuZCBsYXRlciwKICAgICAgICAgICAgYnV0IHRoZSBsYXRlc3QgQ3lnd2luIGlzIHVzdWFsbHkgdGhlIGJlc3QgcmVjb21tZW5kYXRpb24uCgowMi8xNS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHNvbWUgcHJvYmxlbXMgcmVsYXRlZCB0byB3cmFwcGluZyBvZiBnbG9iYWwgdmFyaWFibGVzCiAgICAgICAgICAgIGFuZCBQZXJsIHNoYWRvdyBjbGFzc2VzLiBSZXBvcnRlZCBieSBDaGlhLWxpYW5nIEthby4KCjAyLzE1LzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBNYWRlIGEgZml4IHRvIHRoZSBjb2RlIGdlbmVyYXRpb24gZm9yIEMrKyBjbGFzcwogICAgICAgICAgICBjb25zdHJ1Y3RvcnMgc28gdGhhdCB3ZSBnZXQgYm90aCBhICJuZXciIHNpbmdsZXRvbiBtZXRob2QKICAgICAgICAgICAgYW5kIGFuICJpbml0aWFsaXplIiBpbnN0YW5jZSBtZXRob2QgZm9yIGVhY2ggY2xhc3MuIFRoaXMKICAgICAgICAgICAgY2hhbmdlIGVuYWJsZXMgZGV2ZWxvcGVycyB0byBkZXJpdmUgbmV3IFJ1YnkgY2xhc3NlcyBmcm9tCiAgICAgICAgICAgIFNXSUctd3JhcHBlZCBDKysgY2xhc3NlcyBhbmQgdGhlbiBvdmVycmlkZSB0aGVpciBpbml0aWFsaXplCiAgICAgICAgICAgIG1ldGhvZHMgdG8gcHJvdmlkZSBzdWJjbGFzcy1zcGVjaWZpYyBpbnN0YW5jZSBpbml0aWFsaXphdGlvbi4KCjAyLzE1LzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBNYXNzaXZlIGRvY3VtZW50YXRpb24gdXBkYXRlIGZvciB0aGUgUnVieSBtb2R1bGUsCiAgICAgICAgICAgIGNvbnRyaWJ1dGVkIGJ5IENyYWlnIEZpbGVzLgoKMDIvMTQvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIEJ1ZyBmaXg6IEFuIGVycm9yIGluIHRoZSBTV0lHIHJ1bnRpbWUgc3VwcG9ydCBmb3IgUnVieQogICAgICAgICAgICB3YXMgY2F1c2luZyBzZXZlcmFsIG9mIHRoZSBleGFtcGxlcyB0byBmYWlsLiBSZXBvcnRlZCBieQogICAgICAgICAgICBXaWxsaWFtIEZ1bHRvbi4KCjAyLzE0LzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBCdWcgZml4OiBFbnVtZXJhdGlvbnMgZGVmaW5lZCB3aXRoaW4gYSBjbGFzcyAoc3VjaAogICAgICAgICAgICBhcyB0aG9zZSBzZWVuIGluIHRoZSBFeGFtcGxlcy9ydWJ5L2VudW0gZXhhbXBsZSkgd2VyZSBub3QKICAgICAgICAgICAgYmVpbmcgZXhwb3J0ZWQgd2l0aCB0aGUgY29ycmVjdCBuYW1lcy4gUmVwb3J0ZWQgYnkgV2lsbGlhbQogICAgICAgICAgICBGdWx0b24uCgowMi8xMy8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gQWRkZWQgYSB3YXJuaW5nIG1lc3NhZ2Ugd2hlbiB3ZSBydW4gYWNyb3NzIG92ZXJsb2FkZWQKICAgICAgICAgICAgY2xhc3MgY29uc3RydWN0b3JzIGZvciBDKysgY29kZSwgdGhhdCB0aGlzIGlzIGN1cnJlbnRseSBub3QKICAgICAgICAgICAgc3VwcG9ydGVkIChldmVuIGlmIHRoZSBvdmVybG9hZHMgaGF2ZSBiZWVuICVyZW5hbWVkKS4gRm9yIGFuCiAgICAgICAgICAgIGV4YW1wbGUgb2Ygd2hlcmUgdGhpcyBkb2Vzbid0IHdvcmssIHNlZSBFeGFtcGxlcy9ydWJ5L29wZXJhdG9yLgoKMDIvMTMvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIEFkZGVkIGFuICJpZ25vcmVkIiB3YXJuaW5nIG1lc3NhZ2Ugd2hlbiB0aGUgcGFyc2VyIHJ1bnMKICAgICAgICAgICAgYWNyb3NzIGFuIG9wZXJhdG9yIT0oKSBkZWNsYXJhdGlvbiBmb3IgQysrIGNvZGUuCgowMi8xMS8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gQWRkZWQgdGhlICJpbXBvcnQiLCAiaW1wb3J0X3RlbXBsYXRlIiwgIm9wZXJhdG9yIiBhbmQKICAgICAgICAgICAgInRlbXBsYXRlIiBleGFtcGxlcy4KCjAyLzExLzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBBZGRlZCBtdWx0aS1tb2R1bGUgc3VwcG9ydC4KCjAyLzA5LzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBBZGRlZCB0aGUgbWlzc2luZyAiI2RlZmluZSBTV0lHX05PSU5DTFVERSIgYXQgdGhlIHRvcCBvZgogICAgICAgICAgICB0aGUgd3JhcHBlciBjb2RlIHdoZW4gdGhlICctYycgb3B0aW9uIGlzIHVzZWQuCgowMi8wOS8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBDb3JyZWN0ZWQgYSBtaW5vciBvZmYtYnktb25lIGVycm9yIGZvciB0aGUgc2l6ZSBvZiB0aGUKICAgICAgICAgICAgc3dpZ190eXBlc1tdIGFycmF5IHRoYXQncyBnZW5lcmF0ZWQgaW4gdGhlIHdyYXBwZXIgY29kZS4KCjAyLzA4LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgU0YgWyAjNTE1MDU4IF0gV3JvbmcgY29kZSBmb3IgQysrIHRlbXBsYXRlcy4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgSXNyYWVsIFRhbGxlci4KClZlcnNpb24gMS4zLjExIChKYW51YXJ5IDMxLCAyMDAyKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjAxLzMwLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4IHRvIHBhc3MvcmV0dXJuIGJ5IHZhbHVlIGZvciBDKysgb2JqZWN0cyB0aGF0IGRlZmluZQogICAgICAgICAgICBubyBkZWZhdWx0IGNvbnN0cnVjdG9yLiAgQ2hhbmdlcyB0byB0aGUgdHlwZW1hcCBzeXN0ZW0KICAgICAgICAgICAgbWFkZSBpdCBpbXBvc3NpYmxlIHRvIHdyYXAgQysrIG9iamVjdHMgd2l0aCBubyBkZWZhdWx0CiAgICAgICAgICAgIGNvbnN0cnVjdG9yLiAgIFRoaXMgaGFzIGJlZW4gZml4ZWQsIGJ1dCB0aGUgc29sdXRpb24gCiAgICAgICAgICAgIGludm9sdmVzIHNvbWUgY2xldmVyIHRlbXBsYXRlIG1hZ2ljIGNvbnRyaWJ1dGVkIGJ5IAogICAgICAgICAgICBXaWxsaWFtIEZ1bHRvbi4gIFBsZWFzZSBzZWUgdGhlIGNvbW1lbnRzIGluIHRoZSBmaWxlCiAgICAgICAgICAgIExpYi9zd2lnLnN3ZyBmb3IgZnVydGhlciBkZXRhaWxzLiAgVGhpcyBzb2x1dGlvbiBpcwogICAgICAgICAgICBleHBlcmltZW50YWwgYW5kIG1heSBiZSByZWZpbmVkIGluIGEgZnV0dXJlIHJlbGVhc2UuCgowMS8zMC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEdsb2JhbCB2YXJpYWJsZXMgYW5kIG1lbWJlciBkYXRhIG9mIHR5cGUgImNvbnN0IGNoYXIgKiIKICAgICAgICAgICAgY2FuIGJlIHNldCwgYnV0IHRoZSBvbGQgdmFsdWUgaXMgc2lsZW50bHkgZGlzY2FyZGVkIHdpdGhvdXQKICAgICAgICAgICAgYW55IGdhcmJhZ2UgY29sbGVjdGlvbi4gICBUaGlzIG1heSBnZW5lcmF0ZSBhIG1lbW9yeSBsZWFrLgogICAgICAgICAgICBUaGlzIGNoYW5nZSBpcyBuZWVkZWQgdG8gbW9yZSBzYWZlbHkgaGFuZGxlIHZhcmlhYmxlcwogICAgICAgICAgICBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZm9vID0gIkhlbGxvIFdvcmxkXG4iOwoKICAgICAgICAgICAgSW4gdGhpcyBjYXNlLCBpdCdzIG5vdCBzYWZlIHRvIGZyZWUgdGhlIG9sZCB2YWx1ZS4gIEhvd2V2ZXIsCiAgICAgICAgICAgIFNXSUcgY2FuIGR5bmFtaWNhbGx5IGFsbG9jYXRlIGEgbmV3IHZhbHVlIGFuZCBtYWtlIGZvbyBwb2ludAogICAgICAgICAgICB0byBpdC4gICBUbyBmaXggdGhpcyBtZW1vcnkgbGVhaywgeW91IGNhbiBwcm9iYWJseSBkbyB0aGlzOgoKICAgICAgICAgICAgICAgJWNsZWFyIGNvbnN0IGNoYXIgKmZvbzsKICAgICAgICAgICAgICAgJWFwcGx5IGNoYXIgKiB7Y29uc3QgY2hhciAqZm9vfTsKCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgogICAgICAgICAgICAKMDEvMzAvMjAwMjogYmVhemxleQogICAgICAgICAgICBUd28gbWlub3IgdHlwZW1hcCBlbmhhbmNlbWVudHMgaGF2ZSBiZWVuIGFkZGVkLiAgRmlyc3QsCiAgICAgICAgICAgIHR5cGVtYXBzIGNhbiBpc3N1ZSBhIHdhcm5pbmcgbWVzc2FnZSBieSBpbmNsdWRpbmcgYSBzcGVjaWFsCiAgICAgICAgICAgIHdhcm5pbmcgYXR0cmlidXRlLiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAldHlwZW1hcChpbix3YXJuaW5nPSJJJ20gZ29pbmcgdG8gZG8gc29tZXRoaW5nIGRhbmdlcm91cyIpIC4uLgoKICAgICAgICAgICAgVGhlIHdhcm5pbmcgbWVzc2FnZSB3aWxsIHNob3cgdXAgd2hlbmV2ZXIgdGhlIHR5cGVtYXAgaXMKICAgICAgICAgICAgYXBwbGllZC4KCiAgICAgICAgICAgIFNlY29uZCwgYSB0eXBlbWFwIGNhbiBmb3JjZSBhIG5vLW1hdGNoIGJ5IGRlZmluaW5nCgogICAgICAgICAgICAgJXR5cGVtYXAoaW4pIHNvbWV0eXBlICJwYXNzIjsKCiAgICAgICAgICAgIElmIHRoaXMgaXMgdXNlZCwgdGhlIHR5cGVtYXAgc3lzdGVtIHdpbGwgKm5vdCogcmVjb3JkIGEKICAgICAgICAgICAgdHlwZW1hcCBtYXRjaCBmb3IgInNvbWV0eXBlIi4gICBUaGlzIGNhbiBiZSB1c2VkIHRvIGJsb2NrCiAgICAgICAgICAgIHNlbGVjdGVkIHR5cGVtYXBzLiAgRm9yIGV4YW1wbGUsIGlmIHlvdSB3YW50ZWQgdG8gZGlzYWJsZQogICAgICAgICAgICBhIHR5cGVtYXAgZmVhdHVyZSBmb3Igc29tZSB0eXBlLCB5b3UgY291bGQgZG8gdGhpcy4KCiAgICAgICAgICAgICAgIC8vIERvIG5vdCBhbGxvdyBnbG9iYWwgdmFyaWFibGVzIG9mIHR5cGUgJ2NvbnN0IGNoYXIgKicgdG8gYmUgc2V0LgogICAgICAgICAgICAgICAldHlwZW1hcCh2YXJpbikgY29uc3QgY2hhciAqICJwYXNzIjsKCiAgICAgICAgICAgIEl0IG1pZ2h0IGFsc28gYmUgcG9zc2libGUgdG8gdXNlIHRoaXMgdG8gZG8gc3VidGxlIGFuZAogICAgICAgICAgICBzdHJhbmdlIHRoaW5ncyB3aXRoIHR5cGVtYXBzLiAgRm9yIGV4YW1wbGUsIGlmIHlvdSB3YW50ZWQgdG8KICAgICAgICAgICAgbWFrZSAnYmxhaCAqJyBhbiBvdXRwdXQgdmFsdWUgYW5kICdjb25zdCBibGFoIConIGFuIGlucHV0CiAgICAgICAgICAgIHBhcmFtZXRlciwgeW91IG1pZ2h0IGRvIHRoaXM6CgogICAgICAgICAgICAgICAgJXR5cGVtYXAoaWdub3JlKSBibGFoICooYmxhaCB0ZW1wKSB7CiAgICAgICAgICAgICAgICAgICAgJDEgPSAmdGVtcDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICV0eXBlbWFwKGFyZ291dCkgYmxhaCAqIHsKICAgICAgICAgICAgICAgICAgICAuLi4gcmV0dXJuIGEgdmFsdWUgLi4uCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvKiBCbG9jayB1bnF1YWxpZmllZCB0eXBlbWFwcyBkZWZpbmVkIGFib3ZlICovCiAgICAgICAgICAgICAgICAldHlwZW1hcChpZ25vcmUpIGNvbnN0IGJsYWggKiAicGFzcyI7CiAgICAgICAgICAgICAgICAldHlwZW1hcChhcmdvdXQpIGNvbnN0IGJsYWggKiAicGFzcyI7CiAgICAgICAgICAgICAgICAldHlwZW1hcChpbikgICAgIGNvbnN0IGJsYWggKiB7CiAgICAgICAgICAgICAgICAgICAgLi4uIGdldCBpbnB1dCB2YWx1ZSAuLi4KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAoVGhpcyBwb3RlbnRpYWwgYXBwbGljYXRpb25zIG9mIHR5cGVtYXBzIHN1Z2dlc3RlZCBieSBHcmVnIFN0ZWluKS4KICAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKMDEvMjkvMjAwMjogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCiAgICAgICAgICAgW0phdmFdIEJ1ZyBmaXg6IE5vIGVudW1lcmF0aW9ucyB3ZXJlIHdyYXBwZWQgd2hlbiB0aGUgLXNoYWRvdyAKICAgICAgICAgICBjb21tYW5kbGluZSBvcHRpb24gd2FzIG5vdCBzcGVjaWZpZWQuIFJlcG9ydGVkIGJ5IElzcmFlbCBUYWxsZXIuCgowMS8yOC8yMDAyOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICBbSmF2YV0gR2xvYmFsIGFycmF5cyBhcmUgc3VjY2Vzc2Z1bGx5IHdyYXBwZWQuIEluIGZhY3QgdGhleSBzdGFydGVkCiAgICAgICAgICAgbW9zdGx5IHdvcmtpbmcgaW4gU1dJRy0xLjMuMTAuCgowMS8yOC8yMDAyOnJpY2hhcmRwCgkgICBBZGRlZCBmaXJzdCBhdHRlbXB0IGF0IEMrKyBhbmQgLXNoYWRvdyBzdXBwb3J0IGZvciBQSFA0IG1vZHVsZSwKCSAgIHBsZWFzZSB0ZXN0IGFuZCBtYWlsIG1lIGlmIGFueSBwcm9ibGVtcy9pZGVhcyBvbiBpbXByb3ZpbmcgaXQuCgoJICAgVGhlcmUgaXMgYSBrbm93biBwcm9ibGVtIHdpdGggdW5pbml0aWFsaXplZCBtZW1iZXIgdmFyaWFibGVzLAoJICAgcGxlYXNlIHNlZSBFeGFtcGxlcy9waHA0L3N5bmMvUkVBRE1FIGZvciBkZXRhaWxzLgoKCSAgIEFsc28gbW9yZSBQSFAgZG9jdW1lbnRhdGlvbiBhZGRlZCB0byBEb2MvTWFudWFsL1BocC5odG1sCgowMS8yNy8yMDAyOmJlYXpsZXkKICAgICAgICAgICBUaGUgQU5TSSBDIHNpemVfdCB0eXBlIGlzIG5vdyByZWNvZ25pemVkIGFzIGFuIGludGVnZXIgYnkgZGVmYXVsdC4KCjAxLzI2LzIwMDI6YmVhemxleQogICAgICAgICAgIGxvbmcgbG9uZyBhbmQgdW5zaWduZWQgbG9uZyBsb25nIHN1cHBvcnQgYWRkZWQgdG8gbWFueSBsYW5ndWFnZSBtb2R1bGVzLgogICAgICAgICAgIFRoaXMgaXMgbm90IGEgcG9ydGFibGUgZmVhdHVyZSBhbmQgd2lsbCByZXF1aXJlIGNvbXBpbGVyIHN1cHBvcnQKICAgICAgICAgICBmb3IgdGhlIGxvbmcgbG9uZyB0eXBlLiAgSW4gdGFyZ2V0IGxhbmd1YWdlcyB0aGF0IGRvIG5vdCBzdXBwb3J0CiAgICAgICAgICAgbG9uZyBsb25nIChlLmcuLCBUY2wgYW5kIFBlcmwpLCBudW1iZXJzIGFyZSBjb252ZXJ0ZWQgdG8gYSBzdHJpbmcKICAgICAgICAgICBvZiBkaWdpdHMuICBUaGlzIHByZXZlbnRzIHRoZWlyIHVzZSBpbiBhcml0aG1ldGljIGNhbGN1bGF0aW9ucywgYnV0CiAgICAgICAgICAgc3RpbGwgYWxsb3dzIHZhbHVlcyB0byBiZSBzZXQgZnJvbSBhIHN0cmluZy4gIAoKICAgICAgICAgICBsb25nIGxvbmcgc3VwcG9ydCByZXF1aXJlcyB0aGUgdXNlIG9mIHRoZSBzdHJ0b2xsKCkgYW5kIHN0cnRvdWxsKCkKICAgICAgICAgICBmdW5jdGlvbnMgYXMgd2VsbCBhcyB0aGUgJ2xsZCcgYW5kICdsbHUnIGZvcm1hdCBzcGVjaWZpZXJzCiAgICAgICAgICAgb2Ygc3ByaW50ZigpLgoKMDEvMjYvMjAwMjpiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgWyAjNTAxODI3IF0gRGVsZXRlIG1ldGhvZCBpcyBub3QgY2FsbGVkLiAgIFRoZSBUY2wKICAgICAgICAgICBtb2R1bGUgd2Fzbid0IGNvcnJlY3RseSBjYWxsaW5nIGRlc3RydWN0b3JzIHdoZW4gdGhleQogICAgICAgICAgIHdlcmUgZGVmaW5lZCB1c2luZyAlYWRkbWV0aG9kcy4gIFRoaXMgaGFzIGJlZW4gZml4ZWQuCiAgICAgICAgICAgUmVwb3J0ZWQgYnkgUmVpbmhhcmQgRm9iYmUuCgowMS8yNi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgQmV0dGVyIHN1cHBvcnQgZm9yIGxvbmcgbG9uZyBhbmQgdW5zaWduZWQgbG9uZyBsb25nLiAgVHlwZW1hcHMKICAgICAgICAgICBoYXZlIGJlZW4gaW5jbHVkZWQgaW4gYSBudW1iZXIgb2YgbW9kdWxlcyBmb3IgaGFuZGxpbmcgdGhlc2UgdHlwZXMuCiAgICAgICAgICAgSW4gYWRkaXRpb24sIHRoZSBwYXJzZXIgaGFzIGJlZW4gbW9kaWZpZWQgdG8gYWNjZXB0IGxvbmcgbG9uZwogICAgICAgICAgIGxpdGVyYWxzIHN1Y2ggYXMgMTIzNExMIGFuZCAxMjM0VUxMLgoKMDEvMjcvMjAwMjogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCiAgICAgICAgICAgW0phdmFdIEEgQyBjaGFyW10gaXMgbWFwcGVkIHRvIGEgSmF2YSBTdHJpbmcgd2hpY2ggaXMgdGhlIGRlZmF1bHQgCiAgICAgICAgICAgU1dJRyBoYW5kbGluZyBvZiBjaGFyW10gYW5kIGNoYXIqLiBJdCB1c2VkIHRvIGJlIG1hcHBlZCB0byBieXRlW10uIAogICAgICAgICAgIE5vdGUgdGhhdCBhIEMgc2lnbmVkIGNoYXJbXSBhcnJheSBpcyBtYXBwZWQgdG8gYnl0ZVtdLgoKICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjAxLzI1LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICBGaXhlZCBhIHByb2JsZW0gd2l0aCByZXR1cm4tYnktdmFsdWUsIEMrKywgYW5kCiAgICAgICAgICAgb2JqZWN0cyB0aGF0IGRlZmluZSBubyBkZWZhdWx0IGNvbnN0cnVjdG9yLgogICAgICAgICAgIFJlcG9ydGVkIGJ5IEpvZWwgUmVlZC4KCjAxLzI1LzIwMDI6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgIFtKYXZhXSBPdmVyaGF1bCBvZiB0aGUgSmF2YSBtb2R1bGUuIFRoZSBDIGNvZGUgZ2VuZXJhdGlvbiBpcyBub3cgCiAgICAgICAgICAgZG9uZSBmcm9tIHR5cGVtYXBzLgoKMDEvMjQvMjAwMjogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCiAgICAgICAgICAgW0phdmFdIFN1cHBvcnQgZm9yIGFycmF5cyBvZiBlbnVtIHBvaW50ZXJzCgowMS8yMC8yMDAyOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICBbSmF2YV0gRXJyb3IgY2hlY2tpbmcgZm9yIG51bGwgSmF2YSBvYmplY3RzIGJlaW5nIHBhc3NlZCB0byBuYXRpdmUgCiAgICAgICAgICAgZnVuY3Rpb25zLiAgRXhjZXB0aW9uIHRocm93biBub3cgd2hlcmVhcyBiZWZvcmUgdGhlIEpWTSBjcmFzaGVkLgoKMDEvMTgvMjAwMjogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCiAgICAgICAgICAgW0phdmFdIENvcnJlY3RlZCBiZWhhdmlvdXIgZm9yIGZ1bmN0aW9ucyB0aGF0IHRha2UgYXJyYXlzLiBGb3IgCiAgICAgICAgICAgZXhhbXBsZSwgd2hlbiB0aGlzIGMgZnVuY3Rpb246IAoKICAgICAgICAgICB2b2lkIGFycmF5Zm4oaW50IGFycmF5W10pOwogICAgICAgICAgIAogICAgICAgICAgIGlzIHdyYXBwZWQgdGhlIGNvcnJlc3BvbmRpbmcgbmF0aXZlIGZ1bmN0aW9uCgogICAgICAgICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgbmF0aXZlIHZvaWQgYXJyYXlmbihpbnRbXSBhcnJheSk7CgogICAgICAgICAgIGlzIHByb2R1Y2VkLiBQcmV2aW91c2x5IGlmIHRoZSBDIGZ1bmN0aW9uIG1hZGUgYW55IGNoYW5nZXMgdG8gdGhlIAogICAgICAgICAgIGFycmF5IGVsZW1lbnRzLCB0aGVzZSB3ZXJlIG5vdCByZWZsZWN0ZWQgYmFjayBpbnRvIHRoZSBKYXZhIGFycmF5LiAKICAgICAgICAgICBUaGlzIGhhcyBub3cgYmVlbiBjb3JyZWN0ZWQgc28gdGhhdCB0aGUgY2hhbmdlcyBhcmUgcHJvcG9nYXRlZCBiYWNrCiAgICAgICAgICAgdG8gSmF2YSBhbmQgdGhlIGNhbGxpbmcgZnVuY3Rpb24gd2lsbCBzZWUgdGhlc2UgY2hhbmdlcy4gVGhpcyBpcyAKICAgICAgICAgICBob3cgcHVyZSBKYXZhIGZ1bmN0aW9ucyB3b3JrLCBpZSBhcnJheXMgYXJlIHBhc3NlZCBieSByZWZlcmVuY2UuCgowMS8xNS8yMDAyOm1rb2VwcGUKICAgICAgICAgICBbR3VpbGVdIE5ldyBmaWxlIGNwbHVzcGx1cy5pIHdpdGggQysrIHR5cGVtYXBzIGNvbnRyaWJ1dGVkCiAgICAgICAgICAgYnkgTWFyY2lvIEx1aXMgVGVpeGVpcmEgPG1hcmNpb3RAaG9sbHkuY29sb3N0YXRlLmVkdT4uCgowMS8xMS8yMDAyOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICBbSmF2YV0gQ2hhbmdlZCBtYXBwaW5nIG9mIEMgbG9uZyB0byBKYXZhIHR5cGUuIFdhcyBtYXBwZWQgdG8gSmF2YQogICAgICAgICAgIGxvbmcsIG5vdyBtYXBwZWQgdG8gSmF2YSBpbnQuIElmIHlvdSB3YW50IHRoZSBwcmV2aW91cyBtYXBwaW5nIHRvIAogICAgICAgICAgIEphdmEgbG9uZyB1c2UgdGhpcyBhcHByb2FjaCBpbiB5b3VyIGludGVyZmFjZSBmaWxlOgogICAgICAgICAgIAogICAgICAgICAgICAgJWNsZWFyIGxvbmc7CiAgICAgICAgICAgICAldHlwZW1hcChqbmkpIGxvbmcgICAgICAgICAgICAgImpsb25nIgogICAgICAgICAgICAgJXR5cGVtYXAoanR5cGUpIGxvbmcgICAgICAgICAgICJsb25nIgogICAgICAgICAgICAgJXR5cGVtYXAoanN0eXBlKSBsb25nICAgICAgICAgICJsb25nIgoKICAgICAgICAgICAgICVjbGVhciBsb25nW0FOWV07CiAgICAgICAgICAgICAldHlwZW1hcChqbmkpIGxvbmdbQU5ZXSAgICAgICAgImpsb25nQXJyYXkiCiAgICAgICAgICAgICAldHlwZW1hcChqdHlwZSkgbG9uZ1tBTlldICAgICAgImxvbmdbXSIKICAgICAgICAgICAgICV0eXBlbWFwKGpzdHlwZSkgbG9uZ1tBTlldICAgICAibG9uZ1tdIgogICAgICAgICAgICAgJXR5cGVtYXAoaW4pIGxvbmdbQU5ZXSAgICAgICAgIHt3cml0ZSBtZSBmb3IgYXJyYXkgc3VwcG9ydH0KICAgICAgICAgICAgICV0eXBlbWFwKG91dCkgbG9uZ1tBTlldICAgICAgICB7d3JpdGUgbWUgZm9yIGFycmF5IHN1cHBvcnR9CiAgICAgICAgICAgICAldHlwZW1hcChhcmdvdXQpIGxvbmdbQU5ZXSAgICAge3dyaXRlIG1lIGZvciBhcnJheSBzdXBwb3J0fQogICAgICAgICAgICAgJXR5cGVtYXAoZnJlZWFyZykgbG9uZ1tBTlldICAgIHt3cml0ZSBtZSBmb3IgYXJyYXkgc3VwcG9ydH0KCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgogICAgICAgICAgIFRoaXMgbmV3IG1hcHBpbmcgaXMgbW9yZSBhcHByb3ByaWF0ZSB3aGVuIGludGVyZmFjaW5nIHRvIDMyIGJpdCAKICAgICAgICAgICBhcHBsaWNhdGlvbnMgd2hpY2ggYXJlIHVzZWQgaW4gdGhlIGN1cnJlbnQgMzItYml0IEpWTXMuIEZvciBmdXR1cmUgCiAgICAgICAgICAgNjQtYml0IEpWTXMgeW91IG1heSBoYXZlIHRvIGNoYW5nZSB0aGVzZSBtYXBwaW5ncyAtIGVnIG9uIFVuaXggTFA2NCAKICAgICAgICAgICBzeXN0ZW1zLCBidXQgbm90IG9uIE1pY3Jvc29mdCA2NGJpdCBXaW5kb3dzIHdoaWNoIHdpbGwgYmUgdXNpbmcgYSAKICAgICAgICAgICBQNjQgSUwzMiBtb2RlbC4gVGhpcyBtYXkgYmUgYXV0b21hdGVkIGluIGEgZnV0dXJlIHZlcnNpb24gb2YgU1dJRy4KCjAxLzEwLzIwMDI6YmVhemxleQogICAgICAgICAgIEZpeGVkIFsgNTAxNjc3IF0gJWluaXQgYmxvY2sgaW4gd3JvbmcgcGxhY2UuIFJlcG9ydGVkCiAgICAgICAgICAgYnkgTHVpZ2kgQmFsbGFiaW8uCgowMS8wOS8yMDAyOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICBbSmF2YV0gRGVmYXVsdCBzdXBwb3J0IGZvciB0aGUgbG9uZyBsb25nIHR5cGUuIHNpZ25lZCBsb25nIGxvbmcgaXMgCiAgICAgICAgICAgbWFwcGVkIHRvIGEgSmF2YSBsb25nLiB1bnNpZ25lZCBsb25nIGxvbmcgaXMgbWFwcGVkIHRvIEJpZ0ludGVnZXIuCgowMS8wOS8yMDAyOmJlYXpsZXkKICAgICAgICAgICBFeHBlcmltZW50YWwgY2hhbmdlIHRvIHBhcnNlciB0byBiZXR0ZXIgc3VwcG9ydCBtaXhpbmcgb2YKICAgICAgICAgICBpbnQsIGxvbmcsIHNob3J0LCB1bnNpZ25lZCwgZmxvYXQsIGFuZCBkb3VibGUuICAgVGhlIHBhcnNlcgogICAgICAgICAgIHNob3VsZCBub3cgc3VwcG9ydCB0eXBlcyBsaWtlIHRoaXM6CiAgICAKICAgICAgICAgICAgICAgIHNob3J0IHVuc2lnbmVkIGludAogICAgICAgICAgICAgICAgaW50ICAgdW5zaWduZWQgc2hvcnQKICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IGludAogICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHNob3J0CgogICAgICAgICAgICBUaGlzIGNoYW5nZSBhbHNvIGVuYWJsZXMgYSB0eXBlIG9mICdsb25nIGRvdWJsZScgKHByZXZpb3VzbHkKICAgICAgICAgICAgdW5zdXBwb3J0ZWQpIHRvIGJlIHVzZWQuCiAgICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjAxLzA1LzIwMDI6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgIFtKYXZhXSBDYXN0aW5nIGZpeCBmb3Igd2hlbiBmdW5jdGlvbiByZXR1cm4gdHlwZSBpcyBhIHBvaW50ZXIgYXMgCiAgICAgICAgICAgcmVwb3J0ZWQgYnkgR2FyeSBQZW5uaW5ndG9uIDIwMDItMDEtMDUuIFRoZSB1cHBlciAzMmJpdHMgb2YgdGhlIAogICAgICAgICAgIDY0IGJpdCBqbG9uZyB3aWxsIGhhdmUgY29udGFpbmVkIGp1bmsgZm9yIDMyYml0IHBvaW50ZXJzLgoKMDEvMDUvMjAwMjogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCiAgICAgICAgICAgW0phdmFdIEJldHRlciBwb2ludGVyIGhhbmRsaW5nIGluIEphdmEgaXMgcG9zc2libGUgYXMgdGhlIAogICAgICAgICAgIElOUFVULCBPVVRQVVQgYW5kIElOT1VUIHR5cGVtYXBzIGhhdmUgYmVlbiBhZGRlZCBpbnRvIHR5cGVtYXBzLmkuCgowMS8wNS8yMDAyOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICBbSmF2YV0gJG51bGwgY2FuIGJlIHVzZWQgaW4gaW5wdXQgdHlwZW1hcHMgdG8gcmV0dXJuIGVhcmx5IGZyb20gSk5JIAogICAgICAgICAgIGZ1bmN0aW9ucyB0aGF0IGhhdmUgZWl0aGVyIHZvaWQgb3IgYSBub24tdm9pZCByZXR1cm4gdHlwZS4gRXhhbXBsZToKCiAgICAgICAgICAgICAldHlwZW1hcChjaGVjaykgaW50ICogJXsgCiAgICAgICAgICAgICAgIGlmIChlcnJvcikgewogICAgICAgICAgICAgICAgIFNXSUdfZXhjZXB0aW9uKFNXSUdfSW5kZXhFcnJvciwgIkFycmF5IGVsZW1lbnQgZXJyb3IiKTsKICAgICAgICAgICAgICAgICByZXR1cm4gJG51bGw7CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICV9CgogICAgICAgICAgIElmIHRoZSB0eXBlbWFwIGdldHMgcHV0IGludG8gYSBmdW5jdGlvbiB3aXRoIHZvaWQgYXMgcmV0dXJuLCAkbnVsbCAKICAgICAgICAgICB3aWxsIGV4cGFuZCB0byBub3RoaW5nOgoKICAgICAgICAgICAgIHZvaWQgam5pX2ZuKC4uLikgewogICAgICAgICAgICAgICAgIGlmIChlcnJvcikgewogICAgICAgICAgICAgICAgICAgU1dJR19leGNlcHRpb24oU1dJR19JbmRleEVycm9yLCAiQXJyYXkgZWxlbWVudCBlcnJvciIpOwogICAgICAgICAgICAgICAgICAgcmV0dXJuIDsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgfQoKICAgICAgICAgICBvdGhlcndpc2UgJG51bGwgZXhwYW5kcyB0byB6ZXJvLCB3aGVyZSBqYXZhcmV0dXJudHlwZSBpcyBlaXRoZXIgYSAKICAgICAgICAgICBwb2ludGVyIG9yIGEgcHJpbWl0aXZlIHR5cGU6CgogICAgICAgICAgICAgamF2YXJldHVybnR5cGUgam5pX2ZuKC4uLikgewogICAgICAgICAgICAgICAgIGlmIChlcnJvcikgewogICAgICAgICAgICAgICAgICAgU1dJR19leGNlcHRpb24oU1dJR19JbmRleEVycm9yLCAiQXJyYXkgZWxlbWVudCBlcnJvciIpOwogICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgIH0KCjAxLzAyLzIwMDI6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgIFtKYXZhXSBUaGUgSmF2YSBtb2R1bGUgaW5jb3JyZWN0bHkgdXNlZCBhcmdvdXQgdHlwZW1hcHMgZm9yIAogICAgICAgICAgIHN0cmluZ3MuIFRoaXMgaXMgbm93IGNvcnJlY3RlZCBhbmQgdGhlIGNvZGUgbm93IHJlc2lkZXMKICAgICAgICAgICBpbiB0aGUgZnJlZWFyZyB0eXBlbWFwLiBUaGUgYXJnb3V0IGFycmF5IHR5cGVtYXBzIGhhdmUgYmVlbiBzcGxpdCBpbnRvIAogICAgICAgICAgIGFyZ291dCBhbmQgZnJlZWFyZyB0eXBlbWFwcy4gVGhpcyBjb3JyZWN0aW9uIG1heSByZXF1aXJlIHNvbWUgdXNlciAKICAgICAgICAgICB3cml0dGVuIHR5cGVtYXBzIHRvIGJlIG1vZGlmaWVkLiAKICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjEyLzI4LzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgIFtKYXZhXSBNdWx0aSB0eXBlbWFwcyBub3cgd29ya2luZyBmb3IgSmF2YSBzZWUgbXVsdGltYXAgZXhhbXBsZS4KICAgICAgICAgICBbSmF2YV0gRml4IGZvciByZWNlbnRseSBpbnRyb2R1Y2VkIGJ1ZyAtIGZyZWVhcmcgdHlwZW1hcCBjb2RlIHdhcyBhcHBlYXJpbmcKICAgICAgICAgICBiZWZvcmUgdGhlIGZ1bmN0aW9uIGNhbGwuCgoxMi8yOC8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICBbSmF2YV0gSkNBTEwgbWFjcm8gZm9yIEpOSSBjYWxscyB0aGF0IHdvcmsgaW4gYm90aCBDIGFuZCBDKysgdHlwZW1hcHMKICAgICAgICAgICBoYXZlIGJlZW4gcmVwbGFjZWQgd2l0aCBKQ0FMTDAsIEpDQUxMMSwgSkNBTEwyLCBKQ0FMTDMgYW5kIEpDQUxMNCAKICAgICAgICAgICBtYWNyb3MuCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoxMi8yMi8yMDAxOmJlYXpsZXkKICAgICAgICAgICBSZXNvbHZlZCBzb21lIGluY29uc2lzdGVudCBiZWhhdmlvciB3aXRoICVyZW5hbWUgYW5kIGNsYXNzIHJlbmFtaW5nLgogICAgICAgICAgIElmIHlvdSBzcGVjaWZ5IHRoZSBmb2xsb3dpbmc6CiAKICAgICAgICAgICAgICAgJXJlbmFtZShGb28pICBCYXI7CgogICAgICAgICAgICAgICBjbGFzcyBCYXIgewogICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgQmFyKCk7CiAgICAgICAgICAgICAgICAgICAgfkJhcigpOwogICAgICAgICAgICAgICB9CgogICAgICAgICAgIFRoZW4gdGhlICVyZW5hbWUgZGlyZWN0aXZlIGFwcGxpZXMgdG8gdGhlIGNsYXNzIGl0c2VsZiwgdGhlIGNvbnN0cnVjdG9yLAogICAgICAgICAgIGFuZCB0aGUgZGVzdHJ1Y3RvciAoYWxsIHdpbGwgYmUgcmVuYW1lZCB0byBGb28pLgoKICAgICAgICAgICBJZiBhIGNsYXNzIGRlZmluZXMgbW9yZSB0aGFuIG9uZSBjb25zdHJ1Y3RvciwgdGhlIG92ZXJsb2FkZWQgdmFyaWFudHMKICAgICAgICAgICBjYW4gc3RpbGwgYmUgcmVuYW1lZCBieSBzcGVjaWZ5aW5nIHBhcmFtZXRlcnMgdG8gJXJlbmFtZS4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgJXJlbmFtZShCYXJfY29weSkgQmFyKEJhciAmKTsKICAgICAgICAgICAgICAgY2xhc3MgQmFyIHsKICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICBCYXIoKTsKICAgICAgICAgICAgICAgICAgICAgQmFyKEJhciAmKTsKICAgICAgICAgICAgICAgICAgICB+QmFyKCk7CiAgICAgICAgICAgICAgIH07CgogICAgICAgICAgIFRoZXJlIGFyZSBzdGlsbCBzb21lIG9kZCBjb3JuZXIgY2FzZXMuICBJZiB5b3Ugc3BlY2lmeQoKICAgICAgICAgICAgICAgJXJlbmFtZShGb28pIDo6QmFyOwoKICAgICAgICAgICB0aGVuIG9ubHkgdGhlIG5hbWUgb2YgdGhlIGNsYXNzIGlzIGNoYW5nZWQgYW5kIHRoZSBjb25zdHJ1Y3Rvci9kZXN0cnVjdG9yCiAgICAgICAgICAgbmFtZXMgYXJlIGxlZnQgdW5tb2RpZmllZC4gIElmIHlvdSBzcGVjaWZ5IAoKICAgICAgICAgICAgICAgJXJlbmFtZShGb28pICo6OkJhcjsKCiAgICAgICAgICAgdGhlbiB0aGUgbmFtZXMgb2YgdGhlIGNvbnN0cnVjdG9yL2Rlc3RydWN0b3IgZnVuY3Rpb25zIGFyZSBtb2RpZmllZCBidXQKICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgY2xhc3MgaXMgbm90LgoKMTIvMjEvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCiAgICAgICAgICAgW0phdmFdIGpuaSwganR5cGUgYW5kIGpzdHlwZSB0eXBlbWFwcyBubyBsb25nZXIgaGFyZGNvZGVkIGJ1dCByZWFsIAogICAgICAgICAgIHR5cGVtYXBzLiBOZXcgdmFyaWFibGUgc3Vic3RpdHV0aW9uLCAkamF2YWNsYXNzbmFtZSwgY2FuIGJlIHVzZWQgaW4KICAgICAgICAgICB0aGUganN0eXBlIHR5cGVtYXBzLiBJdCBpcyByZXBsYWNlZCB3aXRoIHRoZSBKYXZhIHNoYWRvdyBjbGFzcyBuYW1lCiAgICAgICAgICAgd2hlcmUgYXBwbGljYWJsZS4KICAgICAgICAgICBbSmF2YV0gRml4IGZvciByZWNlbnRseSBpbnRyb2R1Y2VkIGJ1ZyB0byBkbyB3aXRoIGluaGVyaXRhbmNlIHdoZW4gCiAgICAgICAgICAgdXNpbmcgJWltcG9ydC4KICAgICAgICAgICBbSmF2YV0gQSBmZXcgbW9yZSBidWcgZml4ZXMsIHRvZG8gd2l0aCAlcmVuYW1lIGFuZCB1c2luZyB0aGUga2luZAogICAgICAgICAgIHdpdGggdGhlIHR5cGUsIGVnIAogICAgICAgICAgIHZvaWQgZm4odW5pb24gdW5pIG15dW5pLCBzdHJ1Y3Qgc3RyIG15c3RyLCBjbGFzcyBjbCBteWNsKTsKCjEyLzIwLzIwMDE6YmVhemxleQogICAgICAgICAgIEZpeGVkIFsgIzQ5NDUyNCBdIFByZXByb2Nlc3NvciBidWcgLSBhcG9zdHJvcGhlIGFuZCAjc3Vic3QuCgoxMi8yMC8yMDAxOmJlYXpsZXkKICAgICAgICAgICBBZGRlZCBTV0lHX1ZFUlNJT04gcHJlcHJvY2Vzc29yIHN5bWJvbC4gICBUaGlzIGlzIGEgaGV4YWRlY2ltYWwKICAgICAgICAgICBpbnRlZ2VyIHN1Y2ggYXMgMHgwMTAzMTEgKGNvcnJlc3BvbmRpbmcgdG8gU1dJRy0xLjMuMTEpLiAgVGhpcyBjYW4KICAgICAgICAgICBiZSB1c2VkIGluIHRoZSBpbnRlcmZhY2UgYXMgZm9sbG93czoKCiAgICAgICAgICAgICAgICNpZiBTV0lHX1ZFUlNJT04gPj0gMHgwMTAzMTEKICAgICAgICAgICAgICAgLyogVXNlIHNvbWUgZmFuY3kgbmV3IGZlYXR1cmUgKi8KICAgICAgICAgICAgICAgI2VuZGlmCgogICAgICAgICAgIE5vdGU6IFRoZSB2ZXJzaW9uIHN5bWJvbCBpcyBub3QgZGVmaW5lZCBpbiB0aGUgZ2VuZXJhdGVkIFNXSUcKICAgICAgICAgICB3cmFwcGVyIGZpbGUuCgogICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjEyLzIwLzIwMDE6bWtvZXBwZQoJICAgW016U2NoZW1lXTogUmVuYW1lZCBtenN3aWdfbWFrZV9ib29sZWFuIHRvCgkgICBzd2lnX21ha2VfYm9vbGVhbiwgYXMgdGhlIGxhdHRlciBpcyB1c2VkIGluIHRoZSB0eXBlbWFwcy4KCSAgIFJlcG9ydGVkIGJ5IEx1aWdpIEJhbGxhYmlvLgoKMTIvMTcvMjAwMTpta29lcHBlCgkgICBbR3VpbGVdOiBSZXdyb3RlIGxpc3QtdmVjdG9yLmkgdXNpbmcgbXVsdGktZGlzcGF0Y2gKCSAgIHR5cGVtYXBzLiAgVXBkYXRlZCBwb2ludGVyLWluLW91dC5pLiAgTWFrZSB0aGUKCSAgIGRlcHJlY2F0ZWQgdHlwZW1hcC1zdWJzdGl0dXRpb24gb2YgIiRzb3VyY2UiIGluICJhcmdvdXQiCgkgICB3b3JrIGFzIGJlZm9yZS4KCjEyLzE2LzIwMDE6bWtvZXBwZQoJICAgW0d1aWxlXTogRml4ZWQgbWFjcm9zICV2YWx1ZXNfYXNfbGlzdCwgJXZhbHVlc19hc192ZWN0b3IsCgkgICAlbXVsdGlwbGVfdmFsdWVzIHRvIHVzZSB0aGUgcHJvcGVyICVwcmFnbWEgc3ludGF4LiAgTmV3CgkgICBHdWlsZSBleGFtcGxlL3Rlc3QgIm11bHRpdmFsdWUiOyBuZXcgR3VpbGUgcnVuLXRlc3QgZm9yCgkgICB0ZXN0LXN1aXRlIGl0ZW0gImxpc3QtdmVjdG9yIiAoY3VycmVudGx5IGJyb2tlbikuCgoxMi8xNC8yMDAxOm1rb2VwcGUKCSAgIFtHdWlsZV06IEZpeGVkIHR5cGVtYXAtc3Vic3RpdGlvbiBidWcgZm9yICJ2YXJpbiIuICBSZWxheGVkCgkgICB2YWxpZC1pZGVudGlmaWVyIGNoZWNrIHRvIGFsbG93IGFsbCBSNVJTIGlkZW50aWZpZXJzLgoKClZlcnNpb24gMS4zLjEwIChEZWNlbWJlciAxMCwgMjAwMSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMTIvMDgvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgTW9kaWZpZWQgJXR5cGVtYXAgc28gdGhhdCAleyAuLi4gJX0gY2FuIGFsc28gYmUgdXNlZCBhcyBhCiAgICAgICAgICAgY29kZSBibG9jayAobW9zdGx5IGZvciBjb21wbGV0ZW5lc3MpLiAgRm9yIGV4YW1wbGU6CiAKICAgICAgICAgICAgICAldHlwZW1hcChpbikgYmxhaCAlewogICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICV9CgogICAgICAgICAgIFRoaXMgZm9ybSBkb2VzIG5vdCBpbnRyb2R1Y2UgYSBuZXcgYmxvY2sgc2NvcGUuICBBbHNvLCB0aGUKICAgICAgICAgICBjb2RlIGVuY2xvc2VkIGluICV7IC4uLiAlfSBpcyBub3QgcHJvY2Vzc2VkIGJ5IHRoZSBwcmVwcm9jZXNzb3IuCgoxMi8wOC8yMDAxOmJlYXpsZXkKICAgICAgICAgICBGaXhlZCBbICM0NTk2MTQgXSBTV0lHIHdpdGggbXVsdGlwbGUgVENMIGludGVycHJldGVycy4KCjEyLzA4LzIwMDE6YmVhemxleQogICAgICAgICAgIEZpeGVkIFsgIzQxNzE0MSBdIHJ1YnlkZWMuc3dnIGlzIHdyb25nCiAgICAgICAgICAgUmVwb3J0ZWQgYnkgUGF1bCBCcmFubmFuLgoKMTIvMDgvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgWyAjNDEwNTU3IF0gUHJvYmxlbSB3aXRoICVhZGRtZXRob2RzIG9uIE5ULgogICAgICAgICAgIFJlcG9ydGVkIGJ5IE1hZ251cyBManVuZy4KCjEyLzA4LzIwMDE6YmVhemxleQogICAgICAgICAgIEZpeGVkIFsgIzQ0NTIzMyBdIEVuaGFuY2VtZW50OiBoYW5kbGUgYWNjZXNzIGNoYW5nZS4KICAgICAgICAgICBTV0lHIG5vdyBwYXJzZXMgKGJ1dCBpZ25vcmVzKSBDKysgYWNjZXNzIGNoYW5nZXMgZm9yIHRoZQogICAgICAgICAgIHRoZSBmb2xsb3dpbmc6CgogICAgICAgICAgICAgY2xhc3MgQSB7CiAgICAgICAgICAgICBwcm90ZWN0ZWQ6CiAgICAgICAgICAgICAgICB2b2lkIHNvbWV0aGluZygpIHsgfQogICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgQSgpIHt9CiAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgIGNsYXNzIEIgOiBwcml2YXRlIEEgewogICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgQigpIDogQSgpIHsgfQogICAgICAgICAgICAgcHJvdGVjdGVkOgogICAgICAgICAgICAgICAgQTo6c29tZXRoaW5nOyAgICA8LS0tLSBQYXJzZWQsIGJ1dCBpZ25vcmVkCiAgICAgICAgICAgICB9OwogCiAgICAgICAgICAgU3VnZ2VzdGVkIGJ5IEtyenlzenRvZiBLb3ptaW5za2kuCgoxMi8wOC8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICBGaXggZm9yIFJ1YnkgdG8gd29yayB1c2luZyBWaXN1YWwgQysrLgoKMTIvMDYvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgWyAjNDY1Njg3IF0gdW5zaWduZWQgc2hvcnQgcGFyYW1ldGVycyBmYWlsLgogICAgICAgICAgIFJlcG9ydGVkIGJ5IEdlcmFsZCBXaWxsaWFtcy4KCjEyLzA2LzIwMDE6YmVhemxleQogICAgICAgICAgIEZpeGVkIFNGIFsgIzQ4OTU5NCBdIFB5U3RyaW5nX0Zyb21TdHJpbmcgY2FuJ3QgdGFrZSBOVUxMIGFyZy4KICAgICAgICAgICBSZXBvcnRlZCBieSBKb2huIE1lcnJpdHQuICAgU1dJRyBub3cgY29udmVydHMgc3RyaW5nIHZhbHVlcwogICAgICAgICAgIHRvIFB5dGhvbiB1c2luZyBjb2RlIGxpa2UgdGhpczoKCiAgICAgICAgICAgcmVzdWx0b2JqID0gcmVzdWx0ID8gUHlTdHJpbmdfRnJvbVN0cmluZyhyZXN1bHQpIDogUHlfQnVpbGRWYWx1ZSgiIik7CgoxMi8wNi8yMDAxOmJlYXpsZXkKICAgICAgICAgICBGaXhlZCBTRiBbICM0NjM1NjEgXSBUeXBlIGNvbnZlcnNpb25zIG5vdCBnZW5lcmF0ZWQuCiAgICAgICAgICAgUmVwb3J0ZWQgYnkgR2VyYWxkIFdpbGxpYW1zLgoJCjEyLzA0LzIwMDE6YmVhemxleQogICAgICAgICAgIEZpeGVkIFNGIFsgIzQ3MDIxNyBdIFRjbCBkZWZhdWx0IGFyZ3VtZW50IGhhbmRsaW5nLgogICAgICAgICAgIFJlcG9ydGVkIGJ5IFNoYXVuIExvd3J5LgoKMTIvMDQvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgU0YgWyAjNDcyMDg4IF0gZGVmaW5lZChNQUNSTykgZXhwYW5kZWQgZXZlcnl3aGVyZS4KICAgICAgICAgICBFbWJlZGRlZCBwcmVwcm9jZXNzb3IgZGlyZWN0aXZlcyBzdWNoIGFzCgogICAgICAgICAgICAgICUjaWYgZGVmaW5lZChGT08pCgogICAgICAgICAgIGFyZSBub3QgZXhwYW5kZWQgYnkgdGhlIFNXSUcgcHJlcHJvY2Vzc29yLgogICAgICAgICAgIFJlcG9ydGVkIGJ5IEdlcmFsZCBXaWxsaWFtcy4KCjEyLzA0LzIwMDE6YmVhemxleQogICAgICAgICAgIEZpeGVkIFNGIFsgIzQ3NjQ2NyBdIFByb2JsZW1zIHdpdGggI2RlZmluZSAmIGNvbW1hcy4KCjEyLzA0LzIwMDE6YmVhemxleQogICAgICAgICAgIEZpeGVkIFNGIFsgIzQ3NzU0NyBdIHdyb25nIGRlY2xhcmF0aW9uIG9mIHBvaW50ZXIgZnVuY3Rpb25zLgogICAgICAgICAgIEJhZCBwcm90b3R5cGVzIGluIExpYi90Y2wvcHRybGFuZy5pLgoKMTIvMDQvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgU0YgWyAjNDgzMTgyIF0gQ29uc3RhbnRzIGNhbiB0YWtlIGFyZ3MgYnkgbWlzdGFrZS4gCiAgICAgICAgICAgV2hlbiBzd2lnIC1wZXJsNSAtY29uc3QgaXMgdXNlZCwgY29uc3RhbnRzIGFyZSBkZWNsYXJlZAogICAgICAgICAgIHdpdGggYSB2b2lkIHByb3RvdHlwZS4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgIHN1YiBJQ09OU1QgKCkgeyAkZXhhbXBsZWM6OklDT05TVCB9CgogICAgICAgICAgIFBhdGNoIHN1Ym1pdHRlZCBieSBSaWNoIFdhbGVzLgoKMTIvMDMvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgTmV3ICVleGNlcHRpb24gZGlyZWN0aXZlLiAgIFRoaXMgaXMgaW50ZW5kZWQgdG8gcmVwbGFjZSAlZXhjZXB0LgogICAgICAgICAgIEl0IHdvcmtzIGluIGV4YWN0bHkgdGhlIHNhbWUgbWFubmVyIGV4Y2VwdCBpdCBkb2VzIG5vdCBhY2NlcHQgYSAKICAgICAgICAgICBsYW5ndWFnZSBzcGVjaWZpZXIuIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgJWV4Y2VwdGlvbiB7CiAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgJGFjdGlvbgogICAgICAgICAgICAgICAgICAgfSAKICAgICAgICAgICAgICAgICAgIGNhdGNoKFNvbWVFcnJvcikgewogICAgICAgICAgICAgICAgICAgICAgIGVycm9yCiAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgJWV4Y2VwdGlvbiBpcyBhbHNvIG5hbWUgYXdhcmUtLS1hbGxvd2luZyBpdCB0byBiZSBhcHBsaWVkIHRvCiAgICAgICAgICAgc3BlY2lmaWMgZGVjbGFyYXRpb25zIGluIGFuIGludGVyZmFjZS4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAlZXhjZXB0aW9uIGZvbyB7CiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICBleGNlcHRpb24gZm9yIGFueSBmdW5jdGlvbi9tZXRob2QgZm9vCiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgJWV4Y2VwdGlvbiBGb286OmJhciB7CiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICBleGNlcHRpb24gZm9yIG1ldGhvZCBiYXIgaW4gY2xhc3MgRm9vCiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICVleGNlcHRpb24gRm9vOjpiYXIoZG91YmxlKSB7CiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICBleGNlcHRpb24gZm9yIG1ldGhvZCBiYXIoZG91YmxlKSBpbiBjbGFzcyBGb28KICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgfQoKICAgICAgICAgICBUaGUgc2VtYW50aWNzIG9mIHRoaXMgbmFtZSBtYXRjaGluZyBpcyBleGFjdGx5IHRoZSBzYW1lIGFzIGZvciAlcmVuYW1lLgogICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKICAgICAgICAgICAKMTIvMDMvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgU3Vic3RhbnRpYWwgY2xlYW51cCBvZiB0aGUgUHl0aG9uIHNoYWRvdyBjbGFzcyBjb2RlLiAgU2hhZG93IGNsYXNzZXMKICAgICAgICAgICB1c2VkIHRvIGJlIGNyZWF0ZWQgaW4gdGhpcyByYXRoZXIgY29tcGxpY2F0ZWQgbWFubmVyIGludm9sdmluZyBhYm91dAogICAgICAgICAgIGEgaGFsZi1kb3plbiBzdHJpbmdzIGNyZWF0ZWQgaW4gYml0cyBhbmQgcGllY2VzLiAgIFNoYWRvdyBjbGFzc2VzCiAgICAgICAgICAgYXJlIG5vdyBnZW5lcmF0ZWQgaW4gYSBtb3JlIHN0cmFpZ2h0Zm9yd2FyZCBtYW5uZXItLWluIHRoZSBzYW1lCiAgICAgICAgICAgb3JkZXIgdGhhdCBhcHBlYXJzIGluIHRoZSBpbnRlcmZhY2UgZmlsZS4KCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCiAgICAgICAgICAgVGhlIG9yZGVyIGluIHdoaWNoIGRlY2xhcmF0aW9ucyBhcHBlYXIgaW4gdGhlIHNoYWRvdyBmaWxlIG1heSBkaWZmZXIuCiAgICAgICAgICAgCjEyLzAzLzIwMDE6YmVhemxleQogICAgICAgICAgIFRoZSAlaW5zZXJ0IGRpcmVjdGl2ZSAoJXsgLi4uICV9LCAlcnVudGltZSwgJWhlYWRlciwgJXdyYXBwZXIsIGV0Yy4pCiAgICAgICAgICAgY2FuIG5vdyBiZSB1c2VkIGluc2lkZSBvZiBhIGNsYXNzIGRlZmluaXRpb24uICAgVGhpcyBoYXMgcG90ZW50aWFsCiAgICAgICAgICAgdXNlcyB3aGVuIGdlbmVyYXRpbmcgc2hhZG93IGNsYXNzIGNvZGUuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgJWluc2VydCgic2hhZG93IikgJXsKICAgICAgICAgICAgICAgICAjIFNvbWUgcHl0aG9uIGNvZGUKICAgICAgICAgICAgICAgICBkZWYgYmxhaChzZWxmKToKICAgICAgICAgICAgICAgICAgICAgIHByaW50ICJJJ20gYmxhaCEiCiAgICAgICAgICAgICAgICAgJX0KICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgVGhlIHN1cHBvcnQgZm9yIGNsYXNzIGNvZGUgaW5zZXJ0aW9uIGRlcGVuZHMgb24gdGhlIGxhbmd1YWdlIG1vZHVsZS4KICAgICAgICAgICBIb3dldmVyLCB0aGUgaW50ZW50IG9mIHRoaXMgZmVhdHVyZSBpcyB0byBzaW1wbGlmeSB0aGUgdGFzayBvZiBleHRlbmRpbmcKICAgICAgICAgICBzaGFkb3cgY2xhc3MgY29kZS4gICBJbiB0aGUgUHl0aG9uIG1vZHVsZSwgdGhpcyBpbnNlcnRzIGNvZGUgd2l0aCB0aGUKICAgICAgICAgICBwcm9wZXIgbGV2ZWwgb2YgaW5kZW5kYXRpb24gKHJlZ2FyZGxlc3Mgb2Ygd2hhdCB3YXMgdXNlZCBpbiB0aGUgU1dJRwogICAgICAgICAgIGludGVyZmFjZSkuCiAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKMTEvMjkvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCiAgICAgICAgICAgTW9kaWZpY2F0aW9ucyBmb3IgSmF2YSBhbmQgUHl0aG9uIG1vZHVsZXMgdG8gd29yayBvbiBjeWd3aW4uCiAgICAgICAgICAgVW5mb3J0dW5hdGVseSBhIGxvdCBvZiB0aGUgcHl0aG9uIG1vZHVsZSBoYXMgc3RhcnRlZCB0byBwcm9kdWNlcyBjb2RlIAogICAgICAgICAgIHdoaWNoIGNhbm5vdCBiZSBhdXRvLWltcG9ydGVkIHVzaW5nIGN5Z3dpbiBsaWJ0b29scyBzbyBtb3N0IG9mIGl0IGlzIAogICAgICAgICAgIHN0aWxsIGJyb2tlbi4KCjExLzI4LzIwMDE6YmVhemxleQogICAgICAgICAgIFRoZSAlcmVuYW1lIGFuZCAlZmVhdHVyZSBkaXJlY3RpdmUgY2FuIG5vdyBiZSB1c2VkIGluc2lkZQogICAgICAgICAgIG9mIGEgY2xhc3MgZGVmaW5pdGlvbi4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgICAlcmVuYW1lKGZvb19pKSBmb28oaW50KTsKICAgICAgICAgICAgICAgICAlcmVuYW1lKGZvb19kKSBmb28oZG91YmxlKTsKICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICB2b2lkIGZvbyhpbnQpOwogICAgICAgICAgICAgICAgIHZvaWQgZm9vKGRvdWJsZSk7CiAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICB9OwoKICAgICAgICAgICBXaGVuIHVzZWQgaW4gdGhpcyBtYW5uZXIsIHRoZSAlcmVuYW1lIGRpcmVjdGl2ZSBvbmx5IGFwcGxpZXMKICAgICAgICAgICB0byBtZW1iZXJzIG9mIHRoZSBjbGFzcyBpbiB3aGljaCBpdCBhcHBlYXJzIGFzIHdlbGwgYXMgYWxsCiAgICAgICAgICAgZGVyaXZlZCBjbGFzc2VzLiAgSW4gZmFjdCwgdGhpcyBpcyByZWFsbHkganVzdCB0aGUgc2FtZQogICAgICAgICAgIGFzIHNheWluZzoKCiAgICAgICAgICAgICAlcmVuYW1lKGZvb19pKSBGb286OmZvbyhpbnQpOwogICAgICAgICAgICAgJXJlbmFtZShmb29fZCkgRm9vOjpmb28oZG91YmxlKTsKICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgIH07CgogICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjExLzI2LzIwMDE6YmVhemxleQogICAgICAgICAgIEFkZGVkIHRoZSBleHBlcmltZW50YWwgJWZlYXR1cmUgZGlyZWN0aXZlLiAgJWZlYXR1cmUgY2FuIGJlCiAgICAgICAgICAgdXNlZCB0byBhdHRhY2ggYXJiaXRyYXJ5IHN0cmluZyBhdHRyaWJ1dGVzIHRvIHBhcnNlIHRyZWUgbm9kZXMuCiAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAlZmVhdHVyZSgiZXhjZXB0IikgYmxhaCB7CiAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgJGZ1bmN0aW9uCiAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFcnJvcikgewogICAgICAgICAgICAgICAgICAgICAgIHdoYXRldmVyOyAgICAgIAogICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICB9CgogICAgICAgICAgIG9yCgogICAgICAgICAgICAgICVmZWF0dXJlKCJzZXQiKSAqOjp4X3NldCAieCI7CgogICAgICAgICAgIG9yCgogICAgICAgICAgICAgICVmZWF0dXJlKCJibGFoIikgRm9vOjpiYXIoaW50LGRvdWJsZSkgY29uc3QgInNwYW0iOwoKICAgICAgICAgICBUaGUgc3ludGF4IGlzIGJvcnJvd2VkIGZyb20gdGhlICVyZW5hbWUgZGlyZWN0aXZlLiAgSW4gZmFjdCwgdGhlCiAgICAgICAgICAgZXhhY3Qgc2FtZSBzZW1hbnRpY3MgYXBwbHkgKGluaGVyaXRhbmNlLCBtYXRjaGluZywgZXRjLikuCgogICAgICAgICAgICVmZWF0dXJlIGlzIGEgdmVyeSBwb3dlcmZ1bCBsb3ctbGV2ZWwgcHJpbWl0aXZlIHRoYXQgY2FuIGJlIHVzZWQgdG8KICAgICAgICAgICBjdXN0b21pemUgaW5kaXZpZHVhbCBsYW5ndWFnZSBtb2R1bGVzIGFuZCB0byBwcm92aWRlIGhpbnRzIHRvIAogICAgICAgICAgIGFueSBzdGFnZSBvZiBjb2RlIGdlbmVyYXRpb24uICAgRmVhdHVyZXMgYXJlIGF0dGFjaGVkIHRvCiAgICAgICAgICAgcGFyc2UgdHJlZSBub2RlcyBhcyBhdHRyaWJ1dGVzIHdpdGggbmFtZXMgbGlrZSAiZmVhdHVyZToqIiB3aGVyZSAqIAogICAgICAgICAgIGlzIHJlcGxhY2VkIGJ5IHRoZSBmZWF0dXJlIG5hbWUgKGUuZy4sICJmZWF0dXJlOmV4Y2VwdCIsICJmZWF0dXJlOnNldCIsIAogICAgICAgICAgIGV0Yy4pLiAgIExhbmd1YWdlIG1vZHVsZXMgY2FuIHRoZW4gbG9vayBmb3IgdGhlIGZlYXR1cmVzIHVzaW5nIAogICAgICAgICAgIGEgc2ltcGxlIGF0dHJpYnV0ZSBsb29rdXAuCgogICAgICAgICAgICVmZWF0dXJlIGlzIGludGVuZGVkIHRvIGJlIGEgcmVwbGFjZW1lbnQgZm9yIGEgbnVtYmVyIG9mCiAgICAgICAgICAgb2xkZXIgU1dJRyBkaXJlY3RpdmVzIGluY2x1ZGluZyAlZXhjZXB0IGFuZCBzcGVjaWFsaXplZAogICAgICAgICAgIHByYWdtYXMuIEl0IGlzIG1vcmUgcG93ZXJmdWwgKGR1ZSB0byBpdHMgcGFyYW1ldGVyaXplZAogICAgICAgICAgIG5hbWUgbWF0Y2hpbmcpIGFuZCBpdCBwcm92aWRlcyB2ZXJ5IHByZWNpc2UgY29udHJvbCBvdmVyCiAgICAgICAgICAgaG93IGN1c3RvbWl6YXRpb24gZmVhdHVyZXMgYXJlIGF0dGFjaGVkIHRvIGluZGl2aWR1YWwKICAgICAgICAgICBkZWNsYXJhdGlvbnMuICAgVGhlcmUgYXJlIGZ1dHVyZSBleHBhbnNpb24gcGxhbnMgdGhhdCB3aWxsCiAgICAgICAgICAgYnVpbGQgdXBvbiB0aGlzIGNhcGFiaWxpdHkgYXMgd2VsbC4KCiAgICAgICAgICAgSXQncyBub3QgY2VydGFpbiB0aGF0ICVmZWF0dXJlIHdpbGwgZXZlciBiZSB1c2VkIGRpcmVjdGx5CiAgICAgICAgICAgYnkgU1dJRyB1c2Vycy4gIEluc3RlYWQsIGl0IG1heSBiZSBhIGxvdy1sZXZlbCBwcmltaXRpdmUKICAgICAgICAgICB0aGF0IGlzIHVzZWQgaW4gaGlnaC1sZXZlbCBtYWNybyBkZWZpbml0aW9ucy4gIEZvciBpbnN0YW5jZSwKICAgICAgICAgICB0byBzdXBwb3J0IHByb3BlcnRpZXMsIHlvdSBtaWdodCBkZWZpbmUgYSBtYWNybyBsaWtlIHRoaXM6CgogICAgICAgICAgICVkZWZpbmUgJXByb3BlcnR5KG5hbWUsIHNldGYsIGdldGYpCiAgICAgICAgICAgJWZlYXR1cmUoInNldCIpIHNldGYgI25hbWU7CiAgICAgICAgICAgJWZlYXR1cmUoImdldCIpIGdldGYgI25hbWU7CiAgICAgICAgICAgJWVuZGRlZgoKICAgICAgICAgICBXaGljaCBhbGxvd3MgYSB1c2VyIHRvIHNwZWNpZnkgdGhpbmdzIGxpa2UgdGhpczoKCiAgICAgICAgICAgJXByb3BlcnR5KHAsIGdldF9wLCBzZXRfcCk7CgogICAgICAgICAgIGNsYXNzIEJsYWggewogICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICBpbnQgIGdldF9wKCk7CiAgICAgICAgICAgICAgdm9pZCBzZXRfcChpbnQpOwogICAgICAgICAgIH07CgogICAgICAgICAgICoqKiBFWFBFUklNRU5UQUwgTkVXIEZFQVRVUkUgKioqCiAgCjExLzI0LzIwMDE6YmVhemxleQogICAgICAgICAgIFRoZSBUY2wgbW9kdWxlIGhhcyBiZWVuIGV4cGFuZGVkIHdpdGggc29tZSBuZXcgZmVhdHVyZXMgZm9yCiAgICAgICAgICAgbWFuYWdpbmcgb2JqZWN0IG93bmVyc2hpcC4gIEZvciBleGFtcGxlOgogICAgICAgICAKICAgICAgICAgICAgICAgIHNldCBjIFtDaXJjbGUgLWFyZ3MgMjBdCiAgICAgICAgICAgICAgICAkYyBhcmVhICAgICAgICAgICAgICMgSW52b2tlIGEgbWV0aG9kCiAgICAgICAgICAgICAgICAkYyAtZGlzb3duICAgICAgICAgICMgUmVsZWFzZXMgb3duZXJzaGlwIG9mIHRoZSBvYmplY3QKICAgICAgICAgICAgICAgICRjIC1hY3F1aXJlICAgICAgICAgIyBBY3F1aXJlcyBvd25lcnNoaXAgb2YgdGhlIG9iamVjdAoKICAgICAgICAgICBJZiBUY2wgb3ducyB0aGUgb2JqZWN0LCBpdHMgZGVzdHJ1Y3RvciBpcyBpbnZva2VkIHdoZW4gdGhlIAogICAgICAgICAgIGNvcnJlc3BvbmRpbmcgb2JqZWN0IGNvbW1hbmQgaXMgZGVsZXRlZCBpbiBUY2wuICAKCiAgICAgICAgICAgVG8gc2ltcGxpZnkgdGhlIGRlc3RydWN0aW9uIG9mIG9iamVjdHMsIHRoZSBmb2xsb3dpbmcgc3ludGF4CiAgICAgICAgICAgY2FuIGJlIHVzZWQ6CgogICAgICAgICAgICAgICAgJGMgLWRlbGV0ZSAgICAgICAgICMgRGVsZXRlIGFuIG9iamVjdAoKICAgICAgICAgICBUaGlzIGlzIGFuIGFsdGVybmF0aXZlIGZvciB0aGUgbW9yZSBvYnNjdXJlIHZhcmlhbnQgb2YgCgogICAgICAgICAgICAgICAgcmVuYW1lICRjIHt9CgogICAgICAgICAgIFRoZXNlIGZlYXR1cmVzIGFsc28gYWRkIGZ1bmN0aW9uYWxpdHkgYXQgdGhlIEMgQVBJIGxldmVsLgogICAgICAgICAgIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIG1hbmFnZSBvd25lcnNoaXAgZnJvbSBDIGFuZAogICAgICAgICAgIGNhbiBiZSB1c2VkIGluIHR5cGVtYXBzLgoKICAgICAgICAgICAgICAgIFNXSUdfQWNxdWlyZSh2b2lkICpwdHIpOwogICAgICAgICAgICAgICAgU1dJR19EaXNvd24odm9pZCAqcHRyKTsKCiAgICAgICAgICAgQSBuZXcgZnVuY3Rpb24gZm9yIGNvbnN0cnVjdGluZyBpbnN0YW5jZXMgaXMgYWxzbyBhdmFpbGFibGU6CgogICAgICAgICAgICAgICAgVGNsX09iaiAqCiAgICAgICAgICAgICAgICBTV0lHX05ld0luc3RhbmNlT2JqKFRjbF9JbnRlcnAgKmludGVycCwgdm9pZCAqcHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2lnX3R5cGVfaW5mbyAqdHlwZSwgaW50IG93bik7CgogICAgICAgICAgIFdoZW4gdXNlZCBpbiBhIHR5cGVtYXAsIHRoaXMgY3JlYXRlcyBhIHBvaW50ZXIgb2JqZWN0IGFuZAogICAgICAgICAgIGFuIGludGVycHJldGVyIGNvbW1hbmQgdGhhdCBjYW4gYmUgdXNlZCB0byBpc3N1ZSBtZXRob2RzIGFuZAogICAgICAgICAgIGFjY2VzcyBhdHRyaWJ1dGVzIGFzIHNob3duIGFib3ZlLgogICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKICAgICAgICAgICAKMTEvMjMvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgQWxsIFB5dGhvbi1yZWxhdGVkICVwcmFnbWEgb3BlcmF0aW9ucyBoYXZlIGJlZW4gZWxpbWluYXRlZC4KICAgICAgICAgICBNb3N0IG9mIHRoZXNlIHdlcmUgd3JpdHRlbiBmb3Igb2xkZXIgU1dJRyB2ZXJzaW9ucyBpbiBvcmRlciB0bwogICAgICAgICAgIGNvbXBlbnNhdGUgZm9yIGxpbWl0YXRpb25zIGluIGVhcmxpZXIgcmVsZWFzZXMuICBJbiBhbiBlZmZvcnQKICAgICAgICAgICB0byByZWR1Y2UgdGhlIGFtb3VudCBvZiBjb2RlLWNsdXR0ZXIgYW5kIHBvdGVudGlhbCBmb3IgZXJyb3JzLAogICAgICAgICAgIGl0IGlzIGVhc2llciB0byBzaW1wbHkgZWxpbWluYXRlIHRoZSBwcmFnbWFzIGFuZCB0byBzdGFydCBvdmVyCiAgICAgICAgICAgKGlmIG5lZWRlZCkuICBUbyBiZSBob25lc3QsIEknbSBub3QgZXZlbiBzdXJlIHRoZSBwcmFnbWFzCiAgICAgICAgICAgd29ya2VkIGluIDEuMy45IGFuZCByZWNlbnQgcmVsZWFzZXMuCgogICAgICAgICAgIE5vdGU6IElmIHlvdSBuZWVkIHRvIGluc2VydCBjb2RlIGludG8gdGhlIHNoYWRvdyBjbGFzcyBmaWxlCiAgICAgICAgICAgY3JlYXRlZCBieSBTV0lHLCBzaW1wbHkgdXNlIHRoZSAlc2hhZG93IGRpcmVjdGl2ZSBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICVzaGFkb3cgJXsKICAgICAgICAgICAgICBkZWYgc29tZV9weXRob25fY29kZSgpOiAgICAgICAgIAogICAgICAgICAgICAgICAgICBwcmludCAiYmxhaCEiCiAgICAgICAgICAgICAgJX0KCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoxMS8yMi8yMDAxOmJlYXpsZXkKICAgICAgICAgICBTd2VlcGluZyBjaGFuZ2VzIHRvIHRoZSB3YXkgaW4gd2hpY2ggdGhlIFB5dGhvbiBtb2R1bGUgaGFuZGxlcwogICAgICAgICAgIHNoYWRvdyBjbGFzc2VzLiAgIEluIGVhcmx5IGltcGxlbWVudGF0aW9ucywgc2hhZG93IGNsYXNzZXMgd2VyZQogICAgICAgICAgIG1lcmVseSBQeXRob24gd3JhcHBlcnMgYXJvdW5kIHR5cGVkIHBvaW50ZXIgb2JqZWN0cy4gSG93ZXZlciwgCiAgICAgICAgICAgc29tZSB1c2VycyBhY3R1YWxseSB3YW50ZWQgdG8gcmVjZWl2ZSB0aGUgc2hhZG93IGNsYXNzIG9iamVjdCBpbiBDLgogICAgICAgICAgIFRvIGFjY29tb2RhdGUgdGhpcywgdGhlIGRlcmVmZXJlbmNpbmcgb2YgdGhlICJ0aGlzIiBwb2ludGVyIGluCiAgICAgICAgICAgYSBzaGFkb3cgY2xhc3Mgd2FzIG1vdmVkIHRvIEMgYXMgZGVzY3JpYmVkIGluIENIQU5HRVMgWzgvOC85OV0uCiAgICAgICAgICAgSG93ZXZlciwgdGhlIHByb2Nlc3Mgb2YgcmV0dXJuaW5nIHBvaW50ZXJzIHRvIFB5dGhvbiB3YXMgc3RpbGwKICAgICAgICAgICBzb21ld2hhdCBwcm9ibGVtYXRpYy4gIFNwZWNpZmljYWxseSwgc2hhZG93IGNsYXNzZXMgbmV2ZXIgd29ya2VkCiAgICAgICAgICAgaW4gc2l0dWF0aW9ucyBzdWNoIGFzIHRoZXNlOgoKICAgICAgICAgICAgIC0gICBVc2Ugb2YgYW55IGtpbmQgb2Ygb3V0cHV0IHR5cGVtYXAgKCdvdXQnIG9yICdhcmdvdXQnKQogICAgICAgICAgICAgLSAgIEdsb2JhbCB2YXJpYWJsZXMgKGJyb2tlbiBhcyBmYXIgYXMgSSBjYW4gdGVsbCkuCgogICAgICAgICAgIEluIHRoZSBwYXN0LCBzb21lIHVzZXJzIGhhdmUgZGVhbHQgd2l0aCB0aGlzIGJ5IG1hbnVhbGx5IHRyeWluZwogICAgICAgICAgIHRvIGNyZWF0ZSBzaGFkb3cgY2xhc3Mgb2JqZWN0cyB0aGVtc2VsdmVzIGZyb20gQy9DKysuICBIb3dldmVyLAogICAgICAgICAgIHRoaXMgd2FzIGRpZmZpY3VsdCBiZWNhdXNlIHRoZSBDIHdyYXBwZXJzIGRvbid0IHJlYWxseSBrbm93IGhvdwogICAgICAgICAgIHRvIGdldCBhY2Nlc3MgdG8gdGhlIGNvcnJlc3BvbmRpbmcgUHl0aG9uIGNsYXNzLgoKICAgICAgICAgICBUaGUgUHl0aG9uIG1vZHVsZSBoYXMgbm93IGJlZW4gbW9kaWZpZWQgdG8gYXV0b21hdGljYWxseSBhdHRhY2gKICAgICAgICAgICBzaGFkb3cgY2xhc3Mgb2JqZWN0cyB0byBwb2ludGVycyB3aGVuIHRoZXkgYXJlIHJldHVybmVkIHRvIAogICAgICAgICAgIFB5dGhvbi4gICBUaGlzIHByb2Nlc3Mgb2NjdXJzIGluIHRoZSBmdW5jdGlvbiBTV0lHX05ld1BvaW50ZXJPYmooKQogICAgICAgICAgIHNvIHRoZSBwcm9jZXNzIGlzIGNvbXBsZXRlbHkgdHJhbnNwYXJlbnQgdG8gdXNlcnMuICAgIEFzIGEgcmVzdWx0LAogICAgICAgICAgIHNoYWRvdyBjbGFzc2VzIGFyZSBub3cgbW9yZSBzZWFtbGVzc2x5IGludGVncmF0ZWQgd2l0aCB0eXBlbWFwcwogICAgICAgICAgIGFuZCBvdGhlciBmZWF0dXJlcyBvZiBTV0lHLgoKICAgICAgICAgICBUaGlzIGNoYW5nZSBtYXkgaW50cm9kdWNlIGEgbnVtYmVyIG9mIGluY29tcGF0aWJpbGl0aWVzLiAgVGhlCiAgICAgICAgICAgU1dJR19OZXdQb2ludGVyT2JqKCkgbm93IHRha2VzIGFuIGV4dHJhIHBhcmFtZXRlciAib3duIiB0byAKICAgICAgICAgICBpbmRpY2F0ZSBvYmplY3Qgb3duZXJzaGlwLiAgIFRoaXMgY2FuIGJlIHVzZWQgdG8gcmV0dXJuIGEgcG9pbnRlcgogICAgICAgICAgIHRvIFB5dGhvbiB0aGF0IFB5dGhvbiBzaG91bGQgZGVzdHJveS4gICBJbiBhZGRpdGlvbiwgb2xkZXIgY29kZQogICAgICAgICAgIHRoYXQgdHJpZXMgdG8gbWFudWFsbHkgY29uc3RydWN0IHNoYWRvdyBjbGFzcyBvYmplY3RzIG9yIHdoaWNoCiAgICAgICAgICAgZXhwZWN0cyBiYXJlIHBvaW50ZXJzIG1heSBicmVhay0tLXN1Y2ggcG9pbnRlcnMgbWF5IGFscmVhZHkgYmUKICAgICAgICAgICBlbmNhcHN1bGF0ZWQgYnkgYSBzaGFkb3cgY2xhc3MuCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoxMS8yMC8yMDAxOmJlYXpsZXkKICAgICAgICAgICBNb2RpZmllZCB0aGUgJWluc2VydCBkaXJlY3RpdmUgdG8gYWNjZXB0IHNpbmdsZSBicmFjZXMgeyAuLi4gfS4KICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAlaW5zZXJ0KCJoZWFkZXIiKSB7CiAgICAgICAgICAgICAgICAgICAuLi4gc29tZSBjb2RlIC4uLgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICBUaGlzIHdvcmtzIGV4YWN0bHkgbGlrZSAleyAuLi4gJX0gZXhjZXB0IHRoYXQgdGhlIGNvZGUgaW4gdGhlCiAgICAgICAgICAgYnJhY2VzIGlzIHByb2Nlc3NlZCB1c2luZyB0aGUgcHJlcHJvY2Vzc29yLiAgIFRoaXMgY2FuIGJlIHVzZWZ1bAogICAgICAgICAgIGluIGNlcnRhaW4gY29udGV4dHMgc3VjaCBhcyBsb3ctbGV2ZWwgY29kZSBnZW5lcmF0aW9uIGluIAogICAgICAgICAgIGxhbmd1YWdlIG1vZHVsZXMuCiAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgogICAgICAgICAgIAoxMS8yMC8yMDAxOmJlYXpsZXkKICAgICAgICAgICBDb21tYW5kIGxpbmUgb3B0aW9ucyBhcmUgbm93IHRyYW5zbGF0ZWQgaW50byBwcmVwcm9jZXNzb3IKICAgICAgICAgICBzeW1ib2xzLiAgRm9yIGV4YW1wbGU6CgkKICAgICAgICAgICAgICAuL3N3aWcgLXB5dGhvbiAtc2hhZG93IC1tb2R1bGUgYmxhaCBpbnRlcmZhY2UuaQoKICAgICAgICAgICBDcmVhdGVzIHRoZSBzeW1ib2xzOgoKICAgICAgICAgICAgICBTV0lHT1BUX1BZVEhPTiAxCiAgICAgICAgICAgICAgU1dJR09QVF9TSEFET1cgMQogICAgICAgICAgICAgIFNXSUdPUFRfTU9EVUxFIGJsYWgKICAgICAgICAgICAgICAKICAgICAgICAgICBNb2R1bGVzIGNhbiBsb29rIGZvciB0aGVzZSBzeW1ib2xzIHRvIGFsdGVyIHRoZWlyIGNvZGUgZ2VuZXJhdGlvbgogICAgICAgICAgIGlmIG5lZWRlZC4KICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCiAgICAgICAgICAgICAKMTEvMjAvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgTWFzc2l2ZSBvdmVyaGF1bCBvZiB0aGUgUGVybDUgbW9kdWxlLiAgQSBsb3Qgb2YgY29kZSBnZW5lcmF0aW9uIGlzCiAgICAgICAgICAgbm93IGRyaXZlbiBieSB0YWJsZXMgYW5kIHR5cGVtYXBzLiAgIFRoZSBnZW5lcmF0ZWQgd3JhcHBlciBjb2RlIAogICAgICAgICAgIGFsc28gbWFrZXMgdXNlIG9mIHRhYmxlcyB0byBpbnN0YWxsIGNvbnN0YW50cywgdmFyaWFibGVzLCBhbmQKICAgICAgICAgICBmdW5jdGlvbnMgaW5zdGVhZCBvZiBpbmxpbmluZyBhIGJ1bmNoIG9mIHByb2NlZHVyZSBjYWxscy4gIFRoZQogICAgICAgICAgIHNlcGFyYXRlIHZhcmlhYmxlIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uIGlzIGdvbmUuICAgTW9zdAogICAgICAgICAgIGNvZGUgZ2VuZXJhdGlvbiBpcyBjb250cm9sbGVkIHZpYSB0aGUgcGVybDUuc3dnIGZpbGUgaW4gdGhlCiAgICAgICAgICAgbGlicmFyeS4KICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKICAgICAgICAgICAKMTEvMTMvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgQWRkZWQgcGFyc2luZyBzdXBwb3J0IGZvciB0aGUgQysrIHR5cGVuYW1lIGtleXdvcmQuICBQcmltYXJpbHkgdGhpcwogICAgICAgICAgIGlzIGFkZGVkIHRvIGJldHRlciBzdXBwb3J0IHRlbXBsYXRlcy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IHZvaWQgIGJsYWgoQyYgdikgewogICAgICAgICAgICAgICAgIHR5cGVuYW1lIEM6Oml0ZXJhdG9yIGkgPSB2LmJlZ2luKCk7CiAgICAgICAgICAgICB9CgogICAgICAgICAgIE5vdGU6IHR5cGVuYW1lIGlzIHN1cHBvcnRlZCBpbiB0aGUgcGFyc2VyIGluIHRoZSBzYW1lIHdheSBhcyAnc3RydWN0JwogICAgICAgICAgIG9yICdjbGFzcycuICBZb3UgcHJvYmFibHkgc2hvdWxkbid0IHVzZSBpdCBhbnl3aGVyZSBleGNlcHQgaW4gdGVtcGxhdGVzLgogICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjExLzExLzIwMDE6YmVhemxleQogICAgICAgICAgIE1hc3NpdmUgb3ZlcmhhdWwgb2YgdGhlIGxhbmd1YWdlIG1vZHVsZSBBUEkuICAgTW9zdCBmdW5jdGlvbnMgbm93CiAgICAgICAgICAgdXNlIGEgY29tbW9uLCB2ZXJ5IHNpbXBsZSwgIEFQSS4gICBUaGVyZSBhcmUgYWxzbyBhIG51bWJlciBvZgogICAgICAgICAgIGludGVyZXN0aW5nIHNlbWFudGljIHNpZGUtZWZmZWN0cyBvZiBob3cgY29kZSBpcyBhY3R1YWxseSBnZW5lcmF0ZWQuCiAgICAgICAgICAgRGV0YWlscyB3aWxsIGJlIGZvcnRoY29taW5nIGluIERvYy9NYW51YWwvRXh0ZW5kaW5nLmh0bWwuCgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKiBMYW5ndWFnZSBtb2R1bGVzIHdyaXR0ZW4gZm9yCiAgICAgICAgICAgcHJldmlvdXMgdmVyc2lvbnMgb2YgU1dJRyB3aWxsIG5vIGxvbmdlciB3b3JrLAoKMTEvMTAvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgYSB2ZXJ5IHN1YnRsZSBidWcgZHVlIHRvIHVubmFtZWQgY2xhc3Mgd3JhcHBpbmcuIEZvciBleGFtcGxlLCBpZgogICAgICAgICAgIHlvdSBkaWQgdGhpcwoKICAgICAgICAgICAgICB0eXBlZGVmIHN0cnVjdCB7CiAgICAgICAgICAgICAgICAgIGludCB4LHk7CiAgICAgICAgICAgICAgfSBnZFBvaW50LCAqZ2RQb2ludFB0cjsKCiAgICAgICAgICAgICAgdm9pZCBmb28oZ2RQb2ludFB0ciB4KTsKCiAgICAgICAgICAgVGhlbiB0aGUgZm9vIGZ1bmN0aW9uIHdvdWxkIGdldCBhIHR5cGUtZXJyb3IuICAgVGhlIHByb2JsZW0gaGFzCiAgICAgICAgICAgdG8gZG8gd2l0aCBpbnRlcm5hbCB0eXBlZGVmIGhhbmRsaW5nIGFuZCB0aGUgZmFjdCB0aGF0IHRoZSB0eXBlZGVmCiAgICAgICAgICAgZGVjbGFyYXRpb25zIGFmdGVyIHRoZSBzdHJ1Y3QgYXBwZWFyIGxhdGVyIGluIHRoZSBwYXJzZSB0cmVlLgogICAgICAgICAgIEl0IHNob3VsZCB3b3JrIG5vdy4gIFByb2JsZW0gcmVwb3J0ZWQgYnkgVmluIEpvdmFub3ZpYy4KCjExLzA5LzIwMDE6YmVhemxleQogICAgICAgICAgIFN1YnRsZSBjaGFuZ2UgdG8gIm91dCIgdHlwZW1hcHMgKGFuZCByZWxhdGVkIHZhcmlhdGlvbnMpLiAgVGhlIG5hbWUKICAgICAgICAgICB0aGF0IGlzIGF0dGFjaGVkIHRvIHRoZSB0eXBlbWFwIGlzIG5vdyB0aGUgcmF3IEMgaWRlbnRpZmllciB0aGF0CiAgICAgICAgICAgYXBwZWFycyBvbiBhIGRlY2xhcmF0aW9uLiAgVGhpcyBjaGFuZ2VzIHRoZSBiZWhhdmlvciBvZgogICAgICAgICAgIG1lbWJlciBmdW5jdGlvbnMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICV0eXBlbWFwKG91dCkgaW50IGZvbyB7CiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICBjbGFzcyBCbGFoIHsKICAgICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgIGludCBmb28oKTsgICAgLy8gdHlwZW1hcCBnZXRzIGFwcGxpZWQKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICBQcmV2aW91cyB2ZXJzaW9ucyBuZXZlciByZWFsbHkgc3BlY2lmaWVkIGhvdyB0aGlzIHdhcyBzdXBwb3NlZCB0bwogICAgICAgICAgIHdvcmsuICBJbiBTV0lHMS4xLCB5b3UgY291bGQgcHJvYmFibHkgd3JpdGUgYSB0eXBlbWFwIGZvciB0aGUKICAgICAgICAgICB3cmFwcGVyIG5hbWUgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgICV0eXBlbWFwKG91dCkgaW50IEJsYWhfZm9vIHsgLi4uIH0KCiAgICAgICAgICAgSG93ZXZlciwgdGhpcyBvbGQgYmVoYXZpb3IgaXMgbm93IHdpdGhkcmF3biBhbmQgbm90IHN1cHBvcnRlZC4gCiAgICAgICAgICAgSnVzdCB1c2UgdGhlIG1lbWJlciBuYW1lIHdpdGhvdXQgYW55IHNvcnQgb2Ygc3BlY2lhbCBwcmVmaXguCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoxMS8wNi8yMDAxOmJlYXpsZXkKICAgICAgICAgICBDaGFuZ2VzIHRvIFRjbCBtb2R1bGUgaW5pdGlhbGl6YXRpb246CgogICAgICAgICAgICgxKSBTV0lHIG5vdyBhdXRvbWF0aWNhbGx5IGluY2x1ZGVzIHRoZSBjb2RlIG5lZWRlZCB0byB3b3JrIHdpdGgKICAgICAgICAgICAgICAgIFRjbCBzdHVicy4gIFNpbXBseSBjb21waWxlIHdpdGggLURVU0VfVENMX1NUVUJTLgoKICAgICAgICAgICAoMikgU1dJRyBub3cgYXV0b21hdGljYWxseSBjYWxscyBUY2xfUGtnUHJvdmlkZSB0byByZWdpc3RlcgogICAgICAgICAgICAgICBhIHBhY2thZ2UgbmFtZS4gIFRoZSBwYWNrYWdlIG5hbWUgaXMgdGhlIHNhbWUgYXMgdGhlIG5hbWUKICAgICAgICAgICAgICAgc3BlY2lmaWVkIHdpdGggdGhlICVtb2R1bGUgZGlyZWN0aXZlLiAgVGhlIHZlcnNpb24gbnVtYmVyIGlzCiAgICAgICAgICAgICAgIHNldCB0byAiMC4wIiBieSBkZWZhdWx0LiAgVG8gY2hhbmdlIHRoZSB2ZXJzaW9uIG51bWJlciwgdXNlCiAgICAgICAgICAgICAgIHN3aWcgLXBrZ3ZlcnNpb24gMS4yIGludGVyZmFjZS5pLgoKICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKICAgICAgICAgICBNb2R1bGVzIHRoYXQgcHJvdmlkZWQgc3R1YnMgYW5kIFRjbF9Qa2dQcm92aWRlIG9uIHRoZWlyIG93biBtaWdodAogICAgICAgICAgIGJyZWFrLiAgU2ltcGx5IHJlbW92ZSB0aGF0IGNvZGUuCgoxMS8wNS8yMDAxOmJlYXpsZXkKICAgICAgICAgICBDaGFuZ2VkIGNvZGUgZ2VuZXJhdGlvbiBvZiBjb25zdGFudHMgaW4gdGhlIFRjbCBtb2R1bGUuICBDb25zdGFudHMKICAgICAgICAgICBhcmUgbm93IHN0b3JlZCBpbiBhIGxhcmdlIHRhYmxlIHRoYXQgZ2V0IGluc3RhbGxlZCBhdCBtb2R1bGUgc3RhcnR1cC4KICAgICAgICAgICBUaGVyZSBhcmUgYWxzbyBubyBsb25nZXIgYW55IHN0YXRpYyB2YXJpYWJsZXMgc28gaXQgc2hvdWxkIGdlbmVyYXRlCiAgICAgICAgICAgc29tZXdoYXQgbGVzcyBjb2RlLgoKMTEvMDQvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgVGhlICJjb25zdCIgdHlwZW1hcCBoYXMgYmVlbiByZW5hbWVkIHRvICJjb25zdGFudCIgaW4gbWFueSBsYW5ndWFnZQogICAgICAgICAgIG1vZHVsZXMuICAiY29uc3QiIGlzIGEgQyBrZXl3b3JkIHdoaWNoIG1hZGUgdGhlIGhhbmRsaW5nIG9mIHRoZSB0eXBlbWFwCiAgICAgICAgICAgZGlyZWN0aXZlIHNvbWV3aGF0IGF3a3dhcmQgaW4gdGhlIHBhcnNlci4KICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjExLzA0LzIwMDE6YmVhemxleQogICAgICAgICAgICV0eXBlbWFwIGRpcmVjdGl2ZSBjYW4gbm93IGFjY2VwdCBuZWFybHkgYXJiaXRyYXJ5IGtleXdvcmQgcGFyYW1ldGVycy4KICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgJXR5cGVtYXAoaW4scGFyc2U9ImkiLGRvYz0iaW50ZWdlciIpIGludCAiLi4uIjsKCiAgICAgICAgICAgVGhlIHB1cnBvc2Ugb2YgdGhlIGtleXdvcmQgcGFyYW1ldGVycyBpcyB0byBzdXBwbHkgY29kZSBnZW5lcmF0aW9uCiAgICAgICAgICAgaGludHMgdG8gdGhlIHRhcmdldCBsYW5ndWFnZSBtb2R1bGUuICAgVGhlIGludGVwcmV0YXRpb24gb2YgdGhlCiAgICAgICAgICAgcGFyYW1ldGVycyBpcyBsYW5ndWFnZSBzcGVjaWZpYy4KICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgoxMS8wNC8yMDAxOmJlYXpsZXkKICAgICAgICAgICBTbGlnaHQgc2VtYW50aWMgY2hhbmdlIHRvIGludGVybmFsIGNhbGwvcmV0dXJuIGJ5IHZhbHVlIGhhbmRsaW5nLgogICAgICAgICAgIEluIHByZXZpb3VzIHZlcnNpb25zIG9mIFNXSUcsIGNhbGwtYnktdmFsdWUgd2FzIHRyYW5zbGF0ZWQKICAgICAgICAgICBpbnRvIHBvaW50ZXJzLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICBkb3VibGUgZG90X3Byb2R1Y3QoVmVjdG9yIGEsIFZlY3RvciBiKTsKCiAgICAgICAgICAgdHVybmVkIGludG8gdGhpczoKCiAgICAgICAgICAgICAgIGRvdWJsZSB3cmFwX2RvdF9wcm9kdWN0KFZlY3RvciAqYSwgVmVjdG9yICpiKSB7CiAgICAgICAgICAgICAgICAgIHJldHVybiBkb3RfcHJvZHVjdCgqYSwqYik7CiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgVGhpcyB0cmFuc2xhdGlvbiB3YXMgbm9ybWFsbHkgcGVyZm9ybWVkIGJ5IHRoZSBTV0lHIGNvcmUsIG91dHNpZGUKICAgICAgICAgICBvZiB0aGUgY29udHJvbCBvZiBsYW5ndWFnZSBtb2R1bGVzLiAgSG93ZXZlciwgYSBzaWRlIGVmZmVjdAogICAgICAgICAgIG9mIHRoaXMgd2FzIGEgbG90IG9mIGJpemFycmUgdHlwZW1hcCBiZWhhdmlvci4gICBGb3IgZXhhbXBsZSwKICAgICAgICAgICBpZiB5b3UgZGlkIHNvbWV0aGluZyBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIGludDMyIHsKICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgWW91IHdvdWxkIGZpbmQgdGhhdCBpbnQzMiB3YXMgdHJhbnNmb3JtZWQgaW50byBhIHBvaW50ZXIgZXZlcnl3aGVyZSEKICAgICAgICAgICAobmVlZGxlc3MgdG8gc2F5LCBzdWNoIGJlaGF2aW9yIGlzIHVuZXhwZWN0ZWQgYW5kIHF1aXRlIGF3a3dhcmQgdG8KICAgICAgICAgICBkZWFsIHdpdGgpLiAgVG8gbWFrZSBtYXR0ZXJzIHdvcnNlLCBpZiBhIHR5cGVkZWYgd2FzIGFsc28gdXNlZCwKICAgICAgICAgICB0aGUgcG9pbnRlciBiZWhhdmlvciBzdWRkZW5seSBkaXNhcHBlYXJlZC4KCiAgICAgICAgICAgVG8gZml4IHRoaXMsIHRoZSBwb2ludGVyIHRyYW5zZm9ybWF0aW9uIGlzIG5vdyBwdXNoZWQgdG8gdGhlCiAgICAgICAgICAgbGFuZ3VhZ2UgbW9kdWxlcy4gICBUaGlzIHByb2R1Y2VzIHdyYXBwZXJzIHRoYXQgbG9vayByb3VnaGx5CiAgICAgICAgICAgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgZG91YmxlIHdyYXBfZG90X3Byb2R1Y3QoVmVjdG9yICphLCBWZWN0b3IgKmIpIHsKICAgICAgICAgICAgICAgICAgVmVjdG9yIGFyZzEgPSAqYTsKICAgICAgICAgICAgICAgICAgVmVjdG9yIGFyZzIgPSAqYjsKICAgICAgICAgICAgICAgICAgcmV0dXJuIGRvdF9wcm9kdWN0KGFyZzEsYXJnMik7CiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgVGhpcyBjaGFuZ2UgYWxzbyBtYWtlcyBpdCBlYXN5IHRvIGRlZmluZSB0eXBlbWFwcyBmb3IKICAgICAgICAgICBhcmJpdHJhcnkgdW5kZWZpbmVkIHR5cGVzLiAgRm9yIGV4YW1wbGUsIHlvdSBjYW4gZG8gdGhpcyAoYW5kIGl0CiAgICAgICAgICAgd2lsbCB3b3JrIHJlZ2FyZGxlc3Mgd2hhdCBpbnQzMiBpcyk6CgogICAgICAgICAgICAgICAldHlwZW1hcChpbikgaW50MzIgewogICAgICAgICAgICAgICAgICAkMSA9IChpbnQzMikgUHlJbnRfQXNMb25nKCRpbnB1dCk7CiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTUNPTVBBVElCSUxJVFkgKioqCiAgICAgICAgICAgVGhpcyBjaGFuZ2UgbWF5IGJyZWFrIGNhbGwvcmV0dXJuIGJ5IHZhbHVlIGNvZGUgZ2VuZXJhdGlvbiBpbgogICAgICAgICAgIHNvbWUgbGFuZ3VhZ2UgbW9kdWxlcy4KCjExLzAzLzIwMDE6YmVhemxleQogICAgICAgICAgIENoYW5nZWQgdGhlIG5hbWUgb2YgdGhlIGRlZmF1bHQgdHlwZW1hcHMgdG8gdGhlIGZvbGxvd2luZzoKCiAgICAgICAgICAgICAgICV0eXBlbWFwKCkgU1dJR1RZUEUgIHsgCiAgICAgICAgICAgICAgICAgICAuLi4gYW4gb2JqZWN0IC4uLgogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICV0eXBlbWFwKCkgU1dJR1RZUEUgKiB7CiAgICAgICAgICAgICAgICAgICAuLi4gYSBwb2ludGVyIC4uLgogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICV0eXBlbWFwKCkgU1dJR1RZUEUgJiB7CiAgICAgICAgICAgICAgICAgICAuLi4gYSByZWZlcmVuY2UgLi4uCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgJXR5cGVtYXAoKSBTV0lHVFlQRSBbXSB7CiAgICAgICAgICAgICAgICAgICAuLi4gYW4gYXJyYXkgLi4uCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgJXR5cGVtYXAoKSBlbnVtIFNXSUdUWVBFIHsKICAgICAgICAgICAgICAgICAgLi4uIGFuIGVudW0gdmFsdWUgLi4uCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgJXR5cGVtYXAoKSBTV0lHVFlQRSAoQ0xBU1M6OiopIHsKICAgICAgICAgICAgICAgICAgIC4uLiBwb2ludGVyIHRvIG1lbWJlciAuLi4KICAgICAgICAgICAgICAgfQoKCiAgICAgICAgICAgVGhlc2UgdHlwZXMgYXJlIHVzZWQgYXMgdGhlIGRlZmF1bHQgZm9yIGFsbCB0eXBlcyB0aGF0IGRvbid0IG1hdGNoCiAgICAgICAgICAgYW55dGhpbmcgZWxzZS4gIFNlZSBDSEFOR0VTIGxvZyBlbnRyeSBmb3IgOC8yNy8yMDAwIGZvciB0aGUKICAgICAgICAgICBvbGQgYmVoYXZpb3IuICBUaGUgcm9sZSBvZiB0aGVzZSB0eXBlcyBpcyBhbHNvIGRlc2NyaWJlZCBpbiAKICAgICAgICAgICBEb2MvTWFudWFsL1R5cGVtYXBzLmh0bWwKCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCiAgICAgICAgICAKMTAvMjUvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgTW9kaWZpZWQgR3VpbGUgYW5kIE16c2NoZW1lIG1vZHVsZXMgdG8gc3VwcG9ydAogICAgICAgICAgIG11bHRpLWFyZ3VtZW50IHR5cGVtYXBzLgoKMTAvMjUvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCiAgICAgICAgICAgW0phdmFdIEZpeCB0byBoYW5kbGUgcG9pbnRlcnMgdG8gYXJyYXlzLgoKMTAvMjQvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgRGVmaW5pbmcgYSB0eXBlbWFwIHJ1bGUgZm9yIGVudW0gU1dJR0VOVU0gY2FuIG5vdyBiZSB1c2VkCiAgICAgICAgICAgdG8gZGVmaW5lIGRlZmF1bHQgYmVoYXZpb3IgZm9yIGVudW0gdmFyaWFibGVzLgoKMTAvMjIvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgUnVieSBtb2R1bGUgbW9kaWZpZWQgdG8gc3VwcG9ydCBtdWx0aS1hcmd1bWVudCB0eXBlbWFwcy4KCjEwLzIyLzIwMDE6YmVhemxleQogICAgICAgICAgIFRoZSBSdWJ5IG1vZHVsZSBjYW4gbm93IGhhbmRsZSBmdW5jdGlvbnMgd2l0aCBhbiBhcmJpdHJhcnkKICAgICAgICAgICBudW1iZXIgb2YgYXJndW1lbnRzLiAgUHJldmlvdXMgdmVyc2lvbnMgd2VyZSBsaW1pdGVkIHRvIAogICAgICAgICAgIHRvIGZ1bmN0aW9ucyB3aXRoIG9ubHkgOSBvciAxNiBhcmd1bWVudHMgZGVwZW5kaW5nIG9uCiAgICAgICAgICAgdGhlIHVzZSBvZiBkZWZhdWx0IGFyZ3VtZW50cy4gICBOb3RlOiBmcm9tIHNvbWUgaW5zcGVjdGlvbgogICAgICAgICAgIG9mIHRoZSBSdWJ5IGludGVycHJldGVyIHNvdXJjZSwgdGhlIG5ldyBhcHByb2FjaCBtaWdodCBiZQogICAgICAgICAgIGEgbGl0dGxlIGZhc3RlciBhcyB3ZWxsLgoKMTAvMTgvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgYSBidWcgd2l0aCBmb3J3YXJkIGNsYXNzIGRlY2xhcmF0aW9ucyBhbmQKICAgICAgICAgICB0ZW1wbGF0ZXMuCgogICAgICAgICAgICAgICAgIGNsYXNzIEZvbyA8UyxUPjsKCiAgICAgICAgICAgQnVnIHJlcG9ydGVkIGJ5IElyaW5hIEtvdGxvdmEuCgoxMC8xNi8yMDAxOmJlYXpsZXkKICAgICAgICAgICBTdXBwb3J0IGZvciBtdWx0aXZhbHVlZCB0eXBlbWFwcyBhZGRlZC4gIFRoZSB0eXBlbWFwcwogICAgICAgICAgIGFyZSBzcGVjaWZpZWQgdXNpbmcgdGhlIHN5bnRheCBiZWxvdy4gICBXaXRoaW4gZWFjaAogICAgICAgICAgIHR5cGVtYXAsIHZhcmlhYmxlIHN1YnN0aXR1dGlvbiBpcyBoYW5kbGVkIGFzIGZvbGxvd3M6CgogICAgICAgICAgICAgICV0eXBlbWFwKGluKSAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkgewogICAgICAgICAgICAgICAgICAkYXJnOyAgLy8gVGhlIGlucHV0IG9iamVjdCBpbiB0aGUgdGFyZ2V0IGxhbmd1YWdlCiAgICAgICAgICAgICAgICAgICQxOyAgICAvLyBDIGxvY2FsIHZhcmlhYmxlIGZvciBmaXJzdCBhcmd1bWVudAogICAgICAgICAgICAgICAgICAkMjsgICAgLy8gQyBsb2NhbCB2YXJpYWJsZSBmb3Igc2Vjb25kIGFyZ3VtZW50CgogICAgICAgICAgICAgICAgICAvLyBUaGVzZSB2YXJpYWJsZXMgcmVmZXIgdG8gZWl0aGVyIGFyZ3VtZW50CiAgICAgICAgICAgICAgICAgICQxX3R5cGUsICQxX2x0eXBlLCAkMV9iYXNldHlwZSwgZXRjLi4uICAoYXJnYykKICAgICAgICAgICAgICAgICAgJDJfdHlwZSwgJDJfbHR5cGUsICQyX2Jhc2V0eXBlLCBldGMuLi4gIChhcmd2W10pCgogICAgICAgICAgICAgICAgICAvLyBBcnJheSBkaW1lbnNpb24gb2YgYXJndgogICAgICAgICAgICAgICAgICAkMl9kaW0wCiAgICAgICAgICAgICAgfQoKICAgICAgICAgICBCYXNpY2FsbHkgYW55IHZhcmlhYmxlIHRoYXQgd2FzIGF2YWlsYWJsZSBpbiBub3JtYWwgdHlwZW1hcHMKICAgICAgICAgICBpcyBhdmFpbGFibGUgZm9yIGVpdGhlciBhcmd1bWVudCBieSBwcmVmYWNpbmcgdGhlIHZhcmlhYmxlCiAgICAgICAgICAgbmFtZSBieSAnJG5fJyB3aGVyZSBuIGlzIHRoZSBhcmd1bWVudCBwb3NpdGlvbi4KCiAgICAgICAgICAgTm90ZXM6ICAKICAgICAgICAgICAoMSkgTXVsdGktdmFsdWVkIHR5cGVtYXBzIGNhbiBvbmx5IGJlIGFwcGxpZWQgdG8gYSBzaW5nbGUKICAgICAgICAgICAgICAgb2JqZWN0IGluIHRoZSB0YXJnZXQgc2NyaXB0aW5nIGxhbmd1YWdlLiAgIEZvciBleGFtcGxlLAogICAgICAgICAgICAgICB5b3UgY2FuIHNwbGl0IGEgc3RyaW5nIGludG8gYSAoY2hhciAqLCBpbnQpIHBhaXIgb3IKICAgICAgICAgICAgICAgc3BsaXQgYSBsaXN0IGludG8gYSAoaW50LCBjaGFyIFtdKSBwYWlyLiAgSXQgaXMgbm90CiAgICAgICAgICAgICAgIHBvc3NpYmxlIHRvIG1hcCBtdWx0aXBsZSBvYmplY3RzIHRvIG11bHRpcGxlIGFyZ3VtZW50cy4KCiAgICAgICAgICAgKDIpIFRvIG1haW50YWluIGNvbXBhdGliaWxpdHkgd2l0aCBvbGRlciBTV0lHIHZlcnNpb25zLCB0aGUKICAgICAgICAgICAgICAgdmFyaWFibGVzIHN1Y2ggYXMgJHRhcmdldCBhbmQgJHR5cGUgYXJlIHByZXNlcnZlZCBhbmQKICAgICAgICAgICAgICAgYXJlIG1hcHBlZCBvbnRvIHRoZSBmaXJzdCBhcmd1bWVudCBvbmx5LgoKICAgICAgICAgICAoMykgVGhpcyBzaG91bGQgbm90IGFmZmVjdCBjb21wYXRpYmlsaXR5IHdpdGggb2xkZXIgY29kZS4KICAgICAgICAgICAgICAgTXVsdGktdmFsdWVkIHR5cGVtYXBzIGFyZSBhbiBleHRlbnNpb24gdG8gdHlwZW1hcCBoYW5kbGluZy4KICAgICAgICAgICAgICAgU2luZ2xlIHZhbHVlZCB0eXBlbWFwcyBjYW4gYmUgc3BlY2lmaWVkIGluIHRoZSB1c3VhbAogICAgICAgICAgICAgICB3YXkuCgogICAgICAgICAgIFRoZSBvbGQgJHNvdXJjZSBhbmQgJHRhcmdldCB2YXJpYWJsZXMgYXJlIG9mZmljaWFsbHkKICAgICAgICAgICBkZXByZWNhdGVkLiAgSW5wdXQgdmFyaWFibGVzIGFyZSByZWZlcmVuY2VkIHRocm91Z2gKICAgICAgICAgICAkYXJnJCBhbmQgb3V0cHV0IHZhbHVlcyBhcmUgcmVmZXJlbmNlIHRocm91Z2ggJHJlc3VsdCQuCgogICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjEwLzE2LzIwMDE6YmVhemxleQogICAgICAgICAgIEFkZGVkIHBhcnNpbmcgc3VwcG9ydCBmb3IgbXVsdGl2YWx1ZWQgdHlwZW1hcHMuICBUaGUgc3ludGF4CiAgICAgICAgICAgaXMgYSBsaXR0bGUgZnVua3ksIGJ1dCBoZXJlIGdvZXM6CgogICAgICAgICAgICAgIC8vIERlZmluZSBhIG11bHRpdmFsdWVkIHR5cGVtYXAKICAgICAgICAgICAgICAldHlwZW1hcChpbikgKGludCBhcmdjLCBjaGFyICphcmd2W10pIHsKICAgICAgICAgICAgICAgICAgICAuLi4gdHlwZW1hcCBjb2RlIC4uLgogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgLy8gTXVsdGl2YWx1ZWQgdHlwZW1hcCB3aXRoIGxvY2FscwogICAgICAgICAgICAgICV0eXBlbWFwKGluKSAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkoaW50IHRlbXApIHsKICAgICAgICAgICAgICAgICAgICAuLi4gdHlwZW1hcCBjb2RlIC4uLgogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAKICAgICAgICAgICAgICAvLyBDb3B5IGEgbXVsdGl2YWx1ZWQgdHlwZW1hcAogICAgICAgICAgICAgICV0eXBlbWFwKGluKSAoaW50IGFyZ2NvdW50LCBjaGFyICoqYXJndikgPSAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSk7CgogICAgICAgICAgICAgIC8vIEFwcGx5IGEgbXVsdGl2YWx1ZWQgdHlwZW1hcAogICAgICAgICAgICAgICVhcHBseSAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkgeyAoaW50IGFyZ2NvdW50LCBjaGFyICoqYXJndikgfTsKCiAgICAgICAgICAgTm90ZTogdGhpcyBleHRyYSBwYXJzaW5nIHN1cHBvcnQgaXMgYWRkZWQgZm9yIGZ1dHVyZSBleHRlbnNpb24uCiAgICAgICAgICAgTm8gbGFuZ3VhZ2UgbW9kdWxlcyBjdXJyZW50bHkgc3VwcG9ydCBtdWx0aS12YWx1ZWQgdHlwZW1hcHMuCgoxMC8xMS8yMDAxOmJlYXpsZXkKICAgICAgICAgICBNb2RpZmllZCB0aGUgdHlwZW1hcCBtYXRjaGluZyBjb2RlIHRvIGRpc2NhcmQgcXVhbGlmaWVycyB3aGVuCiAgICAgICAgICAgY2hlY2tpbmcgZm9yIGEgbWF0Y2guICAgRm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlIGEgZGVjbGFyYXRpb24KICAgICAgICAgICBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgIHZvaWQgYmxhaChjb25zdCBjaGFyICp4KTsKCiAgICAgICAgICAgVGhlIHR5cGVtYXAgY2hlY2tlciBjaGVja3MgZm9yIGEgbWF0Y2ggaW4gdGhlIGZvbGxvd2luZyBvcmRlcjoKCiAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqeAogICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKgogICAgICAgICAgICAgICAgIGNoYXIgKngKICAgICAgICAgICAgICAgICBjaGFyICoKCiAgICAgICAgICAgSWYgdHlwZWRlZidzIGFyZSBpbnZvbHZlZCwgcXVhbGlmaWVyIHN0cmlwcGluZyBvY2N1cnMgYmVmb3JlCiAgICAgICAgICAgdHlwZWRlZiByZXNvbHV0aW9uLiAgU28gaWYgeW91IGhhZCB0aGlzLAoKICAgICAgICAgICAgICAgIHR5cGVkZWYgY2hhciAqc3RyaW5nOwogICAgICAgICAgICAgICAgdm9pZCBibGFoKGNvbnN0IHN0cmluZyB4KTsKCiAgICAgICAgICAgdHlwZW1hcCBjaGVja2luZyB3b3VsZCBiZSBhcyBmb2xsb3dzOgoKICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyB4CiAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcKICAgICAgICAgICAgICAgIHN0cmluZyB4CiAgICAgICAgICAgICAgICBzdHJpbmcKICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKngKICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKgogICAgICAgICAgICAgICAgY2hhciAqeAogICAgICAgICAgICAgICAgY2hhciAqCgogICAgICAgICAgIFRoZSBwcmltYXJ5IHJlYXNvbiBmb3IgdGhpcyBjaGFuZ2UgaXMgdG8gc2ltcGxpZnkgdGhlIGltcGxlbWVudGF0aW9uCiAgICAgICAgICAgb2YgbGFuZ3VhZ2UgbW9kdWxlcy4gIFdpdGhvdXQgcXVhbGlmaWVyIHN0cmlwcGluZywgb25lIGhhcyB0byB3cml0ZQogICAgICAgICAgIHNlcGVyYXRlIHR5cGVtYXBzIGZvciBhbGwgdmFyaWF0aW9ucyBvZiBjb25zdCBhbmQgdm9sYXRpbGUgKHdoaWNoCiAgICAgICAgICAgaXMgYSBwYWluKS4KCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqICBUeXBlbWFwcyBtaWdodCBiZSBhcHBsaWVkIGluCiAgICAgICAgICAgcGxhY2VzIHdoZXJlIHRoZXkgd2VyZW4ndCBiZWZvcmUuCgoKMTAvOS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgU1dJRyBub3cgZ2VuZXJhdGVzIHdyYXBwZXJzIHRoYXQgcHJvcGVybHkgZGlzYW1iaWd1YXRlCiAgICAgICAgICAgb3ZlcmxvYWRlZCBtZXRob2RzIHRoYXQgb25seSB2YXJ5IGluIGNvbnN0bmVzcy4gIEZvcgogICAgICAgICAgIGV4YW1wbGU6CgogICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgdm9pZCBibGFoKCk7CiAgICAgICAgICAgICAgICAgIHZvaWQgYmxhaCgpIGNvbnN0OwogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgVG8gaGFuZGxlIHRoaXMsIHRoZSAlcmVuYW1lIGRpcmVjdGl2ZSBjYW4gYmUgdXNlZCBub3JtYWxseS4KICAgICAgICAgICAKICAgICAgICAgICAgICAgJXJlbmFtZShibGFoX2NvbnN0KSBibGFoKCkgY29uc3Q7CgogICAgICAgICAgIEluIHRoZSByZXN1bHRpbmcgd3JhcHBlciBjb2RlLCBtZXRob2QgY2FsbHMgbGlrZSB0aGlzCiAgICAgICAgICAgYXJlIG5vdyBnZW5lcmF0ZWQ6CgogICAgICAgICAgICAgICAob2JqKS0+YmxhaCgpICAgICAgICAgICAgICAgLy8gTm9uLWNvbnN0IHZlcnNpb24KICAgICAgICAgICAgICAgKChGb28gY29uc3QgKilvYmopLT5ibGFoKCkgIC8vIGNvbnN0IHZlcnNpb24KCiAgICAgICAgICAgVGhpcyBzaG91bGQgZm9yY2UgdGhlIHJpZ2h0IG1ldGhvZCB0byBiZSBpbnZva2VkLgogICAgICAgICAgIEFkbWl0dGVkbHksIHRoaXMgaXMgcHJvYmFibHkgb2JzY3VyZSwgYnV0IHdlIG1pZ2h0CiAgICAgICAgICAgYXMgd2VsbCBnZXQgaXQgcmlnaHQuCgoxMC84LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBUaGUgcHJlcHJvY2Vzc29yIG5vdyBpZ25vcmVzICdccicgaW4gdGhlIGlucHV0LgogICAgICAgICAgIFRoaXMgc2hvdWxkIGZpeCB0aGUgZm9sbG93aW5nIGJ1ZzoKICAgICAgICAgICBbICM0Njg0MTYgXSBTV0lHIHRoaW5rcyBtYWNybyBkZWZzIGFyZSBkZWNsYXJhdGlvbnM/CgoxMC84LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBBZGRlZCBzdXBwb3J0IGZvciB8fCwgJiYsIGFuZCAhIGluIGNvbnN0YW50cy4gIFRoaXMKICAgICAgICAgICBmaXhlcyBTRiBbICM0Njg5ODggXSBMb2dpY2FsIG9wcyBicmVhayBwcmVwcm9jZXNzb3IuCiAgICAgICAgICAgSG93ZXZlciwgYXQgdGhpcyB0aW1lLCBjb25zdGFudHMgdXNpbmcgdGhlc2Ugb3BlcmF0b3JzCiAgICAgICAgICAgYXJlIG5vdCBzdXBwb3J0ZWQgKHRoZSBwYXJzZXIgd2lsbCBpc3N1ZSBhIHdhcm5pbmcpLgoKMTAvNC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgQWRkZWQgLXNob3dfdGVtcGxhdGVzIGNvbW1hbmQgbGluZSBvcHRpb24uICBUaGlzIG1ha2VzCiAgICAgICAgICAgU1dJRyBkaXNwbGF5IHRoZSBjb2RlIGl0IGFjdHVhbGx5IHBhcnNlcyB0byBnZW5lcmF0ZQogICAgICAgICAgIHRlbXBsYXRlIHdyYXBwZXJzLiAgTW9zdGx5IHVzZWZ1bCBmb3IgZGVidWdnaW5nLgogICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjEwLzQvMjAwMTogYmVhemxleQogICAgICAgICAgIENoYW5nZSB0byBzZW1hbnRpY3Mgb2YgJXRlbXBsYXRlIGRpcmVjdGl2ZS4gIFdoZW4KICAgICAgICAgICB1c2luZyAldGVtcGxhdGUsIHRoZSB0ZW1wbGF0ZSBhcmd1bWVudHMgYXJlIGhhbmRsZWQKICAgICAgICAgICBhcyB0eXBlcyBieSBkZWZhdWx0LiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgJXRlbXBsYXRlKHZlY2ludCkgdmVjdG9yPGludD47CiAgICAgICAgICAgICAgICAldGVtcGxhdGUodmVjZG91YmxlKSB2ZWN0b3I8ZG91YmxlPjsKCiAgICAgICAgICAgVG8gc3BlY2lmeSBhIHRlbXBsYXRlIGFyZ3VtZW50IHRoYXQgaXMgKm5vdCogYSB0eXBlLCB5b3UKICAgICAgICAgICBuZWVkIHRvIHVzZSBkZWZhdWx0LXZhbHVlIHN5bnRheC4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgJXRlbXBsYXRlKHZlY2ludCkgdmVjdG9yPGludCxpbnQ9NTA+OwogICAgICAgICAgICAgICAgJXRlbXBsYXRlKHZlY2RvdWJsZSkgdmVjdG9yPGludCxzaXplPTEwMD47CgogICAgICAgICAgIEluIHRoaXMgY2FzZSwgdGhlIHR5cGUgbmFtZSBkb2Vzbid0IHJlYWxseSBtYXR0ZXItLW9ubHkKICAgICAgICAgICB0aGUgZGVmYXVsdCB2YWx1ZSAoZS5nLiwgNTAsIDEwMCkgaXMgdXNlZCBkdXJpbmcKICAgICAgICAgICBleHBhbnNpb24uICBUaGlzIGRpZmZlcnMgZnJvbSBub3JtYWwgQysrLCBidXQgSSBjb3VsZG4ndAogICAgICAgICAgIGZpZ3VyZSBvdXQgYSBiZXR0ZXIgd2F5IHRvIGRvIGl0IGluIHRoZSBwYXJzZXIuICBNaWdodAogICAgICAgICAgIGltcGxlbWVudCBhbiBhbHRlcm5hdGl2ZSBsYXRlci4KICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKICAgICAgIAoxMC80LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBNYWpvciBjaGFuZ2VzIHRvIHRlbXBsYXRlIGhhbmRsaW5nIGluIG9yZGVyIHRvIHByb3ZpZGUKICAgICAgICAgICBiZXR0ZXIgaW50ZWdyYXRpb24gd2l0aCB0aGUgQysrIHR5cGUtc3lzdGVtLiBUaGUgbWFpbgogICAgICAgICAgIHByb2JsZW0gaXMgYXMgZm9sbG93czoKCiAgICAgICAgICAgU3VwcG9zZSB5b3UgaGF2ZSBhIHRlbXBsYXRlIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgVD4gdm9pZCBibGFoKGNvbnN0IFQgeCkgeyBzdHVmZiB9OwogICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgTm93IHN1cHBvc2UsIHRoYXQgeW91IGluc3RhbnRpYXRlIHRoZSB0ZW1wbGF0ZSBvbiBhCiAgICAgICAgICAgdHlwZSBsaWtlIHRoaXMgaW4gU1dJRzoKCiAgICAgICAgICAgICAgJXRlbXBsYXRlKGJsYWhpbnQpIGJsYWg8aW50ICo+OwoKICAgICAgICAgICBJbiBDKyssIHRoaXMgaXMgKnN1cHBvc2VkKiB0byBnZW5lcmF0ZSBjb2RlIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgdm9pZCBibGFoKGludCAqY29uc3QgeCkgeyBzdHVmZiB9OwoKICAgICAgICAgICBIb3dldmVyLCBpbiBTV0lHLTEuMy45LCB0aGUgdGVtcGxhdGUgc3Vic3RpdHV0aW9uIGdldHMgaXQgd3JvbmcKICAgICAgICAgICBhbmQgcHJvZHVjZXMKCiAgICAgICAgICAgICAgdm9pZCBibGFoKGNvbnN0IGludCAqeCkgeyBzdHVmZiB9OwoKICAgICAgICAgICAobm90aWNlIHRoZSBiYWQgcGxhY2VtZW50IG9mIHRoZSAnY29uc3QnIHF1YWxpZmllcikuCgogICAgICAgICAgIFRvIGZpeCB0aGlzLCB0aGUgU1dJRyBwYXJzZXIgbm93IGdlbmVyYXRlcyBpbXBsaWNpdCB0eXBlZGVmcwogICAgICAgICAgIGZvciB0ZW1wbGF0ZSB0eXBlIGFyZ3VtZW50cyB0aGF0IHByb2R1Y2VzIGNvZGUgcm91Z2hseQogICAgICAgICAgIGVxdWl2YWxlbnQgdG8gZG9pbmcgdGhpczoKCiAgICAgICAgICAgICAgdHlwZWRlZiBpbnQgKl9fc3dpZ3RtcGwxOwogICAgICAgICAgICAgICV0ZW1wbGF0ZShibGFoaW50KSBibGFoPF9fc3dpZ3RtcGwxPjsKCiAgICAgICAgICAgd2hpY2ggZ2VuZXJhdGVzIGNvZGUgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICB2b2lkIGJsYWgoY29uc3QgX19zd2lndG1wbDEgeCkgeyBzdHVmZiB9OwoKICAgICAgICAgICBTaW5jZSB0aGlzIGlzIGNvcnJlY3QgaW4gYm90aCBDKysgYW5kIFNXSUcsIGl0IHByb3ZpZGVzIHRoZSByaWdodAogICAgICAgICAgIHNlbWFudGljcyBhbmQgYWxsb3dzIGV2ZXJ5dGhpbmcgdG8gY29tcGlsZSBwcm9wZXJseS4gIEhvd2V2ZXIsCiAgICAgICAgICAgdG8gY2xlYW4gdXAgdGhlIGdlbmVyYXRlZCBjb2RlIGEgbGl0dGxlIGJpdCwgdGhlIHBhcnNlciBrZWVwcwogICAgICAgICAgIHRyYWNrIG9mIHRoZSB0ZW1wbGF0ZSB0eXBlcyBhbmQgcGVyZm9ybXMgYmFjay1zdWJzdGl0dXRpb24gdG8KICAgICAgICAgICB0aGUgb3JpZ2luYWwgdHlwZSB3aGVuIGJ1aWxkaW5nIHRoZSBwYXJzZSB0cmVlLiAgVGh1cywgZXZlbgogICAgICAgICAgIHRob3VnaCB0aGUgaW1wbGljaXQgdHlwZWRlZiBpcyB1c2VkIGluIHRoZSBpbnB1dCBhbmQgbWF5IGFwcGVhcgogICAgICAgICAgIGluIHRoZSBnZW5lcmF0ZWQgd3JhcHBlciBmaWxlIChmb3IgcHJvcGVyIGNvbXBpbGF0aW9uKSwgdGhlIHBhcnNlCiAgICAgICAgICAgdHJlZSB3aWxsIGhpZGUgYSBsb3Qgb2YgdGhlc2UgZGV0YWlscy4gICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgdm9pZCBibGFoKGNvbnN0IF9fc3dpZ3RtcGwxIHgpIHsgc3R1ZmYgfTsKCiAgICAgICAgICAgd2lsbCBsb29rIGxpa2UgaXQgd2FzIGRlY2xhcmVkIGFzIGZvbGxvd3MgKHdoaWNoIGlzIHdoYXQKICAgICAgICAgICB5b3Ugd2FudCk6CgogICAgICAgICAgICAgIHZvaWQgYmxhaChpbnQgKmNvbnN0IHgpIHsgc3R1ZmYgfQoKICAgICAgICAgICBUaGUgb25seSBwbGFjZSB5b3UgYXJlIGxpa2VseSB0byBub3RpY2UgdGhlIHR5cGVkZWYgaGFjawogICAgICAgICAgIGlzIGluIGJvZGllcyBvZiB0ZW1wbGF0ZSBmdW5jdGlvbnMuICBGb3IgZXhhbXBsZSwgaWYgeW91CiAgICAgICAgICAgZGlkIHRoaXMsCgogICAgICAgICAgICAgIHRlbXBsYXRlPGNsYXNzIFQ+IGNsYXNzIGJsYWggewogICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICAlYWRkbWV0aG9kcyB7CiAgICAgICAgICAgICAgICAgICAgICAgdm9pZCBzcGFtKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgIFQgIHRlbXB2YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICB5b3Ugd2lsbCBmaW5kIHRoYXQgJ1QgdGVtcHZhbHVlJyBnb3QgZXhwYW5kZWQgaW50byBzb21lCiAgICAgICAgICAgc3RyYW5nZSB0eXBlZGVmIHR5cGUuICBUaGlzICpzdGlsbCogY29tcGlsZXMgY29ycmVjdGx5IAogICAgICAgICAgIHNvIGl0J3Mgbm90IGEgYmlnIGRlYWwgKG90aGVyIHRoYW4gbG9va2luZyBraW5kIG9mIHVnbHkKICAgICAgICAgICBpbiB0aGUgd3JhcHBlciBmaWxlKS4KCjEwLzQvMjAwMTogYmVhemxleQogICAgICAgICAgIEZpeGVkIHNvbWUgaW5oZXJpdGFuY2UgcHJvYmxlbXMgaW4gVGNsIE9iamVjdCBpbnRlcmZhY2UuCgoxMC8xLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBUY2wgbW9kdWxlIGhhcyBjaGFuZ2VkIHRvIHVzZSBieXRlLWJhY2tlZCBwb2ludGVyIHN0cmluZ3MuICBUaGlzCiAgICAgICAgICAgaW1wbGVtZW50YXRpb24gc2hvdWxkIGJlIHNhZmUgb24gNjQtYml0IHBsYXRmb3Jtcy4gIEhvd2V2ZXIsCiAgICAgICAgICAgdGhlIG9yZGVyIGluIHdoaWNoIGRpZ2l0cyBhcHBlYXIgaW4gcG9pbnRlciB2YWx1ZXMgbm8gbG9uZ2VyCiAgICAgICAgICAgZGlyZWN0bHkgY29ycmVzcG9uZHMgdG8gdGhlIGFjdHVhbCBudW1lcmljYWwgdmFsdWUgb2YgYQogICAgICAgICAgIHBvaW50ZXIgKG9uIGxpdHRsZS1lbmRpYW4gbWFjaGluZXMsIHBhaXJzIG9mIGRpZ2l0cyBhcHBlYXIKICAgICAgICAgICBpbiByZXZlcnNlIG9yZGVyKS4KCjEwLzEvMjAwMTogYmVhemxleQogICAgICAgICAgIFBlcmw1IG1vZHVsZSBpcyBub3cgZHJpdmVuIGJ5IGEgY29uZmlndXJhdGlvbiBmaWxlICdwZXJsNS5zd2cnCiAgICAgICAgICAgaW4gdGhlIFNXSUcgbGlicmFyeS4KCjEwLzEvMjAwMTogYmVhemxleQogICAgICAgICAgIFRoZSBwZXJsNSBtb2R1bGUgbm8gbG9uZ2VyIHRyaWVzIHRvIGFwcGx5IHRoZSAib3V0IiB0eXBlbWFwCiAgICAgICAgICAgaW4gY29kZSBnZW5lcmF0ZWQgZm9yIG1hZ2ljIHZhcmlhYmxlcy4gIEknbSBzdXJwcmlzZWQgdGhhdAogICAgICAgICAgIHRoaXMgZXZlciB3b3JrZWQgYXQgYWxsIChzaW5jZSBhbGwgb2YgdGhlIGNvZGUgdGhhdCB3YXMgdGhlcmUKICAgICAgICAgICB3YXMgd3JvbmcgYW55d2F5cykuICAgVXNlIHRoZSAidmFyb3V0IiB0eXBlbWFwIHRvIGhhbmRsZQogICAgICAgICAgIGdsb2JhbCB2YXJpYWJsZXMuCgoxMC8xLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBGaXhlZCBhIGJ1ZyByZWxhdGVkIHRvIGNoYXJhY3RlciBhcnJheSBtZW1iZXJzIG9mIHN0cnVjdHVyZXMuCiAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgc3RydWN0IEZvbyB7CiAgICAgICAgICAgICAgICAgICBjaGFyIG5hbWVbMzJdOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgU1dJRyBpcyBub3JtYWxseSBzdXBwb3NlZCB0byByZXR1cm4gYSBzdHJpbmcsIGJ1dCB0aGlzIHdhcwogICAgICAgICAgIGJyb2tlbiBpbiAxLjMuOS4gICBUaGUgcmVhc29uIGl0IHdhcyBicm9rZW4gd2FzIGFjdHVhbGx5CiAgICAgICAgICAgZHVlIHRvIGEgc3VidGxlIG5ldyBmZWF0dXJlIG9mIHR5cGVtYXBzLiAgV2hlbiBhIGRhdGEgbWVtYmVyCiAgICAgICAgICAgaXMgc2V0IHRvIGFuIGFycmF5IGxpa2UgdGhpcywgdGhlIHJldHVybiB0eXBlIG9mIHRoZSByZWxhdGVkCiAgICAgICAgICAgYWNjZXNzb3IgZnVuY3Rpb24gaXMgYWN0dWFsbHkgc2V0IHRvIGFuIGFycmF5LiAgVGhpcyBtZWFucwogICAgICAgICAgIHRoYXQgeW91IGNhbiBub3cgd3JpdGUgdHlwZW1hcHMgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAldHlwZW1hcChweXRob24sb3V0KSBjaGFyIFtBTlldIHsKICAgICAgICAgICAgICAgICAkdGFyZ2V0ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoJHNvdXJjZSwkZGltMCk7CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICBUaGlzIGZ1bmN0aW9uYWxpdHkgY2FuIGJlIHVzZWQgdG8gcmVwbGFjZSB0aGUgZGVmdW5jdAogICAgICAgICAgIG1lbWJlcm91dCB0eXBlbWFwIGluIGEgbW9yZSBlbGVnYW50IG1hbm5lci4KCjkvMjkvMjAwMTogYmVhemxleQogICAgICAgICAgIFNvbWUgZnVydGhlciByZWZpbmVtZW50IG9mIHF1YWxpZmllZCBDKysgbWVtYmVyIGZ1bmN0aW9ucy4KICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICB2b2lkIGZvbygpIGNvbnN0OwogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgKGkpIFRoZSBTV0lHIHBhcnNlciB3YXMgZXh0ZW5kZWQgc2xpZ2h0bHkgdG8gYWxsb3cgJ3ZvbGF0aWxlJwogICAgICAgICAgIGFuZCBjb21iaW5hdGlvbnMgb2YgJ2NvbnN0JyBhbmQgJ3ZvbGF0aWxlJyB0byBiZSB1c2VkLiAgVGhpcwogICAgICAgICAgIGlzIHByb2JhYmx5IHJhcmUsIGJ1dCB0ZWNobmljYWxseSBsZWdhbC4gIE9ubHkgYWRkZWQgZm9yCiAgICAgICAgICAgY29tcGxldGVuZXNzLgoKICAgICAgICAgICAoaWkpIEZvciB0aGUgcHVycG9zZXMgb2Ygb3ZlcmxvYWRpbmcsIHF1YWxpZmllZCBhbmQgbm9uLXF1YWxpZmllZAogICAgICAgICAgIGZ1bmN0aW9ucyBhcmUgZGlmZmVyZW50LiAgVGh1cywgd2hlbiBhIGNsYXNzIGhhcyBtZXRob2RzIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAgdm9pZCBmb28oKTsKICAgICAgICAgICAgICAgICB2b2lkIGZvbygpIGNvbnN0OwoKICAgICAgICAgICBUd28gZGlzdGluY3QgbWV0aG9kcyBhcmUgZGVjbGFyZWQuICBUbyBkZWFsIHdpdGggdGhpcywgJXJlbmFtZQogICAgICAgICAgIGFuZCBzaW1pbGFyIGRpcmVjdGl2ZXMgaGF2ZSBiZWVuIGV4dGVuZGVkIHRvIHJlY29nbml6ZSBjb25zdC4KICAgICAgICAgICBUaHVzLCBvbmUgY2FuIGRpc2FtYmlndWF0ZSB0aGUgdHdvIGZ1bmN0aW9ucyBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgJXJlbmFtZShmb29jb25zdCkgRm9vOjpmb28oKSBjb25zdDsKCiAgICAgICAgICAgb3Igc2ltcGx5IGlnbm9yZSB0aGUgY29uc3QgdmFyaWFudCBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgJWlnbm9yZSBGb286OmZvbygpIGNvbnN0OwoKICAgICAgICAgICBOb3RlOiBTV0lHIGN1cnJlbnRseSBoYXMgbm8gd2F5IHRvIGFjdHVhbGx5IGludm9rZSB0aGUgY29uc3QKICAgICAgICAgICBtZW1iZXIgc2luY2UgdGhlICdjb25zdCcgaXMgZGlzY2FyZGVkIHdoZW4gZ2VuZXJhdGluZyB3cmFwcGVycwogICAgICAgICAgIGZvciBvYmplY3RzLiAgCgo5LzI3LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBOZXcgZGlyZWN0aXZlLiAlbmFtZXdhcm4gY2FuIGJlIHVzZWQgdG8gaXNzdWUgd2FybmluZwogICAgICAgICAgIG1lc3NhZ2VzIGZvciBjZXJ0YWluIGRlY2xhcmF0aW9uIG5hbWVzLiAgIFRoZSBuYW1lCiAgICAgICAgICAgbWF0Y2hpbmcgaXMgdGhlIHNhbWUgYXMgZm9yIHRoZSAlcmVuYW1lIGRpcmVjdGl2ZS4KICAgICAgICAgICBUaGUgaW50ZW50IG9mIHRoaXMgZGlyZWN0aXZlIGlzIHRvIGlzc3VlIHdhcm5pbmdzIGZvcgogICAgICAgICAgIHBvc3NpYmxlIG5hbWVzcGFjZSBjb25mbGljdHMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgJW5hbWV3YXJuKCJwcmludCBpcyBhIHB5dGhvbiBrZXl3b3JkIikgcHJpbnQ7CgogICAgICAgICAgIFRoZSBuYW1lIG1hdGNoaW5nIGFsZ29yaXRobSBpcyBwZXJmb3JtZWQgYWZ0ZXIgYSBuYW1lCiAgICAgICAgICAgaGFzIGJlZW4gcmVzb2x2ZWQgdXNpbmcgJXJlbmFtZS4gIFRoZXJlZm9yZSwgYQogICAgICAgICAgIGRlY2xhcmF0aW9uIGxpa2UgdGhpcyB3aWxsIG5vdCBnZW5lcmF0ZSBhIHdhcm5pbmc6CgogICAgICAgICAgICAgICVyZW5hbWUoIlByaW50IikgcHJpbnQ7CiAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgdm9pZCBwcmludCgpOyAgICAvKiBObyB3YXJuaW5nIGdlbmVyYXRlZCAqLwoKICAgICAgICAgICBTaW5jZSB0aGUgd2FybmluZyBtZWNoYW5pc20gZm9sbG93cyAlcmVuYW1lIHNlbWFudGljcywgaXQgaXMKICAgICAgICAgICBhbHNvIHRvIGlzc3VlIHdhcm5pbmdzIGZvciBzcGVjaWZpYyBjbGFzc2VzIG9yIGp1c3QgZm9yCiAgICAgICAgICAgY2VydGFpbiBtZW1iZXIgZnVuY3Rpb24gbmFtZXMuCgogICAgICAgICAgIChEYXZlIC0gSSd2ZSBiZWVuIHRoaW5raW5nIGFib3V0IGFkZGluZyBzb21ldGhpbmcgbGlrZSB0aGlzCiAgICAgICAgICAgZm9yIHF1aXRlIHNvbWUgdGltZS4gIEp1c3QgbmV2ZXIgZ290IGFyb3VuZCB0byBpdCkKICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgoKOS8yNy8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgRW5oYW5jZWQgdGhlICVpZ25vcmUgZGlyZWN0aXZlIHNvIHRoYXQgd2FybmluZyBtZXNzYWdlcwogICAgICAgICAgIGNhbiBiZSBpc3N1ZWQgdG8gdXNlcnMuICAgVGhpcyBpcyBkb25lIHVzaW5nICVpZ25vcmV3YXJuCiAgICAgICAgICAgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICVpZ25vcmV3YXJuKCJvcGVyYXRvciBuZXcgaWdub3JlZCIpIG9wZXJhdG9yIG5ldzsKCiAgICAgICAgICAgVGhlIG5hbWVzIGFuZCBzZW1hbnRpY3Mgb2YgJWlnbm9yZXdhcm4gaXMgZXhhY3RseSB0aGUgCiAgICAgICAgICAgc2FtZSBhcyAlaWdub3JlLiBUaGUgcHJpbWFyeSBwdXJwb3NlIG9mIHRoaXMgZGlyZWN0aXZlCiAgICAgICAgICAgaXMgZm9yIG1vZHVsZSB3cml0ZXJzIHdobyB3YW50IHRvIGlnbm9yZSBjZXJ0YWluIHR5cGVzCiAgICAgICAgICAgb2YgZGVjbGFyYXRpb25zLCBidXQgd2hvIGFsc28gd2FudCB0byBhbGVydCB1c2VycyBhYm91dCBpdC4KICAgICAgICAgICBBIHVzZXIgbWlnaHQgYWxzbyB1c2UgdGhpcyBmb3IgZGVidWdnaW5nIChzaW5jZSBtZXNzYWdlcwogICAgICAgICAgIHdpbGwgYXBwZWFyIHdoZW5ldmVyIGFuIGlnbm9yZWQgZGVjbGFyYXRpb24gYXBwZWFycykuCiAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKOS8yNi8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgU3VwZXItZXhwZXJpbWVudGFsIHN1cHBvcnQgZm9yIG92ZXJsb2FkZWQgb3BlcmF0b3JzLiAKICAgICAgICAgICBUaGlzIGltcGxlbWVudGF0aW9uIGNvbnNpc3RzIG9mIGEgZmV3IGRpZmZlcmVudCBwYXJ0cy4KCiAgICAgICAgICAgKGkpIE9wZXJhdG9yIG5hbWVzIHN1Y2ggYXMgJ29wZXJhdG9yKycgYXJlIG5vdyBhbGxvd2VkCiAgICAgICAgICAgYXMgdmFsaWQgZGVjbGFyYXRvciBuYW1lcy4gIFRodXMgdGhlICdvcGVyYXRvcicgc3ludGF4CiAgICAgICAgICAgY2FuIGFwcGVhciAqYW55cGxhY2UqIGEgbm9ybWFsIGRlY2xhcmF0b3IgbmFtZSB3YXMgdXNlZAogICAgICAgICAgIGJlZm9yZS4gIE9uIHRoZSBzdXJmYWNlLCB0aGlzIG1lYW5zIHRoYXQgb3BlcmF0b3JzIGNhbgogICAgICAgICAgIGJlIHBhcnNlZCBqdXN0IGxpa2Ugbm9ybWFsIGZ1bmN0aW9ucyBhbmQgbWV0aG9kcy4gCiAgICAgICAgICAgSG93ZXZlciwgaXQgYWxzbyBtZWFucyB0aGF0IG9wZXJhdG9yIG5hbWVzIGNhbiBiZSB1c2VkCiAgICAgICAgICAgaW4gbWFueSBvdGhlciBTV0lHIGRpcmVjdGl2ZXMgbGlrZSAlcmVuYW1lLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAlcmVuYW1lKF9fYWRkX18pIENvbXBsZXg6Om9wZXJhdG9yKyhjb25zdCBDb21wbGV4ICYpOwoKICAgICAgICAgICAoaWkpIE9wZXJhdG9ycyBhcmUgd3JhcHBlZCAqZXhhY3RseSogbGlrZSBub3JtYWwgZnVuY3Rpb25zCiAgICAgICAgICAgYW5kIG1ldGhvZHMuICBJbnRlcm5hbGx5LCB0aGUgb3BlcmF0b3IgbmFtZSBpcyB1c2VkIAogICAgICAgICAgIGRpcmVjdGx5IG1lYW5pbmcgdGhhdCB0aGUgd3JhcHBlciBjb2RlIG1pZ2h0IGNvbnRhaW4KICAgICAgICAgICBzdGF0ZW1lbnRzIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICBhcmcwLT5vcGVyYXRvciooKENvbXBsZXggY29uc3QgJikqYXJnMSk7CgogICAgICAgICAgIFRoaXMgYWxsIHNlZW1zIHRvIHBhcnNlIGFuZCBjb21waWxlIGNvcnJlY3RseSAoYXQgbGVhc3QKICAgICAgICAgICBvbiBteSBtYWNoaW5lKS4KCiAgICAgICAgICAgKGlpaSkgU1dJRyB3aWxsIG5vIGxvbmdlciB3cmFwIGEgZGVjbGFyYXRpb24gaWYgaXRzIHN5bWJvbAogICAgICAgICAgIHRhYmxlIG5hbWUgY29udGFpbnMgaWxsZWdhbCBpZGVudGlmaWVyIGNoYXJhY3RlcnMuICBJZgogICAgICAgICAgIGlsbGVnYWwgY2hhcmFjdGVycyBhcmUgZGV0ZWN0ZWQsIHlvdSB3aWxsIHNlZSBhbiBlcnJvcgogICAgICAgICAgIGxpa2UgdGhpczoKIAogICAgICAgICAgICAgICAgV2FybmluZy4gQ2FuJ3Qgd3JhcCBvcGVyYXRvciogdW5sZXNzIHJlbmFtZWQgdG8gYSB2YWxpZCBpZGVudGlmaWVyLgoKICAgICAgICAgICBUaGUgb25seSB3YXkgdG8gZml4IHRoaXMgaXMgdG8gdXNlICVyZW5hbWUgb3IgJW5hbWUgdG8gYmluZAogICAgICAgICAgIHRoZSBvcGVyYXRvciB0byBhIG5pY2UgbmFtZSBsaWtlICJhZGQiIG9yIHNvbWV0aGluZy4gTm90ZToKICAgICAgICAgICB0aGUgbGVnYWwgaWRlbnRpZmllciBjaGFyYWN0ZXJzIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSB0YXJnZXQKICAgICAgICAgICBsYW5ndWFnZS4KCiAgICAgICAgICAgVGhlcmUgYXJlIGNlcnRhaW4gaXNzdWVzIHdpdGggZnJpZW5kIGZ1bmN0aW9ucyBhbmQgb3BlcmF0b3JzLgogICAgICAgICAgIFNvbWV0aW1lcywgZnJpZW5kcyBhcmUgdXNlZCB0byBkZWZpbmUgbWl4ZWQgb3BlcmF0b3JzIHN1Y2gKICAgICAgICAgICBhcyBhZGRpbmcgYSBDb21wbGV4IGFuZCBhIGRvdWJsZSB0b2dldGhlci4gIEN1cnJlbnRseSwgU1dJRwogICAgICAgICAgIGlnbm9yZXMgYWxsIGZyaWVuZCBkZWNsYXJhdGlvbnMgaW4gYSBjbGFzcy4gIEEgZ2xvYmFsIG9wZXJhdG9yCiAgICAgICAgICAgZGVjbGFyYXRpb24gY2FuIHByb2JhYmx5IGJlIG1hZGUgdG8gd29yaywgYnV0IHlvdSdsbCBoYXZlIHRvCiAgICAgICAgICAgcmVuYW1lIGl0IGFuZCBpdCBwcm9iYWJseSB3b24ndCB3b3JrIHZlcnkgY2xlYW5seSBpbiB0aGUKICAgICAgICAgICB0YXJnZXQgbGFuZ3VhZ2Ugc2luY2UgaXQncyBub3QgYSBjbGFzcyBtZW1iZXIuCgogICAgICAgICAgIFNXSUcgZG9lc24ndCBrbm93IGhvdyB0byBoYW5kbGUgb3BlcmF0b3Igc3BlY2lmaWNhdGlvbnMgCiAgICAgICAgICAgc29tZXRpbWVzIHVzZWQgZm9yIGF1dG9tYXRpYyB0eXBlIGNvbnZlcnNpb24uIEZvciBleGFtcGxlOgoKICAgICAgICAgICBjbGFzcyBTdHJpbmcgewogICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgIG9wZXJhdG9yIGNvbnN0IGNoYXIqKCk7CiAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgfTsKCiAgICAgICAgICAgKHRoaXMgZG9lc24ndCBwYXJzZSBjb3JyZWN0bHkgYW5kIGdlbmVyYXRlcyBhIHN5bnRheCBlcnJvcikuCgogICAgICAgICAgIEFsc286IG9wZXJhdG9ycyBubyBsb25nZXIgc2hvdyB1cCBhcyBzZXBhcmF0ZSBwYXJzZS10cmVlCiAgICAgICAgICAgbm9kZXMgKGluc3RlYWQgdGhleSBhcmUgbm9ybWFsICdjZGVjbCcgbm9kZXMpLiAgSSBtYXkKICAgICAgICAgICBzZXBhcmF0ZSB0aGVtIGFzIGEgc3BlY2lhbCBjYXNlIGxhdGVyLgoKICAgICAgICAgICBTZWUgRXhhbXBsZXMvcHl0aG9uL29wZXJhdG9yIGZvciBhbiBleGFtcGxlLgoKICAgICAgICAgICAqKiogU1VQRVItRVhQRVJJTUVOVEFMIE5FVyBGRUFUVVJFICoqKgoKVmVyc2lvbiAxLjMuOSAoU2VwdGVtYmVyIDI1LCAyMDAxKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cgo5LzI1LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBGaXhlZCBwYXJzaW5nIHByb2JsZW0gd2l0aCB0eXBlIGRlY2xhcmF0aW9ucyBsaWtlIAogICAgICAgICAgICdjaGFyICoqIGNvbnN0Jy4gIFNXSUcgcGFyc2VkIHRoaXMgY29ycmVjdGx5LCBidXQgdGhlCiAgICAgICAgICAgaW50ZXJuYWwgdHlwZSB3YXMgcmVwcmVzZW50ZWQgaW5jb3JyZWN0bHkgKHRoZSBwb2ludGVycwogICAgICAgICAgIGFuZCBxdWFsaWZpZXJzIHdlcmUgaW4gdGhlIHdyb25nIG9yZGVyKS4KCjkvMjUvMjAwMTogYmVhemxleQogICAgICAgICAgIFdpdGhkcmV3IGV4cGVyaW1lbnRhbCBmZWF0dXJlIChub3RlZCBiZWxvdykgdGhhdCB3YXMKICAgICAgICAgICBjYXVzaW5nIHNlcmlvdXMgcGFyc2luZyBwcm9ibGVtcy4KClZlcnNpb24gMS4zLjggKFNlcHRlbWJlciAyMywgMjAwMSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKOS8yMy8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgSW5jbHVkZWQgaW1wcm92ZWQgZGlzdHV0aWxzIHNldHVwLnB5IGZpbGUgaW4gdGhlIFRvb2xzIAogICAgICAgICAgIGRpcmVjdG9yeSAobG9vayBmb3IgdGhlIHNldHVwLnB5LnRtcGwgZmlsZSkuICBDb250cmlidXRlZCBieQogICAgICAgICAgIFRvbnkgU2V3YXJkLgoKOS8yMy8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgSW5jbHVkZWQgdHdvIG5ldyBSUE0gc3BlYyBmaWxlcyBpbiB0aGUgVG9vbHMgZGlyZWN0b3J5LiBDb250cmlidXRlZAogICAgICAgICAgIGJ5IFRvbnkgU2V3YXJkIGFuZCBVd2UgU3RlaW5tYW5uLgogIAo5LzIxLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBGaXhlZCBTRiBCdWcgWyAjNDYzNjM1IF0gUGVybDUuc3dnIGRvZXMgbm90IGNvbXBpbGUgaW4gVmlzdWFsIEMrKwoKOS8yMS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgVHdvIG5ldyBkaXJlY3RpdmVzIGNvbnRyb2wgdGhlIGNyZWF0aW9uIG9mIGRlZmF1bHQKICAgICAgICAgICBjb25zdHJ1Y3RvcnMgYW5kIGRlc3RydWN0b3JzOgoKICAgICAgICAgICAgICAgICVub2RlZmF1bHQKICAgICAgICAgICAgICAgICVtYWtlZGVmYXVsdAoKICAgICAgICAgICBUaGVzZSByZXBsYWNlICVwcmFnbWEgbm9kZWZhdWx0IGFuZCAlcHJhZ21hIG1ha2VkZWZhdWx0LgogICAgICAgICAgIChvbGQgY29kZSB3aWxsIHN0aWxsIHdvcmssIGJ1dCBkb2N1bWVudGF0aW9uIHdpbGwgb25seQogICAgICAgICAgIGRlc2NyaWJlIHRoZSBuZXcgZGlyZWN0aXZlcykuCgo5LzIxLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBGaXhlZCBTRiBCdWcgWyAjNDYyMzU0IF0gJWltcG9ydCBicm9rZW4gaW4gMS4zLjcuCgo5LzIwLzIwMDE6IGJlYXpsZXkKCiAgICAgICAgICAgUGFyc2VyIG1vZGlmaWVkIHRvIGlnbm9yZSBvdXQtb2YtY2xhc3MgY29uc3RydWN0b3IKICAgICAgICAgICBhbmQgZGVzdHJ1Y3RvciBkZWNsYXJhdGlvbnMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgIGlubGluZSBGb286OkZvbygpIDoKICAgICAgICAgICAgICAgICAgICBCYXIoImZvbyIpCiAgICAgICAgICAgICAgIHsgCiAgICAgICAgICAgICAgIH0gCgogICAgICAgICAgICAgICBpbmxpbmUgRm9vOjp+Rm9vKCkgewogICAgICAgICAgICAgICB9CgogICAgICAgICAgIFN1Z2dlc3RlZCBieSBKYXNvbiBTdGV3YXJ0LgogICAgICAgICAgICoqKiBFWFBFUklNRU5UQUwgRkVBVFVSRSAqKioKCjkvMjAvMjAwMTogYmVhemxleQogICAgICAgICAgIE1vZGlmaWVkIHRoZSBwYXJzZXIgdG8gaWdub3JlIGZvcndhcmQgdGVtcGxhdGUgY2xhc3MKICAgICAgICAgICBkZWNsYXJhdGlvbnMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgdGVtcGxhdGUgPGNsYXNzIFYsIGxvbmcgUz4gY2xhc3MgTWFwSXRlcjsKCiAgICAgICAgICAgU3VnZ2VzdGVkIGJ5IGFuIGVtYWlsIGV4YW1wbGUgZnJvbSBJcmluYSBLb3Rsb3ZhLgoKOS8yMC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgcHJvYmxlbSB3aXRoIHVuZGVjbGFyZWQgdGNsX3Jlc3VsdCB2YXJpYWJsZSBpbiAKICAgICAgICAgICB0aGUgIm91dCIgdHlwZW1hcCBmb3IgVGNsLiAgUmVwb3J0ZWQgYnkgU2hhdW4gTG93cnkuCgo5LzIwLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBJbmNvcnBvcmF0ZWQgY2hhbmdlcyB0byBtYWtlIFNXSUcgd29yayB3aXRoIEFjdGl2ZVBlcmwuICAKICAgICAgICAgICBDb250cmlidXRlZCBieSBKb2VsIFJlZWQuCgo5LzIwLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBTbGlnaHQgY2hhbmdlIHRvIHRoZSBwYXJzaW5nIG9mIEMrKyBjb25zdHJ1Y3RvciBpbml0aWFsaXplcnMuCiAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgIGNsYXNzIEZvbyA6IHB1YmxpYyBCYXIgewogICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgRm9vKCkgOiBCYXIoLi4uKSB7Li4ufQogICAgICAgICAgIH07CgogICAgICAgICAgIFNXSUcgbm93IGRpc2NhcmRzIHRoZSBjb250ZW50cyBvZiB0aGUgKC4uLikgcmVnYXJkbGVzcyBvZiAKICAgICAgICAgICB3aGF0IG1pZ2h0IGVuY2xvc2VkIChldmVuIGlmIHN5bnRhY3RpY2FsbHkgd3JvbmcpLiAgU1dJRwogICAgICAgICAgIGRvZXNuJ3QgbmVlZCB0aGlzIGluZm9ybWF0aW9uIGFuZCB0aGVyZSBpcyBubyByZWFzb24gdG8KICAgICAgICAgICBuZWVkbGVzcyBhZGQgc3ludGF4IHJ1bGVzIHRvIGhhbmRsZSBhbGwgb2YgdGhlIHBvc3NpYmlsaXRpZXMKICAgICAgICAgICBoZXJlLgoKOS8yMC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgQ2hhbmdlIHRvIHR5cGVtYXBzIGZvciBzdHJ1Y3R1cmUgbWVtYmVycy4gIElmIHlvdSBoYXZlIGEKICAgICAgICAgICBzdHJ1Y3R1cmUgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICBzdHJ1Y3QgVmVjdG9yIHsKICAgICAgICAgICAgICAgIGludCAqYmFyOwogICAgICAgICAgICAgIH07CgogICAgICAgICAgIFRoZSBtZW1iZXIgbmFtZSAnYmFyJyBpcyBub3cgdXNlZCBpbiBhbnkgYWNjZXNzb3IgZnVuY3Rpb25zLgogICAgICAgICAgIFRoaXMgYWxsb3dzIHRoZSAiaW4iIHR5cGVtYXAgdG8gYmUgdXNlZCB3aGVuIHNldHRpbmcgdGhlIHZhbHVlLgogICAgICAgICAgIEZvciBleGFtcGxlLCB0aGlzIHR5cGVtYXAKCiAgICAgICAgICAgICAgICV0eXBlbWFwKHB5dGhvbixpbikgaW50ICpiYXIgewogICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgbm93IG1hdGNoZXMgVmVjdG9yOjpiYXIuICBJdCBzaG91bGQgYmUgbm90ZWQgdGhhdCB0aGlzIHdpbGwgYWxzbwogICAgICAgICAgIG1hdGNoIGFueSBmdW5jdGlvbiB3aXRoIGFuIGFyZ3VtZW50IG9mICJpbnQgKmJhciIgKHNvIHlvdSBzaG91bGQKICAgICAgICAgICBiZSBjYXJlZnVsKS4KICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUuIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgo5LzIwLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBGaXhlZCBTRiBidWcgIzQ2MjY0MiBzZXR0aW5nIHN0cmluZyB2YWx1ZXMgaW4gc3RydWN0dXJlcwoKOS8yMC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgU0YgYnVnICM0NjIzOTggcHJvYmxlbSB3aXRoIG5lc3RlZCB0ZW1wbGF0ZXMuCgo5LzIwLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBGaXhlZCBTRiBidWcgIzQ2MTYyNiBwcm9ibGVtIHdpdGggZm9ybWF0dGluZyBhbmQgQysrIGNvbW1lbnRzLgogICAgICAgICAgICAKOS8yMC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgU0YgYnVnICM0NjI4NDUgV3Jvbmcgb3duZXJzaGlwIG9mIHJldHVybmVkIG9iamVjdHMuCiAgICAgICAgICAgCjkvMTkvMjAwMTogYmVhemxleQogICAgICAgICAgIEZpeGVkIFNGIGJ1ZyAjNDU5MzY3LiAgRGVmYXVsdCBjb25zdHJ1Y3RvcnMgZm9yIGNsYXNzZXMKICAgICAgICAgICB3aXRoIHB1cmUgdmlydHVhbCBtZXRob2RzLgoKOS8xOS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgcHJvYmxlbSB3aXRoIGRlZmF1bHQgYXJndW1lbnRzIGFuZCBjbGFzcyBzY29wZS4gIEZvcgogICAgICAgICAgIGV4YW1wbGU6CgogICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgIGVudW0gYmFyIHsgRk9PLCBCQVIgfTsKICAgICAgICAgICAgICAgICAgdm9pZCBibGFoKGJhciBiID0gRk9PKTsKICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgU1dJRyBub3cgY29ycmVjdGx5IGdlbmVyYXRlcyBhIGRlZmF1bHQgdmFsdWUgb2YgIkZvbzo6Rk9PIiBmb3IKICAgICAgICAgICB0aGUgYmxhaCgpIG1ldGhvZCBhYm92ZS4gIFRoaXMgdXNlZCB0byB3b3JrIGluIDEuMSwgYnV0IHdhcwogICAgICAgICAgIGJyb2tlbiBpbiAxLjMuNy4gICBCdWcgcmVwb3J0ZWQgYnkgTWlrZSBSb21iZXJnLgoKVmVyc2lvbiAxLjMuNyAgKFNlcHRlbWJlciAzLCAyMDAxKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cgo5LzAyLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBBZGRlZCBzcGVjaWFsICVpZ25vcmUgZGlyZWN0aXZlIHRvIGlnbm9yZSBkZWNsYXJhdGlvbnMuICBUaGlzCiAgICAgICAgICAgZmVhdHVyZSB3b3JrcyBleGFjdGx5IGxpa2UgJXJlbmFtZS4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICVpZ25vcmUgIGZvbzsgICAgICAgIC8vIElnbm9yZSBhbGwgZGVjbGFyYXRpb25zIGZvbwogICAgICAgICAgICAgJWlnbm9yZSAgOjpmb287ICAgICAgLy8gT25seSBpZ25vcmUgZm9vIGluIGdsb2JhbCBzY29wZQogICAgICAgICAgICAgJWlnbm9yZSAgU3BhbTo6Zm9vOyAgLy8gT25seSBpZ25vcmUgaW4gY2xhc3MgU3BhbQogICAgICAgICAgICAgJWlnbm9yZSAgKjo6Zm9vOyAgICAgLy8gSWdub3JlIGluIGFsbCBjbGFzc2VzCgogICAgICAgICAgICVpZ25vcmUgY2FuIGFsc28gYmUgcGFyYW1ldGVyaXplZC4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICVpZ25vcmUgZm9vKGludCk7CiAgICAgICAgICAgICAlaWdub3JlIDo6Zm9vKGludCk7CiAgICAgICAgICAgICAlaWdub3JlIFNwYW06OmZvbyhpbnQpOwogICAgICAgICAgICAgJWlnbm9yZSAqOjpmb28oaW50KTsKCiAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgogICAgICAgICAgICAKCjkvMDIvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCiAgICAgICAgICAgW0phdmFdIHNoYWRvd2NvZGUgcHJhZ21hIG1vZGlmaWVkIHNvIHRoYXQgdGhlIGNvZGUgdGhhdCBpcyBvdXRwdXQgCiAgICAgICAgICAgaW4gdGhlIHNoYWRvdyBmaWxlIGlzIHBsYWNlZCByZWxhdGl2ZSB0byB3aGVyZSBpdCBpcyBwbGFjZWQgaW4gdGhlIAogICAgICAgICAgIGMvYysrIGNvZGUuIFRoaXMgYWxsb3dzIHN1cHBvcnQgZm9yIEphdmFEb2MgZnVuY3Rpb24gY29tbWVudHMuIAoKOS8wMS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgU0YgUGF0Y2ggWyAjNDQ3NzkxIF0gRml4IGZvciBweXRob24gLWludGVyZmFjZSBvcHRpb24uCiAgICAgICAgICAgU3VibWl0dGVkIGJ5IFRhcm4gV2Vpc25lciBCdXJ0b24uCgo5LzAxLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBTV0lHIG5vIGxvbmdlciBnZW5lcmF0ZXMgZGVmYXVsdCBjb25zdHJ1Y3RvcnMvZGVzdHJ1Y3RvcnMKICAgICAgICAgICBmb3IgYSBjbGFzcyBpZiBpdCBvbmx5IGRlZmluZXMgYSBwcml2YXRlL3Byb3RlY3RlZCBjb25zdHJ1Y3RvcgogICAgICAgICAgIG9yIGRlc3RydWN0b3Igb3IgaWYgYW55IG9uZSBvZiBpdHMgYmFzZSBjbGFzc2VzIG9ubHkgaGFzCiAgICAgICAgICAgcHJpdmF0ZSBjb25zdHJ1Y3RvcnMvZGVzdHJ1Y3RvcnMuICBUaGlzIHdhcyByZXBvcnRlZCBpbgogICAgICAgICAgIFNGIFBhdGNoIFsgIzQ0NDI4MSBdIG5vbnB1YmxpYy9kZWZhdWx0L2luaGVyZXRlZCBjdG9yL2R0b3IKICAgICAgICAgICBieSBNYXJjZWxvIE1hdHVzLgoKOS8wMS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgQWRkZWQgcGF0Y2ggdG8gUGVybDUgbW9kdWxlIHRoYXQgYWxsb3dzIGNvbnN0YW50cyB0byBiZQogICAgICAgICAgIHdyYXBwZWQgYXMgY29uc3RhbnRzIHRoYXQgZG9uJ3QgcmVxdWlyZSB0aGUgbGVhZGluZyAkLgogICAgICAgICAgIFRoaXMgZmVhdHVyZSBpcyBlbmFibGVkIHVzaW5nIHRoZSAtY29uc3Qgb3B0aW9uLgogICAgICAgICAgIFBhdGNoIGNvbnRyaWJ1dGVkIGJ5IFJpY2ggV2FsZXMuCiAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKOC8zMS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgQWRkZWQgcGFyc2luZyBzdXBwb3J0IGZvciB0aGUgJ3ZvbGF0aWxlJyB0eXBlIHF1YWxpZmllci4KICAgICAgICAgICB2b2xhdGlsZSBkb2Vzbid0IG1lYW4gYW55dGhpbmcgdG8gU1dJRywgYnV0IGl0IGlzCiAgICAgICAgICAgbmVlZGVkIHRvIHByb3Blcmx5IGdlbmVyYXRlIHByb3RvdHlwZXMgZm9yIGRlY2xhcmF0aW9ucwogICAgICAgICAgIHRoYXQgdXNlIGl0LiAgSXQncyBhbHNvIGJlZW4gYWRkZWQgdG8gbWFrZSB0aGUgU1dJRyB0eXBlCiAgICAgICAgICAgc3lzdGVtIG1vcmUgY29tcGxldGUuCiAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKOC8zMC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgQWRkZWQgc3VwcG9ydCBmb3IgcGFyYW1ldGVyaXplZCAlcmVuYW1lIGRpcmVjdGl2ZS4gICoqKiBUaGlzCiAgICAgICAgICAgbmV3IGZlYXR1cmUgY2FuIGJlIHVzZWQgdG8gZ3JlYXRseSBzaW1wbGlmeSB0aGUgdGFzayBvZgogICAgICAgICAgIHJlc29sdmluZyBvdmVybG9hZGVkIG1ldGhvZHMgYW5kIGZ1bmN0aW9ucy4gKioqCiAgICAgICAgICAgCiAgICAgICAgICAgSW4gcHJpb3IgdmVyc2lvbnMgb2YgU1dJRywgdGhlICVyZW5hbWUgZGlyZWN0aXZlIHdhcwogICAgICAgICAgIHVzZWQgdG8gY29uc2lzdGVudGx5IGFwcGx5IGFuIGlkZW50aWZpZXIgcmVuYW1pbmcuIEZvciAKICAgICAgICAgICBleGFtcGxlLCBpZiB5b3Ugc2FpZCB0aGlzOgoKICAgICAgICAgICAgICAgICVyZW5hbWUgZm9vIGJhcjsKCiAgICAgICAgICAgRXZlcnkgb2NjdXJyZW5jZSBvZiAnZm9vJyB3b3VsZCBiZSByZW5hbWVkIHRvICdiYXInLiAKICAgICAgICAgICBBbHRob3VnaCB0aGlzIHdvcmtzIGZpbmUgZm9yIHJlc29sdmluZyBhIGNvbmZsaWN0IHdpdGggYQogICAgICAgICAgIHRhcmdldCBsYW5ndWFnZSByZXNlcnZlZCB3b3JkLCBpdCBpcyB1c2VsZXNzIGZvcgogICAgICAgICAgIGZvciBkZWFsaW5nIHdpdGggb3ZlcmxvYWRlZCBtZXRob2RzLiAgICBUaGlzIGlzIGJlY2F1c2UKICAgICAgICAgICBhbGwgbWV0aG9kcyBhcmUgc2ltcGx5IHJlbmFtZWQgdG8gdGhlIHNhbWUgdGhpbmcgCiAgICAgICAgICAgKGdlbmVyYXRpbmcgdGhlIHNhbWUgY29uZmxpY3QgYXMgYmVmb3JlKS4KCiAgICAgICAgICAgVGhlcmVmb3JlLCB0aGUgb25seSB3YXkgdG8gZGVhbCB3aXRoIG92ZXJsb2FkZWQgbWV0aG9kcwogICAgICAgICAgIHdhcyB0byBnbyB0aHJvdWdoIGFuZCBpbmRpdmlkdWFsbHkgcmVuYW1lIHRoZW0gYWxsIHVzaW5nCiAgICAgICAgICAgJW5hbWUuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBiYXIodm9pZCk7CiAgICAgICAgICAgICAgICAgJW5hbWUoYmFyX2kpIHZpcnR1YWwgdm9pZCBiYXIoaW50KTsKICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgIH07CgogICAgICAgICAgIFRvIG1ha2UgbWF0dGVycyB3b3JzZSwgeW91IGhhZCB0byBkbyB0aGlzIGZvciBhbGwKICAgICAgICAgICBkZXJpdmVkIGNsYXNzZXMgdG9vLgoKICAgICAgICAgICAgIGNsYXNzIFNwYW0gOiBwdWJsaWMgRm9vIHsKICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgYmFyKHZvaWQpOwogICAgICAgICAgICAgICAgICVuYW1lKGJhcl9pKSB2aXJ0dWFsIHZvaWQgYmFyKGludCk7CiAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICB9OwoKICAgICAgICAgICBOZWVkbGVzcyB0byBzYXksIHRoaXMgbWFrZXMgaXQgZXh0cmVtZWx5IGhhcmQgdG8gcmVzb2x2ZQogICAgICAgICAgIG92ZXJsb2FkaW5nIHdpdGhvdXQgYSBsb3Qgb2Ygd29yayBhbmQgbWFrZXMgaXQgYWxtb3N0CiAgICAgICAgICAgaW1wb3NzaWJsZSB0byB1c2UgU1dJRyBvbiByYXcgQysrIC5oIGZpbGVzLgoKICAgICAgICAgICBUbyBmaXggdGhpcywgJXJlbmFtZSBub3cgYWNjZXB0cyBwYXJhbWV0ZXIgZGVjbGFyYXRvcnMuCiAgICAgICAgICAgVGhlIHN5bnRheCBoYXMgYWxzbyBiZWVuIGNoYW5nZWQgc2xpZ2h0bHkuICBGb3IgZXhhbXBsZSwKICAgICAgICAgICB0aGUgZm9sbG93aW5nIGRlY2xhcmF0aW9uIHJlbmFtZXMgYWxsIG9jY3VycmVuY2VzIG9mICdiYXIoaW50KScKICAgICAgICAgICB0byAnYmFyX2knLCBsZWF2aW5nIGFueSBvdGhlciBvY2N1cnJlbmNlIG9mICdiYXInIGFsb25lLgoKICAgICAgICAgICAgICVyZW5hbWUoYmFyX2kpIGJhcihpbnQpOwoKICAgICAgICAgICBVc2luZyB0aGlzIGZlYXR1cmUsIHlvdSBjYW4gbm93IHNlbGVjdGl2ZWx5IHJlbmFtZSAKICAgICAgICAgICBjZXJ0YWluIGRlY2xhcmF0aW9ucyBpbiBhZHZhbmNlLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgJXJlbmFtZShiYXJfaSkgYmFyKGludCk7CiAgICAgICAgICAgICAlcmVuYW1lKGJhcl9kKSBiYXIoZG91YmxlKTsKCiAgICAgICAgICAgICAvLyBJbmNsdWRlIHJhdyBDKysgaGVhZGVyICAgIAogICAgICAgICAgICAgJWluY2x1ZGUgImhlYWRlci5oIgoKICAgICAgICAgICBXaGVuICVyZW5hbWUgaXMgdXNlZCBpbiB0aGlzIG1hbm5lciwgYWxsIG9jY3VycmVuY2Ugb2YgYmFyKGludCkKICAgICAgICAgICBhcmUgcmVuYW1lZCB3aGVyZXZlciB0aGV5IG1pZ2h0IG9jY3VyLiAgTW9yZSBjb250cm9sIGlzIG9idGFpbmVkCiAgICAgICAgICAgdGhyb3VnaCBleHBsaWNpdCBxdWFsaWZpY2F0aW9uLiBGb3IgZXhhbXBsZSwKCiAgICAgICAgICAgICAgJXJlbmFtZShiYXJfaSkgOjpiYXIoaW50KTsKCiAgICAgICAgICAgb25seSBhcHBsaWVzIHRoZSByZW5hbWluZyBpZiBiYXIoaW50KSBpcyBkZWZpbmVkIGluIHRoZSBnbG9iYWwgc2NvcGUuCiAgICAgICAgICAgVGhlIGRlY2xhcmF0aW9uLAogICAgIAogICAgICAgICAgICAgICVyZW5hbWUoYmFyX2kpIEZvbzo6YmFyKGludCk7CgogICAgICAgICAgIGFwcGxpZXMgdGhlIHJlbmFtaW5nIGlmIGJhcihpbnQpIGlzIGRlZmluZWQgaW4gYSBjbGFzcyBGb28uCiAgICAgICAgICAgVGhpcyBsYXR0ZXIgZm9ybSBhbHNvIHN1cHBvcnRzIGluaGVyaXRhbmNlLiAgVGhlcmVmb3JlLCBpZiB5b3UKICAgICAgICAgICBoYWQgYSBjbGFzcyBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICBjbGFzcyBTcGFtIDogcHVibGljIEZvbyB7CiAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgIHZvaWQgYmFyKGludCk7CiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgVGhlIFNwYW06OmJhcihpbnQpIG1ldGhvZCB3b3VsZCBhbHNvIGJlIHJlbmFtZWQgKHNpbmNlIFNwYW0gCiAgICAgICAgICAgaXMgYSBzdWJjbGFzcyBvZiBGb28pLiAgIFRoaXMgbGF0dGVyIGZlYXR1cmUgbWFrZXMgaXQgZWFzeQogICAgICAgICAgIGZvciBTV0lHIHRvIGFwcGx5IGEgY29uc2lzdGVudCByZW5hbWluZyBhY3Jvc3MgYW4gZW50aXJlCiAgICAgICAgICAgY2xhc3MgaGllcmFyY2h5IHNpbXBseSBieSBzcGVjaWZ5aW5nIHJlbmFtaW5nIHJ1bGVzIGZvcgogICAgICAgICAgIHRoZSBiYXNlIGNsYXNzLgoKICAgICAgICAgICBBIGNsYXNzIHdpbGRjYXJkIG9mICogY2FuIGJlIHVzZWQgaWYgeW91IHdhbnQgdG8gcmVuYW1pbmcKICAgICAgICAgICBhbGwgbWF0Y2hpbmcgbWVtYmVycyBvZiBhbGwgY2xhc3Nlcy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAlcmVuYW1lKGJhcl9pKSAqOjpiYXIoaW50KTsKCiAgICAgICAgICAgd2lsbCByZW5hbWUgYWxsIG1lbWJlcnMgYmFyKGludCkgdGhhdCBhcmUgZGVmaW5lZCBpbiBjbGFzc2VzLgogICAgICAgICAgIEl0IHdpbGwgbm90IHJlbmFtZWQgZGVmaW5pdGlvbnMgb2YgYmFyKGludCkgaW4gdGhlIGdsb2JhbAogICAgICAgICAgIHNjb3BlLgoKICAgICAgICAgICBUaGUgb2xkIHVzZSBvZiAlcmVuYW1lIGlzIHN0aWxsIHN1cHBvcnRlZCwgYnV0IGlzIHNvbWV3aGF0CiAgICAgICAgICAgZW5oYW5jZWQuICAKCiAgICAgICAgICAgICAgJXJlbmFtZShmb28pIGJhcjsgICAgICAvLyBSZW5hbWVzIGFsbCBvY2N1cnJlbmNlcyBvZiAnYmFyJy4KICAgICAgICAgICAgICAlcmVuYW1lKGZvbykgOjpiYXI7ICAgIC8vIFJlbmFtZSBhbGwgJ2JhcicgaW4gZ2xvYmFsIHNjb3BlIG9ubHkuCiAgICAgICAgICAgICAgJXJlbmFtZShmb28pICo6OmJhcjsgICAvLyBSZW5hbWUgYWxsICdiYXInIGluIGNsYXNzZXMgb25seS4KICAgICAgICAgICAgICAlcmVuYW1lKGZvbykgRm9vOjpiYXI7IC8vIFJlbmFtZSBhbGwgJ2JhcicgZGVmaW5lZCBpbiBjbGFzcyBGb28uCgogICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjgvMzAvMjAwMTogYmVhemxleQogICAgICAgICAgIEFkZGVkIHN1cHBvcnQgZm9yIGRhdGEtbWVtYmVyIHRvIG1lbWJlci1mdW5jdGlvbiAKICAgICAgICAgICB0cmFuc2Zvcm1hdGlvbi4gIEZvciBleGFtcGxlLCBzdXBwb3NlIHlvdSBoYWQgYQogICAgICAgICAgIHN0cnVjdHVyZSBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgc3RydWN0IFZlY3RvciB7CiAgICAgICAgICAgICAgICAgICAgZG91YmxlIHgseTsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgIE5vdyBzdXBwb3NlIHRoYXQgeW91IHdhbnRlZCB0byBhY2Nlc3MgeCBhbmQgeSAKICAgICAgICAgICB0aHJvdWdoIGEgbWVtYmVyIGZ1bmN0aW9uIGludGVyZmFjZSBpbnN0ZWFkIAogICAgICAgICAgIG9mIHRoZSB1c3VhbCBTV0lHIGJlaGF2aW9yLiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgZi5zZXRfeCgzLjQpICAgICAgIyBpbnN0ZWFkIG9mIGYueCA9IDMuNAogICAgICAgICAgICAgIHggPSBmLmdldF94KCkgICAgICMgaW5zdGVhZCBvZiB4ID0gZi54CgogICAgICAgICAgIFRvIGRvIHRoaXMsIHNpbXBseSB1c2UgdGhlIG5ldyAlYXR0cmlidXRlZnVuYwogICAgICAgICAgIGRpcmVjdGl2ZS4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAlYXR0cmlidXRlZnVuYyhnZXRfJXMsc2V0XyVzKQogICAgICAgICAgICAgIHN0cnVjdCBWZWN0b3IgewogICAgICAgICAgICAgICAgIGRvdWJsZSB4LHk7CiAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAlbm9hdHRyaWJ1dGVmdW5jCgogICAgICAgICAgIFRoZSBhcmd1bWVudHMgdG8gJWF0dHJpYnV0ZWZ1bmMgYXJlIEMtc3R5bGUgcHJpbnRmCiAgICAgICAgICAgZm9ybWF0IHN0cmluZ3MgdGhhdCBkZXRlcm1pbmUgdGhlIG5hbWluZyBjb252ZW50aW9uCiAgICAgICAgICAgdG8gdXNlLiAgJXMgaXMgcmVwbGFjZWQgd2l0aCB0aGUgYWN0dWFsIG5hbWUgb2YgdGhlCiAgICAgICAgICAgZGF0YSBtZW1iZXIuIFNXSUcgcHJvdmlkZXMgYSBudW1iZXIgb2YgcHJpbnRmCiAgICAgICAgICAgZXh0ZW5zaW9ucyB0aGF0IG1pZ2h0IGhlbHAuICBGb3IgZXhhbXBsZSwgaWYgeW91CiAgICAgICAgICAgd2FudGVkIHRvIHRpdGxlIGNhc2UgYWxsIG9mIHRoZSBhdHRyaWJ1dGVzLCB5b3UKICAgICAgICAgICBjb3VsZCBkbyB0aGlzOgoKICAgICAgICAgICAgICAlYXR0cmlidXRlZnVuYyhnZXQlKHRpdGxlKXMsc2V0JSh0aXRsZSlzKTsKCiAgICAgICAgICAgVGhpcyB3aWxsIHR1cm4gYW4gYXR0cmlidXRlICdiYXInIHRvICdnZXRCYXIoKScgYW5kICdzZXRCYXIoKScuCgogICAgICAgICAgIChzb21lb25lIHJlcXVlc3RlZCB0aGlzIGxvbmcgYWdvLCBidXQgSSBmaW5hbGx5IGZpZ3VyZWQKICAgICAgICAgICBob3cgdG8gaW1wbGVtZW50IGl0IGluIGEgc3RyYWlnaHRmb3J3YXJkIG1hbm5lcikuCiAgICAgICAgICAgKioqIEVYUEVSSU1FTlRBTCBORVcgRkVBVFVSRSAqKioKICAgICAgICAgICAKOC8zMC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgU1dJRyBub3cgYXV0b21hdGljYWxseSBnZW5lcmF0ZXMgZGVmYXVsdCBjb25zdHJ1Y3RvcnMKICAgICAgICAgICBhbmQgZGVzdHJ1Y3RvcnMgaWYgbm9uZSBhcmUgZGVmaW5lZC4gIFRoaXMgdXNlZCB0byBiZQogICAgICAgICAgIGVuYWJsZWQgd2l0aCBhIGNvbW1hbmQgbGluZSBzd2l0Y2ggLW1ha2VfZGVmYXVsdCwgYnV0CiAgICAgICAgICAgbW9zdCBwZW9wbGUgd2FudCB0aGVzZSBmdW5jdGlvbnMgYW55d2F5cy4gIFRvIHR1cm4KICAgICAgICAgICBvZmYgdGhpcyBiZWhhdmlvciB1c2UgdGhlIC1ub19kZWZhdWx0IG9wdGlvbiBvciBpbmNsdWRlCiAgICAgICAgICAgdGhlIGZvbGxvd2luZyBwcmFnbWEgaW4gdGhlIGludGVyZmFjZSBmaWxlOgogCiAgICAgICAgICAgICAgICAgJXByYWdtYSBub19kZWZhdWx0OwogIAogICAgICAgICAgIFRoaXMgbWF5IGJyZWFrIGNlcnRhaW4gaW50ZXJmYWNlcyB0aGF0IGRlZmluZWQgdGhlaXIKICAgICAgICAgICBvd24gY29uc3RydWN0b3JzL2Rlc3RydWN0b3JzIHVzaW5nIHRoZSBzYW1lIG5hbWluZwogICAgICAgICAgIGNvbnZlbnRpb24gYXMgU1dJRy4gIElmIHNvLCB5b3Ugd2lsbCBnZXQgZHVwbGljYXRlCiAgICAgICAgICAgc3ltYm9scyB3aGVuIGNvbXBpbGluZyB0aGUgU1dJRyB3cmFwcGVyIGZpbGUuCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgo4LzI5LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBDaGFuZ2VzIHRvIFBlcmw1IHNoYWRvdyBjbGFzcyBjb2RlIGdlbmVyYXRpb24uICBJdGVyYXRvcnMKICAgICAgICAgICBhcmUgbm8gbG9uZ2VyIHN1cHBvcnRlZCAoRklSU1RLRVksIE5FWFRLRVkpLiAgQWxzbywgYXR0cmlidXRlCiAgICAgICAgICAgYWNjZXNzIGhhcyBiZWVuIGNoYW5nZWQgdG8gcmVseSBvbiBpbmhlcml0YW5jZSBpbiBvcmRlcgogICAgICAgICAgIHRvIHByb3ZpZGUgYmV0dGVyIGJlaGF2aW9yIGFjcm9zcyBtb2R1bGVzLiAgCgo4LzI4LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBWYXJpb3VzIG9ic2N1cmUgaW1wcm92ZW1lbnRzIHRvIHRoZSB0eXBlIHN5c3RlbSBhbmQgY2xhc3Nlcy4KICAgICAgICAgICBTdHJhbmdlIGRlY2xhcmF0aW9ucyBsaWtlIHRoaXMgYXJlIG5vdyB3cmFwcGVkIGNvcnJlY3RseQogICAgICAgICAgIChpLmUuLCB0aGUgZ2VuZXJhdGVkIHdyYXBwZXIgY29kZSBkb2Vzbid0IGNhdXNlIHRoZSBDKysKICAgICAgICAgICAgY29tcGlsZXIgdG8gZGllIHdpdGggYSB0eXBlIGVycm9yKS4KCiAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICB0eXBlZGVmIGRvdWJsZSBSZWFsOwogICAgICAgICAgICAgICAgIFJlYWwgZm9vKFJlYWwgKCpvcCkoUmVhbCxSZWFsKSwgUmVhbCB4LCBSZWFsIHkpOwogICAgICAgICAgICB9OwoKICAgICAgICAgICBJbmhlcml0YW5jZSBvZiB0eXBlcyBpcyBhbHNvIGhhbmRsZWQgY29ycmVjdGx5LgogICAgICAgICAgIAo4LzI4LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBDaGFuZ2VzIHRvIGNsYXNzIHdyYXBwZXJzLiAgIFdoZW4gU1dJRyBzZWVzIHR3byBjbGFzc2VzIGxpa2UgdGhpcywKIAogICAgICAgICAgIGNsYXNzIFggewogICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgIHZvaWQgZm9vKCk7CiAgICAgICAgICAgICAuLi4KICAgICAgICAgICB9CiAKICAgICAgICAgICBjbGFzcyBZIDogcHVibGljIFggewogICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgIHZvaWQgYmFyKCk7CiAgICAgICAgICAgICAuLi4KICAgICAgICAgICB9CiAKICAgICAgICAgICBpdCBub3cgb25seSBnZW5lcmF0ZXMgdHdvIHdyYXBwZXIgZnVuY3Rpb25zOgogCiAgICAgICAgICAgICBYX2ZvbyhYICp4KSB7IHgtPmZvbygpOyB9CiAgICAgICAgICAgICBZX2JhcihZICp5KSB7IHktPmJhcigpOyB9CiAKICAgICAgICAgICBVbmxpa2UgU1dJRzEuMTUsIHRoZSBmb28oKSBtZXRob2QgZG9lcyAqbm90KiBwcm9wYWdhdGUgdG8gYSB3cmFwcGVyCiAgICAgICAgICAgZnVuY3Rpb24gWV9mb28oKS4gSW5zdGVhZCwgdGhlIGJhc2UgY2xhc3MgbWV0aG9kIFhfZm9vKCkgbXVzdCBiZQogICAgICAgICAgIHVzZWQuCgogICAgICAgICAgIFRoaXMgY2hhbmdlIHNob3VsZCBub3QgYWZmZWN0IG1vZHVsZXMgdGhhdCB1c2Ugc2hhZG93IGNsYXNzZXMsIGJ1dAogICAgICAgICAgIGl0IG1pZ2h0IGJyZWFrIG1vZHVsZXMgdGhhdCBkaXJlY3RseSB1c2UgdGhlIGxvdy1sZXZlbCBDIHdyYXBwZXJzLgogICAgICAgICAgIFRoaXMgY2hhbmdlIGlzIGJlaW5nIG1hZGUgZm9yIGEgbnVtYmVyIG9mIHJlYXNvbnM6CgogICAgICAgICAgICAgICAtICBJdCBncmVhdGx5IHNpbXBsaWZpZXMgdGhlIGltcGxlbWVudGF0aW9uIG9mIFNXSUctLWVzcGVjaWFsbHkKICAgICAgICAgICAgICAgICAgd2l0aCBhbnRpY2lwYXRlZCBmdXR1cmUgY2hhbmdlcyBzdWNoIGFzIG92ZXJsb2FkZWQgbWV0aG9kcy4KCiAgICAgICAgICAgICAgIC0gIEl0IHJlc3VsdHMgaW4gc3Vic3RhbnRpYWxseSBsZXNzIHdyYXBwZXIgY29kZS0tZXNwZWNpYWxseQogICAgICAgICAgICAgICAgICBmb3IgYmlnIEMrKyBjbGFzcyBoaWVyYXJjaGllcyAoaW5oZXJpdGVkIGRlY2xhcmF0aW9ucwogICAgICAgICAgICAgICAgICBhcmUgbm8gbG9uZ2VyIGNvcGllZCBpbnRvIGV2ZXJ5IHNpbmdsZSBkZXJpdmVkIGNsYXNzKS4KCiAgICAgICAgICAgICAgIC0gIEl0IGFsbG93cyBmb3IgYmV0dGVyIGNvZGUgZ2VuZXJhdGlvbiBhY3Jvc3MgbXVsdGlwbGUKICAgICAgICAgICAgICAgICAgU1dJRyBnZW5lcmF0ZWQgbW9kdWxlcyAoY29kZSBpc24ndCByZXBsaWNhdGVkIGluCiAgICAgICAgICAgICAgICAgIGV2ZXJ5IHNpbmdsZSBtb2R1bGUpLgoKICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKCjgvMjIvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCiAgICAgICAgICAgUHJvdmlkZWQgc29tZSBXaW5kb3dzIGRvY3VtZW50YXRpb24gaW4gdGhlIFdpbiBkaXJlY3RvcnkgYW5kIHNvbWUKICAgICAgICAgICBWaXN1YWwgQysrIHByb2plY3QgZmlsZXMgZm9yIHJ1bm5pbmcgZXhhbXBsZXMgb24gV2luZG93cy4KCjgvMjgvMjAwMTogbWtvZXBwZQoJICAgW0d1aWxlXSBIYW5kbGUgcmVuYW1lZCBvdmVybG9hZGVkIGZ1bmN0aW9ucyBwcm9wZXJseTsKCSAgIHRoYW5rcyB0byBNYXJjIFpvbnpvbiA8TWFyYy5ab256b25AdW5pdi1yZW5uZXMxLmZyPiBmb3IgdGhlCgkgICBwYXRjaC4gIFNlZSB0aGUgbmV3IHRlc3QgY2FzZSBuYW1lX2N4eC4KCjgvMjcvMjAwMTogbWtvZXBwZQoJICAgW1RjbF0gUmVtb3ZlZCBsb3RzIG9mIHdhcm5pbmdzIGlzc3VlZCBieSB0aGUgU3VuIEZvcnRlCgkgICBjb21waWxlcnMsIHdoaWNoIHdlcmUgY2F1c2VkIGJ5IG1peGluZyBmdW5jdGlvbiBwb2ludGVycwoJICAgb2YgZGlmZmVyZW50IGxpbmthZ2VzIChDKysvQykuIAoKOC8yMy8yMDAxOiBta29lcHBlCgkgICBJbXByb3ZlZCB0aGUgTXpTY2hlbWUgbW9kdWxlIGJ5IHBvcnRpbmcgR3VpbGUncyBwb2ludGVyCgkgICB0eXBlIGNoZWNraW5nIHN5c3RlbSBhbmQgbWFraW5nIHR5cGUgZGlzcGF0Y2gKCSAgIHR5cGVtYXAtZHJpdmVuLiAKCjgvMjIvMjAwMTogYmVhemxleQogICAgICAgICAgIEVudGlyZWx5IG5ldyBzeW1ib2wgdGFibGUgcHJvY2Vzc2luZy4gICBTV0lHIHNob3VsZCBiZSBhYmxlIHRvCiAgICAgICAgICAgcmVwb3J0IG11Y2ggYmV0dGVyIGVycm9yIG1lc3NhZ2VzIGZvciBtdWx0aXBsZSBkZWNsYXJhdGlvbnMuIAogICAgICAgICAgIEFsc28sIHRoZSBuZXcgc3ltYm9sIHRhYmxlIGFsbG93cyBmb3Igb3ZlcmxvYWRlZCBmdW5jdGlvbnMKICAgICAgICAgICAoYWx0aG91Z2ggb3ZlcmxvYWRpbmcgaXNuJ3QgcXVpdGUgc3VwcG9ydGVkIGluIHRoZSBsYW5ndWFnZQogICAgICAgICAgIG1vZHVsZXMgeWV0KS4KCjgvMjIvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCiAgICAgICAgICAgKiBbSmF2YV0gJW5ldyBzdXBwb3J0IGFkZGVkLgogICAgICAgICAgICogW0phdmFdIFBhY2thZ2UgSk5JIG5hbWUgcmVmaXhlZCEKCjgvMTkvMjAwMTogYmVhemxleQogICAgICAgICAgIFB5dGhvbiBtb2R1bGUgbW9kaWZpZWQgdG8gc3VwcG9ydCBwb2ludGVycyB0byBDKysgbWVtYmVycy4gIFRoaXMKICAgICAgICAgICBpcyBhbiBleHBlcmltZW50YWwgZmVhdHVyZS4KICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCiAgICAgCjgvMTkvMjAwMTogYmVhemxleQogICAgICAgICAgIEFkZGVkIGxpbWl0ZWQgcGFyc2luZyBhbmQgZnVsbCB0eXBlLXN5c3RlbSBzdXBwb3J0IGZvciBwb2ludGVycyB0bwogICAgICAgICAgIG1lbWJlcnMuIE5vbmUgb2YgU1dJRydzIGxhbmd1YWdlIG1vZHVsZXMgcmVhbGx5IGtub3cgaG93IHRvIGRlYWwgd2l0aAogICAgICAgICAgIHRoaXMgc28gdGhpcyBpcyByZWFsbHkgb25seSBwcm92aWRlZCBmb3IgY29tcGxldGVuZXNzIGFuZCBmdXR1cmUKICAgICAgICAgICBleHBhbnNpb24uICBOb3RlOiBTV0lHIGRvZXMgbm90IHN1cHBvcnQgcG9pbnRlcnMgdG8gbWVtYmVycyB3aGljaCAKICAgICAgICAgICBhcmUgdGhlbXNlbHZlcyBwb2ludGVycyB0byBtZW1iZXJzLCByZWZlcmVuY2VzIHRvIHBvaW50ZXJzIHRvIG1lbWJlcnMsCiAgICAgICAgICAgb3Igb3RoZXIgY29tcGxpY2F0ZWQgZGVjbGFyYXRpb25zIGxpa2UgdGhpcy4KICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgo4LzE5LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBTV0lHIGlzIG11Y2ggYmV0dGVyIGF0IHBhcnNpbmcgY2VydGFpbiBDKysgZGVjbGFyYXRpb25zLiBPcGVyYXRvcnMgYW5kCiAgICAgICAgICAgZnJpZW5kcyBnZW5lcmFsbHkgZG9uJ3QgY2F1c2UgYW55bW9yZSBzeW50YXggZXJyb3JzLiAgSG93ZXZlciwgbmVpdGhlcgogICAgICAgICAgIGFyZSByZWFsbHkgc3VwcG9ydGVkLgoKOC8xOC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgQWRkZWQgKmhpZ2hseSogZXhwZXJpbWVudGFsIHN1cHBvcnQgZm9yIHdyYXBwaW5nIG9mIEMrKwogICAgICAgICAgIHRlbXBsYXRlIGRlY2xhcmF0aW9ucy4gIFNpbmNlIEMrKyB0ZW1wbGF0ZXMgYXJlIGVzc2VudGlhbGx5CiAgICAgICAgICAgZ2xvcmlmaWVkIG1hY3JvcyBhbmQgU1dJRyBoYXMgYSBmdWxseSBvcGVyYXRpb25hbCBDIAogICAgICAgICAgIHByZXByb2Nlc3NvciB3aXRoIG1hY3JvIHN1cHBvcnQsIHRoZSBwYXJzZXIgbm93IGNvbnZlcnRzCiAgICAgICAgICAgdGVtcGxhdGUgZGVjbGFyYXRpb25zIHRvIG1hY3Jvcy4gIEZvciBleGFtcGxlLCBhIGZ1bmN0aW9uCiAgICAgICAgICAgdGVtcGxhdGUgbGlrZSB0aGlzCgogICAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBUPiBUIG1heChUIGEsIFQgYik7CgogICAgICAgICAgIGlzIGludGVybmFsbHkgY29udmVydGVkIGludG8gYSBtYWNybyBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAlZGVmaW5lICVfdGVtcGxhdGVfbWF4KF9fbmFtZSxUKQogICAgICAgICAgICAgICAlbmFtZShfX25hbWUpIFQgbWF4KFQgYSwgVCBiKTsKICAgICAgICAgICAgICAgJWVuZGRlZgoKICAgICAgICAgICBUbyBpbnN0YW50aWF0ZSBhIHZlcnNpb24gb2YgdGhlIHRlbXBsYXRlLCBhIHNwZWNpYWwgJXRlbXBsYXRlIGRlY2xhcmF0aW9uCiAgICAgICAgICAgaXMgdXNlZCBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAldGVtcGxhdGUobWF4aW50KSBtYXg8aW50PjsgICAgICAgICAgCiAgICAgICAgICAgICAgICV0ZW1wbGF0ZShtYXhkb3VibGUpIG1heDxkb3VibGU+OwoKICAgICAgICAgICBUaGUgcGFyYW1ldGVyIHRvIHRoZSAldGVtcGxhdGUgZGlyZWN0aXZlIG11c3QgYmUgcHJvcGVyIEMgaWRlbnRpZmllciB0aGF0J3MKICAgICAgICAgICB1c2VkIHRvIHVuaXF1ZWx5IG5hbWUgdGhlIHJlc3VsdGluZyBpbnN0YW50aWF0aW9uLiAgIFdoZW4gdXNlZCwgdGhlCiAgICAgICAgICAgdGhlIGV4cGFuZGVkIG1hY3JvIGxvb2tzIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgJW5hbWUobWF4aW50KSBpbnQgbWF4KGludCBhLCBpbnQgYik7CiAgICAgICAgICAgICAgJW5hbWUobWF4ZG91YmxlKSBkb3VibGUgbWF4KGRvdWJsZSBhLCBkb3VibGUgYik7CgogICAgICAgICAgIEEgc2ltaWxhciB0ZWNobmlxdWUgaXMgdXNlZCBmb3IgdGVtcGxhdGUgY2xhc3Nlcy4gICBGb3IgaW5zdGFuY2U6CgogICAgICAgICAgICAgIHRlbXBsYXRlPGNsYXNzIFQ+IGNsYXNzIHZlY3RvciB7CiAgICAgICAgICAgICAgICAgVCAqZGF0YTsKICAgICAgICAgICAgICAgICBpbnQgc3o7CiAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgIHZlY3RvcihpbnQgbml0ZW1zKTsKICAgICAgICAgICAgICAgICBUICpnZXQoaW50IG4pOwogICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgIH07CgogICAgICAgICAgIEdldHMgY29udmVydGVkIGludG8gYSBtYWNybyBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICVkZWZpbmUgJV90ZW1wbGF0ZV92ZWN0b3IoX19uYW1lLCBUKQogICAgICAgICAgICAgICV7CiAgICAgICAgICAgICAgdHlwZWRlZiB2ZWN0b3I8VD4gX19uYW1lOwogICAgICAgICAgICAgICV9CiAgICAgICAgICAgICAgY2xhc3MgX19uYW1lIHsKICAgICAgICAgICAgICAgICBUICpkYXRhOwogICAgICAgICAgICAgICAgIGludCBzejsKICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgX19uYW1lKGludCBuaXRlbXMpOwogICAgICAgICAgICAgICAgIFQgKmdldChpbnQgbik7CiAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICB0eXBlZGVmIF9fbmFtZSB2ZWN0b3I8VD47CiAgICAgICAgICAgICAgJWVuZGRlZgoKICAgICAgICAgICBBbiBhIHNwZWNpZmljIGluc3RhbnRpYXRpb24gaXMgY3JlYXRlZCBpbiBleGFjdGx5IHRoZSBzYW1lIHdheToKCiAgICAgICAgICAgICAldGVtcGxhdGUoaW50dmVjKSB2ZWN0b3I8aW50PjsKCiAgICAgICAgICAgVGhlIHJlc3VsdGluZyBjb2RlIHBhcnNlZCBieSBTV0lHIGlzIHRoZW46CgogICAgICAgICAgICAgICV7CiAgICAgICAgICAgICAgdHlwZWRlZiB2ZWN0b3I8aW50PiBpbnR2ZWM7CiAgICAgICAgICAgICAgJX0KICAgICAgICAgICAgICBjbGFzcyBpbnR2ZWMgewogICAgICAgICAgICAgICAgICBpbnQgKmRhdGE7CiAgICAgICAgICAgICAgICAgIGludCBzejsKICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgIGludHZlYyhpbnQgbml0ZW1zKTsKICAgICAgICAgICAgICAgICAgaW50ICpnZXQoaW50IG4pOwogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgIHR5cGVkZWYgaW50dmVjIHZlY3RvcjxpbnQ+OwoKICAgICAgICAgICBOb3RlOiB0aGUgbGFzdCB0eXBlZGVmIGlzIG5vbi1zdGFuZGFyZCBDIGFuZCBpcyB1c2VkIGJ5IFNXSUcgdG8gcHJvdmlkZQogICAgICAgICAgIGFuIGFzc29jaWF0aW9uIGJldHdlZW4gdGhlIG5hbWUgImludHZlYyIgYW5kIHRoZSB0ZW1wbGF0ZSB0eXBlIAogICAgICAgICAgICJ2ZWN0b3I8aW50PiIuCgogICAgICAgICAgIENBVVRJT046ICBUaGlzIGlzIGFuIGV4cGVyaW1lbnRhbCBmZWF0dXJlIGFuZCB0aGUgZmlyc3QgdGltZSBTV0lHIGhhcwogICAgICAgICAgIHN1cHBvcnRlZCBDKysgdGVtcGxhdGVzLiAgIEVycm9yIHJlcG9ydGluZyBpcyBlc3NlbnRpYWwgbm9uLWV4aXN0ZW50LgogICAgICAgICAgIEl0IHdpbGwgcHJvYmFibHkgYnJlYWsgaW4gY2VydGFpbiBjYXNlcy4KICAgICAgICAgICAqKiogRVhQRVJJTUVOVEFMIE5FVyBGRUFUVVJFICoqKioKCjgvMTUvMjAwMTogYmVhemxleQogICAgICAgICAgIENoYW5nZSB0byB3cmFwcGluZyBvZiBtdWx0aS1kaW1lbnNpb25hbCBhcnJheXMuICBBcnJheXMKICAgICAgICAgICBhcmUgbm93IHByb3Blcmx5IG1hcHBlZCB0byBhIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YKICAgICAgICAgICBvbmUgbGVzcyBkaW1lbnNpb24uICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICBpbnQgWzEwXTsgICAgICAgICAgICAgIC0tPiAgaW50ICoKICAgICAgICAgICAgICAgIGludCBbMTBdWzIwXTsgICAgICAgICAgLS0+ICBpbnQgKCopWzIwXTsKICAgICAgICAgICAgICAgIGludCBbMTBdWzIwXVszMF07ICAgICAgLS0+ICBpbnQgKCopWzIwXVszMF07CgogICAgICAgICAgIFRoaXMgY2hhbmdlIG1heSBicmVhayBjZXJ0YWluIFNXSUcgZXh0ZW5zaW9ucyBiZWNhdXNlCiAgICAgICAgICAgb2xkZXIgdmVyc2lvbnMgc2ltcGx5IG1hcHBlZCBhbGwgYXJyYXlzIGludG8gYSBzaW5nbGUKICAgICAgICAgICBwb2ludGVyIHN1Y2ggYXMgImludCAqIi4gICBBbHRob3VnaCBwb3NzaWJseSB1bnVzdWFsLCAKICAgICAgICAgICB0aGUgbmV3IHZlcnNpb24gaXMgY29ycmVjdCBpbiB0ZXJtcyBvZiB0aGUgQyB0eXBlIHN5c3RlbS4KICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKICAgIAo4LzA2LzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgICogW0phdmFdIEFycmF5IHNldHRlcnMgZ2VuZXJhdGVkIGZvciBzdHJ1Y3QvY2xhc3MgYXJyYXkgbWVtYmVycy4KCjgvMTMvMjAwMTogYmVhemxleQogICAgICAgICAgIE1hbnkgaW1wcm92ZW1lbnRzIHRvIFRjbC9QZXJsL1B5dGhvbiBtb2R1bGVzIHRvIGJldHRlcgogICAgICAgICAgIHdvcmsgd2l0aCBtdWx0aXBsZSBpbnRlcmZhY2UgZmlsZXMgYW5kIHRoZSAlaW1wb3J0IGRpcmVjdGl2ZS4KCjgvMTMvMjAwMTogYmVhemxleQogICAgICAgICAgIEZpeGVkIHVwIHRoZSBiZWhhdmlvciBvZiAlaW1wb3J0IGluIHRoZSBQeXRob24gbW9kdWxlLgogICAgICAgICAgIFNXSUcgbm8gbG9uZ2VyIHBvbGx1dGVzIHRoZSBtb2R1bGUgbmFtZXNwYWNlIGJ5IHVzaW5nCiAgICAgICAgICAgJ2Zyb20gbW9kdWxlIGltcG9ydCAqJyB0byByZWZlciB0byB0aGUgb3RoZXIgbW9kdWxlLiAKICAgICAgICAgICBJbnN0ZWFkLCBpdCBkb2VzIGEgcHJvcGVyICdpbXBvcnQgbW9kdWxlJy4gICBBbHNvLCBTV0lHCiAgICAgICAgICAgbWF5IHdvcmsgYSBsb3QgYmV0dGVyIHdoZW4gaW1wb3J0aW5nIG1vZHVsZXMgdGhhdCBpbmNsdWRlCiAgICAgICAgICAgcmVmZXJlbmNlcyB0byBvdGhlciBpbXBvcnRlZCBtb2R1bGVzLgoKOC8xMy8yMDAxOiBta29lcHBlCgkgICBBZGRlZCBuZXcgdHlwZW1hcCBzdWJzdGl0dXRpb25zLCBnZW5lcmFsaXppbmcgdGhvc2Ugb2YgdGhlCgkgICBHdWlsZS1zcGVjaWZpYyA1LzI3LzIwMDEgY2hhbmdlczogCgkgICAqICRkZXNjcmlwdG9yIGlzIHRoZSBzYW1lIGFzIFNXSUdUWVBFJG1hbmdsZSwgYnV0IGFsc28KCSAgICAgZW5zdXJlcyB0aGF0IHRoZSB0eXBlIGRlc2NyaXB0b3Igb2YgdGhpcyBuYW1lIGdldHMKCSAgICAgZGVmaW5lZC4KCSAgICogJCp0eXBlLCAkKmx0eXBlLCAkKm1hbmdsZSwgJCpkZXNjcmlwdG9yIGFyZSB0aGUgc2FtZSBhcwoJICAgICB0aGUgdmFyaWFudHMgd2l0aG91dCBzdGFyLCBidXQgdGhleSBSRU1PVkUgb25lIGxldmVsIG9mCgkgICAgIHBvaW50ZXJzIGZyb20gdGhlIHR5cGUuIChUaGlzIGlzIG9ubHkgdmFsaWQgZm9yIHBvaW50ZXIgCgkgICAgIHR5cGVzLikKCSAgICogJCZ0eXBlLCAkJmx0eXBlLCAkJm1hbmdsZSwgJCZkZXNjcmlwdG9yIGFyZSB0aGUgc2FtZSBhcwoJICAgICB0aGUgdmFyaWFudHMgd2l0aG91dCBhbXBlcnNhbmQsIGJ1dCB0aGV5IEFERCBvbmUgbGV2ZWwgb2YKCSAgICAgcG9pbnRlcnMgdG8gdGhlIHR5cGUuCgkgICBUaGUgR3VpbGUtc3BlY2lmaWMgc3Vic3RpdHV0aW9uICRiYXNlZGVzY3JpcHRvciB3YXMgcmVtb3ZlZAoJICAgYmVjYXVzZSBpdCB3YXMgdXNlbGVzcy4KCjgvMTIvMjAwMTogYmVhemxleQogICAgICAgICAgIFRoZSAlZXh0ZXJuIGRpcmVjdGl2ZSBpcyBub3cgZGVwcmVjYXRlZCBhbmQgd2l0aGRyYXduLiAgVGhlCiAgICAgICAgICAgcHVycG9zZSBvZiB0aGlzIGRpcmVjdGl2ZSB3YXMgdG8gaW1wb3J0IHNlbGVjdGVkIGRlZmluaXRpb25zCiAgICAgICAgICAgZnJvbSBvdGhlciBpbnRlcmZhY2UgZmlsZXMgYW5kIGhlYWRlcnMuICBIb3dldmVyLCB0aGUgc2FtZQogICAgICAgICAgIGZ1bmN0aW9uYWxpdHkgaXMgYmV0dGVyIGhhbmRsZWQgdGhyb3VnaCAlaW1wb3J0LiAgIFRoaXMKICAgICAgICAgICBsZWF2ZXMgU1dJRyB3aXRoIHR3byBmaWxlIGluY2x1c2lvbiBkaXJlY3RpdmVzOgoKICAgICAgICAgICAgICAlaW5jbHVkZSBmaWxlbmFtZSAgICAgLSBJbnNlcnRzIGludG8gY3VycmVudCBpbnRlcmZhY2UKICAgICAgICAgICAgICAlaW1wb3J0IGZpbGVuYW1lICAgICAgLSBJbXBvcnQgdHlwZXMgYW5kIGNsYXNzZXMgZnJvbSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbm90aGVyIG1vZHVsZQoKICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjgvMDkvMjAwMTogYmVhemxleQogICAgICAgICAgIEFkZGVkIG5ldyBzdXBwb3J0IGZvciB3cmFwcGluZyBDL0MrKyBjYWxsYmFjayBmdW5jdGlvbnMuIAogICAgICAgICAgIEEgY29tbW9uIHByb2JsZW0gd2l0aCBzb21lIEMgbGlicmFyaWVzIGlzIHRoYXQgbWFueQogICAgICAgICAgIGZ1bmN0aW9ucyB0YWtlIGEgZnVuY3Rpb24gcG9pbnRlciBhcyBhbiBhcmd1bWVudC4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgIGludCBkb19vcCguLi4sIGludCAoKm9wKShpbnQsaW50KSwgLi4uKTsKCiAgICAgICAgICAgVW5mb3J0dW5hdGVseSwgdGhlIG9ubHkgd2F5IHRvIGNhbGwgc3VjaCBhIGZ1bmN0aW9uIGlzIHRvCiAgICAgICAgICAgcGFzcyBpdCBhIGZ1bmN0aW9uIHBvaW50ZXIgb2Ygc29tZSBjb21wYXRpYmxlIHR5cGUuICBJbgogICAgICAgICAgIHByZXZpb3VzIHZlcnNpb25zIG9mIFNXSUcsIHlvdSBoYWQgdG8gc29sdmUgdGhpcyBwcm9ibGVtCiAgICAgICAgICAgd2l0aCBzb21lIHJlYWxseSBncm9zcyBoYWNrcy4gIEZvciBleGFtcGxlLCBpZiB5b3Ugd2FudGVkIHRvCiAgICAgICAgICAgdXNlIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb24gYXMgYSBjYWxsYmFjaywKCiAgICAgICAgICAgICAgIGludCBmb28oaW50LCBpbnQpOwoKICAgICAgICAgICB5b3UgaGFkIHRvIGluc3RhbGwgYSBwb2ludGVyIHRvIGl0IGFzIGEgY29uc3RhbnQuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICVjb25zdGFudCBpbnQgKCpGT08pKGludCxpbnQpID0gZm9vOwoKICAgICAgICAgICBvciAKCiAgICAgICAgICAgICAgIGNvbnN0IGludCAoKkZPTykoaW50LGludCkgPSBmb287CgogICAgICAgICAgIG9yIGlmIHlvdSBoYWQgYSByZWFsbHkgb2xkIFNXSUcgdmVyc2lvbjoKCiAgICAgICAgICAgICAgIHR5cGVkZWYgaW50ICgqT1BfRlVOQykoaW50LGludCk7CiAgICAgICAgICAgICAgIGludCBkb19vcCguLi4sIE9QX0ZVTkMsIC4uLik7CiAgICAgICAgICAgICAgIGNvbnN0IE9QX0ZVTkMgRk9PID0gZm9vOwoKICAgICAgICAgICAKICAgICAgICAgICBOb3csIHlvdSBjYW4gZG8gb25lIG9mIHR3byB0aGluZ3M6CgogICAgICAgICAgICAgICAlY29uc3RhbnQgaW50IGZvbyhpbnQsaW50KTsKCiAgICAgICAgICAgVGhpcyBjcmVhdGVzIGEgY29uc3RhbnQgJ2Zvbycgb2YgdHlwZSBpbnQgKCopKGludCxpbnQpLgogICAgICAgICAgIEFsdGVybmF0aXZlbHksIHlvdSBjYW4gZG8gdGhpczoKCiAgICAgICAgICAgICAgICVjYWxsYmFjaygiJXMiKTsKICAgICAgICAgICAgICAgaW50IGZvbyhpbnQsaW50KTsKICAgICAgICAgICAgICAgaW50IGJhcihpbnQsaW50KTsKICAgICAgICAgICAgICAgJW5vY2FsbGJhY2s7CgogICAgICAgICAgIEluIHRoaXMgY2FzZSwgdGhlIGZ1bmN0aW9ucyBhcmUgaW5zdGFsbGVkIGFzIGNvbnN0YW50cyB3aGVyZQogICAgICAgICAgIHRoZSBuYW1lIGlzIGRlZmluZWQgYnkgdGhlIGZvcm1hdCBzdHJpbmcgZ2l2ZW4gdG8gJWNhbGxiYWNrKCkuCiAgICAgICAgICAgSWYgdGhlIG5hbWVzIGdlbmVyYXRlZCBieSB0aGUgZm9ybWF0IHN0cmluZyBkaWZmZXIgZnJvbSB0aGUKICAgICAgICAgICBhY3R1YWwgZnVuY3Rpb24gbmFtZSwgYm90aCBhIGZ1bmN0aW9uIHdyYXBwZXIgYW5kIGEgY2FsbGJhY2sgCiAgICAgICAgICAgY29uc3RhbnQgYXJlIGNyZWF0ZWQuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICVjYWxsYmFjaygiJSh1cHBlcilzIik7CiAgICAgICAgICAgICAgIGludCBmb28oaW50LGludCk7CiAgICAgICAgICAgICAgIGludCBiYXIoaW50LGludCk7CiAgICAgICAgICAgICAgICVub2NhbGxiYWNrOwogICAgICAgICAgIAogICAgICAgICAgIENyZWF0ZXMgdHdvIHdyYXBwZXIgZnVuY3Rpb25zICdmb28nLCAnYmFyJyBhbmQgYWRkaXRpb25hbGx5CiAgICAgICAgICAgY3JlYXRlcyB0d28gY2FsbGJhY2sgY29uc3RhbnRzICdGT08nLCAnQkFSJy4KCiAgICAgICAgICAgTm90ZTogU1dJRyBzdGlsbCBkb2VzIG5vdCBwcm92aWRlIGF1dG9tYXRpYyBzdXBwb3J0IGZvciAKICAgICAgICAgICB3cml0aW5nIGNhbGxiYWNrIGZ1bmN0aW9ucyBpbiB0aGUgdGFyZ2V0IGxhbmd1YWdlLgogICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjgvMDYvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCiAgICAgICAgICAgKiBzdHJ1Y3QgbmVzdGluZyBmaXhlcyBhcyBwZXIgU0YgYnVnICM0NDc0ODguCgo4LzAzLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBUaGUgJW5hbWUgZGlyZWN0aXZlIG5vdyBhcHBsaWVzIHRvIGNvbnN0YW50cyBjcmVhdGVkIHdpdGgKICAgICAgICAgICAjZGVmaW5lIGFuZCAlY29uc3RhbnQuICBIb3dldmVyLCBtb3N0IGxhbmd1YWdlIG1vZHVsZXMKICAgICAgICAgICB3ZXJlIG5ldmVyIHdyaXR0ZW4gdG8gc3VwcG9ydCB0aGlzIGFuZCB3aWxsIGhhdmUgdG8gYmUKICAgICAgICAgICBtb2RpZmllZCB0byBtYWtlIGl0IHdvcmsuICBUY2wsIFB5dGhvbiwgYW5kIFBlcmwgbW9kdWxlcwogICAgICAgICAgIGFyZSB3b3JraW5nIG5vdy4KICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgo4LzAzLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBNYXNzaXZlIGNoYW5nZXMgYW5kIHNpbXBsaWZpY2F0aW9uIG9mIEMgZGVjbGFyYXRpb24gcGFyc2luZy4KICAgICAgICAgICBBbHRob3VnaCBTV0lHIGlzIHN0aWxsIG5vdCBhIGZ1bGwgQyBwYXJzZXIsIGl0cyBhYmlsaXR5CiAgICAgICAgICAgdG8gaGFuZGxlIGNvbXBsZXggZGF0YXR5cGVzIGluY2x1ZGluZyBwb2ludGVycyB0byBmdW5jdGlvbnMKICAgICAgICAgICBhbmQgcG9pbnRlcnMgdG8gYXJyYXlzIGhhcyBiZWVuIHZhc3RseSBpbXByb3ZlZC4gIAoKOC8wMy8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICAqIERpc3RyaWJ1dGlvbiBmaXhlczogYXV0b2NvbmYgbm8gbG9uZ2VyIG5lZWRlZCB0byBpbnN0YWxsIFNXSUcuCgo4LzAyLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBSZW1vdmVkIHR3byB1bmRvY3VtZW50ZWQgcGFyc2luZyBmZWF0dXJlcy4gIFNXSUcgbm8gbG9uZ2VyCiAgICAgICAgICAgc3VwcG9ydHMgb3V0LW9mLWNsYXNzIHN0YXRpYyBmdW5jdGlvbiBvciB2YXJpYWJsZQogICAgICAgICAgIGRlY2xhcmF0aW9ucy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgIHN0YXRpYyBpbnQgRm9vOjpiYXI7CgogICAgICAgICAgIFRoaXMgZmVhdHVyZSBtYXkgcmV0dXJuIGlmIHRoZXJlIGlzIHN1ZmZpY2llbnQgZGVtYW5kLiAKICAgICAgICAgICBIb3dldmVyLCBzaW5jZSBTV0lHIGlzIG1vc3Qgb2Z0ZW4gdXNlZCB3aXRoIGhlYWRlciBmaWxlcywKICAgICAgICAgICBpdCBpcyBtb3JlIGxpa2VseSBmb3IgdGhlc2UgZGVmaW5pdGlvbnMgdG8gYmUgaW5jbHVkZWQKICAgICAgICAgICBpbiB0aGUgY2xhc3MgZGVmaW5pdGlvbi4KICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjgvMDIvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCgkgICAqIENsZWFudXAgb2YgdGhlIEdJRlBsb3QgZXhhbXBsZXMuIFVwZ3JhZGVkIEphdmEgR0lGUGxvdCBleGFtcGxlLgoKOC8wMS8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKCSAgICogW0phdmFdIEVmZmljaWVuY3kgY2hhbmdlczogX2NQdHIgdXNlZCB3aGVyZSBwb3NzaWJsZSByYXRoZXIgdGhhbgoJICAgICBnZXRDUHRyKCkuIEJ1ZyBmaXhlcyBmb3IgaW5oZXJpdGFuY2UgLSBkZXJpdmVkIGNsYXNzIHNvbWV0aW1lcwoJICAgICBkaWRuJ3QgZGVsZXRlIHRoZSBjIG1lbW9yeSB3aGVuIF9kZWxldGUoKSB3YXMgY2FsbGVkLgoJICAgKiBbSmF2YV0gQWJzdHJhY3QgYysrIGNsYXNzZXMgYXJlIHdyYXBwZWQgd2l0aCBhIGphdmEgYWJzdHJhY3Qgc2hhZG93CgkgICAgIGNsYXNzLiBBbHNvIGEgcHVyZSB2aXJ0dWFsIGZ1bmN0aW9uIGlzIG1hcHBlZCB3aXRoIGFuIGFic3RyYWN0IG1ldGhvZC4KCSAgICogVGhlIGRlZmF1bHQgb3V0cHV0IGZpbGUgaGFzIGFsd2F5cyBiZWVuIDxtb2R1bGU+X3dyYXAuYy4gSXQgaXMgbm93CgkgICAgIDxtb2R1bGU+X3dyYXAuY3h4IGlmIHRoZSAtYysrIGNvbW1hbmRsaW5lIG9wdGlvbiBpcyBwYXNzZWQgdG8gc3dpZy4KCSAgICAgVGhpcyBoYXMgYmVlbiBkb25lIGFzIG90aGVyd2lzZSBjKysgY29kZSB3b3VsZCBhcHBlYXIgaW4gYSBjIGZpbGUuCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqIAoKNy8zMS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgTW9kaWZpZWQgdGhlICVjb25zdGFudCBkaXJlY3RpdmUgdG8gYmUgbW9yZSBDLWxpa2UgaW4gc3ludGF4LgogICAgICAgICAgIFRoZSBzeW50YXggaXMgbm93OgoKICAgICAgICAgICAgICAgICVjb25zdGFudCBOQU1FID0gVkFMVUU7CiAgICAgICAgICAgICAgICAlY29uc3RhbnQgVFlQRSBOQU1FID0gVkFMVUU7CiAKICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAlY29uc3RhbnQgRm9vICpCYXIgPSAmU3BhbTsKCiAgICAgICAgICAgQSBtb3JlIHN1YnRsZSBjYXNlIGlzIGFzIGZvbGxvd3M6CgogICAgICAgICAgICAgICAlY29uc3RhbnQgaW50ICgqRk9PKShpbnQsaW50KSA9IGJsYWg7CgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKiAgTW9kdWxlcyB0aGF0IHdlcmUgdXNpbmcKICAgICAgICAgICB0aGUgJWNvbnN0YW50IGRpcmVjdGl2ZSBkaXJlY3RseSB3aWxsIG5lZWQgdG8gYmUgbW9kaWZpZWQuCiAgICAgIAo3LzMwLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBSZW1vdmVkIG9ic2N1cmUgYW5kIHVuZG9jdW1lbnRlZCBmb3JtIG9mIHRoZSAlaW5saW5lIGRpcmVjdGl2ZToKCiAgICAgICAgICAgICAgICVpbmxpbmUgaW50IGJsYWgoaW50IGEsIGludCBiKSB7CiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICB9CgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKiAKICAgICAgICAgICAobm90ZTogdGhpcyBmZWF0dXJlIHdhcyBuZXZlciBkb2N1bWVudGVkIGFuZCBpcyB3aXRoZHJhd24pCgo3LzMwLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBSZW1vdmVkIHN1cHBvcnQgZm9yIGZ1bmN0aW9ucyB3aXRoIG5vIGV4cGxpY2l0bHkgZGVjbGFyZWQKICAgICAgICAgICByZXR1cm4gdHlwZS4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAgZm9vKGludCk7CgogICAgICAgICAgIEluIEMsIHN1Y2ggZnVuY3Rpb25zIHdlcmUgaW1wbGljaXRseSBhc3N1bWVkIHRvIHJldHVybiBhbiAnaW50Jy4KICAgICAgICAgICBJbiBDKyssIHRoaXMgaXMgaWxsZWdhbC4gIEVpdGhlciB3YXksIGl0J3MgY29uc2lkZXJlZCBiYWQKICAgICAgICAgICBzdHlsZS4gIFJlbW92aW5nIHN1cHBvcnQgZm9yIHRoaXMgaW4gU1dJRyB3aWxsIHNpbXBsaWZ5CiAgICAgICAgICAgY2VydGFpbiBpc3N1ZXMgaW4gcGFyc2luZy4KICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjcvMzAvMjAwMTogbWtvZXBwZQoJICAgKiBQYXJ0aWFsIG1lcmdlIGZyb20gdGhlIENWUyB0cnVuay4gIFRoZSBTb3VyY2UvRE9IIGRpcmVjdG9yeQoJICAgICBhbmQgbW9zdCBvZiB0aGUgU291cmNlL1N3aWcgZGlyZWN0b3J5IGlzIHVwLXRvLWRhdGUgbm93LgoJICAgKiBbR3VpbGVdICVzY2hlbWUgaXMgbm93IGEgbWFjcm8gZm9yICVpbnNlcnQoInNjaGVtZSIpLiAgCgkgICAgIE5ldyBzeW50YXg6ICAlc2NoZW1lICJGSUxFTkFNRSI7IAoJICAgICBOZXcgc3ludGF4OiAgJXNjaGVtZSAleyBTQ0hFTUUtQ09ERSAlfQoJICAgICBOZXcgbWFjcm9zICVtdWx0aXBsZV92YWx1ZXMsICV2YWx1ZXNfYXNfbGlzdCwKCSAgICAgJXZhbHVlc19hc192ZWN0b3IuIAoKNy8yOS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgJXJlYWRvbmx5IGFuZCAlcmVhZHdyaXRlIGhhdmUgYmVlbiB0dXJuZWQgaW50byBTV0lHIHByYWdtYXMuCiAgICAgICAgICAgJXByYWdtYShzd2lnKSByZWFkb25seSBhbmQgJXByYWdtYShzd2lnKSByZWFkd3JpdGUuICBNYWNyb3MKICAgICAgICAgICBhcmUgdXNlZCB0byBwcm92aWRlIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LgoKNy8yOS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgTWlub3IgY2hhbmdlcyB0byAlcHJhZ21hIGRpcmVjdGl2ZS4gICVwcmFnbWEgbXVzdCBhbHdheXMKICAgICAgICAgICBiZSBkaXJlY3RlZCB0byBhIHNwZWNpZmljIGxhbmd1YWdlLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICVwcmFnbWEoc3dpZykgbWFrZV9kZWZhdWx0OwogICAgICAgICAgICAgICVwcmFnbWEocGVybDUpIGluY2x1ZGUgPSAiYmxhaC5pIjsKCiAgICAgICAgICAgQWxzbyBleHRlbmRlZCB0aGUgcHJhZ21hIGRpcmVjdGl2ZSB0byBhbGxvdyBjb2RlIGJsb2NrcwogCiAgICAgICAgICAgICAgJXByYWdtYShmb28pIGNvZGUgPSAlewogICAgICAgICAgICAgICAgICAuLi4gc29tZSBjb2RlIC4uLgogICAgICAgICAgICAgICV9CgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKNy8yOS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgQ2hhbmdlIHRvIHRoZSB3YXkgJ2NvbnN0JyB2YXJpYWJsZXMgYXJlIHdyYXBwZWQuICBJbiAKICAgICAgICAgICBwcmV2aW91cyB2ZXJzaW9ucyBvZiBTV0lHLCBhICdjb25zdCcgdmFyaWFibGUgd2FzCiAgICAgICAgICAgd3JhcHBlZCBhcyBhIGNvbnN0YW50LiAgIE5vdywgJ2NvbnN0JyB2YXJpYWJsZXMgYXJlCiAgICAgICAgICAgd3JhcHBlZCBhcyByZWFkLW9ubHkgdmFyaWFibGVzLiAgVGhlcmUgYXJlIHNldmVyYWwKICAgICAgICAgICByZWFzb25zIGZvciBtYWtpbmcgdGhpcyBjaGFuZ2UsIG1vc3RseSBwZXJ0YWluaW5nIHRvCiAgICAgICAgICAgc3VidGxlIGRldGFpbHMgb2YgaG93ICdjb25zdCcgYWN0dWFsbHkgd29ya3MuIAoKICAgICAgICAgICBUaGlzIHdpbGwgcHJvYmFibHkgYnJlYWsgb2xkIGludGVyZmFjZXMgdGhhdCB1c2VkICdjb25zdCcKICAgICAgICAgICB0byBjcmVhdGUgY29uc3RhbnRzLiAgIEFzIGEgcmVwbGFjZW1lbnQsIGNvbnNpZGVyIHVzaW5nIHRoaXM6CgogICAgICAgICAgIGNvbnN0IGludCBhID0gNDsgICA9PT0+ICAgJWNvbnN0YW50IGludCBhID0gNDsKICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjcvMjkvMjAwMTogYmVhemxleQogICAgICAgICAgIFJlb3JnYW5pemF0aW9uIGFuZCBzaW1wbGlmaWNhdGlvbiBvZiB0eXBlIHBhcnNpbmcuCiAgICAgICAgICAgVHlwZXMgd2l0aCAnY29uc3QnIHNob3VsZCB3b3JrIGNvcnJlY3RseSBub3cuCgo3LzI5LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBNb3N0IHN3aWcgZGlyZWN0aXZlcyByZWxhdGVkIHRvIHRoZSBkb2N1bWVudGF0aW9uIHN5c3RlbQogICAgICAgICAgIGFyZSBub3cgZGVwcmVjYXRlZC4KCjcvMjkvMjAwMTogYmVhemxleQogICAgICAgICAgIFJlbW92ZWQgc3VwcG9ydCBmb3IgT2JqZWN0aXZlLUMgaW4gb3JkZXIgdG8gc2ltcGxpZnkKICAgICAgICAgICBwYXJzZXIgcmVjb25zdHJ1Y3Rpb24uICBXaWxsIHJldHVybiBpZiB0aGVyZSBpcyBzdWZmaWNpZW50CiAgICAgICAgICAgZGVtYW5kLgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKNy8yOS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgQ29kZSBpbmNsdXNpb24gaGFzIGJlZW4gbW9kaWZpZWQgaW4gdGhlIHBhcnNlci4gIEEgY29tbW9uCiAgICAgICAgICAgZGlyZWN0aXZlICVpbnNlcnQgaXMgbm93IHVzZWQgZm9yIGV2ZXJ5dGhpbmcuICBUaGlzCiAgICAgICAgICAgaW5zZXJ0cyBhIGZpbGUgaW50byB0aGUgb3V0cHV0OgoKICAgICAgICAgICAgICAgJWluc2VydChoZWFkZXIpICJmb28uc3dnIgoKICAgICAgICAgICBUaGlzIGluc2VydHMgc29tZSBpbmxpbmUgY29kZSBpbnRvIHRoZSBvdXRwdXQKCiAgICAgICAgICAgICAgICVpbnNlcnQoaGVhZGVyKSAlewogICAgICAgICAgICAgICAgICAgLi4uIHNvbWUgY29kZSAuLi4gCiAgICAgICAgICAgICAgICV9CgogICAgICAgICAgIFRoZXJlIGFyZSBmaXZlIHByZWRlZmluZWQgdGFyZ2V0cyBmb3IgdGhlIGluc2VydCBkaXJlY3RpdmU6CgogICAgICAgICAgICAgICAiaGVhZGVyIiAgICAtIEhlYWRlciBzZWN0aW9uIG9mIHdyYXBwZXIgZmlsZQogICAgICAgICAgICAgICAicnVudGltZSIgICAtIFJ1bnRpbWUgc2VjdGlvbiBvZiB3cmFwcGVyIGZpbGUKICAgICAgICAgICAgICAgIndyYXBwZXIiICAgLSBXcmFwcGVyIHNlY3Rpb24KICAgICAgICAgICAgICAgImluaXQiICAgICAgLSBJbml0aWFsaXphdGlvbiBmdW5jdGlvbgogICAgICAgICAgICAgICAibnVsbCIgICAgICAtIE5vdGhpbmcuIERpc2NhcmQuCgogICAgICAgICAgIFRoZSBmb2xsb3dpbmcgZGlyZWN0aXZlcyBhcmUgc3RpbGwgc3VwcG9ydGVkLCBidXQgYXJlCiAgICAgICAgICAgbm93IGRlZmluZWQgaW4gdGVybXMgb2YgbWFjcm9zOgoKICAgICAgICAgICAgICAgJXsgLi4uICV9ICAgICAgICAgICAtPiAlaW5zZXJ0KGhlYWRlcikgICV7IC4uLiAlfQogICAgICAgICAgICAgICAlaW5pdCAleyAuLi4gJX0gICAgIC0+ICVpbnNlcnQoaW5pdCkgICAgJXsgLi4uICV9CiAgICAgICAgICAgICAgICV3cmFwcGVyICV7IC4uLiAlfSAgLT4gJWluc2VydCh3cmFwcGVyKSAleyAuLi4gJX0KICAgICAgICAgICAgICAgJXJ1bnRpbWUgJXsgLi4uICV9ICAtPiAlaW5zZXJ0KHJ1bnRpbWUpICV7IC4uLiAlfQoKICAgICAgICAgICBMYW5ndWFnZSBtb2R1bGVzIGNhbiBkZWZpbmUgbmV3IG5hbWVkIHRhcmdldHMgYnkgdXNpbmcgdGhlCiAgICAgICAgICAgQyBBUEkgZnVuY3Rpb24gU3dpZ19yZWdpc3Rlcl9maWxlYnluYW1lKCkgKHNlZSBtYWluLmN4eCkuCiAgICAgICAgICAgRm9yIGV4YW1wbGUsIGlmIHlvdSB3YW50ZWQgdG8gZXhwb3NlIGEgc2hhZG93IGNsYXNzIGZpbGUsCiAgICAgICAgICAgeW91IGNvdWxkIGRvIHRoaXM6CgogICAgICAgICAgICAgIFN3aWdfcmVnaXN0ZXJfZmlsZWJ5bmFtZSgic2hhZG93IiwgZl9zaGFkb3cpOwoKICAgICAgICAgICBUaGVuIGluIHRoZSBpbnRlcmZhY2UgZmlsZToKCiAgICAgICAgICAgICAgJWluc2VydChzaGFkb3cpICV7IC4uLiAlfQoKICAgICAgICAgICBOb3RlOiB0aGlzIGNoYW5nZSBzaG91bGQgbm90IGFmZmVjdCBhbnkgb2xkIGludGVyZmFjZXMsIGJ1dAogICAgICAgICAgIGRvZXMgb3BlbiB1cCBuZXcgcG9zc2liaWxpdGllcyBmb3IgZW5oYW5jZW1lbnRzLgoKNy8yOS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgU1dJRyBub3cgYWx3YXlzIGluY2x1ZGVzIGEgc3RhbmRhcmQgbGlicmFyeSBmaWxlICdzd2lnLnN3ZycuCiAgICAgICAgICAgVGhpcyBmaWxlIGRlZmluZXMgYSBsYXJnZSBudW1iZXIgb2YgbWFjcm8gZGVmaW5pdGlvbnMKICAgICAgICAgICB0aGF0IGRlZmluZSB0aGUgYmVoYXZpb3Igb2YgdmFyaW91cyBTV0lHIGRpcmVjdGl2ZXMuCiAgICAgICAgICAgUHJldmlvdXNseSwgYWxsIFNXSUcgZGlyZWN0aXZlcyB3ZXJlIGhhbmRsZWQgYXMgc3BlY2lhbAogICAgICAgICAgIGNhc2VzIGluIHRoZSBwYXJzZXIuICBUaGlzIG1hZGUgdGhlIHBhcnNlciBhIGxhcmdlIAogICAgICAgICAgIGJsb2F0ZWQgbWVzcy4gIE5vdywgdGhlIHBhcnNlciBpcyBzdHJpcHBlZCBkb3duIHRvIGEgZmV3CiAgICAgICAgICAgc2ltcGxlIGRpcmVjdGl2ZXMgYW5kIG1hY3JvcyBhcmUgdXNlZCB0byBoYW5kbGUgZXZlcnl0aGluZyBlbHNlLgoKNy8yNi8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKCSAgICogRml4ZXMgZm9yIFNvdXJjZWZvcmdlIGJ1ZyAjNDQ0NzQ4IC0gbmV3IHRlc3RjYXNlIGNwcF9zdGF0aWM6CgkgICAgIFtUQ0xdIENsYXNzIHdpdGgganVzdCBzdGF0aWMgbWVtYmVyIHZhcmlhYmxlL2Z1bmN0aW9uIGZpeAoJICAgICBbSmF2YV0gRml4ZWQgc3RhdGljIHZhcmlhYmxlcyBzdXBwb3J0CgkgICAgIFtSdWJ5XSBTdGF0aWMgdmFyaWFibGVzIHdvcmthcm91bmQgcmVtb3ZlZAoKNy8yNy8yMDAxOiBta29lcHBlCgkgICAqIHN0eXBlLmMgKFN3aWdUeXBlX2RlZmF1bHQpOiBTdHJpcCBxdWFsaWZpZXJzIGZpcnN0LiBUaGUKCSAgICAgZGVmYXVsdCB0eXBlIG9mICJpbnQgKiBjb25zdCIgaXMgbm93ICJTV0lHUE9JTlRFUiAqIi4KCSAgICogbWFpbi5jeHg6IERlZmluZSAiX19jcGx1c3BsdXMiIGluIFNXSUcncyBwcmVwcm9jZXNzb3IgaWYKCSAgICAgaW4gQysrIG1vZGUuCgkgICAqIFtHdWlsZV06IEFkZGVkIHNvbWUgc3VwcG9ydCBmb3IgYXJyYXlzIGFuZCBDKysKCSAgICAgcmVmZXJlbmNlcywgZml4aW5nIHRoZSAiY29uc3RhbnRfcG9pbnRlcnMiIHRlc3QgY2FzZS4KCSAgICogTW92ZWQgbW9zdCB0ZXN0cyBmcm9tIHRoZSBvbGQgR3VpbGUtc3BlY2lmaWMgdGVzdC1zdWl0ZQoJICAgICB0byB0aGUgbmV3IHRlc3Qtc3VpdGUuICBBbHNvIG1vdmVkIHBlcmw1L3BvaW50ZXItY3h4CgkgICAgIGV4YW1wbGUgdGhlcmUuCgo3LzI2LzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQoJICAgKiBUZXN0LXN1aXRlIGFkZGVkLgoJICAgKiBJbml0aWFsIHRlc3RjYXNlczogY29uc3RhbnRfcG9pbnRlcnMgY3BwX2VudW0gZGVmaW5lcwoJICAgICBzaXplb2ZfcG9pbnRlcnMgdW5pb25zIHZpcnR1YWxfZGVzdHJ1Y3RvcgoJICAgKiBNYWtlIGNsZWFuIGltcHJvdmVtZW50cy4KCjcvMjQvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCgkgICAqIFtKYXZhXSBVbmRlcnNjb3JlcyBpbiB0aGUgcGFja2FnZSBuYW1lIGFuZC9vciBtb2R1bGUgbmFtZQoJICAgbm8gbG9uZ2VyIGdpdmUgbGlua2luZyBwcm9ibGVtcy4KCjcvMTcvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCgkgICAqIE1vcmUgcGFyc2VyIGJ1ZyBmaXhlcyBmb3IgY29uc3RhbnQgcG9pbnRlcnMKCjcvMTkvMjAwMTogbWtvZXBwZQoJICAgKiBbR3VpbGVdIEFlc3RoZXRpYyBpbXByb3ZlbWVudCBpbiB2YXJpYWJsZSB3cmFwcGVycy4KCjcvMTgvMjAwMTogYmVhemxleQogICAgICAgICAgICogRml4ZWQgY29yZS1kdW1wIHByb2JsZW0gaW4gcG9pbnRlciBsaWJyYXJ5IHdoZW4gCiAgICAgICAgICAgICBmcmVlaW5nIGNoYXJhY3RlciBhcnJheXMuCiAgICAgICAgICAgICBTRiBCdWcgWyAjNDE1ODM3IF0gcG9pbnRlciBsaWIgY29yZSBkdW1wCgo3LzE4LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICAqIEZpeGVkIHByb2JsZW0gd2l0aCBkZWZhdWx0IGRlc3RydWN0b3JzIGFuZCBzaGFkb3cKICAgICAgICAgICAgIGNsYXNzZXMuICBTRiBidWcgIzIyMTEyOC4KCjcvMTgvMjAwMTogYmVhemxleQogICAgICAgICAgICogVG8gcHJvdmlkZSBiZXR0ZXIgbGluZS1udW1iZXIgdHJhY2tpbmcgaW4gaW50ZXJmYWNlcwogICAgICAgICAgICAgd2l0aCBsb3RzIG9mIG1hY3Jvcywgc3BlY2lhbCBsb2NhdG9yIGNvbW1lbnRzIGFyZQogICAgICAgICAgICAgbm93IGdlbmVyYXRlZCBieSB0aGUgU1dJRyBwcmVwcm9jZXNzb3IuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgLypAZm9vLmksNDIsQkxBSEAqL2V4cGFuZGVkIG1hY3JvLypAQCovCgogICAgICAgICAgICAgVGhlIGZpcnN0IC8qQC4uLkAqLyBzZXF1ZW5jZSBzZXRzIHRoZSBjb250ZXh0CiAgICAgICAgICAgICB0byBwb2ludCB0byB0aGUgbWFjcm8gY29kZS4gIFRoZSAvKkBAKi8gY29tbWVudAogICAgICAgICAgICAgdGVybWluYXRlcyB0aGUgY29udGV4dC4gIFRoZSBTV0lHIHBhcnNlciBzaG91bGQKICAgICAgICAgICAgIGlnbm9yZSBhbGwgb2YgdGhlIGxvY2F0b3IgY29tbWVudHMgYXMgc2hvdWxkCiAgICAgICAgICAgICB0aGUgQyBjb21waWxlciAoc2hvdWxkIHN1Y2ggY29tbWVudHMgZW5kIHVwCiAgICAgICAgICAgICBpbiBnZW5lcmF0ZWQgd3JhcHBlciBjb2RlKS4KCjcvMTgvMjAwMTogbWtvZXBwZQoJICAgKiBUaGUgcGFyc2VyIG5vdyBoYW5kbGVzIHNldmVyZWx5IGNvbnN0aWZpZWQgdHlwZXMgaW4KCSAgIHR5cGVtYXBzLiAgVGhpcyBpbnRyb2R1Y2VkIGEgbmV3IHNoaWZ0L3JlZHVjZSBjb25mbGljdCwgYnV0CgkgICBvbmx5IHdpdGggYSBoZXVyaXN0aWMgZnVuY3Rpb24tcG9pbnRlciBjYXRjaC1hbGwgcnVsZS4gIAoJICAgKiBbR3VpbGVdOiBBZGRlZCB0eXBlbWFwcyBmb3Igc2V2ZXJlbHkgY29uc3RpZmllZCB0eXBlcy4gCgkgICAqIEZpeGVkIHRoZSAidGVtcGxhdGUtd2hpdGVzcGFjZSIgcHJvYmxlbSBieSBjYW5vbmljYWxpemluZwoJICAgICB3aGl0ZXNwYWNlLCBlc3BlY2lhbGx5IGFyb3VuZCBhbmdsZSBicmFja2V0cyBhbmQgY29tbWFzLiAKCjcvMTcvMjAwMTogbWtvZXBwZQoJICAgKiBbR3VpbGVdOiBBIFNjaGVtZSBmaWxlIGlzIGVtaXR0ZWQgaWYgdGhlIC1zY21zdHViIEZJTEUuU0NNCgkgICBjb21tYW5kLWxpbmUgb3B0aW9uIGlzIHVzZWQuICBUaGUgJXNjaGVtZSBkaXJlY3RpdmUKCSAgIChpbXBsZW1lbnRlZCBhcyBhIG1hY3JvIGZvciBhIHByYWdtYSkgYWxsb3dzIHRvIGluc2VydAoJICAgYXJiaXRyYXJ5IGNvZGUgaGVyZS4gIEluICJzaW1wbGUiIGFuZCAicGFzc2l2ZSIgbGlua2FnZSwKCSAgIHRoZSBmaWxlIGdldHMgZmlsbGVkIHdpdGggZGVmaW5lLW1vZHVsZSBhbmQgZXhwb3J0CgkgICBkZWNsYXJhdGlvbnMuCgo3LzE3LzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQoJICAgKiBQYXJzZXIgYnVnIGZpeCB0byBzdXBwb3J0IGNvbnN0YW50IHBvaW50ZXJzLCBlZyBpbnQqIGNvbnN0IHB0ci4KCSAgIEZpeGVkIGV2ZXJ5d2hlcmUgLSB2YXJpYWJsZXMsIHBhcmFtZXRlcnMsIHJldHVybiB0eXBlcyBldGMuIE5vdGUgdGhhdAoJICAgd2hlbiB3cmFwcGluZyBhIGNvbnN0YW50IHBvaW50ZXIgdmFyaWFibGUgb25seSB0aGUgZ2V0dGVyIGlzIGdlbmVyYXRlZC4KCjcvMTcvMjAwMTogbWtvZXBwZQoJICAgKiBGaXhlZCBTRiBidWcgIzQ0MTQ3MCAoI2RlZmluZSBYICIvLyIgd291bGQgbm90IGJlIHBhcnNlZCwKCSAgICAgc2VlIHRlc3Qtc3VpdGUgZW50cnkgInByZXByb2MtMSIpLCByZXBvcnRlZCBieSBULiBXLiBCdXJ0b24KCSAgICAgPHR3YnVydG9uQHVzZXJzLnNmLm5ldD4uCgkgICAqIENoYW5nZWQgdGhlIHR5cGUgb2YgY2hhcmFjdGVyIGNvbnN0YW50cyB0byAiY2hhciIsIHJhdGhlcgoJICAgICB0aGFuICJjaGFyICoiLiAgQ2hhbmdlZCB0aGUgaW5kaXZpZHVhbCBsYW5ndWFnZSBtb2R1bGVzCgkgICAgIHRvIGtlZXAgdGhlIG9sZCBiZWhhdmlvdXIsIGV4Y2VwdCBmb3IgdGhlIEd1aWxlIG1vZHVsZSwKCSAgICAgd2hlcmUgaXQgaXMgZGVzaXJlZCB0byBtYWtlIHRoZW0gU2NoZW1lIGNoYXJhY3RlcnMuICBUaGlzCgkgICAgIGZpeGVzIFNGIGJ1ZyAjMjMxNDA5LCB0ZXN0LXN1aXRlIGVudHJ5ICJjaGFyLWNvbnN0YW50Ii4KCSAgICogQXBwbGllZCBwYXRjaCBmb3IgRE9IL0RvaC9tZW1vcnkuYyBieSBMZXMgU2NoYWZmZXIKCSAgICAgPHNjaGFmZmVyQG9wdG9ubGluZS5uZXQ+IChhdm9pZCByZXF1aXJlZCBzaWRlIGVmZmVjdHMgaW4KCSAgICAgYXNzZXJ0KS4gCgo3LzE3LzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQoJICAgKiBCdWcgZml4IGluIHBhcnNlciBmb3IgdmlydHVhbCBkZXN0cnVjdG9yIHdpdGggdm9pZCBhcyBwYXJhbWV0ZXIKCSAgICogQnVnIGZpeCBpbiBwYXJzZXIgI2RlZmluZXMgZW1iZWRkZWQgd2l0aGluIGNsYXNzZXMvc3RydWN0cy91bmlvbnMKCSAgIENvbnNlcXVlbnRseSAlY29uc3RhbnQgY2FuIG5vdyBhbHNvIGJlIHBsYWNlZCB3aXRoaW4gYSBzdHJ1Y3QvY2xhc3MvdW5pb24uCgkgICAqIEJ1ZyBmaXggaW4gcGFyc2VyIHRvIGFsbG93IHNpemVvZigqSV9hbV9hX3BvaW50ZXIpIHdpdGhpbiBhICNkZWZpbmUKCjcvMTYvMjAwMTogbWtvZXBwZQoJICAgKiBBZGRlZCBjaGFuZ2VzIGZvciB0aGUgTWFjaW50b3NoIGNvbnRyaWJ1dGVkIGJ5IEx1aWdpCgkgICBCYWxsYWJpbyA8YmFsbGFiaW9AbWFjLmNvbT4uIAoJICAgKiBTb21lICJjb25zdCIgZml4ZXMgaW4gdGhlIGNvZGUuCgkgICAqIFtHdWlsZV06IE1hZGUgdGhlIGNvbnN0YW50LXdyYXBwZXIgZnVuY3Rpb25zIG11Y2ggc2hvcnRlci4KCjcvMTMvMjAwMTogbWtvZXBwZQoJICAgKiBbR3VpbGVdOiBTb21lICJjb25zdCIgZml4ZXMgZm9yIEd1aWxlIHZlcnNpb24gMS4zLjQuCgkgICAqIEhhbmRsZSBhbm9ueW1vdXMgYXJndW1lbnRzIHdpdGggZGVmYXVsdCB2YWx1ZXMgYW5kIHN0YXRpYwoJICAgICBhcnJheSBtZW1iZXJzIG9mIGNsYXNzZXMuICBCb3RoIGJ1Z3MgcmVwb3J0ZWQgYnkgQW5uYWxpc2EgVGVycmFjaW5hCgkgICAgIDxhbm5hbGlzYS50ZXJyYWNpbmFAZGF0YW1hdC5pdD47IHNlZSB0aGUgZmlsZXMKCSAgICAgRXhhbXBsZXMvZ3VpbGUvdGVzdC1zdWl0ZS9zdGF0aWMtYXJyYXktbWVtYmVyLmkgYW5kCgkgICAgIGFub255bW91cy1hcmcuaS4KClZlcnNpb24gMS4zLjYgIChKdWx5IDksIDIwMDEpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cgo3LzA5LzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQoJICAgKiBHSUZQbG90IGV4YW1wbGVzOiBGT1JFR1JPVU5EIGFuZCBCQUNLR1JPVU5EIGRlZmluaXRpb24gbWlzc2luZyAKCSAgIGFmdGVyIFRSQU5TUEFSRU5UICNkZWZpbmUgZml4IGluIEdJRlBsb3QKCjcvMDMvMjAwMTogYmVhemxleQogICAgICAgICAgIEZpeGVkIHVwIHRoZSB2ZXJzaW9uIG51bWJlcnMgc28gdGhhdCB0aGUgcmVsZWFzZSBpcyBrbm93bgogICAgICAgICAgIGFzIDEuMy42LiAgQWxsIGZ1dHVyZSByZWxlYXNlcyBzaG91bGQgaGF2ZSBhIHNpbWlsYXIKICAgICAgICAgICB2ZXJzaW9uIGZvcm1hdC4KCjcvMDIvMjAwMTogbWtvZXBwZQoJICAgKiBbUHl0aG9uXTogUHJldmVudCB0aGUgcHJvYmxlbSBvZiBzZWxmLnRoaXNvd24gbm90IGJlaW5nCgkgICBkZWZpbmVkIGlmIHRoZSBDKysgY2xhc3MgY29uc3RydWN0b3IgcmFpc2VkIGFuIGV4Y2VwdGlvbi4KCSAgIFRoYW5rcyB0byBMdWlnaSBCYWxsYWJpbyA8YmFsbGFiaW9AbWFjLmNvbT4uCgo2LzI5LzIwMDE6IG1rb2VwcGUKCSAgICogTW9yZSBwb3J0YWJpbGl0eSBmaXhlczsgZml4ZWQgImdjYyAtV2FsbCIgd2FybmluZ3MuCgo2LzI5LzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQoJICAgKiBHSUZQbG90IGV4YW1wbGVzOiBUUkFOU1BBUkVOVCAjZGVmaW5lIG11bHRpcGxlIHRpbWVzIG9uIFNvbGFyaXMgCgkgICAoY2xhc2hlcyB3aXRoIHN0cmVhbS5oKS4KCSAgICogTXVsdGlwbGUgZGVmaW5pdGlvbiBidWcgZml4IGZvciBzaGFkb3cgY2xhc3Nlcy4gVGhlIHBlcmwgYW5kIHB5dGhvbiAKCSAgIG1vZHVsZXMgaGFkIHdvcmthcm91bmRzIHdoaWNoIGhhdmUgYmVlbiByZXBsYWNlZCB3aXRoIGZpeGVzIGluIAoJICAgdGhlIGNvcmUuIE1hbnkgb2YgdGhlIExhbmd1YWdlOjpjcHBfeHh4eCBmdW5jdGlvbnMgbm93IHNldCBhIAoJICAgZmxhZyB3aGljaCB0aGUgZGVyaXZlZCBjbGFzc2VzIGNhbiBhY2Nlc3MgdGhyb3VnaCAKCSAgIGlzX211bHRpcGxlX2RlZmluaXRpb24oKSB0byBzZWUgd2hldGhlciBvciBub3QgY29kZSBzaG91bGQgYmUgCgkgICBnZW5lcmF0ZWQuICBUaGUgY29kZSBiZWxvdyB3b3VsZCBoYXZlIHByb2R1Y2VkIHZhcnlpbmcgZGVncmVlcyAKCSAgIG9mIGluY29ycmVjdCBzaGFkb3cgY2xhc3MgY29kZSBmb3IgdGhlIHZhcmlvdXMgbW9kdWxlczoKCSAgIGNsYXNzIFRlc3RDbGFzcwoJICAgewoJICAgcHVibGljOgoJICAgICBUZXN0Q2xhc3MoKSB7fTsKCSAgICAgVGVzdENsYXNzKGludCBhKSB7fTsKCSAgICAgflRlc3RDbGFzcygpIHt9OwoJICAgICB1bnNpZ25lZCBsb25nIHh5eihzaG9ydCBrKSB7fTsKCSAgICAgdW5zaWduZWQgbG9uZyB4eXooaW50IG4pIHt9OwoJICAgICBzdGF0aWMgdm9pZCBzdGF0aWNfZnVuYygpIHt9OwoJICAgICBzdGF0aWMgdm9pZCBzdGF0aWNfZnVuYyhpbnQgYSkge307CgkgICB9OwoJICAgdm9pZCBkZWxldGVfVGVzdENsYXNzKGludCBhKTsKCjYvMjcvMjAwMTogbWtvZXBwZQoJICAgKiBbUGVybF0gQW5vdGhlciBjb25zdC1yZWxhdGVkIHBvcnRhYmlsaXR5IGZpeC4KCjYvMjYvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCgkgICAqIFtKYXZhXSBBZGRlZCBpbiBjcHBfcHJhZ21hKCkgc3VwcG9ydCB3aXRoIGEgaG9zdCBvZiBuZXcgcHJhZ21hcyAtIHNlZSAKCSAgIGpzd2lnLmh0bWwuIFRoZXNlIGFyZSBkZXNpZ25lZCBmb3IgYmV0dGVyIG1peGluZyBvZiBKYXZhIGFuZCBjKysuIEl0IAoJICAgZW5hYmxlcyB0aGUgdXNlciB0byBzcGVjaWZ5IHB1cmUgSmF2YSBjbGFzc2VzIGFzIGJhc2VzIGFuZC9vciBpbnRlcmZhY2VzIAoJICAgZm9yIHRoZSB3cmFwcGVkIGMvYysrLgoJICAgKiBbSmF2YV0gT2xkIHByYWdtYXMgcmVuYW1lZC4gV2FybmluZyBnaXZlbiBmb3IgdGhlIG1vbWVudCBpZiB1c2VkLgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEpBVkEgTU9EVUxFICoqKgoKNi8yNS8yMDAxOiBta29lcHBlCgkgICAqIEluY29ycG9yYXRlZCBtb3JlIGJ1aWxkIGNoYW5nZXMgY29udHJpYnV0ZWQgYnkgV3lzcyBDbGVtZW5zCgkgICA8V1lTQGhlbGJsaW5nLmNoPiBmb3Igc3dpZy9ydWJ5IG9uIGN5Z3dpbi4KCjYvMjAvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCgkgICAqIE1ha2VmaWxlIG1vZHMgc28gdGhhdCAnbWFrZSBjaGVjaycgdXNlcyB0aGUgc3dpZyBvcHRpb25zIGluIHRoZSBtYWtlZmlsZXMKCSAgICogW0phdmFdIFJlbW92ZWQgR2VuZXJhdGluZyB3cmFwcGVycyBtZXNzYWdlCgkgICAqIFtKYXZhXSBOVUxMIHBvaW50ZXIgYnVnIGZpeAoJICAgKiBbSmF2YV0gQnVnIGZpeCBmb3IgS2FmZmUgSlZNCgo2LzIwLzIwMDE6IG1rb2VwcGUKCSAgICogU1dJR19UeXBlUXVlcnkgZnJvbSBjb21tb24uc3dnIG5vdyByZXR1cm5zIGEKCSAgIHN3aWdfdHlwZV9pbmZvKiByYXRoZXIgdGhhbiBhIHZvaWQqLiAgVGhpcyBmaXhlcyBhIHByb2JsZW0KCSAgIHdoZW4gdXNpbmcgcG9pbnRlci5pIGFuZCBDKyssIGFzIGlsbHVzdHJhdGVkIGJ5IHRoZSBuZXcKCSAgIHRlc3Qtc3VpdGUgZXhhbXBsZSBwZXJsNS9wb2ludGVyLWN4eC4KCSAgICogUG9ydGFiaWxpdHkgZml4ZXMgKGNvbnN0IGNoYXIgKikuIAoJICAgKiBJbmNvcnBvcmF0ZWQgYnVpbGQgY2hhbmdlcyBjb250cmlidXRlZCBieSBXeXNzIENsZW1lbnMKCSAgIDxXWVNAaGVsYmxpbmcuY2g+LCB3aGljaCBtYWtlIHN3aWcgcnVubmFibGUgb24gY3lnd2luLgoKNi8xOS8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKCSAgICogW0phdmFdIEJ1ZyBmaXggZm9yIFNGIGJ1ZyAjMjExMTQ0LiBUaGlzIGZpeCBpcyBhIHdvcmthcm91bmQgCgkgICAgIHVudGlsIGZpeGVkIGluIHRoZSBjb3JlLgoKNi8xOS8yMDAxOiBta29lcHBlCgkgICAqIFtHdWlsZV06IFBvcnRhYmlsaXR5IGZpeGVzIGZvciB1c2Ugd2l0aCB0aGUgU3VuIEZvcnRlCgkgICBjb21waWxlcnMuIAoJICAgKiBbVGNsXTogUG9ydGFiaWxpdHkgZml4IChjb25zdCBjaGFyICopLgoJICAgKiBbVGNsXTogQ29uZmlndXJlIG5vdyBmaXJzdCB0cmllcyB0byBmaW5kIGEgdGNsQ29uZmlnLnNoCgkgICBmaWxlIGluIG9yZGVyIHRvIGZpbmQgdGhlIFRjbCBpbmNsdWRlIGRpcmVjdG9yeSwgbGlicmFyeQoJICAgbG9jYXRpb24gYW5kIGxpYnJhcnkgbmFtZS4KCSAgICogW1B5dGhvbl06IEFkZGVkIGEgZmV3IHBvc3NpYmxlIGxpYnJhcnkgbG9jYXRpb25zLgoKNi8xOC8yMDAxOiBta29lcHBlCgkgICAqIFtHdWlsZV06IERvbid0IGNhbGwgc2NtX2NfZXhwb3J0IGlmIG5vdGhpbmcgaXMgdG8gYmUKCSAgICAgZXhwb3J0ZWQuICBEb24ndCB3YXJuIG9uICVtb2R1bGUgaWYgbW9kdWxlIGhhcyBiZWVuIHNldAoJICAgICBhbHJlYWR5ICh0aGlzIGZyZXF1ZW50bHkgb2NjdXJzIHdoZW4gJWltcG9ydCBpcyB1c2VkKS4KCjYvMTYvMjAwMTogbWtvZXBwZQoJICAgKiBbR3VpbGVdOiBOZXcgInBhc3NpdmUiIGxpbmthZ2UsIHdoaWNoIGlzIGFwcHJvcHJpYXRlIGZvcgoJICAgICBtdWx0aS1tb2R1bGUgZXh0ZW5zaW9ucyB3aXRob3V0IEd1aWxlIG1vZHVsZSBtYWdpYy4KCjYvMTUvMjAwMTogbWtvZXBwZQoJICAgKiBbR3VpbGVdOiBGaXhlZCBwcmludGluZyBvZiBzbW9icyAoc3BhY2UgYW5kIGFuZ2xlIHdlcmUKCSAgICAgbWlzc2luZykuIAoJICAgKiBQcm9wZXJseSBnZW5lcmF0ZSB0eXBlIGluZm9ybWF0aW9uIGZvciBiYXNlIGNsYXNzZXMKCSAgICAgaW1wb3J0ZWQgd2l0aCB0aGUgJWltcG9ydCBkaXJlY3RpdmUuICBUaGFua3MgdG8gTWFyY2VsbwoJICAgICBNYXR1cyA8bW1hdHVzQGFjbXMuYXJpem9uYS5lZHU+IGZvciB0aGUgcmVwb3J0IGFuZCB0aGUKCSAgICAgcGF0Y2g7IHRoaXMgY2xvc2VzIFNGIGJ1ZyAjMjMxNjE5OyBzZWUgYWxzbwoJICAgICBFeGFtcGxlcy9ndWlsZS90ZXN0LXN1aXRlL2ltcG9ydCouIAoJICAgKiBbR3VpbGVdOiBGaXggY2FzdGluZyBiZXR3ZWVuIGNsYXNzIGFuZCBiYXNlIGNsYXNzOyB0aGUKCSAgICAgcnVudGltZSB0eXBlIHN5c3RlbSBoYWQgaXQgdGhlIHdyb25nIHdheSBhcm91bmQ7IHNlZQoJICAgICBFeGFtcGxlcy9ndWlsZS90ZXN0LXN1aXRlL2Nhc3RzLmkKCSAgICogTWFrZSB0eXBlbWFwcyBmb3IgU1dJR1BPSU5URVIgKiB3aXRoIGFyZyBuYW1lIHRha2UKCSAgICAgcHJlY2VkZW5jZSBvdmVyIHRob3NlIHdpdGhvdXQgYXJnIG5hbWUsIHRvIG1hdGNoIG5vcm1hbAoJICAgICB0eXBlbWFwIHByZWNlZGVuY2UgcnVsZXMuCgkgICAqIEZpeGVkIHRoZSByYW5kb20tbGluZS1udW1iZXJzIHByb2JsZW0gcmVwb3J0ZWQgYXMgU0YgYnVnCgkgICAgICMyMTczMTA7IHRoYW5rcyB0byBNaWNoYWVsIFNjaGFyZiA8c2NoYXJmQHVzZXJzLnNmLm5ldD4uCgkgICAqIFtHdWlsZV06IEhhbmRsZSB0aGUgJW5hbWUgYW5kICVyZW5hbWUgZGlyZWN0aXZlcy4KCSAgICogTmV3IHN5bnRheDogJW5hbWUgYW5kICVyZW5hbWUgbm93IG9wdGlvbmFsbHkgdGFrZSBkb3VibGUKCSAgICAgcXVvdGVzIGFyb3VuZCB0aGUgc2NyaXB0aW5nIG5hbWUuICBUaGlzIGlzIHRvIGFsbG93IHNjcmlwdGluZwoJICAgICBuYW1lcyB0aGF0IGFyZW4ndCB2YWxpZCBDIGlkZW50aWZpZXJzLgoKNi8xNC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgTWFkZSBhIG1pbm9yIGNoYW5nZSB0byB0aGUgd2F5IGZpbGVzIGFyZSBsb2FkZWQgaW4KICAgICAgICAgICBvcmRlciB0byBnZXQgZmlsZS9saW5lIG51bWJlciByZXBvcnRpbmcgY29ycmVjdCBpbgogICAgICAgICAgIHRoZSBwcmVwcm9jZXNzb3IuCgo2LzE0LzIwMDE6IG1rb2VwcGUKCSAgICogVGhlIHBhcnNlciBub3cgdW5kZXJzdGFuZHMgdGhlIChub24tc3RhbmRhcmQpICJsb25nIGxvbmciCgkgICAgIHR5cGVzLiBJdCBpcyB1cCB0byB0aGUgaW5kaXZpZHVhbCBsYW5ndWFnZSBtb2R1bGVzIHRvCgkgICAgIHByb3ZpZGUgdHlwZW1hcHMgaWYgbmVlZGVkLiBSZXBvcnRlZCBieSBTYW0gU3RlaW5nb2xkLCBTRgoJICAgICBidWcgIzQyOTE3Ni4KCSAgICogVGhlIHBhcnNlciBub3cgdW5kZXJzdGFuZHMgYXJndW1lbnRzIGxpa2UgImNvbnN0IGludCAqCgkgICAgIGNvbnN0IGkiLiBUaGlzIGZpeGVzIFNGIGJ1ZyAjMjE1NjQ5LgoJICAgKiBGaXhlZCB0aGUgR3VpbGUgdGVzdC1zdWl0ZS4KCjYvMTMvMjAwMTogbWtvZXBwZQoJICAgUGFydGlhbCBtZXJnZSBmcm9tIHRoZSBDVlMgdHJ1bmsgYXQgdGFnCgkgICAibWtvZXBwZS1tZXJnZS0xIi4gVGhpcyBjb3ZlcnMgdGhlIGZvbGxvd2luZyBjaGFuZ2VzOgoKfCAwMS8xNi8wMTogdHRuCnwJICAgV3JvdGUgdGFibGUgb2YgY29udGVudHMgZm9yIERvYy9lbmdpbmVlcmluZy5odG1sLiAgQWRkZWQgc2VjdGlvbgp8CSAgIG9uIENWUyB0YWdnaW5nIGNvbnZlbnRpb25zLiAgQWRkZWQgY29weXJpZ2h0IHRvIG90aGVyIGRvY3MuCnwgOS8yNS8wMCA6IGJlYXpsZXkKfCAJICAgTW9kaWZpZWQgdGhlIHByZXByb2Nlc3NvciBzbyB0aGF0IG1hY3JvIG5hbWVzIGNhbiBzdGFydCB3aXRoIGEgJyUnLgp8IAkgICBUaGlzIG1heSBhbGxvdyBuZXcgU1dJRyAiZGlyZWN0aXZlcyIgdG8gYmUgZGVmaW5lZCBhcyBtYWNyb3MgaW5zdGVhZAp8IAkgICBvZiBoYXZpbmcgdG8gYmUgaGFyZC1jb2RlZCBpbnRvIHRoZSBwYXJzZXIuICAKfAp8ICoqKiBBbHNvIGEgeWV0LXRvLWJlLWRvY3VtZW50ZWQgcXVvdGluZyBtZWNoYW5pc20gd2l0aCBiYWNrcXVvdGVzCnwgKioqIGhhcyBiZWVuIGltcGxlbWVudGVkPwoKNi8xMy8yMDAxOiBta29lcHBlCgkgKiBXaGVuIGNvbmZpZ3VyZSBkb2VzIG5vdCBmaW5kIGEgbGFuZ3VhZ2UsIGRvbid0IHVzZSBkZWZhdWx0CgkgICBwYXRocyBsaWtlIC91c3IvbG9jYWwvaW5jbHVkZTsgdGhpcyBvbmx5IGNhdXNlcyBidWlsZAoJICAgcHJvYmxlbXMuCgkgKiBOZXcgZGlyZWN0b3J5OiBFeGFtcGxlcy9HdWlsZS90ZXN0LXN1aXRlLCB3aGVyZSBhIGZldwoJICAgYnVncyBpbiAxLjNhNSBhcmUgZGVtb25zdHJhdGVkLiAKCSAqIEhhbmRsZSBDKysgbWV0aG9kcyB0aGF0IGhhdmUgYm90aCBhICJjb25zdCIgYW5kIGEgInRocm93IgoJICAgZGlyZWN0aXZlIChzZWUgRXhhbXBsZXMvR3VpbGUvdGVzdC1zdWl0ZS9jcGx1c3BsdXMtdGhyb3cuaSk7IAoJICAgdGhhbmtzIHRvIFNjb3R0IEIuIERydW1tb25kcyBmb3IgdGhlIHJlcG9ydCBhbmQgdGhlIGZpeC4gCgkgKiBIYW5kbGUgQysrIHBvaW50ZXItcmVmZXJlbmNlIGFyZ3VtZW50cyAobGlrZSAiaW50IComIGFyZyIpIAoJICAgKHNlZSBFeGFtcGxlcy9HdWlsZS90ZXN0LXN1aXRlL3BvaW50ZXItcmVmZXJlbmNlLmksCgkgICByZXBvcnRlZCBhcyBTRiBidWcgIzQzMjIyNCkuCgkgKiBbUnVieV0gRml4ZWQgdHlwbyBpbiBydWJ5ZGVjLnN3ZzsgdGhhbmtzIHRvIEx5bGUgSm9obnNvbiEKCSAqIERvbid0IHN0b3AgdGVzdGluZyB3aGVuIG9uZSB0ZXN0IGZhaWxzLgoJICogW0d1aWxlLCBNelNjaGVtZV0gRG9uJ3QgcHJpbnQgIkdlbmVyYXRpbmcgd3JhcHBlcnMuLi4iLgoKNi8xMi8yMDAxOiBta29lcHBlCgkgICBbR3VpbGVdIFZFQ1RPUkxFTklOUFVUIGFuZCBMSVNUTEVOSU5QVVQgbm93IGhhdmUgc2VwYXJhdGUKCSAgIGxpc3QgbGVuZ3RoIHZhcmlhYmxlcy4gVFlQRU1BUF9QT0lOVEVSX0lOUFVUX09VVFBVVAoJICAgYXR0YWNoZXMgYXJndW1lbnQgZG9jdW1lbnRhdGlvbiBpbnZvbHZpbmcgU0NNX1RZUEUgdG8gdGhlCgkgICBzdGFuZGFyZCBwb2ludGVyIHR5cGVtYXBzLiBJTk9VVCBpcyBub3cgYW4gYWxpYXMgZm9yIEJPVEguCgo2LzEyLzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQoJICAgU29tZSBKYXZhIGRvY3VtZW50YXRpb24gYWRkZWQuCgkgICBbSmF2YV0gRml4ZWQgYnVncyBpbiBpbXBvcnQgcHJhZ21hIGFuZCBzaGFkb3cgcHJhZ21hLiAKCjYvMTIvMjAwMTogbWtvZXBwZQoJICAgRml4IGRlY2xhcmF0aW9ucyBvZiBTV0lHX2RlZmluZV9jbGFzcwoJICAgKExpYi9ydWJ5L3J1YnlkZWMuc3dnKSBhbmQgU1dJR19UeXBlUXVlcnkKCSAgIChMaWIvY29tbW9uLnN3ZykuIFRoYW5rcyB0byBMeWxlIEpvaG5zb24KCSAgIDxsam9obnNvbkByZXNnZW4uY29tPiBmb3IgdGhlIHBhdGNoZXMuCgo2LzExLzIwMDE6IG1rb2VwcGUKCSAgIFtHdWlsZV0gVXNlIGxvbmcgaW5zdGVhZCBvZiBzY21fYml0c190OyB0aGlzIG1ha2VzIHRoZQoJICAgZ2VuZXJhdGVkIHdyYXBwZXIgY29kZSBjb21wYXRpYmxlIHdpdGggR3VpbGUgMS4zLjQKCSAgIGFnYWluLiBUaGFua3MgdG8gTWFzYWtpIEZ1a3VzaGltYSBmb3IgcG9pbnRpbmcgdGhpcyBvdXQuCgo2LzExLzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQoJICAgVGhlIGdlbmVyaWMgSU5TVEFMTCBmaWxlIGZyb20gYXV0b2NvbmYgYWRkZWQuIEZldyBjaGFuZ2VzIHRvIFJFQURNRSBmaWxlLgoKNi8xMS8yMDAxOiBta29lcHBlCgkgICBGaXhlZCB0eXBvIGluIE1ha2VmaWxlLmluOyB0aGFua3MgdG8gR3JlZyBUcm94ZWwKCSAgIDxnZHRAaXIuYmJuLmNvbT4uIAoKNi8wOC8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKCSAgIG1ha2UgY2hlY2sgd29ya3MgYWdhaW4uIEV4YW1wbGVzL0dJRlBsb3QgY29uZmlndXJlIGdlbmVyYXRlZCBieQoJICAgdG9wIGxldmVsIGF1dG9jb25mIG5vdy4KCjYvMDgvMjAwMTogbWtvZXBwZQoJICAgQW5vdGhlciBidWlsZCBjaGFuZ2U6IFRoZSBuZXcgc2NyaXB0IGF1dG9nZW4uc2ggcnVucwoJICAgYXV0b2NvbmYgaW4gdGhlIGFwcHJvcHJpYXRlIGRpcmVjdG9yaWVzLiAgVGhlIHRvcC1sZXZlbAoJICAgY29uZmlndXJlIGFsc28gY29uZmlndXJlcyBpbiBFeGFtcGxlcy9HSUZQbG90LgoKNi8wNy8yMDAxOiBta29lcHBlCgkgICBNYWRlIHRoZSBNYWtlZmlsZSB3b3JrIHdpdGggbm9uLUdOVSBtYWtlIGFnYWluLgoKNi8wNy8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKCSAgIFtKYXZhXSBDbGFzcy9zdHJ1Y3QgbWVtYmVycyB0aGF0IGFyZSBhcnJheXMgb2YgcG9pbnRlcnMgdG8gY2xhc3Nlcy9zdHJ1Y3RzIC0KCSAgIFNoYWRvdyBjbGFzcydzIGdldC9zZXQgYWNjZXNzb3JzIG5vdyB1c2UgSmF2YSBjbGFzc2VzIGluc3RlYWQgb2YgbG9uZ3MgKHBvaW50ZXJzKS4KCSAgIFtKYXZhXSBTaGFkb3cgY2xhc3NlcyB3aWxsIG5vdyBjbGVhbiB1cCBtZW1vcnkgaWYgZnVuY3Rpb24gcmV0dXJuIHR5cGUgCgkgICBpcyBhIGNsYXNzL3N0cnVjdC4KCSAgIFtKYXZhXSBOZXcgZXhhbXBsZSBjYWxsZWQgcmVmZXJlbmNlIGJhc2VkIG9uIHRoZSBzYW1lIGV4YW1wbGUgZnJvbSBvdGhlciBtb2R1bGVzLgoKNi8wNi8yMDAxOiBta29lcHBlCgkgICBOZXcgY29uZmlndXJlIG9wdGlvbiAtLXdpdGgtcmVsZWFzZS1zdWZmaXggYWxsb3dzIGZvcgoJICAgYXR0YWNoaW5nIGEgc3VmZml4IHRvIHRoZSBzd2lnIGJpbmFyeSBhbmQgdGhlIHN3aWcgcnVudGltZQoJICAgbGlicmFyaWVzLiAgTWlub3IgY2hhbmdlcyB0byB0aGUgYnVpbGQgc3lzdGVtLiAgInN3aWcKCSAgIC1zd2lnbGliIiB3b3JrcyBhZ2Fpbi4gIElmIGludm9rZWQgd2l0aCB0aGUgbmV3IG9wdGlvbgoJICAgIi1sZGZsYWdzIiwgU1dJRyBwcmludHMgYSBsaW5lIG9mIGxpbmtlciBmbGFncyBuZWVkZWQgdG8KCSAgIGxpbmsgd2l0aCB0aGUgcnVudGltZSBsaWJyYXJ5IG9mIHRoZSBzZWxlY3RlZCBsYW5ndWFnZQoJICAgbW9kdWxlLiAKCjYvMDYvMjAwMTogbWtvZXBwZQoJICAgW0d1aWxlXSBnc3dpZ19saXN0X3AgaXMgYW4gaW50LCBub3QgYSBTQ00uICBUaGlzIHR5cG8KCSAgIGNhdXNlZCB3YXJuaW5ncyB3aGVuIGNvbXBpbGluZyB3aXRoIGEgR3VpbGUgY29uZmlndXJlZCB3aXRoCgkgICBzdHJpY3QgQyB0eXBlIGNoZWNraW5nLiBJbiBJTlBVVCBhbmQgQk9USCB0eXBlbWFwcwoJICAgZ2VuZXJhdGVkIGJ5IHRoZSBTSU1QTEVfTUFQIG1hY3JvLCB1c2UgdGhlIFNDTV9UT19DCgkgICBmdW5jdGlvbiB0byBjb252ZXJ0IGZyb20gR3VpbGUgdG8gQyAocmF0aGVyIHRoYW4gQ19UT19TQ00pLgoJICAgVXNlIHNjbV9pbnRwcmludCB0byBwcmludCBwb2ludGVycyAocmF0aGVyIHRoYW4KCSAgIHNwcmludGYpLiBBbGxvdyB1c2luZyAiLWxpbmthZ2UiIGluc3RlYWQgb2YgIi1MaW5rYWdlIi4gCgo2LzA1LzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQoJICAgW0phdmFdIE1vZHMgZm9yIHVzaW5nIGluaGVyaXRlZCBjKysgY2xhc3NlcyBmcm9tIEphdmEKCSAgIFtKYXZhXSBOZXcgZXhhbXBsZSBjYWxsZWQgY2xhc3MgYmFzZWQgb24gdGhlIHNhbWUgZXhhbXBsZSBmcm9tIG90aGVyIG1vZHVsZXMKCjYvMDUvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCgkgICBbSmF2YV0gZGVzdHJ1Y3RvciAoX2RlbGV0ZSgpKSB3YXMgbm90IGF3YXJlIG9mICVuYW1lIHJlbmFtaW5nCgkgICBbSmF2YV0gZXh0ZW5kcyBiYXNlY2xhc3MgZGlkIG5vdCBrbm93IGFib3V0ICVuYW1lIHJlbmFtaW5nCgkgICBbSmF2YV0gZXh0ZW5kcyBiYXNlY2xhc3MgZGlkIGV4dGVuZCBldmVuIHdoZW4gdGhlIGJhc2VjbGFzcyB3YXMgbm90IGtub3duIHRvIHN3aWcKCSAgIFtKYXZhXSBzb21ldGltZXMgZW51bS1kZWNsYXJhdGlvbnMgb2NjdXJlZCBiZWZvcmUgdGhlIEphdmEgY2xhc3MgZGVjbGFyYXRpb24KCSAgIFtKYXZhXSB1bnJlbGF0ZWQgZW51bSBpbml0aWFsaXNhdGlvbnMgbm8gbG9uZ2VyIGFwcGVhciBpbiBKYXZhIGNsYXNzCgkgICBbSmF2YV0gaWYgbW9kdWxlIGVuZHMgaW4gJ18nIGNvcnJlY3QgSk5JIG5hbWVzIGFyZSBub3cgcHJvZHVjZWQKCjYvMDQvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCgkgICBbSmF2YV0gU2hhZG93IGNsYXNzIG1vZHMgLSBNb2RpZmllZCBjb25zdHJ1Y3RvciByZXBsYWNlcwoJICAgbmV3SW5zdGFuY2UoKS4gX2RlbGV0ZSgpIG5vdyB0aHJlYWQgc2FmZS4gZ2V0Q1B0cigpIHJlcGxhY2VzCgkgICBfc2VsZi4gX3NlbGZDbGFzcygpIHJlbW92ZWQgYXMgbm93IHJlZHVuZGFudC4gCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgSkFWQSBNT0RVTEUgKioqCgoJICAgW0phdmFdIE5vdCBhbGwgb3V0cHV0IGphdmEgZmlsZXMgaGFkIFNXSUcgYmFubmVyLiBOZXcgYmFubmVyLgoKCSAgIFtKYXZhXSBTaGFkb3cgY2xhc3MgZmluYWxpemVycyBhcmUgb3V0cHV0IGJ5IGRlZmF1bHQ6IENvbW1hbmQKCSAgIGxpbmUgb3B0aW9uIC1maW5hbGl6ZSBkZXByZWNhdGVkIGFuZCByZXBsYWNlZCB3aXRoIC1ub2ZpbmFsaXplLgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEpBVkEgTU9EVUxFICoqKgoKNi8gMS8yMDAxOiBta29lcHBlCgkgICBbR3VpbGVdIENhc3QgU0NNX0NBUigpIHRvIHNjbV9iaXRzX3QgYmVmb3JlIHNoaWZ0aW5nIGl0LgoJICAgVGhpcyBpcyByZXF1aXJlZCBmb3IgY29tcGlsaW5nIHdpdGggYSBHdWlsZSBjb25maWd1cmVkIHdpdGgKCSAgIHN0cmljdCBDIHR5cGUgY2hlY2tpbmcuICAKCjYvIDEvMjAwMTogbWtvZXBwZQoJICAgQWRkZWQgY29uZmlndXJlIG9wdGlvbiAiLS13aXRoLXN3aWdsaWJkaXIiLgoKNS8zMS8yMDAxOiBta29lcHBlCgkgICBbR3VpbGVdIFN1cHBvcnQgbXVsdGlwbGUgcGFyYWxsZWwgbGlzdHMgb3IgdmVjdG9ycyBpbgoJICAgdGhlIHR5cGVtYXBzIHByb3ZpZGVkIGJ5IGxpc3QtdmVjdG9yLmkuICBOZXcgdHlwZW1hcHMgZmlsZSwKCSAgIHBvaW50ZXItaW4tb3V0LmkuIAoKNS8yNS8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKCSAgIFtKYXZhXSBIVE1MIHVwZGF0ZSBmb3IgZXhhbXBsZXMuCgo1LzI4LzIwMDE6IG1rb2VwcGUKCSAgIE1pbm9yIGNoYW5nZXMgdG8gdGhlIGJ1aWxkIHN5c3RlbS4gIEFkZGVkIHN1YmRpcmVjdG9yeSBmb3IKCSAgIERlYmlhbiBwYWNrYWdlIGNvbnRyb2wgZmlsZXMuCgo1LzI4LzIwMDE6IG1rb2VwcGUKCSAgIFtHdWlsZV0gQnVpbGQgYSBydW50aW1lIGxpYnJhcnksIGxpYnN3aWdndWlsZS4KCjUvMjgvMjAwMTogbWtvZXBwZQoJICAgW0d1aWxlXSBOZXcgdHlwZW1hcCBzdWJzdGl0dXRpb24gJCpkZXNjcmlwdG9yLiAgVXNlIHRoZSB7fQoJICAgc3ludGF4LCByYXRoZXIgdGhhbiB0aGUgIiIgc3ludGF4IGZvciB0aGUgc3RhbmRhcmQKCSAgIHR5cGVtYXBzLCBpbiBvcmRlciB0byB3b3JrIGFyb3VuZCBzdHJhbmdlIG1hY3JvLWV4cGFuc2lvbgoJICAgYmVoYXZpb3Igb2YgdGhlIFNXSUcgcHJlcHJvY2Vzc29yLiAgVGhpcyBpbnRyb2R1Y2VzIHNvbWUKCSAgIGV4dHJhIGJyYWNlcy4KCjUvMjcvMjAwMTogbWtvZXBwZQoJICAgW0d1aWxlXSBIYW5kbGUgcG9pbnRlciB0eXBlcyB3aXRoIHR5cGVtYXBzLCByYXRoZXIgdGhhbgoJICAgaGFyZC1jb2RlZC4gTmV3IHR5cGVtYXAgc3Vic3RpdHV0aW9ucyAkZGVzY3JpcHRvciwKCSAgICRiYXNlZGVzY3JpcHRvcjsgc2VlIGRvY3VtZW50YXRpb24uIFNvbWUgY2xlYW4tdXAgaW4gdGhlCgkgICB2YXJpYWJsZS9jb25zdGFudHMgd3JhcHBlciBnZW5lcmF0b3IgY29kZS4gIE5ldyBjb252ZW5pZW5jZQoJICAgbWFjcm8gU1dJR19HdWlsZV9NdXN0R2V0UHRyLCB3aGljaCBhbGxvd3MgZ2V0dGluZyBwb2ludGVycwoJICAgZnJvbSBzbW9icyBpbiBhIGZ1bmN0aW9uYWwgc3R5bGUuICBOZXcgdHlwZW1hcCBmaWxlCgkgICAibGlzdC12ZWN0b3IuaSIsIHByb3ZpZGluZyBtYWNyb3MgdGhhdCBkZWZpbmUgdHlwZW1hcHMgZm9yCgkgICBjb252ZXJ0aW5nIGJldHdlZW4gQyBhcnJheXMgYW5kIFNjaGVtZSBsaXN0cyBhbmQgdmVjdG9ycy4KCjUvMjUvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCgkgICBbSmF2YV0gU1RMIHN0cmluZyBtb3ZlZCBpbnRvIGl0cyBvd24gdHlwZW1hcCBhcyBpdCBpcyBjKysgY29kZSBhbmQgCgkgICBpdCBicmVhayBhbnkgYyBjb2RlIHVzaW5nIHRoZSB0eXBlbWFwcy5pIGZpbGUuCgkgICAtIEZpeGVzIGZvciB3cmFwcGVycyBhcm91bmQgZ2xvYmFsIHZhcmlhYmxlcyAtIGFwcGxpZXMgdG8gcHJpbWl0aXZlIAoJICAgdHlwZXMgYW5kIHVzZXIgdHlwZXMgKGNsYXNzL3N0cnVjdCkgYW5kIHBvaW50ZXJzIHRvIHRoZXNlLgoJICAgLSBTdHJ1Y3R1cmUgbWVtYmVyIHZhcmlhYmxlcyBhbmQgY2xhc3MgcHVibGljIG1lbWJlciB2YXJpYWJsZXMgZ2V0dGVycyAKCSAgIGFuZCBzZXR0ZXJzIHBhc3MgYSBwb2ludGVyIHRvIHRoZSBtZW1iZXIgYXMgd2FzIGluIDEuM2EzIGFuZCAxLjEgCgkgICAoMS4zYTUgd2FzIHBhc3NpbmcgYnkgdmFsdWUpCgkgICAtIFBhcmFtZXRlcnMgdGhhdCB3ZXJlIGFycmF5cyBhbmQgcmV0dXJuIHR5cGVzIHdlcmUgaW5jb3JyZWN0bHkgCgkgICBiZWluZyBwYXNzZWQgdG8gY3JlYXRlX2Z1bmN0aW9uKCkgYXMgcG9pbnRlcnMuCgkgICAtIEZpeCBmb3IgYXJyYXlzIG9mIGVudW1zLiAKCSAgIFtKYXZhXSBVcGRhdGVkIGphdmEgZXhhbXBsZXMgYW5kIGFkZGVkIHR3byBtb3JlLgoJICAgW0phdmFdIEphdmEgbW9kdWxlIHVwZGF0ZWQgZnJvbSBTV0lHMS4zYTMgaW5jbHVkaW5nIGNvZGUgY2xlYW51cCBldGMuCgkgICBbSmF2YV0gZW51bSBzdXBwb3J0IGFkZGVkLgoJICAgW0phdmFdIEFycmF5IHN1cHBvcnQgaW1wbGVtZW50ZWQKCSAgIFtKYXZhXSBTaGFkb3cgY2xhc3NlcyBpbXByb3ZlZCAtIEphdmEgb2JqZWN0cyB1c2VkIHJhdGhlciB0aGFuIAoJICAgbG9uZ3MgaG9sZGluZyB0aGUgYyBwb2ludGVyIHRvIHRoZSB3cmFwcGVkIHN0cnVjdHVyZS9jKytjbGFzcwoKNS8yMi8yMDAxOiBta29lcHBlCgkgICBbR3VpbGVdIEZpeGVkIGV4dGVybiAiQyIgZGVjbGFyYXRpb25zIGluIEMrKyBtb2RlLiBUaGFua3MKCSAgIHRvIEdyZWcgVHJveGVsIDxnZHRAaXIuYmJuLmNvbT4uCgo1LzIxLzIwMDE6IG1rb2VwcGUKCSAgIFtHdWlsZV0gTmV3IGxpbmthZ2UgIm1vZHVsZSIgZm9yIGNyZWF0aW5nIEd1aWxlIG1vZHVsZXMgZm9yCgkgICBHdWlsZSB2ZXJzaW9ucyA+PSAxLjUuMC4gCgo0LzE4LzIwMDE6IG1rb2VwcGUKCSAgIFtNelNjaGVtZV0gQWRkZWQgdHlwZW1hcHMgZm9yIHBhc3NpbmcgdGhyb3VnaCBTY2hlbWVfT2JqZWN0CgkgICBwb2ludGVycy4gCgo0LzkvMjAwMSA6IG1rb2VwcGUgCgkgICBbTXpTY2hlbWVdIEFkZGVkIHR5cGVtYXBzIGZvciBgYm9vbCcuICBJbmNsdXNpb24gb2YgaGVhZGVycwoJICAgYW5kIHN1cHBvcnQgcm91dGluZXMgaXMgbm93IGRhdGEtZHJpdmVuIHZpYSBtenNjaGVtZS5pLgoJICAgSGVhZGVycyBjb21lIGZyb20gdGhlIG5ldyBmaWxlIG16c2NoZW1kZWMuc3dnLiAgRG9uJ3QgYWJvcnQKCSAgIGltbWVkaWF0ZWx5IHdoZW4gYSB0eXBlLWhhbmRsaW5nIGVycm9yIGlzIHJlcG9ydGVkLiAgV2hlbgoJICAgc2VhcmNoaW5nIGZvciB0eXBlbWFwcyBmb3IgZW51bXMsIGZhbGwgYmFjayB0byB1c2luZyBpbnQsCgkgICBsaWtlIHRoZSBHdWlsZSBiYWNrZW5kIGRvZXMuICBTdXBwb3J0IGNoYXIgY29uc3RhbnRzLiAgRW1pdAoJICAgY29ycmVjdCB3cmFwcGVyIGNvZGUgZm9yIHZhcmlhYmxlcy4KCjMvMTIvMjAwMTogbWtvZXBwZQoJICAgW0d1aWxlXSBGaXhlZCB0eXBlbWFwcyBmb3IgY2hhciAqKk9VVFBVVCwgY2hhciAqKkJPVEguCgozLzIvMjAwMSA6IG1rb2VwcGUgCgkgICBbR3VpbGVdIEV2ZXJ5IHdyYXBwZXIgZnVuY3Rpb24gbm93IGdldHMgYSBib29sZWFuIHZhcmlhYmxlCgkgICBnc3dpZ19saXN0X3Agd2hpY2ggaW5kaWNhdGVzIHdoZXRoZXIgbXVsdGlwbGUgdmFsdWVzIGFyZQoJICAgcHJlc2VudC4gVGhlIG1hY3JvcyBHVUlMRV9BUFBFTkRfUkVTVUxULCBHVUlMRV9NQVlCRV9WQUxVRVMKCSAgIGFuZCBHVUlMRV9NQVlCRV9WRUNUT1IgdXNlIHRoaXMgdmFyaWFibGUsIHJhdGhlciB0aGFuCgkgICBjaGVja2luZyB3aGV0aGVyIHRoZSBjdXJyZW50IHJldHVybiB2YWx1ZSBpcyBhIGxpc3QuIFRoaXMKCSAgIGFsbG93cyBmb3IgdHlwZW1hcHMgcmV0dXJuaW5nIGEgbGlzdCBhcyBhIHNpbmdsZSB2YWx1ZSAoYQoJICAgbGlzdCB3YXMgZXJyb25lb3VzbHkgY29udmVydGVkIGludG8gYSB2ZWN0b3Igb3IgYQoJICAgbXVsdGlwbGUtdmFsdWUgb2JqZWN0IGluIHRoaXMgY2FzZSkuCgozLzEvMjAwMSA6IG1rb2VwcGUKCSAgIFtHdWlsZV0gQWRkZWQgc3VwcG9ydCBmb3IgcmV0dXJuaW5nIG11bHRpcGxlIHZhbHVlcyBhcwoJICAgdmVjdG9ycywgb3IgcGFzc2luZyB0aGVtIHRvIGEgbXVsaXBsZS12YWx1ZQoJICAgY29udGludWF0aW9uLiBCeSBkZWZhdWx0LCBtdWx0aXBsZSB2YWx1ZXMgc3RpbGwgZ2V0CgkgICByZXR1cm5lZCBhcyBhIGxpc3QuCgozLzEvMjAwMSA6IG1rb2VwcGUKCSAgIFtHdWlsZV0gQWRkZWQgYSAiYmVmb3JlcmV0dXJuIiBwcmFnbWEuIFRoZSB2YWx1ZSBvZiB0aGlzCgkgICBwcmFnbWEgaXMgaW5zZXJ0ZWQganVzdCBiZWZvcmUgZXZlcnkgcmV0dXJuIHN0YXRlbWVudC4KCjMvMS8yMDAxIDogbWtvZXBwZQoJICAgW0d1aWxlXSBBZGRlZCBzdXBwb3J0IGZvciBHdWlsZSAxLjQuMSBwcm9jZWR1cmUKCSAgIGRvY3VtZW50YXRpb24gZm9ybWF0cywgc2VlIGludGVybmFscy5odG1sLgoKMi8yNi8yMDAxOiBta29lcHBlCgkgICBbR3VpbGVdIE1hZGUgdGhlIHdyYXBwZXIgY29kZSBjb21waWxlIHdpdGggQysrIGlmIHRoZQoJICAgIi1jKysiIGNvbW1hbmQtbGluZSBzd2l0Y2ggaXMgZ2l2ZW4uICBUaGFua3MgdG8KCSAgIDxtb25rZXlpcUBkaW5nb2JsdWUubmV0LmF1Pi4gCgoyLzI2LzIwMDE6IG1rb2VwcGUKCSAgIFtHdWlsZV0gTm93IHR3byB0eXBlIHRhYmxlcywgc3dpZ190eXBlcyBhbmQKCSAgIHN3aWdfdHlwZXNfaW5pdGlhbCwgYXJlIHVzZWQsIGFzIGFsbCBvdGhlciBTV0lHIGxhbmd1YWdlCgkgICBtb2R1bGVzIGRvLiAgVGhpcyByZW1vdmVzIHRoZSBuZWVkIGZvciB0aGUgdHJpY2t5CgkgICBjb25zdHJ1Y3Rpb24gdXNlZCBiZWZvcmUgdGhhdCB0aGUgYnJva2VuIFJlZGhhdCA3LjAgZ2NjCgkgICBkb2Vzbid0IHBhcnNlLiBSZXBvcnRlZCBieSA8bW9ua2V5aXFAZGluZ29ibHVlLm5ldC5hdT4uIAoKMi8yNi8yMDAxOiBta29lcHBlCgkgICBbR3VpbGVdIEZpeGVkIHR5cGVtYXBzIGZvciBjaGFyICpPVVRQVVQsIGNoYXIgKkJPVEg7IGEgYmFkCgkgICBmcmVlKCkgd291bGQgYmUgZW1pdHRlZC4gIEFkZGVkIHR5cGVtYXAgZm9yIFNDTS4KCgpWZXJzaW9uIDEuMyBBbHBoYSA1IAo9PT09PT09PT09PT09PT09PT09Cgo5LzE5LzAwIDogYmVhemxleQogICAgICAgICAgW1B5dGhvbl0gUHl0aG9uIG1vZHVsZSBnZW5lcmF0ZXMgbW9yZSBlZmZpY2llbnQgY29kZSBmb3IKICAgICAgICAgIGNyZWF0aW5nIHRoZSByZXR1cm4gdmFsdWUgb2YgYSB3cmFwcGVyIGZ1bmN0aW9uLiBNb2RpZmljYXRpb24KICAgICAgICAgIHN1Z2dlc3RlZCBieSBKb24gVHJhdmlzLgoKOS8xOS8wMCA6IGJlYXpsZXkKICAgICAgICAgIExpYnJhcnkgZmlsZXMgc3BlY2lmaWVkIHdpdGggdGhlIC1sIG9wdGlvbiBhcmUgbm93IGluY2x1ZGVkIGF0IHRoZQogICAgICAgICAgZW5kIG9mIHRoZSBpbnRlcmZhY2UgZmlsZSAocmV2ZXJ0aW5nIHRvIHRoZSBvbGQgYmVoYXZpb3IpLgoKOS8xOS8wMCA6IGJlYXpsZXkKICAgICAgICAgIEZpeGVkIHNvbWUgcHJvYmxlbXMgd2l0aCBlbnVtIGhhbmRsaW5nLiAgZW51bXMgYXJlIG5vdyBtYW5pcHVsYXRlZCBhcwogICAgICAgICAgJ2ludCcsIGJ1dCBjYXN0IGludG8gdGhlIGVudW0gdHlwZSB3aGVuIHZhbHVlcyBhcmUgcGFzc2VkIHRvIHRoZSAKICAgICAgICAgIGNvcnJlc3BvbmRpbmcgQyBmdW5jdGlvbi4KCjkvMTkvMDAgOiBta29lcHBlCgkgIFtHdWlsZV0gUmVtb3ZlZCAiLXdpdGgtc21vYnMiIGNvbW1hbmQtbGluZSBvcHRpb24sIGFzIHRoaXMgaXMgdGhlCgkgIGRlZmF1bHQgbm93LiAgQWRkZWQgIi1lbWl0LXNldHRlcnMiIGNvbW1hbmQtbGluZSBvcHRpb24sCgkgIHdoaWNoIHR1cm5zIG9uIGdlbmVyYXRpbmcgcHJvY2VkdXJlcy13aXRoLXNldHRlcnM7IHNlZQoJICBpbnRlcm5hbHMuaHRtbC4KCjkvMTgvMDAgOiBta29lcHBlCgkgIEluY29ycG9yYXRlZCBwYXRjaCAjMTAxNDMwLCBmaXhpbmcgYnVncyBpbiB0aGUgR3VpbGUgbW9kdWxlOiAKCSAgMS4gU29tZSBhcmd1bWVudHMgd2VyZSBlcnJvbmVvdXNseSB0YWtlbiBhcyAqb3B0aW9uYWwqIGFyZ3VtZW50cyB3aGVuCgkgICAgIGlnbm9yZWQgYXJndW1lbnRzIHdlcmUgcHJlc2VudC4gCgkgIDIuIEd1aWxlIDEuMy40IHdhcyBub3Qgc3VwcG9ydGVkIHNpbmNlIGZ1bmN0aW9ucyBpbnRyb2R1Y2VkIGluIEd1aWxlCgkgICAgICAxLjQgd2VyZSB1c2VkLgkgIAoJICAzLiBBZGRlZCBoYW5kbGluZyBvZiBgY29uc3QgY2hhciAqJy4KCjkvMTcvMDAgOiBiZWF6bGV5CiAgICAgICAgICBGaXhlZCBwcm9ibGVtIHdpdGggZmFpbGVkIGFzc2VydGlvbiBhbmQgbGFyZ2UgZmlsZXMuCgo5LzE3LzAwIDogYmVhemxleQogICAgICAgICAgRml4ZWQgcHJvYmxlbSB3aXRoIHRoZSAnJScgY2hhcmFjdGVyIGFwcGVhcmluZyBpbiBhZGRlZCBtZXRob2RzCiAgICAgICAgICBhbmQgZnVuY3Rpb24gYm9kaWVzLiAgUHJlcHJvY2Vzc29yIGJ1Zy4KClZlcnNpb24gMS4zIEFscGhhIDQgKFNlcHRlbWJlciA0LCAyMDAwKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjkvMy8wMCAgOiB0dG4KICAgICAgICAgIEFkZGVkIGluc3RydWN0aW9ucyBmb3IgbWFpbnRhaW5lcnMgaW4gRXhhbXBsZXMvUkVBRE1FIG9uIGhvdwogICAgICAgICAgdG8gbWFrZSBleGFtcGxlcyBhbHNvIGJlIHVzZWZ1bCBpbiB0aGUgdGVzdGluZyBmcmFtZXdvcmsuCiAgICAgICAgICBBbHNvLCAibWFrZSBjaGVjayIgbm93IHVzZXMgLi9MaWIgYnkgdmlhIGVudiB2YXIgYFNXSUdfTElCJy4KICAgICAgICAgIFRoaXMgaXMgb3ZlcnJpZGFibGUgbGlrZSBzbzoKICAgICAgICAgICAgIG1ha2UgY2hrLXN3aWdsaWI9L215L2V4cGVyaW1lbnRhbC9zd2lnL0xpYiBjaGVjawoKOS8zLzAwICA6IGJlYXpsZXkKICAgICAgICAgIEFkZGVkICR0eXBlbWFwIHZhcmlhYmxlIHRvIHR5cGVtYXBzLiAgVGhpcyBnZXRzIHJlcGxhY2VkIHdpdGgKICAgICAgICAgIGEgc3RyaW5nIGluZGljYXRpbmcgdGhlIHR5cGVtYXAgdGhhdCBpcyBhcHBsaWVkLiAgRmVhdHVyZQogICAgICAgICAgcmVxdWVzdCBmcm9tIHJzYWx6LgoKOS8zLzAwICA6IGJlYXpsZXkKICAgICAgICAgIEV4cGVyaW1lbnRhbCBvcHRpbWl6YXRpb24gdG8gY29kZSBnZW5lcmF0aW9uIGZvciB2aXJ0dWFsCiAgICAgICAgICBtZW1iZXIgZnVuY3Rpb25zLiAgSWYgeW91IGhhdmUgdHdvIGNsYXNzZXMgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgICBjbGFzcyBBKCkgewogICAgICAgICAgICAgICAgICAgdmlydHVhbCB2b2lkIGZvbygpOwogICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgY2xhc3MgQigpIDogcHVibGljIEEgewogICAgICAgICAgICAgICAgICAgdmlydHVhbCB2b2lkIGZvbygpOwogICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICBTd2lnIG5vdyB3aWxsIGdlbmVyYXRlIGEgc2luZ2xlIHdyYXBwZXIgZnVuY3Rpb24gZm9yIHRoaXMKCiAgICAgICAgICAgICAgICBBX2ZvbyhBICphKSB7CiAgICAgICAgICAgICAgICAgICAgYS0+Zm9vKCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgYW5kIHVzZSBpdCBhcyB0aGUgaW1wbGVtZW50YXRpb24gb2YgYm90aCBBX2ZvbygpIGFuZCBCX2ZvbygpLgogICAgICAgICAgVGhpcyBvcHRpbWl6YXRpb24gb25seSB0YWtlcyBwbGFjZSBpZiBib3RoIG1ldGhvZHMgYXJlIGRlY2xhcmVkCiAgICAgICAgICBhcyB2aXJ0dWFsIGFuZCBib3RoIHRha2UgaWRlbnRpY2FsIHBhcmFtZXRlcnMuCiAgICAgICAgICAqKiogRVhQRVJJTUVOVEFMIEZFQVRVUkUgKioqCgo5LzMvMDAgIDogYmVhemxleQogICAgICAgICAgUmVzdG9yZWQgdGhlICJtZW1iZXJpbiIgdHlwZW1hcCBmb3Igc2V0dGluZyBzdHJ1Y3R1cmUgbWVtYmVycy4KICAgICAgICAgIFVubGlrZSB0aGUgb2xkIHZlcnNpb24sIHRoZSBuZXcgdmVyc2lvbiBpcyBleHBhbmRlZCBpbmxpbmUgaW4gdGhlCiAgICAgICAgICB3cmFwcGVyIGZ1bmN0aW9uIGFsbG93aW5nIGFjY2VzcyB0byBzY3JpcHRpbmcgbGFuZ3VhZ2UKICAgICAgICAgIGludGVybmFscyAoYSBzb21ldGltZXMgcmVxdWVzdGVkIGZlYXR1cmUpLiBUaGUgIm1lbWJlcm91dCIgdHlwZW1hcAogICAgICAgICAgaXMgZ29uZS4gVXNlIHRoZSAib3V0IiB0eXBlbWFwcyBpbnN0ZWFkLgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgo5LzMvMDAgIDogYmVhemxleQogICAgICAgICAgQXR0cmlidXRlIHNldCBtZXRob2RzIG5vIGxvbmdlciByZXR1cm4gdGhlIHZhbHVlIG9mIGEgbWVtYmVyLgogICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICBzdHJ1Y3QgRm9vIHsKICAgICAgICAgICAgICAgICAgICBpbnQgeDsKICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgfQoKICAgICAgICAgIG5vdyBnZXRzIHNldCBhcyBmb2xsb3dzOgoKICAgICAgICAgICAgICB2b2lkIEZvb194X3NldChGb28gKmYsIGludCB4KSB7CiAgICAgICAgICAgICAgICAgICAgZi0+eCA9IHg7CiAgICAgICAgICAgICAgfQoKICAgICAgICAgIEluIFNXSUcxLjEgaXQgdXNlZCB0byBiZSB0aGlzOgoKICAgICAgICAgICAgICBpbnQgRm9vX3hfc2V0KEZvbyAqZiwgaW50IHgpIHsKICAgICAgICAgICAgICAgICAgIHJldHVybiAoZi0+eCA9IHgpOwogICAgICAgICAgICAgIH0KCiAgICAgICAgICBUaGlzIGhhcyBiZWVuIGNoYW5nZWQgZHVlIHRvIHRoZSBjb21wbGV4aXR5IGNyZWF0ZWQgYnkgdHJ5aW5nCiAgICAgICAgICB0byBkbyB0aGlzIHdpdGggbW9yZSBleG90aWMgZGF0YXR5cGVzIHN1Y2ggYXMgYXJyYXlzLiAgSXQgYWxzbwogICAgICAgICAgY29tcGxpY2F0ZXMgaW5saW5pbmcgYW5kIGhhbmRsaW5nIG9mIHRoZSAibWVtYmVyaW4iIHR5cGVtYXAuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjkvMi8wMCAgOiBiZWF6bGV5CiAgICAgICAgICBSZW1vdmVkIHRoZSBwdHJjYXN0KCkgYW5kIHB0cm1hcCgpIGZ1bmN0aW9ucyBmcm9tIHRoZQogICAgICAgICAgcG9pbnRlci5pIGxpYnJhcnkgZmlsZS4gIE9sZCBpbXBsZW1lbnRhdGlvbiBpcyBpbmNvbXBhdGlibGUKICAgICAgICAgIHdpdGggbmV3IHR5cGUgc3lzdGVtLgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgo5LzIvMDAgIDogYmVhemxleQogICAgICAgICAgTmV3IHJ1bnRpbWUgZnVuY3Rpb24gU1dJR19UeXBlUXVlcnkoY29uc3QgY2hhciAqbmFtZSkgYWRkZWQuCiAgICAgICAgICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGV4dHJhY3QgdGhlIHR5cGUgaW5mbyBzdHJ1Y3R1cmUKICAgICAgICAgIHRoYXQgaXMgdXNlZCBmb3IgdHlwZS1jaGVja2luZy4gIEl0IHdvcmtzIHdpdGggZWl0aGVyIHRoZQogICAgICAgICAgbmljZSBDIG5hbWUgb3IgbWFuZ2xlZCB2ZXJzaW9uIG9mIGEgZGF0YXR5cGUuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgc3dpZ190eXBlX2luZm8gKnR5ID0gU3dpZ19UeXBlUXVlcnkoImludCAqIik7CiAgICAgICAgICAgICAgc3dpZ190eXBlX2luZm8gKnR5ID0gU3dpZ19UeXBlUXVlcnkoIl9wX2ludCIpOwoKICAgICAgICAgIFRoaXMgaXMgYW4gYWR2YW5jZWQgZmVhdHVyZSB0aGF0IGhhcyBiZWVuIGFkZGVkIHRvIHN1cHBvcnQgc29tZQogICAgICAgICAgZXhvdGljIGV4dGVuc2lvbiBtb2R1bGVzIHRoYXQgbmVlZCB0byBkaXJlY3RseSBtYW5pcHVsYXRlCiAgICAgICAgICBzY3JpcHRpbmcgbGFuZ3VhZ2Ugb2JqZWN0cy4KICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjkvMi8wMCAgOiBiZWF6bGV5CiAgICAgICAgICBOZXcgZGlyZWN0aXZlICV0eXBlcygpIGFkZGVkLiAgVGhpcyBpcyB1c2VkIHRvCiAgICAgICAgICBleHBsaWNpdGx5IGxpc3QgZGF0YXR5cGVzIHRoYXQgc2hvdWxkIGJlIGluY2x1ZGVkIGluCiAgICAgICAgICB0aGUgcnVudGltZSB0eXBlLWNoZWNraW5nIGNvZGUuIE5vcm1hbGx5IGl0IGlzIG5ldmVyCiAgICAgICAgICBuZWNlc3NhcnkgdG8gdXNlIHRoaXMgYnV0IHNvbWV0aW1lcyBhZHZhbmNlZCBleHRlbnNpb25zCiAgICAgICAgICAoc3VjaCBhcyB0aGUgcG9pbnRlci5pIGxpYnJhcnkpIG1heSBuZWVkIHRvIG1hbnVhbGx5CiAgICAgICAgICBhZGQgdHlwZXMgdG8gdGhlIHR5cGUtY2hlY2tlci4KICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjgvMzEvMDAgOiBiZWF6bGV5CiAgICAgICAgICBJbXByb3ZlZCBoYW5kbGluZyBvZiBzdHJpbmcgYXJyYXkgdmFyaWFibGVzLiBGb3IgZXhhbXBsZSwKICAgICAgICAgIGEgZ2xvYmFsIHZhcmlhYmxlIG9mIHRoZSBmb3JtICJjaGFyIG5hbWVbNjRdIiBpcyBhdXRvbWF0aWNhbGx5CiAgICAgICAgICBtYW5hZ2VkIGFzIGEgNjQgY2hhcmFjdGVyIHN0cmluZy4gIFByZXZpb3VzbHkgdGhpcyBkaWRuJ3QKICAgICAgICAgIHdvcmsgYXQgYWxsIG9yIHJlcXVpcmVkIHRoZSB1c2Ugb2YgYSBzcGVjaWFsIHR5cGVtYXAuCiAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKFRjbCwgUGVybCwgUHl0aG9uKSAqKioKCjgvMzEvMDAgOiB0dG4KCSAgQWRkZWQgTWFrZWZpbGUgdGFyZ2V0IGBjaGVjay1jKystZXhhbXBsZXMnLCB3aGljaCB1c2VzIG5ldwoJICBmaWxlcyB1bmRlciBFeGFtcGxlcy9DKysgY29udHJpYnV0ZWQgYnkgVGFsIFNoYWxpZi4gIE5vdyAibWFrZQoJICBjaGVjayIgYWxzbyBkb2VzICJtYWtlIGNoZWNrLWMrKy1leGFtcGxlcyIuICBBbHNvLCBleHBhbmRlZAoJICBhY3Rpb25zIGluIGBjaGVjay1naWZwbG90LWV4YW1wbGUnIGFuZCBgY2hlY2stYWxpdmVuZXNzJy4KCjgvMzAvMDAgOiBta29lcHBlCgkgIE1ham9yIGNsZWFuLXVwIGluIHRoZSBHdWlsZSBtb2R1bGUuIEFkZGVkIHR5cGVtYXAtZHJpdmVuCgkgIGRvY3VtZW50YXRpb24gc3lzdGVtLiBDaGFuZ2VkIHRvIGhhbmRsZSBtb3JlIHRoYW4gMTAKCSAgYXJncy4gVXBkYXRlZCBhbmQgZXh0ZW5kZWQgZXhhbXBsZXMuCgkgICoqKiBORVcgRkVBVFVSRSAqKioKCjgvMjkvMDAgOiBiZWF6bGV5CiAgICAgICAgICBBZGRlZCBuZXcgJWluc2VydCBkaXJlY3RpdmUgdGhhdCBpbnNlcnRzIHRoZSBjb250ZW50cyBvZiBhIGZpbGUKICAgICAgICAgIGludG8gYSBwb3J0aW9uIG9mIHRoZSBvdXRwdXQgd3JhcHBlciBmaWxlLiAgVGhpcyBpcyBvbmx5IGludGVuZGVkCiAgICAgICAgICBmb3IgdXNlIGJ5IHdyaXRlcnMgb2YgbGFuZ3VhZ2UgbW9kdWxlcy4gIFdvcmtzIGFzIGZvbGxvd3M6CgogICAgICAgICAgICAgICAlaW5zZXJ0KGhlYWRlcnMpICAiZmlsZS5zd2ciOwogICAgICAgICAgICAgICAlaW5zZXJ0KHJ1bnRpbWUpICAiZmlsZS5zd2ciOwogICAgICAgICAgICAgICAlaW5zZXJ0KHdyYXBwZXJzKSAiZmlsZS5zd2ciOwogICAgICAgICAgICAgICAlaW5zZXJ0KGluaXQpICAgICAiZmlsZS5zd2ciOwoKICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjgvMjkvMDAgOiBiZWF6bGV5CiAgICAgICAgICBBZGRlZCBuZXcgJXJ1bnRpbWUgZGlyZWN0aXZlIHdoaWNoIGluY2x1ZGVzIGNvZGUgaW50byB0aGUgcnVudGltZQogICAgICAgICAgcG9ydGlvbiBvZiB0aGUgd3JhcHBlciBjb2RlLiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgJXJ1bnRpbWUgJXsKICAgICAgICAgICAgICAgICAgICAuLi4gc29tZSBpbnRlcm5hbCBydW50aW1lIGNvZGUgLi4uCiAgICAgICAgICAgICAgJX0KCiAgICAgICAgICBUaGVyZSBpcyBubyBwcmFjdGljYWwgcmVhc29uIGZvciBvcmRpbmFyeSB1c2VycyB0byB1c2UgdGhpcwogICAgICAgICAgZmVhdHVyZSAoYWxtb3N0IGV2ZXJ5dGhpbmcgY2FuIGJlIGRvbmUgdXNpbmcgJXsgLi4uICV9CiAgICAgICAgICBpbnN0ZWFkKS4gICBIb3dldmVyLCB3cml0ZXJzIG9mIGxhbmd1YWdlIG1vZHVsZXMgbWF5IHdhbnQgdG8KICAgICAgICAgIHVzZSB0aGlzIGluIGxhbmd1YWdlIGNvbmZpZ3VyYXRpb24gZmlsZXMuCiAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgo4LzI4LzAwIDogYmVhemxleQogICAgICAgICAgVHlwZW1hcHMgY2FuIG5vdyBiZSBzcGVjaWZpZWQgdXNpbmcgc3RyaW5nIGxpdGVyYWxzIGxpa2UKICAgICAgICAgIHRoaXM6CgogICAgICAgICAgICAgICV0eXBlbWFwKGluKSBpbnQgIiR0YXJnZXQgPSBTdklWKCRzb3VyY2UpOyI7CgogICAgICAgICAgV2hlbiBjb2RlIGlzIHNwZWNpZmllZCBsaWtlIHRoaXMsIGl0IGlzICpOT1QqIGVuY2xvc2VkCiAgICAgICAgICBpbnNpZGUgYSBsb2NhbCBzY29wZSAoYXMgd2l0aCBvbGRlciB0eXBlbWFwIGRlY2xhcmF0aW9ucykuCiAgICAgICAgICBOb3RlOiBjaGFyYWN0ZXIgZXNjYXBlIHNlcXVlbmNlcyBhcmUgaW50ZXJwcmV0ZWQgaW4gdGhlCiAgICAgICAgICBjb2RlIHN0cmluZyBzbyBpZiB5b3Ugd2FudCB0byBpbmNsdWRlIGEgcXVvdGUgb3Igc29tZQogICAgICAgICAgb3RoZXIgc3BlY2lhbCBjaGFyYWN0ZXIsIG1ha2Ugc3VyZSB5b3UgdXNlIGEgKFwpLgogICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKOC8yNy8wMCA6IGJlYXpsZXkKICAgICAgICAgIFR5cGVtYXBzIGhhdmUgYmVlbiBtb2RpZmllZCB0byBmb2xsb3cgdHlwZWRlZiBkZWNsYXJhdGlvbnMuCiAgICAgICAgICBGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUgdGhpczoKCiAgICAgICAgICAgICAgdHlwZWRlZiBpbnQgTnVtYmVyOwoKICAgICAgICAgICAgICAldHlwZW1hcChpbikgaW50IHsKICAgICAgICAgICAgICAgICAgICAgIC4uLiBnZXQgYW4gaW50ZWdlciAuLi4KICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgIHZvaWQgZm9vKE51bWJlciBhKTsKCiAgICAgICAgICBUaGUgdHlwZW1hcCBmb3IgJ2ludCcgd2lsbCBiZSBhcHBsaWVkIHRvIHRoZSBhcmd1bWVudCAnTnVtYmVyIGEnLgogICAgICAgICAgT2YgY291cnNlLCBpZiB5b3Ugc3BlY2lmeSBhIHR5cGVtYXAgZm9yICdOdW1iZXInIGl0IHdpbGwgdGFrZQogICAgICAgICAgcHJlY2VkZW5jZSAobm9yIHdpbGwgaXQgZXZlciBiZSBhcHBsaWVkIHRvIGFuICdpbnQnKS4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKOC8yNy8wMCA6IGJlYXpsZXkKICAgICAgICAgIERlZmF1bHQgdHlwZW1hcCBzcGVjaWZpY2F0aW9uIGhhcyBjaGFuZ2VkLiAgIEluIG9sZGVyCiAgICAgICAgICB2ZXJzaW9ucyBvZiBzd2lnLCB5b3UgY291bGQgZG8gdGhpczoKCiAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSBpbnQgU1dJR19ERUZBVUxUX1RZUEUgewogICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICBUbyBzcGVjaWZ5IHRoZSBkZWZhdWx0IGhhbmRsaW5nIG9mIGEgZGF0YXR5cGUuICAgTm93IHRoYXQKICAgICAgICAgIFNXSUcgZm9sbG93cyB0eXBlZGVmIGRlY2xhcmF0aW9ucywgdGhpcyBpcyB1bm5lY2Vzc2FyeS4KICAgICAgICAgIFNpbXBseSBzcGVjaWZ5aW5nIGEgdHlwZW1hcCBmb3IgJ2ludCcgd2lsbCB3b3JrIGZvciBhbGwKICAgICAgICAgIHZhcmlhdGlvbnMgb2YgaW50ZWdlcnMgdGhhdCBhcmUgdHlwZWRlZidkIHRvICdpbnQnLgoKICAgICAgICAgIENhdmVhdCwgc3BlY2lmeWluZyB0aGUgZGVmYXVsdCBiZWhhdmlvciBmb3IgcG9pbnRlcnMsCiAgICAgICAgICByZWZlcmVuY2VzLCBhcnJheXMsIGFuZCB1c2VyIGRlZmluZWQgdHlwZXMgaXMgYSBsaXR0bGUKICAgICAgICAgIGRpZmZlcmVudC4gIFRoaXMgbXVzdCBiZSBkb25lIGFzIGZvbGxvd3M6CgogICAgICAgICAgICAgICAldHlwZW1hcCgpIFNXSUdQT0lOVEVSICogewogICAgICAgICAgICAgICAgICAgICAgLi4uIGEgcG9pbnRlciAuLi4KICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAldHlwZW1hcCgpIFNXSUdSRUZFUkVOQ0UgJiB7CiAgICAgICAgICAgICAgICAgICAgICAuLi4gYSByZWZlcmVuY2UgLi4uCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgJXR5cGVtYXAoKSBTV0lHQVJSQVkgW10gewogICAgICAgICAgICAgICAgICAgICAgLi4uIGFuIGFycmF5IC4uLgogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICV0eXBlbWFwKCkgU1dJR1RZUEUgewogICAgICAgICAgICAgICAgICAgICAgLi4uIGEgdXNlci1kZWZpbmVkIHR5cGUgKGJ5IHZhbHVlKSAuLi4KICAgICAgICAgICAgICAgfQogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgo4LzE1LzAwIDogZHVzdGluCiAgICAgICAgICBUaGUgZmlsZSBzd2lnLTEuM2ExLTEuc3BlYyBoYXMgYmVlbiBhZGRlZCB0byB0aGUgVG9vbHMgZGlyZWN0b3J5LgogICAgICAgICAgSXQgY2FuIGJlIHVzZWQgdG8gYnVpbGQgYSByZWRoYXQgcGFja2FnZSBmb3IgU1dJRywgYWx0aG91Z2ggaXQKICAgICAgICAgIHdpbGwgbmVlZCB0byBiZSB1cGRhdGVkIGZvciB0aGUgbmV4dCBwdWJsaWMgcmVsZWFzZS4KCjgvMTUvMDAgOiBiZWF6bGV5CiAgICAgICAgICBUeXBlbWFwcyBoYXZlIGJlZW4gY29tcGxldGVseSByZXdyaXR0ZW4uICBFdmVudHVhbGx5IHRoZXkgbWF5IGJlCiAgICAgICAgICByZXBsYWNlZCB3aXRoIHNvbWV0aGluZyBiZXR0ZXIsIGJ1dCBmb3Igbm93IHRoZXkgc3RheS4gIEhvd2V2ZXIsCiAgICAgICAgICB0aGVyZSBhcmUgYSBudW1iZXIgb2YgYSBzaWduaWZpY2FudCBjaGFuZ2VzIHRoYXQgbWF5IHRyaXAgc29tZQogICAgICAgICAgcGVvcGxlIHVwOgoKICAgICAgICAgIDEuICBUeXBlbWFwIHNjb3BpbmcgaXMgY3VycmVudGx5IGJyb2tlbi4gIEJlY2F1c2Ugb2YgdGhpcywgdGhlCiAgICAgICAgICAgICAgZm9sbG93aW5nIGNvZGUgd29uJ3Qgd29yay4KCiAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIGJsYWggKiB7CiAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgaW50IGJhcihibGFoICp4KTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIGJsYWggKjsgICAvKiBDbGVhciB0eXBlbWFwICovCgogICAgICAgICAgICAgICh0aGlzIGJyZWFrcyBiZWNhdXNlIHRoZSBjb2RlIGZvciB0aGUgY2xhc3MgRm9vIGlzIGFjdHVhbGx5CiAgICAgICAgICAgICAgZ2VuZXJhdGVkIGFmdGVyIHRoZSBlbnRpcmUgaW50ZXJmYWNlIGZpbGUgaGFzIGJlZW4gcHJvY2Vzc2VkKS4KICAgICAgICAgICAgICBUaGlzIGlzIG9ubHkgYSB0ZW1wb3JhcnkgYnVnLgoKICAgICAgICAgIDIuICBJbiBTV0lHMS4xLCB0aGUgJWFwcGx5IGRpcmVjdGl2ZSB3b3JrZWQgYnkgcGVyZm9ybWluZyBhCiAgICAgICAgICAgICAgdmVyeSBjb21wbGV4IHR5cGUtYWxpYXNpbmcgcHJvY2VkdXJlLiAgRnJvbSB0aGlzIHBvaW50IG9uLAogICAgICAgICAgICAgICVhcHBseSBpcyBzaW1wbHkgYSBnZW5lcmFsaXplZCB0eXBlbWFwIGNvcHkgb3BlcmF0aW9uLgogICAgICAgICAgICAgIEZvciBleGFtcGxlLAoKICAgICAgICAgICAgICAgICAgJWFwcGx5IGRvdWJsZSAqT1VUUFVUIHsgZG91YmxlICp4LCBkb3VibGUgKnkgfTsKCiAgICAgICAgICAgICAgQ29waWVzICpBTEwqIGN1cnJlbnRseSBkZWZpbmVkIHR5cGVtYXBzIGZvciAnZG91YmxlICpPVVRQVVQnIGFuZAogICAgICAgICAgICAgIGNvcGllcyB0aGVtIHRvICdkb3VibGUgKngnIGFuZCAnZG91YmxlICp5Jy4KCiAgICAgICAgICAgICAgTW9zdCBwZW9wbGUgcHJvYmFibHkgd29uJ3QgZXZlbiBub3RpY2UgdGhpcyBjaGFuZ2UgaW4KICAgICAgICAgICAgICAlYXBwbHkuICBIb3dldmVyLCB3aGVyZSBpdCB3aWxsIGJyZWFrIHRoaW5ncyBpcyBpbiBjb2RlIGxpa2UKICAgICAgICAgICAgICB0aGlzOgoKICAgICAgICAgICAgICAgICAgJWFwcGx5IGRvdWJsZSAqT1VUUFVUIHsgZG91YmxlICp4IH07CiAgICAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSBkb3VibGUgKk9VVFBVVCB7CiAgICAgICAgICAgICAgICAgICAgICAgLi4uIHdoYXRldmVyIC4uLgogICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICB2b2lkIGZvbyhkb3VibGUgKngpOwoKICAgICAgICAgICAgICBJbiBTV0lHMS4xLCB5b3Ugd2lsbCBmaW5kIHRoYXQgJ2ZvbycgdXNlcyB0aGUgJ2RvdWJsZSAqT1VUUFVUJyBydWxlCiAgICAgICAgICAgICAgZXZlbiB0aG91Z2ggaXQgd2FzIGRlZmluZWQgYWZ0ZXIgdGhlICVhcHBseSBkaXJlY3RpdmUgKHRoaXMgaXMKICAgICAgICAgICAgICB0aGUgd2VpcmQgYWxpYXNpbmcgc2NoZW1lIGF0IHdvcmspLiAgSW4gU1dJRzEuMyBhbmQgbGF0ZXIsCiAgICAgICAgICAgICAgdGhlICdkb3VibGUgKk9VVFBVVCcgcnVsZSBpcyBpZ25vcmVkIGJlY2F1c2UgaXQgaXMgZGVmaW5lZAogICAgICAgICAgICAgIGFmdGVyIHRoZSAlYXBwbHkgZGlyZWN0aXZlLgoKICAgICAgICAgIDMuICBUaGUgJWNsZWFyIGRpcmVjdGl2ZSBoYXMgYmVlbiBtb2RpZmllZCB0byBlcmFzZSBhbGwgY3VycmVudGx5CiAgICAgICAgICAgICAgZGVmaW5lZCB0eXBlbWFwcyBmb3IgYSBwYXJ0aWN1bGFyIHR5cGUuICBUaGlzIGRpZmZlcnMgZnJvbQogICAgICAgICAgICAgIFNXSUcxLjEgd2hlcmUgJWNsZWFyIG9ubHkgcmVtb3ZlZCBydWxlcyB0aGF0IHdlcmUgYWRkZWQgdXNpbmcKICAgICAgICAgICAgICB0aGUgJWFwcGx5IGRpcmVjdGl2ZS4KCiAgICAgICAgICA0LiAgVHlwZW1hcCBtYXRjaGluZyBpcyBub3cgcGVyZm9ybWVkIHVzaW5nICpleGFjdCogdHlwZXMuCiAgICAgICAgICAgICAgVGhpcyBtZWFucyB0aGF0IHRoaW5ncyBsaWtlIHRoaXMKCiAgICAgICAgICAgICAgICAgICAldHlwZW1hcChpbikgY2hhciAqIHsgfQogICAgICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIGNvbnN0IGNoYXIgKiB7IH0KCiAgICAgICAgICAgICAgYXJlIGRpZmZlcmVudCB0eXBlbWFwcy4gICAgQSBzaW1pbGFyIHJ1bGUgYXBwbGllcyBmb3IgcG9pbnRlcnMsCiAgICAgICAgICAgICAgYXJyYXlzLCBhbmQgcmVmZXJlbmNlcy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSBkb3VibGUgKiB7IH0KCiAgICAgICAgICAgICAgdXNlZCB0byBhcHBseSB0byAnZG91YmxlICYnLCAnZG91YmxlIFtdJywgIE5vdywgaXQgb25seSBhcHBsaWVzCiAgICAgICAgICAgICAgdG8gJ2RvdWJsZSAqJy4gIElmIHlvdSB3YW50IGEgJ2RvdWJsZSAmJywgeW91J2xsIG5lZWQgdG8gaGFuZGxlCiAgICAgICAgICAgICAgdGhhdCBzZXBhcmF0ZWx5LgoKICAgICAgICAgIDUuICBBcnJheSBtYXRjaGluZyBoYXMgYmVlbiBzaW1wbGZpZWQuICBJbiBTV0lHMS4xLCBhcnJheSBtYXRjaGluZwogICAgICAgICAgICAgIHdhcyBwZXJmb3JtZWQgYnkgdHJ5aW5nIHZhcmlvdXMgY29tYmluYXRpb25zIG9mIGRpbWVuc2lvbnMuCiAgICAgICAgICAgICAgRm9yIGV4YW1wbGUsICdkb3VibGUgYVsxMF1bMjBdJyB3YXMgbWF0Y2hlZCBhcyBmb2xsb3dzOgoKICAgICAgICAgICAgICAgICAgIGRvdWJsZSBbMTBdWzIwXQogICAgICAgICAgICAgICAgICAgZG91YmxlIFtBTlldWzIwXQogICAgICAgICAgICAgICAgICAgZG91YmxlIFsxMF1bQU5ZXQogICAgICAgICAgICAgICAgICAgZG91YmxlIFtBTlldW0FOWV0KCiAgICAgICAgICAgICAgSW4gU1dJRzEuMywgb25seSB0aGUgZm9sbG93aW5nIG1hdGNoZXMgYXJlIGF0dGVtcHRlZDoKCiAgICAgICAgICAgICAgICAgICBkb3VibGUgWzEwXVsyMF0KICAgICAgICAgICAgICAgICAgIGRvdWJsZSBbQU5ZXVtBTlldCgogICAgICAgICAgT24gdGhlIHBvc2l0aXZlIHNpZGUsIHR5cGVtYXAgbWF0Y2hpbmcgaXMgbm93ICpzaWduaWZpY2FudGx5KiBmYXN0ZXIKICAgICAgICAgIHRoYW4gYmVmb3JlLgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgo4LzE1LzAwIDogYmVhemxleQogICAgICAgICAgU2VjcmV0IGRldmVsb3BlciBmZWF0dXJlLiAgU2luY2UgZGF0YXR5cGVzIGFyZSBub3cgcmVwcmVzZW50ZWQgYXMgCiAgICAgICAgICBzdHJpbmdzIGludGVybmFsbHksIHlvdSBjYW4gYnlwYXNzIGxpbWl0YXRpb25zIG9mIHRoZSBwYXJzZXIgYW5kCiAgICAgICAgICBjcmVhdGUgYSB3aWxkIGRhdGF0eXBlIGJ5IHNpbXBseSBlbmNsb3NpbmcgdGhlIHJhdyBzdHJpbmcgZW5jb2RpbmcKICAgICAgICAgIGluIGJhY2t0aWNrcyAoYGApIGFuZCBzdGlja2luZyBpdCBpbiB0aGUgaW50ZXJmYWNlIGZpbGUgYW55d2hlcmUgYQogICAgICAgICAgdHlwZSBpcyBleHBlY3RlZC4gIEZvciBleGFtcGxlLCBgYSgyMCkuYSgxMCkucC5mKGludCxpbnQpYC4gIFRoaXMgCiAgICAgICAgICBmZWF0dXJlIGlzIG9ubHkgaW50ZW5kZWQgZm9yIHRlc3RpbmcgKGkuZS4sIHlvdSB3YW50IHRvIHNlZSB3aGF0CiAgICAgICAgICBoYXBwZW5zIHRvIHlvdXIgbGFuZ3VhZ2UgbW9kdWxlIGlmIGl0IGdldHMgYSByZWZlcmVuY2UgdG8gYSBwb2ludGVyCiAgICAgICAgICB0byBhbiBhcnJheSBvZiBwb2ludGVycyB0byBmdW5jdGlvbnMgb3Igc29tZXRoaW5nKS4gCiAgICAgICAgICAqKiogU0lDSyBIQUNLICoqKgoKOC8xNC8wMCA6IGJlYXpsZXkKICAgICAgICAgIENvbXBsZXRlbHkgbmV3IHR5cGUtc3lzdGVtIGFkZGVkIHRvIHRoZSBpbXBsZW1lbnRhdGlvbi4KICAgICAgICAgIE1vcmUgZGV0YWlscyBsYXRlci4KCjgvMTEvMDAgOiBiZWF6bGV5CiAgICAgICAgICBDbGVhbmVkIHVwIHNvbWUgb2YgdGhlIEkvTyBoYW5kbGluZy4gIFNXSUcgbm8gbG9uZ2VyIGdlbmVyYXRlcwogICAgICAgICAgYW55IHRlbXBvcmFyeSBmaWxlcyBzdWNoIGFzIF93cmFwLndyYXAsIF93cmFwLmlpLCBfd3JhcC5pbml0LgogICAgICAgICAgSW5zdGVhZCwgdGhlc2UgImZpbGVzIiBhcmUga2VwdCBhcm91bmQgaW4gbWVtb3J5IGFzIHN0cmluZ3MKICAgICAgICAgIChhbHRob3VnaCB0aGlzIGlzIHRyYW5zcGFyZW50IHRvIGxhbmd1YWdlIG1vZHVsZXMpLgoKOC80LzAwICA6IHR0bgoJICBBZGRlZCBNYWtlZmlsZSB0YXJnZXQgImNoZWNrIiBhbmQgdmFyaWFudHMuCgkgIFRoaXMgY2FuIGJlIHVzZWQgbGlrZSAibWFrZSBjaGVjayIgb3IsIHRvIGV4cGxpY2l0bHkgc2tpcCBhCgkgIGxhbmd1YWdlIExBTkc6ICJtYWtlIHNraXAtTEFORz10cnVlIGNoZWNrIi4gIExBTkcgaXMgc2tpcHBlZAoJICBhdXRvbWF0aWNhbGx5IGlmIC4vY29uZmlndXJlIGRldGVybWluZXMgdGhhdCBMQU5HIHN1cHBvcnQgaXMKCSAgaW5zdWZmaWNpZW50LgoKCSAgQ3VycmVudGx5LCB0aGUgY2hlY2sgaXMgbGltaXRlZCB0byBkb2luZyB0aGUgZXF1aXZhbGVudCBvZgoJICAibWFrZSBhbGwiIGluIHNvbWUgb2YgdGhlIEV4YW1wbGVzIGRpcmVjdG9yaWVzLiAgVGhpcyBzaG91bGQKCSAgYmUgZXhwYW5kZWQgYm90aCBob3Jpem9udGFsbHkgKGRpZmZlcmVudCB0eXBlcyBvZiB0ZXN0cykgYW5kCgkgIHZlcnRpY2FsbHkgKGFmdGVyICJtYWtlIGFsbCIgaW4gYW4gRXhhbXBsZXMgc3ViZGlyIHN1Y2NlZWRzLAoJICBkbyBzb21lIGFkZGl0aW9uYWwgdGVzdHMgd2l0aCB0aGUgcmVzdWx0aW5nIGludGVycHJldGVyLCBldGMpLgoKOC80LzAwICA6IHR0bgoJICBBZGRlZCBNYWtlZmlsZSB0YXJnZXQgImRpc3RjbGVhbiIsIHdoaWNoIGRlbGV0ZXMgYWxsIHRoZQoJICBmaWxlcyAuL2NvbmZpZ3VyZSBjcmVhdGVzLCBpbmNsdWRpbmcgY29uZmlnLnN0YXR1cyBhbmQgZnJpZW5kcy4KCjgvMy8wMCAgOiBoYXJjb2gKCSAgamF2YSBjaGFuZ2VzPz8/IFt0b2RvOiBkb2N1bWVudCBjaGFuZ2VzXQoKNy8yMy8wMCA6IGJlYXpsZXkKICAgICAgICAgIFR5cGVtYXBzIGhhdmUgYmVlbiBtb2RpZmllZCB0byBrZXkgb2ZmIG9mIHRoZSByZWFsIGRhdGF0eXBlcwogICAgICAgICAgdXNlZCBpbiB0aGUgaW50ZXJmYWNlIGZpbGUuICBUaGlzIG1lYW5zIHRoYXQgdHlwZW1hcHMgZm9yCiAgICAgICAgICAiY29uc3QgY2hhciAqIiBhbmQgImNoYXIgKiIgd2lsbCBiZSBkaWZmZXJlbmNlIGFzIHdpbGwgdHlwZW1hcHMKICAgICAgICAgIGZvciAiVmVjdG9yIiBhbmQgIlZlY3RvciAqLiIKICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgogICAgICAgICAgVGhpcyBpcyBsaWtlbHkgdG8gYnJlYWsgaW50ZXJmYWNlcyB0aGF0IHJlbHkgb24gdGhlIG9kZCB0eXBlCiAgICAgICAgICBoYW5kbGluZyBiZWhhdmlvciBvZiB0eXBlbWFwcyBpbiBTV0lHMS4xLS1lc3BlY2lhbGx5IHdpdGgKICAgICAgICAgIHJlc3BlY3QgdG8gaW50ZXJmYWNlcyBpbnZvbHZpbmcgcGFzcy1ieS12YWx1ZS4KCjcvMjMvMDAgOiBiZWF6bGV5CiAgICAgICAgICBOZXcgJWNvbnN0YW50IGRpcmVjdGl2ZS4gIFRoaXMgZGlyZWN0aXZlIGNhbiBiZSB1c2VkIHRvCiAgICAgICAgICBjcmVhdGUgdHJ1ZSBjb25zdGFudHMgaW4gdGhlIHRhcmdldCBzY3JpcHRpbmcgbGFuZ3VhZ2UuCiAgICAgICAgICBJdCdzIG1vc3Qgc2ltcGxlIGZvcm0gaXMgc29tZXRoaW5nIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAlY29uc3RhbnQgRk9PIDQyOwoKICAgICAgICAgIEluIHRoaXMgY2FzZSwgdGhlIHR5cGUgaXMgaW5mZXJyZWQgZnJvbSB0aGUgc3ludGF4IG9mIHRoZQogICAgICAgICAgdmFsdWUgKGluIHJlYWxpdHksIGFsbCAjZGVmaW5lIG1hY3JvcyBhcmUgdHJhbnNsYXRlZCBpbnRvCiAgICAgICAgICBkaXJlY3RpdmVzIG9mIHRoaXMgZm9ybSkuCgogICAgICAgICAgQW4gZXhwYW5kZWQgdmVyc2lvbiBpcyBhcyBmb2xsb3dzOgoKICAgICAgICAgICAgJWNvbnN0YW50KEZvbyAqKSBGT08gPSAmRm9vT2JqOwoKICAgICAgICAgIEluIHRoaXMgY2FzZSwgYW4gZXhwbGljaXQgdHlwZSBjYW4gYmUgc3BlY2lmaWVkLiAgVGhpcwogICAgICAgICAgbGF0dGVyIGZvcm0gbWF5IGJlIHVzZWZ1bCBmb3IgY3JlYXRpbmcgY29uc3RhbnRzIHRoYXQKICAgICAgICAgIHVzZWQgdG8gYmUgc3BlY2lmaWVkIGFzCgogICAgICAgICAgICAgY29uc3QgRm9vICpGT08gPSAmRm9vT2JqOwoKICAgICAgICAgICh3aGljaCBhcmUgbm93IHRyZWF0ZWQgYXMgdmFyaWFibGVzKS4KICAgICAgICAgICoqKiBFWFBFUklNRU5UQUwgRkVBVFVSRSAqKiogVGhlIHN5bnRheCBtYXkgY2hhbmdlIGluCiAgICAgICAgICB0aGUgZmluYWwgcmVsZWFzZS4KCjcvMjMvMDAgOiBiZWF6bGV5CiAgICAgICAgICBNb2RpZmllZCB0aGUgcGFyc2VyIHNvIHRoYXQgdmFyaWFibGUgZGVjbGFyYXRpb25zIG9mIHRoZSBmb3JtCiAgICAgICAgICAiY29uc3QgdHlwZSAqYSIgYXJlIGhhbmRsZWQgYXMgdmFyaWFibGVzLCBub3QgY29uc3RhbnRzLgogICAgICAgICAgTm90ZTogU1dJRzEuMSBoYW5kbGVkIHRoaXMgY2FzZSBlcnJvbmVvdXNseSBiZWNhdXNlCiAgICAgICAgICBjb25zdCBjaGFyICphIGlzIGEgcG9pbnRlciB2YXJpYWJsZSB0aGF0IGNhbiBiZSByZWFzc2lnbmVkLgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCiAgICAgICAgICBOb3RlOiBqdXN0IGJlY2F1c2UgdGhpcyBpcyB0aGUgInJpZ2h0IiB3YXkgdG8gZG8gdGhpbmdzLAogICAgICAgICAgZG9lc24ndCBtZWFuIGl0J3MgdGhlIG1vc3QgYXBwcm9wcmlhdGUgaW50ZXJwcmV0YXRpb24uCiAgICAgICAgICBJIHN1c3BlY3QgdGhhdCBtYW55IEMgcHJvZ3JhbW1lcnMgbWlnaHQgdXNlICdjb25zdCBjaGFyIConCiAgICAgICAgICB3aXRoIHRoZSBpbnRlbnQgb2YgY3JlYXRpbmcgYSBjb25zdGFudCwgd2l0aG91dCByZWFsaXppbmcKICAgICAgICAgIHRoYXQgdGhleSd2ZSBjcmVhdGVkIGEgcmVhc3NpZ25hYmxlIGdsb2JhbCB2YXJpYWJsZS4KCjcvMjMvMDAgOiBiZWF6bGV5CiAgICAgICAgICBUaGUgQy9DKysgd3JhcHBpbmcgbGF5ZXIgaGFzIGJlZW4gY29tcGxldGVseSByZWRlc2lnbmVkIGFuZAogICAgICAgICAgcmVpbXBsZW1lbnRlZC4gIFRoaXMgY2hhbmdlIHNob3VsZCBpcm9uIG91dCBhIGZldyByb3VnaAogICAgICAgICAgc3BvdHMgd2l0aCB0aGUgaGFuZGxpbmcgb2YgZGF0YXR5cGVzLiAgSW4gYWRkaXRpb24sIHRoZQogICAgICAgICAgd3JhcHBlciBjb2RlIGlzIHNvbWV3aGF0IGNsZWFuZXIuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKICAgICAgICAgIFRoaXMgY2hhbmdlIG1heSBicmVhayBpbnRlcmZhY2VzIHRoYXQgaW52b2x2ZQogICAgICAgICAgc3VidGxlIGNvcm5lci1jYXNlcyB3aXRoIHR5cGVtYXBzIGFuZCB0aGUgJWFkZG1ldGhvZHMKICAgICAgICAgIGRpcmVjdGl2ZSBzaW5jZSBzb21lIG9mIHRoZXNlIGZlYXR1cmVzIGhhZCBzb21ld2hhdAogICAgICAgICAgdHlwZSBoYW5kbGluZyBiZWhhdmlvciBpbiBTV0lHMS4xLgoKNy8yMy8wMCA6IGJlYXpsZXkKICAgICAgICAgIFRoZSAibWVtYmVyaW4iIGFuZCAibWVtYmVyb3V0IiB0eXBlbWFwcyBhcmUgZ29uZSBmb3IgdGhlCiAgICAgICAgICBtb21lbnQsIGJ1dCB0aGV5IG1pZ2h0IHJldHVybiBhcyBzb29uIGFzIEkgZmlndXJlIG91dAogICAgICAgICAgaG93IHRvIGludGVncmF0ZSB0aGVtIHdpdGggc29tZSBvZiB0aGUgc3RyZWFtbGluZWQgQyB3cmFwcGVyCiAgICAgICAgICBmdW5jdGlvbnMuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjcvMjIvMDAgOiBiZWF6bGV5CiAgICAgICAgICBBIHZhcmlldHkgb2Ygb2xkIHR5cGUgaGFuZGxpbmcgZnVuY3Rpb25zIHN1Y2ggYXMgcHJpbnRfdHlwZSgpLAogICAgICAgICAgcHJpbnRfZnVsbCgpLCBwcmludF9tYW5nbGUoKSwgZXRjLi4uIGFyZSBnb25lIGFuZCBoYXZlIGJlZW4KICAgICAgICAgIHJlcGxhY2VkIHdpdGggYSBzbWFsbGVyIHNldCBvZiBmdW5jdGlvbnMuICBTZWUgdGhlIGZpbGUKICAgICAgICAgIERvYy9pbnRlcm5hbHMuaHRtbCBmb3IgZGV0YWlscy4gIFRoaXMgd2lsbCBicmVhayBhbGwgdGhpcmQKICAgICAgICAgIHBhcnR5IGxhbmd1YWdlIG1vZHVsZXMuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjcvMjAvMDAgOiBiZWF6bGV5CiAgICAgICAgICBEZXByZWNhdGVkIHRoZSAldmFsIGFuZCAlb3V0IGRpcmVjdGl2ZXMuICBUaGVzZSBkaXJlY3RpdmVzCiAgICAgICAgICBzaG91bGRuJ3QgcmVhbGx5IGJlIG5lY2Vzc2FyeSBzaW5jZSB0eXBlbWFwcyBjYW4gYmUgdXNlZAogICAgICAgICAgdG8gYWNoaWV2ZSBzaW1pbGFyIHJlc3VsdHMuICAgVGhpcyBhbHNvIGNsZWFucyB1cCB0aGUKICAgICAgICAgIGhhbmRsaW5nIG9mIHR5cGVzIGFuZCBwYXJhbWV0ZXJzIHF1aXRlIGEgYml0LgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgo3LzIwLzAwIDogdHRuCgkgIEZpeGVkIHVuc3BlY2lmaWVkLW1vZHVsZSBidWcgaW4gR3VpbGUgc3VwcG9ydCBhbmQgcmVtb3ZlZAoJICBtb3JlIG5vbi0id2l0aC1zbW9icyIgZnVuY3Rpb25hbGl0eSB1c2luZyBwYXRjaGVzIHN1Ym1pdHRlZAoJICBieSBNYXR0aGlhcyBLb2VwcGUuCgoJICBSZS1lbmFibGUgcmVjb2duaXRpb24gb2YgIi13aXRoLXNtb2JzIiAod2l0aCBubyBlZmZlY3Qgc2luY2UKCSAgd2UgdXNlIHNtb2JzIGJ5IGRlZmF1bHQgbm93KSBmb3IgdGhlIHRpbWUgYmVpbmcuICBBZnRlciB0aGUKCSAgMS4zYTQgcmVsZWFzZSwgdGhpcyBvcHRpb24gd2lsbCBzaWduYWwgYW4gZXJyb3IuCgo3LzE3LzAwIDogdHRuCgkgIEZpeGVkIE5VTEwtaW5wdXQgYnVnIGluIHBhcmFtZXRlciBsaXN0IGhhbmRsaW5nLgoJICBSZXBvcnRlZCBieSBNYXR0aGlhcyBLb2VwcGUuCgo3LzEyLzAwIDogYmVhemxleQogICAgICAgICAgRml4ZWQgbWVtb3J5IGxlYWsgaW4gUHl0aG9uIHR5cGUtY2hlY2tpbmcgY29kZS4gUmVwb3J0ZWQgYnkKICAgICAgICAgIEtlaXRoIERhdmlkc29uLiAgQnVnICMxMDkzNzkuCgo3LzEwLzAwIDogYmVhemxleQogICAgICAgICAgQ2hhbmdlZCBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMgcmVsYXRlZCB0byBmdW5jdGlvbiBwYXJhbWV0ZXJzLgoKNy8xMC8wMCA6IGJlYXpsZXkKICAgICAgICAgIEZpeGVkIHNvbWUgYnVncyByZWxhdGVkIHRvIHRoZSBoYW5kbGluZyBvZiB0aGUgJW5hbWUoKSBkaXJlY3RpdmUKICAgICAgICAgIGFuZCBjbGFzc2VzIGluIHRoZSBUY2wgbW9kdWxlLiBQcm9ibGVtIHJlcG9ydGVkIGJ5IEphbWVzIEJhaWxleS4KCjcvMTAvMDAgOiBiZWF6bGV5CiAgICAgICAgICBGaXhlZCBwYXJzaW5nIGFuZCBlbnVtIGhhbmRsaW5nIHByb2JsZW1zIHdpdGggY2hhcmFjdGVyIGNvbnN0YW50cy4KICAgICAgICAgIFJlcG9ydGVkIGJ5IEdyZWcgS29jaGFuc2tpLgoKNy8xMC8wMCA6IGJlYXpsZXkKICAgICAgICAgIFJlbW92ZWQgV3JhcHBlckZ1bmN0aW9uIGNsYXNzIGZyb20gdGhlIGNvcmUgYW5kIHVwZGF0ZWQgdGhlIGxhbmd1YWdlCiAgICAgICAgICBtb2R1bGUuICBUaGlzIHdpbGwgYnJlYWsgdGhpcmQgcGFydHkgbW9kdWxlcy4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKNy85LzAwICA6IGJlYXpsZXkKICAgICAgICAgIEltcGxlbWVudGF0aW9uIG9mIFNXSUcgbm8gbG9uZ2VyIG1ha2VzIHVzZSBvZiBDKysgb3BlcmF0b3Igb3ZlcmxvYWRpbmcuCiAgICAgICAgICBUaGlzIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBicmVhayAqYWxsKiB0aGlyZCBwYXJ0eSBsYW5ndWFnZSBtb2R1bGVzCiAgICAgICAgICB0aGF0IGFyZSBub3QgcGFydCBvZiB0aGUgbWFpbiBTV0lHIENWUyB0cmVlLiBTb3JyeS4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKNy84LzAwICA6IGJlYXpsZXkKICAgICAgICAgIFJlbW92ZWQgdGhlIGV4cGVyaW1lbnRhbCBhbmQgdW5kb2N1bWVudGVkICJidWlsZCIgdHlwZW1hcCB0aGF0CiAgICAgICAgICB3YXMgaW50ZW5kZWQgdG8gd29yayB3aXRoIG11bHRpcGxlIGFyZ3VtZW50cy4gU2ltcGx5IHRvbyB3ZWlyZAogICAgICAgICAgdG8ga2VlcCBhcm91bmQuICBCZXNpZGVzLCBhIGJldHRlciByZXBsYWNlbWVudCBpcyBpbiB0aGUgd29ya3MuCgo3LzYvMDAgIDogdHRuCiAgICAgICAgICBSZW1vdmVkIG5vbi0id2l0aC1zbW9icyIgZnVuY3Rpb25hbGl0eSAoR3VpbGUgc3VwcG9ydCksIGkuZS4sCiAgICAgICAgICAiLXdpdGgtc21vYnMiIGlzIG5vdyB0aGUgZGVmYXVsdCBhbmQgbm8gbG9uZ2VyIG5lZWRzIHRvIGJlCgkgIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZC1saW5lLgoKNy81LzAwICA6IHR0bgogICAgICAgICAgSW5jb3Jwb3JhdGVkIFJ1Ynkgc3VwcG9ydCBjb250cmlidXRlZCBieSBNYXNha2kgRnVrdXNoaW1hLgoKNi8yOC8wMCA6IHR0bgogICAgICAgICAgQXBwbGllZCBtb3JlLXRoYW4tMTAtYXJncyBidWdmaXggcGF0Y2ggY29udHJpYnV0ZWQKCSAgYnkgTWF0dGhpYXMgS29lcHBlLgoKNi8yNy8wMCA6IGJlYXpsZXkKICAgICAgICAgIFJld3JvdGUgc29tZSBvZiB0aGUgc3RyaW5nIGhhbmRsaW5nIGFuZCBlbGltaW5hdGVkIHRoZSBDKysKICAgICAgICAgIGltcGxlbWVudGF0aW9uICh3aGljaCBpcyBub3cganVzdCBhIHdyYXBwZXIpLgoKNi8yNy8wMCA6IHR0bgogICAgICAgICAgQWRkZWQgRG9jL2luZGV4Lmh0bWwgYW5kIERvYy9pbnRlcm5hbHMuaHRtbC4gIFRoZSB0YXJnZXQKICAgICAgICAgIGF1ZGllbmNlIGZvciB0aGUgbGF0dGVyIGlzIG5ldyBTV0lHIGRldmVsb3BlcnMuCgoKVmVyc2lvbiAxLjMgQWxwaGEgMyAoSnVuZSAxOCwgMjAwMCkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjYvMTgvMDAgOiBiZWF6bGV5CiAgICAgICAgICBSZW1vdmVkIHRoZSBuYW1pbmcuY3h4LCBoYXNoLmN4eCwgYW5kIHN5bWJvbC5jeHggZmlsZXMgZnJvbQogICAgICAgICAgdGhlIFNXSUcxLjEgZGlyZWN0b3J5LiAgIENvbnRpbnVlZCB0byBtaWdyYXRlIHRoaW5ncyBhd2F5CiAgICAgICAgICBmcm9tIHRoZSBDKysgYmFzZSAoYWx0aG91Z2ggdGhlcmUncyBzdGlsbCBhIGxvdCBvZiB3b3JrIHRvIGRvKS4KCjYvMTcvMDAgOiBiZWF6bGV5CiAgICAgICAgICBBZGRlZCBhIGZldyBtb3JlIGV4YW1wbGVzIHRvIHRoZSBFeGFtcGxlcyBkaXJlY3RvcnkuICBTdGlsbAogICAgICAgICAgbmVlZCB0byBkbyBhIGxvdCBvZiB3b3JrIG9uIHRoaXMuCgo2LzE2LzAwIDogYmVhemxleQogICAgICAgICAgQWRkZWQgLWluY2x1ZGVhbGwgdG8gZm9sbG93IGFsbCAjaW5jbHVkZSBzdGF0ZW1lbnRzIGluIHRoZQogICAgICAgICAgcHJlcHJvY2Vzc29yLgoKNi8xNS8wMCA6IGJlYXpsZXkKICAgICAgICAgIFRyaWVkIHRvIGZpeCBhcyBtYW55IEMrKyB3YXJuaW5ncyBhcyBwb3NzaWJsZSB3aGVuIGNvbXBpbGluZwogICAgICAgICAgd2l0aCB0aGUgU3VuIFdvcmtzaG9wIEMrKyBjb21waWxlci4gIFVuZm9ydHVuYXRlbHksIHRoaXMgbWVhbnMKICAgICAgICAgIHRoYXQgdGhlcmUgYXJlIGEgbG90IG9mIHN0YXRlbWVudHMgdGhhdCBjb250YWluIHN0cmluZyBsaXRlcmFscwogICAgICAgICAgb2YgdGhlIGZvcm0gKGNoYXIqKSJCbGFoIi4KCjYvMTUvMDA6ICBiZWF6bGV5CiAgICAgICAgICBBIHZhcmlldHkgb2YgY2xlYW51cCBhbmQgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uIGluIHRoZQogICAgICAgICAgbG93LWxldmVsIERPSCBsaWJyYXJ5LiAgIFRoaXMgc2VlbXMgdG8gcmVzdWx0IGluIGEgc3BlZWR1cAogICAgICAgICAgb2YgNTAtMTAwJSBmb3IgcHJlcHJvY2Vzc2luZyBhbmQgb3RoZXIgcmVsYXRlZCB0YXNrcy4KCjUvMTAvMDAgOiB0dG4KCSAgQXBwbGllZCB2YXJpYWJsZS13cmFwcGluZyBidWdmaXggcGF0Y2ggY29udHJpYnV0ZWQKCSAgYnkgTWF0dGhpYXMgS29lcHBlLgoKNC8xNy8wMCA6IHR0bgoJICBVcGRhdGVkIE16U2NoZW1lIHN1cHBvcnQgY29udHJpYnV0ZWQgYnkgT2xlZyBUb2xtYXRjZXYuCgkgIFdlIG5vdyB1c2UgYSBgU2NoZW1lX1R5cGUnLWJhc2VkIHN0cnVjdHVyZSB0byB3cmFwIHBvaW50ZXJzLgoKNC8xMS8wMCA6IHR0bgoJICBJbmNvcnBvcmF0ZWQgZnVydGhlciBHdWlsZS1zdXBwb3J0IHBhdGNoIGJ5IE1hdHRoaWFzIEtvZXBwZS4KCSAgVHlwZW1hcHMgcHJldmlvdXNseSBkZWxldGVkIGhhdmUgYmVlbiByZS1hZGRlZC4gIFRoZXJlIGlzIG5vdwoJICBleGNlcHRpb24gaGFuZGxpbmcgKHNlZSBEb2MvZW5naW5lZXJpbmcuaHRtbCkuICBgU1dJR19pbml0JyBpcyBub3cKCSAgZGVjbGFyZWQgZXh0ZXJuIG9ubHkgZm9yIHNpbXBsZSBsaW5rYWdlLiAgU29tZSBidWdzIHdlcmUgZml4ZWQuCgo0LzA2LzAwIDogdHRuCgkgIEluY29ycG9yYXRlZCBNelNjaGVtZSBzdXBwb3J0IGNvbnRyaWJ1dGVkIGJ5IE9sZWcgVG9sbWF0Y2V2LgoJICBUaGlzIGluY2x1ZGVzIG5ldyBkaXJlY3RvcmllcyBMaWIvbXpzY2hlbWUgYW5kIEV4YW1wbGVzL216c2NoZW1lLgoKNC8wMy8wMCA6IHR0bgoJICBBZGRlZCBFeGFtcGxlcy9ndWlsZSBhbmQgY2hpbGRyZW4uICBUaGlzIGlzIGFuIGFkYXB0YXRpb24gb2YKCSAgdGhlIHNhbWUtbmFtZWQgZGlyZWN0b3J5IGZyb20gdGhlIFNXSUctMS4xcDUgZGlzdHJpYnV0aW9uLgoJICBBZGRlZCBHdWlsZS1zcGVjaWZpYyBzZWN0aW9uIHRvIERvYy9lbmdpbmVlcmluZy5odG1sLgoKNC8wMi8wMCA6IHR0bgoJICBJbmNvcnBvcmF0ZWQgbmV3IGd1aWxlbWFpbi5pIGJ5IE1hcnRpbiBGcm9laGxpY2guCgkgIEluY29ycG9yYXRlZCBHdWlsZS1zdXBwb3J0IHJld3JpdGUgcGF0Y2ggYnkgTWF0dGhpYXMgS29lcHBlLgoJICBUaGUgY29tbWFuZCBsaW5lIG9wdGlvbiAiLXdpdGgtc21vYnMiIGVuYWJsZXMgaW1wbGVtZW50YXRpb24gb2YKCSAgcG9pbnRlciB0eXBlIGhhbmRsaW5nIHVzaW5nIHNtb2JzLCB0aGUgY2Fub25pY2FsIG1lY2hhbmlzbSBmb3IKCSAgZGVmaW5pbmcgbmV3IHR5cGVzIGluIEd1aWxlLiAgUHJldmlvdXMgaW1wbGVtZW50YXRpb24gKHVzaW5nCgkgIHN0cmluZ3MpIGlzIGF0IHRoZSBtb21lbnQgc3RpbGwgc3VwcG9ydGVkIGJ1dCBkZXByZWNhdGVkLiAgQXQKCSAgc29tZSBwb2ludCwgIi13aXRoLXNtb2JzIiB3aWxsIGJlIHRoZSBkZWZhdWx0IGFuZCBubyBsb25nZXIKCSAgcmVxdWlyZWQuCgozLzEzLzAwIDogYmVhemxleQogICAgICAgICAgQWRkZWQgcHVyaWZ5IHBhdGNoZXMgc3VibWl0dGVkIGJ5IFJhbSBCaGFtaWRpcGF0eS4KCjMvMDIvMDAgOiB0dG4KICAgICAgICAgIEFkZGVkIHN1cHBvcnQgZm9yIGRpZmZlcmVudCBHdWlsZSAibGlua2FnZSIgc2NoZW1lcy4KCSAgQ3VycmVudGx5LCAiLUxpbmthZ2UgaG9iYml0IiB3b3Jrcy4KCgpWZXJzaW9uIDEuMyBBbHBoYSAyIChNYXJjaCAxLCAyMDAwKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMi8yOS8wMCA6IGJlYXpsZXkKICAgICAgICAgIE1hZGUgU1dJRyBpZ25vcmUgdGhlICdtdXRhYmxlJyBrZXl3b3JkLgoKMi8yOS8wMCA6IGJlYXpsZXkKICAgICAgICAgIEluY29ycG9yYXRlZCBzb21lIHBhdGNoZXMgdG8gdGhlIFBlcmw1IG1vZHVsZSByZWxhdGVkIHRvCiAgICAgICAgICB0aGUgLWhpZGUgb3B0aW9uIGFuZCB0aGUgZGVzdHJ1Y3Rpb24gb2Ygb2JqZWN0cy4KICAgICAgICAgIFBhdGNoIHN1Ym1pdHRlZCBieSBLYXJsIEZvcm5lci4KCjIvMjcvMDAgOiB0dG4KCSAgSW5jb3Jwb3JhdGVkIEd1aWxlIHN1cHBvcnQgY29udHJpYnV0ZWQgYnkgTWF0dGhpYXMgS29lcHBlLgoJICBUaGlzIGluY2x1ZGVzIGEgY3BwIG1hY3JvIGluIExpYi9ndWlsZS9ndWlsZS5zd2cgYW5kIHRoZQoJICBlbnRpcmUgZmlsZSBMaWIvZ3VpbGUvdHlwZW1hcHMuaS4KCjIvMjUvMDAgOiB0dG4KCSAgTW9kaWZpZWQgY29uZmlndXJlLmluIGFuZCBNYWtlZmlsZS5pbiBmaWxlcyB0byBzdXBwb3J0CgkgIG5vbi1sb2NhbCBidWlsZCAodXNlZnVsIGluIG11bHRpLWFyY2ggZW52aXJvbm1lbnRzKS4KCjIvMjQvMDAgOiB0dG4KCSAgSW5jb3Jwb3JhdGVkIEd1aWxlIHN1cHBvcnQgY29udHJpYnV0ZWQgYnkgQ2xhcmsgTWNHcmV3LgoJICBUaGlzIHdvcmtzIHdpdGggR3VpbGUgMS4zLCBidXQgc2luY2UgaXQgZGVwZW5kcyBoZWF2aWx5CgkgIG9uIHRoZSBnaF8gaW50ZXJmYWNlLCBpdCBzaG91bGQgd29yayBmb3IgYWxsIGxhdGVyIHZlcnNpb25zLgoJICBJdCBoYXMgbm90IGJlZW4gdGVzdGVkIHdpdGggdmVyc2lvbnMgYmVmb3JlIDEuMy4KCSAgV0FSTklORzogQ29kZSBpcyB1bnN0YWJsZSBkdWUgdG8gZXhwZXJpbWVudGF0aW9uIGJ5IHR0bi4KCjIvMTYvMDAgOiBiZWF6bGV5CiAgICAgICAgICBBIHZhcmlldHkgb2YgcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnRzIHRvIHRoZSBQeXRob24gc2hhZG93CiAgICAgICAgICBjbGFzcyBjb2RlIGdlbmVyYXRpb24uICBNYW55IG9mIHRoZXNlIHJlc3VsdCBpbiBzdWJzdGFudGlhbAogICAgICAgICAgcnVudGltZSBwZXJmb3JtYW5jZSBnYWlucy4gIEhvd2V2ZXIsIHRoZXNlIGhhdmUgY29tZSBhdAogICAgICAgICAgYSBjb3N0IG9mIHJlcXVpcmluZyB0aGUgdXNlIG9mIFB5dGhvbiAxLjUuMi4gIEZvciBvbGRlcgogICAgICAgICAgdmVyc2lvbnMsIHVzZSAnc3dpZyAtbm9vcHQgLXB5dGhvbicgdG8gdHVybiBvZmYgdGhlc2UKICAgICAgICAgIG9wdGltaXphdGlvbiBmZWF0dXJlcy4KClZlcnNpb24gMS4zIEFscGhhIDEgKEZlYnJ1YXJ5IDExLCAyMDAwKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjIvMTEvMDAgOiBBZGRlZCAndm9pZCcgdG8gcHJvdG90eXBlIG9mIFB5dGhvbiBtb2R1bGUgaW5pdGlhbGl6ZXIuCiAgICAgICAgICBSZXBvcnRlZCBieSBNYXJrIEhvd3NvbiAoMS8yMC8wMCkuCgoyLzExLzAwIDogYmVhemxleQogICAgICAgICAgTW9kaWZpZWQgdGhlIFB5dGhvbiBzaGFkb3cgY2xhc3MgY29kZSB0byBkaXNjYXJkIG93bmVyc2hpcCBvZiBhbgogICAgICAgICAgb2JqZWN0IHdoZW5ldmVyIGl0IGlzIGFzc2lnbmVkIHRvIGEgbWVtYmVyIG9mIGFub3RoZXIgb2JqZWN0LgogICAgICAgICAgVGhpcyBwcm9ibGVtIGhhcyBiZWVuIGFyb3VuZCBmb3IgYXdoaWxlLCBidXQgd2FzIG1vc3QgcmVjZW50bHkKICAgICAgICAgIHJlcG9ydGVkIGJ5IEJ1cmtoYXJkIEtsb3NzICgxMi8zMC85OSkuCgoyLzExLzAwIDogYmVhemxleQogICAgICAgICAgQWRkZWQgYnJhY2VzIGFyb3VuZCBtYWNyb3MgaW4gdGhlIGV4Y2VwdGlvbi5pIGxpYnJhcnkuICBSZXBvcnRlZAogICAgICAgICAgYnkgQnVjayBIb2RnZXMgKDEyLzE5Lzk5KQoKMi8xMS8wMCA6IGJlYXpsZXkKICAgICAgICAgIEZpeGVkIGJ1ZyBpbiB0aGUgY29uc3RyYWludHMuaSBsaWJyYXJ5LiBSZXBvcnRlZCBieSBCdWNrCiAgICAgICAgICBIb2RnZXMgKDEyLzE0Lzk5KQoKMi8xMS8wMCA6IGJlYXpsZXkKICAgICAgICAgIFRoZSAlbmF0aXZlIGRpcmVjdGl2ZSBub3cgZ2VuZXJhdGVzIFRjbDggb2JqZWN0LXN0eWxlIGNvbW1hbmQgY2FsbHMuCiAgICAgICAgICBBIGZ1bGwgc29sdXRpb24gZm9yIFRjbDcgYW5kIFRjbDggaXMgc3RpbGwgbmVlZGVkLiBQYXRjaCBzdWdnZXN0ZWQKICAgICAgICAgIGJ5IE1pa2UgV2VpYmxlbiAoMTEvMjkvOTkpCgoyLzExLzAwIDogYmVhemxleQogICAgICAgICAgTW9kaWZpZWQgdGhlIHR5cGVtYXAgY29kZSB0byBpbmNsdWRlIHRoZSAkbmRpbSB2YXJpYWJsZSBmb3IgYXJyYXlzLgogICAgICAgICAgUGF0Y2ggcHJvdmlkZWQgYnkgTWljaGVsIFNhbm5lciAoMTEvMTIvOTkpLgoKMi8xMS8wMCA6IGJlYXpsZXkKICAgICAgICAgIE1vZGlmaWVkIHRoZSBQeXRob24gbW9kdWxlIHRvIHJhaXNlIGEgUnVudGltZSBlcnJvciBpZiBhbiBhdHRlbXB0CiAgICAgICAgICBpcyBtYWRlIHRvIHNldCBhIHJlYWQtb25seSBtZW1iZXIgb2YgYSBzaGFkb3cgY2xhc3MuICBSZXBvcnRlZCBieQogICAgICAgICAgTWljaGVsIFNhbm5lciAoMTEvNS85OSkuCgoyLzEwLzAwIDogVGhlIGRvY3VtZW50YXRpb24gc3lzdGVtIGhhcyBiZWVuIHJlbW92ZWQuIEhvd2V2ZXIsIGl0IGlzIGxpa2VseQogICAgICAgICAgdG8gcmV0dXJuIGF0IHNvbWUgcG9pbnQgaW4gdGhlIGZ1dHVyZS4KCjIvMS8wMCAgOiBBZGRlZCBhIG51bWJlciBvZiBwZXJmb3JtYW5jZSBlbmhhbmNlbWVudHMgdG8gdGhlIFB5dGhvbiBzaGFkb3cKICAgICAgICAgIGNsYXNzaW5nIGFuZCB0eXBlLWNoZWNraW5nIGNvZGUuICBDb250cmlidXRlZCBieSBWYWRpbSBDaHVndW5vdi4KCiAgICAgICAgICAxLiBSZW1vdmUgX2t3YXJncyBhcmd1bWVudCBmcm9tIHRoZSBzaGFkb3cgd3JhcHBlcnMgd2hlbiAta2V5d29yZAogICAgICAgICAgICAgb3B0aW9uIGlzIG5vdCBzcGVjaWZpZWQuIFRoaXMgc2F2ZXMgdXMgYSBjb25zdHJ1Y3Rpb24gb2Yga2V5d29yZAogICAgICAgICAgICAgZGljdGlvbmFyeSBvbiBlYWNoIG1ldGhvZCBjYWxsLgoKICAgICAgICAgICAgIGRlZiBtZXRob2QxKHNlbGYsICpfYXJncywgKipfa3dhcmdzKToKICAgICAgICAgICAgICAgICB2YWwgPSBhcHBseSh0ZXN0MmMuUHlDbGFzczFfbWV0aG9kMSwgKHNlbGYsKSArIF9hcmdzLCBfa3dhcmdzKQogICAgICAgICAgICAgICAgIHJldHVybiB2YWwKCiAgICAgICAgICAgICBiZWNvbWVzCgogICAgICAgICAgICAgZGVmIG1ldGhvZDEoc2VsZiwgKl9hcmdzKToKICAgICAgICAgICAgICAgICB2YWwgPSBhcHBseSh0ZXN0MmMuUHlDbGFzczFfbWV0aG9kMSwgKHNlbGYsKSArIF9hcmdzKQogICAgICAgICAgICAgICAgIHJldHVybiB2YWwKCiAgICAgICAgICAyLiBJbmNvcnBvcmF0ZSBzZWxmIGludG8gdGhlIF9hcmdzIHR1cGxlLiAgVGhpcyBzYXZlcyBhdCBsZWFzdCBvbmUgdHVwbGUKICAgICAgICAgICAgIGFsbG9jYXRpb24gcGVyIG1ldGhvZCBjYWxsLgoKICAgICAgICAgICAgIGRlZiBtZXRob2QxKHNlbGYsICpfYXJncyk6CiAgICAgICAgICAgICAgICAgdmFsID0gYXBwbHkodGVzdDJjLlB5Q2xhc3MxX21ldGhvZDEsIChzZWxmLCkgKyBfYXJncykKICAgICAgICAgICAgICAgICByZXR1cm4gdmFsCgogICAgICAgICAgICAgYmVjb21lcwoKICAgICAgICAgICAgIGRlZiBtZXRob2QxKCpfYXJncyk6CiAgICAgICAgICAgICAgICAgdmFsID0gYXBwbHkodGVzdDJjLlB5Q2xhc3MxX21ldGhvZDEsIF9hcmdzKQogICAgICAgICAgICAgICAgIHJldHVybiB2YWwKCiAgICAgICAgICAzLiBSZW1vdmUgKlB0ciBjbGFzc2VzLgogICAgICAgICAgICAgQXNzdW1lIHRoYXQgd2UgYXJlIFNXSUdnaW5nIGEgYysrIGNsYXNzIENwcENsYXNzLgogICAgICAgICAgICAgQ3VycmVudGx5IFNXSUcgd2lsbCBnZW5lcmF0ZSBib3RoIENwcENsYXNzUHRyIGNsYXNzCiAgICAgICAgICAgICB0aGF0IGhvc3RzIGFsbCBtZXRob2RzIGFuZCBhbHNvIENwcENsYXNzIHRoYXQgaXMgZGVyaXZlZAogICAgICAgICAgICAgZnJvbSB0aGUgZm9ybWVyIGFuZCBjb250YWlucyBqdXN0IHRoZSBjb25zdHJ1Y3Rvci4KICAgICAgICAgICAgIFdoZW4gQ3BwQ2xhc3MgbWV0aG9kIGlzIGNhbGxlZCwgdGhlIGludGVycHJldGVyIHdpbGwgdHJ5CiAgICAgICAgICAgICB0byBmaW5kIGl0IGluIHRoZSBDcHBDbGFzcydzIGRpY3Rpb25hcnkgZmlyc3QsIGFuZCBvbmx5IHRoZW4KICAgICAgICAgICAgIGNoZWNrIHRoZSBiYXNlIGNsYXNzLgoKICAgICAgICAgICAgIENwcENsYXNzUHRyIGZ1bmN0aW9uYWxpdHkgbWF5IGJlIGVtdWxhdGVkIHdpdGg6CgogICAgICAgICAgICAgaW1wb3J0IG5ldwogICAgICAgICAgICAgX25ld19pbnN0YW5jZSA9IG5ldy5pbnN0YW5jZQogICAgICAgICAgICAgZGVmIENwcENsYXNzUHRyKHRoaXMpOgogICAgICAgICAgICAgICAgICByZXR1cm4gX25ld19pbnN0YW5jZShDcHBDbGFzcywgeyJ0aGlzIjp0aGlzLCJ0aGlzb3duIjowfSkKCiAgICAgICAgICAgICBUaGlzIHNhdmVzIHVzIG9uZSBkaWN0aW9uYXJ5IGxvb2t1cCBwZXIgY2FsbC4KCiAgICAgICAgICAgICA8REI+VGhlIG5ldyBtb2R1bGUgd2FzIGZpcnN0IGFkZGVkIGluIFB5dGhvbi0xLjUuMiBzbyBpdAogICAgICAgICAgICAgd29uJ3Qgd29yayB3aXRoIG9sZGVyIHZlcnNpb25zLiAgSSd2ZSBpbXBsZW1lbnRlZCBhbgogICAgICAgICAgICAgYWx0ZXJuYXRpdmUgdGhhdCBhY2hpZXZlcyB0aGUgc2FtZSB0aGluZzwvREI+CgogICAgICAgICAgNC4gVXNlIENPYmplY3RzIGluc3RlYWQgb2Ygc3RyaW5ncyBmb3IgcG9pbnRlcnMuCgogICAgICAgICAgRGF2ZTogVGhpcyBlbmhhbmNlbWVudHMgcmVzdWx0IGluIHNwZWVkdXBzIG9mIHVwIHRvIDUwJSBpbiBzb21lCiAgICAgICAgICBvZiB0aGUgcHJlbGltaW5hcnkgdGVzdHMgSSByYW4uCgoyLzEvMDAgIDogVXBncmFkZWQgdGhlIFB5dGhvbiBtb2R1bGUgdG8gdXNlIGEgbmV3IHR5cGUtY2hlY2tpbmcgc2NoZW1lIHRoYXQKICAgICAgICAgIGlzIG1vcmUgbWVtb3J5IGVmZmljaWVudCwgcHJvdmlkZXMgYmV0dGVyIHBlcmZvcm1hbmNlLCBhbmQKICAgICAgICAgIGlzIGxlc3MgZXJyb3IgcHJvbmUuIFVuZm9ydHVuYXRlbHksIGl0IHdpbGwgYnJlYWsgYWxsIGNvZGUgdGhhdAogICAgICAgICAgZGVwZW5kcyBvbiB0aGUgU1dJR19HZXRQdHIoKSBmdW5jdGlvbiBjYWxsIGluIHR5cGVtYXBzLgogICAgICAgICAgVGhlc2UgZnVuY3Rpb25zIHNob3VsZCBiZSBjaGFuZ2VkIGFzIGZvbGxvd3M6CgogICAgICAgICAgICAgICAgaWYgKFNXSUdfR2V0UHRyKHN0cmluZywmcHRyLCJfRm9vX3AiKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgIGJlY29tZXMKCiAgICAgICAgICAgICAgICBpZiAoU1dJR19Db252ZXJ0UHRyKHB5b2JqLCAmcHRyLCBTV0lHX1RZUEVfRm9vX3ApID09IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgTm90ZTogSW4gdGhlIG5ldyBpbXBsZW1lbnRhdGlvbiBTV0lHX1RZUEVfRm9vX3AgaXMgbm8gbG9uZ2VyCiAgICAgICAgICBhIHR5cGUtc2lnbmF0dXJlIHN0cmluZywgYnV0IHJhdGhlciBhbiBpbmRleCBpbnRvIGEgdHlwZQogICAgICAgICAgZW5jb2RpbmcgdGFibGUgdGhhdCBjb250YWlucyB0eXBlIGluZm9ybWF0aW9uLgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoxLzMwLzAwIDogbG9pYwoJICBDb25kaXRpb25hbHkgY29tcGlsZSBleHBlcmltZW50YWwgY29kZSB3aXRoIC0tZW5hYmxlLWV4cGVyaW1lbnQKCSAgY29uZmlndXJlIGZsYWcuCgkgIEZpeCAuY3ZzaWdub3JlIHRvIGlnbm9yZSBjb25maWdydWUgJiB5YWNjIGdlbmVyYXRlZCBmaWxlcwoKMS8yOC8wMCA6IGxvaWMKCSAgQXBwbHkgYXV0b21ha2UgZXZlcnl3aGVyZQoJICBLZWVwIGNvbmZpZ3VyZSBzY3JpcHRzIHNvIHRoYXQgcGVvcGxlIGFyZSBub3QgKmZvcmNlZCogdG8gYXV0b2NvbmYKICAgICAgICAgIEtlZXAgc291cmNlcyBnZW5lcmF0ZWQgYnkgeWFjYyBzbyB0aGF0IGNvbXBpbGF0aW9uIHdpdGhvdXQgeWFjYwoJICBpcyBwb3NzaWJsZS4KCSAgU291cmNlL0xQYXJzZS9jc2Nhbm5lci5jOiBjaGFuZ2UgbHlhY2MuaCBpbnRvIHBhcnNlci5oIHRvIHBsZWFzZQoJICBkZWZhdWx0IHlhY2MgZ2VuZXJhdGlvbiBydWxlcy4KCSAgVXNlIEFDX0NPTkZJR19TVUJESVJTIGluIGNvbmZpZ3VyZS5pbiBpbnN0ZWFkIG9mIGhhbmQgbWFkZSBzY3JpcHQuCgkgIFVwZGF0ZSBhbGwgcmVsZXZhbnQgLmN2c2lnbm9yZSB0byBpbmNsdWRlIC5kZXBzCgkgIEZpeGVkIG1pc3NpbmcgOyBsaW5lIDEzNiBTb3VyY2UvU3dpZy9zd2lnLmgKCjEvMTMvMDAgOiBiZWF6bGV5CiAgICAgICAgICBGaXhlZCBhIG51bWJlciBvZiBtaW5vciBlbmQtb2YtZmlsZSBwYXJzaW5nIHByb2JsZW1zIGluIHRoZQogICAgICAgICAgcHJlcHJvY2Vzc29yLgoKMS8xMy8wMCA6IGJlYXpsZXkKICAgICAgICAgIEFkZGVkIC1mcmVlemUgb3B0aW9uIHRoYXQgZm9yY2VzIFNXSUcgdG8gZnJlZXplIHVwb24gZXhpdC4KICAgICAgICAgIFRoaXMgaXMgb25seSB1c2VkIGFzIGEgZGVidWdnaW5nIHRvb2wgc28gdGhhdCBJIGNhbiBtb3JlCiAgICAgICAgICBlYXNpbHkgZXhhbWluZSBTV0lHJ3MgbWVtb3J5IGZvb3RwcmludC4KCjEvMTMvMDAgOiBiZWF6bGV5CiAgICAgICAgICBBZGRlZCBwYXRjaCB0byBndWlsZSBtb2R1bGUgZm9yIHN1cHBvcnRpbmcgb3B0aW9uYWwgYXJndW1lbnRzCiAgICAgICAgICBQYXRjaCBjb250cmlidXRlZCBieSBEaWV0ZXIgQmFyb24uCgoxLzEzLzAwIDogbG9pYwoJICBBZGRlZCAuY3ZzaWdub3JlLCBFeGFtcGxlcy8uY3ZzaWdub3JlLCBTb3VyY2UvRE9IL0RvaC8uY3ZzaWdub3JlCgkgIFNvdXJjZS9TV0lHMS4xL21haW4uY3h4OiBGaXhlZCAtSSBoYW5kbGluZyBidWcKCSAgU291cmNlL01vZHVsZXMxLjEvamF2YS5jeHg6IGZpeGVkIGNoYXIqIC0+IGNvbnN0IGNoYXIqIHdhcm5pbmdzIHRoYXQgYXJlCgkgIGVycm9ycyB3aGVuIGNvbXBpbGluZyB3aXRoIGdjYy0yLjk1LjIKCSAgU291cmNlL1NXSUcxLjEvbWFpbi5jeHg6IGNhc3QgY29uc3QgY2hhciogdG8gY2hhciogZm9yIFN0cmluZ19yZXBsYWNlCgkgIHRva2VuIGFuZCByZXAgc2hvdWxkIHJlYWxseSBiZSBjb25zdC4KCjEvMTIvMDAgOiBiZWF6bGV5CiAgICAgICAgICBBZGRlZCBIYXJjbydzIEphdmEgbW9kdWxlcy4KCjEvMTIvMDAgOiBiZWF6bGV5CiAgICAgICAgICBSZXZva2VkIHRoZSAlaWZkZWYsICVpZm5kZWYsICVlbmRpZiwgJWlmLCAlZWxpZiwgYW5kICVlbHNlCiAgICAgICAgICBkaXJlY3RpdmVzLiAgVGhlc2UgYXJlIG5vIGxvbmdlciBuZWVkZWQgYXMgU1dJRyBub3cgaGFzIGEgcmVhbAogICAgICAgICAgcHJlcHJvY2Vzc29yLgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoxLzEyLzAwIDogYmVhemxleQogICAgICAgICAgTW92ZWQgdGhlIGRvY3VtZW50YXRpb24gbW9kdWxlcyBmcm9tIHRoZSBTV0lHIGRpcmVjdG9yeQogICAgICAgICAgdG8gdGhlIE1vZHVsZXMgZGlyZWN0b3J5ICh3aGVyZSB0aGV5IHJlYWxseSBzaG91bGQgaGF2ZSBiZWVuCiAgICAgICAgICB0byBiZWdpbiB3aXRoKS4KCjEvMTIvMDAgOiBiZWF6bGV5CiAgICAgICAgICBSZW1vdmVkIHRoZSAtc3RhdCBvcHRpb24gZm9yIHByaW50aW5nIHN0YXRpc3RpY3MuIFRoZQogICAgICAgICAgc3RhdGlzdGljcyByZXBvcnRpbmcgd2FzIGluYWRlcXVhdGUgYW5kIG1vc3RseSBicm9rZW4KICAgICAgICAgIGFueXdheS4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMS8xMi8wMCA6IGJlYXpsZXkKICAgICAgICAgIFJlbW92ZWQgdGhlIC10IG9wdGlvbiBmb3IgcmVhZGluZyBhIHR5cGVtYXAgZmlsZS4gIE1vcmUKICAgICAgICAgIHRyb3VibGUgdGhhbiBpdCdzIHdvcnRoLiAgSnVzdCBpbmNsdWRlIHR5cGVtYXBzIGF0IHRoZSB0b3AKICAgICAgICAgIG9mIHRoZSBpbnRlcmZhY2UgZmlsZS4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMS8xMi8wMCA6IGJlYXpsZXkKICAgICAgICAgIFJlbW92ZWQgdGhlICVjaGVja291dCBkaXJlY3RpdmUuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjEvMTIvMDAgOiBiZWF6bGV5CiAgICAgICAgICBSZW1vdmVkIHRoZSAtY2kgb3B0aW9uIGZvciBmaWxlIGNoZWNraW4uICAgVG9vIHByb2JsZW1hdGljCiAgICAgICAgICB0byBpbXBsZW1lbnQuICBQcm9iYWJseSBiZXR0ZXIgdG8ganVzdCBwdXQgeW91ciBTV0lHIGxpYnJhcnkKICAgICAgICAgIHVuZGVyIENWUyBpbnN0ZWFkLgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqLgoKMS8xMS8wMCA6IGJlYXpsZXkKICAgICAgICAgIERlbGV0ZWQgdGhlIExBVEVYIG1vZHVsZS4gIFNvcnJ5Li4uIERpZG4ndCBrbm93IGFueW9uZQogICAgICAgICAgd2hvIHdhcyB1c2luZyBpdC4gIEJlc2lkZXMsIEknbSBsb29raW5nIHRvIHNpbXBsaWZ5CiAgICAgICAgICB0aGUgZG9jdW1lbnRhdGlvbiBzeXN0ZW0uCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjEvMTEvMDAgOiBiZWF6bGV5CiAgICAgICAgICBNb2RpZmllZCB0aGUgQVNDSUkgZG9jdW1lbnRhdGlvbiBtb2R1bGUgdG8gdXNlIGEgLnR4dAogICAgICAgICAgc3VmZml4IGZvciBpdHMgb3V0cHV0IGZpbGUgaW5zdGVhZCBvZiAuZG9jLgoKMS8xMS8wMCA6IGJlYXpsZXkKICAgICAgICAgIEFkZGVkIHRoZSBsb25nLWxvc3QgU1dJRyBwcmVwcm9jZXNzb3IgYmFjayB0byB0aGUgc3lzdGVtLgogICAgICAgICAgSXQgc2hvdWxkIGJlIGVuYWJsZWQgYnkgZGVmYXVsdC4gIFJhdyBwcmVwcm9jZXNzZWQgb3V0cHV0CiAgICAgICAgICBjYW4gYmUgdmlld2VkIHVzaW5nIHN3aWcgLUUgZmlsZS5pLgogICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKMS8xMS8wMCA6IGJlYXpsZXkgYW5kIGRqbWl0Y2hlCiAgICAgICAgICBDb21wbGV0ZWx5IHJlb3JnYW5pemVkIHRoZSBTV0lHIGRpcmVjdG9yeSBzdHJ1Y3R1cmUuICBUaGUKICAgICAgICAgIGJhc2ljIG9yZ2FuaXphdGlvbiBpcyBub3c6CgogICAgICAgICAgICAgICAgU291cmNlLyAgICAgICAgIFNXSUcgc291cmNlIGNvZGUKICAgICAgICAgICAgICAgIExpYi8gICAgICAgICAgICBTV0lHIGxpYnJhcnkgZmlsZXMgKHN3aWdfbGliKQogICAgICAgICAgICAgICAgRG9jLyAgICAgICAgICAgIERvY3VtZW50YXRpb24KICAgICAgICAgICAgICAgIEV4YW1wbGVzLyAgICAgICBFeGFtcGxlcwoKICAgICAgICAgIE1vcmUgZGlyZWN0b3JpZXMgd2lsbCBiZSBhZGRlZCBhcyBuZWVkZWQuCgoxMi8wOC85OTogTG9pYyBEYWNoYXJ5IChsb2ljQHNlbmdhLm9yZykKCSAgRW5oYW5jZWQgcGFja2FnZSBoYW5kbGluZyBmb3IgcGVybDUgYW5kIGMrKy4KCgkgIFdpdGggbmV3IG9wdGlvbiAtaGlkZSBGb286OkJhciwgZXZlcnkgcGVybDUgb2JqZWN0IChGcm9iKSBpcwoJICBxdWFsaWZpZWQgYnkgRm9vOjpCYXI6OkZyb2IuIFRoZSBwYWNrYWdlIG5hbWUgaXMgc29sZWx5IHVzZWQKCSAgdG8gZW5jYXBzdWxhdGUgQy9DKysgd3JhcHBlcnMgb3V0cHV0IGluIDxtb2R1bGU+X3dyYXAuYyBhbmQgdGhlCgkgIGNvcnJlc3BvbmRpbmcgcGVybCBwYWNrYWdlIGluIDxtb2R1bGU+LnBtLiBOb3RlIHRoYXQgYSBwYWNrYWdlCgkgIG5hbWUgbWF5IGNvbnRhaW4gOjogKEZyb2I6Ok5pdHopIGFuZCB3aWxsIGJlIHJlbGF0aXZlIHRvIHRoZQoJICBwYWNrYWdlIG5hbWUgcHJvdmlkZWQgYnkgLWhpZGUgKEZvbzo6QmFyOjpGcm9iOjpOaXR6KS4KCgkgIEluICpfd3JhcC5jLCBTV0lHX2luaXQgbWFjcm8gaXMgdXNlZC4gV2FzIHByZXZpb3VzbHkgZGVmaW5lZAoJICBidXQgbm90IHVzZWQgYW5kIHNpbXBsaWZpZXMgY29kZS4KCgkgIEFkZGVkIHR5cGVtYXAocGVybDUscGVybDVpbikgYW5kIHR5cGVtYXAocGVybDUscGVybDVvdXQpIHRoYXQKCSAgZG8gdGhlIGVxdWl2YWxlbnQgb2YgdHlwZW1hcChwZXJsNSxpbikgYW5kIHR5cGVtYXAocGVybDUsb3V0KQoJICBidXQgY29udGFpbiBwZXJsIGNvZGUgYW5kIGFwcGxpZXMgdG8gd3JhcHBlcnMgZ2VuZXJhdGVkIGJ5CgkgIC1zaGFkb3cuCgoJICBMYWNraW5nIHByb3BlciByZWdyZXNzaW9uIHRlc3RzIEkgdXNlZAoJICBFeGFtcGxlcy9wZXJsNS97YysrLGNvbnN0cmFpbnQsZGVmYXJnLGV4Y2VwdCwKCSAgZ3JhcGgvZ3JhcGhbMTIzNF0sbXVsdGluaGVyaXQsbmVzdGVkLHNoYWRvdyxzaW1wbGUsdHJlZSwKCSAgdHlwZW1hcHMve2FyZ3YsYXJndjIsYXJyYXltZW1iZXIsZGF0YWJhc2UsZmlsZSxpZ25vcmUsaW50ZWdlciwKCSAgb3V0cHV0LHBhc3NyZWYscmVmZXJlbmNlLHJldHVybn19Ly4gSSByYW4gc3dpZyB3aXRoIGFuZCB3aXRob3V0CgkgIHRoZSBwYXRjaGVzLCBkaWZmIHRoZSBnZW5lcmF0ZWRzb3VyY2VzLCBydW4gdGhlIC5wbCBmaWxlcwoJICBhbmQgY2hlY2tlZCB0aGF0IHRoZSByZXN1bHRzIGFyZSBpZGVudGljYWwuIEluIGFsbCB0aG9zZSBleGFtcGxlcwoJICBJIGhhZCBubyBlcnJvci4KCjExLzIxLzk5OiBNb2RpZmllZCB0aGUgVGNsIG1vZHVsZSB0byBwcm92aWRlIGZ1bGwgdmFyaWFibGUgbGlua2luZyBjYXBhYmlsaXRpZXMKICAgICAgICAgIHRvIGFsbCBkYXRhdHlwZXMuICAgSW4gcHJldmlvdXMgdmVyc2lvbnMsIGEgcGFpciBvZiBhY2Nlc3NvciBmdW5jdGlvbnMKICAgICAgICAgIHdlcmUgY3JlYXRlZCBmb3IgZGF0YXR5cGVzIGluY29tcGF0aWJsZSB3aXRoIHRoZSBUY2xfTGlua1ZhcigpIGZ1bmN0aW9uLgogICAgICAgICAgTm93LCB3ZSBzaW1wbHkgdXNlIHZhcmlhYmxlIHRyYWNlcyB0byBzdXBwb3J0IGV2ZXJ5dGhpbmcuIFRoaXMgbWF5CiAgICAgICAgICBicmVhayBzY3JpcHRzIHRoYXQgcmVseSB1cG9uIHRoZSBvbGRlciBiZWhhdmlvci4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMTEvMjEvOTk6IEFkZGVkIHNsaWdodCB0d2VhayB0byB3cmFwcGVyIGdlbmVyYXRvciB0byBjb2xsZWN0IGxvY2FsIHZhcmlhYmxlcwogICAgICAgICAgb2Ygc2ltaWxhciB0eXBlLiAgUHJvZHVjZXMgc29tZXdoYXQgbW9yZSBjb21wYWN0IHdyYXBwZXIgY29kZS4KCjExLzIwLzk5OiBNb2RpZmllZCB0aGUgVGNsIG1vZHVsZSB0byB1c2UgU1dJR19HZXRBcmdzKCkgdG8gcGFyc2UKICAgICAgICAgIGFyZ3VtZW50cy4gICAgVGhpcyBpcyBhIHRlY2huaXF1ZSBib3Jyb3dlZCBmcm9tIFB5dGhvbiBpbiB3aGljaAogICAgICAgICAgYXJndW1lbnRzIGFyZSBjb252ZXJ0ZWQgdXNpbmcgYSBmb3JtYXQgc3RyaW5nIGNvbnZlbnRpb24gc2ltaWxpYXIKICAgICAgICAgIHRvIGZwcmludGYoKS4gICBUaGlzIHJlc3VsdHMgaW4gYSAqc3Vic3RhbnRpYWwqIHJlZHVjdGlvbiBpbiB0aGUKICAgICAgICAgIHNpemUgb2YgdGhlIHJlc3VsdGluZyB3cmFwcGVyIGNvZGUgd2l0aCBvbmx5IGEgbW9kZXN0IHJ1bnRpbWUgb3ZlcmhlYWQKICAgICAgICAgIGluIGdvaW5nIHRocm91Z2ggdGhlIGV4dHJhIGNvbnZlcnNpb24gZnVuY3Rpb24uCgoxMS8xMy85OTogQ29tcGxldGVseSByZXdyb3RlIHRoZSBjbGFzcy9zdHJ1Y3R1cmUgZ2VuZXJhdGlvbiBjb2RlIGZvciB0aGUKICAgICAgICAgIFRjbCBtb2R1bGUuICBOb3csIGEgc21hbGwgc2V0IG9mIHJ1bnRpbWUgZnVuY3Rpb25zIGFyZSB1c2VkCiAgICAgICAgICB0byBpbXBsZW1lbnQgdGhlIGZ1bmN0aW9uYWxpdHkgZm9yIGFsbCBjbGFzc2VzIChpbnN0ZWFkIG9mIGEKICAgICAgICAgIG1hc3NpdmUgYW1vdW50IG9mIHJ1bnRpbWUgY29kZSBiZWluZyBnZW5lcmF0ZWQgZm9yIGVhY2ggY2xhc3MpLgogICAgICAgICAgQ2xhc3Mgc3BlY2lmaWMgaW5mb3JtYXRpb24gaXMgc2ltcGx5IGVuY29kZWQgaW4gYSBzZXJpZXMgb2YKICAgICAgICAgIHN0YXRpYyB0YWJsZXMuICAgVGhpcyByZXN1bHRzIGluIGEgKkhVR0UqIHJlZHVjdGlvbiBpbiB3cmFwcGVyCiAgICAgICAgICBjb2RlIHNpemUtLWVzcGVjaWFsbHkgZm9yIEMrKy4KCjExLzEzLzk5OiBSZW1vdmVkIHRoZSAtdGNsIChUY2wgNy54KSBtb2R1bGUuICBUY2wgOC4wIGlzIG5vdyBzZXZlcmFsCiAgICAgICAgICB5ZWFycyBvbGQgYW5kIHRoZSBkZWZhY3RvIHN0YW5kYXJkLS1ubyByZWFsIHJlYXNvbiB0byBrZWVwCiAgICAgICAgICBzdXBwb3J0aW5nIHRoZSBvbGQgdmVyc2lvbiBhdCB0aGlzIHBvaW50LgoKMTEvMTMvOTk6IENsZWFuZWQgdXAgLWMgb3B0aW9uIGZvciBQeXRob24gbW9kdWxlLiAgVGhlIHB5ZXhwLnN3ZyBmaWxlCiAgICAgICAgICBpcyBub3cgZ29uZS4KCjExLzEzLzk5OiBGaXhlZCBleHRlcm5hbCBkZWNsYXJhdGlvbnMgdG8gd29yayBiZXR0ZXIgd2l0aCBzdGF0aWMgbGlua2luZwogICAgICAgICAgb24gV2luZG93cy4gIFN0YXRpYyBsaW5raW5nIHNob3VsZCBub3cgYmUgcG9zc2libGUgYnkgZGVmaW5pbmcKICAgICAgICAgIHRoZSAtRFNUQVRJQ19MSU5LIG9wdGlvbiBvbiB0aGUgY29tbWFuZCBsaW5lLiAgUGF0Y2ggY29udHJpYnV0ZWQKICAgICAgICAgIGJ5IEFsYmVydG8gRm9uc2VjYS4KCjExLzUvOTkgOiBGaXhlZCBhbiBvYnNjdXJlIGNvZGUgZ2VuZXJhdGlvbiBidWcgcmVsYXRlZCB0byB0aGUgZ2VuZXJhdGlvbgogICAgICAgICAgb2YgZGVmYXVsdCBjb25zdHJ1Y3RvcnMuICAgQnVnIHJlcG9ydGVkIGJ5IEJyYWQgQ2xlbWVudHMuCgoxMS81Lzk5IDogRml4ZWQgYSBmZXcgbWVtb3J5IHByb2JsZW1zIGZvdW5kIGJ5IHB1cmlmeS4KCjExLzUvOTkgOiBPZmZpY2lhbGx5IGRlcHJlY2F0ZWQgdGhlIC1odGNsLCAtaHRrLCBhbmQgLXBsdWdpbiBvcHRpb25zCiAgICAgICAgICBmcm9tIHRoZSBUY2wgYW5kIFRjbDggbW9kdWxlcy4KCjEwLzI2Lzk5OiBSZW1vdmVkIHVudXNlZCB2YXJpYWJsZSBmcm9tIHB5dGhvbi90eXBlbWFwcy5pLiAgUGF0Y2gKICAgICAgICAgIGNvbnRyaWJ1dGVkIGJ5IEtlaXRoIERhdmlkc29uLgoKOC8xNi85OSA6IEFkZGVkIF9XSU4zMiBzeW1ib2wgdG8gbGlicmFyaWVzIHRvIGJldHRlciBzdXBwb3J0IFdpbmRvd3MuCgo4LzE2Lzk5IDogRGVwcmVjYXRlZCB0aGUgUGVybDQgbW9kdWxlLiAgIEl0IGlzIG5vIGxvbmdlciBpbmNsdWRlZCBpbiB0aGUKICAgICAgICAgIGRpc3RyaWJ1dGlvbiBhbmQgbm8gbG9uZ2VyIHN1cHBvcnRlZC4gIEluIHRoZSBlbnRpcmUgMyB5ZWFycyBTV0lHCiAgICAgICAgICBoYXMgYmVlbiBhcm91bmQgSSBuZXZlciByZWNlaXZlZCBhIHNpbmdsZSBjb21tZW50IGFib3V0IGl0IHNvIEknbQogICAgICAgICAgYXNzdW1pbmcgbm8gb25lIHdpbGwgbWlzcyBpdC4uLgoKOC8xNi85OSA6IE1vZGlmaWVkIHRoZSB0eXBlLWNoZWNraW5nIGNvZGUgdG8gcmVnaXN0ZXIgdHlwZSBtYXBwaW5ncyB1c2luZyBhCiAgICAgICAgICB0YWJsZSBpbnN0ZWFkIG9mIHJlcGVhdGVkIGNhbGxzIHRvIFNXSUdfUmVnaXN0ZXJNYXBwaW5nKCkuICBUaGlzCiAgICAgICAgICByZWR1Y2VzIHRoZSBzaXplIG9mIHRoZSBtb2R1bGUgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24gc29tZXdoYXQuCgo4LzE1Lzk5IDogQ2xlYW5lZCB1cCB0aGUgcG9pbnRlciB0eXBlLWNoZWNraW5nIGNvZGUgaW4gdGhlIFRjbCBtb2R1bGUuCgo4LzE1Lzk5IDogTWFueSBjaGFuZ2VzIHRvIHRoZSBsaWJyYXJpZXMgdG8gc3VwcG9ydCBydW50aW1lIGxpYnJhcmllcy4KCjgvMTMvOTkgOiBFbGltaW5hdGVkIEMrKyBjb21waWxlciB3YXJuaW5nIG1lc3NhZ2VzIGFib3V0IGV4dGVybiAiQyIgbGlua2FnZS4KCjgvMTMvOTkgOiBTb21lIGNsZWFudXAgb2YgUHl0aG9uIC5zd2cgZmlsZXMgdG8gYmV0dGVyIHN1cHBvcnQgcnVudGltZSBsaWJyYXJpZXMKICAgICAgICAgIG9uIFdpbmRvd3MuCgo4LzEzLzk5IDogTW9kaWZpZWQgdGhlICVwcmFnbWEgZGlyZWN0aXZlIHRvIGF0dGFjaCBwcmFnbWFzIGRlY2xhcmVkIGluc2lkZQogICAgICAgICAgYSBjbGFzcyBkZWZpbml0aW9uIHRvIHRoZSBjbGFzcyBpdHNlbGYuIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgY2xhc3MgZm9vIHsKICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgICAlcHJhZ21hKHB5dGhvbikgYWRkdG9tZXRob2QgPSAiaW5zZXJ0OnByaW50IGBoZWxsbyB3b3JsZCciCiAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICBNb3N0IHBlb3BsZSBkb24ndCBuZWVkIHRvIHdvcnJ5IGFib3V0IGhvdyB0aGlzIHdvcmtzLiAgRm9yIHBlb3BsZQogICAgICAgICAgd3JpdGluZyBiYWNrZW5kIG1vZHVsZXMsIGNsYXNzLWJhc2VkIHByYWdtYXMgd29yayBsaWtlIHRoaXM6CgogICAgICAgICAgICAgIGxhbmctPmNwcF9vcGVuX2NsYXNzKCkgICAgICAgICAgICAgLy8gT3BlbiBhIGNsYXNzCiAgICAgICAgICAgICAgbGFuZy0+Y3BwX3ByYWdtYSgpICAgICAgICAgICAgICAgICAvLyBTdXBwbHkgcHJhZ21hcwogICAgICAgICAgICAgIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRW1pdCBtZW1iZXJzCgogICAgICAgICAgICAgIGxhbmctPmNwcF9jbG9zZV9jbGFzcygpICAgICAgICAgICAgLy8gQ2xvc2UgdGhlIGNsYXNzCgogICAgICAgICAgQWxsIG9mIHRoZSBwcmFnbWFzIGFyZSBwYXNzZWQgZmlyc3Qgc2luY2UgdGhleSBtaWdodCBiZSB1c2VkIHRvCiAgICAgICAgICBhZmZlY3QgdGhlIGNvZGUgZ2VuZXJhdGlvbiBvZiBvdGhlciBtZW1iZXJzLiAgIFBsZWFzZSBzZWUKICAgICAgICAgIHRoZSBQeXRob24gbW9kdWxlIGZvciBhbiBleGFtcGxlLiAgIFBhdGNoZXMgY29udHJpYnV0ZWQKICAgICAgICAgIGJ5IFJvYmluIER1bm4uCgo4LzEzLzk5IDogUGF0Y2ggdG8gUHl0aG9uIHNoYWRvdyBjbGFzc2VzIHRvIGVsaW1pbmF0ZSBpZ25vcmVkCiAgICAgICAgICBleGNlcHRpb24gZXJyb3JzIGluIGRlc3RydWN0b3JzLiAgUGF0Y2ggY29udHJpYnV0ZWQKICAgICAgICAgIGJ5IFJvYmluIER1bm4uCgo4LzExLzk5IDogTWlub3IgcGF0Y2ggdG8gc3dpZ19saWIvcHl0aG9uL3N3aWdwdHIuc3dnICAoYWRkZWQgU1dJR1NUQVRJQwogICAgICAgICAgZGVjbGFyYXRpb24pLiAgUGF0Y2ggY29udHJpYnV0ZWQgYnkgTHlsZSBKb2huc29uLgoKOC8xMS85OSA6IEFkZGVkIEZJUlNUS0VZL05FWFRLRVkgbWV0aG9kcyB0byBQZXJsNSBzaGFkb3cgY2xhc3NlcwogICAgICAgICAgUGF0Y2ggY29udHJpYnV0ZWQgYnkgRGVubmlzIE1hcnNhLgoKOC8xMS85OSA6IE1vZGlmaWVkIFB5dGhvbiBtb2R1bGUgc28gdGhhdCBOVUxMIHBvaW50ZXJzIGFyZSByZXR1cm5lZAogICAgICAgICAgYW5kIHBhc3NlZCBhcyAnTm9uZS4nICBQYXRjaCBjb250cmlidXRlZCBieSBUYWwgU2hhbGlmLgoKOC8xMC85OSA6IEZpeGVkIG1pc3NpbmcgJ2ludCcgc3BlY2lmaWVycyBpbiB2YXJpb3VzIHBsYWNlcy4KCjgvMTAvOTkgOiBBZGRlZCBXaW5kb3dzIG1ha2VmaWxlIGZvciBSdW50aW1lIGxpYnJhcmllcy4gIENvbnRyaWJ1dGVkCiAgICAgICAgICBieSBCb2IgVGVjaGVudGluLgoKOC8xMC85OSA6IEZpeGVkIG1pbm9yIHByb2JsZW0gaW4gUHl0aG9uIHJ1bnRpbWUgbWFrZWZpbGUgaW50cm9kdWNlZAogICAgICAgICAgYnkga2V5d29yZCBhcmd1bWVudHMuCgo4LzgvOTkgIDogQ2hhbmdlZCAkdGFyZ2V0IG9mIHBlcmw1KG91dCkgdHlwZW1hcCBmcm9tIFNUKDApIHRvCiAgICAgICAgICBTVChhcmd2aSkuICBQYXRjaCBjb250cmlidXRlZCBieSBHZW9mZnJleSBIb3J0LgoKOC84Lzk5ICA6IEZpeGVkIGJ1ZyBpbiB0eXBlbWFwIGNoZWNraW5nIHJlbGF0ZWQgdG8gdGhlIEFOWSBrZXl3b3JkCiAgICAgICAgICBpbiBhcnJheXMgYW5kIGlnbm9yZWQgYXJndW1lbnRzLiAgRXJyb3IgcmVwb3J0ZWQgYnkKICAgICAgICAgIEdlb2ZmcmV5IEhvcnQuCgo4LzgvOTkgIDogJWVuYWJsZWRvYyBhbmQgJWRpc2FibGVkb2MgZGlyZWN0aXZlcyBjYW4gbm93IGJlIHVzZWQKICAgICAgICAgIGluc2lkZSBjbGFzcy9zdHJ1Y3R1cmUgZGVmaW5pdGlvbnMuICAgSG93ZXZlciwgbm8gY2hlY2sKICAgICAgICAgIGlzIG1hZGUgdG8gc2VlIGlmIHRoZXkgYXJlIGJhbGFuY2VkIChpLmUuLCBhICVkaXNhYmxlZG9jCiAgICAgICAgICBkaXJlY3RpdmUgaW5zaWRlIGEgY2xhc3MgZG9lcyBub3QgaGF2ZSB0byBoYXZlIGEgbWF0Y2hpbmcKICAgICAgICAgICVlbmFibGVkb2MgaW4gdGhlIHNhbWUgY2xhc3MpLgoKOC84Lzk5ICA6IEtleXdvcmQgYXJndW1lbnQgaGFuZGxpbmcgaXMgbm93IHN1cHBvcnRlZCBpbiB0aGUgUHl0aG9uCiAgICAgICAgICBtb2R1bGUuICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICBpbnQgZm9vKGNoYXIgKmJhciwgaW50IHNwYW0sIGRvdWJsZSB4KTsKCiAgICAgICAgICBDYW4gYmUgY2FsbGVkIGZyb20gUHl0aG9uIGFzCgogICAgICAgICAgICAgICBmb28oeCA9IDMuNCwgYmFyPSJoZWxsbyIsIHNwYW09NDIpCgogICAgICAgICAgVG8gZW5hYmxlIHRoaXMgZmVhdHVyZSwgcnVuIFNXSUcgd2l0aCB0aGUgJy1rZXl3b3JkJyBjb21tYW5kCiAgICAgICAgICBsaW5lIG9wdGlvbi4gICAgTWl4aW5nIGtleXdvcmQgYW5kIGRlZmF1bHQgYXJndW1lbnRzCiAgICAgICAgICBzaG91bGQgd29yayBhcyB3ZWxsLiAgIFVubmFtZWQgYXJndW1lbnRzIGFyZSBhc3NpZ25lZCBuYW1lcwogICAgICAgICAgc3VjaCBhcyAiYXJnMSIsICJhcmcyIiwgZXRjLi4uCgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCiAgICAgICAgICBGdW5jdGlvbnMgd2l0aCBkdXBsaWNhdGUgYXJndW1lbnQgbmFtZXMgc3VjaCBhcwogICAgICAgICAgYmFyKGludCAqT1VUUFVULCBpbnQgKk9VVFBVVCkgd2lsbCBsaWtlbHkgY2F1c2UgcHJvYmxlbWF0aWMKICAgICAgICAgIHdyYXBwZXIgY29kZSB0byBiZSBnZW5lcmF0ZWQuICAgVG8gZml4IHRoaXMsICB1c2UgZGlmZmVyZW50CiAgICAgICAgICBuYW1lcyBvciB1c2UgJWFwcGx5IHRvIG1hcCB0eXBlbWFwcyB0byBhbHRlcm5hdGUgbmFtZXMuCgo4LzgvOTkgIDogSGFuZGxpbmcgb2YgdGhlICd0aGlzJyBwb2ludGVyIGhhcyBiZWVuIGNoYW5nZWQgaW4gUHl0aG9uIHNoYWRvdwogICAgICAgICAgY2xhc3Nlcy4gIFByZXZpb3VzbHksIGRlcmVmZXJlbmNpbmcgb2YgJy50aGlzJyBvY2N1cmVkIGluIHRoZQogICAgICAgICAgUHl0aG9uIHNoYWRvdyBjbGFzcyBpdHNlbGYuICAgTm93LCB0aGlzIHN0ZXAgb2NjdXJzIGluIHRoZSBDCiAgICAgICAgICB3cmFwcGVycyB1c2luZyB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uOgoKICAgICAgICAgICAgICAgIFNXSUdfR2V0UHRyT2JqKFB5T2JqZWN0ICosIHZvaWQgKipwdHIsIGNoYXIgKnR5cGUpCgogICAgICAgICAgVGhpcyBmdW5jdGlvbiBjYW4gYWNjZXB0IGVpdGhlciBhIHN0cmluZyBjb250YWluaW5nIGEgcG9pbnRlcgogICAgICAgICAgb3IgYSBzaGFkb3cgY2xhc3MgaW5zdGFuY2Ugd2l0aCBhICcudGhpcycgYXR0cmlidXRlIG9mCiAgICAgICAgICBhcHByb3ByaWF0ZSB0eXBlLiAgVGhpcyBjaGFuZ2UgYWxsb3dzIHRoZSBmb2xsb3dpbmc6CgogICAgICAgICAgMS4gIFRoZSByZWFsIHNoYWRvdyBjbGFzcyBpbnN0YW5jZSBmb3IgYW4gb2JqZWN0IGlzCiAgICAgICAgICAgICAgcGFzc2VkIHRvIHRoZSBDIHdyYXBwZXJzIHdoZXJlIGl0IGNhbiBiZSBleGFtaW5lZC9tb2RpZmllZAogICAgICAgICAgICAgIGJ5IHR5cGVtYXBzLgoKICAgICAgICAgIDIuICBIYW5kbGluZyBvZiBkZWZhdWx0L2tleXdvcmQgYXJndW1lbnRzIGlzIG5vdyBncmVhdGx5CiAgICAgICAgICAgICAgc2ltcGxpZmllZC4KCiAgICAgICAgICAzLiAgVGhlIFB5dGhvbiB3cmFwcGVyIGNvZGUgaXMgbXVjaCBtb3JlIHNpbXBsZS4KCiAgICAgICAgICBQbHVzLCBpdCBlbGltaW5hdGVkIG1vcmUgdGhhbiAzMDAgbGluZXMgb2YgQysrIGNvZGUgaW4gdGhlCiAgICAgICAgICBQeXRob24gbW9kdWxlLgoKICAgICAgICAgICoqKiBDQVZFQVQgOiBUaGlzIHJlcXVpcmVzIHRoZSBhYnN0cmFjdCBvYmplY3QgaW50ZXJmYWNlLgogICAgICAgICAgSXQgc2hvdWxkIHdvcmsgd2l0aCBQeXRob24gMS40LCBidXQgcHJvYmFibHkgbm90aGluZyBvbGRlcgogICAgICAgICAgdGhhbiB0aGF0LgoKCjgvOC85OSAgOiBGaXhlZCBoYW5kbGluZyBvZiAiY29uc3QiIGFuZCBwb2ludGVycyBpbiBjbGFzc2VzLiAgSW4gcGFydGljdWxhciwKICAgICAgICAgIGRlY2xhcmF0aW9ucyBzdWNoIGFzCgogICAgICAgICAgIGNsYXNzIGZvbyB7CiAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm1zZzsKICAgICAgICAgICAgIGNvbnN0IGludCAgKmlwdHI7CiAgICAgICAgICB9CgogICAgICAgICAgYXJlIGhhbmRsZWQgYXMgYXNzaWduYWJsZSB2YXJpYWJsZXMgYXMgb3Bwb3NlZCB0byBjb25zdGFudAogICAgICAgICAgdmFsdWVzICh0aGlzIGlzIHRoZSBjb3JyZWN0IGJlaGF2aW9yIGluIEMvQysrKS4gICBOb3RlOgogICAgICAgICAgZGVjbGFyYXRpb25zIHN1Y2ggYXMgImNoYXIgKmNvbnN0IG1zZyIgYXJlIHN0aWxsIHVuc3VwcG9ydGVkLgogICAgICAgICAgQ29uc3RhbnRzIGRlY2xhcmVkIGF0IHRoZSBnbG9iYWwgbGV2ZWwgdXNpbmcgY29uc3QgYXJlIGFsc28KICAgICAgICAgIGJyb2tlbiAoYmVjYXVzZSBJIGhhdmUgYSBudW1iZXIgb2YgaW50ZXJmYWNlcyB0aGF0IHJlbHkgdXBvbgogICAgICAgICAgdGhpcyBiZWhhdmlvcikuCgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqICBUaGlzIG1heSBicmVhayBpbnRlcmZhY2VzIHRoYXQKICAgICAgICAgIG1pc3Rha2VubHkgdHJlYXQgJ2NvbnN0IGNoYXIgKicgdHlwZXMgYXMgY29uc3RhbnQgdmFsdWVzLgoKOC84Lzk5ICA6IE1vZGlmaWVkIHRoZSBwYXJzZXIgdG8gc3VwcG9ydCBiaXQtZmllbGRzLiAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICB0eXBlZGVmIHN0cnVjdCB7CiAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGlzX2tleXdvcmQgOiAxOwogICAgICAgICAgICAgIHVuc2lnbmVkIGludCBpc19leHRlcm4gIDogMTsKICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgaXNfc3RhdGljICA6IDE7CiAgICAgICAgICB9IGZsYWdzOwoKICAgICAgICAgIEJpdC1maWVsZHMgY2FuIG9ubHkgYmUgYXBwbGllZCB0byBpbnRlZ2VyIHR5cGVzIGFuZCB0aGVpcgogICAgICAgICAgYXJlIG90aGVyIHJlc3RyaWN0aW9ucy4gIFNXSUcgcGVyZm9ybXMgbm8gc3VjaCB0eXBlLWNoZWNraW5nCiAgICAgICAgICAoYWx0aG91Z2ggdGhlIEMgY29tcGlsZXIgd2lsbCBjYXRjaCBwcm9ibGVtcyB3aGVuIGl0IHRyaWVzIHRvCiAgICAgICAgICBjb21waWxlIHRoZSB3cmFwcGVyIGNvZGUpLgoKOC84Lzk5ICA6IFJlbW92ZWQgdHJhaWxpbmcgc3BhY2Ugb2YgJGJhc2V0eXBlIHN1YnN0aXR1dGlvbiBpbiB0eXBlbWFwcy4KICAgICAgICAgIFRoaXMgaXMgdG8gYWxsb3cgdGhpbmdzIGxpa2UgdGhpczoKCiAgICAgICAgICAldHlwZW1hcChweXRob24sIGFyZ291dCkgc3BhbSoqIE9VVFBVVHsKICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICBjaGFyKiBhID0gIiRiYXNldHlwZV9wIjsKICAgICAgICAgICAgICAuLi4KICAgICAgICAgIH0KCiAgICAgICAgICAoUGF0Y2ggc3VnZ2VzdGVkIGJ5IE5hdGhhbiBEdW5maWVsZCkuCgo2LzIyLzk5IDogTWFkZSBhIHZlcnkgc2xpZ2h0IHR3ZWFrIHRvIHRoZSBQZXJsNSBzaGFkb3cgY2xhc3MKICAgICAgICAgIGNvZGUgdGhhdCBhbGxvd3MgdHlwZW1hcHMgdG8gYWx0ZXIgdGhlIHJldHVybiB0eXBlCiAgICAgICAgICBvZiBvYmplY3RzICh0byBzdXBwb3J0IHBvbHltb3JwaGljIHR5cGVzKS4gIFBhdGNoCiAgICAgICAgICBjb250cmlidXRlZCBieSBEcmFrZSBEaWVkcmljaC4KCjQvOC85OSAgOiBGaXhlZCBudWxsIHBvaW50ZXIgaGFuZGxpbmcgYnVnIGluIFBlcmwgbW9kdWxlLgogICAgICAgICAgUGF0Y2ggY29udHJpYnV0ZWQgYnkgSnVuaW8gSGFtYW5vLgoKMy8xNy85OSA6IEZpeGVkIGJ1ZyBpbiBwZXJsNXB0ci5zd2cgZm9yIEFjdGl2ZVN0YXRlIFBlcmwuCiAgICAgICAgICBQYXRjaCBjb250cmlidXRlZCBieSBHcmVnIEFuZGVyc29uLgoKMi8yNy85OSA6IEVsaW1pbmF0ZWQgc2VnbWVudGF0aW9uIGZhdWx0IHdoZW4gU3dpZyBydW5zIG9uCiAgICAgICAgICBlbXB0eSBmaWxlcy4KCjIvMjcvOTkgOiBBZGRlZCBwYXRjaCB0byBHdWlsZSBtb2R1bGUgdG8gZWxpbWluYXRlIHVudXNlZAogICAgICAgICAgdmFyaWFibGVzLiAgIENvbnRyaWJ1dGVkIGJ5IE1pa2UgU2ltb25zLgoKMi8yNy85OSA6IEZpeGVkIHByb2JsZW0gd2l0aCAlYWRkbWV0aG9kcyByZXR1cm5pbmcgcmVmZXJlbmNlcy4KCjIvMjcvOTkgOiBGaXhlZCBSdW50aW1lL01ha2VmaWxlLiBQYXRjaCBjb250cmlidXRlZCBieQogICAgICAgICAgTWlrZSBSb21iZXJnLgoKMi8yNy85OSA6IEluY29ycG9yYXRlZCBwYXRjaGVzIHRvIHRoZSB0eXBlLWNoZWNrZXIuCgoyLzI3Lzk5IDogRml4ZWQgcHJvYmxlbSB3aXRoIC1leHBvcnRhbGwgc3dpdGNoIGFuZCBzaGFkb3cgY2xhc3NlcwogICAgICAgICAgaW4gUGVybDUgbW9kdWxlLiAgUGF0Y2ggY29udHJpYnV0ZWQgYnkgRGVubmlzIE1hcnNhLgoKMi8yNy85OSA6IE1vZGlmaWVkIFBlcmw1IG1vZHVsZSB0byByZWNvZ25pemUgJ3VuZGVmJyBhcyBhIE5VTEwgY2hhciAqLgogICAgICAgICAgUGF0Y2ggY29udHJpYnV0ZWQgYnkgSnVuaW8gSGFtYW5vLgoKMi8yNy85OSA6IEZpeGVkIHRoZSBQZXJsNSBtb2R1bGUgdG8gc3VwcG9ydCB0aGUgbmV3ZXIgdmVyc2lvbnMgb2YKICAgICAgICAgIEFjdGl2ZVN0YXRlIFBlcmwgZm9yIFdpbjMyLgoKMi8yNy85OSA6IEZpeGVkIHRoZSBpbmNsdWRlIG9yZGVyIG9mIGZpbGVzIHNwZWNpZmllZCB3aXRoIHRoZQogICAgICAgICAgLUkgb3B0aW9uLgoKMi81Lzk4LSA6IERhdmUgZmluaXNoZXMgaGlzIGRpc3NlcnRhdGlvbiwgZ29lcyBqb2IgaHVudGluZywgbW92ZXMgdG8KMi81Lzk5ICAgIENoaWNhZ28gYW5kIGdlbmVyYWxseSB0aHJhc2hlcyBhYm91dC4KClZlcnNpb24gMS4xIFBhdGNoIDUgKEZlYnJ1YXJ5IDUsIDE5OTgpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoyLzQvOTggIDogRml4ZWQgYSBidWcgaW4gdGhlIGNvbmZpZ3VyZSBzY3JpcHQgd2hlbiBkaWZmZXJlbnQgcGFja2FnZQogICAgICAgICAgbG9jYXRpb25zIGFyZSBzcGVjaWZpZWQgKC0td2l0aC10Y2xpbmNsLCBldGMuLi4pLgoKMi8yLzk4ICA6IEZpeGVkIG5hbWUtY2xhc2ggYnVnIHJlbGF0ZWQgdG8gdGhlIHN3aXRjaCB0byBDIG1hY3JvcyBmb3IgYWNjZXNzb3IKICAgICAgICAgIGZ1bmN0aW9ucy4gIFRoZSBuZXcgc2NoZW1lIGRpZCBub3Qgd29yayBjb3JyZWN0bHkgZm9yIG9iamVjdHMKICAgICAgICAgIHdpdGggbWVtYmVycyBzdWNoIGFzICdvYmonLCAndmFsJywgZXRjLi4uICAgRml4ZWQgdGhlIGJ1ZyBieQogICAgICAgICAgYXBwZW5kaW5nIHRoZSB3b3JkICdzd2lnJyB0byBtYWNybyBhcmd1bWVudCBuYW1lcy4gIFBhdGNoCiAgICAgICAgICBjb250cmlidXRlZCBieSBSdWR5IEFsYmFjaHRlbi4KCjIvMi85OCAgOiBTbGlnaHQgZml4IHRvIHRoZSBQZXJsNSBtb2R1bGUgdG8gZWxpbWluYXRlIHdhcm5pbmcgbWVzc2FnZXMKICAgICAgICAgIGFib3V0ICd2YXJuYW1lIHVzZWQgb25seSBvbmNlIDogcG9zc2libGUgdHlwbycuICBGaXgKICAgICAgICAgIGNvbnRyaWJ1dGVkIGJ5IFJ1ZHkgQWxiYWNodGVuLgoKMS85Lzk4ICA6IEZpeGVkIGEgYnVnIGluIHRoZSBQZXJsIDUgbW9kdWxlIHJlbGF0ZWQgdG8gdGhlIGNyZWF0aW9uIG9mCiAgICAgICAgICBjb25zdGFudHMgYW5kIHNoYWRvdyBjbGFzc2VzLgoKMS85Lzk4ICA6IEZpeGVkIGxpbmtpbmcgYnVnIHdpdGggUHl0aG9uIDEuNSBlbWJlZC5pIGxpYnJhcnkgZmlsZS4KClZlcnNpb24gMS4xIFBhdGNoIDQgKEphbnVhcnkgNCwgMTk5OCkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMS80Lzk4ICA6IENoYW5nZWQgc3RydWN0dXJlZCBvZiB0aGUgRXhhbXBsZXMgZGlyZWN0b3J5IHRvIGJlIG1vcmUgZnJpZW5kbHkKICAgICAgICAgIHRvIEJvcmxhbmQgQysrLgoKMS80Lzk4ICA6IEFkZGVkIHRoZSBmdW5jdGlvbiBNYWtlZmlsZS53aW4uYmMgZm9yIGNvbXBpbGluZyB0aGUgZXhhbXBsZXMKICAgICAgICAgIHVuZGVyIEJvcmxhbmQgNS4yLgoKMS80Lzk4ICA6IFNsaWdodCBjaGFuZ2UgdG8gdGhlIHBlcmw1IG1vZHVsZSBhbmQgQysrIGNvbXBpbGF0aW9uLiAgVGhlCiAgICAgICAgICA8bWF0aC5oPiBsaWJyYXJ5IGlzIG5vdyBpbmNsdWRlZCBiZWZvcmUgYW55IFBlcmwgaGVhZGVycwogICAgICAgICAgYmVjYXVzZSBQZXJsIHRoZSBleHRlcm4gIkMiIGxpbmthZ2Ugb2YgbWF0aC5oIHNjcmV3cyBhbG90CiAgICAgICAgICBvZiB0aGluZ3MgdXAgKGVzcGVjaWFsbHkgb24gV2luZG93cykuCgoxLzIvOTggIDogQ2hhbmdlIHRvIHRoZSBQeXRob24gbW9kdWxlIHRoYXQgcmVkdWNlcyB0aGUgbnVtYmVyIG9mIGNvbnN0YW50cwogICAgICAgICAgY3JlYXRlZCBieSBDKysgY2xhc3NlcywgaW5oZXJpdGFuY2UsIGFuZCBzaGFkb3cgY2xhc3Nlcy4gICBUaGlzCiAgICAgICAgICBtb2RpZmljYXRpb24gbWF5IGludHJvZHVjZSBhIGZldyBzbGlnaHQgaW5jb21wYXRpYmlsaXRpZXMgaWYKICAgICAgICAgIHlvdSBhdHRlbXB0IHRvIHVzZSB0aGUgbm9uLXNoYWRvdyBjbGFzcyBpbnRlcmZhY2Ugd2l0aCBzaGFkb3cKICAgICAgICAgIGNsYXNzZXMgZW5hYmxlZC4gICAgUGF0Y2ggY29udHJpYnV0ZWQgYnkgTWlrZSBSb21iZXJnLgoKMS8yLzk4ICA6IFN1cHBvcnQgZm9yIFRjbCA4LjAgbmFtZXNwYWNlcyBoYXMgYmVlbiBhZGRlZC4gICBUaGlzICpyZXBsYWNlcyoKICAgICAgICAgIHRoZSBvcmlnaW5hbCBTV0lHIG1lY2hhbmlzbSB0aGF0IGFzc3VtZWQgW2luY3IgVGNsXSBuYW1lc3BhY2VzLgogICAgICAgICAgVG8gdXNlIG5hbWVzcGFjZXMsIHNpbXBseSBydW4gU1dJRyB3aXRoIHRoZSBmb2xsb3dpbmcgb3B0aW9ucwoKICAgICAgICAgICAgIHN3aWcgLXRjbCAtbmFtZXNwYWNlICBmb28uaQoKICAgICAgICAgICAgICAgICAgICBUaGlzIHBsYWNlcyBldmVyeXRoaW5nIGluIGEgbmFtZXNwYWNlIHRoYXQgbWF0Y2hlcwogICAgICAgICAgICAgICAgICAgIHRoZSBtb2R1bGUgbmFtZQoKICAgICAgICAgICAgIHN3aWcgLXRjbCAtbmFtZXNwYWNlIC1wcmVmaXggYmFyIGZvby5pCgogICAgICAgICAgICAgICAgICAgIFRoaXMgcGxhY2VzIGV2ZXJ5dGhpbmcgaW4gdGhlIG5hbWVzcGFjZSAnYmFyJwoKICAgICAgICAgIFRoZSB1c2Ugb2YgbmFtZXNwYWNlcyBpcyBuZXcgaW4gVGNsIDguMC4gIEhvd2V2ZXIsIHRoZSB3cmFwcGVyIGNvZGUKICAgICAgICAgIGdlbmVyYXRlZCBieSBTV0lHIHdpbGwgc3RpbGwgd29yayB3aXRoIGFsbCB2ZXJzaW9ucyBvZiBUY2wgbmV3ZXIKICAgICAgICAgIHRoYW4gYW5kIGluY2x1ZGluZyBUY2wgNy4zL1RrMy42IGV2ZW4gaWYgdGhlIC1uYW1lc3BhY2Ugb3B0aW9uIGlzCiAgICAgICAgICB1c2VkLgoKICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgogICAgICAgICAgVGhpcyBjaGFuZ2UgbWF5IGJyZWFrIGV4aXN0aW5nIGFwcGxpY2F0aW9ucyB0aGF0IHJlbGllZCBvbiB0aGUKICAgICAgICAgIC1wcmVmaXggYW5kIC1uYW1lc3BhY2Ugb3B0aW9ucy4KCjEvMi85OCAgOiBBZGRlZCB0aGUgZm9sbG93aW5nIGNvbnN0YW50cyB0byB0aGUgVGNsIHdyYXBwZXIgY29kZQoKICAgICAgICAgICAgICAgICBTV0lHX25hbWUgICAgICAtIE5hbWUgb2YgdGhlIFNXSUcgbW9kdWxlCiAgICAgICAgICAgICAgICAgU1dJR19wcmVmaXggICAgLSBQcmVmaXgvbmFtZXNwYWNlIGFwcGVuZGVkIHRvIGNvbW1hbmQgbmFtZXMKICAgICAgICAgICAgICAgICBTV0lHX25hbWVzcGFjZSAtIE5hbWUgb2YgdGhlIG5hbWVzcGFjZQoKICAgICAgICAgIFNXSUcgbGlicmFyeSB3cml0ZXJzIGNhbiB1c2UgdGhlc2UgdG8gdGhlaXIgYWR2YW50YWdlcy4KCjEvMi85OCAgOiBGaXhlZCBhIGJ1ZyBpbiB0aGUgVGNsOCBtb2R1bGUgcmVsYXRlZCB0byB0aGUgY3JlYXRpb24gb2YKICAgICAgICAgIHBvaW50ZXIgY29uc3RhbnRzICh0aGUgZnVuY3Rpb24gU1dJR19NYWtlUHRyIHdhcyBtaXNzaW5nIGZyb20KICAgICAgICAgIHRoZSB3cmFwcGVyIGNvZGUpLgoKMS8yLzk4ICA6IEFkZGVkIHRoZSBjb25zdGhhc2guaSBsaWJyYXJ5IGZpbGUgdG8gdGhlIFRjbCBhbmQgVGNsOCBtb2R1bGVzLgoKMS8xLzk4ICA6IENoYW5nZWQgYW5kIGNsZWFuZWQgdXAgdGhlIFB5dGhvbiB0eXBlbWFwcy5pIGZpbGUuICAgVGhlIGZvbGxvd2luZwogICAgICAgICAgc2lnbmlmaWNhbnQgY2hhbmdlcyB3ZXJlIG1hZGUgOgoKICAgICAgICAgICAgICAgIDEuICBUaGUgT1VUUFVUIHR5cGVtYXAgbm93IHJldHVybnMgUHl0aG9uIHR1cGxlcyBpbnN0ZWFkIG9mCiAgICAgICAgICAgICAgICAgICAgbGlzdHMuICAgTGlzdHMgY2FuIGJlIHJldHVybmVkIGFzIGJlZm9yZSBieSB1c2luZyB0aGUKICAgICAgICAgICAgICAgICAgICBMX09VVFBVVCB0eXBlLiAgICBJZiBjb21wYXRpYmlsaXR5IHdpdGggb2xkZXIgdmVyc2lvbnMKICAgICAgICAgICAgICAgICAgICBpcyBuZWVkZWQsIHJ1biBTV0lHIHdpdGggdGhlIC1ET1VUUFVUX0xJU1Qgb3B0aW9uLgoKICAgICAgICAgICAgICAgIDIuICBUaGUgQk9USCB0eXBlbWFwIGhhcyBiZWVuIHJlbmFtZWQgdG8gSU5PVVQuICBGb3IgYmFja3dhcmRzCiAgICAgICAgICAgICAgICAgICAgY29tcGF0aWJpbGl0eSwgdGhlICJCT1RIIiBtZXRob2Qgc3RpbGwgZXhpc3RzIGhvd2V2ZXIuCgogICAgICAgICAgICAgICAgMy4gIE91dHB1dCB0eXBlbWFwcyBub3cgZ2VuZXJhdGUgbGVzcyBjb2RlIHRoYW4gYmVmb3JlLgoKICAgICAgICAgIENoYW5nZXMgdG8gdHlwZW1hcHMuaSBtYXkgYnJlYWsgZXhpc3RpbmcgUHl0aG9uIHNjcmlwdHMgdGhhdCBhc3N1bWUKICAgICAgICAgIG91dHB1dCBpbiB0aGUgZm9ybSBvZiBhIGxpc3QuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjEyLzMxLzk3OiBGaXhlZCBsb25nIG92ZXJkdWUgcHJvYmxlbXMgd2l0aCB0aGUgdGVzdGluZyBzY3JpcHRzIGFuZCBjZXJ0YWluCiAgICAgICAgICBtYWtlZmlsZXMgdGhhdCByZXF1aXJlZCB0aGUgdXNlIG9mIHRoZSBiYXNoIHNoZWxsLiAgIEV2ZXJ5dGhpbmcgc2hvdWxkCiAgICAgICAgICB3b3JrIHByb3Blcmx5IHdpdGggdGhlIHN0YW5kYXJkIEJvdXJuZSBzaGVsbCAoc2gpIG5vdy4KCjEyLzMxLzk3OiBNb2RpZmllZCB0eXBlbWFwcyB0byBhbGxvdyAkYmFzZXR5cGUgYXMgYSB2YWxpZCBsb2NhbCB2YXJpYWJsZS4KICAgICAgICAgIFRoaXMgYWxsb3dzIGZvciBhbGwgc29ydHMgb2YgYml6YXJyZSBoYWNraXNoIHR5cGVtYXBzIHRoYXQKICAgICAgICAgIGRvIGNvb2wgdGhpbmdzLiAgIFBhdGNoIGNvbnRyaWJ1dGVkIGJ5IERvbWluaXF1ZSBEdW1vbnQuCgoxMi8zMS85NzogU3dpdGNoZWQgYWNjZXNzb3IgZnVuY3Rpb25zIGdlbmVyYXRlZCBmb3IgbWVtYmVyIGRhdGEgdG8KICAgICAgICAgIEMgcHJlcHJvY2Vzc29yIG1hY3JvcyAoZXhjZXB0IGluIGNhc2VzIGludm9sdmluZyB0eXBlbWFwcwogICAgICAgICAgb3IgY2hhciAqKS4KCjEyLzMxLzk3OiBGaXhlZCBhIGJ1ZyByZWxhdGVkIHRvIEMrKyBtZW1iZXIgZGF0YSBpbnZvbHZpbmcgcmVmZXJlbmNlcy4KCjEyLzMxLzk3OiBDaGFuZ2VkIGFjY2Vzc29yIGZ1bmN0aW9ucyBmb3IgQysrIG1lbWJlciBmdW5jdGlvbnMgdG8KICAgICAgICAgIHByZXByb2Nlc3NvciBtYWNyb3MuICAgVGhpcyBjbGVhbnMgdXAgdGhlIHdyYXBwZXIgY29kZQogICAgICAgICAgYW5kIHJlc3VsdHMgaW4gZmV3ZXIgZnVuY3Rpb24gZGVmaW5pdGlvbnMuCgoxMi8zMS85NzogQ2hhbmdlZCB0aGUgZGVmYXVsdCBDIGNvbnN0cnVjdG9yIHRvIHVzZSBjYWxsb2MoKSBpbnN0ZWFkCiAgICAgICAgICBvZiBtYWxsb2MoKQoKMTIvMzAvOTc6IENoYW5nZWQgdGhlIGNyZWF0aW9uIG9mIGNvbnN0YW50cyBpbiB0aGUgUGVybDUgbW9kdWxlLgogICAgICAgICAgRm9yIGFsbCBwcmFjdGljYWwgcHVycG9zZXMsIHRoZXkgc2hvdWxkIHdvcmsgaW4gZXhhY3RseSB0aGUKICAgICAgICAgIHNhbWUgd2F5IGFzIGJlZm9yZSBleGNlcHQgdGhhdCB0aGV5IG5vdyByZXF1aXJlIG11Y2ggbGVzcwogICAgICAgICAgd3JhcHBlciBjb2RlLiAgIE1vZHVsZXMgY29udGFpbmluZyBsYXJnZSBudW1iZXJzIG9mCiAgICAgICAgICBjb25zdGFudHMgbWF5IHNlZSBncmVhdGVyIHRoYW4gYSA1MCUgcmVkdWN0aW9uIGluIHdyYXBwZXIKICAgICAgICAgIGNvZGUgc2l6ZS4KCjEyLzMwLzk3OiBNb2RpZmllZCB0aGUgUHl0aG9uIG1vZHVsZSB0byBiZSBtb3JlIGludGVsbGlnZW50IGFib3V0IHRoZQogICAgICAgICAgY3JlYXRpb24gb2YgY29uc3RhbnRzLiAgU1dJRyBubyBsb25nZXIgZ2VuZXJhdGVzIHJlZHVuZGFudAogICAgICAgICAgZ2xvYmFsIHZhcmlhYmxlcyBhbmQgdGhlIHNpemUgb2YgdGhlIG1vZHVsZSBpbml0aWFsaXphdGlvbgogICAgICAgICAgZnVuY3Rpb24gc2hvdWxkIGJlIHJlZHVjZWQuICAgKE1hbnkgdGhhbmtzIHRvIEppbSBGdWx0b24pLgoKMTIvMjkvOTc6IEZpeGVkIGEgYnVnIGluIEMrKyBjb2RlIGdlbmVyYXRpb24gcmVsYXRlZCB0byBtZW1iZXIgZnVuY3Rpb25zLAogICAgICAgICAgZGVmYXVsdCBhcmd1bWVudHMsIGFuZCByZWZlcmVuY2VzLgoKMTIvMjkvOTc6IEZpeGVkIGNvbmZpZ3VyZSBzY3JpcHQgYW5kIGEgZmV3IG1ha2VmaWxlcyB0byBzdXBwb3J0IFB5dGhvbiAxLjUKCjEyLzI5Lzk3OiBBZGRlZCAnZW1iZWQxNS5pJyBsaWJyYXJ5IGZpbGUuICBUaGlzIGZpbGUgc2hvdWxkIGJlIHVzZWQgdG8KICAgICAgICAgIHN0YXRpY2x5IGxpbmsgdmVyc2lvbnMgb2YgUHl0aG9uIDEuNS4gICAgVG8gbWFrZSBpdCB0aGUgZGVmYXVsdCwKICAgICAgICAgIHNpbXBseSBjb3B5ICdzd2lnX2xpYi9weXRob24vZW1iZWQxNS5pJyB0byAnc3dpZ19saWIvcHl0aG9uL2VtYmVkLmknCgpWZXJzaW9uIDEuMSBQYXRjaCAzIChOb3ZlbWJlciAyNCwgMTk5NykKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMTEvMjMvOTc6IEZpeGVkIGEgYnVnIGluIHRoZSBQZXJsNSBtb2R1bGUgd2l0aCBzaGFkb3cgY2xhc3NlcyBhbmQKICAgICAgICAgIHN0YXRpYyBjbGFzcyBmdW5jdGlvbnMgdGhhdCByZXR1cm4gY2xhc3MgaW5zdGFuY2VzLgogICAgICAgICAgTm90ZSA6IFRoZSBmaXggZm9yIHRoaXMgYnVnIHJlcXVpcmVzIGEgc2xpZ2h0IHJlc3RydWN0dXJpbmcgb2YKICAgICAgICAgIG9mIHRoZSAucG0gZmlsZXMgY3JlYXRlZCBieSBTV0lHLgoKMTEvMjMvOTc6IEZpeGVkIGEgYnVnIGluIHRoZSBUY2wvVGNsOCBtb2R1bGVzIHJlbGF0ZWQgdG8gdmFyaWFibGUgbGlua2luZwogICAgICAgICAgb2YgY2hhcmFjdGVyIGFycmF5cy4gIElmIHlvdSBkZWNsYXJlZCBhIGdsb2JhbCB2YXJpYWJsZSAnY2hhciBmb29bMTBdJywKICAgICAgICAgIHRoZSBnZW5lcmF0ZWQgd3JhcHBlciBjb2RlIHdvdWxkIGVpdGhlciBjYXVzZSBhIHNlZ21lbnRhdGlvbiBmYXVsdAogICAgICAgICAgaW1tZWRpYXRlbHkgdXBvbiBsb2FkaW5nIG9yIHdlaXJkIG1lbW9yeSBjb3JydXB0aW9uIGVsc2V3aGVyZS4KICAgICAgICAgIFRoaXMgc2hvdWxkIG5vdyBiZSBmaXhlZCBhbHRob3VnaCBjaGFyYWN0ZXIgYXJyYXlzIGNhbiBvbmx5IGJlCiAgICAgICAgICByZWFkLW9ubHkuCgoxMS8yMy85NzogRml4ZWQgYSBidWcgd2l0aCB0aGUgJWltcG9ydCBkaXJlY3RpdmUgdGhhdCBjYXVzZWQgaXQgdG8KICAgICAgICAgIGZhaWwgaWYgZmlsZXMgd2VyZSBpbXBvcnRlZCBmcm9tIGRpcmVjdG9yaWVzIG90aGVyIHRoYW4KICAgICAgICAgIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LgoKMTEvMjMvOTc6IEZpeGVkIGluY29ycmVjdCBkaWFnbm9zdGljIG1lc3NhZ2UgaW4gdGhlIEFTQ0lJIGRvY3VtZW50YXRpb24KICAgICAgICAgIG1vZHVsZS4KCjExLzIzLzk3OiBDaGFuZ2VkIHRoZSBiZWhhdmlvciBvZiB0aGUgLW8gb3B0aW9uIHdoZW4gdXNlZCB3aXRoIHNoYWRvdwogICAgICAgICAgY2xhc3Nlcy4gSWYgLW8gd2FzIHVzZWQgdG8gc3BlY2lmeSBib3RoIHRoZSBwYXRobmFtZSBhbmQgZmlsZW5hbWUKICAgICAgICAgIG9mIFNXSUcncyBvdXRwdXQgc3VjaCBhcwoKICAgICAgICAgICAgICAgICBzd2lnIC1vIC9ob21lL3N3aWcvd3JhcHBlci5jIC1zaGFkb3cgLXBlcmw1IGZvby5pCgogICAgICAgICAgVGhlIHdyYXBwZXIgY29kZSB3b3VsZCBiZSBwbGFjZWQgdGhlIGZpbGUgc3BlY2lmaWVkIHdpdGggLW8sCiAgICAgICAgICBidXQgdGhlIC5wbSBmaWxlIGFuZCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlIHBsYWNlZCBpbiB0aGUKICAgICAgICAgIGRpcmVjdG9yeSB3aGVyZSBTV0lHIHdhcyBydW4uICAgTm93LCB0aGVzZSBmaWxlcyBhcmUgcGxhY2VkCiAgICAgICAgICBpbiB0aGUgc2FtZSBkaXJlY3RvcnkgYXMgdGhlIGZpbGUgc3BlY2lmaWVkIHdpdGggdGhlIC1vIG9wdGlvbi4KICAgICAgICAgIFRoaXMgY2hhbmdlIGlzIGFsc28gbmVlZGVkIGZvciBwcm9wZXIgb3BlcmF0aW9uIG9uIHRoZQogICAgICAgICAgTWFjaW50b3NoLgoKMTEvMjMvOTc6IEFkZGVkIGEgJ3RoaXMoKScgbWV0aG9kIHRvIFBlcmw1IHNoYWRvdyBjbGFzc2VzLiAgIFRoaXMgY2FuCiAgICAgICAgICBiZSB1c2VkIHRvIHJldHVybiB0aGUgbm9ybWFsIHBvaW50ZXIgdmFsdWUgZnJvbSBhIHNoYWRvdwogICAgICAgICAgY2xhc3MgdGhhdCBpcyByZXByZXNlbnRlZCBhcyBhIHRpZWQgaGFzaC4gICBUbyB1c2UganVzdAogICAgICAgICAgaW52b2tlIGFzIGEgbWV0aG9kIGxpa2UgdGhpcyA6CgogICAgICAgICAgICAgICRsID0gbmV3IExpc3Q7ICAgICAgICMgQ3JlYXRlIGFuIG9iamVjdAogICAgICAgICAgICAgICRwdHIgPSAkbC0+dGhpcygpOyAgICMgR2V0IHRoZSBub3JtYWwgcG9pbnRlciB2YWx1ZQoKICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjExLzIzLzk3OiBGaXhlZCB0aGUgVGNsIDggcG9pbnRlci5pIGxpYnJhcnkgZmlsZSAod2hpY2ggd2FzIGNvbXBsZXRlbHkKICAgICAgICAgIGJyb2tlbiBpbiAxLjFwMikuCgoxMS8yMy85NzogTW9kaWZpZWQgdGhlIFBlcmw1IHR5cGUtY2hlY2tlciB0byBmaXggYSBmZXcgcHJvYmxlbXMKICAgICAgICAgIHdpdGggZ2xvYmFsIHZhcmlhYmxlcyBvZiBwb2ludGVyIHR5cGVzIGFuZCB0byBhbGxvdwogICAgICAgICAgdGllZCBoYXNoZXMgdG8gYmUgdXNlZCBpbnRlcmNoYW5nYWJseSB3aXRoIG5vcm1hbAogICAgICAgICAgcG9pbnRlciB2YWx1ZXMuCgoxMS8yMy85NzogTW9kaWZpZWQgdGhlIHR5cGVtYXAgbWVjaGFuaXNtIHRvIGFsbG93IG91dHB1dAogICAgICAgICAgdHlwZW1hcHMgb2YgdHlwZSAndm9pZCcuICAgVGhlc2Ugd2VyZSBpZ25vcmVkIHByZXZpb3VzbHksCiAgICAgICAgICBidXQgbm93IGlmIHlvdSBzcGVjaWZ5LAoKICAgICAgICAgICAgICAgICV0eXBlbWFwKGxhbmcsb3V0KSB2b2lkIHsKICAgICAgICAgICAgICAgICAgICAgIC4uLiByZXR1cm4gYSB2b2lkIC4uLgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgIFlvdSBjYW4gY2hhbmdlIG9yIGFzc2lnbiBhIHJldHVybiB2YWx1ZSB0byB0aGUgZnVuY3Rpb24uCgoxMS8yMy85NzogRml4ZWQgcHJvY2Vzc2luZyBvZiAnYm9vbCcgZGF0YXR5cGVzIGluIHRoZSBQeXRob24gbW9kdWxlLgoKMTEvMjMvOTc6IEZpeGVkIG1pbm9yIHBhcnNpbmcgZXJyb3Igd2l0aCBDKysgaW5pdGlhbGl6ZXJzLiBGb3IgZXhhbXBsZSwKCiAgICAgICAgICAgICAgICAgY2xhc3MgQiA6IHB1YmxpYyBBIHsKICAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgICAgQigpIDogQSgpIHsgLi4uIH07CiAgICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgfQoKMTEvMjMvOTc6IEZpeGVkIHRoZSBUY2w4IG1vZHVsZSBzbyB0aGF0IEMgZnVuY3Rpb25zIHRoYXQgY2FsbCBiYWNrIGludG8KICAgICAgICAgIFRjbCBkb24ndCBjb3JydXB0IHRoZSByZXR1cm4gcmVzdWx0IG9iamVjdCAoU1dJRyB3YXMgZ2F0aGVyaW5nCiAgICAgICAgICB0aGUgcmVzdWx0IG9iamVjdCB0b28gZWFybHkgd2hpY2ggbGVhZHMgdG8gcHJvYmxlbXMgaWYgc3Vic2VxdWVudAogICAgICAgICAgVGNsIGNhbGxzIGFyZSBtYWRlKS4KCjExLzIzLzk3OiBGaXhlZCBhIGNvZGUgZ2VuZXJhdGlvbiBidWcgaW4gdGhlIFB5dGhvbiBtb2R1bGUgd2hlbiB0d28gb3IKICAgICAgICAgIG1vcmUgb3V0cHV0IHBhcmFtZXRlcnMgd2VyZSB1c2VkIGFzIHRoZSBmaXJzdCBhcmd1bWVudHMgb2YgYQogICAgICAgICAgZnVuY3Rpb24uICBGb3IgZXhhbXBsZSA6CgogICAgICAgICAgICAgICAgICVpbmNsdWRlIHR5cGVtYXBzLmkKICAgICAgICAgICAgICAgICB2b2lkIGZvbyhkb3VibGUgKk9VVFBVVCwgZG91YmxlICpPVVRQVVQsIGRvdWJsZSBhKTsKCiAgICAgICAgICBQcmV2aW91c2x5LCBkb2luZyB0aGlzIHJlc3VsdGVkIGluIHRoZSBjcmVhdGlvbiBvZiBhbgogICAgICAgICAgZXh0cmFuZW91cyBjb21tYSBpbiB0aGUgb3V0cHV0LCByZXN1bHRpbmcgaW4gYSBDIHN5bnRheCBlcnJvci4KCjExLzIyLzk3OiBGaXhlZCBhIGJ1ZyB3aGVuIHRlbXBsYXRlIGhhbmRsaW5nIHRoYXQgd2FzIHN0cmlwcGluZyB3aGl0ZXNwYWNlCiAgICAgICAgICBhcm91bmQgbmVzdGVkIHRlbXBsYXRlcy4gICBGb3IgZXhhbXBsZSA6CgogICAgICAgICAgICAgICAgIEZvbzxCYXI8ZG91YmxlPiA+CgogICAgICAgICAgd2FzIGdldHRpbmcgbXVuZ2VkIGludG8gRm9vPEJhcj4+IHdoaWNoIGlzIGEgc3ludGF4IGVycm9yIGluCiAgICAgICAgICBpbiB0aGUgQysrIGNvbXBpbGVyLgoKMTEvMjIvOTc6IEZpeGVkIGJ1Z3MgaW4gdGhlIEJvcmxhbmQgQysrIG1ha2VmaWxlcy4KCjExLzIyLzk3OiBGaXhlZCBtZW1vcnkgY29ycnVwdGlvbiBidWcgd2hlbiBwcm9jZXNzaW5nIGludGVnZXIKICAgICAgICAgIGFyZ3VtZW50cyBpbiBUY2w4IG1vZHVsZS4KCjExLzIxLzk3OiBGaXhlZCBhIGJ1ZyBpbiB0aGUgUnVudGltZS9NYWtlZmlsZSByZWxhdGVkIHRvIFRjbCA4LgoKMTEvMjEvOTc6IEZpeGVkIGEgYnVnIHdpdGggdGhlICVuZXcgZGlyZWN0aXZlIGFuZCBQZXJsNSBzaGFkb3cgY2xhc3Nlcy4KICAgICAgICAgIE5vIGxvbmdlciBnZW5lcmF0ZXMgYSBwZXJsIHN5bnRheCBlcnJvci4KCjExLzkvOTcgOiBDaGFuZ2VkIGEgc3RybmNweSgpIHRvIHN0cmNweSgpIGluIHRoZSBwb2ludGVyIHR5cGUtY2hlY2tlci4KICAgICAgICAgIFRoaXMgcmVzdWx0cyBpbiBhIHN1YnN0YW50aWFsIHBlcmZvcm1hbmNlIGltcHJvdmVtZW50IGluCiAgICAgICAgICB0eXBlLWNoZWNraW5nLgoKMTAvMjkvOTc6IEZpeGVkIGEgYnVnIGluIHRoZSBjb2RlIGdlbmVyYXRpb24gb2YgZGVmYXVsdCBhcmd1bWVudHMgYW5kCiAgICAgICAgICB1c2VyLWRlZmluZWQgdHlwZXMuICBGb3IgZXhhbXBsZSA6CgogICAgICAgICAgICAgICAgIHZvaWQgZm9vKFZlY3RvciBhLCBWZWN0b3IgYiA9IGQpOwoKICAgICAgICAgIHNob3VsZCBub3cgd29yayBwcm9wZXJseS4KClZlcnNpb24gMS4xIFBhdGNoIDIgKFNlcHRlbWJlciA0LCAxOTk3KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjkvNC85NyAgOiBGaXhlZCBwcm9ibGVtIHdpdGggaGFuZGxpbmcgb2YgdmlydHVhbCBmdW5jdGlvbnMgdGhhdAogICAgICAgICAgd2FzIGludHJvZHVjZWQgYnkgc29tZSBjaGFuZ2VzIGluIHRoZSBDKysgbW9kdWxlLgoKVmVyc2lvbiAxLjEgUGF0Y2ggMSAoQXVndXN0IDI3LCAxOTk3KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cgo4LzI2Lzk3IDogRml4ZWQgY29tcGlsYXRpb24gYW5kIHJ1bi10aW1lIGJ1Z3Mgd2l0aCBUY2wgOC4wIGZpbmFsLgoKOC8yMS85NyA6IEZpeGVkIGNvZGUgZ2VuZXJhdGlvbiBidWcgd2l0aCBhcnJheXMgYXBwZWFyaW5nIGFzIGFyZ3VtZW50cwogICAgICAgICAgdG8gQysrIG1lbWJlciBmdW5jdGlvbnMuICBGb3IgZXhhbXBsZSA6CgogICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgIHZvaWQgQmFyKGludCBhWzIwXVsyMF0pOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICBUaGVyZSBpcyBzdGlsbCBhIGJ1ZyB1c2luZyBhcnJheXMgd2l0aCBhZGRlZCBtZXRob2RzCiAgICAgICAgICBob3dldmVyLgoKOC8yMC85NyA6IEZpeGVkIGEgYnVnIHdpdGggZ2VuZXJhdGluZyB0aGUgY29kZSBmb3IgYWRkZWQgbWV0aG9kcwogICAgICAgICAgaW52b2x2aW5nIHBhc3MtYnktdmFsdWUuCgo4LzE5Lzk3IDogTW9kaWZpZWQgdGhlIHR5cGVtYXBwZXIgdG8gc3Vic3RpdHV0ZSB0aGUgJyRhcmcnIHZhbHVlCiAgICAgICAgICB3aGVuIGRlY2xhcmluZyBsb2NhbCB2YXJpYWJsZXMuICAgIEZvciBleGFtcGxlIDoKCiAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIGRvdWJsZSAqIChkb3VibGUgdGVtcF8kYXJnKSB7CiAgICAgICAgICAgICAgICAgICAgLi4uIGRvIHNvbWV0aGluZyAuLi4KICAgICAgICAgICAgICB9CgogICAgICAgICAgV2hlbiBhcHBsaWVkIHRvIGEgcmVhbCBmdW5jdGlvbiBzdWNoIGFzIHRoZSBmb2xsb3dpbmcgOgoKICAgICAgICAgICAgICB2b2lkIGZvbyhkb3VibGUgKmEsIGRvdWJsZSAqYiwgZG91YmxlICpyZXN1bHQpOwoKICAgICAgICAgIHRocmVlIGxvY2FsIHZhcmlhYmxlcyB3aWxsIGJlIGNyZWF0ZWQgYXMgZm9sbG93cyA6CgogICAgICAgICAgICAgIGRvdWJsZSB0ZW1wX2E7CiAgICAgICAgICAgICAgZG91YmxlIHRlbXBfYjsKICAgICAgICAgICAgICBkb3VibGUgdGVtcF9yZXN1bHQ7CgogICAgICAgICAgVGhpcyBjYW4gYmUgdXNlZCB3aGVuIHdyaXRpbmcgbXVsdGlwbGUgdHlwZW1hcHMgdGhhdCBuZWVkCiAgICAgICAgICB0byBhY2Nlc3MgdGhlIHNhbWUgbG9jYWwgdmFyaWFibGVzLgoKCjcvMjcvOTcgOiBGaXhlZCBhIHZhcmlldHkgb2YgcHJvYmxlbXMgd2l0aCB0aGUgJWFwcGx5IGRpcmVjdGl2ZSBhbmQgYXJyYXlzLgogICAgICAgICAgVGhlIGZvbGxvd2luZyB0eXBlcyBvZiBkZWNsYXJhdGlvbnMgc2hvdWxkIG5vdyB3b3JrIDoKCiAgICAgICAgICAgICAgICVhcHBseSBkb3VibGUgW0FOWV0geyBSZWFsIFtBTlldIH07CiAgICAgICAgICAgICAgICVhcHBseSBkb3VibGUgWzRdIHsgZG91YmxlIFsxMF0gfTsKCiAgICAgICAgICBBIGdlbmVyaWMgdmVyc2lvbiBvZiBhcHBseSBsaWtlIHRoaXMgOgoKICAgICAgICAgICAgICAgJWFwcGx5IGRvdWJsZSB7IFJlYWwgfTsKCiAgICAgICAgICBzaG91bGQgbm93IHdvcmstLWV2ZW4gaWYgYXJyYXlzIGludm9sdmluZyBkb3VibGVzIGFuZCBSZWFscyBhcmUKICAgICAgICAgIHVzZWQgbGF0ZXIuCgo3LzI3Lzk3IDogQ2hhbmdlZCB3YXJuaW5nIG1lc3NhZ2UgYWJvdXQgIkFycmF5IFggaGFzIGJlZW4gY29udmVydGVkIHRvIFkiIHRvCiAgICAgICAgICBvbmx5IGFwcGVhciBpZiBydW5uaW5nIFNXSUcgaW4gdmVyYm9zZSBtb2RlLgoKNy8yNy85NyA6IEFkZGVkIHRoZSB2YXJpYWJsZXMgJHBhcm1uYW1lIGFuZCAkYmFzZW1hbmdsZSB0byB0aGUgdHlwZW1hcAogICAgICAgICAgZ2VuZXJhdG9yLiAgICAkcGFybW5hbWUgaXMgdGhlIG5hbWUgb2YgdGhlIHBhcmFtZXRlciB1c2VkCiAgICAgICAgICB3aGVuIHRoZSB0eXBlbWFwIHdhcyBtYXRjaGVkLiAgSXQgbWF5IGJlICIiIGlmIG5vIHBhcmFtZXRlcgogICAgICAgICAgd2FzIHVzZWQuICAgJGJhc2VtYW5nbGUgaXMgYSBtYW5nbGVkIHZlcnNpb24gb2YgdGhlIGJhc2UKICAgICAgICAgIGRhdGF0eXBlLiAgICBTb21ldGltZXMgdXNlZCBmb3IgYXJyYXkgaGFuZGxpbmcuCgo3LzI3Lzk3IDogQ2hhbmdlZCB0aGUgYmVoYXZpb3Igb2Ygb3V0cHV0IGFyZ3VtZW50cyB3aXRoIFB5dGhvbiBzaGFkb3cgY2xhc3Nlcy4KICAgICAgICAgIE9yaWdpbmFsbHksIGlmIGEgZnVuY3Rpb24gcmV0dXJuZWQgYW4gb2JqZWN0ICdGb28nLCB0aGUgc2hhZG93IGNsYXNzCiAgICAgICAgICBtZWNoYW5pc20gd291bGQgY3JlYXRlIGNvZGUgbGlrZSB0aGlzIDoKCiAgICAgICAgICAgICAgICBkZWYgcmV0dXJuX2ZvbygpOgogICAgICAgICAgICAgICAgICAgICAgdmFsID0gRm9vUHRyKHNoYWRvd2MucmV0dXJuX2ZvbygpKQogICAgICAgICAgICAgICAgICAgICAgdmFsLnRoaXMgPSAxCiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsCgogICAgICAgICAgVGhlIHByb2JsZW0gd2l0aCB0aGlzIGlzIHRoYXQgdHlwZW1hcHMgYWxsb3cgYSB1c2VyIHRvIHJlZGVmaW5lCiAgICAgICAgICB0aGUgb3V0cHV0IGJlaGF2aW9yIG9mIGEgZnVuY3Rpb24tLWFzIGEgcmVzdWx0LCB3ZSBjYW4gbm8gbG9uZ2VyCiAgICAgICAgICBtYWtlIGFueSBhc3N1bXB0aW9ucyBhYm91dCB0aGUgcmV0dXJuIHR5cGUgYmVpbmcgYSBwb2ludGVyIG9yCiAgICAgICAgICBldmVuIGJlaW5nIGEgc2luZ2xlIHZhbHVlIGZvciB0aGF0IG1hdHRlciAoaXQgY291bGQgYmUgYSBsaXN0LAogICAgICAgICAgdHVwbGUsIGV0Yy4uLikuICAgSWYgU1dJRyBkZXRlY3RzIHRoZSB1c2Ugb2Ygb3V0cHV0IHR5cGVtYXBzCiAgICAgICAgICAoZWl0aGVyICJvdXQiIG9yICJhcmdvdXQiKSBpdCByZXR1cm5zIHRoZSByZXN1bHQgdW5tb2RpZmllZCBsaWtlCiAgICAgICAgICB0aGlzIDoKCiAgICAgICAgICAgICAgICBkZWYgcmV0dXJuX2ZvbygpOgogICAgICAgICAgICAgICAgICAgICAgdmFsID0gc2hhZG93Yy5yZXR1cm5fZm9vKCkKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWwKCiAgICAgICAgICBJbiB0aGlzIGNhc2UsIGl0IGlzIHVwIHRvIHRoZSB1c2VyIHRvIGZpZ3VyZSBvdXQgd2hhdCB0byBkbwogICAgICAgICAgd2l0aCB0aGUgcmV0dXJuIHZhbHVlIChpbmNsdWRpbmcgdGhlIHBvc3NpYmlsaXR5IG9mIGNvbnZlcnRpbmcgaXQKICAgICAgICAgIGludG8gYSBQeXRob24gY2xhc3MpLgoKNy8yNi85NyA6IEZpeGVkIGEgcGFyc2luZyBwcm9ibGVtIHdpdGggdHlwZXMgbGlrZSAndW5zaWduZWQgbG9uZyBpbnQnLAogICAgICAgICAgJ3Vuc2lnbmVkIHNob3J0IGludCcsIGV0Yy4uLgoKNy8yNC85NyA6IE1pbm9yIGJ1ZyBmaXggdG8gVGNsIDggbW9kdWxlIHRvIHBhcnNlIGVudW1zIHByb3Blcmx5LiAgQWxzbwogICAgICAgICAgZml4ZWQgYSBtZW1vcnkgY29ycnVwdGlvbiBwcm9ibGVtIGluIHRoZSB0eXBlLWNoZWNrZXIuCiAgICAgICAgICAocGF0Y2ggY29udHJpYnV0ZWQgYnkgSGVucnkgUm93bGV5LgoKNy8yNC85NyA6IEFkZGVkIFB5dGhvbi10dXBsZSB0eXBlbWFwcyBjb250cmlidXRlZCBieSBSb2JpbiBEdW5uLgoKNy8yNC85NyA6IEluY29ycG9yYXRlZCBzb21lIGNoYW5nZXMgdG8gdGhlIFB5dGhvbiBtb2R1bGUgaW4gc3VwcG9ydCBvZgogICAgICAgICAgTWFyayBIYW1tb25kJ3MgQ09NIHN1cHBvcnQuICBJJ20gbm90IGVudGlyZWx5IHN1cmUgdGhleQogICAgICAgICAgd29yayB5ZXQgaG93ZXZlci4gIE5lZWRzIGRvY3VtZW50YXRpb24gYW5kIHRlc3RpbmcuCgo3LzI0Lzk3IDogRml4ZWQgY29kZSBnZW5lcmF0aW9uIGJ1Z3Mgd2hlbiBzdHJ1Y3R1cmVzIGhhZCBhcnJheSBtZW1iZXJzCiAgICAgICAgICBhbmQgdHlwZW1hcHMgd2VyZSB1c2VkLiAgRm9yIGV4YW1wbGUgOgoKICAgICAgICAgICAgICAldHlwZW1hcChtZW1iZXJpbikgZG91YmxlIFsyMF1bMjBdIHsKICAgICAgICAgICAgICAgICAgICAgIC4uLiBnZXQgYSBkb3VibGUgWzIwXVsyMF0gLi4uCiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHN0cnVjdCBGb28gewogICAgICAgICAgICAgICAgICAgICBkb3VibGUgYVsyMF1bMjBdOwogICAgICAgICAgICAgIH0KCiAgICAgICAgICBPcmlnaW5hbGx5LCB0aGlzIHdvdWxkIGdlbmVyYXRlIGEgY29tcGlsZXItdHlwZSBlcnJvciB3aGVuCiAgICAgICAgICB0aGUgd3JhcHBlciBjb2RlIHdhcyBjb21waWxlZC4gICBOb3csIGEgaGVscGVyIGZ1bmN0aW9uIGxpa2UKICAgICAgICAgIHRoaXMgaXMgZ2VuZXJhdGVkIDoKCiAgICAgICAgICAgICAgICBkb3VibGUgKkZvb19hX3NldChGb28gKmEsIGRvdWJsZSB2YWxbMjBdWzIwXSkgewogICAgICAgICAgICAgICAgICAgICAgICAgLi4uIG1lbWJlcmluIHR5cGVtYXAgaGVyZSAuLi4KICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoZG91YmxlICopIHZhbDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICBXaGVuIHdyaXRpbmcgdHlwZW1hcHMsIG9uZSBjYW4gYXNzdW1lIHRoYXQgdGhlIHNvdXJjZSB2YXJpYWJsZQogICAgICAgICAgaXMgYW4gYXJyYXkgb2YgdGhlICpzYW1lKiB0eXBlIGFzIHRoZSBzdHJ1Y3R1cmUgbWVtYmVyLiBUaGlzCiAgICAgICAgICBtYXkgYnJlYWsgc29tZSBjb2RlcyB0aGF0IG1hbmFnZWQgdG8gd29yayBhcm91bmQgdGhlIGFycmF5IGJ1Zy4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKNy8xMy85NyA6IEZpeGVkIGJ1ZyBpbiBQZXJsNSBtb2R1bGUgd2hlbiB1c2luZyBDIGdsb2JhbCB2YXJpYWJsZXMgdGhhdAogICAgICAgICAgYXJlIHBvaW50ZXJzLiAgV2hlbiB1c2VkIGluIGZ1bmN0aW9uIGNhbGxzIGFuZCBvdGhlciBvcGVyYXRpb25zLAogICAgICAgICAgdGhlIHZhbHVlIG9mIHRoZSBwb2ludGVyIHdvdWxkIGJlIGludmFsaWQtLS1jYXVzaW5nIGNvcmUKICAgICAgICAgIGR1bXBzIGFuZCBvdGhlciBwcm9ibGVtcy4gIFNXSUcgaW1wbGVtZW50cyBnbG9iYWwgdmFyaWFibGVzCiAgICAgICAgICB1c2luZyBQZXJsIG1hZ2ljIHZhcmlhYmxlcy4gIEFzIGl0IHR1cm5zIG91dCwgdGhlIGVycm9yCiAgICAgICAgICB3YXMgY2F1c2VkIGJ5IHRoZSBmYWN0IHRoYXQgdGhlIHBvaW50ZXItZXh0cmFjdGlvbiBjb2RlCiAgICAgICAgICB3YXMgc29tZWhvdyBieXBhc3NpbmcgdGhlIHByb2NlZHVyZSB1c2VkIHRvIHJlc29sdmUgbWFnaWNhbAogICAgICAgICAgdmFyaWFibGVzIChoZW5jZSwgbGVhdmluZyB0aGUgdmFsdWUgdW5kZWZpbmVkKS4gIFRvIGZpeAogICAgICAgICAgdGhlIHByb2JsZW0sIFNXSUcgbm93IGV4cGxpY2l0bHkgcmVzb2x2ZXMgbWFnaWMgYmVmb3JlCiAgICAgICAgICBleHRyYWN0aW5nIHBvaW50ZXIgdmFsdWVzLgoKNy8xMi85NyA6IEVsaW1pbmF0ZWQgdGhlIGxhc3QgcmVtbmFudHMgb2YgZnJlZSgpIGFuZCBtYWxsb2MoKSBmcm9tCiAgICAgICAgICB0aGUgU1dJRyBjb21waWxlci4KCjcvMTIvOTcgOiBGaXhlZCBwYXJzaW5nIHByb2JsZW1zIHdpdGggdHlwZW1hcHMgaW52b2x2aW5nIGFycmF5cyBhbmQKICAgICAgICAgIHRlbXBvcmFyeSB2YXJpYWJsZXMgb2YgYXJyYXlzLiAgICBBbHNvIG1hZGUgaXQgcG9zc2libGUgZm9yCiAgICAgICAgICBTV0lHIHRvIGhhbmRsZSB0eXBlbWFwcyBsaWtlIHRoaXMgOgoKICAgICAgICAgICAgICAgICAldHlwZW1hcChpbikgZG91YmxlIFtBTlldIChkb3VibGUgdGVtcFskZGltMF0pIHsKCQkgICAgICAuLi4gc3RvcmUgZGF0YSBpbiB0ZW1wWyRkaW0wXSAuLi4KICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgTm90IG9ubHkgZG9lcyB0aGlzIHR5cGVtYXAgbWF0Y2ggYW55IGRvdWJsZSBbXSBhcnJheSwgaXQKICAgICAgICAgIGNyZWF0ZXMgYSBsb2NhbCB2YXJpYWJsZSB3aXRoIHByZWNpc2VseSB0aGUgcmlnaHQgZGltZW5zaW9ucy4KICAgICAgICAgIChpZS4gJGRpbTAgZ2V0cyBmaWxsZWQgaW4gd2l0aCB0aGUgcmVhbCBudW1iZXIgb2YgZGltZW5zaW9ucykuCiAgICAgICAgICBPZiBjb3Vyc2UsIG9mZiB0aGUgcmVjb3JkLCB0aGlzIHdpbGwgYmUgYSB3YXkgdG8gYWRkIG1vcmUKICAgICAgICAgIGZ1bmN0aW9uYWxpdHkgdG8gdGhlIHR5cGVtYXBzLmkgbGlicmFyaWVzLgoKNy85Lzk3ICA6IEZpeGVkIHNvbWUgcHJvYmxlbXMgd2l0aCBQZXJsNSwgc3RhdGljIGxpbmtpbmcsIGFuZCBzaGFkb3cKICAgICAgICAgIGNsYXNzZXMuICBXaGVuIHN0YXRpY2FsbHkgbGlua2luZyBtdWx0aXBsZSBtb2R1bGVzIHRvZ2V0aGVyLCB3cml0ZQogICAgICAgICAgYSB0b3AtbGV2ZWwgaW50ZXJmYWNlIGZpbGUgbGlrZSB0aGlzIHdoZW4gc2hhZG93IGNsYXNzZXMgYXJlIG5vdAogICAgICAgICAgdXNlZCA6CgogICAgICAgICAgICAgICAgICVtb2R1bGUgc3dpZywgZm9vLCBiYXIsIGdsb2I7CiAgICAgICAgICAgICAgICAgJWluY2x1ZGUgcGVybG1haW4uaQoKICAgICAgICAgIFdoZW4gc2hhZG93IGNsYXNzZXMgYXJlIHVzZWQsIHRoZSBtb2R1bGUgbmFtZXMgaGF2ZSBhbiBleHRyYSAnYycKICAgICAgICAgIGFwcGVuZGVkIHNvIGl0IHNob3VsZCByZWFkIGFzIDoKCiAgICAgICAgICAgICAgICAgJW1vZHVsZSBzd2lnLCBmb29jLCBiYXJjLCBnbG9iYzsKICAgICAgICAgICAgICAgICAlaW5jbHVkZSBwZXJsbWFpbi5pCgogICAgICAgICAgV2hlbiBsaW5raW5nIG11bHRpcGxlIG1vZHVsZXMsIGNvbnNpZGVyIHVzaW5nIHRoZSBTV0lHIHJ1bnRpbWUKICAgICAgICAgIGxpYnJhcnkuCgo3LzgvOTcgIDogSW5jb3Jwb3JhdGVkIGZpeGVkIHZlcnNpb25zIG9mIHRoZSBCb3JsYW5kIEMrKyBNYWtlZmlsZXMuCgo3LzgvOTcgIDogRmlyc3QgY3V0IGF0IHRyeWluZyB0byBlbGltaW5hdGUgZXhjZXNzaXZlIGNvbXBpbGVyIHdhcm5pbmdzLgogICAgICAgICAgQXMgaXQgdHVybnMgb3V0LCBhbG90IG9mIHdhcm5pbmdzIGdvIGF3YXkgaWYgeW91IGp1c3QgbWFrZQogICAgICAgICAgZGVjbGFyYXRpb25zIGxpa2UgdGhpcwoKICAgICAgICAgICAgICAgICAgY2xpZW50RGF0YSA9IGNsaWVudERhdGE7CgogICAgICAgICAgaW4gdGhlIHJlc3VsdGluZyB3cmFwcGVyIGNvZGUuICBNb3N0IGNvbXBpbGVycyBzaG91bGQganVzdAogICAgICAgICAgaWdub3JlIHRoaXMgY29kZSAoYXQgbGVhc3Qgd291bGQgY2FuIGhvcGUpLgoKNy84Lzk3ICA6IEZpeGVkIGJpemFycmUgY29kZSBnZW5lcmF0aW9uIGJ1ZyB3aXRoIHR5cGVtYXBzIGFuZCBDKysgY2xhc3Nlcy4KICAgICAgICAgIEluIHNvbWUgY2FzZXMsIHR5cGVtYXBzIGNvbnRhaW5pbmcgcHJpbnRmIGZvcm1hdHRpbmcgc3RyaW5ncyBzdWNoIGFzCgogICAgICAgICAgICAgICAgICAldHlwZW1hcChtZW1iZXJvdXQpIGludCAqIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiJWQiLDQyKTsKICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgIFdvdWxkIGdlbmVyYXRlIGNvbXBsZXRlbHkgYm9ndXMgY29kZSB3aXRoIGdhcmJhZ2UgcmVwbGFjaW5nCiAgICAgICAgICB0aGUgJyVkJy4gICBDYXVzZWQgYnkgb25lIGZhdWx0eSB1c2Ugb2YgcHJpbnRmICh3YXNuJ3QgYWJsZSB0byBmaW5kCiAgICAgICAgICBhbnkgb3RoZXIgb2NjdXJlbmNlcykuCgo3LzcvOTcgIDogRml4ZWQgYnVnIGluIFB5dGhvbiBzaGFkb3cgY2xhc3MgZ2VuZXJhdGlvbiB3aXRoIG5vbi1tZW1iZXIKICAgICAgICAgIGZ1bmN0aW9ucyB0aGF0IGFyZSByZXR1cm5pbmcgbW9yZSB0aGFuIG9uZSB2YWx1ZS4KCjcvNy85NyAgOiBJbmNvcnBvcmF0ZWQgbW9kaWZpY2F0aW9ucyB0byBtYWtlIFNXSUcgd29yayB3aXRoIEd1aWxlIDEuMi4KICAgICAgICAgIFN0aWxsIG5lZWQgdG8gdGVzdCBpdCBvdXQsIGJ1dCBpdCBpcyBydW1vcmVkIHRvIHdvcmsuCgo3LzIvOTcgIDogRml4ZWQgc29tZSBidWdzIHJlbGF0ZWQgdG8gb3V0cHV0IGFyZ3VtZW50cyBhbmQgUHl0aG9uIHNoYWRvdwogICAgICAgICAgY2xhc3Nlcy4gICAgSWYgYW4gb3V0cHV0IGFyZ3VtZW50IGlzIGRldGVjdGVkLCBTV0lHIGFzc3VtZXMKICAgICAgICAgIHRoYXQgdGhlIHJlc3VsdCBpcyBhIGxpc3QgYW5kIGhhbmRsZXMgaXQgYXBwcm9wcmlhdGVseS4KICAgICAgICAgIElmIHRoZSBub3JtYWwgcmV0dXJuIHR5cGUgb2YgYW4gZnVuY3Rpb24gaXMgYW4gb2JqZWN0LAogICAgICAgICAgaXQgd2lsbCBiZSBjb252ZXJ0ZWQgaW50byBhIHNoYWRvdyBjbGFzcyBhcyBiZWZvcmUsIGJ1dAogICAgICAgICAgd2l0aCB0aGUgYXNzdW1wdGlvbiB0aGF0IGl0IGlzIHRoZSBmaXJzdCBlbGVtZW50IG9mIGEKICAgICAgICAgIGxpc3QuICAqKiogTk9URSA6IFRoaXMgYmVoYXZpb3IgaGFzIGJlZW4gc3Vic2VxdWVudGx5IGNoYW5nZWQgKioqCgo2LzI5Lzk3IDogQ2hhbmdlZCBFWFBPUlQgdG8gU1dJR0VYUE9SVCBpbiBhbGwgb2YgdGhlIGxhbmd1YWdlIG1vZHVsZXMuCiAgICAgICAgICBTaG91bGQgcHJvdmlkZSBiZXR0ZXIgY29tcGF0aWJpbGl0eSB3aXRoIFdpbmRvd3MuCgo2LzI5Lzk3IDogTW9kaWZpZWQgUHl0aG9uIHNoYWRvdyBjbGFzc2VzIHNvIHRoYXQgb3V0cHV0IGFyZ3VtZW50cwogICAgICAgICAgd29yayBjb3JyZWN0bHkgKHdoZW4gdHlwZW1hcHMgYXJlIHVzZWQpLgoKVmVyc2lvbiAxLjEgKEp1bmUgMjQsIDE5OTcpCj09PT09PT09PT09PT09PT09PT09PT09PT09PQoKNi8yNC85NyA6IEZpeGVkIE9iamVjdGl2ZS1DIGNvbnN0cnVjdG9yIGJ1ZyB3aGVuIHdvcmtpbmcgd2l0aCBQZXJsNQogICAgICAgICAgc2hhZG93IGNsYXNzZXMuCgo2LzIzLzk3IDogRml4ZWQgc29tZSBwYXJzaW5nIHByb2JsZW1zIHdpdGggT2JqZWN0aXZlLUMuICBEZWNsYXJhdGlvbnMKICAgICAgICAgIHN1Y2ggYXMgdGhlIGZvbGxvd2luZyBzaG91bGQgd29yayBub3cgOgoKICAgICAgICAgICAgICAgLSBmb28gOiAoaW50KSBhIHdpdGg6IChpbnQpIGI7Cgo2LzIyLzk3IDogQWRkZWQgU1dJRyBSdW50aW1lIGxpYnJhcnkuICAgVGhpcyBsaWJyYXJ5IGNvbnRhaW5zCiAgICAgICAgICB0aGUgU1dJRyBwb2ludGVyIHR5cGUtY2hlY2tlciBhbmQgc3VwcG9ydCBmdW5jdGlvbnMKICAgICAgICAgIHRoYXQgYXJlIG5vcm1hbGx5IGluY2x1ZGVkIGluIGV2ZXJ5IG1vZHVsZS4gIEJ5IHVzaW5nCiAgICAgICAgICB0aGUgbGlicmFyeSwgaXQgaXMgZWFzaWVyIHRvIHdvcmsgd2l0aCBtdWx0aXBsZSBTV0lHCiAgICAgICAgICBnZW5lcmF0ZWQgbW9kdWxlcy4KCjYvMjIvOTcgOiBGaXhlZCBtaW5vciBidWcgaW4gUGVybDUgbW9kdWxlIHJlbGF0ZWQgdG8gc3RhdGljIGxpbmtpbmcKICAgICAgICAgIG9mIG11bHRpcGxlIG1vZHVsZXMuCgo2LzIyLzk3IDogRml4ZWQgc29tZSBidWdzIHdpdGggdGhlICVpbXBvcnQgZGlyZWN0aXZlLiBXaGVuIHVzZWQgd2l0aAogICAgICAgICAgUGVybDUgc2hhZG93IGNsYXNzZXMsIHRoaXMgZ2VuZXJhdGVzIGEgJ3JlcXVpcmUnIHN0YXRlbWVudAogICAgICAgICAgdG8gbG9hZCBpbiBleHRlcm5hbCBtb2R1bGVzLgoKNi8yMi85NyA6IEFkZGVkIC1zd2lnbGliIG9wdGlvbi4gIFRoaXMgcHJpbnRzIG91dCB0aGUgbG9jYXRpb24gb2YgdGhlCiAgICAgICAgICBTV0lHIGxpYnJhcnkgYW5kIGV4aXRzLiAgVGhpcyBvcHRpb24gaXMgb25seSByZWFsbHkgdXNlZnVsIHRvCiAgICAgICAgICBjb25maWd1cmF0aW9uIHRvb2xzIHRoYXQgYXJlIGxvb2tpbmcgZm9yIFNXSUcgYW5kIGl0cyBsaWJyYXJ5CiAgICAgICAgICBsb2NhdGlvbiAoZS5nLiBhdXRvY29uZiwgY29uZmlndXJlLCBldGMuLi4pLgoKNi8yMS85NyA6IEZpeGVkIGV4cG9ydCBidWcgd2l0aCBQZXJsNS4wMDQgb24gV2luZG93cy1OVC4KCjYvMjAvOTcgOiBNaW5vciBjaGFuZ2UgdG8gY29kZSBnZW5lcmF0aW9uIG9mIGNsYXNzL3N0cnVjdHVyZSBtZW1iZXJzIGluCiAgICAgICAgICBvcmRlciB0byB3b3JrIGJldHRlciB3aXRoIHR5cGVtYXBzLiBTaG91bGQgaGF2ZSBubyBub3RpY2FibGUKICAgICAgICAgIGltcGFjdCBvbiBleGlzdGluZyBTV0lHIG1vZHVsZXMuCgo2LzE5Lzk3IDogQWRkZWQgLXQgb3B0aW9uLiBUaGlzIGFsbG93cyBTV0lHIHRvIGxvYWQgYSB0eXBlbWFwIGZpbGUgYmVmb3JlCiAgICAgICAgICBwcm9jZXNzaW5nIGFueSBkZWNsYXJhdGlvbnMuICBGb3IgZXhhbXBsZSA6CgogICAgICAgICAgICAgICAgIHN3aWcgLXQgdHlwZW1hcHMuaSAtcHl0aG9uIGV4YW1wbGUuaQoKICAgICAgICAgIEF0IG1vc3QsIG9ubHkgb25lIHR5cGVtYXAgZmlsZSBjYW4gYmUgc3BlY2lmaWVkIGluIHRoaXMgbWFubmVyLgogICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKNi8xOC85NyA6IE5lZWQgYSBNYWtlZmlsZSBmYXN0PyBUeXBlCgogICAgICAgICAgICAgICAgIHN3aWcgWy10Y2wsIC1wZXJsNSwgLXB5dGhvbl0gLWNvIE1ha2VmaWxlCgogICAgICAgICAgYW5kIHlvdSB3aWxsIGdldCBhIE1ha2VmaWxlIHNwZWNpZmljIHRvIHRoYXQgdGFyZ2V0IGxhbmd1YWdlLgogICAgICAgICAgWW91IGp1c3QgbmVlZCB0byBtb2RpZnkgaXQgZm9yIHlvdXIgYXBwbGljYXRpb24gYW5kIHlvdSdyZQogICAgICAgICAgcmVhZHkgdG8gcnVuLgoKNi8xOC85NyA6IENvbXBsZXRlZCB0aGUgLWNpIG9wdGlvbi4gIFRoaXMgb3B0aW9uIGNoZWNrcyBhIGZpbGUgaW50byB0aGUKICAgICAgICAgIFNXSUcgbGlicmFyeS4gICBJdCBzaG91bGQgYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIGEKICAgICAgICAgIGxhbmd1YWdlIG9wdGlvbi4gRm9yIGV4YW1wbGUgOgoKICAgICAgICAgICAgICAgICAgc3dpZyAtdGNsIC1jaSBmb29iYXIuaQoKICAgICAgICAgIENoZWNrcyB0aGUgZmlsZSBmb29iYXIuaSBpbnRvIHRoZSBUY2wgcGFydCBvZiB0aGUgbGlicmFyeS4KICAgICAgICAgIEluIG9yZGVyIHRvIGNoZWNrIGEgZmlsZSBpbnRvIHRoZSBnZW5lcmFsIGxpYnJhcnkgKGFjY2Vzc2libGUKICAgICAgICAgIHRvIGFsbCBsYW5ndWFnZXMgbW9kdWxlcyksIGRvIHRoZSBmb2xsb3dpbmcKCiAgICAgICAgICAgICAgICAgIHN3aWcgLWNpIC1vIC4uL2Zvb2Jhci5pIGZvb2Jhci5pCgogICAgICAgICAgKEFkbWl0dGVkbHkgdGhpcyBsb29rcyBhIGxpdHRsZSBzdHJhbmdlIGJ1dCBpcyB1bmF2b2lkYWJsZSkuCiAgICAgICAgICBUaGUgY2hlY2staW4gb3B0aW9uIGlzIHByaW1hcmlseSBkZXNpZ25lZCBmb3IgU1dJRyBtYWludGVuYW5jZQogICAgICAgICAgYW5kIGxpYnJhcnkgZGV2ZWxvcG1lbnQuIFRoZSBjb21tYW5kIHdpbGwgZmFpbCBpZiB0aGUgdXNlciBkb2VzCiAgICAgICAgICBub3QgaGF2ZSB3cml0ZSBwZXJtaXNzaW9uIHRvIHRoZSBTV0lHIGxpYnJhcnkuICBUaGlyZCBwYXJ0eSBsaWJyYXJ5CiAgICAgICAgICBleHRlbnNpb25zIGNhbiBlYXNpbHkgaW5zdGFsbCB0aGVtc2VsdmVzIGJ5IHNpbXBseSBwcm92aWRpbmcKICAgICAgICAgIGEgc2hlbGwgc2NyaXB0IHRoYXQgdXNlcyAnc3dpZyAtY2knIHRvIGluc3RhbGwgdGhlIGFwcHJvcHJpYXRlCiAgICAgICAgICBsaWJyYXJ5IGZpbGVzLiAgSXQgaXMgbm90IG5lY2Vzc2FyeSB0byBrbm93IHdoZXJlIHRoZSBTV0lHIGxpYnJhcnkKICAgICAgICAgIGlzIGxvY2F0ZWQgaWYgeW91IHVzZSB0aGlzIG1lY2hhbmlzbS4KICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjYvMTYvOTcgOiBGaXhlZCBhIGJ1ZyBpbiBzaGFkb3cgY2xhc3MgZ2VuZXJhdGlvbiB3aGVuICVuYW1lKCkgd2FzIGFwcGxpZWQKICAgICAgICAgIHRvIGEgY2xhc3MgZGVmaW5pdGlvbi4gICBVbmZvcnR1bmF0ZWx5LCBmaXhpbmcgdGhlIGJ1ZyByZXF1aXJlZAogICAgICAgICAgYSBjaGFuZ2UgaW4gdGhlIExhbmd1YWdlIEMgQVBJIGJ5IGFkZGluZyBhbiBleHRyYSBhcmd1bWVudCB0bwogICAgICAgICAgdGhlIExhbmd1YWdlOjpjcHBfY2xhc3NfZGVjbCgpIGZ1bmN0aW9uLiAgVGhpcyBtYXkgYnJlYWsKICAgICAgICAgIFNXSUcgQysrIGV4dGVuc2lvbnMuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjYvMTUvOTcgOiBBZGRlZCBhIHdhcm5pbmcgbWVzc2FnZSBpZiBubyBtb2R1bGUgbmFtZSBpcyBzcGVjaWZpZWQgd2l0aCB0aGUKICAgICAgICAgICVtb2R1bGUgZGlyZWN0aXZlIG9yIC1tb2R1bGUgb3B0aW9uLgoKNi8xNS85NyA6IEZpeGVkIGxpbmUgbnVtYmVyIGJ1ZyB3aGVuIHJlcG9ydGluZyBlcnJvcnMgZm9yIHVuZGVmaW5lZAogICAgICAgICAgYmFzZSBjbGFzc2VzLgoKNi8xNS85NyA6IEFkZGVkIG5ldyAlcmVuYW1lIGRpcmVjdGl2ZS4gIFRoaXMgYWxsb3dzIHRoZSBmb3J3YXJkIGRlY2xhcmF0aW9uCiAgICAgICAgICBvZiBhIHJlbmFtaW5nLiAgRm9yIGV4YW1wbGUgOgoKICAgICAgICAgICAgICAgICAlcmVuYW1lIE9sZE5hbWUgTmV3TmFtZTsKCiAgICAgICAgICAgICAgICAgLi4uLiBsYXRlciAuLi4KICAgICAgICAgICAgICAgICBpbnQgT2xkTmFtZShpbnQpOwoKICAgICAgICAgIFVubGlrZSAlbmFtZSwgJXJlbmFtZSB3aWxsIHJlbmFtZSBhbnkgb2NjdXJlbmNlIG9mIHRoZSBvbGQgbmFtZS4KICAgICAgICAgIFRoaXMgYXBwbGllcyB0byBmdW5jdGlvbnMsIHZhcmlhYmxlcywgY2xhc3MgbWVtYmVycyBhbmQgc28gZm9ydGguCiAgICAgICAgICBUaGVyZSBpcyBubyB3YXkgdG8gZGlzYWJsZSAlcmVuYW1lIG9uY2Ugc2V0LCBidXQgeW91IGNhbiBjaGFuZ2UgdGhlCiAgICAgICAgICBuYW1lIGJ5IHJlZGVjbGFyaW5nIGl0IHRvIHNvbWV0aGluZyBlbHNlLgogICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKNi8xNS85NyA6IEltcHJvdmVkIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgJW5hbWUgZGlyZWN0aXZlIHNvIHRoYXQgaXQKICAgICAgICAgIGNvdWxkIGJlIHVzZWQgd2l0aCBjb25kaXRpb25hbCBjb21waWxhdGlvbiA6CgogICAgICAgICAgICAgICAgICAgICNpZmRlZiBTV0lHCiAgICAgICAgICAgICAgICAgICAgJW5hbWUoTmV3TmFtZSkKICAgICAgICAgICAgICAgICAgICAjZW5kaWYKICAgICAgICAgICAgICAgICAgICBpbnQgT2xkTmFtZShpbnQpOwoKNi8xNS85NyA6IEFkZGVkIHN1cHBvcnQgZm9yIGZ1bmN0aW9ucyB3aXRoIG5vIHJldHVybiBkYXRhdHlwZS4gIEluIHRoaXMgY2FzZSwKICAgICAgICAgIFNXSUcgYXNzdW1lcyBhIHJldHVybiB0eXBlIG9mICdpbnQnLgoKNi8xMS85NyA6IEltcHJvdmVkIGVycm9yIHJlcG9ydGluZyBpbiB0aGUgcGFyc2VyLiAgSXQgc2hvdWxkIGJlIGEgbGl0dGxlCiAgICAgICAgICBsZXNzIHNlbnNpdGl2ZSB0byBlcnJvcnMgdGhhdCBvY2N1ciBpbnNpZGUgY2xhc3MgZGVmaW5pdGlvbnMKICAgICAgICAgIG5vdy4gIEFsc28gcmVwb3J0cyBlcnJvcnMgZm9yIGZ1bmN0aW9uIHBvaW50ZXJzLgoKNi8xMS85NyA6IE1hZGUgJyQnIGEgbGVnYWwgc3ltYm9sIGluIGlkZW50aWZpZXJzLiAgVGhpcyBpcyB0byBzdXBwb3J0CiAgICAgICAgICBzb21lIE9iamVjdGl2ZS1DIGxpYnJhcmllcy4gIFNvbWUgY29tcGlsZXJzIChzdWNoIGFzIGdjYykgbWF5IGFsc28KICAgICAgICAgIGFsbG93IGlkZW50aWZpZXJzIHRvIGNvbnRhaW4gYSAkIGluIEMvQysrIGNvZGUgYXMgd2VsbCAodGhpcyBpcwogICAgICAgICAgYW4gb2JzY3VyZSBmZWF0dXJlIG9mIEMpLiBXaGVuICckJyBhcHBlYXJzIGluIGlkZW50aWZpZXIsIFNXSUcKICAgICAgICAgIHJlbWFwcyBpdCB0byB0aGUgc3RyaW5nICdfU18nIHdoZW4gY3JlYXRpbmcgdGhlIHNjcmlwdGluZyBsYW5ndWFnZQogICAgICAgICAgZnVuY3Rpb24uIFRodXMgYSBmdW5jdGlvbiAnZm9vJGJhcicgd291bGQgYmUgY2FsbGVkICdmb29fU19iYXInLgoKNi8xMS85NyA6IEZpeGVkIGJ1ZyBpbiBQeXRob24gc2hhZG93IGNsYXNzZXMgd2l0aCBfX3JlcHJfXyBtZXRob2QuICBJZgogICAgICAgICAgc3VwcGxpZWQgYnkgdGhlIHVzZXIsIGl0IHdhcyBpZ25vcmVkLCBidXQgbm93IGl0IHNob3VsZCB3b3JrLgoKNi85Lzk3ICA6IEZpeGVkIHRoZSBUY2wgOC4wIG1vZHVsZSB0byB3b3JrIHdpdGggVGNsIDguMGIxLiAgIFNXSUcgaXMgbm8KICAgICAgICAgIGxvbmdlciBjb21wYXRpYmxlIHdpdGggKmFueSogYWxwaGEgcmVsZWFzZSBvZiBUY2wgOC4wLgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgo2LzcvOTcgIDogUHV0IGEgbWF4aW1hbCBlcnJvciBjb3VudCBpbiAoY3VycmVudGx5IHNldCB0byAyMCkuIFNXSUcgd2lsbCBiYWlsIG91dAogICAgICAgICAgaWYgaXQgZ2VuZXJhdGVzIG1vcmUgZXJyb3JzIHRoYW4gdGhpcyAodXNlZnVsIGZvciBwcmV2ZW50aW5nIFNXSUcKICAgICAgICAgIGZyb20gcHJpbnRpbmcgNDAwMCBzeW50YXggZXJyb3JzIHdoZW4gaXQgZ2V0cyBjb25mdXNlZCkuCgo2LzcvOTcgIDogRml4ZWQgc2VnbWVudGF0aW9uIGZhdWx0IHdoZW4gcGFyc2luZyB2YXJpYWJsZSBsZW5ndGggYXJndW1lbnRzLgoKNi83Lzk3ICA6IE1pbm9yIGNoYW5nZSB0byBQZXJsNSBtb2R1bGUuICBDKysgc3RhdGljIGZ1bmN0aW9ucyBhcmUgbm93CiAgICAgICAgICBwdXQgaW4gdGhlIHNhbWUgcGFja2FnZSBhcyB0aGVpciBjbGFzcyB3aGVuIHVzaW5nIHNoYWRvdyBjbGFzc2VzLgoKNi83Lzk3ICA6IENlbnRyYWxpemVkIHRoZSBuYW1pbmcgb2YgZnVuY3Rpb25zLCBtZW1iZXJzLCB3cmFwcGVycyBldGMuLi4gQnkKICAgICAgICAgIGNlbnRyYWxpemluZyB0aGUgbmFtaW5nIHNjaGVtZSwgaXQgc2hvdWxkIGJlIHBvc3NpYmxlIHRvIG1ha2UKICAgICAgICAgIHNvbWUgbXVsdGktZmlsZSBvcHRpbWl6YXRpb25zLiAgQWxzbywgaXQgc2hvdWxkIGJlIHBvc3NpYmxlIHRvCiAgICAgICAgICBjaGFuZ2UgU1dJRydzIG5hbWluZyBzY2hlbWUgKHBlcmhhcHMgYSBuZXcgZmVhdHVyZSB0byBiZSBhZGRlZAogICAgICAgICAgbGF0ZXIpLgoKNi8yLzk3ICA6IEFkZGVkICdhcmdpbml0JyB0eXBlbWFwLiAgIFRoaXMgY2FuIGJlIHVzZWQgdG8gYXNzaWduIGluaXRpYWwgdmFsdWVzCiAgICAgICAgICB0byBmdW5jdGlvbiBhcmd1bWVudHMuICBEb2luZyBzbyBtYWtlcyBpdCBzb21ld2hhdCBlYXNpZXIgdG8gZGV0ZWN0CiAgICAgICAgICBpbXByb3BlciBhcmd1bWVudCBwYXNzaW5nIHdoZW4gd29ya2luZyB3aXRoIG90aGVyIHR5cGVtYXBzLgoKNi8yLzk3ICA6IEZpeGVkIGNvZGUgZ2VuZXJhdGlvbiBidWcgd2hlbiByZWFkLW9ubHkgdmFyaWFibGVzIHdlcmUgaW5oZXJpdGVkCiAgICAgICAgICBpbnRvIG90aGVyIGNsYXNzZXMuICBVbmRlciBpbmhlcml0YW5jZSwgdGhlIHZhcmlhYmxlcyB3b3VsZAogICAgICAgICAgYmVjb21lIHdyaXRhYmxlLCBidXQgdGhpcyBoYXMgbm93IGJlZW4gY29ycmVjdGVkLgoKNS8zMC85NyA6IEFuIGVtcHR5ICVuYW1lKCkgZGlyZWN0aXZlIGlzIG5vIGxvbmdlciBhbGxvd2VkIG9yIHN1cHBvcnRlZC4KICAgICAgICAgIFRoaXMgZGlyZWN0aXZlIHdhcyBvcmlnaW5hbGx5IHVzZWQgdG8gc3RyaXAgdGhlIHByZWZpeAogICAgICAgICAgb2ZmIG9mIGEgY2xhc3Mgb3Igc3RydWN0dXJlLiAgVW5mb3J0dW5hdGVseSwgdGhpcyBuZXZlciByZWFsbHkKICAgICAgICAgIHNlZW1lZCB0byB3b3JrIHJpZ2h0IGFuZCBpdCBjb21wbGljYXRlZCB0aGUgQysrIGNvZGUgZ2VuZXJhdG9yCiAgICAgICAgICBzaWduaWZpY2FudGx5LiAgIEFzIGZhciBhcyBJIGNhbiB0ZWxsIG5vIG9uZSB1c2VzIGl0LCBzbyBpdAogICAgICAgICAgaXMgbm93IGhpc3RvcnkuICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjUvMjgvOTcgOiBGaXhlZCBhIHBhcnNpbmcgYnVnIHdpdGggI2RlZmluZSBhbmQgQysrIGNvbW1lbnRzLiAgRGVjbGFyYXRpb25zCiAgICAgICAgICBzdWNoIGFzIHRoZSBmb2xsb3dpbmcgbm93IHdvcmsgcHJvcGVybHkgOgoKICAgICAgICAgICAgICAgICAgICNkZWZpbmUgQ09OU1QgICA0ICAgICAvLyBBIENvbW1lbnQKCjUvMjgvOTcgOiBNYWRlIHNvbWUgcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnRzIHRvIHRoZSBTV0lHIFN0cmluZyBjbGFzcy4KICAgICAgICAgIChvbmx5IGFmZmVjdHMgdGhlIFNXSUcgY29tcGlsZXIgaXRzZWxmKS4KCjUvMjgvOTcgOiBNb2RpZmllZCB0aGUgcGFyc2VyIHRvIHNraXAgdGVtcGxhdGUgZGVmaW5pdGlvbnMgYW5kIGlzc3VlIGEKICAgICAgICAgIHdhcm5pbmcgbWVzc2FnZS4KCjUvMjgvOTcgOiBQcmVsaW1pbmFyeSBzdXBwb3J0IGZvciBwYXJhbWV0ZXJpemVkIHR5cGVzIGFkZGVkIChpZS4gdGVtcGxhdGVzKS4KICAgICAgICAgIFR5cGVzIHN1Y2ggYXMgdGhlIGZvbGxvd2luZyBzaG91bGQgcGFzcyB0aHJvdWdoIHRoZSBTV0lHIGNvbXBpbGVyCgogICAgICAgICAgICAgICAgICAgIHZvaWQgZm9vKHZlY3Rvcjxjb21wbGV4PiAqYSwgdmVjdG9yPGRvdWJsZT4gKmIpOwoKICAgICAgICAgIFdoZW4gdXNlZCwgdGhlIGVudGlyZSBuYW1lICd2ZWN0b3I8Y29tcGxleD4nIGJlY29tZXMgdGhlIG5hbWUKICAgICAgICAgIG9mIHRoZSBkYXRhdHlwZS4gICAgICBEdWUgdG8gc3BhY2UgbGltaXRhdGlvbnMgaW4gZGF0YXR5cGUKICAgICAgICAgIHJlcHJlc2VudGF0aW9ucywgdGhlIG5hbWUgc2hvdWxkIG5vdCBleGNlZWQgOTYgY2hhcmFjdGVycy4KCiAgICAgICAgICBOb3RlIDogVGhpcyBpcyBvbmx5IHBhcnQgb2Ygd2hhdCBpcyBuZWVkZWQgZm9yIHRlbXBsYXRlIHN1cHBvcnQuCiAgICAgICAgICBUZW1wbGF0ZSBjbGFzcyBkZWZpbml0aW9ucyBhcmUgbm90IHlldCBzdXBwb3J0ZWQgYnkgU1dJRy4KCiAgICAgICAgICBUaGUgdGVtcGxhdGUgbm90YXRpb24gYWJvdmUgbWF5IGFsc28gYmUgdXNlZCB3aGVuIHNwZWNpZnlpbmcKICAgICAgICAgIE9iamVjdGl2ZS1DIHByb3RvY29sIGxpc3RzLgogICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKNS8yNC85NyA6IEZpcnN0IGN1dCBhdCBPYmplY3RpdmUtQyBzdXBwb3J0IGFkZGVkLiAgIEFzIGl0IHR1cm5zIG91dCwgYWxtb3N0CiAgICAgICAgICBldmVyeXRoaW5nIGNhbiBiZSBoYW5kbGVkIHdpdGggb25seSBhIGZldyBtaW5vciBtb2RpZmljYXRpb25zIHRvCiAgICAgICAgICB0aGUgQysrIG1vZHVsZS4KICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjUvMjMvOTcgOiBGaXhlZCByZXBlYXRlZCBkZWZpbml0aW9uIGJ1ZyBpbiBtdWx0aXBsZSBpbmhlcml0YW5jZSBoYW5kbGluZwogICAgICAgICAgd2hlbiBtdWx0aXBsZSBiYXNlIGNsYXNzZXMgc2hhcmUgYSBjb21tb24gYmFzZSBjbGFzcyAoaWUuCiAgICAgICAgICB0aGUgZXZpbCBkaWFtb25kKS4KCjUvMjEvOTcgOiBGaXhlZCByYXRoZXIgZW1iYXJyYXNzaW5nIHR5cG8gdGhhdCB3b3JrZWQgaXRzIHdheSBpbnRvIHRoZQogICAgICAgICAgVGVzdHMvQnVpbGQgZGlyZWN0b3J5LgoKNS8xOS85NyA6IEZpeGVkIGNvZGUgZ2VuZXJhdGlvbiBidWcgd2hlbiB1c2luZyBuYXRpdmUgbWV0aG9kcyBhbmQKICAgICAgICAgIHNoYWRvdyBjbGFzc2VzIHdpdGggUHl0aG9uIGFuZCBQZXJsNSBtb2R1bGVzLgoKNS8xOS85NyA6IE1vZGlmaWVkIHRoZSAlYXBwbHkgZGlyZWN0aXZlIHNsaWdodGx5IHNvIHRoYXQgaXQgd291bGQgd29yawogICAgICAgICAgd2l0aCBwb2ludGVycyBhIGxpdHRsZSBiZXR0ZXIuIEZvciBleGFtcGxlIDoKCiAgICAgICAgICAgICAgICAgICVhcHBseSB1bnNpZ25lZCBsb25nIHsgRFdPUkQgfTsKCiAgICAgICAgICBBcHBsaWVzICphbGwqIHR5cGVtYXBzIGFzc29jaWF0ZWQgd2l0aCAidW5zaWduZWQgbG9uZyIgdG8KICAgICAgICAgICJEV09SRCIuICAgVGhpcyBub3cgaW5jbHVkZXMgcG9pbnRlcnMgdG8gdGhlIHR3byBkYXRhdHlwZXMuCiAgICAgICAgICBGb3IgZXhhbXBsZSwgYSB0eXBlbWFwIGFwcGxpZWQgdG8gInVuc2lnbmVkIGxvbmcgKioiIHdvdWxkCiAgICAgICAgICBhbHNvIGJlIGFwcGxpZWQgdG8gYW55IG9jY3VycmVuY2Ugb2YgIkRXT1JEICoqIiBhcyB3ZWxsLgoKNS8xOS85NyA6IEZpeGVkIGFuIG93bmVyc2hpcCBhc3NpZ25tZW50IGJ1ZyBpbiB0aGUgUGVybDUgbW9kdWxlIHdoZW4KICAgICAgICAgIGNsYXNzIG1lbWJlcnMgd2VyZSByZXR1cm5pbmcgbmV3IG9iamVjdHMgYmVsb25naW5nIHRvCiAgICAgICAgICBkaWZmZXJlbnQgY2xhc3Nlcy4KCjUvMTcvOTcgOiBBZGRlZCBhIGZldyBtb3JlIHR5cGVtYXAgdmFyaWFibGVzLgoKICAgICAgICAgICAgICAgICAgJG5hbWUgICAgICAgICAgLSBOYW1lIG9mIGZ1bmN0aW9uL3ZhcmlhYmxlL21lbWJlcgogICAgICAgICAgICAgICAgICAkYmFzZXR5cGUgICAgICAtIEJhc2UgZGF0YXR5cGUgKHR5cGUgd2l0aG91dCBwb2ludGVycykKICAgICAgICAgICAgICAgICAgJGFyZ251bSAgICAgICAgLSBBcmd1bWVudCBudW1iZXIKCjUvMTYvOTcgOiBGaXhlZCBlbWJhcnJhc3NpbmcgdW5kZXJzY29yZSBlcnJvciBpbiBsb2NhbCB2YXJpYWJsZQogICAgICAgICAgYWxsb2NhdG9yLgoKNS8xNi85NyA6IEZpeGVkIG5hbWVzcGFjZSBjbGFzaCBidWcgaW4gcGFyYW1ldGVyaXplZCB0eXBlbWFwcwogICAgICAgICAgd2hlbiBjcmVhdGluZyBhcnJheXMgYXMgbmV3IGxvY2FsIHZhcmlhYmxlcy4KCjUvMTUvOTcgOiBGaXhlZCBzb21lIGJ1Z3Mgd2l0aCBpbmhlcml0YW5jZSBvZiBhZGRlZCBtZXRob2RzIGFjcm9zcwogICAgICAgICAgbXVsdGlwbGUgZmlsZXMuICAgU1dJRyBub3cgdXNlcyBuYW1lcyBvZiBiYXNlIGNsYXNzZXMKICAgICAgICAgIHdoZW4gZ2VuZXJhdGluZyBzdWNoIGZ1bmN0aW9ucy4KCjUvMTQvOTcgOiBGaW5pc2hlZCBzdXBwb3J0IGZvciBkZWZhdWx0IHR5cGVtYXBzLiAgUHJpbWFyaWx5IHVzZWQKICAgICAgICAgIGludGVybmFsbHksIHRoZXkgY2FuIGJlIHVzZWQgdG8gbWF0Y2ggdGhlIGJhc2ljCiAgICAgICAgICBidWlsdC1pbiBkYXRhdHlwZXMgdXNlZCBpbnNpZGUgb2YgU1dJRy4gICBZb3UgY2FuCiAgICAgICAgICBzcGVjaWZ5IHRoZW0gaW4gaW50ZXJmYWNlIGZpbGVzIGFzIHdlbGwgbGlrZSB0aGlzIDoKCiAgICAgICAgICAgICAgICV0eXBlbWFwKHRjbCxpbikgaW50IFNXSUdfREVGQVVMVF9UWVBFIHsKICAgICAgICAgICAgICAgICAgICAgICAgJHRhcmdldCA9IGF0b2koJHRhcmdldCk7CiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICBVbmxpa2Ugbm9ybWFsIHR5cGVtYXBzLCB0aGlzIGRlZmF1bHQgbWFwIHdpbGwgZ2V0IGFwcGxpZWQKICAgICAgICAgIHRvICphbGwqIGludGVnZXIgZGF0YXR5cGVzIGVuY291bnRlcmVkLCBpbmNsdWRpbmcgdGhvc2UKICAgICAgICAgIHJlbmFtZWQgd2l0aCB0eXBlZGVmLCBldGMuLi4KCjUvMTMvOTcgOiBGaXhlZCBzdWJzdHJpbmcgYnVnIGluIHR5cGUgY2hlY2tlci4KCjUvMTIvOTcgOiBGaXhlZCBidWcgaW4gcGFyYW1ldGVyaXplZCB0eXBlbWFwcyB3aGVuIGRlY2xhcmluZyBsb2NhbAogICAgICAgICAgdmFyaWFibGVzIG9mIHN0cnVjdHVyZXMuCgpWZXJzaW9uIDEuMSBCZXRhNiAoTWF5IDksIDE5OTcpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjUvOS85NyAgOiBGaXhlZCBiaXphcnJlIE5VTEwgcG9pbnRlciBoYW5kbGluZyBidWcgaW4gUGVybDUgbW9kdWxlLgoKNS84Lzk3ICA6IEZpeGVkIG15c3RlcmlvdXMgc2VnbWVudGF0aW9uIGZhdWx0IHdoZW4gcnVubmluZyBTV0lHIG9uIGFuCiAgICAgICAgICBlbXB0eSBmaWxlLgoKNS83Lzk3ICA6IFRoZSBjb2RlIGdlbmVyYXRvciB3aWxsIG5vdyByZXBsYWNlIHRoZSBzcGVjaWFsIHN5bWJvbCAiJGNsZWFudXAiCiAgICAgICAgICB3aXRoIHRoZSBjbGVhbnVwIGNvZGUgc3BlY2lmaWVkIHdpdGggdGhlICJmcmVlYXJnIiB0eXBlbWFwLgogICAgICAgICAgVGhpcyBjaGFuZ2UgbmVlZGVkIHRvIHByb3Blcmx5IG1hbmFnZSBtZW1vcnkgYW5kIGV4Y2VwdGlvbnMuCgo1LzUvOTcgIDogQWRkZWQgdGhlICd0eXBlbWFwcy5pJyBsaWJyYXJ5IGZpbGUuICBUaGlzIGNvbnRhaW5zIGEKICAgICAgICAgIHZhcmlldHkgb2YgY29tbW9uIHR5cGVtYXBzIGZvciBpbnB1dCB2YWx1ZXMsIHBvaW50ZXJzLAogICAgICAgICAgYW5kIHNvIG9uLgoKNS81Lzk3ICA6IENoYW5nZWQgYmVoYXZpb3Igb2YgImFyZ291dCIgdHlwZW1hcCBpbiBQeXRob24gbW9kdWxlLgogICAgICAgICAgT2xkIHZlcnNpb25zIGF1dG9tYXRpY2FsbHkgdHVybmVkIHRoZSByZXN1bHQgaW50byBhCiAgICAgICAgICBQeXRob24gbGlzdC4gIFRoZSBuZXcgdmVyc2lvbiBkb2VzIG5vdGhpbmcsIGxlYXZpbmcgdGhlCiAgICAgICAgICBpbXBsZW1lbnRhdGlvbiB1cCB0byB0aGUgdXNlci4gIFRoaXMgcHJvdmlkZXMgbW9yZSBmbGV4aWJpbGl0eQogICAgICAgICAgYnV0IG1heSBicmVhayBvbGRlciBjb2RlcyB0aGF0IHJlbHkgb24gdHlwZW1hcHMuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjUvNS85NyAgOiBGaXhlZCBidWcgaW4gUHl0aG9uIG1vZHVsZSByZWxhdGVkIHRvIHRoZSBpbnRlcmFjdGlvbiBvZgogICAgICAgICAgImFyZ291dCIgYW5kICJpZ25vcmUiIHR5cGVtYXBzLgoKNS81Lzk3ICA6IEZpeGVkIGJ1ZyBpbiBQeXRob24gbW9kdWxlIHRoYXQgd291bGQgZ2VuZXJhdGUgaW5jb3JyZWN0IGNvZGUKICAgICAgICAgIGlmIGFsbCBmdW5jdGlvbiBhcmd1bWVudHMgYXJlICJpZ25vcmVkIi4KCjUvNC85NyAgOiBBZGRlZCAlYXBwbHkgYW5kICVjbGVhciBkaXJlY3RpdmVzLiAgIFRoZXNlIGZvcm0gYSBoaWdoZXIgbGV2ZWwKICAgICAgICAgIGludGVyZmFjZSB0byB0aGUgdHlwZW1hcCBtZWNoYW5pc20uICBJbiBhIG51dHNoZWxsLCB0aGV5CiAgICAgICAgICBjYW4gYmUgdXNlZCB0byBjaGFuZ2UgdGhlIHByb2Nlc3Npbmcgb2YgdmFyaW91cyBkYXRhdHlwZXMgd2l0aG91dAogICAgICAgICAgZXZlciBoYXZpbmcgdG8gd3JpdGUgYSB0eXBlbWFwLiAgU2VlIHRoZSBTV0lHIGRvY3VtZW50YXRpb24KICAgICAgICAgIGZvciBtb3JlIGRldGFpbHMuICAqKiBORVcgRkVBVFVSRSAqKgoKNS80Lzk3ICA6IEFkZGVkIGEgbG9jYWwgdmFyaWFibGUgZXh0ZW5zaW9uIHRvIHRoZSB0eXBlbWFwIGhhbmRsZXIuCiAgICAgICAgICBGb3IgZXhhbXBsZSA6CgogICAgICAgICAgICAgICAgICV0eXBlbWFwKHRjbCxpbikgZG91YmxlICooZG91YmxlIHRlbXApIHsKCQkgICAgICAgIHRlbXAgPSBhdG9mKCRzb3VyY2UpOwogICAgICAgICAgICAgICAgICAgICAgICAkdGFyZ2V0ID0gJnRlbXA7CiAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgIEluIHRoaXMgY2FzZSwgJ3RlbXAnIGlzIGEgbG9jYWwgdmFyaWFibGUgdGhhdCBleGlzdHMKICAgICAgICAgIGluIHRoZSBlbnRpcmUgd3JhcHBlciBmdW5jdGlvbiAobm90IGp1c3QgdGhlIHR5cGVtYXAKICAgICAgICAgIGNvZGUpLiAgVGhpcyBtZWNoYW5pc20gcHJvdmlkZXMgYmV0dGVyIHN1cHBvcnQgZm9yCiAgICAgICAgICBjZXJ0YWluIHR5cGVzIG9mIGFyZ3VtZW50IGhhbmRsaW5nIGFuZCBhbHNvIG1ha2VzIGl0CiAgICAgICAgICBwb3NzaWJsZSB0byB3cml0ZSB0aHJlYWQtc2FmZSB0eXBlbWFwcy4gIEFueSBudW1iZXIKICAgICAgICAgIGxvY2FsIHZhcmlhYmxlcyBjYW4gYmUgZGVjbGFyZWQgYnkgc3VwcGx5aW5nIGEgY29tbWEKICAgICAgICAgIHNlcGFyYXRlZCBsaXN0LiAgIExvY2FsIHZhcmlhYmxlcyBhcmUgZ3VhcmFudGVlZCB0byBiZQogICAgICAgICAgdW5pcXVlLCBldmVuIGlmIHRoZSBzYW1lIHR5cGVtYXAgaXMgYXBwbGllZCBtYW55IHRpbWVzCiAgICAgICAgICBpbiBhIGdpdmVuIGZ1bmN0aW9uLgogICAgICAgICAgKiogTm90IGN1cnJlbnRseSBzdXBwb3J0ZWQgaW4gUGVybDQgb3IgR3VpbGUgbW9kdWxlcy4KCjUvMi85NyAgOiBGaXhlZCBwcm9jZXNzaW5nIG9mICVpZmRlZiwgJWVuZGlmLCAlaWYsIGV0Yy4uLiAgKFRoZXNlIGFyZQogICAgICAgICAgU1dJRyBlcXVpdmFsZW50cyBvZiB0aGUgQyBwcmVwcm9jZXNzb3IgZGlyZWN0aXZlcyB0aGF0CiAgICAgICAgICBjYW4gcGFzcyB0aHJvdWdoIHRoZSBDIHByZXByb2Nlc3NvciB3aXRob3V0IG1vZGlmaWNhdGlvbikuCgo1LzIvOTcgIDogRml4ZWQgbWFqb3IgKGJ1dCBzdWJ0bGUpIGJ1ZyBpbiB0aGUgcnVuLXRpbWUgdHlwZSBjaGVja2VyCiAgICAgICAgICByZWxhdGVkIHRvIHNlYXJjaGluZyBhbmQgdHlwZS1jaGVja2luZyBmb3IgQysrIGluaGVyaXRhbmNlLgogICAgICAgICAgVG8gbWFrZSBhIGxvbmcgc3Rvcnkgc2hvcnQsIGlmIHlvdSBoYWQgdHdvIGNsYXNzZXMgbmFtZWQKICAgICAgICAgICJGb28iIGFuZCAiRm9vT2JqZWN0IiB0aGUgdHlwZSBjaGVja2VyIHdvdWxkIHNvbWV0aW1lcwogICAgICAgICAgZ2V0IGNvbmZ1c2VkIGFuZCBiZSB1bmFibGUgdG8gbG9jYXRlICJGb28iIGluIGFuIGludGVybmFsCiAgICAgICAgICB0YWJsZS4KCjUvMi85NyAgOiBGaXhlZCBzb21lIGJ1Z3MgaW4gdGhlIC1jbyBvcHRpb24uCgo0LzI0Lzk3IDogUG9pbnRlciBsaWJyYXJ5IGFkZGVkIHRvIHRoZSBTV0lHIGxpYnJhcnkuCgo0LzE5Lzk3IDogQWRkZWQgdGhlICVuZXcgZGlyZWN0aXZlLiAgIFRoaXMgaXMgYSAiaGludCIgdGhhdCBjYW4gYmUgdXNlZAogICAgICAgICAgdG8gdGVsbCBTV0lHIHRoYXQgYSBmdW5jdGlvbiBpcyByZXR1cm5pbmcgYSBuZXcgb2JqZWN0LiBGb3IKICAgICAgICAgIGV4YW1wbGUgOgoKICAgICAgICAgICAgICAgICAgJW5ldyBGb28gKmNyZWF0ZV9mb28oKTsKCiAgICAgICAgICBUaGlzIHRlbGxzIFNXSUcgdGhhdCBjcmVhdGVfZm9vKCkgaXMgY3JlYXRpbmcgYSBuZXcgb2JqZWN0CiAgICAgICAgICBhbmQgcmV0dXJuaW5nIGEgcG9pbnRlciB0byBpdC4gICBNYW55IGxhbmd1YWdlIG1vZHVsZXMgbWF5CiAgICAgICAgICBjaG9vc2UgdG8gaWdub3JlIHRoZSBoaW50LCBidXQgd2hlbiB3b3JraW5nIHdpdGggc2hhZG93IGNsYXNzZXMsCiAgICAgICAgICB0aGUgJW5ldyBpcyB1c2VkIHRvIGhhbmRsZSBwcm9wZXIgb3duZXJzaGlwIG9mIG9iamVjdHMuCgogICAgICAgICAgJW5ldyBjYW4gYWxzbyBiZSB1c2VkIHdpdGggZHluYW1pY2FsbHkgYWxsb2NhdGVkIHN0cmluZ3MuCiAgICAgICAgICBGb3IgZXhhbXBsZSA6CgogICAgICAgICAgICAgICAgICAlbmV3IGNoYXIgKmNyZWF0ZV9zdHJpbmcoKTsKCiAgICAgICAgICBXaGVuIHVzZWQsIGFsbCBvZiB0aGUgbGFuZ3VhZ2UgbW9kdWxlcyB3aWxsIGF1dG9tYXRpY2FsbHkgY2xlYW51cAogICAgICAgICAgdGhlIHJldHVybmVkIHN0cmluZy0tZWxpbWluYXRpbmcgbWVtb3J5IGxlYWtzLgogICAgICAgICAgKiogTkVXIEZFQVRVUkUgKioKCjQvMTkvOTcgOiBBZGRlZCBhIG5ldyB0eXBlbWFwICJuZXdmcmVlIi4gICBUaGlzIGlzIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aAogICAgICAgICAgdGhlICVuZXcgZGlyZWN0aXZlIGFuZCBjYW4gYmUgdXNlZCB0byBjaGFuZ2UgdGhlIG1ldGhvZCBieSB3aGljaAogICAgICAgICAgYSBuZXcgb2JqZWN0IHJldHVybmVkIGJ5IGEgZnVuY3Rpb24gaXMgZGVsZXRlZC4KCjQvMTkvOTcgOiBUaGUgc3ltYm9sICJfX2NwbHVzcGx1cyIgaXMgbm93IGRlZmluZWQgaW4gdGhlIFNXSUcgaW50ZXJwcmV0ZXIKICAgICAgICAgIHdoZW4gcnVubmluZyB3aXRoIHRoZSAtYysrIG9wdGlvbi4KCjQvMTcvOTcgOiBBZGRlZCBzdXBwb3J0IGZvciBzdGF0aWMgbWVtYmVyIGZ1bmN0aW9ucyB3aGVuIHVzZWQgaW5zaWRlIHRoZQogICAgICAgICAgJWFkZG1ldGhvZHMgZGlyZWN0aXZlLgoKNC8xNS85NyA6IEFkZGVkIGEgc3BlY2lhbCB0eXBlbWFwIHN5bWJvbCBQUkVWSU9VUyB0aGF0IGNhbiBiZSB1c2VkIHRvCiAgICAgICAgICByZXN0b3JlIGEgcHJldmlvdXMgdHlwZW1hcC4gRm9yIGV4YW1wbGUgOgoKCSAgICAgICAgICV0eXBlbWFwKHRjbCxpbikgaW50ICogPSBQUkVWSU9VUzsKCiAgICAgICAgICBUaGlzIGlzIHByaW1hcmlseSB1c2VkIGluIGxpYnJhcnkgZmlsZXMuCgo0LzEzLzk3IDogQWRkZWQgJXByYWdtYSBkaXJlY3RpdmUgZm9yIFBlcmw1IG1vZHVsZS4gICBUd28gbmV3IHByYWdtYXMgYXJlCiAgICAgICAgICBhdmFpbGFibGUgOgoKICAgICAgICAgICAgICAgICAlcHJhZ21hKHBlcmw1KSBjb2RlID0gInN0cmluZyIKICAgICAgICAgICAgICAgICAlcHJhZ21hKHBlcmw1KSBpbmNsdWRlID0gImZpbGUucGwiCgogICAgICAgICAgQm90aCBpbnNlcnQgY29kZSBpbnRvIHRoZSAucG0gZmlsZSBjcmVhdGVkIGJ5IFNXSUcuICBUaGlzIGNhbgogICAgICAgICAgYmUgdXNlZCB0byBhdXRvbWF0aWNhbGx5IGN1c3RvbWl6ZSB0aGUgLnBtIGZpbGUgY3JlYXRlZCBieSBTV0lHLgoKNC8xMy85NyA6IFNjYW5uZXIgbW9kaWZpZWQgdG8gb25seSByZWNvZ25pemUgQysrIGtleXdvcmRzIHdoZW4gdGhlIC1jKysKICAgICAgICAgIG9wdGlvbiBoYXMgYmVlbiBzcGVjaWZpZWQuICBUaGlzIHByb3ZpZGVzIHN1cHBvcnQgZm9yIEMgcHJvZ3JhbXMKICAgICAgICAgIHRoYXQgbWFrZSB1c2Ugb2YgdGhlc2Uga2V5d29yZHMgZm9yIGlkZW50aWZpZXJzLgogICAgICAgICAgU1dJRyBtYXkgbmVlZCB0byBiZSBleHBsaWNpdGx5IHJ1biB3aXRoIHRoZSAtYysrIG9wdGlvbiB3aGVuCiAgICAgICAgICBjb21waWxpbmcgQysrIGNvZGUgKHRoaXMgd2FzIGFsbG93ZWQsIGJ1dCBub3QgcmVjb21tZW5kZWQgaW4KICAgICAgICAgIHByZXZpb3VzIHZlcnNpb25zKS4gKipQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZKioKCjQvMTEvOTcgOiBGaXhlZCBhIHJhdGhlciBuYXN0eSBidWcgaW4gdGhlIFBlcmw1IG1vZHVsZSByZWxhdGVkIHRvIHVzaW5nCiAgICAgICAgICB2YXJpYWJsZSBsaW5raW5nIHdpdGggY29tcGxleCBkYXRhdHlwZXMgYW5kIHBvaW50ZXJzLiAgIE9uIFVuaXgsCiAgICAgICAgICBjb2RlIHdvdWxkIHdvcmsgKHNvbWVob3cpLCBidXQgd291bGQgY2F1c2UgYW4gYWNjZXNzIHZpb2xhdGlvbgogICAgICAgICAgdW5kZXIgV2luZG93cy1OVC4gIFRoZSBmaXggc2hvdWxkIGNvcnJlY3QgdGhlIHByb2JsZW0sCiAgICAgICAgICBidXQgdGhlcmUgbWF5IHN0aWxsIGJlIGEgcHJvYmxlbSB1c2luZyBnbG9iYWwgdmFyaWFibGVzIG9mCiAgICAgICAgICBjb21wbGV4IGRhdGF0eXBlcyBpbiBjb25qdW5jdGlvbiB3aXRoIHNoYWRvdyBjbGFzc2VzLiAgRm9ydHVuYXRlbHksCiAgICAgICAgICB0aGlzIHNvcnQgb2YgdGhpbmcgc2VlbXMgdG8gYmUgcmVsYXRpdmVseSByYXJlIChjb25zaWRlcmluZwogICAgICAgICAgdGhhdCB0aGUgYnVnIGhhcyBiZWVuIGFyb3VuZCBmb3IgbW9yZSB0aGFuIGEgeWVhciAtIHlpa2VzISkuCgo0LzExLzk3IDogRml4ZWQgYml6YXJyZSBjb25zdGFudCBldmFsdWF0aW9uIGJ1ZyBpbiBQZXJsNSBjb2RlIGdlbmVyYXRpb24KICAgICAgICAgIHdoZW4gcnVubmluZyB1bmRlciBXaW5kb3dzLU5ULgoKNC84Lzk3ICA6IEJ1ZyB3aGVuIHVzaW5nIGRlZmF1bHQgYXJndW1lbnRzIGFuZCBDKysgcmVmZXJlbmNlcyBmaXhlZC4KCjQvOC85NyAgOiBGaXhlZCBjb2RlIGdlbmVyYXRpb24gYnVncyBpbiBQeXRob24gYW5kIFBlcmw1IG1vZHVsZXMgcmVsYXRlZCB0bwogICAgICAgICAgdXNpbmcgY2xhc3MgcmVuYW1pbmcgKGFwcGx5aW5nIHRoZSAlbmFtZSBkaXJlY3RpdmUgdG8gYSBjbGFzcwogICAgICAgICAgZGVmaW5pdGlvbikgYW5kIHNoYWRvdyBjbGFzc2VzLgoKNC83Lzk3ICA6IEZpeGVkIG1pbm9yIGJ1Z3MgaW4gc3dpZ3B0ci5zd2csIHRjbDhwdHIuc3dnLCBhbmQgcGVybDVwdHIuc3dnIHRvCiAgICAgICAgICBwcmV2ZW50IGluZmluaXRlIGxvb3BzIHdoZW4gd2VpcmQgZGF0YXR5cGVzIGFyZSBwYXNzZWQuCgozLzI5Lzk3IDogJ01ha2VmaWxlLndpbicgYWRkZWQuICAgVGhpcyBpcyB1c2VkIHRvIGJ1aWxkIG1vc3Qgb2YgdGhlIGV4YW1wbGVzCiAgICAgICAgICBpbiB0aGUgRXhhbXBsZXMgZGlyZWN0b3J5IHVuZGVyIFdpbmRvd3MgTlQvOTUuCgozLzI3Lzk3IDogRml4ZXMgdG8gU1dJRydzIGVycm9yIHJldHVybiBjb2Rlcy4gICBTV0lHIG5vdyByZXR1cm5zIG5vbi16ZXJvCiAgICAgICAgICBleGl0IGNvZGVzIGZvciBjZXJ0YWluIGtpbmRzIG9mIGVycm9ycyAod2hpY2ggbWFrZXMgaXQgbW9yZQogICAgICAgICAgZnJpZW5kbHkgdG8gbWFrZWZpbGVzKS4gICAgIEFuIG92ZXJoYXVsIG9mIHRoZSBlcnJvciBoYW5kbGluZwogICAgICAgICAgaXMgb24gdGhlIHRvLWRvIGxpc3QgYW5kIHdpbGwgcHJvYmFibHkgc2hvdyB1cCBpbiBhIGxhdGVyIHJlbGVhc2UuCgozLzI1Lzk3IDogQnVnIGZpeC4gICJmcmVlYXJnIiBhbmQgImFyZ291dCIgdHlwZW1hcHMgaGF2ZSBiZWVuIGZpeGVkIGluCiAgICAgICAgICB0aGUgUGVybDUgbW9kdWxlLiAgSW4gcHJldmlvdXMgdmVyc2lvbnMsIGZ1bmN0aW9uIGlucHV0IHBhcmFtZXRlcnMKICAgICAgICAgIGFuZCBmdW5jdGlvbiBvdXRwdXQgcGFyYW1ldGVycyBzaGFyZWQgdGhlIHNhbWUgbWVtb3J5IHNwYWNlLS1jYXVzaW5nCiAgICAgICAgICBhbGwgc29ydHMgb2YgbmFzdHkgcHJvYmxlbXMgd2hlbiB0cnlpbmcgdG8gcGFzcyBwZXJsIHZhbHVlcyBieQogICAgICAgICAgcmVmZXJlbmNlLiAgIFNXSUcgbm93IGludGVybmFsbHkgbWFrZXMgYSAiY29weSIgKHdoaWNoIGlzIHJlYWxseQogICAgICAgICAganVzdCBhIHBvaW50ZXIpIG9mIGFmZmVjdGVkIHBhcmFtZXRlcnMgYW5kIHVzZXMgdGhhdC4gICBUaGlzCiAgICAgICAgICBpcyBkb25lIHRyYW5zcGFyZW50bHkgc28gdGhlcmUgaXMgbm8gbm90aWNhYmxlIGltcGFjdCBvbiBhbnkKICAgICAgICAgIFNXSUcgZ2VuZXJhdGVkIG1vZHVsZXMuICAgVGhpcyBjaGFuZ2UgaXMgcHJvYmFibHkgb25seSBub3RpY2FibGUKICAgICAgICAgIHRvIGV4cGVydCB1c2Vycy4KCjMvMjUvOTcgOiBBZGRlZCB0eXBlLWNoZWNrIHRvIHZlcmJvc2UgYW5kIHN0YXQgbW9kZS4gIFNXSUcgd2lsbCBub3cgZ2VuZXJhdGUgYSBsaXN0CiAgICAgICAgICBvZiBhbGwgZGF0YXR5cGVzIHRoYXQgd2VyZSB1c2VkIGJ1dCB1bmRlZmluZWQgKHVzZWZ1bCBmb3IgdHJhY2tpbmcKICAgICAgICAgIGRvd24gd2VpcmQgYnVncykuICAgVGhpcyBpcyBlbmFibGVkIHdpdGggdGhlIC12IG9wdGlvbiAod2hpY2gKICAgICAgICAgIGlzIG5vdyBvZmZpY2lhbGx5IGtub3duIGFzICJvdmVybHkgdmVyYm9zZSIgbW9kZSkgb3IgdGhlIC1zdGF0IG9wdGlvbi4KCjMvMjUvOTcgOiBTbGlnaHQgY2hhbmdlIHRvIHRoZSBwYXJzZXIgdG8gbWFrZSBpbmNsdWRlIGd1YXJkcyB3b3JrIGNvcnJlY3RseS4KICAgICAgICAgIEZvciBleGFtcGxlIDoKCiAgICAgICAgICAgICAgICAjaWZuZGVmIElOVEVSRkFDRV9JCiAgICAgICAgICAgICAgICAjZGVmaW5lIElOVEVSRkFDRV9JCiAgICAgICAgICAgICAgICAlbW9kdWxlIGZvb2Jhci5pCiAgICAgICAgICAgICAgICAuLi4gZGVjbGFyYXRpb25zIC4uLgogICAgICAgICAgICAgICAgI2VuZGlmCgozLzI0Lzk3IDogJWNoZWNrb3V0IGRpcmVjdGl2ZSBhZGRlZC4gICBUaGlzIGFsbG93cyBhbiBpbnRlcmZhY2UgZmlsZSB0bwogICAgICAgICAgZXh0cmFjdCBmaWxlcyBmcm9tIHRoZSBTV0lHIGxpYnJhcnkgYW5kIHBsYWNlIHRoZW0gaW4gdGhlCiAgICAgICAgICBjdXJyZW50IGRpcmVjdG9yeS4gICBUaGlzIGNhbiBiZSB1c2VkIHRvIGV4dHJhY3Qgc2NyaXB0cyBhbmQKICAgICAgICAgIG90aGVyIGhlbHBlciBjb2RlIHRoYXQgbWlnaHQgYmUgYXNzb2NpYXRlZCB3aXRoIGxpYnJhcnkgZmlsZXMuCiAgICAgICAgICBGb3IgZXhhbXBsZSA6CgogICAgICAgICAgICAgICAgJWNoZWNrb3V0IGFycmF5LnRjbAoKICAgICAgICAgIFdpbGwgbG9vayBmb3IgYSBmaWxlICJhcnJheS50Y2wiIGluIHRoZSBsaWJyYXJ5IGFuZCBjb3B5IGl0CiAgICAgICAgICB0byB0aGUgY3VycmVudCBkaXJlY3RvcnkuICAgIElmIHRoZSBmaWxlIGFscmVhZHkgZXhpc3RzIGluIHRoZQogICAgICAgICAgZGlyZWN0b3J5LCB0aGlzIGRpcmVjdGl2ZSBkb2VzIG5vdGhpbmcgKGl0IHdpbGwgbm90IG92ZXJ3cml0ZSBhbgogICAgICAgICAgZXhpc3RpbmcgZmlsZSkuICBUaGlzIG9ubHkgYW4gZXhwZXJpbWVudGFsIGZlYXR1cmUgZm9yIG5vdy4KCjMvMjQvOTcgOiBTV0lHIHdpbGwgbm93IGxvb2sgaW4gdGhlIFNXSUcgTGlicmFyeSBmb3IgYSBmaWxlIGlmIGl0IGNhbid0CiAgICAgICAgICBmaW5kIGl0IGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4gIEFzIGEgcmVzdWx0LCBpdCBpcyBlYXN5IHRvCiAgICAgICAgICBtYWtlIG1vZHVsZXMgZnJvbSBTV0lHIGxpYnJhcnkgZmlsZXMuICBGb3IgZXhhbXBsZSwgaWYgeW91CiAgICAgICAgICB3YW50IHRvIG1ha2UgYSBQeXRob24gbW9kdWxlIGZyb20gdGhlIFNXSUcgdGltZXJzIGxpYnJhcnksIGp1c3QKICAgICAgICAgIHR5cGUgdGhpcyBpbiBhbnkgZGlyZWN0b3J5IDoKCiAgICAgICAgICAgICAgICBzd2lnIC1weXRob24gdGltZXJzLmkKCiAgICAgICAgICBZb3Ugd2lsbCBnZXQgdGhlIGZpbGVzIHRpbWVyc193cmFwLmMgYW5kIHRpbWVyc193cmFwLmRvYyBpbgogICAgICAgICAgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IHRoYXQgeW91IGNhbiBub3cgY29tcGlsZS4gICBUaGUgZmlsZQogICAgICAgICAgcmVtYWlucyBpbiB0aGUgU1dJRyBsaWJyYXJ5IChhbHRob3VnaCB5b3UgY2FuIGNoZWNrIGl0IG91dAogICAgICAgICAgdXNpbmcgdGhlIC1jbyBvcHRpb24pLiAgKioqIE5ldyBGZWF0dXJlICoqKgoKMy8yNC85NyA6IC1jbyBvcHRpb24gYWRkZWQgdG8gU1dJRyB0byBhbGxvdyBlYXN5IGFjY2VzcyB0byB0aGUgU1dJRyBsaWJyYXJ5LgogICAgICAgICAgV2hlbiB1c2VkLCB0aGlzIGluc3RydWN0cyBTV0lHIHRvIGNoZWNrIG91dCBhIGxpYnJhcnkgZmlsZSBhbmQKICAgICAgICAgIHBsYWNlIGl0IGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4gIEZvciBleGFtcGxlIDoKCiAgICAgICAgICAgICAgICB1bml4ID4gc3dpZyAtY28gYXJyYXkuaQogICAgICAgICAgICAgICAgYXJyYXkuaSBjaGVja2VkIG91dCBmcm9tIHRoZSBTV0lHIGxpYnJhcnkKICAgICAgICAgICAgICAgIHVuaXggPgoKICAgICAgICAgIE9uY2UgaW4geW91ciBkaXJlY3RvcnkgeW91IGNhbiBjdXN0b21pemUgdGhlIGZpbGUgdG8gc3VpdCB5b3VyCiAgICAgICAgICBwYXJ0aWN1bGFyIHB1cnBvc2VzLiAgVGhlIGNoZWNrb3V0IG9wdGlvbiBtYWtlcyBpdCBlYXN5IHRvCiAgICAgICAgICBncmFiIGxpYnJhcnkgZmlsZXMgd2l0aG91dCBrbm93aW5nIGFueXRoaW5nIGFib3V0IHRoZSBTV0lHCiAgICAgICAgICBpbnN0YWxsYXRpb24sIGJ1dCBpdCBhbHNvIG1ha2VzIGl0IHBvc3NpYmxlIHRvIHN0YXJ0CiAgICAgICAgICBpbmNsdWRpbmcgc2NyaXB0cywgQyBjb2RlLCBhbmQgb3RoZXIgbWlzY2VsbGFuZW91cyBmaWxlcwogICAgICAgICAgaW4gdGhlIGxpYnJhcnkuICBGb3IgZXhhbXBsZSwgeW91IGNvdWxkIHB1dCBhIGNvb2wgc2NyaXB0CiAgICAgICAgICBpbiB0aGUgbGlicmFyeSBhbmQgY2hlY2sgaXQgb3V0IHdoZW5ldmVyIHlvdSB3YW50ZWQgdG8gdXNlIGl0LgogICAgICAgICAgKioqIE5ldyBGZWF0dXJlICoqKgoKMy8yNC85NyA6ICNwcmFnbWEgZXhwb3J0IGRpcmVjdGl2ZXMgYWRkZWQgdG8gVGNsIG91dHB1dCBmb3IgY29tcGlsaW5nCiAgICAgICAgICBzaGFyZWQgbGlicmFyaWVzIG9uIHRoZSBNYWMuCgozLzI0Lzk3IDogTWlub3IgY2hhbmdlcyB0byB3aXNoLmkgYW5kIHRjbHNoLmkgbGlicmFyeSBmaWxlcyB0byBwcm92aWRlCiAgICAgICAgICBzdXBwb3J0IGZvciB0aGUgTWFjaW50b3NoLgoKMy8xOS85NyA6IFNXSUcncyBwb2xpY3kgdG93YXJkcyBOVUxMIHBvaW50ZXJzIGhhcyBiZWVuIHJlbGF4ZWQuICBUaGUKICAgICAgICAgIHBvbGljeSBvZiByZXF1aXJpbmcgYSBzcGVjaWFsIGNvbXBpbGVyIGRpcmVjdGl2ZSAtREFMTE9XX05VTEwKICAgICAgICAgIHRvIHVzZSBOVUxMIHBvaW50ZXJzIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQuICBXaGlsZSB0aGlzIG1heQogICAgICAgICAgc2VlbSAidW5zYWZlIiwgaXQgdHVybnMgb3V0IHRoYXQgeW91IGNhbiB1c2UgYSAiY2hlY2siCiAgICAgICAgICB0eXBlbWFwIHRvIGFjaGlldmUgc29tZSBzYWZldHkuICAgRm9yIGV4YW1wbGUgOgoKICAgICAgICAgICAgICAgICV0eXBlbWFwKHBlcmw1LGNoZWNrKSBOb2RlICogewogICAgICAgICAgICAgICAgICAgICAgIGlmICghJHRhcmdldCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyb2FrKCJOVUxMIFBvaW50ZXJzIG5vdCBhbGxvd2VkLiIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgIFRoaXMgcHJldmVudHMgYW55IE5VTEwgdmFsdWUgb2YgYSAiTm9kZSAqIiBwb2ludGVyIHRvIGJlCiAgICAgICAgICBwYXNzZWQgdG8gYSBmdW5jdGlvbi4gICAoSSB0aGluayB0aGlzIGlzIG11Y2ggY2xlYW5lcgogICAgICAgICAgdGhhbiB0aGUgb2xkIC1EQUxMT1dfTlVMTCBoYWNrIGFueXdheXMpLgoKMy8xOS85NyA6IEZpeGVkIHBvaW50ZXIgaGFuZGxpbmcgZXJyb3JzIGluIFBlcmw1IG1vZHVsZS4gIE1vZHVsZXMgbm8KICAgICAgICAgIGxvbmdlciBjb3JlIGR1bXAgd2hlbiBhIFBlcmwgcmVmZXJlbmNlIGlzIGluYWR2ZXJ0ZW50bHkKICAgICAgICAgIHBhc3NlZCBpbiBhcyBhIEMgcG9pbnRlci4KCjMvMTgvOTcgOiBBZGRlZCBhICJjaGVjayIgdHlwZW1hcC4gICBUaGlzIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHRoZQogICAgICAgICAgdmFsaWRpdHkgb2YgZnVuY3Rpb24gaW5wdXQgdmFsdWVzLiAgRm9yIGV4YW1wbGUgOgoKICAgICAgICAgICAgICAgICV0eXBlbWFwKHBlcmw1LGNoZWNrKSBpbnQgcG9zaW50IHsKICAgICAgICAgICAgICAgICAgICAgICBpZiAoJHRhcmdldCA8IDApCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyb2FrKCJBcmd1bWVudCBpcyBub3QgYSBwb3NpdGl2ZSBpbnRlZ2VyIik7CiAgICAgICAgICAgICAgICB9CgozLzE4Lzk3IDogQWRkZWQgYW4gJGFyZyB2YXJpYWJsZSB0byBUY2wgdHlwZW1hcHMuICAgVGhpcyBtYWtlcyBpdCBlYXNpZXIKICAgICAgICAgIHRvIHJldHVybiBhcmd1bWVudCB2YWx1ZXMgYnkgInJlZmVyZW5jZSIuCgozLzE4Lzk3IDogRml4ZWQgYSBjb2RlIGdlbmVyYXRpb24gYnVnIHdoZW4gdXNpbmcgQysrIHJlZmVyZW5jZXMgYW5kCiAgICAgICAgICB0aGUgJWFkZG1ldGhvZHMgZGlyZWN0aXZlLgoKMy8xOC85NyA6IEZpeGVkIGEgZmV3IGdsaXRjaGVzIGluIHRoZSB0eXBlbWFwIG1vZHVsZSB3aXRoIHJlc3BlY3QgdG8KICAgICAgICAgIGNoYWluaW5nLiBGb3IgZXhhbXBsZSA6CgogICAgICAgICAgICAgICAgJXR5cGVtYXAodGNsLGluKSBpbnQgewogICAgICAgICAgICAgICAgICAgICAgICRpbiAgICAgICAgICAgICAgICAvLyBJbnNlcnRzIHByZXhpc3RpbmcgdHlwZW1hcAogICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiUmVjZWl2ZWQgYSAlZFxuIiwgJHRhcmdldCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgVGhpcyBoYXMgYmVlbiBhbGxvd2VkIGZvciBxdWl0ZSBzb21lIHRpbWUsIGJ1dCBkaWRuJ3Qgd29yawogICAgICAgICAgaWYgbm8gZXhpc3RpbmcgdHlwZW1hcCB3YXMgZGVmaW5lZC4gIE5vdywgaXQgc3RpbGwgZG9lc24ndAogICAgICAgICAgd29yayBpZiBubyBleGlzdGluZyB0eXBlbWFwIGlzIGRlZmluZWQsIGJ1dCBpdCBpc3N1ZXMgYQogICAgICAgICAgd2FybmluZyBtZXNzYWdlLiAgIFRoZXJlIGlzIHNvbWUgc3VwcG9ydCB1c2luZyBkZWZhdWx0IHR5cGVtYXBzLAogICAgICAgICAgYnV0IG5vbmUgb2YgdGhlIGxhbmd1YWdlIG1vZHVsZXMgdGFrZSBhZHZhbnRhZ2Ugb2YgaXQuICBUaGlzCiAgICAgICAgICBzaG91bGQgYmUgY29uc2lkZXJlZCBleHBlcmltZW50YWwgYXQgdGhpcyB0aW1lLgoKVmVyc2lvbiAxLjFiNSBQYXRjaCAxIChNYXJjaCAxNiwgMTk5NykKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjMvMTYvOTcgOiBGaXhlZCByZWZlcmVuY2VzIGJ1ZyB3aXRoIEMrKyBjb2RlIGdlbmVyYXRpb24uCgozLzE2Lzk3IDogRml4ZWQgaW5pdGlhbGl6YXRpb24gYnVnIGluIHRoZSBkb2N1bWVudGF0aW9uIHN5c3RlbSB0aGF0CiAgICAgICAgICB3YXMgY2F1c2luZyB3ZWlyZCBwcm9ibGVtcy4KCjMvMTYvOTcgOiBGaXhlZCBmYXRhbCBidWcgd2l0aCAtYyBvcHRpb24gaW4gdGhlIFB5dGhvbiBtb2R1bGUuCgozLzEzLzk3IDogRml4ZWQgYnVnIGluIHRoZSBkb2N1bWVudGF0aW9uIHN5c3RlbSBpbnZvbHZpbmcgdGhlICV0ZXh0IGRpcmVjdGl2ZQogICAgICAgICAgYW5kIHNvcnRpbmcuIEluIHRoZSBvbGQgc3lzdGVtLCAldGV4dCBlbnRyaWVzIHdvdWxkIGZsb2F0IHRvIHRoZQogICAgICAgICAgdG9wIG9mIGEgc2VjdGlvbiBiZWNhdXNlIHRoZXkgd2VyZSAibmFtZWxlc3MiLiAgIE5vdyB0aGV5IGFyZQogICAgICAgICAgYXR0YWNoZWQgdG8gdGhlIHByZXZpb3VzIGRlY2xhcmF0aW9uIGFuZCB3aWxsIHN0YXkgaW4gdGhlIHByb3BlcgogICAgICAgICAgbG9jYXRpb24gcmVsYXRpdmUgdG8gdGhlIHByZXZpb3VzIGVudHJ5LgoKVmVyc2lvbiAxLjFiNSAoTWFyY2ggMTIsIDE5OTcpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMy8xMS85NyA6IEZpeGVkIGNvbXBpbGF0aW9uIHByb2JsZW1zIGludHJvZHVjZWQgYnkgVGNsL1RrIDguMGEyLgogICAgICAgICAgKioqIElOQ09NUEFUSUJJTElUWSAqKiogU1dJRyBubyBsb25nZXIgd29ya3Mgd2l0aCBUY2wvVGsgOC4wYTEuCgozLzEwLzk3IDogRml4ZWQgYnVnIHdpdGggaWdub3JlZCBhcmd1bWVudHMgYW5kIEMrKyBtZW1iZXIgZnVuY3Rpb25zIGluCiAgICAgICAgICB0aGUgUHl0aG9uIG1vZHVsZS4KCjMvOS85NyAgOiBQYXJzaW5nIGJ1Z3Mgd2l0aCBuZXN0ZWQgY2xhc3MgZGVmaW5pdGlvbnMgYW5kIHByaXZhdGVseQogICAgICAgICAgZGVjbGFyZWQgbmVzdGVkIGNsYXNzIGRlZmluaXRpb25zIGZpeGVkLgoKMy85Lzk3ICA6IEZpeGVkIGEgZmV3IG1pbm9yIGNvZGUgZ2VuZXJhdGlvbiBidWdzIHdpdGggQysrIGNsYXNzZXMgYW5kCiAgICAgICAgICBjb25zdHJ1Y3RvcnMuICAgSW4gc29tZSBjYXNlcywgdGhlIHJlc3VsdGluZyB3cmFwcGVyIGNvZGUKICAgICAgICAgIHdvdWxkIG5vdCBjb21waWxlIHByb3Blcmx5LiAgIFNXSUcgbm93IGF0dGVtcHRzIHRvIHVzZQogICAgICAgICAgdGhlIGRlZmF1bHQgY29weSBjb25zdHJ1Y3RvciBpbnN0ZWFkLgoKMy84Lzk3ICA6IEFkZGVkIGEgLWwgb3B0aW9uIHRvIFNXSUcgdGhhdCBhbGxvd3MgYWRkaXRpb25hbCBTV0lHIGxpYnJhcnkgZmlsZXMKICAgICAgICAgIHRvIGJlIGdyYWJiZWQgd2l0aG91dCBoYXZpbmcgdGhlbSBzcGVjaWZpZWQgaW4gdGhlIGludGVyZmFjZSBmaWxlLgogICAgICAgICAgVGhpcyBtYWtlcyBpdCBlYXNpZXIgdG8ga2VlcCB0aGUgaW50ZXJmYWNlIGZpbGUgY2xlYW4gYW5kIG1vdmUgY2VydGFpbgogICAgICAgICAgb3B0aW9ucyBpbnRvIGEgTWFrZWZpbGUuICAgRm9yIGV4YW1wbGUgOgoKICAgICAgICAgICAgICBzd2lnIC10Y2wgZXhhbXBsZS5pICAgICAgICAgICAgICAjICBCdWlsZCBhIG5vcm1hbCBUY2wgZXh0ZW5zaW9uCiAgICAgICAgICAgICAgc3dpZyAtdGNsIC1sd2lzaC5pIGV4YW1wbGUuaSAgICAgIyAgQnVpbGQgaXQgYXMgYSB3aXNoIGV4dGVuc2lvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgIGJ5IGluY2x1ZGluZyB0aGUgJ3dpc2guaScgZmlsZS4KCiAgICAgICAgICAgICAgc3dpZyAtcHl0aG9uIGV4YW1wbGUuaSAgICAgICAgICAgIyBCdWlsZCBhIGR5bmFtaWNhbGx5IGxvYWRlZCBleHRlbnNpb24KICAgICAgICAgICAgICBzd2lnIC1weXRob24gLWxlbWJlZC5pIGV4YW1wbGUuaSAjIEJ1aWxkIGEgc3RhdGljIGV4dGVuc2lvbgoKICAgICAgICAgIFRoZXNlIGtpbmRzIG9mIG9wdGlvbnMgY291bGQgcHJldmlvdXNseSBiZSBhY2NvbXBsaXNoZWQgd2l0aAogICAgICAgICAgY29uZGl0aW9uYWwgY29tcGlsYXRpb24gc3VjaCBhcyA6CgogICAgICAgICAgICAgICAgICAgJW1vZHVsZSBleGFtcGxlCiAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgICNpZmRlZiBTVEFUSUMKICAgICAgICAgICAgICAgICAgICVpbmNsdWRlIGVtYmVkLmkKICAgICAgICAgICAgICAgICAgICNlbmRpZgoKMy84Lzk3ICA6IEluY29ycG9yYXRlZCBjaGFuZ2VzIHRvIEd1aWxlIG1vZHVsZSB0byB1c2UgdGhlIG5ldyBnaCBpbnRlcmZhY2UKICAgICAgICAgIGluIEZTRiBHdWlsZSAxLjAuICAgIFRoZSBvbGRlciBnc2NtIGludGVyZmFjZSB1c2VkIGluIEN5Z251cwogICAgICAgICAgR3VpbGUgcmVsZWFzZXMgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZCBieSBTV0lHLgoKMy84Lzk3ICA6IENsZWFuZWQgdXAgdGhlIFRjbCBOZXRzY2FwZSBwbHVnaW4gZXhhbXBsZS4gICBJdCBzaG91bGQgd29yayB3aXRoCiAgICAgICAgICB2ZXJzaW9uIDEuMSBvZiB0aGUgcGx1Z2luIG5vdy4KCjMvOC85NyAgOiBBZGRlZCBiZXR0ZXIgYXJyYXkgc3VwcG9ydCB0byB0aGUgdHlwZW1hcCBtb2R1bGUuICBUaGUga2V5d29yZAogICAgICAgICAgQU5ZIGNhbiBub3cgYmUgdXNlZCB0byBtYXRjaCBhbnkgYXJyYXkgZGltZW5zaW9uLiAgRm9yIGV4YW1wbGUgOgoKICAgICAgICAgICAgICAgICAgICAldHlwZW1hcCh0Y2wsaW4pIGRvdWJsZSBbQU5ZXSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLiBnZXQgYW4gYXJyYXkgLi4uCiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgIFRoaXMgd2lsbCBtYXRjaCBhbnkgc2luZ2xlLWRpbWVuc2lvbmFsIGRvdWJsZSBhcnJheS4gICBUaGUgYXJyYXkKICAgICAgICAgIGRpbWVuc2lvbiBpcyBwYXNzZWQgaW4gdGhlIHZhcmlhYmxlcyAkZGltMCwgJGRpbTEsIC4uLiAkZGltOS4gIEZvcgogICAgICAgICAgZXhhbXBsZSA6CgoJCSAgICAldHlwZW1hcCh0Y2wsaW4pIGRvdWJsZSBbQU5ZXVtBTlldW0FOWV0gewoJCQlwcmludGYoIlJlY2VpdmVkIGEgZG91YmxlWyVkXVslZF1bJWRdXG4iLCRkaW0wLCRkaW0xLCRkaW0yKTsKCSAgICAgICAgICAgIH0KCiAgICAgICAgICBBbnkgdHlwZW1hcCBpbnZvbHZpbmcgYSBzcGVjaWZpYyBhcnJheSBkaW1lbnNpb24gd2lsbCBvdmVycmlkZSBhbnkKICAgICAgICAgIHNwZWNpZmllZCB3aXRoIHRoZSBBTlkgdGFnLiAgVGh1cywgYSAldHlwZW1hcCh0Y2wsaW4pIGRvdWJsZSBbNV1bNF1bQU5ZXSB7fQogICAgICAgICAgd291bGQgb3ZlcnJpZGUgYSBkb3VibGUgW0FOWV1bQU5ZXVtBTlldLiAgSG93ZXZlciwgb3ZlcnVzZSBvZiB0aGUgQU5ZCiAgICAgICAgICB0YWcgaW4gYXJyYXlzIG9mIGhpZ2gtZGltZW5zaW9ucyBtYXkgbm90IHdvcmsgYXMgeW91IGV4cGVjdCBkdWUgdG8KICAgICAgICAgIHRoZSBwYXR0ZXJuIG1hdGNoaW5nIHJ1bGUgdXNlZC4gRm9yIGV4YW1wbGUsIHdoaWNoIG9mIHRoZSBmb2xsb3dpbmcKICAgICAgICAgIHR5cGVtYXBzIGhhcyBwcmVjZWRlbmNlPwoKICAgICAgICAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSBkb3VibGUgW0FOWV1bNV0ge30gICAgIC8vIEF2b2lkIHRoaXMhCiAgICAgICAgICAgICAgICAgICAgICAldHlwZW1hcChpbikgZG91YmxlIFs1XVtBTlldIHt9CgozLzcvOTcgIDogRml4ZWQgYSBudW1iZXIgb2YgYnVncyByZWxhdGVkIHRvIG11bHRpLWRpbWVuc2lvbmFsIGFycmF5IGhhbmRsaW5nLgogICAgICAgICAgVHlwZWRlZnMgaW52b2x2aW5nIG11bHRpLWRpbWVuc2lvbmFsIGFycmF5cyBub3cgd29ya3MgY29ycmVjdGx5LgogICAgICAgICAgRm9yIGV4YW1wbGUgOgoKICAgICAgICAgICAgICAgICAgICB0eXBlZGVmIGRvdWJsZSBNQVRSSVhbNF1bNF07CgogICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgIGV4dGVybiBkb3VibGUgZm9vKE1BVFJJWCBhKTsKCiAgICAgICAgICBUeXBlY2FzdGluZyBvZiBwb2ludGVycyBpbnRvIG11bHRpLWRpbWVuc2lvbmFsIGFycmF5cyBpcyBub3cKICAgICAgICAgIGltcGxlbWVudGVkIHByb3Blcmx5IHdoZW4gbWFraW5nIEMvQysrIGZ1bmN0aW9uIGNhbGxzLgoKMy82Lzk3ICA6IEZpeGVkIHBvdGVudGlhbGx5IGRhbmdlcm91cyBidWcgaW4gdGhlIFRjbCBPYmplY3Qtb3JpZW50ZWQKICAgICAgICAgIGludGVyZmFjZS4gIFdlbGwsIGFjdHVhbGx5LCBkaWRuJ3QgZml4IGl0IGJ1dCBpc3N1ZWQgYQogICAgICAgICAgVGNsIGVycm9yIGluc3RlYWQuICAgVGhlIGJ1ZyB3b3VsZCBtYW5pZmVzdCBpdHNlbGYgYXMgZm9sbG93czoKCiAgICAgICAgICAgICAgICAgJSBzZXQgbCBbTGlzdF0gICAgICAgICAgICMgQ3JlYXRlIGFuIG9iamVjdAogICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICUgc2V0IG0gW0xpc3QgLXRoaXMgJGxdICAjIE1ha2UgJG0gaW50byBhbiBvYmplY3QgYXNzdW1pbmcgJGwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBjb250YWlucyBhIHBvaW50ZXIuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgU2luY2UgJG0gPT0gJGwsICRsIGdldHMgZGVzdHJveWVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKHNpbmNlIGl0cyB0aGUgc2FtZSBjb21tYW5kIG5hbWUpCiAgICAgICAgICAgICAgICAgJSAkbSBpbnNlcnQgRm9vCiAgICAgICAgICAgICAgICAgU2VnbWVudGF0aW9uIGZhdWx0ICAgICAgICMgTm90ZSA6IHRoZSBsaXN0IG5vIGxvbmdlciBleGlzdHMhCgogICAgICAgICAgTm93LCBhbiBlcnJvciB3aWxsIGJlIGdlbmVyYXRlZCBpbnN0ZWFkIG9mIHJlZGVmaW5pbmcgdGhlIGNvbW1hbmQuCiAgICAgICAgICBBcyBpbiA6CgogICAgICAgICAgICAgICAgICUgc2V0IGwgW0xpc3RdCiAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgJSBzZXQgbSBbTGlzdCAtdGhpcyAkbF0KICAgICAgICAgICAgICAgICBPYmplY3QgbmFtZSBhbHJlYWR5IGV4aXN0cyEKCiAgICAgICAgICBVc2UgY2F0Y2h7fSB0byBpZ25vcmUgdGhlIGVycm9yLgoKMy8zLzk3ICA6IEJldHRlciBzdXBwb3J0IGZvciBlbnVtcyBhZGRlZC4gICBEYXRhdHlwZXMgb2YgJ2VudW0gTXlFbnVtJwogICAgICAgICAgYW5kIHR5cGVkZWZzIHN1Y2ggYXMgJ3R5cGVkZWYgZW51bSBNeUVudW0gRm9vOycgbm93IHdvcmsuCgozLzMvOTcgIDogUGFyc2VyIG1vZGlmaWVkIHRvIGlnbm9yZSBjb25zdHJ1Y3RvciBpbml0aWFsaXplcnMgc3VjaCBhcyA6CgogICAgICAgICAgICAgICBjbGFzcyBGb28gOiBwdWJsaWMgQmFyIHsKICAgICAgICAgICAgICAgaW50IGEsYjsKICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICBGb28oaW50IGkpIDogYSgwKSwgYihpKSwgQmFyKGksMCkgeyB9OwogICAgICAgICAgICAgICB9OwoKMy8zLzk3ICA6IE1vZGlmaWVkIHBhcnNlciB0byBpZ25vcmUgQysrIGV4Y2VwdGlvbiBzcGVjaWZpY2F0aW9ucyBzdWNoIGFzIDoKCiAgICAgICAgICAgICAgIGludCBmb28oZG91YmxlKSB0aHJvdyhYLFkpOwoKMy8zLzk3ICA6IEFkZGVkICVpbXBvcnQgZGlyZWN0aXZlLiAgVGhpcyB3b3JrcyBleGFjdGx5IGxpa2UgJWV4dGVybgogICAgICAgICAgZXhjZXB0IGl0IHRlbGxzIHRoZSBsYW5ndWFnZSBtb2R1bGUgdGhhdCB0aGUgZGVjbGFyYXRpb25zIGFyZQogICAgICAgICAgY29taW5nIGZyb20gYSBzZXBhcmF0ZSBtb2R1bGUuICAgVGhpcyBpcyB1c3VhbGx5IG9ubHkKICAgICAgICAgIG5lZWRlZCB3aGVuIHdvcmtpbmcgd2l0aCBzaGFkb3cgY2xhc3Nlcy4KCjMvMi85NyAgOiBDaGFuZ2VkIHBvaW50ZXIgdHlwZS1jaGVja2VyIHRvIGJlIHNpZ25pZmljYW50bHkgbW9yZQogICAgICAgICAgZWZmaWNpZW50IHdoZW4gd29ya2luZyB3aXRoIGRlcml2ZWQgZGF0YXR5cGVzLiAgVGhpcwogICAgICAgICAgaGFzIGJlZW4gYWNjb21wbGlzaGVkIGJ5IHN0b3JpbmcgdHlwZS1tYXBwaW5ncyBpbiBzb3J0ZWQKICAgICAgICAgIG9yZGVyLCB1c2luZyBiaW5hcnkgc2VhcmNoIHNjaGVtZXMsIGFuZCBjYWNoaW5nIHJlY2VudGx5CiAgICAgICAgICB1c2VkIGRhdGF0eXBlcy4gICBGb3IgU1dJRyBnZW5lcmF0ZWQgQysrIG1vZHVsZXMgdGhhdAogICAgICAgICAgbWFrZSBhIGxhcmdlIG51bWJlciBvZiBDIGZ1bmN0aW9uIGNhbGxzIHdpdGggZGVyaXZlZCB0eXBlcywKICAgICAgICAgIHRoaXMgY291bGQgcmVzdWx0IGluIHNwZWVkdXBzIG9mIGJldHdlZW4gMTAwIGFuZCA1MDAwMCBwZXJjZW50LgogICAgICAgICAgSG93ZXZlciwgZHVlIHRvIHRoZSByZXF1aXJlZCBzb3J0aW5nIG9wZXJhdGlvbiwgbW9kdWxlCiAgICAgICAgICBsb2FkaW5nIHRpbWUgbWF5IGluY3JlYXNlZCBzbGlnaHRseSB3aGVuIHRoZXJlIGFyZSBsb3RzIG9mCiAgICAgICAgICBkYXRhdHlwZXMuCgozLzIvOTcgIDogRml4ZWQgc29tZSBDKysgY29tcGlsYXRpb24gcHJvYmxlbXMgd2l0aCBQeXRob24KICAgICAgICAgIGVtYmVkLmkgbGlicmFyeSBmaWxlcy4KCjIvMjcvOTcgOiBTbGlnaHQgY2hhbmdlIHRvIEMrKyBjb2RlIGdlbmVyYXRpb24gdG8gdXNlIGNvcHkgY29uc3RydWN0b3JzCiAgICAgICAgICB3aGVuIHJldHVybmluZyBjb21wbGV4IGRhdGEgdHlwZSBieSB2YWx1ZS4KCjIvMjYvOTcgOiBGaXhlZCBidWcgaW4gUHl0aG9uIG1vZHVsZSB3aXRoIC1jIG9wdGlvbi4KCjIvMjYvOTcgOiBTbGlnaHQgdHdlYWsgb2YgcGFyc2VyIHRvIGFsbG93IHRyYWlsaW5nIGNvbW1hIGluIGVudW1lcmF0aW9ucwogICAgICAgICAgc3VjaCBhcwoKICAgICAgICAgICAgICAgIGVudW0gVmFsdWUgKEFMRSwgU1RPVVQsIExBR0VSLCB9OwoKMi8yNS85NyA6IEZpeGVkIGNvZGUgZ2VuZXJhdGlvbiBidWcgaW4gVGNsIG1vZHVsZSB3aGVuIHVzaW5nIHRoZQogICAgICAgICAgJW5hbWUoKSBkaXJlY3RpdmUgb24gYSBjbGFzc25hbWUuCgoyLzI1Lzk3IDogRmluaXNoZWQgY29kZS1zaXplIG9wdGltaXphdGlvbiBvZiBDKysgY29kZSBnZW5lcmF0aW9uIHdpdGgKICAgICAgICAgIGluaGVyaXRhbmNlIG9mIGF0dHJpYnV0ZXMuICAgIEluaGVyaXRlZCBhdHRyaWJ1dGVzIG5vdwogICAgICAgICAgb25seSBnZW5lcmF0ZSBvbmUgc2V0IG9mIHdyYXBwZXIgZnVuY3Rpb25zIHRoYXQgYXJlIHJlLXVzZWQKICAgICAgICAgIGluIGFueSBkZXJpdmVkIGNsYXNzZXMuICAgVGhpcyBjb3VsZCBwcm92aWRlIGJpZyBjb2RlCiAgICAgICAgICBzaXplIGltcHJvdmVtZW50cyBpbiBzb21lIHNjcmlwdGluZyBsYW5ndWFnZSBpbnRlcmZhY2VzLgoKMi8yNS85NyA6IFBlcmw1IG1vZHVsZSBtb2RpZmllZCB0byBzdXBwb3J0IGJvdGggdGhlIFVuaXggYW5kIFdpbmRvd3MKICAgICAgICAgIHZlcnNpb25zLiAgVGhlIHdpbmRvd3MgdmVyc2lvbiBoYXMgYmVlbiB0ZXN0ZWQgd2l0aCB0aGUKICAgICAgICAgIEFjdGl2ZXdhcmUgcG9ydCBvZiBQZXJsIDUuMDAzIHJ1bm5pbmcgdW5kZXIgV2luZG93cyA5NS4KICAgICAgICAgIFRoZSBDIHNvdXJjZSBnZW5lcmF0ZWQgYnkgU1dJRyBzaG91bGQgY29tcGlsZSB3aXRob3V0CiAgICAgICAgICBtb2RpZmljYXRpb24gdW5kZXIgYm90aCB2ZXJzaW9ucyBvZiBQZXJsLCBidXQgaXMgbm93CiAgICAgICAgICBldmVuIG1vcmUgaGlkZW91cyB0aGFuIGJlZm9yZS4KCjIvMjUvOTcgOiBNb2RpZmllZCBwYXJzZXIgdG8gYWxsb3cgc2NvcGUgcmVzb2x1dGlvbiBvcGVyYXRpb24gdG8KICAgICAgICAgIGFwcGVhciBpbiBleHByZXNzaW9ucyBhbmQgZGVmYXVsdCBhcmd1bWVudHMgYXMgaW4gOgoKICAgICAgICAgICAgICAgIHZvaWQgZm9vKGludCBhID0gIEJhcjo6ZGVmdmFsdWUpOwoKMi8yNS85NyA6IEZpeGVkIGJ1ZyB3aGVuIHJlc29sdmluZyBzeW1ib2xzIGluc2lkZSBDKysgY2xhc3Nlcy4KICAgICAgICAgIEZvciBleGFtcGxlIDoKCiAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgIGVudW0gVmFsdWUge0FMRSwgU1RPVVQsIExBR0VSfTsKICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgdm9pZCBkZWZhcmcoVmFsdWUgdiA9IFNUT1VUKTsKCiAgICAgICAgICAgICAgfTsKCjIvMjQvOTcgOiBGaXhlZCBidWcgd2l0aCBtZW1iZXIgZnVuY3Rpb25zIHJldHVybmluZyB2b2lkICouCgoyLzIzLzk3IDogTW9kaWZpZWQgUHl0aG9uIG1vZHVsZSB0byBiZSBiZXR0ZXIgYmVoYXZlZCB1bmRlciBXaW5kb3dzCgogICAgICAgICAgICAtICBNb2R1bGUgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24gaXMgbm93IHByb3Blcmx5IGV4cG9ydGVkLgogICAgICAgICAgICAgICBJdCBzaG91bGQgbm90IGJlIG5lY2Nlc3NhcnkgdG8gZXhwbGljaXRseSBleHBvcnQgdGhpcyBmdW5jdGlvbgogICAgICAgICAgICAgICB5b3Vyc2VsZi4KCiAgICAgICAgICAgIC0gIEJpemFycmUgY29tcGlsYXRpb24gcHJvYmxlbXMgd2hlbiBjb21waWxpbmcgdGhlIFNXSUcgd3JhcHBlcgogICAgICAgICAgICAgICBjb2RlIGFzIEFOU0kgQyB1bmRlciBWaXN1YWwgQysrIDQueCBmaXhlZC4KCiAgICAgICAgICAgIC0gIFRlc3RlZCB3aXRoIGJvdGggdGhlIHN0b2NrIFB5dGhvbi0xLjQgZGlzdHJpYnV0aW9uIGFuZCBQeXRob253aW4KICAgICAgICAgICAgICAgcnVubmluZyB1bmRlciBXaW45NS4KCjIvMTkvOTcgOiBGaXhlZCB0eXBlZGVmIGhhbmRsaW5nIGJ1ZyBpbiBQZXJsNSBzaGFkb3cgY2xhc3Nlcy4KCjIvMTkvOTcgOiBBZGRlZCBleGNlcHRpb24gc3VwcG9ydC4gIFRvIHVzZSBpdCwgZG8gdGhlIGZvbGxvd2luZyA6CgogICAgICAgICAgICAgICVleGNlcHQobGFuZykgewogICAgICAgICAgICAgICAgICAuLi4gdHJ5IHBhcnQgb2YgdGhlIGV4Y2VwdGlvbiAuLi4KICAgICAgICAgICAgICAgICAgJGZ1bmN0aW9uCiAgICAgICAgICAgICAgICAgIC4uLiBjYXRjaCBwYXJ0IG9mIGV4Y2VwdGlvbiAuLi4KICAgICAgICAgICAgICB9CgogICAgICAgICAgJGZ1bmN0aW9uIGlzIGEgU1dJRyB2YXJpYWJsZSB0aGF0IHdpbGwgYmUgcmVwbGFjZWQgYnkgdGhlCiAgICAgICAgICBhY3R1YWwgQy9DKysgZnVuY3Rpb24gY2FsbCBpbiBhIHdyYXBwZXIgZnVuY3Rpb24uICBUaHVzLAogICAgICAgICAgYSByZWFsIGV4Y2VwdGlvbiBzcGVjaWZpY2F0aW9uIG1pZ2h0IGxvb2sgbGlrZSB0aGlzIDoKCiAgICAgICAgICAgICAlZXhjZXB0KHBlcmw1KSB7CiAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICRmdW5jdGlvbgogICAgICAgICAgICAgICAgICB9IGNhdGNoIChjaGFyIComIHN6KSB7CiAgICAgICAgICAgICAgICAgICAgLi4uIHByb2Nlc3MgYW4gZXhjZXB0aW9uIC4uLgogICAgICAgICAgICAgICAgICB9IGNhdGNoKC4uLikgewogICAgICAgICAgICAgICAgICAgIGNyb2FrKCJVbmtub3duIGV4Y2VwdGlvbi4gQmFpbGluZyBvdXQuLi4iKTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQoKMi8xOS85NyA6IEFkZGVkIHN1cHBvcnQgZm9yIG1hbmFnaW5nIGdlbmVyaWMgY29kZSBmcmFnbWVudHMgKG5lZWRlZAogICAgICAgICAgZm9yIGV4Y2VwdGlvbnMpLgoKMi8xOS85NyA6IEZpeGVkIHNvbWUgcmVhbGx5IG9ic2N1cmUgdHlwZW1hcCBzY29waW5nIGJ1Z3MgaW4gdGhlIEMrKwogICAgICAgICAgaGFuZGxlci4KCjIvMTgvOTcgOiBDbGVhbmVkIHVwIHBlcmxtYWluLmkgZmlsZSBieSByZW1vdmluZyBzb21lIHByb2JsZW1hdGljLAogICAgICAgICAgYnV0IHNlZW1pbmdseSB1bm5lY2Vzc2FyeSBkZWNsYXJhdGlvbnMuCgoyLzE4Lzk3IDogT3B0aW1pemVkIGhhbmRsaW5nIG9mIG1lbWJlciBmdW5jdGlvbnMgdW5kZXIgaW5oZXJpdGFuY2UuCiAgICAgICAgICBTV0lHIGNhbiBub3cgdXNlIHdyYXBwZXIgZnVuY3Rpb25zIGdlbmVyYXRlZCBmb3IgYQogICAgICAgICAgYmFzZSBjbGFzcyBpbnN0ZWFkIG9mIHJlZ2VuZXJhdGluZyB3cmFwcGVycyBmb3IKICAgICAgICAgIHRoZSBzYW1lIGZ1bmN0aW9ucyBpbiBhIGRlcml2ZWQgY2xhc3MuICAgIFRoaXMgY291bGQKICAgICAgICAgIG1ha2UgYSBkcmFzdGljIHJlZHVjdGlvbiBpbiB3cmFwcGVyIGNvZGUgc2l6ZSBmb3IgQysrCiAgICAgICAgICBhcHBsaWNhdGlvbnMgd2l0aCBkZWVwIGluaGVyaXRhbmNlIGhpZXJhcmNoaWVzIGFuZAogICAgICAgICAgbG90cyBvZiBmdW5jdGlvbnMuCgoyLzE4Lzk3IDogQWRkaXRpb25hbCBtZXRob2RzIHNwZWNpZmllZCB3aXRoICVhZGRtZXRob2RzIGNhbiBub3cKICAgICAgICAgIGJlIGluaGVyaXRlZCBhbG9uZyB3aXRoIG5vcm1hbCBDKysgbWVtYmVyIGZ1bmN0aW9ucy4KCjIvMTgvOTcgOiBNaW5vciBpbnRlcm5hbCBmaXhlcyB0byBtYWtlIFNXSUcncyBzdHJpbmcgaGFuZGxpbmcgYSBsaXR0bGUKICAgICAgICAgIHNhZmVyLgoKMi8xNi85NyA6IE1vdmVkIHNvbWUgY29kZSBnZW5lcmF0aW9uIG9mIFRjbCBzaGFkb3cgY2xhc3NlcyB0bwogICAgICAgICAgbGlicmFyeSBmaWxlcy4KCjIvMTYvOTcgOiBGaXhlZCBkb2N1bWVudGF0aW9uIGVycm9yIG9mICctY29uZmlndXJlJyBtZXRob2QgaW4KICAgICAgICAgIFRjbCBtb2R1bGVzLgoKMi8xNi85NyA6IE1vZGlmaWVkIFBlcmw1IG1vZHVsZSBzbGlnaHRseSB0byBhbGxvdyB0eXBlbWFwcwogICAgICAgICAgdG8gdXNlIFBlcmwgcmVmZXJlbmNlcy4KCjIvMTIvOTcgOiBGaXhlZCBhcmd1bWVudCBjaGVja2luZyBidWcgdGhhdCB3YXMgaW50cm9kdWNlZCBieQogICAgICAgICAgZGVmYXVsdCBhcmd1bWVudHMgKGZ1bmN0aW9uIGNhbGxzIHdpdGggdG9vIG1hbnkKICAgICAgICAgIGFyZ3VtZW50cyB3b3VsZCBzdGlsbCBiZSBleGVjdXRlZCkuICBGdW5jdGlvbnMgbm93CiAgICAgICAgICBtdXN0IGhhdmUgdGhlIHNhbWUgbnVtYmVyIG9mIGFyZ3VtZW50cyBhcyBDIHZlcnNpb24KICAgICAgICAgICh3aXRoIHBvc3NpYmlsaXR5IG9mIGRlZmF1bHQvb3B0aW9uYWwgYXJndW1lbnRzCiAgICAgICAgICBzdGlsbCBzdXBwb3J0ZWQpLgoKMi8xMi85NyA6IEZpeGVkIGRlZmF1bHQgYXJndW1lbnQgYnVnIGluIFBlcmw1IG1vZHVsZSB3aGVuCiAgICAgICAgICBnZW5lcmF0aW5nIHdyYXBwZXIgZnVuY3Rpb25zIGludm9sdmluZyBkZWZhdWx0CiAgICAgICAgICBhcmd1bWVudHMgb2YgY29tcGxleCBkYXRhdHlwZXMuCgoyLzEyLzk3IDogRml4ZWQgdHlwZW1hcCBzY29waW5nIHByb2JsZW1zLiAgRm9yIGV4YW1wbGUgOgoKICAgICAgICAgICAgICAldHlwZW1hcCh0Y2wsaW4pIGRvdWJsZSB7CiAgICAgICAgICAgICAgICAgICAgLi4gZ2V0IGEgZG91YmxlIC4uCiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgIGRvdWJsZSBiYXIoZG91YmxlKTsKICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICV0eXBlbWFwKHRjbCxpbikgZG91YmxlIHsKICAgICAgICAgICAgICAgICAgICAuLiBuZXcgZ2V0IGRvdWJsZSAuLgogICAgICAgICAgICAgIH0KCiAgICAgICAgICBXb3VsZCBhcHBseSB0aGUgc2Vjb25kIHR5cGVtYXAgdG8gYWxsIGZ1bmN0aW9ucyBpbiBGb28KICAgICAgICAgIGR1ZSB0byBkZWxheWVkIGdlbmVyYXRpb24gb2YgQysrIHdyYXBwZXIgY29kZSAoY2xlYXJseSB0aGlzCiAgICAgICAgICBpcyBub3QgdGhlIGRlc2lyZWQgZWZmZWN0KS4gICBQcm9ibGVtIGhhcyBiZWVuIGZpeGVkIGJ5CiAgICAgICAgICBhc3NpZ25pbmcgdW5pcXVlIG51bWVyaWNhbCBpZGVudGlmaWVycyB0byBldmVyeSBkYXRhdHlwZSBpbgogICAgICAgICAgYW4gaW50ZXJmYWNlIGZpbGUgYW5kIHJlY29yZGluZyB0aGUgInJhbmdlIG9mIGVmZmVjdCIgb2YgZWFjaAogICAgICAgICAgdHlwZW1hcC4KCjIvMTEvOTcgOiBBZGRlZCBzdXBwb3J0IGZvciAiaWdub3JlIiBhbmQgImRlZmF1bHQiIHR5cGVtYXBzLiAgT25seSB1c2UKICAgICAgICAgIGlmIHlvdSBhYnNvbHV0ZWx5IGtub3cgd2hhdCB5b3UncmUgZG9pbmcuCgoyLzkvOTcgIDogQWRkZWQgYXV0b21hdGljIGNyZWF0aW9uIG9mIGNvbnN0cnVjdG9ycyBhbmQgZGVzdHJ1Y3RvcnMgZm9yCiAgICAgICAgICBDIHN0cnVjdHMgYW5kIEMrKyBjbGFzc2VzIHRoYXQgZG8gbm90IHNwZWNpZnkgYW55IHNvcnQgb2YKICAgICAgICAgIGNvbnN0cnVjdG9yIG9yIGRlc3RydWN0b3IuICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBlbmFibGVkIGJ5CiAgICAgICAgICBydW5uaW5nIFNXSUcgd2l0aCB0aGUgJy1tYWtlX2RlZmF1bHQnIG9wdGlvbiBvciBieSBpbnNlcnRpbmcKICAgICAgICAgIHRoZSBmb2xsb3dpbmcgcHJhZ21hIGludG8gYW4gaW50ZXJmYWNlIGZpbGUgOgoKICAgICAgICAgICAgICAgICAlcHJhZ21hIG1ha2VfZGVmYXVsdAoKICAgICAgICAgIFRoZSBmb2xsb3dpbmcgcHJhZ21hIGRpc2FibGVzIGF1dG9tYXRpYyBjb25zdHJ1Y3RvciBnZW5lcmF0aW9uCgogICAgICAgICAgICAgICAgICVwcmFnbWEgbm9fZGVmYXVsdAoKMi85Lzk3ICA6IEFkZGVkIC1tYWtlX2RlZmF1bHQgb3B0aW9uIGZvciBwcm9kdWNpbmcgZGVmYXVsdCBjb25zdHJ1Y3RvcnMKICAgICAgICAgIGFuZCBkZXN0cnVjdG9ycyBmb3IgY2xhc3NlcyB3aXRob3V0IHRoZW0uCgoyLzkvOTcgIDogQ2hhbmdlZCB0aGUgc3ludGF4IG9mIHRoZSBTV0lHICVwcmFnbWEgZGlyZWN0aXZlIHRvCiAgICAgICAgICAlcHJhZ21hIG9wdGlvbj12YWx1ZSBvciAlcHJhZ21hKGxhbmcpIG9wdGlvbj12YWx1ZS4KICAgICAgICAgIFRoaXMgY2hhbmdlIG1ha2VzIHRoZSBzeW50YXggYSBsaXR0bGUgbW9yZSBjb25zaXN0ZW50CiAgICAgICAgICBiZXR3ZWVuIGdlbmVyYWwgcHJhZ21hcyBhbmQgbGFuZ3VhZ2Utc3BlY2lmaWMgcHJhZ21hcy4KICAgICAgICAgIFRoZSBvbGQgc3ludGF4IHN0aWxsIHdvcmtzLCBidXQgd2lsbCBwcm9iYWJseSBiZSBwaGFzZWQKICAgICAgICAgIG91dCAoYSB3YXJuaW5nIG1lc3NhZ2UgaXMgY3VycmVudGx5IHByaW50ZWQpLgoKMi85Lzk3ICA6IEltcHJvdmVkIFRjbCBzdXBwb3J0IG9mIGdsb2JhbCB2YXJpYWJsZXMgdGhhdCBhcmUgb2YKICAgICAgICAgIHN0cnVjdHVyZXMsIGNsYXNzZXMsIGFuZCB1bmlvbnMuCgoyLzkvOTcgIDogRml4ZWQgQysrIGNvbXBpbGF0aW9uIHByb2JsZW0gaW4gUHl0aG9uICdlbWJlZC5pJyBsaWJyYXJ5IGZpbGUuCgoyLzkvOTcgIDogRml4ZWQgbWlzc2luZyByZXR1cm4gdmFsdWUgaW4gcGVybG1haW4uaSBsaWJyYXJ5IGZpbGUuCgoyLzkvOTcgIDogRml4ZWQgUHl0aG9uIHNoYWRvdyBjbGFzc2VzIHRvIHJldHVybiBhbiBBdHRyaWJ1dGVFcnJvciB3aGVuCiAgICAgICAgICB1bmRlZmluZWQgYXR0cmlidXRlcyBhcmUgYWNjZXNzZWQgKG9sZGVyIHZlcnNpb25zIHJldHVybmVkCiAgICAgICAgICBhIE5hbWVFcnJvcikuCgoyLzkvOTcgIDogRml4ZWQgYnVnIHdoZW4gJWFkZG1ldGhvZHMgaXMgdXNlZCBhZnRlciBhIGNsYXNzIGRlZmluaXRpb24gd2hvc2UKICAgICAgICAgIGxhc3Qgc2VjdGlvbiBpcyBwcm90ZWN0ZWQgb3IgcHJpdmF0ZS4KCjIvOC85NyAgOiBNYWRlIHNsaWdodCBjaGFuZ2VzIGluIGluY2x1ZGUgZmlsZSBwcm9jZXNzaW5nIHRvIHN1cHBvcnQKICAgICAgICAgIHRoZSBNYWNpbnRvc2guCgoyLzgvOTcgIDogRXh0ZW5kZWQgc3dpZ21haW4uY3h4IHRvIHByb3ZpZGUgYSBydWRpbWVudGFyeSBNYWNpbnRvc2ggaW50ZXJmYWNlLgogICAgICAgICAgSXQncyBhIHJlYWxseSBiYWQgaW50ZXJmYWNlLCBidXQgd29ya3MgdW50aWwgc29tZXRoaW5nIGJldHRlcgogICAgICAgICAgaXMgd3JpdHRlbi4KCjEvMjkvOTcgOiBGaXhlZCB0eXBlLWNhc3RpbmcgYnVnIGludHJvZHVjZWQgYnkgMS4xYjQgd2hlbiBzZXR0aW5nL2dldHRpbmcgdGhlCiAgICAgICAgICB2YWx1ZSBvZiBnbG9iYWwgdmFyaWFibGVzIGludm9sdmluZyBjb21wbGV4IGRhdGEgdHlwZXMuCgoxLzI5Lzk3IDogUmVtb3ZlZCBlcnJvbmVvdXMgd2hpdGUgc3BhY2UgYmVmb3JlIGFuICNlbmRpZiBpbiB0aGUgY29kZSBnZW5lcmF0ZWQKICAgICAgICAgIGJ5IHRoZSBQeXRob24gbW9kdWxlICh3YXMgY2F1c2luZyBlcnJvcnMgb24gREVDIEFscGhhIGNvbXBpbGVycykuCgoxLzI2Lzk3IDogRml4ZWQgZXJyb3JzIHdoZW4gdXNpbmcgZGVmYXVsdC9vcHRpb25hbCBhcmd1bWVudHMgaW4gUHl0aG9uIHNoYWRvdwoJICBzaGFkb3cgY2xhc3Nlcy4KCjEvMjMvOTcgOiBGaXhlZCBidWcgd2l0aCBuZXN0ZWQgJWV4dGVybiBkZWNsYXJhdGlvbnMuCgoxLzIxLzk3IDogRml4ZWQgcHJvYmxlbSB3aXRoIHR5cGVkZWYgaW52b2x2aW5nIGNvbnN0IGRhdGF0eXBlcy4KCjEvMjEvOTcgOiBTb21ld2hhdCBvYnNjdXJlLCBidXQgc2VyaW91cyBidWcgd2l0aCBoYXZpbmcgbXVsdGlwbGUgbGV2ZWxzCiAgICAgICAgICBvZiB0eXBlZGVmcyBmaXhlZC4gIEZvciBleGFtcGxlIDoKCgkJdHlwZWRlZiBjaGFyICpTdHJpbmc7CiAgICAgICAgICAgICAgICB0eXBlZGVmIFN0cmluZyAgTmFtZTsKClZlcnNpb24gMS4xIEJldGE0IChKYW51YXJ5IDE2LCAxOTk3KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCk5vdGUgOiBTV0lHIDEuMWIzIGNyYXNoZWQgYW5kIGJ1cm5lZCBzaG9ydGx5IGFmdGVyIHRha2Ugb2ZmIGR1ZQp0byBhIGZldyBtYWpvciBydW4tdGltZSBwcm9ibGVtcyB0aGF0IHN1cmZhY2VkIGFmdGVyIHJlbGVhc2UuClRoaXMgcmVsZWFzZSBzaG91bGQgZml4IG1vc3QsIGlmIG5vdCBhbGwsIG9mIHRob3NlIHByb2JsZW1zLgoKMS8xNi85NyA6IEZpeGVkIG1ham9yIG1lbW9yeSBtYW5hZ2VtZW50IGJ1ZyBvbiBMaW51eAoKMS8xNC85NyA6IEZpeGVkIGJ1ZyBpbiBmdW5jdGlvbnMgcmV0dXJuaW5nIGNvbnN0YW50IEMrKyByZWZlcmVuY2VzLgoKMS8xNC85NyA6IE1vZGlmaWVkIEMrKyBtb2R1bGUgdG8gaGFuZGxlIGRhdGF0eXBlcyBiZXR0ZXIuCgoxLzE0Lzk3IDogTW9kaWZpZWQgcGFyc2VyIHRvIGFsbG93IGEgKnNpbmdsZSogc2NvcGUgcmVzb2x1dGlvbgogICAgICAgICAgb3BlcmF0b3IgaW4gZGF0YXR5cGVzLiAgSWUgOiBGb286OmJhci4gICBTV0lHIGRvZXNuJ3QKICAgICAgICAgIHlldCBoYW5kbGUgbmVzdGVkIGNsYXNzZXMsIHNvIHRoaXMgc2hvdWxkIGJlCiAgICAgICAgICBzdWZmaWNpZW50IGZvciBub3cuCgoxLzE0Lzk3IDogTW9kaWZpZWQgcGFyc2VyIHRvIGFsbG93IHR5cGVkZWYgaW5zaWRlIGEgQysrIGNsYXNzLgoKMS8xNC85NyA6IEZpeGVkIHNvbWUgcHJvYmxlbXMgcmVsYXRlZCB0byBkYXRhdHlwZXMgZGVmaW5lZCBpbnNpZGUKICAgICAgICAgIGEgQysrIGNsYXNzLiAgU1dJRyB3YXMgbm90IGdlbmVyYXRpbmcgY29ycmVjdCBjb2RlLAogICAgICAgICAgYnV0IGEgbmV3IHNjb3BpbmcgbWVjaGFuaXNtIGFuZCBtZXRob2QgZm9yIGhhbmRsaW5nCiAgICAgICAgICBkYXRhdHlwZXMgaW5zaWRlIGEgQysrIGNsYXNzIGhhdmUgYmVlbiBhZGRlZC4KCjEvMTQvOTcgOiBDaGFuZ2VkIGVudW1lcmF0aW9ucyB0byB1c2UgdGhlIHZhbHVlIG5hbWUgaW5zdGVhZAogICAgICAgICAgb2YgYW55IHZhbHVlcyB0aGF0IG1pZ2h0IGhhdmUgYXBwZWFyZWQgaW4gdGhlIGludGVyZmFjZQogICAgICAgICAgZmlsZS4gIFRoaXMgbWFrZXMgdGhlIGNvZGUgYSBsaXR0bGUgbW9yZSBmcmllbmRseSB0bwogICAgICAgICAgQysrIGNvbXBpbGVycy4KCjEvMTQvOTcgOiBSZW1vdmVkIHR5cGVkZWYgYnVnIHRoYXQgbWFkZSBhbGwgZW51bWVyYXRpb25zCiAgICAgICAgICBlcXVpdmFsZW50IHRvIGVhY2ggb3RoZXIgaW4gdGhlIHR5cGUgY2hlY2tlciAoc2luY2UKICAgICAgICAgIGl0IGdlbmVyYXRlZCBhbG90IG9mIHVubmVjZXNzYXJ5IGNvZGUpLgoKVmVyc2lvbiAxLjEgQmV0YTMgKEphbnVhcnkgOSwgMTk5NykKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCk5vdGUgOiBBICpodWdlKiBudW1iZXIgb2YgY2hhbmdlcyByZWxhdGVkIHRvIG9uZ29pbmcgbW9kaWZpY2F0aW9ucy4KCjEuICBTdXBwb3J0IGZvciBDKysgbXVsdGlwbGUgaW5oZXJpdGFuY2UgYWRkZWQuCgoyLiAgVHlwZW1hcHMgYWRkZWQuCgozLiAgU29tZSBzdXBwb3J0IGZvciBuZXN0ZWQgc3RydWN0dXJlIGRlZmluaXRpb25zIGFkZGVkLgoKNC4gIERlZmF1bHQgYXJndW1lbnQgaGFuZGxpbmcgYWRkZWQuCgo1LiAgLWMgb3B0aW9uIGFkZGVkIGZvciBidWlsZGluZyBiYXJlIHdyYXBwZXIgY29kZSBtb2R1bGVzLgoKNi4gIFJld3JvdGUgUG9pbnRlciB0eXBlLWNoZWNraW5nIHRvIHN1cHBvcnQgbXVsdGlwbGUgaW5oZXJpdGFuY2UKICAgIGNvcnJlY3RseS4KCjcuICBUY2wgOC4wIG1vZHVsZSBhZGRlZC4KCjguICBQZXJsNCBhbmQgR3VpbGUgbW9kdWxlcyByZXN1cnJlY3RlZCBmcm9tIHRoZSBkZWFkICh3ZWxsLCB0aGV5CiAgICBhdCBsZWFzdCB3b3JrIGFnYWluKS4KCjkuICBOZXcgT2JqZWN0IE9yaWVudGVkIFRjbCBpbnRlcmZhY2UgYWRkZWQuCgoxMC4gQnVnIGZpeGVzIHRvIFBlcmw1IHNoYWRvdyBjbGFzc2VzLgoKMTEuIENsZWFuZWQgdXAgbWFueSBvZiB0aGUgaW50ZXJuYWwgbW9kdWxlcyBvZiB0aGUgcGFyc2VyLgoKMTIuIFRvbnMgb2YgZXhhbXBsZXMgYW5kIHRlc3RpbmcgbW9kdWxlcyBhZGRlZC4KCjEzLiBGaXhlZCBidWdzIHJlbGF0ZWQgdG8gdXNlIG9mICJjb25zdCIgcmV0dXJuIHZhbHVlcy4KCjE0LiBGaXhlZCBidWcgd2l0aCBDKysgbWVtYmVyIGZ1bmN0aW9ucyByZXR1cm5pbmcgdm9pZCAqLgoKMTUuIENoYW5nZWQgU1dJRyBjb25maWd1cmF0aW9uIHNjcmlwdC4KClZlcnNpb24gMS4xIEJldGEyIChEZWNlbWJlciAzLCAxOTk2KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjEuIENvbXBsZXRlbHkgcmV3cm90ZSB0aGUgU1dJRyBkb2N1bWVudGF0aW9uIHN5c3RlbS4gIFRoZSBjaGFuZ2VzCiAgIGludm9sdmVkIGFyZSB0b28gbnVtZXJvdXMgdG8gbWVudGlvbi4gIEJhc2ljYWxseSwgdGFrZSBldmVyeXRoaW5nCiAgIHlvdSBrbmV3IGFib3V0IHRoZSBvbGQgc3lzdGVtLCB0aHJvdyB0aGVtIG91dCwgYW5kIHJlYWQgdGhlCiAgIGZpbGUgRG9jL2RvYy5wcy4KCjIuIExpbWl0ZWQgc3VwcG9ydCBmb3IgI2lmIGRlZmluZWQoKSBhZGRlZC4KCjMuIFR5cGUgY2FzdHMgYXJlIG5vdyBhbGxvd2VkIGluIGNvbnN0YW50IGV4cHJlc3Npb25zLiAgaWUKCiAgICAgICAgICNkZWZpbmUgIEEgICAoaW50KSAzCgo0LiBBZGRlZCBzdXBwb3J0IGZvciB0eXBlZGVmIGxpc3RzLiAgRm9yIGV4YW1wbGUgOgoKCXR5cGVkZWYgc3RydWN0IHsKCSAgICAgICAgZG91YmxlIHgseSx6OwogICAgICAgIH0gVmVjdG9yLCAqVmVjdG9yUHRyOwoKNS4gTmV3IFNXSUcgZGlyZWN0aXZlcyAocmVsYXRlZCB0byBkb2N1bWVudGF0aW9uIHN5c3RlbSkKCgklc3R5bGUKCSVsb2NhbHN0eWxlCgklc3Vic2VjdGlvbgoJJXN1YnN1YnNlY3Rpb24KCjYuIFJlb3JnYW5pemVkIHRoZSBDKysgaGFuZGxpbmcgYW5kIG1hZGUgaXQgYSBsaXR0bGUgZWFzaWVyIHRvCiAgIHdvcmsgd2l0aCBpbnRlcm5hbGx5LgoKNy4gIEZpeGVkIHByb2JsZW0gd2l0aCBpbmhlcml0aW5nIGRhdGEgbWVtYmVycyBpbiBQeXRob24KICAgIHNoYWRvdyBjbGFzc2VzLgoKOC4gIEZpeGVkIHN5bWJvbCB0YWJsZSBwcm9ibGVtcyB3aXRoIHNoYWRvdyBjbGFzc2VzIGluIGJvdGgKICAgIFB5dGhvbiBhbmQgUGVybC4KCjkuICBGaXhlZCBhbm5veWluZyBzZWdtZW50YXRpb24gZmF1bHQgYnVnIGluIHdyYXBwZXIgY29kZQogICAgZ2VuZXJhdGVkIGZvciBQZXJsNS4KCjEwLiBGaXhlZCBidWcgd2l0aCAlYWRkbWV0aG9kcyBkaXJlY3RpdmUuICBOb3cgaXQgY2FuIGJlIHBsYWNlZAogICAgYW55d2hlcmUgaW4gYSBjbGFzcy4KCjExLiBNb3JlIHRlc3QgY2FzZXMgYWRkZWQgdG8gdGhlIFNXSUcgc2VsZi10ZXN0LiAgIERvY3VtZW50YXRpb24KICAgIHRlc3RzIGFyZSBub3cgcGVyZm9ybWVkIGFsb25nIHdpdGggb3RoZXIgdGhpbmdzLgoKMTIuIFJlb3JnYW5pemVkIHRoZSBTV0lHIGxpYnJhcnkgYSBsaXR0bGUgYml0IGFuZCBzZXQgaXQgdXAgdG8KICAgIHNlbGYtZG9jdW1lbnQgaXRzZWxmIHVzaW5nIFNXSUcuCgoxMy4gTG90cyBhbmQgbG90cyBvZiBtaW5vciBidWcgZml4ZXMgKG1vc3RseSBvYnNjdXJlLCBidXQgYnVncwogICAgbm9uZXRoZWxlc3MpLgoKClZlcnNpb24gMS4xIEJldGExIChPY3RvYmVyIDMwLCAxOTk2KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjEuIEFkZGVkIG5ldyAlZXh0ZXJuIGRpcmVjdGl2ZSBmb3IgaGFuZGxpbmcgbXVsdGlwbGUgZmlsZXMKCjIuIFBlcmw1IHNoYWRvdyBjbGFzc2VzIGFkZGVkCgozLiBSZXdyb3RlIGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uIHRvIHdvcmsgYmV0dGVyCgo0LiBBZGRlZCAnYm9vbCcgZGF0YXR5cGUKCjUuICV7LCV9IGJsb2NrIGlzIG5vdyBvcHRpb25hbC4KCjYuIEZpeGVkIHNvbWUgYnVncyBpbiB0aGUgUHl0aG9uIHNoYWRvdyBjbGFzcyBtb2R1bGUKCjcuIFJld3JvdGUgYWxsIG9mIHRoZSBTV0lHIHRlc3RzIHRvIGJlIG1vcmUgaW5mb3JtYXRpdmUKICAgKGFuZCBsZXNzIHNjYXJ5KS4KCjguIFJld3JvdGUgcGFyYW1ldGVyIGxpc3QgaGFuZGxpbmcgdG8gYmUgbW9yZSBtZW1vcnkKICAgZWZmaWNpZW50IGFuZCBmbGV4aWJsZS4KCjkuIENoYW5nZWQgcGFyc2VyIHRvIGlnbm9yZSAnc3RhdGljJyBkZWNsYXJhdGlvbnMuCgoxMC4gSW5pdGlhbGl6ZXJzIGFyZSBub3cgaWdub3JlZC4gIEZvciBleGFtcGxlIDoKCglzdHJ1Y3QgRm9vQmFyIGEgPSB7Myw0LDV9OwoKMTEuIFNvbWV3aGF0IGJldHRlciBwYXJzaW5nIG9mIGFycmF5cyAoYWx0aG91Z2ggaXQncwogICAgdXN1YWxseSBqdXN0IGEgYmV0dGVyIGVycm9yIG1lc3NhZ2Ugbm93KS4KCjEyLiBMb3QncyBvZiBtaW5vciBidWcgZml4ZXMuCgoKVmVyc2lvbiAxLjAgRmluYWwgKEF1Z3VzdCAzMSwgMTk5NikKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjEuIEZpeGVkIG1pbm9yIGJ1ZyBpbiBDKysgbW9kdWxlCgoyLiBGaXhlZCBtaW5vciBidWcgaW4gcG9pbnRlciB0eXBlLWNoZWNrZXIgd2hlbiB1c2luZwogICAtREFMTE9XX05VTEwuCgozLiBGaXhlZCBjb25maWd1cmUgc2NyaXB0IHRvIHdvcmsgd2l0aCBQeXRob24gMS40YmV0YTMKCjQuIENoYW5nZWQgY29uZmlndXJlIHNjcmlwdCB0byBhbGxvdyBjb21waWxhdGlvbiB3aXRob3V0CiAgIHlhY2Mgb3IgYmlzb24uCgpWZXJzaW9uIDEuMCBGaW5hbCAoQXVndXN0IDI4LCAxOTk2KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMS4gIENoYW5nZWQgcGFyc2VyIHRvIHN1cHBvcnQgbW9yZSBDL0MrKyBkYXRhdHlwZXMgKHdlbGwsCiAgICBtb3JlIHZhcmlhbnRzKS4gICBUeXBlcyBsaWtlICJ1bnNpZ25lZCIsICJzaG9ydCBpbnQiLAogICAgImxvbmcgaW50IiwgZXRjLi4uIG5vdyB3b3JrLgoKMi4gICJ1bmlvbnMiIGFkZGVkIHRvIHBhcnNlci4KCjMuICBVc2Ugb2YgInR5cGVkZWYiIGFzIGluIDoKCgl0eXBlZGVmIHN0cnVjdCB7CgkgICAgIGRvdWJsZSB4LHksejsKCX0gVmVjdG9yOwoKICAgIE5vdyB3b3JrcyBjb3JyZWN0bHkuICAgVGhlIG5hbWUgb2YgdGhlIHR5cGVkZWYgaXMgdXNlZCBhcwogICAgdGhlIHN0cnVjdHVyZSBuYW1lLgoKNC4gIENvbmRpdGlvbmFsIGNvbXBpbGF0aW9uIHdpdGggI2lmZGVmLCAjZWxzZSwgI2VuZGlmLCBldGMuLi4KICAgIGFkZGVkLgoKNS4gIE5ldyAlZGlzYWJsZWRvYywgJWVuYWJsZWRvYyBkaXJlY3RpdmVzIGFsbG93IGRvY3VtZW50YXRpb24KICAgIHRvIHNlbGVjdGl2ZWx5IGJlIGRpc2FibGVkIGZvciBjZXJ0YWluIHBhcnRzIG9mIGEgd3JhcHBlcgogICAgZmlsZS4KCjYuICBOZXcgUHl0aG9uIG1vZHVsZSBzdXBwb3J0cyBiZXR0ZXIgdmFyaWFibGUgbGlua2luZywgY29uc3RhbnRzLAogICAgYW5kIHNoYWRvdyBjbGFzc2VzLgoKNy4gIFBlcmw1IG1vZHVsZSBpbXByb3ZlZCB3aXRoIGJldHRlciBjb21wYXRpYmlsaXR5IHdpdGggWFMKICAgIGFuZCB4c3VicHAuICAgU1dJRyBwb2ludGVycyBhbmQgbm93IGNyZWF0ZWQgc28gdGhhdCB0aGV5CiAgICBhcmUgY29tcGF0aWJsZSB3aXRoIHhzdWJwcCBwb2ludGVycy4KCjguICBTdXBwb3J0IGZvciBbaW5jciBUY2xdIG5hbWVzcGFjZXMgYWRkZWQgdG8gVGNsIG1vZHVsZS4KCjkuICAlcHJhZ21hIGRpcmVjdGl2ZSBhZGRlZC4KCjEwLiAlYWRkbWV0aG9kcyBkaXJlY3RpdmUgYWRkZWQuCgoxMS4gJW5hdGl2ZSBkaXJlY3RpdmUgYWRkZWQgdG8gYWxsb3cgcHJlLWV4aXN0aW5nIHdyYXBwZXIgZnVuY3Rpb25zCiAgICB0byBiZSB1c2VkLgoKMTIuIFdyb3RlIGNvbmZpZ3VyZSBzY3JpcHQgZm9yIFNXSUcgaW5zdGFsbGF0aW9uLgoKMTMuIEZ1bmN0aW9uIHBvaW50ZXJzIG5vdyBhbGxvd2VkIHdpdGggdHlwZWRlZiBzdGF0ZW1lbnRzLgoKMTQuICV0eXBlZGVmIG1vZGlmaWVkIHRvIGluc2VydCBhIGNvcnJlc3BvbmRpbmcgQyB0eXBlZGVmIGludG8KICAgIHRoZSBvdXRwdXQgZmlsZS4KCjE1LiBGaXhlZCBzb21lIHByb2JsZW1zIHJlbGF0ZWQgdG8gQysrIHJlZmVyZW5jZXMuCgoxNi4gTmV3IFN0cmluZyBhbmQgV3JhcHBlckZ1bmN0aW9uIGNsYXNzZXMgYWRkIHRvIG1ha2UgZ2VuZXJhdGluZwogICAgd3JhcHBlciBjb2RlIGVhc2llci4KCjE3LiBGaXhlZCBjb21tYW5kIGxpbmUgb3B0aW9uIHByb2Nlc3NpbmcgdG8gZWxpbWluYXRlIGNvcmUgZHVtcHMKICAgIGFuZCB0byBhbGxvdyBoZWxwIG1lc3NhZ2VzLgoKMTguIExvdCdzIG9mIG1pbm9yIGJ1ZyBmaXhlcyB0byBhbG1vc3QgYWxsIGNvZGUgbW9kdWxlcwoKClZlcnNpb24gMS4wIEJldGEgMyAoUGF0Y2ggMSkgSnVseSAxNywgMTk5Ngo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjEuMCBGaW5hbCBpcyBub3QgcXVpdGUgcmVhZHkgeWV0LCBidXQgdGhpcyByZWxlYXNlIGZpeGVzIGEKbnVtYmVyIG9mIGltbWVkaWF0ZSBwcm9ibGVtcyA6CgoxLiAgQ29tcGlsZXIgZXJyb3JzIHdoZW4gdXNpbmcgLXN0cmljdCAxIHR5cGUgY2hlY2tpbmcgaGF2ZSBiZWVuIGZpeGVkLgoKMi4gIFBvaW50ZXIgdHlwZSBjaGVja2VyIG5vdyByZWNvZ25pemVzIHBvaW50ZXJzIG9mIHRoZSBmb3JtCiAgICBfMF9UeXBlIGNvcnJlY3RseS4KCjMuICBBIGZldyBtaW5vciBmaXhlcyB3ZXJlIG1hZGUgaW4gdGhlIE1ha2VmaWxlCgpWZXJzaW9uIDEuMCBCZXRhIDMgKEp1bmUgMTQsIDE5OTYpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCgpUaGVyZSBhcmUgbG90cyBvZiBjaGFuZ2VzIGluIHRoaXMgcmVsZWFzZSA6CgoxLiAgU1dJRyBpcyBub3cgaW52b2tlZCB1c2luZyB0aGUgInN3aWciIGNvbW1hbmQgaW5zdGVhZCBvZiAid3JhcCIuCiAgICBIZXksIHN3aWcgc291bmRzIGNvb2xlci4KCjIuICBUaGUgU1dJR19MSUIgZW52aXJvbm1lbnQgdmFyaWFibGUgY2FuIGJlIHNldCB0byBjaGFuZ2UgdGhlCiAgICBsb2NhdGlvbiB3aGVyZSBTV0lHIGxvb2tzIGZvciBsaWJyYXJ5IGZpbGVzLgoKMy4gIEMrKyBzdXBwb3J0IGhhcyBiZWVuIGFkZGVkLiAgIFlvdSBzaG91bGQgdXNlIHRoZSAtYysrIG9wdGlvbgogICAgdG8gZW5hYmxlIGl0LgoKNC4gIFRoZSAlaW5pdCBkaXJlY3RpdmUgaGFzIGJlZW4gcmVwbGFjZWQgYnkgdGhlICVtb2R1bGUgZGlyZWN0aXZlLgogICAgJW1vZHVsZSBjb25zdHJ1Y3RzIGEgdmFsaWQgbmFtZSBmb3IgdGhlIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uCiAgICBmb3Igd2hhdGV2ZXIgdGFyZ2V0IGxhbmd1YWdlIHlvdSdyZSB1c2luZyAoYWN0dWFsbHkgdGhpcyBtYWtlcwogICAgU1dJRyBmaWxlcyBhIGxpdHRsZSBjbGVhbmVyKS4gIFRoZSBvbGQgJWluaXQgZGlyZWN0aXZlIHN0aWxsIHdvcmtzLgoKNS4gIFRoZSBzeW50YXggb2YgdGhlICVuYW1lIGRpcmVjdGl2ZSBoYXMgYmVlbiBjaGFuZ2VkLiAgIFVzZSBvZiB0aGUKICAgIG9sZCBvbmUgc2hvdWxkIGdlbmVyYXRlIGEgd2FybmluZyBtZXNzYWdlLCBidXQgbWF5IHN0aWxsIHdvcmsuCgo2LiAgVG8gc3VwcG9ydCBUY2wvVGsgb24gbm9uLXVuaXggcGxhdGZvcm1zLCBTV0lHIGltcG9ydHMgYSBmaWxlIGNhbGxlZAogICAgc3dpZ3RjbC5jZmcgZnJvbSB0aGUgJChTV0lHX0xJQikvdGNsIGRpcmVjdG9yeS4gICBJIGRvbid0IGhhdmUgYWNjZXNzCiAgICB0byBhbiBOVCBtYWNoaW5lLCBidXQgdGhpcyBmaWxlIGlzIHN1cHBvc2VkbHkgYWxsb3dzIFNXSUcgdG8KICAgIHByb2R1Y2Ugd3JhcHBlciBjb2RlIHRoYXQgY29tcGlsZXMgb24gYm90aCBVTklYIGFuZCBub24gVU5JWCBtYWNoaW5lcy4KICAgIElmIHRoaXMgZG9lc24ndCB3b3JrLCB5b3UnbGwgaGF2ZSB0byBlZGl0IHRoZSBmaWxlIHN3aWd0Y2wuY2ZnLiBQbGVhc2UKICAgIGxldCBtZSBrbm93IGlmIHRoaXMgZG9lc24ndCB3b3JrIHNvIEkgY2FuIHVwZGF0ZSB0aGUgZmlsZSBhcwogICAgbmVjZXNzYXJ5LgoKNy4gIFRoZSBTV0lHIHJ1bi10aW1lIHR5cGVjaGVja2VyIGhhcyBiZWVuIGltcHJvdmVkLiAgICBZb3UgY2FuIGFsc28KICAgIG5vdyByZWRlZmluZSBob3cgaXQgd29ya3MgYnkgc3VwcGx5aW5nIGEgZmlsZSBjYWxsZWQgInN3aWdwdHIuY2ZnIgogICAgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIHlvdXIgU1dJRyBpbnRlcmZhY2UgZmlsZXMuICAgQnkgZGVmYXVsdCwKICAgIFNXSUcgcmVhZHMgdGhpcyBmaWxlIGZyb20gJChTV0lHX0xJQikvY29uZmlnLgoKOC4gIFRoZSBkb2N1bWVudGF0aW9uIHN5c3RlbSBoYXMgYmVlbiBjaGFuZ2VkIHRvIHN1cHBvcnQgdGhlIGZvbGxvd2luZyA6CgoJLSAgRG9jdW1lbnRhdGlvbiBvcmRlciBpcyBwcmludGVkIGluIGludGVyZmFjZSBmaWxlIG9yZGVyIGJ5CiAgICAgICAgICAgZGVmYXVsdC4gICBUaGlzIGNhbiBiZSBvdmVycmlkZGVuIGJ5IHB1dHRpbmcgYW4gJWFscGhhCiAgICAgICAgICAgZGlyZWN0aXZlIGluIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGludGVyZmFjZSBmaWxlLgoKICAgICAgICAtICBZb3UgY2FuIHN1cHBseSBhZGRpdGlvbmFsIGRvY3VtZW50YXRpb24gdGV4dCB1c2luZwoKICAgICAgICAgICAldGV4dCAleyBwdXQgeW91ciB0ZXh0IGhlcmUgJX0KCiAgICAgICAgLSAgQSBmZXcgbWlub3IgYnVncyB3ZXJlIGZpeGVkLgoKOS4gIEEgZmV3IGltcHJvdmVtZW50cyBoYXZlIGJlZW4gbWFkZSB0byB0aGUgaGFuZGxpbmcgb2YgY29tbWFuZCBsaW5lCiAgICBvcHRpb25zIChidXQgaXQncyBzdGlsbCBub3QgZmluaXNoZWQpLgoKMTAuICBMb3RzIG9mIG1pbm9yIGJ1ZyBmaXhlcyBpbiBtb3N0IG9mIHRoZSBsYW5ndWFnZSBtb2R1bGVzIGhhdmUgYmVlbgogICAgIG1hZGUuCgoxMS4gRmlsZW5hbWVzIGhhdmUgYmVlbiBjaGFuZ2VkIHRvIDguMyBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIGEgU1dJRwogICAgcG9ydCB0byBub24tdW5peCBwbGF0Zm9ybXMgKHdvcmsgaW4gcHJvZ3Jlc3MpLgoKMTIuIEMrKyBmaWxlIHN1ZmZpeCBpcyBub3cgLmN4eCAoZm9yIHNhbWUgcmVhc29uKS4KCjEzLiBUaGUgZG9jdW1lbnRhdGlvbiBoYXMgYmVlbiB1cGdyYWRlZCBzaWduaWZpY2FudGx5IGFuZCBpcyBub3cKICAgIGFyb3VuZCAxMDAgcGFnZXMuICAgIEkgYWRkZWQgbmV3IGV4YW1wbGVzIGFuZCBhIHNlY3Rpb24gb24KICAgIEMrKy4gIFRoZSBkb2N1bWVudGF0aW9uIG5vdyBpbmNsdWRlcyBhIFRhYmxlIG9mIENvbnRlbnRzLgoKMTQuIFRoZSBTV0lHIEV4YW1wbGVzIGRpcmVjdG9yeSBpcyBzdGlsbCB3b2VmdWxseSBzcGFyc2UsIGJ1dCBpcwogICAgZ2V0dGluZyBiZXR0ZXIuCgpTcGVjaWFsIG5vdGljZSBhYm91dCBDKysKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClRoaXMgaXMgdGhlIGZpcnN0IHZlcnNpb24gb2YgU1dJRyB0byBzdXBwb3J0IEMrKyBwYXJzaW5nLiAgQ3VycmVudGx5CnRoZSBDKysgaXMgZmFyIGZyb20gY29tcGxldGUsIGJ1dCBzZWVtcyB0byB3b3JrIGZvciBzaW1wbGUgY2FzZXMuCk5vIHdvcmsgaGFzIGJlZW4gZG9uZSB0byBhZGQgc3BlY2lhbCBDKysgcHJvY2Vzc2luZyB0byBhbnkgb2YKdGhlIHRhcmdldCBsYW5ndWFnZXMuICAgU2VlIHRoZSB1c2VyIG1hbnVhbCBmb3IgZGV0YWlscyBhYm91dCBob3cKQysrIGlzIGhhbmRsZWQuICAgSWYgeW91IGZpbmQgcHJvYmxlbXMgd2l0aCB0aGUgQysrIGltcGxlbWVudGF0aW9uLApwbGVhc2UgbGV0IG1lIGtub3cuICBFeHBlY3QgbWFqb3IgaW1wcm92ZW1lbnRzIGluIHRoaXMgYXJlYS4KCk5vdGUgOiBJIGhhdmUgb25seSBzdWNjZXNzZnVsbHkgdXNlZCBTV0lHIGFuZCBDKysgd2l0aCBUY2wgYW5kClB5dGhvbi4KCk5vdGljZSBhYm91dCBWZXJzaW9uIDEuMEZpbmFsCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpWZXJzaW9uIDEuMEIzIGlzIHRoZSBsYXN0IEJldGEgcmVsZWFzZSBiZWZvcmUgdmVyc2lvbiAxLjAgRmluYWwgaXMKcmVsZWFzZWQuICBJIGhhdmUgZnJvemVuIHRoZSBsaXN0IG9mIGZlYXR1cmVzIHN1cHBvcnRlZCBpbiB2ZXJzaW9uIDEuMAphbmQgd2lsbCBvbmx5IGZpeCBidWdzIGFzIHRoZXkgc2hvdyB1cC4gIFdvcmsgb24gU1dJRyB2ZXJzaW9uIDIuMCBpcwphbHJlYWR5IGluIHByb2dyZXNzLCBidXQgaXMgZ29pbmcgdG8gcmVzdWx0IGluIHJhdGhlciBzaWduaWZpY2FudApjaGFuZ2VzIHRvIFNXSUcncyBpbnRlcm5hbCBzdHJ1Y3R1cmUgKGhvcGVmdWxseSBmb3IgdGhlIGJldHRlcikuICBObwphbnRpY2lwYXRlZCBkYXRlIGZvciB2ZXJzaW9uIDIuMCBpcyBzZXQsIGJ1dCBpZiB5b3UndmUgZ290IGFuIGlkZWEsCmxldCBtZSBrbm93LgoKVmVyc2lvbiAxLjAgQmV0YSAyIChBcHJpbCAyNiwgMTk5NikKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KClRoaXMgcmVsZWFzZSBpcyBpZGVudGljYWwgdG8gQmV0YTEgZXhjZXB0IGEgZmV3IG1pbm9yIGJ1Z3MgYXJlCmZpeGVkIGFuZCB0aGUgU1dJRyBsaWJyYXJ5IGhhcyBiZWVuIHVwZGF0ZWQgdG8gd29yayB3aXRoIFRjbCA3LjUvVGsgNC4xLgpBIHRjbDcuNSBleGFtcGxlcyBkaXJlY3RvcnkgaXMgbm93IGluY2x1ZGVkLgoKLSBGaXhlZCBhIGJ1ZyBpbiB0aGUgTWFrZWZpbGUgdGhhdCBkaWRuJ3QgaW5zdGFsbCB0aGUgbGlicmFyaWVzCiAgY29ycmVjdGx5LgoKLSBTV0lHIExpYnJhcnkgZmlsZXMgYXJlIG5vdyB1cGRhdGVkIHRvIHdvcmsgd2l0aCBUY2wgNy41IGFuZCBUayA0LjEuCgotIE1pbm9yIGJ1ZyBmaXhlcyBpbiBvdGhlciBtb2R1bGVzLgoKClZlcnNpb24gMS4wIEJldGEgMSAgKEFwcmlsIDEwLCAxOTk2KS4KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKVGhpcyBpcyB0aGUgZmlyc3QgInNlbWktb2ZmaWNpYWwiIHJlbGVhc2Ugb2YgU1dJRy4gICAgSXQgaGFzIGEKbnVtYmVyIG9mIHN1YnN0YW50aWFsIGltcHJvdmVtZW50cyBvdmVyIHRoZSBBbHBoYSByZWxlYXNlLiAgIFRoZXNlCm5vdGVzIGFyZSBpbiBubyBwYXJ0aWN1bGFyIG9yZGVyLS1ob3BlIEkgcmVtZW1iZXJlZCBldmVyeXRoaW5nLi4uLgoKMS4gIFRjbC9UawoKU1dJRyBpcyBrbm93biB0byB3b3JrIHdpdGggVGNsNy4zLCBUazMuNiBhbmQgbGF0ZXIgdmVyc2lvbnMuCkkndmUgYWxzbyB0ZXN0ZWQgU1dJRyB3aXRoIGV4cGVjdC01LjE5LgoKTm9ybWFsbHkgU1dJRyBleHBlY3RzIHRvIHVzZSB0aGUgaGVhZGVyIGZpbGVzICJ0Y2wuaCIgYW5kICJ0ay5oIi4KTmV3ZXIgdmVyc2lvbnMgb2YgVGNsL1RrIHVzZSB2ZXJzaW9uIG51bWJlcnMuICAgWW91IGNhbiBzcGVjaWZ5IHRoZXNlCmluIFNXSUcgYXMgZm9sbG93cyA6CgogICAgICAgICUgd3JhcCAtaHRjbCB0Y2w3LjQuaCAtaHRrIHRrNC4wLmggZXhhbXBsZS5pCgpPZiBjb3Vyc2UsIEkgcHJlZmVyIHRvIHNpbXBseSBzZXQgdXAgc3ltYm9saWMgbGlua3MgYmV0d2VlbiAidGNsLmgiIGFuZAp0aGUgbW9zdCByZWNlbnQgc3RhYmxlIHZlcnNpb24gb24gdGhlIG1hY2hpbmUuCgoyLiAgUGVybDQKClRoaXMgaW1wbGVtZW50YXRpb24gaGFzIGJlZW4gYmFzZWQgb24gUGVybC00LjAzNS4gIFNXSUcncyBpbnRlcmZhY2UgdG8KUGVybDQgaXMgYmFzZWQgb24gdGhlIGRvY3VtZW50YXRpb24gcHJvdmlkZWQgaW4gdGhlICJQcm9ncmFtbWluZyBQZXJsIgpib29rIGJ5IExhcnJ5IFdhbGwsIGFuZCBmaWxlcyBsb2NhdGVkIGluIHRoZSAidXN1YiIgZGlyZWN0b3J5IG9mIHRoZQpQZXJsNCBkaXN0cmlidXRpb24uCgpJbiBvcmRlciB0byBjb21waWxlIHdpdGggUGVybDQsIHlvdSdsbCBuZWVkIHRvIGxpbmsgd2l0aCB0aGUgdXBlcmwubwpmaWxlIGZvdW5kIGluIHRoZSBQZXJsNCBzb3VyY2UgZGlyZWN0b3J5LiAgWW91IG1heSB3YW50IHRvIG1vdmUgdGhpcwpmaWxlIHRvIGEgbW9yZSBjb252ZW5pZW50IGxvY2F0aW9uLgoKMy4gIFBlcmw1CgpUaGlzIGlzIGEgc29tZXdoYXQgZXhwZXJpbWVudGFsIGltcGxlbWVudGF0aW9uLCBidXQgaXMgYWxvdCBsZXNzCmJ1Z2d5IHRoYW4gdGhlIGFscGhhIHJlbGVhc2UuICAgICBTV0lHIG9wZXJhdGVzIGluZGVwZW5kZW50bHkgb2YKdGhlIFhTIGxhbmd1YWdlIGFuZCB4c3VicHAgc3VwcGxpZWQgd2l0aCBQZXJsNS4gIEN1cnJlbnRseSBTV0lHCnByb2R1Y2VzIHRoZSBuZWNlc3NhcnkgQyBjb2RlIGFuZCAucG0gZmlsZSBuZWVkZWQgdG8gZHluYW1pY2FsbHkKbG9hZCBhIG1vZHVsZSBpbnRvIFBlcmw1LgoKVG8gc3VwcG9ydCBQZXJsNSdzIG5vdGlvbiBvZiBtb2R1bGVzIGFuZCBwYWNrYWdlcyAoYXMgd2l0aCB4c3VicHApLAp5b3UgY2FuIHVzZSB0aGUgZm9sbG93aW5nIGNvbW1hbmQgbGluZSBvcHRpb25zIDoKCiAgICAgICAgJSB3cmFwIC1wZXJsNSAtbW9kdWxlIE15TW9kdWxlIC1wYWNrYWdlIE15UGFja2FnZSBleGFtcGxlLmkKCk5vdGUgOiBJbiBvcmRlciBmb3IgZHluYW1pYyBsb2FkaW5nIHRvIGJlIGVmZmVjdGl2ZSwgeW91IG5lZWQgdG8gYmUKY2FyZWZ1bCBhYm91dCBuYW1pbmcuICAgIEZvciBhIG1vZHVsZSBuYW1lZCAiTXlNb2R1bGUiLCB5b3UnbGwgbmVlZCB0bwpjcmVhdGUgYSBzaGFyZWQgb2JqZWN0IGZpbGUgY2FsbGVkICJNeU1vZHVsZS5zbyIgdXNpbmcgc29tZXRoaW5nIGxpa2UKCiAgICAgICAgJSBsZCAtc2hhcmVkIG15X29iai5vIC1vIE15TW9kdWxlLnNvCgpUaGUgdXNlIG9mIHRoZSAlaW5pdCBkaXJlY3RpdmUgbXVzdCBtYXRjaCB0aGUgbW9kdWxlIG5hbWUgc2luY2UgUGVybDUKY2FsbHMgYSBmdW5jdGlvbiAiYm9vdF9Nb2R1bGVOYW1lIiBpbiBvcmRlciB0byBpbml0aWFsaXplIHRoaW5ncy4KU2VlIHRoZSBFeGFtcGxlcyBkaXJlY3RvcnkgZm9yIHNvbWUgZXhhbXBsZXMgb2YgaG93IHRvIGdldCB0aGluZ3MKdG8gd29yay4KCjQuICBQeXRob24xLjMKClRoaXMgaXMgdGhlIGZpcnN0IHJlbGVhc2Ugc3VwcG9ydGluZyBQeXRob24uICAgIFRoZSBQeXRob24gcG9ydCBpcwpleHBlcmltZW50YWwgYW5kIG1heSBiZSByZXdyaXR0ZW4uICAgVmFyaWFibGUgbGlua2FnZSBpcyBkb25lIHRocm91Z2gKZnVuY3Rpb25zIHdoaWNoIGlzIHNvcnQgb2YgYSBrbHVkZ2UuICBJIGFsc28gdGhpbmsgaXQgd291bGQgYmUgbmljZQp0byBpbXBvcnQgU1dJRyBwb2ludGVycyBpbnRvIFB5dGhvbiBhcyBhIG5ldyBvYmplY3QgKGluc3RlYWQgb2Ygc3RyaW5ncykuCk9mIGNvdXJzZSwgdGhpcyBuZWVkcyBhIGxpdHRsZSBtb3JlIHdvcmsuCgo1LiAgR3VpbGUzCgpJZiB5b3UgcmVhbGx5IHdhbnQgdG8gbGl2ZSBvbiB0aGUgZWRnZSwgcGljayB1cCBhIGNvcHkgb2YgR3VpbGUtaWlpIGFuZApwbGF5IGFyb3VuZCB3aXRoIHRoaXMuICAgICAgVGhpcyBpcyBoaWdobHkgZXhwZXJpbWVudGFsLS0tZXNwZWNpYWxseSBzaW5jZQpJJ20gbm90IHN1cmUgd2hhdCB0aGUgb2ZmaWNpYWwgc3RhdGUgb2YgR3VpbGUgaXMgdGhlc2UgZGF5cy4gIFRoaXMKaW1wbGVtZW50YXRpb24gbWF5IGNoYW5nZSBhdCBhbnkgdGltZSBzaG91bGQgSSBzdWRkZW5seSBmaWd1cmUgb3V0IGJldHRlcgp3YXlzIHRvIGRvIHRoaW5ncy4KCjYuICBFeHRlbmRpbmcgU1dJRwoKU1dJRyBpcyB3cml0dGVuIGluIEMrKyBhbHRob3VnaCBJIHRlbmQgdG8gdGhpbmsgb2YgdGhlIGNvZGUgYXMgbW9zdGx5CmJlaW5nIEFOU0kgQyB3aXRoIGEgbGl0dGxlIGluaGVyaXRhbmNlIHRocm93biBpbi4gICBFYWNoIHRhcmdldCBsYW5ndWFnZQppcyBpbXBsZW1lbnRlZCBhcyBhIEMrKyBjbGFzcyB0aGF0IGNhbiBiZSBwbHVnZ2VkIGludG8gdGhlIHN5c3RlbS4KSWYgeW91IHdhbnQgdG8gYWRkIHlvdXIgb3duIG1vZGlmaWNhdGlvbnMsIHNlZSBBcHBlbmRpeCBDIG9mIHRoZSB1c2VyCm1hbnVhbC4gICBUaGVuIHRha2UgYSBsb29rIGF0IHRoZSAidXNlciIgZGlyZWN0b3J5IHdoaWNoIGNvbnRhaW5zIHNvbWUKY29kZSBmb3IgYnVpbGRpbmcgeW91ciBvd24gZXh0ZW5pb25zLgoKNy4gVGhlIFNXSUcgbGlicmFyeQoKVGhlIFNXSUcgbGlicmFyeSBpcyBzdGlsbCBpbmNvbXBsZXRlLiAgU29tZSBvZiB0aGUgZmlsZXMgbWVudGlvbmVkIGluCnRoZSB1c2VyIG1hbnVhbCBhcmUgdW5hdmFpbGFibGUuICAgIFRoZXNlIGZpbGVzIHdpbGwgYmUgbWFkZSBhdmFpbGFibGUKd2hlbiB0aGV5IGFyZSByZWFkeS4gICBTdWJzY3JpYmUgdG8gdGhlIFNXSUcgbWFpbGluZyBsaXN0IGZvciBhbm5vdW5jZW1lbnRzCmFuZCB1cGRhdGVzLgoKOC4gU1dJRyBEb2N1bWVudGF0aW9uCgpJIGhhdmUgc29tZXRpbWVzIGV4cGVyaWVuY2VkIHByb2JsZW1zIHZpZXdpbmcgdGhlIFNXSUcgZG9jdW1lbnRhdGlvbiBpbgpzb21lIHBvc3RzY3JpcHQgdmlld2Vycy4gICBIb3dldmVyLCB0aGUgZG9jdW1lbnRhdGlvbiBzZWVtcyB0byBwcmludApub3JtYWxseS4gICAgSSdtIHdvcmtpbmcgb24gbWFraW5nIG11Y2ggb2YgdGhlIGRvY3VtZW50YXRpb24gb25saW5lLApidXQgdGhpcyB0YWtlcyB0aW1lLgoKVmVyc2lvbiAwLjEgQWxwaGEgKEZlYnJ1YXJ5IDksIDE5OTYpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMS4gIFJ1bi10aW1lIHR5cGUtY2hlY2tpbmcgb2YgU1dJRyBwb2ludGVycy4gICBQb2ludGVycyBhcmUgbm93IHJlcHJlc2VudGVkCiAgICBhcyBzdHJpbmdzIHdpdGggYm90aCBudW1lcmljIGFuZCBlbmNvZGVkIHR5cGUgaW5mb3JtYXRpb24uICAgIFRoaXMgbWFrZXMKICAgIGl0IGEgbGl0dGxlIGhhcmRlciB0byBzaG9vdCB5b3Vyc2VsZiBpbiB0aGUgZm9vdCAoYW5kIGl0IGVsaW1pbmF0ZXMKICAgIHNvbWUgc2VnbWVudGF0aW9uIGZhdWx0cyBhbmQgb3RoZXIgb2RkaXRpZXMpLgoKMi4gIFB5dGhvbiAxLjMgbm93IHN1cHBvcnRlZC4KCjMuICAjZGVmaW5lIGFuZCBlbnVtIGNhbiBiZSB1c2VkIHRvIGluc3RhbGwgY29uc3RhbnRzLgoKNC4gIENvbXBsZXRlbHkgcmV3cm90ZSB0aGUgJWluY2x1ZGUgZGlyZWN0aXZlIGFuZCBtYWRlIGl0IGFsb3QgbW9yZSBwb3dlcmZ1bC4KCjUuICBSZXN0cnVjdHVyZWQgdGhlIFNXSUcgbGlicmFyeSB0byBtYWtlIGl0IHdvcmsgYmV0dGVyLgoKNi4gIFZhcmlvdXMgYnVnIGZpeGVzIHRvIFRjbCwgUGVybDQsIFBlcmw1LCBhbmQgR3VpbGUgaW1wbGVtZW50YXRpb25zLgoKNy4gIEJldHRlciBpbXBsZW1lbnRhdGlvbiBvZiAldHlwZWRlZiBkaXJlY3RpdmUuCgo4LiAgTWFkZSBzb21lIGNoYW5nZXMgdG8gU1dJRydzIGNsYXNzIHN0cnVjdHVyZSB0byBtYWtlIGl0IGVhc2llciB0byBleHBhbmQuCiAgICBTV0lHIGlzIG5vdyBidWlsdCBpbnRvIGEgbGlicmFyeSBmaWxlIHRoYXQgeW91IGNhbiB1c2UgdG8gbWFrZSB5b3VyCiAgICBvd24gZXh0ZW5pb25zLgoKOS4gIE1hZGUgZXh0ZW5zaXZlIGNoYW5nZXMgdG8gdGhlIGRvY3VtZW50YXRpb24uCgoxMC4gTWlub3IgY2hhbmdlcyB0byB0aGUgU1dJRyBwYXJzZXIgdG8gbWFrZSBpdCB1c2UgbGVzcyBtZW1vcnkuCiAgICBBbHNvIHRvb2sgb3V0IHNvbWUgZXh0cmFuZW91cyBydWxlcyB0aGF0IHdlcmUgdW5kb2N1bWVudGVkIGFuZAogICAgZGlkbid0IHdvcmsgaW4gdGhlIGZpcnN0IHBsYWNlLgoKMTEuIFRoZSBTV0lHIGxpYnJhcnkgZmlsZXMgInRjbHNoIiwgIndpc2giLCAiZXhwZWN0IiwgZXRjLi4uIGluIHRoZSBmaXJzdAogICAgcmVsZWFzZSBoYXZlIGJlZW4gcmVzdHJ1Y3R1cmVkIGFuZCByZW5hbWVkIHRvICJ0Y2xzaC5pIiwgIndpc2guaSIsCiAgICBhbmQgc28gb24uCg==