<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE module [
  <!ELEMENT module (dtdversion,name,version,description*,help*,about*,requires*,file+)>
  <!ELEMENT dtdversion (#PCDATA)>
  <!ELEMENT name (#PCDATA)>
  <!ELEMENT version (#PCDATA)>
  <!ELEMENT mincmsversion (#PCDATA)>
  <!ELEMENT description (#PCDATA)>
  <!ELEMENT help (#PCDATA)>
  <!ELEMENT about (#PCDATA)>
  <!ELEMENT requires (requiredname,requiredversion)>
  <!ELEMENT requiredname (#PCDATA)>
  <!ELEMENT requiredversion (#PCDATA)>
  <!ELEMENT file (filename,isdir,data)>
  <!ELEMENT filename (#PCDATA)>
  <!ELEMENT isdir (#PCDATA)>
  <!ELEMENT data (#PCDATA)>
]>
<module>
	<dtdversion>1.3</dtdversion>
	<name>CGPaymentGatewayBase</name>
	<version>1.2.2</version>
  <mincmsversion>1.10.2</mincmsversion>
	<help><![CDATA[PGgzPldoYXQgZG9lcyB0aGlzIGRvPzwvaDM+CjxwPlRoaXMgbW9kdWxlIHByb3ZpZGVzIGEgc2tlbGV0b24gQVBJIGZvciBvdGhlciBwYXltZW50IGdhdGV3YXkgbW9kdWxlcyBpbiBDYWxndXlzIEUtQ29tbWVyY2Ugc3VpdGUgIEl0IHByb3ZpZGVzIG5vIGludGVyZmFjZSBvciBmdW5jdGlvbmFsaXR5IG9mIGl0cyBvd248L3A+CjxoMz5Ib3cgZG8gSSB1c2UgaXQ/PC9oMz4KPHA+VGhpcyBtb2R1bGUgc2hvdWxkIGJlIGluc3RhbGxlZCBwcmlvciB0byBpbnN0YWxsaW5nIGFueSBvdGhlciBvZiB0aGUgcGF5bWVudCBnYXRld2F5IG1vZHVsZXMgdGhhdCBhcmUgY29tcGF0aWJsZSB3aXRoIENhbGd1eXMgRS1Db21tZXJjZSBTdWl0ZS48L3A+CjxoMz5TdXBwb3J0PC9oMz4KPHA+VGhpcyBtb2R1bGUgZG9lcyBub3QgaW5jbHVkZSBjb21tZXJjaWFsIHN1cHBvcnQuIEhvd2V2ZXIsIHRoZXJlIGFyZSBhIG51bWJlciBvZiByZXNvdXJjZXMgYXZhaWxhYmxlIHRvIGhlbHAgeW91IHdpdGggaXQ6PC9wPgo8dWw+CjxsaT5Gb3IgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHRoaXMgbW9kdWxlLCBGQVFzLCBvciB0byBmaWxlIGEgQnVnIFJlcG9ydCBvciBidXkgY29tbWVyY2lhbCBzdXBwb3J0LCBwbGVhc2UgdmlzaXQgdGhlIGNtcyBkZXZlbG9wbWVudCBmb3JnZSBhdCA8YSBocmVmPSJodHRwOi8vZGV2LmNtc21hZGVzaW1wbGUub3JnIj5kZXYuY21zbWFkZXNpbXBsZS5vcmc8L2E+LjwvbGk+CjxsaT5BZGRpdGlvbmFsIGRpc2N1c3Npb24gb2YgdGhpcyBtb2R1bGUgbWF5IGFsc28gYmUgZm91bmQgaW4gdGhlIDxhIGhyZWY9Imh0dHA6Ly9mb3J1bS5jbXNtYWRlc2ltcGxlLm9yZyI+Q01TIE1hZGUgU2ltcGxlIEZvcnVtczwvYT4uPC9saT4KPGxpPlRoZSBhdXRob3IsIGNhbGd1eTEwMDAgYWxsIGNhbiBvZnRlbiBiZSBmb3VuZCBpbiB0aGUgPGEgaHJlZj0iaXJjOi8vaXJjLmZyZWVub2RlLm5ldC8jY21zIj5DTVMgSVJDIENoYW5uZWw8L2E+LjwvbGk+CjxsaT5MYXN0bHksIHlvdSBtYXkgaGF2ZSBzb21lIHN1Y2Nlc3MgZW1haWxpbmcgdGhlIGF1dGhvcihzKSBkaXJlY3RseS48L2xpPiAgCjwvdWw+Cgo8aDM+Q29weXJpZ2h0IGFuZCBMaWNlbnNlPC9oMz4KPHA+Q29weXJpZ2h0ICZjb3B5OyAyMDA4LCBSb2JlcnQgQ2FtcGJlbCA8YSBocmVmPSJtYWlsdG86Y2FsZ3V5MTAwMEBjbXNtYWRlc2ltcGxlLm9yZyI+Jmx0O2NhbGd1eTEwMDBAY21zbWFkZXNpbXBsZS5vcmcmZ3Q7PC9hPi4gQWxsIFJpZ2h0cyBBcmUgUmVzZXJ2ZWQuPC9wPgo8cD5UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQppdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQp0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgooYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLjwvcD4KPHA+SG93ZXZlciwgYXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR1BMLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkCmFzIGFuIGFkZG9uIG1vZHVsZSB0byBDTVMgTWFkZSBTaW1wbGUuICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBzb2Z0d2FyZQppbiBhbnkgTm9uIEdQTCB2ZXJzaW9uIG9mIENNUyBNYWRlIHNpbXBsZSwgb3IgaW4gYW55IHZlcnNpb24gb2YgQ01TCk1hZGUgc2ltcGxlIHRoYXQgZG9lcyBub3QgaW5kaWNhdGUgY2xlYXJseSBhbmQgb2J2aW91c2x5IGluIGl0cyBhZG1pbiAKc2VjdGlvbiB0aGF0IHRoZSBzaXRlIHdhcyBidWlsdCB3aXRoIENNUyBNYWRlIHNpbXBsZS48L3A+CjxwPlRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLApidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgpNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCkdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCllvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCmFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCkZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCk9yIHJlYWQgaXQgPGEgaHJlZj0iaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xpY2Vuc2VzLmh0bWwjR1BMIj5vbmxpbmU8L2E+PC9wPjxoMz5EZXBlbmRlbmNpZXM8L2gzPjx1bD48bGk+Q0dFeHRlbnNpb25zID0mZ3Q7IDEuMzE8L2xpPjxsaT5DR0Vjb21tZXJjZUJhc2UgPSZndDsgMS4yLjQ8L2xpPjwvdWw+PGgzPlBhcmFtZXRlcnM8L2gzPjx1bD48bGk+PGVtPihvcHRpb25hbCk8L2VtPiBsYW5nPSJlbl9VUyIgLSBQYXJhbWV0ZXIgaXMgdXNlZCB0byBzcGVjaWZ5IHdoYXQgbGFuZ3VhZ2UgdG8gdXNlIGZvciBkaXNwbGF5IG9uIHRoZSBmcm9udGVuZC4gTm90IGFsbCBtb2R1bGVzIHN1cHBvcnQgb3IgbmVlZCB0aGlzLjwvbGk+PC91bD4=]]></help>
	<about><![CDATA[PGJyIC8+QXV0aG9yOiBSb2JlcnQgQ2FtcGJlbGwgJmx0O2NhbGd1eTEwMDBAY21zbWFkZXNpbXBsZS5vcmcmZ3Q7PGJyIC8+PGJyIC8+VmVyc2lvbjogMS4yLjI8YnIgLz48YnIgLz5DaGFuZ2UgSGlzdG9yeTo8YnIgLz48dWw+CiAgPGxpPlZlcnNpb24gMS4wIC0gQXByaWwsIDIwMDkKICAgIDx1bD4KICAgICAgPGxpPkluaXRpYWwgUmVsZWFzZTwvbGk+CiAgICA8L3VsPgogIDwvbGk+CiAgPGxpPlZlcnNpb24gMS4wLjIgLSBBdWd1c3QsIDIwMDkKICAgIDx1bD4KPGxpPkFkZHMgdGhlIGNhcGFiaWxpdHkgdG8gaGFuZGxlLCBhbmQgYWR2ZXJ0aXNlIGFzeW5jaHJvbm91cyBwYXltZW50IGdhdGV3YXkgZXZlbnRzLjwvbGk+CiAgICA8L3VsPgogIDwvbGk+CjxsaT5WZXJzaW9uIDEuMC41IC0gQXByaWwsIDIwMTAKICA8dWw+CiAgICA8bGk+TWFueXkgbmV3IGZ1bmN0aW9ucyB0aGF0IGFyZSBjYWxsZWQgZnJvbSB0aGUgT3JkZXJzIG1vZHVsZS48L2xpPgogIDwvdWw+ICAgIAogIDwvbGk+CjxsaT5WZXJzaW9uIDEuMC43IC0gSnVseSwgMjAxMAogIDx1bD4KICAgIDxsaT5BZGRzIHBvbGljeSBzdXBwb3J0LjwvbGk+CiAgICA8bGk+QWRkcyBhIHRyYW5zYWN0aW9uIG9iamVjdC4uLiA8L2xpPgogIDwvdWw+ICAgIAogIDwvbGk+CjxsaT5WZXJzaW9uIDEuMC44IC0gSnVseSwgMjAxMAogIDx1bD4KICAgIDxsaT5VcGRhdGUgZGVwZW5kZW5jaWVzLjwvbGk+CiAgICA8bGk+TW92ZSBjaGFuZ2Vsb2cgZXh0ZXJuYWwuPC9saT4KICA8L3VsPiAgICAKICA8L2xpPgo8bGk+VmVyc2lvbiAxLjAuMTAgLSBBcHJpbCwgIDIwMTEKICA8dWw+CiAgICA8bGk+VXBkYXRlIERlcGRlbmRlbmNpZXMuPC9saT4KICAgIDxsaT5BZGRzIHNvbWUgbmV3IHN0dWIgZnVuY3Rpb25zLjwvbGk+CiAgPC91bD4gICAgCiAgPC9saT4KPGxpPlZlcnNpb24gMS4xIC0gTWF5LCAgMjAxMQogIDx1bD4KICA8bGk+Q3JlYXRlIGEgbmV3IGltYWdlIHBhdGggbWV0aG9kLjwvbGk+CiAgPGxpPk1pbm9yIGZpeCB0byBQcm9jZXNzQXN5bmNUcmFuc2FjdGlvbigpPC9saT4KICA8L3VsPiAgICAKICA8L2xpPgo8L3VsPgo8bGk+VmVyc2lvbiAxLjIgLSBKYW51YXJ5LCAyMDEzCiAgPHA+PHN0cm9uZz5OT1RFOiBQSFAgNS4zLnggSVMgUkVRVUlSRUQuPC9zdHJvbmc+PC9wPgogIDx1bD4KICA8bGk+VXBkYXRlcyBmb3IgdGhlIDEuMTEueCBzZXJpZXMuPC9saT4KICA8bGk+QWRkcyBhIGZldyBtaXNzaW5nIG1ldGhvZHMuPC9saT4KICA8L3VsPiAgICAKICA8L2xpPgo8L3VsPgo8YnIgLz4=]]></about>
	<description><![CDATA[A base (skeleton) module for development of payment gateways to use with Calguys E-Commerce suite]]></description>
	<requires>
	  <requiredname>CGExtensions</requiredname>
	  <requiredversion>1.31</requiredversion>
	</requires>
	<requires>
	  <requiredname>CGEcommerceBase</requiredname>
	  <requiredversion>1.2.4</requiredversion>
	</requires>
	<file>
	  <filename>/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/CGPaymentGatewayBase.module.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKI0JFR0lOX0xJQ0VOU0UKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBNb2R1bGU6IENHUGF5bWVudEdhdGV3YXlCYXNlIChjKSAyMDEwIGJ5IFJvYmVydCBDYW1wYmVsbCAKIyAgICAgICAgIChjYWxndXkxMDAwQGNtc21hZGVzaW1wbGUub3JnKQojICBBbiBhZGRvbiBtb2R1bGUgZm9yIENNUyBNYWRlIFNpbXBsZSB0byBwcm92aWRlIGEgc2tlbGV0b24gbW9kdWxlIHRoYXQKIyAgY2FuIGJlIHVzZWQgdG8gYnVpbGQgb3RoZXIgcGF5bWVudCBnYXRld2F5cy4KIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIENNUyAtIENNUyBNYWRlIFNpbXBsZSBpcyAoYykgMjAwNSBieSBUZWQgS3VscCAod2lzaHlAY21zbWFkZXNpbXBsZS5vcmcpCiMgVGhpcyBwcm9qZWN0J3MgaG9tZXBhZ2UgaXM6IGh0dHA6Ly93d3cuY21zbWFkZXNpbXBsZS5vcmcKIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQojIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIEhvd2V2ZXIsIGFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdQTCwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZAojIGFzIGFuIGFkZG9uIG1vZHVsZSB0byBDTVMgTWFkZSBTaW1wbGUuICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBzb2Z0d2FyZQojIGluIGFueSBOb24gR1BMIHZlcnNpb24gb2YgQ01TIE1hZGUgc2ltcGxlLCBvciBpbiBhbnkgdmVyc2lvbiBvZiBDTVMKIyBNYWRlIHNpbXBsZSB0aGF0IGRvZXMgbm90IGluZGljYXRlIGNsZWFybHkgYW5kIG9idmlvdXNseSBpbiBpdHMgYWRtaW4gCiMgc2VjdGlvbiB0aGF0IHRoZSBzaXRlIHdhcyBidWlsdCB3aXRoIENNUyBNYWRlIHNpbXBsZS4KIwojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQojIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCiMgT3IgcmVhZCBpdCBvbmxpbmU6IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTAojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiNFTkRfTElDRU5TRQoKJGNnZXh0ZW5zaW9ucyA9IGNtc19qb2luX3BhdGgoJGdDbXMtPmNvbmZpZ1sncm9vdF9wYXRoJ10sJ21vZHVsZXMnLAoJJ0NHRXh0ZW5zaW9ucycsJ0NHRXh0ZW5zaW9ucy5tb2R1bGUucGhwJyk7CmlmKCAhaXNfcmVhZGFibGUoICRjZ2V4dGVuc2lvbnMgKSApCnsKCWVjaG8gJzxoMT48Zm9udCBjb2xvcj0icmVkIj5FUlJPUjogVGhlIENHRXh0ZW5zaW9ucyBtb2R1bGUgY291bGQgbm90IGJlIGZvdW5kLiBQbGVhc2UgaW5zdGFsbCBpdC48L2ZvbnQ+PC9oMT4nOwoJcmV0dXJuOwp9CnJlcXVpcmVfb25jZSgkY2dleHRlbnNpb25zKTsKCi8qKgogKgogKiBUaGUgZGVmaW5pdGlvbiBmb3IgdGhlIFBheW1lbnQgR2F0ZXdheSBiYXNlIGNsYXNzLgogKgogKiBAcGFja2FnZSBDYWxndXkKICogQGF1dGhvciAgY2FsZ3V5MTAwMCA8Y2FsZ3V5MTAwMEBjbXNtYWRlc2ltcGxlLm9yZz4KICogQGNhdGVnb3J5IEVjb21tZXJjZQogKiBAY29weXJpZ2h0IENvcHlyaWdodCAyMDEwIC0gUm9iZXJ0IENhbXBiZWxsCiAqLwoKCi8qKgogKiBBbiBpbmRpY2F0b3IgZm9yIGFuIGFwcHJvdmVkIHBheW1lbnQuCiAqLwpkZWZpbmUoJ1BBWU1FTlRfU1RBVFVTX0FQUFJPVkVEJywncGF5bWVudF9hcHByb3ZlZCcpOwoKLyoqCiAqIEFuIGluZGljYXRvciBmb3IgYSBkZWNsaW5lZCBwYXltZW50LgogKi8KZGVmaW5lKCdQQVlNRU5UX1NUQVRVU19ERUNMSU5FRCcsJ3BheW1lbnRfZGVjbGluZWQnKTsKCi8qKgogKiBBbiBpbmRpY2F0b3IgZm9yIGEgcGF5bWVudCB3aXRoIHNvbWUga2luZCBvZiBlcnJvci4KICovCmRlZmluZSgnUEFZTUVOVF9TVEFUVVNfRVJST1InLCdwYXltZW50X2Vycm9yJyk7CgovKioKICogQW4gaW5kaWNhdG9yIGZvciBhIGNhbmNlbGxlZCBwYXltZW50LgogKi8KZGVmaW5lKCdQQVlNRU5UX1NUQVRVU19DQU5DRUxMRUQnLCdwYXltZW50X2NhbmNlbGxlZCcpOwoKLyoqCiAqIFNvbWUgb3RoZXIgdHlwZSBvZiBwYXltZW50IHRpbWUuCiAqLwpkZWZpbmUoJ1BBWU1FTlRfU1RBVFVTX09USEVSJywncGF5bWVudF9vdGhlcicpOwoKLyoqCiAqIEEgbm90aWZpY2F0aW9uIHRoYXQgcGF5bWVudCBpcyBwZW5kaW5nIChnYXRld2F5IGhhcyByZWNlaXZlZCBpbmZvcm1hdGlvbiBhYm91dCBpdCkgYnV0IHByb2Nlc3NpbmcgaXMgbm90IGNvbXBsZXRlIGF0IHRoaXMgdGltZS4KICovCmRlZmluZSgnUEFZTUVOVF9TVEFUVVNfUEVORElORycsJ3BheW1lbnRfcGVuZGluZycpOwoKLyoqCiAqIEEgbm90aWZpY2F0aW9uIHRoYXQgcGF5bWVudCBoYXMgYmVlbiBhdXRob3JpemVkLCBmdW5kcyBhcmUgcHJvYmFibHkgaG9sZGluZywgYnV0IG5lZWRzIHRvIGJlIGNhcHR1cmVkIGJlZm9yZSBhbnkgdHJhbnNmZXIgY2FuIG9jY3VyJzsKICovCmRlZmluZSgnUEFZTUVOVF9TVEFUVVNfQVVUSE9SSVpFRCcsJ3BheW1lbnRfYXV0aG9yaXplZCcpOwoKLyoqCiAqIEFuIGluZGljYXRpb24gdGhhdCBubyBwYXltZW50IHNob3VsZCBiZSByZWdpc3RlcmVkLgogKi8KZGVmaW5lKCdQQVlNRU5UX1NUQVRVU19OT05FJywncGF5bWVudF9ub25lJyk7CgovKioKICogVGhlIG1vZHVsZSBjbGFzcyBmb3IgdGhlIGJhc2UgZ2F0ZXdheS4KICoKICogVGhpcyBtb2R1bGUgYWN0cyBhcyBhIGJhc2UgY2xhc3MgZm9yIHBheW1lbnQgZ2F0ZXdheSBtb2R1bGVzIHRoYXQgbWF5IHByb3ZpZGUgdGhlaXIgb3duCiAqIGFkbWluIGludGVyZmFjZXMuCiAqCiAqIFRoaXMgbW9kdWxlIHJlcXVpcmVzIENHRXh0ZW5zaW9ucwogKiBAc2VlIENHRXh0ZW5zaW9ucyAKICogQHBhY2thZ2UgQ2FsZ3V5CiAqIEBjYXRlZ29yeSBFY29tbWVyY2UKICogQGNvcHlyaWdodCBDb3B5cmlnaHQgMjAxMCAtIFJvYmVydCBDYW1wYmVsbAogKi8KY2xhc3MgQ0dQYXltZW50R2F0ZXdheUJhc2UgZXh0ZW5kcyBDR0V4dGVuc2lvbnMKewogIGNvbnN0IFRSQU5TX0NBUFRVUkUgPSAnVFJBTlNfQ0FQVFVSRSc7CiAgY29uc3QgVFJBTlNfVk9JRCAgICA9ICdUUkFOU19WT0lEJzsKICBjb25zdCBUUkFOU19DUkVESVQgID0gJ1RSQU5TX0NSRURJVCc7CiAgCiAgcHJpdmF0ZSAkX3RyYW5zdHlwZTsKICBwcml2YXRlICRfdHhuX2FtdDsKCiAgLyoqCiAgICogQ29uc3RydWN0b3IuCiAgICovCiAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCkKICB7CiAgICBwYXJlbnQ6Ol9fY29uc3RydWN0KCk7CiAgfQoKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgbW9kdWxlIG5hbWUuCiAgICoKICAgKiBAYWJzdHJhY3QKICAgKiBAaW50ZXJuYWwKICAgKiBAcmV0dXJuIHN0cmluZwogICAqLwogIHB1YmxpYyBmdW5jdGlvbiBHZXROYW1lKCkKICB7CiAgICByZXR1cm4gJ0NHUGF5bWVudEdhdGV3YXlCYXNlJzsKICB9CgogIAogIC8qKgogICAqIFJldHVybnMgYSBodW1hbiByZWFkYWJsZSBtb2R1bGUgbmFtZS4KICAgKgogICAqIEBhYnN0cmFjdAogICAqIEByZXR1cm4gc3RyaW5nCiAgICovCiAgcHVibGljIGZ1bmN0aW9uIEdldEZyaWVuZGx5TmFtZSgpCiAgewogICAgcmV0dXJuICR0aGlzLT5MYW5nKCdmcmllbmRseW5hbWUnKTsKICB9CgoKICAvKioKICAgKiBSZXR1cm4gYSB2ZXJzaW9uIHN0cmluZy4KICAgKgogICAqIEBhYnN0cmFjdAogICAqIEByZXR1cm4gc3RyaW5nCiAgICovCiAgcHVibGljIGZ1bmN0aW9uIEdldFZlcnNpb24oKQogIHsKICAgIHJldHVybiAnMS4yLjInOwogIH0KCgogIC8qKgogICAqIFJldHVybnMgbW9kdWxlIGhlbHAuCiAgICoKICAgKiBAYWJzdHJhY3QKICAgKiBAcmV0dXJuIHN0cmluZwogICAqLwogIHB1YmxpYyBmdW5jdGlvbiBHZXRIZWxwKCkKICB7CiAgICByZXR1cm4gJHRoaXMtPkxhbmcoJ2hlbHAnKTsKICB9CgoKICAvKioKICAgKiBSZXR1cm4gdGhlIGF1dGhvcnMgbmFtZS4KICAgKiAKICAgKiBAYWJzdHJhY3QKICAgKiBAcmV0dXJuIHN0cmluZwogICAqLwogIHB1YmxpYyBmdW5jdGlvbiBHZXRBdXRob3IoKQogIHsKICAgIHJldHVybiAnUm9iZXJ0IENhbXBiZWxsJzsKICB9CgoKICAvKioKICAgKiBSZXR1cm4gdGhlIGF1dGhvcnMgZW1haWwgYWRkcmVzcy4KICAgKiAKICAgKiBAYWJzdHJhY3QKICAgKiBAcmV0dXJuIHN0cmluZwogICAqLwogIHB1YmxpYyBmdW5jdGlvbiBHZXRBdXRob3JFbWFpbCgpCiAgewogICAgcmV0dXJuICdjYWxndXkxMDAwQGNtc21hZGVzaW1wbGUub3JnJzsKICB9CgoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBtb2R1bGUgY2hhbmdlIGhpc3RvcnkuCiAgICogCiAgICogQGFic3RyYWN0CiAgICogQHJldHVybiBzdHJpbmcKICAgKi8KICBwdWJsaWMgZnVuY3Rpb24gR2V0Q2hhbmdlTG9nKCkKICB7CiAgICByZXR1cm4gZmlsZV9nZXRfY29udGVudHMoZGlybmFtZShfX0ZJTEVfXykuJy9jaGFuZ2Vsb2cuaW5jJyk7CiAgfQoKCiAgLyoqCiAgICogVGVzdCB3ZXRoZXIgdGhpcyBmdW5jdGlvbiBpcyBhIHBsdWdpbiBtb2R1bGUuCiAgICoKICAgKiBUbyB3b3JrIHdpdGggb3JkZXIgcHJvY2Vzc2luZyBtb2R1bGVzLCBpdCBpcyBhZHZpc2VkIHRoYXQgdGhpcyBtZXRob2QgcmV0dXJuIHRydWUuCiAgICogCiAgICogQGFic3RyYWN0CiAgICogQHJldHVybiBib29sZWFuCiAgICovCiAgcHVibGljIGZ1bmN0aW9uIElzUGx1Z2luTW9kdWxlKCkKICB7CiAgICByZXR1cm4gdHJ1ZTsKICB9CgoKICAvKioKICAgKiBEb2VzIHRoaXMgbW9kdWxlIGhhdmUgYW4gYWRtaW4gaW50ZXJmYWNlPwogICAqCiAgICogQGFic3RyYWN0CiAgICogQHJldHVybiBib29sZWFuCiAgICovCiAgcHVibGljIGZ1bmN0aW9uIEhhc0FkbWluKCkKICB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQogIHB1YmxpYyBmdW5jdGlvbiBMYXp5TG9hZEFkbWluKCkgeyByZXR1cm4gVFJVRTsgfQoKICAvKioKICAgKiBJZiB0aGUgbW9kdWxlIGhhcyBhbiBhZG1pbiBpbnRlcmZhY2UsIHRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGtleSBuYW1lIG9mIHRoZQogICAqIHRvcCBsZXZlbCBhZG1pbiBtZW51IHRoYXQgdGhlIG1vZHVsZXMgbWVudSBpdGVtIHNob3VsZCBiZSBwbGFjZWQgaW4uCiAgICoKICAgKiBAc2VlIENtc01vZHVsZTo6R2V0QWRtaW5TZWN0aW9uKCkKICAgKiBAYWJzdHJhY3QKICAgKiBAcmV0dXJuIHN0cmluZwogICAqLwogIHB1YmxpYyBmdW5jdGlvbiBHZXRBZG1pblNlY3Rpb24oKQogIHsKICAgIHJldHVybiAnZXh0ZW5zaW9ucyc7CiAgfQoKCiAgLyoqCiAgICogUmV0dXJucyBhIGRlc2NyaXB0aW9uIG9mIHRoaXMgbW9kdWxlIHN1aXRhYmxlIGZvciBhZG1pbmlzdHJhdG9ycy4KICAgKgogICAqIEBzZWUgQ21zTW9kdWxlOjpHZXRBZG1pbkRlc2NyaXB0aW9uKCkKICAgKiBAYWJzdHJhY3QKICAgKiBAcmV0dXJuIHN0cmluZwogICAqLwogIHB1YmxpYyBmdW5jdGlvbiBHZXRBZG1pbkRlc2NyaXB0aW9uKCkKICB7CiAgICByZXR1cm4gJHRoaXMtPkxhbmcoJ21vZGRlc2NyaXB0aW9uJyk7CiAgfQoKCiAgLyoqCiAgICogSWYgdGhlIG1vZHVsZSBoYXMgYW4gYWRtaW4gaW50ZXJmYWNlLCB0aGlzIAogICAqCiAgICogQHNlZSBDbXNNb2R1bGU6OkdldFZpc2libGVUb0FkbWluVXNlcigpCiAgICogQGFic3RyYWN0CiAgICogQHJldHVybiBzdHJpbmcKICAgKi8KICBwdWJsaWMgZnVuY3Rpb24gVmlzaWJsZVRvQWRtaW5Vc2VyKCkKICB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKCiAgLyoqCiAgICogUmV0dXJucyBhbiBhcnJheSBvZiBzdHJpbmdzIGluZGljYXRpbmcgd2hpY2ggbW9kdWxlcyAoYW5kIHZlcnNpb25zIG9mIHRob3NlIG1vZHVsZXMpCiAgICogdGhhdCB0aGlzIG1vZHVsZSBkZXBlbmRzIHVwb24uCiAgICoKICAgKiBAc2VlIENtc01vZHVsZTo6R2V0RGVwZW5kZW5jaWVzKCkKICAgKiBAYWJzdHJhY3QKICAgKiBAcmV0dXJuIGFycmF5CiAgICovCiAgcHVibGljIGZ1bmN0aW9uIEdldERlcGVuZGVuY2llcygpCiAgewogICAgcmV0dXJuIGFycmF5KCdDR0V4dGVuc2lvbnMnPT4nMS4zMScsCgkJICdDR0Vjb21tZXJjZUJhc2UnPT4nMS4yLjQnKTsKICB9CgoKICAvKioKICAgKiBSZXR1cm5zIGEgdmVyc2lvbiBzdHJpbmcgc3RhdGluZyB0aGUgbWluaW11bSBDTVMgVmVyc2lvbiB0aGF0IHRoaXMgbW9kdWxlIGlzIAogICAqIGNvbXBhdGlibGUgd2l0aAogICAqCiAgICogQHNlZSBDbXNNb2R1bGU6Ok1pbmltdW1DTVNWZXJzaW9uKCkKICAgKiBAYWJzdHJhY3QKICAgKiBAcmV0dXJuIHN0cmluZwogICAqLwogIHB1YmxpYyBmdW5jdGlvbiBNaW5pbXVtQ01TVmVyc2lvbigpCiAgewogICAgcmV0dXJuICIxLjEwLjIiOwogIH0KCgogIC8qKgogICAqIFJldHVybnMgYSBtZXNzYWdlIHRoYXQgc2hvdWxkIGJlIGRpc3BsYXllZCBhZnRlciB0aGUgaW5zdGFsbGF0aW9uIG9mIHRoZSBtb2R1bGUuCiAgICoKICAgKiBAc2VlIENtc01vZHVsZTo6SW5zdGFsbFBvc3RNZXNzYWdlKCkKICAgKiBAYWJzdHJhY3QKICAgKiBAcmV0dXJuIHN0cmluZwogICAqLwogIHB1YmxpYyBmdW5jdGlvbiBJbnN0YWxsUG9zdE1lc3NhZ2UoKQogIHsKICAgIHJldHVybiAkdGhpcy0+TGFuZygncG9zdGluc3RhbGwnKTsKICB9CgoKICAvKioKICAgKiBSZXR1cm5zIGEgbWVzc2FnZSB0aGF0IHNob3VsZCBiZSBkaXNwbGF5ZWQgYWZ0ZXIgdGhlIHVuLWluc3RhbGxhdGlvbiBvZiB0aGUgbW9kdWxlLgogICAqCiAgICogQHNlZSBDbXNNb2R1bGU6OlVuaW5zdGFsbFBvc3RNZXNzYWdlKCkKICAgKiBAYWJzdHJhY3QKICAgKiBAcmV0dXJuIHN0cmluZwogICAqLwogIHB1YmxpYyBmdW5jdGlvbiBVbmluc3RhbGxQb3N0TWVzc2FnZSgpCiAgewogICAgcmV0dXJuICR0aGlzLT5MYW5nKCdwb3N0dW5pbnN0YWxsJyk7CiAgfQoKCiAgLyoqCiAgICogUmV0dXJucyBhIG1lc3NhZ2UgdGhhdCBzaG91bGQgYmUgZGlzcGxheWVkIGJlZm9yZSB0aGUgdW4taW5zdGFsbGF0aW9uIG9mIHRoZSBtb2R1bGUuCiAgICoKICAgKiBAc2VlIENtc01vZHVsZTo6VW5pbnN0YWxsUHJlTWVzc2FnZSgpCiAgICogQGFic3RyYWN0CiAgICogQHJldHVybiBzdHJpbmcKICAgKi8KICBwdWJsaWMgZnVuY3Rpb24gVW5pbnN0YWxsUHJlTWVzc2FnZSgpCiAgewogICAgcmV0dXJuICR0aGlzLT5MYW5nKCdyZWFsbHlfdW5pbnN0YWxsJyk7CiAgfQoKCQogIC8qKgogICAqIEBzZWUgQ21zTW9kdWxlOjpTZXRQYXJhbWV0ZXJzKCkKICAgKiBAYWJzdHJhY3QKICAgKiBAcmV0dXJuIHZvaWQKICAgKi8KICBwdWJsaWMgZnVuY3Rpb24gU2V0UGFyYW1ldGVycygpCiAgewogICAgLy8kdGhpcy0+UmVnaXN0ZXJNb2R1bGVQbHVnaW4oKTsKICAgICR0aGlzLT5SZXN0cmljdFVua25vd25QYXJhbXMoKTsKICB9CgoKICAvKioKICAgKiBSZXR1cm4gYSBkZXNjcmlwdGlvbiBmb3IgdGhlIGdpdmVuIGV2ZW50IG5hbWUuCiAgICoKICAgKiBAaWdub3JlCiAgICogQHNlZSBDbXNNb2R1bGU6OkdldEV2ZW50RGVzY3JpcHRpb24oKQogICAqIEBhYnN0cmFjdAogICAqIEByZXR1cm4gc3RyaW5nCiAgICovCiAgcHVibGljIGZ1bmN0aW9uIEdldEV2ZW50RGVzY3JpcHRpb24oICRldmVudG5hbWUgKQogIHsKICAgIHJldHVybiAkdGhpcy0+TGFuZygnZGVzY19ldmVudF8nLiRldmVudG5hbWUpOwogIH0KCgogIC8qKgogICAqIEBpZ25vcmUKICAgKi8KICBwdWJsaWMgZnVuY3Rpb24gR2V0RXZlbnRIZWxwKCAkZXZlbnRuYW1lICkKICB7CiAgICByZXR1cm4gJHRoaXMtPkxhbmcoJ2hlbHBfZXZlbnRfJy4kZXZlbnRuYW1lKTsKICB9CgoKICAvKioKICAgKiBUZXN0IGlmIHRoaXMgbW9kdWxlIGhhcyBjZXJ0YWluIGNhcGFiaWxpdGllcy4KICAgKgogICAqIFBheW1lbnQgR2F0d2F5IGRldmVsb3BlcnMgcHJvYmFibHkgZG9uJ3QgbmVlZCB0byBvdmVycmlkZSB0aGlzIG1ldGhvZC4KICAgKgogICAqIEBpZ25vcmUKICAgKi8KICBwdWJsaWMgZnVuY3Rpb24gSGFzQ2FwYWJpbGl0eSgkY2FwYWJpbGl0eSwgJHBhcmFtcz1hcnJheSgpKQogIHsKICAgIC8vIGRvbid0IGluY2x1ZGUgdGhlIGJhc2UgbW9kdWxlLCBpdCdzIG5vdCBhIHJlYWwgcGF5bWVudCBnYXRld3kKICAgIGlmKCAkdGhpcy0+R2V0TmFtZSgpID09ICdDR1BheW1lbnRHYXRld2F5QmFzZScgKSByZXR1cm4gZmFsc2U7CgogICAgLy8gb25seSBoYW5kbGUgcGF5bWVudCBnYXRld2F5IGNhcGFiaWx0aWVzCiAgICBpZiggJGNhcGFiaWxpdHkgIT0gJ3BheW1lbnRfZ2F0ZXdheScgKSByZXR1cm4gZmFsc2U7CgogICAgLy8gaWYgdGhpcyBwcm90b2NvbCB2ZXJzaW9uIGlzbid0IHNwZWNpZmllZAogICAgLy8gaXRzIGFuIGVycm9yCiAgICBpZiggIWlzc2V0KCRwYXJhbXNbJ2Jhc2V2ZXJzaW9uJ10pICkgcmV0dXJuIGZhbHNlOwogICAgJGJhc2V2ZXJzaW9uID0gJHBhcmFtc1snYmFzZXZlcnNpb24nXTsKCiAgICAvLyBjaGVjayB0byBtYWtlIHN1cmUgdGhhdCB0aGlzIG1vZHVsZSBkZXBlbmRzIG9uIGEgY29tcGF0aWJsZQogICAgLy8gdmVyc2lvbiBvZiB0aGUgQ0dQYXltZW50R2F0ZXdheUJhc2UgbW9kdWxlLgogICAgJGNncGdiID0gJHRoaXMtPkdldE1vZHVsZUluc3RhbmNlKCdDR1BheW1lbnRHYXRld2F5QmFzZScpOwoKICAgICRkZXBzID0gJHRoaXMtPkdldERlcGVuZGVuY2llcygpOwogICAgaWYoICFpc19hcnJheSgkZGVwcykgKSByZXR1cm4gZmFsc2U7CgogICAgJGZvdW5kID0gZmFsc2U7CiAgICBmb3JlYWNoKCRkZXBzIGFzICRtb2R1bGUgPT4gJHZlcnNpb24pCiAgICAgIHsKCWlmKCAkbW9kdWxlICE9ICdDR1BheW1lbnRHYXRld2F5QmFzZScgKSBjb250aW51ZTsKCgkkZm91bmQgPSB0cnVlOwoJaWYoIHZlcnNpb25fY29tcGFyZSgkY2dwZ2ItPkdldFZlcnNpb24oKSwkYmFzZXZlcnNpb24pIDwgMCApCgkgIHsKCSAgICBkaWUoJ3ZlcnNpb25fY29tcGFyZSAnLiRjZ3BnYi0+R2V0VmVyc2lvbigpLicgJy4kYmFzZXZlcnNpb24pOwoJICAgIHJldHVybiBmYWxzZTsKCSAgfQogICAgICB9CgogICAgLy8gdGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuLCBidXQgaGV5LgogICAgaWYoICEkZm91bmQgKSByZXR1cm4gZmFsc2U7CiAgICAKICAgIC8vIGFsbCBjaGVja3MgcGFzc2VkCiAgICByZXR1cm4gdHJ1ZTsKICB9CgoKICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogIC8vIEJlZ2luIG1ldGhvZHMgcmVxdWlyZWQgZm9yIHBheW1lbnQgZ2F0ZXdheXMKICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKICAvKioKICAgKiBSZXR1cm5zIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdldGhlciB0aGUgZ2F0ZXdheSBtb2R1bGUKICAgKiByZXF1aXJlcyBjcmVkaXQgY2FyZCBpbmZvcm1hdGlvbiBiZSBzdWJtaXR0ZWQgdG8gdGhlIGdhdGV5YXkuCiAgICoKICAgKiBJZiB0aGlzIGlzIHNldCB0byB0cnVlLCBvcmRlciBwcm9jZXNzb3IgbW9kdWxlcyBtYXkgcHJvdmlkZSBhCiAgICogbWVjaGFuaXNtIHRvIGFsbG93IGEgc2l0ZSB2aXNpdG9yIHRvIGlucHV0IGNyZWRpdCBjYXJkIGluZm9ybWF0aW9uLgogICAqCiAgICogQGFic3RyYWN0CiAgICogQHJldHVybiBib29sZWFuCiAgICovCiAgcHVibGljIGZ1bmN0aW9uIFJlcXVpcmVzQ3JlZGl0Q2FyZEluZm8oKQogIHsKICAgIHJldHVybiBmYWxzZTsKICB9CgogIC8qKgogICAqIFJldHVybnMgYSBib29sZWFuIGluZGljYXRpbmcgd2V0aGVyIHRoZSBnYXRld2F5IG1vZHVsZQogICAqIHJlcXVpcmVzIHRoZSBjcmVkaXQgY2FyZCB0eXBlIGJlIHN1Ym1pdHRlZCB0byB0aGUgZ2F0ZXlheS4KICAgKgogICAqIElmIHRoaXMgaXMgc2V0IHRvIHRydWUsIG9yZGVyIHByb2Nlc3NvciBtb2R1bGVzIG1heSBwcm92aWRlIGEKICAgKiBtZWNoYW5pc20gdG8gYWxsb3cgYSBzaXRlIHZpc2l0b3IgdG8gaW5wdXQgY3JlZGl0IGNhcmQgdHlwZSBpbmZvcm1hdGlvbi4KICAgKgogICAqIEBhYnN0cmFjdAogICAqIEByZXR1cm4gYm9vbGVhbgogICAqLwogIHB1YmxpYyBmdW5jdGlvbiBSZXF1aXJlc0NyZWRpdENhcmRUeXBlKCkKICB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKCiAgLyoqCiAgICogRG9lcyB0aGlzIG1vZHVsZSByZXF1aXJlIFNTTCBpbiBvcmRlciB0byBiZSBhYmxlIHRvIGNvbW11bmljYXRlIAogICAqIHdpdGggdGhlIHJlbW90ZSBnYXRld2F5CiAgICoKICAgKiBAYWJzdHJhY3QKICAgKiBAcmV0dXJuIGJvb2xlYW4KICAgKi8KICBwdWJsaWMgZnVuY3Rpb24gUmVxdWlyZXNTU0woKQogIHsKICAgIHN0YWNrX3RyYWNlKCk7CiAgICBkaWUoJ292ZXJyaWRlIHRoaXMnKTsKICB9CgoKICAvKioKICAgKiBEb2VzIHRoaXMgZ2F0ZXdheSByZXF1aXJlIHNoaXBwaW5nIGFkZHJlc3MgaW5mb3JtYXRpb24KICAgKgogICAqIEBhYnN0cmFjdAogICAqIEByZXR1cm4gYm9vbGVhbgogICAqLwogIHB1YmxpYyBmdW5jdGlvbiBSZXF1aXJlc1NoaXBwaW5nSW5mbygpCiAgewogICAgc3RhY2tfdHJhY2UoKTsKICAgIGRpZSgnb3ZlcnJpZGUgdGhpcycpOwogIH0KCgogIC8qKgogICAqIERvZXMgdGhpcyBnYXRld2F5IHJlcXVpcmUgYmlsbGluZyBhZGRyZXNzIGluZm9ybWF0aW9uCiAgICoKICAgKiBAYWJzdHJhY3QKICAgKiBAcmV0dXJuIGJvb2xlYW4KICAgKi8KICBwdWJsaWMgZnVuY3Rpb24gUmVxdWlyZXNCaWxsaW5nSW5mbygpCiAgewogICAgc3RhY2tfdHJhY2UoKTsKICAgIGRpZSgnb3ZlcnJpZGUgdGhpcycpOwogIH0KCgogIC8qKgogICAqIERvZXMgdGhpcyBnYXRld2F5IHN1cHBvcnQgaXNzdWluZyBjcmVkaXQgdHJhbnNhY3Rpb25zLgogICAqCiAgICogQGFic3RyYWN0CiAgICogQHJldHVybiBib29sZWFuCiAgICovCiAgcHVibGljIGZ1bmN0aW9uIFN1cHBvcnRzUmVmdW5kcygpCiAgewogICAgcmV0dXJuIEZBTFNFOwogIH0KCiAgLyoqCiAgICogU2F2ZSB0aGUgaW5mb3JtYXRpb24gY3VycmVudGx5IGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2F0ZXdheSBtb2R1bGUgaW50bwogICAqIGEgdGVtcG9yYXJ5IChidXQgc2VjdXJlKSBzdGF0ZSBmb3IgbGF0ZXIgcmV0cmlldmFsIGJ5IG90aGVyIGFjdGlvbnMKICAgKiBvZiB0aGlzIG1vZHVsZS4KICAgKgogICAqIFRoaXMgbWV0aG9kIGlzIHR5cGljYWxseSB1c2VkIHRvIHN0b3JlIHN0YXRlIGluZm9ybWF0aW9uIGJlZm9yZSB0aGUgdmlzaXRvcgogICAqIGlzIHJlZGlyZWN0ZWQgdG8gYSBob3N0ZWQgZ2F0ZXdheS4gIEl0IGNhbiB0aGVuIGJlIHJlc3RvcmVkIGFmdGVyIHRoZSB2aXNpdG9yCiAgICogaGFzIHJldHVybmVkIGZyb20gdGhlIHRoaXJkIHBhcnR5IGdhdGV3YXkuCiAgICoKICAgKiBZb3UgbWF5IHVzZSBhbnkgc2VjdXJlIGVuY3J5cHRpb24gb3Igc3RvcmFnZSBtZWNoYW5pc20geW91IHdpc2guCiAgICoKICAgKiBAYWJzdHJhY3QKICAgKiBAcGFyYW0gYm9vbGVhbiBTaG91bGQgdGhlIGRhdGEgYmUgZW5jcnlwdGVkCiAgICogQHBhcmFtIHN0cmluZyAgQW4gb3B0aW9uYWwgZW5jcnlwdGlvbiBrZXkKICAgKiBAcmV0dXJuIHN0cmluZyBUaGUgZW5jcnlwdGlvbiBrZXkgaWYgdGhlIGRhdGEgd2FzIGVuY3J5cHRlZCwgb3IgbnVsbC4KICAgKi8KICBwdWJsaWMgZnVuY3Rpb24gU2F2ZVN0YXRlKCRlbmNyeXB0ID0gZmFsc2UsJGtleSA9ICcnKQogIHsKICAgIHN0YWNrX3RyYWNlKCk7CiAgICBkaWUoJ292ZXJyaWRlIHRoaXMnKTsKICB9CgoKICAvKioKICAgKiBSZXN0b3JlIHNhdmVkIG1vZHVsZSBzdGF0ZSBpbmZvcm1hdGlvbiBmcm9tIGFuIGVuY3J5cHRlZC9zZWN1cmUgc3RvcmFnZSBsb2NhdGlvbgogICAqCiAgICogQGFic3RyYWN0CiAgICogQHBhcmFtIHN0cmluZyAgQW4gb3B0aW9uYWwgZW5jcnlwdGlvbiBrZXkKICAgKiBAcmV0dXJuIGJvb2xlYW4gaW5kaWNhdGVzIHN1Y2Nlc3Mgb3IgZmFpbHVyZS4KICAgKi8KICBwdWJsaWMgZnVuY3Rpb24gUmVzdG9yZVN0YXRlKCRrZXkgPSAnJykKICB7CiAgICBzdGFja190cmFjZSgpOwogICAgZGllKCdvdmVycmlkZSB0aGlzJyk7CiAgfQoKCiAgLyoqCiAgICogU2V0IGNyZWRpdCBjYXJkIGluZm9ybWF0aW9uIGludG8gdGhlIG1vZHVsZS4KICAgKiBUaGlzIG1ldGhvZCBtYXkgYmUgY2FsbGVkIGJ5IHRoZSBvcmRlciBwcm9jZXNzaW5nIG1vZHVsZSB0byBwcm92aWRlIGluZm9ybWF0aW9uCiAgICogdGhhdCBtdXN0IGJlIHNlbnQgdG8gdGhlIHBheW1lbnQgZ2F0ZXdheS4KICAgKgogICAqIFRoZSBnYXRld2F5IG1vZHVsZSBzaG91bGQgc3RvcmUgdGhpcyBkYXRhIGZvciBsYXRlciBzZW5kaW5nIHRvIHRoZSBob3N0LgogICAqCiAgICogTm90ZTogVGhpcyBtZXRob2QgaXMgc3ViamVjdCB0byBjaGFuZ2UuCiAgICoKICAgKiBAYWJzdHJhY3QKICAgKiBAcGFyYW0gc3RyaW5nIENyZWRpdCBjYXJkIG51bWJlci4KICAgKiBAcGFyYW0gaW50ZWdlciBDcmVkaXQgY2FyZCBleHBpcnkgZGF0ZQogICAqIEBwYXJhbSBzdHJpbmcgIENyZWRpdCBjYXJkIHZlcmlmaWNhdGlvbiBjb2RlLgogICAqIEByZXR1cm4gdm9pZAogICAqLwogIHB1YmxpYyBmdW5jdGlvbiBTZXRDcmVkaXRDYXJkSW5mbygkY2NudW1iZXIsJGNjZXhwLCRjY3Zjb2RlKQogIHsKICAgIHN0YWNrX3RyYWNlKCk7CiAgICBkaWUoJ292ZXJyaWRlIHRoaXMnKTsKICB9CgoKICAvKioKICAgKiBTZXQgYSBwYXltZW50IGlkZW50aWZpZXIgCiAgICoKICAgKiBUaGUgcGF5bWVudCBpZGVudGlmaWVyIHByb3ZpZGVzIG9yZGVyIHByb2Nlc3Npbmcgc3BlY2lmaWMgaW5mb3JtYXRpb24gdG8gCiAgICogdGllIHRoZSBpbmNvbWluZyB0cmFuc2FjdGlvbiB0byBhbiBleGlzdGluZyBwYXltZW50IHRyYW5zYWN0aW9uLiAgVGhpcwogICAqIHZhcmlhYmxlIG1heSBiZSBudWxsIG9yIGVtcHR5IGlmIGl0IGlzIGEgbmV3IHRyYW5zYWN0aW9uLCBhbmQgaGFzIG5vCiAgICogcmVsYXRpb24gdG8gYSB0cmFuc2FjdGlvbiBpZCBwcm92aWRlZCBieSB0aGUgZ2F0ZXdheS4KICAgKgogICAqIFRoaXMgbWV0aG9kIG1heSBiZSBjYWxsZWQgYnkgdGhlIGdhdGV3YXkgbW9kdWxlIHRvIHByb3ZpZGUgaW5mb3JtYXRpb24KICAgKiB0byB0aGUgb3JkZXIgcHJvY2Vzc2luZyBtb2R1bGUgYWZ0ZXIgYSB0cmFuc2FjdGlvbiBoYXMgYmVlbiByZWNlaXZlZC4KICAgKgogICAqIE5vdGU6IFRoaXMgbWV0aG9kIGlzIHN1YmplY3QgdG8gY2hhbmdlLgogICAqCiAgICogQGFic3RyYWN0CiAgICogQGRlcHJlY2F0ZWQKICAgKiBAcGFyYW0gaW50ZWdlciBQYXltZW50IElECiAgICogQHJldHVybiB2b2lkCiAgICovCiAgcHVibGljIGZ1bmN0aW9uIFNldFBheW1lbnRJZCgkcGF5bWVudF9pZCkKICB7CiAgICBzdGFja190cmFjZSgpOwogICAgZGllKCdvdmVycmlkZSB0aGlzJyk7CiAgfQoKCiAgLyoqCiAgICogUmV0cmlldmVkIGEgcGF5bWVudCBpZGVudGlmaWVyIAogICAqCiAgICogVGhlIHBheW1lbnQgaWRlbnRpZmllciBwcm92aWRlcyBvcmRlciBwcm9jZXNzaW5nIHNwZWNpZmljIGluZm9ybWF0aW9uIHRvIAogICAqIHRpZSB0aGUgaW5jb21pbmcgdHJhbnNhY3Rpb24gdG8gYW4gZXhpc3RpbmcgcGF5bWVudCB0cmFuc2FjdGlvbi4gIFRoaXMKICAgKiB2YXJpYWJsZSBtYXkgYmUgbnVsbCBvciBlbXB0eSBpZiBpdCBpcyBhIG5ldyB0cmFuc2FjdGlvbiwgYW5kIGhhcyBubwogICAqIHJlbGF0aW9uIHRvIGEgdHJhbnNhY3Rpb24gaWQgcHJvdmlkZWQgYnkgdGhlIGdhdGV3YXkuCiAgICoKICAgKiBUaGlzIG1ldGhvZCBtYXkgYmUgY2FsbGVkIGJ5IHRoZSBvcmRlciBwcm9jZXNzaW5nIG1vZHVsZSB0byByZXRyaWV2ZSBpbmZvcm1hdGlvbgogICAqIGFib3V0IGEgcGF5bWVudCBpZGVudGlmaWVyIChpZiBvbmUgZXhpc3RzKS4gIAogICAqCiAgICogTm90ZTogVGhpcyBtZXRob2QgaXMgc3ViamVjdCB0byBjaGFuZ2UuCiAgICoKICAgKiBAYWJzdHJhY3QKICAgKiBAZGVwcmVjYXRlZAogICAqIEBwYXJhbSBpbnRlZ2VyIFBheW1lbnQgSUQKICAgKiBAcmV0dXJuIHZvaWQKICAgKi8KICBwdWJsaWMgZnVuY3Rpb24gR2V0UGF5bWVudElkKCkKICB7CiAgICBzdGFja190cmFjZSgpOwogICAgZGllKCdvdmVycmlkZSB0aGlzJyk7CiAgfQoKCiAgLyoqCiAgICogU2V0IGEgY3VycmVuY3kgY29kZS4KICAgKgogICAqIEFzc29jaWF0ZSBhIGN1cnJlbmN5IGNvZGUgd2l0aCB0aGUgaW5mb3JtYXRpb24gdGhhdCB3aWxsIGJlIHNlbnQgdG8gdGhlIGdhdGV3YXkuCiAgICoKICAgKiBUaGlzIG1ldGhvZCBtYXkgYmUgY2FsbGVkIGJ5IHRoZSBvcmRlciBwcm9jZXNzaW5nIG1vZHVsZSB0byBhZGQgY3VycmVuY3kgaW5mb3JtYXRpb24KICAgKiB0byB0aGUgbGlzdCBvZiBpbmZvcm1hdGlvbiB0aGF0IHdpbGwgYmUgc2VudCB0byB0aGUgaG9zdC4KICAgKgogICAqIFRoZSBnYXRld2F5IG1vZHVsZSBzaG91bGQgc3RvcmUgdGhpcyBkYXRhIGZvciBsYXRlciBzZW5kaW5nIHRvIHRoZSBob3N0LgogICAqCiAgICogTm90ZTogVGhpcyBtZXRob2QgaXMgc3ViamVjdCB0byBjaGFuZ2UuCiAgICoKICAgKiBAYWJzdHJhY3QKICAgKiBAcGFyYW0gc3RyaW5nIFRoZSBjdXJyZW5jeSBjb2RlICh1c3VhbGx5IHR3byBvciB0aHJlZSBkaWdpdHMpCiAgICogQHJldHVybiB2b2lkCiAgICovCiAgcHVibGljIGZ1bmN0aW9uIFNldEN1cnJlbmN5Q29kZSgkY29kZSA9ICdVU0QnKQogIHsKICAgIHN0YWNrX3RyYWNlKCk7CiAgICBkaWUoJ292ZXJyaWRlIHRoaXMnKTsKICB9CgoKICAvKioKICAgKiBTZXQgd2VpZ2h0IHVuaXRzCiAgICoKICAgKiBUaGlzIG1ldGhvZCBtYXkgYmUgY2FsbGVkIGJ5IHRoZSBvcmRlciBwcm9jZXNzaW5nIG1vZHVsZSB0byBhZGQgd2VpZ2h0IHVuaXRzCiAgICogdG8gdGhlIGxpc3Qgb2YgaW5mb3JtYXRpb24gdGhhdCB3aWxsIGJlIHNlbnQgdG8gdGhlIGhvc3QuCiAgICoKICAgKiBUaGUgZ2F0ZXdheSBtb2R1bGUgc2hvdWxkIHN0b3JlIHRoaXMgZGF0YSBmb3IgbGF0ZXIgc2VuZGluZyB0byB0aGUgaG9zdC4KICAgKgogICAqIE5vdGU6IFRoaXMgbWV0aG9kIGlzIHN1YmplY3QgdG8gY2hhbmdlLgogICAqCiAgICogQGFic3RyYWN0CiAgICogQHBhcmFtIHN0cmluZyB0aGUgd2VpZ2h0IHVuaXRzLiAgZWl0aGVyICdsYnMnIG9yICdrZycKICAgKiBAcmV0dXJuIHZvaWQKICAgKi8KICBwdWJsaWMgZnVuY3Rpb24gU2V0V2VpZ2h0VW5pdHMoJHVuaXRzID0gJ2xicycpCiAgewogICAgc3RhY2tfdHJhY2UoKTsKICAgIGRpZSgnb3ZlcnJpZGUgdGhpcycpOwogIH0KCgogIC8qKgogICAqIFNldCBEZXN0aW5hdGlvbiBVUkwuCiAgICoKICAgKiBUaGlzIG1ldGhvZCBtYXkgYmUgY2FsbGVkIGJ5IHRoZSBvcmRlciBwcm9jZXNzaW5nIG1vZHVsZSB0byBzcGVjaWZ5IHdoZXJlCiAgICogdGhlIGN1c3RvbWVyIHNob3VsZCBiZSByZXR1cm5lZCB0byAoaWYgcG9zc2libGUpIG9uY2UgdGhlIHBheW1lbnQgZ2F0ZXdheSB0cmFuc2FjdGlvbgogICAqIGlzIGNvbXBsZXRlLgogICAqCiAgICogVGhlIGdhdGV3YXkgbW9kdWxlIHNob3VsZCBzdG9yZSB0aGlzIGRhdGEgZm9yIHVzZSBhZnRlciBnYXRld2F5IGNvbW11bmljYXRpb25zIGFyZQogICAqIGNvbXBsZXRlLgogICAqCiAgICogTm90ZTogVGhpcyBtZXRob2QgaXMgc3ViamVjdCB0byBjaGFuZ2UuCiAgICoKICAgKiBAYWJzdHJhY3QKICAgKiBAcGFyYW0gc3RyaW5nIHRoZSB3ZWlnaHQgdW5pdHMuICBlaXRoZXIgJ2xicycgb3IgJ2tnJwogICAqIEByZXR1cm4gdm9pZAogICAqLwogIHB1YmxpYyBmdW5jdGlvbiBTZXREZXN0aW5hdGlvbigkdXJsKQogIHsKICAgIHN0YWNrX3RyYWNlKCk7CiAgICBkaWUoJ292ZXJyaWRlIHRoaXMnKTsKICB9CiAgICAKCiAgLyoqCiAgICogQWRkIGEgY2FydCBpdGVtLgogICAqCiAgICogVGhpcyBtZXRob2QgbWF5IGJlIGNhbGxlZCBieSB0aGUgb3JkZXIgcHJvY2Vzc2luZyBtb2R1bGUgdG8gYWRkIGNhcnQgaW5mb3JtYXRpb24KICAgKiB0byB0aGUgaW5mb3JtYXRpb24gdGhhdCBzaG91bGQgYmUgc2VudCB0byB0aGUgcGF5bWVudCBnYXRld2F5LgogICAqCiAgICogVGhlIGdhdGV3YXkgbW9kdWxlIHNob3VsZCBzdG9yZSB0aGlzIGRhdGEgZm9yIGxhdGVyIHNlbmRpbmcgdG8gdGhlIGhvc3QuCiAgICoKICAgKiBOb3RlOiBUaGlzIG1ldGhvZCBpcyBzdWJqZWN0IHRvIGNoYW5nZS4KICAgKgogICAqIEBhYnN0cmFjdAogICAqIEBwYXJhbSBzdHJpbmcgVGhlIGl0ZW0gbmFtZS4KICAgKiBAcGFyYW0gc3RyaW5nIFRoZSBpdGVtIG5hbWUgKG1heWJlIGEgc2t1KQogICAqIEBwYXJhbSBpbnRlZ2VyIFF1YW50aXR5CiAgICogQHBhcmFtIGZsb2F0ICAgVGhlIHdlaWdodCBvZiB0aGUgaXRlbXMKICAgKiBAcGFyYW0gZmxvYXQgICBUaGUgdW5pdCBwcmljZSBvZiB0aGUgaXRlbS4KICAgKiBAcGFyYW0gZmxvYXQgICBBbiBvcHRpb25hbCB0YXggYW1vdW50IChkZXByZWNhdGVkKQogICAqIEByZXR1cm4gdm9pZAogICAqLwogIHB1YmxpYyBmdW5jdGlvbiBBZGRJdGVtKCRuYW1lLCRudW1iZXIsJHF1YW50aXR5LCR3ZWlnaHQsJGFtb3VudCwkdGF4ID0gJycpCiAgewogICAgc3RhY2tfdHJhY2UoKTsKICAgIGRpZSgnb3ZlcnJpZGUgdGhpcycpOwogIH0KCgogIC8qKgogICAqIFNldCBhIGRlc2NyaXB0aW9uIGZvciB0aGUgd2hvbGUgb3JkZXIuCiAgICoKICAgKiBUaGlzIG1ldGhvZCBtYXkgYmUgY2FsbGVkIGJ5IHRoZSBvcmRlciBwcm9jZXNzaW5nIG1vZHVsZSB0byBwcm92aWRlIGEgZ2xvYmFsIAogICAqIGRlc2NyaXB0aW9uIGZvciB0aGUgb3JkZXIuICAKICAgKgogICAqIFRoZSBnYXRld2F5IG1vZHVsZSBzaG91bGQgc3RvcmUgdGhpcyBkYXRhIGZvciBsYXRlciBzZW5kaW5nIHRvIHRoZSBob3N0LgogICAqCiAgICogQGFic3RyYWN0CiAgICogQHBhcmFtIHN0cmluZyBUaGUgZGVzY3JpcHRpb24uCiAgICogQHJldHVybiB2b2lkLgogICAqLwogIHB1YmxpYyBmdW5jdGlvbiBTZXRPcmRlckRlc2NyaXB0aW9uKCRzdHIpCiAgewogICAgc3RhY2tfdHJhY2UoKTsKICAgIGRpZSgnb3ZlcnJpZGUgdGhpcycpOwogIH0KCgogIC8qKgogICAqIFNldCB0aGUgb3JkZXJzIHRheCBhbW91bnQuCiAgICoKICAgKiBUaGlzIG1ldGhvZCBtYXkgYmUgY2FsbGVkIGJ5IHRoZSBvcmRlciBwcm9jZXNzaW5nIG1vZHVsZSB0byBzZXQgdGhlIGFtb3VudAogICAqIG9mIHRheCBhc3NvY2lhdGVkIHdpdGggdGhlIG9yZGVyLgogICAqCiAgICogVGhlIGdhdGV3YXkgbW9kdWxlIHNob3VsZCBzdG9yZSB0aGlzIGRhdGEgZm9yIGxhdGVyIHNlbmRpbmcgdG8gdGhlIGhvc3QuCiAgICoKICAgKiBOb3RlOiBUaGlzIG1ldGhvZCBpcyBzdWJqZWN0IHRvIGNoYW5nZQogICAqCiAgICogQGRlcHJlY2F0ZWQKICAgKiBAYWJzdHJhY3QKICAgKiBAcGFyYW0gZmxvYXQgVGF4IGFtb3VudAogICAqIEByZXR1cm4gdm9pZC4KICAgKi8KICBwdWJsaWMgZnVuY3Rpb24gU2V0T3JkZXJUYXhBbW91bnQoJHRheCkKICB7CiAgICBzdGFja190cmFjZSgpOwogICAgZGllKCdvdmVycmlkZSB0aGlzJyk7CiAgfQoKCiAgLyoqCiAgICogU2V0IHRoZSBvcmRlcnMgc2hpcHBpbmcgY29zdC4KICAgKgogICAqIFRoaXMgbWV0aG9kIG1heSBiZSBjYWxsZWQgYnkgdGhlIG9yZGVyIHByb2Nlc3NpbmcgbW9kdWxlIHRvIHNldCB0aGUgYW1vdW50CiAgICogb2Ygc2hpcHBpbmcgY29zdHMuIGFzc29jaWF0ZWQgd2l0aCB0aGUgb3JkZXIuCiAgICoKICAgKiBUaGUgZ2F0ZXdheSBtb2R1bGUgc2hvdWxkIHN0b3JlIHRoaXMgZGF0YSBmb3IgbGF0ZXIgc2VuZGluZyB0byB0aGUgaG9zdC4KICAgKgogICAqIE5vdGU6IFRoaXMgbWV0aG9kIGlzIHN1YmplY3QgdG8gY2hhbmdlCiAgICoKICAgKiBAZGVwcmVjYXRlZAogICAqIEBhYnN0cmFjdAogICAqIEBwYXJhbSBmbG9hdCBTaGlwcGluZyBjb3N0cy4KICAgKiBAcmV0dXJuIHZvaWQuCiAgICovCiAgcHVibGljIGZ1bmN0aW9uIFNldE9yZGVyU2hpcHBpbmcoJHNoaXBwaW5nKQogIHsKICAgIHN0YWNrX3RyYWNlKCk7CiAgICBkaWUoJ292ZXJyaWRlIHRoaXMnKTsKICB9CgoKCiAgLyoqCiAgICogU2V0IHRoZSBvcmRlciBpbnZvaWNlIHN0cmluZy4KICAgKgogICAqIFRoaXMgbWV0aG9kIG1heSBiZSBjYWxsZWQgYnkgdGhlIG9yZGVyIHByb2Nlc3NpbmcgbW9kdWxlIHRvIHNldCBhbiBpbnZvaWNlIGlkZW50aWZlci4KICAgKgogICAqIFRoZSBnYXRld2F5IG1vZHVsZSBzaG91bGQgc3RvcmUgdGhpcyBkYXRhIGZvciBsYXRlciBzZW5kaW5nIHRvIHRoZSBob3N0LgogICAqCiAgICogQGFic3RyYWN0CiAgICogQHBhcmFtIHN0cmluZyBJbnZvaWNlIGxhYmVsLgogICAqIEByZXR1cm4gdm9pZC4KICAgKi8KICBwdWJsaWMgZnVuY3Rpb24gU2V0SW52b2ljZSgkaW52b2ljZSkKICB7CiAgICBzdGFja190cmFjZSgpOwogICAgZGllKCdvdmVycmlkZSB0aGlzJyk7CiAgfQoKCiAgLyoqCiAgICogU2V0IHRoZSBvcmRlciBpZGVudGlmaWVyLgogICAqCiAgICogVGhpcyBtZXRob2QgbWF5IGJlIGNhbGxlZCBieSB0aGUgb3JkZXIgcHJvY2Vzc2luZyBtb2R1bGUgdG8gc2V0IGFuIG9yZGVyIGlkZW50aWZlci4KICAgKgogICAqIFRoZSBnYXRld2F5IG1vZHVsZSBzaG91bGQgc3RvcmUgdGhpcyBkYXRhIGZvciBsYXRlciBzZW5kaW5nIHRvIHRoZSBob3N0LgogICAqCiAgICogQGFic3RyYWN0CiAgICogQHBhcmFtIGludGVnZXIgVGhlIG9yZGVyIGlkLgogICAqIEByZXR1cm4gdm9pZC4KICAgKi8KICBwdWJsaWMgZnVuY3Rpb24gU2V0T3JkZXJJRCgkb3JkZXJpZCkKICB7CiAgICBzdGFja190cmFjZSgpOwogICAgZGllKCdvdmVycmlkZSB0aGlzJyk7CiAgfQoKCiAgLyoqCiAgICogUmV0cmlldmUgdGhlIG9yZGVyIGlkZW50aWZpZXIuCiAgICoKICAgKiBUaGlzIG1ldGhvZCBtYXkgYmUgY2FsbGVkIGJ5IHRoZSBvcmRlciBwcm9jZXNzaW5nIG1vZHVsZSBhZnRlciBhIHRyYW5zYWN0aW9uIGlzIAogICAqIHByb2Nlc3NlZC4KICAgKgogICAqIEBhYnN0cmFjdAogICAqIEBwYXJhbSBpbnRlZ2VyIFRoZSBvcmRlciBpZC4KICAgKiBAcmV0dXJuIGludGVnZXIKICAgKi8KICBwdWJsaWMgZnVuY3Rpb24gR2V0T3JkZXJJRCgpCiAgewogICAgc3RhY2tfdHJhY2UoKTsKICAgIGRpZSgnb3ZlcnJpZGUgdGhpcycpOwogIH0KCgogIC8qKgogICAqIFNldHMgdGhlIG9yZGVyIGhhc2ggaW50byB0aGUgZ2F0ZXdheSBtb2R1bGUuCiAgICoKICAgKiBUaGUgZ2F0ZXdheSBtb2R1bGUgc2hvdWxkIHN0b3JlIHRoaXMgZGF0YSBmb3IgbGF0ZXIgdXNlIGluIHByZXBhcmluZyBkYXRhCiAgICogdG8gc2VuZCB0byB0aGUgZ2F0ZXdheSBob3N0LgogICAqCiAgICogQGRlcHJlY2F0ZWQKICAgKiBAYWJhc3RyYWN0LgogICAqIEBwYXJhbSBhcnJheSBUaGUgZW50aXJlIG9yZGVyIGV4cHJlc3NlZCBhcyBhbiBhcnJheQogICAqIEByZXR1cm4gdm9pZAogICAqLwogIHB1YmxpYyBmdW5jdGlvbiBTZXRPcmRlcigkb3JkZXIpCiAgewogIH0KCgogIC8qKgogICAqIFNldHMgdGhlIG9yZGVyIG9iamVjdCBpbnRvIHRoZSBnYXRld2F5IG1vZHVsZS4KICAgKgogICAqIFRoaXMgbWV0aG9kIG1heSBiZSBjYWxsZWQgYnkgb3JkZXIgcHJvY2Vzc2luZyBtb2R1bGVzIHdoZW4gcHJlcGFyaW5nIHRoZQogICAqIHBheW1lbnQgcHJvY2Vzcy4KICAgKgogICAqIFRoZSBnYXRld2F5IG1vZHVsZSBzaG91bGQgc3RvcmUgdGhpcyBkYXRhIGZvciBsYXRlciB1c2UgaW4gcHJlcGFyaW5nIGRhdGEKICAgKiB0byBzZW5kIHRvIHRoZSBnYXRld2F5IGhvc3QuCiAgICoKICAgKiBAYWJhc3RyYWN0LgogICAqIEBwYXJhbSBvYmplY3QgQSByZWZlcmVuY2UgdG8gdGhlIGVudGlyZSBvcmRlciBvYmplY3QuCiAgICogQHJldHVybiB2b2lkCiAgICovCiAgcHVibGljIGZ1bmN0aW9uIFNldE9yZGVyT2JqZWN0KG9yZGVyc19vcmRlciYgJG9yZGVyKQogIHsKICAgIC8vIGVtcHR5Li4uIG92ZXJyaWRhYmxlLgogIH0KCgogIC8qKgogICAqIFNldHMgYmlsbGluZyBhZGRyZXNzIG9iamVjdCBpbnRvIHRoZSBnYXRld2F5IG1vZHVsZS4KICAgKgogICAqIFRoaXMgbWV0aG9kIG1heSBiZSBjYWxsZWQgYnkgb3JkZXIgcHJvY2Vzc2luZyBtb2R1bGVzIHdoZW4gcHJlcGFyaW5nIHRoZQogICAqIHBheW1lbnQgcHJvY2Vzcy4KICAgKgogICAqIFRoaXMgbWV0aG9kIGlzIGRlcHJlY2F0ZWQgYXMgYmlsbGluZyBhZGRyZXNzIGluZm9ybWF0aW9uIGlzIGNvbnRhaW5lZCB3aXRoaW4KICAgKiB0aGUgb3JkZXIgb2JqZWN0LgogICAqCiAgICogQGRlcHJlY2F0ZWQKICAgKiBAYWJhc3RyYWN0LgogICAqIEBwYXJhbSBvYmplY3QgVGhlIGJpbGxpbmcgYWRkcmVzcyBvYmplY3QuCiAgICogQHJldHVybiB2b2lkCiAgICovCiAgcHVibGljIGZ1bmN0aW9uIFNldEJpbGxpbmdBZGRyZXNzKG9yZGVyc19hZGRyZXNzJiAkYmlsbGluZ19hZGR5KQogIHsKCS8vVXNlIG1lIGlmIHlvdSB3YW50LCBvciBkb24ndC4gIFdoYXRldmVyLgogIH0KCgogIC8qKgogICAqIFNldHMgc2hpcHBpbmcgYWRkcmVzcyBvYmplY3QgaW50byB0aGUgZ2F0ZXdheSBtb2R1bGUuCiAgICoKICAgKiBUaGlzIG1ldGhvZCBtYXkgYmUgY2FsbGVkIGJ5IG9yZGVyIHByb2Nlc3NpbmcgbW9kdWxlcyB3aGVuIHByZXBhcmluZyB0aGUKICAgKiBwYXltZW50IHByb2Nlc3MuCiAgICoKICAgKiBUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkIGFzIHNoaXBwaW5nIGFkZHJlc3MgaW5mb3JtYXRpb24gaXMgY29udGFpbmVkIHdpdGhpbgogICAqIHRoZSBvcmRlciBvYmplY3QuCiAgICoKICAgKiBAZGVwcmVjYXRlZAogICAqIEBhYmFzdHJhY3QuCiAgICogQHBhcmFtIG9iamVjdCBUaGUgYmlsbGluZyBhZGRyZXNzIG9iamVjdC4KICAgKiBAcmV0dXJuIHZvaWQKICAgKi8KICBwdWJsaWMgZnVuY3Rpb24gU2V0U2hpcHBpbmdBZGRyZXNzKG9yZGVyc19hZGRyZXNzJiAkYmlsbGluZ19hZGR5KQogIHsKCS8vVXNlIG1lIGlmIHlvdSB3YW50LCBvciBkb24ndC4gIFdoYXRldmVyLgogIH0KCgogIC8qKgogICAqIFNldHMgdGhlIFRyYW5zYWN0aW9uaWQgcmV0cmlldmVkIGZyb20gdGhlIGdhdGV3YXkgaG9zdCBpbnRvIHRoZSBtb2R1bGUuCiAgICoKICAgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIGJ5IHRoZSBnYXRld2F5IG1vZHVsZSBhZnRlciByZWNlaXZpbmcgdHJhbnNhY3Rpb24KICAgKiBpbmZvcm1hdGlvbi4KICAgKgogICAqIEBhYmFzdHJhY3QuCiAgICogQHBhcmFtIHN0cmluZyBUcmFuc2FjdGlvbiBJRC4KICAgKiBAcmV0dXJuIHZvaWQKICAgKi8KICBwdWJsaWMgZnVuY3Rpb24gU2V0VHJhbnNhY3Rpb25JZCgkdGlkKQogIHsKICAgIHN0YWNrX3RyYWNlKCk7CiAgICBkaWUoJ292ZXJyaWRlIHRoaXMnKTsKICB9CgoKICAvKioKICAgKiBTZXQgdGhlIHRyYW5zYWN0aW9uIHR5cGUKICAgKgogICAqIFRoaXMgbWV0aG9kIG1heSBiZSBjYWxsZWQgYnkgb3JkZXIgcHJvY2Vzc2luZyBtb2R1bGVzIHdoZW4gcHJlcGFyaW5nIHRvIHByb2Nlc3MgYSB0cmFuc2FjdGlvbgogICAqCiAgICogVGhlIGRlZmF1bHQgdHJhbnNhY3Rpb24gdHlwZSBzaG91bGQgYmUgQ0dQYXltZW50R2F0ZXdheUJhc2U6OlRSQU5TX0NBUFRVUkUKICAgKiBvdGhlciB2YWxpZCB0eXBlcyBhcmUgQ0dQYXltZW50R2F0ZXdheUJhc2U6OlRSQU5TX1ZPSUQgYW5kIENHUGF5bWVudEdhdGV3YXlCYXNlOjpUUkFOU19DUkVESVQuCiAgICogSW52YWxpZCB0cmFuc2FjdGlvbiB0eXBlcyBhcmUgaWdub3JlZC4KICAgKgogICAqIEBhdXRob3IgY2FsZ3V5MTAwMAogICAqIEBzaW5jZSAgMS4wLjExCiAgICovCiAgZmluYWwgcHVibGljIGZ1bmN0aW9uIFNldFRyYW5zYWN0aW9uVHlwZSgkdHlwZSkKICB7CiAgICBzd2l0Y2goICR0eXBlICkKICAgICAgewogICAgICBjYXNlIHNlbGY6OlRSQU5TX0NBUFRVUkU6CiAgICAgIGNhc2Ugc2VsZjo6VFJBTlNfVk9JRDoKICAgICAgY2FzZSBzZWxmOjpUUkFOU19DUkVESVQ6CgkkdGhpcy0+X3RyYW5zdHlwZSA9ICR0eXBlOwogICAgICB9CiAgfQoKCiAgLyoqCiAgICogUmV0cmlldmUgdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24gdHlwZQogICAqCiAgICogSWYgbm90IGV4cGxpY2l0bHkgc2V0LCB3aWxsIHJldHVybiBDR1BheW1lbnRHYXRld2F5QmFzZTo6VFJBTlNfQ0FQVFVSRQogICAqCiAgICogQHNpbmNlIDEuMC4xMQogICAqIEBhdXRob3IgUm9iZXJ0IENhbXBiZWxsCiAgICogQHJldHVybiBzdHJpbmcKICAgKi8KICBmaW5hbCBwdWJsaWMgZnVuY3Rpb24gR2V0VHJhbnNhY3Rpb25UeXBlKCkKICB7CiAgICBpZiggJHRoaXMtPl90cmFuc3R5cGUgPT0gJycgKSByZXR1cm4gc2VsZjo6VFJBTlNfQ0FQVFVSRTsKICAgIHJldHVybiAkdGhpcy0+X3RyYW5zdHlwZTsKICB9CgogIC8qKgogICAqIFNldHMgdGhlIHRyYW5zYWN0aW9uIGFzIGNhbmNlbGxlZC4KICAgKgogICAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgYnkgdGhlIGdhdGV3YXkgbW9kdWxlIGFmdGVyIHJlY2VpdmluZyB0cmFuc2FjdGlvbgogICAqIGluZm9ybWF0aW9uIGlmIHRoZSB0cmFuc2FjdGlvbiBoYXMgYmVlbiBjYW5jZWxsZWQgYnkgdGhlIHVzZXIuCiAgICoKICAgKiBOb3RlOiBUaGlzIG1ldGhvZCBpcyBzdWJqZWN0IHRvIGNoYW5nZS4KICAgKgogICAqIEBhYmFzdHJhY3QuCiAgICogQHBhcmFtIHN0cmluZyBhbiBvcHRpb25hbCBtZXNzYWdlIHRvIGFzc29jaWF0ZSB3aXRoIHRoZSBzdGF0dXMuCiAgICogQHJldHVybiB2b2lkCiAgICovCiAgcHVibGljIGZ1bmN0aW9uIFNldENhbmNlbGxlZCgkbWVzc2FnZSkKICB7CiAgICBzdGFja190cmFjZSgpOwogICAgZGllKCdvdmVycmlkZSB0aGlzJyk7CiAgfQoKCiAgLyoqCiAgICogU2V0cyB0aGUgdHJhbnNhY3Rpb24gc3RhdHVzIHRvIGVycm9yLgogICAqCiAgICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBieSB0aGUgZ2F0ZXdheSBtb2R1bGUgYWZ0ZXIgcmVjZWl2aW5nIHRyYW5zYWN0aW9uCiAgICogaW5mb3JtYXRpb24gaWYgdGhlcmUgaXMgYW4gZXJyb3Igd2l0aCB0aGUgdHJhbnNhY3Rpb24uCiAgICoKICAgKiBOb3RlOiBUaGlzIG1ldGhvZCBpcyBzdWJqZWN0IHRvIGNoYW5nZS4KICAgKgogICAqIEBhYmFzdHJhY3QuCiAgICogQHBhcmFtIHN0cmluZyBhbiBvcHRpb25hbCBtZXNzYWdlIHRvIGFzc29jaWF0ZSB3aXRoIHRoZSBzdGF0dXMuCiAgICogQHJldHVybiB2b2lkCiAgICovCiAgcHVibGljIGZ1bmN0aW9uIFNldEVycm9yKCRtZXNzYWdlKQogIHsKICAgIHN0YWNrX3RyYWNlKCk7CiAgICBkaWUoJ292ZXJyaWRlIHRoaXMnKTsKICB9CgoKICAvKioKICAgKiBSZXNldCB0aGUgaW5mb3JtYXRpb24gc3RvcmVkIHdpdGggdGhlIGdhdGV3YXkgbW9kdWxlLgogICAqCiAgICogQGFiYXN0cmFjdC4KICAgKiBAcmV0dXJuIHZvaWQKICAgKi8KICBwdWJsaWMgZnVuY3Rpb24gUmVzZXQoKQogIHsKICAgIHN0YWNrX3RyYWNlKCk7CiAgICBkaWUoJ292ZXJyaWRlIHRoaXMnKTsKICB9CgoKICAvKioKICAgKiBTZXRzIHRoZSB0cmFuc2FjdGlvbiBhcyBjYW5jZWxsZWQuCiAgICoKICAgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIGJ5IHRoZSBnYXRld2F5IG1vZHVsZSBhZnRlciByZWNlaXZpbmcgdHJhbnNhY3Rpb24KICAgKiBpbmZvcm1hdGlvbiBpZiB0aGUgdHJhbnNhY3Rpb24gaGFzIGJlZW4gZGVjbGluZWQuCiAgICoKICAgKiBOb3RlOiBUaGlzIG1ldGhvZCBpcyBzdWJqZWN0IHRvIGNoYW5nZS4KICAgKgogICAqIEBhYmFzdHJhY3QuCiAgICogQHBhcmFtIHN0cmluZyBhbiBvcHRpb25hbCBtZXNzYWdlIHRvIGFzc29jaWF0ZSB3aXRoIHRoZSBzdGF0dXMuCiAgICogQHJldHVybiB2b2lkCiAgICovCiAgcHVibGljIGZ1bmN0aW9uIFNldERlY2xpbmVkKCRtZXNzYWdlKQogIHsKICAgIHN0YWNrX3RyYWNlKCk7CiAgICBkaWUoJ292ZXJyaWRlIHRoaXMnKTsKICB9CgoKICAvKioKICAgKiBTZXRzIHRoZSB0aGUgdHJhbnNhY3Rpb24gc3RhdHVzLgogICAqCiAgICogVGhpcyBtZXRob2QgbWF5IGJlIGNhbGxlZCBieSB0aGUgZ2F0ZXdheSBtb2R1bGUgYWZ0ZXIgcmVjZWl2aW5nIHRyYW5zYWN0aW9uCiAgICogaW5mb3JtYXRpb24gZnJvbSB0aGUgZ2F0ZXdheSBob3N0LgogICAqCiAgICogTm90ZTogVGhpcyBtZXRob2QgaXMgc3ViamVjdCB0byBjaGFuZ2UuCiAgICoKICAgKiBAYWJhc3RyYWN0LgogICAqIEBwYXJhbSBzdHJpbmcgYW4gb3B0aW9uYWwgbWVzc2FnZSB0byBhc3NvY2lhdGUgd2l0aCB0aGUgc3RhdHVzLgogICAqIEByZXR1cm4gdm9pZAogICAqLwogIHB1YmxpYyBmdW5jdGlvbiBTZXRUcmFuc2FjdGlvblN0YXR1cygkc3RhdHVzKQogIHsKICAgIHN0YWNrX3RyYWNlKCk7CiAgICBkaWUoJ292ZXJyaWRlIHRoaXMnKTsKICB9CgoKICAvKioKICAgKiBTZXRzIHNvbWUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIHRoZSB0cmFuc2FjdGlvbi4KICAgKgogICAqIEBhYnN0cmFjdC4KICAgKiBAcGFyYW0gc3RyaW5nIGtleQogICAqIEBwYXJhbSBtaXhlZCAgdmFsdWUKICAgKiBAcmV0dXJuIHZvaWQKICAgKi8KICBwcm90ZWN0ZWQgZnVuY3Rpb24gU2V0VHJhbnNhY3Rpb25EYXRhKCRrZXksJHZhbHVlKQogIHsKICAgIC8vIG92ZXJyaWRlIG1lIChvcHRpb25hbCkuCiAgfQoKCiAgLyoqCiAgICogR2V0IHRoZSBsaXN0IG9mIGF2YWlsYWJsZSBrZXlzIGZvciB0cmFuc2FjdGlvbiBkYXRhLgogICAqCiAgICogQGFic3RyYWN0CiAgICogQHJldHVybnMgYXJyYXkgb2Ygc3RyaW5ncywgb3IgTlVMTAogICAqLwogIHB1YmxpYyBmdW5jdGlvbiBHZXRUcmFuc2FjdGlvbktleXMoKQogIHsKICAgIC8vIG92ZXJyaWRlIG1lIChvcHRpb25hbCkKICB9CgoKICAvKioKICAgKiBTZXRzIHNvbWUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIHRoZSB0cmFuc2FjdGlvbi4KICAgKgogICAqIEBhYnN0cmFjdC4KICAgKiBAcGFyYW0gc3RyaW5nIGtleQogICAqIEBwYXJhbSBtaXhlZCAgdmFsdWUKICAgKiBAcmV0dXJuIHZvaWQKICAgKi8KICBwdWJsaWMgZnVuY3Rpb24gR2V0VHJhbnNhY3Rpb25EYXRhKCRrZXksJHZhbHVlID0gJycpCiAgewogICAgLy8gb3ZlcnJpZGUgbWUgKG9wdGlvbmFsKQogIH0KCgogIC8qKgogICAqIFJldHJpZXZlIHRoZSB0cmFuc2FjdGlvbiBzdGF0dXMKICAgKgogICAqIFRoaXMgbWV0aG9kIG1heSBiZSBjYWxsZWQgYnkgdGhlIG9yZGVyIHByb2Nlc3NpbmcgbW9kdWxlIHdoZW4gaGFuZGxpbmcgdHJhbnNhY3Rpb24KICAgKiBpbmZvcm1hdGlvbi4KICAgKgogICAqIE5vdGU6IFRoaXMgbWV0aG9kIGlzIHN1YmplY3QgdG8gY2hhbmdlLgogICAqCiAgICogQGFiYXN0cmFjdC4KICAgKiBAcmV0dXJuIHN0cmluZwogICAqLwogIHB1YmxpYyBmdW5jdGlvbiBHZXRUcmFuc2FjdGlvblN0YXR1cygpCiAgewogICAgc3RhY2tfdHJhY2UoKTsKICAgIGRpZSgnb3ZlcnJpZGUgdGhpcycpOwogIH0KCgogIC8qKgogICAqIFJldHJpZXZlIHRoZSB0cmFuc2FjdGlvbiBhbW91bnQuCiAgICoKICAgKiBUaGlzIG1ldGhvZCBtYXkgYmUgY2FsbGVkIGJ5IHRoZSBvcmRlciBwcm9jZXNzaW5nIG1vZHVsZSB3aGVuIGhhbmRsaW5nIHRyYW5zYWN0aW9uCiAgICogaW5mb3JtYXRpb24uCiAgICoKICAgKiBOb3RlOiBUaGlzIG1ldGhvZCBpcyBzdWJqZWN0IHRvIGNoYW5nZS4KICAgKgogICAqIEBhYmFzdHJhY3QuCiAgICogQHJldHVybiBmbG9hdAogICAqLwogIHB1YmxpYyBmdW5jdGlvbiBHZXRUcmFuc2FjdGlvbkFtb3VudCgpCiAgewogICAgc3RhY2tfdHJhY2UoKTsKICAgIGRpZSgnb3ZlcnJpZGUgdGhpcycpOwogIH0KCgogIC8qKgogICAqIFJldHJpZXZlIHRoZSB0cmFuc2FjdGlvbiBpZCBwcm92aWRlZCBieSB0aGUgZ2F0ZXdheSBob3N0LgogICAqCiAgICogVGhpcyBtZXRob2QgbWF5IGJlIGNhbGxlZCBieSB0aGUgb3JkZXIgcHJvY2Vzc2luZyBtb2R1bGUgd2hlbiBoYW5kbGluZyB0cmFuc2FjdGlvbgogICAqIGluZm9ybWF0aW9uLgogICAqCiAgICogTm90ZTogVGhpcyBtZXRob2QgaXMgc3ViamVjdCB0byBjaGFuZ2UuCiAgICoKICAgKiBAYWJhc3RyYWN0LgogICAqIEByZXR1cm4gc3RyaW5nCiAgICovCiAgcHVibGljIGZ1bmN0aW9uIEdldFRyYW5zYWN0aW9uSWQoKQogIHsKICAgIHN0YWNrX3RyYWNlKCk7CiAgICBkaWUoJ292ZXJyaWRlIHRoaXMnKTsKICB9CgoKICAvKioKICAgKiBSZXRyaWV2ZSBhbnkgcHJldmlvdXNseSBzZXQgbWVzc2FnZS4KICAgKgogICAqIFRoaXMgbWV0aG9kIG1heSBiZSBjYWxsZWQgYnkgdGhlIG9yZGVyIHByb2Nlc3NpbmcgbW9kdWxlIHdoZW4gaGFuZGxpbmcgdHJhbnNhY3Rpb24KICAgKiBpbmZvcm1hdGlvbi4KICAgKgogICAqIE5vdGU6IFRoaXMgbWV0aG9kIGlzIHN1YmplY3QgdG8gY2hhbmdlLgogICAqCiAgICogQGFiYXN0cmFjdC4KICAgKiBAcmV0dXJuIHN0cmluZwogICAqLwogIHB1YmxpYyBmdW5jdGlvbiBHZXRNZXNzYWdlKCkKICB7CiAgICBzdGFja190cmFjZSgpOwogICAgZGllKCdvdmVycmlkZSB0aGlzJyk7CiAgfQoKCiAgLyoqCiAgICogRmluaXNoIHRoZSB0cmFuc2FjdGlvbi4KICAgKgogICAqIFVzdWFsbHkgZ2F0ZXdheSBtb2R1bGVzIHdpbGwgc2F2ZSB0aGUgZ2F0ZXdheSBzdGF0ZQogICAqIGFuZCByZWRpcmVjdCB0byB0aGUgZGVzdGluYXRpb24gdXJsLgogICAqCiAgICogTm90ZTogVGhpcyBtZXRob2QgaXMgc3ViamVjdCB0byBjaGFuZ2UuCiAgICoKICAgKiBAYWJhc3RyYWN0LgogICAqIEByZXR1cm4gdm9pZC4KICAgKi8KICBwdWJsaWMgZnVuY3Rpb24gRmluaXNoVHJhbnNhY3Rpb24oKQogIHsKICAgIHN0YWNrX3RyYWNlKCk7CiAgICBkaWUoJ292ZXJyaWRlIHRoaXMnKTsKICB9CgoKICAvKioKICAgKiBFbnN1cmUgdGhhdCB0aGVyZSBpcyBlbm91Z2ggaW5mb3JtYXRpb24gdG8gc2VuZCB0byB0aGUgZ2F0ZXdheSBob3N0LgogICAqCiAgICogVGhpcyBtZXRob2QgaXMgdXN1YWxseSBjYWxsZWQgYmVmb3JlIGF0dGVtcHRpbmcgdG8gc2VuZCBpbmZvcm1hdGlvbiB0byB0aGUKICAgKiBnYXRld2F5IGhvc3QsIG9yIHdoZW4gZGlzcGxheWluZyB0aGUgZm9ybS4KICAgKgogICAqIEBhYnN0cmFjdAogICAqIEByZXR1cm4gYm9vbGVhbi4KICAgKi8KICBwdWJsaWMgZnVuY3Rpb24gQ2hlY2tJbmZvKCkKICB7CiAgICBzdGFja190cmFjZSgpOwogICAgZGllKCdvdmVycmlkZSB0aGlzJyk7CiAgfQoKCiAgLyoqCiAgICogVGVzdCB0aGUgY3VycmVudGx5IGFkZGVkIGl0ZW1zIHRvIGVuc3VyZSB0aGF0IHRoZXkgYXJlIHZhbGlkIHRvIHN1Ym1pdAogICAqIHRvIHRoZSBnYXRld2F5IGhvc3QuCiAgICoKICAgKiBUaGlzIG1ldGhvZCBpcyB1c3VhbGx5IGNhbGxlZCBiZWZvcmUgYXR0ZW1wdGluZyB0byBzZW5kIGluZm9ybWF0aW9uIHRvIHRoZQogICAqIGdhdGV3YXkgaG9zdCwgb3Igd2hlbiBkaXNwbGF5aW5nIHRoZSBmb3JtLgogICAqCiAgICogQGFic3RyYWN0CiAgICogQHJldHVybiBib29sZWFuLgogICAqLwogIHB1YmxpYyBmdW5jdGlvbiBJc0NhcnRWYWxpZCgpCiAgewogICAgc3RhY2tfdHJhY2UoKTsKICAgIGRpZSgnb3ZlcnJpZGUgdGhpcycpOwogIH0KCgogIC8qKgogICAqIERpc3BsYXkgYSBmb3JtIG9yIG90aGVyIHN1aXRhYmxlIG91dHB1dCB0byBhbGxvdyBhIGN1c3RvbWVyIHRvIGNoZWNrb3V0CiAgICogdXNpbmcgdGhpcyBnYXRld2F5LgogICAqCiAgICogU29tZSBnYXRld2F5cyBleHBlY3QgaW5wdXQgdG8gYmUgcHJvdmlkZWQgaW4gYSBmb3JtLCBvdGhlcnMgdXNlIGFuIGVudGlyZWx5CiAgICogcHJvZ3JhbW1hdGljIGFwcHJpYWNoIChwcmVwYXJlIGRhdGEgYW5kIHBvc3QgaXQgdG8gc29tZSBVUkwpLgogICAqCiAgICogVGhpcyBtZXRob2QgaXMgdXN1YWxseSBjYWxsZWQgYnkgdGhlIG9yZGVyIHByb2Nlc3NpbmcgbW9kdWxlIHRvIGRpc3BsYXkKICAgKiBhIGZvcm0gb3IgYSBidXR0b24sIG9yIGEgbGluayB0byBhbGxvdyB0aGUgdXNlciB0byBjaGVja291dC4KICAgKgogICAqIEBhYnN0cmFjdAogICAqIEByZXR1cm4gc3RyaW5nCiAgICovCiAgcHVibGljIGZ1bmN0aW9uIEdldEZvcm0oJHJldHVybmlkKQogIHsKICAgIHN0YWNrX3RyYWNlKCk7CiAgICBkaWUoJ292ZXJyaWRlIHRoaXMnKTsKICB9CgoKICAvKioKICAgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIHNlbmQgaW5mb3JtYXRpb24gdG8gdGhlIHJlbW90ZSBnYXRld2F5IHdpdGhvdXQKICAgKiB1c2VyIGludGVyYWN0aW9uLgogICAqCiAgICogU29tZSBnYXRld2F5cyBtYXkgbm90IHN1cHBvcnQgdGhpcy4KICAgKgogICAqIEBhYnN0cmFjdAogICAqIEByZXR1cm4gdm9pZAogICAqLwogIHB1YmxpYyBmdW5jdGlvbiBQcm9jZXNzVHJhbnNhY3Rpb24oKQogIHsKICAgIHN0YWNrX3RyYWNlKCk7CiAgICBkaWUoJ292ZXJyaWRlIHRoaXMnKTsKICB9CgogIAogIC8qKgogICAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gc2VuZCBub3RpZmljYXRpb24gdG8gdGhlIG9yZGVyIHByb2Nlc3NvciB0aGF0IHRyYW5zYWN0aW9uCiAgICogaW5mb3JtYXRpb24gaGFzIGFycml2ZWQgYXN5bmNyaG9ub3VzbHkuCiAgICoKICAgKiBUaGlzIG1ldGhvZCBwcmVwYXJlcyBzb21lIGluZm9ybWF0aW9uLCBhbmQgc2VuZHMgdGhlIENHUGF5bWVudEdhdGV3YXlCYXNlOjpvbl9pbmNvbWluZ19ldmVudCBldmVudC4KICAgKgogICAqIEBkZXByZWNhdGVkLgogICAqIEBmaW5hbAogICAqIEByZXR1cm4gdm9pZAogICAqLwogIHByb3RlY3RlZCBmdW5jdGlvbiBQcm9jZXNzQXN5bmNUcmFuc2FjdGlvbigkb3JkZXJfaWQsJHRyYW5zYWN0aW9uX2lkLCRwYXltZW50X3N0YXR1cywkYW1vdW50LCRtZXNzYWdlID0gJycpCiAgewogICAgJHRyYW5zYWN0aW9uID0gbmV3IGNncGdiX2FzeW5jX3RyYW5zYWN0aW9uKCRvcmRlcl9pZCwkYW1vdW50KTsKICAgICR0cmFuc2FjdGlvbi0+c2V0X21lc3NhZ2UoJG1lc3NhZ2UpOwogICAgJHRyYW5zYWN0aW9uLT5zZXRfaWQoJHRyYW5zYWN0aW9uX2lkKTsKICAgICR0cmFuc2FjdGlvbi0+c2V0X2dhdGV3YXkoJHRoaXMtPkdldE5hbWUoKSk7CiAgICAkdHJhbnNhY3Rpb24tPnNldF9zdGF0dXMoJHBheW1lbnRfc3RhdHVzKTsKICAgICR0aGlzLT5zZW5kX3RyYW5zYWN0aW9uX25vdGlmaWNhdGlvbigkdHJhbnNhY3Rpb24pOwogIH0KCgogIC8qKgogICAqIFJldHVybiBhbiBvYmplY3QgaW5kaWNhdGluZyB0aGUgY2FwYWJpbGl0aWVzIGFuZCBwb2xpY2llcyAKICAgKiBvZiB0aGlzIGdhdGV3YXkgbW9kdWxlLgogICAqCiAgICogQHNlZSBjZ19lY29tbV9jYXJ0aXRlbV9wb2xpY3kKICAgKiBAYWJzdHJhY3QKICAgKiBAcmV0dXJuIG9iamVjdCBPYmplY3Qgb2YgdHlwZSBjZ19lY29tbV9jYXJ0aXRlbV9wb2xpY3kuCiAgICovCiAgcHVibGljIGZ1bmN0aW9uIGdldF9jYXJ0aXRlbV9wb2xpY3koKQogIHsKICAgIC8vIGJ5IGRlZmF1bHQgd2UgZG9uJ3QgYWxsb3cgc3Vic2NyaXB0aW9ucy4KICAgICRwb2xpY3kgPSBuZXcgY2dfZWNvbW1fY2FydGl0ZW1fcG9saWN5KCk7CiAgICAkcG9saWN5LT5zZXRfbWl4ZWRfc3Vic2NyaXB0aW9ucyhmYWxzZSk7CiAgICAkcG9saWN5LT5zZXRfbWF4X3N1YnNjcmlwdGlvbnMoMCk7CiAgICByZXR1cm4gJHBvbGljeTsKICB9CgoKICAvKioKICAgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIHNlbmQgbm90aWZpY2F0aW9uIHRvIHRoZSBvcmRlciBwcm9jZXNzb3IgdGhhdCB0cmFuc2FjdGlvbgogICAqIGluZm9ybWF0aW9uIGhhcyBhcnJpdmVkIGFzeW5jcmhvbm91c2x5LgogICAqCiAgICogVGhpcyBtZXRob2QgcHJlcGFyZXMgc29tZSBpbmZvcm1hdGlvbiwgYW5kIHNlbmRzIHRoZSBDR1BheW1lbnRHYXRld2F5QmFzZTo6b25faW5jb21pbmdfZXZlbnQgZXZlbnQuCiAgICoKICAgKiBAZmluYWwKICAgKiBAcmV0dXJuIHZvaWQKICAgKi8KICBwdWJsaWMgZnVuY3Rpb24gc2VuZF90cmFuc2FjdGlvbl9ub3RpZmljYXRpb24oY2dwZ2JfYXN5bmNfdHJhbnNhY3Rpb24mICR0cmFuc2FjdGlvbikKICB7CiAgICAkcGFybXMgPSBhcnJheSgpOwogICAgJHBhcm1zWydnYXRld2F5J10gPSAkdGhpcy0+R2V0RnJpZW5kbHlOYW1lKCk7CiAgICAkcGFybXNbJ3NyY19tb2R1bGUnXSA9ICR0aGlzLT5HZXROYW1lKCk7CiAgICAkb3JkZXJfaWQgPSAkdHJhbnNhY3Rpb24tPmdldF9vcmRlcl9pZCgpOwogICAgaWYoICRvcmRlcl9pZCApCiAgICAgIHsKCSRwYXJtc1snb3JkZXJfaWQnXSA9ICRvcmRlcl9pZDsKICAgICAgfQogICAgZWxzZSAKICAgICAgewoJJHBhcm1zWydpbnZvaWNlJ10gPSAkdHJhbnNhY3Rpb24tPmdldF9pbnZvaWNlKCk7CiAgICAgIH0KICAgICRwYXJtc1sncGF5bWVudF9zdGF0dXMnXSA9ICR0cmFuc2FjdGlvbi0+Z2V0X3N0YXR1cygpOwogICAgJHBhcm1zWydhbW91bnQnXSA9ICR0cmFuc2FjdGlvbi0+Z2V0X2Ftb3VudCgpOwogICAgJHBhcm1zWyd0cmFuc2FjdGlvbiddID0gJHRyYW5zYWN0aW9uLT5nZXRfaWQoKTsKICAgICRwYXJtc1snbWVzc2FnZSddID0gJHRyYW5zYWN0aW9uLT5nZXRfbWVzc2FnZSgpOwoKICAgICRwYXJtc1snZXZlbnRfZGF0ZSddID0gdGltZSgpOwogICAgJHBhcm1zWyd0cmFuc2FjdGlvbl9vYmonXSA9JiAkdHJhbnNhY3Rpb247CgogICAgRXZlbnRzOjpTZW5kRXZlbnQoJ0NHUGF5bWVudEdhdGV3YXlCYXNlJywnb25faW5jb21pbmdfZXZlbnQnLCRwYXJtcyk7CiAgfQoKCiAgLyoqCiAgICogR2V0IHRoZSBvcmRlciBvYmplY3QKICAgKgogICAqIEBzaW5jZSAxLjAuMTAKICAgKiBAcmV0dXJucyBvYmplY3QsIG9yIG51bGwKICAgKi8KICBwcm90ZWN0ZWQgZnVuY3Rpb24gJmdldF9vcmRlcl9vYmplY3QoKQogIHsKICAgIC8vIGVtcHR5OwogIH0KCgogIC8qKgogICAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gdGVzdCB0aGUgY3VycmVudGx5IHN1cHBsaWVkIG9yZGVyIG9iamVjdCB0byBzZWUgaWYgdGhlcmUgaXMgYXQgbGVhc3QKICAgKiBvbmUgc3Vic2NyaXB0aW9uIGluIHRoZSBpdGVtcy4KICAgKgogICAqIEBmaW5hbAogICAqIEBzaW5jZSAxLjAuMTAKICAgKiBAcmV0dXJucyB0aGUgZmlyc3Qgc3Vic2NyaXB0aW9uIGl0ZW0gZm91bmQuLi4gb3IgTlVMTAogICAqLwogIHByb3RlY3RlZCBmdW5jdGlvbiBvcmRlcl9jb250YWluc19zdWJzY3JpcHRpb24oKQogIHsKICAgIC8vIGZpbmQgYW4gaXRlbSB3aXRoIGEgc3Vic2NyaXB0aW9uCiAgICAkb3JkZXIgPSAkdGhpcy0+Z2V0X29yZGVyX29iamVjdCgpOwogICAgaWYoIGlzX29iamVjdCgkb3JkZXIpICkKICAgICAgewoJZm9yKCAkaSA9IDA7ICRpIDwgJG9yZGVyLT5jb3VudF9kZXN0aW5hdGlvbnMoKTsgJGkrKyApCgkgIHsKCSAgICAkc2hpcHBpbmcgPSAkb3JkZXItPmdldF9zaGlwcGluZygkaSk7CgkgICAgZm9yKCAkaiA9IDA7ICRqIDwgJHNoaXBwaW5nLT5jb3VudF9hbGxfaXRlbXMoKTsgJGorKyApCgkgICAgICB7CgkJJGl0ZW0gPSAkc2hpcHBpbmctPmdldF9pdGVtKCRqKTsKCQlpZiggJGl0ZW0tPmlzX3N1YnNjcmlwdGlvbigpICkKCQkgIHsKCQkgICAgcmV0dXJuICRpdGVtOwoJCSAgfQoJICAgICAgfQoJICB9CiAgICAgIH0KICAgIHJldHVybiBGQUxTRTsKICB9CgoKICAvKioKICAgKiBHZXQgdGhlIFVSTCB0byB1c2UgZm9yIHRoZSBpbWFnZSBmb3IgdGhlIGdhdGV3YXkuCiAgICogVGhlIGltYWdlIG1heSBiZSB1c2VkIGR1cmluZyB0aGUgY2hlY2tvdXQgcHJvY2VzcyB3aGVuIGRpc3BsYXlpbmcgYSBsaXN0IG9mIHBvc3NpYmxlIHBheW1lbnQgbWV0aG9kcy4KICAgKgogICAqIE1vZHVsZXMgbWF5IG92ZXJyaWRlIHRoaXMgdG8gc2V0IGEgY3VzdG9tIGltYWdlLgogICAqCiAgICogQHNpbmNlIDEuMQogICAqIEByZXR1cm5zIHN0cmluZwogICAqLwogIHB1YmxpYyBmdW5jdGlvbiBnZXRfaW1hZ2VfdXJsKCkKICB7CiAgICAkZm4gPSAkdGhpcy0+R2V0TW9kdWxlUGF0aCgpLicvaW1hZ2VzL2ljb24uZ2lmJzsKICAgIGlmKCBmaWxlX2V4aXN0cygkZm4pICkKICAgICAgewoJcmV0dXJuICR0aGlzLT5HZXRNb2R1bGVVUkxQYXRoKCkuJy9pbWFnZXMvaWNvbi5naWYnOwogICAgICB9CiAgfQoKfSAvLyBjbGFzcwo=]]></data>
	</file>
	<file>
	  <filename>/changelog.inc</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PHVsPgogIDxsaT5WZXJzaW9uIDEuMCAtIEFwcmlsLCAyMDA5CiAgICA8dWw+CiAgICAgIDxsaT5Jbml0aWFsIFJlbGVhc2U8L2xpPgogICAgPC91bD4KICA8L2xpPgogIDxsaT5WZXJzaW9uIDEuMC4yIC0gQXVndXN0LCAyMDA5CiAgICA8dWw+CjxsaT5BZGRzIHRoZSBjYXBhYmlsaXR5IHRvIGhhbmRsZSwgYW5kIGFkdmVydGlzZSBhc3luY2hyb25vdXMgcGF5bWVudCBnYXRld2F5IGV2ZW50cy48L2xpPgogICAgPC91bD4KICA8L2xpPgo8bGk+VmVyc2lvbiAxLjAuNSAtIEFwcmlsLCAyMDEwCiAgPHVsPgogICAgPGxpPk1hbnl5IG5ldyBmdW5jdGlvbnMgdGhhdCBhcmUgY2FsbGVkIGZyb20gdGhlIE9yZGVycyBtb2R1bGUuPC9saT4KICA8L3VsPiAgICAKICA8L2xpPgo8bGk+VmVyc2lvbiAxLjAuNyAtIEp1bHksIDIwMTAKICA8dWw+CiAgICA8bGk+QWRkcyBwb2xpY3kgc3VwcG9ydC48L2xpPgogICAgPGxpPkFkZHMgYSB0cmFuc2FjdGlvbiBvYmplY3QuLi4gPC9saT4KICA8L3VsPiAgICAKICA8L2xpPgo8bGk+VmVyc2lvbiAxLjAuOCAtIEp1bHksIDIwMTAKICA8dWw+CiAgICA8bGk+VXBkYXRlIGRlcGVuZGVuY2llcy48L2xpPgogICAgPGxpPk1vdmUgY2hhbmdlbG9nIGV4dGVybmFsLjwvbGk+CiAgPC91bD4gICAgCiAgPC9saT4KPGxpPlZlcnNpb24gMS4wLjEwIC0gQXByaWwsICAyMDExCiAgPHVsPgogICAgPGxpPlVwZGF0ZSBEZXBkZW5kZW5jaWVzLjwvbGk+CiAgICA8bGk+QWRkcyBzb21lIG5ldyBzdHViIGZ1bmN0aW9ucy48L2xpPgogIDwvdWw+ICAgIAogIDwvbGk+CjxsaT5WZXJzaW9uIDEuMSAtIE1heSwgIDIwMTEKICA8dWw+CiAgPGxpPkNyZWF0ZSBhIG5ldyBpbWFnZSBwYXRoIG1ldGhvZC48L2xpPgogIDxsaT5NaW5vciBmaXggdG8gUHJvY2Vzc0FzeW5jVHJhbnNhY3Rpb24oKTwvbGk+CiAgPC91bD4gICAgCiAgPC9saT4KPC91bD4KPGxpPlZlcnNpb24gMS4yIC0gSmFudWFyeSwgMjAxMwogIDxwPjxzdHJvbmc+Tk9URTogUEhQIDUuMy54IElTIFJFUVVJUkVELjwvc3Ryb25nPjwvcD4KICA8dWw+CiAgPGxpPlVwZGF0ZXMgZm9yIHRoZSAxLjExLnggc2VyaWVzLjwvbGk+CiAgPGxpPkFkZHMgYSBmZXcgbWlzc2luZyBtZXRob2RzLjwvbGk+CiAgPC91bD4gICAgCiAgPC9saT4KPC91bD4K]]></data>
	</file>
	<file>
	  <filename>/doc/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/doc/COPYING</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ICAgICAgICAgICAgICAgICAgICBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRQogICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMywgMjkgSnVuZSAyMDA3CgogQ29weXJpZ2h0IChDKSAyMDA3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiA8aHR0cDovL2ZzZi5vcmcvPgogRXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzCiBvZiB0aGlzIGxpY2Vuc2UgZG9jdW1lbnQsIGJ1dCBjaGFuZ2luZyBpdCBpcyBub3QgYWxsb3dlZC4KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmVhbWJsZQoKICBUaGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgYSBmcmVlLCBjb3B5bGVmdCBsaWNlbnNlIGZvcgpzb2Z0d2FyZSBhbmQgb3RoZXIga2luZHMgb2Ygd29ya3MuCgogIFRoZSBsaWNlbnNlcyBmb3IgbW9zdCBzb2Z0d2FyZSBhbmQgb3RoZXIgcHJhY3RpY2FsIHdvcmtzIGFyZSBkZXNpZ25lZAp0byB0YWtlIGF3YXkgeW91ciBmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgdGhlIHdvcmtzLiAgQnkgY29udHJhc3QsCnRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbnRlbmRlZCB0byBndWFyYW50ZWUgeW91ciBmcmVlZG9tIHRvCnNoYXJlIGFuZCBjaGFuZ2UgYWxsIHZlcnNpb25zIG9mIGEgcHJvZ3JhbS0tdG8gbWFrZSBzdXJlIGl0IHJlbWFpbnMgZnJlZQpzb2Z0d2FyZSBmb3IgYWxsIGl0cyB1c2Vycy4gIFdlLCB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB1c2UgdGhlCkdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3N0IG9mIG91ciBzb2Z0d2FyZTsgaXQgYXBwbGllcyBhbHNvIHRvCmFueSBvdGhlciB3b3JrIHJlbGVhc2VkIHRoaXMgd2F5IGJ5IGl0cyBhdXRob3JzLiAgWW91IGNhbiBhcHBseSBpdCB0bwp5b3VyIHByb2dyYW1zLCB0b28uCgogIFdoZW4gd2Ugc3BlYWsgb2YgZnJlZSBzb2Z0d2FyZSwgd2UgYXJlIHJlZmVycmluZyB0byBmcmVlZG9tLCBub3QKcHJpY2UuICBPdXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZXMgYXJlIGRlc2lnbmVkIHRvIG1ha2Ugc3VyZSB0aGF0IHlvdQpoYXZlIHRoZSBmcmVlZG9tIHRvIGRpc3RyaWJ1dGUgY29waWVzIG9mIGZyZWUgc29mdHdhcmUgKGFuZCBjaGFyZ2UgZm9yCnRoZW0gaWYgeW91IHdpc2gpLCB0aGF0IHlvdSByZWNlaXZlIHNvdXJjZSBjb2RlIG9yIGNhbiBnZXQgaXQgaWYgeW91CndhbnQgaXQsIHRoYXQgeW91IGNhbiBjaGFuZ2UgdGhlIHNvZnR3YXJlIG9yIHVzZSBwaWVjZXMgb2YgaXQgaW4gbmV3CmZyZWUgcHJvZ3JhbXMsIGFuZCB0aGF0IHlvdSBrbm93IHlvdSBjYW4gZG8gdGhlc2UgdGhpbmdzLgoKICBUbyBwcm90ZWN0IHlvdXIgcmlnaHRzLCB3ZSBuZWVkIHRvIHByZXZlbnQgb3RoZXJzIGZyb20gZGVueWluZyB5b3UKdGhlc2UgcmlnaHRzIG9yIGFza2luZyB5b3UgdG8gc3VycmVuZGVyIHRoZSByaWdodHMuICBUaGVyZWZvcmUsIHlvdSBoYXZlCmNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyBpZiB5b3UgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlIHNvZnR3YXJlLCBvciBpZgp5b3UgbW9kaWZ5IGl0OiByZXNwb25zaWJpbGl0aWVzIHRvIHJlc3BlY3QgdGhlIGZyZWVkb20gb2Ygb3RoZXJzLgoKICBGb3IgZXhhbXBsZSwgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHN1Y2ggYSBwcm9ncmFtLCB3aGV0aGVyCmdyYXRpcyBvciBmb3IgYSBmZWUsIHlvdSBtdXN0IHBhc3Mgb24gdG8gdGhlIHJlY2lwaWVudHMgdGhlIHNhbWUKZnJlZWRvbXMgdGhhdCB5b3UgcmVjZWl2ZWQuICBZb3UgbXVzdCBtYWtlIHN1cmUgdGhhdCB0aGV5LCB0b28sIHJlY2VpdmUKb3IgY2FuIGdldCB0aGUgc291cmNlIGNvZGUuICBBbmQgeW91IG11c3Qgc2hvdyB0aGVtIHRoZXNlIHRlcm1zIHNvIHRoZXkKa25vdyB0aGVpciByaWdodHMuCgogIERldmVsb3BlcnMgdGhhdCB1c2UgdGhlIEdOVSBHUEwgcHJvdGVjdCB5b3VyIHJpZ2h0cyB3aXRoIHR3byBzdGVwczoKKDEpIGFzc2VydCBjb3B5cmlnaHQgb24gdGhlIHNvZnR3YXJlLCBhbmQgKDIpIG9mZmVyIHlvdSB0aGlzIExpY2Vuc2UKZ2l2aW5nIHlvdSBsZWdhbCBwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kL29yIG1vZGlmeSBpdC4KCiAgRm9yIHRoZSBkZXZlbG9wZXJzJyBhbmQgYXV0aG9ycycgcHJvdGVjdGlvbiwgdGhlIEdQTCBjbGVhcmx5IGV4cGxhaW5zCnRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgZm9yIHRoaXMgZnJlZSBzb2Z0d2FyZS4gIEZvciBib3RoIHVzZXJzJyBhbmQKYXV0aG9ycycgc2FrZSwgdGhlIEdQTCByZXF1aXJlcyB0aGF0IG1vZGlmaWVkIHZlcnNpb25zIGJlIG1hcmtlZCBhcwpjaGFuZ2VkLCBzbyB0aGF0IHRoZWlyIHByb2JsZW1zIHdpbGwgbm90IGJlIGF0dHJpYnV0ZWQgZXJyb25lb3VzbHkgdG8KYXV0aG9ycyBvZiBwcmV2aW91cyB2ZXJzaW9ucy4KCiAgU29tZSBkZXZpY2VzIGFyZSBkZXNpZ25lZCB0byBkZW55IHVzZXJzIGFjY2VzcyB0byBpbnN0YWxsIG9yIHJ1bgptb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgc29mdHdhcmUgaW5zaWRlIHRoZW0sIGFsdGhvdWdoIHRoZSBtYW51ZmFjdHVyZXIKY2FuIGRvIHNvLiAgVGhpcyBpcyBmdW5kYW1lbnRhbGx5IGluY29tcGF0aWJsZSB3aXRoIHRoZSBhaW0gb2YKcHJvdGVjdGluZyB1c2VycycgZnJlZWRvbSB0byBjaGFuZ2UgdGhlIHNvZnR3YXJlLiAgVGhlIHN5c3RlbWF0aWMKcGF0dGVybiBvZiBzdWNoIGFidXNlIG9jY3VycyBpbiB0aGUgYXJlYSBvZiBwcm9kdWN0cyBmb3IgaW5kaXZpZHVhbHMgdG8KdXNlLCB3aGljaCBpcyBwcmVjaXNlbHkgd2hlcmUgaXQgaXMgbW9zdCB1bmFjY2VwdGFibGUuICBUaGVyZWZvcmUsIHdlCmhhdmUgZGVzaWduZWQgdGhpcyB2ZXJzaW9uIG9mIHRoZSBHUEwgdG8gcHJvaGliaXQgdGhlIHByYWN0aWNlIGZvciB0aG9zZQpwcm9kdWN0cy4gIElmIHN1Y2ggcHJvYmxlbXMgYXJpc2Ugc3Vic3RhbnRpYWxseSBpbiBvdGhlciBkb21haW5zLCB3ZQpzdGFuZCByZWFkeSB0byBleHRlbmQgdGhpcyBwcm92aXNpb24gdG8gdGhvc2UgZG9tYWlucyBpbiBmdXR1cmUgdmVyc2lvbnMKb2YgdGhlIEdQTCwgYXMgbmVlZGVkIHRvIHByb3RlY3QgdGhlIGZyZWVkb20gb2YgdXNlcnMuCgogIEZpbmFsbHksIGV2ZXJ5IHByb2dyYW0gaXMgdGhyZWF0ZW5lZCBjb25zdGFudGx5IGJ5IHNvZnR3YXJlIHBhdGVudHMuClN0YXRlcyBzaG91bGQgbm90IGFsbG93IHBhdGVudHMgdG8gcmVzdHJpY3QgZGV2ZWxvcG1lbnQgYW5kIHVzZSBvZgpzb2Z0d2FyZSBvbiBnZW5lcmFsLXB1cnBvc2UgY29tcHV0ZXJzLCBidXQgaW4gdGhvc2UgdGhhdCBkbywgd2Ugd2lzaCB0bwphdm9pZCB0aGUgc3BlY2lhbCBkYW5nZXIgdGhhdCBwYXRlbnRzIGFwcGxpZWQgdG8gYSBmcmVlIHByb2dyYW0gY291bGQKbWFrZSBpdCBlZmZlY3RpdmVseSBwcm9wcmlldGFyeS4gIFRvIHByZXZlbnQgdGhpcywgdGhlIEdQTCBhc3N1cmVzIHRoYXQKcGF0ZW50cyBjYW5ub3QgYmUgdXNlZCB0byByZW5kZXIgdGhlIHByb2dyYW0gbm9uLWZyZWUuCgogIFRoZSBwcmVjaXNlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kCm1vZGlmaWNhdGlvbiBmb2xsb3cuCgogICAgICAgICAgICAgICAgICAgICAgIFRFUk1TIEFORCBDT05ESVRJT05TCgogIDAuIERlZmluaXRpb25zLgoKICAiVGhpcyBMaWNlbnNlIiByZWZlcnMgdG8gdmVyc2lvbiAzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KCiAgIkNvcHlyaWdodCIgYWxzbyBtZWFucyBjb3B5cmlnaHQtbGlrZSBsYXdzIHRoYXQgYXBwbHkgdG8gb3RoZXIga2luZHMgb2YKd29ya3MsIHN1Y2ggYXMgc2VtaWNvbmR1Y3RvciBtYXNrcy4KCiAgIlRoZSBQcm9ncmFtIiByZWZlcnMgdG8gYW55IGNvcHlyaWdodGFibGUgd29yayBsaWNlbnNlZCB1bmRlciB0aGlzCkxpY2Vuc2UuICBFYWNoIGxpY2Vuc2VlIGlzIGFkZHJlc3NlZCBhcyAieW91Ii4gICJMaWNlbnNlZXMiIGFuZAoicmVjaXBpZW50cyIgbWF5IGJlIGluZGl2aWR1YWxzIG9yIG9yZ2FuaXphdGlvbnMuCgogIFRvICJtb2RpZnkiIGEgd29yayBtZWFucyB0byBjb3B5IGZyb20gb3IgYWRhcHQgYWxsIG9yIHBhcnQgb2YgdGhlIHdvcmsKaW4gYSBmYXNoaW9uIHJlcXVpcmluZyBjb3B5cmlnaHQgcGVybWlzc2lvbiwgb3RoZXIgdGhhbiB0aGUgbWFraW5nIG9mIGFuCmV4YWN0IGNvcHkuICBUaGUgcmVzdWx0aW5nIHdvcmsgaXMgY2FsbGVkIGEgIm1vZGlmaWVkIHZlcnNpb24iIG9mIHRoZQplYXJsaWVyIHdvcmsgb3IgYSB3b3JrICJiYXNlZCBvbiIgdGhlIGVhcmxpZXIgd29yay4KCiAgQSAiY292ZXJlZCB3b3JrIiBtZWFucyBlaXRoZXIgdGhlIHVubW9kaWZpZWQgUHJvZ3JhbSBvciBhIHdvcmsgYmFzZWQKb24gdGhlIFByb2dyYW0uCgogIFRvICJwcm9wYWdhdGUiIGEgd29yayBtZWFucyB0byBkbyBhbnl0aGluZyB3aXRoIGl0IHRoYXQsIHdpdGhvdXQKcGVybWlzc2lvbiwgd291bGQgbWFrZSB5b3UgZGlyZWN0bHkgb3Igc2Vjb25kYXJpbHkgbGlhYmxlIGZvcgppbmZyaW5nZW1lbnQgdW5kZXIgYXBwbGljYWJsZSBjb3B5cmlnaHQgbGF3LCBleGNlcHQgZXhlY3V0aW5nIGl0IG9uIGEKY29tcHV0ZXIgb3IgbW9kaWZ5aW5nIGEgcHJpdmF0ZSBjb3B5LiAgUHJvcGFnYXRpb24gaW5jbHVkZXMgY29weWluZywKZGlzdHJpYnV0aW9uICh3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uKSwgbWFraW5nIGF2YWlsYWJsZSB0byB0aGUKcHVibGljLCBhbmQgaW4gc29tZSBjb3VudHJpZXMgb3RoZXIgYWN0aXZpdGllcyBhcyB3ZWxsLgoKICBUbyAiY29udmV5IiBhIHdvcmsgbWVhbnMgYW55IGtpbmQgb2YgcHJvcGFnYXRpb24gdGhhdCBlbmFibGVzIG90aGVyCnBhcnRpZXMgdG8gbWFrZSBvciByZWNlaXZlIGNvcGllcy4gIE1lcmUgaW50ZXJhY3Rpb24gd2l0aCBhIHVzZXIgdGhyb3VnaAphIGNvbXB1dGVyIG5ldHdvcmssIHdpdGggbm8gdHJhbnNmZXIgb2YgYSBjb3B5LCBpcyBub3QgY29udmV5aW5nLgoKICBBbiBpbnRlcmFjdGl2ZSB1c2VyIGludGVyZmFjZSBkaXNwbGF5cyAiQXBwcm9wcmlhdGUgTGVnYWwgTm90aWNlcyIKdG8gdGhlIGV4dGVudCB0aGF0IGl0IGluY2x1ZGVzIGEgY29udmVuaWVudCBhbmQgcHJvbWluZW50bHkgdmlzaWJsZQpmZWF0dXJlIHRoYXQgKDEpIGRpc3BsYXlzIGFuIGFwcHJvcHJpYXRlIGNvcHlyaWdodCBub3RpY2UsIGFuZCAoMikKdGVsbHMgdGhlIHVzZXIgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSBmb3IgdGhlIHdvcmsgKGV4Y2VwdCB0byB0aGUKZXh0ZW50IHRoYXQgd2FycmFudGllcyBhcmUgcHJvdmlkZWQpLCB0aGF0IGxpY2Vuc2VlcyBtYXkgY29udmV5IHRoZQp3b3JrIHVuZGVyIHRoaXMgTGljZW5zZSwgYW5kIGhvdyB0byB2aWV3IGEgY29weSBvZiB0aGlzIExpY2Vuc2UuICBJZgp0aGUgaW50ZXJmYWNlIHByZXNlbnRzIGEgbGlzdCBvZiB1c2VyIGNvbW1hbmRzIG9yIG9wdGlvbnMsIHN1Y2ggYXMgYQptZW51LCBhIHByb21pbmVudCBpdGVtIGluIHRoZSBsaXN0IG1lZXRzIHRoaXMgY3JpdGVyaW9uLgoKICAxLiBTb3VyY2UgQ29kZS4KCiAgVGhlICJzb3VyY2UgY29kZSIgZm9yIGEgd29yayBtZWFucyB0aGUgcHJlZmVycmVkIGZvcm0gb2YgdGhlIHdvcmsKZm9yIG1ha2luZyBtb2RpZmljYXRpb25zIHRvIGl0LiAgIk9iamVjdCBjb2RlIiBtZWFucyBhbnkgbm9uLXNvdXJjZQpmb3JtIG9mIGEgd29yay4KCiAgQSAiU3RhbmRhcmQgSW50ZXJmYWNlIiBtZWFucyBhbiBpbnRlcmZhY2UgdGhhdCBlaXRoZXIgaXMgYW4gb2ZmaWNpYWwKc3RhbmRhcmQgZGVmaW5lZCBieSBhIHJlY29nbml6ZWQgc3RhbmRhcmRzIGJvZHksIG9yLCBpbiB0aGUgY2FzZSBvZgppbnRlcmZhY2VzIHNwZWNpZmllZCBmb3IgYSBwYXJ0aWN1bGFyIHByb2dyYW1taW5nIGxhbmd1YWdlLCBvbmUgdGhhdAppcyB3aWRlbHkgdXNlZCBhbW9uZyBkZXZlbG9wZXJzIHdvcmtpbmcgaW4gdGhhdCBsYW5ndWFnZS4KCiAgVGhlICJTeXN0ZW0gTGlicmFyaWVzIiBvZiBhbiBleGVjdXRhYmxlIHdvcmsgaW5jbHVkZSBhbnl0aGluZywgb3RoZXIKdGhhbiB0aGUgd29yayBhcyBhIHdob2xlLCB0aGF0IChhKSBpcyBpbmNsdWRlZCBpbiB0aGUgbm9ybWFsIGZvcm0gb2YKcGFja2FnaW5nIGEgTWFqb3IgQ29tcG9uZW50LCBidXQgd2hpY2ggaXMgbm90IHBhcnQgb2YgdGhhdCBNYWpvcgpDb21wb25lbnQsIGFuZCAoYikgc2VydmVzIG9ubHkgdG8gZW5hYmxlIHVzZSBvZiB0aGUgd29yayB3aXRoIHRoYXQKTWFqb3IgQ29tcG9uZW50LCBvciB0byBpbXBsZW1lbnQgYSBTdGFuZGFyZCBJbnRlcmZhY2UgZm9yIHdoaWNoIGFuCmltcGxlbWVudGF0aW9uIGlzIGF2YWlsYWJsZSB0byB0aGUgcHVibGljIGluIHNvdXJjZSBjb2RlIGZvcm0uICBBCiJNYWpvciBDb21wb25lbnQiLCBpbiB0aGlzIGNvbnRleHQsIG1lYW5zIGEgbWFqb3IgZXNzZW50aWFsIGNvbXBvbmVudAooa2VybmVsLCB3aW5kb3cgc3lzdGVtLCBhbmQgc28gb24pIG9mIHRoZSBzcGVjaWZpYyBvcGVyYXRpbmcgc3lzdGVtCihpZiBhbnkpIG9uIHdoaWNoIHRoZSBleGVjdXRhYmxlIHdvcmsgcnVucywgb3IgYSBjb21waWxlciB1c2VkIHRvCnByb2R1Y2UgdGhlIHdvcmssIG9yIGFuIG9iamVjdCBjb2RlIGludGVycHJldGVyIHVzZWQgdG8gcnVuIGl0LgoKICBUaGUgIkNvcnJlc3BvbmRpbmcgU291cmNlIiBmb3IgYSB3b3JrIGluIG9iamVjdCBjb2RlIGZvcm0gbWVhbnMgYWxsCnRoZSBzb3VyY2UgY29kZSBuZWVkZWQgdG8gZ2VuZXJhdGUsIGluc3RhbGwsIGFuZCAoZm9yIGFuIGV4ZWN1dGFibGUKd29yaykgcnVuIHRoZSBvYmplY3QgY29kZSBhbmQgdG8gbW9kaWZ5IHRoZSB3b3JrLCBpbmNsdWRpbmcgc2NyaXB0cyB0bwpjb250cm9sIHRob3NlIGFjdGl2aXRpZXMuICBIb3dldmVyLCBpdCBkb2VzIG5vdCBpbmNsdWRlIHRoZSB3b3JrJ3MKU3lzdGVtIExpYnJhcmllcywgb3IgZ2VuZXJhbC1wdXJwb3NlIHRvb2xzIG9yIGdlbmVyYWxseSBhdmFpbGFibGUgZnJlZQpwcm9ncmFtcyB3aGljaCBhcmUgdXNlZCB1bm1vZGlmaWVkIGluIHBlcmZvcm1pbmcgdGhvc2UgYWN0aXZpdGllcyBidXQKd2hpY2ggYXJlIG5vdCBwYXJ0IG9mIHRoZSB3b3JrLiAgRm9yIGV4YW1wbGUsIENvcnJlc3BvbmRpbmcgU291cmNlCmluY2x1ZGVzIGludGVyZmFjZSBkZWZpbml0aW9uIGZpbGVzIGFzc29jaWF0ZWQgd2l0aCBzb3VyY2UgZmlsZXMgZm9yCnRoZSB3b3JrLCBhbmQgdGhlIHNvdXJjZSBjb2RlIGZvciBzaGFyZWQgbGlicmFyaWVzIGFuZCBkeW5hbWljYWxseQpsaW5rZWQgc3VicHJvZ3JhbXMgdGhhdCB0aGUgd29yayBpcyBzcGVjaWZpY2FsbHkgZGVzaWduZWQgdG8gcmVxdWlyZSwKc3VjaCBhcyBieSBpbnRpbWF0ZSBkYXRhIGNvbW11bmljYXRpb24gb3IgY29udHJvbCBmbG93IGJldHdlZW4gdGhvc2UKc3VicHJvZ3JhbXMgYW5kIG90aGVyIHBhcnRzIG9mIHRoZSB3b3JrLgoKICBUaGUgQ29ycmVzcG9uZGluZyBTb3VyY2UgbmVlZCBub3QgaW5jbHVkZSBhbnl0aGluZyB0aGF0IHVzZXJzCmNhbiByZWdlbmVyYXRlIGF1dG9tYXRpY2FsbHkgZnJvbSBvdGhlciBwYXJ0cyBvZiB0aGUgQ29ycmVzcG9uZGluZwpTb3VyY2UuCgogIFRoZSBDb3JyZXNwb25kaW5nIFNvdXJjZSBmb3IgYSB3b3JrIGluIHNvdXJjZSBjb2RlIGZvcm0gaXMgdGhhdApzYW1lIHdvcmsuCgogIDIuIEJhc2ljIFBlcm1pc3Npb25zLgoKICBBbGwgcmlnaHRzIGdyYW50ZWQgdW5kZXIgdGhpcyBMaWNlbnNlIGFyZSBncmFudGVkIGZvciB0aGUgdGVybSBvZgpjb3B5cmlnaHQgb24gdGhlIFByb2dyYW0sIGFuZCBhcmUgaXJyZXZvY2FibGUgcHJvdmlkZWQgdGhlIHN0YXRlZApjb25kaXRpb25zIGFyZSBtZXQuICBUaGlzIExpY2Vuc2UgZXhwbGljaXRseSBhZmZpcm1zIHlvdXIgdW5saW1pdGVkCnBlcm1pc3Npb24gdG8gcnVuIHRoZSB1bm1vZGlmaWVkIFByb2dyYW0uICBUaGUgb3V0cHV0IGZyb20gcnVubmluZyBhCmNvdmVyZWQgd29yayBpcyBjb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZSBvbmx5IGlmIHRoZSBvdXRwdXQsIGdpdmVuIGl0cwpjb250ZW50LCBjb25zdGl0dXRlcyBhIGNvdmVyZWQgd29yay4gIFRoaXMgTGljZW5zZSBhY2tub3dsZWRnZXMgeW91cgpyaWdodHMgb2YgZmFpciB1c2Ugb3Igb3RoZXIgZXF1aXZhbGVudCwgYXMgcHJvdmlkZWQgYnkgY29weXJpZ2h0IGxhdy4KCiAgWW91IG1heSBtYWtlLCBydW4gYW5kIHByb3BhZ2F0ZSBjb3ZlcmVkIHdvcmtzIHRoYXQgeW91IGRvIG5vdApjb252ZXksIHdpdGhvdXQgY29uZGl0aW9ucyBzbyBsb25nIGFzIHlvdXIgbGljZW5zZSBvdGhlcndpc2UgcmVtYWlucwppbiBmb3JjZS4gIFlvdSBtYXkgY29udmV5IGNvdmVyZWQgd29ya3MgdG8gb3RoZXJzIGZvciB0aGUgc29sZSBwdXJwb3NlCm9mIGhhdmluZyB0aGVtIG1ha2UgbW9kaWZpY2F0aW9ucyBleGNsdXNpdmVseSBmb3IgeW91LCBvciBwcm92aWRlIHlvdQp3aXRoIGZhY2lsaXRpZXMgZm9yIHJ1bm5pbmcgdGhvc2Ugd29ya3MsIHByb3ZpZGVkIHRoYXQgeW91IGNvbXBseSB3aXRoCnRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UgaW4gY29udmV5aW5nIGFsbCBtYXRlcmlhbCBmb3Igd2hpY2ggeW91IGRvCm5vdCBjb250cm9sIGNvcHlyaWdodC4gIFRob3NlIHRodXMgbWFraW5nIG9yIHJ1bm5pbmcgdGhlIGNvdmVyZWQgd29ya3MKZm9yIHlvdSBtdXN0IGRvIHNvIGV4Y2x1c2l2ZWx5IG9uIHlvdXIgYmVoYWxmLCB1bmRlciB5b3VyIGRpcmVjdGlvbgphbmQgY29udHJvbCwgb24gdGVybXMgdGhhdCBwcm9oaWJpdCB0aGVtIGZyb20gbWFraW5nIGFueSBjb3BpZXMgb2YKeW91ciBjb3B5cmlnaHRlZCBtYXRlcmlhbCBvdXRzaWRlIHRoZWlyIHJlbGF0aW9uc2hpcCB3aXRoIHlvdS4KCiAgQ29udmV5aW5nIHVuZGVyIGFueSBvdGhlciBjaXJjdW1zdGFuY2VzIGlzIHBlcm1pdHRlZCBzb2xlbHkgdW5kZXIKdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGJlbG93LiAgU3VibGljZW5zaW5nIGlzIG5vdCBhbGxvd2VkOyBzZWN0aW9uIDEwCm1ha2VzIGl0IHVubmVjZXNzYXJ5LgoKICAzLiBQcm90ZWN0aW5nIFVzZXJzJyBMZWdhbCBSaWdodHMgRnJvbSBBbnRpLUNpcmN1bXZlbnRpb24gTGF3LgoKICBObyBjb3ZlcmVkIHdvcmsgc2hhbGwgYmUgZGVlbWVkIHBhcnQgb2YgYW4gZWZmZWN0aXZlIHRlY2hub2xvZ2ljYWwKbWVhc3VyZSB1bmRlciBhbnkgYXBwbGljYWJsZSBsYXcgZnVsZmlsbGluZyBvYmxpZ2F0aW9ucyB1bmRlciBhcnRpY2xlCjExIG9mIHRoZSBXSVBPIGNvcHlyaWdodCB0cmVhdHkgYWRvcHRlZCBvbiAyMCBEZWNlbWJlciAxOTk2LCBvcgpzaW1pbGFyIGxhd3MgcHJvaGliaXRpbmcgb3IgcmVzdHJpY3RpbmcgY2lyY3VtdmVudGlvbiBvZiBzdWNoCm1lYXN1cmVzLgoKICBXaGVuIHlvdSBjb252ZXkgYSBjb3ZlcmVkIHdvcmssIHlvdSB3YWl2ZSBhbnkgbGVnYWwgcG93ZXIgdG8gZm9yYmlkCmNpcmN1bXZlbnRpb24gb2YgdGVjaG5vbG9naWNhbCBtZWFzdXJlcyB0byB0aGUgZXh0ZW50IHN1Y2ggY2lyY3VtdmVudGlvbgppcyBlZmZlY3RlZCBieSBleGVyY2lzaW5nIHJpZ2h0cyB1bmRlciB0aGlzIExpY2Vuc2Ugd2l0aCByZXNwZWN0IHRvCnRoZSBjb3ZlcmVkIHdvcmssIGFuZCB5b3UgZGlzY2xhaW0gYW55IGludGVudGlvbiB0byBsaW1pdCBvcGVyYXRpb24gb3IKbW9kaWZpY2F0aW9uIG9mIHRoZSB3b3JrIGFzIGEgbWVhbnMgb2YgZW5mb3JjaW5nLCBhZ2FpbnN0IHRoZSB3b3JrJ3MKdXNlcnMsIHlvdXIgb3IgdGhpcmQgcGFydGllcycgbGVnYWwgcmlnaHRzIHRvIGZvcmJpZCBjaXJjdW12ZW50aW9uIG9mCnRlY2hub2xvZ2ljYWwgbWVhc3VyZXMuCgogIDQuIENvbnZleWluZyBWZXJiYXRpbSBDb3BpZXMuCgogIFlvdSBtYXkgY29udmV5IHZlcmJhdGltIGNvcGllcyBvZiB0aGUgUHJvZ3JhbSdzIHNvdXJjZSBjb2RlIGFzIHlvdQpyZWNlaXZlIGl0LCBpbiBhbnkgbWVkaXVtLCBwcm92aWRlZCB0aGF0IHlvdSBjb25zcGljdW91c2x5IGFuZAphcHByb3ByaWF0ZWx5IHB1Ymxpc2ggb24gZWFjaCBjb3B5IGFuIGFwcHJvcHJpYXRlIGNvcHlyaWdodCBub3RpY2U7CmtlZXAgaW50YWN0IGFsbCBub3RpY2VzIHN0YXRpbmcgdGhhdCB0aGlzIExpY2Vuc2UgYW5kIGFueQpub24tcGVybWlzc2l2ZSB0ZXJtcyBhZGRlZCBpbiBhY2NvcmQgd2l0aCBzZWN0aW9uIDcgYXBwbHkgdG8gdGhlIGNvZGU7CmtlZXAgaW50YWN0IGFsbCBub3RpY2VzIG9mIHRoZSBhYnNlbmNlIG9mIGFueSB3YXJyYW50eTsgYW5kIGdpdmUgYWxsCnJlY2lwaWVudHMgYSBjb3B5IG9mIHRoaXMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBQcm9ncmFtLgoKICBZb3UgbWF5IGNoYXJnZSBhbnkgcHJpY2Ugb3Igbm8gcHJpY2UgZm9yIGVhY2ggY29weSB0aGF0IHlvdSBjb252ZXksCmFuZCB5b3UgbWF5IG9mZmVyIHN1cHBvcnQgb3Igd2FycmFudHkgcHJvdGVjdGlvbiBmb3IgYSBmZWUuCgogIDUuIENvbnZleWluZyBNb2RpZmllZCBTb3VyY2UgVmVyc2lvbnMuCgogIFlvdSBtYXkgY29udmV5IGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSwgb3IgdGhlIG1vZGlmaWNhdGlvbnMgdG8KcHJvZHVjZSBpdCBmcm9tIHRoZSBQcm9ncmFtLCBpbiB0aGUgZm9ybSBvZiBzb3VyY2UgY29kZSB1bmRlciB0aGUKdGVybXMgb2Ygc2VjdGlvbiA0LCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQgYWxsIG9mIHRoZXNlIGNvbmRpdGlvbnM6CgogICAgYSkgVGhlIHdvcmsgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IG1vZGlmaWVkCiAgICBpdCwgYW5kIGdpdmluZyBhIHJlbGV2YW50IGRhdGUuCgogICAgYikgVGhlIHdvcmsgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgaXQgaXMKICAgIHJlbGVhc2VkIHVuZGVyIHRoaXMgTGljZW5zZSBhbmQgYW55IGNvbmRpdGlvbnMgYWRkZWQgdW5kZXIgc2VjdGlvbgogICAgNy4gIFRoaXMgcmVxdWlyZW1lbnQgbW9kaWZpZXMgdGhlIHJlcXVpcmVtZW50IGluIHNlY3Rpb24gNCB0bwogICAgImtlZXAgaW50YWN0IGFsbCBub3RpY2VzIi4KCiAgICBjKSBZb3UgbXVzdCBsaWNlbnNlIHRoZSBlbnRpcmUgd29yaywgYXMgYSB3aG9sZSwgdW5kZXIgdGhpcwogICAgTGljZW5zZSB0byBhbnlvbmUgd2hvIGNvbWVzIGludG8gcG9zc2Vzc2lvbiBvZiBhIGNvcHkuICBUaGlzCiAgICBMaWNlbnNlIHdpbGwgdGhlcmVmb3JlIGFwcGx5LCBhbG9uZyB3aXRoIGFueSBhcHBsaWNhYmxlIHNlY3Rpb24gNwogICAgYWRkaXRpb25hbCB0ZXJtcywgdG8gdGhlIHdob2xlIG9mIHRoZSB3b3JrLCBhbmQgYWxsIGl0cyBwYXJ0cywKICAgIHJlZ2FyZGxlc3Mgb2YgaG93IHRoZXkgYXJlIHBhY2thZ2VkLiAgVGhpcyBMaWNlbnNlIGdpdmVzIG5vCiAgICBwZXJtaXNzaW9uIHRvIGxpY2Vuc2UgdGhlIHdvcmsgaW4gYW55IG90aGVyIHdheSwgYnV0IGl0IGRvZXMgbm90CiAgICBpbnZhbGlkYXRlIHN1Y2ggcGVybWlzc2lvbiBpZiB5b3UgaGF2ZSBzZXBhcmF0ZWx5IHJlY2VpdmVkIGl0LgoKICAgIGQpIElmIHRoZSB3b3JrIGhhcyBpbnRlcmFjdGl2ZSB1c2VyIGludGVyZmFjZXMsIGVhY2ggbXVzdCBkaXNwbGF5CiAgICBBcHByb3ByaWF0ZSBMZWdhbCBOb3RpY2VzOyBob3dldmVyLCBpZiB0aGUgUHJvZ3JhbSBoYXMgaW50ZXJhY3RpdmUKICAgIGludGVyZmFjZXMgdGhhdCBkbyBub3QgZGlzcGxheSBBcHByb3ByaWF0ZSBMZWdhbCBOb3RpY2VzLCB5b3VyCiAgICB3b3JrIG5lZWQgbm90IG1ha2UgdGhlbSBkbyBzby4KCiAgQSBjb21waWxhdGlvbiBvZiBhIGNvdmVyZWQgd29yayB3aXRoIG90aGVyIHNlcGFyYXRlIGFuZCBpbmRlcGVuZGVudAp3b3Jrcywgd2hpY2ggYXJlIG5vdCBieSB0aGVpciBuYXR1cmUgZXh0ZW5zaW9ucyBvZiB0aGUgY292ZXJlZCB3b3JrLAphbmQgd2hpY2ggYXJlIG5vdCBjb21iaW5lZCB3aXRoIGl0IHN1Y2ggYXMgdG8gZm9ybSBhIGxhcmdlciBwcm9ncmFtLAppbiBvciBvbiBhIHZvbHVtZSBvZiBhIHN0b3JhZ2Ugb3IgZGlzdHJpYnV0aW9uIG1lZGl1bSwgaXMgY2FsbGVkIGFuCiJhZ2dyZWdhdGUiIGlmIHRoZSBjb21waWxhdGlvbiBhbmQgaXRzIHJlc3VsdGluZyBjb3B5cmlnaHQgYXJlIG5vdAp1c2VkIHRvIGxpbWl0IHRoZSBhY2Nlc3Mgb3IgbGVnYWwgcmlnaHRzIG9mIHRoZSBjb21waWxhdGlvbidzIHVzZXJzCmJleW9uZCB3aGF0IHRoZSBpbmRpdmlkdWFsIHdvcmtzIHBlcm1pdC4gIEluY2x1c2lvbiBvZiBhIGNvdmVyZWQgd29yawppbiBhbiBhZ2dyZWdhdGUgZG9lcyBub3QgY2F1c2UgdGhpcyBMaWNlbnNlIHRvIGFwcGx5IHRvIHRoZSBvdGhlcgpwYXJ0cyBvZiB0aGUgYWdncmVnYXRlLgoKICA2LiBDb252ZXlpbmcgTm9uLVNvdXJjZSBGb3Jtcy4KCiAgWW91IG1heSBjb252ZXkgYSBjb3ZlcmVkIHdvcmsgaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciB0aGUgdGVybXMKb2Ygc2VjdGlvbnMgNCBhbmQgNSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBjb252ZXkgdGhlCm1hY2hpbmUtcmVhZGFibGUgQ29ycmVzcG9uZGluZyBTb3VyY2UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZSwKaW4gb25lIG9mIHRoZXNlIHdheXM6CgogICAgYSkgQ29udmV5IHRoZSBvYmplY3QgY29kZSBpbiwgb3IgZW1ib2RpZWQgaW4sIGEgcGh5c2ljYWwgcHJvZHVjdAogICAgKGluY2x1ZGluZyBhIHBoeXNpY2FsIGRpc3RyaWJ1dGlvbiBtZWRpdW0pLCBhY2NvbXBhbmllZCBieSB0aGUKICAgIENvcnJlc3BvbmRpbmcgU291cmNlIGZpeGVkIG9uIGEgZHVyYWJsZSBwaHlzaWNhbCBtZWRpdW0KICAgIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlLgoKICAgIGIpIENvbnZleSB0aGUgb2JqZWN0IGNvZGUgaW4sIG9yIGVtYm9kaWVkIGluLCBhIHBoeXNpY2FsIHByb2R1Y3QKICAgIChpbmNsdWRpbmcgYSBwaHlzaWNhbCBkaXN0cmlidXRpb24gbWVkaXVtKSwgYWNjb21wYW5pZWQgYnkgYQogICAgd3JpdHRlbiBvZmZlciwgdmFsaWQgZm9yIGF0IGxlYXN0IHRocmVlIHllYXJzIGFuZCB2YWxpZCBmb3IgYXMKICAgIGxvbmcgYXMgeW91IG9mZmVyIHNwYXJlIHBhcnRzIG9yIGN1c3RvbWVyIHN1cHBvcnQgZm9yIHRoYXQgcHJvZHVjdAogICAgbW9kZWwsIHRvIGdpdmUgYW55b25lIHdobyBwb3NzZXNzZXMgdGhlIG9iamVjdCBjb2RlIGVpdGhlciAoMSkgYQogICAgY29weSBvZiB0aGUgQ29ycmVzcG9uZGluZyBTb3VyY2UgZm9yIGFsbCB0aGUgc29mdHdhcmUgaW4gdGhlCiAgICBwcm9kdWN0IHRoYXQgaXMgY292ZXJlZCBieSB0aGlzIExpY2Vuc2UsIG9uIGEgZHVyYWJsZSBwaHlzaWNhbAogICAgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlLCBmb3IgYSBwcmljZSBubwogICAgbW9yZSB0aGFuIHlvdXIgcmVhc29uYWJsZSBjb3N0IG9mIHBoeXNpY2FsbHkgcGVyZm9ybWluZyB0aGlzCiAgICBjb252ZXlpbmcgb2Ygc291cmNlLCBvciAoMikgYWNjZXNzIHRvIGNvcHkgdGhlCiAgICBDb3JyZXNwb25kaW5nIFNvdXJjZSBmcm9tIGEgbmV0d29yayBzZXJ2ZXIgYXQgbm8gY2hhcmdlLgoKICAgIGMpIENvbnZleSBpbmRpdmlkdWFsIGNvcGllcyBvZiB0aGUgb2JqZWN0IGNvZGUgd2l0aCBhIGNvcHkgb2YgdGhlCiAgICB3cml0dGVuIG9mZmVyIHRvIHByb3ZpZGUgdGhlIENvcnJlc3BvbmRpbmcgU291cmNlLiAgVGhpcwogICAgYWx0ZXJuYXRpdmUgaXMgYWxsb3dlZCBvbmx5IG9jY2FzaW9uYWxseSBhbmQgbm9uY29tbWVyY2lhbGx5LCBhbmQKICAgIG9ubHkgaWYgeW91IHJlY2VpdmVkIHRoZSBvYmplY3QgY29kZSB3aXRoIHN1Y2ggYW4gb2ZmZXIsIGluIGFjY29yZAogICAgd2l0aCBzdWJzZWN0aW9uIDZiLgoKICAgIGQpIENvbnZleSB0aGUgb2JqZWN0IGNvZGUgYnkgb2ZmZXJpbmcgYWNjZXNzIGZyb20gYSBkZXNpZ25hdGVkCiAgICBwbGFjZSAoZ3JhdGlzIG9yIGZvciBhIGNoYXJnZSksIGFuZCBvZmZlciBlcXVpdmFsZW50IGFjY2VzcyB0byB0aGUKICAgIENvcnJlc3BvbmRpbmcgU291cmNlIGluIHRoZSBzYW1lIHdheSB0aHJvdWdoIHRoZSBzYW1lIHBsYWNlIGF0IG5vCiAgICBmdXJ0aGVyIGNoYXJnZS4gIFlvdSBuZWVkIG5vdCByZXF1aXJlIHJlY2lwaWVudHMgdG8gY29weSB0aGUKICAgIENvcnJlc3BvbmRpbmcgU291cmNlIGFsb25nIHdpdGggdGhlIG9iamVjdCBjb2RlLiAgSWYgdGhlIHBsYWNlIHRvCiAgICBjb3B5IHRoZSBvYmplY3QgY29kZSBpcyBhIG5ldHdvcmsgc2VydmVyLCB0aGUgQ29ycmVzcG9uZGluZyBTb3VyY2UKICAgIG1heSBiZSBvbiBhIGRpZmZlcmVudCBzZXJ2ZXIgKG9wZXJhdGVkIGJ5IHlvdSBvciBhIHRoaXJkIHBhcnR5KQogICAgdGhhdCBzdXBwb3J0cyBlcXVpdmFsZW50IGNvcHlpbmcgZmFjaWxpdGllcywgcHJvdmlkZWQgeW91IG1haW50YWluCiAgICBjbGVhciBkaXJlY3Rpb25zIG5leHQgdG8gdGhlIG9iamVjdCBjb2RlIHNheWluZyB3aGVyZSB0byBmaW5kIHRoZQogICAgQ29ycmVzcG9uZGluZyBTb3VyY2UuICBSZWdhcmRsZXNzIG9mIHdoYXQgc2VydmVyIGhvc3RzIHRoZQogICAgQ29ycmVzcG9uZGluZyBTb3VyY2UsIHlvdSByZW1haW4gb2JsaWdhdGVkIHRvIGVuc3VyZSB0aGF0IGl0IGlzCiAgICBhdmFpbGFibGUgZm9yIGFzIGxvbmcgYXMgbmVlZGVkIHRvIHNhdGlzZnkgdGhlc2UgcmVxdWlyZW1lbnRzLgoKICAgIGUpIENvbnZleSB0aGUgb2JqZWN0IGNvZGUgdXNpbmcgcGVlci10by1wZWVyIHRyYW5zbWlzc2lvbiwgcHJvdmlkZWQKICAgIHlvdSBpbmZvcm0gb3RoZXIgcGVlcnMgd2hlcmUgdGhlIG9iamVjdCBjb2RlIGFuZCBDb3JyZXNwb25kaW5nCiAgICBTb3VyY2Ugb2YgdGhlIHdvcmsgYXJlIGJlaW5nIG9mZmVyZWQgdG8gdGhlIGdlbmVyYWwgcHVibGljIGF0IG5vCiAgICBjaGFyZ2UgdW5kZXIgc3Vic2VjdGlvbiA2ZC4KCiAgQSBzZXBhcmFibGUgcG9ydGlvbiBvZiB0aGUgb2JqZWN0IGNvZGUsIHdob3NlIHNvdXJjZSBjb2RlIGlzIGV4Y2x1ZGVkCmZyb20gdGhlIENvcnJlc3BvbmRpbmcgU291cmNlIGFzIGEgU3lzdGVtIExpYnJhcnksIG5lZWQgbm90IGJlCmluY2x1ZGVkIGluIGNvbnZleWluZyB0aGUgb2JqZWN0IGNvZGUgd29yay4KCiAgQSAiVXNlciBQcm9kdWN0IiBpcyBlaXRoZXIgKDEpIGEgImNvbnN1bWVyIHByb2R1Y3QiLCB3aGljaCBtZWFucyBhbnkKdGFuZ2libGUgcGVyc29uYWwgcHJvcGVydHkgd2hpY2ggaXMgbm9ybWFsbHkgdXNlZCBmb3IgcGVyc29uYWwsIGZhbWlseSwKb3IgaG91c2Vob2xkIHB1cnBvc2VzLCBvciAoMikgYW55dGhpbmcgZGVzaWduZWQgb3Igc29sZCBmb3IgaW5jb3Jwb3JhdGlvbgppbnRvIGEgZHdlbGxpbmcuICBJbiBkZXRlcm1pbmluZyB3aGV0aGVyIGEgcHJvZHVjdCBpcyBhIGNvbnN1bWVyIHByb2R1Y3QsCmRvdWJ0ZnVsIGNhc2VzIHNoYWxsIGJlIHJlc29sdmVkIGluIGZhdm9yIG9mIGNvdmVyYWdlLiAgRm9yIGEgcGFydGljdWxhcgpwcm9kdWN0IHJlY2VpdmVkIGJ5IGEgcGFydGljdWxhciB1c2VyLCAibm9ybWFsbHkgdXNlZCIgcmVmZXJzIHRvIGEKdHlwaWNhbCBvciBjb21tb24gdXNlIG9mIHRoYXQgY2xhc3Mgb2YgcHJvZHVjdCwgcmVnYXJkbGVzcyBvZiB0aGUgc3RhdHVzCm9mIHRoZSBwYXJ0aWN1bGFyIHVzZXIgb3Igb2YgdGhlIHdheSBpbiB3aGljaCB0aGUgcGFydGljdWxhciB1c2VyCmFjdHVhbGx5IHVzZXMsIG9yIGV4cGVjdHMgb3IgaXMgZXhwZWN0ZWQgdG8gdXNlLCB0aGUgcHJvZHVjdC4gIEEgcHJvZHVjdAppcyBhIGNvbnN1bWVyIHByb2R1Y3QgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBwcm9kdWN0IGhhcyBzdWJzdGFudGlhbApjb21tZXJjaWFsLCBpbmR1c3RyaWFsIG9yIG5vbi1jb25zdW1lciB1c2VzLCB1bmxlc3Mgc3VjaCB1c2VzIHJlcHJlc2VudAp0aGUgb25seSBzaWduaWZpY2FudCBtb2RlIG9mIHVzZSBvZiB0aGUgcHJvZHVjdC4KCiAgIkluc3RhbGxhdGlvbiBJbmZvcm1hdGlvbiIgZm9yIGEgVXNlciBQcm9kdWN0IG1lYW5zIGFueSBtZXRob2RzLApwcm9jZWR1cmVzLCBhdXRob3JpemF0aW9uIGtleXMsIG9yIG90aGVyIGluZm9ybWF0aW9uIHJlcXVpcmVkIHRvIGluc3RhbGwKYW5kIGV4ZWN1dGUgbW9kaWZpZWQgdmVyc2lvbnMgb2YgYSBjb3ZlcmVkIHdvcmsgaW4gdGhhdCBVc2VyIFByb2R1Y3QgZnJvbQphIG1vZGlmaWVkIHZlcnNpb24gb2YgaXRzIENvcnJlc3BvbmRpbmcgU291cmNlLiAgVGhlIGluZm9ybWF0aW9uIG11c3QKc3VmZmljZSB0byBlbnN1cmUgdGhhdCB0aGUgY29udGludWVkIGZ1bmN0aW9uaW5nIG9mIHRoZSBtb2RpZmllZCBvYmplY3QKY29kZSBpcyBpbiBubyBjYXNlIHByZXZlbnRlZCBvciBpbnRlcmZlcmVkIHdpdGggc29sZWx5IGJlY2F1c2UKbW9kaWZpY2F0aW9uIGhhcyBiZWVuIG1hZGUuCgogIElmIHlvdSBjb252ZXkgYW4gb2JqZWN0IGNvZGUgd29yayB1bmRlciB0aGlzIHNlY3Rpb24gaW4sIG9yIHdpdGgsIG9yCnNwZWNpZmljYWxseSBmb3IgdXNlIGluLCBhIFVzZXIgUHJvZHVjdCwgYW5kIHRoZSBjb252ZXlpbmcgb2NjdXJzIGFzCnBhcnQgb2YgYSB0cmFuc2FjdGlvbiBpbiB3aGljaCB0aGUgcmlnaHQgb2YgcG9zc2Vzc2lvbiBhbmQgdXNlIG9mIHRoZQpVc2VyIFByb2R1Y3QgaXMgdHJhbnNmZXJyZWQgdG8gdGhlIHJlY2lwaWVudCBpbiBwZXJwZXR1aXR5IG9yIGZvciBhCmZpeGVkIHRlcm0gKHJlZ2FyZGxlc3Mgb2YgaG93IHRoZSB0cmFuc2FjdGlvbiBpcyBjaGFyYWN0ZXJpemVkKSwgdGhlCkNvcnJlc3BvbmRpbmcgU291cmNlIGNvbnZleWVkIHVuZGVyIHRoaXMgc2VjdGlvbiBtdXN0IGJlIGFjY29tcGFuaWVkCmJ5IHRoZSBJbnN0YWxsYXRpb24gSW5mb3JtYXRpb24uICBCdXQgdGhpcyByZXF1aXJlbWVudCBkb2VzIG5vdCBhcHBseQppZiBuZWl0aGVyIHlvdSBub3IgYW55IHRoaXJkIHBhcnR5IHJldGFpbnMgdGhlIGFiaWxpdHkgdG8gaW5zdGFsbAptb2RpZmllZCBvYmplY3QgY29kZSBvbiB0aGUgVXNlciBQcm9kdWN0IChmb3IgZXhhbXBsZSwgdGhlIHdvcmsgaGFzCmJlZW4gaW5zdGFsbGVkIGluIFJPTSkuCgogIFRoZSByZXF1aXJlbWVudCB0byBwcm92aWRlIEluc3RhbGxhdGlvbiBJbmZvcm1hdGlvbiBkb2VzIG5vdCBpbmNsdWRlIGEKcmVxdWlyZW1lbnQgdG8gY29udGludWUgdG8gcHJvdmlkZSBzdXBwb3J0IHNlcnZpY2UsIHdhcnJhbnR5LCBvciB1cGRhdGVzCmZvciBhIHdvcmsgdGhhdCBoYXMgYmVlbiBtb2RpZmllZCBvciBpbnN0YWxsZWQgYnkgdGhlIHJlY2lwaWVudCwgb3IgZm9yCnRoZSBVc2VyIFByb2R1Y3QgaW4gd2hpY2ggaXQgaGFzIGJlZW4gbW9kaWZpZWQgb3IgaW5zdGFsbGVkLiAgQWNjZXNzIHRvIGEKbmV0d29yayBtYXkgYmUgZGVuaWVkIHdoZW4gdGhlIG1vZGlmaWNhdGlvbiBpdHNlbGYgbWF0ZXJpYWxseSBhbmQKYWR2ZXJzZWx5IGFmZmVjdHMgdGhlIG9wZXJhdGlvbiBvZiB0aGUgbmV0d29yayBvciB2aW9sYXRlcyB0aGUgcnVsZXMgYW5kCnByb3RvY29scyBmb3IgY29tbXVuaWNhdGlvbiBhY3Jvc3MgdGhlIG5ldHdvcmsuCgogIENvcnJlc3BvbmRpbmcgU291cmNlIGNvbnZleWVkLCBhbmQgSW5zdGFsbGF0aW9uIEluZm9ybWF0aW9uIHByb3ZpZGVkLAppbiBhY2NvcmQgd2l0aCB0aGlzIHNlY3Rpb24gbXVzdCBiZSBpbiBhIGZvcm1hdCB0aGF0IGlzIHB1YmxpY2x5CmRvY3VtZW50ZWQgKGFuZCB3aXRoIGFuIGltcGxlbWVudGF0aW9uIGF2YWlsYWJsZSB0byB0aGUgcHVibGljIGluCnNvdXJjZSBjb2RlIGZvcm0pLCBhbmQgbXVzdCByZXF1aXJlIG5vIHNwZWNpYWwgcGFzc3dvcmQgb3Iga2V5IGZvcgp1bnBhY2tpbmcsIHJlYWRpbmcgb3IgY29weWluZy4KCiAgNy4gQWRkaXRpb25hbCBUZXJtcy4KCiAgIkFkZGl0aW9uYWwgcGVybWlzc2lvbnMiIGFyZSB0ZXJtcyB0aGF0IHN1cHBsZW1lbnQgdGhlIHRlcm1zIG9mIHRoaXMKTGljZW5zZSBieSBtYWtpbmcgZXhjZXB0aW9ucyBmcm9tIG9uZSBvciBtb3JlIG9mIGl0cyBjb25kaXRpb25zLgpBZGRpdGlvbmFsIHBlcm1pc3Npb25zIHRoYXQgYXJlIGFwcGxpY2FibGUgdG8gdGhlIGVudGlyZSBQcm9ncmFtIHNoYWxsCmJlIHRyZWF0ZWQgYXMgdGhvdWdoIHRoZXkgd2VyZSBpbmNsdWRlZCBpbiB0aGlzIExpY2Vuc2UsIHRvIHRoZSBleHRlbnQKdGhhdCB0aGV5IGFyZSB2YWxpZCB1bmRlciBhcHBsaWNhYmxlIGxhdy4gIElmIGFkZGl0aW9uYWwgcGVybWlzc2lvbnMKYXBwbHkgb25seSB0byBwYXJ0IG9mIHRoZSBQcm9ncmFtLCB0aGF0IHBhcnQgbWF5IGJlIHVzZWQgc2VwYXJhdGVseQp1bmRlciB0aG9zZSBwZXJtaXNzaW9ucywgYnV0IHRoZSBlbnRpcmUgUHJvZ3JhbSByZW1haW5zIGdvdmVybmVkIGJ5CnRoaXMgTGljZW5zZSB3aXRob3V0IHJlZ2FyZCB0byB0aGUgYWRkaXRpb25hbCBwZXJtaXNzaW9ucy4KCiAgV2hlbiB5b3UgY29udmV5IGEgY29weSBvZiBhIGNvdmVyZWQgd29yaywgeW91IG1heSBhdCB5b3VyIG9wdGlvbgpyZW1vdmUgYW55IGFkZGl0aW9uYWwgcGVybWlzc2lvbnMgZnJvbSB0aGF0IGNvcHksIG9yIGZyb20gYW55IHBhcnQgb2YKaXQuICAoQWRkaXRpb25hbCBwZXJtaXNzaW9ucyBtYXkgYmUgd3JpdHRlbiB0byByZXF1aXJlIHRoZWlyIG93bgpyZW1vdmFsIGluIGNlcnRhaW4gY2FzZXMgd2hlbiB5b3UgbW9kaWZ5IHRoZSB3b3JrLikgIFlvdSBtYXkgcGxhY2UKYWRkaXRpb25hbCBwZXJtaXNzaW9ucyBvbiBtYXRlcmlhbCwgYWRkZWQgYnkgeW91IHRvIGEgY292ZXJlZCB3b3JrLApmb3Igd2hpY2ggeW91IGhhdmUgb3IgY2FuIGdpdmUgYXBwcm9wcmlhdGUgY29weXJpZ2h0IHBlcm1pc3Npb24uCgogIE5vdHdpdGhzdGFuZGluZyBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSwgZm9yIG1hdGVyaWFsIHlvdQphZGQgdG8gYSBjb3ZlcmVkIHdvcmssIHlvdSBtYXkgKGlmIGF1dGhvcml6ZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mCnRoYXQgbWF0ZXJpYWwpIHN1cHBsZW1lbnQgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZSB3aXRoIHRlcm1zOgoKICAgIGEpIERpc2NsYWltaW5nIHdhcnJhbnR5IG9yIGxpbWl0aW5nIGxpYWJpbGl0eSBkaWZmZXJlbnRseSBmcm9tIHRoZQogICAgdGVybXMgb2Ygc2VjdGlvbnMgMTUgYW5kIDE2IG9mIHRoaXMgTGljZW5zZTsgb3IKCiAgICBiKSBSZXF1aXJpbmcgcHJlc2VydmF0aW9uIG9mIHNwZWNpZmllZCByZWFzb25hYmxlIGxlZ2FsIG5vdGljZXMgb3IKICAgIGF1dGhvciBhdHRyaWJ1dGlvbnMgaW4gdGhhdCBtYXRlcmlhbCBvciBpbiB0aGUgQXBwcm9wcmlhdGUgTGVnYWwKICAgIE5vdGljZXMgZGlzcGxheWVkIGJ5IHdvcmtzIGNvbnRhaW5pbmcgaXQ7IG9yCgogICAgYykgUHJvaGliaXRpbmcgbWlzcmVwcmVzZW50YXRpb24gb2YgdGhlIG9yaWdpbiBvZiB0aGF0IG1hdGVyaWFsLCBvcgogICAgcmVxdWlyaW5nIHRoYXQgbW9kaWZpZWQgdmVyc2lvbnMgb2Ygc3VjaCBtYXRlcmlhbCBiZSBtYXJrZWQgaW4KICAgIHJlYXNvbmFibGUgd2F5cyBhcyBkaWZmZXJlbnQgZnJvbSB0aGUgb3JpZ2luYWwgdmVyc2lvbjsgb3IKCiAgICBkKSBMaW1pdGluZyB0aGUgdXNlIGZvciBwdWJsaWNpdHkgcHVycG9zZXMgb2YgbmFtZXMgb2YgbGljZW5zb3JzIG9yCiAgICBhdXRob3JzIG9mIHRoZSBtYXRlcmlhbDsgb3IKCiAgICBlKSBEZWNsaW5pbmcgdG8gZ3JhbnQgcmlnaHRzIHVuZGVyIHRyYWRlbWFyayBsYXcgZm9yIHVzZSBvZiBzb21lCiAgICB0cmFkZSBuYW1lcywgdHJhZGVtYXJrcywgb3Igc2VydmljZSBtYXJrczsgb3IKCiAgICBmKSBSZXF1aXJpbmcgaW5kZW1uaWZpY2F0aW9uIG9mIGxpY2Vuc29ycyBhbmQgYXV0aG9ycyBvZiB0aGF0CiAgICBtYXRlcmlhbCBieSBhbnlvbmUgd2hvIGNvbnZleXMgdGhlIG1hdGVyaWFsIChvciBtb2RpZmllZCB2ZXJzaW9ucyBvZgogICAgaXQpIHdpdGggY29udHJhY3R1YWwgYXNzdW1wdGlvbnMgb2YgbGlhYmlsaXR5IHRvIHRoZSByZWNpcGllbnQsIGZvcgogICAgYW55IGxpYWJpbGl0eSB0aGF0IHRoZXNlIGNvbnRyYWN0dWFsIGFzc3VtcHRpb25zIGRpcmVjdGx5IGltcG9zZSBvbgogICAgdGhvc2UgbGljZW5zb3JzIGFuZCBhdXRob3JzLgoKICBBbGwgb3RoZXIgbm9uLXBlcm1pc3NpdmUgYWRkaXRpb25hbCB0ZXJtcyBhcmUgY29uc2lkZXJlZCAiZnVydGhlcgpyZXN0cmljdGlvbnMiIHdpdGhpbiB0aGUgbWVhbmluZyBvZiBzZWN0aW9uIDEwLiAgSWYgdGhlIFByb2dyYW0gYXMgeW91CnJlY2VpdmVkIGl0LCBvciBhbnkgcGFydCBvZiBpdCwgY29udGFpbnMgYSBub3RpY2Ugc3RhdGluZyB0aGF0IGl0IGlzCmdvdmVybmVkIGJ5IHRoaXMgTGljZW5zZSBhbG9uZyB3aXRoIGEgdGVybSB0aGF0IGlzIGEgZnVydGhlcgpyZXN0cmljdGlvbiwgeW91IG1heSByZW1vdmUgdGhhdCB0ZXJtLiAgSWYgYSBsaWNlbnNlIGRvY3VtZW50IGNvbnRhaW5zCmEgZnVydGhlciByZXN0cmljdGlvbiBidXQgcGVybWl0cyByZWxpY2Vuc2luZyBvciBjb252ZXlpbmcgdW5kZXIgdGhpcwpMaWNlbnNlLCB5b3UgbWF5IGFkZCB0byBhIGNvdmVyZWQgd29yayBtYXRlcmlhbCBnb3Zlcm5lZCBieSB0aGUgdGVybXMKb2YgdGhhdCBsaWNlbnNlIGRvY3VtZW50LCBwcm92aWRlZCB0aGF0IHRoZSBmdXJ0aGVyIHJlc3RyaWN0aW9uIGRvZXMKbm90IHN1cnZpdmUgc3VjaCByZWxpY2Vuc2luZyBvciBjb252ZXlpbmcuCgogIElmIHlvdSBhZGQgdGVybXMgdG8gYSBjb3ZlcmVkIHdvcmsgaW4gYWNjb3JkIHdpdGggdGhpcyBzZWN0aW9uLCB5b3UKbXVzdCBwbGFjZSwgaW4gdGhlIHJlbGV2YW50IHNvdXJjZSBmaWxlcywgYSBzdGF0ZW1lbnQgb2YgdGhlCmFkZGl0aW9uYWwgdGVybXMgdGhhdCBhcHBseSB0byB0aG9zZSBmaWxlcywgb3IgYSBub3RpY2UgaW5kaWNhdGluZwp3aGVyZSB0byBmaW5kIHRoZSBhcHBsaWNhYmxlIHRlcm1zLgoKICBBZGRpdGlvbmFsIHRlcm1zLCBwZXJtaXNzaXZlIG9yIG5vbi1wZXJtaXNzaXZlLCBtYXkgYmUgc3RhdGVkIGluIHRoZQpmb3JtIG9mIGEgc2VwYXJhdGVseSB3cml0dGVuIGxpY2Vuc2UsIG9yIHN0YXRlZCBhcyBleGNlcHRpb25zOwp0aGUgYWJvdmUgcmVxdWlyZW1lbnRzIGFwcGx5IGVpdGhlciB3YXkuCgogIDguIFRlcm1pbmF0aW9uLgoKICBZb3UgbWF5IG5vdCBwcm9wYWdhdGUgb3IgbW9kaWZ5IGEgY292ZXJlZCB3b3JrIGV4Y2VwdCBhcyBleHByZXNzbHkKcHJvdmlkZWQgdW5kZXIgdGhpcyBMaWNlbnNlLiAgQW55IGF0dGVtcHQgb3RoZXJ3aXNlIHRvIHByb3BhZ2F0ZSBvcgptb2RpZnkgaXQgaXMgdm9pZCwgYW5kIHdpbGwgYXV0b21hdGljYWxseSB0ZXJtaW5hdGUgeW91ciByaWdodHMgdW5kZXIKdGhpcyBMaWNlbnNlIChpbmNsdWRpbmcgYW55IHBhdGVudCBsaWNlbnNlcyBncmFudGVkIHVuZGVyIHRoZSB0aGlyZApwYXJhZ3JhcGggb2Ygc2VjdGlvbiAxMSkuCgogIEhvd2V2ZXIsIGlmIHlvdSBjZWFzZSBhbGwgdmlvbGF0aW9uIG9mIHRoaXMgTGljZW5zZSwgdGhlbiB5b3VyCmxpY2Vuc2UgZnJvbSBhIHBhcnRpY3VsYXIgY29weXJpZ2h0IGhvbGRlciBpcyByZWluc3RhdGVkIChhKQpwcm92aXNpb25hbGx5LCB1bmxlc3MgYW5kIHVudGlsIHRoZSBjb3B5cmlnaHQgaG9sZGVyIGV4cGxpY2l0bHkgYW5kCmZpbmFsbHkgdGVybWluYXRlcyB5b3VyIGxpY2Vuc2UsIGFuZCAoYikgcGVybWFuZW50bHksIGlmIHRoZSBjb3B5cmlnaHQKaG9sZGVyIGZhaWxzIHRvIG5vdGlmeSB5b3Ugb2YgdGhlIHZpb2xhdGlvbiBieSBzb21lIHJlYXNvbmFibGUgbWVhbnMKcHJpb3IgdG8gNjAgZGF5cyBhZnRlciB0aGUgY2Vzc2F0aW9uLgoKICBNb3Jlb3ZlciwgeW91ciBsaWNlbnNlIGZyb20gYSBwYXJ0aWN1bGFyIGNvcHlyaWdodCBob2xkZXIgaXMKcmVpbnN0YXRlZCBwZXJtYW5lbnRseSBpZiB0aGUgY29weXJpZ2h0IGhvbGRlciBub3RpZmllcyB5b3Ugb2YgdGhlCnZpb2xhdGlvbiBieSBzb21lIHJlYXNvbmFibGUgbWVhbnMsIHRoaXMgaXMgdGhlIGZpcnN0IHRpbWUgeW91IGhhdmUKcmVjZWl2ZWQgbm90aWNlIG9mIHZpb2xhdGlvbiBvZiB0aGlzIExpY2Vuc2UgKGZvciBhbnkgd29yaykgZnJvbSB0aGF0CmNvcHlyaWdodCBob2xkZXIsIGFuZCB5b3UgY3VyZSB0aGUgdmlvbGF0aW9uIHByaW9yIHRvIDMwIGRheXMgYWZ0ZXIKeW91ciByZWNlaXB0IG9mIHRoZSBub3RpY2UuCgogIFRlcm1pbmF0aW9uIG9mIHlvdXIgcmlnaHRzIHVuZGVyIHRoaXMgc2VjdGlvbiBkb2VzIG5vdCB0ZXJtaW5hdGUgdGhlCmxpY2Vuc2VzIG9mIHBhcnRpZXMgd2hvIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9yIHJpZ2h0cyBmcm9tIHlvdSB1bmRlcgp0aGlzIExpY2Vuc2UuICBJZiB5b3VyIHJpZ2h0cyBoYXZlIGJlZW4gdGVybWluYXRlZCBhbmQgbm90IHBlcm1hbmVudGx5CnJlaW5zdGF0ZWQsIHlvdSBkbyBub3QgcXVhbGlmeSB0byByZWNlaXZlIG5ldyBsaWNlbnNlcyBmb3IgdGhlIHNhbWUKbWF0ZXJpYWwgdW5kZXIgc2VjdGlvbiAxMC4KCiAgOS4gQWNjZXB0YW5jZSBOb3QgUmVxdWlyZWQgZm9yIEhhdmluZyBDb3BpZXMuCgogIFlvdSBhcmUgbm90IHJlcXVpcmVkIHRvIGFjY2VwdCB0aGlzIExpY2Vuc2UgaW4gb3JkZXIgdG8gcmVjZWl2ZSBvcgpydW4gYSBjb3B5IG9mIHRoZSBQcm9ncmFtLiAgQW5jaWxsYXJ5IHByb3BhZ2F0aW9uIG9mIGEgY292ZXJlZCB3b3JrCm9jY3VycmluZyBzb2xlbHkgYXMgYSBjb25zZXF1ZW5jZSBvZiB1c2luZyBwZWVyLXRvLXBlZXIgdHJhbnNtaXNzaW9uCnRvIHJlY2VpdmUgYSBjb3B5IGxpa2V3aXNlIGRvZXMgbm90IHJlcXVpcmUgYWNjZXB0YW5jZS4gIEhvd2V2ZXIsCm5vdGhpbmcgb3RoZXIgdGhhbiB0aGlzIExpY2Vuc2UgZ3JhbnRzIHlvdSBwZXJtaXNzaW9uIHRvIHByb3BhZ2F0ZSBvcgptb2RpZnkgYW55IGNvdmVyZWQgd29yay4gIFRoZXNlIGFjdGlvbnMgaW5mcmluZ2UgY29weXJpZ2h0IGlmIHlvdSBkbwpub3QgYWNjZXB0IHRoaXMgTGljZW5zZS4gIFRoZXJlZm9yZSwgYnkgbW9kaWZ5aW5nIG9yIHByb3BhZ2F0aW5nIGEKY292ZXJlZCB3b3JrLCB5b3UgaW5kaWNhdGUgeW91ciBhY2NlcHRhbmNlIG9mIHRoaXMgTGljZW5zZSB0byBkbyBzby4KCiAgMTAuIEF1dG9tYXRpYyBMaWNlbnNpbmcgb2YgRG93bnN0cmVhbSBSZWNpcGllbnRzLgoKICBFYWNoIHRpbWUgeW91IGNvbnZleSBhIGNvdmVyZWQgd29yaywgdGhlIHJlY2lwaWVudCBhdXRvbWF0aWNhbGx5CnJlY2VpdmVzIGEgbGljZW5zZSBmcm9tIHRoZSBvcmlnaW5hbCBsaWNlbnNvcnMsIHRvIHJ1biwgbW9kaWZ5IGFuZApwcm9wYWdhdGUgdGhhdCB3b3JrLCBzdWJqZWN0IHRvIHRoaXMgTGljZW5zZS4gIFlvdSBhcmUgbm90IHJlc3BvbnNpYmxlCmZvciBlbmZvcmNpbmcgY29tcGxpYW5jZSBieSB0aGlyZCBwYXJ0aWVzIHdpdGggdGhpcyBMaWNlbnNlLgoKICBBbiAiZW50aXR5IHRyYW5zYWN0aW9uIiBpcyBhIHRyYW5zYWN0aW9uIHRyYW5zZmVycmluZyBjb250cm9sIG9mIGFuCm9yZ2FuaXphdGlvbiwgb3Igc3Vic3RhbnRpYWxseSBhbGwgYXNzZXRzIG9mIG9uZSwgb3Igc3ViZGl2aWRpbmcgYW4Kb3JnYW5pemF0aW9uLCBvciBtZXJnaW5nIG9yZ2FuaXphdGlvbnMuICBJZiBwcm9wYWdhdGlvbiBvZiBhIGNvdmVyZWQKd29yayByZXN1bHRzIGZyb20gYW4gZW50aXR5IHRyYW5zYWN0aW9uLCBlYWNoIHBhcnR5IHRvIHRoYXQKdHJhbnNhY3Rpb24gd2hvIHJlY2VpdmVzIGEgY29weSBvZiB0aGUgd29yayBhbHNvIHJlY2VpdmVzIHdoYXRldmVyCmxpY2Vuc2VzIHRvIHRoZSB3b3JrIHRoZSBwYXJ0eSdzIHByZWRlY2Vzc29yIGluIGludGVyZXN0IGhhZCBvciBjb3VsZApnaXZlIHVuZGVyIHRoZSBwcmV2aW91cyBwYXJhZ3JhcGgsIHBsdXMgYSByaWdodCB0byBwb3NzZXNzaW9uIG9mIHRoZQpDb3JyZXNwb25kaW5nIFNvdXJjZSBvZiB0aGUgd29yayBmcm9tIHRoZSBwcmVkZWNlc3NvciBpbiBpbnRlcmVzdCwgaWYKdGhlIHByZWRlY2Vzc29yIGhhcyBpdCBvciBjYW4gZ2V0IGl0IHdpdGggcmVhc29uYWJsZSBlZmZvcnRzLgoKICBZb3UgbWF5IG5vdCBpbXBvc2UgYW55IGZ1cnRoZXIgcmVzdHJpY3Rpb25zIG9uIHRoZSBleGVyY2lzZSBvZiB0aGUKcmlnaHRzIGdyYW50ZWQgb3IgYWZmaXJtZWQgdW5kZXIgdGhpcyBMaWNlbnNlLiAgRm9yIGV4YW1wbGUsIHlvdSBtYXkKbm90IGltcG9zZSBhIGxpY2Vuc2UgZmVlLCByb3lhbHR5LCBvciBvdGhlciBjaGFyZ2UgZm9yIGV4ZXJjaXNlIG9mCnJpZ2h0cyBncmFudGVkIHVuZGVyIHRoaXMgTGljZW5zZSwgYW5kIHlvdSBtYXkgbm90IGluaXRpYXRlIGxpdGlnYXRpb24KKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQKYW55IHBhdGVudCBjbGFpbSBpcyBpbmZyaW5nZWQgYnkgbWFraW5nLCB1c2luZywgc2VsbGluZywgb2ZmZXJpbmcgZm9yCnNhbGUsIG9yIGltcG9ydGluZyB0aGUgUHJvZ3JhbSBvciBhbnkgcG9ydGlvbiBvZiBpdC4KCiAgMTEuIFBhdGVudHMuCgogIEEgImNvbnRyaWJ1dG9yIiBpcyBhIGNvcHlyaWdodCBob2xkZXIgd2hvIGF1dGhvcml6ZXMgdXNlIHVuZGVyIHRoaXMKTGljZW5zZSBvZiB0aGUgUHJvZ3JhbSBvciBhIHdvcmsgb24gd2hpY2ggdGhlIFByb2dyYW0gaXMgYmFzZWQuICBUaGUKd29yayB0aHVzIGxpY2Vuc2VkIGlzIGNhbGxlZCB0aGUgY29udHJpYnV0b3IncyAiY29udHJpYnV0b3IgdmVyc2lvbiIuCgogIEEgY29udHJpYnV0b3IncyAiZXNzZW50aWFsIHBhdGVudCBjbGFpbXMiIGFyZSBhbGwgcGF0ZW50IGNsYWltcwpvd25lZCBvciBjb250cm9sbGVkIGJ5IHRoZSBjb250cmlidXRvciwgd2hldGhlciBhbHJlYWR5IGFjcXVpcmVkIG9yCmhlcmVhZnRlciBhY3F1aXJlZCwgdGhhdCB3b3VsZCBiZSBpbmZyaW5nZWQgYnkgc29tZSBtYW5uZXIsIHBlcm1pdHRlZApieSB0aGlzIExpY2Vuc2UsIG9mIG1ha2luZywgdXNpbmcsIG9yIHNlbGxpbmcgaXRzIGNvbnRyaWJ1dG9yIHZlcnNpb24sCmJ1dCBkbyBub3QgaW5jbHVkZSBjbGFpbXMgdGhhdCB3b3VsZCBiZSBpbmZyaW5nZWQgb25seSBhcyBhCmNvbnNlcXVlbmNlIG9mIGZ1cnRoZXIgbW9kaWZpY2F0aW9uIG9mIHRoZSBjb250cmlidXRvciB2ZXJzaW9uLiAgRm9yCnB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgImNvbnRyb2wiIGluY2x1ZGVzIHRoZSByaWdodCB0byBncmFudApwYXRlbnQgc3VibGljZW5zZXMgaW4gYSBtYW5uZXIgY29uc2lzdGVudCB3aXRoIHRoZSByZXF1aXJlbWVudHMgb2YKdGhpcyBMaWNlbnNlLgoKICBFYWNoIGNvbnRyaWJ1dG9yIGdyYW50cyB5b3UgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZQpwYXRlbnQgbGljZW5zZSB1bmRlciB0aGUgY29udHJpYnV0b3IncyBlc3NlbnRpYWwgcGF0ZW50IGNsYWltcywgdG8KbWFrZSwgdXNlLCBzZWxsLCBvZmZlciBmb3Igc2FsZSwgaW1wb3J0IGFuZCBvdGhlcndpc2UgcnVuLCBtb2RpZnkgYW5kCnByb3BhZ2F0ZSB0aGUgY29udGVudHMgb2YgaXRzIGNvbnRyaWJ1dG9yIHZlcnNpb24uCgogIEluIHRoZSBmb2xsb3dpbmcgdGhyZWUgcGFyYWdyYXBocywgYSAicGF0ZW50IGxpY2Vuc2UiIGlzIGFueSBleHByZXNzCmFncmVlbWVudCBvciBjb21taXRtZW50LCBob3dldmVyIGRlbm9taW5hdGVkLCBub3QgdG8gZW5mb3JjZSBhIHBhdGVudAooc3VjaCBhcyBhbiBleHByZXNzIHBlcm1pc3Npb24gdG8gcHJhY3RpY2UgYSBwYXRlbnQgb3IgY292ZW5hbnQgbm90IHRvCnN1ZSBmb3IgcGF0ZW50IGluZnJpbmdlbWVudCkuICBUbyAiZ3JhbnQiIHN1Y2ggYSBwYXRlbnQgbGljZW5zZSB0byBhCnBhcnR5IG1lYW5zIHRvIG1ha2Ugc3VjaCBhbiBhZ3JlZW1lbnQgb3IgY29tbWl0bWVudCBub3QgdG8gZW5mb3JjZSBhCnBhdGVudCBhZ2FpbnN0IHRoZSBwYXJ0eS4KCiAgSWYgeW91IGNvbnZleSBhIGNvdmVyZWQgd29yaywga25vd2luZ2x5IHJlbHlpbmcgb24gYSBwYXRlbnQgbGljZW5zZSwKYW5kIHRoZSBDb3JyZXNwb25kaW5nIFNvdXJjZSBvZiB0aGUgd29yayBpcyBub3QgYXZhaWxhYmxlIGZvciBhbnlvbmUKdG8gY29weSwgZnJlZSBvZiBjaGFyZ2UgYW5kIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UsIHRocm91Z2ggYQpwdWJsaWNseSBhdmFpbGFibGUgbmV0d29yayBzZXJ2ZXIgb3Igb3RoZXIgcmVhZGlseSBhY2Nlc3NpYmxlIG1lYW5zLAp0aGVuIHlvdSBtdXN0IGVpdGhlciAoMSkgY2F1c2UgdGhlIENvcnJlc3BvbmRpbmcgU291cmNlIHRvIGJlIHNvCmF2YWlsYWJsZSwgb3IgKDIpIGFycmFuZ2UgdG8gZGVwcml2ZSB5b3Vyc2VsZiBvZiB0aGUgYmVuZWZpdCBvZiB0aGUKcGF0ZW50IGxpY2Vuc2UgZm9yIHRoaXMgcGFydGljdWxhciB3b3JrLCBvciAoMykgYXJyYW5nZSwgaW4gYSBtYW5uZXIKY29uc2lzdGVudCB3aXRoIHRoZSByZXF1aXJlbWVudHMgb2YgdGhpcyBMaWNlbnNlLCB0byBleHRlbmQgdGhlIHBhdGVudApsaWNlbnNlIHRvIGRvd25zdHJlYW0gcmVjaXBpZW50cy4gICJLbm93aW5nbHkgcmVseWluZyIgbWVhbnMgeW91IGhhdmUKYWN0dWFsIGtub3dsZWRnZSB0aGF0LCBidXQgZm9yIHRoZSBwYXRlbnQgbGljZW5zZSwgeW91ciBjb252ZXlpbmcgdGhlCmNvdmVyZWQgd29yayBpbiBhIGNvdW50cnksIG9yIHlvdXIgcmVjaXBpZW50J3MgdXNlIG9mIHRoZSBjb3ZlcmVkIHdvcmsKaW4gYSBjb3VudHJ5LCB3b3VsZCBpbmZyaW5nZSBvbmUgb3IgbW9yZSBpZGVudGlmaWFibGUgcGF0ZW50cyBpbiB0aGF0CmNvdW50cnkgdGhhdCB5b3UgaGF2ZSByZWFzb24gdG8gYmVsaWV2ZSBhcmUgdmFsaWQuCgogIElmLCBwdXJzdWFudCB0byBvciBpbiBjb25uZWN0aW9uIHdpdGggYSBzaW5nbGUgdHJhbnNhY3Rpb24gb3IKYXJyYW5nZW1lbnQsIHlvdSBjb252ZXksIG9yIHByb3BhZ2F0ZSBieSBwcm9jdXJpbmcgY29udmV5YW5jZSBvZiwgYQpjb3ZlcmVkIHdvcmssIGFuZCBncmFudCBhIHBhdGVudCBsaWNlbnNlIHRvIHNvbWUgb2YgdGhlIHBhcnRpZXMKcmVjZWl2aW5nIHRoZSBjb3ZlcmVkIHdvcmsgYXV0aG9yaXppbmcgdGhlbSB0byB1c2UsIHByb3BhZ2F0ZSwgbW9kaWZ5Cm9yIGNvbnZleSBhIHNwZWNpZmljIGNvcHkgb2YgdGhlIGNvdmVyZWQgd29yaywgdGhlbiB0aGUgcGF0ZW50IGxpY2Vuc2UKeW91IGdyYW50IGlzIGF1dG9tYXRpY2FsbHkgZXh0ZW5kZWQgdG8gYWxsIHJlY2lwaWVudHMgb2YgdGhlIGNvdmVyZWQKd29yayBhbmQgd29ya3MgYmFzZWQgb24gaXQuCgogIEEgcGF0ZW50IGxpY2Vuc2UgaXMgImRpc2NyaW1pbmF0b3J5IiBpZiBpdCBkb2VzIG5vdCBpbmNsdWRlIHdpdGhpbgp0aGUgc2NvcGUgb2YgaXRzIGNvdmVyYWdlLCBwcm9oaWJpdHMgdGhlIGV4ZXJjaXNlIG9mLCBvciBpcwpjb25kaXRpb25lZCBvbiB0aGUgbm9uLWV4ZXJjaXNlIG9mIG9uZSBvciBtb3JlIG9mIHRoZSByaWdodHMgdGhhdCBhcmUKc3BlY2lmaWNhbGx5IGdyYW50ZWQgdW5kZXIgdGhpcyBMaWNlbnNlLiAgWW91IG1heSBub3QgY29udmV5IGEgY292ZXJlZAp3b3JrIGlmIHlvdSBhcmUgYSBwYXJ0eSB0byBhbiBhcnJhbmdlbWVudCB3aXRoIGEgdGhpcmQgcGFydHkgdGhhdCBpcwppbiB0aGUgYnVzaW5lc3Mgb2YgZGlzdHJpYnV0aW5nIHNvZnR3YXJlLCB1bmRlciB3aGljaCB5b3UgbWFrZSBwYXltZW50CnRvIHRoZSB0aGlyZCBwYXJ0eSBiYXNlZCBvbiB0aGUgZXh0ZW50IG9mIHlvdXIgYWN0aXZpdHkgb2YgY29udmV5aW5nCnRoZSB3b3JrLCBhbmQgdW5kZXIgd2hpY2ggdGhlIHRoaXJkIHBhcnR5IGdyYW50cywgdG8gYW55IG9mIHRoZQpwYXJ0aWVzIHdobyB3b3VsZCByZWNlaXZlIHRoZSBjb3ZlcmVkIHdvcmsgZnJvbSB5b3UsIGEgZGlzY3JpbWluYXRvcnkKcGF0ZW50IGxpY2Vuc2UgKGEpIGluIGNvbm5lY3Rpb24gd2l0aCBjb3BpZXMgb2YgdGhlIGNvdmVyZWQgd29yawpjb252ZXllZCBieSB5b3UgKG9yIGNvcGllcyBtYWRlIGZyb20gdGhvc2UgY29waWVzKSwgb3IgKGIpIHByaW1hcmlseQpmb3IgYW5kIGluIGNvbm5lY3Rpb24gd2l0aCBzcGVjaWZpYyBwcm9kdWN0cyBvciBjb21waWxhdGlvbnMgdGhhdApjb250YWluIHRoZSBjb3ZlcmVkIHdvcmssIHVubGVzcyB5b3UgZW50ZXJlZCBpbnRvIHRoYXQgYXJyYW5nZW1lbnQsCm9yIHRoYXQgcGF0ZW50IGxpY2Vuc2Ugd2FzIGdyYW50ZWQsIHByaW9yIHRvIDI4IE1hcmNoIDIwMDcuCgogIE5vdGhpbmcgaW4gdGhpcyBMaWNlbnNlIHNoYWxsIGJlIGNvbnN0cnVlZCBhcyBleGNsdWRpbmcgb3IgbGltaXRpbmcKYW55IGltcGxpZWQgbGljZW5zZSBvciBvdGhlciBkZWZlbnNlcyB0byBpbmZyaW5nZW1lbnQgdGhhdCBtYXkKb3RoZXJ3aXNlIGJlIGF2YWlsYWJsZSB0byB5b3UgdW5kZXIgYXBwbGljYWJsZSBwYXRlbnQgbGF3LgoKICAxMi4gTm8gU3VycmVuZGVyIG9mIE90aGVycycgRnJlZWRvbS4KCiAgSWYgY29uZGl0aW9ucyBhcmUgaW1wb3NlZCBvbiB5b3UgKHdoZXRoZXIgYnkgY291cnQgb3JkZXIsIGFncmVlbWVudCBvcgpvdGhlcndpc2UpIHRoYXQgY29udHJhZGljdCB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UsIHRoZXkgZG8gbm90CmV4Y3VzZSB5b3UgZnJvbSB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UuICBJZiB5b3UgY2Fubm90IGNvbnZleSBhCmNvdmVyZWQgd29yayBzbyBhcyB0byBzYXRpc2Z5IHNpbXVsdGFuZW91c2x5IHlvdXIgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcwpMaWNlbnNlIGFuZCBhbnkgb3RoZXIgcGVydGluZW50IG9ibGlnYXRpb25zLCB0aGVuIGFzIGEgY29uc2VxdWVuY2UgeW91IG1heQpub3QgY29udmV5IGl0IGF0IGFsbC4gIEZvciBleGFtcGxlLCBpZiB5b3UgYWdyZWUgdG8gdGVybXMgdGhhdCBvYmxpZ2F0ZSB5b3UKdG8gY29sbGVjdCBhIHJveWFsdHkgZm9yIGZ1cnRoZXIgY29udmV5aW5nIGZyb20gdGhvc2UgdG8gd2hvbSB5b3UgY29udmV5CnRoZSBQcm9ncmFtLCB0aGUgb25seSB3YXkgeW91IGNvdWxkIHNhdGlzZnkgYm90aCB0aG9zZSB0ZXJtcyBhbmQgdGhpcwpMaWNlbnNlIHdvdWxkIGJlIHRvIHJlZnJhaW4gZW50aXJlbHkgZnJvbSBjb252ZXlpbmcgdGhlIFByb2dyYW0uCgogIDEzLiBVc2Ugd2l0aCB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgoKICBOb3R3aXRoc3RhbmRpbmcgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UsIHlvdSBoYXZlCnBlcm1pc3Npb24gdG8gbGluayBvciBjb21iaW5lIGFueSBjb3ZlcmVkIHdvcmsgd2l0aCBhIHdvcmsgbGljZW5zZWQKdW5kZXIgdmVyc2lvbiAzIG9mIHRoZSBHTlUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaW50byBhIHNpbmdsZQpjb21iaW5lZCB3b3JrLCBhbmQgdG8gY29udmV5IHRoZSByZXN1bHRpbmcgd29yay4gIFRoZSB0ZXJtcyBvZiB0aGlzCkxpY2Vuc2Ugd2lsbCBjb250aW51ZSB0byBhcHBseSB0byB0aGUgcGFydCB3aGljaCBpcyB0aGUgY292ZXJlZCB3b3JrLApidXQgdGhlIHNwZWNpYWwgcmVxdWlyZW1lbnRzIG9mIHRoZSBHTlUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCnNlY3Rpb24gMTMsIGNvbmNlcm5pbmcgaW50ZXJhY3Rpb24gdGhyb3VnaCBhIG5ldHdvcmsgd2lsbCBhcHBseSB0byB0aGUKY29tYmluYXRpb24gYXMgc3VjaC4KCiAgMTQuIFJldmlzZWQgVmVyc2lvbnMgb2YgdGhpcyBMaWNlbnNlLgoKICBUaGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIG1heSBwdWJsaXNoIHJldmlzZWQgYW5kL29yIG5ldyB2ZXJzaW9ucyBvZgp0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZnJvbSB0aW1lIHRvIHRpbWUuICBTdWNoIG5ldyB2ZXJzaW9ucyB3aWxsCmJlIHNpbWlsYXIgaW4gc3Bpcml0IHRvIHRoZSBwcmVzZW50IHZlcnNpb24sIGJ1dCBtYXkgZGlmZmVyIGluIGRldGFpbCB0bwphZGRyZXNzIG5ldyBwcm9ibGVtcyBvciBjb25jZXJucy4KCiAgRWFjaCB2ZXJzaW9uIGlzIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuICBJZiB0aGUKUHJvZ3JhbSBzcGVjaWZpZXMgdGhhdCBhIGNlcnRhaW4gbnVtYmVyZWQgdmVyc2lvbiBvZiB0aGUgR05VIEdlbmVyYWwKUHVibGljIExpY2Vuc2UgIm9yIGFueSBsYXRlciB2ZXJzaW9uIiBhcHBsaWVzIHRvIGl0LCB5b3UgaGF2ZSB0aGUKb3B0aW9uIG9mIGZvbGxvd2luZyB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZWl0aGVyIG9mIHRoYXQgbnVtYmVyZWQKdmVyc2lvbiBvciBvZiBhbnkgbGF0ZXIgdmVyc2lvbiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKRm91bmRhdGlvbi4gIElmIHRoZSBQcm9ncmFtIGRvZXMgbm90IHNwZWNpZnkgYSB2ZXJzaW9uIG51bWJlciBvZiB0aGUKR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHlvdSBtYXkgY2hvb3NlIGFueSB2ZXJzaW9uIGV2ZXIgcHVibGlzaGVkCmJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCgogIElmIHRoZSBQcm9ncmFtIHNwZWNpZmllcyB0aGF0IGEgcHJveHkgY2FuIGRlY2lkZSB3aGljaCBmdXR1cmUKdmVyc2lvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB1c2VkLCB0aGF0IHByb3h5J3MKcHVibGljIHN0YXRlbWVudCBvZiBhY2NlcHRhbmNlIG9mIGEgdmVyc2lvbiBwZXJtYW5lbnRseSBhdXRob3JpemVzIHlvdQp0byBjaG9vc2UgdGhhdCB2ZXJzaW9uIGZvciB0aGUgUHJvZ3JhbS4KCiAgTGF0ZXIgbGljZW5zZSB2ZXJzaW9ucyBtYXkgZ2l2ZSB5b3UgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQKcGVybWlzc2lvbnMuICBIb3dldmVyLCBubyBhZGRpdGlvbmFsIG9ibGlnYXRpb25zIGFyZSBpbXBvc2VkIG9uIGFueQphdXRob3Igb3IgY29weXJpZ2h0IGhvbGRlciBhcyBhIHJlc3VsdCBvZiB5b3VyIGNob29zaW5nIHRvIGZvbGxvdyBhCmxhdGVyIHZlcnNpb24uCgogIDE1LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LgoKICBUSEVSRSBJUyBOTyBXQVJSQU5UWSBGT1IgVEhFIFBST0dSQU0sIFRPIFRIRSBFWFRFTlQgUEVSTUlUVEVEIEJZCkFQUExJQ0FCTEUgTEFXLiAgRVhDRVBUIFdIRU4gT1RIRVJXSVNFIFNUQVRFRCBJTiBXUklUSU5HIFRIRSBDT1BZUklHSFQKSE9MREVSUyBBTkQvT1IgT1RIRVIgUEFSVElFUyBQUk9WSURFIFRIRSBQUk9HUkFNICJBUyBJUyIgV0lUSE9VVCBXQVJSQU5UWQpPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRCBPUiBJTVBMSUVELCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgpQVVJQT1NFLiAgVEhFIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUgUFJPR1JBTQpJUyBXSVRIIFlPVS4gIFNIT1VMRCBUSEUgUFJPR1JBTSBQUk9WRSBERUZFQ1RJVkUsIFlPVSBBU1NVTUUgVEhFIENPU1QgT0YKQUxMIE5FQ0VTU0FSWSBTRVJWSUNJTkcsIFJFUEFJUiBPUiBDT1JSRUNUSU9OLgoKICAxNi4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuCgogIElOIE5PIEVWRU5UIFVOTEVTUyBSRVFVSVJFRCBCWSBBUFBMSUNBQkxFIExBVyBPUiBBR1JFRUQgVE8gSU4gV1JJVElORwpXSUxMIEFOWSBDT1BZUklHSFQgSE9MREVSLCBPUiBBTlkgT1RIRVIgUEFSVFkgV0hPIE1PRElGSUVTIEFORC9PUiBDT05WRVlTClRIRSBQUk9HUkFNIEFTIFBFUk1JVFRFRCBBQk9WRSwgQkUgTElBQkxFIFRPIFlPVSBGT1IgREFNQUdFUywgSU5DTFVESU5HIEFOWQpHRU5FUkFMLCBTUEVDSUFMLCBJTkNJREVOVEFMIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBBUklTSU5HIE9VVCBPRiBUSEUKVVNFIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFIFBST0dSQU0gKElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gTE9TUyBPRgpEQVRBIE9SIERBVEEgQkVJTkcgUkVOREVSRUQgSU5BQ0NVUkFURSBPUiBMT1NTRVMgU1VTVEFJTkVEIEJZIFlPVSBPUiBUSElSRApQQVJUSUVTIE9SIEEgRkFJTFVSRSBPRiBUSEUgUFJPR1JBTSBUTyBPUEVSQVRFIFdJVEggQU5ZIE9USEVSIFBST0dSQU1TKSwKRVZFTiBJRiBTVUNIIEhPTERFUiBPUiBPVEhFUiBQQVJUWSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgpTVUNIIERBTUFHRVMuCgogIDE3LiBJbnRlcnByZXRhdGlvbiBvZiBTZWN0aW9ucyAxNSBhbmQgMTYuCgogIElmIHRoZSBkaXNjbGFpbWVyIG9mIHdhcnJhbnR5IGFuZCBsaW1pdGF0aW9uIG9mIGxpYWJpbGl0eSBwcm92aWRlZAphYm92ZSBjYW5ub3QgYmUgZ2l2ZW4gbG9jYWwgbGVnYWwgZWZmZWN0IGFjY29yZGluZyB0byB0aGVpciB0ZXJtcywKcmV2aWV3aW5nIGNvdXJ0cyBzaGFsbCBhcHBseSBsb2NhbCBsYXcgdGhhdCBtb3N0IGNsb3NlbHkgYXBwcm94aW1hdGVzCmFuIGFic29sdXRlIHdhaXZlciBvZiBhbGwgY2l2aWwgbGlhYmlsaXR5IGluIGNvbm5lY3Rpb24gd2l0aCB0aGUKUHJvZ3JhbSwgdW5sZXNzIGEgd2FycmFudHkgb3IgYXNzdW1wdGlvbiBvZiBsaWFiaWxpdHkgYWNjb21wYW5pZXMgYQpjb3B5IG9mIHRoZSBQcm9ncmFtIGluIHJldHVybiBmb3IgYSBmZWUuCgogICAgICAgICAgICAgICAgICAgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKCiAgICAgICAgICAgIEhvdyB0byBBcHBseSBUaGVzZSBUZXJtcyB0byBZb3VyIE5ldyBQcm9ncmFtcwoKICBJZiB5b3UgZGV2ZWxvcCBhIG5ldyBwcm9ncmFtLCBhbmQgeW91IHdhbnQgaXQgdG8gYmUgb2YgdGhlIGdyZWF0ZXN0CnBvc3NpYmxlIHVzZSB0byB0aGUgcHVibGljLCB0aGUgYmVzdCB3YXkgdG8gYWNoaWV2ZSB0aGlzIGlzIHRvIG1ha2UgaXQKZnJlZSBzb2Z0d2FyZSB3aGljaCBldmVyeW9uZSBjYW4gcmVkaXN0cmlidXRlIGFuZCBjaGFuZ2UgdW5kZXIgdGhlc2UgdGVybXMuCgogIFRvIGRvIHNvLCBhdHRhY2ggdGhlIGZvbGxvd2luZyBub3RpY2VzIHRvIHRoZSBwcm9ncmFtLiAgSXQgaXMgc2FmZXN0CnRvIGF0dGFjaCB0aGVtIHRvIHRoZSBzdGFydCBvZiBlYWNoIHNvdXJjZSBmaWxlIHRvIG1vc3QgZWZmZWN0aXZlbHkKc3RhdGUgdGhlIGV4Y2x1c2lvbiBvZiB3YXJyYW50eTsgYW5kIGVhY2ggZmlsZSBzaG91bGQgaGF2ZSBhdCBsZWFzdAp0aGUgImNvcHlyaWdodCIgbGluZSBhbmQgYSBwb2ludGVyIHRvIHdoZXJlIHRoZSBmdWxsIG5vdGljZSBpcyBmb3VuZC4KCiAgICA8b25lIGxpbmUgdG8gZ2l2ZSB0aGUgcHJvZ3JhbSdzIG5hbWUgYW5kIGEgYnJpZWYgaWRlYSBvZiB3aGF0IGl0IGRvZXMuPgogICAgQ29weXJpZ2h0IChDKSA8eWVhcj4gIDxuYW1lIG9mIGF1dGhvcj4KCiAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCiAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgoKICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCgogICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgoKQWxzbyBhZGQgaW5mb3JtYXRpb24gb24gaG93IHRvIGNvbnRhY3QgeW91IGJ5IGVsZWN0cm9uaWMgYW5kIHBhcGVyIG1haWwuCgogIElmIHRoZSBwcm9ncmFtIGRvZXMgdGVybWluYWwgaW50ZXJhY3Rpb24sIG1ha2UgaXQgb3V0cHV0IGEgc2hvcnQKbm90aWNlIGxpa2UgdGhpcyB3aGVuIGl0IHN0YXJ0cyBpbiBhbiBpbnRlcmFjdGl2ZSBtb2RlOgoKICAgIDxwcm9ncmFtPiAgQ29weXJpZ2h0IChDKSA8eWVhcj4gIDxuYW1lIG9mIGF1dGhvcj4KICAgIFRoaXMgcHJvZ3JhbSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFk7IGZvciBkZXRhaWxzIHR5cGUgYHNob3cgdycuCiAgICBUaGlzIGlzIGZyZWUgc29mdHdhcmUsIGFuZCB5b3UgYXJlIHdlbGNvbWUgdG8gcmVkaXN0cmlidXRlIGl0CiAgICB1bmRlciBjZXJ0YWluIGNvbmRpdGlvbnM7IHR5cGUgYHNob3cgYycgZm9yIGRldGFpbHMuCgpUaGUgaHlwb3RoZXRpY2FsIGNvbW1hbmRzIGBzaG93IHcnIGFuZCBgc2hvdyBjJyBzaG91bGQgc2hvdyB0aGUgYXBwcm9wcmlhdGUKcGFydHMgb2YgdGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBPZiBjb3Vyc2UsIHlvdXIgcHJvZ3JhbSdzIGNvbW1hbmRzCm1pZ2h0IGJlIGRpZmZlcmVudDsgZm9yIGEgR1VJIGludGVyZmFjZSwgeW91IHdvdWxkIHVzZSBhbiAiYWJvdXQgYm94Ii4KCiAgWW91IHNob3VsZCBhbHNvIGdldCB5b3VyIGVtcGxveWVyIChpZiB5b3Ugd29yayBhcyBhIHByb2dyYW1tZXIpIG9yIHNjaG9vbCwKaWYgYW55LCB0byBzaWduIGEgImNvcHlyaWdodCBkaXNjbGFpbWVyIiBmb3IgdGhlIHByb2dyYW0sIGlmIG5lY2Vzc2FyeS4KRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhpcywgYW5kIGhvdyB0byBhcHBseSBhbmQgZm9sbG93IHRoZSBHTlUgR1BMLCBzZWUKPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgoKICBUaGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZG9lcyBub3QgcGVybWl0IGluY29ycG9yYXRpbmcgeW91ciBwcm9ncmFtCmludG8gcHJvcHJpZXRhcnkgcHJvZ3JhbXMuICBJZiB5b3VyIHByb2dyYW0gaXMgYSBzdWJyb3V0aW5lIGxpYnJhcnksIHlvdQptYXkgY29uc2lkZXIgaXQgbW9yZSB1c2VmdWwgdG8gcGVybWl0IGxpbmtpbmcgcHJvcHJpZXRhcnkgYXBwbGljYXRpb25zIHdpdGgKdGhlIGxpYnJhcnkuICBJZiB0aGlzIGlzIHdoYXQgeW91IHdhbnQgdG8gZG8sIHVzZSB0aGUgR05VIExlc3NlciBHZW5lcmFsClB1YmxpYyBMaWNlbnNlIGluc3RlYWQgb2YgdGhpcyBMaWNlbnNlLiAgQnV0IGZpcnN0LCBwbGVhc2UgcmVhZAo8aHR0cDovL3d3dy5nbnUub3JnL3BoaWxvc29waHkvd2h5LW5vdC1sZ3BsLmh0bWw+Lgo=]]></data>
	</file>
	<file>
	  <filename>/images/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/images/icon.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[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]]></data>
	</file>
	<file>
	  <filename>/lang/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lang/en_US.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKI0EKCgojQgoKCiNDCgojRAokbGFuZ1snZGVzY19ldmVudF9vbl9pbmNvbWluZ19ldmVudCddID0gJ0FzeW5jcmhvbm91cyBQYXltZW50IEdhdGV3YXkgZXZlbnQnOwoKCiNFCgoKI0YKJGxhbmdbJ2ZyaWVuZGx5bmFtZSddID0gJ0Jhc2UgbW9kdWxlIGZvciBwYXltZW50IGdhdGV3YXlzJzsKCiNHCgoKI0gKJGxhbmdbJ2hlbHAnXSA9IDw8PEVPVAo8aDM+V2hhdCBkb2VzIHRoaXMgZG8/PC9oMz4KPHA+VGhpcyBtb2R1bGUgcHJvdmlkZXMgYSBza2VsZXRvbiBBUEkgZm9yIG90aGVyIHBheW1lbnQgZ2F0ZXdheSBtb2R1bGVzIGluIENhbGd1eXMgRS1Db21tZXJjZSBzdWl0ZSAgSXQgcHJvdmlkZXMgbm8gaW50ZXJmYWNlIG9yIGZ1bmN0aW9uYWxpdHkgb2YgaXRzIG93bjwvcD4KPGgzPkhvdyBkbyBJIHVzZSBpdD88L2gzPgo8cD5UaGlzIG1vZHVsZSBzaG91bGQgYmUgaW5zdGFsbGVkIHByaW9yIHRvIGluc3RhbGxpbmcgYW55IG90aGVyIG9mIHRoZSBwYXltZW50IGdhdGV3YXkgbW9kdWxlcyB0aGF0IGFyZSBjb21wYXRpYmxlIHdpdGggQ2FsZ3V5cyBFLUNvbW1lcmNlIFN1aXRlLjwvcD4KPGgzPlN1cHBvcnQ8L2gzPgo8cD5UaGlzIG1vZHVsZSBkb2VzIG5vdCBpbmNsdWRlIGNvbW1lcmNpYWwgc3VwcG9ydC4gSG93ZXZlciwgdGhlcmUgYXJlIGEgbnVtYmVyIG9mIHJlc291cmNlcyBhdmFpbGFibGUgdG8gaGVscCB5b3Ugd2l0aCBpdDo8L3A+Cjx1bD4KPGxpPkZvciB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgdGhpcyBtb2R1bGUsIEZBUXMsIG9yIHRvIGZpbGUgYSBCdWcgUmVwb3J0IG9yIGJ1eSBjb21tZXJjaWFsIHN1cHBvcnQsIHBsZWFzZSB2aXNpdCB0aGUgY21zIGRldmVsb3BtZW50IGZvcmdlIGF0IDxhIGhyZWY9Imh0dHA6Ly9kZXYuY21zbWFkZXNpbXBsZS5vcmciPmRldi5jbXNtYWRlc2ltcGxlLm9yZzwvYT4uPC9saT4KPGxpPkFkZGl0aW9uYWwgZGlzY3Vzc2lvbiBvZiB0aGlzIG1vZHVsZSBtYXkgYWxzbyBiZSBmb3VuZCBpbiB0aGUgPGEgaHJlZj0iaHR0cDovL2ZvcnVtLmNtc21hZGVzaW1wbGUub3JnIj5DTVMgTWFkZSBTaW1wbGUgRm9ydW1zPC9hPi48L2xpPgo8bGk+VGhlIGF1dGhvciwgY2FsZ3V5MTAwMCBhbGwgY2FuIG9mdGVuIGJlIGZvdW5kIGluIHRoZSA8YSBocmVmPSJpcmM6Ly9pcmMuZnJlZW5vZGUubmV0LyNjbXMiPkNNUyBJUkMgQ2hhbm5lbDwvYT4uPC9saT4KPGxpPkxhc3RseSwgeW91IG1heSBoYXZlIHNvbWUgc3VjY2VzcyBlbWFpbGluZyB0aGUgYXV0aG9yKHMpIGRpcmVjdGx5LjwvbGk+ICAKPC91bD4KCjxoMz5Db3B5cmlnaHQgYW5kIExpY2Vuc2U8L2gzPgo8cD5Db3B5cmlnaHQgJmNvcHk7IDIwMDgsIFJvYmVydCBDYW1wYmVsIDxhIGhyZWY9Im1haWx0bzpjYWxndXkxMDAwQGNtc21hZGVzaW1wbGUub3JnIj4mbHQ7Y2FsZ3V5MTAwMEBjbXNtYWRlc2ltcGxlLm9yZyZndDs8L2E+LiBBbGwgUmlnaHRzIEFyZSBSZXNlcnZlZC48L3A+CjxwPlRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Cml0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CnRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCihhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uPC9wPgo8cD5Ib3dldmVyLCBhcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHUEwsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQKYXMgYW4gYWRkb24gbW9kdWxlIHRvIENNUyBNYWRlIFNpbXBsZS4gIFlvdSBtYXkgbm90IHVzZSB0aGlzIHNvZnR3YXJlCmluIGFueSBOb24gR1BMIHZlcnNpb24gb2YgQ01TIE1hZGUgc2ltcGxlLCBvciBpbiBhbnkgdmVyc2lvbiBvZiBDTVMKTWFkZSBzaW1wbGUgdGhhdCBkb2VzIG5vdCBpbmRpY2F0ZSBjbGVhcmx5IGFuZCBvYnZpb3VzbHkgaW4gaXRzIGFkbWluIApzZWN0aW9uIHRoYXQgdGhlIHNpdGUgd2FzIGJ1aWx0IHdpdGggQ01TIE1hZGUgc2ltcGxlLjwvcD4KPHA+VGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCmJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCk1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKT3IgcmVhZCBpdCA8YSBocmVmPSJodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvbGljZW5zZXMuaHRtbCNHUEwiPm9ubGluZTwvYT48L3A+CkVPVDsKJGxhbmdbJ2hlbHBfZXZlbnRfb25faW5jb21pbmdfZXZlbnQnXSA9IDw8PEVPVAo8cD5TZW50IHdoZW4gYSB0cmFuc2FjdGlvbiBvciBldmVudCBpcyByZWNlaXZlZCBhc3luY2hyb25vdXNseSBieSBhIHBheW1lbnQgZ2F0ZXdheS48L3A+CjxoND5QYXJhbWV0ZXJzOjwvaDQ+Cjx1bD4KICA8bGk+Im9yZGVyX2lkIiAtIE9yZGVycyBtb2R1bGUgT3JkZXIgaWQ8L2xpPgogIDxsaT4iaW52b2ljZSIgLSBPcmRlcnMgaW52b2ljZSBzdHJpbmcgPGVtPihub3RlIHRoYXQgb25seSBvbmUgb2Ygb3JkZXJfaWQgb3IgaW52b2ljZSB3aWxsIGJlIGF2YWlsYWJsZSk8L2VtPjwvbGk+CiAgPGxpPiJ0cmFuc2FjdGlvbiIgLSBUcmFuc2FjdGlvbiBpZDwvbGk+CiAgPGxpPiJwYXltZW50X3N0YXR1cyIgLSBQYXltZW50IFN0YXR1czwvbGk+CiAgPGxpPiJhbW91bnQiIC0gUGF5bWVudCBhbW91bnQ8L2xpPgogIDxsaT4iZ2F0ZXdheSIgLSBUaGUgbmFtZSBvZiB0aGUgb3JpZ2luYXRpbmcgZ2F0ZXdheSBtb2R1bGU8L2xpPgo8bGk+Im1lc3NhZ2UiIC0gKG9wdGlvbmFsKSBtZXNzYWdlLjwvbGk+CjwvdWw+CkVPVDsKCiNJCgoKI0oKCgojSwoKCiNMCgoKI00KJGxhbmdbJ21vZGRlc2NyaXB0aW9uJ10gPSAnQSBiYXNlIChza2VsZXRvbikgbW9kdWxlIGZvciBkZXZlbG9wbWVudCBvZiBwYXltZW50IGdhdGV3YXlzIHRvIHVzZSB3aXRoIENhbGd1eXMgRS1Db21tZXJjZSBzdWl0ZSc7CgojTgoKCiNPCgoKI1AKJGxhbmdbJ3Bvc3RpbnN0YWxsJ10gPSAnVGhpcyBtb2R1bGUgaXMgbm93IGluc3RhbGxlZC4uLiBZb3UgY2FuIHByb2NlZWQgd2l0aCBpbnN0YWxsaW5nIG90aGVyIHBheW1lbnQgZ2F0ZXdheXMnOwokbGFuZ1sncG9zdHVuaW5zdGFsbCddID0gJ1RoaXMgbW9kdWxlIGlzIG5vdyB1bmluc3RhbGxlZCc7CgojUQoKCiNSCiRsYW5nWydyZWFsbHlfdW5pbnN0YWxsJ10gPSAnQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRvIHRoaXM/ICBQcm9jZWVkaW5nIG1heSBjYXVzZSBlcnJvcnMgaW4gYSB3b3JraW5nIEUtY29tbWVyY2Ugc2l0ZT8nOwoKI1MKCgojVAoKCiNVCgoKI1YKCgojVwoKCiNYCgoKI1kKCgojWgoKCj8+]]></data>
	</file>
	<file>
	  <filename>/lib/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/class.cgpgb_async_transaction.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKI0JFR0lOX0xJQ0VOU0UKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBNb2R1bGU6IENHUGF5bWVudEdhdGV3YXlCYXNlIChjKSAyMDEwIGJ5IFJvYmVydCBDYW1wYmVsbCAKIyAgICAgICAgIChjYWxndXkxMDAwQGNtc21hZGVzaW1wbGUub3JnKQojICBBbiBhZGRvbiBtb2R1bGUgZm9yIENNUyBNYWRlIFNpbXBsZSB0byBwcm92aWRlIGEgc2tlbGV0b24gbW9kdWxlIHRoYXQKIyAgY2FuIGJlIHVzZWQgdG8gYnVpbGQgb3RoZXIgcGF5bWVudCBnYXRld2F5cy4KIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIENNUyAtIENNUyBNYWRlIFNpbXBsZSBpcyAoYykgMjAwNSBieSBUZWQgS3VscCAod2lzaHlAY21zbWFkZXNpbXBsZS5vcmcpCiMgVGhpcyBwcm9qZWN0J3MgaG9tZXBhZ2UgaXM6IGh0dHA6Ly93d3cuY21zbWFkZXNpbXBsZS5vcmcKIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQojIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIEhvd2V2ZXIsIGFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdQTCwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZAojIGFzIGFuIGFkZG9uIG1vZHVsZSB0byBDTVMgTWFkZSBTaW1wbGUuICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBzb2Z0d2FyZQojIGluIGFueSBOb24gR1BMIHZlcnNpb24gb2YgQ01TIE1hZGUgc2ltcGxlLCBvciBpbiBhbnkgdmVyc2lvbiBvZiBDTVMKIyBNYWRlIHNpbXBsZSB0aGF0IGRvZXMgbm90IGluZGljYXRlIGNsZWFybHkgYW5kIG9idmlvdXNseSBpbiBpdHMgYWRtaW4gCiMgc2VjdGlvbiB0aGF0IHRoZSBzaXRlIHdhcyBidWlsdCB3aXRoIENNUyBNYWRlIHNpbXBsZS4KIwojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQojIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCiMgT3IgcmVhZCBpdCBvbmxpbmU6IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTAojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiNFTkRfTElDRU5TRQoKLyoqCiAqIEBwYWNrYWdlIENhbGd1eQogKiBAYXV0aG9yIGNhbGd1eTEwMDAgPGNhbGd1eTEwMDBAY21zbWFkZXNpbXBsZS5vcmc+CiAqIEBjYXRlZ29yeSBFY29tbWVyY2UKICogQGNvcHlyaWdodCBDb3B5cmlnaHQgMjAxMCAtIFJvYmVydCBDYW1wYmVsbAogKi8KCgovKioKICogQSBjbGFzcyBkZXNjcmliaW5nIGFuIGFzeW5jaG9ub3VzIHRyYW5zYWN0aW9uCiAqCiAqIEBmaW5hbAogKiBAcGFja2FnZSBDYWxndXkKICogQGNhdGVnb3J5IEVjb21tZXJjZQogKiBAY29weXJpZ2h0IENvcHlyaWdodCAyMDEwIC0gUm9iZXJ0IENhbXBiZWxsCiAqLwpjbGFzcyBjZ3BnYl9hc3luY190cmFuc2FjdGlvbgp7CiAgY29uc3QgIFRZUEVfUEFZTUVOVCA9ICdwYXltZW50JzsKICBjb25zdCAgVFlQRV9BREpVU1RNRU5UID0gJ2FkanVzdG1lbnQnOwogIGNvbnN0ICBUWVBFX0hPTERCQUNLID0gJ2hvbGRiYWNrJzsKCiAgcHJpdmF0ZSAkX3R5cGUgPSBzZWxmOjpUWVBFX1BBWU1FTlQ7CiAgcHJpdmF0ZSAkX3N0YXR1czsKICBwcml2YXRlICRfaWQ7CiAgcHJpdmF0ZSAkX2FtdDsKICBwcml2YXRlICRfbXNnOwogIHByaXZhdGUgJF9wYXltZW50X2lkOwogIHByaXZhdGUgJF9vcmRlcl9pZDsKICBwcml2YXRlICRfaW52b2ljZTsKICBwcml2YXRlICRfdXNlcl9pZDsKICBwcml2YXRlICRfb3RoZXJfZGF0YTsKICBwcml2YXRlICRfZ2F0ZXdheTsKCiAgcHJpdmF0ZSAkX2JpbGxpbmdfYWRkcmVzczsKICBwcml2YXRlICRfc2hpcHBpbmdfYWRkcmVzczsKCiAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRvcmRlcl9pZCwkYW10LCRnYXRld2F5ID0gJycpCiAgewogICAgJHRoaXMtPl9vcmRlcl9pZCA9ICRvcmRlcl9pZDsKICAgICR0aGlzLT5fYW10ID0gJGFtdDsKICAgICR0aGlzLT5fZ2F0ZXdheSA9ICRnYXRld2F5OwogIH0KICAKICBwdWJsaWMgZnVuY3Rpb24gc2V0X3R5cGUoJHR5cGUpCiAgewogICAgc3dpdGNoKCAkdHlwZSApCiAgICAgIHsKICAgICAgY2FzZSBzZWxmOjpUWVBFX1BBWU1FTlQ6CiAgICAgIGNhc2Ugc2VsZjo6VFlQRV9BREpVU1RNRU5UOgogICAgICBjYXNlIHNlbGY6OlRZUEVfSE9MREJBQ0s6CgkkdGhpcy0+X3R5cGUgPSAkdHlwZTsKICAgICAgfQogIH0KCiAgcHVibGljIGZ1bmN0aW9uIGdldF90eXBlKCkKICB7CiAgICByZXR1cm4gJHRoaXMtPl90eXBlOwogIH0KCiAgcHVibGljIGZ1bmN0aW9uIHNldF9zdGF0dXMoJHN0YXR1cykKICB7CiAgICBzd2l0Y2goICRzdGF0dXMgKQogICAgICB7CiAgICAgIGNhc2UgUEFZTUVOVF9TVEFUVVNfQVBQUk9WRUQ6CiAgICAgIGNhc2UgUEFZTUVOVF9TVEFUVVNfREVDTElORUQ6CiAgICAgIGNhc2UgUEFZTUVOVF9TVEFUVVNfRVJST1I6CiAgICAgIGNhc2UgUEFZTUVOVF9TVEFUVVNfQ0FOQ0VMTEVEOgogICAgICBjYXNlIFBBWU1FTlRfU1RBVFVTX09USEVSOgogICAgICBjYXNlIFBBWU1FTlRfU1RBVFVTX1BFTkRJTkc6CgkkdGhpcy0+X3N0YXR1cyA9ICRzdGF0dXM7CiAgICAgIH0KICB9CgogIHB1YmxpYyBmdW5jdGlvbiBnZXRfc3RhdHVzKCkKICB7CiAgICByZXR1cm4gJHRoaXMtPl9zdGF0dXM7CiAgfQoKICBwdWJsaWMgZnVuY3Rpb24gc2V0X2lkKCRpZCkKICB7CiAgICAkdGhpcy0+X2lkID0gJGlkOwogIH0KCiAgcHVibGljIGZ1bmN0aW9uIGdldF9pZCgpCiAgewogICAgcmV0dXJuICR0aGlzLT5faWQ7CiAgfQoKICBwdWJsaWMgZnVuY3Rpb24gc2V0X2Ftb3VudCgkYW10KQogIHsKICAgICR0aGlzLT5fYW10ID0gJGFtdDsKICB9CgogIHB1YmxpYyBmdW5jdGlvbiBnZXRfYW1vdW50KCkKICB7CiAgICByZXR1cm4gJHRoaXMtPl9hbXQ7CiAgfQoKICBwdWJsaWMgZnVuY3Rpb24gc2V0X21lc3NhZ2UoJG1zZykKICB7CiAgICAkdGhpcy0+X21zZyA9ICRtc2c7CiAgfQoKICBwdWJsaWMgZnVuY3Rpb24gZ2V0X21lc3NhZ2UoKQogIHsKICAgIHJldHVybiAkdGhpcy0+X21zZzsKICB9CgogIHB1YmxpYyBmdW5jdGlvbiBzZXRfcGF5bWVudF9pZCgkbikKICB7CiAgICAkdGhpcy0+X3BheW1lbnRfaWQgPSAoaW50KSRuOwogIH0KCiAgcHVibGljIGZ1bmN0aW9uIGdldF9wYXltZW50X2lkKCkKICB7CiAgICByZXR1cm4gJHRoaXMtPl9wYXltZW50X2lkOwogIH0KCiAgcHVibGljIGZ1bmN0aW9uIHNldF9vcmRlcl9pZCgkbikKICB7CiAgICAkdGhpcy0+X29yZGVyX2lkID0gKGludCkkbjsKICB9CgogIHB1YmxpYyBmdW5jdGlvbiBnZXRfb3JkZXJfaWQoKQogIHsKICAgIHJldHVybiAkdGhpcy0+X29yZGVyX2lkOwogIH0KCiAgcHVibGljIGZ1bmN0aW9uIHNldF9pbnZvaWNlKCRpbnZvaWNlKQogIHsKICAgICR0aGlzLT5faW52b2ljZSA9IHRyaW0oKHN0cmluZykkaW52b2ljZSk7CiAgfQoKICBwdWJsaWMgZnVuY3Rpb24gZ2V0X2ludm9pY2UoKQogIHsKICAgIHJldHVybiAkdGhpcy0+X2ludm9pY2U7CiAgfQoKICBwdWJsaWMgZnVuY3Rpb24gc2V0X3VzZXJfaWQoJG4pCiAgewogICAgJHRoaXMtPl91c2VyX2lkID0gKGludCkkbjsKICB9CgogIHB1YmxpYyBmdW5jdGlvbiBnZXRfdXNlcl9pZCgpCiAgewogICAgcmV0dXJuICR0aGlzLT5fdXNlcl9pZDsKICB9CgogIHB1YmxpYyBmdW5jdGlvbiBzZXRfb3RoZXJfdmFsKCRrLCR2KQogIHsKICAgIGlmKCAhaXNfYXJyYXkoJHRoaXMtPl9vdGhlcl9kYXRhKSApCiAgICAgIHsKCSR0aGlzLT5fb3RoZXJfZGF0YSA9IGFycmF5KCk7CiAgICAgIH0KICAgICR0aGlzLT5fb3RoZXJfZGF0YVska10gPSAkdjsKICB9CgogIHB1YmxpYyBmdW5jdGlvbiBnZXRfb3RoZXJfdmFsKCRrKQogIHsKICAgIGlmKCAhaXNfYXJyYXkoJHRoaXMtPl9vdGhlcl9kYXRhKSApCiAgICAgIHJldHVybiBudWxsOwogICAgaWYoICFpc3NldCgkdGhpcy0+X290aGVyX2RhdGFbJGtdKSApCiAgICAgIHJldHVybiBudWxsOwogICAgcmV0dXJuICR0aGlzLT5fb3RoZXJfZGF0YVska107CiAgfQoKICBwdWJsaWMgZnVuY3Rpb24gZ2V0X290aGVyX2tleXMoKQogIHsKICAgIGlmKCAhaXNfYXJyYXkoJHRoaXMtPl9vdGhlcl9kYXRhKSApCiAgICAgIHJldHVybiBudWxsOwogICAgcmV0dXJuIGFycmF5X2tleXMoJHRoaXMtPl9vdGhlcl9kYXRhKTsKICB9CgogIHB1YmxpYyBmdW5jdGlvbiBzZXRfYmlsbGluZ19hZGRyZXNzKG9yZGVyc19hZGRyZXNzJiAkYmlsbGluZykKICB7CiAgICAkdGhpcy0+X2JpbGxpbmdfYWRkcmVzcyA9ICRiaWxsaW5nOwogIH0KCiAgcHVibGljIGZ1bmN0aW9uIGdldF9iaWxsaW5nX2FkZHJlc3MoKQogIHsKICAgIHJldHVybiAkdGhpcy0+X2JpbGxpbmdfYWRkcmVzczsKICB9CgogIHB1YmxpYyBmdW5jdGlvbiBzZXRfc2hpcHBpbmdfYWRkcmVzcyhvcmRlcnNfYWRkcmVzcyYgJHNoaXBwaW5nKQogIHsKICAgICR0aGlzLT5fc2hpcHBpbmdfYWRkcmVzcyA9ICRzaGlwcGluZzsKICB9CgogIHB1YmxpYyBmdW5jdGlvbiBnZXRfc2hpcHBpbmdfYWRkcmVzcygpCiAgewogICAgcmV0dXJuICR0aGlzLT5fc2hpcHBpbmdfYWRkcmVzczsKICB9CgogIHB1YmxpYyBmdW5jdGlvbiBzZXRfZ2F0ZXdheSgkbikKICB7CiAgICAkdGhpcy0+X2dhdGV3YXkgPSB0cmltKCRuKTsKICB9CgogIHB1YmxpYyBmdW5jdGlvbiBnZXRfZ2F0ZXdheSgpCiAgewogICAgcmV0dXJuICR0aGlzLT5fZ2F0ZXdheTsKICB9CgogIHB1YmxpYyBmdW5jdGlvbiBpc192YWxpZCgpCiAgewogICAgaWYoICR0aGlzLT5fdHlwZSAmJiAkdGhpcy0+X3N0YXR1cyAmJiAkdGhpcy0+X2lkICYmICR0aGlzLT5fYW10ICYmICR0aGlzLT5fb3JkZXJfaWQgKQogICAgICB7CglyZXR1cm4gVFJVRTsKICAgICAgfQogICAgcmV0dXJuIEZBTFNFOwogIH0KfQoKIwojIEVPRgojCj8+]]></data>
	</file>
	<file>
	  <filename>/method.install.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKI0JFR0lOX0xJQ0VOU0UKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBNb2R1bGU6IENHUGF5bWVudEdhdGV3YXlCYXNlIChjKSAyMDA5IGJ5IFJvYmVydCBDYW1wYmVsbCAKIyAgICAgICAgIChjYWxndXkxMDAwQGNtc21hZGVzaW1wbGUub3JnKQojICBBbiBhZGRvbiBtb2R1bGUgZm9yIENNUyBNYWRlIFNpbXBsZSB0byBwcm92aWRlIGEgc2tlbGV0b24gbW9kdWxlIHRoYXQKIyAgY2FuIGJlIHVzZWQgdG8gYnVpbGQgb3RoZXIgcGF5bWVudCBnYXRld2F5cy4KIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIENNUyAtIENNUyBNYWRlIFNpbXBsZSBpcyAoYykgMjAwNSBieSBUZWQgS3VscCAod2lzaHlAY21zbWFkZXNpbXBsZS5vcmcpCiMgVGhpcyBwcm9qZWN0J3MgaG9tZXBhZ2UgaXM6IGh0dHA6Ly93d3cuY21zbWFkZXNpbXBsZS5vcmcKIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQojIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIEhvd2V2ZXIsIGFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdQTCwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZAojIGFzIGFuIGFkZG9uIG1vZHVsZSB0byBDTVMgTWFkZSBTaW1wbGUuICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBzb2Z0d2FyZQojIGluIGFueSBOb24gR1BMIHZlcnNpb24gb2YgQ01TIE1hZGUgc2ltcGxlLCBvciBpbiBhbnkgdmVyc2lvbiBvZiBDTVMKIyBNYWRlIHNpbXBsZSB0aGF0IGRvZXMgbm90IGluZGljYXRlIGNsZWFybHkgYW5kIG9idmlvdXNseSBpbiBpdHMgYWRtaW4gCiMgc2VjdGlvbiB0aGF0IHRoZSBzaXRlIHdhcyBidWlsdCB3aXRoIENNUyBNYWRlIHNpbXBsZS4KIwojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQojIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCiMgT3IgcmVhZCBpdCBvbmxpbmU6IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTAojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiNFTkRfTElDRU5TRQoKJHRoaXMtPkNyZWF0ZUV2ZW50KCdvbl9pbmNvbWluZ19ldmVudCcpOwoKIwojIEVPRgojCj8+]]></data>
	</file>
	<file>
	  <filename>/method.uninstall.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKI0JFR0lOX0xJQ0VOU0UKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBNb2R1bGU6IENHUGF5bWVudEdhdGV3YXlCYXNlIChjKSAyMDA5IGJ5IFJvYmVydCBDYW1wYmVsbCAKIyAgICAgICAgIChjYWxndXkxMDAwQGNtc21hZGVzaW1wbGUub3JnKQojICBBbiBhZGRvbiBtb2R1bGUgZm9yIENNUyBNYWRlIFNpbXBsZSB0byBwcm92aWRlIGEgc2tlbGV0b24gbW9kdWxlIHRoYXQKIyAgY2FuIGJlIHVzZWQgdG8gYnVpbGQgb3RoZXIgcGF5bWVudCBnYXRld2F5cy4KIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIENNUyAtIENNUyBNYWRlIFNpbXBsZSBpcyAoYykgMjAwNSBieSBUZWQgS3VscCAod2lzaHlAY21zbWFkZXNpbXBsZS5vcmcpCiMgVGhpcyBwcm9qZWN0J3MgaG9tZXBhZ2UgaXM6IGh0dHA6Ly93d3cuY21zbWFkZXNpbXBsZS5vcmcKIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQojIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIEhvd2V2ZXIsIGFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdQTCwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZAojIGFzIGFuIGFkZG9uIG1vZHVsZSB0byBDTVMgTWFkZSBTaW1wbGUuICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBzb2Z0d2FyZQojIGluIGFueSBOb24gR1BMIHZlcnNpb24gb2YgQ01TIE1hZGUgc2ltcGxlLCBvciBpbiBhbnkgdmVyc2lvbiBvZiBDTVMKIyBNYWRlIHNpbXBsZSB0aGF0IGRvZXMgbm90IGluZGljYXRlIGNsZWFybHkgYW5kIG9idmlvdXNseSBpbiBpdHMgYWRtaW4gCiMgc2VjdGlvbiB0aGF0IHRoZSBzaXRlIHdhcyBidWlsdCB3aXRoIENNUyBNYWRlIHNpbXBsZS4KIwojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQojIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCiMgT3IgcmVhZCBpdCBvbmxpbmU6IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTAojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiNFTkRfTElDRU5TRQoKJHRoaXMtPlJlbW92ZUV2ZW50KCdvbl9pbmNvbWluZ19ldmVudCcpOwoKIwojIEVPRgojCj8+]]></data>
	</file>
	<file>
	  <filename>/method.upgrade.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKI0JFR0lOX0xJQ0VOU0UKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBNb2R1bGU6IENHUGF5bWVudEdhdGV3YXlCYXNlIChjKSAyMDA5IGJ5IFJvYmVydCBDYW1wYmVsbCAKIyAgICAgICAgIChjYWxndXkxMDAwQGNtc21hZGVzaW1wbGUub3JnKQojICBBbiBhZGRvbiBtb2R1bGUgZm9yIENNUyBNYWRlIFNpbXBsZSB0byBwcm92aWRlIGEgc2tlbGV0b24gbW9kdWxlIHRoYXQKIyAgY2FuIGJlIHVzZWQgdG8gYnVpbGQgb3RoZXIgcGF5bWVudCBnYXRld2F5cy4KIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIENNUyAtIENNUyBNYWRlIFNpbXBsZSBpcyAoYykgMjAwNSBieSBUZWQgS3VscCAod2lzaHlAY21zbWFkZXNpbXBsZS5vcmcpCiMgVGhpcyBwcm9qZWN0J3MgaG9tZXBhZ2UgaXM6IGh0dHA6Ly93d3cuY21zbWFkZXNpbXBsZS5vcmcKIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQojIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIEhvd2V2ZXIsIGFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdQTCwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZAojIGFzIGFuIGFkZG9uIG1vZHVsZSB0byBDTVMgTWFkZSBTaW1wbGUuICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBzb2Z0d2FyZQojIGluIGFueSBOb24gR1BMIHZlcnNpb24gb2YgQ01TIE1hZGUgc2ltcGxlLCBvciBpbiBhbnkgdmVyc2lvbiBvZiBDTVMKIyBNYWRlIHNpbXBsZSB0aGF0IGRvZXMgbm90IGluZGljYXRlIGNsZWFybHkgYW5kIG9idmlvdXNseSBpbiBpdHMgYWRtaW4gCiMgc2VjdGlvbiB0aGF0IHRoZSBzaXRlIHdhcyBidWlsdCB3aXRoIENNUyBNYWRlIHNpbXBsZS4KIwojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQojIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCiMgT3IgcmVhZCBpdCBvbmxpbmU6IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTAojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiNFTkRfTElDRU5TRQoKJHRoaXMtPkNyZWF0ZUV2ZW50KCdvbl9pbmNvbWluZ19ldmVudCcpOwoKIwojIEVPRgojCj8+]]></data>
	</file>
</module>
