PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KPEhUTUw+CjxoZWFkPgo8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgo8dGl0bGU+QnVpbGRpbmcgYSBEYXRhYmFzZSBTY2hlbWEgRGlhZ3JhbSBFZGl0b3Igd2l0aCBHRUY8L3RpdGxlPgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL2RlZmF1bHRfc3R5bGUuY3NzIi8+CjwvaGVhZD4KCjxCT0RZIHZMaW5rPSM4MDAwODAgbGluaz0jMDAwMEZGPgo8RElWIGFsaWduPXJpZ2h0PiZuYnNwOyA8Rk9OVCBmYWNlPSJUaW1lcyBOZXcgUm9tYW4sIFRpbWVzLCBzZXJpZiI+PEZPTlQKCXNpemU9LTE+Q29weXJpZ2h0ICZjb3B5OyAyMDA0IFJlYWxzb2x2ZSBTb2x1dGlvbnMgTHRkLjwvRk9OVD48L0ZPTlQ+PC9ESVY+CiZuYnNwOwo8RElWIGFsaWduPXJpZ2h0PiAKICA8dGFibGUgY2VsbHNwYWNpbmc9MCBjZWxscGFkZGluZz0yIHdpZHRoPSIxMDAlIiBib3JkZXI9MD4KICAgIDx0Ym9keT4KICAgICAgPHRyPiAKICAgICAgICA8dGQgdmFsaWduPXRvcCBhbGlnbj1sZWZ0IGJnY29sb3I9IzAwODBjMCBjb2xzcGFuPTI+PGI+PGZvbnQKCQkJCWZhY2U9QXJpYWwsSGVsdmV0aWNhPjxmb250IGNvbG9yPSNmZmZmZmY+Jm5ic3A7RWNsaXBzZSBDb3JuZXIgCiAgICAgICAgICBBcnRpY2xlPC9mb250PjwvZm9udD48L2I+PC90ZD4KICAgICAgPC90cj4KICAgIDwvdGJvZHk+CiAgPC90YWJsZT4KPC9ESVY+CjxIMT48SU1HIGJvcmRlcj0iMCIgc3JjPSJpbWFnZXMvSWRlYS5qcGciIHdpZHRoPSIxMjAiIGhlaWdodD0iODYiPjwvSDE+CjxDRU5URVI+CiAgPGgxPkJ1aWxkaW5nIGEgRGF0YWJhc2UgU2NoZW1hIERpYWdyYW0gRWRpdG9yPGJyPgogICAgd2l0aCBHRUY8L2gxPgo8L0NFTlRFUj4KCjxibG9ja3F1b3RlPgo8Yj5TdW1tYXJ5PC9iPgoKPGJyPgogIEdFRiBpcyBhIHZlcnkgcG93ZXJmdWwgZnJhbWV3b3JrIGZvciB2aXN1YWxseSBjcmVhdGluZyBhbmQgZWRpdGluZyBtb2RlbHMuIFdpdGggYSBzbWFsbCBpbml0aWFsIGludmVzdG1lbnQsIAogIGV2ZW4gdGhlIHJlbGF0aXZlIEVjbGlwc2Ugbm92aWNlIGNhbiBiZSBxdWlja2x5IHVwIGFuZCBydW5uaW5nLCBidWlsZGluZyBhcHBsaWNhdGlvbnMgd2l0aCBncmFwaGljYWwgZWRpdGluZyBjYXBhYmlsaXRpZXMuIAogIFRvIGlsbHVzdHJhdGUsIHRoaXMgYXJ0aWNsZSB1c2VzIGEgcmVsYXRpb25hbCBkYXRhYmFzZSBzY2hlbWEgZGlhZ3JhbSBlZGl0b3Igd2l0aCBhIGRlbGliZXJhdGVseSAKICBzaW1wbGlmaWVkIHVuZGVybHlpbmcgbW9kZWwsIGJ1dCB3aXRoIGVub3VnaCBiZWxscyBhbmQgd2hpc3RsZXMgdG8gc2hvdyBzb21lIG9mIHRoZSBpbnRlcmVzdGluZyBmZWF0dXJlcyBvZiBHRUYgYXQgd29yay4KICA8cD48Yj4gUGhpbCBab2lvLCBSZWFsc29sdmUgU29sdXRpb25zIEx0ZC48L2I+IDxicj4KICAgIDxmb250IHNpemU9Ii0xIj5TZXB0ZW1iZXIgMjcsIDIwMDQ8L2ZvbnQ+IDwvcD4KPC9ibG9ja3F1b3RlPgoKPGhyIHdpZHRoPSIxMDAlIj4KCjxoMj5JbnRyb2R1Y3Rpb248L2gyPgo8cD4KSGF2aW5nIGdyYXBoaWNhbCBlZGl0aW5nIGNhcGFiaWxpdGllcyBjYW4gYmUgYSByZWFsIGFzc2V0LCBpZiBub3QgYW4gZXNzZW50aWFsIGZlYXR1cmUsIGZvciBtYW55IHRvb2xzIGFuZCBhcHBsaWNhdGlvbnMuIEV4YW1wbGVzIGFyZSBub3QKaGFyZCB0byB0aGluayBvZjogVU1MIHRvb2xzLCBHVUkgYnVpbGRlcnMsIGluIGZhY3QsIGFueSBhcHBsaWNhdGlvbiB3aGljaCBjb21wcmlzZXMgYSBkeW5hbWljIG1vZGVsIHdoaWNoIGNhbiBiZSB2aXN1YWxpemVkLiAKV2l0aCBHRUYsIEVjbGlwc2UgZGV2ZWxvcGVycyBoYXZlIGF0IHRoZWlyIGRpc3Bvc2FsIGEgZnJhbWV3b3JrIHdoaWNoIGNhbiByZWFsbHkgc2ltcGxpZnkgZGV2ZWxvcG1lbnQgb2YgZ3JhcGhpY2FsIGVkaXRvcnMuIApUaGlzIGFydGljbGUgdXNlcyBhIHNpbXBsZSBidXQgbm9uLXRyaXZpYWwgZXhhbXBsZSB0byBzaG93IGhvdyBhIEdFRiBhcHBsaWNhdGlvbiB3b3JrcyAtIAphbmQgd2hhdCB5b3UgbmVlZCB0byBkbyB0byBnZXQgaXQgdG8gcGVyZm9ybSBpdHMgbGl0dGxlIG1pcmFjbGVzLiAKPC9wPgo8cD4KVGhlIHNjcmVlbnNob3QgYmVsb3cgc2hvd3Mgd2hhdCBvdXIgZXhhbXBsZSBlZGl0b3IgbG9va3MgbGlrZS4gClRoZSBlZGl0IGFyZWEgdXNlcyBhICJmbHlvdXQiIHBhbGV0dGUgd2hpY2ggY29udGFpbnMgc29tZSB2ZXJ5IGJhc2ljIGVudHJpZXMgYW5kIGNhbiBiZSBtaW5pbWl6ZWQgdG8gaW5jcmVhc2UgdGhlIGVkaXRhYmxlIHNjcmVlbiBhcmVhLiAKT24gdGhlIHJpZ2h0IHNpZGUgaXMgYSBzY3JvbGxhYmxlIGdyYXBoaWNhbCB2aWV3ZXIgY29udGFpbmluZyB0aGUgdGFibGVzIGFuZCB0aGVpciByZWxhdGlvbnNoaXBzLgo8L3A+CjxwPiA8aW1nIHNyYz0iaW1hZ2VzL2VkaXRvci5KUEciIGhlaWdodD02NDUgd2lkdGg9NTk3IGFsaWduPUNFTlRFUj48L3A+Cgo8cD4gPGltZyBzcmM9ImltYWdlcy90cnlpdC5naWYiIHdpZHRoPSI2MSIgaGVpZ2h0PSIxMyI+IERvd25sb2FkIGFuZCB1bnppcCB0aGUgCiAgZXhhbXBsZSBwbHVnLWluIDxhIGhyZWY9InNjaGVtYWVkaXRvci56aXAiPnNjaGVtYWVkaXRvci56aXA8L2E+IGludG8geW91ciA8aT5lY2xpcHNlLzwvaT4gCiAgZGlyZWN0b3J5LCB0aGVuIGNyZWF0ZSBhIG5ldyBkaWFncmFtIGJ5IGxhdW5jaGluZyB0aGUgd2l6YXJkIGZyb20gdGhlIEZpbGUgbWVudTogCiAgRmlsZSAtPiBOZXcgLT4gRXhhbXBsZSAuLi4gLT4gR0VGIChHcmFwaGljYWwgRWRpdGluZyBGcmFtZXdvcmspIC0+IFNjaGVtYSBEaWFncmFtIAogIEVkaXRvci4gPC9wPgogICAgCjxwPgpBdCB0aGUgaGVhcnQgb2YgR0VGIGlzIHRoZSA8Qj5Nb2RlbC1WaWV3LUNvbnRyb2xsZXI8L0I+IHBhdHRlcm4sIGRpc2N1c3NlZCBpbiBSYW5keSBIdWRzb24ncyBpbnRyb2R1Y3RvcnkgdHV0b3JpYWwgCjxpPjxhIGhyZWY9Imh0dHA6Ly93d3ctMTA2LmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWJyYXJ5L29zLWdlZi8iIHRhcmdldD0iX2JsYW5rIj5Ib3cgdG8gR2V0IFN0YXJ0ZWQgd2l0aCB0aGUgR0VGPC9hPjwvaT4sIGFuZCBhbHNvCnByb3ZpZGluZyBhIGZvY3VzIGZvciBtdWNoIG9mIHRoaXMgYXJ0aWNsZS4KPC9wPgo8aDI+VGhlIE1vZGVsPC9oMj4KPHA+ClRoZSBzdGFydGluZyBwb2ludCBmb3IgYW55IEdFRiBhcHBsaWNhdGlvbiBpcyB0aGUgbW9kZWwuIFRoaXMgaXMgd2hhdCBuZWVkcyB0byBiZSBkaXNwbGF5ZWQsIGVkaXRlZCBhbmQgcGVyc2lzdGVkLiAKT3VyIHNvbWV3aGF0IG92ZXJzaW1wbGlmaWVkIG1vZGVsIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgY2xhc3NlczoKPC9wPgo8dWw+CiAgPGxpPjxDT0RFPlRhYmxlPC9DT0RFPjogcmVwcmVzZW50cyBhIHJlbGF0aW9uYWwgZGF0YWJhc2UgdGFibGUuIFRoZSBvbmx5IGF0dHJpYnV0ZSB0aGF0IHRoZSB0YWJsZSBob2xkcyBpdHNlbGYgaXMgdGhlIG5hbWU8L2xpPgogIDxsaT48Q09ERT5Db2x1bW48L0NPREU+OiByZXByZXNlbnRzIGEgdGFibGUgY29sdW1uLiBIZXJlIHdlIGFyZSBpbnRlcmVzdGVkIGluIHRoZSBjb2x1bW4gbmFtZSBhbmQgdGhlIHR5cGUgb2YgZGF0YSwgd2hpY2ggaXRzZWxmIGNhbiBlaXRoZXIgYmUgPENPREU+VkFSQ0hBUjwvQ09ERT4gb3IgPENPREU+SU5URUdFUjwvQ09ERT48L2xpPgogIDxsaT48Q09ERT5SZWxhdGlvbnNoaXA8L0NPREU+OiByZXByZXNlbnRzIGEgcHJpbWFyeSBrZXkvZm9yZWlnbiBrZXkgcmVsYXRpb25zaGlwIGJldHdlZW4gdHdvIHRhYmxlcy4gCiAgVGhlIGZvcmVpZ24ga2V5IHRhYmxlIHdlIGRlbm90ZSB0aGUgPEI+c291cmNlPC9CPiBvZiB0aGUgcmVsYXRpb25zaGlwLCB3aGlsZSB0aGUgcHJpbWFyeSBrZXkgdGFibGUgaXMgdGhlIDxCPnRhcmdldDwvQj4uIAogIE5vdGUgdGhhdCBvdXIgbW9kZWwgYXBwbGllcyBhIHJlbGF0aW9uc2hpcCBkaXJlY3RseSBiZXR3ZWVuIHR3byB0YWJsZXMsIAogIHJhdGhlciB0aGFuIGJldHdlZW4gZm9yZWlnbiBhbmQgcHJpbWFyeSBrZXkgZmllbGRzIGluIHRoZSByZXNwZWN0aXZlIHRhYmxlcywgCiAgYXMgd2Ugd291bGQgaW4gdGhlIHJlYWwgd29ybGQ8L2xpPgogIDxsaT48Q09ERT5TY2hlbWE8L0NPREU+OiBzaW1wbHkgcmVwcmVzZW50cyBhbGwgdGhlIHRhYmxlcyB3ZSBwbGFuIHRvIGdyb3VwIHRvZ2V0aGVyIChhbmQgdWx0aW1hdGVseSBzaG93IG9uIHRoZSBzYW1lIGRpYWdyYW0pPC9saT4KPC91bD4KT3VyIG1vZGVsIGlzIGV4dHJlbWVseSBzaW1wbGUsIGJ1dCBkb2VzIGF0IGxlYXN0IGluY2x1ZGUgdGhlIHR3byBrZXkgZm9ybXMgb2YgcmVsYXRpb25zaGlwIGluIGEgdHlwaWNhbCBHRUYgbW9kZWw6Cjx1bD4KICA8bGk+VGhlIDxCPnBhcmVudC1jaGlsZDwvQj4gcmVsYXRpb25zaGlwIHRoYXQgZXhpc3RzIGJldHdlZW4gc2NoZW1hcyBhbmQgdGFibGVzLCBhbmQgYmV0d2VlbiB0YWJsZXMgYW5kIGNvbHVtbnM8L2xpPgogIDxsaT48Qj5Db25uZWN0aW9uczwvQj4gYmV0d2VlbiBkaWZmZXJlbnQgPEI+bm9kZXM8L0I+LiAKICBJbiBvdXIgZXhhbXBsZSBhcHBsaWNhdGlvbiwgdGhlIGNvbm5lY3Rpb25zIGFyZSBpbiB0aGUgZm9ybSBvZiBwcmltYXJ5IGtleS9mb3JlaWduIGtleSByZWxhdGlvbnNoaXBzLCB3aXRoIHRoZSBub2RlcyBiZWluZyB0aGUgdGFibGVzPC9saT4KPC91bD4KPHA+Ck9mIGNvdXJzZSwgd2UgbmVlZCB0byBkZWNpZGUgd2hhdCB3ZSB3YW50IG91ciBlZGl0b3IgdG8gYmUgYWJsZSB0byBkbyB3aXRoIHRoZSBtb2RlbC4gSGVyZSwgd2Ugd2FudCB0byBiZSBhYmxlIHRvOgo8L3A+Cjx1bD4KICA8bGk+bGF5IG91ciB0YWJsZXMgbmljZWx5IG9uIHRoZSBkaWFncmFtLiBUaGUgZGlhZ3JhbSBtdXN0IHNjYWxlIHRvIGFjY29tbW9kYXRlIGFueSBncm93dGggaW4gb3VyIG1vZGVsLCBhbmQgc2hvdWxkIGJlIHJlYWRhYmxlPC9saT4KICA8bGk+YWRkIG5ldyB0YWJsZXMgdG8gb3VyIHNjaGVtYSwgYW5kIG5ldyBjb2x1bW5zIHRvIG91ciB0YWJsZSwgdXNpbmcgZWl0aGVyIGRyYWcgYW5kIGRyb3Agb3IgcG9pbnQgYW5kIGNsaWNrPC9saT4KICA8bGk+ZGlyZWN0bHkgZWRpdCB0aGUgbmFtZXMgb2YgdGhlIHRhYmxlcyBhcyB3ZWxsIGFzIGJvdGggdGhlIG5hbWVzIGFuZCB0eXBlcyBvZiBvdXIgY29sdW1ucy4gSW4gYm90aCBjYXNlcywgd2Ugd2FudCB2YWxpZGF0aW9uIHRvIHRlbGwgdXMgd2hlbiB3ZSBhcmUgdHlwaW5nIGluIG5vbnNlbnNlPC9saT4gIAogIDxsaT51c2UgZHJhZyBhbmQgZHJvcCB0byBzZXQgdXAgcmVsYXRpb25zaGlwcyBiZXR3ZWVuIHRhYmxlcywgYXMgd2VsbCBhcyB0byBjaGFuZ2UgdGhlc2UgcmVsYXRpb25zaGlwczwvbGk+CiAgPGxpPnVzZSBkcmFnIGFuZCBkcm9wIHRvIG1vdmUgY29sdW1uIGRlZmluaXRpb25zIGZyb20gb25lIHRhYmxlIHRvIGFub3RoZXIsIG9yIHRvIHJlb3JkZXIgY29sdW1ucyB3aXRoaW4gdGFibGVzPC9saT4gICAgIAogIDxsaT5iZSBhYmxlIHRvIGRlbGV0ZSB0YWJsZXMsIGNvbHVtbnMgYW5kIHJlbGF0aW9uc2hpcHMgYnkgaGl0dGluZyB0aGUgZGVsZXRlIGtleTwvbGk+ICAKICA8bGk+aGF2ZSBhIGNob2ljZSBiZXR3ZWVuIG1hbnVhbGx5IGxheWluZyBvdXQgb3VyIGRpYWdyYW0sIGFuZCBoYXZpbmcgdGhpcyBkb25lIGF1dG9tYXRpY2FsbHkuIFdoZW4gdXNpbmcgbWFudWFsIGxheW91dCwgd2Ugd2FudCB0byBiZSBhYmxlIHRvCiAgc2hpZnQgb3VyIHRhYmxlcyBhcm91bmQgdXNpbmcgZHJhZyBhbmQgZHJvcDwvbGk+ICAgICAKPC91bD4KVGhlcmUgYXJlIG9mIGNvdXJzZSBtYW55IG1vcmUgdGhpbmdzIHdlIHdvdWxkIGxpa2UgdG8gYmUgYWJsZSB0byBkbyB3aXRoIG91ciBlZGl0b3IsIApidXQgd2UgaGF2ZSBlbm91Z2ggaGVyZSB0byBiZSBhYmxlIHRvIHRlc3Qgb3V0IG1hbnkgb2YgdGhlIG1vc3QgY29tbW9ubHkgdXNlZCBHRUYgZmVhdHVyZXMuCjxoMj5UaGUgVmlldzwvaDI+Cgo8aDM+RmlndXJlczwvaDM+CjxwPgpUaGUgZGlzcGxheSBjb21wb25lbnQgaW4gYm90aCBHRUYgYW5kIGRyYXcyZCBpcyBidWlsdCBhcm91bmQgdGhlIGRyYXcyZCA8Y29kZT5JRmlndXJlPC9jb2RlPiBpbnRlcmZhY2UuIApGaWd1cmVzIGluIGRyYXcyZCBhcmUgbGlnaHR3ZWlnaHQgb2JqZWN0cyB3aGljaCBjYW4gYmUgbmVzdGVkIHRvIGNyZWF0ZSBhIGNvbXBsZXggZ3JhcGhpY2FsIHJlcHJlc2VudGF0aW9uLgpUaGUgdmlldyBpcyBjcmVhdGVkIGJ5IHJlbmRlcmluZyBhbmQgbGF5aW5nIG91dCB0aGUgc2V0IG9mIGZpZ3VyZXMgd2hpY2ggcmVmbGVjdCB0aGUgbW9kZWwuIApJbiBhIHR5cGljYWwgR0VGIGFwcGxpY2F0aW9uLCB5b3Ugd291bGQgbm9ybWFsbHkgY3JlYXRlIGEgc2V0IG9mIGN1c3RvbWl6ZWQgPGNvZGU+SUZpZ3VyZTwvY29kZT4gaW1wbGVtZW50YXRpb25zLCBlYWNoIHN1YmNsYXNzaW5nIDxjb2RlPkZpZ3VyZTwvY29kZT4uIAo8L3A+Cgo8cD4KPGltZyBzcmM9ImltYWdlcy90aXAuZ2lmIiB3aWR0aD0iNjIiIGhlaWdodD0iMTMiPiAKSWYgeW91J3JlIHVuZmFtaWxpYXIgd2l0aCBkcmF3MmQgYW5kIDxjb2RlPkZpZ3VyZXM8L0NPREU+LCB0YWtlIGEgbG9vayBhdCBEYW5pZWwgTGVlJ3MgYXJ0aWNsZSBvbiA8aT48YSBocmVmPSIuLi9BcnRpY2xlLUdFRi1EcmF3MmQvR0VGLURyYXcyZC5odG1sIj5EaXNwbGF5IGEgVU1MIERpYWdyYW0gdXNpbmcgRHJhdzJEPC9hPjwvaT4sIAo8L3A+Cgo8cD4KSW4gb3VyIGFwcGxpY2F0aW9uIHdlIGhhdmUgdGhlIGZvbGxvd2luZyBmaWd1cmVzOgo8dWw+CiAgPGxpPjxDT0RFPkVkaXRhYmxlTGFiZWw8L0NPREU+OiBhIHN1YmNsYXNzIG9mIHRoZSBkcmF3MmQgPENPREU+TGFiZWw8L0NPREU+IGNsYXNzIHdoaWNoIGl0c2VsZgogICAgc3ViY2xhc3NlcyA8Q09ERT5GaWd1cmU8L0NPREU+LiBXZSBuZWVkIHRoaXMgZm9yIHRoZSBjb2x1bW4gYW5kIHRhYmxlIG5hbWVzPC9saT4KICA8bGk+PENPREU+Q29sdW1uc0ZpZ3VyZTwvQ09ERT46IGEgY29udGFpbmVyIGZvciBhbGwgdGhlIGNvbHVtbiBsYWJlbHM8L2xpPgogIDxsaT48Q09ERT5UYWJsZUZpZ3VyZTwvQ09ERT46IGNvbnRhaW5zIGFuIDxDT0RFPkVkaXRhYmxlTGFiZWw8L0NPREU+IGZvciB0aGUgdGFibGUgbmFtZSwgYXMgd2VsbCBhcyBhIDxDT0RFPkNvbHVtbnNGaWd1cmU8L0NPREU+IGZvciB0aGUgY29sdW1uIG5hbWVzPC9saT4KICA8bGk+PENPREU+U2NoZW1hRmlndXJlPC9DT0RFPjogYSBjb250YWluZXIgZm9yIGFsbCB0aGUgPENPREU+VGFibGVGaWd1cmVzPC9DT0RFPiBpbiB0aGUgc2NoZW1hPC9saT4gICAKPC91bD4KPHA+CldlIGhhdmVuJ3QgcHJvdmlkZWQgYW55IGN1c3RvbSBmaWd1cmVzIHRvIHJlcHJlc2VudCBjb25uZWN0aW9ucyAtIHdlIHNpbXBseSB1c2UgdGhlIGRyYXcyZCA8Q09ERT5Qb2x5bGluZUNvbm5lY3Rpb248L0NPREU+IGNsYXNzLCAKd2hpY2ggaXMgYSBqdXN0IGEgbGluZSB3aXRoIHplcm8gb3IgbW9yZSBraW5rcyBvciBiZW5kIHBvaW50cy4KPC9wPgo8cD4KQmVjYXVzZSB0aGUgdGFibGUgbmFtZXMgYXMgd2VsbCBhcyB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgYW5kIHRoZWlyIG5hbWVzIGFyZSBsaWtlbHkgdG8gY2hhbmdlIGR1cmluZyB0aGUgbGlmZXRpbWUgb2YgYSA8Q09ERT5UYWJsZUZpZ3VyZTwvQ09ERT4gaW5zdGFuY2UsIAp3ZSB3YW50IG91ciA8Q09ERT5Db2x1bW5zRmlndXJlPC9DT0RFPiBhbmQgPENPREU+VGFibGVGaWd1cmU8L0NPREU+IHRvIGJlIHJlc2l6YWJsZS4gCkEga2V5IHJvbGUgaW4gYWxsb3dpbmcgdGhpcyB0byBoYXBwZW4gaXMgcGxheWVkIGJ5IGxheW91dCBtYW5hZ2VycywgYW5vdGhlciBpbXBvcnRhbnQgcGFydCBvZiB0aGUgZHJhdzJkIGZyYW1ld29yay4KPC9wPgoKPGgzPkxheW91dCBNYW5hZ2VtZW50PC9oMz4KPHA+CkdFRiBwcm92aWRlcyBhIGxheW91dCBtYW5hZ2VtZW50IGZyYW1ld29yayB3aGljaCBpcyBkaXN0aW5jdCBmcm9tIHRoZSBTd2luZyBhbmQgRWNsaXBzZSBTV1QgbGF5b3V0IG1hbmFnZXJzOiAKaXRzIGpvYiBpcyBzcGVjaWZpY2FsbHkgdG8gaGFuZGxlIGxheW91dCBvZiB0aGUgY2hpbGQgZmlndXJlcyBvZiBkcmF3MmQgPENPREU+SUZpZ3VyZTwvQ09ERT4gaW5zdGFuY2VzLiAKWW91ciBqb2IgYXMgYW4gYXBwbGljYXRpb24gZGV2ZWxvcGVyIGlzIHRvIGRlY2lkZSB3aGljaCBsYXlvdXQgbWFuYWdlciB0byB1c2UKZm9yIGVhY2ggZmlndXJlIGNvbnRhaW5pbmcgY2hpbGQgZmlndXJlcy48L3A+IAo8cD4KQnJvYWRseSBzcGVha2luZywgdGhlcmUgYXJlIHRocmVlIHR5cGVzIG9mIGxheW91dCBtYW5hZ2VyczoKPHVsPgogIDxsaT48Qj5TdHJ1Y3R1cmVkIGxheW91dCBtYW5hZ2VyczwvQj4sIHN1Y2ggYXMgPENPREU+Rmxvd0xheW91dDwvQ09ERT4gYW5kIDxDT0RFPlRvb2xiYXJMYXlvdXQ8L0NPREU+LCAKICB3aGljaCBsYXkgb3V0IGNoaWxkIGZpZ3VyZXMgYWNjb3JkaW5nIHRvIHRoZWlyIDxCPm9yZGVyPC9CPiBieSBhcnJhbmdpbmcgdGhlbSB2ZXJ0aWNhbGx5IG9yIGhvcml6b250YWxseQogIDxsaT48Qj5Db25zdHJhaW50LWJhc2VkIGxheW91dCBtYW5hZ2VyczwvQj4sIHN1Y2ggYXMgdGhlIDxDT0RFPlhZTGF5b3V0PC9DT0RFPiBhbmQgdGhlIDxDT0RFPkRlbGVnYXRpbmdMYXlvdXQ8L0NPREU+LiAKICBIZXJlIHRoZSBhcHBsaWNhdGlvbiBpdHNlbGYgcGFydGljaXBhdGVzIGRpcmVjdGx5IGluIHRoZSBwbGFjZW1lbnQgb2YgZmlndXJlcyBieSBzZXR0aW5nIGEgY29uc3RyYWludCA8Q09ERT5PYmplY3Q8L0NPREU+IAogIGZvciBlYWNoIGNoaWxkIGZpZ3VyZS4gSW4gdGhlIGNhc2Ugb2YgdGhlIDxDT0RFPlhZTGF5b3V0PC9DT0RFPiwgdGhpcyBvYmplY3QgaXMgYSA8Q09ERT5SZWN0YW5nbGU8L0NPREU+IAogIHdpdGggc3BlY2lmaWVkIGxvY2F0aW9uIGFuZCBzaXplPC9saT4KICA8bGk+CiAgPEI+TGF5b3V0IHVzaW5nIGdlb21ldHJ5IGNvbXB1dGF0aW9uIGFsZ29yaXRobXM8L0I+LiBIZXJlIGxheW91dCBpcyBkZXRlcm1pbmVkIGJ5IGFwcGx5aW5nIGEgc2VyaWVzIG9mIHJhdGhlciBjb21wbGV4IGFsZ29yaXRobXMgdG8gCiAgY2FsY3VsYXRlIHRoZSAiYmVzdCIgbGF5b3V0IGZvciBjaGlsZCBmaWd1cmVzLiBUaGUgYWxnb3JpdGhtcyB0YWtlIGEgc3BlY2lhbGx5IGNvbnN0cnVjdGVkIGRhdGEgc3RydWN0dXJlIGFzIGlucHV0IGFuZCAKICBkZWxpdmVyIGFzIHRoZWlyIG91dHB1dCBhIHNvbHV0aW9uIHRvIGdlb21ldHJpY2FsIHByb2JsZW1zIHN1Y2ggYXMgbm9kZSBwbGFjZW1lbnQgYW5kIHJvdXRpbmcgb2YgcGF0aHMuCiAgVGhlIGFsZ29yaXRobXMgcHJvdmlkZWQgYnkgR0VGIGFyZSBpbiB0aGUgY2xhc3NlcyA8Q09ERT5EaXJlY3RlZEdyYXBoTGF5b3V0PC9DT0RFPgogIGFuZCA8Q09ERT5Db21wb3VuZERpcmVjdGVkR3JhcGhMYXlvdXQ8L0NPREU+CiAgPC9saT4KPC91bD4KPHA+ClRoZSBHRUYgZGV2ZWxvcGVyIG5lZWRzIHRvIHVuZGVyc3RhbmQgd2hpY2ggbGF5b3V0IG1hbmFnZXJzIGNhbiBiZSBiZXN0IGFwcGxpZWQgaW4gd2hpY2ggc2l0dWF0aW9uLiAKU3RydWN0dXJlZCBsYXlvdXQgbWFuYWdlcnMgYXJlIHN1aXRhYmxlIHdoZW4gdGhlcmUgaXMgYSB3ZWxsIGRlZmluZWQgcGFyZW50LWNoaWxkIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZSAKY29udGFpbmluZyBmaWd1cmUgYW5kIGl0cyBjaGlsZHJlbiA8ST5hbmQ8L0k+CnRoZSBjaGlsZHJlbiBhcmUgbm90IHJlbGF0ZWQgdG8gZWFjaCBvdGhlciBpbiBhcmJpdHJhcnkgd2F5cy4KSW4gb3VyIGV4YW1wbGUgYXBwbGljYXRpb24sIDxDT0RFPlRhYmxlRmlndXJlPC9DT0RFPiB1c2VzIGEgPENPREU+VG9vbGJhckxheW91dDwvQ09ERT4gdG8gcGxhY2UgaXRzIGNoaWxkcmVuIAooc2ltcGx5IHN0YWNraW5nIHRoZW0gdmVydGljYWxseSkuIFRoZSA8Q09ERT5Db2x1bW5zRmlndXJlPC9DT0RFPiBkb2VzIHRoZSBzYW1lIHdpdGggaXRzIGNoaWxkIDxDT0RFPkxhYmVsPC9DT0RFPiBvYmplY3RzLCAKYnV0IHVzZXMgdGhlIDxDT0RFPkZsb3dMYXlvdXQ8L0NPREU+IGZvciB0aGlzIHB1cnBvc2UuIAo8cD4KVGhpcyBraW5kIG9mIGFycmFuZ2VtZW50IG9mIGNvdXJzZSBkb2VzIG5vdCB3b3JrIHdpdGggPENPREU+U2NoZW1hRmlndXJlPC9DT0RFPiAtIAphbnkgb2YgaXRzIGNoaWxkIDxDT0RFPlRhYmxlRmlndXJlczwvQ09ERT4gbWF5IGJlIHJlbGF0ZWQgdG8gYW55IG90aGVyIHZpYSBhIHByaW1hcnkga2V5L2ZvcmVpZ24ga2V5IHJlbGF0aW9uc2hpcCwgCnNvIHdlIGNhbm5vdCBzaW1wbHkgc3RhY2sgdGhlIHRhYmxlIGZpZ3VyZXMgbmV4dCB0byBlYWNoIG90aGVyIG9yIHNpZGUgYnkgc2lkZS4KRm9yIDxDT0RFPlNjaGVtYUZpZ3VyZTwvQ09ERT4gd2UgbmVlZCB0byBjaG9vc2UgYmV0d2VlbiBlaXRoZXIgYSBjb25zdHJhaW50LWJhc2VkIGxheW91dCBtYW5hZ2VyIG9yIGEgZ3JhcGggbGF5b3V0IG1hbmFnZXIuIApJbiBvdXIgZXhhbXBsZSBhcHBsaWNhdGlvbiB3ZSB1c2UgYm90aC4gVXNlcnMgY2FuIHN3aXRjaCBiZXR3ZWVuIG1hbnVhbCBsYXlvdXQsIHdoaWNoIGludm9sdmVzIGRyYWdnaW5nIHRhYmxlIGZpZ3VyZXMgCnRvIHRoZWlyIGRlc2lyZWQgbG9jYXRpb25zLCBhbmQgYXV0b21hdGljIHBsYWNlbWVudCBvZiBmaWd1cmVzIHVzaW5nIGdlb21ldHJ5IGNvbXB1dGF0aW9uIGFsZ29yaXRobXMuIApIb3cgdGhpcyBpcyBkb25lIGlzIGJleW9uZCB0aGUgc2NvcGUgb2YgdGhpcyBhcnRpY2xlLCAKYWx0aG91Z2ggaW50ZXJlc3RlZCByZWFkZXJzIGNhbiBleGFtaW5lIHRoZSAKPENPREU+RGVsZWdhdGluZ0xheW91dE1hbmFnZXI8L0NPREU+IGNsYXNzIGluIHRoZSBleGFtcGxlIGFwcGxpY2F0aW9uIHNvdXJjZSBjb2RlLgoKPHA+CjxpbWcgc3JjPSJpbWFnZXMvdHJ5aXQuZ2lmIiB3aWR0aD0iNjEiIGhlaWdodD0iMTMiPiAgT3BlbiBhIHNjaGVtYSBkaWFncmFtIGVkaXRvciBhbmQgbWFrZSBzb21lIGNoYW5nZXMsIHN3aXRjaGluZyBiZXR3ZWVuIG1hbnVhbCAKYW5kIGF1dG9tYXRpYyBsYXlvdXQgdXNpbmcgdGhlCjxpbWcgc3JjPSJpbWFnZXMvbGF5b3V0LmdpZiIgd2lkdGg9IjE2IiBoZWlnaHQ9IjE2Ij4gaWNvbi4KPC9wPgoKPGgyPlRoZSBDb250cm9sbGVyPC9oMj4KPHA+CldlIG9ubHkgcmVhbGx5IG1vdmUgaW50byBHRUYgdGVycml0b3J5IHByb3BlciB3aGVuIHdlIHN0YXJ0IHRhbGtpbmcgYWJvdXQgdGhlIGNvbnRyb2xsZXIgaW4gdGhlIE1WQyB0cmlsb2d5LiAKR0VGIHByb3ZpZGVzIGFuIGFic3RyYWN0aW9uIHRoYXQgcHJldmVudHMgdGhlIG1vZGVsIGZyb20gaGF2aW5nIHRvIGtub3cgYWJvdXQgdGhlIGZpZ3VyZXMsIGFuZCB2aWNlIHZlcnNhLiAKQXQgdGhlIGNlbnRyZSBvZiB0aGlzIGFyY2hpdGVjdHVyZSBpcyB0aGUgPENPREU+RWRpdFBhcnQ8L0NPREU+IGludGVyZmFjZS4KPC9wPgo8aDM+RWRpdFBhcnRzPC9oMz4KPHA+ClRoZSBmaXJzdCB0aGluZyB0byBrbm93IGlzIHRoYXQgdHlwaWNhbGx5IGV2ZXJ5IHNlcGFyYXRlbHkgZWRpdGFibGUgcGFydCBvZiB0aGUgbW9kZWwgd2lsbCBuZWVkIHRvIGJlCmFzc29jaWF0ZWQgd2l0aCBhbiA8Q09ERT5FZGl0UGFydDwvQ09ERT4gaW5zdGFuY2UuIFRoaXMgbWVhbnMgdGhhdCB0aGVyZSB3aWxsIHVzdWFsbHkgYmUgYSBjbG9zZSB0byBvbmUtZm9yLW9uZSBtYXBwaW5nIGJldHdlZW4gY2xhc3NlcyAKaW4gdGhlIG1vZGVsIGhpZXJhcmNoeSBhbmQgY2xhc3NlcyBpbiB0aGUgPENPREU+RWRpdFBhcnQ8L0NPREU+ICBoaWVyYXJjaHkuIApJbiBtb3N0IGNhc2VzLCBhbiA8Q09ERT5FZGl0UGFydDwvQ09ERT4gaXMgYWxzbyBhIDxDT0RFPkdyYXBoaWNhbEVkaXRQYXJ0PC9DT0RFPiwgd2hpY2ggbWVhbnMgdGhhdAphcyB3ZWxsIGFzIG1hbmFnaW5nIGEgbW9kZWwgY29tcG9uZW50LCBpdCBhbHNvIGhhcyBhbiBhc3NvY2lhdGVkIHZpZXcgY29tcG9uZW50LiBCZWNhdXNlIHRoZSAKbW9kZWwgYW5kIHZpZXcgYXJlIGNvbXBsZXRlbHkgZGVjb3VwbGVkLCBhbGwgY29vcmRpbmF0aW9uIGJldHdlZW4gdGhlIG1vZGVsIGFuZCB0aGUgdmlldyBtdXN0IGJlIG1hbmFnZWQgYnkgdGhlIDxDT0RFPkVkaXRQYXJ0PC9DT0RFPi4KVGhpcyBjb29yZGluYXRpb24gY2FuIGJlIGRpdmlkZWQgaW50byB0d28gc2VwYXJhdGUgYXJlYXMgb2YgYWN0aXZpdHk6CjxvbD4KICA8bGk+QWN0aW5nIGFzIGEgbGlzdGVuZXIgdG8gY2hhbmdlcyBpbiB0aGUgbW9kZWwgc28gdGhhdCB0aGVzZSBjYW4gYmUgcHJvcGFnYXRlZCB0byB0aGUgdmlldywgYnkgY2FsbGluZyBsYXlvdXQgcmVsYXRlZCBtZXRob2RzLiBXZSBkaXNjdXNzIHRoaXMKICBpbiBkZXRhaWwgaW4gdGhlIHNlY3Rpb24gPEEgSFJFRj0iI3ZpZXdVcGRhdGUiPlVwZGF0aW5nIGFuIFJlcGFpbnRpbmcgdGhlIERpc3BsYXk8L0E+CiAgPC9saT4KICA8bGk+UHJvdmlkaW5nIGEgbWVhbnMgYnkgd2hpY2ggdXNlciBpbnRlcmFjdGlvbiBjYW4gYmUgaW50ZXJwcmV0ZWQgYW5kIHByb3BhZ2F0ZWQgdG8gY2hhbmdlcyBpbiB0aGUgbW9kZWwuIAogIENlbnRyYWwgdG8gdGhpcyBhcmUgPENPREU+RWRpdFBvbGljaWVzPC9DT0RFPiwgZGlzY3Vzc2VkIGluIHRoZSBzZWN0aW9uIDxBIEhSRUY9IiNlZGl0UG9saWNpZXMiPkVkaXRQb2xpY2llcyBhbmQgUm9sZXM8L0E+CiAgPC9saT4KICA8bGk+TWFuYWdpbmcgd2hhdCBhcmUga25vd24gYXMgZGlyZWN0IGVkaXRzLCB3aGVyZSB0aGUgdXNlciB0eXBlcyB0ZXh0IGRpcmVjdGx5IGludG8gYW4gZWRpdGFibGUgY29udHJvbAogIDwvbGk+Cjwvb2w+IApJbiBvdXIgZXhhbXBsZSBhcHBsaWNhdGlvbiB3ZSBoYXZlIHRoZSBmb2xsb3dpbmcgPENPREU+RWRpdFBhcnQ8L0NPREU+IGltcGxlbWVudGF0aW9ucwo8dWw+CiAgPGxpPjxDT0RFPlNjaGVtYURpYWdyYW1QYXJ0PC9DT0RFPjogcmVwcmVzZW50cyBhIDxDT0RFPlNjaGVtYTwvQ09ERT4gaW5zdGFuY2UgYW5kIGFzc29jaWF0ZWQgPENPREU+U2NoZW1hRmlndXJlPC9DT0RFPjwvbGk+CiAgPGxpPjxDT0RFPlRhYmxlUGFydDwvQ09ERT46IHJlcHJlc2VudHMgYSA8Q09ERT5UYWJsZTwvQ09ERT4gYW5kIG1hbmFnZXMgdGhlIDxDT0RFPlRhYmxlRmlndXJlPC9DT0RFPiBhbmQgY2hpbGQgdmlldyBjb21wb25lbnRzPC9saT4KICA8bGk+PENPREU+Q29sdW1uUGFydDwvQ09ERT46IGVuYWJsZXMgZWRpdGluZyBmdW5jdGlvbmFsaXR5IGZvciB0aGUgY29sdW1uIGxhYmVsPC9saT4gCiAgPGxpPjxDT0RFPlJlbGF0aW9uc2hpcFBhcnQ8L0NPREU+OiByZXByZXNlbnRzIGEgcHJpbWFyeSBrZXkvZm9yZWlnbiBrZXkgcmVsYXRpb25zaGlwLiAKICBJbiB0aGUgc2FtZSB3YXkgdGhhdCBSZWxhdGlvbnNoaXAgaW4gdGhlIG1vZGVsIGlzIGFzc29jaWF0ZWQgd2l0aCB0d28gPENPREU+VGFibGU8L0NPREU+IGluc3RhbmNlcywgCiAgYSA8Q09ERT5SZWxhdGlvbnNoaXBQYXJ0PC9DT0RFPiBpcyBhc3NvY2lhdGVkIHdpdGggdHdvIDxDT0RFPlRhYmxlUGFydHM8L0NPREU+PC9saT4gIAo8L3VsPgo8cD4KV2hlbiBhbiBpbnN0YW5jZSBvZiBhbnkgb2YgdGhlc2UgY2xhc3NlcyBpcyBjcmVhdGVkLCBpdCBpcyBhdXRvbWF0aWNhbGx5IGFzc29jaWF0ZWQgd2l0aCBhIHBhcnQgb2YgdGhlIG1vZGVsLiAKVGhpcyBpcyBhIGJ1aWxkLWluIGZlYXR1cmUgb2YgdGhlIGZyYW1ld29yay4gQXMgcGFydCBvZiBvdXIgZWRpdG9yLCB3ZSBoYXZlIHRvIHByb3ZpZGUgYW4gPENPREU+RWRpdFBhcnRGYWN0b3J5PC9DT0RFPiBpbXBsZW1lbnRhdGlvbi4gCk91cnMgbG9va3MgbGlrZSB0aGlzOgo8L3A+Cjxmb250IGNvbG9yPSIjMDAwMGNjIj4KPHByZT5wdWJsaWMgY2xhc3MgU2NoZW1hRWRpdFBhcnRGYWN0b3J5IGltcGxlbWVudHMgRWRpdFBhcnRGYWN0b3J5CnsKICAgIHB1YmxpYyBFZGl0UGFydCBjcmVhdGVFZGl0UGFydChFZGl0UGFydCBjb250ZXh0LCBPYmplY3QgbW9kZWwpCiAgICB7CiAgICAgICAgRWRpdFBhcnQgcGFydCA9IG51bGw7CiAgICAgICAgaWYgKG1vZGVsIGluc3RhbmNlb2YgU2NoZW1hKQogICAgICAgICAgICBwYXJ0ID0gbmV3IFNjaGVtYURpYWdyYW1QYXJ0KCk7CiAgICAgICAgZWxzZSBpZiAobW9kZWwgaW5zdGFuY2VvZiBUYWJsZSkKICAgICAgICAgICAgcGFydCA9IG5ldyBUYWJsZVBhcnQoKTsKICAgICAgICBlbHNlIGlmIChtb2RlbCBpbnN0YW5jZW9mIFJlbGF0aW9uc2hpcCkKICAgICAgICAgICAgcGFydCA9IG5ldyBSZWxhdGlvbnNoaXBQYXJ0KCk7CiAgICAgICAgZWxzZSBpZiAobW9kZWwgaW5zdGFuY2VvZiBDb2x1bW4pCiAgICAgICAgICAgIHBhcnQgPSBuZXcgQ29sdW1uUGFydCgpOwogICAgICAgIHBhcnQuc2V0TW9kZWwobW9kZWwpOwogICAgICAgIHJldHVybiBwYXJ0OwogICAgfQp9PC9wcmU+CjwvZm9udD4KPHA+CjxDT0RFPlNjaGVtYURpYWdyYW1QYXJ0PC9DT0RFPiwgPENPREU+VGFibGVQYXJ0PC9DT0RFPiBhbmQgPENPREU+Q29sdW1uUGFydDwvQ09ERT4gCmFsbCBleHRlbmQgPENPREU+QWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydDwvQ09ERT4gYW5kIGltcGxlbWVudCA8Q09ERT5HcmFwaGljYWxFZGl0UGFydDwvQ09ERT4uIApJbiBhZGRpdGlvbiwgPENPREU+VGFibGVQYXJ0PC9DT0RFPiBjYW4gYmUgYSA8ST5ub2RlPC9JPiBpbiBhIHByaW1hcnkvZm9yZWlnbiBrZXkgcmVsYXRpb25zaGlwLCAKc28gaXQgaGFzIHRvIGltcGxlbWVudCA8Q09ERT5Ob2RlRWRpdFBhcnQ8L0NPREU+LgpGaW5hbGx5LCA8Q09ERT5SZWxhdGlvbnNoaXBQYXJ0PC9DT0RFPiByZXByZXNlbnRzIHRoZSA8ST5jb25uZWN0aW9uPC9JPiBwYXJ0IG9mIHRoZSByZWxhdGlvbnNoaXAsIApzbyBpdCBleHRlbmRzIDxDT0RFPkFic3RyYWN0Q29ubmVjdGlvbkVkaXRQYXJ0PC9DT0RFPi4KPC9wPgo8cD4KPENPREU+U2NoZW1hRGlhZ3JhbVBhcnQ8L0NPREU+J3Mgam9iIGlzIHByaW1hcmlseSBtYW5hZ2luZyB0aGUgbGF5b3V0IG9mIHRoZSB0YWJsZXMuIAo8Q09ERT5Db2x1bW5QYXJ0PC9DT0RFPidzIHJvbGUgaXMgcmVsYXRpdmVseSBsaW1pdGVkIC0gaXQganVzdCBuZWVkcyB0byBoYW5kbGUgZWRpdGluZyBvZiB0aGUgbGFiZWwgZGlzcGxheWluZyBuYW1lIGFuZCB0eXBlIGluZm9ybWF0aW9uLgo8L3A+CjxwPgpPZiB0aGUgZm91ciBvZiB0aGVzZSwgPENPREU+VGFibGVQYXJ0PC9DT0RFPiBoYXMgdGhlIG1vc3QgdG8gZG8uIApJbiBHRUYsIG1vc3Qgb2YgdGhlIHdvcmsgdGhhdCBpcyBkb25lIHRvIG1hbmFnZSByZWxhdGlvbnNoaXBzIGlzIGRvbmUKYnkgPENPREU+Tm9kZUVkaXRQYXJ0PC9DT0RFPiwgYW5kIG5vdCA8Q09ERT5Db25uZWN0aW9uRWRpdFBhcnQ8L0NPREU+LiAKQmVjYXVzZSB3ZSBzb21ldGltZXMgbmVlZCB0byByZW5hbWUgdGFibGVzLCA8Q09ERT5UYWJsZVBhcnQ8L0NPREU+IGFsc28gaGFzIHRvIG1hbmFnZQplZGl0aW5nIG9mIHRoZSBsYWJlbCB0aGF0IGRpc3BsYXlzIGl0cyBuYW1lLiAKV2Ugd2lsbCBzcGVuZCBtb3JlIG9mIG91ciB0aW1lIGZvY3VzaW5nIG9uIDxDT0RFPlRhYmxlUGFydDwvQ09ERT4uCjwvcD4KCgpJbiBhIEdFRiBhcHBsaWNhdGlvbiwgdGhlcmUgYXJlIGEgbnVtYmVyIG9mIHRhc2tzIDxDT0RFPkVkaXRQYXJ0PC9DT0RFPiBzdWJjbGFzc2VzIG11c3QKZnVsZmlsbDoKPG9sPgogIDxsaT4KICA8cD4KICBQcm92aWRlIGEgZmlndXJlIGluc3RhbmNlIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgPENPREU+RWRpdFBhcnQ8L0NPREU+LiAKICBJbiB0aGUgY2FzZSBvZiA8Q09ERT5UYWJsZVBhcnQ8L0NPREU+LCB3ZSBzaW1wbHkgcmV0dXJuIGEgbmV3IDxDT0RFPlRhYmxlRmlndXJlPC9DT0RFPiBpbnN0YW5jZSB3aXRoIGEgbmFtZSBsYWJlbDoKPGZvbnQgY29sb3I9IiMwMDAwY2MiPgo8cHJlPiAgcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkKICB7CiAgICAgIFRhYmxlIHRhYmxlID0gZ2V0VGFibGUoKTsKICAgICAgRWRpdGFibGVMYWJlbCBsYWJlbCA9IG5ldyBFZGl0YWJsZUxhYmVsKHRhYmxlLmdldE5hbWUoKSk7CiAgICAgIFRhYmxlRmlndXJlIHRhYmxlRmlndXJlID0gbmV3IFRhYmxlRmlndXJlKGxhYmVsKTsKICAgICAgcmV0dXJuIHRhYmxlRmlndXJlOwogIH08L3ByZT4KICA8L2ZvbnQ+CiAgPC9saT4KCTxsaT4JCQoJPHA+ICAKCTxDT0RFPkVkaXRQYXJ0czwvQ09ERT4gd2hpY2ggcmVwcmVzZW50IHBhcmVudCBvYmplY3RzIGluIDxCPnBhcmVudC1jaGlsZDwvQj4gcmVsYXRpb25zaGlwcyBuZWVkIHRvIG92ZXJyaWRlIDxDT0RFPmdldE1vZGVsQ2hpbGRyZW4oKTwvQ09ERT4uIAoJSW4gdGhlIGNhc2Ugb2YgPENPREU+VGFibGVQYXJ0PC9DT0RFPiwgb3VyCglpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCBzaW1wbHkgcmV0dXJucyB0aGUgPENPREU+Q29sdW1uPC9DT0RFPiBvYmplY3RzIGl0IGNvbnRhaW5zOgo8Zm9udCBjb2xvcj0iIzAwMDBjYyI+CjxwcmU+ICBwcm90ZWN0ZWQgTGlzdCBnZXRNb2RlbENoaWxkcmVuKCkKICB7CiAgICAgIHJldHVybiBnZXRUYWJsZSgpLmdldENvbHVtbnMoKTsKICB9PC9wcmU+CjwvZm9udD4JCglOb3RlIHRoYXQgdGhlIDxDT0RFPkFic3RyYWN0RWRpdFBhcnQ8L0NPREU+IGltcGxlbWVudHMgYSBwYXJhbGxlbCBtZXRob2QgPENPREU+Z2V0Q2hpbGRyZW4oKTwvQ09ERT4sIAoJd2hpY2ggcmV0dXJucyB0aGUgPENPREU+RWRpdFBhcnQ8L0NPREU+IGNvbGxlY3Rpb24gcmVwcmVzZW50aW5nIHRoZSBtb2RlbCBjaGlsZHJlbi4KCUluIHRoZSBjYXNlIG9mIDxDT0RFPlRhYmxlUGFydDwvQ09ERT4sIDxDT0RFPmdldENoaWxkcmVuKCk8L0NPREU+IHJldHVybnMgYSBsaXN0IG9mIDxDT0RFPkNvbHVtblBhcnQ8L0NPREU+IG9iamVjdHMuIAoJV2Uga25vdyB0aGlzIGJlY2F1c2Ugb3VyIGltcGxlbWVudGF0aW9uIG9mIDxDT0RFPkVkaXRQYXJ0RmFjdG9yeTwvQ09ERT4gYXNzb2NpYXRlcyAKCTxDT0RFPkNvbHVtbjwvQ09ERT4gbW9kZWwgaW5zdGFuY2VzIHdpdGggaW5zdGFuY2VzIG9mIDxDT0RFPkNvbHVtblBhcnQ8L0NPREU+LgoJVGhlIDxDT0RFPkVkaXRQYXJ0PC9DT0RFPiA8Q09ERT5MaXN0PC9DT0RFPiByZXR1cm5lZCBieSA8Q09ERT5nZXRDaGlsZHJlbigpPC9DT0RFPiAKCWFsd2F5cyBuZWVkcyB0byBiZSBrZXB0IGluIHN5bmMgd2l0aCB0aGUgPENPREU+Z2V0TW9kZWxDaGlsZHJlbigpPC9DT0RFPi4gCglJbiB0aGUgU2VjdGlvbiA8QSBIUkVGPSIjc3luY2hyb25pc2luZyI+U3luY2hyb25pemluZyBFZGl0UGFydCBSZWxhdGlvbnNoaXBzIHdpdGggTW9kZWwgQ2hhbmdlczwvQT4gd2UgZGVzY3JpYmUgaG93IHRoaXMgaGFwcGVucwoJPGJyPgoJPC9saT4KCTxsaT4KCTxwPgoJSWYgdGhlIHBhcmVudCA8Q09ERT5FZGl0UGFydDwvQ09ERT4ncyBmaWd1cmUgaXMgbm90IHRoZSBkaXJlY3QgcGFyZW50IG9mIHRoZSBjaGlsZCA8Q09ERT5FZGl0UGFydDwvQ09ERT4ncyBmaWd1cmUsIHlvdSB3aWxsCgluZWVkIHRvIG92ZXJyaWRlIDxDT0RFPkFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQuZ2V0Q29udGVudFBhbmUoKTwvQ09ERT4uCQoJVGhlIDxCPmNvbnRlbnQgcGFuZTwvQj4gaXMgdGhlIGNvbnRhaW5pbmcgZmlndXJlIGludG8gd2hpY2ggR0VGIGFkZHMgZmlndXJlcyBjcmVhdGVkIGJ5IGNoaWxkIDxDT0RFPkVkaXRQYXJ0czwvQ09ERT4sCgl3aGljaCBpcyBieSBkZWZhdWx0IHRoZSBmaWd1cmUgcmV0dXJuZWQgYnkgdGhlIDxDT0RFPkVkaXRQYXJ0PC9DT0RFPidzIDxDT0RFPmNyZWF0ZUZpZ3VyZSgpPC9DT0RFPiBtZXRob2QuCgk8L3A+Cgk8cD4KCUluIG91ciBleGFtcGxlIGFwcGxpY2F0aW9uCgl0aGUgY29sdW1uIGxhYmVscyBhcmUgbm90IGNvbnRhaW5lZCB3aXRoaW4gYSA8Q09ERT5UYWJsZUZpZ3VyZTwvQ09ERT4gYnV0IHdpdGhpbiBpdHMgPENPREU+Q29sdW1uc0ZpZ3VyZTwvQ09ERT4gY2hpbGQuIAoJT3VyIGltcGxlbWVudGF0aW9uIG9mIDxDT0RFPmdldENvbnRlbnRQYW5lKCk8L0NPREU+IGluIDxDT0RFPlRhYmxlUGFydDwvQ09ERT4gcmVmbGVjdHMgdGhpczoKPHByZT5wdWJsaWMgSUZpZ3VyZSBnZXRDb250ZW50UGFuZSgpCnsKICAgIFRhYmxlRmlndXJlIGZpZ3VyZSA9IChUYWJsZUZpZ3VyZSkgZ2V0RmlndXJlKCk7CiAgICByZXR1cm4gZmlndXJlLmdldENvbHVtbnNGaWd1cmUoKTsKfTwvcHJlPgkJCQo8cD4KPGltZyBzcmM9ImltYWdlcy90aXAuZ2lmIiB3aWR0aD0iNjIiIGhlaWdodD0iMTMiPiBEbyBub3QgYWRkIGFuZCByZW1vdmUgY2hpbGQgZmlndXJlcyAKYnkgb3ZlcnJpZGluZyA8Q09ERT5BYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0LmFkZENoaWxkVmlzdWFsKCk8L0NPREU+IGFuZCA8Q09ERT5BYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0LnJlbW92ZUNoaWxkVmlzdWFsKCk8L0NPREU+LgpPdmVycmlkZSA8Q09ERT5nZXRDb250ZW50UGFuZSgpPC9DT0RFPiBpbnN0ZWFkLgo8L3A+CiAgPC9saT4KICAgIDxsaT4KICAgIDxDT0RFPkVkaXRQYXJ0czwvQ09ERT4gd2hpY2ggcmVwcmVzZW50IG5vZGVzIChtb2RlbCBvYmplY3RzIHdoaWNoIG1heSBwYXJ0aWNpcGF0ZSBpbiBjb25uZWN0aW9ucykgCiAgICBtdXN0IGFsc28gaW1wbGVtZW50IGEgbnVtYmVyIG9mIGFkZGl0aW9uYWwgbWV0aG9kcyBkZWZpbmVkIGluIHRoZSBpbnRlcmZhY2UgPENPREU+Tm9kZUVkaXRQYXJ0PC9DT0RFPgogICAgPHVsPgogIAkJPGxpPgogIAkJPHA+CiAgCQk8Q09ERT5wcm90ZWN0ZWQgTGlzdCBnZXRNb2RlbFNvdXJjZUNvbm5lY3Rpb25zKCk8L0NPREU+OiB0aGlzIHJldHVybnMgYWxsIHRoZSBjb25uZWN0aW9uIG1vZGVsIG9iamVjdHMgZm9yIHdoaWNoIHRoZSAKICAJCW5vZGUgbW9kZWwgb2JqZWN0IGlzIHRoZSBzb3VyY2UuCiAgCQlJbiBvdXIgZXhhbXBsZSBhcHBsaWNhdGlvbiwgd2UgaGF2ZSBpZGVudGlmaWVkIGZvcmVpZ24ga2V5cyBhcyB0aGUgc291cmNlIG9mIGEgcHJpbWFyeSBrZXkvZm9yZWlnbiBrZXkgcmVsYXRpb25zaGlwLiAKICAJCTxDT0RFPlRhYmxlUGFydDwvQ09ERT4ncyBpbXBsZW1lbnRhdGlvbiBjb250YWlucyBqdXN0IGEgc2luZ2xlIGxpbmUgb2YgY29kZToKICAJCTwvcD4KICAJCTxwPgogIAkJPGZvbnQgY29sb3I9IiMwMDAwY2MiPjxDT0RFPnJldHVybiBnZXRUYWJsZSgpLmdldEZvcmVpZ25LZXlSZWxhdGlvbnNoaXBzKCk7PC9DT0RFPjwvZm9udD4JCiAgCQk8L3A+CiAgCQk8cD4KICAJCVRoaXMgbWV0aG9kIHNpbXBseSByZXR1cm5zIHRoZSA8Q09ERT5SZWxhdGlvbnNoaXA8L0NPREU+IG9iamVjdHMgZm9yIAogIAkJd2hpY2ggdGhlIGN1cnJlbnQgPENPREU+VGFibGVQYXJ0PC9DT0RFPidzIDxDT0RFPlRhYmxlPC9DT0RFPiBpcyB0aGUgZm9yZWlnbiBrZXkuIAogIAkJT25jZSBhZ2FpbiwgdGhlcmUgaXMgYSBwYXJhbGxlbCBtZXRob2QgPENPREU+Z2V0U291cmNlQ29ubmVjdGlvbnMoKTwvQ09ERT4sIAogIAkJd2hpY2ggcmV0dXJucyB0aGUgPENPREU+TGlzdDwvQ09ERT4gb2YgPENPREU+UmVsYXRpb25zaGlwUGFydHM8L0NPREU+IGFzc29jaWF0ZWQgd2l0aCB0aGVzZSByZWxhdGlvbnNoaXBzLgogIAkJV2UgYWxzbyBjb25zaWRlciBpbiB0aGUgU2VjdGlvbiA8QSBIUkVGPSIjc3luY2hyb25pc2luZyI+U3luY2hyb25pemluZyBFZGl0UGFydCBSZWxhdGlvbnNoaXBzIHdpdGggTW9kZWwgQ2hhbmdlczwvQT4KICAJCSBob3cgdGhlIDxDT0RFPkNvbm5lY3Rpb25FZGl0UGFydDwvQ09ERT4gbGlzdCByZXR1cm5lZCBieSAKICAJCTxDT0RFPmdldFNvdXJjZUNvbm5lY3Rpb25zKCk8L0NPREU+IHN0YXlzIGluIHN5bmMgd2l0aCB0aGUgCiAgCQk8Q09ERT5SZWxhdGlvbnNoaXA8L0NPREU+IGxpc3QgcmV0dXJuZWQgYnkgPENPREU+Z2V0TW9kZWxTb3VyY2VDb25uZWN0aW9ucygpPC9DT0RFPgogIAkJPC9wPgogIAkJPC9saT4KICAJCTxsaT4KICAJCTxwPgogIAkJPENPREU+cHJvdGVjdGVkIExpc3QgZ2V0TW9kZWxUYXJnZXRDb25uZWN0aW9ucygpPC9DT0RFPjogCiAgCQl0aGlzIHdvcmtzIGlkZW50aWNhbGx5IHRvIDxDT0RFPmdldE1vZGVsU291cmNlQ29ubmVjdGlvbnMoKTwvQ09ERT4sIAogIAkJZXhjZXB0IHRoYXQgaXQgcmV0dXJucyB0aGUgPENPREU+UmVsYXRpb25zaGlwPC9DT0RFPiBvYmplY3RzIGZvciB3aGljaCB0aGUgY3VycmVudCAKICAJCTxDT0RFPlRhYmxlUGFydDwvQ09ERT4ncyA8Q09ERT5UYWJsZTwvQ09ERT4gaXMgdGhlIHByaW1hcnkga2V5CiAgCQk8L3A+CiAgCQk8L2xpPgogIAkJPGxpPgogIAkJPHA+CiAgCQl0aGUgbm9kZSA8Q09ERT5HcmFwaGljYWxFZGl0UGFydDwvQ09ERT4gbXVzdCBhbHNvIHByb3ZpZGUgaW1wbGVtZW50YXRpb25zIG9mIHRoZSAKICAJCTxDT0RFPk5vZGVFZGl0UGFydDwvQ09ERT4gPENPREU+Z2V0U291cmNlQ29ubmVjdGlvbkFuY2hvcigpPC9DT0RFPiBhbmQgPENPREU+Z2V0VGFyZ2V0Q29ubmVjdGlvbkFuY2hvcigpPC9DT0RFPiBtZXRob2RzLiAKICAJCUluIGVhY2ggY2FzZSwgdGhlc2UgbWV0aG9kcyByZXR1cm4gb2JqZWN0cyB3aGljaCByZXByZXNlbnQgdGhlIHBvaW50cyB0byB3aGljaCBjb25uZWN0aW9ucyBiZXR3ZWVuIG5vZGVzIGNhbiBiZSBhdHRhY2hlZAogIAkJPC9wPgogIAkJPC9saT4KICAJPC91bD4KICAgIDwvbGk+CiAgICA8bGk+UHJvdmlkZSBhbiBpbXBsZW1lbnRhdGlvbiBmb3IgPENPREU+Y3JlYXRlRWRpdFBvbGljaWVzKCk8L0NPREU+LCAKICAgIGR1cmluZyB3aGljaCA8Q09ERT5FZGl0UG9saWN5PC9DT0RFPiBpbXBsZW1lbnRhdGlvbnMgYXJlIGFzc29jaWF0ZWQgd2l0aCBzcGVjaWZpYyBlZGl0aW5nIHJvbGVzLiAKICAgIFRoZSA8Q09ERT5FZGl0UG9saWN5PC9DT0RFPiBhbmQgaXRzIGFzc29jaWF0ZWQgcm9sZXMsIDxDT0RFPlJlcXVlc3Q8L0NPREU+IGFuZCAKICAgIDxDT0RFPkNvbW1hbmQ8L0NPREU+IG9iamVjdHMgYXJlIGEgZnVuZGFtZW50YWwgcGFydCBvZiBHRUYgd2hpY2ggd2UgZGlzY3VzcyBpbiB0aGUgbmV4dCBzZWN0aW9ucwogICAgPC9saT4gICAgCjwvb2w+Cgo8aDM+UmVxdWVzdHM8L2gzPgo8cD4KV2UgYmVnaW4gd2l0aCByZXF1ZXN0cyBiZWNhdXNlIHRoZXNlIGFyZSByZWFsbHkgdGhlIHN0YXJ0aW5nIHBvaW50IG9mIHRoZSBlZGl0aW5nIHByb2Nlc3MgdGhhdCBHRUYgYXBwbGljYXRpb24gZGV2ZWxvcGVyIHdvcmtzIHdpdGguCkluIGZhY3QsIHRoZSByZWFsIG1hZ2ljIGluIEdFRiBpcyBiZWluZyBhYmxlIHRvIGludGVycHJldCB1c2VyIGludGVyYWN0aW9ucyBhbmQgdHJhbnNmb3JtCnRoZXNlIGludG8gPEI+cmVxdWVzdHM8L0I+LCAKd2hpY2ggdGhlIGFwcGxpY2F0aW9uIGNhbiB3b3JrIHdpdGggaW4gYW4gb2JqZWN0LW9yaWVudGVkIGZhc2hpb24uIApGb3IgZXhhbXBsZSwgd2hlbiB3ZSBkcmFnIGZyb20gdGhlICJOZXcgQ29sdW1uIiBwYWxldHRlIGJ1dHRvbiBvbnRvIGFuIGV4aXN0aW5nCnRhYmxlIG9uIHRoZSBkaWFncmFtLCB3ZSBhcmUgb2YgY291cnNlIHRyeWluZyB0byBhZGQgYSBuZXcgY29sdW1uIHRvIHRoZSB0YWJsZS4gCkFzIHVzZXJzIGludGVyYWN0IHdpdGggdGhlIGFwcGxpY2F0aW9uLCBHRUYncyBiZWhpbmQtdGhlLXNjZW5lcyB3b3JrIHByb2R1Y2VzIDxDT0RFPlJlcXVlc3Q8L0NPREU+IG9iamVjdHMuIApJbiB0aGUgY3JlYXRlIGNvbHVtbiBleGFtcGxlLCBHRUYgcHJvZHVjZXMKYSA8Q09ERT5DcmVhdGVSZXF1ZXN0PC9DT0RFPiwgd2hpY2ggY29udGFpbnMgdGhlIGZvbGxvd2luZyBpbXBvcnRhbnQgaW5mb3JtYXRpb246Cjx1bD4KICA8bGk+dGhlIGluc3RhbmNlIG9mIHRoZSBuZXcgbW9kZWwgb2JqZWN0IHRoYXQgaGFzIGJlZW4gY3JlYXRlZCAKICAoYnV0IHByb2JhYmx5IG5vdCB5ZXQgY29uZmlndXJlZCBhbmQgZGVmaW5pdGVseSBub3QgYWRkZWQgdG8gdGhlIHJlc3Qgb2YgdGhlIG1vZGVsKTwvbGk+CiAgPGxpPlRoZSA8Q09ERT5FZGl0UGFydDwvQ09ERT4gb2JqZWN0IHdoaWNoIGlzIGhvc3RpbmcgdGhpcyByZXF1ZXN0LiAKICBJbiBvdXIgY2FzZSB0aGlzIHdpbGwgYmUgYW4gaW5zdGFuY2Ugb2YgPENPREU+VGFibGVQYXJ0PC9DT0RFPjwvbGk+CjwvdWw+CkRpZmZlcmVudCB0eXBlcyBvZiB1c2VyIGludGVyYWN0aW9ucyB3aWxsIHByb2R1Y2UgZGlmZmVyZW50IDxDT0RFPlJlcXVlc3Q8L0NPREU+IHR5cGVzCi0gdGhlc2UgYXJlIHdlbGwgY292ZXJlZCBpbiB0aGUgR0VGIEFQSSBhbmQgcGxhdGZvcm0gZG9jdW1lbnRhdGlvbi4gClRoZXNlIHJlcXVlc3Qgb2JqZWN0cyBuZWF0bHkgZW5jYXBzdWxhdGUgdGhlIGluZm9ybWF0aW9uIHRoZSBhcHBsaWNhdGlvbiBuZWVkcyB0byB0cmFuc2Zvcm0gdXNlciBpbnRlcmFjdGlvbiBpbnRvIGNoYW5nZXMgdG8gdGhlIG1vZGVsLiAKV2UgY2FuIHRha2UgYSBsb29rIGF0IGhvdyB0aGlzIGlzIGRvbmUgb25jZSB3ZSBoYXZlIGxvb2tlZCBhdCA8Q09ERT5Db21tYW5kczwvQ09ERT4gYW5kIDxDT0RFPkVkaXRQb2xpY2llczwvQ09ERT4sIAp3aGljaCB3ZSBjb3ZlciBpbiB0aGUgbmV4dCBzZWN0aW9uLiAKCgoKPEEgTkFNRT0iZWRpdFBvbGljaWVzIj48L0E+CjxoMz5FZGl0UG9saWNpZXMgYW5kIFJvbGVzPC9oMz4KPHA+CkFuIDxDT0RFPkVkaXRQb2xpY3k8L0NPREU+IGlzIHJlYWxseSBqdXN0IGFuIGV4dGVuc2lvbiBvZiBhbiA8Q09ERT5FZGl0UGFydDwvQ09ERT4sIAppbiB0aGUgc2Vuc2UgdGhhdCBjZXJ0YWluIGVkaXRpbmcgcmVsYXRlZCB0YXNrcyBhcmUgcGFzc2VkIG9uIGZyb20gdGhlIDxDT0RFPkVkaXRQYXJ0PC9DT0RFPiB0byBpdHMgPENPREU+RWRpdFBvbGljeTwvQ09ERT4gZGVsZWdhdGVzLgo8Q09ERT5FZGl0UGFydDwvQ09ERT4gaW1wbGVtZW50YXRpb25zIHdvdWxkIHJhcGlkbHkgYmVjb21lIGJsb2F0ZWQgaWYgdGhleSBoYWQgdG8gdGFrZSBvbiBldmVyeXRoaW5nIHRoYXQgPENPREU+RWRpdFBvbGljaWVzPC9DT0RFPiBkby4gClRvIHVuZGVyc3RhbmQgd2hhdCBhbiA8Q09ERT5FZGl0UG9saWN5PC9DT0RFPiBpcyBhbmQgd2hhdCBpdCBkb2VzLCAKbGV0cyBzdGFydCBieSBsb29raW5nIGF0IHRoZSA8Q09ERT5jcmVhdGVFZGl0UG9saWNpZXMoKTwvQ09ERT4gbWV0aG9kIGluIDxDT0RFPlRhYmxlUGFydDwvQ09ERT46Cjxmb250IGNvbG9yPSIjMDAwMGNjIj4KPHByZT5wcm90ZWN0ZWQgdm9pZCBjcmVhdGVFZGl0UG9saWNpZXMoKQp7CiAgICBpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkdSQVBISUNBTF9OT0RFX1JPTEUsIG5ldyBUYWJsZU5vZGVFZGl0UG9saWN5KCkpOwogICAgaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5MQVlPVVRfUk9MRSwgbmV3IFRhYmxlTGF5b3V0RWRpdFBvbGljeSgpKTsKICAgIGluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuQ09OVEFJTkVSX1JPTEUsIG5ldyBUYWJsZUNvbnRhaW5lckVkaXRQb2xpY3koKSk7CiAgICBpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkNPTVBPTkVOVF9ST0xFLCBuZXcgVGFibGVFZGl0UG9saWN5KCkpOwogICAgaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5ESVJFQ1RfRURJVF9ST0xFLCBuZXcgVGFibGVEaXJlY3RFZGl0UG9saWN5KCkpOwp9PC9wcmU+CjwvZm9udD4KPHA+ClRoZSBwdXJwb3NlIG9mIHRoaXMgbWV0aG9kIGlzIHNpbXBseSB0byBkZWNvcmF0ZSB0aGUgPENPREU+VGFibGVQYXJ0PC9DT0RFPiB3aXRoIGVkaXRpbmcgZnVuY3Rpb25hbGl0eS4gCkVhY2ggY2FsbCB0byA8Q09ERT5pbnN0YWxsRWRpdFBvbGljeSgpPC9DT0RFPiBpbiB0aGUgYWJvdmUgbWV0aG9kIApyZWdpc3RlcnMgYW4gPENPREU+RWRpdFBvbGljeTwvQ09ERT4gd2l0aCB0aGUgPENPREU+RWRpdFBhcnQ8L0NPREU+LiAKVGhlIGtleSBjb25zdGFudCB1c2VkIGluIGVhY2ggb2YgdGhlc2UgY2FsbHMgaXMgdGhlIG5hbWUgb2YgdGhlIDxCPnJvbGU8L0I+IHVzZWQuIApGb3IgZXhhbXBsZSwgPENPREU+RWRpdFBvbGljeS5DT05UQUlORVJfUk9MRTwvQ09ERT4gaXMgCnNpbXBseSB0aGUgc3RyaW5nIDxJPiJDb250YWluZXJFZGl0UG9saWN5IjwvST4uIApUaGUgY29udGFpbmVyIHJvbGUgaXMgcmVsZXZhbnQgZm9yIDxDT0RFPlRhYmxlUGFydDwvQ09ERT4gYmVjYXVzZSB3ZSBrbm93IHRoYXQgdGFibGVzIGNvbnRhaW4KY29sdW1ucywgYW5kIG9uZSBvZiBvdXIgYXBwbGljYXRpb24ncyByZXF1aXJlbWVudHMgaXMgdG8gY3JlYXRlIG5ldyBjb2x1bW5zIAphbmQgYWRkIHRoZXNlIHRvIGV4aXN0aW5nIHRhYmxlcy4KPC9wPgo8cD4KVGhlIHVzZSBvZiBhIHBhcnRpY3VsYXIgcm9sZSBuYW1lIGluIHRoZSA8Q09ERT5pbnN0YWxsRWRpdFBvbGljeSgpPC9DT0RFPiBjYWxsIGlzIHJlYWxseSBqdXN0IGEgY29udmVudGlvbiAtIHRoZSBmcmFtZXdvcmsgZG9lcyBub3QgCmF0dGFjaCBhbnkgYmVoYXZpb3IgdG8gYSBwYXJ0aWN1bGFyIGNob2ljZSBvZiByb2xlIG5hbWUuIApXaGF0IGRpc3Rpbmd1aXNoZXMgYW4gPENPREU+RWRpdFBvbGljeTwvQ09ERT4gaW1wbGVtZW50YXRpb24gKGFuZCBpdHMgY29ycmVzcG9uZGluZyByb2xlKSBpcyB0aGUgdHlwZSBvZiByZXF1ZXN0cyBpdCB1bmRlcnN0YW5kcy4gCk1vc3Qgb2YgdGhlIGFic3RyYWN0IDxDT0RFPkVkaXRQb2xpY3k8L0NPREU+IGNsYXNzZXMKcHJvdmlkZSBhbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgPENPREU+Z2V0Q29tbWFuZChSZXF1ZXN0IHJlcXVlc3QpPC9DT0RFPiBtZXRob2QuCjwvcD4gCjxwPiAKSW4gPENPREU+Q29udGFpbmVyRWRpdFBvbGljeTwvQ09ERT4gd2UgZmluZCB0aGUgZm9sbG93aW5nOgoKPGZvbnQgY29sb3I9IiMwMDAwY2MiPgo8cHJlPnB1YmxpYyBDb21tYW5kIGdldENvbW1hbmQoUmVxdWVzdCByZXF1ZXN0KSB7CiAgaWYgKFJFUV9DUkVBVEUuZXF1YWxzKHJlcXVlc3QuZ2V0VHlwZSgpKSkKCXJldHVybiBnZXRDcmVhdGVDb21tYW5kKChDcmVhdGVSZXF1ZXN0KXJlcXVlc3QpOwogIGlmIChSRVFfQURELmVxdWFscyhyZXF1ZXN0LmdldFR5cGUoKSkpCglyZXR1cm4gZ2V0QWRkQ29tbWFuZCgoR3JvdXBSZXF1ZXN0KXJlcXVlc3QpOwogIGlmIChSRVFfQ0xPTkUuZXF1YWxzKHJlcXVlc3QuZ2V0VHlwZSgpKSkKCXJldHVybiBnZXRDbG9uZUNvbW1hbmQoKENoYW5nZUJvdW5kc1JlcXVlc3QpcmVxdWVzdCk7CiAgaWYgKFJFUV9PUlBIQU5fQ0hJTERSRU4uZXF1YWxzKHJlcXVlc3QuZ2V0VHlwZSgpKSkKCXJldHVybiBnZXRPcnBoYW5DaGlsZHJlbkNvbW1hbmQoKEdyb3VwUmVxdWVzdClyZXF1ZXN0KTsKICByZXR1cm4gbnVsbDsKfTwvcHJlPgo8L2ZvbnQ+CjxwPgpIZXJlIDxDT0RFPmdldENvbW1hbmQoKTwvQ09ERT4gc2ltcGx5IHVzZXMgdGhlIHJlcXVlc3QgdHlwZSB0byBkZXRlcm1pbmUgd2hpY2ggPENPREU+Z2V0WFhYQ29tbWFuZCgpPC9DT0RFPiBtZXRob2QgdG8gY2FsbC4gCkluIDxDT0RFPkNvbnRhaW5lckVkaXRQb2xpY3k8L0NPREU+LCA8Q09ERT5nZXRDcmVhdGVDb21tYW5kKCk8L0NPREU+IGlzIGFic3RyYWN0IC0gCndlIG11c3QgcHJvdmlkZSBhbiBpbXBsZW1lbnRhdGlvbiBpbiBvcmRlciB0byB1c2UgdGhlIGJhc2UgPENPREU+Q29udGFpbmVyRWRpdFBvbGljeTwvQ09ERT4gZnVuY3Rpb25hbGl0eS4KPC9wPgo8cD4KSGVyZSBpcyBvdXIgaW1wbGVtZW50YXRpb24gb2YgPENPREU+VGFibGVDb250YWluZXJFZGl0UG9saWN5PC9DT0RFPjoKCjxmb250IGNvbG9yPSIjMDAwMGNjIj4KPHByZT5wdWJsaWMgY2xhc3MgVGFibGVDb250YWluZXJFZGl0UG9saWN5IGV4dGVuZHMgQ29udGFpbmVyRWRpdFBvbGljeQp7CiAgICBwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZVJlcXVlc3QgcmVxdWVzdCkKICAgIHsKICAgIDxpbWcgc3JjPSJpbWFnZXMvdGFnXzEuZ2lmIiBoZWlnaHQ9MTMgd2lkdGg9MjQgYWxpZ249Q0VOVEVSPiBPYmplY3QgbmV3T2JqZWN0ID0gcmVxdWVzdC5nZXROZXdPYmplY3QoKTsKICAgICAgICBpZiAoIShuZXdPYmplY3QgaW5zdGFuY2VvZiBDb2x1bW4pKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIENvbHVtbiBjb2x1bW4gPSAoQ29sdW1uKSBuZXdPYmplY3Q7CgogICAgPGltZyBzcmM9ImltYWdlcy90YWdfMi5naWYiIGhlaWdodD0xMyB3aWR0aD0yNCBhbGlnbj1DRU5URVI+IFRhYmxlUGFydCB0YWJsZVBhcnQgPSAoVGFibGVQYXJ0KSBnZXRIb3N0KCk7CiAgICAgICAgVGFibGUgdGFibGUgPSB0YWJsZVBhcnQuZ2V0VGFibGUoKTsKICAgIDxpbWcgc3JjPSJpbWFnZXMvdGFnXzMuZ2lmIiBoZWlnaHQ9MTMgd2lkdGg9MjQgYWxpZ249Q0VOVEVSPiBDb2x1bW5DcmVhdGVDb21tYW5kIGNvbW1hbmQgPSBuZXcgQ29sdW1uQ3JlYXRlQ29tbWFuZCgpOwogICAgICAgIGNvbW1hbmQuc2V0VGFibGUodGFibGUpOwogICAgICAgIGNvbW1hbmQuc2V0Q29sdW1uKGNvbHVtbik7CiAgICAgICAgcmV0dXJuIGNvbW1hbmQ7CiAgICB9Cn08L3ByZT4KPC9mb250Pgo8cD4KSW4gbW9zdCBjYXNlcywgb3VyIDxDT0RFPkVkaXRQb2xpY3k8L0NPREU+IGltcGxlbWVudGF0aW9ucyBzaW1wbHkgYW1vdW50IHRvIHVzaW5nIGEgCjxDT0RFPlJlcXVlc3Q8L0NPREU+IG9iamVjdCB0byBnZW5lcmF0ZSBhIDxDT0RFPkNvbW1hbmQ8L0NPREU+LiAKT3VyIDxDT0RFPmdldENyZWF0ZUNvbW1hbmQoKTwvQ09ERT4gbWV0aG9kIAo8dWw+CiAgPGxpPjxpbWcgc3JjPSJpbWFnZXMvdGFnXzEuZ2lmIiBoZWlnaHQ9MTMgd2lkdGg9MjQgYWxpZ249Q0VOVEVSPiBnZXRzIHRoZSBuZXcgb2JqZWN0IGVtYm9kaWVkIGluIHRoZSA8Q09ERT5DcmVhdGVSZXF1ZXN0PC9DT0RFPiAKICBhbmQgbWFrZXMgc3VyZSB0aGF0IGl0IGlzIGFuIGluc3RhbmNlIG9mIDxDT0RFPkNvbHVtbjwvQ09ERT4sPC9saT4KICA8bGk+PGltZyBzcmM9ImltYWdlcy90YWdfMi5naWYiIGhlaWdodD0xMyB3aWR0aD0yNCBhbGlnbj1DRU5URVI+IGdldHMgdGhlIDxDT0RFPlRhYmxlPC9DT0RFPiBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIAogIHRoZSBob3N0IDxDT0RFPkVkaXRQYXJ0PC9DT0RFPiwgYW5kPC9saT4KICA8bGk+PGltZyBzcmM9ImltYWdlcy90YWdfMy5naWYiIGhlaWdodD0xMyB3aWR0aD0yNCBhbGlnbj1DRU5URVI+IGNyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHJlbGV2YW50IDxDT0RFPkNvbW1hbmQ8L0NPREU+IGNsYXNzLCAKICBjb25maWd1cmVzIGl0IHdpdGggdGhlIDxDT0RFPlRhYmxlPC9DT0RFPiBhbmQgPENPREU+Q29sdW1uPC9DT0RFPiBpbmZvcm1hdGlvbiwgYW5kIHJldHVybnMgaXQ8L2xpPgo8L3VsPgpPdXIgPENPREU+VGFibGVQYXJ0PC9DT0RFPiA8Q09ERT5jcmVhdGVFZGl0UG9saWNpZXMoKTwvQ09ERT4gaW1wbGVtZW50YXRpb24gdXNlcyBvbmUgb2YgCm91ciBjdXN0b21pemVkIDxDT0RFPkVkaXRQb2xpY3k8L0NPREU+IGltcGxlbWVudGF0aW9ucyBmb3IgZWFjaCBpbnZvY2F0aW9uIG9mIAo8Q09ERT5pbnN0YWxsRWRpdFBvbGljeSgpPC9DT0RFPi4gCkVhY2ggb2Ygb3VyIDxDT0RFPkVkaXRQb2xpY3k8L0NPREU+IGltcGxlbWVudGF0aW9ucyBzdWJjbGFzc2VzIGEgR0VGLXByb3ZpZGVkIGFic3RyYWN0IDxDT0RFPkVkaXRQb2xpY3k8L0NPREU+IGZvciBhIGRpZmZlcmVudCByb2xlLiAKRm9yIGV4YW1wbGUsIDxDT0RFPlRhYmxlRWRpdFBvbGljeTwvQ09ERT4gZXh0ZW5kcyA8Q09ERT5Db21wb25lbnRFZGl0UG9saWN5PC9DT0RFPiB0bwpmdWxmaWxsIHRoZSA8Q09ERT5FZGl0UG9saWN5LkNPTVBPTkVOVF9ST0xFPC9DT0RFPi4gCkl0IGRvZXMgc28gYnkgaW1wbGVtZW50aW5nIHRoZSAKPENPREU+Y3JlYXRlRGVsZXRlQ29tbWFuZChHcm91cFJlcXVlc3QgcmVxdWVzdCk8L0NPREU+IHRvIGhhbmRsZSByZXF1ZXN0cyBvZiB0eXBlIDxDT0RFPlJFUV9ERUxFVEU8L0NPREU+Lgo8cD4KVGhlIEdFRiBwbGF0Zm9ybSBkb2N1bWVudGF0aW9uIHByb3ZpZGVzIGEgbG90IG1vcmUgZGV0YWlsIG9uIHRoZSB0eXBlcyBvZiByb2xlcyBhbmQgcmVxdWVzdHMgYW5kIGhvdyBhbmQgd2hlbiB0aGV5IGNhbiBiZSB1c2VkLCAKc28gd2Ugd29uJ3QgY292ZXIgdGhlbSBpbiBhbnkgbW9yZSBkZXRhaWwgaGVyZS4KPC9wPgo8aDM+Q29tbWFuZHM8L2gzPgoKPHA+CjxDT0RFPkNvbW1hbmQ8L0NPREU+IGlzIEdFRidzIGFic3RyYWN0IGJhc2UgY2xhc3Mgd2hvc2UgZnVuY3Rpb24gaXMgc2ltcGx5IHRvIGVuY2Fwc3VsYXRlIG91ciBhcHBsaWNhdGlvbidzIHJlc3BvbnNlIHRvIGEgcmVxdWVzdC4gIApLZXkgbWV0aG9kcyBpbmNsdWRlZCBpbiB0aGUgPENPREU+Q29tbWFuZDwvQ09ERT4gY2xhc3MgYXJlIHRoZSBmb2xsb3dpbmc6IAo8dWw+CiAgPGxpPjxDT0RFPmV4ZWN1dGUoKTwvQ09ERT46ICAKICA8Q09ERT5Db21tYW5kPC9DT0RFPiBwcm92aWRlcyBhIG5vLW9wIGltcGxlbWVudGF0aW9uLiBBcyB0aGUgbmFtZSBzdWdnZXN0cywgCiAgdGhpcyBjb250YWlucyB0aGUgY29kZSB0byBhcHBseSBhbnkgY2hhbmdlIHRvIHRoZSBtb2RlbCB0aGF0IHRoZSA8Q09ERT5Db21tYW5kPC9DT0RFPiBvYmplY3QgZW5jYXBzdWxhdGVzPC9saT4KICA8bGk+PENPREU+dW5kbygpPC9DT0RFPjogdXNlZCB0byByZXZlcnNlIHRoZSBlZmZlY3Qgb2YgPENPREU+ZXhlY3V0ZSgpPC9DT0RFPi4gCiAgSGVyZSA8Q09ERT5Db21tYW5kPC9DT0RFPiBhbHNvIHByb3ZpZGVzIGEgbm8tb3AgaW1wbGVtZW50YXRpb248L2xpPgogIDxsaT48Q09ERT5yZWRvKCk8L0NPREU+OiB1c2VkIHJlZG8gYSBjb21tYW5kIGV4ZWN1dGlvbi4gCiAgVGhlIDxDT0RFPkNvbW1hbmQ8L0NPREU+IGltcGxlbWVudGF0aW9uIHNpbXBseSBjYWxscyA8Q09ERT5leGVjdXRlKCk8L0NPREU+LCB3aGljaCBzaG91bGQgdXN1YWxseSBiZSBhZGVxdWF0ZTwvbGk+ICAKICA8bGk+PENPREU+Y2FuRXhlY3V0ZSgpPC9DT0RFPjogd2hldGhlciA8Q09ERT5leGVjdXRlKCk8L0NPREU+IGNhbiBiZSBleGVjdXRlZC4gCiAgVGhlIHN1YmNsYXNzIGNhbiBpbXBsZW1lbnQgdGhpcyB0byBzcGVjaWZ5IHRoZSBjb25kaXRpb25zIHVuZGVyIHdoaWNoIHRoZSBjb21tYW5kIGNhbiBiZSBleGVjdXRlZDwvbGk+CiAgPGxpPjxDT0RFPmNhblVuZG8oKTwvQ09ERT46IHdoZXRoZXIgPENPREU+dW5kbygpPC9DT0RFPiBjYW4gYmUgZXhlY3V0ZWQuIAogIFRoZSA8Q09ERT5Db21tYW5kPC9DT0RFPiBpbXBsZW1lbnRhdGlvbiBzaW1wbHkgcmV0dXJucyB0cnVlLCB3aGljaCBzdWJjbGFzc2VzIGNhbiBvdmVycmlkZTwvbGk+CiAgPGxpPjxDT0RFPmNhblJlZG8oKTwvQ09ERT46IHdoZXRoZXIgPENPREU+cmVkbygpPC9DT0RFPiBjYW4gYmUgZXhlY3V0ZWQuIFRoZSA8Q09ERT5Db21tYW5kPC9DT0RFPiBpbXBsZW1lbnRhdGlvbiBoZXJlIGFsc28gc2ltcGx5IHJldHVybnMgdHJ1ZTwvbGk+CjwvdWw+CjxwPgpBbnkgbm9uLXRyaXZpYWwgPENPREU+Q29tbWFuZDwvQ09ERT4gc3ViY2xhc3Mgd291bGQgbmVlZCB0byBpbXBsZW1lbnQgPENPREU+ZXhlY3V0ZSgpPC9DT0RFPi4gCkltcGxlbWVudGF0aW9uIG9mIDxDT0RFPnVuZG8oKTwvQ09ERT4gd291bGQgYmUgcmVjb21tZW5kZWQgaW4gbW9zdCBjYXNlcy4gVGhlIG90aGVyIG1ldGhvZHMKYXJlIG9wdGlvbmFsIGFuZCB3b3VsZCBvbmx5IGJlIG92ZXJyaWRkZW4gYXMgcmVxdWlyZWQuCjwvcD4KPHA+CkxldHMgdGFrZSBhIGxvb2sgYXQgb3VyIHJhdGhlciBzdHJhaWdodGZvcndhcmQgPENPREU+Q29sdW1uQ3JlYXRlQ29tbWFuZDwvQ09ERT4gaW1wbGVtZW50YXRpb246Cgo8Zm9udCBjb2xvcj0iIzAwMDBjYyI+CjxwcmU+cHVibGljIGNsYXNzIENvbHVtbkNyZWF0ZUNvbW1hbmQgZXh0ZW5kcyBDb21tYW5kCnsKICAgIHByaXZhdGUgQ29sdW1uIGNvbHVtbjsKICAgIHByaXZhdGUgVGFibGUgdGFibGU7CgogICAgcHVibGljIHZvaWQgc2V0Q29sdW1uKENvbHVtbiBjb2x1bW4pCiAgICB7CiAgICAgICAgdGhpcy5jb2x1bW4gPSBjb2x1bW47CiAgICA8aW1nIHNyYz0iaW1hZ2VzL3RhZ18xLmdpZiIgaGVpZ2h0PTEzIHdpZHRoPTI0IGFsaWduPUNFTlRFUj4gdGhpcy5jb2x1bW4uc2V0TmFtZSgmcXVvdDtDT0xVTU4gJnF1b3Q7ICsgKHRhYmxlLmdldENvbHVtbnMoKS5zaXplKCkgKyAxKSk7CiAgICAgICAgdGhpcy5jb2x1bW4uc2V0VHlwZShDb2x1bW4uVkFSQ0hBUik7CiAgICB9CgogICAgcHVibGljIHZvaWQgc2V0VGFibGUoVGFibGUgdGFibGUpCiAgICB7CiAgICAgICAgdGhpcy50YWJsZSA9IHRhYmxlOwogICAgfQoKICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKQogICAgewogICAgPGltZyBzcmM9ImltYWdlcy90YWdfMi5naWYiIGhlaWdodD0xMyB3aWR0aD0yNCBhbGlnbj1DRU5URVI+IHRhYmxlLmFkZENvbHVtbihjb2x1bW4pOwogICAgfQoKICAgIHB1YmxpYyB2b2lkIHVuZG8oKQogICAgewogICAgPGltZyBzcmM9ImltYWdlcy90YWdfMy5naWYiIGhlaWdodD0xMyB3aWR0aD0yNCBhbGlnbj1DRU5URVI+IHRhYmxlLnJlbW92ZUNvbHVtbihjb2x1bW4pOwogICAgfQp9PC9wcmU+CjwvZm9udD4KTXVjaCBvZiB0aGUgY2xhc3MgaXMgc2VsZi1leHBsYW5hdG9yeS4gCldlIGhhdmUgc2V0dGVyIG1ldGhvZHMgdG8gcG9wdWxhdGUgdGhlIDxDT0RFPkNvbW1hbmQ8L0NPREU+IG9iamVjdCAKd2l0aCB0aGUgbmV3bHktY3JlYXRlZCA8Q09ERT5Db2x1bW48L0NPREU+IGFzIHdlbGwgYXMgdGhlIAp0YXJnZXQgY29udGFpbmVyIDxDT0RFPlRhYmxlPC9DT0RFPi4gCldlIGFyYml0cmFyaWx5IHByb3ZpZGUgYSBuYW1lIGFuZCB0eXBlIGZvciB0aGUgPENPREU+Q29sdW1uPC9DT0RFPiA8aW1nIHNyYz0iaW1hZ2VzL3RhZ18xLmdpZiIgaGVpZ2h0PTEzIHdpZHRoPTI0IGFsaWduPUNFTlRFUj4sIAp3aGljaCB0aGUgdXNlciBjYW4gbGF0ZXIgY2hhbmdlLgpXZSBjYW4gYWxzbyBzZWUgdGhhdCA8Q09ERT5leGVjdXRlKCk8L0NPREU+IDxpbWcgc3JjPSJpbWFnZXMvdGFnXzIuZ2lmIiBoZWlnaHQ9MTMgd2lkdGg9MjQgYWxpZ249Q0VOVEVSPgpzaW1wbHkgYWRkcyB0aGUgPENPREU+Q29sdW1uPC9DT0RFPiBvYmplY3QgdG8gdGhlIDxDT0RFPlRhYmxlPC9DT0RFPiwgCmFuZCA8Q09ERT51bmRvKCk8L0NPREU+IDxpbWcgc3JjPSJpbWFnZXMvdGFnXzMuZ2lmIiBoZWlnaHQ9MTMgd2lkdGg9MjQgYWxpZ249Q0VOVEVSPiBzaW1wbHkgcmV2ZXJzZXMgdGhhdCBjaGFuZ2UuCjxwPgpUaGUgdXNlIG9mIDxDT0RFPkNvbW1hbmRzPC9DT0RFPiBoYXMgdHdvIGtleSBhZHZhbnRhZ2VzIG92ZXIgdXNpbmcgPENPREU+RWRpdFBvbGljaWVzPC9DT0RFPiBkaXJlY3RseSB0byBlZmZlY3QgbW9kZWwgY2hhbmdlcwo8dWw+CiAgPGxpPkNvbW1hbmRzIGFyZSBtb3JlIGVsZWdhbnQgYW5kIGluIGxpbmUgd2l0aCBPTyBiZXN0IHByYWN0aWNlPC9saT4KICA8bGk+VGhlIDxDT0RFPkNvbW1hbmQ8L0NPREU+IGZyYW1ld29yayBoYXMgYnVpbHQtaW4gc3VwcG9ydCBmb3IgdW5kbyBhbmQgcmVkbyBmdW5jdGlvbmFsaXR5PC9saT4KPC91bD4KPHA+CjxpbWcgc3JjPSJpbWFnZXMvdGlwLmdpZiIgd2lkdGg9IjYyIiBoZWlnaHQ9IjEzIj4gIFRoZSA8Q09ERT5Db21tYW5kPC9DT0RFPiBpbXBsZW1lbnRhdGlvbiBpcyBjbG9zZWx5IHRpZWQgdG8gdGhlIG1vZGVsLCAKYW5kIHNob3VsZCBiZSBjbGVhbmx5IHNlcGFyYXRlZCBmcm9tIEdFRi1zcGVjaWZpYyBjb21wb25lbnRzLiAKSXQgc2hvdWxkIG5vdCBjb250YWluIGFueSByZWZlcmVuY2VzIHRvIDxDT0RFPkVkaXRQYXJ0czwvQ09ERT4gb3IgPENPREU+RWRpdFBvbGljaWVzPC9DT0RFPi4gCk9ic2VydmluZyB0aGlzIHJ1bGUgcHJlc2VydmVzIHRoZSBjbGVhbiBzZXBhcmF0aW9uCmJldHdlZW4gY29tbWFuZHMgYW5kIHRoZSBVSSBsb2dpYywgaGVscGluZyB0byBrZWVwIGNvZGUgbW9yZSBtYWludGFpbmFibGUgYW5kIGJ1Zy1mcmVlLgo8L3A+CgoKPGgyPlByb3BhZ2F0aW5nIE1vZGVsIENoYW5nZXM8L2gyPgoKPHA+Ck9uY2Ugd2UndmUgY2hhbmdlZCB0aGUgbW9kZWwsIG91ciBHRUYgZWRpdG9yIG5lZWRzIHRvIHByb3BhZ2F0ZSB0aGVzZSBjaGFuZ2VzIHRvIHRoZSBVSS4gT3VyIG1vZGVsLCB2aWV3IGFuZCBjb250cm9sbGVyIG5lZWQKdG8gd29yayB0b2dldGhlciB0byBhY2hpZXZlIHRoaXMuCjwvcD4KPHA+ClNvIGZhciwgd2UgaGF2ZSBkaXNjdXNzZWQgdGhlIDxDT0RFPkdyYXBoaWNhbEVkaXRQYXJ0PC9DT0RFPidzIHJlc3BvbnNpYmlsaXR5IHRvIHByb3ZpZGUgYSBmaWd1cmUgCnRvIHJlcHJlc2VudCB0aGUgcGFydCBvZiB0aGUgbW9kZWwgaXQgaXMgbWFuYWdpbmcuClRvIHBhcnRpY2lwYXRlIGluIGEgZnVsbHkgZnVuY3Rpb25hbCBncmFwaGljYWwgZWRpdG9yLCBpdCBuZWVkcyB0byBkbyBtb3JlOgo8dWw+CiAgPGxpPkl0IG5lZWRzIHRvIGFjdCBhcyBhIDxCPmxpc3RlbmVyPC9CPiBmb3IgY2hhbmdlcyBpbiB0aGUgbW9kZWwuIAogIFRoZSBtb2RlbCBpdHNlbGYgbmVlZHMgdG8gPEI+ZmlyZSBldmVudCBub3RpZmljYXRpb25zPC9CPiB3aGljaCB0aGUgPENPREU+RWRpdFBhcnQ8L0NPREU+IGNhbiByZWNlaXZlPC9saT4KICA8bGk+SXQgbmVlZHMgdG8gbWFpbnRhaW4gaXRzIG93biAKICBjaGlsZCBhbmQgY29ubmVjdGlvbiByZWxhdGlvbnNoaXBzIHdpdGggb3RoZXIgPENPREU+RWRpdFBhcnRzPC9DT0RFPiwga2VlcGluZyB0aGVzZSBpbiBzeW5jIHdpdGggY2hhbmdlcyB0byB0aGUgbW9kZWw8L2xpPgogIDxsaT5JdCBuZWVkcyB0byB1cGRhdGUgdGhlIGZpZ3VyZXMgdGhhdCBpdCBpcyBtYW5hZ2luZywgYW5kIHRoZWlyIGxheW91dHMsIGluIGxpbmUgd2l0aCBtb2RlbCBjaGFuZ2VzPC9saT4KPC91bD4KV2UgZGlzY3VzcyBlYWNoIG9mIHRoZXNlIGluIHR1cm4uCgo8aDM+U2VuZGluZyBhbmQgUmVjZWl2aW5nIEV2ZW50IE5vdGlmaWNhdGlvbnM8L2gzPgo8cD4KVGhlIHJlcXVpcmVtZW50cyBpbXBvc2VkIG9uIG91ciBtb2RlbCBpbXBsZW1lbnRhdGlvbiBhcmUgdGhhdAo8b2w+CiAgPGxpPml0IGV4cG9zZXMgYSBtZWNoYW5pc20gYnkgd2hpY2ggbGlzdGVuZXJzIGNhbiByZWdpc3RlciBpbnRlcmVzdCBpbiBldmVudCBub3RpZmljYXRpb25zLCBhbmQ8L2xpPgogIDxsaT5pdCBhY3R1YWxseSBmaXJlcyB0aGVzZSBldmVudCBub3RpZmljYXRpb25zIGF0IHRoZSBhcHByb3ByaWF0ZSB0aW1lcyE8L2xpPgo8L29sPgpJbiBvdXIgZXhhbXBsZSBhcHBsaWNhdGlvbiB3ZSB3YW50IGFsbCBvdXIgbW9kZWwgb2JqZWN0cyB0byB1c2UgYSBjb21tb24gZnJhbWV3b3JrLCAKc28gd2Ugc2F0aXNmeSB0aGUgZmlyc3QgcmVxdWlyZW1lbnQgYnkgCmFsbG93aW5nIGFsbCBvdXIgbW9kZWwgY2xhc3NlcyB0byBleHRlbmQgPENPREU+UHJvcGVydHlBd2FyZU9iamVjdDwvQ09ERT4sIHdoaWNoIGxvb2tzIGxpa2UgdGhpczoKCjxmb250IGNvbG9yPSIjMDAwMGNjIj4KPHByZT5wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUHJvcGVydHlBd2FyZU9iamVjdCBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZQp7Cgo8aW1nIHNyYz0iaW1hZ2VzL3RhZ18xLmdpZiIgaGVpZ2h0PTEzIHdpZHRoPTI0IGFsaWduPUNFTlRFUj4gcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hJTEQgPSAmcXVvdDtDSElMRCZxdW90OzsKICAgIC4uLiBvdGhlciBTdHJpbmcgY29uc3RhbnRzIHJlcHJlc2VudGluZyB0aGUgb3RoZXIgdHlwZXMgb2YgbW9kZWwgY2hhbmdlcwoJCiAgICA8aW1nIHNyYz0iaW1hZ2VzL3RhZ18yLmdpZiIgaGVpZ2h0PTEzIHdpZHRoPTI0IGFsaWduPUNFTlRFUj4gcHJvdGVjdGVkIHRyYW5zaWVudCBQcm9wZXJ0eUNoYW5nZVN1cHBvcnQgbGlzdGVuZXJzID0gbmV3IFByb3BlcnR5Q2hhbmdlU3VwcG9ydCh0aGlzKTsKCiAgICBwcm90ZWN0ZWQgUHJvcGVydHlBd2FyZU9iamVjdCgpCiAgICB7CiAgICB9CgogICAgcHVibGljIHZvaWQgYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGwpCiAgICB7CiAgICA8aW1nIHNyYz0iaW1hZ2VzL3RhZ18zLmdpZiIgaGVpZ2h0PTEzIHdpZHRoPTI0IGFsaWduPUNFTlRFUj4gbGlzdGVuZXJzLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIobCk7CiAgICB9CgogICAgcHVibGljIHZvaWQgcmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGwpCiAgICB7CiAgICA8aW1nIHNyYz0iaW1hZ2VzL3RhZ180LmdpZiIgaGVpZ2h0PTEzIHdpZHRoPTI0IGFsaWduPUNFTlRFUj4gbGlzdGVuZXJzLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIobCk7CiAgICB9CiAgCiAgICBwcm90ZWN0ZWQgdm9pZCBmaXJlUHJvcGVydHlDaGFuZ2UoU3RyaW5nIHByb3AsIE9iamVjdCBvbGQsIE9iamVjdCBuZXdWYWx1ZSkKICAgIHsKICAgIDxpbWcgc3JjPSJpbWFnZXMvdGFnXzUuZ2lmIiBoZWlnaHQ9MTMgd2lkdGg9MjQgYWxpZ249Q0VOVEVSPiBsaXN0ZW5lcnMuZmlyZVByb3BlcnR5Q2hhbmdlKHByb3AsIG9sZCwgbmV3VmFsdWUpOwogICAgfQogICAgCiAgICAuLi4KfTwvcHJlPgo8L2ZvbnQ+CgpPdXIgYWJzdHJhY3QgbW9kZWwgYmFzZSBjbGFzcyAKY29udGFpbnMgYSBmZXcgPENPREU+U3RyaW5nPC9DT0RFPiBjb25zdGFudHMgPGltZyBzcmM9ImltYWdlcy90YWdfMS5naWYiIGhlaWdodD0xMyB3aWR0aD0yNCBhbGlnbj1DRU5URVI+IApyZXByZXNlbnRpbmcgdGhlIHR5cGVzIG9mIG1vZGVsIGNoYW5nZXMgaXQga25vd3MgYWJvdXQuIApJdCB1c2VzIHRoZSA8Q09ERT5qYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlU3VwcG9ydDwvQ09ERT4gPGltZyBzcmM9ImltYWdlcy90YWdfMi5naWYiIGhlaWdodD0xMyB3aWR0aD0yNCBhbGlnbj1DRU5URVI+CnRvIHByb3ZpZGUgdGhlICJwbHVtYmluZyIgZm9yIHRoZSBldmVudCBoYW5kbGluZy4gCkl0IGFsc28gZXhwb3NlcyBtZXRob2RzIDxpbWcgc3JjPSJpbWFnZXMvdGFnXzMuZ2lmIiBoZWlnaHQ9MTMgd2lkdGg9MjQgYWxpZ249Q0VOVEVSPiAKYW5kIDxpbWcgc3JjPSJpbWFnZXMvdGFnXzQuZ2lmIiBoZWlnaHQ9MTMgd2lkdGg9MjQgYWxpZ249Q0VOVEVSPiB3aGljaCBvYnNlcnZlcnMgY2FuIHVzZSB0byByZWdpc3RlciBhbmQgZGVyZWdpc3RlciB0aGVpcgppbnRlcmVzdCBpbiBtb2RlbCBjaGFuZ2VzLiAKRmluYWxseSwgaXQgaW5jbHVkZXMgYSA8Q09ERT5maXJlUHJvcGVydHlDaGFuZ2UoKTwvQ09ERT4gPGltZyBzcmM9ImltYWdlcy90YWdfNS5naWYiIGhlaWdodD0xMyB3aWR0aD0yNCBhbGlnbj1DRU5URVI+IG1ldGhvZCAKd2hpY2ggc3ViY2xhc3NlcyBjYW4gdXNlIHRvIHRyaWdnZXIgcHJvcGVydHkgZXZlbnRzLgpJbiBvdXIgZXhhbXBsZSBvZiBhZGRpbmcgYSBjb2x1bW4gdG8gYSB0YWJsZSwgd2Ugc2VlIGEgZ29vZCBleGFtcGxlIGluIDxDT0RFPlRhYmxlPC9DT0RFPjoKCjxmb250IGNvbG9yPSIjMDAwMGNjIj4KPHByZT5wdWJsaWMgdm9pZCBhZGRDb2x1bW4oQ29sdW1uIGNvbHVtbikKewogICAgY29sdW1ucy5hZGQoY29sdW1uKTsKICAgIGZpcmVQcm9wZXJ0eUNoYW5nZShDSElMRCwgbnVsbCwgY29sdW1uKTsKfTwvcHJlPgo8L2ZvbnQ+CgpXaXRoIHRoaXMgbWVjaGFuaXNtIGF2YWlsYWJsZSwgd2Ugbm93IG5lZWQgdG8gdGFrZSBhZHZhbnRhZ2UgaW4gb3VyIDxDT0RFPkVkaXRQYXJ0PC9DT0RFPiBsaXN0ZW5lcnMuIApPbmNlIGFnYWluLCB3ZSBhZGRyZXNzIHRoZSBpc3N1ZQpieSBwcm92aWRpbmcgYSBjb21tb24gYmFzZSBjbGFzcyBmb3Igb3VyIDxDT0RFPkdyYXBoaWNhbEVkaXRQYXJ0czwvQ09ERT4gdG8gZXh0ZW5kLCBzaG93biBiZWxvdzoKICAKPGZvbnQgY29sb3I9IiMwMDAwY2MiPgo8cHJlPnB1YmxpYyBhYnN0cmFjdCBjbGFzcyBQcm9wZXJ0eUF3YXJlUGFydCAKCQlleHRlbmRzIEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgCgkJaW1wbGVtZW50cyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyCnsKICAgIHB1YmxpYyB2b2lkIGFjdGl2YXRlKCkKICAgIHsKICAgICAgICBzdXBlci5hY3RpdmF0ZSgpOwogICAgICAgIFByb3BlcnR5QXdhcmVPYmplY3QgcHJvcGVydHlBd2FyZU9iamVjdCA9IChQcm9wZXJ0eUF3YXJlT2JqZWN0KSBnZXRNb2RlbCgpOwogICAgPGltZyBzcmM9ImltYWdlcy90YWdfMS5naWYiIGhlaWdodD0xMyB3aWR0aD0yNCBhbGlnbj1DRU5URVI+IHByb3BlcnR5QXdhcmVPYmplY3QuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKICAgIH0KCiAgICBwdWJsaWMgdm9pZCBkZWFjdGl2YXRlKCkKICAgIHsKICAgICAgICBzdXBlci5kZWFjdGl2YXRlKCk7CiAgICAgICAgUHJvcGVydHlBd2FyZU9iamVjdCBwcm9wZXJ0eUF3YXJlT2JqZWN0ID0gKFByb3BlcnR5QXdhcmVPYmplY3QpIGdldE1vZGVsKCk7CiAgICA8aW1nIHNyYz0iaW1hZ2VzL3RhZ18yLmdpZiIgaGVpZ2h0PTEzIHdpZHRoPTI0IGFsaWduPUNFTlRFUj4gcHJvcGVydHlBd2FyZU9iamVjdC5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHRoaXMpOwogICAgfQoKICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZ0KQogICAgewogICAgPGltZyBzcmM9ImltYWdlcy90YWdfMy5naWYiIGhlaWdodD0xMyB3aWR0aD0yNCBhbGlnbj1DRU5URVI+IC8vaGFuZGxlIHByb3BlcnR5IGNoYW5nZSBldmVudCAKICAgICAgICAuLi4gICAKICAgIH0KfTwvcHJlPgo8L2ZvbnQ+ClRoZSBHRUYgQVBJIGRvY3VtZW50YXRpb24gcmVjb21tZW5kcyB0aGUgdXNlIG9mIDxDT0RFPmFjdGl2YXRlKCk8L0NPREU+IGFuZCA8Q09ERT5kZWFjdGl2YXRlKCk8L0NPREU+IAp0byByZWdpc3RlciBvciBkZXJlZ2lzdGVyIG1vZGVsIGxpc3RlbmVycy4gClRoaXMgaXMgd2hhdCB3ZSBkbyBoZXJlLiBBZnRlciBjYXN0aW5nIG91ciBtb2RlbCBvYmplY3QgdG8gPENPREU+UHJvcGVydHlBd2FyZU9iamVjdDwvQ09ERT4sIAp3ZSBhZGQgb3VyIDxDT0RFPkVkaXRQYXJ0PC9DT0RFPiBhcyBhIGxpc3RlbmVyIGluIDxpbWcgc3JjPSJpbWFnZXMvdGFnXzEuZ2lmIiBoZWlnaHQ9MTMgd2lkdGg9MjQgYWxpZ249Q0VOVEVSPiwgCmFuZCBhbGxvdyBpdCB0byBiZSByZW1vdmVkIG9uIGRlYWN0aXZhdGlvbiBpbiA8aW1nIHNyYz0iaW1hZ2VzL3RhZ18yLmdpZiIgaGVpZ2h0PTEzIHdpZHRoPTI0IGFsaWduPUNFTlRFUj4uIApPbmNlIHRoZSA8Q09ERT5FZGl0UGFydDwvQ09ERT4gaXMgYWN0aXZhdGVkLCBhbnkgZXZlbnQgbm90aWZpY2F0aW9ucyBmaXJlZCBmcm9tIG91ciBtb2RlbCAKd2lsbCByZXN1bHQgaW4gYW4gaW52b2NhdGlvbiBvZiA8Q09ERT5wcm9wZXJ0eUNoYW5nZSgpPC9DT0RFPiA8aW1nIHNyYz0iaW1hZ2VzL3RhZ18zLmdpZiIgaGVpZ2h0PTEzIHdpZHRoPTI0IGFsaWduPUNFTlRFUj4uIApPdXIgPENPREU+cHJvcGVydHlDaGFuZ2UoKTwvQ09ERT4gaW1wbGVtZW50YXRpb24gaW4gPENPREU+UHJvcGVydHlBd2FyZVBhcnQ8L0NPREU+IGluIHR1cm4gZGVsZWdhdGVzIAppdHMgcmVzcG9uc2UgdG8gb3RoZXIgbWV0aG9kcywgd2hpY2ggY2FuIGJlIG92ZXJyaWRkZW4gYnkgPENPREU+RWRpdFBhcnQ8L0NPREU+IHN1YmNsYXNzZXMgCnRvIGN1c3RvbWl6ZSByZWFjdGlvbnMgdG8gc3BlY2lmaWMgY2hhbmdlcyBpbiB0aGUgbW9kZWwuCgo8QSBOQU1FPSJzeW5jaHJvbmlzaW5nIj48L0E+CjxoMz5TeW5jaHJvbml6aW5nIEVkaXRQYXJ0IFJlbGF0aW9uc2hpcHMgd2l0aCBNb2RlbCBDaGFuZ2VzPC9oMz4KPHA+CkFzIHdlIG1lbnRpb25lZCBwcmV2aW91c2x5LCB0aGUgZmlyc3QgdGhpbmcgdGhlIDxDT0RFPkVkaXRQYXJ0PC9DT0RFPiBpbXBsZW1lbnRhdGlvbiBuZWVkcyB0byBkbyBpbiByZXNwb25zZSB0byBhIG1vZGVsIGNoYW5nZSBpcyB0byAKZW5zdXJlIHRoYXQgaXRzIHJlbGF0aW9uc2hpcCBoaWVyYXJjaHkgaXMgaW4gc3luYyB3aXRoIHRoYXQgb2YgdGhlIG1vZGVsLiAKR0VGIHByb3ZpZGVzIGEgcXVpY2sgYW5kIGVhc3kgc29sdXRpb24gaW4gdGhlIGZvcm0gb2YgdGhyZWUgbWV0aG9kcyBpbiB0aGUgPENPREU+RWRpdFBhcnQ8L0NPREU+IApoaWVyYXJjaHkuIEJlZm9yZSBkaXNjdXNzaW5nCmEgbW9yZSBwZXJmb3JtYW50IGFwcHJvYWNoIHRoYXQgbWFueSBhcHBsaWNhdGlvbnMgd2lsbCBkZW1hbmQsIHdlJ2xsIHRha2UgYSBsb29rIGF0IHRoZXNlIG1ldGhvZHMuIAo8dWw+CiAgPGxpPjxDT0RFPnJlZnJlc2hDaGlsZHJlbigpPC9DT0RFPjogd2hlbiBhbiA8Q09ERT5FZGl0UGFydDwvQ09ERT4gcmVwcmVzZW50cyBhIG1vZGVsIG9iamVjdCB3aXRoIGNoaWxkcmVuLCAKICB0aGlzIG1ldGhvZCBtYXkgbmVlZCB0byBiZSBjYWxsZWQuIAogIE91ciBleGFtcGxlIG9mIGFkZGluZyBhIGNvbHVtbiB0byBhIHRhYmxlIGlzIGEgZ29vZCBvbmUuIFRoZSBzYW1lIGFwcGxpZXMgZm9yIHJlbW92aW5nIGEgY29sdW1uIGZyb20gYSB0YWJsZS4KICBJZiB3ZSBtb3ZlZCBhIGNvbHVtbiBmcm9tIG9uZSB0YWJsZSB0byBhbm90aGVyLCAKICA8Q09ERT5yZWZyZXNoQ2hpbGRyZW4oKTwvQ09ERT4gd291bGQgbmVlZCB0byBiZSBjYWxsZWQgZm9yIGJvdGggY29ycmVzcG9uZGluZyA8Q09ERT5UYWJsZVBhcnRzPC9DT0RFPi4gCiAgVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2Qgbm90IG9ubHkgc3luY2hyb25pemVzIHlvdXIgbW9kZWwgYW5kIDxDT0RFPkVkaXRQYXJ0PC9DT0RFPiBoaWVyYXJjaGllcyAtIAogIGl0IGFsc28gYWRkcyBvciByZW1vdmVzIHZpc3VhbCBjb21wb25lbnRzIGFzIHJlcXVpcmVkCiAgYnkgY2FsbGluZyB0aGUgPENPREU+QWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydDwvQ09ERT4gPENPREU+YWRkQ2hpbGRWaXN1YWwoKTwvQ09ERT4gYW5kIDxDT0RFPnJlbW92ZUNoaWxkVmlzdWFsKCk8L0NPREU+IG1ldGhvZHMKICA8L2xpPgogIDxsaT48Q09ERT5yZWZyZXNoU291cmNlQ29ubmVjdGlvbnMoKTwvQ09ERT46IHRoaXMgYXBwbGllcyB0byBhbnkgbW9kZWwgY2hhbmdlIHdoZXJlIHRoZSBzb3VyY2Ugb2YgYSBjb25uZWN0aW9uIAogIGlzIGFkZGVkLCByZW1vdmVkIG9yIHJlYXNzaWduZWQuCiAgRm9yIGV4YW1wbGUsIGlmIHdlIGFkZGVkIG9yIGRlbGV0ZWQgYSBwcmltYXJ5L2ZvcmVpZ24ga2V5IHJlbGF0aW9uc2hpcCwgdGhpcyBtZXRob2Qgd291bGQgbmVlZCB0byBiZSBjYWxsZWQKICA8L2xpPgogIDxsaT4KICA8Q09ERT5yZWZyZXNoVGFyZ2V0Q29ubmVjdGlvbnMoKTwvQ09ERT46IHRoaXMgb25seSBhcHBsaWVzIHRvIGEgbW9kZWwgY2hhbmdlIHdoZXJlIHRoZSB0YXJnZXQgCiAgb2YgYSBjb25uZWN0aW9uIGlzIGFkZGVkLCByZW1vdmVkIG9yIHJlYXNzaWduZWQuIEl0IHdvdWxkIGJlIG5lZWRlZCBmb3IgYW55IGNoYW5nZSBhZmZlY3RpbmcgCiAgdGhlIHByaW1hcnkga2V5IG9mIGEgcmVsYXRpb25zaGlwIGJldHdlZW4gdGFibGVzPC9saT4KPC91bD4KPHA+ClJldHVybmluZyB0byBvdXIgZXhhbXBsZSBvZiBhZGRpbmcgYSBjb2x1bW4gdG8gYSB0YWJsZSwgCm91ciBpbXBsZW1lbnRhdGlvbiBvZiA8Q09ERT5Qcm9wZXJ0eUF3YXJlUGFydC5wcm9wZXJ0eUNoYW5nZSgpPC9DT0RFPiBjYW4gYmUKcmVkdWNlZCB0byB0aGUgZm9sbG93aW5nOgo8QSBOQU1FID0gInByb3BlcnR5Q2hhbmdlIj48L0E+Cjxmb250IGNvbG9yPSIjMDAwMGNjIj4KPHByZT5wdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2dCkKewogICAgU3RyaW5nIHByb3BlcnR5ID0gZXZ0LmdldFByb3BlcnR5TmFtZSgpOwoKICAgIGlmIChQcm9wZXJ0eUF3YXJlT2JqZWN0LkNISUxELmVxdWFscyhwcm9wZXJ0eSkpCiAgICB7CiAgICA8aW1nIHNyYz0iaW1hZ2VzL3RhZ18xLmdpZiIgaGVpZ2h0PTEzIHdpZHRoPTI0IGFsaWduPUNFTlRFUj4gcmVmcmVzaENoaWxkcmVuKCk7CiAgICA8aW1nIHNyYz0iaW1hZ2VzL3RhZ18yLmdpZiIgaGVpZ2h0PTEzIHdpZHRoPTI0IGFsaWduPUNFTlRFUj4gcmVmcmVzaFZpc3VhbHMoKTsKICAgIH0KICAgIC4uLiBoYW5kbGUgb3RoZXIgdHlwZXMgb2YgcHJvcGVydHkgY2hhbmdlcyBoZXJlCgp9PC9wcmU+CjwvZm9udD4KClRvIHJlc3luY2hyb25pemUgdGhlIDxDT0RFPkVkaXRQYXJ0PC9DT0RFPiBoaWVyYXJjaHksIHdlIHNpbXBseSBjYWxsIAo8Q09ERT5yZWZyZXNoQ2hpbGRyZW4oKTwvQ09ERT4gPGltZyBzcmM9ImltYWdlcy90YWdfMS5naWYiIGhlaWdodD0xMyB3aWR0aD0yNCBhbGlnbj1DRU5URVI+LiAKVG8gdXBkYXRlIHRoZSBkaXNwbGF5LCB3ZSB0aGVuIGNhbGwgPENPREU+cmVmcmVzaFZpc3VhbHMoKTwvQ09ERT4gPGltZyBzcmM9ImltYWdlcy90YWdfMi5naWYiIGhlaWdodD0xMyB3aWR0aD0yNCBhbGlnbj1DRU5URVI+LiAKV2UgZGlzY3VzcyB0aGUKbWVjaGFuaWNzIGFuZCByYXRpb25hbGUgZm9yIDxpbWcgc3JjPSJpbWFnZXMvdGFnXzIuZ2lmIiBoZWlnaHQ9MTMgd2lkdGg9MjQgYWxpZ249Q0VOVEVSPiAKaW4gdGhlIG5leHQgc2VjdGlvbi4KPHA+ClVzaW5nIHRoZSBtZXRob2RzIDxDT0RFPnJlZnJlc2hDaGlsZHJlbigpPC9DT0RFPiwgPENPREU+cmVmcmVzaFNvdXJjZUNvbm5lY3Rpb25zKCk8L0NPREU+IGFuZCA8Q09ERT5yZWZyZXNoU291cmNlQ29ubmVjdGlvbnMoKTwvQ09ERT4gCmNhbiBoZWxwIHlvdSBnZXQgeW91ciBhcHBsaWNhdGlvbiB3b3JraW5nIHF1aWNrbHksIGJ1dCBpZiB3ZSB3YW50IG91ciBhcHBsaWNhdGlvbiB0byBydW4gPEI+ZWZmaWNpZW50bHk8L0I+LCAKd2UgbmVlZCB0byBiZSBtb3JlIHNlbGVjdGl2ZQppbiB0aGUgbWV0aG9kcyB3ZSB1c2UuIEZvciBleGFtcGxlLCB0byBhZGQgb3IgcmVtb3ZlIGEgY2hpbGQsIHdlIGNhbiB1c2UgdGhlIDxDT0RFPkVkaXRQYXJ0PC9DT0RFPiBtZXRob2RzIAo8Q09ERT5hZGRDaGlsZChFZGl0UGFydCwgaW50KTwvQ09ERT4gYW5kIDxDT0RFPnJlbW92ZUNoaWxkKEVkaXRQYXJ0KTwvQ09ERT4uIApPdXIgcmV2aXNlZCA8Q09ERT5oYW5kbGVDaGlsZENoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50KTwvQ09ERT5iZWxvdyBpcyBhIGJldHRlciBwZXJmb3JtaW5nIHJlcGxhY2VtZW50IGZvciA8Q09ERT5yZWZyZXNoQ2hpbGRyZW4oKTwvQ09ERT4gCndoaWNoIHVzZXMgdGhlc2UgbWV0aG9kczoKPGZvbnQgY29sb3I9IiMwMDAwY2MiPgo8cHJlPnByb3RlY3RlZCB2b2lkIGhhbmRsZUNoaWxkQ2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZ0KQp7CiAgICBPYmplY3QgbmV3VmFsdWUgPSBldnQuZ2V0TmV3VmFsdWUoKTsKICAgIE9iamVjdCBvbGRWYWx1ZSA9IGV2dC5nZXRPbGRWYWx1ZSgpOwoKICAgIGlmIChuZXdWYWx1ZSAhPSBudWxsKQogICAgewogICAgICAgIC8vYWRkIG5ldyBjaGlsZAogICAgICAgIDxpbWcgc3JjPSJpbWFnZXMvdGFnXzEuZ2lmIiBoZWlnaHQ9MTMgd2lkdGg9MjQgYWxpZ249Q0VOVEVSPiBFZGl0UGFydCBlZGl0UGFydCA9IGNyZWF0ZUNoaWxkKG5ld1ZhbHVlKTsKICAgICAgICA8aW1nIHNyYz0iaW1hZ2VzL3RhZ18yLmdpZiIgaGVpZ2h0PTEzIHdpZHRoPTI0IGFsaWduPUNFTlRFUj4gaW50IG1vZGVsSW5kZXggPSBnZXRNb2RlbENoaWxkcmVuKCkuaW5kZXhPZihuZXdWYWx1ZSk7CiAgICAgICAgPGltZyBzcmM9ImltYWdlcy90YWdfMy5naWYiIGhlaWdodD0xMyB3aWR0aD0yNCBhbGlnbj1DRU5URVI+IGFkZENoaWxkKGVkaXRQYXJ0LCBtb2RlbEluZGV4KTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICAvL3JlbW92ZSBhbiBleGlzdGluZyBjaGlsZAogICAgICAgIExpc3QgY2hpbGRyZW4gPSBnZXRDaGlsZHJlbigpOwoKICAgICAgICBFZGl0UGFydCBwYXJ0VG9SZW1vdmUgPSBudWxsOwogICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykKICAgICAgICB7CiAgICAgICAgICAgIEVkaXRQYXJ0IHBhcnQgPSAoRWRpdFBhcnQpIGl0ZXIubmV4dCgpOwogICAgICAgICAgICBpZiAocGFydC5nZXRNb2RlbCgpID09IG9sZFZhbHVlKQogICAgICAgICAgICB7CiAgICAgICAgICAgIDxpbWcgc3JjPSJpbWFnZXMvdGFnXzQuZ2lmIiBoZWlnaHQ9MTMgd2lkdGg9MjQgYWxpZ249Q0VOVEVSPiBwYXJ0VG9SZW1vdmUgPSBwYXJ0OwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKHBhcnRUb1JlbW92ZSAhPSBudWxsKQogICAgICAgIDxpbWcgc3JjPSJpbWFnZXMvdGFnXzUuZ2lmIiBoZWlnaHQ9MTMgd2lkdGg9MjQgYWxpZ249Q0VOVEVSPiByZW1vdmVDaGlsZChwYXJ0VG9SZW1vdmUpOwogICAgfQp9PC9wcmU+CjwvZm9udD4KPHA+CldoZW4gYWRkaW5nIG91ciBjaGlsZCwgd2UgbmVlZCB0byBjYWxsIDxDT0RFPmNyZWF0ZUNoaWxkKCk8L0NPREU+IAo8aW1nIHNyYz0iaW1hZ2VzL3RhZ18xLmdpZiIgaGVpZ2h0PTEzIHdpZHRoPTI0IGFsaWduPUNFTlRFUj4gdG8gZ2V0IGEgbmV3IDxDT0RFPkVkaXRQYXJ0PC9DT0RFPiBmb3IgdGhlIG1vZGVsIGNoaWxkLgpXZSB0aGVuIGZpbmQgdGhlIGluZGV4IG9mIHRoZSBtb2RlbCBjaGlsZCBpbiB0aGUgY29udGFpbmluZyA8Q09ERT5MaXN0PC9DT0RFPjxpbWcgc3JjPSJpbWFnZXMvdGFnXzIuZ2lmIiBoZWlnaHQ9MTMgd2lkdGg9MjQgYWxpZ249Q0VOVEVSPiwgCmFuZCBhZGQgb3VyIG5ldyBjaGlsZCA8Q09ERT5FZGl0UGFydDwvQ09ERT4gdXNpbmcgdGhpcyBpbmRleCA8aW1nIHNyYz0iaW1hZ2VzL3RhZ18zLmdpZiIgaGVpZ2h0PTEzIHdpZHRoPTI0IGFsaWduPUNFTlRFUj4uIApXaGVuIHJlbW92aW5nIGEgY2hpbGQsIHdlIGl0ZXJhdGUgdGhyb3VnaCB0aGUgZXhpc3RpbmcgY2hpbGRyZW4KPENPREU+RWRpdFBhcnRzPC9DT0RFPiB1bnRpbCB3ZSBmaW5kIHRoZSBvbmUgcmVwcmVzZW50aW5nIHRoZSByZW1vdmVkIG1vZGVsIGNoaWxkIDxpbWcgc3JjPSJpbWFnZXMvdGFnXzQuZ2lmIiBoZWlnaHQ9MTMgd2lkdGg9MjQgYWxpZ249Q0VOVEVSPi4gCldlIHRoZW4gcmVtb3ZlIHRoaXMgPENPREU+RWRpdFBhcnQ8L0NPREU+IDxpbWcgc3JjPSJpbWFnZXMvdGFnXzUuZ2lmIiBoZWlnaHQ9MTMgd2lkdGg9MjQgYWxpZ249Q0VOVEVSPi4KPC9wPgo8cD4KQ2xlYXJseSwgdGhlcmUgaXMgbW9yZSB3b3JrIGhlcmUgdGhhbiBpbiBzaW1wbHkgY2FsbGluZyA8Q09ERT5yZWZyZXNoQ2hpbGRyZW4oKTwvQ09ERT46IGJ1dCBmb3IgbGFyZ2UgbW9kZWxzIHdoZXJlIHBlcmZvcm1hbmNlIGlzIGNyaXRpY2FsLCB0aGlzIGVmZm9ydCB3aWxsIGJlIHdvcnRoIGl0LiAKPC9wPgo8cD4KSW50ZXJlc3RlZCByZWFkZXJzIGNhbiBleGFtaW5lIDxDT0RFPmhhbmRsZUlucHV0Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQpPC9DT0RFPiBhbmQgPENPREU+aGFuZGxlT3VwdXRDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCk8L0NPREU+IGluCjxDT0RFPlByb3BlcnR5QXdhcmVQYXJ0PC9DT0RFPiAKZm9yIHNpbWlsYXIgYWx0ZXJuYXRpdmVzIHRvIDxDT0RFPnJlZnJlc2hTb3VyY2VDb25uZWN0aW9ucygpPC9DT0RFPiBhbmQgPENPREU+cmVmcmVzaFRhcmdldENvbm5lY3Rpb25zKCk8L0NPREU+IHdoZW4gdXBkYXRpbmcgcmVsYXRpb25zaGlwcy4KPC9wPgoKPEEgTkFNRT0idmlld1VwZGF0ZSI+PC9BPgo8aDM+VXBkYXRpbmcgYW5kIFJlcGFpbnRpbmcgdGhlIERpc3BsYXk8L2gzPgoKPHA+CkNvbnNpZGVyIG91ciBleGFtcGxlIG9mIGFkZGluZyBhIGNvbHVtbiB0byBhIHRhYmxlLiBJbiBkcmF3MmQgdGVybXMsIAp0aGlzIGlzIHJlcHJlc2VudGVkIGJ5IGFkZGluZyBhbiA8Q09ERT5FZGl0YWJsZUxhYmVsPC9DT0RFPiBpbnRvIAphIDxDT0RFPkNvbHVtbnNGaWd1cmU8L0NPREU+IGluc3RhbmNlLCB3aGljaCBpcyBpdHNlbGYgY29udGFpbmVkIHdpdGhpbiBhIDxDT0RFPlRhYmxlRmlndXJlPC9DT0RFPi4gCkJvdGggdGhlIDxDT0RFPkNvbHVtbnNGaWd1cmU8L0NPREU+IGFuZCB0aGUgPENPREU+VGFibGVGaWd1cmU8L0NPREU+IGJvdGggbmVlZCB0byBlbmxhcmdlIAotIHRoZSByZXN1bHQgb3RoZXJ3aXNlIGlzIHVnbHkgKHRha2UgbXkgd29yZCBmb3IgaXQhKS4KPC9wPgo8cD4KQSBmZXcgdGhpbmdzIG5lZWQgdG8gaGFwcGVuOgo8b2w+CiAgPGxpPlRoZSBjYWNoZWQgaW5mb3JtYXRpb24gaGVsZCBieSB0aGUgbGF5b3V0IG1hbmFnZXJzIGZvciB0aGUgPENPREU+VGFibGVGaWd1cmU8L0NPREU+IGFuZCA8Q09ERT5Db2x1bW5zRmlndXJlPC9DT0RFPiwgCiAgd2hpY2ggaW5jbHVkZXMgbWluaW11bSBzaXplIGFuZCBwcmVmZXJyZWQgc2l6ZSBmb3IgdGhlIGNoaWxkIGZpZ3VyZXMsIG5lZWRzIHRvIGJlIHRocm93biBhd2F5PC9saT4KICA8bGk+VGhlIDxDT0RFPlNjaGVtYUZpZ3VyZTwvQ09ERT4ncyBsYXlvdXQgbWFuYWdlciBuZWVkcyB0byAKICB1cGRhdGUgYW55IGNhY2hlZCBjb25zdHJhaW50IGluZm9ybWF0aW9uIGl0IGlzIGhvbGRpbmcgZm9yIHRoZSA8Q09ERT5UYWJsZUZpZ3VyZTwvQ09ERT48L2xpPgogIDxsaT5UaGUgYm91bmRzIG9mIGJvdGggdGhlIDxDT0RFPlRhYmxlRmlndXJlPC9DT0RFPiBhbmQgdGhlIDxDT0RFPkNvbHVtbnNGaWd1cmU8L0NPREU+IAogIG5lZWQgdG8gY2hhbmdlIHRvIHJlZmxlY3QgYWRkaXRpb24gb2YgdGhlIGNvbHVtbiZuYnNwOzwvbGk+IAogIDxsaT5BbnkgYXJlYSBhZmZlY3RlZCBieSB0aGUgY2hhbmdlIG5lZWRzIHRvIGJlIHJlcGFpbnRlZDwvbGk+ICAKPC9vbD4KCjxwPgpJbiBmYWN0LCBhbGwgd2UgbmVlZCB0byBhY2hpZXZlIHRoaXMgaXMgaW4gb3VyIGltcGxlbWVudGF0aW9uIG9mIDxDT0RFPnJlZnJlc2hWaXN1YWxzKCk8L0NPREU+IGluIDxDT0RFPlRhYmxlUGFydDwvQ09ERT46Cgo8Zm9udCBjb2xvcj0iIzAwMDBjYyI+CjxwcmU+cHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKQp7CiAgICBUYWJsZUZpZ3VyZSB0YWJsZUZpZ3VyZSA9IChUYWJsZUZpZ3VyZSkgZ2V0RmlndXJlKCk7CjxpbWcgc3JjPSJpbWFnZXMvdGFnXzEuZ2lmIiBoZWlnaHQ9MTMgd2lkdGg9MjQgYWxpZ249Q0VOVEVSPiBQb2ludCBsb2NhdGlvbiA9IHRhYmxlRmlndXJlLmdldExvY2F0aW9uKCk7CiAgICBTY2hlbWFEaWFncmFtUGFydCBwYXJlbnQgPSAoU2NoZW1hRGlhZ3JhbVBhcnQpIGdldFBhcmVudCgpOwo8aW1nIHNyYz0iaW1hZ2VzL3RhZ18yLmdpZiIgaGVpZ2h0PTEzIHdpZHRoPTI0IGFsaWduPUNFTlRFUj4gUmVjdGFuZ2xlIGNvbnN0cmFpbnQgPSBuZXcgUmVjdGFuZ2xlKGxvY2F0aW9uLngsIGxvY2F0aW9uLnksIC0xLCAtMSk7CjxpbWcgc3JjPSJpbWFnZXMvdGFnXzMuZ2lmIiBoZWlnaHQ9MTMgd2lkdGg9MjQgYWxpZ249Q0VOVEVSPiBwYXJlbnQuc2V0TGF5b3V0Q29uc3RyYWludCh0aGlzLCB0YWJsZUZpZ3VyZSwgY29uc3RyYWludCk7Cn08L3ByZT4KPC9mb250PgpXZSBnZXQgdGhlIApsb2NhdGlvbiBvZiBvdXIgZmlndXJlIDxpbWcgc3JjPSJpbWFnZXMvdGFnXzEuZ2lmIiBoZWlnaHQ9MTMgd2lkdGg9MjQgYWxpZ249Q0VOVEVSPiwgCnVzZSB0aGlzIHRvIHByb3ZpZGUgYSBuZXcgPENPREU+UmVjdGFuZ2xlPC9DT0RFPiBjb25zdHJhaW50IG9iamVjdCA8aW1nIHNyYz0iaW1hZ2VzL3RhZ18yLmdpZiIgaGVpZ2h0PTEzIHdpZHRoPTI0IGFsaWduPUNFTlRFUj4uCkJ5IHNldHRpbmcgdGhlIHdpZHRoIGFuZCBoZWlnaHQgdG8gPEI+LTE8L0I+LCB3ZSBlbnN1cmUgdGhhdCB0aGUgcHJlZmVycmVkIHdpZHRoIGFuZCBoZWlnaHQgYXJlIGNhbGN1bGF0ZWQgYXV0b21hdGljYWxseS4KV2UgdGhlbiBwYXNzIG9uIHRoZSBjb25zdHJhaW50IHRvIHRoZSBwYXJlbnQgPENPREU+RWRpdFBhcnQ8L0NPREU+J3MgbGF5b3V0IG1hbmFnZXIgPGltZyBzcmM9ImltYWdlcy90YWdfMy5naWYiIGhlaWdodD0xMyB3aWR0aD0yNCBhbGlnbj1DRU5URVI+Lgo8cD4KVGhhdCdzIGFsbCB0aGVyZSBpcyB0byBpdC4gCgoKCgoKQnV0IGhvdyBkbyB3ZSBrbm93IHRoYXQgdGhlIHByZWZlcnJlZCBzaXplIGNhbGN1bGF0aW9uIGZvciB0aGUgCjxDT0RFPlRhYmxlRmlndXJlPC9DT0RFPiBvciA8Q09ERT5Db2x1bW5GaWd1cmU8L0NPREU+IAp3b24ndCBiZSB1c2luZyBzb21lIHN0YWxlIGNhY2hlZCB2YWx1ZT8gCklmIHlvdSdyZSBpbnRlcmVzdGVkIGluIHRoZSBhbnN3ZXJzIHRvIHF1ZXN0aW9ucyBsaWtlIHRoaXMsIHJlYWQgdGhlCnNpZGViYXIgYmVsb3cuIAo8L3A+Cjx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSI0IiB3aWR0aD0iOTAlIiBiZ2NvbG9yPSJGRkZGQ0MiPjx0cj4KICAgIDx0ZCBiZ2NvbG9yPSIwMDgwYzAiPjxmb250IHNpemU9IisxIiBjb2xvcj0iRkZGRkNDIj48Yj5TaWRlYmFyOiBJbnZhbGlkYXRpbmcgYW5kIFVwZGF0aW5nIEZpZ3VyZXM8L2I+PC9mb250PiA8L3RkPgogIDwvdHI+Cjx0cj48dGQ+CjxwPgpIb3cgZG9lcyBHRUYga25vdyB3aGVuIHRvIHJlYXJyYW5nZSBhbmQgcmVzaXplIGZpZ3VyZXMsIGFuZCB3aGljaCBwYXJ0cyBvZiB0aGUgc2NyZWVuIHRvIHJlcGFpbnQ/IApUaGUga2V5IGlzIGluIHRoZSBtZXRob2RzIGluIHRoZSA8Q09ERT5JRmlndXJlPC9DT0RFPiBpbnRlcmZhY2UgYW5kIGluIHRoZSBiZWhhdmlvciBvZiB0aGUgPEI+dXBkYXRlIG1hbmFnZXI8L0I+OiAKCjx1bD4KICA8bGk+CiAgPHA+CiAgPENPREU+aW52YWxpZGF0ZSgpPC9DT0RFPjogZWFjaCA8Q09ERT5GaWd1cmU8L0NPREU+IGluc3RhbmNlIGhhcyBhIDxCPnZhbGlkPC9CPiAKICBmbGFnIHdoaWNoIGNhbiBiZSBzZXQgdG8gPENPREU+dHJ1ZTwvQ09ERT4gb3IgPENPREU+ZmFsc2U8L0NPREU+LiAKICBXaGVuIDxDT0RFPmludmFsaWRhdGUoKTwvQ09ERT4gaXMgY2FsbGVkOgogIDxvbD4KICAJPGxpPnRoZSB2YWxpZCBmbGFnIGZvciB0aGUgZmlndXJlIGlzIHNldCB0byBmYWxzZSAodGhlIGZpZ3VyZSBiZWNvbWVzIGludmFsaWQpCiAgCTwvbGk+CiAgCTxsaT48Q09ERT5pbnZhbGlkYXRlKCk8L0NPREU+IGlzIGNhbGxlZCBvbiB0aGUgPENPREU+RmlndXJlPC9DT0RFPidzIGxheW91dCBtYW5hZ2VyLiAKICAJSGVyZSwgYW55IGNhY2hlZCBwcmVmZXJyZWQgc2l6ZSBpbmZvcm1hdGlvbiB0aGF0IHRoZSBsYXlvdXQgbWFuYWdlciBob2xkcyBmb3IgdGhlIGZpZ3VyZSBpcyB0aHJvd24gYXdheQogIAk8YnI+CiAgCTxicj4KICAJPC9saT4KICA8L29sPgogIFRoZSBpbXBvcnRhbmNlIG9mIHRoZSBpbnZhbGlkIHN0YXRlIHdpbGwgYmVjb21lIG1vcmUgY2xlYXIgd2hlbiB3ZSBkaXNjdXNzIDxDT0RFPnZhbGlkYXRlKCk8L0NPREU+LiAKICA8L3A+CiAgPC9saT4gCiAgPGxpPgogIDxwPiAgCiAgPENPREU+cmV2YWxpZGF0ZSgpPC9DT0RFPjogdGhpcyBtZXRob2QgaXMgdXNlZCB0byA8Q09ERT5pbnZhbGlkYXRlKCk8L0NPREU+IGEgZmlndXJlIGFuZCBpdHMgcGFyZW50IGNoYWluLiAKICBXaGVuIGNhbGxlZCBvbiBhIGZpZ3VyZSwgdGhpcyBmaWd1cmUgaW52YWxpZGF0ZXMgaXRzZWxmIGFuZCB0aGVuIAogIGNhbGxzIGl0cyBwYXJlbnQncyA8Q09ERT5yZXZhbGlkYXRlKCk8L0NPREU+IG1ldGhvZC4gCiAgVGhlIGhpZXJhcmNoeSdzIHJvb3QgZmlndXJlIChvbmUgd2l0aCBubyBwYXJlbnQpIGlzIGZpbmFsbHkgcGxhY2VkIG9uIHRoZSB1cGRhdGUgbWFuYWdlcidzIHF1ZXVlIG9mIAogIDxCPmludmFsaWQgcm9vdCBmaWd1cmVzPC9CPiwgCiAgdGhhdCBpcywgZmlndXJlcyB0aGF0IG5lZWQgdG8gYmUgdmFsaWRhdGVkLgogIDwvcD4gCiAgPHA+IAogIDxDT0RFPnJldmFsaWRhdGUoKTwvQ09ERT4gaXMgY2FsbGVkIGF1dG9tYXRpY2FsbHkgd2hlbiBjaGFuZ2VzIHRvIGZpZ3VyZXMgb2NjdXIgd2hpY2ggYXJlIGxpa2VseSB0byBhZmZlY3QgdGhlIGJvdW5kcyBvZiAKICBwYXJlbnQgZmlndXJlcy4gCiAgSXRzIHJvbGUgY2FuIGJlIGNsZWFybHkgc2VlbiBpbiBpdHMgdXNhZ2VzIGluIHRoZSA8Q09ERT5GaWd1cmU8L0NPREU+IGFuZCA8Q09ERT5MYWJlbDwvQ09ERT4gY2xhc3NlcyBkcmF3MmQgcGFja2FnZSwgc2hvd24gYmVsb3c6CjxwPgo8aW1nIHNyYz0iaW1hZ2VzL3JldmFsaWRhdGUtcy5KUEciIGhlaWdodD0yNzQgd2lkdGg9MjU5IGFsaWduPUNFTlRFUj4KPC9wPiAKPHA+CiAgSW4gb3VyIGV4YW1wbGUgb2YgYWRkaW5nIGEgY29sdW1uIGxhYmVsIHRvIGEgdGFibGUsIDxDT0RFPnJldmFsaWRhdGUoKTwvQ09ERT4gaXMgYXV0b21hdGljYWxseSBjYWxsZWQgd2hlbiB0aGUgbmV3IGNvbHVtbiBsYWJlbCBpcyBhZGRlZCB0byB0aGUgCiAgPENPREU+Q29sdW1uc0ZpZ3VyZTwvQ09ERT4gaW5zdGFuY2UgdXNpbmcgdGhlIDxDT0RFPklGaWd1cmUuYWRkRmlndXJlKElGaWd1cmUsIE9iamVjdCwgaW50KTwvQ09ERT4gbWV0aG9kLiAKICBUaGlzIGlzIHdoeSBjb3JyZWN0IHJlc2l6aW5nIG9mIHRoZSB0YWJsZSBvY2N1cnMgd2l0aG91dCBoYXZpbmcgdG8gaW52YWxpZGF0ZSBhbnkgZmlndXJlcyBpbiBvdXIgCiAgZXhhbXBsZSdzIGNvZGUuCiAgPC9wPiAKCTxwPgo8cD4KPGltZyBzcmM9ImltYWdlcy90aXAuZ2lmIiB3aWR0aD0iNjIiIGhlaWdodD0iMTMiPiBJZiBubyBtZXRob2QgaXMgY2FsbGVkIHdoaWNoIGl0c2VsZiBhdXRvbWF0aWNhbGx5IGludm9rZXMgPENPREU+cmV2YWxpZGF0ZSgpPC9DT0RFPiwKeW91IG1heSBuZWVkIHRvIGludm9rZSB0aGlzIG1ldGhvZCB5b3Vyc2VsZiBpbiB5b3VyIGFwcGxpY2F0aW9uIGNvZGUgdG8gY29ycmVjdGx5IHVwZGF0ZSB0aGUgZGlzcGxheS4gCjwvcD4KICA8L3A+ICAKICA8L2xpPgogIDxsaT4gIAogIDxwPiAKICA8Q09ERT5yZXBhaW50KCk8L0NPREU+OiBpbiB0aGUgc2FtZSB3YXkgdGhhdCA8Q09ERT5yZXZhbGlkYXRlKCk8L0NPREU+IHF1ZXVlcyBhIGZpZ3VyZSB3aXRoIHRoZSB1cGRhdGUgbWFuYWdlciBmb3IgdmFsaWRhdGluZywgCiAgdGhpcyBtZXRob2QgcXVldWVzIHRoZSBmaWd1cmUncyBib3VuZHMgYXMgYSA8ST5kaXJ0eSByZWdpb248L0k+IGZvciByZXBhaW50aW5nLiAKICBMaWtlIDxDT0RFPnJldmFsaWRhdGUoKTwvQ09ERT4sIHRoaXMgbWV0aG9kIGlzIGF1dG9tYXRpY2FsbHkgY2FsbGVkIGluIG1hbnkgcGxhY2VzIGluIGRyYXcyZCwgc3VjaCBhcyB3aGVuIHRoZSBzaXplIG9mIGEgZmlndXJlIGNoYW5nZXMuCiAgWW91IGFyZSBtb3N0IGxpa2VseSB0byBuZWVkIHRvIGNhbGwgdGhpcyBtZXRob2QgaW4geW91ciBhcHBsaWNhdGlvbiBjb2RlIGlmIGltcGxlbWVudGluZyBjdXN0b20gc3ViY2xhc3NlcyBvZiA8Q09ERT5GaWd1cmU8L0NPREU+LiAgCiAgPC9wPgogIDwvbGk+ICAgCiAgPGxpPgogIDxwPiAKICA8Q09ERT52YWxpZGF0ZSgpPC9DT0RFPjogdGhpcyBmaW5pc2hlcyB0aGUgam9iIHRoYXQgPENPREU+cmV2YWxpZGF0ZSgpPC9DT0RFPiBzdGFydGVkLiAKICBUaGUgdXBkYXRlIG1hbmFnZXIgY2FsbHMgPENPREU+dmFsaWRhdGUoKTwvQ09ERT4gb24gZWFjaCBvZiB0aGUgaW52YWxpZCByb290IGZpZ3VyZXMgb24gdGhlIHF1ZXVlLiAKICBEdXJpbmcgdGhlIDxDT0RFPnZhbGlkYXRlKCk8L0NPREU+IGV4ZWN1dGlvbiB0aGUgZm9sbG93aW5nIGhhcHBlbnM6CiAgPG9sPgogIAk8bGk+dGhlIGZpZ3VyZSdzIHZhbGlkIGZsYWcgaXMgc2V0IGJhY2sgdG8gdHJ1ZTwvbGk+CiAgCTxsaT5sYXlvdXQgdGFrZXMgcGxhY2UgLSBpZiB0aGUgZmlndXJlIGhhcyBhIGxheW91dCBtYW5hZ2VyIAogIHRoZW4gaXRzIDxDT0RFPmxheW91dCgpPC9DT0RFPiAKICBtZXRob2QgaXMgY2FsbGVkCiAgCTwvbGk+CiAgCTxsaT4KICAJdGhlIGZpZ3VyZSB0aGVuIHZhbGlkYXRlcyBlYWNoIG9mIGl0cyBpbnZhbGlkIGNoaWxkcmVuCiAgCTwvbGk+CiAgCTxicj4KICA8L29sPgogIFRoZSB2YWx1ZSBvZiA8Q09ERT5yZXZhbGlkYXRlKCk8L0NPREU+IGlzIGluIGhlbHBpbmcgdG8gZW5zdXJlIHRoYXQgCiAgb25seSBmaWd1cmVzIHRoYXQgPEk+bmVlZDwvST4gdG8gcGFydGljaXBhdGUgaW4gdGhlIHZhbGlkYXRlIGFuZCBsYXlvdXQgcHJvY2VzcyAKICBjYW4gYmUgY29ycmVjdGx5IGZsYWdnZWQgYXMgaW52YWxpZCBiZWZvcmUgdGhpcyBwcm9jZXNzIGJlZ2lucy4gIAogIDwvcD4KICA8cD4KICBBZnRlciB2YWxpZGF0aW5nIGl0cyBpbnZhbGlkIHJvb3QgZmlndXJlcywgdGhlIHVwZGF0ZSBtYW5hZ2VyIHdpbGwgcmVwYWludCB0aGUgZW5jbG9zaW5nIHJlY3RhbmdsZSBmb3IgcmVnaW9ucyBtYXJrZWQgYXMgPEk+ZGlydHk8L0k+CiAgIHZpYSB0aGUgPENPREU+cmVwYWludCgpPC9DT0RFPiBtZXRob2QuCiAgPC9wPgogIDwvbGk+CjwvdWw+CjwvcD4KPC90ZD48L3RyPjwvdGFibGU+Cgo8aDI+Q29uY2x1c2lvbjwvaDI+CjxwPgpXZSd2ZSBjb3ZlcmVkIHF1aXRlIGEgbG90IG9mIGdyb3VuZCBpbiB0aGlzIGFydGljbGUuICAKTW9zdCBzaWduaWZpY2FudGx5LCB3ZSd2ZSB0YWxrZWQgYWJvdXQgaG93IHlvdSBjYW4gdXNlIHRoZSAKYmFzaWMgYnVpbGRpbmcgYmxvY2tzIG9mIGEgR0VGIGFwcGxpY2F0aW9uIHRvIGVhc2lseSBidWlsZCBhbiBhcHBsaWNhdGlvbiB3aGljaCBhZGhlcmVzIHRvIGEgY2xlYW4gTVZDIGRlc2lnbi4gCldpdGggdGhlIGV4Y2VwdGlvbiBvZiB0aGUgZGlyZWN0IGVkaXRpbmcgZnVuY3Rpb25hbGl0eSwgbW9zdApvZiB0aGUgb3RoZXIgdHlwZXMgb2YgZWRpdGluZyBvcGVyYXRpb25zIHdvcmsgaW4gYSB2ZXJ5IHNpbWlsYXIgd2F5IHRvIHRoZSBzaW1wbGUgY29sdW1uIGFkZGluZyBleGFtcGxlIHByZXNlbnRlZC4KT2YgY291cnNlLCBhbGwgb2YgdGhlIGJ1aWxkaW5nIGJsb2NrcyBuZWVkIHRvIGJlIHB1dCB0b2dldGhlciBpbiB0aGUgCmNvbnRleHQgb2YgYW4gRWNsaXBzZSBlZGl0b3IuIFNwYWNlIGxpbWl0YXRpb25zIHByZWNsdWRlIGFueSBkaXNjdXNzaW9uIG9mIHRoZXNlCnRvcGljcywgYnV0IGludGVyZXN0ZWQgcmVhZGVycyBjYW4gcGVydXNlIHRoZSBzb3VyY2UgY29kZSwgYXMgd2VsbCBhcyB0aGF0IG9mIHRoZSBvZmZpY2lhbCBHRUYgZXhhbXBsZXMsIAp0byBzZWUgaG93IHRoaXMgY2FuIGJlIGRvbmUuIAo8L3A+CjxwPgpGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBHRUYsIGxvb2sgYXQgdGhlIEVjbGlwc2UgcGxhdGZvcm0gZG9jdW1lbnRhdGlvbiwgCmF2YWlsYWJsZSB2aWEgRWNsaXBzZSBvbmxpbmUgaGVscCBpZiB5b3UgZG93bmxvYWQgYW5kIGluc3RhbGwgdGhlIEdFRiBTREsuIAo8YSBocmVmPSJodHRwOi8vd3d3LTEwNi5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGlicmFyeS9vcy1nZWYvIiB0YXJnZXQ9Il9ibGFuayI+SG93IHRvIEdldCBTdGFydGVkIHdpdGggdGhlIEdFRjwvYT4gCiAgZ2l2ZXMgYSBnb29kIGludHJvZHVjdGlvbiB0byBHRUYgYmFzaWNzLiA8YSBocmVmPSIuLi9BcnRpY2xlLUdFRi1EcmF3MmQvR0VGLURyYXcyZC5odG1sIj5EaXNwbGF5IGEgVU1MIERpYWdyYW0gdXNpbmcgRHJhdzJEPC9hPgogIGlzIGEgZ29vZCBzdGFydGluZyBwb2ludCBmb3IgdGhvc2UgdW5mYW1pbGlhciB3aXRoIEVjbGlwc2UgZHJhdzJkLiA8YSBocmVmPSJodHRwOi8vcHVibGliLWIuYm91bGRlci5pYm0uY29tL1JlZGJvb2tzLm5zZi9SZWRib29rQWJzdHJhY3RzL3NnMjQ2MzAyLmh0bWw/T3BlbiIgdGFyZ2V0PSJfYmxhbmsiPgogIEVjbGlwc2UgRGV2ZWxvcG1lbnQgdXNpbmcgdGhlIEdyYXBoaWNhbCBFZGl0aW5nIEZyYW1ld29yayBhbmQgdGhlIEVjbGlwc2UgTW9kZWxpbmcgRnJhbWV3b3JrPC9hPiAKICBpcyBhbiBJQk0gUmVkYm9vayBwcm92aWRpbmcgbW9yZSBkZXRhaWxlZCBjb3ZlcmFnZSBvZiBHRUYgYW5kIEVNRi4KICBZb3Ugd2lsbCBhbHNvIG5lZWQgdG8gaW5zdGFsbCBFTUYgdG8gZ2V0IHRoZSBSZWRib29rIGV4YW1wbGVzIHRvIHdvcmsuCjwvcD4KPGgyPkFja25vd2xlZGdlbWVudHM8L2gyPgo8cD4KVGhhbmtzIHRvIFJhbmR5IEh1ZHNvbiBhbmQgSmltIGRlcyBSaXZp6HJlcyBmb3IgdGhlaXIgdGhvcm91Z2ggYW5kIGNhcmVmdWwgcmV2aWV3cywgCndoaWNoIGhhdmUgYmVlbiB2ZXJ5IGhlbHBmdWwgaW4gaW1wcm92aW5nIGJvdGggdGhlIHRlY2huaWNhbCBhY2N1cmFjeSBhbmQgcmVhZGFiaWxpdHkgb2YgCnRoaXMgYXJ0aWNsZS4KPGgyPlNvdXJjZSBDb2RlPC9oMj4KPHA+IFRvIHJ1biB0aGUgZXhhbXBsZSBvciB2aWV3IHRoZSBzb3VyY2UgY29kZSBmb3IgdGhpcyBhcnRpY2xlLCBkb3dubG9hZCBhbmQgCiAgdW56aXAgPGEgaHJlZj0ic2NoZW1hZWRpdG9yLnppcCI+c2NoZW1hZWRpdG9yLnppcDwvYT4gaW50byB5b3VyIDxpPmVjbGlwc2UvPC9pPiAKICBzdWJkaXJlY3RvcnkuIE5vdGUgdGhhdCB5b3Ugd2lsbCBuZWVkIEVjbGlwc2UgMy4wIG9yIGxhdGVyIHRvIHJ1biB0aGUgZXhhbXBsZXMuPC9wPgoKPC9ib2R5Pgo8L2h0bWw+Cg==