ICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFubm91bmNpbmcgbmN1cnNlcyA1LjcKCiAgIFRoZSAgbmN1cnNlcyAgKG5ldyAgY3Vyc2VzKSAgbGlicmFyeSAgaXMgIGEgZnJlZSBzb2Z0d2FyZSBlbXVsYXRpb24gb2YKICAgY3Vyc2VzICBpbiAgU3lzdGVtICBWICBSZWxlYXNlIDQuMCwgYW5kIG1vcmUuIEl0IHVzZXMgdGVybWluZm8gZm9ybWF0LAogICBzdXBwb3J0cyAgcGFkcyAgYW5kIGNvbG9yIGFuZCBtdWx0aXBsZSBoaWdobGlnaHRzIGFuZCBmb3JtcyBjaGFyYWN0ZXJzCiAgIGFuZCAgIGZ1bmN0aW9uLWtleSAgIG1hcHBpbmcsICAgYW5kICBoYXMgIGFsbCAgdGhlICBvdGhlciAgU1lTVi1jdXJzZXMKICAgZW5oYW5jZW1lbnRzIG92ZXIgQlNEIGN1cnNlcy4KCiAgIEluICBtaWQtSnVuZSAgMTk5NSwgIHRoZSAgbWFpbnRhaW5lciBvZiA0LjRCU0QgY3Vyc2VzIGRlY2xhcmVkIHRoYXQgaGUKICAgY29uc2lkZXJlZCAgNC40QlNEIGN1cnNlcyBvYnNvbGV0ZSwgYW5kIGVuY291cmFnZWQgdGhlIGtlZXBlcnMgb2YgVW5peAogICByZWxlYXNlcyBzdWNoIGFzIEJTRC9PUywgRnJlZUJTRCBhbmQgTmV0QlNEIHRvIHN3aXRjaCBvdmVyIHRvIG5jdXJzZXMuCgogICBUaGUgbmN1cnNlcyBjb2RlIHdhcyBkZXZlbG9wZWQgdW5kZXIgR05VL0xpbnV4LiBJdCBoYXMgYmVlbiBpbiB1c2UgZm9yCiAgIHNvbWUgIHRpbWUgIHdpdGggIE9wZW5CU0QgYXMgdGhlIHN5c3RlbSBjdXJzZXMgbGlicmFyeSwgYW5kIG9uIEZyZWVCU0QKICAgYW5kICBOZXRCU0QgIGFzICBhbiAgZXh0ZXJuYWwgIHBhY2thZ2UuICBJdCAgc2hvdWxkIHBvcnQgZWFzaWx5IHRvIGFueQogICBBTlNJL1BPU0lYLWNvbmZvcm1pbmcgVU5JWC4gSXQgaGFzIGV2ZW4gYmVlbiBwb3J0ZWQgdG8gT1MvMiBXYXJwIQoKICAgVGhlIGRpc3RyaWJ1dGlvbiBpbmNsdWRlcyB0aGUgbGlicmFyeSBhbmQgc3VwcG9ydCB1dGlsaXRpZXMsIGluY2x1ZGluZwogICBhICAgdGVybWluZm8gIGNvbXBpbGVyICB0aWMoMSksICBhICBkZWNvbXBpbGVyICBpbmZvY21wKDEpLCAgY2xlYXIoMSksCiAgIHRwdXQoMSksICB0c2V0KDEpLCAgYW5kICBhICB0ZXJtY2FwIGNvbnZlcnNpb24gdG9vbCBjYXB0b2luZm8oMSkuIEZ1bGwKICAgbWFudWFsIHBhZ2VzIGFyZSBwcm92aWRlZCBmb3IgdGhlIGxpYnJhcnkgYW5kIHRvb2xzLgoKICAgVGhlICBuY3Vyc2VzICBkaXN0cmlidXRpb24gIGlzICBhdmFpbGFibGUgdmlhIGFub255bW91cyBGVFAgYXQgdGhlIEdOVQogICBkaXN0cmlidXRpb24gc2l0ZSBbMV1mdHA6Ly9mdHAuZ251Lm9yZy9nbnUvbmN1cnNlcy8gLgogICBJdCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBbMl1mdHA6Ly9pbnZpc2libGUtaXNsYW5kLm5ldC9uY3Vyc2VzLyAuCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWxlYXNlIE5vdGVzCgogICBUaGlzICByZWxlYXNlICBpcyAgZGVzaWduZWQgIHRvICBiZSB1cHdhcmQgY29tcGF0aWJsZSBmcm9tIG5jdXJzZXMgNS4wCiAgIHRocm91Z2ggICA1LjY7ICB2ZXJ5ICBmZXcgIGFwcGxpY2F0aW9ucyAgd2lsbCAgcmVxdWlyZSAgcmVjb21waWxhdGlvbiwKICAgZGVwZW5kaW5nICAgb24gIHRoZSAgcGxhdGZvcm0uICBUaGVzZSAgYXJlICB0aGUgIGhpZ2hsaWdodHMgIGZyb20gIHRoZQogICBjaGFuZ2UtbG9nIHNpbmNlIG5jdXJzZXMgNS42IHJlbGVhc2UuCgogICBJbnRlcmZhY2UgY2hhbmdlczoKICAgICAqIGdlbmVyYXRlIGxpbmthYmxlIHN0dWJzIGZvciBzb21lIG1hY3JvczoKICAgICAgIGdldGF0dHJzCgogICBOZXcgZmVhdHVyZXMgYW5kIGltcHJvdmVtZW50czoKICAgICAqIGxpYnJhcnkKICAgICAgICAgICsgbmV3ICBmbGF2b3IgIG9mICB0aGUgIG5jdXJzZXMgIGxpYnJhcnkgIHByb3ZpZGVzICBydWRpbWVudGFyeQogICAgICAgICAgICBzdXBwb3J0ICBmb3IgIFBPU0lYIHRocmVhZHMuIFNldmVyYWwgZnVuY3Rpb25zIGFyZSByZWVudHJhbnQsCiAgICAgICAgICAgIGJ1dCBtb3N0IHJlcXVpcmUgZWl0aGVyIGEgd2luZG93LWxldmVsIG9yIHNjcmVlbi1sZXZlbCBtdXRleC4KICAgICAgICAgICAgKFRoaXMgIGlzICBBUEktY29tcGF0aWJsZSwgIGJ1dCAgbm90ICBBQkktY29tcGF0aWJsZSB3aXRoIHRoZQogICAgICAgICAgICBub3JtYWwgbGlicmFyeSkuCiAgICAgICAgICArIGFkZCAgTkNVUlNFU19PUEFRVUUgIHN5bWJvbCAgdG8gIGN1cnNlcy5oLCAgd2lsbCAgdXNlIHRvIG1ha2UKICAgICAgICAgICAgc3RydWN0cyBvcGFxdWUgaW4gc2VsZWN0ZWQgY29uZmlndXJhdGlvbnMuCiAgICAgICAgICArIGFkZCAgIE5DVVJTRVNfRVhUX0ZVTkNTICBhbmQgIE5DVVJTRVNfRVhUX0NPTE9SUyAgc3ltYm9scyAgdG8KICAgICAgICAgICAgY3Vyc2VzLmggdG8gbWFrZSBpdCBzaW1wbGVyIHRvIHRlbGwgaWYgdGhlIGV4dGVuZGVkIGZ1bmN0aW9ucwogICAgICAgICAgICBhbmQvb3IgY29sb3JzIGFyZSBkZWNsYXJlZC4KICAgICAgICAgICsgYWRkIHdyZXNpemUoKSB0byBDKysgYmluZGluZwogICAgICAgICAgKyBlbGltaW5hdGUgZml4ZWQtYnVmZmVyIHZzcHJpbnRmKCkgY2FsbHMgaW4gQysrIGJpbmRpbmcuCiAgICAgICAgICArIGFkZCAgc2V2ZXJhbCAgZnVuY3Rpb25zIHRvIEMrKyBiaW5kaW5nIHdoaWNoIHdyYXAgQyBmdW5jdGlvbnMKICAgICAgICAgICAgdGhhdCBwYXNzIGEgV0lORE9XKiBwYXJhbWV0ZXIuCiAgICAgICAgICArIGFkYXB0IG1vdXNlLWhhbmRsaW5nIGNvZGUgZnJvbSBtZW51IGxpYnJhcnkgaW4gZm9ybS1saWJyYXJ5CiAgICAgICAgICArIGltcHJvdmUgIHRyYWNpbmcgIGZvciAgZm9ybSAgbGlicmFyeSwgIHNob3dpbmcgY3JlYXRlZCBmb3JtcywKICAgICAgICAgICAgZmllbGRzLCBldGMuCiAgICAgICAgICArIG1ha2UgJE5DVVJTRVNfTk9fUEFERElORyBmZWF0dXJlIHdvcmsgZm9yIHRlcm1jYXAgaW50ZXJmYWNlIC4KICAgICAgICAgICsgYWRkICBjaGVjayAgdG8gIHRyYWNlLWZpbGUgIG9wZW4sICBpZiAgdGhlICBnaXZlbiAgbmFtZSAgaXMgYQogICAgICAgICAgICBkaXJlY3RvcnksIGFkZCAiLmxvZyIgdG8gdGhlIG5hbWUgYW5kIHRyeSBhZ2Fpbi4KICAgICAgICAgICsgc2V2ZXJhbCAgIG5ldyAgIG1hbnBhZ2VzOiAgY3Vyc19sZWdhY3kuM3gsICBjdXJzX21lbWxlYWtzLjN4LAogICAgICAgICAgICBjdXJzX29wYXF1ZS4zeCBhbmQgY3Vyc190aHJlYWRzLjN4CiAgICAgKiBwcm9ncmFtczoKICAgICAgICAgICsgbW9kaWZpZWQgIHRocmVlICB0ZXN0LXByb2dyYW1zICB0byAgZGVtb25zdHJhdGUgdGhlIHRocmVhZGluZwogICAgICAgICAgICBzdXBwb3J0IGluIHRoaXMgdmVyc2lvbjogZGl0dG8sIHJhaW4sIHdvcm0uCiAgICAgICAgICArIHNldmVyYWwgICAgbmV3ICAgIHRlc3QtcHJvZ3JhbXM6ICAgZGVtb19wYW5lbHMsICAgZG90c19tdmN1ciwKICAgICAgICAgICAgaW5jaF93aWRlLCAgICBpbmNocywgICAga2V5X25hbWUsICAgIGtleV9uYW1lcywgICBzYXZlc2NyZWVuLAogICAgICAgICAgICBzYXZlc2NyZWVuLnNoICAgIHRlc3RfYXJyYXlzLCAgIHRlc3RfZ2V0X3dzdHIsICAgdGVzdF9nZXRzdHIsCiAgICAgICAgICAgIHRlc3RfaW5zdHIsIHRlc3RfaW53c3RyIGFuZCB0ZXN0X29wYXF1ZS4KICAgICAgICAgICsgYWRkIGFkYWN1cnNlcy1jb25maWcgdG8gdGhlIEFkYTk1IGluc3RhbGwuCiAgICAgICAgICArIG1vZGlmeSAgdGljICAtZiBvcHRpb24gdG8gZm9ybWF0IHNwYWNlcyBhcyBccyB0byBwcmV2ZW50IHRoZW0KICAgICAgICAgICAgZnJvbSAgYmVpbmcgIGxvc3QgIHdoZW4gIHRoYXQgIGlzICByZWFkICBiYWNrICBpbiB1bmZvcm1hdHRlZAogICAgICAgICAgICBzdHJpbmdzLgogICAgICAgICAgKyBUaGUgdGFjayBwcm9ncmFtIGlzIG5vdyBkaXN0cmlidXRlZCBzZXBhcmF0ZWx5IGZyb20gbmN1cnNlcy4KICAgICAqIHRlcm1pbmFsIGRhdGFiYXNlCiAgICAgICAgICArIGFkZGVkIGVudHJpZXM6CiAgICAgICAgICAgICAgIG8gRXRlcm0tMjU2Y29sb3IsIEV0ZXJtLTg4Y29sb3IgYW5kIHJ4dnQtODhjb2xvcgogICAgICAgICAgICAgICBvIGF0ZXJtCiAgICAgICAgICAgICAgIG8ga29uc29sZS0yNTZjb2xvcgogICAgICAgICAgICAgICBvIG1yeHZ0CiAgICAgICAgICAgICAgIG8gc2NyZWVuLm1sdGVybQogICAgICAgICAgICAgICBvIHNjcmVlbi5yeHZ0CiAgICAgICAgICAgICAgIG8gdGVyYXRlcm00LjU5ICBpcyBub3cgdGhlIHByaW1hcnkgcHJpbWFyeSB0ZXJhdGVybSBlbnRyeSwKICAgICAgICAgICAgICAgICByZW5hbWVkIG9yaWdpbmFsIHRvIHRlcmF0ZXJtMi4zCiAgICAgICAgICAgICAgIG8gOXRlcm0gdGVybWluYWwKICAgICAgICAgICAgICAgbyBOZXdidXJ5IERhdGEgZW50cmllcwogICAgICAgICAgKyB1cGRhdGVkL2ltcHJvdmVkIGVudHJpZXM6CiAgICAgICAgICAgICAgIG8gZ25vbWUgdG8gdmVyc2lvbiAyLjIyLjMKICAgICAgICAgICAgICAgbyBoMTksIHoxMDAKICAgICAgICAgICAgICAgbyBrb25zb2xlIHRvIHZlcnNpb24gMS42LjYKICAgICAgICAgICAgICAgbyBtbHRlcm0sIG1sdGVybStwY2ZrZXlzCiAgICAgICAgICAgICAgIG8geHRlcm0sIGFuZCBidWlsZGluZy1ibG9ja3MgZm9yIGZ1bmN0aW9uLWtleXMgdG8gWzNdeHRlcm0KICAgICAgICAgICAgICAgICBwYXRjaCAjMjMwLgoKICAgTWFqb3IgYnVnIGZpeGVzOgogICAgICogYWRkICAgbG9naWMgICB0byAgIHRpYyAgZm9yICBjYW5jZWxsaW5nICBzdHJpbmdzICBpbiAgdXNlci1kZWZpbmVkCiAgICAgICBjYXBhYmlsaXRpZXMgKHRoaXMgaXMgbmVlZGVkIGZvciBjdXJyZW50IGtvbnNvbGUgdGVybWluZm8gZW50cnkpLgogICAgICogbW9kaWZ5ICBtay0xc3QuYXdrICBzbyB0aGUgZ2VuZXJhdGVkIG1ha2VmaWxlIHJ1bGVzIGZvciBsaW5raW5nIG9yCiAgICAgICBpbnN0YWxsaW5nICBzaGFyZWQgIGxpYnJhcmllcyAgZG8gbm90IGZpcnN0IHJlbW92ZSB0aGUgbGlicmFyeSwgaW4KICAgICAgIGNhc2UgaXQgaXMgaW4gdXNlLCBlLmcuLCBsaWJuY3Vyc2VzLnNvIGJ5IC9iaW4vc2guCiAgICAgKiBjb3JyZWN0IGNoZWNrIGZvciBub3RpbWVvdXQoKSBpbiB3Z2V0Y2goKS4KICAgICAqIGZpeCBhIHNpZ24tZXh0ZW5zaW9uIGJ1ZyBpbiBpbmZvY21wJ3MgcmVwYWlyX2Fjc2MoKSBmdW5jdGlvbi4KICAgICAqIGNoYW5nZSB3aW5uc3RyKCkgdG8gc3RvcCBhdCB0aGUgZW5kIG9mIHRoZSBsaW5lLgogICAgICogbWFrZSBBZGE5NSBkZW1vX3BhbmVscygpIGV4YW1wbGUgd29yay4KICAgICAqIGZpeCBmb3IgYWRkaW5nIGEgbm9uLXNwYWNpbmcgY2hhcmFjdGVyIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lLgogICAgICogZmlsbCAgIGluICAgZXh0ZW5kZWQtY29sb3IgICBwYWlyICAgdG8gICBtYWtlICAgY29sb3JzICAgd29yayAgZm9yCiAgICAgICB3aWRlLWNoYXJhY3RlcnMgdXNpbmcgZXh0ZW5kZWQtY29sb3JzLgogICAgICogaW1wcm92ZSAgcmVmcmVzaCAgb2YgIHdpbmRvdyAgb24gIHRvcCAgb2YgbXVsdGktY29sdW1uIGNoYXJhY3RlcnMsCiAgICAgICB0YWtpbmcgICBpbnRvICAgYWNjb3VudCAgc3BsaXQgIGNoYXJhY3RlcnMgIG9uICBsZWZ0L3JpZ2h0ICB3aW5kb3cKICAgICAgIGJvdW5kYXJpZXMuCiAgICAgKiBtb2RpZnkgIHdpbl93Y2huc3RyKCkgIHRvIGVuc3VyZSB0aGF0IG9ubHkgYSBiYXNlIGNlbGwgaXMgcmV0dXJuZWQKICAgICAgIGZvciBlYWNoIG11bHRpLWNvbHVtbiBjaGFyYWN0ZXIuCiAgICAgKiBpbXByb3ZlIHdhZGRjaCgpIGFuZCB3aW5zY2goKSBoYW5kbGluZyBvZiBFSUxTRVEgZnJvbSBtYnJ0b3djKCkgYnkKICAgICAgIHVzaW5nICB1bmN0cmwoKSAgdG8gIGRpc3BsYXkgIGlsbGVnYWwgIGJ5dGVzIHJhdGhlciB0aGFuIHRyeWluZyB0bwogICAgICAgYXBwZW5kIGZ1cnRoZXIgYnl0ZXMgdG8gbWFrZSB1cCBhIHZhbGlkIHNlcXVlbmNlLgogICAgICogcmVzdG9yZSBjdXJzX3NldCgpIHN0YXRlIGFmdGVyIGVuZHdpbigpL3JlZnJlc2goKQogICAgICogbW9kaWZ5ICBrZXluYW1lKCkgdG8gdXNlICJeWCIgZm9ybSBvbmx5IGlmIG1ldGEoKSBoYXMgYmVlbiBjYWxsZWQsCiAgICAgICBvciAgaWYgIGtleW5hbWUoKSBpcyBjYWxsZWQgd2l0aG91dCBpbml0aWFsaXppbmcgY3Vyc2VzLCBlLmcuLCB2aWEKICAgICAgIGluaXRzY3IoKSBvciBuZXd0ZXJtKCkuCiAgICAgKiBtb2RpZnkgIHVuY3RybCgpIHRvIGNoZWNrIGNvZGVzIGluIDEyOC0yNTUgcmFuZ2UgdmVyc3VzIGlzcHJpbnQoKS4KICAgICAgIElmICB0aGV5ICBhcmUgbm90IHByaW50YWJsZSwgYW5kIGxvY2FsZSB3YXMgc2V0LCB1c2UgYSAiTS0iIG9yICJ+IgogICAgICAgc2VxdWVuY2UuCiAgICAgKiBpbXByb3ZlICByZXNpemV0ZXJtKCkgIGJ5ICBtb3ZpbmcgcmlwcGVkLW9mZiBsaW5lcywgYW5kIHJlcGFpbnRpbmcKICAgICAgIHRoZSBzb2Z0LWtleXMuCiAgICAgKiBtb2RpZnkgIGZvcm0gIGxpYnJhcnkgdG8gYWNjZXB0IGNvbnRyb2wgY2hhcmFjdGVycyBzdWNoIGFzIG5ld2xpbmUKICAgICAgIGluIHNldF9maWVsZF9idWZmZXIoKSwgd2hpY2ggaXMgY29tcGF0aWJsZSB3aXRoIFNvbGFyaXMuCiAgICAgKiB1c2UgIE5DVVJTRVNfTU9VU0VfTUFTSygpIGluIGRlZmluaXRpb24gb2YgQlVUVE9OX1JFTEVBU0UoKSwgZXRjLiwKICAgICAgIHRvICAgbWFrZSAgIHRob3NlICAgd29yayAgIHByb3Blcmx5ICB3aXRoICB0aGUgIC0tZW5hYmxlLWV4dC1tb3VzZQogICAgICAgY29uZmlndXJhdGlvbgogICAgICogY29ycmVjdCAgc29tZSAgZnVuY3Rpb25zICBpbiBBZGE5NSBiaW5kaW5nIHdoaWNoIHdlcmUgdXNpbmcgcmV0dXJuCiAgICAgICB2YWx1ZSBmcm9tIEMgd2hlcmUgbm9uZSB3YXMgcmV0dXJuZWQuCiAgICAgKiByZXZpZXdlZC9maXhlZCBpc3N1ZXMgcmVwb3J0ZWQgYnkgQ292ZXJpdHkgYW5kIEtsb2N3b3JrIHRvb2xzLgoKICAgUG9ydGFiaWxpdHk6CiAgICAgKiBjb25maWd1cmUgc2NyaXB0OgogICAgICAgICAgKyBuZXcgb3B0aW9uczoKCiAgICAgICAgICAgICAgLS1kaXNhYmxlLWJpZy1zdHJpbmdzCiAgICAgICAgICAgICAgICAgICAgICBjb250cm9sICB3aGV0aGVyIHN0YXRpYyBzdHJpbmcgdGFibGVzIGFyZSBnZW5lcmF0ZWQKICAgICAgICAgICAgICAgICAgICAgIGFzICAgc2luZ2xlICAgbGFyZ2UgIHN0cmluZ3MgICh0byAgaW1wcm92ZSAgc3RhcnR1cAogICAgICAgICAgICAgICAgICAgICAgcGVyZm9ybWFuY2UpLCBvciBhcyBhcnJheSBvZiBpbmRpdmlkdWFsIHN0cmluZ3MuCgogICAgICAgICAgICAgIC0tZGlzYWJsZS1yZWxpbmsKICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgICB3aGV0aGVyICBzaGFyZWQgIGxpYnJhcmllcyAgYXJlICByZWxpbmtlZAogICAgICAgICAgICAgICAgICAgICAgKGR1cmluZyBpbnN0YWxsKSB3aGVuIHJwYXRoIGlzIGVuYWJsZWQuCgogICAgICAgICAgICAgIC0tZGlzYWJsZS10aWMtZGVwZW5kcwogICAgICAgICAgICAgICAgICAgICAgbWFrZSAgIGV4cGxpY2l0ICB3aGV0aGVyICB0aWMgIGxpYnJhcnkgIGRlcGVuZHMgIG9uCiAgICAgICAgICAgICAgICAgICAgICBuY3Vyc2VzL25jdXJzZXN3IGxpYnJhcnkuCgogICAgICAgICAgICAgIC0tZW5hYmxlLW1peGVkLWNhc2UKICAgICAgICAgICAgICAgICAgICAgIG92ZXJyaWRlICAgdGhlICBjb25maWd1cmUgIHNjcmlwdCdzICBjaGVjayAgaWYgIHRoZQogICAgICAgICAgICAgICAgICAgICAgZmlsZXN5c3RlbSAgIHN1cHBvcnRzICBtaXhlZC1jYXNlICBmaWxlbmFtZXMuICBUaGlzCiAgICAgICAgICAgICAgICAgICAgICBhbGxvd3MgIG9uZSAgdG8gIGNvbnRyb2wgIGhvdyB0aGUgdGVybWluYWwgZGF0YWJhc2UKICAgICAgICAgICAgICAgICAgICAgIG1hcHMgdG8gdGhlIGZpbGVzeXN0ZW0uIEZvciBmaWxlc3lzdGVtcyB0aGF0IGRvIG5vdAogICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydCAgIG1peGVkLWNhc2UsICB0aGUgIGxpYnJhcnkgIHVzZXMgIGdlbmVyYXRlCiAgICAgICAgICAgICAgICAgICAgICAyLWNoYXJhY3RlciAoaGV4YWRlY2ltYWwpIGNvZGVzIGZvciB0aGUgbG93ZXItbGV2ZWwKICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBmaWxlc3lzdGVtIHRlcm1pbmZvIGRhdGFiYXNlCgogICAgICAgICAgICAgIC0tZW5hYmxlLXJlZW50cmFudAogICAgICAgICAgICAgICAgICAgICAgYnVpbGRzICBhICBkaWZmZXJlbnQgIGZsYXZvciBvZiB0aGUgbmN1cnNlcyBsaWJyYXJ5CiAgICAgICAgICAgICAgICAgICAgICAobmN1cnNlc3QpICB3aGljaCAgaW1wcm92ZXMgIHJlZW50cmFudCAgdXNlICBvZiB0aGUKICAgICAgICAgICAgICAgICAgICAgIGxpYnJhcnkgIGJ5ICByZWR1Y2luZyAgZ2xvYmFsICBhbmQgc3RhdGljIHZhcmlhYmxlcwogICAgICAgICAgICAgICAgICAgICAgKHNlZSAgdGhlICAiLS13aXRoLXB0aHJlYWQiIG9wdGlvbiBmb3IgdGhlIHRocmVhZGVkCiAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0KS4KCiAgICAgICAgICAgICAgLS1lbmFibGUtd2Vhay1zeW1ib2xzCiAgICAgICAgICAgICAgICAgICAgICB1c2UgIHdlYWstc3ltYm9scyAgZm9yICBsaW5raW5nIHRvIHRoZSBQT1NJWCB0aHJlYWQKICAgICAgICAgICAgICAgICAgICAgIGxpYnJhcnksICBhbmQgIHVzZSAgdGhlIHNhbWUgc29uYW1lIGZvciB0aGUgbmN1cnNlcwogICAgICAgICAgICAgICAgICAgICAgc2hhcmVkICBsaWJyYXJ5ICBhcyB0aGUgbm9ybWFsIGxpYnJhcnkgKGNhdmVhdDogdGhlCiAgICAgICAgICAgICAgICAgICAgICBBQkkgaXMgZm9yIHRoZSB0aHJlYWRlZCBsaWJyYXJ5LCB3aGljaCBtYWtlcyBnbG9iYWwKICAgICAgICAgICAgICAgICAgICAgIGRhdGEgYWNjZXNzZWQgdmlhIGZ1bmN0aW9ucykuCgogICAgICAgICAgICAgIC0td2l0aC1wdGhyZWFkCiAgICAgICAgICAgICAgICAgICAgICBidWlsZCAgd2l0aCAgdGhlICBQT1NJWCB0aHJlYWQgbGlicmFyeSAodGVzdGVkIHdpdGgKICAgICAgICAgICAgICAgICAgICAgIEFJWCwgICBMaW51eCwgICBGcmVlQlNELCAgIE9wZW5CU0QsICBIUFVYLCAgSVJJWDY0LAogICAgICAgICAgICAgICAgICAgICAgU29sYXJpcywgVHJ1NjQpLgoKICAgICAgICAgICAgICAtLXdpdGgtdGljbGliCiAgICAgICAgICAgICAgICAgICAgICBidWlsZC9pbnN0YWxsICAgdGhlICAgdGljLXN1cHBvcnQgIGZ1bmN0aW9ucyAgaW4gIGEKICAgICAgICAgICAgICAgICAgICAgIHNlcGFyYXRlIGxpYnJhcnkKCiAgICAgICAgICArIGltcHJvdmVkIG9wdGlvbnM6CgogICAgICAgICAgICAgIC0tZW5hYmxlLWV4dC1jb2xvcnMKICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVzIHRoZSB3aWRlLWNoYXJhY3RlciBjb25maWd1cmF0aW9uLgoKICAgICAgICAgICAgICAtLXdpdGgtY2h0eXBlCiAgICAgICAgICAgICAgICAgICAgICBpZ25vcmUgIG9wdGlvbiAgdmFsdWUgInVuc2lnbmVkIiBpcyBhbHdheXMgYWRkZWQgdG8KICAgICAgICAgICAgICAgICAgICAgIHRoZSAgIHR5cGUgICBpbiAgIGN1cnNlcy5oOyAgIGRvICAgdGhlICAgc2FtZSAgIGZvcgogICAgICAgICAgICAgICAgICAgICAgLS13aXRoLW1tYXNrLXQuCgogICAgICAgICAgICAgIC0td2l0aC1kbWFsbG9jCiAgICAgICAgICAgICAgICAgICAgICBidWlsZC1maXggZm9yIHJlZGVmaW5pdGlvbiBvZiBzdHJuZHVwLgoKICAgICAgICAgICAgICAtLXdpdGgtaGFzaGVkLWRiCiAgICAgICAgICAgICAgICAgICAgICBhY2NlcHRzICBhIHBhcmFtZXRlciB3aGljaCBpcyB0aGUgaW5zdGFsbC1wcmVmaXggb2YKICAgICAgICAgICAgICAgICAgICAgIGEgZ2l2ZW4gQmVya2VsZXkgRGF0YWJhc2UuCgogICAgICAgICAgICAgIC0td2l0aC1oYXNoZWQtZGIKICAgICAgICAgICAgICAgICAgICAgIHRoZSAkTElCUyBlbnZpcm9ubWVudCB2YXJpYWJsZSBvdmVycmlkZXMgdGhlIHNlYXJjaAogICAgICAgICAgICAgICAgICAgICAgZm9yIHRoZSBkYiBsaWJyYXJ5LgoKICAgICAgICAgICAgICAtLXdpdGhvdXQtaGFzaGVkLWRiCiAgICAgICAgICAgICAgICAgICAgICBhc3N1bWVkIHdoZW4gIi0tZGlzYWJsZS1kYXRhYmFzZSIgaXMgdXNlZC4KCiAgICAgKiBvdGhlciBjb25maWd1cmUvYnVpbGQgaXNzdWVzOgogICAgICAgICAgKyBidWlsZC1maXhlcyBmb3IgTHlueE9TCiAgICAgICAgICArIG1vZGlmeSAgc2hhcmVkLWxpYnJhcnkgIHJ1bGVzICB0byAgYWxsb3cgIEZyZWVCU0QgIDMueCB0byB1c2UKICAgICAgICAgICAgcnBhdGguCiAgICAgICAgICArIGJ1aWxkLWZpeCBmb3IgRnJlZUJTRCAiY29udGVtcG9yYXJ5IiBUVFkgaW50ZXJmYWNlLgogICAgICAgICAgKyBidWlsZC1maXhlcyBmb3IgQUlYIHdpdGggbGlidG9vbC4KICAgICAgICAgICsgYnVpbGQtZml4ZXMgZm9yIERhcndpbiBhbmQgbGlidG9vbC4KICAgICAgICAgICsgbW9kaWZ5IEJlT1Mtc3BlY2lmaWMgaWZkZWYncyB0byBidWlsZCBvbiBIYWlrdS4KICAgICAgICAgICsgY29ycmVjdGVkICBnY2MgIG9wdGlvbnMgIGZvciAgYnVpbGRpbmcgIHNoYXJlZCAgbGlicmFyaWVzICBvbgogICAgICAgICAgICBTb2xhcmlzIGFuZCBJUklYNjQuCiAgICAgICAgICArIGNoYW5nZSAgc2hhcmVkLWxpYnJhcnkgIGNvbmZpZ3VyYXRpb24gZm9yIE9wZW5CU0QsIG1ha2UgcnBhdGgKICAgICAgICAgICAgd29yay4KICAgICAgICAgICsgYnVpbGQtZml4ZXMgZm9yIHVzaW5nIGxpYnV0ZjgsIGUuZy4sIG9uIE9wZW5CU0QgMy43CiAgICAgICAgICArIGFkZCAgICItZSIgIG9wdGlvbiAgaW4gIG5jdXJzZXMvTWFrZWZpbGUuaW4gIHdoZW4gIGdlbmVyYXRpbmcKICAgICAgICAgICAgc291cmNlLWZpbGVzICB0byAgZm9yY2UgZWFybGllciBleGl0IGlmIHRoZSBidWlsZCBlbnZpcm9ubWVudAogICAgICAgICAgICBmYWlscyB1bmV4cGVjdGVkbHkuCiAgICAgICAgICArIGFkZCBzdXBwb3J0IGZvciBzaGFyZWQgbGlicmFyaWVzIGZvciBRTlguCiAgICAgICAgICArIGNoYW5nZSAgZGVsaW1pdGVyICBpbiAgTUtsaWJfZ2VuLnNoIGZyb20gJyUnIHRvICdAJywgdG8gYXZvaWQKICAgICAgICAgICAgc3Vic3RpdHV0aW9uICBieSAgSUJNIHhsYyB0byAnIycgYXMgcGFydCBvZiBpdHMgZXh0ZW5zaW9ucyB0bwogICAgICAgICAgICBkaWdyYXBocy4KICAgICAqIGxpYnJhcnk6CiAgICAgICAgICArIHJld3JpdGUgIHdyYXBwZXIgIGZvciAgd2NydG9tYigpLCAgbWFraW5nIGl0IHdvcmsgb24gU29sYXJpcy4KICAgICAgICAgICAgVGhpcyAgaXMgIHVzZWQgaW4gdGhlIGZvcm0gbGlicmFyeSB0byBkZXRlcm1pbmUgdGhlIGxlbmd0aCBvZgogICAgICAgICAgICB0aGUgYnVmZmVyIG5lZWRlZCBieSBmaWVsZF9idWZmZXIuCiAgICAgICAgICArIGFkZC91c2UgIGNvbmZpZ3VyZSAgc2NyaXB0ICBtYWNybyAgQ0ZfU0lHX0FUT01JQ19ULCAgdXNlICB0aGUKICAgICAgICAgICAgY29ycmVzcG9uZGluZyB0eXBlIGZvciBkYXRhIG1hbmlwdWxhdGVkIGJ5IHNpZ25hbCBoYW5kbGVycy4KICAgICAgICAgICsgc2V0IGxvY2FsZSBpbiBtaXNjL25jdXJzZXMtY29uZmlnLmluIHNpbmNlIGl0IHVzZXMgYSByYW5nZQogICAgICAgICAgKyBkaXNhYmxlICBHUE0gIG1vdXNlICBzdXBwb3J0ICB3aGVuICAkVEVSTSAgZG9lcyBub3QgaGFwcGVuIHRvCiAgICAgICAgICAgIGNvbnRhaW4gICJsaW51eCIsICBzaW5jZSAgR3BtX09wZW4oKSAgbm8gIGxvbmdlciAgbGltaXRzICBpdHMKICAgICAgICAgICAgYXNzZXJ0aW9uICB0byAgdGVybWluYWxzICB0aGF0ICBpdCBtaWdodCBoYW5kbGUsIGUuZy4sIHdpdGhpbgogICAgICAgICAgICAic2NyZWVuIiBpbiB4dGVybS4KICAgICAgICAgICsgcmVzZXQgbW91c2UgZmlsZS1kZXNjcmlwdG9yIHdoZW4gdW5sb2FkaW5nIEdQTSBsaWJyYXJ5LgogICAgICogdGVzdCBwcm9ncmFtczoKICAgICAgICAgICsgdXBkYXRlICB0ZXN0ICBwcm9ncmFtcyB0byBidWlsZC93b3JrIHdpdGggdmFyaW91cyBVTklYIGN1cnNlcwogICAgICAgICAgICBmb3IgY29tcGFyaXNvbnMuCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGZWF0dXJlcyBvZiBOY3Vyc2VzCgogICBUaGUgbmN1cnNlcyBwYWNrYWdlIGlzIGZ1bGx5IGNvbXBhdGlibGUgd2l0aCBTVnI0IChTeXN0ZW0gViBSZWxlYXNlIDQpCiAgIGN1cnNlczoKICAgICAqIEFsbCAgMjU3ICBvZiAgdGhlICBTVnI0ICBjYWxscyAgaGF2ZSAgYmVlbiAgaW1wbGVtZW50ZWQgIChhbmQgIGFyZQogICAgICAgZG9jdW1lbnRlZCkuCiAgICAgKiBGdWxsICBzdXBwb3J0IGZvciBTVnI0IGN1cnNlcyBmZWF0dXJlcyBpbmNsdWRpbmcga2V5Ym9hcmQgbWFwcGluZywKICAgICAgIGNvbG9yLCAgIGZvcm1zLWRyYXdpbmcgICB3aXRoICAgQUNTICAgY2hhcmFjdGVycywgICBhbmQgIGF1dG9tYXRpYwogICAgICAgcmVjb2duaXRpb24gb2Yga2V5cGFkIGFuZCBmdW5jdGlvbiBrZXlzLgogICAgICogQW4gIGVtdWxhdGlvbiAgb2YgIHRoZSAgU1ZyNCBwYW5lbHMgbGlicmFyeSwgc3VwcG9ydGluZyBhIHN0YWNrIG9mCiAgICAgICB3aW5kb3dzIHdpdGggYmFja2luZyBzdG9yZSwgaXMgaW5jbHVkZWQuCiAgICAgKiBBbiAgZW11bGF0aW9uICBvZiB0aGUgU1ZyNCBtZW51cyBsaWJyYXJ5LCBzdXBwb3J0aW5nIGEgdW5pZm9ybSBidXQKICAgICAgIGZsZXhpYmxlIGludGVyZmFjZSBmb3IgbWVudSBwcm9ncmFtbWluZywgaXMgaW5jbHVkZWQuCiAgICAgKiBBbiAgZW11bGF0aW9uIG9mIHRoZSBTVnI0IGZvcm0gbGlicmFyeSwgc3VwcG9ydGluZyBkYXRhIGNvbGxlY3Rpb24KICAgICAgIHRocm91Z2ggb24tc2NyZWVuIGZvcm1zLCBpcyBpbmNsdWRlZC4KICAgICAqIEJpbmFyeSAgIHRlcm1pbmZvICAgZW50cmllcyAgIGdlbmVyYXRlZCAgIGJ5ICB0aGUgIG5jdXJzZXMgIHRpYygxKQogICAgICAgaW1wbGVtZW50YXRpb24gIGFyZSAgYml0LWZvci1iaXQtY29tcGF0aWJsZSAgd2l0aCB0aGUgZW50cnkgZm9ybWF0CiAgICAgICBTVnI0IGN1cnNlcyB1c2VzLgogICAgICogVGhlIHV0aWxpdGllcyBoYXZlIG9wdGlvbnMgdG8gYWxsb3cgeW91IHRvIGZpbHRlciB0ZXJtaW5mbyBlbnRyaWVzCiAgICAgICBmb3IgIHVzZSAgd2l0aCAgbGVzcyAgY2FwYWJsZSBjdXJzZXMvdGVybWluZm8gdmVyc2lvbnMgc3VjaCBhcyB0aGUKICAgICAgIEhQL1VYIGFuZCBBSVggcG9ydHMuCgogICBUaGUgbmN1cnNlcyBwYWNrYWdlIGFsc28gaGFzIG1hbnkgdXNlZnVsIGV4dGVuc2lvbnMgb3ZlciBTVnI0OgogICAgICogVGhlICBBUEkgIGlzIDgtYml0IGNsZWFuIGFuZCBiYXNlLWxldmVsIGNvbmZvcm1hbnQgd2l0aCB0aGUgWC9PUEVOCiAgICAgICBjdXJzZXMgIHNwZWNpZmljYXRpb24sIFhTSSBjdXJzZXMgKHRoYXQgaXMsIGl0IGltcGxlbWVudHMgYWxsIEJBU0UKICAgICAgIGxldmVsICBmZWF0dXJlcywgIGFuZCAgbW9zdCAgRVhURU5ERUQgIGZlYXR1cmVzKS4gSXQgaW5jbHVkZXMgbWFueQogICAgICAgZnVuY3Rpb24gY2FsbHMgbm90IHN1cHBvcnRlZCB1bmRlciBTVnI0IGN1cnNlcyAoYnV0IHBvcnRhYmlsaXR5IG9mCiAgICAgICBhbGwgY2FsbHMgaXMgZG9jdW1lbnRlZCBzbyB5b3UgY2FuIHVzZSB0aGUgU1ZyNCBzdWJzZXQgb25seSkuCiAgICAgKiBVbmxpa2UgIFNWcjMgY3Vyc2VzLCBuY3Vyc2VzIGNhbiB3cml0ZSB0byB0aGUgcmlnaHRtb3N0LWJvdHRvbW1vc3QKICAgICAgIGNvcm5lciAgb2YgIHRoZSAgc2NyZWVuICBpZiAgeW91ciB0ZXJtaW5hbCBoYXMgYW4gaW5zZXJ0LWNoYXJhY3RlcgogICAgICAgY2FwYWJpbGl0eS4KICAgICAqIEFkYTk1IGFuZCBDKysgYmluZGluZ3MuCiAgICAgKiBTdXBwb3J0ICBmb3IgbW91c2UgZXZlbnQgcmVwb3J0aW5nIHdpdGggWCBXaW5kb3cgeHRlcm0gYW5kIEZyZWVCU0QKICAgICAgIGFuZCBPUy8yIGNvbnNvbGUgd2luZG93cy4KICAgICAqIEV4dGVuZGVkIG1vdXNlIHN1cHBvcnQgdmlhIEFsZXNzYW5kcm8gUnViaW5pJ3MgZ3BtIHBhY2thZ2UuCiAgICAgKiBUaGUgIGZ1bmN0aW9uICB3cmVzaXplKCkgIGFsbG93cyB5b3UgdG8gcmVzaXplIHdpbmRvd3MsIHByZXNlcnZpbmcKICAgICAgIHRoZWlyIGRhdGEuCiAgICAgKiBUaGUgZnVuY3Rpb24gdXNlX2RlZmF1bHRfY29sb3JzKCkgYWxsb3dzIHlvdSB0byB1c2UgdGhlIHRlcm1pbmFsJ3MKICAgICAgIGRlZmF1bHQgY29sb3JzIGZvciB0aGUgZGVmYXVsdCBjb2xvciBwYWlyLCBhY2hpZXZpbmcgdGhlIGVmZmVjdCBvZgogICAgICAgdHJhbnNwYXJlbnQgY29sb3JzLgogICAgICogVGhlIGZ1bmN0aW9ucyBrZXlvaygpIGFuZCBkZWZpbmVfa2V5KCkgYWxsb3cgeW91IHRvIGJldHRlciBjb250cm9sCiAgICAgICB0aGUgIHVzZSAgb2YgZnVuY3Rpb24ga2V5cywgZS5nLiwgZGlzYWJsaW5nIHRoZSBuY3Vyc2VzIEtFWV9NT1VTRSwKICAgICAgIG9yICBieSAgZGVmaW5pbmcgIG1vcmUgdGhhbiBvbmUgY29udHJvbCBzZXF1ZW5jZSB0byBtYXAgdG8gYSBnaXZlbgogICAgICAga2V5IGNvZGUuCiAgICAgKiBTdXBwb3J0ICBmb3IgIDI1Ni1jb2xvciAgdGVybWluYWxzLCAgc3VjaCAgYXMgIG1vZGVybiAgeHRlcm0sIHdoZW4KICAgICAgIGNvbmZpZ3VyZWQgdXNpbmcgdGhlIC0tZW5hYmxlLWV4dC1jb2xvcnMgb3B0aW9uLgogICAgICogU3VwcG9ydCBmb3IgMTYtY29sb3IgdGVybWluYWxzLCBzdWNoIGFzIGFpeHRlcm0gYW5kIG1vZGVybiB4dGVybS4KICAgICAqIEJldHRlciAgY3Vyc29yLW1vdmVtZW50ICBvcHRpbWl6YXRpb24uICBUaGUgcGFja2FnZSBub3cgZmVhdHVyZXMgYQogICAgICAgY3Vyc29yLWxvY2FsLW1vdmVtZW50IGNvbXB1dGF0aW9uIG1vcmUgZWZmaWNpZW50IHRoYW4gZWl0aGVyIEJTRCdzCiAgICAgICBvciBTeXN0ZW0gVidzLgogICAgICogU3VwZXIgICBoYXJkd2FyZSAgIHNjcm9sbGluZyAgIHN1cHBvcnQuICAgVGhlICBzY3JlZW4tdXBkYXRlICBjb2RlCiAgICAgICBpbmNvcnBvcmF0ZXMgIGEgbm92ZWwsIHNpbXBsZSwgYW5kIGNoZWFwIGFsZ29yaXRobSB0aGF0IGVuYWJsZXMgaXQKICAgICAgIHRvICBtYWtlICBvcHRpbWFsICB1c2UgIG9mIGhhcmR3YXJlIHNjcm9sbGluZywgbGluZS1pbnNlcnRpb24sIGFuZAogICAgICAgbGluZS1kZWxldGlvbiAgZm9yICBzY3JlZW4tbGluZSAgbW92ZW1lbnRzLiBUaGlzIGFsZ29yaXRobSBpcyBtb3JlCiAgICAgICBwb3dlcmZ1bCB0aGFuIHRoZSA0LjRCU0QgY3Vyc2VzIHF1aWNrY2goKSByb3V0aW5lLgogICAgICogUmVhbCAgc3VwcG9ydCAgZm9yICB0ZXJtaW5hbHMgIHdpdGggIHRoZSAgbWFnaWMtY29va2llIGdsaXRjaC4gVGhlCiAgICAgICBzY3JlZW4tdXBkYXRlICBjb2RlICB3aWxsICByZWZyYWluIGZyb20gZHJhd2luZyBhIGhpZ2hsaWdodCBpZiB0aGUKICAgICAgIG1hZ2ljLSAgIGNvb2tpZSAgdW5hdHRyaWJ1dGVkICBzcGFjZXMgIHJlcXVpcmVkICBqdXN0ICBiZWZvcmUgIHRoZQogICAgICAgYmVnaW5uaW5nICBhbmQgIGFmdGVyIHRoZSBlbmQgd291bGQgc3RlcCBvbiBhIG5vbi1zcGFjZSBjaGFyYWN0ZXIuCiAgICAgICBJdCAgd2lsbCAgYXV0b21hdGljYWxseSAgc2hpZnQgIGhpZ2hsaWdodCBib3VuZGFyaWVzIHdoZW4gZG9pbmcgc28KICAgICAgIHdvdWxkICBtYWtlIGl0IHBvc3NpYmxlIHRvIGRyYXcgdGhlIGhpZ2hsaWdodCB3aXRob3V0IGNoYW5naW5nIHRoZQogICAgICAgdmlzdWFsIGFwcGVhcmFuY2Ugb2YgdGhlIHNjcmVlbi4KICAgICAqIEl0ICBpcyAgcG9zc2libGUgdG8gZ2VuZXJhdGUgdGhlIGxpYnJhcnkgd2l0aCBhIGxpc3Qgb2YgcHJlLWxvYWRlZAogICAgICAgZmFsbGJhY2sgIGVudHJpZXMgbGlua2VkIHRvIGl0IHNvIHRoYXQgaXQgY2FuIHNlcnZlIHRob3NlIHRlcm1pbmFsCiAgICAgICB0eXBlcyAgZXZlbiAgd2hlbiAgbm8gIHRlcm1pbmZvIHRyZWUgb3IgdGVybWNhcCBmaWxlIGlzIGFjY2Vzc2libGUKICAgICAgICh0aGlzICBtYXkgIGJlIHVzZWZ1bCBmb3Igc3VwcG9ydCBvZiBzY3JlZW4tb3JpZW50ZWQgcHJvZ3JhbXMgdGhhdAogICAgICAgbXVzdCBydW4gaW4gc2luZ2xlLXVzZXIgbW9kZSkuCiAgICAgKiBUaGUgdGljKDEpL2NhcHRvaW5mbyB1dGlsaXR5IHByb3ZpZGVkIHdpdGggbmN1cnNlcyBoYXMgdGhlIGFiaWxpdHkKICAgICAgIHRvICB0cmFuc2xhdGUgbWFueSB0ZXJtY2FwcyBmcm9tIHRoZSBYRU5JWCwgSUJNIGFuZCBBVCZUIGV4dGVuc2lvbgogICAgICAgc2V0cy4KICAgICAqIEEgQlNELWxpa2UgdHNldCgxKSB1dGlsaXR5IGlzIHByb3ZpZGVkLgogICAgICogVGhlIG5jdXJzZXMgbGlicmFyeSBhbmQgdXRpbGl0aWVzIHdpbGwgYXV0b21hdGljYWxseSByZWFkIHRlcm1pbmZvCiAgICAgICBlbnRyaWVzICBmcm9tICAkSE9NRS8udGVybWluZm8gIGlmICBpdCBleGlzdHMsIGFuZCBjb21waWxlIHRvIHRoYXQKICAgICAgIGRpcmVjdG9yeSAgaWYgIGl0ICBleGlzdHMgIGFuZCB0aGUgdXNlciBoYXMgbm8gd3JpdGUgYWNjZXNzIHRvIHRoZQogICAgICAgc3lzdGVtICBkaXJlY3RvcnkuICBUaGlzIGZlYXR1cmUgbWFrZXMgaXQgZWFzaWVyIGZvciB1c2VycyB0byBoYXZlCiAgICAgICBwZXJzb25hbCAgdGVybWluZm8gIGVudHJpZXMgd2l0aG91dCBnaXZpbmcgdXAgYWNjZXNzIHRvIHRoZSBzeXN0ZW0KICAgICAgIHRlcm1pbmZvIGRpcmVjdG9yeS4KICAgICAqIFlvdSAgbWF5ICBzcGVjaWZ5ICBhICBwYXRoICBvZiAgZGlyZWN0b3JpZXMgdG8gc2VhcmNoIGZvciBjb21waWxlZAogICAgICAgZGVzY3JpcHRpb25zICB3aXRoICB0aGUgIGVudmlyb25tZW50ICB2YXJpYWJsZSBURVJNSU5GT19ESVJTICh0aGlzCiAgICAgICBnZW5lcmFsaXplcyAgdGhlICBmZWF0dXJlICBwcm92aWRlZCBieSBURVJNSU5GTyB1bmRlciBzdG9jayBTeXN0ZW0KICAgICAgIFYuKQogICAgICogSW4gIHRlcm1pbmZvICBzb3VyY2UgZmlsZXMsIHVzZSBjYXBhYmlsaXRpZXMgbWF5IHJlZmVyIG5vdCBqdXN0IHRvCiAgICAgICBvdGhlciBlbnRyaWVzIGluIHRoZSBzYW1lIHNvdXJjZSBmaWxlIChhcyBpbiBTeXN0ZW0gVikgYnV0IGFsc28gdG8KICAgICAgIGNvbXBpbGVkICBlbnRyaWVzICBpbiAgZWl0aGVyIHRoZSBzeXN0ZW0gdGVybWluZm8gZGlyZWN0b3J5IG9yIHRoZQogICAgICAgdXNlcidzICRIT01FLy50ZXJtaW5mbyBkaXJlY3RvcnkuCiAgICAgKiBBICBzY3JpcHQgIChjYXBjb252ZXJ0KSAgaXMgIHByb3ZpZGVkIHRvIGhlbHAgQlNEIHVzZXJzIHRyYW5zaXRpb24KICAgICAgIGZyb20gIHRlcm1jYXAgdG8gdGVybWluZm8uIEl0IGdhdGhlcnMgdGhlIGluZm9ybWF0aW9uIGluIGEgVEVSTUNBUAogICAgICAgZW52aXJvbm1lbnQgIHZhcmlhYmxlICBhbmQvb3IgIGEgfi8udGVybWNhcCBsb2NhbCBlbnRyaWVzIGZpbGUgYW5kCiAgICAgICBjb252ZXJ0cyAgIGl0ICAgdG8gICBhbiAgIGVxdWl2YWxlbnQgIGxvY2FsICB0ZXJtaW5mbyAgdHJlZSAgdW5kZXIKICAgICAgICRIT01FLy50ZXJtaW5mby4KICAgICAqIEF1dG9tYXRpYyAgZmFsbGJhY2sgIHRvICB0aGUgIC9ldGMvdGVybWNhcCBmaWxlIGNhbiBiZSBjb21waWxlZCBpbgogICAgICAgd2hlbiAgaXQgaXMgbm90IHBvc3NpYmxlIHRvIGJ1aWxkIGEgdGVybWluZm8gdHJlZS4gVGhpcyBmZWF0dXJlIGlzCiAgICAgICBuZWl0aGVyICBmYXN0ICBub3IgY2hlYXAsIHlvdSBkb24ndCB3YW50IHRvIHVzZSBpdCB1bmxlc3MgeW91IGhhdmUKICAgICAgIHRvLCBidXQgaXQncyB0aGVyZS4KICAgICAqIFRoZSAgdGFibGUtb2YtZW50cmllcyAgdXRpbGl0eSAgdG9lIG1ha2VzIGl0IGVhc3kgZm9yIHVzZXJzIHRvIHNlZQogICAgICAgZXhhY3RseSB3aGF0IHRlcm1pbmFsIHR5cGVzIGFyZSBhdmFpbGFibGUgb24gdGhlIHN5c3RlbS4KICAgICAqIFRoZSBsaWJyYXJ5IG1lZXRzIHRoZSBYU0kgcmVxdWlyZW1lbnQgdGhhdCBldmVyeSBtYWNybyBlbnRyeSBwb2ludAogICAgICAgaGF2ZSAgYSAgY29ycmVzcG9uZGluZyAgZnVuY3Rpb24gIHdoaWNoIG1heSBiZSBsaW5rZWQgKGFuZCB3aWxsIGJlCiAgICAgICBwcm90b3R5cGUtY2hlY2tlZCkgIGlmICB0aGUgIG1hY3JvICBkZWZpbml0aW9uICBpcyAgZGlzYWJsZWQgIHdpdGgKICAgICAgICN1bmRlZi4KICAgICAqIEFuICBIVE1MICAiSW50cm9kdWN0aW9uICB0byAgUHJvZ3JhbW1pbmcgIHdpdGggIE5DVVJTRVMiICBkb2N1bWVudAogICAgICAgcHJvdmlkZXMgIGEgIG5hcnJhdGl2ZSAgaW50cm9kdWN0aW9uICB0byAgdGhlICBjdXJzZXMgIHByb2dyYW1taW5nCiAgICAgICBpbnRlcmZhY2UuCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXRlIG9mIHRoZSBQYWNrYWdlCgogICBOdW1lcm91cyBidWdzIHByZXNlbnQgaW4gZWFybGllciB2ZXJzaW9ucyBoYXZlIGJlZW4gZml4ZWQ7IHRoZSBsaWJyYXJ5CiAgIGlzICBmYXIgIG1vcmUgIHJlbGlhYmxlICB0aGFuICBpdCAgdXNlZCB0byBiZS4gQm91bmRzIGNoZWNraW5nIGluIG1hbnkKICAgYGRhbmdlcm91cycgIGVudHJ5IHBvaW50cyBoYXMgYmVlbiBpbXByb3ZlZC4gVGhlIGNvZGUgaXMgbm93IHR5cGUtc2FmZQogICBhY2NvcmRpbmcgIHRvIGdjYyAtV2FsbC4gVGhlIGxpYnJhcnkgaGFzIGJlZW4gY2hlY2tlZCBmb3IgbWFsbG9jIGxlYWtzCiAgIGFuZCBhcmVuYSBjb3JydXB0aW9uIGJ5IHRoZSBQdXJpZnkgbWVtb3J5LWFsbG9jYXRpb24gdGVzdGVyLgoKICAgVGhlICBuY3Vyc2VzICBjb2RlIGhhcyBiZWVuIHRlc3RlZCB3aXRoIGEgd2lkZSB2YXJpZXR5IG9mIGFwcGxpY2F0aW9ucwogICBpbmNsdWRpbmcgKHZlcnNpb25zIHN0YXJ0aW5nIHdpdGggdGhvc2Ugbm90ZWQpOgoKICAgY2RrCiAgICAgICAgICBDdXJzZXMgRGV2ZWxvcG1lbnQgS2l0CiAgICAgICAgICBbNF1odHRwOi8vaW52aXNpYmxlLWlzbGFuZC5uZXQvY2RrLwogICAgICAgICAgWzVdaHR0cDovL3d3dy52ZXh1cy5jYS9wcm9kdWN0cy9DREsvCgogICBkZWQKICAgICAgICAgIGRpcmVjdG9yeS1lZGl0b3IKICAgICAgICAgIFs2XWh0dHA6Ly9pbnZpc2libGUtaXNsYW5kLm5ldC9kZWQvCgogICBkaWFsb2cKICAgICAgICAgIHRoZSAgdW5kZXJseWluZyAgYXBwbGljYXRpb24gdXNlZCBpbiBTbGFja3dhcmUncyBzZXR1cCwgYW5kIHRoZQogICAgICAgICAgYmFzaXMgZm9yIHNpbWlsYXIgYXBwbGljYXRpb25zIG9uIEdOVS9MaW51eC4KICAgICAgICAgIFs3XWh0dHA6Ly9pbnZpc2libGUtaXNsYW5kLm5ldC9kaWFsb2cvCgogICBseW54CiAgICAgICAgICB0aGUgY2hhcmFjdGVyLXNjcmVlbiBXV1cgYnJvd3NlcgogICAgICAgICAgWzhdaHR0cDovL2x5bnguaXNjLm9yZy9yZWxlYXNlLwoKICAgTWlkbmlnaHQgQ29tbWFuZGVyCiAgICAgICAgICBmaWxlIG1hbmFnZXIKICAgICAgICAgIFs5XWh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWMvCgogICBtdXR0CiAgICAgICAgICBtYWlsIHV0aWxpdHkKICAgICAgICAgIFsxMF1odHRwOi8vd3d3Lm11dHQub3JnLwoKICAgbmNmdHAKICAgICAgICAgIGZpbGUtdHJhbnNmZXIgdXRpbGl0eQogICAgICAgICAgWzExXWh0dHA6Ly93d3cubmNmdHAuY29tLwoKICAgbnZpCiAgICAgICAgICBOZXcgdmkgdmVyc2lvbnMgMS41MCBhcmUgYWJsZSB0byB1c2UgbmN1cnNlcyB2ZXJzaW9ucyAxLjkuNyBhbmQKICAgICAgICAgIGxhdGVyLgogICAgICAgICAgWzEyXWh0dHA6Ly93d3cuYm9zdGljLmNvbS92aS8KCiAgIHBpbmZvCiAgICAgICAgICBMeW54LWxpa2UgaW5mbyBicm93c2VyLgogICAgICAgICAgWzEzXWh0dHBzOi8vYWxpb3RoLmRlYmlhbi5vcmcvcHJvamVjdHMvcGluZm8vCgogICB0aW4KICAgICAgICAgIG5ld3NyZWFkZXIsIHN1cHBvcnRpbmcgY29sb3IsIE1JTUUgWzE0XWh0dHA6Ly93d3cudGluLm9yZy8KCiAgIGFzIHdlbGwgYXMgc29tZSB0aGF0IHVzZSBuY3Vyc2VzIGZvciB0aGUgdGVybWluZm8gc3VwcG9ydCBhbG9uZToKCiAgIG1pbmljb20KICAgICAgICAgIHRlcm1pbmFsIGVtdWxhdG9yCiAgICAgICAgICBbMTVdaHR0cDovL2FsaW90aC5kZWJpYW4ub3JnL3Byb2plY3RzL21pbmljb20vCgogICB2aWxlCiAgICAgICAgICB2aS1saWtlLWVtYWNzCiAgICAgICAgICBbMTZdaHR0cDovL2ludmlzaWJsZS1pc2xhbmQubmV0L3ZpbGUvCgogICBUaGUgIG5jdXJzZXMgIGRpc3RyaWJ1dGlvbiAgaW5jbHVkZXMgIGEgIHNlbGVjdGlvbiAgb2YgIHRlc3QgIHByb2dyYW1zCiAgIChpbmNsdWRpbmcgYSBmZXcgZ2FtZXMpLgoKV2hvJ3MgV2hvIGFuZCBXaGF0J3MgV2hhdAoKICAgWmV5ZCAgQmVuLUhhbGltIHN0YXJ0ZWQgaXQgZnJvbSBhIHByZXZpb3VzIHBhY2thZ2UgcGN1cnNlcywgd3JpdHRlbiBieQogICBQYXZlbCAgQ3VydGlzLiAgRXJpYyAgUy4gUmF5bW9uZCBjb250aW51ZWQgZGV2ZWxvcG1lbnQuIEr8cmdlbiBQZmVpZmVyCiAgIHdyb3RlICBtb3N0IG9mIHRoZSBmb3JtIGFuZCBtZW51IGxpYnJhcmllcy4gT25nb2luZyB3b3JrIGlzIGJlaW5nIGRvbmUKICAgYnkgIFsxN11UaG9tYXMgIERpY2tleS4gIFRob21hcyAgRGlja2V5IGFjdHMgYXMgdGhlIG1haW50YWluZXIgZm9yIHRoZQogICBGcmVlICBTb2Z0d2FyZSAgRm91bmRhdGlvbiwgIHdoaWNoICBob2xkcyAgdGhlICBjb3B5cmlnaHQgIG9uIG5jdXJzZXMuCiAgIENvbnRhY3QgdGhlIGN1cnJlbnQgbWFpbnRhaW5lcnMgYXQgWzE4XWJ1Zy1uY3Vyc2VzQGdudS5vcmcuCgogICBUbyAgIGpvaW4gICB0aGUgICBuY3Vyc2VzICAgbWFpbGluZyAgIGxpc3QsICAgcGxlYXNlICB3cml0ZSAgZW1haWwgIHRvCiAgIGJ1Zy1uY3Vyc2VzLXJlcXVlc3RAZ251Lm9yZyBjb250YWluaW5nIHRoZSBsaW5lOgogICAgICAgICAgICAgc3Vic2NyaWJlIDxuYW1lPkA8aG9zdC5kb21haW4+CgogICBUaGlzIGxpc3QgaXMgb3BlbiB0byBhbnlvbmUgaW50ZXJlc3RlZCBpbiBoZWxwaW5nIHdpdGggdGhlIGRldmVsb3BtZW50CiAgIGFuZCB0ZXN0aW5nIG9mIHRoaXMgcGFja2FnZS4KCiAgIEJldGEgIHZlcnNpb25zICBvZiBuY3Vyc2VzIGFuZCBwYXRjaGVzIHRvIHRoZSBjdXJyZW50IHJlbGVhc2UgYXJlIG1hZGUKICAgYXZhaWxhYmxlIGF0IFsxOV1mdHA6Ly9pbnZpc2libGUtaXNsYW5kLm5ldC9uY3Vyc2VzLyAuCgpGdXR1cmUgUGxhbnMKCiAgICAgKiBFeHRlbmRlZC1sZXZlbCAgIFhQRzQgICBjb25mb3JtYW5jZSwgICB3aXRoICAgaW50ZXJuYXRpb25hbGl6YXRpb24KICAgICAgIHN1cHBvcnQuCiAgICAgKiBQb3J0cyB0byBtb3JlIHN5c3RlbXMsIGluY2x1ZGluZyBET1MgYW5kIFdpbmRvd3MuCgogICBXZSAgbmVlZCAgcGVvcGxlIHRvIGhlbHAgd2l0aCB0aGVzZSBwcm9qZWN0cy4gSWYgeW91IGFyZSBpbnRlcmVzdGVkIGluCiAgIHdvcmtpbmcgb24gdGhlbSwgcGxlYXNlIGpvaW4gdGhlIG5jdXJzZXMgbGlzdC4KCk90aGVyIFJlbGF0ZWQgUmVzb3VyY2VzCgogICBUaGUgIGRpc3RyaWJ1dGlvbiAgcHJvdmlkZXMgIGEgIG5ld2VyICB2ZXJzaW9uICBvZiB0aGUgdGVybWluZm8tZm9ybWF0CiAgIHRlcm1pbmFsIGRlc2NyaXB0aW9uIGZpbGUgb25jZSBtYWludGFpbmVkIGJ5IFsyMF1FcmljIFJheW1vbmQgLiBVbmxpa2UKICAgdGhlICBvbGRlciAgdmVyc2lvbiwgdGhlIHRlcm1jYXAgYW5kIHRlcm1pbmZvIGRhdGEgYXJlIHByb3ZpZGVkIGluIHRoZQogICBzYW1lICBmaWxlLCAgYW5kIHByb3ZpZGVzIHNldmVyYWwgdXNlci1kZWZpbmFibGUgZXh0ZW5zaW9ucyBiZXlvbmQgdGhlCiAgIFgvT3BlbiBzcGVjaWZpY2F0aW9uLgoKICAgWW91ICBjYW4gIGZpbmQgIGxvdHMgIG9mICBpbmZvcm1hdGlvbiAgb24gIHRlcm1pbmFsLXJlbGF0ZWQgdG9waWNzIG5vdAogICBjb3ZlcmVkIGluIHRoZSB0ZXJtaW5mbyBmaWxlIGF0IFsyMV1SaWNoYXJkIFNodWZvcmQncyBhcmNoaXZlIC4KClJlZmVyZW5jZXMKCiAgIDEuIGZ0cDovL2Z0cC5nbnUub3JnL2dudS9uY3Vyc2VzLwogICAyLiBmdHA6Ly9pbnZpc2libGUtaXNsYW5kLm5ldC9uY3Vyc2VzLwogICAzLiBodHRwOi8vaW52aXNpYmxlLWlzbGFuZC5uZXQveHRlcm0veHRlcm0ubG9nLmh0bWwjeHRlcm1fMjMwCiAgIDQuIGh0dHA6Ly9pbnZpc2libGUtaXNsYW5kLm5ldC9jZGsvCiAgIDUuIGh0dHA6Ly93d3cudmV4dXMuY2EvcHJvZHVjdHMvQ0RLLwogICA2LiBodHRwOi8vaW52aXNpYmxlLWlzbGFuZC5uZXQvZGVkLwogICA3LiBodHRwOi8vaW52aXNpYmxlLWlzbGFuZC5uZXQvZGlhbG9nLwogICA4LiBodHRwOi8vbHlueC5pc2Mub3JnL3JlbGVhc2UvCiAgIDkuIGh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWMvCiAgMTAuIGh0dHA6Ly93d3cubXV0dC5vcmcvCiAgMTEuIGh0dHA6Ly93d3cubmNmdHAuY29tLwogIDEyLiBodHRwOi8vd3d3LmJvc3RpYy5jb20vdmkvCiAgMTMuIGh0dHBzOi8vYWxpb3RoLmRlYmlhbi5vcmcvcHJvamVjdHMvcGluZm8vCiAgMTQuIGh0dHA6Ly93d3cudGluLm9yZy8KICAxNS4gaHR0cDovL2FsaW90aC5kZWJpYW4ub3JnL3Byb2plY3RzL21pbmljb20vCiAgMTYuIGh0dHA6Ly9pbnZpc2libGUtaXNsYW5kLm5ldC92aWxlLwogIDE3LiBtYWlsdG86ZGlja2V5QGludmlzaWJsZS1pc2xhbmQubmV0CiAgMTguIG1haWx0bzpidWctbmN1cnNlc0BnbnUub3JnCiAgMTkuIGZ0cDovL2ludmlzaWJsZS1pc2xhbmQubmV0L25jdXJzZXMvCiAgMjAuIGh0dHA6Ly93d3cuY2F0Yi5vcmcvfmVzci90ZXJtaW5mby8KICAyMS4gaHR0cDovL3d3dy5jcy51dGsuZWR1L35zaHVmb3JkL3Rlcm1pbmFsX2luZGV4Lmh0bWwK