ZTJmc3Byb2dzICgxLjM0KzEuMzUtV0lQLTIwMDMuMDguMjEtMykgdW5zdGFibGU7IHVyZ2VuY3k9bG93CgogICogQWRqdXN0IHRoZSBtYW4gcGFnZSBkZXNjcmlwdGlvbnMgc28gdGhhdCAiYXByb3BvcyBleHQyIiBvcgogICAgImFwcm9wb3MgZXh0MyIgd2lsbCBmaW5kIGFsbCBvZiB0aGUgZTJmc3Byb2dzIG1hbiBwYWdlcy4KICAgIChDbG9zZXM6ICMyMDY4NDUpCiAgKiBQcm90ZWN0IGFnYWluc3QgYSBwb3RlbnRpYWwgY29yZSBkdW1wIGluIGUyZnNjayB3aGVuIHByaW50aW5nIGEKICAgIG1lc3NhZ2UgYWJvdXQgYSBiYWNrdXAgc3VwZXJibG9jay4KICAqIEZpeCBhIGJ1ZyBpbiBta2UyZnMgd2hpY2ggY2F1c2VkIC1UIGxhcmdlZmlsZSBvciAtVCBsYXJnZWZpbGU0IHRvCiAgICBjb3JlIGR1bXAgZHVlIHRvIGEgZGl2aXNpb24gYnkgemVybyBlcnJvci4gIChDbG9zZXM6ICMyMDcwODIpCiAgKiBGb3JjZSBlMmZzcHJvZ3MgdG8gdXNlIHRoZSBtYXRjaGVkIHZlcnNpb24gb2YgZTJmc2xpYnMuICAoQ2xvc2VzOiAjMjA4MTAzKQoKIC0tIFRoZW9kb3JlIFkuIFRzJ28gPHR5dHNvQG1pdC5lZHU+ICBTdW4sIDMxIEF1ZyAyMDAzIDIxOjQ5OjUyIC0wNDAwCgplMmZzcHJvZ3MgKDEuMzQrMS4zNS1XSVAtMjAwMy4wOC4yMS0yKSB1bnN0YWJsZTsgdXJnZW5jeT1sb3cKCiAgKiBXaGVuIG1vdmluZyB0aGUgam91cm5hbCBvciBiYWNraW5nIHVwIHRoZSBqb3VybmFsIGlub2RlCiAgICBpbmZvcm1hdGlvbiwgbWFrZSBzdXJlIGUyZnNjayB1cGRhdGVzIGFsbCB0aGUgc3VwZXJibG9ja3MsIGFuZCBub3QKICAgIGp1c3QgdGhlIG1hc3RlciBzdXBlcmJsb2NrLgogICogQ2hhbmdlIHRoZSBwcmlvcml0eSBvZiBsaWJibGtpZDEtdWRlYiB0byBiZSByZXF1aXJlZCBpbnN0ZWFkIG9mCiAgICBzdGFuZGFyZCwgdG8gbWF0Y2ggdGhlIG92ZXJyaWRlIGZpbGUuCgogLS0gVGhlb2RvcmUgWS4gVHMnbyA8dHl0c29AbWl0LmVkdT4gIFRodSwgMjEgQXVnIDIwMDMgMDg6NTA6MzQgLTA0MDAKCmUyZnNwcm9ncyAoMS4zNCsxLjM1LVdJUC0yMDAzLjA4LjIxLTEpIHVuc3RhYmxlOyB1cmdlbmN5PWxvdwoKICAqIEZpeCBjb21waWxlX2V0IHRvIG91dHB1dCB0aGUgY29ycmVjdCBwcm90b3R5cGUgZm9yCiAgICBpbml0aWFsaXplX3h4eF9lcnJfdGFibGVfcigpIGluIHRoZSBoZWFkZXIgZmlsZS4gIChDbG9zZXM6ICMyMDQzMzIpCiAgKiBFMmZzY2sgd2lsbCBhdm9pZCBwcmludGluZyBeQSBhbmQgXkIgY2hhcmFjdGVycyBicmFja2V0aW5nIHRoZQogICAgcHJvZ3Jlc3MgYmFyIHdoZW4gc3Rkb3V0IGlzIGEgdHR5IGRldmljZS4gIChDbG9zZXM6ICMyMDQxMzcpCiAgKiBBZGQgc3VwcG9ydCBmb3Igc3RvcmluZyB0aGUgam91cm5hbCBpbm9kZSBsb2NhdGlvbiBpbiB0aGUgc3VwZXJibG9jawogICAgc28gdGhhdCBlMmZzY2sgY2FuIHJlY292ZXIgZnJvbSBhIGNvcnJ1cHRlZCBpbm9kZSB0YWJsZSBhZnRlciBhIHBvd2VyCiAgICBmYWlsdXJlLgogICogTW92ZSB0aGUgaW5pdHJkIHNjcmlwdCBmcm9tIC9ldGMvbWtpbml0cmQvc2NyaXB0cyB0bwogICAgL3Vzci9zaGFyZS9pbml0cmQtdG9vbHMvc2NyaXB0cyBzbyB0aGF0IG1raW5pdHJkIHdpbGwgbm90IHJlbW92ZQogICAgdGhlIGZpbGUgd2hlbiBpdCBpcyB1bmluc3RhbGxlZC4gIChDbG9zZXM6ICMyMDQwMTkpCiAgKiBSZW1vdmUgdW5uZWVkZWQgZmlsZXMgaW4gZGViaWFuIGRpcmVjdG9yeTogYmxraWQtZGV2LnN1YnN0dmFycyBhbmQKICAgIGUyZnNwcm9ncy1iZi5saW50aWFuLW92ZXJyaWRlcy4gIChDbG9zZXM6ICMyMDM5MTQpCiAgKiBTdXBwb3J0ICJub29wdCIgaW4gREVCX0JVSUxEX09QVElPTlMgaW5zdGVhZCBvZiAiZGVidWciLiAgCiAgICAoQ2xvc2VzOiAjMjAzOTE0KQoKIC0tIFRoZW9kb3JlIFkuIFRzJ28gPHR5dHNvQG1pdC5lZHU+ICBUaHUsIDIxIEF1ZyAyMDAzIDAxOjQ3OjU4IC0wNDAwCgplMmZzcHJvZ3MgKDEuMzQrMS4zNS1XSVAtMjAwMy4wOC4wMS0xKSB1bnN0YWJsZTsgdXJnZW5jeT1sb3cKCiAgKiBGaXggT19ESVJFQ1QgdGVzdCB0byBwcmV2ZW50IGJhZGJsb2NrcyBmcm9tIHNjcmV3aW5nIHVwIGFmdGVyCiAgICBmaW5kaW5nIGEgYmFkIGJsb2NrLiAgKENsb3NlczogIzIwMzcxMykKICAqIEFkZCBIZWltZGFsIGNvbXBpbGVfZXQgZXh0ZW5zaW9ucyBmcm9tIFBoaWxpcHAgVGhvbWFzIChwdGhvbWFzQHN1c2UuZGUpCiAgKiBGaXggcG90ZW50aWFsIHBvaW50ZXIgYWxpYXNpbmcgYnVncyBjYXVzZWQgYnkgdHlwZS1wdW5uaW5nIGFuZCBnY2MgMy54CgogLS0gVGhlb2RvcmUgWS4gVHMnbyA8dHl0c29AbWl0LmVkdT4gIEZyaSwgIDEgQXVnIDIwMDMgMTM6NDQ6NTggLTA0MDAKCmUyZnNwcm9ncyAoMS4zNC0yKSB1bnN0YWJsZTsgdXJnZW5jeT1sb3cKCiAgKiBGaXggZXJyb25lb3VzIHJlZmVyZW5jZSB0byAvdXNyL3NoYXJlL2RvYy9lMmZzcHJvZ3MvaHRtbC1pbmZvIGluCiAgICAvdXNyL3NoYXJlL2RvYy1iYXNlL2xpYmV4dDJmcyAoQ2xvc2VzOiAjMjAzMTU3KQogICogRXhwbGljaXRseSBzcGVjaWZ5IHRoZSB2ZXJzaW9uIG9mIGxpYmJsa2lkMSBuZWVkZWQgaW4KICAgIGUyZnNwcm9ncy5zaGxpYnMubG9jYWwgaW4gb3JkZXIgdG8gYXZvaWQgcGlja2luZyB1cCB0aGUgd3JvbmcgZGVwZWRlbmN5LgogICAgKENsb3NlczogIzIwMzE1NykKICAqIENoYW5nZWQgcHJpb3JpdHkgb2YgbGliYmxraWQxLXVkZWIgdG8gYmUgc3RhbmRhcmQsIG5vdCByZXF1aXJlZC4KCiAtLSBUaGVvZG9yZSBZLiBUcydvIDx0eXRzb0BtaXQuZWR1PiAgV2VkLCAzMCBKdWwgMjAwMyAxOTo0NzozMiAtMDQwMAoKZTJmc3Byb2dzICgxLjM0LTEuMSkgdW5zdGFibGU7IHVyZ2VuY3k9bG93CgogICogTm9uLW1haW50YWluZXIgdXBsb2FkLgogICogZG9uJ3QgY2FsbCBsZGNvbmZpZyBpbiB1ZGVicy4KICAqIGZpeCBkZXBlbmRlbmNpZXMgb2YgZTJmc3Byb2dzLXVkZWIuCgogLS0gQmFzdGlhbiBCbGFuayA8d2FsZGlAZGViaWFuLm9yZz4gIFR1ZSwgMjkgSnVsIDIwMDMgMTI6MTE6NTQgKzAyMDAKCmUyZnNwcm9ncyAoMS4zNC0xKSB1bnN0YWJsZTsgdXJnZW5jeT1sb3cKCiAgKiBOZXcgdXBzdHJlYW0gdmVyc2lvbi4KICAqIEZpeGVkIGJ1ZyBpbiBmc2NrIHdoaWNoIGNhdXNlZCBpdCB0byB3YXN0ZSBDUFUgYnkgc3Bpbm5pbmcgd2hpbGUKICAgIHdhaXRpbmcgZm9yIGEgY2hpbGQgZnNjayBwcm9jZXNzIHVuZGVyIHNvbWUgY2lyY3Vtc3RhbmNlcy4KICAqIEZpeGVkIGJ1ZyBpbiBibGtpZCBsaWJyYXJ5IHdoaWNoIHdvdWxkIGNhdXNlIGl0IHRvIHNwaW4gZm9yZXZlciBpZgogICAgL3Byb2MgaXMgbm90IG1vdW50ZWQgYW5kIC9ldGMvYmxraWQudGFiIGlzIG5vdCBwcmVzZW50LgogICogSW1wcm92ZWQgdGhlIGJsa2lkIGxpYnJhcnkncyBVREYncyBwcm9iaW5nIGZ1bmN0aW9ucy4KICAqIEZpeGVkIHRoZSBibGtpZCBsaWJyYXJ5IHNvIGl0IHdpbGwgcmVtb3ZlIGRlbGV0ZSB0aGUgTEFCRUwKICAgIGF0dHJpYnV0ZSBmcm9tIGl0cyBjYWNoZSB3aGVuIGEgZmlsZXN5c3RlbSB0aGF0IHByZXZpb3VzbHkgaGFkIGEKICAgIGxhYmVsIG5vIGxvbmdlciBoYXMgb25lLgogICogQWRkZWQgU3dlZGlzaCB0cmFuc2xhdGlvbi4KICAqIFJlbW92ZSBkZWJ1Z2dpbmcgcHJpbnRmIGluIGJhZGJsb2NrcyBwcm9ncmFtIChDbG9zZXM6ICMyMDE0OTkpCiAgKiBTcGxpdCBzaGFyZWQgbGlicmFyaWVzIG91dCBvZiB0aGUgZTJmc3Byb2dzIHBhY2thZ2UgaW50byBzZXBhcmF0ZQogICAgcGFja2FnZXM6IGxpYnNzMiwgbGliY29tZXJyMiwgbGlidXVpZDEsIGFuZCBlMmZzbGlicy4gIChDbG9zZXM6ICMyMDExNTUsCiAgICAjMjAxMTY0KQogICogV2FybiB0aGUgdXNlciB3aGVuIGNyZWF0aW5nIGEgZmlsZXN5c3RlbSB3aXRoIGEgam91cm5hbCBhbmQgYSBibG9ja3NpemUKICAgIGdyZWF0ZXIgdGhhbiA0MDk2LCBzaW5jZSBzb21lIGtlcm5lbHMgZG9uJ3Qgc3VwcG9ydCBleHQzIHdpdGggbGFyZ2UKICAgIGJsb2NrIHNpemVzLiAgKENsb3NlczogICMxOTM3NzMpCgogLS0gVGhlb2RvcmUgWS4gVHMnbyA8dHl0c29AbWl0LmVkdT4gIFNhdCwgMjYgSnVsIDIwMDMgMDE6MDE6NTUgLTA0MDAKCmUyZnNwcm9ncyAoMS4zMysxLjM0LVdJUC0yMDAzLjA1LjIxLTIpIHVuc3RhYmxlOyB1cmdlbmN5PWxvdwoKICAqIFNldCB1cCBGcmVlQlNEIGNvbmZpZ3VyYXRpb24gZGVmYXVsdHMgKENsb3NlczogIzE5NTI3NCkKICAqIENsYXJpZnkgcmVzaXplMmZzIG1hbiBwYWdlIChDbG9zZXM6ICMxOTU2MTYpCiAgKiBGaXggcmVzaXplMmZzIHRvIGRlYWwgd2l0aCBmaWxlc3lzdGVtIHdpdGggYmFkIGJsb2NrcwogICogRml4IHNwZWxsaW5nIGVycm9yIGluIGUyZnNjawogICogQWRkIHdvcmthcm91bmQgZm9yIGludGwgbGlicmFyeSBvbiBEYXJ3aW4KICAqIEZpeCBnY2MgLVdhbGwgbml0cGlja3MKICAqIFJvdW5kIGRvd24gdGhlIGRlZmF1bHQgc2l6ZSBvZiB0aGUgZmlsZXN5c3RlbSBmb3IgbWtlMmZzIGFuZCAKICAgIHJlc2l6ZTJmcyB0byBiZSBhIG11bHRpcGxlIG9mIHRoZSBwYWdlc2l6ZSB0byB3b3JrIGFyb3VuZCBhIHBvdGVudGlhbAogICAgTGludXgga2VybmVsIGJ1ZwogICogRml4IGJ1ZyBpbiBta2UyZnMgd2hlcmUgaXQgY291bGQgZGllIHdpdGggYSBmbG9hdGluZyBleGNlcHRpb24gaWYKICAgIHRoZSBkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCB0aGUgQkxLU1NaR0VUIGlvY3RsIChDbG9zZXM6ICMxOTY3MzQpCiAgKiBBZGQgY29uZmxpY3RzIGFnYWluc3Qgb2xkZXIgdmVyc2lvbnMgb2Ygc3lzdmluaXQgdGhhdCBkb24ndCBjb3JyZWN0bHkKICAgIGhhbmRsZSBhbiBleGl0IGNvZGUgdGhhdCBoYXMgdGhlIGJpdCAjMiBzZXQuICAoQ2xvc2VzOiAjMTgzNjc1KQogICogQmFkYmxvY2tzIHdpbGwgYXR0ZW1wdCB0byB1c2UgT19ESVJFQ1QgaWYgaXQgaXMgc2FmZSB0byBkbyBzby4gIAogICAgKENsb3NlczogIzE5ODAwNikKICAqIFVzZSBzeW1ib2xpYyBsaW5rcyBmb3IgZnNjay5leHR7MiwzfSBhbmQgbWtmcy5leHR7MiwzfSBpbiB0aGUgdWRlYgogICAgcGFja2FnZSBzaW5jZSBidXN5Ym94IHRhciBjYW4ndCBkZWFsIHdpdGggaGFyZCBsaW5rcy4gIChDbG9zZXM6ICMxOTY1MDgpCgogLS0gVGhlb2RvcmUgWS4gVHMnbyA8dHl0c29AbWl0LmVkdT4gIFNhdCwgMTIgSnVsIDIwMDMgMDM6MTY6MDggLTA0MDAKCmUyZnNwcm9ncyAoMS4zMysxLjM0LVdJUC0yMDAzLjA1LjIxLTEpIHVuc3RhYmxlOyB1cmdlbmN5PWxvdwoKICAqIEZpeCBwcm9ibGVtcyB3aXRoIGNvbXBpbGluZyBlMmZzcHJvZ3Mgd2l0aCBOTFMgc3VwcG9ydCBvbiB3b29keSAKICAgIChDbG9zZXM6ICMxOTMzNzIpCiAgKiBSZW1vdmUgdGhlIGV4dHJhbmVvdXMgZGUtdXRmLnBvIGZpbGUuCiAgKiBBZGQgZ2V0LXRleHQgdG8gYnVpbGQtZGVwZW5kcy4KICAqIFVzZSBuZ2V0dGV4dCAoYWJicmV2aWF0ZWQgd2l0aCBQXygpKSB0byBzaW1wbGlmeSB0aGUgc3RhdGlzdGljcyByZXBvcnRpbmcuCiAgKiBGaXggYmFkYmxvY2tzIHRvIGJlIGFibGUgdG8gc3VwcG9ydCBhcmJpdHJhcnkgNCBieXRlIHRlc3QgcGF0dGVybnMuCiAgKiBGaXggYnVnIHdoaWNoIGNhdXNlZCB1cyB0byBhY2NpZGVudGFsbHkgaW5jbHVkZSB0aGUgRVZNUyBwbHVnaW4gaW4KICAgIHRoZSBlMmZzcHJvZ3MgcGFja2FnZSAod2hpY2ggZG9lc24ndCB3b3JrLCBidXQgY2F1c2VzIGNvbmZ1c2luZyBtZXNzYWdlcwogICAgdG8gc2hvdyB1cCB3aGVuIHRoZSBldm1zIGNsaWVudCBpcyBzdGFydGVkKS4KICAqIElmIHRoZSBoYXJkd2FyZSBzZWN0b3Igc2l6ZSBvZiBhIGRldmljZSBpcyBsYXJnZXIgdGhhbiB0aGUgZGVmYXVsdCAKICAgIGJsb2Nrc2l6ZSwgdXNlIHRoZSBoYXJkd2FyZSBzZWN0b3Igc2l6ZSBhcyB0aGUgYmxvY2tzaXplIHdoZW4gY3JlYXRpbmcgCiAgICBhIGZpbGVzeXN0ZW0sIHRvIHNvbHZlIHByb2JsZW1zIHdpdGggcy8zOTAgREFTRCdzLgogICogQWRkIGEgc2hhcmVkIGxpYnJhcnkgZGVwZW5kZW5jeSB0byBsaWJ1dWlkIHRvIGxpYmJsa2lkIChDbG9zZXM6ICMxOTQwOTQpCiAgKiBBZGQgaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBvZiBhIGR1bXBfdW51c2VkIGNvbW1hbmQgKENsb3NlczogIzc5MTY0KQoKIC0tIFRoZW9kb3JlIFkuIFRzJ28gPHR5dHNvQG1pdC5lZHU+ICBTdW4sIDE4IE1heSAyMDAzIDAxOjI0OjE2IC0wNDAwCgplMmZzcHJvZ3MgKDEuMzMtNSkgdW5zdGFibGU7IHVyZ2VuY3k9bG93CgogICogQ2xhcmlmeSBibG9ja3NpemUgdW5pdHMgd2hlbiBkaXNwbGF5aW5nIG1lc3NhZ2VzIGluIHJlc2l6ZTJmcywgYW5kIAogICAgc3VwcG9ydCB1c2luZyBzdWZmaXhlcyAoc2VjdG9ycywga2lsb2J5dGVzLCBtZWdhYml0ZXMsIGdpZ2FieXRlcykgCiAgICB0byB0aGUgc2l6ZSBwYXJhbWV0ZXIgdG8gaW5kaWNhdGUgdW5pdHMuICAoQ2xvc2VzOiAjMTg5ODE0KQogICogRml4IGRlYnVnZnMgY29yZS1kdW1waW5nIHByb2JsZW0gY2F1c2VkIGJ5IGdldG9wdC4gIChXb3JrcyBhcm91bmQ6ICMxOTI4MzQpCiAgKiBBZGQgcGFja2FnZSBkZXBlbmRlbmN5IHRvIHNobGlicyBmb3IgY29tZXJyIHRvIGluZGljYXRlIHN1cHBvcnQgCiAgICBmb3Iga3RoIGNvbXBhdGliaWxpdHkuICAoQ2xvc2VzOiAjMTkzMDk2KQoKIC0tIFRoZW9kb3JlIFkuIFRzJ28gPHR5dHNvQG1pdC5lZHU+ICBUdWUsIDEzIE1heSAyMDAzIDIzOjQ1OjA4IC0wNDAwCgplMmZzcHJvZ3MgKDEuMzMtNCkgdW5zdGFibGU7IHVyZ2VuY3k9bG93CgogICogQWRkIHJlcGxhY2VzIGZpZWxkIHRvIGNvbWVyci1kZXYgdG8gcmVzb2x2ZSBhIGZpbGUgY29uZmxpY3Qgd2l0aAogICAgL3Vzci9pbmNsdWRlL2NvbV9lcnIuaCBhbmQgdGhlIGxpYmtyYjUtZGV2IHBhY2thZ2UuICAoQ2xvc2VzOiAjMTkyMjc3KQogICogQWRkIC10IG9wdGlvbiB0byBiYWRibG9ja3MgdG8gY29udHJvbCB0aGUgdGVzdCBwYXR0ZXJuIHVzZWQuCiAgKiBSZW1vdmUgZTJmc3Byb2dzLWJmIHBhY2thZ2UsIGFzIGl0IGlzIG9ic29sZXRlLiAoQ2xvc2VzOiAjMTgzNDUzKQogICogUmVtb3ZlIE5MUyBzdXBwb3J0IGZyb20gZTJmc3Byb2dzLXVkZWIuICBTYXZlIDUuNWsgb24gdGhlIGJvb3QKICAgIGZsb3BwaWVzIC8gaW5zdGFsbCBtZWRpYS4KCiAtLSBUaGVvZG9yZSBZLiBUcydvIDx0eXRzb0BtaXQuZWR1PiAgVGh1LCAgOCBNYXkgMjAwMyAxMDoyNTowNSAtMDQwMAoKZTJmc3Byb2dzICgxLjMzLTMpIHVuc3RhYmxlOyB1cmdlbmN5PWxvdwoKICAqIEFkZCBmdWxsIEhlaW1kYWxsL0tlcmJlcm9zNC1rdGggY29tcGF0aWJpbGl0eSB0byBjb21fZXJyIHJvdXRpbmVzLgogICogRGVjbGFyZSBjb21lcnItZGV2IGFzIHJlcGxhY2luZyA8PCBlMmZzbGlicy1kZXYgMS4zMy0yLCB0byBhdm9pZAogICAgZXJyb3JzIHdoZW4gdXBncmFkaW5nIHRvIHRoZSBuZXcgdmVyc2lvbnMgb2YgY29tZXJyLWRldiBhbmQKICAgIGUyZnNsaWJzLWRldgoKIC0tIFRoZW9kb3JlIFkuIFRzJ28gPHR5dHNvQG1pdC5lZHU+ICBUdWUsICA2IE1heSAyMDAzIDAwOjI5OjQ3IC0wNDAwCgplMmZzcHJvZ3MgKDEuMzMtMikgdW5zdGFibGU7IHVyZ2VuY3k9bG93CgogICogRml4IHVwIE5MUyBzdXBwb3J0CiAgICAgLSBGaXggbWVzc2FnZSBhYmJyZXZpYXRpb25zIHN1cHBvcnQgKGkuZS4sIEBnIC0tPiBncm91cCkKICAgICAtIFVwZGF0ZSB0byBnZXR0ZXh0IDAuMTEuNSAKICAgICAtIEFkZCBDemVjaCB0cmFuc2xhdGlvbgogICAgIC0gSW5zdGFsbCBtZXNzYWdlIGNhdGFsb2dzCiAgICAgLSBPdGhlciBtaXNjZWxsYW5lb3VzIE5MUyBidWcgZml4ZXMKICAqIEFkZCBuZXcgZGVidWdmcyBjb21tYW5kLCBpbWFwLCB3aGljaCBwcmludHMgdGhlIGxvY2F0aW9uIG9mIGEgCiAgICBzcGVjaWZpZWQgaW5vZGUgaW4gdGhlIGlub2RlIHRhYmxlLgogICogUHV0IC91c3IvaW5jbHVkZS9jb21fZXJyLmggaW4gY29tZXJyLWRldiBpbnN0ZWFkIG9mIGUyZnNsaWJzLWRldi4gIAogICAgKENsb3NlcyAjMTkxODk5KQogICogQWRkIHN1cHBvcnQgZm9yIE9WLXN0eWxlIGNvbnRpbnVhdGlvbnMgaW4gY29tcGlsZV9ldC4gIChDbG9zZXMgIzE5MTkwMCkKCiAtLSBUaGVvZG9yZSBZLiBUcydvIDx0eXRzb0BtaXQuZWR1PiAgTW9uLCAgNSBNYXkgMjAwMyAxODoxMzoxMiAtMDQwMAoKZTJmc3Byb2dzICgxLjMzLTEpIHVuc3RhYmxlOyB1cmdlbmN5PWxvdwoKICAqIE5ldyB1cHN0cmVhbSB2ZXJzaW9uIChDbG9zZXM6ICMxODk2ODcpCgogLS0gVGhlb2RvcmUgWS4gVHMnbyA8dHl0c29AbWl0LmVkdT4gIE1vbiwgMjEgQXByIDIwMDMgMTM6NDk6NTIgLTA0MDAKCmUyZnNwcm9ncyAoMS4zMisxLjMzLVdJUC0yMDAzLjA0LjE0LTEpIHVuc3RhYmxlOyB1cmdlbmN5PWxvdwoKICAqIE5ldyB1cHN0cmVhbSB2ZXJzaW9uCiAgICAgLSBBZGQgbmV3IHV0aWxpdHkgcHJvZ3JhbSwgbG9nc2F2ZSwgdG8gY2FwdHVyZSB0aGUgb3V0cHV0IG9mIGZzY2sKICAgICAgIGR1cmluZyB0aGUgYm9vdCBzZXF1ZW5jZQogICogQWRkIHN1cHBvcnQgZm9yIHRoZSAtYSBhbmQgLXMgb3B0aW9ucyB0byBsb2dzYXZlLgogICogQ2hhbmdlIGUyZnNjayB0byBicmFja2V0IGl0cyBwcm9ncmVzcyBiYXIgb3V0cHV0IHdpdGggY3RybC1BIGFuZCBjdHJsLUIKICAgIGNoYXJhY3RlcnMsIHNvIHRoYXQgbG9nc2F2ZSAtcyBjYW4gb21pdCB3cml0aW5nIHRoZSBwcm9ncmVzcyBiYXIgb3V0cHV0CiAgICB0byB0aGUgbG9nIGZpbGUuCiAgKiBBdm9pZCBwcmludGluZyB0aGUgdmVyc2lvbiBiYW5uZXIgZm9yIG1rZTJmcyBpZiB0aGUgLXEgb3B0aW9uIGlzIAogICAgc3BlY2lmaWVkLiAgKENsb3NlczogIzE3MjcxNikKCiAtLSBUaGVvZG9yZSBZLiBUcydvIDx0eXRzb0BtaXQuZWR1PiAgV2VkLCAxNiBBcHIgMjAwMyAxNToyNzoyMCAtMDQwMAoKZTJmc3Byb2dzICgxLjMyKzEuMzMtV0lQLTIwMDMuMDMuMzAtMykgdW5zdGFibGU7IHVyZ2VuY3k9bG93CgogICogUHJvdmlkZSAvdXNyL2luY2x1ZGUvY29tX2Vyci5oLCB3aGljaCB3YXMgcHJldmlvdXNseSBwcm92aWRlZCBieSB0aGUKICAgIGxpYmtyYjUtZGV2IHBhY2thZ2UKICAqIENoYW5nZSB0aGUgc2VjdG9pbiBvZiBjb21fZXJyLWRldiwgc3MtZGV2LCB1dWlkLWRldiwgbGliYmxraWQtZGV2LAogICAgZTJmc2xpYnMtZGV2IHRvIGxpYmRldmVsCiAgKiBBZGQgbGliYmxraWQxLXVkZWIgcGFja2FnZSBmb3IgdGhlIERlYmlhbiBJbnN0YWxsZXIuCiAgKiBVc2UgdGhlIFNTX1JFQURMSU5FX1BBVEggZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gY29udHJvbCB0aGUgc2VhcmNoCiAgICBmb3IgYSBzdWl0YWJsZSByZWFkaW5lIGxpYnJhcnkuCiAgKiBGaXggYnVnIGluIG1rZTJmcywgd2hpY2ggd2FzIHdhcyBpbmNvcnJlY3RseSBjaGVja2luZyB0aGUgYXJndW1lbnQKICAgIHRvIHRoZSAtZyBvcHRpb24gaWYgdGhlIGRlZmF1bHQgYmxvY2sgc2l6ZSBpcyB1c2VkLiAgKENsb3NlczogIzE4ODMxOSkKICAqIFVwZGF0ZSBtYW4gcGFnZXMuICAoQ2xvc2VzOiAjMTg4MzE4KQogICogTWtlMmZzIGNhbiBiZSBnaXZlbiBhIG1pbmltdW0gYmxvY2sgc2l6ZSBieSBwYXNzaW5nIGluIGEgbmVnYXRpdmUKICAgIG51bWJlciB0byB0aGUgLWIgb3B0aW9uLgogICogVXBkYXRlIHRvIHN0YW5kYXJkcyAzLjUuOQoKIC0tIFRoZW9kb3JlIFkuIFRzJ28gPHR5dHNvQG1pdC5lZHU+ICBTYXQsIDEyIEFwciAyMDAzIDAyOjUyOjE3IC0wNDAwCgplMmZzcHJvZ3MgKDEuMzIrMS4zMy1XSVAtMjAwMy4wMy4zMC0yKSB1bnN0YWJsZTsgdXJnZW5jeT1sb3cKCiAgKiBGaXggWEZTIHN1cGVyYmxvY2sgZGVmaW5pdGlvbi4gIEFkZCBzdXBwb3J0IHRvIGV4dHJhY3QgVVVJRCBhbmQKICAgIGxhYmVscyBmb3IgSkZTIGFuZCBST01GUy4KICAqIE1ha2UgdGhlIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIG1vcmUgcGFyYW5vaWQgYWJvdXQgcG90ZW50aWFsbHkgYnVnZ3kKICAgIC9kZXYvcmFuZG9tIGRldmljZXMuCiAgKiBUaGUgYmFkYmxvY2tzIHByb2dyYW0gbm93IGZsdXNoZXMgaXRzIG91dHB1dCBhcyBpdCBkaXNjb3ZlcnMgYmFkIGJsb2Nrcy4KICAqIEltcG9ydGVkIGJ1ZyBmaXhlcyB0byBFVk1TIGRyaXZlciBmcm9tIHRoZSBFVk1TIDIuMCB0cmVlLiAgRml4ZWQgYSAKICAgIGZldyBwb3RlbnRpYWwgaGFuZ3MsIGFuZCBlbGltaW5hdGVkIGEgZmlsZSBkZXNjcmlwdG9yIGxlYWsuCiAgKiBFMmZzY2sgbm93IHVwZGF0ZXMgdGhlIGdsb2JhbCBmcmVlIGJsb2NrIGFuZCBpbm9kZSBjb3VudGVycyBmcm9tCiAgICB0aGUgYmxvY2sgZ3JvdXAgc3BlY2lmaWMgY291bnRlcnMgcXVpZXRseS4gIFRoaXMgaXMgbmVlZGVkIGZvciBhbgogICAgZXhwZXJpbWVudGFsIGtlcm5lbCBwYXRjaCB3aGljaCBpbXByb3ZlcyBTTVAgc2NhbGFiaWxpdHkgYnkgbm90IAogICAgbG9ja2luZyB0aGUgZW50aXJlIGZpbGVzeXN0ZW0gZHVyaW5nIGJsb2NrIG9yIGlub2RlIGFsbG9jYXRpb247IGlmCiAgICB0aGUgZmlsZXN5c3RlbSBpcyBub3QgdW5tb3V0bmVkIGNsZWFubHksIHRoZSBnbG9iYWwgY291bnRzIG1heSBub3QKICAgIGJlIGFjY3VyYXRlLgogICogRml4IGEgYnVnIGluIGZzY2sgd2hpY2ggY2FuIGNhdXNlIGl0IHRvIGhhbmcgdHJ5aW5nIHRvIGFjY2VzcyB0aGUKICAgIGZsb3BweSBkaXNrIGlmIHRoZXJlIHRoZSBmbG9wcHkgZHJpdmUgaGFzIGZpbGVzeXN0ZW0gdHlwZSBvZgogICAgJ2F1dG8nLiAgKENsb3NlczogIzE4NzgxMikKCiAtLSBUaGVvZG9yZSBZLiBUcydvIDx0eXRzb0BtaXQuZWR1PiAgU3VuLCAgNiBBcHIgMjAwMyAyMzoxMzo1MCAtMDQwMAoKZTJmc3Byb2dzICgxLjMyKzEuMzMtV0lQLTIwMDMuMDMuMzAtMSkgdW5zdGFibGU7IHVyZ2VuY3k9bG93CgogICogQ2hhbmdlIGNvbXBpbGVfZXQgdG8gZ2VuZXJhdGUgaGVhZGVyIGZpbGVzIHRoYXQgdXNlIDxldC9jb21fZXJyLmg+CiAgICBpbnN0ZWFkIG9mIDxjb21fZXJyLmg+LCBzbyB0aGUgY3VycmVudCB2ZXJzaW9uIG9mIHRoZSBoZWFkZXIgZmlsZSAKICAgIGlzIHVzZWQuICBSZW1vdmUgbGVnYWN5IEsmUiwgdmFyYXJncywgYW5kIHByZS1QT1NJWCBzaWduYWwgc3VwcG9ydC4KICAqIEZpeCAob25lIG1vcmUgdGltZSEpIEFwcGxlIERhcndpbiBwb3J0IGluIGJsa2lkL2dldHNpemUuYwoKIC0tIFRoZW9kb3JlIFkuIFRzJ28gPHR5dHNvQG1pdC5lZHU+ICBTdW4sIDMwIE1hciAyMDAzIDIzOjM0OjU1IC0wNTAwCgplMmZzcHJvZ3MgKDEuMzIrMS4zMy1XSVAtMjAwMy4wMy4yNS0xKSB1bnN0YWJsZTsgdXJnZW5jeT1sb3cKCiAgKiBOZXcgbWFpbnRhaW5lcgogICogTmV3IHVwc3RyZWFtIHJlbGVhc2UgKENsb3NlczogIzE3NjgxNCwgIzE3NDc2NiwgIzE2NjA0OCwgIzE3OTY3MSwKICAgICMxNzM2MTIsICMxNzUyMzMsICMxNzUxMTMsICMxNzA0OTcsICMxODU5NDUpCgogLS0gVGhlb2RvcmUgWS4gVHMnbyA8dHl0c29AbWl0LmVkdT4gIFN1biwgMTYgTWFyIDIwMDMgMTg6MDU6MDggLTA1MDAKCmUyZnNwcm9ncyAoMS4zMi0yKSB1bnN0YWJsZTsgdXJnZW5jeT1oaWdoCgogICogQXBwbGllZCB1cHN0cmVhbSBwYXRjaCB0byBmaXggaHRyZWUgcHJvYmxlbXMsIGFuZCB0byBkZWFjdGl2YXRlIGl0IGJ5CiAgICBkZWZhdWx0IGluIG1rZTJmcyAoQ2xvc2VzOiAjMTgxNjE1LCAjMTc5MDQzKQogICogQmUgc3VyZSByZW1vdmFsIG9mIGxpYmUyZnNpbSBkb2Vzbid0IGZhaWwsIGFzIGl0J3Mgbm90IGJ1aWx0IG9uIGh1cmQKICAgIChDbG9zZXM6ICMxNjQxMTcpLgoKIC0tIFlhbm4gRGlyc29uIDxkaXJzb25AZGViaWFuLm9yZz4gIEZyaSwgMjEgRmViIDIwMDMgMDA6MjE6NDQgKzAxMDAKCmUyZnNwcm9ncyAoMS4zMi0xKSB1bnN0YWJsZTsgdXJnZW5jeT1sb3cKCiAgKiBOZXcgdXBzdHJlYW0gcmVsZWFzZSAoQ2xvc2VzOiAjMTY3MTA4KS4KCiAtLSBZYW5uIERpcnNvbiA8ZGlyc29uQGRlYmlhbi5vcmc+ICBUdWUsIDE5IE5vdiAyMDAyIDAwOjE4OjA5ICswMTAwCgplMmZzcHJvZ3MgKDEuMjkrMS4zMC1XSVAtMDkzMC0yKSB1bnN0YWJsZTsgdXJnZW5jeT1sb3cKCiAgKiBNYWRlIG1raW5pdHJkIHNjcmlwdCB0byBza2lwIGNvbW1lbnRlZC1vdXQgbGluZXMgKENsb3NlczogIzE2MzI1MSkuCgogLS0gWWFubiBEaXJzb24gPGRpcnNvbkBkZWJpYW4ub3JnPiAgVHVlLCAxNSBPY3QgMjAwMiAwMDoxNjowOCArMDIwMAoKZTJmc3Byb2dzICgxLjI5KzEuMzAtV0lQLTA5MzAtMSkgdW5zdGFibGU7IHVyZ2VuY3k9bG93CgogICogTmV3IHVwc3RyZWFtIHByZXJlbGVhc2UuCiAgKiBSZXBsYWNlZCBpbiBta2luaXRyZCBzY3JpcHQgInR1bmUyZnMgLWoiIHdpdGggInR1bmUyZnMgLU8KICAgIGhhc19qb3VybmFsIiwgYXMgc3VnZ2VzdGVkIGJ5IFRoZW9kb3JlIFRzJ28gKENsb3NlczogIzE2Mjk0OSkuCiAgKiBSZW1vdmUgLS1kaXNhYmxlLWRlYnVnZnMgZnJvbSBtaXBzLW5vcGljIGZsYWdzIChDbG9zZXM6ICMxNjI2NzQpLgoKIC0tIFlhbm4gRGlyc29uIDxkaXJzb25AZGViaWFuLm9yZz4gIFRodSwgIDMgT2N0IDIwMDIgMDA6MDU6MzYgKzAyMDAKCmUyZnNwcm9ncyAoMS4yOS0xKSB1bnN0YWJsZTsgdXJnZW5jeT1sb3cKCiAgKiBOZXcgdXBzdHJlYW0gcmVsZWFzZSAoQ2xvc2VzOiAjMTU5NDIzKS4KICAqIEZpeGVkIHR5cG8gaW4gY2hhdHRyIG1hbnBhZ2UgKFBoaWxpcHAgTWF0dGhpYXMgSGFobiwgQ2xvc2VzOgogICAgIzE2MjI5NykuCiAgKiBHZW5lcmF0ZSB1ZGViIHBhY2thZ2UgZm9yIGRlYmlhbi1pbnN0YWxsZXIgKE1hcnRpbiBTavZncmVuLCBDbG9zZXM6CiAgICAjMTYyMjEyKS4KICAqIEZpeGVkIGluc3RhbGxhdGlvbiBvZiBta2luaXRyZCBzY3JpcHQgKGRvbid0IHVzZSBkaF9pbnN0YWxsKS4gIFJlbW92ZQogICAgaXQgZnJvbSB0aGUgd3JvbmcgbG9jYXRpb24gd2hlcmUgaXQgd2FzLCBpbiBwcmVpbnN0LiAgSG9wZWZ1bGx5IG5vb25lCiAgICBub3RpY2VkLgogICogQWxzbyBoYXZlIG9sZCBzY3JpcHRzL2UyZnNwcm9ncy5ta2luaXRyZCByZW1vdmVkLgogICogQnVtcGVkIFN0YW5kYXJkcy1WZXJzaW9uIHRvIDMuNS42LCBubyBjaGFuZ2UuICAzLjUuNyB3aWxsIG5lZWQgYSBiaXQKICAgIG9mIHdvcmsgYnV0IG5vdCB0b25pZ2h0LgoKIC0tIFlhbm4gRGlyc29uIDxkaXJzb25AZGViaWFuLm9yZz4gIFRodSwgMjYgU2VwIDIwMDIgMDE6NDY6MjUgKzAyMDAKCmUyZnNwcm9ncyAoMS4yOC01KSB1bnN0YWJsZTsgdXJnZW5jeT1sb3cKCiAgKiBUaGUgInRoaXMgdGltZSBpdCB3aWxsIHdvcmsgISAoZmFtb3VzIGxhc3Qgd29yZHMpIiByZWxlYXNlLgogICogTm93IHRoYXQgaXQgYnVpbGRzLCBlbnN1cmUgdGhlIGRpciBpbiB3aGljaCB3ZSBpbnN0YWxsIHRoaXMgZGFtbiBtaXBzCiAgICBub24tcGljIGxpYiBleGlzdHMuCgogLS0gWWFubiBEaXJzb24gPGRpcnNvbkBkZWJpYW4ub3JnPiAgVHVlLCAxNyBTZXAgMjAwMiAwMDowNDo0OSArMDIwMAoKZTJmc3Byb2dzICgxLjI4LTQpIHVuc3RhYmxlOyB1cmdlbmN5PWxvdwoKICAqIE1vdmVkIHNldHRpbmcgb2YgQ0ZMQUdTIHRvIHRoZSBjb3JyZWN0IHBsYWNlIHdoZW4gYnVpbGRpbmcgdGhlIHNwZWNpYWwKICAgIG1pcHMgbm9uLXBpYyBsaWIgKENsb3NlczogIzE1OTc1NyBhZ2FpbikuCgogLS0gWWFubiBEaXJzb24gPGRpcnNvbkBkZWJpYW4ub3JnPiAgU3VuLCAxNSBTZXAgMjAwMiAyMToxOToxOSArMDIwMAoKZTJmc3Byb2dzICgxLjI4LTMpIHVuc3RhYmxlOyB1cmdlbmN5PWxvdwoKICAqIERvbid0IHVzZSBzcGVjaWFsIGNmbGFncyBhdCBjb25maWd1cmUgdGltZSB3aGVuIGJ1aWxkaW5nIHRoZSBzcGVjaWFsCiAgICBtaXBzIG5vbi1waWMgbGliLCBpbiB5ZXQgYW5vdGhlciBhdHRlbXB0IHRvIGZpeCBteSBhZGFwdGF0aW9uIG9mIHRoZQogICAgcGF0Y2ggZnJvbSB0aGUgbWlwcyB0ZWFtLiAgQWxzbyBhZGRlZCAtLWRpc2FibGUtbmxzIHdoaWNoIHdhcyBwcmVzZW50CiAgICBpbiB0aGUgb3JpZ2luYWwgcGF0Y2guICAKICAqIFJlbW92ZSBkZWJpYW4vQlVJTEQtTUlQUyBvbiBjbGVhbi4KICAqIEluc3RhbGwgbWtpbml0cmQgc2NyaXB0IGFzIHNjcmlwdHMvZTJmc3Byb2dzLCBub3QgYXMKICAgIHNjcmlwdHMvZTJmc3Byb2dzLm1raW5pdHJkLgoKIC0tIFlhbm4gRGlyc29uIDxkaXJzb25AZGViaWFuLm9yZz4gIE1vbiwgIDkgU2VwIDIwMDIgMjM6MDE6MzEgKzAyMDAKCmUyZnNwcm9ncyAoMS4yOC0yKSB1bnN0YWJsZTsgdXJnZW5jeT1sb3cKCiAgKiBGaXhlZCBteSBhZGFwYXRpb24gb2YgdGhlIG1pcHMgbm9uLXBpYyBidWlsZCAoQ2xvc2VzOiAjMTU5NzU3KS4KCiAtLSBZYW5uIERpcnNvbiA8ZGlyc29uQGRlYmlhbi5vcmc+ICBGcmksICA2IFNlcCAyMDAyIDAwOjAzOjQ1ICswMjAwCgplMmZzcHJvZ3MgKDEuMjgtMSkgdW5zdGFibGU7IHVyZ2VuY3k9bG93CgogICogTmV3IHVwc3RyZWFtIHJlbGVhc2UuCgogLS0gWWFubiBEaXJzb24gPGRpcnNvbkBkZWJpYW4ub3JnPiAgTW9uLCAgMiBTZXAgMjAwMiAyMzozNDo1NSArMDIwMAoKZTJmc3Byb2dzICgxLjI3KzEuMjgtV0lQLTA4MTctMSkgdW5zdGFibGU7IHVyZ2VuY3k9bG93CgogICogTmV3IHVwc3RyZWFtIHByZS1yZWxlYXNlLiAgQ2xvc2VzOiAjMTM4MDAzLCAjMTQ0NjIxLCAjMTQ1MDQ0LCAjMTUxOTkwLAogICAgIzE1MjAyOSwgIzE1Mjg5MSwgIzE1NTAwNywgIzEzMTM1MCwgIzE0NzI1NiwgIzE1MzEwMi4KICAqIE5ldyBiaW5hcnk6IGZpbmRmcy4KICAqIEFkZGVkIGV4ZWN1dGUgcGVybWlzc2lvbnMgdG8gdGhlIG1raW5pdHJkIHNjcmlwdCAodGhhbmtzIGxpbnRpYW4pLgogICogRG9uJ3Qgc2hpcCBGU0lNIGZvciBFVk1TIGZvciBub3cuCgogLS0gWWFubiBEaXJzb24gPGRpcnNvbkBkZWJpYW4ub3JnPiAgU3VuLCAyNSBBdWcgMjAwMiAxOTozMjoxMiArMDIwMAoKZTJmc3Byb2dzICgxLjI3KzEuMjgtV0lQLTA2MjYtMikgZXhwZXJpbWVudGFsOyB1cmdlbmN5PWxvdwoKICAqIFJlbW92ZSBib2d1cyBzaGxpYnMgZGVwcyBvbiAiZTJmc3Byb2dzICg+PSA8Y3VycmVudD4pIgoKIC0tIFRoZW9kb3JlIFkuIFRzJ28gPHR5dHNvQG1pdC5lZHU+ICBTYXQsIDE3IEF1ZyAyMDAyIDE3OjU5OjE3IC0wNDAwCgplMmZzcHJvZ3MgKDEuMjcrMS4yOC1XSVAtMDYyNi0xKSBleHBlcmltZW50YWw7IHVyZ2VuY3k9bG93CgogICogTmV3IHVwc3RyZWFtIHByZS1yZWxlYXNlOgogICoqIFN1cHBvcnRzIHYyIEFDTCBmb3JtYXQgKENsb3NlczogIzEzODE2MCkuCiAgKiBSZW1vdmVkIGV4cGxpY2l0IC0tbWFuZGlyIGZsYWcsIGFzIGl0IG5vdyB1c2VzIEZIUyBtYW4gbG9jYXRpb24gYnkKICAgIGRlZmF1bHQuCiAgKiBBZGRlZCBta2luaXRyZCBzY3JpcHQsICJ1cHN0cmVhbS1jb250cmlidXRlZCIgOykgYnkgVGVkIFRzJ28gKENsb3NlczoKICAgICMxNDgwNjQpLgogICogQnVpbGQgYSBuby1waWMgdmVyc2lvbiBvZiBsaWJleHQyZnMuYSBvbiBtaXBzIGFuZCBtaXBzZWwsIHBhdGNoIGJ5CiAgICBGbG9yaWFuIExvaG9mZiwgYWRhcHRlZCBmb3Igc3R5bGUgY29uc2lzdGVuY3kgKENsb3NlczogIzE0NTQzMikuCiAgKiBSZW1vdmVkIHByZXN1bWFibHktdXNlbGVzcyBhbmQgcHJlc3VtYWJseS1icm9rZW4gQ0ZMQUdTIHByb3BhZ2F0aW9uLgogICAgSWYgc29tZW9uZSBtaXNzZXMgdGhhdCwgSSdsbCBhZGQgJHtDRkxBR1N9IHRvIC0tY2NvcHRzLgogIAogICogU3dpdGNoZWQgdG8gZGViaGVscGVyIHY0LgogICogQWRkZWQgJHttaXNjOkRlcGVuZHN9IHRvIGFsbCBwYWNrYWdlcycgRGVwZW5kcyBmaWVsZC4KICAKICAqIEZpeGVkIHR5cG9zIGluIGZzY2suOCwgYWRkZWQgYW4gZXhhbXBsZSBmb3IgY2xhcml0eSAoQ2xvc2VzOgogICAgIzE0NTA0NCkuCiAgKiBGaXhlZCB0eXBvIGluIGNoYXR0ciBtYW5wYWdlIChDbG9zZXM6ICMxNDE5MzgpLgogICogRml4ZWQgdHlwbyBpbiB0dW5lMmZzIG1hbnBhZ2UgKENsb3NlczogIzE0ODUxNCkuCgogLS0gWWFubiBEaXJzb24gPGRpcnNvbkBkZWJpYW4ub3JnPiAgVHVlLCAyMyBKdWwgMjAwMiAwMDoxMjozMyArMDIwMAoKZTJmc3Byb2dzICgxLjI3LTIpIHVuc3RhYmxlOyB1cmdlbmN5PW1lZGl1bQoKICAqIFVyZ2VuY3kgbWVkaXVtIHNpbmNlIHRoaXMgZml4ZXMgYSBSQyBidWcuCiAgKiBHZW5lcmF0ZSB0aGUgc2hsaWJzIGZpbGUgaW5zdGVhZCBvZiBqdXN0IGNvcHlpbmcgaXQgaW4gcGxhY2UsIGFuZCBtYWtlCiAgICBpdCBwcm9kdWNlIGRlcHMgb24gImUyZnNwcm9ncyAoPj0gPGN1cnJlbnQ+KSIgYXMgd2VsbCwgdG8gY29wZSB3aXRoCiAgICBuZXcgZnVuY3Rpb25zIGludHJvZHVjZWQgaW4gdGhlIGxpYnMgKENsb3NlczogIzEzOTI3NCkuCiAgKiBBZGRlZCBhIG5vdGUgb24gdGhpcyBpbiBSRUFETUUuRGViaWFuLgoKIC0tIFlhbm4gRGlyc29uIDxkaXJzb25AZGViaWFuLm9yZz4gIFRodSwgMjEgTWFyIDIwMDIgMjM6NTg6NDggKzAxMDAKCmUyZnNwcm9ncyAoMS4yNy0xKSB1bnN0YWJsZTsgdXJnZW5jeT1sb3cKCiAgKiBOZXcgdXBzdHJlYW0gcmVsZWFzZSAoQ2xvc2VzOiAjMTM2NzM3KS4KICAqIE5vIG1vcmUgdXNlIGZvciBkaF9saW5rJ2luZyAqLmV4dFsyM10sIGl0J3Mgbm93IGRvbmUgYnkgdXBzdHJlYW0KICAgIE1ha2VmaWxlcy4KICAqIE9ubHkgaW5jbHVkZSAobmV3KSBpbm9kZV9pby5vIGZyb20gbGliZXh0MmZzIHdoZW4gZmlsZWlvLm8gaXMsIG9yIHRoZQogICAgQkYgYnVpbGQgZmFpbHMgYmVjYXVzZSBvZiB0aGlzIGFkZGl0aW9uYWwgKHVudXNlZCkgbWVtYmVyICh1cHN0cmVhbQogICAgaGludCkuCgogLS0gWWFubiBEaXJzb24gPGRpcnNvbkBkZWJpYW4ub3JnPiAgTW9uLCAxMSBNYXIgMjAwMiAwMDoxNzozMiArMDEwMAoKZTJmc3Byb2dzICgxLjI2LTMpIHVuc3RhYmxlOyB1cmdlbmN5PWxvdwoKICAqIFNpbXBsZSByZWJ1aWxkIGFmdGVyIGZpeGluZyB0aGUgc2V0dGluZ3Mgb2YgbXkgY29tcHV0ZXIncyBjbG9jaywgc28KICAgIHRoYXQga2F0aWUgYWNjZXB0cyB0byBpbnN0YWxsIHRoZSBwYWNrYWdlLgoKIC0tIFlhbm4gRGlyc29uIDxkaXJzb25AZGViaWFuLm9yZz4gIFNhdCwgMjMgRmViIDIwMDIgMTQ6NTM6MTUgKzAxMDAKCmUyZnNwcm9ncyAoMS4yNi0yKSB1bnN0YWJsZTsgdXJnZW5jeT1sb3cKCiAgKiBBcHBsaWVkIHVwc3RyZWFtIHBhdGNoIGRlYWxpbmcgd2l0aCB0aGUgcmxpbWl0IGZpbGVzaXplIHZhcmlhdGlvbgogICAgYW1vbmcgYXJjaHMgYW5kIGtlcm5lbCB2ZXJzaW9ucyAoQ2xvc2VzOiAjMTMzOTA5KS4KICAqIENyZWF0ZSBmc2NrLmV4dDMuOCBzeW1saW5rIChDbG9zZXM6ICMxMjE1MjYpLgoKIC0tIFlhbm4gRGlyc29uIDxkaXJzb25AZGViaWFuLm9yZz4gIFNhdCwgMjMgRmViIDIwMDIgMDY6NDQ6MDIgKzAxMDAKCmUyZnNwcm9ncyAoMS4yNi0xKSB1bnN0YWJsZTsgdXJnZW5jeT1sb3cKCiAgKiBUaGlzIHVwbG9hZHMgZml4ZXMgMTAgYnVncywgaW5jbHVkaW5nIGRhdGEtY29ycnVwdGlvbiBwcm9ibGVtcywgYW5kCiAgICBhZGRzIG11Y2ggdG8gdGhlIGVhc2Ugb2YgbWFpbnRhaW5hbmNlIGFuZCBwcm9ibGVtIHRyYWNraW5nLiAgR29vZAogICAgY2hvaWNlIGZvciB3b29keS4KICAKICAqIE5ldyB1cHN0cmVhbSByZWxlYXNlIChDbG9zZXM6ICMxMDY2MjIsICMxMTY5NzUsICMxMTg0NDMsICMxMTk2MjQsCiAgICAjMTIwMTcxLCAjMTIwMDc3LCAjMTI5ODI4LCAjMTMyNzY0KS4KICAqKiBGaXhlcyBmb3IgZGF0YS1jb3JydXB0aW9uIGJ1Z3Mgbm90IHJlcG9ydGVkIHRvIHRoZSBCVFM6IGUyZnNjawogICAgdHJhc2hlZCBleHRlcm5hbCBqb3VybmFscyBuZWVkaW5nIHRvIGJlIHJlcGxheWVkLCBlMmZzY2sgbm93IGhpZGVzCiAgICB2aXNpYmxlIGpvdXJuYWwgZmlsZXMgKGRhdGEgY29ycnVwdGlvbiBwcm9ibGVtcyB3aGVuIG5vdCBleGNsdWRlZCBmcm9tCiAgICBhIGJhY2t1cCBhbmQgdGhlbiByZXN0b3JlZCkgKENsb3NlczogIzEzMjY1NCkuCiAgKiogT3RoZXIgbm90aWNhYmxlIGJ1Z3MgZml4ZWQgaW5jbHVkZTogZTJmc2NrIG51bGwgcG9pbnRlcgogICAgZGVyZWZlcmVuY2luZywgZnNjayBkaWQgbm90IGZpbmRzIExWTSB2b2x1bWVzIGJ5IFVVSUQgb3IgYnkgbGFiZWwsCiAgICBsYXJnZWZpbGUgc3VwcG9ydCAoaWUuIGRlYWxpbmcgd2l0aCBmaWxlc3lzdGVtcyBpbnNpZGUgMkdCKyBmaWxlcykgd2FzCiAgICBicm9rZW4gaW4gc2V2ZXJhbCBwcm9ncmFtcy4KICAqIFN3aXRjaCB0byBkZWJoZWxwZXIgdjMgdG8gZ2V0IGxkY29uZmlnIGF1dG9tYXRpY2FsbHkgaGFuZGxlZAogICAgKGxpbnRpYW4gcmVwb3J0ZWQgdGhhdCBpdCB3YXMgYnJva2VuKS4gIE5vdyBjYWxsIGRoX21ha2VzaGxpYnMsIGJ1dAogICAgc3RpbGwgb3ZlcnJpZGUgaXRzIGdlbmVyYXRlZCBzaGxpYnMgZmlsZSB3aXRoIG91cnMsIHRvIGdldCBjb21waWxlZAogICAgcGFja2FnZXMgZGVwZW5kIG9mIHRoZSBjb3JyZWN0IHZpcnR1YWwgcGFja2FnZXMsIHdoaWNoIGluY2x1ZGUKICAgIGZ1bGwgc29uYW1lcy4KICAqIFJlbW92ZWQgY2FsbCBkbyBkaF9pbnN0YWxsbWFuIChDbG9zZXM6ICMxMTU1MjYpLgogICogQ2xlYW5lZCB1cCBtYWludGFpbmVyIHNjcmlwdHMgd2l0aCBkZWFkIGNvZGUgLSBtb3N0IHRoaW5ncyBhcmUgbm93CiAgICBtb3JlIHByb3Blcmx5IGhhbmRsZWQgYnkgZGViaGVscGVyLiAgUmVtb3ZlZCBhbiAiZXhpdCAwIiBsdXJraW5nIGluCiAgICBwcmVpbnN0IC0gY2FuJ3QgZmluZCBhIHJlYXNvbiBmb3IgaXQgaW4gdGhlIGNoYW5nZWxvZywgaXQgd2FzIHByb2JhYmx5CiAgICBoZXJlIGZvciBhZ2VzLgogICogUmVtb3ZlIG9ic29sZXRlIG1haW50LXNjcmlwdHMgaW4gYmluYXJ5LWFyY2gsIGFzIHRoZXkgYXJlIHByb3ZpZGVkIGJ5CiAgICB1cHN0cmVhbS4KICAqIEFsc28gcmVtb3ZlIHVwc3RyZWFtLXNoaXBwZWQgY29uZmlnLmNhY2hlIGJlZm9yZSBjb25maWd1cmluZy4gIFRoYXQKICAgIHNob3VsZG4ndCBpbXBhY3QgdXMsIGJ1dCB3ZWxsLCB0aGF0IG1ha2VzIGxpbnRpYW4gaGFwcHkgOikKCiAtLSBZYW5uIERpcnNvbiA8ZGlyc29uQGRlYmlhbi5vcmc+ICBGcmksICA4IEZlYiAyMDAyIDA2OjEyOjM1ICswMTAwCgplMmZzcHJvZ3MgKDEuMjUtMSkgdW5zdGFibGU7IHVyZ2VuY3k9aGlnaAoKICAqIE5ldyB1cHN0cmVhbSBidWdmaXggcmVsZWFzZSAoQ2xvc2VzOiAjMTEyNDE0KSwgdGFyZ2V0ZWQgdG8gd29vZHkuCiAgKiBjb21fZXJyLmluZm8gcHJvdmlkZWQgYWdhaW4gbm93IHRoYXQgaXQgd2FzIGZpeGVkIHVwc3RyZWFtLgogICogQWRkZWQgbWV0YWluZm8gdG8gY29tX2Vyci50ZXhpbmZvIHNvIHRoYXQgaXQgZ2V0cyBpbmRleGVkIGNvcnJlY3RseQogICAgKHRoYW5rcyBsaW50aWFuKS4gIE1vdmVkIEBzZXRmaWxlbmFtZSBhbmQgQHNldHRpdGxlIHRvIHRoZSB0b3Agc28gdGhhdAogICAgdGhpbmdzIGdldCBvdXRwdXQgYXMgZXhwZWN0ZWQuCiAgKiBBZGRlZCBsaW50aWFuIG92ZXJyaWRlcyBmb3IgLWJmIGFuZCAtc3RhdGljIHBhY2thZ2VzLgogICogUHV0IGFsbCBzdGFtcCBmaWxlcyBpbiBkZWJpYW4vc3RhbXBkaXIuCgogLS0gWWFubiBEaXJzb24gPGRpcnNvbkBkZWJpYW4ub3JnPiAgU2F0LCAyMiBTZXAgMjAwMSAxNjoyMjo0NyArMDIwMAoKZTJmc3Byb2dzICgxLjI0YS0xKSB1bnN0YWJsZTsgdXJnZW5jeT1oaWdoCgogICogTmV3IHVwc3RyZWFtIHJlbGVhc2UgKENsb3NlczogIzEwOTU3NykuCiAgKiogVGhlIG9ubHkgbmV3IGNvZGUgaW4gdGhlcmUgaXMgaW4gY29kZXBhdGhzIHRoYXQKICAgIGFyZSBvbmx5IHZpc2l0ZWQgd2hlbiBwcmV2aW91c2x5IHVuc3VwcG9ydGVkIGZlYXR1cmVzIGFyZSB1c2VkLCBzbwogICAgdGhleSBhZGQgdmlydHVhbGx5IG5vIHJpc2suICBTdXBwb3J0IGZvciByYXcgaW1hZ2UgZmlsZXMgd2lsbCBiZSBvZgogICAgZ3JlYXQgaGVscCB0byBkZWJ1ZyB1c2VycycgcHJvYmxlbXMuICBVcmdlbmN5IHNldCB0byAiaGlnaCIgdG8gbWFrZQogICAgc3VyZSB0aGlzIHZlcnNpb24gZ2V0cyByZWxlYXNlZCB3aXRoIHdvb2R5LgogIAogICoqIEZzY2sgcHJpbnRzIGEgd2FybmluZyBtZXNzYWdlIGlmIG5vdyB2YWxpZCBmaWxlc3lzdGVtcyBhcmUgcGFzc2VkIHRvCiAgICBpdC4gKENsb3NlczogIzEwNzQ1OCkuCiAgKiogRnNjayAtQSB3aWxsIG5vdCB0cnkgdG8gaW50ZXJwcmV0IGRldmljZSBuYW1lcyBmb3IgZmlsZXN5c3RlbXMgd2hpY2gKICAgIGhhdmUgYSBwYXNzIG51bWJlciBpcyAwLiAoQ2xvc2VzOiAjMTA2Njk2KS4KICAqKiBJZiAtTyBub25lIGlzIHBhc3NlZCB0byBta2UyZnMsIGl0IHdpbGwgbm93IG5vdCBzZXQgdGhlIHNwYXJzZV9zdXBlcgogICAgZmVhdHVyZSAoQ2xvc2VzOiAjMTA4MTY1KS4KICAqKiBUdW5lMmZzIGhhcyBiZWVuIGZpeGVkIHRvIG1ha2Ugc3VyZSB0aGF0IG9ubHkgZXJyb3IgbWVzc2FnZXMgZ28gdG8KICAgIHN0ZGVyciwgYW5kIG5vcm1hbCBtZXNzYWdlIGdvIHRvIHN0ZG91dCAoQ2xvc2VzOiAjMTA4NTU1KS4KICAqKiBNaW5vciBtYW4gcGFnZXMgdXBkYXRlcyAoQ2xvc2VzOiAjMzA4MzMsICMxMDgxNzQpLgogICoqIERvYyBmaXhlcyAoQ2xvc2VzOiAjMTEwNjIxKS4KCiAtLSBZYW5uIERpcnNvbiA8ZGlyc29uQGRlYmlhbi5vcmc+ICBUdWUsICA0IFNlcCAyMDAxIDIzOjQ0OjU2ICswMjAwCgplMmZzcHJvZ3MgKDEuMjItMikgdW5zdGFibGU7IHVyZ2VuY3k9bWVkaXVtCgogICogVGhpcyBpcyBvbmx5IGEgdHJpdmlhbCBwYXRjaCB0byBzdG9wIHNvbWUgdXNlciBjb25mdXNpb24sIGFuZCB3b3VsZCBiZQogICAgZ3JlYXQgdG8gaGF2ZSBpbiB3b29keSwgaGVuY2UgdGhlIHVyZ2VuY3kuCiAgKiBBcHBsaWVkIHVwc3RyZWFtIHBhdGNoIHRvIGUyZnNjayB0byB3YXJuIHVzZXIgd2hlbiBzb21lIGVycm9ycyB3ZXJlCiAgICBub3QgY29ycmVjdGVkIGR1ZSB0byB1c2VyIGFuc3dlcmluZyAibm8iIChDbG9zZXM6ICMxMDQ1MDIpLgoKIC0tIFlhbm4gRGlyc29uIDxkaXJzb25AZGViaWFuLm9yZz4gIFNhdCwgMjggSnVsIDIwMDEgMjM6MDE6NDkgKzAyMDAKCmUyZnNwcm9ncyAoMS4yMi0xKSB1bnN0YWJsZTsgdXJnZW5jeT1sb3cKCiAgKiBGaW5hbCAxLjIyIHJlbGVhc2U6CiAgKiogRml4ZXMgYnVpbGQgcHJvYmxlbXMgb24gYmlnLWVuZGlhbiAoQ2xvc2VzOiAjMTAxNjg2LCAjMTAxNzk4KS4KCiAtLSBZYW5uIERpcnNvbiA8ZGlyc29uQGRlYmlhbi5vcmc+ICBTYXQsIDIzIEp1biAyMDAxIDE0OjAzOjE3ICswMjAwCgplMmZzcHJvZ3MgKDEuMjErMS4yMi1XSVAtMDYyMC0xKSB1bnN0YWJsZTsgdXJnZW5jeT1sb3cKCiAgKiBOZXcgdXBzdHJlYW0gcHJlLXJlbGVhc2UsIGNyaXRpY2FsIGZvciBiaWctZW5kaWFuIHBsYXRmb3JtcyAKICAgIChDbG9zZXM6ICMxMDE3NTIpLgogICogUmUtYXBwbGllZCBodXJkIGZpeCBhZ2Fpbi4KICAqIEJ1aWxkIGUyZnNwcm9ncy1iZiB3aXRoIC1PcyB0byBnYWluIG1vcmUgc3BhY2UuCgogLS0gWWFubiBEaXJzb24gPGRpcnNvbkBkZWJpYW4ub3JnPiAgRnJpLCAyMiBKdW4gMjAwMSAwMDoxODo0MCArMDIwMAoKZTJmc3Byb2dzICgxLjIxLTEpIHVuc3RhYmxlOyB1cmdlbmN5PWxvdwoKICAqIEZpbmFsIDEuMjEgcmVsZWFzZS4KICAqIFJlLWFwcGxpZWQgaHVyZCBmaXggdGhhdCBkaWQgbm90IGNhbWUgcXVpY2tseSBlbm91Z2ggdG8gbWFrZSBpdCBpbgogICAgMS4yMS4KICAqIEZpeGVkIG5hbWUgb2YgY29weXJpZ2h0IGZpbGUgaW4gZTJmc3Byb2dzLWJmLgoKIC0tIFlhbm4gRGlyc29uIDxkaXJzb25AZGViaWFuLm9yZz4gIFdlZCwgMjAgSnVuIDIwMDEgMjI6MzI6MDggKzAyMDAKCmUyZnNwcm9ncyAoMS4yMCsxLjIxLVdJUC0wNjE0LTIpIHVuc3RhYmxlOyB1cmdlbmN5PWxvdwoKICAqIERvbid0IGJ1aWxkIFBJQyBsaWJzLCBidWlsZCBhIHJlZHVjZWQgdmVyc2lvbiBvZiB0aGUgbGlicyBpbnN0ZWFkLCBpbgogICAgcGFja2FnZSBlMmZzcHJvZ3MtYmYuICBNYWRlIHRoaXMgbmV3IHBhY2thZ2UgY29uZmxpY3Qgd2l0aCBlMmZzcHJvZ3MuCiAgKiBDb21waWxhdGlvbiBmaXggZm9yIHRoZSBIdXJkIChDbG9zZXM6ICMxMDEzNjEpLgoKIC0tIFlhbm4gRGlyc29uIDxkaXJzb25AZGViaWFuLm9yZz4gIFR1ZSwgMTkgSnVuIDIwMDEgMjM6MzM6MjUgKzAyMDAKCmUyZnNwcm9ncyAoMS4yMCsxLjIxLVdJUC0wNjE0LTEpIHVuc3RhYmxlOyB1cmdlbmN5PWxvdwoKICAqIE5ldyB1cHN0cmVhbSBwcmUtcmVsZWFzZSAoQ2xvc2VzOiAjMTAwNTU5LCAjMTAwMzA0KS4KICAqIEZpeGVkIGxpYi9leHQyZnMvTWFrZWZpbGUuaW4gZm9yIGluc3RhbGxhdGlvbiBvZiBuZXcgZ2VuZXJhdGVkIC5oCiAgICBmaWxlLgoKIC0tIFlhbm4gRGlyc29uIDxkaXJzb25AZGViaWFuLm9yZz4gIFRodSwgMTQgSnVuIDIwMDEgMTY6MTQ6MTEgKzAyMDAKCmUyZnNwcm9ncyAoMS4yMCsxLjIxLVdJUC0wNjA4LTEpIHVuc3RhYmxlOyB1cmdlbmN5PWxvdwoKICAqIE5ldyB1cHN0cmVhbSBwcmUtcmVsZWFzZSAoY3JpdGljYWwgZXh0MyBidWdmaXggbW9zdGx5KS4KICAqIENvcnJlY3RseSB1c2UgZGhfaW5zdGFsbGluZm8uCiAgKiBBZGp1c3RlZCB2YXJpb3VzIHRoaW5ncyBhY2NvcmRpbmdseS4KCiAtLSBZYW5uIERpcnNvbiA8ZGlyc29uQGRlYmlhbi5vcmc+ICBTYXQsICA5IEp1biAyMDAxIDAwOjI1OjUxICswMjAwCgplMmZzcHJvZ3MgKDEuMjAtNCkgdW5zdGFibGU7IHVyZ2VuY3k9bG93CgogICogQ2xlYW51cCBnZW5lcmF0ZWQgc3Vic3R2YXJzIGZpbGVzIG5vdyB0aGF0IGRlYmhlbHBlciB1c2VzIG90aGVyCiAgICBuYW1lcyAobWF5IGNhdXNlIHByb2JsZW1zIG9uIG90aGVyIGFyY2hzKS4gIEJ1aWxkLWRlcCBvbiBkZWJoZWxwZXIKICAgIDMuMC4zMCBvciBuZXdlciB0byBiZSBzdXJlIGl0IHdvbid0IGNhdXNlIGJyb2tlbiB1cGxvYWRzLiAgQWxsb3dzIHRvCiAgICBnZXQgcmlkIG9mIGhhaXJ5IGRlcCwgYnV0IGNhbm5vdCBidWlsZCBzdHJhaWdodGZvcndhcmRseSBvbiBwb3RhdG8gYW55CiAgICBtb3JlLi4uCgogLS0gWWFubiBEaXJzb24gPGRpcnNvbkBkZWJpYW4ub3JnPiAgV2VkLCAgNiBKdW4gMjAwMSAwMjozMzozMiArMDIwMAoKZTJmc3Byb2dzICgxLjIwLTMpIHVuc3RhYmxlOyB1cmdlbmN5PWxvdwoKICAqIENyZWF0ZSBhbGwgc3ltbGlua3MgdG8gdXVpZC1nZW5lcmF0ZS4zIChDbG9zZXM6ICM5OTU3MykuCiAgKiBTb21ld2hhdCBtb2Rlcm5pemVkIGRlYmlhbi9ydWxlcyAoZGViaGVscGVyIHYyLCBldGMuKS4KICAqIEZpeGVkIGxpYnNzMiBjb3B5cmlnaHQgZmlsZS4KICAqIEZpeGVkIGUyZnNsaWJzLXBpYyBzaG9ydCBkZXNjcmlwdGlvbi4KCiAtLSBZYW5uIERpcnNvbiA8ZGlyc29uQGRlYmlhbi5vcmc+ICBXZWQsICA2IEp1biAyMDAxIDAxOjE5OjE5ICswMjAwCgplMmZzcHJvZ3MgKDEuMjAtMikgdW5zdGFibGU7IHVyZ2VuY3k9bG93CgogICogQWRkZWQgc3VwcG9ydCBmb3IgYnVpbGRpbmcgcGljIGxpYnMgdG8gTWFrZWZpbGUuZWxmLWxpYi4KICAqIE5ldyBwYWNrYWdlIGUyZnNsaWJzLXBpYyBmb3IgYm9vdC1mbG9wcGllcyB0ZWFtIChDbG9zZXM6ICM5OTI4NSkuCiAgKiBVc2UgLU4gb24gZGhfZ2VuY29udHJvbCBpbnN0ZWFkIG9mIGxvdHMgb2YgLXAuCgogLS0gWWFubiBEaXJzb24gPGRpcnNvbkBkZWJpYW4ub3JnPiAgVGh1LCAzMSBNYXkgMjAwMSAyMzo1OTo1MSArMDIwMAoKZTJmc3Byb2dzICgxLjIwLTEpIHVuc3RhYmxlOyB1cmdlbmN5PWxvdwoKICAqIEZpbmFsIDEuMjAgcmVsZWFzZS4KICAqIEFkZGVkIG5ldyB6c2gtc3RhdGljIHRvIHRoZSBsaXN0IG9mIHBvc3NpYmxlIHN0YXRpYyBzaGVsbHMgcmVjb21tZW5kZWQKICAgIGJ5IGUyZnNjay1zdGF0aWMuCgogLS0gWWFubiBEaXJzb24gPGRpcnNvbkBkZWJpYW4ub3JnPiAgTW9uLCAyOCBNYXkgMjAwMSAyMTozOTowNiArMDIwMAoKZTJmc3Byb2dzICgxLjE5KzEuMjAtV0lQLTA1MjAtMSkgdW5zdGFibGU7IHVyZ2VuY3k9bG93CgogICogTmV3IHVwc3RyZWFtIHByZS1yZWxlYXNlIHNuYXBzaG90OgogICoqIEV4dGVuZGVkICJmc2NrIC10IiBzeW50YXggKENsb3NlczogIzg5NDgzKS4KICAqKiBGaXggaGFuZGxpbmcgb2YgZGV2aWNlcyBmb3Igd2hpY2ggZnNjayBjYW4ndCBkZXRlcm1pbmUgYSBwaHlzaWNhbAogICAgc3BpbmRhbCwgY2F1c2luZyBsb2NrdXAgd2hlbiBjaGVja2luZyBMVk0gdm9sdW1lcyAoQ2xvc2VzOiAjOTgxMDMpLgogICoqIEZpeGVkIHR5cG8gaW4gZTJmc2NrLXN0YXRpYyBkZXNjcmlwdGlvbiAtIHRoYW5rcyBUZWQgOikuCiAgKiBGaXhlZCBzbWFsbCBjb21waWxhdGlvbiBidWcgaW4gZnNjay5jCgogLS0gWWFubiBEaXJzb24gPGRpcnNvbkBkZWJpYW4ub3JnPiAgTW9uLCAyMSBNYXkgMjAwMSAyMDo0NzoxMCArMDIwMAoKZTJmc3Byb2dzICgxLjE5KzEuMjAtV0lQLTA1MTQtMikgdW5zdGFibGU7IHVyZ2VuY3k9bG93CgogICogVGlnaHRlbiBkZXBlbmRlbmN5IG9uIGRlYmhlbHBlci4KCiAtLSBZYW5uIERpcnNvbiA8ZGlyc29uQGRlYmlhbi5vcmc+ICBUdWUsIDE1IE1heSAyMDAxIDIxOjM4OjQ3ICswMjAwCgplMmZzcHJvZ3MgKDEuMTkrMS4yMC1XSVAtMDUxNC0xKSB1bnN0YWJsZTsgdXJnZW5jeT1sb3cKCiAgKiBOZXcgdXBzdHJlYW0gcHJlLXJlbGVhc2Ugc25hcHNob3Q6CiAgKiogbmV3IHByb2dyYW06IGUyaW1hZ2UuCiAgKiogZTJmc2NrIHZhbGlkYXRlcyBmaWxlIGRlc2NyaXB0b3Igc3BlY2lmaWVkIGluIC1DIChDbG9zZXM6ICM1NTIyMCkKICAqKiBGaXggbXVsdGlwbGUgcHJvZ3Jlc3MgYmFyIGZzY2sgYnVnIChDbG9zZXM6ICM2NTI2NykKICAqKiBBZGQgZGV2ZnMgc3VwcG9ydCB0byBmc2NrIChDbG9zZXM6ICM5NDE1OSkKICAqKiBGaXggZGVidWdmcyBkdW1wIGNtZCBsb29waW5nIG9uIGRpc2sgZXJyb3JzIChDbG9zZXM6ICM3OTE2MykKICAqKiBNaXNjZWxsYW5lb3VzIG1hbnVhbCBwYWdlIGNsYXJpZmljYXRpb25zIChDbG9zZXM6ICM2MzQ0MiwgIzY3NDQ2LAogICAgIzg3MjE2KQogICoqIENvbXBpbGF0aW9uIGZpeGVzIGZvciBIdXJkIChDbG9zZXM6ICM1MjA0NSkuCiAgKiogTmV3IGNvbmZpZy57Z3Vlc3Msc3VifSBmb3IgcGFyaXNjIHN1cHBvcnQgKENsb3NlczogIzk0NjkwKS4KICAqKiBJbXByb3ZlZCBleHQzIHN1cHBvcnQKICAqKiB0dW5lMmZzIGNhbiBub3cgc2FmZWx5IG1vZGlmeSBtb3VudGVkIGZpbGVzeXN0ZW1zCiAgKiBBZGRlZCBtaXNzaW5nIEBkaXJjYXRlZ29yeSBlbnRyeSB0byBsaWJleHQyZnMuaW5mbyAobGludGlhbikKICAqIE1vdmVkIGRlYnVnZnMgYmFjayBmcm9tIC91c3Ivc2Jpbi8gdG8gL3NiaW4vIChDbG9zZXM6ICM5NzAzNSkuCiAgKiBNb3ZlZCBlMmxhYmVsIGJhY2sgdG8gL3NiaW4vIGFzIHdlbGwsIGFzIGl0IGlzIG5vdyBhIGhhcmQgbGluayB0bwogICAgdHVuZTJmcy4KICAqIE5ldyBiaW5hcnkgcGFja2FnZSB3aXRoIHN0YXRpY2FsbHkgbGlua2VkIGUyZnNjaywgcmVjb21tZW5kaW5nIGEKICAgIHN0YXRpY2FsbHkgbGlua2VkIHNoZWxsIChDbG9zZXM6ICM2MjYxMSkuCiAgKiBBbGwgZGVwcyBhZ2FpbnN0IGUyZnNwcm9ncyBpdHNlbGYgbm93IHZlcnNpb25uZWQgKGxpbnRpYW4pLgogICogVXBkYXRlZCBjb3B5cmlnaHQgZmlsZSAodXBzdHJlYW0gbG9jYXRpb24sIHBhY2thZ2luZyBjb3B5cmlnaHQgbm90aWNlCiAgICBmb3IgcHJldmlvdXMgbWFpbnRhaW5lcnMgYW5kIGZvciBBbGNvdmUpLgogICogUmVtb3ZlIGNhbGwgdG8gZGhfdGVzdHZlcnNpb24sIHVzZSB2ZXJzaW9ubmVkIGJ1aWxkLWRlcCBpbnN0ZWFkCiAgICAobGludGlhbikuCiAgKiBTdXBwb3J0IGZvciBERUJfQlVJTERfT1BUSU9OUyBkZWJ1Zy9ub3N0cmlwIGZvciBwb2xpY3kgMy4yCiAgICBjb21wbGlhbmNlLgogICogVXNlIGRoX3NobGliZGVwcyAtbCBpbnN0ZWFkIG9mIHNldHRpbmcgTERfTElCUkFSWV9QQVRIIGV4cGxpY2l0ZWx5IC0KICAgIG5lY2Vzc2FyeSBmb3IgbmV3IHZlcnNpb25zIG9mIGZha2Vyb290LCBhbmQgcmVxdWlyZXMgZGViaGVscGVyIDMuMC4yMwogICAgZm9yIGEgZml4LiAgV2VsbCBmaW5hbGx5IDMuMC4yMyBpcyBidWdneSwgbGVhdmUgdGhpcyBmb3IgbGF0ZXIuCiAgKiBBdm9pZCB0byBjYWxsIGxkY29uZmlnIGF0ICJtYWtlIGluc3RhbGwiIHRpbWUsIHRvbyBjb3N0bHkuCiAgKiBHZXQgcmlkIGluIGNvbnRyb2wgZmlsZXMgb2YgcmVmZXJlbmNlcyB0byBuZXZlci1yZWxlYXNlZCBzdGFuZGFsb25lCiAgICBsaWIgZmlsZXMgKHNwbGl0IGF0dGVtcHRlZCBpbiAxOTk3Lzk4KS4gIAogICogQnVtcGVkIFN0YW5kYXJkcy1WZXJzaW9uIHRvIDMuNS40LgoKIC0tIFlhbm4gRGlyc29uIDxkaXJzb25AZGViaWFuLm9yZz4gIFR1ZSwgMTUgTWF5IDIwMDEgMTQ6Mjg6MzkgKzAyMDAKCmUyZnNwcm9ncyAoMS4xOS00KSB1bnN0YWJsZTsgdXJnZW5jeT1tZWRpdW0KCiAgKiBBZGRlZCB0ZXhpbmZvIHRvIGJ1aWxkLWRlcHMgKENsb3NlczogIzg3Njg1KS4KCiAtLSBZYW5uIERpcnNvbiA8ZGlyc29uQGRlYmlhbi5vcmc+ICBUdWUsICAzIEFwciAyMDAxIDA5OjAzOjEzICswMjAwCgplMmZzcHJvZ3MgKDEuMTktMykgdW5zdGFibGU7IHVyZ2VuY3k9bG93CgogICogRHJvcCBmaW5kc3VwZXIgYmluYXJ5LCBhbmQgc3VnZ2VzdCBncGFydCAoQ2xvc2VzOiAjNzQwMzQpLgogICogRHJvcCBmbHVzaGIgYW5kIGV4dGVuZCBhdCB1cHN0cmVhbSByZXF1ZXN0IChDbG9zZXM6ICMzOTUwNikuCiAgKiBBcHBsaWVkIHVwc3RyZWFtIGZpeCBmb3IgY2hhdHRyIG9uIGxhcmdlIGZpbGVzIChDbG9zZXM6ICM3MjY5MCkuCiAgKiBBcHBsaWVkIGNsYXJpZmljYXRpb24gcGF0Y2ggdG8gdHVuZTJmcy44IChDbG9zZXM6ICM2NzQ0NikuCiAgKiBBcHBsaWVkIHR5cG8gcGF0Y2ggdG8gY29tcGlsZV9ldC4xIChDbG9zZXM6ICM2Mzc4NikuCiAgKiBJbmNsdWRlIDxzeXMvbW91bnQuaD4gaW4gZTJmc2NrL2pvdXJuYWwuYyAoQ2xvc2VzOiAjNzE3NzUpLgogICogU3VnZ2VzdCBwYXJ0ZWQuCgogLS0gWWFubiBEaXJzb24gPGRpcnNvbkBkZWJpYW4ub3JnPiAgTW9uLCAgNCBEZWMgMjAwMCAyMjowODowNiArMDEwMAoKZTJmc3Byb2dzICgxLjE5LTIpIHVuc3RhYmxlOyB1cmdlbmN5PWxvdwoKICAqIENsYXJpZmllZCBsaWJ1dWlkIGNvcHlyaWdodCB0byBMR1BMLTIsIGV4Y2x1ZGluZyBMR1BMLTIuMS4KICAqIEFkZGVkIGJ1aWxkLWRlcGVuZGVuY3kgb24gZGViaGVscGVyIChDbG9zZXM6ICM2NzUzMikuCiAgKiBEb24ndCBwYXJhbGVsaXplIGZzY2sgcnVucyBvbiBzYW1lIGRyaXZlIGZvciBoZFtlZmdoXSAoQ2xvc2VzOgogICAgIzU5MTAzKS4KICAqIFVwbG9hZCBwcmlzdGluZSBzb3VyY2UsIC0xIHdhcyBlcnJvbmVvdXNseSB1cGxvYWRlZCBhcyBhCiAgICBkZWJpYW4tc3BlY2lmaWMgcGFja2FnZS4KCiAtLSBZYW5uIERpcnNvbiA8ZGlyc29uQGRlYmlhbi5vcmc+ICBUaHUsICAzIEF1ZyAyMDAwIDAwOjMwOjQ5ICswMjAwCgplMmZzcHJvZ3MgKDEuMTktMSkgdW5zdGFibGU7IHVyZ2VuY3k9bG93CgogICogTmV3IHVwc3RyZWFtIHJlbGVhc2U6CiAgKiogbmV3IHByb2dyYW06IHJlc2l6ZTJmcy4KICAqKiBleHQzIHN1cHBvcnQuCiAgKiogTkxTIHN1cHBvcnQgKG5vbi1kZWZhdWx0LCBhY3RpdmF0ZWQpLgogICoqIENvbXByZXNzaW9uIHN1cHBvcnQgKG5vbi1kZWZhdWx0LCBhY3RpdmF0ZWQpLgogICoqIFByb2dyZXNzIGJhciBuaWNlIHRvIHNlcmlhbCBjb25zb2xlIChDbG9zZXM6ICM2NjA3OSkKICAqKiBFbnN1cmUgZmlsZXR5cGUgZmVhdHVyZSBpcyB0dXJuZWQgb2ZmIGZvciBIdXJkIGZpbGVzeXN0ZW1zIChDbG9zZXM6CiAgICAjNjE4NjMpCiAgKiBVcGRhdGVkIG1haW4gY29weXJpZ2h0IGZpbGUgZm9yIGEgbnVtYmVyIG9mIHRoaW5ncy4KICAqIEZpeGVkIE5MUyBzdXBwb3J0IGZvciBmbHVzaGIgYW5kIGV4dGVuZC4KICAqIFN0YXJ0ZWQgdG8gYWRkIGJ1aWxkLWRlcGVuZHMuCiAgKiBJbmNsdWRlIG5ldyBlMnAgaGVhZGVyLgoKIC0tIFlhbm4gRGlyc29uIDxkaXJzb25AZGViaWFuLm9yZz4gIFdlZCwgMTkgSnVsIDIwMDAgMDE6NTU6MjcgKzAyMDAKCmUyZnNwcm9ncyAoMS4xOC0zKSBmcm96ZW4gdW5zdGFibGU7IHVyZ2VuY3k9bWVkaXVtCgogICogRml4IFkySyBkaXNwbGF5LW9ubHkgYnVnIGluIGRlYnVnZnMgLSAibHMgLWwiIGRpc3BsYXllZCByYXcgdG1feWVhciwKICAgIGNhdXNpbmcgMjAwMCB0byBiZSBkaXNwbGF5ZWQgYXMgIjEwMCIgKENsb3NlczogIzU3MTM1KS4gIFBvdGF0byBzaG91bGQKICAgIGJlIHkyay1jbGVhbi4KICAqIFJlbW92ZSBlbXB0eSBkaXJzIC91c3Ivc2hhcmUvZXQvIGFuZCAvdXNyL3NoYXJlL3NzLyBmcm9tIHBhY2thZ2UKICAgIGUyZnNwcm9ncyAoQ2xvc2VzOiAjNTI5MDApLgoKIC0tIFlhbm4gRGlyc29uIDxkaXJzb25AZGViaWFuLm9yZz4gIE1vbiwgMjEgRmViIDIwMDAgMjM6MDY6NDcgKzAxMDAKCmUyZnNwcm9ncyAoMS4xOC0yKSB1bnN0YWJsZTsgdXJnZW5jeT1sb3cKCiAgKiBUZXN0IGZvciAiX19zcGFyY19fIiBpbnN0ZWFkIG9mICJzcGFyYyIgYXMgYSBjcHAgbWFjcm8gaW4gbWtlMmZzLmMKICAgICh0ZXN0cyBpbiBvdGhlciBwbGFjZXMgYXJlIGNvcnJlY3QpIChDbG9zZXM6ICM1MDAxMikuCgogLS0gWWFubiBEaXJzb24gPGRpcnNvbkBkZWJpYW4ub3JnPiAgRnJpLCAxMiBOb3YgMTk5OSAyMTo0MDoyNyArMDEwMAoKZTJmc3Byb2dzICgxLjE4LTEpIHVuc3RhYmxlOyB1cmdlbmN5PWxvdwoKICAqIE5ldyB1cHN0cmVhbSAoYnVnZml4KSByZWxlYXNlLgoKIC0tIFlhbm4gRGlyc29uIDxkaXJzb25AZGViaWFuLm9yZz4gIEZyaSwgMTIgTm92IDE5OTkgMTc6Mjc6MjAgKzAxMDAKCmUyZnNwcm9ncyAoMS4xNy0yKSB1bnN0YWJsZTsgdXJnZW5jeT1sb3cKCiAgKiBBcHBsaWVkIHVwc3RyZWFtIHBhdGNoIHRvIGZpeCBzZWdmYXVsdCAoQ2xvc2VzOiAjNDk1MzUpLgoKIC0tIFlhbm4gRGlyc29uIDxkaXJzb25AZGViaWFuLm9yZz4gIFR1ZSwgIDkgTm92IDE5OTkgMjI6MTQ6NTMgKzAxMDAKCmUyZnNwcm9ncyAoMS4xNy0xKSB1bnN0YWJsZTsgdXJnZW5jeT1sb3cKCiAgKiBOZXcgdXBzdHJlYW0gKGJ1Z2ZpeCkgcmVsZWFzZS4KCiAtLSBZYW5uIERpcnNvbiA8ZGlyc29uQGRlYmlhbi5vcmc+ICBXZWQsIDI3IE9jdCAxOTk5IDIzOjQ2OjM5ICswMjAwCgplMmZzcHJvZ3MgKDEuMTYtMikgdW5zdGFibGU7IHVyZ2VuY3k9bG93CgogICogRml4ZWQgYnVpbGQgb2YgYSBsaW5rIGxpc3QgaW4gZnNjay5jIChDbG9zZXM6ICM0ODMxMikuCgogLS0gWWFubiBEaXJzb24gPGRpcnNvbkBkZWJpYW4ub3JnPiAgVHVlLCAyNiBPY3QgMTk5OSAwMToxNzozNiArMDIwMAoKZTJmc3Byb2dzICgxLjE2LTEpIHVuc3RhYmxlOyB1cmdlbmN5PWxvdwoKICAqIE5ldyB1cHN0cmVhbSByZWxlYXNlLgogICogUmUtYXBwbGllZCBIdXJkIHBhdGNoZXMgdGhhdCBkaWQgbm90IHNlZW0gdG8gaGF2ZSBiZWVuIHJlY2VpdmVkCiAgICB1cHN0cmVhbS4KCiAtLSBZYW5uIERpcnNvbiA8ZGlyc29uQGRlYmlhbi5vcmc+ICBTdW4sIDI0IE9jdCAxOTk5IDE2OjExOjU5ICswMjAwCgplMmZzcHJvZ3MgKDEuMTUtMykgdW5zdGFibGU7IHVyZ2VuY3k9bG93CgogICogRml4ZWQgbWlub3IgdHlwbyBmb3IgdGhlIEh1cmQuCiAgKiBGaXhlZCB2YXJpb3VzIEh1cmQgZGVmaW5lcyB0byBfX0dOVV9fIChDbG9zZXM6ICM0NDQwNykuCiAgKiBTd2l0Y2hlZCBkb2MvIGFuZCBpbmZvLyB0byBGSFMuCiAgKiBDbGVhbmVkIHVwIGRlYmlhbi9ydWxlcyB0byB1c2UgbmV3IGRlYmhlbHBlciBmZWF0dXJlcy4KICAqIEJvdW5jZWQgU3RhbmRhcmRzLVZlcnNpb24gdG8gMy4wLjEuCiAgKiBEbyBub3QgaW5zdGFsbCBidWdneSBjb21fZXJyLmluZm8sIHNoaXBwZWQgYXMgSFRNTC4KICAqIFJlbW92ZWQgcGFydGluZm8gZnJvbSB0aGUgcGFja2FnZSwgZm9sbG93aW5nIHRoZSB3aXNoIG9mIHVwc3RyZWFtCiAgICBhdXRob3IsIGJlY2F1c2Ugb2YgZHVwbGljYXRlIGZ1bmN0aW9uYWxpdHkgd2l0aCAiZmRpc2sgLWwiIChDbG9zZXM6CiAgICAjNDIxMzkpLgoKIC0tIFlhbm4gRGlyc29uIDxkaXJzb25AZGViaWFuLm9yZz4gIE1vbiwgMjAgU2VwIDE5OTkgMjM6MDQ6MDYgKzAyMDAKCmUyZnNwcm9ncyAoMS4xNS0yKSB1bnN0YWJsZTsgdXJnZW5jeT1tZWRpdW0KCiAgKiBDaGFuZ2VkIGJ1aWxkIGRpcmVjdG9yeSBkbyBkZWJpYW4vQlVJTEQvIC0gcmVsYXRlZCBjbGVhbnVwcyBpbgogICAgZGViaWFuL3J1bGVzLgogICogRml4ZWQgcGFydGluZm8uYyB0byBoYXZlIGl0IGNvbXBpbGVkLCBhbmQgZml4ZWQgZGlzcGxheSBvZiBwYXJ0aXRpb24KICAgIGRldmljZSBpbiBlcnJvciBtZXNzYWdlcy4KICAqIEFkZGVkIC91c3Ivc2Jpbi9wYXJ0aW5mbyB0byB0aGUgcGFja2FnZSAoQ2xvc2VzOiAjNDIxMzkpLgogICogQWRkZWQgbm90ZSBhYm91dCB1dWlkZ2VuKDEpIGluIFJFQURNRS5EZWJpYW4uCiAgKiBEb2N1bWVudGVkIGluIG1hbnBhZ2UgdGhhdCBkZWZhdWx0IG1rZTJmcyBiZWhhdmlvdXIgaXMgbm93IC1yMSAtczEKICAgIChDbG9zZXM6ICM0NDQ3OCkuCiAgKiBEb2N1bWVudGVkIGluIG1rZTJmcy44IHRoYXQgLXIxIGZvcmNlcyAtczEsIHRodXMgaWdub3JpbmcgLXMwLgogICogQWRkZWQgd2FybmluZyBtZXNzYWdlIHdoZW4gLXMwIGlzIGlnbm9yZWQgYmVjYXVzZSBvZiAtcjEuCiAgKiBEb2N1bWVudGVkIC1uIG9wdGlvbiBvZiBta2UyZnMuCiAgKiBGaXhlZCBkaXNwbGF5IGJ1Z2xldCBjYXVzaW5nIHRyYWlsaW5nIGNvbW1hcyBpbiBsaXN0IG9mIHN1cGVyYmxvY2sKICAgIGJhY2t1cHMgd2hlbiBzcGFyc2UgZmxhZyBpcyBvbiBhbmQgbGFzdCBncm91cCBoYXMgbm8gc3VwZXJibG9jawogICAgYmFja3VwLgogICogQ2xvc2VzOiAjNDI0MzQsICM0MzEzNC4KCiAtLSBZYW5uIERpcnNvbiA8ZGlyc29uQGRlYmlhbi5vcmc+ICBXZWQsICA4IFNlcCAxOTk5IDAwOjQ2OjM4ICswMjAwCgplMmZzcHJvZ3MgKDEuMTUtMSkgdW5zdGFibGU7IHVyZ2VuY3k9bG93CgogICogTmV3IHVwc3RyZWFtIHJlbGVhc2UgKENsb3NlczogQnVnIzQxNzYzKS4KICAqIEFsbCBjaGFuZ2VzIHRvIHVwc3RyZWFtIGZpbGVzIGluIDEuMTQtMyB3ZXJlIGludGVncmF0ZWQgdXBzdHJlYW0uCiAgKiBTZXBhcmF0ZWQgbGlidXVpZC1kZXYgZnJvbSBlMmZzbGlicy1kZXYgYmVjYXVzZSBpdCBub3cgaGFzIG1hbnBhZ2VzLgogICogRml4ZWQgZGViaWFuL3J1bGVzIGZvciBQT1NJWCAicm1kaXIgLXAiCiAgKiBDb3JyZWN0ZWQgdGhlIGxvY2F0aW9uIG9mIHRoZSBHUEwgaW4gY29weXJpZ2h0IGZpbGUuCiAgKiBNb3ZlZCB0aGUgbWFucGFnZXMgdG8gL3Vzci9zaGFyZS8uCiAgKiBCdW1wZWQgU3RhbmRhcmRzLVZlcnNpb24gdG8gMy4wLjAuCgogLS0gWWFubiBEaXJzb24gPGRpcnNvbkBkZWJpYW4ub3JnPiAgRnJpLCAyMyBKdWwgMTk5OSAwMTozNzo1MSArMDIwMAoKZTJmc3Byb2dzICgxLjE0LTMpIHVuc3RhYmxlOyB1cmdlbmN5PWxvdwoKICAqIEZhaWwgd2l0aCBlcnJvciBtZXNzYWdlIHdoZW4gL2Rldi9udWxsIGNhbm5vdCBiZSBvcGVuZWQgKEZpeGVzOgogICAgQnVnIzM1NTk1KS4KICAqIEZpeGVkIHR5cG8gaW4gZTJmc2NrL3VuaXguYyAoRml4ZXM6IEJ1ZyMzNjk2MCkuCiAgKiBBZGRlZCAiZW1lcmVnZW5jeSBoZWxwIiBvcHRpb25zIHN1bW1hcnkgdG8gZTJmc2NrIChGaXhlczogQnVnIzExMzcyKS4KICAqIFByZXBhcmVkIGRlYmlhbi9ydWxlcyBmb3IgdXNyL3NoYXJlL21hbi8uCgogLS0gWWFubiBEaXJzb24gPGRpcnNvbkBkZWJpYW4ub3JnPiAgVHVlLCAgMSBKdW4gMTk5OSAyMzozNzoxMiArMDIwMAoKZTJmc3Byb2dzICgxLjE0LTIpIHVuc3RhYmxlOyB1cmdlbmN5PWxvdwoKICAqIEZpeGVkIGZzY2soMSkgbm90IHRvIGNvcmVkdW1wIHdoZW4gaXQgZG9lcyBub3QgZmluZCBpdHMgYXJndW1lbnQgaW4KICAgIC9ldGMvZnN0YWIgKEZpeGVzOiBCdWcjMzM1MzMsIEJ1ZyMzNDMyMCwgcGFydCBvZiBCdWcjMzQxMzEpLgogICogRml4ZWQgc3BlbGxpbmcgb2YgdXBzdHJlYW0gYXV0aG9yJ3MgbmFtZS4KICAqIENsZWFuZWQgZGViaWFuLyouZmlsZXMgdXAuCiAgKiBVbmRpZCB0aGUgPGxpbnV4L3R5cGVzLmg+IGNoYW5nZXMuCiAgKiBDaGFuZ2VkICJybWRpciAtcCIgaW52b2NhdGlvbnMgaW4gZGViaWFuL3J1bGVzIGludG8gIi1ybWRpciAtcCIgdG8KICAgIHR1cm4gYXJvdW5kIGNoYW5nZWQgYmVoYXZpb3VyIGluIGZpbGV1dGlsc180LjAuCiAgCiAtLSBZYW5uIERpcnNvbiA8ZGlyc29uQGRlYmlhbi5vcmc+ICBGcmksIDEyIE1hciAxOTk5IDIzOjUwOjQ3ICswMTAwCgplMmZzcHJvZ3MgKDEuMTQtMSkgdW5zdGFibGU7IHVyZ2VuY3k9bG93CgogICogTmV3IHVwc3RyZWFtIHJlbGVhc2UgKEZpeGVzOiBCdWcjMzMxMTMpLgogICogQWxsIHBhdGNoZXMgd2UgdXNlZCBmb3IgMS4xMiBhcmUgb2Jzb2xldGVkIGJ5IDEuMTQuCiAgKiBTdGlsbCBoYXZlIHRvIGluc3RhbGwgY29tX2Vyci5pbmZvIGZyb20gZGViaWFuL3J1bGVzIHRob3VnaC4KICAqIEluY29ycG9yYXRlZCBwYXRjaGVzIGZyb20gR29yZG9uIE1hdHppZ2tlaXQgZm9yIGh1cmQgY3Jvc3MtY29tcGlsYXRpb246CiAgKiAtIGNvbmZpZ3VyZS5pbjogQ2hhbmdlIGNyb3NzLWNvbXBpbGUgZGVmYXVsdCBmb3Igc2l6ZW9mIChsb25nCiAgICAgIGxvbmcpIHRvIDgsIHNvIHRoYXQgX19zNjQgYW5kIF9fdTY0IGdldCBkZWZpbmVkIGluIGV4dDJmcy5oLgogICAgICAoQlVJTERfQ0MpOiBEaXNjb3ZlciBhIG5hdGl2ZSBjb21waWxlciBpZiB3ZSBhcmUgY3Jvc3MtY29tcGxpbmcKICAgICAgKHVzZWQgZm9yIHV0aWwvc3Vic3QpLgogICAgLSBJbmNsdWRlIGxpbnV4L3R5cGVzLmggaW5zdGVhZCBvZiBhc20vdHlwZXMuaCwgc28gdGhhdAogICAgICBub24tTGludXggcGxhdGZvcm1zIHVzZSB0aGUgc3R1YmJlZCB2ZXJzaW9uIHByb3ZpZGVkIHdpdGggdGhpcwogICAgICBwYWNrYWdlLgogICAgLSBtaXNjL01ha2VmaWxlLmluIChmaW5kc3VwZXIpOiBBZGQgYSBydWxlIHNvIHRoYXQgZmluZHN1cGVyIGdldHMgYnVpbHQKICAgICAgd2l0aCB0aGUgcmlnaHQgY29tcGlsZXIgZmxhZ3MuCiAgICAtIGV0Yy4KCiAtLSBZYW5uIERpcnNvbiA8ZGlyc29uQGRlYmlhbi5vcmc+ICBXZWQsIDEwIEZlYiAxOTk5IDIzOjIzOjAzICswMTAwCgplMmZzcHJvZ3MgKDEuMTItNCkgZnJvemVuIHVuc3RhYmxlOyB1cmdlbmN5PWxvdwoKICAqIFNoaXAgZmx1c2hiKDgpIGFuZCBleHRlbmQoOCkgd2VyZSBtaXNzaW5nIGluIGFsbCAxLjEyIHBhY2thZ2VzCiAgICAoRml4ZXM6IEJ1ZyMyODc3MSkuCiAgKiBBZGQgZXh0ZW5kLjggbGluayB0byB1bmRvY3VtZW50ZWQuNy4KICAqIFJlcGxhY2VkIG15IChhZC1ob2MpIGZpeCBmb3IgQnVnIzI1Njg0IHdpdGggKHJlYWxseSBiZXR0ZXIpIG9uZQogICAgZnJvbSB1cHN0cmVhbS4KCiAtLSBZYW5uIERpcnNvbiA8ZGlyc29uQGRlYmlhbi5vcmc+ICBNb24sICAyIE5vdiAxOTk4IDIwOjUzOjI4ICswMTAwCgplMmZzcHJvZ3MgKDEuMTItMykgZnJvemVuIHVuc3RhYmxlOyB1cmdlbmN5PWxvdwoKICAqIEZpeGVkIDxleHQyZnMvZXh0MmZzLmg+IHRvIHVzZSBhbmdsZSBicmFja2V0cyBpbnN0ZWFkIG9mIGRvdWJsZQogICAgcXVvdGVzIHdoZW4gaW5jbHVkaW5nIGZpbGVzIGZyb20gL3Vzci9pbmNsdWRlLy4KICAqIE1hZGUgZTJmc2xpYnMtZGV2IGRlcGVuZCBvbiBjb21lcnItZGV2IChGaXhlczogQnVnIzI2MjgyLAogICAgQnVnIzI3NDk3KS4KICAqIEZpeGVkIG1rZTJmcycgZGlzcGxheSB3aXRoIGlub2RlIG51bWJlcnMgPiA5OTk5IChGaXhlczogQnVnIzI1Njg0KS4KICAqIFVzZSAtRF9fTk9fU1RSSU5HX0lOTElORVMgb24gcG93ZXJwYyB0byBhbGxvdyBidWlsZGluZyB0aGUgYm9vdAogICAgYmxvY2tzIGluIFFVSUssIHRoZSBwb3dlcm1hYyBib290IGxvYWRlciAtIHJlcG9ydGVkIGJ5IE1hdHQKICAgIE1jTGVhbi4KICAqIFJlbW92ZWQgdW5zdXBwb3J0ZWQgaW5mbyBhbmQgdGV4aSBlbnRyaWVzIGZyb20gZG9jYmFzZSBmaWxlcy4KCiAtLSBZYW5uIERpcnNvbiA8ZGlyc29uQGRlYmlhbi5vcmc+ICBNb24sIDE5IE9jdCAxOTk4IDIzOjMyOjQxICswMjAwCgplMmZzcHJvZ3MgKDEuMTItMi4xKSB1bnN0YWJsZTsgdXJnZW5jeT1sb3cKCiAgKiBOb24tbWFpbnRhaW5lciB1cGxvYWQKICAgIGNvbmZpZy5ndWVzcyBhbmQgY29uZmlnLnN1YiBmaWxlcyBtb2RpZmllZCwgdG8gcmVjb2duaXplIGEgQXJtCiAgICBhcmNoaXRlY3R1cmUuCiAgICAgIAogLS0gVHVyYm8gRnJlZHJpa3Nzb24gPHR1cmJvQGRlYmlhbi5vcmc+ICBUaHUsIDEzIEF1ZyAxOTk4IDE5OjE1OjU2IC0wNDAwCiAgICAgICAKZTJmc3Byb2dzICgxLjEyLTIpIHVuc3RhYmxlOyB1cmdlbmN5PWxvdwoKICAqIFJlYWxseSBpbnN0YWxsIGUybGFiZWwuOCBtYW5wYWdlLgogICogUmVtb3ZlZCBwYXRoIGZyb20gbGRjb25maWcgaW52b2NhdGlvbiwgb2JleWluZyBwYWNrYWdpbmcgbWFudWFsLgogICogSW1wcm92ZWQgdGhlIHN1YnN0LmMgcGF0Y2ggKHRoYW5rcyB0byBQZXRlciBNb3VsZGVyKS4KCiAtLSBZYW5uIERpcnNvbiA8ZGlyc29uQGRlYmlhbi5vcmc+ICBUaHUsIDE0IEp1bCAxOTk4IDE0OjEwOjA2ICswMjAwCgplMmZzcHJvZ3MgKDEuMTItMSkgdW5zdGFibGU7IHVyZ2VuY3k9bG93CgogICogTmV3IHVwc3RyZWFtIHJlbGVhc2UgLSBhdCBsYXN0IG91dCBvZiBhbHBoYSBzdGF0dXMgIQogICogUmVtb3ZlZCBzb21lIG9ic29sZXRlIGZpbGVzIGZyb20gZGViaWFuL2F0dGljLgogICogUGF0Y2hlZCB1dGlsL3N1YnN0LmMgdG8gZXhwYW5kIGVudiB2YXJpYWJsZXMsIGFuZCBNQ09ORklHLmluIHRvCiAgICBoYXZlICR7cHJlZml4fSBleHBvcnRlZCB0byB0aGUgYHN1YnN0JyBwcm9jZXNzLCBzbyB0aGF0IHdlIGdldAogICAgY29ycmVjdCBwYXRocyBpbiBta19jbWRzIGFuZCBjb21waWxlX2V0LiAgRm9yd2FyZGVkIHVwc3RyZWFtLgogICogRGViaWFuLXNwZWNpZmljIC91c3Ivc2hhcmUvY29tZXJyLyByZW5hbWVkIHRvIC91c3Ivc2hhcmUvZXQvLCBub3cKICAgIGluc3RhbGxlZCB1cHN0cmVhbS4KICAqIFJlbW92ZWQgLWlzcCBmcm9tIGRoX2dlbmNvbnRyb2wgaW52b2NhdGlvbiAtIG5vdyB0aGUgZGVmYXVsdC4KICAqIFBhc3NlZCBsaW50aWFuIDAuNS4wLgoKIC0tIFlhbm4gRGlyc29uIDxkaXJzb25AZGViaWFuLm9yZz4gIEZyaSwgMTAgSnVsIDE5OTggMjI6NDk6MTggKzAyMDAKCmUyZnNwcm9ncyAoMS4xMC0xNykgZnJvemVuIHVuc3RhYmxlOyB1cmdlbmN5PWxvdwoKICAqIENvbW1lbnRlZCBvdXQgb2Jzb2xldGUgY29kZSBpbiBmc2NrLmMgdGhhdCBhc3N1bWVkIGZzdGFiIGVudHJpZXMKICAgIGRlY2xhcmVkIGBub2F1dG8nIHNob3VsZCBub3QgYmUgY2hlY2tlZCAtIHN1Y2Nlc3NmdWxseSBmb3J3YXJkZWQKICAgIHVwc3RyZWFtIChGaXhlczogQnVnIzE3MjQ0KS4KCiAtLSBZYW5uIERpcnNvbiA8ZGlyc29uQGRlYmlhbi5vcmc+ICBGcmksIDE1IE1heSAxOTk4IDAxOjE0OjU0ICswMjAwCgplMmZzcHJvZ3MgKDEuMTAtMTYpIGZyb3plbiB1bnN0YWJsZTsgdXJnZW5jeT1sb3cKCiAgKiBDaGFuZ2VkIDxsaW51eC90eXBlcy5oPiB0byA8YXNtL3R5cGVzLmg+IGluIGxpYi91dWlkL3V1aWRQLmggdG8KICAgIGFsbG93IGNvbXBpbGF0aW9uIHdpdGggZ2xpYmMgMi4wLjdwcmUxIChGaXhlczogQnVnIzIyMDM5KS4KICAqIFVzZSAiYnVpbGQtc3RhbXAiIGFzIGEgc3RhbXAgZmlsZSBpbnN0ZWFkIG9mICJidWlsZCIuCiAgKiBSZXN0b3JlZCAiUHJvdmlkZXM6IGUyZnNsaWJzZyIgaW4gb3JkZXIgdG8gYWxsb3cgdXBncmFkZSBmcm9tCiAgICB1bnN0YWJsZSBoYW1tLiAgRG9jdW1lbnRlZCBpbiBSRUFETUUuRGViaWFuIHNvIHRoYXQgaXQgZG9lcyBub3QKICAgIGdldCByZW1vdmVkIGFnYWluIChGaXhlczogQnVnIzIyMDE5KS4KCiAtLSBZYW5uIERpcnNvbiA8ZGlyc29uQGRlYmlhbi5vcmc+ICBNb24sICA0IE1heSAxOTk4IDIxOjExOjM4ICswMjAwCgplMmZzcHJvZ3MgKDEuMTAtMTUpIGZyb3plbiB1bnN0YWJsZTsgdXJnZW5jeT1sb3cKCiAgKiBBZGRlZCBjYWxsIHRvIGxkY29uZmlnIGluIGUyZnNwcm9ncy5wb3N0aW5zdC4KICAqIEZpeGVzIGNoZWNrcyBmb3IgaW5zdGFsbC1kb2NzIGluIHBvc3RpbnN0L3ByZXJtIChGaXhlczogQnVnIzIwMzAzLAogICAgQnVnIzIwMzA0LCBCdWcjMjA1OTApLgogICogUmVtb3ZlZCBlMmZzbGlic2cgZnJvbSB3aGF0IGUyZnNwcm9ncyBwcm92aWRlcyAod2FzIGp1c3QgZm9yZ290dGVuKS4KICAqIFBhc3NlZCBsaW50aWFuIDAuNC4yLgoKIC0tIFlhbm4gRGlyc29uIDxkaXJzb25AZGViaWFuLm9yZz4gIFN1biwgMjYgQXByIDE5OTggMjI6Mjc6MTEgKzAyMDAKCmUyZnNwcm9ncyAoMS4xMC0xNCkgZnJvemVuIHVuc3RhYmxlOyB1cmdlbmN5PWxvdwoKICAqIEZpeGVkIGNoZWNrcyBmb3IgaW5zdGFsbC1kb2NzIHRvIHVzZSAteC4KICAqIEFwcGxpZWQgcGF0Y2ggZm9yIHNwYXJjIGZyb20gSnVhbiB0byBmc2NrLmMgdG8gY29tcGlsZSB3aXRoIGdsaWJjCiAgICAyLjEgKEZpeGVzOiBCdWcjMjA4NDEpLgoKIC0tIFlhbm4gRGlyc29uIDxkaXJzb25AZGViaWFuLm9yZz4gIFR1ZSwgMTQgQXByIDE5OTggMTc6MTI6MTkgKzAyMDAKCmUyZnNwcm9ncyAoMS4xMC0xMykgZnJvemVuIHVuc3RhYmxlOyB1cmdlbmN5PWxvdwoKICAqIHRlc3QgZm9yIC91c3Ivc2Jpbi9pbnN0YWxsLWRvY3MgYmVmb3JlIHRyeWluZyB0byBydW4gaXQgaW4KICAgIHBvc3RpbnN0IGFuZCBwcmVybSAoRml4ZXM6IEJ1ZyMxOTQ2MSwgQnVnIzE5NDY5LCBCdWcjMTk5NDksCiAgICBCdWcjMjAwMDYpLgogICogY29tZXJyZy1kZXYgbm93IHN1Z2dlc3RzIGRvYy1iYXNlLgogICogbW92ZWQgYmluYXJ5IHBhY2thZ2VzIHNzMmcsIGNvbWVycjJnIGFuZCBlMmZzbGlic2cgYmFjayBpbnRvCiAgICBiaW5hcnkgcGFja2FnZSBlMmZzcHJvZ3MuCiAgKiB1c2UgbmV3IHZpcnR1YWwgcGFja2FnZXMgbGliY29tZXJyMiwgbGlic3MyLCBsaWJleHQyZnMyLCBsaWJlMnAyLAogICAgbGlidXVpZDEgaW4gc2hsaWJzIGFuZCBkZXBlbmRlbmNpZXMuCiAgKiBDaGFuZ2VkIGUyZnNwcm9ncyBkZXBlbmRlbmN5IG9uIGxpYnMgdG8gYSBQcmUtRGVwZW5kcyAoRml4ZXM6CiAgICBCdWcjMTgyMjEpLgogICogTm90IGNvbmZsaWN0aW5nIHdpdGggb2xkIHNzMmcgYW5kIGNvbWVycjJnIC0gdGhlc2Ugd2lsbCBoYXZlIHRvIGJlCiAgICByZW1vdmVkIGJ5IGhhbmQuCiAgKiBUdXJuZWQgYXJvdW5kIGRwa2cncyBidWcgIzE3NjI0IGluIGUyZnNwcm9ncy5wcmVpbnN0LgogICogVXBkYXRlZCBSRUFETUUuRGViaWFuIHRvIGV4cGxhaW4gdGhlIG5ldyBwYWNrYWdlIGFyY2hpdGVjdHVyZS4KICAqIFBhc3NlZCBsaW50aWFuIDAuMy40LgoKIC0tIFlhbm4gRGlyc29uIDxkaXJzb25AZGViaWFuLm9yZz4gIEZyaSwgMjAgTWFyIDE5OTggMTM6MDM6MTEgKzAxMDAKCmUyZnNwcm9ncyAoMS4xMC0xMikgdW5zdGFibGU7IHVyZ2VuY3k9bG93CgogICogQ29ycmVjdGVkIGRvYyBtZW51IGVudHJpZXMgdG8gcG9pbnQgdG8gdGhlIHJlYWwgZG9jdW1lbnRzJyBwbGFjZXMuCiAgKiBGaXhlZCBta19jbWRzIHRvIHJlYWxseSBmaW5kIGl0cyBzdXBwb3J0IHNjcmlwdHMgKEZpeGVzOiBCdWcjMTg3NzkpLgogICogTWFkZSBta19jbWRzIGFuZCBjb21waWxlX2V0IHVzZSAic2ggLWUiLgogICogSGF2ZSBtaXNzaW5nIGZpbGUgL3Vzci9pbmNsdWRlL3NzL3NzX2Vyci5oIGluc3RhbGxlZCAoRml4ZXM6IEJ1ZyMxODc3OCkuCiAgKiBDb3JyZWN0ZWQgdHlwbyBpbiBEZXNjcmlwdGlvbiAoRml4ZXM6IEJ1ZyMxODg5MCkuCiAgKiBGaXhlZCBkZXNjcmlwdGlvbnMgZm9yIHNzKiBwYWNrYWdlcywgdGhhbmtzIHRvIEdyZWcgU3RhcmsgKEZpeGVzOgogICAgQnVnIzE4MzczLCBCdWcjMTg0NDcpLgogICogQWRkZWQgZGVzY3JpcHRpb24gb2YgZTJwIGFuZCB1dWlkIGxpYnMgaW4gZTJmc2xpYnNnLWRldiBkZXNjcmlwdGlvbi4KICAqIEluY2x1ZGVkIHRleGluZm8gc291cmNlcy4KICAqIEFkZGVkIGRvYy1iYXNlIHN1cHBvcnQgLSBzdXBwcmVzc2VkIGRpcmVjdCBtZW51L2R3d3cgc3VwcG9ydC4KICAqIENvbXBsaWVzIHdpdGggc3RhbmRhcmRzIHZlcnNpb24gMi40LjAuMC4KICAqIFBhc3NlZCBsaW50aWFuIDAuMy4wOgogICogIHJlbW92ZWQgLmR1IGNvbnRyb2wgZmlsZS4KICAqICB1cGRhdGVkIEZTRiBhZGRyZXNzLgogICogIGZpeGVkIGluICouZmlsZXMgbmFzdHkgbGRjb25maWctc3ltbGluay1iZWZvcmUtc2hsaWItaW4tZGViJ3MuCiAgKiAgdHVybmVkIHJlbGF0aXZlIGxpbmtzIGZyb20gL3Vzci9saWIgaW50byAvbGliIGludG8gYWJzb2x1dGUgb25lcy4KCiAtLSBZYW5uIERpcnNvbiA8ZGlyc29uQGRlYmlhbi5vcmc+ICBTdW4sICA4IE1hciAxOTk4IDE5OjQyOjU4ICswMTAwCgplMmZzcHJvZ3MgKDEuMTAtMTEpIHVuc3RhYmxlOyB1cmdlbmN5PWxvdwoKICAqIFN3aXRjaGVkIHRvIGRlYmhlbHBlciAoRml4ZXM6QnVnIzE2MzA3KS4KICAqIFVwZGF0ZWQgc3RhbmRhcmRzIHRvIDIuMy4wLjEKICAqIENoYW5nZWQgbWFpbnRhaW5lcidzIG1haWwgYWRkcmVzcy4KICAqIEFkZGVkIGNvbmZsaWN0cyB3aXRoIG9sZCB2ZXJzaW9ucyBvZiBkdW1wIGFuZCBxdW90YS4KICAqIEFkZGVkIGh0bWwtY29udmVydGVkIHRleGkgZG9jcyBmb3IgbGlicywgd2l0aCBtZW51KGR3d3cpIHN1cHBvcnQuCiAgKiBBZGRlZCBmaW5kc3VwZXIuOCBsaW5rIHRvIHVuZG9jdW1lbnRlZC4KICAqIENoYW5nZWQgdmVyc2lvbiBudW1iZXIgb2YgbGliIHBhY2thZ2VzIHRvIHJlZmxlY3QgdGhlIGxpYiB2ZXJzaW9ucy4KICAqIE1vdmVkIGxpYnNzIGludG8gaXRzIG93biBwYWNrYWdlczsgYWRkZWQgbWtfY21kcyBzY3JpcHQgYW5kCiAgICBzdXBwb3J0IGZpbGVzIGZvciBsaWJzcyBkZXZlbG9wbWVudCAoRml4ZXM6QnVnIzE3MjMzKS4KICAqIEFkZGVkIFJFQURNRS5EZWJpYW4gZmlsZSBkb2N1bWVudGluZyBhbGwgdGhvc2UgZGVwZW5kZW5jeSBzdHVmZi4KICAqIEluY2x1ZGVkIGV4YW1wbGUgZXJyb3IgdGFibGVzIGZyb20gbGliZXh0MmZzIGFuZCBsaWJzcyBpbgogICAgY29tZXJyLWRldi4KICAqIEluY2x1ZGVkIGV4YW1wbGUgY29tbWFuZCB0YWJsZXMgZnJvbSBkZWJ1Z2ZzIGluIHNzLWRldi4KICAqIEFkZGVkIHNlY3Rpb24vcHJpb3JpdHkgZmlsZXMgaW4gcGFja2FnZXMgKC1pc3ApLgogICogQ2hhbmdlZCBuYW1lcy9yZWxhdGlvbnMgZm9yIGRvYyBkaXJzIHRvIGNvbXBseSB3aXRoIHBvbGljeS4KICAqIFJlbW92ZWQgY2FsbCB0byBsZGNvbmZpZyBmcm9tIGUyZnNwcm9ncy5wb3N0aW5zdC4KCiAtLSBZYW5uIERpcnNvbiA8ZGlyc29uQGRlYmlhbi5vcmc+ICBUaHUsIDI5IEphbiAxOTk4IDE4OjEwOjAzICswMTAwCgplMmZzcHJvZ3MgKDEuMTAtMTApIHVuc3RhYmxlOyB1cmdlbmN5PWxvdwoKICAqIEFkZGVkIHBhdGNoIGZyb20gTWljaGFlbCBBbGFuIERvcm1hbiBmb3IgY29tcGlsYXRpb24gb24gYWxwaGEtTGludXgKICAgIChDbG9zZXM6QnVnIzE1NTk2KS4KICAqIEFkZGVkICctZnNpZ25lZC1jaGFyJyB0byBDT1BUUyB0byBhbGxvdyBjb21waWxhdGlvbiBvbiBwcGMtTGludXgKICAgIChDbG9zZXM6QnVnIzE1OTc2KS4KICAqIFN1cHByZXNzZWQgRXNzZW50aWFsIGZsYWcgb24gbGlicywgYXMgd2VsbCBhcyB1c2VsZXNzIFJlcGxhY2VzCiAgICAoQ2xvc2VzOiBCdWcjMTY0ODApLgogICogU3VwcHJlc3NlZCByZWZlcmVuY2UgdG8gb2Jzb2xldGUgcGFja2FnZSBgZTJmc3Byb2dzZycgaW4gY29udHJvbAogICAgaW5mbywgYnV0IENvbmZsaWN0cyBmb3Igc2VjdXJpdHkgKENsb3NlczpCdWcjMTY3OTEpLgoKIC0tIFlhbm4gRGlyc29uIDxkaXJzb25AdW5pdi1tbHYuZnI+ICBXZWQsICA3IEphbiAxOTk4IDIyOjM1OjA4ICswMTAwCgplMmZzcHJvZ3MgKDEuMTAtOSkgdW5zdGFibGU7IHVyZ2VuY3k9bG93CgogICogRml4ZWQgY29tZXJyMmcuc2hsaWJzIHRvIHJlZmxlY3QgcGFja2FnZS1uYW1lIGNoYW5nZS4KICAqIEZpeGVkIHByb2JsZW0gd2l0aCBzcyBpbmNsdWRlIGZpbGVzIGJlaW5nIHJlbW92ZWQgZnJvbSAvdXNyIG9uIG1ha2UKICAgIGluc3RhbGwgKGluZGVlZCBmaXhlZCBpbiAxLjEwLTgpLgogICogQWRkZWQgY2hhbmdlbG9nIGZpbGUgdG8gY29tZXJyMmcgcGFja2FnZSAoaW5kZWVkIGZpeGVkIGluIDEuMTAtOCkuCiAgKiBDb3JyZWN0ZWQgbGluayBmcm9tIGZsdXNoYi44IHRvIHVuZG9jdW1lbnRlZCAoQ2xvc2VzOkJ1ZyMxNTMzNSxCdWcjMTU2NjAsQnVnIzE1Njc1KS4KICAqIEFkZGVkIC9zYmluL2ZpbmRzdXBlciAoQ2xvc2VzOkJ1ZyMxNTIyNCkuCiAgKiBGaXhlZCAvdXNyL2Jpbi9jb21waWxlX2V0IHNjcmlwdCAoQ2xvc2VzOkJ1ZyMxNTQ4NykuCiAgKiBJbmNsdWRlZCBhd2sgc2NyaXB0cyBpbiAvdXNyL3NoYXJlL2NvbWVyciwgZm9yIHVzZSBieSBjb21waWxlX2V0LgogICogQ2hhbmdlZCBiYWNrIHRoZSBuYW1lIGZyb20gImUyZnNwcm9nc2ciIHRvICJlMmZzcHJvZ3MiIHRvIGdldCBiZXR0ZXIKICAgIGRlcGVuZGVuY2llcy4KICAqIFN0cmlwIGxpYnJhcmllcyAoQ2xvc2VzOkJ1ZyMxNTY2NykuCgogLS0gWWFubiBEaXJzb24gPGRpcnNvbkB1bml2LW1sdi5mcj4gIFR1ZSwgIDkgRGVjIDE5OTcgMjI6NTI6NDIgKzAxMDAKCmUyZnNwcm9ncyAoMS4xMC04KSB1bnN0YWJsZTsgdXJnZW5jeT1sb3cKCiAgKiBBZGRlZCBsYXRlc3QgcGF0Y2ggZnJvbSBUZWQgZm9yIGF1dG9kZXRlY3Rpb24gb2YgbGxzZWVrKCkgcHJvdG8uCiAgKiBTd2l0Y2hlZCB0byBsaWJjNiwgd2l0aG91dCBsaWJjNSBjb21wYXRpYmlsaXR5ICh5ZXQgPykuCiAgKiBUdXJuZWQgUHJlLURlcGVuZHMgaW50byBEZXBlbmRzIHRvIGFsbG93IGluc3RhbGxhdGlvbi4gRGlydHkKICAgIHRob3VnaC4gQnV0IHdoYXQgd2VyZSBQcmUtRGVwZW5kcyBmb3IgYW55d2F5ID8KCiAtLSBZYW5uIERpcnNvbiA8ZGlyc29uQHVuaXYtbWx2LmZyPiAgU3VuLCAyMyBOb3YgMTk5NyAyMzowMzowMiArMDEwMAoKZTJmc3Byb2dzICgxLjEwLTcpIHVuc3RhYmxlOyB1cmdlbmN5PUhJR0gKCiAgKiBUdXJuZWQgIiNpZiAoX19HTElCQ19fID09IDIpIiBpbnRvICIjaWYgMSIgdG8gdHVybiBhcm91bmQgbWlzc2luZyBsbHNlZWsoKQogICAgcHJvdG90eXBlIGluIGxpYmNfNS40LjMzLTUgYXMgd2VsbCBhcyBsaWJjNi4KICAgIAogLS0gWWFubiBEaXJzb24gPGRpcnNvbkB1bml2LW1sdi5mcj4gIFR1ZSwgMjEgT2N0IDE5OTcgMTI6NTM6MjcgKzAyMDAKIAplMmZzcHJvZ3MgKDEuMTAtNikgdW5zdGFibGU7IHVyZ2VuY3k9bG93CgogICogT2ZmaWNpYWwgbGliYzYgcGF0Y2hlcyBmcm9tIFRlZC4KICAqIENvbnZlcnRlZCB0byBkZWJzdGQgLSBsZXQgaXQgZG8gdGhlIHN0cmlwcGluZyBzdHVmZi4KICAqIFNlcGFyYXRlZCBsaWJjb21lcnIgaW50byBhIHN0YW5kYWxvbmUgbGliIC0gaW5jbHVkZXMgZnVsbCBkb2MgYW5kIHRvb2xzLgogICogU2VwYXJhdGVkIGRldmVsb3BtZW50IGZpbGVzIGludG8gZTJmc2xpYnMtZGV2LCB3aGljaCBQcm92aWRlcyB0aGUgNCBvdGhlcgogICAgLWRldiBwYWNrYWdlcy4KICAqIE5vdyBQcm92aWRlcyB0aGUgNCBvdGhlciBsaWIgcGFja2FnZXMsIHRvIG1ha2UgaXQgcG9zc2libGUgbm90IHRvIGRlcGVuZAogICAgdXBvbiBlMmZzcHJvZ3MgaXRzZWxmLiBUaGVzZSBsaWJzIFdJTEwgYmUgdGFrZW4gb3V0IG9mICJwcm9ncyIgaW4gdGhlCiAgICBuZXh0IHJlbGVhc2UuCgogLS0gWWFubiBEaXJzb24gPGRpcnNvbkB1bml2LW1sdi5mcj4gIFdlZCwgMjQgU2VwIDE5OTcgMTA6NDY6MDAgKzAyMDAKIAplMmZzcHJvZ3MgKDEuMTAtNS4xKSBleHBlcmltZW50YWw7IHVyZ2VuY3k9bG93CgogICogQXBwbGllZCBwYXRjaCBmcm9tIFRlZCBmb3IgbGliYzYgY29tcGF0aWJpbGl0eSwgZm9yIHRlc3QgcHVycG9zZS4KCiAtLSBZYW5uIERpcnNvbiA8ZGlyc29uQHVuaXYtbWx2LmZyPiAgVGh1LCAxMSBTZXAgMTk5NyAwOTowOTo0MiArMDIwMAogCmUyZnNwcm9ncyAoMS4xMC01KSB1bnN0YWJsZTsgdXJnZW5jeT1tZWRpdW0KCiAgKiBTd2l0Y2hlZCBiYWNrIHRvIGxpYmM1IGJlY2F1c2Ugb2YgcG9zc2libGUgYnVnIGluIGxpYmM2LTIuMC40LXByb3ZpZGVkCiAgICBsbHNlZWsoKSBjYXVzaW5nIHByb2JsZW0gd2l0aCBwYXJ0aXRpb25zID4gMkdiLgogICogU3dpdGNoZWQgYmFjayB0byBsaWJjLXByb3ZpZGVkIGxsc2VlaygpLgoKIC0tIFlhbm4gRGlyc29uIDxkaXJzb25AdW5pdi1tbHYuZnI+ICBUdWUsICA1IEF1ZyAxOTk3IDE2OjU0OjQwICswMjAwCgplMmZzcHJvZ3MgKDEuMTAtNC4xKSB1bnN0YWJsZTsgdXJnZW5jeT1sb3cKCiAgKiBNYWtlIHVzZSBvZiBzaGlwcGVkIGxsc2VlayBpbnN0ZWFkIG9mIGdsaWJjJ3Mgd2hpY2ggc2VlbXMgYnVnZ3kKICAgIFt1bnJlbGVhc2VkIC0gY291bGQgbm90IGNvbXBpbGUgZHVlIHRvIHBvc3NpYmxlIGdjYyBidWddLgogICogQ29ycmVjdGVkIGNvbXBpbGVyLW9wdGlvbnMgaGFuZGxpbmcgaW4gZGViaWFuL3J1bGVzICh1c2UgQ0NPUFRTIGluc3RlYWQKICAgIG9mIENGTEFHUyB3aGljaCBpcyBtZXNzZWQgd2l0aCBpbiBjb25maWd1cmUuaW4pLgoKIC0tIFlhbm4gRGlyc29uIDxkaXJzb25AdW5pdi1tbHYuZnI+ICBNb24sIDI4IEp1bCAxOTk3IDE5OjQ3OjAyICswMjAwCgplMmZzcHJvZ3MgKDEuMTAtNCkgdW5zdGFibGU7IHVyZ2VuY3k9bG93CgogICogU3dpdGNoZWQgdG8gbGliYzYuCiAgKiBBZGRlZCBjYWxscyB0byB1cGRhdGUtaW5mbyBpbiBwb3N0aW5zL3ByZXJtLgogICogTWlzYyBjaGFuZ2VzIHRvIGRlYmlhbi9ydWxlczsgc29tZSBjbGVhbnVwIGluIE1ha2VmaWxlcy4KCiAtLSBZYW5uIERpcnNvbiA8ZGlyc29uQHVuaXYtbWx2LmZyPiAgVGh1LCAxMCBKdWwgMTk5NyAxOTo0Mjo1NCArMDIwMAoKZTJmc3Byb2dzICgxLjEwLTMpIHN0YWJsZSB1bnN0YWJsZTsgdXJnZW5jeT1sb3cKCiAgKiBOZXcgbWFpbnRhaW5lciAoY2xvc2VkIG1hbnkgb2Jzb2xldGUgYnVnLXJlcG9ydHMpLgogICogdXBkYXRlZCAiY29weXJpZ2h0IiB0byBzaG93IG5ldyBsb2NhdGlvbiBvbiB0c3gtMTEuCiAgKiBzdGFydGVkIGRlYmlhbi9ydWxlcyBjbGVhbnVwLCB0b3dhcmRzIG5ldyBwb2xpY3kgY29uZm9ybWFuY2UuCiAgKiBBZGRlZCBmbHVzaGIuOCBsaW5rIHRvIHVuZG9jdW1lbnRlZC43IChidWcgIzg2NDQpLgogICogQWRkZWQge2ZzY2ssbWtmc30uZXh0Mi44IGxpbmtzIHRvIGV4aXN0aW5nIG1hbnBhZ2VzIChidWdzICM1NTk4LAogICAgIzYyODYpLgoKIC0tIFlhbm4gRGlyc29uIDxkaXJzb25AdW5pdi1tbHYuZnI+ICBXZWQsIDI1IEp1biAxOTk3IDE0OjU5OjU4ICswMjAwCgplMmZzcHJvZ3MgKDEuMTAtMikgZnJvemVuIHVuc3RhYmxlOyB1cmdlbmN5PWxvdwoKICAqIEFkZCAnbGRjb25maWcnIHRvIHBvc3RpbnN0IChzaG91bGQgZml4ICM5MDIwKS4KICAqIERlZmluZSBIQVZFX05FVElORVRfSU5fSCBvbiBhbHBoYS9nbGliYy4KCiAtLSBLbGVlIERpZW5lcyA8a2xlZUBkZWJpYW4ub3JnPiAgVHVlLCAyOSBBcHIgMTk5NyAxNzoyNDoxMiAtMDQwMAoKZTJmc3Byb2dzICgxLjEwLTEpIGZyb3plbiB1bnN0YWJsZTsgdXJnZW5jeT1tZWRpdW0KCiAgKiBVcHN0cmVhbSBidWctZml4IHJlbGVhc2UuCgogLS0gS2xlZSBEaWVuZXMgPGtsZWVAZGViaWFuLm9yZz4gIFRodSwgMjQgQXByIDE5OTcgMTQ6NTQ6MTIgLTA0MDAKCmUyZnNwcm9ncyAoMS4wOS0xKSBmcm96ZW47IHVyZ2VuY3k9bWVkaXVtCgogICogVXBzdHJlYW0gYnVnLWZpeCByZWxlYXNlLgoKIC0tIEtsZWUgRGllbmVzIDxrbGVlQGRlYmlhbi5vcmc+ICBUaHUsIDI0IEFwciAxOTk3IDE0OjU0OjEyIC0wNDAwCgplMmZzcHJvZ3MgKDEuMDYtNCkgdW5zdGFibGU7IHVyZ2VuY3k9bG93CgogICogQWRkZWQgZW1wdHkgZW50cmllcyB0byBzaGxpYnMubG9jYWwsIHRvIG5lYXRseSBzb2x2ZSB0aGUgcHJlLWRlcGVuZHMKICAgIHByb2JsZW0sIGFzIHN1Z2dlc3RlZCBieSBJYW4gSmFja3Nvbi4KCiAtLSBNaWNoYWVsIE5vbndlaWxlciA8bXJuMjBAY2FtLmFjLnVrPiAgV2VkLCAxMyBOb3YgMTk5NiAwODoxMzoyOCArMDAwMAoKZTJmc3Byb2dzICgxLjA2LTMpIHVuc3RhYmxlOyB1cmdlbmN5PWxvdwoKICAqIEhhcmQgY29kZWQgUHJlLURlcGVuZHMgbGluZSwgYXMgYSB0ZW1wb3JhcnkgZml4IGZvciB0aGUgcHJlLWRlcGVuZHMKICAgIGNvbnRhaW5zIGUyZnNwcm9ncyBwcm9ibGVtLgoKIC0tIE1pY2hhZWwgTm9ud2VpbGVyIDxtcm4yMEBjYW0uYWMudWs+ICBTYXQsIDkgTm92IDE5OTYgMTI6NTc6NDQgKzAwMDAKCmUyZnNwcm9ncyAoMS4wNi0yKSB1bnN0YWJsZTsgdXJnZW5jeT1sb3cKCiAgKiBOZXcgcGFja2FnaW5nIGZvcm1hdAogICogRml4ZXMgcGFja2FnaW5nIGJ1Z3MgLQogICAgICBGaWxlcyBpbiAvbGliIGFyZSBub3cgc3RyaXBwZWQgb2YgYWxsIHVubmVlZGVkIHN5bWJvbHMgKEJ1ZyM1MTIxKQogICAgICBDYWxscyB0byBsZGNvbmZpZyBpbiBtYWludGFpbmVyIHNjcmlwdHMgaGF2ZSBiZWVuIHJlbW92ZWQgKEJ1ZyM0MjQ3KQoKIC0tIE1pY2hhZWwgTm9ud2VpbGVyIDxtcm4yMEBjYW0uYWMudWs+ICBUdWUsIDUgTm92IDE5OTYgMjE6MTQ6NTQgKzAwMDAKCiAqIE9jdCAxOCAxOTk2IE1pY2hhZWwgTWVza2VzIDxtZXNrZXNAZGViaWFuLm9yZz4KICAJdXBncmFkZWQgdG8gbGF0ZXN0IHVwc3RyZWFtIHZlcnNpb24sIHRvIDEuMDYgZnJvbSAxLjA1CiAqIE9jdCAxOCAxOTk2IE1pY2hhZWwgTWVza2VzIDxtZXNrZXNAZGViaWFuLm9yZz4KICAJdXBncmFkZWQgdG8gbGF0ZXN0IHVwc3RyZWFtIHZlcnNpb24sIHRvIDEuMDUgZnJvbSAxLjA0CiAgIGd6aXAgbWFucGFnZXMKICAgbWlub3IgY2hhbmdlcyB0byBkZWJpYW4ucnVsZXMKICAqIEp1biAyMyAxOTk2IE1pY2hhZWwgUi4gTm9ud2VpbGVyIDxtcm4yMEBjYW0uYWMudWs+Cgl1cGdyYWRlZCB0byBsYXRlc3QgdXBzdHJlYW0gdmVyc2lvbiwgdG8gMS4wNCBmcm9tIDEuMDIKICAgYW5vdGhlciB0aWR5LXVwIG9mIGRlYmlhbi5ydWxlcwogICBzZWN0aW9uIGFuZCBwcmlvcml0eSBhZGRlZCB0byBkZWJpYW4uY29udHJvbCwKICAgICAgIHNpbmNlIHRoaXMgaXMgYW4gZXNzZW50aWFsIGJhc2UgcGFja2FnZS4KCiAqIE1hciAgNSAxOTk2IE1pY2hhZWwgUi4gTm9ud2VpbGVyIDxtcm4yMEBjYW0uYWMudWs+Cgl1cGdyYWRlZCB0byBsYXRlc3QgdXBzdHJlYW0gdmVyc2lvbiwgdG8gMS4wMiBmcm9tIDEuMDEKICogY29waWVkICJjb25maWd1cmUiIHVzcl9wcmVmaXggY2hhbmdlIChzZWUgYmVsb3cpLCBpbnRvIGNvbmZpZ3VyZS5pbgogKiB1cGRhdGVkIGRlYmlhbi5jb250cm9sIGZpbGUsIGFkZGVkIFByZS1EZXBlbmRzIGZpZWxkCiAgIGNyZWF0ZWQgcHJlaW5zdCBzY3JpcHQgdG8gY2hlY2sgZHBrZyAtLWFzc2VydC1wcmVkZXBlbmRzCiAgIHRpZHllZCBhbmQgZml4ZWQgZGViaWFuLnJ1bGVzCiAqIHNldCBlMmZzY2sgdG8gbGluayBzaGFyZWQsIGFzIHN1Z2dlc3RlZCBieSBCcnVjZSBQZXJlbnMKICAgaW4gQnVnIzIzMzIKICogY29ycmVjdGVkIHByb2JsZW0gaW4gZTJmc2NrIGVycm9yIG1lc3NhZ2UsIEJ1ZyMyNTM0CiAqIGFkZGVkIEFyY2hpdGVjdHVyZSBmaWVsZAogKiB2ZXJ5IG1pbm9yIGNvcnJlY3Rpb24gdG8gZXhwZWN0ZWQgb3V0cHV0IG9mIGEgYnVpbGQgdGltZSB0ZXN0CgogKiBOb3YgMjAgMTk5NSBBbmRyZXcgRC4gRmVybmFuZGVzIDxhZGZlcm5hbkBjbmQubWNnaWxsLmNhPgoJcmVtb3ZlZCBkZWJ1Z2dpbmcgc3ltYm9scyBmcm9tIGxpYnMgYW5kIGVuYWJsZWQgbW9yZQoJb3B0aW1pemF0aW9uIGFzIHN1Z2dlc3RlZCBieSBSb2xmIFJvc3NpdXMKCWFsc28gcmVtb3ZlZCB0aGUgL3Zhci9jYXRtYW4gcGFnZXMKCiAqIE5vdiAxOSAxOTk1IEFuZHJldyBELiBGZXJuYW5kZXMgPGFkZmVybmFuQGNuZC5tY2dpbGwuY2E+CgljaGFuZ2VkIHRvIGVsZiBjb21waWxhdGlvbgoKICogT2N0ICA3IDE5OTUgQW5kcmV3IEQuIEZlcm5hbmRlcyA8YWRmZXJuYW5AY25kLm1jZ2lsbC5jYT4KCVVwZ3JhZGVkIHRvIGxhdGVzdCB2ZXJzaW9uLCB0byAxLjAxIGZyb20gMC41Yi4KICogY2hhbmdlZCB0aGUgaW5zdGFsbGF0aW9uIGdyb3VwcyBmcm9tIGJpbiB0byByb290IGluIE1DT05GSUcuaW4KICogY2hhbmdlZCBjb25maWd1cmUgdG8gc2V0IHVzcl9wcmVmaXg9Ilwke3ByZWZpeH0vdXNyIgogKiBtb3ZlZCB0aGUgY2F0IHBhZ2VzIHRvIC92YXIvY2F0bWFuIGluIE1DT05GSUcuaW4KCiAqIEF1ZyAgMyAxOTk1IEJydWNlIFBlcmVucyA8QnJ1Y2VAUGl4YXIuY29tPgogICBNYWRlICJmc2NrIC10IDxmaWxlc3lzdGVtLXR5cGU+IDxkZXZpY2U+IiB3b3JrIGNvcnJlY3RseS4gRm9ybWVybHkKICAgdGhlIC10IGFyZ3VtZW50IHdhcyBvdmVycmlkZW4gYnkgdGhlIGZpbGVzeXN0ZW0gdHlwZSBsaXN0ZWQgZm9yIHRoZQogICBkZXZpY2UgaW4gL2V0Yy9mc3RhYi4KICogYWRkZWQgRGViaWFuIEdOVS9MaW51eCBwYWNrYWdlIG1haW50ZW5hbmNlIHN5c3RlbSBmaWxlcwo=