ICA8Y2hhcHRlciBpZD0iaW1wbGVtZW50YXRpb24iPgogICAgPHRpdGxlPkxvdy1sZXZlbCBJbXBsZW1lbnRhdGlvbjwvdGl0bGU+CiAgICA8cGFyYT5EZXRhaWxzIG9mIFdpbmUncyBMb3ctbGV2ZWwgSW1wbGVtZW50YXRpb24uLi48L3BhcmE+Cgo8c2VjdDEgaWQ9ImNvbmZpZy1rZXlib2FyZCI+Cjx0aXRsZT5LZXlib2FyZDwvdGl0bGU+Cgo8cGFyYT4KV2luZSBub3cgbmVlZHMgdG8ga25vdyBhYm91dCB5b3VyIGtleWJvYXJkIGxheW91dC4gVGhpcwpyZXF1aXJlbWVudCBjb21lcyBmcm9tIGEgbmVlZCBmcm9tIG1hbnkgYXBwcyB0byBoYXZlIHRoZQpjb3JyZWN0IHNjYW5jb2RlcyBhdmFpbGFibGUsIHNpbmNlIHRoZXkgcmVhZCB0aGVzZSBkaXJlY3RseSwKaW5zdGVhZCBvZiBqdXN0IHRha2luZyB0aGUgY2hhcmFjdGVycyByZXR1cm5lZCBieSB0aGUgWApzZXJ2ZXIuIFRoaXMgbWVhbnMgdGhhdCBXaW5lIG5vdyBuZWVkcyB0byBoYXZlIGEgbWFwcGluZyBmcm9tClgga2V5cyB0byB0aGUgc2NhbmNvZGVzIHRoZXNlIHByb2dyYW1zIGV4cGVjdC4KPC9wYXJhPgo8cGFyYT4KT24gc3RhcnR1cCwgV2luZSB3aWxsIHRyeSB0byByZWNvZ25pemUgdGhlIGFjdGl2ZSBYIGxheW91dCBieQpzZWVpbmcgaWYgaXQgbWF0Y2hlcyBhbnkgb2YgdGhlIGRlZmluZWQgdGFibGVzLiBJZiBpdCBkb2VzLApldmVyeXRoaW5nIGlzIGFscmlnaHQuIElmIG5vdCwgeW91IG5lZWQgdG8gZGVmaW5lIGl0Lgo8L3BhcmE+CjxwYXJhPgpUbyBkbyB0aGlzLCBvcGVuIHRoZSBmaWxlCjxmaWxlbmFtZT5kbGxzL3gxMWRydi9rZXlib2FyZC5jPC9maWxlbmFtZT4gYW5kIHRha2UgYSBsb29rCmF0IHRoZSBleGlzdGluZyB0YWJsZXMuIE1ha2UgYSBiYWNrdXAgY29weSBvZiBpdCwgZXNwZWNpYWxseQppZiB5b3UgZG9uJ3QgdXNlIENWUy4KPC9wYXJhPgo8cGFyYT4KV2hhdCB5b3UgcmVhbGx5IHdvdWxkIG5lZWQgdG8gZG8sIGlzIGZpbmQgb3V0IHdoaWNoIHNjYW5jb2RlCmVhY2gga2V5IG5lZWRzIHRvIGdlbmVyYXRlLiAgRmluZCBpdCBpbiB0aGUKPGZ1bmN0aW9uPm1haW5fa2V5X3NjYW48L2Z1bmN0aW9uPiB0YWJsZSwgd2hpY2ggbG9va3MgbGlrZQp0aGlzOgo8L3BhcmE+Cjxwcm9ncmFtbGlzdGluZz4Kc3RhdGljIGNvbnN0IGludCBtYWluX2tleV9zY2FuW01BSU5fTEVOXSA9CnsKLyogdGhpcyBpcyBteSAoMTAyLWtleSkga2V5Ym9hcmQgbGF5b3V0LCBzb3JyeSBpZiBpdCBkb2Vzbid0IHF1aXRlIG1hdGNoIHlvdXJzICovCjB4MjksMHgwMiwweDAzLDB4MDQsMHgwNSwweDA2LDB4MDcsMHgwOCwweDA5LDB4MEEsMHgwQiwweDBDLDB4MEQsCjB4MTAsMHgxMSwweDEyLDB4MTMsMHgxNCwweDE1LDB4MTYsMHgxNywweDE4LDB4MTksMHgxQSwweDFCLAoweDFFLDB4MUYsMHgyMCwweDIxLDB4MjIsMHgyMywweDI0LDB4MjUsMHgyNiwweDI3LDB4MjgsMHgyQiwKMHgyQywweDJELDB4MkUsMHgyRiwweDMwLDB4MzEsMHgzMiwweDMzLDB4MzQsMHgzNSwKMHg1NiAvKiB0aGUgMTAybmQga2V5IChhY3R1YWxseSB0byB0aGUgcmlnaHQgb2YgbC1zaGlmdCkgKi8KfTsKPC9wcm9ncmFtbGlzdGluZz4KPHBhcmE+Ck5leHQsIGFzc2lnbiBlYWNoIHNjYW5jb2RlIHRoZSBjaGFyYWN0ZXJzIGltcHJpbnRlZCBvbiB0aGUKa2V5Y2Fwcy4gVGhpcyB3YXMgZG9uZSAoc29ydCBvZikgZm9yIHRoZSBVUyAxMDEta2V5IGtleWJvYXJkLAp3aGljaCB5b3UgY2FuIGZpbmQgbmVhciB0aGUgdG9wIGluCjxmaWxlbmFtZT5rZXlib2FyZC5jPC9maWxlbmFtZT4uIEl0IGFsc28gc2hvd3MgdGhhdCBpZiB0aGVyZQppcyBubyAxMDJuZCBrZXksIHlvdSBjYW4gc2tpcCB0aGF0Lgo8L3BhcmE+CjxwYXJhPgpIb3dldmVyLCBmb3IgbW9zdCBpbnRlcm5hdGlvbmFsIDEwMi1rZXkga2V5Ym9hcmRzLCB3ZSBoYXZlCmRvbmUgaXQgZWFzeSBmb3IgeW91LiBUaGUgc2NhbmNvZGUgbGF5b3V0IGZvciB0aGVzZSBhbHJlYWR5CnByZXR0eSBtdWNoIG1hdGNoZXMgdGhlIHBoeXNpY2FsIGxheW91dCBpbiB0aGUKPGZ1bmN0aW9uPm1haW5fa2V5X3NjYW48L2Z1bmN0aW9uPiwgc28gYWxsIHlvdSBuZWVkIHRvIGRvIGlzCnRvIGdvIHRocm91Z2ggYWxsIHRoZSBrZXlzIHRoYXQgZ2VuZXJhdGUgY2hhcmFjdGVycyBvbiB5b3VyCm1haW4ga2V5Ym9hcmQgKGV4Y2VwdCBzcGFjZWJhciksIGFuZCBzdHVmZiB0aG9zZSBpbnRvIGFuCmFwcHJvcHJpYXRlIHRhYmxlLiBUaGUgb25seSBleGNlcHRpb24gaXMgdGhhdCB0aGUgMTAybmQga2V5LAp3aGljaCBpcyB1c3VhbGx5IHRvIHRoZSBsZWZ0IG9mIHRoZSBmaXJzdCBrZXkgb2YgdGhlIGxhc3QgbGluZQoodXN1YWxseSA8a2V5Y2FwPlo8L2tleWNhcD4pLCBtdXN0IGJlIHBsYWNlZCBvbiBhIHNlcGFyYXRlCmxpbmUgYWZ0ZXIgdGhlIGxhc3QgbGluZS4KPC9wYXJhPgo8cGFyYT4KRm9yIGV4YW1wbGUsIG15IE5vcndlZ2lhbiBrZXlib2FyZCBsb29rcyBsaWtlIHRoaXMKPC9wYXJhPgo8c2NyZWVuPgqnICAhICAiICAjICCkICAlICAmICAvICAoICApICA9ICA/ICBgICBCYWNrLQp8ICAxICAyQCAzoyA0JCA1ICA2ICA3eyA4WyA5XSAwfSArICBctCBzcGFjZQoKVGFiIFEgIFcgIEUgIFIgIFQgIFkgIFUgIEkgIE8gIFAgIMUgIF4KCQkJICAgICCofgoJCQkJRW50ZXIKQ2FwcyBBICBTICBEICBGICBHICBIICBKICBLICBMICDYICDGICAqCkxvY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJwoKU2gtID4gWiAgWCAgQyAgViAgQiAgTiAgTSAgOyAgOiAgXyAgU2hpZnQKaWZ0ICZsdDsgICAgICAgICAgICAgICAgICAgICAgLCAgLiAgLQoKQ3RybCAgQWx0ICAgICAgIFNwYWNlYmFyICAgICAgIEFsdEdyICBDdHJsCjwvc2NyZWVuPgo8cGFyYT4KTm90ZSB0aGUgMTAybmQga2V5LCB3aGljaCBpcyB0aGUgPGtleWNhcD4mbHQ7Pjwva2V5Y2FwPiBrZXksIHRvCnRoZSBsZWZ0IG9mIDxrZXljYXA+Wjwva2V5Y2FwPi4gVGhlIGNoYXJhY3RlciB0byB0aGUgcmlnaHQgb2YKdGhlIG1haW4gY2hhcmFjdGVyIGlzIHRoZSBjaGFyYWN0ZXIgZ2VuZXJhdGVkIGJ5CjxrZXljYXA+QWx0R3I8L2tleWNhcD4uCjwvcGFyYT4KPHBhcmE+ClRoaXMga2V5Ym9hcmQgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOgo8L3BhcmE+Cjxwcm9ncmFtbGlzdGluZz4Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfTk9bTUFJTl9MRU5dWzRdID0KewoifKciLCIxISIsIjJcIkAiLCIzI6MiLCI0pCQiLCI1JSIsIjYmIiwiNy97IiwiOChbIiwiOSldIiwiMD19IiwiKz8iLCJcXLQiLAoicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCLlxSIsIqhefiIsCiJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCL42CIsIubGIiwiJyoiLAoieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsOyIsIi46IiwiLV8iLAoiJmx0Oz4iCn07CjwvcHJvZ3JhbWxpc3Rpbmc+CjxwYXJhPgpFeGNlcHQgdGhhdCAiIGFuZCBcIG5lZWRzIHRvIGJlIHF1b3RlZCB3aXRoIGEgYmFja3NsYXNoLCBhbmQKdGhhdCB0aGUgMTAybmQga2V5IGlzIG9uIGEgc2VwYXJhdGUgbGluZSwgaXQncyBwcmV0dHkKc3RyYWlnaHRmb3J3YXJkLgo8L3BhcmE+CjxwYXJhPgpBZnRlciB5b3UgaGF2ZSB3cml0dGVuIHN1Y2ggYSB0YWJsZSwgeW91IG5lZWQgdG8gYWRkIGl0IHRvIHRoZQo8ZnVuY3Rpb24+bWFpbl9rZXlfdGFiW108L2Z1bmN0aW9uPiBsYXlvdXQgaW5kZXggdGFibGUuIFRoaXMKd2lsbCBsb29rIGxpa2UgdGhpczoKPC9wYXJhPgo8cHJvZ3JhbWxpc3Rpbmc+CnN0YXRpYyBzdHJ1Y3QgewpXT1JEIGxhbmcsIGFuc2lfY29kZXBhZ2UsIG9lbV9jb2RlcGFnZTsKY29uc3QgY2hhciAoKmtleSlbTUFJTl9MRU5dWzRdOwp9IG1haW5fa2V5X3RhYltdPXsKLi4uCi4uLgp7TUFLRUxBTkdJRChMQU5HX05PUldFR0lBTixTVUJMQU5HX0RFRkFVTFQpLCAgMTI1MiwgODY1LCAmYW1wO21haW5fa2V5X05PfSwKLi4uCjwvcHJvZ3JhbWxpc3Rpbmc+CjxwYXJhPgpBZnRlciB5b3UgaGF2ZSBhZGRlZCB5b3VyIHRhYmxlLCByZWNvbXBpbGUgV2luZSBhbmQgdGVzdCB0aGF0Cml0IHdvcmtzLiBJZiBpdCBmYWlscyB0byBkZXRlY3QgeW91ciB0YWJsZSwgdHJ5IHJ1bm5pbmcKPC9wYXJhPgo8c2NyZWVuPgp3aW5lIC0tZGVidWdtc2cgK2tleSwra2V5Ym9hcmQgPiYga2V5LmxvZwogICAgICA8L3NjcmVlbj4KICAgICAgPHBhcmE+CiAgICAgICAgYW5kIGxvb2sgaW4gdGhlIHJlc3VsdGluZyA8ZmlsZW5hbWU+a2V5LmxvZzwvZmlsZW5hbWU+IGZpbGUgdG8KICAgICAgICBmaW5kIHRoZSBlcnJvciBtZXNzYWdlcyBpdCBnaXZlcyBmb3IgeW91ciBsYXlvdXQuCiAgICAgIDwvcGFyYT4KICAgICAgPHBhcmE+CiAgICAgICAgTm90ZSB0aGF0IHRoZSA8Y29uc3RhbnQ+TEFOR18qPC9jb25zdGFudD4gYW5kCiAgICAgICAgPGNvbnN0YW50PlNVQkxBTkdfKjwvY29uc3RhbnQ+IGRlZmluaXRpb25zIGFyZSBpbgogICAgICAgIDxmaWxlbmFtZT5pbmNsdWRlL3dpbm5scy5oPC9maWxlbmFtZT4sIHdoaWNoIHlvdSBtaWdodCBuZWVkIHRvCiAgICAgICAga25vdyB0byBmaW5kIG91dCB3aGljaCBudW1iZXJzIHlvdXIgbGFuZ3VhZ2UgaXMgYXNzaWduZWQsIGFuZAogICAgICAgIGZpbmQgaXQgaW4gdGhlIGRlYnVnbXNnIG91dHB1dC4gVGhlIG51bWJlcnMgd2lsbCBiZQogICAgICAgIDxsaXRlcmFsPihTVUJMQU5HICogMHg0MDAgKyBMQU5HKTwvbGl0ZXJhbD4sIHNvLCBmb3IgZXhhbXBsZQogICAgICAgIHRoZSBjb21iaW5hdGlvbiA8bGl0ZXJhbD5MQU5HX05PUldFR0lBTiAoMHgxNCk8L2xpdGVyYWw+IGFuZAogICAgICAgIDxsaXRlcmFsPlNVQkxBTkdfREVGQVVMVCAoMHgxKTwvbGl0ZXJhbD4gd2lsbCBiZSAoaW4gaGV4KQogICAgICAgIDxsaXRlcmFsPjE0ICsgMSo0MDAgPSA0MTQ8L2xpdGVyYWw+LCBzbyBzaW5jZSBJJ20gTm9yd2VnaWFuLCBJCiAgICAgICAgY291bGQgbG9vayBmb3IgPGxpdGVyYWw+MDQxNDwvbGl0ZXJhbD4gaW4gdGhlIGRlYnVnbXNnIG91dHB1dAogICAgICAgIHRvIGZpbmQgb3V0IHdoeSBteSBrZXlib2FyZCB3b24ndCBkZXRlY3QuCiAgICAgIDwvcGFyYT4KICAgICAgPHBhcmE+CiAgICAgICAgT25jZSBpdCB3b3Jrcywgc3VibWl0IGl0IHRvIHRoZSBXaW5lIHByb2plY3QuIElmIHlvdSB1c2UgQ1ZTLAogICAgICAgIHlvdSB3aWxsIGp1c3QgaGF2ZSB0byBkbwogICAgICA8L3BhcmE+CiAgICAgIDxzY3JlZW4+CmN2cyAtejMgZGlmZiAtdSBkbGxzL3gxMWRydi9rZXlib2FyZC5jID4gbGF5b3V0LmRpZmYKICAgICAgPC9zY3JlZW4+CiAgICAgIDxwYXJhPgogICAgICAgIGZyb20geW91ciBtYWluIFdpbmUgZGlyZWN0b3J5LCB0aGVuIHN1Ym1pdAogICAgICAgIDxmaWxlbmFtZT5sYXlvdXQuZGlmZjwvZmlsZW5hbWU+IHRvCiAgICAgICAgPGVtYWlsPndpbmUtcGF0Y2hlc0B3aW5laHEub3JnPC9lbWFpbD4gYWxvbmcgd2l0aCBhIGJyaWVmIG5vdGUKICAgICAgICBvZiB3aGF0IGl0IGlzLgogICAgICA8L3BhcmE+CiAgICAgIDxwYXJhPgogICAgICAgIElmIHlvdSBkb24ndCB1c2UgQ1ZTLCB5b3UgbmVlZCB0byBkbwogICAgICA8L3BhcmE+CiAgICAgIDxzY3JlZW4+CmRpZmYgLXUgdGhlX2JhY2t1cF9maWxlX3lvdV9tYWRlIGRsbHMveDExZHJ2L2tleWJvYXJkLmMgPiBsYXlvdXQuZGlmZgogICAgICA8L3NjcmVlbj4KICAgICAgPHBhcmE+CiAgICAgICAgYW5kIHN1Ym1pdCBpdCBhcyBleHBsYWluZWQgYWJvdmUuCiAgICAgIDwvcGFyYT4KICAgICAgPHBhcmE+CiAgICAgICAgSWYgeW91IGRpZCBpdCByaWdodCwgaXQgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgbmV4dCBXaW5lCiAgICAgICAgcmVsZWFzZSwgYW5kIGFsbCB0aGUgdHJvdWJsZXNvbWUgcHJvZ3JhbXMgKGVzcGVjaWFsbHkKICAgICAgICByZW1vdGUtY29udHJvbCBwcm9ncmFtcykgYW5kIGdhbWVzIHRoYXQgdXNlIHNjYW5jb2RlcyB3aWxsCiAgICAgICAgYmUgaGFwcGlseSB1c2luZyB5b3VyIGtleWJvYXJkIGxheW91dCwgYW5kIHlvdSB3b24ndCBnZXQgdGhvc2UKICAgICAgICBhbm5veWluZyBmaXhtZSBtZXNzYWdlcyBlaXRoZXIuCiAgICAgIDwvcGFyYT4KICAgIDwvc2VjdDE+CgoKICAgIDxzZWN0MSBpZD0idW5kb2MtZnVuYyI+CiAgICAgIDx0aXRsZT5VbmRvY3VtZW50ZWQgQVBJczwvdGl0bGU+CgoJPHBhcmE+CgkgIFNvbWUgYmFja2dyb3VuZDogIE9uIHRoZSBpMzg2IGNsYXNzIG9mIG1hY2hpbmVzLCBzdGFjayBlbnRyaWVzIGFyZQoJICB1c3VhbGx5IGR3b3JkICg0IGJ5dGVzKSBpbiBzaXplLCBsaXR0bGUtZW5kaWFuLiAgVGhlIHN0YWNrIGdyb3dzCgkgIGRvd253YXJkIGluIG1lbW9yeS4gIFRoZSBzdGFjayBwb2ludGVyLCBtYWludGFpbmVkIGluIHRoZSAKCSAgPGxpdGVyYWw+ZXNwPC9saXRlcmFsPiByZWdpc3RlciwgcG9pbnRzIHRvIHRoZSBsYXN0IHZhbGlkIGVudHJ5OyAKCSAgdGh1cywgdGhlIG9wZXJhdGlvbiBvZiBwdXNoaW5nIGEgdmFsdWUgb250byB0aGUgc3RhY2sgaW52b2x2ZXMgCgkgIGRlY3JlbWVudGluZyA8bGl0ZXJhbD5lc3A8L2xpdGVyYWw+IGFuZCB0aGVuIG1vdmluZyB0aGUgdmFsdWUgaW50byAKCSAgdGhlIG1lbW9yeSBwb2ludGVkIHRvIGJ5IDxsaXRlcmFsPmVzcDwvbGl0ZXJhbD4KCSAgKGkuZS4sIDxsaXRlcmFsPnB1c2ggcDwvbGl0ZXJhbD4gaW4gYXNzZW1ibHkgcmVzZW1ibGVzIAoJICA8bGl0ZXJhbD4qKC0tZXNwKSA9IHA7PC9saXRlcmFsPiBpbiBDKS4gIFJlbW92aW5nIChwb3BwaW5nKQoJICB2YWx1ZXMgb2ZmIHRoZSBzdGFjayBpcyB0aGUgcmV2ZXJzZSAoaS5lLiwgPGxpdGVyYWw+cG9wIHA8L2xpdGVyYWw+IAoJICBjb3JyZXNwb25kcyB0byA8bGl0ZXJhbD5wID0gKihlc3ArKyk7PC9saXRlcmFsPiBpbiBDKS4KCTwvcGFyYT4KCgk8cGFyYT4KCSAgSW4gdGhlIDxsaXRlcmFsPnN0ZGNhbGw8L2xpdGVyYWw+IGNhbGxpbmcgY29udmVudGlvbiwgYXJndW1lbnRzIGFyZSAKCSAgcHVzaGVkIG9udG8gdGhlIHN0YWNrIHJpZ2h0LXRvLWxlZnQuICBGb3IgZXhhbXBsZSwgdGhlIEMgY2FsbAoJICA8ZnVuY3Rpb24+bXlmdW5jdGlvbig0MCwgMjAsIDcwLCAzMCk7PC9mdW5jdGlvbj4gaXMgZXhwcmVzc2VkIGluIAoJICBJbnRlbCBhc3NlbWJseSBhczoKCSAgPHNjcmVlbj4KICAgIHB1c2ggMzAKICAgIHB1c2ggNzAKICAgIHB1c2ggMjAKICAgIHB1c2ggNDAKICAgIGNhbGwgbXlmdW5jdGlvbgoJICA8L3NjcmVlbj4KCSAgVGhlIGNhbGxlZCBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgcmVtb3ZpbmcgdGhlIGFyZ3VtZW50cyAKCSAgb2ZmIHRoZSBzdGFjay4gIFRodXMsIGJlZm9yZSB0aGUgY2FsbCB0byBteWZ1bmN0aW9uLCB0aGUKCSAgc3RhY2sgd291bGQgbG9vayBsaWtlOgoJICA8c2NyZWVuPgogICAgICAgICAgICAgW2xvY2FsIHZhcmlhYmxlIG9yIHRlbXBvcmFyeV0KICAgICAgICAgICAgIFtsb2NhbCB2YXJpYWJsZSBvciB0ZW1wb3JhcnldCiAgICAgICAgICAgICAgMzAKICAgICAgICAgICAgICA3MAogICAgICAgICAgICAgIDIwCiAgICBlc3AgLT4gICAgNDAKCSAgPC9zY3JlZW4+CgkgIEFmdGVyIHRoZSBjYWxsIHJldHVybnMsIGl0IHNob3VsZCBsb29rIGxpa2U6CgkgIDxzY3JlZW4+CiAgICAgICAgICAgICBbbG9jYWwgdmFyaWFibGUgb3IgdGVtcG9yYXJ5XQogICAgZXNwIC0+ICAgW2xvY2FsIHZhcmlhYmxlIG9yIHRlbXBvcmFyeV0KCSAgPC9zY3JlZW4+Cgk8L3BhcmE+CgoJPHBhcmE+CgkgIFRvIHJlc3RvcmUgdGhlIHN0YWNrIHRvIHRoaXMgc3RhdGUsIHRoZSBjYWxsZWQgZnVuY3Rpb24gbXVzdCBrbm93IGhvdwoJICBtYW55IGFyZ3VtZW50cyB0byByZW1vdmUgKHdoaWNoIGlzIHRoZSBudW1iZXIgb2YgYXJndW1lbnRzIGl0IHRha2VzKS4KCSAgVGhpcyBpcyBhIHByb2JsZW0gaWYgdGhlIGZ1bmN0aW9uIGlzIHVuZG9jdW1lbnRlZC4KCTwvcGFyYT4KCgk8cGFyYT4KCSAgT25lIHdheSB0byBhdHRlbXB0IHRvIGRvY3VtZW50IHRoZSBudW1iZXIgb2YgYXJndW1lbnRzIGVhY2ggZnVuY3Rpb24KCSAgdGFrZXMgaXMgdG8gY3JlYXRlIGEgd3JhcHBlciBhcm91bmQgdGhhdCBmdW5jdGlvbiB0aGF0IGRldGVjdHMgdGhlCgkgIHN0YWNrIG9mZnNldC4gIEVzc2VudGlhbGx5LCBlYWNoIHdyYXBwZXIgYXNzdW1lcyB0aGF0IHRoZSBmdW5jdGlvbiB3aWxsIAoJICB0YWtlIGEgbGFyZ2UgbnVtYmVyIG9mIGFyZ3VtZW50cy4gIFRoZSB3cmFwcGVyIGNvcGllcyBlYWNoIG9mIHRoZXNlIAoJICBhcmd1bWVudHMgaW50byBpdHMgc3RhY2ssIGNhbGxzIHRoZSBhY3R1YWwgZnVuY3Rpb24sIGFuZCB0aGVuIGNhbGN1bGF0ZXMgCgkgIHRoZSBudW1iZXIgb2YgYXJndW1lbnRzIGJ5IGNoZWNraW5nIGVzcCBiZWZvcmUgYW5kIGFmdGVyIHRoZSBjYWxsLgoJPC9wYXJhPgoKCTxwYXJhPgoJICBUaGUgbWFpbiBwcm9ibGVtIHdpdGggdGhpcyBzY2hlbWUgaXMgdGhhdCB0aGUgZnVuY3Rpb24gbXVzdCBhY3R1YWxseQoJICBiZSBjYWxsZWQgZnJvbSBhbm90aGVyIHByb2dyYW0uICBNYW55IG9mIHRoZXNlIGZ1bmN0aW9ucyBhcmUgc2VsZG9tCgkgIHVzZWQuICBBbiBhdHRlbXB0IHdhcyBtYWRlIHRvIGFnZ3Jlc3NpdmVseSBxdWVyeSBlYWNoIGZ1bmN0aW9uIGluIGEKCSAgZ2l2ZW4gbGlicmFyeSAoPGZpbGVuYW1lPm50ZGxsLmRsbDwvZmlsZW5hbWU+KSBieSBwYXNzaW5nIDY0IGFyZ3VtZW50cywgCgkgIGFsbCAwLCB0byBlYWNoIGZ1bmN0aW9uLiAgVW5mb3J0dW5hdGVseSwgV2luZG93cyBOVCBxdWlja2x5IGdvZXMgdG8gYSAKCSAgYmx1ZSBzY3JlZW4gb2YgZGVhdGgsIGV2ZW4gaWYgdGhlIHByb2dyYW0gaXMgcnVuIGZyb20gYSAKCSAgbm9uLWFkbWluaXN0cmF0b3IgYWNjb3VudC4KCTwvcGFyYT4KCgk8cGFyYT4KCSAgQW5vdGhlciBtZXRob2QgdGhhdCBoYXMgYmVlbiBtdWNoIG1vcmUgc3VjY2Vzc2Z1bCBpcyB0byBhdHRlbXB0IHRvCgkgIGZpZ3VyZSBvdXQgaG93IG1hbnkgYXJndW1lbnRzIGVhY2ggZnVuY3Rpb24gaXMgcmVtb3ZpbmcgZnJvbSB0aGUKCSAgc3RhY2suICBUaGlzIGluc3RydWN0aW9uLCA8bGl0ZXJhbD5yZXQgaGhsbDwvbGl0ZXJhbD4gKHdoZXJlIAoJICA8c3ltYm9sPmhobGw8L3N5bWJvbD4gaXMgdGhlIG51bWJlciBvZiBieXRlcyB0byByZW1vdmUsIGkuZS4gdGhlIAoJICBudW1iZXIgb2YgYXJndW1lbnRzIHRpbWVzIDQpLCBjb250YWlucyB0aGUgYnl0ZXMgCgkgIDxsaXRlcmFsPjB4YzIgbGwgaGg8L2xpdGVyYWw+IGluIG1lbW9yeS4gIEl0IGlzIGEgcmVhc29uYWJsZQoJICBhc3N1bXB0aW9uIHRoYXQgZmV3LCBpZiBhbnksIGZ1bmN0aW9ucyB0YWtlIG1vcmUgdGhhbiAxNiBhcmd1bWVudHM7IAoJICB0aGVyZWZvcmUsIHNpbXBseSBzZWFyY2hpbmcgZm9yIAoJICA8bGl0ZXJhbD5oaCA9PSAwICYmIGxsICZsdDsgMHg0MDwvbGl0ZXJhbD4gIHN0YXJ0aW5nIGZyb20gdGhlIAoJICBhZGRyZXNzIG9mIGEgZnVuY3Rpb24geWllbGRzIHRoZSBjb3JyZWN0IG51bWJlciBvZiBhcmd1bWVudHMgbW9zdCAKCSAgb2YgdGhlIHRpbWUuCgk8L3BhcmE+CgoJPHBhcmE+CgkgIE9mIGNvdXJzZSwgdGhpcyBpcyBub3Qgd2l0aG91dCBlcnJvcnMuIDxsaXRlcmFsPnJldCAwMGxsPC9saXRlcmFsPiAKCSAgaXMgbm90IHRoZSBvbmx5IGluc3RydWN0aW9uIHRoYXQgY2FuIGhhdmUgdGhlIGJ5dGUgc2VxdWVuY2UgCgkgIDxsaXRlcmFsPjB4YzIgbGwgMHgwPC9saXRlcmFsPjsgZm9yIGV4YW1wbGUsIAoJICA8bGl0ZXJhbD5wdXNoIDB4MDAwMDQwYzI8L2xpdGVyYWw+IGhhcyB0aGUgYnl0ZSBzZXF1ZW5jZQoJICA8bGl0ZXJhbD4weDY4IDB4YzIgMHg0MCAweDAgMHgwPC9saXRlcmFsPiwgd2hpY2ggbWF0Y2hlcyAKCSAgdGhlIGFib3ZlLiAgUHJvcGVybHksIHRoZSB1dGlsaXR5IHNob3VsZCBsb29rIGZvciB0aGlzIHNlcXVlbmNlIAoJICBvbmx5IG9uIGFuIGluc3RydWN0aW9uIGJvdW5kYXJ5OyB1bmZvcnR1bmF0ZWx5LCBmaW5kaW5nIAoJICBpbnN0cnVjdGlvbiBib3VuZGFyaWVzIG9uIGFuIGkzODYgcmVxdWlyZXMgaW1wbGVtZW50aW5nIGEgZnVsbCAKCSAgZGlzYXNzZW1ibGVyIC0tIHF1aXRlIGEgZGF1bnRpbmcgdGFzay4gIEJlc2lkZXMsIHRoZSBwcm9iYWJpbGl0eSAKCSAgb2YgaGF2aW5nIHN1Y2ggYSBieXRlIHNlcXVlbmNlIHRoYXQgaXMgbm90IHRoZSBhY3R1YWwgcmV0dXJuIAoJICBpbnN0cnVjdGlvbiBpcyBmYWlybHkgbG93LgoJPC9wYXJhPgoKCTxwYXJhPgoJICBNdWNoIG1vcmUgdHJvdWJsZXNvbWUgaXMgdGhlIG5vbi1saW5lYXIgZmxvdyBvZiBhIGZ1bmN0aW9uLiAgRm9yCgkgIGV4YW1wbGUsIGNvbnNpZGVyIHRoZSBmb2xsb3dpbmcgdHdvIGZ1bmN0aW9uczoKCSAgPHNjcmVlbj4KICAgIHNvbWVmdW5jdGlvbjE6CiAgICAgICAgam1wICBzb21lZnVuY3Rpb24xX2ltcGwKCiAgICBzb21lZnVuY3Rpb24yOgogICAgICAgIHJldCAgMDAwNAoKICAgIHNvbWVmdW5jdGlvbjFfaW1wbDoKICAgICAgICByZXQgIDAwMDgKCSAgPC9zY3JlZW4+CgkgIEluIHRoaXMgY2FzZSwgd2Ugd291bGQgaW5jb3JyZWN0bHkgZGV0ZWN0IGJvdGggCgkgIDxmdW5jdGlvbj5zb21lZnVuY3Rpb24xPC9mdW5jdGlvbj4gYW5kCgkgIDxmdW5jdGlvbj5zb21lZnVuY3Rpb24yPC9mdW5jdGlvbj4gYXMgdGFraW5nIG9ubHkgYSBzaW5nbGUgCgkgIGFyZ3VtZW50LCB3aGVyZWFzIDxmdW5jdGlvbj5zb21lZnVuY3Rpb24xPC9mdW5jdGlvbj4gcmVhbGx5IAoJICB0YWtlcyB0d28gYXJndW1lbnRzLgoJPC9wYXJhPgoKCTxwYXJhPgoJICBXaXRoIHRoZXNlIGxpbWl0YXRpb25zIGluIG1pbmQsIGl0IGlzIHBvc3NpYmxlIHRvIGltcGxlbWVudCBtb3JlIHN0dWJzCgkgIGluIFdpbmUgYW5kLCBldmVudHVhbGx5LCB0aGUgZnVuY3Rpb25zIHRoZW1zZWx2ZXMuCgk8L3BhcmE+CiAgICA8L3NlY3QxPgoKICAgIDxzZWN0MSBpZD0iYWNjZWwtaW1wbCI+CiAgICAgIDx0aXRsZT5BY2NlbGVyYXRvcnM8L3RpdGxlPgoKICAgICAgPHBhcmE+CiAgICAgICAgVGhlcmUgYXJlIDxlbXBoYXNpcz50aHJlZTwvZW1waGFzaXM+IGRpZmZlcmVudGx5IHNpemVkCiAgICAgICAgYWNjZWxlcmF0b3Igc3RydWN0dXJlcyBleHBvc2VkIHRvIHRoZSB1c2VyOiAKICAgICAgPC9wYXJhPgogICAgICA8b3JkZXJlZGxpc3Q+CiAgICAgICAgPGxpc3RpdGVtPgogICAgICAgICAgPHBhcmE+CiAgICAgICAgICAgIEFjY2VsZXJhdG9ycyBpbiBORSByZXNvdXJjZXMuICBUaGlzIGlzIGFsc28gdGhlIGludGVybmFsCiAgICAgICAgICAgIGxheW91dCBvZiB0aGUgZ2xvYmFsIGhhbmRsZSA8dHlwZT5IQUNDRUw8L3R5cGU+ICgxNiBhbmQKICAgICAgICAgICAgMzIpIGluIFdpbmRvd3MgOTUgYW5kIFdpbmUuIEV4cG9zZWQgdG8gdGhlIHVzZXIgYXMgV2luMTYKICAgICAgICAgICAgZ2xvYmFsIGhhbmRsZXMgPHR5cGU+SEFDQ0VMMTY8L3R5cGU+IGFuZAogICAgICAgICAgICA8dHlwZT5IQUNDRUwzMjwvdHlwZT4gYnkgdGhlIFdpbjE2L1dpbjMyIEFQSS4KCSAgICBUaGVzZSBhcmUgNSBieXRlcyBsb25nLCB3aXRoIG5vIHBhZGRpbmc6CiAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZz4KQllURSAgIGZWaXJ0OwpXT1JEICAga2V5OwpXT1JEICAgY21kOwogICAgICAgICAgICA8L3Byb2dyYW1saXN0aW5nPgogICAgICAgICAgPC9wYXJhPgogICAgICAgIDwvbGlzdGl0ZW0+CiAgICAgICAgPGxpc3RpdGVtPgogICAgICAgICAgPHBhcmE+CiAgICAgICAgICAgIEFjY2VsZXJhdG9ycyBpbiBQRSByZXNvdXJjZXMuIFRoZXkgYXJlIGV4cG9zZWQgdG8gdGhlIHVzZXIgCgkgICAgb25seSBieSBkaXJlY3QgYWNjZXNzaW5nIFBFIHJlc291cmNlcy4gCgkgICAgVGhlc2UgaGF2ZSBhIHNpemUgb2YgOCBieXRlczoKICAgICAgICAgIDwvcGFyYT4KICAgICAgICAgIDxwcm9ncmFtbGlzdGluZz4KQllURSAgIGZWaXJ0OwpCWVRFICAgcGFkMDsKV09SRCAgIGtleTsKV09SRCAgIGNtZDsKV09SRCAgIHBhZDE7CiAgICAgICAgICA8L3Byb2dyYW1saXN0aW5nPgogICAgICAgIDwvbGlzdGl0ZW0+CiAgICAgICAgPGxpc3RpdGVtPgogICAgICAgICAgPHBhcmE+CiAgICAgICAgICAgIEFjY2VsZXJhdG9ycyBpbiB0aGUgV2luMzIgQVBJLiAgVGhlc2UgYXJlIGV4cG9zZWQgdG8gdGhlIAogICAgICAgICAgICB1c2VyIGJ5IHRoZSAgPGZ1bmN0aW9uPkNvcHlBY2NlbGVyYXRvclRhYmxlPC9mdW5jdGlvbj4KCSAgICBhbmQgIDxmdW5jdGlvbj5DcmVhdGVBY2NlbGVyYXRvclRhYmxlPC9mdW5jdGlvbj4gZnVuY3Rpb25zCgkgICAgaW4gdGhlIFdpbjMyIEFQSS4KCSAgICBUaGVzZSBoYXZlIGEgc2l6ZSBvZiA2IGJ5dGVzOgogICAgICAgICAgPC9wYXJhPgogICAgICAgICAgPHByb2dyYW1saXN0aW5nPgpCWVRFICAgZlZpcnQ7CkJZVEUgICBwYWQwOwpXT1JEICAga2V5OwpXT1JEICAgY21kOwogICAgICAgICAgPC9wcm9ncmFtbGlzdGluZz4KICAgICAgICA8L2xpc3RpdGVtPgogICAgICA8L29yZGVyZWRsaXN0PgoKICAgICAgPHBhcmE+CiAgICAgICAgV2h5IHR3byB0eXBlcyBvZiBhY2NlbGVyYXRvcnMgaW4gdGhlIFdpbjMyIEFQST8gV2UgY2FuIG9ubHkKICAgICAgICBndWVzcywgYnV0IG15IGJlc3QgYmV0IGlzIHRoYXQgdGhlIFdpbjMyIHJlc291cmNlIGNvbXBpbGVyCiAgICAgICAgY2FuL2RvZXMgbm90IGhhbmRsZSBzdHJ1Y3QgcGFja2luZy4gV2luMzIgPHR5cGU+QUNDRUw8L3R5cGU+CiAgICAgICAgaXMgZGVmaW5lZCB1c2luZyA8ZnVuY3Rpb24+I3ByYWdtYSgyKTwvZnVuY3Rpb24+IGZvciB0aGUKICAgICAgICBjb21waWxlciBidXQgd2l0aG91dCBhbnkgcGFja2luZyBmb3IgUkMsIHNvIGl0IHdpbGwgYXNzdW1lCiAgICAgICAgPGZ1bmN0aW9uPiNwcmFnbWEoNCk8L2Z1bmN0aW9uPi4KICAgICAgPC9wYXJhPgoKICAgIDwvc2VjdDE+CgogICAgPHNlY3QxIGlkPSJoYXJkd2FyZS10cmFjZSI+CiAgICAgIDx0aXRsZT5Eb2luZyBBIEhhcmR3YXJlIFRyYWNlPC90aXRsZT4KCiAgICAgIDxwYXJhPgogICAgICAgIFRoZSBwcmltYXJ5IHJlYXNvbiB0byBkbyB0aGlzIGlzIHRvIHJldmVyc2UgZW5naW5lZXIgYQogICAgICAgIGhhcmR3YXJlIGRldmljZSBmb3Igd2hpY2ggeW91IGRvbid0IGhhdmUgZG9jdW1lbnRhdGlvbiwgYnV0CiAgICAgICAgY2FuIGdldCB0byB3b3JrIHVuZGVyIFdpbmUuCiAgICAgIDwvcGFyYT4KICAgICAgPHBhcmE+CiAgICAgICAgVGhpcyBsb3QgaXMgYWltZWQgYXQgcGFyYWxsZWwgcG9ydCBkZXZpY2VzLCBhbmQgaW4gcGFydGljdWxhcgogICAgICAgIHBhcmFsbGVsIHBvcnQgc2Nhbm5lcnMgd2hpY2ggYXJlIG5vdyBzbyBjaGVhcCB0aGV5IGFyZQogICAgICAgIHZpcnR1YWxseSBiZWluZyBnaXZlbiBhd2F5LiBUaGUgcHJvYmxlbSBpcyB0aGF0IGZldwogICAgICAgIG1hbnVmYWN0dXJlcyB3aWxsIHJlbGVhc2UgYW55IHByb2dyYW1taW5nIGluZm9ybWF0aW9uIHdoaWNoCiAgICAgICAgcHJldmVudHMgZHJpdmVycyBiZWluZyB3cml0dGVuIGZvciBTYW5lLCBhbmQgdGhlIHRyYWRpdGlvbmFsCiAgICAgICAgdGVjaG5pcXVlIG9mIHVzaW5nIERPU2VtdSB0byBwcm9kdWNlIHRoZSB0cmFjZXMgZG9lcyBub3Qgd29yawogICAgICAgIGFzIHRoZSBzY2FubmVycyBpbnZhcmlhYmx5IG9ubHkgaGF2ZSBkcml2ZXJzIGZvciBXaW5kb3dzLgogICAgICA8L3BhcmE+CiAgICAgIDxwYXJhPgogICAgICAgIFByZXN1bWluZyB0aGF0IHlvdSBoYXZlIGNvbXBpbGVkIGFuZCBpbnN0YWxsZWQgd2luZSB0aGUgZmlyc3QKICAgICAgICB0aGluZyB0byBkbyBpcyBpcyB0byBlbmFibGUgZGlyZWN0IGhhcmR3YXJlIGFjY2VzcyB0byB5b3VyCiAgICAgICAgcGFyYWxsZWwgcG9ydC4gVG8gZG8gdGhpcyBlZGl0IDxmaWxlbmFtZT5jb25maWc8L2ZpbGVuYW1lPgogICAgICAgICh1c3VhbGx5IGluIDxmaWxlbmFtZT5+Ly53aW5lLzwvZmlsZW5hbWU+KSBhbmQgaW4gdGhlCiAgICAgICAgcG9ydHMgc2VjdGlvbiBhZGQgdGhlIGZvbGxvd2luZyB0d28gbGluZXMKICAgICAgPC9wYXJhPgogICAgICA8cHJvZ3JhbWxpc3Rpbmc+CnJlYWQ9MHgzNzgsMHgzNzksMHgzN2EsMHgzN2MsMHg3N2EKd3JpdGU9MHgzNzgseDM3OSwweDM3YSwweDM3YywweDc3YQogICAgICA8L3Byb2dyYW1saXN0aW5nPgogICAgICA8cGFyYT4KICAgICAgICBUaGlzIGFkZHMgdGhlIG5lY2Vzc2FyeSBhY2Nlc3MgcmVxdWlyZWQgZm9yIFNQUC9QUzIvRVBQL0VDUAogICAgICAgIHBhcmFsbGVsIHBvcnQgb24gTFBUMS4gWW91IHdpbGwgbmVlZCB0byBhZGp1c3QgdGhlc2UgbnVtYmVyCiAgICAgICAgYWNjb3JkaW5nbHkgaWYgeW91ciBwYXJhbGxlbCBwb3J0IGlzIG9uIExQVDIgb3IgTFBUMC4KICAgICAgPC9wYXJhPgogICAgICA8cGFyYT4KICAgICAgICBXaGVuIHN0YXJ0aW5nIHdpbmUgdXNlIHRoZSBmb2xsb3dpbmcgY29tbWFuZCBsaW5lLCB3aGVyZQogICAgICAgIDxsaXRlcmFsPlhYWFg8L2xpdGVyYWw+IGlzIHRoZSBwcm9ncmFtIHlvdSBuZWVkIHRvIHJ1biBpbgogICAgICAgIG9yZGVyIHRvIGFjY2VzcyB5b3VyIHNjYW5uZXIsIGFuZCA8bGl0ZXJhbD5ZWVlZPC9saXRlcmFsPiBpcwogICAgICAgIHRoZSBmaWxlIHlvdXIgdHJhY2Ugd2lsbCBiZSBzdG9yZWQgaW46CiAgICAgIDwvcGFyYT4KICAgICAgPHByb2dyYW1saXN0aW5nPgp3aW5lIC1kZWJ1Z21zZyAraW8gWFhYWCAyJmd0OyAmZ3Q7KHNlZCAncy9eW146XSo6aW86W14gXSogLy8nICZndDsgWVlZWSkKICAgICAgPC9wcm9ncmFtbGlzdGluZz4KICAgICAgPHBhcmE+CiAgICAgICAgWW91IHdpbGwgbmVlZCBsYXJnZSBhbW91bnRzIG9mIGhhcmQgZGlzayBzcGFjZSAocmVhZCBodW5kcmVkcwogICAgICAgIG9mIG1lZ2FieXRlcyBpZiB5b3UgZG8gYSBmdWxsIHBhZ2Ugc2NhbiksIGFuZCBmb3IgcmVhc29uYWJsZQogICAgICAgIHBlcmZvcm1hbmNlIGEgcmVhbGx5IGZhc3QgcHJvY2Vzc29yIGFuZCBsb3RzIG9mIFJBTS4KICAgICAgPC9wYXJhPgogICAgICA8cGFyYT4KCVlvdSB3aWxsIG5lZWQgdG8gcG9zdHByb2Nlc3MgdGhlIG91dHB1dCBpbnRvIGEgbW9yZSBtYW5hZ2VhYmxlCglmb3JtYXQsIHVzaW5nIHRoZSA8Y29tbWFuZD5zaHJpbms8L2NvbW1hbmQ+IHByb2dyYW0uIEZpcnN0CiAgICAgICAgeW91IG5lZWQgdG8gY29tcGlsZSB0aGUgc291cmNlICh3aGljaCBpcyBsb2NhdGVkIGF0IHRoZSBlbmQgb2YKCXRoaXMgc2VjdGlvbik6CiAgICAgIDxwcm9ncmFtbGlzdGluZz4KY2Mgc2hyaW5rLmMgLW8gc2hyaW5rCiAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+CiAgICAgIDwvcGFyYT4KICAgICAgPHBhcmE+CiAgICAgICAgVXNlIHRoZSA8Y29tbWFuZD5zaHJpbms8L2NvbW1hbmQ+IHByb2dyYW0gdG8gcmVkdWNlIHRoZQogICAgICAgIHBoeXNpY2FsIHNpemUgb2YgdGhlIHJhdyBsb2cgYXMgZm9sbG93czoKICAgICAgPC9wYXJhPgogICAgICA8cHJvZ3JhbWxpc3Rpbmc+CmNhdCBsb2cgfCBzaHJpbmsgJmd0OyBsb2cyCiAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+CiAgICAgIDxwYXJhPgogICAgICAgIFRoZSB0cmFjZSBoYXMgdGhlIGJhc2ljIGZvcm0gb2YKICAgICAgPC9wYXJhPgogICAgICA8cHJvZ3JhbWxpc3Rpbmc+ClhYWFggJmd0OyBZWSBAIFpaWlo6WlpaWgogICAgICA8L3Byb2dyYW1saXN0aW5nPgogICAgICA8cGFyYT4KICAgICAgICB3aGVyZSA8bGl0ZXJhbD5YWFhYPC9saXRlcmFsPiBpcyB0aGUgcG9ydCBpbiBoZXhpZGVjaW1hbCBiZWluZwogICAgICAgIGFjY2Vzc2VkLCA8bGl0ZXJhbD5ZWTwvbGl0ZXJhbD4gaXMgdGhlIGRhdGEgd3JpdHRlbiAob3IgcmVhZCkKICAgICAgICBmcm9tIHRoZSBwb3J0LCBhbmQgPGxpdGVyYWw+WlpaWjpaWlpaPC9saXRlcmFsPiBpcyB0aGUgYWRkcmVzcwogICAgICAgIGluIG1lbW9yeSBvZiB0aGUgaW5zdHJ1Y3Rpb24gdGhhdCBhY2Nlc3NlZCB0aGUgcG9ydC4gVGhlCiAgICAgICAgZGlyZWN0aW9uIG9mIHRoZSBhcnJvdyBpbmRpY2F0ZXMgd2hldGhlciB0aGUgZGF0YSB3YXMgd3JpdHRlbgogICAgICAgIG9yIHJlYWQgZnJvbSB0aGUgcG9ydC4KICAgICAgPC9wYXJhPgogICAgICA8cHJvZ3JhbWxpc3Rpbmc+CiZndDsgZGF0YSB3YXMgd3JpdHRlbiB0byB0aGUgcG9ydAombHQ7IGRhdGEgd2FzIHJlYWQgZnJvbSB0aGUgcG9ydAogICAgICA8L3Byb2dyYW1saXN0aW5nPgogICAgICA8cGFyYT4KICAgICAgICBNeSBiYXNpYyB0aXAgZm9yIGludGVycHJldGluZyB0aGVzZSBsb2dzIGlzIHRvIHBheSBjbG9zZQogICAgICAgIGF0dGVudGlvbiB0byB0aGUgYWRkcmVzc2VzIG9mIHRoZSBJTyBpbnN0cnVjdGlvbnMuIFRoZWlyCiAgICAgICAgZ3JvdXBpbmcgYW5kIHNvbWV0aW1lcyBwcm94aW1pdHkgc2hvdWxkIHJldmVhbCB0aGUgcHJlc2VuY2Ugb2YKICAgICAgICBzdWJyb3V0aW5lcyBpbiB0aGUgZHJpdmVyLiBCeSBzdHVkeWluZyB0aGUgZGlmZmVyZW50IHZlcnNpb25zCiAgICAgICAgeW91IHNob3VsZCBiZSBhYmxlIHRvIHdvcmsgdGhlbSBvdXQuIEZvciBleGFtcGxlIGNvbnNpZGVyIHRoZQogICAgICAgIGZvbGxvd2luZyBzZWN0aW9uIG9mIHRyYWNlIGZyb20gbXkgVU1BWCBBc3RyYSA2MDBQCiAgICAgIDwvcGFyYT4KICAgICAgPHByb2dyYW1saXN0aW5nPgoweDM3OCAmZ3Q7IDU1IEAgMDI5NzowMWVjCjB4MzdhICZndDsgMDUgQCAwMjk3OjAxZjUKMHgzNzkgJmx0OyA4ZiBAIDAyOTc6MDFmYQoweDM3YSAmZ3Q7IDA0IEAgMDI5NzowMjExCjB4Mzc4ICZndDsgYWEgQCAwMjk3OjAxZWMKMHgzN2EgJmd0OyAwNSBAIDAyOTc6MDFmNQoweDM3OSAmbHQ7IDhmIEAgMDI5NzowMWZhCjB4MzdhICZndDsgMDQgQCAwMjk3OjAyMTEKMHgzNzggJmd0OyAwMCBAIDAyOTc6MDFlYwoweDM3YSAmZ3Q7IDA1IEAgMDI5NzowMWY1CjB4Mzc5ICZsdDsgOGYgQCAwMjk3OjAxZmEKMHgzN2EgJmd0OyAwNCBAIDAyOTc6MDIxMQoweDM3OCAmZ3Q7IDAwIEAgMDI5NzowMWVjCjB4MzdhICZndDsgMDUgQCAwMjk3OjAxZjUKMHgzNzkgJmx0OyA4ZiBAIDAyOTc6MDFmYQoweDM3YSAmZ3Q7IDA0IEAgMDI5NzowMjExCjB4Mzc4ICZndDsgMDAgQCAwMjk3OjAxZWMKMHgzN2EgJmd0OyAwNSBAIDAyOTc6MDFmNQoweDM3OSAmbHQ7IDhmIEAgMDI5NzowMWZhCjB4MzdhICZndDsgMDQgQCAwMjk3OjAyMTEKMHgzNzggJmd0OyAwMCBAIDAyOTc6MDFlYwoweDM3YSAmZ3Q7IDA1IEAgMDI5NzowMWY1CjB4Mzc5ICZsdDsgOGYgQCAwMjk3OjAxZmEKMHgzN2EgJmd0OyAwNCBAIDAyOTc6MDIxMQogICAgICA8L3Byb2dyYW1saXN0aW5nPgogICAgICA8cGFyYT4KICAgICAgICBBcyB5b3UgY2FuIHNlZSB0aGVyZSBpcyBhIHJlcGVhdGluZyBzdHJ1Y3R1cmUgc3RhcnRpbmcgYXQKICAgICAgICBhZGRyZXNzIDxsaXRlcmFsPjAyOTc6MDFlYzwvbGl0ZXJhbD4gdGhhdCBjb25zaXN0cyBvZiBmb3VyIGlvCiAgICAgICAgYWNjZXNzZXMgb24gdGhlIHBhcmFsbGVsIHBvcnQuIExvb2tpbmcgYXQgaXQgdGhlIGZpcnN0IGlvCiAgICAgICAgYWNjZXNzIHdyaXRlcyBhIGNoYW5naW5nIGJ5dGUgdG8gdGhlIGRhdGEgcG9ydCB0aGUgc2Vjb25kCiAgICAgICAgYWx3YXlzIHdyaXRlcyB0aGUgYnl0ZSA8bGl0ZXJhbD4weDA1PC9saXRlcmFsPiB0byB0aGUgY29udHJvbAogICAgICAgIHBvcnQsIHRoZW4gYSB2YWx1ZSB3aGljaCBhbHdheXMgc2VlbXMgdG8KICAgICAgICA8bGl0ZXJhbD4weDhmPC9saXRlcmFsPiBpcyByZWFkIGZyb20gdGhlIHN0YXR1cyBwb3J0IGF0IHdoaWNoCiAgICAgICAgcG9pbnQgYSBieXRlIDxsaXRlcmFsPjB4MDQ8L2xpdGVyYWw+IGlzIHdyaXR0ZW4gdG8gdGhlIGNvbnRyb2wKICAgICAgICBwb3J0LiBCeSBzdHVkeWluZyB0aGlzIGFuZCBvdGhlciBzZWN0aW9ucyBvZiB0aGUgdHJhY2Ugd2UgY2FuCiAgICAgICAgd3JpdGUgYSBDIHJvdXRpbmUgdGhhdCBlbXVsYXRlcyB0aGlzLCBzaG93biBiZWxvdyB3aXRoIHNvbWUKICAgICAgICBtYWNyb3MgdG8gbWFrZSByZWFkaW5nL3dyaXRpbmcgb24gdGhlIHBhcmFsbGVsIHBvcnQgZWFzaWVyIHRvCiAgICAgICAgcmVhZC4KICAgICAgPC9wYXJhPgogICAgICA8cHJvZ3JhbWxpc3Rpbmc+CiNkZWZpbmUgcl9kdHIoeCkgICAgICAgIGluYih4KQojZGVmaW5lIHJfc3RyKHgpICAgICAgICBpbmIoeCsxKQojZGVmaW5lIHJfY3RyKHgpICAgICAgICBpbmIoeCsyKQojZGVmaW5lIHdfZHRyKHgseSkgICAgICBvdXRiKHksIHgpCiNkZWZpbmUgd19zdHIoeCx5KSAgICAgIG91dGIoeSwgeCsxKQojZGVmaW5lIHdfY3RyKHgseSkgICAgICBvdXRiKHksIHgrMikKCi8qIFNlZW1zIHRvIGJlIHNlbmRpbmcgYSBjb21tYW5kIGJ5dGUgdG8gdGhlIHNjYW5uZXIgKi8KaW50IHVkcHBfcHV0KGludCB1ZHBwX2Jhc2UsIHVuc2lnbmVkIGNoYXIgY29tbWFuZCkKewogICAgaW50IGxvb3AsIHZhbHVlOwoKICAgIHdfZHRyKHVkcHBfYmFzZSwgY29tbWFuZCk7CiAgICB3X2N0cih1ZHBwX2Jhc2UsIDB4MDUpOwoKICAgIGZvciAobG9vcD0wOyBsb29wICZsdDsgMTA7IGxvb3ArKykKICAgICAgICBpZiAoKHZhbHVlID0gcl9zdHIodWRwcF9iYXNlKSkgJiAweDgwKSAKCXsKICAgICAgICAgICAgd19jdHIodWRwcF9iYXNlLCAweDA0KTsKICAgICAgICAgICAgcmV0dXJuIHZhbHVlICYgMHhmODsKICAgICAgICB9CgogICAgcmV0dXJuICh2YWx1ZSAmIDB4ZjgpIHwgMHgwMTsKfQogICAgICA8L3Byb2dyYW1saXN0aW5nPgogICAgICA8cGFyYT4KICAgICAgICBGb3IgdGhlIFVNQVggQXN0cmEgNjAwUCBvbmx5IHNldmVuIHN1Y2ggcm91dGluZXMgZXhpc3QgKHdlbGwKICAgICAgICAxNCByZWFsbHksIHNldmVuIGZvciBTUFAgYW5kIHNldmVuIGZvciBFUFApLiBXaGV0aGVyIHlvdQogICAgICAgIGNob29zZSB0byBkaXNhc3NlbWJsZSB0aGUgZHJpdmVyIGF0IHRoaXMgcG9pbnQgdG8gdmVyaWZ5IHRoZQogICAgICAgIHJvdXRpbmVzIGlzIHlvdXIgb3duIGNob2ljZS4gSWYgeW91IGRvLCB0aGUgYWRkcmVzcyBmcm9tIHRoZQogICAgICAgIHRyYWNlIHNob3VsZCBoZWxwIGluIGxvY2F0aW5nIHRoZW0gaW4gdGhlIGRpc2Fzc2VtYmx5LgogICAgICA8L3BhcmE+CiAgICAgIDxwYXJhPgogICAgICAgIFlvdSB3aWxsIHByb2JhYmx5IHRoZW4gZmluZCBpdCB1c2VmdWwgdG8gd3JpdGUgYSBzY3JpcHQvcGVybC9DCiAgICAgICAgcHJvZ3JhbSB0byBhbmFseXNlIHRoZSBsb2dmaWxlIGFuZCBkZWNvZGUgdGhlbSBmdXRoZXIgYXMgdGhpcwogICAgICAgIGNhbiByZXZlYWwgaGlnaGVyIGxldmVsIGdyb3VwaW5nIG9mIHRoZSBsb3cgbGV2ZWwgcm91dGluZXMuCiAgICAgICAgRm9yIGV4YW1wbGUgZnJvbSB0aGUgbG9ncyBmcm9tIG15IFVNQVggQXN0cmEgNjAwUCB3aGVuIGRlY29kZWQKICAgICAgICBmdXJ0aGVyIHJldmVhbCAodGhpcyBpcyBhIHNtYWxsIHNuaXBwZXQpCiAgICAgIDwvcGFyYT4KICAgICAgPHByb2dyYW1saXN0aW5nPgpzdGFydDoKcHV0OiA1NSA4ZgpwdXQ6IGFhIDhmCnB1dDogMDAgOGYKcHV0OiAwMCA4ZgpwdXQ6IDAwIDhmCnB1dDogYzIgOGYKd2FpdDogZmYKZ2V0OiBhZiw4Nwp3YWl0OiBmZgpnZXQ6IGFmLDg3CmVuZDogY2MKc3RhcnQ6CnB1dDogNTUgOGYKcHV0OiBhYSA4ZgpwdXQ6IDAwIDhmCnB1dDogMDMgOGYKcHV0OiAwNSA4ZgpwdXQ6IDg0IDhmCndhaXQ6IGZmCiAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+CiAgICAgIDxwYXJhPgogICAgICAgIEZyb20gdGhpcyBpdCBpcyBlYXN5IHRvIHNlZSB0aGF0IDx2YXJuYW1lPnB1dDwvdmFybmFtZT4KICAgICAgICByb3V0aW5lIGlzIG9mdGVuIGdyb3VwZWQgdG9nZXRoZXIgaW4gZml2ZSBzdWNjZXNzaXZlIGNhbGxzCiAgICAgICAgc2VuZGluZyBpbmZvcm1hdGlvbiB0byB0aGUgc2Nhbm5lci4gT25jZSB0aGVzZSBhcmUgdW5kZXJzdG9vZAogICAgICAgIGl0IHNob3VsZCBiZSBwb3NzaWJsZSB0byBwcm9jZXNzIHRoZSBsb2dzIGZ1cnRoZXIgdG8gc2hvdyB0aGUKICAgICAgICBoaWdoZXIgbGV2ZWwgcm91dGluZXMgaW4gYW4gZWFzeSB0byBzZWUgZm9ybWF0LiBPbmNlIHRoZQogICAgICAgIGhpZ2hlc3QgbGV2ZWwgZm9ybWF0IHRoYXQgeW91IGNhbiBkZXJpdmUgZnJvbSB0aGlzIHByb2Nlc3MgaXMKICAgICAgICB1bmRlcnN0b29kLCB5b3UgdGhlbiBuZWVkIHRvIHByb2R1Y2UgYSBzZXJpZXMgb2Ygc2NhbnMgdmFyeWluZwogICAgICAgIG9ubHkgb25lIHBhcmFtZXRlciBiZXR3ZWVuIHRoZW0sIHNvIHlvdSBjYW4gZGlzY292ZXIgaG93IHRvCiAgICAgICAgc2V0IHRoZSB2YXJpb3VzIHBhcmFtZXRlcnMgZm9yIHRoZSBzY2FubmVyLgogICAgICA8L3BhcmE+CgogICAgICA8cGFyYT4KICAgICAgICBUaGUgZm9sbG93aW5nIGlzIHRoZSA8ZmlsZW5hbWU+c2hyaW5rLmM8L2ZpbGVuYW1lPiBwcm9ncmFtOgogICAgICA8cHJvZ3JhbWxpc3Rpbmc+Ci8qIENvcHlyaWdodCBEYXZpZCBDYW1wYmVsbCAmbHQ7Y2FtcGJlbGxAdG9ycXVlLm5ldCZndDsgKi8KI2luY2x1ZGUgJmx0O3N0ZGlvLmgmZ3Q7CiNpbmNsdWRlICZsdDtzdHJpbmcuaCZndDsKCmludCBtYWluICh2b2lkKQp7CiAgICBjaGFyIGJ1ZmZbMjU2XSwgbGFzdGxpbmVbMjU2XSA9ICIiOwogICAgaW50IGNvdW50ID0gMDsKCiAgICB3aGlsZSAoIWZlb2YgKHN0ZGluKSkKICAgIHsKICAgICAgICBmZ2V0cyAoYnVmZiwgc2l6ZW9mIChidWZmKSwgc3RkaW4pOwogICAgICAgIGlmIChzdHJjbXAgKGJ1ZmYsIGxhc3RsaW5lKSkKCXsKCSAgICBpZiAoY291bnQgJmd0OyAxKQoJICAgICAgICBwcmludGYgKCIjIExhc3QgbGluZSByZXBlYXRlZCAlaSB0aW1lcyAjXG4iLCBjb3VudCk7CgkgICAgcHJpbnRmICgiJXMiLCBidWZmKTsKCSAgICBzdHJjcHkgKGxhc3RsaW5lLCBidWZmKTsKCSAgICBjb3VudCA9IDE7Cgl9CiAgICAgICAgZWxzZSBjb3VudCsrOwogICAgfQogICAgcmV0dXJuIDA7Cn0KICAgICAgPC9wcm9ncmFtbGlzdGluZz4KICAgICAgPC9wYXJhPgogICAgPC9zZWN0MT4KCiAgPC9jaGFwdGVyPgoKPCEtLSBLZWVwIHRoaXMgY29tbWVudCBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlCkxvY2FsIHZhcmlhYmxlczoKbW9kZTogc2dtbApzZ21sLXBhcmVudC1kb2N1bWVudDooIndpbmUtZGV2ZWwuc2dtbCIgInNldCIgImJvb2siICJwYXJ0IiAiY2hhcHRlciIgIiIpCkVuZDoKLS0+Cg==