V2hhdCdzIE5ldyBpbiBQeXRob24gMi4yYTI/Cj09PT09PT09PT09PT09PT09PT09PT09PT09PQoKVG9vbHMKCi0gVGhlIG5ldyBUb29scy9zY3JpcHRzL2NsZWFuZnV0dXJlLnB5IGNhbiBiZSB1c2VkIHRvIGF1dG9tYXRpY2FsbHkKICBlZGl0IG91dCBvYnNvbGV0ZSBmdXR1cmUgc3RhdGVtZW50cyBmcm9tIFB5dGhvbiBzb3VyY2UgY29kZS4gIFNlZQogIHRoZSBtb2R1bGUgZG9jc3RyaW5nIGZvciBkZXRhaWxzLgoKVGVzdHMKCi0gcmVncnRlc3QucHkgbm93IGtub3dzIHdoaWNoIHRlc3RzIGFyZSBleHBlY3RlZCB0byBiZSBza2lwcGVkIG9uIHNvbWUKICBwbGF0Zm9ybXMsIGFsbG93aW5nIHRvIGdpdmUgY2xlYXJlciB0ZXN0IHJlc3VsdCBvdXRwdXQuCgotIFNldmVyYWwgbmV3IHRlc3RzIGluIHRoZSBzdGFuZGFyZCB0ZXN0IHN1aXRlLCB3aXRoIHNwZWNpYWwgdGhhbmtzIHRvCiAgTmljayBNYXRoZXdzb24uCgpDb3JlCgotIFdhcm5pbmdzIGFib3V0IGEgbWlzbWF0Y2ggaW4gdGhlIFB5dGhvbiBBUEkgZHVyaW5nIGV4dGVuc2lvbiBpbXBvcnQKICBub3cgdXNlIHRoZSBQeXRob24gd2FybmluZyBmcmFtZXdvcmsgKHdoaWNoIG1ha2VzIGl0IHBvc3NpYmxlIHRvCiAgd3JpdGUgZmlsdGVycyBmb3IgdGhlc2Ugd2FybmluZ3MpLgoKLSBBIGZ1bmN0aW9uJ3MgX19kaWN0X18gKGFrYSBmdW5jX2RpY3QpIHdpbGwgbm93IGFsd2F5cyBiZSBhCiAgZGljdGlvbmFyeS4gIEl0IHVzZWQgdG8gYmUgcG9zc2libGUgdG8gZGVsZXRlIGl0IG9yIHNldCBpdCB0byBOb25lLAogIGJ1dCBub3cgYm90aCBhY3Rpb25zIHJhaXNlIFR5cGVFcnJvcnMuICBJdCBpcyBzdGlsbCBsZWdhbCB0byBzZXQgaXQKICB0byBhIGRpY3Rpb25hcnkgb2JqZWN0LiAgR2V0dGluZyBmdW5jLl9fZGljdF9fIGJlZm9yZSBhbnkgYXR0cmlidXRlcwogIGhhdmUgYmVlbiBhc3NpZ25lZCBub3cgcmV0dXJucyBhbiBlbXB0eSBkaWN0aW9uYXJ5IGluc3RlYWQgb2YgTm9uZS4KCkxpYnJhcnkKCi0gTmV3IGNsYXNzIERpZmZlciBhbmQgbmV3IGZ1bmN0aW9ucyBuZGlmZigpIGFuZCByZXN0b3JlKCkgaW4gZGlmZmxpYi5weS4KICBUaGVzZSBwYWNrYWdlIHRoZSBhbGdvcml0aG1zIHVzZWQgYnkgdGhlIHBvcHVsYXIgVG9vbHMvc2NyaXB0cy9uZGlmZi5weSwKICBmb3IgcHJvZ3JhbW1hdGljIHJldXNlLgoKLSBOZXcgZnVuY3Rpb24geG1sLnNheC5zYXh1dGlscy5xdW90ZWF0dHIoKTogIFF1b3RlIGFuIFhNTCBhdHRyaWJ1dGUKICB2YWx1ZSB1c2luZyB0aGUgbWluaW1hbCBxdW90aW5nIHJlcXVpcmVkIGZvciB0aGUgdmFsdWU7IG1vcmUKICByZWxpYWJsZSB0aGFuIHVzaW5nIHhtbC5zYXguc2F4dXRpbHMuZXNjYXBlKCkgZm9yIGF0dHJpYnV0ZSB2YWx1ZXMuCgotIFJlYWRsaW5lIGNvbXBsZXRpb24gc3VwcG9ydCBmb3IgY21kLkNtZCB3YXMgYWRkZWQuCgpOZXcgcGxhdGZvcm1zCgpDIEFQSQoKLSBUd28gbmV3IEFQSXMgUHlPU19zbnByaW50ZigpIGFuZCBQeU9TX3ZzbnByaW50ZigpIHdlcmUgYWRkZWQKICB3aGljaCBwcm92aWRlIGEgY3Jvc3MtcGxhdGZvcm0gaW1wbGVtZW50YXRpb25zIGZvciB0aGUKICByZWxhdGl2ZWx5IG5ldyBzbnByaW50ZigpL3ZzbnByaW50ZigpIEMgbGliIEFQSXMuIEluIGNvbnRyYXN0IHRvCiAgdGhlIHN0YW5kYXJkIHNwcmludGYoKSBhbmQgdnNwcmludGYoKSBDIGxpYiBBUElzLCB0aGVzZSB2ZXJzaW9ucwogIGFwcGx5IGJvdW5kcyBjaGVja2luZyBvbiB0aGUgdXNlZCBidWZmZXIgd2hpY2ggZW5oYW5jZXMgcHJvdGVjdGlvbgogIGFnYWluc3QgYnVmZmVyIG92ZXJydW5zLgoKLSBVbmljb2RlIEFQSXMgbm93IHVzZSBuYW1lIG1hbmdsaW5nIHRvIGFzc3VyZSB0aGF0IG1peGluZyBpbnRlcnByZXRlcnMKICBhbmQgZXh0ZW5zaW9ucyB1c2luZyBkaWZmZXJlbnQgVW5pY29kZSB3aWR0aHMgaXMgcmVuZGVyZWQgbmV4dCB0bwogIGltcG9zc2libGUuIFRyeWluZyB0byBpbXBvcnQgYW4gaW5jb21wYXRpYmxlIFVuaWNvZGUtYXdhcmUgZXh0ZW5zaW9uCiAgd2lsbCByZXN1bHQgaW4gYW4gSW1wb3J0RXJyb3IuICBVbmljb2RlIGV4dGVuc2lvbnMgd3JpdGVycyBtdXN0IG1ha2UKICBzdXJlIHRvIGNoZWNrIHRoZSBVbmljb2RlIHdpZHRoIGNvbXBhdGliaWxpdHkgaW4gdGhlaXIgZXh0ZW5zaW9ucyBieQogIHVzaW5nIGF0IGxlYXN0IG9uZSBvZiB0aGUgbWFuZ2xlZCBVbmljb2RlIEFQSXMgaW4gdGhlIGV4dGVuc2lvbi4KCldpbmRvd3MKCi0gImltcG9ydCBtb2R1bGUiIG5vdyBjb21waWxlcyBtb2R1bGUucHl3IGlmIGl0IGV4aXN0cyBhbmQgbm90aGluZyBlbHNlCiAgcmVsZXZhbnQgaXMgZm91bmQuCgoKV2hhdCdzIE5ldyBpbiBQeXRob24gMi4yYTE/Cj09PT09PT09PT09PT09PT09PT09PT09PT09PQoKQ29yZQoKLSBURU5UQVRJVkVMWSwgYSBsYXJnZSBhbW91bnQgb2YgY29kZSBpbXBsZW1lbnRpbmcgbXVjaCBvZiB3aGF0J3MKICBkZXNjcmliZWQgaW4gUEVQIDI1MiAoTWFraW5nIFR5cGVzIExvb2sgTW9yZSBMaWtlIENsYXNzZXMpIGFuZCBQRVAKICAyNTMgKFN1YnR5cGluZyBCdWlsdC1pbiBUeXBlcykgd2FzIGFkZGVkLiAgVGhpcyB3aWxsIGJlIHJlbGVhc2VkCiAgd2l0aCBQeXRob24gMi4yYTEuICBEb2N1bWVudGF0aW9uIHdpbGwgYmUgcHJvdmlkZWQgc2VwYXJhdGVseQogIHRocm91Z2ggaHR0cDovL3d3dy5weXRob24ub3JnLzIuMi8uICBUaGUgcHVycG9zZSBvZiByZWxlYXNpbmcgdGhpcwogIHdpdGggUHl0aG9uIDIuMmExIGlzIHRvIHRlc3QgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuICBJdCBpcwogIHBvc3NpYmxlLCB0aG91Z2ggbm90IGxpa2VseSwgdGhhdCBhIGRlY2lzaW9uIGlzIG1hZGUgbm90IHRvIHJlbGVhc2UKICB0aGlzIGNvZGUgYXMgcGFydCBvZiAyLjIgZmluYWwsIGlmIGFueSBzZXJpb3VzIGJhY2t3YXJkcwogIGluY29tcGFwYXRpYmlsaXRpZXMgYXJlIGZvdW5kIGR1cmluZyBhbHBoYSB0ZXN0aW5nIHRoYXQgY2Fubm90IGJlCiAgcmVwYWlyZWQuCgotIEdlbmVyYXRvcnMgd2VyZSBhZGRlZDsgdGhpcyBpcyBhIG5ldyB3YXkgdG8gY3JlYXRlIGFuIGl0ZXJhdG9yIChzZWUKICBiZWxvdykgdXNpbmcgd2hhdCBsb29rcyBsaWtlIGEgc2ltcGxlIGZ1bmN0aW9uIGNvbnRhaW5pbmcgb25lIG9yCiAgbW9yZSAneWllbGQnIHN0YXRlbWVudHMuICBTZWUgUEVQIDI1NS4gIFNpbmNlIHRoaXMgYWRkcyBhIG5ldwogIGtleXdvcmQgdG8gdGhlIGxhbmd1YWdlLCB0aGlzIGZlYXR1cmUgbXVzdCBiZSBlbmFibGVkIGJ5IGluY2x1ZGluZyBhCiAgZnV0dXJlIHN0YXRlbWVudDogImZyb20gX19mdXR1cmVfXyBpbXBvcnQgZ2VuZXJhdG9ycyIgKHNlZSBQRVAgMjM2KS4KICBHZW5lcmF0b3JzIHdpbGwgYmVjb21lIGEgc3RhbmRhcmQgZmVhdHVyZSBpbiBhIGZ1dHVyZSByZWxlYXNlCiAgKHByb2JhYmx5IDIuMykuICBXaXRob3V0IHRoaXMgZnV0dXJlIHN0YXRlbWVudCwgJ3lpZWxkJyByZW1haW5zIGFuCiAgb3JkaW5hcnkgaWRlbnRpZmllciwgYnV0IGEgd2FybmluZyBpcyBpc3N1ZWQgZWFjaCB0aW1lIGl0IGlzIHVzZWQuCiAgKFRoZXNlIHdhcm5pbmdzIGN1cnJlbnRseSBkb24ndCBjb25mb3JtIHRvIHRoZSB3YXJuaW5ncyBmcmFtZXdvcmsgb2YKICBQRVAgMjMwOyB3ZSBpbnRlbmQgdG8gZml4IHRoaXMgaW4gMi4yYTIuKQoKLSBUaGUgVVRGLTE2IGNvZGVjIHdhcyBtb2RpZmllZCB0byBiZSBtb3JlIFJGQyBjb21wbGlhbnQuIEl0IHdpbGwgbm93CiAgb25seSByZW1vdmUgQk9NIGNoYXJhY3RlcnMgYXQgdGhlIHN0YXJ0IG9mIHRoZSBzdHJpbmcgYW5kIHRoZW4KICBvbmx5IGlmIHJ1bm5pbmcgaW4gbmF0aXZlIG1vZGUgKFVURi0xNi1MRSBhbmQgLUJFIHdvbid0IHJlbW92ZSBhCiAgbGVhZGluZyBCTU8gY2hhcmFjdGVyKS4KCi0gU3RyaW5ncyBub3cgaGF2ZSBhIG5ldyBtZXRob2QgLmRlY29kZSgpIHRvIGNvbXBsZW1lbnQgdGhlIGFscmVhZHkKICBleGlzdGluZyAuZW5jb2RlKCkgbWV0aG9kLiBUaGVzZSB0d28gbWV0aG9kcyBwcm92aWRlIGRpcmVjdCBhY2Nlc3MKICB0byB0aGUgY29ycmVzcG9uZGluZyBkZWNvZGVycyBhbmQgZW5jb2RlcnMgb2YgdGhlIHJlZ2lzdGVyZWQgY29kZWNzLgoKICBUbyBlbmhhbmNlIHRoZSB1c2FiaWxpdHkgb2YgdGhlIC5lbmNvZGUoKSBtZXRob2QsIHRoZSBzcGVjaWFsCiAgY2FzaW5nIG9mIFVuaWNvZGUgb2JqZWN0IHJldHVybiB2YWx1ZXMgd2FzIGRyb3BwZWQgKFVuaWNvZGUgb2JqZWN0cwogIHdlcmUgYXV0by1tYWdpY2FsbHkgY29udmVydGVkIHRvIHN0cmluZyB1c2luZyB0aGUgZGVmYXVsdCBlbmNvZGluZykuCgogIEJvdGggbWV0aG9kcyB3aWxsIG5vdyByZXR1cm4gd2hhdGV2ZXIgdGhlIGNvZGVjIGluIGNoYXJnZSBvZiB0aGUKICByZXF1ZXN0ZWQgZW5jb2RpbmcgcmV0dXJucyBhcyBvYmplY3QsIGUuZy4gVW5pY29kZSBjb2RlY3Mgd2lsbAogIHJldHVybiBVbmljb2RlIG9iamVjdHMgd2hlbiBkZWNvZGluZyBpcyByZXF1ZXN0ZWQgKCLk9vwiLmRlY29kZSgibGF0aW4tMSIpCiAgd2lsbCByZXR1cm4gdSLk9vwiKS4gVGhpcyBlbmFibGVzIGNvZGVjIHdyaXRlciB0byBjcmVhdGUgY29kZWNzCiAgZm9yIHZhcmlvdXMgc2ltcGxlIHRvIHVzZSBjb252ZXJzaW9ucy4KCiAgTmV3IGNvZGVjcyB3ZXJlIGFkZGVkIHRvIGRlbW9uc3RyYXRlIHRoZXNlIG5ldyBmZWF0dXJlcyAodGhlIC5lbmNvZGUoKQogIGFuZCAuZGVjb2RlKCkgY29sdW1ucyBpbmRpY2F0ZSB0aGUgdHlwZSBvZiB0aGUgcmV0dXJuZWQgb2JqZWN0cyk6CgogIE5hbWUgICAgIHwgLmVuY29kZSgpIHwgLmRlY29kZSgpIHwgRGVzY3JpcHRpb24KICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgdXUgICAgICAgfCBzdHJpbmcgICAgfCBzdHJpbmcgICAgfCBVVSBjb2RlYyAoZS5nLiBmb3IgZW1haWwpCiAgYmFzZTY0ICAgfCBzdHJpbmcgICAgfCBzdHJpbmcgICAgfCBiYXNlNjQgY29kZWMKICBxdW9wcmkgICB8IHN0cmluZyAgICB8IHN0cmluZyAgICB8IHF1b3RlZC1wcmludGFibGUgY29kZWMKICB6bGliICAgICB8IHN0cmluZyAgICB8IHN0cmluZyAgICB8IHpsaWIgY29tcHJlc3Npb24KICBoZXggICAgICB8IHN0cmluZyAgICB8IHN0cmluZyAgICB8IDItYnl0ZSBoZXggY29kZWMKICByb3QtMTMgICB8IHN0cmluZyAgICB8IFVuaWNvZGUgICB8IFJPVC0xMyBVbmljb2RlIGNoYXJtYXAgY29kZWMKCi0gU29tZSBvcGVyYXRpbmcgc3lzdGVtcyBub3cgc3VwcG9ydCB0aGUgY29uY2VwdCBvZiBhIGRlZmF1bHQgVW5pY29kZQogIGVuY29kaW5nIGZvciBmaWxlIHN5c3RlbSBvcGVyYXRpb25zLiAgTm90YWJseSwgV2luZG93cyBzdXBwb3J0cyAnbWJjcycKICBhcyB0aGUgZGVmYXVsdC4gIFRoZSBNYWNpbnRvc2ggd2lsbCBhbHNvIGFkb3B0IHRoaXMgY29uY2VwdCBpbiB0aGUgbWVkaXVtCiAgdGVybSwgYWx0aG91Z2ggdGhlIGRlZmF1bHQgZW5jb2RpbmcgZm9yIHRoYXQgcGxhdGZvcm0gd2lsbCBiZSBvdGhlciB0aGFuCiAgJ21iY3MnLgoKICBPbiBvcGVyYXRpbmcgc3lzdGVtIHRoYXQgc3VwcG9ydCBub24tQVNDSUkgZmlsZW5hbWVzLCBpdCBpcyBjb21tb24gZm9yCiAgZnVuY3Rpb25zIHRoYXQgcmV0dXJuIGZpbGVuYW1lcyAoc3VjaCBhcyBvcy5saXN0ZGlyKCkpIHRvIHJldHVybiBQeXRob24KICBzdHJpbmcgb2JqZWN0cyBwcmUtZW5jb2RlZCB1c2luZyB0aGUgZGVmYXVsdCBmaWxlIHN5c3RlbSBlbmNvZGluZyBmb3IKICB0aGUgcGxhdGZvcm0uICBBcyB0aGlzIGVuY29kaW5nIGlzIGxpa2VseSB0byBiZSBkaWZmZXJlbnQgZnJvbSBQeXRob24ncwogIGRlZmF1bHQgZW5jb2RpbmcsIGNvbnZlcnRpbmcgdGhpcyBuYW1lIHRvIGEgVW5pY29kZSBvYmplY3QgYmVmb3JlIHBhc3NpbmcKICBpdCBiYWNrIHRvIHRoZSBPcGVyYXRpbmcgU3lzdGVtIHdvdWxkIHJlc3VsdCBpbiBhIFVuaWNvZGUgZXJyb3IsIGFzIFB5dGhvbgogIHdvdWxkIGF0dGVtcHQgdG8gdXNlIGl0cyBkZWZhdWx0IGVuY29kaW5nIChnZW5lcmFsbHkgQVNDSUkpIHJhdGhlciB0aGFuCiAgdGhlIGRlZmF1bHQgZW5jb2RpbmcgZm9yIHRoZSBmaWxlIHN5c3RlbS4KCiAgSW4gZ2VuZXJhbCwgdGhpcyBjaGFuZ2Ugc2ltcGx5IHJlbW92ZXMgc3VycHJpc2VzIHdoZW4gd29ya2luZyB3aXRoCiAgVW5pY29kZSBhbmQgdGhlIGZpbGUgc3lzdGVtLCBtYWtpbmcgdGhlc2Ugb3BlcmF0aW9ucyB3b3JrIGFzIHlvdSBleHBlY3QsCiAgaW5jcmVhc2luZyB0aGUgdHJhbnNwYXJlbmN5IG9mIFVuaWNvZGUgb2JqZWN0cyBpbiB0aGlzIGNvbnRleHQuCiAgU2VlIFs/Pz8/XSBmb3IgbW9yZSBkZXRhaWxzLCBpbmNsdWRpbmcgZXhhbXBsZXMuCgotIEZsb2F0IChhbmQgY29tcGxleCkgbGl0ZXJhbHMgaW4gc291cmNlIGNvZGUgd2VyZSBldmFsdWF0ZWQgdG8gZnVsbAogIHByZWNpc2lvbiBvbmx5IHdoZW4gcnVubmluZyBmcm9tIGEgLnB5IGZpbGU7IHRoZSBzYW1lIGNvZGUgbG9hZGVkIGZyb20gYQogIC5weWMgKG9yIC5weW8pIGZpbGUgY291bGQgc3VmZmVyIG51bWVyaWMgZGlmZmVyZW5jZXMgc3RhcnRpbmcgYXQgYWJvdXQgdGhlCiAgMTJ0aCBzaWduaWZpY2FudCBkZWNpbWFsIGRpZ2l0LiAgRm9yIGV4YW1wbGUsIG9uIGEgbWFjaGluZSB3aXRoIElFRUUtNzU0CiAgZmxvYXRpbmcgYXJpdGhtZXRpYywKCiAgICAgIHggPSA5MDA3MTk5MjU0NzQwOTkyLjAKICAgICAgcHJpbnQgbG9uZyh4KQoKICBwcmludGVkIDkwMDcxOTkyNTQ3NDA5OTIgaWYgcnVuIGRpcmVjdGx5IGZyb20gLnB5LCBidXQgOTAwNzE5OTI1NDc0MDAwMAogIGlmIGZyb20gYSBjb21waWxlZCAoLnB5YyBvciAucHlvKSBmaWxlLiAgVGhpcyB3YXMgZHVlIHRvIG1hcnNoYWwgdXNpbmcKICBzdHIoZmxvYXQpIGluc3RlYWQgb2YgcmVwcihmbG9hdCkgd2hlbiBidWlsZGluZyBjb2RlIG9iamVjdHMuICBtYXJzaGFsCiAgbm93IHVzZXMgcmVwcihmbG9hdCkgaW5zdGVhZCwgd2hpY2ggc2hvdWxkIHJlcHJvZHVjZSBmbG9hdHMgdG8gZnVsbAogIG1hY2hpbmUgcHJlY2lzaW9uIChhc3N1bWluZyB0aGUgcGxhdGZvcm0gQyBmbG9hdDwtPnN0cmluZyBJL08gY29udmVyc2lvbgogIGZ1bmN0aW9ucyBhcmUgb2YgZ29vZCBxdWFsaXR5KS4KCiAgVGhpcyBtYXkgY2F1c2UgZmxvYXRpbmctcG9pbnQgcmVzdWx0cyB0byBjaGFuZ2UgaW4gc29tZSBjYXNlcywgYW5kCiAgdXN1YWxseSBmb3IgdGhlIGJldHRlciwgYnV0IG1heSBhbHNvIGNhdXNlIG51bWVyaWNhbGx5IHVuc3RhYmxlCiAgYWxnb3JpdGhtcyB0byBicmVhay4KCi0gVGhlIGltcGxlbWVudGF0aW9uIG9mIGRpY3RzIHN1ZmZlcnMgZmV3ZXIgY29sbGlzaW9ucywgd2hpY2ggaGFzIHNwZWVkCiAgYmVuZWZpdHMuICBIb3dldmVyLCB0aGUgb3JkZXIgaW4gd2hpY2ggZGljdCBlbnRyaWVzIGFwcGVhciBpbiBkaWN0LmtleXMoKSwKICBkaWN0LnZhbHVlcygpIGFuZCBkaWN0Lml0ZW1zKCkgbWF5IGRpZmZlciBmcm9tIHByZXZpb3VzIHJlbGVhc2VzIGZvciBhCiAgZ2l2ZW4gZGljdC4gIE5vdGhpbmcgaXMgZGVmaW5lZCBhYm91dCB0aGlzIG9yZGVyLCBzbyBubyBwcm9ncmFtIHNob3VsZAogIHJlbHkgb24gaXQuICBOZXZlcnRoZWxlc3MsIGl0J3MgZWFzeSB0byB3cml0ZSB0ZXN0IGNhc2VzIHRoYXQgcmVseSBvbiB0aGUKICBvcmRlciBieSBhY2NpZGVudCwgdHlwaWNhbGx5IGJlY2F1c2Ugb2YgcHJpbnRpbmcgdGhlIHN0cigpIG9yIHJlcHIoKSBvZiBhCiAgZGljdCB0byBhbiAiZXhwZWN0ZWQgcmVzdWx0cyIgZmlsZS4gIFNlZSBMaWIvdGVzdC90ZXN0X3N1cHBvcnQucHkncyBuZXcKICBzb3J0ZGljdChkaWN0KSBmdW5jdGlvbiBmb3IgYSBzaW1wbGUgd2F5IHRvIGRpc3BsYXkgYSBkaWN0IGluIHNvcnRlZAogIG9yZGVyLgoKLSBNYW55IG90aGVyIHNtYWxsIGNoYW5nZXMgdG8gZGljdHMgd2VyZSBtYWRlLCByZXN1bHRpbmcgaW4gZmFzdGVyCiAgb3BlcmF0aW9uIGFsb25nIHRoZSBtb3N0IGNvbW1vbiBjb2RlIHBhdGhzLgoKLSBEaWN0aW9uYXJ5IG9iamVjdHMgbm93IHN1cHBvcnQgdGhlICJpbiIgb3BlcmF0b3I6ICJ4IGluIGRpY3QiIG1lYW5zCiAgdGhlIHNhbWUgYXMgZGljdC5oYXNfa2V5KHgpLgoKLSBUaGUgdXBkYXRlKCkgbWV0aG9kIG9mIGRpY3Rpb25hcmllcyBub3cgYWNjZXB0cyBnZW5lcmljIG1hcHBpbmcKICBvYmplY3RzLiAgU3BlY2lmaWNhbGx5IHRoZSBhcmd1bWVudCBvYmplY3QgbXVzdCBzdXBwb3J0IHRoZSAua2V5cygpCiAgYW5kIF9fZ2V0aXRlbV9fKCkgbWV0aG9kcy4gIFRoaXMgYWxsb3dzIHlvdSB0byBzYXksIGZvciBleGFtcGxlLAogIHt9LnVwZGF0ZShVc2VyRGljdCgpKQoKLSBJdGVyYXRvcnMgd2VyZSBhZGRlZDsgdGhpcyBpcyBhIGdlbmVyYWxpemVkIHdheSBvZiBwcm92aWRpbmcgdmFsdWVzCiAgdG8gYSBmb3IgbG9vcC4gIFNlZSBQRVAgMjM0LiAgVGhlcmUncyBhIG5ldyBidWlsdC1pbiBmdW5jdGlvbiBpdGVyKCkKICB0byByZXR1cm4gYW4gaXRlcmF0b3IuICBUaGVyZSdzIGEgbmV3IHByb3RvY29sIHRvIGdldCB0aGUgbmV4dCB2YWx1ZQogIGZyb20gYW4gaXRlcmF0b3IgdXNpbmcgdGhlIG5leHQoKSBtZXRob2QgKGluIFB5dGhvbikgb3IgdGhlCiAgdHBfaXRlcm5leHQgc2xvdCAoaW4gQykuICBUaGVyZSdzIGEgbmV3IHByb3RvY29sIHRvIGdldCBpdGVyYXRvcnMKICB1c2luZyB0aGUgX19pdGVyX18oKSBtZXRob2QgKGluIFB5dGhvbikgb3IgdGhlIHRwX2l0ZXIgc2xvdCAoaW4gQykuCiAgSXRlcmF0aW5nIChpLmUuIGEgZm9yIGxvb3ApIG92ZXIgYSBkaWN0aW9uYXJ5IGdlbmVyYXRlcyBpdHMga2V5cy4KICBJdGVyYXRpbmcgb3ZlciBhIGZpbGUgZ2VuZXJhdGVzIGl0cyBsaW5lcy4KCi0gVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgd2VyZSBnZW5lcmFsaXplZCB0byB3b3JrIG5pY2VseSB3aXRoIGl0ZXJhdG9yCiAgYXJndW1lbnRzOgogICAgbWFwKCksIGZpbHRlcigpLCByZWR1Y2UoKSwgemlwKCkKICAgIGxpc3QoKSwgdHVwbGUoKSAoUHlTZXF1ZW5jZV9UdXBsZSgpIGFuZCBQeVNlcXVlbmNlX0Zhc3QoKSBpbiBDIEFQSSkKICAgIG1heCgpLCBtaW4oKQogICAgam9pbigpIG1ldGhvZCBvZiBzdHJpbmdzCiAgICBleHRlbmQoKSBtZXRob2Qgb2YgbGlzdHMKICAgICd4IGluIHknIGFuZCAneCBub3QgaW4geScgKFB5U2VxdWVuY2VfQ29udGFpbnMoKSBpbiBDIEFQSSkKICAgIG9wZXJhdG9yLmNvdW50T2YoKSAoUHlTZXF1ZW5jZV9Db3VudCgpIGluIEMgQVBJKQogICAgcmlnaHQtaGFuZCBzaWRlIG9mIGFzc2lnbm1lbnQgc3RhdGVtZW50cyB3aXRoIG11bHRpcGxlIHRhcmdldHMsIHN1Y2ggYXMKICAgICAgICB4LCB5LCB6ID0gc29tZV9pdGVyYWJsZV9vYmplY3RfcmV0dXJuaW5nX2V4YWN0bHlfM192YWx1ZXMKCi0gQWNjZXNzaW5nIG1vZHVsZSBhdHRyaWJ1dGVzIGlzIHNpZ25pZmljYW50bHkgZmFzdGVyIChmb3IgZXhhbXBsZSwKICByYW5kb20ucmFuZG9tIG9yIG9zLnBhdGggb3IgeW91clB5dGhvbk1vZHVsZS55b3VyQXR0cmlidXRlKS4KCi0gQ29tcGFyaW5nIGRpY3Rpb25hcnkgb2JqZWN0cyB2aWEgPT0gYW5kICE9IGlzIGZhc3RlciwgYW5kIG5vdyB3b3JrcyBldmVuCiAgaWYgdGhlIGtleXMgYW5kIHZhbHVlcyBkb24ndCBzdXBwb3J0IGNvbXBhcmlzb25zIG90aGVyIHRoYW4gPT0uCgotIENvbXBhcmluZyBkaWN0aW9uYXJpZXMgaW4gd2F5cyBvdGhlciB0aGFuID09IGFuZCAhPSBpcyBzbG93ZXI6ICB0aGVyZSB3ZXJlCiAgaW5zZWN1cml0aWVzIGluIHRoZSBkaWN0IGNvbXBhcmlzb24gaW1wbGVtZW50YXRpb24gdGhhdCBjb3VsZCBjYXVzZSBQeXRob24KICB0byBjcmFzaCBpZiB0aGUgZWxlbWVudCBjb21wYXJpc29uIHJvdXRpbmVzIGZvciB0aGUgZGljdCBrZXlzIGFuZC9vcgogIHZhbHVlcyBtdXRhdGVkIHRoZSBkaWN0cy4gIE1ha2luZyB0aGUgY29kZSBidWxsZXRwcm9vZiBzbG93ZWQgaXQgZG93bi4KCi0gQ29sbGlzaW9ucyBpbiBkaWN0cyBhcmUgcmVzb2x2ZWQgdmlhIGEgbmV3IGFwcHJvYWNoLCB3aGljaCBjYW4gaGVscAogIGRyYW1hdGljYWxseSBpbiBiYWQgY2FzZXMuICBGb3IgZXhhbXBsZSwgbG9va2luZyB1cCBldmVyeSBrZXkgaW4gYSBkaWN0CiAgZCB3aXRoIGQua2V5cygpID09IFtpIDw8IDE2IGZvciBpIGluIHJhbmdlKDIwMDAwKV0gaXMgYXBwcm94aW1hdGVseSA1MDB4CiAgZmFzdGVyIG5vdy4gIFRoYW5rcyB0byBDaHJpc3RpYW4gVGlzbWVyIGZvciBwb2ludGluZyBvdXQgdGhlIGNhdXNlIGFuZAogIHRoZSBuYXR1cmUgb2YgYW4gZWZmZWN0aXZlIGN1cmUgKGxhc3QgRGVjZW1iZXIhIGJldHRlciBsYXRlIHRoYW4gbmV2ZXIpLgoKLSByZXByKCkgaXMgbXVjaCBmYXN0ZXIgZm9yIGxhcmdlIGNvbnRhaW5lcnMgKGRpY3QsIGxpc3QsIHR1cGxlKS4KCgpMaWJyYXJ5CgotIFRoZSBjb25zdGFudHMgYXNjaWlfbGV0dGVycywgYXNjaWlfbG93ZXJjYXNlLiBhbmQgYXNjaWlfdXBwZXJjYXNlCiAgd2VyZSBhZGRlZCB0byB0aGUgc3RyaW5nIG1vZHVsZS4gIFRoZXNlIGEgbG9jYWxlLWluZGVucGVuZGVudAogIGNvbnN0YW50cywgdW5saWtlIGxldHRlcnMsIGxvd2VyY2FzZSwgYW5kIHVwcGVyY2FzZS4gIFRoZXNlIGFyZSBub3cKICB1c2UgaW4gYXBwcm9wcmlhdGUgbG9jYXRpb25zIGluIHRoZSBzdGFuZGFyZCBsaWJyYXJ5LgoKLSBUaGUgZmxhZ3MgdXNlZCBpbiBkbG9wZW4gY2FsbHMgY2FuIG5vdyBiZSBjb25maWd1cmVkIHVzaW5nCiAgc3lzLnNldGRsb3BlbmZsYWdzIGFuZCBxdWVyaWVkIHVzaW5nIHN5cy5nZXRkbG9wZW5mbGFncy4KCi0gRnJlZHJpayBMdW5kaCdzIHhtbHJwY2xpYiBpcyBub3cgYSBzdGFuZGFyZCBsaWJyYXJ5IG1vZHVsZS4gIFRoaXMKICBwcm92aWRlcyBmdWxsIGNsaWVudC1zaWRlIFhNTC1SUEMgc3VwcG9ydC4gIEluIGFkZGl0aW9uLAogIERlbW8veG1scnBjLyBjb250YWlucyB0d28gc2VydmVyIGZyYW1ld29ya3MgKG9uZSBTb2NrZXRTZXJ2ZXItYmFzZWQsCiAgb25lIGFzeW5jb3JlLWJhc2VkKS4gIFRoYW5rcyB0byBFcmljIFJheW1vbmQgZm9yIHRoZSBkb2N1bWVudGF0aW9uLgoKLSBUaGUgeHJhbmdlKCkgb2JqZWN0IGlzIHNpbXBsaWZpZWQ6IGl0IG5vIGxvbmdlciBzdXBwb3J0cyBzbGljaW5nLAogIHJlcGV0aXRpb24sIGNvbXBhcmlzb25zLCBlZmZpY2llbnQgJ2luJyBjaGVja2luZywgdGhlIHRvbGlzdCgpCiAgbWV0aG9kLCBvciB0aGUgc3RhcnQsIHN0b3AgYW5kIHN0ZXAgYXR0cmlidXRlcy4gIFNlZSBQRVAgMjYwLgoKLSBBIG5ldyBmdW5jdGlvbiBmbm1hdGNoLmZpbHRlciB0byBmaWx0ZXIgbGlzdHMgb2YgZmlsZSBuYW1lcyB3YXMgYWRkZWQuCgotIGNhbGVuZGFyLnB5IHVzZXMgbW9udGggYW5kIGRheSBuYW1lcyBiYXNlZCBvbiB0aGUgY3VycmVudCBsb2NhbGUuCgotIHN0cm9wIGlzIG5vdyAqcmVhbGx5KiBvYnNvbGV0ZSAodGhpcyB3YXMgYW5ub3VuY2VkIGJlZm9yZSB3aXRoIDEuNiksCiAgYW5kIGlzc3VlcyBEZXByZWNhdGlvbldhcm5pbmcgd2hlbiB1c2VkIChleGNlcHQgZm9yIHRoZSBmb3VyIGl0ZW1zCiAgdGhhdCBhcmUgc3RpbGwgaW1wb3J0ZWQgaW50byBzdHJpbmcucHkpLgoKLSBDb29raWUucHkgbm93IHNvcnRzIGtleSt2YWx1ZSBwYWlycyBieSBrZXkgaW4gb3V0cHV0IHN0cmluZ3MuCgotIHBwcmludC5pc3JlY3Vyc2l2ZShvYmplY3QpIGRpZG4ndCBjb3JyZWN0bHkgaWRlbnRpZnkgcmVjdXJzaXZlIG9iamVjdHMuCiAgTm93IGl0IGRvZXMuCgotIHBwcmludCBmdW5jdGlvbnMgbm93IG11Y2ggZmFzdGVyIGZvciBsYXJnZSBjb250YWluZXJzICh0dXBsZSwgbGlzdCwgZGljdCkuCgotIE5ldyAncScgYW5kICdRJyBmb3JtYXQgY29kZXMgaW4gdGhlIHN0cnVjdCBtb2R1bGUsIGNvcnJlc3BvbmRpbmcgdG8gQwogIHR5cGVzICJsb25nIGxvbmciIGFuZCAidW5zaWduZWQgbG9uZyBsb25nIiAob24gV2luZG93cywgX19pbnQ2NCkuICBJbgogIG5hdGl2ZSBtb2RlLCB0aGVzZSBjYW4gYmUgdXNlZCBvbmx5IHdoZW4gdGhlIHBsYXRmb3JtIEMgY29tcGlsZXIgc3VwcG9ydHMKICB0aGVzZSB0eXBlcyAod2hlbiBIQVZFX0xPTkdfTE9ORyBpcyAjZGVmaW5lJ2QgYnkgdGhlIFB5dGhvbiBjb25maWcKICBwcm9jZXNzKSwgYW5kIHRoZW4gdGhleSBpbmhlcml0IHRoZSBzaXplcyBhbmQgYWxpZ25tZW50cyBvZiB0aGUgQyB0eXBlcy4KICBJbiBzdGFuZGFyZCBtb2RlLCAncScgYW5kICdRJyBhcmUgc3VwcG9ydGVkIG9uIGFsbCBwbGF0Zm9ybXMsIGFuZCBhcmUKICA4LWJ5dGUgaW50ZWdyYWwgdHlwZXMuCgotIFRoZSBzaXRlIG1vZHVsZSBpbnN0YWxscyBhIG5ldyBidWlsdC1pbiBmdW5jdGlvbiAnaGVscCcgdGhhdCBpbnZva2VzCiAgcHlkb2MuaGVscC4gIEl0IG11c3QgYmUgaW52b2tlZCBhcyAnaGVscCgpJzsgd2hlbiBpbnZva2VkIGFzICdoZWxwJywKICBpdCBkaXNwbGF5cyBhIG1lc3NhZ2UgcmVtaW5kaW5nIHRoZSB1c2VyIHRvIHVzZSAnaGVscCgpJyBvcgogICdoZWxwKG9iamVjdCknLgoKVGVzdHMKCi0gTmV3IHRlc3RfbXV0YW50cy5weSBydW5zIGRpY3QgY29tcGFyaXNvbnMgd2hlcmUgdGhlIGtleSBhbmQgdmFsdWUKICBjb21wYXJpc29uIG9wZXJhdG9ycyBtdXR1dGUgdGhlIGRpY3RzIHJhbmRvbWx5IGR1cmluZyBjb21wYXJpc29uLiAgVGhpcwogIHJhcGlkbHkgY2F1c2VzIFB5dGhvbiB0byBjcmFzaCB1bmRlciBlYXJsaWVyIHJlbGVhc2VzIChub3QgZm9yIHRoZSBmYWludAogIG9mIGhlYXJ0OiAgaXQgY2FuIGFsc28gY2F1c2UgV2luOXggdG8gZnJlZXplIG9yIHJlYm9vdCEpLgoKLSBOZXcgdGVzdF9wcHJpbnQucHkgdmVyZmllcyB0aGF0IHBwcmludC5pc3JlY3Vyc2l2ZSgpIGFuZAogIHBwcmludC5pc3JlYWRhYmxlKCkgcmV0dXJuIHNlbnNpYmxlIHJlc3VsdHMuICBBbHNvIHZlcmlmaWVzIHRoYXQgc2ltcGxlCiAgY2FzZXMgcHJvZHVjZSBjb3JyZWN0IG91dHB1dC4KCk5ldyBwbGF0Zm9ybXMKCi0gUHl0aG9uIHNob3VsZCBjb21waWxlIGFuZCBydW4gb3V0IG9mIHRoZSBib3ggdXNpbmcgdGhlIEJvcmxhbmQgQwogIGNvbXBpbGVyICh1bmRlciBXaW5kb3dzKSwgdGhhbmtzIHRvIFN0ZXBoZW4gSGFuc2VuLgoKQyBBUEkKCi0gUmVtb3ZlZCB0aGUgdW51c2VkIGxhc3RfaXNfc3RpY2t5IGFyZ3VtZW50IGZyb20gdGhlIGludGVybmFsCiAgX1B5VHVwbGVfUmVzaXplKCkuICBJZiB0aGlzIGFmZmVjdHMgeW91LCB5b3Ugd2VyZSBjaGVhdGluZy4KCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoKV2hhdCdzIE5ldyBpbiBQeXRob24gMi4xIChmaW5hbCk/Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKV2Ugb25seSBjaGFuZ2VkIGEgZmV3IHRoaW5ncyBzaW5jZSB0aGUgbGFzdCByZWxlYXNlIGNhbmRpZGF0ZSwgYWxsIGluClB5dGhvbiBsaWJyYXJ5IGNvZGU6CgotIEEgYnVnIGluIHRoZSBsb2NhbGUgbW9kdWxlIHdhcyBmaXhlZCB0aGF0IGFmZmVjdGVkIGxvY2FsZXMgd2hpY2gKICBkZWZpbmUgbm8gZ3JvdXBpbmcgZm9yIG51bWVyaWMgZm9ybWF0dGluZy4KCi0gQSBmZXcgYnVncyBpbiB0aGUgd2Vha3JlZiBtb2R1bGUncyBpbXBsZW1lbnRhdGlvbnMgb2Ygd2VhawogIGRpY3Rpb25hcmllcyAoV2Vha1ZhbHVlRGljdGlvbmFyeSBhbmQgV2Vha0tleURpY3Rpb25hcnkpIHdlcmUgZml4ZWQsCiAgYW5kIHRoZSB0ZXN0IHN1aXRlIHdhcyB1cGRhdGVkIHRvIGNoZWNrIGZvciB0aGVzZSBidWdzLgoKLSBBbiBvbGQgYnVnIGluIHRoZSBvcy5wYXRoLndhbGsoKSBmdW5jdGlvbiAoaW50cm9kdWNlZCBpbiBQeXRob24KICAyLjAhKSB3YXMgZml4ZWQ6IGEgbm9uLWV4aXN0ZW50IGZpbGUgd291bGQgY2F1c2UgYW4gZXhjZXB0aW9uCiAgaW5zdGVhZCBvZiBiZWluZyBpZ25vcmVkLgoKLSBGaXhlZCBhIGZldyBidWdzIGluIHRoZSBuZXcgc3ltdGFibGUgbW9kdWxlIGZvdW5kIGJ5IE5laWwgTm9yd2l0eidzCiAgUHlDaGVja2VyLgoKCldoYXQncyBOZXcgaW4gUHl0aG9uIDIuMWMyPwo9PT09PT09PT09PT09PT09PT09PT09PT09PT0KCkEgZmx1cnJ5IG9mIHNtYWxsIGNoYW5nZXMsIGFuZCBvbmUgc2hvd3N0b3BwZXIgZml4ZWQgaW4gdGhlIG5pY2sgb2YKdGltZSBtYWRlIGl0IG5lY2Vzc2FyeSB0byByZWxlYXNlIGFub3RoZXIgcmVsZWFzZSBjYW5kaWRhdGUuICBUaGUgbGlzdApoZXJlIGlzIHRoZSAqY29tcGxldGUqIGxpc3Qgb2YgcGF0Y2hlcyAoZXhjZXB0IHZlcnNpb24gdXBkYXRlcyk6CgpDb3JlCgotIFRpbSBkaXNjb3ZlcmVkIGEgbmFzdHkgYnVnIGluIHRoZSBkaWN0aW9uYXJ5IGNvZGUsIGNhdXNlZCBieQogIFB5RGljdF9OZXh0KCkgY2FsbGluZyBkaWN0X3Jlc2l6ZSgpLCBhbmQgdGhlIEdDIGNvZGUncyB1c2Ugb2YKICBQeURpY3RfTmV4dCgpIHZpb2xhdGluZyBhbiBhc3N1bXB0aW9uIGluIGRpY3RfaXRlbXMoKS4gIFRoaXMgd2FzCiAgZml4ZWQgd2l0aCBjb25zaWRlcmFibGUgYW1vdW50cyBvZiBiYW5kLWFpZCwgYnV0IHRoZSBuZXQgZWZmZWN0IGlzIGEKICBzYW5lciBhbmQgbW9yZSByb2J1c3QgaW1wbGVtZW50YXRpb24uCgotIE1hZGUgYSBidW5jaCBvZiBzeW1ib2xzIHN0YXRpYyB0aGF0IHdlcmUgYWNjaWRlbnRhbGx5IGdsb2JhbC4KCkJ1aWxkIGFuZCBQb3J0cwoKLSBUaGUgc2V0dXAucHkgc2NyaXB0IGRpZG4ndCBjaGVjayBmb3IgYSBuZXcgZW5vdWdoIHZlcnNpb24gb2YgemxpYgogICgxLjEuMyBpcyBuZWVkZWQpLiAgTm93IGl0IGRvZXMuCgotIENoYW5nZWQgIm1ha2UgY2xlYW4iIHRhcmdldCB0byBhbHNvIHJlbW92ZSBzaGFyZWQgbGlicmFyaWVzLgoKLSBBZGRlZCBhIG1vcmUgZ2VuZXJhbCB3YXJuaW5nIGFib3V0IHRoZSBTR0kgSXJpeCBvcHRpbWl6ZXIgdG8gUkVBRE1FLgoKTGlicmFyeQoKLSBGaXggYSBidWcgaW4gdXJsbGliLmJhc2Vqb2luKCJodHRwOi8vaG9zdCIsICIuLi9maWxlLmh0bWwiKSB3aGljaAogIG9taXR0ZWQgdGhlIHNsYXNoIGJldHdlZW4gaG9zdCBhbmQgZmlsZS5odG1sLgoKLSBUaGUgbWFpbGJveCBtb2R1bGUncyBfTWFpbGJveCBjbGFzcyBjb250YWluZWQgYSBjb21wbGV0ZWx5IGJyb2tlbgogIGFuZCB1bmRvY3VtZW50ZWQgc2VlaygpIG1ldGhvZC4gIFJpcHBlZCBpdCBvdXQuCgotIEZpeGVkIGEgYnVuY2ggb2YgdHlwb3MgaW4gdmFyaW91cyBsaWJyYXJ5IG1vZHVsZXMgKHVybGxpYjIsIHNtdHBkLAogIHNnbWxsaWIsIG5ldHJjLCBjaHVuaykgZm91bmQgYnkgTmVpbCBOb3J3aXR6J3MgUHlDaGVja2VyLgoKLSBGaXhlZCBhIGZldyBsYXN0LW1pbnV0ZSBidWdzIGluIHVuaXR0ZXN0LgoKRXh0ZW5zaW9ucwoKLSBSZXZlcnRlZCB0aGUgcGF0Y2ggdG8gdGhlIE9wZW5TU0wgY29kZSBpbiBzb2NrZXRtb2R1bGUuYyB0byBzdXBwb3J0CiAgUkFORF9zdGF0dXMoKSBhbmQgdGhlIEVHRCwgYW5kIHRoZSBzdWJzZXF1ZW50IHBhdGNoIHRoYXQgdHJpZWQgdG8KICBmaXggaXQgZm9yIHByZS0wLjkuNSB2ZXJzaW9uczsgdGhlIHByb2JsZW0gd2l0aCB0aGUgcGF0Y2ggaXMgdGhhdCBvbgogIHNvbWUgc3lzdGVtcyBpdCBpc3N1ZXMgYSB3YXJuaW5nIHdoZW5ldmVyIHNvY2tldCBpcyBpbXBvcnRlZCwgYW5kCiAgdGhhdCdzIHVuYWNjZXB0YWJsZS4KClRlc3RzCgotIEZpeGVkIHRoZSBwaWNrbGUgdGVzdHMgdG8gd29yayB3aXRoICJpbXBvcnQgdGVzdC50ZXN0X3BpY2tsZSIuCgotIFR3ZWFrZWQgdGVzdF9sb2NhbGUucHkgdG8gYWN0dWFsbHkgcnVuIHRoZSB0ZXN0IFdpbmRvd3MuCgotIEluIGRpc3R1dGlscy9hcmNoaXZlX3V0aWwucHksIGNhbGwgemlwZmlsZS5aaXBGaWxlKCkgd2l0aCBtb2RlICJ3IiwKICBub3QgIndiIiAod2hpY2ggaXMgbm90IGEgdmFsaWQgbW9kZSBhdCBhbGwpLgoKLSBGaXggcHN0YXRzIGJyb3dzZXIgY3Jhc2hlcy4gIEltcG9ydCByZWFkbGluZSBpZiBpdCBleGlzdHMgdG8gbWFrZQogIHRoZSB1c2VyIGludGVyZmFjZSBuaWNlci4KCi0gQWRkICJpbXBvcnQgdGhyZWFkIiB0byB0aGUgdG9wIG9mIHRlc3QgbW9kdWxlcyB0aGF0IGltcG9ydCB0aGUKICB0aHJlYWRpbmcgbW9kdWxlICh0ZXN0X2FzeW5jaGF0IGFuZCB0ZXN0X3RocmVhZGVkdGVtcGZpbGUpLiAgVGhpcwogIHByZXZlbnRzIHRlc3QgZmFpbHVyZXMgY2F1c2VkIGJ5IGEgYnJva2VuIHRocmVhZGluZyBtb2R1bGUgcmVzdWx0aW5nCiAgZnJvbSBhIHByZXZpb3VzbHkgY2F1Z2h0IGZhaWxlZCBpbXBvcnQuCgotIENoYW5nZWQgdGVzdF9hc3luY2hhdC5weSB0byBzZXQgdGhlIFNPX1JFVVNFQUREUiBvcHRpb247IHRoaXMgd2FzCiAgbmVlZGVkIG9uIHNvbWUgcGxhdGZvcm1zIChlLmcuIFNvbGFyaXMgOCkgd2hlbiB0aGUgdGVzdHMgYXJlIHJ1bgogIHR3aWNlIGluIHN1Y2Nlc3Npb24uCgotIFNraXAgcmF0aGVyIHRoYW4gZmFpbCB0ZXN0X3N1bmF1ZGlvZGV2IGlmIG5vIGF1ZGlvIGRldmljZSBpcyBmb3VuZC4KCgpXaGF0J3MgTmV3IGluIFB5dGhvbiAyLjFjMT8KPT09PT09PT09PT09PT09PT09PT09PT09PT09CgpUaGlzIGxpc3Qgd2FzIHNpZ25pZmljYW50bHkgdXBkYXRlZCB3aGVuIDIuMWMyIHdhcyByZWxlYXNlZDsgdGhlIDIuMWMxCnJlbGVhc2UgZGlkbid0IG1lbnRpb24gbW9zdCBjaGFuZ2VzIHRoYXQgd2VyZSBhY3R1YWxseSBwYXJ0IG9mIDIuMWMxOgoKTGVnYWwKCi0gQ29weXJpZ2h0IHdhcyBhc3NpZ25lZCB0byB0aGUgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24gKFBTRikgYW5kIGEKICBQU0YgbGljZW5zZSAodmVyeSBzaW1pbGFyIHRvIHRoZSBDTlJJIGxpY2Vuc2UpIHdhcyBhZGRlZC4KCi0gVGhlIENOUkkgY29weXJpZ2h0IG5vdGljZSB3YXMgdXBkYXRlZCB0byBpbmNsdWRlIDIwMDEuCgpDb3JlCgotIEFmdGVyIGEgcHVibGljIG91dGNyeSwgYXNzaWdubWVudCB0byBfX2RlYnVnX18gaXMgbm8gbG9uZ2VyIGlsbGVnYWw7CiAgaW5zdGVhZCwgYSB3YXJuaW5nIGlzIGlzc3VlZC4gIEl0IHdpbGwgYmVjb21lIGlsbGVnYWwgaW4gMi4yLgoKLSBGaXhlZCBhIGNvcmUgZHVtcCB3aXRoICIlI3giICUgMCwgYW5kIGNoYW5nZWQgdGhlIHNlbWFudGljcyBzbyB0aGF0CiAgIiUjeCIgbm93IGFsd2F5cyBwcmVwZW5kcyAiMHgiLCBldmVuIGlmIHRoZSB2YWx1ZSBpcyB6ZXJvLgoKLSBGaXhlZCBzb21lIG5pdHMgaW4gdGhlIGJ5dGVjb2RlIGNvbXBpbGVyLgoKLSBGaXhlZCBjb3JlIGR1bXBzIHdoZW4gY2FsbGluZyBjZXJ0YWluIGtpbmRzIG9mIG5vbi1mdW5jdGlvbnMuCgotIEZpeGVkIHZhcmlvdXMgY29yZSBkdW1wcyBjYXVzZWQgYnkgcmVmZXJlbmNlIGNvdW50IGJ1Z3MuCgpCdWlsZCBhbmQgUG9ydHMKCi0gVXNlIElOU1RBTExfU0NSSVBUIHRvIGluc3RhbGwgc2NyaXB0IGZpbGVzLgoKLSBOZXcgcG9ydDogU0NPIFVuaXh3YXJlIDcsIGJ5IEJpbGx5IEcuIEFsbGllLgoKLSBVcGRhdGVkIFJJU0NPUyBwb3J0LgoKLSBVcGRhdGVkIEJlT1MgcG9ydCBhbmQgbm90ZXMuCgotIFZhcmlvdXMgb3RoZXIgcG9ydGluZyBwcm9ibGVtcyByZXNvbHZlZC4KCkxpYnJhcnkKCi0gVGhlIFRFUk1JT1MgYW5kIFNPQ0tFVCBtb2R1bGVzIGFyZSBub3cgdHJ1bHkgb2Jzb2xldGUgYW5kCiAgdW5uZWNlc3NhcnkuICBUaGVpciBzeW1ib2xzIGFyZSBpbmNvcnBvcmF0ZWQgaW4gdGhlIHRlcm1pb3MgYW5kCiAgc29ja2V0IG1vZHVsZXMuCgotIEZpeGVkIHNvbWUgNjQtYml0IGJ1Z3MgaW4gcGlja2xlLCBjUGlja2xlLCBhbmQgc3RydWN0LCBhbmQgYWRkZWQKICBiZXR0ZXIgdGVzdHMgZm9yIHBpY2tsaW5nLgoKLSB0aHJlYWRpbmc6IG1ha2UgQ29uZGl0aW9uLndhaXQoKSByb2J1c3QgYWdhaW5zdCBLZXlib2FyZEludGVycnVwdC4KCi0gemlwZmlsZTogYWRkIHN1cHBvcnQgdG8gemlwZmlsZSB0byBzdXBwb3J0IG9wZW5pbmcgYW4gYXJjaGl2ZQogIHJlcHJlc2VudGVkIGJ5IGFuIG9wZW4gZmlsZSByYXRoZXIgdGhhbiBhIGZpbGUgbmFtZS4gIEZpeCBidWcgd2hlcmUKICB0aGUgYXJjaGl2ZSB3YXMgbm90IHByb3Blcmx5IGNsb3NlZC4gIEZpeGVkIGEgYnVnIGluIHRoaXMgYnVnZml4CiAgd2hlcmUgZmx1c2goKSB3YXMgY2FsbGVkIGZvciBhIHJlYWQtb25seSBmaWxlLgoKLSBpbXB1dGlsOiBhZGRlZCBhbiB1bmluc3RhbGwoKSBtZXRob2QgdG8gdGhlIEltcG9ydE1hbmFnZXIuCgotIENhbnZhczogZml4ZWQgYnVncyBpbiBsb3dlcigpIGFuZCB0a3JhaXNlKCkgbWV0aG9kcy4KCi0gU29ja2V0U2VydmVyOiBBUEkgY2hhbmdlIChhZGRlZCBvdmVycmlkYWJsZSBjbG9zZV9yZXF1ZXN0KCkgbWV0aG9kKQogIHNvIHRoYXQgdGhlIFRDUCBzZXJ2ZXIgY2FuIGV4cGxpY2l0bHkgY2xvc2UgdGhlIHJlcXVlc3QuCgotIHBzdGF0czogRXJpYyBSYXltb25kIGFkZGVkIGEgc2ltcGxlIGludGVyYWN0aXZlIHN0YXRpc3RpY3MgYnJvd3NlciwKICBpbnZva2VkIHdoZW4gdGhlIG1vZHVsZSBpcyBydW4gYXMgYSBzY3JpcHQuCgotIGxvY2FsZTogZml4ZWQgYSBwcm9ibGVtIGluIGZvcm1hdCgpLgoKLSB3ZWJicm93c2VyOiBtYWRlIGl0IHdvcmsgd2hlbiB0aGUgQlJPV1NFUiBlbnZpcm9ubWVudCB2YXJpYWJsZSBoYXMgYQogIHZhbHVlIGxpa2UgIi91c3IvYmluL25ldHNjYXBlIi4gIE1hZGUgaXQgYXV0by1kZXRlY3QgS29ucXVlcm9yIGZvcgogIEtERSAyLiAgRml4ZWQgc29tZSBvdGhlciBuaXRzLgoKLSB1bml0dGVzdDogY2hhbmdlcyB0byBhbGxvdyB1c2luZyBhIGRpZmZlcmVudCBleGNlcHRpb24gdGhhbgogIEFzc2VydGlvbkVycm9yLCBhbmQgYWRkZWQgYSBmZXcgbW9yZSBmdW5jdGlvbiBhbGlhc2VzLiAgU29tZSBvdGhlcgogIHNtYWxsIGNoYW5nZXMuCgotIHVybGxpYiwgdXJsbGliMjogZml4ZWQgcmVkaXJlY3QgcHJvYmxlbXMgYW5kIGEgY291cGxlb2Ygb3RoZXIgbml0cy4KCi0gYXN5bmNoYXQ6IGZpeGVkIGEgY3JpdGljYWwgYnVnIGluIGFzeW5jaGF0IHRoYXQgc2xpcHBlZCB0aHJvdWdoIHRoZQogIDIuMWIyIHJlbGVhc2UuICBGaXhlZCBhbm90aGVyIHJhcmUgYnVnLgoKLSBGaXggc29tZSB1bnF1YWxpZmllZCBleGNlcHQ6IGNsYXVzZXMgKGFsd2F5cyBhIGJhZCBjb2RlIGV4YW1wbGUpLgoKWE1MCgotIHB5ZXhwYXQ6IG5ldyBBUEkgZ2V0X3ZlcnNpb25fc3RyaW5nKCkuCgotIEZpeGVkIHNvbWUgbWluaWRvbSBidWdzLgoKRXh0ZW5zaW9ucwoKLSBGaXhlZCBhIGNvcmUgZHVtcCBpbiBfd2Vha3JlZi4gIFJlbW92ZWQgdGhlIHdlYWtyZWYubWFwcGluZygpCiAgZnVuY3Rpb24gKGl0IGFkZHMgbm90aGluZyB0byB0aGUgQVBJKS4KCi0gUmF0aW9uYWxpemVkIHRoZSB1c2Ugb2YgaGVhZGVyIGZpbGVzIGluIHRoZSByZWFkbGluZSBtb2R1bGUsIHRvIG1ha2UKICBpdCBjb21waWxlIChhbGJlaXQgd2l0aCBzb21lIHdhcm5pbmdzKSB3aXRoIHRoZSB2ZXJ5IHJlY2VudCByZWFkbGluZQogIDQuMiwgd2l0aG91dCBicmVha2luZyBmb3IgZWFybGllciB2ZXJzaW9ucy4KCi0gSG9wZWZ1bGx5IGZpeGVkIGEgYnVmZmVyaW5nIHByb2JsZW0gaW4gbGludXhhdWRpb2Rldi4KCi0gQXR0ZW1wdGVkIGEgZml4IHRvIG1ha2UgdGhlIE9wZW5TU0wgc3VwcG9ydCBpbiB0aGUgc29ja2V0IG1vZHVsZQogIHdvcmsgYWdhaW4gd2l0aCBwcmUtMC45LjUgdmVyc2lvbnMgb2YgT3BlblNTTC4KClRlc3RzCgotIEFkZGVkIGEgdGVzdCBjYXNlIGZvciBhc3luY2hhdCBhbmQgYXN5bmNvcmUuCgotIFJlbW92ZWQgY291cGxpbmcgYmV0d2VlbiB0ZXN0cyB3aGVyZSBvbmUgdGVzdCBmYWlsaW5nIGNvdWxkIGJyZWFrCiAgYW5vdGhlci4KClRvb2xzCgotIFBpbmcgYWRkZWQgYW4gaW50ZXJhY3RpdmUgaGVscCBicm93c2VyIHRvIHB5ZG9jLCBmaXhlZCBzb21lIG5pdHMKICBpbiB0aGUgcmVzdCBvZiB0aGUgcHlkb2MgY29kZSwgYW5kIGFkZGVkIHNvbWUgZmVhdHVyZXMgdG8gaGlzCiAgaW5zcGVjdCBtb2R1bGUuCgotIEFuIHVwZGF0ZWQgcHl0aG9uLW1vZGUuZWwgdmVyc2lvbiA0LjEgd2hpY2ggaW50ZWdyYXRlcyBLZW4KICBNYW5oZWltZXIncyBwZGJ0cmFjay5lbC4gIFRoaXMgbWFrZXMgZGVidWdnaW5nIFB5dGhvbiBjb2RlIHZpYSBwZGIKICBtdWNoIG5pY2VyIGluIFhFbWFjcyBhbmQgRW1hY3MuICBXaGVuIHN0ZXBwaW5nIHRocm91Z2ggeW91ciBwcm9ncmFtCiAgd2l0aCBwZGIsIGluIGVpdGhlciB0aGUgc2hlbGwgd2luZG93IG9yIHRoZSAqUHl0aG9uKiB3aW5kb3csIHRoZQogIHNvdXJjZSBmaWxlIGFuZCBsaW5lIHdpbGwgYmUgdHJhY2tlZCBieSBhbiBhcnJvdy4gIFZlcnkgY29vbCEKCi0gSURMRTogc3ludGF4IHdhcm5pbmdzIGluIGludGVyYWN0aXZlIG1vZGUgYXJlIGNoYW5nZWQgaW50byBlcnJvcnMuCgotIFNvbWUgaW1wcm92ZW1lbnRzIHRvIFRvb2xzL3dlYmNoZWNrZXIgKGlnbm9yZSBzb21lIG1vcmUgVVJMIHR5cGVzLAogIGZvbGxvdyBzb21lIG1vcmUgbGlua3MpLgoKLSBCcm91Z2h0IHRoZSBUb29scy9jb21waWxlciBwYWNrYWdlIHVwIHRvIGRhdGUuCgoKV2hhdCdzIE5ldyBpbiBQeXRob24gMi4xIGJldGEgMj8KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCihVbmxpc3RlZCBhcmUgbWFueSBmaXhlZCBidWdzLCBtb3JlIGRvY3VtZW50YXRpb24sIGV0Yy4pCgpDb3JlIGxhbmd1YWdlLCBidWlsdGlucywgYW5kIGludGVycHJldGVyCgotIFRoZSBuZXN0ZWQgc2NvcGVzIHdvcmsgKGVuYWJsZWQgYnkgImZyb20gX19mdXR1cmVfXyBpbXBvcnQKICBuZXN0ZWRfc2NvcGVzIikgaXMgY29tcGxldGVkOyBpbiBwYXJ0aWN1bGFyLCB0aGUgZnV0dXJlIG5vdyBleHRlbmRzCiAgaW50byBjb2RlIGV4ZWN1dGVkIHRocm91Z2ggZXhlYywgZXZhbCgpIGFuZCBleGVjZmlsZSgpLCBhbmQgaW50byB0aGUKICBpbnRlcmFjdGl2ZSBpbnRlcnByZXRlci4KCi0gV2hlbiBjYWxsaW5nIGEgYmFzZSBjbGFzcyBtZXRob2QgKGUuZy4gQmFzZUNsYXNzLl9faW5pdF9fKHNlbGYpKSwKICB0aGlzIGlzIG5vdyBhbGxvd2VkIGV2ZW4gaWYgc2VsZiBpcyBub3Qgc3RyaWN0bHkgc3Bva2VuIGEgY2xhc3MKICBpbnN0YW5jZSAoZS5nLiB3aGVuIHVzaW5nIG1ldGFjbGFzc2VzIG9yIHRoZSBEb24gQmVhdWRyeSBob29rKS4KCi0gU2xpY2Ugb2JqZWN0cyBhcmUgbm93IGNvbXBhcmFibGUgYnV0IG5vdCBoYXNoYWJsZTsgdGhpcyBwcmV2ZW50cwogIGRpY3RbOl0gZnJvbSBiZWluZyBhY2NlcHRlZCBidXQgbWVhbmluZ2xlc3MuCgotIENvbXBsZXggZGl2aXNpb24gaXMgbm93IGNhbGN1bGF0ZWQgdXNpbmcgbGVzcyBicmFpbmRlYWQgYWxnb3JpdGhtcy4KICBUaGlzIGRvZXNuJ3QgY2hhbmdlIHNlbWFudGljcyBleGNlcHQgaXQncyBtb3JlIGxpa2VseSB0byBnaXZlIHVzZWZ1bAogIHJlc3VsdHMgaW4gZXh0cmVtZSBjYXNlcy4gIENvbXBsZXggcmVwcigpIG5vdyB1c2VzIGZ1bGwgcHJlY2lzaW9uCiAgbGlrZSBmbG9hdCByZXByKCkuCgotIHNnbWxsaWIucHkgbm93IGNhbGxzIGhhbmRsZV9kZWNsKCkgZm9yIHNpbXBsZSA8IS4uLj4gZGVjbGFyYXRpb25zLgoKLSBJdCBpcyBpbGxlZ2FsIHRvIGFzc2lnbiB0byB0aGUgbmFtZSBfX2RlYnVnX18sIHdoaWNoIGlzIHNldCB3aGVuIHRoZQogIGludGVycHJldGVyIHN0YXJ0cy4gIEl0IGlzIGVmZmVjdGl2ZWx5IGEgY29tcGlsZS10aW1lIGNvbnN0YW50LgoKLSBBIHdhcm5pbmcgd2lsbCBiZSBpc3N1ZWQgaWYgYSBnbG9iYWwgc3RhdGVtZW50IGZvciBhIHZhcmlhYmxlCiAgZm9sbG93cyBhIHVzZSBvciBhc3NpZ25tZW50IG9mIHRoYXQgdmFyaWFibGUuCgpTdGFuZGFyZCBsaWJyYXJ5CgotIHVuaXR0ZXN0LnB5LCBhIHVuaXQgdGVzdGluZyBmcmFtZXdvcmsgYnkgU3RldmUgUHVyY2VsbCAoUHlVTklULAogIGluc3BpcmVkIGJ5IEpVbml0KSwgaXMgbm93IHBhcnQgb2YgdGhlIHN0YW5kYXJkIGxpYnJhcnkuICBZb3Ugbm93CiAgaGF2ZSBhIGNob2ljZSBvZiB0d28gdGVzdGluZyBmcmFtZXdvcmtzOiB1bml0dGVzdCByZXF1aXJlcyB5b3UgdG8KICB3cml0ZSB0ZXN0Y2FzZXMgYXMgc2VwYXJhdGUgY29kZSwgZG9jdGVzdCBnYXRoZXJzIHRoZW0gZnJvbQogIGRvY3N0cmluZ3MuICBCb3RoIGFwcHJvYWNoZXMgaGF2ZSB0aGVpciBhZHZhbnRhZ2VzIGFuZAogIGRpc2FkdmFudGFnZXMuCgotIEEgbmV3IG1vZHVsZSBUaXggd2FzIGFkZGVkLCB3aGljaCB3cmFwcyB0aGUgVGl4IGV4dGVuc2lvbiBsaWJyYXJ5CiAgZm9yIFRrLiAgV2l0aCB0aGF0IG1vZHVsZSwgaXQgaXMgbm90IG5lY2Vzc2FyeSB0byBzdGF0aWNhbGx5IGxpbmsKICBUaXggd2l0aCBfdGtpbnRlciwgc2luY2UgVGl4IHdpbGwgYmUgbG9hZGVkIHdpdGggVGNsJ3MgInBhY2thZ2UKICByZXF1aXJlIiBjb21tYW5kLiAgU2VlIERlbW8vdGl4Ly4KCi0gdHpwYXJzZS5weSBpcyBub3cgb2Jzb2xldGUuCgotIEluIGd6aXAucHksIHRoZSBzZWVrKCkgYW5kIHRlbGwoKSBtZXRob2RzIGFyZSByZW1vdmVkIC0tIHRoZXkgd2VyZQogIG5vbi1mdW5jdGlvbmFsIGFueXdheSwgYW5kIGl0J3MgYmV0dGVyIGlmIGNhbGxlcnMgY2FuIHRlc3QgZm9yIHRoZWlyCiAgZXhpc3RlbmNlIHdpdGggaGFzYXR0cigpLgoKUHl0aG9uL0MgQVBJCgotIFB5RGljdF9OZXh0KCk6IGl0IGlzIG5vdyBzYWZlIHRvIGNhbGwgUHlEaWN0X1NldEl0ZW0oKSB3aXRoIGEga2V5CiAgdGhhdCdzIGFscmVhZHkgaW4gdGhlIGRpY3Rpb25hcnkgZHVyaW5nIGEgUHlEaWN0X05leHQoKSBpdGVyYXRpb24uCiAgVGhpcyB1c2VkIHRvIGZhaWwgb2NjYXNpb25hbGx5IHdoZW4gYSBkaWN0aW9uYXJ5IHJlc2l6ZSBvcGVyYXRpb24KICBjb3VsZCBiZSB0cmlnZ2VyZWQgdGhhdCB3b3VsZCByZWhhc2ggYWxsIHRoZSBrZXlzLiAgQWxsIG90aGVyCiAgbW9kaWZpY2F0aW9ucyB0byB0aGUgZGljdGlvbmFyeSBhcmUgc3RpbGwgb2ZmLWxpbWl0cyBkdXJpbmcgYQogIFB5RGljdF9OZXh0KCkgaXRlcmF0aW9uIQoKLSBOZXcgZXh0ZW5kZWQgQVBJcyByZWxhdGVkIHRvIHBhc3NpbmcgY29tcGlsZXIgdmFyaWFibGVzIGFyb3VuZC4KCi0gTmV3IGFic3RyYWN0IEFQSXMgUHlPYmplY3RfSXNJbnN0YW5jZSgpLCBQeU9iamVjdF9Jc1N1YmNsYXNzKCkKICBpbXBsZW1lbnQgaXNpbnN0YW5jZSgpIGFuZCBpc3N1YmNsYXNzKCkuCgotIFB5X0J1aWxkVmFsdWUoKSBub3cgaGFzIGEgIkQiIGNvbnZlcnNpb24gdG8gY3JlYXRlIGEgUHl0aG9uIGNvbXBsZXgKICBudW1iZXIgZnJvbSBhIFB5X2NvbXBsZXggQyB2YWx1ZS4KCi0gRXh0ZW5zaW9ucyB0eXBlcyB3aGljaCBzdXBwb3J0IHdlYWsgcmVmZXJlbmNlcyBtdXN0IG5vdyBzZXQgdGhlCiAgZmllbGQgYWxsb2NhdGVkIGZvciB0aGUgd2VhayByZWZlcmVuY2UgbWFjaGluZXJ5IHRvIE5VTEwgdGhlbXNlbHZlczsKICB0aGlzIGlzIGRvbmUgdG8gYXZvaWQgdGhlIGNvc3Qgb2YgY2hlY2tpbmcgZWFjaCBvYmplY3QgZm9yIGhhdmluZyBhCiAgd2Vha2x5IHJlZmVyZW5jYWJsZSB0eXBlIGluIFB5T2JqZWN0X0lOSVQoKSwgc2luY2UgbW9zdCB0eXBlcyBhcmUKICBub3Qgd2Vha2x5IHJlZmVyZW5jYWJsZS4KCi0gUHlGcmFtZV9GYXN0VG9Mb2NhbHMoKSBhbmQgUHlGcmFtZV9Mb2NhbHNUb0Zhc3QoKSBjb3B5IGJpbmRpbmdzIGZvcgogIGZyZWUgdmFyaWFibGVzIGFuZCBjZWxsIHZhcmlhYmxlcyB0byBhbmQgZnJvbSB0aGUgZnJhbWUncyBmX2xvY2Fscy4KCi0gVmFyaWFudHMgb2Ygc2V2ZXJhbCBmdW5jdGlvbnMgZGVmaW5lZCBpbiBweXRob25ydW4uaCBoYXZlIGJlZW4gYWRkZWQKICB0byBzdXBwb3J0IHRoZSBuZXN0ZWRfc2NvcGVzIGZ1dHVyZSBzdGF0ZW1lbnQuICBUaGUgdmFyaWFudHMgYWxsIGVuZAogIGluIEZsYWdzIGFuZCB0YWtlIGFuIGV4dHJhIGFyZ3VtZW50LCBhIFB5Q29tcGlsZXJGbGFncyAqOyBleGFtcGxlczoKICBQeVJ1bl9BbnlGaWxlRXhGbGFncygpLCBQeVJ1bl9JbnRlcmFjdGl2ZUxvb3BGbGFncygpLiAgVGhlc2UKICB2YXJpYW50cyBtYXkgYmUgcmVtb3ZlZCBpbiBQeXRob24gMi4yLCB3aGVuIG5lc3RlZCBzY29wZXMgYXJlCiAgbWFuZGF0b3J5LgoKRGlzdHV0aWxzCgotIHRoZSBzZGlzdCBjb21tYW5kIG5vdyB3cml0ZXMgYSBQS0ctSU5GTyBmaWxlLCBhcyBkZXNjcmliZWQgaW4gUEVQIDI0MSwKICBpbnRvIHRoZSByZWxlYXNlIHRyZWUuCgotIHNldmVyYWwgZW5oYW5jZW1lbnRzIHRvIHRoZSBiZGlzdF93aW5pbnN0IGNvbW1hbmQgZnJvbSBUaG9tYXMgSGVsbGVyCiAgKGFuIHVuaW5zdGFsbGVyLCBtb3JlIGN1c3RvbWl6YXRpb24gb2YgdGhlIGluc3RhbGxlcidzIGRpc3BsYXkpCgotIGZyb20gSmFjayBKYW5zZW46IGFkZGVkIE1hYy1zcGVjaWZpYyBjb2RlIHRvIGdlbmVyYXRlIGEgZGlhbG9nIGZvcgogIHVzZXJzIHRvIHNwZWNpZnkgdGhlIGNvbW1hbmQtbGluZSAoYmVjYXVzZSBwcm92aWRpbmcgYSBjb21tYW5kLWxpbmUgd2l0aAogIE1hY1B5dGhvbiBpcyBhd2t3YXJkKS4gIEphY2sgYWxzbyBtYWRlIHZhcmlvdXMgZml4ZXMgZm9yIHRoZSBNYWMKICBhbmQgdGhlIE1ldHJvd2Vya3MgY29tcGlsZXIuCgotIGFkZGVkICdwbGF0Zm9ybXMnIGFuZCAna2V5d29yZHMnIHRvIHRoZSBzZXQgb2YgbWV0YWRhdGEgdGhhdCBjYW4gYmUKICBzcGVjaWZpZWQgZm9yIGEgZGlzdHJpYnV0aW9uLgoKLSBhcHBsaWVkIHBhdGNoZXMgZnJvbSBKYXNvbiBUaXNobGVyIHRvIG1ha2UgdGhlIGNvbXBpbGVyIGNsYXNzIHdvcmsgd2l0aAogIEN5Z3dpbi4KCgpXaGF0J3MgTmV3IGluIFB5dGhvbiAyLjEgYmV0YSAxPwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKQ29yZSBsYW5ndWFnZSwgYnVpbHRpbnMsIGFuZCBpbnRlcnByZXRlcgoKLSBGb2xsb3dpbmcgYW4gb3V0Y3J5IGZyb20gdGhlIGNvbW11bml0eSBhYm91dCB0aGUgYW1vdW50IG9mIGNvZGUKICBicm9rZW4gYnkgdGhlIG5lc3RlZCBzY29wZXMgZmVhdHVyZSBpbnRyb2R1Y2VkIGluIDIuMWEyLCB3ZSBkZWNpZGVkCiAgdG8gbWFrZSB0aGlzIGZlYXR1cmUgb3B0aW9uYWwsIGFuZCB0byB3YWl0IHVudGlsIFB5dGhvbiAyLjIgKG9yIGF0CiAgbGVhc3QgNiBtb250aHMpIHRvIG1ha2UgaXQgc3RhbmRhcmQuICBUaGUgb3B0aW9uIGNhbiBiZSBlbmFibGVkIG9uIGEKICBwZXItbW9kdWxlIGJhc2lzIGJ5IGFkZGluZyAiZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBuZXN0ZWRfc2NvcGVzIiBhdAogIHRoZSBiZWdpbm5pbmcgb2YgYSBtb2R1bGUgKGJlZm9yZSBhbnkgb3RoZXIgc3RhdGVtZW50cywgYnV0IGFmdGVyCiAgY29tbWVudHMgYW5kIGFuIG9wdGlvbmFsIGRvY3N0cmluZykuICBTZWUgUEVQIDIzNiAoQmFjayB0byB0aGUKICBfX2Z1dHVyZV9fKSBmb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUgX19mdXR1cmVfXyBzdGF0ZW1lbnQuICBQRVAgMjI3CiAgKFN0YXRpY2FsbHkgTmVzdGVkIFNjb3BlcykgaGFzIGJlZW4gdXBkYXRlZCB0byByZWZsZWN0IHRoaXMgY2hhbmdlLAogIGFuZCB0byBjbGFyaWZ5IHRoZSBzZW1hbnRpY3MgaW4gYSBudW1iZXIgb2YgZW5kY2FzZXMuCgotIFRoZSBuZXN0ZWQgc2NvcGVzIGNvZGUsIHdoZW4gZW5hYmxlZCwgaGFzIGJlZW4gaGFyZGVuZWQsIGFuZCBtb3N0CiAgYnVncyBhbmQgbWVtb3J5IGxlYWtzIGluIGl0IGhhdmUgYmVlbiBmaXhlZC4KCi0gQ29tcGlsZS10aW1lIHdhcm5pbmdzIGFyZSBub3cgZ2VuZXJhdGVkIGZvciBhIG51bWJlciBvZiBjb25kaXRpb25zCiAgdGhhdCB3aWxsIGJyZWFrIG9yIGNoYW5nZSBpbiBtZWFuaW5nIHdoZW4gbmVzdGVkIHNjb3BlcyBhcmUgZW5hYmxlZDoKCiAgLSBVc2luZyAiZnJvbS4uLmltcG9ydCAqIiBvciAiZXhlYyIgd2l0aG91dCBpbi1jbGF1c2UgaW4gYSBmdW5jdGlvbgogICAgc2NvcGUgdGhhdCBhbHNvIGRlZmluZXMgYSBsYW1iZGEgb3IgbmVzdGVkIGZ1bmN0aW9uIHdpdGggb25lIG9yCiAgICBtb3JlIGZyZWUgKG5vbi1sb2NhbCkgdmFyaWFibGVzLiAgVGhlIHByZXNlbmNlIG9mIHRoZSBpbXBvcnQqIG9yCiAgICBiYXJlIGV4ZWMgbWFrZXMgaXQgaW1wb3NzaWJsZSBmb3IgdGhlIGNvbXBpbGVyIHRvIGRldGVybWluZSB0aGUKICAgIGV4YWN0IHNldCBvZiBsb2NhbCB2YXJpYWJsZXMgaW4gdGhlIG91dGVyIHNjb3BlLCB3aGljaCBtYWtlcyBpdAogICAgaW1wb3NzaWJsZSB0byBkZXRlcm1pbmUgdGhlIGJpbmRpbmdzIGZvciBmcmVlIHZhcmlhYmxlcyBpbiB0aGUKICAgIGlubmVyIHNjb3BlLiAgVG8gYXZvaWQgdGhlIHdhcm5pbmcgYWJvdXQgaW1wb3J0ICosIGNoYW5nZSBpdCBpbnRvCiAgICBhbiBpbXBvcnQgb2YgZXhwbGljaXRseSBuYW1lIG9iamVjdCwgb3IgbW92ZSB0aGUgaW1wb3J0KiBzdGF0ZW1lbnQKICAgIHRvIHRoZSBnbG9iYWwgc2NvcGU7IHRvIGF2b2lkIHRoZSB3YXJuaW5nIGFib3V0IGJhcmUgZXhlYywgdXNlCiAgICBleGVjLi4uaW4uLi4gKGEgZ29vZCBpZGVhIGFueXdheSAtLSB0aGVyZSdzIGEgcG9zc2liaWxpdHkgdGhhdAogICAgYmFyZSBleGVjIHdpbGwgYmUgZGVwcmVjYXRlZCBpbiB0aGUgZnV0dXJlKS4KCiAgLSBVc2Ugb2YgYSBnbG9iYWwgdmFyaWFibGUgaW4gYSBuZXN0ZWQgc2NvcGUgd2l0aCB0aGUgc2FtZSBuYW1lIGFzIGEKICAgIGxvY2FsIHZhcmlhYmxlIGluIGEgc3Vycm91bmRpbmcgc2NvcGUuICBUaGlzIHdpbGwgY2hhbmdlIGluCiAgICBtZWFuaW5nIHdpdGggbmVzdGVkIHNjb3BlczogdGhlIG5hbWUgaW4gdGhlIGlubmVyIHNjb3BlIHdpbGwKICAgIHJlZmVyZW5jZSB0aGUgdmFyaWFibGUgaW4gdGhlIG91dGVyIHNjb3BlIHJhdGhlciB0aGFuIHRoZSBnbG9iYWwKICAgIG9mIHRoZSBzYW1lIG5hbWUuICBUbyBhdm9pZCB0aGUgd2FybmluZywgZWl0aGVyIHJlbmFtZSB0aGUgb3V0ZXIKICAgIHZhcmlhYmxlLCBvciB1c2UgYSBnbG9iYWwgc3RhdGVtZW50IGluIHRoZSBpbm5lciBmdW5jdGlvbi4KCi0gQW4gb3B0aW9uYWwgb2JqZWN0IGFsbG9jYXRvciBoYXMgYmVlbiBpbmNsdWRlZC4gIFRoaXMgYWxsb2NhdG9yIGlzCiAgb3B0aW1pemVkIGZvciBQeXRob24gb2JqZWN0cyBhbmQgc2hvdWxkIGJlIGZhc3RlciBhbmQgdXNlIGxlc3MgbWVtb3J5CiAgdGhhbiB0aGUgc3RhbmRhcmQgc3lzdGVtIGFsbG9jYXRvci4gIEl0IGlzIG5vdCBlbmFibGVkIGJ5IGRlZmF1bHQKICBiZWNhdXNlIG9mIHBvc3NpYmxlIHRocmVhZCBzYWZldHkgcHJvYmxlbXMuICBUaGUgYWxsb2NhdG9yIGlzIG9ubHkKICBwcm90ZWN0ZWQgYnkgdGhlIFB5dGhvbiBpbnRlcnByZXRlciBsb2NrIGFuZCBpdCBpcyBwb3NzaWJsZSB0aGF0IHNvbWUKICBleHRlbnNpb24gbW9kdWxlcyByZXF1aXJlIGEgdGhyZWFkIHNhZmUgYWxsb2NhdG9yLiAgVGhlIG9iamVjdAogIGFsbG9jYXRvciBjYW4gYmUgZW5hYmxlZCBieSBwcm92aWRpbmcgdGhlICItLXdpdGgtcHltYWxsb2MiIG9wdGlvbiB0bwogIGNvbmZpZ3VyZS4KClN0YW5kYXJkIGxpYnJhcnkKCi0gcHlleHBhdCBub3cgZGV0ZWN0cyB0aGUgZXhwYXQgdmVyc2lvbiBpZiBleHBhdC5oIGRlZmluZXMgaXQuIEEKICBudW1iZXIgb2YgYWRkaXRpb25hbCBoYW5kbGVycyBhcmUgcHJvdmlkZWQsIHdoaWNoIGFyZSBvbmx5IGF2YWlsYWJsZQogIHNpbmNlIGV4cGF0IDEuOTUuIEluIGFkZGl0aW9uLCB0aGUgbWV0aG9kcyBTZXRQYXJhbUVudGl0eVBhcnNpbmcgYW5kCiAgR2V0SW5wdXRDb250ZXh0IG9mIFBhcnNlciBvYmplY3RzIGFyZSBhdmFpbGFibGUgd2l0aCAxLjk1LngKICBvbmx5LiBQYXJzZXIgb2JqZWN0cyBub3cgcHJvdmlkZSB0aGUgb3JkZXJlZF9hdHRyaWJ1dGVzIGFuZAogIHNwZWNpZmllZF9hdHRyaWJ1dGVzIGF0dHJpYnV0ZXMuIEEgbmV3IG1vZHVsZSBleHBhdC5tb2RlbCB3YXMgYWRkZWQsCiAgd2hpY2ggb2ZmZXJzIGEgbnVtYmVyIG9mIGFkZGl0aW9uYWwgY29uc3RhbnRzIGlmIDEuOTUueCBpcyB1c2VkLgoKLSB4bWwuZG9tIG9mZmVycyB0aGUgbmV3IGZ1bmN0aW9ucyByZWdpc3RlckRPTUltcGxlbWVudGF0aW9uIGFuZAogIGdldERPTUltcGxlbWVudGF0aW9uLgoKLSB4bWwuZG9tLm1pbmlkb20gb2ZmZXJzIGEgdG9wcmV0dHl4bWwgbWV0aG9kLiBBIG51bWJlciBvZiBET00KICBjb25mb3JtYW5jZSBpc3N1ZXMgaGF2ZSBiZWVuIHJlc29sdmVkLiBJbiBwYXJ0aWN1bGFyLCBFbGVtZW50IG5vdwogIGhhcyBhbiBoYXNBdHRyaWJ1dGVzIG1ldGhvZCwgYW5kIHRoZSBoYW5kbGluZyBvZiBuYW1lc3BhY2VzIHdhcwogIGltcHJvdmVkLgoKLSBLYS1QaW5nIFllZSBjb250cmlidXRlZCB0d28gbmV3IG1vZHVsZXM6IGluc3BlY3QucHksIGEgbW9kdWxlIGZvcgogIGdldHRpbmcgaW5mb3JtYXRpb24gYWJvdXQgbGl2ZSBQeXRob24gY29kZSwgYW5kIHB5ZG9jLnB5LCBhIG1vZHVsZQogIGZvciBpbnRlcmFjdGl2ZWx5IGNvbnZlcnRpbmcgZG9jc3RyaW5ncyB0byBIVE1MIG9yIHRleHQuCiAgVG9vbHMvc2NyaXB0cy9weWRvYywgd2hpY2ggaXMgbm93IGF1dG9tYXRpY2FsbHkgaW5zdGFsbGVkIGludG8KICA8cHJlZml4Pi9iaW4sIHVzZXMgcHlkb2MucHkgdG8gZGlzcGxheSBkb2N1bWVudGF0aW9uOyB0cnkgcnVubmluZwogICJweWRvYyAtaCIgZm9yIGluc3RydWN0aW9ucy4gICJweWRvYyAtZyIgcG9wcyB1cCBhIHNtYWxsIEdVSSB0aGF0CiAgbGV0cyB5b3UgYnJvd3NlIHRoZSBtb2R1bGUgZG9jc3RyaW5ncyB1c2luZyBhIHdlYiBicm93c2VyLgoKLSBOZXcgbGlicmFyeSBtb2R1bGUgZGlmZmxpYi5weSwgcHJpbWFyaWx5IHBhY2thZ2luZyB0aGUgU2VxdWVuY2VNYXRjaGVyCiAgY2xhc3MgYXQgdGhlIGhlYXJ0IG9mIHRoZSBwb3B1bGFyIG5kaWZmLnB5IGZpbGUtY29tcGFyaXNvbiB0b29sLgoKLSBkb2N0ZXN0LnB5IChhIGZyYW1ld29yayBmb3IgdmVyaWZ5aW5nIFB5dGhvbiBjb2RlIGV4YW1wbGVzIGluIGRvY3N0cmluZ3MpCiAgaXMgbm93IHBhcnQgb2YgdGhlIHN0ZCBsaWJyYXJ5LgoKV2luZG93cyBjaGFuZ2VzCgotIEEgbmV3IGVudHJ5IGluIHRoZSBTdGFydCBtZW51LCAiTW9kdWxlIERvY3MiLCBydW5zICJweWRvYyAtZyIgLS0gYQogIHNtYWxsIEdVSSB0aGF0IGxldHMgeW91IGJyb3dzZSB0aGUgbW9kdWxlIGRvY3N0cmluZ3MgdXNpbmcgeW91cgogIGRlZmF1bHQgd2ViIGJyb3dzZXIuCgotIEltcG9ydCBpcyBub3cgY2FzZS1zZW5zaXRpdmUuICBQRVAgMjM1IChJbXBvcnQgb24gQ2FzZS1JbnNlbnNpdGl2ZQogIFBsYXRmb3JtcykgaXMgaW1wbGVtZW50ZWQuICBTZWUKCiAgICAgIGh0dHA6Ly9weXRob24uc291cmNlZm9yZ2UubmV0L3BlcHMvcGVwLTAyMzUuaHRtbAoKICBmb3IgZnVsbCBkZXRhaWxzLCBlc3BlY2lhbGx5IHRoZSAiQ3VycmVudCBMb3dlci1MZWZ0IFNlbWFudGljcyIgc2VjdGlvbi4KICBUaGUgbmV3IFdpbmRvd3MgaW1wb3J0IHJ1bGVzIGFyZSBzaW1wbGVyIHRoYW4gYmVmb3JlOgoKICBBLiBJZiB0aGUgUFlUSE9OQ0FTRU9LIGVudmlyb25tZW50IHZhcmlhYmxlIGV4aXN0cywgc2FtZSBhcwogICAgIGJlZm9yZTogIHNpbGVudGx5IGFjY2VwdCB0aGUgZmlyc3QgY2FzZS1pbnNlbnNpdGl2ZSBtYXRjaCBvZiBhbnkKICAgICBraW5kOyByYWlzZSBJbXBvcnRFcnJvciBpZiBub25lIGZvdW5kLgoKICBCLiBFbHNlIHNlYXJjaCBzeXMucGF0aCBmb3IgdGhlIGZpcnN0IGNhc2Utc2Vuc2l0aXZlIG1hdGNoOyByYWlzZQogICAgIEltcG9ydEVycm9yIGlmIG5vbmUgZm91bmQuCgogIFRoZSBzYW1lIHJ1bGVzIGhhdmUgYmVlbiBpbXBsZW50ZWQgb24gb3RoZXIgcGxhdGZvcm1zIHdpdGggY2FzZS0KICBpbnNlbnNpdGl2ZSBidXQgY2FzZS1wcmVzZXJ2aW5nIGZpbGVzeXN0ZW1zIHRvbyAoaW5jbHVkaW5nIEN5Z3dpbiwgYW5kCiAgc2V2ZXJhbCBmbGF2b3JzIG9mIE1hY2ludG9zaCBvcGVyYXRpbmcgc3lzdGVtcykuCgotIHdpbnNvdW5kIG1vZHVsZTogIFVuZGVyIFdpbjl4LCB3aW5zb3VuZC5CZWVwKCkgbm93IGF0dGVtcHRzIHRvIHNpbXVsYXRlCiAgd2hhdCBpdCdzIHN1cHBvc2VkIHRvIGRvIChhbmQgZG9lcyBkbyB1bmRlciBOVCBhbmQgMjAwMCkgdmlhIGRpcmVjdAogIHBvcnQgbWFuaXB1bGF0aW9uLiAgSXQncyB1bmtub3duIHdoZXRoZXIgdGhpcyB3aWxsIHdvcmsgb24gYWxsIHN5c3RlbXMsCiAgYnV0IGl0IGRvZXMgd29yayBvbiBteSBXaW45OFNFIHN5c3RlbXMgbm93IGFuZCB3YXMga25vd24gdG8gYmUgdXNlbGVzcyBvbgogIGFsbCBXaW45eCBzeXN0ZW1zIGJlZm9yZS4KCi0gQnVpbGQ6ICBTdWJwcm9qZWN0IF90ZXN0IChlZmZlY3RpdmVseSkgcmVuYW1lZCB0byBfdGVzdGNhcGkuCgpOZXcgcGxhdGZvcm1zCgotIDIuMSBzaG91bGQgY29tcGlsZSBhbmQgcnVuIG91dCBvZiB0aGUgYm94IHVuZGVyIE1hY09TIFgsIGV2ZW4gdXNpbmcgSEZTKy4KICBUaGFua3MgdG8gU3RldmVuIE1hamV3c2tpIQoKLSAyLjEgc2hvdWxkIGNvbXBpbGUgYW5kIHJ1biBvdXQgb2YgdGhlIGJveCBvbiBDeWd3aW4uICBUaGFua3MgdG8gSmFzb24KICBUaXNobGVyIQoKLSAyLjEgY29udGFpbnMgbmV3IGZpbGVzIGFuZCBwYXRjaGVzIGZvciBSSVNDT1MsIHRoYW5rcyB0byBEaWV0bWFyCiAgU2Nod2VydGJlcmdlciEgIFNlZSBSSVNDT1MvUkVBRE1FIGZvciBtb3JlIGluZm9ybWF0aW9uIC0tIGl0IHNlZW1zCiAgdGhhdCBiZWNhdXNlIG9mIHRoZSBiaXphcnJlIGZpbGVuYW1lIGNvbnZlbnRpb25zIG9uIFJJU0NPUywgbm8gcG9ydAogIHRvIHRoYXQgcGxhdGZvcm0gaXMgZWFzeS4gIE5vdGUgdGhhdCB0aGUgbmV3IHZhcmlhYmxlIG9zLmVuZHNlcCBpcwogIHNpbGVudGx5IHN1cHBvcnRlZCBpbiBvcmRlciB0byBtYWtlIGxpZmUgZWFzaWVyIG9uIHRoaXMgcGxhdGZvcm0sCiAgYnV0IHdlIGRvbid0IGFkdmVydGlzZSBpdCBiZWNhdXNlIGl0J3Mgbm90IHdvcnRoIGZvciBtb3N0IGZvbGtzIHRvCiAgY2FyZSBhYm91dCBSSVNDT1MgcG9ydGFiaWxpdHkuCgoKV2hhdCdzIE5ldyBpbiBQeXRob24gMi4xIGFscGhhIDI/Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKQ29yZSBsYW5ndWFnZSwgYnVpbHRpbnMsIGFuZCBpbnRlcnByZXRlcgoKLSBTY29wZXMgbmVzdC4gIElmIGEgbmFtZSBpcyB1c2VkIGluIGEgZnVuY3Rpb24gb3IgY2xhc3MsIGJ1dCBpcyBub3QKICBsb2NhbCwgdGhlIGRlZmluaXRpb24gaW4gdGhlIG5lYXJlc3QgZW5jbG9zaW5nIGZ1bmN0aW9uIHNjb3BlIHdpbGwKICBiZSB1c2VkLiAgT25lIGNvbnNlcXVlbmNlIG9mIHRoaXMgY2hhbmdlIGlzIHRoYXQgbGFtYmRhIHN0YXRlbWVudHMKICBjb3VsZCByZWZlcmVuY2UgdmFyaWFibGVzIGluIHRoZSBuYW1lc3BhY2VzIHdoZXJlIHRoZSBsYW1iZGEgaXMKICBkZWZpbmVkLiAgSW4gc29tZSB1bnVzdWFsIGNhc2VzLCB0aGlzIGNoYW5nZSB3aWxsIGJyZWFrIGNvZGUuCgogIEluIGFsbCBwcmV2aW91cyB2ZXJzaW9uIG9mIFB5dGhvbiwgbmFtZXMgd2VyZSByZXNvbHZlZCBpbiBleGFjdGx5CiAgdGhyZWUgbmFtZXNwYWNlcyAtLSB0aGUgbG9jYWwgbmFtZXNwYWNlLCB0aGUgZ2xvYmFsIG5hbWVzcGFjZSwgYW5kCiAgdGhlIGJ1aWx0aW4gbmFtZXNwYWNlLiAgQWNjb3JkaW5nIHRvIHRoaXMgb2xkIGRlZmluaXRpb24sIGlmIGEKICBmdW5jdGlvbiBBIGlzIGRlZmluZWQgd2l0aGluIGEgZnVuY3Rpb24gQiwgdGhlIG5hbWVzIGJvdW5kIGluIEIgYXJlCiAgbm90IHZpc2libGUgaW4gQS4gIFRoZSBuZXcgcnVsZXMgbWFrZSBuYW1lcyBib3VuZCBpbiBCIHZpc2libGUgaW4gQSwKICB1bmxlc3MgQSBjb250YWlucyBhIG5hbWUgYmluZGluZyB0aGF0IGhpZGVzIHRoZSBiaW5kaW5nIGluIEIuCgogIFNlY3Rpb24gNC4xIG9mIHRoZSByZWZlcmVuY2UgbWFudWFsIGRlc2NyaWJlcyB0aGUgbmV3IHNjb3BpbmcgcnVsZXMKICBpbiBkZXRhaWwuICBUaGUgdGVzdCBzY3JpcHQgaW4gTGliL3Rlc3QvdGVzdF9zY29wZS5weSBkZW1vbnN0cmF0ZXMKICBzb21lIG9mIHRoZSBlZmZlY3RzIG9mIHRoZSBjaGFuZ2UuCgogIFRoZSBuZXcgcnVsZXMgd2lsbCBjYXVzZSBleGlzdGluZyBjb2RlIHRvIGJyZWFrIGlmIGl0IGRlZmluZXMgbmVzdGVkCiAgZnVuY3Rpb25zIHdoZXJlIGFuIG91dGVyIGZ1bmN0aW9uIGhhcyBsb2NhbCB2YXJpYWJsZXMgd2l0aCB0aGUgc2FtZQogIG5hbWUgYXMgZ2xvYmFscyBvciBidWlsdGlucyB1c2VkIGJ5IHRoZSBpbm5lciBmdW5jdGlvbi4gIEV4YW1wbGU6CgogICAgZGVmIG11bmdlKHN0cik6CiAgICAgICAgZGVmIGhlbHBlcih4KToKICAgICAgICAgICAgcmV0dXJuIHN0cih4KQogICAgICAgIGlmIHR5cGUoc3RyKSAhPSB0eXBlKCcnKToKICAgICAgICAgICAgc3RyID0gaGVscGVyKHN0cikKICAgICAgICByZXR1cm4gc3RyLnN0cmlwKCkKCiAgVW5kZXIgdGhlIG9sZCBydWxlcywgdGhlIG5hbWUgc3RyIGluIGhlbHBlcigpIGlzIGJvdW5kIHRvIHRoZQogIGJ1aWx0aW4gZnVuY3Rpb24gc3RyKCkuICBVbmRlciB0aGUgbmV3IHJ1bGVzLCBpdCB3aWxsIGJlIGJvdW5kIHRvCiAgdGhlIGFyZ3VtZW50IG5hbWVkIHN0ciBhbmQgYW4gZXJyb3Igd2lsbCBvY2N1ciB3aGVuIGhlbHBlcigpIGlzCiAgY2FsbGVkLgoKLSBUaGUgY29tcGlsZXIgd2lsbCByZXBvcnQgYSBTeW50YXhFcnJvciBpZiAiZnJvbSAuLi4gaW1wb3J0ICoiIG9jY3VycwogIGluIGEgZnVuY3Rpb24gb3IgY2xhc3Mgc2NvcGUuICBUaGUgbGFuZ3VhZ2UgcmVmZXJlbmNlIGhhcyBkb2N1bWVudGVkCiAgdGhhdCB0aGlzIGNhc2UgaXMgaWxsZWdhbCwgYnV0IHRoZSBjb21waWxlciBuZXZlciBjaGVja2VkIGZvciBpdC4KICBUaGUgcmVjZW50IGludHJvZHVjdGlvbiBvZiBuZXN0ZWQgc2NvcGUgbWFrZXMgdGhlIG1lYW5pbmcgb2YgdGhpcwogIGZvcm0gb2YgbmFtZSBiaW5kaW5nIGFtYmlndW91cy4gIEluIGEgZnV0dXJlIHJlbGVhc2UsIHRoZSBjb21waWxlcgogIG1heSBhbGxvdyB0aGlzIGZvcm0gd2hlbiB0aGVyZSBpcyBubyBwb3NzaWJpbGl0eSBvZiBhbWJpZ3VpdHkuCgotIHJlcHIoc3RyaW5nKSBpcyBlYXNpZXIgdG8gcmVhZCwgbm93IHVzaW5nIGhleCBlc2NhcGVzIGluc3RlYWQgb2Ygb2N0YWwsCiAgYW5kIHVzaW5nIFx0LCBcbiBhbmQgXHIgaW5zdGVhZCBvZiBcMDExLCBcMDEyIGFuZCBcMDE1IChyZXNwZWN0aXZlbHkpOgoKICA+Pj4gIlx0ZXhhbXBsZSBcclxuIiArIGNocigwKSArIGNocigyNTUpCiAgJ1x0ZXhhbXBsZSBcclxuXHgwMFx4ZmYnICAgICAgICAgIyBpbiAyLjEKICAnXDAxMWV4YW1wbGUgXDAxNVwwMTJcMDAwXDM3NycgICAjIGluIDIuMAoKLSBGdW5jdGlvbnMgYXJlIG5vdyBjb21wYXJlZCBhbmQgaGFzaGVkIGJ5IGlkZW50aXR5LCBub3QgYnkgdmFsdWUsIHNpbmNlCiAgdGhlIGZ1bmNfY29kZSBhdHRyaWJ1dGUgaXMgd3JpdGFibGUuCgotIFdlYWsgcmVmZXJlbmNlcyAoUEVQIDIwNSkgaGF2ZSBiZWVuIGFkZGVkLiAgVGhpcyBpbnZvbHZlcyBhIGZldwogIGNoYW5nZXMgaW4gdGhlIGNvcmUsIGFuIGV4dGVuc2lvbiBtb2R1bGUgKF93ZWFrcmVmKSwgYW5kIGEgUHl0aG9uCiAgbW9kdWxlICh3ZWFrcmVmKS4gIFRoZSB3ZWFrcmVmIG1vZHVsZSBpcyB0aGUgcHVibGljIGludGVyZmFjZS4gIEl0CiAgaW5jbHVkZXMgc3VwcG9ydCBmb3IgImV4cGxpY2l0IiB3ZWFrIHJlZmVyZW5jZXMsIHByb3h5IG9iamVjdHMsIGFuZAogIG1hcHBpbmdzIHdpdGggd2Vha2x5IGhlbGQgdmFsdWVzLgoKLSBBICdjb250aW51ZScgc3RhdGVtZW50IGNhbiBub3cgYXBwZWFyIGluIGEgdHJ5IGJsb2NrIHdpdGhpbiB0aGUgYm9keQogIG9mIGEgbG9vcC4gIEl0IGlzIHN0aWxsIG5vdCBwb3NzaWJsZSB0byB1c2UgY29udGludWUgaW4gYSBmaW5hbGx5CiAgY2xhdXNlLgoKU3RhbmRhcmQgbGlicmFyeQoKLSBtYWlsYm94LnB5IG5vdyBoYXMgYSBuZXcgY2xhc3MsIFBvcnRhYmxlVW5peE1haWxib3ggd2hpY2ggaXMKICBpZGVudGljYWwgdG8gVW5peE1haWxib3ggYnV0IHVzZXMgYSBtb3JlIHBvcnRhYmxlIHNjaGVtZSBmb3IKICBkZXRlcm1pbmluZyBGcm9tXyBzZXBhcmF0b3JzLiAgQWxzbywgdGhlIGNvbnN0cnVjdG9ycyBmb3IgYWxsIHRoZQogIGNsYXNzZXMgaW4gdGhpcyBtb2R1bGUgaGF2ZSBhIG5ldyBvcHRpb25hbCBgZmFjdG9yeScgYXJndW1lbnQsIHdoaWNoCiAgaXMgYSBjYWxsYWJsZSB1c2VkIHdoZW4gbmV3IG1lc3NhZ2UgY2xhc3NlcyBtdXN0IGJlIGluc3RhbnRpYXRlZCBieQogIHRoZSBuZXh0KCkgbWV0aG9kLgoKLSByYW5kb20ucHkgaXMgbm93IHNlbGYtY29udGFpbmVkLCBhbmQgb2ZmZXJzIGFsbCB0aGUgZnVuY3Rpb25hbGl0eSBvZgogIHRoZSBub3ctZGVwcmVjYXRlZCB3aHJhbmRvbS5weS4gIFNlZSB0aGUgZG9jcyBmb3IgZGV0YWlscy4gIHJhbmRvbS5weQogIGFsc28gc3VwcG9ydHMgbmV3IGZ1bmN0aW9ucyBnZXRzdGF0ZSgpIGFuZCBzZXRzdGF0ZSgpLCBmb3Igc2F2aW5nCiAgYW5kIHJlc3RvcmluZyB0aGUgaW50ZXJuYWwgc3RhdGUgb2YgdGhlIGdlbmVyYXRvcjsgYW5kIGp1bXBhaGVhZChuKSwKICBmb3IgcXVpY2tseSBmb3JjaW5nIHRoZSBpbnRlcm5hbCBzdGF0ZSB0byBiZSB0aGUgc2FtZSBhcyBpZiBuIGNhbGxzIHRvCiAgcmFuZG9tKCkgaGFkIGJlZW4gbWFkZS4gIFRoZSBsYXR0ZXIgaXMgcGFydGljdWxhcmx5IHVzZWZ1bCBmb3IgbXVsdGktCiAgdGhyZWFkZWQgcHJvZ3JhbXMsIGNyZWF0aW5nIG9uZSBpbnN0YW5jZSBvZiB0aGUgcmFuZG9tLlJhbmRvbSgpIGNsYXNzIGZvcgogIGVhY2ggdGhyZWFkLCB0aGVuIHVzaW5nIC5qdW1wYWhlYWQoKSB0byBmb3JjZSBlYWNoIGluc3RhbmNlIHRvIHVzZSBhCiAgbm9uLW92ZXJsYXBwaW5nIHNlZ21lbnQgb2YgdGhlIGZ1bGwgcGVyaW9kLgoKLSByYW5kb20ucHkncyBzZWVkKCkgZnVuY3Rpb24gaXMgbmV3LiAgRm9yIGJpdC1mb3ItYml0IGNvbXBhdGliaWxpdHkgd2l0aAogIHByaW9yIHJlbGVhc2VzLCB1c2UgdGhlIHdoc2VlZCBmdW5jdGlvbiBpbnN0ZWFkLiAgVGhlIG5ldyBzZWVkIGZ1bmN0aW9uCiAgYWRkcmVzc2VzIHR3byBwcm9ibGVtczogICgxKSBUaGUgb2xkIGZ1bmN0aW9uIGNvdWxkbid0IHByb2R1Y2UgbW9yZSB0aGFuCiAgYWJvdXQgMioqMjQgZGlzdGluY3QgaW50ZXJuYWwgc3RhdGVzOyB0aGUgbmV3IG9uZSBhYm91dCAyKio0NSAodGhlIGJlc3QKICB0aGF0IGNhbiBiZSBkb25lIGluIHRoZSBXaWNobWFubi1IaWxsIGdlbmVyYXRvcikuICAoMikgVGhlIG9sZCBmdW5jdGlvbgogIHNvbWV0aW1lcyBwcm9kdWNlZCBpZGVudGljYWwgaW50ZXJuYWwgc3RhdGVzIHdoZW4gcGFzc2VkIGRpc3RpbmN0CiAgaW50ZWdlcnMsIGFuZCB0aGVyZSB3YXMgbm8gc2ltcGxlIHdheSB0byBwcmVkaWN0IHdoZW4gdGhhdCB3b3VsZCBoYXBwZW47CiAgdGhlIG5ldyBvbmUgZ3VhcmFudGVlcyB0byBwcm9kdWNlIGRpc3RpbmN0IGludGVybmFsIHN0YXRlcyBmb3IgYWxsCiAgYXJndW1lbnRzIGluIFswLCAyNzgxNDQzMTQ4NjU3NkwpLgoKLSBUaGUgc29ja2V0IG1vZHVsZSBub3cgc3VwcG9ydHMgcmF3IHBhY2tldHMgb24gTGludXguICBUaGUgc29ja2V0CiAgZmFtaWx5IGlzIEFGX1BBQ0tFVC4KCi0gdGVzdF9jYXBpLnB5IGlzIGEgc3RhcnQgYXQgcnVubmluZyB0ZXN0cyBvZiB0aGUgUHl0aG9uIEMgQVBJLiAgVGhlIHRlc3RzCiAgYXJlIGltcGxlbWVudGVkIGJ5IHRoZSBuZXcgTW9kdWxlcy9fdGVzdG1vZHVsZS5jLgoKLSBBIG5ldyBleHRlbnNpb24gbW9kdWxlLCBfc3ltdGFibGUsIHByb3ZpZGVzIHByb3Zpc2lvbmFsIGFjY2VzcyB0byB0aGUKICBpbnRlcm5hbCBzeW1ib2wgdGFibGUgdXNlZCBieSB0aGUgUHl0aG9uIGNvbXBpbGVyLiAgQSBoaWdoZXItbGV2ZWwKICBpbnRlcmZhY2Ugd2lsbCBiZSBhZGRlZCBvbiB0b3Agb2YgX3N5bXRhYmxlIGluIGEgZnV0dXJlIHJlbGVhc2UuCgotIFJlbW92ZWQgdGhlIG9ic29sZXRlIHNvdW5kZXggbW9kdWxlLgoKLSB4bWwuZG9tLm1pbmlkb20gbm93IHVzZXMgdGhlIHN0YW5kYXJkIERPTSBleGNlcHRpb25zLiBOb2RlIHN1cHBvcnRzCiAgdGhlIGlzU2FtZU5vZGUgbWV0aG9kOyBOYW1lZE5vZGVNYXAgdGhlIGdldCBtZXRob2QuCgotIHhtbC5zYXguZXhwYXRyZWFkZXIgc3VwcG9ydHMgdGhlIGxleGljYWwgaGFuZGxlciBwcm9wZXJ0eTsgaXQKICBnZW5lcmF0ZXMgY29tbWVudCwgc3RhcnRDREFUQSwgYW5kIGVuZENEQVRBIGV2ZW50cy4KCldpbmRvd3MgY2hhbmdlcwoKLSBCdWlsZCBwcm9jZWR1cmU6ICB0aGUgemxpYiBwcm9qZWN0IGlzIGJ1aWx0IGluIGEgZGlmZmVyZW50IHdheSB0aGF0CiAgZW5zdXJlcyB0aGUgemxpYiBoZWFkZXIgZmlsZXMgdXNlZCBjYW4gbm8gbG9uZ2VyIGdldCBvdXQgb2Ygc3luY2ggd2l0aAogIHRoZSB6bGliIGJpbmFyeSB1c2VkLiAgU2VlIFBDYnVpbGRccmVhZG1lLnR4dCBmb3IgZGV0YWlscy4gIFlvdXIgb2xkCiAgemxpYi1yZWxhdGVkIGRpcmVjdG9yaWVzIGNhbiBiZSBkZWxldGVkOyB5b3UnbGwgbmVlZCB0byBkb3dubG9hZCBmcmVzaAogIHNvdXJjZSBmb3IgemxpYiBhbmQgdW5wYWNrIGl0IGludG8gYSBuZXcgZGlyZWN0b3J5LgoKLSBCdWlsZDogIE5ldyBzdWJwcm9qZWN0IF90ZXN0IGZvciB0aGUgYmVuZWZpdCBvZiB0ZXN0X2NhcGkucHkgKHNlZSBhYm92ZSkuCgotIEJ1aWxkOiAgTmV3IHN1YnByb2plY3QgX3N5bXRhYmxlLCBmb3IgbmV3IERMTCBfc3ltdGFibGUucHlkIChhIG5hc2NlbnQKICBpbnRlcmZhY2UgdG8gc29tZSBQeXRob24gY29tcGlsZXIgaW50ZXJuYWxzKS4KCi0gQnVpbGQ6ICBTdWJwcm9qZWN0IHVjbmhhc2ggaXMgZ29uZSwgc2luY2UgdGhlIGNvZGUgd2FzIGZvbGRlZCBpbnRvIHRoZQogIHVuaWNvZGVkYXRhIHN1YnByb2plY3QuCgpXaGF0J3MgTmV3IGluIFB5dGhvbiAyLjEgYWxwaGEgMT8KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpDb3JlIGxhbmd1YWdlLCBidWlsdGlucywgYW5kIGludGVycHJldGVyCgotIFRoZXJlIGlzIGEgbmV3IFVuaWNvZGUgY29tcGFuaW9uIHRvIHRoZSBQeU9iamVjdF9TdHIoKSBBUEkKICBjYWxsZWQgUHlPYmplY3RfVW5pY29kZSgpLiBJdCBiZWhhdmVzIGluIHRoZSBzYW1lIHdheSBhcyB0aGUKICBmb3JtZXIsIGJ1dCBhc3N1cmVzIHRoYXQgdGhlIHJldHVybmVkIHZhbHVlIGlzIGFuIFVuaWNvZGUgb2JqZWN0CiAgKGFwcGx5aW5nIHRoZSB1c3VhbCBjb2VyY2lvbiBpZiBuZWNlc3NhcnkpLgoKLSBUaGUgY29tcGFyaXNvbiBvcGVyYXRvcnMgc3VwcG9ydCAicmljaCBjb21wYXJpc29uIG92ZXJsb2FkaW5nIiAoUEVQCiAgMjA3KS4gIEMgZXh0ZW5zaW9uIHR5cGVzIGNhbiBwcm92aWRlIGEgcmljaCBjb21wYXJpc29uIGZ1bmN0aW9uIGluCiAgdGhlIG5ldyB0cF9yaWNoY29tcGFyZSBzbG90IGluIHRoZSB0eXBlIG9iamVjdC4gIFRoZSBjbXAoKSBmdW5jdGlvbgogIGFuZCB0aGUgQyBmdW5jdGlvbiBQeU9iamVjdF9Db21wYXJlKCkgZmlyc3QgdHJ5IHRoZSBuZXcgcmljaAogIGNvbXBhcmlzb24gb3BlcmF0b3JzIGJlZm9yZSB0cnlpbmcgdGhlIG9sZCAzLXdheSBjb21wYXJpc29uLiAgVGhlcmUKICBpcyBhbHNvIGEgbmV3IEMgQVBJIFB5T2JqZWN0X1JpY2hDb21wYXJlKCkgKHdoaWNoIGFsc28gZmFsbHMgYmFjayBvbgogIHRoZSBvbGQgMy13YXkgY29tcGFyaXNvbiwgYnV0IGRvZXMgbm90IGNvbnN0cmFpbiB0aGUgb3V0Y29tZSBvZiB0aGUKICByaWNoIGNvbXBhcmlzb24gdG8gYSBCb29sZWFuIHJlc3VsdCkuCgogIFRoZSByaWNoIGNvbXBhcmlzb24gZnVuY3Rpb24gdGFrZXMgdHdvIG9iamVjdHMgKGF0IGxlYXN0IG9uZSBvZgogIHdoaWNoIGlzIGd1YXJhbnRlZWQgdG8gaGF2ZSB0aGUgdHlwZSB0aGF0IHByb3ZpZGVkIHRoZSBmdW5jdGlvbikgYW5kCiAgYW4gaW50ZWdlciBpbmRpY2F0aW5nIHRoZSBvcGNvZGUsIHdoaWNoIGNhbiBiZSBQeV9MVCwgUHlfTEUsIFB5X0VRLAogIFB5X05FLCBQeV9HVCwgUHlfR0UgKGZvciA8LCA8PSwgPT0sICE9LCA+LCA+PSksIGFuZCByZXR1cm5zIGEgUHl0aG9uCiAgb2JqZWN0LCB3aGljaCBtYXkgYmUgTm90SW1wbGVtZW50ZWQgKGluIHdoaWNoIGNhc2UgdGhlIHRwX2NvbXBhcmUKICBzbG90IGZ1bmN0aW9uIGlzIHVzZWQgYXMgYSBmYWxsYmFjaywgaWYgZGVmaW5lZCkuCgogIENsYXNzZXMgY2FuIG92ZXJsb2FkIGluZGl2aWR1YWwgY29tcGFyaXNvbiBvcGVyYXRvcnMgYnkgZGVmaW5pbmcgb25lCiAgb3IgbW9yZSBvZiB0aGUgbWV0aG9kc19fbHRfXywgX19sZV9fLCBfX2VxX18sIF9fbmVfXywgX19ndF9fLAogIF9fZ2VfXy4gIFRoZXJlIGFyZSBubyBleHBsaWNpdCAicmVmbGVjdGVkIGFyZ3VtZW50IiB2ZXJzaW9ucyBvZgogIHRoZXNlOyBpbnN0ZWFkLCBfX2x0X18gYW5kIF9fZ3RfXyBhcmUgZWFjaCBvdGhlcidzIHJlZmxlY3Rpb24sCiAgbGlrZXdpc2UgZm9yX19sZV9fIGFuZCBfX2dlX187IF9fZXFfXyBhbmQgX19uZV9fIGFyZSB0aGVpciBvd24KICByZWZsZWN0aW9uIChzaW1pbGFyIGF0IHRoZSBDIGxldmVsKS4gIE5vIG90aGVyIGltcGxpY2F0aW9ucyBhcmUKICBtYWRlOyBpbiBwYXJ0aWN1bGFyLCBQeXRob24gZG9lcyBub3QgYXNzdW1lIHRoYXQgPT0gaXMgdGhlIEJvb2xlYW4KICBpbnZlcnNlIG9mICE9LCBvciB0aGF0IDwgaXMgdGhlIEJvb2xlYW4gaW52ZXJzZSBvZiA+PS4gIFRoaXMgbWFrZXMKICBpdCBwb3NzaWJsZSB0byBkZWZpbmUgdHlwZXMgd2l0aCBwYXJ0aWFsIG9yZGVyaW5ncy4KCiAgQ2xhc3NlcyBvciB0eXBlcyB0aGF0IHdhbnQgdG8gaW1wbGVtZW50IChpbillcXVhbGl0eSB0ZXN0cyBidXQgbm90CiAgdGhlIG9yZGVyaW5nIG9wZXJhdG9ycyAoaS5lLiB1bm9yZGVyZWQgdHlwZXMpIHNob3VsZCBpbXBsZW1lbnQgPT0KICBhbmQgIT0sIGFuZCByYWlzZSBhbiBlcnJvciBmb3IgdGhlIG9yZGVyaW5nIG9wZXJhdG9ycy4KCiAgSXQgaXMgcG9zc2libGUgdG8gZGVmaW5lIHR5cGVzIHdob3NlIHJpY2ggY29tcGFyaXNvbiByZXN1bHRzIGFyZSBub3QKICBCb29sZWFuOyBlLmcuIGEgbWF0cml4IHR5cGUgbWlnaHQgd2FudCB0byByZXR1cm4gYSBtYXRyaXggb2YgYml0cwogIGZvciBBIDwgQiwgZ2l2aW5nIGVsZW1lbnR3aXNlIGNvbXBhcmlzb25zLiAgU3VjaCB0eXBlcyBzaG91bGQgZW5zdXJlCiAgdGhhdCBhbnkgaW50ZXJwcmV0YXRpb24gb2YgdGhlaXIgdmFsdWUgaW4gYSBCb29sZWFuIGNvbnRleHQgcmFpc2VzCiAgYW4gZXhjZXB0aW9uLCBlLmcuIGJ5IGRlZmluaW5nIF9fbm9uemVyb19fIChvciB0aGUgdHBfbm9uemVybyBzbG90CiAgYXQgdGhlIEMgbGV2ZWwpIHRvIGFsd2F5cyByYWlzZSBhbiBleGNlcHRpb24uCgotIENvbXBsZXggbnVtYmVycyB1c2UgcmljaCBjb21wYXJpc29ucyB0byBkZWZpbmUgPT0gYW5kICE9IGJ1dCByYWlzZQogIGFuIGV4Y2VwdGlvbiBmb3IgPCwgPD0sID4gYW5kID49LiAgVW5mb3J0dW5hdGVseSwgdGhpcyBhbHNvIG1lYW5zCiAgdGhhdCBjbXAoKSBvZiB0d28gY29tcGxleCBudW1iZXJzIHJhaXNlcyBhbiBleGNlcHRpb24gd2hlbiB0aGUgdHdvCiAgbnVtYmVycyBkaWZmZXIuICBTaW5jZSBpdCBpcyBub3QgbWF0aGVtYXRpY2FsbHkgbWVhbmluZ2Z1bCB0byBjb21wYXJlCiAgY29tcGxleCBudW1iZXJzIGV4Y2VwdCBmb3IgZXF1YWxpdHksIEkgaG9wZSB0aGF0IHRoaXMgZG9lc24ndCBicmVhawogIHRvbyBtdWNoIGNvZGUuCgotIFRoZSBvdXRjb21lIG9mIGNvbXBhcmluZyBub24tbnVtZXJpYyBvYmplY3RzIG9mIGRpZmZlcmVudCB0eXBlcyBpcwogIG5vdCBkZWZpbmVkIGJ5IHRoZSBsYW5ndWFnZSwgb3RoZXIgdGhhbiB0aGF0IGl0J3MgYXJiaXRyYXJ5IGJ1dAogIGNvbnNpc3RlbnQgKHNlZSB0aGUgUmVmZXJlbmNlIE1hbnVhbCkuICBBbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWwgY2hhbmdlZAogIGluIDIuMWExIHN1Y2ggdGhhdCBOb25lIG5vdyBjb21wYXJlcyBsZXNzIHRoYW4gYW55IG90aGVyIG9iamVjdC4gIENvZGUKICByZWx5aW5nIG9uIHRoaXMgbmV3IGJlaGF2aW9yIChsaWtlIGNvZGUgdGhhdCByZWxpZWQgb24gdGhlIHByZXZpb3VzCiAgYmVoYXZpb3IpIGRvZXMgc28gYXQgaXRzIG93biByaXNrLgoKLSBGdW5jdGlvbnMgYW5kIG1ldGhvZHMgbm93IHN1cHBvcnQgZ2V0dGluZyBhbmQgc2V0dGluZyBhcmJpdHJhcmlseQogIG5hbWVkIGF0dHJpYnV0ZXMgKFBFUCAyMzIpLiAgRnVuY3Rpb25zIGhhdmUgYSBuZXcgX19kaWN0X18KICAoYS5rLmEuIGZ1bmNfZGljdCkgd2hpY2ggaG9sZCB0aGUgZnVuY3Rpb24gYXR0cmlidXRlcy4gIE1ldGhvZHMgZ2V0CiAgYW5kIHNldCBhdHRyaWJ1dGVzIG9uIHRoZWlyIHVuZGVybHlpbmcgaW1fZnVuYy4gIEl0IGlzIGEgVHlwZUVycm9yCiAgdG8gc2V0IGFuIGF0dHJpYnV0ZSBvbiBhIGJvdW5kIG1ldGhvZC4KCi0gVGhlIHhyYW5nZSgpIG9iamVjdCBpbXBsZW1lbnRhdGlvbiBoYXMgYmVlbiBpbXByb3ZlZCBzbyB0aGF0CiAgeHJhbmdlKHN5cy5tYXhpbnQpIGNhbiBiZSB1c2VkIG9uIDY0LWJpdCBwbGF0Zm9ybXMuICBUaGVyZSdzIHN0aWxsIGEKICBsaW1pdGF0aW9uIHRoYXQgaW4gdGhpcyBjYXNlIGxlbih4cmFuZ2Uoc3lzLm1heGludCkpIGNhbid0IGJlCiAgY2FsY3VsYXRlZCwgYnV0IHRoZSBjb21tb24gaWRpb20gImZvciBpIGluIHhyYW5nZShzeXMubWF4aW50KSIgd2lsbAogIHdvcmsgZmluZSBhcyBsb25nIGFzIHRoZSBpbmRleCBpIGRvZXNuJ3QgYWN0dWFsbHkgcmVhY2ggMioqMzEuCiAgKFB5dGhvbiB1c2VzIHJlZ3VsYXIgaW50cyBmb3Igc2VxdWVuY2UgYW5kIHN0cmluZyBpbmRpY2VzOyBmaXhpbmcKICB0aGF0IGlzIG11Y2ggbW9yZSB3b3JrLikKCi0gVHdvIGNoYW5nZXMgdG8gZnJvbS4uLmltcG9ydDoKCiAgMSkgImZyb20gTSBpbXBvcnQgWCIgbm93IHdvcmtzIGV2ZW4gaWYgKGFmdGVyIGxvYWRpbmcgbW9kdWxlIE0pCiAgICAgc3lzLm1vZHVsZXNbJ00nXSBpcyBub3QgYSByZWFsIG1vZHVsZTsgaXQncyBiYXNpY2FsbHkgYSBnZXRhdHRyKCkKICAgICBvcGVyYXRpb24gd2l0aCBBdHRyaWJ1dGVFcnJvciBleGNlcHRpb25zIGNoYW5nZWQgaW50byBJbXBvcnRFcnJvci4KCiAgMikgImZyb20gTSBpbXBvcnQgKiIgbm93IGxvb2tzIGZvciBNLl9fYWxsX18gdG8gZGVjaWRlIHdoaWNoIG5hbWVzIHRvCiAgICAgaW1wb3J0OyBpZiBNLl9fYWxsX18gZG9lc24ndCBleGlzdCwgaXQgdXNlcyBNLl9fZGljdF9fLmtleXMoKSBidXQKICAgICBmaWx0ZXJzIG91dCBuYW1lcyBzdGFydGluZyB3aXRoICdfJyBhcyBiZWZvcmUuICBXaGV0aGVyIG9yIG5vdAogICAgIF9fYWxsX18gZXhpc3RzLCB0aGVyZSdzIG5vIHJlc3RyaWN0aW9uIG9uIHRoZSB0eXBlIG9mIE0uCgotIEZpbGUgb2JqZWN0cyBoYXZlIGEgbmV3IG1ldGhvZCwgeHJlYWRsaW5lcygpLiAgVGhpcyBpcyB0aGUgZmFzdGVzdAogIHdheSB0byBpdGVyYXRlIG92ZXIgYWxsIGxpbmVzIGluIGEgZmlsZToKCiAgZm9yIGxpbmUgaW4gZmlsZS54cmVhZGxpbmVzKCk6CiAgICAgIC4uLmRvIHNvbWV0aGluZyB0byBsaW5lLi4uCgogIFNlZSB0aGUgeHJlYWRsaW5lcyBtb2R1bGUgKG1lbnRpb25lZCBiZWxvdykgZm9yIGhvdyB0byBkbyB0aGlzIGZvcgogIG90aGVyIGZpbGUtbGlrZSBvYmplY3RzLgoKLSBFdmVuIGlmIHlvdSBkb24ndCB1c2UgZmlsZS54cmVhZGxpbmVzKCksIHlvdSBtYXkgZXhwZWN0IGEgc3BlZWR1cCBvbgogIGxpbmUtYnktbGluZSBpbnB1dC4gIFRoZSBmaWxlLnJlYWRsaW5lKCkgbWV0aG9kIGhhcyBiZWVuIG9wdGltaXplZAogIHF1aXRlIGEgYml0IGluIHBsYXRmb3JtLXNwZWNpZmljIHdheXM6ICBvbiBzeXN0ZW1zIChsaWtlIExpbnV4KSB0aGF0CiAgc3VwcG9ydCBmbG9ja2ZpbGUoKSwgZ2V0Y191bmxvY2tlZCgpLCBhbmQgZnVubG9ja2ZpbGUoKSwgdGhvc2UgYXJlCiAgdXNlZCBieSBkZWZhdWx0LiAgT24gc3lzdGVtcyAobGlrZSBXaW5kb3dzKSB3aXRob3V0IGdldGNfdW5sb2NrZWQoKSwKICBhIGNvbXBsaWNhdGVkIChidXQgc3RpbGwgdGhyZWFkLXNhZmUpIG1ldGhvZCB1c2luZyBmZ2V0cygpIGlzIHVzZWQgYnkKICBkZWZhdWx0LgoKICBZb3UgY2FuIGZvcmNlIHVzZSBvZiB0aGUgZmdldHMoKSBtZXRob2QgYnkgI2RlZmluZSdpbmcKICBVU0VfRkdFVFNfSU5fR0VUTElORSBhdCBidWlsZCB0aW1lIChpdCBtYXkgYmUgZmFzdGVyIHRoYW4KICBnZXRjX3VubG9ja2VkKCkpLgoKICBZb3UgY2FuIGZvcmNlIGZnZXRzKCkgbm90IHRvIGJlIHVzZWQgYnkgI2RlZmluZSdpbmcKICBET05UX1VTRV9GR0VUU19JTl9HRVRMSU5FICh0aGlzIGlzIHRoZSBmaXJzdCB0aGluZyB0byB0cnkgaWYgc3RkIHRlc3QKICB0ZXN0X2J1ZmlvLnB5IGZhaWxzIC0tIGFuZCBsZXQgdXMga25vdyBpZiBpdCBkb2VzISkuCgotIEluIGFkZGl0aW9uLCB0aGUgZmlsZWlucHV0IG1vZHVsZSwgd2hpbGUgc3RpbGwgc2xvd2VyIHRoYW4gdGhlIG90aGVyCiAgbWV0aG9kcyBvbiBtb3N0IHBsYXRmb3JtcywgaGFzIGJlZW4gc3BlZCB1cCB0b28sIGJ5IHVzaW5nCiAgZmlsZS5yZWFkbGluZXMoc2l6ZWhpbnQpLgoKLSBTdXBwb3J0IGZvciBydW4tdGltZSB3YXJuaW5ncyBoYXMgYmVlbiBhZGRlZCwgaW5jbHVkaW5nIGEgbmV3CiAgY29tbWFuZCBsaW5lIG9wdGlvbiAoLVcpIHRvIHNwZWNpZnkgdGhlIGRpc3Bvc2l0aW9uIG9mIHdhcm5pbmdzLgogIFNlZSB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIHdhcm5pbmdzIG1vZHVsZSBiZWxvdy4KCi0gRXh0ZW5zaXZlIGNoYW5nZXMgaGF2ZSBiZWVuIG1hZGUgdG8gdGhlIGNvZXJjaW9uIGNvZGUuICBUaGlzIG1vc3RseQogIGFmZmVjdHMgZXh0ZW5zaW9uIG1vZHVsZXMgKHdoaWNoIGNhbiBub3cgaW1wbGVtZW50IG1peGVkLXR5cGUKICBudW1lcmljYWwgb3BlcmF0b3JzIHdpdGhvdXQgaGF2aW5nIHRvIHVzZSBjb2VyY2lvbiksIGJ1dAogIG9jY2FzaW9uYWxseSwgaW4gYm91bmRhcnkgY2FzZXMgdGhlIGNvZXJjaW9uIHNlbWFudGljcyBoYXZlIGNoYW5nZWQKICBzdWJ0bHkuICBTaW5jZSB0aGlzIHdhcyBhIHRlcnJpYmxlIGdyYXkgYXJlYSBvZiB0aGUgbGFuZ3VhZ2UsIHRoaXMKICBpcyBjb25zaWRlcmVkIGFuIGltcHJvdmVtZW50LiAgQWxzbyBub3RlIHRoYXQgX19yY21wX18gaXMgbm8gbG9uZ2VyCiAgc3VwcG9ydGVkIC0tIGluc3RlYWQgb2YgY2FsbGluZyBfX3JjbXBfXywgX19jbXBfXyBpcyBjYWxsZWQgd2l0aAogIHJlZmxlY3RlZCBhcmd1bWVudHMuCgotIEluIGNvbm5lY3Rpb24gd2l0aCB0aGUgY29lcmNpb24gY2hhbmdlcywgYSBuZXcgYnVpbHQtaW4gc2luZ2xldG9uCiAgb2JqZWN0LCBOb3RJbXBsZW1lbnRlZCBpcyBkZWZpbmVkLiAgVGhpcyBjYW4gYmUgcmV0dXJuZWQgZm9yCiAgb3BlcmF0aW9ucyB0aGF0IHdpc2ggdG8gaW5kaWNhdGUgdGhleSBhcmUgbm90IGltcGxlbWVudGVkIGZvciBhCiAgcGFydGljdWxhciBjb21iaW5hdGlvbiBvZiBhcmd1bWVudHMuICBGcm9tIEMsIHRoaXMgaXMKICBQeV9Ob3RJbXBsZW1lbnRlZC4KCi0gVGhlIGludGVycHJldGVyIGFjY2VwdHMgbm93IGJ5dGVjb2RlIGZpbGVzIG9uIHRoZSBjb21tYW5kIGxpbmUgZXZlbgogIGlmIHRoZXkgZG8gbm90IGhhdmUgYSAucHljIG9yIC5weW8gZXh0ZW5zaW9uLiBPbiBMaW51eCwgYWZ0ZXIgZXhlY3V0aW5nCgppbXBvcnQgaW1wLHN5cyxzdHJpbmcKbWFnaWMgPSBzdHJpbmcuam9pbihbIlxceCUuMngiICUgb3JkKGMpIGZvciBjIGluIGltcC5nZXRfbWFnaWMoKV0sIiIpCnJlZyA9ICc6cHljOk06OiVzOjolczonICUgKG1hZ2ljLCBzeXMuZXhlY3V0YWJsZSkKb3BlbigiL3Byb2Mvc3lzL2ZzL2JpbmZtdF9taXNjL3JlZ2lzdGVyIiwid2IiKS53cml0ZShyZWcpCgogIGFueSBieXRlIGNvZGUgZmlsZSBjYW4gYmUgdXNlZCBhcyBhbiBleGVjdXRhYmxlIChpLmUuIGFzIGFuIGFyZ3VtZW50CiAgdG8gZXhlY3ZlKDIpKS4KCi0gJVt4WG9dIGZvcm1hdHMgb2YgbmVnYXRpdmUgUHl0aG9uIGxvbmdzIG5vdyBwcm9kdWNlIGEgc2lnbgogIGNoYXJhY3Rlci4gIEluIDEuNiBhbmQgZWFybGllciwgdGhleSBuZXZlciBwcm9kdWNlZCBhIHNpZ24sCiAgYW5kIHJhaXNlZCBhbiBlcnJvciBpZiB0aGUgdmFsdWUgb2YgdGhlIGxvbmcgd2FzIHRvbyBsYXJnZQogIHRvIGZpdCBpbiBhIFB5dGhvbiBpbnQuICBJbiAyLjAsIHRoZXkgcHJvZHVjZWQgYSBzaWduIGlmIGFuZAogIG9ubHkgaWYgdG9vIGxhcmdlIHRvIGZpdCBpbiBhbiBpbnQuICBUaGlzIHdhcyBpbmNvbnNpc3RlbnQKICBhY3Jvc3MgcGxhdGZvcm1zIChiZWNhdXNlIHRoZSBzaXplIG9mIGFuIGludCB2YXJpZXMgYWNyb3NzCiAgcGxhdGZvcm1zKSwgYW5kIGluY29uc2lzdGVudCB3aXRoIGhleCgpIGFuZCBvY3QoKS4gIEV4YW1wbGU6CgogID4+PiAiJXgiICUgLTB4NDJMCiAgJy00MicgICAgICAjIGluIDIuMQogICdmZmZmZmZiZScgIyBpbiAyLjAgYW5kIGJlZm9yZSwgb24gMzItYml0IG1hY2hpbmVzCiAgPj4+IGhleCgtMHg0MkwpCiAgJy0weDQyTCcgICAjIGluIGFsbCB2ZXJzaW9ucyBvZiBQeXRob24KCiAgVGhlIGJlaGF2aW9yIG9mICVkIGZvcm1hdHMgZm9yIG5lZ2F0aXZlIFB5dGhvbiBsb25ncyByZW1haW5zCiAgdGhlIHNhbWUgYXMgaW4gMi4wIChhbHRob3VnaCBpbiAxLjYgYW5kIGJlZm9yZSwgdGhleSByYWlzZWQKICBhbiBlcnJvciBpZiB0aGUgbG9uZyBkaWRuJ3QgZml0IGluIGEgUHl0aG9uIGludCkuCgogICV1IGZvcm1hdHMgZG9uJ3QgbWFrZSBzZW5zZSBmb3IgUHl0aG9uIGxvbmdzLCBidXQgYXJlIGFsbG93ZWQKICBhbmQgdHJlYXRlZCB0aGUgc2FtZSBhcyAlZCBpbiAyLjEuICBJbiAyLjAsIGEgbmVnYXRpdmUgbG9uZwogIGZvcm1hdHRlZCB2aWEgJXUgcHJvZHVjZWQgYSBzaWduIGlmIGFuZCBvbmx5IGlmIHRvbyBsYXJnZSB0bwogIGZpdCBpbiBhbiBpbnQuICBJbiAxLjYgYW5kIGVhcmxpZXIsIGEgbmVnYXRpdmUgbG9uZyBmb3JtYXR0ZWQKICB2aWEgJXUgcmFpc2VkIGFuIGVycm9yIGlmIGl0IHdhcyB0b28gYmlnIHRvIGZpdCBpbiBhbiBpbnQuCgotIERpY3Rpb25hcnkgb2JqZWN0cyBoYXZlIGFuIG9kZCBuZXcgbWV0aG9kLCBwb3BpdGVtKCkuICBUaGlzIHJlbW92ZXMKICBhbiBhcmJpdHJhcnkgaXRlbSBmcm9tIHRoZSBkaWN0aW9uYXJ5IGFuZCByZXR1cm5zIGl0IChpbiB0aGUgZm9ybSBvZgogIGEgKGtleSwgdmFsdWUpIHBhaXIpLiAgVGhpcyBjYW4gYmUgdXNlZnVsIGZvciBhbGdvcml0aG1zIHRoYXQgdXNlIGEKICBkaWN0aW9uYXJ5IGFzIGEgYmFnIG9mICJ0byBkbyIgaXRlbXMgYW5kIHJlcGVhdGVkbHkgbmVlZCB0byBwaWNrIG9uZQogIGl0ZW0uICBTdWNoIGFsZ29yaXRobXMgbm9ybWFsbHkgZW5kIHVwIHJ1bm5pbmcgaW4gcXVhZHJhdGljIHRpbWU7CiAgdXNpbmcgcG9waXRlbSgpIHRoZXkgY2FuIHVzdWFsbHkgYmUgbWFkZSB0byBydW4gaW4gbGluZWFyIHRpbWUuCgpTdGFuZGFyZCBsaWJyYXJ5CgotIEluIHRoZSB0aW1lIG1vZHVsZSwgdGhlIHRpbWUgYXJndW1lbnQgdG8gdGhlIGZ1bmN0aW9ucyBzdHJmdGltZSwKICBsb2NhbHRpbWUsIGdtdGltZSwgYXNjdGltZSBhbmQgY3RpbWUgaXMgbm93IG9wdGlvbmFsLCBkZWZhdWx0aW5nIHRvCiAgdGhlIGN1cnJlbnQgdGltZSAoaW4gdGhlIGxvY2FsIHRpbWV6b25lKS4KCi0gVGhlIGZ0cGxpYiBtb2R1bGUgbm93IGRlZmF1bHRzIHRvIHBhc3NpdmUgbW9kZSwgd2hpY2ggaXMgZGVlbWVkIGEKICBtb3JlIHVzZWZ1bCBkZWZhdWx0IGdpdmVuIHRoYXQgY2xpZW50cyBhcmUgb2Z0ZW4gaW5zaWRlIGZpcmV3YWxscwogIHRoZXNlIGRheXMuICBOb3RlIHRoYXQgdGhpcyBjb3VsZCBicmVhayBpZiBmdHBsaWIgaXMgdXNlZCB0byBjb25uZWN0CiAgdG8gYSAqc2VydmVyKiB0aGF0IGlzIGluc2lkZSBhIGZpcmV3YWxsLCBmcm9tIG91dHNpZGU7IHRoaXMgaXMKICBleHBlY3RlZCB0byBiZSBhIHZlcnkgcmFyZSBzaXR1YXRpb24uICBUbyBmaXggdGhhdCwgeW91IGNhbiBjYWxsCiAgZnRwLnNldF9wYXN2KDApLgoKLSBUaGUgbW9kdWxlIHNpdGUgbm93IHRyZWF0cyAucHRoIGZpbGVzIG5vdCBvbmx5IGZvciBwYXRoIGNvbmZpZ3VyYXRpb24sCiAgYnV0IGFsc28gc3VwcG9ydHMgZXh0ZW5zaW9ucyB0byB0aGUgaW5pdGlhbGl6YXRpb24gY29kZTogTGluZXMgc3RhcnRpbmcKICB3aXRoIGltcG9ydCBhcmUgZXhlY3V0ZWQuCgotIFRoZXJlJ3MgYSBuZXcgbW9kdWxlLCB3YXJuaW5ncywgd2hpY2ggaW1wbGVtZW50cyBhIG1lY2hhbmlzbSBmb3IKICBpc3N1aW5nIGFuZCBmaWx0ZXJpbmcgd2FybmluZ3MuICBUaGVyZSBhcmUgc29tZSBuZXcgYnVpbHQtaW4KICBleGNlcHRpb25zIHRoYXQgc2VydmUgYXMgd2FybmluZyBjYXRlZ29yaWVzLCBhbmQgYSBuZXcgY29tbWFuZCBsaW5lCiAgb3B0aW9uLCAtVywgdG8gY29udHJvbCB3YXJuaW5ncyAoZS5nLiAtV2kgaWdub3JlcyBhbGwgd2FybmluZ3MsIC1XZQogIHR1cm5zIHdhcm5pbmdzIGludG8gZXJyb3JzKS4gIHdhcm5pbmdzLndhcm4obWVzc2FnZVssIGNhdGVnb3J5XSkKICBpc3N1ZXMgYSB3YXJuaW5nIG1lc3NhZ2U7IHRoaXMgY2FuIGFsc28gYmUgY2FsbGVkIGZyb20gQyBhcwogIFB5RXJyX1dhcm4oY2F0ZWdvcnksIG1lc3NhZ2UpLgoKLSBBIG5ldyBtb2R1bGUgeHJlYWRsaW5lcyB3YXMgYWRkZWQuICBUaGlzIGV4cG9ydHMgYSBzaW5nbGUgZmFjdG9yeQogIGZ1bmN0aW9uLCB4cmVhZGxpbmVzKCkuICBUaGUgaW50ZW50aW9uIGlzIHRoYXQgdGhpcyBjb2RlIGlzIHRoZQogIGFic29sdXRlbHkgZmFzdGVzdCB3YXkgdG8gaXRlcmF0ZSBvdmVyIGFsbCBsaW5lcyBpbiBhbiBvcGVuCiAgZmlsZSgtbGlrZSkgb2JqZWN0OgoKICBpbXBvcnQgeHJlYWRsaW5lcwogIGZvciBsaW5lIGluIHhyZWFkbGluZXMueHJlYWRsaW5lcyhmaWxlKToKICAgICAgLi4uZG8gc29tZXRoaW5nIHRvIGxpbmUuLi4KCiAgVGhpcyBpcyBlcXVpdmFsZW50IHRvIHRoZSBwcmV2aW91cyB0aGUgc3BlZWQgcmVjb3JkIGhvbGRlciB1c2luZwogIGZpbGUucmVhZGxpbmVzKHNpemVoaW50KS4gIE5vdGUgdGhhdCBpZiBmaWxlIGlzIGEgcmVhbCBmaWxlIG9iamVjdAogIChhcyBvcHBvc2VkIHRvIGEgZmlsZS1saWtlIG9iamVjdCksIHRoaXMgaXMgZXF1aXZhbGVudDoKCiAgZm9yIGxpbmUgaW4gZmlsZS54cmVhZGxpbmVzKCk6CiAgICAgIC4uLmRvIHNvbWV0aGluZyB0byBsaW5lLi4uCgotIFRoZSBiaXNlY3QgbW9kdWxlIGhhcyBuZXcgZnVuY3Rpb25zIGJpc2VjdF9sZWZ0LCBpbnNvcnRfbGVmdCwKICBiaXNlY3RfcmlnaHQgYW5kIGluc29ydF9yaWdodC4gIFRoZSBvbGQgbmFtZXMgYmlzZWN0IGFuZCBpbnNvcnQKICBhcmUgbm93IGFsaWFzZXMgZm9yIGJpc2VjdF9yaWdodCBhbmQgaW5zb3J0X3JpZ2h0LiAgWFhYX3JpZ2h0CiAgYW5kIFhYWF9sZWZ0IG1ldGhvZHMgZGlmZmVyIGluIHdoYXQgaGFwcGVucyB3aGVuIHRoZSBuZXcgZWxlbWVudAogIGNvbXBhcmVzIGVxdWFsIHRvIG9uZSBvciBtb3JlIGVsZW1lbnRzIGFscmVhZHkgaW4gdGhlIGxpc3Q6ICB0aGUKICBYWFhfbGVmdCBtZXRob2RzIGluc2VydCB0byB0aGUgbGVmdCwgdGhlIFhYWF9yaWdodCBtZXRob2RzIHRvIHRoZQogIHJpZ2h0LiAgQ29kZSB0aGF0IGRvZXNuJ3QgY2FyZSB3aGVyZSBlcXVhbCBlbGVtZW50cyBlbmQgdXAgc2hvdWxkCiAgY29udGludWUgdG8gdXNlIHRoZSBvbGQsIHNob3J0IG5hbWVzICgiYmlzZWN0IiBhbmQgImluc29ydCIpLgoKLSBUaGUgbmV3IGN1cnNlcy5wYW5lbCBtb2R1bGUgd3JhcHMgdGhlIHBhbmVsIGxpYnJhcnkgdGhhdCBmb3JtcyBwYXJ0CiAgb2YgU1lTViBjdXJzZXMgYW5kIG5jdXJzZXMuICBDb250cmlidXRlZCBieSBUaG9tYXMgR2VsbGVrdW0uCgotIFRoZSBTb2NrZXRTZXJ2ZXIgbW9kdWxlIG5vdyBzZXRzIHRoZSBhbGxvd19yZXVzZV9hZGRyZXNzIGZsYWcgYnkKICBkZWZhdWx0IGluIHRoZSBUQ1BTZXJ2ZXIgY2xhc3MuCgotIEEgbmV3IGZ1bmN0aW9uLCBzeXMuX2dldGZyYW1lKCksIHJldHVybnMgdGhlIHN0YWNrIGZyYW1lIHBvaW50ZXIgb2YKICB0aGUgY2FsbGVyLiAgVGhpcyBpcyBpbnRlbmRlZCBvbmx5IGFzIGEgYnVpbGRpbmcgYmxvY2sgZm9yCiAgaGlnaGVyLWxldmVsIG1lY2hhbmlzbXMgc3VjaCBhcyBzdHJpbmcgaW50ZXJwb2xhdGlvbi4KCi0gVGhlIHB5ZXhwYXQgbW9kdWxlIHN1cHBvcnRzIGEgbnVtYmVyIG9mIG5ldyBoYW5kbGVycywgd2hpY2ggYXJlCiAgYXZhaWxhYmxlIG9ubHkgaW4gZXhwYXQgMS4yLiBJZiBpbnZvY2F0aW9uIG9mIGEgY2FsbGJhY2sgZmFpbHMsIGl0CiAgd2lsbCByZXBvcnQgYW4gYWRkaXRpb25hbCBmcmFtZSBpbiB0aGUgdHJhY2ViYWNrLiBQYXJzZXIgb2JqZWN0cwogIHBhcnRpY2lwYXRlIG5vdyBpbiBnYXJiYWdlIGNvbGxlY3Rpb24uIElmIGV4cGF0IHJlcG9ydHMgYW4gdW5rbm93bgogIGVuY29kaW5nLCBweWV4cGF0IHdpbGwgdHJ5IHRvIHVzZSBhIFB5dGhvbiBjb2RlYzsgdGhhdCB3b3JrcyBvbmx5CiAgZm9yIHNpbmdsZS1ieXRlIGNoYXJzZXRzLiBUaGUgcGFyc2VyIHR5cGUgb2JqZWN0cyBpcyBleHBvc2VkIGFzCiAgWE1MUGFyc2VyT2JqZWN0LgoKLSB4bWwuZG9tIG5vdyBvZmZlcnMgc3RhbmRhcmQgZGVmaW5pdGlvbnMgZm9yIHN5bWJvbGljIG5vZGUgdHlwZSBhbmQKICBleGNlcHRpb24gY29kZSBjb25zdGFudHMsIGFuZCBhIGhpZXJhcmNoeSBvZiBET00gZXhjZXB0aW9ucy4gbWluaWRvbQogIHdhcyBhZGp1c3RlZCB0byB1c2UgdGhlbS4KCi0gVGhlIGNvbmZvcm1hbmNlIG9mIHhtbC5kb20ubWluaWRvbSB0byB0aGUgRE9NIHNwZWNpZmljYXRpb24gd2FzCiAgaW1wcm92ZWQuIEl0IGRldGVjdHMgYSBudW1iZXIgb2YgYWRkaXRpb25hbCBlcnJvciBjYXNlczsgdGhlCiAgcHJldmlvdXMvbmV4dCByZWxhdGlvbnNoaXAgd29ya3MgZXZlbiB3aGVuIHRoZSB0cmVlIGlzIG1vZGlmaWVkOwogIE5vZGUgc3VwcG9ydHMgdGhlIG5vcm1hbGl6ZSgpIG1ldGhvZDsgTmFtZWROb2RlTWFwLCBEb2N1bWVudFR5cGUgYW5kCiAgRE9NSW1wbGVtZW50YXRpb24gY2xhc3NlcyB3ZXJlIGFkZGVkOyBFbGVtZW50IHN1cHBvcnRzIHRoZQogIGhhc0F0dHJpYnV0ZSBhbmQgaGFzQXR0cmlidXRlTlMgbWV0aG9kczsgYW5kIFRleHQgc3VwcG9ydHMgdGhlIHNwbGl0VGV4dAogIG1ldGhvZC4KCkJ1aWxkIGlzc3VlcwoKLSBGb3IgVW5peCAoYW5kIFVuaXgtY29tcGF0aWJsZSkgYnVpbGRzLCBjb25maWd1cmF0aW9uIGFuZCBidWlsZGluZyBvZgogIGV4dGVuc2lvbiBtb2R1bGVzIGlzIG5vdyBncmVhdGx5IGF1dG9tYXRlZC4gIFJhdGhlciB0aGFuIGhhdmluZyB0bwogIGVkaXQgdGhlIE1vZHVsZXMvU2V0dXAgZmlsZSB0byBpbmRpY2F0ZSB3aGljaCBtb2R1bGVzIHNob3VsZCBiZQogIGJ1aWx0IGFuZCB3aGVyZSB0aGVpciBpbmNsdWRlIGZpbGVzIGFuZCBsaWJyYXJpZXMgYXJlLCBhCiAgZGlzdHV0aWxzLWJhc2VkIHNldHVwLnB5IHNjcmlwdCBub3cgdGFrZXMgY2FyZSBvZiBidWlsZGluZyBtb3N0CiAgZXh0ZW5zaW9uIG1vZHVsZXMuICBBbGwgZXh0ZW5zaW9uIG1vZHVsZXMgYnVpbHQgdGhpcyB3YXkgYXJlIGJ1aWx0CiAgYXMgc2hhcmVkIGxpYnJhcmllcy4gIE9ubHkgYSBmZXcgbW9kdWxlcyB0aGF0IG11c3QgYmUgbGlua2VkCiAgc3RhdGljYWxseSBhcmUgc3RpbGwgbGlzdGVkIGluIHRoZSBTZXR1cCBmaWxlOyB5b3Ugd29uJ3QgbmVlZCB0bwogIGVkaXQgdGhlaXIgY29uZmlndXJhdGlvbi4KCi0gUHl0aG9uIHNob3VsZCBub3cgYnVpbGQgb3V0IG9mIHRoZSBib3ggb24gQ3lnd2luLiAgSWYgaXQgZG9lc24ndCwKICBtYWlsIHRvIEphc29uIFRpc2hsZXIgKGpsdDYzIGF0IHVzZXJzLnNvdXJjZWZvcmdlLm5ldCkuCgotIFB5dGhvbiBub3cgYWx3YXlzIHVzZXMgaXRzIG93biAocmVuYW1lZCkgaW1wbGVtZW50YXRpb24gb2YgZ2V0b3B0KCkKICAtLSB0aGVyZSdzIHRvbyBtdWNoIHZhcmlhdGlvbiBhbW9uZyBDIGxpYnJhcnkgZ2V0b3B0KCkKICBpbXBsZW1lbnRhdGlvbnMuCgotIEMrKyBjb21waWxlcnMgYXJlIGJldHRlciBzdXBwb3J0ZWQ7IHRoZSBDWFggbWFjcm8gaXMgYWx3YXlzIHNldCB0byBhCiAgQysrIGNvbXBpbGVyIGlmIG9uZSBpcyBmb3VuZC4KCldpbmRvd3MgY2hhbmdlcwoKLSBzZWxlY3QgbW9kdWxlOiAgQnkgZGVmYXVsdCB1bmRlciBXaW5kb3dzLCBhIHNlbGVjdCgpIGNhbGwKICBjYW4gc3BlY2lmeSBubyBtb3JlIHRoYW4gNjQgc29ja2V0cy4gIFB5dGhvbiBub3cgYm9vc3RzCiAgdGhpcyBNaWNyb3NvZnQgZGVmYXVsdCB0byA1MTIuICBJZiB5b3UgbmVlZCBldmVuIG1vcmUgdGhhbgogIHRoYXQsIHNlZSB0aGUgTVMgZG9jcyAoeW91J2xsIG5lZWQgdG8gI2RlZmluZSBGRF9TRVRTSVpFCiAgYW5kIHJlY29tcGlsZSBQeXRob24gZnJvbSBzb3VyY2UpLgoKLSBTdXBwb3J0IGZvciBXaW5kb3dzIDMuMSwgRE9TIGFuZCBPUy8yIGlzIGdvbmUuICBUaGUgTGliL2Rvcy04eDMKICBzdWJkaXJlY3RvcnkgaXMgbm8gbW9yZSEKCgpXaGF0J3MgTmV3IGluIFB5dGhvbiAyLjA/Cj09PT09PT09PT09PT09PT09PT09PT09PT0KCkJlbG93IGlzIGEgbGlzdCBvZiBhbGwgcmVsZXZhbnQgY2hhbmdlcyBzaW5jZSByZWxlYXNlIDEuNi4gIE9sZGVyCmNoYW5nZXMgYXJlIGluIHRoZSBmaWxlIEhJU1RPUlkuICBJZiB5b3UgYXJlIG1ha2luZyB0aGUganVtcCBkaXJlY3RseQpmcm9tIFB5dGhvbiAxLjUuMiB0byAyLjAsIG1ha2Ugc3VyZSB0byByZWFkIHRoZSBzZWN0aW9uIGZvciAxLjYgaW4gdGhlCkhJU1RPUlkgZmlsZSEgIE1hbnkgaW1wb3J0YW50IGNoYW5nZXMgbGlzdGVkIHRoZXJlLgoKQWx0ZXJuYXRpdmVseSwgYSBnb29kIG92ZXJ2aWV3IG9mIHRoZSBjaGFuZ2VzIGJldHdlZW4gMS41LjIgYW5kIDIuMCBpcwp0aGUgZG9jdW1lbnQgIldoYXQncyBOZXcgaW4gUHl0aG9uIDIuMCIgYnkgS3VjaGxpbmcgYW5kIE1vc2hlIFphZGthOgpodHRwOi8vc3RhcnNoaXAucHl0aG9uLm5ldC9jcmV3L2Ftay9weXRob24vd3JpdGluZy9uZXctcHl0aG9uLy4KCi0tR3VpZG8gdmFuIFJvc3N1bSAoaG9tZSBwYWdlOiBodHRwOi8vd3d3LnB5dGhvbmxhYnMuY29tL35ndWlkby8pCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpXaGF0J3MgbmV3IGluIDIuMCAoc2luY2UgcmVsZWFzZSBjYW5kaWRhdGUgMSk/Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KClN0YW5kYXJkIGxpYnJhcnkKCi0gVGhlIGNvcHlfcmVnIG1vZHVsZSB3YXMgbW9kaWZpZWQgdG8gY2xhcmlmeSBpdHMgaW50ZW5kZWQgdXNlOiB0bwogIHJlZ2lzdGVyIHBpY2tsZSBzdXBwb3J0IGZvciBleHRlbnNpb24gdHlwZXMsIG5vdCBmb3IgY2xhc3Nlcy4KICBwaWNrbGUoKSB3aWxsIHJhaXNlIGEgVHlwZUVycm9yIGlmIGl0IGlzIHBhc3NlZCBhIGNsYXNzLgoKLSBGaXhlZCBhIGJ1ZyBpbiBnZXR0ZXh0J3MgIm5vcm1hbGl6ZSBhbmQgZXhwYW5kIiBjb2RlIHRoYXQgcHJldmVudGVkCiAgaXQgZnJvbSBmaW5kaW5nIGFuIGV4aXN0aW5nIC5tbyBmaWxlLgoKLSBSZXN0b3JlZCBzdXBwb3J0IGZvciBIVFRQLzAuOSBzZXJ2ZXJzIGluIGh0dHBsaWIuCgotIFRoZSBtYXRoIG1vZHVsZSB3YXMgY2hhbmdlZCB0byBzdG9wIHJhaXNpbmcgT3ZlcmZsb3dFcnJvciBpbiBjYXNlIG9mCiAgdW5kZXJmbG93LCBhbmQgcmV0dXJuIDAgaW5zdGVhZCBpbiB1bmRlcmZsb3cgY2FzZXMuICBXaGV0aGVyIFB5dGhvbgogIHVzZWQgdG8gcmFpc2UgT3ZlcmZsb3dFcnJvciBpbiBjYXNlIG9mIHVuZGVyZmxvdyB3YXMgcGxhdGZvcm0tCiAgZGVwZW5kZW50IChpdCBkaWQgd2hlbiB0aGUgcGxhdGZvcm0gbWF0aCBsaWJyYXJ5IHNldCBlcnJubyB0byBFUkFOR0UKICBvbiB1bmRlcmZsb3cpLgoKLSBGaXhlZCBhIGJ1ZyBpbiBTdHJpbmdJTyB0aGF0IG9jY3VycmVkIHdoZW4gdGhlIGZpbGUgcG9zaXRpb24gd2FzIG5vdAogIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIHdyaXRlKCkgd2FzIGNhbGxlZCB3aXRoIGVub3VnaCBkYXRhIHRvCiAgZXh0ZW5kIHBhc3QgdGhlIGVuZCBvZiB0aGUgZmlsZS4KCi0gRml4ZWQgYSBidWcgdGhhdCBjYXVzZWQgVGtpbnRlciBlcnJvciBtZXNzYWdlcyB0byBnZXQgbG9zdCBvbgogIFdpbmRvd3MuICBUaGUgYnVnIHdhcyBmaXhlZCBieSByZXBsYWNpbmcgZGlyZWN0IHVzZSBvZgogIGludGVycC0+cmVzdWx0IHdpdGggVGNsX0dldFN0cmluZ1Jlc3VsdChpbnRlcnApLgoKLSBGaXhlZCBidWcgaW4gdXJsbGliMiB0aGF0IGNhdXNlZCBpdCB0byBmYWlsIHdoZW4gaXQgcmVjZWl2ZWQgYW4gSFRUUAogIHJlZGlyZWN0IHJlc3BvbnNlLgoKLSBTZXZlcmFsIGNoYW5nZXMgd2VyZSBtYWRlIHRvIGRpc3R1dGlsczogU29tZSBkZWJ1Z2dpbmcgY29kZSB3YXMKICByZW1vdmVkIGZyb20gdXRpbC4gIEZpeGVkIHRoZSBpbnN0YWxsZXIgdXNlZCB3aGVuIGFuIGV4dGVybmFsIHppcAogIHByb2dyYW0gKGxpa2UgV2luWmlwKSBpcyBub3QgZm91bmQ7IHRoZSBzb3VyY2UgY29kZSBmb3IgdGhpcwogIGluc3RhbGxlciBpcyBpbiBNaXNjL2Rpc3R1dGlscy4gIGNoZWNrX2xpYigpIHdhcyBtb2RpZmllZCB0byBiZWhhdmUKICBtb3JlIGxpa2UgQUNfQ0hFQ0tfTElCIGJ5IGFkZCBvdGhlcl9saWJyYXJpZXMoKSBhcyBhIHBhcmFtZXRlci4gIFRoZQogIHRlc3QgZm9yIHdoZXRoZXIgaW5zdGFsbGVkIG1vZHVsZXMgYXJlIG9uIHN5cy5wYXRoIHdhcyBjaGFuZ2VkIHRvCiAgdXNlIGJvdGggbm9ybWNhc2UoKSBhbmQgbm9ybXBhdGgoKS4KCi0gU2V2ZXJhbCBtaW5vciBidWdzIHdlcmUgZml4ZWQgaW4gdGhlIHhtbCBwYWNrYWdlICh0aGUgbWluaWRvbSwKICBwdWxsZG9tLCBleHBhdHJlYWRlciwgYW5kIHNheHV0aWxzIG1vZHVsZXMpLgoKLSBUaGUgcmVncmVzc2lvbiB0ZXN0IGRyaXZlciAocmVncnRlc3QucHkpIGJlaGF2aW9yIHdoZW4gaW52b2tlZCB3aXRoCiAgLWwgY2hhbmdlZDogSXQgbm93IHJlcG9ydHMgYSBjb3VudCBvZiBvYmplY3RzIHRoYXQgYXJlIHJlY29nbml6ZWQgYXMKICBnYXJiYWdlIGJ1dCBub3QgZnJlZWQgYnkgdGhlIGdhcmJhZ2UgY29sbGVjdG9yLgoKLSBUaGUgcmVncmVzc2lvbiB0ZXN0IGZvciB0aGUgbWF0aCBtb2R1bGUgd2FzIGNoYW5nZWQgdG8gdGVzdAogIGV4Y2VwdGlvbmFsIGJlaGF2aW9yIHdoZW4gdGhlIHRlc3QgaXMgcnVuIGluIHZlcmJvc2UgbW9kZS4gIFB5dGhvbgogIGNhbm5vdCB5ZXQgZ3VhcmFudGVlIGNvbnNpc3RlbnQgZXhjZXB0aW9uIGJlaGF2aW9yIGFjcm9zcyBwbGF0Zm9ybXMsCiAgc28gdGhlIGV4Y2VwdGlvbiBwYXJ0IG9mIHRlc3RfbWF0aCBpcyBydW4gb25seSBpbiB2ZXJib3NlIG1vZGUsIGFuZAogIG1heSBmYWlsIG9uIHlvdXIgcGxhdGZvcm0uCgpJbnRlcm5hbHMKCi0gUHlPU19DaGVja1N0YWNrKCkgaGFzIGJlZW4gZGlzYWJsZWQgb24gV2luNjQsIHdoZXJlIGl0IGNhdXNlZAogIHRlc3Rfc3JlIHRvIGZhaWwuCgpCdWlsZCBpc3N1ZXMKCi0gQ2hhbmdlZCBjb21waWxlciBmbGFncywgc28gdGhhdCBnY2MgaXMgYWx3YXlzIGludm9rZWQgd2l0aCAtV2FsbCBhbmQKICAtV3N0cmljdC1wcm90b3R5cGVzLiAgVXNlcnMgY29tcGlsaW5nIFB5dGhvbiB3aXRoIEdDQyBzaG91bGQgc2VlCiAgZXhhY3RseSBvbmUgd2FybmluZywgZXhjZXB0IGlmIHRoZXkgaGF2ZSBwYXNzZWQgY29uZmlndXJlIHRoZQogIC0td2l0aC1weWRlYnVnIGZsYWcuICBUaGUgZXhwZWN0ZWQgd2FybmluZyBpcyBmb3IgZ2V0b3B0KCkgaW4KICBNb2R1bGVzL21haW4uYy4gIFRoaXMgd2FybmluZyB3aWxsIGJlIGZpeGVkIGZvciBQeXRob24gMi4xLgoKLSBGaXhlZCBjb25maWd1cmUgdG8gYWRkIC10aHJlYWRzIGFyZ3VtZW50IGR1cmluZyBsaW5raW5nIG9uIE9TRjEuCgpUb29scyBhbmQgb3RoZXIgbWlzY2VsbGFueQoKLSBUaGUgY29tcGlsZXIgaW4gVG9vbHMvY29tcGlsZXIgd2FzIHVwZGF0ZWQgdG8gc3VwcG9ydCB0aGUgbmV3CiAgbGFuZ3VhZ2UgZmVhdHVyZXMgaW50cm9kdWNlZCBpbiAyLjA6IGV4dGVuZGVkIHByaW50IHN0YXRlbWVudCwgbGlzdAogIGNvbXByZWhlbnNpb25zLCBhbmQgYXVnbWVudGVkIGFzc2lnbm1lbnRzLiAgVGhlIG5ldyBjb21waWxlciBzaG91bGQKICBhbHNvIGJlIGJhY2t3YXJkcyBjb21wYXRpYmxlIHdpdGggUHl0aG9uIDEuNS4yOyB0aGUgY29tcGlsZXIgd2lsbAogIGFsd2F5cyBnZW5lcmF0ZSBjb2RlIGZvciB0aGUgdmVyc2lvbiBvZiB0aGUgaW50ZXJwcmV0ZXIgaXQgcnVucwogIHVuZGVyLgoKV2hhdCdzIG5ldyBpbiAyLjAgcmVsZWFzZSBjYW5kaWRhdGUgMSAoc2luY2UgYmV0YSAyKT8KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCldoYXQgaXMgcmVsZWFzZSBjYW5kaWRhdGUgMT8KCldlIGJlbGlldmUgdGhhdCByZWxlYXNlIGNhbmRpZGF0ZSAxIHdpbGwgZml4IGFsbCBrbm93biBidWdzIHRoYXQgd2UKaW50ZW5kIHRvIGZpeCBmb3IgdGhlIDIuMCBmaW5hbCByZWxlYXNlLiAgVGhpcyByZWxlYXNlIHNob3VsZCBiZSBhIGJpdAptb3JlIHN0YWJsZSB0aGFuIHRoZSBwcmV2aW91cyBiZXRhcy4gIFdlIHdvdWxkIGxpa2UgdG8gc2VlIGV2ZW4gbW9yZQp3aWRlc3ByZWFkIHRlc3RpbmcgYmVmb3JlIHRoZSBmaW5hbCByZWxlYXNlLCBzbyB3ZSBhcmUgcHJvZHVjaW5nIHRoaXMKcmVsZWFzZSBjYW5kaWRhdGUuICBUaGUgZmluYWwgcmVsZWFzZSB3aWxsIGJlIGV4YWN0bHkgdGhlIHNhbWUgdW5sZXNzCmFueSBzaG93LXN0b3BwaW5nIChvciBicm93biBiYWcpIGJ1Z3MgYXJlIGZvdW5kIGJ5IHRlc3RlcnMgb2YgdGhlCnJlbGVhc2UgY2FuZGlkYXRlLgoKQWxsIHRoZSBjaGFuZ2VzIHNpbmNlIHRoZSBsYXN0IGJldGEgcmVsZWFzZSBhcmUgYnVnIGZpeGVzIG9yIGNoYW5nZXMKdG8gc3VwcG9ydCBidWlsZGluZyBQeXRob24gZm9yIHNwZWNpZmljIHBsYXRmb3Jtcy4KCkNvcmUgbGFuZ3VhZ2UsIGJ1aWx0aW5zLCBhbmQgaW50ZXJwcmV0ZXIKCi0gQSBidWcgdGhhdCBjYXVzZWQgY3Jhc2hlcyB3aGVuIF9fY29lcmNlX18gd2FzIHVzZWQgd2l0aCBhdWdtZW50ZWQKICBhc3NpZ25tZW50LCBlLmcuICs9LCB3YXMgZml4ZWQuCgotIFJhaXNlIFplcm9EaXZpc2lvbkVycm9yIHdoZW4gcmFpc2luZyB6ZXJvIHRvIGEgbmVnYXRpdmUgbnVtYmVyLAogIGUuZy4gMC4wICoqIC0yLjAuICBOb3RlIHRoYXQgbWF0aC5wb3cgaXMgdW5yZWxhdGVkIHRvIHRoZSBidWlsdGluCiAgcG93ZXIgb3BlcmF0b3IgYW5kIHRoZSByZXN1bHQgb2YgbWF0aC5wb3coMC4wLCAtMi4wKSB3aWxsIHZhcnkgYnkKICBwbGF0Zm9ybS4gIE9uIExpbnV4LCBpdCByYWlzZXMgYSBWYWx1ZUVycm9yLgoKLSBBIGJ1ZyBpbiBVbmljb2RlIHN0cmluZyBpbnRlcnBvbGF0aW9uIHdhcyBmaXhlZCB0aGF0IG9jY2FzaW9uYWxseQogIGNhdXNlZCBlcnJvcnMgd2l0aCBmb3JtYXRzIGluY2x1ZGluZyAiJSUiLiAgRm9yIGV4YW1wbGUsIHRoZQogIGZvbGxvd2luZyBleHByZXNzaW9uICIlJSAlcyIgJSB1ImFiYyIgbm8gbG9uZ2VyIHJhaXNlcyBhIFR5cGVFcnJvci4KCi0gQ29tcGlsYXRpb24gb2YgZGVlcGx5IG5lc3RlZCBleHByZXNzaW9ucyByYWlzZXMgTWVtb3J5RXJyb3IgaW5zdGVhZAogIG9mIFN5bnRheEVycm9yLCBlLmcuIGV2YWwoIlsiICogNTAgKyAiXSIgKiA1MCkuCgotIEluIDIuMGIyIG9uIFdpbmRvd3MsIHRoZSBpbnRlcnByZXRlciB3cm90ZSAucHljIGZpbGVzIGluIHRleHQgbW9kZSwKICByZW5kZXJpbmcgdGhlbSB1c2VsZXNzLiAgVGhleSBhcmUgbm93IHdyaXR0ZW4gaW4gYmluYXJ5IG1vZGUgYWdhaW4uCgpTdGFuZGFyZCBsaWJyYXJ5CgotIEtleXdvcmQgYXJndW1lbnRzIGFyZSBub3cgYWNjZXB0ZWQgZm9yIG1vc3QgcGF0dGVybiBhbmQgbWF0Y2ggb2JqZWN0CiAgbWV0aG9kcyBpbiBTUkUsIHRoZSBzdGFuZGFyZCByZWd1bGFyIGV4cHJlc3Npb24gZW5naW5lLgoKLSBJbiBTUkUsIGZpeGVkIGVycm9yIHdpdGggbmVnYXRpdmUgbG9va2FoZWFkIGFuZCBsb29rYmVoaW5kIHRoYXQKICBtYW5pZmVzdGVkIGl0c2VsZiBhcyBhIHJ1bnRpbWUgZXJyb3IgaW4gcGF0dGVybnMgbGlrZSAiKD88IWFiYykoZGVmKSIuCgotIFNldmVyYWwgYnVncyBpbiB0aGUgVW5pY29kZSBoYW5kbGluZyBhbmQgZXJyb3IgaGFuZGxpbmcgaW4gX3RraW50ZXIKICB3ZXJlIGZpeGVkLgoKLSBGaXggbWVtb3J5IG1hbmFnZW1lbnQgZXJyb3JzIGluIE1lcmdlKCkgYW5kIFRrYXBwX0NhbGwoKSByb3V0aW5lcy4KCi0gU2V2ZXJhbCBjaGFuZ2VzIHdlcmUgbWFkZSB0byBjU3RyaW5nSU8gdG8gbWFrZSBpdCBjb21wYXRpYmxlIHdpdGgKICB0aGUgZmlsZS1saWtlIG9iamVjdCBpbnRlcmZhY2UgYW5kIHdpdGggU3RyaW5nSU8uICBJZiBvcGVyYXRpb25zIGFyZQogIHBlcmZvcm1lZCBvbiBhIGNsb3NlZCBvYmplY3QsIGFuIGV4Y2VwdGlvbiBpcyByYWlzZWQuICBUaGUgdHJ1bmNhdGUKICBtZXRob2Qgbm93IGFjY2VwdHMgYSBwb3NpdGlvbiBhcmd1bWVudCBhbmQgcmVhZGxpbmUgYWNjZXB0cyBhIHNpemUKICBhcmd1bWVudC4KCi0gVGhlcmUgd2VyZSBtYW55IGNoYW5nZXMgbWFkZSB0byB0aGUgbGludXhhdWRpb2RldiBtb2R1bGUgYW5kIGl0cwogIHRlc3Qgc3VpdGU7IGFzIGEgcmVzdWx0LCBhIHNob3J0LCB1bmV4cGVjdGVkIGF1ZGlvIHNhbXBsZSBzaG91bGQgbm93CiAgcGxheSB3aGVuIHRoZSByZWdyZXNzaW9uIHRlc3QgaXMgcnVuLgoKICBOb3RlIHRoYXQgdGhpcyBtb2R1bGUgaXMgbmFtZWQgcG9vcmx5LCBiZWNhdXNlIGl0IHNob3VsZCB3b3JrCiAgY29ycmVjdGx5IG9uIGFueSBwbGF0Zm9ybSB0aGF0IHN1cHBvcnRzIHRoZSBPcGVuIFNvdW5kIFN5c3RlbQogIChPU1MpLgoKICBUaGUgbW9kdWxlIG5vdyByYWlzZXMgZXhjZXB0aW9ucyB3aGVuIGVycm9ycyBvY2N1ciBpbnN0ZWFkIG9mCiAgY3Jhc2hpbmcuICBJdCBhbHNvIGRlZmluZXMgdGhlIEFGTVRfQV9MQVcgZm9ybWF0IChsb2dhcml0aG1pYyBBLWxhdwogIGF1ZGlvKSBhbmQgZGVmaW5lcyBhIGdldHB0cigpIG1ldGhvZCB0aGF0IGNhbGxzIHRoZQogIFNORENUTF9EU1BfR0VUeFBUUiBpb2N0bCBkZWZpbmVkIGluIHRoZSBPU1MgUHJvZ3JhbW1lcidzIEd1aWRlLgoKLSBUaGUgbGlicmFyeV92ZXJzaW9uIGF0dHJpYnV0ZSwgaW50cm9kdWNlZCBpbiBhbiBlYXJsaWVyIGJldGEsIHdhcwogIHJlbW92ZWQgYmVjYXVzZSBpdCBjYW4gbm90IGJlIHN1cHBvcnRlZCB3aXRoIGVhcmx5IHZlcnNpb25zIG9mIHRoZSBDCiAgcmVhZGxpbmUgbGlicmFyeSwgd2hpY2ggcHJvdmlkZXMgbm8gd2F5IHRvIGRldGVybWluZSB0aGUgdmVyc2lvbiBhdAogIGNvbXBpbGUtdGltZS4KCi0gVGhlIGJpbmFzY2lpIG1vZHVsZSBpcyBub3cgZW5hYmxlZCBvbiBXaW42NC4KCi0gdG9rZW5pemUucHkgbm8gbG9uZ2VyIHN1ZmZlcnMgInJlY3Vyc2lvbiBkZXB0aCIgZXJyb3JzIHdoZW4gcGFyc2luZwogIHByb2dyYW1zIHdpdGggdmVyeSBsb25nIHN0cmluZyBsaXRlcmFscy4KCkludGVybmFscwoKLSBGaXhlZCBzZXZlcmFsIGJ1ZmZlciBvdmVyZmxvdyB2dWxuZXJhYmlsaXRpZXMgaW4gY2FsY3VsYXRlX3BhdGgoKSwKICB3aGljaCBpcyBjYWxsZWQgd2hlbiB0aGUgaW50ZXJwcmV0ZXIgc3RhcnRzIHVwIHRvIGRldGVybWluZSB3aGVyZQogIHRoZSBzdGFuZGFyZCBsaWJyYXJ5IGlzIGluc3RhbGxlZC4gIFRoZXNlIHZ1bG5lcmFiaWxpdGllcyBhZmZlY3QgYWxsCiAgcHJldmlvdXMgdmVyc2lvbnMgb2YgUHl0aG9uIGFuZCBjYW4gYmUgZXhwbG9pdGVkIGJ5IHNldHRpbmcgdmVyeQogIGxvbmcgdmFsdWVzIGZvciBQWVRIT05IT01FIG9yIGFyZ3ZbMF0uICBUaGUgcmlzayBpcyBncmVhdGVzdCBmb3IgYQogIHNldHVpZCBQeXRob24gc2NyaXB0LCBhbHRob3VnaCB1c2Ugb2YgdGhlIHdyYXBwZXIgaW4KICBNaXNjL3NldHVpZC1wcm9nLmMgd2lsbCBlbGltaW5hdGUgdGhlIHZ1bG5lcmFiaWxpdHkuCgotIEZpeGVkIGdhcmJhZ2UgY29sbGVjdGlvbiBidWdzIGluIGluc3RhbmNlIGNyZWF0aW9uIHRoYXQgd2VyZQogIHRyaWdnZXJlZCB3aGVuIGVycm9ycyBvY2N1cnJlZCBkdXJpbmcgaW5pdGlhbGl6YXRpb24uICBUaGUgc29sdXRpb24sCiAgYXBwbGllZCBpbiBjUGlja2xlIGFuZCBpbiBQeUluc3RhbmNlX05ldygpLCBpcyB0byBjYWxsCiAgUHlPYmplY3RfR0NfSW5pdCgpIGFmdGVyIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgb2JqZWN0J3MKICBjb250YWluZXIgYXR0cmlidXRlcyBpcyBjb21wbGV0ZS4KCi0gcHlleHBhdCBhZGRzIGRlZmluaXRpb25zIG9mIFB5TW9kdWxlX0FkZFN0cmluZ0NvbnN0YW50IGFuZAogIFB5TW9kdWxlX0FkZE9iamVjdCBpZiB0aGUgUHl0aG9uIHZlcnNpb24gaXMgbGVzcyB0aGFuIDIuMCwgd2hpY2gKICBwcm92aWRlcyBjb21wYXRpYmlsaXR5IHdpdGggUHlYTUwgb24gUHl0aG9uIDEuNS4yLgoKLSBJZiB0aGUgcGxhdGZvcm0gaGFzIGEgYm9ndXMgZGVmaW5pdGlvbiBmb3IgTE9OR19CSVQgKHRoZSBudW1iZXIgb2YKICBiaXRzIGluIGEgbG9uZyksIGFuIGVycm9yIHdpbGwgYmUgcmVwb3J0ZWQgYXQgY29tcGlsZSB0aW1lLgoKLSBGaXggYnVncyBpbiBfUHlUdXBsZV9SZXNpemUoKSB3aGljaCBjYXVzZWQgaGFyZC10by1pbnRlcnByZXQgZ2FyYmFnZQogIGNvbGxlY3Rpb24gY3Jhc2hlcyBhbmQgcG9zc2libHkgb3RoZXIsIHVucmVwb3J0ZWQgY3Jhc2hlcy4KCi0gRml4ZWQgYSBtZW1vcnkgbGVhayBpbiBfUHlVbmljb2RlX0ZpbmkoKS4KCkJ1aWxkIGlzc3VlcwoKLSBjb25maWd1cmUgbm93IGFjY2VwdHMgYSAtLXdpdGgtc3VmZml4IG9wdGlvbiB0aGF0IHNwZWNpZmllcyB0aGUKICBleGVjdXRhYmxlIHN1ZmZpeC4gIFRoaXMgaXMgdXNlZnVsIGZvciBidWlsZHMgb24gQ3lnd2luIGFuZCBNYWMgT1MKICBYLCBmb3IgZXhhbXBsZS4KCi0gVGhlIG1tYXAuUEFHRVNJWkUgY29uc3RhbnQgaXMgbm93IGluaXRpYWxpemVkIHVzaW5nIHN5c2NvbmYgd2hlbgogIHBvc3NpYmxlLCB3aGljaCBlbGltaW5hdGVzIGEgZGVwZW5kZW5jeSBvbiAtbHVjYiBmb3IgUmVsaWFudCBVTklYLgoKLSBUaGUgbWQ1IGZpbGUgc2hvdWxkIG5vdyBjb21waWxlIG9uIGFsbCBwbGF0Zm9ybXMuCgotIFRoZSBzZWxlY3QgbW9kdWxlIG5vdyBjb21waWxlcyBvbiBwbGF0Zm9ybXMgdGhhdCBkbyBub3QgZGVmaW5lCiAgUE9MTFJETk9STSBhbmQgcmVsYXRlZCBjb25zdGFudHMuCgotIERhcndpbiAoTWFjIE9TIFgpOiAgSW5pdGlhbCBzdXBwb3J0IGZvciBzdGF0aWMgYnVpbGRzIG9uIHRoaXMKICBwbGF0Zm9ybS4KCi0gQmVPUzogQSBudW1iZXIgb2YgY2hhbmdlcyB3ZXJlIG1hZGUgdG8gdGhlIGJ1aWxkIGFuZCBpbnN0YWxsYXRpb24KICBwcm9jZXNzLiAgYXItZmFrZSBub3cgb3BlcmF0ZXMgb24gYSBkaXJlY3Rvcnkgb2Ygb2JqZWN0IGZpbGVzLgogIGRsX2V4cG9ydC5oIGlzIGdvbmUsIGFuZCBpdHMgbWFjcm9zIG5vdyBhcHBlYXIgb24gdGhlIG13Y2MgY29tbWFuZAogIGxpbmUgZHVyaW5nIGJ1aWxkIG9uIFBQQyBCZU9TLgoKLSBQbGF0Zm9ybSBkaXJlY3RvcnkgaW4gbGliL3B5dGhvbjIuMCBpcyAicGxhdC1iZW9zNSIgKG9yCiAgInBsYXQtYmVvczQiLCBpZiBidWlsZGluZyBvbiBCZU9TIDQuNSksIHJhdGhlciB0aGFuICJwbGF0LWJlb3MiLgoKLSBDeWd3aW46IFN1cHBvcnQgZm9yIHNoYXJlZCBsaWJyYXJpZXMsIFRraW50ZXIsIGFuZCBzb2NrZXRzLgoKLSBTdW5PUyA0LjEuNF9KTDogRml4IHRlc3QgZm9yIGRpcmVjdG9yeSBleGlzdGVuY2UgaW4gY29uZmlndXJlLgoKVG9vbHMgYW5kIG90aGVyIG1pc2NlbGxhbnkKCi0gUmVtb3ZlZCBkZWJ1Z2dpbmcgcHJpbnRzIGZyb20gbWFpbiB1c2VkIHdpdGggZnJlZXplLgoKLSBJRExFIGF1dG8taW5kZW50IG5vIGxvbmdlciBjcmFzaGVzIHdoZW4gaXQgZW5jb3VudGVycyBVbmljb2RlCiAgY2hhcmFjdGVycy4KCldoYXQncyBuZXcgaW4gMi4wIGJldGEgMiAoc2luY2UgYmV0YSAxKT8KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKQ29yZSBsYW5ndWFnZSwgYnVpbHRpbnMsIGFuZCBpbnRlcnByZXRlcgoKLSBBZGQgc3VwcG9ydCBmb3IgdW5ib3VuZGVkIGludHMgaW4gJWQsaSx1LHgsWCxvIGZvcm1hdHM7IGZvciBleGFtcGxlCiAgIiVkIiAlIDJMKio2NCA9PSAiMTg0NDY3NDQwNzM3MDk1NTE2MTYiLgoKLSBBZGQgLWggYW5kIC1WIGNvbW1hbmQgbGluZSBvcHRpb25zIHRvIHByaW50IHRoZSB1c2FnZSBtZXNzYWdlIGFuZAogIFB5dGhvbiB2ZXJzaW9uIG51bWJlciBhbmQgZXhpdCBpbW1lZGlhdGVseS4KCi0gZXZhbCgpIGFuZCBleGVjIGFjY2VwdCBVbmljb2RlIG9iamVjdHMgYXMgY29kZSBwYXJhbWV0ZXJzLgoKLSBnZXRhdHRyKCkgYW5kIHNldGF0dHIoKSBub3cgYWxzbyBhY2NlcHQgVW5pY29kZSBvYmplY3RzIGZvciB0aGUKICBhdHRyaWJ1dGUgbmFtZSwgd2hpY2ggYXJlIGNvbnZlcnRlZCB0byBzdHJpbmdzIHVzaW5nIHRoZSBkZWZhdWx0CiAgZW5jb2RpbmcgYmVmb3JlIGxvb2t1cC4KCi0gTXVsdGlwbGljYXRpb24gb24gc3RyaW5nIGFuZCBVbmljb2RlIG5vdyBkb2VzIHByb3BlciBib3VuZHMKICBjaGVja2luZzsgZS5nLiAnYScgKiA2NTUzNiAqIDY1NTM2IHdpbGwgcmFpc2UgVmFsdWVFcnJvciwgInJlcGVhdGVkCiAgc3RyaW5nIGlzIHRvbyBsb25nLiIKCi0gQmV0dGVyIGVycm9yIG1lc3NhZ2Ugd2hlbiBjb250aW51ZSBpcyBmb3VuZCBpbiB0cnkgc3RhdGVtZW50IGluIGEKICBsb29wLgoKClN0YW5kYXJkIGxpYnJhcnkgYW5kIGV4dGVuc2lvbnMKCi0gc29ja2V0IG1vZHVsZTogdGhlIE9wZW5TU0wgY29kZSBub3cgYWRkcyBzdXBwb3J0IGZvciBSQU5EX3N0YXR1cygpCiAgYW5kIEVHRCAoRW50cm9weSBHYXRoZXJpbmcgRGV2aWNlKS4KCi0gYXJyYXk6IHJldmVyc2UoKSBtZXRob2Qgb2YgYXJyYXkgbm93IHdvcmtzLiAgYnVmZmVyX2luZm8oKSBub3cgZG9lcwogIGFyZ3VtZW50IGNoZWNraW5nOyBpdCBzdGlsbCB0YWtlcyBubyBhcmd1bWVudHMuCgotIGFzeW5jb3JlL2FzeW5jaGF0OiBJbmNsdWRlZCBtb3N0IHJlY2VudCB2ZXJzaW9uIGZyb20gU2FtIFJ1c2hpbmcuCgotIGNnaTogQWNjZXB0ICcmJyBvciAnOycgYXMgc2VwYXJhdG9yIGNoYXJhY3RlcnMgd2hlbiBwYXJzaW5nIGZvcm0gZGF0YS4KCi0gQ0dJSFRUUFNlcnZlcjogTm93IHdvcmtzIG9uIFdpbmRvd3MgKGFuZCBwZXJoYXBzIGV2ZW4gTWFjKS4KCi0gQ29uZmlnUGFyc2VyOiBXaGVuIHJlYWRpbmcgdGhlIGZpbGUsIG9wdGlvbnMgc3BlbGxlZCBpbiB1cHBlciBjYXNlCiAgbGV0dGVycyBhcmUgbm93IGNvcnJlY3RseSBjb252ZXJ0ZWQgdG8gbG93ZXJjYXNlLgoKLSBjb3B5OiBDb3B5IFVuaWNvZGUgb2JqZWN0cyBhdG9taWNhbGx5LgoKLSBjUGlja2xlOiBGYWlsIGdyYWNlZnVsbHkgd2hlbiBjb3B5X3JlZyBjYW4ndCBiZSBpbXBvcnRlZC4KCi0gY1N0cmluZ0lPOiBJbXBsZW1lbnRlZCByZWFkbGluZXMoKSBtZXRob2QuCgotIGRibTogQWRkIGdldCgpIGFuZCBzZXRkZWZhdWx0KCkgbWV0aG9kcyB0byBkYm0gb2JqZWN0LiAgQWRkIGNvbnN0YW50CiAgYGxpYnJhcnknIHRvIG1vZHVsZSB0aGF0IG5hbWVzIHRoZSBsaWJyYXJ5IHVzZWQuICBBZGRlZCBkb2Mgc3RyaW5ncwogIGFuZCBtZXRob2QgbmFtZXMgdG8gZXJyb3IgbWVzc2FnZXMuICBVc2VzIGNvbmZpZ3VyZSB0byBkZXRlcm1pbmUKICB3aGljaCBuZGJtLmggZmlsZSB0byBpbmNsdWRlOyBCZXJrZWxleSBEQidzIG5iZG0gYW5kIEdEQk0ncyBuZGJtIGlzCiAgbm93IGF2YWlsYWJsZSBvcHRpb25zLgoKLSBkaXN0dXRpbHM6IFVwZGF0ZSB0byB2ZXJzaW9uIDAuOS4zLgoKLSBkbDogQWRkIHNldmVyYWwgZGwuUlRMRF8gY29uc3RhbnRzLgoKLSBmcGVjdGw6IE5vdyBzdXBwb3J0ZWQgb24gRnJlZUJTRC4KCi0gZ2M6IEFkZCBERUJVR19TQVZFQUxMIG9wdGlvbi4gIFdoZW4gZW5hYmxlZCBhbGwgZ2FyYmFnZSBvYmplY3RzCiAgZm91bmQgYnkgdGhlIGNvbGxlY3RvciB3aWxsIGJlIHNhdmVkIGluIGdjLmdhcmJhZ2UuICBUaGlzIGlzIHVzZWZ1bAogIGZvciBkZWJ1Z2dpbmcgYSBwcm9ncmFtIHRoYXQgY3JlYXRlcyByZWZlcmVuY2UgY3ljbGVzLgoKLSBodHRwbGliOiBUaHJlZSBjaGFuZ2VzOiBSZXN0b3JlIHN1cHBvcnQgZm9yIHNldF9kZWJ1Z2xldmVsIGZlYXR1cmUKICBvZiBIVFRQIGNsYXNzLiAgRG8gbm90IGNsb3NlIHNvY2tldCBvbiB6ZXJvLWxlbmd0aCByZXNwb25zZS4gIERvIG5vdAogIGNyYXNoIHdoZW4gc2VydmVyIHNlbmRzIGludmFsaWQgY29udGVudC1sZW5ndGggaGVhZGVyLgoKLSBtYWlsYm94OiBNYWlsYm94IGNsYXNzIGNvbmZvcm1zIGJldHRlciB0byBxbWFpbCBzcGVjaWZpY2F0aW9ucy4KCi0gbWFyc2hhbDogV2hlbiByZWFkaW5nIGEgc2hvcnQsIHNpZ24tZXh0ZW5kIG9uIHBsYXRmb3JtcyB3aGVyZSBzaG9ydHMKICBhcmUgYmlnZ2VyIHRoYW4gMTYgYml0cy4gIFdoZW4gcmVhZGluZyBhIGxvbmcsIHJlcGFpciB0aGUgdW5wb3J0YWJsZQogIHNpZ24gZXh0ZW5zaW9uIHRoYXQgd2FzIGJlaW5nIGRvbmUgZm9yIDY0LWJpdCBtYWNoaW5lcy4gIChJdCBhc3N1bWVkCiAgdGhhdCBzaWduZWQgcmlnaHQgc2hpZnQgc2lnbi1leHRlbmRzLikKCi0gb3BlcmF0b3I6IEFkZCBjb250YWlucygpLCBpbnZlcnQoKSwgX19pbnZlcnRfXygpIGFzIGFsaWFzZXMgZm9yCiAgX19jb250YWluc19fKCksIGludigpLCBhbmQgX19pbnZfXygpIHJlc3BlY3RpdmVseS4KCi0gb3M6IEFkZCBzdXBwb3J0IGZvciBwb3BlbjIoKSBhbmQgcG9wZW4zKCkgb24gYWxsIHBsYXRmb3JtcyB3aGVyZQogIGZvcmsoKSBleGlzdHMuICAocG9wZW40KCkgaXMgc3RpbGwgaW4gdGhlIHdvcmtzLikKCi0gb3M6IChXaW5kb3dzIG9ubHk6KSBBZGQgc3RhcnRmaWxlKCkgZnVuY3Rpb24gdGhhdCBhY3RzIGxpa2UgZG91YmxlLQogIGNsaWNraW5nIG9uIGEgZmlsZSBpbiBFeHBsb3JlciAob3IgcGFzc2luZyB0aGUgZmlsZSBuYW1lIHRvIHRoZQogIERPUyAic3RhcnQiIGNvbW1hbmQpLgoKLSBvcy5wYXRoOiAoV2luZG93cywgRE9TOikgVHJlYXQgdHJhaWxpbmcgY29sb24gY29ycmVjdGx5IGluCiAgb3MucGF0aC5qb2luLiAgb3MucGF0aC5qb2luKCJhOiIsICJiIikgeWllbGRzICJhOmIiLgoKLSBwaWNrbGU6IE5vdyByYWlzZXMgVmFsdWVFcnJvciB3aGVuIGFuIGludmFsaWQgcGlja2xlIHRoYXQgY29udGFpbnMKICBhIG5vbi1zdHJpbmcgcmVwciB3aGVyZSBhIHN0cmluZyByZXByIHdhcyBleHBlY3RlZC4gIFRoaXMgYmVoYXZpb3IKICBtYXRjaGVzIGNQaWNrbGUuCgotIHBvc2l4ZmlsZTogUmVtb3ZlIGJyb2tlbiBfX2RlbF9fKCkgbWV0aG9kLgoKLSBweV9jb21waWxlOiBzdXBwb3J0IENSK0xGIGxpbmUgdGVybWluYXRvcnMgaW4gc291cmNlIGZpbGUuCgotIHJlYWRsaW5lOiBEb2VzIG5vdCBpbW1lZGlhdGVseSBleGl0IHdoZW4gXkMgaXMgaGl0IHdoZW4gcmVhZGxpbmUgYW5kCiAgdGhyZWFkcyBhcmUgY29uZmlndXJlZC4gIEFkZHMgZGVmaW5pdGlvbiBvZiBybF9saWJyYXJ5X3ZlcnNpb24uICAoVGhlCiAgbGF0dGVyIGFkZGl0aW9uIHJlcXVpcmVzIEdOVSByZWFkbGluZSAyLjIgb3IgbGF0ZXIuKQoKLSByZmM4MjI6IERvbWFpbiBsaXRlcmFscyByZXR1cm5lZCBieSBBZGRybGlzdENsYXNzIG1ldGhvZAogIGdldGRvbWFpbmxpdGVyYWwoKSBhcmUgbm93IHByb3Blcmx5IHdyYXBwZWQgaW4gYnJhY2tldHMuCgotIHNpdGU6IHN5cy5zZXRkZWZhdWx0ZW5jb2RpbmcoKSBzaG91bGQgb25seSBiZSBjYWxsZWQgaW4gY2FzZSB0aGUKICBzdGFuZGFyZCBkZWZhdWx0IGVuY29kaW5nICgiYXNjaWkiKSBpcyBjaGFuZ2VkLiBUaGlzIHNhdmVzIHF1aXRlIGEKICBmZXcgY3ljbGVzIGR1cmluZyBzdGFydHVwIHNpbmNlIHRoZSBmaXJzdCBjYWxsIHRvCiAgc2V0ZGVmYXVsdGVuY29kaW5nKCkgd2lsbCBpbml0aWFsaXplIHRoZSBjb2RlYyByZWdpc3RyeSBhbmQgdGhlCiAgZW5jb2RpbmdzIHBhY2thZ2UuCgotIHNvY2tldDogU3VwcG9ydCBmb3Igc2l6ZSBoaW50IGluIHJlYWRsaW5lcygpIG1ldGhvZCBvZiBvYmplY3QgcmV0dXJuZWQKICBieSBtYWtlZmlsZSgpLgoKLSBzcmU6IEFkZGVkIGV4cGVyaW1lbnRhbCBleHBhbmQoKSBtZXRob2QgdG8gbWF0Y2ggb2JqZWN0cy4gIERvZXMgbm90CiAgdXNlIGJ1ZmZlciBpbnRlcmZhY2Ugb24gVW5pY29kZSBzdHJpbmdzLiAgRG9lcyBub3QgaGFuZyBpZiBncm91cCBpZAogIGlzIGZvbGxvd2VkIGJ5IHdoaXRlc3BhY2UuCgotIFN0cmluZ0lPOiBTaXplIGhpbnQgaW4gcmVhZGxpbmVzKCkgaXMgbm93IHN1cHBvcnRlZCBhcyBkb2N1bWVudGVkLgoKLSBzdHJ1Y3Q6IENoZWNrIHJhbmdlcyBmb3IgYnl0ZXMgYW5kIHNob3J0cy4KCi0gdXJsbGliOiBJbXByb3ZlZCBoYW5kbGluZyBvZiB3aW4zMiBwcm94eSBzZXR0aW5ncy4gRml4ZWQgcXVvdGUgYW5kCiAgcXVvdGVfcGx1cyBmdW5jdGlvbnMgc28gdGhhdCB0aGUgYWx3YXlzIGVuY29kZSBhIGNvbW1hLgoKLSBUa2ludGVyOiBJbWFnZSBvYmplY3RzIGFyZSBub3cgZ3VhcmFudGVlZCB0byBoYXZlIHVuaXF1ZSBpZHMuICBTZXQKICBldmVudC5kZWx0YSB0byB6ZXJvIGlmIFRrIHZlcnNpb24gZG9lc24ndCBzdXBwb3J0IG1vdXNld2hlZWwuCiAgUmVtb3ZlZCBzb21lIGRlYnVnZ2luZyBwcmludHMuCgotIFVzZXJMaXN0OiBub3cgaW1wbGVtZW50cyBfX2NvbnRhaW5zX18oKS4KCi0gd2ViYnJvd3NlcjogT24gV2luZG93cywgdXNlIG9zLnN0YXJ0ZmlsZSgpIGluc3RlYWQgb2Ygb3MucG9wZW4oKSwKICB3aGljaCB3b3JrcyBhcm91bmQgYSBidWcgaW4gTm9ydG9uIEFudGlWaXJ1cyAyMDAwIHRoYXQgbGVhZHMgZGlyZWN0bHkKICB0byBhIEJsdWUgU2NyZWVuIGZyZWV6ZS4KCi0geG1sOiBOZXcgdmVyc2lvbiBkZXRlY3Rpb24gY29kZSBhbGxvd3MgUHlYTUwgdG8gb3ZlcnJpZGUgc3RhbmRhcmQKICBYTUwgcGFja2FnZSBpZiBQeVhNTCB2ZXJzaW9uIGlzIGdyZWF0ZXIgdGhhbiAwLjYuMS4KCi0geG1sLmRvbTogRE9NIGxldmVsIDEgc3VwcG9ydCBmb3IgYmFzaWMgWE1MLiAgSW5jbHVkZXMgeG1sLmRvbS5taW5pZG9tCiAgKGNvbnZlbnRpb25hbCBET00pLCBhbmQgeG1sLmRvbS5wdWxsZG9tLCB3aGljaCBhbGxvd3MgYnVpbGRpbmcgdGhlIERPTQogIHRyZWUgb25seSBmb3Igbm9kZXMgd2hpY2ggYXJlIHN1ZmZpY2llbnRseSBpbnRlcmVzdGluZyB0byBhIHNwZWNpZmljCiAgYXBwbGljYXRpb24uICBEb2VzIG5vdCBwcm92aWRlIHRoZSBIVE1MLXNwZWNpZmljIGV4dGVuc2lvbnMuICBTdGlsbAogIHVuZG9jdW1lbnRlZC4KCi0geG1sLnNheDogU0FYIDIgc3VwcG9ydCBmb3IgUHl0aG9uLCBpbmNsdWRpbmcgYWxsIHRoZSBoYW5kbGVyCiAgaW50ZXJmYWNlcyBuZWVkZWQgdG8gcHJvY2VzcyBYTUwgMS4wIGNvbXBsaWFudCBYTUwuICBTb21lCiAgZG9jdW1lbnRhdGlvbiBpcyBhbHJlYWR5IGF2YWlsYWJsZS4KCi0gcHlleHBhdDogUmVuYW1lZCB0byB4bWwucGFyc2Vycy5leHBhdCBzaW5jZSB0aGlzIGlzIHBhcnQgb2YgdGhlIG5ldywKICBwYWNrYWdpemVkIFhNTCBzdXBwb3J0LgoKCkMgQVBJCgotIEFkZCB0aHJlZSBuZXcgY29udmVuaWVuY2UgZnVuY3Rpb25zIGZvciBtb2R1bGUgaW5pdGlhbGl6YXRpb24gLS0KICBQeU1vZHVsZV9BZGRPYmplY3QoKSwgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQoKSwgYW5kCiAgUHlNb2R1bGVfQWRkU3RyaW5nQ29uc3RhbnQoKS4KCi0gQ2xlYW5lZCB1cCBkZWZpbml0aW9uIG9mIE5VTEwgaW4gQyBzb3VyY2UgY29kZTsgYWxsIGRlZmluaXRpb25zIHdlcmUKICByZW1vdmVkIGFuZCBhZGQgI2Vycm9yIHRvIFB5dGhvbi5oIGlmIE5VTEwgaXNuJ3QgZGVmaW5lZCBhZnRlcgogICNpbmNsdWRlIG9mIHN0ZGlvLmguCgotIFB5X1BST1RPKCkgbWFjcm9zIHRoYXQgd2VyZSByZW1vdmVkIGluIDIuMGIxIGhhdmUgYmVlbiByZXN0b3JlZCBmb3IKICBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSAoYXQgdGhlIHNvdXJjZSBsZXZlbCkgd2l0aCBvbGQgZXh0ZW5zaW9ucy4KCi0gQSB3cmFwcGVyIEFQSSB3YXMgYWRkZWQgZm9yIHNpZ25hbCgpIGFuZCBzaWdhY3Rpb24oKS4gIEluc3RlYWQgb2YKICBlaXRoZXIgZnVuY3Rpb24sIGFsd2F5cyB1c2UgUHlPU19nZXRzaWcoKSB0byBnZXQgYSBzaWduYWwgaGFuZGxlcgogIGFuZCBQeU9TX3NldHNpZygpIHRvIHNldCBvbmUuICBBIG5ldyBjb252ZW5pZW5jZSB0eXBlZGVmCiAgUHlPU19zaWdoYW5kbGVyX3QgaXMgZGVmaW5lZCBmb3IgdGhlIHR5cGUgb2Ygc2lnbmFsIGhhbmRsZXJzLgoKLSBBZGQgUHlTdHJpbmdfQXNTdHJpbmdBbmRTaXplKCkgZnVuY3Rpb24gdGhhdCBwcm92aWRlcyBhY2Nlc3MgdG8gdGhlCiAgaW50ZXJuYWwgZGF0YSBidWZmZXIgYW5kIHNpemUgb2YgYSBzdHJpbmcgb2JqZWN0IC0tIG9yIHRoZSBkZWZhdWx0CiAgZW5jb2RlZCB2ZXJzaW9uIG9mIGEgVW5pY29kZSBvYmplY3QuCgotIFB5U3RyaW5nX1NpemUoKSBhbmQgUHlTdHJpbmdfQXNTdHJpbmcoKSBhY2NlcHQgVW5pY29kZSBvYmplY3RzLgoKLSBUaGUgc3RhbmRhcmQgaGVhZGVyIDxsaW1pdHMuaD4gaXMgbm93IGluY2x1ZGVkIGJ5IFB5dGhvbi5oIChpZiBpdAogIGV4aXN0cykuICBJTlRfTUFYIGFuZCBMT05HX01BWCB3aWxsIGFsd2F5cyBiZSBkZWZpbmVkLCBldmVuIGlmCiAgPGxpbWl0cy5oPiBpcyBub3QgYXZhaWxhYmxlLgoKLSBQeUZsb2F0X0Zyb21TdHJpbmcgdGFrZXMgYSBzZWNvbmQgYXJndW1lbnQsIHBlbmQsIHRoYXQgd2FzCiAgZWZmZWN0aXZlbHkgdXNlbGVzcy4gIEl0IGlzIG5vdyBvZmZpY2lhbGx5IHVzZWxlc3MgYnV0IHByZXNlcnZlZCBmb3IKICBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4gIElmIHRoZSBwZW5kIGFyZ3VtZW50IGlzIG5vdCBOVUxMLCAqcGVuZCBpcwogIHNldCB0byBOVUxMLgoKLSBQeU9iamVjdF9HZXRBdHRyKCkgYW5kIFB5T2JqZWN0X1NldEF0dHIoKSBub3cgYWNjZXB0IFVuaWNvZGUgb2JqZWN0cwogIGZvciB0aGUgYXR0cmlidXRlIG5hbWUuICBTZWUgbm90ZSBvbiBnZXRhdHRyKCkgYWJvdmUuCgotIEEgZmV3IGJ1ZyBmaXhlcyB0byBhcmd1bWVudCBwcm9jZXNzaW5nIGZvciBVbmljb2RlLgogIFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcygpIG5vdyBhY2NlcHRzICJlcyMiIGFuZCAiZXMiLgogIFB5QXJnX1BhcnNlKCkgc3BlY2lhbCBjYXNlcyAicyMiIGZvciBVbmljb2RlIG9iamVjdHM7IGl0IHJldHVybnMgYQogIHBvaW50ZXIgdG8gdGhlIGRlZmF1bHQgZW5jb2RlZCBzdHJpbmcgZGF0YSBpbnN0ZWFkIG9mIHRvIHRoZSByYXcKICBVVEYtMTYuCgotIFB5X0J1aWxkVmFsdWUgYWNjZXB0cyBCIGZvcm1hdCAoZm9yIGJnZW4tZ2VuZXJhdGVkIGNvZGUpLgoKCkludGVybmFscwoKLSBPbiBVbml4LCBmaXggY29kZSBmb3IgZmluZGluZyBQeXRob24gaW5zdGFsbGF0aW9uIGRpcmVjdG9yeSBzbyB0aGF0CiAgaXQgd29ya3Mgd2hlbiBhcmd2WzBdIGlzIGEgcmVsYXRpdmUgcGF0aC4KCi0gQWRkZWQgYSB0cnVlIHVuaWNvZGVfaW50ZXJuYWxfZW5jb2RlKCkgZnVuY3Rpb24gYW5kIGZpeGVkIHRoZQogIHVuaWNvZGVfaW50ZXJuYWxfZGVjb2RlIGZ1bmN0aW9uKCkgdG8gc3VwcG9ydCBVbmljb2RlIG9iamVjdHMgZGlyZWN0bHkKICByYXRoZXIgdGhhbiBieSBnZW5lcmF0aW5nIGEgY29weSBvZiB0aGUgb2JqZWN0LgoKLSBTZXZlcmFsIG9mIHRoZSBpbnRlcm5hbCBVbmljb2RlIHRhYmxlcyBhcmUgbXVjaCBzbWFsbGVyIG5vdywgYW5kCiAgdGhlIHNvdXJjZSBjb2RlIHNob3VsZCBiZSBtdWNoIGZyaWVuZGxpZXIgdG8gd2Vha2VyIGNvbXBpbGVycy4KCi0gSW4gdGhlIGdhcmJhZ2UgY29sbGVjdG9yOiBGaXhlZCBidWcgaW4gY29sbGVjdGlvbiBvZiB0dXBsZXMuICBGaXhlZAogIGJ1ZyB0aGF0IGNhdXNlZCBzb21lIGluc3RhbmNlcyB0byBiZSByZW1vdmVkIGZyb20gdGhlIGNvbnRhaW5lciBzZXQKICB3aGlsZSB0aGV5IHdlcmUgc3RpbGwgbGl2ZS4gIEZpeGVkIHBhcnNpbmcgaW4gZ2Muc2V0X2RlYnVnKCkgZm9yCiAgcGxhdGZvcm1zIHdoZXJlIHNpemVvZihsb25nKSA+IHNpemVvZihpbnQpLgoKLSBGaXhlZCByZWZjb3VudCBwcm9ibGVtIGluIGluc3RhbmNlIGRlYWxsb2NhdGlvbiB0aGF0IG9ubHkgb2NjdXJyZWQKICB3aGVuIFB5X1JFRl9ERUJVRyB3YXMgZGVmaW5lZCBhbmQgUHlfVFJBQ0VfUkVGUyB3YXMgbm90LgoKLSBPbiBXaW5kb3dzLCBnZXRweXRob25yZWdwYXRoIGlzIG5vdyBwcm90ZWN0ZWQgYWdhaW5zdCBudWxsIGRhdGEgaW4KICByZWdpc3RyeSBrZXkuCgotIE9uIFVuaXgsIGNyZWF0ZSAucHljLy5weW8gZmlsZXMgd2l0aCBPX0VYQ0wgZmxhZyB0byBhdm9pZCBhIHJhY2UKICBjb25kaXRpb24uCgoKQnVpbGQgYW5kIHBsYXRmb3JtLXNwZWNpZmljIGlzc3VlcwoKLSBCZXR0ZXIgc3VwcG9ydCBvZiBHTlUgUHRoIHZpYSAtLXdpdGgtcHRoIGNvbmZpZ3VyZSBvcHRpb24uCgotIFB5dGhvbi9DIEFQSSBub3cgcHJvcGVybHkgZXhwb3NlZCB0byBkeW5hbWljYWxseS1sb2FkZWQgZXh0ZW5zaW9uCiAgbW9kdWxlcyBvbiBSZWxpYW50IFVOSVguCgotIENoYW5nZXMgZm9yIHRoZSBiZW5lZml0IG9mIFN1bk9TIDQuMS40IChyZWFsbHkhKS4gIG1tYXBtb2R1bGUuYzoKICBEb24ndCBkZWZpbmUgTVNfU1lOQyB0byBiZSB6ZXJvIHdoZW4gaXQgaXMgdW5kZWZpbmVkLiAgQWRkZWQgbWlzc2luZwogIHByb3RvdHlwZXMgaW4gcG9zaXhtb2R1bGUuYy4KCi0gSW1wcm92ZWQgc3VwcG9ydCBmb3IgSFAtVVggYnVpbGQuICBUaHJlYWRzIHNob3VsZCBub3cgYmUgY29ycmVjdGx5CiAgY29uZmlndXJlZCAob24gSFAtVVggMTAuMjAgYW5kIDExLjAwKS4KCi0gRml4IGxhcmdlZmlsZSBzdXBwb3J0IG9uIG9sZGVyIE5ldEJTRCBzeXN0ZW1zIGFuZCBPcGVuQlNEIGJ5IGFkZGluZwogIGRlZmluZSBmb3IgVEVMTDY0LgoKClRvb2xzIGFuZCBvdGhlciBtaXNjZWxsYW55CgotIGZ0cG1pcnJvcjogQ2FsbCB0byBtYWluKCkgaXMgd3JhcHBlZCBpbiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iLgoKLSBmcmVlemU6IFRoZSBtb2R1bGVmaW5kZXIgbm93IHdvcmtzIHdpdGggMi4wIG9wY29kZXMuCgotIElETEU6CiAgTW92ZSBoYWNrZXJ5IG9mIHN5cy5hcmd2IHVudGlsIGFmdGVyIHRoZSBUayBpbnN0YW5jZSBoYXMgYmVlbgogIGNyZWF0ZWQsIHdoaWNoIGFsbG93cyB0aGUgYXBwbGljYXRpb24tc3BlY2lmaWMgVGtpbnRlcgogIGluaXRpYWxpemF0aW9uIHRvIGJlIGV4ZWN1dGVkIGlmIHByZXNlbnQ7IGFsc28gcGFzcyBhbiBleHBsaWNpdAogIGNsYXNzTmFtZSBwYXJhbWV0ZXIgdG8gdGhlIFRrKCkgY29uc3RydWN0b3IuCgoKV2hhdCdzIG5ldyBpbiAyLjAgYmV0YSAxPwo9PT09PT09PT09PT09PT09PT09PT09PT09CgpTb3VyY2UgSW5jb21wYXRpYmlsaXRpZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpOb25lLiAgTm90ZSB0aGF0IDEuNiBpbnRyb2R1Y2VkIHNldmVyYWwgaW5jb21wYXRpYmlsaXRpZXMgd2l0aCAxLjUuMiwKc3VjaCBhcyBzaW5nbGUtYXJndW1lbnQgYXBwZW5kKCksIGNvbm5lY3QoKSBhbmQgYmluZCgpLCBhbmQgY2hhbmdlcyB0bwpzdHIobG9uZykgYW5kIHJlcHIoZmxvYXQpLgoKCkJpbmFyeSBJbmNvbXBhdGliaWxpdGllcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCi0gVGhpcmQgcGFydHkgZXh0ZW5zaW9ucyBidWlsdCBmb3IgUHl0aG9uIDEuNS54IG9yIDEuNiBjYW5ub3QgYmUgdXNlZAp3aXRoIFB5dGhvbiAyLjA7IHRoZXNlIGV4dGVuc2lvbnMgd2lsbCBoYXZlIHRvIGJlIHJlYnVpbHQgZm9yIFB5dGhvbgoyLjAuCgotIE9uIFdpbmRvd3MsIGF0dGVtcHRpbmcgdG8gaW1wb3J0IGEgdGhpcmQgcGFydHkgZXh0ZW5zaW9uIGJ1aWx0IGZvcgpQeXRob24gMS41Lnggb3IgMS42IHJlc3VsdHMgaW4gYW4gaW1tZWRpYXRlIGNyYXNoOyB0aGVyZSdzIG5vdCBtdWNoIHdlCmNhbiBkbyBhYm91dCB0aGlzLiAgQ2hlY2sgeW91ciBQWVRIT05QQVRIIGVudmlyb25tZW50IHZhcmlhYmxlIQoKLSBQeXRob24gYnl0ZWNvZGUgZmlsZXMgKCoucHljIGFuZCAqLnB5bykgYXJlIG5vdCBjb21wYXRpYmxlIGJldHdlZW4KcmVsZWFzZXMuCgoKT3ZlcnZpZXcgb2YgQ2hhbmdlcyBTaW5jZSAxLjYKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KClRoZXJlIGFyZSBtYW55IG5ldyBtb2R1bGVzIChpbmNsdWRpbmcgYnJhbmQgbmV3IFhNTCBzdXBwb3J0IHRocm91Z2gKdGhlIHhtbCBwYWNrYWdlLCBhbmQgaTE4biBzdXBwb3J0IHRocm91Z2ggdGhlIGdldHRleHQgbW9kdWxlKTsgYSBsaXN0Cm9mIGFsbCBuZXcgbW9kdWxlcyBpcyBpbmNsdWRlZCBiZWxvdy4gIExvdHMgb2YgYnVncyBoYXZlIGJlZW4gZml4ZWQuCgpUaGUgcHJvY2VzcyBmb3IgbWFraW5nIG1ham9yIG5ldyBjaGFuZ2VzIHRvIHRoZSBsYW5ndWFnZSBoYXMgY2hhbmdlZApzaW5jZSBQeXRob24gMS42LiAgRW5oYW5jZW1lbnRzIG11c3Qgbm93IGJlIGRvY3VtZW50ZWQgYnkgYSBQeXRob24KRW5oYW5jZW1lbnQgUHJvcG9zYWwgKFBFUCkgYmVmb3JlIHRoZXkgY2FuIGJlIGFjY2VwdGVkLgoKVGhlcmUgYXJlIHNldmVyYWwgaW1wb3J0YW50IHN5bnRheCBlbmhhbmNlbWVudHMsIGRlc2NyaWJlZCBpbiBtb3JlCmRldGFpbCBiZWxvdzoKCiAgLSBBdWdtZW50ZWQgYXNzaWdubWVudCwgZS5nLiB4ICs9IDEKCiAgLSBMaXN0IGNvbXByZWhlbnNpb25zLCBlLmcuIFt4KioyIGZvciB4IGluIHJhbmdlKDEwKV0KCiAgLSBFeHRlbmRlZCBpbXBvcnQgc3RhdGVtZW50LCBlLmcuIGltcG9ydCBNb2R1bGUgYXMgTmFtZQoKICAtIEV4dGVuZGVkIHByaW50IHN0YXRlbWVudCwgZS5nLiBwcmludCA+PiBmaWxlLCAiSGVsbG8iCgpPdGhlciBpbXBvcnRhbnQgY2hhbmdlczoKCiAgLSBPcHRpb25hbCBjb2xsZWN0aW9uIG9mIGN5Y2xpY2FsIGdhcmJhZ2UKClB5dGhvbiBFbmhhbmNlbWVudCBQcm9wb3NhbCAoUEVQKQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KClBFUCBzdGFuZHMgZm9yIFB5dGhvbiBFbmhhbmNlbWVudCBQcm9wb3NhbC4gIEEgUEVQIGlzIGEgZGVzaWduCmRvY3VtZW50IHByb3ZpZGluZyBpbmZvcm1hdGlvbiB0byB0aGUgUHl0aG9uIGNvbW11bml0eSwgb3IgZGVzY3JpYmluZwphIG5ldyBmZWF0dXJlIGZvciBQeXRob24uICBUaGUgUEVQIHNob3VsZCBwcm92aWRlIGEgY29uY2lzZSB0ZWNobmljYWwKc3BlY2lmaWNhdGlvbiBvZiB0aGUgZmVhdHVyZSBhbmQgYSByYXRpb25hbGUgZm9yIHRoZSBmZWF0dXJlLgoKV2UgaW50ZW5kIFBFUHMgdG8gYmUgdGhlIHByaW1hcnkgbWVjaGFuaXNtcyBmb3IgcHJvcG9zaW5nIG5ldwpmZWF0dXJlcywgZm9yIGNvbGxlY3RpbmcgY29tbXVuaXR5IGlucHV0IG9uIGFuIGlzc3VlLCBhbmQgZm9yCmRvY3VtZW50aW5nIHRoZSBkZXNpZ24gZGVjaXNpb25zIHRoYXQgaGF2ZSBnb25lIGludG8gUHl0aG9uLiAgVGhlIFBFUAphdXRob3IgaXMgcmVzcG9uc2libGUgZm9yIGJ1aWxkaW5nIGNvbnNlbnN1cyB3aXRoaW4gdGhlIGNvbW11bml0eSBhbmQKZG9jdW1lbnRpbmcgZGlzc2VudGluZyBvcGluaW9ucy4KClRoZSBQRVBzIGFyZSBhdmFpbGFibGUgYXQgaHR0cDovL3B5dGhvbi5zb3VyY2Vmb3JnZS5uZXQvcGVwcy8uCgpBdWdtZW50ZWQgQXNzaWdubWVudAotLS0tLS0tLS0tLS0tLS0tLS0tLQoKVGhpcyBtdXN0IGhhdmUgYmVlbiB0aGUgbW9zdC1yZXF1ZXN0ZWQgZmVhdHVyZSBvZiB0aGUgcGFzdCB5ZWFycyEKRWxldmVuIG5ldyBhc3NpZ25tZW50IG9wZXJhdG9ycyB3ZXJlIGFkZGVkOgoKICAgICs9IC09ICo9IC89ICU9ICoqPSA8PD0gPj49ICY9IF49IHw9CgpGb3IgZXhhbXBsZSwKCiAgICBBICs9IEIKCmlzIHNpbWlsYXIgdG8KCiAgICBBID0gQSArIEIKCmV4Y2VwdCB0aGF0IEEgaXMgZXZhbHVhdGVkIG9ubHkgb25jZSAocmVsZXZhbnQgd2hlbiBBIGlzIHNvbWV0aGluZwpsaWtlIGRpY3RbaW5kZXhdLmF0dHIpLgoKSG93ZXZlciwgaWYgQSBpcyBhIG11dGFibGUgb2JqZWN0LCBBIG1heSBiZSBtb2RpZmllZCBpbiBwbGFjZS4gIFRodXMsCmlmIEEgaXMgYSBudW1iZXIgb3IgYSBzdHJpbmcsIEEgKz0gQiBoYXMgdGhlIHNhbWUgZWZmZWN0IGFzIEEgPSBBK0IKKGV4Y2VwdCBBIGlzIG9ubHkgZXZhbHVhdGVkIG9uY2UpOyBidXQgaWYgYSBpcyBhIGxpc3QsIEEgKz0gQiBoYXMgdGhlCnNhbWUgZWZmZWN0IGFzIEEuZXh0ZW5kKEIpIQoKQ2xhc3NlcyBhbmQgYnVpbHQtaW4gb2JqZWN0IHR5cGVzIGNhbiBvdmVycmlkZSB0aGUgbmV3IG9wZXJhdG9ycyBpbgpvcmRlciB0byBpbXBsZW1lbnQgdGhlIGluLXBsYWNlIGJlaGF2aW9yOyB0aGUgbm90LWluLXBsYWNlIGJlaGF2aW9yIGlzCnVzZWQgYXV0b21hdGljYWxseSBhcyBhIGZhbGxiYWNrIHdoZW4gYW4gb2JqZWN0IGRvZXNuJ3QgaW1wbGVtZW50IHRoZQppbi1wbGFjZSBiZWhhdmlvci4gIEZvciBjbGFzc2VzLCB0aGUgbWV0aG9kIG5hbWUgaXMgZGVyaXZlZCBmcm9tIHRoZQptZXRob2QgbmFtZSBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgbm90LWluLXBsYWNlIG9wZXJhdG9yIGJ5IGluc2VydGluZwphbiAnaScgaW4gZnJvbnQgb2YgdGhlIG5hbWUsIGUuZy4gX19pYWRkX18gaW1wbGVtZW50cyBpbi1wbGFjZQpfX2FkZF9fLgoKQXVnbWVudGVkIGFzc2lnbm1lbnQgd2FzIGltcGxlbWVudGVkIGJ5IFRob21hcyBXb3V0ZXJzLgoKCkxpc3QgQ29tcHJlaGVuc2lvbnMKLS0tLS0tLS0tLS0tLS0tLS0tLQoKVGhpcyBpcyBhIGZsZXhpYmxlIG5ldyBub3RhdGlvbiBmb3IgbGlzdHMgd2hvc2UgZWxlbWVudHMgYXJlIGNvbXB1dGVkCmZyb20gYW5vdGhlciBsaXN0IChvciBsaXN0cykuICBUaGUgc2ltcGxlc3QgZm9ybSBpczoKCiAgICBbPGV4cHJlc3Npb24+IGZvciA8dmFyaWFibGU+IGluIDxzZXF1ZW5jZT5dCgpGb3IgZXhhbXBsZSwgW2kqKjIgZm9yIGkgaW4gcmFuZ2UoNCldIHlpZWxkcyB0aGUgbGlzdCBbMCwgMSwgNCwgOV0uClRoaXMgaXMgbW9yZSBlZmZpY2llbnQgdGhhbiBhIGZvciBsb29wIHdpdGggYSBsaXN0LmFwcGVuZCgpIGNhbGwuCgpZb3UgY2FuIGFsc28gYWRkIGEgY29uZGl0aW9uOgoKICAgIFs8ZXhwcmVzc2lvbj4gZm9yIDx2YXJpYWJsZT4gaW4gPHNlcXVlbmNlPiBpZiA8Y29uZGl0aW9uPl0KCkZvciBleGFtcGxlLCBbdyBmb3IgdyBpbiB3b3JkcyBpZiB3ID09IHcubG93ZXIoKV0gd291bGQgeWllbGQgdGhlIGxpc3QKb2Ygd29yZHMgdGhhdCBjb250YWluIG5vIHVwcGVyY2FzZSBjaGFyYWN0ZXJzLiAgVGhpcyBpcyBtb3JlIGVmZmljaWVudAp0aGFuIGEgZm9yIGxvb3Agd2l0aCBhbiBpZiBzdGF0ZW1lbnQgYW5kIGEgbGlzdC5hcHBlbmQoKSBjYWxsLgoKWW91IGNhbiBhbHNvIGhhdmUgbmVzdGVkIGZvciBsb29wcyBhbmQgbW9yZSB0aGFuIG9uZSAnaWYnIGNsYXVzZS4gIEZvcgpleGFtcGxlLCBoZXJlJ3MgYSBmdW5jdGlvbiB0aGF0IGZsYXR0ZW5zIGEgc2VxdWVuY2Ugb2Ygc2VxdWVuY2VzOjoKCiAgICBkZWYgZmxhdHRlbihzZXEpOgogICAgICAgIHJldHVybiBbeCBmb3Igc3Vic2VxIGluIHNlcSBmb3IgeCBpbiBzdWJzZXFdCgogICAgZmxhdHRlbihbWzBdLCBbMSwyLDNdLCBbNCw1XSwgWzYsNyw4LDldLCBbXV0pCgpUaGlzIHByaW50cwoKICAgIFswLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5XQoKTGlzdCBjb21wcmVoZW5zaW9ucyBvcmlnaW5hdGVkIGFzIGEgcGF0Y2ggc2V0IGZyb20gR3JlZyBFd2luZzsgU2tpcApNb250YW5hcm8gYW5kIFRob21hcyBXb3V0ZXJzIGFsc28gY29udHJpYnV0ZWQuICBEZXNjcmliZWQgYnkgUEVQIDIwMi4KCgpFeHRlbmRlZCBJbXBvcnQgU3RhdGVtZW50Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCk1hbnkgcGVvcGxlIGhhdmUgYXNrZWQgZm9yIGEgd2F5IHRvIGltcG9ydCBhIG1vZHVsZSB1bmRlciBhIGRpZmZlcmVudApuYW1lLiAgVGhpcyBjYW4gYmUgYWNjb21wbGlzaGVkIGxpa2UgdGhpczoKCiAgICBpbXBvcnQgZm9vCiAgICBiYXIgPSBmb28KICAgIGRlbCBmb28KCmJ1dCB0aGlzIGNvbW1vbiBpZGlvbSBnZXRzIG9sZCBxdWlja2x5LiAgQSBzaW1wbGUgZXh0ZW5zaW9uIG9mIHRoZQppbXBvcnQgc3RhdGVtZW50IG5vdyBhbGxvd3MgdGhpcyB0byBiZSB3cml0dGVuIGFzIGZvbGxvd3M6CgogICAgaW1wb3J0IGZvbyBhcyBiYXIKClRoZXJlJ3MgYWxzbyBhIHZhcmlhbnQgZm9yICdmcm9tIC4uLiBpbXBvcnQnOgoKICAgIGZyb20gZm9vIGltcG9ydCBiYXIgYXMgc3BhbQoKVGhpcyBhbHNvIHdvcmtzIHdpdGggcGFja2FnZXM7IGUuZy4geW91IGNhbiB3cml0ZSB0aGlzOgoKICAgIGltcG9ydCB0ZXN0LnJlZ3J0ZXN0IGFzIHJlZ3J0ZXN0CgpOb3RlIHRoYXQgJ2FzJyBpcyBub3QgYSBuZXcga2V5d29yZCAtLSBpdCBpcyByZWNvZ25pemVkIG9ubHkgaW4gdGhpcwpjb250ZXh0ICh0aGlzIGlzIG9ubHkgcG9zc2libGUgYmVjYXVzZSB0aGUgc3ludGF4IGZvciB0aGUgaW1wb3J0CnN0YXRlbWVudCBkb2Vzbid0IGludm9sdmUgZXhwcmVzc2lvbnMpLgoKSW1wbGVtZW50ZWQgYnkgVGhvbWFzIFdvdXRlcnMuICBEZXNjcmliZWQgYnkgUEVQIDIyMS4KCgpFeHRlbmRlZCBQcmludCBTdGF0ZW1lbnQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpFYXNpbHkgdGhlIG1vc3QgY29udHJvdmVyc2lhbCBuZXcgZmVhdHVyZSwgdGhpcyBleHRlbnNpb24gdG8gdGhlIHByaW50CnN0YXRlbWVudCBhZGRzIGFuIG9wdGlvbiB0byBtYWtlIHRoZSBvdXRwdXQgZ28gdG8gYSBkaWZmZXJlbnQgZmlsZQp0aGFuIHRoZSBkZWZhdWx0IHN5cy5zdGRvdXQuCgpGb3IgZXhhbXBsZSwgdG8gd3JpdGUgYW4gZXJyb3IgbWVzc2FnZSB0byBzeXMuc3RkZXJyLCB5b3UgY2FuIG5vdwp3cml0ZToKCiAgICBwcmludCA+PiBzeXMuc3RkZXJyLCAiRXJyb3I6IGJhZCBkb2chIgoKQXMgYSBzcGVjaWFsIGZlYXR1cmUsIGlmIHRoZSBleHByZXNzaW9uIHVzZWQgdG8gaW5kaWNhdGUgdGhlIGZpbGUKZXZhbHVhdGVzIHRvIE5vbmUsIHRoZSBjdXJyZW50IHZhbHVlIG9mIHN5cy5zdGRvdXQgaXMgdXNlZC4gIFRodXM6CgogICAgcHJpbnQgPj4gTm9uZSwgIkhlbGxvIHdvcmxkIgoKaXMgZXF1aXZhbGVudCB0bwoKICAgIHByaW50ICJIZWxsbyB3b3JsZCIKCkRlc2lnbiBhbmQgaW1wbGVtZW50YXRpb24gYnkgQmFycnkgV2Fyc2F3LiAgRGVzY3JpYmVkIGJ5IFBFUCAyMTQuCgoKT3B0aW9uYWwgQ29sbGVjdGlvbiBvZiBDeWNsaWNhbCBHYXJiYWdlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKUHl0aG9uIGlzIG5vdyBlcXVpcHBlZCB3aXRoIGEgZ2FyYmFnZSBjb2xsZWN0b3IgdGhhdCBjYW4gaHVudCBkb3duCmN5Y2xpY2FsIHJlZmVyZW5jZXMgYmV0d2VlbiBQeXRob24gb2JqZWN0cy4gIEl0J3Mgbm8gcmVwbGFjZW1lbnQgZm9yCnJlZmVyZW5jZSBjb3VudGluZzsgaW4gZmFjdCwgaXQgZGVwZW5kcyBvbiB0aGUgcmVmZXJlbmNlIGNvdW50cyBiZWluZwpjb3JyZWN0LCBhbmQgZGVjaWRlcyB0aGF0IGEgc2V0IG9mIG9iamVjdHMgYmVsb25nIHRvIGEgY3ljbGUgaWYgYWxsCnRoZWlyIHJlZmVyZW5jZSBjb3VudHMgY2FuIGJlIGFjY291bnRlZCBmb3IgZnJvbSB0aGVpciByZWZlcmVuY2VzIHRvCmVhY2ggb3RoZXIuICBUaGlzIGRldmlvdXMgc2NoZW1lIHdhcyBmaXJzdCBwcm9wb3NlZCBieSBFcmljIFRpZWRlbWFubiwKYW5kIGJyb3VnaHQgdG8gaW1wbGVtZW50YXRpb24gYnkgTmVpbCBTY2hlbWVuYXVlci4KClRoZXJlJ3MgYSBtb2R1bGUgImdjIiB0aGF0IGxldHMgeW91IGNvbnRyb2wgc29tZSBwYXJhbWV0ZXJzIG9mIHRoZQpnYXJiYWdlIGNvbGxlY3Rpb24uICBUaGVyZSdzIGFsc28gYW4gb3B0aW9uIHRvIHRoZSBjb25maWd1cmUgc2NyaXB0CnRoYXQgbGV0cyB5b3UgZW5hYmxlIG9yIGRpc2FibGUgdGhlIGdhcmJhZ2UgY29sbGVjdGlvbi4gIEluIDIuMGIxLAppdCdzIG9uIGJ5IGRlZmF1bHQsIHNvIHRoYXQgd2UgKGhvcGVmdWxseSkgY2FuIGNvbGxlY3QgZGVjZW50IHVzZXIKZXhwZXJpZW5jZSB3aXRoIHRoaXMgbmV3IGZlYXR1cmUuICBUaGVyZSBhcmUgc29tZSBxdWVzdGlvbnMgYWJvdXQgaXRzCnBlcmZvcm1hbmNlLiAgSWYgaXQgcHJvdmVzIHRvIGJlIHRvbyBtdWNoIG9mIGEgcHJvYmxlbSwgd2UnbGwgdHVybiBpdApvZmYgYnkgZGVmYXVsdCBpbiB0aGUgZmluYWwgMi4wIHJlbGVhc2UuCgoKU21hbGxlciBDaGFuZ2VzCi0tLS0tLS0tLS0tLS0tLQoKQSBuZXcgZnVuY3Rpb24gemlwKCkgd2FzIGFkZGVkLiAgemlwKHNlcTEsIHNlcTIsIC4uLikgaXMgZXF1aXZhbGVudCB0bwptYXAoTm9uZSwgc2VxMSwgc2VxMiwgLi4uKSB3aGVuIHRoZSBzZXF1ZW5jZXMgaGF2ZSB0aGUgc2FtZSBsZW5ndGg7CmkuZS4gemlwKFsxLDIsM10sIFsxMCwyMCwzMF0pIHJldHVybnMgWygxLDEwKSwgKDIsMjApLCAoMywzMCldLiAgV2hlbgp0aGUgbGlzdHMgYXJlIG5vdCBhbGwgdGhlIHNhbWUgbGVuZ3RoLCB0aGUgc2hvcnRlc3QgbGlzdCB3aW5zOgp6aXAoWzEsMiwzXSwgWzEwLDIwXSkgcmV0dXJucyBbKDEsMTApLCAoMiwyMCldLiAgU2VlIFBFUCAyMDEuCgpzeXMudmVyc2lvbl9pbmZvIGlzIGEgdHVwbGUgKG1ham9yLCBtaW5vciwgbWljcm8sIGxldmVsLCBzZXJpYWwpLgoKRGljdGlvbmFyaWVzIGhhdmUgYW4gb2RkIG5ldyBtZXRob2QsIHNldGRlZmF1bHQoa2V5LCBkZWZhdWx0KS4KZGljdC5zZXRkZWZhdWx0KGtleSwgZGVmYXVsdCkgcmV0dXJucyBkaWN0W2tleV0gaWYgaXQgZXhpc3RzOyBpZiBub3QsCml0IHNldHMgZGljdFtrZXldIHRvIGRlZmF1bHQgYW5kIHJldHVybnMgdGhhdCB2YWx1ZS4gIFRodXM6CgogICAgZGljdC5zZXRkZWZhdWx0KGtleSwgW10pLmFwcGVuZChpdGVtKQoKZG9lcyB0aGUgc2FtZSB3b3JrIGFzIHRoaXMgY29tbW9uIGlkaW9tOgoKICAgIGlmIG5vdCBkaWN0Lmhhc19rZXkoa2V5KToKICAgICAgICBkaWN0W2tleV0gPSBbXQogICAgZGljdFtrZXldLmFwcGVuZChpdGVtKQoKVGhlcmUgYXJlIHR3byBuZXcgdmFyaWFudHMgb2YgU3ludGF4RXJyb3IgdGhhdCBhcmUgcmFpc2VkIGZvcgppbmRlbnRhdGlvbi1yZWxhdGVkIGVycm9yczogSW5kZW50YXRpb25FcnJvciBhbmQgVGFiRXJyb3IuCgpDaGFuZ2VkIFx4IHRvIGNvbnN1bWUgZXhhY3RseSB0d28gaGV4IGRpZ2l0czsgc2VlIFBFUCAyMjMuICBBZGRlZCBcVQplc2NhcGUgdGhhdCBjb25zdW1lcyBleGFjdGx5IGVpZ2h0IGhleCBkaWdpdHMuCgpUaGUgbGltaXRzIG9uIHRoZSBzaXplIG9mIGV4cHJlc3Npb25zIGFuZCBmaWxlIGluIFB5dGhvbiBzb3VyY2UgY29kZQpoYXZlIGJlZW4gcmFpc2VkIGZyb20gMioqMTYgdG8gMioqMzIuICBQcmV2aW91cyB2ZXJzaW9ucyBvZiBQeXRob24Kd2VyZSBsaW1pdGVkIGJlY2F1c2UgdGhlIG1heGltdW0gYXJndW1lbnQgc2l6ZSB0aGUgUHl0aG9uIFZNIGFjY2VwdGVkCndhcyAyKioxNi4gIFRoaXMgbGltaXRlZCB0aGUgc2l6ZSBvZiBvYmplY3QgY29uc3RydWN0b3IgZXhwcmVzc2lvbnMsCmUuZy4gWzEsMiwzXSBvciB7J2EnOjEsICdiJzoyfSwgYW5kIHRoZSBzaXplIG9mIHNvdXJjZSBmaWxlcy4gIFRoaXMKbGltaXQgd2FzIHJhaXNlZCB0aGFua3MgdG8gYSBwYXRjaCBieSBDaGFybGVzIFdhbGRtYW4gdGhhdCBlZmZlY3RpdmVseQpmaXhlcyB0aGUgcHJvYmxlbS4gIEl0IGlzIG5vdyBtdWNoIG1vcmUgbGlrZWx5IHRoYXQgeW91IHdpbGwgYmUKbGltaXRlZCBieSBhdmFpbGFibGUgbWVtb3J5IHRoYW4gYnkgYW4gYXJiaXRyYXJ5IGxpbWl0IGluIFB5dGhvbi4KClRoZSBpbnRlcnByZXRlcidzIG1heGltdW0gcmVjdXJzaW9uIGRlcHRoIGNhbiBiZSBtb2RpZmllZCBieSBQeXRob24KcHJvZ3JhbXMgdXNpbmcgc3lzLmdldHJlY3Vyc2lvbmxpbWl0IGFuZCBzeXMuc2V0cmVjdXJzaW9ubGltaXQuICBUaGlzCmxpbWl0IGlzIHRoZSBtYXhpbXVtIG51bWJlciBvZiByZWN1cnNpdmUgY2FsbHMgdGhhdCBjYW4gYmUgbWFkZSBieQpQeXRob24gY29kZS4gIFRoZSBsaW1pdCBleGlzdHMgdG8gcHJldmVudCBpbmZpbml0ZSByZWN1cnNpb24gZnJvbQpvdmVyZmxvd2luZyB0aGUgQyBzdGFjayBhbmQgY2F1c2luZyBhIGNvcmUgZHVtcC4gIFRoZSBkZWZhdWx0IHZhbHVlIGlzCjEwMDAuICBUaGUgbWF4aW11bSBzYWZlIHZhbHVlIGZvciBhIHBhcnRpY3VsYXIgcGxhdGZvcm0gY2FuIGJlIGZvdW5kCmJ5IHJ1bm5pbmcgTWlzYy9maW5kX3JlY3Vyc2lvbmxpbWl0LnB5LgoKTmV3IE1vZHVsZXMgYW5kIFBhY2thZ2VzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKYXRleGl0IC0gZm9yIHJlZ2lzdGVyaW5nIGZ1bmN0aW9ucyB0byBiZSBjYWxsZWQgd2hlbiBQeXRob24gZXhpdHMuCgppbXB1dGlsIC0gR3JlZyBTdGVpbidzIGFsdGVybmF0aXZlIEFQSSBmb3Igd3JpdGluZyBjdXN0b20gaW1wb3J0Cmhvb2tzLgoKcHlleHBhdCAtIGFuIGludGVyZmFjZSB0byB0aGUgRXhwYXQgWE1MIHBhcnNlciwgY29udHJpYnV0ZWQgYnkgUGF1bApQcmVzY29kLgoKeG1sIC0gYSBuZXcgcGFja2FnZSB3aXRoIFhNTCBzdXBwb3J0IGNvZGUgb3JnYW5pemVkIChzbyBmYXIpIGluIHRocmVlCnN1YnBhY2thZ2VzOiB4bWwuZG9tLCB4bWwuc2F4LCBhbmQgeG1sLnBhcnNlcnMuICBEZXNjcmliaW5nIHRoZXNlCndvdWxkIGZpbGwgYSB2b2x1bWUuICBUaGVyZSdzIGEgc3BlY2lhbCBmZWF0dXJlIHdoZXJlYnkgYQp1c2VyLWluc3RhbGxlZCBwYWNrYWdlIG5hbWVkIF94bWxwbHVzIG92ZXJyaWRlcyB0aGUgc3RhbmRhcmQKeG1scGFja2FnZTsgdGhpcyBpcyBpbnRlbmRlZCB0byBnaXZlIHRoZSBYTUwgU0lHIGEgaG9vayB0byBkaXN0cmlidXRlCmJhY2t3YXJkcy1jb21wYXRpYmxlIHVwZGF0ZXMgdG8gdGhlIHN0YW5kYXJkIHhtbCBwYWNrYWdlLgoKd2ViYnJvd3NlciAtIGEgcGxhdGZvcm0taW5kZXBlbmRlbnQgQVBJIHRvIGxhdW5jaCBhIHdlYiBicm93c2VyLgoKCkNoYW5nZWQgTW9kdWxlcwotLS0tLS0tLS0tLS0tLS0KCmFycmF5IC0tIG5ldyBtZXRob2RzIGZvciBhcnJheSBvYmplY3RzOiBjb3VudCwgZXh0ZW5kLCBpbmRleCwgcG9wLCBhbmQKcmVtb3ZlCgpiaW5hc2NpaSAtLSBuZXcgZnVuY3Rpb25zIGIyYV9oZXggYW5kIGEyYl9oZXggdGhhdCBjb252ZXJ0IGJldHdlZW4KYmluYXJ5IGRhdGEgYW5kIGl0cyBoZXggcmVwcmVzZW50YXRpb24KCmNhbGVuZGFyIC0tIE1hbnkgbmV3IGZ1bmN0aW9ucyB0aGF0IHN1cHBvcnQgZmVhdHVyZXMgaW5jbHVkaW5nIGNvbnRyb2wKb3ZlciB3aGljaCBkYXkgb2YgdGhlIHdlZWsgaXMgdGhlIGZpcnN0IGRheSwgcmV0dXJuaW5nIHN0cmluZ3MgaW5zdGVhZApvZiBwcmludGluZyB0aGVtLiAgQWxzbyBuZXcgc3ltYm9saWMgY29uc3RhbnRzIGZvciBkYXlzIG9mIHdlZWssCmUuZy4gTU9OREFZLCAuLi4sIFNVTkRBWS4KCmNnaSAtLSBGaWVsZFN0b3JhZ2Ugb2JqZWN0cyBoYXZlIGEgZ2V0dmFsdWUgbWV0aG9kIHRoYXQgd29ya3MgbGlrZSBhCmRpY3Rpb25hcnkncyBnZXQgbWV0aG9kIGFuZCByZXR1cm5zIHRoZSB2YWx1ZSBhdHRyaWJ1dGUgb2YgdGhlIG9iamVjdC4KCkNvbmZpZ1BhcnNlciAtLSBUaGUgcGFyc2VyIG9iamVjdCBoYXMgbmV3IG1ldGhvZHMgaGFzX29wdGlvbiwKcmVtb3ZlX3NlY3Rpb24sIHJlbW92ZV9vcHRpb24sIHNldCwgYW5kIHdyaXRlLiAgVGhleSBhbGxvdyB0aGUgbW9kdWxlCnRvIGJlIHVzZWQgZm9yIHdyaXRpbmcgY29uZmlnIGZpbGVzIGFzIHdlbGwgYXMgcmVhZGluZyB0aGVtLgoKZnRwbGliIC0tIG50cmFuc2ZlcmNtZCgpLCB0cmFuc2ZlcmNtZCgpLCBhbmQgcmV0cmJpbmFyeSgpIGFsbCBub3cKb3B0aW9uYWxseSBzdXBwb3J0IHRoZSBSRkMgOTU5IFJFU1QgY29tbWFuZC4KCmd6aXAgLS0gcmVhZGxpbmUgYW5kIHJlYWRsaW5lcyBub3cgYWNjZXB0IG9wdGlvbmFsIHNpemUgYXJndW1lbnRzCgpodHRwbGliIC0tIE5ldyBpbnRlcmZhY2VzIGFuZCBzdXBwb3J0IGZvciBIVFRQLzEuMSBieSBHcmVnIFN0ZWluLiAgU2VlCnRoZSBtb2R1bGUgZG9jIHN0cmluZ3MgZm9yIGRldGFpbHMuCgpsb2NhbGUgLS0gaW1wbGVtZW50IGdldGRlZmF1bHRsb2NhbGUgZm9yIFdpbjMyIGFuZCBNYWNpbnRvc2gKCm1hcnNoYWwgLS0gbm8gbG9uZ2VyIGR1bXBzIGNvcmUgd2hlbiBtYXJzaGFsaW5nIGRlZXBseSBuZXN0ZWQgb3IKcmVjdXJzaXZlIGRhdGEgc3RydWN0dXJlcwoKb3MgLS0gbmV3IGZ1bmN0aW9ucyBpc2F0dHksIHNldGV1aWQsIHNldGVnaWQsIHNldHJldWlkLCBzZXRyZWdpZAoKb3MvcG9wZW4yIC0tIHBvcGVuMi9wb3BlbjMvcG9wZW40IHN1cHBvcnQgdW5kZXIgV2luZG93cy4gIHBvcGVuMi9wb3BlbjMKc3VwcG9ydCB1bmRlciBVbml4LgoKb3MvcHR5IC0tIHN1cHBvcnQgZm9yIG9wZW5wdHkgYW5kIGZvcmtwdHkKCm9zLnBhdGggLS0gZml4IHNlbWFudGljcyBvZiBvcy5wYXRoLmNvbW1vbnByZWZpeAoKc210cGxpYiAtLSBzdXBwb3J0IGZvciBzZW5kaW5nIHZlcnkgbG9uZyBtZXNzYWdlcwoKc29ja2V0IC0tIG5ldyBmdW5jdGlvbiBnZXRmcWRuKCkKCnJlYWRsaW5lIC0tIG5ldyBmdW5jdGlvbnMgdG8gcmVhZCwgd3JpdGUgYW5kIHRydW5jYXRlIGhpc3RvcnkgZmlsZXMuClRoZSByZWFkbGluZSBzZWN0aW9uIG9mIHRoZSBsaWJyYXJ5IHJlZmVyZW5jZSBtYW51YWwgY29udGFpbnMgYW4KZXhhbXBsZS4KCnNlbGVjdCAtLSBhZGQgaW50ZXJmYWNlIHRvIHBvbGwgc3lzdGVtIGNhbGwKCnNodXRpbCAtLSBuZXcgY29weWZpbGVvYmogZnVuY3Rpb24KClNpbXBsZUhUVFBTZXJ2ZXIsIENHSUhUVFBTZXJ2ZXIgLS0gRml4IHByb2JsZW1zIHdpdGggYnVmZmVyaW5nIGluIHRoZQpIVFRQIHNlcnZlci4KClRraW50ZXIgLS0gb3B0aW1pemF0aW9uIG9mIGZ1bmN0aW9uIGZsYXR0ZW4KCnVybGxpYiAtLSBzY2FucyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIHByb3h5IGNvbmZpZ3VyYXRpb24sCmUuZy4gaHR0cF9wcm94eS4KCndoaWNoZGIgLS0gcmVjb2duaXplcyBkdW1iZGJtIGZvcm1hdAoKCk9ic29sZXRlIE1vZHVsZXMKLS0tLS0tLS0tLS0tLS0tLQoKTm9uZS4gIEhvd2V2ZXIgbm90ZSB0aGF0IDEuNiBtYWRlIGEgd2hvbGUgc2xldyBvZiBtb2R1bGVzIG9ic29sZXRlOgpzdGR3aW4sIHNvdW5kZXgsIGNtbCwgY21wY2FjaGUsIGRpcmNhY2hlLCBkdW1wLCBmaW5kLCBncmVwLCBwYWNrbWFpbCwKcG9seSwgem1vZCwgc3Ryb3AsIHV0aWwsIHdoYXRzb3VuZC4KCgpDaGFuZ2VkLCBOZXcsIE9ic29sZXRlIFRvb2xzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCk5vbmUuCgoKQy1sZXZlbCBDaGFuZ2VzCi0tLS0tLS0tLS0tLS0tLQoKU2V2ZXJhbCBjbGVhbnVwIGpvYnMgd2VyZSBjYXJyaWVkIG91dCB0aHJvdWdob3V0IHRoZSBzb3VyY2UgY29kZS4KCkFsbCBDIGNvZGUgd2FzIGNvbnZlcnRlZCB0byBBTlNJIEM7IHdlIGdvdCByaWQgb2YgYWxsIHVzZXMgb2YgdGhlClB5X1BST1RPKCkgbWFjcm8sIHdoaWNoIG1ha2VzIHRoZSBoZWFkZXIgZmlsZXMgYSBsb3QgbW9yZSByZWFkYWJsZS4KCk1vc3Qgb2YgdGhlIHBvcnRhYmlsaXR5IGhhY2tzIHdlcmUgbW92ZWQgdG8gYSBuZXcgaGVhZGVyIGZpbGUsCnB5cG9ydC5oOyBzZXZlcmFsIG90aGVyIG5ldyBoZWFkZXIgZmlsZXMgd2VyZSBhZGRlZCBhbmQgc29tZSBvbGQKaGVhZGVyIGZpbGVzIHdlcmUgcmVtb3ZlZCwgaW4gYW4gYXR0ZW1wdCB0byBjcmVhdGUgYSBtb3JlIHJhdGlvbmFsIHNldApvZiBoZWFkZXIgZmlsZXMuICAoRmV3IG9mIHRoZXNlIGV2ZXIgbmVlZCB0byBiZSBpbmNsdWRlZCBleHBsaWNpdGx5Owp0aGV5IGFyZSBhbGwgaW5jbHVkZWQgYnkgUHl0aG9uLmguKQoKVHJlbnQgTWljayBlbnN1cmVkIHBvcnRhYmlsaXR5IHRvIDY0LWJpdCBwbGF0Zm9ybXMsIHVuZGVyIGJvdGggTGludXgKYW5kIFdpbjY0LCBlc3BlY2lhbGx5IGZvciB0aGUgbmV3IEludGVsIEl0YW5pdW0gcHJvY2Vzc29yLiAgTWljayBhbHNvCmFkZGVkIGxhcmdlIGZpbGUgc3VwcG9ydCBmb3IgTGludXg2NCBhbmQgV2luNjQuCgpUaGUgQyBBUElzIHRvIHJldHVybiBhbiBvYmplY3QncyBzaXplIGhhdmUgYmVlbiB1cGRhdGUgdG8gY29uc2lzdGVudGx5CnVzZSB0aGUgZm9ybSBQeVhYWF9TaXplLCBlLmcuIFB5U2VxdWVuY2VfU2l6ZSBhbmQgUHlEaWN0X1NpemUuICBJbgpwcmV2aW91cyB2ZXJzaW9ucywgdGhlIGFic3RyYWN0IGludGVyZmFjZXMgdXNlZCBQeVhYWF9MZW5ndGggYW5kIHRoZQpjb25jcmV0ZSBpbnRlcmZhY2VzIHVzZWQgUHlYWFhfU2l6ZS4gIFRoZSBvbGQgbmFtZXMsCmUuZy4gUHlPYmplY3RfTGVuZ3RoLCBhcmUgc3RpbGwgYXZhaWxhYmxlIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eQphdCB0aGUgQVBJIGxldmVsLCBidXQgYXJlIGRlcHJlY2F0ZWQuCgpUaGUgUHlPU19DaGVja1N0YWNrIGZ1bmN0aW9uIGhhcyBiZWVuIGltcGxlbWVudGVkIG9uIFdpbmRvd3MgYnkKRnJlZHJpayBMdW5kaC4gIEl0IHByZXZlbnRzIFB5dGhvbiBmcm9tIGZhaWxpbmcgd2l0aCBhIHN0YWNrIG92ZXJmbG93Cm9uIFdpbmRvd3MuCgpUaGUgR0MgY2hhbmdlcyByZXN1bHRlZCBpbiBjcmVhdGlvbiBvZiB0d28gbmV3IHNsb3RzIG9uIG9iamVjdCwKdHBfdHJhdmVyc2UgYW5kIHRwX2NsZWFyLiAgVGhlIGF1Z21lbnRlZCBhc3NpZ25tZW50IGNoYW5nZXMgcmVzdWx0IGluCnRoZSBjcmVhdGlvbiBvZiBhIG5ldyBzbG90IGZvciBlYWNoIGluLXBsYWNlIG9wZXJhdG9yLgoKVGhlIEdDIEFQSSBjcmVhdGVzIG5ldyByZXF1aXJlbWVudHMgZm9yIGNvbnRhaW5lciB0eXBlcyBpbXBsZW1lbnRlZCBpbgpDIGV4dGVuc2lvbiBtb2R1bGVzLiAgU2VlIEluY2x1ZGUvb2JqaW1wbC5oIGZvciBkZXRhaWxzLgoKUHlFcnJfRm9ybWF0IGhhcyBiZWVuIHVwZGF0ZWQgdG8gYXV0b21hdGljYWxseSBjYWxjdWxhdGUgdGhlIHNpemUgb2YKdGhlIGJ1ZmZlciBuZWVkZWQgdG8gaG9sZCB0aGUgZm9ybWF0dGVkIHJlc3VsdCBzdHJpbmcuICBUaGlzIGNoYW5nZQpwcmV2ZW50cyBjcmFzaGVzIGNhdXNlZCBieSBwcm9ncmFtbWVyIGVycm9yLgoKTmV3IEMgQVBJIGNhbGxzOiBQeU9iamVjdF9Bc0ZpbGVEZXNjcmlwdG9yLCBQeUVycl9Xcml0ZVVucmFpc2FibGUuCgpQeVJ1bl9BbnlGaWxlRXgsIFB5UnVuX1NpbXBsZUZpbGVFeCwgUHlSdW5fRmlsZUV4IC0tIE5ldyBmdW5jdGlvbnMKdGhhdCBhcmUgdGhlIHNhbWUgYXMgdGhlaXIgbm9uLUV4IGNvdW50ZXJwYXJ0cyBleGNlcHQgdGhleSB0YWtlIGFuCmV4dHJhIGZsYWcgYXJndW1lbnQgdGhhdCB0ZWxscyB0aGVtIHRvIGNsb3NlIHRoZSBmaWxlIHdoZW4gZG9uZS4KClhYWCBUaGVyZSB3ZXJlIG90aGVyIEFQSSBjaGFuZ2VzIHRoYXQgc2hvdWxkIGJlIGZsZXNoZWQgb3V0IGhlcmUuCgoKV2luZG93cyBDaGFuZ2VzCi0tLS0tLS0tLS0tLS0tLQoKTmV3IHBvcGVuMi9wb3BlbjMvcGVvcGVuNCBpbiBvcyBtb2R1bGUgKHNlZSBDaGFuZ2VkIE1vZHVsZXMgYWJvdmUpLgoKb3MucG9wZW4gaXMgbXVjaCBtb3JlIHVzYWJsZSBvbiBXaW5kb3dzIDk1IGFuZCA5OC4gIFNlZSBNaWNyb3NvZnQKS25vd2xlZGdlIEJhc2UgYXJ0aWNsZSBRMTUwOTU2LiAgVGhlIFdpbjl4IHdvcmthcm91bmQgZGVzY3JpYmVkIHRoZXJlCmlzIGltcGxlbWVudGVkIGJ5IHRoZSBuZXcgdzl4cG9wZW4uZXhlIGhlbHBlciBpbiB0aGUgcm9vdCBvZiB5b3VyClB5dGhvbiBpbnN0YWxsYXRpb24uICBOb3RlIHRoYXQgUHl0aG9uIHVzZXMgdGhpcyBpbnRlcm5hbGx5OyBpdCBpcyBub3QKYSBzdGFuZGFsb25lIHByb2dyYW0uCgpBZG1pbmlzdHJhdG9yIHByaXZpbGVnZXMgYXJlIG5vIGxvbmdlciByZXF1aXJlZCB0byBpbnN0YWxsIFB5dGhvbgpvbiBXaW5kb3dzIE5UIG9yIFdpbmRvd3MgMjAwMC4gIElmIHlvdSBoYXZlIGFkbWluaXN0cmF0b3IgcHJpdmlsZWdlcywKUHl0aG9uJ3MgcmVnaXN0cnkgaW5mbyB3aWxsIGJlIHdyaXR0ZW4gdW5kZXIgSEtFWV9MT0NBTF9NQUNISU5FLgpPdGhlcndpc2UgdGhlIGluc3RhbGxlciBiYWNrcyBvZmYgdG8gd3JpdGluZyBQeXRob24ncyByZWdpc3RyeSBpbmZvCnVuZGVyIEhLRVlfQ1VSUkVOVF9VU0VSLiAgVGhlIGxhdHRlciBpcyBzdWZmaWNpZW50IGZvciBhbGwgIm5vcm1hbCIKdXNlcyBvZiBQeXRob24sIGJ1dCB3aWxsIHByZXZlbnQgc29tZSBhZHZhbmNlZCB1c2VzIGZyb20gd29ya2luZwooZm9yIGV4YW1wbGUsIHJ1bm5pbmcgYSBQeXRob24gc2NyaXB0IGFzIGFuIE5UIHNlcnZpY2UsIG9yIHBvc3NpYmx5CmZyb20gQ0dJKS4KCltUaGlzIHdhcyBuZXcgaW4gMS42XSBUaGUgaW5zdGFsbGVyIG5vIGxvbmdlciBydW5zIGEgc2VwYXJhdGUgVGNsL1RrCmluc3RhbGxlcjsgaW5zdGVhZCwgaXQgaW5zdGFsbHMgdGhlIG5lZWRlZCBUY2wvVGsgZmlsZXMgZGlyZWN0bHkgaW4gdGhlClB5dGhvbiBkaXJlY3RvcnkuICBJZiB5b3UgYWxyZWFkeSBoYXZlIGEgVGNsL1RrIGluc3RhbGxhdGlvbiwgdGhpcwp3YXN0ZXMgc29tZSBkaXNrIHNwYWNlIChhYm91dCA0IE1lZ3MpIGJ1dCBhdm9pZHMgcHJvYmxlbXMgd2l0aApjb25mbGljdGluZyBUY2wvVGsgaW5zdGFsbGF0aW9ucywgYW5kIG1ha2VzIGl0IG11Y2ggZWFzaWVyIGZvciBQeXRob24KdG8gZW5zdXJlIHRoYXQgVGNsL1RrIGNhbiBmaW5kIGFsbCBpdHMgZmlsZXMuCgpbVGhpcyB3YXMgbmV3IGluIDEuNl0gVGhlIFdpbmRvd3MgaW5zdGFsbGVyIG5vdyBpbnN0YWxscyBieSBkZWZhdWx0IGluClxQeXRob24yMFwgb24gdGhlIGRlZmF1bHQgdm9sdW1lLCBpbnN0ZWFkIG9mIFxQcm9ncmFtIEZpbGVzXFB5dGhvbi0yLjBcLgoKClVwZGF0ZXMgdG8gdGhlIGNoYW5nZXMgYmV0d2VlbiAxLjUuMiBhbmQgMS42Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpUaGUgMS42IE5FV1MgZmlsZSBjYW4ndCBiZSBjaGFuZ2VkIGFmdGVyIHRoZSByZWxlYXNlIGlzIGRvbmUsIHNvIGhlcmUKaXMgc29tZSBsYXRlLWJyZWFraW5nIG5ld3M6CgpOZXcgQVBJcyBpbiBsb2NhbGUucHk6IG5vcm1hbGl6ZSgpLCBnZXRkZWZhdWx0bG9jYWxlKCksIHJlc2V0bG9jYWxlKCksCmFuZCBjaGFuZ2VzIHRvIGdldGxvY2FsZSgpIGFuZCBzZXRsb2NhbGUoKS4KClRoZSBuZXcgbW9kdWxlIGlzIG5vdyBlbmFibGVkIHBlciBkZWZhdWx0LgoKSXQgaXMgbm90IHRydWUgdGhhdCB0aGUgZW5jb2RpbmdzIGNvZGVjcyBjYW5ub3QgYmUgdXNlZCBmb3Igbm9ybWFsCnN0cmluZ3M6IHRoZSBzdHJpbmcuZW5jb2RlKCkgKHdoaWNoIGlzIGFsc28gcHJlc2VudCBvbiA4LWJpdCBzdHJpbmdzCiEpIGFsbG93cyB1c2luZyB0aGVtIGZvciA4LWJpdCBzdHJpbmdzIHRvbywgZS5nLiB0byBjb252ZXJ0IGZpbGVzIGZyb20KY3AxMjUyIChXaW5kb3dzKSB0byBsYXRpbi0xIG9yIHZpY2UtdmVyc2EuCgpKYXBhbmVzZSBjb2RlY3MgYXJlIGF2YWlsYWJsZSBmcm9tIFRhbWl0byBLQUpJWUFNQToKaHR0cDovL3BzZXVkby5ncmFkLnNjY3MuY2h1a3lvLXUuYWMuanAvfmthaml5YW1hL3B5dGhvbi8KCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cg==