VGhpcyBmaWxlIGNvbnRhaW5zIGJyaWVmIGluZm9ybWF0aW9uIGFib3V0IHRoZSBTQ1NJIHRhcGUgZHJpdmVyLgpUaGUgZHJpdmVyIGlzIGN1cnJlbnRseSBtYWludGFpbmVkIGJ5IEthaSBN5Gtpc2FyYSAoZW1haWwKS2FpLk1ha2lzYXJhQGtvbHVtYnVzLmZpKQoKTGFzdCBtb2RpZmllZDogTW9uIE1hciAgNyAyMToxNDo0NCAyMDA1IGJ5IGthaS5tYWtpc2FyYQoKCkJBU0lDUwoKVGhlIGRyaXZlciBpcyBnZW5lcmljLCBpLmUuLCBpdCBkb2VzIG5vdCBjb250YWluIGFueSBjb2RlIHRhaWxvcmVkCnRvIGFueSBzcGVjaWZpYyB0YXBlIGRyaXZlLiBUaGUgdGFwZSBwYXJhbWV0ZXJzIGNhbiBiZSBzcGVjaWZpZWQgd2l0aApvbmUgb2YgdGhlIGZvbGxvd2luZyB0aHJlZSBtZXRob2RzOgoKMS4gRWFjaCB1c2VyIGNhbiBzcGVjaWZ5IHRoZSB0YXBlIHBhcmFtZXRlcnMgaGUvc2hlIHdhbnRzIHRvIHVzZQpkaXJlY3RseSB3aXRoIGlvY3Rscy4gVGhpcyBpcyBhZG1pbmlzdHJhdGl2ZWx5IGEgdmVyeSBzaW1wbGUgYW5kCmZsZXhpYmxlIG1ldGhvZCBhbmQgYXBwbGljYWJsZSB0byBzaW5nbGUtdXNlciB3b3Jrc3RhdGlvbnMuIEhvd2V2ZXIsCmluIGEgbXVsdGl1c2VyIGVudmlyb25tZW50IHRoZSBuZXh0IHVzZXIgZmluZHMgdGhlIHRhcGUgcGFyYW1ldGVycyBpbgpzdGF0ZSB0aGUgcHJldmlvdXMgdXNlciBsZWZ0IHRoZW0uCgoyLiBUaGUgc3lzdGVtIG1hbmFnZXIgKHJvb3QpIGNhbiBkZWZpbmUgZGVmYXVsdCB2YWx1ZXMgZm9yIHNvbWUgdGFwZQpwYXJhbWV0ZXJzLCBsaWtlIGJsb2NrIHNpemUgYW5kIGRlbnNpdHkgdXNpbmcgdGhlIE1UU0VURFJWQlVGRkVSIGlvY3RsLgpUaGVzZSBwYXJhbWV0ZXJzIGNhbiBiZSBwcm9ncmFtbWVkIHRvIGNvbWUgaW50byBlZmZlY3QgZWl0aGVyIHdoZW4gYQpuZXcgdGFwZSBpcyBsb2FkZWQgaW50byB0aGUgZHJpdmUgb3IgaWYgd3JpdGluZyBiZWdpbnMgYXQgdGhlCmJlZ2lubmluZyBvZiB0aGUgdGFwZS4gVGhlIHNlY29uZCBtZXRob2QgaXMgYXBwbGljYWJsZSBpZiB0aGUgdGFwZQpkcml2ZSBwZXJmb3JtcyBhdXRvLWRldGVjdGlvbiBvZiB0aGUgdGFwZSBmb3JtYXQgd2VsbCAobGlrZSBzb21lClFJQy1kcml2ZXMpLiBUaGUgcmVzdWx0IGlzIHRoYXQgYW55IHRhcGUgY2FuIGJlIHJlYWQsIHdyaXRpbmcgY2FuIGJlCmNvbnRpbnVlZCB1c2luZyBleGlzdGluZyBmb3JtYXQsIGFuZCB0aGUgZGVmYXVsdCBmb3JtYXQgaXMgdXNlZCBpZgp0aGUgdGFwZSBpcyByZXdyaXR0ZW4gZnJvbSB0aGUgYmVnaW5uaW5nIChvciBhIG5ldyB0YXBlIGlzIHdyaXR0ZW4KZm9yIHRoZSBmaXJzdCB0aW1lKS4gVGhlIGZpcnN0IG1ldGhvZCBpcyBhcHBsaWNhYmxlIGlmIHRoZSBkcml2ZQpkb2VzIG5vdCBwZXJmb3JtIGF1dG8tZGV0ZWN0aW9uIHdlbGwgZW5vdWdoIGFuZCB0aGVyZSBpcyBhIHNpbmdsZQoic2Vuc2libGUiIG1vZGUgZm9yIHRoZSBkZXZpY2UuIEFuIGV4YW1wbGUgaXMgYSBEQVQgZHJpdmUgdGhhdCBpcwp1c2VkIG9ubHkgaW4gdmFyaWFibGUgYmxvY2sgbW9kZSAoSSBkb24ndCBrbm93IGlmIHRoaXMgaXMgc2Vuc2libGUKb3Igbm90IDotKS4KClRoZSB1c2VyIGNhbiBvdmVycmlkZSB0aGUgcGFyYW1ldGVycyBkZWZpbmVkIGJ5IHRoZSBzeXN0ZW0KbWFuYWdlci4gVGhlIGNoYW5nZXMgcGVyc2lzdCB1bnRpbCB0aGUgZGVmYXVsdHMgYWdhaW4gY29tZSBpbnRvCmVmZmVjdC4KCjMuIEJ5IGRlZmF1bHQsIHVwIHRvIGZvdXIgbW9kZXMgY2FuIGJlIGRlZmluZWQgYW5kIHNlbGVjdGVkIHVzaW5nIHRoZSBtaW5vcgpudW1iZXIgKGJpdHMgNSBhbmQgNikuIFRoZSBudW1iZXIgb2YgbW9kZXMgY2FuIGJlIGNoYW5nZWQgYnkgY2hhbmdpbmcKU1RfTkJSX01PREVfQklUUyBpbiBzdC5oLiBNb2RlIDAgY29ycmVzcG9uZHMgdG8gdGhlIGRlZmF1bHRzIGRpc2N1c3NlZAphYm92ZS4gQWRkaXRpb25hbCBtb2RlcyBhcmUgZG9ybWFudCB1bnRpbCB0aGV5IGFyZSBkZWZpbmVkIGJ5IHRoZQpzeXN0ZW0gbWFuYWdlciAocm9vdCkuIFdoZW4gc3BlY2lmaWNhdGlvbiBvZiBhIG5ldyBtb2RlIGlzIHN0YXJ0ZWQsCnRoZSBjb25maWd1cmF0aW9uIG9mIG1vZGUgMCBpcyB1c2VkIHRvIHByb3ZpZGUgYSBzdGFydGluZyBwb2ludCBmb3IKZGVmaW5pdGlvbiBvZiB0aGUgbmV3IG1vZGUuCgpVc2luZyB0aGUgbW9kZXMgYWxsb3dzIHRoZSBzeXN0ZW0gbWFuYWdlciB0byBnaXZlIHRoZSB1c2VycyBjaG9pY2VzCm92ZXIgc29tZSBvZiB0aGUgYnVmZmVyaW5nIHBhcmFtZXRlcnMgbm90IGRpcmVjdGx5IGFjY2Vzc2libGUgdG8gdGhlCnVzZXJzIChidWZmZXJlZCBhbmQgYXN5bmNocm9ub3VzIHdyaXRlcykuIFRoZSBtb2RlcyBhbHNvIGFsbG93IGNob2ljZXMKYmV0d2VlbiBmb3JtYXRzIGluIG11bHRpLXRhcGUgb3BlcmF0aW9ucyAodGhlIGV4cGxpY2l0bHkgb3ZlcnJpZGRlbgpwYXJhbWV0ZXJzIGFyZSByZXNldCB3aGVuIGEgbmV3IHRhcGUgaXMgbG9hZGVkKS4KCklmIG1vcmUgdGhhbiBvbmUgbW9kZSBpcyB1c2VkLCBhbGwgbW9kZXMgc2hvdWxkIGNvbnRhaW4gZGVmaW5pdGlvbnMKZm9yIHRoZSBzYW1lIHNldCBvZiBwYXJhbWV0ZXJzLgoKTWFueSBVbmljZXMgY29udGFpbiBpbnRlcm5hbCB0YWJsZXMgdGhhdCBhc3NvY2lhdGUgZGlmZmVyZW50IG1vZGVzIHRvCnN1cHBvcnRlZCBkZXZpY2VzLiBUaGUgTGludXggU0NTSSB0YXBlIGRyaXZlciBkb2VzIG5vdCBjb250YWluIHN1Y2gKdGFibGVzIChhbmQgd2lsbCBub3QgZG8gdGhhdCBpbiBmdXR1cmUpLiBJbnN0ZWFkIG9mIHRoYXQsIGEgdXRpbGl0eQpwcm9ncmFtIGNhbiBiZSBtYWRlIHRoYXQgZmV0Y2hlcyB0aGUgaW5xdWlyeSBkYXRhIHNlbnQgYnkgdGhlIGRldmljZSwKc2NhbnMgaXRzIGRhdGFiYXNlLCBhbmQgc2V0cyB1cCB0aGUgbW9kZXMgdXNpbmcgdGhlIGlvY3Rscy4gQW5vdGhlcgphbHRlcm5hdGl2ZSBpcyB0byBtYWtlIGEgc21hbGwgc2NyaXB0IHRoYXQgdXNlcyBtdCB0byBzZXQgdGhlIGRlZmF1bHRzCnRhaWxvcmVkIHRvIHRoZSBzeXN0ZW0uCgpUaGUgZHJpdmVyIHN1cHBvcnRzIGZpeGVkIGFuZCB2YXJpYWJsZSBibG9jayBzaXplICh3aXRoaW4gYnVmZmVyCmxpbWl0cykuIEJvdGggdGhlIGF1dG8tcmV3aW5kIChtaW5vciBlcXVhbHMgZGV2aWNlIG51bWJlcikgYW5kCm5vbi1yZXdpbmQgZGV2aWNlcyAobWlub3IgaXMgMTI4ICsgZGV2aWNlIG51bWJlcikgYXJlIGltcGxlbWVudGVkLgoKSW4gdmFyaWFibGUgYmxvY2sgbW9kZSwgdGhlIGJ5dGUgY291bnQgaW4gd3JpdGUoKSBkZXRlcm1pbmVzIHRoZSBzaXplCm9mIHRoZSBwaHlzaWNhbCBibG9jayBvbiB0YXBlLiBXaGVuIHJlYWRpbmcsIHRoZSBkcml2ZSByZWFkcyB0aGUgbmV4dAp0YXBlIGJsb2NrIGFuZCByZXR1cm5zIHRvIHRoZSB1c2VyIHRoZSBkYXRhIGlmIHRoZSByZWFkKCkgYnl0ZSBjb3VudAppcyBhdCBsZWFzdCB0aGUgYmxvY2sgc2l6ZS4gT3RoZXJ3aXNlLCBlcnJvciBFTk9NRU0gaXMgcmV0dXJuZWQuCgpJbiBmaXhlZCBibG9jayBtb2RlLCB0aGUgZGF0YSB0cmFuc2ZlciBiZXR3ZWVuIHRoZSBkcml2ZSBhbmQgdGhlCmRyaXZlciBpcyBpbiBtdWx0aXBsZXMgb2YgdGhlIGJsb2NrIHNpemUuIFRoZSB3cml0ZSgpIGJ5dGUgY291bnQgbXVzdApiZSBhIG11bHRpcGxlIG9mIHRoZSBibG9jayBzaXplLiBUaGlzIGlzIG5vdCByZXF1aXJlZCB3aGVuIHJlYWRpbmcgYnV0Cm1heSBiZSBhZHZpc2FibGUgZm9yIHBvcnRhYmlsaXR5LgoKU3VwcG9ydCBpcyBwcm92aWRlZCBmb3IgY2hhbmdpbmcgdGhlIHRhcGUgcGFydGl0aW9uIGFuZCBwYXJ0aXRpb25pbmcKb2YgdGhlIHRhcGUgd2l0aCBvbmUgb3IgdHdvIHBhcnRpdGlvbnMuIEJ5IGRlZmF1bHQgc3VwcG9ydCBmb3IKcGFydGl0aW9uZWQgdGFwZSBpcyBkaXNhYmxlZCBmb3IgZWFjaCBkcml2ZXIgYW5kIGl0IGNhbiBiZSBlbmFibGVkCndpdGggdGhlIGlvY3RsIE1UU0VURFJWQlVGRkVSLgoKQnkgZGVmYXVsdCB0aGUgZHJpdmVyIHdyaXRlcyBvbmUgZmlsZW1hcmsgd2hlbiB0aGUgZGV2aWNlIGlzIGNsb3NlZCBhZnRlcgp3cml0aW5nIGFuZCB0aGUgbGFzdCBvcGVyYXRpb24gaGFzIGJlZW4gYSB3cml0ZS4gVHdvIGZpbGVtYXJrcyBjYW4gYmUKb3B0aW9uYWxseSB3cml0dGVuLiBJbiBib3RoIGNhc2VzIGVuZCBvZiBkYXRhIGlzIHNpZ25pZmllZCBieQpyZXR1cm5pbmcgemVybyBieXRlcyBmb3IgdHdvIGNvbnNlY3V0aXZlIHJlYWRzLgoKSWYgcmV3aW5kLCBvZmZsaW5lLCBic2YsIG9yIHNlZWsgaXMgZG9uZSBhbmQgcHJldmlvdXMgdGFwZSBvcGVyYXRpb24gd2FzCndyaXRlLCBhIGZpbGVtYXJrIGlzIHdyaXR0ZW4gYmVmb3JlIG1vdmluZyB0YXBlLgoKVGhlIGNvbXBpbGUgb3B0aW9ucyBhcmUgZGVmaW5lZCBpbiB0aGUgZmlsZSBsaW51eC9kcml2ZXJzL3Njc2kvc3Rfb3B0aW9ucy5oLgoKNC4gSWYgdGhlIG9wZW4gb3B0aW9uIE9fTk9OQkxPQ0sgaXMgdXNlZCwgb3BlbiBzdWNjZWVkcyBldmVuIGlmIHRoZQpkcml2ZSBpcyBub3QgcmVhZHkuIElmIE9fTk9OQkxPQ0sgaXMgbm90IHVzZWQsIHRoZSBkcml2ZXIgd2FpdHMgZm9yCnRoZSBkcml2ZSB0byBiZWNvbWUgcmVhZHkuIElmIHRoaXMgZG9lcyBub3QgaGFwcGVuIGluIFNUX0JMT0NLX1NFQ09ORFMKc2Vjb25kcywgb3BlbiBmYWlscyB3aXRoIHRoZSBlcnJubyB2YWx1ZSBFSU8uIFdpdGggT19OT05CTE9DSyB0aGUKZGV2aWNlIGNhbiBiZSBvcGVuZWQgZm9yIHdyaXRpbmcgZXZlbiBpZiB0aGVyZSBpcyBhIHdyaXRlIHByb3RlY3RlZAp0YXBlIGluIHRoZSBkcml2ZSAoY29tbWFuZHMgdHJ5aW5nIHRvIHdyaXRlIHNvbWV0aGluZyByZXR1cm4gZXJyb3IgaWYKYXR0ZW1wdGVkKS4KCgpNSU5PUiBOVU1CRVJTCgpUaGUgdGFwZSBkcml2ZXIgY3VycmVudGx5IHN1cHBvcnRzIDEyOCBkcml2ZXMgYnkgZGVmYXVsdC4gVGhpcyBudW1iZXIKY2FuIGJlIGluY3JlYXNlZCBieSBlZGl0aW5nIHN0LmggYW5kIHJlY29tcGlsaW5nIHRoZSBkcml2ZXIgaWYKbmVjZXNzYXJ5LiBUaGUgdXBwZXIgbGltaXQgaXMgMl4xNyBkcml2ZXMgaWYgNCBtb2RlcyBmb3IgZWFjaCBkcml2ZQphcmUgdXNlZC4KClRoZSBtaW5vciBudW1iZXJzIGNvbnNpc3Qgb2YgdGhlIGZvbGxvd2luZyBiaXQgZmllbGRzOgoKZGV2X3VwcGVyIG5vbi1yZXcgbW9kZSBkZXYtbG93ZXIKICAyMCAtICA4ICAgICA3ICAgIDYgNSAgNCAgICAgIDAKVGhlIG5vbi1yZXdpbmQgYml0IGlzIGFsd2F5cyBiaXQgNyAodGhlIHVwcGVybW9zdCBiaXQgaW4gdGhlIGxvd2VybW9zdApieXRlKS4gVGhlIGJpdHMgZGVmaW5pbmcgdGhlIG1vZGUgYXJlIGJlbG93IHRoZSBub24tcmV3aW5kIGJpdC4gVGhlCnJlbWFpbmluZyBiaXRzIGRlZmluZSB0aGUgdGFwZSBkZXZpY2UgbnVtYmVyLiBUaGlzIG51bWJlcmluZyBpcwpiYWNrd2FyZCBjb21wYXRpYmxlIHdpdGggdGhlIG51bWJlcmluZyB1c2VkIHdoZW4gdGhlIG1pbm9yIG51bWJlciB3YXMKb25seSA4IGJpdHMgd2lkZS4KCgpTWVNGUyBTVVBQT1JUCgpUaGUgZHJpdmVyIGNyZWF0ZXMgdGhlIGRpcmVjdG9yeSAvc3lzL2NsYXNzL3Njc2lfdGFwZSBhbmQgcG9wdWxhdGVzIGl0IHdpdGgKZGlyZWN0b3JpZXMgY29ycmVzcG9uZGluZyB0byB0aGUgZXhpc3RpbmcgdGFwZSBkZXZpY2VzLiBUaGVyZSBhcmUgYXV0b3Jld2luZAphbmQgbm9uLXJld2luZCBlbnRyaWVzIGZvciBlYWNoIG1vZGUuIFRoZSBuYW1lcyBhcmUgc3R4eSBhbmQgbnN0eHksIHdoZXJlIHgKaXMgdGhlIHRhcGUgbnVtYmVyIGFuZCB5IGEgY2hhcmFjdGVyIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG1vZGUgKG5vbmUsIGwsIG0sCmEpLiBGb3IgZXhhbXBsZSwgdGhlIGRpcmVjdG9yaWVzIGZvciB0aGUgZmlyc3QgdGFwZSBkZXZpY2UgYXJlIChhc3N1bWluZyBmb3VyCm1vZGVzKTogc3QwICBuc3QwICBzdDBsICBuc3QwbCAgc3QwbSAgbnN0MG0gIHN0MGEgIG5zdDBhLgoKRWFjaCBkaXJlY3RvcnkgY29udGFpbnMgdGhlIGVudHJpZXM6IGRlZmF1bHRfYmxrc2l6ZSAgZGVmYXVsdF9jb21wcmVzc2lvbgpkZWZhdWx0X2RlbnNpdHkgIGRlZmluZWQgIGRldiAgZGV2aWNlICBkcml2ZXIuIFRoZSBmaWxlICdkZWZpbmVkJyBjb250YWlucyAxCmlmIHRoZSBtb2RlIGlzIGRlZmluZWQgYW5kIHplcm8gaWYgbm90IGRlZmluZWQuIFRoZSBmaWxlcyAnZGVmYXVsdF8qJyBjb250YWluCnRoZSBkZWZhdWx0cyBzZXQgYnkgdGhlIHVzZXIuIFRoZSB2YWx1ZSAtMSBtZWFucyB0aGUgZGVmYXVsdCBpcyBub3Qgc2V0LiBUaGUKZmlsZSAnZGV2JyBjb250YWlucyB0aGUgZGV2aWNlIG51bWJlcnMgY29ycmVzcG9uZGluZyB0byB0aGlzIGRldmljZS4gVGhlIGxpbmtzCidkZXZpY2UnIGFuZCAnZHJpdmVyJyBwb2ludCB0byB0aGUgU0NTSSBkZXZpY2UgYW5kIGRyaXZlciBlbnRyaWVzLgoKQSBsaW5rIG5hbWVkICd0YXBlJyBpcyBtYWRlIGZyb20gdGhlIFNDU0kgZGV2aWNlIGRpcmVjdG9yeSB0byB0aGUgY2xhc3MKZGlyZWN0b3J5IGNvcnJlc3BvbmRpbmcgdG8gdGhlIG1vZGUgMCBhdXRvLXJld2luZCBkZXZpY2UgKGUuZy4sIHN0MCkuIAoKCkJTRCBBTkQgU1lTIFYgU0VNQU5USUNTCgpUaGUgdXNlciBjYW4gY2hvb3NlIGJldHdlZW4gdGhlc2UgdHdvIGJlaGF2aW91cnMgb2YgdGhlIHRhcGUgZHJpdmVyIGJ5CmRlZmluaW5nIHRoZSB2YWx1ZSBvZiB0aGUgc3ltYm9sIFNUX1NZU1YuIFRoZSBzZW1hbnRpY3MgZGlmZmVyIHdoZW4gYQpmaWxlIGJlaW5nIHJlYWQgaXMgY2xvc2VkLiBUaGUgQlNEIHNlbWFudGljcyBsZWF2ZXMgdGhlIHRhcGUgd2hlcmUgaXQKY3VycmVudGx5IGlzIHdoZXJlYXMgdGhlIFNZUyBWIHNlbWFudGljcyBtb3ZlcyB0aGUgdGFwZSBwYXN0IHRoZSBuZXh0CmZpbGVtYXJrIHVubGVzcyB0aGUgZmlsZW1hcmsgaGFzIGp1c3QgYmVlbiBjcm9zc2VkLgoKVGhlIGRlZmF1bHQgaXMgQlNEIHNlbWFudGljcy4KCgpCVUZGRVJJTkcKClRoZSBkcml2ZXIgdHJpZXMgdG8gZG8gdHJhbnNmZXJzIGRpcmVjdGx5IHRvL2Zyb20gdXNlciBzcGFjZS4gSWYgdGhpcwppcyBub3QgcG9zc2libGUsIGEgZHJpdmVyIGJ1ZmZlciBhbGxvY2F0ZWQgYXQgcnVuLXRpbWUgaXMgdXNlZC4gSWYKZGlyZWN0IGkvbyBpcyBub3QgcG9zc2libGUgZm9yIHRoZSB3aG9sZSB0cmFuc2ZlciwgdGhlIGRyaXZlciBidWZmZXIKaXMgdXNlZCAoaS5lLiwgYm91bmNlIGJ1ZmZlcnMgZm9yIGluZGl2aWR1YWwgcGFnZXMgYXJlIG5vdAp1c2VkKS4gRGlyZWN0IGkvbyBjYW4gYmUgaW1wb3NzaWJsZSBiZWNhdXNlIG9mIHNldmVyYWwgcmVhc29ucywgZS5nLjoKLSBvbmUgb3IgbW9yZSBwYWdlcyBhcmUgYXQgYWRkcmVzc2VzIG5vdCByZWFjaGFibGUgYnkgdGhlIEhCQQotIHRoZSBudW1iZXIgb2YgcGFnZXMgaW4gdGhlIHRyYW5zZmVyIGV4Y2VlZHMgdGhlIG51bWJlciBvZgogIHNjYXR0ZXIvZ2F0aGVyIHNlZ21lbnRzIHBlcm1pdHRlZCBieSB0aGUgSEJBCi0gb25lIG9yIG1vcmUgcGFnZXMgY2FuJ3QgYmUgbG9ja2VkIGludG8gbWVtb3J5IChzaG91bGQgbm90IGhhcHBlbiBpbgogIGFueSByZWFzb25hYmxlIHNpdHVhdGlvbikKClRoZSBzaXplIG9mIHRoZSBkcml2ZXIgYnVmZmVycyBpcyBhbHdheXMgYXQgbGVhc3Qgb25lIHRhcGUgYmxvY2suIEluIGZpeGVkCmJsb2NrIG1vZGUsIHRoZSBtaW5pbXVtIGJ1ZmZlciBzaXplIGlzIGRlZmluZWQgKGluIDEwMjQgYnl0ZSB1bml0cykgYnkKU1RfRklYRURfQlVGRkVSX0JMT0NLUy4gV2l0aCBzbWFsbCBibG9jayBzaXplIHRoaXMgYWxsb3dzIGJ1ZmZlcmluZyBvZgpzZXZlcmFsIGJsb2NrcyBhbmQgdXNpbmcgb25lIFNDU0kgcmVhZCBvciB3cml0ZSB0byB0cmFuc2ZlciBhbGwgb2YgdGhlCmJsb2Nrcy4gQnVmZmVyaW5nIG9mIGRhdGEgYWNyb3NzIHdyaXRlIGNhbGxzIGluIGZpeGVkIGJsb2NrIG1vZGUgaXMKYWxsb3dlZCBpZiBTVF9CVUZGRVJfV1JJVEVTIGlzIG5vbi16ZXJvIGFuZCBkaXJlY3QgaS9vIGlzIG5vdCB1c2VkLgpCdWZmZXIgYWxsb2NhdGlvbiB1c2VzIGNodW5rcyBvZiBtZW1vcnkgaGF2aW5nIHNpemVzIDJebiAqIChwYWdlCnNpemUpLiBCZWNhdXNlIG9mIHRoaXMgdGhlIGFjdHVhbCBidWZmZXIgc2l6ZSBtYXkgYmUgbGFyZ2VyIHRoYW4gdGhlCm1pbmltdW0gYWxsb3dhYmxlIGJ1ZmZlciBzaXplLgoKTk9URSB0aGF0IGlmIGRpcmVjdCBpL28gaXMgdXNlZCwgdGhlIHNtYWxsIHdyaXRlcyBhcmUgbm90IGJ1ZmZlcmVkLiBUaGlzIG1heQpjYXVzZSBhIHN1cnByaXNlIHdoZW4gbW92aW5nIGZyb20gMi40LiBUaGVyZSBzbWFsbCB3cml0ZXMgKGUuZy4sIHRhciB3aXRob3V0Ci1iIG9wdGlvbikgbWF5IGhhdmUgaGFkIGdvb2QgdGhyb3VnaHB1dCBidXQgdGhpcyBpcyBub3QgdHJ1ZSBhbnkgbW9yZSB3aXRoCjIuNi4gRGlyZWN0IGkvbyBjYW4gYmUgdHVybmVkIG9mZiB0byBzb2x2ZSB0aGlzIHByb2JsZW0gYnV0IGEgYmV0dGVyIHNvbHV0aW9uCmlzIHRvIHVzZSBiaWdnZXIgd3JpdGUoKSBieXRlIGNvdW50cyAoZS5nLiwgdGFyIC1iIDY0KS4KCkFzeW5jaHJvbm91cyB3cml0aW5nLiBXcml0aW5nIHRoZSBidWZmZXIgY29udGVudHMgdG8gdGhlIHRhcGUgaXMKc3RhcnRlZCBhbmQgdGhlIHdyaXRlIGNhbGwgcmV0dXJucyBpbW1lZGlhdGVseS4gVGhlIHN0YXR1cyBpcyBjaGVja2VkCmF0IHRoZSBuZXh0IHRhcGUgb3BlcmF0aW9uLiBBc3luY2hyb25vdXMgd3JpdGVzIGFyZSBub3QgZG9uZSB3aXRoCmRpcmVjdCBpL28gYW5kIG5vdCBpbiBmaXhlZCBibG9jayBtb2RlLgoKQnVmZmVyZWQgd3JpdGVzIGFuZCBhc3luY2hyb25vdXMgd3JpdGVzIG1heSBpbiBzb21lIHJhcmUgY2FzZXMgY2F1c2UKcHJvYmxlbXMgaW4gbXVsdGl2b2x1bWUgb3BlcmF0aW9ucyBpZiB0aGVyZSBpcyBub3QgZW5vdWdoIHNwYWNlIG9uIHRoZQp0YXBlIGFmdGVyIHRoZSBlYXJseS13YXJuaW5nIG1hcmsgdG8gZmx1c2ggdGhlIGRyaXZlciBidWZmZXIuCgpSZWFkIGFoZWFkIGZvciBmaXhlZCBibG9jayBtb2RlIChTVF9SRUFEX0FIRUFEKS4gRmlsbGluZyB0aGUgYnVmZmVyIGlzCmF0dGVtcHRlZCBldmVuIGlmIHRoZSB1c2VyIGRvZXMgbm90IHdhbnQgdG8gZ2V0IGFsbCBvZiB0aGUgZGF0YSBhdAp0aGlzIHJlYWQgY29tbWFuZC4gU2hvdWxkIGJlIGRpc2FibGVkIGZvciB0aG9zZSBkcml2ZXMgdGhhdCBkb24ndCBsaWtlCmEgZmlsZW1hcmsgdG8gdHJ1bmNhdGUgYSByZWFkIHJlcXVlc3Qgb3IgdGhhdCBkb24ndCBsaWtlIGJhY2tzcGFjaW5nLgoKU2NhdHRlci9nYXRoZXIgYnVmZmVycyAoYnVmZmVycyB0aGF0IGNvbnNpc3Qgb2YgY2h1bmtzIG5vbi1jb250aWd1b3VzCmluIHRoZSBwaHlzaWNhbCBtZW1vcnkpIGFyZSB1c2VkIGlmIGNvbnRpZ3VvdXMgYnVmZmVycyBjYW4ndCBiZQphbGxvY2F0ZWQuIFRvIHN1cHBvcnQgYWxsIFNDU0kgYWRhcHRlcnMgKGluY2x1ZGluZyB0aG9zZSBub3QKc3VwcG9ydGluZyBzY2F0dGVyL2dhdGhlciksIGJ1ZmZlciBhbGxvY2F0aW9uIGlzIHVzaW5nIHRoZSBmb2xsb3dpbmcKdGhyZWUga2luZHMgb2YgY2h1bmtzOgoxLiBUaGUgaW5pdGlhbCBzZWdtZW50IHRoYXQgaXMgdXNlZCBmb3IgYWxsIFNDU0kgYWRhcHRlcnMgaW5jbHVkaW5nCnRob3NlIG5vdCBzdXBwb3J0aW5nIHNjYXR0ZXIvZ2F0aGVyLiBUaGUgc2l6ZSBvZiB0aGlzIGJ1ZmZlciB3aWxsIGJlCihQQUdFX1NJWkUgPDwgU1RfRklSU1RfT1JERVIpIGJ5dGVzIGlmIHRoZSBzeXN0ZW0gY2FuIGdpdmUgYSBjaHVuayBvZgp0aGlzIHNpemUgKGFuZCBpdCBpcyBub3QgbGFyZ2VyIHRoYW4gdGhlIGJ1ZmZlciBzaXplIHNwZWNpZmllZCBieQpTVF9CVUZGRVJfQkxPQ0tTKS4gSWYgdGhpcyBzaXplIGlzIG5vdCBhdmFpbGFibGUsIHRoZSBkcml2ZXIgaGFsdmVzCnRoZSBzaXplIGFuZCB0cmllcyBhZ2FpbiB1bnRpbCB0aGUgc2l6ZSBvZiBvbmUgcGFnZS4gVGhlIGRlZmF1bHQKc2V0dGluZ3MgaW4gc3Rfb3B0aW9ucy5oIG1ha2UgdGhlIGRyaXZlciB0byB0cnkgdG8gYWxsb2NhdGUgYWxsIG9mIHRoZQpidWZmZXIgYXMgb25lIGNodW5rLgoyLiBUaGUgc2NhdHRlci9nYXRoZXIgc2VnbWVudHMgdG8gZmlsbCB0aGUgc3BlY2lmaWVkIGJ1ZmZlciBzaXplIGFyZQphbGxvY2F0ZWQgc28gdGhhdCBhcyBtYW55IHNlZ21lbnRzIGFzIHBvc3NpYmxlIGFyZSB1c2VkIGJ1dCB0aGUgbnVtYmVyCm9mIHNlZ21lbnRzIGRvZXMgbm90IGV4Y2VlZCBTVF9GSVJTVF9TRy4KMy4gVGhlIHJlbWFpbmluZyBzZWdtZW50cyBiZXR3ZWVuIFNUX01BWF9TRyAob3IgdGhlIG1vZHVsZSBwYXJhbWV0ZXIKbWF4X3NnX3NlZ3MpIGFuZCB0aGUgbnVtYmVyIG9mIHNlZ21lbnRzIHVzZWQgaW4gcGhhc2VzIDEgYW5kIDIKYXJlIHVzZWQgdG8gZXh0ZW5kIHRoZSBidWZmZXIgYXQgcnVuLXRpbWUgaWYgdGhpcyBpcyBuZWNlc3NhcnkuIFRoZQpudW1iZXIgb2Ygc2NhdHRlci9nYXRoZXIgc2VnbWVudHMgYWxsb3dlZCBmb3IgdGhlIFNDU0kgYWRhcHRlciBpcyBub3QKZXhjZWVkZWQgaWYgaXQgaXMgc21hbGxlciB0aGFuIHRoZSBtYXhpbXVtIG51bWJlciBvZiBzY2F0dGVyL2dhdGhlcgpzZWdtZW50cyBzcGVjaWZpZWQuIElmIHRoZSBtYXhpbXVtIG51bWJlciBhbGxvd2VkIGZvciB0aGUgU0NTSSBhZGFwdGVyCmlzIHNtYWxsZXIgdGhhbiB0aGUgbnVtYmVyIG9mIHNlZ21lbnRzIHVzZWQgaW4gcGhhc2VzIDEgYW5kIDIsCmV4dGVuZGluZyB0aGUgYnVmZmVyIHdpbGwgYWx3YXlzIGZhaWwuCgoKRU9NIEJFSEFWSU9VUiBXSEVOIFdSSVRJTkcKCldoZW4gdGhlIGVuZCBvZiBtZWRpdW0gZWFybHkgd2FybmluZyBpcyBlbmNvdW50ZXJlZCwgdGhlIGN1cnJlbnQgd3JpdGUKaXMgZmluaXNoZWQgYW5kIHRoZSBudW1iZXIgb2YgYnl0ZXMgaXMgcmV0dXJuZWQuIFRoZSBuZXh0IHdyaXRlCnJldHVybnMgLTEgYW5kIGVycm5vIGlzIHNldCB0byBFTk9TUEMuIFRvIGVuYWJsZSB3cml0aW5nIGEgdHJhaWxlciwKdGhlIG5leHQgd3JpdGUgaXMgYWxsb3dlZCB0byBwcm9jZWVkIGFuZCwgaWYgc3VjY2Vzc2Z1bCwgdGhlIG51bWJlciBvZgpieXRlcyBpcyByZXR1cm5lZC4gQWZ0ZXIgdGhpcywgLTEgYW5kIHRoZSBudW1iZXIgb2YgYnl0ZXMgYXJlCmFsdGVybmF0ZWx5IHJldHVybmVkIHVudGlsIHRoZSBwaHlzaWNhbCBlbmQgb2YgbWVkaXVtIChvciBzb21lIG90aGVyCmVycm9yKSBpcyBlbmNvdW50ZXJlZC4KCgpNT0RVTEUgUEFSQU1FVEVSUwoKVGhlIGJ1ZmZlciBzaXplLCB3cml0ZSB0aHJlc2hvbGQsIGFuZCB0aGUgbWF4aW11bSBudW1iZXIgb2YgYWxsb2NhdGVkIGJ1ZmZlcnMKYXJlIGNvbmZpZ3VyYWJsZSB3aGVuIHRoZSBkcml2ZXIgaXMgbG9hZGVkIGFzIGEgbW9kdWxlLiBUaGUga2V5d29yZHMgYXJlOgoKYnVmZmVyX2ticz14eHggICAgICAgICAgICAgdGhlIGJ1ZmZlciBzaXplIGZvciBmaXhlZCBibG9jayBtb2RlIGlzIHNldAoJCQkgICB0byB4eHgga2lsb2J5dGVzCndyaXRlX3RocmVzaG9sZF9rYnM9eHh4ICAgIHRoZSB3cml0ZSB0aHJlc2hvbGQgaW4ga2lsb2J5dGVzIHNldCB0byB4eHgKbWF4X3NnX3NlZ3M9eHh4CQkgICB0aGUgbWF4aW11bSBudW1iZXIgb2Ygc2NhdHRlci9nYXRoZXIKCQkJICAgc2VnbWVudHMKdHJ5X2RpcmVjdF9pbz14CQkgICB0cnkgZGlyZWN0IHRyYW5zZmVyIGJldHdlZW4gdXNlciBidWZmZXIgYW5kCgkJCSAgIHRhcGUgZHJpdmUgaWYgdGhpcyBpcyBub24temVybwoKTm90ZSB0aGF0IGlmIHRoZSBidWZmZXIgc2l6ZSBpcyBjaGFuZ2VkIGJ1dCB0aGUgd3JpdGUgdGhyZXNob2xkIGlzIG5vdApzZXQsIHRoZSB3cml0ZSB0aHJlc2hvbGQgaXMgc2V0IHRvIHRoZSBuZXcgYnVmZmVyIHNpemUgLSAyIGtCLgoKCkJPT1QgVElNRSBDT05GSUdVUkFUSU9OCgpJZiB0aGUgZHJpdmVyIGlzIGNvbXBpbGVkIGludG8gdGhlIGtlcm5lbCwgdGhlIHNhbWUgcGFyYW1ldGVycyBjYW4gYmUKYWxzbyBzZXQgdXNpbmcsIGUuZy4sIHRoZSBMSUxPIGNvbW1hbmQgbGluZS4gVGhlIHByZWZlcnJlZCBzeW50YXggaXMKdG8gdXNlIHRoZSBzYW1lIGtleXdvcmQgdXNlZCB3aGVuIGxvYWRpbmcgYXMgbW9kdWxlIGJ1dCBwcmVwZW5kZWQKd2l0aCAnc3QuJy4gRm9yIGluc3RhbmNlLCB0byBzZXQgdGhlIG1heGltdW0gbnVtYmVyIG9mIHNjYXR0ZXIvZ2F0aGVyCnNlZ21lbnRzLCB0aGUgcGFyYW1ldGVyICdzdC5tYXhfc2dfc2Vncz14eCcgc2hvdWxkIGJlIHVzZWQgKHh4IGlzIHRoZQpudW1iZXIgb2Ygc2NhdHRlci9nYXRoZXIgc2VnbWVudHMpLgoKRm9yIGNvbXBhdGliaWxpdHksIHRoZSBvbGQgc3ludGF4IGZyb20gZWFybHkgMi41IGFuZCAyLjQga2VybmVsCnZlcnNpb25zIGlzIHN1cHBvcnRlZC4gVGhlIHNhbWUga2V5d29yZHMgY2FuIGJlIHVzZWQgYXMgd2hlbiBsb2FkaW5nCnRoZSBkcml2ZXIgYXMgbW9kdWxlLiBJZiBzZXZlcmFsIHBhcmFtZXRlcnMgYXJlIHNldCwgdGhlIGtleXdvcmQtdmFsdWUKcGFpcnMgYXJlIHNlcGFyYXRlZCB3aXRoIGEgY29tbWEgKG5vIHNwYWNlcyBhbGxvd2VkKS4gQSBjb2xvbiBjYW4gYmUKdXNlZCBpbnN0ZWFkIG9mIHRoZSBlcXVhbCBtYXJrLiBUaGUgZGVmaW5pdGlvbiBpcyBwcmVwZW5kZWQgYnkgdGhlCnN0cmluZyBzdD0uIEhlcmUgaXMgYW4gZXhhbXBsZToKCglzdD1idWZmZXJfa2JzOjY0LHdyaXRlX3RocmVob2xkX2ticzo2MAoKVGhlIGZvbGxvd2luZyBzeW50YXggdXNlZCBieSB0aGUgb2xkIGtlcm5lbCB2ZXJzaW9ucyBpcyBhbHNvIHN1cHBvcnRlZDoKCiAgICAgICAgICAgc3Q9YWFbLGJiWyxkZF1dCgp3aGVyZQogIGFhIGlzIHRoZSBidWZmZXIgc2l6ZSBmb3IgZml4ZWQgYmxvY2sgbW9kZSBpbiAxMDI0IGJ5dGUgdW5pdHMKICBiYiBpcyB0aGUgd3JpdGUgdGhyZXNob2xkIGluIDEwMjQgYnl0ZSB1bml0cwogIGRkIGlzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBzY2F0dGVyL2dhdGhlciBzZWdtZW50cwoKCklPQ1RMUwoKVGhlIHRhcGUgaXMgcG9zaXRpb25lZCBhbmQgdGhlIGRyaXZlIHBhcmFtZXRlcnMgYXJlIHNldCB3aXRoIGlvY3RscwpkZWZpbmVkIGluIG10aW8uaCBUaGUgdGFwZSBjb250cm9sIHByb2dyYW0gJ210JyB1c2VzIHRoZXNlIGlvY3Rscy4gVHJ5CnRvIGZpbmQgYW4gbXQgdGhhdCBzdXBwb3J0cyBhbGwgb2YgdGhlIExpbnV4IFNDU0kgdGFwZSBpb2N0bHMgYW5kCm9wZW5zIHRoZSBkZXZpY2UgZm9yIHdyaXRpbmcgaWYgdGhlIHRhcGUgY29udGVudHMgd2lsbCBiZSBtb2RpZmllZAoobG9vayBmb3IgYSBwYWNrYWdlIG10LXN0KiBmcm9tIHRoZSBMaW51eCBmdHAgc2l0ZXM7IHRoZSBHTlUgbXQgZG9lcwpub3Qgb3BlbiBmb3Igd3JpdGluZyBmb3IsIGUuZy4sIGVyYXNlKS4KClRoZSBzdXBwb3J0ZWQgaW9jdGxzIGFyZToKClRoZSBmb2xsb3dpbmcgdXNlIHRoZSBzdHJ1Y3R1cmUgbXRvcDoKCk1URlNGICAgU3BhY2UgZm9yd2FyZCBvdmVyIGNvdW50IGZpbGVtYXJrcy4gVGFwZSBwb3NpdGlvbmVkIGFmdGVyIGZpbGVtYXJrLgpNVEZTRk0gIEFzIGFib3ZlIGJ1dCB0YXBlIHBvc2l0aW9uZWQgYmVmb3JlIGZpbGVtYXJrLgpNVEJTRglTcGFjZSBiYWNrd2FyZCBvdmVyIGNvdW50IGZpbGVtYXJrcy4gVGFwZSBwb3NpdGlvbmVkIGJlZm9yZQogICAgICAgIGZpbGVtYXJrLgpNVEJTRk0gIEFzIGFib3ZlIGJ1dCBhcGUgcG9zaXRpb25lZCBhZnRlciBmaWxlbWFyay4KTVRGU1IgICBTcGFjZSBmb3J3YXJkIG92ZXIgY291bnQgcmVjb3Jkcy4KTVRCU1IgICBTcGFjZSBiYWNrd2FyZCBvdmVyIGNvdW50IHJlY29yZHMuCk1URlNTICAgU3BhY2UgZm9yd2FyZCBvdmVyIGNvdW50IHNldG1hcmtzLgpNVEJTUyAgIFNwYWNlIGJhY2t3YXJkIG92ZXIgY291bnQgc2V0bWFya3MuCk1UV0VPRiAgV3JpdGUgY291bnQgZmlsZW1hcmtzLgpNVFdTTSAgIFdyaXRlIGNvdW50IHNldG1hcmtzLgpNVFJFVyAgIFJld2luZCB0YXBlLgpNVE9GRkwgIFNldCBkZXZpY2Ugb2ZmIGxpbmUgKG9mdGVuIHJld2luZCBwbHVzIGVqZWN0KS4KTVROT1AgICBEbyBub3RoaW5nIGV4Y2VwdCBmbHVzaCB0aGUgYnVmZmVycy4KTVRSRVRFTiBSZS10ZW5zaW9uIHRhcGUuCk1URU9NICAgU3BhY2UgdG8gZW5kIG9mIHJlY29yZGVkIGRhdGEuCk1URVJBU0UgRXJhc2UgdGFwZS4gSWYgdGhlIGFyZ3VtZW50IGlzIHplcm8sIHRoZSBzaG9ydCBlcmFzZSBjb21tYW5kCglpcyB1c2VkLiBUaGUgbG9uZyBlcmFzZSBjb21tYW5kIGlzIHVzZWQgd2l0aCBhbGwgb3RoZXIgdmFsdWVzCglvZiB0aGUgYXJndW1lbnQuCk1UU0VFSwlTZWVrIHRvIHRhcGUgYmxvY2sgY291bnQuIFVzZXMgVGFuZGJlcmctY29tcGF0aWJsZSBzZWVrIChRRkEpCiAgICAgICAgZm9yIFNDU0ktMSBkcml2ZXMgYW5kIFNDU0ktMiBzZWVrIGZvciBTQ1NJLTIgZHJpdmVzLiBUaGUgZmlsZSBhbmQKCWJsb2NrIG51bWJlcnMgaW4gdGhlIHN0YXR1cyBhcmUgbm90IHZhbGlkIGFmdGVyIGEgc2Vlay4KTVRTRVRCTEsgU2V0IHRoZSBkcml2ZSBibG9jayBzaXplLiBTZXR0aW5nIHRvIHplcm8gc2V0cyB0aGUgZHJpdmUgaW50bwogICAgICAgIHZhcmlhYmxlIGJsb2NrIG1vZGUgKGlmIGFwcGxpY2FibGUpLgpNVFNFVERFTlNJVFkgU2V0cyB0aGUgZHJpdmUgZGVuc2l0eSBjb2RlIHRvIGFyZy4gU2VlIGRyaXZlCiAgICAgICAgZG9jdW1lbnRhdGlvbiBmb3IgYXZhaWxhYmxlIGNvZGVzLgpNVExPQ0sgYW5kIE1UVU5MT0NLIEV4cGxpY2l0bHkgbG9jay91bmxvY2sgdGhlIHRhcGUgZHJpdmUgZG9vci4KTVRMT0FEIGFuZCBNVFVOTE9BRCBFeHBsaWNpdGx5IGxvYWQgYW5kIHVubG9hZCB0aGUgdGFwZS4gSWYgdGhlCgljb21tYW5kIGFyZ3VtZW50IHggaXMgYmV0d2VlbiBNVF9TVF9IUExPQURFUl9PRkZTRVQgKyAxIGFuZAoJTVRfU1RfSFBMT0FERVJfT0ZGU0VUICsgNiwgdGhlIG51bWJlciB4IGlzIHVzZWQgc2VudCB0byB0aGUKCWRyaXZlIHdpdGggdGhlIGNvbW1hbmQgYW5kIGl0IHNlbGVjdHMgdGhlIHRhcGUgc2xvdCB0byB1c2Ugb2YKCUhQIEMxNTUzQSBjaGFuZ2VyLgpNVENPTVBSRVNTSU9OIFNldHMgY29tcHJlc3Npbmcgb3IgdW5jb21wcmVzc2luZyBkcml2ZSBtb2RlIHVzaW5nIHRoZQoJU0NTSSBtb2RlIHBhZ2UgMTUuIE5vdGUgdGhhdCBzb21lIGRyaXZlcyBvdGhlciBtZXRob2RzIGZvcgoJY29udHJvbCBvZiBjb21wcmVzc2lvbi4gU29tZSBkcml2ZXMgKGxpa2UgdGhlIEV4YWJ5dGVzKSB1c2UKCWRlbnNpdHkgY29kZXMgZm9yIGNvbXByZXNzaW9uIGNvbnRyb2wuIFNvbWUgZHJpdmVzIHVzZSBhbm90aGVyCgltb2RlIHBhZ2UgYnV0IHRoaXMgcGFnZSBoYXMgbm90IGJlZW4gaW1wbGVtZW50ZWQgaW4gdGhlCglkcml2ZXIuIFNvbWUgZHJpdmVzIHdpdGhvdXQgY29tcHJlc3Npb24gY2FwYWJpbGl0eSB3aWxsIGFjY2VwdAoJYW55IGNvbXByZXNzaW9uIG1vZGUgd2l0aG91dCBlcnJvci4KTVRTRVRQQVJUIE1vdmVzIHRoZSB0YXBlIHRvIHRoZSBwYXJ0aXRpb24gZ2l2ZW4gYnkgdGhlIGFyZ3VtZW50IGF0IHRoZQoJbmV4dCB0YXBlIG9wZXJhdGlvbi4gVGhlIGJsb2NrIGF0IHdoaWNoIHRoZSB0YXBlIGlzIHBvc2l0aW9uZWQKCWlzIHRoZSBibG9jayB3aGVyZSB0aGUgdGFwZSB3YXMgcHJldmlvdXNseSBwb3NpdGlvbmVkIGluIHRoZQoJbmV3IGFjdGl2ZSBwYXJ0aXRpb24gdW5sZXNzIHRoZSBuZXh0IHRhcGUgb3BlcmF0aW9uIGlzCglNVFNFRUsuIEluIHRoaXMgY2FzZSB0aGUgdGFwZSBpcyBtb3ZlZCBkaXJlY3RseSB0byB0aGUgYmxvY2sKCXNwZWNpZmllZCBieSBNVFNFRUsuIE1UU0VUUEFSVCBpcyBpbmFjdGl2ZSB1bmxlc3MKCU1UX1NUX0NBTl9QQVJUSVRJT05TIHNldC4KTVRNS1BBUlQgRm9ybWF0cyB0aGUgdGFwZSB3aXRoIG9uZSBwYXJ0aXRpb24gKGFyZ3VtZW50IHplcm8pIG9yIHR3bwoJcGFydGl0aW9ucyAodGhlIGFyZ3VtZW50IGdpdmVzIGluIG1lZ2FieXRlcyB0aGUgc2l6ZSBvZgoJcGFydGl0aW9uIDEgdGhhdCBpcyBwaHlzaWNhbGx5IHRoZSBmaXJzdCBwYXJ0aXRpb24gb2YgdGhlCgl0YXBlKS4gVGhlIGRyaXZlIGhhcyB0byBzdXBwb3J0IHBhcnRpdGlvbnMgd2l0aCBzaXplIHNwZWNpZmllZAoJYnkgdGhlIGluaXRpYXRvci4gSW5hY3RpdmUgdW5sZXNzIE1UX1NUX0NBTl9QQVJUSVRJT05TIHNldC4KTVRTRVREUlZCVUZGRVIKCUlzIHVzZWQgZm9yIHNldmVyYWwgcHVycG9zZXMuIFRoZSBjb21tYW5kIGlzIG9idGFpbmVkIGZyb20gY291bnQKICAgICAgICB3aXRoIG1hc2sgTVRfU0VUX09QVElPTlMsIHRoZSBsb3cgb3JkZXIgYml0cyBhcmUgdXNlZCBhcyBhcmd1bWVudC4KCVRoaXMgY29tbWFuZCBpcyBvbmx5IGFsbG93ZWQgZm9yIHRoZSBzdXBlcnVzZXIgKHJvb3QpLiBUaGUKCXN1YmNvbW1hbmRzIGFyZToKCTAKICAgICAgICAgICBUaGUgZHJpdmUgYnVmZmVyIG9wdGlvbiBpcyBzZXQgdG8gdGhlIGFyZ3VtZW50LiBaZXJvIG1lYW5zCiAgICAgICAgICAgbm8gYnVmZmVyaW5nLgogICAgICAgIE1UX1NUX0JPT0xFQU5TCiAgICAgICAgICAgU2V0cyB0aGUgYnVmZmVyaW5nIG9wdGlvbnMuIFRoZSBiaXRzIGFyZSB0aGUgbmV3IHN0YXRlcwogICAgICAgICAgIChlbmFibGVkL2Rpc2FibGVkKSB0aGUgZm9sbG93aW5nIG9wdGlvbnMgKGluIHRoZQoJICAgcGFyZW50aGVzaXMgaXMgc3BlY2lmaWVkIHdoZXRoZXIgdGhlIG9wdGlvbiBpcyBnbG9iYWwgb3IKCSAgIGNhbiBiZSBzcGVjaWZpZWQgZGlmZmVyZW50bHkgZm9yIGVhY2ggbW9kZSk6CgkgICAgIE1UX1NUX0JVRkZFUl9XUklURVMgd3JpdGUgYnVmZmVyaW5nIChtb2RlKQoJICAgICBNVF9TVF9BU1lOQ19XUklURVMgYXN5bmNocm9ub3VzIHdyaXRlcyAobW9kZSkKICAgICAgICAgICAgIE1UX1NUX1JFQURfQUhFQUQgIHJlYWQgYWhlYWQgKG1vZGUpCiAgICAgICAgICAgICBNVF9TVF9UV09fRk0gd3JpdGluZyBvZiB0d28gZmlsZW1hcmtzIChnbG9iYWwpCgkgICAgIE1UX1NUX0ZBU1RfRU9NIHVzaW5nIHRoZSBTQ1NJIHNwYWNpbmcgdG8gRU9EIChnbG9iYWwpCgkgICAgIE1UX1NUX0FVVE9fTE9DSyBhdXRvbWF0aWMgbG9ja2luZyBvZiB0aGUgZHJpdmUgZG9vciAoZ2xvYmFsKQogICAgICAgICAgICAgTVRfU1RfREVGX1dSSVRFUyB0aGUgZGVmYXVsdHMgYXJlIG1lYW50IG9ubHkgZm9yIHdyaXRlcyAobW9kZSkKCSAgICAgTVRfU1RfQ0FOX0JTUiBiYWNrc3BhY2luZyBvdmVyIG1vcmUgdGhhbiBvbmUgcmVjb3JkcyBjYW4KCQliZSB1c2VkIGZvciByZXBvc2l0aW9uaW5nIHRoZSB0YXBlIChnbG9iYWwpCgkgICAgIE1UX1NUX05PX0JMS0xJTVMgdGhlIGRyaXZlciBkb2VzIG5vdCBhc2sgdGhlIGJsb2NrIGxpbWl0cwoJCWZyb20gdGhlIGRyaXZlIChibG9jayBzaXplIGNhbiBiZSBjaGFuZ2VkIG9ubHkgdG8KCQl2YXJpYWJsZSkgKGdsb2JhbCkKCSAgICAgTVRfU1RfQ0FOX1BBUlRJVElPTlMgZW5hYmxlcyBzdXBwb3J0IGZvciBwYXJ0aXRpb25lZAoJCXRhcGVzIChnbG9iYWwpCgkgICAgIE1UX1NUX1NDU0kyTE9HSUNBTCB0aGUgbG9naWNhbCBibG9jayBudW1iZXIgaXMgdXNlZCBpbgoJCXRoZSBNVFNFRUsgYW5kIE1USU9DUE9TIGZvciBTQ1NJLTIgZHJpdmVzIGluc3RlYWQgb2YKCQl0aGUgZGV2aWNlIGRlcGVuZGVudCBhZGRyZXNzLiBJdCBpcyByZWNvbW1lbmRlZCB0byBzZXQKCQl0aGlzIGZsYWcgdW5sZXNzIHRoZXJlIGFyZSB0YXBlcyB1c2luZyB0aGUgZGV2aWNlCgkJZGVwZW5kZW50IChmcm9tIHRoZSBvbGQgdGltZXMpIChnbG9iYWwpCgkgICAgIE1UX1NUX1NZU1Ygc2V0cyB0aGUgU1lTViBzZW1hbnRpY3MgKG1vZGUpCgkgICAgIE1UX1NUX05PV0FJVCBlbmFibGVzIGltbWVkaWF0ZSBtb2RlIChpLmUuLCBkb24ndCB3YWl0IGZvcgoJICAgICAgICB0aGUgY29tbWFuZCB0byBmaW5pc2gpIGZvciBzb21lIGNvbW1hbmRzIChlLmcuLCByZXdpbmQpCgkgICAgIE1UX1NUX0RFQlVHR0lORyBkZWJ1Z2dpbmcgKGdsb2JhbDsgZGVidWdnaW5nIG11c3QgYmUKCQljb21waWxlZCBpbnRvIHRoZSBkcml2ZXIpCglNVF9TVF9TRVRCT09MRUFOUwoJTVRfU1RfQ0xFQVJCT09MRUFOUwoJICAgU2V0cyBvciBjbGVhcnMgdGhlIG9wdGlvbiBiaXRzLgogICAgICAgIE1UX1NUX1dSSVRFX1RIUkVTSE9MRAogICAgICAgICAgIFNldHMgdGhlIHdyaXRlIHRocmVzaG9sZCBmb3IgdGhpcyBkZXZpY2UgdG8ga2lsb2J5dGVzCiAgICAgICAgICAgc3BlY2lmaWVkIGJ5IHRoZSBsb3dlc3QgYml0cy4KCU1UX1NUX0RFRl9CTEtTSVpFCgkgICBEZWZpbmVzIHRoZSBkZWZhdWx0IGJsb2NrIHNpemUgc2V0IGF1dG9tYXRpY2FsbHkuIFZhbHVlCgkgICAweGZmZmZmZiBtZWFucyB0aGF0IHRoZSBkZWZhdWx0IGlzIG5vdCB1c2VkIGFueSBtb3JlLgoJTVRfU1RfREVGX0RFTlNJVFkKCU1UX1NUX0RFRl9EUlZCVUZGRVIKCSAgIFVzZWQgdG8gc2V0IG9yIGNsZWFyIHRoZSBkZW5zaXR5ICg4IGJpdHMpLCBhbmQgZHJpdmUgYnVmZmVyCgkgICBzdGF0ZSAoMyBiaXRzKS4gSWYgdGhlIHZhbHVlIGlzIE1UX1NUX0NMRUFSX0RFRkFVTFQKCSAgICgweGZmZmZmKSB0aGUgZGVmYXVsdCB3aWxsIG5vdCBiZSB1c2VkIGFueSBtb3JlLiBPdGhlcndpc2UKCSAgIHRoZSBsb3dlcm1vc3QgYml0cyBvZiB0aGUgdmFsdWUgY29udGFpbiB0aGUgbmV3IHZhbHVlIG9mCgkgICB0aGUgcGFyYW1ldGVyLgoJTVRfU1RfREVGX0NPTVBSRVNTSU9OCgkgICBUaGUgY29tcHJlc3Npb24gZGVmYXVsdCB3aWxsIG5vdCBiZSB1c2VkIGlmIHRoZSB2YWx1ZSBvZgoJICAgdGhlIGxvd2VybW9zdCBieXRlIGlzIDB4ZmYuIE90aGVyd2lzZSB0aGUgbG93ZXJtb3N0IGJpdAoJICAgY29udGFpbnMgdGhlIG5ldyBkZWZhdWx0LiBJZiB0aGUgYml0cyA4LTE1IGFyZSBzZXQgdG8gYQoJICAgbm9uLXplcm8gbnVtYmVyLCBhbmQgdGhpcyBudW1iZXIgaXMgbm90IDB4ZmYsIHRoZSBudW1iZXIgaXMKCSAgIHVzZWQgYXMgdGhlIGNvbXByZXNzaW9uIGFsZ29yaXRobS4gVGhlIHZhbHVlCgkgICBNVF9TVF9DTEVBUl9ERUZBVUxUIGNhbiBiZSB1c2VkIHRvIGNsZWFyIHRoZSBjb21wcmVzc2lvbgoJICAgZGVmYXVsdC4KCU1UX1NUX1NFVF9USU1FT1VUCgkgICBTZXQgdGhlIG5vcm1hbCB0aW1lb3V0IGluIHNlY29uZHMgZm9yIHRoaXMgZGV2aWNlLiBUaGUKCSAgIGRlZmF1bHQgaXMgOTAwIHNlY29uZHMgKDE1IG1pbnV0ZXMpLiBUaGUgdGltZW91dCBzaG91bGQgYmUKCSAgIGxvbmcgZW5vdWdoIGZvciB0aGUgcmV0cmllcyBkb25lIGJ5IHRoZSBkZXZpY2Ugd2hpbGUKCSAgIHJlYWRpbmcvd3JpdGluZy4KCU1UX1NUX1NFVF9MT05HX1RJTUVPVVQKCSAgIFNldCB0aGUgbG9uZyB0aW1lb3V0IHRoYXQgaXMgdXNlZCBmb3Igb3BlcmF0aW9ucyB0aGF0IGFyZQoJICAga25vd24gdG8gdGFrZSBhIGxvbmcgdGltZS4gVGhlIGRlZmF1bHQgaXMgMTQwMDAgc2Vjb25kcwoJICAgKDMuOSBob3VycykuIEZvciBlcmFzZSB0aGlzIHZhbHVlIGlzIGZ1cnRoZXIgbXVsdGlwbGllZCBieQoJICAgZWlnaHQuCglNVF9TVF9TRVRfQ0xOCgkgICBTZXQgdGhlIGNsZWFuaW5nIHJlcXVlc3QgaW50ZXJwcmV0YXRpb24gcGFyYW1ldGVycyB1c2luZwoJICAgdGhlIGxvd2VzdCAyNCBiaXRzIG9mIHRoZSBhcmd1bWVudC4gVGhlIGRyaXZlciBjYW4gc2V0IHRoZQoJICAgZ2VuZXJpYyBzdGF0dXMgYml0IEdNVF9DTE4gaWYgYSBjbGVhbmluZyByZXF1ZXN0IGJpdCBwYXR0ZXJuCgkgICBpcyBmb3VuZCBmcm9tIHRoZSBleHRlbmRlZCBzZW5zZSBkYXRhLiBNYW55IGRyaXZlcyBzZXQgb25lIG9yCgkgICBtb3JlIGJpdHMgaW4gdGhlIGV4dGVuZGVkIHNlbnNlIGRhdGEgd2hlbiB0aGUgZHJpdmUgbmVlZHMKCSAgIGNsZWFuaW5nLiBUaGUgYml0cyBhcmUgZGV2aWNlLWRlcGVuZGVudC4gVGhlIGRyaXZlciBpcwoJICAgZ2l2ZW4gdGhlIG51bWJlciBvZiB0aGUgc2Vuc2UgZGF0YSBieXRlICh0aGUgbG93ZXN0IGVpZ2h0CgkgICBiaXRzIG9mIHRoZSBhcmd1bWVudDsgbXVzdCBiZSA+PSAxOCAodmFsdWVzIDEgLSAxNwoJICAgcmVzZXJ2ZWQpIGFuZCA8PSB0aGUgbWF4aW11bSByZXF1ZXN0ZWQgc2Vuc2UgZGF0YSBzaXhlKSwgCgkgICBhIG1hc2sgdG8gc2VsZWN0IHRoZSByZWxldmFudCBiaXRzICh0aGUgYml0cyA5LTE2KSwgYW5kIHRoZQoJICAgYml0IHBhdHRlcm4gKGJpdHMgMTctMjMpLiBJZiB0aGUgYml0IHBhdHRlcm4gaXMgemVybywgb25lCgkgICBvciBtb3JlIGJpdHMgdW5kZXIgdGhlIG1hc2sgaW5kaWNhdGUgY2xlYW5pbmcgcmVxdWVzdC4gSWYKCSAgIHRoZSBwYXR0ZXJuIGlzIG5vbi16ZXJvLCB0aGUgcGF0dGVybiBtdXN0IG1hdGNoIHRoZSBtYXNrZWQKCSAgIHNlbnNlIGRhdGEgYnl0ZS4KCgkgICAoVGhlIGNsZWFuaW5nIGJpdCBpcyBzZXQgaWYgdGhlIGFkZGl0aW9uYWwgc2Vuc2UgY29kZSBhbmQKCSAgIHF1YWxpZmllciAwMGggMTdoIGFyZSBzZWVuIHJlZ2FyZGxlc3Mgb2YgdGhlIHNldHRpbmcgb2YKCSAgIE1UX1NUX1NFVF9DTE4uKQoKVGhlIGZvbGxvd2luZyBpb2N0bCB1c2VzIHRoZSBzdHJ1Y3R1cmUgbXRwb3M6Ck1USU9DUE9TIFJlYWRzIHRoZSBjdXJyZW50IHBvc2l0aW9uIGZyb20gdGhlIGRyaXZlLiBVc2VzCiAgICAgICAgVGFuZGJlcmctY29tcGF0aWJsZSBRRkEgZm9yIFNDU0ktMSBkcml2ZXMgYW5kIHRoZSBTQ1NJLTIKICAgICAgICBjb21tYW5kIGZvciB0aGUgU0NTSS0yIGRyaXZlcy4KClRoZSBmb2xsb3dpbmcgaW9jdGwgdXNlcyB0aGUgc3RydWN0dXJlIG10Z2V0IHRvIHJldHVybiB0aGUgc3RhdHVzOgpNVElPQ0dFVCBSZXR1cm5zIHNvbWUgc3RhdHVzIGluZm9ybWF0aW9uLgogICAgICAgIFRoZSBmaWxlIG51bWJlciBhbmQgYmxvY2sgbnVtYmVyIHdpdGhpbiBmaWxlIGFyZSByZXR1cm5lZC4gVGhlCiAgICAgICAgYmxvY2sgaXMgLTEgd2hlbiBpdCBjYW4ndCBiZSBkZXRlcm1pbmVkIChlLmcuLCBhZnRlciBNVEJTRikuCiAgICAgICAgVGhlIGRyaXZlIHR5cGUgaXMgZWl0aGVyIE1USVNTQ1NJMSBvciBNVElTU0NTSTIuCiAgICAgICAgVGhlIG51bWJlciBvZiByZWNvdmVyZWQgZXJyb3JzIHNpbmNlIHRoZSBwcmV2aW91cyBzdGF0dXMgY2FsbAogICAgICAgIGlzIHN0b3JlZCBpbiB0aGUgbG93ZXIgd29yZCBvZiB0aGUgZmllbGQgbXRfZXJyZWcuCiAgICAgICAgVGhlIGN1cnJlbnQgYmxvY2sgc2l6ZSBhbmQgdGhlIGRlbnNpdHkgY29kZSBhcmUgc3RvcmVkIGluIHRoZSBmaWVsZAogICAgICAgIG10X2RzcmVnIChzaGlmdHMgZm9yIHRoZSBzdWJmaWVsZHMgYXJlIE1UX1NUX0JMS1NJWkVfU0hJRlQgYW5kCiAgICAgICAgTVRfU1RfREVOU0lUWV9TSElGVCkuCglUaGUgR01UX3h4eCBzdGF0dXMgYml0cyByZWZsZWN0IHRoZSBkcml2ZSBzdGF0dXMuIEdNVF9EUl9PUEVOCglpcyBzZXQgaWYgdGhlcmUgaXMgbm8gdGFwZSBpbiB0aGUgZHJpdmUuIEdNVF9FT0QgbWVhbnMgZWl0aGVyCgllbmQgb2YgcmVjb3JkZWQgZGF0YSBvciBlbmQgb2YgdGFwZS4gR01UX0VPVCBtZWFucyBlbmQgb2YgdGFwZS4KCgpNSVNDRUxMQU5FT1VTIENPTVBJTEUgT1BUSU9OUwoKVGhlIHJlY292ZXJlZCB3cml0ZSBlcnJvcnMgYXJlIGNvbnNpZGVyZWQgZmF0YWwgaWYgU1RfUkVDT1ZFUkVEX1dSSVRFX0ZBVEFMCmlzIGRlZmluZWQuCgpUaGUgbWF4aW11bSBudW1iZXIgb2YgdGFwZSBkZXZpY2VzIGlzIGRldGVybWluZWQgYnkgdGhlIGRlZmluZQpTVF9NQVhfVEFQRVMuIElmIG1vcmUgdGFwZXMgYXJlIGRldGVjdGVkIGF0IGRyaXZlciBpbml0aWFsaXphdGlvbiwgdGhlCm1heGltdW0gaXMgYWRqdXN0ZWQgYWNjb3JkaW5nbHkuCgpJbW1lZGlhdGUgcmV0dXJuIGZyb20gdGFwZSBwb3NpdGlvbmluZyBTQ1NJIGNvbW1hbmRzIGNhbiBiZSBlbmFibGVkIGJ5CmRlZmluaW5nIFNUX05PV0FJVC4gSWYgdGhpcyBpcyBkZWZpbmVkLCB0aGUgdXNlciBzaG91bGQgdGFrZSBjYXJlIHRoYXQKdGhlIG5leHQgdGFwZSBvcGVyYXRpb24gaXMgbm90IHN0YXJ0ZWQgYmVmb3JlIHRoZSBwcmV2aW91cyBvbmUgaGFzCmZpbmlzaGVkLiBUaGUgZHJpdmVzIGFuZCBTQ1NJIGFkYXB0ZXJzIHNob3VsZCBoYW5kbGUgdGhpcyBjb25kaXRpb24KZ3JhY2VmdWxseSwgYnV0IHNvbWUgZHJpdmUvYWRhcHRlciBjb21iaW5hdGlvbnMgYXJlIGtub3duIHRvIGhhbmcgdGhlClNDU0kgYnVzIGluIHRoaXMgY2FzZS4KClRoZSBNVEVPTSBjb21tYW5kIGlzIGJ5IGRlZmF1bHQgaW1wbGVtZW50ZWQgYXMgc3BhY2luZyBvdmVyIDMyNzY3CmZpbGVtYXJrcy4gV2l0aCB0aGlzIG1ldGhvZCB0aGUgZmlsZSBudW1iZXIgaW4gdGhlIHN0YXR1cyBpcwpjb3JyZWN0LiBUaGUgdXNlciBjYW4gcmVxdWVzdCB1c2luZyBkaXJlY3Qgc3BhY2luZyB0byBFT0QgYnkgc2V0dGluZwpTVF9GQVNUX0VPTSAxIChvciB1c2luZyB0aGUgTVRfU1RfT1BUSU9OUyBpb2N0bCkuIEluIHRoaXMgY2FzZSB0aGUgZmlsZQpudW1iZXIgd2lsbCBiZSBpbnZhbGlkLgoKV2hlbiB1c2luZyByZWFkIGFoZWFkIG9yIGJ1ZmZlcmVkIHdyaXRlcyB0aGUgcG9zaXRpb24gd2l0aGluIHRoZSBmaWxlCm1heSBub3QgYmUgY29ycmVjdCBhZnRlciB0aGUgZmlsZSBpcyBjbG9zZWQgKGNvcnJlY3QgcG9zaXRpb24gbWF5CnJlcXVpcmUgYmFja3NwYWNpbmcgb3ZlciBtb3JlIHRoYW4gb25lIHJlY29yZCkuIFRoZSBjb3JyZWN0IHBvc2l0aW9uCndpdGhpbiBmaWxlIGNhbiBiZSBvYnRhaW5lZCBpZiBTVF9JTl9GSUxFX1BPUyBpcyBkZWZpbmVkIGF0IGNvbXBpbGUKdGltZSBvciB0aGUgTVRfU1RfQ0FOX0JTUiBiaXQgaXMgc2V0IGZvciB0aGUgZHJpdmUgd2l0aCBhbiBpb2N0bC4KKFRoZSBkcml2ZXIgYWx3YXlzIGJhY2tzIG92ZXIgYSBmaWxlbWFyayBjcm9zc2VkIGJ5IHJlYWQgYWhlYWQgaWYgdGhlCnVzZXIgZG9lcyBub3QgcmVxdWVzdCBkYXRhIHRoYXQgZmFyLikKCgpERUJVR0dJTkcgSElOVFMKClRvIGVuYWJsZSBkZWJ1Z2dpbmcgbWVzc2FnZXMsIGVkaXQgc3QuYyBhbmQgI2RlZmluZSBERUJVRyAxLiBBcyBzZWVuCmFib3ZlLCBkZWJ1Z2dpbmcgY2FuIGJlIHN3aXRjaGVkIG9mZiB3aXRoIGFuIGlvY3RsIGlmIGRlYnVnZ2luZyBpcwpjb21waWxlZCBpbnRvIHRoZSBkcml2ZXIuIFRoZSBkZWJ1Z2dpbmcgb3V0cHV0IGlzIG5vdCB2b2x1bWlub3VzLgoKSWYgdGhlIHRhcGUgc2VlbXMgdG8gaGFuZywgSSB3b3VsZCBiZSB2ZXJ5IGludGVyZXN0ZWQgdG8gaGVhciB3aGVyZQp0aGUgZHJpdmVyIGlzIHdhaXRpbmcuIFdpdGggdGhlIGNvbW1hbmQgJ3BzIC1sJyB5b3UgY2FuIHNlZSB0aGUgc3RhdGUKb2YgdGhlIHByb2Nlc3MgdXNpbmcgdGhlIHRhcGUuIElmIHRoZSBzdGF0ZSBpcyBELCB0aGUgcHJvY2VzcyBpcwp3YWl0aW5nIGZvciBzb21ldGhpbmcuIFRoZSBmaWVsZCBXQ0hBTiB0ZWxscyB3aGVyZSB0aGUgZHJpdmVyIGlzCndhaXRpbmcuIElmIHlvdSBoYXZlIHRoZSBjdXJyZW50IFN5c3RlbS5tYXAgaW4gdGhlIGNvcnJlY3QgcGxhY2UgKGluCi9ib290IGZvciB0aGUgcHJvY3BzIEkgdXNlKSBvciBoYXZlIHVwZGF0ZWQgL2V0Yy9wc2RhdGFiYXNlIChmb3Iga21lbQpwcyksIHBzIHdyaXRlcyB0aGUgZnVuY3Rpb24gbmFtZSBpbiB0aGUgV0NIQU4gZmllbGQuIElmIG5vdCwgeW91IGhhdmUKdG8gbG9vayB1cCB0aGUgZnVuY3Rpb24gZnJvbSBTeXN0ZW0ubWFwLgoKTm90ZSBhbHNvIHRoYXQgdGhlIHRpbWVvdXRzIGFyZSB2ZXJ5IGxvbmcgY29tcGFyZWQgdG8gbW9zdCBvdGhlcgpkcml2ZXJzLiBUaGlzIG1lYW5zIHRoYXQgdGhlIExpbnV4IGRyaXZlciBtYXkgYXBwZWFyIGh1bmcgYWx0aG91Z2ggdGhlCnJlYWwgcmVhc29uIGlzIHRoYXQgdGhlIHRhcGUgZmlybXdhcmUgaGFzIGdvdCBjb25mdXNlZC4K