PWhlYWQxIE5BTUUKCkNoYW5nZXMgLSBBcGFjaGUgbW9kX3BlcmwgY2hhbmdlcyBsb2dmaWxlCgo9aGVhZDEgQ0hBTkdFUwoKYWxsIGNoYW5nZXMgd2l0aG91dCBhdXRob3IgYXR0cmlidXRpb24gYXJlIGJ5IERvdWcgTWFjRWFjaGVybgoKQWxzbyByZWZlciB0byB0aGUgQXBhY2hlOjpUZXN0IGNoYW5nZXMgbG9nIGZpbGUsIGF0IEFwYWNoZS1UZXN0L0NoYW5nZXMKCj1vdmVyIDMKCj1pdGVtIDIuMC4xMS1yYzEKCkZpeCB1c2UtYWZ0ZXItZnJlZSBzZWdmYXVsdCBpbiBhcF9zZXJ2ZXJfY29uZmlnX2RlZmluZXMgc2VlbiBvbiBzdGFydC11cCBvbgpPcGVuQlNELiBbRm91bmQvZml4ZWQgYnkgU2FtIFZhdWdoYW4vSm9lIE9ydG9uXQoKRml4IGJ1aWxkIHdpdGggUGVybHMgZWFybGllciB0aGFuIDUuMTMuNi4gW1JhaW5lciBKdW5nCjxyYWluZXIuanVuZ0BraXBwZGF0YS5kZT5dCgpGaXggZmlsdGVyL2luX2Jic19pbmplY3RfaGVhZGVyLnQgdGVzdCBmYWlsdXJlIHdpdGggQXBhY2hlIDIuNC4yNSsuIFtTdGVmYW4KRnJpdHNjaCA8c2ZAc2ZyaXRzY2guZGU+XQoKRml4IGFwYWNoZS9yZWFkLnQgdGVzdCBmYWlsdXJlIHdpdGggQXBhY2hlIDIuNC4yNSsuIFtOaWtvIFR5bmkKPG50eW5pQGRlYmlhbi5vcmc+XQoKPWl0ZW0gMi4wLjEwIE9jdG9iZXIgMjcsIDIwMTYKCkRlY2xhcmUgTVBfdnRibF9lbnYgYW5kIE1QX3Z0YmxfZW52ZWxlbSBhcyAnZXh0ZXJuJyB0byBmaXggbGlua2VyIGVycm9ycyBvbgpPU1gvRGFyd2luLiBbTWljaGFlbCBTY2hvdXQgPG1zY2hvdXRAZ2tnLm5ldD5dCgpBdXRvbWF0aWNhbGx5IHNlbGVjdCB0aGUgYXBwcm9wcmlhdGUgYzg5IG9wdGlvbiB3aGVuIG1vZHBlcmwgaXMgYmVpbmcKYnVpbHQgd2l0aCBlaXRoZXIgZ2NjIDUgb3IgY2xhbmcuIFtLbGF1cyBTLiBNYWRzZW4gPGtzbUBqb2JpbmRleC5kaz5dCgpGaXggbm9uLXRocmVhZGVkIFBlcmwgNS4yMi54IGJ1aWxkIGFuZCB0ZXN0cy4gW0tsYXVzIFMuIE1hZHNlbgo8a3NtQGpvYmluZGV4LmRrPl0KCkFkZCBzdXBwb3J0IGZvciBQZXJsIDUuMjIueC4gW05pa28gVHluaSA8bnR5bmlAaWtpLmZpPiwgU3RldmUgSGF5XQoKPWl0ZW0gMi4wLjkgSnVuZSAxOCwgMjAxNQoKQWRkIG5vdGUgdG8gUkVBRE1FIGFib3V0IE1QX0lOTElORSBwcm9ibGVtIHdoZW4gYnVpbGRpbmcgd2l0aCBHQ0MgNS4KW05pa28gVHluaSA8bnR5bmlAZGViaWFuLm9yZz5dCgpGaXggdC9hcGkvYXBsb2cudCBmb3IgYXByLTEuNS4yLiBbU3RldmUgSGF5XQoKTm90ZSB0aGF0IFBlcmwgNS4yMi54IGlzIGN1cnJlbnRseSBub3Qgc3VwcG9ydGVkLiBUaGlzIGlzIGxvZ2dlZCBhcwpDUEFOIFJUIzEwMTk2MiBhbmQgd2lsbCBob3BlZnVsbHkgYmUgYWRkcmVzc2VkIGluIDIuMC4xMC4gW1N0ZXZlIEhheV0KCkZpeCB1bnRocmVhZGVkIGJ1aWxkLCB3aGljaCB3YXMgYnJva2VuIGluIDIuMC45LXJjMi4gW1N0ZXZlIEhheV0KClJlbW92ZSBQZXJsSW50ZXJwU2NvcGUuIFRoaXMgaGFzIG5vdCBiZWVuIHdvcmtpbmcgcHJvcGVybHkgd2l0aCB0aHJlYWRlZApNUE1zIHdpdGggaHR0cGQtMi40LnggYW5kIHRoZSB1c2UtY2FzZSBvZiB0aGlzIGRpcmVjdGl2ZSB3YXMgcXVlc3Rpb25hYmxlLgpbSmFuIEthbHV6YV0KCkFsbG93IHJ1bm5pbmcgdGhlIHRlc3Qgc3VpdGUgd2l0aCBodHRwZC0yLjQueCB3aGVuIG1vZF9hY2Nlc3NfY29tcGF0IGlzIG5vdApsb2FkZWQuIFtTdGV2ZSBIYXldCgpBZGQgc3VwcG9ydCBmb3IgQXBhY2hlIGh0dHBkLTIuNC54LiBbVG9yc3RlbiBGb2VydHNjaCwgSmFuIEthbHV6YSwKU3RldmUgSGF5LCBHb3plcl0KCkRvbid0IGNhbGwgbW9kcGVybF90aHJlYWRlZF9tcG0oKSBldCBhbC4gZnJvbSBYUyBjb2RlLiBGaXhlcyBEZWJpYW4gQnVnCiM3NjUxNzQuIFtOaWtvIFR5bmkgPG50eW5pQGRlYmlhbi5vcmc+XQoKTWFrZSBzdXJlIG1vZHBlcmxfaW50ZXJwX3NlbGVjdCB1c2VzIHItPnNlcnZlciByYXRoZXIgdGhhbiB0aGUgcGFzc2VkIHMKcGFyYW1ldGVyIHRvIGZpbmQgdGhlIGludGVycHJldGVyIHBvb2wgdG8gcHVsbCBhbiBpbnRlcnByZXRlciBmcm9tLiBUaGlzCmZpeGVzIGFuIGlzc3VlIHdpdGggdmhvc3RzIHdpdGggYSBzZXBhcmF0ZSBpbnRlcnByZXRlciBwb29sIGFuZCBydW50aW1lCmRpci1jb25maWcgbWVyZ2VzIHRoYXQgdXNlZCB0byBwdWxsIHRoZSBpbnRlcnByZXRlciBmcm9tIHRoZSB3cm9uZyBwb29sLgpbVG9yc3RlbiBGb2VydHNjaF0KClBlcmxJbnRlcnBTY29wZSBpcyBub3cgbW9yZSBhZHZpc29yeS4gVXNpbmcgJChjfHIpLT5wbm90ZXMgd2lsbCBiaW5kCnRoZSBjdXJyZW50IGludGVycHJldGVyIHRvIHRoYXQgb2JqZWN0IGZvciBpdCdzIGxpZmV0aW1lLgokKGN8ciktPnBub3Rlc19raWxsKCkgY2FuIGJlIHVzZWQgdG8gcHJlbWF0dXJlbHkgZHJvcCBwbm90ZXMgYW5kCnJlbW92ZSB0aGlzIGJpbmRpbmcuIFtUb3JzdGVuIEZvZXJ0c2NoXQoKTm93IGNvcnJlY3RseSBpbnZva2VzIFBlcmxDbGVhbnVwSGFuZGxlcnMsIGV2ZW4gaWYgdGhleSBhcmUgdGhlIG9ubHkKaGFuZGxlciB0eXBlIGNvbmZpZ3VyZWQgZm9yIHRoYXQgcmVxdWVzdCBbVG9yc3RlbiBGb2VydHNjaF0KCkZvciB0aHJlYWRlZCBNUE1zLCBjaGFuZ2UgaW50ZXJwcmV0ZXIgbWFuYWdtZW50IHRvIGEgbmV3LCByZWZlcmVuY2UtY291bnRlZAphbGxvY2F0aW9uIG1vZGVsLiBbVG9yc3RlbiBGb2VydHNjaF0KCkV4cG9zZSBtb2RwZXJsX2ludGVycF9wb29sX3QgdmlhIE1vZFBlcmw6OkludGVycFBvb2wsIG1vZHBlcmxfdGlwb29sX3QKdmlhIE1vZFBlcmw6OlRpUG9vbCBhbmQgbW9kcGVybF90aXBvb2xfY29uZmlnX3QgdmlhIE1vZFBlcmw6OlRpUG9vbENvbmZpZwpbVG9yc3RlbiBGb2VydHNjaF0KCkV4cG9zZSBtb2RwZXJsX2ludGVycF90IHZpYSBNb2RQZXJsOjpJbnRlcnByZXRlciBbVG9yc3RlbiBGb2VydHNjaF0KCkZpeCB0L2NvbXBhdC9hcGFjaGVfZmlsZS50IG9uIFdpbmRvd3MuIEFwYWNoZTo6RmlsZS0+dG1wZmlsZSgpIHdhbnRzIFRNUERJUgpvciBURU1QIGZyb20gdGhlIGVudmlyb25tZW50LCBvciBlbHNlIGRlZmF1bHRzIHRvIC90bXAuIFRoZSBsYXR0ZXIgaXMgbm8KZ29vZCBvbiBXaW5kb3dzLCBzbyBtYWtlIHN1cmUgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBhcmUgcGFzc2VkIHRocm91Z2guCihURU1QIHNob3VsZCBiZSBzZXQgdG8gc29tZXRoaW5nIHN1aXRhYmxlIG9uIFdpbmRvd3MuKSBbU3RldmUgSGF5XQoKRml4IHQvYXBpL2Vycl9oZWFkZXJzX291dC50IHdpdGggSFRUUDo6SGVhZGVycyA+IDYuMDAuIFtSb2xhbmRvCjxyb2xvc3dvcmxkQGdtYWlsLmNvbT5dCgpGaXggdGhlIGJ1aWxkIHdpdGggVkMrKyBhbmQgZG1ha2UgKHJhdGhlciB0aGFuIG5tYWtlKSBvbiBXaW5kb3dzLiBUaGUKTWFrZWZpbGUgZ2VuZXJhdGVkIGJ5IEFwYWNoZTI6OkJ1aWxkIHVzZXMgc2hlbGwgY29tbWFuZHMgZm9yIHRoZSBtYW5pZmVzdApmaWxlLCBidXQgbmVnbGVjdGVkIHRvIHRlbGwgZG1ha2UgdG8gdXNlIHRoZSBzaGVsbC4gW1N0ZXZlIEhheV0KCkRvbid0IHdyaXRlIGFuICdycG0nIHRhcmdldCBpbnRvIHRoZSBNYWtlZmlsZSBvbiBXaW5kb3dzLiBJdCBpc24ndCByZWxldmFudApvbiBXaW5kb3dzLCBhbmQgdGhlIChoYXJkLWNvZGVkLCBub3QgTWFrZU1ha2VyLWdlbmVyYXRlZCkgcmVjaXBlIGdyb3VwIGhhcwpzeW50YXggd2hpY2ggZG1ha2UgZG9lc24ndCB1bmRlcnN0YW5kLiBbU3RldmUgSGF5XQoKPWl0ZW0gMi4wLjggQXByaWwgMTcsIDIwMTMKClBlcmwgNS4xNi4zJ3MgZml4IGZvciBhIHJlaGFzaC1iYXNlZCBEb1MgbWFrZXMgaXQgbW9yZSBkaWZmaWN1bHQgdG8gaW52b2tlCnRoZSB3b3JrYXJvdW5kIGZvciB0aGUgb2xkIGhhc2ggY29sbGlzaW9uIGF0dGFjaywgd2hpY2ggYnJlYWtzIG1vZF9wZXJsJ3MKdC9wZXJsL2hhc2hfYXR0YWNrLnQuIFBhdGNoIGZyb20gcnQuY3Bhbi5vcmcgIzgzOTE2IGltcHJvdmVzIHRoZSBmaXgKcHJldmlvdXNseSBhcHBsaWVkIGFzIHJldmlzaW9uIDE0NTUzNDAuIFtaZWZyYW1dCgpPbiBQZXJsIDUuMTcuNiBhbmQgYWJvdmUsIGhhc2ggc2VlZGluZyBoYXMgY2hhbmdlZCwgYW5kIEh2UkVIQVNIIGhhcwpkaXNhcHBlYXJlZC4gUGF0Y2ggdG8gdXBkYXRlIG1vZF9wZXJsIGFjY29yZGluZ2x5IGZyb20gcnQuY3Bhbi5vcmcgIzgzOTIxLgpbWmVmcmFtXQoKUmVzdG9yZSBidWlsZCB3aXRoIFBlcmwgNS44LjEsIDUuOC4yIGV0YzogdGFrZSBjYXJlIHRvIHVzZQokQ29uZmlne3VzZWl0aHJlYWRzfSByYXRoZXIgdGhhbiAkQ29uZmlne3VzZXRocmVhZHN9LCBhbmQgc3VwcGx5IGRlZmluaXRpb25zCm9mIE5ld3ggYW5kIE5ld3h6IGFzIG5lY2Vzc2FyeS4gW1N0ZXZlIEhheV0KCk9uIFBlcmwgNS4xNy45LCB0L2FwYWNoZS9yZWFkMi50IGZhaWxzIGJlY2F1c2UgYW4gInVuaW5pdGlhbGl6ZWQgdmFsdWUiCndhcm5pbmcgaXMgZ2VuZXJhdGVkIGZvciB0aGUgYnVmZmVyIGJlaW5nIGF1dG92aXZpZmllZC4gVGhpcyBpcyBiZWNhdXNlCnRoZSBzdl9zZXRwdm4oKSB0aGF0J3MgbWVhbnQgdG8gdml2aWZ5IHRoZSBidWZmZXIgZG9lc24ndCBwZXJmb3JtIHNldAptYWdpYzsgdGhlIHdhcm5pbmcgaXMgZ2VuZXJhdGVkIGJ5IHRoZSBpbW1lZGlhdGVseSBmb2xsb3dpbmcgU3ZQVl9mb3JjZSgpLgpQYXRjaCB0byBmaXggdGhpcyBmcm9tIHJ0LmNwYW4ub3JnICM4MzkyMi4gW1plZnJhbV0KCkZpeCB0L3BlcmwvaGFzaF9hdHRhY2sudCB0byB3b3JrIHdpdGggUGVybCA1LjE0LjQsIDUuMTYuMyBldGMsIHdoaWNoCmNvbnRhaW4gYSBmaXggZm9yIENWRS0yMDEzLTE2NjcgKG1lbW9yeSBleGhhdXN0aW9uIHdpdGggYXJiaXRyYXJ5IGhhc2gKa2V5cykuIFRoaXMgcmVzb2x2ZXMgcnQucGVybC5vcmcgIzExNjg2MywgZnJvbSB3aGVyZSB0aGUgcGF0Y2ggd2FzIHRha2VuLgpbSHVnbyB2YW4gZGVyIFNhbmRlbl0KCnVzZSBBUFI6OkZpbmZvIGluc3RlYWQgb2YgUGVybCdzIHN0YXQoKSBpbiBNb2RQZXJsOjpSZWdpc3RyeUNvb2tlciB0bwpnZW5lcmF0ZSBIVFRQIGNvZGUgNDA0IGV2ZW4gaWYgdGhlIHJlcXVlc3RlZCBmaWxlbmFtZSBjb250YWlucyBuZXdsaW5lcwpbVG9yc3Rlbl0KClJlbW92ZSBhbGwgdXNlcyBvZiBkZXByZWNhdGVkIGNvcmUgcGVybCBzeW1ib2xzLiBbU3RldmUgSGF5XQoKQWRkIGJyYW5jaCByZWxlYXNlIHRhZyB0byAnbWFrZSB0YWcnIHRhcmdldC4gW1BocmVkXQoKPWl0ZW0gMi4wLjcgSnVuZSA1LCAyMDEyCgpGaXggYnJlYWthZ2UgY2F1c2VkIGJ5IHJlbW92YWwgb2YgUExfdWlkIGV0IGFsIGZyb20gcGVybCA1LjE2LjAuIFBhdGNoIGZyb20KcnQuY3Bhbi5vcmcgIzc3MTI5LiBbWmVmcmFtXQoKPWl0ZW0gMi4wLjYgQXByaWwgMjQsIDIwMTIKClByZXNlcnZlIDUuOCBjb21wYXRpYmlsaXR5IHN1cnJvdW5kaW5nIHVzZSBvZiBNVVRBQkxFX0NWIFtBZGFtIFByaW1lXQoKTW92ZSBjb2RlIGFmdGVyIGRlY2xhcmF0aW9ucyB0byBrZWVwIE1TVkMrKyBjb21waWxlciBoYXBweS4gW1N0ZXZlIEhheV0KCkFkb3B0IG1vZHBlcmxfcGN3LmMgY2hhbmdlcyBmcm9tIGh0dHBkMjQgYnJhbmNoLiBbVG9yc3RlbiBGb2VydHNjaF0KClBvb2wgY2xlYW51cCBmdW5jdGlvbnMgbXVzdCBub3QgbG9uZ2ptcC4gQ2F0Y2ggdGhlc2UgZXhjZXB0aW9ucyBhbmQgdHVybgp0aGVtIGludG8gd2FybmluZ3MuIFtUb3JzdGVuIEZvZXJ0c2NoXSAKCkZpeCBhIHJhY2UgY29uZGl0aW9uIGluIG91ciB0aXBvb2wgbWFuYWdlbWVudC4KU2VlIGh0dHA6Ly93d3cuZ29zc2FtZXItdGhyZWFkcy5jb20vbGlzdHMvbW9kcGVybC9kZXYvMTA0MDI2ClBhdGNoIHN1Ym1pdHRlZCBieTogU2FsdXNhU2Vjb25kdXMgPHNhbHVzYUBuYXRpb25zdGF0ZXMubmV0PgpSZXZpZXdlZCBieTogVG9yc3RlbiBGb2VydHNjaAoKRW5zdXJlIHRoYXQgTVBfQVBYUyBpcyBzZXQgd2hlbiBidWlsZGluZyBvbiBXaW4zMiB3aXRoIE1QX0FQX1BSRUZJWCwKb3RoZXJ3aXNlIHRoZSBidW5kbGVkIFJlbG9hZCBhbmQgU2l6ZUxpbWl0IGJ1aWxkcyB3aWxsIGZhaWwgdG8gZmluZCBhCnByb3Blcmx5IGNvbmZpZ3VyZWQgVGVzdCBlbnZpcm9ubWVudC4KW1N0ZXZlIEhheV0KCkZpeCBhIGZldyBSRUZDTlQgYnVncy4KUGF0Y2ggc3VibWl0dGVkIGJ5OiBOaWtvIFR5bmkgPG50eW5pQGRlYmlhbi5vcmc+ClJldmlld2VkIGJ5OiBUb3JzdGVuIEZvZXJ0c2NoCgpDb3JyZWN0IHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgYnVpbGQgY29uZmlnIGluIE1vZFBlcmw6Ok1NLiBUaGUgZ2xvYmFsCnZhcmlhYmxlIHdhcyBvbmx5IGJlaW5nIHNldCBvbmNlIG9uIGxvYWRpbmcgdGhlIG1vZHVsZSwgd2hpY2ggd2FzIGJlZm9yZQpBcGFjaGUyOjpCdWlsZENvbmZpZy5wbSBoYWQgYmVlbiB3cml0dGVuLCBsZWFkaW5nIHRvIGN3ZCBhbmQgTVBfTElCTkFNRQpiZWluZyB1bnNldCB3aGVuIHdyaXRpbmcgdGhlIFJlbG9hZCBhbmQgU2l6ZUxpbWl0IG1ha2VmaWxlcy4KW1N0ZXZlIEhheV0KCkRpc2NvdmVyIGFwci0yLWNvbmZpZyBmcm9tIEFwYWNoZSAyLjQgb253YXJkcy4gW0dvemVyXQoKQXBhY2hlIDIuNCBhbmQgb253YXJkcyBkb2Vzbid0IHJlcXVpcmUgbGlua2luZyB0aGUgTVBNIG1vZHVsZSBkaXJlY3RseSBpbgp0aGUgaHR0cGQgYmluYXJ5IGFueW1vcmUuIEFQWFMgbG9zdCB0aGUgTVBNX05BTUUgcXVlcnksIHNvIHdlIGNhbid0IGFzc3VtZQphIGdpdmVuIE1QTSBhbnltb3JlLiBJbnRyb2R1Y2UgYSBmYWtlIE1QTSAnZHluYW1pYycgdG8gcmVwcmVzZW50IHRoaXMuIApbVG9yc3RlbiBGb2VydHNjaCwgR296ZXJdCgpQZXJsIDUuMTQgYnJvdWdodCBhIGZldyBjaGFuZ2VzIGluIFBlcmxfc3ZfZHVwKCkgdGhhdCBtYWRlIGEgdGhyZWFkZWQgYXBhY2hlCnNlZ2ZhdWx0IHdoaWxlIGNsb25pbmcgaW50ZXJwcmV0ZXJzLgpbVG9yc3RlbiBGb2VydHNjaF0KClBlcmxJT0FwYWNoZV9mbHVzaCgpIGFuZCBtcHhzX0FwYWNoZTJfX1JlcXVlc3RSZWNfcmZsdXNoKCkgbm93IG5vIGxvbmdlciB0aHJvdwpleGNlcHRpb25zIHdoZW4gbW9kcGVybF93YnVja2V0X2ZsdXNoKCkgZmFpbHMgaWYgdGhlIGZhaWx1cmUgd2FzIGp1c3QgYSByZXNldApjb25uZWN0aW9uIG9yIGFuIGFib3J0ZWQgY29ubmVjdGlvbi4gVGhlIGZhaWx1cmUgaXMgc2ltcGx5IGxvZ2dlZCB0byB0aGUgZXJyb3IKbG9nIGluc3RlYWQuIFRoaXMgc2hvdWxkIGZpeCBjYXNlcyBvZiBodHRwZC5leGUgY3Jhc2hpbmcgd2hlbiB1c2VycyBwcmVzcyB0aGUKU3RvcCBidXR0b24gaW4gdGhlaXIgd2ViIGJyb3dzZXJzLgpbU3RldmUgSGF5XQoKRml4ZWQgYSBmZXcgaXNzdWVzIHRoYXQgY2FtZSB1cCB3aXRoIExXUCA2LjAwOgotIHQvcmVzcG9uc2UvVGVzdEFQSS9yZXF1ZXN0X3JlYy5wbSBhc3N1bWVzIEhUVFAvMS4wIGJ1dCBMV1AgNiB1c2VzIDEuMQotIHQvYXBpL2Vycl9oZWFkZXJzX291dC50IGZhaWxzIGR1ZSB0byBhIGJ1ZyBzb21ld2hlcmUgaW4gTFdQIDYKLSB0L2ZpbHRlci9UZXN0RmlsdGVyL291dF9zdHJfcmV2ZXJzZS5wbSBzZW5kcyB0aGUgd3JvbmcgY29udGVudC1sZW5ndGggaGVhZGVyCltUb3JzdGVuIEZvZXJ0c2NoXQoKQnVnZml4OiBBcGFjaGUyOjpTZXJ2ZXJVdGlsOjpnZXRfc2VydmVye2Rlc2NyaXB0aW9uLGJhbm5lcix2ZXJzaW9ufSBjYW5ub3QKYmUgZGVjbGFyZWQgYXMgcGVybCBjb25zdGFudHMgb3IgdGhleSB3b24ndCByZWZsZWN0IGFkZGVkIHZlcnNpb24gY29tcG9uZW50cwppZiBBcGFjaGUyOjpTZXJ2ZXJVdGlsIGlzIGxvYWRlZCBiZWZvcmUgdGhlIFBvc3RDb25maWcgcGhhc2UuIE5vdywgdGhleQphcmUgb3JkaW5hcnkgcGVybCBmdW5jdGlvbnMuIFtUb3JzdGVuIEZvZXJ0c2NoXQoKQ2hlY2sgZm9yIHRoZSByaWdodCBFeHRVdGlsczo6RW1iZWQgdmVyc2lvbiBkdXJpbmcgYnVpbGQgW1RvcnN0ZW4gRm9lcnRzY2hdCgpUYWtlIGEgbGVzc29uIGZyb20gcnQuY3Bhbi5vcmcgIzY2MDg1IGFuZCBwYXNzIExEX0xJQlJBUllfUEFUSCBpZiBtb2RfZW52CmlzIHByZXNlbnQuICBTaG91bGQgcHJldmVudCB0ZXN0IGZhaWx1cmVzIG9uIHNvbWUgcGxhdGZvcm1zLgpbRnJlZCBNb3llcl0KCgo9aXRlbSAyLjAuNSBGZWJydWFyeSA3LCAyMDExCgpUaGUgbW9kX3BlcmwgUE1DIGRlZGljYXRlcyB0aGlzIHJlbGVhc2Ugb2YgbW9kX3BlcmwgdG8gUmFuZHkgS29iZXMsIHdobwpwYXNzZWQgYXdheSBpbiBTZXB0ZW1iZXIgMjAxMC4gIFJhbmR5IHdhcyBhIG1lbWJlciBvZiB0aGUgbW9kX3BlcmwgcHJvamVjdCAKbWFuYWdlbWVudCBjb21taXR0ZWUgYW5kIGEgY28tYXV0aG9yIG9mIHRoZSBtb2RfcGVybCBEZXZlbG9wZXIncyBDb29rYm9vay4KSGlzIHdvcmsgaGVscGVkIG1hbnkgV2luZG93cyBtb2RfcGVybCB1c2Vycy4gSGlzIHdvcmsgd2l0aCBwcG0gZmlsZXMsIGFuZApXaW4zMiBwZXJsIHVzZXJzIHdpbGwgYmUgc29yZWx5IG1pc3NlZC4gSGUgd2FzIGtpbmQsIGJyaWdodCwgYW5kIGFsd2F5cwp3aWxsaW5nIHRvIGxlbmQgYSBoYW5kIG9uIHRoZSBtb2RfcGVybCB1c2VyJ3MgbGlzdC4KClByZXBhcmUgbW9kcGVybCBmb3IgdGhlIHVwY29taW5nIHBlcmwgNS4xNCBbVG9yc3RlbiBGb2VydHNjaF0KCkFkZCBsaWIvTW9kUGVybC9NZXRob2RMb29rdXAucG0gdG8gTUFOSUZFU1QgdmlhIGxpYi9Nb2RQZXJsL01hbmlmZXN0LnBtClJUICM0ODEwMyByZXBvcnRlZCBieSBNQVJLTEVAY3Bhbi5vcmcKW0ZyZWQgTW95ZXJdCgpQZXJsSU9BcGFjaGVfd3JpdGUoKSBub3cgdGhyb3dzIGFuIEFQUjo6RXJyb3Igb2JqZWN0LCByYXRoZXIgdGhhbiBqdXN0IGEgc3RyaW5nCmVycm9yLCBpZiBtb2RwZXJsX3didWNrZXRfd3JpdGUoKSBmYWlscy4KW1N0ZXZlIEhheV0KCkF1dGhlbnRpY2F0aW9uIHRlc3RzIGZhaWwgd2l0aCBMV1AgNS44MTUgYW5kIGxhdGVyCltEb3VnIFNjaHJhZ10KCkNvbmNpc2UgdGVzdCB3b24ndCBwZXJmb3JtIHVubGVzcyBTdGF0dXNUZXJzZSBpcyBzZXQgdG8gT04KW0RvdWcgU2NocmFnXQoKTG9vayBmb3IgYSB1c2FibGUgYXB4cyBpbiAkRU5We1BBVEh9IGlmIGFsbCBvdGhlciBvcHRpb25zIGZhaWwsIHRoZW4gcHJvbXB0IHRoZSB1c2VyIGZvciBvbmUuCltQaHJlZF0KCldvcmsgYXJvdW5kIGJvb3RzdHJhcCB3YXJuaW5ncyB3aGVuIEFwYWNoZTI6OkJ1aWxkQ29uZmlnIGhhcyBub3QgYmVlbiBjcmVhdGVkIHlldC4KW1BocmVkXQoKUmVtb3ZlIEFwYWNoZTo6dGVzdCBjb21wYXRpYmlsaXR5IChwYXJ0IG9mIG1vZF9wZXJsIDEuMi43KSwgdGhhdCBjb2RlIGNhdXNlcyBidWlsZCBpc3N1ZXMgYW5kIGlzIDQgdmVyc2lvbnMgb3V0IG9mIGRhdGUuCltQaHJlZF0KCk1ha2Ugc3VyZSBwZXJsIGlzIGJ1aWx0IGVpdGhlciB3aXRoIG11bHRpcGxpY2l0eSBhbmQgaXRocmVhZHMgb3Igd2l0aG91dApib3RoIFtUaGVvcnksIFRvcnN0ZW5dCgpTdXBwb3J0IGZvciAiaW5zdGFsbF92ZW5kb3IiIGFuZCAiaW5zdGFsbF9zaXRlIiBtYWtlIHRhcmdldHMgW1RvcnN0ZW5dCgpSdW4gdGVzdHMgb24gYnVuZGxlZCBwdXJlIHBlcmwgQXBhY2hlOjoqIG1vZHVsZXMgW0dvemVyLCBQaHJlZF0KCkltcGxlbWVudCBhIG1pbmktcHJlcHJvY2VzcyBsYW5ndWFnZSBmb3IgbWFwLWZpbGVzIGluIHhzL21hcHMuCltUb3JzdGVuIEZvZXJ0c2NoXQoKSW1wbGVtZW50IEFQUjo6U29ja2V0OjpmaWxlbm8gW1RvcnN0ZW4gRm9lcnRzY2hdCgpFeHBvcnQgUFJPWFlSRVFfUkVTUE9OU0UsIGEgbWlzc2luZyBQUk9YWVJFUV8qIGNvbnN0YW50IFtHb3plcl0KCk1ha2Ugc3VyZSBzdGFuZGFyZCBmaWxlIGRlc2NyaXB0b3JzIGFyZSBwcmVzZXJ2ZWQgYnkgdGhlIHBlcmwtc2NyaXB0CmhhbmRsZXIgW1RvcnN0ZW4gRm9lcnRzY2hdCgpGaXggdGhlIGZpbHRlciBpbml0IGhhbmRsZXIgYXR0cmlidXRlIGNoZWNrIGluIAptb2RwZXJsX2ZpbHRlcl9yZXNvbHZlX2luaXRfaGFuZGxlcigpIFtUb3JzdGVuIEZvZXJ0c2NoXQoKTWFrZSBzdXJlIGJ1ZmZlciBpcyBhIHZhbGlkIFNWIGluIG1vZHBlcmxfZmlsdGVyX3JlYWQoKSBbVG9yc3RlbiBGb2VydHNjaF0KCk1vdmUgbW9kcGVybF9yZXNwb25zZV9maW5pc2goKSBvdXQgb2YgbW9kcGVybF9yZXNwb25zZV9oYW5kbGVyX3J1biBpbgptb2RfcGVybC5jIFtUb3JzdGVuIEZvZXJ0c2NoXQoKIk1PRFBFUkxfSU5DPSBub3cgY29ycmVjdGx5IHN1cHBvcnRlZCBhcyBhbiBhcmd1bWVudCB0byBNYWtlZmlsZS5QTCIKW1RvcnN0ZW4gRm9lcnRzY2hdCgpGaXggYW4gWFNTIGlzc3VlIGluIEFwYWNoZTI6OlN0YXR1cyByZXBvcnRlZCBieSBSaWNoYXJkIEouIEJyYWluCjxyaWNoYXJkQHByb2NoZWNrdXAuY29tPi4gW1RvcnN0ZW4gRm9lcnRzY2hdCgpBZGQgTk9USUNFIGZpbGUgdG8gdGhlIGRpc3RyaWJ1dGlvbi4gW0pvZSBTY2hhZWZlcl0KCk1ha2Ugc3VyZSBBcGFjaGUyOjpSZXF1ZXN0SU86OnJlYWQgZG9lc24ndCBjbGVhciB0aGUgYnVmZmVyIG9uIGVuZCBvZgpmaWxlIGFuZCBoYW5kbGUgbmVnYXRpdmUgb2Zmc2V0cyBhbmQgb2Zmc2V0cyB0aGF0IGFyZSBsYXJnZXIgdGhhbgp0aGUgY3VycmVudCBzdHJpbmcgbGVuZ3RoLiBbVG9yc3RlbiBGb2VydHNjaF0KCkZpeCBhIHByb2JsZW0gdGhhdCBjb3VsZCBtYWtlIEFQUjo6WFNMb2FkZXIgYW5kIEFwYWNoZTI6OlhTTG9hZGVyCmxvYWQgdGhlIHdyb25nIHNoYXJlZCBsaWJyYXJ5LiBbVG9yc3RlbiBGb2VydHNjaF0KCkZpeCBjb21waWxhdGlvbiB3aGVuIHVzaW5nIGEgbm9uLXRocmVhZGVkIEFQUi4KW0dvemVyLCBQaGlsaXAgTS4gR29sbHVjY2ldCgpNYWtlIHN1cmUgbW9kX3BlcmwncyBvd24gQ2hpbGRJbml0SGFuZGxlcnMgYXJlIHJ1biBiZWZvcmUgdXNlcgpzdXBwbGllZCBvbmVzLiBUaGlzIGZpeGVzIHRoZSBpbmNvcnJlY3RseSByZXBvcnRlZCB2YWx1ZSBvZiAkJAphdCBDaGlsZEluaXQgdGltZSBbR296ZXJdCgo9aXRlbSAyLjAuNCBBcHJpbCAxNiwgMjAwOAoKRml4ICRyLT5sb2NhdGlvbiBjb3JydXB0aW9uIHVuZGVyIGNlcnRhaW4gY29uZGl0aW9ucwpbR296ZXJdCgpGaXggYSBjcmFzaCB3aGVuIHNwYXduaW5nIFBlcmwgdGhyZWFkcyB1bmRlciBQZXJsIDUuMTAKW0dvemVyXQoKRml4IGVycmF0aWMgYmVoYXZpb3VyIHdoZW4gZmlsdGVycyB3ZXJlIHVzZWQgd2l0aCBQZXJsIDUuMTAKW0dvemVyXQoKRml4IHByb2JsZW1zIHdpdGggcmVkZWZpbml0aW9ucyBvZiBwZXJsX2ZyZWUgYXMgZnJlZSBhbmQgcGVybF9tYWxsb2MKYXMgbWFsbG9jIG9uIFdpbjMyLCBhcyBkZXNjcmliZWQgYXQKIGh0dHA6Ly9tYXJjLmluZm8vP2w9YXBhY2hlLW1vZHBlcmwmbT0xMTk4OTY0MDc1MTA1MjYmdz0yCltUb20gRG9ub3Zhbl0KCkZpeCBhIGNyYXNoIHdoZW4gcnVubmluZyBhIHN1Yi1yZXF1ZXN0IGZyb20gd2l0aGluIGEgZmlsdGVyIHdoZXJlCm1vZF9wZXJsIHdhcyBub3QgdGhlIGNvbnRlbnQgaGFuZGxlci4gW0dvemVyXQoKUmVmYWN0b3IgdGVzdHMgdG8gdXNlIGtlZXBhbGl2ZXMgaW5zdGVhZCBvZiBzYW1lX2ludGVycCBbR296ZXIsIFBocmVkXQoKQXBhY2hlMjo6UmVsb2FkIGhhcyBiZWVuIG1vdmVkIHRvIGFuIGV4dGVybmFsbHkgbWFpbnRhaW5lZApDUEFOIGRpc3RyaWJ1dGlvbiBbRnJlZCBNb3llciA8ZnJlZEByZWRob3RwZW5ndWluLmNvbT5dCgpQZXJsQ2xlYW51cEhhbmRsZXIgYXJlIG5vdyByZWdpc3RlcmVkIHdpdGggYSBzdWJwb29sIG9mICRyLT5wb29sLAppbnN0ZWFkIG9mICRyLT5wb29sIGl0c2VsZiwgZW5zdXJpbmcgdGhleSBydW4gX2JlZm9yZV8gYW55IG90aGVyCiRyLT5wb29sIGNsZWFudXBzIFtUb3JzdGVuIEZvZXJ0c2NoXQoKRml4IGEgYnVnIHRoYXQgd291bGQgcHJldmVudCBwbm90ZXMgZnJvbSBiZWluZyBjbGVhbmVkIHVwIHByb3Blcmx5CmF0IHRoZSBlbmQgb2YgdGhlIHJlcXVlc3QgW1RvcnN0ZW4gRm9lcnRzY2hdCgpPbiBXaW4zMiwgZW1iZWQgdGhlIG1hbmlmZXN0IGZpbGUsIGlmIHByZXNlbnQsIGluIG1vZF9wZXJsLnNvLApzbyBhcyB0byB3b3JrIHdpdGggVkMgOCBbU3RldmUgSGF5LCBSYW5keSBLb2Jlc10KCkV4cG9zZSBhcHJfdGhyZWFkX3J3bG9ja190IHdpdGggdGhlIEFQUjo6VGhyZWFkUldMb2NrIG1vZHVsZQpbVG9yc3RlbiBGb2VydHNjaF0KCkRvbid0IHdhc3RlIGFuIGV4dHJhIGludGVycHJldGVyIGFueW1vcmUgdW5kZXIgdGhyZWFkZWQgTVBNcyB3aGVuIHVzaW5nIGEgCm1vZHBlcmwgaGFuZGxlciBbVG9yc3RlbiBGb2VydHNjaF0gCgpGaXggYSBidWcgdGhhdCBjb3VsZCBjYXVzZSBhIGNyYXNoIHdoZW4gdXNpbmcgJHItPnB1c2hfaGFuZGxlcnMoKSBtdWx0aXBsZQp0aW1lcyBmb3IgYSBwaGFzZSB0aGF0IGhhcyBubyBjb25maWd1cmVkIGhhbmRsZXJzIFtUb3JzdGVuIEZvZXJ0c2NoXQoKQ2F0Y2ggdXAgd2l0aCBzb21lIGh0dHBkIEFQSSBjaGFuZ2VzCiAgMi4yLjQ6IAogICBUaGUgZnVsbCBzZXJ2ZXIgdmVyc2lvbiBpbmZvcm1hdGlvbiBpcyBub3cgaW5jbHVkZWQgaW4gdGhlIGVycm9yIGxvZyBhdApzdGFydHVwIGFzIHdlbGwgYXMgc2VydmVyIHN0YXR1cyByZXBvcnRzLCBpcnJlc3BlY3RpdmUgb2YgdGhlIHNldHRpbmcKb2YgdGhlIFNlcnZlclRva2VucyBkaXJlY3RpdmUuIGFwX2dldF9zZXJ2ZXJfdmVyc2lvbigpIGlzIG5vdwpkZXByZWNhdGVkLCBhbmQgaXMgcmVwbGFjZWQgYnkgYXBfZ2V0X3NlcnZlcl9iYW5uZXIoKSBhbmQKYXBfZ2V0X3NlcnZlcl9kZXNjcmlwdGlvbigpLiBbSmVmZiBUcmF3aWNrXQoKICAyLjMuMDoKYXBfZ2V0X3NlcnZlcl92ZXJzaW9uKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVGhpcmQtcGFydHkgbW9kdWxlcyBtdXN0Cm5vdyB1c2UgYXBfZ2V0X3NlcnZlcl9iYW5uZXIoKSBvciBhcF9nZXRfc2VydmVyX2Rlc2NyaXB0aW9uKCkuCltHb3plcl0KCmZpeGVkIEFwYWNoZTI6OmNvbXBhdCBBcGFjaGUyOjpTZXJ2ZXJVdGlsOjpzZXJ2ZXJfcm9vdCgpIHJlc29sdXRpb24KaXNzdWVzIFtKb3NodWEgSG9ibGl0dF0KCiopIFNFQ1VSSVRZOiBDVkUtMjAwNy0xMzQ5IChjdmUubWl0cmUub3JnKQpmaXggdW5lc2NhcGVkIHZhcmlhYmxlIGludGVycHJvbGF0aW9uIGluIHJlZ3VsYXIgZXhwcmVzc2lvbgpbUmFuZGFsIEwuIFNjaHdhcnR6IDxtZXJseW5Ac3RvbmVoZW5nZS5jb20+LCBGcmVkIE1veWVyIDxmcmVkQHJlZGhvdHBlbmd1aW4uY29tPl0KCk1ha2UgJHItPnRoZV9yZXF1ZXN0KCkgd3JpdGVhYmxlCltGcmVkIE1veWVyIDxmcmVkQHJlZGhvdHBlbmd1aW4uY29tPl0KCmZpeCBNb2RQZXJsOjpSZWdpc3RyeUNvb2tlcjo6cmVhZF9zY3JpcHQgdG8gaGFuZGxlIGFsbCBwb3NzaWJsZQplcnJvcnMsIHByZXZpb3VzbHkgdGhlcmUgd2FzIGEgY2FzZSB3aGVyZSBBcGFjaGUyOjpDb25zdDo6T0sgd2FzCnJldHVybmVkIG9uIGFuIGVycm9yLiAgW0VpdmluZCBFa2x1bmQgPGVla2x1bmRAZ21haWwuY29tPl0KCmEgbWlub3IgY29tcGlsYXRpb24gd2FybmluZyByZXNvbHZlZCBpbiBtb2RwZXJsX2hhbmRsZXJfbmV3X2Zyb21fc3YKW1N0YXNdCgphIG1pbm9yIGNvbXBpbGF0aW9uIHdhcm5pbmcgcmVzb2x2ZWQgaW4gbW9kcGVybF9ndG9wX3NpemVfc3RyaW5nCltTdGFzXQoKUHJldmVudCBkaXJlY3QgdXNlIG9mIF9kZXByZWNhdGVkXyBBcGFjaGUyOjpSZWFkQ29uZmlnIGluCjxQZXJsPiBzZWN0aW9ucyB3aXRoIGh0dHBkIEFsaWFzIGRpcmVjdGl2ZXMgZnJvbSAKaW5jb3JyZWN0bHkgZ2VuZXJhdGluZwonVGhlIEFsaWFzIGRpcmVjdGl2ZSBpbiB4eHh4eCBhdCBsaW5lIHkgd2lsbCBwcm9iYWJseSBuZXZlciBtYXRjaCcKbWVzc2FnZXMuCltQaGlsaXAgTS4gR29sbHVjY2kgPHBnb2xsdWNjaUBwNm03OGcuY29tPl0KClByZXZlbnQgQXBhY2hlMjo6UGVyU2VjdGlvbnM6OnN5bWR1bXAoKSBmcm9tIHJldHVybmluZyBpbnZhbGlkCmh0dHBkLmNvbmYgc25pcHBldHMgbGlrZSAnQWxpYXMgdW5kZWYnCltQaGlsaXAgTS4gR29sbHVjY2kgPHBnb2xsdWNjaUBwNm03OGcuY29tPl0KClJlcXVpcmUgQi1TaXplIDAuOSBmb3IgQXBhY2hlMjo6U3RhdHVzIHdoaWNoIGZpeGVzCkNhbid0IGNhbGwgbWV0aG9kICJzY3JpcHRfbmFtZSIgb24gYW4gdW5kZWZpbmVkIHZhbHVlCltQaGlsaXAgTS4gR29sbHVjY2kgPHBnb2xsdWNjaUBwNm03OGcuY29tPl0KCi1tYXJjaD1wZW50aXVtNCBvciBhbnl0aGluZyB3aXRoIGFuID0gaW4gaXQgaW4gQ0NGTEFHUyBvciBAQVJHVgp0aGF0IGdldHMgcGFzc2VkIHRvIHhzL0FQUi9BUFIvTWFrZWZpbGUuUEwgYnJva2UgdGhlIEBBUkdWCnBhcnNpbmcuICBJLkUuIEZyZWVCU0QgcG9ydCBidWlsZHMgd2hlbiB1c2VycyBoYWQgQ1BVVFlQRQpzZXQgaW4gL2V0Yy9tYWtlLmNvbmYuCltQaGlsaXAgTS4gR29sbHVjY2kgPHBnb2xsdWNjaUBwNm03ZzguY29tPl0KCkZpeGVzIHRvIGdldCBibGVlZC1pdGhyZWFkICg1LjkuNSspIHRvIGNvbWlsZSBhZ2Fpbi4gCltQaGlsaXAgTS4gR29sbHVjY2kgPHBnb2xsdWNjaUBwNm03ZzguY29tPl0KCj1pdGVtIDIuMC4zIE5vdmVtYmVyIDI4LCAyMDA2CgpQcmV2ZW50IHRoaW5ncyBpbiAlSU5DIHRoYXQgYXJlIG5vdCBzdGF0KCkgYWJsZQpmcm9tIGJyZWFraW5nIEFwYWNoZTI6OlN0YXR1cyAnTG9hZGVkIE1vZHVsZXMnCnVuZGVyIGZhdGFsIHdhcm5pbmdzLgpbUGhpbGlwIE0uIEdvbGx1Y2NpIDxwZ29sbHVjY2lAcDZtN2c4LmNvbT5dCgpXaGVuIHVzaW5nIE1QX0FQX1BSRUZJWCBvbiBXSU4zMiBtYWtlIHN1cmUgdGhhdCBpdHMKYSB2YWxpZCBkaXJlY3RvcnkuCltOaWtvbGF5IEFuYW5pZXYgPGFuYW5pZXZAdGhlZ2RiLmNvbT5dCgpGaXggYnVnIGNvbmNlcm5pbmcgJ2Vycm9yLW5vdGVzJyBoYXZpbmcgbm8gdmFsdWUgb24gCmVycm9yZG9jdW1lbnQgcmVkaXJlY3QuCltHdXkgQWxiZXJ0ZWxsaSBJSSA8Z3V5QGFsYmVydGVsbGkuY29tPl0KCk11bHRpLWxpbmUgJFBlcmxDb25maWcgaXMgbm93IHdvcmtpbmcgW0dvemVyXQoKUGVybE9wdGlvbnMgTm9uZSB3YXMgcHJldmlvdXNseSBpbmNvcnJlY3RseSByZXBvcnRlZCBhcyBpbnZhbGlkCmluc2lkZSA8VmlydHVhbEhvc3Q+IG9yIDxEaXJlY3Rvcnk+IGJsb2Nrcy4KW1BoaWxpcCBNLiBHb2xsdWNjaV0KClJlcXVpcmUgQjo6U2l6ZSAwLjA3IGFuZCBCOjpUZXJzZVNpemUgMC4wNyBmb3IgQXBhY2hlMjo6U3RhdHVzCltQaGlsaXAgTS4gR29sbHVjY2ldCgpBcGFjaGUyOjpTdGF0dXMgd2FzIGV4cGVjdGluZyBCOjpUZXJzZVNpemUgdG8gcmV0dXJuCmFuIG9wIGNvdW50IGZvciB0aGluZ3MgdGhhdCBpdCBkaWRuJ3QgY2F1c2luZwpyZXF1ZXN0cyBsaWtlIGh0dHA6Ly9sb2NhbGhvc3QvcGVybC1zdGF0dXMvbWFpbj9ub2hfYl9wYWNrYWdlX3NpemUKdG8gY2F1c2UgNDA1cwpbUGhpbGlwIE0uIEdvbGx1Y2NpXQoKVXBkYXRlcyBmb3IgV2luMzIgdG8gYWxsb3cgYnVpbGRpbmcgYW5kIHRlc3Rpbmcgb24gQXBhY2hlLzIuMjoKLSB1c2UgaHR0cGQuZXhlIGFzIHRoZSBBcGFjaGUgYmluYXJ5IG5hbWUgd2hlbiBpbnN0YWxsaW5nIGFweHMKLSB1c2UgbmV3IGFwciBsaWJyYXJ5IG5hbWVzIChsaWJhcHItMS5saWIgYW5kIGxpYmFwcnV0aWwtMS5saWIpCltSYW5keSBLb2Jlc10KCk1ha2Ugc3VyZSB0aGF0IGFkZGl0aW9uYWwgbGlicmFyeSBwYXRocyBhcmUgaW5jbHVkZWQgaW4gdGhlIGJ1aWxkIGZsYWdzCnNvIHRoYXQgbW9kX3Blcmwgd2lsbCB1c2UgdGhlIHNhbWUgdmVyc2lvbnMgb2YgbGlicmFyaWVzIHRoYXQgQVBSIGRvZXMuCltNaWtlIFNtaXRoIDxtaWtlQG1haWxjaGFubmVscy5jb20+XQoKQWRkZWQgJHItPmNvbm5lY3Rpb24tPnBub3RlcywgaWRlbnRpY2FsIHRvICRyLT5wbm90ZXMsIGJ1dApmb3IgdGhlIGVudGlyZSBsaWZldGltZSBvZiB0aGUgY29ubmVjdGlvbgpbR2VvZmZyZXkgWW91bmcsIEdvemVyXQoKRml4ZWQgcHJvYmxlbXMgd2l0aCBhZGRfY29uZmlnKCkgYW5kIHRocmVhZC1zYWZldHk6IFtHb3plcl0KLSAkcy0+YWRkX2NvbmZpZyBpcyBub3QgYWxsb3dlZCBhbnltb3JlIGFmdGVyIHNlcnZlciBzdGFydHVwCi0gJHItPmFkZF9jb25maWcgY2FuIG9ubHkgYWZmZWN0IGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBjdXJyZW50CiAgcmVxdWVzdCwganVzdCBsaWtlIC5odGFjY2VzcyBmaWxlcyBkbwoKTWFrZSBzdXJlIHRoYXQgTElCUyBhbmQgb3RoZXIgTWFrZU1ha2VyIGNvbW1hbmQgbGluZSBmbGFncyBhcmUgbm90Cmlnbm9yZWQgYnkgdGhlIHRvcCBsZXZlbCBNYWtlZmlsZS5QTCBhbmQgeHMvQVBSL0FQUi9NYWtlZmlsZS5QTCBbU3Rhc10KCkNvcnJlY3RlZCBhIHR5cG8gdGhhdCB3b3VsZCBjYXVzZSB0aGUgY29ycnVwdGlvbiBvZiAkKSwgdGhlCmVmZmVjdGl2ZSBncm91cCBpZCBhcyBQZXJsIHNlZXMgaXQgW0dvemVyXQoKQWRkZWQgc3VwcG9ydCBmb3IgaHR0cGQtMi4yJ3MgbmV3IG92ZXJyaWRlX29wdHMgaW4gQXBhY2hlMjo6QWNjZXNzLgpDYWxscyB0byBhZGRfY29uZmlnKCkgbm93IGFjY2VwdCBhbiBvdmVycmlkZV9vcHRzIHZhbHVlIGFzIHRoZSA0dGgKYXJndW1lbnQuIFtUb3JzdGVuIEZvZXJ0c2NoIDx0b3JzdGVuLmZvZXJ0c2NoQGdteC5uZXQ+LCBHb3plcl0KCkZpeCAnUGVybFN3aXRjaGVzICtpbmhlcml0JyB0aGF0IGdvdCBicm9rZW4gc29tZXdoZXJlIGFsb25nCnRoZSB3YXkgdG8gMi4wLiBZb3UgY2FuIGFsc28gdXNlICdQZXJsT3B0aW9ucyArSW5oZXJpdFN3aXRjaGVzJwpmb3IgdGhlIHNhbWUgcmVzdWx0LiBbR296ZXJdCgpBZGQgcGVybCBBUEkgY29ycmVzcG9uZGluZyB0byBVc2VyIGFuZCBHcm91cCBkaXJlY3RpdmVzIGluIGh0dHBkLmNvbmY6IApBcGFjaGUyOjpTZXJ2ZXJVdGlsLT51c2VyX2lkIGFuZCBBcGFjaGUyOjpTZXJ2ZXJVdGlsLT5ncm91cF9pZApbU3Rhc10KCkFwYWNoZTI6OlJlbG9hZCBub3cgZmlyc3QgdW5sb2FkcyBhbGwgbW9kaWZpZWQgbW9kdWxlcyBiZWZvcmUKdHJ5aW5nIHRvIHJlbG9hZCB0aGVtLiBUaGlzIHdheSwgaW50ZXItbW9kdWxlIGRlcGVuZGVuY2llcwphcmUgbW9yZSBsaWtlbHkgdG8gYmUgY29ycmVjdGx5IHNhdGlzZmllZCB3aGVuIHJlbG9hZGVkCltKYXZpZXIgVXJ1ZW4gVmFsIDxqdXJ1ZW5Ad2FycC5lcz4sIEdvemVyXQoKJHItPmFkZF9jb25maWcoKSBjYW4gbm93IHRha2UgYW4gb3B0aW9ubmFsIDNyZCBhcmd1bWVudCB0aGF0CnNwZWNpZmllcyB3aGF0IHBzZXVkbyA8TG9jYXRpb24gJHBhdGg+IHRoZSBjb25maWd1cmF0aW9uIGlzCmV2YWx1YXRlZCBpbnRvIFtUb3JzdGVuIEZvZXJ0c2NoIDx0b3JzdGVuLmZvZXJ0c2NoQGdteC5uZXQ+XQoKcmVtb3ZlIC1EQVBfSEFWRV9ERVNJR05BVEVEX0lOSVRJQUxJWkVSIGFuZCAtREFQX0RFQlVHIGZyb20KTVBfTUFJTlRBSU5FUiBtb2RlIHRvIGF2b2lkIGNvbGxpc2lvbnMgW0pvZSBPcnRvbl0KCkJhY2sgb3V0IHIyODAyNjIgd2hpY2ggd2FzIGNhdXNpbmcgQXBhY2hlMjo6UmVsb2FkIHRvIG1pc2JlaGF2ZS4KW0pUIFNtaXRoIDxqdEBwbGFpbmJsYWNrLmNvbT5dCgpQZXJsX2RvX29wZW4vY2xvc2UgZml4ZXMgdG8gbWFrZSBtb2RfcGVybCAyLjAgY29tcGlsZSB3aXRoCmJsZWFkLXBlcmxAMjU4ODkrICg1LjkuMyspIFtTdGFzXQoKQWRkZWQgQXBhY2hlMjo6UGVybFNlY3Rpb25zLT5zZXJ2ZXIsIHJldHVybmluZyB0aGUgc2VydmVyCmludG8gd2hpY2ggdGhlIDxQZXJsPiBzZWN0aW9uIGlzIGRlZmluZWQgW0dvemVyXQoKUmVxdWlyZSBCOjpTaXplIGFuZCBCOjpUZXJzZVNpemUgdjAuMDYgZm9yIEFwYWNoZTI6OlN0YXR1cwpvcHRpb25zIFN0YXR1c1RlcnNlIGFuZCBTdGF0dXNUZXJzZVNpemUgd2hpY2ggaGFzIG5vdyBiZWVuIAp1cGRhdGVkIHRvIHN1cHBvcnQgdGhlIG5ldyBtb2RfcGVybDIgYXBpIHBvc3QgUkM1LgpbUGhpbGlwIE0uIEdvbGx1Y2NpXQoKV2hlbiB1c2luZyBBcGFjaGUyOjpQZXJsU2VjdGlvbnMtPmR1bXAsIHRoZSBjb25maWd1cmF0aW9uIAp3b3VsZCBwcmludCBvdXQgaW4gdGhlIGNvcnJlY3Qgb3JkZXIsIGJ1dCB3aGVuIHRoZSBjb25maWd1cmF0aW9uIHdhcyAKcGFzc2VkIG9mZiB0byBBcGFjaGUgdGhlIG9yZGVyaW5nIHdhcyBsb3N0LgpbU2NvdHQgV2Vzc2VscyA8c3dlc3NlbHNAdXNnbi5uZXQ+XQoKPWl0ZW0gMi4wLjIgLSBPY3RvYmVyIDIwLCAyMDA1CgphZGQgOnByb3h5IGltcG9ydCB0YWcgdG8gQXBhY2hlMjo6Q29uc3Qgd2hpY2ggZXhwb3NlcyBuZXcKY29uc3RhbnRzIFBST1hZUkVRX05PTkUsIFBST1hZUkVRX1BST1hZLCBhbmQgUFJPWFlSRVFfUkVWRVJTRQpbR2VvZmZyZXkgWW91bmddCgokMCBGaXhlcyA6IFtHb3plcl0KLSBTZXR0aW5nICQwIHdvcmtzIG9uIExpbnV4IGFnYWluCi0gSFAtVVggYW5kICpCU0RlcyBzaG93IHRoZSBjb3JyZWN0IHByb2Nlc3MgbmFtZSBpbnN0ZWFkIG9mICctZScKIApGaXggYSBjcml0aWNhbCBidXQgdHJpdmlhbCBidWcgdGhhdCB3b3VsZCBjYXVzZSBNUF9NQUlOVEFJTkVSPTEKb3IgTVBfVFJBQ0U9MSBidWlsZHMgdG8gZmFpbCBpZiBub3QgYnVpbGRpbmcgYWdhaW5zdCBhIHRocmVhZGVkIEFQUi4KRnVuY3Rpb25zIHN1Y2ggYXMgYXByX29zX3RocmVhZF9jdXJyZW50KCkgd291bGQgbm90IGJlIGxpbmtlZCBpbiwKYnV0IHdlcmUgZXhwZWN0ZWQgdG8gYmUuCltQaGlsaXAgTS4gR29sbHVjY2ldCgpBZGQgdGhlIG91dHB1dCBvZiBsZGQodW5peC9jeWd3aW4pIGFuZCBvdG9vbCAtTCAoZGFyd2luKQpmb3IgaHR0cGQgdG8gdGhlIG1wMmJ1ZyByZXBvcnQgc2NyaXB0LgpbUGhpbGlwIE0uIEdvbGx1Y2NpXQoKUHJldmVudCB0b29scyBzdWNoIGFzIEFwYWNoZTI6OlN0YXR1cydzIExvYWRlZCBNb2R1bGVzIHNjcmVlbgpmcm9tIGRpc3BsYXlpbmcgZXJyb25lb3VzIGluZm9ybWF0aW9uIGFib3V0IG1vZF9wZXJsLnBtIGJlaW5nIGxvYWRlZC4KW1N0YXMsIFBoaWxpcCBNLiBHb2xsdWNjaV0KCkNvcnJlY3RseSBzZXQgdGhlIHZlcnNpb24gb2YgTW9kUGVybDo6TWV0aG9kTG9va3VwLCBwcmV2aW91c2x5LAppdCB3YXMgbm90IHNldCBiZWNhdXNlIG9mIHRoZSB3YXkgaXQgd2FzIEdlbmVyYXRpbmcgdmlhIE1vZFBlcmw6OldyYXBYUy4KW1BoaWxpcCBNLiBHb2xsdWNjaV0KCkltcHJvdmUgdGhlIGRldGVjdGlvbiBvZiB3aGV0aGVyIG9yIG5vdCB3ZSBhcmUgaW4gYW4gbXAyIGJ1aWxkIHRyZWUuClRoaXMgYWxsb3dzIHVzYWdlIG9mIEV4dFV0aWxzOjpNYWtlTWFrZXIgb3B0aW9ucyBzdWNoIGFzIFBSRUZJWCB0bwpub3QgYnJlYWsgdGhlIHByb2JlIG9mIG1wMiBidWlsZCB0cmVlcy4KW1N0YXMsIFBoaWxpcCBNLiBHb2xsdWNjaV0KCkFkZCBzdXBwb3J0IGZvciB0aGUgbmV3ZXIgU21hcHMgKC9wcm9jL3NlbGYvc3RhdG0pIG9uIExpbnV4CnN5c3RlbXMgdGhhdCBzdXBwb3J0IGl0IChpLmUuIGxpbnV4LTIuNi4xMy1yYzQtbW0xKQp0byBhY2N1cmF0ZWx5IGNvdW50IHRoZSBhbW91bnQgb2Ygc2hhcmVkIG1lbW9yeS4KW1RvcnN0ZW4gRm9lcnRzY2ggPHRvcnN0ZW4uZm9lcnRzY2ggZ214Lm5ldD5dCgpPbiBjeWd3aW4gc29tZSBkbGxzIG1pZ2h0IGhhcHBlbiB0byBiZSB3aXRoIGlkZW50aWNhbCBiYXNlIGFkZHJlc3NlcwphbmQgaWYgeW91IHRyeSB0byBsb2FkIGJvdGggb2YgdGhlbSB5b3UnbGwgZ2V0IGFuIGVycm9yIGFuZCB5b3UnbGwKaGF2ZSB0byB1c2UgdGhlIHJlYmFzZSB1dGlsaXR5IHRvIGZpeCB0aGVtLiAgdGhpcyBmaXggc2hvdWxkIHByZXZlbnQKdGhpcy4gIFtOaWtvbGF5IEFuYW5pZXYgPGFuYW5pZXZAdGhlZ2RiLmNvbT5dCgpGaXggYW4gdW5kZWZpbmVkIHdhcm5pbmcgaW4gRFNPIGJ1aWxkcyB3aGVuIG5vdCB1c2luZyBNUF9BUFhTLgpbTmlrb2xheSBBbmFuaWV2IDxhbmFuaWV2QHRoZWdkYi5jb20+XQoKV2hlbiBydW5uaW5nIE1ha2VmaWxlLlBMIHdpdGggdGhlIE1QX01BSU5UQUlORVI9MSBvcHRpb24KYWRkIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50IGlmIHdlIGFyZSB1c2luZyBnY2MKdmVyc2lvbiAzLjMuMiBvciBoaWdoZXIgYW5kIGl0cyBub3QgYWxyZWFkeSBwYXJ0IG9mIHRoZSBjY29wdHMuCltQaGlsaXAgTS4gR29sbHVjY2ksIEdvemVyXQoKU2V2ZXJhbCBmaXhlcyB0byBBcGFjaGUyOjpTdGF0dXMKW1BoaWxpcCBNLiBHb2xsdWNjaV0KCldoZW4gdXNpbmcgQXBhY2hlMjo6UmVsb2FkIGFuZCBSZWxvYWREZWJ1ZyBpcyBzZXQgdG8gJ09uJywgCnNvcnQgdGhlIG91dHB1dCBhbHBoYWJldGljYWxseSBbUGhpbGlwIE0uIEdvbGx1Y2NpXQoKY3JvYWsgaW4gY2FzZSBhIGZpbHRlciByZXR1cm5zIERFQ0xJTkVEIGFmdGVyIGNhbGxpbmcgJGYtPnJlYWQgKGFzIGl0CmlzIG5vdCBzdXBwb3NlZCB0byBoYXBwZW4pIFtTdGFzXQoKYW5vdGhlciByb3VuZCBvZiBjeWd3aW4gZml4ZXMgW05pa29sYXkgQW5hbmlldiA8YW5hbmlldkB0aGVnZGIuY29tPl0KCk11bHRpcGxlIGZpeGVzIHRvIG1ha2UgbW9kX3BlcmwgMi4wIHdvcmsgd2l0aCBibGVhZC1wZXJsICg1LjkuMyspCltTdGFzXQoKdC9tb2R1bGVzL3JlbG9hZC50IHdvdWxkIGZhaWwgaWYgcnVuIG1vcmUgdGhhbiAzIHRpbWVzLCBicmVha2luZwpzbW9rZXMgW0dvemVyXQoKZmlsdGVyIGZsdXNoaW5nIG5vdyBkb2Vzbid0IGNyb2FrIG9uIGNvbm5lY3Rpb24gcmVzZXQKKEVDT05OUkVTRVQvRUNPTk5BQk9SVEVEKSwgYnV0IGp1c3QgbG9ncyB0aGUgZXZlbnQgb24gdGhlICdpbmZvJwpsZXZlbC4gW1N0YXNdCgpSUE0gRnJpZW5kbHkgYnVpbGRzIDogW0dvemVyXQotIG1ha2UgZGlzdCB0YXJiYWxscyBjYW4gbm93IGJlIGJ1aWx0IGRpcmVjdGx5IGludG8gUlBNcyB3aXRoIHJwbWJ1aWxkCi0gQWRkZWQgYSBuZXcgdGFyZ2V0ICdtYWtlIHJwbScgdG8gZGlyZWN0bHkgYnVpbGQgcnBtcyBmcm9tIGEgY2hlY2tvdXQKCgoKPWl0ZW0gMi4wLjEgLSBKdW5lIDE3LCAyMDA1CgpCOjpUZXJzZSBoYXMgcHJvYmxlbXMgd2l0aCBYUyBjb2RlLCBzbyBhZGp1c3QgQXBhY2hlOjpTdGF0dXMgdG8gZXZhbAp7fSB0aGUgY29kZSBkb2luZyBTeW50YXggVHJlZSBEdW1wOiBzeW50YXggYW5kIGV4ZWN1dGlvbiBvcmRlciBvcHRpb25zCltTdGFzXQoKRml4IGEgYnJva2VuIHJlZ2V4cCBpbiBBcGFjaGUyOjpCdWlsZDo6ZGlyKCkgb24gd2luMzIgdGhhdCB3b3VsZAppbmNvcnJlY3RseSBhdHRlbXB0IHRvIGZ1bGx5LXF1YWxpZnkgcGF0aHMgbGlrZSBjOi9zb21lL3BhdGgKW05pa29sYXkgQW5hbmlldiA8YW5hbmlldkB0aGVnZGIuY29tPl0KCkZpeCB0aGUgIk5vIGxpYnJhcnkgZm91bmQiIHdhcm5pbmdzIHdoZW4gYnVpbGRpbmcgb24gd2luMzIgd2l0aG91dAphcHhzIGFuZCBNUF9BUF9QUkVGSVggW05pa29sYXkgQW5hbmlldiA8YW5hbmlldkB0aGVnZGIuY29tPl0KClRoZSBwdXJlLXBlcmwgTW9kUGVybDo6VXRpbDo6dW5sb2FkX3BhY2thZ2UgaW1wbGVtZW50YXRpb24gd2FzCmFjY2lkZW50bHkgZGVsZXRpbmcgc3ViLXN0YXNoZXMgW0dvemVyXQoKSWYgcnVubmluZyBNYWtlZmlsZS5QTCB1bm5hdGVuZGVkIChTVERJTiBpc24ndCBhIHRlcm1pbmFsIG9yCk1QX1BST01QVF9ERUZBVUxUPTEpLCBicmVhayBvdXQgb2YgcG90ZW50aWFsbHkgaW5maW5pdGUgcHJvbXB0Cmxvb3BzIFtHb3plcl0KCmZpeCBNb2RQZXJsOjpUZXN0UmVwb3J0IHVzZWQgYnkgdC9SRVBPUlQgYW5kIG1wMmJ1ZyB0byB1c2UKRXh0VXRpbHM6Ok1ha2VNYWtlcidzIE1NLT5wYXJzZV92ZXJzaW9uIHRvIGdldCB0aGUgaW50ZXJlc3RpbmcKcGFja2FnZXMgdmVyc2lvbiBudW1iZXIsIHcvbyB0cnlpbmcgdG8gbG9hZCB0aGVtICh3aGljaCBtYXkgZmFpbCBpZgp0aGUgZW52aXJvbm1lbnQgaXMgbm90IHJpZ2h0KSBbU3Rhc10KCmZpeCBhIGJ1ZyBpbiBNb2RQZXJsOjpSZWdpc3RyeUNvb2tlcjogbm93IHN0cmlwcGluZyBfXyhFTkR8REFUQSlfXwpvbmx5IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpbmUgW1N0YXNdCgpBUFI6OkJhc2U2NCA6IFtUb3JzdGVuIEZvZXJ0c2NoIDx0b3JzdGVuLmZvZXJ0c2NoQGdteC5uZXQ+XQotIGZpeCBlbmNvZGVfbGVuKCkgdG8gcmV0dXJuIHRoZSBsZW5ndGggd2l0aG91dCBhY2NvdW50aW5nIGZvciB0aGUKdGVybWluYXRpbmcgJ1wwJyBhcyB0aGUgQyBBUEkgZG9lcy4gCi0gZml4IGVuY29kZSgpIHRvIGNyZWF0ZSB0aGUgc3RyaW5nIG9mIHRoZSBjb3JyZWN0IGxlbmd0aCAocHJldmlvdXNseQp3YXMgY3JlYXRpbmcgb25lIHRvbyBtYW55KQoKaW4gbW9kX3BlcmwgY2FsbGJhY2tzIG1lcmdlIGVycm9yLW5vdGVzIGVudHJpZXMgcmF0aGVyIHRoYW4gc3RvcmUganVzdAp0aGUgbmV3ZXN0IGVycm9yIFtNYXJrIDxtYXJrQGltbWVybWFpbC5jb20+XQoKRXhwb3NlIEFwYWNoZTI6OkNvbnN0OjpFWEVDX09OX1JFQUQgKGFkZGVkIHRvIHRoZSA6b3ZlcnJpZGUgZ3JvdXApCltTdGFzXQoKRml4IGEgYnVnIGluIGN1c3RvbSBkaXJlY3RpdmUgaW1wbGVtZW50YXRpb24sIHdoZXJlIHRoZSBjb2RlIGNhbGxlZApmcm9tIG1vZHBlcmxfbW9kdWxlX2NvbmZpZ19tZXJnZSgpIHdhcyBzZXR0aW5nIHRoZSBnbG9iYWwgY29udGV4dAphZnRlciBzZWxlY3RpbmcgdGhlIG5ldyBpbnRlcnByZXRlciB3aGljaCB3YXMgbGVhZGluZyB0byBhIHNlZ2ZhdWx0IGluCmFueSBoYW5kbGVyIGNhbGxlZCB0aGVyZWFmdGVyLCB3aG9zZSBjb250ZXh0IHdhcyBkaWZmZXJlbnQKYmVmb3JlaGFuZC4gW1N0YXNdCgoKCj1pdGVtIDIuMC4wIC0gTWF5IDIwLCAyMDA1CgpmaXggZ2xvYmFsIGFub25fY250IGRvdWJsZS1pbml0aWFsaXphdGlvbiBidWcgdGhhdCB3YXMgY2F1c2luZwpzdGFydHVwIHNlZ2ZhdWx0cyBvbiBPU1guIFtHb3plcl0KCmZpeCB0aGUgYXBfaW5zdGFsbCB0YXJnZXQgaW4gdGhlIHRvcC1sZXZlbCBNYWtlZmlsZSAodXNlZCBmb3Igc3RhdGljCmJ1aWxkKSBbU3Rhc10KClJlaW50cm9kdWNlIGEgcHVyZS1QZXJsIHZlcnNpb24gb2YgTW9kUGVybDo6VXRpbDo6dW5sb2FkX3BhY2thZ2UoKQpUaGUgcHJvYmxlbWF0aWMgWFMgdmVyc2lvbiBpcyBub3cgY2FsbGVkIHVubG9hZF9wYWNrYWdlX3hzKCkgYW5kCm5vdCB1c2VkIGJ5IGRlZmF1bHQgW0dvemVyXQoKTW9yZSBBUFI6OlN0YXR1cyB3cmFwcGVyczogIFtTdGFzLCBSYW5keSBLb2Jlc10KLSBpc19FT0YKLSBpc19FQ09OTkFCT1JURUQKLSBpc19FQ09OTlJFU0VUCi0gaXNfVElNRVVQCgptYWtlIHN1cmUgdGhhdCB0aGUgYnVpbGQgcGlja3MgdXAgdGhlIGluY2x1ZGUgZGlyZWN0b3JpZXMgYmFzZWQgb24gdGhlCmFweHMgcXVlcmllcyBhbmQgb25seSBzZWFyY2ggdGhlIGh0dHBkIHNvdXJjZSBpZiAkc2VsZi0+e01QX0FQX1BSRUZJWH0Kd2FzIHNldC4gRWFybGllciBpdCB3YXMgYWx3YXlzIHBpY2tpbmcgdGhlIGhlYWRlcnMgZnJvbSB0aGUgaHR0cGQKc291cmNlIGlmIGl0IHdhcyBhdmFpbGFibGUsIHdoaWNoIHdhcyByZXN1bHRpbmcgaW4gdGhlIHdyb25nIGhlYWRlcnMKaWYgdGhlIGluc3RhbGxlZCBodHRwZCB3YXMgZGlmZmVyZW50IHRoYW4gdGhlIHNvdXJjZSB0aGF0IHdhcyBmb3VuZApbU3Rhc10KCmludHJvZHVjZSBNb2RQZXJsOjpSZWdpc3RyeVByZWZvcmsgYW5kIE1vZFBlcmw6OlBlcmxSdW5QcmVmb3JrLCB3aGljaApiZWhhdmUgdGhlIHNhbWUgYXMgTW9kUGVybDo6UmVnaXN0cnkgYW5kIE1vZFBlcmw6OlBlcmxSdW4sCnJlc3BlY3RpdmVseSwgYnV0IGNoZGlyIHRvIHRoZSBzY3JpcHQncyBkaXJlY3RvcnkgbGlrZSBtb2RfY2dpCmRvZXMuIFRoZXNlIHR3byBuZXcgaGFuZGxlcnMgd2lsbCByZWZ1c2UgdG8gbG9hZCB1bmRlciB0aHJlYWRlZCBNUE1zCndoZXJlIGNoZGlyIGNhbid0IGJlIHVzZWQgYXMgaXQgd2lsbCBhZmZlY3QgYWxsIHJ1bm5pbmcgdGhyZWFkcyBbU3Rhc10KCk1vZFBlcmw6OlJlZ2lzdHJ5Q29va2VyOjpjaGRpcl9maWxlX25vcm1hbCgpIG5vdyBjaGRpcnMgdG8gdGhlIGN1cnJlbnQKc2NyaXB0J3MgZGlyZWN0b3J5IG9yIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5IGFzIGFuIGFyZ3VtZW50LCBhcyBpdAp3YXMgcGxhbm5lZCBpbiBmaXJzdCBwbGFjZS4gVGhlcmVmb3JlIHN3aXRjaCBNb2RQZXJsOjpSZWdpc3RyeSBhbmQKTW9kUGVybDo6UGVybFJ1biB0byB1cyBOT1AgZm9yIHRoaXMgbWV0aG9kIGNhbGwuIElmIGNoZGlyX2ZpbGUgaXMKbWFwcGVkIHRvIGNoZGlyX2ZpbGVfbm9ybWFsKCksIHRoZW4gcnVuKCkgYW5kCmNvbnZlcnRfc2NyaXB0X3RvX2NvbXBpbGVkX2hhbmRsZXIoKSBub3cgY2FsbCBjaGRpciB0byB0aGUgc2NyaXB0J3MKZGlyZWN0b3J5IGFuZCBhdCBiZWZvcmUgcmV0dXJuaW5nIGdvIGJhY2sgdG8gdGhlIHNlcnZlciByb290LiBbU3Rhc10KCnByZXZlbnQgdW5kZWYgd2FybmluZ3MgaW4gY2F0ZmlsZSgpIGNhbGxzIGluIEFwYWNoZTI6OkJ1aWxkIHdoZW4KY2FsbGVkIGZyb20gdGhlIE1vZFBlcmwtUmVnaXN0cnkgdHJlZSBbU3Rhc10KCmZpeCBtb2RwZXJsX2JyaWdhZGVfZHVtcCB0byB1c2UgYXByX2ZpbGVfcHJpbnRmKCkgaW5zdGVhZCBvZgpmcHJpbnRmKCksIHdoaWNoIGRvZXNuJ3Qgd29yayBldmVyeXdoZXJlIFtTdGFzXQoKRml4IGEgd2FybmluZyB0cmlnZ2VyZWQgYnkgYGxuYCBvbiBDeWd3aW4sIHdoZW4gcnVubmluZyBwZXJsCk1ha2VmaWxlLlBMIGZvciBhIHNlY29uZCB0aW1lIHdpdGhvdXQgcHJldmlvdXNseSBydW5uaW5nIG1ha2UKY2xlYW4uIFtOaWtvbGF5IEFuYW5pZXYgPGFuYW5pZXZAdGhlZ2RiLmNvbT5dCgpXaGVuIGNvbXBpbGluZyBhIHN0YXRpYyBtb2RfcGVybCBhbmQKTVBfQVBfQ09ORklHVVJFPSItLXdpdGgtYXByPS9zb21lL3BhdGgiIGFyZ3VtZW50IGlzIGdpdmVuLCBBcGFjaGUgd2lsbAp1c2UgdGhlIGFwci1jb25maWcgYXQgdGhlIGdpdmVuIHBhdGgsIGJ1dCBtb2RfcGVybCB3YXMgdXNpbmcgdGhlCmRlZmF1bHQgYXQgInNyY2xpYi9hcHIvLmxpYnMiLiBGaXggdGhhdCBbTmlrb2xheSBBbmFuaWV2IDxhbmFuaWV2QHRoZWdkYi5jb20+XQoKU2hvdyBNUF9BUFVfQ09ORklHIGFzIGFuIGFyZ3VtZW50IHRvIE1ha2VmaWxlLlBMIGluIHRoZSBVc2FnZQptZW51LiBbTmlrb2xheSBBbmFuaWV2IDxhbmFuaWV2QHRoZWdkYi5jb20+XQoKTWFrZWZpbGUuUEw6IGZpeCB0aGUgcHJlLXJlbmFtZSBtcDIgaW5zdGFsbCBkaWFnbm9zdGljcyBjb2RlLCB0byB1c2UKdGhlIG1wIHZlcnNpb24gb2YgMS45OTl4eCBhbmQgbm90IDEuOTk5X3h4LCBhcyB0aGUgbGF0dGVyIGlzCnVuc3VpdGFibGUgZm9yIG51bWVyaWNhbCBjb21wYXJpc29uLCBhbHNvIGZpeCB0aGUgbmFtZSBvZiB0aGUgcmVwb3J0ZWQKY29uZmxpY3RpbmcgZGlyZWN0b3J5IFtTdGFzXS4KCmFkZCBBUFI6OlN0YXR1czo6aXNfKEVBQ0NFU3xFTk9FTlQpLCBhbmQgdXNlIGluIE1vZFBlcmw6OlJlZ2lzdHJ5Q29va2VyCnRvIHJldHVybiwgYXMgYXBwcm9wcmlhdGUsIEFwYWNoZTI6OkNvbnN0OjooRk9SQklEREVOfE5PVF9GT1VORCksCmJhc2VkIG9uICRALiBBbHNvIHJlbW92ZSBhIGNoZWNrIGluIG1vZHBlcmxfc2x1cnBfZmlsZW5hbWUKb2Ygc3JjL21vZHVsZXMvcGVybC9tb2RwZXJsX3V0aWwuYyB0byBlbmFibGUgJEAgdG8gYmUgc2V0IHdoZW4Kb3BlbmluZyBvciByZWFkaW5nIGEgZmlsZSBmYWlscy4gVGhpcyBmaXhlcyBhIGJ1ZyBvbiBXaW4zMiwgcmV2ZWFsZWQKaW4gNDA0LnQgYW5kIHJlZGlyZWN0LnQgb2YgdGhlIE1vZFBlcmwtUmVnaXN0cnkgdGVzdHMsIGFzIHJlcG9ydGVkCmJ5IFN0ZXZlIEhheSBhbmQgTWFya3VzIFdpY2hpdGlsbCBbU3RhcywgUmFuZHkgS29iZXNdCgpsaW5rIEFwYWNoZTI6OiogYW5kIE1vZFBlcmw6OiogdG8gbW9kX3BlcmwuYSBhbmQgRHluYUxvYWRlci5hLCBidXQKLWxtb2RfcGVybCBhbmQgLWxEeW5hTG9hZGVyIGRvbid0IHdvcmssIGFuZCB3ZSBjYW4ndCBzdXBwbHkgdGhlIGZ1bGwKcGF0aHMsIGJlY2F1c2UgTWFrZU1ha2VyIGRvZXNuJ3QgYWxsb3cgdGhpcy4gSSB3b3JrYXJvdW5kIHRoaXMgYnkKbWFraW5nIGEgc3ltbGluayB0byBtb2RfcGVybC5hIChjYWxsZWQgbGlibW9kX3BlcmwuYSkgYW5kIGNvcHkKRHluYUxvYWRlci5hIHRvIGxpYkR5bmFMb2FkZXIuYSAoSSBkb24ndCBjcmVhdGUgYSBzeW1saW5rLCBiZWNhdXNlLAp3aGVuIHJ1bm5pbmcgbWFrZSBjbGVhbiwgdGhlIHJlYWwgRHluYUxvYWRlci5hIG1heSBnZXQgZGVsZXRlZCkuICBUaGUKQVBSOjoqIGV4dGVuc2lvbnMgYXJlIG5vdCBhZmZlY3RlZCwgYmVjYXVzZSBpbiBib3RoIGNhc2VzIHdlIGxpbmsgdGhlbQphZ2FpbnN0IGFwcmV4dC4gIEFsc28gb3RoZXIgc21hbGwgZml4ZXMgYXJlIGFkZGVkLiBbTmlrb2xheSBBbmFuaWV2CjxhbmFuaWV2QHRoZWdkYi5jb20+XQoKCgoKPWl0ZW0gMS45OTlfMjMgLSBNYXkgMywgMjAwNQoKZml4IEFwYWNoZTI6OkJ1aWxkOjpkeW5hbWljX2xpbmtfTVNXaW4zMiB0byBnZW5lcmF0ZSBhIG5ldyBsaW5lIGFmdGVyCmR5bmFtaWNfbGluayBjb2RlIGluIE1ha2VmaWxlIFtOaWtvbGF5IEFuYW5pZXYgPGFuYW5pZXZAdGhlZ2RiLmNvbT5dCgpmaXggYSB3YXJuaW5nIGluIEFwYWNoZTI6OkJ1aWxkOjpidWlsZF9jb25maWcoKSB3aGVuIGJ1aWxkaW5nCndpdGggTVBfU1RBVElDX0VYVFM9MSBbTmlrb2xheSBBbmFuaWV2IDxhbmFuaWV2QHRoZWdkYi5jb20+XQoKaW1wcm92aW5nIERTTyBzdXBwb3J0IG9uIGN5Z3dpbi4gVGhlIHByb2JsZW0gd2l0aCBjeWd3aW4gaXMgdGhhdCBpdApiZWhhdmVzIGxpa2Ugd2luZG93cyAoaXQncyBhIHBvc2l4IGxheWVyIG92ZXIgd2luZG93cyBhZnRlcgphbGwpLiBUaGF0J3Mgd2h5IHdlIG5lZWQgdG8gc3VwcGx5IGFsbCBzeW1ib2xzIGR1cmluZyBsaW5raW5nIHRpbWUKanVzdCBsaWtlIG9uIHdpbjMyLCBieSBhZGRpbmcgLWxhcHItMCAtbGFwcnV0aWwtMCBhbmQgLWxodHRwZC4gT24Kd2luZG93cywgQXBhY2hlIHN1cHBsaWVzIGFsbCB0aGUgdGhyZWUgbGlicmFyaWVzIGFuZCBpdCdzIGVhc3kgdG8KbGluaywgYnV0IG9uIGN5Z3dpbiBhcGFjaGUgZG9lc24ndCBwbGF5IG5pY2UgYW5kIGRvZXNuJ3Qgc3VwcGx5CmxpYmh0dHBkLiBUaGlzIGNoYW5nZSBhZGRzIGxpYmFwciBhbmQgbGliYXBydXRpbC4gW05pa29sYXkgQW5hbmlldgo8YW5hbmlldkB0aGVnZGIuY29tPl0KCmltcHJvdmUgdGhlIGRpYWdub3N0aWNzIHdoZW4gZGV0ZWN0aW5nIG1wMiA8IDEuOTk5MDIyLCB0ZWxsIHRoZSB1c2VyCndoaWNoIGZpbGVzIGFuZC9vciBkaXJzIG5lZWQgdG8gYmUgcmVtb3ZlZCBbU3Rhc10KCnJlc3RvcmUgdGhlIERFU1RESVIgc3VwcG9ydCBwYXJ0aWFsbHkgbnVrZWQgYnkgdGhlIGFwYWNoZTIgcmVuYW1lCmJyYW5jaCBbVG9yc3RlbiBG9nJ0c2NoIDx0b3JzdGVuLmZvZXJ0c2NoIGdteC5uZXQ+XQoKYWRkIEFQUjo6U3RhdHVzIHRvIHByb3ZpZGUgZnVuY3Rpb25zIGNvcnJlc3BvbmRpbmcgdG8gdGhlCkFQUl9TVEFUVVNfSVNfKiBtYWNyb3Mgb2YgYXByX2Vycm5vLmgsIGVzcGVjaWFsbHkgdGhvc2UgY29tcG9zaXRlcwpsaWtlIEFQUl9TVEFUVVNfSVNfRUFHQUlOKHMpIHdoaWNoIGFyZSBzYXRpc2ZpZWQgYnkgbW9yZSB0aGFuIG9uZQpzcGVjaWZpYyBlcnJvciBjb25kaXRpb24uIFByZXNlbnRseSBvbmx5IEFQUl9TVEFUVVNfSVNfRUFHQUlOIGlzCnByb3ZpZGVkIFtSYW5keSBLb2Jlc10KCmZpeCB0aGUgZ2VuZXJhdGlvbiBvZiB0aGUgbWFucGFnZXMgZm9yIC5wbSBmaWxlcyBmcm9tIHN1Yi1wcm9qZWN0cwpsaWtlIE1vZFBlcmwtUmVnaXN0cnkgKHByZXZpb3VzbHkgd2FzIGNyZWF0aW5nIG1hbnBhZ2UgZmlsZXMgbGlrZQouOjpNb2RQZXJsOjpQZXJsUnVuLjMpIFtTdGFzXQoKZml4IHRoZSBwb2QybWFuJ2lmaWNhdGlvbiBwYXJ0IG9mICdtYWtlIGluc3RhbGwnICh1c2luZyBQT0QyTUFOX0VYRQppbnN0ZWFkIG9mIFBPRDJNQU4gTWFrZWZpbGUgbWFjcm8pIFtTdGFzXQoKCj1pdGVtIDEuOTk5XzIyIC0gQXByaWwgMTQsIDIwMDUKCiAgICAqKioqKioqKioqKioqKioqKioqKiBJTVBPUlRBTlQgKioqKioqKioqKioqKioqKioqKioKICAgIHRoaXMgdmVyc2lvbiBvZiBtb2RfcGVybCBpcyBjb21wbGV0ZWx5IGluY29tcGF0aWJsZQogICAgICB3aXRoIHByaW9yIHZlcnNpb25zIG9mIG1vZF9wZXJsLCBib3RoIDEuWFggYW5kCiAgICAgMS45OV9YWC4gUGxlYXNlIHJlYWQgdGhlIGJlbG93IGNoYW5nZXMgY2FyZWZ1bGx5LgogICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgpyZW1vdmUgTVBfSU5TVF9BUEFDSEUyIGluc3RhbGxhdGlvbiBvcHRpb24gYW5kIEFwYWNoZTIucG0gLSBhbGwKbW9kX3BlcmwgcmVsYXRlZCBmaWxlcyB3aWxsIG5vdyBiZSBpbnN0YWxsZWQgc28gdGhleSBhcmUgdmlzaWJsZQp2aWEgc3RhbmRhcmQgQElOQy4gIGFsc28sIHJlZnVzZSB0byBpbnN0YWxsIG92ZXIgbW9kX3BlcmwgMiB2ZXJzaW9ucwpsZXNzIHRoYW4gMS45OTlfMjIuICBbR2VvZmZyZXkgWW91bmddCgpzL0FwYWNoZTo6L0FwYWNoZTI6Oi9nIGFuZCBzL21vZF9wZXJsL21vZF9wZXJsMi9nIGluIGFsbCBtb2R1bGUKQVBJcy4gIHNvLCBBcGFjaGU6OlJlcXVlc3RSZWMgaXMgbm93IEFwYWNoZTI6OlJlcXVlc3RSZWMsCkFwYWNoZTo6Y29tcGF0IGlzIG5vdyBBcGFjaGUyOjpjb21wYXQsIGFuZCBzbyBvbi4gW2pvZXNdCgptb3ZlIGFsbCBBcGFjaGU6OiBjb25zdGFudHMgdG8gQXBhY2hlMjo6Q29uc3QgYW5kIGFsbCBBUFI6OiBjb25zdGFudHMKdG8gQVBSOjpDb25zdC4gIGZvciBleGFtcGxlLCBBcGFjaGU6T0sgaXMgbm93IEFwYWNoZTI6OkNvbnN0OjpPSyBhbmQKQVBSOjpTVUNDRVNTIGlzIG5vdyBBUFI6OkNvbnN0OjpTVUNDRVNTLiAgW0dlb2ZmcmV5IFlvdW5nXQoKYWRkICRFTlZ7TU9EX1BFUkxfQVBJX1ZFUlNJT059IGFzIHNvbWV0aGluZyB0aGF0IGNsZWFybHkgZGlzdGluZ3Vpc2hlcwp3aGljaCBtb2RfcGVybCB2ZXJzaW9uIGlzIGJlaW5nIHVzZWQgYXQgcmVxdWVzdCB0aW1lLiAgW0dlb2ZmcmV5IFlvdW5nXQoKcmVuYW1lIEFwYWNoZS0+cmVxdWVzdCgpIHRvIEFwYWNoZTI6OlJlcXVlc3RVdGlsLT5yZXF1ZXN0KCksIGFuZApBcGFjaGUtPnNlcnZlcigpIHRvIEFwYWNoZTI6OlNlcnZlclV0aWwtPnNlcnZlcigpCltHZW9mZnJleSBZb3VuZ10KCmZpeCBBcGFjaGUyOjpTdGF0dXMgd2hpY2ggd2FzIGJhaWxpbmcgb3V0IG9uIHRyeWluZyB0byBsb2FkIG1vZHVsZXMKd2l0aCBkZXYgdmVyc2lvbnMgbGlrZSAyLjEyMV8wMiBbU3Rhc10KCldoZW4gcGFyc2luZyBNYWtlZmlsZS5QTCBNUF8qIG9wdGlvbnMsIGhhbmRsZSBjb3JyZWN0bHkgdGhlIE1QX0ZPTz0wCmVudHJpZXMgW1BoaWxpcCBNLiBHb2xsdWNjaSA8cGdvbGx1Y2NpQHA2bTdnOC5jb20+XQoKaW5pdCB0aGUgYW5vbnN1YiBoYXNoIGZvciBiYXNlIHBlcmwgYW5kIGVhY2ggdmhvc3QgK1BhcmVudCAocHJldmlvdXNseQp3YXMgaW5pdCdlZCBvbmx5IGZvciB0aGUgYmFzZSBwZXJsKSBbU3Rhc10KCmZpeCBhIGJ1ZyB3aGVuIGEgbm9uLXRocmVhZGVkIHBlcmwgaXMgdXNlZCBhbmQgYW5vbnltb3VzIHN1YiBpcyBwdXNoZWQKYXQgdGhlIHNlcnZlciBzdGFydHVwICh0aGUgQ1Ygd2Fzbid0IHN1cnZpdmluZykgW1N0YXNdCgpNYWtlIHN1cmUgdGhhdCBDUEFOIHNoZWxsIGRvZXNuJ3QgdHJpcGxlIG92ZXIgdXNhZ2Ugb2YKJEV4dFV0aWxzOjpNYWtlTWFrZXI6OlZFUlNJT04gW1JhbmR5IEtvYmVzXQoKQXBhY2hlMjo6UmVxdWVzdFJlYy0+bmV3IG5vdyBzZXRzICRyLT5yZXF1ZXN0X3RpbWUgW1N0YXNdCgpyZW1vdmUgQ0dJLnBtIGFuZCBBcGFjaGU6OlJlcXVlc3QgZGVwZW5kZW5jaWVzIGZyb20gQXBhY2hlMjo6U3RhdHVzCnNpbmNlIHRoZXkgd2VyZW4ndCB1c2VkIGF0IGFsbCBbR2VvZmZyZXkgWW91bmddCgpGaXhlcyBmb3IgQXBhY2hlMjo6UmVsb2FkJ3MgdG91Y2hmaWxlIGZlYXR1cmUgKHJldHVybiBBcGFjaGUyOjpDb25zdDo6T0sKaW5zdGVhZCBvZiAxKSBbQ2hyaXMgV2FycmVuIDxjaHdhcnJlbkBjaXNjby5jb20+XQoKY3lnd2luIGZpeGVzOiBbTmlrb2xheSBBbmFuaWV2IDxhbmFuaWV2QHRoZWdkYi5jb20+XQotIGRvZXNuJ3QgbGlrZSBYUyB3cmFwcGVyIHN0YXJ0aW5nIHdpdGggJ3N0YXRpYycKLSBuZWVkIHRvIGNvbXBpbGUgZXZlcnl0aGluZyB3aXRoIC1EQ1lHV0lOCgpNb2RQZXJsOjpSZWdpc3RyeUNvb2tlciBBUEkgY2hhbmdlOiBzL3Jld3JpdGVfc2hlYmFuZy9zaGViYW5nX3RvX3BlcmwvCnRoZSBuZXcgQVBJIG5vdyByZXR1cm5zIHRoZSBzdHJpbmcgdG8gcHJlcGVuZCBiZWZvcmUgdGhlIHJlc3Qgb2YgdGhlCnNjcmlwdCwgaW5zdGVhZCBvZiByZXdyaXRpbmcgdGhlIGNvbnRlbnQsIHdoaWNoIGlzIGJvdGggZmFzdGVyIGFuZApkb2Vzbid0IG1pc2xlYWQgdGhlIHBlcmwgZGVidWdnZXIgW0RvbWluaXF1ZSBRdWF0cmF2YXV4Cjxkb21AaWRlYWx4LmNvbT5dCgpTdGFydGluZyBmcm9tIEV4dFV0aWxzOjpNYWtlTWFrZXIgNi4yNiB3ZW50IGJhY2sgdG8gcG1fdG9fYmxpYiB0YXJnZXQKZnJvbSBwbV90b19ibGliLnRzIGludHJvZHVjZWQgaW4gNi4yMiwgc28gbmVlZGVkIHRvIGZpeCB0aGUgZ2x1ZV9wb2QKdGFyZ2V0LCBzbyBpbnN0YWxsIHdpbGwgd29yayBjb3JyZWN0bHkgW1N0YXNdCgpTeW50YXggZXJyb3JzIGluIDxQZXJsPiBzZWN0aW9ucyB3ZXJlIG5vdCBjb3JyZWN0bHkgY2F1Z2h0IGFuZApyZXBvcnRlZC4gW0dvemVyXQoKd2hlbiBidWlsZGluZyBtcDIgRVU6Ok1NIGxvb2tzIGludG8gQXBhY2hlLVRlc3QvTUFOSUZFU1QgYW5kIGNvbXBsYWlucwphYm91dCB0aGUgbWlzc2luZyBBcGFjaGUtVGVzdC9NRVRBLnltbCAod2hpY2ggaXMgaW5kZWVkIG5vdCBpbmNsdWRlZAppbiB0aGUgbW9kcGVybCBwYWNrYWdlIGR1ZSB0byB0aGUgUEFVU0UgcHJvYmxlbXMgb2YgZGVhbGluZyB3aXRoIG1vcmUKdGhhbiBvbmUgTUVUQS55bWwuIFNvbHV0aW9uOiBFeGNsdWRlIEFwYWNoZS1UZXN0L01BTklGRVNUIGZyb20KbW9kX3BlcmwgZGlzdHJpYnV0aW9uIHBhY2thZ2UuIFtTdGFzXQoKTW9kUGVybDo6UmVnaXN0cnkgbm8gbG9uZ2VyIGNoZWNrcyBmb3IgLXggYml0ICh3ZSBkb24ndCBleGVjdXRlZApzY3JpcHRzIGFueXdheSksIGFuZCB0aHVzIHdvcmtzIG9uIGFjbC1iYXNlZCBmaWxlc3lzdGVtcy4gQWxzbwpyZXBsYWNlZCB0aGUgLXIgY2hlY2sgd2l0aCBhIHByb3BlciBlcnJvciBoYW5kbGluZyB3aGVuIHRoZSBmaWxlIGlzCnJlYWQgaW4uIFtEYW1vbiBCdWNrd2FsdGVyIDxidWNrd2FkQGdtYWlsLmNvbT5dCgpBcGFjaGUyOjpSZXF1ZXN0VXRpbDo6c2x1cnBfZmlsZW5hbWUgbm93IHRocm93cyBhbiBBUFI6OkVycm9yIGV4Y2VwdGlvbgpvYmplY3QgKGJlZm9yZSBpdCB3YXMganVzdCBjcm9ha2luZykuIFtTdGFzXQoKZml4IEFQUjo6RXJyb3IncyBvdmVybG9hZCBvZiAnPT0nIChpdCB3YXMgYWx3YXlzIHJldHVybmluZyB0cnVlCmJlZm9yZSksIGFuZCBhZGQgdGhlIGNvcnJlc3BvbmRpbmcgJyE9JyBbU3Rhc10KCmlmICRyLT5kb2N1bWVudF9yb290IHdhcyBtb2RpZmllZCwgcmVzdG9yZSBpdCBhdCB0aGUgZW5kIG9mIHJlcXVlc3QKW2pvZXNdCgpBcGFjaGUyOjpTZXJ2ZXJSZWMgbWV0aG9kIHdoaWNoIHNldCB0aGUgbm9uLWludGVnZXIgZmllbGRzIGluIHRoZQpzZXJ2ZXJfcmVjLCBub3cgY29weSB0aGUgdmFsdWUgZnJvbSB0aGUgcGVybCBzY2FsYXIsIHNvIGlmIGl0IGNoYW5nZXMKb3IgZ29lcyBvdXQgb2Ygc2NvcGUgdGhlIEMgc3RydWN0IGlzIG5vdCBhZmZlY3RlZC4gVXNpbmcgaW50ZXJuYWwgcGVybAp2YXJpYWJsZXMgdG8gcHJlc2VydmUgdGhlIHZhbHVlLCBzaW5jZSB1c2luZyB0aGUgc2VydmVyIHBvb2wgdG8KYWxsb2NhdGUgdGhlIG1lbW9yeSB3aWxsIG1lYW4gYSBtZW1vcnkgbGVhayBbU3Rhc10KCmFkZCB0aGUgZXNjYXBlX3VybCBlbnRyeSBpbiB0aGUgTW9kUGVybDo6TWV0aG9kTG9va3VwIGtub3dsZWRnZWJhc2UKW1N0YXNdCgpBcGFjaGUyOjpTdWJQcm9jZXNzOjpzcGF3bl9wcm9jX3Byb2cgbm93IGNhbiBiZSBjYWxsZWQgaW4gYSB2b2lkCmNvbnRleHQsIGluIHdoaWNoIGNhc2UgYWxsIHRoZSBjb21tdW5pY2F0aW9uIHN0ZCBwaXBlcyB3aWxsIGJlIGNsb3NlZApbU3Rhc10KCmZpeCBhIGJ1ZyBpbiAkci0+ZG9jdW1lbnRfcm9vdCwgd2hpY2ggcHJldmlvdXNseSB3ZXJlbid0IGNvcHlpbmcgdGhlCm5ldyBzdHJpbmcgYXdheSBbU3Rhc10KCmludHJvZHVjZSBhIG5ldyBidWlsZCBvcHRpb24gTVBfQVBfREVTVERJUiB0byBhaWQgcGFja2FnZSBidWlsZGVycwpkaXJlY3QgdGhlIEFwYWNoZS1zcGVjaWZpYyBmaWxlcyB0byB0aGUgcmlnaHQgcGxhY2UuIFtDb3J5IE9tYW5kCjxDb3J5Lk9tYW5kQFN1bi5DT00+XQoKRml4IGJ1ZyBpbiBtb2RwZXJsX3BhY2thZ2VfY2xlYXJfc3Rhc2goKSBzZWdmYXVsdGluZyB3aGVuCmVuY291bnRlcmluZyBkZWNsYXJlZCBidXQgbm90IHlldCBkZWZpbmVkIHN1YnJvdXRpbmVzLgpbU3RldmUgSGF5IDxzdGV2ZS5oYXlAdWsucmFkYW4uY29tPiwgR296ZXJdCgp3aW4zMiBuZWVkcyBQRVJMX1NZU19JTklUMy9QRVJMX1NZU19URVJNIGNhbGxzIFtTdGV2ZSBIYXkKPHN0ZXZlLmhheUB1ay5yYWRhbi5jb20+XQoKRml4IGJyb2tlbiBNUF9TVEFUSUNfRVhUUz0xIGJ1aWxkLiBbR296ZXJdCgpQZXJsIC1EdXNlNjRiaXQgZml4LiBQb2ludGVycyBjYW4ndCBqdXN0IGJlIGdlbmVyaWNhbGx5CmNhc3RlZCBmcm9tL3RvIElWcy4gVXNlIFBUUjJJVi9JTlQyUFRSIGluc3RlYWQuIFtHb3plcl0KClBlcmwgLUR1c2U2NGJpdCBmaXguIGFwcl9zaXplX3QgcG9pbnRlcnMgY2FuJ3QganVzdCBiZSBnZW5lcmljYWxseQpjYXN0ZWQgZnJvbS90byBVVnMuIFVzZSBQVFIyVVYvSU5UMlBUUiBpbnN0ZWFkLiBbR296ZXJdCgpmaXggYSBidWcgaW4gQXBhY2hlMjo6QnVpbGQ6OmRpcjogSWYgdGhlIHJpZ2h0IGRpcmVjdG9yeSBpc24ndCBmb3VuZCBpbgp0aGUgZm9yIGxvb3AgJGRpciBzdGlsbCBjb250YWlucyBhID4gdmFsdWUsIHNvIHRoZSB8fD0gaGFzIG5vCmVmZmVjdC4gW05pY2sgV2VsbG5ob2ZlciA8d2VsbG5ob2ZlckBhZXZ1bS5kZT5dCgoKCj1pdGVtIDEuOTk5XzIxIC0gSmFudWFyeSAyMiwgMjAwNQoKUGVybFBvc3RDb25maWdSZXF1aXJlIHdhcyB0cnlpbmcgdG8gZGV0ZWN0IG1pc3NpbmcgZmlsZXMgZWFybHkgb24sCmJ1dCB3aXRob3V0IHNlYXJjaGluZyB0aHJ1IEBJTkMsIGNhdXNpbmcgZmFsc2UgbmVnYXRpdmVzLiBCZXR0ZXIgb2ZmCnNraXBwaW5nIHRoYXQgY2hlY2sgYW5kIGxlYXZlIGl0IHRvIG1vZHBlcmxfcmVxdWlyZV9maWxlKCkgdG8gcmVwb3J0CnByb2JsZW1zIHdpdGggZmluZGluZyB0aGUgZmlsZS4gIFtQYXRyaWNrIExlQm91dGlsbGllcgo8cGF0cmljay5sZWJvdXRpbGxpZXJAZ21haWwuY29tPiwgR296ZXJdCgphZGQgYSBwZXJsIGJ1ZyB3b3JrYXJvdW5kOiB3aXRoIFVTRV9JVEhSRUFEUyBwZXJsIGxlYWtzIHB0aHJlYWRfa2V5X3QKb24gZXZlcnkgcmVsb2FkIG9mIGxpYnBlcmwue2Esc299IChpdCdzIGFsbG9jYXRlZCBvbiB0aGUgdmVyeSBmaXJzdApwZXJsX2FsbG9jKCkgYW5kIG5ldmVyIGZyZWVkKS4gVGhpcyBiZWNvbWVzIGEgcHJvYmxlbSBvbiBhcGFjaGUKcmVzdGFydDogaWYgdGhlIE9TIGxpbWl0IGlzIDEwMjQsIDEwMjQgcmVzdGFydHMgbGF0ZXIgdGhpbmdzIHdpbGwKc3RhcnQgY3Jhc2hpbmcgW0dpc2xlIEFhcyA8Z2lzbGVAQWN0aXZlU3RhdGUuY29tPiwgU3Rhc10KCm9uIElyaXggbW9kX3Blcmwuc28gbmVlZHMgdG8gc2VlIHRoZSBsaWJwZXJsLnNvIHN5bWJvbHMsIHdoaWNoCnJlcXVpcmVzIHRoZSAtZXhwb3J0cyBvcHRpb24gaW1tZWRpYXRlbHkgYmVmb3JlIC1scGVybC4gIFtHb3Jkb24gTGFjawo8Z21sNDQxMEBnZ3IuY28udWs+XQoKcG9vbCBhcmd1bWVudHMgdG8gc3RhcnR1cCBhbmQgY29ubmVjdGlvbiBjYWxsYmFja3MgbXVzdCBiZSBibGVzc2VkCmludG8gQVBSOjpQb29sIGFuZCBub3QgQXBhY2hlOjpQb29sIGNsYXNzIFtqb2VzXQoKTWFrZSBQZXJsU2V0RW52LCBQZXJsUGFzc0VudiBhbmQgJUVOViBpbiBQZXJsUmVxdXJlLCBQZXJsTW9kdWxlLApQZXJsQ29uZmlnUmVxdWlyZSBhbmQgUGVybFBvc3RDb25maWdSZXF1aXJlIGFmZmVjdCBlYWNoIG90aGVyLCBzbyBhCmNoYW5nZSBpbiBvbmUgb2YgdGhlc2UgaXMgaW1tZWRpYXRlbHkgc2VlbiBpbiB0aGUgb3RoZXJzLiBbUHJhdGlrCjxwcmF0aWtuYWlrIGdtYWlsLmNvbT4sIFN0YXNdCgoKCj1pdGVtIDEuOTk5XzIwIC0gSmFudWFyeSA1LCAyMDA1Cgp0aGUgYXV0b2dlbmVyYXRlZCBtb2R1bGVzIChhbmQgc29tZSBpbXBsZW1lbnRlZCBpbiB4cy8gbW9kdWxlcykgYXJlCm5vdyBnZXR0aW5nIHRoZSBzYW1lIHZlcnNpb24gbnVtYmVyIGFzICRtb2RfcGVybDo6VkVSU0lPTiAodGhlCmV4Y2VwdGlvbiBhcmUgQVBSIG1vZHVsZXMgd2hpY2ggZ2V0IDAuMDA5XzAwMCBmb3Igbm93KS4gW1N0YXNdCgp1bnRpbCB3ZSBmaWd1cmUgb3V0IGhvdyB0byB0ZWxsIFBBVVNFIGluZGV4IGFib3V0IHZlcnNpb25zIG9mIHRoZQphdXRvZ2VuZXJhdGVkIG1vZHVsZXMsIGNyZWF0ZSBhIGZha2UgbW9kdWxlIHdoaWNoIGxpc3RzIGFsbCB0aGUKYXV0b2dlbmVyYXRlZCBtb2R1bGVzIGFuZCB0aGVpciB2ZXJzaW9ucyBhbmQgaW5jbHVkZSB0aGF0IGluIHRoZQpkaXN0cm8uIFtTdGFzXQoKbW92aW5nIHRvIHRoZSB0cmlwbGV0IHZlcnNpb24gbm90YXRpb24sIHdoaWNoIHJlcXVpcmVzIHVzIHRvIGJ1bXAgMS45OQo9PiAxLjk5OSBzbyAxLjk5OTAyMCAobXAyKSA+IDEuMjkgKG1wMSkuIFtTdGFzXQpOb3cgd2UgYXJlIGdvbmcgdG8gaGF2ZToKICAkbW9kX3Blcmw6OlZFUlNJT04gICAgICAgIDogIjEuMDk5MDIwIgogIGludCAkbW9kX3Blcmw6OlZFUlNJT04gICAgOiAxLjA5OTAyCiAgJG1vZF9wZXJsOjpWRVJTSU9OX1RSSVBMRVQ6IDEuOTkuMjAKCjxQZXJsPiBhbmQgUGVybFBvc3RDb25maWdSZXF1aXJlcyB3ZXJlIGxlYWtpbmcgc29tZSBtZW1vcnkgYXQKc3RhcnR1cC4gVXNlIHBhcm1zLT50ZW1wX3Bvb2wgaW5zdGVhZCBvZiBwYXJtcy0+cG9vbCBmb3IgdGVtcG9yYXJ5Cm1lbW9yeSBhbGxvY2F0aW9ucy4gW0dvemVyXQoKZGVhbCB3aXRoIGEgc2l0dWF0aW9uIHdoZXJlIGFuIG9iamVjdCBpcyB1c2VkIHRvIGNvbnN0cnVjdCBhbm90aGVyCm9iamVjdCwgYnV0IGl0J3MgdGhlbiBhdXRvLURFU1RST1llZCBieSBwZXJsIHJlbmRlcmluZyB0aGUgb2JqZWN0IHRoYXQKdXNlZCBpdCBjb3JydXB0ZWQuIHRoZSBzb2x1dGlvbiBpcyB0byBtYWtlIHRoZSBuZXdseSBjcmVhdGVkIG9iamVjdHMKcmVmZXIgdG8gdGhlIHVuZGVybHlpbmcgb2JqZWN0IHZpYSBtYWdpYyBhdHRhY2htZW50LiBvbmx5IG9iamVjdHMKdXNpbmcgb2JqZWN0cyB0aGF0IGhhdmUgREVTVFJPWSBhcmUgZWZmZWN0ZWQuIFRoaXMgY29uY2VybnMgc29tZSBvZgp0aGUgbWV0aG9kcyBhY2NlcHRpbmcgdGhlIGN1c3RvbSBBUFI6OlBvb2wgb2JqZWN0IChub3QgbmF0aXZlIHBvb2xzCmxpa2UgJHItPnBvb2wpLiBbU3Rhc10KQWRqdXN0ZWQ6IAotIEFQUjo6QnJpZ2FkZTogbmV3Ci0gQVBSOjpGaW5mbzogc3RhdAotIEFQUjo6SXBTdWJuZXQ6IG5ldwotIEFQUjo6VGFibGU6IGNvcHksIG92ZXJsYXksIG1ha2UKLSBBUFI6OlRocmVhZE11dGV4OiBuZXcKLSBBUFI6OlVSSTogcGFyc2UKLSBBcGFjaGU6OlJlcXVlc3RVdGlsOiBuZXcKLSBBUFI6OlBvb2w6IG5ldwotIEFQUjo6QnVja2V0QWxsb2M6IG5ldwoKQVBSOjpCdWNrZXQ6OmFsbG9jX2NyZWF0ZSBtb3ZlZCAgdG8gQVBSOjpCdWNrZXRBbGxvYzo6bmV3CkFQUjo6QnVja2V0OjphbGxvY19kZXN0cm95IG1vdmVkIHRvIEFQUjo6QnVja2V0QWxsb2M6OmRlc3Ryb3kgW1N0YXNdCgpwcmVmb3JrIGhhbmRsZXJzIG9wdGltaXNhdGlvbjogZG9uJ3QgZHVwIHRoZSBoYW5kbGVyIHN0cnVjdCB1bmxlc3MKdGhpcyBpcyBhIHRocmVhZGVkLW1wbSBbU3Rhc10KCnNwZWVkIHVwIHRoZSAncGVybCBNYWtlZmlsZS5QTCcgc3RhZ2UgW1JhbmR5IEtvYmVzXToKIC0gcmVkdWNlIHRoZSBudW1iZXIgb2YgY2FsbHMgdG8gYnVpbGRfY29uZmlnKCkgb2YKICAgQXBhY2hlOjpCdWlsZCB3aXRoaW4gTW9kUGVybDo6QnVpbGRNTQogLSBjYWNoZSB0aGUgcmVzdWx0cyBvZiB0aGUgY2FsbHMgdG8gYXB4c19jZmxhZ3MsIGFweHNfZXh0cmFfY2ZsYWdzLAogICBhbmQgYXB4c19leHRyYV9jcHBmbGFncyBpbiBBcGFjaGU6OkJ1aWxkCiAtIGluIGFweHMgb2YgQXBhY2hlOjpCdWlsZCwgcmV0dXJuIGEgY2FjaGVkIHJlc3VsdCBvbmx5IHdoZW4gZGVmaW5lZAoKbW92ZSBNb2RQZXJsOjpVdGlsOjpleGl0KCkgaW50byBtb2RfcGVybC5zbywgc2luY2UgaXQgbmVlZHMgdG8gd29yaywKZXZlbiBpZiBNb2RQZXJsOjpVdGlsIHdhc24ndCBsb2FkZWQgW1N0YXNdCgoKCj1pdGVtIDEuOTlfMTkgLSBEZWNlbWJlciAyMywgMjAwNAoKJHItPmhvc3RuYW1lIGlzIG5vdyB3cml0YWJsZSBbR296ZXJdCgpTdGF0aWMgYnVpbGQgd2l0aCBhIFBlcmwgd2l0aG91dCBpdGhyZWFkcyBhbmQgYSBub24tdGhyZWFkZWQgTVBNCndvdWxkIHNlZ2ZhdWx0IG9uIHN0YXJ0dXAuIENhdXNlZCBieSBhIGJ1ZyBpbiBwZXJsJ3MgcGVybF9zaHV0ZG93bigpCmNvZGUuIEZpeGVkIGluIFBlcmwgNS44LjIsIHNvIGl0J3Mgbm93IGEgYnVpbGQgcmVxdWlyZW1lbnQgW0dvemVyXQoKcmVwbGFjZSB0aGUgYWRkZWQgaW4gMS45OV8xNyBjb2RlIG9uIHJlc2V0dGluZy9yZXN0b3JpbmcgUExfdGFpbnRlZCwKd2l0aCBleHBsaWNpdCByZXNldCBiZWZvcmUgYW5kIGFmdGVyIGVhY2ggZWFjaCBjYWxsYmFjay4gVGhpcyBzb2x2ZXMgYQpjb21wbGljYXRlZCB0YWludGluZyBpc3N1ZXMgY2F1c2VkIHdoZW4gcGVybCBleGNlcHRpb24gb2JqZWN0IGlzCnRocm93bi4gcmdzIHN1Z2dlc3RlZCB0aGF0IGl0IHNob3VsZCBiZSBzYWZlLCBzaW1pbGFyIHRvIHBlcmwncyBvd24KcHBfbmV4dHN0YXRlIHdoaWNoIHNheXM6IC8qIEVhY2ggc3RhdGVtZW50IGlzIHByZXN1bWVkIGlubm9jZW50ICovCltTdGFzXQoKTmV3IGNvbmZpZ3VyYXRpb24gZGlyZWN0aXZlczogW0dvemVyXQogLSBQZXJsQ29uZmlnUmVxdWlyZQogICAgSnVzdCBsaWtlIFBlcmxSZXF1aXJlLCBidXQgX2Fsd2F5c18gdHJpZ2dlcnMgYW4gaW1tZWRpYXRlCiAgICBpbnRlcnByZXRlciBzdGFydHVwCiAtIFBlcmxQb3N0Q29uZmlnUmVxdWlyZQogICAgQSBkZWxheWVkIGZvcm0gb2YgUGVybFJlcXVpcmUsIHRoYXQgd2FpdHMgdW50aWwgdGhlIHBvc3RfY29uZmlnCiAgICBwaGFzZSBiZWZvcmUgcmVxdWlyZSdpbmcgZmlsZXMKCmZpeCBhIHdhcm5pbmcgaW4gQXBhY2hlOjpTdGF0dXMgW0pvaG4gV2lsbGlhbXMgPHdpbGxpYW1zIHRuaS5jb20+XQoKSWdub3JlIEFwYWNoZS1UZXN0L01FVEEueW1sIGluIGRpc3RyaWJ1dGlvbiB0YXJiYWxscyB1bnRpbCBQQVVTRQppcyBjYXBhYmxlIG9mIGhhbmRsaW5nIG11bHRpcGxlIE1FVEEueW1sIGZpbGVzIGluIG9uZSBkaXN0cm8gW0dvemVyXQoKbW9kcGVybF9leHBvcnRzLmMgbm93IHdyYXBzIGFsbCBleHBvcnRlZCBmdW5jdGlvbnMgaW4gYSAjaWZuZGVmCmZ1bmN0aW9uX25hbWUgd3JhcHBlciB0byBoZWxwIGluIHdlZWRpbmcgb3V0IGZ1bmN0aW9ucyB0aGF0IG9ubHkgbWFrZQpzZW5zZSBmb3IgY2VydGFpbiBQZXJsIGNvbmZpZ3VyYXRpb25zIChwZXJsaW8sIHRocmVhZHMpICh3aGljaCBhbHNvCmZpeGVzIHN0YXRpYyBidWlsZCBhZ2FpbnN0IHBlcmxpby1kaXNhYmxlZCBwZXJscywgbGlrZSA1LjYueCkgW0dvemVyXQoKZm9yIG1ha2UgdGVzdCwgc2tpcCBjb25maWd1cmluZyBmYXN0Y2dpIGlmIGl0J3MgZm91bmQgaW4gdGhlIGdsb2JhbApodHRwZC5jb25mLCBhcyBpdCBjYXVzZXMgY3Jhc2hlcyBpbiB0aGUgdGVzdCBzdWl0ZSBbU3Rhc10KCmZpeCBNYWtlZmlsZS5QTCBhcmd1bWVudHMgcGFyc2VyIHRvIHN1cHBvcnQgbW9yZSB0aGFuIG9uZSBNUF9mb28Kb3B0aW9uIG9uIHRoZSBzYW1lIGxpbmUgKGluY2x1ZGluZyAubWFrZXBsX2FyZ3MubW9kX3BlcmwyIGZpbGUpIFtTdGFzXQoKZml4IGNvbXBpbGF0aW9uIGlzc3VlcyBpbiBNb2RQZXJsOjpVdGlsOjpjdXJyZW50X3BlcmxfaWQgKG9uIHNvbWUKYnVpbGRzIG5ld1NWcHZmIGNhbid0IGJlIHJlc29sdmVkIGJ1dCBQZXJsX25ld1NWcHZmIHdvcmtzIGp1c3QKZmluZSkuIFtTdGFzLCBNYXJrdXMgV2ljaGl0aWxsIDxtYXdpY0BnbXguZGU+XQoKZml4IEFQUjo6RXJyb3I6OnN0ciB0byByZXR1cm4gYSBsZXhpY2FsIHZhcmlhYmxlLCByYXRoZXIgdGhhbiBhCnN0cmluZy4gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgU3ZUUlVFIGluIG1vZHBlcmxfZXJyc3YoKSB2aWEKb3ZlcmxvYWQgYW5kIG9uIHdpbjMyIChhbmQgcmFuZG9tbHkgb24gbGludXgpIGNhdXNlcyBjcmFzaGVzIHZpYToKIkF0dGVtcHQgdG8gZnJlZSB0ZW1wIHByZW1hdHVyZWx5IiB3YXJuaW5nLCB3aGVyZSB0aGlzICd0ZW1wJyBpcyB0aGUKc3RyaW5nIHJldHVybmVkIGJ5IHRoaXMgZnVuY3Rpb24uIE1ha2luZyBpdCBhIGxleGljYWwgdmFyaWFibGUgYmVmb3JlCnJldHVybmluZyBpdCwgcmVzb2x2ZXMgdGhlIHByb2JsZW0uIFtTdGV2ZSBIYXldCgpmaXggTUVUQS55YW1sIHMvcHJpdmF0ZS9ub19pbmRleC8gKHRvIGhpZGUgdGhlIGJ1bmRsZWQgQXBhY2hlLVRlc3QKZnJvbSBQQVVTRSBpbmRleGVyKSBbUmFuZHkgS29iZXNdCgoKCj1pdGVtIDEuOTlfMTggLSBEZWNlbWJlciAxMiwgMjAwNAoKRml4IHg4Nl82NCB3YXJuaW5ncyBpbiBtb2RwZXJsX3Jlc3RhcnRfY291bnRfKiwgZHVlIHRvIGNhc3RpbmcgYmV0d2VlbgppbnRlZ2VycyBhbmQgcG9pbnRlciB0eXBlcyBbSm9lIE9ydG9uXQoKb3Blbl9sb2dzIGFuZCBwb3N0X2NvbmZpZyBoYW5kbGVycyByZXF1aXJlIHRoZSBBcGFjaGU6Ok9LIHJldHVybiBjb2RlCm9yIHRoZSBzZXJ2ZXIgYWJvcnRzLCBzbyB3ZSBuZWVkIHRvIGxvZyBhbiBlcnJvciBpbiBjYXNlIHRoZSBoYW5kbGVyCmRpZG4ndCBmYWlsIGJ1dCByZXR1cm5lZCBzb21ldGhpbmcgZGlmZmVyZW50IGZyb20gQXBhY2hlOjpPSyBbU3Rhc10KCm5ldyBmdW5jdGlvbiBNb2RQZXJsOjpVdGlsOjpjdXJyZW50X3BlcmxfaWQoKSB3aGljaCByZXR1cm5zIHNvbWV0aGluZwpsaWtlICguZS5nIDB4OTJhYzc2MCkgKGFUSFgpIHVuZGVyIHRocmVhZGVkIG1wbSBhbmQgMCB1bmRlcgpub24tdGhyZWFkZWQgcGVybCAoMHgwKS4gVXNlZnVsIGZvciBkZWJ1Z2dpbmcgbW9kcGVybCB1bmRlciB0aHJlYWRlZApwZXJscy4gIFtTdGFzXQoKbWFrZSBzdXJlIHRoYXQgbW9kcGVybCdzIGludGVybmFsIHBvc3RfY29uZmlnIGNhbGxiYWNrLCB3aGljaCBhbW9uZ3N0Cm90aGVyIHRoaW5ncywgY2xvbmluZyBwZXJsIGludGVycHJldGVycyBpcyBydW5uaW5nIGFzCm1vZHBlcmxfaG9va19wb3N0X2NvbmZpZ19sYXN0IEFQUl9IT09LX1JFQUxMWV9MQVNULCB3aGljaCBlbnN1cmVzIHRoYXQKdXNlcidzIHBvc3RfY29uZmlnIGNhbGxiYWNrcyBhcmUgcnVuIGJlZm9yZSB0aGUgY2xvbmluZy4gbm93IHRoZSBjb2RlCmZyb20gY29uZmlnIHBoYXNlJ3Mgc3RhcnR1cC5wbCBjYW4gYmUgc2FmZWx5IG1vdmVkIHRvIHRoZSBwb3N0X2NvbmZpZwpwaGFzZSdzIGVxdWl2YWxlbnQuIFtTdGFzXQoKRnVydGhlciBzeW5jIHdpdGggbGliYXByIGNvbnN0YW50cyBjaGFuZ2VzOiBbU3Rhc10gCi0gdGhlIGNvbnN0YW50cwogIEFQUjo6KFJFQUR8V1JJVEV8Q1JFQVRFfEFQUEVORHxUUlVOQ0FURXxCSU5BUll8RVhDTHxCVUZGRVJFRHxERUxPTkNMT1NFKQogIG5vdyBoYXZlIGEgcHJlZml4IEFQUjo6Rk9QRU5fIGFuZCBtb3ZlZCBncm91cCBzL2ZpbGVtb2RlL2ZvcGVuLwotIGNvbnN0YW50cyBmcm9tIHRoZSBmaWxlcHJvdCBncm91cCBtb3ZlZCB0byB0aGUgZnByb3QgZ3JvdXAgYW5kIHRoZQogIHByZWZpeCBoYXMgY2hhbmdlZDogZnJvbSBBUFI6OkZJTEVQUk9UXyB0byBBUFI6OkZQUk9UXwotIHRoaXMgYWxzbyBmaXhlcyB0aGUgaW1wb3J0IG9mIEFQUl9FWENMIGFzIGFuIGVycm9yIGNvbnN0YW50Cgokci0+cHJpbnQoKSBhbmQgdGllZCBwcmludCgpIG5vdyByZXR1cm4gMEUwICh6ZXJvIGJ1dCB0cnVlKSB3aGVuIHRoZQpjYWxsIHdhcyBzdWNjZXNzZnVsIGJ1dCBmb3IgemVybyBieXRlcy4gIFtHZW9mZnJleSBZb3VuZ10KCmEgbmV3IGZ1bmN0aW9uIEFwYWNoZTo6U2VydmVyVXRpbDo6c2VydmVyX3NodXRkb3duX2NsZWFudXBfcmVnaXN0ZXIgdG8KcmVnaXN0ZXIgY2xlYW51cHMgdG8gYmUgcnVuIGF0IHNlcnZlciBzaHV0ZG93bi4gW1N0YXNdCgokYmItPmNsZWFudXAgaXMgbm8gbW9yZSBzZWdmYXVsdGluZyAod2FzIHNlZ2ZhdWx0aW5nIGR1ZSB0byBhIGJyb2tlbgpwcm90b3R5cGUgaW4gQVBSLCBhbmQgY29uc2VxdWVudGx5IGludmFsaWQgWFMgZ2x1ZSBjb2RlKSBbUmFuZHkgS29iZXMsClN0YXNdCgptYWtlIHN1cmUgdGhhdCBBQlNQRVJMUlVOIGFuZCBBQlNQRVJMUlVOIGFyZSBkZWZpbmVkIGluCnNyYy9tb2R1bGVzL3BlcmwvTWFrZWZpbGUgKG5lZWRlZCBieSB3aW4zMiBidWlsZCkgW1N0YXNdCgpGb3Igc3RhdGljIGJ1aWxkcywgbW9kX3BlcmwgaGVhZGVyIGZpbGVzIHdlcmUgYmVpbmcgaW5zdGFsbGVkCmludG8gYXBhY2hlJ3Mgc291cmNlIHRyZWUgaW5zdGVhZCBvZiB3aGVyZSBhcGFjaGUgaW5zdGFsbGVkIGl0J3MKb3duIGhlYWRlcnMgW0dvemVyXQoKbW9kcGVybF90aHJlYWRzX3N0YXJ0ZWQoKSB3YXNuJ3Qgd29ya2luZyB1bmRlciBzdGF0aWMgd29ya2VyIGJ1aWxkLApkdWUgdG8gTVBfdGhyZWFkc19zdGFydGVkIHN0YXRpYyB2YXJpYWJsZSBub3QgYmVpbmcgcmVzZXQgb24KcmVzdGFydC4gTm93IHJlc2V0dGluZyBpdC4gW1N0YXNdCgpASU5DIHNocmlua2luZyBlZmZvcnRzOiBbU3Rhc10KMSkgd2hlbiBhZGRpbmcgJFNlcnZlclJvb3QgZG9uJ3QgYWRkIHRoZSB0cmFpbGluZyAvIChhcyBpdCBlbmRzIHVwCnR3aWNlIHdoZW4gYWRkZWQgYnkgQS1UIHcvbyB0cmFpbGluZyAvKQoyKSBhZGQgJFNlcnZlclJvb3QvbGliL3Blcmwgb25seSBpZiBpdCBhY3R1YWxseSBleGlzdHMKCkZvciBzdGF0aWMgYnVpbGRzLCB3ZSBub3cgcnVuICdtYWtlIGNsZWFuJyBpbiBodHRwZCdzIHNvdXJjZQp0cmVlIGJlZm9yZSBydW5uaW5nIC4vY29uZmlndXJlIGlmIHRoZSBzb3VyY2UgdHJlZSBoYXMgYmVlbgpjb25maWd1cmVkIGJlZm9yZSBbR296ZXJdCgpBcGFjaGU6OlNpemVMaW1pdCBwb3J0ZWQgW1BlcnJpbiBIYXJraW5zIDxwZXJyaW4gZWxlbS5jb20+XQoKY3JlYXRlIGEgbmV3IHN1YnBvb2wgbW9kcGVybF9zZXJ2ZXJfdXNlcl9wb29sIChmcm9tCm1vZHBlcmxfc2VydmVyX3Bvb2wpLCB3aGljaCBpcyB1c2VkIGludGVybmFsbHkgYnkKQXBhY2hlOjpTZXJ2ZXJVdGlsOjpzZXJ2ZXJfcmVzdGFydF9yZWdpc3Rlci4gVGhpcyBlbnN1cmVzIHRoYXQKdXNlci1yZWdpc3RlcmVkIGNsZWFudXBzIGFyZSBydW4gKmJlZm9yZSogcGVybCdzIGludGVybmFscyBjbGVhbnVwcwphcmUgcnVuLiAocHJldmlvdXNseSB0aGVyZSB3YXMgYSBwcm9ibGVtIHdpdGggbm9uLXRocmVhZGVkIHBlcmxzIHdoaWNoCndlcmUgc2VnZmF1bHRpbmcgb24gdXNlciBjbGVhbnVwcywgc2luY2UgcGVybCB3YXMgYWxyZWFkeSBnb25lIGJ5IHRoYXQKdGltZSkuIFtTdGFzXQoKU3RhcnRpbmcgZnJvbSBFeHRVdGlsczo6TWFrZU1ha2VyIDYuMjIgaXQgbm8gbG9uZ2VyIGdlbmVyYXRlcwpwbV90b19ibGliIHRhcmdldCwgYnV0IHBtX3RvX2JsaWIudHMsIHNvIG5lZWRlZCB0byBmaXggdGhlIGdsdWVfcG9kCnRhcmdldCwgc28gaW5zdGFsbCB3aWxsIHdvcmsgY29ycmVjdGx5IFtTdGFzXQoKQXBhY2hlOjpSZXF1ZXN0VXRpbCA6ICRyLT5jaGlsZF90ZXJtaW5hdGUoKSBpbXBsZW1lbnRlZCBmb3IKbm9uLXRocmVhZGVkIE1QTXMuIFtHb3plcl0KCm5ldyBBUEkgQXBhY2hlOjpTZXJ2ZXJVdGlsOjpyZXN0YXJ0X2NvdW50KCkgd2hpY2ggY2FuIGJlIHVzZWQgdG8gdGVsbAp3aGV0aGVyIHRoZSBzZXJ2ZXIgaXMgc3RhcnRpbmcvcmVzdGFydGluZy9ncmFjZWZ1bGx5CnJlc3RhcnRpbmcvZXRjLiBCYXNlZCBvbiB0aGlzIGZlYXR1cmUgaW1wbGVtZW50CiRBcGFjaGU6OlNlcnZlcjo6U3RhcnRpbmcgYW5kICRBcGFjaGU6OlNlcnZlcjo6UmVTdGFydGluZyBpbgpBcGFjaGU6OmNvbXBhdCBbU3Rhc10KCkFwYWNoZTo6UmVzb3VyY2UgcG9ydGVkIHRvIG1wMiBbU3Rhc10KCklmIG5vbmUgb2YgTVBfQVBYUywgTVBfQVBfUFJFRklYIGFuZCBNUF9VU0VfU1RBVElDIHdlcmUgc3BlY2lmaWVkIHdoZW4KY29uZmlndXJpbmcgTWFrZWZpbGUuUEwsIHdlIG5vdyBwcm9tcHQgZm9yIEFQWFMgcGF0aCBmaXJzdCBhbmQgb25seSBpZgp0aGF0IGZhaWxzIGFzayBmb3IgTVBfQVBfUFJFRklYLiBUaGlzIGlzIGEgcmVxdWlyZW1lbnQgdG8gZ2V0ICdtYWtlCnRlc3QnIGZpbmQgaHR0cGQuIFtTdGFzXQoKRHluYW1pY2FsbHkgcHJvbXB0IGFuZCBhZGQgTVBfSU5TVF9BUEFDSEUyPTEgd2hlbiBpbnN0YWxsaW5nIG9uCnN5c3RlbXMgd2l0aCBtb2RfcGVybCAxIHByZWluc3RhbGxlZC4gW1N0YXNdCgpmaXggdGhlIGxvZ2dpbmcgY2FsbCBpbiBSZWdpc3RyeUNvb2tlciBbTGFycyBFZ2dlcnQgPGxhcnMuZWdnZXJ0Cm5ldGxhYi5uZWMuZGU+XQoKZml4ICRyLT5maWxlbmFtZSBpbiBBcGFjaGU6OmNvbXBhdCB0byB1cGRhdGUgdGhlIGZpbmZvIHN0cnVjdCAod2hpY2gKaXMgaG93IGl0IHdvcmtlZCBpbiBtcDEpIFtTdGFzXQoKZW5jbG9zZSBhbGwgb2NjdXJlbmNlcyBvZiBldmFsXyogd2l0aCBFTlRFUjtTQVZFVE1QUzsKLi4uIEZSRUVUTVBTO0xFQVZFOyBwcmV2aW91c2x5IHRoaW5ncyBqdXN0IGhhcHBlbmVkIHRvIHdvcmssIGR1ZSB0bwpleHRlcm5hbCBzY29wZXMgd2hpY2ggd2FzIG5vdCB2ZXJ5IHJlbGlhYmxlIGFuZCBzb21lIGNoYW5nZSBjb3VsZAppbnRyb2R1Y2Ugb2JzdXJlIGJ1Z3MuIFtTdGFzXQoKaW4gY2FzZSBhIG5hdGl2ZSBhcGFjaGUgcmVzcG9uc2UgZmlsdGVyIGlzIGNvbmZpZ3VyZWQgb3V0c2lkZSB0aGUKPExvY2F0aW9uPiBibG9jayB3aXRoIFBlcmxTZXQqRmlsdGVyIGRpcmVjdGl2ZSwgbWFrZSBzdXJlIHRoYXQKbW9kX3BlcmwgZG9lc24ndCB0cnkgdG8gYWRkIGl0IGFzIGNvbm5lY3Rpb24gZmlsdGVyIChwcmV2aW91c2x5IHdhcwpsb2dnaW5nIGFuIGVycm9yIGxpa2U6IFtlcnJvcl0gYSBjb250ZW50IGZpbHRlciB3YXMgYWRkZWQgd2l0aG91dCBhCnJlcXVlc3Q6IGluY2x1ZGVzKSBbU3Rhc10KCnJlcGxhY2UgdGhlIHNsb3cgaW1wbGVtZW50YXRpb24gb2YgYW5vbiBoYW5kbGVycyB1c2luZyBCOjpEZXBhcnNlLAp3aXRoIHBlci1pbnRlcnByZXRlciBjYWNoZSBvZiBjb21waWxlZCBDT0RFIHJlZnMgKHNvcnQgb2YgZW11bGF0aW5nCm5hbWVkIHN1YnJvdXRpbmVzIGZvciBhbm9ueW1vdXMgaGFuZGxlcnMpIFtTdGFzXS4KCmF2b2lkIHNlZ2ZhdWx0cyB3aGVuIGEgYm9ndXMgJHIgb2JqZWN0IGlzIHVzZWQgW1N0YXNdCgpSZW1vdmUgbWFnaWNuZXNzIG9mIFBlcmxMb2FkTW9kdWxlIGFuZCBpbXBsZW1lbnQgQXBhY2hlOjpNb2R1bGU6OmFkZCgpCmZvciBtb2R1bGVzIHRoYXQgaW1wbGVtZW50IHRoZWlyIG93biBjb25maWd1cmF0aW9uIGRpcmVjdGl2ZXMgW0dvemVyXQoKQXBhY2hlOjpDb25uZWN0aW9uOjpyZW1vdGVfaXAgaXMgbm93IHNldHRhYmxlIChuZWVkZWQgdG8gc2V0IHRoZQpyZW1vdGVfaXAgcmVjb3JkIGJhc2VkIG9uIHByb3h5J3MgWC1Gb3J3YXJkZWQtRm9yIGhlYWRlcikgW1N0YXNdCgpGaXggTW9kcGVybDo6VXRpbDo6dW5sb2FkX3BhY2thZ2UoKSBbR296ZXJdCiAgLSBNaXN0YWtlbmx5IHNraXBwaW5nIHNtYWxsIGVudHJpZXMgb2Ygc2l6ZSAyIGFuZCBsZXNzCiAgLSBMZWF2ZSBlbnRyaWVzIGZyb20gb3RoZXIgcGFja2FnZXMgYWxvbmUKCiRmaWx0ZXItPnJlbW92ZSBub3cgd29ya3Mgd2l0aCBuYXRpdmUgKG5vbi1tb2RwZXJsKSBmaWx0ZXJzICsgdGVzdApbVG9yc3RlbiBG9nJ0c2NoIDx0b3JzdGVuLmZvZXJ0c2NoIGdteC5uZXQ+XQoKCgo9aXRlbSAxLjk5XzE3IC0gT2N0b2JlciAyMiwgMjAwNAoKSW1wbGVtZW50IEFwYWNoZS0+dW5lc2NhcGVfdXJsX2luZm8gaW4gQXBhY2hlOjpjb21wYXQgYW5kIGRyb3AgaXQKZnJvbSB0aGUgb2ZmaWNpYWwgQVBJIGZvciBDR0k6OlV0aWw6OnVuZXNjYXBlKCkgYXMgYSBzdWdnZXN0ZWQKcmVwbGFjZW1lbnQgW0dvemVyXQoKZml4IHhzX2dlbmVyYXRlIHRvIGNyb2FrIG9uIGR1cGxpY2F0ZSBlbnRyaWVzIGluIHhzL21hcHMgZmlsZXMKW0NocmlzdGlhbiBLcmF1c2UgPGNoa3IgcGxhdWVuZXIuZGU+XQoKV29ya2Fyb3VuZCBhIHBvc3NpYmxlIGJ1ZyBpbiBQZXJsX2xvYWRfbW9kdWxlKCkgW0dvemVyXQoKRml4IGEgcHJvYmxlbSBidWlsZGluZyB3aXRoIG5vbi1HTlUgbWFrZSAoY2FuJ3QgbWFrZSB0YXJnZXQgZHluYW1pYwppbiB4cy9BUFIvYXByZXh0KSBbR296ZXJdCgplc2NhcGUgSFRNTCBpbiBkdW1wZWQgdmFyaWFibGVzIGJ5IEFwYWNoZTo6U3RhdHVzIFtNYXJrdXMgV2ljaGl0aWxsCjxtYXdpY0BnbXguZGU+XQoKJHItPmRvY3VtZW50X3Jvb3QgY2FuIG5vdyBiZSBjaGFuZ2VkIHdoZW4gc2FmZSB0byBkbyBzbyBbR296ZXJdCgpBUFI6OkJ1Y2tldC0+bmV3IG5vdyByZXF1aXJlcyBhbiBBUFI6OkJ1Y2tldEFsbG9jIGFzIGl0cyBmaXJzdCBhcmd1bWVudC4KTmV3IHN1YnMgYWRkZWQ6IEFQUjo6QnVja2V0OjpzZXRhc2lkZSwgQVBSOjpCdWNrZXQ6OmFsbG9jX2NyZWF0ZSwKQVBSOjpCdWNrZXQ6OmFsbG9jX2Rlc3Ryb3ksIEFQUjo6QnJpZ2FkZTo6YnVja2V0X2FsbG9jLiBbam9lc10KCnJlaW1wbGVtZW50IEFQUjo6UG9vbCBsaWZlLXNjb3BlIGhhbmRsaW5nLCAodGhlIHByZXZpb3VzCmltcGxlbWVudGF0aW9uIGhhZCBwcm9ibGVtcykgW2pvZXNdCgptYWtlIHN1cmUgdGhhdCBBcGFjaGU6OkZpbHRlcjo6cmVhZCwgQVBSOjpTb2NrZXQ6OnJlY3YsCkFwYWNoZTo6UmVxdWVzdElPOjpyZWFkLCBBUFI6OkJyaWdhZGU6OmZsYXR0ZW4sIGFuZCBBUFI6OkJ1Y2tldDo6cmVhZAphbGwgcmV0dXJuIHRhaW50ZWQgZGF0YSB1bmRlciAtVCBbU3Rhc10KCnRhZyB0aGUgY3VzdG9tIHBvb2xzIGNyZWF0ZWQgYnkgbW9kX3BlcmwgZm9yIGVhc2llciBwb29scyBkZWJ1ZyBbSm9lCk9ydG9uXQoKZml4IGEgYnVnIGluIG5vbi1pdGhyZWFkZWQtcGVybCBpbXBsZW1lbnRhdGlvbiB3aGVyZSB0aGUgY2FjaGVkCmNvbXBpbGVkIENPREUgcmVmcyBvZiBodHRwZC5jb25mLWlubGluZWQgb25lLWxpbmVyIGhhbmRsZXJzIGxpa2U6ClBlcmxGaXh1cEhhbmRsZXIgJ3N1YiB7IHVzZSBBcGFjaGU6OkNvbnN0IHF3KERFQ0xJTkVEKTsgREVDTElORUQgfScKZGlkbid0IGhhdmUgdGhlIHJlZmVyZW5jZSBjb3VudCByaWdodC4gW1N0YXNdCgpwZXItc2VydmVyIFBlcmxTZXRFbnYgYW5kIFBlcmxQYXNzRW52IHZhbHVlcyBhcmUgcHJvcGVybHkgYWRkZWQKdG8gJUVOViB3aGVuIG9ubHkgYSBwZXItZGlyZWN0b3J5IGhhbmRsZXIgaXMgY29uZmlndXJlZC4KW0dlb2ZmcmV5IFlvdW5nXQoKcmVzb2x2ZSBzZXZlcmFsICdVc2Ugb2YgdW5pbml0aWFsaXplZCB2YWx1ZSBpbi4uLicgd2FybmluZ3MgaW4KQXBhY2hlOjpTdGF0dXMgW1N0YXNdLgoKbWFrZSBpbnN0YWxsIGFuZCBzdGF0aWMgYnVpbGQgbm93IGNvcnJlY3RseSBpbnN0YWxscyBtb2RfcGVybCBhcwp3ZWxsIGFzIHRoZSBzdGF0aWNhbGx5IGJ1aWx0IGFwYWNoZSBbR296ZXJdCgppZiBzb21lIGNvZGUgY2hhbmdlcyB0aGUgY3VycmVudCBpbnRlcnByZXRlcidzIHRhaW50ZWQgc3RhdGUgdG8gb24sCnRoZSByZXR1cm4gdmFsdWUgZnJvbSB0aGUgaGFuZGxlciBjYWxsYmFjayB3aWxsIGJlIHRhaW50ZWQsIGFuZCB3ZQpmYWlsIHRvIGRlYWwgd2l0aCB0aGF0LiBTbyByZXZlcnQgdG8gY29lcmNpbmcgYW55IHJldHVybiB2YWx1ZSwgYnV0CnVuZGVmIChhIHNwZWNpYWwgY2FzZSBmb3IgZXhpdCgpKS4gdG8gSVYsIHNvIHRoYXQgdGFpbnRlZCB2YWx1ZXMgYXJlCmhhbmRsZWQgY29ycmVjdGx5IGFzIHdlbGwuIFtTdGFzXQoKbWFrZSBzdXJlIHRoYXQgZWFjaCBoYW5kbGVyIGNhbGxiYWNrIHN0YXJ0cyB3aXRoIGEgcHJpc3RpbmUKdGFpbnRlZC1uZXNzIHN0YXRlLCBzbyB0aGF0IHByZXZpb3VzIGNhbGxiYWNrIGNhbGxzIHdvbid0IGFmZmVjdCB0aGUKY29uc2VxdWVudCBvbmVzLiBXaXRob3V0IHRoaXMgY2hhbmdlIGFueSBoYW5kbGVyIHRyaWdnZXJpbmcgZXZhbCBvcgphbm90aGVyIGZ1bmN0aW9uIGNhbGwsIHRoYXQgY2hlY2tzIFRBSU5UX1BST1BFUiwgd2lsbCBjcmFzaCBtb2RfcGVybAp3aXRoOiAiSW5zZWN1cmUgZGVwZW5kZW5jeSBpbiBldmFsIHdoaWxlIHJ1bm5pbmcgc2V0Z2lkLiBDYWxsYmFjawpjYWxsZWQgZXhpdC4iIGZhcmV3ZWxsIG1lc3NhZ2UgW1N0YXNdCgptYWtlIHN1cmUgdGhhdCAnbWFrZSBkaXN0Y2xlYW4nIGNsZWFucyBhbGwgdGhlIGF1dG9nZW5lcmF0ZWQgZmlsZXMKW1N0YXNdCgokci0+bG9nX3JlYXNvbiBoYXMgYmVlbiBwb3J0ZWQgYW5kIG1vdmVkIG91dCBvZiBBcGFjaGU6OmNvbXBhdApbR296ZXJdCgpBUFI6Ok9TOjp0aHJlYWRfY3VycmVudCByZW5hbWVkIEFQUjo6T1M6OmN1cnJlbnRfdGhyZWFkX2lkIGFuZApub3cgcmV0dXJucyB0aGUgYWN0dWFsIHRocmVhZF9pZCBpbnN0ZWFkIG9mIGFuIG9iamVjdCB0aGF0Cm5lZWRlZCB0byBiZSBkZXJlZmVyZW5jZWQgdG8gZ2V0IGF0IHRoZSB0aHJlYWRfaWQgW0dvemVyXQoKY2hhbmdlIGEgYnVuY2ggb2YgdGhlIEFQUjo6IGNvbnN0YW50cyB0byBoYXZlIGEgYmV0dGVyIHByZWZpeAooQVBSOjpGSUxFVFlQRV8qIGFuZCBBUFI6OkZJTEVQUk9UXykuIGxpYmFwciB3aWxsIGJlIGNoYW5nZWQgc29vbiB0b28KW1N0YXNdCgpHZW5lcmF0ZSBtb2RwZXJsX2V4cG9ydHMuYyBmb3Igc3RhdGljIGJ1aWxkcyB0byBwcmV2ZW50IHRoZQpsaW5rZXIgZnJvbSBzdHJpcHBpbmcgbmVlZGVkIGJ1dCB1bnVzZWQgc3ltYm9scyBbR296ZXJdCgpBZGQgLmxpYnMvIGFzIHBhcnQgb2YgdGhlIGxpYnJhcnkgc2VhcmNoIHBhdGggd2hlbiBidWlsZGluZwphZ2FpbnN0IGh0dHBkJ3Mgc291cmNlIHRyZWUgW0dvemVyXQoKSW4gdGhlIHN0YXRpYyBidWlsZCwgcnVuIG1ha2UgaW4gaHR0cGQncyBzcmNsaWIvIGVhcmx5IHRvIGhhdmUKZ2VuZXJhdGVkIGZpbGVzIHByZXNlbnQgYXQgbW9kX3BlcmwgY29uZmlndXJlIHRpbWUgW0dvemVyXQoKV2hlbiBzZWFyY2hpbmcgZm9yIGFwKHJ8dSktY29uZmlnIGluIGh0dHBkJ3Mgc291cmNlIHRyZWUsIHNlYXJjaAppbnRvIHNyY2xpYi9hcHItdXRpbCBhcyB3ZWxsIGFzIHNyY2xpYi9hcHIgW0dvemVyXQoKUmVtb3ZlIEFQUjo6RmluZm86OnBvb2wgYXMgaXQgaGFzIG5vIHVzZSB0byB1cyBbU3Rhc10KCmdldCBQZXJsU2V0VmFyIGFuZCBQZXJsQWRkVmFyIG11bHRpLWxldmVsIG1lcmdlcyB0byAoZmluYWxseSkgd29yawpwcm9wZXJseS4gIFtSaWNpIExha2UgPHJpY2kgcmljaWxha2UubmV0Pl0KCk1QX0FQX0JVSUxEIGNvbmZpZ3VyZSBvcHRpb24gcmVtb3ZlZC4gTm93IGltcGxpY2l0IHdoZW4gTVBfVVNFX1NUQVRJQwppcyBzcGVjaWZpZWQgW0dvemVyXQoKQXBhY2hlOjpNb2R1bGUgJG1vZC0+dmVyc2lvbigpIGFuZCAkbW9kLT5taW5vcl92ZXJzaW9uKCkgcmVuYW1lZAp0byAkbW9kLT5hcF9hcGlfbWFqb3JfdmVyc2lvbigpIGFuZCAkbW9kLT5hcF9hcGlfbWlub3JfdmVyc2lvbgpmb3IgY2xhcml0eSBbR296ZXJdCgpBcGFjaGU6OkxvZyBjaGFuZ2VzOiBbU3Rhc10KICAtIG1vdmVkIHRvIGNvbXBhdDogQXBhY2hlOjp3YXJuLCBBcGFjaGUtPndhcm4sIEFwYWNoZTo6U2VydmVyLT53YXJuLAogICAgQXBhY2hlOjpTZXJ2ZXI6Ondhcm4KICAtIHJlLWVuYWJsZWQgJHItPndhcm4KICAtIHJlbW92ZWQgc3VwcG9ydCBmb3IgQXBhY2hlOjpTZXJ2ZXJSZWMtPndhcm4KICAgIChBcGFjaGU6OlNlcnZlclJlYzo6d2FybiBpcyBzdGlsbCB0aGVyZSkKCkFwYWNoZTo6RGlyZWN0aXZlIGNvbmZ0cmVlKCkgY2hhbmdlZCBmcm9tIGNsYXNzIG1ldGhvZCB0bwpyZWd1bGFyIHN1YnJvdXRpbmUgW0dvemVyXQoKQXBhY2hlOjpNb2R1bGUgdG9wX21vZHVsZSgpIGFuZCBnZXRfY29uZmlnKCkgYXMgY2xhc3MgbWV0aG9kcwphZGRlZCB0byBBcGFjaGU6OmNvbXBhdCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgW0dvemVyXQoKQXBhY2hlOjpNb2R1bGUgdG9wX21vZHVsZSgpIGFuZCBnZXRfY29uZmlnKCkgY2hhbmdlZCBmcm9tIGNsYXNzCm1ldGhvZHMgdG8gcmVndWxhciBzdWJyb3V0aW5lcyBbR296ZXJdCgpBZGRlZCBBcGFjaGU6OkNtZFBhcm1zOjphZGRfY29uZmlnKCkgdG8gd29yayBhcm91bmQgYSBtZW1vcnkKbGVhayBkaXNjb3ZlcmVkIHdpdGggPFBlcmw+IHNlY3Rpb25zIGluIC5odGFjY2VzcyBmaWxlcyBbR296ZXJdCgpBZGRlZCBNb2RQZXJsOjpVdGlsOjp1bmxvYWRfcGFja2FnZSgpIHRvIHJlbW92ZSBhIGxvYWRlZCBwYWNrYWdlCmFzIHRob3JvdWdobHkgYXMgcG9zc2libGUgYnkgY2xlYXJpbmcgaXQncyBzdGFzaC4gW0dvemVyXQoKZml4IEFwYWNoZS0+cmVxdWVzdCgkcikgdG8gYmUgc2V0LWFibGUgZXZlbiB3LzogUGVybE9wdGlvbnMKLUdsb2JhbFJlcXVlc3QgW1N0YXNdCgpBZGQgQXBhY2hlOjpSZWxvYWQtPnVucmVnaXN0ZXJfbW9kdWxlKCkgdG8gZXhwbGljaXRlbHkgcmVtb3ZlIGEKbW9kdWxlIGZyb20gQXBhY2hlOjpSZWxvYWQncyBtb25pdG9yaW5nIGxpc3QgW0dvemVyXQoKaW50cm9kdWNlIGEgY3VzdG9tIG1vZHBlcmwgZXJyb3IgbWVzc2FnZSBmb3IgZmFpbGluZyBmaWx0ZXIgaGFuZGxlcnMKKHByZXZpb3VzbHkgJ3Vua25vd24gZXJyb3InIGNvbWluZyBmcm9tIHJjPTUwMCB3YXMgbG9nZ2VkKSBbU3Rhc10KCkZpeCBBcGFjaGU6OkxvZyBtZXRob2RzL2Z1bmN0aW9ucyB0byBsb2cgaW50byB0aGUgdmhvc3QncyBlcnJvcl9sb2cKZmlsZSAoaWYgdGhlcmUgaXMgb25lKS4gKCAkcy0+bG9nLT4qLCAkcy0+bG9nX2Vycm9yLCAkcy0+bG9nX3NlcnJvciwKQXBhY2hlOjpTZXJ2ZXJSZWM6Ondhcm4sIGV0Yy4pLiBBcGFjaGU6OlNlcnZlclJlYyBjYW4gbm93IGV4cG9ydCBpdHMKd2FybiBmdW5jdGlvbiB0byBvdmVycmlkZSBDT1JFOjp3YXJuIFtTdGFzXQoKRml4ICRzLT5sb2ctPiosICRzLT5sb2dfZXJyb3IgYW5kICRzLT5sb2dfc2Vycm9yIHRvIGFnYWluIGxvZyBpbnRvIHRoZQp2aG9zdCdzIGVycm9yX2xvZyBmaWxlIChpZiB0aGVyZSBpcyBvbmUpLiBbU3Rhc10KCiRzLT5sb2ctPndhcm4gYW5kIG90aGVyICRzLT5sb2ctPmZvbyBhcmUgbm93IGxvZ2dpbmcgdG8gdGhlIHJpZ2h0CnZob3N0IHNlcnZlciBhbmQgbm90IHRoZSBnbG9iYWwgb25lLiBtb2RwZXJsX3N2MnNlcnZlcl9yZWMgd2FzCmJyb2tlbi4gW1N0YXNdCgpGaXggYSBnbHVlX3BvZCBtYWtlIHRhcmdldCBidWcsIHdoZW4gLnBtIGZpbGUgZG9lc24ndCBleGlzdCwKZS5nLiBUaHJlYWRNdXRleC5wbSBpcyBub3QgY3JlYXRlZCBvbiB1bmxlc3MKJGFwcl9jb25maWctPntIQVNfVEhSRUFEU30gW1N0YXNdCgpJbnRyb2R1Y2UgQVBSOjpTb2NrZXQ6OnBvbGwgdG8gcG9sbCBhIG5vbi1ibG9ja2luZyBzb2NrZXQgW0tlbiBTaW1wc29uCjxrc2ltcHNvbkBsYXJjaC5tYWlsY2hhbm5lbHMuY29tPl0KCkZpeCB0aGUgZXJyb3IgbWVzc2FnZSB3aGVuIHRoZSBtaW5pbWFsIHJlcXVpcmVkIGh0dHBkIHZlcnNpb24gaXMgbm90CnNhdGlzZmllZCBbUHJhdGlrIDxwcmF0aWtuYWlrQGdtYWlsLmNvbT5dCgpGaXggaW50ZXJhY3RpdmUgcHJvbXB0aW5nIGF0IHBlcmwgTWFrZWZpbGUuUEwsIHdoZW4gbm8gQVBYUyBvcgpNUF9BUF9QUkVGSVggd2VyZSBwcm92aWRlZC4gbm93IGFza2luZyBmb3IgYW4gYWx0ZXJuYXRpdmUgbG9jYXRpb24gaWYKdGhlIHN1Z2dlc3RlZCBjaG9pY2VzIHdlcmVuJ3Qgc2VsZWN0ZWQuIFtTdGFzXQoKQWRkZWQgQVBSOjpVUkktPnJwYXRoIG1ldGhvZC4gUmV0dXJucyB0aGUgcGF0aCBvZiBhbiB1cmkgbWludXMKcGF0aF9pbmZvLCBpZiBhbnkuIFtHb3plcl0KCm1vdmVkIEFwYWNoZTo6Y3VycmVudF9jYWxsYmFjaygpIHRvIE1vZFBlcmw6OlV0aWw6OmN1cnJlbnRfY2FsbGJhY2sKd2hlcmUgaXQgYmVsb25ncyBbR296ZXJdCgptb2RwZXJsX3BlcmxfbW9kdWxlX2xvYWRlZCgpIGZpeGVkIHRvIHVzZSAlSU5DIHRvIGRldGVybWluZSBpZiBhIG1vZHVsZQppcyBsb2FkZWQgaW5zdGVhZCBvZiBjaGVja2luZyBmb3IgdGhlIGV4aXN0ZW5jZSBvZiBhIHN0YXNoIFtHb3plcl0KCmZpeCB0aGUgbW9kcGVybCBidWlsZCwgd2hlcmUgaHR0cGQgaGFzIGJlZW4gYnVpbHQgYWdhaW5zdCBzZXBhcmF0ZQppbnN0YWxsYXRpb25zIG9mIGFwci11dGlsIGFuZCBhcHIsIHdoZXJlIGFwci11dGlsIGhhcyBiZWVuIGluc3RhbGxlZAp3aXRoIGEgZGlmZmVyZW50IGluY2x1ZGVkaXIgdG8gYXByLiBbSm9lIE9ydG9uXQoKJEFwYWNoZTo6U2VydmVyOjpTYXZlQ29uZmlnIGlzIG5vdyAkQXBhY2hlOjpQZXJsU2VjdGlvbnM6OlNhdmUKW0dlb2ZmcmV5IFlvdW5nXQoKCgo9aXRlbSAxLjk5XzE2IC0gQXVnIDIyLCAyMDA0CgpGaXggYSBjb21waWxhdGlvbiBwcm9ibGVtIGJyZWFraW5nIDEuOTlfMTUgKHN2X2NvcHlwdiB3YXMgYWRkZWQgaW4KcGVybCA1LjcuMykgW0phc29uIFdvb2R3YXJkIDx3b29kd2FyZGpAamFvcy5vcmc+XQoKQWRkZWQgJHItPmNvbnRlbnRfbGFuZ3VhZ2VzIGluIEFwYWNoZTo6UmVxdWVzdFJlYyBbR296ZXJdCgpBUFI6OkJ1Y2tldDogYWRkIGRlbGV0ZSgpIGFuZCBkZXN0cm95KCkgbWV0aG9kcyBbU3Rhc10KCgoKPWl0ZW0gMS45OV8xNSAtIEF1ZyAyMCwgMjAwNAoKcmVwbGFjZSB0aGUgbWVtb3J5IGFsbG9jYXRpb24gZm9yIG1vZHBlcmwgZmlsdGVyIGhhbmRsZXJzIHRvIHVzZSBhCnRlbXBvcmFyeSBzdWJwb29sIG9mIHRoZSBhcF9maWx0ZXJfdCBvYmplY3QuIHByZXZpb3VzbHkgdXNpbmcgcGVybCdzCnNhZmVtYWxsb2MgaGFkIHByb2JsZW1zIG9uIHdpbjMyIChyYW5kb21seSBteV9wZXJsID09IE5VTEwpIFtTdGFzXQoKRGlzYWJsZSBBcGFjaGU6Okhvb2tSdW46OnJ1bl9jcmVhdGVfcmVxdWVzdCAtLSBpdCdzIGFscmVhZHkgcnVuCmludGVybmFsbHkgYnkgQXBhY2hlOjpSZXF1ZXN0UmVjLT5uZXcgW1N0YXNdCgpVcGRhdGUgQXBhY2hlOjpSZXF1ZXN0UmVjLT5uZXcoKSB0byBpbml0aWFsaXplIG1lbWJlcnMgb2YgcmVxdWVzdF9yZWMKd2hpY2ggd2VyZSBhZGRlZCBzb21lIHRpbWUgYWdvICh3aXRob3V0IGl0IHdlIHdlcmUgZ2V0dGluZyBzZWdmYXVsdHMKaW4gdGhlIG5ldyBwc2V1ZG9faHR0cCB0ZXN0LiBbU3Rhc10KCkFwYWNoZTo6Q21kUGFybXMtPmxpbWl0ZWQgbWVtYmVyIHJlcGxhY2VkIGJ5IGlzX21ldGhvZF9saW1pdGVkKCkKbWV0aG9kIFtHb3plcl0KCkFwYWNoZTo6TW9kdWxlIGNoYW5nZXMgW0dvemVyXQotIHJlYWR3cml0ZSA9PiByZWFkb25seToKICAgIGNtZHMsIG5leHQsIG5hbWUsIG1vZHVsZV9pbmRleCwgbWlub3JfdmVyc2lvbiwgdmVyc2lvbgotIHJlbW92ZWQ6IHJlbW92ZV9tb2R1bGUKCmVuc3VyZSB0aGF0IGEgc3ViLWRpciBBcGFjaGUtVGVzdCBleGlzdHMgaW4gdGhlIHNvdXJjZSBkaXN0cm8gKHRoaXMgaXMKYSByZXF1aXJlbWVudCwgc2luY2UgdGhlIHRlc3Qgc3VpdGUgcmVsaWVzIG9uIHRoZSBwYXJ0aWN1bGFyCkFwYWNoZS1UZXN0IHZlcnNpb24gZGlzdHJpYnV0ZWQgd2l0aCB0aGUgbW9kX3Blcmwgc291cmNlKSBbU3Rhc10KCmNvbWJpbmUgaGFuZGxlciByZXNvbHZpbmcgZmFpbHVyZSBlcnJvciB3aXRoIHRoZSBhY3R1YWwgZXJyb3IsIHNvCnRoZXJlIGlzIG9ubHkgb25lIGxvZ2dlZCBlbnRyeSBbU3Rhc10KCnBvZCBtYW5wYWdlcyBhcmUgbm93IGdsdWVkIHRvIGFsbCAucG0gZmlsZXMgZm9yIHdoaWNoIC5wb2QgZXhpc3RzIGF0CidtYWtlIGluc3RhbGwnIHBoYXNlIFtTdGFzXQoKQXBhY2hlOjpSZXF1ZXN0SU86OnNlbmRmaWxlKCkgbm93IGluZGljYXRlcyB3aGljaCBmaWxlIGl0IGhhcyBmYWlsZWQKdG8gb3BlbiBvbiBmYWlsdXJlLiBbU3Rhc10KCmZpeCBBcGFjaGU6OlN1YlJlcXVlc3QncyBtZXRob2RzOiBsb29rdXBfZmlsZSwgbG9va3VwX3VyaSwKbG9va3VwX21ldGhvZF91cmkgdG8gZGVmYXVsdCB0aGUgbGFzdCBhcmd1bWVudCB0bwpyLT5wcm90b19vdXRwdXRfZmlsdGVycyAobm8gcmVxdWVzdCBmaWx0ZXJzIGZvciB0aGUgc3VicmVxdWVzdCkgYW5kCm5vdCByLT5vdXRwdXRfZmlsdGVycy0+bmV4dCBhcyBpdCB3YXMgYmVmb3JlIChvbmUgZmlsdGVyIHdhcyBnZXR0aW5nCnNraXBwZWQgYW5kIHRoZSByZXN0IG9mIHRoZSBmaWx0ZXJzIHdlcmUgYXBwbGllZCAqdHdpY2UqKS4gW1N0YXNdCgpBcGFjaGU6OkNtZFBhcm1zIGNoYW5nZXMgW0dvemVyXQotIHJlYWR3cml0ZSA9PiByZWFkb25seToKICAgIG92ZXJyaWRlLCBsaW1pdGVkLCBkaXJlY3RpdmUsIHBvb2wsIHRlbXBfcG9vbCwgc2VydmVyLCBwYXRoLAogICAgY21kLCBjb250ZXh0LCBlcnJfZGlyZWN0aXZlCgotIHJlbW92ZWQ6IGxpbWl0ZWRfeG1ldGhvZHMsIHhsaW1pdGVkLCBjb25maWdfZmlsZSwgZXJyX2RpcmVjdGl2ZQoKRml4IGEgYnVnIGluIEFQUjo6QnVja2V0LT5uZXcgd2hlbiBhIHBhc3NlZCBhcmd1bWVudCB3YXMgb2YgdHlwZQpQQURUTVAgW1N0YXNdCgpBcGFjaGU6OkNvbm5lY3Rpb24gY2hhbmdlcyBbU3RhcywgIkZyZWQgTW95ZXIiIDxmcmVkIC9hYm91dC8KdGFwZXJmcmllbmRseW11c2ljLm9yZz5dCi0gcmVhZHdyaXRlID0+IHJlYWRvbmx5OgoKICAgIHBvb2wsIGJhc2Vfc2VydmVyLCBsb2NhbF9hZGRyLCByZW1vdGVfYWRkciwgcmVtb3RlX2lwLCByZW1vdGVfaG9zdCwgCiAgICBhYm9ydGVkLCBsb2NhbF9pcCwgbG9jYWxfaG9zdCwgaWQsIGNvbm5fY29uZmlnLCBzYmgsIGJ1Y2tldF9hbGxvYwoKLSByZW1vdmVkOiBsb2duYW1lCgpNb3ZlIGNoZWNrX2NtZF9jb250ZXh0IGZyb20gQXBhY2hlOjpDb21tYW5kIHRvIEFwYWNoZTo6Q21kUGFybXMuCltHb3plcl0KCkFkZCA6Y29udGV4dCBncm91cCBvZiBjb25zdGFudHMgZm9yIGNoZWNrX2NtZF9jb250ZXh0KCkuCk5PVF9JTl9WSVJUVUFMSE9TVCwgTk9UX0lOX0xJTUlULCBOT1RfSU5fRElSRUNUT1JZLCBOT1RfSU5fTE9DQVRJT04sCk5PVF9JTl9GSUxFUywgTk9UX0lOX0RJUl9MT0NfRklMRSAmIEdMT0JBTF9PTkxZIFtHb3plcl0KClJlbW92ZWQgQXBhY2hlOjpDb21tYW5kIG1ldGhvZCBzb2FrX2VuZF9jb250YWluZXIgW0dvemVyXQoKUmVtb3ZlZCBBcGFjaGU6Ok1vZHVsZSBtZXRob2RzIChkeW5hbWljX2xvYWRfaGFuZGxlIGFuZApmaW5kX21vZHVsZV9uYW1lKSBbR296ZXJdCgpBbGwgQXBhY2hlOjpDb21tYW5kIG1ldGhvZHMgYXJlIG5vdyByZWFkLW9ubHkgW0dvemVyXQoKUmVtb3ZlZCBBcGFjaGU6OkNvbW1hbmQgbWV0aG9kcyAoZnVuYyBhbmQgY21kX2RhdGEpIFtHb3plcl0KClJlbW92ZWQgQXBhY2hlOjpEaXJlY3RpdmUgbWV0aG9kcyAoZGF0YSAmIHdhbGtfY29uZmlnKSBbR296ZXJdCgpBbGwgQXBhY2hlOjpEaXJlY3RpdmUgbWV0aG9kcyBhcmUgbm93IHJlYWQtb25seSBbR296ZXJdCgpGaWx0ZXJzIHNob3VsZCBub3QgcmVzZXQgJEAgaWYgaXQgd2FzIGFscmVhZHkgc2V0IGJlZm9yZQppbnZvY2F0aW9uIFtHb3plcl0KCkFwYWNoZTo6Y29tcGF0IHNlcnZlcl9yb290X3JlbGF0aXZlIG5vdyBjb3JyZWN0bHkgaGFuZGxlcyBhYnNvbHV0ZSAKcGF0aHMgbGlrZSBhcF9zZXJ2ZXJfcm9vdF9yZWxhdGl2ZSBkb2VzIFtHb3plcl0KCkZpeCBhIGJ1ZyBpbiA8UGVybD4gc2VjdGlvbnMgd2l0aCBtdWx0aXBsZSBhbGlhc2VzIGluIGEKdmlydHVhbGhvc3QgY29udGFpbmVyLiBbR296ZXJdCgpQZXJsTW9kdWxlLCBQZXJsUmVxdWlyZSwgUGVybCBhbmQgPFBlcmw+IGlzIG5vdyBzdXBwb3J0ZWQgaW4KLmh0YWNjZXNzLiBUaGV5IHdpbGwgcnVuIGZvciBlYWNoIHJlcXVlc3QuIFtHb3plcl0KCnJlbW92ZWQgc3VwcG9ydCBmb3IgaHR0cGQgMi4wLjQ2LiAgaHR0cGQgMi4wLjQ3IGlzIG5vdyB0aGUgbWluaW11bQpzdXBwb3J0ZWQgdmVyc2lvbi4gIFtHZW9mZnJleSBZb3VuZ10KClN0YXRpYyBidWlsZHMgZm9yIGh0dHBkID49IDIuMC41MSBhdmFpbGFibGUuIFdpdGggdGhlIG5ldyBNUF9BUF9CVUlMRApvcHRpb24sIGNvbmZpZ3VyZSBhbmQgY29tcGlsZSBhbiBodHRwZCB3aXRoIG1vZF9wZXJsIHN0YXRpY2FsbHkgbGlua2VkCmluIFtHb3plcl0KCkFwYWNoZTo6UmVxdWVzdFJlYyBtZXRob2RzIGNoYW5nZXMgW1N0YXNdCi0gcmVhZHdyaXRlID0+IHJlYWRvbmx5OgoKICAgIGNvbm5lY3Rpb24sIGNhbm9uaWNhbF9maWxlbmFtZSwgaGVhZGVyX29ubHksIG1haW4sIG5leHQsIHByZXYsCiAgICBwb29sLCBwZXJfZGlyX2NvbmZpZywgcmVxdWVzdF9jb25maWcsIHByb3RvX251bSwgcHJvdG9jb2wsCiAgICByZXF1ZXN0X3RpbWUsIHNlcnZlciwgdGhlX3JlcXVlc3QsIHVucGFyc2VkX3VyaQoKLSByZW1vdmVkOgoKICAgIHJlbWFpbmluZyAtIHRoaXMgbWV0aG9kIGlzIG5vdCBuZWVkZWQgaWYgdGhlIGRlcHJlY2F0ZWQKICAgICAgICAgICAgICAgICRyLT5jbGllbnRfYmxvY2sgbWV0aG9kcyBhcmVuJ3QgdXNlZCwgKHVzZSAkci0+cmVhZAogICAgICAgICAgICAgICAgJHItPmluc3RlYWQpCiAgICBjYW5vbmljYWxfZmlsZW5hbWUgLSBpdCdzIGEgcHJpdmF0ZSBtZW1iZXIKClRoZSBmdW5jIEFwYWNoZTo6U3ViUHJvY2Vzczo6c3Bhd25fcHJvY19wcm9nIGlzIG5vdyBhIG1ldGhvZDoKJHItPnNwYXduX3Byb2NfcHJvZyBbU3Rhc10KCkFwYWNoZTo6UHJvY2VzcyBtZXRob2RzIChwb29sLCBwY29uZiBhbmQgc2hvcnRfbmFtZSkgYXJlIG5vdyByZWFkLW9ubHkKW1N0YXNdCgooJHJ8JGN8JHMpLT5zZXJ2ZXJfcm9vdF9yZWxhdGl2ZSB3ZXJlIHJlbW92ZWQuIE5vdyBvbmx5IGFuIGV4cGxpY2l0CmFuZCBzb21ld2hhdCBkZXByZWNhdGVkIGZ1bmN0aW9uIEFQSSByZW1haW5zOgpBcGFjaGU6OlNlcnZlclV0aWw6OnNlcnZlcl9yb290X3JlbGF0aXZlKCRwb29sLCAkcGF0aCk7IGl0J3MgdG9vIGVhc3kKdG8gY2F1c2UgbWVtb3J5IGxlYWsgd2l0aCB0aGlzIG1ldGhvZCwgYW5kIGl0J3MgaW5lZmZpY2llbnQgYXMgaXQKZHVwbGljYXRlcyB0aGUgcmV0dXJuIHZhbHVlLCB0byBhdm9pZCBwb3RlbnRpYWwgc2VnZmF1bHRzIGlmIHRoZSBwb29sCml0IHdhcyBhbGxvY2F0ZWQgZnJvbSBnZXRzIGRlc3Ryb3llZCBhbmQgdGhlIHZhbHVlIGlzIGF0dGVtcHRlZCB0byBiZQp1c2VkLiBJbnN0ZWFkIG9mIHRoaXMgbWV0aG9kIHVzZSB0aGUgZXF1aXZhbGVudDoKRmlsZTo6U3BlYy0+Y2F0ZmlsZShBcGFjaGU6OlNlcnZlclV0aWw6OnNlcnZlcl9yb290LCAkZm5hbWUpOyBbU3Rhc10KCiRyLT5wc2lnbmF0dXJlIG5vdyBsaXZlcyBpbiB0aGUgcGFja2FnZSBpdCBiZWxvbmdzIHRvOgpBcGFjaGU6OlJlcXVlc3RVdGlsIChwcmV2aW91c2x5IGxpdmVkIGluIEFwYWNoZTo6U2VydmVyVXRpbCkuIFtTdGFzXQoKQSBmZXcgZnVuY3Rpb25zIG1vdmVkIG5hbWVzcGFjZSBmcm9tIEFwYWNoZTo6IHRvIEFwYWNoZTo6U2VydmVyVXRpbDo6Cih0byBtYWtlIGl0IGVhc2llciB0byBmaW5kIHRoZSBjb250YWluZXIgb2YgdGhlIGZ1bmN0aW9uKTogW1N0YXNdCiAgLSBleGlzdHNfY29uZmlnX2RlZmluZQogIC0gc2VydmVyX3Jvb3QKICAtIGdldF9zZXJ2ZXJfYnVpbHQKICAtIGdldF9zZXJ2ZXJfdmVyc2lvbgoKZml4IGFuIG9sZCBvdXRzdGFuZGluZyBidWcgaW4gdGhlIEFQUjo6VGFibGUncyBUSUUgaW50ZXJmYWNlIHdpdGgKZWFjaCgpL3ZhbHVlcygpIG92ZXIgdGFibGVzIHdpdGggbXVsdGktdmFsdWVzIGtleXMuIE5vdyB0aGUgcHJvZHVjZWQKb3JkZXIgaXMgY29ycmVjdCBhbmQgY29uc2lzdGVudCB3aXRoIGtleXMoKS4gVGhvdWdoLCB2YWx1ZXMoKSB3b3Jrcwpjb3JyZWN0bHkgb25seSB3aXRoIHBlcmwgNS44LnggYW5kIGhpZ2hlci4gW0pvZSBTY2hhZWZlcl0KCnJlcXVpcmUgUGVybCA1LjYuMSwgNS42LjAgaXNuJ3Qgc3VwcG9ydGVkIGZvciBhIGxvbmcgdGltZSwgYnV0IHdlCndlcmVuJ3QgYWJvcnRpbmcgYXQgdGhlIE1ha2VmaWxlLlBMIHN0YWdlIFtTdGFzXQoKQXBhY2hlOjpSZXF1ZXN0VXRpbDo6bWV0aG9kX3JlZ2lzdGVyKCRzLT5wcm9jZXNzLT5wY29uZiwgJ0ZPTycpOyBpcwpub3cgJHMtPm1ldGhvZF9yZWdpc3RlcignRk9PJykuCkFwYWNoZTo6UmVxdWVzdFV0aWw6OmFkZF92ZXJzaW9uX2NvbXBvbmVudCgkcy0+cHJvY2Vzcy0+cGNvbmYsICdCQVIvMC4xJyk7CmlzIG5vdyAkcy0+YWRkX3ZlcnNpb25fY29tcG9uZW50KCdCQVIvMC4xJykuICBbU3Rhc10KClJlbW92ZSAkQXBhY2hlOjpTZXJ2ZXI6OlN0cmljdFBlcmxTZWN0aW9ucy4gTm93LCBhbGwgPFBlcmw+CnNlY3Rpb25zIGVycm9ycyBhcmUgZmF0YWwgYnkgZGVmYXVsdCBhbmQgY2F1c2Ugc2VydmVyIHN0YXJ0dXAgdG8KYWJvcnQgb24gZXJyb3IuIFtHb3plcl0KCkZpeCAoJHJ8JGZpbHRlcnwkYnVja2V0KS0+cmVhZCgpIGZ1bmN0aW9ucyB0byBydW4gdGhlIHNldCBtYWdpYyBsb2dpYywKdG8gaGFuZGxlIGNhc2VzIHdoZW4gYSBwYXNzZWQgYnVmZmVyIHRvIGZpbGwgaXMgbm90IGEgcmVndWxhcgpzY2FsYXIuIFtTdGFzXQoKQXBhY2hlOjpTZXJ2ZXJSZWMgYWNjZXNzb3JzIGNoYW5nZXM6IFtTdGFzXQotIHJlYWRvbmx5IGFjY2Vzc29yczoKCiAgICBwcm9jZXNzLCBuZXh0LCBpc192aXJ0dWFsLCBtb2R1bGVfY29uZmlnLCBsb29rdXBfZGVmYXVsdHMgYW5kCiAgICBhZGRycwoKLSByZWFkd3JpdGUgYWNjZXNzb3JzIHdpdGggdGhlIGV4Y2VwdGlvbiBvZiB0aHJlYWRlZCBtcG1zLCB3aGVyZSB0aGUKICBhY2Nlc3NvcnMgYXJlIHdyaXRhYmxlIG9ubHkgYmVmb3JlIHRoZSBjaGlsZF9pbml0IHBoYXNlIChpLmUuIGJlZm9yZQogIHRocmVhZHMgYXJlIHNwYXduZWQpOgoKICAgIHNlcnZlcl9hZG1pbiwgc2VydmVyX2hvc3RuYW1lLCBwb3J0LCBlcnJvcl9mbmFtZSwgZXJyb3JfbG9nLAogICAgbG9nbGV2ZWwsIHRpbWVvdXQsIGtlZXBfYWxpdmVfdGltZW91dCwga2VlcF9hbGl2ZV9tYXgsIGtlZXBfYWxpdmUsCiAgICBuYW1lcywgd2lsZF9uYW1lcywgbGltaXRfcmVxX2xpbmUsIGxpbWl0X3JlcV9maWVsZHNpemUsCiAgICBsaW1pdF9yZXFfZmllbGRzLCBhbmQgcGF0aAoKc3VwcG9ydHMgYSBuZXcgdHlwZSBvZiBzdHJ1Y3QgYWNjZXNzb3IsIHdoaWNoIGlzIGp1c3QgbGlrZSByZWFkL3dyaXRlCm9uZSwgYnV0IGRvZXNuJ3QgYWxsb3cgd3JpdGUgYWNjZXNzIHN0YXJ0aW5nIGF0IHRoZSBDaGlsZEluaXQgcGhhc2UKdW5kZXIgdGhyZWFkZWQgbXBtICh0byBhdm9pZCB0aHJlYWQtc2FmZWx5IGlzc3VlcykgW1N0YXNdCgpJbiBvcmRlciB0byBiZSBjb25zaXN0ZW50IHdpdGggQXBhY2hlOjpSZXF1ZXN0UmVjLCBBcGFjaGU6OlNlcnZlciBpcwpub3cgQXBhY2hlOjpTZXJ2ZXJSZWMgYW5kIGFsbCBtZXRob2RzL2Z1bmN0aW9ucyBmcm9tIEFwYWNoZTo6U2VydmVyCm5vdyBsaXZlIGluIEFwYWNoZTo6U2VydmVyUmVjLiBbU3Rhc10KClVzZSBhIGNvbnRleHQtc3BlY2lmaWMgUGVybF9sb2FkX21vZHVsZSgpIGluc3RlYWQgb2YgbG9hZF9tb2R1bGUoKSwgdG8KYXZvaWQgdGhlIHByb2JsZW0gd2l0aCAnbG9hZF9tb2R1bGUnIHN5bWJvbCByZXNvbHV0aW9uIG9uIGNlcnRhaW4KcGxhdGZvcm1zLCB3aGVyZSBmb3Igc29tZSByZWFzb24gaXQgZG9lc24ndCBnZXQgcmVzb2x2ZWQgYXQgY29tcGlsZQp0aW1lIHRvIFBlcmxfbG9hZF9tb2R1bGVfbm9jb250ZXh0IFtTdGFzXQoKTWFrZSBpdCBwb3NzaWJsZSB0byBkaXNhYmxlIG1vZF9wZXJsIGZvciB0aGUgYmFzZSBzZXJ2ZXIsIGJ1dCBlbmFibGUKaXQgZm9yIHRoZSB2aXJ0dWFsIGhvc3RzIFtTdGFzXQoKUmVtb3ZlZCB0aGUgZGVwcmVjYXRlZCBwYXRoIGFyZ3VtZW50IHRvICRyLT5hZGRfY29uZmlnKCkgW0dvemVyXQoKQ3JlYXRlZCBhIE1FVEEueW1sIGZvciBDUEFOIGFuZCBmcmllbmRzLCBpbmNsdWRpbmcgQXBhY2hlLVRlc3QgYXMKYSBwcml2YXRlIHJlc291cmNlIHRvIGtlZXAgQ1BBTiBmcm9tIGluc3RhbGxpbmcgbW9kX3Blcmwgd2hlbiBhCnVzZXIganVzdCB3YW50cyBBcGFjaGU6OlRlc3QgW0dvemVyXQoKTW92aW5nIEhUVFAgc3BlY2lmaWMgZnVuY3Rpb25zIGdldF9zdGF0dXNfbGluZSwgbWV0aG9kX3JlZ2lzdGVyIGZyb20KQXBhY2hlOjogdG8gQXBhY2hlOjpSZXF1ZXN0VXRpbDo6IHRvIG1hdGNoIHRoZWlyIGNvbnRhaW5lciBbU3Rhc10KCkFkanVzdCB0aGUgbGlzdCBvZiBtb2RfcGVybCBoZWFkZXIgZmlsZXMgaW5zdGFsbGVkIGludG8gdGhlIEFwYWNoZTIKaW5jbHVkZS8gZGlyZWN0b3J5LCBtYWRlIG5lY2Vzc2FyeSBmcm9tIHRoZSByZW5hbWluZyBhbmQgcmVmYWN0b3JpbmcKYXJpc2luZyBmcm9tIHRoZSBkZWNvdXBsaW5nIG9mIEFQUiBhbmQgQVBSOjoqIGZyb20gbW9kX3Blcmwuc28uCkFsc28gaW5jbHVkZSBtb2RwZXJsX2Fwcl9wZXJsaW8uaCB1bmRlciB4cy9BUFIvUGVybElPLyBpbgp0aGUgbGlzdCBvZiBzdWNoIGZpbGVzIGluc3RhbGxlZCBbU3RhcywgUmFuZHkgS29iZXNdCgokci0+cmVhZCgpL1JFQUQgbm93IHRocm93IGV4Y2VwdGlvbnMgW1N0YXNdCgokci0+cmZsdXNoIG5vdyByZXR1cm5zIG5vdGhpbmcgKHdhcyBhbHdheXMgcmV0dXJuaW5nIEFQUjo6U1VDQ0VTUwpiZWZvcmUpIFtTdGFzXQoKYnVnIHJlcG9ydHMgZ2VuZXJhdGluZyBjb2RlOiBbU3Rhc10KLSBhZGQgKGFwcnxhcHUpLWNvbmZpZyBsaW5raW5nIGluZm8KLSBzaG93IHRoZSBmdWxsIHBhdGggdG8gdGhlIGNvbmZpZyBmaWxlIHVzZWQgdG8gZ2V0IHRoZSBkYXRhIGZvciB0aGUKICByZXBvcnQKClRoZSBBUFIgYW5kIEFQUjo6KiBmYW1pbHkgb2YgbW9kdWxlcyBjYW4gbm93IGJlIHVzZWQgd2l0aG91dCBoYXZpbmcKdG8gbG9hZCBtb2RfcGVybC5zby4gT24gKm5peCwgdGhpcyBpcyBkb25lIGJ5IGNvbXBpbGluZyB0aGUgbmVlZGVkCmZ1bmN0aW9ucyBmcm9tIHRoZSBhcHByb3ByaWF0ZSBzb3VyY2VzIHVzZWQgdG8gYnVpbGQgbW9kX3Blcmwuc28KaW50byBBUFIuc28sIGFuZCB0aGVuIGFycmFuZ2luZyBmb3IgQVBSOjoqIHRvICd1c2UgQVBSICgpJy4gT24gV2luMzIsCmEgc3RhdGljIGxpYnJhcnkgb2YgbmVlZGVkIGZ1bmN0aW9ucyBpcyBidWlsdCwgYW5kIEFQUi9BUFI6OiogCnRoZW4gbGluayBpbnRvIHRoaXMgbGlicmFyeSBbU3RhcywgSm9lIFNjaGFlZmVyLCBSYW5keSBLb2Jlc10KCkFQUjo6UmVxdWVzdElPOjpzZW5kZmlsZSgpIG5vdyBmbHVzaGVzIGFueSBidWZmZXJlZCBvdXRwdXQgYmVmb3JlCnNlbmRpbmcgdGhlIGZpbGUgY29udGVudHMgb3V0LiBJZiB0aGUgcmV0dXJuIHN0YXR1cyBpcyBub3QgY2hlY2tlZCBhbmQKYW4gZXJyb3IgaGFwcGVucyBpdCdsbCB0aHJvdyBhbiBleGNlcHRpb24uIEZpeCBvZmZzZXQgaGFuZGxpbmcuIFtTdGFzXQoKUmVnaXN0cnk6IHJlbW92ZSB0aGUgbWlzbGVhZGluZyBwcmVmaXggIiQkOiAkY2xhc3M6IiBpbiB0aGUgbG9nZ2VkCmVycm9yIG1lc3NhZ2UsIHNpbmNlIG5vdCBvbmx5IHJlZ2lzdHJ5IGVycm9ycyB3aWxsIGdldCBsb2dnZWQgaWYgJEAgaXMKc2V0IFtTdGFzXQoKY2hhbmdlIHQvUkVQT1JUIHRvIHN1Z2dlc3QgdG8gcG9zdCBidWcgcmVwb3J0cyB0byB0aGUgbW9kcGVybCB1c2VycwpsaXN0LCB0byBiZSBjb25zaXN0ZW50IHdpdGggdGhlIGRvY3VtZW50YXRpb24gW1N0YXNdCgphbWQ2NCBmaXhlcyAgW0pvZSBTY2hhZWZlciA8am9lK2dtYW5lQHN1bnN0YXJzeXMuY29tPl0KICAtIHVzZSBJViBpbnN0ZWFmIG9mIGludCB3aGVyZSBhIHBvaW50ZXIgaXMgdXNlZAogIC0gbXB4c19BUFJfX0J1Y2tldF9uZXcgbmVlZHMgdG8gdXNlIGFwcl9zaXplX3Qvb2ZmX3NldF90IHR5cGVzCgpBUFI6OlNvY2tldDo6cmVjdigpIG5vdyByZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIHJlYWQgZGF0YSBbU3Rhc10KCkFQUjo6QnVja2V0J3MgcmVhZCgpIHJldHVybnMgIiIgaW5zdGVhZCBvZiB1bmRlZiB3aGVuIHRoZXJlIGlzIG5vIGRhdGEKdG8gcmVhZC4gW1N0YXNdCgpmaXggYSBidWcgaW4gUmVnaXN0cnkgaGFuZGxlcnMsIHdoZXJlIHRoZSBzYW1lIGVycm9yIHdhcyBsb2dnZWQgdHdpY2UKYW5kIHBvdGVudGlhbGx5IGEgd3JvbmcgZXJyb3IgY29kZSByZXR1cm5lZCBbU3Rhc10KCkFwYWNoZTo6UmVxdWVzdElPOiBwcmludCgpLCBwcmludGYoKSwgcHV0cygpLCB3cml0ZSgpLCByZmx1c2goKSB0aHJvdwphbiBleGNlcHRpb24gb24gZmFpbHVyZSBbU3Rhc10KCkFwYWNoZTo6U3ViUmVxdWVzdDogcnVuKCkgdGhyb3cgYW4gZXhjZXB0aW9uIG9uIGZhaWx1cmUgW1N0YXNdCgpBcGFjaGU6OkZpbHRlcjogW1N0YXNdCiAgLSByZW1vdmUgdW5uZWVkZWQgbWV0aG9kczogcmVtb3ZlX2lucHV0X2ZpbHRlcigpIGFuZAogICAgcmVtb3ZlX291dHB1dF9maWx0ZXIoKSwgZnB1dHMoKQogIC0gZnJlYygpIGFjY2Vzc29yIGlzIG1hZGUgcmVhZC1vbmx5CiAgLSBmZmx1c2goKSwgZ2V0X2JyaWdhZGUoKSBhbmQgcGFzc19icmlnYWRlKCkgbm93IHRocm93IGV4Y2VwdGlvbnMgaWYKICAgIGNhbGxlZCBpbiB0aGUgdm9pZCBjb250ZXh0CiAgLSByZWFkLCBwcmludCgpIGFuZCBwdXRzKCkgdGhyb3cgYW4gZXhjZXB0aW9uIG9uIGZhaWx1cmUKCkFwYWNoZTo6RmlsdGVyUmVjOiBbU3Rhc10KICAtIHJlbW92ZSB0aGUgbmV4dCgpIGFjY2Vzc29yIHNpbmNlIGl0J3Mgbm90IHVzZWQgYnkgQXBhY2hlIGF0IHRoZQogICAgbW9tZW50CiAgLSBuYW1lKCkgaXMgbWFkZSByZWFkLW9ubHkKCkFQUjo6VVJJOiBbU3Rhc10KICAtIHJlbW92ZWQgYWNjZXNzb3JzCiAgICBvIGlzX2luaXRpYWxpemVkKCkgKGludGVybmFsIGFwcl91cmkgZmxhZykKICAgIG8gIGRuc19sb29rZWRfdXAoKSBhbmQgZG5zX3Jlc29sdmVkKCkgKHRoZXkgYXJlIG5vdCAKICAgICAgIHVzZWQgYnkgYXBhY2hlL2FwcikKICAtIGFsbCByZW1haW5pbmcgYWNjZXNzb3JzIG5vdyBhY2NlcHQgdW5kZWYgdmFsdWUsIHdoaWNoIHVuc2V0cyB0aGUKICAgIGZpZWxkCgpFeHRlbmRlZCBXcmFwWFMgY29kZSB0byBzdXBwb3J0IGEgbmV3IHR5cGUgb2YgYWNjZXNzb3I6IGNoYXIgKiB3aGljaAphY2NlcHRzIHVuZGVmIHRvIHNldCB0aGUgQyBwb2ludGVyIHRvIE5VTEwgYW5kIGFzIHN1Y2ggdW5zZXQgdGhlCm1lbWJlciBvZiB0aGUgc3RydWN0LiBbU3Rhc10KCkV4Y2VwdGlvbiBlcnJvciBtZXNzYWdlcyBub3cgaW5jbHVkZSB0aGUgZXJyb3IgaWQgYWxvbmcgd2l0aCB0aGUgZXJyb3IKbWVzc2FnZSAoYXMgdGhleSBkaWQgaW4gZmlyc3QgcGxhY2UpLiBbU3Rhc10KCiRyLT5maW5mbyBub3cgYWNjZXB0cyBBUFI6OkZpbmZvIG9iamVjdCBhcyBhbiBvcHRpb25hbAphcmd1bWVudC4gW1N0YXNdCgpBUFI6OkZpbmZvIFtTdGFzXQogIC0gY2hhbmdlIHN0YXQoKSB0byByZXR1cm4gZmluZm8KICAtIG1ha2UgYWxsIGZpZWxkIGFjY2Vzc29ycyByZWFkb25seQoKQVJQOjpwYXNzd29yZF92YWxpZGF0ZSBpcyBub3cgQVJQOjpVdGlsOjpwYXNzd29yZF92YWxpZGF0ZSBbU3Rhc10KCkFQUjo6SXBTdWJuZXQ6Om5ldygpIG5vdyB0aHJvd3MgQVBSOjpFcnJvciBleGNlcHRpb24gKG5vdCByZXR1cm5pbmcKcmMpIFtTdGFzXQoKcmVuYW1lIHBhY2thZ2UgQVBSOjpOZXRMaWIgLT4gQVBSOjpJcFN1Ym5ldCB0byBtYXRjaCB0aGUgY2xhc3MgbmFtZQpbU3Rhc10KCkFQUjo6QnVja2V0VHlwZTogW1N0YXNdCiAgLSBuYW1lIGlzIHJlYWRvbmx5CgpBUFI6OkJyaWdhZGUgW1N0YXNdCiAgLSBkZXN0cm95KCkgbm93IHRocm93cyBBUFI6OkVycm9yIGV4Y2VwdGlvbiAobm90IHJldHVybmluZyByYykKICAtIHJlbmFtZSBlbXB0eSA9PiBpc19lbXB0eQogIC0gYWRkZWQgdGhlIG1ldGhvZCBjbGVhbnVwKCkKICAtIGZsYXR0ZW4oKSBub3cgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgKGFuZCBwYXNzZWQgdGhlCiAgICBidWZmZXIgYnkgdGhlIGFyZ3VtZW50KSBhbmQgdGhyb3dzIEFQUjo6RXJyb3IgZXhjZXB0aW9uCgpBUFI6OkJ1Y2tldDogW1N0YXNdCiAgLSByZWFkKCkgbm93IHJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgcmVhZCBkYXRhIGFuZCB0aHJvd3MKICAgIEFQUjo6RXJyb3IgZXhjZXB0aW9uIChub3QgcmV0dXJuaW5nIHJjKS4gVGhlIHJldHVybmVkIHNjYWxhciBpcwogICAgbm93IFRBSU5URUQuCiAgLSB0eXBlLT5uYW1lIG5vdyBoYXMgYSBtb2R1bGUgQVBSOjpCdWNrZXRUeXBlCiAgLSB0eXBlKCksIGxlbmd0aCgpLCBzdGFydCgpLCBkYXRhKCkgYXJlIG5vdyBhbGwgcmVhZG9ubHkKICAtIG5ldygpIGZpeCBhIGJ1ZyBpbiBvZmZzZXQgaGFuZGxpbmcKCgoKPWl0ZW0gMS45OV8xNCAtIE1heSAyMSwgMjAwNAoKQVBSOjpTb2NrQWRkcjo6cG9ydCgpIGFjY2Vzc29yIGlzIG5vdyByZWFkLW9ubHkgW1N0YXNdCgpBUFI6OlBvb2wgbm93IGhhcyBkZXN0cm95KCkgYW5kIGNsZWFyKCkgYXZhaWxhYmxlIFtTdGFzXQoKbm93IGxvZ2dpbmcgdGhlIGVycm9ycyBoYXBwZW5pbmcgaW4gcG9vbCBjbGVhbnVwIGNhbGxiYWNrcyBbU3Rhc10KCnVzZSB0aGUgbmV3IEFwYWNoZS1UZXN0IGF0dHJpYnV0ZSAtbWluY2xpZW50IGluIHRoZSB0ZXN0IHN1aXRlcy4gTm93CmFsb25nIHdpdGggdGhlIGRlZmF1bHQgbWF4Y2xpZW50cyA9IG1pbmNsaWVudHMrMSwgd2Ugbm8gbG9uZ2VyIHNob3VsZApnZXQgJ3NlcnZlciByZWFjaGVkIE1heENsaWVudHMgc2V0dGluZycgZXJyb3JzLiBbU3Rhc10KCm5ldyBBUEkgZm9yIEFQUjo6U29ja2V0IHJlY3YoKSBhbmQgc2VuZCgpICsgdXBkYXRlZCB0ZXN0cyBbU3Rhc10KCmFkZCBpbmZyYXN0cnVjdHVyZSBmb3IgbmV3IE1vZFBlcmw6OkNvbnN0IGNvbnN0YW50cyBhbmQgdGhlIGZpcnN0CmNvbnN0YW50IE1vZFBlcmw6OkVYSVQuIFtTdGFzXQoKcmUtaW1wbGVtZW50IE1vZFBlcmw6OlV0aWw6OmV4aXQgdG8gdXNlIGV4Y2VwdGlvbiBvYmplY3RzLCBzbyBpdCdzCnBvc3NpYmxlIHRvIGRldGVjdCBleGl0IGNhbGxlZCBpbiBldmFsIGNvbnRleHQgYW5kIGNhbGwgaXQgYWdhaW4Kb3V0c2lkZSB0aGUgZXZhbCBjb250ZXh0LiBbU3Rhc10KCmFkZCB0aGUgcGVybCBpbnRlcmZhY2UgZm9yIHRoZSBuZXcgZXhjZXB0aW9uIGhhbmRsaW5nIGNvZGUgKG1vZF9wZXJsLAphcGFjaGUgYW5kIGFwciBtZXRob2RzIHdpbGwgbm93IHRocm93IGV4Y2VwdGlvbnMgd2l0aCAkQCBiZWluZyBhbgpvYmplY3QpLiBOZXcgY2xhc3MgQVBSOjpFcnJvciB3YXMgYWRkZWQsIHRvIGhhbmRsZSB0aGUgZXhjZXB0aW9uCm9iamVjdHMgd2l0aCBvdmVybG9hZCBtZXRob2RzLiBBbHNvIGFkZGVkIGNvbmZlc3MgYW5kIGNyb2FrCmVxdWl2YWxlbnRzIG9mIENhcnAncyBtZXRob2RzLCBzaW5jZSBhdCB0aGUgbW9tZW50IHRoZSBDYXJwJ3Mgb25lcwpkb24ndCB3b3JrIGFzIGlzLiBUaGUgZm9sbG93aW5nIHBlcmwgYW5kIEMgbWV0aG9kcyBoYXZlIGJlZW4gcmVuYW1lZDoKICBtb2RwZXJsX2Fwcl9zdHJlcnJvciAgPT4gbW9kcGVybF9lcnJvcl9zdHJlcnJvciAKICBBUFI6OnN0cmVycm9yICAgICAgICAgPT4gQVBSOjpFcnJvcjo6c3RyZXJyIApbU3Rhc10KCnNldCB0aGUgJ2Vycm9yLW5vdGVzJyB0YWJsZSB0byB0aGUgZXJyb3IgbWVzc2FnZSBvbgpIVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUiBbU3Rhc10KCmZpeCB0aGUgYXB4cyBidWlsZCBmdW5jdGlvbiB0byBub3QgaGFuZGxlIGVtcHR5IGxvb2t1cHMgYXMgZXJyb3JzCltSYW5keSBLb2JlcywgU3RldmUgSGF5XQoKZml4IHR5cGUgY2FzdGluZyBwcm9ibGVtcyBpbiB0aGUgaW8gZnVuY3Rpb25zIFtTdGFzXQoKYWRkIHN1cHBvcnQgZm9yIGxpYmd0b3AgMi41LjArIChtYWludGVuYW5jZSBtb2RlKSBbU3Rhc10KCkFQUjo6U29ja2V0Ojp0aW1lb3V0X3NldCBub3cgY3JvYWtzIG9uIGZhaWx1cmUgW1N0YXNdCgpzaWduaWZpY2FudGx5IHNwZWVkdXAgdGhlIHN0YXJ0dXAgb2YgdGhyZWFkZWQgbXBtIHRlc3Qgc3VpdGUsIGJ5CmNvbmZpZ3VyaW5nIG9ubHkgdGhlIG1pbmltYWwgbnVtYmVyIG9mIHBlcmwgaW50ZXJwcmV0ZXJzIHRvIHN0YXJ0CltTdGFzXQoKbWFrZSBBUFI6OlNvY2tldDo6b3B0XyhzZXR8Z2V0KSB3b3JraW5nIChhbmQgY2hhbmdlIHRoZSBwcmV2aW91cwpiZWhhdmlvcikgW1N0YXNdCgptYWtlIHN1cmUgdGhhdCBvdXIgcHJvdG9jb2wgbW9kdWxlIHRlc3RzIHRoYXQgaW50ZXJhY3Qgd2l0aCB0aGUgc29ja2V0CnVzZSBhIGJsb2NraW5nIHJlYWQgW0pvZSBPcnRvbl0KClVzZSBhIGJldHRlciBhcHByb2FjaCB0byBmaWd1cmUgb3V0IHdoZXRoZXIgd2UgbmVlZCB0byBzdHJpcCBwZXJsJ3MKTGFyZ2VGaWxlc1NvdXJjZSBmbGFnLCBieSBjaGVja2luZyB3aGV0aGVyIGxpYmFwciB3YXMgY29tcGlsZWQgd2l0aAotRF9GSUxFX09GRlNFVF9CSVRTPTY0IG9yIG5vdC4gQ2hlY2tpbmcgZm9yIEFQUl9IQVNfTEFSR0VfRklMRVMgaXMKdXNlbGVzcyBzaW5jZSBpdCBkb2Vzbid0IHRlbGwgd2hldGhlciAzMiB2cyA2NCBiaXRzIG9mZl90IGFuZCBzaW1pbGFyCnR5cGVzIGFyZSB1c2VkIFtKb2UgT3J0b25dCgonU2V0SGFuZGxlciBwZXJsLXNjcmlwdCcgbm8gbG9uZ2VyIGdyYWJzIGFueSBuZXdseSBlbmNvdW50ZXJlZCBFTkQKYmxvY2tzLCBhbmQgcmVtb3ZlcyB0aGVtIGZyb20gUExfZW5kYXYsIGJ1dCBvbmx5IGlmIHRoZXkgYXJlCmV4cGxpY2l0bHkgcmVnaXN0ZXJlZCB2aWEgTW9kUGVybDo6R2xvYmFsOjpzcGVjaWFsX2xpc3RfcmVnaXN0ZXIoRU5ECj0+ICRwYWNrYWdlX25hbWUpICh0aGlzIGlzIGEgbmV3IGZ1bmN0aW9uKS4gSXQncyBub3cgcG9zc2libGUgdG8gaGF2ZQphIGNvbXBsZXRlIGNvbnRyb2wgb2Ygd2hlbiBFTkQgYmxvY2tzIGFyZSBydW4gZnJvbSB0aGUgdXNlciBzcGFjZSwgbm90Cm9ubHkgaW4gdGhlIHJlZ2lzdHJ5IGhhbmRsZXJzIFtTdGFzXQoKRU5EIGJsb2NrcyBlbmNvdW50ZXJlZCBieSBjaGlsZCBwcm9jZXNzZXMgYW5kIG5vdCBoaWphY2tlZCBieQpNb2RQZXJsOjpHbG9iYWw6OnNwZWNpYWxfbGlzdF9yZWdpc3RlcigpIGFyZSBub3cgZXhlY3V0ZWQgYXQgdGhlCnNlcnZlciBzaHV0ZG93biAocHJldmlvdXNseSB0aGV5IHdlcmVuJ3QgZXhlY3V0ZWQgYXQgYWxsKS4gW1N0YXNdCgpBZGRlZCB0ZXN0IHRvIGVuc3VyZSA8UGVybD4gc2VjdGlvbnMgY2FuIGhhdmUgdGhpbmdzIGxpa2UgJUxvY2F0aW9uCnRpZWQgW0dvemVyXQoKRml4IHRoZSBpbnN0YWxsYXRpb24gb24gV2luMzIgc28gdGhhdCBhbiBhcHByb3ByaWF0ZSBBcGFjaGUyCnN1YmRpcmVjdG9yeSB1bmRlciB0aGUgUGVybCB0cmVlIGlzIHVzZWQgd2hlbiBNUF9JTlNUX0FQQUNIRTIgaXMKc3BlY2lmaWVkIFtSYW5keSBLb2Jlc10KCkZpeCBhIHJlZGVmaW5lZCB3YXJuaW5nIGluIEFwYWNoZTo6U3RhdHVzIFtTdGFzXQoKRml4IEFwYWNoZTo6U3RhdHVzLCB0byBsb29rdXAgdGhlIEFwYWNoZTo6UmVxdWVzdCB2ZXJzaW9uIHdpdGhvdXQKbG9hZGluZyBpdC4gT25seSBpZiBhIHN1aXRhYmxlICgyLngpIHZlcnNpb24gaXMgZm91bmQgLS0gbG9hZCBhbmQgdXNlCml0LiBQcmV2aW91c2x5IGxvYWRpbmcgdGhlIDEueCB2ZXJzaW9uIHdhcyBhZmZlY3RpbmcgQXBhY2hlOjpjb21wYXQuCltTdGFzXQoKRml4IGEgYnVnIGluIHNwZWNpYWwgYmxvY2tzIGhhbmRsaW5nIChsaWtlIEVORCksIHdoaWNoIHVudGlsIG5vdyB3YXMKZHJvcHBpbmcgb24gdGhlIGZsb29yIGFsbCBibG9ja3MgYnV0IHRoZSBsYXN0IG9uZSAobWFpbmx5IGFmZmVjdGluZwpyZWdpc3RyeSBoYW5kbGVycykuIFtTdGFzXQoKVGhlIGZpbHRlciBzdHJlYW1pbmcgQVBJIHByaW50KCkgZnVuY3Rpb24sIG5vdyBjb3JyZWN0bHkgaGFuZGxlcyBhCmJpbmFyeSBkYXRhIFtTdGFzXQoKRml4IFJlZ2lzdHJ5IGhhbmRsZXJzLCBub3QgdG8gbG9zZSB0aGUgZXhlY3V0aW9uIGVycm9ycywgd2hlbiB0aGV5CmluY2x1ZGUgRU5EIGJsb2NrcyBbU3Rhc10KCgoKPWl0ZW0gMS45OV8xMyAtIE1hcmNoIDgsIDIwMDQKCnJlc3BlY3QgJEVOVntBUEFDSEVfVEVTVF9TVEFSVFVQX1RJTUVPVVR9IHNldHRpbmdzIGlmIGFueSBbU3Rhc10KCkFkZGVkIHRlc3RzIGZvciBpc3N1aW5nIHN1YnJlcXVlc3RzIGZyb20gZmlsdGVycyBbR2VvZmZyZXkgWW91bmddCgpVcGRhdGVkIHRvIHRoZSBuZXcgQXBhY2hlIExpY2Vuc2UgVmVyc2lvbiAyLjAgW0dvemVyXQoKRHJvcCB0aGUgc3VwcG9ydCBmb3IgbWFraW5nIEdBVEVXQVlfSU5URVJGQUNFIHNwZWNpYWwuIEl0J3Mgbm90IG5lZWRlZAphcyAkRU5We01PRF9QRVJMfSwgYXZhaWxhYmxlIGluIGJvdGggbW9kX3BlcmwgZ2VuZXJhdGlvbnMsIHNob3VsZCBiZQp1c2VkIHRvIHRlc3Qgd2hldGhlciB0aGUgY29kZSBpcyBydW5uaW5nIHVuZGVyIG1vZF9wZXJsLiBbU3Rhc10KCkhhbmRsZSBjb3JyZWN0bHkgdGhlIHNpdHVhdGlvbiB3aGVuIHJlc3BvbnNlIEhUVFAgaGVhZGVycyBhcmUgcHJpbnRlZApmcm9tIHRoZSBoYW5kbGVyIGFuZCB0aGUgcmVzcG9uc2UgYm9keSBzdGFydHMgd2l0aCBcMDAwLCB3aGljaCBpcyB0aGUKY2FzZSB3aXRoIHNvbWUgaW1hZ2VzIGxpa2UgLmljby4gW1N0YXNdCgpBcGFjaGU6OlBlcmxTZWN0aW9ucy0+ZHVtcCgpIGFuZCBzdG9yZShmaWxlbmFtZSkgW0dvemVyXQoKZXhwb3NlICRjLT5rZWVwYWxpdmUgcmVsYXRlZCBjb25zdGFudHMgYW5kICRjLT5rZWVwYWxpdmVzIGNvdW50ZXIKW1N0YXNdCgpQZXJsIGhhbmRsZXJzIGFyZSBub3cgZ3VhcmFudGVlZCB0byBydW4gYmVmb3JlIGNvcmUgQyBoYW5kbGVycyBmb3IKYWxsIHJlcXVlc3QgcGhhc2VzLiAgW0dlb2ZmcmV5IFlvdW5nXQoKRml4IHRoZSBTVERJTi9PVVQgb3ZlcnJpZGluZyBwcm9jZXNzIHRvIGhhbmRsZSBncmFjZWZ1bGx5IGNhc2VzLCB3aGVuCmVpdGhlciBvciBib3RoIGFyZSBjbG9zZWQvYm9ndXMgKHRoZSBwcm9ibGVtIHdhcyBvbmx5IHdpdGggdXNlcGVybGlvCmVuYWJsZWQgcGVybCkgW1N0YXNdCgpjb3B5IGFwcl90YWJsZV9jb21wcmVzcyBsb2dpYyBmcm9tIGxhdGVyIGh0dHBkIHZlcnNpb25zIGluIGNhc2UgbW9kX3BlcmwKaXMgYnVpbHQgYWdhaW5zdCAyLjAuNDYsIGFzIG1vZF9wZXJsIG5vdyByZXF1aXJlcyBpdCBpbnRlcm5hbGx5LiAgdXNlcnMKc2hvdWxkIGJlIGF3YXJlIHRoYXQgMi4wLjQ3IG1heSBiZWNvbWUgdGhlIG9sZGVzdCBzdXBwb3J0ZWQgaHR0cGQgdmVyc2lvbiAKaW4gdGhlIG5lYXIgZnV0dXJlLiAgW0dlb2ZmcmV5IFlvdW5nXQoKRml4IHRoZSBjb3JydXB0aW9uIG9mIHRoZSBodHRwZCBwcm9jZXNzIGFyZ3ZbMF0sIGNhdXNlZCBieSAkMAptYW5pcHVsYXRpbmcgW1N0YXNdCgpNb2RQZXJsOjpNZXRob2RMb29rdXA6Omxvb2t1cF9tZXRob2Qgbm93IGhhbmRsZXMgc3ViLWNsYXNzZWQgb2JqZWN0cwpbU3Rhc10KCnN0YW5kYXJkICVFTlYgcG9wdWxhdGlvbiB3aXRoIENHSSB2YXJpYWJsZXMgYW5kIGNvbnRlbnRzIG9mIHRoZQpzdWJwcm9jZXNzX2VudiB0YWJsZSAoc3VjaCBhcyBTZXRFbnYgYW5kIFBhc3NFbnYpIGhhcyBiZWVuIGRlbGF5ZWQKdW50aWwgdGhlIGxhc3QgcG9zc2libGUgbW9tZW50IGJlZm9yZSBjb250ZW50LWdlbmVyYXRpb24gcnVucy4KUGVybFNldEVudiBhbmQgUGVybFBhc3NFbnYgYXJlIGVhY2ggYW4gZXhjZXB0aW9uIHRvIHRoaXMgYW5kIGFyZQpwbGFjZWQgaW4gYm90aCAlRU5WIGFuZCB0aGUgc3VicHJvY2Vzc19lbnYgdGFibGUgaW1tZWRpYXRlbHksCnJlZ2FyZGxlc3Mgb2YgdGhlIGN1cnJlbnQgWystXVNldHVwRW52IHNldHRpbmcuCltHZW9mZnJleSBZb3VuZ10KCmZpeCBQZXJsQWRkVmFyIGNvbmZpZ3VyYXRpb24gbWVyZ2luZyBbR2VvZmZyZXkgWW91bmddCgpBbm9ueW1vdXMgc3VicyBhcmUgbm93IHN1cHBvcnRlZCBpbiBwdXNoX2hhbmRsZXJzLCBzZXRfaGFuZGxlcnMsCmFkZF9pbnB1dF9maWx0ZXIsIGV0Yy4gQSBmYXN0IGNhY2hlZCBjdiBpcyB1c2VkIHdpdGggbm9uLWl0aHJlYWRlZApwZXJsLiBBIHNsb3dlciBkZXBhcnNlL2V2YWwgYXBwcm9hY2ggKHZpYSBCOjpEZXBhcnNlKSBpcyB1c2VkIHdpdGgKaXRocmVhZHMgZW5hYmxlZCBwZXJscy4gRnVydGhlciBvcHRpbWl6YXRpb25zIGFyZSBwbGFubmVkIGZvciB0aGUKbGF0dGVyIGNhc2UuIFtTdGFzXQoKaHRfdGltZSB3L28gdGhlIHBvb2wgaXMgbm93IGF2YWlsYWJsZSBvbmx5IHZpYSBvdmVycmlkZS9yZXN0b3JlIGNvbXBhdApBUEkuIGZvcm1hdF90aW1lLCBoYXMgYmVlbiByZW5hbWVkIGJhY2sgdG8gaHRfdGltZSwgYW5kIHRoZSBkZWZhdWx0CnZhbHVlcyBmb3IgZm10LCB0aW1lIGFuZCBnbXQgYXJlIG5vdyBzdXBwb3J0ZWQuIFtTdGFzXQoKaXQncyBub3cgcG9zc2libGUgdG8gcHVzaCBuZXcgaGFuZGxlcnMgaW50byB0aGUgc2FtZSBwaGFzZSB0aGF0IGlzCnJ1bm5pbmcgYXQgdGhlIG1vbWVudCBbU3Rhc10uCgp3aGVuICRyLT5oYW5kbGVyKCRuZXdfaGFuZGxlcikgaXMgY2FsbGVkIGZyb20gYSByZXNwb25zZSBwaGFzZSwgaXQgbm93CmNoZWNrcyB0aGF0IHRoZSByZXNwb25zZSBoYW5kbGVyIHR5cGUgaXMgbm90IHN3aXRjaGVkIChlLmcuIGZyb20KJ21vZHBlcmwnIHRvICdwZXJsLXNjcmlwdCcpIGZyb20gdGhlIGN1cnJlbnRseSB1c2VkIG9uZSBbU3Rhc10KClNpbmNlIEFwYWNoZTo6U3ViUHJvY2VzcyBpcyBub3cgcGFydCBvZiB0aGUgbXAyIEFQSSwgYWRkCiRyLT5jbGVhbnVwX2Zvcl9leGVjIGFzIGEgbm9vcCBpbiBBcGFjaGU6OmNvbXBhdC4gVGhhdCBmdW5jdGlvbiBpcyBubwpsb25nZXIgbmVlZGVkIGluIEFwYWNoZTIuIFtTdGFzXQoKV2hlbiAncGVybCBNYWtlZmlsZS5QTCBQUkVGSVg9L2Zvby9iYXInIGlzIHVzZWQgYW5kIG1vZF9wZXJsIDEgaXMKZm91bmQsIGJ1dCBhdCBkaWZmZXJlbnQgcHJlZml4IG5vIGxvbmdlciByZXF1aXJlCk1QX0lOU1RfQVBBQ0hFMj0xLiBbU3Rhc10KCm1vZHBlcmxfbWd2X3Jlc29sdmUgbm93IGNyb2FrcyB3aGVuIGEgbW9kdWxlIHNjaGVkdWxlZCBmb3IgYXV0b2xvYWRpbmcKZmFpbHMgdG8gbG9hZC4gIEF1dG9Mb2FkZWQgbW9kdWxlcyBzaG91bGRuJ3Qgc2lsZW50bHkgZmFpbC4gW1N0YXNdCgpQZXJsKElucHV0fE91dHB1dClGaWx0ZXJIYW5kbGVyIGhhbmRsZXJzIGFyZSBub3cgYWx3YXlzIEF1dG9Mb2FkZWQsIGFzCmlmICcrJyBwcmVmaXggd2FzIHVzZWQuIFRoaXMgbXVzdCBiZSBwZXJmb3JtZWQgdG8gZ2V0IHRoZSBhY2Nlc3MgdG8KZmlsdGVyIGF0dHJpYnV0ZXMgbG9uZyBiZWZvcmUgdGhlIGZpbHRlciBpdHNlbGYgaXMgZXhlY3V0ZWQuIFtTdGFzXQoKQVBSL1Bvb2wueHMgaGFzIGJlZW4gcmVpbXBsZW1lbnRlZC4gIFRoZSBwcm9ibGVtIHdpdGggdGhlIHByZXZpb3VzCmltcGxlbWVudGF0aW9uIGlzIHRoYXQgYSBkZWFkIHBlcmwgcG9vbCBvYmplY3QgY291bGQgaGlqYWNrIGEgbmV3bHkKY3JlYXRlZCBwb29sLCB3aGljaCBkaWRuJ3QgYmVsb25nIHRvIHRoYXQgb2JqZWN0LCBidXQgd2hpY2ggaGFwcGVuZWQKdG8gYmUgYWxsb2NhdGVkIGF0IHRoZSBzYW1lIG1lbW9yeSBsb2NhdGlvbi4gVGhlIHByb2JsZW0gaXMgdGhhdAphcHJfcG9vbF91c2VyX2RhdGFfc2V0L2dldCBoYXMgbm8gbWVjaGFuaXNtIHRvIGNoZWNrIHdoZXRoZXIgdGhlIHBvb2wKaGFzIGNoYW5nZWQgc2luY2UgaXQgd2FzIGxhc3QgYXNzaWduZWQgdG8gKGl0IGRvZXMgYnV0IG9ubHkgaW4gdGhlCmRlYnVnIG1vZGUpLiBJdCByZWFsbHkgbmVlZHMgc29tZSBzaWduYXR1cmUgbWVjaGFuaXNtIHdoaWNoIGNhbiBiZQp2ZXJpZmllZCB0aGF0IHRoZSBwb29sIGlzIHN0aWxsIHRoZSBzYW1lIHBvb2wuIFNpbmNlIGFwcl9wb29sIGRvZXNuJ3QKaGF2ZSB0aGlzIGZlYXR1cmUsIHRoZSByZWZlcmVuY2UgY291bnRpbmcgaGFzIGJlZW4gcmVpbXBsZW1lbnRlZCB1c2luZwphIHBsYWluIHN2IHJlZmVyZW5jZS4gU2V2ZXJhbCBuZXcgKG1haW5seSBoaWphY2tpbmcpIHRlc3RzIHdoaWNoIGJhZGx5CmZhaWwgd2l0aCB0aGUgcHJldmlvdXMgaW1wZWxlbWVudGF0aW9uIGhhdmUgYmVlbiBhZGRlZC4gW1N0YXNdCgpmaXggY2FsbGluZyAkci0+c3VicHJvY2Vzc19lbnYoKSBpbiBhIHZvaWQgY29udGV4dCBzbyB0aGF0IGl0IG9ubHkKcG9wdWxhdGVzICVFTlYgaWYgYWxzbyBjYWxsZWQgd2l0aCBubyBhcmd1bWVudHMuICBhbHNvLCBtYWtlIHN1cmUgaXQKY2FuIGJlIGNhbGxlZCBtb3JlIHRoYW4gb25jZSBhbmQgc3RpbGwgcG9wdWxhdGUgJUVOVi4KW0dlb2ZmcmV5IFlvdW5nXQoKYWRkIEFQUjo6QnJpZ2FkZTo6cG9vbCgpIHRvIGFsbG93IGFjY2VzcyB0byB0aGUgcG9vbCBhc3NvY2lhdGVkIHdpdGgKdGhlIGJyaWdhZGUgIFtHZW9mZnJleSBZb3VuZ10KCm1ha2UgJ3QvVEVTVCAtc3RhcnR1cF90aW1lb3V0IHNlY3MnIHdvcmtpbmcgKHByZXZpb3VzbHkgdXNlcidzIHZhbHVlCndhcyBpZ25vcmVkKSBbU3Rhc10KCk1vZFBlcmw6OlJlZ2lzdHJ5IGFuZCBmcmllbmRzIG5vdyBzdXBwb3J0IG5vbi1wYXJzZWQgaGVhZGVycyBzY3JpcHRzLAp3aG9zZSBmaWxlbmFtZSA9fiAvXm5waC0vLCBpZGVudGljYWxseSB0byBtb2RfY2dpLiArIHRlc3QgW1N0YXNdCgppbXBsZW1lbnQgQVBSOjpCcmlnYWRlOjpsZW5ndGgoKSBhbmQgQVBSOjpCcmlnYWRlOjpmbGF0dGVuKCkgKHRoZQpsYXR0ZXIgaW1wbGVtZW50cyBhIHdyYXBwZXIgZm9yIGFwcl9icmlnYWRlX2ZsYXR0ZW4sIGJ1dCBhbHNvIGluY2x1ZGVzCmFuIGVtdWxhdGlvbiBvZiBhcHJfYnJpZ2FkZV9wZmxhdHRlbikgYXMgW0dlb2ZmcmV5IFlvdW5nXQoKKCRyfCRzKS0+YWRkX2NvbmZpZygpIG5vdyBkaWUgaWYgZmFpbGVkIChwcmV2aW91c2x5IHJldHVybmVkIHRoZQplcnJvcikgW1N0YXNdCgpmaXggY29udGV4dCBwcm9ibGVtcyBpbiA8cGVybD4gc2VjdGlvbnMgYW5kClBlcmxNb2R1bGUvUGVybExvYWRNb2R1bGUvUGVybFJlcXVyZSB1bmRlciB0aHJlYWRlZCBtcG1zIHcvClBlcmxPcHRpb25zICtQYXJlbnQvK0Nsb25lIGluIFZob3N0cyArIFRlc3RWaG9zdDo6Y29uZmlnIHRlc3QuIFtTdGFzXQoKSW1wbGVtZW50ZWQgQXBhY2hlOjpnZXRfc2VydmVyX3ZlcnNpb24gYW5kIEFwYWNoZTo6Z2V0X3NlcnZlcl9idWlsdAphcyBjb25zdGFudCBzdWJyb3V0aW5lcyBbR2VvZmZyZXkgWW91bmddCgpNb3ZlZCBzb21lIGZ1bmN0aW9ucyBvdXQgb2YgdGhlIEFwYWNoZTo6IG5hbWVzcGFjZToKICBBcGFjaGU6OnVuZXNjYXBlX3VybCgpICAgICAgIGlzIG5vdyBBcGFjaGU6OlVSSTo6dW5lc2NhcGVfdXJsKCkKICBBcGFjaGU6OmxvZ19waWQoKSAgICAgICAgICAgIGlzIG5vdyBBcGFjaGU6OkxvZzo6bG9nX3BpZCgpCiAgQXBhY2hlOjpMT0dfTUFSSygpICAgICAgICAgICBpcyBub3cgQXBhY2hlOjpMb2c6OkxPR19NQVJLKCkKW0dlb2ZmcmV5IFlvdW5nXQoKaWYgTVBfQVBfUFJFRklYIGlzIHVzZWQgYXB4cyBhbmQgYXByLWNvbmZpZyBmcm9tIHRoZSBhcGFjaGUgYnVpbGQgdHJlZQp3b24ndCB3b3JrLCBzbyBpdCBjYW4ndCBjby1leGlzdCB3aXRoIE1QX0FQWFMgYW5kIE1QX0FQUl9DT05GSUcgYnVpbGQKb3B0aW9ucyAtIGVuc3VyZSB0aGF0IHRoaXMgZG9lc24ndCBoYXBwZW4uIFtTdGFzXQoKc2VydmVyX3Jvb3RfcmVsYXRpdmUoKSBub3cgcmVxdWlyZXMgZWl0aGVyIGEgdmFsaWQgcG9vbCBvciBhbiAkciwgJHMsCm9yICRjIG9iamVjdCBhcyBhIGZpcnN0IGFyZ3VtZW50LiAgYWxzbywgdGhlIHJldHVybmVkIHJlc3VsdCBpcyBhCmNvcHksIHByb3RlY3RpbmcgYWdhaW5zdCBjYXNlcyB3aGVyZSB0aGUgcG9vbCB3b3VsZCBnbyBvdXQgb2Ygc2NvcGUKYmVmb3JlIHRoZSByZXN1bHQuICBbR2VvZmZyZXkgWW91bmddCgpDaGVjayB0aGUgc3VjY2VzcyBvZiBzeXNvcGVuIGluIHRtcGZpbGUoKSBpbiBjb21wYXQgW0dlb2ZmcmV5IFlvdW5nXQoKbWFrZSBzdXJlIER5bmFMb2FkZXIgaXMgbG9hZGVkIGJlZm9yZSBYU0xvYWRlciwgbm90IG9ubHkgd2l0aCBwZXJsCjUuNi4xLCBidXQgYWx3YXlzIGJlY2F1c2Ugb2YgdGhlIGlzc3VlcyB3aXRoIDxQZXJsPiBzZWN0aW9ucyBhcmUKbG9hZGVkIGZyb20gK1BhcmVudCB2aG9zdCBbU3Rhc10KCmFkZGVkICgkcnwkcyktPmlzX3Blcmxfb3B0aW9uX2VuYWJsZWQoJG9wdGlvbl9uYW1lKSwgdG8gdGVzdCBmb3IKUGVybE9wdGlvbnMgKyB0ZXN0cyBbU3Rhc10KCk9uIFNvbGFyaXMgYWRkIGEgd29ya2Fyb3VuZCBmb3IgeHMvQVBSL0FQUi9NYWtlZmlsZS5QTCB0byBidWlsZApBUFIuc28sIGNvcnJlY3RseSBsaW5rZWQgYWdhaW5zdCBhcHIgYW5kIGFwci11dGlsIGxpYnMsIGJ5IGFkZGRpbmcgdGhlCm1pc3NpbmcgLVIgcGF0aHMgY29ycmVzcG9uZGluZyB0byAtTCBmbGFncy4gRVU6Ok1NIHdhcyBhZGRpbmcgdGhlbSB2aWEKTERfUlVOX1BBVEggaW5zdGVhZCBvZiB1c2luZyAtUiwgYnV0IHNpbmNlIHBlcmwncyBsZGRmbGFncyBtYXkgaGF2ZSAtUgppdCBvdmVycmlkZXMgTERfUlVOX1BBVEguIFNvIGV4cGxpY2l0bHkgYWRkIGFueXRoaW5nIHRoYXQgbWF5IGdvIGludG8KTERfUlVOX1BBVEggdmlhIC1SLiBBbHNvIG1ha2Ugc3VyZSB0aGF0IC1SIGNvbWluZyBmcm9tIEFwYWNoZSB3aWxsCmFwcGVhciBmaXJzdC4gW0JyYWQgTGFuYW0gPGJsbEBnZW50b28uY29tPl0KCidtYWtlIGRpc3QnIG5vdyBnZW5lcmF0ZXMgYW5kIHBpY2tzIEFwYWNoZS1UZXN0L01FVEEueW1sIHdoaWNoIHdhcwphbHdheXMgcmVwb3J0ZWQgbWlzc2luZywgYXMgaXQgd2FzIGluY2x1ZGVkIGluIEFwYWNoZS1UZXN0L01BTklGRVNUCltTdGFzXQoKZml4IHRoZSAkci0+cmVhZCBmdW5jdGlvbiB0byByZXR1cm4gdW5kZWYgb24gZmFpbHVyZSBzaW1pbGFyIHRvIHRoZQpjb3JlIHBlcmwgZnVuY3Rpb24gYW5kIG1ha2UgJCEgYXZhaWxhYmxlIGZvciB0aG9zZSB3aG8gdGVzdCBmb3IgcmVhZCgpCmZhaWx1cmVzLiBbU3Rhc10KCk1ha2Ugc3VyZSB0aGF0IHBub3RlcyBhcmUgZGVzdHJveWVkIGFmdGVyIFBlcmxDbGVhbnVwIGhhbmRsZXJzIGFyZQpmaW5pc2hlZCBhbmQgbm90IGJlZm9yZSArIHRlc3QuIFtTdGFzXQoKCgo9aXRlbSAxLjk5XzEyIC0gRGVjZW1iZXIgMjIsIDIwMDMKClJlc3RvcmUgYSBwcm9wZXIgYmVoYXZpb3Igb2YgYWxsIFJlZ2lzdHJ5IGhhbmRsZXJzLCBidXQgUGVybFJ1biwgbm90CnRvIHJlc2V0ICVJTkMgdG8gZm9yZ2V0IGFueSAucGwgZmlsZXMgcmVxdWlyZWQgZHVyaW5nIHRoZSBzY3JpcHQncwpleGVjdXRpb24uIFtTdGFzXQoKPFBlcmw+IGFyZSBub3cgZXZhbHVhdGluZyBjb2RlIGludG8gb25lIGRpc3RpbmN0IG5hbWVzcGFjZSBwZXIKY29udGFpbmVyLCBzaW1pbGFyIHRvIE1vZFBlcmw6OlJlZ2lzdHJ5IHNjcmlwdHMuIFtQaGlsaXBwZSBNLiBDaGlhc3Nvbl0KCkZpeCBNb2RQZXJsOjpNTTo6V3JpdGVNYWtlZmlsZSB0byB1c2UgdGhlIE1PRFBFUkxfQ0NPUFRTIGVudHJ5IGZyb20KQXBhY2hlOjpCdWlsZENvbmZpZywgYXMgaXQgY29udGFpbnMgc29tZSBmbGFncyBhZGRlZCBieSBtb2RfcGVybCwKd2hpY2ggYXJlbid0IGluIHBlcmxfY2NvcHRzIGFuZCBhcF9jY29wdHMuIFtTdGFzXQoKQWRkIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBBcGFjaGU6OkNvbm5lY3Rpb246OmxvY2FsX2FkZHIgYW5kCkFwYWNoZTo6Q29ubmVjdGlvbjo6cmVtb3RlX2FkZHIgdG8gdGhlIEFwYWNoZTo6Y29tcGF0IG92ZXJyaWRhYmxlCmZ1bmN0aW9ucy4gW1N0YXNdCgpBcGFjaGU6OmNvbXBhdCdzIGltcGxlbWVudGF0aW9uIG9mIEFQUjo6VVJJOjp1bnBhcnNlLApBcGFjaGU6OlJlcXVlc3RSZWM6OmZpbmZvIGFuZCBBcGFjaGU6OlJlcXVlc3RSZWM6Om5vdGVzIGlzIG5vdwpvdmVycmlkYWJsZSBhbmQgbm90IGVuYWJsZWQgYnkgZGVmYXVsdC4gW1N0YXNdCgpBcGFjaGU6OmNvbXBhdCBubyBsb25nZXIgZW5hYmxlcyBmdW5jdGlvbnMgd2hpY2ggY29sbGlkZSB3aXRoIG1wMiBBUEkKYnkgZGVmYXVsdC4gSXQgcHJvdmlkZXMgdHdvIG5ldyBmdW5jdGlvbnM6IG92ZXJyaWRlX21wMl9hcGkgYW5kCnJlc3RvcmVfbXAyX2FwaSB0byBvdmVycmlkZSBhbmQgcmVzdG9yZSB0aGUgb3JpZ2luYWwgbXAyIEFQSS4gW1N0YXNdCgpGb3IgV2luMzIsIGFkZCBhIC5iYXQgZXh0ZW5zaW9uIHRvIGNhbmRpZGF0ZXMgZm9yIHRoZSBhcHhzIGFuZAphcHItY29uZmlnIHV0aWxpdGllcyB1c2VkIGluIEFwYWNoZTo6QnVpbGQsIHNvIHRoYXQgdGhlIC14IGZpbGUKdGVzdCBjYW4gcG90ZW50aWFsbHkgc3VjY2VlZCBbUmFuZHkgS29iZXNdCgpQbHVnIGEgbWVtb3J5IGxlYWsgd2l0aCAncGVybC1zY3JpcHQnIG5vdCBjbGVhbmluZyB1cCB0aGUgdGVtcCB2YXJzCmNyZWF0ZWQgZHVyaW5nIHRoZSBvdmVycmlkZSBvZiBTVERJTi9TVERPVVQgdG8gdXNlIHRoZSA6QXBhY2hlIElPCmxheWVyIFtTdGFzXQoKbGliZ3RvcCBjb25maWcgKG5lZWRlZCBmb3IgZW5hYmxpbmcgTU9EX1BFUkxfVFJBQ0U9bSkgaXMgbm93IHNlYXJjaGVkCnVzaW5nIHRoZSBnbm9tZSBwYWNrYWdpbmcgdG9vbHMgaWYgYXZhaWxhYmxlIChwa2ctY29uZmlnIGZvciBnbm9tZS0yLngKYW5kIGdub21lLWNvbmZpZyBmb3IgZ25vbWUtMS54KSBbU3Rhc10KClByZXZlbnQgYSBwcm9ibGVtIHdoZXJlIGFuIGF1dG92aXZpZmllZCBwYWNrYWdlIChzdGFzaCkgcHJldmVudHMgZnJvbQptb2RwZXJsX21ndiB0byBsb2FkIHRoZSBmaWxlIHdpdGggdGhhdCBwYWNrYWdlICh1bnRpbCBub3cgaXQgd2FzCmNoZWNraW5nIHdoZXRoZXIgdGhlIHN0YXNoIGV4aXN0ZWQgYWxyZWFkeSBhbmQgc2tpcHBlZCB0aGUgbG9hZGluZyBpZgp0aGF0IHdhcyB0aGUgY2FzZSkuIE5vdyBjaGVja2luZyAlSU5DIGFuZCBhdHRlbXB0aW5nIHRvIGxvYWQgdGhlCm1vZHVsZS4gUmVwb3J0aW5nIHRoZSBmYWlsdXJlIG9ubHkgaWYgdGhlIG1vZHVsZSBoYXMgZmFpbGVkIHRvIGxvYWQKYW5kIHRoZSBzdGFzaCBpcyBub3QgZGVmaW5lZCAoc28gdGhhdCBpdCdzIHBvc3NpYmxlIHRvIGF1dG92aXZpZnkKcGFja2FnZXMgd2l0aG91dCBsb2FkaW5nIHRoZW0gZnJvbSBhbiBleHRlcm5hbCBmaWxlKS4gW1N0YXNdCgpNYXhDbGllbnRzIGlzIG5vdyBvdmVycmlkYWJsZSBmcm9tIHRoZSB0L1RFU1QgLW1heGNsaWVudHMgY29tbWFuZCBsaW5lCm9wdGlvbiAoaXQgd2FzIGhhcmRjb2RlZCBiZWZvcmUpLiBbU3Rhc10KClBvc3Rwb25lIHRoZSBhbGxvY2F0aW9uIG9mIHRoZSB3YnVja2V0IGluIGZpbHRlcnMgdGlsbCB0aGUgbW9tZW50IGl0J3MKbmVlZGVkIChpZiBhdCBhbGwpLiBTaW5jZSBub24tc3RyZWFtaW5nIGZpbHRlcnMgYXJlbid0IGdvaW5nIHRvIHVzZQp0aGF0IGJ1ZmZlciwgaXQncyBhIHdhc3RlIHRvIGFsbG9jYXRlL2ZyZWUgaXQuIFtTdGFzXQoKRXh0ZW5kIHRoZSBhdXRvZ2VuZXJhdGVkIGJ1ZyByZXBvcnQgdG8gaW5jbHVkZSBpbmZvcm1hdGlvbiBhYm91dAppbnN0YWxsZWQgbW9kdWxlcyBvZiBzcGVjaWFsIGludGVyZXN0ICh3aGljaCBtYXkgYWlkIGluIHVuZGVyc3RhbmRpbmcKdGhlIGJ1ZyByZXBvcnQpLCBzdWNoIGFzIENHSS5wbSwgQXBhY2hlOjpSZXF1ZXN0LCBMV1AsIGV0Yy4gW1N0YXNdCgpBcyB0aGUgdGVzdCBzdWl0ZSBrZWVwcyBvbiBncm93aW5nLCBpdCB0YWtlcyBsb25nZXIgdGltZSB0bwpzdGFydHVwLiBDaGFuZ2UgdGhlIG1haW4gdGVzdCBzdWl0ZSB0aW1lb3V0IHRvIDE4MCBzZWNzIGZvciB0aHJlYWRlZAptcG1zIGFuZCAxMjAgc2VjcyBmb3Igbm9uLXRocmVhZGVkIG9uZXMuIFtTdGFzXQoKdXNlIHBsYWluIG1hbGxvYy9mcmVlIHRvIGFsbG9jYXRlIGZpbHRlciBzdHJ1Y3RzLCBzaW5jZSB0aGV5IGNvdWxkIGJlCmludm9rZWQgaHVuZHJlZHMgb2YgdGltZXMgZHVyaW5nIGEgc2luZ2xlIHJlcXVlc3QsIGNhdXNpbmcgaHVnZSBtZW1vcnkKZGVtYW5kcyBpZiB0aGUgbWVtb3J5IGlzIGFsbG9jYXRlZCBmcm9tIHRoZSBwb29sLCB3aGljaCBnZXRzIGRlc3Ryb3llZApvbmx5IGF0IHRoZSBlbmQgb2YgYSByZXF1ZXN0LiBbU3Rhc10KCkZpeCBhIGNvbXBpbGF0aW9uIGVycm9yIGluIEFQWC54cyB3aGVuIE1QX0hBVkVfQVBSX0xJQlMgaXMgbm90IGRlZmluZWQKW0ZyZWQgTW95ZXIgPGZyZWRAdGFwZXJmcmllbmRseW11c2ljLm9yZz5dCgpmaXggYSBtZW1vcnkgbGVhayB3aGVuICRmaWx0ZXItPmN0eCBpcyB1c2VkIFtTdGFzXQoKZml4IGJ1Z2xldCBvbiBXaW4zMiAoYW5kIHBvdGVudGlhbGx5IG90aGVyIG5vbi1Vbml4IHBsYXRmb3JtcykKd2hlcmUgbm90IGFsbCBmaWxlcyB3ZXJlIGJlaW5nIGluc3RhbGxlZCB1bmRlciBhIHJlbGF0aXZlIEFwYWNoZTIKc3ViZGlyZWN0b3J5IHdoZW4gTVBfSU5TVF9BUEFDSEUyIHdhcyBzcGVjaWZpZWQgW1JhbmR5IEtvYmVzXS4KCmRlcHJlY2F0ZWQgQVBSOjpTb2NrQWRkcjo6cG9ydF9nZXQoKS9BUFI6OlNvY2tBZGRyOjpwb3J0X3NldCgpCnJlcGxhY2VkIHdpdGggZGlyZWN0IGFjY2VzcyB0byB0aGUgcG9ydCByZWNvcmQgdmlhCkFQUjo6U29ja0FkZHI6OnBvcnQoKS4gW0dlb2ZmcmV5IFlvdW5nLCBTdGFzXQoKZGVwcmVjYXRlZCBBUFI6OlVSSTo6ZGVmYXVsdF9wb3J0X2Zvcl9zY2hlbWUoKSByZXBsYWNlZCB3aXRoCkFQUjo6VVJJOjpwb3J0X29mX3NjaGVtZSgpIFtHZW9mZnJleSBZb3VuZ10KCmRlcHJlY2F0ZWQgQVBSOjpTb2NrQWRkcjo6aXBfc2V0KCkgYW5kIEFQUjo6Tk9fVElNRU9VVCByZW1vdmVkLgpbR2VvZmZyZXkgWW91bmddCgpBcGFjaGU6Ok1QTS0+aXNfdGhyZWFkZWQoKSByZXBsYWNlcyBBcGFjaGU6Ok1QTV9JU19USFJFQURFRApbR2VvZmZyZXkgWW91bmddCgpmaXggIlBlcmxTZXRWYXIgRm9vIDAiIHNvIHRoYXQgJHItPmRpcl9jb25maWcoJ0ZvbycpIHJldHVybnMgMCwgbm90IHVuZGVmCltHZW9mZnJleSBZb3VuZ10KCmFkZCBBcGFjaGU6Ok1QTSBjbGFzcywgYWxvbmcgd2l0aCBzaG93KCkgYW5kIHF1ZXJ5KCkgY2xhc3MgbWV0aG9kcwpbR2VvZmZyZXkgWW91bmddCgphZGQgOm1wbXEgaW1wb3J0IHRhZyB0byBBcGFjaGU6OkNvbnN0IFtHZW9mZnJleSBZb3VuZ10KCkZpeCBNb2RQZXJsOjpSZWdpc3RyeSBoYW5kbGVycyBmYW1pbHkgdG8gbW9kaWZ5ICQwIG9ubHkgZm9yIHRoZQpkdXJhdGlvbiBvZiB0aGUgaGFuZGxlciwgYnkgbG9jYWxpemluZyBpdCBbU3Rhc10KCkZpeCA6QXBhY2hlIHBlcmxpbydzIFNURE9VVCB0byBiZSByZWVudHJhbnQgKyBtb2R1bGVzL2luY2x1ZGVfc3VicmVxCnRlc3QgW1N0YXNdCgpmaXggc2x1cnBfZmlsZW5hbWUgdG8gYWx3YXlzIG9wZW4gdGhlIGZpbGUgYW5kIG5vdCB0cnkgdG8gZ3Vlc3MKd2hldGhlciBmaWxlbmFtZSBoYXMgYmVlbiBhbHJlYWR5IG9wZW5lZCwgYXMgdGhlcmUgaXMgbm8gcmVsaWFibGUgd2F5CnRvIGFjY29tcGxpc2ggdGhhdCBbU3Rhc10KCkFwYWNoZS0+Y2FuX3N0YWNrX2hhbmRsZXJzIGlzIG5vdyBpbiBBcGFjaGU6OmNvbXBhdCAobXAyIGFsd2F5cyBjYW4Kc3RhY2sgaGFuZGxlcnMpIFtTdGFzXQoKYWRkIGFjY2VzcyB0byAkci0+ZmluZm8oKSBhbmQgcmVsYXRlZCBBUFI6OkZpbmZvIG1ldGhvZHMsCnN1Y2ggYXMgJHItPmZpbmZvLT5zaXplKCksICRyLT5maW5mby0+bXRpbWUoKSwgYW5kCiRyLT5maW5mby0+c3RhdCgpIFtHZW9mZnJleSBZb3VuZ10KCmFkZCA6ZmlsZXR5cGUgaW1wb3J0IHRhZyB0byBBUFI6OkNvbnN0IFtHZW9mZnJleSBZb3VuZ10KCjxQZXJsPiBzZWN0aW9ucyBub3cgcHJvcGVybHkgc2V0ICQwIHRvIHRoZSBuYW1lIG9mIHRoZSBjb25maWd1cmF0aW9uCmZpbGUgdGhleSBhcmUgaW4uIFtQaGlsaXBwZSBNLiBDaGlhc3Nvbl0KCkFwYWNoZTo6U3RhdHVzOiBwcm92aWRlIGEgd29ya2Fyb3VuZCBmb3IgQ29uZmlnOjpteWNvbmZpZygpIHdoaWNoCmZhaWxzIHVuZGVyIHRocmVhZHMgd2l0aCAoNS44LjAgPCBwZXJsIDwgNS44LjMpIFtFbGl6YWJldGggTWF0dGlqc2VuCjxsaXpAZGlqa21hdC5ubD5dCgpGaXggQXBhY2hlOjpTdGF0dXM6OmhhbmRsZXIgdG8gcmV0dXJuICdBcGFjaGU6Ok9LJyBbSnVhbm1hIEJhcnJhbnF1ZXJvCjxsZWt0dUB0ZXJyYS5lcz5dCgo8UGVybD4gc2VjdGlvbnMgbm93IHByb3Blcmx5IHNldCBmaWxlbmFtZSBhbmQgbGluZSBudW1iZXIgaW5mb3JtYXRpb24sCm1ha2luZyBlcnJvciBtZXNzYWdlcyByZXBvcnQgdGhlIGNvcnJlY3QgbG9jYXRpb24uIFtQaGlsaXBwZSBNLiBDaGlhc3Nvbl0KCgoKPWl0ZW0gMS45OV8xMSAtIE5vdmVtYmVyIDEwLCAyMDAzCgphZGQgYSBidWlsZC93aW4zMl9mZXRjaF9hcHhzIHNjcmlwdCAoY2FsbGVkIHdpdGhpbiB0aGUgdG9wLWxldmVsCk1ha2VmaWxlLlBMKSB0byBvZmZlciB0byBmZXRjaCBhbmQgaW5zdGFsbCBhIFdpbjMyIGRldmVsb3BtZW50CnZlcnNpb24gb2YgYXB4cyBhbmQgKGFwcnxhcHUpLWNvbmZpZyBbUmFuZHkgS29iZXNdCgpyZXdyaXRlICRyLT5yZWFkKCkgYW5kIHBlcmxpbyByZWFkIGZ1bmN0aW9ucyB0byB1c2UgdGhlIHNhbWUgZnVuY3Rpb24sCndoaWNoIGNvbXBsZXRlbHkgc2F0aXNmaWVzIHRoZSByZWFkIHJlcXVlc3QgaWYgcG9zc2libGUsIG9uIHRoZSB3YXkKZ2V0dGluZyByaWQgb2YgZ2V0X2NsaWVudF9ibG9jayBhbmQgaXRzIHN1cHBvcnRpbmcgZnVuY3Rpb25zIHdoaWNoCmhhdmUgcHJvYmxlbXMgYW5kIHdpbGwgbW9zdCBsaWtlbHkgd2lsbCBiZSByZW1vdmVkIGZyb20gdGhlIGh0dHBkLUFQSQppbiB0aGUgZnV0dXJlLiBEaXJlY3RseSBtYW5pcHVsYXRlIGJ1Y2tldCBicmlnYWRlcyBpbnN0ZWFkLiBbU3Rhc10KClNpbmNlIEFwYWNoZTIucG0gcG9wcyAvZm9vL0FwYWNoZTIgZGlycyB0byB0aGUgdG9wIG9mIEBJTkMsIGl0IG5vdwphbHNvIHRha2VzIGNhcmUgb2Yga2VlcGluZyBsaWIgYW5kIGJsaWIgZGlycyBiZWZvcmUgdGhlIHN5c3RlbSBkaXJzLApzbyB0aGF0IHByZXZpb3VzbHkgaW5zdGFsbGVkIGxpYnJhcmllcyB3b24ndCBnZXQgbG9hZGVkIGluc3RlYWQgb2YgdGhlCmN1cnJlbnRseSB1bmluc3RhbGxlZCBsaWJyYXJpZXMgdGhhdCBhcmUgdW5kZXIgdGVzdC4gW1N0YXNdCgpXaGVuICdtYWtlIHRlc3QnIGZhaWxzIHdlIG5vdyBwcmludCB0aGUgaW5mbyBvbiB3aGF0IHRvIGRvIG5leHQgW1N0YXNdCgpBdCB0aGUgZW5kIG9mICdtYWtlIGluc3RhbGwnIHdlIG5vdyBwcmludCB0aGUgaW5mbyBob3cgdG8gcHJvY2VlZCB3aXRoCm1vZF9wZXJsIGFuZCB3aGF0IHRvIGRvIGluIHRoZSBjYXNlIG9mIHBvc3QtaW5zdGFsbCBwcm9ibGVtcyAKW0dlb2ZmcmV5IFlvdW5nXQoKQWRqdXN0IHRoZSBzb3VyY2UgdG8gcHJvcGVybHkgd29yayB3aXRoIDUuOC4yJ3MgbmV3IGFsZ29yaXRobSBvZgpkeW5hbWljIHJlLWhhc2hpbmcgb2YgaGFzaGVzIG9uIGhhc2ggY29sbGlzaW9uIGF0dGFjay4gW05pY2hvbGFzIENsYXJrCjxuaWNrQGNjbDQub3JnPiwgU3Rhc10uIEFkZCBhIHRlc3QgdGhhdCBtb3VudHMgc3VjaCBhbiBhdHRhY2sgc28gd2UKY2FuIHZlcmlmeSB0aGF0IHdlIGNhbiBzdXJ2aXZlIHRoaXMgcmVoYXNoaW5nLiBbU2NvdHQgQSBDcm9zYnkKPHNjcm9zYnlAY3MucmljZS5lZHU+LCBOaWNob2xhcyBDbGFyayA8bmlja0BjY2w0Lm9yZz4sIFRlbHMKPHBlcmxfZHVtbXlAYmxvb2RnYXRlLmNvbT4sIE1hcmsgSmFzb24gRG9taW51cyA8bWpkQHBsb3Zlci5jb20+LCBTdGFzXQoKU3RhbmRhcmRpemUgdGhlIEFwYWNoZTo6UGVybFNlY3Rpb25zIHBhY2thZ2UgbmFtZSB0byBpdCdzIHBsdXJhbCBmb3JtIGZvcgpjbGFyaXR5IGFuZCBzbyB0aGF0IHRoZSBwb2QgZ2V0cyBnbHVlZCBpbiBpdCdzIHByb3BlciBwbGFjZS4KW1BoaWxpcHBlIE0uIENoaWFzc29uIDxnb3plckBjcGFuLm9yZz5dCgpyZXR1cm4gdmFsdWUgZnJvbSBQZXJsIGNhbGxiYWNrcyBhcmUgbm93IHBhc3NlZCBkaXJlY3RseSB0byBBcGFjaGUKd2l0aG91dCBhZGRpdGlvbmFsIHBvc3QtY2FsbCBtYW5pcHVsYXRpb25zIChzdWNoIGFzIGFzc3VtaW5nIEhUVFBfT0sKc2hvdWxkIHJlYWxseSBiZSBPSykuICBbR2VvZmZyZXkgWW91bmddCgpwZXJsIDUuOC4xIHcvIGl0aHJlYWRzIGhhcyBhIGJ1ZyB3aGVyZSBpdCByZXBvcnRzIHRoZSB3cm9uZyBwYXJlbnQgcGlkCihhcyBpZiB0aGUgcHJvY2VzcyB3YXMgbmV2ZXIgZm9ya2VkKSwgcHJvdmlkZSBhIGxvY2FsIHdvcmthcm91bmQgKCsgbmV3CnRlc3QpLiBbUmFmYWVsIEdhcmNpYS1TdWFyZXogPHJnYXJjaWFzdWFyZXpAZnJlZS5mcj5dCgpvdmVycmlkZGVuIFNURCogc3RyZWFtcyBub3cgY2FuIGJlIGZ1cnRoZXIgb3ZlcnJpZGRlbiBhbmQgd2lsbCBiZQpwcm9wZXJseSByZXN0b3JlZCwgd2hpY2ggYWxsb3dzIGZ1bmN0aW9ucyBsaWtlICRyLT5pbnRlcm5hbF9yZWRpcmVjdAp3b3JrICgrYWRkIHRlc3RzKSBbU3Rhc10KCmltcGxlbWVudCBwZXJsaW8ncyBnZXRhcmcgaG9vaywgd2hpY2ggbm93IGFsbG93cyBkdXBpbmcgU1REKiBzdHJlYW1zCm92ZXJsb2FkZWQgYnkgbW9kcGVybCBbU3Rhc10KCkFkZCBQZXJsTWFwVG9TdG9yYWdlSGFuZGxlciBbR2VvZmZyZXkgWW91bmddCgpjYWxsYmFja3MgYXJlIG5vdyBleHBlY3RlZCB0byByZXR1cm4gYSBtZWFuaW5nZnVsIHZhbHVlIAooT0ssIFNFUlZFUl9FUlJPUiwgZXRjKSBvciByZXR1cm4gdmlhIGFuIG9mZmljaWFsIEFQSSAKKGV4aXQsIGRpZSwgZXRjKS4gIHJlbHlpbmcgb24gaW1wbGljaXQgcmV0dXJucyBmcm9tIHRoZSAKbGFzdCBjYWxsIGV2YWx1YXRlZCBieSBhIHN1YnJvdXRpbmUgbWF5IHJlc3VsdCBpbiBzZXJ2ZXIgCmVycm9ycy4gIFtTdGFzLCBHZW9mZnJleSBZb3VuZ10KCmluIHRoZSBNUF9NQUlOVEFJTkVSIG1vZGUgYWRkIHRoZSAtV2Vycm9yIGNvbXBpbGF0aW9uIGZsYWcgd2hlbiBwZXJsCnY1LjYuMiBvciBoaWdoZXIgaXMgdXNlZCwgc28gdGhhdCB3ZSBkb24ndCBtaXNzIGNvbXBpbGF0aW9uCndhcm5pbmdzLiBbU3Rhc10KCmZpeCB0aGUgTWFrZWZpbGUuUEwgb3B0aW9uIHBhcnNlciB0byBzdXBwb3J0IG92ZXJyaWRpbmcgb2YgY2VydGFpbgpidWlsZCBvcHRpb25zLCBpbiBhZGRpdGlvbiB0byBhcHBlbmRpbmcgdG8gdGhlbSAoLmUuZy4gbm93IE1QX0xJQk5BTUUKaXMgb3ZlcnJpZGFibGUpIFtBbmRyZXcgV3lsbGllIDx3eWxsaWVAZGlsZXgubmV0Pl0KCm1ha2Ugc3VyZSB0aGF0IGNvbm5lY3Rpb24gZmlsdGVycyB3b24ndCBiZSBpbnNlcnRlZCBhcyByZXF1ZXN0IGZpbHRlcnMKW1N0YXNdCgpQcmV2ZW50IHRoZSAnVXNlIG9mIHVuaW5pdGlhbGl6ZWQgdmFsdWUuJyB3YXJuaW5nIHdoZW4KTW9kUGVybDo6VXRpbDo6ZXhpdCBpcyB1c2VkLiBbU3Rhc10KClRvIG1ha2UgdGhlIHRlc3Qtc3VpdGUgc2FuZGJveC1mcmllbmRseSwgd2hpY2ggYnJlYWsgd2hlbiB0aGluZ3MgdHJ5IHRvCnJ1biBvZmYgL3RtcCwgdXNlIHQvbG9ncyBhcyB0aGUgbG9jYXRpb24gb2YgdGhlIG1vZF9jZ2lkIHNvY2tldCBhbmQKVE1QRElSIGVudiB2YXIgW0hhcm9vbiBSYWZpcXVlIDxoYXJvb24ucmFmaXF1ZUB1dG9yb250by5jYT5dCgoKCj1pdGVtIDEuOTlfMTAgLSBTZXB0ZW1iZXIgMjksIDIwMDMKCmFkZGVkIEFwYWNoZTo6Q1JMRiwgQXBhY2hlOjpDUiwgYW5kIEFwYWNoZTo6TEYgdG8KQXBhY2hlOjpDb25zdCdzIDpwbGF0Zm9ybSBncm91cCAgW0dlb2ZmcmV5IFlvdW5nXQoKbWFrZSBzdXJlIHRoYXQgdGhlIGN1c3RvbSBwb29scyBhcmUgZGVzdHJveWVkIG9ubHkgb25jZSBhbmQgb25seSB3aGVuCmFsbCByZWZlcmVuY2VzIHdlbnQgb3V0IG9mIHNjb3BlIFtTdGFzXQoKKCRyfCRjKS0+YWRkXyhpbnB1dHxvdXRwdXQpX2ZpbHRlcihcJmhhbmRsZXIpIG5vdyB2ZXJpZnkgdGhhdCB0aGUKZmlsdGVyIG9mIHRoZSByaWdodCBraW5kIGlzIHBhc3NlZCBhbmQgd2lsbCByZWZ1c2UgdG8gYWRkIGEgcmVxdWVzdApmaWx0ZXIgYXMgYSBjb25uZWN0aW9uIGZpbHRlciBhbmQgdmljZSB2ZXJzYS4gVGhlIHJlcXVlc3QgZmlsdGVyCmhhbmRsZXIgaXMgbm90IHJlcXVpcmVkIHRvIGhhdmUgdGhlIEZpbHRlclJlcXVlc3RIYW5kbGVyIGF0dHJpYnV0ZSBhcwpsb25nIGFzIGl0IGRvZXNuJ3QgaGF2ZSBhbnkgb3RoZXIgYXR0cmlidXRlcy4gVGhlIGNvbm5lY3Rpb24gZmlsdGVyCmhhbmRsZXIgaXMgcmVxdWlyZWQgdG8gaGF2ZSB0aGUgRmlsdGVyQ29ubmVjdGlvbkhhbmRsZXIKYXR0cmlidXRlLiBbU3Rhc10KCmZpeCB0cmFjaW5nIHdpdGggKFBlcmxUcmFjZS9NT0RfUEVSTF9UUkFDRSkgb24gd2luMzIgKHRoZSBlcnJvcl9sb2cKZmlsZWhhbmRsZSB3YXMgaW52YWxpZCBhZnRlciB0aGUgb3Blbl9sb2dzIHBoYXNlKSBbU3Rhc10KCmZpeCBhIGJ1ZyB3aGVyZSAlRU5WIHZhcnMgc2V0IHZpYSBzdWJwcm9jZXNzX2VudiBwZXJzaXN0IGFjcm9zcwpyZXF1ZXN0cy4gIChlLmcuIGEgQ29va2llIGluY29taW5nIGhlYWRlciB3aGljaCBlbmRzIHVwIGluCiRFTlZ7SFRUUF9DT09LSUV9IHdvdWxkIHBlcnNpc3QgdG8gdGhlIG5leHQgcmVxdWVzdCB3aGljaCBoYXMgbm8KQ29va2llIGhlYWRlciBhdCBhbGwpLiBOb3cgd2UgdW5zZXQgYWxsIHRoZSAlRU5WIHZhcnMgc2V0IGZyb20Kc3VicHJvY2Vzc19lbnYuIEltcHJvdmUgYW5kIGV4dGVuZCB0aGUgdGVzdHMgdG8gY292ZXIgdGhpcyBidWcuIFtTdGFzXQoKaXQgaXMgaW52YWxpZCB0byByZXR1cm4gSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1Igb3IgYW55IG90aGVyIEhUVFAKcmVzcG9uc2UgY29kZSBmcm9tIG1vZHBlcmxfd2J1Y2tldF9wYXNzLCB0aGVyZWZvcmUgc2V0IHRoZSBlcnJvciBjb2RlCmludG8gci0+c3RhdHVzIGFuZCByZXR1cm4gQVBSX1NVQ0NFU1MuIFVudGlsIG5vdyByZXNwb25zZSBoYW5kbGVyCndpdGggbWVzc2VkIHVwIHJlc3BvbnNlIGhlYWRlcnMsIHdlcmUgY2F1c2luZyBubyByZXNwb25zZSB3aGF0IHNvIGV2ZXIKdG8gdGhlIGNsaWVudC4gIExXUCB3YXMgYXNzdW1pbmcgNTAwLCBhbmQgaXQgd2FzIGFsbCBmaW5lLCB0ZXN0aW5nCndpdGhvdXQgTFdQIGhhcyBpbW1lZGlhdGVseSByZXZlYWxlZCB0aGF0IHRoZXJlIHdhcyBhIHByb2JsZW0gaW4gdGhlCmhhbmRsaW5nIG9mIHRoaXMgY2FzZS4gW1N0YXNdCgpwdXQgdGhlIGVuZCB0byB0aGUgJ05vdCBhIENPREUgcmVmZXJlbmNlJyBlcnJvcnMsIGluc3RlYWQgcHJvdmlkZSBhbgppbnRlbGxpZ2VudCBlcnJvciBtZXNzYWdlLCBob3BlZnVsbHkgdGVsbGluZyB3aGljaCBmdW5jdGlvbiBjYW4ndCBiZQpmb3VuZC4gIGF0IHRoZSBzYW1lIHRpbWUgaW1wcm92ZSB0aGUgdHJhY2luZyB0byBpbmNsdWRlIHRoZSBwaWQvdGlkIG9mCnRoZSBzZXJ2ZXIgdGhhdCBoYXMgZW5jb3VudGVyZWQgdGhpcyBwcm9ibGVtLCB0byBtYWtlIGl0IGVhc2llciB0bwpkZWJ1Zy4gW1N0YXNdCgptb2RfcGVybCBoYW5kbGVyIG11c3QgYmUgZHVwZWQgZm9yIGFueSBtcG0gd2hpY2ggcnVucyB3aXRoaW4KVVNFX0lUSFJFQUQuICBVbnRpbCBub3cgdGhlcmUgd2FzIGEgYmlnIHByb2JsZW0gd2l0aCBwcmVmb3JrIG1wbSBpZgphbnkgb2YgaXRzIHZob3N0cyB3YXMgdXNpbmcgUGVybE9wdGlvbnMgKyhQYXJlbnR8Q2xvbmUpIGFuZCBoYXBwZW5lZAp0byBsb2FkIGhhbmRsZXJzIGJlZm9yZSB0aGUgbWFpbiBzZXJ2ZXIuIFdoZW4gdGhhdCB3YXMgaGFwcGVuaW5nIHRoZQptYWluIHNlcnZlciB3aWxsIHNlZSB0aGF0IHRoZSBoYW5kbGVyIHdhcyByZXNvbHZlZCAoc2luY2UgaXQgc2VlcyB0aGUKaGFuZGxlciBzdHJ1Y3QgZnJvbSB0aGUgdmhvc3QgdGhhdCBsb2FkZWQgdGhpcyBtb2R1bGUsIGluc3RlYWQgb2YgaXRzCm93biksIHdoaWNoIGluIGZhY3QgaXQgd2Fzbid0LCBjYXVzaW5nIHRoZSBmYWlsdXJlIHRvIHJ1biB0aGUgaGFuZGxlcgp3aXRoIHRoZSBpbmZhbW91cyAnTm90IGEgQ09ERSByZWZlcmVuY2UnIGVycm9yLiBbU3Rhc10KCk1ha2Ugc3VyZSB0aGF0IHRoZSBzdGF0aWMgbW9kX3BlcmwgbGlicmFyeSBpcyBidWlsdCBhZnRlciB0aGUgZHluYW1pYwooYSByZXF1aXJlbWVudCBvbiB3aW4zMikgW1N0ZXZlIEhheSA8c3RldmUuaGF5QHVrLnJhZGFuLmNvbT5dCgpBcGFjaGU6OlN0YXR1cyBub3cgZ2VuZXJhdGVzIEhUTUwgNC4wMSBTdHJpY3QgKGFuZCBpbiBtYW55IGNhc2VzLCBhbHNvCklTTy1IVE1MKSBjb21wbGlhbnQgb3V0cHV0LiBBbHNvIGFkZCBhIHNpbXBsZSBDU1MgdG8gbWFrZSB0aGUgcmVwb3J0cwpsb29rIG5pY2VyLiBbVmlsbGUgU2t5dHTkIDx2aWxsZS5za3l0dGFAaWtpLmZpPl0KCkFQUjo6UG9vbDo6REVTVFJPWSBpbXBsZW1lbnRlZCBhbmQgdHdlYWtlZCB0byBvbmx5CmRlc3Ryb3kgcG9vbHMgY3JlYXRlZCB2aWEgQVBSOjpQb29sLT5uZXcoKSBbR2VvZmZyZXkgWW91bmddCgokci0+c2x1cnBfZmlsZW5hbWUgaXMgbm93IGltcGxlbWVudGVkIGluIEMuIFtTdGFzXQoKcmVtb3ZlIHN1cHBvcnQgZm9yIGh0dHBkIDIuMC40NS9hcHIgMC45LjMgYW5kIGxvd2VyLgpodHRwZCAyLjAuNDYgaXMgbm93IHRoZSBtaW5pbXVtIHN1cHBvcnRlZCB2ZXJzaW9uLgpbR2VvZmZyZXkgWW91bmddCgpBUFI6OlBlcmxJTyBub3cgYWNjZXB0cyB0aGUgcG9vbCBvYmplY3QgaW5zdGVhZCBvZiBhIHJlcXVlc3Qvc2VydmVyCm9iamVjdHMsIHNvIGl0IGNhbiBiZSB1c2VkIGFueXdoZXJlLCBpbmNsdWRpbmcgb3V0c2lkZSBtb2RfcGVybCBbU3Rhc10KCndoZW4gcGVybCBpcyBidWlsdCB3aXRoIHBlcmxpbyBlbmFibGVkICg1LjgrKSB0aGUgbmV3IFBlcmxJTyBBcGFjaGUKbGF5ZXIgaXMgdXNlZCwgc28gbm93IG9uZSBjYW4gcHVzaCBsYXllcnMgb250byBTVERJTiwgU1RET1VUIGhhbmRsZXMKZS5nLiBiaW5tb2RlKFNURE9VVCwgJzp1dGY4Jyk7IFtTdGFzXQoKYWRkIGFwX3RhYmxlX2NvbXByZXNzKCkgdG8gQVBSOjpUYWJsZSBbR2VvZmZyZXkgWW91bmddCgphbHRlciBzdGFja2VkIGhhbmRsZXIgaW50ZXJmYWNlIHNvIHRoYXQgbW9kX3BlcmwgZm9sbG93cyBBcGFjaGUgCmFzIGNsb3NlbHkgYXMgcG9zc2libGUgd2l0aCByZXNwZWN0IHRvIFZPSUQvUlVOX0ZJUlNUL1JVTl9BTEwKaGFuZGxlciB0eXBlcy4gIG5vdywgZm9yIHBoYXNlcyB3aGVyZSBPSyBlbmRzIHRoZSBBcGFjaGUKY2FsbCBsaXN0IChSVU5fRklSU1QgaGFuZGxlcnMsIHN1Y2ggYXMgdGhlIFBlcmxUcmFuc0hhbmRsZXIpLCAKbW9kX3BlcmwgZm9sbG93cyBzdWl0IGFuZCBsZWF2ZXMgc29tZSBoYW5kbGVycyB1bmNhbGxlZC4KW0dlb2ZmcmV5IFlvdW5nXQoKQXBhY2hlOjpCdWlsZCBub3cgdHJpZXMgdG8gdXNlIHRoZSBuZXcgQVBSX0JJTkRJUiBxdWVyeSBzdHJpbmcgdG8gZmluZAp0aGUgbG9jYXRpb24gb2YgYXByLWNvbmZpZy4gW1N0YXNdCgpuZXcgcGFja2FnZSBBcGFjaGU6OnBvcnRpbmcgdG8gbWFrZSBpdCBlYXNpZXIgdG8gcG9ydCBtcDEgY29kZSB0byBtcDIKW1N0YXNdCgpuZXcgQXBhY2hlOjpCdWlsZCBtZXRob2RzOiBtcG1fbmFtZSgpLCBtcG1faXNfdGhyZWFkZWQoKS4gdXNlIHRoZW0gaW4KdGhlIHRvcC1sZXZlbCBNYWtlZmlsZS5QTCB0byByZXF1aXJlIDUuOC4wL2l0aHJlYWRzIGlmIG1wbSByZXF1aXJlcwp0aHJlYWRzLiBbU3Rhc10KCmFkZCB0aGUgbWlzc2luZyBYUyBtZXRob2RzIHRvIE1vZFBlcmw6Ok1ldGhvZExvb2t1cCwgYWRkIHN1cHBvcnQgZm9yCm1wMSBtZXRob2RzIHRoYXQgYXJlIG5vIGxvbmdlciBpbiB0aGUgbW9kX3BlcmwgMi4wIEFQSS4gW1N0YXNdCgptb2RfcGVybCBub3cgcmVmdXNlcyB0byBidWlsZCBhZ2FpbnN0IHRocmVhZGVkIG1wbXMgKG5vbi1wcmVmb3JrKQp1bmxlc3MgcGVybCA1LjgrIHcvaXRocmVhZHMgaXMgdXNlZCBbU3Rhc10KCmRvbid0IHRyeSB0byByZWFkIFBFUkxfSEFTSF9TRUVEIGVudiB2YXIsIHdoZXJlIGFwcl9lbnZfZ2V0IGlzIG5vdAphdmFpbGFibGUgKGFwciA8IDAuOS4zKSBbU3Rhc10KCkFQUi5zbyBub3cgY2FuIGJlIGxvYWRlZCBhbmQgdXNlZCBvdXRzaWRlIG1vZF9wZXJsIChhbGwgdGhlIHdheSBiYWNrCnRvIGh0dHBkIDIuMC4zNikgW1N0YXNdCgpwZXJsIDUuOC4xIHJhbmRvbWl6ZXMgdGhlIGhhc2ggc2VlZCwgYmVjYXVzZSB3ZSBwcmVjYWxjdWxhdGUgdGhlIGhhc2gKdmFsdWVzIG9mIG1ndiBlbGVtZW50cyB0aGUgaGFzaCBzZWVkIGhhcyB0byBiZSB0aGUgc2FtZSBhY3Jvc3MgYWxsCnBlcmwgaW50ZXJwcmV0ZXJzLiBTbyBtb2RfcGVybCBub3cgaW50ZXJjZXB0cyBjYXNlcyB3aGVyZSBwZXJsIHdvdWxkCmhhdmUgcmFuZG9taXplIGl0LCBkbyB0aGUgc2VlZCByYW5kb21pemF0aW9uIGJ5IGl0c2VsZiBhbmQgdGVsbCBwZXJsCnRvIHVzZSB0aGF0IHZhbHVlLiBbU3Rhc10KCmZpeCBBUFI6OlBlcmxJTyBsYXllciB0byBwb3AgaXRzZWxmIGlmIG9wZW4oKSBoYXMgZmFpbGVkLiBbU3Rhc10KCm1vdmUgdGhlIGRlZmluaXRpb24gb2YgREVGSU5FPSctRE1QX0hBVkVfQVBSX0xJQlMnIHRvIHRoZSB0b3AgbGV2ZWwKTWFrZWZpbGUuUEwsIHNpbmNlIGl0IG92ZXJyaWRlcyBNWTo6cGFzdGhydSB0YXJnZXQgd2hpY2ggbWFrZXMgaXQKaW1wb3NzaWJsZSB0byBkZWZpbmUgbG9jYWwgREVGSU5FIGluIHN1YmRpcnMuIFtTdGFzXQoKbWFrZSBBUFIgcGVybCBmdW5jdGlvbnMgd29yayBvdXRzaWRlIG1vZF9wZXJsOiBzZXZlcmFsIGxpYnJhcmllcwp3ZXJlbid0IGxpbmtlZC4gQWxzbyBMSUJTIG5lZWRzIHRvIHJlY2VpdmUgYWxsIGxpYnMgaW4gb25lCnN0cmluZy4gW1N0YXNdCgpBcGFjaGU6OmNvbXBhdDogJHItPmNnaV9lbnYsICRyLT5jZ2lfdmFyIGFyZSBub3cgYWxpYXNlcyB0bwokci0+c3VicHJvY2Vzc19lbnYgW1N0YXNdCgpGb3IgV2luMzIsIGdlbmVyYXRlIC5wZGIgZmlsZXMgZm9yIGRlYnVnZ2luZyB3aGVuIGJ1aWx0IHdpdGgKTVBfREVCVUcuIFRoZXNlIHdpbGwgZ2V0IGluc3RhbGxlZCBpbnRvIHRoZSBzYW1lIGRpcmVjdG9yeSBhcwp0aGUgYXNzb2NpYXRlZCBkbGwvc28gbGlicy4gQXMgd2VsbCwgaW5zdGFsbCBtb2RfcGVybC5saWIKaW50byBNUF9BUF9QUkVGSVgvbGliLyBmb3IgdXNlIGJ5IDNyZCBwYXJ0eSBtb2R1bGVzIFtSYW5keSBLb2Jlc10uCgpBcGFjaGUyLnBtIGlzIG5vdyBhdXRvZ2VuZXJhdGVkIGFuZCB3aWxsIGFkanVzdCBASU5DIHRvIGluY2x1ZGUKQXBhY2hlMi8gc3ViZGlycyBvbmx5IGlmIGJ1aWx0IHdpdGggTVBfSU5TVF9BUEFDSEUyPTEgW1N0YXNdCgpDaGFuZ2UgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBhcmd1bWVudCAncmVhZGJ5dGVzJyBmb3IKYXBfZ2V0X2JyaWdhZGUoKSwgZnJvbSAwIHRvIDgxOTIuIG90aGVyIHRoYW4gYmVpbmcgdXNlbGVzcywgMCBhbHdheXMKdHJpZ2dlcnMgYW4gYXNzZXJ0IGluIGh0dHBkIGludGVybmFsIGZpbHRlcnMgYW5kIDgxOTIgaXMgYSBnb29kCmRlZmF1bHQuIFtTdGFzXQoKRml4IER5bmFMb2FkZXIgYnJlYWthZ2Ugd2hlbiB1c2luZyBETF9HTE9CQUwgb24gT3BlbkJTRApbUGhpbGlwcGUgTS4gQ2hpYXNzb24gPGdvemVyQGNwYW4ub3JnPl0KCnJlbmFtZWQgdGhlIHByaXZhdGUgbW9kcGVybF9tb2R1bGVfY29uZmlnX2dldF9vYmogZnVuY3Rpb24gdG8gCm1vZHBlcmxfbW9kdWxlX2NvbmZpZ19jcmVhdGVfb2JqLCBzaW5jZSB0aGUgbG9naWMgY3JlYXRlcyAKdGhlIG9iamVjdCBidXQgZG9lc24ndCBkaWcgaXQgb3V0IGlmIGl0IGFscmVhZHkgZXhpc3RzLiAgdGhlbiwKbW92ZWQgbG9naWMgZnJvbSBtcHhzX0FwYWNoZV9fTW9kdWxlX2dldF9jb25maWcgaW50byBhIG5ldyBwdWJsaWMKQyBmdW5jdGlvbiB0aGF0IHJldXNlZCB0aGUgb2xkIG5hbWUsIG1vZHBlcmxfbW9kdWxlX2NvbmZpZ19nZXRfb2JqLgp3aGlsZSBBcGFjaGU6Ok1vZHVsZS0+Z2V0X2NvbmZpZyBleGlzdHMgYXMgYSB3cmFwcGVyIHRvIHJldHVybiB0aGUKb2JqZWN0IHRvIFBlcmwgc3BhY2UsIG5vdyBDL1hTIGZvbGtzIGNhbiBhbHNvIGFjY2VzcyB0aGUgb2JqZWN0CmRpcmVjdGx5IHdpdGggdGhlIHB1YmxpYyBmdW5jdGlvbi4KW0dlb2ZmcmV5IFlvdW5nXQoKQXBhY2hlOjpSZWxvYWQ6IGFkZCBhIG5ldyBjb25maWcgdmFyaWFibGU6ClJlbG9hZENvbnN0YW50UmVkZWZpbmVXYXJuaW5ncyB0byBvcHRpb25hbGx5IHNodXQgb2ZmIHRoZSBjb25zdGFudCBzdWIKcmVkZWZpbmUgd2FybmluZ3MgW1N0YXNdCgppbXBsZW1lbnQgJHBhcm1zLT5pbmZvLiAgZGlyZWN0aXZlIGhhbmRsZXJzIHNob3VsZCBub3cgYmUgY29tcGxldGUuCltHZW9mZnJleSBZb3VuZ10KCk1QX0dUT1Agbm93IHdvcmtzIHdpdGggbW9kZXJuIEdDQwpbUGhpbGlwcGUgTS4gQ2hpYXNzb24gPGdvemVyQGNwYW4ub3JnXQoKYWRkIG1pc3NpbmcgZGVwZW5kZW5jaWVzIHRvIEFwYWNoZTo6UGVybFNlY3Rpb25zCltHZW9mZnJleSBZb3VuZ10KCiRyLT5nZXRfY2xpZW50X2Jsb2NrIGlzIGJvZ3VzIGluIGh0dHBkLTIuMC40NSAoYW5kIGVhbGllciksIGFzIGl0CmNhbid0IGhhbmRsZSBFT1MgYnVja2V0cyBhcnJpdmluZyBpbiB0aGUgc2FtZSBidWNrZXQgYnJpZ2FkZSB3aXRoCmRhdGEuIHNvIHJld3JpdGUgTW9kUGVybDo6VGVzdDo6cmVhZF9wb3N0IHRvIHVzZSBhbiBleHBsaWNpdCByZWFkCnRocm91Z2ggYWxsIGJ1Y2tldCBicmlnYWRlcyB0aWxsIGl0IHNlZXMgZW9zIGFuZCB0aGVuIGl0IHN0b3BzLiBUaGUKY29kZSBpcyBsb25nZXIgYnV0IGl0IHdvcmtzIGNvcnJlY3RseS4gW1N0YXNdCgphbiBhdHRlbXB0IHRvIHJlc29sdmUgdGhlIGJpbmFyeSBjb21wYXRpYmlsaXR5IHByb2JsZW0gaW4KUGVybElPQVBSX3NlZWsgQVBJIHdoZW4gQVBSX0hBU19MQVJHRV9GSUxFUz0wIFtTdGFzXQoKcGVybCA1LjguMCBmb3JnZXRzIHRvIGV4cG9ydCBQZXJsSU9CYXNlX25vb3BfZmFpbCwgY2F1c2luZyBwcm9ibGVtcyBvbgp3aW4zMiBhbmQgYWl4LiByZWltcGxlbWVudCB0aGlzIGZ1bmN0aW9uIGxvY2FsbHkgdG8gc29sdmUgdGhlCnByb2JsZW0uIEFQUjo6UGVybElPIHNob3VsZCBub3cgYmUgdXNlZnVsIG9uIHdpbjMyIGFuZCBhaXggW1N0YXNdCgppbXBsZW1lbnQgREVDTElORV9DTUQgYW5kIERJUl9NQUdJQ19UWVBFIGNvbnN0YW50cwpbR2VvZmZyZXkgWW91bmddCgphbGxvdyBpbml0IGZpbHRlciBoYW5kbGVycyB0byBjYWxsIG90aGVyIG1ldGhvZHMgdGhhbiBqdXN0ICRmLT5jdHggW1N0YXNdCgpGaXggQXBhY2hlOjpSZWxvYWQgdG8gZ3JhY2VmdWxseSBoYW5kbGUgdGhlIGNhc2Ugd2l0aCBlbXB0eSBUb3VjaGZpbGVzCltEbWl0cmkgVGlraG9ub3YgPGRtaXRyaUBuZXRpbGxhLmNvbT5dCgpQZXJsUmVxdWlyZSBlbnRyaWVkIHNob3VsZCBiZSBleGVjdXRlZCBiZWZvcmUgUGVybE1vZHVsZSBlbnRyaWVzIGluClZpcnR1YWxIb3N0IGNvbnRhaW5lcnMsIGp1c3QgbGlrZSBpbiB0aGUgYmFzZSBzZXJ2ZXIgW1N0YXNdCgoKCj1pdGVtIDEuOTlfMDkgLSBBcHJpbCAyOCwgMjAwMwoKJGZpbHRlci0+c2Vlbl9lb3MoKSBub3cgYWNjZXB0cyAxLzAgdG8gc2V0L3Vuc2V0IHRoZSBmbGFnIHNvIHN0cmVhbWluZwpmaWx0ZXJzIGNhbiBjb250cm9sIHRoZSBzZW5kaW5nIG9mIEVPUy4gW1N0YXNdCgpzdXBwb3J0IHN5c3RlbXMgd2hlcmUgYXByIGhlYWRlciBmaWxlcyBhcmUgaW5zdGFsbGVkIHNlcGFyYXRlbHkgZnJvbQpodHRwZCBoZWFkZXIgZmlsZXMgWyJBbmRyZXMgU2Fsb21vbiIgPGRpbGluZ2VyQHZveGVsLm5ldD5dCgppbXBsZW1lbnQgaW5pdCBmaWx0ZXIgaGFuZGxlcnMgKyB0ZXN0cyBbU3Rhc10KCmltcHJvdmluZyBNb2RQZXJsOjpNZXRob2RMb29rdXAgdG86Ci0gaGFuZGxlIG1vcmUgYWxpYXNlZCBwZXJsIFhTIGZ1bmN0aW9ucwotIHNvcnQgdGhlIG1ldGhvZHMgbWFwIHN0cnVjdCBzbyBvbmUgY2FuIHVzZSB0aGUgYXV0b2dlbmVyYXRlZCBtYXAgYXMgaXMKLSBhZGQgbG9va3VwX21vZHVsZSwgdGVsbHMgd2hpY2ggbWV0aG9kcyBhcmUgZGVmaW5lZCBieSBhIGdpdmVuIG1vZHVsZQotIGFkZCBsb29rdXBfb2JqZWN0LCB0ZWxscyB3aGljaCBtZXRob2RzIGNhbiBiZSBjYWxsZWQgb24gYSBnaXZlbiBvYmplY3QKLSBwcm92aWRlIGF1dG9leHBvcnRlZCB3cmFwcGVycyBwcmludF9tZXRob2QsIHByaW50X21vZHVsZSBhbmQKICBwcmludF9vYmplY3QgZm9yIGVhc3kgZGVwbG95bWVudCBmcm9tIHRoZSBjb21tYW5kIGxpbmUKW1N0YXNdCgphZGQgUGVybCBnbHVlIGZvciBmdW5jdGlvbnM6IEFQUjo6U29ja2V0Ojp0aW1lb3V0X2dldApBUFI6OlNvY2tldDo6dGltZW91dF9zZXQgW1N0YXNdCgpzaW1pbGFyIHRvIFNldEVudiwgdXBjYXNlIHRoZSBlbnYga2V5cyBmb3IgUGFzc0VudiBvbiBwbGF0Zm9ybXMgd2l0aApjYXNlbGVzcyBlbnYgKGUuZy4gd2luMzIpIFtzdGV2ZS5zcGFybGluZ0Bwcy5nZS5jb21dCgpBZGQgYSBiYWNrY29tcGF0IHdyYXBwZXIgZm9yICRyLT5ub3RlcyAobXAyIHN1cHBvcnRzIG9ubHkgdGhlCkFQUjo6VGFibGUgQVBJKSBbU3Rhc10KCkFkZCBhIHNjcmlwdCBtcDJidWcgYW5kIGEgdGFyZ2V0ICdtYWtlIGJ1Z3JlcG9ydCcsIHNvIHBlb3BsZSBjYW4gdXNlCmJ1Z3JlcG9ydGluZyBkdXJpbmcgdGhlIGJ1aWxkIGFuZCBhZnRlciBtb2RwZXJsIGlzIGluc3RhbGxlZC4gW1N0YXNdCgpBZGQgYSBzY3JpcHQgbXAyZG9jIGFzIGEgcmVwbGFjZW1lbnQgZm9yIHBlcmxkb2MgKGR1ZSB0byAyLjAgbW9kdWxlcwpsaXZpbmcgdW5kZXIgQXBhY2hlMiwgd2hpY2ggd29uJ3QgYmUgbG9va2VkIGF0IGJ5IHBlcmxkb2MpLiBbU3Rhc10KCkFkZCBhIGNvbnN0YW50IEFQUjo6UGVybElPOjpQRVJMSU9fTEFZRVJTX0FSRV9FTkFCTEVEIGFuZCB1c2UgaXQgaW4KdGVzdHMgW1N0YXNdCgpSZXF1aXJlIHBlcmwgNS44IG9yIGhpZ2hlciB3aGVuIGJ1aWxkaW5nIG1vZF9wZXJsIG9uIE9TZXMgcmVxdWlyaW5nCml0aHJlYWRzIChlLmcuLCB3aW4zMiksIHNpbmNlIDUuNi54IGl0aHJlYWRzIGFyZW4ndCBnb29kLiBbU3Rhc10KCk1QX0NPTVBBVF8xWD0wIG5vdyBjYW4gYmUgcGFzc2VkIHRvIE1ha2VmaWxlLlBMIHRvIGRpc2FibGUKbXAxLWJhY2stY29tcGF0IGNvbXBpbGUtdGltZSBmZWF0dXJlcyArIGFkanVzdCB0ZXN0cy4gW1N0YXNdCgo8U0VSVkVSX1JPT1Q+IGFuZCA8U0VSVkVSX1JPT1Q+L2xpYi9wZXJsIGFyZSBub3cgYWRkZWQgdG8gQElOQywganVzdApsaWtlIG1vZF9wZXJsIDEuMCB3aXRoIE1QX0NPTVBBVF8xWD0xIChjdXJyZW50bHkgZW5hYmxlZCBieQpkZWZhdWx0KS4gW1N0YXNdCgpUaGUgUGVybC01LjguMCBjcnlwdCgpIHdvcmthcm91bmQgaXMgbm93IHVzZWQgb25seSBpZiA1LjguMCBpcyB1c2VkLApzaW5jZSA1LjguMS10b2JlLzUuOS4wLXRvYmUoYmxlYWQtcGVybCkgd29uJ3QgY29tcGlsZSB3aXRoCml0LiBbR2VvZmZyZXkgWW91bmddCgpuZXcgZGlyZWN0aXZlcyBQZXJsU2V0SW5wdXRGaWx0ZXIgYW5kIFBlcmxTZXRPdXRwdXRGaWx0ZXIsIHdoaWNoIGFyZQp0aGUgc2FtZSBhcyBTZXRJbnB1dEZpbHRlciBhbmQgU2V0T3V0cHV0RmlsdGVyIHJlc3BlY3RpdmVseSwgYnV0IGFsbG93CnRvIGluc2VydCBub24tbW9kX3BlcmwgZmlsdGVycyBiZWZvcmUsIGJldHdlZW4gb3IgYWZ0ZXIgbW9kX3BlcmwKZmlsdGVycy4gKyB0ZXN0cyBbU3Rhc10KCmltcHJvdmVkIGZpbHRlcnMgZGVidWcgdHJhY2luZyBbU3Rhc10KCmltcGxlbWVudCAkZmlsdGVyLT5yZW1vdmUgKGZpbHRlciBzZWxmLXJlbW92YWwpICsgdGVzdHMgW1N0YXNdCgpyZW1vdmUgdGhlIHNlY29uZC1ndWVzc2luZyBjb2RlIHRoYXQgd2FzIHRyeWluZyB0byBndWVzcyB0aGUgcGFja2FnZQpuYW1lIHRvIGxvYWQgZnJvbSB0aGUgaGFuZGxlciBjb25maWd1cmF0aW9uIChieSBzdHJpcHBpbmcgOjpzdHJpbmcgYW5kCnRyeWluZyB0byBsb2FkIHRoZSBwYWNrYWdlKS4gZmFsbCBiYWNrIHRvIHVzaW5nIGV4cGxpY2l0IFBlcmxNb2R1bGUgdG8KbG9hZCBtb2R1bGVzIHdob3NlIGhhbmRsZXIgc3ViIG5hbWUgaXMgbm90IGNhbGxlZCAnaGFuZGxlcicgKyBhZGp1c3QKdGVzdHMuIFtTdGFzXQoKc2V0IHRoZSBtYWdpYyB0YWludCBmbGFncyBiZWZvcmUgbW9kdWxlcyBhcmUgcmVxdWlyZWQgW1N0YXNdCgptYWtlIHN1cmUgdG8gc2V0IGJhc2Ugc2VydmVyJ3MgbWlwIGJlZm9yZSBhbnkgb2YgdGhlClBlcmxSZXF1aXJlL1BlcmxNb2R1bGUgZGlyZWN0aXZlcyBhcmUgY2FsbGVkLCBzaW5jZSB0aGV5IG1heSBhZGQKYWRkX2NvbmZpZygpLCB3aGljaCBpbiB0dXJuIHJ1bnMgUGVybCBzZWN0aW9ucyBvciBQZXJsTG9hZE1vZHVsZSwKd2hpY2ggbWF5IG5lZWQgdGhlIHNjZmctPm1pcCB0byBiZSBzZXQuIFtTdGFzXQoKTW9kUGVybDo6TU0gaXMgbm93IHJlYWR5IHRvIGJlIHVzZWQgaW4gTWFrZWZpbGUuUEwgb2YgM3JkIHBhcnR5Cm1vZF9wZXJsIG1vZHVsZXMgW1N0YXMgYW5kIEdlb2ZmXQoKZml4IGEgc2VnZmF1bHQgY2F1c2VkIGJ5IFBlcmxNb2R1bGUgaW4gJHMtPmFkZF9jb25maWcsIGR1ZSB0byBzZXR0aW5nCnRoZSBNUF9pbml0X2RvbmUgZmxhZyBiZWZvcmUgaW5pdCB3YXMgZG9uZSArIGFkZCB0ZXN0IFtTdGFzXQoKYWRqdXN0IHRoZSBnZW5lcmF0ZWQgTWFrZWZpbGUncyB0byBwcm9wZXJseSBidWlsZCBvbiBhaXggKHRlc3RlZCBvbgpwb3dlcnBjLWlibS1haXg1LjEuMC4wKSBbU3Rhc10KCnRoZSBidWlsZCBub3cgYXV0b21hdGljYWxseSBnbHVlcyB0aGUgLnBvZCBmaWxlcyB0byB0aGUgcmVzcGVjdGl2ZSAucG0KZmlsZXMsIHNvIG9uZSBjYW4gdXNlIHBlcmxkb2Mgb24gLnBtIGZpbGVzIHRvIHJlYWQgdGhlCmRvY3VtZW50YXRpb24uIFtTdGFzXQoKcHJvdmlkZSBhIHdvcmthcm91bmQgZm9yIEV4dFV0aWxzOjpNYWtlTWFrZXI6Om12X2FsbF9tZXRob2RzLCBzbwpNb2RQZXJsOjpCdWlsZE1NIGFuZCBNb2RQZXJsOjpNTSBjYW4gb3ZlcnJpZGUgRVU6Ok1NIG1ldGhvZHMgYmVoaW5kCnRoZSBzY2VuZXMuIFtTdGFzXQoKYWRkaW5nIE1vZFBlcmw6OkJ1aWxkTU0sIHdoaWNoIGlzIG5vdyB1c2VkIGZvciBidWlsZGluZyBtb2RfcGVybC4KTW9kUGVybDo6TU0gd2lsbCBiZSB1c2VkIGZvciAzcmQgcGFydHkgbW9kdWxlcy4gTW9kUGVybDo6QnVpbGRNTQpyZXVzZXMgTW9kUGVybDo6TU0gd2hlcmUgcG9zc2libGUuIFtTdGFzXQoKZHJvcCB0aGUgZ2x1ZSBjb2RlIGZvciBhcHJfZ2VuZXJhdGVfcmFuZG9tX2J5dGVzLCBzaW5jZSBpdCdzIG5vdAphdmFpbGFibGUgb24gYWxsIHBsYXRmb3Jtcy4gW1N0YXNdCgpTaW5jZSBub24tdGhyZWFkZWQgbXBtcyBkb24ndCB1c2UgdGlwb29scyBpbiBtaXBzLCBkb24ndCBjcmVhdGUgYW5kCmRlc3Ryb3kgdGhlbS4gW1N0YXNdCgpyZS11c2UgdGhlIHdvcmthcm91bmQgZm9yIGdsaWJjL1BlcmwtNS44LjAgY3J5cHQoKSBidWcgZm9yIHRoZQptYWluL3Zob3N0IGJhc2UgcGVybCBpbnRlcnByZXRlcnMgYXMgd2VsbC4gVGhpcyBzb2x2ZXMgdGhlIHByb2JsZW0gZm9yCnRoZSBidWdneSBnbGliYyBvbiBSSDguMC4gW1N0YXNdCgpzZW5kX2NnaV9oZWFkZXIgbm93IHR1cm5zIHRoZSBoZWFkZXIgcGFyc2luZyBvZmYgYW5kIGNhbiBzZW5kIGFueSBkYXRhCmF0dGFjaGVkIGFmdGVyIHRoZSByZXNwb25zZSBoZWFkZXJzIGFzIGEgcmVzcG9uc2UgYm9keS4gW1N0YXNdCgptb3ZlIHRoZSBjaGVjayB0aGF0IHByaW50L3ByaW50Zi9wdXRzL3dyaXRlL2V0YyBhcmUgY2FsbGVkIGluIHRoZQpyZXNwb25zZSBwaGFzZSBpbnRvIHRoZSBmdW5jdGlvbnMgdGhlbXNlbHZlcyBzbyAxKSB3ZSBjYW4gcHJpbnQgYSBtb3JlCnVzZWZ1bCBlcnJvciBtZXNzYWdlIDIpIHRoaXMgY2hlY2sgaXMgbm90IGFsd2F5cyBuZWVkZWQgaW4KbW9kcGVybF93YnVja2V0X3dyaXRlLCB3aGVuIGNhbGxlZCBpbnRlcm5hbGx5LCBzbyB3ZSBzYXZlIHNvbWUgY3ljbGVzLgpbU3Rhc10KCmFkZCBjaGVja3MgdGhhdCBwcmludC9wcmludGYvcHV0cy93cml0ZS9ldGMgYXJlIGNhbGxlZCBpbiB0aGUgcmVzcG9uc2UKcGhhc2UuIG1vdmUgdGhlIGNoZWNrIGludG8gdGhlIGZ1bmN0aW9ucyB0aGVtc2VsdmVzIHNvIHdlIGNhbiBwcmludCBhCm1vcmUgdXNlZnVsIGVycm9yIG1lc3NhZ2UgW1N0YXNdCgonbWFrZSBpbnN0YWxsJyBub3cgaW5zdGFsbHMgbW9kX3BlcmwqaCBmaWxlcyB1bmRlciBodHRwZCdzIGluY2x1ZGUKdHJlZSBbU3Rhc10KCldoZW4gUGVybE9wdGlvbnMgK1BhcnNlSGVhZGVycyBpcyBhbiBlZmZlY3QsIHRoZSBDR0kgaGVhZGVycyBwYXJzaW5nCndvbid0IGJlIGRvbmUgaWYgYW55ICptb2RfcGVybCogaGFuZGxlciBiZWZvcmUgYW5kIGluY2x1ZGluZyB0aGUKcmVzcG9uc2UgcGhhc2UsIHNldHMgJHItPmNvbnRlbnRfdHlwZS4gIChzaW1pbGFyIGJlaGF2aW9yIHRvIG1wMSdzCnNlbmRfaHR0cF9oZWFkZXIoKSBbU3Rhc10KClJlZ2lzdHJ5OiBtYWtlIHN1cmUgdGhhdCAkciBpcyBub3QgaW4gdGhlIHNjb3BlIHdoZW4gdGhlIHNjcmlwdCBpcwpjb21waWxlZCBbU3Rhc10KCiRBcGFjaGU6OlNlcnZlcjo6U2F2ZUNvbmZpZyBhZGRlZC4gV2hlbiBzZXQgdG8gYSB0cnVlIHZhbHVlLAp3aWxsIG5vdCBjbGVhciB0aGUgY29udGVudCBvZiBBcGFjaGU6OlJlYWRDb25maWc6OiBvbmNlIDxQZXJsID4Kc2VjdGlvbnMgYXJlIHByb2Nlc3NlZC4gW1BoaWxpcHBlIE0uIENoaWFzc29uIDxnb3plckBjcGFuLm9yZ10KCkFwYWNoZTo6Y29tcGF0OiBzdXBwb3J0IDEuMCdzIEFwYWNoZS0+cHVzaF9oYW5kbGVycywKQXBhY2hlLT5zZXRfaGFuZGxlcnMgYW5kIEFwYWNoZS0+Z2V0X2hhbmRsZXJzIFtTdGFzXQoKcmV2YW1wIHRoZSBjb2RlIGhhbmRsaW5nIG91dHB1dCBmbHVzaGluZyBhbmQgZmx1c2ggYnVja2V0CnNlbmRpbmcuIE5hbWVsbHkgbW9kcGVybF93YnVja2V0X2ZsdXNoIGFuZCBtb2RwZXJsX3didWNrZXRfcGFzcyBub3cKY2FuIGJlIHRvbGQgdG8gc2VuZCBhIGZsdXNoIGJ1Y2tldCBieSB0aGVtc2VsdmVzLCBhdHRhY2hpbmcgaXQgdG8gdGhlCmRhdGEgYmIgdGhleSBhcmUgYWxyZWFkeSBzZW5kaW5nLiBUaGlzIGhhbGZzIHRoZSBudW1iZXIgb2Ygb3V0cHV0CmZpbHRlciBpbnZvY2F0aW9ucyB3aGVuIHRoZSByZXNwb25zZSBoYW5kbGVyIGZsdXNoZXMgb3V0cHV0IHZpYSAkfCBvcgpyZmx1c2guIGFkanVzdCB0ZXN0cywgd2hpY2ggd2VyZSBjb3VudGluZyB0aGUgbnVtYmVyIG9mIGludm9jYXRpb25zLgpbU3Rhc10KCm1vdmUgTW9kUGVybDo6UmVnaXN0cnlDb29rZXIgdG8gdXNlIGEgaGFzaCBhcyBvYmplY3QgKHNpbWlsYXIgdG8gbXAxKSwKdG8gbWFrZSBpdCBlYXNpZXIgdG8gc3ViY2xhc3MuIFtOYXRoYW4gQnlyZCA8bmF0aGFuQGJ5cmQubmV0Pl0KCiRyLT5yZmx1c2ggaGFzIHRvIGZsdXNoIGludGVybmFsIG1vZHBlcmwgYnVmZmVyIGJlZm9yZSBjYWxsaW5nCmFwX3JmbHVzaCwgc28gaW1wbGVtZW50IHJmbHVzaCwgaW5zdGVhZCBvZiBhdXRvZ2VuZXJhdGluZyB0aGUgeHMgY29kZQpmb3IgaXQuIFtTdGFzXQoKZml4IHRoZSBpbnB1dCBmaWx0ZXJzIGhhbmRsaW5nIG9mIERFQ0xJTkVEIGhhbmRsZXJzIChjb25zdW1lIHRoZSBkYXRhLApvbiBiZWhhbGYgb2YgdGhlIGhhbmRsZXIpICsgdGVzdHMgW1N0YXNdCgpmaXggdGhlIGNvZGUgdGhhdCBhdXRvZ2VuZXJhdGVzIG1vZHBlcmxfbGFyZ2VmaWxlcy5oIG5vdCB0byBkZWZpbmUKbWFjcm9zIG1hdGNoaW5nIG0vXi0vICh3YXMgYSBwcm9ibGVtIG9uIGFpeC00LjMuMykgW1N0YXNdCgokQXBhY2hlOjpTZXJ2ZXI6OlN0cmljdFBlcmxTZWN0aW9ucyBhZGRlZC4gV2hlbiBzZXQgdG8gYSB0cnVlCnZhbHVlLCB3aWxsIGFib3J0IHNlcnZlciBzdGFydHVwIGlmIHRoZXJlIGFyZSBzeW50YXggZXJyb3JzCmluIDxQZXJsID4gc2VjdGlvbnMgW1BoaWxpcHBlIE0uIENoaWFzc29uIDxnb3plckBjcGFuLm9yZ10KClVzZSBXaW4zMjo6R2V0U2hvcnRQYXRoTmFtZSBmb3IgV2luMzIgdG8gaGFuZGxlIGNhc2VzIHdoZW4KdGhlIHN1cHBsaWVkIE1QX0FQX1BSRUZJWCBjb250YWlucyBzcGFjZXMuIFtSYW5keSBLb2Jlc10KCkJ1bXAgdXAgVGhyZWFkc1BlckNoaWxkIGZvciBtcG1fd2lubnQgaW4gaHR0cGQuY29uZiwgd2hpY2ggc2VlbXMgCnRvIGhlbHAgYXZvaWQgc2VydmVyIHN0YXJ0dXAgcHJvYmxlbXMgd2hlbiBydW5uaW5nIHRoZSB0ZXN0cy4KW1JhbmR5IEtvYmVzXQoKaW1wbGVtZW50IGEgbmV3IGhlbHBlciBtb2R1bGUgTW9kUGVybDo6TWV0aG9kTG9va3VwIHRvIGhlbHAgZmlndXJlIG91dAp3aGljaCBtb2R1bGUgc2hvdWxkIGJlIGxvYWRlZCB3aGVuIGEgY2VydGFpbiBtZXRob2QgaXMgcmVwb3J0ZWQgdG8gYmUKbWlzc2luZy4gW1N0YXNdCgpmaXggYSBidWcgZm9yIGFwciA8IDAuOS4zLCB3aGVyZSBpdCBzZWdmYXVsdHMgaW4gYXByX3VyaV91bnBhcnNlLCBpZgpob3N0bmFtZSBpcyBzZXQsIGJ1dCBub3QgdGhlIHNjaGVtZS4gSW4gY2FzZSB0aGUgaG9zdG5hbWUgaXMgZGVmaW5lZApidXQgc2NoZW1lIGlzIG5vdCBBcGFjaGU6OmNvbXBhdCB3aWxsIGRlZmF1bHQgdG8gdGhlICdodHRwJyBzY2hlbWUsCndoZXJlYXMgQVBSOjpVUkk6OnVucGFyc2UgcHJvdmlkZXMgbm8gZGVmYXVsdCBbU3Rhc10KCm1vdmUgJHItPnNlbmRfaHR0cF9oZWFkZXIgaW1wbGVtZW50YXRpb24gdG8gQXBhY2hlOjpjb21wYXQuICBUaGlzCmFsbG93cyB0aGUgMS4wIGNvZGUgdG8gcnVuIHVubW9kaWZpZWQgaWYgJHItPnNlbmRfaHR0cF9oZWFkZXIgaXMKY2FsbGVkIGJlZm9yZSB0aGUgcmVzcG9uc2UgY2hhbmdlLiB3ZSBhbHJlYWR5IGhhbmRsZSB0aGUgY2hlY2sgd2hldGhlcgpjb250ZW50X3R5cGUgd2FzIHNldCwgd2hlbiBkZWNpZGluZyB3aGV0aGVyIHRoZSBoZWFkZXJzIGFyZSB0byBiZQpwYXJzZWQgaW5zaWRlIG1vZHBlcmxfd2J1Y2tldF9wYXNzKCkuIFtTdGFzXQoKZml4ZXMgdG8gQXBhY2hlOjpjb21wYXQuIG1ha2UgJHItPmNvbm5lY3Rpb24tPmF1dGhfdHlwZSBpbnRlcmZhY2UKd2l0aCByLT5hcF9hdXRoX3R5cGUuIG1ha2UgYm90aCAkci0+Y29ubmVjdGlvbi0+YXV0aF90eXBlIGFuZAokci0+Y29ubmVjdGlvbi0+dXNlciB3cml0YWJsZS4gW0dlb2ZmcmV5IFlvdW5nXQoKT3BlbiB1cCByLT5hcF9hdXRoX3R5cGUsIG1ha2luZyBpdCBwb3NzaWJsZSB0byB3cml0ZSBjdXN0b20KYXV0aGVuIGhhbmRsZXJzIHRoYXQgZG9uJ3QgcmVseSBvbiBCYXNpYyBhdXRoZW50aWNhdGlvbiBvcgppdCdzIGFzc29jaWF0ZWQgYXBfKiBmdW5jdGlvbnMuCltHZW9mZnJleSBZb3VuZ10KCmFkZCBBcGFjaGU6OkJ1bmRsZTIgW1N0YXNdCgpBcGFjaGU6OlJlbG9hZCBub3cgc3VwcG9ydHMgdGhlIFBlcmxQcmVDb25uZWN0aW9uSGFuZGxlciBpbnZvY2F0aW9uCm1vZGUsIHNvIGNvbm5lY3Rpb24gZmlsdGVyIGFuZCBwcm90b2NvbCBtb2R1bGVzIGNhbiBiZSBhdXRvbWF0aWNhbGx5CnJlbG9hZGVkIG9uIGNoYW5nZS4gW1N0YXNdCgppbXBsZW1lbnQgQXBhY2hlOjpjdXJyZW50X2NhbGxiYWNrICsgJHItPmN1cnJlbnRfY2FsbGJhY2sgZ29lcyBpbnRvCkFwYWNoZTo6Y29tcGF0LCBzaW5jZSBub3cgd2UgaGF2ZSBhIHdheSB0b28gbWFueSBjYWxsYmFja3MgdW5yZWxhdGVkCnRvICRyIFtTdGFzXQoKQWRkIEFwYWNoZTo6Y29tcGF0IG1ldGhvZHM6ICRyLT5jb25uZWN0aW9uLT5hdXRoX3R5cGUgYW5kCiRyLT5jb25uZWN0aW9uLT51c2VyIChyZXF1aXJlcyAnUGVybE9wdGlvbnMgK0dsb2JhbFJlcXVlc3QnKSArIHRlc3RzCltTdGFzXQoKU2V2ZXJhbCBpc3N1ZXMgcmVzb2x2ZWQgd2l0aCBwYXJzaW5nIGhlYWRlcnMsIGluY2x1ZGluZyBtYWtpbmcgd29yawp0aGUgaGFuZGxlcnMgY2FsbGluZyAkci0+Y29udGVudF90eXBlKCkgYW5kIG5vdCBzZW5kaW5nIHJhdyBoZWFkZXJzLAp3aGVuIHRoZSBoZWFkZXJzIHNjYW5uaW5nIGlzIHR1cm5lZCBvbi4gTG90cyBvZiB0ZXN0cyBhZGRlZCB0bwpleGVyY2lzZSBkaWZmZXJlbnQgc2l0dWF0aW9ucy4gW1N0YXNdCgp3YXJuIG9uIHVzaW5nIC1UIGluIE1vZFBlcmw6OlJlZ2lzdHJ5IHNjcmlwdHMgd2hlbiBtb2RfcGVybCBpcyBub3QKcnVubmluZyB3aXRoIC1UIFtTdGFzXQoKcGVybCA1LjcuMysgaGFzIGEgYnVpbHQtaW4gJHteVEFJTlR9IHRvIHRlc3Qgd2hldGhlciBpdCdzIHJ1bm5pbmcKdW5kZXIgLShUfHQpLiBCYWNrcG9ydCAke15UQUlOVH0gZm9yIG1vZF9wZXJsIHJ1bm5pbmcgdW5kZXIKNS42LjAtNS43LjMsICh3aGF0IHVzZWQgdG8gYmUgJEFwYWNoZTo6X19ULiAgJEFwYWNoZTo6X19UIGlzIGF2YWlsYWJsZQp0b28sIGJ1dCBkZXByZWNhdGVkLiBbU3Rhc10KCmFkZCBQZXJsQ2hpbGRFeGl0SGFuZGxlciBpbXBsZW1lbnRhdGlvbiBbU3Rhc10KCmFkZCBQZXJsQ2xlYW51cEhhbmRsZXIgaW1wbGVtZW50YXRpb24gKyB0ZXN0IFtTdGFzXQoKZGllIHdoZW4gQXBhY2hlLT5yZXF1ZXN0IHJldHVybnMgbm90aGluZyAoJ1BlcmxPcHRpb25zIC1HbG9iYWxSZXF1ZXN0JwpvciAnU2V0SGFuZGxlciBtb2RwZXJsJykgW1N0YXNdCgpOZXcgQXBhY2hlOjpEaXJlY3RpdmUgbWV0aG9kczogYXNfaGFzaCgpLCBsb29rdXAoKSArIHRlc3RzICsgZG9jcwpbUGhpbGlwcGUgTS4gQ2hpYXNzb24gPGdvemVyQGNwYW4ub3JnPl0KClN0YWNrZWQgaGFuZGxlcnMgY2hhaW4gZXhlY3V0aW9uIGlzIG5vdyBhYm9ydGVkIHdoZW4gYSBoYW5kbGVyIHJldHVybnMKc29tZXRoaW5nIG90aGVyIHRoYW4gT0sgb3IgREVDTElORUQgW1N0YXNdCgptYWtlICRmaWx0ZXItPnJlYWQoKSBpbiBpbnB1dCBzdHJlYW1pbmcgZmlsdGVycywgdXNlIHRoZSBzYW1lIG51bWJlcgpvZiBhcmd1bWVudHMgYXMgcmVhZCgpIGluIHRoZSBvdXRwdXQgZmlsdGVycy4gW1N0YXNdCgpJbXBsZW1lbnQgJHItPmFkZF9pbnB1dF9maWx0ZXIgYW5kICRyLT5hZGRfb3V0cHV0X2ZpbHRlcgogICAgICAgICAgJGMtPmFkZF9pbnB1dF9maWx0ZXIgYW5kICRjLT5hZGRfb3V0cHV0X2ZpbHRlcgphbmQgYWRkIHRlc3RzICBbU3Rhc10KClNraXAgdGhlIGhhbmRsZXIgcGFja2FnZTo6ZnVuYyByZXNvbHZpbmcgZXJyb3IsIG9ubHkgd2hlbiB0aGUgZXJyb3IKbWVzc2FnZSBtYXRjaGVzICJDYW4ndCBsb2NhdGUgLio/IGluIEBJTkMiLCByYXRoZXIgdGhhbiBqdXN0ICJDYW4ndApsb2NhdGUiLCBzaW5jZSB0aGVyZSBhcmUgbWFueSBvdGhlciBlcnJvcnMgdGhhdCBzdGFydCB3aXRoIHRoYXQKc3RyaW5nLiBbU3Rhc10KCnRoZSB0b3AgbGV2ZWwgJ21ha2UgdGVzdCcgbm93IGRlc2NlbmRzIGludG8gdGhlIE1vZFBlcmwtUmVnaXN0cnkgZGlyCnRvIHJ1biAnbWFrZSB0ZXN0JyB0aGVyZSBbU3Rhc10KCkFsbCByZXNwb25zZSBmdW5jdGlvbnMgYXJlIG5vdyByZXR1cm5pbmcgc3RhdHVzIGFuZCB0aGUgY2FsbGVycyBjaGVjawphbmQgY3JvYWsgb24gZmFpbHVyZSBvciBwcm9nYXRlIHRoZW0gZnVydGhlci4gW1N0YXNdCgpPUEVOLCBDTE9TRSBhbmQgRklMRU5PIGltcGxlbWVudGF0aW9uIGZvciBBcGFjaGU6OlJlcXVlc3RSZWMgW1N0YXNdCgpBbm90aGVyIGZpeCBmb3IgdGhlIGhhbmRsaW5nIG9mIHRoZSByZXR1cm4gc3RhdHVzIGluCk1vZFBlcmw6OlJlZ2lzdHJ5Q29va2VyOiByZXNldCB0aGUgc3RhdHVzIHRvIHRoZSBvcmlnaW5hbCBvbmUgb25seSBpZgppdCB3YXMgY2hhbmdlZCBieSB0aGUgc2NyaXB0LCBvdGhlcndpc2UgcmV0dXJuIHRoZSBleGVjdXRpb24gc3RhdHVzCltTdGFzXQoKcHJldmVudCBzZWdmYXVsdCBpbiAkci0+cHJpbnQgLyAkZmlsdGVyLT5wcmludCAoaW4gb3V0cHV0IGZpbHRlcikgYW5kCnJlbGF0ZWQgZnVuY3Rpb25zIHdoZW4gdGhleSBhcmUgY2FsbGVkIGJlZm9yZSB0aGUgcmVzcG9uc2UgcGhhc2UKW1N0YXNdCgpwcmV2ZW50IHNlZ2ZhdWx0IGluIHNlbmRfaHR0cF9oZWFkZXIgd2hlbiBpdCdzIGNhbGxlZCBiZWZvcmUgdGhlCnJlc3BvbnNlIHBoYXNlIFtTdGFzXQoKaW5wdXQgc3RyZWFtIGZpbHRlcmluZyBzdXBwb3J0IHdhcyBhZGRlZCArIHRlc3RzIChwbHVzIHJlbmFtaW5nIGZpbHRlcgp0ZXN0cyBzbyB3ZSBjYW4ga25vdyBmcm9tIHRoZSB0ZXN0IG5hbWUgd2hhdCBraW5kIG9mIGZpbHRlciBpcyB0ZXN0ZWQpCltTdGFzXQoKQWRkIHByb3BlciBzdXBwb3J0IGZvciBtaXMtYmVoYXZlZCBmZWVkaW5nIGZpbHRlcnMgdGhhdCBzZW5kIG1vcmUgdGhhbgpvbmUgRU9TIGJ1Y2tldCBpbiBzdHJlYW1pbmcgZmlsdGVycyArIHRlc3QuIFtTdGFzXQoKcHJldmVudCBhIHNlZ2ZhdWx0IHdoZW4gcHVzaF9oYW5kbGVycyBhcmUgdXNlZCB0byBwdXNoIGEgaGFuZGxlciBpbnRvCnRoZSBjdXJyZW50bHkgcGhhc2UgYW5kIHN3aXRjaGluZyB0aGUgaGFuZGxlciAocGVybC1zY3JpcHQvbW9kcGVybCkgKwp0ZXN0cyBbU3Rhc10KCkFkZCAkZmlsdGVyLT5zZWVuX2VvcyB0byB0aGUgc3RyZWFtaW5nIGZpbHRlciBhcGkgdG8ga25vdyB3aGVuIGVvcyBoYXMKYmVlbiBzZWVuLCBzbyBzcGVjaWFsIHNpZ25hdHVyZXMgY2FuIGJlIHBhc3NlZCBhbmQgYW55IGRhdGEgc3RvcmVkIGluCnRoZSBjb250ZXh0IGZsdXNoZWQgKyB0ZXN0cy4gW1N0YXNdCgpBZGQgJGZpbHRlci0+Y3R4IHRvIG1haW50YWluIHN0YXRlIGJldHdlZW4gZmlsdGVyIGludm9jYXRpb24gKyB0ZXN0cwpbU3Rhc10KClJlcXVlc3QgaW5wdXQgYW5kIG91dHB1dCBmaWx0ZXJzIGFyZSBub3cgZ2V0dGluZyB0aGUgRU9TIGJ1Y2tldCwgd2hpY2gKd2Fzbid0IHBhc3NlZCB0aHJvdWdoIGJlZm9yZS4gTm93IHRoZSBjb250ZXh0IGNhbiBiZSBmbHVzaGVkIG9uCkVPUy4gW1N0YXNdCgoKCj1pdGVtIDEuOTlfMDggLSBKYW51YXJ5IDEwLCAyMDAzCgpDb3JyZWN0IE1vZFBlcmw6OlJlZ2lzdHJ5Q29va2VyIHRvIHJlc2V0ICVJTkMsIGFmdGVyIGNvbXBpbGUgZm9yIC5wbApmaWxlcyB3aGljaCBkb24ndCBkZWNsYXJlIHRoZSBwYWNrYWdlICsgYWRkIHRlc3RzIHRvIGNoZWNrIHRoYXQgW1N0YXNdCgpMb2cgdGhlIHJlYWwgZXJyb3IgbWVzc2FnZSB3aGVuIEZvbzo6QmFyOjpzdWJfbmFtZSBmYWlscyB0byByZXNvbHZlLApiZWNhdXNlIG9mIGEgcHJvYmxlbSBpbiBGb286OkJhciwgd2hlbiBGb286OkJhciAqd2FzKiBmb3VuZCBbU3Rhc10KCkFkZCBQZXJsUHJlQ29ubmVjdGlvbkhhbmRsZXIgc3VwcG9ydCBpbiBBcGFjaGU6OlRlc3QgW1N0YXNdCgpFbmFibGUgUGVybFByZUNvbm5lY3Rpb25IYW5kbGVyIFtTdGFzXQoKU3VwcG9ydCB0aGUgSG9zdDogcmVxdWVzdCBoZWFkZXIgaW4gQXBhY2hlOjpUZXN0Q2xpZW50IFtTdGFzXQoKcmVzdG9yZSB0aGUgTW9kUGVybDo6UmVnaXN0cnlMb2FkZXI6Om5ldygpIG1ldGhvZCBmb3IgYmFja3dhcmRzCmNvbXBhdGliaWxpdHkgIFtTdGFzXQoKcG9ydCB0aGUgc3VwcG9ydCBmb3IgTmFtZVdpdGhWaXJ0dWFsSG9zdCBpbiBNb2RQZXJsOjpSZWdpc3RyeUNvb2tlcgphbmQgTW9kUGVybDo6UmVnaXN0cnlMb2FkZXIgW1N0YXNdCgpmaXggdGhlIGhhbmRsaW5nIG9mIHRoZSByZXR1cm4gc3RhdHVzIGluIE1vZFBlcmw6OlJlZ2lzdHJ5Q29va2VyLCBhZGQKYSB0ZXN0IHRvIHZlcmlmeSB0aGF0IFtTdGFzXQoKdW5kZXIgbm9uLXRocmVhZGVkIHBlcmwgbmVlZCB0byBjaGVjayB3aGV0aGVyIG1vZF9wZXJsIGlzIHJ1bm5pbmcsCndoZW4gbW9kcGVybF92aG9zdF9pc19ydW5uaW5nIGNoZWNrIGlzIGRvbmUuIFtTdGFzXQoKZml4ICRyLT5yZWFkIHRvIHJlYWQgYWxsIHRoZSByZXF1ZXN0ZWQgYW1vdW50IG9mIGRhdGEgaWYgcG9zc2libGUsCmFkanVzdCB0aGUgdGVzdCBUZXN0QXBhY2hlOjpyZWFkIHRvIHZlcmlmeSB0aGF0IFtTdGFzXQoKZml4IHRoZSBtZXRob2QgY29udGVudCgpIGluIEFwYWNoZTo6Y29tcGF0IHRvIHJlYWQgYSB3aG9sZSByZXF1ZXN0CmJvZHkuIHNhbWUgZm9yIE1vZFBlcmw6OlRlc3Q6OnJlYWRfcG9zdC4gYWRkIHRlc3RzLiAgW1N0YXNdCgpBZGp1c3QgdGhlIHJldmVyc2UgZmlsdGVyIHRlc3QgdG8gd29yayBvbiB3aW4zMiAocmVtb3ZlIHRyYWlsaW5nIFxyKQpbUmFuZHkgS29iZXMgPHJhbmR5QHRoZW9yeXg1LnV3aW5uaXBlZy5jYT5dCgpTdHJvbmdseSBzdWdnZXN0IHdpbjMyIHVzZXJzIHRvIHVwZ3JhZGUgdG8gNS44LjAsIGlmIHRoZXkgcnVuIDUuNi54CltSYW5keSBLb2JlcyA8cmFuZHlAdGhlb3J5eDUudXdpbm5pcGVnLmNhPl0KCldoZW4gaW5zdGFsbGluZyB0aGUgbW9kX3Blcmwgc2hhcmVkIG9iamVjdCwgZmlyc3QgbmVlZCB0byBjaGVjawp3aGV0aGVyIHRoZSBkaXJlY3RvcnkgJ21vZHVsZXMnIGFscmVhZHkgZXhpc3RzLCBhbmQgY3JlYXRlIGl0IGlmIG5vdC4KW1JhbmR5IEtvYmVzIDxyYW5keUB0aGVvcnl4NS51d2lubmlwZWcuY2E+XQoKQWRkIGEgY2FwYWJpbGl0eSB0byB0dW5lIHRoZSB0ZXN0IGNvbmZpZ3VyYXRpb24gc2VjdGlvbnMgb3JkZXJpbmcKaW4gQXBhY2hlOjpUZXN0Q29uZmlnUGVybCBbU3RhcyBCZWttYW5dCgpmaXggdGhlIGNvbXBsYWluaW5nIGNvZGUgYWJvdXQgbGF0ZSBQZXJsU3dpdGNoZXMgd2hlbiBQZXJsTG9hZE1vZHVsZQppcyB1c2VkIGJlZm9yZSBpdCBbU3RhcyBCZWttYW5dCgphZGQgdmFyaW91cyB0ZXN0cyB0aGF0IGV4ZXJjaXNlIFBlcmxMb2FkTW9kdWxlIGFuZCB2aG9zdHMKW1N0YXMgQmVrbWFuXQoKaGFuZGxlIGNvcnJlY3RseSBQZXJsTG9hZE1vZHVsZXMgKGRpcmVjdGl2ZXMpIHdpdGggdmhvc3RzOgogIC0gaGFuZGxlIGdyYWNlZnVsbHkgY2FzZXMgd2hlbiB0aGluZ3MgYXJlIHVuZGVmL05VTEwKICAtIGhhbmRsZSB0aGUgY2FzZSB3aGVuIHNjZmc9PU5VTEwsIGJ5IHN0ZWFsaW5nIHRoZSBiYXNlX3NlcnZlcnMncyBjb25maWcKW1N0YXMgQmVrbWFuXQoKbWFrZSBtb2RfcGVybCB3b3JrIHdpdGggdmhvc3RzIHdoZW4gdGhlIHNlcnZlciBpcyBzdGFydGVkIHByaW9yIHRvCiAgcG9zdF9jb25maWcoKToKICAtIGNhbGwgbW9kcGVybF9pbml0X2dsb2JhbHMgYXMgZWFybHkgYXMgcG9zc2libGUsIGJlY2F1c2UgdGhlIG1haW4gc2VydmVyCiAgICByZWNvcmQgaXMgbmVlZGVkIGR1cmluZyB0aGUgY29uZmlndXJhdGlvbiBwYXJzaW5nLCBmb3IgcGVybGxvYWRtb2R1bGUKICAgIGFuZCB2aG9zdHMKICAtIGFsc28gbWFrZSBzdXJlIHRoYXQgd2UgYXJlIHVzaW5nIGEgcmVhbCBiYXNlX3NlcnZlciwgd2hlbiBkZWFsaW5nCiAgICB3aXRoIG1vZHBlcmxfaW5pdCwgYW5kIGlmIG5vdCByZXRyaWV2ZSBpdCBmcm9tIHRoZSBnbG9iYWwgcmVjb3JkCltTdGFzIEJla21hbl0KCnByZXZlbnQgc2VnZmF1bHRzLCB3aGVuIHNjZmcgaXMgTlVMTCBpbiBBcGFjaGU6Ok1vZHVsZS0+Z2V0X2NvbmZpZygpOwpbU3RhcyBCZWttYW5dCgplbnN1cmUgdGhhdCBhIGNvcmUgZmlsZSBpcyBhIGZpbGUgaW5kZWVkLCBiZWZvcmUgY29tcGxhaW5pbmcgW1BoaWxpcHBlCk0uIENoaWFzc29uIDxnb3plckBjcGFuLm9yZz5dCgphZGQgJHItPmFzX3N0cmluZyBbR2VvZmZyZXkgWW91bmddCgphZGQgYmFja2NvbXBhdCB2YXJzOiAkQXBhY2hlOjpTZXJ2ZXI6OkNXRCBhbmQKJEFwYWNoZTo6U2VydmVyOjpBZGRQZXJsVmVyc2lvbiBbU3RhcyBCZWttYW5dCgplbnYgdmFyIE1PRF9QRVJMX1RSQUNFIGlzIHdvcmtpbmcgYWdhaW4gW1N0YXMgQmVrbWFuXQoKYWRkIGEgbmV3IHRlc3QgVGVzdERpcmVjdGl2ZTo6cGVybGxvYWRtb2R1bGUyLCB3aGljaCBwZXJmb3JtcyBhIG1vcmUKZXZvbHZlZCBtZXJnaW5nLiAgW1N0YXMgQmVrbWFuXQoKZml4IEFwYWNoZTo6VGVzdENvbmZpZ1BlcmwgdW5kZXIgbW9kX3BlcmwgMS4wLCBuZWVkIHRvIHJlcXVpcmUKbW9kX3BlcmwucG0gYmVmb3JlIHVzaW5nICRtb2RfcGVybDo6VkVSU0lPTiBbR2VvZmZyZXkgWW91bmddCgphZGQgYW4gQXBhY2hlOjpTSUcgYmFja2NvbXBhdCBzdHViIHRvIEFwYWNoZTo6Y29tcGF0IFtTdGFzIEJla21hbl0KCmZpeCB0aGUgQXBhY2hlOjpUZXN0Q29uZmlnUGVybCdzIHJ1bl9hcGFjaGVfdGVzdF9jb25maWcoKSBmdW5jdGlvbgp3aGVyZSB0ZXN0IHBhY2thZ2VzIGFyZSBzY2FubmVkIGZvciB0aGUgbWFnaWMgQVBBQ0hFX1RFU1RfQ09ORklHVVJFCmFuZCBpZiBmb3VuZCBnZXQgcmVxdWlyZSgpJ2QuIEFwYWNoZTIgbmVlZHMgdG8gYmUgcnVuIGZvciBtb2RfcGVybAoyLjAuICBbU3RhcyBCZWttYW5dCgptb3ZlIHRoZSBjdXN0b20gbW9kX3BlcmwgMi4wIGNvbmZpZ3VyYXRpb24gYml0cyBvdXQgb2YgdGhlCk1vZFBlcmw6OlRlc3RSdW4sIHdoZXJlIHRoZXkgZG9uJ3QgYmVsb25nLCBpbnRvIGEgc3BlY2lhbCBjb25maWcgZmlsZQp3aGljaCBpcyBpbmNsdWRlZCBhdCB0aGUgdmVyeSBlbmQgb2YgaHR0cGQuY29uZiBbU3RhcyBCZWttYW5dCgpleHRlbmQgQXBhY2hlOjpUZXN0IHRvIGFsbG93IGV4dHJhIGNvbmZpZ3VyYXRpb24gZmlsZXMgdG8gYmUgaW5jbHVkZWQKYXQgdGhlIHZlcnkgZW5kIG9mIGh0dHBkLmNvbmYsIHdoZW4gZXZlcnl0aGluZyB3YXMgbG9hZGVkIGFuZApjb25maWd1cmVkIFtTdGFzIEJla21hbl0KCnJlc29sdmUgYSBzZWdmYXVsdCBpbiBBcGFjaGU6Ok1vZHVsZTo6Z2V0X2NvbmZpZygpIGZvciB0aGUgZWRnZSBjYXNlCndoZW4gdGhlIHBhY2thZ2UgbmFtZSBpcyBib2d1cy4gW1N0YXMgQmVrbWFuXQoKQXBhY2hlOjpSZWxvYWQ6IGFkZCBzdXBwb3J0IGZvciB3YXRjaGluZyBhbmQgcmVsb2FkaW5nIG1vZHVsZXMgb25seSBpbgpzcGVjaWZpZWQgc3ViLWRpcnMgW0hhcnJ5IERhbmlsZXZza3kgPGhhcnJ5QGRlZXJmaWVsZGNhcGl0YWwuY29tPl0KCmVuYWJsZSBBUFIucG0ncyBsaW5raW5nIGZvciBhcHIgMC45LjIgYW5kIGhpZ2hlciwgd2hpY2ggdXNlcyBhIG5ldyBsaWIKbmFtaW5nIHNjaGVtZSwgc3VjaCBhcyBsaWJhcHItMC5zby4wLjkuMiwgb25seSBpZiBhcHItY29uZmlnIGFuZAphcHUtY29uZmlnIHNjcmlwdHMgZXhpc3QuIFtTdGFzIEJla21hbl0KCmRlZmluZSBJb1RZUEVfUkRPTkxZL0lvVFlQRV9XUk9OTFkgZm9yIHBlcmwtNS42LjAgc28gdGhlIHByb2plY3QKY29tcGlsZXMgYWdhaW4gdW5kZXIgNS42LjAgW1N0YXMgQmVrbWFuXQoKYWxsb3cgb3V0cHV0IHN0cmVhbWluZyBmaWx0ZXJzIHRvIGFwcGVuZCBkYXRhIHRvIHRoZSBlbmQgb2YgdGhlIHN0cmVhbQpbU3RhcyBCZWttYW5dCgpmaXhlcyB0byBjb21waWxlIHdpdGggQWN0aXZlUGVybCA1LjggYmV0YQpbUmFuZHkgS29iZXMgPHJhbmR5QHRoZW9yeXg1LnV3aW5uaXBlZy5jYT5dCgpmaXggZm9yIGRpcmVjdGl2ZSBoYW5kbGVycyB3aXRoaW4gdmhvc3RzIHVzaW5nIHRocmVhZGVkIE1QTXMKW1N0ZXBoZW4gQ2xvdXNlIDxzdGVwaGVuY0B0aGVpcWdyb3VwLmNvbT5dCgpmaXggPElmRGVmaW5lIE1PRFBFUkwyPiBzdXBwb3J0CgpkZWZhdWx0IEF1dGhUeXBlIHRvIEJhc2ljIGlmIG5vdCBzZXQgaW4gJHItPmdldF9iYXNpY19hdXRoX3B3KCkKW1BoaWxpcHBlIE0uIENoaWFzc29uIDxnb3plckBjcGFuLm9yZz5dCgp3b3JrYXJvdW5kIGdsaWJjL1BlcmwtNS44LjAgY3J5cHQoKSBidWcgKHNlZW4gd2l0aCB0aHJlYWRlZCBNUE1zKQoKZml4IGRlbGV0ZSAkRU5WeyRrZXl9IGJ1ZwoKZml4IHBhcnNlX2FyZ3MgY29tcGF0IG1ldGhvZCB0byBzdXBwb3J0IG5vbi1hc2NpaSBjaGFyYWN0ZXJzIGFuZCB0ci8rLyAvCltXYWxlcnkgU3R1ZGVubmlrb3YgPGRlc3BhaXJAc2FtYS5ydT5dCgpmaXggcG9zdF9jb25uZWN0aW9uIGNvbXBhdCBtZXRob2QgdG8gYmVoYXZlIGFzIGl0IGRpZCBpbiAxLngKW0dlb2ZmcmV5IFlvdW5nXQoKYWRkIHN1cHBvcnQgZm9yIHNldHRpbmcgJHItPmF1dGhfbmFtZSBhbmQgJHItPmF1dGhfdHlwZQpbUGhpbGlwcGUgTS4gQ2hpYXNzb24gPGdvemVyQGNwYW4ub3JnPl0KCmFkZCBBcGFjaGUtPmh0dHBkX2NvbmYgY29tcGF0IG1ldGhvZApbUGhpbGlwcGUgTS4gQ2hpYXNzb24gPGdvemVyQGNwYW4ub3JnPl0KCmFkZCBkZWZhdWx0IDxQZXJsPiBoYW5kbGVyIEFwYWNoZTo6UGVybFNlY3Rpb24uCm1ha2UgPFBlcmw+IGJsb2NrcyB0byBiZSBFWEVDX09OX1JFQUQgc28gYXBhY2hlIGRvZXMgbm90IHBhcnNlIHRoZSBjb250ZW50cy4KYWRkICJQZXJsIiBkaXJlY3RpdmUgZm9yIGdlbmVyYWwgdXNlIGFuZCBmb3Igd2hpY2ggPFBlcmw+IHNlY3Rpb25zIGFyZQpzdHVmZmVkIGludG8uCltQaGlsaXBwZSBNLiBDaGlhc3NvbiA8Z296ZXJAY3Bhbi5vcmc+XQoKcmVuYW1lIG92ZXJsb2FkZWQgTG9hZE1vZHVsZSBkaXJlY3RpdmUgdG8gUGVybExvYWRNb2R1bGUgYW5kIGFkanVzdAp0aGUgdGVzdCBuYW1pbmcKCgoKPWl0ZW0gMS45OV8wNyAtIFNlcHRlbWJlciAyNSwgMjAwMgoKZml4ID1wb2QgZGlyZWN0aXZlIHRlc3QgY29uZmlnIHByb2JsZW0KW1BoaWxpcHBlIE0uIENoaWFzc29uIDxnb3plckBjcGFuLm9yZz5dCgoKCj1pdGVtIDEuOTlfMDYgLSBTZXB0ZW1iZXIgMjUsIDIwMDIKCmFkZCBzdXBwb3J0IGZvciBwb2QgZGlyZWN0aXZlcyAoPXBvZCw9YmFjayw9Y3V0KSBhbmQgX19FTkRfXyBkaXJlY3RpdmUKW1BoaWxpcHBlIE0uIENoaWFzc29uIDxnb3plckBjcGFuLm9yZz5dCgp0d2Vha3MgdG8gc3VwcG9ydCBUZXN0LnBtIDEuMjEgW1BoaWxpcHBlIE0uIENoaWFzc29uIDxnb3plckBjcGFuLm9yZz5dCgphZGQgJHItPmFkZF9jb25maWcgbWV0aG9kIHRvIGFkZCBkeW5hbWljIGNvbmZpZ3VyYXRpb24gYXQgcmVxdWVzdCB0aW1lCgphZGQgQXBhY2hlOjpESVJfTUFHSUNfVFlQRSBjb25zdGFudAoKYWRkIHN1cHBvcnQgZm9yIGRpcmVjdGl2ZSBoYW5kbGVycwoKZml4IHNvdXJjZV9zY2FuIHRvIHJ1biB3aXRoIGN1cnJlbnQgaHR0cGQvYXByCgphZGQgQXBhY2hlOjpTZXJ2ZXItPmFkZF9jb25maWcgbWV0aG9kIHRvIGFkZCBkeW5hbWljIGNvbmZpZ3VyYXRpb24gYXQKc2VydmVyIHN0YXJ0dXAgdGltZQoKYWRkIEFwYWNoZTo6RGlyZWN0aXZlLT50b19zdHJpbmcgbWV0aG9kCgphZGQgc3VwcG9ydCBmb3IgcGx1Z2dhYmxlIDxQZXJsPiBzZWN0aW9ucwoKZml4IGNvbXBpbGF0aW9uIHByb2JzIHdpdGggZ2V0X3JlbW90ZV9ob3N0KCkgdGhhdCBoYWQgYSB3cm9uZwpwcm90b3R5cGUgW1N0YXMgQmVrbWFuXQoKQXBhY2hlOjpTdWJQcm9jZXNzIG5vdyBoYXMgYSBtYW5wYWdlIFtTdGFzIEJla21hbl0KCmZpeCB0aGUgQXBhY2hlOjpTdWJQcm9jZXNzIHRlc3RzIHRvIHdvcmsgd2l0aCBwZXJsaW8tZGlzYWJsZWQgUGVybApbU3RhcyBCZWttYW5dCgpmaXggdGhlIGZpbGVoYW5kbGUgbGVhayBpbiBBUFI6OlBlcmxJTyAoYm90aCBwZXJsaW8tZGlzYWJsZWQgYW5kCnBlcmxpby1lbmFibGVkIFBlcmwpIFtTdGFzIEJla21hbl0KCnJlbW92ZSBkdXAoKSB3aGVuIGNvbnZlcnRpbmcgZmlsZWhhbmRsZXMgZnJvbSBhcHJfZmlsZV90IHRvIEZJTEUqCnVuZGVyIHBlcmxpby1kaXNhYmxlZCBQZXJsIChBUFI6OlBlcmxJTykgW1N0YXMgQmVrbWFuXQoKZml4IGNvbXBpbGF0aW9uIGlmIGFwYWNoZS9hcHIgZG8gbm90IGhhdmUgdGhyZWFkIHN1cHBvcnQKCgoKPWl0ZW0gMS45OV8wNSAtIEF1Z3VzdCAyMCwgMjAwMgoKZml4IFBlcmxPcHRpb25zICtQYXJzZUhlYWRlcnMgdG8gb25seSBwYXJzZSBvbmNlIHBlci1yZXF1ZXN0CgphZGQgZXh0ZXJuYWwgcmVkaXJlY3RzIFJlZ2lzdHJ5IHRlc3RzIFtTdGFzIEJla21hbl0KCmdldCByaWQgb2YgdGhlIGNvbXBhdCBsYXllciBpbiBNb2RQZXJsLVJlZ2lzdHJ5IFtTdGFzIEJla21hbl0KCk1vZFBlcmw6OlJlZ2lzdHJ5TG9hZGVyIGlzIG5vdyBmdWxseSBvcGVyYXRpb25hbCBhbmQgdGVzdGVkIFtTdGFzIEJla21hbl0KClJlZ2lzdHJ5IG1ldGhvZCBoYW5kbGVycyBhcmUgbm93IHdvcmtpbmcgW1N0YXMgQmVrbWFuXQoKY29yZSBSZWdpc3RyeSBwYWNrYWdlcyBhbGwgY29tcGlsZSB0aGUgc2NyaXB0cyBpbnRvCk1vZFBlcmw6OlJlZ2lzdHJ5Uk9PVDo6IG5hbWVzcGFjZSBhbmQgY2FjaGUgdGhlbSBpbgolTW9kUGVybDo6UmVnaXN0cnlDYWNoZS4gQm90aCBvdmVycmlkYWJsZSBieSB0aGUgc3ViLWNsYXNzZXMuIFtTdGFzIEJla21hbl0KCmNvbXBhdCB0ZXN0cyB3ZXJlIHNwbGl0IGludG8gZ3JvdXBzIGJ5IGZ1bmN0aW9uYWxpdHksIHNlbmRfZmQgdGVzdAptb3ZlZCB0byBjb21wYXQuICBbU3RhcyBCZWttYW5dCgphZGRlZCAkYy0+Z2V0X3JlbW90ZV9ob3N0IGFuZCBhIGNvbXBhdCB3cmFwcGVyICRyLT5nZXRfcmVtb3RlX2hvc3QgKwp0ZXN0cyBbU3RhcyBCZWttYW5dCgphZGp1c3QgdGhlIGJ1aWxkIHN5c3RlbSB0byBzdXBwb3J0IG1vZF9wZXJsIGJ1aWxkIGZyb20gdGhlIHNvdXJjZQp0cmVlLiBbU3RhcyBCZWttYW5dCgpNb2RQZXJsOjpSZWdpc3RyeUNvb2tlciBzeW5jcyB3aXRoIG1vZF9wZXJsIDEuMCdzIHJlZ2lzdHJ5OgogLSBwcm90b3R5cGVzIGRlZmluZWQgY2hlY2tzIGluIGZsdXNoX25hbWVzcGFjZSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtZYWlyIExlbmdhIDx5YWlyLmxlbmdhQGNpdGlncm91cC5jb20+XQogLSBzZXQgZXJyb3Itbm90ZXMgb24gZXJyb3IgW0dlb2ZmcmV5IFlvdW5nXQogLSBwcmVzZXJ2ZSBzdGF0dXMgaW4gUmVnaXN0cnkgc2NyaXB0cyBbR2VvZmZyZXkgWW91bmddCgphcHJfdGFibGVfdCBpcyBub3cgYW4gb3BhcXVlIHR5cGUsIHVzZSBhcHJfdGFibGVfZWx0cygpIHRvIGdldCB0aGUgYXJyYXkKcmVjb3JkIFtTdGFzIEJla21hbl0KCmFkZCBzdXBwb3J0IGZvciByZWRpcmVjdHMgd2l0aCBQZXJsT3B0aW9ucyArUGFyc2VIZWFkZXJzCgpiYWNrcG9ydCB0byAyLjAuMzUKCmFkanVzdCB0byBmaWx0ZXIgcmVnaXN0ZXIgYXBpIGNoYW5nZQoKYWRkZWQgQVBSOjpUaHJlYWRNdXRleCBtb2R1bGUKCgoKPWl0ZW0gMS45OV8wNCAtIEp1bmUgMjEsIDIwMDIKCnZhcmlvdXMgQVBSIFBlcmxJTyB1cGRhdGVzIFtTdGFzIEJla21hbl0KCnN0b3AgdXNpbmcgYW4gYXByX3Bvb2xfdCB0byBhbGxvY2F0ZSBpdGVtcyBmb3IgdGhlIGludGVycHJldGVyIHBvb2wsCnNhZmVyIGZvciB0aHJlYWRlZCBNUE1zIGFuZCBwcmV2ZW50cyAibGVha3MiIHdoZW4gaW50ZXJwcmV0ZXJzIGFyZQpyZW1vdmVkIGZyb20gZHVlIHRvIFBlcmxJbnRlcnBNYXh7UmVxdWVzdHMsU3BhcmV9CgppbXBsZW1lbnQgbW9kcGVybF9zeXNfZGxjbG9zZSgpIHRvIGF2b2lkIGFwci9wb29sIG92ZXJoZWFkL3RocmVhZCBpc3N1ZXMKCmdldCB0aGUgLURQRVJMX0NPUkUgb3B0aW1pemF0aW9uIHdvcmtpbmcgYWdhaW4KClBFUkxfU0VUX0NPTlRFWFQgdG8gdGhlIHBhcmVudCBpbnRlcnByZXRlciB3aGVuIGNsb25pbmcgaW50ZXJwcmV0ZXJzIGF0CnJlcXVlc3QgdGltZSwgZWxzZSBkVEhYIG1pZ2h0IGJlIE5VTEwgZHVyaW5nIGNsb25lIGluIHRoZSBnaXZlbiB0aHJlYWQsCndoaWNoIHdvdWxkIGNyYXNoIHRoZSBzZXJ2ZXIuCgoKCj1pdGVtIDEuOTlfMDMgLSBKdW5lIDE1LCAyMDAyCgp3aW4zMiBmaXggZm9yIHRoZSBnbG9iYWwgQXBhY2hlLT5yZXF1ZXN0IG9iamVjdCB0byBtYWtlIHN1cmUgaXQgdXNlcwp0aGUgdGhyZWFkIGxvY2FsIHN0b3JhZ2UgbWVjaGFuaXNtCgphZGQgYSByZWZlcmVuY2UgY291bnQgbWVjaGFuaXNtIHRvIGludGVycHJldGVycyBmb3IgdXNlIGluIHRocmVhZGVkIE1QTXMsCnNvIGlmIEFQUjo6UG9vbCBjbGVhbnVwcyBoYXZlIGJlZW4gcmVnaXN0ZXJlZCB0aGUgaW50ZXJwcmV0ZXIgaXMgbm90CnB1dGJhY2sgaW50byB0aGUgaW50ZXJwcmV0ZXIgcG9vbCB1bnRpbCBhbGwgY2xlYW51cHMgaGF2ZSBydW4uCgp1bmJ1ZmZlciBTVERFUlIgKGJ5IHR1cm5pbmcgb24gYXV0b2ZsdXNoIGJ5IGRlZmF1bHQpCgphZGQgc3VwcG9ydCBmb3IgUGVybCpIYW5kbGVyICtBcGFjaGU6OkZvbwoKZml4IG9wZW5fbG9ncyxwb3N0X2NvbmZpZyxjaGlsZF9pbml0IGhvb2tzIHRvIHJ1biBpbiB0aGUgcHJvcGVyIG9yZGVyCgphZGp1c3QgdG8gYXByX2J1Y2tldF90eXBlX3QgY2hhbmdlcyBpbiAyLjAuMzctZGV2CltNbGFkZW4gVHVyayA8bXR1cmtAbWFwcGluZ3NvZnQuY29tPl0KCmFkZCBNT0RQRVJMMiBjb25maWcgZGVmaW5lLCBhcyBpZiB0aGUgc2VydmVyIGhhZCBiZWVuIHN0YXJ0ZWQgd2l0aCAtRE1PRFBFUkwyCgpjb21wYXQgYWRkaXRpb25zIGFuZCBmaXhlczogJHItPmxvb2t1cF97ZmlsZSx1cml9LCAkci0+aXNfbWFpbiwgQXBhY2hlLT5kZWZpbmUKCmFkZGVkIGNvbXBhdCBmb3IgQXBhY2hlOjpsb2dfZXJyb3IgW1N0YXMgQmVrbWFuXQoKCgo9aXRlbSAxLjk5XzAyIC0gSnVuZSAxLCAyMDAyCgpwYXNzIHRoZSBQQVRIIGFuZCBUWiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXQgc3RhcnR1cCBieSBkZWZhdWx0IGFzIDEueHggZGlkCgpmaXggTW9kUGVybDo6VXRpbDo6ZXhpdCBzZWd2IHdpdGggNS42LjAKCm5vIGxvbmdlciBzdXBwb3J0IDUuNy54IHBlcmwgZGV2ZWxvcG1lbnQgdmVyc2lvbnMKCmFkZGVkIGNvbXBhdCBmb3IgQXBhY2hlOjpUYWJsZS0+bmV3Cgp2YXJpb3VzIGZpeGVzIHRvIGNvbXBpbGUvcnVuIG9uIGRhcndpbgoKc2VydmVyLXNjb3BlIFBlcmx7U2V0LFBhc3N9RW52IGNvbmZpZyBub3cgcHJvcGFnYXRlZCB0byAlRU5WIGF0IHN0YXJ0dXAKCnVzZSBTdk9LKHN2KSBpbnN0ZWFkIG9mIHN2ID09ICZQTF9zdl91bmRlZiB0byBkZXRlY3QgdW5kZWYgdmFsdWVzIGluIHhzCltTdGVwaGVuIENsb3VzZSA8c3RlcGhlbmNAdGhlaXFncm91cC5jb20+XQoKY29tcGxldGUgQXBhY2hlOjpVdGlsIDEueCBjb21wYXQKCmFkZGVkIEFwYWNoZTo6TVBNX0lTX1RIUkVBREVEIGNvbnN0YW50CgphZGRlZCBjb21wYXQgZnVuY3Rpb24gZm9yIEFwYWNoZTo6Q29uc3RhbnRzOjpTRVJWRVJfVkVSU0lPTgoKYWRkZWQgQXBhY2hlOjpDb25zdGFudHM6OmV4cG9ydCBzdHViIGZvciBjb21wYXQKCmFkZGVkIG5vb3Agc3R1YnMgZm9yIHRpbWVvdXQgZnVuY3Rpb25zIHJlbW92ZWQgZnJvbSAyLjA6CiRyLT57c29mdCxoYXJkLHJlc2V0LGtpbGx9X3RpbWVvdXQKCnR1cm5lZCBvbiBQZXJsT3B0aW9ucyArR2xvYmFsUmVxdWVzdCBieSBkZWZhdWx0IGZvciBwZXJsLXNjcmlwdCBoYW5kbGVyCnVubGVzcyBpdCBpcyBleHBsaWNpdGx5IHR1cm5lZCBvZmYgd2l0aCBQZXJsT3B0aW9ucyAtR2xvYmFsUmVxdWVzdAoKYWRkZWQgQVBSOjpPUzo6dGhyZWFkX2N1cnJlbnQgZnVuY3Rpb24KCmFkZGVkIHN1cHBvcnQgZm9yIDEueCAkci0+c3VicHJvY2Vzc19lbnYgZnVuY3Rpb25hbGl0eQoKYWRkZWQgc3VwcG9ydCBmb3IgJHItPnB1c2hfaGFuZGxlcnMoUGVybEhhbmRsZXIgPT4gLi4uKQoKYWRkZWQgc3VwcG9ydCBmb3IgJHItPnByb3h5cmVxIHRvIGRldGVjdCBwcm94eSByZXF1ZXN0cwoKJHItPmNvbnRlbnRfdHlwZSgkdmFsKSBub3cgY2FsbHMgYXBfc2V0X2NvbnRlbnRfdHlwZSB1bmRlcm5lYXRoCgphZGQgdGhlIGVycl9oZWFkZXJfb3V0KCkgd3JhcHBlciB0byBBcGFjaGU6OmNvbXBhdCArIGNvcnJlc3BvbmRpbmcgdGVzdHMKW1N0YXMgQmVrbWFuXQoKZml4ICRyLT5kaXJfY29uZmlnIGxvb2t1cCBvZiB2YWx1ZXMgc2V0IGluIHRoZSBzZXJ2ZXIgY29udGV4dAoKYWRkZWQgQXBhY2hlOjpSRURJUkVDVCBzaG9ydGN1dCBjb25zdGFudAoKdmFyaW91cyBmaXhlcyBmb3IgbWV0aG9kIGhhbmRsZXJzCgp1c2UgQXBhY2hlOjpTZXJ2ZXJVdGlsIGluIEFwYWNoZTo6Y29tcGF0IHNvIEFwYWNoZS0+c2VydmVyIHdvcmtzIGluIGNvbXBhdAptb2RlIFtEYXZlIFJvbHNreSA8YXV0YXJjaEB1cnRoLm9yZz5dCgphZGQgQXBhY2hlOjpVdGlsOjp1bmVzY2FwZV91cmkgYWxpYXMgdG8gQXBhY2hlOjp1bmVzY2FwZV91cmwgaW4gQXBhY2hlOjpjb21wYXQKCmNoYW5nZSBBcGFjaGU6OnVuZXNjYXBlX3VybCB0byByZXR1cm4gdGhlIGVzY2FwZWQgdXJsIGFzIDEueCBkb2VzCgpkaXNhYmxlZCB0ZXJtIGNvbG9yaW5nIGJ5IGRlZmF1bHQgKGVuYWJsZSB3aXRoIGVudiB2YXIgQVBBQ0hFX1RFU1RfQ09MT1I9MSkKCmZpeCBmb3IgQVBSOjpJcFN1Ym5ldC0+bmV3IHRvIGNoZWNrIHJldHVybiBzdGF0dXMgYXByX2lwc3VibmV0X2NyZWF0ZQoKZW5hYmxlZCBBUFI6OlNvY2tBZGRyIG1vZHVsZQoKdHVybiBvbiBiaW5tb2RlIGZvciBmaWxlaGFuZGxlIHVzZWQgaW4gJHItPnNlbmRfZmQKCmdldCBNUF97VFJBQ0UsREVCVUd9IE1ha2VmaWxlLlBMIG9wdGlvbnMgd29ya2luZyBvbiB3aW4zMgoKdmFyaW91cyBmaXhlcyB0byBidWlsZC9ydW4gd2l0aCBibGVlZHBlcmwKCnZhcmlvdXMgZml4ZXMgZm9yIHdpbjMyIHRvIGdldCBtYWtlIHRlc3QgcGFzc2luZwoKbW92ZWQgY29uc3R1Y3Rfe3VybCxzZXJ2ZXJ9IG1ldGhvZHMgdG8gQXBhY2hlOjpVUkkgbW9kdWxlCgppbXBsZW1lbnQgQXBhY2hlOjpVUkk6OnBhcnNlIGluIEFwYWNoZTo6Y29tcGF0CgpnaXZlIFBlcmwqSGFuZGxlcnMgcHJlY2VkZW5jZSBvdmVyIG90aGVyIGhhbmRsZXJzIGJ5IHVzaW5nIEFQUl9IT09LX0ZJUlNUCnJhdGhlciB0aGFuIEFQUl9IT09LX0xBU1QKCndvcmthcm91bmQgYnVnIGluIDUuNi4xIHdoZW4gWFNMb2FkZXIgbG9hZHMgRHluYUxvYWRlciwgd2lwaW5nIG91dCBhbnkKZGwgaGFuZGxlcyBpdCBoYWQgYmVlbiBrZWVwaW5nIHRyYWNrIG9mLgoKdGlkeSB1cCB0ZXN0IHRvIHJ1biBzdGFuZGFsb25lICh3aXRob3V0IG1vZHBlcmwgdGVzdCBjb25maWcpIApbU3RhcyBCZWttYW5dCgpvdmVycmlkZSBUX1BUUk9CSiBJTlBVVCB0eXBlbWFwIHRvIGNyb2FrIGlmIG9iamVjdCBpcyBub3QgYSBibGVzc2VkCnJlZmVyZW5jZSwgdG8gcHJldmVudCBwb3NzaWJsZSBzZWd2IGZyb20gZS5nLiBBcGFjaGU6OlNlcnZlci0+cHJvY2VzcwoKYXByX2xvY2suaCBpcyBnb25lOyBkaXNhYmxlIEFQUjo6TG9jayBmb3IgdGhlIG1vbWVudAoKZW5hYmxlZCB0aGUgQXBhY2hlOjpQcm9jZXNzIG1vZHVsZQoKZml4IE1vZFBlcmw6OlV0aWw6OmV4aXQgdG8gY2xlYXIgJEAgYmVmb3JlIGNhbGxpbmcgUGVybF9jcm9hawoKY3V0IGRvd24gb24gc29tZSBidWlsZCBub2lzZQoKZml4ICdQZXJsT3B0aW9ucyArR2xvYmFsUmVxdWVzdCcgd2hlbiB1c2VkIHdpdGhpbiBzdWJyZXF1ZXN0cwoKZ2V0IHJpZCBvZiBzb21lICJzdWJyb3V0aW5lIHJlZGVmaW5lZCIgd2FybmluZ3MgaW4gTW9kUGVybDo6TU0gdGhhdApzaG93IHVwIHdpdGggbmV3ZXIgYmxlZWRwZXJscy4KCmEgZmV3IGZpeGVzIGZvciBBcGFjaGU6OmNvbXBhdCBbRGF2ZSBSb2xza3kgPGF1dGFyY2hAdXJ0aC5vcmc+XQoKCgo9aXRlbSAxLjk5XzAxIC0gQXByaWwgNiwgMjAwMgoKRmlyc3QgcHVibGljIHJlbGVhc2Ugb2YgbW9kX3BlcmwtMi4wLXRvYmUuCgo9YmFjawoKPWN1dAo=