ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8gICBfIF9fX18gIF8gICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX198IHwgfCB8ICBfIFx8IHwgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyBfX3wgfCB8IHwgfF8pIHwgfCAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKF9ffCB8X3wgfCAgXyA8fCB8X19fIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxfX198XF9fXy98X3wgXF9cX19fX198CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGlzdG9yeSBvZiBDaGFuZ2VzCgpWZXJzaW9uIDcuOAoKRGFuaWVsICg3IEp1bmUgMjAwMSkKLSBTRGF2aWxhIHByb3ZpZGVkIGEgcmVzdW1lZCBkb3dubG9hZCBmaXguCgpWZXJzaW9uIDcuOC1wcmU0CgpEYW5pZWwgKDEgSnVuZSAyMDAxKQotIFN0ZXJsaW5nIHByb3ZpZGVkIHNvbWUgbmV3IFBIUCBleGFtcGxlcy4KCi0gQ2hhbmdlZCB0aGUgQ1ZTIGhpZXJhcmNoeSBhbmQgdGhlIG9sZGVyIGNoZWNrb3V0IGluc3RydWN0aW9uIGRvZXMgbm8gbG9uZ2VyCiAgd29yay4gV2UgbW92ZWQgdGhlIGVudGlyZSBzb3VyY2UgY29kZSBpbnRvIGEgQ1ZTIG1vZHVsZSBuYW1lZCAnY3VybCcuCgpEYW5pZWwgKDMxIE1heSAyMDAxKQotIENVUkxPUFRfTVVURSBkb2VzIG5vdCBleGlzdCBhbnltb3JlLiBJdCBpcyBzdGlsbCBwcmVzZW50IGluIHRoZSBpbmNsdWRlIGZpbGUKICB0byBub3QgY2F1c2UgY29tcGlsZXIgZXJyb3JzIGZvciBhcHBsaWNhdGlvbnMgdXNpbmcgaXQsIGJ1dCBpdCBpc24ndCB1c2VkCiAgYW55d2hlcmUgaW4gdGhlIGxpYnJhcnkuCgpWZXJzaW9uIDcuOC1wcmUzCgpEYW5pZWwgKDMxIE1heSAyMDAxKQotIE9uY2UgYW5kIGZvciBhbGwgZml4ZWQgdGhlIF9SRUVOVFJBTlQgbWVzcyBmb3IgU29sYXJpcyBjb21waWxlcyB0byBwcmVzZW50CiAgbGVzcyB3YXJuaW5ncy4KCi0gU3RlcmxpbmcgSHVnaGVzIHRpcmVsZXNzbHkgcG9pbnRzIG91dCBhbmQgY29ycmVjdHMgbXkgbWlzdGFrZXMuLi4hIFNvLAogIGN1cmxfZ2xvYmFsX2luaXQoKSBub3cgbGV0cyB0aGUgYXJndW1lbnQgZmxhZ3MgKlNFVCogd2hhdCBwYXJ0cyB0bwogIGluaXQuIENVUkxfR0xPQkFMX0RFRkFVTFQgbWFrZXMgYSBuaWNlIGRlZmF1bHQsIENVUkxfR0xPQkFMX0FMTCBpbml0cyBhbGwKICBrbm93biBzdWJzeXN0ZW1zIGFuZCBDVVJMX0dMT0JBTF9OT05FIGluaXRzIG5vdGhpbmcgbW9yZSB0aGFuIGFic29sdXRlbHkKICBuZWNlc3NhcnkuIE1hbiBwYWdlIHVwZGF0ZWQgYWNjb3JkaW5nbHkuCgotIEZpeGVkIHRoZSBzdHJ0b2suaCBpbmNsdWRlIGZpbGUgYXMgaXQgd291bGRuJ3QgY29tcGlsZSBvbiBhbGwgcGxhdGZvcm1zIQoKRGFuaWVsICgzMCBNYXkgMjAwMSkKLSBNYWRlIGxpYmN1cmwgYnkgZGVmYXVsdCBhY3QgYXMgaWYgQ1VSTE9QVF9NVVRFIGFuZCBDVVJMT1BUX05PUFJPR1JFU1Mgd2VyZQogIHNldCBUUlVFLiBTZXQgdGhlbSB0byBGQUxTRSB0byBtYWtlIGxpYmN1cmwgbW9yZSB0YWxrYXRpdmUuIFRoZSAqX01VVEUKICBvcHRpb24gaXMgc3ViamVjdCBmb3IgY29tcGxldGUgcmVtb3ZhbC4uLgoKVmVyc2lvbiA3LjgtcHJlMgoKRGFuaWVsICgzMCBNYXkgMjAwMSkKLSBDcmlzIEJhaWxpZmYgd3JvdGUgYSBtYWtlZmlsZSBmb3IgYnVpbGRpbmcgU29sYXJpcyBwYWNrYWdlcy4KCi0gU3RlcmxpbmcgSHVnaGVzIGJyb3VnaHQgZml4ZXMgZm9yICdidWlsZGNvbmYnICh0aGUgYnVpbGQtZnJvbS1DVlMgdG9vbCkgYW5kCiAgd2UgZGlzY3Vzc2VkIGFuZCBhZGRlZCBhIGZldyBDVVJMX0dMT0JBTF8qIGZsYWdzIGluIGluY2x1ZGUvY3VybC5oCgotIEtqZXRpbCBKYWNvYnNlbiBwcml2YXRlbHkgYW5ub3VuY2VkIGhpcyBweXRob24gaW50ZXJmYWNlIHRvIGxpYmN1cmwsCiAgYXZhaWxhYmxlIGF0IGh0dHA6Ly9weWN1cmwuc291cmNlZm9yZ2UubmV0LwoKRGFuaWVsICgyOSBNYXkgMjAwMSkKLSBTdGVybGluZyBIdWdoZXMgZml4ZWQgYSBzdHJ0b2soKSBwcm9ibGVtIGluIGxpYmN1cmwuIEl0IGlzIG5vdCBhIHRocmVhZC0KICBzYWZlIGZ1bmN0aW9uLiBOb3cgY29uZmlndXJlIGNoZWNrcyBmb3IgYSB0aHJlYWQtc2FmZSB2ZXJzaW9uLCBhbmQKICBsaWIvc3RydG9rLmMgb2ZmZXJzIG9uZSBmb3IgdGhlIHN5c3RlbXMgdGhhdCBkb24ndCBjb21lIHdpdGggb25lIGluY2x1ZGVkIQoKLSBNZXR0Z3V0IEphbWFsbGEgY29ycmVjdGx5IHBvaW50ZWQgb3V0IHRoYXQgdGhlIC0jIHByb2dyZXNzIGJhciB3YXMgd3JpdHRlbgogIHRvIHN0ZGVyciBldmVuIHRob3VnaCAtLXN0ZGVyciByZWRpcmVjdGlvbiB3YXMgdXNlZC4gVGhpcyBpcyBub3cgY29ycmVjdGVkLgoKLSBJIG1vdmVkIG91dCB0aGUgbGlzdCBvZiBjb250cmlidXRvcnMgZnJvbSB0aGUgY3VybC4xIG1hbiBwYWdlIGFuZCBtYWRlIGEKICBzZXBhcmF0ZSBkb2NzL1RIQU5LUyBmaWxlLiBJdCBtYWtlcyB0aGUgbGlzdCBlYXNpZXIgdG8gZmluZCwgYW5kIG1hZGUgaXQKICBlYXNpZXIgZm9yIG1lIHRvIG1ha2UgYSBzZXBhcmF0ZSB3ZWIgcGFnZSB3aXRoIHRoYXQgc2FtZSBpbmZvcm1hdGlvbi4KCiAgSSByZWFsbHkgZG8gd2FudCBhbGwgeW91IGd1eXMgbWVudGlvbmVkIGluIHRoZXJlIHRvIGZlZWwgeW91IGdldCB0aGUgY3JlZGl0CiAgeW91IGRlc2VydmUuCgotIGxpYi9lYXN5LmMgZGlkbid0IGNvbXBpbGUgcHJvcGVybHkgaW4gdGhlIDcuOC1wcmUxIGR1ZSB0byBhIHNpbGx5IG1pc3Rha2UKClZlcnNpb24gNy44LXByZTEKCkRhbmllbCAoMjggTWF5IDIwMDEpCi0gY3VybC1jb25maWcgbm93IHN1cHBvcnRzICctLXZlcm51bScgdGhhdCBvdXRwdXRzIGEgcGxhaW4gaGV4YWRlY2ltYWwgdmVyc2lvbgogIG9mIHRoZSBsaWJjdXJsIHZlcnNpb24gbnVtYmVyICh1c2luZyA4IGJpdHMgZm9yIGVhY2ggMyBudW1iZXJzKS4gVmVyc2lvbgogIDcuNy40IGFwcGVhcnMgYXMgMDcwNzA0CgotIFdyb3RlIG1hbiBwYWdlcyBmb3IgY3VybF9nbG9iYWxfaW5pdCBhbmQgY3VybF9nbG9iYWxfY2xlYW51cC4uLgoKLSBULiBCaGFyYXRoIGJyb3VnaHQgbmV3cyBhYm91dCB0aGUgdXNhZ2Ugb2YgdGhlIE9wZW5TU0wgaW50ZXJmYWNlIHRoYXQgd2FzCiAgbm90IHByZXZpb3VzbHkgdGFrZW4gaW50byBjb25zaWRlcmF0aW9uIGFuZCB0aHVzIGNhdXNlZCBsaWJjdXJsIHRvIGxlYWsKICBtZW1vcnkuICBUaGUgb25seSBzb21ld2hhdCBzYW5lIGFwcHJvYWNoIHRvIGZpeCB0aGlzIGRpbGVtbWEsIGlzIGFkZGluZyB0d28KICB0d28gbmV3IGZ1bmN0aW9ucyBjdXJsX2dsb2JhbF9pbml0KCkgYW5kIGN1cmxfZ2xvYmFsX2NsZWFudXAoKSB0aGF0IHNob3VsZAogIGJlIGNhbGxlZCAqT05DRSogYnkgdGhlIGFwcGxpY2F0aW9uIHVzaW5nIGxpYmN1cmwuIFRoZSBpbml0IHNob3VsZCBiZSBkb25lCiAgb25seSBhdCBzdGFydHVwLCBubyBtYXR0ZXIgaG93IG1hbnkgdGhyZWFkcyB0aGUgYXBwbGljYXRpb24gaXMgZ29ubmEgdXNlLAogIGFuZCB0aGUgY2xlYW51cCBzaG91bGQgYmUgY2FsbGVkIHdoZW4gdGhlIGFwcGxpY2F0aW9uIGhhcyBmaW5pc2hlZCB1c2luZwogIGxpYmN1cmwgY29tcGxldGVseS4KCiAgKioqIFVQR1JBREUgTk9USUNFICoqKgoKICBJZiB5b3Ugd3JpdGUgYXBwbGljYXRpb25zIHVzaW5nIGxpYmN1cmwsIHlvdSByZWFsbHkgd2FudCB0byB1c2UgdGhlIHR3bwogIGZ1bmN0aW9ucyBtZW50aW9uZWQgYWJvdmUgISEhCgogIEkgY2FuJ3Qgc2F5IEkgdGhpbmsgdGhpcyBpcyBhIHZlcnkgYmVhdXRpZnVsIHNvbHV0aW9uLCBidXQgYXMgT3BlblNTTAogIGluc2lzdHMgb24gbWFraW5nIGxvdHMgb2Ygc3R1ZmYgb24gYSAiZ2xvYmFsIiBzY29wZSwgd2UncmUgZm9yY2VkIHRvIHdhbGsKICB0aGUgcGF0aCB0aGV5IHBvaW50IHVzIHRvLgoKLSBNb3ZpbmcgbW9yZSB0ZXN0IGNhc2VzIGludG8gdGhlIG5ldyBmaWxlIGZvcm1hdC4KClZlcnNpb24gNy43LjQtcHJlMwoKRGFuaWVsICgyMyBNYXkgMjAwMSkKLSBJbnRyb2R1Y2VkIGEgbmV3IGZpbGUgZm9ybWF0IGZvciBzdG9yaW5nIHRlc3QgY2FzZXMsIGFuZCB0aHVzIEkgaGFkIHRvCiAgbW9kaWZ5IGFsbCB0aGUgcGVybCB0ZXN0IHNjcmlwdHMgYW5kIG1vcmUgKEkgYWRkZWQgYSBuZXcgb25lKS4gSSBoYXZlIG5vdAogICJwb3J0ZWQiIGFsbCB0aGUgb2xkIHRlc3QgY2FzZXMgdG8gdGhlIG5ldyBmb3JtYXQgeWV0LCBidXQgaXQnbGwgY29tZS4KCiAgVGhlIG1haW4gYWR2YW50YWdlIG9mIHRoaXMgbmV3IGZvcm1hdCBpcyB0aGF0IGFsbCB0ZXN0IGRhdGEgZm9yIGVhY2ggdGVzdAogIGNhc2UgaXMgc3RvcmVkIGluIGEgc2luZ2xlIGZpbGUuIEl0IGdpdmVzIGEgYmV0dGVyIG92ZXJ2aWV3IGZvciBlYWNoIHRlc3QKICBjYXNlIGFuZCBhIGxvdCBsZXNzIGZpbGVzLgoKLSBBbmRy6XMgR2FyY+1hIGJyb3VnaHQgYSBmaXggZm9yIHRoZSBuZXRzY2FwZS9tb3ppbGxhIGNvb2tpZSBmaWxlIHBhcnNpbmcKICBmdW5jdGlvbiwgYXMgaXQgdHVybnMgb3V0IGl0IGRvZXNuJ3QgYWx3YXlzIHN0b3JlIHRoZSBwYXRoIQoKRGFuaWVsICgyMiBNYXkgMjAwMSkKLSBBcyB3YXMgcmVwb3J0ZWQgYW5vbnltb3VzbHksIHdoZW4gRkFJTE9ORVJST1Igd2FzIHVzZWQsIHRoZSBodHRwY29kZSB3YXMKICBub3Qgc3RvcmVkIHByb3Blcmx5IGFuZCB0aHVzIHdhc24ndCBwb3NzaWJseSB0byByZWFkIGFmdGVyIGEgdHJhbnNmZXIgd2l0aAogIHRoZSBjdXJsX2Vhc3lfZ2V0aW5mbygpIGZ1bmN0aW9uLiBUaGlzIGlzIG5vdyBjb3JyZWN0ZWQuCgotIEluc3RhbGxlZCBhbmQgbWFkZSB1c2Ugb2YgdGhlIGZvbGxvd2luZyB0b29sIHZlcnNpb25zOgogICAgYXV0b2NvbmYgMi41MAogICAgbGlidG9vbCAxLjQKICAgIGF1dG9tYWtlIDEuNC1wMQoKICBJIHdvdWxkbid0IHJlY29tbWVuZCBhbnkgZGV2ZWxvcGVyIHRvIHRyeSB0byBnZW5lcmF0ZSB0aGluZ3Mgd2l0aCBvbGRlcgogIHZlcnNpb25zIHRoYW4gdGhlc2UuIEJ1aWxkaW5nIGZyb20gQ1ZTIHdpbGwgcHJvYmFibHkgbW9yZSBvciBsZXNzIHJlcXVpcmUKICBhdCBsZWFzdCB0aGVzZSB2ZXJzaW9ucy4KCiAgQXMgYSByZXN1bHQgb2YgdGhpcywgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgZ3JldyB0byBtb3JlIHRoYW4gZG91YmxlIGl0cwogIHByZXZpb3VzIHNpemUhCgogIEFya2FkaXVzeiBNaXNraWV3aWN6IGhlbHBlZCBtZSBieSBwb2ludGluZyBvdXQgSSBoYWQgdG8gcmVtb3ZlIG15CiAgYWNpbmNsdWRlLm00IGZpbGUgYmVmb3JlIEkgY291bGQgZ2V0IGl0IHdvcmtpbmchCgpEYW5pZWwgKDIxIE1heSAyMDAxKQotIEkgbWFkZSBmdHBzOi8vIHdvcmsuIEFkZGVkIHRlc3QgY2FzZSA0MDAgdG8gdGhlIHJlbGVhc2UgYXJjaGl2ZSwgYXMgdGhlCiAgZmlyc3QgZnRwczovLyB0ZXN0IGNhc2UuIFJlcXVpcmVzIHN0dW5uZWwuCgotIEFsc28gbWFkZSB0aGUgdGVzdCBjYXNlcyB0aGF0IHJ1bnMgc3NsIHRlc3RzIG5vdCBydW4gaWYgbGliY3VybCBpc24ndCBidWlsdAogIHdpdGggc3NsIHN1cHBvcnQuCgpEYW5pZWwgKDE5IE1heSAyMDAxKQotIE1hZGUgdGhlIGNvbmZpZ3VyZSBub3QgYWRkIGFueSBleHRyYSAtTCBMREZMQUdTIG9yIC1JIENQUEZMQUdTIHVubGVzcyB0aGV5CiAgYXJlIGFjdHVhbGx5IG5lZWRlZC4gQWxiZXJ0IENoaW4ncyBhbmQgRG9tZW5pY28gQW5kcmVvbGkncyBzdWdnZXN0aW9ucwogIGhlbHBlZCBvdXQuCgpWZXJzaW9uIDcuNy40LXByZTIKCkRhbmllbCAoMTggTWF5IDIwMDEpCi0gTmljZXIgY29uZmlndXJlLWNoZWNrIGZvciB0aGUgT3BlblNTTCBoZWFkZXJzLCB3aGljaCB0aGVuIHNldHMgdGhlIHByb3BlcgogIHZhcmlhYmxlIHRvIGhhdmUgY3VybC1jb25maWcgYmUgZ29vZC4gKEFsYmVydCBDaGluIHByb3ZpZGVkIHRoZSBmaXgpCgotIEZvciBzeXN0ZW1zIHRoYXQgZG9uJ3QgaGF2ZSB0aGVpdyBvd24gJ3N0cmxjYXQoKScgbGliY3VybCBwcm92aWRlcyBpdHMgb3duLgogIEl0IHdhcyBub3cgcmVuYW1lZCB0byBwcmV2ZW50IGNvbGxpZGVzIHdpdGggb3RoZXIgbGlicy4gKEFmdGVyIGRpc2N1c3Npb25zCiAgd2l0aCBTdGVybGluZyBIdWdoZXMgYW5kIHRoZSBpbXBsaWNhdGlvbnMgdGhpcyBoYWQgb24gUEhQIGJ1aWxkcy4pCgpEYW5pZWwgKDE3IE1heSAyMDAxKQotIENvbG0gQnVja2xleSBwb3N0ZWQgYSBkZXRhaWxlZCBidWcgcmVwb3J0IG9uICh0aGUgZGViaWFuaXplZCkgNy43LjMsIHRoYXQKICB0dXJuZWQgb3V0IHRvIGJlIGEgcHJvYmxlbSB3aXRoIHRoZSBkZWJpYW4tYnVpbHQgNy43LjMtcGFja2FnZSB0aGF0CiAgY29udGFpbmVkIGZpbGVzIGZyb20gdGhlIDcuNy4yIHJlbGVhc2UhCgotIEkgYWRkZWQgdGhlIENVUkxFX0FMUkVBRFlfQ09NUExFVEUgYWdhaW4sIGJ1dCB3aXRoIGEgZmFrZSB2YWx1ZSwganVzdCB0bwogIG1ha2UgcHJvZ3JhbXMgdGhhdCB1c2UgaXQsIG5vdCBmYWlsIHdoZW4gY29tcGlsaW5nIGFnYWluc3QgdGhpcyB2ZXJzaW9uIG9mCiAgbGliY3VybC4KCkRhbmllbCAoMTQgTWF5IDIwMDEpCi0gUGF3ZWwgQS4gR2FqZGEgZml4ZWQgYSBwcm9ibGVtIHdpdGggcmVzdW1lZCB0cmFuc2ZlcnMgb24gcmUtdXNlZCBwZXJzaXN0ZW50CiAgY29ubmVjdGlvbnMuCgpWZXJzaW9uIDcuNy40LXByZTEKCkRhbmllbCAoMTQgTWF5IDIwMDEpCi0gSnVuLWljaGlybyBpdG9qdW4gSGFnaW5vIGZpeGVkIEZUUCBQT1JUIGZvciBJUHY2LWVuYWJsZWQgbGliY3VybC4KCi0gQWRkZWQgdGhlIGZpcnN0IEhUVFBTIHRlc3QgdG8gdGhlIHRlc3Qgc3VpdGUgaW4gdGhlIHJlbGVhc2UgYXJjaGl2ZS4KCkRhbmllbCAoMTIgTWF5IDIwMDEpCi0gSnVra2EgUGlobCBzdWdnZXN0ZWQgdGhhdCBpZiAobGliKWN1cmwgaXMgdG9sZCB0byB2ZXJpZnkgdGhlIHBlZXIncwogIGNlcnRpZmljYXRlIGFuZCB0aGUgcGVlciBjYW4ndCBiZSB2ZXJpZmllZCwgaXQgc2hvdWxkIGZhaWwgYW5kIHJldHVybiBhCiAgcHJvcGVyIGVycm9yIGNvZGUuIEkgYWRkZWQgYSBicmFuZCBuZXcgZXJyb3IgY29kZSBuYW1lZAogIENVUkxFX1NTTF9QRUVSX0NFUlRJRklDQVRFIGZvciB0aGlzIHB1cnBvc2UuCgpEYW5pZWwgKDExIE1heSAyMDAxKQotIEFzIHdhcyBkaXNjdXNzZWQgd2l0aCBGcmVkZXJpYyBMZXBpZWQgYSB3aGlsZSBhZ28sIEkgbm93IG1hZGUgbGliY3VybCBub3QKICByZXR1cm4gZXJyb3IgZXZlbiB0aG91Z2ggbm8gZGF0YSB3YXMgdHJhbnNmZXJlZCBvbiB1cGxvYWQvZG93bmxvYWQgcmVzdW1lCiAgd2hlbiB0aGUgbm8gdHJhbnNmZXIgaXMgbmVlZGVkLiBUaGUgQ1VSTEVfQUxSRUFEWV9DT01QTEVURSBlcnJvciB3YXMgcmVtb3ZlZAogIGZyb20gdGhlIGhlYWRlciBmaWxlIHRvIG1ha2UgYW55IGltcGxlbWVuYXRvciB0aGF0IHVzZXMgdGhhdCB0byBiZSBhd2FyZSBvZgogIHRoZSBmYWN0IHRoYXQgaXQgY2FuJ3QgYmUgcmV0dXJuZWQgYW55bW9yZSEKCi0gSW1wcm92ZWQgZ2VuZXJhbCBoZWFkZXItcGFyc2luZyB0byBiZXR0ZXIgYWxsb3cgd2hpdGUgc3BhY2VzIGFuZCBtb3JlLgoKLSBSb2RuZXkgU2ltbW9ucyBwcm92ZWQgdGhlIGZpeCBJIGRpZCB5ZXN0ZXJkYXkgd2FzIGJhZCBhbmQgSSBoYWQgdG8gcG9zdAogIGFub3RoZXIgb25lLgoKLSBJbmdvIFdpbGtlbiBwYXRjaGVkIGF3YXkgdHdvIHJlZGlyZWN0IHByb2JsZW1zIG1vcmUhCiAgCkRhbmllbCAoMTAgTWF5IDIwMDEpCi0gQ3JpcyBCYWlsaWZmIGNvcnJlY3RseSBub3RlZCB0aGF0IHRoZSBzcGFjZS1hZnRlci1oZWFkZXIgcHJvYmxlbSB3aXRoCiAgTG9jYXRpb246IGlzIHByZXNlbnQgb24gc2V2ZXJhbCBvdGhlciBwbGFjZXMgaW4gdGhlIGxpYmN1cmwgc291cmNlcy4KCi0gSW5nbyBXaWxrZW4gcGF0Y2hlZCBhd2F5IGEgcHJvYmxlbSBsaWJjdXJsIGhhZCB3aGVuIGZvbGxvd2luZyBMb2NhdGlvbjoKICBoZWFkZXJzIHdpdGggYW4gZXh0cmEgc3BhY2UgYWZ0ZXIgdGhlIGNvbG9uLgoKLSBSb2RuZXkgU2ltbW9ucyBmb3VuZCBvdXQgdGhhdCBtdWx0aXBsZSBGVFAgdHJhbnNmZXJzIGRpZCBub3QgdHJlYXQgcmVsYXRpdmUKICBkaXJlY3RvcmllcyBjb3JyZWN0bHkuCgpEYW5pZWwgKDkgTWF5IDIwMDEpCi0gR2V0dGluZyBhbiBGVFAgZmlsZSB3aXRoIENVUkxPUFRfTk9CT0RZIHNldCAob3IgLUkgZnJvbSB0aGUgY29tbWFuZCBsaW5lKSwKICBtYWtlcyBjdXJsIHVzZSB0aGUgbm9uLXN0YW5kYXJkIGZ0cCBjb21tYW5kICJTSVpFIi4gSWYgaXQgZmFpbGVkLCBsaWJjdXJsCiAgcmV0dXJuZWQgZXJyb3IuIFN0YXJ0aW5nIG5vdywgaXQganVzdCBkb24ndCBvdXRwdXQgdGhlIGZpbGUgc2l6ZSBpbnN0ZWFkLgogIEFub255bW91cyBidWcgcmVwb3J0LgoKLSBzdHVubmVsLnBtIHdhcyBhY2NpZGVudGFsbHkgbGVmdCBvdXQgZnJvbSB0aGUgcmVsZWFzZSBhcmNoaXZlLCBpdCBpcyBub3cKICBhZGRlZCAoc3R1bm5lbCBpcyBuZWVkZWQgdG8gcnVuIHRoZSBodHRwcy10ZXN0cyBpbiB0aGUgdGVzdCBzdWl0ZSkKICAKRGFuaWVsICg3IE1heSAyMDAxKQotIENvcnJlY3RlZCB0d28gbWlub3IgY29tcGlsZXIgd2FybmluZ3MgZHVlIHRvIHRoZSBGSUxFICogdG8gdm9pZCAqIGNvbnZlcnNpb24KICB0aGF0IEkgbWlzc2VkIGF0IHR3byBwbGFjZXMuIEr2cm4gSGFydHJvdGggYnJvdWdodCBtZSBwYXRjaGVzLiBTYW5kZXIgR2F0ZXMKICBmaWxlZCBhIGJ1ZyByZXBvcnQgb24gdGhpcy4KClZlcnNpb24gNy43LjMKCkRhbmllbCAoNCBNYXkgMjAwMSkKLSBBbGwgY2FsbGJhY2sgZnVuY3Rpb25zIG5vdyB0YWtlICd2b2lkIConIGluc3RlYWQgb2YgJ0ZJTEUgKicuIFRoaXMgaXMgbWFkZQogIHRoaXMgd2F5IHRvIG1ha2UgaXQgbW9yZSBvYnZpb3VzIHRvIHBlb3BsZSB0aGF0IGFueXRoaW5nIGNhbiBiZSBwYXNzZWQgdG8KICB0aGVtIChieSB1c2luZyB0aGUgYXByb3ByaWF0ZSBvcHRpb24pLiBBZnRlciBkaXNjdXNzaW9ucyB3aXRoIFN0ZXJsaW5nCiAgSHVnaGVzLgoKRGFuaWVsICgzIE1heSAyMDAxKQotIENyaXMgQmFpbGlmZiBmaXhlZCBhIGNodW5rZWQgdHJhbnNmZXIgZW5jb2RpbmcgcHJvYmxlbSB3aXRoIHBlcnNpc3RlbnQKICBjb25uZWN0aW9uIHRoYXQgbWFkZSBsaWJjdXJsIGZhaWwgaWYgdGhlIHBlcnNpc3RlbnQgY29ubmVjdGlvbiB1c2VkIG1peGVkCiAgY2h1bmtlZCBhbmQgbm9uLWNodW5rZWQgdHJhbnNmZXJzLgoKLSBDcmlzIEJhaWxpZmYgZml4ZWQgYSBiYWQgdHJlYXRtZW50IG9mIDMwNC1yZXBsaWVzLCBhcyB0aGV5IHdvdWxkIG5vdCBiZQogIHRyZWF0ZWQgYXMgY29udGVudC1sZW5ndGggMCByZXBsaWVzIGJ1dCB3b3VsZCBjYXVzZSBhICJoYW5nIiB1bnRpbCB0aGUKICBzZXJ2ZXIgdGltZWQtb3V0IGFuZCBjbG9zZWQgdGhlIGNvbm5lY3Rpb24uCgotIEJyYWQgQnVyZGljayBmb3VuZCBhIG1pbm9yIHByb2JsZW0gaW4gdGhlIGRvY3MvZXhhbXBsZXMvTWFrZWZpbGUuYW0KCkRhbmllbCAoMjcgQXByaWwgMjAwMSkKLSBVcGRhdGVkIHRoZSBJTlRFUkFMUyBkb2N1bWVudCBhZ2Fpbi4gSXQgd2FzIGxhZ2dpbmcgYSBiaXQuIEkgdGhpbmsgSSBtYWRlIGl0CiAgbW9yZSBlYXN5IHRvIGZvbGxvdyBub3cgYXMgd2VsbC4KCi0gQnJhZCBCdXJkaWNrIGZvdW5kIGEgcHJvYmxlbSB3aXRoIHBlcnNpc3RlbnQgY29ubmVjdGlvbnMgd2hlbiBjdXJsIHJlY2VpdmVkCiAgYSAiQ29udGVudC1MZW5ndGg6IDAiIGhlYWRlci4KCi0gR2l1c2VwcGUgRCdBbWJyb3NpbyB3YXMgZmlyc3Qgb3V0IHRvIHJlcG9ydCB0aGF0IFRFTE5FVCBkb2Vzbid0IHdvcmsgaW4gY3VybAogIGNvbXBpbGVkL2J1aWx0IG9uIHdpbjMyLiBJdCBzZWVtcyB0byB3b3JrIGZvciB1bml4ZXMgdGhvdWdoIQoKLSBEYXZlIEhhbWlsdG9uIHJlcG9ydGVkIHdlaXJkIHByb2JsZW1zIHdpdGggQ1VSTC9QSFAgdGhhdCBJIHJlYWxseSBjYW4ndAogIGV4cGxhaW4gYXQgdGhlIG1vbWVudC4gSSdtIGhvcGluZyBvbiBzb21lIGhlbHAgZnJvbSB0aGUgUEhQIGNyZXcuCgpEYW5pZWwgKDI2IEFwcmlsIDIwMDEpCi0gSSByZXdyb3RlIHRoZSBGVFAgY29tbWFuZCByZXNwb25zZSBmdW5jdGlvbi4gSSBoYWQgdG8gZG8gaXQgdG8gbWFrZSBmdHBzCiAgd29yaywgYXMgdGhlIE9wZW5TU0wgcmVhZCgpLWZ1bmN0aW9uIGRpZG4ndCB3b3JrIHRoZSBzYW1lIHdheSB0aGUgbm9ybWFsCiAgdW5peCByZWFkKCkgZG9lcywgYnV0IGl0IHdhcyBhbHNvIGEgaHVnZSBwZXJmb3JtYW5jZSBib29zdC4gUHJldmlvdXNseSB0aGUKICBmdW5jdGlvbiByZWFkIG9uZSBieXRlIGF0IGEgdGltZSwgbm93IGl0IHJlYWRzIHZlcnkgbGFyZ2UgY2h1bmtzLCBhbmQgaXQKICBtYWtlcyBhIG5vdGFibGUgc3BlZWQgZGlmZmVyZW5jZS4KCkRhbmllbCAoMjUgQXByaWwgMjAwMSkKLSBDb25uZWN0aW9uIHJlLXVzZSB3aGVuIG5vdCB1c2luZyBhIHByb3h5IGRpZG4ndCB3b3JrIHByb3Blcmx5IGZvcgogIG5vbi1kZWZhdWx0IHBvcnQgbnVtYmVycy4KCkRhbmllbCAoMjQgQXByaWwgMjAwMSkKLSBJJ3ZlIG5vdGljZWQgdGhhdCBGVFBTIGRvZXNuJ3Qgd29yay4gV2UgYXR0ZW1wdCB0byB1c2Ugc3NsIGV2ZW4gZm9yIHRoZQogIGRhdGEgdHJhbnNmZXIsIHdoaWNoIGNhdXNlcyB0aGUgdHJhbnNmZXIgdG8gJ2hhbmcnLi4uIFdlIG5lZWQgdG8gZml4IHRoaXMuCgotIEltcHJvdmVkIHRoZSB0ZXN0IHN1aXRlIHRvIHVzZSAnc3R1bm5lbCcgdG8gZG8gSFRUUFMgYW5kIEZUUFMgdGVzdGluZyBvbgogIHRoZSBhbHJlZHkgd3JpdHRlbiBwZXJsIHNlcnZlcnMgZWFzaWx5LgoKRGFuaWVsICgyMyBBcHJpbCAyMDAxKQotIFRoZSBPcGVuU1NMIHZlcnNpb24gc3RyaW5nIHJlY2VudGx5IG1vZGlmaWVkIGRpZG4ndCB6ZXJvIHRlcm1pbmF0ZSBvbmUKICBvZiB0aGUgZ2VuZXJhdGVkIHN0cmluZ3MgcHJvcGVybHksIHdoaWNoIGNvdWxkIGxlYWQgdG8gYSBjcmFzaCBvciBzaW1wbHkKICB3ZWlyZCB2ZXJzaW9uIHN0cmluZyBvdXRwdXQhCgpWZXJzaW9uIDcuNy4yCgpEYW5pZWwgKDIyIEFwcmlsIDIwMDEpCi0gUm9zaW1pbGRvIGRhIFNpbHZhIHVwZGF0ZWQgdGhlIE1ha2VmaWxlcyBmb3IgQm9ybGFuZC9XaW5kb3dzLgoKLSBFcmljIFJhdXRtYW4gcG9pbnRlZCBvdXQgYSBwcm9ibGVtIHdpdGggcGVyc2lzdGVudCBjb25uZWN0aW9ucyB0aGF0IHdvdWxkCiAgbGVhZCB0byBicm9rZW4gSG9zdDogaGVhZGVycyBpbiB0aGUgc2Vjb25kIEhUVFAgcmVxdWVzdC4KCkRhbmllbCAoMjAgQXByaWwgMjAwMSkKLSBBZGRlZCBtYW4gcGFnZXMgZm9yIHRoZSBjdXJsX3N0cmVxdWFsKCkgYW5kIGN1cmxfbXByaW50ZigpIGZhbWlsaWVzLiBXcm90ZQogIGEgJ2xpYmN1cmwgb3ZlcnZpZXcnIG1hbiBwYWdlLgoKLSBTcGVsbC1maXhlZCBzb21lIGRvY3VtZW50cy4KCi0gUy4gTW9vbmVzYW15IGNvcnJlY3RlZCBtaXN0YWtlcyBpbiB0aGUgbWFuIHBhZ2UuCgotIENyaXMgQmFpbGlmZiBmaXhlZCB0aGUgY3VybF9zbGlzdHMgb3B0aW9ucyBpbiB0aGUgcGVybCBpbnRlcmZhY2UsIHByZXNlbnQKICBzZXBhcmF0ZWx5IGluIHRoZSBDdXJsOjplYXN5IDEuMS40IHBhY2thZ2UuCgpEYW5pZWwgKDE5IEFwcmlsIDIwMDEpCi0gTGludXMgTmllbHNlbiBGZWx0emluZyByZW1vdmVkIHRoZSBkZWNpbWFscyBmcm9tIHRoZSBzaXplIHZhcmlhYmxlcyBpbiB0aGUKICAtLXdyaXRlLW91dCBvdXRwdXQuIFdlIGhhcmRseSBldmVyIGdldCBmcmFjdGlvbiBvZiBieXRlcyEgOi0pCgpWZXJzaW9uIDcuNy4yLXByZTEKCkRhbmllbCAoMTkgQXByaWwgMjAwMSkKCi0gQWxiZXJ0IENoaW4gcHJvdmlkZWQgYSBjb25maWd1cmUgcGF0Y2ggZm9yIHRoZSBBQ19TWVNfTEFSR0VGSUxFIG1hY3JvLgoKRGFuaWVsICgxOCBBcHJpbCAyMDAxKQotIElucHV0IGZyb20gTWljaGFlbCBNZWFsbGluZyBtYWRlIG1lIGFkZCAtLWZlYXR1cmUgdG8gY3VybC1jb25maWcuIEl0CiAgZGlzcGxheXMgYSBsaXN0IG9mIGZlYXR1cmVzIHRoYXQgaGF2ZSBiZWVuIGJ1aWx0LWluIGluIHRoZSBjdXJyZW50CiAgbGliY3VybC4gVGhlIGN1cnJlbnRseSBhdmFpbGFibGUgZmVhdHVyZXMgdGhhdCBjYW4gYmUgbGlzdGVkIGFyZTogU1NMLCBLUkI0CiAgYW5kIElQdjYuCgotIEkgY29tbWl0dGVkIENyaXMgYW5kIEdlb3JnJ3MgcGVybCBpbnRlcmZhY2Ugd29yay4gVGhleSd2ZSBnb3QgY2FsbGJhY2tzCiAgd29ya2luZyBhbmQgb3B0aW9ucyB0aGF0IHJlY2VpdmVzIHRob3NlIHNsaXN0IHBvaW50ZXJzLgoKLSBQdW5lZXQgUGF3YWlhIGRldGVjdGVkIGEgcHJvYmxlbSB3aXRoIHJlc3VtZWQgZG93bmxvYWRzIHRoYXQgdXNlIHBlcnNpc3RlbnQKICBjb25uZWN0aW9ucyBhbmQgSSBtYWRlIGEgcmF0aGVyIGxhcmdlIHdyaXRldXAgdG8gY29ycmVjdCB0aGlzLiBJdCBpcwogIGltcG9ydGFudCB0aGF0IGFsbCBzZXNzaW9uLWRhdGEgaXMgc3RvcmVkIGluIHRoZSBjb25uZWN0ZGF0YSBzdHJ1Y3QgYW5kIG5vdAogIGluIHRoZSBtYWluIHN0cnVjdCBhcyB0aGlzIHByZXZpb3VzbHkgZGlkLgoKRGFuaWVsICgxNyBBcHJpbCAyMDAxKQotIEZyZWRlcmljIExlcGllZCBmaXhlZCBhIGZ0cCByZXN1bWVkIGRvd25sb2FkIHByb2JsZW0gYW5kIGludHJvZHVjZWQgYSBuZXcKICBlcnJvciBjb2RlIHRoYXQgbGV0cyBhcHBsaWNhdGlvbnMgYmUgYWJsZSB0byBkZXRlY3Qgd2hlbiBhIHJlc3VtZWQgZG93bmxvYWQKICBhY3R1YWxseSBkaWRuJ3QgZG93bmxvYWQgYW55dGhpbmcgc2luY2UgdGhlIHdob2xlIGZpbGUgaXMgYWxyZWFkeSBwcmVzZW50LgogIFNob3VsZCB0aGlzIHJldHVybiBPSyBpbnN0ZWFkPwoKLSBJIGFkZGVkICdjdXJsLWNvbmZpZy5pbicgdG8gdGhlIHJvb3QgZGlyIGFuZCBjb25maWd1cmUgc2NyaXB0LiBOb3csIGEKICBjdXJsLWNvbmZpZyBzY3JpcHQgaXMgbWFkZSB3aGVuIGN1cmwgaXMgYnVpbHQuIFRoZSBzY3JpcHQgY2FuIGJlIHVzZWQgdG8KICBmaWd1cmUgb3V0IGNvbXBpbGUgdGltZSBvcHRpb25zIHVzZWQgd2hlbiBsaWJjdXJsIHdhcyBidWlsdCwgd2hpY2ggaW4gdHVybgogIHNob3VsZCBiZSBvcHRpb25zIFlPVSBzaG91bGQgdXNlIHRvIGJ1aWxkIGFwcGxpY2F0aW9ucyB0aGF0IHVzZSBsaWJjdXJsLgoKICBUaGlzICotY29uZmlnIHN0eWxlIGlzIG5vdCBhIG5ldyBpZGVhLCBidXQgc29tZXRoaW5nIHRoYXQgaGFzIGJlZW4gdXNlZAogIHN1Y2Nlc3NmdWxseSBpbiBvdGhlciAobGlicmFyeSBiYXNlZCkgcHJvamVjdHMuCgotIFBoaWwgS2FybiBwb2ludGVkIG91dCB0aGF0IGxpYmN1cmwgd3JvbmdseSBkaWQgbm90IGFsd2F5cyB1c2UgR01UIHRpbWUgem9uZQogIGZvciB0aGUgSWYtTW9kaWZpZWQtU2luY2Ugc3R5bGUgaGVhZGVycy4KCi0gR2VvcmcgU2Nod2FyeiBwb2ludGVkIG91dCBhbiBleHRyYSBuZWVkZWQgI2luY2x1ZGUgZmlsZSBuZWVkZWQgaW4gc3JjL21haW4uYwogIGZvciBjdXJsIHRvIGJ1aWxkIG9uIFVsdHJpeC4KCkRhbmllbCAoMTEgQXByaWwgMjAwMSkKLSBDcmlzIEJhaWxpZmYgcG9pbnRlZCBvdXQgdHdvIHByb2JsZW1zIHRoYXQgSSBjb3JyZWN0ZWQuIEZpcnN0LCBsaWJjdXJsJ3MgdXNlCiAgb2YgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIEhUVFBfUFJPWFkgaW4gdXBwZXJjYXNlIG1heSBiZWNvbWUgYSBzZWN1cml0eQogIGhhemFyZCB3aGVuIHBlb3BsZSB1c2UgbGliY3VybCBpbiBhIHNlcnZlci9jZ2kgc2l0dWF0aW9uIHdoZXJlIHRoZSBzZXJ2ZXIKICBzZXRzIHRoZSBIVFRQXyotdmFyaWFibGVzIGFjY29yZGluZyB0byBpbmNvbWluZyBoZWFkZXJzIGluIHRoZSBIVFRQCiAgcmVxdWVzdC4gVGh1cywgYSAiUHJveHk6Ii1oZWFkZXIgd291bGQgc2V0IHRoYXQgZW52aXJvbm1lbnQgdmFyaWFibGUhCgogIFRoZW4sIGludm9raW5nIGN1cmxfZWFzeV9wZXJmb3JtKCkgd2l0aG91dCBoYXZpbmcgYW4gVVJMIHNldCBjYXVzZWQgYSBjcmFzaC4KCi0gUy4gTW9vbmVzYW15IGJyb3VnaHQgYSBwYXRjaCB0aGF0IG1ha2UgY3VybCB1c2Ugbm9uLWJsb2NraW5nIGNvbm5lY3RzIG9uCiAgd2luZG93cyB3aGVuIGNvbm5lY3Rpb24gdGltZW91dCBpcyBzZXQsIGFzIGl0IGFsbG93cyB3aW5kb3dzIHVzZXJzIHRvIHNldAogIHRoYXQgdGltZW91dCEKCi0gSGlyb3Rha2EgTWF0c3V5dWtpIHdyb3RlIGEgUnVieSBpbnRlcmZhY2UgdG8gbGliY3VybCEKCi0gQ3JpcyBCYWlsaWZmLCBGb3JyZXN0IENhaG9vbiBhbmQgR2VvcmcgSG9ybiB3b3JrIG9uIHRoZSBQZXJsIGludGVyZmFjZS4KCi0gSSd2ZSB3cml0dGVuIGEgZmlyc3Qgc2hvdCBhdCBhIEphdmEgaW50ZXJmYWNlIHRvIGxpYmN1cmwuIE1hbnkgdGhhbmtzIHRvCiAgRGFuaWVsIE1hcmVsbCBmb3IgdGlyZWxlc3NseSBhbnN3ZXJpbmcgdG8gYWxsIG15IGJhc2ljIEphdmEgcXVlc3Rpb25zLiBJdAogIHdvcmtzLCBidXQgaXQgaXMgc3RpbGwgdmVyeSBiYXNpYy4KCkRhbmllbCAoMTAgQXByaWwgMjAwMSkKLSBUaGUgcHJvZ3Jlc3MgZGlzcGxheSBjb3VsZCBnZXQgc2lsbHkgd2hlbiBkb2luZyBtdWx0aXBsZSBmaWxlIHRyYW5zZmVycywgYXMKICBpdCB3YXNuJ3QgcHJvcGVybHkgcmVzZXQgYmV0d2VlbiB0cmFuc2ZlcnMhCgotIERpc2N1c3Npb25zIHdpdGggQ3JpcyBCYWlsaWZmIHdobyB3cml0ZXMgYSBQZXJsIGludGVyZmFjZSB0byBsaWJjdXJsLCBtYWRlCiAgbWUgYWRkIENVUkxPUFRfSEVBREVSRlVOQ1RJT04uIEl0IGNhbiBiZSB1c2VkIHRvIHNldCBhIHNlcGFyYXRlIGNhbGxiYWNrCiAgZnVuY3Rpb24gZm9yIHdyaXRpbmcgaGVhZGVycy4gUHJldmlvdXNseSB5b3UgY291bGQgb25seSBzZXQgYSBkaWZmZXJlbnQgRklMRQogICogd2hlbiBoZWFkZXJzIGFyZSB3cml0dGVuIGZyb20gd2l0aGluIGxpYmN1cmwuCgpEYW5pZWwgKDcgQXByaWwgMjAwMSkKLSBBbmRy6XMgR2FyY+1hIGZpeGVkIGEgcHJvYmxlbSBpbiBjdXJsX2VzY2FwZSgpIGFuZCBwb2ludGVkIG91dCBhIGZsYXcgaW4KICB0aGUgY3VybF9lYXN5X3NldG9wdCBtYW4gcGFnZS4KCkRhbmllbCAoNiBBcHJpbCAyMDAxKQotIEFkanVzdGVkIHRoZSB2ZXJzaW9uIGNvZGUgdG8gcHJvcGVybHkgZGlzcGxheSBPcGVuU1NMIDAuOS42YS4gVGhleSBzdXJlCiAgY2hhbmdlIHRoZWlyIHZlcnNpb24gZGVmaW5lIGZvcm1hdCBvZnRlbi4uLgoKLSBjdXJsX2Zvcm1mcmVlKCkgbm93IGFjY2VwdHMgYSBOVUxMIHBvaW50ZXIgd2l0aG91dCBjcmFzaGluZyEKClZlcnNpb24gNy43LjEKCkRhbmllbCAoMyBBcHJpbCAyMDAxKQotIFB1bmVldCBQYXdhaWEgcG9pbnRlZCBvdXQgdHdvIHNlcmlvdXMgcHJvYmxlbXMuIExpYmN1cmwgd291bGQgYXR0ZW1wdCB0bwogIHJlYWQgYmFkIG1lbW9yeSBkdXJpbmcgc2l0dWF0aW9ucyB3aGVuIGFuIChmdHApIGNvbm5lY3Rpb24gYXR0ZW1wdCBmYWlsZWQuCiAgQWxzbywgdGhlIGxpYi9NYWtlZmlsZS52YzYgd2FzIGNvcnJlY3RlZC4KCi0gTW9yZSBpbnZlc3RpZ2F0aW9ucyBpbiB0aGUgTG9jYXRpb246IGZvbGxvd2luZyBjb2RlIG1hZGUgbWUgcmVhbGl6ZSB0aGF0CiAgaXQgd2FzIG5vdCBjbGVhbiBlbm91Z2ggdG8gd29yayB0cmFuc3BhcmFudGx5IHdpdGggcGVyc2lzdGVudCBhbmQgbm9uLQogIHBlcnNpc3RlbnQgY29ubmVjdGlvbnMuIEkgdGhpbmsgSSd2ZSBmaXhlZCBpdCBub3cuCgpEYW5pZWwgKDI5IE1hcmNoIDIwMDEpCi0gR2VvcmcgSG9ybiBtYWlsZWQgbWUgc29tZSBjb3JyZWN0aW9ucyBmb3IgdGhlIEN1cmw6OmVhc3kgcGVybCBpbnRlcmZhY2UuCgotIEV4cGVyaW1lbnRhbCBmdHBzOi8vIHN1cHBvcnQgYWRkZWQuIEl0IGlzIGJhc2ljYWxseSBGVFAgb3ZlciBTU0wgZm9yIHRoZQogIGNvbnRyb2wgY29ubmVjdGlvbi4gSXQgc3RpbGwgbWFrZXMgYWxsIGRhdGEgdHJhbnNmZXJzIGdvaW5nIG92ZXIgdW5lbmNyeXB0ZWQKICBjb25uZWN0aW9ucy4gUmFpbmVyIFdlaWt1c2F0J3MgZnRwZC1zc2wgc2VydmVyIGhhY2sgc3VwcG9ydHMgdGhpcyBhbmQgSSB1c2VkCiAgdGhhdCB0byB2ZXJpZnkgdGhlIGZ1bmN0aW9uYWxpdHkuCgpEYW5pZWwgKDI3IE1hcmNoIDIwMDEpCi0gR3Vlbm9sZSBCZXNjb24gZGlzY292ZXJlZCB0aGF0IGlmIHlvdSBzZXQgYSBDVVJMT1BUX1RJTUVPVVQgYW5kIHRoZW4gdHJpZWQKICB0byBnZXQgYSBmaWxlIGZyb20gYSBzaXRlIGFuZCBpdCBmYWlscywgdGhlIFNJR0FMUk0gd291bGQgc3RpbGwgYmUgc2VudAogIGFmdGVyIHRoZSB0aW1lb3V0LXRpbWUsIHF1aXRlIGluZXhwZWN0ZWRseSEKCi0gSSBhZGRlZCBhbiBmdHAgdHJhbnNmZXIgZXhhbXBsZSB0byBkb2NzL2V4YW1wbGVzLyBhbmQgSSBhbHNvIHdyb3RlIGEgdGlueQogIGV4YW1wbGUgbWFrZWZpbGUgdGhhdCBjYW4gYmUgdXNlZCBhcyBhIHN0YXJ0IHdoZW4gYnVpbGRpbmcgb25lIG9mIHRoZQogIGV4YW1wbGVzLgoKVmVyc2lvbiA3LjcuMS1iZXRhMQoKRGFuaWVsICgyNiBNYXJjaCAyMDAxKQotIE1vaGFtZWQgTHJoYXppIHJlcG9ydGVkIHByb2JsZW1zIHdpdGggNy42LjEgYW5kIHBlcnNpc3RlbnQgSFRUUC8xLjAKICBjb25uZWN0aW9ucyAod2hlbiB0aGUgc2VydmVyIHJlcGxpZWQgYSBDb25uZWN0aW9uOiBLZWVwLUFsaXZlKSBhbmQgdGhpcwogIHByb2JsZW0gd2FzIG5vdCBwcm9wZXJseSBkZWFsdCB3aXRoIGluIDcuNyBlaXRoZXIuIEEgcGF0Y2ggd2FzIHBvc3RlZCB0byB0aGUKICBjdXJsLWFuZC1waHAgbWFpbGluZyBsaXN0LgoKRGFuaWVsICgyNCBNYXJjaCAyMDAxKQotIENvbGluIFdhdHNvbiByZXBvcnRlZCBhYm91dCBhIHByb2JsZW0gYW5kIGJyb3VnaHQgYSBwYXRjaCB0aGF0IGNvcnJlY3RlZCBpdCwKICB3aGljaCB3YXMgYWJvdXQgdGhlIG1hbiBwYWdlIGFuZCBsaW5lcyBzdGFydGluZyB3aXRoIGEgc2luZ2xlIHF1b3RlICgnKSBpbiBhCiAgd2F5IHRoYXQgZ25yb2ZmIGRvZXNuJ3QgbGlrZS4KCkRhbmllbCAoMjMgTWFyY2ggMjAwMSkKLSBQZXRlciBCcmF5IHJlcG9ydGVkIGNvcnJlY3RseSB0aGF0IHRoZSByb290IG1ha2VmaWxlIHVzZWQgbWFrZSBpbnN0ZWFkIG9mCiAgJChNQUtFKSBmb3IgdGhlIHRlc3QgdGFyZ2V0LgoKLSBDb3JyZWN0ZWQgdGhlIEN1cmw6OmVhc3kgcGVybCBpbnRlcmZhY2UgdG8gdXNlIGN1cmxfZWFzeV9zZXRvcHQoKSBhbmQgbm90CiAgY3VybF9zZXRvcHQoKSB3aGljaCB3YXMgcmVtb3ZlZCBpbiA3LjchCgotIFMuIE1vb25lc2FteSBwcm92aWRlZCB1cGRhdGVzIG9uIHRocmVlIGRvY3VtZW50cyAoTUFOVUFMLCBJTlNUQUxMIGFuZCBGQVEpLgoKLSBXaGVuIGZvbGxvd2luZyBhIExvY2F0aW9uOiwgbGliY3VybCB3b3VsZCBzb21ldGltZXMgd3JpdGUgdG8gdGhlIFVSTCBzdHJpbmcKICBpbiBhIHdheSBpdCBzaG91bGRuJ3QuIEFzIHRoZSBwb2ludGVyIGlzIHBhc3NlZC1pbiB0byBsaWJjdXJsIGZyb20gYW4KICBhcHBsaWNhdGlvbiwgd2UgY2FuJ3QgYmUgYWxsb3dlZCB0byB3cml0ZSB0byBpdC4gVGhlIHBhcnRpY3VsYXIgYnVnIHJlcG9ydAogIGZyb20gJ25rJyB0aGF0IGJyb3VnaHQgdGhpcyB1cCB3YXMgYmVjYXVzZSBoZSBoYWQgYSByZWFkLW9ubHkgVVJMIHRoYXQgdGhlbgogIGNhdXNlZCBhIGxpYmN1cmwgY3Jhc2ghCgotIE5vIGxvbmdlciByZWFkcyBIRUFEIHJlc3BvbnNlcyBsb25nZXIgdGhhbiB0byB0aGUgbGFzdCBoZWFkZXIuIFByZXZpb3VzbHksCiAgY3VybCB3b3VsZCByZWFkIHRoZSBmdWxsIHJlcGx5IGlmIHRoZSBjb25uZWN0aW9uIHdhcyBhICJjbG9zZSIgb25lLgoKLSBsaWJjdXJsIGRpZCByZS11c2UgY29ubmVjdGlvbnMgd2F5IHRvbyBtdWNoLiBEb2luZyAiY3VybAogIGh0dHA6Ly93d3cue21pY3Jvc29mdCxpYm19LmNvbSIgd291bGQgbWFrZSBpdCByZS11c2UgdGhlIGNvbm5lY3Rpb24gd2hpY2gKICBtYWRlIHRoZSBzZWNvbmQgcmVxdWVzdCByZXR1cm4gdmVyeSBvZGQgcmVzdWx0cy4KCkRhbmllbCAoMjIgTWFyY2ggMjAwMSkKLSBFZGluIEthZHJpYmFzaWMgbWFkZSBtZSBhd2FyZSB0aGF0IGN1cmwgc2hvdWxkIG5vdCByZS1zZW5kIFBPU1QgcmVxdWVzdHMKICB3aGVuIGZvbGxvd2luZyAzMDItcmVkaXJlY3RzLiBJIG1hZGUgMzAyIHdvcmsgbGlrZSAzMDMgd2hpY2ggbWVhbnMgY3VybCB1c2VzCiAgR0VUIGluIHRoZSBmb2xsb3dpbmcgcmVxdWVzdChzKS4KCi0gbGliY3VybCBub3cgcmVzZXQgdGhlICJmb2xsb3dlZC1sb2NhdGlvbiIgY291bnRlciBvbiBlYWNoIGludm9rZSBvZgogIGN1cmxfZWFzeV9wZXJmb3JtKCkgYXMgaXQgb3RoZXJ3aXNlIHdvdWxkIHN1bSB1cCBhbGwgcmVkaXJlY3RzIG9uIHRoZSBzYW1lCiAgY29ubmVjdGlvbiBhbmQgdGh1cyBjb3VsZCByZWFjaCB0aGUgbWF4cmVkaXJzIGNvdW50ZXIgd3JvbmdseS4KCi0gSmltIERyYXNoIHN1Z2dlc3RlZCBjdXJsX2VzY2FwZSgpIHNob3VsZCBub3QgcmUtZW5jb2RlIHdoYXQgYWxyZWFkeSBsb29rcwogIGxpa2UgYW4gZW5jb2RlZCBzZXF1ZW5jZSBhbmQgSSB0aGluayB0aGF0J3MgYSBmYWlyIHN1Z2dlc3Rpb24uCgpWZXJzaW9uIDcuNwoKRGFuaWVsICgyMiBNYXJjaCAyMDAxKQotIFRoZSBjb25maWd1cmUgc2NyaXB0IG5vdyBmYWlscyB3aXRoIGFuIGVycm9yIG1lc3NhZ2UgaWYgZ2V0aG9zdGJ5bmFtZV9yKCkgaXMKICBkZXRlY3RlZCBidXQgaXQgY291bGRuJ3QgZmlndXJlIG91dCBob3cgdG8gaW52b2tlIGl0ICh3aGF0IGFtb3VudCBvZgogIGFyZ3VtZW50cyBpdCBpcyBzdXBwb3NlZCB0byBnZXQpLiBSZXBvcnRzIGZyb20gQW5kculzIEdhcmPtYSBtYWRlIG1lIGF3YXJlCiAgb2YgdGhpcyBuZWVkLgoKLSBUYWxraW5nIHdpdGggSmltIERyYXNoIG1hZGUgbWUgZmluYWxseSBwdXQgdGhlIGN1cmxfZXNjYXBlIGFuZCBjdXJsX3VuZXNjYXBlCiAgZnVuY3Rpb25zIGluIHRoZSBjdXJsLmggaW5jbHVkZSBmaWxlIGFuZCB3cml0ZSBtYW4gcGFnZXMgZm9yIHRoZW0uIFRoZQogIGVzY2FwZSBmdW5jdGlvbiB3YXMgbW9kaWZpZWQgdG8gdXNlIHRoZSBzYW1lIGludGVyZmFjZSBhcyB0aGUgdW5lc2NhcGUgb25lCiAgaGFkLgoKLSBObyBidWcgcmVwb3J0cyBhdCBhbGwgb24gdGhlIGxhdGVzdCBiZXRhcy4gUmVsZWFzZSB0aW1lIGNvbWluZyB1cC4KClZlcnNpb24gNy43LWJldGE1CgpEYW5pZWwgKDE5IE1hcmNoIDIwMDEpCi0gR2VvcmcgT3R0aW5nZXIgcmVwb3J0ZWQgcHJvYmxlbXMgd2l0aCB1c2luZyAtQyB0b2dldGhlciB3aXRoIC1MIGluIHRoZSBzZW5zZQogIHRoYXQgdGhlIC1DIGluZm8gZ290IGxvc3Qgd2hlbiBpdCB3YXMgcmVkaXJlY3RlZC4gSSBjb3VsZCBub3QgcmVwZWF0IHRoaXMKICBwcm9ibGVtIG9uIHRoZSA3LjcgYnJhbmNoIHdoeSBJIGxlYXZlIHRoaXMgZm9yIHRoZSBtb21lbnQuIFRlc3QgY2FzZSAzOSB3YXMKICBhZGRlZCB0byBkbyBleGFjdGx5IHRoaXMsIGFuZCBpdCBzZWVtcyB0byBkbyByaWdodC4KCi0gQ2hyaXN0aWFuIFJvYm90dG9tIFJlaXMgcmVwb3J0ZWQgaG93IGhpcyA3LjcgYmV0YSBkaWRuJ3Qgc3VjY2Vzc2Z1bGx5IGRvCiAgZm9ybSBwb3N0cyBhcyBlbGVnYW50bHkgYXMgNy42LjEgZGlkLiBJbmRlZWQsIHRoaXMgd2FzIGEgZmxhdyBpbiB0aGUgaGVhZGVyCiAgZW5naW5lLCBhcyBIVFRQIDEuMSBoYXMgaW50cm9kdWNlZCBhIG5ldyAxMDAgInRyYW5zaWVudCIgcmV0dXJuIGNvZGUgZm9yIFBVVAogIGFuZCBQT1NUIG9wZXJhdGlvbnMgdGhhdCBJIG5lZWQgdG8gYWRkIHN1cHBvcnQgZm9yLiBTZWN0aW9uIDguMi4zIGluIFJGQzI2MTYKICBoYXMgYWxsIHRoZSBkZXRhaWxzLiBTZWVtcyB0byB3b3JrIG5vdyEKCkRhbmllbCAoMTYgTWFyY2ggMjAwMSkKLSBBZnRlciBoYXZpbmcgZXhwZXJpZW5jZWQgYW5vdGhlciBtYWNoaW5lIGJyZWFrLWRvd24sIHdlJ3JlIGJhY2suCgotIEdlb3JnIEhvcm4ncyBwZXJsIGludGVyZmFjZSBDdXJsOjplYXN5IGlzIG5vdyBpbmNsdWRlZCBpbiB0aGUgY3VybCByZWxlYXNlCiAgYXJjaGl2ZS4gVGhlIHBlcmwvIGRpcmVjdG9yeSBpcyBub3cgcHJlc2VudC4gUGxlYXNlIGhlbHAgbWUgd2l0aCBkb2NzLAogIGV4YW1wbGVzIGFuZCB1cGRhdGVzIHlvdSB0aGluayBmaXQuCgotIE1hZGUgYSBuZXcgcGhwLyBkaXJlY3RvcnkgaW4gdGhlIHJlbGVhc2UgYXJjaGl2ZSBhbmQgbW92ZWQgdGhlIFBIUCBleGFtcGxlcwogIGludG8gYSBzdWJkaXJlY3RvcnkgaW4gdGhlcmUuIE5vdCBtdWNoIFBIUCBpbmZvIHlldCwgYnV0IEkgcGxhbiB0by4gUGxlYXNlCiAgaGVscCBtZSBoZXJlIGFzIHdlbGwhCgotIE1hZGUgbGliY3VybCByZXR1cm4gZXJyb3IgaWYgYSB0cmFuc2ZlciBpcyBhYm9ydGVkIGluIHRoZSBtaWRkbGUgb2YgYQogICJjaHVuayIuIEl0IGFjdHVhbGx5IGVuYWJsZXMgbGliY3VybCB0byBkaXNjb3ZlciBwcmVtYXR1cmUgdHJhbnNmZXIgYWJvcnRzCiAgZXZlbiBpZiB0aGUgQ29udGVudC1MZW5ndGg6IHNpemUgaXMgdW5rbm93bi4KCkRhbmllbCAoMTUgTWFyY2ggMjAwMSkKLSBBZGRlZCAtLWNvbm5lY3QtdGltZW91dCB0byBjdXJsLCB3aGljaCBzZXRzIHRoZSBuZXcgQ1VSTE9QVF9DT05ORUNUVElNRU9VVAogIG9wdGlvbiBpbiBsaWJjdXJsLiBJdCBsaW1pdHMgdGhlIHRpbWUgY3VybCBpcyBhbGxvd2VkIHRvIHNwZW5kIGluIHRoZQogIGNvbm5lY3Rpb24gcGhhc2UuIFRoaXMgZGlmZmVycyBmcm9tIC1tLy0tbWF4LXRpbWUgdGhhdCBsaW1pdHMgdGhlIGVudGlyZQogIGZpbGUgdHJhbnNmZXIgb3BlcmF0aW9uLiBSZXF1ZXN0ZWQgYnkgTGFycnkgRmFobm9lIGFuZCBvdGhlcnMuCgogIEkgYWxzbyB1cGRhdGVkIHRoZSBjdXJsLjEgYW5kIGN1cmxfZWFzeV9zZXRvcHQuMyBtYW4gcGFnZXMgYW5kIHJlbW92ZWQgdGhlCiAgaXRlbSBmcm9tIHRoZSBUT0RPLgoKVmVyc2lvbiA3LjctYmV0YTQKCkRhbmllbCAoMTQgTWFyY2ggMjAwMSkKLSBNYWRlIGN1cmwgZ3JvayBJUHY2IHdpdGggSFRUUCBwcm94aWVzIGFuZCBnb3QgZXZlcnl0aGluZyB0byBjb21waWxlIG5pY2VseQogIGFnYWluIHdoZW4gRU5BQkxFX0lQVjYgaXMgc2V0LgoKICBJIG5lZWQgdG8gcmVtYWtlIHRoaW5ncyBpbiB0aGUgdGVzdCBzdWl0ZS4gSSBjYW4ndCB0ZXN0IHRoZSBGVFAgcGFydHMgd2l0aAogIGN1cmwgYnVpbHQgZm9yIElQdjYgYXMgaXQgdXNlcyBhIGRpZmZlcmVudCBzZXQgb2YgRlRQIGNvbW1hbmRzIHRoZW4hCgotIEkgZmVsbCBvbnRvIGEgYnVnIHJlcG9ydCBvbiBwaHAubmV0IChwb3N0ZWQgYnkgTGFycyBUb3JiZW4gV2lsc29uKSB0aGF0IHdhcwogIGEgcmVwb3J0IG1lYW50IGZvciBvdXIgcHJvamVjdC4gQW55d2F5LCBpdCBzYWlkIHRoZSAubmV0cmMgcGFyc2luZyBkaWRuJ3QKICB3b3JrIGFzIHN1cHBvc2VkLCBhbmQgYXMgSSBhZ3JlZWQgd2l0aCBMYXJzLCBJIG1hZGUgdGhlIG5ldHJjIHBhcnNlciB1c2UKICBnZXRwd3VpZCgpIHRvIGZpZ3VyZSBvdXQgdGhlIGhvbWUgZGlyZWN0b3J5IG9mIHRoZSBlZmZlY3RpdmUgdXNlciBhbmQgdHJ5CiAgdGhhdCBuZXRyYy4gSXQgc3RpbGwgdXNlcyB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgSE9NRSBmb3IgdGhvc2UgdGhhdCBkb24ndAogIGhhdmUgdGhhdCBmdW5jdGlvbiBvciBpZiB0aGUgdXNlciBkb2Vzbid0IHJldHVybiB2YWxpZCBwd2QgaW5mby4KCi0gRWRpbiBLYWRyaWJhaWMgcG9zdGVkIGEgYnVnIHJlcG9ydCB3aGVyZSBoZSBnb3QgYSBjcmFzaCB3aGVuIGEgZmV0Y2ggd2l0aAogIHVzZXIrcGFzc3dvcmQgaW4gdGhlIFVSTCBmb2xsb3dlZCBhIExvY2F0aW9uOiB0byBhIHNlY29uZCBVUkwgKGFic29sdXRlLAogIHdpdGhvdXQgbmFtZStwYXNzd29yZCkuIFRoaXMgYnVnIGhhcyBiZWVuIGFyb3VuZCBmb3IgYSBsb25nIHdoaWxlIGFuZAogIGNyYXNoZXMgZHVlIHRvIGEgcmVhZCBhdCBhZGRyZXNzIHplcm8uIEZpeGVkIG5vdy4gV3JvdGUgdGVzdCBjYXNlIDM4LCB0aGF0CiAgdGVzdHMgdGhpcy4KCi0gTW9kaWZpZWQgdGhlIHRlc3Qgc3VpdGUncyBodHRwc2VydmVyIHNsaWdodGx5IHRvIGFwcGVuZCBhbGwgY2xpZW50IHJlcXVlc3QKICBkYXRhIHRvIGl0cyBsb2cgZmlsZSBzbyB0aGF0IHRoZSB0ZXN0IHNjcmlwdCBub3cgYmV0dGVyIGNhbiB2ZXJpZnkgYSByYW5nZQogIG9mIHJlcXVlc3RzIGFuZCBub3Qgb25seSB0aGUgbGFzdCBvbmUsIGFzIGl0IGRpZCBwcmV2aW91c2x5LgoKLSBVcGRhdGVkIHRoZSBjdXJsIG1hbiBwYWdlIHdpdGggLS1yYW5kb20tZmlsZSBhbmQgLS1lZ2QtZmlsZSBkZXRhaWxzLgoKVmVyc2lvbiA3LjctYmV0YTMKCkRhbmllbCAoMTQgTWFyY2ggMjAwMSkKLSBCavZybiBTdGVuYmVyZyBwcm92aWRlZCBzaW1pbGFyIGZpeGVzIGFzIEr2cm4gZGlkIGFuZCBzb21lIGFkZGl0aW9uYWwgcGF0Y2hlcwogIGZvciBub24tU1NMIGNvbXBpbGVzLgoKLSBJIGluY3JlYXNlZCB0aGUgaW50ZXJmYWNlIG51bWJlciBmb3IgbGliY3VybCBhcyBJJ3ZlIHJlbW92ZWQgdGhlIGxvdyBsZXZlbAogIGZ1bmN0aW9ucyBmcm9tIHRoZSBpbnRlcmZhY2UuIEkgYWxzbyB0b29rIHRoaXMgb3Bwb3J0dW5pdHkgdG8gcmVuYW1lIHRoZQogIEN1cmxfc3RyZXF1YWwgZnVuY3Rpb24gdG8gY3VybF9zdHJlcXVhbCBhbmQgQ3VybF9zdHJuZXF1YWwgdG8KICBjdXJsX3N0cm5lcXVhbCwgYXMgdGhleSdyZSBwdWJsaWMgbGliY3VybCBmdW5jdGlvbnMgKGV2ZW4gaWYgdGhleSdyZSBzdGlsbAogIHVuZG9jdW1lbnRlZCkuCgogIFRoaXMgd2lsbCBtYWtlIG9sZGVyIHByb2dyYW1zIG5vdCBjYXBhYmxlIG9mIHVzaW5nIHRoZSBuZXcgbGliY3VybCB3aXRoCiAganVzdCBhIGRyb3AtaW4gcmVwbGFjZW1lbnQuCgotIEr2cm4gSGFydHJvdGggdXBkYXRlZCBzdHVmZiBmb3Igd2luMzIgY29tcGlsZXM6CiAgbyBjb25maWctd2luMzIuaCB3YXMgZml4ZWQgZm9yIHNvY2tsZW5fdAogIG8gbGliL3NzbHVzZS5jIGhhZCBhIGJhZCAjZW5kaWYgcGxhY2VtZW50CiAgbyBsaWIvZmlsZS5jIHdhcyBtYWRlIHRvIGNvbXBpbGUgb24gd2luMzIgYWdhaW4KICBvIGxpYi9NYWtlZmlsZS5tMzIgd2FzIHVwZGF0ZWQgd2l0aCB0aGUgbmV3IGZpbGVzCiAgbyBsaWIvbGliY3VybC5kZWYgbWF0Y2hlcyB0aGUgY3VycmVudCBpbnRlcmZhY2Ugc3RhdGUKCkRhbmllbCAoMTMgTWFyY2ggMjAwMSkKLSBJdCBvbmx5IHRvb2sgYW4gaG91ciBvciBzbyBiZWZvcmUgSvZybiBIYXJ0cm90aCBmb3VuZCBhIHByb2JsZW0gaW4gdGhlCiAgY2h1bmtlZCB0cmFuc2Zlci1lbmNvZGluZy4gR2l2ZW4gaGlzIGZpbmUgZXhhbXBsZS1zaXRlLCBJIGNvdWxkIGVhc2lseSBzcG90CiAgdGhlIHByb2JsZW0gYW5kIHdoZW4gSSByZS1yZWFkIHRoZSBzcGVjICh0aGUgcGFydCBJIGhhdmUgcGFzdGVkIGluIHRoZSB0b3AKICBvZiB0aGUgaHR0cF9jaHVua3MuaCBmaWxlKSwgSSByZWFsaXplZCBJIGhhZCBtYWRlIG15IHN0YXRlLW1hY2hpbmUgc2xpZ2h0bHkKICB3cm9uZyBhbmQgZGlkbid0IGV4cGVjdC9oYW5kbGUgdGhlIHRyYWlsaW5nIENSTEYgdGhhdCBjb21lcyBhZnRlciB0aGUgZGF0YQogIGluIGVhY2ggY2h1bmsgKGFuZCB0aG9zZSBleHRyYSB0d28gYnl0ZXMgc3VyZSBmZWVsIHdhc3RlZCkuCgogIEhhZCB0byBtb2RpZnkgdGVzdCBjYXNlIDM0IHRvIG1hdGNoIHRoaXMgYXMgd2VsbC4KClZlcnNpb24gNy43LWJldGEyCgpEYW5pZWwgKDEzIE1hcmNoIDIwMDEpCi0gQWRkZWQgdGhlIHBvbGljeSBzdHVmZiB0byB0aGUgY3VybF9lYXN5X3NldG9wdCBtYW4gcGFnZSBmb3IgdGhlIHR3byBzdXBwb3J0ZWQKICBwb2xpY2llcy4KCi0gSW1wbGVtZW50ZWQgc29tZSBzdXBwb3J0IGZvciB0aGUgQ1VSTE9QVF9DTE9TRVBPTElDWSBvcHRpb24uIFRoZSBwb2xpY2llcwogIENVUkxDTE9TRVBPTElDWV9MRUFTVF9SRUNFTlRMWV9VU0VEIGFuZCBDVVJMQ0xPU0VQT0xJQ1lfT0xERVNUIGFyZSBub3cKICBzdXBwb3J0ZWQsIGFuZCB0aGUgImxlYXN0IHJlY2VudGx5IHVzZWQiIGlzIHVzZWQgYXMgZGVmYXVsdCBpZiBubyBwb2xpY3kKICBpcyBjaG9zZW4uCgpEYW5pZWwgKDEyIE1hcmNoIDIwMDEpCi0gQWRkZWQgQ1VSTE9QVF9SQU5ET01fRklMRSBhbmQgQ1VSTE9QVF9FR0RTT0NLRVQgdG8gbGliY3VybCBmb3Igc2VlZGluZyB0aGUKICBTU0wgcmFuZG9tIGVuZ2luZS4gVGhlIHJhbmRvbSBzZWVkaW5nIHN1cHBvcnQgd2FzIGFsc28gYnJvdWdodCB0byB0aGUgY3VybAogIGNsaWVudCB3aXRoIHRoZSBuZXcgb3B0aW9ucyAtLXJhbmRvbS1maWxlIDxmaWxlPiBhbmQgLS1lZ2QtZmlsZSA8ZmlsZT4uIEkKICBuZWVkIHNvbWUgcGVvcGxlIHRvIHJlYWxseSB0ZXN0IHRoaXMgdG8ga25vdyB0aGV5IHdvcmsgYXMgc3VwcG9zZWQuIFJlbWVtYmVyCiAgdGhhdCBsaWJjdXJsIG5vdyBpbmZvcm1zIChpZiB2ZXJib3NlIGlzIG9uKSBpZiB0aGUgcmFuZG9tIHNlZWQgaXMgY29uc2lkZXJlZAogIHdlYWsgKEhUVFBTIGNvbm5lY3Rpb25zKS4KCi0gTWFkZSB0aGUgY2h1bmtlZCB0cmFuc2Zlci1lbmNvZGluZyBlbmdpbmUgZGV0ZWN0ZWQgYmFkIGZvcm1hdHRlZCBkYXRhIGxlbmd0aAogIGFuZCByZXR1cm4gZXJyb3IgaWYgc28gKHdlIGNhbid0IHBvc3NpYmx5IGV4dHJhY3Qgc2Vuc2libGUgZGF0YSBpZiB0aGlzIGlzCiAgdGhlIGNhc2UpLiBBZGRlZCBhIHRlc3QgY2FzZSB0aGF0IGRldGVjdHMgdGhpcy4gTnVtYmVyIDM2LiBOb3cgdGhlcmUgYXJlIDYwCiAgdGVzdCBjYXNlcy4KCi0gQWRkZWQgNSBuZXcgbGliY3VybCBvcHRpb25zIHRvIGN1cmwvY3VybC5oIHRoYXQgY2FuIGJlIHVzZWQgdG8gY29udHJvbCB0aGUKICBwZXJzaXN0ZW50IGNvbm5lY3Rpb24gc3VwcG9ydCBpbiBsaWJjdXJsLiBUaGV5J3JlIGFsc28gZG9jdW1lbnRlZCAoZmFpcmx5CiAgdGhvcm91Z2hseSkgaW4gdGhlIGN1cmxfZWFzeV9zZXRvcHQuMyBtYW4gcGFnZS4gVGhyZWUgb2YgdGhlbSBhcmUgbm93CiAgaW1wbGVtZW50ZWQsIGFsdGhvdWdoIG5vdCByZWFsbHkgdGVzdGVkIGF0IHRoaXMgcG9pbnQuLi4gQW55d2F5LCB0aGUgbmV3CiAgaW1wbGVtZW50ZWQgb3B0aW9ucyBhcmUgbmFtZWQgQ1VSTE9QVF9NQVhDT05ORUNUUywgQ1VSTE9QVF9GUkVTSF9DT05ORUNULAogIENVUkxPUFRfRk9SQklEX1JFVVNFLiBUaGUgb25lcyBzdGlsbCBsZWZ0IHRvIHdyaXRlIGNvZGUgZm9yIGFyZToKICBDVVJMT1BUX0NMT1NFUE9MSUNZIGFuZCBpdHMgcmVsYXRlZCBvcHRpb24gQ1VSTE9QVF9DTE9TRUZVTkNUSU9OLgoKLSBNYWRlIGN1cmwgKHRoZSBhY3R1YWwgY29tbWFuZCBsaW5lIHRvb2wpIHVzZSB0aGUgbmV3IGxpYmN1cmwgNy43IHBlcnNpc3RlbnQKICBjb25uZWN0aW9uIHN1cHBvcnQgYnkgcmUtdXNpbmcgdGhlIHNhbWUgY3VybCBoYW5kbGUgZm9yIGV2ZXJ5IHNwZWNpZmllZCBmaWxlCiAgdHJhbnNmZXIgYW5kIGFmdGVyIHNvbWUgbW9yZSB0ZXN0IGNhc2UgdHdlYWtpbmcgd2UgaGF2ZSAxMDAlIHRlc3QgY2FzZSBPSy4KICBJIG1hZGUgc29tZSB0ZXN0IGNhc2VzIHJldHVybiBIVFRQLzEuMCBub3cgdG8gbWFrZSBzdXJlIHRoYXQgd29ya3MgYXMgd2VsbC4KCi0gSGFkIHRvIGFkZCAnQ29ubmVjdGlvbjogY2xvc2UnIHRvIHRoZSBoZWFkZXJzIG9mIGEgYnVuY2ggb2YgdGVzdCBjYXNlcyBzbwogIHRoYXQgY3VybCBiZWhhdmVzICJvbGQtc3R5bGUiIHNpbmNlIHRoZSB0ZXN0IGh0dHAgc2VydmVyIGRvZXNuJ3QgZG8gbXVsdGlwbGUKICBjb25uZWN0aW9ucy4uLiBOb3cgSSBnZXQgMTAwJSB0ZXN0IGNhc2UgT0suCgotIFRoZSBjdXJsLmhheHguc2Ugc2l0ZSwgdGhlIG1haW4gY3VybCBtYWlsaW5nIGxpc3QgYW5kIG15IHBlcnNvbmFsIGVtYWlsIGFyZQogIGFsbCBkZWFkIHRvZGF5IGR1ZSB0byBwb3dlciBibGFja291dCBpbiB0aGUgYXJlYSB3aGVyZSB0aGUgbWFpbiBzZXJ2ZXJzIGFyZQogIGxvY2F0ZWQuIEhvcnJpYmxlLgoKLSBJJ3ZlIG1hZGUgcGVyc2lzdGFuY2Ugd29yayBvdmVyIGEgc3F1aWQgSFRUUCBwcm94eS4gSSBmaW5kIGl0IGRpc3R1cmJpbmcKICB0aGF0IGl0IHVzZXMgaGVhZGVycyB0aGF0IGFyZW4ndCBwcmVzZW50IGluIGFueSBIVFRQIHN0YW5kYXJkIHRob3VnaAogIChQcm94eS1Db25uZWN0aW9uOikgYW5kIHRoYXQgbWFrZXMgbWUgZmVlbCB0aGF0IEknbSBub3cgb24gdGhlIGVkZ2Ugb2Ygd2hhdAogIHRoZSBzdGFuZGFyZCBhY3R1YWxseSBkZWZpbmVzLiBJIG5lZWQgdG8gZ2V0IHRoaXMgY29kZSBleGNlcmNpc2VkIG9uIGEgbG90CiAgb2YgZGlmZmVyZW50IEhUVFAgcHJveGllcyBiZWZvcmUgSSBmZWVsIHNhZmUuCgogIE5vdyBJJ20gZmFjaW5nIHRoZSBwcm9ibGVtIHdpdGggbXkgdGVzdCBzdWl0ZSBzZXJ2ZXJzIChib3RoIEZUUCBhbmQgSFRUUCkKICBub3Qgc3VwcG9ydGluZyBwZXJzaXN0ZW50IGNvbm5lY3Rpb25zIGFuZCBsaWJjdXJsIGlzIGRvaW5nIHRoZW0gbm93LiBJIGhhdmUKICB0byBmaXggdGhlIHRlc3Qgc2VydmVycyB0byBnZXQgYWxsIHRoZSB0ZXN0IGNhc2VzIGRvIE9LLgoKRGFuaWVsICg4IE1hcmNoIDIwMDEpCi0gR3Vlbm9sZSBCZXNjb24gcmVwb3J0ZWQgdGhhdCBsaWJjdXJsIGRpZCBvdXRwdXQgZXJyb3JzIHRvIHN0ZGVyciBldmVuIGlmCiAgTVVURSBhbmQgTk9QUk9HUkVTUyB3YXMgc2V0LiBJdCB0dXJuZWQgb3V0IHRvIGJlIGEgYnVnIGFuZCBoYXBwZW5zIGlmCiAgdGhlcmUncyBhbiBlcnJvciBhbmQgbm8gRVJST1JCVUZGRVIgaXMgc2V0LiBUaGlzIGlzIG5vdyBjb3JyZWN0ZWQuCgpWZXJzaW9uIDcuNy1iZXRhMQoKRGFuaWVsICg4IE1hcmNoIDIwMDEpCi0gIlRyYW5zZmVyLUVuY29kaW5nOiBjaHVua2VkIiBpcyBubyBsb25nZXIgYW55IHRyb3VibGUgZm9yIGxpYmN1cmwuIEkndmUKICBhZGRlZCB0d28gc291cmNlIGZpbGVzIGFuZCBJJ3ZlIHJ1biBzb21lIHRlc3QgZG93bmxvYWRzIHRoYXQgbG9vayBmaW5lLgoKLSBIVFRQIEhFQUQgd29ya3MgdG9vLCBldmVuIG9uIDEuMSBzZXJ2ZXJzLgoKRGFuaWVsICg1IE1hcmNoIDIwMDEpCi0gVGhlIGN1cnJlbnQgNTcgdGVzdCBjYXNlcyBub3cgcGFzcyBPSy4gSXQgd291bGQgc3VnZ2VzdCB0aGF0IGxpYmN1cmwgd29ya3MKICB1c2luZyB0aGUgb2xkLXN0eWxlIHdpdGggb25lIGNvbm5lY3Rpb24gcGVyIGhhbmRsZS4gVGhlIHRlc3Qgc3VpdGUgZG9lc24ndAogIGhhbmRsZSBtdWx0aXBsZSBjb25uZWN0aW9ucyB5ZXQgc28gdGhlcmUgYXJlIG5vIHRlc3QgY2FzZXMgZm9yIHRoaXMuCgotIEkgcGF0Y2hlZCB0aGUgdGVsbmV0LmMgaGVhdmlseSB0byBub3QgdXNlIGFueSBnbG9iYWwgdmFyaWFibGVzIGFueW1vcmUuIEl0CiAgc2hvdWxkIG1ha2UgaXQgYSBsb3QgbmljZXIgbGlicmFyeS13aXNlLgoKLSBUaGUgZmlsZTovLyBzdXBwb3J0IHdhcyBtb2RpZmllZCBzbGlnaHRseSB0byB1c2UgdGhlIGludGVybmFsIGNvbm5lY3QtZmlyc3QtCiAgdGhlbi1kbyBhcHByb2FjaC4KCkRhbmllbCAoNCBNYXJjaCAyMDAxKQotIE1vcmUgYnVncyBlcmFzZWQuCgpWZXJzaW9uIDcuNy1hbHBoYTIKCkRhbmllbCAoNCBNYXJjaCAyMDAxKQotIE5vdywgdGhlcmUncyBldmVuIGEgYmFzaWMgY2hlY2sgdGhhdCBhIHJlLXVzZWQgY29ubmVjdGlvbiBpcyBzdGlsbCBhbGl2ZQogIGJlZm9yZSBpdCBpcyBhc3N1bWVkIHNvLiBBIGZldyBmaXJzdCB0ZXN0cyBoYXZlIHByb3ZlbiB0aGF0IGxpYmN1cmwgd2lsbAogIHRoZW4gcmUtY29ubmVjdCBpbnN0ZWFkIG9mIHJlLXVzZSB0aGUgZGVhZCBjb25uZWN0aW9uIQoKRGFuaWVsICgyIE1hcmNoIDIwMDEpCi0gTm93IHRoZXkgd29yayBpbnRlcm1peGVkIGFzIHdlbGwuIE1ham9yIGNvb2xuZXNzIQoKLSBNb3JlIGZpZGRsaW5nIGFyb3VuZCwgbXkgJ3RpbnknIGNsaWVudCBJIGhhdmUgZm9yIHRlc3RpbmcgcHVycG9zZXMgbm93IGhhcwogIHByb3ZlZCB0byBkb3dubG9hZCBib3RoIEZUUCBhbmQgSFRUUCB3aXRoIHBlcnNpc3RlbnQgY29ubmVjdGlvbnMuIFRoZXkgZG8KICBub3Qgd29yayBpbnRlcm1peGVkIHlldCB0aG91Z2guCgpEYW5pZWwgKDEgTWFyY2ggMjAwMSkKLSBXaWxmcmVkbyBTYW5jaGV6IHBvaW50ZWQgb3V0IGEgbWlub3Igc3BlbGxpbmcgbWlzdGFrZSBpbiBhIG1hbiBwYWdlIGFuZCB0aGF0CiAgY3VybF9zbGlzdF9hcHBlbmQoKSBzaG91bGQgdGFrZSBhIGNvbnN0IGNoYXIgKiBhcyBzZWNvbmQgYXJndW1lbnQuIEl0IGRvZXMKICBub3cuCgpEYW5pZWwgKDIyIEZlYnJ1YXJ5IDIwMDEpCi0gVGhlIHBlcnNpc3RlbnQgY29ubmVjdGlvbnMgc3RhcnQgdG8gbG9vayBnb29kIGZvciBIVFRQLiBPbiBhIHN1YnNlcXVlbnQKICByZXF1ZXN0LCBpdCBzZWVtcyB0aGF0IGxpYmN1cmwgbm93IGNhbiBwaWNrIGFuIGFscmVhZHkgZXhpc3RpbmcgY29ubmVjdGlvbgogIGlmIGEgc3VpdGFibGUgb25lIGV4aXN0cywgb3IgaXQgb3BlbnMgYSBuZXcgb25lLgoKLSBEb3VnbGFzIFIuIEhvcm5lciBtYWlsZWQgbWUgY29ycmVjdGlvbnMgdG8gdGhlIGN1cmxfZm9ybXBhcnNlKCkgbWFuIHBhZ2UKICB0aGF0IEkgYXBwbGllZC4KCkRhbmllbCAoMjAgRmVicnVhcnkgMjAwMSkKLSBBZGRlZCB0aGUgZG9jcy9leGFtcGxlcy93aW4zMnNvY2tldHMuYyBmaWxlIGZvciBvdXIgd2luZG93cyBmcmllbmRzLgoKLSBMaW51cyBOaWVsc2VuIEZlbHR6aW5nIHByb3ZpZGVkIGJyYW5kIG5ldyBURUxORVQgZnVuY3Rpb25hbGl0eSBhbmQKICBpbXByb3ZlbWVudHM6CgogICogTmVnb3RpYXRpb24gaXMgbm93IHBhc3NpdmUuIEN1cmwgZG9lcyBub3QgbmVnb3RpYXRlIHVudGlsIHRoZSBwZWVyIGRvZXMuCiAgKiBQb3NzaWJpbGl0eSB0byBzZXQgbmVnb3RpYXRpb24gb3B0aW9ucyBvbiB0aGUgY29tbWFuZCBsaW5lLCBjdXJyZW50bHkgb25seQogICAgWERJU1BMT0MsIFRUWVBFIGFuZCBORVdfRU5WSVJPTiAoY2FsbGVkIE5FV19FTlYpLgogICogTm93IHNlbmRzIHRoZSBVU0VSIGVudmlyb25tZW50IHZhcmlhYmxlIGlmIHRoZSAtdSBzd2l0Y2ggaXMgdXNlZC4KICAqIFVzZSAtdCB0byBzZXQgdGVsbmV0IG9wdGlvbnMgKExpbnVzIGV2ZW4gdXBkYXRlZCB0aGUgbWFuIHBhZ2UsIGF3ZXNvbWUhKQoKLSBIYXZlbid0IGRvbmUgdGhpcyBiaWcgY2hhbmdlcyB0byBjdXJsIGZvciBhIHdoaWxlLiBNb3ZlZCBhcm91bmQgYSBsb3Qgb2YKICBzdHJ1Y3QgZmllbGRzIGFuZCBzdHVmZiB0byBtYWtlIG11bHRpcGxlIGNvbm5lY3Rpb25zIGdldCBjb25uZWN0aW9uIHNwZWNpZmljCiAgZGF0YSBpbiBzZXBhcmF0ZSBzdHJ1Y3RzIHNvIHRoYXQgdGhleSBjYW4gY28tZXhpc3QgaW4gYSBuaWNlIHdheS4gU2VlIHRoZQogIG1haWxpbmcgbGlzdHMgZm9yIGRpc2N1c3Npb25zIGFyb3VuZCBob3cgdGhpcyBpcyBnb25uYSBiZSBpbXBsZW1lbnRlZC4gRG9jcwogIGFuZCBtb3JlIHdpbGwgZm9sbG93LgoKICBTdHVkaWVkIHRoZSBIVFRQIFJGQyB0byBmaW5kIG91dCBiZXR0ZXIgaG93IHBlcnNpc3RlbnQgY29ubmVjdGlvbnMgc2hvdWxkCiAgd29yay4gU2VlbXMgY29vbCBlbm91Z2guCgpEYW5pZWwgKDE5IEZlYnJ1YXJ5IDIwMDEpCi0gQm9iIFNjaGFkZXIgYnJvdWdodCBtZSB0d28gZmlsZXMgdGhhdCBoZWxwIHNldCB1cCBhIE1TIFZDKysgbGliY3VybCBwcm9qZWN0CiAgZWFzaWVyLiBIZSBhbHNvIHByb3ZpZGVkIG1lIHdpdGggYW4gdXAtdG8tZGF0ZSBsaWJjdXJsLmRlZiBmaWxlLgoKLSBJIG1vdmVkIGEgYnVuY2ggb2YgcHJvdG90eXBlcyBmcm9tIHRoZSBwdWJsaWMgPGN1cmwvY3VybC5oPiBmaWxlIHRvIHRoZQogIGxpYnJhcnkgcHJpdmF0ZSB1cmxkYXRhLmguIFRoaXMgaXMgYmVjYXVzZSBvZiB0aGUgdXBjb21pbmcgY2hhbmdlcy4gVGhlCiAgbG93IGxldmVsIGludGVyZmFjZSBpcyBubyBsb25nZXIgYmVpbmcgcGxhbm5lZCB0byBiZWNvbWUgcmVhbGl0eS4KCkRhbmllbCAoMTUgRmVicnVhcnkgMjAwMSkKLSBDVVJMT1BUX1BPU1QgaXMgbm90IHJlcXVpcmVkIGFueW1vcmUuIEp1c3Qgc2V0dGluZyB0aGUgUE9TVCBzdHJpbmcgd2l0aAogIENVUkxPUFRfUE9TVEZJRUxEUyB3aWxsIHN3aXRjaCBvbiB0aGUgSFRUUCBQT1NULiBNb3N0IG90aGVyIHRoaW5ncyBpbgogIGxpYmN1cmwgYWxyZWFkeSB3b3JrcyB0aGlzIHdheSwgaS5lIHRoZXkgcmVxdWlyZSBvbmx5IHRoZSBwYXJhbWV0ZXIgdG8KICBzd2l0Y2ggb24gYSBmZWF0dXJlIHNvIEkgdGhpbmsgdGhpcyB3b3JrcyB3ZWxsIHdpdGggdGhlIHJlc3QuIFNldHRpbmcgYSBOVUxMCiAgc3RyaW5nIHN3aXRjaGVzIG9mZiB0aGUgUE9TVCBhZ2Fpbi4KCi0gRXhjZWxsZW50IHN1Z2dlc3Rpb25zIGZyb20gUmljaCBHcmF5LCBSaWNrIEpvbmVzLCBKb2hhbiBOaWxzc29uIGFuZCBCam9ybgogIFJlZXNlIGhlbHBlZCBtZSBkZWZpbmUgYSB3YXkgaG93IHRvIGluY29ycG9yYXRlIHBlcnNpc3RlbnQgY29ubmVjdGlvbnMgaW50bwogIGxpYmN1cmwgaW4gYSB2ZXJ5IHNtb290aCB3YXkuIElmIGRvbmUgcmlnaHQsIG5vIGNoYW5nZSBtYXkgaGF2ZSB0byBiZSBtYWRlCiAgdG8gb2xkZXIgcHJvZ3JhbXMgYW5kIHRoZXkgd2lsbCBqdXN0IHN0YXJ0IHVzaW5nIHBlcnNpc3RlbnQgY29ubmVjdGlvbnMgd2hlbgogIGFwcGxpY2FibGUhCgpEYW5pZWwgKDEzIEZlYnJ1YXJ5IDIwMDEpCi0gQ2hhbmdlZCB0aGUgd29yZCAndGltZW91dGVkJyB0byAndGltZWQgb3V0JyBpbiB0d28gZGlmZmVyZW50IGVycm9yIG1lc3NhZ2VzLgogIFN1Z2dlc3RlZCBieSBMYXJyeSBGYWhub2UuCgpWZXJzaW9uIDcuNi4xCgpEYW5pZWwgKDkgRmVicnVhcnkgMjAwMSkKLSBGcmFuayBSZWlkIGFuZCBDYWluIEhvcHdvb2QgcHJvdmlkZWQgaW5mb3JtYXRpb24gYW5kIHJlc2VhcmNoIGFyb3VuZCBhIEhUVFBTCiAgUFVUL3VwbG9hZCBwcm9ibGVtIHdlIHNlZW0gdG8gaGF2ZS4gTm8gc29sdXRpb24gZm91bmQgeWV0LgoKRGFuaWVsICg4IEZlYnJ1YXJ5IDIwMDEpCi0gQW4gaW50ZXJlc3RpbmcgZGlzY3Vzc2lvbiBpcyBob3cgdG8gc3BlY2lmeSBhbiBlbXB0eSBwYXNzd29yZCB3aXRob3V0IGhhdmluZwogIGN1cmwgYXNrIGZvciBpdCBpbnRlcmFjdGl2ZWx5PyBUaGUgY3VycmVudCBpbXBsbWVudGF0aW9uIHRha2VzIGFuIGVtcHR5CiAgcGFzc3dvcmQgYXMgYSByZXF1ZXN0IGZvciBhIHBhc3N3b3JkIHByb21wdC4gSG93ZXZlciwgSSBzdGlsbCB3YW50IHRvCiAgc3VwcG9ydCBhIGJsYW5rIHVzZXIgZmllbGQuIFRodXMsIHRvZGF5IGlmIHlvdSBlbnRlciAiLXUgOiIgKHdpdGhvdXQgdXNlcgogIGFuZCBwYXNzd29yZCkgY3VybCB3aWxsIHByb21wdCBmb3IgdGhlIHBhc3N3b3JkLiBUcmlja3kuIEhvdyB3b3VsZCB5b3UKICBzcGVjaWZ5IHlvdSB3YW50IHRoZSBwcm9tcHQgb3RoZXJ3aXNlPwoKLSBNYWRlIHRoZSBuZXRyYyBwYXJzZSByZXN1bHQgcG9zc2libGUgdG8gdXNlIGZvciBvdGhlciBwcm90b2NvbHMgdGhhbiBGVFAgYW5kCiAgSFRUUCAoc3VjaCBhcyB0aGUgdXBjb21pbmcgVEVMTkVUIGZpeGVzKS4KCi0gVGhlIHByZXZpb3VzbHkgbWVudGlvbmVkICJNU1ZDKysgcHJvYmxlbXMiIHR1cm5lZCBvdXQgdG8gYmUgYSBub24taXNzdWUuCgotIEFkZGVkIGEgSFRUUCBmaWxlIHVwbG9hZCBjb2RlIGV4YW1wbGUgaW4gdGhlIGRvY3MvZXhhbXBsZXMvIHNlY3Rpb24gb24KICByZXF1ZXN0LgoKLSBBZGp1c3RlZCB0aGUgRlRQIHJlc3BvbnNlIGZpeCBzbGlnaHRseS4KClZlcnNpb24gNy42LjEtcHJlMwoKRGFuaWVsICg3IEZlYnJ1YXJ5IDIwMDEpCi0gUy4gTW9vbmVzYW15IGZvdW5kIGEgZmxhdyBpbiB0aGUgcmVzcG9uc2UgcmVhZGluZyBmdW5jdGlvbiBmb3IgRlRQIHRoYXQKICBjb3VsZCBtYWtlIGxpYmN1cmwgbm90IGdldCBvdXQgb2YgdGhlIGxvb3AgcHJvcGVybHkgd2hlbiBpdCBzaG91bGQsIGlmCiAgbGliY3VybCBnb3QgLTEgcmV0dXJuZWQgd2hlbiByZWFkaW5nIHRoZSBzb2NrZXQuCgotIEkgZm91bmQgYSBzaW1pbGFyIG1pc3Rha2UgaW4gaHR0cC5jIHdoZW4gdXNpbmcgYSBwcm94eSBhbmQgcmVhZGluZyB0aGUKICByZXN1bHRzIGZyb20gdGhlIHByb3h5IGNvbm5lY3Rpb24uCgpEYW5pZWwgKDYgRmVicnVhcnkgMjAwMSkKLSBTLiBNb29uZXNhbXkgcG9pbnRlZCBvdXQgdGhhdCB0aGUgVkMgbWFrZWZpbGUgaW4gc3JjLyBuZWVkZWQgdGhlIGxpYnBhdGggc2V0CiAgZm9yIHRoZSBkZWJ1ZyBidWlsZCB0byB3b3JrLgoKLSBEYW5pZWwgR2VocmlnZXIgc3RlcHBlZCBpbiB0byBhc3Npc3Qgd2l0aCB0aGUgVkMrKyBzdHVmZiBSb2JlcnQgV2VhdmVyCiAgYnJvdWdodCB1cCB5ZXN0ZXJkYXkuCgpEYW5pZWwgKDUgRmVicnVhcnkgMjAwMSkKLSBKdW4taWNoaXJvIGl0b2p1biBIYWdpbm8gYnJvdWdodCBhIGJpZyBwYXRjaCB0aGF0IGJyaW5ncyBJUHY2LWF3YXJlbmVzcyB0bwogIGEgYnVuY2ggb2YgZGlmZmVyZW50IGFyZWFzIHdpdGhpbiBsaWJjdXJsLgoKLSBSb2JlcnQgV2VhdmVyIHRvbGQgbWUgYWJvdXQgdGhlIHByb2JsZW1zIHRoZSBNUyBWQysrIDYuMCBjb21waWxlciBoYXMgd2l0aAogIHRoZSAnc3RhdGljJyBrZXl3b3JkIG9uIGEgbnVtYmVyIG9mIGxpYmN1cmwgZnVuY3Rpb25zLiBJIG1pZ2h0IG5lZWQgdG8gYWRkIGEKICBwYXRjaCB0aGF0IHJlZGVmaW5lcyBzdGF0aWMgd2hlbiBsaWJjdXJsIGlzIGNvbXBpbGVkIHdpdGggdGhhdCBjb21waWxlci4KICBIb3cgZG8gSSBrbm93IHdoZW4gVkMrKyBjb21waWxlcywgYW55b25lPwoKRGFuaWVsICg0IEZlYnJ1YXJ5IDIwMDEpCi0gY3VybF9nZXRpbmZvKCkgd2FzIGV4dGVuZGVkIHdpdGggdHdvIG5ldyBvcHRpb25zOgogIENVUkxJTkZPX0NPTlRFTlRfTEVOR1RIX0RPV05MT0FEIGFuZCBDVVJMSU5GT19DT05URU5UX0xFTkdUSF9VUExPQUQuIFRoZXkKICByZXR1cm4gdGhlIGZ1bGwgYXNzdW1lZCBjb250ZW50IGxlbmd0aCBvZiB0aGUgdHJhbnNmZXIgaW4gdGhlIGdpdmVuCiAgZGlyZWN0aW9uLiBUaGUgQ1VSTElORk9fQ09OVEVOVF9MRU5HVEhfRE9XTkxPQUQgd2lsbCBiZSB0aGUgQ29udGVudC1MZW5ndGg6CiAgc2l6ZSBvZiBhIEhUVFAgZG93bmxvYWQuIEFkZGVkIGRlc2NyaXB0aW9ucyB0byB0aGUgbWFuIHBhZ2UgYXMgd2VsbC4gVGhpcwogIHdhcyBkb25lIGFmdGVyIGRpc2N1c3Npb25zIHdpdGggQm9iIFNjaGFkZXIuCgpEYW5pZWwgKDMgRmVicnVhcnkgMjAwMSkKLSBJbmdvIFJhbGYgQmx1bSBwcm92aWRlZCBhbm90aGVyIGZpeCB0aGF0IG1ha2VzIGN1cmwgYnVpbGQgdW5kZXIgdGhlIG1vcmUKICByZWNlbnQgY3lnd2luIGluc3RhbGxhdGlvbnMuIEl0IHNlZW1zIHRoZXkndmUgY2hhbmdlZCB0aGUgcHJlc2V0IGRlZmluZXMgdG8KICBub3QgaW5jbHVkZSBXSU4zMiBhbnltb3JlLgoKVmVyc2lvbiA3LjYuMS1wcmUyCgpEYW5pZWwgKDMxIEphbnVhcnkgMjAwMSkKLSBDdXJsX3JlYWQoKSBhbmQgY3VybF9yZWFkKCkgbm93IHJldHVybiBhIHNzaXplX3QgZm9yIHRoZSBzaXplLCBhcyBpdCBoYWQgdG8KICBiZSBhYmxlIHRvIHJldHVybiAtMS4gVGhlIHRlbG5ldCBzdXBwb3J0IGNyYXNoZWQgZHVlIHRvIHRoaXMgYW5kIHRoZXJlIHdhcyBhCiAgcG9zc2liaWxpdHkgdG8gd2VpcmQgYmVoYXZpb3VyIGFsbCBvdmVyLiBMaW51cyBOaWVsc2VuIEZlbHR6aW5nIGhlbHBlZCBtZQogIGZpbmQgdGhpcy4KCi0gQWRkZWQgYSBjb25maWd1cmUuaW4gY2hlY2sgZm9yIGEgd29ya2luZyBnZXRhZGRyaW5mbygpIGlmIElQdjYgaXMgcmVxdWVzdGVkLgogIEkgYWxzbyBtYWRlIHRoZSBjb25maWd1cmUgc2NyaXB0IGZlYXR1cmUgLS1lbmFibGUtZGVidWcgd2hpY2ggc2V0cyBhIGNvdXBsZQogIG9mIGNvbXBpbGVyIG9wdGlvbnMgd2hlbiB1c2VkLiBJdCBhc3N1bWVzIGdjYy4KCkRhbmllbCAoMzAgSmFudWFyeSAyMDAxKQotIEkgZmluYWxseSB0b29rIGEgc3RhYiBhdCB0aGUgbG9uZy10ZXJtIEZJWE1FIGl0ZW0gSSd2ZSBoYWQgb24gbXlzZWxmLCBhbmQKICBub3cgbGliY3VybCB3aWxsIHByb3Blcmx5IHdvcmsgd2hlbiBkb2luZyBhIEhUVFAgcmFuZ2UtcmVxdWVzdCB0aGF0IGZvbGxvd3MKICBhIExvY2F0aW9uOi4gUHJldmlvdXNseSB0aGF0IHdvdWxkIG1ha2UgbGliY3VybCBmYWlsIHNheWluZyB0aGF0IHRoZSBzZXJ2ZXIKICBkb2Vzbid0IHNlZW0gdG8gc3VwcG9ydCByYW5nZSByZXF1ZXN0cy4KCkRhbmllbCAoMjkgSmFudWFyeSAyMDAxKQotIEkgYWRkZWQgYSB0ZXN0IGNhc2UgZm9yIHRoZSBIVFRQIFBVVCByZXN1bWUgdGhpbmcgKHRlc3QgY2FzZSAzMykuCgpWZXJzaW9uIDcuNi4xLXByZTEKCkRhbmllbCAoMjkgSmFudWFyeSAyMDAxKQotIFlldCBhbm90aGVyIENvbnRlbnQtUmFuZ2UgY2hhbmdlLiBPayBub3c/IEJvYiBTY2hhZGVyIGNoZWNrcyBmcm9tIGhpcyBlbmQgCiAgYW5kIGl0IHdvcmtzIGZvciBoaW0uCgpEYW5pZWwgKDI3IEphbnVhcnkgMjAwMSkKLSBTbyB0aGUgSFRUUCBQVVQgcmVzdW1lIGZpeCB3YXNuJ3QgZ29vZC4gVGhlcmUgc2hvdWxkIGFwcGVhcmFudGx5IGJlIGEKICBDb250ZW50LVJhbmdlIGhlYWRlciB3aGVuIHJlc3VtaW5nIGEgUFVULgoKLSBJIG5vdGljZWQgSSBicm9rZSB0aGUgZG93bmxvYWQtY2hlY2sgdGhhdCB2ZXJpZmllcyB0aGF0IGEgcmVzdW1lZCBIVFRQCiAgZG93bmxvYWQgaXMgYWN0dWFsbHkgcmVzdW1lZC4gSXQgZ290IGJyb2tlIGJlY2F1c2UgbXkgbmV3ICdodHRwcmVxJyBmaWVsZAogIGluIHRoZSBtYWluIGN1cmwgc3RydWN0LiBJIHNob3VsZCBnZXQgc2xhcHBlZC4gSSBhZGRlZCBhIHRlc3QgY2FzZSBmb3IKICB0aGlzIG5vdywgc28gSSB3b24ndCBiZSBhYmxlIHRvIHJ1aW4gdGhpcyBhZ2FpbiB3aXRob3V0IG5vdGljaW5nLgoKLSBBZGRlZCBhIHRlc3QgY2FzZSBmb3IgY29udGVudC1sZW5ndGggdmVyaWZ5aW5nIHdoZW4gZG93bmxvYWRpbmcgSFRUUC4KCi0gTWFkZSB0aGUgcHJvZ3Jlc3MgbWV0ZXIgdGl0bGUgc2F5IGlmIHRoZSB0cmFuc2ZlciBpcyBiZWluZyB0cmFuc2ZlcmVkLiBJdAogIG1ha2VzIHRoZSBvdXRwdXQgc2xpZ2h0bHkgYmV0dGVyIGZvciByZXN1bWVzLgoKLSBXaGVuIGRlYWxpbmcgd2l0aCBMb2NhdGlvbjogYW5kIEhUVFAgcmV0dXJuIGNvZGVzLCBsaWJjdXJsIHdpbGwgbm90IGF0dGVtcHQKICB0byBmb2xsb3cgdGhlIHNwaXJpdCBvZiBSRkMyNjE2IGJldHRlci4gSXQgbWVhbnMgdGhhdCB3aGVuIFBPU1RpbmcgdG8gYQogIFVSTCB0aGF0IGlzIGJlaW5nIGZvbGxvd2luZyB0byBhIHNlY29uZCBwbGFjZSwgdGhlIHN0YW5kYXJkIHdpbGwganVkZ2Ugb24KICB3aGF0IHRvIGRvLiBBbGwgSFRUUCBjb2RlcyBleGNlcHQgMzAzIGFuZCAzMDUgd2lsbCBjYXVzZSBjdXJsIHRvIG1ha2UgYQogIHNlY29uZCBQT1NUIG9wZXJhdGlvbi4gMzAzIHdpbGwgbWFrZSBhIEdFVCBhbmQgMzA1IGlzIG5vdCB5ZXQgc3VwcG9ydGVkLgoKICBJIGFsc28gd3JvdGUgdHdvIHRlc3QgY2FzZXMgZm9yIHRoaXMgUE9TVC9HRVQvTG9jYXRpb24gc3R1ZmYuCgpWZXJzaW9uIDcuNgoKRGFuaWVsICgyNiBKYW51YXJ5IDIwMDEpCi0gTG90cyBvZiBtYWlscyBiYWNrIGFuZCBmb3J0aCB3aXRoIEJvYiBTY2hhZGVyIGZpbmFsbHkgbWFkZSBtZSBhZGQgYSBzbWFsbAogIHBpZWNlIG9mIGNvZGUgaW4gdGhlIEhUVFAgZW5naW5lIHNvIHRoYXQgSFRUUCB1cGxvYWQgcmVzdW1lIHdvcmtzLiBZb3UgY2FuCiAgbm93IGRvIGFuIG9wZXJhdGlvbiBsaWtlICdjdXJsIC1UIGZpbGUgLUMgPG9mZnNldD4gPFVSTD4nIGFuZCBjdXJsIHdpbGwgUFVUCiAgdGhlIGVuZGluZyBwYXJ0IG9mIHRoZSBmaWxlIHN0YXJ0aW5nIGF0IGdpdmVuIG9mZmV0IHRvIHRoZSBzcGVjaWZpZWQgVVJMLgoKVmVyc2lvbiA3LjYtcHJlNAoKRGFuaWVsICgyNSBKYW51YXJ5IDIwMDEpCi0gSSB0b29rIGhvbGQgb2YgUmljayBKb25lcycgcXVlc3Rpb24gd2h5IHdlIGRvbid0IHVzZSByZWN2KCkgYW5kIHNlbmQoKSBmb3IKICByZWFkaW5nL3dyaXRpbmcgdG8gdGhlIHNvY2tldHMgYW5kIEkndmUgbm93IG1vZGlmaWVkIHRoZSBzcmVhZCgpIGFuZAogIHN3cml0ZSgpIG1hY3JvcyB0byB1c2UgdGhlbSBpbnN0ZWFkLiBJZiBub3RoaW5nIGVsc2UsIHRoZXkgY291bGQgYmUgdGVzdGVkCiAgaW4gdGhlIG5leHQgYmV0YS1yb3VuZCBjb21pbmcgcmlnaHQgdXAuCgotIEplZmYgTW9ycm93IGZvdW5kIGEgcHJvYmxlbSB3aXRoIGxpYmN1cmwncyB1c2FnZSBvZiBTU0xfcmVhZCgpIGFuZCBzdXBwbGllZAogIGhpcyByZXNlYXJjaCByZXN1bHRzIGluIGhvdyB0byBmaXggdGhpcy4gSXQgdHVybnMgb3V0IHdlIGhhdmUgdG8gaW52b2tlIHRoZQogIGZ1bmN0aW9uIHNldmVyYWwgdGltZXMgaW4gc29tZSBjYXNlcy4gVGhlIHNhbWUgZ29lcyBmb3IgdGhlIFNTTF93cml0ZSgpLgoKICBJIG1hZGUgc29tZSByYXRoZXIgZHJhc3RpYyBjaGFuZ2VzIGFsbCBvdmVyIGxpYmN1cmwgdG8gbWFrZSBhbGwgd3JpdGVzIGFuZAogIHJlYWRzIGdldCBkb25lIG9uIG9uZSBzaW5nbGUgcGxhY2Ugc28gdGhhdCB0aGlzIHJlcGVhdGVkLWF0dGVtcHRzIHRoaW5nCiAgd291bGQgb25seSBoYXZlIHRvIGJlIGltcGxlbWVudGVkIGF0IG9uZSBwb2ludC4KCi0gUmljayBKb25lcyBzcG90dGVkIHRoYXQgdGhlICd0b3RhbCB0aW1lJyBjb3VudGVyIHJlYWxseSBkaWRuJ3QgbWVhc3VyZSB0aGUKICB0b3RhbCB0aW1lIHZlcnkgYWNjdXJhdGUgb24gc3Vic2Vjb25kIGxldmVscy4KCi0gSm9oYW4gTmlsc3NvbiBwb2ludGVkIG91dCB0aGUgbmVlZCB0byBtb3JlIGNsZWFybHkgc3BlY2lmeSB0aGF0IHRoZSB0aW1lb3V0CiAgdmFsdWUgeW91IHNldCBmb3IgYSBkb3dubG9hZCBpcyBmb3IgdGhlICplbnRpcmUqIGRvd25sb2FkLiBUaGVyZSdzIGN1cnJlbnRseQogIG5vIG9wdGlvbiBhdmFpbGFibGUgdGhhdCBzZXRzIGEgdGltZW91dCBmb3IgdGhlIGNvbm5lY3Rpb24gcGhhc2Ugb25seS4KCkRhbmllbCAoMjQgSmFudWFyeSAyMDAxKQotIEluZ28gUmFsZiBCbHVtIHN1Ym1pdHRlZCBhIHNlcmllcyBvZiBwYXRjaGVzIHJlcXVpcmVkIHRvIGdldCBjdXJsIHRvIGNvbXBpbGUKICBwcm9wZXJseSB3aXRoIGN5Z3dpbi4KCi0gUm9iZXJ0IFdlYXZlciBwb3N0ZWQgYSBmaXggZm9yIHRoZSB3aW4zMiBzZWN0aW9uIG9mIHRoZSBjdXJsX2dldGVudigpIGNvZGUKICB0aGF0IGNvcnJlY3RlZCBhIHBvdGVudGlhbCBtZW1vcnkgbGVhay4KCi0gQWRkZWQgY29tbWVudHMgaW4gYSBmZXcgZmlsZXMgaW4gYSBzdWRkZW4gYXR0ZW1wdCB0byBtYWtlIHRoZSBzb3VyY2VzIG1vcmUKICBlYXN5IHRvIHJlYWQgYW5kIHVuZGVyc3RhbmQhCgpEYW5pZWwgKDIzIEphbnVhcnkgMjAwMSkKLSBBZGRlZCBzaW1wbGUgSVB2NiBkZXRlY3Rpb24gaW4gdGhlIGNvbmZpZ3VyZSBzY3JpcHQgYW5kIG1hZGUgdGhlIHZlcnNpb24KICBzdHJpbmcgYWRkICdpcHY2JyB0byB0aGUgZW5hYmxlIHNlY3Rpb24gaW4gdGhhdCBjYXNlLiBFTkFCTEVfSVBWNiB3aWxsIGJlCiAgc2V0IGlmIGN1cmwgaXMgY29tcGlsZWQgd2l0aCBJUHY2IHN1cHBvcnQgZW5hYmxlZC4KCi0gQWRkZWQgYSBwYXJzZXIgZm9yIElQdjYtc3R5bGUgc3BlY2lmaWVkIElQLWFkZHJlc3NlcyBpbiBhIFVSTC4gVGh1cywgd2hlbgogIElQdjYgZ2V0cyBlbmFibGVkIHNvb24sIHdlIGNhbiB1c2UgVVJMcyBsaWtlICdbMDo6MV06ODAnLi4uCgotIE1hZGUgdGhlIFVSTCBnbG9iYmluZyBpbiB0aGUgY2xpZW50IHBvc3NpYmxlIHRvIGZhaWwgc2lsZW50bHkgaWYgdGhlcmUncyBhbgogIGVycm9yIGluIHRoZSBnbG9iYmluZy4gSXQgbWFrZXMgaXQgYWxtb3N0IGludHVpdGl2ZSwgc28gd2hlbiB5b3UgZG9uJ3QKICBmb2xsb3cgdGhlIHN5bnRheCBydWxlcywgZ2xvYmJpbmcgaXMgc2ltcGx5IHN3aXRjaGVkIG9mZiBhbmQgdGhlIHJhdyBzdHJpbmcKICBpcyB1c2VkIGluc3RlYWQuCgogIEkgc3RpbGwgdGhpbmsgd2UnbGwgZ2V0IHByb2JsZW1zIHdpdGggSVB2Ni1zdHlsZSBJUC1hZGRyZXNzZXMgd2hlbiB3ZSAqd2FudCoKICBnbG9iYmluZyBvbiBwYXJ0cyBvZiB0aGUgVVJMIGFzIHRoZSBpbml0aWFsIHBhcnQgb2YgdGhlIFVSTCB3aWxsIGZvciBzdXJlCiAgc2VyaW91c2x5IGNvbmZ1c2UgdGhlIGdsb2JiZXIuCgpEYW5pZWwgKDIyIEphbnVhcnkgMjAwMSkKLSBCavZybiBTdGVuYmVyZyBzdXBwbGllZCBhIHByb2dyZXNzIG1ldGVyIHBhdGNoIHRoYXQgbWFrZXMgaXQgbG9vayBiZXR0ZXIgZXZlbgogIGR1cmluZyBzbG93IHN0YXJ0cy4gUHJldmlvdXNseSBpdCBtYWRlIHNvbWUgc2lsbHkgYXNzdW1wdGlvbnMuLi4KCi0gQWRkZWQgdHdvIEZUUCB0ZXN0cyBmb3IgLVEgYW5kIC1RIC0gc3R1ZmYgc2luY2UgaXQgd2FzIGJlaW5nIGRpc2N1c3NlZCBvbgogIHRoZSBtYWlsaW5nIGxpc3QuIEhhZCB0byBjb3JyZWN0IHRoZSBmdHBzZXJ2ZXIucGwgdG9vIGFzIGl0IGJ1Z2dlZCBzbGlnaHRseS4KCkRhbmllbCAoMTkgSmFudWFyeSAyMDAxKQotIE1hZGUgdGhlIExvY2F0aW9uOiBwYXJzZXJzIGRlYWwgd2l0aCBhbnktbGVuZ3RoIFVSTHMuIFRodXMgSSByZW1vdmVkIHRoZSBsYXN0CiAgY29kZSB0aGF0IHJlc3RyaWN0cyB0aGUgbGVuZ3RoIG9mIFVSTHMgdGhhdCBjdXJsIHN1cHBvcnRzLgoKLSBBZGRlZCBhIC0tZ2xvYm9mZiB0ZXN0IGNhc2UgKCMyOCkgYW5kIGl0IHF1aWNrbHkgaWRlbnRpZmllZCBhIG1lbW9yeSBwcm9ibGVtCiAgaW4gc3JjL21haW4uYyB0aGF0IEkgdG9vayBjYXJlIG9mLgoKVmVyc2lvbiA3LjYtcHJlMwoKRGFuaWVsICgxNyBKYW51YXJ5IDIwMDEpCi0gTWFkZSB0aGUgdHdvIGZvcm1lciBmaWxlcyBsaWIvZG93bmxvYWQuYyBhbmQgbGliL2hpZ2hsZXZlbC5jIGJlY29tZSB0aGUgbmV3CiAgbGliL3RyYW5zZmVyLmMgd2hpY2ggbWFrZXMgbW9yZSBzZW5zZS4gSSBhbHNvIGRpZCB0aGUgcmVuYW1lIGZyb20gVHJhbnNmZXIoKQogIHRvIEN1cmxfVHJhbnNmZXIoKSBpbiB0aGUgb3RoZXIgc291cmNlIGZpbGVzIHRoYXQgdXNlIHRoZSB0cmFuc2ZlciBmdW5jdGlvbgogIGluIHRoZSBzcGlyaXQgb2YgdXNpbmcgQ3VybF8gcHJlZml4IGZvciBsaWJyYXJ5LXNjb3BlZCBnbG9iYWwgc3ltYm9scy4KCkRhbmllbCAoMTEgSmFudWFyeSAyMDAxKQotIEFkZGVkIC1nLy0tZ2xvYm9mZiB0aGF0IHN3aXRjaGVzIE9GRiB0aGUgVVJMIGdsb2JiaW5nIGFuZCB0aHVzIGVuYWJsZXMge31bXQogIGxldHRlcnMgdG8gYmUgcGFydCBvZiB0aGUgVVJMLiBEbyBub3RlIHRoYXQgUkZDMjM5NiBzZWN0aW9uIDIuNC4zIGV4cGxpY2l0bHkKICBtZW50aW9uIHRoZXNlIGxldHRlcnMgdG8gYmUgZXNjYXBlZC4gVGhpcyB3YXMgcG9zdGVkIGFzIGEgZmVhdHVyZSByZXF1ZXN0IGJ5CiAgSm9yZ2UgR3V0aWVycmV6IGFuZCBhcyBhIGJ1ZyBieSBUZXJyeS4KCi0gU2hvcnQgb3B0aW9ucyB0byBjdXJsIHRoYXQgcmVxdWlyZXMgcGFyYW1ldGVycyBjYW4gbm93IGJlIHNwZWNpZmllZCB3aXRob3V0CiAgaGF2aW5nIHRoZSBvcHRpb24gYW5kIGl0cyBwYXJhbWV0ZXIgc3BhY2Ugc2VwYXJhdGVkLiAtb2ZpbGUgd29ya3MgYXMgZ29vZCBhcwogIC1vIGZpbGUuIC1tMjAgaXMgZXF1YWwgdG8gLW0gMjAuIERvIG5vdGUgdGhhdCB0aGlzIGdvZXMgZm9yIHNpbmdsZS1sZXR0ZXIKICBvcHRpb25zIG9ubHksIHZlcmJvc2UgLS1sb25nLXN0eWxlIG9wdGlvbnMgc3RpbGwgbXVzdCBiZSBzZXBhcmF0ZWQgd2l0aAogIHNwYWNlIGZyb20gdGhlaXIgcGFyYW1ldGVycy4KCkRhbmllbCAoOCBKYW51YXJ5IDIwMDEpCi0gRnJhbmNpcyBEYWdlbmFpcyByZXBvcnRlZCB0aGF0IHRoZSBTQ08gY29tcGlsZXIgc3RpbGwgZmFpbHMgd2hlbiBjb21waWxpbmcKICBjdXJsIGR1ZSB0byB0aGF0IGdldHBhc3NfcigpIHByb3RvdHlwZS4gSSd2ZSBub3cgcHV0IGl0IGFyb3VuZCAjaWZuZGVmCiAgSEFWRV9HRVRQQVNTX1IgaW4gYW4gYXR0ZW1wdCB0byBwbGVhc2UgdGhlIFNDTyBzeXN0ZW1zLgoKLSBNYWRlIHNvbWUgbWlub3IgY29ycmVjdGlvbnMgdG8gZ2V0IHRoZSBjbGllbnQgdG8gY2xlYW51cCBwcm9wZXJseSBhbmQgSSBtYWRlCiAgdGhlIHNlcGFyYXRvciB3b3JrIGFnYWluIHdoZW4gZ2V0dGluZyBtdWx0aXBsZSBnbG9iYmVkIFVSTHMgdG8gc3Rkb3V0LgoKLSBXb3JrZWQgd2l0aCBMb2ljIERhY2hhcnkgdG8gZ2V0IHRoZSBtYWtlIGRpc3QgYW5kIG1ha2UgZGlzdGNoZWNrIHdvcmsKICBjb3JyZWN0bHkuIFRoZSAnbWFrZXRneicgc2NyaXB0IGlzIG5vdyB1c2luZyB0aGUgYXV0b21ha2UgZ2VuZXJhdGVkICdtYWtlCiAgZGlzdCcgd2hlbiBjcmVhdGluZyByZWxlYXNlIGFyY2hpdmVzLiBMb2ljIHN1Y2Nlc3NmdWxseSBtYWRlICdtYWtlIHJwbXMnCiAgYXV0b21hdGljYWxseSBidWlsZCBSUE1zIQoKTG9pYyBEYWNoYXJ5ICg2IEphbnVhcnkgMjAwMSkKLSBBdXRvbWF0ZWQgZ2VuZXJhdGlvbiBvZiBycG0gcGFja2FnZXMsIG5vIG5lZWQgdG8gYmUgcm9vdC4KCi0gbWFrZSBkaXN0Y2hlY2sgZ2VuZXJhdGVzIGEgcHJvcGVyIGRpc3RyaWJ1dGlvbiAoRVhUUkFfRElTVAogIGluIGFsbCBNYWtlZmlsZS5hbSBtb2RpZmllZCB0byBtYXRjaCBGSUxFUykuCgpEYW5pZWwgKDUgSmFudWFyeSAyMDAxKQotIEh1Z2UgY2xpZW50LXNpZGUgaGFjazogbm93IG11bHRpcGxlIFVSTHMgYXJlIHN1cHBvcnRlZC4gQW55IG51bWJlciBvZiBVUkxzCiAgY2FuIGJlIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lLCBhbmQgdGhleSdsbCBhbGwgYmUgZG93bmxvYWRlZC4gVGhlcmUKICBtdXN0IGJlIGEgY29ycmVzcG9uZGluZyAtbyBvciAtTyBmb3IgZWFjaCBVUkwgb3IgdGhlIGRhdGEgd2lsbCBiZSB3cml0dGVuIHRvCiAgc3Rkb3V0LiBUaGlzIG5lZWRzIG1vcmUgdGVzdGluZywgdGltZSB0byByZWxlYXNlIGEgNy42LXByZSBwYWNrYWdlLgoKLSBUaGUga3JiNCBzdXBwb3J0IHdhcyBicm9rZW4gaW4gdGhlIHJlbGVhc2UuIEZpeGVkIG5vdy4KCi0gSHVnZSBpbnRlcm5hbCBzeW1ib2wgcmVuYW1lIG9wZXJhdGlvbi4gQWxsIG5vbi1zdGF0aWMgYnV0IHN0aWxsIGxpYi1pbnRlcm5hbAogIHN5bWJvbHMgc2hvdWxkIG5vdyBiZSBwcmVmaXhlZCB3aXRoICdDdXJsXycgdG8gcHJldmVudCBjb2xsaXNpb25zIHdpdGggb3RoZXIKICBsaWJzLiBBbGwgcHVibGljIHN5bWJvbHMgc2hvdWxkIGJlIHByZWZpeGVkIHdpdGggJ2N1cmxfJyBhbmQgdGhlIHJlc3Qgc2hvdWxkCiAgYmUgc3RhdGljIGFuZCB0aHVzIGludmlzaWJsZSB0byB0aGUgb3V0c2lkZSB3b3JsZC4gSSB1cGRhdGVkIHRoZSBJTlRFUk5BTFMKICBkb2N1bWVudCB0byBzYXkgdGhpcyBhcyB3ZWxsLgoKVmVyc2lvbiA3LjUuMgoKRGFuaWVsICg0IEphbnVhcnkgMjAwMSkKLSBBcyBLZXZpbiBQIFJvdGggc3VnZ2VzdGVkLCBJJ3ZlIGFkZGVkIHRleHQgdG8gdGhlIG1hbiBwYWdlIGZvciBldmVyeSBjb21tYW5kCiAgbGluZSBvcHRpb24gYW5kIHdoYXQgaGFwcGVucyB3aGVuIHlvdSBzcGVjaWZ5IHRoYXQgb3B0aW9uIG1vcmUgdGhhbgogIG9uY2UuIFRoYXQgaGFzbid0IGJlZW4gZXhhY3RseSBjcnlzdGFsIGNsZWFyIGJlZm9yZS4KCi0gTWFkZSB0aGUgY29uZmlndXJlIHNjcmlwdCBwb3NzaWJsZSB0byBydW4gZnJvbSBvdXRzaWRlIHRoZSBzb3VyY2UtdHJlZS4gRm9yCiAgb2RkIHJlYXNvbnMgSSBjYW4ndCBidWlsZCBjdXJsIHByb3Blcmx5IG91dHNpZGUgdGhvdWdoLiBJdCBoYXMgdG8gZG8gd2l0aAogIGN1cmwncyBkZXBlbmRlbmNpZXMgb24gbGliY3VybC4uLgoKLSBDdXQgb2ZmIGFsbCBvbGRlciAoZGF0ZWQgMTk5OSBhbmQgZWFybGllcikgQ0hBTkdFUyBlbnRyaWVzIGZyb20gdGhpcyBmaWxlLgogIFRoZSBvbGRlciBwaWVjZSBpcyBuYW1lZCBDSEFOR0VTLjAgYW5kIGlzIGFkZGVkIHRvIHRoZSBDVlMgcmVwb3NpdG9yeSBpbgogIGNhc2UgYW55b25lIHdvdWxkIG5lZWQgaXQuCgotIEkgYWRkZWQgYW5vdGhlciBmaWxlICdDVlMtSU5GTycgdG8gdGhlIENWUy4gSXQgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQKICBmaWxlcyBpbiB0aGUgQ1ZTIHRoYXQgYXJlbid0IGluY2x1ZGVkIGluIHJlbGVhc2UgYXJjaGl2ZXMgYW5kIGhvdyB0byBidWlsZAogIGN1cmwgd2hlbiB5b3UgZ2V0IHRoZSBzb3VyY2VzIG9mZiBDVlMuCgotIFVwZGF0ZWQgQ09OVFJJQlVURSBhbmQgRkFRIGR1ZSB0byB0aGUgbmV3IGxpY2Vuc2UuCgpEYW5pZWwgKDMgSmFudWFyeSAyMDAxKQotIFJlbmFtZWQgUkVBRE1FLmxpYmN1cmwgdG8gTElCQ1VSTAoKLSBDaGFuZ2VkIGhlYWRlcnMgaW4gYWxsIHNvdXJjZXMgZmlsZXMgdG8gdGhlIG5ldyBkdWFsIGxpY2Vuc2UgY29uY2VwdCBvZgogIGN1cmw6IHVzZSB0aGUgTUlUL1ggZGVyaXZhdGUgbGljZW5zZSAqb3IqIE1QTC4gVGhlIExFR0FMIGZpbGUgd2FzIHVwZGF0ZWQKICBhY2NvcmRpbmdseSBhbmQgdGhlIE1QTCAxLjEgYW5kIE1JVC9YIGRlcml2YXRlIGxpY2Vuc2VzIGFyZSBub3cgcGFydCBvZiB0aGUKICByZWxlYXNlIGFyY2hpdmUuCgpEYW5pZWwgKDMwIERlY2VtYmVyIDIwMDApCi0gTWFkZSBhbGwgRlRQIGNvbW1hbmRzIGdldCBzZW50IHdpdGggdGhlIHRyYWlsaW5nIENSTEYgaW4gb25lIHNpbmdsZSB3cml0ZSgpCiAgYXMgc3BsaXR0aW5nIHRoZW0gdXAgc2VlbXMgdG8gY29uZnVzZSBhdCBsZWFzdCBzb21lIGZpcmV3YWxscyAoRlctMSBiZWluZwogIG9uZSBtYWpvcikuCgpEYW5pZWwgKDE5IERlY2VtYmVyIDIwMDApCi0gQWRkZWQgZmlsZSBkZXNyY2lwdG9yIGFuZCBGSUxFIGhhbmRsZSBsZWFrIGRldGVjdGlvbiB0byB0aGUgbWVtZGVidWcgc3lzdGVtCiAgYW5kIHRodXMgSSBmb3VuZCBhbmQgcmVtb3ZlZCBhIGZpbGUgZGVzY3JpcHRvciBsZWFrYWdlIGluIHRoZSBmdHAgcGFydHMKICB0aGF0IGhhcHBlbmVkIHdoZW4geW91IGRpZCBQT1JUZWQgZG93bmxvYWRzLgoKLSBBZGRlZCBhbiBpbmNsdWRlIDxzdGRpby5oPiBpbiA8Y3VybC9jdXJsLmg+IHNpbmNlIGl0IHVzZXMgRklMRSAqLgoKRGFuaWVsICgxMiBEZWNlbWJlciAyMDAwKQotIE11bHRpcGxlIFVSTCBkb3dubG9hZHMgd2l0aCAtTyB3YXMgc3RpbGwgYnVnZ2luZy4gTm90IGFueW1vcmUgSSB0aGluayBvcgogIGhvcGUsIG9yIGF0IGxlYXN0IEkndmUgdHJpZWQuLi4gOi1PCgotIEZyYW5jb2lzIFBldGl0amVhbiBmaXhlZCBhbm90aGVyIC1PIHByb2JsZW0KClZlcnNpb24gNy41LjEKCkRhbmllbCAoMTEgRGVjZW1iZXIgMjAwMCkKLSBDbGVhbmVkIHVwIGEgZmV3IG9mIHRoZSBtYWtlZmlsZXMgdG8gdXNlIHVuaXgtc3R5bGUgbmV3bGluZXMgb25seS4gQXMgS2V2aW4KICBQIFJvdGggZm91bmQgb3V0LCBhdCBsZWFzdCBvbmUgQ1ZTIGNsaWVudCBiZWhhdmVkIHdyb25nbHkgd2hlbiBpdCBmb3VuZAogIGRpZmZlcmVudCBuZXdsaW5lIGNvbnZlbnRpb25zIHdpdGhpbiB0aGUgc2FtZSBmaWxlLgoKLSBBbGJlcnQgQ2hpbi1BLVlvdW5nIGNvcnJlY3RlZCB0aGUgTERGTEFHUyB1c2UgaW4gdGhlIGNvbmZpZ3VyZSBzY3JpcHQgZm9yCiAgdGhlIFNTTCBzdHVmZi4KCkRhbmllbCAoNiBEZWNlbWJlciAyMDAwKQotIE1hc3NpbW8gU3F1aWxsYWNlIGNvcnJlY3RseSBkZXNjcmliZWQgaG93IGxpYmN1cmwgY291bGQgdXNlIHNlc3Npb24gaWRzIHdoZW4KICBkb2luZyBTU0wgY29ubmVjdGlvbnMuCgotIEphbWVzIEdyaWZmaXRocyBmb3VuZCBvdXQgdGhhdCBjdXJsIHdvdWxkIGNyYXNoIGlmIHRoZSBmaWxlIHlvdSBzcGVjaWZ5IHdpdGgKICAtbyBpcyBzaG9ydGVyIHRoYW4gdGhlIFVSTCEgVGhpcyB0b29rIHNvbWUgaG91cnMgdG8gZnVsbHkgaHVudCBkb3duLCBidXQgaXQKICBpcyBmaXhlZCBub3cuCgpEYW5pZWwgKDUgRGVjZW1iZXIgMjAwMCkKLSBKYWVwaWwgS2ltIHNlbnQgdXMgbWFrZWZpbGVzIHRoYXQgYnVpbGQgY3VybCB1c2luZyB0aGUgZnJlZSB3aW5kb3dzIGJvcmxhbmQKICBjb21waWxlci4gVGhlIHJvb3QgbWFrZWZpbGUgbm93IGFjY2VwdHMgJ21ha2UgYm9ybGFuZCcgdG8gYnVpbGQgY3VybCB3aXRoCiAgdGhhdCBjb21waWxlci4KCi0gU3RlZmFuIFJhZG1hbiBwb2ludGVkIG91dCB0aGF0IHRoZSB0ZXN0IG1ha2VmaWxlcyBkaWRuJ3QgdXNlIHRoZSBQRVJMCiAgdmFyaWFibGUgdGhhdCB0aGUgY29uZmlndXJlIHNjcmlwdHMgZmlndXJlIG91dC4gQWN0dWFsbHksIHlvdSBzdGlsbCBuZWVkCiAgcGVybCBpbiB0aGUgcGF0aCBmb3IgdGhlIHRlc3Qgc3VpdGUgdG8gcnVuIG9rLgoKLSBSaWNoIEdyYXkgZm91bmQgbnVtZXJvdXMgcG9ydGFiaWxpdHkgcHJvYmxlbXM6CiAgKiBUaGUgU0NPIGNvbXBpbGVyIGdvdCBhbiBlcnJvciBvbiB0aGUgZ2V0cGFzc19yKCkgcHJvdG90eXBlIGluIGdldHBhc3MuaAogICAgc2luY2UgdGhlIGN1cmwgb25lIGRpZmZlcmVkIGZyb20gdGhlIFNDTyBvbmUKICAqIFRoZSBIUFVYIGNvbXBpbGVyIGdvdCBhbiBlcnJvciBiZWNhdXNlIG9mIGhvdyBjdXJsIGRpZCB0aGUgc2lnYWN0aW9uCiAgICBzdHVmZiBhbmQgdXNlZCBhIGRlZmluZSBIUFVYIGRvZXNuJ3QgaGF2ZSAob3IgbmVlZCkuCiAgKiBBIGZldyBtb3JlIHByb2JsZW1zIHJlbWFpbiB0byBiZSByZXNlYXJjaGVkLgoKLSBQYXVsIEhhcnJpbmd0b24gZXhwZXJpZW5jZWQgYSBjb3JlIGR1bXAgdXNpbmcgaHR0cHMuIE5vdCBtdWNoIGRldGFpbHMgeWV0LgoKRGFuaWVsICg0IERlY2VtYmVyIDIwMDApCi0gSvZybiBIYXJ0cm90aCBmaXhlZCBhIHByb2JsZW0gd2l0aCBtdWx0aXBsZSBVUkxzIGFuZCAtby8tTy4KClZlcnNpb24gNy41CgpEYW5pZWwgKDEgRGVjZW1iZXIgMjAwMCkKLSBDcmFpZyBEYXZpc29uIGdhdmUgdXMgaGlzIHVwZGF0ZXMgb24gdGhlIFZDKysgbWFrZWZpbGVzLCBzbyBub3cgY3VybCBzaG91bGQKICBidWlsZCBmaW5lIHdpdGggdGhlIE1pY3Jvc29mdCBjb21waWxlciBvbiB3aW5kb3dzIHRvby4KCi0gRml4ZWQgdGhlIGxpYmN1cmwgdmVyc2lvbmluZyBzbyB0aGF0IHdlIGRvbid0IHJ1aW4gb2xkIHByb2dyYW1zIHdoZW4KICByZWxlYXNpbmcgbmV3IHNoYXJlZCBsaWJyYXJ5IGludGVyZmFjZXMuCgpEYW5pZWwgKDMwIE5vdmVtYmVyIDIwMDApCi0gUmVuYW1lZCBkb2NzL1JFQURNRS5jdXJsIHRvIGRvY3MvTUFOVUFMIHRvIGJldHRlciByZWZsZWN0IHdoYXQgdGhlIGRvY3VtZW50CiAgYWN0dWFsbHkgY29udGFpbnMuCgpEYW5pZWwgKDI5IE5vdmVtYmVyIDIwMDApCi0gSSByZW1vdmVkIGEgYnVuY2ggb2YgJyNpZiAwJyBzZWN0aW9ucyBmcm9tIHRoZSBjb2RlLiBUaGV5IG9ubHkgbWFrZSB0aGluZ3MKICBoYXJkZXIgdG8gZm9sbG93LiBBZnRlciBhbGwsIHdlIGRvIGhhdmUgYWxsIG9sZGVyIHZlcnNpb25zIGluIHRoZSBDVlMuCgpWZXJzaW9uIDcuNS1wcmU1CgpEYW5pZWwgKDI4IE5vdmVtYmVyIDIwMDApCi0gSSBmaWxsZWQgaW4gbW9yZSBlcnJvciBjb2RlcyBpbiB0aGUgbWFuIHBhZ2UgZXJyb3IgY29kZSBsaXN0IHRoYXQgaGFkIGJlZW4KICBsYWdnaW5nLgoKLSBKYW1lcyBHcmlmZml0aHMgbWFpbGVkIG1lIGEgZmluZSBwYXRjaCB0aGF0IGludHJvZHVjZXMgdGhlIENVUkxPUFRfTUFYUkVESVJTCiAgbGliY3VybCBvcHRpb24uIFdoZW4gdXNlZCwgaXQnbGwgcHJldmVudCBsb2NhdGlvbiBmb2xsb3dpbmcgbW9yZSB0aGFuIHRoZQogIHNldCBudW1iZXIgb2YgdGltZXMuIEl0IGlzIHVzZWZ1bCB0byBicmVhayBvdXQgb2YgZW5kbGVzcyByZWRpcmVjdC1sb29wcy4KCkRhbmllbCAoMjcgTm92ZW1iZXIgMjAwMCkKLSBBZGRlZCB0d28gdGVzdCBjYXNlcyBmb3IgZmlsZTovLy4KCkRhbmllbCAoMjIgTm92ZW1iZXIgMjAwMCkKLSBBZGRlZCB0aGUgbGliY3VybCBDVVJMT1BUX0ZJTEVUSU1FIHNldG9wdCwgd2hlbiBzZXQgaXQgdHJpZXMgdG8gZ2V0IHRoZQogIG1vZGlmaWVkIHRpbWUgb2YgdGhlIHJlbW90ZSBkb2N1bWVudC4gVGhpcyBpcyBhIHNwZWNpYWwgb3B0aW9uIHNpbmNlIGl0CiAgaW52b2x2ZXMgYW4gZXh0cmEgc2V0IG9mIGNvbW1hbmRzIG9uIEZUUCBzZXJ2ZXJzLiAoVXNpbmcgdGhlIE1EVE0gY29tbWFuZAogIHdoaWNoIGlzIG5vdCBpbiB0aGUgUkZDOTU5KQoKICBjdXJsX2Vhc3lfZ2V0aW5mbygpIGdvdCBhIGNvcnJlc3BvbmRpbmcgQ1VSTElORk9fRklMRVRJTUUgdG8gZ2V0IHRoZSB0aW1lCiAgYWZ0ZXIgYSB0cmFuc2Zlci4gSXQnbGwgcmV0dXJuIGEgemVybyBpZiBDVVJMT1BUX0ZJTEVUSU1FIHdhc24ndCB1c2VkIG9yIGlmCiAgdGhlIHRpbWUgd2Fzbid0IHBvc3NpYmxlIHRvIGdldC4KCiAgLS1oZWFkLy1JIHVzZWQgb24gYSBGVFAgc2VydmVyIHdpbGwgbm93IHByZXNlbnQgYSAnTGFzdC1Nb2RpZmllZDonIGhlYWRlcgogIGlmIGN1cmwgY291bGQgZ2V0IHRoZSB0aW1lIG9mIHRoZSBzcGVjaWZpZWQgZmlsZS4KCi0gQWRkZWQgdGhlIG9wdGlvbiAnLS1jYWNlcnQgW2ZpbGVdJyB0byBjdXJsLCB3aGljaCBhbGxvd3MgYSBzcGVjaWZpZWQgUEVNCiAgZmlsZSB0byBiZSB1c2VkIHRvIHZlcmlmeSB0aGUgcGVlcidzIGNlcnRpZmljYXRlIHdoZW4gZG9pbmcgSFRUUFMKICBjb25uZWN0aW9ucy4gVGhpcyBoYXMgYmVlbiByZXF1ZXN0ZWQsIHJhdGhlciByZWNlbnRseSBieSBIdWxrYSBCb2h1c2xhdiBidXQKICBvdGhlcnMgaGF2ZSBhc2tlZCBmb3IgaXQgYmVmb3JlIGFzIHdlbGwuCgpEYW5pZWwgKDIxIE5vdmVtYmVyIDIwMDApCi0gTnVtZXJvdXMgZml4ZXMgdGhlIHRlc3Qgc3VpdGUgaGFzIGJyb3VnaHQgaW50byB0aGUgZGF5bGlnaHQ6CgogICAqIGN1cmxfdW5lc2NhcGUoKSBjb3VsZCByZXR1cm4gYSB0b28gbG9uZyBzdHJpbmcKICAgKiBvbiBmdHAgdHJhbnNmZXIgZmFpbHVyZXMsIHRoZXJlIGNvdWxkIGJlIG1lbW9yeSBsZWFrcwogICAqIGZ0cCBDV0QgY291bGQgdXNlIGJhZCBkaXJlY3RvcnkgbmFtZXMKICAgKiBtZW1kZWJ1ZyBub3cgdXNlcyB0aGUgbXByaW50ZigpIHJvdXRpbmVzIGZvciBiZXR0ZXIgcG9ydGFiaWxpdHkKICAgKiBmcmVlKE5VTEwpIHJlbW92ZWQgd2hlbiBkb2luZyByZXN1bWVkIHRyYW5zZmVycwoKLSBBZGRlZCBhIGJ1bmNoIG9mIHRlc3QgY2FzZXMgZm9yIEZUUC4KCi0gR2VuZXJhbCBjbGVhbnVwcyB0byBtYWtlIGxlc3Mgd2FybmluZ3Mgd2l0aCBnY2MgLVdhbGwgLXBlZGFudGljLgoKLSBJIG1hZGUgdGhlIHRlc3RzL2Z0cHNlcnZlci5wbCB3b3JrIHdpdGggdGhlIG1vc3QgY29tbW9ubHkgdXNlZCBmdHAKICBvcGVyYXRpb25zLiBQT1JULCBQQVNWLCBSRVRSLCBTVE9SLCBMSVNULCBTSVpFLCBVU0VSLCBQQVNTIGFsbCB3b3JrIG5vdy4gTm93CiAgYWxsIEkgaGF2ZSB0byBkbyBpcyBpbnRlZ3JhdGUgdGhlIGZ0cCBzZXJ2ZXIgZG9pbmdzIGluIHRoZSBydW50ZXN0cy5wbAogIHNjcmlwdCBzbyB0aGF0IGZ0cCB0ZXN0cyBjYW4gYmUgcnVuIHRoZSBzYW1lIHdheSBodHRwIHRlc3RzIGFscmVhZHkgcnVuLgoKRGFuaWVsICgyMCBOb3ZlbWJlciAyMDAwKQotIE1hZGUgbGliY3VybCBjYXBhYmxlIG9mIGRlYWxpbmcgd2l0aCBhbnktbGVuZ3RoIFVSTHMuIFRoZSBmb3JtZXIgbGltaXQgb2YKICA0MDk2IGJ5dGVzIHdhcyBhIGJpdCBhbm5veWluZyB3aGVuIHBlb3BsZSB3YW50ZWQgdG8gdXNlIGN1cmwgdG8gcmVhbGx5IG1ha2UKICBsaWZlIHRvdWdoIG9uIGEgd2ViIHNlcnZlci4gTm93LCB0aGUgY29tbWFuZCBsaW5lIGxpbWl0IGlzIHRoZSBtb3N0IGFubm95aW5nCiAgYnV0IHRoYXQgY2FuIGJlIGNpcmN1bXZlbnRlZCBieSB1c2luZyBhIGNvbmZpZyBmaWxlLgoKICBOT1RFOiB0aGVyZSBpcyBzdGlsbCBhIDQwOTYtYnl0ZSBsaW1pdCBvbiBVUkxzIGV4dHJhY3RlZCBmcm9tIExvY2F0aW9uOgogIGhlYWRlcnMuCgotIENvcnJlY3RlZCB0aGUgc3BlbGxpbmcgb2YgJ3Jlc29sdmUnIGluIHR3byBlcnJvciBtZXNzYWdlcy4KCi0gQWxleGFuZGVyIEtvdXJha29zIHBvc3RlZCBhIGJ1ZyByZXBvcnQgYW5kIGEgcGF0Y2ggdGhhdCBjb3JyZWN0ZWQgaXQhIEl0CiAgdHVybmVkIG91dCB0aGF0IGx5bnggYW5kIHdnZXQgc3VwcG9ydCBsb3dlcmNhc2UgZW52aXJvbm1lbnQgdmFyaWFibGUgbmFtZXMKICB3aGVyZSBjdXJsIG9ubHkgbG9va2VkIGZvciB0aGUgdXBwZXJjYXNlIHZlcnNpb25zLiBOb3cgY3VybCB3aWxsIHVzZSB0aGUKICBsb3dlcmNhc2UgdmVyc2lvbnMgaWYgdGhleSBleGlzdCwgYnV0IGlmIHRoZXkgZG9uJ3QsIGl0J2xsIHVzZSB0aGUgdXBwZXJjYXNlCiAgdmVyc2lvbnMuCgpEYW5pZWwgKDE3IE5vdmVtYmVyIDIwMDApCi0gY3VybF9mb3JtZnJlZSgpIHdhcyBhZGRlZC4gSG93IGNvbWUgbm8gb25lIG1pc3NlZCB0aGF0IG9uZSBiZWZvcmU/IEkgcmFuIHRoZQogIHRlc3Qgc3VpdGUgd2l0aCB0aGUgbWFsbG9jIGRlYnVnIGVuYWJsZWQgYW5kIGdvdCBsb3RzIG9mICJuaWNlIiB3YXJuaW5ncyBvbgogIG1lbW9yeSBsZWFrcy4gVGhlIG1vc3Qgc2VyaW91cyBvbmUgd2FzIHRoaXMuIFRoZXJlIHdlcmUgYWxzbyBsZWFrcyBpbiB0aGUKICBjb29raWUgaGFuZGxpbmcsIGFuZCBhIGZldyBlcnJvcnMgd2hlbiBjdXJsIGZhaWxlZCB0byBjb25uZWN0IGFuZCBzaW1pbGFyCiAgdGhpbmdzLiBNb3JlIHRlc3RzIGNhc2VzIHdlcmUgYWRkZWQgdG8gY292ZXIgdXAgYW5kIHRvIHZlcmlmeSB0aGF0IHRoZXNlCiAgcHJvYmxlbXMgaGF2ZSBiZWVuIHJlbW92ZWQuCgotIE11Y2hvIHVwZGF0ZWQgY29uZmlnIGZpbGUgcGFyc2VyIChJJ20gZGVhZCB0aXJlZCBvZiBhbGwgdGhlIGJ1ZyByZXBvcnRzIGFuZAogIHdlaXJkIGJlaGF2aW91ciBJIGdldCBvbiB0aGUgZm9ybWVyIG9uZSkuIEl0IHdvcmtzIHNsaWdodGx5IGRpZmZlcmVudGx5IG5vdywKICBhbHRob3VnaCBJIGRvdWJ0IG1hbnkgcGVvcGxlIHdpbGwgbm90aWNlIHRoZSBkaWZmZXJlbmNlcy4gVGhlIG1haW4KICBkaWZmZXJlbmNlIGJlaW5nIHRoYXQgaWYgeW91IHVzZSBvcHRpb25zIHRoYXQgcmVxdWlyZSBwYXJhbWV0ZXJzLCB0aGV5IG11c3QKICBib3RoIGJlIHNwZWNpZmllZCBvbiB0aGUgc2FtZSBsaW5lLiBXaXRoIHRoaXMgbmV3IHBhcnNlciwgeW91IGNhbiBhbHNvCiAgc3BlY2lmeSBsb25nIG9wdGlvbnMgd2l0aG91dCAnLS0nIGFuZCB5b3UgbWF5IHNlcGFyYXRlIG9wdGlvbnMgYW5kCiAgcGFyYW1ldGVycyB3aXRoIDogb3IgPS4gSXQgbWFrZXMgYSBjb25maWcgZmlsZSBsaW5lIGNvdWxkIGxvb2sgbGlrZToKCiAgICAgICAgdXNlci1hZ2VudCA9ICJmb29iYXIgYW5kIHNvbWV0aGluZyIKCiAgUGFyYW1ldGVycyB3aXRoaW4gcXVvdGVzIG1heSBjb250YWluIHNwYWNlcy4gV2l0aG91dCBxdW90ZXMsIHRoZXkncmUKICBleHBlY3RlZCB0byBiZSBhIHNpbmdsZSBub24tc3BhY2Ugd29yZC4KCiAgSGFkIHRvIHBhdGNoIHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnQgcGFyc2VyIGEgbGl0dGxlIHRvIG1ha2UgdGhpcyB3b3JrLgoKLSBBZGRlZCAtLXVybCBhcyBhbiBvcHRpb24gdG8gYWxsb3cgdGhlIFVSTCB0byBiZSBzcGVjaWZpZWQgdGhpcyB3YXkuIEl0IG1ha2VzCiAgd2F5IG5pY2VyIGNvbmZpZyBmaWxlcy4gVGhlIHByZXZpb3VzIHdheSBvZiBzcGVjaWZ5aW5nIFVSTHMgaW4gdGhlIGNvbmZpZwogIGZpbGUgZG9lc24ndCB3b3JrIGFueW1vcmUuCgpEYW5pZWwgKDE1IE5vdmVtYmVyIDIwMDApCi0gVXNpbmcgY2VydGFpbiBjaGFyYWN0ZXJzIGluIHVzZXJuYW1lcyBvciBwYXNzd29yZHMgZm9yIEhUVFAgYXV0aGVudGljYXRpb24KICBmYWlsZWQuIFRoaXMgd2FzIGR1ZSB0byB0aGUgbXByaW50ZigpIHRoYXQgaGFkIGEgc2lsbHkgY2hlY2sgZm9yIGxldHRlcnMsCiAgYW5kIGlmIHRoZXkgd2VyZW4ndCBpc3ByaW50KCkgdGhleSB3ZXJlbid0IG91dHB1dGVkICJhcy1pcyIuIFRoaXMgY2F1c2VkCiAgcGFzc3dvcmRzIGFuZCB1c2VybmFtZXMgdXNpbmcgJ6cnIChmb3IgZXhhbXBsZSkgdG8gZmFpbC4KClZlcnNpb24gNy40LjIKCkRhbmllbCAoMTUgTm92ZW1iZXIgMjAwMCkKLSAndGVzdHMvcnVudGVzdHMucGwnIG5vdyBzb3J0cyB0aGUgdGVzdCBjYXNlcyBwcm9wZXJseSB3aGVuICdhbGwnIGlzIHVzZWQuCgpEYW5pZWwgKDE0IE5vdmVtYmVyIDIwMDApCi0gSSBmZWxsIG92ZXIgdGhlIGRyYWZ0LWlldGYtZnRwZXh0LW1sc3QtMTIudHh0IEludGVybmV0IERyYWZ0IHRpdGxlZAogICJFeHRlbnNpb25zIHRvIEZUUCIgdGhhdCBjb250YWlucyBhIGRlZmluZWQgd2F5IGhvdyB0aGUgZnRwIGNvbW1hbmQgU0laRQogIGNvdWxkIGJlIGFzc3VtZWQgdG8gd29yay4KCi0gTGF1cmVudCBQYXBpZXIgcG9zdGVkIGEgYnVnIHJlcG9ydCBhYm91dCB1c2luZyAiLUMgLSIgYW5kIEZUUCB1cGxvYWRpbmcgYQogIGZpbGUgdGhhdCBpc24ndCBwcnNlbnQgb24gdGhlIHNlcnZlci4gVGhlIHNlcnZlciBtaWdodCB0aGVuIHJldHVybiBhIDU1MCBhbmQKICBjdXJsIHdpbGwgZmFpbC4gU2hvdWxkIGl0IGluc3RlYWQgYXMgTGF1cmVudCBQYXBpZXIgc3VnZ2VzdHMsIHN0YXJ0CiAgdXBsb2FkaW5nIGZyb20gdGhlIGJlZ2lubmluZyBhcyBhIG5vcm1hbCB1cGxvYWQ/CgpEYW5pZWwgKDEzIE5vdmVtYmVyIDIwMDApCi0gRml4ZWQgYSBjcmFzaCB3aXRoIHRoZSBmb2xsb3dsb2NhdGlvbiBjb3VudGVyLgoKLSBXaGlsZSB3cml0aW5nIHRlc3QgY2FzZXMgZm9yIHRoZSB0ZXN0IHN1aXRlLCBJIGRpc2NvdmVyZWQgYW4gb2xkIGxpbWl0YXRpb24KICB0aGF0IHByZXZlbnRlZCAtbyBhbmQgLVQgdG8gYmUgdXNlZCBhdCB0aGUgc2FtZSB0aW1lLiBJIHJlbW92ZWQgdGhpcwogIGltbWVkaWF0ZWx5IGFzIHRoaXMgaGFzIG5vIHJlbGV2YW5jZSBpbiB0aGUgY3VycmVudCBsaWJjdXJsLgogIAotIENocmlzIEZhaGVydHkgZml4ZWQgYSBmcmVlLXR3aWNlIHByb2JsZW0gaW4gbGliL2ZpbGUuYwoKLSBJIGZpeGVkIHRoZSBwZXJsIGh0dHAgc2VydmVyIHByb2JsZW0gaW4gdGhlIHRlc3Qgc3VpdGUuCgpWZXJzaW9uIDcuNC4yIHByZTQKCkRhbmllbCAoMTAgTm92ZW1iZXIgMjAwMCkKLSBJJ3ZlIChmaW5hbGx5KSBzdGFydGVkIHdvcmtpbmcgb24gdGhlIGN1cmwgdGVzdCBzdWl0ZS4gSXQgaXMgaW4gdGhlIG5ldwogIHRlc3RzLyBkaXJlY3RvcnkuIEl0IHJlcXVpcmVzIHNoIGFuZCBwZXJsLiBUaGVyZSdzIGEgVENQIHNlcnZlciBpbiBwZXJsIGFuZAogIG1vc3Qgb2YgdGhlIG90aGVyIHN0dWZmIHJ1bm5pbmcgYSBwcmV0dHkgc2ltcGxlIHNoZWxsIHNjcmlwdC4KCiAgSSd2ZSBvbmx5IG1hZGUgZm91ciB0ZXN0IGNhc2VzIHNvIGZhciwgYnV0IGl0IHByb3ZlcyB0aGUgc3lzdGVtIGNhbiB3b3JrLgoKLSBMYXVyZW50IFBhcGllciBub3RpY2VkIHRoYXQgY3VybCBkaWRuJ3Qgc2V0IFRZUEUgd2hlbiBkb2luZyAtLWhlYWQgY2hlY2tzCiAgZm9yIHNpemVzIG9uIEZUUCBzZXJ2ZXJzLiBTb21lIHNlcnZlcnMgc2VlbSB0byByZXR1cm4gZGlmZmVyZW50IHNpemVzCiAgZGVwZW5kaW5nIG9uIHdoZXRoZXIgQVNDSUkgb3IgQklOQVJZIGlzIHVzZWQhCgotIExhdXJlbnQgUGFwaWVyIGRldGVjdGVkIHRoYXQgaWYgeW91IGFwcGVuZGVkIGEgRlRQIHVwbG9hZCBhbmQgZXZlcnl0aGluZyB3YXMKICBhbHJlYWR5IHVwbG9hZGVkLCBjdXJsIHdvdWxkIGhhbmcuCgotIEFuZ3VzIE1hY2theSdzIGdldHBhc3NfcigpIGluIGxpYi9nZXRwYXNzLmMgaXMgbm93IGNvbXBsaWFudCB3aXRoIHRoZQogIGdldHBhc3NfcigpIGZ1bmN0aW9uIGl0IHNlZW1zIHNvbWUgc3lzdGVtcyBhY3R1YWxseSBoYXZlLgogIAotIFZlbmthdGFyYW1hbmEgTW9ra2FwYXRpIGRldGVjdGVkIGEgYnVnIGluIHRoZSBjb29raWUgcGFyc2VyIGFuZCBjb3JyZWN0ZWQKICBpdC4gIElmIHRoZSBjb29raWUgd2FzIHNldCBmb3IgdGhlIGZ1bGwgaG9zdCBuYW1lIChkb21haW49ZnVsbC5ob3N0LmNvbSksCiAgdGhlIGNvb2tpZSB3YXMgbmV2ZXIgc2VudCBiYWNrIGJlY2F1c2Ugb2YgYSBmYXVsdHkgbGVuZ3RoIGNvbXBhcmlzb24gYmV0d2VlbgogIHRoZSBzZXQgZG9tYWluIGxlbmd0aCBhbmQgdGhlIGN1cnJlbnQgaG9zdCBuYW1lLgoKRGFuaWVsICg5IE5vdmVtYmVyIDIwMDApCi0gQWRkZWQgYSBjb25maWd1cmUgY2hlY2sgZm9yIGdldGhvc3RieW5hbWUgaW4gLWxzb2NrZXQgKE9TLzIgc2VlbXMgdG8gbmVlZAogIGl0KS4gQWRkZWQgYSBjaGVjayBmb3IgUlNBZ2x1ZS9yc2FyZWYgZm9yIHRoZSBjYXNlcyB3aGVyZSBsaWJjcnlwdG8gaXMgZm91bmQKICBidXQgbGlic3NsIGlzbid0LiBJIGhhdmVuJ3QgdmVyaWZpZWQgdGhpcyBmaXggeWV0IHRob3VnaCwgYXMgSSBoYXZlIG5vCiAgc3lzdGVtIHRoYXQgcmVxdWlyZXMgdGhvc2UgbGlicyB0byBidWlsZC4KICAKVmVyc2lvbiA3LjQuMiBwcmUzCgpEYW5pZWwgKDcgTm92ZW1iZXIgMjAwMCkKLSBSZW1vdmVkIHBlcnJvcigpIG91dHB1dHMgZnJvbSBnZXRwYXNzLmMuIEFuZ3VzIE1hY2theSBhbHNvIGFncmVlZCB0byBhCiAgc2xpZ2h0bHkgbW9kaWZpZWQgbGljZW5zZSBvZiB0aGUgZ2V0cGFzcy5jIGZpbGUgYXMgdGhlIHByb3RvdHlwZSB3YXMgY2hhbmdlZC4KCkRhbmllbCAoNiBOb3ZlbWJlciAyMDAwKQotIEFkZGVkIHBvc3NpYmlsaXR5IHRvIHNldCBhIHBhc3N3b3JkIGNhbGxiYWNrIHRvIHVzZSBpbnN0ZWFkIG9mIHRoZSBidWlsdC1pbi4KICBUaGV5J3JlIGNvbnRyb2xlZCB3aXRoIGN1cmxfZWFzeV9zZXRvcHQoKSBvZiBjb3Vyc2UsIHRoZSB0YWdzIGFyZQogIENVUkxPUFRfUEFTU1dERlVOQ1RJT04gYW5kIENVUkxPUFRfUEFTU1dEREFUQS4KCi0gVXNlZCBULiBCaGFyYXRoJ3MgdGhpbmtpbmcgYW5kIGZpeGVkIHRoZSB0aW1lcnMgdGhhdCBzaG93ZWQgdGVycmlibHkgd3JvbmcKICB0aW1lcyB3aGVuIGxvY2F0aW9uOiBoZWFkZXJzIHdlcmUgZm9sbG93ZWQuCgotIEVtbWFudWVsIFR5Y2hvbiBkaXNjb3ZlcmVkIHRoYXQgY3VybCBkaWRuJ3QgcmVhbGx5IGxpa2UgdXNlciBuYW1lcyBvbmx5IGluCiAgdGhlIFVSTC4gSSBjb3JyZWN0ZWQgdGhpcyBhbmQgSSBhbHNvIGZpeGVkIHRoZSBzaW5jZSBsb25nIGxpdmluZyBwcm9ibGVtCiAgd2l0aCBVUkwgZW5jb2RlZCB1c2VyIG5hbWVzIGFuZCBwYXNzd29yZHMgaW4gdGhlIFVSTHMuIFRoZXkgc2hvdWxkIHdvcmsgbm93LgogIApEYW5pZWwgKDIgTm92ZW1iZXIgMjAwMCkKLSBXaGVuIEkgYWRkZWQgLS1pbnRlcmZhY2UsIHRoZSBuZXcgZXJyb3IgY29kZSB0aGF0IHdhcyBhZGRlZCB3aXRoIGl0IHdhcwogIGluc2VydGVkIGluIHRoZSB3cm9uZyBwbGFjZSBhbmQgdGh1cyBhbGwgZXJyb3IgY29kZXMgZnJvbSAzNSBhbmQgdXB3YXJkcyBnb3QKICBpbmNyZWFzZWQgb25lIHN0ZXAuIFRoaXMgaXMgbm93IGNvcnJlY3RlZCwgd2UncmUgYmFjayBhdCB0aGUgcHJldmlvdXMKICBudW1iZXJzLiBBbGwgbmV3IGV4aXQgY29kZXMgc2hvdWxkIGJlIGFkZGVkIGF0IHRoZSBlbmQuCgpEYW5pZWwgKDEgTm92ZW1iZXIgMjAwMCkKLSBBZGRlZCBhIGNoZWNrIGZvciBzaWduYWwoKSBpbiB0aGUgY29uZmlndXJlIHNjcmlwdCBzbyB0aGF0IGlmIHNpZ2FjdGlvbigpCiAgaXNuJ3QgcHJlc2VudCwgd2UgY2FuIHVzZSBzaWduYWwoKSBpbnN0ZWFkLgoKLSBJJ20gaGF2aW5nIGEgbGljZW5zZSBkaXNjdXNzaW9uIGdvaW5nIG9uIHByaXZhdGVseS4gVGhlIGlzc3VlIGlzIHlldCBhZ2FpbgogIEdQTC1saWNlbnNlZCBwcm9ncmFtcyB0aGF0IGhhdmUgcHJvYmxlbXMgd2l0aCBNUEwuIEkgYW0gbGVhbmluZyB0b3dhcmRzCiAgbWFraW5nIGEga2luZCBvZiBkdWFsLWxpY2Vuc2UgdGhhdCB3aWxsIHNvbHZlIHRoaXMgb25jZSBhbmQgZm9yIGFsbC4uLgoKRGFuaWVsICgzMSBPY3RvYmVyIDIwMDApCi0gQWRkZWQgdGhlIHBhY2thZ2VzLyBkaXJlY3RvcnkuIEkgaW50ZW5kIHRvIGxldCB0aGlzIGNvbnRhaW4gc29tZSBkb2NzIGFuZAogIHRlbXBsYXRlcyBvbiBob3cgdG8gZ2VuZXJhdGUgY3VzdG9tLWZvcm1hdCBwYWNrYWdlcyBmb3IgdmFyaW91cyBwbGF0Zm9ybXMuCiAgSSd2ZSBub3cgcmVtb3ZlZCB0aGUgUlBNIHJlbGF0ZWQgY3VybC5zcGVjIGZpbGVzIGZyb20gdGhlIGFyY2hpdmUgcm9vdC4KCkRhbmllbCAoMzAgT2N0b2JlciAyMDAwKQotIFQuIEJoYXJhdGggYnJvdWdodCBhIHNldCBvZiBwYXRjaGVzIHRoYXQgYnJpbmcgbmV3IGZ1bmN0aW9uYWxpdHkgdG8KICBjdXJsX2Vhc3lfZ2V0aW5mbygpIGFuZCBjdXJsX2Vhc3lfc2V0b3B0KCkuIE5vdyB5b3UgY2FuIHJlcXVlc3QgcGVlcgogIGNlcnRpZmljYXRlIHZlcmlmaWNhdGlvbiB3aXRoIHRoZSAqc2V0b3B0KCkgQ1VSTE9QVF9TU0xfVkVSSUZZUEVFUiBvcHRpb24KICBhbmQgdGhlbiB1c2UgdGhlIENVUkxPUFRfQ0FJTkZPIHRvIHNldCB0aGUgY2VydGlmaWNhdGUgdG8gdmVyaWZ5IHRoZSByZW1vdGUKICBwZWVyIGFnYWluc3QuIEFmdGVyIGFuIHN1Y2ggYW4gb3BlcmF0aW9uIHdpdGggYSB2ZXJpZmljYXRpb24gcmVxdWVzdCwgdGhlCiAgKl9nZXRpbmZvKCkgb3B0aW9uIENVUkxJTkZPX1NTTF9WRVJJRllSRVNVTFQgd2lsbCByZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQKICB3aGV0aGVyIHRoZSB2ZXJpZmljYXRpb24gc3VjY2VlZGVkIG9yIG5vdC4gIAoKRGFuaWVsICgyNyBPY3RvYmVyIDIwMDApCi0gR2VvcmcgSG9ybiBicm91Z2h0IHVzIGEgc3BsZW5kaWQgcGF0Y2ggdGhhdCBzb2x2ZXMgdGhlIGxvbmctc3RhbmRpbmcKICBhbm5veWluZyBwcm9ibGVtIHdpdGggdGltZW91dHMgdGhhdCBtYWRlIGN1cmwgZXhpdCB3aXRoIHNpbGx5IGV4aXQgY29kZXMKICAod2hpY2ggYXMgYmVlbiBjb21tZW50ZWQgb3V0IGxhdGVseSkuIFRoaXMgc29sdXRpb24gaXMgc2lnYWN0aW9uKCkgYmFzZWQgYW5kCiAgb2YgY291cnNlIHRoZW4gb25seSB3b3JrcyBmb3IgdW5peGVzIChhbmQgb25seSB0aG9zZSB1bml4ZXMgdGhhdCBhY3R1YWxseQogIGhhdmUgdGhlIHNpZ2FjdGlvbigpIGZ1bmN0aW9uKS4KCkRhbmllbCAoMjYgT2N0b2JlciAyMDAwKQotIEJq9nJuIFN0ZW5iZXJnIHN1cHBsaWVkIGEgcGF0Y2ggdGhhdCBmaXhlZCB0aGUgZmxhdyBtZW50aW9uZWQgYnkgS2V2aW4gUm90aAogIHRoYXQgbWFkZSB0aGUgcGFzc3dvcmQgZ2V0IGVjaG9lZCB3aGVuIHByb21wdGVkIGZvciBpbnRlcmFjdGl2ZWx5LiBUaGUKICBnZXRwYXNzKCkgZnVuY3Rpb24gKG5vdyBrbm93biBhcyBteV9nZXRwYXNzKCkpIHdhcyBhbHNvIGZpeGVkIHRvIG5vdCB1c2UgYW55CiAgc3RhdGljIGJ1ZmZlcnMuIFRoaXMgYWxzbyBtZWFucyB3ZSBjYW5ub3QgdXNlIHRoZSAic3RhbmRhcmQiIGdldHBhc3MoKQogIGZ1bmN0aW9uIGV2ZW4gZm9yIHRob3NlIHN5c3RlbXMgdGhhdCBoYXZlIGl0LCBzaW5jZSBpdCBpc24ndCB0aHJlYWQtc2FmZS4KICAKLSBLZXZpbiBSb3RoIGZvdW5kIG91dCB0aGF0IGlmIHlvdSdkIHdyaXRlIGEgY29uZmlnIGZpbGUgd2l0aCAnLXYgdXJsJywgdGhlCiAgdXJsIHdvdWxkIG5vdCBiZSB1c2VkIGFzICJkZWZhdWx0IFVSTCIgYXMgZG9jdW1lbnRlZCwgYWx0aG91Z2ggaWYgeW91IHdyb3RlCiAgaXQgJ3VybCAtdicgaXQgd29ya2VkISBUaGlzIGhhcyBiZWVuIGNvcnJlY3RlZCBub3cuCgotIEtldmluIFJvdGgncyBpZGVhIG9mIHVzaW5nIG11bHRpcGxlIC1kIG9wdGlvbnMgb24gdGhlIHNhbWUgY29tbWFuZCBsaW5lIHdhcwogIGp1c3QgYnJpbGxpYW50LCBhbmQgSSBjb3VsZG4ndCByZWFsbHkgdGhpbmsgb2YgYW55IHJlYXNvbiB3aHkgd2Ugc2hvdWxkbid0CiAgc3VwcG9ydCBpdCEgVGhlIGFwcGVuZCBmdW5jdGlvbiBhbHdheXMgYXBwZW5kICcmJyBhbmQgdGhlbiB0aGUgbmV3IC1kCiAgY2h1bmsuIFRoaXMgZW5hYmxlcyBjb25zdHJ1Y3RzIGxpa2UgdGhlIGZvbGxvd2luZzoKCiAgICAgICAgY3VybCAtZCBuYW1lPWRhbmllbCAtZCBhZ2U9dW5rbm93biBmb29iYXJzaXRlLmNvbQoKRGFuaWVsICgyNCBPY3RvYmVyIDIwMDApCi0gSSBmaXhlZCB0aGUgbGliL21lbWRlYnVnLmMgc291cmNlIHNvIHRoYXQgaXQgY29tcGlsZXMgb24gTGludXggYW5kIG90aGVyCiAgc3lzdGVtcy4gSXQgd2lsbCBiZSB1c2VmdWwgb25lIGRheSB3aGVuIHNvbWVvbmUgZWxzZSBidXQgbWUgd2FudHMgdG8gcnVuIHRoZQogIG1lbW9yeSBkZWJ1Z2dpbmcgc3lzdGVtLgoKRGFuaWVsICgyMyBPY3RvYmVyIDIwMDApCi0gSSBtb2RpZmllZCB0aGUgbWFrZXRneiBhbmQgY29uZmlndXJlIHNjcmlwdHMsIHNvIHRoYXQgdGhlIGNvbmZpZ3VyZSBzY3JpcHQKICB3aWxsIGZldGNoIHRoZSB2ZXJzaW9uIG51bWJlciBmcm9tIHRoZSBpbmNsdWRlL2N1cmwvY3VybC5oIGhlYWRlciBmaWxlcywgYW5kCiAgdGhlbiB0aGUgbWFrZXRneiBkb2Vzbid0IGhhdmUgdG8gcmVidWlsZCB0aGUgY29uZmlndXJlIHNjcmlwdCB3aGVuIEkgYnVpbGQKICByZWxlYXNlLWFyY2hpdmVzLgoKLSBCavZybiBTdGVuYmVyZyBhbmQgTGludXMgTmllbHNlbiBjb3JyZWN0bHkgcG9pbnRlZCBvdXQgdGhhdCBjdXJsIHdhcyBzaWxseQogIGVub3VnaCB0byBub3QgYWxsb3cgQC1sZXR0ZXJzIGluIHBhc3N3b3JkcyB3aGVuIHRoZXkgd2VyZSBzcGVjaWZpZWQgd2l0aCB0aGUKICAtdSBvciAtVSBmbGFncyAoQ1VSTE9QVF9VU0VSUFdEIGFuZCBDVVJMT1BUX1BST1hZVVNFUlBXRCkuIFRoaXMgYWxzbwogIHN1Z2dlc3RzIHRoYXQgY3VybCBwcm9iYWJseSBzaG91bGQgdXJsLWRlY29kZSB0aGUgcGFzc3dvcmQgcGllY2Ugb2YgYW4gVVJMCiAgc28gdGhhdCB5b3UgY291bGQgcGFzcyBhbiBlbmNvZGVkIEAtbGV0dGVyIHRoZXJlLi4uCiAgCkRhbmllbCAoMjAgT2N0b2JlciAyMDAwKQotIFlldCBhbm90aGVyIGh0dHAgc2VydmVyIGJhcmZlZCBvbiBjdXJsJ3MgcmVxdWVzdCB0aGF0IGluY2x1ZGUgdGhlIHBvcnQKICBudW1iZXIgaW4gdGhlIEhvc3Q6IGhlYWRlciBhbHdheXMuIEkgbm93IG9ubHkgaW5jbHVkZSB0aGUgcG9ydCBudW1iZXIgaWYgaXQKICBpc24ndCB0aGUgZGVmYXVsdCAoODAgZm9yIEhUVFAsIDQ0MyBmb3IgSFRUUFMpLiB3d3cucGVybC5jb20gdHVybmVkIG91dCB0bwogIHJ1biBvbmUgb2YgdGhvc2UgbmFzdHkgc2VydmVycy4KCi0gVGhlIFBIUDQgbW9kdWxlIGZvciBjdXJsIGhhZCBwcm9ibGVtcyB3aXRoIHJlZmVyZXIgdGhhdCBzZWVtcyB0byBoYXZlIGJlZW4KICBjb3JyZWN0ZWQganVzdCB5ZXN0ZXJkYXkuIChTdGVybGluZyBIdWdoZXMgb2YgdGhlIFBIUCB0ZWFtIGNvbmZpcm1lZCB0aGlzKQoKRGFuaWVsICgxNyBPY3RvYmVyIDIwMDApCi0gVmxhZGltaXIgT2Jsb21vdiByZXBvcnRlZCB0aGF0IHRoZSAtWSBhbmQgLXkgb3B0aW9ucyBkaWRuJ3Qgd29yay4gVGhleQogIGRpZG4ndCB3b3JrIGZvciBtZSBlaXRoZXIuIFRoaXMgb25jZSBhZ2FpbiBwcm92ZXMgd2Ugc2hvdWxkIGhhdmUgdGhhdCB0ZXN0CiAgc3VpdGUuLi4KICAKLSBJIGZpbmFsbHkgY2hhbmdlZCB0aGUgZXJyb3IgbWVzc2FnZSBsaWJjdXJsIHJldHVybnMgaWYgeW91IHRyeSBhIGh0dHBzOi8vCiAgVVJMIHdoZW4gdGhlIGxpYnJhcnkgd2Fzbid0IGJ1aWxkIHdpdGggU1NMIGVuYWJsZWQuIEl0IHdpbGwgbm93IHJldHVybiB0aGlzCiAgZXJyb3I6CiAgICAgICAgImxpYmN1cmwgd2FzIGJ1aWx0IHdpdGggU1NMIGRpc2FibGVkLCBodHRwczogbm90IHN1cHBvcnRlZCEiCgogIEkgcmVhbGx5IGhvcGUgaXQgd2lsbCBtYWtlIGl0IGEgYml0IGNsZWFyZXIgdG8gdXNlcnMgd2hlcmUgdGhlIGFjdHVhbAogIHByb2JsZW0gbGllcy4KClZlcnNpb24gNy40LjEKCkRhbmllbCAoMTYgT2N0b2JlciAyMDAwKQotIEkgZm9yZ290IHRvIHJlbW92ZSBzb21lIG9mIHRoZSBtYWxsb2MgZGVidWcgZGVmaW5lcyBmcm9tIHRoZSBtYWtlZmlsZXMgaW4KICB0aGUgcmVsZWFzZSBhcmNoaXZlIChvZiBjb3Vyc2UpLgoKVmVyc2lvbiA3LjQKCkRhbmllbCAoMTYgT2N0b2JlciAyMDAwKQotIFRoZSBidWZmZXIgb3ZlcmZsb3cgbWVudGlvbmVkIGJlbG93IHdhcyBwb3N0ZWQgdG8gYnVndHJhcSBvbiBGcmlkYXkgMTN0aC4KCkRhbmllbCAoMTIgT2N0b2JlciAyMDAwKQotIENvbGluIFJvYmVydCBQaGlwcHMgZWxlZ2FudGx5IGNvcnJlY3RlZCBhIGJ1ZmZlciBvdmVyZmxvdy4gSXQgY291bGQgYmUgdXNlZAogIGJ5IGFuIGV2aWwgZnRwIHNlcnZlciB0byBjcmFzaCBjdXJsLiBJIHRvb2sgdGhlIG9wcG9ydHVuaXR5IG9mIHJlcGxhY2luZyBhCiAgZmV3IG90aGVyIHNwcmludGYoKXMgaW50byBzbnByaW50ZigpcyBhcyB3ZWxsLgoKRGFuaWVsICgxMSBPY3RvYmVyIDIwMDApCi0gRm91bmQgc29tZSBtb3JlIG1lbW9yeSBsZWFrcy4gVGhpcyBuZXcgc2ltcGxlIG1lbW9yeSBkZWJ1Z2dlciBoYXMgdHVybmVkIG91dAogIHJlYWxseSB1c2VmdWwhCgpWZXJzaW9uIDcuNCBwcmU2CgpEYW5pZWwgKDkgT2N0b2JlciAyMDAwKQotIEZsb3JpYW4gS29lbmlnIHBvaW50ZWQgb3V0IHRoYXQgdGhlIGJvb2wgdHlwZWRlZiBpbiB0aGUgY3VybC9jdXJsLmggaW5jbHVkZQogIGZpbGUgd2FzIGJyZWFraW5nIFBIUCA0LjAuMyBjb21waWxpbmcuIFRoZSBib29sIHR5cGVkZWYgaXMgbm90IHVzZWQgaW4gdGhlCiAgcHVibGljIGludGVyZmFjZSBhbmQgd2FzIHdyb25nbHkgaW5zZXJ0ZWQgaW4gdGhhdCBoZWFkZXIgZmlsZS4KCi0gSvZyZyBIYXJ0cm90aCBjb3JyZWN0ZWQgYSBtaW5vciBtZW1vcnkgbGVhayBpbiB0aGUgc3JjL3VybGdsb2IuYyBzdHVmZi4gSXQKICBkaWRuJ3QgaGFybSBhbnlvbmUgc2luY2UgdGhlIG1lbW9yeSBpcyBmcmVlKCllZCBvbiBleGl0IGFueXdheS4KCi0gQ29ycmVjdGVkIHRoZSBzcmMvbWFpbi5jLiBXZSB1c2UgdGhlIF9NUFJJTlRGX1JFUExBQ0UgI2RlZmluZSB0byB1c2Ugb3VyCiAgbGliY3VybC1wcmludGYoKSBmdW5jdGlvbnMuIFRoaXMgZ2l2ZXMgdXMgc25wcmludGYoKSBldCBhbCBvbiBhbGwKICBwbGF0Zm9ybXMuIEkgY29udmVydGVkIHRoZSBhbGxvY2F0ZWQgdXNlcmFnZW50IHN0cmluZyB0byBvbmUgdGhhdCB1c2VzIGEKICBsb2NhbCBidWZmZXIuCgotIEkndmUgc2V0IGFuICNpZiAwIHNlY3Rpb24gYXJvdW5kIHRoZSBDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nIGhlYWRlcgogIGdlbmVyYXRlZCBpbiBsaWIvZm9ybWRhdGEuYy4gVGhpcyB3aWxsIGhvcGVmdWxseSBtYWtlIGN1cmwgZG8gbW9yZQogIFBIUC1mcmllbmRseSBtdWx0aS1wYXJ0IHBvc3RzLgoKVmVyc2lvbiA3LjQgcHJlNQoKRGFuaWVsICg5IE9jdG9iZXIgMjAwMCkKLSBOaWNvIEJhZ2d1cyBmb3VuZCBvdXQgdGhhdCBjdXJsJ3MgYWJpbGl0eSB0byBmb3JjZSBhIEFTQ0lJIGRvd25sb2FkIHdoZW4KICB1c2luZyBGVFAgd2FzIG5vIGxvbmdlciB3b3JraW5nISBJIGNvcnJlY3RlZCB0aGlzLiBUaGlzIHByb2JsZW0gd2FzIHByb2JhYmx5CiAgaW50cm9kdWNlZCB3aGVuIEkgcmVkZXNpZ25lZCBsaWJjdXJsIGZvciB2ZXJzaW9uIDcuCgotIEdlb3JnIEhvcm4gcHJvdmlkZWQgYSBzb3VyY2UgZXhhbXBsZSB0aGF0IHByb3ZlZCBhIG1lbW9yeSBsZWFrIGluIGxpYmN1cmwuCiAgSSBhZGRlZCBzaW1wbGUgbWVtb3J5IGRlYnVnZ2luZyBmYWNpbGl0aWVzIGFuZCBub3cgd2UgY2FuIG1ha2UgbGliY3VybCBsb2cKICBhbGwgbWVtb3J5IGZpZGRsaW5nIGZ1bmN0aW9ucy4gQW4gYWRkaXRpb25hbCBwZXJsIHNjcmlwdCBpcyB1c2VkIHRvIGFuYWx5emUKICB0aGUgb3V0cHV0IGxvZ2ZpbGUgYW5kIHRvIG1hdGNoIG1hbGxvYygpcyB3aXRoIGZyZWUoKXMgZXRjLiBUaGUgbWVtb3J5IGxlYWsKICBHZW9yZyBmb3VuZCB0dXJuZWQgb3V0IHRvIGJlIHRoZSBtYWluIGNvb2tpZSBzdHJ1Y3QgdGhhdCBjb29raWVfY2xlYW51cCgpCiAgZGlkbid0IGZyZWUhIFRoZSBwZXJsIHNjcmlwdCBpcyBuYW1lZCBtZW1hbmFseXplLnBsIGFuZCBpdCBpcyBhdmFpbGFibGUgaW4KICB0aGUgQ1ZTIHJlc3Bvc2l0b3J5LCBub3QgaW4gdGhlIHJlbGVhc2UgYXJjaGl2ZS4KCkRhbmllbCAoOCBPY3RvYmVyIDIwMDApCi0gR2VvcmcgSG9ybiBmb3VuZCBhIEdldEhvc3QoKSBwcm9ibGVtLiBJdCB0dXJuZWQgb3V0IGl0IG5ldmVyIGFzc2lnbmVkIHRoZQogIHBvaW50ZXIgaW4gdGhlIHRoaXJkIGFyZ3VtZW50IHByb3Blcmx5ISBUaGlzIGNvdWxkIG1ha2UgYSBjcmFzaCwgb3IgYXQgYmVzdAogIGEgbWVtb3J5IGxlYWshCgpWZXJzaW9uIDcuNCBwcmU0CgpEYW5pZWwgKDYgT2N0b2JlciAyMDAwKQotIElzIHRoZSAtRiBwb3N0IGZvbGxvd2luZyB0aGUgUkZDIDE4Njcgc3BlYz8gV2UgaGFkIHRoaXMgZGljdXNzaW9uIG9uIHRoZQogIG1haWxpbmcgbGlzdCBzaW5jZSBpdCBhcHBlYXJzIGN1cmwgY2FuJ3QgcG9zdCAtRiBmb3JtIHBvc3RzIHRvIGEgUEhQCiAgcmVjZWl2ZXIuLi4gSSd2ZSBiZWVuIGluIHRvdWNoIHdpdGggdGhlIFBIUCBkZXZlbG9wZXJzIGFib3V0IHRoaXMuCgotIERvbWVuaWNvIEFuZHJlb2xpIGZvdW5kIG91dCB0aGF0IHRoZSBsb25nIG9wdGlvbiAnLS1wcm94eScgd2Fzbid0IHdvcmtpbmcKICBhbnltb3JlISBUaGUgb3B0aW9uIHBhcnNlciBnb3QgY29uZnVzZWQgd2hlbiBJIGFkZGVkIHRoZSAtLXByb3h5dHVubmVsIGZvcgogIDcuMy4gVGhpcyB3YXMgaW5kZWVkIGEgdmVyeSBvbGQgZmxhdyB0aGF0IGhhc24ndCB0dXJuZWQgdXAgdW50aWwgbm93Li4uCgotIEr2cm4gSGFydHJvdGggcHJvdmlkZWQgcGF0Y2hlcywgdXBkYXRlZCBtYWtlZmlsZXMgYW5kIHR3byBuZXcgZmlsZXMgZm9yIERMTAogIHN0dWZmIG9uIHdpbjMyLiBIZSBhbHNvIHBvaW50ZWQgb3V0IHRoYXQgbGliIHNvdXJjZSBmaWxlcyB3ZXJlIGNvbXBpbGVkIHdpdGgKICAtSS4uL3NyYyB3aGljaCBpc24ndCBvbmx5IHdyb25nIGJ1dCBwbGFpbiBzdHVwaWQhCgotIFRyb2VscyBXYWxzdGVkIEhhbnNlbiBmaXhlZCBhIHByb2JsZW0gd2l0aCBIVFRQIHJlc3VtZS4gQ3VybCBwcmV2aW91c2x5IHVzZWQKICBhIGxvY2FsIHZhcmlhYmxlIGJhZGx5LCB0aGF0IGNvdWxkIGxlYWQgdG8gY3Jhc2hlcy4KClZlcnNpb24gNy40IHByZTMKCkRhbmllbCAoNCBPY3RvYmVyIDIwMDApCi0gTW9yZSBkb2NzIHdyaXR0ZW4uIFRoZSBjdXJsX2Vhc3lfZ2V0aW5mby4zIG1hbiBwYWdlIGlzIG5vdyBwcmV0dHkgYWNjdXJhdGUsCiAgYXMgaXMgdGhlIC13IHNlY3Rpb24gaW4gY3VybC4xLiBJIGFkZGVkIHR3byBvcHRpb25zIHRvIGVuYWJsZSB0aGUgdXNlciB0bwogIGdldCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcmVjZWl2ZWQgaGVhZGVycycgc2l6ZSBhbmQgdGhlIHNpemUgb2YgdGhlIEhUVFAKICByZXF1ZXN0LiBULiBCaGFyYXRoIHJlcXVlc3RlZCB0aGVtLgogIApEYW5pZWwgKDMgT2N0b2JlciAyMDAwKQotIENvcnJlY3RlZCBhIHNldmVyIGZyZWUoKSBiZWZvcmUgdXNlIGluIHRoZSBuZXcgYWRkX2J1ZmZlcl9zZW5kKCkhIDstKQoKVmVyc2lvbiA3LjQgcHJlMgoKRGFuaWVsICgzIE9jdG9iZXIgMjAwMCkKLSBKYXNvbiBTLiBQcmllYmUgc2VudCBtZSBwYXRjaGVzIHRoYXQgY2hhbmdlZCB0aGUgd2F5IGN1cmwgaXNzdWVzIEhUVFAKICByZXF1ZXN0cy4gVGhlIGVudGlyZSByZXF1ZXN0IGlzIG5vdyBpc3N1ZWQgaW4gb25lIHNpbmdsZSBzaG90LiBJdCBkaWRuJ3QgZG8KICB0aGlzIHByZXZpb3VzbHksIGFuZCBpdCBoYXMgdHVybmVkIG91dCB0aGF0IHNpbmNlIHRoZSBjb21tb24gYnJvd3NlcnMgZG8gaXQKICB0aGlzIHdheSwgc29tZSBzaXRlcyBoYXZlIHR1cm5lZCBvdXQgdG8gd29yayB3aXRoIGJyb3dzZXJzIGJ1dCBub3Qgd2l0aAogIGN1cmwhIEFsdGhvdWdoIHRoaXMgaXMgbm90IGEgY2xpZW50LXNpZGUgcHJvYmxlbSwgd2Ugd2FudCB0byBiZSBhYmxlIHRvCiAgZnVsbHkgZW11bGF0ZSBicm93c2VycywgYW5kIHRodXMgd2UgaGF2ZSBub3cgYWRqdXN0ZWQgdGhlIG5ldHdvcmtpbmcgbGF5ZXIKICB0byBzbGlnaHRseSBtb3JlIGFwcGVhciBhcyBhIGJyb3dzZXIuIEkgYWRqdXN0ZWQgSmFzb24ncyBwYXRjaCwgdGhlIGZhdWx0cwogIGFyZSBwcm9iYWJseSBtaW5lLgoKRGFuaWVsICgyIE9jdG9iZXIgMjAwMCkKLSBBbnlvbmUgd2hvIGV2ZXIgdXBsb2FkZWQgZGF0YSB3aXRoIGN1cmwgb24gYSBzbG93IGxpbmsgaGFzIG5vdGljZWQgdGhhdCB0aGUKICBwcm9nZXNzIG1ldGVyIGlzIHVwZGF0ZWQgdmVyeSBpbmZyZXF1ZW50bHkuIFRoYXQgaXMgZHVlIHRvIHRoZSBsYXJnZSBidWZmZXIKICBzaXplIGN1cmwgaXMgdXNpbmcuIEl0IHJlYWRzIDUwS2IgYW5kIHNlbmRzIGl0LCB1cGRhdGVzIHRoZSBwcm9ncmVzcyBtZXRlcgogIGFuZCBsb29wcy4gNTBLYiBpcyB2ZXJ5IG11Y2ggb24gYSBzbG93IGxpbmssIGFsdGhvdWdoIGl0IGlzIHByZXR0eSBuZWF0IHRvCiAgdXNlIG9uIGEgZmFzdCBvbmUuCgogIEkndmUgbm93IG1hZGUgYW4gYWRqdXN0bWVudCB0aGF0IG1ha2VzIGN1cmwgdXNlIGEgMktiIGJ1ZmZlciBmb3IgdXBsb2FkcyB0bwogIHN0YXJ0IHdpdGguIElmIGN1cmwncyBhdmVyYWdlIHVwbG9hZCBzcGVlZCBpcyBmYXN0ZXIgdGhhbiBidWZmZXIgc2l6ZSBieXRlcwogIHBlciBzZWNvbmQsIGN1cmwgd2lsbCBpbmNyZWFzZSB0aGUgdXNlZCBidWZmZXIgc2l6ZSB1cCB0byBtYXggNTBLYi4gSXQKICBzaG91bGQgbWFrZSB0aGUgcHJvZ3Jlc3MgbWV0ZXIgd29yayBiZXR0ZXIuCiAgClZlcnNpb24gNy40IHByZTEKCkRhbmllbCAoMjkgU2VwdGVtYmVyIDIwMDApCi0gUmlwcGVkIG91dCB0aGUgLXcgc3R1ZmYgZnJvbSB0aGUgbGlicmFyeSBhbmQgcHV0IGluIHRoZSBjdXJsIHRvb2wuIEl0IGdldHMKICBhbGwgdGhlIHJlbGV2YW50IGluZm8gZnJvbSB0aGUgbGlicmFyeSB1c2luZyB0aGUgbmV3IGN1cmxfZWFzeV9nZXRpbmZvKCkKICBmdW5jdGlvbi4KCi0gYnJhZCBhdCBvcGVuYnNkLm9yZyBtYWlsZWQgbWUgYSBwYXRjaCB0aGF0IGNvcnJlY3RlZCBteSBrZXJiZXJvcyBtaXN0YWtlIGFuZAogIHJlbW92ZWQgYSBjb21waWxlciB3YXJuaW5nIGZyb20gaG9zdGlwLmMgdGhhdCBPcGVuQlNEIHBlb3BsZSBnZXQuCgpEYW5pZWwgKDI4IFNlcHRlbWJlciAyMDAwKQotIE9mIGNvdXJzZSAoSSBzaG91bGQgcHJvYmFibHkgZ2V0IHB1bmlzaGVkIHNvbWVob3cpIEkgZGlkbid0IHByb3Blcmx5IGNvcnJlY3QKICB0aGUgI2luY2x1ZGUgbGluZXMgZm9yIHRoZSBiYXNlNjQgc3R1ZmYgaW4gdGhlIGtlcmJlcm9zIHNvdXJjZXMgaW4gdGhlIGp1c3QKICByZWxlYXNlZCA3LjMgcGFja2FnZS4gVGhleSBzdGlsbCBpbmNsdWRlIHRoZSAqX2tyYi5oIGZpbGVzISBOb3csIHRoZSBlcnJvcgogIGlzIHNvb28gdmVyeSBlYXN5IHRvIHNwb3QgYW5kIGZpeCBzbyBJIHdvbid0IGJvdGhlciB3aXRoIGEgcXVpY2sgYnVnIGZpeAogIHJlbGVhc2UuIEknbGwgcG9zdCBhIHBhdGNoIHdoZW5ldmVyIG9uZSBpcyBuZWVkZWQgaW5zdGVhZC4gSXQnbGwgYmUKICBhdmFpbGFibGUgaW4gdGhlIENWUyBpbiBhIGZldyBtaW51dGVzIGFueXdheS4KClZlcnNpb24gNy4zCgpEYW5pZWwgKDI4IFNlcHRlbWJlciAyMDAwKQotIFJlbW92ZWQgdGhlIGJhc2U2NF9rcmIuW2NoXSBmaWxlcy4gVGhleSd2ZSBub3cgcmVwbGFjZWQgdGhlIGZvcm1lcgogIGJhc2U2NC5bY2hdIGZpbGVzLgoKRGFuaWVsICgyNiBTZXB0ZW1iZXIgMjAwMCkKLSBVcGRhdGVkIHNvbWUgZG9jcy4KCi0gSSBjaGFuZ2VkIHRoZSBPcGVuU1NMIGZpeCB0byB3b3JrIHdpdGggb2xkZXIgdmVyc2lvbnMgYXMgd2VsbC4gVGhlIHBvc3RlZAogIHBhdGNoIHdhcyBvbmx5IHdvcmtpbmcgd2l0aCAwLjkuNiBhbmQgbm8gb2xkZXIgb25lcy4KICAKVmVyc2lvbiA3LjMtcHJlOAoKRGFuaWVsICgyNSBTZXB0ZW1iZXIgMjAwMCkKLSBFcmRtdXQgUGZlaWZlciBpbmZvcm1lZCB1cyB0aGF0IGN1cmwgZGlkbid0IGJ1aWxkIHdpdGggT3BlblNTTCAwLjkuNiBhbmQKICBzaG93ZWQgdXMgd2hhdCBuZWVkZWQgdG8gZ2V0IHBhdGNoZWQgaW4gb3JkZXIgdG8gbWFrZSBpdCBidWlsZCBwcm9wZXJseQogIGFnYWluLgoKLSBEaXJrIEtydXNjaGV3c2tpIGZvdW5kIGEgYnVnIGluIHRoZSBjb29raWUgcGFyc2VyLiBJIG1hZGUgYW4gYWx0ZXJuYXRpdmUKICBhcHByb2FjaCB0byB0aGUgc29sdXRpb24gRGlyayBoaW1zZWxmIHN1Z2dlc3RlZC4gVGhlIGJ1ZyBtYWRlIGEgY29va2llCiAgaGVhZGVyIHRoYXQgZGlkbid0IGVuZCB3aXRoIGEgdHJhaWxpbmcgc2VtaWNvbG9uIHRvIG5vdCBnZXQgcGFyc2VkLgoKLSBJJ3ZlIG1hcmtlZCAtYyBhbmQgLXQgZGVwcmVjYXRlZCBub3cuIElmIHlvdSB1c2UgYW55IG9mIHRoZW0sIGN1cmwgd2lsbCB0ZWxsCiAgeW91IHRvIHVzZSAiLUMgLSIgb3IgIi1UIC0iIGluc3RlYWQuIEkgZG9uJ3QgdGhpbmsgb2NjdXB5aW5nIHR3byBsZXR0ZXJzIGZvcgogIG5lYXJseSBpZGVudGljYWwgZnVuY3Rpb25zIGlzIGdvb2QgdXNlLiBBbHNvLCAtVCAtIGtpbmQgb2YgZm9sbG93cyB0aGUgY3VybAogIHRyYWRpdGlvbiBvZiB1c2luZyAtIGZvciBzdGRpbiB3aGVyZSBhIGZpbGUgbmFtZSBpcyBleHBlY3RlZC4KCkRhbmllbCAoMjMgU2VwdGVtYmVyIDIwMDApCi0gTWFydGluIEhlZGVuZmFsayBwcm92aWRlZCB0aGUgcGF0Y2ggdGhhdCBmaW5hbGx5IG1hZGUgdGhlIGtyYjQgZnRwIHVwbG9hZAogIHdvcmshCgpEYW5pZWwgKDIxIFNlcHRlbWJlciAyMDAwKQotIFRoZSBrZXJiZXJvcyBjb2RlIGlzIG5vdCBxdWl0ZSB0aHJlYWQtc2FmZSB5ZXQuIFRoZXJlIGFyZSBhIGZldyBtb3JlIGdsb2JhbHMKICB0aGF0IG5lZWQgdG8gYmUgdGFrZSBjYXJlIG9mLiBMZXQncyBnZXQgdGhlIHVwbG9hZCB3b3JraW5nIGZpcnN0IQoKRGFuaWVsICgyMCBTZXB0ZW1iZXIgMjAwMCkKLSBSaWNoYXJkIFByZXNjb3R0IHNvbHZlZCBhbm90aGVyIG5hbWUgbG9va3VwIGJ1ZmZlciBzaXplIHByb2JsZW0uIEkgdG9vayB0aGlzCiAgb3Bwb3J0dW5pdHkgdG8gcmV3cml0ZSB0aGUgR2V0SG9zdCgpIGZ1bmN0aW9uLiBXaXRoIHRoZXNlIGxhcmdlIGJ1ZmZlcgogIHNpemVzLCBJIHRoaW5rIGtlZXBpbmcgdGhlbSBhcyBsb2NhbCBhcnJheXMgcXVpY2tseSB0dXJuIHVnbHkuIEkgbm93IHVzZQogIG1hbGxvYygpIHRvIGdldCB0aGUgYnVmZmVyIG1lbW9yeS4gVGhhbmtzIHRvIHRoaXMsIEkgbm93IGNhbiByZWFsbG9jKCkgdG8gYQogIGxhcmdlIGJ1ZmZlciBpbiBjYXNlIG9mIGRlbWFuZCAoZXJybm8gPT0gRVJBTkdFKSBpbiBjYXNlIGEgc29sdXRpb24gbGlrZQogIHRoYXQgd291bGQgYmVjb21lIG5lY2Vzc2FyeS4gSSBzdGlsbCB3YW50IHRvIGF2b2lkIHRoYXQga2luZCBvZiBuYXN0aW5lc3MuCgotIFRyaWVkIHRvIGNvbXBpbGUgYW5kIHJ1biBjdXJsIG9uIExpbnV4IGZvciBhbHBoYSBhbmQgRnJlZUJTRCBmb3IgYWxwaGEuIFdlbnQKICBhcyBzbW9vdGggYXMgaXQgY291bGQuCgotIEFkZGVkIGEgZG9jcy9leGFtcGxlcyBkaXJlY3Rvcnkgd2l0aCB0d28gdGlueSBleGFtcGxlIHNvdXJjZXMgdGhhdCBzaG93IGhvdwogIHRvIHVzZSBsaWJjdXJsLiBJIGhvcGUgdXNlcnMgd2lsbCBzdXBwbHkgbWUgd2l0aCBtb3JlIHVzZWZ1bCBleGFtcGxlcwogIGZ1cnRoZXIgb24uCgotIEFwcGxpZWQgYSBwYXRjaCBieSBK9nJuIEhhcnRyb3RoIHRvIG5vIGxvbmdlciB1c2UgdGhlIHdvcmQgJ2ludGVmYWNlJyBpbiB0aGUKICBjb25maWcgc3RydWN0IGluIHRoZSBzcmMvbWFpbi5jIGZpbGUgc2luY2UgY2VydGFpbiBjb21waWxlcnMgaGF2ZSB0aGF0IHdvcmQKICAicmVzZXJ2ZXJlZCIuICBJIGZpZ3VyZSB0aGF0IGlzIHNvbWUga2luZCBvZiBDKysgZGVjZWFzZS4KCi0gVXBkYXRlZCB0aGUgY3VybC4xIG1hbiBwYWdlIHdpdGggLS1pbnRlcmZhY2UgYW5kIC0ta3JiNC4KCi0gTW9kaWZpZWQgdGhlIGJhc2U2NEVuY29kZSgpIGZ1bmN0aW9uIHRvIHdvcmsgbGlrZSB0aGUga2VyYmVyb3Mgb25lLCBzbyB0aGF0CiAgSSBjb3VsZCByZW1vdmUgdGhlIHVzZSBvZiB0aGF0LiBUaGVyZSBpcyBubyBuZWVkIGZvciAqdHdvKiBiYXNlNjQgZW5jb2RpbmcKICBmdW5jdGlvbnMhIDstKQoKVmVyc2lvbiA3LjNwcmU1CgpEYW5pZWwgKDE5IFNlcHRlbWJlciAyMDAwKQotIFRoZSBrZXJiZXJvczQtbGF5ZXIgc291cmNlIGNvZGUgdGhhdCBpcyBtdWNoICJpbmZsdWVuY2VkIiBieSB0aGUgb3JpZ2luYWwKICBrcmI0IHNvdXJjZSBjb2RlLCB0aHJvdWdoIHlhZmMgaW50byBjdXJsLCB3YXMgdXNpbmcgcXVpdGUgYSBsb3Qgb2YgZ2xvYmFsCiAgdmFyaWFibGVzLiBsaWJjdXJsIGNhbid0IHdvcmsgcHJvcGVybHkgd2l0aCBnbG9iYWxzIGxpa2UgdGhhdCB3aHkgSSBoYWQgdG8KICBjbGVhbiB1cCBhbG1vc3QgZXZlcnkgZnVuY3Rpb24gaW4gdGhlIG5ldyBzZWN1cml0eS5jIHRvIG1ha2UgdGhlbSB1c2UKICBjb25uZWN0aW9uIHNwZWNpZmljIHZhcmlhYmxlcyBpbnN0ZWFkIG9mIHRoZSBnbG9iYWxzLiBJIGp1c3QgaG9wZSBJIGRpZG4ndAogIGRlc3Ryb3kgYW55dGhpbmcgbm93Li4uIDotKSBjb25maWd1cmUgdXBkYXRlZCwgdmVyc2lvbiBzdHJpbmcgbm93IHJlZmxlY3RzCiAga3JiNCBidWlsdC1pbi4gSXQgYWxtb3N0IHdvcmtzIG5vdy4gT25seSB1cGxvYWRzIGFyZSBzdGlsbCBiZWluZyBuYXVnaHR5LgoKVmVyc2lvbiA3LjNwcmUzCgpEYW5pZWwgKDE4IFNlcHRlbWJlciAyMDAwKQotIE1hcnRpbiBIZWRlbmZhbGsgc3VwcGxpZWQgYSBtYWpvciBwYXRjaCB0aGF0IGludHJvZHVjZXMga3JiNC1mdHAgc3VwcG9ydCB0bwogIGN1cmwuIE1hcnRpbiBpcyB0aGUgcHJpbWFyeSBhdXRob3Igb2YgdGhlIGZ0cCBjbGllbnQgbmFtZWQgeWFmYyBhbmQgaGUgZGlkCiAgbm90IGhlc2l0YXRlIHRvIGhlbHAgdXMgaW1wbGVtZW50IHRoaXMgd2hlbiBJIGFza2VkIGhpbS4gTWFueSBhbmQgc2luY2VyZQogIHRoYW5rcyB0byBhIHNwbGVuZGlkIGVmZm9ydC4gSXQgZGlkbid0IGV2ZW4gdGFrZSBtYW55IGhvdXJzIQoKLSBTdGVwaGVuIEtpY2sgc3VwcGxpZWQgYSBiaWcgcGF0Y2ggdGhhdCBpbnRyb2R1Y2VzIHRoZSAtLWludGVyZmFjZSBmbGFnIHRvCiAgdGhlIGN1cmwgdG9vbCBhbmQgQ1VSTE9QVF9JTlRFUkZBQ0UgZm9yIGxpYmN1cmwuIEl0IGFsbG93cyB5b3UgdG8gc3BlY2lmeSBhbgogIG91dGdvaW5nIGludGVyZmFjZSB0byB1c2UgZm9yIHlvdXIgcmVxdWVzdC4gVGhpcyBtYXkgbm90IHdvcmsgb24gYWxsCiAgcGxhdGZvcm1zLiBUaGlzIG5lZWRzIHRlc3RpbmcuCgotIFJpY2hhcmQgUHJlc2NvdHQgbm90aWNlZCB0aGF0IGN1cmwgb24gVHJ1NjQgdW5peCBjb3VsZCBjb3JlIGR1bXBlZCBpZiB0aGUKICBuYW1lIGRpZG4ndCByZXNvbHZlIHByb3Blcmx5LiBUaGlzIHdhcyBkdWUgdG8gdGhlIEdldEhvc3QoKSBmdW5jdGlvbiBub3QKICByZXR1cm5pbmcgYW4gZXJyb3IgZXZlbiB0aG91Z2ggaXQgZmFpbGVkIG9uIHNvbWUgcGxhdGZvcm1zIQoKRGFuaWVsICgxNSBTZXB0ZW1iZXIgMjAwMCkKLSBVcGRhdGVkIGFsbCBzb3J0cyBvZiBkb2N1bWVudHMgaW4gcmVnYXJkcyB0byB0aGUgbmV3IHByb3h5dHVubmVsIHN1cHBvcnQuCgpWZXJzaW9uIDcuM3ByZTIKCkRhbmllbCAoMTUgU2VwdGVtYmVyIDIwMDApCi0gS2FpLVV3ZSBSb21tZWwgcG9pbnRlZCBvdXQgYSBwcm9ibGVtIGluIHRoZSBodHRwcHJveHl0dW5uZWwgc3R1ZmYgZm9yIGZ0cC4KICBBZGp1c3RlZCBpdC4gQWRkZWQgYmV0dGVyIGluZm8gbWVzc2FnZSB3aGVuIHNldHRpbmcgdXAgdGhlIHR1bm5lbCBhbmQgdGhlCiAgcGFzdiBtZXNzYWdlIHdoZW4gZG9pbmcgdGhlIHNlY29uZCBjb25uZWN0LgogIApWZXJzaW9uIDcuM3ByZTEKCkRhbmllbCAoMTUgU2VwdGVtYmVyIDIwMDApCi0gbGliY3VybCBub3cgYWxsb3dzICJodHRwcHJveHl0dW5uZWwiIHRvIGFuIGFyYml0cmFyeSBob3N0IGFuZCBwb3J0IG5hbWUuIFRoZQogIHNlY29uZCBjb25uZWN0aW9uIG9uIGZ0cCBuZWVkZWQgdGhhdC4KCi0gVGhlQXJ0T2ZIVFRQU2NyaXB0aW5nIHdhcyBjb3JyZWN0ZWQgYWxsIG92ZXIuIEkgYm90aCB0eXBlIGFuZCBzcGVsbCByZWFsbHkKICBiYWQgYXQgdGltZXMhCiAgCkRhbmllbCAoMTQgU2VwdGVtYmVyIDIwMDApCi0gLXAvLS1wcm94eXR1bm5lbCB3YXMgYWRkZWQgdG8gJ2N1cmwnLiBJdCB1c2VzIHRoZSBuZXcKICBDVVJMT1BUX0hUVFBQUk9YWVRVTk5FTCBsaWJjdXJsIG9wdGlvbiB0aGF0IGFsbG93cyAiYW55IiBwcm90b2NvbCB0byB0dW5uZWwKICB0aHJvdWdoIHRoZSBzcGVjaWZpZWQgaHR0cCBwcm94eS4gQXQgdGhlIG1vbWVudCwgdGhpcyBzaG91bGQgd29yayB3aXRoIGZ0cC4KCkRhbmllbCAoMTMgU2VwdGVtYmVyIDIwMDApCi0gSm9jaGVuIFNjaGFldWJsZSBmb3VuZCB0aGF0IGZpbGU6Ly8gZGlkbid0IHdvcmsgYXMgZXhwZWN0ZWQuIENvcnJlY3RlZCB0aGlzCiAgYW5kIG1haWxlZCB0aGUgcGF0Y2ggdG8gdGhlIG1haWxpbmcgbGlzdC4KCkRhbmllbCAoNyBTZXB0ZW1iZXIgMjAwMCkKLSBJIGNoYW5nZWQgdGhlICNkZWZpbmUgVCgpIGluIGN1cmwuaCBzaW5jZSBpdCB0dXJuZWQgb3V0IGl0IHdhc24ndCByZWFsbHkKICBhIGdvb2Qgc3ltYm9sIHRvIHVzZSAod2hlbiB5b3UgY29tcGlsZWQgUEhQIHdpdGggY3VybCBhcyBhIG1vZHVsZSwgdGhhdAogIGRlZmluZSBjb2xsaWRlZCB3aXRoIHNvbWUgSU1BUCBkZWZpbmUgb3Igc29tZXRoaW5nKS4gVGhpcyB3YXMgcG9zdGVkIHRvIHRoZQogIFBIUCBidWcgdHJhY2tlci4KCi0gSSBhZGRlZCBleHRlcm4gIkMiIHN0dWZmIGluIHR3byBoZWFkZXIgZmlsZXMgdG8gYmV0dGVyIGFsbG93IGxpYmN1cmwgdXNhZ2UKICBpbiBDKysgc29yY2VzLiBEaXNjdXNzaW9ucyBvbiB0aGUgbGliY3VybCBsaXN0IHdpdGggRGFubnkgSG9yc3dlbGwgbGVhZCB0bwogIHRoaXMuCgpWZXJzaW9uIDcuMi4xCgpEYW5pZWwgKDMxIEF1Z3VzdCAyMDAwKQotIEFsYmVydCBDaGluLUEtWW91bmcgZml4ZWQgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgKmFnYWluKiBhbmQgbm93IGl0IHNlZW1zIHRvCiAgZGV0ZWN0IExpbnV4IG5hbWUgcmVzb2x2aW5nIHByb3Blcmx5ISAoaGVhcmQgdGhhdCBiZWZvcmU/KQoKLSBUcm9lbHMgV2Fsc3RlZCBIYW5zZW4gcG9pbnRlZCBvdXQgdGhhdCBkb3dubG9hZGluZyBhIGZpbGUgY29udGFpbmluZyB0aGUKICBsZXR0ZXIgJysnIGZyb20gYW4gZnRwIHNlcnZlciBkaWRuJ3Qgd29yay4gSXQgZGlkIHdvcmsgZnJvbSBIVFRQIHRob3VnaCBhbmQKICB0aGUgcmVhc29uIHdhcyBteSBsYW1lIFVSTCBkZWNvZGVyLgoKLSBJIGhhcHBlbmVkIHRvIG5vdGljZSB0aGF0IC1JIGRpZG4ndCBhdCBhbGwgd29yayBvbiBmdHAgYW55bW9yZS4gSSBjb3JyZWN0ZWQKICB0aGF0LgoKVmVyc2lvbiA3LjIKCkRhbmllbCAoMzAgQXVndXN0IDIwMDApCi0gVW5kZXJzdGFuZGluZyBBSVggaXMgYSBoYXJkIHRhc2suIEkgYmVsaWV2ZSBJJ2xsIG5ldmVyIGZpZ3VyZSBvdXQgd2h5IHRoZXkKICBzb2x2ZSB0aGluZ3Mgc28gZGlmZmVyZW50bHkgZnJvbSB0aGUgb3RoZXIgdW5peGVzLiBOb3csIEknbSBsZWZ0IHdpdGggdGhlCiAgQUlYIDQuMyBydW4tdGltZSB3YXJuaW5ncyBhYm91dCBkdXBsaWNhdGUgc3ltYm9scyB0aGF0IGFjY29yZGluZyB0byB0aGlzCiAgYXJ0aWNsZSAoaHR0cDovL3d3dy5nZW9jcmF3bGVyLmNvbS9hcmNoaXZlcy8zLzQwNS8xOTk5LzkvMC8yNTkzNDI4LykgaXMgYQogIGxpYnRvb2wgZmxhdy4gSSB0cmllZCB0aGUgbWVudGlvbmVkIHBhdGNoLCBhbHRob3VnaCB0aGF0IHN0b3BzIHRoZSBsaW5raW5nCiAgY29tcGxldGVseS4KCiAgU28sIGlmIEkgc2VsZWN0IHRvIGlnbm9yZSB0aGUgbGQgd2FybmluZ3MgdGhlcmUgYXJlIGNvbXBpbGVyIHdhcm5pbmdzIHRoYXQKICBmaWxsIHRoZSBzY3JlZW4gcHJldHR5IGJhZCB3aGVuIGN1cmwgY29tcGlsZXMuIEl0IHR1cm5zIG91dCB0aGF0IGlmIEkgd2FudAogIHRvICcjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+JywgSSBjYW4gZ2V0IHRpZCBvZiB0aGUgd2FybmluZ3MgYnkgaW5jbHVkZSB0aGUKICBmb2xsb3dpbmcgdGhyZWUgaW5jbHVkZSBmaWxlcyBiZWZvcmUgdGhhdCBvbmU6CgogICAgICAgICNpbmNsdWRlIDxuZXQvaWZfZGwuaD4KICAgICAgICAjaW5jbHVkZSA8c3lzL21idWYuaD4KICAgICAgICAjaW5jbHVkZSA8bmV0aW5ldC9pZl9ldGhlci5oPgoKICBOb3csIGlzIGl0IHJlYWxseSBzYW5lIHRvIGFkZCB0aG9zZSBpbmNsdWRlIGZpbGVzIGJlZm9yZSBhcnBhL2luZXQuaCBpbiBhbGwKICB0aGUgc291cmNlIGZpbGVzIHRoYXQgaW5jbHVkZSBpdD8KCiAgVGhhbmtzIHRvIEFsYmVydCBDaGluLUEtWW91bmcgYXQgdGhld3JpdHRlbndvcmQuY29tIHdobyBnYXZlIG1lIHRoZSBBSVgKICBsb2dpbiB0byB0cnkgZXZlcnl0aGluZyBvbi4KCkRhbmllbCAoMjQgQXVndXN0IDIwMDApCi0gSmFuIFNjaG1pZHQgc3VwcGxpZWQgdXMgYSBuZXcgVkM2IG1ha2VmaWxlIGZvciBXaW5kb3dzIGFzIHRoZSBwcmV2aW91cyBvbmUKICB3YXMgbm90IHVwIHRvIGRhdGUgYnV0IGxhY2tlZCBzZXZlcmFsIG9iamVjdCBmaWxlcy4KCi0gTW9yZSB3b3JrIG9uIHRoZSBuYW1pbmcuCgotIEFsYmVydCBDaGluLUEtWW91bmcgcHJvdmlkZWQgYSBjb25maWd1cmUtY2hlY2sgZm9yIGxhcmdlIGZpbGUgc3VwcG9ydCwgYXMKICBzb21lIHN5c3RlbXMgc2VlbSB0byBuZWVkIHRoYXQgZm9yIHRoZW0gdG8gd29yay4gSGFkIHRvIGNoYW5nZSB0aGUgcG9zaXRpb24KICBmb3IgdGhlIGNvbmZpZy5oIGluY2x1ZGUgZmlsZSBpbiBldmVyeSAuYyBmaWxlIGluIHRoZSBsaWJjdXJsIGRpci4uLgoKLSBBcyBzdWdnZXN0ZWQgb24gdGhlIG1haWxpbmcgbGlzdCAoYnkgVHJveSBFbmdlbCksIEkgZGlkIHVzZSBhIC0tZGF0YS1iaW5hcnkKICBvcHRpb24gaW5zdGVhZCBvZiB0aGUgbWVzc3kgd2F5IEkndmUgbGVmdCBkZXNjcmliZWQgYmVsb3cuIEl0IHNlZW1zIHRvCiAgd29yay4gVGhlIGxpYmN1cmwgZml4IHJlbWFpbmVkIHRoZSBzYW1lIGFzIHllc3RlcmRheS4KCkRhbmllbCAoMjMgQXVndXN0IDIwMDApCi0gQmFjayBvbiB0aGUgLWQgc3RyaXBwaW5nIG5ld2xpbmVzIHRoaW5nLiBUaGUgJ3BsYWluIHBvc3QnIHRoaW5nIHdhcyBhZGRlZAogIHdoZW4gSSBoYWQgbm8gdGhvdWdodCBvZiB0aGF0IG9uZSBjb3VsZCBhY3R1YWxseSBwb3N0IGJpbmFyeSBkYXRhIHdpdGgKICBpdC4gTm93LCBJIGhhdmUgdG8gYWRkIHRoaXMgZnVuY3Rpb25hbGl0eSBpbiBhIGdyYWNlZnVsIG1hbm5lciBhbmQgSSB0aGluawogIEkndmUgbWFuYWdlZCB0byBjb21lIHVwIHdpdGggYSB3YXk6ICctZCBAZmlsZTtiaW5hcnknIHdpbGwgdGh1cyBwb3N0IHRoZQogIGZpbGUgYmluYXJ5LCBleGFjdGx5IGFzIGl0cyBjb250ZW50cyBhcmUuIEl0IGlzIGltcGxlbWVudGVkIHdpdGggYSBuZXcKICAqc2V0b3B0KCkgb3B0aW9uIChDVVJMT1BUX1BPU1RGSUVMRFNJWkUpIHRvIHNldCB0aGUgcG9zdGZpZWxkIHNpemUsIHNpbmNlCiAgbGliY3VybCBjYW4ndCBzdHJsZW4oKSB0aGUgZGF0YSBpbiB0aGVzZSBjYXNlcy4KCi0gQWxiZXJ0IENoaW4tQS1Zb3VuZyBtYWRlIHNvbWUgdmVyeSBzZXJpb3VzIGVmZm9ydHMgYW5kIGFsbCB0aGUgbmFtZQogIHJlc29sdmluZyBwcm9ibGVtcyBzZWVtIHRvIGhhdmUgYmVlbiBzb3J0ZWQgb3V0IG5vdyBvbiBhbGwgdGhlIHBsYXRmb3JtcwogIHRoYXQgcHJldmlvdXNseSBzaG93ZWQgdGhlbS4gSSdsbCBtYWtlIGFub3RoZXIgcmVsZWFzZSBub3cgYW55ZGF5IGJlY2F1c2Ugb2YKICB0aGlzLgoKLSBUaGUgRkFRIHdhcyBtdWNoIGVuaGFuY2VkIHdoZW4gaXQgY29tZXMgdG8gdGhlIGxpY2Vuc2luZyBpc3N1ZXMgdGhhbmtzIHRvCiAgQmpvcm4gUmVlc2UuCgpEYW5pZWwgKDIxIEF1Z3VzdCAyMDAwKQotIFJpY2sgV2VseWtvY2h5IHBvaW50ZWQgb3V0IGEgcHJvYmxlbSB3aGVuIHlvdSB1c2UgLWQgdG8gcG9zdCBhbmQgeW91IHdhbnQgdG8KICBrZWVwIHRoZSBuZXdsaW5lcywgYXMgY3VybCBzdHJpcHMgdGhlbSBvZmYgYXMgYSBib251cyBiZWZvcmUgcG9zdGluZy4uLgogIFRoaXMgbmVlZHMgdG8gYmUgYWRkcmVzc2VkLgoKVmVyc2lvbiA3LjEuMQoKRGFuaWVsICgyMSBBdWd1c3QgMjAwMCkKLSBHb3QgbW9yZSBwZW9wbGUgaW52b2x2ZWQgaW4gdGhlIGdldGhvc3RieW5hbWVfcigpIG1lc3MuIENhb2xhbiBNY05hbWFyYSBzZW50CiAgbWUgY29uZmlndXJlLWNvZGUgdGhhdCB0dXJuZWQgb3V0IHRvIGJlIHZlcnkgc2ltaWxhciB0byBteSBleGlzdGluZyB0ZXN0cwogIHdoaWNoIG9ubHkgbWFrZSBtZSBtb3JlIHN1cmUgSSdtIG9uIHRoZSByaWdodCBwYXRoLiBJIGNoYW5nZWQgdGhlIG9yZGVyIG9mCiAgdGhlIHRlc3RzIHNsaWdodGx5LCBhcyBpdCBzZWVtcyB0aGF0IHNvbWUgY29tcGlsZXJzIGRvbid0IHllbGwgZXJyb3IgaWYgYQogIGZ1bmN0aW9uIGlzIHVzZWQgd2l0aCB0b28gbWFueSBwYXJhbWV0ZXJzLiBUaHVzLCB0aGUgZmlyc3QgdGVzdGVkIGZ1bmN0aW9uCiAgd2lsbCBzZWVtIG9rLi4uIExldCdzIGhvcGUgbW9yZSBjb21waWxlcnMgdGhpbmsgb2YgdG9vLWZldyBwYXJhbWV0ZXJzIGFzIGJhZAogIG1hbm5lcnMsIGFzIHdlJ3JlIG5vdyB0cnlpbmcgdGhlIGZ1bmN0aW9ucyBpbiB0aGF0IG9yZGVyOyBmZXdlciBmaXJzdC4gSQogIHNob3VsZCBhbHNvIGFkZCB0aGF0IExhcnMgSGVja2luZyBtYWlsZWQgbWUgYW5kIHZvbHVudGVlcmVkIHRvIHJ1biB0ZXN0cyBvbgogIGEgZmV3IG9kZCBzeXN0ZW1zLiBDb2FsYW4gaXMga2VlcGluZyBoaXMgd29yayBvdmVyIGF0CiAgaHR0cDovL3d3dy5jc24udWwuaWUvfmNhb2xhbi9wdWJsaW5rL2dldGhvc3RieW5hbWVfci8uIE1pZ2h0IGJlIGhhbmR5IGluIHRoZQogIGZ1dHVyZSBhcyB3ZWxsLgoKRGFuaWVsICgxOCBBdWd1c3QgMjAwMCkKLSBJIG5vdGljZWQgSSBoYWRuJ3QgaW5jcmVhc2VkIHRoZSBuYW1lIGxvb2t1cCBidWZmZXIgaW4gbGliL2Z0cC5jLiBJIGRvbid0CiAgdGhpbmsgdGhpcyBpcyB0aGUgcmVhc29uIGZvciB0aGUgY29udGludWVkIHRyb3VibGUgdGhvdWdoLgoKRGFuaWVsICgxNyBBdWd1c3QgMjAwMCkKLSBGcmVkIE5veiBjb3JyZWN0ZWQgbXkgc3R1cGlkIG1pc3Rha2VzIGluIHRoZSBnZXRob3N0YnluYW1lX3IoKSBmbHVmZi4gSXQKICBzaG91bGQgYWZmZWN0IHNvbWUgQUlYLCBEaWdpdGFsIFVuaXggYW5kIEhQVVggMTAgc3lzdGVtcy4KCkRhbmllbCAoMTUgQXVndXN0IDIwMDApCi0gTWF0aGlldSBMZWdhcmUgY29tcGlsZWQgYW5kIGJ1aWxkIDcuMSB3aXRob3V0IGVycm9ycyBvbiBib3RoIEFJWCA0LjIgYXMgd2VsbAogIGFzIEFJWCA0LjMuIE5vdyB3aHkgZGlkIHByb2JsZW1zIG9jY3VyIGJlZm9yZT8KCi0gRnJlZCBOb3ogcmVwb3J0ZWQgYSAtdy8tLXdyaXRlLW91dCBidWcgdGhhdCBjYXVzZWQgaXQgdG8gbWFsZnVuY3Rpb24gd2hlbgogIHVzZWQgY29tYmluZWQgd2l0aCBtdWx0aXBsZSBVUkwgcmV0cmlldmFsZXMuIEFsbCBidXQgdGhlIGZpcnN0IGRpc3BsYXkgZ290CiAgc2NyZXdlZCB1cCEKCkRhbmllbCAoMTEgQXVndXN0IDIwMDApCi0gSmFzb24gUHJpZWJlIGFuZCBhbiBhbm9ueW1vdXMgZnJpZW5kIGZvdW5kIHNvbWUgaG9zdCBuYW1lcyB0aGUgTGludXggdmVyc2lvbgogIG9mIGN1cmwgY291bGQgbm90IHJlc29sdmUuIEl0IHR1cm5lZCBvdXQgdGhlIGJ1ZmZlciB1c2VkIHRvIHJldHJpZXZlIHRoYXQKICBpbmZvcm1hdGlvbiB3YXMgdG9vIHNtYWxsLiBGaXhlZC4gT25lIGNvdWxkIGFyZ3VlIGFib3V0IHRoZSB1c2VmdWxuZXNzIG9mCiAgbm90IGhhdmluZyB0aGUgc2xpZ2h0ZXN0IHRyYWNlIG9mIGEgbWFuIHBhZ2UgZm9yIGdldGhvc3RieW5hbWVfcigpIG9uIG15CiAgTGludXggUmVkaGF0IGluc3RhbGxhdGlvbi4uLgoKRGFuaWVsICgxMCBBdWd1c3QgMjAwMCkKLSBCYWxhamkgUyBSYW8gd2FzIGZpcnN0IGluIGxpbmUgdG8gbm90ZSB0aGUgbWlzc2luZyBwb3NzaWJpbGl0eSB0byByZXBsYWNlCiAgdGhlIENvbnRlbnQtVHlwZTogYW5kIENvbnRlbnQtTGVuZ3RoOiBoZWFkZXJzIHdoZW4gZG9pbmcgLWQgcG9zdHMuIEkgYWRkZWQKICB0aGUgcG9zc2liaWxpdHkganVzdCBub3cuIEl0IHNlZW1zIHNvbWUgcGVvcGxlIHdhbnRzIHRvIGRvIHN0YW5kYXJkIHBvc3RzCiAgdXNpbmcgY3VzdG9tIENvbnRlbnQtVHlwZXMuCgpEYW5pZWwgKDggQXVndXN0IDIwMDApCi0gTWlrZSBEb3dlbGwgY29ycmVjdGx5IGRpc2NvdmVyZWQgdGhhdCBjdXJsIGRpZCBub3QgYXBwcm92ZSBvZiBVUkxzIHdpdGggbm8KICB1c2VyIG5hbWUgYnV0IHBhc3N3b3JkLiBBcyBpbiAnaHR0cDovLzpmb29AaGF4eC5zZScuIEkgY29ycmVjdGVkIHRoaXMuCgpWZXJzaW9uIDcuMQoKRGFuaWVsICg3IEF1Z3VzdCAyMDAwKQotIE15IEFJWCA0IGZpeCBkb2VzIG5vdCB3b3JrLiBJIG5lZWQgaGVscCBmcm9tIGEgQUlYIDQgaGFja2VyLgoKLSBJIGFkZGVkIG15IG5ldyBkb2N1bWVudCBpbiB0aGUgZG9jcyBkaXJlY3RvcnkuIEl0IGlzIGFpbWVkIHRvIGJlY29tZSBhIHNvcnQKICBvZiB0dXRvcmlhbCBvbiBob3cgdG8gZG8gSFRUUCBzY3JpcHRpbmcgd2l0aCBjdXJsLgoKRGFuaWVsICg0IEF1Z3VzdCAyMDAwKQotIFdvcmtpbmcgd2l0aCBSaWNoIEdyYXkgb24gY29tcGlsaW5nIGN1cmwgZm9yIGxvdHMgb2YgZGlmZmVyZW50IHBsYXRmb3Jtcy4KICBNeSBmaXggZm9yIEFJWCAzLjIgd2FzIG5vdCBnb29kIGVub3VnaCBhbmQgd2FzIHNsaWdodGx5IGNoYW5nZWQsIEkgaGFkIHRvCiAgbW92ZSBhbiBpbmNsdWRlIGZpbGUgYmVmb3JlIGFub3RoZXIsIGFzIGlzIG5vdyBkZXNjcmliZWQgaW4gdGhlIHNvdXJjZS4KCiAgQUlYIDQuMiAoNC5YPykgaGFzIGRpZmZlcmVudCBnZXRob3N0YnluYW1lX3IoKSBhbmQgZ2V0aG9zdGJ5YWRkcl9yKCkKICBmdW5jdGlvbnMgdGhhdCB0aGUgY29uZmlndXJlIHNjcmlwdCBkaWRuJ3QgY2hlY2sgZm9yIGFuZCB0aHVzIHRoZSBjb21waWxlCiAgYnJva2Ugd2l0aCBhbiBlcnJvci4gSSBoYXZlIG5vdyBjaGFuZ2VkIHRoZSBnZXRob3N0YnluYW1lX3IoKSBjaGVjayBpbiB0aGUKICBjb25maWd1cmUgZmlsZSB0byBzdXBwb3J0IGFsbCB0aHJlZSB2ZXJzaW9ucyBvZiBib3RoIHRoZXNlIGZ1bmN0aW9ucy4gTXkKICBpbXBsZW1lbnRhdGlvbiB0aGF0IHVzZXMgdGhlIEFJWC1zdHlsZSBpcyB0aG91Z2ggbm90IHlldCB2ZXJpZmllZCBhbmQgSSBtYXkKICBnZXQgcHJvYmxlbXMgdG8gZml4IGl0IGlmIGl0IHR1cm5zIG91dCB0byBidWcgc2luY2UgSSBkb24ndCBoYXZlIGFjY2VzcyB0bwogIGFueSBzeXN0ZW0gdXNpbmcgdGhhdC4KCiAgRm9yIHByb2JsZW1zIGxpa2UgdGhhdCwgSSBtYWRlIHRoZSBjb25maWd1cmUgc2NyaXB0IGFsbG93IC0tZGlzYWJsZS10aHJlYWQKICB0byBjb21wbGV0ZWx5IHN3aXRjaCBvZmYgdGhlIGNoZWNrIGZvciB0aHJlYWRzYWZlIHZlcnNpb25zIG9mIGEgZmV3CiAgZnVuY3Rpb25zIGFuZCB0aHVzIGdvIHdpdGggdGhlICJnb29kIG9sZCB2ZXJzaW9ucyIgdGhhdCB0ZW5kIHRvIHdvcmsKICBhbHRob3VnaCB3aWxsIGJyZWFrIHRocmVhZC1zYWZlbmVzcyBmb3IgbGliY3VybC4gTW9zdCBwZW9wbGUgd29uJ3QgdXNlCiAgbGliY3VybCBmb3Igb3RoZXIgdGhpbmdzIHRoYW4gY3VybCB0aG91Z2gsIGFuZCBjdXJsIGRvZXNuJ3QgbmVlZCBhCiAgdGhyZWFkLXNhZmUgbGliLgoKLSBXb3JraW5nIG9uIG15IGJpZyB0dXRvcmlhbCBhYm91dCBIVFRQIHNjcmlwdGluZyB3aXRoIGN1cmwuCgpEYW5pZWwgKDEgQXVndXN0IDIwMDApCi0gUmljaCBHcmF5IHNwb3R0ZWQgYSBwcm9ibGVtIGluIHNyYy9zZXR1cC5oIGNhdXNlZCBieSBhICNkZWZpbmUgc3RyZXF1YWwoKQogIHRoYXQgd2FzIGp1c3QgYSBsZWZ0LW92ZXIgZnJvbSBwYXNzZWQgdGltZXMuIFRoZSBzdHJlcXVhbCgpIGlzIG5vdyBhIHRydWUKICBmdW5jdGlvbiBzdXBwbGllZCBieSBsaWJjdXJsIGZvciBhIHBvcnRhYmxlIGNhc2UgaW5zZW5zaXRpdmUgc3RyaW5nCiAgY29tcGFyaXNvbi4gSSBhZGRlZCB0aGUgcHJvdG90eXBlcyBpbiBpbmNsdWRlL2N1cmwuaCBhbmQgcmVtb3ZlZCB0aGUKICBub3cgb2Jzb2xldGUgI2RlZmluZS4KCi0gSWdvciBLaHJpc3RvcGhvcm92IG1hZGUgYSBmaXggdG8gYWxsb3cgcmVzdW1lZCBkb3dubG9hZCBmcm9tIFN1bidzCiAgSmF2YVdlYlNlcnZlci8xLjEuMS4gSXQgc2VlbXMgdGhhdCB0aGVpciBzZXJ2ZXIgc2VuZHMgYmFkIENvbnRlbnQtUmFuZ2UKICBoZWFkZXJzLgoKLSBUaGUgbWFrZWZpbGVzIGZvcmNlZCBhIHN0YXRpYyBsaWJyYXJ5IGJ1aWxkLCB3aGljaCBpcyBiYWQgc2luY2Ugd2Ugbm93IHVzZQogIGxpYnRvb2wgYW5kIHRodXMgaGF2ZSBleGNlbGxlbnQgc2hhcmVkIGxpYnJhcnkgc3VwcG9ydCEgQWxiZXJ0IENoaW4tQS1Zb3VuZwogIGZvdW5kIG91dC4KClZlcnNpb24gNy4wLjExYmV0YQoKRGFuaWVsICgxIEF1Z3VzdCAyMDAwKQotIEFsYmVydCBDaGluLUEtWW91bmcgcG9pbnRlZCBvdXQgdGhhdCAnbWFrZSBpbnN0YWxsJyBkaWQgbm90IHByb3Blcmx5IGNyZWF0ZQogIHRoZSBoZWFkZXIgaW5jbHVkZSBkaXJlY3RvcnksIHdoeSBpdCBmYWlsZWQgdG8gaW5zdGFsbCB0aGUgaGVhZGVyIGZpbGVzIGFzCiAgaXQgc2hvdWxkLiBBdXRvbWFrZSBpc24ndCByZWFsbHkgZXF1aXBwZWQgdG8gZGVhbCB3aXRoIHN1YmRpcmVjdG9yaWVzCiAgd2l0aG91dCBNYWtlZmlsZXMgaW4gYW55IG5pY2Ugd2F5LiBJIGhhZCB0byBydW4gYWhlYWQgYW5kIGFkZCBNYWtlZmlsZXMgaW4KICBib3RoIGluY2x1ZGUgYW5kIGluY2x1ZGUvY3VybCBiZWZvcmUgSSBtYW5hZ2VkIHRvIGNyZWF0ZSBhIHRvcC1sZXZlbAogIG1ha2VmaWxlIHRoYXQgc3VjY2VlZHMgaW4gaW5zdGFsbCBldmVyeXRoaW5nIHByb3Blcmx5IQoKLSBPaywgbm8gbW9yZSAiZmVhdHVyZXMiIGFkZGVkIG5vdy4gTGV0J3MganVzdCB2ZXJpZnkgdGhhdCB0aGVyZSdzIG5vIG1ham9yCiAgZmxhd3MgYWRkZWQgbm93LgoKRGFuaWVsICgzMSBKdWx5IDIwMDApCi0gQm90aCBKZWZmIFNjaGFzbnkgYW5kIEtldGlsIEZyb3luIGFza2VkIG1lIGhvdyB0byB0ZWxsIGN1cmwgbm90IHRvIHNlbmQgb25lCiAgb2YgdGhvc2UgaW50ZXJuYWxseSBnZW5lcmF0ZWQgaGVhZGVycy4gVGhleSBkaWRuJ3Qgc2V0dGxlIHdpdGggdGhlIGJsYW5rCiAgb25lcyB5b3UgY291bGQgdGVsbCBjdXJsIHRvIHVzZS4gSSByZXdyb3RlIHRoZSBoZWFkZXItcmVwbGFjZSBzdHVmZiBhCiAgbGl0dGxlLiBOb3csIGlmIHlvdSByZXBsYWNlIGFuIGludGVybmFsIGhlYWRlciB3aXRoIHlvdXIgb3duIGFuZCB0aGF0IG5ldwogIG9uZSBpcyBhIGJsYW5rIGhlYWRlciB5b3Ugd2lsbCBvbmx5IHJlbW92ZSB0aGUgaW50ZXJuYWwgb25lIGFuZCBub3QgZ2V0IGFueQogIGJsYW5rLiBJIGNvdWxkbid0IGZpZ3VyZSBvdXQgYW55IGNhc2Ugd2hlbiB5b3Ugd2FudCB0aGF0IGJsYW5rIGhlYWRlci4KCkRhbmllbCAoMjkgSnVseSAyMDAwKQotIEl0IHN0cnVjayBtZSB0aGF0IHRoZSBsaWIgdXNlZCBsb2NhbHRpbWUoKSB3aGljaCBpcyBub3QgdGhyZWFkLXNhZmUsIHNvIG5vdwogIEkgdXNlIGxvY2FsdGltZV9yKCkgaW4gdGhlIHN5c3RlbXMgdGhhdCBoYXMgaXQuCgotIEkgd2VudCB0aHJvdWdoIHRoaXMgZW50aXJlIGRvY3VtZW50IGFuZCByZW1vdmVkIGFsbCBlbWFpbCBhZGRyZXNzZXMgYW5kIGxlZnQKICBuYW1lcyBvbmx5LiBJJ3ZlIHJlYWxseSBtYWRlIGFuIGVmZm9ydCB0byBhbHdheXMgbm90ZSB3aG8gYnJvdWdodCBiZSBidWcKICByZXBvcnRzIG9yIGZpeGVzLCBidXQgbW9yZSBhbmQgbW9yZSBwZW9wbGUgYXNrIG1lIHRvIHJlbW92ZSB0aGUgZW1haWwKICBhZGRyZXNzZXMgc2luY2UgdGhleSBiZWNvbWUgdmljdGltcyBmb3Igc3BhbXMgdGhpcyB3YXkuIEdvcmRvbiBCZWF0b24gZ290IG1lCiAgd29ya2luZyBvbiB0aGlzLgoKRGFuaWVsICgyNyBKdWx5IDIwMDApCi0gSvZybiBIYXJ0cm90aCBmb3VuZCBvdXQgdGhhdCB3aGVuIHlvdSBzcGVjaWZpZWQgYSBIVFRQIHByb3h5IGluIGFuCiAgZW52aXJvbm1lbnQgdmFyaWFibGUgYW5kIHVzZWQgLUwsIGN1cmwgZmFpbGVkIGluIHRoZSBzZWNvbmQgZmV0Y2guIEkKICBjb3JyZWN0ZWQgdGhpcyBwcm9ibGVtIGFuZCBwb3N0ZWQgYSBwYXRjaCB0byB0aGUgbGlzdC4gTm8gbmVlZCBmb3IgYW4gZXh0cmEKICBiZXRhIHJlbGVhc2UganVzdCBmb3IgdGhpcy4KClZlcnNpb24gNy4wLjEwYmV0YQoKRGFuaWVsICgyNyBKdWx5IDIwMDApCi0gU28sIGxpYnRvb2wgcmVwbGFjZWQgdHdvIG9mIG15IGZpbGVzIHdpdGggc3ltYm9saWMgbGlua3MgYW5kIEkgZm9yZ290IHRvIGFkZAogIHRoZSB0d28gbmV3IGxpYnRvb2wgZmlsZXMgdG8gdGhlIHJlbGVhc2UgYXJjaGl2ZSAoYW5kIHRoZXkgd2VyZSBhZGRlZCBhcwogIHN5bWxpbmtzIGFzIHdlbGwhKSBUaGlzIG9mIGNvdXJzZSBsZWFkIHRvIHRoYXQgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgZmFpbGVkCiAgb24gNy4wLjkuLi4KClZlcnNpb24gNy4wLjliZXRhCgpEYW5pZWwgKDI1IEp1bHkgMjAwMCkKLSBLcmlzdGlhbiBL9mhudG9wcCA8a3JpcyBhdCBrb2VobnRvcHAuZGU+IGJyb3VnaHQgYSBmaXggdGhhdCBtYWtlcyBsaWJjdXJsCiAgbGlidG9vbGlmaWVkLCBqdXN0IGFzIHdlJ3ZlIHdhbnRlZCBmb3IgYSB3aGlsZSBub3cuIEhlIGFsc28gbWFkZSB0aGUKICByZWNlbnRseSBhZGRlZCBtYW4gcGFnZXMgZ2V0IGluc3RhbGxlZCBwcm9wZXJseSBvbiAnbWFrZSBpbnN0YWxsJyBhbmQgc29tZQogIG90aGVyIG5pY2UgY2xlYW51cHMuCgotIEluIGEgZGlzY3Vzc2lvbiB3aXRoIEVldHUgT2phbmVuIGl0IHN0cnVjayBtZSB0aGF0IGlmIHdlIHVzZSBjdXJsIHRvIGdldCBhCiAgcGFnZSB1c2luZyBhIHBhc3N3b3JkLCBhbmQgdGhhdCBwYWdlIHRoZW4gc2VuZHMgYSBMb2NhdGlvbjogdG8gYW5vdGhlcgogIHNlcnZlciB0aGF0IGN1cmwgZm9sbG93cywgY3VybCB3aWxsIHNlbmQgdGhlIHVzZXIgbmFtZSBhbmQgcGFzc3dvcmQgdG8gdGhhdAogIHNlcnZlciBhcyB3ZWxsLgoKICBOb3csIEknbGwgbmV2ZXIgYmUgYWJsZSB0byBtYWtlIGN1cmwgZG8gTG9jYXRpb246IGZvbGxvd2luZyBhbGwgdGhhdCBwZXJmZWN0CiAgYW5kIHlvdSdyZSBhbGwgc29vbmVyIG9yIGxhdGVyIHJlcXVpcmVkIHRvIHdyaXRlIGEgc2NyaXB0IHRvIGRvIHNldmVyYWwKICBmZXRjaGVzIHdoZW4geW91J3JlIGRvaW5nIGFkdmFuY2VkIHN0dWZmLCBidXQgbm93IEkndmUgbW9kaWZpZWQgY3VybCB0byBhdAogIGxlYXN0ICpvbmx5KiBzZW5kIHRoZSB1c2VyIG5hbWUgYW5kIHBhc3N3b3JkIHRvIHRoZSBvcmlnaW5hbCBzZXJ2ZXIuIFdoaWNoCiAgbWVhbnMgdGhhdCBpZiBnZXQgYSBwYWdlIGZyb20gc2VydmVyIEEgd2l0aCBhIHBhc3N3b3JkLCB0aGF0IGZvcndhcmRzIGN1cmwKICB0byBzZXJ2ZXIgQiwgY3VybCB3b24ndCB1c2UgdGhlIHBhc3N3b3JkIHRoZXJlLiBJZiBzZXJ2ZXIgQiB0aGVuIGZvcndhcmRzCiAgY3VybCBiYWNrIHRvIHNlcnZlciBBIGFnYWluLCB0aGUgcGFzc3dvcmQgd2lsbCBiZSB1c2VkIGFnYWluLgoKICBUaGlzIGlzIG5vdCBhIHBlcmZlY3QgaW1wbGVtZW50YXRpb24sIGFzIGluIGEgYnJvd3NlciBjYXNlIGl0IHdvdWxkIG9ubHkgdXNlCiAgdGhlIHBhc3N3b3JkIGlmIHRoZSBsZWZ0LXByZWZpeCBvZiB0aGUgZmlyc3QgcGF0aCBpcyB0aGUgc2FtZS4gSSBqdXN0IHRoaW5rCiAgdGhhdCB0aGlzIGZpeCBwcmV2ZW50cyBhIHNvbWV3aGF0IGx1cmt5ICJzZWN1cml0eSBob2xlIi4KCiAgQXMgYSBzaWRlLW5vdGUgaW4gdGhpcyBzdWJqZWN0OiBIVFRQIHBhc3N3b3JkcyBhcmUgc2VudCBpbiBjbGVhcnRleHQgYW5kCiAgd2lsbCBuZXZlciBiZSBjb25zaWRlcmVkIHRvIGJlIHNhZmUgb3Igc2VjdXJlLiBVc2UgSFRUUFMgZm9yIHRoYXQuCgotIEFzIGRpc2N1c3NlZCBvbiB0aGUgbWFpbGluZyBsaXN0LCBJIGNvbnZlcnRlZCB0aGUgRlRQIHJlc3BvbnNlIHJlYWRpbmcKICBmdW5jdGlvbiBpbnRvIHVzaW5nIHNlbGVjdCgpIHdoaWNoIHRoZW4gYWxsb3dzIHRpbWVvdXRzIChldmVuIHVuZGVyIHdpbjMyISkKICBpZiB0aGUgY29tbWFuZC1yZXBseSBzZXNzaW9uIGdldHMgdG9vIHNsb3cgb3IgZGllcyBjb21wbGV0ZWx5LiBJIG1hZGUgYQogIGRlZmF1bHQgdGltZW91dCBvbiAzNjAwIHNlY29uZHMgdW5sZXNzIGFueXRoaW5nIGVsc2UgaXMgc3BlY2lmaWVkLCBzaW5jZSBJCiAgZG9uJ3QgdGhpbmsgYW55b25lIHdhbnRzIHRvIHdhaXQgbW9yZSB0aGFuIHRoYXQgZm9yIGEgc2luZ2xlIGNoYXJhY3RlciB0bwogIGdldCByZWNlaXZlZC4uLgoKLSBUb3JzdGVuIEZvZXJ0c2NoIDx0b3JzdGVuLmZvZXJ0c2NoIGF0IGdteC5uZXQ+IGJyb3VnaHQgYSBzZXQgb2YgZml4ZXMgZm9yCiAgdGhlIHJmYzE4NjcgZm9ybSBwb3N0cy4gSGUgaW50cm9kdWNlZCAnbmFtZT08ZmlsZScgd2hpY2ggYnJpbmdzIGEgbWVhbnMgdG8KICBzdXVwbHkgdmVyeSBsYXJnZSB0ZXh0IGNodW5rcyByZWFkIGZyb20gdGhlIGdpdmVuIGZpbGUgbmFtZS4gSXQgZGlmZmVycyBmcm9tCiAgJ25hbWU9QGZpbGUnIGluIHRoZSB3YXkgdGhhdCB0aGlzIGxhdHRlciB0aGluZyBpcyBtYXJrZWQgaW4gdGhlIHVwbG9hZGVkCiAgY29udGVudHMgYXMgYSBmaWxlIHVwbG9hZCwgd2hpbGUgdGhlIGZpcnN0IGlzIGp1c3QgdGV4dCAoYXMgaW4gYSBpbnB1dCBvcgogIHRleHRhcmVhIGZpZWxkKS4gVG9yc3RlbiBhbHNvIGNvcnJlY3RlZCBhIGJ1ZyB0aGF0IHdvdWxkIGhhcHBlbiBpZiB5b3UgdXNlZAogICVzIG9yIHNpbWlsYXIgaW4gYSAtRiBmaWxlIG5hbWUuCgotIEFzIGRpc2NvdmVyZWQgYnkgTmljbyBCYWdndXMgPE5pY28uQmFnZ3VzIGF0IG1haWwuaW5nLm5sPiwgd2hlbiB0cmFuc2ZlcnJpbmcKICBmaWxlcyB0by9mcm9tIEZUUCB1c2luZyB0eXBlIEFTQ0lJIGN1cmwgc2hvdWxkIG5vdCBleHBlY3QgdGhlIHRyYW5zZmVyIHRvIGJlCiAgdGhlIGV4YWN0IHNpemUgcmVwb3J0ZWQgYnkgdGhlIHNlcnZlciBhcyB0aGUgZmlsZSBzaXplLiBTaW5jZSBBU0NJSSBtYXkgdmVyeQogIHdlbGwgbWVhbiB0aGF0IHRoZSBjb250ZW50IGlzIHRyYW5zbGF0ZWQgd2hpbGUgdHJhbnNmZXJlZCwgdGhlIGZpbmFsIHNpemUKICBtYXkgdmVyeSB3ZWxsIGRpZmZlci4gVGhlcmVmb3IsIGN1cmwgbm93IGlnbm9yZXMgdGhlIGZpbGUgc2l6ZSB3aGVuIGRvaW5nCiAgQVNDSUkgdHJhbnNmZXJzIGluIEZUUC4KCkRhbmllbCAoMjQgSnVseSAyMDAwKQotIEFkZGVkIENVUkxPUFRfUFJPWFlQT1JUIHRvIHRoZSBjdXJsX2Vhc3lfc2V0b3B0KCkgY2FsbCB0byBhbGxvdyB0aGUgcHJveHkKICBwb3J0IG51bWJlciB0byBiZSBzZXQgc2VwYXJhdGVseSBmcm9tIHRoZSBwcm94eSBob3N0IG5hbWUuCgotIEFuZHJldyA8YW5kcmV3IGF0IHVnaC5uZXQuYXU+IHBvaW50ZWQgb3V0IGEgbmV0cmMgbWFudWFsIGJ1Zy4KCi0gVGhlIEZUUCB0cmFuc2ZlciBjb2RlIG5vdyBhY2NlcHRzIGEgMjUwLWNvZGUgYXMgd2VsbCBhcyB0aGUgcHJldmlvdXNseQogIGFjY2VwdGVkIDIyNiwgYWZ0ZXIgYSBzdWNjZXNzZnVsIGZpbGUgdHJhbnNmZXIuIE1vaGFuIDxtbmFpciBhdAogIGV2ZXJncmVlbi1mdW5kcy5jb20+IHBvaW50ZWQgdGhpcyBvdXQuCgotIFRoZSBjaGVjayBmb3IgKmJvdGgqIG5zbCBhbmQgc29ja2V0IHdhcyBuZXZlciBhZGRlZCBpbiB0aGUgdjcgY29uZmlndXJlLmluCiAgd2hlbiBJIG1vdmVkIHRoZSBtYWluIGJyYW5jaC4gSSByZS1hZGRlZCB0aGF0IGNoZWNrIHRvIGNvbmZpZ3VyZS5pbi4gVGhpcyB3YXMKICBkaXNjb3ZlcmVkIGJ5IFJpY2ggR3JheS4KCi0gSG93YXJkLCBCbGFpc2UgPEJsYWlzZS5Ib3dhcmQgYXQgZmFjdGl2YS5jb20+IHBvaW50ZWQgb3V0IGEgbWlzc2luZyBmcmVlKCkgaW4KICBjdXJsX2Rpc2Nvbm5lY3QoKSB3aGljaCBvZiBjb3Vyc2UgbWVhbnQgbGliY3VybCBhdGUgbWVtb3J5LgoKLSBCcmlhbiBFLiBHYWxsZXcgbm90ZWQgdGhhdCB0aGUgSFRUUCAnSG9zdDonIGhlYWRlciBjdXJsIHNlbnQgZGlkIG5vdAogIHByb3Blcmx5IGluY2x1ZGUgdGhlIHBvcnQgbnVtYmVyIGlmIG5vbi1kZWZhdWx0IHBvcnRzIHdlcmUgdXNlZC4gVGhpcyBzaG91bGQKICBub3cgaGF2ZSBiZWVuIGZpeGVkLgoKLSBIVFRQIGNvbm5lY3QgZXJyb3JzIG5vdyByZXR1cm4gZXJyb3JzIGVhcmxpZXIuIFRoaXMgd2FzIG1vc3Qgbm90YWJseSBjYXVzaW5nCiAgcHJvYmxlbXMgd2hlbiB0aGUgSFRUUFMgY2VydGlmaWNhdGUgaGFkIHByb2JsZW1zIGFuZCBsYXRlciBjYXVzZWQgYSBjcmFzaC4KICBNYW55IHRoYW5rcyB0byBHcmVnb3J5IE5pY2hvbGxzIDxnbmljaG9sbHMgYXQgbGV2ZWw4LmNvbT4gZm9yIGRpc2NvdmVyaW5nCiAgYW5kIHN1Z2dlc3RpbmcgYSBmaXguLi4KCkRhbmllbCAoMjEgSnVuZSAyMDAwKQotIEFmdGVyIGEgImJ1ZyByZXBvcnQiIEkgcmVjZWl2ZWQgd2hlcmUgdGhlIHVzZXIgd2FzIHVzaW5nIGJvdGggLUYgYW5kIC1JIGluIGEKICBIVFRQIHJlcXVlc3QgKGl0IHNldmVybHkgY29uZnVzZWQgdGhlIGxpYnJhcnkgSSBzaG91bGQgYWRkKSwgSSBhZGRlZCBzb21lCiAgY2hlY2tzIHRvIHNyYy9tYWluLmMgdGhhdCBwcmV2ZW50cyBzZXR0aW5nIG1vcmUgdGhhbiBvbmUgSFRUUCByZXF1ZXN0CiAgY29tbWFuZCwgbm8gbWF0dGVyIHdoYXQgdGhlIHVzZXIgd2FudHMhIDstKQoKVmVyc2lvbiA3LjAuOGJldGEKCkRhbmllbCAoMjAgSnVuZSAyMDAwKQotIEkgZGlkIGEgbWFqb3IgcmVwbGFjZSBpbiBtYW55IGZpbGVzIHRvIHVzZSB0aGUgbmV3IGN1cmwgZG9tYWluIGhheHguc2UKICBpbnN0ZWFkIG9mIHRoZSBwcmV2aW91cyBvbmUuCgotIEFzIEVldHUgT2phbmVuIHN1Z2dlc3RlZCwgSSBmaW5hbGx5IHRvb2sgdGhlIHN0ZXAgYW5kIG5vdyBsaWJjdXJsIG5vIGxvbmdlcgogIG1ha2VzIGEgUE9TVCBhZnRlciBpdCBoYXMgZm9sbG93ZWQgYSBsb2NhdGlvbi4gV2hlbiB0aGUgaW5pdGlhbCBQT1NUIGhhcwogIGJlZW4gZG9uZSwgaXQnbGwgdHVybmVkIGludG8gYSBHRVQgZm9yIHRoZSBmdXJ0aGVyIHJlcXVlc3RzLiBUaGlzIGlzIG9ubHkKICBpbnRlcmVzdGluZyB3aGVuIHVzaW5nIC1MLy0tbG9jYXRpb24gKmFuZCogZG9pbmcgYSBQT1NUIGF0IHRoZSBzYW1lIHRpbWUuCgogIFdoaWxlIG1lc3Npbmcgd2l0aCB0aGlzLCBJIGFkZGVkIGFub3RoZXIgd2VpcmQgZmVhdHVyZSBJIGNhbGwgJ2F1dG8KICByZWZlcmVyJy4gSWYgeW91IGFwcGVuZCAnO2F1dG8nIHRvIHRoZSByaWdodCBvZiBhIGdpdmVuIHJlZmVyZXIgc3RyaW5nIChvcgogIG9ubHkgdXNlIHRoYXQgc3RyaW5nIGFzIHJlZmVyZXIpLCBsaWJjdXJsIHdpbGwgYXV0b21hdGljYWxseSBzZXQgdGhlCiAgcHJldmlvdWQgVVJMIGFzIHJlZmVyZWQgd2hlbiBpdCBmb2xsb3dzIGEgTG9jYXRpb246IGFuZCBnZXRzIGEgc3VjY2VlZGluZwogIGRvY3VtZW50LgoKLSBNeSBoZXJvIFJpY2ggR3JheSBmb3VuZCB0aGUgdmVyeSBvYnNjdXJlIEZUUCBidWcgdGhhdCBoYXBwZW5lZCB0byBoaW0gb25seQogIHdoZW4gcGFzc2luZyB0aHJvdWdoIGEgcGFydGljdWxhciBmaXJld2FsbCBhbmQgdXNpbmcgdGhlIFBPUlQgY29tbWFuZC4gSXQKICB0dXJuZWQgb3V0IHRoYXQgUE9SVCB3YXMgdGhlIG9ubHkgY29tbWFuZCBpbiB0aGUgbGliL2Z0cC5jIHNvdXJjZSB0aGF0CiAgZGlkbid0IHNlbmQgYSBwcm9wZXIgXHJcbiBzZXF1ZW5jZSBidXQgaW5zdGVhZCB1c2VkIHRoZSBmYXVsdHkgXG4gd2hpY2ggYXMKICBpdCBzZWVtZWQgaXMgc3VwcG9ydGVkIGJ5IG1vc3QgbWFqb3IgZnRwIHNlcnZlcnMuLi4gOi1PCgpWZXJzaW9uIDcuMC43YmV0YQoKRGFuaWVsICgxNiBKdW5lIDIwMDApCi0gSSBoYWQgYXZvaWRlZCB0aGlzIGxvbmcgZW5vdWdoIG5vdywgc28gSSBtb3ZlZCB0aGUgYWx0ZXJuYXRpdmUgcHJvZ3Jlc3MgYmFyCiAgc3R1ZmYgZnJvbSB0aGUgbGliIGFuZCBhZGRlZCBpdCB0byB0aGUgY2xpZW50IGNvZGUuIFRoaXMgaXMgbm93IHVzaW5nIHRoZQogIHJlY2VudGx5IGFkZGVkIHByb2dyZXNzIGNhbGxiYWNrIGFuZCBpdCBzZWVtcyB0byB3b3JrIHByZXR0eSBtdWNoIGxpa2UKICBiZWZvcmUuIFNpbmNlIGl0IGlzIG9ubHkgb25lIHByb2dyZXNzIGJhciBhbmQgeW91IGFuZCBkb3dubG9hZCBhbmQgdXBsb2FkIGF0CiAgdGhlIHNhbWUgdGltZSwgdGhpcyBiYXIgc2hvd3MgdGhlIGNvbWJpbmVkIHByb2dyZXNzIG9mIGJvdGggZGlyZWN0aW9ucy4gVGhpcwogIGNvZGUgd2FzIGp1c3QgcG9ydGVkIGZyb20gdGhlIG9sZCBwbGFjZSB0byB0aGlzLCBMYXJzIGlzIHN0aWxsIG91ciBzYXZpb3VyIQogIDstKSBUaGlzIGFsc28gbWFkZSB0aGUgZG9jdW1lbnRhdGlvbiBtb3JlIGFjY3VyYXRlIHNpbmNlIEkgbmV2ZXIgcmVtb3ZlZAogIHRoaXMgZnVuY3Rpb24gZnJvbSBhbnkgZG9jcyEgQWx0aG91Z2ggSSBub3cgcmVtb3ZlZCB0aGUgQ1VSTE9QVF9QUk9HUkVTU01PREUKICBmcm9tIHRoZSBsaWJyYXJ5IHNpbmNlIHRoZSBsaWIgaGFzIG9ubHkgb25lIGludGVybmFsIHByb2dyZXNzIG1ldGVyIGFuZCBpdAogIHdpbGwgbmV2ZXIgZ2V0IGFub3RoZXIuIEl0IGlzIGFsdGhvdWdoIGxpa2VseSB0aGF0IHRoZSBpbnRlcm5hbCBvbmUgYWxzbwogIHdpbGwgYmUgbW92ZWQgdG8gdGhlIGNsaWVudCBjb2RlIGluIHRoZSBmdXR1cmUgKHdoZW4gSSBoYXZlIG90aGVyIG1lYW5zIG9mCiAgZ2V0dGluZyB0aGUgd3JpdGVvdXQgZGF0YSBhbmQgbW92ZSB0aGF0IHRvbyB0byB0aGUgY2xpZW50KS4KCi0gSSB0b29rIHRoZSBvcHBvcnR1bml0eSB0byB2ZXJpZnkgdGhhdCBzdGFuZGFyZCBwcm9ncmVzcyBtZXRlciB3b3JrcyBhbmQgSQogIGZvdW5kIG91dCBpdCBkaWRuJ3QgZ2V0IGluaXRlZCBwcm9wZXJseS4gR3Jyci4gSSBjb3JyZWN0ZWQgdGhhdCBhcyB3ZWxsLgoKRGFuaWVsICgxNSBKdW5lIDIwMDApCi0gSSB0aG91Z2h0IEknZCBiZXR0ZXIgdmVyaWZ5IHRoYXQgdGhlIC1GIG9wdGlvbiBzdGlsbCB3b3JrcyBpbiB2NyBhbmQgb2YKICBjb3Vyc2UgaXQgZGlkbid0Li4uIDotLyBBbnl3YXksIEkgaGFkIHRoZSBwcm9ibGVtcyBJIGNvdWxkIGRpc2NvdmVyCiAgY29ycmVjdGVkLiBBYm91dCBvbmUgbW9udGggb2YgYmV0YSB0ZXN0aW5nIGFuZCBub3QgYSBzaW5nbGUgcGVyc29uIGhhcyB1c2VkCiAgdGhpcyBmZWF0dXJlIHdpdGggdjc/CgotIEJq9nJuIGNvcnJlY3RseSBwb2ludGVkIG91dCB0aGF0IHRoZSAtLXByb2dyZXNzLWJhciBzdGlsbCBkb2Vzbid0IHdvcmsgaW4KICB2Ny4gSG0uCgpEYW5pZWwgKDE0IEp1bmUgMjAwMCkKLSBUaW0gVGFzc29uaXMgZGlzY292ZXJlZCB0aGF0IGN1cmwgNyBkaWRuJ3QgaGFuZGxlIG5vcm1hbCBodHRwIFBPU1QgYXMgaXQKICBzaG91bGQuIEkgY29ycmVjdGVkIHRoaXMuCgpWZXJzaW9uIDcuMC42YmV0YQoKRGFuaWVsICgxNCBKdW5lIDIwMDApCi0gQmr2cm4gU3RlbmJlcmcgcG9pbnRlZCBvdXQgc2V2ZXJhbCBwcm9ibGVtcyAocmVsYXRlZCB0byB3aW4zMiBjb21waWxpbmcpOgogIGxpYi9zdHJlcXVhbC5jIGhhZCBhIGJhZCAjaWZkZWYgZm9yIG9uZSBvZiB0aGUgc3RyaW5nIGNvbXBhcmlzb25zICh3aW4zMikKICBzcmMvbWFpbi5jIGhhZCBzZXZlcmFsIG1pbm9yIHByb2JsZW1zCiAgbGliL21ha2VmaWxlLm0zMiBoYWQgZ2V0cGFzcy5bY29dIHR3aWNlCiAgc3JjL2NvbmZpZy13aW4zMi5oIGxhY2tlZCB0aGUgSEFWRV9GQ05UTF9IIGRlZmluZQogIGJvdGggY29uZmlnLXdpbjMyLmggZmlsZXMgbm93IG9ubHkgc2V0IHRoZSBIQVZFX1VOSVNURF9IIGRlZmluZSBpZiB0aGUKICBkZWZpbmUgTUlOR1czMiBpcyBzZXQsIGFuZCBJIG1vZGlmaWVkIHNyYy9tYWtlZmlsZS5tMzIgYW5kIGxpYi9tYWtlZmlsZS5tMzIKICB0byBzZXQgaXQuCgpWZXJzaW9uIDcuMC41YmV0YQoKRGFuaWVsICgxNCBKdW5lIDIwMDApCi0gQXBwbGllZCBMdW9uZyBEaW5oIER1bmcncyBjb21tZW50cyBhYm91dCBhIGZldyB3aW4zMiBjb21waWxlIHByb2JsZW1zLgoKLSBBcHBsaWVkIEJq9nJuIFN0ZW5iZXJnJ3Mgc3VnZ2VzdGVkIGZpeCB0aGF0IHR1cm5zIHRoZSB3aW4zMiBzdGRvdXQgdG8KICBiaW5hcnkuIEl0IHdvbid0IGRvIGl0IGlmIHRoZSAtQiAvIC0tdXNlLWFzY2lpIG9wdGlvbiBpcyB1c2VkLiBUaGF0IG9wdGlvbgogIGlzIG5vdyBhbiBleHRlbmRlZCB2ZXJzaW9uIG9mIHRoZSBwcmV2aW91cyAtQiAvLS1mdHAtLWFzY2lpLiBUaGUgZmxhZyB3YXMKICBhbHJlYWR5IGluIHVzZSBiZSB0aGUgbGRhcCBhcyB3ZWxsIHNvIHRoZSBuZXcgbmFtZSBmaXRzIHByZXR0eSBnb29kLiBUaGUKICBsaWJjeXJsIENVUkxPUFRfVFJBTlNGRVJURVhUIHdhcyBhbHNvIGludHJvZHVjZWQgYXMgYW4gYWxpYXMgdG8gdGhlIG5vdwogIG9ic29sZXRlIENVUkxPUFRfRlRQQVNDSUkuIENhbid0IHZlcmlmeSB0aGlzIGZpeCBteXNlbGYgYXMgSSBoYXZlIG5vIHdpbjMyCiAgY29tcGlsZXIgYXJvdW5kLgoKRGFuaWVsICgxMyBKdW5lIDIwMDApCi0gTHVvbmcgRGluaCBEdW5nIDxkdW5nIGF0IHNjaC5ibWUuaHU+IGZvdW5kIGEgcHJvYmxlbSBpbiBjdXJsX2Vhc3lfY2xlYW51cCgpCiAgc2luY2UgaXQgZnJlZSgpZWQgdGhlIG1haW4gY3VybCBzdHJ1Y3QgKnR3aWNlKi4gVGhpcyBpcyBub3cgY29ycmVjdGVkLgoKRGFuaWVsICg5IEp1bmUgMjAwMCkKLSBVcGRhdGVkIHRoZSBSRVNPVVJDRVMgZmlsZSwgYWRkZWQgYSBSRUFETUUud2luMzIgZmlsZS4KCkRhbmllbCAoOCBKdW5lIDIwMDApCi0gU28gSSBmaW5hbGx5IGFkZGVkIHRoZSBwcm9ncmVzcyBjYWxsYmFjayB0byB0aGUgKnNldG9wdCgpIG9wdGlvbnMgYW5kIGl0CiAgc2hvdWxkIHdvcmsgbm93LiBJIGRvbid0IGhhdmUgdGhlIGVuZXJneSB0byB3cml0ZSBhbnkgdGVzdCBwcm9ncmFtIGZvciBpdAogIHJpZ2h0IG5vdy4KLSBNYWRlIHRoZSBjYWxsYmFjayBmdW5jdGlvbiB0eXBlZGVmcyBwdWJsaWMgaW4gY3VybC9jdXJsLmggZm9yIGNvbWZvcnQuIEp1c3QKICBpbiBjYXNlIGFueW9uZSB3YW5uYSBmaWRkbGUgd2l0aCBzdWNoIHBvaW50ZXJzLgotIFVwZGF0ZWQgdGhlIGN1cmxfZWFzeV9zZXRvcHQoKSBtYW4gcGFnZSBhY2NvcmRpbmdseS4KClZlcnNpb24gNy4wLjRiZXRhCgpEYW5pZWwgKDIgSnVuZSAyMDAwKQotIEkgbm90aWNlZCB0aGF0IHdoZW4gZG9pbmcgTG9jYXRpb246IGZvbGxvd2luZywgd2UgbG9zdCBjdXN0b20gaGVhZGVycyBpbiBhbGwKICBidXQgdGhlIGZpcnN0IHJlcXVlc3QuCi0gUmVtb3ZlZCB0aGUgJ0h0dHBQb3N0JyBzdHJ1Y3QgYW5kIG1vdmVkIHRoZSBoZWFkZXIgc3R1ZmYgdG8gdGhlIG1vcmUgZ2VuZXJpYwogIGN1cmxfc2xpc3QuCi0gQWRkZWQgc29tZSBiZXR0ZXIgc2xpc3QtY2xlYW51cHMgaW4gc3JjL21haW4uYwoKVmVyc2lvbiA3LjAuM2JldGEKCkRhbmllbCAoMzEgTWF5IDIwMDApCi0gU28gSSBkaXNjb3ZlcmVkIHRoYXQgSSByZWxlYXNlZCB0aGUgNy4wLjJiZXRhIHdpdGhvdXQgaXQgYmVpbmcgYWJsZSB0bwogIGNvbXBpbGUgdW5kZXIgTGludXguIGdldGhvc3RieW5hbWVfcigpIGFuZCBnZXRob3N0YnlhZGRyX3IoKSB0dXJuZWQgb3V0IHRvCiAgZmVhdHVyZSBhIGRpZmZlcmVudCBhbW91bnQgb2YgYXJndW1lbnRzIG9uIGRpZmZlcmVudCBzeXN0ZW1zIHNvIEkgaGFkIHRvIGFkZAogIGEgY29uZmlndXJlIGNoZWNrIGZvciB0aGlzIGFuZCBhZGp1c3QgdGhlIGNvZGUgc2xpZ2h0bHkuCgpWZXJzaW9uIDcuMC4yYmV0YQoKRGFuaWVsICgyOSBNYXkgMjAwMCkKLSBDb3JyZWN0ZWQgdGhlIGJpdHMuKiBhc3NpZ25tZW50cyB3aGVuIHVzaW5nIENVUkxPUFQgb3B0aW9ucyB0aGF0IG9ubHkKICB0b2dnbGVzIG9uZSBvZiB0aG9zZSBiaXRzLgoKLSBBcHBsaWVkIHRoZSBodWdlIHBhdGNoZXMgZnJvbSBEYXZpZCBMZUJsYW5jIDxkbGVibGFuYyBhdCBxbnguY29tPiB0aGF0IGFkZAogIHVzYWdlIG9mIHRoZSBnZXRob3N0YnluYW1lX3IoKSBhbmQgc2ltaWxhciBmdW5jdGlvbnMgaW4gY2FzZSB0aGV5J3JlIGFyb3VuZCwKICBzaW5jZSB0aGF0IG1ha2UgbGliY3VybCBtdWNoIGJldHRlciB0aHJlYWRzYWZlIGluIG1hbnkgc3lzdGVtcyAoc3VjaCBhcwogIHNvbGFyaXMpLiBJIGFkZGVkIHRoZSBjaGVja3MgZm9yIHRoZXNlIGZ1bmN0aW9ucyB0byB0aGUgY29uZmlndXJlIHNjcmlwdC4KCiAgSSBjYW4ndCBleHBsYWluIHdoeSwgYnV0IHRoZSBpbmV0X250b2FfcigpIGZ1bmN0aW9uIGRpZCBub3QgYXBwZWFyIGluIG15CiAgU29sYXJpcyBpbmNsdWRlIGZpbGVzLCBJIGhhZCB0byBhZGQgbXkgb3duIGluY2x1ZGUgZmlsZSBmb3IgdGhpcyBmb3Igbm93LgoKRGFuaWVsICgyMiBNYXkgMjAwMCkKLSBK9nJuIEhhcnRyb3RoIGJyb3VnaHQgbWUgZml4ZXMgdG8gbWFrZSB0aGUgd2luMzIgdmVyc2lvbiBjb21waWxlIHByb3Blcmx5IGFzCiAgd2VsbCBhcyBhIHJlbmFtZSBvZiB0aGUgJ2ludGVyZmFjZScgZmllbGQgaW4gdGhlIHVybGRhdGEgc3RydWN0LCBhcyBpdCBzZWVtcwogIHRvIGJlIHJlc2VydmVkIGluIHNvbWUgZ2NjIHZlcnNpb25zIQoKLSBSaWNoIEdyYXkgc3RydWNrIGJhY2sgd2l0aCB5ZXQgc29tZSBwb3J0YWJpbGl0eSByZXBvcnRzLiBEYXRhIEdlbmVyYWwgREcvVVgKICBuZWVkZWQgYSBsaXR0bGUgZml4IGluIGxpYi9sZGFwLmMgc2luY2UgaXQgZG9lc24ndCBoYXZlIFJUTERfR0xPQkFMIGRlZmluZWQuCiAgTW9yZSBmaXhlcyBhcmUgZXhwZWN0ZWQgYXMgYSByZXN1bHQgb2YgUmljaGllcyB2ZXJ5IGhlbHBmdWwgd29yay4KClZlcnNpb24gNy4wLjFiZXRhCgpEYW5pZWwgKDIxIE1heSAyMDAwKQotIFVwZGF0ZWQgbG90cyBvZiAjZGVmaW5lcywgZW51bXMgYW5kIHZhcmlhYmxlIHR5cGUgbmFtZXMgaW4gdGhlIGxpYnJhcnkuIE5vCiAgbW9yZSB3ZWlyZCBVUkcgb3IgVVJMVEFHIHByZWZpeGVzLiBBbGwgdHlwZXMgYW5kIG5hbWVzIHNob3VsZCBiZSBjdXJsLQogIHByZWZpeGVkIHRvIGF2b2lkIG5hbWUgc3BhY2UgY2xhc2hlcy4gVGhlIEZMQUdTLXBhcmFtZXRlciB0byB0aGUgZm9ybWVyCiAgY3VybF91cmxnZXQoKSBoYXMgYmVlbiBjb252ZXJ0ZWQgaW50byBhIGJ1bmNoIG9mIGZsYWdzIHRvIHVzZSBpbiBzZXBhcmF0ZQogIHNldG9wdCBjYWxscy4gSSdtIHN0aWxsIGZvY3VzaW5nIG9uIHRoZSBlYXN5LWludGVyZmFjZSwgYXMgdGhlIGN1cmwgdG9vbCBpcwogIG5vdyB1c2luZyB0aGF0LgoKLSBCam9ybiBSZWVzZSBoYXMgcHJvdmlkZWQgbWUgd2l0aCBhbiBhc3luY2hyb25vdXMgbmFtZSByZXNvbHZlciB0aGF0IEkgcGxhbgogIHRvIHVzZSBpbiB1cGNvbWluZyB2ZXJzaW9ucyBvZiBjdXJsIHRvIGJlIGFibGUgdG8gZ3JhY2VmdWxseSB0aW1lb3V0IG5hbWUKICBsb29rdXBzLgoKVmVyc2lvbiA3LjBiZXRhCgpEYW5pZWwgKDE4IE1heSAyMDAwKQotIEludHJvZHVjZWQgTElCQ1VSTF9WRVJTSU9OX05VTSB0byB0aGUgY3VybC5oIGluY2x1ZGUgZmlsZSB0byBiZXR0ZXIgYWxsb3cKICBzb3VyY2UgY29kZXMgdG8gYmUgZGVwZW5kZW50IG9uIHRoZSBsaWIgdmVyc2lvbi4gVGhpcyBkZWZpbmUgaXMgbm93IHNldCB0bwogIGEgZGV4YWRlY2ltYWwgbnVtYmVyLCB3aXRoIDggYml0cyBlYWNoIGZvciBtYWpvciBudW1iZXIsIG1pbm9yIG51bWJlciBhbmQKICBwYXRjaCBudW1iZXIuIEluIG90aGVyIHdvcmRzLCB2ZXJzaW9uIDEuMi4zIHdvdWxkIG1ha2UgaXQgMHgwMTAyMDMuIEl0IGFsc28KICBtYWtlcyBhIGxhcmdlciBudW1iZXIgYSBuZXdlciB2ZXJzaW9uLgoKRGFuaWVsICgxNyBNYXkgMjAwMCkKLSBNYXJ0aW4gS2FtbWVyaG9mZXIgY29ycmVjdGx5IHBvaW50ZWQgb3V0IHNldmVyYWwgZmxhd3MgaW4gdGhlIEZUUCByYW5nZQogIG9wdGlvbi4gSSBjb3JyZWN0ZWQgdGhlbS4KLSBSZW1vdmVkIHRoZSB3aW4zMiB3aW5zb2NrIGluaXQgY3JhcCBmcm9tIHRoZSBsaWIgdG8gdGhlIHNyYy9tYWluLmMgZmlsZQogIGluIHRoZSBhcHBsaWNhdGlvbiBpbnN0ZWFkLiBUaGV5IGNhbid0IGJlIGluIHRoZSBsaWIsIGVzcGVjaWFsbHkgbm90IGZvcgogIG11bHRpdGhyZWFkZWQgcHVycG9zZXMuCgpEYW5pZWwgKDE2IE1heSAyMDAwKQotIFJld3JvdGUgdGhlIHNyYy9tYWluLmMgc291cmNlIHRvIHVzZSB0aGUgbmV3IGVhc3ktaW50ZXJmYWNlIHRvIGxpYmN1cmwgNy4KICBUaGVyZSBpcyBzdGlsbCBtb3JlIHdvcmsgdG8gZG8sIGJ1dCB0aGUgZmlyc3Qgc3RlcCBpcyBub3cgdGFrZW4uCiAgPGN1cmwvZWFzeS5oPiBpcyB0aGUgaW5jbHVkZSBmaWxlIHRvIHVzZS4KCkRhbmllbCAoMTQgTWF5IDIwMDApCi0gRlRQIFVSTHMgYXJlIG5vdyB0cmVhdGVkIHNsaWdodGx5IGRpZmZlcmVudCwgbW9yZSBhY2NvcmRpbmcgdG8gUkZDIDE3MzguCi0gRlRQIHNlc3Npb25zIGFyZSBub3cgcGVyZm9ybWVkIGRpZmZlcmVudGx5LCB3aXRoIENXRCBjb21tYW5kcyB0byBjaGFuZ2UKICBkaXJlY3RvcnkgaW5zdGVhZCBvZiBSRVRSL1NUT1IvTElTVCB3aXRoIHRoZSBmdWxsIHBhdGguIERpc2N1c3Npb25zIHdpdGgKICBSaWNoIEdyYXkgbWFkZSBtZSBub3RpY2UgdGhlc2UgcHJvYmxlbXMuCi0gSmFubmUgSm9oYW5zc29uIGRpc2NvdmVyZWQgYW5kIGNvcnJlY3RlZCBhIGJ1ZmZlciBvdmVyZmxvdyBpbiB0aGUKICBzcmMvdXNyZ2xvYi5jIGZpbGUuCi0gSSBoYWQgdG8gYWRkIGEgbGliL3N0cmVxdWFsLmMgZmlsZSBmb3IgZG9pbmcgY2FzZSBpbnNlbnNpdGl2ZSBzdHJpbmcKICBjb21wYXJlcyBvbiBhbGwgcGxhdGZvcm1zLgoKRGFuaWVsICg4IE1heSAyMDAwKToKLSBCZWVuIHdvcmtpbmcgbG90cyBvbiB0aGUgbmV3IGxpYi4KLSBUb2dldGhlciB3aXRoIFJpY2ggR3JheSwgSSd2ZSB0cmllZCB0byBhZGp1c3QgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgdG8gd29yawogIGJldHRlciBvbiB0aGUgTkNSIE1QLVJBUyBVbml4LgoKRGFuaWVsICgyIE1heSAyMDAwKToKLSBBbGJlcnQgQ2hpbi1BLVlvdW5nIHBvaW50ZWQgb3V0IHRoYXQgSSBoYWQgYSBmZXcgdG9vIG1hbnkgaW5zdHJ1Y3Rpb25zIGluCiAgY29uZmlndXJlLmluIHRoYXQgZGlkbid0IGRvIGFueSBnb29kLgoKRGFuaWVsICgyNCBBcHJpbCAyMDAwKToKLSBBZGRlZCBhIG5ldyBwYXJhZ3JhcGggdG8gdGhlIEZBUSBhYm91dCB3aGF0IHRvIGRvIHdoZW4gY29uZmlndXJlIGNhbid0CiAgZmluZCBPcGVuU1NMIGV2ZW4gdGhvdWdoIGl0IGlzIGluc3RhbGxlZC4gU3VwcGxpZWQgYnkgQm9iIEFsbGlzb24KCkRhbmllbCAoMTIgQXByaWwgMjAwMCk6Ci0gU3RhcnRlZCBtZXNzaW5nIGFyb3VuZCBiaWctdGltZSB0byBjb252ZXJ0IHRoZSBvbGQgbGlicmFyeSBpbnRlcmZhY2UgdG8gYQogIGJldHRlciBvbmUuLi4KCkRhbmllbCAoOCBBcHJpbCAyMDAwKToKLSBNYWRlIHRoZSBwcm9ncmVzcyBiYXIgbG9vayBiZXR0ZXIgZm9yIGZpbGUgc2l6ZXMgYmV0d2VlbiA5OTk5IGtpbG9ieXRlcwogIGFuZCAxMDAgbWVnYWJ5dGVzLiBUaGV5J3JlIG5vdyBkaXNwbGF5ZWQgWFguWE0uCi0gSSBhbHNvIG5vdGljZWQgdGhhdCBmdHAgZmV0Y2hlcyB0aHJvdWdoIEhUVFAgcHJveGllcyBkaWRuJ3QgYWRkIHRoZSB1c2VyCiAgYWdlbnQgc3RyaW5nLiBJdCBkb2VzIG5vdy4KLSBIYWJpYmllIDxoYWJpYmllIGF0IE1haWxhbmROZXdzLmNvbT4gc3VwcGxpZWQgYSBwcmV0dHkgZ29vZCB3YXkgdG8gYnVpbGQgUlBNcwogIG9uIGEgTGludXggbWFjaGluZS4gSXQgc3RpbGwgYSkgcmVxdWlyZXMgbWUgdG8gYmUgcm9vdCB0byBkbyBpdCwgYikgbGVhdmVzCiAgdGhlIHJwbSBwYWNrYWdlcyBsYXlpbmcgYXQgc29tZSBvZGQgcGxhY2Ugb24gbXkgZGlzayBjKSBkb2Vzbid0IHdvcmsgdG8KICBidWlsZCB0aGUgc3NsIHZlcnNpb24gb2YgY3VybCBzaW5jZSBJIGRpZG4ndCBpbnN0YWxsIG9wZW5zc2wgZnJvbSBhbiBycG0KICBwYWNrYWdlIHNvIG5vdyB0aGUgcnBtIGNyYXAgdGhpbmtzIEkgZG9uJ3QgaGF2ZSBvcGVuc3NsIGFuZCByZWZ1c2VzIHRvIGJ1aWxkCiAgYSBwYWNrYWdlIHRoYXQgZGVwZW5kcyBvbiBzc2wuLi4gRGlkIEkgbWVudGlvbiBJIGRvbid0IGdldCBhbG9uZyB3aXRoIFJQTT8KLSBPbmNlIGFnYWluIEkgcmVjZWl2ZWQgYSBidWcgcmVwb3J0IGFib3V0IGF1dG9jb25mIG5vdCBzZXR0aW5nIC1MIHByaW9yIHRvIC1sCiAgb24gdGhlIGNvbW1hbmQgbGluZSB3aGVuIGNoZWNraW5nIGZvciBsaWJzLiBJbiB0aGlzIGNhc2UgaXQgbWFkZSB0aGUgbmF0aXZlCiAgY2MgY29tcGlsZXIgb24gU29sYXJpcyA3IHRvIGZhaWwgdGhlIE9wZW5TU0wgY2hlY2suIFRoaXMgaGFzIHByZXZpb3VzbHkgYmVlbgogIHJlcG9ydGVkIHRvIGNhdXNlIHByb2JsZW1zIG9uIEhQLVVYIGFuZCBpcyBhIGtub3duIGZsYXcgaW4gYXV0b2NvbmYgMi4xMy4gSXQKICBpcyBhIHBpdHkgdGhlcmUncyBubyBuZXdlciByZWxlYXNlIGFyb3VuZC4uLgoKRGFuaWVsICg0IEFwcmlsIDIwMDApOgotIE1hcmNvIEcuIFNhbHZhZ25vIHN1cHBsaWVkIG1lIHdpdGggdHdvIGZpeGVzIHRoYXQKICBhcHBlYXJhbnRseSBtYWtlcyB0aGUgT1MvMiBwb3J0IHdvcmsgYmV0dGVyIHdpdGggbXVsdGlwbGUgVVJMcy4KCkRhbmllbCAoMiBBcHJpbCAyMDAwKToKLSBBbm90aGVyIExvY2F0aW9uOiBmaXguIFRoaXMgdGltZSwgd2hlbiBjdXJsIGNvbm5lY3RlZCB0byBhIHBvcnQgYW5kIHRoZW4KICBmb2xsb3dlZCBhIGxvY2F0aW9uIHdpdGggYW4gYWJzb2x1dGUgVVJMIHRvIGFub3RoZXIgcG9ydCwgaXQgbWlzYmVoYXZlZC4KCkRhbmllbCAoMjcgTWFyY2ggMjAwMCk6Ci0gSC4gRGFwaG5lIEx1b25nIHBvaW50ZWQgb3V0IHRoYXQgY3VybCB3YXMgd3JvbmdseQogIG1lc3NpbmcgdXAgdGhlIHByb3h5IHN0cmluZyB3aGVuIGZldGNoaW5nIGEgZG9jdW1lbnQgdGhyb3VnaCBhIGh0dHAgcHJveHksCiAgd2hpY2ggc2NyZXdlZCB1cCBtdWx0aXBsZSBmZXRjaGVzIHN1Y2ggYXMgaW4gbG9jYXRpb246IGZvbGxvd2luZ3MuCgpEYW5pZWwgKDIzIE1hcmNoIDIwMDApOgotIE1hcmNvIEcuIFNhbHZhZ25vIGNvcnJlY3RlZCBteSBiYWRseSBhcHBsaWVkIHBhdGNoIGhlCiAgYWN0dWFsbHkgYWxyZWFkeSB0b2xkIG1lIGFib3V0IQoKLSBILiBEYXBobmUgTHVvbmcgYnJvdWdodCBtZSBhIGZpeCB0aGF0IG5vdyBtYWtlcyBjdXJsCiAgaWdub3JlIHNlbGVjdCgpIGVycm9ycyBpbiB0aGUgZG93bmxvYWQgaWYgZXJybm8gaXMgRUlOVFIsIHdoaWNoIHR1cm5zIG91dCB0bwogIGhhcHBlbiBldmVyeSBub3cgYW5kIHRoZW4gd2hlbiB1c2luZyBsaWJjdXJsIG11bHRpLXRocmVhZGVkLi4uCgpEYW5pZWwgKDIyIE1hcmNoIDIwMDApOgotIFdoYW0gQmFuZyBzdXBwbGllZCBhIGNvdXBsZSBvZiB3aW4zMiBmaXhlcy4gSEFWRV9VTkFNRQogIHdhcyBhY2NpZGVudGFsbHkgI2RlZmluZWQgaW4gY29uZmlnLXdpbjMyLmgsIHdoaWNoIGl0IHNob3VsZG4ndCBoYXZlIGJlZW4uCiAgVGhlIEhBVkVfVU5JU1REX0ggaXMgbm90IGRlZmluZWQgd2hlbiBjb21waWxpbmcgd2l0aCB0aGUgTWFrZWZpbGUudmM2CiAgbWFrZWZpbGUgZm9yIE1TIFZDKysuCgpEYW5pZWwgKDIxIE1hcmNoIDIwMDApOgotIEkgcmVtb3ZlZCB0aGUgQUNfUFJPR19JTlNUQUxMIG1hY3JvIGZyb20gY29uZmlndXJlLmluLCBzaW5jZSBpdCBhcHBlYXJzIHRoYXQKICBvbmUgb2YgdGhlIEFNXyogbWFjcm9zIHNlYXJjaGVzIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwgYWxyZWFkeS4gSmFubmUKICBKb2hhbnNzb24gbWFkZSBtZSBhd2FyZSBvZiB0aGlzLgoKVmVyc2lvbiA2LjUuMgoKRGFuaWVsICgyMSBNYXJjaCAyMDAwKToKLSBQYXVsIEhhcnJpbmd0b24gcXVpY2tseSBwb2ludGVkIG91dCB0byBtZSB0aGF0IDYuNS4xCiAgY3Jhc2hlcyBoYXJkLiBJIHVwbG9hZCA2LjUuMiBub3cgYXMgcXVpY2tseSBhcyBwb3NzaWJsZSEgVGhlIHByb2JsZW0gd2FzCiAgdGhlIC1EIGFkanVzdG1lbnRzIGluIHNyYy9tYWluLmMuCgpWZXJzaW9uIDYuNS4xCgpEYW5pZWwgKDIwIE1hcmNoIDIwMDApOgotIEFuIGFub255bW91cyBwb3N0IG9uIHNvdXJjZWZvcmdlIGNvcnJlY3RseSBwb2ludGVkIG91dCBhIHBvc3NpYmxlIGJ1ZmZlcgogIG92ZXJmbG93IGluIHRoZSBjdXJsX3VuZXNjYXBlKCkgZnVuY3Rpb24gZm9yIFVSTCBjb252ZXJzaW9ucy4gVGhlIG1haW4KICBwcm9ibGVtIHdpdGggdGhpcyBidWcgaXMgdGhhdCB0aGUgZnRwIGRvd25sb2FkIHVzZXMgdGhhdCBmdW5jdGlvbiBhbmQgdGhpcwogIHNpbmdsZS0gYnl0ZSBvdmVyZmxvdyBjb3VsZCBsZWFkIHRvIHZlcnkgb2RkIGJ1Z3MgKGFzIG9uZSByZXBvcnRlZCBieSBKYW5uZQogIEpvaGFuc3NvbikuCgpEYW5pZWwgKDE5IE1hcmNoIDIwMDApOgotIE1hcmNvIEcuIFNhbHZhZ25vIHN1cHBsaWVkIG1lIHdpdGggYSBzZXJpZXMgb2YgcGF0Y2hlcwogIHRoYXQgbm93IGFsbG93cyBjdXJsIHRvIGdldCBjb21waWxlZCBvbiBPUy8yLiBJdCBldmVuIGluY2x1ZGVzIGEgc2VjdGlvbiBpbgogIHRoZSBJTlNUQUxMIGZpbGUuIFZlcnkgbmljZSBqb2IhCgpEYW5pZWwgKDE3IE1hcmNoIDIwMDApOgotIFdoYW0gQmFuZyBzdXBwbGllZCBhIHBhdGNoIGZvciB0aGUgbGliL01ha2VmaWxlLnZjNgogIGZpbGUuIFdlIHN0aWxsIG5lZWQgc29tZSBmaXhlcyBmb3IgdGhlIGNvbmZpZy13aW4zMi5oIHNpbmNlIGl0IGFwcGVhcnMgdGhhdAogIFZDKysgYW5kIG1pbmd3MzIgaGF2ZSBkaWZmZXJlbnQgb3BpbmlvbnMgYWJvdXQgKGF0IGxlYXN0KSB1bmlzdGQuaCdzCiAgZXhpc3RlbmNlLgoKRGFuaWVsICgxNSBNYXJjaCAyMDAwKToKLSBJIG1vZGlmaWVkIHRoZSAtRC8tLWR1bXAtaGVhZGVyIHdvcmtpbmdzIHNvIHRoYXQgaXQgZG9lc24ndCB3cml0ZSBhbnl0aGluZwogIHRvIHRoZSBmaWxlIHVudGlsIGl0IG5lZWRzIHRvLiBUaGlzIHdheSwgeW91IGNhbiBhY3R1YWxseSB1c2UgLWIgYW5kIC1ECiAgb24gdGhlIHNhbWUgZmlsZSBpZiB5b3Ugd2FudCByZXBlYXRlZCBpbnZva2VzIHRvIHN0b3JlIGFuZCByZWFkIHRoZSBjb29raWVzCiAgaW4gdGhhdCBvbmUgc2luZ2xlIGZpbGUuCgotIFBva2VkIGFyb3VuZCBpbiBsb3RzIG9mIHRleHRzLiBBZGRlZCB0aGUgQlVHUyBmaWxlIGZvciBidWcgcmVwb3J0aW5nIHN0dWZmLgogIEFkZGVkIHRoZSBjbGFzc2ljIEhUVFAgUE9TVCBxdWVzdGlvbiB0byB0aGUgRkFRLCByZW1vdmVkIHNvbWUgI2lmZGVmIFdJTjMyCiAgc3R1ZmYgZnJvbSB0aGUgc291cmNlcyAodGhleSdyZSBjb3ZlcmVkIGJ5IHRoZSBjb25maWctd2luMzIuaCBub3cpLgoKLSBQYXNjYWwgR2F1ZGV0dGUgZml4ZWQgYSBtaXNzaW5nIGxkYXAuYyBwcm9ibGVtIGluIHRoZQogIE1ha2VmaWxlLnZjNiBmaWxlLiBIZSBhbHNvIGFkZHJlc3NlZCBhIHByb2JsZW0gaW4gc3JjL2NvbmZpZy13aW4zMi5oLgoKRGFuaWVsICgxNCBNYXJjaCAyMDAwKToKLSBQYXVsIEhhcnJpbmd0b24gcG9pbnRlZCBvdXQgdGhhdCB0aGUgJ2h0dHBfY29kZScgdmFyaWFibGUgaW4gdGhlIC13IG91dHB1dAogIHdhcyBuZXZlciB3cml0dGVuLiBJIGZpeGVkIGl0IG5vdy4KCi0gSmFubmUgSm9oYW5zc29uIHJlcG9ydGVkIHRoZSBjb21wbGFpbnRzIHRoYXQgT3BlbkJTRCBkb2VzCiAgd2hlbiBnZXRkYXRlLmMgI2luY2x1ZGVzIG1hbGxvYy5oLiBJdCBjbGFpbXMgc3RkbGliLmggc2hvdWxkIGJlIGluY2x1ZGVkCiAgaW5zdGVhZC4gSSBhZGRlZCAjaWZkZWYgSEFWRV9NQUxMT0NfSCBjb2RlIGluIGdldGRhdGUueSBhbmQgdHdvIGNoZWNrcyBpbgogIHRoZSBjb25maWd1cmUuaW4gZm9yIG1hbGxvYy5oIGFuZCBzdGRsaWIuaC4KClZlcnNpb24gNi41CgpEYW5pZWwgKDEzIE1hcmNoIDIwMDApOgotIDxjdXJsIGF0IHNwYW0ud29sdmVzYmFuZS5uZXQ+IHBvaW50ZWQgb3V0IHRoYXQgdGhlIHdheSBjdXJsIHNlbnQgY29va2llcyBpbiBhCiAgc2luZ2xlIGxpbmUgd2Fzbid0IGVuam95ZWQgYnkgSUlTNC4wIHNlcnZlcnMuIEluIG15IHZpZXcsIHRoYXQgaXMgbm90IHdoYXQKICB0aGUgc3RhbmRhcmRzIHNheSwgYnV0IEkgYWRkZWQgYSB3aGl0ZSBzcGFjZSBiZXR3ZWVuIHRoZSBuYW1lL3ZhbHVlIHBhaXJzIHRvCiAgcGVyaGFwcyBtYWtlIHRoZW0gd29yayBiZXR0ZXIuCgotIEFkZGVkIHRoZSBwZXJsIGNoZWNrIGJhY2sgaW4gdGhlIGNvbmZpZ3VyZS5pbiBhZ2FpbiBzaW5jZSB0aGUgbWtoZWxwLnBsCiAgc2NyaXB0IG5lZWRzIGl0IQoKLSBNYWRlIHNvbWUgYmVhdXRpZmljYXRpb25zIGluIHRoZSBjdXJsIG1hbiBwYWdlLgoKRGFuaWVsICgzIE1hcmNoIDIwMDApOgotIEr2cm4gaGVscGVkIG1lIHVwZGF0ZSB0aGUgY29uZmlnLXdpbjMyLmggZmlsZXMgd2l0aCBIQVZFX1NFVFZCVUYgYW5kCiAgSEFWRV9TVFJEVVAuCgpEYW5pZWwgKDMgTWFyY2ggMjAwMCk6Ci0gVXBsb2FkZWQgdGhlIDYuNXByZTIgcGFja2FnZS4KCkRhbmllbCAoMiBNYXJjaCAyMDAwKToKLSBSZW1vdmVkIHRoZSBwZXJsLXByb2dyYW1zIGZyb20gdGhlIGRpc3RyaWJ1dGlvbiwgdGhleSBuZXZlciBtYWRlIG1hbnkgcGVvcGxlCiAgaGFwcHkgYW5kIEknbGwgc3RpbGwga2VlcCB0aGVtIGF2YWlsYWJsZSBvbiB0aGUgd2ViLgoKLSBBZGRlZCB0aGUgLXcgYW5kIC1OIHN0dWZmIHRvIHRoZSBtYW4gcGFnZS4gRG9jdW1lbnRlZCB0aGUgbmV3IHByb2dyZXNzIG1ldGVyCiAgZGlzcGxheSBpbiBSRUFETUUuY3VybC4KCi0gSvZybiBIYXJ0cm90aCwgQ2hyaXMgPGNiYXlsaXNzIGF0IGNzYy5jb21lPiBhbmQgVWxmCiAgTfZsbGVyIGZyb20gdGhlIG9wZW5zc2wgZGV2ZWxvcG1lbnQgdGVhbSBoZWxwZWQgYnJpbmdpbmcgbWUgdGhlIGRldGFpbHMgZm9yCiAgZml4aW5nIGFuIE9wZW5TU0wgdXNhZ2UgZmxhdy4gSXQgYmVjYW1lIGFwcGFyZW50IHdoZW4gdGhleSByZWxlYXNlZCBvcGVuc3NsCiAgMC45LjUgc2luY2UgdGhhdCBiYXJmZWQgb24gY3VybCdzIGJhZCBiZWhhdmlvciAobm90IHNlZWRpbmcgYSByYW5kb20gbnVtYmVyCiAgdGhpbmcpLgoKLSBZZXQgYW5vdGhlciBvcHRpb246IC1OLy0tbm8tYnVmZmVyIGRpc2FibGVzIGJ1ZmZlcmluZyBpbiB0aGUgb3V0cHV0IHN0cmVhbS4KICBQcm9iYWJseSBtb3N0IHVzZWZ1bCBmb3IgdmVyeSBzbG93IHRyYW5zZmVycyB3aGVuIHlvdSByZWFsbHkgd2FudCB0byBnZXQKICBldmVyeSBieXRlIGN1cmwgcmVjZWl2ZXMgd2l0aGluIHNvbWUgcHJlZmVycmVkIHRpbWUuIEFuZHJldyA8dG1yIGF0IGdjaS5uZXQ+CiAgc3VnZ2VzdGVkIHRoaXMuCgotIERhbWllbiBBZGFudCBtYWlsZWQgbWUgaGlzIGZpeGVzIGZvciBtYWtpbmcgY3VybCBjb21waWxlIG9uIFVsdHJpeC4KCkRhbmllbCAoMjQgRmVicnVhcnkgMjAwMCk6Ci0gQXBwbGllZCBK9nJuIEhhcnRyb3RoJ3MgZml4ZXMgZm9yIGNvbmZpZy13aW4zMi5oIGFuZCBsaWIvTWFrZWZpbGUudzMyLgoKICBJIHNob3VsZCBhbHNvIG1ha2UgYSBub3RlIGhlcmUsIGlmIG5vdGhpbmcgZWxzZSB0byBteXNlbGYsIHRoYXQgd2hlbiB1c2luZwogIHRoZSAlLXN5bnRheCBmb3IgdmFyaWFibGVzIGluIERPUyBjb21tYW5kIHByb21wdHMsIHlvdSBtdXN0IHVzZSB0d28gJS0KICBsZXR0ZXJzIGZvciBlYWNoIG9uZSBzaW5jZSB0aGF0IGlzIGFuIGVzY2FwZSBsZXR0ZXIgdGhlcmUhIE1heWJlIEkgc2hvdWxkCiAgdXNlIGFub3RoZXIgbGV0dGVyIGluc3RlYWQhCgotIEFkZGVkIG1vcmUgdmFyaWFibGVzIHRvIC13OgoKICAnaHR0cF9jb2RlJwogICd0aW1lX25hbWVsb29rdXAnCiAgJ3RpbWVfY29ubmVjdCcKICAndGltZV9wcmV0cmFuc2ZlcicKICAndXJsX2VmZmVjdGl2ZScKCi0gTWFkZSAtd0BmaWxlbmFtZSByZWFkIHRoZSBzeW50YXggZnJvbSBhIGZpbGUgYW5kIC13QC0gcmVhZHMgdGhlIHN5bnRheCBmcm9tCiAgc3RkaW4gaW4gdGhlIGdvb2Qgb2xkICJzdGFuZGFyZCIgY3VybCB3YXkuCgpEYW5pZWwgKDIyIEZlYnJ1YXJ5IDIwMDApOgotIFJlbGVhc2VkIGEgNi41cHJlMSB2ZXJzaW9uIHRvIGdldCBzb21lIHRlc3QgYW5kIHVzZXIgZmVlZGJhY2suCgpEYW5pZWwgKDIxIEZlYnJ1YXJ5IDIwMDApOgoKLSBJIGFkZGVkIHRoZSAtdy8tLXdyaXRlLW91dCBmbGFnIGFuZCBzb21lIHZhcmlhYmxlcyB0byBnbyB3aXRoIGl0LiAtdyBpcyBhCiAgc2luZ2xlIHN0cmluZywgd2hhdGV2ZXIgeW91IGVudGVyIHRoZXJlIHdpbGwgYmUgd3JpdHRlbiBvdXQgd2hlbiBjdXJsIGhhcwogIGNvbXBsZXRlZCBhIHN1Y2Nlc3NmdWwgcmVxdWVzdC4gVGhlcmUgYXJlIHNvbWUgdmFyaWFibGUgc3Vic3RpdHV0aW9ucyBhbmQKICB0aGV5IGFyZSBzcGVjaWZpZWQgYXMgJyV7dmFyaWFibGV9JyAod2l0aG91dCB0aGUgcXVvdGVzKS4gVmFyaWFibGVzIHRoYXQKICBleGlzdCBhcyBvZiB0aGlzIG1vbWVudCBhcmU6CgogICAgICAgIHRvdGFsX3RpbWUgICAgIC0gdG90YWwgdHJhbnNmZXIgdGltZSBpbiBzZWNvbmRzICh3aXRoIDIgZGVjaW1hbHMpCiAgICAgICAgc2l6ZV9kb3dubG9hZCAgLSB0b3RhbCBkb3dubG9hZGVkIGFtb3VudCBvZiBieXRlcwogICAgICAgIHNpemVfdXBsb2FkICAgIC0gdG90YWwgdXBsb2FkZWQgYW1vdW50IG9mIGJ5dGVzCiAgICAgICAgc3BlZWRfZG93bmxvYWQgLSB0aGUgYXZlcmFnZSBzcGVlZCBvZiB0aGUgZW50aXJlIGRvd25sb2FkCiAgICAgICAgc3BlZWRfdXBsb2FkICAgLSB0aGUgYXZlcmFnZSBzcGVlZCBvZiB0aGUgZW50aXJlIHVwbG9hZAoKICBJIHdpbGwgb2YgY291cnNlIGFkZCBtb3JlIHZhcmlhYmxlcywgYnV0IEkgbmVlZCBpbnB1dCBvbiB0aGVzZSBhbmQgb3RoZXJzLgoKLSBJdCBzdHJ1Y2sgbWUgdGhhdCB0aGUgLSMgcHJvZ3Jlc3MgYmFyIHdpbGwgYmUgaGFyZCB0byBqdXN0IGFwcGx5IG9uIHRoZSBuZXcKICBwcm9ncmVzcyBiYXIgY29uY2VwdC4gSSBuZWVkIHNvbWUgZmVlZGJhY2sgb24gdGhpcyBiZWZvcmUgdGhhdCdsbCBnZXQgcmUtCiAgaW50cm9kdWNlZCEgOi0vCgpEYW5pZWwgKDE2IEZlYnJ1YXJ5IDIwMDApOgotIEr2cm4gSGFydHJvdGggYnJvdWdodCBtZSBzb21lIGZpeGVzIGZvciB0aGUgcHJvZ3Jlc3MgbWV0ZXIgYW5kIEkgY29udGludWVkCiAgd29ya2luZyBvbiBpdC4gSXQgc2VlbXMgdG8gd29yayBmb3IgaHR0cCBkb3dubG9hZCwgaHR0cCBwb3N0LCBmdHAgZG93bmxvYWQKICBhbmQgZnRwIHVwbG9hZC4gSXQgc2hvdWxkIGJlIGEgcHJldHR5IGdvb2QgdGVzdCBpdCB3b3JrcyBnZW5lcmFsbHkgZ29vZC4KCi0gU3RpbGwgbmVlZCB0byBhZGQgdGhlIC0jIHByb2dyZXNzIGJhciBpbnRvIHRoZSBuZXcgc3R5bGUgcHJvZ3Jlc3MgaW50ZXJmYWNlLgoKLSBHb25uYSBoYXZlIGEgZ28gYXQgbXkgbmV3IG91dHB1dCBvcHRpb24gcGFyYW1ldGVyIG5leHQuCgpEYW5pZWwgKDE1IEZlYnJ1YXJ5IDIwMDApOgotIFRoZSBwcm9ncmVzcyBtZXRlciBzdHVmZiBpcyBzbG93bHkgdGFraW5nIHBsYWNlLiBUaGVyZSdzIG1vcmUgbGVmdCBiZWZvcmUgaXQKICBpcyB3b3JraW5nIG9rIGFuZCBldmVyeXRoaW5nIGlzIHRlc3RlZCwgYnV0IHdlJ3JlIHJlYWNoaW5nIHRoZXJlLiBTbG93bHkhCgpEYW5pZWwgKDExIEZlYnJ1YXJ5IDIwMDApOgotIFBhdWwgTWFycXVpcyBmaXhlZCB0aGUgY29uZmlnIGZpbGUgcGFyc2luZyBvZiBjdXJsIHRvCiAgZGVhbCB3aXRoIGFueS1sZW5ndGggbGluZXMsIHJlbW92aW5nIHRoZSBwcmV2aW91cyBsaW1pdCBvZiA0Sy4KCi0gRWV0dSBPamFuZW4ncyBzdWdnZXN0aW9uIG9mIHN1cHBvcnRpbmcgdGhlIEAtc3R5bGUgZm9yIC1iCiAgaXMgaW1wbGVtZW50ZWQuIE5vdyAtYkA8ZmlsZW5hbWU+IHdvcmtzIGFzIHdlbGwgYXMgdGhlIG9sZCBzdHlsZS4gLWJALSBhbHNvCiAgc2ltaWxhcmx5IHJlYWRzIHRoZSBjb29raWVzIGZyb20gc3RkaW4uCgotIFJlbWluZGVyOiAtRCBzaG91bGQgbm90IHdyaXRlIHRvIHRoZSBmaWxlIHVudGlsIGl0IG5lZWRzIHRvLCBpbiB0aGUgc2FtZSB3YXkKICAtbyBkb2VzLiBUaGF0IHdvdWxkIGVuYWJsZSBjdXJsIHRvIHVzZSAtYiBhbmQgLUQgb24gdGhlIHNhbWUgZmlsZS4uLgoKLSBFbGxpcyBQcml0Y2hhcmQgbWFkZSBnZXRkYXRlLnkgd29yayBmb3IgTWFjT1MgWC4KCi0gUGF1bCBIYXJyaW5ndG9uIGhlbHBlZCBtZSBvdXQgZmluZGluZyB0aGUgY3Jhc2ggaW4gdGhlCiAgY29va2llIHBhcnNlci4gSGUgYWxzbyBwb2ludGVkIG91dCBjdXJsJ3MgaGFiaXQgb2Ygc2VuZGluZyBlbXB0eSBjb29raWVzIHRvCiAgdGhlIHNlcnZlci4KCkRhbmllbCAoOCBGZWJydWFyeSAyMDAwKToKIC0gUm9uIFphcHAgY29ycmVjdGVkIGEgcHJvYmxlbSBpbiBzcmMvdXJsZ2xvYi5jIHRoYXQKICAgcHJldmVudGVkIGN1cmwgZnJvbSBnZXR0aW5nIGNvbXBpbGVkIG9uIHN1bm9zIDQuIFRoZSBwcm9ibGVtIGhhZCB0byBkbwogICB3aXRoIHRoZSBkaWZmZXJlbmNlIGluIHNwcmludGYoKSByZXR1cm4gY29kZSB0eXBlcy4KCiAtIFRyYW5zZmVyKCkgc2hvdWxkIG5vdyBiZSBhYmxlIHRvIGRvd25sb2FkIGFuZCB1cGxvYWQgc2ltdWx0YW5lb3VzbHkuIExldCdzCiAgIGRvIHNvbWUgcHJvZ3Jlc3MgbWV0ZXIgZml4ZXMgbGF0ZXIgdGhpcyB3ZWVrLgoKRGFuaWVsICgzMSBKYW51YXJ5IDIwMDApOgogLSBQYXVsIEhhcnJpbmd0b24gZm91bmQgYW5vdGhlciBjb3JlIGR1bXAgaW4gdGhlIGNvb2tpZQogICBwYXJzZXIuIEN1cmwgZG9lc24ndCBwcm9wZXJseSByZWNvZ25pemUgdGhlICd2ZXJzaW9uJyBrZXl3b3JkIGFuZCBJIHRoaW5rCiAgIHRoYXQgaXMgd2hhdCBjYXVzZWQgdGhpcy4gSSBuZWVkIHRvIHJlZnJlc2ggc29tZSBzcGVjcyBvbiBjb29raWVzIGFuZCBzZWUKICAgd2hhdCBlbHNlIGN1cmwgbGFja3MgdG8gaW1wcm92ZSB0aGlzIGEgYml0IG1vcmUgb25jZSBhbmQgZm9yIGFsbC4KCiAgIFJGQyAyMTA5IGNsZWFybHkgc3BlY2lmaWVzIGhvdyBjb29raWVzIHNob3VsZCBiZSBkZWFsdCB3aXRoIHdoZW4gdGhleSBhcmUKICAgY29tcGxpYW50IHdpdGggdGhhdCBzcGVjLiBJIGRvbid0IHRoaW5rIG1hbnkgc2VydmVycyBhcmUgdGhvdWdoLi4uCgogLSBNYXJrIFcuIEVpY2hpbiBmb3VuZCB0aGF0IHdoaWxlIGN1cmwgaXMgdXBsb2FkaW5nIGEgZm9ybQogICB0byBhIHdlYiBzaXRlLCBpdCBkb2Vzbid0IHJlYWQgaW5jb21pbmcgZGF0YSB3aHkgaXQnbGwgaGFuZyBhZnRlciBhIHdoaWxlCiAgIHNpbmNlIHRoZSBzb2NrZXQgInBpcGUiIGJlY29tZXMgZnVsbC4KCiAgIEl0IHRvb2sgbWUgdHdvIGhvdXJzIHRvIHJld3JpdGUgRG93bmxvYWQoKSBhbmQgVXBsb2FkKCkgaW50byB0aGUgbmV3CiAgIHNpbmdsZSBmdW5jdGlvbiBUcmFuc2ZlcigpLiBJdCBldmVuIHNlZW1zIHRvIHdvcmshIE1vcmUgdGVzdGluZyBpcyByZXF1aXJlZAogICBvZiBjb3Vyc2UuLi4gSSBzaG91bGQgZ2V0IHRoZSBoZWFkZXItc2VuZGluZyB0b2dldGhlciBpbiBhIGtpbmQgb2YgcXVldWUKICAgYW5kIGxldCB0aGVtIGdldCAidXBsb2FkZWQiIGluIFRyYW5zZmVyKCkgYXMgd2VsbC4KCiAtIFpoaWJpYW8gV3UgcG9pbnRlZCBvdXQgYSBjdXJsIGJ1ZyBpbiB0aGUgbG9jYXRpb246IGFyZWEsCiAgIGFsdGhvdWdoIEkgZGlkIG5vdCBnZXQgYSByZXByb2R1Y2libGUgd2F5IHRvIGRvIHRoaXMgd2h5IEkgaGF2ZSB0byB3YWl0CiAgIHdpdGggZml4aW5nIGFueXRoaW5nLgoKIC0gQm9iIFNjaGFkZXIgc3VnZ2VzdGVkIEkgc2hvdWxkIGltcGxlbWVudCByZXN1bWUKICAgc3VwcG9ydCBmb3IgdGhlIEhUVFAgUFVUIG9wZXJhdGlvbiwgYW5kIGFzIEkgdGhpbmsgaXQgaXMgYSB2YWxpZCBzdWdnZXN0aW9uCiAgIEknbGwgd29yayBvbiBpdC4KCkRhbmllbCAoMjUgSmFudWFyeSAyMDAwKToKIC0gTSBUcmF2aXMgT2JlbmhhdXMgcG9pbnRlZCBvdXQgYSBtYW51YWwgbWl4dXAgd2l0aCAteSBhbmQgLVkgdGhhdCB3YXMKICAgY29ycmVjdGVkLgoKIC0gSmVucyBTY2hsZXVzZW5lciBwb2ludGVkIG91dCBhIHByb2JsZW0gdG8gY29tcGlsZQogICBjdXJsIG9uIEFJWCA0LjEuNCBhbmQgZ2F2ZSBtZSBhIHNvbHV0aW9uLiBUaGlzIHByb2JsZW0gd2FzIGFscmVhZHkgZml4ZWQKICAgYnkgSvZybidzIHJlY2VudCAjaW5jbHVkZSBtb2RpZmljYXRpb25zIQoKRGFuaWVsICgxOSBKYW51YXJ5IDIwMDApOgogLSBPc2thciBMaWxqZWJsYWQgcG9pbnRlZCBvdXQgYW5kIGNvcnJlY3RlZCBhIHByb2JsZW0KICAgaW4gdGhlIExvY2F0aW9uOiBmb2xsb3dpbmcgc3lzdGVtIHRoYXQgbWFkZSBjdXJsIGZvbGxvd2luZyBhIGxvY2F0aW9uOiB0byBhCiAgIGRpZmZlcmVudCBwcm90b2NvbCB0byBmYWlsLgoKICAgQXQgSmFudWFyeSAzMXN0IEkgcmUtY29uc2lkZXJlZCB0aGlzIGZpeCBhbmQgdGhlIHN1cnJvdW5kaW5nIHNvdXJjZSBjb2RlLiBJCiAgIGNvdWxkIG5vdCByZWFsbHkgc2VlIHRoYXQgdGhlIHBhdGNoIGRpZCBhbnkgZGlmZmVyZW5jZSwgd2h5IEkgcmVtb3ZlZCBpdAogICBhZ2FpbiBmb3IgZnVydGhlciByZXNlYXJjaCBhbmQgZGVidWdnaW5nLiAoSXQgZGlzYWJsZWQgbG9jYXRpb246IGZvbGxvd2luZwogICBvbiBzZXJ2ZXIgbm90IHJ1bm5pbmcgb24gZGVmYXVsdCBwb3J0cy4pCgogLSBK9nJuIEhhcnRyb3RoIGJyb3VnaHQgYSBmaXggdGhhdCBvbmNlIGFnYWluCiAgIG1hZGUgaXQgcG9zc2libGUgdG8gc2VsZWN0IHByb2dyZXNzIGJhci4KCiAtIEr2cm4gYWxzbyBmaXhlZCBhIGZldyBpbmNsdWRlIHByb2JsZW1zLgoKVmVyc2lvbiA2LjQKCkRhbmllbCAoMTcgSmFudWFyeSAyMDAwKToKIC0gQmFzZWQgb24gc3VnZ2VzdGlvbnMgZnJvbSBCavZybiBTdGVuYmVyZywgSSBtYWRlIHRoZQogICBwcm9ncmVzcyBkZWFsIGJldHRlciB3aXRoIGxhcmdlciBmaWxlcyBhbmQgYWRkZWQgYSAiVGltZSIgZmllbGQgd2hpY2ggc2hvd3MKICAgdGhlIHRpbWUgc3BlbnQgb24gdGhlIGRvd25sb2FkIHNvIGZhci4KIC0gSSdtIG5vdyB1c2luZyB0aGUgQ1ZTIHJlcG9zaXRvcnkgb24gc291cmNlZm9yZ2UubmV0LCB3aGljaCBhbHNvIGFsbG93cyB3ZWIKICAgYnJvd3NpbmcuIFNlZSBodHRwOi8vY3VybC5oYXh4Lm51LgoKRGFuaWVsICgxMCBKYW51YXJ5IDIwMDApOgogLSBSZW51bWJlcmVkIHNvbWUgZW51bXMgaW4gY3VybC9jdXJsLmggc2luY2UgdGFnIG51bWJlciAzNSB3YXMgdXNlZCB0d2ljZSEKIC0gQWRkZWQgInBvc3RxdW90ZSIgc3VwcG9ydCB0byB0aGUgZnRwIHNlY3Rpb24gdGhhdCBlbmFibGVzIHBvc3QtZnRwLXRyYW5zZmVyCiAgIHF1b3RlIGNvbW1hbmRzLgogLSBOb3cgbWFkZSB0aGUgLVEvLS1xdW90ZSBwYXJhbWV0ZXIgcmVjb2duaXplICctJyBhcyBhIHByZWZpeCwgd2hpY2ggbWVhbnMKICAgdGhhdCBjb21tYW5kIHdpbGwgYmUgaXNzdWVkIEFGVEVSIGEgc3VjY2Vzc2Z1bCBmdHAgdHJhbnNmZXIuIFRoaXMgY2FuIG9mCiAgIGNvdXJzZSBiZSB1c2VkIHRvIGRlbGV0ZSBvciByZW5hbWUgYSBmaWxlIGFmdGVyIGl0IGhhcyBiZWVuIHVwbG9hZGVkIG9yCiAgIGRvd25sb2FkZWQuIFVzZSB5b3VyIGltYWdpbmF0aW9uISA7LSkKIC0gU2luY2UgSSBkbyB0aGUgbWFpbiBkZXZlbG9wbWVudCBvbiBzb2xhcmlzIDIuNiBub3csIEkgaGFkIHRvIGRvd25sb2FkIGFuZAogICBpbnN0YWxsIEdOVSBncm9mZiB0byBnZW5lcmF0ZSB0aGUgaHVnZWhlbHAuYyBmaWxlLiBUaGUgc29sYXJpcyBucm9mZiBjb3JlcwogICBvbiB0aGUgbWFuIHBhZ2UhIFNvLCBpbiBvcmRlciB0byBtYWtlIHRoZSBzb2xhcmlzIGNvbmZpZ3VyZSBzY3JpcHQgZmluZCBhCiAgIGJldHRlciByZXN1bHQgSSBtYWRlIGducm9mZiBnZXQgY2hlY2tlZCBwcmlvciB0byB0aGUgcmVndWxhciBucm9mZi4KIC0gQWRkZWQgYWxsIHRoZSBjdXJsIGV4aXQgY29kZXMgdG8gdGhlIG1hbiBwYWdlLgogLSBKaW0gR2FsbGFnaGVyIHByb3Blcmx5IHRyYWNrZWQgZG93biBhIGJ1ZyBpbiBhdXRvY29uZgogICAyLjEzLiBUaGUgQUNfQ0hFQ0tfTElCKCkgbWFjcm8gd3JvbmdmdWxseSB1c2VzIHRoZSAtbCBmbGFnIGJlZm9yZSB0aGUgLUwKICAgZmxhZyB0byAnbGQnIHdoaWNoIGNhdXNlcyB0aGUgSFAtVVggMTAuMjAgZmxhdm91ciB0byBmYWlsIG9uIGFsbCBsaWJjaGVja3MKICAgYW5kIHRoZXJlZm9yZSB5b3UgY2FuJ3QgbWFrZSB0aGUgY29uZmlndXJlIHNjcmlwdCBmaW5kIHRoZSBvcGVuc3NsIGxpYnMhCgo=