PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCQkJUkVBRE1FIGZvciBVU0I4Mzg4CgogKGMpIENvcHlyaWdodCCpIDIwMDMtMjAwNiwgTWFydmVsbCBJbnRlcm5hdGlvbmFsIEx0ZC4KIEFsbCBSaWdodHMgUmVzZXJ2ZWQKCiBUaGlzIHNvZnR3YXJlIGZpbGUgKHRoZSAiRmlsZSIpIGlzIGRpc3RyaWJ1dGVkIGJ5IE1hcnZlbGwgSW50ZXJuYXRpb25hbAogTHRkLiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiwgSnVuZSAxOTkxCiAodGhlICJMaWNlbnNlIikuICBZb3UgbWF5IHVzZSwgcmVkaXN0cmlidXRlIGFuZC9vciBtb2RpZnkgdGhpcyBGaWxlIGluCiBhY2NvcmRhbmNlIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBMaWNlbnNlLCBhIGNvcHkgb2Ygd2hpY2gKIGlzIGF2YWlsYWJsZSBhbG9uZyB3aXRoIHRoZSBGaWxlIGluIHRoZSBsaWNlbnNlLnR4dCBmaWxlIG9yIGJ5IHdyaXRpbmcgdG8KIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCiAwMjExMS0xMzA3IG9yIG9uIHRoZSB3b3JsZHdpZGUgd2ViIGF0IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgoKIFRIRSBGSUxFIElTIERJU1RSSUJVVEVEIEFTLUlTLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBBTkQgVEhFCiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCiBBUkUgRVhQUkVTU0xZIERJU0NMQUlNRUQuICBUaGUgTGljZW5zZSBwcm92aWRlcyBhZGRpdGlvbmFsIGRldGFpbHMgYWJvdXQKIHRoaXMgd2FycmFudHkgZGlzY2xhaW1lci4KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCj09PT09PT09PT09PT09PT09PT09PQpEUklWRVIgTE9BRElORwo9PT09PT09PT09PT09PT09PT09PT0KCglvLiBDb3B5IHRoZSBmaXJtd2FyZSBpbWFnZSAoZS5nLiB1c2I4Mzg4LmJpbikgdG8gL2xpYi9maXJtd2FyZS8KCglvLiBMb2FkIGRyaXZlciBieSB1c2luZyB0aGUgZm9sbG93aW5nIGNvbW1hbmQ6CgoJCWluc21vZCB1c2I4Mzg4LmtvIFtmd19uYW1lPXVzYjgzODguYmluXQoKPT09PT09PT09PT09PT09PT09PT09CklXUFJJViBDT01NQU5ECj09PT09PT09PT09PT09PT09PT09PQoKTkFNRQoJVGhpcyBtYW51YWwgZGVzY3JpYmVzIHRoZSB1c2FnZSBvZiBwcml2YXRlIGNvbW1hbmRzIHVzZWQgaW4gTWFydmVsbCBXTEFOCglMaW51eCBEcml2ZXIuIEFsbCB0aGUgY29tbWFuZHMgYXZhaWxhYmxlIGluIFdsYW5jb25maWcgd2lsbCBub3QgYmUgYXZhaWxhYmxlCglpbiB0aGUgaXdwcml2LgoKU1lOT1BTSVMKCWl3cHJpdiA8ZXRoWD4gPGNvbW1hbmQ+IFtzdWItY29tbWFuZF0gLi4uCgoJaXdwcml2IGV0aFggc2V0cmVnaW9uY29kZSA8bj4KCWl3cHJpdiBldGhYIGdldHJlZ2lvbmNvZGUKClZlcnNpb24gNSBDb21tYW5kOgoJaXdwcml2IGV0aFggbGVkZ3BpbyA8bj4KCkJUIENvbW1hbmRzOgoJVGhlIGJsaW5kaW5nIHRhYmxlIChCVCkgY29udGFpbnMgYSBsaXN0IG9mIG1hYyBhZGRyZXNzZXMgdGhhdCBzaG91bGQgYmUKCWlnbm9yZWQgYnkgdGhlIGZpcm13YXJlLiAgSXQgaXMgcHJpbWFyaWx5IHVzZWQgZm9yIGRlYnVnZ2luZyBhbmQKCXRlc3RpbmcgbmV0d29ya3MuICBJdCBjYW4gYmUgZWRpdGVkIGFuZCBpbnNwZWN0ZWQgd2l0aCB0aGUgZm9sbG93aW5nCgljb21tYW5kczoKCglpd3ByaXYgZXRoWCBidF9yZXNldAoJaXdwcml2IGV0aFggYnRfYWRkIDxtYWNfYWRkcmVzcz4KCWl3cHJpdiBldGhYIGJ0X2RlbCA8bWFjX2FkZHJlc3M+Cglpd3ByaXYgZXRoWCBidF9saXN0IDxpZD4KCkZXVCBDb21tYW5kczoKCVRoZSBmb3J3YXJkaW5nIHRhYmxlIChGV1QpIGlzIGEgZmVhdHVyZSB1c2VkIHRvIG1hbmFnZSBtZXNoIG5ldHdvcmsKCXJvdXRpbmcgaW4gdGhlIGZpcm13YXJlLiAgVGhlIEZXVCBpcyBlc3NlbnRpYWxseSBhIHJvdXRpbmcgdGFibGUgdGhhdAoJYXNzb2NpYXRlcyBhIGRlc3RpbmF0aW9uIG1hYyBhZGRyZXNzIChkYSkgd2l0aCBhIG5leHQgaG9wIHJlY2VpdmVyCglhZGRyZXNzIChyYSkuICBUaGUgRldUIGNhbiBiZSBpbnNwZWN0ZWQgYW5kIGVkaXRlZCB3aXRoIHRoZSBmb2xsb3dpbmcKCWl3cHJpdiBjb21tYW5kcywgd2hpY2ggYXJlIGRlc2NyaWJlZCBpbiBncmVhdGVyIGRldGFpbCBiZWxvdy4KCUV2ZW50dWFsbHksIHRoZSB0YWJsZSB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgbWFpbnRhaW5lZCBieSBhIGN1c3RvbQoJcm91dGluZyBwcm90b2NvbC4KCglOT1RFOiBGV1QgY29tbWFuZHMgcmVwbGFjZSB0aGUgcHJldmlvdXMgREZUIGNvbW1hbmRzLiAgV2hhdCB3ZXJlIHRoZSBERlQKCWNvbW1hbmRzPywgeW91IG1pZ2h0IGFzay4gIFRoZXkgd2VyZSBhbiBlYXJsaWVyIEFQSSB0byB0aGUgZmlybXdhcmUgdGhhdAoJaW1wbGVtZW50ZWQgYSBzaW1wbGUgTUFDLWxheWVyIGZvcndhcmRpbmcgbWVjaGFuaXNtLiAgSW4gdGhlIHVubGlrZWx5CglldmVudCB0aGF0IHlvdSB3ZXJlIHVzaW5nIHRoZXNlIGNvbW1hbmRzLCB5b3UgbXVzdCBtaWdyYXRlIHRvIHRoZSBuZXcKCUZXVCBjb21tYW5kcyB3aGljaCBjYW4gYmUgdXNlZCB0byBhY2hpZXZlIHRoZSBzYW1lIGZ1bmN0aW9uYWxpdHkuCgoJaXdwcml2IGV0aFggZnd0X2FkZCBbcGFyYW1ldGVyc10KCWl3cHJpdiBldGhYIGZ3dF9kZWwgW3BhcmFtZXRlcnNdCglpd3ByaXYgZXRoWCBmd3RfbG9va3VwIFtwYXJhbWV0ZXJzXQoJaXdwcml2IGV0aFggZnd0X2xpc3QgW3BhcmFtZXRlcnNdCglpd3ByaXYgZXRoWCBmd3RfbGlzdF9yb3V0ZSBbcGFyYW1ldGVyc10KCWl3cHJpdiBldGhYIGZ3dF9saXN0X25laWdoIFtwYXJhbWV0ZXJzXQoJaXdwcml2IGV0aFggZnd0X3Jlc2V0IFtwYXJhbWV0ZXJzXQoJaXdwcml2IGV0aFggZnd0X2NsZWFudXAKCWl3cHJpdiBldGhYIGZ3dF90aW1lCgpNRVNIIENvbW1hbmRzOgoKCVRoZSBNRVNIIGNvbW1hbmRzIGFyZSB1c2VkIHRvIGNvbmZpZ3VyZSB2YXJpb3VzIGZlYXR1cmVzIG9mIHRoZSBtZXNoCglyb3V0aW5nIHByb3RvY29sLiAgVGhlIGZvbGxvd2luZyBjb21tYW5kcyBhcmUgc3VwcG9ydGVkOgoKCWl3cHJpdiBldGhYIG1lc2hfZ2V0X3R0bAoJaXdwcml2IGV0aFggbWVzaF9zZXRfdHRsIHR0bAoKREVTQ1JJUFRJT04KCVRob3NlIGNvbW1hbmRzIGFyZSB1c2VkIHRvIHNlbmQgYWRkaXRpb25hbCBjb21tYW5kcyB0byB0aGUgTWFydmVsbCBXTEFOCgljYXJkIHZpYSB0aGUgTGludXggZGV2aWNlIGRyaXZlci4KCglUaGUgZXRoWCBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSBuZXR3b3JrIGRldmljZSB0aGF0IGlzIHRvIGJlIHVzZWQgdG8KCQlwZXJmb3JtIHRoaXMgY29tbWFuZCBvbi4gaXQgY291bGQgYmUgZXRoMCwgZXRoMSBldGMuCgpzZXRyZWdpb25jb2RlCglUaGlzIGNvbW1hbmQgaXMgdXNlZCB0byBzZXQgdGhlIHJlZ2lvbiBjb2RlIGluIHRoZSBzdGF0aW9uLgoJd2hlcmUgdmFsdWUgaXMgJ3JlZ2lvbiBjb2RlJyBmb3IgdmFyaW91cyByZWdpb25zIGxpa2UKCVVTQSBGQ0MsIENhbmFkYSBJQywgU3BhaW4sIEZyYW5jZSwgRXVyb3BlIEVUU0ksCUphcGFuIC4uLgoKCVVzYWdlOgoJCWl3cHJpdiBldGhYIHNldHJlZ2lvbmNvZGUgMHgxMDogc2V0IHJlZ2lvbiBjb2RlIHRvIFVTQSAoMHgxMCkuCgpnZXRyZWdpb25jb2RlCglUaGlzIGNvbW1hbmQgaXMgdXNlZCB0byBnZXQgdGhlIHJlZ2lvbiBjb2RlIGluZm9ybWF0aW9uIHNldCBpbiB0aGUKCXN0YXRpb24uCgpsZWRncGlvCglUaGlzIGNvbW1hbmQgaXMgdXNlZCB0byBzZXQvZ2V0IExFRHMuCgoJaXdwcml2IGV0aFggbGVkZ3BpbyA8TEVEcz4KCQl3aWxsIHNldCB0aGUgY29ycmVzcG9uZGluZyBMRUQgZm9yIHRoZSBHUElPIExpbmUuCgoJaXdwcml2IGV0aFggbGVkZ3BpbwoJCXdpbGwgZ2l2ZSB1IHdoaWNoIExFRHMgYXJlIEVuYWJsZWQuCgoJVXNhZ2U6CgkJaXdwcml2IGV0aDEgbGVkZ3BpbyAxIDAgMiAxIDMgNAoJCQl3aWxsIGVuYWJsZQoJCQlMRUQgMSAtPiBHUElPIDAKCQkJTEVEIDIgLT4gR1BJTyAxCgkJCUxFRCAzIC0+IEdQSU8gNAoKCQlpd3ByaXYgZXRoMSBsZWRncGlvCgkJCXNob3dzIExFRCBpbmZvcm1hdGlvbiBpbiB0aGUgZm9ybWF0IGFzIG1lbnRpb25lZCBhYm92ZS4KCglOb3RlOiBMRUQwIGlzIGludmFsaWQKCU5vdGU6IE1heGltdW0gTnVtYmVyIG9mIExFRHMgYXJlIDE2LgoKZnd0X2FkZAoJVGhpcyBjb21tYW5kIGlzIHVzZWQgdG8gaW5zZXJ0IGFuIGVudHJ5IGludG8gdGhlIEZXVCB0YWJsZS4gVGhlIGxpc3Qgb2YKCXBhcmFtZXRlcnMgbXVzdCBmb2xsb3cgdGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmU6CgoJaXdwcml2IGV0aFggZnd0X2FkZCBkYSByYSBbbWV0cmljIGRpciBzc24gZHNuIGhvcGNvdW50IHR0bCBleHBpcmF0aW9uIHNsZWVwbW9kZSBzbnJdCgoJVGhlIHBhcmFtZXRlcnMgYmV0d2VlbiBicmFja2V0cyBhcmUgb3B0aW9uYWwsIGJ1dCB0aGV5IG11c3QgYXBwZWFyIGluCgl0aGUgb3JkZXIgc3BlY2lmaWVkLiAgRm9yIGV4YW1wbGUsIGlmIHlvdSB3YW50IHRvIHNwZWNpZnkgdGhlIG1ldHJpYywKCXlvdSBtdXN0IGFsc28gc3BlY2lmeSB0aGUgZGlyLCBzc24sIGFuZCBkc24gYnV0IHlvdSBuZWVkIG5vdCBzcGVjaWZ5IHRoZQoJaG9wY291bnQsIGV4cGlyYXRpb24sIHNsZWVwbW9kZSwgb3Igc25yLiAgQW55IHVuc3BlY2lmaWVkIHBhcmFtZXRlcnMKCXdpbGwgYmUgYXNzaWduZWQgdGhlIGRlZmF1bHRzIHNwZWNpZmllZCBiZWxvdy4KCglUaGUgZGlmZmVyZW50IHBhcmFtZXRlcnMgYXJlOi0KCQlkYQkJLS0gREEgTUFDIGFkZHJlc3MgaW4gdGhlIGZvcm0gMDA6MTE6MjI6MzM6NDQ6NTUKCQlyYQkJLS0gUkEgTUFDIGFkZHJlc3MgaW4gdGhlIGZvcm0gMDA6MTE6MjI6MzM6NDQ6NTUKCQltZXRyaWMJCS0tIHJvdXRlIG1ldHJpYyAoY29zdDogc21hbGxlci1tZXRyaWMgcm91dGVzIGFyZQoJCQkJICAgcHJlZmVycmVkLCBkZWZhdWx0IGlzIDApCgkJZGlyCQktLSBkaXJlY3Rpb24gKDEgZm9yIGRpcmVjdCwgMCBmb3IgcmV2ZXJzZSwKCQkJCSAgIGRlZmF1bHQgaXMgMSkKCQlzc24JCS0tIFNvdXJjZSBTZXF1ZW5jZSBOdW1iZXIgKHRpbWUgYXQgdGhlIFJBIGZvcgoJCQkJICAgcmV2ZXJzZSByb3V0ZXMuICBEZWZhdWx0IGlzIDApCgkJZHNuCQktLSBEZXN0aW5hdGlvbiBTZXF1ZW5jZSBOdW1iZXIgKHRpbWUgYXQgdGhlIERBCgkJCQkgICBmb3IgZGlyZWN0IHJvdXRlcy4gIERlZmF1bHQgaXMgMCkKCQlob3Bjb3VudAktLSBob3AgY291bnQgKGN1cnJlbnRseSB1bnVzZWQsIGRlZmF1bHQgaXMgMCkKCQl0dGwJCS0tIFRUTCAoT25seSB1c2VkIGluIHJldmVyc2UgZW50cmllcykKCQlleHBpcmF0aW9uCS0tIGVudHJ5IGV4cGlyYXRpb24gKGluIHRpY2tzLCB3aGVyZSBhIHRpY2sgaXMKCQkJCSAgIDEwMjR1cywgb3IgfiAxbXMuIFVzZSAwIGZvciBhbiBpbmRlZmluaXRlCgkJCQkgICBlbnRyeSwgZGVmYXVsdCBpcyAwKQoJCXNsZWVwbW9kZQktLSBSQSdzIHNsZWVwIG1vZGUgKGN1cnJlbnRseSB1bnVzZWQsIGRlZmF1bHQgaXMKCQkJCSAgIDApCgkJc25yCQktLSBTTlIgaW4gdGhlIGxpbmsgdG8gUkEgKGN1cnJlbnRseSB1bnVzZWQsCgkJCQkgICBkZWZhdWx0IGlzIDApCgoJVGhlIGNvbW1hbmQgZG9lcyBub3QgcmV0dXJuIGFueXRoaW5nLgoKZnd0X2RlbAoJVGhpcyBjb21tYW5kIGlzIHVzZWQgdG8gcmVtb3ZlIGFuIGVudHJ5IHRvIHRoZSBGV1QgdGFibGUuIFRoZSBsaXN0IG9mCglwYXJhbWV0ZXJzIG11c3QgZm9sbG93IHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlOgoKCQlpd3ByaXYgZXRoWCBmd3RfZGVsIGRhIHJhIFtkaXJdCgoJd2hlcmUgdGhlIGRpZmZlcmVudCBwYXJhbWV0ZXJzIGFyZTotCgkJZGEJCS0tIERBIE1BQyBhZGRyZXNzIChpbiB0aGUgZm9ybSAiMDA6MTE6MjI6MzM6NDQ6NTUiKQoJCXJhCQktLSBSQSBNQUMgYWRkcmVzcyAoaW4gdGhlIGZvcm0gIjAwOjExOjIyOjMzOjQ0OjU1IikKCQlkaXIJCS0tIGRpcmVjdGlvbiAoMSBmb3IgZGlyZWN0LCAwIGZvciByZXZlcnNlLAoJCQkJICAgZGVmYXVsdCBpcyAxKQoKCVRoZSBjb21tYW5kIGRvZXMgbm90IHJldHVybiBhbnl0aGluZy4KCmZ3dF9sb29rdXAKCVRoaXMgY29tbWFuZCBpcyB1c2VkIHRvIGdldCB0aGUgYmVzdCByb3V0ZSBpbiB0aGUgRldUIHRhYmxlIHRvIGEgZ2l2ZW4KCWhvc3QuIFRoZSBvbmx5IHBhcmFtZXRlciBpcyB0aGUgTUFDIGFkZHJlc3Mgb2YgdGhlIGhvc3QgdGhhdCBpcyBiZWluZwoJbG9va2VkIGZvci4KCgkJaXdwcml2IGV0aFggZnd0X2xvb2t1cCBkYQoKCXdoZXJlOi0KCQlkYQkJLS0gREEgTUFDIGFkZHJlc3MgKGluIHRoZSBmb3JtICIwMDoxMToyMjozMzo0NDo1NSIpCgoJVGhlIGNvbW1hbmQgcmV0dXJucyBhbiBvdXRwdXQgc3RyaW5nIGlkZW50aWNhbCB0byB0aGUgb25lIHJldHVybmVkIGJ5Cglmd3RfbGlzdCBkZXNjcmliZWQgYmVsb3cuCgoKZnd0X2xpc3QKCVRoaXMgY29tbWFuZCBpcyB1c2VkIHRvIGxpc3QgYSByb3V0ZSBmcm9tIHRoZSBGV1QgdGFibGUuIFRoZSBvbmx5CglwYXJhbWV0ZXIgaXMgdGhlIGluZGV4IGludG8gdGhlIHRhYmxlLiBJZiB5b3Ugd2FudCB0byBsaXN0IGFsbCB0aGUKCXJvdXRlcyBpbiBhIHRhYmxlLCBzdGFydCB3aXRoIGluZGV4PTAsIGFuZCBrZWVwIGxpc3RpbmcgdW50aWwgeW91IGdldCBhCgkiKG51bGwpIiBzdHJpbmcuICBOb3RlIHRoYXQgdGhlIGluZGljaWVzIG1heSBjaGFuZ2UgYXMgdGhlIGZ3dCBpcwoJdXBkYXRlZC4gIEl0IGlzIGV4cGVjdGVkIHRoYXQgbW9zdCB1c2VycyB3aWxsIG5vdCB1c2UgZnd0X2xpc3QgZGlyZWN0bHksCglidXQgdGhhdCBhIHV0aWxpdHkgc2ltaWxhciB0byB0aGUgdHJhZGl0aW9uYWwgcm91dGUgY29tbWFuZCB3aWxsIGJlIHVzZWQKCXRvIGludm9rZSBmd3RfbGlzdCBvdmVyIGFuZCBvdmVyLgoKCQlpd3ByaXYgZXRoWCBmd3RfbGlzdCBpbmRleAoKCVRoZSBvdXRwdXQgaXMgYSBzdHJpbmcgb2YgdGhlIGZvbGxvd2luZyBmb3JtOgoKCQlkYSByYSBtZXRyaWMgZGlyIHNzbiBkc24gaG9wY291bnQgdHRsIGV4cGlyYXRpb24gc2xlZXBtb2RlIHNucgoKCXdoZXJlIHRoZSBkaWZmZXJlbnQgZmllbGRzIGFyZTotCgkJZGEJCS0tIERBIE1BQyBhZGRyZXNzIChpbiB0aGUgZm9ybSAiMDA6MTE6MjI6MzM6NDQ6NTUiKQoJCXJhCQktLSBSQSBNQUMgYWRkcmVzcyAoaW4gdGhlIGZvcm0gIjAwOjExOjIyOjMzOjQ0OjU1IikKCQltZXRyaWMJCS0tIHJvdXRlIG1ldHJpYyAoY29zdDogc21hbGxlci1tZXRyaWMgcm91dGVzIGFyZSBwcmVmZXJyZWQpCgkJZGlyCQktLSBkaXJlY3Rpb24gKDEgZm9yIGRpcmVjdCwgMCBmb3IgcmV2ZXJzZSkKCQlzc24JCS0tIFNvdXJjZSBTZXF1ZW5jZSBOdW1iZXIgKHRpbWUgYXQgdGhlIFJBIGZvciByZXZlcnNlIHJvdXRlcykKCQlkc24JCS0tIERlc3RpbmF0aW9uIFNlcXVlbmNlIE51bWJlciAodGltZSBhdCB0aGUgREEgZm9yIGRpcmVjdCByb3V0ZXMpCgkJaG9wY291bnQJLS0gaG9wIGNvdW50IChjdXJyZW50bHkgdW51c2VkKQoJCXR0bAkJLS0gVFRMIChvbmx5IHVzZWQgaW4gcmV2ZXJzZSBlbnRyaWVzKQoJCWV4cGlyYXRpb24JLS0gZW50cnkgZXhwaXJhdGlvbiAoaW4gdGlja3MsIHdoZXJlIGEgdGljayBpcyAxMDI0dXMsIG9yIH4gMW1zLiBVc2UgMCBmb3IgYW4gaW5kZWZpbml0ZSBlbnRyeSkKCQlzbGVlcG1vZGUJLS0gUkEncyBzbGVlcCBtb2RlIChjdXJyZW50bHkgdW51c2VkKQoJCXNucgkJLS0gU05SIGluIHRoZSBsaW5rIHRvIFJBIChjdXJyZW50bHkgdW51c2VkKQoKZnd0X2xpc3Rfcm91dGUKCVRoaXMgY29tbWFuZCBpcyB1c2VkIHRvIGxpc3QgYSByb3V0ZSBmcm9tIHRoZSBGV1QgdGFibGUuIFRoZSBvbmx5CglwYXJhbWV0ZXIgaXMgdGhlIHJvdXRlIElELiBJZiB5b3Ugd2FudCB0byBsaXN0IGFsbCB0aGUgcm91dGVzIGluIGEKCXRhYmxlLCBzdGFydCB3aXRoIHJpZD0wLCBhbmQga2VlcCBpbmNyZW1lbnRpbmcgcmlkIHVudGlsIHlvdSBnZXQgYQoJIihudWxsKSIgc3RyaW5nLiBUaGlzIGZ1bmN0aW9uIGlzIHNpbWlsYXIgdG8gZnd0X2xpc3QuIFRoZSBvbmx5CglkaWZmZXJlbmNlIGlzIHRoZSBvdXRwdXQgZm9ybWF0LiAgQWxzbyBub3RlIHRoYXQgdGhpcyBjb21tYW5kIGlzIG1lYW50Cglmb3IgZGVidWdnaW5nLiAgSXQgaXMgZXhwZWN0ZWQgdGhhdCB1c2VycyB3aWxsIHVzZSBmd3RfbG9va3VwIGFuZAoJZnd0X2xpc3QuICBPbmUgaW1wb3J0YW50IHJlYXNvbiBmb3IgdGhpcyBpcyB0aGF0IHRoZSByb3V0ZSBpZCBtYXkgY2hhbmdlCglhcyB0aGUgcm91dGUgdGFibGUgaXMgYWx0ZXJlZC4KCgkJaXdwcml2IGV0aFggZnd0X2xpc3Rfcm91dGUgcmlkCgoJVGhlIG91dHB1dCBpcyBhIHN0cmluZyBvZiB0aGUgZm9sbG93aW5nIGZvcm06CgoJCWRhIG1ldHJpYyBkaXIgbmlkIHNzbiBkc24gaG9wY291bnQgdHRsIGV4cGlyYXRpb24KCgl3aGVyZSB0aGUgZGlmZmVyZW50IGZpZWxkcyBhcmU6LQoJCWRhCQktLSBEQSBNQUMgYWRkcmVzcyAoaW4gdGhlIGZvcm0gIjAwOjExOjIyOjMzOjQ0OjU1IikKCQltZXRyaWMJCS0tIHJvdXRlIG1ldHJpYyAoY29zdDogc21hbGxlci1tZXRyaWMgcm91dGVzIGFyZSBwcmVmZXJyZWQpCgkJZGlyCQktLSBkaXJlY3Rpb24gKDEgZm9yIGRpcmVjdCwgMCBmb3IgcmV2ZXJzZSkKCQluaWQJCS0tIE5leHQtaG9wIChuZWlnaGJvcikgaG9zdCBJRCAobmlkKQoJCXNzbgkJLS0gU291cmNlIFNlcXVlbmNlIE51bWJlciAodGltZSBhdCB0aGUgUkEgZm9yIHJldmVyc2Ugcm91dGVzKQoJCWRzbgkJLS0gRGVzdGluYXRpb24gU2VxdWVuY2UgTnVtYmVyICh0aW1lIGF0IHRoZSBEQSBmb3IgZGlyZWN0IHJvdXRlcykKCQlob3Bjb3VudAktLSBob3AgY291bnQgKGN1cnJlbnRseSB1bnVzZWQpCgkJdHRsCQktLSBUVEwgY291bnQgKG9ubHkgdXNlZCBpbiByZXZlcnNlIGVudHJpZXMpCgkJZXhwaXJhdGlvbgktLSBlbnRyeSBleHBpcmF0aW9uIChpbiB0aWNrcywgd2hlcmUgYSB0aWNrIGlzIDEwMjR1cywgb3IgfiAxbXMuIFVzZSAwIGZvciBhbiBpbmRlZmluaXRlIGVudHJ5KQoKZnd0X2xpc3RfbmVpZ2gKCVRoaXMgY29tbWFuZCBpcyB1c2VkIHRvIGxpc3QgYSBuZWlnaGJvciBmcm9tIHRoZSBGV1QgdGFibGUuIFRoZSBvbmx5CglwYXJhbWV0ZXIgaXMgdGhlIG5laWdoYm9yIElELiBJZiB5b3Ugd2FudCB0byBsaXN0IGFsbCB0aGUgbmVpZ2hib3JzIGluIGEKCXRhYmxlLCBzdGFydCB3aXRoIG5pZD0wLCBhbmQga2VlcCBpbmNyZW1lbnRpbmcgbmlkIHVudGlsIHlvdSBnZXQgYQoJIihudWxsKSIgc3RyaW5nLiAgTm90ZSB0aGF0IHRoZSBuaWQgZnJvbSBhIGZ3dF9saXN0X3JvdXRlIGNvbW1hbmQgY2FuIGJlCgl1c2VkIGFzIGFuIGlucHV0IHRvIHRoaXMgY29tbWFuZC4gIEFsc28gbm90ZSB0aGF0IHRoaXMgY29tbWFuZCBpcyBtZWFudAoJbW9zdGx5IGZvciBkZWJ1Z2dpbmcuICBJdCBpcyBleHBlY3RlZCB0aGF0IHVzZXJzIHdpbGwgdXNlIGZ3dF9sb29rdXAuCglPbmUgaW1wb3J0YW50IHJlYXNvbiBmb3IgdGhpcyBpcyB0aGF0IHRoZSBuZWlnaGJvciBpZCBtYXkgY2hhbmdlIGFzIHRoZQoJbmVpZ2hib3IgdGFibGUgaXMgYWx0ZXJlZC4KCgkJaXdwcml2IGV0aFggZnd0X2xpc3RfbmVpZ2ggbmlkCgoJVGhlIG91dHB1dCBpcyBhIHN0cmluZyBvZiB0aGUgZm9sbG93aW5nIGZvcm06CgoJCXJhIHNsZWVwbW9kZSBzbnIgcmVmZXJlbmNlcwoKCXdoZXJlIHRoZSBkaWZmZXJlbnQgZmllbGRzIGFyZTotCgkJcmEJCS0tIFJBIE1BQyBhZGRyZXNzIChpbiB0aGUgZm9ybSAiMDA6MTE6MjI6MzM6NDQ6NTUiKQoJCXNsZWVwbW9kZQktLSBSQSdzIHNsZWVwIG1vZGUgKGN1cnJlbnRseSB1bnVzZWQpCgkJc25yCQktLSBTTlIgaW4gdGhlIGxpbmsgdG8gUkEgKGN1cnJlbnRseSB1bnVzZWQpCgkJcmVmZXJlbmNlcwktLSBSQSdzIHJlZmVyZW5jZSBjb3VudGVyCgpmd3RfcmVzZXQKCVRoaXMgY29tbWFuZCBpcyB1c2VkIHRvIHJlc2V0IHRoZSBGV1QgdGFibGUsIGdldHRpbmcgcmlkIG9mIGFsbCB0aGUKCWVudHJpZXMuIFRoZXJlIGFyZSBubyBpbnB1dCBwYXJhbWV0ZXJzLgoKCQlpd3ByaXYgZXRoWCBmd3RfcmVzZXQKCglUaGUgY29tbWFuZCBkb2VzIG5vdCByZXR1cm4gYW55dGhpbmcuCgpmd3RfY2xlYW51cAoJVGhpcyBjb21tYW5kIGlzIHVzZWQgdG8gcGVyZm9ybSB1c2VyLWJhc2VkIGdhcmJhZ2UgcmVjb2xsZWN0aW9uLiBUaGUKCUZXVCB0YWJsZSBpcyBjaGVja2VkLCBhbmQgYWxsIHRoZSBlbnRyaWVzIHRoYXQgYXJlIGV4cGlyZWQgb3IgaW52YWxpZAoJYXJlIGNsZWFuZWQuIE5vdGUgdGhhdCB0aGlzIGlzIGV4cG9ydGVkIHRvIHRoZSBkcml2ZXIgZm9yIGRlYnVnZ2luZwoJcHVycG9zZXMsIGFzIGdhcmJhZ2UgY29sbGVjdGlvbiBpcyBhbHNvIGZpcmVkIGJ5IHRoZSBmaXJtd2FyZSB3aGVuIGluCglzcGFjZSBwcm9ibGVtcy4gVGhlcmUgYXJlIG5vIGlucHV0IHBhcmFtZXRlcnMuCgoJCWl3cHJpdiBldGhYIGZ3dF9jbGVhbnVwCgoJVGhlIGNvbW1hbmQgZG9lcyByZXR1cm5zIHRoZSBudW1iZXIgb2YgaW52YWxpZC9leHBpcmVkIHJvdXRlcyBkZWxldGVkLgoKZnd0X3RpbWUKCVRoaXMgY29tbWFuZCByZXR1cm5zIGEgY2FyZCdzIGludGVybmFsIHRpbWUgcmVwcmVzZW50YXRpb24uICBJdCBpcyB0aGlzCgl0aW1lIHRoYXQgaXMgdXNlZCB0byByZXByZXNlbnQgdGhlIGV4cGlyYXRpb24gdGltZXMgb2YgRldUIGVudHJpZXMuICBUaGUKCW51bWJlciBpcyBub3QgY29uc2lzdGVudCBmcm9tIGNhcmQgdG8gY2FyZDsgaXQgaXMgc2ltcGx5IGEgdGltZXIgY291bnQuCglUaGUgZnd0X3RpbWUgY29tbWFuZCBpcyB1c2VkIHRvIGluc3BlY3QgdGhlIHRpbWVyIHNvIHRoYXQgZXhwaXJhdGlvbgoJdGltZXMgcmVwb3J0ZWQgYnkgZnd0X2xpc3QgY2FuIGJlIHByb3Blcmx5IGludGVycHJldGVkLgoKCQlpd3ByaXYgZXRoWCBmd3RfdGltZQoKbWVzaF9nZXRfdHRsCgoJVGhlIG1lc2ggdHRsIGlzIHRoZSBudW1iZXIgb2YgaG9wcyBhIG1lc2ggcGFja2V0IGNhbiB0cmF2ZXJzZSBiZWZvcmUgaXQKCWlzIGRyb3BwZWQuICBUaGlzIHBhcmFtZXRlciBpcyB1c2VkIHRvIHByZXZlbnQgaW5maW5pdGUgbG9vcHMgaW4gdGhlCgltZXNoIG5ldHdvcmsuICBUaGUgdmFsdWUgcmV0dXJuZWQgYnkgdGhpcyBmdW5jdGlvbiBpcyB0aGUgdHRsIGFzc2lnbmVkCgl0byBhbGwgbWVzaCBwYWNrZXRzLiAgQ3VycmVudGx5IHRoZXJlIGlzIG5vIHdheSB0byBjb250cm9sIHRoZSB0dGwgb24gYQoJcGVyIHBhY2tldCBvciBwZXIgc29ja2V0IGJhc2lzLgoKCWl3cHJpdiBldGhYIG1lc2hfZ2V0X3R0bAoKbWVzaF9zZXRfdHRsIHR0bAoKCVNldCB0aGUgdHRsLiAgVGhlIGFyZ3VtZW50IG11c3QgYmUgYmV0d2VlbiAwIGFuZCAyNTUuCgoJaXdwcml2IGV0aFggbWVzaF9zZXRfdHRsIDx0dGw+Cgo9PT09PT09PT09PT09PT09PT09PT09PT09CkVUSFRPT0wKPT09PT09PT09PT09PT09PT09PT09PT09PQoKClVzZSB0aGUgLWkgb3B0aW9uIHRvIHJldHJpZXZlIHZlcnNpb24gaW5mb3JtYXRpb24gZnJvbSB0aGUgZHJpdmVyLgoKIyBldGh0b29sIC1pIGV0aDAKZHJpdmVyOiBsaWJlcnRhcwp2ZXJzaW9uOiBDT01NLVVTQjgzODgtMzE4LnA0CmZpcm13YXJlLXZlcnNpb246IDUuMTEwLjcKYnVzLWluZm86CgpVc2UgdGhlIC1lIG9wdGlvbiB0byByZWFkIHRoZSBFRVBST00gY29udGVudHMgb2YgdGhlIGNhcmQuCgoJVXNhZ2U6CglldGh0b29sIC1lIGV0aFggW3JhdyBvbnxvZmZdIFtvZmZzZXQgTl0gW2xlbmd0aCBOXQoKICAgICAgIC1lICAgICByZXRyaWV2ZXMgYW5kIHByaW50cyBhbiBFRVBST00gZHVtcCBmb3IgdGhlICBzcGVjaWZpZWQgIGV0aGVybmV0CiAgICAgICAgICAgICAgZGV2aWNlLiAgIFdoZW4gcmF3IGlzIGVuYWJsZWQsIHRoZW4gaXQgZHVtcHMgdGhlIHJhdyBFRVBST00gZGF0YQogICAgICAgICAgICAgIHRvIHN0ZG91dC4gVGhlIGxlbmd0aCBhbmQgb2Zmc2V0IHBhcmFtZXRlcnMgYWxsb3cgIGR1bXBpbmcgIGNlci0KICAgICAgICAgICAgICB0YWluIHBvcnRpb25zIG9mIHRoZSBFRVBST00uICBEZWZhdWx0IGlzIHRvIGR1bXAgdGhlIGVudGlyZSBFRVAtCiAgICAgICAgICAgICAgUk9NLgoKIyBldGh0b29sIC1lIGV0aDAgb2Zmc2V0IDAgbGVuZ3RoIDE2Ck9mZnNldCAgICAgICAgICBWYWx1ZXMKLS0tLS0tICAgICAgICAgIC0tLS0tLQoweDAwMDAgICAgICAgICAgMzggMzMgMzAgNTggMDAgMDAgMzQgZjQgMDAgMDAgMTAgMDAgMDAgYzQgMTcgMDAKCj09PT09PT09PT09PT09PT09PT09PT09PQpERUJVR0ZTIENPTU1BTkRTCj09PT09PT09PT09PT09PT09PT09PT09PQoKdGhvc2UgY29tbWFuZHMgYXJlIHVzZWQgdmlhIGRlYnVnZnMgaW50ZXJmYWNlCgo9PT09PT09PT09PQpyZG1hYwpyZGJicApyZHJmCglUaGVzZSBjb21tYW5kcyBhcmUgdXNlZCB0byByZWFkIHRoZSBNQUMsIEJCUCBhbmQgUkYgcmVnaXN0ZXJzIGZyb20gdGhlCgljYXJkLiAgVGhlc2UgY29tbWFuZHMgdGFrZSBvbmUgcGFyYW1ldGVyIHRoYXQgc3BlY2lmaWVzIHRoZSBvZmZzZXQKCWxvY2F0aW9uIHRoYXQgaXMgdG8gYmUgcmVhZC4gIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgc3BlY2lmaWVkIGluCgloZXhhZGVjaW1hbCAoaXRzIHBvc3NpYmxlIHRvIHByZWNlZWQgcHJlY2VkaW5nIHRoZSBudW1iZXIgd2l0aCBhICIweCIpLgoKCVBhdGg6IC9kZWJ1Z2ZzL2xpYmVydGFzX3dpcmVsZXNzL2V0aFgvcmVnaXN0ZXJzLwoKCVVzYWdlOgoJCWVjaG8gIjB4YTEyMyIgPiByZG1hYyA7IGNhdCByZG1hYwoJCWVjaG8gIjB4YTEyMyIgPiByZGJicCA7IGNhdCByZGJicAoJCWVjaG8gIjB4YTEyMyIgPiByZHJmIDsgY2F0IHJkcmYKd3JtYWMKd3JiYnAKd3JyZgoJVGhlc2UgY29tbWFuZHMgYXJlIHVzZWQgdG8gd3JpdGUgdGhlIE1BQywgQkJQIGFuZCBSRiByZWdpc3RlcnMgaW4gdGhlCgljYXJkLiAgVGhlc2UgY29tbWFuZHMgdGFrZSB0d28gcGFyYW1ldGVycyB0aGF0IHNwZWNpZnkgdGhlIG9mZnNldAoJbG9jYXRpb24gYW5kIHRoZSB2YWx1ZSB0aGF0IGlzIHRvIGJlIHdyaXR0ZW4uIFRoaXMgcGFyYW1ldGVycyBtdXN0CgliZSBzcGVjaWZpZWQgaW4gaGV4YWRlY2ltYWwgKGl0cyBwb3NzaWJsZSB0byBwcmVjZWVkIHRoZSBudW1iZXIKCXdpdGggYSAiMHgiKS4KCglVc2FnZToKCQllY2hvICIweGExMjMgMHhhYSIgPiB3cm1hYwoJCWVjaG8gIjB4YTEyMyAweGFhIiA+IHdyYmJwCgkJZWNobyAiMHhhMTIzIDB4YWEiID4gd3JyZgoKc2xlZXBwYXJhbXMKCVRoaXMgY29tbWFuZCBpcyB1c2VkIHRvIHNldCB0aGUgc2xlZXBjbG9jayBjb25maWd1cmF0aW9ucwoKCVBhdGg6IC9kZWJ1Z2ZzL2xpYmVydGFzX3dpcmVsZXNzL2V0aFgvCgoJVXNhZ2U6CgkJY2F0IHNsZWVwcGFyYW1zOiByZWFkcyB0aGUgY3VycmVudCBzbGVlcGNsb2NrIGNvbmZpZ3VyYXRpb24KCgkJZWNobyAicDEgcDIgcDMgcDQgcDUgcDYiID4gc2xlZXBwYXJhbXM6IHdyaXRlcyB0aGUgc2xlZXBjbG9jayBjb25maWd1cmF0aW9uLgoKCQl3aGVyZToKCQkJcDEgaXMgU2xlZXAgY2xvY2sgZXJyb3IgaW4gcHBtICgwLTY1NTM1KQoJCQlwMiBpcyBXYWtldXAgb2Zmc2V0IGluIHVzZWMgKDAtNjU1MzUpCgkJCXAzIGlzIENsb2NrIHN0YWJpbGl6YXRpb24gdGltZSBpbiB1c2VjICgwLTY1NTM1KQoJCQlwNCBpcyBDb250cm9sIHBlcmlvZGljIGNhbGlicmF0aW9uICgwLTIpCgkJCXA1IGlzIENvbnRyb2wgdGhlIHVzZSBvZiBleHRlcm5hbCBzbGVlcCBjbG9jayAoMC0yKQoJCQlwNiBpcyByZXNlcnZlZCBmb3IgZGVidWcgKDAtNjU1MzUpCgpzdWJzY3JpYmVkX2V2ZW50cwoKCVRoZSBzdWJzY3JpYmVkX2V2ZW50cyBkaXJlY3RvcnkgY29udGFpbnMgdGhlIGludGVyZmFjZSBmb3IgdGhlCglzdWJzY3JpYmVkIGV2ZW50cyBBUEkuCgoJUGF0aDogL2RlYnVnZnMvbGliZXJ0YXNfd2lyZWxlc3MvZXRoWC9zdWJzY3JpYmVkX2V2ZW50cy8KCglFYWNoIGV2ZW50IGlzIHJlcHJlc2VudGVkIGJ5IGEgZmlsZW5hbWUuIEVhY2ggZmlsZW5hbWUgY29uc2lzdHMgb2YgdGhlCglmb2xsb3dpbmcgdGhyZWUgZmllbGRzOgoJVmFsdWUgRnJlcXVlbmN5IFN1YnNjcmliZWQKCglUbyByZWFkIHRoZSBjdXJyZW50IHZhbHVlcyBmb3IgYSBnaXZlbiBldmVudCwgZG86CgkJY2F0IGV2ZW50CglUbyBzZXQgdGhlIGN1cnJlbnQgdmFsdWVzLCBkbzoKCQllY2hvICI2MCAyIDEiID4gZXZlbnQKCglGcmVxdWVuY3kgZmllbGQgc3BlY2lmaWVzIHRoZSByZXBvcnRpbmcgZnJlcXVlbmN5IGZvciB0aGlzIGV2ZW50LgoJSWYgaXQgaXMgc2V0IHRvIDAsIHRoZW4gdGhlIGV2ZW50IGlzIHJlcG9ydGVkIG9ubHkgb25jZSwgYW5kIHRoZW4KCWF1dG9tYXRpY2FsbHkgdW5zdWJzY3JpYmVkLiBJZiBpdCBpcyBzZXQgdG8gMSwgdGhlbiB0aGUgZXZlbnQgaXMKCXJlcG9ydGVkIGV2ZXJ5IHRpbWUgaXQgb2NjdXJzLiBJZiBpdCBpcyBzZXQgdG8gTiwgdGhlbiB0aGUgZXZlbnQgaXMKCXJlcG9ydGVkIGV2ZXJ5IE50aCB0aW1lIGl0IG9jY3Vycy4KCgliZWFjb25fbWlzc2VkCglWYWx1ZSBmaWVsZCBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiBjb25zZWN1dGl2ZSBtaXNzaW5nIGJlYWNvbnMgd2hpY2gKCXRyaWdnZXJzIHRoZSBMSU5LX0xPU1MgZXZlbnQuIFRoaXMgZXZlbnQgaXMgZ2VuZXJhdGVkIG9ubHkgb25jZSBhZnRlcgoJd2hpY2ggdGhlIGZpcm13YXJlIHJlc2V0cyBpdHMgc3RhdGUuIEF0IGluaXRpYWxpemF0aW9uLCB0aGUgTElOS19MT1NTCglldmVudCBpcyBzdWJzY3JpYmVkIGJ5IGRlZmF1bHQuIFRoZSBkZWZhdWx0IHZhbHVlIG9mIE1pc3NlZEJlYWNvbnMgaXMKCTYwLgoKCWZhaWx1cmVfY291bnQKCVZhbHVlIGZpZWxkIHNwZWNpZmllcyB0aGUgY29uc2VjdXRpdmUgZmFpbHVyZSBjb3VudCB0aHJlc2hvbGQgd2hpY2gKCXRyaWdnZXJzIHRoZSBnZW5lcmF0aW9uIG9mIHRoZSBNQVhfRkFJTCBldmVudC4gT25jZSB0aGlzIGV2ZW50IGlzCglnZW5lcmF0ZWQsIHRoZSBjb25zZWN1dGl2ZSBmYWlsdXJlIGNvdW50IGlzIHJlc2V0IHRvIDAuCglBdCBpbml0aWFsaXphdGlvbiwgdGhlIE1BWF9GQUlMIGV2ZW50IGlzIE5PVCBzdWJzY3JpYmVkIGJ5CglkZWZhdWx0LgoKCWhpZ2hfcnNzaQoJVGhpcyBldmVudCBpcyBnZW5lcmF0ZWQgd2hlbiB0aGUgYXZlcmFnZSByZWNlaXZlZCBSU1NJIGluIGJlYWNvbnMgZ29lcwoJYWJvdmUgYSB0aHJlc2hvbGQsIHNwZWNpZmllZCBieSBWYWx1ZS4KCglsb3dfcnNzaQoJVGhpcyBldmVudCBpcyBnZW5lcmF0ZWQgd2hlbiB0aGUgYXZlcmFnZSByZWNlaXZlZCBSU1NJIGluIGJlYWNvbnMgZ29lcwoJYmVsb3cgYSB0aHJlc2hvbGQsIHNwZWNpZmllZCBieSBWYWx1ZS4KCgloaWdoX3NucgoJVGhpcyBldmVudCBpcyBnZW5lcmF0ZWQgd2hlbiB0aGUgYXZlcmFnZSByZWNlaXZlZCBTTlIgaW4gYmVhY29ucyBnb2VzCglhYm92ZSBhIHRocmVzaG9sZCwgc3BlY2lmaWVkIGJ5IFZhbHVlLgoKCWxvd19zbnIKCVRoaXMgZXZlbnQgaXMgZ2VuZXJhdGVkIHdoZW4gdGhlIGF2ZXJhZ2UgcmVjZWl2ZWQgU05SIGluIGJlYWNvbnMgZ29lcwoJYmVsb3cgYSB0aHJlc2hvbGQsIHNwZWNpZmllZCBieSBWYWx1ZS4KCmV4dHNjYW4KCVRoaXMgY29tbWFuZCBpcyB1c2VkIHRvIGRvIGEgc3BlY2lmaWMgc2Nhbi4KCglQYXRoOiAvZGVidWdmcy9saWJlcnRhc193aXJlbGVzcy9ldGhYLwoKCVVzYWdlOiBlY2hvICJTU0lEIiA+IGV4dHNjYW4KCglFeGFtcGxlOgoJCWVjaG8gIkxJTktTWVMtQVAiID4gZXh0c2NhbgoKCVRvIHNlZSB0aGUgcmVzdWx0cyBvZiB1c2UgZ2V0c2NhbnRhYmxlIGNvbW1hbmQuCgpnZXRzY2FudGFibGUKCglEaXNwbGF5IHRoZSBjdXJyZW50IGNvbnRlbnRzIG9mIHRoZSBkcml2ZXIgc2NhbiB0YWJsZSAoaWUuIGdldCB0aGUKCXNjYW4gcmVzdWx0cykuCgoJUGF0aDogL2RlYnVnZnMvbGliZXJ0YXNfd2lyZWxlc3MvZXRoWC8KCglVc2FnZToKCQljYXQgZ2V0c2NhbnRhYmxlCgpzZXR1c2Vyc2NhbgoJSW5pdGlhdGUgYSBjdXN0b21pemVkIHNjYW4gYW5kIHJldHJpZXZlIHRoZSByZXN1bHRzCgoKCVBhdGg6IC9kZWJ1Z2ZzL2xpYmVydGFzX3dpcmVsZXNzL2V0aFgvCgogICAgVXNhZ2U6CiAgICAgICBlY2hvICJbQVJHU10iID4gc2V0dXNlcnNjYW4KCiAgICAgICAgIHdoZXJlIFtBUkdTXToKCiAgICAgIGNoYW49W2NoYW4jXVtiYW5kXVttb2RlXSB3aGVyZSBiYW5kIGlzIFthLGIsZ10gYW5kIG1vZGUgaXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsYW5rIGZvciBhY3RpdmUgb3IgJ3AnIGZvciBwYXNzaXZlCiAgICAgIGJzc2lkPXh4Onh4Onh4Onh4Onh4Onh4ICBzcGVjaWZ5IGEgQlNTSUQgZmlsdGVyIGZvciB0aGUgc2NhbgogICAgICBzc2lkPSJbU1NJRF0iICAgICAgICAgICAgc3BlY2lmeSBhIFNTSUQgZmlsdGVyIGZvciB0aGUgc2NhbgogICAgICBrZWVwPVswIG9yIDFdICAgICAgICAgICAga2VlcCB0aGUgcHJldmlvdXMgc2NhbiByZXN1bHRzICgxKSwgZGlzY2FyZCAoMCkKICAgICAgZHVyPVtzY2FuIHRpbWVdICAgICAgICAgIHRpbWUgdG8gc2NhbiBmb3IgZWFjaCBjaGFubmVsIGluIG1pbGxpc2Vjb25kcwogICAgICBwcm9iZXM9WyNdICAgICAgICAgICAgICAgbnVtYmVyIG9mIHByb2JlIHJlcXVlc3RzIHRvIHNlbmQgb24gZWFjaCBjaGFuCiAgICAgIHR5cGU9WzEsMiwzXSAgICAgICAgICAgICBCU1MgdHlwZTogMSAoSW5mcmEpLCAyKEFkaG9jKSwgMyhBbnkpCgogICAgQW55IGNvbWJpbmF0aW9uIG9mIHRoZSBhYm92ZSBhcmd1bWVudHMgY2FuIGJlIHN1cHBsaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUuCiAgICAgIElmIHRoZSBjaGFuIHRva2VuIGlzIGFic2VudCwgYSBmdWxsIGNoYW5uZWwgc2NhbiB3aWxsIGJlIGNvbXBsZXRlZCBieQogICAgICB0aGUgZHJpdmVyLiAgSWYgdGhlIGR1ciBvciBwcm9iZXMgdG9rZW5zIGFyZSBhYnNlbnQsIHRoZSBkcml2ZXIgZGVmYXVsdAogICAgICBzZXR0aW5nIHdpbGwgYmUgdXNlZC4gIFRoZSBic3NpZCBhbmQgc3NpZCBmaWVsZHMsIGlmIGJsYW5rLAogICAgICB3aWxsIHByb2R1Y2UgYW4gdW5maWx0ZXJlZCBzY2FuLiBUaGUgdHlwZSBmaWVsZCB3aWxsIGRlZmF1bHQgdG8gMyAoQW55KQogICAgICBhbmQgdGhlIGtlZXAgZmllbGQgd2lsbCBkZWZhdWx0IHRvIDAgKERpc2NhcmQpLgoKICAgIEV4YW1wbGVzOgogICAgMSkgUGVyZm9ybSBhbiBhY3RpdmUgc2NhbiBvbiBjaGFubmVscyAxLCA2LCBhbmQgMTEgaW4gdGhlICdnJyBiYW5kOgogICAgICAgICAgICBlY2hvICJjaGFuPTFnLDZnLDExZyIgPiBzZXR1c2Vyc2NhbgoKICAgIDIpIFBlcmZvcm0gYSBwYXNzaXZlIHNjYW4gb24gY2hhbm5lbCAxMSBmb3IgMjAgbXM6CiAgICAgICAgICAgIGVjaG8gImNoYW49MTFncCBkdXI9MjAiID4gc2V0dXNlcnNjYW4KCiAgICAzKSBQZXJmb3JtIGFuIGFjdGl2ZSBzY2FuIG9uIGNoYW5uZWxzIDEsIDYsIGFuZCAxMTsgYW5kIGEgcGFzc2l2ZSBzY2FuIG9uCiAgICAgICBjaGFubmVsIDM2IGluIHRoZSAnYScgYmFuZDoKCiAgICAgICAgICAgIGVjaG8gImNoYW49MWcsNmcsMTFnLDM2YXAiID4gc2V0dXNlcnNjYW4KCiAgICA0KSBQZXJmb3JtIGFuIGFjdGl2ZSBzY2FuIG9uIGNoYW5uZWwgNiBhbmQgMzYgZm9yIGEgc3BlY2lmaWMgU1NJRDoKICAgICAgICAgICAgZWNobyAiY2hhbj02ZywzNmEgc3NpZD0iVGVzdEFQIiIgPiBzZXR1c2Vyc2NhbgoKICAgIDUpIFNjYW4gYWxsIGF2YWlsYWJsZSBjaGFubmVscyAoQi9HLCBBIGJhbmRzKSBmb3IgYSBzcGVjaWZpYyBCU1NJRCwga2VlcAogICAgICAgdGhlIGN1cnJlbnQgc2NhbiB0YWJsZSBpbnRhY3QsIHVwZGF0ZSBleGlzdGluZyBvciBhcHBlbmQgbmV3IHNjYW4gZGF0YToKICAgICAgICAgICAgZWNobyAiYnNzaWQ9MDA6NTA6NDM6MjA6MTI6ODIga2VlcD0xIiA+IHNldHVzZXJzY2FuCgogICAgNikgU2NhbiBjaGFubmVsIDYsIGZvciBhbGwgaW5mcmFzdHJ1Y3R1cmUgbmV0d29ya3MsIHNlbmRpbmcgdHdvIHByb2JlCiAgICAgICByZXF1ZXN0cy4gIEtlZXAgdGhlIHByZXZpb3VzIHNjYW4gdGFibGUgaW50YWN0LiBVcGRhdGUgYW55IGR1cGxpY2F0ZQogICAgICAgQlNTSUQvU1NJRCBtYXRjaGVzIHdpdGggdGhlIG5ldyBzY2FuIGRhdGE6CiAgICAgICAgICAgIGVjaG8gImNoYW49NmcgdHlwZT0xIHByb2Jlcz0yIGtlZXA9MSIgPiBzZXR1c2Vyc2NhbgoKICAgIEFsbCBlbnRyaWVzIGluIHRoZSBzY2FuIHRhYmxlIChub3QganVzdCB0aGUgbmV3IHNjYW4gZGF0YSB3aGVuIGtlZXA9MSkKICAgIHdpbGwgYmUgZGlzcGxheWVkIHVwb24gY29tcGxldGlvbiBieSB1c2Ugb2YgdGhlIGdldHNjYW50YWJsZSBpb2N0bC4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQo=