<?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>CGGoogleMaps</name>
	<version>1.1</version>
  <mincmsversion>1.3.1</mincmsversion>
	<help>PGgzPldoYXQgZG9lcyB0aGlzIGRvPC9oMz4KPHA+VGhpcyBpcyBhIHJlcGxhY2VtZW50IChpbiBwcm9ncmVzcykgZm9yIHRzdydzIGdvb2dsZW1hcHMgbW9kdWxlIHRoYXQgYWxsb3dzIHVzZXJzIHRvIGVhc2lseSBjcmVhdGUgZ29vZ2xlIG1hcHMsIHdoaWxzdCBhbGxvd2luZyBhdG9taWMgcGVybWlzc2lvbnMgc28gdGhhdCBvbmx5IGF1dGhvcml6ZWQgdXNlcnMgaGF2ZSBjZXJ0YWluIGFiaWxpdGllcy4gIEl0IGFsc28gYWxsb3dzIGZvciBkeW5hbWljIGdlb2xvY2F0aW5nICh3aXRoIGNhY2hpbmcpIHNvIHRoYXQgeW91IGNhbiBzcGVjaWZ5IGEgbG9jYXRpb24gYnkgYWRkcmVzcyBpbnN0ZWFkIG9mIGJ5IGxhdGl0dWRlIGFuZCBsb25naXR1ZGUuPC9wPgo8cD5UaGlzIG1vZHVsZSBhbGxvd3MgbXVsdGlwbGUgbWFwcyB0byBiZSBkaXNwbGF5ZWQgb24gYSBzaW5nbGUgcGFnZSwgYW5kIG11bHRpcGxlICdtYXJrZXJzJyBvciBwb2ludHMgb24gZWFjaCBtYXAsIHNvIHRoYXQgaXQgY2FuIGJlIHVzZWQgaW4gYSB3YXkgc2ltaWxhciB0byBmcmFwcGVyLjwvcD4KPGgzPkhvdyBEbyBJIFVzZSBJdD88L2gzPgo8dWw+CjxsaT5JbnN0YWxsIHRoZSBtb2R1bGUgdmlhIHRoZSBub3JtYWwgbWV0aG9kczwvbGk+CjxsaT5TZXR1cCB5b3VyIHVzZXJzIGFuZCBncm91cHMgd2l0aCB0aGUgYXBwcm9wcmlhdGUgcGVybWlzc2lvbnM6CiAgPHVsPgogICAgPGxpPlRoZSAnTWFuYWdlIE1hcHMnIFBlcm1pc3Npb24gYWxsb3dzIGFkbWluaXN0cmF0b3JzIHRvIGFkZC9lZGl0IGFuZCBkZWxldGUgbWFwczwvbGk+CiAgICA8bGk+VGhlICdNYW5hZ2UgTWFwIExvY2F0aW9ucycgcGVybWlzc2lvbiBhbGxvd3MgYWRtaW5pc3RyYXRvcnMgdG8gYWRkL2VkaXQvZGVsZXRlIHBvaW50cyB3aXRoaW4gYSBtYXA8L2xpPgogIDwvdWw+CjwvbGk+CjxsaT5DcmVhdGUgYSBtYXAuICBHaXZlIHRoZSBtYXAgYSBuYW1lLCBhbmQgYWRqdXN0IHRoZSBwYXJhbXRlcnMgb2YgdGhlIHBhcnRpY3VsYXIgbWFwIHRvIG1lZXQgeW91ciBsaWtpbmc8L3A+CjxsaT5NYXJrIG9uZSBvZiB5b3VyIG1hcHMgYXMgZGVmYXVsdCwgYnkgY2xpY2tpbmcgb24gdGhlIHJlZCAnWCcgYmVzaWRlIGEgcGFydGljdWxhciBtYXAuICBUaGlzIGlzIHVzZWZ1bCBpZiB5b3UgZG9uJ3Qgc3BlY2lmeSB0aGUgJ21hcCcgcGFyYW1ldGVyIG9uIHRoZSB0YWcuPC9saT4KPGxpPkNyZWF0ZSBvbmUgb3IgbW9yZSBwb2ludHMgd2l0aGluIHRoZSBtYXAsIGVpdGhlciBieSBzcGVjaWZ5aW5nIGEgbGF0aXR1ZGUgYW5kIGxvbmdpdHVkZSwgb3Igd2l0aCBhbiBhZGRyZXNzLjwvbGk+CjxsaT5BZGQgdGhlIHtDR0dvb2dsZU1hcHN9IHRhZyBpbnNpZGUgdGhlIGNvbnRlbnQgYmxvY2sgb2YgYSBwYWdlLCBvciBpbnNpZGUgYSBwYWdlIHRlbXBsYXRlLiAgVGhlbiB5b3UncmUgZmluaXNoZWQuPC9saT4KPC91bD4KPGJyLz4KPGgzPkFkZGluZyBQb2ludHMgdG8gYSBNYXAgRHluYW1pY2FsbHk8L2gzPgo8cD5Zb3UgY2FuIHVzZSBzbWFydHkgdG8gYWRkIHBvaW50cyB0byBhIG1vZHVsZSBkeW5hbWljYWxseS4gIFlvdSBjYW4gdXNlIHRoaXMgZnVuY3Rpb25hbGl0eSB0byBidWlsZCBhIGZyYXBwciBsaWtlIG1hcCB3aXRoIG11bHRpcGxlIHBvaW50cyB0aGF0IGFyZSBjb250cm9sbGVkIGR5bmFtaWNhbGx5IGZyb20gYW5vdGhlciBtb2R1bGUgKGxpa2UgQ29tcGFueURpcmVjdG9yeSBvciBGcm9udEVuZFVzZXJzKS48L3A+CjxoND5UaGUge2NnZ21fYWRkX2R5bnBvaW50fSBTbWFydHkgUGx1Z2luPC9oND4KPHA+VGhpcyBzbWFydHkgcGx1Z2luIDxlbT4ob25seSBhdmFpbGFibGUgd2hlbiBDR0dvb2dsZU1hcHMgaXMgaW5zdGFsbGVkKTwvZW0+IGFsbG93cyBhZGRpbmcgYSBwb2ludCBkeW5hbWljYWxseSB0byBhIHNwZWNpZmllZCBtYXAuPC9wPgo8aDU+UGFyYW1ldGVyczo8aDU+CiAgPHVsPiAKPGxpPjxzdHJvbmc+cmVxdWlyZWQ8L3N0cm9uZz4gLSBtYXAgOiBUaGUgSUQgb2YgdGhlIG1hcCB0byBhZGQgdGhlIHBvaW50IHRvPC9saT4KPGxpPjxzdHJvbmc+cmVxdWlyZWQ8L3N0cm9uZz4gLSBuYW1lIDogVGhlIG5hbWUgb2YgdGhlIHBvaW50IHRvIGFkZDwvbGk+CjxsaT48ZW0+b3B0aW9uYWw8L2VtPiAtIGRlc2NyaXB0aW9uIDogVGhlIEhUTUwgY29udGVudCB0byBzaG93IGluIHRoZSBwb3B1cCBidWJibGU8L2xpPgo8bGk+PGVtPm9wdGlvbmFsPC9lbT4gLSBhZGRyZXNzIDogVGhlIGFkZHJlc3Mgb2YgdGhlIGxvY2F0aW9uIHlvdSBhcmUgYWRkaW5nLjwvbGk+CjxsaT48ZW0+b3B0aW9uYWw8L2VtPiAtIGxhdCA6IFRoZSBsYXRpdHVkZSBvZiB0aGUgbG9jYXRpb24geW91IGFyZSBhZGRpbmcuPC9saT4KPGxpPjxlbT5vcHRpb25hbDwvZW0+IC0gbG9uZyA6IFRoZSBsb25naXR1ZGUgb2YgdGhlIGxvY2F0aW9uIHlvdSBhcmUgYWRkaW5nLjwvbGk+CiAgPC91bD4KPGJyLz4KPHA+PHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiBFaXRoZXIgdGhlIGxhdCBhbmQgbG9uZyBwYXJhbWV0ZXJzIG11c3QgYmUgc3BlY2lmaWVkLCBvciB0aGUgYWRkcmVzcy48L3A+CjxwPjxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gVGhpcyBwbHVnaW4gcmV0dXJucyBubyBkaXJlY3Qgb3V0cHV0LCBhbmQgaWYgZXJyb3JzIG9jY3VyLCBpdCB3aWxsIHNpbGVudGx5IGZhaWwuICBTdWNjZXNzIG1lYW5zIHRoYXQgdGhlIHBvaW50IHdpbGwgc2hvdyB1cCBvbiB5b3VyIGdvb2dsZSBtYXAuPC9wPgo8L3VsPjxoMz5EZXBlbmRlbmNpZXM8L2gzPjx1bD48bGk+Q0dFeHRlbnNpb25zID0mZ3Q7IDEuMjwvbGk+PC91bD48aDM+UGFyYW1ldGVyczwvaDM+PHVsPjxsaT48ZW0+KG9wdGlvbmFsKTwvZW0+IGxhbmc9ImVuX1VTIiAtIFBhcmFtZXRlciBpcyB1c2VkIHRvIHNwZWNpZnkgd2hhdCBsYW5ndWFnZSB0byB1c2UgZm9yIGRpc3BsYXkgb24gdGhlIGZyb250ZW5kLiBOb3QgYWxsIG1vZHVsZXMgc3VwcG9ydCBvciBuZWVkIHRoaXMuPC9saT48bGk+PGVtPihvcHRpb25hbCk8L2VtPiBtYXA9IiIgLSBTcGVjaWZ5IHRoZSBJRCBvciBtYXAgbmFtZSB0byB1c2UgZm9yIGxheWluZyBvdXQgdGhlIGdvb2dsZSBtYXAuICBJZiB0aGlzIHBhcmFtZXRlciBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgZGVmYXVsdCBtYXAgKGlmIGFueSkgaXMgdXNlZC48L2xpPjwvdWw+</help>
	<about>PGJyIC8+QXV0aG9yOiBjYWxndXkxMDAwICZsdDtjYWxndXkxMDAwQGhvdG1haWwuY29tJmd0OzxiciAvPjxiciAvPlZlcnNpb246IDEuMTxiciAvPjxiciAvPkNoYW5nZSBIaXN0b3J5OjxiciAvPjx1bD4KPGxpPjEuMCAtIERlY2VtYmVyLCAyMDA3CiAgPHA+SW5pdGlhbCBSZWxlYXNlPC9wPjwvdWw+CjxsaT4xLjEgLSBKdWx5LCAyMDA4CiAgPHA+QWRkZWQgdGhlIHtjZ2dtX2FkZF9keW5wb2ludH0gc21hcnR5IHBsdWdpbiB0byBhbGxvdyBhZGRpbmcgcG9pbnRzIHRvIHRoZSBtYXAgZHluYW1pY2FsbHkgd2l0aGluIHNtYXJ0eS48L3A+PC91bD4KPC91bD48YnIgLz4=</about>
	<description>A simple module for creating google maps</description>
	<requires>
	  <requiredname>CGExtensions</requiredname>
	  <requiredversion>1.2</requiredversion>
	</requires>
	<file>
	  <filename>/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/action.admin_addmappoint.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBNb2R1bGU6IENHR29vZ2xlTWFwcyAtIEEgc2ltcGxlIG1vZHVsZSBmb3IgY3JlYXRpbmcgZ29vZ2xlIG1hcHMuCiMgVmVyc2lvbjogMS4wLCBjYWxndXkxMDAwIDxjYWxndXkxMDAwQGhvdG1haWwuY29tPgojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgQ01TIC0gQ01TIE1hZGUgU2ltcGxlIGlzIChjKSAyMDA1IGJ5IFRlZCBLdWxwICh3aXNoeUBjbXNtYWRlc2ltcGxlLm9yZykKIyBUaGlzIHByb2plY3QncyBob21lcGFnZSBpczogaHR0cDovL3d3dy5jbXNtYWRlc2ltcGxlLm9yZwojIFRoZSBtb2R1bGUncyBob21lcGFnZSBpczogaHR0cDovL2Rldi5jbXNtYWRlc2ltcGxlLm9yZy9wcm9qZWN0cy9za2VsZXRvbi8KIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQojIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQojIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCiMgT3IgcmVhZCBpdCBvbmxpbmU6IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTAojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmlmKCAhaXNzZXQoJGdDbXMpICkgZXhpdCgpOwppZiggISR0aGlzLT5DaGVja1Blcm1pc3Npb24oJ01hbmFnZSBNYXAgTG9jYXRpb25zJykgKQogIHsKICAgIGVjaG8gJHRoaXMtPlNob3dFcnJvcnMoJHRoaXMtPkxhbmcoJ2Vycm9yX3Blcm1pc3Npb25kZW5pZWQnKSk7CiAgICByZXR1cm47CiAgfQppZiggIWlzc2V0KCRwYXJhbXNbJ21hcF9pZCddKSApCiAgewogICAgZWNobyAkdGhpcy0+U2hvd0Vycm9ycygkdGhpcy0+TGFuZygnZXJyb3JfaW52YWxpZHBhcmFtcycpKTsKICAgIHJldHVybjsKICB9CiRtYXBfaWQgPSAoaW50KSRwYXJhbXNbJ21hcF9pZCddOwoKLy8gR2V0IHRoZSBkZXRhaWxzIGFib3V0IHRoZSBtYXAKJHF1ZXJ5ID0gJ1NFTEVDVCAqIEZST00gJy5jbXNfZGJfcHJlZml4KCkuJ21vZHVsZV9jZ2dvb2dsZW1hcHMKICAgICAgICAgICBXSEVSRSBtYXBfaWQgPSA/JzsKJG1hcGluZm8gPSAkZGItPkdldFJvdyggJHF1ZXJ5LCBhcnJheSggJG1hcF9pZCApICk7CmlmKCAhJG1hcGluZm8gKQogIHsKICAgIGVjaG8gJHRoaXMtPlNob3dFcnJvcnMoJHRoaXMtPkxhbmcoJ2Vycm9yX2ludmFsaWRwYXJhbXMnKSk7CiAgICByZXR1cm47CiAgfQoKLy8gZGVmYXVsdCB2YXJpYWJsZXMKJG5hbWUgPSAnJzsKJGluZm8gPSAnJzsKJGFkZHJlc3MgPSAnJzsKJGxhdGl0dWRlID0gJyc7CiRsb25naXR1ZGUgPSAnJzsKCmlmKCBpc3NldCgkcGFyYW1zWydtYXJrZXJfaWQnXSkgKQogIHsKICAgIC8vIGxvYWQgdGhlIG1hcmtlciAKICAgICRxdWVyeSA9ICdTRUxFQ1QgKiBGUk9NICcuY21zX2RiX3ByZWZpeCgpLidtb2R1bGVfY2dnb29nbGVtYXBzX3BvaW50cwogICAgICAgICAgICAgICBXSEVSRSBtYXBfaWQgPSA/IEFORCBtYXJrZXJfaWQgPSA/JzsKICAgICRyb3cgPSAkZGItPkdldFJvdyggJHF1ZXJ5LCBhcnJheSggJG1hcF9pZCwgJHBhcmFtc1snbWFya2VyX2lkJ10gKSApOwogICAgaWYoICEkcm93ICkKICAgICAgewoJZWNobyAkdGhpcy0+U2hvd0Vycm9ycygkdGhpcy0+TGFuZygnZXJyb3JfaW52YWxpZHBhcmFtcycpKTsKCXJldHVybjsKICAgICAgfQoKICAgICRuYW1lID0gJHJvd1snbmFtZSddOwogICAgJGluZm8gPSAkcm93WydpbmZvJ107CiAgICAkYWRkcmVzcyA9ICRyb3dbJ2FkZHJlc3MnXTsKICAgICRsYXRpdHVkZSA9ICRyb3dbJ2xhdCddOwogICAgJGxvbmdpdHVkZSA9ICRyb3dbJ2xvbiddOwogIH0KCgovLyBoYW5kbGUgZm9ybSBhY3Rpb25zCmlmKCBpc3NldCgkcGFyYW1zWydjYW5jZWwnXSkgKQogIHsKICAgICR0aGlzLT5SZWRpcmVjdCgkaWQsJ2FkbWluX2VkaXRtYXBwb2ludHMnLCRyZXR1cm5pZCxhcnJheSgnbWFwX2lkJz0+JG1hcF9pZCkpOwogICAgcmV0dXJuOwogIH0KZWxzZSBpZiggaXNzZXQoJHBhcmFtc1snc3VibWl0J10pICkKICB7CiAgICAvLwogICAgLy8gaGFuZGxlIHRoZSBzdWJtaXQKICAgIC8vCiAgICBpZiggaXNzZXQoJHBhcmFtc1snbmFtZSddKSApICRuYW1lID0gdHJpbSgkcGFyYW1zWyduYW1lJ10pOwogICAgaWYoIGlzc2V0KCRwYXJhbXNbJ2luZm8nXSkgKSAkaW5mbyA9IHRyaW0oJHBhcmFtc1snaW5mbyddKTsKICAgIGlmKCBpc3NldCgkcGFyYW1zWydhZGRyZXNzJ10pICkgJGFkZHJlc3MgPSB0cmltKCRwYXJhbXNbJ2FkZHJlc3MnXSk7CiAgICBpZiggaXNzZXQoJHBhcmFtc1snbGF0aXR1ZGUnXSkgKSAkbGF0aXR1ZGUgPSB0cmltKCRwYXJhbXNbJ2xhdGl0dWRlJ10pOwogICAgaWYoIGlzc2V0KCRwYXJhbXNbJ2xvbmdpdHVkZSddKSApICRsb25naXR1ZGUgPSB0cmltKCRwYXJhbXNbJ2xvbmdpdHVkZSddKTsKCiAgICBpZiggJG5hbWUgPT0gJycgfHwKCSgkYWRkcmVzcyA9PSAnJyAmJiAoJGxhdGl0dWRlID09ICcnIHx8ICRsb25naXR1ZGUgPT0gJycgKSkgKQogICAgICB7CgllY2hvICR0aGlzLT5TaG93RXJyb3JzKCR0aGlzLT5MYW5nKCdlcnJvcl9pbnZhbGlkcGFyYW1zJykpOwogICAgICB9CiAgICBlbHNlCiAgICAgIHsKCS8vIG1hcCBpbmZvIGlzIHZhbGlkCglpZiggaXNzZXQoJHBhcmFtc1snbWFya2VyX2lkJ10pICkKCSAgewoJICAgIC8vIHVwZGF0ZSB0aGUgcG9pbnQKCSAgICAvLyBub3RlLCBkdXBsaWNhdGUgbmFtZXMgYXJlIHZhbGlkIGluIHRoaXMgdGFibGUKCSAgICAkcXVlcnkgPSAnVVBEQVRFICcuY21zX2RiX3ByZWZpeCgpLidtb2R1bGVfY2dnb29nbGVtYXBzX3BvaW50cwogICAgICAgICAgICAgICAgICAgICAgICAgU0VUIG5hbWUgPSA/LCBpbmZvID0gPywgYWRkcmVzcyA9ID8sIGxhdCA9ID8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uID0gPwogICAgICAgICAgICAgICAgICAgICAgIFdIRVJFIG1hcF9pZCA9ID8gQU5EIG1hcmtlcl9pZCA9ID8nOwoJICAgICRkYnIgPSAkZGItPkV4ZWN1dGUoICRxdWVyeSwgYXJyYXkoJG5hbWUsJGluZm8sJGFkZHJlc3MsJGxhdGl0dWRlLAoJCQkJCSAgICAgICAkbG9uZ2l0dWRlLAoJCQkJCSAgICAgICAkbWFwX2lkLCRwYXJhbXNbJ21hcmtlcl9pZCddKSk7CgkgIH0KCWVsc2UKCSAgewoJICAgIC8vIGluc2VydCB0aGUgcG9pbnQKCSAgICAvLyBub3RlLCBkdXBsaWNhdGUgbmFtZXMgYXJlIHZhbGlkIGluIHRoaXMgdGFibGUKCSAgICAkcXVlcnkgPSAnSU5TRVJUIElOVE8gJy5jbXNfZGJfcHJlZml4KCkuJ21vZHVsZV9jZ2dvb2dsZW1hcHNfcG9pbnRzCiAgICAgICAgICAgICAgICAgICAgKG1hcF9pZCwgbmFtZSwgaW5mbywgYWRkcmVzcywgbGF0LCBsb24pCiAgICAgICAgICAgICAgICAgIFZBTFVFUyAoPywgPyw/LD8sPyw/KSc7CgkgICAgJGRiciA9ICRkYi0+RXhlY3V0ZSggJHF1ZXJ5LCBhcnJheSgkbWFwX2lkLCRuYW1lLCRpbmZvLCRhZGRyZXNzLAoJCQkJCSAgICAgICAkbGF0aXR1ZGUsJGxvbmdpdHVkZSkpOwoJICB9CglpZiggISRkYnIgKQoJICB7CgkgICAgZWNobyAiREVCVUc6IGVycm9yID0gIi4kZGItPkVycm9yTXNnKCkuJzxici8+Jy4kZGItPnNxbDsKCSAgICBkaWUoKTsKCSAgfQoJCgkkdGhpcy0+UmVkaXJlY3QoJGlkLCdhZG1pbl9lZGl0bWFwcG9pbnRzJywkcmV0dXJuaWQsYXJyYXkoJ21hcF9pZCc9PiRtYXBfaWQpKTsKICAgICAgfQogIH0KCi8vIGJ1aWxkIHRoZSBmb3JtCmlmKCBpc3NldCgkcGFyYW1zWydtYXJrZXJfaWQnXSkgKQogIHsKICAgICRzbWFydHktPmFzc2lnbignaGlkZGVuJywKCQkgICAgJHRoaXMtPkNyZWF0ZUlucHV0SGlkZGVuKCRpZCwnbWFya2VyX2lkJywkcGFyYW1zWydtYXJrZXJfaWQnXSkpOwogIH0KCiRzbWFydHktPmFzc2lnbignZm9ybXN0YXJ0JywKCQkkdGhpcy0+Q0dDcmVhdGVGb3JtU3RhcnQoJGlkLCdhZG1pbl9hZGRtYXBwb2ludCcsJHJldHVybmlkLAoJCQkJCSBhcnJheSgnbWFwX2lkJz0+JG1hcF9pZCkpKTsKJHNtYXJ0eS0+YXNzaWduKCdmb3JtZW5kJywkdGhpcy0+Q3JlYXRlRm9ybUVuZCgpKTsKJHNtYXJ0eS0+YXNzaWduKCd0aXRsZScsJHRoaXMtPkxhbmcoJ2FkZF9wb2ludF9mb3JfbWFwJywkbWFwaW5mb1snbmFtZSddKSk7CiRzbWFydHktPmFzc2lnbignc3VibWl0JywkdGhpcy0+Q3JlYXRlSW5wdXRTdWJtaXQoJGlkLCdzdWJtaXQnLCR0aGlzLT5MYW5nKCdzdWJtaXQnKSkpOwokc21hcnR5LT5hc3NpZ24oJ2NhbmNlbCcsJHRoaXMtPkNyZWF0ZUlucHV0U3VibWl0KCRpZCwnY2FuY2VsJywkdGhpcy0+TGFuZygnY2FuY2VsJykpKTsKCiRzbWFydHktPmFzc2lnbigncHJvbXB0X25hbWUnLCR0aGlzLT5MYW5nKCdwb2ludF9uYW1lJykpOwokc21hcnR5LT5hc3NpZ24oJ2lucHV0X25hbWUnLCR0aGlzLT5DcmVhdGVJbnB1dFRleHQoJGlkLCduYW1lJywkbmFtZSw0MCw4MCkpOwokc21hcnR5LT5hc3NpZ24oJ3Byb21wdF9pbmZvJywkdGhpcy0+TGFuZygndGV4dCcpKTsKJHNtYXJ0eS0+YXNzaWduKCdpbnB1dF9pbmZvJywkdGhpcy0+Q3JlYXRlVGV4dEFyZWEodHJ1ZSwkaWQsJGluZm8sJ2luZm8nKSk7CiRzbWFydHktPmFzc2lnbigncHJvbXB0X2FkZHJlc3MnLCR0aGlzLT5MYW5nKCdhZGRyZXNzJykpOwokc21hcnR5LT5hc3NpZ24oJ2lucHV0X2FkZHJlc3MnLCR0aGlzLT5DcmVhdGVJbnB1dFRleHQoJGlkLCdhZGRyZXNzJywkYWRkcmVzcywxMDAsMjU1KSk7CiRzbWFydHktPmFzc2lnbigncHJvbXB0X2xhdCcsJHRoaXMtPkxhbmcoJ2xhdGl0dWRlJykpOwokc21hcnR5LT5hc3NpZ24oJ2lucHV0X2xhdCcsJHRoaXMtPkNyZWF0ZUlucHV0VGV4dCgkaWQsJ2xhdGl0dWRlJywkbGF0aXR1ZGUsMTAsMTUpKTsKJHNtYXJ0eS0+YXNzaWduKCdwcm9tcHRfbG9uJywkdGhpcy0+TGFuZygnbG9uZ2l0dWRlJykpOwokc21hcnR5LT5hc3NpZ24oJ2lucHV0X2xvbicsJHRoaXMtPkNyZWF0ZUlucHV0VGV4dCgkaWQsJ2xvbmdpdHVkZScsJGxvbmdpdHVkZSwxMCwxNSkpOwokc21hcnR5LT5hc3NpZ24oJ2luZm9fYWRkcmVzc19sYXRsb25nJywkdGhpcy0+TGFuZygnaW5mb19hZGRyZXNzX2xhdGxvbmcnKSk7CgovLyBwcm9jZXNzIHRoZSB0ZW1wbGF0ZQplY2hvICR0aGlzLT5Qcm9jZXNzVGVtcGxhdGUoJ2FkZG1hcHBvaW50LnRwbCcpOwoKLy8gRU9GCj8+]]></data>
	</file>
	<file>
	  <filename>/action.admin_add_map.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBNb2R1bGU6IENHR29vZ2xlTWFwcyAtIEEgc2ltcGxlIG1vZHVsZSBmb3IgY3JlYXRpbmcgZ29vZ2xlIG1hcHMuCiMgVmVyc2lvbjogMS4wLCBjYWxndXkxMDAwIDxjYWxndXkxMDAwQGhvdG1haWwuY29tPgojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgQ01TIC0gQ01TIE1hZGUgU2ltcGxlIGlzIChjKSAyMDA1IGJ5IFRlZCBLdWxwICh3aXNoeUBjbXNtYWRlc2ltcGxlLm9yZykKIyBUaGlzIHByb2plY3QncyBob21lcGFnZSBpczogaHR0cDovL3d3dy5jbXNtYWRlc2ltcGxlLm9yZwojIFRoZSBtb2R1bGUncyBob21lcGFnZSBpczogaHR0cDovL2Rldi5jbXNtYWRlc2ltcGxlLm9yZy9wcm9qZWN0cy9za2VsZXRvbi8KIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQojIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQojIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCiMgT3IgcmVhZCBpdCBvbmxpbmU6IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTAojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmlmKCAhaXNzZXQoJGdDbXMpICkgZXhpdCgpOwppZiggISR0aGlzLT5DaGVja1Blcm1pc3Npb24oJ01hbmFnZSBNYXBzJykgKQogIHsKICAgIGVjaG8gJHRoaXMtPlNob3dFcnJvcnMoJHRoaXMtPkxhbmcoJ2Vycm9yX3Blcm1pc3Npb25kZW5pZWQnKSk7CiAgICByZXR1cm47CiAgfQokdGhpcy0+U2V0Q3VycmVudFRhYignbWFwcycpOwoKJG5hbWUgPSAnJzsKJGRlc2NyaXB0aW9uID0gJyc7CiRjZW50ZXJfbGF0ID0gJyc7CiRjZW50ZXJfbG9uID0gJyc7CiR0eXBlID0gJ21hcCc7CiR3aWR0aCA9IDQwMDsKJGhlaWdodCA9IDQwMDsKJGNvbnRyb2xzID0gMTsKJGNvbnRyb2xzX3NpemUgPSAnbGFyZ2UnOwokdHlwZV9jb250cm9scyA9IDE7CiRzaWRlYmFyID0gMDsKJGRpcmVjdGlvbnMgPSAwOwokem9vbSA9IDc7CiR6b29tX2VuY29tcGFzcyA9IDE7CiRpbmZvX3dpbmRvdyA9IDE7CiRpbmZvX3RyaWdnZXIgPSAnY2xpY2snOwoKaWYoIGlzc2V0KCRwYXJhbXNbJ21hcF9pZCddICkgKQogIHsKICAgICRxdWVyeSA9ICdTRUxFQ1QgKiBGUk9NICcuY21zX2RiX3ByZWZpeCgpLidtb2R1bGVfY2dnb29nbGVtYXBzIAogICAgICAgICAgICAgICBXSEVSRSBtYXBfaWQgPSA/JzsKICAgICRyb3cgPSAkZGItPkdldFJvdygkcXVlcnksIGFycmF5KCRwYXJhbXNbJ21hcF9pZCddKSk7CiAgICBpZiggISRyb3cgKQogICAgICB7CgllY2hvICR0aGlzLT5TaG93RXJyb3JzKCR0aGlzLT5MYW5nKCdlcnJvcl9pbnZhbGlkcGFyYW1zJykpOwogICAgICB9CiAgICAkbmFtZSA9ICRyb3dbJ25hbWUnXTsKICAgICRkZXNjcmlwdGlvbiA9ICRyb3dbJ2Rlc2NyaXB0aW9uJ107CiAgICAkY2VudGVyX2xhdCA9ICRyb3dbJ2NlbnRlcl9sYXQnXTsKICAgICRjZW50ZXJfbG9uID0gJHJvd1snY2VudGVyX2xvbiddOwogICAgJHR5cGUgPSAkcm93Wyd0eXBlJ107CiAgICAkd2lkdGggPSAkcm93Wyd3aWR0aCddOwogICAgJGhlaWdodCA9ICRyb3dbJ2hlaWdodCddOwogICAgJGNvbnRyb2xzID0gJHJvd1snY29udHJvbHMnXTsKICAgICRjb250cm9sc19zaXplID0gJHJvd1snY29udHJvbHNfc2l6ZSddOwogICAgJHR5cGVfY29udHJvbHMgPSAkcm93Wyd0eXBlX2NvbnRyb2xzJ107CiAgICAkc2lkZWJhciA9ICRyb3dbJ3NpZGViYXInXTsKICAgICRkaXJlY3Rpb25zID0gJHJvd1snZGlyZWN0aW9ucyddOwogICAgJHpvb20gPSAkcm93Wyd6b29tJ107CiAgICAkem9vbV9lbmNvbXBhc3MgPSAkcm93Wyd6b29tX2VuY29tcGFzcyddOwogICAgJGluZm9fd2luZG93ID0gJHJvd1snaW5mb193aW5kb3cnXTsKICAgICRpbmZvX3RyaWdnZXIgPSAkcm93WydpbmZvX3RyaWdnZXInXTsKICB9CgppZiggaXNzZXQoJHBhcmFtc1snY2FuY2VsJ10pICkKICB7CiAgICAkdGhpcy0+UmVkaXJlY3RUb1RhYigkaWQpOwogIH0KZWxzZSBpZiggaXNzZXQoJHBhcmFtc1snc3VibWl0J10pICkKICB7CiAgICAvLyBHZXQgdmFyaWFibGVzIGZyb20gdGhlIHBhcmFtcwogICAgaWYoIGlzc2V0KCRwYXJhbXNbJ25hbWUnXSkgKSAkbmFtZSA9IHRyaW0oJHBhcmFtc1snbmFtZSddKTsKICAgIGlmKCBpc3NldCgkcGFyYW1zWydkZXNjcmlwdGlvbiddKSApICRkZXNjcmlwdGlvbiA9IHRyaW0oJHBhcmFtc1snZGVzY3JpcHRpb24nXSk7CiAgICBpZiggaXNzZXQoJHBhcmFtc1snY2VudGVyX2xhdCddKSApICRjZW50ZXJfbGF0ID0gdHJpbSgkcGFyYW1zWydjZW50ZXJfbGF0J10pOwogICAgaWYoIGlzc2V0KCRwYXJhbXNbJ2NlbnRlcl9sb24nXSkgKSAkY2VudGVyX2xvbiA9IHRyaW0oJHBhcmFtc1snY2VudGVyX2xvbiddKTsKICAgIGlmKCBpc3NldCgkcGFyYW1zWyd0eXBlJ10pICkgJHR5cGUgPSAkcGFyYW1zWyd0eXBlJ107CiAgICBpZiggaXNzZXQoJHBhcmFtc1snd2lkdGgnXSkgKSAkd2lkdGggPSAoaW50KSRwYXJhbXNbJ3dpZHRoJ107CiAgICBpZiggaXNzZXQoJHBhcmFtc1snaGVpZ2h0J10pICkgJGhlaWdodCA9ICRwYXJhbXNbJ2hlaWdodCddOwogICAgaWYoIGlzc2V0KCRwYXJhbXNbJ2NvbnRyb2xzJ10pICkgJGNvbnRyb2xzID0gJHBhcmFtc1snY29udHJvbHMnXTsKICAgIGlmKCBpc3NldCgkcGFyYW1zWydjb250cm9sc19zaXplJ10pICkgJGNvbnRyb2xzX3NpemUgPSAkcGFyYW1zWydjb250cm9sc19zaXplJ107CiAgICBpZiggaXNzZXQoJHBhcmFtc1sndHlwZV9jb250cm9scyddKSApICR0eXBlX2NvbnRyb2xzID0gJHBhcmFtc1sndHlwZV9jb250cm9scyddOwogICAgaWYoIGlzc2V0KCRwYXJhbXNbJ3NpZGViYXInXSkgKSAkc2lkZWJhciA9ICRwYXJhbXNbJ3NpZGViYXInXTsKICAgIGlmKCBpc3NldCgkcGFyYW1zWydkaXJlY3Rpb25zJ10pICkgJGRpcmVjdGlvbnMgPSAkcGFyYW1zWydkaXJlY3Rpb25zJ107CiAgICBpZiggaXNzZXQoJHBhcmFtc1snem9vbSddKSApICR6b29tID0gJHBhcmFtc1snem9vbSddOwogICAgaWYoIGlzc2V0KCRwYXJhbXNbJ3pvb21fZW5jb21wYXNzJ10pICkgJHpvb21fZW5jb21wYXNzID0gJHBhcmFtc1snem9vbV9lbmNvbXBhc3MnXTsKICAgIGlmKCBpc3NldCgkcGFyYW1zWydpbmZvX3dpbmRvdyddKSApICRpbmZvX3dpbmRvdyA9ICRwYXJhbXNbJ2luZm9fd2luZG93J107CiAgICBpZiggaXNzZXQoJHBhcmFtc1snaW5mb190cmlnZ2VyJ10pICkgJGluZm9fdHJpZ2dlciA9ICRwYXJhbXNbJ2luZm9fdHJpZ2dlciddOwoKICAgIC8vIG1ha2Ugc3VyZSB0aGF0IGhlaWdodCwgd2lkdGgsIGFuZCBuYW1lIGFyZSBzcGVjaWZpZWQKICAgIGlmKCBlbXB0eSgkbmFtZSkgfHwgJGhlaWdodCA8PSAwIHx8ICR3aWR0aCA8PSAwICkKICAgICAgewoJZWNobyAkdGhpcy0+U2hvd0Vycm9ycygkdGhpcy0+TGFuZygnZXJyb3JfaW52YWxpZHBhcmFtcycpKTsKICAgICAgfQogICAgZWxzZQogICAgICB7CglpZiggaXNzZXQoJHBhcmFtc1snbWFwX2lkJ10pICkKCSAgewoJICAgIC8vIG1ha2Ugc3VyZSB0aGF0IGFuIGl0ZW0gYnkgdGhpcyBuYW1lIGRvZXNuJ3QgYWxyZWFkeSBleGlzdAoJICAgICRxdWVyeSA9ICdTRUxFQ1QgbWFwX2lkIEZST00gJy5jbXNfZGJfcHJlZml4KCkuJ21vZHVsZV9jZ2dvb2dsZW1hcHMKICAgICAgICAgICAgICAgICAgIFdIRVJFIG5hbWUgPSA/IEFORCBtYXBfaWQgIT0gPyc7CgkgICAgJG1hcGlkID0gJGRiLT5HZXRPbmUoJHF1ZXJ5LCBhcnJheSgkbmFtZSwkcGFyYW1zWydtYXBfaWQnXSkpOwoKCSAgICBpZiggJG1hcGlkICkKCSAgICAgIHsKCQllY2hvICR0aGlzLT5TaG93RXJyb3JzKCR0aGlzLT5MYW5nKCdlcnJvcl9uYW1leGlzdHMnKSk7CgkgICAgICB9CgkgICAgZWxzZQoJICAgICAgewoJCS8vIHVwZGF0ZSB0aGUgcmVjb3JkCgkJJHF1ZXJ5ID0gJ1VQREFURSAnLmNtc19kYl9wcmVmaXgoKS4nbW9kdWxlX2NnZ29vZ2xlbWFwcwogICAgICAgICAgICAgICAgICAgICAgIFNFVCBuYW1lID0gPywgZGVzY3JpcHRpb24gPSA/LCBjZW50ZXJfbGF0ID0gPywKICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VudGVyX2xvbiA9ID8sIHR5cGUgPSA/LCB3aWR0aCA9ID8sIGhlaWdodCA9ID8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xzID0gPywgY29udHJvbHNfc2l6ZSA9ID8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVfY29udHJvbHMgPSA/LCBzaWRlYmFyID0gPywgZGlyZWN0aW9ucyA9ID8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHpvb20gPSA/LCB6b29tX2VuY29tcGFzcyA9ID8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9fd2luZG93ID0gPywgaW5mb190cmlnZ2VyID0gPwogICAgICAgICAgICAgICAgICAgICAgIFdIRVJFIG1hcF9pZCA9ID8nOwoJCSRkYnIgPSAkZGItPkV4ZWN1dGUoICRxdWVyeSwgYXJyYXkoICRuYW1lLAoJCQkJCQkgICAgJGRlc2NyaXB0aW9uLAoJCQkJCQkgICAgJGNlbnRlcl9sYXQsCgkJCQkJCSAgICAkY2VudGVyX2xvbiwKCQkJCQkJICAgICR0eXBlLAoJCQkJCQkgICAgJHdpZHRoLAoJCQkJCQkgICAgJGhlaWdodCwKCQkJCQkJICAgICRjb250cm9scywKCQkJCQkJICAgICRjb250cm9sc19zaXplLAoJCQkJCQkgICAgJHR5cGVfY29udHJvbHMsCgkJCQkJCSAgICAkc2lkZWJhciwKCQkJCQkJICAgICRkaXJlY3Rpb25zLAoJCQkJCQkgICAgJHpvb20sCgkJCQkJCSAgICAkem9vbV9lbmNvbXBhc3MsCgkJCQkJCSAgICAkaW5mb193aW5kb3csCgkJCQkJCSAgICAkaW5mb190cmlnZ2VyLAoJCQkJCQkgICAgJHBhcmFtc1snbWFwX2lkJ10pKTsKCSAgICAgIH0KCSAgfQoJZWxzZQoJICB7CgkgICAgLy8gbWFrZSBzdXJlIHRoYXQgYW4gaXRlbSBieSB0aGlzIG5hbWUgZG9lc24ndCBhbHJlYWR5IGV4aXN0CgkgICAgJHF1ZXJ5ID0gJ1NFTEVDVCBtYXBfaWQgRlJPTSAnLmNtc19kYl9wcmVmaXgoKS4nbW9kdWxlX2NnZ29vZ2xlbWFwcwogICAgICAgICAgICAgICAgICAgV0hFUkUgbmFtZSA9ID8nOwoJICAgICRtYXBpZCA9ICRkYi0+R2V0T25lKCRxdWVyeSwgYXJyYXkoJG5hbWUpKTsKCSAgICAKCSAgICBpZiggJG1hcGlkICkgCgkgICAgICB7CgkJZWNobyAkdGhpcy0+U2hvd0Vycm9ycygkdGhpcy0+TGFuZygnZXJyb3JfbmFtZXhpc3RzJykpOwoJICAgICAgfQoJICAgIGVsc2UKCSAgICAgIHsKCQkvLyBhZGQgaXQKCQkkcXVlcnkgPSAnSU5TRVJUIElOVE8gJy5jbXNfZGJfcHJlZml4KCkuJ21vZHVsZV9jZ2dvb2dsZW1hcHMgCiAgICAgICAgICAgICAgICAgICAgICAgKG5hbWUsZGVzY3JpcHRpb24sY2VudGVyX2xhdCxjZW50ZXJfbG9uLHR5cGUsd2lkdGgsaGVpZ2h0LGNvbnRyb2xzLGNvbnRyb2xzX3NpemUsdHlwZV9jb250cm9scyxzaWRlYmFyLGRpcmVjdGlvbnMsem9vbSx6b29tX2VuY29tcGFzcyxpbmZvX3dpbmRvdyxpbmZvX3RyaWdnZXIpCiAgICAgICAgICAgICAgICAgICAgICBWQUxVRVMgKD8sPyw/LD8sPyw/LD8sPyw/LD8sPyw/LD8sPyw/LD8pJzsKCQkkZGJyID0gJGRiLT5FeGVjdXRlKCAkcXVlcnksIGFycmF5KCAkbmFtZSwKCQkJCQkJICAgICRkZXNjcmlwdGlvbiwKCQkJCQkJICAgICRjZW50ZXJfbGF0LAoJCQkJCQkgICAgJGNlbnRlcl9sb24sCgkJCQkJCSAgICAkdHlwZSwKCQkJCQkJICAgICR3aWR0aCwKCQkJCQkJICAgICRoZWlnaHQsCgkJCQkJCSAgICAkY29udHJvbHMsCgkJCQkJCSAgICAkY29udHJvbHNfc2l6ZSwKCQkJCQkJICAgICR0eXBlX2NvbnRyb2xzLAoJCQkJCQkgICAgJHNpZGViYXIsCgkJCQkJCSAgICAkZGlyZWN0aW9ucywKCQkJCQkJICAgICR6b29tLAoJCQkJCQkgICAgJHpvb21fZW5jb21wYXNzLAoJCQkJCQkgICAgJGluZm9fd2luZG93LAoJCQkJCQkgICAgJGluZm9fdHJpZ2dlcikpOwoJICAgICAgfQoJICAgIGlmKCAhJGRiciApCgkgICAgICB7CgkJZWNobyAiREVCVUc6IHNxbCBlcnJvciA9ICIuJGRiLT5FcnJvck1zZygpLic8YnIvPicuJGRiLT5zcWw7IGRpZSgpOwoJICAgICAgfQoJICB9CgoJLy8gcmVkaXJlY3QKCSR0aGlzLT5SZWRpcmVjdFRvVGFiKCRpZCk7CiAgICAgIH0KICB9Cgokc21hcnR5LT5hc3NpZ24oJ2Zvcm1zdGFydCcsJHRoaXMtPkNHQ3JlYXRlRm9ybVN0YXJ0KCRpZCwnYWRtaW5fYWRkX21hcCcsJHJldHVybmlkKSk7CmlmKCBpc3NldCgkcGFyYW1zWydtYXBfaWQnXSkgKQogIHsKICAgICRzbWFydHktPmFzc2lnbignaGlkZGVuJywkdGhpcy0+Q3JlYXRlSW5wdXRIaWRkZW4oJGlkLCdtYXBfaWQnLCRwYXJhbXNbJ21hcF9pZCddKSk7CiAgfQokc21hcnR5LT5hc3NpZ24oJ2Zvcm1lbmQnLCR0aGlzLT5DcmVhdGVGb3JtRW5kKCkpOwokc21hcnR5LT5hc3NpZ24oJ3N1Ym1pdCcsJHRoaXMtPkNyZWF0ZUlucHV0U3VibWl0KCRpZCwnc3VibWl0JywkdGhpcy0+TGFuZygnc3VibWl0JykpKTsKJHNtYXJ0eS0+YXNzaWduKCdjYW5jZWwnLCR0aGlzLT5DcmVhdGVJbnB1dFN1Ym1pdCgkaWQsJ2NhbmNlbCcsJHRoaXMtPkxhbmcoJ2NhbmNlbCcpKSk7Cgokc21hcnR5LT5hc3NpZ24oJ3Byb21wdF9uYW1lJywkdGhpcy0+TGFuZygnbWFwX25hbWUnKSk7CiRzbWFydHktPmFzc2lnbignaW5wdXRfbmFtZScsJHRoaXMtPkNyZWF0ZUlucHV0VGV4dCgkaWQsJ25hbWUnLCRuYW1lLDQwLDgwKSk7Cgokc21hcnR5LT5hc3NpZ24oJ3Byb21wdF9kZXNjcmlwdGlvbicsJHRoaXMtPkxhbmcoJ2Rlc2NyaXB0aW9uJykpOwokc21hcnR5LT5hc3NpZ24oJ2lucHV0X2Rlc2NyaXB0aW9uJywkdGhpcy0+Q3JlYXRlVGV4dEFyZWEoZmFsc2UsJGlkLCRkZXNjcmlwdGlvbiwnZGVzY3JpcHRpb24nKSk7Cgokc21hcnR5LT5hc3NpZ24oJ3Byb21wdF9jZW50ZXJfbGF0JywkdGhpcy0+TGFuZygnY2VudGVyX2xhdCcpKTsKJHNtYXJ0eS0+YXNzaWduKCdpbnB1dF9jZW50ZXJfbGF0JywkdGhpcy0+Q3JlYXRlSW5wdXRUZXh0KCRpZCwnY2VudGVyX2xhdCcsJGNlbnRlcl9sYXQsMTAsMTUpKTsKCiRzbWFydHktPmFzc2lnbigncHJvbXB0X2NlbnRlcl9sb24nLCR0aGlzLT5MYW5nKCdjZW50ZXJfbG9uJykpOwokc21hcnR5LT5hc3NpZ24oJ2lucHV0X2NlbnRlcl9sb24nLCR0aGlzLT5DcmVhdGVJbnB1dFRleHQoJGlkLCdjZW50ZXJfbG9uJywkY2VudGVyX2xvbiwxMCwxNSkpOwoKJHNtYXJ0eS0+YXNzaWduKCdwcm9tcHRfdHlwZScsJHRoaXMtPkxhbmcoJ3R5cGUnKSk7CiRtYXB0eXBlcyA9IGFycmF5KCk7CiRtYXB0eXBlc1skdGhpcy0+TGFuZygnbWFwJyldID0gJ21hcCc7CiRtYXB0eXBlc1skdGhpcy0+TGFuZygnc2F0ZWxsaXRlJyldID0gJ3NhdGVsbGl0ZSc7CiRtYXB0eXBlc1skdGhpcy0+TGFuZygnaHlicmlkJyldID0gJ2h5YnJpZCc7CiRzbWFydHktPmFzc2lnbignaW5wdXRfdHlwZScsJHRoaXMtPkNyZWF0ZUlucHV0RHJvcGRvd24oJGlkLCd0eXBlJywkbWFwdHlwZXMsLTEsJHR5cGUpKTsKCiRzbWFydHktPmFzc2lnbigncHJvbXB0X3dpZHRoJywkdGhpcy0+TGFuZygnd2lkdGgnKSk7CiRzbWFydHktPmFzc2lnbignaW5wdXRfd2lkdGgnLCR0aGlzLT5DcmVhdGVJbnB1dFRleHQoJGlkLCd3aWR0aCcsJHdpZHRoLDUsMTApKTsKCiRzbWFydHktPmFzc2lnbigncHJvbXB0X2hlaWdodCcsJHRoaXMtPkxhbmcoJ2hlaWdodCcpKTsKJHNtYXJ0eS0+YXNzaWduKCdpbnB1dF9oZWlnaHQnLCR0aGlzLT5DcmVhdGVJbnB1dFRleHQoJGlkLCdoZWlnaHQnLCRoZWlnaHQsNSwxMCkpOwoKJHNtYXJ0eS0+YXNzaWduKCdwcm9tcHRfY29udHJvbHMnLCAkdGhpcy0+bGFuZygnY29udHJvbHMnKSk7CiRzbWFydHktPmFzc2lnbignaW5wdXRfY29udHJvbHMnLCR0aGlzLT5DcmVhdGVJbnB1dFllc05vRHJvcGRvd24oJGlkLCdjb250cm9scycsJGNvbnRyb2xzKSk7Cgokc21hcnR5LT5hc3NpZ24oJ3Byb21wdF9jb250cm9sc19zaXplJywgJHRoaXMtPmxhbmcoJ2NvbnRyb2xzX3NpemUnKSk7CiRjb250cm9sc19zaXplcyA9IGFycmF5KCk7CiRjb250cm9sc19zaXplc1skdGhpcy0+TGFuZygnbGFyZ2UnKV0gPSAnbGFyZ2UnOwokY29udHJvbHNfc2l6ZXNbJHRoaXMtPkxhbmcoJ3NtYWxsJyldID0gJ3NtYWxsJzsKJHNtYXJ0eS0+YXNzaWduKCdpbnB1dF9jb250cm9sc19zaXplJywkdGhpcy0+Q3JlYXRlSW5wdXREcm9wZG93bigkaWQsJ2NvbnRyb2xzX3NpemUnLCRjb250cm9sc19zaXplcywtMSwkY29udHJvbHNfc2l6ZSkpOwoKJHNtYXJ0eS0+YXNzaWduKCdwcm9tcHRfdHlwZV9jb250cm9scycsICR0aGlzLT5MYW5nKCd0eXBlX2NvbnRyb2xzJykpOwokc21hcnR5LT5hc3NpZ24oJ2lucHV0X3R5cGVfY29udHJvbHMnLCR0aGlzLT5DcmVhdGVJbnB1dFllc05vRHJvcGRvd24oJGlkLCd0eXBlX2NvbnRyb2xzJywkdHlwZV9jb250cm9scykpOwoKJHNtYXJ0eS0+YXNzaWduKCdwcm9tcHRfc2lkZWJhcicsJHRoaXMtPkxhbmcoJ3NpZGViYXInKSk7CiRzbWFydHktPmFzc2lnbignaW5wdXRfc2lkZWJhcicsJHRoaXMtPkNyZWF0ZUlucHV0WWVzTm9Ecm9wZG93bigkaWQsJ3NpZGViYXInLCRzaWRlYmFyKSk7Cgokc21hcnR5LT5hc3NpZ24oJ3Byb21wdF9kaXJlY3Rpb25zJywkdGhpcy0+TGFuZygnZGlyZWN0aW9ucycpKTsKJHNtYXJ0eS0+YXNzaWduKCdpbnB1dF9kaXJlY3Rpb25zJywkdGhpcy0+Q3JlYXRlSW5wdXRZZXNOb0Ryb3Bkb3duKCRpZCwnZGlyZWN0aW9ucycsJGRpcmVjdGlvbnMpKTsKCiRzbWFydHktPmFzc2lnbigncHJvbXB0X3pvb20nLCR0aGlzLT5MYW5nKCd6b29tJykpOwokem9vbWxldmVscyA9IGFycmF5KCk7CmZvciggJGkgPSAxOyAkaSA8IDE3OyAkaSsrICkKICB7CiAgICAkem9vbWxldmVsc1skaV0gPSAkaTsKICB9CiRzbWFydHktPmFzc2lnbignaW5wdXRfem9vbScsJHRoaXMtPkNyZWF0ZUlucHV0RHJvcGRvd24oJGlkLCd6b29tJywkem9vbWxldmVscywtMSwkem9vbSkpOwoKJHNtYXJ0eS0+YXNzaWduKCdwcm9tcHRfem9vbV9lbmNvbXBhc3MnLCR0aGlzLT5MYW5nKCd6b29tX2VuY29tcGFzcycpKTsKJHNtYXJ0eS0+YXNzaWduKCdpbnB1dF96b29tX2VuY29tcGFzcycsJHRoaXMtPkNyZWF0ZUlucHV0WWVzTm9Ecm9wZG93bigkaWQsJ3pvb21fZW5jb21wYXNzJywkem9vbV9lbmNvbXBhc3MpKTsKCiRzbWFydHktPmFzc2lnbigncHJvbXB0X2luZm9fd2luZG93JywkdGhpcy0+TGFuZygnaW5mb193aW5kb3cnKSk7CiRzbWFydHktPmFzc2lnbignaW5wdXRfaW5mb193aW5kb3cnLCR0aGlzLT5DcmVhdGVJbnB1dFllc05vRHJvcGRvd24oJGlkLCdpbmZvX3dpbmRvdycsJGluZm9fd2luZG93KSk7Cgokc21hcnR5LT5hc3NpZ24oJ3Byb21wdF9pbmZvX3RyaWdnZXInLCR0aGlzLT5MYW5nKCdpbmZvX3RyaWdnZXInKSk7CiRpbmZvX3RyaWdnZXJzID0gYXJyYXkoKTsKJGluZm9fdHJpZ2dlcnNbJHRoaXMtPkxhbmcoJ2NsaWNrJyldID0gJ2NsaWNrJzsKJGluZm9fdHJpZ2dlcnNbJHRoaXMtPkxhbmcoJ21vdXNlb3ZlcicpXSA9ICdtb3VzZW92ZXInOwokc21hcnR5LT5hc3NpZ24oJ2lucHV0X2luZm9fdHJpZ2dlcicsJHRoaXMtPkNyZWF0ZUlucHV0RHJvcGRvd24oJGlkLCdpbmZvX3RyaWdnZXInLCRpbmZvX3RyaWdnZXJzLC0xLCRpbmZvX3RyaWdnZXIpKTsKCmVjaG8gJHRoaXMtPlByb2Nlc3NUZW1wbGF0ZSgnYWRkX21hcC50cGwnKTsKLy8gRU9GCj8+Cg==]]></data>
	</file>
	<file>
	  <filename>/action.admin_deletemap.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBNb2R1bGU6IENHR29vZ2xlTWFwcyAtIEEgc2ltcGxlIG1vZHVsZSBmb3IgY3JlYXRpbmcgZ29vZ2xlIG1hcHMuCiMgVmVyc2lvbjogMS4wLCBjYWxndXkxMDAwIDxjYWxndXkxMDAwQGhvdG1haWwuY29tPgojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgQ01TIC0gQ01TIE1hZGUgU2ltcGxlIGlzIChjKSAyMDA1IGJ5IFRlZCBLdWxwICh3aXNoeUBjbXNtYWRlc2ltcGxlLm9yZykKIyBUaGlzIHByb2plY3QncyBob21lcGFnZSBpczogaHR0cDovL3d3dy5jbXNtYWRlc2ltcGxlLm9yZwojIFRoZSBtb2R1bGUncyBob21lcGFnZSBpczogaHR0cDovL2Rldi5jbXNtYWRlc2ltcGxlLm9yZy9wcm9qZWN0cy9za2VsZXRvbi8KIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQojIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQojIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCiMgT3IgcmVhZCBpdCBvbmxpbmU6IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTAojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmlmKCAhaXNzZXQoJGdDbXMpICkgZXhpdCgpOwppZiggISR0aGlzLT5DaGVja1Blcm1pc3Npb24oJ01hbmFnZSBNYXBzJykgKQogIHsKICAgIGVjaG8gJHRoaXMtPlNob3dFcnJvcnMoJHRoaXMtPkxhbmcoJ2Vycm9yX3Blcm1pc3Npb25kZW5pZWQnKSk7CiAgICByZXR1cm47CiAgfQppZiggIWlzc2V0KCRwYXJhbXNbJ21hcF9pZCddKSApCiAgewogICAgZWNobyAkdGhpcy0+U2hvd0Vycm9ycygkdGhpcy0+TGFuZygnZXJyb3JfaW52YWxpZHBhcmFtcycpKTsKICAgIHJldHVybjsKICB9CiRtYXBfaWQgPSAoaW50KSRwYXJhbXNbJ21hcF9pZCddOwokdGhpcy0+U2V0Q3VycmVudFRhYignbWFwcycpOwoKJHF1ZXJ5ID0gJ0RFTEVURSBGUk9NICcuY21zX2RiX3ByZWZpeCgpLidtb2R1bGVfY2dnb29nbGVtYXBzIFdIRVJFIG1hcF9pZCA9ID8nOwokZGItPkV4ZWN1dGUoICRxdWVyeSwgYXJyYXkoICRtYXBfaWQgKSApOwoKJHRoaXMtPlJlZGlyZWN0VG9UYWIoICRpZCApOwoKLy8gRU9GCj8+]]></data>
	</file>
	<file>
	  <filename>/action.admin_deletemappoint.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBNb2R1bGU6IENHR29vZ2xlTWFwcyAtIEEgc2ltcGxlIG1vZHVsZSBmb3IgY3JlYXRpbmcgZ29vZ2xlIG1hcHMuCiMgVmVyc2lvbjogMS4wLCBjYWxndXkxMDAwIDxjYWxndXkxMDAwQGhvdG1haWwuY29tPgojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgQ01TIC0gQ01TIE1hZGUgU2ltcGxlIGlzIChjKSAyMDA1IGJ5IFRlZCBLdWxwICh3aXNoeUBjbXNtYWRlc2ltcGxlLm9yZykKIyBUaGlzIHByb2plY3QncyBob21lcGFnZSBpczogaHR0cDovL3d3dy5jbXNtYWRlc2ltcGxlLm9yZwojIFRoZSBtb2R1bGUncyBob21lcGFnZSBpczogaHR0cDovL2Rldi5jbXNtYWRlc2ltcGxlLm9yZy9wcm9qZWN0cy9za2VsZXRvbi8KIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQojIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQojIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCiMgT3IgcmVhZCBpdCBvbmxpbmU6IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTAojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmlmKCAhaXNzZXQoJGdDbXMpICkgZXhpdCgpOwppZiggISR0aGlzLT5DaGVja1Blcm1pc3Npb24oJ01hbmFnZSBNYXAgTG9jYXRpb25zJykgKQogIHsKICAgIGVjaG8gJHRoaXMtPlNob3dFcnJvcnMoJHRoaXMtPkxhbmcoJ2Vycm9yX3Blcm1pc3Npb25kZW5pZWQnKSk7CiAgICByZXR1cm47CiAgfQppZiggIWlzc2V0KCRwYXJhbXNbJ21hcF9pZCddKSApCiAgewogICAgZWNobyAkdGhpcy0+U2hvd0Vycm9ycygkdGhpcy0+TGFuZygnZXJyb3JfaW52YWxpZHBhcmFtcycpKTsKICAgIHJldHVybjsKICB9CiRtYXBfaWQgPSAoaW50KSRwYXJhbXNbJ21hcF9pZCddOwppZiggIWlzc2V0KCRwYXJhbXNbJ21hcmtlcl9pZCddKSApCiAgewogICAgZWNobyAkdGhpcy0+U2hvd0Vycm9ycygkdGhpcy0+TGFuZygnZXJyb3JfaW52YWxpZHBhcmFtcycpKTsKICAgIHJldHVybjsKICB9CiRtYXJrZXJfaWQgPSAoaW50KSRwYXJhbXNbJ21hcmtlcl9pZCddOwoKJHF1ZXJ5ID0gJ0RFTEVURSBGUk9NICcuY21zX2RiX3ByZWZpeCgpLidtb2R1bGVfY2dnb29nbGVtYXBzX3BvaW50cwogICAgICAgICAgIFdIRVJFIG1hcmtlcl9pZCA9ID8gQU5EIG1hcF9pZCA9ID8nOwokZGItPkV4ZWN1dGUoICRxdWVyeSwgYXJyYXkoICRtYXJrZXJfaWQsICRtYXBfaWQgKSApOwoKJHRoaXMtPlJlZGlyZWN0KCRpZCwnYWRtaW5fZWRpdG1hcHBvaW50cycsJHJldHVybmlkLGFycmF5KCdtYXBfaWQnPT4kbWFwX2lkKSk7Ci8vIEVPRgo/Pg==]]></data>
	</file>
	<file>
	  <filename>/action.admin_editmappoints.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBNb2R1bGU6IENHR29vZ2xlTWFwcyAtIEEgc2ltcGxlIG1vZHVsZSBmb3IgY3JlYXRpbmcgZ29vZ2xlIG1hcHMuCiMgVmVyc2lvbjogMS4wLCBjYWxndXkxMDAwIDxjYWxndXkxMDAwQGhvdG1haWwuY29tPgojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgQ01TIC0gQ01TIE1hZGUgU2ltcGxlIGlzIChjKSAyMDA1IGJ5IFRlZCBLdWxwICh3aXNoeUBjbXNtYWRlc2ltcGxlLm9yZykKIyBUaGlzIHByb2plY3QncyBob21lcGFnZSBpczogaHR0cDovL3d3dy5jbXNtYWRlc2ltcGxlLm9yZwojIFRoZSBtb2R1bGUncyBob21lcGFnZSBpczogaHR0cDovL2Rldi5jbXNtYWRlc2ltcGxlLm9yZy9wcm9qZWN0cy9za2VsZXRvbi8KIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQojIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQojIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCiMgT3IgcmVhZCBpdCBvbmxpbmU6IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTAojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmlmKCAhaXNzZXQoJGdDbXMpICkgZXhpdCgpOwppZiggISR0aGlzLT5DaGVja1Blcm1pc3Npb24oJ01hbmFnZSBNYXAgTG9jYXRpb25zJykgKQogIHsKICAgIGVjaG8gJHRoaXMtPlNob3dFcnJvcnMoJHRoaXMtPkxhbmcoJ2Vycm9yX3Blcm1pc3Npb25kZW5pZWQnKSk7CiAgICByZXR1cm47CiAgfQppZiggIWlzc2V0KCRwYXJhbXNbJ21hcF9pZCddKSApCiAgewogICAgZWNobyAkdGhpcy0+U2hvd0Vycm9ycygkdGhpcy0+TGFuZygnZXJyb3JfaW52YWxpZHBhcmFtcycpKTsKICAgIHJldHVybjsKICB9CiRtYXBfaWQgPSAoaW50KSRwYXJhbXNbJ21hcF9pZCddOwokdGhpcy0+U2V0Q3VycmVudFRhYignbWFwcycpOwoKLy8gR2V0IHRoZSBkZXRhaWxzIGFib3V0IHRoZSBtYXAKJHF1ZXJ5ID0gJ1NFTEVDVCAqIEZST00gJy5jbXNfZGJfcHJlZml4KCkuJ21vZHVsZV9jZ2dvb2dsZW1hcHMKICAgICAgICAgICBXSEVSRSBtYXBfaWQgPSA/JzsKJG1hcGluZm8gPSAkZGItPkdldFJvdyggJHF1ZXJ5LCBhcnJheSggJG1hcF9pZCApICk7CmlmKCAhJG1hcGluZm8gKQogIHsKICAgIGVjaG8gJHRoaXMtPlNob3dFcnJvcnMoJHRoaXMtPkxhbmcoJ2Vycm9yX2ludmFsaWRwYXJhbXMnKSk7CiAgICByZXR1cm47CiAgfQoKJHNtYXJ0eS0+YXNzaWduKCd0aXRsZScsJHRoaXMtPkxhbmcoJ2VkaXRfcG9pbnRzX2Zvcl9tYXAnLCRtYXBpbmZvWyduYW1lJ10pKTsKJHNtYXJ0eS0+YXNzaWduKCdtYXBpbmZvJywkdGhpcy0+QXJyYXlUb09iamVjdCgkbWFwaW5mbykpOwoKLy8gR2V0IHRoZSBsaXN0IG9mIHBvaW50cyBhbmQgc2VuZCBpdCB0byBzbWFydHkKJHF1ZXJ5ID0gJ1NFTEVDVCAqIEZST00gJy5jbXNfZGJfcHJlZml4KCkuJ21vZHVsZV9jZ2dvb2dsZW1hcHNfcG9pbnRzCiAgICAgICAgICAgV0hFUkUgbWFwX2lkID0gPyc7CiRkYnIgPSAkZGItPkV4ZWN1dGUoICRxdWVyeSwgYXJyYXkoICRtYXBfaWQgKSApOwoKJHBvaW50bGlzdCA9IGFycmF5KCk7CndoaWxlKCAkZGJyICYmICgkcm93ID0gJGRici0+RmV0Y2hSb3coKSkgKQogIHsKICAgICRvYmogPSAkdGhpcy0+QXJyYXlUb09iamVjdCgkcm93KTsKICAgICRvYmotPmVkaXRfbGluayA9ICR0aGlzLT5DcmVhdGVJbWFnZUxpbmsoJGlkLCdhZG1pbl9hZGRtYXBwb2ludCcsJHJldHVybmlkLAoJCQkJCSAgICAgJHRoaXMtPkxhbmcoJ2VkaXRfbWFwX3BvaW50JyksCgkJCQkJICAgICAnaWNvbnMvc3lzdGVtL2VkaXQuZ2lmJywKCQkJCQkgICAgIGFycmF5KCdtYXBfaWQnPT4kbWFwX2lkLAoJCQkJCQkgICAnbWFya2VyX2lkJz0+JG9iai0+bWFya2VyX2lkKSk7CiAgICAkb2JqLT5kZWxldGVfbGluayA9ICR0aGlzLT5DcmVhdGVJbWFnZUxpbmsoJGlkLCdhZG1pbl9kZWxldGVtYXBwb2ludCcsJHJldHVybmlkLAoJCQkJCSAgICAgJHRoaXMtPkxhbmcoJ2RlbGV0ZV9tYXBfcG9pbnQnKSwKCQkJCQkgICAgICdpY29ucy9zeXN0ZW0vZGVsZXRlLmdpZicsCgkJCQkJICAgICBhcnJheSgnbWFwX2lkJz0+JG1hcF9pZCwKCQkJCQkJICAgJ21hcmtlcl9pZCc9PiRvYmotPm1hcmtlcl9pZCkpOwogICAgJHBvaW50bGlzdFtdID0gJG9iajsKICB9CgovLyBhZGQgaXRlbXMgZm9yIHRoZSB0YWJsZSB0byBzbWFydHkKJHNtYXJ0eS0+YXNzaWduKCdwb2ludGxpc3QnLCRwb2ludGxpc3QpOwokc21hcnR5LT5hc3NpZ24oJ2lkdGV4dCcsJHRoaXMtPkxhbmcoJ2lkJykpOwokc21hcnR5LT5hc3NpZ24oJ25hbWV0ZXh0JywkdGhpcy0+TGFuZygnbmFtZScpKTsKJHNtYXJ0eS0+YXNzaWduKCdsb2NhdGlvbnRleHQnLCR0aGlzLT5MYW5nKCdsb2NhdGlvbicpKTsKCi8vIEFkZCB0aGUgYWRkIHBvaW50IGxpbmsKJHNtYXJ0eS0+YXNzaWduKCdhZGRfbGluaycsCgkJJHRoaXMtPkNyZWF0ZUltYWdlTGluaygkaWQsJ2FkbWluX2FkZG1hcHBvaW50JywkcmV0dXJuaWQsCgkJCQkgICAgICAgJHRoaXMtPkxhbmcoJ2FkZF9tYXBfcG9pbnQnKSwKCQkJCSAgICAgICAnaWNvbnMvc3lzdGVtL25ld29iamVjdC5naWYnLAoJCQkJICAgICAgIGFycmF5KCdtYXBfaWQnPT4kbWFwX2lkKSwnJywnJyxmYWxzZSkpOwoKLy8gcHJvY2VzcyB0aGUgdGVtcGxhdGUKZWNobyAkdGhpcy0+UHJvY2Vzc1RlbXBsYXRlKCdlZGl0bWFwcG9pbnRzLnRwbCcpOwoKLy8gRU9GCj8+]]></data>
	</file>
	<file>
	  <filename>/action.admin_saveprefs.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBNb2R1bGU6IENHR29vZ2xlTWFwcyAtIEEgc2ltcGxlIG1vZHVsZSBmb3IgY3JlYXRpbmcgZ29vZ2xlIG1hcHMuCiMgVmVyc2lvbjogMS4wLCBjYWxndXkxMDAwIDxjYWxndXkxMDAwQGhvdG1haWwuY29tPgojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgQ01TIC0gQ01TIE1hZGUgU2ltcGxlIGlzIChjKSAyMDA1IGJ5IFRlZCBLdWxwICh3aXNoeUBjbXNtYWRlc2ltcGxlLm9yZykKIyBUaGlzIHByb2plY3QncyBob21lcGFnZSBpczogaHR0cDovL3d3dy5jbXNtYWRlc2ltcGxlLm9yZwojIFRoZSBtb2R1bGUncyBob21lcGFnZSBpczogaHR0cDovL2Rldi5jbXNtYWRlc2ltcGxlLm9yZy9wcm9qZWN0cy9za2VsZXRvbi8KIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQojIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQojIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCiMgT3IgcmVhZCBpdCBvbmxpbmU6IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTAojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmlmKCAhaXNzZXQoJGdDbXMpICkgZXhpdDsKaWYoICEkdGhpcy0+Q2hlY2tQZXJtaXNzaW9uKCdNb2RpZnkgU2l0ZSBQcmVmZXJlbmNlcycpICkKICB7CiAgICBlY2hvICR0aGlzLT5TaG93RXJyb3JzKCR0aGlzLT5MYW5nKCdlcnJvcl9wZXJtaXNzaW9uZGVuaWVkJykpOwogICAgcmV0dXJuOwogIH0KCiR0aGlzLT5TZXRDdXJyZW50VGFiKCdwcmVmcycpOwoKJGdvb2dsZV9hcGlrZXkgPSAnJzsKaWYoIGlzc2V0KCRwYXJhbXNbJ2dvb2dsZV9hcGlrZXknXSkgKQogIHsKICAgICRnb29nbGVfYXBpa2V5ID0gdHJpbSgkcGFyYW1zWydnb29nbGVfYXBpa2V5J10pOwogIH0KJHRoaXMtPlNldFByZWZlcmVuY2UoJ2dvb2dsZV9hcGlrZXknLCRnb29nbGVfYXBpa2V5KTsKCiR0aGlzLT5SZWRpcmVjdFRvVGFiKCRpZCk7Ci8vIEVPRgo/Pg==]]></data>
	</file>
	<file>
	  <filename>/action.admin_setdfltmap.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBNb2R1bGU6IENHR29vZ2xlTWFwcyAtIEEgc2ltcGxlIG1vZHVsZSBmb3IgY3JlYXRpbmcgZ29vZ2xlIG1hcHMuCiMgVmVyc2lvbjogMS4wLCBjYWxndXkxMDAwIDxjYWxndXkxMDAwQGhvdG1haWwuY29tPgojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgQ01TIC0gQ01TIE1hZGUgU2ltcGxlIGlzIChjKSAyMDA1IGJ5IFRlZCBLdWxwICh3aXNoeUBjbXNtYWRlc2ltcGxlLm9yZykKIyBUaGlzIHByb2plY3QncyBob21lcGFnZSBpczogaHR0cDovL3d3dy5jbXNtYWRlc2ltcGxlLm9yZwojIFRoZSBtb2R1bGUncyBob21lcGFnZSBpczogaHR0cDovL2Rldi5jbXNtYWRlc2ltcGxlLm9yZy9wcm9qZWN0cy9za2VsZXRvbi8KIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQojIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQojIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCiMgT3IgcmVhZCBpdCBvbmxpbmU6IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTAojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmlmKCAhaXNzZXQoJGdDbXMpICkgZXhpdCgpOwppZiggISR0aGlzLT5DaGVja1Blcm1pc3Npb24oJ01hbmFnZSBNYXBzJykgKQogIHsKICAgIGVjaG8gJHRoaXMtPlNob3dFcnJvcnMoJHRoaXMtPkxhbmcoJ2Vycm9yX3Blcm1pc3Npb25kZW5pZWQnKSk7CiAgICByZXR1cm47CiAgfQppZiggIWlzc2V0KCRwYXJhbXNbJ21hcF9pZCddKSApCiAgewogICAgZWNobyAkdGhpcy0+U2hvd0Vycm9ycygkdGhpcy0+TGFuZygnZXJyb3JfaW52YWxpZHBhcmFtcycpKTsKICAgIHJldHVybjsKICB9CiRtYXBfaWQgPSAoaW50KSRwYXJhbXNbJ21hcF9pZCddOwokdGhpcy0+U2V0Q3VycmVudFRhYignbWFwcycpOwoKJHRoaXMtPlNldFBSZWZlcmVuY2UoJ2RlZmF1bHRfbWFwJywkbWFwX2lkKTsKJHRoaXMtPlJlZGlyZWN0VG9UYWIoJGlkKTsKLy8gRU9GCj8+]]></data>
	</file>
	<file>
	  <filename>/action.default.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBNb2R1bGU6IENHR29vZ2xlTWFwcyAtIEEgc2ltcGxlIG1vZHVsZSBmb3IgY3JlYXRpbmcgZ29vZ2xlIG1hcHMuCiMgVmVyc2lvbjogMS4wLCBjYWxndXkxMDAwIDxjYWxndXkxMDAwQGhvdG1haWwuY29tPgojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgQ01TIC0gQ01TIE1hZGUgU2ltcGxlIGlzIChjKSAyMDA1IGJ5IFRlZCBLdWxwICh3aXNoeUBjbXNtYWRlc2ltcGxlLm9yZykKIyBUaGlzIHByb2plY3QncyBob21lcGFnZSBpczogaHR0cDovL3d3dy5jbXNtYWRlc2ltcGxlLm9yZwojIFRoZSBtb2R1bGUncyBob21lcGFnZSBpczogaHR0cDovL2Rldi5jbXNtYWRlc2ltcGxlLm9yZy9wcm9qZWN0cy9za2VsZXRvbi8KIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQojIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQojIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCiMgT3IgcmVhZCBpdCBvbmxpbmU6IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTAojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmlmKCAhaXNzZXQoJGdDbXMpICkgZXhpdDsKaWYoICFpc3NldCgkZ0Ntcy0+dmFyaWFibGVzWyR0aGlzLT5HZXROYW1lKCkuJ21hcF9jb3VudCddKSApCiAgewogICAgJGdDbXMtPnZhcmlhYmxlc1skdGhpcy0+R2V0TmFtZSgpLidtYXBfY291bnQnXSA9IDA7CiAgICAkbWFwX2NvdW50ID0gMDsKICB9CmVsc2UKICB7CiAgICAkbWFwX2NvdW50ID0gJGdDbXMtPnZhcmlhYmxlc1skdGhpcy0+R2V0TmFtZSgpLidtYXBfY291bnQnXTsKICB9CgoKJGN1cnJlbnRMb2NhbGUgPSBzZXRsb2NhbGUoTENfQUxMLCAwKTsKc2V0bG9jYWxlKExDX0FMTCwgJ2VuX1VTJyk7CgokbWFwaWQgPSAkdGhpcy0+R2V0UHJlZmVyZW5jZSgnZGVmYXVsdF9tYXAnLDApOwppZiggaXNzZXQoJHBhcmFtc1snbWFwJ10pICkKICB7CiAgICAkbWFwaWQgPSAkcGFyYW1zWydtYXAnXTsKICB9CgokcXVlcnkgPSAnU0VMRUNUICogRlJPTSAnLmNtc19kYl9wcmVmaXgoKS4nbW9kdWxlX2NnZ29vZ2xlbWFwcwogICAgICAgICAgICAgICBXSEVSRSBtYXBfaWQgPSA/IE9SIG5hbWUgPSA/JzsKJG1hcF9kYXRhID0gJGRiLT5HZXRSb3coJHF1ZXJ5LGFycmF5KCRtYXBpZCwkbWFwaWQpKTsKaWYoICEkbWFwX2RhdGEgKQogIHsKICAgIGVjaG8gJHRoaXMtPkRpc3BsYXlFcnJvck1lc3NhZ2UoJHRoaXMtPkxhbmcoJ2Vycm9yX2ludmFsaWRwYXJhbXMnKSk7CiAgICByZXR1cm47CiAgfQoKCiRhcGlrZXkgPSAkdGhpcy0+R2V0UHJlZmVyZW5jZSgnZ29vZ2xlX2FwaWtleScsJycpOwppZiggZW1wdHkoJGFwaWtleSkgKQogIHsKICAgIGVjaG8gJHRoaXMtPkRpc3BsYXlFcnJvck1lc3NhZ2UoJHRoaXMtPkxhbmcoJ2Vycm9yX25vYXBpa2V5JykpOwogICAgcmV0dXJuOwogIH0KCiRkbiA9IGRpcm5hbWUoX19GSUxFX18pLicvbGliL3BlYXInOwppbmlfc2V0KCdpbmNsdWRlX3BhdGgnLGluaV9nZXQoJ2luY2x1ZGVfcGF0aCcpLiI6JGRuIik7CnJlcXVpcmVfb25jZSgnbGliL0dvb2dsZU1hcEFQSS0yLjQvR29vZ2xlTWFwQVBJLmNsYXNzLnBocCcpOwokbWFwID0gbmV3IEdvb2dsZU1hcEFQSSgkdGhpcy0+R2V0TmFtZSgpLiRtYXBfY291bnQsICR0aGlzLT5HZXROYW1lKCkpOwokZ0Ntcy0+dmFyaWFibGVzWyR0aGlzLT5HZXROYW1lKCkuJ21hcF9jb3VudCddKys7CgovLyBTZXR1cCBkYXRhYmFzZSBjb25uZWN0aW9uCiRtYXAtPnNldERTTigkZGIpOwokbWFwLT5zZXREQlRhYmxlKGNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2NnZ29vZ2xlbWFwc19jYWNoZSIpOwokbWFwLT5zZXRBUElLZXkoJGFwaWtleSk7CiRtYXAtPnNldExvb2t1cFNlcnZpY2UoJ0dPT0dMRScpOwokbWFwLT5zZXRXaWR0aCgkbWFwX2RhdGFbJ3dpZHRoJ10pOwokbWFwLT5zZXRIZWlnaHQoJG1hcF9kYXRhWydoZWlnaHQnXSk7CmlmICgkbWFwX2RhdGFbJ2NvbnRyb2xzJ10gPT0gMCkgewogICRtYXAtPmRpc2FibGVNYXBDb250cm9scygpOwp9CmlmICgkbWFwX2RhdGFbJ3R5cGVfY29udHJvbHMnXSA9PSAwKSB7CiAgJG1hcC0+ZGlzYWJsZVR5cGVDb250cm9scygkbWFwX2RhdGFbJ3R5cGVfY29udHJvbHMnXSk7Cn0KaWYoICRtYXBfZGF0YVsnem9vbSddID4gMCApIHsKICAkbWFwLT5zZXRab29tTGV2ZWwoJG1hcF9kYXRhWyd6b29tJ10pOwp9CiRtYXAtPnNldENvbnRyb2xTaXplKCRtYXBfZGF0YVsnY29udHJvbHNfc2l6ZSddKTsKJG1hcC0+c2V0TWFwVHlwZSgkbWFwX2RhdGFbJ3R5cGUnXSk7CmlmICgkbWFwX2RhdGFbJ3NpZGViYXInXSA9PSAwKSB7CiAgJG1hcC0+ZGlzYWJsZVNpZGViYXIoKTsKfQppZiAoJG1hcF9kYXRhWydkaXJlY3Rpb25zJ10gPT0gMCkgewogICRtYXAtPmRpc2FibGVEaXJlY3Rpb25zKCk7Cn0KaWYoJG1hcF9kYXRhWyd6b29tX2VuY29tcGFzcyddID09IDApIHsKICAkbWFwLT5kaXNhYmxlWm9vbUVuY29tcGFzcygpOwp9CmlmKCRtYXBfZGF0YVsnaW5mb193aW5kb3cnXSA9PSAwKSB7CiAgJG1hcC0+ZGlzYWJsZUluZm9XaW5kb3coKTsKfQokbWFwLT5zZXRJbmZvV2luZG93VHJpZ2dlcigkbWFwX2RhdGFbJ2luZm9fdHJpZ2dlciddKTsKCi8vIGdldCBmaXhlZCBtYXJrZXJzIGZvciB0aGlzIG1hcAokcXVlcnkgPSAnU0VMRUNUICogRlJPTSAnLmNtc19kYl9wcmVmaXgoKS4nbW9kdWxlX2NnZ29vZ2xlbWFwc19wb2ludHMKICAgICAgICAgICBXSEVSRSBtYXBfaWQgPSA/JzsKJGRiciA9ICRkYi0+RXhlY3V0ZSggJHF1ZXJ5LCBhcnJheSggJG1hcF9kYXRhWydtYXBfaWQnXSApKTsKd2hpbGUoICRkYnIgJiYgKCRyb3cgPSAkZGJyLT5GZXRjaFJvdygpKSApCiAgewogICAgaWYoIGVtcHR5KCRyb3dbJ2xhdCddKSB8fCBlbXB0eSgkcm93Wydsb24nXSkgJiYgIWVtcHR5KCRyb3dbJ2FkZHJlc3MnXSkgKQogICAgICB7CgkkbWFwLT5hZGRNYXJrZXJCeUFkZHJlc3MoJHJvd1snYWRkcmVzcyddLCRyb3dbJ25hbWUnXSwkcm93WydpbmZvJ10pOwogICAgICB9CiAgICBlbHNlIGlmKCAhZW1wdHkoJHJvd1snbGF0J10pICYmICFlbXB0eSgkcm93Wydsb24nXSkgKQogICAgICB7CgkkbWFwLT5hZGRNYXJrZXJCeUNvb3Jkcygkcm93Wydsb24nXSwkcm93WydsYXQnXSwKCQkJCSRyb3dbJ25hbWUnXSwkcm93WydpbmZvJ10pOwogICAgICB9CiAgfQoKLy8gZ2V0IGR5bmFtaWMgbWFya2VycyBmb3IgdGhpcyBtYXAKaWYoIGlzX2FycmF5KCR0aGlzLT5fZHluYW1pY19wb2ludHMpICYmCiAgICBpc19hcnJheSgkdGhpcy0+X2R5bmFtaWNfcG9pbnRzWyRtYXBpZF0pICkKICB7CiAgICBmb3IoICRpID0gMDsgJGkgPCBjb3VudCgkdGhpcy0+X2R5bmFtaWNfcG9pbnRzWyRtYXBpZF0pOyAkaSsrICkKICAgICAgewoJJG9iaiA9JiAkdGhpcy0+X2R5bmFtaWNfcG9pbnRzWyRtYXBpZF1bJGldOwoJaWYoIGVtcHR5KCRvYmotPmxhdCkgfHwgZW1wdHkoJG9iai0+bG9uZykgJiYgIWVtcHR5KCRvYmotPmFkZHJlc3MpICkKCSAgewoJICAgICRtYXAtPmFkZE1hcmtlckJ5QWRkcmVzcygkb2JqLT5hZGRyZXNzLAoJCQkJICAgICAkb2JqLT5uYW1lLAoJCQkJICAgICAkb2JqLT5kZXNjcmlwdGlvbik7CgkgIH0KCWVsc2UgaWYoICFlbXB0eSgkb2JqLT5sYXQpICYmICFlbXB0eSgkb2JqLT5sb25nKSApCgkgIHsKCSAgICAkbWFwLT5hZGRNYXJrZXJCeUNvb3Jkcygkb2JqLT5sb25nLCRvYmotPmxhdCwKCQkJCSAgICAkb2JqLT5uYW1lLCRvYmotPmRlc2NyaXB0aW9uKTsKCSAgfQogICAgICB9CiAgfQoKJG1hcC0+ZGlzYWJsZU9uTG9hZCgpOwppZiAoJG1hcF9kYXRhWydjZW50ZXJfbGF0J10gIT0gJycgJiYgaXNfbnVtZXJpYygkbWFwX2RhdGFbJ2NlbnRlcl9sYXQnXSkgJiYKICAgICRtYXBfZGF0YVsnY2VudGVyX2xvbiddICE9ICcnICYmIGlzX251bWVyaWMoJG1hcF9kYXRhWydjZW50ZXJfbG9uJ10pKQogIHsKICAgICRtYXAtPmFkanVzdENlbnRlckNvb3JkcygkbWFwX2RhdGFbJ2NlbnRlcl9sb24nXSwkbWFwX2RhdGFbJ2NlbnRlcl9sYXQnXSk7CiAgfQoKLy8gYXNzaWduIFNtYXJ0eSB2YXJpYWJsZXM7CiRzbWFydHktPmFzc2lnbignZ29vZ2xlX21hcF9oZWFkZXInLCRtYXAtPmdldEhlYWRlckpTKCkpOwokc21hcnR5LT5hc3NpZ24oJ2dvb2dsZV9tYXBfanMnLCRtYXAtPmdldE1hcEpTKCkpOwokc21hcnR5LT5hc3NpZ24oJ2dvb2dsZV9tYXBfc2lkZWJhcicsJG1hcC0+Z2V0U2lkZWJhcigpKTsKJHNtYXJ0eS0+YXNzaWduKCdnb29nbGVfbWFwJywkbWFwLT5nZXRNYXAoKSk7CiRzbWFydHktPmFzc2lnbignbWFwX2Rlc2NyaXB0aW9uJywgJG1hcF9kYXRhWydkZXNjcmlwdGlvbiddKTsKCi8vIFByb2Nlc3MgdGhlIHRlbXBsYXRlCmVjaG8gJHRoaXMtPlByb2Nlc3NUZW1wbGF0ZSgnbWFwLnRwbCcpOwoKI1NldCBsb2NhbGUgYWdhaW4KYWRvZGJfY29ubmVjdCgpOwpzZXRsb2NhbGUoTENfQUxMLCAkY3VycmVudExvY2FsZSk7Ci8vIEVPRgo/Pgo=]]></data>
	</file>
	<file>
	  <filename>/action.defaultadmin.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBNb2R1bGU6IENHR29vZ2xlTWFwcyAtIEEgc2ltcGxlIG1vZHVsZSBmb3IgY3JlYXRpbmcgZ29vZ2xlIG1hcHMuCiMgVmVyc2lvbjogMS4wLCBjYWxndXkxMDAwIDxjYWxndXkxMDAwQGhvdG1haWwuY29tPgojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgQ01TIC0gQ01TIE1hZGUgU2ltcGxlIGlzIChjKSAyMDA1IGJ5IFRlZCBLdWxwICh3aXNoeUBjbXNtYWRlc2ltcGxlLm9yZykKIyBUaGlzIHByb2plY3QncyBob21lcGFnZSBpczogaHR0cDovL3d3dy5jbXNtYWRlc2ltcGxlLm9yZwojIFRoZSBtb2R1bGUncyBob21lcGFnZSBpczogaHR0cDovL2Rldi5jbXNtYWRlc2ltcGxlLm9yZy9wcm9qZWN0cy9za2VsZXRvbi8KIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQojIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQojIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCiMgT3IgcmVhZCBpdCBvbmxpbmU6IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTAojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgplY2hvICR0aGlzLT5TdGFydFRhYkhlYWRlcnMoKTsKaWYoICR0aGlzLT5DaGVja1Blcm1pc3Npb24oJ01hbmFnZSBNYXBzJykgfHwKICAgICR0aGlzLT5DaGVja1Blcm1pc3Npb24oJ01hbmFnZSBNYXAgTG9jYXRpb25zJykgKQogIHsKICAgIGVjaG8gJHRoaXMtPlNldFRhYkhlYWRlcignbWFwcycsJHRoaXMtPkxhbmcoJ21hcHMnKSk7CiAgfQppZiggJHRoaXMtPkNoZWNrUGVybWlzc2lvbignTW9kaWZ5IFNpdGUgUHJlZmVyZW5jZXMnKSApCiAgewogICAgZWNobyAkdGhpcy0+U2V0VGFiSGVhZGVyKCdwcmVmcycsJHRoaXMtPkxhbmcoJ3ByZWZlcmVuY2VzJykpOwogIH0KZWNobyAkdGhpcy0+RW5kVGFiSGVhZGVycygpOwoKZWNobyAkdGhpcy0+U3RhcnRUYWJDb250ZW50KCk7CmlmKCAkdGhpcy0+Q2hlY2tQZXJtaXNzaW9uKCdNYW5hZ2UgTWFwcycpIHx8CiAgICAkdGhpcy0+Q2hlY2tQZXJtaXNzaW9uKCdNYW5hZ2UgTWFwIExvY2F0aW9ucycpICkKICB7CiAgICBlY2hvICR0aGlzLT5TdGFydFRhYignbWFwcycpOwogICAgaW5jbHVkZShkaXJuYW1lKF9fRklMRV9fKS4nL2Z1bmN0aW9uLmFkbWluX21hcHNfdGFiLnBocCcpOwogICAgZWNobyAkdGhpcy0+RW5kVGFiKCk7CiAgfQppZiggJHRoaXMtPkNoZWNrUGVybWlzc2lvbignTW9kaWZ5IFNpdGUgUHJlZmVyZW5jZXMnKSApCiAgewogICAgZWNobyAkdGhpcy0+U3RhcnRUYWIoJ3ByZWZzJyk7CiAgICBpbmNsdWRlKGRpcm5hbWUoX19GSUxFX18pLicvZnVuY3Rpb24uYWRtaW5fcHJlZnNfdGFiLnBocCcpOwogICAgZWNobyAkdGhpcy0+RW5kVGFiKCk7CiAgfQplY2hvICR0aGlzLT5FbmRUYWJDb250ZW50KCk7Ci8vIEVPRgo/Pg==]]></data>
	</file>
	<file>
	  <filename>/CGGoogleMaps.module.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBNb2R1bGU6IENHR29vZ2xlTWFwcyAtIEEgc2ltcGxlIG1vZHVsZSBmb3IgY3JlYXRpbmcgZ29vZ2xlIG1hcHMuCiMgVmVyc2lvbjogMS4wLCBjYWxndXkxMDAwIDxjYWxndXkxMDAwQGhvdG1haWwuY29tPgojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgQ01TIC0gQ01TIE1hZGUgU2ltcGxlIGlzIChjKSAyMDA1IGJ5IFRlZCBLdWxwICh3aXNoeUBjbXNtYWRlc2ltcGxlLm9yZykKIyBUaGlzIHByb2plY3QncyBob21lcGFnZSBpczogaHR0cDovL3d3dy5jbXNtYWRlc2ltcGxlLm9yZwojIFRoZSBtb2R1bGUncyBob21lcGFnZSBpczogaHR0cDovL2Rldi5jbXNtYWRlc2ltcGxlLm9yZy9wcm9qZWN0cy9za2VsZXRvbi8KIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQojIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQojIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCiMgT3IgcmVhZCBpdCBvbmxpbmU6IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTAojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgoKJGNnZXh0ZW5zaW9ucyA9IGNtc19qb2luX3BhdGgoJGdDbXMtPmNvbmZpZ1sncm9vdF9wYXRoJ10sJ21vZHVsZXMnLAoJCQkgICAgICAnQ0dFeHRlbnNpb25zJywnQ0dFeHRlbnNpb25zLm1vZHVsZS5waHAnKTsKaWYoICFpc19yZWFkYWJsZSggJGNnZXh0ZW5zaW9ucyApICkKewogIGVjaG8gJzxoMT48Zm9udCBjb2xvcj0icmVkIj5FUlJPUjogVGhlIENHRXh0ZW5zaW9ucyBtb2R1bGUgY291bGQgbm90IGJlIGZvdW5kLjwvZm9udD48L2gxPic7CiAgcmV0dXJuOwp9CnJlcXVpcmVfb25jZSgkY2dleHRlbnNpb25zKTsKCgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogY2dnbV9hZGRfZHlucG9pbnQoKQogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KZnVuY3Rpb24gY2dnbV9hZGRfZHlucG9pbnQoJHBhcmFtcywgJiRzbWFydHkpCnsKICAkbWFwID0gJyc7CiAgaWYoIGlzc2V0KCRwYXJhbXNbJ21hcCddKSApCiAgICB7CiAgICAgICRtYXAgPSAkcGFyYW1zWydtYXAnXTsKICAgIH0KICBlbHNlCiAgIHsKICAgICAgZ2xvYmFsICRnQ21zOwogICAgICAkbW9kID0mICRnQ21zLT5tb2R1bGVzWydDR0dvb2dsZU1hcHMnXVsnb2JqZWN0J107CiAgICAgICRtYXAgPSAkbW9kLT5HZXRQcmVmZXJlbmNlKCdkZWZhdWx0X21hcCcsMCk7CiAgIH0KICAKICBpZiggIWlzc2V0KCRwYXJhbXNbJ25hbWUnXSkgKQogICAgewogICAgICAvLyBuYW1lIGlzIHJlcXVpcmVkCiAgICAgIHJldHVybjsgCiAgICB9CiAgJG5hbWUgPSAkcGFyYW1zWyduYW1lJ107CiAgCiAgJGRlc2NyaXB0aW9uID0gJyc7CiAgaWYoIGlzc2V0KCRwYXJhbXNbJ2Rlc2MnXSkgKQogICAgewogICAgICAkZGVzY3JpcHRpb24gPSAkcGFyYW1zWydkZXNjJ107CiAgICB9CiAgaWYoIGlzc2V0KCRwYXJhbXNbJ2Rlc2NyaXB0aW9uJ10pICkKICAgIHsKICAgICAgJGRlc2NyaXB0aW9uID0gJHBhcmFtc1snZGVzY3JpcHRpb24nXTsKICAgIH0KICAKICAkYWRkcmVzcyA9ICcnOwogIGlmKCBpc3NldCgkcGFyYW1zWydhZGRyZXNzJ10pICkKICAgIHsKICAgICAgJGFkZHJlc3MgPSAkcGFyYW1zWydhZGRyZXNzJ107CiAgICB9CiAgCiAgJGxhdCA9ICcnOwogIGlmKCBpc3NldCgkcGFyYW1zWydsYXQnXSkgKQogICAgewogICAgICAkbGF0ID0gJHBhcmFtc1snbGF0J107CiAgICB9CiAgCiAgJGxvbmcgPSAnJzsKICBpZiggaXNzZXQoJHBhcmFtc1snbG9uZyddKSApCiAgICB7CiAgICAgICRsb25nID0gJHBhcmFtc1snbG9uZyddOwogICAgfQoKICBnbG9iYWwgJGdDbXM7CiAgJG1vZCA9JiAkZ0Ntcy0+bW9kdWxlc1snQ0dHb29nbGVNYXBzJ11bJ29iamVjdCddOwogICRtb2QtPkFkZER5bmFtaWNQb2ludCgkbWFwLCRuYW1lLCRkZXNjcmlwdGlvbiwKCQkJJGFkZHJlc3MsJGxhdCwkbG9uZyk7Cn0KCgovKiAtLS0tIEJlZ2luIENsYXNzIC0tLSAqLwpjbGFzcyBDR0dvb2dsZU1hcHMgZXh0ZW5kcyBDR0V4dGVuc2lvbnMKewogIHZhciAkX2R5bmFtaWNfcG9pbnRzOwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBDR0dvb2dsZU1hcHMoKSAtLSBDb25zdHJ1Y3RvcgogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGZ1bmN0aW9uIENHR29vZ2xlTWFwcygpCiAgewogICAgcGFyZW50OjpDTVNNb2R1bGUoKTsKICAgICR0aGlzLT5fZHluYW1pY19wb2ludHMgPSBudWxsOwoKICAgIGdsb2JhbCAkZ0NtczsKICAgICRzbWFydHkgPSYgJGdDbXMtPkdldFNtYXJ0eSgpOwogICAgJHNtYXJ0eS0+cmVnaXN0ZXJfZnVuY3Rpb24oJ2NnZ21fYWRkX2R5bnBvaW50JywnY2dnbV9hZGRfZHlucG9pbnQnKTsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIEdldE5hbWUoKQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGZ1bmN0aW9uIEdldE5hbWUoKQogIHsKICAgIHJldHVybiAnQ0dHb29nbGVNYXBzJzsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIEdldEZyaWVuZGx5TmFtZSgpCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZnVuY3Rpb24gR2V0RnJpZW5kbHlOYW1lKCkKICB7CiAgICByZXR1cm4gJHRoaXMtPkxhbmcoJ2ZyaWVuZGx5bmFtZScpOwogIH0KCgkKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBHZXRWZXJzaW9uKCkKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBHZXRWZXJzaW9uKCkKICB7CiAgICByZXR1cm4gJzEuMSc7CiAgfQoKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgR2V0SGVscCgpCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZnVuY3Rpb24gR2V0SGVscCgpCiAgewogICAgcmV0dXJuICR0aGlzLT5MYW5nKCdoZWxwJyk7CiAgfQoKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgR2V0QXV0aG9yKCkKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBHZXRBdXRob3IoKQogIHsKICAgIHJldHVybiAnY2FsZ3V5MTAwMCc7CiAgfQoKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgR2V0QXV0aG9yRW1haWwoKQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGZ1bmN0aW9uIEdldEF1dGhvckVtYWlsKCkKICB7CiAgICByZXR1cm4gJ2NhbGd1eTEwMDBAaG90bWFpbC5jb20nOwogIH0KCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIEdldENoYW5nZUxvZygpCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZnVuY3Rpb24gR2V0Q2hhbmdlTG9nKCkKICB7CiAgICByZXR1cm4gJHRoaXMtPkxhbmcoJ2NoYW5nZWxvZycpOwogIH0KICAKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBJc1BsdWdpbk1vZHVsZSgpCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZnVuY3Rpb24gSXNQbHVnaW5Nb2R1bGUoKQogIHsKICAgIHJldHVybiB0cnVlOwogIH0KCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIEhhc0FkbWluKCkKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBIYXNBZG1pbigpCiAgewogICAgcmV0dXJuIHRydWU7CiAgfQoKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgR2V0QWRtaW5TZWN0aW9uKCkKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBHZXRBZG1pblNlY3Rpb24oKQogIHsKICAgIHJldHVybiAnZXh0ZW5zaW9ucyc7CiAgfQoKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgR2V0QWRtaW5EZXNjcmlwdGlvbigpCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZnVuY3Rpb24gR2V0QWRtaW5EZXNjcmlwdGlvbigpCiAgewogICAgcmV0dXJuICR0aGlzLT5MYW5nKCdtb2RkZXNjcmlwdGlvbicpOwogIH0KCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIFZpc2libGVUb0FkbWluVXNlcigpCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZnVuY3Rpb24gVmlzaWJsZVRvQWRtaW5Vc2VyKCkKICB7CiAgICByZXR1cm4gJHRoaXMtPkNoZWNrUGVybWlzc2lvbignTWFuYWdlIE1hcHMnKSB8fAogICAgICAkdGhpcy0+Q2hlY2tQZXJtaXNzaW9uKCdNYW5hZ2UgTWFwIExvY2F0aW9ucycpIHx8CiAgICAgICR0aGlzLT5DaGVja1Blcm1pc3Npb24oJ01vZGlmeSBTaXRlIFByZWZlcmVuY2VzJyk7CiAgfQoKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgR2V0RGVwZW5kZW5jaWVzKCkKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBHZXREZXBlbmRlbmNpZXMoKQogIHsKICAgIHJldHVybiBhcnJheSgnQ0dFeHRlbnNpb25zJz0+JzEuMicpOwogIH0KCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIE1pbmltdW1DTVNWZXJzaW9uKCkKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBNaW5pbXVtQ01TVmVyc2lvbigpCiAgewogICAgcmV0dXJuICIxLjMuMSI7CiAgfQoJCgkKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBTZXRQYXJhbWV0ZXJzKCkKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBTZXRQYXJhbWV0ZXJzKCkKICB7CiAgICAkdGhpcy0+UmVnaXN0ZXJNb2R1bGVQbHVnaW4oKTsKICAgICR0aGlzLT5SZXN0cmljdFVua25vd25QYXJhbXMoKTsKCiAgICAkdGhpcy0+Q3JlYXRlUGFyYW1ldGVyKCdtYXAnLCcnLCR0aGlzLT5MYW5nKCdoZWxwX3BhcmFtX21hcCcpKTsKICAgICR0aGlzLT5TZXRQYXJhbWV0ZXJUeXBlKCdtYXAnLENMRUFOX1NUUklORyk7CiAgfQoKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgSW5zdGFsbFBvc3RNZXNzYWdlKCkKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBJbnN0YWxsUG9zdE1lc3NhZ2UoKQogIHsKICAgIHJldHVybiAkdGhpcy0+TGFuZygncG9zdGluc3RhbGwnKTsKICB9CgoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBVbmluc3RhbGxQb3N0TWVzc2FnZSgpCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZnVuY3Rpb24gVW5pbnN0YWxsUG9zdE1lc3NhZ2UoKQogIHsKICAgIHJldHVybiAkdGhpcy0+TGFuZygncG9zdHVuaW5zdGFsbCcpOwogIH0KCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIFVuaW5zdGFsbFByZU1lc3NhZ2UoKQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGZ1bmN0aW9uIFVuaW5zdGFsbFByZU1lc3NhZ2UoKQogIHsKICAgIHJldHVybiAkdGhpcy0+TGFuZygncmVhbGx5X3VuaW5zdGFsbCcpOwogIH0JCgoKICBmdW5jdGlvbiBBZGREeW5hbWljUG9pbnQoJG1hcCwkbmFtZSwkZGVzY3JpcHRpb24sJGFkZHJlc3M9JycsJGxhdD0nJywkbG9uZz0nJykKICB7CiAgICBpZiggZW1wdHkoJG1hcCkgKSByZXR1cm4gRkFMU0U7CiAgICBpZiggZW1wdHkoJG5hbWUpICkgcmV0dXJuIEZBTFNFOwogICAgaWYoIGVtcHR5KCRhZGRyZXNzKSAmJiAoZW1wdHkoJGxhdCkgfHwgZW1wdHkoJGxvbmcpKSApIHJldHVybiBmYWxzZTsKCiAgICBpZiggIWlzX2FycmF5KCR0aGlzLT5fZHluYW1pY19wb2ludHMpICkKICAgICAgewoJJHRoaXMtPl9keW5hbWljX3BvaW50cyA9IGFycmF5KCk7CiAgICAgIH0KICAgIGlmKCAhaXNzZXQoJHRoaXMtPl9keW5hbWljX3BvaW50c1skbWFwXSkgKQogICAgICB7CgkkdGhpcy0+X2R5bmFtaWNfcG9pbnRzWyRtYXBdID0gYXJyYXkoKTsKICAgICAgfQoKICAgIC8vIGV2ZXJ5dGhpbmcgaXMgZ29vZCB0byBnbywgYnVpbGQgdGhlIHBvaW50IG9iamVjdC4KICAgICRvYmogPSBuZXcgU3RkQ2xhc3M7CiAgICAkb2JqLT5uYW1lID0gJG5hbWU7CiAgICAkb2JqLT5kZXNjcmlwdGlvbiA9ICRkZXNjcmlwdGlvbjsKICAgIGlmKCAhZW1wdHkoJGFkZHJlc3MpICkKICAgICAgewoJJG9iai0+YWRkcmVzcyA9ICRhZGRyZXNzOwogICAgICB9CiAgICBlbHNlIGlmKCAhZW1wdHkoJGxhdCkgJiYgIWVtcHR5KCRsb25nKSApCiAgICAgIHsKCSRvYmotPmxhdCA9ICRsYXQ7Cgkkb2JqLT5sb25nID0gJGxvbmc7CiAgICAgIH0KICAgIGVsc2UKICAgICAgewoJcmV0dXJuIEZBTFNFOwogICAgICB9CgogICAgLy8gYWRkIHRoZSBwb2ludCB0byB0aGUgbGlzdAogICAgJHRoaXMtPl9keW5hbWljX3BvaW50c1skbWFwXVtdID0gJG9iajsKICB9CgoKfSAvLyBjbGFzcwoKPz4K]]></data>
	</file>
	<file>
	  <filename>/function.admin_maps_tab.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBNb2R1bGU6IENHR29vZ2xlTWFwcyAtIEEgc2ltcGxlIG1vZHVsZSBmb3IgY3JlYXRpbmcgZ29vZ2xlIG1hcHMuCiMgVmVyc2lvbjogMS4wLCBjYWxndXkxMDAwIDxjYWxndXkxMDAwQGhvdG1haWwuY29tPgojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgQ01TIC0gQ01TIE1hZGUgU2ltcGxlIGlzIChjKSAyMDA1IGJ5IFRlZCBLdWxwICh3aXNoeUBjbXNtYWRlc2ltcGxlLm9yZykKIyBUaGlzIHByb2plY3QncyBob21lcGFnZSBpczogaHR0cDovL3d3dy5jbXNtYWRlc2ltcGxlLm9yZwojIFRoZSBtb2R1bGUncyBob21lcGFnZSBpczogaHR0cDovL2Rldi5jbXNtYWRlc2ltcGxlLm9yZy9wcm9qZWN0cy9za2VsZXRvbi8KIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQojIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQojIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCiMgT3IgcmVhZCBpdCBvbmxpbmU6IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTAojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmlmKCAhaXNzZXQoJGdDbXMpICkgZXhpdDsKaWYoICEkdGhpcy0+Q2hlY2tQZXJtaXNzaW9uKCdNYW5hZ2UgTWFwcycpICkKICB7CiAgICBlY2hvICR0aGlzLT5TaG93RXJyb3JzKCR0aGlzLT5MYW5nKCdlcnJvcl9wZXJtaXNzaW9uZGVuaWVkJykpOwogICAgcmV0dXJuOwogIH0KCiRtYXBsaXN0ID0gYXJyYXkoKTsKJHF1ZXJ5ID0gJ1NFTEVDVCAqIEZST00gJy5jbXNfZGJfcHJlZml4KCkuJ21vZHVsZV9jZ2dvb2dsZW1hcHMnOwokZGJyID0gJGRiLT5FeGVjdXRlKCAkcXVlcnkgKTsKJGRmbHRfbWFwID0gJHRoaXMtPkdldFByZWZlcmVuY2UoJ2RlZmF1bHRfbWFwJywwKTsKd2hpbGUoICRkYnIgJiYgKCRyb3cgPSAkZGJyLT5GZXRjaFJvdygpICkgKQogIHsKICAgICRvYmogPSAkdGhpcy0+QXJyYXlUb09iamVjdCgkcm93KTsKICAgIGlmKCAkdGhpcy0+Q2hlY2tQZXJtaXNzaW9uKCdNYW5hZ2UgTWFwcycpICkKICAgICAgewoJaWYoICRvYmotPm1hcF9pZCAhPSAkZGZsdF9tYXAgKQoJICB7CgkgICAgJG9iai0+ZGVsZXRlX2xpbmsgPSAkdGhpcy0+Q3JlYXRlSW1hZ2VMaW5rKCRpZCwnYWRtaW5fZGVsZXRlbWFwJywkcmV0dXJuaWQsCgkJCQkJCSAgICAgICAkdGhpcy0+TGFuZygnZGVsZXRlX21hcCcpLAoJCQkJCQkgICAgICAgJ2ljb25zL3N5c3RlbS9kZWxldGUuZ2lmJywKCQkJCQkJICAgICAgIGFycmF5KCdtYXBfaWQnPT4kb2JqLT5tYXBfaWQpKTsKCSAgfQoJZWxzZQoJICB7CgkgICAgJG9iai0+ZGVsZXRlX2xpbmsgPSAnJm5ic3A7JzsKCSAgfQoJJG9iai0+ZWRpdF9saW5rID0gJHRoaXMtPkNyZWF0ZUltYWdlTGluaygkaWQsJ2FkbWluX2FkZF9tYXAnLCRyZXR1cm5pZCwKCQkJCQkJICR0aGlzLT5MYW5nKCdlZGl0X21hcCcpLAoJCQkJCQkgJ2ljb25zL3N5c3RlbS9lZGl0LmdpZicsCgkJCQkJCSBhcnJheSgnbWFwX2lkJz0+JG9iai0+bWFwX2lkKSk7CgkKCWlmKCAkb2JqLT5tYXBfaWQgIT0gJGRmbHRfbWFwICkKCSAgewoJICAgICRvYmotPmRlZmF1bHRfbGluayA9ICR0aGlzLT5DcmVhdGVJbWFnZUxpbmsoJGlkLCdhZG1pbl9zZXRkZmx0bWFwJywkcmV0dXJuaWQsCgkJCQkJCQkkdGhpcy0+TGFuZygnc2V0X2RmbHRfbWFwJyksCgkJCQkJCQknaWNvbnMvc3lzdGVtL2ZhbHNlLmdpZicsCgkJCQkJCQlhcnJheSgnbWFwX2lkJz0+JG9iai0+bWFwX2lkKSk7CgkgIH0KCWVsc2UKCSAgewoJICAgICRvYmotPmRlZmF1bHRfbGluayA9ICR0aGlzLT5EaXNwbGF5SW1hZ2UoJ2ljb25zL3N5c3RlbS90cnVlLmdpZicsJ3N5c3RlbWljb24nKTsKCSAgfQogICAgICB9CiAgICAKICAgIGlmKCAkdGhpcy0+Q2hlY2tQZXJtaXNzaW9uKCdNYW5hZ2UgTWFwIExvY2F0aW9ucycpICkKICAgICAgewoJJG9iai0+cG9pbnRzX2xpbmsgPSAkdGhpcy0+Q3JlYXRlSW1hZ2VMaW5rKCRpZCwnYWRtaW5fZWRpdG1hcHBvaW50cycsCgkJCQkJCSAgICRyZXR1cm5pZCwKCQkJCQkJICAgJHRoaXMtPkxhbmcoJ2VkaXRfbWFwX3BvaW50cycpLAoJCQkJCQkgICAnaWNvbnMvc3lzdGVtL2luZm8uZ2lmJywKCQkJCQkJICAgYXJyYXkoJ21hcF9pZCc9PiRvYmotPm1hcF9pZCkpOwogICAgICB9CgogICAgJG1hcGxpc3RbXSA9ICRvYmo7CiAgfQoKJHNtYXJ0eS0+YXNzaWduKCdpZHRleHQnLCR0aGlzLT5MYW5nKCdpZCcpKTsKJHNtYXJ0eS0+YXNzaWduKCduYW1ldGV4dCcsJHRoaXMtPkxhbmcoJ25hbWUnKSk7CiRzbWFydHktPmFzc2lnbignZGVmYXVsdHRleHQnLCR0aGlzLT5MYW5nKCdkZWZhdWx0JykpOwokc21hcnR5LT5hc3NpZ24oJ21hcGxpc3QnLCRtYXBsaXN0KTsKJHNtYXJ0eS0+YXNzaWduKCdhZGRfbGluaycsCgkJJHRoaXMtPkNyZWF0ZUltYWdlTGluaygkaWQsJ2FkbWluX2FkZF9tYXAnLCRyZXR1cm5pZCwKCQkJCSAgICAgICAkdGhpcy0+TGFuZygnYWRkX21hcCcpLAoJCQkJICAgICAgICdpY29ucy9zeXN0ZW0vbmV3b2JqZWN0LmdpZicsCgkJCQkgICAgICAgYXJyYXkoKSwnJywnJyxmYWxzZSkpOwoKZWNobyAkdGhpcy0+UHJvY2Vzc1RlbXBsYXRlKCdtYXBzX3RhYi50cGwnKTsKLy8gRU9GCj8+]]></data>
	</file>
	<file>
	  <filename>/function.admin_points_tab.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBNb2R1bGU6IENHR29vZ2xlTWFwcyAtIEEgc2ltcGxlIG1vZHVsZSBmb3IgY3JlYXRpbmcgZ29vZ2xlIG1hcHMuCiMgVmVyc2lvbjogMS4wLCBjYWxndXkxMDAwIDxjYWxndXkxMDAwQGhvdG1haWwuY29tPgojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgQ01TIC0gQ01TIE1hZGUgU2ltcGxlIGlzIChjKSAyMDA1IGJ5IFRlZCBLdWxwICh3aXNoeUBjbXNtYWRlc2ltcGxlLm9yZykKIyBUaGlzIHByb2plY3QncyBob21lcGFnZSBpczogaHR0cDovL3d3dy5jbXNtYWRlc2ltcGxlLm9yZwojIFRoZSBtb2R1bGUncyBob21lcGFnZSBpczogaHR0cDovL2Rldi5jbXNtYWRlc2ltcGxlLm9yZy9wcm9qZWN0cy9za2VsZXRvbi8KIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQojIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQojIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCiMgT3IgcmVhZCBpdCBvbmxpbmU6IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTAojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmlmKCAhaXNzZXQoJGdDbXMpICkgZXhpdDsKaWYoICEkdGhpcy0+Q2hlY2tQZXJtaXNzaW9uKCdNYW5hZ2UgTWFwIExvY2F0aW9ucycpICkKICB7CiAgICBlY2hvICR0aGlzLT5TaG93RXJyb3JzKCR0aGlzLT5MYW5nKCdlcnJvcl9wZXJtaXNzaW9uZGVuaWVkJykpOwogICAgcmV0dXJuOwogIH0KCmVjaG8gJ1BPSU5UUyBUQUInOwovLyBFT0YKPz4=]]></data>
	</file>
	<file>
	  <filename>/function.admin_prefs_tab.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBNb2R1bGU6IENHR29vZ2xlTWFwcyAtIEEgc2ltcGxlIG1vZHVsZSBmb3IgY3JlYXRpbmcgZ29vZ2xlIG1hcHMuCiMgVmVyc2lvbjogMS4wLCBjYWxndXkxMDAwIDxjYWxndXkxMDAwQGhvdG1haWwuY29tPgojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgQ01TIC0gQ01TIE1hZGUgU2ltcGxlIGlzIChjKSAyMDA1IGJ5IFRlZCBLdWxwICh3aXNoeUBjbXNtYWRlc2ltcGxlLm9yZykKIyBUaGlzIHByb2plY3QncyBob21lcGFnZSBpczogaHR0cDovL3d3dy5jbXNtYWRlc2ltcGxlLm9yZwojIFRoZSBtb2R1bGUncyBob21lcGFnZSBpczogaHR0cDovL2Rldi5jbXNtYWRlc2ltcGxlLm9yZy9wcm9qZWN0cy9za2VsZXRvbi8KIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQojIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQojIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCiMgT3IgcmVhZCBpdCBvbmxpbmU6IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTAojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmlmKCAhaXNzZXQoJGdDbXMpICkgZXhpdDsKaWYoICEkdGhpcy0+Q2hlY2tQZXJtaXNzaW9uKCdNb2RpZnkgU2l0ZSBQcmVmZXJlbmNlcycpICkKICB7CiAgICBlY2hvICR0aGlzLT5TaG93RXJyb3JzKCR0aGlzLT5MYW5nKCdlcnJvcl9wZXJtaXNzaW9uZGVuaWVkJykpOwogICAgcmV0dXJuOwogIH0KCiRzbWFydHktPmFzc2lnbignZm9ybXN0YXJ0JywKCQkkdGhpcy0+Q0dDcmVhdGVGb3JtU3RhcnQoJGlkLCdhZG1pbl9zYXZlcHJlZnMnLCRyZXR1cm5pZCkpOwokc21hcnR5LT5hc3NpZ24oJ2Zvcm1lbmQnLCR0aGlzLT5DcmVhdGVGb3JtRW5kKCkpOwokc21hcnR5LT5hc3NpZ24oJ3Byb21wdF9hcGlrZXknLCR0aGlzLT5MYW5nKCdnb29nbGVfYXBpX2tleScpKTsKJHNtYXJ0eS0+YXNzaWduKCdpbnB1dF9hcGlrZXknLCR0aGlzLT5DcmVhdGVJbnB1dFRleHQoJGlkLCdnb29nbGVfYXBpa2V5JywKCQkJCQkJICAgICAgJHRoaXMtPkdldFByZWZlcmVuY2UoJ2dvb2dsZV9hcGlrZXknLCcnKSwxMDAsMTAyNCkpOwokc21hcnR5LT5hc3NpZ24oJ3N1Ym1pdCcsJHRoaXMtPkNyZWF0ZUlucHV0U3VibWl0KCRpZCwnc3VibWl0JywkdGhpcy0+TGFuZygnc3VibWl0JykpKTsKCmVjaG8gJHRoaXMtPlByb2Nlc3NUZW1wbGF0ZSgncHJlZnNfdGFiLnBocCcpOwovLyBFT0YKPz4=]]></data>
	</file>
	<file>
	  <filename>/images/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/images/icon.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhIAAgAPcAAO3t7evr6/v7++7u7vHx8fz8/C8vL+np6RYWFkRERO/v7+rq6jg4OEBAQObm5vb29ikpKezs7PDw8ENDQ0tLSzU1NS0tLfj4+DExMfLy8h0dHUhISGdnZywsLCcnJx4eHgwMDA8PDwYGBklJSfn5+Q0NDVVVVVFRUWJiYl9fXzQ0ND4+PvPz8zMzM+Pj4xcXFzk5OSAgIE1NTRsbGyMjIxkZGQ4ODhISEhUVFQcHBwkJCQgICE9PTxoaGnx8fOfn58nJydnZ2VRUVFBQUHt7e29vb0JCQkxMTF1dXQQEBBMTE3Z2dlNTU2xsbC4uLrGxsTAwMDo6OkVFRTs7OzIyMiYmJisrKxwcHCEhIX19fbi4uMDAwMPDw/r6+kFBQcbGxhgYGJGRkWVlZZqamrm5uUpKSlxcXD8/P2RkZHJyclJSUn9/fz09Paampvf390dHR93d3VtbW5aWlhAQEN/f3yoqKuXl5Wtrazc3NyUlJQAAAAUFBf39/eTk5EZGRsLCws3NzdDQ0GFhYdPT0+Dg4KysrAMDA4WFhVlZWc7OzrOzs8rKyujo6K6urpycnJCQkF5eXq2trZ6entTU1NHR0YSEhCIiInNzc2BgYCgoKKKiom5ubnV1dZWVlVZWVqurq2hoaGNjY7y8vB8fH3BwcMHBwY2NjfX19aGhoVdXV+Li4qCgoBEREXh4eMvLy21tbU5OTmlpadzc3LKysrCwsPT09DY2NpmZmVpaWiQkJNfX14CAgK+vr8fHx4ODg5+fnwsLC1hYWGZmZtXV1QoKCv7+/hQUFJubm+Hh4bu7u7S0tHd3d35+fo+Pj5KSktbW1piYmHR0dDw8PI6OjpOTk8/Pz4yMjNjY2IaGhnp6etvb28XFxdra2sjIyNLS0qqqqqmpqb+/v2pqaoGBgbe3t4KCgr6+vqSkpImJiXFxcYeHhwEBAYiIiAICAqioqKOjo8TExLW1taenp6WlpYuLi8zMzJSUlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAAAAAAALAAAAAAgACAAAAj/APMgGPiix5UPBlL4cqTlT6RAq3Zx8AOFxoceNWqA0TDjBQ5LN5Ik0VFiDg4EHVCMAado0S1eyqy9EgKjwygESuaEoMJDxhtcStbpULKRRp1Uh6ipawTknJYvnYQ1MIBhChsruZxAWhKLAygLBqh4sBJlSJY7JxKsEKNFXqNujxp8mFOixhskpDRBu7PEFKkiRZKiYxZGmAEsPSAwIPKETJAsM0KUAKHDQKFw6cJMmqSFVqEwt765OtDJ0oeOeaQhOTZLFQcENnLswRJNzhgi44AQgqMrQoYnlSLFc2QGyosSODyYcLSNAK4ke3JgWNMqTx13khrBcxAAQJBPkcjB/7KFZNMlFMGQtOLFRUGzOCiaEJHBysYNFFySfXER4MCwei74gMcGENRggBdChGKKLow8QAYRTYyQxw0l5KADA20Ash93fTgwiCBMxKADMMZAUAEFaQQxAAv2yHACLGqYwAMGWGBRRBCA2EHHAAco8AUoo9yQSQUtWGGBEdggowABT6gw1w5JiACCFRPAsAUyP1AyAAAsKCINA1N0gMAOIoSgRAJwSKAAFxZAkEADHdwAwh6ZICIHAA4AEQGevqCxARgivACBBS1M4QkhAyzgwDGQUOCHFFRMYYsSUEgywA9cdDeIM3F8gEMHFXiARRUGqLHjAgNksUM7euhhCDAQrP/gxBIE/FAKAAP0UQkDDXhhhQ17iLBDCVAEQkAAAaxxEAIgGNIqDmX4MMwBWwwgwTXZcHDCDCLkQAwrV0DAAxwEEJCBMhvcsQEeLdBAjAg0LAHEAqIAoMAzbYgRQwgxqLDCGQkIcYksGZBwgSgTVFADCAhQsYIHM5zxBwCKdOeCHAxkMkECHfSAQwwYmECHBBcIsMUETlTRbBIaHLGBAWMMoMkACiQSih+IqKBDtzvU0UAKB0RAggAH/GKEF1fYAEIOCJyARhZ2/AJABppwwAkbIdgQggZOmPGGOA4IzccpkySAQQVghHCDDTGAcsggqADwwzvTHEFDD7lsMIIUgsD/UEYiClxQjBvacGLACgxUgcAVHrRQRB+fBLCAK6FYUEUDiMBQQxVSYDBBNRI8MPgC5qRAgwYW4BGFEWwwocofERBQihBSpOCJB8ZooIIMMqTSBwEkFHABAJQ0c0QLL8ywAhqQoAAINwoA0MYaawxhiQYxGFAGBWygMUAGAhTQBZ60oGDCBHWMUkETzixihwKMPCFJLDBY0AEDG5xRRhRpZMBCAQUQAAAWIAt2GOAII1ABBCgAjSAEYEWByMIQNsYBMQihLEboxAUeID4BsABZT2gBBKhAgRMwgRSJKJcbqrEMJpiAGZvwgwVGEAc1rOIBFwig8CIwADikQAMecEIw0NLgg1JIIAMPoMQ0dvEITOABAwxAAg+MIIcHBI8PYzvAAVxQiQpAQQUMiEMYFhG7B+DrE2k4QwUSwAEKUGAChbhAF8LHh1rY4QcBQMUbEuCFKTQgGkAIgARqQYgtmMIMPPBEE9QgBRlQoBcPEEAXAPgARhxgAWQYAQxGMIITNGEeATBXBMhwhxRgwgeCiEIDhlAOF7BAALAUAAkk54BkYAIDDWCCGIpAj5FFbxZEuAQnNmGCV4yhFwcAgARiWQA3HEByovBBAo5ghiUs4xHeCAgAOw==]]></data>
	</file>
	<file>
	  <filename>/lang/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lang/en_US.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKIyBBCiRsYW5nWydhZGRyZXNzJ10gPSAnQWRkcmVzcyc7CiRsYW5nWydhZGRfbWFwJ10gPSAnQWRkIE1hcCc7CiRsYW5nWydhZGRfbWFwX3BvaW50J10gPSAnQWRkIE1hcCBQb2ludCc7CiRsYW5nWydhZGRfcG9pbnRfZm9yX21hcCddID0gJ0FkZCBQb2ludCB0byBNYXAgJnF1b3Q7JXMmcXVvdDsnOwoKIyBDCiRsYW5nWydjYW5jZWwnXSA9ICdDYW5jZWwnOwokbGFuZ1snY2VudGVyX2xhdCddID0gJ0NlbnRlciBMYXRpdHVkZSc7CiRsYW5nWydjZW50ZXJfbG9uJ10gPSAnQ2VudGVyIExvbmdpdHVkZSc7CiRsYW5nWydjaGFuZ2Vsb2cnXSA9IDw8PEVPVAo8dWw+CjxsaT4xLjAgLSBEZWNlbWJlciwgMjAwNwogIDxwPkluaXRpYWwgUmVsZWFzZTwvcD48L3VsPgo8bGk+MS4xIC0gSnVseSwgMjAwOAogIDxwPkFkZGVkIHRoZSB7Y2dnbV9hZGRfZHlucG9pbnR9IHNtYXJ0eSBwbHVnaW4gdG8gYWxsb3cgYWRkaW5nIHBvaW50cyB0byB0aGUgbWFwIGR5bmFtaWNhbGx5IHdpdGhpbiBzbWFydHkuPC9wPjwvdWw+CjwvdWw+CkVPVDsKJGxhbmdbJ2NsaWNrJ10gPSAnQ2xpY2snOwokbGFuZ1snY29udHJvbHMnXSA9ICdDb250cm9scyc7CiRsYW5nWydjb250cm9sc19zaXplJ10gPSAnU2l6ZSBvZiBDb250cm9scyc7CgojIEQKJGxhbmdbJ2RlZmF1bHQnXSA9ICdEZWZhdWx0JzsKJGxhbmdbJ2RlbGV0ZV9tYXAnXSA9ICdEZWxldGUgTWFwJzsKJGxhbmdbJ2RlbGV0ZV9tYXBfcG9pbnQnXSA9ICdEZWxldGUgTWFwIFBvaW50JzsKJGxhbmdbJ2Rlc2NyaXB0aW9uJ10gPSAnRGVzY3JpcHRpb24nOwokbGFuZ1snZGlyZWN0aW9ucyddID0gJ1Nob3cgRGlyZWN0aW9ucyc7CgojIEUKJGxhbmdbJ2VkaXRfbWFwJ10gPSAnRWRpdCBNYXAnOwokbGFuZ1snZWRpdF9tYXBfcG9pbnQnXSA9ICdFZGl0IE1hcCBQb2ludCc7CiRsYW5nWydlZGl0X21hcF9wb2ludHMnXSA9ICdFZGl0IE1hcCBQb2ludHMnOwokbGFuZ1snZWRpdF9wb2ludHNfZm9yX21hcCddID0gJ0VkaXQgUG9pbnRzIGZvciBNYXAgJnF1b3Q7JXMmcXVvdDsnOwokbGFuZ1snZXJyb3JfaW52YWxpZHBhcmFtcyddID0gJ09uZSBvciBtb3JlIHBhcmFtZXRlcnMgaXMgbWlzc2luZyBvciBpbnZhbGlkJzsKJGxhbmdbJ2Vycm9yX25vYXBpa2V5J10gPSAnVGhlIEdvb2dsZSBBUEkgS2V5IGlzIGVtcHR5JzsKJGxhbmdbJ2Vycm9yX3Blcm1pc3Npb25kZW5pZWQnXSA9ICdZb3UgZG9uXCd0IGhhdmUgdGhlIGFwcHJvcHJpYXRlIHBlcm1pc3Npb24gdG8gcGVyZm9ybSB0aGlzIGFjdGlvbic7CgojIEYgCiRsYW5nWydmcmllbmRseW5hbWUnXSA9ICdDYWxndXlzIEdvb2dsZSBNYXBzJzsKCiMgRwokbGFuZ1snZ29vZ2xlX2FwaV9rZXknXSA9ICdHb29nbGUgQVBJIEtleSc7CgojIEgKJGxhbmdbJ2hlbHAnXSA9IDw8PEVPVAo8aDM+V2hhdCBkb2VzIHRoaXMgZG88L2gzPgo8cD5UaGlzIGlzIGEgcmVwbGFjZW1lbnQgKGluIHByb2dyZXNzKSBmb3IgdHN3J3MgZ29vZ2xlbWFwcyBtb2R1bGUgdGhhdCBhbGxvd3MgdXNlcnMgdG8gZWFzaWx5IGNyZWF0ZSBnb29nbGUgbWFwcywgd2hpbHN0IGFsbG93aW5nIGF0b21pYyBwZXJtaXNzaW9ucyBzbyB0aGF0IG9ubHkgYXV0aG9yaXplZCB1c2VycyBoYXZlIGNlcnRhaW4gYWJpbGl0aWVzLiAgSXQgYWxzbyBhbGxvd3MgZm9yIGR5bmFtaWMgZ2VvbG9jYXRpbmcgKHdpdGggY2FjaGluZykgc28gdGhhdCB5b3UgY2FuIHNwZWNpZnkgYSBsb2NhdGlvbiBieSBhZGRyZXNzIGluc3RlYWQgb2YgYnkgbGF0aXR1ZGUgYW5kIGxvbmdpdHVkZS48L3A+CjxwPlRoaXMgbW9kdWxlIGFsbG93cyBtdWx0aXBsZSBtYXBzIHRvIGJlIGRpc3BsYXllZCBvbiBhIHNpbmdsZSBwYWdlLCBhbmQgbXVsdGlwbGUgJ21hcmtlcnMnIG9yIHBvaW50cyBvbiBlYWNoIG1hcCwgc28gdGhhdCBpdCBjYW4gYmUgdXNlZCBpbiBhIHdheSBzaW1pbGFyIHRvIGZyYXBwZXIuPC9wPgo8aDM+SG93IERvIEkgVXNlIEl0PzwvaDM+Cjx1bD4KPGxpPkluc3RhbGwgdGhlIG1vZHVsZSB2aWEgdGhlIG5vcm1hbCBtZXRob2RzPC9saT4KPGxpPlNldHVwIHlvdXIgdXNlcnMgYW5kIGdyb3VwcyB3aXRoIHRoZSBhcHByb3ByaWF0ZSBwZXJtaXNzaW9uczoKICA8dWw+CiAgICA8bGk+VGhlICdNYW5hZ2UgTWFwcycgUGVybWlzc2lvbiBhbGxvd3MgYWRtaW5pc3RyYXRvcnMgdG8gYWRkL2VkaXQgYW5kIGRlbGV0ZSBtYXBzPC9saT4KICAgIDxsaT5UaGUgJ01hbmFnZSBNYXAgTG9jYXRpb25zJyBwZXJtaXNzaW9uIGFsbG93cyBhZG1pbmlzdHJhdG9ycyB0byBhZGQvZWRpdC9kZWxldGUgcG9pbnRzIHdpdGhpbiBhIG1hcDwvbGk+CiAgPC91bD4KPC9saT4KPGxpPkNyZWF0ZSBhIG1hcC4gIEdpdmUgdGhlIG1hcCBhIG5hbWUsIGFuZCBhZGp1c3QgdGhlIHBhcmFtdGVycyBvZiB0aGUgcGFydGljdWxhciBtYXAgdG8gbWVldCB5b3VyIGxpa2luZzwvcD4KPGxpPk1hcmsgb25lIG9mIHlvdXIgbWFwcyBhcyBkZWZhdWx0LCBieSBjbGlja2luZyBvbiB0aGUgcmVkICdYJyBiZXNpZGUgYSBwYXJ0aWN1bGFyIG1hcC4gIFRoaXMgaXMgdXNlZnVsIGlmIHlvdSBkb24ndCBzcGVjaWZ5IHRoZSAnbWFwJyBwYXJhbWV0ZXIgb24gdGhlIHRhZy48L2xpPgo8bGk+Q3JlYXRlIG9uZSBvciBtb3JlIHBvaW50cyB3aXRoaW4gdGhlIG1hcCwgZWl0aGVyIGJ5IHNwZWNpZnlpbmcgYSBsYXRpdHVkZSBhbmQgbG9uZ2l0dWRlLCBvciB3aXRoIGFuIGFkZHJlc3MuPC9saT4KPGxpPkFkZCB0aGUge0NHR29vZ2xlTWFwc30gdGFnIGluc2lkZSB0aGUgY29udGVudCBibG9jayBvZiBhIHBhZ2UsIG9yIGluc2lkZSBhIHBhZ2UgdGVtcGxhdGUuICBUaGVuIHlvdSdyZSBmaW5pc2hlZC48L2xpPgo8L3VsPgo8YnIvPgo8aDM+QWRkaW5nIFBvaW50cyB0byBhIE1hcCBEeW5hbWljYWxseTwvaDM+CjxwPllvdSBjYW4gdXNlIHNtYXJ0eSB0byBhZGQgcG9pbnRzIHRvIGEgbW9kdWxlIGR5bmFtaWNhbGx5LiAgWW91IGNhbiB1c2UgdGhpcyBmdW5jdGlvbmFsaXR5IHRvIGJ1aWxkIGEgZnJhcHByIGxpa2UgbWFwIHdpdGggbXVsdGlwbGUgcG9pbnRzIHRoYXQgYXJlIGNvbnRyb2xsZWQgZHluYW1pY2FsbHkgZnJvbSBhbm90aGVyIG1vZHVsZSAobGlrZSBDb21wYW55RGlyZWN0b3J5IG9yIEZyb250RW5kVXNlcnMpLjwvcD4KPGg0PlRoZSB7Y2dnbV9hZGRfZHlucG9pbnR9IFNtYXJ0eSBQbHVnaW48L2g0Pgo8cD5UaGlzIHNtYXJ0eSBwbHVnaW4gPGVtPihvbmx5IGF2YWlsYWJsZSB3aGVuIENHR29vZ2xlTWFwcyBpcyBpbnN0YWxsZWQpPC9lbT4gYWxsb3dzIGFkZGluZyBhIHBvaW50IGR5bmFtaWNhbGx5IHRvIGEgc3BlY2lmaWVkIG1hcC48L3A+CjxoNT5QYXJhbWV0ZXJzOjxoNT4KICA8dWw+IAo8bGk+PHN0cm9uZz5yZXF1aXJlZDwvc3Ryb25nPiAtIG1hcCA6IFRoZSBJRCBvZiB0aGUgbWFwIHRvIGFkZCB0aGUgcG9pbnQgdG88L2xpPgo8bGk+PHN0cm9uZz5yZXF1aXJlZDwvc3Ryb25nPiAtIG5hbWUgOiBUaGUgbmFtZSBvZiB0aGUgcG9pbnQgdG8gYWRkPC9saT4KPGxpPjxlbT5vcHRpb25hbDwvZW0+IC0gZGVzY3JpcHRpb24gOiBUaGUgSFRNTCBjb250ZW50IHRvIHNob3cgaW4gdGhlIHBvcHVwIGJ1YmJsZTwvbGk+CjxsaT48ZW0+b3B0aW9uYWw8L2VtPiAtIGFkZHJlc3MgOiBUaGUgYWRkcmVzcyBvZiB0aGUgbG9jYXRpb24geW91IGFyZSBhZGRpbmcuPC9saT4KPGxpPjxlbT5vcHRpb25hbDwvZW0+IC0gbGF0IDogVGhlIGxhdGl0dWRlIG9mIHRoZSBsb2NhdGlvbiB5b3UgYXJlIGFkZGluZy48L2xpPgo8bGk+PGVtPm9wdGlvbmFsPC9lbT4gLSBsb25nIDogVGhlIGxvbmdpdHVkZSBvZiB0aGUgbG9jYXRpb24geW91IGFyZSBhZGRpbmcuPC9saT4KICA8L3VsPgo8YnIvPgo8cD48c3Ryb25nPk5vdGU6PC9zdHJvbmc+IEVpdGhlciB0aGUgbGF0IGFuZCBsb25nIHBhcmFtZXRlcnMgbXVzdCBiZSBzcGVjaWZpZWQsIG9yIHRoZSBhZGRyZXNzLjwvcD4KPHA+PHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiBUaGlzIHBsdWdpbiByZXR1cm5zIG5vIGRpcmVjdCBvdXRwdXQsIGFuZCBpZiBlcnJvcnMgb2NjdXIsIGl0IHdpbGwgc2lsZW50bHkgZmFpbC4gIFN1Y2Nlc3MgbWVhbnMgdGhhdCB0aGUgcG9pbnQgd2lsbCBzaG93IHVwIG9uIHlvdXIgZ29vZ2xlIG1hcC48L3A+CjwvdWw+CkVPVDsKJGxhbmdbJ2hlaWdodCddID0gJ0hlaWdodCc7CiRsYW5nWydoZWxwX3BhcmFtX21hcCddID0gJ1NwZWNpZnkgdGhlIElEIG9yIG1hcCBuYW1lIHRvIHVzZSBmb3IgbGF5aW5nIG91dCB0aGUgZ29vZ2xlIG1hcC4gIElmIHRoaXMgcGFyYW1ldGVyIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBkZWZhdWx0IG1hcCAoaWYgYW55KSBpcyB1c2VkLic7CiRsYW5nWydoeWJyaWQnXSA9ICdIeWJyaWQnOwoKIyBJCiRsYW5nWydpZCddID0gJ0lkJzsKJGxhbmdbJ2luZm9fYWRkcmVzc19sYXRsb25nJ10gPSAnTm90ZTogRW50ZXIgPHN0cm9uZz5laXRoZXI8L3N0cm9uZz4gYW4gYWRkcmVzcyA8c3Ryb25nPm9yPC9zdHJvbmc+IGEgbGF0dGl0dWRlIGFuZCBsb25naXR1ZGUuICBJZiBib3RoIHRoZSBhZGRyZXNzIGFuZCBsYXRpdHVkZSBhbmQgbG9uZ2l0dWRlIGFyZSBzcGVjaWZpZWQsIGxhdGl0dWRlIGFuZCBsb25naXR1ZGUgd2lsbCBiZSBnaXZlbiBwcmVmZXJlbmNlLic7CiRsYW5nWydpbmZvX3dpbmRvdyddID0gJ1Nob3cgSW5mbyBXaW5kb3cnOwokbGFuZ1snaW5mb190cmlnZ2VyJ10gPSAnSW5mbyBXaW5kb3cgVHJpZ2dlcic7CgojIEwKJGxhbmdbJ2xhcmdlJ10gPSAnTGFyZ2UnOwokbGFuZ1snbGF0aXR1ZGUnXSA9ICdMYXRpdHVkZSc7CiRsYW5nWydsb2NhdGlvbiddID0gJ0xvY2F0aW9uJzsKJGxhbmdbJ2xvbmdpdHVkZSddID0gJ0xvbmdpdHVkZSc7CgojIE0KJGxhbmdbJ21hcCddID0gJ01hcCc7CiRsYW5nWydtYXBzJ10gPSAnTWFwcyc7CiRsYW5nWydtYXBfbmFtZSddID0gJ01hcCBOYW1lJzsKJGxhbmdbJ21vZGRlc2NyaXB0aW9uJ10gPSAnQSBzaW1wbGUgbW9kdWxlIGZvciBjcmVhdGluZyBnb29nbGUgbWFwcyc7CiRsYW5nWydtb3VzZW92ZXInXSA9ICdNb3VzZU92ZXInOwoKIyBOCiRsYW5nWyduYW1lJ10gPSAnTmFtZSc7CgojIFAKJGxhbmdbJ3BvaW50cyddID0gJ1BvaW50cyc7CiRsYW5nWydwb2ludF9uYW1lJ10gPSAnUG9pbnQgTmFtZSc7CiRsYW5nWydwb3N0aW5zdGFsbCddID0gJ1RoZSBDR0dvb2dsZU1hcHMgbW9kdWxlIGhhcyBiZWVuIGluc3RhbGxlZCc7OwokbGFuZ1sncG9zdHVuaW5zdGFsbCddID0gJ1RoZSBDR0dvb2dsZU1hcHMgbW9kdWxlIGFuZCBhbGwgcmVsZXZhbnQgZGF0YSBoYXMgYmVlbiByZW1vdmVkJzsKJGxhbmdbJ3ByZWZlcmVuY2VzJ10gPSAnUHJlZmVyZW5jZXMnOwoKIyBSCiRsYW5nWydyZWFsbHlfdW5pbnN0YWxsJ10gPSAnQXJlIHlvdSBzdXJlIHlvdSByZWFsbHkgd2FudCB0byByZW1vdmUgdGhpcyBtb2R1bGU/JzsKCiMgUwokbGFuZ1snc2F0ZWxsaXRlJ10gPSAnU2F0ZWxsaXRlJzsKJGxhbmdbJ3NldF9kZmx0X21hcCddID0gJ1NldCBNYXAgQXMgRGVmYXVsdCc7CiRsYW5nWydzaWRlYmFyJ10gPSAnU2hvdyBTaWRlYmFyJzsKJGxhbmdbJ3NtYWxsJ10gPSAnU21hbGwnOwokbGFuZ1snc3VibWl0J10gPSAnU3VibWl0JzsKCiMgVAokbGFuZ1sndGV4dCddID0gJ1RleHQnOwokbGFuZ1sndHlwZSddID0gJ1R5cGUnOwokbGFuZ1sndHlwZV9jb250cm9scyddID0gJ1Nob3cgVHlwZSBDb250cm9scyc7CgojIFcKJGxhbmdbJ3dpZHRoJ10gPSAnV2lkdGgnOwoKIyBaCiRsYW5nWyd6b29tJ10gPSAnWm9vbSBMZXZlbCc7CiRsYW5nWyd6b29tX2VuY29tcGFzcyddID0gJ1pvb20gRW5jb21wYXNzJzsKPz4K]]></data>
	</file>
	<file>
	  <filename>/lib/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/GoogleMapAPI-2.4/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/GoogleMapAPI-2.4/COPYING.lib</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[CQkgIEdOVSBMRVNTRVIgR0VORVJBTCBQVUJMSUMgTElDRU5TRQoJCSAgICAgICBWZXJzaW9uIDIuMSwgRmVicnVhcnkgMTk5OQoKIENvcHlyaWdodCAoQykgMTk5MSwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KICAgICA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCiBFdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMKIG9mIHRoaXMgbGljZW5zZSBkb2N1bWVudCwgYnV0IGNoYW5naW5nIGl0IGlzIG5vdCBhbGxvd2VkLgoKW1RoaXMgaXMgdGhlIGZpcnN0IHJlbGVhc2VkIHZlcnNpb24gb2YgdGhlIExlc3NlciBHUEwuICBJdCBhbHNvIGNvdW50cwogYXMgdGhlIHN1Y2Nlc3NvciBvZiB0aGUgR05VIExpYnJhcnkgUHVibGljIExpY2Vuc2UsIHZlcnNpb24gMiwgaGVuY2UKIHRoZSB2ZXJzaW9uIG51bWJlciAyLjEuXQoKCQkJICAgIFByZWFtYmxlCgogIFRoZSBsaWNlbnNlcyBmb3IgbW9zdCBzb2Z0d2FyZSBhcmUgZGVzaWduZWQgdG8gdGFrZSBhd2F5IHlvdXIKZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlIGl0LiAgQnkgY29udHJhc3QsIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKTGljZW5zZXMgYXJlIGludGVuZGVkIHRvIGd1YXJhbnRlZSB5b3VyIGZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZQpmcmVlIHNvZnR3YXJlLS10byBtYWtlIHN1cmUgdGhlIHNvZnR3YXJlIGlzIGZyZWUgZm9yIGFsbCBpdHMgdXNlcnMuCgogIFRoaXMgbGljZW5zZSwgdGhlIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBhcHBsaWVzIHRvIHNvbWUKc3BlY2lhbGx5IGRlc2lnbmF0ZWQgc29mdHdhcmUgcGFja2FnZXMtLXR5cGljYWxseSBsaWJyYXJpZXMtLW9mIHRoZQpGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIG90aGVyIGF1dGhvcnMgd2hvIGRlY2lkZSB0byB1c2UgaXQuICBZb3UKY2FuIHVzZSBpdCB0b28sIGJ1dCB3ZSBzdWdnZXN0IHlvdSBmaXJzdCB0aGluayBjYXJlZnVsbHkgYWJvdXQgd2hldGhlcgp0aGlzIGxpY2Vuc2Ugb3IgdGhlIG9yZGluYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgdGhlIGJldHRlcgpzdHJhdGVneSB0byB1c2UgaW4gYW55IHBhcnRpY3VsYXIgY2FzZSwgYmFzZWQgb24gdGhlIGV4cGxhbmF0aW9ucyBiZWxvdy4KCiAgV2hlbiB3ZSBzcGVhayBvZiBmcmVlIHNvZnR3YXJlLCB3ZSBhcmUgcmVmZXJyaW5nIHRvIGZyZWVkb20gb2YgdXNlLApub3QgcHJpY2UuICBPdXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZXMgYXJlIGRlc2lnbmVkIHRvIG1ha2Ugc3VyZSB0aGF0CnlvdSBoYXZlIHRoZSBmcmVlZG9tIHRvIGRpc3RyaWJ1dGUgY29waWVzIG9mIGZyZWUgc29mdHdhcmUgKGFuZCBjaGFyZ2UKZm9yIHRoaXMgc2VydmljZSBpZiB5b3Ugd2lzaCk7IHRoYXQgeW91IHJlY2VpdmUgc291cmNlIGNvZGUgb3IgY2FuIGdldAppdCBpZiB5b3Ugd2FudCBpdDsgdGhhdCB5b3UgY2FuIGNoYW5nZSB0aGUgc29mdHdhcmUgYW5kIHVzZSBwaWVjZXMgb2YKaXQgaW4gbmV3IGZyZWUgcHJvZ3JhbXM7IGFuZCB0aGF0IHlvdSBhcmUgaW5mb3JtZWQgdGhhdCB5b3UgY2FuIGRvCnRoZXNlIHRoaW5ncy4KCiAgVG8gcHJvdGVjdCB5b3VyIHJpZ2h0cywgd2UgbmVlZCB0byBtYWtlIHJlc3RyaWN0aW9ucyB0aGF0IGZvcmJpZApkaXN0cmlidXRvcnMgdG8gZGVueSB5b3UgdGhlc2UgcmlnaHRzIG9yIHRvIGFzayB5b3UgdG8gc3VycmVuZGVyIHRoZXNlCnJpZ2h0cy4gIFRoZXNlIHJlc3RyaWN0aW9ucyB0cmFuc2xhdGUgdG8gY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIGZvcgp5b3UgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZSBsaWJyYXJ5IG9yIGlmIHlvdSBtb2RpZnkgaXQuCgogIEZvciBleGFtcGxlLCBpZiB5b3UgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlIGxpYnJhcnksIHdoZXRoZXIgZ3JhdGlzCm9yIGZvciBhIGZlZSwgeW91IG11c3QgZ2l2ZSB0aGUgcmVjaXBpZW50cyBhbGwgdGhlIHJpZ2h0cyB0aGF0IHdlIGdhdmUKeW91LiAgWW91IG11c3QgbWFrZSBzdXJlIHRoYXQgdGhleSwgdG9vLCByZWNlaXZlIG9yIGNhbiBnZXQgdGhlIHNvdXJjZQpjb2RlLiAgSWYgeW91IGxpbmsgb3RoZXIgY29kZSB3aXRoIHRoZSBsaWJyYXJ5LCB5b3UgbXVzdCBwcm92aWRlCmNvbXBsZXRlIG9iamVjdCBmaWxlcyB0byB0aGUgcmVjaXBpZW50cywgc28gdGhhdCB0aGV5IGNhbiByZWxpbmsgdGhlbQp3aXRoIHRoZSBsaWJyYXJ5IGFmdGVyIG1ha2luZyBjaGFuZ2VzIHRvIHRoZSBsaWJyYXJ5IGFuZCByZWNvbXBpbGluZwppdC4gIEFuZCB5b3UgbXVzdCBzaG93IHRoZW0gdGhlc2UgdGVybXMgc28gdGhleSBrbm93IHRoZWlyIHJpZ2h0cy4KCiAgV2UgcHJvdGVjdCB5b3VyIHJpZ2h0cyB3aXRoIGEgdHdvLXN0ZXAgbWV0aG9kOiAoMSkgd2UgY29weXJpZ2h0IHRoZQpsaWJyYXJ5LCBhbmQgKDIpIHdlIG9mZmVyIHlvdSB0aGlzIGxpY2Vuc2UsIHdoaWNoIGdpdmVzIHlvdSBsZWdhbApwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kL29yIG1vZGlmeSB0aGUgbGlicmFyeS4KCiAgVG8gcHJvdGVjdCBlYWNoIGRpc3RyaWJ1dG9yLCB3ZSB3YW50IHRvIG1ha2UgaXQgdmVyeSBjbGVhciB0aGF0CnRoZXJlIGlzIG5vIHdhcnJhbnR5IGZvciB0aGUgZnJlZSBsaWJyYXJ5LiAgQWxzbywgaWYgdGhlIGxpYnJhcnkgaXMKbW9kaWZpZWQgYnkgc29tZW9uZSBlbHNlIGFuZCBwYXNzZWQgb24sIHRoZSByZWNpcGllbnRzIHNob3VsZCBrbm93CnRoYXQgd2hhdCB0aGV5IGhhdmUgaXMgbm90IHRoZSBvcmlnaW5hbCB2ZXJzaW9uLCBzbyB0aGF0IHRoZSBvcmlnaW5hbAphdXRob3IncyByZXB1dGF0aW9uIHdpbGwgbm90IGJlIGFmZmVjdGVkIGJ5IHByb2JsZW1zIHRoYXQgbWlnaHQgYmUKaW50cm9kdWNlZCBieSBvdGhlcnMuCgwKICBGaW5hbGx5LCBzb2Z0d2FyZSBwYXRlbnRzIHBvc2UgYSBjb25zdGFudCB0aHJlYXQgdG8gdGhlIGV4aXN0ZW5jZSBvZgphbnkgZnJlZSBwcm9ncmFtLiAgV2Ugd2lzaCB0byBtYWtlIHN1cmUgdGhhdCBhIGNvbXBhbnkgY2Fubm90CmVmZmVjdGl2ZWx5IHJlc3RyaWN0IHRoZSB1c2VycyBvZiBhIGZyZWUgcHJvZ3JhbSBieSBvYnRhaW5pbmcgYQpyZXN0cmljdGl2ZSBsaWNlbnNlIGZyb20gYSBwYXRlbnQgaG9sZGVyLiAgVGhlcmVmb3JlLCB3ZSBpbnNpc3QgdGhhdAphbnkgcGF0ZW50IGxpY2Vuc2Ugb2J0YWluZWQgZm9yIGEgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSBtdXN0IGJlCmNvbnNpc3RlbnQgd2l0aCB0aGUgZnVsbCBmcmVlZG9tIG9mIHVzZSBzcGVjaWZpZWQgaW4gdGhpcyBsaWNlbnNlLgoKICBNb3N0IEdOVSBzb2Z0d2FyZSwgaW5jbHVkaW5nIHNvbWUgbGlicmFyaWVzLCBpcyBjb3ZlcmVkIGJ5IHRoZQpvcmRpbmFyeSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIFRoaXMgbGljZW5zZSwgdGhlIEdOVSBMZXNzZXIKR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgYXBwbGllcyB0byBjZXJ0YWluIGRlc2lnbmF0ZWQgbGlicmFyaWVzLCBhbmQKaXMgcXVpdGUgZGlmZmVyZW50IGZyb20gdGhlIG9yZGluYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBXZSB1c2UKdGhpcyBsaWNlbnNlIGZvciBjZXJ0YWluIGxpYnJhcmllcyBpbiBvcmRlciB0byBwZXJtaXQgbGlua2luZyB0aG9zZQpsaWJyYXJpZXMgaW50byBub24tZnJlZSBwcm9ncmFtcy4KCiAgV2hlbiBhIHByb2dyYW0gaXMgbGlua2VkIHdpdGggYSBsaWJyYXJ5LCB3aGV0aGVyIHN0YXRpY2FsbHkgb3IgdXNpbmcKYSBzaGFyZWQgbGlicmFyeSwgdGhlIGNvbWJpbmF0aW9uIG9mIHRoZSB0d28gaXMgbGVnYWxseSBzcGVha2luZyBhCmNvbWJpbmVkIHdvcmssIGEgZGVyaXZhdGl2ZSBvZiB0aGUgb3JpZ2luYWwgbGlicmFyeS4gIFRoZSBvcmRpbmFyeQpHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHRoZXJlZm9yZSBwZXJtaXRzIHN1Y2ggbGlua2luZyBvbmx5IGlmIHRoZQplbnRpcmUgY29tYmluYXRpb24gZml0cyBpdHMgY3JpdGVyaWEgb2YgZnJlZWRvbS4gIFRoZSBMZXNzZXIgR2VuZXJhbApQdWJsaWMgTGljZW5zZSBwZXJtaXRzIG1vcmUgbGF4IGNyaXRlcmlhIGZvciBsaW5raW5nIG90aGVyIGNvZGUgd2l0aAp0aGUgbGlicmFyeS4KCiAgV2UgY2FsbCB0aGlzIGxpY2Vuc2UgdGhlICJMZXNzZXIiIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYmVjYXVzZSBpdApkb2VzIExlc3MgdG8gcHJvdGVjdCB0aGUgdXNlcidzIGZyZWVkb20gdGhhbiB0aGUgb3JkaW5hcnkgR2VuZXJhbApQdWJsaWMgTGljZW5zZS4gIEl0IGFsc28gcHJvdmlkZXMgb3RoZXIgZnJlZSBzb2Z0d2FyZSBkZXZlbG9wZXJzIExlc3MKb2YgYW4gYWR2YW50YWdlIG92ZXIgY29tcGV0aW5nIG5vbi1mcmVlIHByb2dyYW1zLiAgVGhlc2UgZGlzYWR2YW50YWdlcwphcmUgdGhlIHJlYXNvbiB3ZSB1c2UgdGhlIG9yZGluYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1hbnkKbGlicmFyaWVzLiAgSG93ZXZlciwgdGhlIExlc3NlciBsaWNlbnNlIHByb3ZpZGVzIGFkdmFudGFnZXMgaW4gY2VydGFpbgpzcGVjaWFsIGNpcmN1bXN0YW5jZXMuCgogIEZvciBleGFtcGxlLCBvbiByYXJlIG9jY2FzaW9ucywgdGhlcmUgbWF5IGJlIGEgc3BlY2lhbCBuZWVkIHRvCmVuY291cmFnZSB0aGUgd2lkZXN0IHBvc3NpYmxlIHVzZSBvZiBhIGNlcnRhaW4gbGlicmFyeSwgc28gdGhhdCBpdCBiZWNvbWVzCmEgZGUtZmFjdG8gc3RhbmRhcmQuICBUbyBhY2hpZXZlIHRoaXMsIG5vbi1mcmVlIHByb2dyYW1zIG11c3QgYmUKYWxsb3dlZCB0byB1c2UgdGhlIGxpYnJhcnkuICBBIG1vcmUgZnJlcXVlbnQgY2FzZSBpcyB0aGF0IGEgZnJlZQpsaWJyYXJ5IGRvZXMgdGhlIHNhbWUgam9iIGFzIHdpZGVseSB1c2VkIG5vbi1mcmVlIGxpYnJhcmllcy4gIEluIHRoaXMKY2FzZSwgdGhlcmUgaXMgbGl0dGxlIHRvIGdhaW4gYnkgbGltaXRpbmcgdGhlIGZyZWUgbGlicmFyeSB0byBmcmVlCnNvZnR3YXJlIG9ubHksIHNvIHdlIHVzZSB0aGUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCgogIEluIG90aGVyIGNhc2VzLCBwZXJtaXNzaW9uIHRvIHVzZSBhIHBhcnRpY3VsYXIgbGlicmFyeSBpbiBub24tZnJlZQpwcm9ncmFtcyBlbmFibGVzIGEgZ3JlYXRlciBudW1iZXIgb2YgcGVvcGxlIHRvIHVzZSBhIGxhcmdlIGJvZHkgb2YKZnJlZSBzb2Z0d2FyZS4gIEZvciBleGFtcGxlLCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgR05VIEMgTGlicmFyeSBpbgpub24tZnJlZSBwcm9ncmFtcyBlbmFibGVzIG1hbnkgbW9yZSBwZW9wbGUgdG8gdXNlIHRoZSB3aG9sZSBHTlUKb3BlcmF0aW5nIHN5c3RlbSwgYXMgd2VsbCBhcyBpdHMgdmFyaWFudCwgdGhlIEdOVS9MaW51eCBvcGVyYXRpbmcKc3lzdGVtLgoKICBBbHRob3VnaCB0aGUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgTGVzcyBwcm90ZWN0aXZlIG9mIHRoZQp1c2VycycgZnJlZWRvbSwgaXQgZG9lcyBlbnN1cmUgdGhhdCB0aGUgdXNlciBvZiBhIHByb2dyYW0gdGhhdCBpcwpsaW5rZWQgd2l0aCB0aGUgTGlicmFyeSBoYXMgdGhlIGZyZWVkb20gYW5kIHRoZSB3aGVyZXdpdGhhbCB0byBydW4KdGhhdCBwcm9ncmFtIHVzaW5nIGEgbW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgTGlicmFyeS4KCiAgVGhlIHByZWNpc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQKbW9kaWZpY2F0aW9uIGZvbGxvdy4gIFBheSBjbG9zZSBhdHRlbnRpb24gdG8gdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBhCiJ3b3JrIGJhc2VkIG9uIHRoZSBsaWJyYXJ5IiBhbmQgYSAid29yayB0aGF0IHVzZXMgdGhlIGxpYnJhcnkiLiAgVGhlCmZvcm1lciBjb250YWlucyBjb2RlIGRlcml2ZWQgZnJvbSB0aGUgbGlicmFyeSwgd2hlcmVhcyB0aGUgbGF0dGVyIG11c3QKYmUgY29tYmluZWQgd2l0aCB0aGUgbGlicmFyeSBpbiBvcmRlciB0byBydW4uCgwKCQkgIEdOVSBMRVNTRVIgR0VORVJBTCBQVUJMSUMgTElDRU5TRQogICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgQ09QWUlORywgRElTVFJJQlVUSU9OIEFORCBNT0RJRklDQVRJT04KCiAgMC4gVGhpcyBMaWNlbnNlIEFncmVlbWVudCBhcHBsaWVzIHRvIGFueSBzb2Z0d2FyZSBsaWJyYXJ5IG9yIG90aGVyCnByb2dyYW0gd2hpY2ggY29udGFpbnMgYSBub3RpY2UgcGxhY2VkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVyIG9yCm90aGVyIGF1dGhvcml6ZWQgcGFydHkgc2F5aW5nIGl0IG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YKdGhpcyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoYWxzbyBjYWxsZWQgInRoaXMgTGljZW5zZSIpLgpFYWNoIGxpY2Vuc2VlIGlzIGFkZHJlc3NlZCBhcyAieW91Ii4KCiAgQSAibGlicmFyeSIgbWVhbnMgYSBjb2xsZWN0aW9uIG9mIHNvZnR3YXJlIGZ1bmN0aW9ucyBhbmQvb3IgZGF0YQpwcmVwYXJlZCBzbyBhcyB0byBiZSBjb252ZW5pZW50bHkgbGlua2VkIHdpdGggYXBwbGljYXRpb24gcHJvZ3JhbXMKKHdoaWNoIHVzZSBzb21lIG9mIHRob3NlIGZ1bmN0aW9ucyBhbmQgZGF0YSkgdG8gZm9ybSBleGVjdXRhYmxlcy4KCiAgVGhlICJMaWJyYXJ5IiwgYmVsb3csIHJlZmVycyB0byBhbnkgc3VjaCBzb2Z0d2FyZSBsaWJyYXJ5IG9yIHdvcmsKd2hpY2ggaGFzIGJlZW4gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlc2UgdGVybXMuICBBICJ3b3JrIGJhc2VkIG9uIHRoZQpMaWJyYXJ5IiBtZWFucyBlaXRoZXIgdGhlIExpYnJhcnkgb3IgYW55IGRlcml2YXRpdmUgd29yayB1bmRlcgpjb3B5cmlnaHQgbGF3OiB0aGF0IGlzIHRvIHNheSwgYSB3b3JrIGNvbnRhaW5pbmcgdGhlIExpYnJhcnkgb3IgYQpwb3J0aW9uIG9mIGl0LCBlaXRoZXIgdmVyYmF0aW0gb3Igd2l0aCBtb2RpZmljYXRpb25zIGFuZC9vciB0cmFuc2xhdGVkCnN0cmFpZ2h0Zm9yd2FyZGx5IGludG8gYW5vdGhlciBsYW5ndWFnZS4gIChIZXJlaW5hZnRlciwgdHJhbnNsYXRpb24gaXMKaW5jbHVkZWQgd2l0aG91dCBsaW1pdGF0aW9uIGluIHRoZSB0ZXJtICJtb2RpZmljYXRpb24iLikKCiAgIlNvdXJjZSBjb2RlIiBmb3IgYSB3b3JrIG1lYW5zIHRoZSBwcmVmZXJyZWQgZm9ybSBvZiB0aGUgd29yayBmb3IKbWFraW5nIG1vZGlmaWNhdGlvbnMgdG8gaXQuICBGb3IgYSBsaWJyYXJ5LCBjb21wbGV0ZSBzb3VyY2UgY29kZSBtZWFucwphbGwgdGhlIHNvdXJjZSBjb2RlIGZvciBhbGwgbW9kdWxlcyBpdCBjb250YWlucywgcGx1cyBhbnkgYXNzb2NpYXRlZAppbnRlcmZhY2UgZGVmaW5pdGlvbiBmaWxlcywgcGx1cyB0aGUgc2NyaXB0cyB1c2VkIHRvIGNvbnRyb2wgY29tcGlsYXRpb24KYW5kIGluc3RhbGxhdGlvbiBvZiB0aGUgbGlicmFyeS4KCiAgQWN0aXZpdGllcyBvdGhlciB0aGFuIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQgbW9kaWZpY2F0aW9uIGFyZSBub3QKY292ZXJlZCBieSB0aGlzIExpY2Vuc2U7IHRoZXkgYXJlIG91dHNpZGUgaXRzIHNjb3BlLiAgVGhlIGFjdCBvZgpydW5uaW5nIGEgcHJvZ3JhbSB1c2luZyB0aGUgTGlicmFyeSBpcyBub3QgcmVzdHJpY3RlZCwgYW5kIG91dHB1dCBmcm9tCnN1Y2ggYSBwcm9ncmFtIGlzIGNvdmVyZWQgb25seSBpZiBpdHMgY29udGVudHMgY29uc3RpdHV0ZSBhIHdvcmsgYmFzZWQKb24gdGhlIExpYnJhcnkgKGluZGVwZW5kZW50IG9mIHRoZSB1c2Ugb2YgdGhlIExpYnJhcnkgaW4gYSB0b29sIGZvcgp3cml0aW5nIGl0KS4gIFdoZXRoZXIgdGhhdCBpcyB0cnVlIGRlcGVuZHMgb24gd2hhdCB0aGUgTGlicmFyeSBkb2VzCmFuZCB3aGF0IHRoZSBwcm9ncmFtIHRoYXQgdXNlcyB0aGUgTGlicmFyeSBkb2VzLgogIAogIDEuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YgdGhlIExpYnJhcnkncwpjb21wbGV0ZSBzb3VyY2UgY29kZSBhcyB5b3UgcmVjZWl2ZSBpdCwgaW4gYW55IG1lZGl1bSwgcHJvdmlkZWQgdGhhdAp5b3UgY29uc3BpY3VvdXNseSBhbmQgYXBwcm9wcmlhdGVseSBwdWJsaXNoIG9uIGVhY2ggY29weSBhbgphcHByb3ByaWF0ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCBkaXNjbGFpbWVyIG9mIHdhcnJhbnR5OyBrZWVwIGludGFjdAphbGwgdGhlIG5vdGljZXMgdGhhdCByZWZlciB0byB0aGlzIExpY2Vuc2UgYW5kIHRvIHRoZSBhYnNlbmNlIG9mIGFueQp3YXJyYW50eTsgYW5kIGRpc3RyaWJ1dGUgYSBjb3B5IG9mIHRoaXMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZQpMaWJyYXJ5LgoKICBZb3UgbWF5IGNoYXJnZSBhIGZlZSBmb3IgdGhlIHBoeXNpY2FsIGFjdCBvZiB0cmFuc2ZlcnJpbmcgYSBjb3B5LAphbmQgeW91IG1heSBhdCB5b3VyIG9wdGlvbiBvZmZlciB3YXJyYW50eSBwcm90ZWN0aW9uIGluIGV4Y2hhbmdlIGZvciBhCmZlZS4KDAogIDIuIFlvdSBtYXkgbW9kaWZ5IHlvdXIgY29weSBvciBjb3BpZXMgb2YgdGhlIExpYnJhcnkgb3IgYW55IHBvcnRpb24Kb2YgaXQsIHRodXMgZm9ybWluZyBhIHdvcmsgYmFzZWQgb24gdGhlIExpYnJhcnksIGFuZCBjb3B5IGFuZApkaXN0cmlidXRlIHN1Y2ggbW9kaWZpY2F0aW9ucyBvciB3b3JrIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9uIDEKYWJvdmUsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCBhbGwgb2YgdGhlc2UgY29uZGl0aW9uczoKCiAgICBhKSBUaGUgbW9kaWZpZWQgd29yayBtdXN0IGl0c2VsZiBiZSBhIHNvZnR3YXJlIGxpYnJhcnkuCgogICAgYikgWW91IG11c3QgY2F1c2UgdGhlIGZpbGVzIG1vZGlmaWVkIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCiAgICBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIGZpbGVzIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLgoKICAgIGMpIFlvdSBtdXN0IGNhdXNlIHRoZSB3aG9sZSBvZiB0aGUgd29yayB0byBiZSBsaWNlbnNlZCBhdCBubwogICAgY2hhcmdlIHRvIGFsbCB0aGlyZCBwYXJ0aWVzIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuCgogICAgZCkgSWYgYSBmYWNpbGl0eSBpbiB0aGUgbW9kaWZpZWQgTGlicmFyeSByZWZlcnMgdG8gYSBmdW5jdGlvbiBvciBhCiAgICB0YWJsZSBvZiBkYXRhIHRvIGJlIHN1cHBsaWVkIGJ5IGFuIGFwcGxpY2F0aW9uIHByb2dyYW0gdGhhdCB1c2VzCiAgICB0aGUgZmFjaWxpdHksIG90aGVyIHRoYW4gYXMgYW4gYXJndW1lbnQgcGFzc2VkIHdoZW4gdGhlIGZhY2lsaXR5CiAgICBpcyBpbnZva2VkLCB0aGVuIHlvdSBtdXN0IG1ha2UgYSBnb29kIGZhaXRoIGVmZm9ydCB0byBlbnN1cmUgdGhhdCwKICAgIGluIHRoZSBldmVudCBhbiBhcHBsaWNhdGlvbiBkb2VzIG5vdCBzdXBwbHkgc3VjaCBmdW5jdGlvbiBvcgogICAgdGFibGUsIHRoZSBmYWNpbGl0eSBzdGlsbCBvcGVyYXRlcywgYW5kIHBlcmZvcm1zIHdoYXRldmVyIHBhcnQgb2YKICAgIGl0cyBwdXJwb3NlIHJlbWFpbnMgbWVhbmluZ2Z1bC4KCiAgICAoRm9yIGV4YW1wbGUsIGEgZnVuY3Rpb24gaW4gYSBsaWJyYXJ5IHRvIGNvbXB1dGUgc3F1YXJlIHJvb3RzIGhhcwogICAgYSBwdXJwb3NlIHRoYXQgaXMgZW50aXJlbHkgd2VsbC1kZWZpbmVkIGluZGVwZW5kZW50IG9mIHRoZQogICAgYXBwbGljYXRpb24uICBUaGVyZWZvcmUsIFN1YnNlY3Rpb24gMmQgcmVxdWlyZXMgdGhhdCBhbnkKICAgIGFwcGxpY2F0aW9uLXN1cHBsaWVkIGZ1bmN0aW9uIG9yIHRhYmxlIHVzZWQgYnkgdGhpcyBmdW5jdGlvbiBtdXN0CiAgICBiZSBvcHRpb25hbDogaWYgdGhlIGFwcGxpY2F0aW9uIGRvZXMgbm90IHN1cHBseSBpdCwgdGhlIHNxdWFyZQogICAgcm9vdCBmdW5jdGlvbiBtdXN0IHN0aWxsIGNvbXB1dGUgc3F1YXJlIHJvb3RzLikKClRoZXNlIHJlcXVpcmVtZW50cyBhcHBseSB0byB0aGUgbW9kaWZpZWQgd29yayBhcyBhIHdob2xlLiAgSWYKaWRlbnRpZmlhYmxlIHNlY3Rpb25zIG9mIHRoYXQgd29yayBhcmUgbm90IGRlcml2ZWQgZnJvbSB0aGUgTGlicmFyeSwKYW5kIGNhbiBiZSByZWFzb25hYmx5IGNvbnNpZGVyZWQgaW5kZXBlbmRlbnQgYW5kIHNlcGFyYXRlIHdvcmtzIGluCnRoZW1zZWx2ZXMsIHRoZW4gdGhpcyBMaWNlbnNlLCBhbmQgaXRzIHRlcm1zLCBkbyBub3QgYXBwbHkgdG8gdGhvc2UKc2VjdGlvbnMgd2hlbiB5b3UgZGlzdHJpYnV0ZSB0aGVtIGFzIHNlcGFyYXRlIHdvcmtzLiAgQnV0IHdoZW4geW91CmRpc3RyaWJ1dGUgdGhlIHNhbWUgc2VjdGlvbnMgYXMgcGFydCBvZiBhIHdob2xlIHdoaWNoIGlzIGEgd29yayBiYXNlZApvbiB0aGUgTGlicmFyeSwgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd2hvbGUgbXVzdCBiZSBvbiB0aGUgdGVybXMgb2YKdGhpcyBMaWNlbnNlLCB3aG9zZSBwZXJtaXNzaW9ucyBmb3Igb3RoZXIgbGljZW5zZWVzIGV4dGVuZCB0byB0aGUKZW50aXJlIHdob2xlLCBhbmQgdGh1cyB0byBlYWNoIGFuZCBldmVyeSBwYXJ0IHJlZ2FyZGxlc3Mgb2Ygd2hvIHdyb3RlCml0LgoKVGh1cywgaXQgaXMgbm90IHRoZSBpbnRlbnQgb2YgdGhpcyBzZWN0aW9uIHRvIGNsYWltIHJpZ2h0cyBvciBjb250ZXN0CnlvdXIgcmlnaHRzIHRvIHdvcmsgd3JpdHRlbiBlbnRpcmVseSBieSB5b3U7IHJhdGhlciwgdGhlIGludGVudCBpcyB0bwpleGVyY2lzZSB0aGUgcmlnaHQgdG8gY29udHJvbCB0aGUgZGlzdHJpYnV0aW9uIG9mIGRlcml2YXRpdmUgb3IKY29sbGVjdGl2ZSB3b3JrcyBiYXNlZCBvbiB0aGUgTGlicmFyeS4KCkluIGFkZGl0aW9uLCBtZXJlIGFnZ3JlZ2F0aW9uIG9mIGFub3RoZXIgd29yayBub3QgYmFzZWQgb24gdGhlIExpYnJhcnkKd2l0aCB0aGUgTGlicmFyeSAob3Igd2l0aCBhIHdvcmsgYmFzZWQgb24gdGhlIExpYnJhcnkpIG9uIGEgdm9sdW1lIG9mCmEgc3RvcmFnZSBvciBkaXN0cmlidXRpb24gbWVkaXVtIGRvZXMgbm90IGJyaW5nIHRoZSBvdGhlciB3b3JrIHVuZGVyCnRoZSBzY29wZSBvZiB0aGlzIExpY2Vuc2UuCgogIDMuIFlvdSBtYXkgb3B0IHRvIGFwcGx5IHRoZSB0ZXJtcyBvZiB0aGUgb3JkaW5hcnkgR05VIEdlbmVyYWwgUHVibGljCkxpY2Vuc2UgaW5zdGVhZCBvZiB0aGlzIExpY2Vuc2UgdG8gYSBnaXZlbiBjb3B5IG9mIHRoZSBMaWJyYXJ5LiAgVG8gZG8KdGhpcywgeW91IG11c3QgYWx0ZXIgYWxsIHRoZSBub3RpY2VzIHRoYXQgcmVmZXIgdG8gdGhpcyBMaWNlbnNlLCBzbwp0aGF0IHRoZXkgcmVmZXIgdG8gdGhlIG9yZGluYXJ5IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB2ZXJzaW9uIDIsCmluc3RlYWQgb2YgdG8gdGhpcyBMaWNlbnNlLiAgKElmIGEgbmV3ZXIgdmVyc2lvbiB0aGFuIHZlcnNpb24gMiBvZiB0aGUKb3JkaW5hcnkgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaGFzIGFwcGVhcmVkLCB0aGVuIHlvdSBjYW4gc3BlY2lmeQp0aGF0IHZlcnNpb24gaW5zdGVhZCBpZiB5b3Ugd2lzaC4pICBEbyBub3QgbWFrZSBhbnkgb3RoZXIgY2hhbmdlIGluCnRoZXNlIG5vdGljZXMuCgwKICBPbmNlIHRoaXMgY2hhbmdlIGlzIG1hZGUgaW4gYSBnaXZlbiBjb3B5LCBpdCBpcyBpcnJldmVyc2libGUgZm9yCnRoYXQgY29weSwgc28gdGhlIG9yZGluYXJ5IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFwcGxpZXMgdG8gYWxsCnN1YnNlcXVlbnQgY29waWVzIGFuZCBkZXJpdmF0aXZlIHdvcmtzIG1hZGUgZnJvbSB0aGF0IGNvcHkuCgogIFRoaXMgb3B0aW9uIGlzIHVzZWZ1bCB3aGVuIHlvdSB3aXNoIHRvIGNvcHkgcGFydCBvZiB0aGUgY29kZSBvZgp0aGUgTGlicmFyeSBpbnRvIGEgcHJvZ3JhbSB0aGF0IGlzIG5vdCBhIGxpYnJhcnkuCgogIDQuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgTGlicmFyeSAob3IgYSBwb3J0aW9uIG9yCmRlcml2YXRpdmUgb2YgaXQsIHVuZGVyIFNlY3Rpb24gMikgaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtCnVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIHByb3ZpZGVkIHRoYXQgeW91IGFjY29tcGFueQppdCB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nIG1hY2hpbmUtcmVhZGFibGUgc291cmNlIGNvZGUsIHdoaWNoCm11c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zIDEgYW5kIDIgYWJvdmUgb24gYQptZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2UuCgogIElmIGRpc3RyaWJ1dGlvbiBvZiBvYmplY3QgY29kZSBpcyBtYWRlIGJ5IG9mZmVyaW5nIGFjY2VzcyB0byBjb3B5CmZyb20gYSBkZXNpZ25hdGVkIHBsYWNlLCB0aGVuIG9mZmVyaW5nIGVxdWl2YWxlbnQgYWNjZXNzIHRvIGNvcHkgdGhlCnNvdXJjZSBjb2RlIGZyb20gdGhlIHNhbWUgcGxhY2Ugc2F0aXNmaWVzIHRoZSByZXF1aXJlbWVudCB0bwpkaXN0cmlidXRlIHRoZSBzb3VyY2UgY29kZSwgZXZlbiB0aG91Z2ggdGhpcmQgcGFydGllcyBhcmUgbm90CmNvbXBlbGxlZCB0byBjb3B5IHRoZSBzb3VyY2UgYWxvbmcgd2l0aCB0aGUgb2JqZWN0IGNvZGUuCgogIDUuIEEgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIG5vIGRlcml2YXRpdmUgb2YgYW55IHBvcnRpb24gb2YgdGhlCkxpYnJhcnksIGJ1dCBpcyBkZXNpZ25lZCB0byB3b3JrIHdpdGggdGhlIExpYnJhcnkgYnkgYmVpbmcgY29tcGlsZWQgb3IKbGlua2VkIHdpdGggaXQsIGlzIGNhbGxlZCBhICJ3b3JrIHRoYXQgdXNlcyB0aGUgTGlicmFyeSIuICBTdWNoIGEKd29yaywgaW4gaXNvbGF0aW9uLCBpcyBub3QgYSBkZXJpdmF0aXZlIHdvcmsgb2YgdGhlIExpYnJhcnksIGFuZAp0aGVyZWZvcmUgZmFsbHMgb3V0c2lkZSB0aGUgc2NvcGUgb2YgdGhpcyBMaWNlbnNlLgoKICBIb3dldmVyLCBsaW5raW5nIGEgIndvcmsgdGhhdCB1c2VzIHRoZSBMaWJyYXJ5IiB3aXRoIHRoZSBMaWJyYXJ5CmNyZWF0ZXMgYW4gZXhlY3V0YWJsZSB0aGF0IGlzIGEgZGVyaXZhdGl2ZSBvZiB0aGUgTGlicmFyeSAoYmVjYXVzZSBpdApjb250YWlucyBwb3J0aW9ucyBvZiB0aGUgTGlicmFyeSksIHJhdGhlciB0aGFuIGEgIndvcmsgdGhhdCB1c2VzIHRoZQpsaWJyYXJ5Ii4gIFRoZSBleGVjdXRhYmxlIGlzIHRoZXJlZm9yZSBjb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZS4KU2VjdGlvbiA2IHN0YXRlcyB0ZXJtcyBmb3IgZGlzdHJpYnV0aW9uIG9mIHN1Y2ggZXhlY3V0YWJsZXMuCgogIFdoZW4gYSAid29yayB0aGF0IHVzZXMgdGhlIExpYnJhcnkiIHVzZXMgbWF0ZXJpYWwgZnJvbSBhIGhlYWRlciBmaWxlCnRoYXQgaXMgcGFydCBvZiB0aGUgTGlicmFyeSwgdGhlIG9iamVjdCBjb2RlIGZvciB0aGUgd29yayBtYXkgYmUgYQpkZXJpdmF0aXZlIHdvcmsgb2YgdGhlIExpYnJhcnkgZXZlbiB0aG91Z2ggdGhlIHNvdXJjZSBjb2RlIGlzIG5vdC4KV2hldGhlciB0aGlzIGlzIHRydWUgaXMgZXNwZWNpYWxseSBzaWduaWZpY2FudCBpZiB0aGUgd29yayBjYW4gYmUKbGlua2VkIHdpdGhvdXQgdGhlIExpYnJhcnksIG9yIGlmIHRoZSB3b3JrIGlzIGl0c2VsZiBhIGxpYnJhcnkuICBUaGUKdGhyZXNob2xkIGZvciB0aGlzIHRvIGJlIHRydWUgaXMgbm90IHByZWNpc2VseSBkZWZpbmVkIGJ5IGxhdy4KCiAgSWYgc3VjaCBhbiBvYmplY3QgZmlsZSB1c2VzIG9ubHkgbnVtZXJpY2FsIHBhcmFtZXRlcnMsIGRhdGEKc3RydWN0dXJlIGxheW91dHMgYW5kIGFjY2Vzc29ycywgYW5kIHNtYWxsIG1hY3JvcyBhbmQgc21hbGwgaW5saW5lCmZ1bmN0aW9ucyAodGVuIGxpbmVzIG9yIGxlc3MgaW4gbGVuZ3RoKSwgdGhlbiB0aGUgdXNlIG9mIHRoZSBvYmplY3QKZmlsZSBpcyB1bnJlc3RyaWN0ZWQsIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBpdCBpcyBsZWdhbGx5IGEgZGVyaXZhdGl2ZQp3b3JrLiAgKEV4ZWN1dGFibGVzIGNvbnRhaW5pbmcgdGhpcyBvYmplY3QgY29kZSBwbHVzIHBvcnRpb25zIG9mIHRoZQpMaWJyYXJ5IHdpbGwgc3RpbGwgZmFsbCB1bmRlciBTZWN0aW9uIDYuKQoKICBPdGhlcndpc2UsIGlmIHRoZSB3b3JrIGlzIGEgZGVyaXZhdGl2ZSBvZiB0aGUgTGlicmFyeSwgeW91IG1heQpkaXN0cmlidXRlIHRoZSBvYmplY3QgY29kZSBmb3IgdGhlIHdvcmsgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb24gNi4KQW55IGV4ZWN1dGFibGVzIGNvbnRhaW5pbmcgdGhhdCB3b3JrIGFsc28gZmFsbCB1bmRlciBTZWN0aW9uIDYsCndoZXRoZXIgb3Igbm90IHRoZXkgYXJlIGxpbmtlZCBkaXJlY3RseSB3aXRoIHRoZSBMaWJyYXJ5IGl0c2VsZi4KDAogIDYuIEFzIGFuIGV4Y2VwdGlvbiB0byB0aGUgU2VjdGlvbnMgYWJvdmUsIHlvdSBtYXkgYWxzbyBjb21iaW5lIG9yCmxpbmsgYSAid29yayB0aGF0IHVzZXMgdGhlIExpYnJhcnkiIHdpdGggdGhlIExpYnJhcnkgdG8gcHJvZHVjZSBhCndvcmsgY29udGFpbmluZyBwb3J0aW9ucyBvZiB0aGUgTGlicmFyeSwgYW5kIGRpc3RyaWJ1dGUgdGhhdCB3b3JrCnVuZGVyIHRlcm1zIG9mIHlvdXIgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHRoZSB0ZXJtcyBwZXJtaXQKbW9kaWZpY2F0aW9uIG9mIHRoZSB3b3JrIGZvciB0aGUgY3VzdG9tZXIncyBvd24gdXNlIGFuZCByZXZlcnNlCmVuZ2luZWVyaW5nIGZvciBkZWJ1Z2dpbmcgc3VjaCBtb2RpZmljYXRpb25zLgoKICBZb3UgbXVzdCBnaXZlIHByb21pbmVudCBub3RpY2Ugd2l0aCBlYWNoIGNvcHkgb2YgdGhlIHdvcmsgdGhhdCB0aGUKTGlicmFyeSBpcyB1c2VkIGluIGl0IGFuZCB0aGF0IHRoZSBMaWJyYXJ5IGFuZCBpdHMgdXNlIGFyZSBjb3ZlcmVkIGJ5CnRoaXMgTGljZW5zZS4gIFlvdSBtdXN0IHN1cHBseSBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlLiAgSWYgdGhlIHdvcmsKZHVyaW5nIGV4ZWN1dGlvbiBkaXNwbGF5cyBjb3B5cmlnaHQgbm90aWNlcywgeW91IG11c3QgaW5jbHVkZSB0aGUKY29weXJpZ2h0IG5vdGljZSBmb3IgdGhlIExpYnJhcnkgYW1vbmcgdGhlbSwgYXMgd2VsbCBhcyBhIHJlZmVyZW5jZQpkaXJlY3RpbmcgdGhlIHVzZXIgdG8gdGhlIGNvcHkgb2YgdGhpcyBMaWNlbnNlLiAgQWxzbywgeW91IG11c3QgZG8gb25lCm9mIHRoZXNlIHRoaW5nczoKCiAgICBhKSBBY2NvbXBhbnkgdGhlIHdvcmsgd2l0aCB0aGUgY29tcGxldGUgY29ycmVzcG9uZGluZwogICAgbWFjaGluZS1yZWFkYWJsZSBzb3VyY2UgY29kZSBmb3IgdGhlIExpYnJhcnkgaW5jbHVkaW5nIHdoYXRldmVyCiAgICBjaGFuZ2VzIHdlcmUgdXNlZCBpbiB0aGUgd29yayAod2hpY2ggbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlcgogICAgU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSk7IGFuZCwgaWYgdGhlIHdvcmsgaXMgYW4gZXhlY3V0YWJsZSBsaW5rZWQKICAgIHdpdGggdGhlIExpYnJhcnksIHdpdGggdGhlIGNvbXBsZXRlIG1hY2hpbmUtcmVhZGFibGUgIndvcmsgdGhhdAogICAgdXNlcyB0aGUgTGlicmFyeSIsIGFzIG9iamVjdCBjb2RlIGFuZC9vciBzb3VyY2UgY29kZSwgc28gdGhhdCB0aGUKICAgIHVzZXIgY2FuIG1vZGlmeSB0aGUgTGlicmFyeSBhbmQgdGhlbiByZWxpbmsgdG8gcHJvZHVjZSBhIG1vZGlmaWVkCiAgICBleGVjdXRhYmxlIGNvbnRhaW5pbmcgdGhlIG1vZGlmaWVkIExpYnJhcnkuICAoSXQgaXMgdW5kZXJzdG9vZAogICAgdGhhdCB0aGUgdXNlciB3aG8gY2hhbmdlcyB0aGUgY29udGVudHMgb2YgZGVmaW5pdGlvbnMgZmlsZXMgaW4gdGhlCiAgICBMaWJyYXJ5IHdpbGwgbm90IG5lY2Vzc2FyaWx5IGJlIGFibGUgdG8gcmVjb21waWxlIHRoZSBhcHBsaWNhdGlvbgogICAgdG8gdXNlIHRoZSBtb2RpZmllZCBkZWZpbml0aW9ucy4pCgogICAgYikgVXNlIGEgc3VpdGFibGUgc2hhcmVkIGxpYnJhcnkgbWVjaGFuaXNtIGZvciBsaW5raW5nIHdpdGggdGhlCiAgICBMaWJyYXJ5LiAgQSBzdWl0YWJsZSBtZWNoYW5pc20gaXMgb25lIHRoYXQgKDEpIHVzZXMgYXQgcnVuIHRpbWUgYQogICAgY29weSBvZiB0aGUgbGlicmFyeSBhbHJlYWR5IHByZXNlbnQgb24gdGhlIHVzZXIncyBjb21wdXRlciBzeXN0ZW0sCiAgICByYXRoZXIgdGhhbiBjb3B5aW5nIGxpYnJhcnkgZnVuY3Rpb25zIGludG8gdGhlIGV4ZWN1dGFibGUsIGFuZCAoMikKICAgIHdpbGwgb3BlcmF0ZSBwcm9wZXJseSB3aXRoIGEgbW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSwgaWYKICAgIHRoZSB1c2VyIGluc3RhbGxzIG9uZSwgYXMgbG9uZyBhcyB0aGUgbW9kaWZpZWQgdmVyc2lvbiBpcwogICAgaW50ZXJmYWNlLWNvbXBhdGlibGUgd2l0aCB0aGUgdmVyc2lvbiB0aGF0IHRoZSB3b3JrIHdhcyBtYWRlIHdpdGguCgogICAgYykgQWNjb21wYW55IHRoZSB3b3JrIHdpdGggYSB3cml0dGVuIG9mZmVyLCB2YWxpZCBmb3IgYXQKICAgIGxlYXN0IHRocmVlIHllYXJzLCB0byBnaXZlIHRoZSBzYW1lIHVzZXIgdGhlIG1hdGVyaWFscwogICAgc3BlY2lmaWVkIGluIFN1YnNlY3Rpb24gNmEsIGFib3ZlLCBmb3IgYSBjaGFyZ2Ugbm8gbW9yZQogICAgdGhhbiB0aGUgY29zdCBvZiBwZXJmb3JtaW5nIHRoaXMgZGlzdHJpYnV0aW9uLgoKICAgIGQpIElmIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd29yayBpcyBtYWRlIGJ5IG9mZmVyaW5nIGFjY2VzcyB0byBjb3B5CiAgICBmcm9tIGEgZGVzaWduYXRlZCBwbGFjZSwgb2ZmZXIgZXF1aXZhbGVudCBhY2Nlc3MgdG8gY29weSB0aGUgYWJvdmUKICAgIHNwZWNpZmllZCBtYXRlcmlhbHMgZnJvbSB0aGUgc2FtZSBwbGFjZS4KCiAgICBlKSBWZXJpZnkgdGhhdCB0aGUgdXNlciBoYXMgYWxyZWFkeSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlc2UKICAgIG1hdGVyaWFscyBvciB0aGF0IHlvdSBoYXZlIGFscmVhZHkgc2VudCB0aGlzIHVzZXIgYSBjb3B5LgoKICBGb3IgYW4gZXhlY3V0YWJsZSwgdGhlIHJlcXVpcmVkIGZvcm0gb2YgdGhlICJ3b3JrIHRoYXQgdXNlcyB0aGUKTGlicmFyeSIgbXVzdCBpbmNsdWRlIGFueSBkYXRhIGFuZCB1dGlsaXR5IHByb2dyYW1zIG5lZWRlZCBmb3IKcmVwcm9kdWNpbmcgdGhlIGV4ZWN1dGFibGUgZnJvbSBpdC4gIEhvd2V2ZXIsIGFzIGEgc3BlY2lhbCBleGNlcHRpb24sCnRoZSBtYXRlcmlhbHMgdG8gYmUgZGlzdHJpYnV0ZWQgbmVlZCBub3QgaW5jbHVkZSBhbnl0aGluZyB0aGF0IGlzCm5vcm1hbGx5IGRpc3RyaWJ1dGVkIChpbiBlaXRoZXIgc291cmNlIG9yIGJpbmFyeSBmb3JtKSB3aXRoIHRoZSBtYWpvcgpjb21wb25lbnRzIChjb21waWxlciwga2VybmVsLCBhbmQgc28gb24pIG9mIHRoZSBvcGVyYXRpbmcgc3lzdGVtIG9uCndoaWNoIHRoZSBleGVjdXRhYmxlIHJ1bnMsIHVubGVzcyB0aGF0IGNvbXBvbmVudCBpdHNlbGYgYWNjb21wYW5pZXMKdGhlIGV4ZWN1dGFibGUuCgogIEl0IG1heSBoYXBwZW4gdGhhdCB0aGlzIHJlcXVpcmVtZW50IGNvbnRyYWRpY3RzIHRoZSBsaWNlbnNlCnJlc3RyaWN0aW9ucyBvZiBvdGhlciBwcm9wcmlldGFyeSBsaWJyYXJpZXMgdGhhdCBkbyBub3Qgbm9ybWFsbHkKYWNjb21wYW55IHRoZSBvcGVyYXRpbmcgc3lzdGVtLiAgU3VjaCBhIGNvbnRyYWRpY3Rpb24gbWVhbnMgeW91IGNhbm5vdAp1c2UgYm90aCB0aGVtIGFuZCB0aGUgTGlicmFyeSB0b2dldGhlciBpbiBhbiBleGVjdXRhYmxlIHRoYXQgeW91CmRpc3RyaWJ1dGUuCgwKICA3LiBZb3UgbWF5IHBsYWNlIGxpYnJhcnkgZmFjaWxpdGllcyB0aGF0IGFyZSBhIHdvcmsgYmFzZWQgb24gdGhlCkxpYnJhcnkgc2lkZS1ieS1zaWRlIGluIGEgc2luZ2xlIGxpYnJhcnkgdG9nZXRoZXIgd2l0aCBvdGhlciBsaWJyYXJ5CmZhY2lsaXRpZXMgbm90IGNvdmVyZWQgYnkgdGhpcyBMaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSBzdWNoIGEgY29tYmluZWQKbGlicmFyeSwgcHJvdmlkZWQgdGhhdCB0aGUgc2VwYXJhdGUgZGlzdHJpYnV0aW9uIG9mIHRoZSB3b3JrIGJhc2VkIG9uCnRoZSBMaWJyYXJ5IGFuZCBvZiB0aGUgb3RoZXIgbGlicmFyeSBmYWNpbGl0aWVzIGlzIG90aGVyd2lzZQpwZXJtaXR0ZWQsIGFuZCBwcm92aWRlZCB0aGF0IHlvdSBkbyB0aGVzZSB0d28gdGhpbmdzOgoKICAgIGEpIEFjY29tcGFueSB0aGUgY29tYmluZWQgbGlicmFyeSB3aXRoIGEgY29weSBvZiB0aGUgc2FtZSB3b3JrCiAgICBiYXNlZCBvbiB0aGUgTGlicmFyeSwgdW5jb21iaW5lZCB3aXRoIGFueSBvdGhlciBsaWJyYXJ5CiAgICBmYWNpbGl0aWVzLiAgVGhpcyBtdXN0IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKICAgIFNlY3Rpb25zIGFib3ZlLgoKICAgIGIpIEdpdmUgcHJvbWluZW50IG5vdGljZSB3aXRoIHRoZSBjb21iaW5lZCBsaWJyYXJ5IG9mIHRoZSBmYWN0CiAgICB0aGF0IHBhcnQgb2YgaXQgaXMgYSB3b3JrIGJhc2VkIG9uIHRoZSBMaWJyYXJ5LCBhbmQgZXhwbGFpbmluZwogICAgd2hlcmUgdG8gZmluZCB0aGUgYWNjb21wYW55aW5nIHVuY29tYmluZWQgZm9ybSBvZiB0aGUgc2FtZSB3b3JrLgoKICA4LiBZb3UgbWF5IG5vdCBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2UsIGxpbmsgd2l0aCwgb3IgZGlzdHJpYnV0ZQp0aGUgTGlicmFyeSBleGNlcHQgYXMgZXhwcmVzc2x5IHByb3ZpZGVkIHVuZGVyIHRoaXMgTGljZW5zZS4gIEFueQphdHRlbXB0IG90aGVyd2lzZSB0byBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2UsIGxpbmsgd2l0aCwgb3IKZGlzdHJpYnV0ZSB0aGUgTGlicmFyeSBpcyB2b2lkLCBhbmQgd2lsbCBhdXRvbWF0aWNhbGx5IHRlcm1pbmF0ZSB5b3VyCnJpZ2h0cyB1bmRlciB0aGlzIExpY2Vuc2UuICBIb3dldmVyLCBwYXJ0aWVzIHdobyBoYXZlIHJlY2VpdmVkIGNvcGllcywKb3IgcmlnaHRzLCBmcm9tIHlvdSB1bmRlciB0aGlzIExpY2Vuc2Ugd2lsbCBub3QgaGF2ZSB0aGVpciBsaWNlbnNlcwp0ZXJtaW5hdGVkIHNvIGxvbmcgYXMgc3VjaCBwYXJ0aWVzIHJlbWFpbiBpbiBmdWxsIGNvbXBsaWFuY2UuCgogIDkuIFlvdSBhcmUgbm90IHJlcXVpcmVkIHRvIGFjY2VwdCB0aGlzIExpY2Vuc2UsIHNpbmNlIHlvdSBoYXZlIG5vdApzaWduZWQgaXQuICBIb3dldmVyLCBub3RoaW5nIGVsc2UgZ3JhbnRzIHlvdSBwZXJtaXNzaW9uIHRvIG1vZGlmeSBvcgpkaXN0cmlidXRlIHRoZSBMaWJyYXJ5IG9yIGl0cyBkZXJpdmF0aXZlIHdvcmtzLiAgVGhlc2UgYWN0aW9ucyBhcmUKcHJvaGliaXRlZCBieSBsYXcgaWYgeW91IGRvIG5vdCBhY2NlcHQgdGhpcyBMaWNlbnNlLiAgVGhlcmVmb3JlLCBieQptb2RpZnlpbmcgb3IgZGlzdHJpYnV0aW5nIHRoZSBMaWJyYXJ5IChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKTGlicmFyeSksIHlvdSBpbmRpY2F0ZSB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhpcyBMaWNlbnNlIHRvIGRvIHNvLCBhbmQKYWxsIGl0cyB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW5nIG9yIG1vZGlmeWluZwp0aGUgTGlicmFyeSBvciB3b3JrcyBiYXNlZCBvbiBpdC4KCiAgMTAuIEVhY2ggdGltZSB5b3UgcmVkaXN0cmlidXRlIHRoZSBMaWJyYXJ5IChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKTGlicmFyeSksIHRoZSByZWNpcGllbnQgYXV0b21hdGljYWxseSByZWNlaXZlcyBhIGxpY2Vuc2UgZnJvbSB0aGUKb3JpZ2luYWwgbGljZW5zb3IgdG8gY29weSwgZGlzdHJpYnV0ZSwgbGluayB3aXRoIG9yIG1vZGlmeSB0aGUgTGlicmFyeQpzdWJqZWN0IHRvIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiAgWW91IG1heSBub3QgaW1wb3NlIGFueSBmdXJ0aGVyCnJlc3RyaWN0aW9ucyBvbiB0aGUgcmVjaXBpZW50cycgZXhlcmNpc2Ugb2YgdGhlIHJpZ2h0cyBncmFudGVkIGhlcmVpbi4KWW91IGFyZSBub3QgcmVzcG9uc2libGUgZm9yIGVuZm9yY2luZyBjb21wbGlhbmNlIGJ5IHRoaXJkIHBhcnRpZXMgd2l0aAp0aGlzIExpY2Vuc2UuCgwKICAxMS4gSWYsIGFzIGEgY29uc2VxdWVuY2Ugb2YgYSBjb3VydCBqdWRnbWVudCBvciBhbGxlZ2F0aW9uIG9mIHBhdGVudAppbmZyaW5nZW1lbnQgb3IgZm9yIGFueSBvdGhlciByZWFzb24gKG5vdCBsaW1pdGVkIHRvIHBhdGVudCBpc3N1ZXMpLApjb25kaXRpb25zIGFyZSBpbXBvc2VkIG9uIHlvdSAod2hldGhlciBieSBjb3VydCBvcmRlciwgYWdyZWVtZW50IG9yCm90aGVyd2lzZSkgdGhhdCBjb250cmFkaWN0IHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZSwgdGhleSBkbyBub3QKZXhjdXNlIHlvdSBmcm9tIHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZS4gIElmIHlvdSBjYW5ub3QKZGlzdHJpYnV0ZSBzbyBhcyB0byBzYXRpc2Z5IHNpbXVsdGFuZW91c2x5IHlvdXIgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcwpMaWNlbnNlIGFuZCBhbnkgb3RoZXIgcGVydGluZW50IG9ibGlnYXRpb25zLCB0aGVuIGFzIGEgY29uc2VxdWVuY2UgeW91Cm1heSBub3QgZGlzdHJpYnV0ZSB0aGUgTGlicmFyeSBhdCBhbGwuICBGb3IgZXhhbXBsZSwgaWYgYSBwYXRlbnQKbGljZW5zZSB3b3VsZCBub3QgcGVybWl0IHJveWFsdHktZnJlZSByZWRpc3RyaWJ1dGlvbiBvZiB0aGUgTGlicmFyeSBieQphbGwgdGhvc2Ugd2hvIHJlY2VpdmUgY29waWVzIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgdGhyb3VnaCB5b3UsIHRoZW4KdGhlIG9ubHkgd2F5IHlvdSBjb3VsZCBzYXRpc2Z5IGJvdGggaXQgYW5kIHRoaXMgTGljZW5zZSB3b3VsZCBiZSB0bwpyZWZyYWluIGVudGlyZWx5IGZyb20gZGlzdHJpYnV0aW9uIG9mIHRoZSBMaWJyYXJ5LgoKSWYgYW55IHBvcnRpb24gb2YgdGhpcyBzZWN0aW9uIGlzIGhlbGQgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFueQpwYXJ0aWN1bGFyIGNpcmN1bXN0YW5jZSwgdGhlIGJhbGFuY2Ugb2YgdGhlIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gYXBwbHksCmFuZCB0aGUgc2VjdGlvbiBhcyBhIHdob2xlIGlzIGludGVuZGVkIHRvIGFwcGx5IGluIG90aGVyIGNpcmN1bXN0YW5jZXMuCgpJdCBpcyBub3QgdGhlIHB1cnBvc2Ugb2YgdGhpcyBzZWN0aW9uIHRvIGluZHVjZSB5b3UgdG8gaW5mcmluZ2UgYW55CnBhdGVudHMgb3Igb3RoZXIgcHJvcGVydHkgcmlnaHQgY2xhaW1zIG9yIHRvIGNvbnRlc3QgdmFsaWRpdHkgb2YgYW55CnN1Y2ggY2xhaW1zOyB0aGlzIHNlY3Rpb24gaGFzIHRoZSBzb2xlIHB1cnBvc2Ugb2YgcHJvdGVjdGluZyB0aGUKaW50ZWdyaXR5IG9mIHRoZSBmcmVlIHNvZnR3YXJlIGRpc3RyaWJ1dGlvbiBzeXN0ZW0gd2hpY2ggaXMKaW1wbGVtZW50ZWQgYnkgcHVibGljIGxpY2Vuc2UgcHJhY3RpY2VzLiAgTWFueSBwZW9wbGUgaGF2ZSBtYWRlCmdlbmVyb3VzIGNvbnRyaWJ1dGlvbnMgdG8gdGhlIHdpZGUgcmFuZ2Ugb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQKdGhyb3VnaCB0aGF0IHN5c3RlbSBpbiByZWxpYW5jZSBvbiBjb25zaXN0ZW50IGFwcGxpY2F0aW9uIG9mIHRoYXQKc3lzdGVtOyBpdCBpcyB1cCB0byB0aGUgYXV0aG9yL2Rvbm9yIHRvIGRlY2lkZSBpZiBoZSBvciBzaGUgaXMgd2lsbGluZwp0byBkaXN0cmlidXRlIHNvZnR3YXJlIHRocm91Z2ggYW55IG90aGVyIHN5c3RlbSBhbmQgYSBsaWNlbnNlZSBjYW5ub3QKaW1wb3NlIHRoYXQgY2hvaWNlLgoKVGhpcyBzZWN0aW9uIGlzIGludGVuZGVkIHRvIG1ha2UgdGhvcm91Z2hseSBjbGVhciB3aGF0IGlzIGJlbGlldmVkIHRvCmJlIGEgY29uc2VxdWVuY2Ugb2YgdGhlIHJlc3Qgb2YgdGhpcyBMaWNlbnNlLgoKICAxMi4gSWYgdGhlIGRpc3RyaWJ1dGlvbiBhbmQvb3IgdXNlIG9mIHRoZSBMaWJyYXJ5IGlzIHJlc3RyaWN0ZWQgaW4KY2VydGFpbiBjb3VudHJpZXMgZWl0aGVyIGJ5IHBhdGVudHMgb3IgYnkgY29weXJpZ2h0ZWQgaW50ZXJmYWNlcywgdGhlCm9yaWdpbmFsIGNvcHlyaWdodCBob2xkZXIgd2hvIHBsYWNlcyB0aGUgTGlicmFyeSB1bmRlciB0aGlzIExpY2Vuc2UgbWF5IGFkZAphbiBleHBsaWNpdCBnZW9ncmFwaGljYWwgZGlzdHJpYnV0aW9uIGxpbWl0YXRpb24gZXhjbHVkaW5nIHRob3NlIGNvdW50cmllcywKc28gdGhhdCBkaXN0cmlidXRpb24gaXMgcGVybWl0dGVkIG9ubHkgaW4gb3IgYW1vbmcgY291bnRyaWVzIG5vdCB0aHVzCmV4Y2x1ZGVkLiAgSW4gc3VjaCBjYXNlLCB0aGlzIExpY2Vuc2UgaW5jb3Jwb3JhdGVzIHRoZSBsaW1pdGF0aW9uIGFzIGlmCndyaXR0ZW4gaW4gdGhlIGJvZHkgb2YgdGhpcyBMaWNlbnNlLgoKICAxMy4gVGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBtYXkgcHVibGlzaCByZXZpc2VkIGFuZC9vciBuZXcKdmVyc2lvbnMgb2YgdGhlIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZyb20gdGltZSB0byB0aW1lLgpTdWNoIG5ldyB2ZXJzaW9ucyB3aWxsIGJlIHNpbWlsYXIgaW4gc3Bpcml0IHRvIHRoZSBwcmVzZW50IHZlcnNpb24sCmJ1dCBtYXkgZGlmZmVyIGluIGRldGFpbCB0byBhZGRyZXNzIG5ldyBwcm9ibGVtcyBvciBjb25jZXJucy4KCkVhY2ggdmVyc2lvbiBpcyBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiAgSWYgdGhlIExpYnJhcnkKc3BlY2lmaWVzIGEgdmVyc2lvbiBudW1iZXIgb2YgdGhpcyBMaWNlbnNlIHdoaWNoIGFwcGxpZXMgdG8gaXQgYW5kCiJhbnkgbGF0ZXIgdmVyc2lvbiIsIHlvdSBoYXZlIHRoZSBvcHRpb24gb2YgZm9sbG93aW5nIHRoZSB0ZXJtcyBhbmQKY29uZGl0aW9ucyBlaXRoZXIgb2YgdGhhdCB2ZXJzaW9uIG9yIG9mIGFueSBsYXRlciB2ZXJzaW9uIHB1Ymxpc2hlZCBieQp0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgSWYgdGhlIExpYnJhcnkgZG9lcyBub3Qgc3BlY2lmeSBhCmxpY2Vuc2UgdmVyc2lvbiBudW1iZXIsIHlvdSBtYXkgY2hvb3NlIGFueSB2ZXJzaW9uIGV2ZXIgcHVibGlzaGVkIGJ5CnRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCgwKICAxNC4gSWYgeW91IHdpc2ggdG8gaW5jb3Jwb3JhdGUgcGFydHMgb2YgdGhlIExpYnJhcnkgaW50byBvdGhlciBmcmVlCnByb2dyYW1zIHdob3NlIGRpc3RyaWJ1dGlvbiBjb25kaXRpb25zIGFyZSBpbmNvbXBhdGlibGUgd2l0aCB0aGVzZSwKd3JpdGUgdG8gdGhlIGF1dGhvciB0byBhc2sgZm9yIHBlcm1pc3Npb24uICBGb3Igc29mdHdhcmUgd2hpY2ggaXMKY29weXJpZ2h0ZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgd3JpdGUgdG8gdGhlIEZyZWUKU29mdHdhcmUgRm91bmRhdGlvbjsgd2Ugc29tZXRpbWVzIG1ha2UgZXhjZXB0aW9ucyBmb3IgdGhpcy4gIE91cgpkZWNpc2lvbiB3aWxsIGJlIGd1aWRlZCBieSB0aGUgdHdvIGdvYWxzIG9mIHByZXNlcnZpbmcgdGhlIGZyZWUgc3RhdHVzCm9mIGFsbCBkZXJpdmF0aXZlcyBvZiBvdXIgZnJlZSBzb2Z0d2FyZSBhbmQgb2YgcHJvbW90aW5nIHRoZSBzaGFyaW5nCmFuZCByZXVzZSBvZiBzb2Z0d2FyZSBnZW5lcmFsbHkuCgoJCQkgICAgTk8gV0FSUkFOVFkKCiAgMTUuIEJFQ0FVU0UgVEhFIExJQlJBUlkgSVMgTElDRU5TRUQgRlJFRSBPRiBDSEFSR0UsIFRIRVJFIElTIE5PCldBUlJBTlRZIEZPUiBUSEUgTElCUkFSWSwgVE8gVEhFIEVYVEVOVCBQRVJNSVRURUQgQlkgQVBQTElDQUJMRSBMQVcuCkVYQ0VQVCBXSEVOIE9USEVSV0lTRSBTVEFURUQgSU4gV1JJVElORyBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EL09SCk9USEVSIFBBUlRJRVMgUFJPVklERSBUSEUgTElCUkFSWSAiQVMgSVMiIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZCktJTkQsIEVJVEhFUiBFWFBSRVNTRUQgT1IgSU1QTElFRCwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQpJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKUFVSUE9TRS4gIFRIRSBFTlRJUkUgUklTSyBBUyBUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFCkxJQlJBUlkgSVMgV0lUSCBZT1UuICBTSE9VTEQgVEhFIExJQlJBUlkgUFJPVkUgREVGRUNUSVZFLCBZT1UgQVNTVU1FClRIRSBDT1NUIE9GIEFMTCBORUNFU1NBUlkgU0VSVklDSU5HLCBSRVBBSVIgT1IgQ09SUkVDVElPTi4KCiAgMTYuIElOIE5PIEVWRU5UIFVOTEVTUyBSRVFVSVJFRCBCWSBBUFBMSUNBQkxFIExBVyBPUiBBR1JFRUQgVE8gSU4KV1JJVElORyBXSUxMIEFOWSBDT1BZUklHSFQgSE9MREVSLCBPUiBBTlkgT1RIRVIgUEFSVFkgV0hPIE1BWSBNT0RJRlkKQU5EL09SIFJFRElTVFJJQlVURSBUSEUgTElCUkFSWSBBUyBQRVJNSVRURUQgQUJPVkUsIEJFIExJQUJMRSBUTyBZT1UKRk9SIERBTUFHRVMsIElOQ0xVRElORyBBTlkgR0VORVJBTCwgU1BFQ0lBTCwgSU5DSURFTlRBTCBPUgpDT05TRVFVRU5USUFMIERBTUFHRVMgQVJJU0lORyBPVVQgT0YgVEhFIFVTRSBPUiBJTkFCSUxJVFkgVE8gVVNFIFRIRQpMSUJSQVJZIChJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIExPU1MgT0YgREFUQSBPUiBEQVRBIEJFSU5HClJFTkRFUkVEIElOQUNDVVJBVEUgT1IgTE9TU0VTIFNVU1RBSU5FRCBCWSBZT1UgT1IgVEhJUkQgUEFSVElFUyBPUiBBCkZBSUxVUkUgT0YgVEhFIExJQlJBUlkgVE8gT1BFUkFURSBXSVRIIEFOWSBPVEhFUiBTT0ZUV0FSRSksIEVWRU4gSUYKU1VDSCBIT0xERVIgT1IgT1RIRVIgUEFSVFkgSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSApEQU1BR0VTLgoKCQkgICAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUwo=]]></data>
	</file>
	<file>
	  <filename>/lib/GoogleMapAPI-2.4/GoogleMapAPI.class.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBQcm9qZWN0OiAgICAgR29vZ2xlTWFwQVBJOiBhIFBIUCBsaWJyYXJ5IGludGVmYWNlIHRvIHRoZSBHb29nbGUgTWFwIEFQSQogKiBGaWxlOiAgICAgICAgR29vZ2xlTWFwQVBJLmNsYXNzLnBocAogKiAKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCiAqCiAqIEZvciBxdWVzdGlvbnMsIGhlbHAsIGNvbW1lbnRzLCBkaXNjdXNzaW9uLCBldGMuLCBwbGVhc2Ugam9pbiB0aGUKICogU21hcnR5IG1haWxpbmcgbGlzdC4gU2VuZCBhIGJsYW5rIGUtbWFpbCB0bwogKiBzbWFydHktZ2VuZXJhbC1zdWJzY3JpYmVAbGlzdHMucGhwLm5ldAogKgogKiBAbGluayBodHRwOi8vd3d3LnBocGluc2lkZXIuY29tL3BocC9jb2RlL0dvb2dsZU1hcEFQSS8KICogQGNvcHlyaWdodCAyMDA1IE5ldyBEaWdpdGFsIEdyb3VwLCBJbmMuCiAqIEBhdXRob3IgTW9udGUgT2hydCA8bW9udGUgYXQgb2hydCBkb3QgY29tPgogKiBAcGFja2FnZSBHb29nbGVNYXBBUEkKICogQHZlcnNpb24gMi40CiAqLwoKLyogJElkOiBHb29nbGVNYXBBUEkuY2xhc3MucGhwLHYgMS42MSAyMDA3LzA2LzA2IDIwOjMyOjMxIGNsYXJrIEV4cCAkICovCgovKgoKRm9yIGJlc3QgcmVzdWx0cyB3aXRoIEdvb2dsZU1hcHMsIHVzZSBYSFRNTCBjb21wbGlhbnQgd2ViIHBhZ2VzIHdpdGggdGhpcyBoZWFkZXI6Cgo8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+CjxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWxuczp2PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOnZtbCI+CgpGb3IgZGF0YWJhc2UgY2FjaGluZywgeW91IHdpbGwgd2FudCB0byB1c2UgdGhpcyBzY2hlbWE6CgpDUkVBVEUgVEFCTEUgR0VPQ09ERVMgKAogIGFkZHJlc3MgdmFyY2hhcigyNTUpIE5PVCBOVUxMIGRlZmF1bHQgJycsCiAgbG9uIGZsb2F0IGRlZmF1bHQgTlVMTCwKICBsYXQgZmxvYXQgZGVmYXVsdCBOVUxMLAogIFBSSU1BUlkgS0VZICAoYWRkcmVzcykKKTsKCiovCgpjbGFzcyBHb29nbGVNYXBBUEkgewoKICAgIC8qKgogICAgICogUEVBUjo6REIgRFNOIGZvciBnZW9jb2RlIGNhY2hpbmcuIGV4YW1wbGU6CiAgICAgKiAkZHNuID0gJ215c3FsOi8vdXNlcjpwYXNzQGxvY2FsaG9zdC9kYm5hbWUnOwogICAgICoKICAgICAqIE9SIGFuIGFkb2RiX29iamVjdAogICAgICoKICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHZhciAkZHNuID0gbnVsbDsKICAgIAogICAgLyoqCiAgICAgKiBZT1VSIEdvb2dsTWFwIEFQSSBLRVkgZm9yIHlvdXIgc2l0ZS4KICAgICAqIChodHRwOi8vbWFwcy5nb29nbGUuY29tL2FwaXMvbWFwcy9zaWdudXAuaHRtbCkKICAgICAqCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICB2YXIgJGFwaV9rZXkgPSAnJzsKCiAgICAvKioKICAgICAqIGN1cnJlbnQgbWFwIGlkLCBzZXQgd2hlbiB5b3UgaW5zdGFudGlhdGUKICAgICAqIHRoZSBHb29nbGVNYXBBUEkgb2JqZWN0LgogICAgICoKICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHZhciAkbWFwX2lkID0gbnVsbDsKCiAgICAvKioKICAgICAqIHNpZGViYXIgPGRpdj4gdXNlZCBhbG9uZyB3aXRoIHRoaXMgbWFwLgogICAgICoKICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHZhciAkc2lkZWJhcl9pZCA9IG51bGw7ICAgIAogICAgCiAgICAvKioKICAgICAqIEdvb2dsZU1hcEFQSSB1c2VzIHRoZSBZYWhvbyBnZW9jb2RlIGxvb2t1cCBBUEkuCiAgICAgKiBUaGlzIGlzIHRoZSBhcHBsaWNhdGlvbiBJRCBmb3IgWU9VUiBhcHBsaWNhdGlvbi4KICAgICAqIFRoaXMgaXMgc2V0IHVwb24gaW5zdGFudGlhdGluZyB0aGUgR29vZ2xlTWFwQVBJIG9iamVjdC4KICAgICAqIChodHRwOi8vZGV2ZWxvcGVyLnlhaG9vLm5ldC9mYXEvaW5kZXguaHRtbCNhcHBpZCkKICAgICAqCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICB2YXIgJGFwcF9pZCA9IG51bGw7CgogICAgLyoqCiAgICAgKiB1c2Ugb25Mb2FkKCkgdG8gbG9hZCB0aGUgbWFwIGphdmFzY3JpcHQuCiAgICAgKiBpZiBlbmFibGVkLCBiZSBzdXJlIHRvIGluY2x1ZGUgb24geW91ciB3ZWJwYWdlOgogICAgICogPGh0bWwgb25sb2FkPSJvbkxvYWQoKSI+CiAgICAgKgogICAgICogQHZhciBzdHJpbmcKICAgICAqLwogICAgdmFyICRvbmxvYWQgPSB0cnVlOwogICAgCiAgICAvKioKICAgICAqIG1hcCBjZW50ZXIgbGF0aXR1ZGUgKGhvcml6b250YWwpCiAgICAgKiBjYWxjdWxhdGVkIGF1dG9tYXRpY2FsbHkgYXMgbWFya2VycwogICAgICogYXJlIGFkZGVkIHRvIHRoZSBtYXAuCiAgICAgKgogICAgICogQHZhciBmbG9hdAogICAgICovCiAgICB2YXIgJGNlbnRlcl9sYXQgPSBudWxsOwoKICAgIC8qKgogICAgICogbWFwIGNlbnRlciBsb25naXR1ZGUgKHZlcnRpY2FsKQogICAgICogY2FsY3VsYXRlZCBhdXRvbWF0aWNhbGx5IGFzIG1hcmtlcnMKICAgICAqIGFyZSBhZGRlZCB0byB0aGUgbWFwLgogICAgICoKICAgICAqIEB2YXIgZmxvYXQKICAgICAqLwogICAgdmFyICRjZW50ZXJfbG9uID0gbnVsbDsKICAgIAogICAgLyoqCiAgICAgKiBlbmFibGVzIG1hcCBjb250cm9scyAoem9vbS9tb3ZlL2NlbnRlcikKICAgICAqCiAgICAgKiBAdmFyIGJvb2xlYW4KICAgICAqLwogICAgdmFyICRtYXBfY29udHJvbHMgPSB0cnVlOwoKICAgIC8qKgogICAgICogZGV0ZXJtaW5lcyB0aGUgbWFwIGNvbnRyb2wgdHlwZQogICAgICogc21hbGwgLT4gc2hvdyBtb3ZlL2NlbnRlciBjb250cm9scwogICAgICogbGFyZ2UgLT4gc2hvdyBtb3ZlL2NlbnRlci96b29tIGNvbnRyb2xzCiAgICAgKgogICAgICogQHZhciBzdHJpbmcKICAgICAqLwogICAgdmFyICRjb250cm9sX3NpemUgPSAnbGFyZ2UnOwogICAgCiAgICAvKioKICAgICAqIGVuYWJsZXMgbWFwIHR5cGUgY29udHJvbHMgKG1hcC9zYXRlbGxpdGUvaHlicmlkKQogICAgICoKICAgICAqIEB2YXIgYm9vbGVhbgogICAgICovCiAgICB2YXIgJHR5cGVfY29udHJvbHMgPSB0cnVlOwoKICAgIC8qKgogICAgICogZGVmYXVsdCBtYXAgdHlwZSAoR19OT1JNQUxfTUFQL0dfU0FURUxMSVRFX01BUC9HX0hZQlJJRF9NQVApCiAgICAgKgogICAgICogQHZhciBib29sZWFuCiAgICAgKi8KICAgIHZhciAkbWFwX3R5cGUgPSAnR19OT1JNQUxfTUFQJzsKICAgIAogICAgLyoqCiAgICAgKiBlbmFibGVzIHNjYWxlIG1hcCBjb250cm9sCiAgICAgKgogICAgICogQHZhciBib29sZWFuCiAgICAgKi8KICAgIHZhciAkc2NhbGVfY29udHJvbCA9IHRydWU7CiAgICAKICAgIC8qKgogICAgICogZW5hYmxlcyBvdmVydmlldyBtYXAgY29udHJvbAogICAgICoKICAgICAqIEB2YXIgYm9vbGVhbgogICAgICovCiAgICB2YXIgJG92ZXJ2aWV3X2NvbnRyb2wgPSBmYWxzZTsgICAgCiAgICAgCiAgICAvKioKICAgICAqIGRldGVybWluZXMgdGhlIGRlZmF1bHQgem9vbSBsZXZlbAogICAgICoKICAgICAqIEB2YXIgaW50ZWdlcgogICAgICovCiAgICB2YXIgJHpvb20gPSAxNjsKCiAgICAvKioKICAgICAqIGRldGVybWluZXMgdGhlIG1hcCB3aWR0aAogICAgICoKICAgICAqIEB2YXIgaW50ZWdlcgogICAgICovCiAgICB2YXIgJHdpZHRoID0gJzUwMHB4JzsKICAgIAogICAgLyoqCiAgICAgKiBkZXRlcm1pbmVzIHRoZSBtYXAgaGVpZ2h0CiAgICAgKgogICAgICogQHZhciBpbnRlZ2VyCiAgICAgKi8KICAgIHZhciAkaGVpZ2h0ID0gJzUwMHB4JzsKCiAgICAvKioKICAgICAqIG1lc3NhZ2UgdGhhdCBwb3BzIHVwIHdoZW4gdGhlIGJyb3dzZXIgaXMgaW5jb21wYXRpYmxlIHdpdGggR29vZ2xlIE1hcHMuCiAgICAgKiBzZXQgdG8gZW1wdHkgc3RyaW5nIHRvIGRpc2FibGUuCiAgICAgKgogICAgICogQHZhciBpbnRlZ2VyCiAgICAgKi8KICAgIHZhciAkYnJvd3Nlcl9hbGVydCA9ICdTb3JyeSwgdGhlIEdvb2dsZSBNYXBzIEFQSSBpcyBub3QgY29tcGF0aWJsZSB3aXRoIHRoaXMgYnJvd3Nlci4nOwogICAgCiAgICAvKioKICAgICAqIG1lc3NhZ2UgdGhhdCBhcHBlYXJzIHdoZW4gamF2YXNjcmlwdCBpcyBkaXNhYmxlZC4KICAgICAqIHNldCB0byBlbXB0eSBzdHJpbmcgdG8gZGlzYWJsZS4KICAgICAqCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICB2YXIgJGpzX2FsZXJ0ID0gJzxiPkphdmFzY3JpcHQgbXVzdCBiZSBlbmFibGVkIGluIG9yZGVyIHRvIHVzZSBHb29nbGUgTWFwcy48L2I+JzsKCiAgICAvKioKICAgICAqIGRldGVybWluZXMgaWYgc2lkZWJhciBpcyBlbmFibGVkCiAgICAgKgogICAgICogQHZhciBib29sZWFuCiAgICAgKi8KICAgIHZhciAkc2lkZWJhciA9IHRydWU7ICAgIAoKICAgIC8qKgogICAgICogZGV0ZXJtaW5lcyBpZiB0by9mcm9tIGRpcmVjdGlvbnMgYXJlIGluY2x1ZGVkIGluc2lkZSBpbmZvIHdpbmRvdwogICAgICoKICAgICAqIEB2YXIgYm9vbGVhbgogICAgICovCiAgICB2YXIgJGRpcmVjdGlvbnMgPSB0cnVlOwoKICAgIC8qKgogICAgICogZGV0ZXJtaW5lcyBpZiBtYXAgbWFya2VycyBicmluZyB1cCBhbiBpbmZvIHdpbmRvdwogICAgICoKICAgICAqIEB2YXIgYm9vbGVhbgogICAgICovCiAgICB2YXIgJGluZm9fd2luZG93ID0gdHJ1ZTsgICAgCiAgICAKICAgIC8qKgogICAgICogZGV0ZXJtaW5lcyBpZiBpbmZvIHdpbmRvdyBhcHBlYXJzIHdpdGggYSBjbGljayBvciBtb3VzZW92ZXIKICAgICAqCiAgICAgKiBAdmFyIHN0cmluZyBjbGljay9tb3VzZW92ZXIKICAgICAqLwogICAgdmFyICR3aW5kb3dfdHJpZ2dlciA9ICdjbGljayc7ICAgIAoKICAgIC8qKgogICAgICogd2hhdCBzZXJ2ZXIgZ2VvY29kZSBsb29rdXBzIGNvbWUgZnJvbQogICAgICoKICAgICAqIGF2YWlsYWJsZTogWUFIT08gIFlhaG9vISBBUEkuIFVTIGdlb2NvZGUgbG9va3VwcyBvbmx5LgogICAgICogICAgICAgICAgICBHT09HTEUgR29vZ2xlIE1hcHMuIFRoaXMgY2FuIGRvIGludGVybmF0aW9uYWwgbG9va3VwcywKICAgICAqICAgICAgICAgICAgICAgICAgIGJ1dCBub3QgYW4gb2ZmaWNpYWwgQVBJIHNlcnZpY2Ugc28gbm8gZ3VhcmFudGVlcy4KICAgICAqICAgICAgICAgICAgTm90ZTogR09PR0xFIGlzIHRoZSBkZWZhdWx0IGxvb2t1cCBzZXJ2aWNlLCBwbGVhc2UgcmVhZAogICAgICogICAgICAgICAgICAgICAgICB0aGUgWWFob28hIHRlcm1zIG9mIHNlcnZpY2UgYmVmb3JlIHVzaW5nIHRoZWlyIEFQSS4KICAgICAqCiAgICAgKiBAdmFyIHN0cmluZyBzZXJ2aWNlIG5hbWUKICAgICAqLwogICAgdmFyICRsb29rdXBfc2VydmljZSA9ICdHT09HTEUnOwoJdmFyICRsb29rdXBfc2VydmVyID0gYXJyYXkoJ0dPT0dMRScgPT4gJ21hcHMuZ29vZ2xlLmNvbScsICdZQUhPTycgPT4gJ2FwaS5sb2NhbC55YWhvby5jb20nKTsKICAgIAogICAgdmFyICRkcml2aW5nX2Rpcl90ZXh0ID0gYXJyYXkoCiAgICAgICAgICAgICdkaXJfdG8nID0+ICdTdGFydCBhZGRyZXNzOiAoaW5jbHVkZSBhZGRyLCBjaXR5IHN0L3JlZ2lvbiknLAogICAgICAgICAgICAndG9fYnV0dG9uX3ZhbHVlJyA9PiAnR2V0IERpcmVjdGlvbnMnLAogICAgICAgICAgICAndG9fYnV0dG9uX3R5cGUnID0+ICdzdWJtaXQnLAogICAgICAgICAgICAnZGlyX2Zyb20nID0+ICdFbmQgYWRkcmVzczogKGluY2x1ZGUgYWRkciwgY2l0eSBzdC9yZWdpb24pJywKICAgICAgICAgICAgJ2Zyb21fYnV0dG9uX3ZhbHVlJyA9PiAnR2V0IERpcmVjdGlvbnMnLAogICAgICAgICAgICAnZnJvbV9idXR0b25fdHlwZScgPT4gJ3N1Ym1pdCcsCiAgICAgICAgICAgICdkaXJfdGV4dCcgPT4gJ0RpcmVjdGlvbnM6ICcsCiAgICAgICAgICAgICdkaXJfdG9oZXJlJyA9PiAnVG8gaGVyZScsCiAgICAgICAgICAgICdkaXJfZnJvbWhlcmUnID0+ICdGcm9tIGhlcmUnCiAgICAgICAgICAgICk7ICAgICAgICAgICAgIAogICAgICAgICAgICAgICAKICAgIAogICAgLyoqCiAgICAgKiB2ZXJzaW9uIG51bWJlcgogICAgICoKICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHZhciAkX3ZlcnNpb24gPSAnMi40JzsKCiAgICAvKioKICAgICAqIGxpc3Qgb2YgYWRkZWQgbWFya2VycwogICAgICoKICAgICAqIEB2YXIgYXJyYXkKICAgICAqLwogICAgdmFyICRfbWFya2VycyA9IGFycmF5KCk7CiAgICAKICAgIC8qKgogICAgICogbWF4aW11bSBsb25naXR1ZGUgb2YgYWxsIG1hcmtlcnMKICAgICAqIAogICAgICogQHZhciBmbG9hdAogICAgICovCiAgICB2YXIgJF9tYXhfbG9uID0gLTEwMDAwMDA7CiAgICAKICAgIC8qKgogICAgICogbWluaW11bSBsb25naXR1ZGUgb2YgYWxsIG1hcmtlcnMKICAgICAqCiAgICAgKiBAdmFyIGZsb2F0CiAgICAgKi8KICAgIHZhciAkX21pbl9sb24gPSAxMDAwMDAwOwogICAgCiAgICAvKioKICAgICAqIG1heCBsYXRpdHVkZQogICAgICoKICAgICAqIEB2YXIgZmxvYXQKICAgICAqLwogICAgdmFyICRfbWF4X2xhdCA9IC0xMDAwMDAwOwogICAgCiAgICAvKioKICAgICAqIG1pbiBsYXRpdHVkZQogICAgICoKICAgICAqIEB2YXIgZmxvYXQKICAgICAqLwogICAgdmFyICRfbWluX2xhdCA9IDEwMDAwMDA7CiAgICAKICAgIC8qKgogICAgICogZGV0ZXJtaW5lcyBpZiB3ZSBzaG91bGQgem9vbSB0byBtaW5pbXVtIGxldmVsIChhYm92ZSB0aGlzLT56b29tIHZhbHVlKSB0aGF0IHdpbGwgZW5jb21wYXNzIGFsbCBtYXJrZXJzCiAgICAgKgogICAgICogQHZhciBib29sZWFuCiAgICAgKi8KICAgIHZhciAkem9vbV9lbmNvbXBhc3MgPSB0cnVlOwoKICAgIC8qKgogICAgICogZmFjdG9yIGJ5IHdoaWNoIHRvIGZ1ZGdlIHRoZSBib3VuZGFyaWVzIHNvIHRoYXQgd2hlbiB3ZSB6b29tIGVuY29tcGFzcywgdGhlIG1hcmtlcnMgYXJlbid0IHRvbyBjbG9zZSB0byB0aGUgZWRnZQogICAgICoKICAgICAqIEB2YXIgZmxvYXQKICAgICAqLwogICAgdmFyICRib3VuZHNfZnVkZ2UgPSAwLjAxOwoKICAgIC8qKgogICAgICogdXNlIHRoZSBmaXJzdCBzdWdnZXN0aW9uIGJ5IGEgZ29vZ2xlIGxvb2t1cCBpZiBleGFjdCBtYXRjaCBub3QgZm91bmQKICAgICAqCiAgICAgKiBAdmFyIGZsb2F0CiAgICAgKi8KICAgIHZhciAkdXNlX3N1Z2dlc3QgPSBmYWxzZTsKCiAgICAKICAgIC8qKgogICAgICogbGlzdCBvZiBhZGRlZCBwb2x5bGluZXMKICAgICAqCiAgICAgKiBAdmFyIGFycmF5CiAgICAgKi8KICAgIHZhciAkX3BvbHlsaW5lcyA9IGFycmF5KCk7ICAgIAogICAgCiAgICAvKioKICAgICAqIGljb24gaW5mbyBhcnJheQogICAgICoKICAgICAqIEB2YXIgYXJyYXkKICAgICAqLwogICAgdmFyICRfaWNvbnMgPSBhcnJheSgpOwoKICAgIC8qKgogICAgICogZGF0YWJhc2UgY2FjaGUgdGFibGUgbmFtZQogICAgICoKICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHZhciAkX2RiX2NhY2hlX3RhYmxlID0gJ0dFT0NPREVTJzsKICAgICAgICAKICAgICAgICAKICAgIC8qKgogICAgICogY2xhc3MgY29uc3RydWN0b3IKICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICRtYXBfaWQgdGhlIGlkIGZvciB0aGlzIG1hcAogICAgICogQHBhcmFtIHN0cmluZyAkYXBwX2lkIFlPVVIgWWFob28gQXBwIElECiAgICAgKi8KICAgIGZ1bmN0aW9uIEdvb2dsZU1hcEFQSSgkbWFwX2lkID0gJ21hcCcsICRhcHBfaWQgPSAnTXlNYXBBcHAnKSB7CiAgICAgICAgJHRoaXMtPm1hcF9pZCA9ICRtYXBfaWQ7CiAgICAgICAgJHRoaXMtPnNpZGViYXJfaWQgPSAnc2lkZWJhcl8nIC4gJG1hcF9pZDsKICAgICAgICAkdGhpcy0+YXBwX2lkID0gJGFwcF9pZDsKICAgIH0KICAgCiAgICAvKioKICAgICAqIHNldHMgdGhlIFBFQVI6OkRCIGRzbgogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgJGRzbgogICAgICovCiAgICBmdW5jdGlvbiBzZXREU04oJGRzbikgewogICAgICAgICR0aGlzLT5kc24gPSYgJGRzbjsgICAKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBzZXRzIHRoZSB0YWJsZSBuYW1lIAogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgJHRhYmxlCiAgICAgKi8KICAgIGZ1bmN0aW9uIHNldERCVGFibGUoJHRhYmxlKQogICAgewogICAgICAkdGhpcy0+X2RiX2NhY2hlX3RhYmxlID0gJHRhYmxlOwogICAgfQoKICAgIC8qKgogICAgICogc2V0cyBZT1VSIEdvb2dsZSBNYXAgQVBJIGtleQogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgJGtleQogICAgICovCiAgICBmdW5jdGlvbiBzZXRBUElLZXkoJGtleSkgewogICAgICAgICR0aGlzLT5hcGlfa2V5ID0gJGtleTsgICAKICAgIH0KCiAgICAvKioKICAgICAqIHNldHMgdGhlIHdpZHRoIG9mIHRoZSBtYXAKICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICR3aWR0aAogICAgICovCiAgICBmdW5jdGlvbiBzZXRXaWR0aCgkd2lkdGgpIHsKICAgICAgICBpZighcHJlZ19tYXRjaCgnIV4oXGQrKSguKikkIScsJHdpZHRoLCRfbWF0Y2gpKQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CgogICAgICAgICRfd2lkdGggPSAkX21hdGNoWzFdOwogICAgICAgICRfdHlwZSA9ICRfbWF0Y2hbMl07CiAgICAgICAgaWYoJF90eXBlID09ICclJykKICAgICAgICAgICAgJHRoaXMtPndpZHRoID0gJF93aWR0aCAuICclJzsKICAgICAgICBlbHNlCiAgICAgICAgICAgICR0aGlzLT53aWR0aCA9ICRfd2lkdGggLiAncHgnOwogICAgICAgIAogICAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIC8qKgogICAgICogc2V0cyB0aGUgaGVpZ2h0IG9mIHRoZSBtYXAKICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICRoZWlnaHQKICAgICAqLwogICAgZnVuY3Rpb24gc2V0SGVpZ2h0KCRoZWlnaHQpIHsKICAgICAgICBpZighcHJlZ19tYXRjaCgnIV4oXGQrKSguKikkIScsJGhlaWdodCwkX21hdGNoKSkKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwoKICAgICAgICAkX2hlaWdodCA9ICRfbWF0Y2hbMV07CiAgICAgICAgJF90eXBlID0gJF9tYXRjaFsyXTsKICAgICAgICBpZigkX3R5cGUgPT0gJyUnKQogICAgICAgICAgICAkdGhpcy0+aGVpZ2h0ID0gJF9oZWlnaHQgLiAnJSc7CiAgICAgICAgZWxzZQogICAgICAgICAgICAkdGhpcy0+aGVpZ2h0ID0gJF9oZWlnaHQgLiAncHgnOwogICAgICAgIAogICAgICAgIHJldHVybiB0cnVlOwogICAgfSAgICAgICAgCgogICAgLyoqCiAgICAgKiBzZXRzIHRoZSBkZWZhdWx0IG1hcCB6b29tIGxldmVsCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkbGV2ZWwKICAgICAqLwogICAgZnVuY3Rpb24gc2V0Wm9vbUxldmVsKCRsZXZlbCkgewogICAgICAgICR0aGlzLT56b29tID0gKGludCkgJGxldmVsOwogICAgfSAgICAKICAgICAgICAgICAgCiAgICAvKioKICAgICAqIGVuYWJsZXMgdGhlIG1hcCBjb250cm9scyAoem9vbS9tb3ZlKQogICAgICoKICAgICAqLwogICAgZnVuY3Rpb24gZW5hYmxlTWFwQ29udHJvbHMoKSB7CiAgICAgICAgJHRoaXMtPm1hcF9jb250cm9scyA9IHRydWU7CiAgICB9CgogICAgLyoqCiAgICAgKiBkaXNhYmxlcyB0aGUgbWFwIGNvbnRyb2xzICh6b29tL21vdmUpCiAgICAgKgogICAgICovCiAgICBmdW5jdGlvbiBkaXNhYmxlTWFwQ29udHJvbHMoKSB7CiAgICAgICAgJHRoaXMtPm1hcF9jb250cm9scyA9IGZhbHNlOwogICAgfSAgICAKICAgIAogICAgLyoqCiAgICAgKiBzZXRzIHRoZSBtYXAgY29udHJvbCBzaXplIChsYXJnZS9zbWFsbCkKICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICRzaXplCiAgICAgKi8KICAgIGZ1bmN0aW9uIHNldENvbnRyb2xTaXplKCRzaXplKSB7CiAgICAgICAgaWYoaW5fYXJyYXkoJHNpemUsYXJyYXkoJ2xhcmdlJywnc21hbGwnKSkpCiAgICAgICAgICAgICR0aGlzLT5jb250cm9sX3NpemUgPSAkc2l6ZTsKICAgIH0gICAgICAgICAgICAKCiAgICAvKioKICAgICAqIGVuYWJsZXMgdGhlIHR5cGUgY29udHJvbHMgKG1hcC9zYXRlbGxpdGUvaHlicmlkKQogICAgICoKICAgICAqLwogICAgZnVuY3Rpb24gZW5hYmxlVHlwZUNvbnRyb2xzKCkgewogICAgICAgICR0aGlzLT50eXBlX2NvbnRyb2xzID0gdHJ1ZTsKICAgIH0KCiAgICAvKioKICAgICAqIGRpc2FibGVzIHRoZSB0eXBlIGNvbnRyb2xzIChtYXAvc2F0ZWxsaXRlL2h5YnJpZCkKICAgICAqCiAgICAgKi8KICAgIGZ1bmN0aW9uIGRpc2FibGVUeXBlQ29udHJvbHMoKSB7CiAgICAgICAgJHRoaXMtPnR5cGVfY29udHJvbHMgPSBmYWxzZTsKICAgIH0KCiAgICAvKioKICAgICAqIHNldCBkZWZhdWx0IG1hcCB0eXBlIChtYXAvc2F0ZWxsaXRlL2h5YnJpZCkKICAgICAqCiAgICAgKi8KICAgIGZ1bmN0aW9uIHNldE1hcFR5cGUoJHR5cGUpIHsKICAgICAgICBzd2l0Y2goJHR5cGUpIHsKICAgICAgICAgICAgY2FzZSAnaHlicmlkJzoKICAgICAgICAgICAgICAgICR0aGlzLT5tYXBfdHlwZSA9ICdHX0hZQlJJRF9NQVAnOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ3NhdGVsbGl0ZSc6CiAgICAgICAgICAgICAgICAkdGhpcy0+bWFwX3R5cGUgPSAnR19TQVRFTExJVEVfTUFQJzsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdtYXAnOgogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgJHRoaXMtPm1hcF90eXBlID0gJ0dfTk9STUFMX01BUCc7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICB9ICAgICAgIAogICAgfSAgICAKICAgIAogICAgLyoqCiAgICAgKiBlbmFibGVzIG9ubG9hZAogICAgICoKICAgICAqLwogICAgZnVuY3Rpb24gZW5hYmxlT25Mb2FkKCkgewogICAgICAgICR0aGlzLT5vbmxvYWQgPSB0cnVlOwogICAgfQoKICAgIC8qKgogICAgICogZGlzYWJsZXMgb25sb2FkCiAgICAgKgogICAgICovCiAgICBmdW5jdGlvbiBkaXNhYmxlT25Mb2FkKCkgewogICAgICAgICR0aGlzLT5vbmxvYWQgPSBmYWxzZTsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBlbmFibGVzIHNpZGViYXIKICAgICAqCiAgICAgKi8KICAgIGZ1bmN0aW9uIGVuYWJsZVNpZGViYXIoKSB7CiAgICAgICAgJHRoaXMtPnNpZGViYXIgPSB0cnVlOwogICAgfQoKICAgIC8qKgogICAgICogZGlzYWJsZXMgc2lkZWJhcgogICAgICoKICAgICAqLwogICAgZnVuY3Rpb24gZGlzYWJsZVNpZGViYXIoKSB7CiAgICAgICAgJHRoaXMtPnNpZGViYXIgPSBmYWxzZTsKICAgIH0gICAgCgogICAgLyoqCiAgICAgKiBlbmFibGVzIG1hcCBkaXJlY3Rpb25zIGluc2lkZSBpbmZvIHdpbmRvdwogICAgICoKICAgICAqLwogICAgZnVuY3Rpb24gZW5hYmxlRGlyZWN0aW9ucygpIHsKICAgICAgICAkdGhpcy0+ZGlyZWN0aW9ucyA9IHRydWU7CiAgICB9CgogICAgLyoqCiAgICAgKiBkaXNhYmxlcyBtYXAgZGlyZWN0aW9ucyBpbnNpZGUgaW5mbyB3aW5kb3cKICAgICAqCiAgICAgKi8KICAgIGZ1bmN0aW9uIGRpc2FibGVEaXJlY3Rpb25zKCkgewogICAgICAgICR0aGlzLT5kaXJlY3Rpb25zID0gZmFsc2U7CiAgICB9ICAgIAogICAgICAgIAogICAgLyoqCiAgICAgKiBzZXQgYnJvd3NlciBhbGVydCBtZXNzYWdlIGZvciBpbmNvbXBhdGlibGUgYnJvd3NlcnMKICAgICAqCiAgICAgKiBAcGFyYW1zICRtZXNzYWdlIHN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiBzZXRCcm93c2VyQWxlcnQoJG1lc3NhZ2UpIHsKICAgICAgICAkdGhpcy0+YnJvd3Nlcl9hbGVydCA9ICRtZXNzYWdlOwogICAgfQoKICAgIC8qKgogICAgICogc2V0IDxub3NjcmlwdD4gbWVzc2FnZSB3aGVuIGphdmFzY3JpcHQgaXMgZGlzYWJsZWQKICAgICAqCiAgICAgKiBAcGFyYW1zICRtZXNzYWdlIHN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiBzZXRKU0FsZXJ0KCRtZXNzYWdlKSB7CiAgICAgICAgJHRoaXMtPmpzX2FsZXJ0ID0gJG1lc3NhZ2U7CiAgICB9CgogICAgLyoqCiAgICAgKiBlbmFibGUgbWFwIG1hcmtlciBpbmZvIHdpbmRvd3MKICAgICAqLwogICAgZnVuY3Rpb24gZW5hYmxlSW5mb1dpbmRvdygpIHsKICAgICAgICAkdGhpcy0+aW5mb193aW5kb3cgPSB0cnVlOwogICAgfQogICAgCiAgICAvKioKICAgICAqIGRpc2FibGUgbWFwIG1hcmtlciBpbmZvIHdpbmRvd3MKICAgICAqLwogICAgZnVuY3Rpb24gZGlzYWJsZUluZm9XaW5kb3coKSB7CiAgICAgICAgJHRoaXMtPmluZm9fd2luZG93ID0gZmFsc2U7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogc2V0IHRoZSBpbmZvIHdpbmRvdyB0cmlnZ2VyIGFjdGlvbgogICAgICoKICAgICAqIEBwYXJhbXMgJG1lc3NhZ2Ugc3RyaW5nIGNsaWNrL21vdXNlb3ZlcgogICAgICovCiAgICBmdW5jdGlvbiBzZXRJbmZvV2luZG93VHJpZ2dlcigkdHlwZSkgewogICAgICAgIHN3aXRjaCgkdHlwZSkgewogICAgICAgICAgICBjYXNlICdtb3VzZW92ZXInOgogICAgICAgICAgICAgICAgJHRoaXMtPndpbmRvd190cmlnZ2VyID0gJ21vdXNlb3Zlcic7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICR0aGlzLT53aW5kb3dfdHJpZ2dlciA9ICdjbGljayc7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogZW5hYmxlIHpvb20gdG8gZW5jb21wYXNzIG1ha2VycwogICAgICovCiAgICBmdW5jdGlvbiBlbmFibGVab29tRW5jb21wYXNzKCkgewogICAgICAgICR0aGlzLT56b29tX2VuY29tcGFzcyA9IHRydWU7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogZGlzYWJsZSB6b29tIHRvIGVuY29tcGFzcyBtYWtlcnMKICAgICAqLwogICAgZnVuY3Rpb24gZGlzYWJsZVpvb21FbmNvbXBhc3MoKSB7CiAgICAgICAgJHRoaXMtPnpvb21fZW5jb21wYXNzID0gZmFsc2U7CiAgICB9CgogICAgLyoqCiAgICAgKiBzZXQgdGhlIGJvdW5kYXJ5IGZ1ZGdlIGZhY3RvcgogICAgICovCiAgICBmdW5jdGlvbiBzZXRCb3VuZHNGdWRnZSgkdmFsKSB7CiAgICAgICAgJHRoaXMtPmJvdW5kc19mdWRnZSA9ICR2YWw7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogZW5hYmxlcyB0aGUgc2NhbGUgbWFwIGNvbnRyb2wKICAgICAqCiAgICAgKi8KICAgIGZ1bmN0aW9uIGVuYWJsZVNjYWxlQ29udHJvbCgpIHsKICAgICAgICAkdGhpcy0+c2NhbGVfY29udHJvbCA9IHRydWU7CiAgICB9CgogICAgLyoqCiAgICAgKiBkaXNhYmxlcyB0aGUgc2NhbGUgbWFwIGNvbnRyb2wKICAgICAqCiAgICAgKi8KICAgIGZ1bmN0aW9uIGRpc2FibGVTY2FsZUNvbnRyb2woKSB7CiAgICAgICAgJHRoaXMtPnNjYWxlX2NvbnRyb2wgPSBmYWxzZTsKICAgIH0gICAgCiAgICAgICAgICAgIAogICAgLyoqCiAgICAgKiBlbmFibGVzIHRoZSBvdmVydmlldyBtYXAgY29udHJvbAogICAgICoKICAgICAqLwogICAgZnVuY3Rpb24gZW5hYmxlT3ZlcnZpZXdDb250cm9sKCkgewogICAgICAgICR0aGlzLT5vdmVydmlld19jb250cm9sID0gdHJ1ZTsKICAgIH0KCiAgICAvKioKICAgICAqIGRpc2FibGVzIHRoZSBvdmVydmlldyBtYXAgY29udHJvbAogICAgICoKICAgICAqLwogICAgZnVuY3Rpb24gZGlzYWJsZU92ZXJ2aWV3Q29udHJvbCgpIHsKICAgICAgICAkdGhpcy0+b3ZlcnZpZXdfY29udHJvbCA9IGZhbHNlOwogICAgIH0gICAgCiAgICAKICAgIAogICAgLyoqCiAgICAgKiBzZXQgdGhlIGxvb2t1cCBzZXJ2aWNlIHRvIHVzZSBmb3IgZ2VvY29kZSBsb29rdXBzCiAgICAgKiBkZWZhdWx0IGlzIFlBSE9PLCB5b3UgY2FuIGFsc28gdXNlIEdPT0dMRS4KICAgICAqIE5PVEU6IEdPT0dMRSBjYW4gdG8gaW50bCBsb29rdXBzLCBidXQgaXMgbm90IGFuCiAgICAgKiBvZmZpY2lhbCBBUEksIHNvIHVzZSBhdCB5b3VyIG93biByaXNrLgogICAgICoKICAgICAqLwogICAgZnVuY3Rpb24gc2V0TG9va3VwU2VydmljZSgkc2VydmljZSkgewogICAgICAgIHN3aXRjaCgkc2VydmljZSkgewogICAgICAgICAgICBjYXNlICdHT09HTEUnOgogICAgICAgICAgICAgICAgJHRoaXMtPmxvb2t1cF9zZXJ2aWNlID0gJ0dPT0dMRSc7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnWUFIT08nOgogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgJHRoaXMtPmxvb2t1cF9zZXJ2aWNlID0gJ1lBSE9PJzsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0gICAgICAgCiAgICB9CiAgICAKICAgICAgICAKICAgIC8qKgogICAgICogYWRkcyBhIG1hcCBtYXJrZXIgYnkgYWRkcmVzcwogICAgICogCiAgICAgKiBAcGFyYW0gc3RyaW5nICRhZGRyZXNzIHRoZSBtYXAgYWRkcmVzcyB0byBtYXJrIChzdHJlZXQvY2l0eS9zdGF0ZS96aXApCiAgICAgKiBAcGFyYW0gc3RyaW5nICR0aXRsZSB0aGUgdGl0bGUgZGlzcGxheSBpbiB0aGUgc2lkZWJhcgogICAgICogQHBhcmFtIHN0cmluZyAkaHRtbCB0aGUgSFRNTCBibG9jayB0byBkaXNwbGF5IGluIHRoZSBpbmZvIGJ1YmJsZSAoaWYgZW1wdHksIHRpdGxlIGlzIHVzZWQpCiAgICAgKi8KICAgIGZ1bmN0aW9uIGFkZE1hcmtlckJ5QWRkcmVzcygkYWRkcmVzcywkdGl0bGUgPSAnJywkaHRtbCA9ICcnLCR0b29sdGlwID0gJycpIHsKICAgICAgICBpZigoJF9nZW9jb2RlID0gJHRoaXMtPmdldEdlb2NvZGUoJGFkZHJlc3MpKSA9PT0gZmFsc2UpCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICByZXR1cm4gJHRoaXMtPmFkZE1hcmtlckJ5Q29vcmRzKCRfZ2VvY29kZVsnbG9uJ10sJF9nZW9jb2RlWydsYXQnXSwkdGl0bGUsJGh0bWwsJHRvb2x0aXApOwogICAgfQoKICAgIC8qKgogICAgICogYWRkcyBhIG1hcCBtYXJrZXIgYnkgZ2VvY29kZQogICAgICogCiAgICAgKiBAcGFyYW0gc3RyaW5nICRsb24gdGhlIG1hcCBsb25naXR1ZGUgKGhvcml6b250YWwpCiAgICAgKiBAcGFyYW0gc3RyaW5nICRsYXQgdGhlIG1hcCBsYXRpdHVkZSAodmVydGljYWwpCiAgICAgKiBAcGFyYW0gc3RyaW5nICR0aXRsZSB0aGUgdGl0bGUgZGlzcGxheSBpbiB0aGUgc2lkZWJhcgogICAgICogQHBhcmFtIHN0cmluZyAkaHRtbHxhcnJheSAkaHRtbCAKICAgICAqICAgICBzdHJpbmc6IHRoZSBIVE1MIGJsb2NrIHRvIGRpc3BsYXkgaW4gdGhlIGluZm8gYnViYmxlIChpZiBlbXB0eSwgdGl0bGUgaXMgdXNlZCkKICAgICAqICAgICBhcnJheTogVGhlIHRpdGxlID0+IGNvbnRlbnQgcGFpcnMgZm9yIGEgdGFiYmVkIGluZm8gYnViYmxlICAgICAKICAgICAqLwogICAgLy8gVE9ETyBtYWtlIGl0IHNvIHlvdSBjYW4gc3BlY2lmeSB3aGljaCB0YWIgeW91IHdhbnQgdGhlIGRpcmVjdGlvbnMgdG8gYXBwZWFyIGluIChhZGQgYW5vdGhlciBhcmcpCiAgICBmdW5jdGlvbiBhZGRNYXJrZXJCeUNvb3JkcygkbG9uLCRsYXQsJHRpdGxlID0gJycsJGh0bWwgPSAnJywkdG9vbHRpcCA9ICcnKSB7CiAgICAgICAgJF9tYXJrZXJbJ2xvbiddID0gJGxvbjsKICAgICAgICAkX21hcmtlclsnbGF0J10gPSAkbGF0OwogICAgICAgICRfbWFya2VyWydodG1sJ10gPSAoaXNfYXJyYXkoJGh0bWwpIHx8IHN0cmxlbigkaHRtbCkgPiAwKSA/ICRodG1sIDogJHRpdGxlOwogICAgICAgICRfbWFya2VyWyd0aXRsZSddID0gJHRpdGxlOwogICAgICAgICRfbWFya2VyWyd0b29sdGlwJ10gPSAkdG9vbHRpcDsKICAgICAgICAkdGhpcy0+X21hcmtlcnNbXSA9ICRfbWFya2VyOwogICAgICAgICR0aGlzLT5hZGp1c3RDZW50ZXJDb29yZHMoJF9tYXJrZXJbJ2xvbiddLCRfbWFya2VyWydsYXQnXSk7CiAgICAgICAgLy8gcmV0dXJuIGluZGV4IG9mIG1hcmtlcgogICAgICAgIHJldHVybiBjb3VudCgkdGhpcy0+X21hcmtlcnMpIC0gMTsKICAgIH0KCiAgICAvKioKICAgICAqIGFkZHMgYSBtYXAgcG9seWxpbmUgYnkgYWRkcmVzcwogICAgICogaWYgY29sb3IsIHdlaWdodCBhbmQgb3BhY2l0eSBhcmUgbm90IGRlZmluZWQsIHVzZSB0aGUgZ29vZ2xlIG1hcHMgZGVmYXVsdHMKICAgICAqIAogICAgICogQHBhcmFtIHN0cmluZyAkYWRkcmVzczEgdGhlIG1hcCBhZGRyZXNzIHRvIGRyYXcgZnJvbQogICAgICogQHBhcmFtIHN0cmluZyAkYWRkcmVzczIgdGhlIG1hcCBhZGRyZXNzIHRvIGRyYXcgdG8KICAgICAqIEBwYXJhbSBzdHJpbmcgJGNvbG9yIHRoZSBjb2xvciBvZiB0aGUgbGluZSAoZm9ybWF0OiAjMDAwMDAwKQogICAgICogQHBhcmFtIHN0cmluZyAkd2VpZ2h0IHRoZSB3ZWlnaHQgb2YgdGhlIGxpbmUgaW4gcGl4ZWxzCiAgICAgKiBAcGFyYW0gc3RyaW5nICRvcGFjaXR5IHRoZSBsaW5lIG9wYWNpdHkgKHBlcmNlbnRhZ2UpCiAgICAgKi8KICAgIGZ1bmN0aW9uIGFkZFBvbHlMaW5lQnlBZGRyZXNzKCRhZGRyZXNzMSwkYWRkcmVzczIsJGNvbG9yPScnLCR3ZWlnaHQ9MCwkb3BhY2l0eT0wKSB7CiAgICAgICAgaWYoKCRfZ2VvY29kZTEgPSAkdGhpcy0+Z2V0R2VvY29kZSgkYWRkcmVzczEpKSA9PT0gZmFsc2UpCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICBpZigoJF9nZW9jb2RlMiA9ICR0aGlzLT5nZXRHZW9jb2RlKCRhZGRyZXNzMikpID09PSBmYWxzZSkKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIHJldHVybiAkdGhpcy0+YWRkUG9seUxpbmVCeUNvb3JkcygkX2dlb2NvZGUxWydsb24nXSwkX2dlb2NvZGUxWydsYXQnXSwkX2dlb2NvZGUyWydsb24nXSwkX2dlb2NvZGUyWydsYXQnXSwkY29sb3IsJHdlaWdodCwkb3BhY2l0eSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBhZGRzIGEgbWFwIHBvbHlsaW5lIGJ5IG1hcCBjb29yZGluYXRlcwogICAgICogaWYgY29sb3IsIHdlaWdodCBhbmQgb3BhY2l0eSBhcmUgbm90IGRlZmluZWQsIHVzZSB0aGUgZ29vZ2xlIG1hcHMgZGVmYXVsdHMKICAgICAqIAogICAgICogQHBhcmFtIHN0cmluZyAkbG9uMSB0aGUgbWFwIGxvbmdpdHVkZSB0byBkcmF3IGZyb20KICAgICAqIEBwYXJhbSBzdHJpbmcgJGxhdDEgdGhlIG1hcCBsYXRpdHVkZSB0byBkcmF3IGZyb20KICAgICAqIEBwYXJhbSBzdHJpbmcgJGxvbjIgdGhlIG1hcCBsb25naXR1ZGUgdG8gZHJhdyB0bwogICAgICogQHBhcmFtIHN0cmluZyAkbGF0MiB0aGUgbWFwIGxhdGl0dWRlIHRvIGRyYXcgdG8KICAgICAqIEBwYXJhbSBzdHJpbmcgJGNvbG9yIHRoZSBjb2xvciBvZiB0aGUgbGluZSAoZm9ybWF0OiAjMDAwMDAwKQogICAgICogQHBhcmFtIHN0cmluZyAkd2VpZ2h0IHRoZSB3ZWlnaHQgb2YgdGhlIGxpbmUgaW4gcGl4ZWxzCiAgICAgKiBAcGFyYW0gc3RyaW5nICRvcGFjaXR5IHRoZSBsaW5lIG9wYWNpdHkgKHBlcmNlbnRhZ2UpCiAgICAgKi8KICAgIGZ1bmN0aW9uIGFkZFBvbHlMaW5lQnlDb29yZHMoJGxvbjEsJGxhdDEsJGxvbjIsJGxhdDIsJGNvbG9yPScnLCR3ZWlnaHQ9MCwkb3BhY2l0eT0wKSB7CiAgICAgICAgJF9wb2x5bGluZVsnbG9uMSddID0gJGxvbjE7CiAgICAgICAgJF9wb2x5bGluZVsnbGF0MSddID0gJGxhdDE7CiAgICAgICAgJF9wb2x5bGluZVsnbG9uMiddID0gJGxvbjI7CiAgICAgICAgJF9wb2x5bGluZVsnbGF0MiddID0gJGxhdDI7CiAgICAgICAgJF9wb2x5bGluZVsnY29sb3InXSA9ICRjb2xvcjsKICAgICAgICAkX3BvbHlsaW5lWyd3ZWlnaHQnXSA9ICR3ZWlnaHQ7CiAgICAgICAgJF9wb2x5bGluZVsnb3BhY2l0eSddID0gJG9wYWNpdHk7CiAgICAgICAgJHRoaXMtPl9wb2x5bGluZXNbXSA9ICRfcG9seWxpbmU7CiAgICAgICAgJHRoaXMtPmFkanVzdENlbnRlckNvb3JkcygkX3BvbHlsaW5lWydsb24xJ10sJF9wb2x5bGluZVsnbGF0MSddKTsKICAgICAgICAkdGhpcy0+YWRqdXN0Q2VudGVyQ29vcmRzKCRfcG9seWxpbmVbJ2xvbjInXSwkX3BvbHlsaW5lWydsYXQyJ10pOwogICAgICAgIC8vIHJldHVybiBpbmRleCBvZiBwb2x5bGluZQogICAgICAgIHJldHVybiBjb3VudCgkdGhpcy0+X3BvbHlsaW5lcykgLSAxOwogICAgfSAgICAgICAgCiAgICAgICAgCiAgICAvKioKICAgICAqIGFkanVzdCBtYXAgY2VudGVyIGNvb3JkaW5hdGVzIGJ5IHRoZSBnaXZlbiBsYXQvbG9uIHBvaW50CiAgICAgKiAKICAgICAqIEBwYXJhbSBzdHJpbmcgJGxvbiB0aGUgbWFwIGxhdGl0dWRlIChob3Jpem9udGFsKQogICAgICogQHBhcmFtIHN0cmluZyAkbGF0IHRoZSBtYXAgbGF0aXR1ZGUgKHZlcnRpY2FsKQogICAgICovCiAgICBmdW5jdGlvbiBhZGp1c3RDZW50ZXJDb29yZHMoJGxvbiwkbGF0KSB7CiAgICAgICAgaWYoc3RybGVuKChzdHJpbmcpJGxvbikgPT0gMCB8fCBzdHJsZW4oKHN0cmluZykkbGF0KSA9PSAwKQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgJHRoaXMtPl9tYXhfbG9uID0gKGZsb2F0KSBtYXgoJGxvbiwgJHRoaXMtPl9tYXhfbG9uKTsKICAgICAgICAkdGhpcy0+X21pbl9sb24gPSAoZmxvYXQpIG1pbigkbG9uLCAkdGhpcy0+X21pbl9sb24pOwogICAgICAgICR0aGlzLT5fbWF4X2xhdCA9IChmbG9hdCkgbWF4KCRsYXQsICR0aGlzLT5fbWF4X2xhdCk7CiAgICAgICAgJHRoaXMtPl9taW5fbGF0ID0gKGZsb2F0KSBtaW4oJGxhdCwgJHRoaXMtPl9taW5fbGF0KTsKICAgICAgICAKICAgICAgICAkdGhpcy0+Y2VudGVyX2xvbiA9IChmbG9hdCkgKCR0aGlzLT5fbWluX2xvbiArICR0aGlzLT5fbWF4X2xvbikgLyAyOwogICAgICAgICR0aGlzLT5jZW50ZXJfbGF0ID0gKGZsb2F0KSAoJHRoaXMtPl9taW5fbGF0ICsgJHRoaXMtPl9tYXhfbGF0KSAvIDI7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgLyoqCiAgICAgKiBzZXQgbWFwIGNlbnRlciBjb29yZGluYXRlcyB0byBsYXQvbG9uIHBvaW50CiAgICAgKiAKICAgICAqIEBwYXJhbSBzdHJpbmcgJGxvbiB0aGUgbWFwIGxhdGl0dWRlIChob3Jpem9udGFsKQogICAgICogQHBhcmFtIHN0cmluZyAkbGF0IHRoZSBtYXAgbGF0aXR1ZGUgKHZlcnRpY2FsKQogICAgICovCiAgICBmdW5jdGlvbiBzZXRDZW50ZXJDb29yZHMoJGxvbiwkbGF0KSB7CiAgICAgICAgJHRoaXMtPmNlbnRlcl9sYXQgPSAoZmxvYXQpICRsYXQ7CiAgICAgICAgJHRoaXMtPmNlbnRlcl9sb24gPSAoZmxvYXQpICRsb247CiAgICB9ICAgIAoKICAgIC8qKgogICAgICogZ2VuZXJhdGUgYW4gYXJyYXkgb2YgcGFyYW1zIGZvciBhIG5ldyBtYXJrZXIgaWNvbiBpbWFnZQogICAgICogaWNvblNoYWRvd0ltYWdlIGlzIG9wdGlvbmFsCiAgICAgKiBJZiBhbmNob3IgY29vcmRzIGFyZSBub3Qgc3VwcGxpZWQsIHdlIHVzZSB0aGUgY2VudGVyIHBvaW50IG9mIHRoZSBpbWFnZSBieSBkZWZhdWx0LiAKICAgICAqIENhbiBiZSBjYWxsZWQgc3RhdGljYWxseS4gRm9yIHByaXZhdGUgdXNlIGJ5IGFkZE1hcmtlckljb24oKSBhbmQgc2V0TWFya2VySWNvbigpCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkaWNvbkltYWdlIFVSTCB0byBpY29uIGltYWdlCiAgICAgKiBAcGFyYW0gc3RyaW5nICRpY29uU2hhZG93SW1hZ2UgVVJMIHRvIHNoYWRvdyBpbWFnZQogICAgICogQHBhcmFtIHN0cmluZyAkaWNvbkFuY2hvclggWCBjb29yZGluYXRlIGZvciBpY29uIGFuY2hvciBwb2ludAogICAgICogQHBhcmFtIHN0cmluZyAkaWNvbkFuY2hvclkgWSBjb29yZGluYXRlIGZvciBpY29uIGFuY2hvciBwb2ludAogICAgICogQHBhcmFtIHN0cmluZyAkaW5mb1dpbmRvd0FuY2hvclggWCBjb29yZGluYXRlIGZvciBpbmZvIHdpbmRvdyBhbmNob3IgcG9pbnQKICAgICAqIEBwYXJhbSBzdHJpbmcgJGluZm9XaW5kb3dBbmNob3JZIFkgY29vcmRpbmF0ZSBmb3IgaW5mbyB3aW5kb3cgYW5jaG9yIHBvaW50CiAgICAgKi8KICAgIGZ1bmN0aW9uIGNyZWF0ZU1hcmtlckljb24oJGljb25JbWFnZSwkaWNvblNoYWRvd0ltYWdlID0gJycsJGljb25BbmNob3JYID0gJ3gnLCRpY29uQW5jaG9yWSA9ICd4JywkaW5mb1dpbmRvd0FuY2hvclggPSAneCcsJGluZm9XaW5kb3dBbmNob3JZID0gJ3gnKSB7CiAgICAgICAgJF9pY29uX2ltYWdlX3BhdGggPSBzdHJwb3MoJGljb25JbWFnZSwnaHR0cCcpID09PSAwID8gJGljb25JbWFnZSA6ICRfU0VSVkVSWydET0NVTUVOVF9ST09UJ10gLiAkaWNvbkltYWdlOwogICAgICAgIGlmKCEoJF9pbWFnZV9pbmZvID0gQGdldGltYWdlc2l6ZSgkX2ljb25faW1hZ2VfcGF0aCkpKSB7CiAgICAgICAgICAgIGRpZSgnR29vZ2xlTWFwQVBJOmNyZWF0ZU1hcmtlckljb246IEVycm9yIHJlYWRpbmcgaW1hZ2U6ICcgLiAkaWNvbkltYWdlKTsgICAKICAgICAgICB9CiAgICAgICAgaWYoJGljb25TaGFkb3dJbWFnZSkgewogICAgICAgICAgICAkX3NoYWRvd19pbWFnZV9wYXRoID0gc3RycG9zKCRpY29uU2hhZG93SW1hZ2UsJ2h0dHAnKSA9PT0gMCA/ICRpY29uU2hhZG93SW1hZ2UgOiAkX1NFUlZFUlsnRE9DVU1FTlRfUk9PVCddIC4gJGljb25TaGFkb3dJbWFnZTsKICAgICAgICAgICAgaWYoISgkX3NoYWRvd19pbmZvID0gQGdldGltYWdlc2l6ZSgkX3NoYWRvd19pbWFnZV9wYXRoKSkpIHsKICAgICAgICAgICAgICAgIGRpZSgnR29vZ2xlTWFwQVBJOmNyZWF0ZU1hcmtlckljb246IEVycm9yIHJlYWRpbmcgaW1hZ2U6ICcgLiAkaWNvblNoYWRvd0ltYWdlKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZigkaWNvbkFuY2hvclggPT09ICd4JykgewogICAgICAgICAgICAkaWNvbkFuY2hvclggPSAoaW50KSAoJF9pbWFnZV9pbmZvWzBdIC8gMik7CiAgICAgICAgfQogICAgICAgIGlmKCRpY29uQW5jaG9yWSA9PT0gJ3gnKSB7CiAgICAgICAgICAgICRpY29uQW5jaG9yWSA9IChpbnQpICgkX2ltYWdlX2luZm9bMV0gLyAyKTsKICAgICAgICB9CiAgICAgICAgaWYoJGluZm9XaW5kb3dBbmNob3JYID09PSAneCcpIHsKICAgICAgICAgICAgJGluZm9XaW5kb3dBbmNob3JYID0gKGludCkgKCRfaW1hZ2VfaW5mb1swXSAvIDIpOwogICAgICAgIH0KICAgICAgICBpZigkaW5mb1dpbmRvd0FuY2hvclkgPT09ICd4JykgewogICAgICAgICAgICAkaW5mb1dpbmRvd0FuY2hvclkgPSAoaW50KSAoJF9pbWFnZV9pbmZvWzFdIC8gMik7CiAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAkaWNvbl9pbmZvID0gYXJyYXkoCiAgICAgICAgICAgICAgICAnaW1hZ2UnID0+ICRpY29uSW1hZ2UsCiAgICAgICAgICAgICAgICAnaWNvbldpZHRoJyA9PiAkX2ltYWdlX2luZm9bMF0sCiAgICAgICAgICAgICAgICAnaWNvbkhlaWdodCcgPT4gJF9pbWFnZV9pbmZvWzFdLAogICAgICAgICAgICAgICAgJ2ljb25BbmNob3JYJyA9PiAkaWNvbkFuY2hvclgsCiAgICAgICAgICAgICAgICAnaWNvbkFuY2hvclknID0+ICRpY29uQW5jaG9yWSwKICAgICAgICAgICAgICAgICdpbmZvV2luZG93QW5jaG9yWCcgPT4gJGluZm9XaW5kb3dBbmNob3JYLAogICAgICAgICAgICAgICAgJ2luZm9XaW5kb3dBbmNob3JZJyA9PiAkaW5mb1dpbmRvd0FuY2hvclkKICAgICAgICAgICAgICAgICk7CiAgICAgICAgaWYoJGljb25TaGFkb3dJbWFnZSkgewogICAgICAgICAgICAkaWNvbl9pbmZvID0gYXJyYXlfbWVyZ2UoJGljb25faW5mbywgYXJyYXkoJ3NoYWRvdycgPT4gJGljb25TaGFkb3dJbWFnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzaGFkb3dXaWR0aCcgPT4gJF9zaGFkb3dfaW5mb1swXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzaGFkb3dIZWlnaHQnID0+ICRfc2hhZG93X2luZm9bMV0pKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICRpY29uX2luZm87CiAgICB9CiAgICAKICAgIC8qKgogICAgICogc2V0IHRoZSBtYXJrZXIgaWNvbiBmb3IgQUxMIG1hcmtlcnMgb24gdGhlIG1hcAogICAgICovCiAgICBmdW5jdGlvbiBzZXRNYXJrZXJJY29uKCRpY29uSW1hZ2UsJGljb25TaGFkb3dJbWFnZSA9ICcnLCRpY29uQW5jaG9yWCA9ICd4JywkaWNvbkFuY2hvclkgPSAneCcsJGluZm9XaW5kb3dBbmNob3JYID0gJ3gnLCRpbmZvV2luZG93QW5jaG9yWSA9ICd4JykgewogICAgICAgICR0aGlzLT5faWNvbnMgPSBhcnJheSgkdGhpcy0+Y3JlYXRlTWFya2VySWNvbigkaWNvbkltYWdlLCRpY29uU2hhZG93SW1hZ2UsJGljb25BbmNob3JYLCRpY29uQW5jaG9yWSwkaW5mb1dpbmRvd0FuY2hvclgsJGluZm9XaW5kb3dBbmNob3JZKSk7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogYWRkIGFuIGljb24gdG8gZ28gd2l0aCB0aGUgY29ycmVzcG9uZGluZ2x5IGFkZGVkIG1hcmtlcgogICAgICovCiAgICBmdW5jdGlvbiBhZGRNYXJrZXJJY29uKCRpY29uSW1hZ2UsJGljb25TaGFkb3dJbWFnZSA9ICcnLCRpY29uQW5jaG9yWCA9ICd4JywkaWNvbkFuY2hvclkgPSAneCcsJGluZm9XaW5kb3dBbmNob3JYID0gJ3gnLCRpbmZvV2luZG93QW5jaG9yWSA9ICd4JykgewogICAgICAgICR0aGlzLT5faWNvbnNbXSA9ICR0aGlzLT5jcmVhdGVNYXJrZXJJY29uKCRpY29uSW1hZ2UsJGljb25TaGFkb3dJbWFnZSwkaWNvbkFuY2hvclgsJGljb25BbmNob3JZLCRpbmZvV2luZG93QW5jaG9yWCwkaW5mb1dpbmRvd0FuY2hvclkpOwogICAgICAgIHJldHVybiBjb3VudCgkdGhpcy0+X2ljb25zKSAtIDE7CiAgICB9CgogICAgLyoqCiAgICAgKiBwcmludCBtYXAgaGVhZGVyIGphdmFzY3JpcHQgKGdvZXMgYmV0d2VlbiA8aGVhZD48L2hlYWQ+KQogICAgICogCiAgICAgKi8KICAgIGZ1bmN0aW9uIHByaW50SGVhZGVySlMoKSB7CiAgICAgICAgZWNobyAkdGhpcy0+Z2V0SGVhZGVySlMoKTsgICAKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiByZXR1cm4gbWFwIGhlYWRlciBqYXZhc2NyaXB0IChnb2VzIGJldHdlZW4gPGhlYWQ+PC9oZWFkPikKICAgICAqIAogICAgICovCiAgICBmdW5jdGlvbiBnZXRIZWFkZXJKUygpIHsKICAgICAgICByZXR1cm4gc3ByaW50ZignPHNjcmlwdCBzcmM9Imh0dHA6Ly9tYXBzLmdvb2dsZS5jb20vbWFwcz9maWxlPWFwaSZhbXA7dj0yJmFtcDtrZXk9JXMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0PicsICR0aGlzLT5hcGlfa2V5KTsKICAgIH0gICAgCiAgICAKICAgLyoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICogcHJpbnRzIG9uTG9hZCgpIHdpdGhvdXQgaGF2aW5nIHRvIG1hbmlwdWxhdGUgYm9keSB0YWcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAqIGNhbGwgdGhpcyBhZnRlciB0aGUgcHJpbnQgbWFwIGxpa2Ugc28uLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgKiAgICAgICRtYXAtPnByaW50TWFwKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICogICAgICAkbWFwLT5wcmludE9uTG9hZCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgZnVuY3Rpb24gcHJpbnRPbkxvYWQoKSB7CiAgICAgICAgZWNobyAkdGhpcy0+Z2V0T25Mb2FkKCk7CiAgICB9CgogICAgLyoqCiAgICAgKiByZXR1cm4ganMgdG8gc2V0IG9ubG9hZCBmdW5jdGlvbgogICAgICovCiAgICBmdW5jdGlvbiBnZXRPbkxvYWQoKSB7CiAgICAgICAgcmV0dXJuICc8c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04Ij53aW5kb3cub25sb2FkPW9uTG9hZDs8L3NjcmlwdD4nOyAgICAgICAgICAgICAgICAgICAgICAgCiAgICB9CgogICAgLyoqCiAgICAgKiBwcmludCBtYXAgamF2YXNjcmlwdCAocHV0IGp1c3QgYmVmb3JlIDwvYm9keT4sIG9yIGluIDxoZWFkZXI+IGlmIHVzaW5nIG9uTG9hZCgpKQogICAgICogCiAgICAgKi8KICAgIGZ1bmN0aW9uIHByaW50TWFwSlMoKSB7CiAgICAgICAgZWNobyAkdGhpcy0+Z2V0TWFwSlMoKTsKICAgIH0gICAgCgogICAgLyoqCiAgICAgKiByZXR1cm4gbWFwIGphdmFzY3JpcHQKICAgICAqIAogICAgICovCiAgICBmdW5jdGlvbiBnZXRNYXBKUygpIHsKICAgICAgICAkX291dHB1dCA9ICc8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgY2hhcnNldD0idXRmLTgiPicgLiAiXG4iOwogICAgICAgICRfb3V0cHV0IC49ICcvLzwhW0NEQVRBWycgLiAiXG4iOwogICAgICAgICRfb3V0cHV0IC49ICIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuIjsKICAgICAgICAkX291dHB1dCAuPSAiICogQ3JlYXRlZCB3aXRoIEdvb2dsZU1hcEFQSSAiIC4gJHRoaXMtPl92ZXJzaW9uIC4gIlxuIjsKICAgICAgICAkX291dHB1dCAuPSAiICogQXV0aG9yOiBNb250ZSBPaHJ0IDxtb250ZSBBVCBvaHJ0IERPVCBjb20+XG4iOwogICAgICAgICRfb3V0cHV0IC49ICIgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IE5ldyBEaWdpdGFsIEdyb3VwXG4iOwogICAgICAgICRfb3V0cHV0IC49ICIgKiBodHRwOi8vd3d3LnBocGluc2lkZXIuY29tL3BocC9jb2RlL0dvb2dsZU1hcEFQSS9cbiI7CiAgICAgICAgJF9vdXRwdXQgLj0gIiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuIjsKCiAgICAgICAgJF9vdXRwdXQgLj0gJ3ZhciBwb2ludHMgPSBbXTsnIC4gIlxuIjsKICAgICAgICAkX291dHB1dCAuPSAndmFyIG1hcmtlcnMgPSBbXTsnIC4gIlxuIjsKICAgICAgICAkX291dHB1dCAuPSAndmFyIGNvdW50ZXIgPSAwOycgLiAiXG4iOwogICAgICAgIGlmKCR0aGlzLT5zaWRlYmFyKSB7ICAgICAgICAKICAgICAgICAgICAgJF9vdXRwdXQgLj0gJ3ZhciBzaWRlYmFyX2h0bWwgPSAiIjsnIC4gIlxuIjsKICAgICAgICAgICAgJF9vdXRwdXQgLj0gJ3ZhciBtYXJrZXJfaHRtbCA9IFtdOycgLiAiXG4iOwogICAgICAgIH0KCiAgICAgICAgaWYoJHRoaXMtPmRpcmVjdGlvbnMpIHsgICAgICAgIAogICAgICAgICAgICAkX291dHB1dCAuPSAndmFyIHRvX2h0bWxzID0gW107JyAuICJcbiI7CiAgICAgICAgICAgICRfb3V0cHV0IC49ICd2YXIgZnJvbV9odG1scyA9IFtdOycgLiAiXG4iOwogICAgICAgIH0gICAgICAgIAoKICAgICAgICBpZighZW1wdHkoJHRoaXMtPl9pY29ucykpIHsKICAgICAgICAgICAgJF9vdXRwdXQgLj0gJ3ZhciBpY29uID0gW107JyAuICJcbiI7CiAgICAgICAgICAgIGZvcigkaSA9IDAsICRqID0gY291bnQoJHRoaXMtPl9pY29ucyk7ICRpPCRqOyAkaSsrKSB7CiAgICAgICAgICAgICAgICAkaW5mbyA9ICR0aGlzLT5faWNvbnNbJGldOwoKICAgICAgICAgICAgICAgIC8vIGhhc2ggdGhlIGljb24gZGF0YSB0byBzZWUgaWYgd2UndmUgYWxyZWFkeSBnb3QgdGhpcyBvbmU7IGlmIHNvLCBzYXZlIHNvbWUgamF2YXNjcmlwdAogICAgICAgICAgICAgICAgJGljb25fa2V5ID0gbWQ1KHNlcmlhbGl6ZSgkaW5mbykpOwogICAgICAgICAgICAgICAgaWYoIWlzc2V0KCRleGlzdF9pY25bJGljb25fa2V5XSkpIHsKCiAgICAgICAgICAgICAgICAgICAgJF9vdXRwdXQgLj0gImljb25bJGldID0gbmV3IEdJY29uKCk7XG4iOyAgIAogICAgICAgICAgICAgICAgICAgICRfb3V0cHV0IC49IHNwcmludGYoJ2ljb25bJXNdLmltYWdlID0gIiVzIjsnLCRpLCRpbmZvWydpbWFnZSddKSAuICJcbiI7ICAgCiAgICAgICAgICAgICAgICAgICAgaWYoJGluZm9bJ3NoYWRvdyddKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRfb3V0cHV0IC49IHNwcmludGYoJ2ljb25bJXNdLnNoYWRvdyA9ICIlcyI7JywkaSwkaW5mb1snc2hhZG93J10pIC4gIlxuIjsKICAgICAgICAgICAgICAgICAgICAgICAgJF9vdXRwdXQgLj0gc3ByaW50ZignaWNvblslc10uc2hhZG93U2l6ZSA9IG5ldyBHU2l6ZSglcywlcyk7JywkaSwkaW5mb1snc2hhZG93V2lkdGgnXSwkaW5mb1snc2hhZG93SGVpZ2h0J10pIC4gIlxuIjsgICAKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgJF9vdXRwdXQgLj0gc3ByaW50ZignaWNvblslc10uaWNvblNpemUgPSBuZXcgR1NpemUoJXMsJXMpOycsJGksJGluZm9bJ2ljb25XaWR0aCddLCRpbmZvWydpY29uSGVpZ2h0J10pIC4gIlxuIjsgICAKICAgICAgICAgICAgICAgICAgICAkX291dHB1dCAuPSBzcHJpbnRmKCdpY29uWyVzXS5pY29uQW5jaG9yID0gbmV3IEdQb2ludCglcywlcyk7JywkaSwkaW5mb1snaWNvbkFuY2hvclgnXSwkaW5mb1snaWNvbkFuY2hvclknXSkgLiAiXG4iOyAgIAogICAgICAgICAgICAgICAgICAgICRfb3V0cHV0IC49IHNwcmludGYoJ2ljb25bJXNdLmluZm9XaW5kb3dBbmNob3IgPSBuZXcgR1BvaW50KCVzLCVzKTsnLCRpLCRpbmZvWydpbmZvV2luZG93QW5jaG9yWCddLCRpbmZvWydpbmZvV2luZG93QW5jaG9yWSddKSAuICJcbiI7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICRfb3V0cHV0IC49ICJpY29uWyRpXSA9IGljb25bJGV4aXN0X2ljblskaWNvbl9rZXldXTtcbiI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICRfb3V0cHV0IC49ICd2YXIgbWFwID0gbnVsbDsnIC4gIlxuIjsKICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgaWYoJHRoaXMtPm9ubG9hZCkgewogICAgICAgICAgICRfb3V0cHV0IC49ICdmdW5jdGlvbiBvbkxvYWQoKSB7JyAuICJcbiI7ICAgCiAgICAgICAgfQogICAgICAgICAgICAgICAgCiAgICAgICAgaWYoIWVtcHR5KCR0aGlzLT5icm93c2VyX2FsZXJ0KSkgewogICAgICAgICAgICAkX291dHB1dCAuPSAnaWYgKEdCcm93c2VySXNDb21wYXRpYmxlKCkpIHsnIC4gIlxuIjsKICAgICAgICB9CgogICAgICAgICRfb3V0cHV0IC49IHNwcmludGYoJ3ZhciBtYXBPYmogPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiJXMiKTsnLCR0aGlzLT5tYXBfaWQpIC4gIlxuIjsKICAgICAgICAkX291dHB1dCAuPSAnaWYgKG1hcE9iaiAhPSAidW5kZWZpbmVkIiAmJiBtYXBPYmogIT0gbnVsbCkgeycgLiAiXG4iOwogICAgICAgICRfb3V0cHV0IC49IHNwcmludGYoJ21hcCA9IG5ldyBHTWFwMihkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiJXMiKSk7JywkdGhpcy0+bWFwX2lkKSAuICJcbiI7CgogICAgICAgIGlmKGlzc2V0KCR0aGlzLT5jZW50ZXJfbGF0KSAmJiBpc3NldCgkdGhpcy0+Y2VudGVyX2xvbikpIHsKCQkJLy8gU3BlY2lhbCBjYXJlIGZvciBkZWNpbWFsIHBvaW50IGluIGxvbiBhbmQgbGF0LCB3b3VsZCBnZXQgbG9zdCBpZiAid3JvbmciIGxvY2FsZSBpcyBzZXQ7IGFwcGxpZXMgdG8gKHMpcHJpbnRmIG9ubHkKCQkJJF9vdXRwdXQgLj0gc3ByaW50ZignbWFwLnNldENlbnRlcihuZXcgR0xhdExuZyglcywgJXMpLCAlZCwgJXMpOycsIG51bWJlcl9mb3JtYXQoJHRoaXMtPmNlbnRlcl9sYXQsIDYsICIuIiwgIiIpLCBudW1iZXJfZm9ybWF0KCR0aGlzLT5jZW50ZXJfbG9uLCA2LCAiLiIsICIiKSwgJHRoaXMtPnpvb20sICR0aGlzLT5tYXBfdHlwZSkgLiAiXG4iOwogICAgICAgIH0KICAgICAgICAKICAgICAgICAvLyB6b29tIHNvIHRoYXQgYWxsIG1hcmtlcnMgYXJlIGluIHRoZSB2aWV3cG9ydAogICAgICAgIGlmKCR0aGlzLT56b29tX2VuY29tcGFzcyAmJiBjb3VudCgkdGhpcy0+X21hcmtlcnMpID4gMSkgewogICAgICAgICAgICAvLyBpbmNyZWFzZSBib3VuZHMgYnkgZnVkZ2UgZmFjdG9yIHRvIGtlZXAKICAgICAgICAgICAgLy8gbWFya2VycyBhd2F5IGZyb20gdGhlIGVkZ2VzCiAgICAgICAgICAgICRfbGVuX2xvbiA9ICR0aGlzLT5fbWF4X2xvbiAtICR0aGlzLT5fbWluX2xvbjsKICAgICAgICAgICAgJF9sZW5fbGF0ID0gJHRoaXMtPl9tYXhfbGF0IC0gJHRoaXMtPl9taW5fbGF0OwogICAgICAgICAgICAkdGhpcy0+X21pbl9sb24gLT0gJF9sZW5fbG9uICogJHRoaXMtPmJvdW5kc19mdWRnZTsKICAgICAgICAgICAgJHRoaXMtPl9tYXhfbG9uICs9ICRfbGVuX2xvbiAqICR0aGlzLT5ib3VuZHNfZnVkZ2U7CiAgICAgICAgICAgICR0aGlzLT5fbWluX2xhdCAtPSAkX2xlbl9sYXQgKiAkdGhpcy0+Ym91bmRzX2Z1ZGdlOwogICAgICAgICAgICAkdGhpcy0+X21heF9sYXQgKz0gJF9sZW5fbGF0ICogJHRoaXMtPmJvdW5kc19mdWRnZTsKCiAgICAgICAgICAgICRfb3V0cHV0IC49ICJ2YXIgYmRzID0gbmV3IEdMYXRMbmdCb3VuZHMobmV3IEdMYXRMbmcoJHRoaXMtPl9taW5fbGF0LCAkdGhpcy0+X21pbl9sb24pLCBuZXcgR0xhdExuZygkdGhpcy0+X21heF9sYXQsICR0aGlzLT5fbWF4X2xvbikpO1xuIjsKICAgICAgICAgICAgJF9vdXRwdXQgLj0gJ21hcC5zZXRab29tKG1hcC5nZXRCb3VuZHNab29tTGV2ZWwoYmRzKSk7JyAuICJcbiI7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmKCR0aGlzLT5tYXBfY29udHJvbHMpIHsKICAgICAgICAgIGlmKCR0aGlzLT5jb250cm9sX3NpemUgPT0gJ2xhcmdlJykKICAgICAgICAgICAgICAkX291dHB1dCAuPSAnbWFwLmFkZENvbnRyb2wobmV3IEdMYXJnZU1hcENvbnRyb2woKSk7JyAuICJcbiI7CiAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgJF9vdXRwdXQgLj0gJ21hcC5hZGRDb250cm9sKG5ldyBHU21hbGxNYXBDb250cm9sKCkpOycgLiAiXG4iOwogICAgICAgIH0KICAgICAgICBpZigkdGhpcy0+dHlwZV9jb250cm9scykgewogICAgICAgICAgICAkX291dHB1dCAuPSAnbWFwLmFkZENvbnRyb2wobmV3IEdNYXBUeXBlQ29udHJvbCgpKTsnIC4gIlxuIjsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYoJHRoaXMtPnNjYWxlX2NvbnRyb2wpIHsKICAgICAgICAgICAgJF9vdXRwdXQgLj0gJ21hcC5hZGRDb250cm9sKG5ldyBHU2NhbGVDb250cm9sKCkpOycgLiAiXG4iOwogICAgICAgIH0KCiAgICAgICAgaWYoJHRoaXMtPm92ZXJ2aWV3X2NvbnRyb2wpIHsKICAgICAgICAgICAgJF9vdXRwdXQgLj0gJ21hcC5hZGRDb250cm9sKG5ldyBHT3ZlcnZpZXdNYXBDb250cm9sKCkpOycgLiAiXG4iOwogICAgICAgIH0KCiAgICAgICAgJF9vdXRwdXQgLj0gJHRoaXMtPmdldEFkZE1hcmtlcnNKUygpOwoKICAgICAgICAkX291dHB1dCAuPSAkdGhpcy0+Z2V0UG9seWxpbmVKUygpOwoKICAgICAgICBpZigkdGhpcy0+c2lkZWJhcikgewogICAgICAgICAgICAkX291dHB1dCAuPSBzcHJpbnRmKCdkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiJXMiKS5pbm5lckhUTUwgPSAiPHVsIGNsYXNzPVwiZ21hcFNpZGViYXJcIj4iKyBzaWRlYmFyX2h0bWwgKyI8XC91bD4iOycsICR0aGlzLT5zaWRlYmFyX2lkKSAuICJcbiI7CiAgICAgICAgfQoKICAgICAgICAkX291dHB1dCAuPSAnfScgLiAiXG4iOyAgICAgICAgCiAgICAgICAKICAgICAgICBpZighZW1wdHkoJHRoaXMtPmJyb3dzZXJfYWxlcnQpKSB7CiAgICAgICAgICAgICRfb3V0cHV0IC49ICd9IGVsc2UgeycgLiAiXG4iOwoJCQkkX291dHB1dCAuPSAnYWxlcnQoIicgLiBzdHJfcmVwbGFjZSgnIicsJ1wiJywkdGhpcy0+YnJvd3Nlcl9hbGVydCkgLiAnIik7JyAuICJcbiI7CiAgICAgICAgICAgICRfb3V0cHV0IC49ICd9JyAuICJcbiI7CiAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgIAoKICAgICAgICBpZigkdGhpcy0+b25sb2FkKSB7CiAgICAgICAgICAgJF9vdXRwdXQgLj0gJ30nIC4gIlxuIjsKICAgICAgICB9CgogICAgICAgICRfb3V0cHV0IC49ICR0aGlzLT5nZXRDcmVhdGVNYXJrZXJKUygpOwoKICAgICAgICAvLyBVdGlsaXR5IGZ1bmN0aW9ucyB1c2VkIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gdGFiYmVkIGFuZCBub24tdGFiYmVkIGluZm8gd2luZG93cwogICAgICAgICRfb3V0cHV0IC49ICdmdW5jdGlvbiBpc0FycmF5KGEpIHtyZXR1cm4gaXNPYmplY3QoYSkgJiYgYS5jb25zdHJ1Y3RvciA9PSBBcnJheTt9JyAuICJcbiI7CiAgICAgICAgJF9vdXRwdXQgLj0gJ2Z1bmN0aW9uIGlzT2JqZWN0KGEpIHtyZXR1cm4gKGEgJiYgdHlwZW9mIGEgPT0gXCdvYmplY3RcJykgfHwgaXNGdW5jdGlvbihhKTt9JyAuICJcbiI7CiAgICAgICAgJF9vdXRwdXQgLj0gJ2Z1bmN0aW9uIGlzRnVuY3Rpb24oYSkge3JldHVybiB0eXBlb2YgYSA9PSBcJ2Z1bmN0aW9uXCc7fScgLiAiXG4iOwoKICAgICAgICBpZigkdGhpcy0+c2lkZWJhcikgeyAgICAgICAgCiAgICAgICAgICAgICRfb3V0cHV0IC49ICdmdW5jdGlvbiBjbGlja19zaWRlYmFyKGlkeCkgeycgLiAiXG4iOwogICAgICAgICAgICAkX291dHB1dCAuPSAnICBpZihpc0FycmF5KG1hcmtlcl9odG1sW2lkeF0pKSB7IG1hcmtlcnNbaWR4XS5vcGVuSW5mb1dpbmRvd1RhYnNIdG1sKG1hcmtlcl9odG1sW2lkeF0pOyB9JyAuICJcbiI7CiAgICAgICAgICAgICRfb3V0cHV0IC49ICcgIGVsc2UgeyBtYXJrZXJzW2lkeF0ub3BlbkluZm9XaW5kb3dIdG1sKG1hcmtlcl9odG1sW2lkeF0pOyB9JyAuICJcbiI7CiAgICAgICAgICAgICRfb3V0cHV0IC49ICd9JyAuICJcbiI7CiAgICAgICAgfQogICAgICAgICRfb3V0cHV0IC49ICdmdW5jdGlvbiBzaG93SW5mb1dpbmRvdyhpZHgsaHRtbCkgeycgLiAiXG4iOwogICAgICAgICRfb3V0cHV0IC49ICdtYXAuY2VudGVyQXRMYXRMbmcocG9pbnRzW2lkeF0pOycgLiAiXG4iOwogICAgICAgICRfb3V0cHV0IC49ICdtYXJrZXJzW2lkeF0ub3BlbkluZm9XaW5kb3dIdG1sKGh0bWwpOycgLiAiXG4iOwogICAgICAgICRfb3V0cHV0IC49ICd9JyAuICJcbiI7CiAgICAgICAgaWYoJHRoaXMtPmRpcmVjdGlvbnMpIHsKICAgICAgICAgICAgJF9vdXRwdXQgLj0gJ2Z1bmN0aW9uIHRvaGVyZShpZHgpIHsnIC4gIlxuIjsKICAgICAgICAgICAgJF9vdXRwdXQgLj0gJ21hcmtlcnNbaWR4XS5vcGVuSW5mb1dpbmRvd0h0bWwodG9faHRtbHNbaWR4XSk7JyAuICJcbiI7CiAgICAgICAgICAgICRfb3V0cHV0IC49ICd9JyAuICJcbiI7CiAgICAgICAgICAgICRfb3V0cHV0IC49ICdmdW5jdGlvbiBmcm9taGVyZShpZHgpIHsnIC4gIlxuIjsKICAgICAgICAgICAgJF9vdXRwdXQgLj0gJ21hcmtlcnNbaWR4XS5vcGVuSW5mb1dpbmRvd0h0bWwoZnJvbV9odG1sc1tpZHhdKTsnIC4gIlxuIjsKICAgICAgICAgICAgJF9vdXRwdXQgLj0gJ30nIC4gIlxuIjsKICAgICAgICB9CgogICAgICAgICRfb3V0cHV0IC49ICcvL11dPicgLiAiXG4iOwogICAgICAgICRfb3V0cHV0IC49ICc8L3NjcmlwdD4nIC4gIlxuIjsKICAgICAgICByZXR1cm4gJF9vdXRwdXQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBvdmVycmlkYWJsZSBmdW5jdGlvbiBmb3IgZ2VuZXJhdGluZyBqcyB0byBhZGQgbWFya2VycwogICAgICovCiAgICBmdW5jdGlvbiBnZXRBZGRNYXJrZXJzSlMoKSB7CiAgICAgICAgJFNJTkdMRV9UQUJfV0lEVEggPSA4ODsgICAgLy8gY29uc3RhbnQ6IHdpZHRoIGluIHBpeGVscyBvZiBlYWNoIHRhYiBoZWFkaW5nIChzZXQgYnkgZ29vZ2xlKQogICAgICAgICRpID0gMDsKICAgICAgICAkX291dHB1dCA9ICcnOwogICAgICAgIGZvcmVhY2goJHRoaXMtPl9tYXJrZXJzIGFzICRfbWFya2VyKSB7CiAgICAgICAgICAgIGlmKGlzX2FycmF5KCRfbWFya2VyWydodG1sJ10pKSB7CiAgICAgICAgICAgICAgICAvLyB3YXJuaW5nOiB5b3UgY2FuJ3QgaGF2ZSB0d28gdGFicyB3aXRoIHRoZSBzYW1lIGhlYWRlci4gYnV0IHdoeSB3b3VsZCB5b3Ugd2FudCB0bz8KICAgICAgICAgICAgICAgICR0aSA9IDA7CiAgICAgICAgICAgICAgICAkbnVtX3RhYnMgPSBjb3VudCgkX21hcmtlclsnaHRtbCddKTsKICAgICAgICAgICAgICAgICR0YWJfb2JzID0gYXJyYXkoKTsKICAgICAgICAgICAgICAgIGZvcmVhY2goJF9tYXJrZXJbJ2h0bWwnXSBhcyAkdGFiID0+ICRpbmZvKSB7CiAgICAgICAgICAgICAgICAgICAgaWYoJHRpID09IDAgJiYgJG51bV90YWJzID4gMikgewogICAgICAgICAgICAgICAgICAgICAgICAkd2lkdGhfc3R5bGUgPSBzcHJpbnRmKCcgc3R5bGU9XCJ3aWR0aDogJXNweFwiJywgJG51bV90YWJzICogJFNJTkdMRV9UQUJfV0lEVEgpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICR3aWR0aF9zdHlsZSA9ICcnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkdGFiID0gc3RyX3JlcGxhY2UoJyInLCdcIicsJHRhYik7CiAgICAgICAgICAgICAgICAgICAgJGluZm8gPSBzdHJfcmVwbGFjZSgnIicsJ1wiJywkaW5mbyk7CgkJCQkJJGluZm8gPSBzdHJfcmVwbGFjZShhcnJheSgiXG4iLCAiXHIiKSwgIiIsICRpbmZvKTsKICAgICAgICAgICAgICAgICAgICAkdGFiX29ic1tdID0gc3ByaW50ZignbmV3IEdJbmZvV2luZG93VGFiKCIlcyIsICIlcyIpJywgJHRhYiwgJzxkaXYgaWQ9XCJnbWFwbWFya2VyXCInLiR3aWR0aF9zdHlsZS4nPicgLiAkaW5mbyAuICc8L2Rpdj4nKTsKICAgICAgICAgICAgICAgICAgICAkdGkrKzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRpd19odG1sID0gJ1snIC4gam9pbignLCcsJHRhYl9vYnMpIC4gJ10nOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJGl3X2h0bWwgPSBzcHJpbnRmKCciJXMiJyxzdHJfcmVwbGFjZSgnIicsJ1wiJywnPGRpdiBpZD0iZ21hcG1hcmtlciI+JyAuIHN0cl9yZXBsYWNlKGFycmF5KCJcbiIsICJcciIpLCAiIiwgJF9tYXJrZXJbJ2h0bWwnXSkgLiAnPC9kaXY+JykpOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRfb3V0cHV0IC49IHNwcmludGYoJ3ZhciBwb2ludCA9IG5ldyBHTGF0TG5nKCVzLCVzKTsnLCRfbWFya2VyWydsYXQnXSwkX21hcmtlclsnbG9uJ10pIC4gIlxuIjsgICAgICAgICAKICAgICAgICAgICAgJF9vdXRwdXQgLj0gc3ByaW50ZigndmFyIG1hcmtlciA9IGNyZWF0ZU1hcmtlcihwb2ludCwiJXMiLCVzLCAlcywiJXMiKTsnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cl9yZXBsYWNlKCciJywnXCInLCRfbWFya2VyWyd0aXRsZSddKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJfcmVwbGFjZSgnLycsJ1wvJywkaXdfaHRtbCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyX3JlcGxhY2UoJyInLCdcIicsJF9tYXJrZXJbJ3Rvb2x0aXAnXSkpIC4gIlxuIjsKICAgICAgICAgICAgLy9UT0RPOiBpbiBhYm92ZSBjcmVhdGVNYXJrZXIgY2FsbCwgcGFzcyB0aGUgaW5kZXggb2YgdGhlIHRhYiBpbiB3aGljaCB0byBwdXQgZGlyZWN0aW9ucywgaWYgYXBwbGljYWJsZQogICAgICAgICAgICAkX291dHB1dCAuPSAnbWFwLmFkZE92ZXJsYXkobWFya2VyKTsnIC4gIlxuIjsKICAgICAgICAgICAgJGkrKzsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICRfb3V0cHV0OwogICAgfQoKICAgIC8qKgogICAgICogb3ZlcnJpZGFibGUgZnVuY3Rpb24gdG8gZ2VuZXJhdGUgcG9seWxpbmUganMKICAgICAqLwogICAgZnVuY3Rpb24gZ2V0UG9seWxpbmVKUygpIHsKICAgICAgICAkX291dHB1dCA9ICcnOwogICAgICAgIGZvcmVhY2goJHRoaXMtPl9wb2x5bGluZXMgYXMgJF9wb2x5bGluZSkgewogICAgICAgICAgICAkX291dHB1dCAuPSBzcHJpbnRmKCd2YXIgcG9seWxpbmUgPSBuZXcgR1BvbHlsaW5lKFtuZXcgR0xhdExuZyglcywlcyksbmV3IEdMYXRMbmcoJXMsJXMpXSwiJXMiLCVzLCVzKTsnLAogICAgICAgICAgICAgICAgICAgICRfcG9seWxpbmVbJ2xhdDEnXSwkX3BvbHlsaW5lWydsb24xJ10sJF9wb2x5bGluZVsnbGF0MiddLCRfcG9seWxpbmVbJ2xvbjInXSwkX3BvbHlsaW5lWydjb2xvciddLCRfcG9seWxpbmVbJ3dlaWdodCddLCRfcG9seWxpbmVbJ29wYWNpdHknXSAvIDEwMC4wKSAuICJcbiI7CiAgICAgICAgICAgICRfb3V0cHV0IC49ICdtYXAuYWRkT3ZlcmxheShwb2x5bGluZSk7JyAuICJcbiI7CiAgICAgICAgfQogICAgICAgIHJldHVybiAkX291dHB1dDsKICAgIH0KCiAgICAvKioKICAgICAqIG92ZXJyaWRhYmxlIGZ1bmN0aW9uIHRvIGdlbmVyYXRlIHRoZSBqcyBmb3IgdGhlIGpzIGZ1bmN0aW9uIGZvciBjcmVhdGluZyBhIG1hcmtlci4KICAgICAqLwogICAgZnVuY3Rpb24gZ2V0Q3JlYXRlTWFya2VySlMoKSB7CiAgICAgICAgJF9vdXRwdXQgPSAnZnVuY3Rpb24gY3JlYXRlTWFya2VyKHBvaW50LCB0aXRsZSwgaHRtbCwgbiwgdG9vbHRpcCkgeycgLiAiXG4iOwogICAgICAgICRfb3V0cHV0IC49ICdpZihuID49ICcuIHNpemVvZigkdGhpcy0+X2ljb25zKSAuJykgeyBuID0gJy4gKHNpemVvZigkdGhpcy0+X2ljb25zKSAtIDEpIC4iOyB9XG4iOwogICAgICAgIGlmKCFlbXB0eSgkdGhpcy0+X2ljb25zKSkgewogICAgICAgICAgICAkX291dHB1dCAuPSAndmFyIG1hcmtlciA9IG5ldyBHTWFya2VyKHBvaW50LHtcJ2ljb25cJzogaWNvbltuXSwgXCd0aXRsZVwnOiB0b29sdGlwfSk7JyAuICJcbiI7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJF9vdXRwdXQgLj0gJ3ZhciBtYXJrZXIgPSBuZXcgR01hcmtlcihwb2ludCx7XCd0aXRsZVwnOiB0b29sdGlwfSk7JyAuICJcbiI7CiAgICAgICAgfQogICAgICAgIC8vIFRPRE86IG1ha2UgaXQgc28geW91IGNhbiBzcGVjaWZ5IHdoaWNoIHRhYiB5b3Ugd2FudCB0aGUgZGlyZWN0aW9ucyBpbi4KICAgICAgICBpZigkdGhpcy0+ZGlyZWN0aW9ucykgewogICAgICAgICAgICAvLyBXQVJOSU5HOiBJZiB5b3UgYXJlIHVzaW5nIGEgdGFiYmVkIGluZm8gd2luZG93IEFORCBkaXJlY3Rpb25zOiB0aGlzIHVzZXMgYW4gVU5ET0NVTUVOVEVEIGZpZWxkCiAgICAgICAgICAgIC8vIG9mIHRoZSBHSW5mb1dpbmRvd1RhYiBvYmplY3QsIGNvbnRlbnRFbGVtLiBHb29nbGUgbWF5IENIQU5HRSB0aGlzIG5hbWUgb3Igb3RoZXIgYXNwZWN0cyBvZiB0aGVpcgogICAgICAgICAgICAvLyBHSW5mb1dpbmRvd1RhYiBpbXBsZW1lbnRhdGlvbiB3aXRob3V0IHdhcm5pbmcgYW5kIEJSRUFLIHRoaXMgY29kZS4KICAgICAgICAgICAgLy8gTk9URTogSWYgeW91IGFyZSBOT1QgdXNpbmcgYSB0YWJiZWQgaW5mbyB3aW5kb3csIHlvdSdsbCBiZSBmaW5lLgogICAgICAgICAgICAkX291dHB1dCAuPSAndmFyIHRhYkZsYWcgPSBpc0FycmF5KGh0bWwpOycgLiAiXG4iOwogICAgICAgICAgICAkX291dHB1dCAuPSAnaWYoIXRhYkZsYWcpIHsgaHRtbCA9IFt7ImNvbnRlbnRFbGVtIjogaHRtbH1dOyB9JyAuICJcbiI7CiAgICAgICAgICAgICRfb3V0cHV0IC49IHNwcmludGYoCiAgICAgICAgICAgICAgICAgICAgICJ0b19odG1sc1tjb3VudGVyXSA9IGh0bWxbMF0uY29udGVudEVsZW0gKyAnPHAgLz48Zm9ybSBjbGFzcz1cImdtYXBEaXJcIiBpZD1cImdtYXBEaXJUb1wiIHN0eWxlPVwid2hpdGUtc3BhY2U6IG5vd3JhcDtcIiBhY3Rpb249XCJodHRwOi8vbWFwcy5nb29nbGUuY29tL21hcHNcIiBtZXRob2Q9XCJnZXRcIiB0YXJnZXQ9XCJfYmxhbmtcIj4nICsKICAgICAgICAgICAgICAgICAgICAgJzxzcGFuIGNsYXNzPVwiZ21hcERpckhlYWRcIiBpZD1cImdtYXBEaXJIZWFkVG9cIj4lczxzdHJvbmc+JXM8L3N0cm9uZz4gLSA8YSBocmVmPVwiamF2YXNjcmlwdDpmcm9taGVyZSgnICsgY291bnRlciArICcpXCI+JXM8L2E+PC9zcGFuPicgKwogICAgICAgICAgICAgICAgICAgICAnPHAgY2xhc3M9XCJnbWFwRGlySXRlbVwiIGlkPVwiZ21hcERpckl0ZW1Ub1wiPjxsYWJlbCBmb3I9XCJnbWFwRGlyU2FkZHJcIiBjbGFzcz1cImdtYXBEaXJMYWJlbFwiIGlkPVwiZ21hcERpckxhYmVsVG9cIj4lczxiciAvPjwvbGFiZWw+JyArCiAgICAgICAgICAgICAgICAgICAgICc8aW5wdXQgdHlwZT1cInRleHRcIiBzaXplPVwiNDBcIiBtYXhsZW5ndGg9XCI0MFwiIG5hbWU9XCJzYWRkclwiIGNsYXNzPVwiZ21hcFRleHRCb3hcIiBpZD1cImdtYXBEaXJTYWRkclwiIHZhbHVlPVwiXCIgb25mb2N1cz1cInRoaXMuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gXCcjZTBlMGUwXCc7XCIgb25ibHVyPVwidGhpcy5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBcJyNmZmZmZmZcJztcIiAvPicgKwogICAgICAgICAgICAgICAgICAgICAnPHNwYW4gY2xhc3M9XCJnbWFwRGlyQnRuc1wiIGlkPVwiZ21hcERpckJ0bnNUb1wiPjxpbnB1dCB2YWx1ZT1cIiVzXCIgdHlwZT1cIiVzXCIgY2xhc3M9XCJnbWFwRGlyQnV0dG9uXCIgaWQ9XCJnbWFwRGlyQnV0dG9uVG9cIiAvPjwvc3Bhbj48L3A+JyArCiAgICAgICAgICAgICAgICAgICAgICc8aW5wdXQgdHlwZT1cImhpZGRlblwiIG5hbWU9XCJkYWRkclwiIHZhbHVlPVwiJyArCiAgICAgICAgICAgICAgICAgICAgIHBvaW50LnkgKyAnLCcgKyBwb2ludC54ICsgXCIoXCIgKyB0aXRsZS5yZXBsYWNlKG5ldyBSZWdFeHAoL1wiL2cpLCcmcXVvdDsnKSArIFwiKVwiICsgJ1wiIC8+PC9mb3JtPic7CiAgICAgICAgICAgICAgICAgICAgICBmcm9tX2h0bWxzW2NvdW50ZXJdID0gaHRtbFswXS5jb250ZW50RWxlbSArICc8cCAvPjxmb3JtIGNsYXNzPVwiZ21hcERpclwiIGlkPVwiZ21hcERpckZyb21cIiBzdHlsZT1cIndoaXRlLXNwYWNlOiBub3dyYXA7XCIgYWN0aW9uPVwiaHR0cDovL21hcHMuZ29vZ2xlLmNvbS9tYXBzXCIgbWV0aG9kPVwiZ2V0XCIgdGFyZ2V0PVwiX2JsYW5rXCI+JyArCiAgICAgICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz1cImdtYXBEaXJIZWFkXCIgaWQ9XCJnbWFwRGlySGVhZEZyb21cIj4lczxhIGhyZWY9XCJqYXZhc2NyaXB0OnRvaGVyZSgnICsgY291bnRlciArICcpXCI+JXM8L2E+IC0gPHN0cm9uZz4lczwvc3Ryb25nPjwvc3Bhbj4nICsKICAgICAgICAgICAgICAgICAgICAgJzxwIGNsYXNzPVwiZ21hcERpckl0ZW1cIiBpZD1cImdtYXBEaXJJdGVtRnJvbVwiPjxsYWJlbCBmb3I9XCJnbWFwRGlyU2FkZHJcIiBjbGFzcz1cImdtYXBEaXJMYWJlbFwiIGlkPVwiZ21hcERpckxhYmVsRnJvbVwiPiVzPGJyIC8+PC9sYWJlbD4nICsKICAgICAgICAgICAgICAgICAgICAgJzxpbnB1dCB0eXBlPVwidGV4dFwiIHNpemU9XCI0MFwiIG1heGxlbmd0aD1cIjQwXCIgbmFtZT1cInNhZGRyXCIgY2xhc3M9XCJnbWFwVGV4dEJveFwiIGlkPVwiZ21hcERpclNhZGRyXCIgdmFsdWU9XCJcIiBvbmZvY3VzPVwidGhpcy5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBcJyNlMGUwZTBcJztcIiBvbmJsdXI9XCJ0aGlzLnN0eWxlLmJhY2tncm91bmRDb2xvciA9IFwnI2ZmZmZmZlwnO1wiIC8+JyArCiAgICAgICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz1cImdtYXBEaXJCdG5zXCIgaWQ9XCJnbWFwRGlyQnRuc0Zyb21cIj48aW5wdXQgdmFsdWU9XCIlc1wiIHR5cGU9XCIlc1wiIGNsYXNzPVwiZ21hcERpckJ1dHRvblwiIGlkPVwiZ21hcERpckJ1dHRvbkZyb21cIiAvPjwvc3Bhbj48L3AnICsKICAgICAgICAgICAgICAgICAgICAgJzxpbnB1dCB0eXBlPVwiaGlkZGVuXCIgbmFtZT1cImRhZGRyXCIgdmFsdWU9XCInICsKICAgICAgICAgICAgICAgICAgICAgcG9pbnQueSArICcsJyArIHBvaW50LnggKyBcIihcIiArIHRpdGxlLnJlcGxhY2UobmV3IFJlZ0V4cCgvXCIvZyksJyZxdW90OycpICsgXCIpXCIgKyAnXCIgLz48L2Zvcm0+JzsKICAgICAgICAgICAgICAgICAgICAgaHRtbFswXS5jb250ZW50RWxlbSA9IGh0bWxbMF0uY29udGVudEVsZW0gKyAnPHAgLz48ZGl2IGlkPVwiZ21hcERpckhlYWRcIiBjbGFzcz1cImdtYXBEaXJcIiBzdHlsZT1cIndoaXRlLXNwYWNlOiBub3dyYXA7XCI+JXM8YSBocmVmPVwiamF2YXNjcmlwdDp0b2hlcmUoJyArIGNvdW50ZXIgKyAnKVwiPiVzPC9hPiAtIDxhIGhyZWY9XCJqYXZhc2NyaXB0OmZyb21oZXJlKCcgKyBjb3VudGVyICsgJylcIj4lczwvYT48L2Rpdj4nO1xuIiwKICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmRyaXZpbmdfZGlyX3RleHRbJ2Rpcl90ZXh0J10sCiAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5kcml2aW5nX2Rpcl90ZXh0WydkaXJfdG9oZXJlJ10sCiAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5kcml2aW5nX2Rpcl90ZXh0WydkaXJfZnJvbWhlcmUnXSwKICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmRyaXZpbmdfZGlyX3RleHRbJ2Rpcl90byddLAogICAgICAgICAgICAgICAgICAgICAkdGhpcy0+ZHJpdmluZ19kaXJfdGV4dFsndG9fYnV0dG9uX3ZhbHVlJ10sCiAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5kcml2aW5nX2Rpcl90ZXh0Wyd0b19idXR0b25fdHlwZSddLAogICAgICAgICAgICAgICAgICAgICAkdGhpcy0+ZHJpdmluZ19kaXJfdGV4dFsnZGlyX3RleHQnXSwKICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmRyaXZpbmdfZGlyX3RleHRbJ2Rpcl90b2hlcmUnXSwKICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmRyaXZpbmdfZGlyX3RleHRbJ2Rpcl9mcm9taGVyZSddLAogICAgICAgICAgICAgICAgICAgICAkdGhpcy0+ZHJpdmluZ19kaXJfdGV4dFsnZGlyX2Zyb20nXSwKICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmRyaXZpbmdfZGlyX3RleHRbJ2Zyb21fYnV0dG9uX3ZhbHVlJ10sCiAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5kcml2aW5nX2Rpcl90ZXh0Wydmcm9tX2J1dHRvbl90eXBlJ10sCiAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5kcml2aW5nX2Rpcl90ZXh0WydkaXJfdGV4dCddLAogICAgICAgICAgICAgICAgICAgICAkdGhpcy0+ZHJpdmluZ19kaXJfdGV4dFsnZGlyX3RvaGVyZSddLAogICAgICAgICAgICAgICAgICAgICAkdGhpcy0+ZHJpdmluZ19kaXJfdGV4dFsnZGlyX2Zyb21oZXJlJ10KICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAkX291dHB1dCAuPSAnaWYoIXRhYkZsYWcpIHsgaHRtbCA9IGh0bWxbMF0uY29udGVudEVsZW07IH0nOwogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZigkdGhpcy0+aW5mb193aW5kb3cpIHsKICAgICAgICAgICAgJF9vdXRwdXQgLj0gc3ByaW50ZignaWYoaXNBcnJheShodG1sKSkgeyBHRXZlbnQuYWRkTGlzdGVuZXIobWFya2VyLCAiJXMiLCBmdW5jdGlvbigpIHsgbWFya2VyLm9wZW5JbmZvV2luZG93VGFic0h0bWwoaHRtbCk7IH0pOyB9JywkdGhpcy0+d2luZG93X3RyaWdnZXIpIC4gIlxuIjsKICAgICAgICAgICAgJF9vdXRwdXQgLj0gc3ByaW50ZignZWxzZSB7IEdFdmVudC5hZGRMaXN0ZW5lcihtYXJrZXIsICIlcyIsIGZ1bmN0aW9uKCkgeyBtYXJrZXIub3BlbkluZm9XaW5kb3dIdG1sKGh0bWwpOyB9KTsgfScsJHRoaXMtPndpbmRvd190cmlnZ2VyKSAuICJcbiI7CiAgICAgICAgfQogICAgICAgICRfb3V0cHV0IC49ICdwb2ludHNbY291bnRlcl0gPSBwb2ludDsnIC4gIlxuIjsKICAgICAgICAkX291dHB1dCAuPSAnbWFya2Vyc1tjb3VudGVyXSA9IG1hcmtlcjsnIC4gIlxuIjsKICAgICAgICBpZigkdGhpcy0+c2lkZWJhcikgeyAgICAgICAgCiAgICAgICAgICAgICRfb3V0cHV0IC49ICdtYXJrZXJfaHRtbFtjb3VudGVyXSA9IGh0bWw7JyAuICJcbiI7CiAgICAgICAgICAgICRfb3V0cHV0IC49ICJzaWRlYmFyX2h0bWwgKz0gJzxsaSBjbGFzcz1cImdtYXBTaWRlYmFySXRlbVwiIGlkPVwiZ21hcFNpZGViYXJJdGVtXycrIGNvdW50ZXIgKydcIj48YSBocmVmPVwiamF2YXNjcmlwdDpjbGlja19zaWRlYmFyKCcgKyBjb3VudGVyICsgJylcIj4nICsgdGl0bGUgKyAnPFwvYT48XC9saT4nOyIgLiAiXG4iOwogICAgICAgIH0KICAgICAgICAkX291dHB1dCAuPSAnY291bnRlcisrOycgLiAiXG4iOwogICAgICAgICRfb3V0cHV0IC49ICdyZXR1cm4gbWFya2VyOycgLiAiXG4iOwogICAgICAgICRfb3V0cHV0IC49ICd9JyAuICJcbiI7CiAgICAgICAgcmV0dXJuICRfb3V0cHV0OwogICAgfQoKICAgIC8qKgogICAgICogcHJpbnQgbWFwIChwdXQgYXQgbG9jYXRpb24gbWFwIHdpbGwgYXBwZWFyKQogICAgICogCiAgICAgKi8KICAgIGZ1bmN0aW9uIHByaW50TWFwKCkgewogICAgICAgIGVjaG8gJHRoaXMtPmdldE1hcCgpOwogICAgfQoKICAgIC8qKgogICAgICogcmV0dXJuIG1hcAogICAgICogCiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldE1hcCgpIHsKICAgICAgICAkX291dHB1dCA9ICc8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgY2hhcnNldD0idXRmLTgiPicgLiAiXG4iIC4gJy8vPCFbQ0RBVEFbJyAuICJcbiI7CiAgICAgICAgJF9vdXRwdXQgLj0gJ2lmIChHQnJvd3NlcklzQ29tcGF0aWJsZSgpKSB7JyAuICJcbiI7CiAgICAgICAgaWYoc3RybGVuKCR0aGlzLT53aWR0aCkgPiAwICYmIHN0cmxlbigkdGhpcy0+aGVpZ2h0KSA+IDApIHsKICAgICAgICAgICAgJF9vdXRwdXQgLj0gc3ByaW50ZignZG9jdW1lbnQud3JpdGUoXCc8ZGl2IGlkPSIlcyIgc3R5bGU9IndpZHRoOiAlczsgaGVpZ2h0OiAlcyI+PFwvZGl2PlwnKTsnLCR0aGlzLT5tYXBfaWQsJHRoaXMtPndpZHRoLCR0aGlzLT5oZWlnaHQpIC4gIlxuIjsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkX291dHB1dCAuPSBzcHJpbnRmKCdkb2N1bWVudC53cml0ZShcJzxkaXYgaWQ9IiVzIj48XC9kaXY+XCcpOycsJHRoaXMtPm1hcF9pZCkgLiAiXG4iOyAgICAgCiAgICAgICAgfQogICAgICAgICRfb3V0cHV0IC49ICd9JzsKCiAgICAgICAgaWYoIWVtcHR5KCR0aGlzLT5qc19hbGVydCkpIHsKICAgICAgICAgICAgJF9vdXRwdXQgLj0gJyBlbHNlIHsnIC4gIlxuIjsKICAgICAgICAgICAgJF9vdXRwdXQgLj0gc3ByaW50ZignZG9jdW1lbnQud3JpdGUoXCclc1wnKTsnLCBzdHJfcmVwbGFjZSgnLycsJ1wvJywkdGhpcy0+anNfYWxlcnQpKSAuICJcbiI7CiAgICAgICAgICAgICRfb3V0cHV0IC49ICd9JyAuICJcbiI7CiAgICAgICAgfQoKICAgICAgICAkX291dHB1dCAuPSAnLy9dXT4nIC4gIlxuIiAuICc8L3NjcmlwdD4nIC4gIlxuIjsKCiAgICAgICAgaWYoIWVtcHR5KCR0aGlzLT5qc19hbGVydCkpIHsKICAgICAgICAgICAgJF9vdXRwdXQgLj0gJzxub3NjcmlwdD4nIC4gJHRoaXMtPmpzX2FsZXJ0IC4gJzwvbm9zY3JpcHQ+JyAuICJcbiI7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJF9vdXRwdXQ7CiAgICB9CgogICAgCiAgICAvKioKICAgICAqIHByaW50IHNpZGViYXIgKHB1dCBhdCBsb2NhdGlvbiBzaWRlYmFyIHdpbGwgYXBwZWFyKQogICAgICogCiAgICAgKi8KICAgIGZ1bmN0aW9uIHByaW50U2lkZWJhcigpIHsKICAgICAgICBlY2hvICR0aGlzLT5nZXRTaWRlYmFyKCk7CiAgICB9ICAgIAoKICAgIC8qKgogICAgICogcmV0dXJuIHNpZGViYXIgaHRtbAogICAgICogCiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldFNpZGViYXIoKSB7CiAgICAgICAgcmV0dXJuIHNwcmludGYoJzxkaXYgaWQ9IiVzIj48L2Rpdj4nLCR0aGlzLT5zaWRlYmFyX2lkKSAuICJcbiI7CiAgICB9ICAgIAogICAgICAgICAgICAKICAgIC8qKgogICAgICogZ2V0IHRoZSBnZW9jb2RlIGxhdC9sb24gcG9pbnRzIGZyb20gZ2l2ZW4gYWRkcmVzcwogICAgICogbG9vayBpbiBjYWNoZSBmaXJzdCwgb3RoZXJ3aXNlIGdldCBmcm9tIFlhaG9vCiAgICAgKiAKICAgICAqIEBwYXJhbSBzdHJpbmcgJGFkZHJlc3MKICAgICAqLwogICAgZnVuY3Rpb24gZ2V0R2VvY29kZSgkYWRkcmVzcykgewogICAgICAgIGlmKGVtcHR5KCRhZGRyZXNzKSkKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwoKICAgICAgICAkX2dlb2NvZGUgPSBmYWxzZTsKCiAgICAgICAgaWYoKCRfZ2VvY29kZSA9ICR0aGlzLT5nZXRDYWNoZSgkYWRkcmVzcykpID09PSBmYWxzZSkgewogICAgICAgICAgICBpZigoJF9nZW9jb2RlID0gJHRoaXMtPmdlb0dldENvb3JkcygkYWRkcmVzcykpICE9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgJHRoaXMtPnB1dENhY2hlKCRhZGRyZXNzLCAkX2dlb2NvZGVbJ2xvbiddLCAkX2dlb2NvZGVbJ2xhdCddKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAKICAgICAgICByZXR1cm4gJF9nZW9jb2RlOwogICAgfQogICAKICAgIC8qKgogICAgICogZ2V0IHRoZSBnZW9jb2RlIGxhdC9sb24gcG9pbnRzIGZyb20gY2FjaGUgZm9yIGdpdmVuIGFkZHJlc3MKICAgICAqIAogICAgICogQHBhcmFtIHN0cmluZyAkYWRkcmVzcwogICAgICovCiAgICBmdW5jdGlvbiBnZXRDYWNoZSgkYWRkcmVzcykgewogICAgICAgIGlmKCFpc3NldCgkdGhpcy0+ZHNuKSkKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIAogICAgICAgICRfcmV0ID0gYXJyYXkoKTsKICAgICAgICAKCWlmKCBpc19vYmplY3QoICR0aGlzLT5kc24gKSApCgkgIHsKCSAgICAvLyBBRE9EQgoJICAgICRfcmVzID0mICR0aGlzLT5kc24tPkdldFJvdygiU0VMRUNUIGxvbixsYXQgRlJPTSB7JHRoaXMtPl9kYl9jYWNoZV90YWJsZX0gd2hlcmUgYWRkcmVzcyA9ID8iLCBhcnJheSgkYWRkcmVzcykpOwoJICAgIGlmKCAhJF9yZXMgKSB7CgkgICAgICByZXR1cm4gZmFsc2U7CgkgICAgfQoJICAgICRfcmV0Wydsb24nXSA9ICRfcmVzWydsb24nXTsKCSAgICAkX3JldFsnbGF0J10gPSAkX3Jlc1snbGF0J107CgkgIH0KCWVsc2UKCSAgewoJICAgIC8vIFBFQVIgREIKCSAgICByZXF1aXJlX29uY2UoJ0RCLnBocCcpOyAgICAgICAgICAKCSAgICAkX2RiID0mIERCOjpjb25uZWN0KCR0aGlzLT5kc24pOwoJICAgIGlmIChQRUFSOjppc0Vycm9yKCRfZGIpKSB7CgkgICAgICBkaWUoJF9kYi0+Z2V0TWVzc2FnZSgpKTsKCSAgICB9CgkgICAgJF9yZXMgPSYgJF9kYi0+cXVlcnkoIlNFTEVDVCBsb24sbGF0IEZST00geyR0aGlzLT5fZGJfY2FjaGVfdGFibGV9IHdoZXJlIGFkZHJlc3MgPSA/IiwgJGFkZHJlc3MpOwoJICAgIGlmIChQRUFSOjppc0Vycm9yKCRfcmVzKSkgewoJICAgICAgZGllKCRfcmVzLT5nZXRNZXNzYWdlKCkpOwoJICAgIH0KCSAgICBpZigkX3JvdyA9ICRfcmVzLT5mZXRjaFJvdygpKSB7ICAgICAgICAgICAgCgkgICAgICAkX3JldFsnbG9uJ10gPSAkX3Jvd1swXTsKCSAgICAgICRfcmV0WydsYXQnXSA9ICRfcm93WzFdOwoJICAgIH0KCSAgICAkX2RiLT5kaXNjb25uZWN0KCk7CgkgIH0KICAgICAgICAKICAgICAgICByZXR1cm4gIWVtcHR5KCRfcmV0KSA/ICRfcmV0IDogZmFsc2U7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogcHV0IHRoZSBnZW9jb2RlIGxhdC9sb24gcG9pbnRzIGludG8gY2FjaGUgZm9yIGdpdmVuIGFkZHJlc3MKICAgICAqIAogICAgICogQHBhcmFtIHN0cmluZyAkYWRkcmVzcwogICAgICogQHBhcmFtIHN0cmluZyAkbG9uIHRoZSBtYXAgbGF0aXR1ZGUgKGhvcml6b250YWwpCiAgICAgKiBAcGFyYW0gc3RyaW5nICRsYXQgdGhlIG1hcCBsYXRpdHVkZSAodmVydGljYWwpCiAgICAgKi8KICAgIGZ1bmN0aW9uIHB1dENhY2hlKCRhZGRyZXNzLCAkbG9uLCAkbGF0KSB7CiAgICAgICAgaWYoIWlzc2V0KCR0aGlzLT5kc24pIHx8IChzdHJsZW4oJGFkZHJlc3MpID09IDAgfHwgc3RybGVuKCRsb24pID09IDAgfHwgc3RybGVuKCRsYXQpID09IDApKQogICAgICAgICAgIHJldHVybiBmYWxzZTsKCglpZiggaXNfb2JqZWN0KCAkdGhpcy0+ZHNuICkgKQoJICB7CgkgICAgLy8gQURPREIKCSAgICAkX3JlcyA9ICR0aGlzLT5kc24tPkV4ZWN1dGUoJ2luc2VydCBpbnRvICcuJHRoaXMtPl9kYl9jYWNoZV90YWJsZS4nIHZhbHVlcyAoPyw/LD8pJywgYXJyYXkoJGFkZHJlc3MsICRsb24sICRsYXQpKTsKCSAgICBpZiggISRfcmVzICkgewoJICAgICAgZGllKCAkdGhpcy0+ZHNuLT5FcnJvck1zZygpICk7CgkgICAgfQoJICB9CgllbHNlCgkgIHsKCSAgICAvLyBQRUFSIERCCgkgICAgcmVxdWlyZV9vbmNlKCdEQi5waHAnKTsgICAgICAgICAgCgkgICAgJF9kYiA9JiBEQjo6Y29ubmVjdCgkdGhpcy0+ZHNuKTsKCSAgICBpZiAoUEVBUjo6aXNFcnJvcigkX2RiKSkgewoJICAgICAgZGllKCRfZGItPmdldE1lc3NhZ2UoKSk7CgkgICAgfQogICAgICAgIAoJICAgICRfcmVzID0mICRfZGItPnF1ZXJ5KCdpbnNlcnQgaW50byAnLiR0aGlzLT5fZGJfY2FjaGVfdGFibGUuJyB2YWx1ZXMgKD8sID8sID8pJywgYXJyYXkoJGFkZHJlc3MsICRsb24sICRsYXQpKTsKCSAgICBpZiAoUEVBUjo6aXNFcnJvcigkX3JlcykpIHsKCSAgICAgIGRpZSgkX3Jlcy0+Z2V0TWVzc2FnZSgpKTsKCSAgICB9CgkgICAgJF9kYi0+ZGlzY29ubmVjdCgpOwoJICB9CiAgICAgICAgCiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgCiAgICB9CiAgIAogICAgLyoqCiAgICAgKiBnZXQgZ2VvY29kZSBsYXQvbG9uIHBvaW50cyBmb3IgZ2l2ZW4gYWRkcmVzcyBmcm9tIFlhaG9vCiAgICAgKiAKICAgICAqIEBwYXJhbSBzdHJpbmcgJGFkZHJlc3MKICAgICAqLwogICAgZnVuY3Rpb24gZ2VvR2V0Q29vcmRzKCRhZGRyZXNzLCRkZXB0aD0wKSB7CiAgICAgICAgCiAgICAgICAgc3dpdGNoKCR0aGlzLT5sb29rdXBfc2VydmljZSkgewogICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgY2FzZSAnR09PR0xFJzoKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgJF91cmwgPSBzcHJpbnRmKCdodHRwOi8vJXMvbWFwcy9nZW8/JnE9JXMmb3V0cHV0PWNzdiZrZXk9JXMnLCR0aGlzLT5sb29rdXBfc2VydmVyWydHT09HTEUnXSxyYXd1cmxlbmNvZGUoJGFkZHJlc3MpLCR0aGlzLT5hcGlfa2V5KTsKCiAgICAgICAgICAgICAgICAkX3Jlc3VsdCA9IGZhbHNlOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBpZigkX3Jlc3VsdCA9ICR0aGlzLT5mZXRjaFVSTCgkX3VybCkpIHsKCiAgICAgICAgICAgICAgICAgICAgJF9yZXN1bHRfcGFydHMgPSBleHBsb2RlKCcsJywkX3Jlc3VsdCk7CiAgICAgICAgICAgICAgICAgICAgaWYoJF9yZXN1bHRfcGFydHNbMF0gIT0gMjAwKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgJF9jb29yZHNbJ2xhdCddID0gJF9yZXN1bHRfcGFydHNbMl07CiAgICAgICAgICAgICAgICAgICAgJF9jb29yZHNbJ2xvbiddID0gJF9yZXN1bHRfcGFydHNbM107CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAKICAgICAgICAgICAgY2FzZSAnWUFIT08nOgogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICRfdXJsID0gJ2h0dHA6Ly8lcy9NYXBzU2VydmljZS9WMS9nZW9jb2RlJzsKICAgICAgICAgICAgICAgICRfdXJsIC49IHNwcmludGYoJz9hcHBpZD0lcyZsb2NhdGlvbj0lcycsJHRoaXMtPmxvb2t1cF9zZXJ2ZXJbJ1lBSE9PJ10sJHRoaXMtPmFwcF9pZCxyYXd1cmxlbmNvZGUoJGFkZHJlc3MpKTsKCiAgICAgICAgICAgICAgICAkX3Jlc3VsdCA9IGZhbHNlOwoKICAgICAgICAgICAgICAgIGlmKCRfcmVzdWx0ID0gJHRoaXMtPmZldGNoVVJMKCRfdXJsKSkgewoKICAgICAgICAgICAgICAgICAgICBwcmVnX21hdGNoKCchPExhdGl0dWRlPiguKik8L0xhdGl0dWRlPjxMb25naXR1ZGU+KC4qKTwvTG9uZ2l0dWRlPiFVJywgJF9yZXN1bHQsICRfbWF0Y2gpOwoKICAgICAgICAgICAgICAgICAgICAkX2Nvb3Jkc1snbG9uJ10gPSAkX21hdGNoWzJdOwogICAgICAgICAgICAgICAgICAgICRfY29vcmRzWydsYXQnXSA9ICRfbWF0Y2hbMV07CgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICB9ICAgICAgICAgCiAgICAgICAgCiAgICAgICAgcmV0dXJuICRfY29vcmRzOyAgICAgICAKICAgIH0KICAgIAogICAgCgogICAgLyoqCiAgICAgKiBmZXRjaCBhIFVSTC4gT3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gY2hhbmdlIHRoZSB3YXkgVVJMcyBhcmUgZmV0Y2hlZC4KICAgICAqIAogICAgICogQHBhcmFtIHN0cmluZyAkdXJsCiAgICAgKi8KICAgIGZ1bmN0aW9uIGZldGNoVVJMKCR1cmwpIHsKCiAgICAgICAgcmV0dXJuIGZpbGVfZ2V0X2NvbnRlbnRzKCR1cmwpOwoKICAgIH0KCiAgICAvKioKICAgICAqIGdldCBkaXN0YW5jZSBiZXR3ZWVuIHRvIGdlb2Nvb3JkcyB1c2luZyBncmVhdCBjaXJjbGUgZGlzdGFuY2UgZm9ybXVsYQogICAgICogCiAgICAgKiBAcGFyYW0gZmxvYXQgJGxhdDEKICAgICAqIEBwYXJhbSBmbG9hdCAkbGF0MgogICAgICogQHBhcmFtIGZsb2F0ICRsb24xCiAgICAgKiBAcGFyYW0gZmxvYXQgJGxvbjIKICAgICAqIEBwYXJhbSBmbG9hdCAkdW5pdCAgIE09bWlsZXMsIEs9a2lsb21ldGVycywgTj1uYXV0aWNhbCBtaWxlcywgST1pbmNoZXMsIEY9ZmVldAogICAgICovCiAgICBmdW5jdGlvbiBnZW9HZXREaXN0YW5jZSgkbGF0MSwkbG9uMSwkbGF0MiwkbG9uMiwkdW5pdD0nTScpIHsKICAgICAgICAKICAgICAgLy8gY2FsY3VsYXRlIG1pbGVzCiAgICAgICRNID0gIDY5LjA5ICogcmFkMmRlZyhhY29zKHNpbihkZWcycmFkKCRsYXQxKSkgKiBzaW4oZGVnMnJhZCgkbGF0MikpICsgIGNvcyhkZWcycmFkKCRsYXQxKSkgKiBjb3MoZGVnMnJhZCgkbGF0MikpICogY29zKGRlZzJyYWQoJGxvbjEgLSAkbG9uMikpKSk7IAoKICAgICAgc3dpdGNoKHN0cnRvdXBwZXIoJHVuaXQpKQogICAgICB7CiAgICAgICAgY2FzZSAnSyc6CiAgICAgICAgICAvLyBraWxvbWV0ZXJzCiAgICAgICAgICByZXR1cm4gJE0gKiAxLjYwOTM0NDsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ04nOgogICAgICAgICAgLy8gbmF1dGljYWwgbWlsZXMKICAgICAgICAgIHJldHVybiAkTSAqIDAuODY4OTc2MjQyOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnRic6CiAgICAgICAgICAvLyBmZWV0CiAgICAgICAgICByZXR1cm4gJE0gKiA1MjgwOwogICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgCiAgICAgICAgY2FzZSAnSSc6CiAgICAgICAgICAvLyBpbmNoZXMKICAgICAgICAgIHJldHVybiAkTSAqIDYzMzYwOwogICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgCiAgICAgICAgY2FzZSAnTSc6CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgIC8vIG1pbGVzCiAgICAgICAgICByZXR1cm4gJE07CiAgICAgICAgICBicmVhazsKICAgICAgfQogICAgICAKICAgIH0gICAgCiAgICAKfQoKPz4K]]></data>
	</file>
	<file>
	  <filename>/lib/GoogleMapAPI-2.4/NEWS</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Mi40Ci0tLQoKZml4IGEgY291cGxlIGJ1Z3Mgd2l0aCBkcmF3aW5nIHRoZSBqYXZhc2NyaXB0IG1hcCAoZHJha29zNyxubXdlYixtb2hydCkKZml4IGxhdC9sb24gZGVjaW1hbCB3aGVuIGxvY2FsZSB1c2VzIGEgY29tbWEgKG1vaHJ0LCBSZW5lIFNjaG1pZHQpCmZpeCBqYXZhc2NyaXB0IGVzY2FwZW1lbnQgZXJyb3JzIChHcmVnIFdpbHNvbiwgSmVyb21lIENvbWJheiwgbW9ocnQpCgoyLjMKLS0tCgoqIGZpeGVkIGRiX2NhY2hlX2luc2VydCB0YWJsZSBpc3N1ZSAoZXphciwgbW9ocnQpCgoyLjIKLS0tCgoqIGFkZCBnZW9HZXREaXN0YW5jZSgpIHRvIGNvbXB1dGUgZGlzdGFuY2UgYmV0d2VlbiB0d28gY29vcmRzCiAgdXNpbmcgZ3JlYXQgY2lyY2xlIGRpc3RhbmNlIGZvcm11bGEgKG1vaHJ0KQoqIHVwZGF0ZSBHb29nbGUgbG9va3VwIHRvIHVzZSBvZmZpY2lhbCBHb29nbGUgZ2VvIEFQSSAobW9ocnQpCgoyLjEKLS0tCgoqIGZpeCBhZGp1c3RDZW50ZXJDb29yZHMgdG8gY2FzdCB2YWx1ZXMgYXMgZmxvYXRzIChoZW1tZXRlciwgbW9ocnQpCiogbWFkZSBHT09HTEUgZGVmYXVsdCBsb29rdXAgc2VydmljZQoqIGFkZGVkIHN1cHBvcnQgZm9yIHRhYmJlZCBpbmZvIHdpbmRvd3M6IHBhc3MgYW4gYXJyYXkgb2YgdGl0bGUgPT4gaHRtbCBwYWlycyBhcyB0aGUgJGh0bWwgYXJndW1lbnQKICB0byBhZGRNYXJrZXIuIERpcmVjdGlvbnMsIGlmIGVuYWJsZWQsIGFwcGVhciBpbiB0aGUgZmlyc3QgdGFiLiAoY2xhcmspCiogbWlub3IgYnVnZml4OiBvbmx5IHpvb20gZW5jb21wYXNzIGlmIHRoZXJlIGFyZSB0d28gb3IgbW9yZSBtYXJrZXJzIChjbGFyaykKKiBhZGRlZCBwcmludC9nZXRPbkxvYWQoKSBzbyB5b3UgY2FuIHNldCB3aW5kb3cgb25sb2FkIGR5bmFtaWNhbGx5IChWYXVnaG4gQW5kZXJzb24pCiogYWRkIChkaXMvZW4pYWJsZU92ZXJ2aWV3Q29udHJvbCgpIGZlYXR1cmVzIChBbnRvbmlvIENvc3RhLCBtb250ZSkKKiBhZGQgKGRpcy9lbilhYmxlU2NhbGVDb250cm9sKCkgZmVhdHVyZXMgKEFudG9uaW8gQ29zdGEsIG1vbnRlKQoqIHVzZSBmaXJzdCBzdWdnZXN0aW9uIHdpdGggIkRpZCB5b3UgbWVhbiIgcmVzdWx0IGZyb20gZ29vZ2xlIGxvb2t1cHMsIGF2b2lkIGxvb3BzLCBhZGQgcHJvcGVydHkgJHVzZV9zdWdnZXN0IChBbmdlbG8gQ29uZm9ydGksICBtb250ZSkKKiBtYWtlIEdFT0NPREVTIGRiIHRhYmxlIGNvbmZpZ3VyYWJsZSAoQW5nZWxvIENvbmZvcnRpLCBtb250ZSkKCjIuMAotLS0KCiogY29udmVydGVkIG1hcCB0eXBlIGNvbnN0YW50cyB0byBHX05PUk1BTF9NQVAsIEdfU0FURUxMSVRFX01BUCwgR19IWUJSSURfTUFQLAogIGZvciB2ZXJzaW9uIDIgb2YgR29vZ2xlIE1hcCBhcGkuCiogZml4ZWQgdXAgZHJpdmluZyBkaXJlY3Rpb24gSFRNTCwgcmVtb3ZlIDxwPiwgYWRkIDxkaXY+IChKb2huIFNjaHVseiwgbW9udGUpCiogTW92ZWQgdG8gdmVyc2lvbiAyIG9mIHRoZSBHb29nbGUgTWFwcyBKUyBBUEkuIChjbGFyaykKICBOb3cgdXNlIHRoZSBHTWFwMiBjbGFzcyBpbnN0ZWFkIG9mIEdNYXAgYW5kIEdMYXRMbmcgaW5zdGVhZCBvZgogIEdQb2ludCAoZm9yIGxhdC9sb24gcGFpcnMpIGFsb25nIHdpdGggb3RoZXIgbWlub3IgY2hhbmdlcy4gCiogem9vbSBlbmNvbXBhc3MgbG9vcCByZXBsYWNlZCBieSBhIG5ldyBvZmZpY2lhbCBmdW5jdGlvbiwgbWFwLmdldEJvdW5kc1pvb21MZXZlbChiZHMpLAogIHdoaWNoIHJldHVybnMgdGhlIGFwcHJvcHJpYXRlIHpvb20gbGV2ZWwgZm9yIGEgZ2l2ZW4gR0JvdW5kcyBvYmplY3QuIChjbGFyaykKKiBDb252ZXJ0ZWQgdGhyZWUgc2VjdGlvbnMgb2YgdGhlIGdldE1hcEpTKCkgZnVuY3Rpb24gaW50byB0aGVpciBvd24gZnVuY3Rpb25zOgogIGdldEFkZE1hcmtlcnNKUygpLCBnZXRQb2x5bGluZUpTKCksIGFuZCBnZXRDcmVhdGVNYXJrZXJKUygpLCBzbyB0aGF0IHRoZXkgY2FuIGJlIGV4dGVuZGVkCiAgYnkgc3ViY2xhc3Nlcy4gKGNsYXJrKQoqIGZpeCB6b29tIGVuY29tcGFzcyBmdWRnZSBmYWN0b3IgYnVnOyBub3cgYXBwbHkgdGhlIGZ1ZGdlIGZhY3RvciBpbgogIGdldE1hcEpTKCksIGp1c3QgYmVmb3JlIHdlIHpvb20uIChjbGFyaykKKiBhZGRNYXJrZXJCeUFkZHJlc3MgYW5kIGFkZFBvbHlMaW5lQnlBZGRyZXNzIG5vdyBjYWxsIGFkZE1hcmtlckJ5Q29vcmRzCiAgYW5kIGFkZFBvbHlMaW5lQnlDb29yZHMgaW5zdGVhZCBvZiBkdXBsaWNhdGluZyB0aGUgY29kZSAoY2xhcmspCiogYWRkZWQgc2V0Qm91bmRzRnVkZ2UoKSAoY2xhcmspCgoxLjcKLS0tCgoqIGZpeCBjb21wYXRhYmlsaXR5IHByb2JsZW0gd2l0aCBvbGRlciBQSFAKICAoY2hhbmdlIHByaW50X3IgdG8gc2VyaWFsaXplKSAobW9udGUpCiogZml4IGJ1ZyB3aXRoIHNpZGViYXIgaW5kZXggY291bnRlciAobW9udGUpCiogbWFrZSBtYXAgZGlyZWN0aW9uIGh0bWwgbW9yZSBjb25maWd1cmFibGUgd2l0aCBjc3MgYW5kIGpzIChtb250ZSkKKiBhZGRlZCBtb3JlIGVycm9yIGNoZWNraW5nIHRvIGdvb2dsZSBnZW9jb29yZCBsb29rdXBzIChtb250ZSkKKiBhZGQgZnVkZ2UgZmFjdG9yIHRvIHpvb21fZW5jb21wYXNzIHNvIG1hcmtlcnMKICBhcmUgYXdheSBmcm9tIHRoZSBlZGdlcyAobW9udGUpCgoxLjYKLS0tCgoqIG1vdmUgZHJpdmluZyBkaXIgb3V0cHV0IHRvIHByb3BlcnR5IHZhciAobW9udGUpCiogYWRkIDxkaXY+IGlkcyB0byBkcml2aW5nIGRpcnMgKG1vbnRlKQoqIGZpeCBwcm9ibGVtIHdpdGggcXVvdGVzIGluIHRpdGxlcyBvZiBkcml2aW5nIGRpciAobW9udGUpCiogZml4IGRyaXZpbmcgZGlyIHdyYXBwaW5nIChtb250ZSkKKiBmaXggcHJvYmxlbSB3aXRoIGVtcHR5IGxhdC9sb24gdmFsdWVzIChtb250ZSkKKiBtb3ZlIHNvbWUganMgZnVuY3MgYXJvdW5kLCB0ZXN0IGZvciBtYXAgPGRpdj4gdGFnIChtb250ZSkKKiBkb24ndCBzdXBwbHkgc3R5bGUgdGFncyB0byA8ZGl2PiBpZiB3aWR0aCBhbmQgaGVpZ2h0IGVtcHR5IChtb250ZSkKKiBhZGQganMgZnVuY3Rpb24gc2hvd19pbmZvX3dpbmRvdygpIChtb250ZSkKKiB0cmFjayBwb2ludHMgYW5kIG1hcmtlcnMgaW4gZ2xvYmFsIGpzIGFycmF5cyAobW9udGUpCiogbWFrZSB0aGUgbWFwIGpzIHZhciBnbG9iYWwgKG1vbnRlKQoqIGZpeCBidWcgd2l0aCBpY29uIGFuY2hvciBwb3NpdGlvbmluZyAobW9udGUpCiogYWRkIGVuYWJsZUluZm9XaW5kb3coKSBhbmQgZGlzYWJsZUluZm9XaW5kb3coKSAobW9udGUpCiogcmVtb3ZlIHVudXNlZCBtZXNzYWdlX2lkIChtb250ZSkKCjEuNQotLS0KCiogYWRkIHNldExvb2t1cFNlcnZpY2UoKSB0byBzd2l0Y2ggYmV0d2VlbiBnZW9jb2RlIGxvb2t1cCBzZXJ2aWNlcyAobW9udGUpCiogYWRkIGFkZE1hcmtlckljb24oKSBmb3Igc2V0dGluZyBpY29ucyBmb3IgaW5kaXZpZHVhbCBtYXAgbWFya2VycyAoQ2xhcmsgRnJlaWZlbGQpCiogYWRkICR6b29tX2VuY29tcGFzcyBzbyBkZWZhdWx0IG1hcCB6b29tIGNsb3NlbHkgZW5jb21wYXNzZXMgbWFwIG1hcmtlcnMgKENsYXJrCkZyaWVmZWxkKQoqIGNoYW5nZSBtYXJrZGVyIGRlZmF1bHRzIHRvIG1vcmUgY2xvc2VseSBtYXRjaCBnb29nbGUgbWFwIGRlZmF1bHRzIHdoZW4gbm9uZQphcmUgZ2l2ZW4gKENsYXJrIEZyZWlmZWxkKQoKMS40Ci0tLQoKKiBzcGxpdCBvdXQgVVJMIGZldGNoaW5nIHRvIGl0cyBvd24gbWV0aG9kIHNvIGl0IGNhbiBiZSBlYXNpbHkgb3ZlcnJpZGRlbiAobW9udGUpCiogd3JhcCA8ZGl2PiB0YWdzIGluc2lkZSBqYXZhc2NyaXB0IGZvciBicm93c2VyIGNvbXBhdGFiaWxpdHkgKEpha2UgS3JvaG4sIG1vbnRlKQoqIG1ha2UgSFRNTCBtYXJrZXJzIGRpc3BsYXkgcHJvcGVybHkgaW4gZmlyZWZveCAxLjUgKEpha2UgS3JvaG4sIG1vbnRlKQoqIGZpeGVkIGJ1ZyB3aXRoIHNpZGViYXIgZGlzYWJsZWQgKG1vbnRlKQoKMS4zCi0tLQoKKiByZW1vdmUgZGVidWcgcHJpbnRfciBzdGF0ZW1lbnQgZnJvbSBnZW9HZXRDb29yZHMoKSBmdW5jdGlvbiAobW9udGUpCiogZml4ZWQgYnVnIHdoZW4gc2V0dGluZyBtYXAgdHlwZSBhbmQgZGlzYWJsaW5nIG1hcCBjb250cm9scyAoSm9obiBGcmFuY2lzIExlZSwgbW9udGUpCgoxLjIKLS0tCgoqIGFkZGVkIFVURi04IGNoYXJzZXQgc2V0dGluZyB0byA8amF2YXNjcmlwdD4gdGFncyB0byB3b3JrIHdpdGggSUUgaW4gYWxsIGxhbmdzIChLQURPLCBtb250ZSkKKiBmaXggaXNzdWUgd2l0aCBtdWx0aXBsZSBsYXQvbG9uIGZpbmRpbmdzIGZyb20geWFob28gKGFuZGlnLG1vbnRlKQoqIGFkZCBzZXRNYXBUeXBlKCkgZnVuY3Rpb24gKElzaWRvcjEyOCxtb250ZSkKKiBhbGxvdyBkb3VibGUgcXVvdGVzIGluIHRpdGxlL2h0bWwgb2YgbWFya2VycyAobW9udGUpCiogYWxsb3cgd2lkdGgvaGVpZ2h0IGluIGVpdGhlciBweCBvciAlIChUR0tuSWdodCxtb250ZSkKKiBhZGQgc2V0Wm9vbUxldmVsKCkgZnVuY3Rpb24gKG1vbnRlKQoKMS4xCi0tLQoKKiByZXBsYWNlZCBHb29nbGVNYXBBUEkuY2xhc3MucGhwIHdpdGggR09PRCB2ZXJzaW9uLCAxLjAgaGFkIGluY29ycmVjdCBmaWxlIQoKMS4wCi0tLQoKaW5pdGlhbCByZWxlYXNlCg==]]></data>
	</file>
	<file>
	  <filename>/lib/GoogleMapAPI-2.4/README</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[TkFNRToKCiAgICBHb29nbGVNYXBBUEkgLSBBIGxpYnJhcnkgdXNlZCBmb3IgY3JlYXRpbmcgZ29vZ2xlIG1hcHMuCgpBVVRIT1I6CiAgICBNb250ZSBPaHJ0IDxtb250ZSBbQVRdIG9ocnQgW0RPVF0gY29tPgoKTEFURVNUIFZFUlNJT046CiAgICAyLjQgLSBBdWcgMXN0LCAyMDA3CgpTWU5PUFNJUzoKCiAgICA8P3BocAogICAgcmVxdWlyZSgnR29vZ2xlTWFwQVBJLmNsYXNzLnBocCcpOwoKICAgICRtYXAgPSBuZXcgR29vZ2xlTWFwQVBJKCdtYXAnKTsKICAgIC8vIHNldHVwIGRhdGFiYXNlIGZvciBnZW9jb2RlIGNhY2hpbmcKICAgICRtYXAtPnNldERTTignbXlzcWw6Ly9VU0VSOlBBU1NAbG9jYWxob3N0L0dFT0NPREVTJyk7CiAgICAvLyBlbnRlciBZT1VSIEdvb2dsZSBNYXAgS2V5CiAgICAkbWFwLT5zZXRBUElLZXkoJ1lPVVJHT09HTEVNQVBLRVknKTsKICAgIAogICAgLy8gY3JlYXRlIHNvbWUgbWFwIG1hcmtlcnMKICAgICRtYXAtPmFkZE1hcmtlckJ5QWRkcmVzcygnNjIxIE4gNDh0aCBTdCAjIDYgTGluY29sbiBORSA2ODUwMicsJ1BKIFBpenphJywnPGI+UEogUGl6emE8L2I+Jyk7CiAgICAkbWFwLT5hZGRNYXJrZXJCeUFkZHJlc3MoJzgyNiBQIFN0IExpbmNvbG4gTkUgNjg1MDInLCdPbGQgQ2hpY2FnbycsJzxiPk9sZCBDaGljYWdvPC9iPicpOwogICAgJG1hcC0+YWRkTWFya2VyQnlBZGRyZXNzKCczNDU3IEhvbGRyZWdlIFN0IExpbmNvbG4gTkUgNjg1MDInLCJWYWxlbnRpbm8ncyIsIjxiPlZhbGVudGlubydzPC9iPiIpOwogICAgPz4KCiAgICA8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+CiAgICA8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sbnM6dj0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTp2bWwiPgogICAgPGhlYWQ+CiAgICA8P3BocCAkbWFwLT5wcmludEhlYWRlckpTKCk7ID8+CiAgICA8P3BocCAkbWFwLT5wcmludE1hcEpTKCk7ID8+CiAgICA8IS0tIG5lY2Vzc2FyeSBmb3IgZ29vZ2xlIG1hcHMgcG9seWxpbmUgZHJhd2luZyBpbiBJRSAtLT4KICAgIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CiAgICAgIHZcOiogewogICAgICAgIGJlaGF2aW9yOnVybCgjZGVmYXVsdCNWTUwpOwogICAgICB9CiAgICA8L3N0eWxlPgogICAgPC9oZWFkPgogICAgPGJvZHkgb25sb2FkPSJvbkxvYWQoKSI+CiAgICA8dGFibGUgYm9yZGVyPTE+CiAgICA8dHI+PHRkPgogICAgPD9waHAgJG1hcC0+cHJpbnRNYXAoKTsgPz4KICAgIDwvdGQ+PHRkPgogICAgPD9waHAgJG1hcC0+cHJpbnRTaWRlYmFyKCk7ID8+CiAgICA8L3RkPjwvdHI+CiAgICA8L3RhYmxlPgogICAgPC9ib2R5PgogICAgPC9odG1sPgoKCgpPVVRQVVQ6CgogICAgVmlldyB0aGUgb3V0cHV0IG9mIHRoZSBhYm92ZSBleGFtcGxlIGhlcmU6CgogICAgaHR0cDovL3d3dy5waHBpbnNpZGVyLmNvbS9waHAvY29kZS9Hb29nbGVNYXBBUEkvZGVtby8KCiAgICAKREVTQ1JJUFRJT046CgogICAgR29vZ2xlTWFwQVBJIC0gQSBsaWJyYXJ5IHVzZWQgZm9yIGNyZWF0aW5nIGdvb2dsZSBtYXBzIHVzaW5nIHRoZQogICAgR29vZ2xlIE1hcCBwdWJsaWMgQVBJLiBGZWF0dXJlcyBpbmNsdWRlIG11bHRpcGxlIG1hcCBtYXJrZXJzLCBjdXN0b21pemFibGUKICAgIGljb25zLCBtYXAgZGlyZWN0aW9ucyBidWlsdCBpbnRvIGluZm8gd2luZG93LCBhbmQgc2lkZWJhciBnZW5lcmF0aW9uLgogICAgCiAgICBNb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBHb29nbGUgTWFwIEFQSSBjYW4gYmUgZm91bmQgaGVyZToKICAgIAogICAgaHR0cDovL3d3dy5nb29nbGUuY29tL2FwaXMvbWFwcy8KICAgIAoKRElTQ1VTU0lPTjoKLS0tLS0tLS0tLS0KCiAgICBEaXNjdXNzaW9ucyBhcmUgY3VycmVudGx5IGhlbGQgaW4gdGhlIFNtYXJ0eSBhZGQtb24gZm9ydW0gKGFsdGhvdWdoIFNtYXJ0eQogICAgaXMgbm90IG5lY2Vzc2FyeSB0byB1c2UgR29vZ2xlTWFwQVBJLikKCiAgICBodHRwOi8vd3d3LnBocGluc2lkZXIuY29tL3NtYXJ0eS1mb3J1bS92aWV3Zm9ydW0ucGhwP2Y9MTkKICAgIAoKQkFTRSBDTEFTUyBNRVRIT0RTOgotLS0tLS0tLS0tLS0tLS0tLS0tCgogICAgR29vZ2xlTWFwQVBJKCRtYXBfaWQgPSAnbWFwJywgJGFwcF9pZCA9ICdNeU1hcEFwcCcpCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIAogICAgICAgIENsYXNzIENvbnN0cnVjdG9yLgogICAgICAgIFRoZSBtYXAgaWQgaXMgbmVlZGVkIG9ubHkgaWYgeW91IGhhdmUgbXVsdGlwbGUgbWFwcyBvbiB0aGUgc2FtZSBwYWdlLgogICAgICAgIFRoZSBBcHAgSUQgaXMgdXNlZCBmb3IgdGhlIFlhaG9vIEdlb0NvZGUgQVBJLCB3aGljaCBpcyB0aGUgZGVmYXVsdAogICAgICAgIGxvb2t1cCBzZXJ2aWNlLiBVc2UgYSB1bmlxdWUgQXBwIElEIHBlciBhcHBsaWNhdGlvbi4KICAgICAgICAKICAgICAgICBFeGFtcGxlOgogICAgICAgIAogICAgICAgIC8vIHVzZSBkZWZhdWx0cwogICAgICAgICRtYXAgPSBuZXcgR29vZ2xlTWFwQVBJKCk7CgogICAgICAgIC8vIHNldCBjdXN0b20gbWFwIGlkIGFuZCBhcHAgaWQKICAgICAgICAkbWFwID0gbmV3IEdvb2dsZU1hcEFQSSgnbXltYXAnLCdteWFwcCcpOwoKCiAgICBzZXREU04oJGRzbikKICAgIC0tLS0tLS0tLS0tLQogICAgCiAgICAgICAgVXNlZCB0byBzZXQgdGhlIGRhdGFiYXNlIERTTi4gVGhlIGRhdGFiYXNlIGlzIHVzZWQgdG8gY2FjaGUKICAgICAgICBnZW9jb2RlIGxvb2t1cHMgKGhpZ2hseSByZWNvbW1lbmRlZCEpIFRoZSBQRUFSOjpEQiBtb2R1bGUKICAgICAgICBpcyByZXF1aXJlZCBmb3IgZGF0YWJhc2UgYWNjZXNzLiBZb3Ugd2lsbCBuZWVkIHRvIGNyZWF0ZQogICAgICAgIHRoZSBmb2xsb3dpbmcgZGF0YWJhc2Ugc2NoZW1hIChteXNxbCBleGFtcGxlIGdpdmVuKToKICAgICAgICAKICAgICAgICBDUkVBVEUgVEFCTEUgR0VPQ09ERVMgKAogICAgICAgICAgYWRkcmVzcyB2YXJjaGFyKDI1NSkgTk9UIE5VTEwgZGVmYXVsdCAnJywKICAgICAgICAgIGxvbiBmbG9hdCBkZWZhdWx0IE5VTEwsCiAgICAgICAgICBsYXQgZmxvYXQgZGVmYXVsdCBOVUxMLAogICAgICAgICAgUFJJTUFSWSBLRVkgIChhZGRyZXNzKQogICAgICAgICk7CiAgICAgICAgCiAgICAgICAgRXhhbXBsZToKICAgICAgICAKICAgICAgICAkbWFwLT5zZXREU04oJ215c3FsOi8vREJVU0VSOkRCUEFTU0BEQkhPU1QvREJOQU1FJyk7CiAgICAgICAgJG1hcC0+c2V0RFNOKCdteXNxbDovL2dlbzpmb29iYXJAbG9jYWxob3N0L0dFT0NPREVTJyk7CgogICAgCiAgICBzZXRBUElLZXkoJGtleSkKICAgIC0tLS0tLS0tLS0tLS0tLQogICAgCiAgICAgICAgU2V0cyB0aGUgR29vZ2xlIE1hcCBBUEkgS2V5LiBUaGlzIGlzIG1hbmRhdG9yeSwgeW91IHdpbGwgbmVlZAogICAgICAgIGFuIEFQSSBLZXkgZm9yIHlvdXIgaG9zdG5hbWUhIFlvdSBjYW4gcmVnaXN0ZXIgZnJlZSBoZXJlOgogICAgICAgIAogICAgICAgIGh0dHA6Ly93d3cuZ29vZ2xlLmNvbS9hcGlzL21hcHMvc2lnbnVwLmh0bWwKCiAgICAgICAgRXhhbXBsZToKICAgICAgICAKICAgICAgICAvLyBlbnRlciBZT1VSIHJlZ2lzdGVyZWQgQVBJIEtleQogICAgICAgICRtYXAtPnNldEFQSUtleSgnQUJRSUFBQUF4cDVGRi1BMFJoSE9ublRCd3JsUmJ4Jyk7CgoKICAgIHNldFdpZHRoKCR3aWR0aCkKICAgIC0tLS0tLS0tLS0tLS0tLS0KICAgIAogICAgICAgIFNldHMgdGhlIHdpZHRoIG9mIHRoZSBtYXAgd2luZG93LiBUaGlzIGNhbiBiZSBlaXRoZXIgcHggb3IgJS4KICAgICAgICBEZWZhdWx0IGlzIDUwMHB4LgogICAgCiAgICAgICAgRXhhbXBsZToKICAgICAgICAKICAgICAgICAkbWFwLT5zZXRXaWR0aCgnNTAwcHgnKTsKICAgICAgICAkbWFwLT5zZXRXaWR0aCgnMTAwJScpOwoKICAgIAogICAgc2V0SGVpZ2h0KCRoZWlnaHQpCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0KICAgIAogICAgICAgIFNldHMgdGhlIGhlaWdodCBvZiB0aGUgbWFwIHdpbmRvdy4gVGhpcyBjYW4gYmUgZWl0aGVyIHB4IG9yICUuCiAgICAgICAgRGVmYXVsdCBpcyAnNTAwcHgnLgogICAgCiAgICAgICAgRXhhbXBsZToKICAgICAgICAKICAgICAgICAkbWFwLT5zZXRIZWlnaHQoJzUwMHB4Jyk7CiAgICAgICAgJG1hcC0+c2V0SGVpZ2h0KCcxMDAlJyk7CiAgICAgICAgCiAgICAgICAgCiAgICBlbmFibGVNYXBDb250cm9scygpCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAKICAgICAgICBUaGlzIHdpbGwgZW5hYmxlIHRoZSBtYXAgY29udHJvbHMgdG8gem9vbS9tb3ZlIGFyb3VuZCB0aGUgbWFwLgogICAgICAgIEVuYWJsZWQgYnkgZGVmYXVsdC4KCgogICAgZGlzYWJsZU1hcENvbnRyb2xzKCkKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAKICAgICAgICBUaGlzIHdpbGwgZGlzYWJsZSB0aGUgbWFwIGNvbnRyb2xzIHRvIHpvb20vbW92ZSBhcm91bmQgdGhlIG1hcC4KICAgICAgICBFbmFibGVkIGJ5IGRlZmF1bHQuCgoKICAgIHNldFpvb21MZXZlbCgpCiAgICAtLS0tLS0tLS0tLS0tLQogICAgCiAgICAgICAgVGhpcyBzZXRzIHRoZSBkZWZhdWx0IG1hcCB6b29tIGxldmVsLgogICAgICAgIAogICAgICAgIEV4YW1wbGU6CiAgICAgICAgCiAgICAgICAgJG1hcC0+c2V0Wm9vbUxldmVsKDQpOwoKCiAgICBzZXRDb250cm9sU2l6ZSgkc2l6ZSkKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgCiAgICAgICAgVGhpcyBzZXRzIHRoZSBtYXAgY29udHJvbCBzaXplLiBSZWxldmFudCBvbmx5IGlmIG1hcCBjb250cm9scyBhcmUKICAgICAgICBlbmFibGVkLiBsYXJnZSA9IG1hcCB6b29tL21vdmUgd2l0aCBzbGlkZXIuIHNtYWxsID0gem9vbS9tb3ZlIHdpdGhvdXQKICAgICAgICBzbGlkZXIuIExhcmdlIGlzIGRlZmF1bHQuCiAgICAgICAgCiAgICAgICAgRXhhbXBsZToKICAgICAgICAKICAgICAgICAkbWFwLT5zZXRDb250cm9sU2l6ZSA9ICdzbWFsbCc7CgoKICAgIGVuYWJsZVR5cGVDb250cm9scygpCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgCiAgICAgICAgVGhpcyB3aWxsIGVuYWJsZSB0aGUgbWFwIHR5cGUgY29udHJvbHMgKG1hcC9zYXRlbGxpdGUvaHlicmlkKS4KICAgICAgICBFbmFibGVkIGJ5IGRlZmF1bHQuCgoKICAgIGRpc2FibGVUeXBlQ29udHJvbHMoKQogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAKICAgICAgICBUaGlzIHdpbGwgZGlzYWJsZSB0aGUgbWFwIHR5cGUgY29udHJvbHMgKG1hcC9zYXRlbGxpdGUvaHlicmlkKS4KICAgICAgICBFbmFibGVkIGJ5IGRlZmF1bHQuCgoKICAgIHNldE1hcFR5cGUoJHR5cGUpCiAgICAtLS0tLS0tLS0tLS0tLS0tLQogICAgCiAgICAgICAgVGhpcyBzZXRzIHRoZSBkZWZhdWx0IG1hcCB0eXBlLiBSZWxldmFudCBvbmx5IGlmIG1hcCB0eXBlIGNvbnRyb2xzIGFyZQogICAgICAgIGVuYWJsZWQuIG1hcCA9IGRlZmF1bHQgbWFwLiBzYXRlbGxpdGUgPSBzYXRlbGxpdGUgdmlldy4gaHlicmlkID0gaHlicmlkCiAgICAgICAgdmlldy4KICAgICAgICAKICAgICAgICBFeGFtcGxlOgogICAgICAgIAogICAgICAgICRtYXAtPnNldE1hcFR5cGUoJ21hcCcpOyAvLyBkZWZhdWx0CiAgICAgICAgJG1hcC0+c2V0TWFwVHlwZSgnc2F0ZWxsaXRlJyk7CiAgICAgICAgJG1hcC0+c2V0TWFwVHlwZSgnaHlicmlkJyk7CiAgICAgICAgCiAgICAgICAgCiAgICBlbmFibGVTaWRlYmFyKCkKICAgIC0tLS0tLS0tLS0tLS0tLQogICAgCiAgICAgICAgVGhpcyBlbmFibGVzIHRoZSBtYXAgc2lkZWJhci4gVXNlIHByaW50U2lkZUJhcigpIG9yIGdldFNpZGVCYXIoKSB0bwogICAgICAgIG91dHB1dCB0aGUgc2lkZWJhciB0ZXh0LiBFbmFibGVkIGJ5IGRlZmF1bHQuCgoKICAgIGRpc2FibGVTaWRlYmFyKCkKICAgIC0tLS0tLS0tLS0tLS0tLS0KICAgIAogICAgICAgIFRoaXMgZGlzYWJsZXMgdGhlIG1hcCBzaWRlYmFyLiBFbmFibGVkIGJ5IGRlZmF1bHQuCgogICAgCiAgICBlbmFibGVEaXJlY3Rpb25zKCkKICAgIC0tLS0tLS0tLS0tLS0tLS0tLQogICAgCiAgICAgICAgVGhpcyBlbmFibGVzIG1hcCBkaXJlY3Rpb25zIGluIHRoZSBib3R0b20gb2YgdGhlIHBvcC11cCBpbmZvIHdpbmRvdy4KICAgICAgICBFbmFibGVkIGJ5IGRlZmF1bHQuICAgICAgICAKCgogICAgZGlzYWJsZURpcmVjdGlvbnMoKQogICAgLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgCiAgICAgICAgVGhpcyBkaXNhYmxlcyBtYXAgZGlyZWN0aW9ucyBpbiB0aGUgYm90dG9tIG9mIHRoZSBwb3AtdXAgaW5mbyB3aW5kb3cuCiAgICAgICAgRW5hYmxlZCBieSBkZWZhdWx0LgoKICAgIGVuYWJsZVpvb21FbmNvbXBhc3MoKQogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAKICAgICAgICBUaGlzIGVuYWJsZXMgem9vbSBlbmNvbXBhc3Mgc28gZGVmYXVsdCBtYXAgem9vbSBpcyBhcyBzbWFsbCBhcyBwb3NzaWJsZQogICAgICAgIGFuZCBpbmNsdWRlIGFsbCBtYXAgbWFya2Vycy4KICAgICAgICBFbmFibGVkIGJ5IERlZmF1bHQuCgogICAgZGlzYWJsZVpvb21FbmNvbXBhc3MoKQogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgCiAgICAgICAgVGhpcyBkaXNhYmxlcyB6b29tIGVuY29tcGFzcy4KICAgICAgICBFbmFibGVkIGJ5IERlZmF1bHQuICAgICAgICAKCgogICAgc2V0Qm91bmRzRnVkZ2UoJHZhbCkKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAKICAgICAgICBTZXQgdGhlIG1hcCBib3VuZGFyeSBmdWRnZSBmYWN0b3IuIFRoaXMgd2lsbCBhZGp1c3QgaG93IG11Y2ggbWFwCiAgICAgICAgYm91bmRhcnkgZW5jb21wYXNzZXMgdGhlIG1hcCBtYXJrZXJzLiAoMC4wMSBpcyBkZWZhdWx0LikKICAgICAgICAKICAgICAgICBFeGFtcGxlOgogICAgICAgIAogICAgICAgICRtYXAtPnNldEJvdW5kc0Z1ZGdlKDAuMDEpOwogICAgICAgIAogICAgICAgIAogICAgc2V0QnJvd3NlckFsZXJ0KCRtZXNzYWdlKQogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgCiAgICAgICAgVGhpcyBzZXRzIHRoZSBhbGVydCBtZXNzYWdlIHRoYXQgcG9wcyB1cCB3aGVuIGEgYnJvd3NlciBpcyBub3QKICAgICAgICBjb21wYXRpYmxlIHdpdGggdGhlIEdvb2dsZSBNYXAgQVBJLiBEZWZhdWx0IGlzOgogICAgICAgICJTb3JyeSwgdGhlIEdvb2dsZSBNYXBzIEFQSSBpcyBub3QgY29tcGF0aWJsZSB3aXRoIHRoaXMgYnJvd3Nlci4iCiAgICAgICAgCiAgICAgICAgCiAgICBzZXRKU0FsZXJ0KCRtZXNzYWdlKQogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIAogICAgICAgIFRoaXMgc2V0cyB0aGUgYWxlcnQgbWVzc2FnZSB0aGF0IGRpc3BsYXlzIHdoZW4gamF2YXNjcmlwdCBpcyBkaXNhYmxlZC4KICAgICAgICBEZWZhdWx0OiAiPGI+SmF2YXNjcmlwdCBtdXN0IGJlIGVuYWJsZWQgaW4gb3JkZXIgdG8gdXNlIEdvb2dsZSBNYXBzLjwvYj4iCiAgICAKICAgICAgICAKICAgIGVuYWJsZU9uTG9hZCgpCiAgICAtLS0tLS0tLS0tLS0tLQogICAgCiAgICAgICAgVGhpcyBlbmFibGVzIHRoZSBvbkxvYWQoKSBqYXZhc2NyaXB0IGZ1bmN0aW9uLCB3aGljaCBpcyB1c2VkIGJ5IGRlZmF1bHQuCiAgICAgICAgVGhpcyBhbGxvd3MgdGhlIG1hcCBqYXZhc2NyaXB0IHRvIGJlIHB1dCBpbnRvIHRoZSA8aGVhZD48L2hlYWQ+IHRhZywKICAgICAgICB0aGVuIGxvYWRlZCB1cG9uIHBhZ2UgZW50cnkgd2l0aCBlaXRoZXIgPGJvZHkgb25sb2FkPSJvbkxvYWQoKSI+IHJpZ2h0CiAgICAgICAgaW4gdGhlIGJvZHkgdGFnLCBvciB1c2UgcHJpbnRPbkxvYWQoKSB0byBwbGFjZSB0aGlzIGVsc2V3aGVyZS4gV2l0aCBvbkxvYWQKICAgICAgICBkaXNhYmxlZCwgdGhlIG1hcCBqYXZhc2NyaXB0IG11c3QgYmUgZW1iZWRkZWQgaW5zaWRlIHRoZSA8Ym9keT48L2JvZHk+CiAgICAgICAgdGFncy4gVXNpbmcgb25Mb2FkKCkgaXMgdGhlIGJlc3QgbWV0aG9kIHRvIHVzZSBmb3IgYnJvd3NlcgogICAgICAgIGNvbXBhdGFiaWxpdHkuCgoKICAgIGVuYWJsZUluZm9XaW5kb3coKQogICAgLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAKICAgICAgICBlbmFibGVzIGluZm8gd2luZG93cyBvbiBtYXAgbWFya2Vycy4KICAgICAgICBFbmFibGVkIGJ5IGRlZmF1bHQuCiAgICAKCiAgICBkaXNhYmxlSW5mb1dpbmRvdygpCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tCgogICAgICAgIGRpc2FibGVzIGluZm8gd2luZG93cyBvbiBtYXAgbWFya2Vycy4KICAgICAgICBFbmFibGVkIGJ5IGRlZmF1bHQuCgoKICAgIGVuYWJsZVNjYWxlQ29udHJvbCgpCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgCiAgICBlbmFibGVzIHRoZSBtYXAgc2NhbGUuCiAgICBFbmFibGVkIGJ5IGRlZmF1bHQuCiAgICAKCiAgICBkaXNhYmxlU2NhbGVDb250cm9sKCkKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgCiAgICBkaXNhYmxlcyB0aGUgbWFwIHNjYWxlLgogICAgRW5hYmxlZCBieSBkZWZhdWx0LgoKCiAgICBlbmFibGVPdmVydmlld0NvbnRyb2woKQogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIAogICAgZW5hYmxlcyB0aGUgbWFwIG92ZXJ2aWV3LgogICAgRGlzYWJsZWQgYnkgZGVmYXVsdC4KCgogICAgZGlzYWJsZU92ZXJ2aWV3Q29udHJvbCgpCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIAogICAgZGlzYWJsZSB0aGUgbWFwIG92ZXJ2aWV3LgogICAgRGlzYWJsZWQgYnkgZGVmYXVsdC4KCiAgICAgICAgCiAgICBkaXNhYmxlT25Mb2FkKCkKICAgIC0tLS0tLS0tLS0tLS0tLQogICAgCiAgICAgICAgVGhpcyBkaXNhYmxlcyB0aGUgb25Mb2FkKCkgamF2YXNjcmlwdCBmdW5jdGlvbi4gKHNlZSBlbmFibGVPbkxvYWQoKSkKICAgICAgICBFbmFibGVkIGJ5IGRlZmF1bHQuCiAgICAgICAgCiAgICAgICAgCiAgICBzZXRJbmZvV2luZG93VHJpZ2dlcigkdHlwZSkKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgCiAgICAgICAgVGhpcyBzZXRzIHRoZSBpbmZvIHdpbmRvdyB0cmlnZ2VyIGJlaGF2aW9yLiBjbGljayA9IGluZm8gd2luZG93IGNvbWVzIHVwCiAgICAgICAgd2hlbiBjbGlja2luZyBvbiBhIG1hcmtlci4gbW91c2VvdmVyID0gaW5mbyB3aW5kb3cgY29tZXMgdXAgd2hlbiBtb3VzaW5nCiAgICAgICAgb3ZlciBhIG1hcmtlci4gRGVmYXVsdCBpcyBjbGljay4KICAgICAgICAKICAgICAgICBFeGFtcGxlOgogICAgICAgIAogICAgICAgICRtYXAtPnNldEluZm9XaW5kb3dUcmlnZ2VyKCdtb3VzZW92ZXInKTsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgCiAgICBhZGRNYXJrZXJCeUFkZHJlc3MoJGFkZHJlc3MsJHRpdGxlID0gJycsJGh0bWwgPSAnJykKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgCiAgICAgICAgVGhpcyBhZGRzIGEgbWFya2VyIHRvIHRoZSBtYXAuIFRoZSBhZGRyZXNzIG11c3QgYmUgYSBmdWxseSBxdWFsaWZpZWQKICAgICAgICBhZGRyZXNzIHRoYXQgY2FuIGJlIHVzZWQgYnkgdGhlIGF2YWlsYWJsZSBnZW9jb2RlIGxvb2t1cCBzZXJ2aWNlcy4KICAgICAgICAKICAgICAgICBUbyBhZGQgbWFya2VycyB3aXRoIGdlb2NvZGVzIGRpcmVjdGx5LCBzZWUgYWRkTWFya2VyQnlDb29yZHMoKS4KICAgICAgICAKICAgICAgICBUaGUgdGl0bGUgaXMgdXNlZCBmb3IgdGhlIHNpZGViYXIgbmF2aWdhdGlvbiBsaW5rLiBUaGUgaHRtbCBpcyB1c2VkCiAgICAgICAgaW4gdGhlIGluZm8gd2luZG93IHRoYXQgcG9wcyB1cCB3aGVuIHlvdSBjbGljayBvbiB0aGUgbWFwIG1hcmtlci4gSWYKICAgICAgICBubyBodG1sIGlzIHByb3ZpZGVkLCB0aGUgdGl0bGUgd2lsbCBiZSB1c2VkLgogICAgICAgIAogICAgICAgIE5vdGU6IG1hcCBjZW50ZXJpbmcgaXMgZG9uZSBhdXRvbWF0aWNhbGx5IGFzIG1hcmtlcnMgYXJlIGFkZGVkLgogICAgICAgIAogICAgICAgIE5vdGU6IFlvdSBjYW4gdXNlIHRhYmJlZCB3aW5kb3dzIGJ5IHBhc3NpbmcgYW4gYXJyYXkgb2YKICAgICAgICAgICAgdGl0bGU9PnRleHQgdmFsdWVzIGFzIHRoZSAkaHRtbCBwYXJhbWV0ZXIuIElmIGRyaXZpbmcgZGlyZWN0aW9ucwogICAgICAgICAgICBhcmUgZW5hYmxlZCwgdGhleSBzaG93IHVwIHVuZGVyIHRoZSBmaXJzdCB0YWIuCiAgICAgICAgICAgICAgICAKICAgICAgICBFeGFtcGxlOgogICAgICAgIAogICAgICAgICRtYXAtPmFkZE1hcmtlckJ5QWRkcmVzcygnNjIxIE4gNDh0aCBTdCAjIDYgTGluY29sbiBORSA2ODUwMicsJ1BKIFBpenphJywnPGI+UEogUGl6emE8L2I+Jyk7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIAogICAgYWRkTWFya2VyQnlDb29yZHMoJGxvbiwkbGF0LCR0aXRsZSA9ICcnLCRodG1sID0gJycpCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIAogICAgICAgIFRoaXMgYWRkcyBhIG1hcCBtYXJrZXIgYnkgZ2VvY29kZSAobG9uL2xhdCkgZGlyZWN0bHkuIFNlZQogICAgICAgIGFkZE1hcmtlckJ5QWRkcmVzcygpIGZvciBtb3JlIGRldGFpbHMuCgogICAgICAgIEV4YW1wbGU6CiAgICAgICAgCiAgICAgICAgJG1hcC0+YWRkTWFya2VyQnlBZGRyZXNzKC05Ni42NTM5LDQwLjgxOTEsJ1BKIFBpenphJywnPGI+UEogUGl6emE8L2I+Jyk7CiAgICAgICAgCiAgICAKICAgCiAgICBhZGRQb2x5TGluZUJ5QWRkcmVzcygkYWRkcmVzczEsJGFkZHJlc3MyLCRjb2xvciwkd2VpZ2h0LCRvcGFjaXR5KQogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIAogICAgICAgIFRoaXMgYWRkcyBhIHBvbHlsaW5lIGJldHdlZW4gdGhlIHR3byBnaXZlbiBhZGRyZXNzZXMuIFlvdSBjYW4gb3B0aW9uYWxseQogICAgICAgIHN1cHBseSBhIGNvbG9yIChpbiAjZmZmZmZmIGhleCBub3RhdGlvbiksIHdlaWdodCAodGhpY2tuZXNzIGluIHBpeGVscyksCiAgICAgICAgYW5kIG9wYWNpdHkgKGluIHBlcmNlbnRhZ2UgMC0xMDApLgogICAgICAgIAogICAgICAgIEV4YW1wbGU6CiAgICAgICAgCiAgICAgICAgJG1hcC0+YWRkUG9seUxpbmVCeUFkZHJlc3MoCiAgICAgICAgICAgICczNDU3IEhvbGRyZWdlIFN0IExpbmNvbG4gTkUgNjg1MDInLAogICAgICAgICAgICAnODI2IFAgU3QgTGluY29sbiBORSA2ODUwMicsJyNlZWVlZWUnLDUsNTApOwogICAgICAgICAgICAgICAgCiAgICAgICAgCiAgICBhZGRQb2x5TGluZUJ5Q29vcmRzKCRsb24xLCRsYXQxLCRsb24yLCRsYXQyLCRjb2xvciwkd2VpZ2h0LCRvcGFjaXR5KQogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIAogICAgICAgIFRoaXMgYWRkcyBhIHBvbHlsaW5lIGJldHdlZW4gdGhlIHR3byBnaXZlbiBnZW9jb29yZGluYXRlIHBvaW50cy4gWW91IGNhbiBvcHRpb25hbGx5CiAgICAgICAgc3VwcGx5IGEgY29sb3IgKGluICNmZmZmZmYgaGV4IG5vdGF0aW9uKSwgd2VpZ2h0IChsaW5lIHRoaWNrbmVzcyBpbiBwaXhlbHMpLAogICAgICAgIGFuZCBvcGFjaXR5IChpbiBwZXJjZW50YWdlIDAtMTAwKS4KCiAgICAgICAgRXhhbXBsZToKICAgICAgICAKICAgICAgICAkbWFwLT5hZGRQb2x5TGluZUJ5Q29vcmRzKC05Ni42Nyw0MC44Mjc5LC05Ni43MDk1LDQwLjgxNDksJyNlZWVlZWUnLDUsNTApOwoKICAgICAgICAgICAgICAgIAogICAgYWRqdXN0Q2VudGVyQ29vcmRzKCRsb24sJGxhdCkKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAKICAgICAgICBUaGlzIGFkanVzdHMgdGhlIG1hcCBjZW50ZXIgY29vcmRzIGJ5IHRoZSBnaXZlbiBsb24vbGF0LiBUaGlzIGlzIGRvbmUKICAgICAgICBhdXRvbWF0aWNhbGx5IGFzIHlvdSBhZGQgbWFya2VycyB0byB0aGUgbWFwLCBvciB5b3UgY2FuIGRvIGl0IG1hbnVhbGx5CiAgICAgICAgd2l0aCB0aGlzIGZ1bmN0aW9uLiBOb3RlOiB0aGlzIGZ1bmN0aW9uIGlzIHVzZWQgaW50ZXJuYWxseSBieSB0aGUKICAgICAgICBsaWJyYXJ5LCBpdCBpc24ndCBub3JtYWxseSBuZWNlc3NhcnkgdW5sZXNzIHlvdSBoYXZlIGEgc3BlY2lmaWMgbmVlZCBhbmQKICAgICAgICB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcuCgogICAgICAgIAogICAgc2V0Q2VudGVyQ29vcmRzKCRsb24sJGxhdCkKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgICAgICAKICAgICAgICBUaGlzIHNldHMgdGhlIG1hcCBjZW50ZXIgY29vcmRzIHRvIHRoZSBnaXZlbiBsb24vbGF0LiBDZW50ZXIgY29vcmRzIGFyZQogICAgICAgIGNhbGN1bGF0ZWQgYXV0b21hdGljYWxseSBhcyB5b3UgYWRkIG1hcmtlcnMgdG8gdGhlIG1hcCwgb3IgeW91IHJlc2V0IGl0CiAgICAgICAgbWFudWFsbHkgd2l0aCB0aGlzIGZ1bmN0aW9uLiBOb3RlOiB0aGlzIGZ1bmN0aW9uIGlzIHVzZWQgaW50ZXJuYWxseSBieQogICAgICAgIHRoZSBsaWJyYXJ5LCBpdCBpc24ndCBub3JtYWxseSBuZWNlc3NhcnkgdW5sZXNzIHlvdSBoYXZlIGEgc3BlY2lmaWMgbmVlZAogICAgICAgIGFuZCB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcuCgoKICAgIHNldExvb2t1cFNlcnZpY2UoJ0dPT0dMRScpCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgICAgICAKICAgICAgICBUaGlzIHNldHMgdGhlIGdlb2NvZGUgbG9va3VwIHNlcnZpY2UuIERlZmF1bHQgaXMgR09PR0xFLCB3aGljaCB1c2VzIHRoZQogICAgICAgIEdPT0dMRSBHZW9jb2RlIEFQSS4gSWYgeW91IHVzZSB0aGUgWUFIT08gR2VvY29kZSBBUEksIGJlIHN1cmUgdG8gc2V0CiAgICAgICAgeW91ciBhcHBsaWNhdGlvbiBJRCB3aGVuIGluc3RhbnRpYXRpbmcgR29vZ2xlTWFwQVBJLiBOT1RFOiBZYWhvbyBBUEkKICAgICAgICB3b3JrcyBvbmx5IGZvciBVUyBhZGRyZXNzZXMgKEFGQUlLKS4KICAgIAogICAgCiAgICBzZXRNYXJrZXJJY29uKCRpY29uSW1hZ2UsJGljb25TaGFkb3dJbWFnZSwkaWNvbkFuY2hvclgsJGljb25BbmNob3JZLCRpbmZvV2luZG93QW5jaG9yWCwkaW5mb1dpbmRvd0FuY2hvclkpCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAKICAgICAgICBUaGlzIHNldHMgdGhlIGljb24gaW1hZ2UgZm9yIEFMTCB0aGUgbWFwIG1hcmtlcnMuIENhbGwgdGhpcyBvbmNlLiBJZiB5b3UKICAgICAgICB3YW50IHRvIHNldCBhIGRpZmZlcmVudCBpY29uIGZvciBlYWNoIG1hcmtlciwgdXNlIGFkZE1hcmtlckljb24oKQogICAgICAgIGluc3RlYWQuCiAgICAgICAgCiAgICAgICAgWW91IG11c3Qgc3VwcGx5IGEgc2VwYXJhdGUgaW1hZ2UgZm9yIHRoZSBpY29uIGFuZCBpdHMgc2hhZG93LgogICAgICAgIGljb25BbmNob3JYL1kgaXMgdGhlIFgvWSBjb29yZGluYXRlcyBvZiB0aGUgaWNvbiBmb3IgdGhlIG1hcCBwb2ludC4KICAgICAgICBpbmZvV2luZG93QW5jaG9yWC9ZIGlzIHRoZSBYL1kgY29vcmRpbmF0ZXMgb2YgdGhlIGljb24gd2hlcmUgdGhlIGluZm8KICAgICAgICB3aW5kb3cgY29ubmVjdHMuCiAgICAgICAgCiAgICAgICAgVGhlIGljb25JbWFnZSBhbmQgaWNvblNoYWRvd0ltYWdlIGNhbiBiZSBlaXRoZXIgZnVsbHkgcXVhbGlmaWVkIFVSTHMsIG9yCiAgICAgICAgYSByZWxhdGl2ZSBwYXRoIGZyb20geW91ciB3ZWIgc2VydmVyIERPQ1VNRU5UX1JPT1QuIFRoZXNlIGltYWdlcyBNVVNUCiAgICAgICAgZXhpc3QgYW5kIHJlYWRhYmxlIHNvIHRoZSBsaWJyYXJ5IGNhbiBjYWxjdWxhdGUgdGhlIGRpbWVuc2lvbnMuCiAgICAgICAgCiAgICAgICAgRXhhbXBsZToKICAgICAgICAKICAgICAgICAkbWFwLT5zZXRNYXJrZXJJY29uKCcvaW1hZ2VzL2hvdXNlLnBuZycsJy9pbWFnZXMvaG91c2Vfc2hhZG93LnBuZycsMCwwLDEwLDEwKTsKCgogICAgYWRkTWFya2VySWNvbigkaWNvbkltYWdlLCRpY29uU2hhZG93SW1hZ2UsJGljb25BbmNob3JYLCRpY29uQW5jaG9yWSwkaW5mb1dpbmRvd0FuY2hvclgsJGluZm9XaW5kb3dBbmNob3JZKQogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgCiAgICAgICAgVGhpcyBzZXRzIHRoZSBpY29uIGltYWdlIGZvciB0aGUgQ1VSUkVOVCBtYXAgbWFya2VyLiBJTVBPUlRBTlQ6IHlvdSBNVVNUCiAgICAgICAgY2FsbCBhZGRNYXJrZXJJY29uKCkgb25jZSBmb3IgZXZlcnkgbWFya2VyLiBEbyBub3QgdXNlIHNldE1hcmtlckljb24oKQogICAgICAgIGlmIHlvdSB1c2UgdGhpcyBmdW5jdGlvbi4KICAgICAgICAKICAgICAgICBZb3UgbXVzdCBzdXBwbHkgYSBzZXBhcmF0ZSBpbWFnZSBmb3IgdGhlIGljb24gYW5kIGl0cyBzaGFkb3cuCiAgICAgICAgaWNvbkFuY2hvclgvWSBpcyB0aGUgWC9ZIGNvb3JkaW5hdGVzIG9mIHRoZSBpY29uIGZvciB0aGUgbWFwIHBvaW50LgogICAgICAgIGluZm9XaW5kb3dBbmNob3JYL1kgaXMgdGhlIFgvWSBjb29yZGluYXRlcyBvZiB0aGUgaWNvbiB3aGVyZSB0aGUgaW5mbwogICAgICAgIHdpbmRvdyBjb25uZWN0cy4KICAgICAgICAKICAgICAgICBUaGUgaWNvbkltYWdlIGFuZCBpY29uU2hhZG93SW1hZ2UgY2FuIGJlIGVpdGhlciBmdWxseSBxdWFsaWZpZWQgVVJMcywgb3IKICAgICAgICBhIHJlbGF0aXZlIHBhdGggZnJvbSB5b3VyIHdlYiBzZXJ2ZXIgRE9DVU1FTlRfUk9PVC4gVGhlc2UgaW1hZ2VzIE1VU1QKICAgICAgICBleGlzdCBhbmQgcmVhZGFibGUgc28gdGhlIGxpYnJhcnkgY2FuIGNhbGN1bGF0ZSB0aGUgZGltZW5zaW9ucy4KICAgICAgICAKICAgICAgICBFeGFtcGxlOgogICAgICAgIAogICAgICAgICRtYXAtPmFkZE1hcmtlckljb24oJy9pbWFnZXMvaG91c2UucG5nJywnL2ltYWdlcy9ob3VzZV9zaGFkb3cucG5nJywwLDAsMTAsMTApOwoKCiAgICBwcmludEhlYWRlckpTKCkKICAgIC0tLS0tLS0tLS0tLS0tLQoKICAgICAgICBUaGlzIHByaW50cyB0aGUgaGVhZGVyIGphdmFzY3JpcHQgdGhhdCBnb2VzIGludG8gdGhlIDxoZWFkPjwvaGVhZD4gdGFncy4KICAgICAgICBUbyByZXR1cm4gdGhlIGhlYWRlciBqYXZhc2NyaXB0IGluIGEgdmFyaWFibGUsIHVzZSBnZXRIZWFkZXJKUygpLgogICAgICAgIAogICAgICAgIEV4YW1wbGU6CiAgICAgICAgCiAgICAgICAgPGhlYWQ+CiAgICAgICAgPD9waHAgJG1hcC0+cHJpbnRIZWFkZXJKUygpOyA/PgogICAgICAgIDwvaGVhZD4KICAgIAoKICAgIGdldEhlYWRlckpTKCkKICAgIC0tLS0tLS0tLS0tLS0KICAgIAogICAgICAgIFRoaXMgcmV0dXJucyB0aGUgaGVhZGVyIGphdmFzY3JpcHQgdGhhdCBnb2VzIGludG8gdGhlIDxoZWFkPjwvaGVhZD4gdGFncy4KICAgICAgICBUbyBwcmludCB0aGUgaGVhZGVyIGphdmFzY3JpcHQgZGlyZWN0bHksIHVzZSBwcmludEhlYWRlckpTKCkuCiAgICAgICAgCiAgICAgICAgRXhhbXBsZToKICAgICAgICAKICAgICAgICA8P3BocAogICAgICAgICRoZWFkZXJqcyA9IGdldEhlYWRlckpTKCk7CiAgICAgICAgPz4KICAgICAgICA8aGVhZD4KICAgICAgICA8P3BocCBlY2hvICRoZWFkZXJqczsgPz4KICAgICAgICA8L2hlYWQ+CiAgICAgICAgCiAgICAgICAgCiAgICBwcmludE1hcEpTKCkKICAgIC0tLS0tLS0tLS0tLQoKICAgICAgICBUaGlzIHByaW50cyB0aGUgbWFwIGphdmFzY3JpcHQuIElmIG9uTG9hZCgpIGlzIGVuYWJsZWQsIHB1dCB0aGlzIGluIHRoZQogICAgICAgIDxoZWFkPjwvaGVhZD4gdGFncywgYW5kIHN1cHBseSA8Ym9keSBvbmxvYWQ9Im9uTG9hZCgpIj4gaW4gdGhlIGJvZHkgdGFnCiAgICAgICAgKG9yIHVzZSBwcmludE9uTG9hZCgpKS4KICAgICAgICAKICAgICAgICBPdGhlcndpc2UsIHB1dCB0aGlzIGp1c3QgYmVmb3JlIHRoZSA8L2JvZHk+IHRhZyB0byBtYWtlIGl0IGxvYWQKICAgICAgICBhdXRvbWF0aWNhbGx5LiBOb3RlIHRoYXQgdXNpbmcgb25Mb2FkKCkgaXMgcmVjb21tZW5kZWQgb3ZlciB0aGlzIG1ldGhvZC4KICAgICAgICAKICAgICAgICBUbyByZXR1cm4gdGhlIG1hcCBqYXZhc2NyaXB0IGluIGEgdmFyaWFibGUsIHVzZSBnZXRNYXBKUygpLgogICAgICAgIAogICAgICAgIEV4YW1wbGU6CiAgICAgICAgCiAgICAgICAgPGhlYWQ+CiAgICAgICAgPD9waHAgJG1hcC0+cHJpbnRNYXBKUygpOyA/PgogICAgICAgIDwvaGVhZD4KICAgIAogICAgCiAgICBnZXRNYXBKUygpCiAgICAtLS0tLS0tLS0tCgogICAgICAgIFRoaXMgcmV0dXJucyB0aGUgbWFwIGphdmFzY3JpcHQgdGhhdCBnb2VzIGludG8gdGhlIDxoZWFkPjwvaGVhZD4gdGFncy4KICAgICAgICBUbyBwcmludCB0aGUgbWFwIGphdmFzY3JpcHQgZGlyZWN0bHksIHVzZSBwcmludE1hcEpTKCkuCiAgICAgICAgCiAgICAgICAgRXhhbXBsZToKICAgICAgICAKICAgICAgICA8P3BocAogICAgICAgICRtYXBqcyA9ICRtYXAtPnByaW50TWFwSlMoKTsKICAgICAgICA/PgogICAgICAgIDxoZWFkPgogICAgICAgIDw/cGhwIGVjaG8gJG1hcGpzOyA/PgogICAgICAgIDwvaGVhZD4KCgogICAgcHJpbnRPbkxvYWQoKQogICAgLS0tLS0tLS0tLS0tLQoKICAgICAgICBUaGlzIHByaW50cyB0aGUgb25Mb2FkKCkgamF2YXNjcmlwdCBjYWxsLiBUaGlzIGlzIGFuIGFsdGVybmF0ZSB0bwogICAgICAgIHVzaW5nIDxib2R5IG9ubG9hZD0ib25Mb2FkKCkiPiBpbiB0aGUgYm9keSB0YWcuIFlvdSBjYW4gcGxhY2UKICAgICAgICB0aGlzIGFueXdoZXJlIGluIHRoZSBodG1sIGJvZHkuCiAgICAgICAgCiAgICAgICAgVG8gcmV0dXJuIHRoZSBvbkxvYWQoKSBqYXZhc2NyaXB0IGluIGEgdmFyaWFibGUsIHVzZSBnZXRPbkxvYWQoKS4KICAgICAgICAKICAgICAgICBFeGFtcGxlOgogICAgICAgIAogICAgICAgIDxoZWFkPgogICAgICAgIDw/cGhwICRtYXAtPnByaW50TWFwSlMoKTsgPz4KICAgICAgICA8L2hlYWQ+CiAgICAgICAgPGJvZHk+CiAgICAgICAgPD9waHAgZWNobyAkbWFwLT5wcmludE1hcCgpOyA/PgogICAgICAgIDw/cGhwICRtYXAtPnByaW50T25Mb2FkKCk7ID8+CiAgICAgICAgPC9ib2R5PgogICAgCiAgICAKICAgIGdldE9uTG9hZCgpCiAgICAtLS0tLS0tLS0tLQoKICAgICAgICBUaGlzIHJldHVybnMgdGhlIG1hcCBqYXZhc2NyaXB0IHRoYXQgZ29lcyBpbnRvIHRoZSA8aGVhZD48L2hlYWQ+IHRhZ3MuCiAgICAgICAgVG8gcHJpbnQgdGhlIG1hcCBqYXZhc2NyaXB0IGRpcmVjdGx5LCB1c2UgcHJpbnRNYXBKUygpLgogICAgICAgIAogICAgICAgIEV4YW1wbGU6CiAgICAgICAgCiAgICAgICAgPD9waHAKICAgICAgICAkb25sb2FkID0gJG1hcC0+Z2V0T25Mb2FkKCk7CiAgICAgICAgJG1hcGpzID0gJG1hcC0+Z2V0TWFwSlMoKTsKICAgICAgICAkbWFwID0gJG1hcC0+Z2V0TWFwKCk7CiAgICAgICAgPz4KICAgICAgICA8aGVhZD4KICAgICAgICA8P3BocCBlY2hvICRtYXBqczsgPz4KICAgICAgICA8L2hlYWQ+CiAgICAgICAgPGJvZHk+CiAgICAgICAgPD9waHAgZWNobyAkbWFwOyA/PgogICAgICAgIDw/cGhwIGVjaG8gJG9ubG9hZDsgPz4KICAgICAgICA8L2JvZHk+CgogICAgICAgIAogICAgICAgIAogICAgcHJpbnRNYXAoKQogICAgLS0tLS0tLS0tLQoKICAgICAgICBUaGlzIHByaW50cyB0aGUgbWFwIGh0bWwuCiAgICAgICAgVG8gcmV0dXJuIHRoZSBtYXAgaHRtbCBpbiBhIHZhcmlhYmxlLCB1c2UgZ2V0TWFwKCkuCiAgICAgICAgCiAgICAgICAgRXhhbXBsZToKICAgICAgICAKICAgICAgICA8aGVhZD4KICAgICAgICA8P3BocCAkbWFwLT5wcmludE1hcEpTKCk7ID8+CiAgICAgICAgPC9oZWFkPgogICAgICAgIDxib2R5IG9ubG9hZD0ib25Mb2FkKCkiPgogICAgICAgIDw/cGhwIGVjaG8gJG1hcC0+cHJpbnRNYXAoKTsgPz4KICAgICAgICA8L2JvZHk+CgogICAgICAgIEV4YW1wbGUgMiAodXNpbmcgcHJpbnRPbkxvYWQpOgogICAgICAgIAogICAgICAgIDxoZWFkPgogICAgICAgIDw/cGhwICRtYXAtPnByaW50TWFwSlMoKTsgPz4KICAgICAgICA8L2hlYWQ+CiAgICAgICAgPGJvZHk+CiAgICAgICAgPD9waHAgZWNobyAkbWFwLT5wcmludE1hcCgpOyA/PgogICAgICAgIDw/cGhwIGVjaG8gJG1hcC0+cHJpbnRPbkxvYWQoKTsgPz4KICAgICAgICA8L2JvZHk+CgogICAgCiAgICAKICAgIGdldE1hcCgpCiAgICAtLS0tLS0tLQoKICAgICAgICBUaGlzIHJldHVybnMgdGhlIG1hcCBodG1sIGluIGEgdmFyaWFibGUuCiAgICAgICAgVG8gcHJpbnQgdGhlIG1hcCBodG1sIGRpcmVjdGx5LCB1c2UgcHJpbnRNYXAoKS4KICAgICAgICAKICAgICAgICBFeGFtcGxlOgogICAgICAgIAogICAgICAgIDw/cGhwCiAgICAgICAgJG1hcCA9ICRtYXAtPmdldE1hcCgpOwogICAgICAgID8+CiAgICAgICAgPGJvZHkgb25sb2FkPSJvbkxvYWQoKSI+CiAgICAgICAgPD9waHAgZWNobyAkbWFwOyA/PgogICAgICAgIDwvYm9keT4KCgogICAgcHJpbnRTaWRlYmFyKCkKICAgIC0tLS0tLS0tLS0tLS0tCgogICAgICAgIFRoaXMgcHJpbnRzIHRoZSBzaWRlYmFyIGh0bWwuCiAgICAgICAgVG8gcmV0dXJuIHRoZSBzaWRlYmFyIGh0bWwgaW4gYSB2YXJpYWJsZSwgdXNlIGdldFNpZGViYXIoKS4KICAgICAgICAKICAgICAgICBFeGFtcGxlOgogICAgICAgIAogICAgICAgIDxib2R5IG9ubG9hZD0ib25Mb2FkKCkiPgogICAgICAgIDx0YWJsZT4KICAgICAgICAgPHRyPgogICAgICAgICAgPHRkPgogICAgICAgICAgIDw/cGhwICRtYXAtPnByaW50TWFwKCk7ID8+CiAgICAgICAgICA8L3RkPgogICAgICAgICAgPHRkPgogICAgICAgICAgIDw/cGhwICRtYXAtPnByaW50U2lkZWJhcigpOyA/PgogICAgICAgICAgPC90ZD4KICAgICAgICAgPC90cj4KICAgICAgICA8L3RhYmxlPgogICAgICAgIDwvYm9keT4KICAgIAogICAgCiAgICBnZXRTaWRlYmFyKCkKICAgIC0tLS0tLS0tLS0tLQoKICAgICAgICBUaGlzIHJldHVybnMgdGhlIHNpZGViYXIgaHRtbCBpbiBhIHZhcmlhYmxlLgogICAgICAgIFRvIHByaW50IHRoZSBzaWRiYXIgaHRtbCBkaXJlY3RseSwgdXNlIHByaW50U2lkZWJhcigpLgogICAgICAgIAogICAgICAgIEV4YW1wbGU6CiAgICAgICAgCiAgICAgICAgPD9waHAKICAgICAgICAkbWFwID0gJG1hcC0+Z2V0TWFwKCk7CiAgICAgICAgJHNpZGViYXIgPSAkbWFwLT5nZXRTaWRlYmFyKCk7CiAgICAgICAgPz4KICAgICAgICA8Ym9keSBvbmxvYWQ9Im9uTG9hZCgpIj4KICAgICAgICA8dGFibGU+CiAgICAgICAgIDx0cj4KICAgICAgICAgIDx0ZD4KICAgICAgICAgIDw/cGhwIGVjaG8gJG1hcDsgPz4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8dGQ+CiAgICAgICAgICAgPD9waHAgZWNobyAkc2lkZWJhcjsgPz4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgIDwvdHI+CiAgICAgICAgPC90YWJsZT4KICAgICAgICA8L2JvZHk+CiAgICAgICAgICAgICAgICAKICAgIAogICAgZ2V0R2VvY29kZSgkYWRkcmVzcykKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAKICAgICAgICBUaGlzIGxvb2tzIHVwIHRoZSBnZW9jb2RlIG9mIGFuIGFkZHJlc3MuIEl0IHdpbGwgdXNlIHRoZSBkYXRhYmFzZSBjYWNoZQogICAgICAgIGlmIGF2YWlsYWJsZS4gSWYgeW91IHdhbnQgdG8gbG9va3VwIGEgZ2VvY29kZSB3aXRob3V0IHVzaW5nIHRoZSBkYXRhYmFzZQogICAgICAgIGNhY2hlLCB1c2UgZ2VvR2V0Q29vcmRzKCkuIE5vdGU6IHRoaXMgZnVuY3Rpb24gaXMgdXNlZCBpbnRlcm5hbGx5IGJ5IHRoZQogICAgICAgIGxpYnJhcnksIGl0IGlzbid0IG5vcm1hbGx5IG5lY2Vzc2FyeSB1bmxlc3MgeW91IGhhdmUgYSBzcGVjaWZpYyBuZWVkIGFuZAogICAgICAgIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZy4KICAgICAgICAKICAgICAgICBFeGFtcGxlOgogICAgICAgIAogICAgICAgICRnZW9jb2RlID0gJG1hcC0+Z2V0R2VvY29kZSgnMjM3IFMgNzB0aCBzdWl0ZSAyMjAgTGluY29sbiBORSA2ODUxMCcpOwogICAgICAgIAogICAgICAgIGVjaG8gJGdlb2NvZGVbJ2xhdCddOwogICAgICAgIGVjaG8gJGdlb2NvZGVbJ2xvbiddOwogICAgICAgIAogICAgICAgIAogICAgZ2V0Q2FjaGUoJGFkZHJlc3MpCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0KICAgIAogICAgICAgIFRoaXMgd2lsbCBnZXQgdGhlIGNhY2hlZCBnZW9jb2RlIGluZm8gZm9yIGFuIGFkZHJlc3MgZnJvbSB0aGUgZGF0YWJhc2UKICAgICAgICBjYWNoZSwgb3IgcmV0dXJuIEZBTFNFIGlmIG5vdGhpbmcgaXMgYXZhaWxhYmxlLiBOb3RlOiB0aGlzIGZ1bmN0aW9uIGlzCiAgICAgICAgdXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSBsaWJyYXJ5LCBpdCBpc24ndCBub3JtYWxseSBuZWNlc3NhcnkgdW5sZXNzIHlvdQogICAgICAgIGhhdmUgYSBzcGVjaWZpYyBuZWVkIGFuZCB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcuCiAgICAgICAgCiAgICAgICAgRXhhbXBsZToKICAgICAgICAKICAgICAgICAkZ2VvY29kZSA9ICRtYXAtPmdldENhY2hlKCcyMzcgUyA3MHRoIHN1aXRlIDIyMCBMaW5jb2xuIE5FIDY4NTEwJyk7CiAgICAgICAgCiAgICAgICAgZWNobyAkZ2VvY29kZVsnbGF0J107CiAgICAgICAgZWNobyAkZ2VvY29kZVsnbG9uJ107CiAgICAgICAgCgogICAgcHV0Q2FjaGUoJGFkZHJlc3MsJGxvbiwkbGF0KQogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgCiAgICAgICAgVGhpcyB3aWxsIGluc2VydCBnZW9jb2RlIGluZm8gZm9yIHRoZSBnaXZlbiBhZGRyZXNzIGludG8gdGhlIGRhdGFiYXNlCiAgICAgICAgY2FjaGUuIE5vdGU6IHRoaXMgZnVuY3Rpb24gaXMgdXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSBsaWJyYXJ5LCBpdCBpc24ndAogICAgICAgIG5vcm1hbGx5IG5lY2Vzc2FyeSB1bmxlc3MgeW91IGhhdmUgYSBzcGVjaWZpYyBuZWVkIGFuZCB5b3Uga25vdyB3aGF0IHlvdQogICAgICAgIGFyZSBkb2luZy4KICAgICAgICAKICAgICAgICBFeGFtcGxlOgogICAgICAgIAogICAgICAgICRtYXAtPnB1dENhY2hlKCcyMzcgUyA3MHRoIHN1aXRlIDIyMCBMaW5jb2xuIE5FIDY4NTEwJywtOTYuNjI1MzgsNDAuODEyNDM4KTsKICAgICAgICAKCiAgICBnZW9HZXRDb29yZHMoJGFkZHJlc3MpCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAKICAgICAgICBUaGlzIGxvb2tzIHVwIHRoZSBnZW9jb2RlIG9mIGFuIGFkZHJlc3MgZGlyZWN0bHkgKG5vdCBmcm9tIGNhY2hlLikgTm90ZToKICAgICAgICB0aGlzIGZ1bmN0aW9uIGlzIHVzZWQgaW50ZXJuYWxseSBieSB0aGUgbGlicmFyeSwgaXQgaXNuJ3Qgbm9ybWFsbHkKICAgICAgICBuZWNlc3NhcnkgdW5sZXNzIHlvdSBoYXZlIGEgc3BlY2lmaWMgbmVlZCBhbmQgeW91IGtub3cgd2hhdCB5b3UgYXJlCiAgICAgICAgZG9pbmcuCiAgICAgICAgCiAgICAgICAgRXhhbXBsZToKICAgICAgICAKICAgICAgICAkZ2VvY29kZSA9ICRtYXAtPmdlb0dldENvb3JkcygnMjM3IFMgNzB0aCBzdWl0ZSAyMjAgTGluY29sbiBORSA2ODUxMCcpOwogICAgICAgIAogICAgICAgIGVjaG8gJGdlb2NvZGVbJ2xvbiddOwogICAgICAgIGVjaG8gJGdlb2NvZGVbJ2xhdCddOwoKICAgIGdlb0dldERpc3RhbmNlKCRsYXQxLCRsb24xLCRsYXQyLCRsb24yLCR1bml0KQogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICAgICAgIFRoaXMgZ2V0cyB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0b28gY29vcmluYXRlIHBvaW50cyB1c2luZyB0aGUgZ3JlYXQKICAgICAgICBjaXJjbGUgZm9ybXVsYS4gJHVuaXQgY2FuIGJlIE0gKG1pbGVzKSxLIChraWxvbWV0ZXJzKSxOIChuYXV0aWNhbAogICAgICAgIG1pbGVzKSxJIChpbmNoZXMpLCBvciBGIChmZWV0KS4gRGVmYXVsdCBpcyBNLiAgIAogICAgICAgIAogICAgICAgIEV4YW1wbGU6CiAgICAgICAgCiAgICAgICAgJGRpc3RhbmNlID0gJG1hcC0+Z2VvR2V0RGlzdGFuY2UoJGxhdDEsJGxvbjEsJGxhdDIsJGxvbjIsJHVuaXQpOwoKICAgICAgICAKICAgICAgICAKSU5URUdSQVRJTkcgR09PR0xFIE1BUFMgV0lUSCBTTUFSVFkgVEVNUExBVEVTCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAgIEludGVncmF0aW5nIHdpdGggU21hcnR5IGlzIGFzIHNpbXBsZSBhcyBhc3NpZ25pbmcgdGhlIG5lY2Vzc2FyeSB2YXJzIHRvIHRoZQogICAgdGVtcGxhdGUgYW5kIHRoZW4gZGlzcGxheWluZyB0aGVtLiBOb3RlOiBUaGlzIGV4YW1wbGUgZG9lcyBub3QgY292ZXIgaG93IHRvCiAgICBzZXR1cCBTbWFydHksIHBsZWFzZSB1c2UgdGhlIFNtYXJ0eSBkb2N1bWVudGF0aW9uLgogICAgCiAgICBFeGFtcGxlOgogICAgCiAgICA8P3BocAogICAgcmVxdWlyZSgnU21hcnR5LmNsYXNzLnBocCcpOwogICAgcmVxdWlyZSgnR29vZ2xlTWFwQVBJLmNsYXNzLnBocCcpOwoKICAgICRzbWFydHkgPSBuZXcgU21hcnR5KCk7CiAgICAkbWFwID0gbmV3IEdvb2dsZU1hcEFQSSgpOwogICAgCiAgICAvLyBzZXR1cCBkYXRhYmFzZSBmb3IgZ2VvY29kZSBjYWNoaW5nCiAgICAkbWFwLT5zZXREU04oJ215c3FsOi8vVVNFUjpQQVNTQGxvY2FsaG9zdC9HRU9DT0RFUycpOwogICAgLy8gZW50ZXIgWU9VUiBHb29nbGUgTWFwIEtleQogICAgJG1hcC0+c2V0QVBJS2V5KCdZT1VSR09PR0xFTUFQS0VZJyk7CiAgICAKICAgIC8vIGNyZWF0ZSBzb21lIG1hcCBtYXJrZXJzCiAgICAkbWFwLT5hZGRNYXJrZXJCeUFkZHJlc3MoJzYyMSBOIDQ4dGggU3QgIyA2IExpbmNvbG4gTkUgNjg1MDInLCdQSiBQaXp6YScsJzxiPlBKIFBpenphPC9iPicpOwogICAgJG1hcC0+YWRkTWFya2VyQnlBZGRyZXNzKCc4MjYgUCBTdCBMaW5jb2xuIE5FIDY4NTAyJywnT2xkIENoaWNhZ28nLCc8Yj5PbGQgQ2hpY2FnbzwvYj4nKTsKICAgICRtYXAtPmFkZE1hcmtlckJ5QWRkcmVzcygnMzQ1NyBIb2xkcmVnZSBTdCBMaW5jb2xuIE5FIDY4NTAyJywiVmFsZW50aW5vJ3MiLCI8Yj5WYWxlbnRpbm8nczwvYj4iKTsKICAgIAogICAgLy8gYXNzaWduIFNtYXJ0eSB2YXJpYWJsZXM7CiAgICAKICAgICRzbWFydHktPmFzc2lnbignZ29vZ2xlX21hcF9oZWFkZXInLCRtYXAtPmdldEhlYWRlckpTKCkpOwogICAgJHNtYXJ0eS0+YXNzaWduKCdnb29nbGVfbWFwX2pzJywkbWFwLT5nZXRNYXBKUygpKTsKICAgICRzbWFydHktPmFzc2lnbignZ29vZ2xlX21hcF9zaWRlYmFyJywkbWFwLT5nZXRTaWRlYmFyKCkpOwogICAgJHNtYXJ0eS0+YXNzaWduKCdnb29nbGVfbWFwJywkbWFwLT5nZXRNYXAoKSk7CiAgICAKICAgIC8vIGRpc3BsYXkgdGhlIHRlbXBsYXRlCiAgICAkc21hcnR5LT5kaXNwbGF5KCdpbmRleC50cGwnKTsKICAgID8+CiAgICAKICAgIGNvbnRlbnRzIG9mIGluZGV4LnRwbDoKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIAogICAgPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgogICAgPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbG5zOnY9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206dm1sIj4KICAgIDxoZWFkPgogICAgeyRnb29nbGVfbWFwX2hlYWRlcn0KICAgIHskZ29vZ2xlX21hcF9qc30KICAgIDwhLS0gbmVjZXNzYXJ5IGZvciBnb29nbGUgbWFwcyBwb2x5bGluZSBkcmF3aW5nIGluIElFIC0tPgogICAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KICAgICAgdlw6KiB7bGRlbGltfQogICAgICAgIGJlaGF2aW9yOnVybCgjZGVmYXVsdCNWTUwpOwogICAgIHtyZGVsaW19IAogICAgPC9zdHlsZT4KICAgIDwvaGVhZD4KICAgIDxib2R5IG9ubG9hZD0ib25Mb2FkKCkiPgogICAgPHRhYmxlPgogICAgICA8dHI+CiAgICAgICAgPHRkPnskZ29vZ2xlX21hcH08L3RkPgogICAgICAgIDx0ZD57JGdvb2dsZV9tYXBfc2lkZWJhcn08L3RkPgogICAgICA8L3RyPgogICAgPC90YWJsZT4KICAgIDwvYm9keT4KICAgIDwvaHRtbD4KCgpDUkVESVRTOgotLS0tLS0tLQoKRXhjZWxsZW50IEdvb2dsZSBNYXBzIHR1dG9yaWFscyBieSBNaWtlOgpodHRwOi8vd3d3LmVjb255bS5kZW1vbi5jby51ay9nb29nbGVtYXBzL2luZGV4Lmh0bQoKUGVvcGxlIHdobyBoYXZlIGhlbHBlZC9jb250cmlidXRlZDoKCkNoYXJsaWUgRGF3ZXMKSmFrZSBLcm9obgpDbGFyayBGcmVpZmVsZCA8Y2xhcmsgQVQgdXNlcnMgRE9UIHNvdXJjZWZvcmdlIERPVCBuZXQ+CkFuZ2VsbyBDb25mb3J0aQpKZXJvbWUgQ29tYmF6CmRyYWtvczcgKGZyb20gZm9ydW1zKQpubXdlYiAoZnJvbSBmb3J1bXMpCgpBbnlvbmUgSSBtaXNzZWQsIGRyb3AgbWUgYSBsaW5lIQoKTW9udGUgT2hydCA8bW9udGUgW0FUXSBvaHJ0IFtET1RdIGNvbT4K]]></data>
	</file>
	<file>
	  <filename>/lib/package.xml</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHBhY2thZ2UgcGFja2FnZXJ2ZXJzaW9uPSIxLjUuNCIgdmVyc2lvbj0iMi4wIiB4bWxucz0iaHR0cDovL3BlYXIucGhwLm5ldC9kdGQvcGFja2FnZS0yLjAiIHhtbG5zOnRhc2tzPSJodHRwOi8vcGVhci5waHAubmV0L2R0ZC90YXNrcy0xLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3BlYXIucGhwLm5ldC9kdGQvdGFza3MtMS4wIGh0dHA6Ly9wZWFyLnBocC5uZXQvZHRkL3Rhc2tzLTEuMC54c2QgaHR0cDovL3BlYXIucGhwLm5ldC9kdGQvcGFja2FnZS0yLjAgaHR0cDovL3BlYXIucGhwLm5ldC9kdGQvcGFja2FnZS0yLjAueHNkIj4KIDxuYW1lPkRCPC9uYW1lPgogPGNoYW5uZWw+cGVhci5waHAubmV0PC9jaGFubmVsPgogPHN1bW1hcnk+RGF0YWJhc2UgQWJzdHJhY3Rpb24gTGF5ZXI8L3N1bW1hcnk+CiA8ZGVzY3JpcHRpb24+REIgaXMgYSBkYXRhYmFzZSBhYnN0cmFjdGlvbiBsYXllciBwcm92aWRpbmc6CiogYW4gT08tc3R5bGUgcXVlcnkgQVBJCiogcG9ydGFiaWxpdHkgZmVhdHVyZXMgdGhhdCBtYWtlIHByb2dyYW1zIHdyaXR0ZW4gZm9yIG9uZSBEQk1TIHdvcmsgd2l0aCBvdGhlciBEQk1TJmFwb3M7cwoqIGEgRFNOIChkYXRhIHNvdXJjZSBuYW1lKSBmb3JtYXQgZm9yIHNwZWNpZnlpbmcgZGF0YWJhc2Ugc2VydmVycwoqIHByZXBhcmUvZXhlY3V0ZSAoYmluZCkgZW11bGF0aW9uIGZvciBkYXRhYmFzZXMgdGhhdCBkb24mYXBvczt0IHN1cHBvcnQgaXQgbmF0aXZlbHkKKiBhIHJlc3VsdCBvYmplY3QgZm9yIGVhY2ggcXVlcnkgcmVzcG9uc2UKKiBwb3J0YWJsZSBlcnJvciBjb2RlcwoqIHNlcXVlbmNlIGVtdWxhdGlvbgoqIHNlcXVlbnRpYWwgYW5kIG5vbi1zZXF1ZW50aWFsIHJvdyBmZXRjaGluZyBhcyB3ZWxsIGFzIGJ1bGsgZmV0Y2hpbmcKKiBmb3JtYXRzIGZldGNoZWQgcm93cyBhcyBhc3NvY2lhdGl2ZSBhcnJheXMsIG9yZGVyZWQgYXJyYXlzIG9yIG9iamVjdHMKKiByb3cgbGltaXQgc3VwcG9ydAoqIHRyYW5zYWN0aW9ucyBzdXBwb3J0CiogdGFibGUgaW5mb3JtYXRpb24gaW50ZXJmYWNlCiogRG9jQm9vayBhbmQgcGhwRG9jdW1lbnRvciBBUEkgZG9jdW1lbnRhdGlvbgoKREIgbGF5ZXJzIGl0c2VsZiBvbiB0b3Agb2YgUEhQJmFwb3M7cyBleGlzdGluZwpkYXRhYmFzZSBleHRlbnNpb25zLgoKRHJpdmVycyBmb3IgdGhlIGZvbGxvd2luZyBleHRlbnNpb25zIHBhc3MKdGhlIGNvbXBsZXRlIHRlc3Qgc3VpdGUgYW5kIHByb3ZpZGUKaW50ZXJjaGFuZ2VhYmlsaXR5IHdoZW4gYWxsIG9mIERCJmFwb3M7cwpwb3J0YWJpbGl0eSBvcHRpb25zIGFyZSBlbmFibGVkOgoKICBmYnNxbCwgaWJhc2UsIGluZm9ybWl4LCBtc3FsLCBtc3NxbCwKICBteXNxbCwgbXlzcWxpLCBvY2k4LCBvZGJjLCBwZ3NxbCwKICBzcWxpdGUgYW5kIHN5YmFzZS4KClRoZXJlIGlzIGFsc28gYSBkcml2ZXIgZm9yIHRoZSBkYmFzZQpleHRlbnNpb24sIGJ1dCBpdCBjYW4mYXBvczt0IGJlIHVzZWQKaW50ZXJjaGFuZ2VhYmx5IGJlY2F1c2UgZGJhc2UgZG9lc24mYXBvczt0CnN1cHBvcnQgbWFueSBzdGFuZGFyZCBEQk1TIGZlYXR1cmVzLgoKREIgaXMgY29tcGF0aWJsZSB3aXRoIGJvdGggUEhQIDQgYW5kIFBIUCA1LjwvZGVzY3JpcHRpb24+CiA8bGVhZD4KICA8bmFtZT5EYW5pZWwgQ29udmlzc29yPC9uYW1lPgogIDx1c2VyPmRhbmllbGM8L3VzZXI+CiAgPGVtYWlsPmRhbmllbGNAcGhwLm5ldDwvZW1haWw+CiAgPGFjdGl2ZT55ZXM8L2FjdGl2ZT4KIDwvbGVhZD4KIDxsZWFkPgogIDxuYW1lPkFkYW0gSGFydmV5PC9uYW1lPgogIDx1c2VyPmFoYXJ2ZXk8L3VzZXI+CiAgPGVtYWlsPmFoYXJ2ZXlAcGhwLm5ldDwvZW1haWw+CiAgPGFjdGl2ZT55ZXM8L2FjdGl2ZT4KIDwvbGVhZD4KIDxkZXZlbG9wZXI+CiAgPG5hbWU+U3RpZyBCYWtrZW48L25hbWU+CiAgPHVzZXI+c3NiPC91c2VyPgogIDxlbWFpbD5zdGlnQHBocC5uZXQ8L2VtYWlsPgogIDxhY3RpdmU+eWVzPC9hY3RpdmU+CiA8L2RldmVsb3Blcj4KIDxkZXZlbG9wZXI+CiAgPG5hbWU+VG9tYXMgVi5WLkNveDwvbmFtZT4KICA8dXNlcj5jb3g8L3VzZXI+CiAgPGVtYWlsPmNveEBpZGVjbmV0LmNvbTwvZW1haWw+CiAgPGFjdGl2ZT55ZXM8L2FjdGl2ZT4KIDwvZGV2ZWxvcGVyPgogPGRhdGU+MjAwNy0wNi0yOTwvZGF0ZT4KIDx0aW1lPjIwOjQ2OjM0PC90aW1lPgogPHZlcnNpb24+CiAgPHJlbGVhc2U+MS43LjEyPC9yZWxlYXNlPgogIDxhcGk+MS43LjEyPC9hcGk+CiA8L3ZlcnNpb24+CiA8c3RhYmlsaXR5PgogIDxyZWxlYXNlPnN0YWJsZTwvcmVsZWFzZT4KICA8YXBpPnN0YWJsZTwvYXBpPgogPC9zdGFiaWxpdHk+CiA8bGljZW5zZSB1cmk9Imh0dHA6Ly93d3cucGhwLm5ldC9saWNlbnNlIj5QSFAgTGljZW5zZTwvbGljZW5zZT4KIDxub3Rlcz5UaGlzIHJlbGVhc2Ugb2YgREIgZml4ZXMgYW4gaXNzdWUgdGhhdCBwcmV2ZW50ZWQgUG9zdGdyZVNRTCB1c2VycyBmcm9tIGVzY2FwaW5nIHZhbHVlcyB3aXRoIFBIUCA1LjIuCgpQbGVhc2Ugbm90ZSB0aGF0IHRoaXMgdmVyc2lvbiBvZiBEQiBoYXMgcmVtb3ZlZCB0aGUgdmVyc2lvbiAxIHBhY2thZ2UueG1sIGZpbGUuIENvbnNlcXVlbnRseSwgUEVBUiAxLjQgb3IgbGF0ZXIgbXVzdCBiZSB1c2VkIHRvIGluc3RhbGwgdGhpcyB2ZXJzaW9uIG9mIERCIGFuZCBhbnkgZnV0dXJlIHZlcnNpb25zLgoKb2NpODoKKiBBZGRlZCB2aWV3IHN1cHBvcnQgdG8gZ2V0U3BlY2lhbFF1ZXJ5KCkgZm9yIGZlYXR1cmUgcGFyaXR5IHdpdGggb3RoZXIgYmFja2VuZHMuICBSZXF1ZXN0IDExMTEwLgoKcGdzcWw6CiogQWRkZWQgc2NoZW1hLnZpZXdzIHN1cHBvcnQgdG8gZ2V0U3BlY2lhbFF1ZXJ5KCkgdG8gYXZvaWQgZGlzYWR2YW50YWdpbmcgdmlld3Mgd2l0aGluIHNjaGVtYXMuICBSZXF1ZXN0IDExMDgwLgoqIENoYW5nZWQgcGFyYW1ldGVyIGVzY2FwaW5nIHRvIGNvcnJlY3RseSBwYXNzIHVwIHRoZSBEQiBjb25uZWN0aW9uLiAgQnVnIDExMTI1LgoKdGVzdHM6CiogVXBkYXRlZCBESVZaRVJPIHRlc3RzIHRvIHJlZmxlY3Qgd2hpY2ggREIgYmFja2VuZHMgYWN0dWFsbHkgcmV0dXJuIGVycm9ycyB1cG9uIGRpdmlzaW9uIGJ5IHplcm8uICBCdWcgMTA4OTQuPC9ub3Rlcz4KIDxjb250ZW50cz4KICA8ZGlyIG5hbWU9Ii8iPgogICA8ZmlsZSBtZDVzdW09ImYxZGY3OThkMGY4M2QzZjUyYmVlMGVmZWQ4NGY3NGJkIiBuYW1lPSJEQi9jb21tb24ucGhwIiByb2xlPSJwaHAiPgogICAgPHRhc2tzOnJlcGxhY2UgZnJvbT0iQHBhY2thZ2VfdmVyc2lvbkAiIHRvPSJ2ZXJzaW9uIiB0eXBlPSJwYWNrYWdlLWluZm8iIC8+CiAgIDwvZmlsZT4KICAgPGZpbGUgbWQ1c3VtPSJhZjhkNTNmNTAyNTRiY2IzMDYyNTg2ZDQzZWUyZDliZCIgbmFtZT0iREIvZGJhc2UucGhwIiByb2xlPSJwaHAiPgogICAgPHRhc2tzOnJlcGxhY2UgZnJvbT0iQHBhY2thZ2VfdmVyc2lvbkAiIHRvPSJ2ZXJzaW9uIiB0eXBlPSJwYWNrYWdlLWluZm8iIC8+CiAgIDwvZmlsZT4KICAgPGZpbGUgbWQ1c3VtPSIwYTk1OGQwODBjZmFkYTJlMDcyYWUxMWY0MzgzNWZkNCIgbmFtZT0iREIvZmJzcWwucGhwIiByb2xlPSJwaHAiPgogICAgPHRhc2tzOnJlcGxhY2UgZnJvbT0iQHBhY2thZ2VfdmVyc2lvbkAiIHRvPSJ2ZXJzaW9uIiB0eXBlPSJwYWNrYWdlLWluZm8iIC8+CiAgIDwvZmlsZT4KICAgPGZpbGUgbWQ1c3VtPSJmYmJhOGM1ZmJlODZhMzk5N2Y0ZmM3YjRiZDU5MzM2MiIgbmFtZT0iREIvaWJhc2UucGhwIiByb2xlPSJwaHAiPgogICAgPHRhc2tzOnJlcGxhY2UgZnJvbT0iQHBhY2thZ2VfdmVyc2lvbkAiIHRvPSJ2ZXJzaW9uIiB0eXBlPSJwYWNrYWdlLWluZm8iIC8+CiAgIDwvZmlsZT4KICAgPGZpbGUgbWQ1c3VtPSJkOTBjZTk1ZDYyOTM0NGU1YzI1N2NjMzczMjJhNjM3ZSIgbmFtZT0iREIvaWZ4LnBocCIgcm9sZT0icGhwIj4KICAgIDx0YXNrczpyZXBsYWNlIGZyb209IkBwYWNrYWdlX3ZlcnNpb25AIiB0bz0idmVyc2lvbiIgdHlwZT0icGFja2FnZS1pbmZvIiAvPgogICA8L2ZpbGU+CiAgIDxmaWxlIG1kNXN1bT0iZmVjYTMyNTkxMGNlYzkwYmMxNmEzMjlhMDk2N2IxM2QiIG5hbWU9IkRCL21zcWwucGhwIiByb2xlPSJwaHAiPgogICAgPHRhc2tzOnJlcGxhY2UgZnJvbT0iQHBhY2thZ2VfdmVyc2lvbkAiIHRvPSJ2ZXJzaW9uIiB0eXBlPSJwYWNrYWdlLWluZm8iIC8+CiAgIDwvZmlsZT4KICAgPGZpbGUgbWQ1c3VtPSJiNGFiMzZhNmEwYWNmMjA5MGE0YThkNzAzMDljM2QyMyIgbmFtZT0iREIvbXNzcWwucGhwIiByb2xlPSJwaHAiPgogICAgPHRhc2tzOnJlcGxhY2UgZnJvbT0iQHBhY2thZ2VfdmVyc2lvbkAiIHRvPSJ2ZXJzaW9uIiB0eXBlPSJwYWNrYWdlLWluZm8iIC8+CiAgIDwvZmlsZT4KICAgPGZpbGUgbWQ1c3VtPSIwYTNkMTAzNDlkNzQwZWY0NzI2ZDdhNTVkNTc3NDU0MSIgbmFtZT0iREIvbXlzcWwucGhwIiByb2xlPSJwaHAiPgogICAgPHRhc2tzOnJlcGxhY2UgZnJvbT0iQHBhY2thZ2VfdmVyc2lvbkAiIHRvPSJ2ZXJzaW9uIiB0eXBlPSJwYWNrYWdlLWluZm8iIC8+CiAgIDwvZmlsZT4KICAgPGZpbGUgbWQ1c3VtPSI2NmYwYTAwZTZlMmI2ODcxYTQyYWI3MTY0NDdkNjAzNSIgbmFtZT0iREIvbXlzcWxpLnBocCIgcm9sZT0icGhwIj4KICAgIDx0YXNrczpyZXBsYWNlIGZyb209IkBwYWNrYWdlX3ZlcnNpb25AIiB0bz0idmVyc2lvbiIgdHlwZT0icGFja2FnZS1pbmZvIiAvPgogICA8L2ZpbGU+CiAgIDxmaWxlIG1kNXN1bT0iZjI1MDM4YzgyNjY4ZmY0YjBjMGJlYWJhNmM1ZThjZjkiIG5hbWU9IkRCL29jaTgucGhwIiByb2xlPSJwaHAiPgogICAgPHRhc2tzOnJlcGxhY2UgZnJvbT0iQHBhY2thZ2VfdmVyc2lvbkAiIHRvPSJ2ZXJzaW9uIiB0eXBlPSJwYWNrYWdlLWluZm8iIC8+CiAgIDwvZmlsZT4KICAgPGZpbGUgbWQ1c3VtPSI4ODhhMmI0ODYwY2NkNmVkMjIxMWU0YjYxYWFmMzQ5MyIgbmFtZT0iREIvb2RiYy5waHAiIHJvbGU9InBocCI+CiAgICA8dGFza3M6cmVwbGFjZSBmcm9tPSJAcGFja2FnZV92ZXJzaW9uQCIgdG89InZlcnNpb24iIHR5cGU9InBhY2thZ2UtaW5mbyIgLz4KICAgPC9maWxlPgogICA8ZmlsZSBtZDVzdW09Ijc2YzFiNjhiMTUyYzc4MmNlYmZmMTJhMGVlNzEzMjdlIiBuYW1lPSJEQi9wZ3NxbC5waHAiIHJvbGU9InBocCI+CiAgICA8dGFza3M6cmVwbGFjZSBmcm9tPSJAcGFja2FnZV92ZXJzaW9uQCIgdG89InZlcnNpb24iIHR5cGU9InBhY2thZ2UtaW5mbyIgLz4KICAgPC9maWxlPgogICA8ZmlsZSBtZDVzdW09ImY4MWE2NzFlYmVhYmIxOWFkMWM4YTE2OGRjZDBlYWExIiBuYW1lPSJEQi9zcWxpdGUucGhwIiByb2xlPSJwaHAiPgogICAgPHRhc2tzOnJlcGxhY2UgZnJvbT0iQHBhY2thZ2VfdmVyc2lvbkAiIHRvPSJ2ZXJzaW9uIiB0eXBlPSJwYWNrYWdlLWluZm8iIC8+CiAgIDwvZmlsZT4KICAgPGZpbGUgbWQ1c3VtPSI4Y2IxZGVhYWI2Njg1ZDhlNDQyNDc5NGY3MWYwOWZiZSIgbmFtZT0iREIvc3RvcmFnZS5waHAiIHJvbGU9InBocCI+CiAgICA8dGFza3M6cmVwbGFjZSBmcm9tPSJAcGFja2FnZV92ZXJzaW9uQCIgdG89InZlcnNpb24iIHR5cGU9InBhY2thZ2UtaW5mbyIgLz4KICAgPC9maWxlPgogICA8ZmlsZSBtZDVzdW09IjQ3MWFkNjFmYjExZWFiNzIxNDczZjI0ODM3ODNmMGJjIiBuYW1lPSJEQi9zeWJhc2UucGhwIiByb2xlPSJwaHAiPgogICAgPHRhc2tzOnJlcGxhY2UgZnJvbT0iQHBhY2thZ2VfdmVyc2lvbkAiIHRvPSJ2ZXJzaW9uIiB0eXBlPSJwYWNrYWdlLWluZm8iIC8+CiAgIDwvZmlsZT4KICAgPGZpbGUgbWQ1c3VtPSI2NTFhNjQ0YjZmMzQ5NWZjMzkyNzlkNzViODA5OTM3MiIgbmFtZT0iZG9jL0lERUFTIiByb2xlPSJkb2MiIC8+CiAgIDxmaWxlIG1kNXN1bT0iOGM1Nzc5ODcxZTA3NzIwYTAzMjYxNTE3NzQwM2I2OTEiIG5hbWU9ImRvYy9NQUlOVEFJTkVSUyIgcm9sZT0iZG9jIiAvPgogICA8ZmlsZSBtZDVzdW09IjMwYmM0Y2VlY2NkNTE0MTNhYjgxZmE5OGMxZmI5YWE4IiBuYW1lPSJkb2MvU1RBVFVTIiByb2xlPSJkb2MiIC8+CiAgIDxmaWxlIG1kNXN1bT0iMzFmMjc2ZDZmZjcxMGExZjA0OGM1MGNkNTMzZmZlNWMiIG5hbWU9ImRvYy9URVNURVJTIiByb2xlPSJkb2MiIC8+CiAgIDxmaWxlIG1kNXN1bT0iODFmM2NiMDE0NDIxNDhmZjc1YTc1MmY2OGI5NDZkZjAiIG5hbWU9InRlc3RzL2RyaXZlci8wMWNvbm5lY3QucGhwdCIgcm9sZT0idGVzdCIgLz4KICAgPGZpbGUgbWQ1c3VtPSJmNjFiZDdhYTY0ZWNjMzdhNjUwZWU0MDZlNjczOGVkNyIgbmFtZT0idGVzdHMvZHJpdmVyLzAyZmV0Y2gucGhwdCIgcm9sZT0idGVzdCIgLz4KICAgPGZpbGUgbWQ1c3VtPSJiNjcxZWZlYWM5ZmQzNGI4MzMwOWRlODQxMzUzMTMxNyIgbmFtZT0idGVzdHMvZHJpdmVyLzAzc2ltcGxlcXVlcnkucGhwdCIgcm9sZT0idGVzdCIgLz4KICAgPGZpbGUgbWQ1c3VtPSJhNWVjZjQ3M2Y2NDgwMjJhZjVkYzlmYmIyZjMzZTM3MSIgbmFtZT0idGVzdHMvZHJpdmVyLzA0bnVtY29scy5waHB0IiByb2xlPSJ0ZXN0IiAvPgogICA8ZmlsZSBtZDVzdW09IjFiNTJlZGIzNDk3OGE4OTI5ZjQzMTViN2VjMmY1NDQ1IiBuYW1lPSJ0ZXN0cy9kcml2ZXIvMDVzZXF1ZW5jZXMucGhwdCIgcm9sZT0idGVzdCIgLz4KICAgPGZpbGUgbWQ1c3VtPSI4ZDY1MWQyZGE1ODA2MTllZDVhYmVhYWE5ZTFmNzFhZCIgbmFtZT0idGVzdHMvZHJpdmVyLzA2cHJlcGV4ZWMucGhwdCIgcm9sZT0idGVzdCIgLz4KICAgPGZpbGUgbWQ1c3VtPSJiMmU1ZWJlMjg5MTZlNjNkODUwMjg0NWQ1OGY3NGQ0OSIgbmFtZT0idGVzdHMvZHJpdmVyLzA4YWZmZWN0ZWRyb3dzLnBocHQiIHJvbGU9InRlc3QiIC8+CiAgIDxmaWxlIG1kNXN1bT0iN2VmZWU2OTUwOTZlMGNmNmUyNDNlNTU5MDkxNWI2ZmMiIG5hbWU9InRlc3RzL2RyaXZlci8wOW51bXJvd3MucGhwdCIgcm9sZT0idGVzdCIgLz4KICAgPGZpbGUgbWQ1c3VtPSJiMmU0ODFmYzZmMzEwZGI0MWUyNDlhMWU1M2YzNTNjMiIgbmFtZT0idGVzdHMvZHJpdmVyLzEwZXJyb3JtYXAucGhwdCIgcm9sZT0idGVzdCIgLz4KICAgPGZpbGUgbWQ1c3VtPSIxYWQwMDdiMDY5YmE0ZWU4YWY0ZTBmYWEyZDFkMzhlOSIgbmFtZT0idGVzdHMvZHJpdmVyLzExdHJhbnNhY3Rpb25zLnBocHQiIHJvbGU9InRlc3QiIC8+CiAgIDxmaWxlIG1kNXN1bT0iYjQ0MDUzNmJhYTM1ZGNkN2Y0MGY0MWYyNmEwYmExODQiIG5hbWU9InRlc3RzL2RyaXZlci8xM2xpbWl0LnBocHQiIHJvbGU9InRlc3QiIC8+CiAgIDxmaWxlIG1kNXN1bT0iM2NhM2VlMTJjZmU1OWExNDZjYWEyMWU2NWM0YjMyZTEiIG5hbWU9InRlc3RzL2RyaXZlci8xNGZldGNobW9kZV9vYmplY3QucGhwdCIgcm9sZT0idGVzdCIgLz4KICAgPGZpbGUgbWQ1c3VtPSIyY2Y4NTM3NjZhMWMxZGMyMWYwYjM4OTg4Y2Q1YTQwNiIgbmFtZT0idGVzdHMvZHJpdmVyLzE1cXVvdGUucGhwdCIgcm9sZT0idGVzdCIgLz4KICAgPGZpbGUgbWQ1c3VtPSI1MGI2YWQwY2JlYTY0OTg1NGVhNGUwOWU1MjRkMjY0MSIgbmFtZT0idGVzdHMvZHJpdmVyLzE2dGFibGVpbmZvLnBocHQiIHJvbGU9InRlc3QiIC8+CiAgIDxmaWxlIG1kNXN1bT0iN2Q2OTc3MTY4OTM1Yjk4MTU3NjBkZTFiZDBmMzYzYzYiIG5hbWU9InRlc3RzL2RyaXZlci8xN3F1ZXJ5LnBocHQiIHJvbGU9InRlc3QiIC8+CiAgIDxmaWxlIG1kNXN1bT0iMDk2Zjc2NGI4NTE5ZTE4YzBhZDJlZWFlZjYyMjllZTEiIG5hbWU9InRlc3RzL2RyaXZlci8xOGdldC5waHB0IiByb2xlPSJ0ZXN0IiAvPgogICA8ZmlsZSBtZDVzdW09ImRlMzU0ZDVmZTMyZjBiOWZiYmNhZWQxYmFkYTdlN2EyIiBuYW1lPSJ0ZXN0cy9kcml2ZXIvMTlnZXRsaXN0b2YucGhwdCIgcm9sZT0idGVzdCIgLz4KICAgPGZpbGUgbWQ1c3VtPSI0NjU1ZDI3MjIxMWRjNWQ2MDkwNDc5NmQ2ZDdlMWY5OSIgbmFtZT0idGVzdHMvZHJpdmVyLzIwbG9jYWxlLnBocHQiIHJvbGU9InRlc3QiIC8+CiAgIDxmaWxlIG1kNXN1bT0iMjgxMDU1ZjBkNWFiNTA3NzE4YTJjNzUwMWVkYjNhMTgiIG5hbWU9InRlc3RzL2RyaXZlci8yMWZyZWVSZXN1bHQucGhwdCIgcm9sZT0idGVzdCIgLz4KICAgPGZpbGUgbWQ1c3VtPSI0MTgwYTVkMDM4ZDQxYTEyNjJkMWNjNDE5NTFmMGYzZCIgbmFtZT0idGVzdHMvZHJpdmVyL2Nvbm5lY3QuaW5jIiByb2xlPSJ0ZXN0IiAvPgogICA8ZmlsZSBtZDVzdW09IjI2YjQyYTExMGJiN2VlNDNiNWJjZWVmNjhmZDIxNWU2IiBuYW1lPSJ0ZXN0cy9kcml2ZXIvZHJvcHRhYmxlLmluYyIgcm9sZT0idGVzdCIgLz4KICAgPGZpbGUgbWQ1c3VtPSI3MDQwNDA0Y2UwZjZjYmY2N2QyNDMxNzU4MjhkZmJhMSIgbmFtZT0idGVzdHMvZHJpdmVyL21rdGFibGUuaW5jIiByb2xlPSJ0ZXN0IiAvPgogICA8ZmlsZSBtZDVzdW09IjRhZjljZmY4NDFlMTRmMWM5NGUzNTgzNDY3NDdlN2I2IiBuYW1lPSJ0ZXN0cy9kcml2ZXIvbXVsdGljb25uZWN0LnBocCIgcm9sZT0idGVzdCIgLz4KICAgPGZpbGUgbWQ1c3VtPSI3MDIzZDk3OWU4YmNiOTRhOTNkNDg1OTdkODY0ZmViMyIgbmFtZT0idGVzdHMvZHJpdmVyL3J1bi5jdnMiIHJvbGU9InRlc3QiIC8+CiAgIDxmaWxlIG1kNXN1bT0iYTdlZTI3ZmYwYTJhYWNmMGVmOTA2ZWVhODU2OTcxOGYiIG5hbWU9InRlc3RzL2RyaXZlci9zZXR1cC5pbmMuY3ZzIiByb2xlPSJ0ZXN0Ij4KICAgIDx0YXNrczpyZXBsYWNlIGZyb209IkBpbmNsdWRlX3BhdGhAIiB0bz0icGhwX2RpciIgdHlwZT0icGVhci1jb25maWciIC8+CiAgIDwvZmlsZT4KICAgPGZpbGUgbWQ1c3VtPSIzMDE2ZGJhNDkxOGEzMjJkNDQwZGJiNjg4YmNlMDI0YSIgbmFtZT0idGVzdHMvZHJpdmVyL3NraXBpZi5pbmMiIHJvbGU9InRlc3QiIC8+CiAgIDxmaWxlIG1kNXN1bT0iMmU3Zjk4NzUwM2I4YjVlMmE3ZmM0YzNjMzBlNzljMTMiIG5hbWU9InRlc3RzL2RiX2Vycm9yLnBocHQiIHJvbGU9InRlc3QiIC8+CiAgIDxmaWxlIG1kNXN1bT0iNWY1MDY4YThhMWEzNzQyZmYwODEwYmU2MWI1NzI4OGQiIG5hbWU9InRlc3RzL2RiX2Vycm9yMi5waHB0IiByb2xlPSJ0ZXN0IiAvPgogICA8ZmlsZSBtZDVzdW09Ijc5ZTg4ZTZkYjBjMjVjYTFlZTVlMmFhYzM1YTI0ZDZjIiBuYW1lPSJ0ZXN0cy9kYl9mYWN0b3J5LnBocHQiIHJvbGU9InRlc3QiIC8+CiAgIDxmaWxlIG1kNXN1bT0iZGE3NGU3OTM5ZmUyMmQ5YzUyNjkzOWU5NzhhY2U2MWMiIG5hbWU9InRlc3RzL2RiX2lzbWFuaXAucGhwdCIgcm9sZT0idGVzdCIgLz4KICAgPGZpbGUgbWQ1c3VtPSJhNDcwZWExM2NiNzRkODg2MTlmMDhiMTMwODA1NDk3NSIgbmFtZT0idGVzdHMvZGJfcGFyc2Vkc24ucGhwdCIgcm9sZT0idGVzdCIgLz4KICAgPGZpbGUgbWQ1c3VtPSI1YWJhZGJhNTAyZmM0NGI5YjcwOTg1NmQ2MTRiMTJhZSIgbmFtZT0idGVzdHMvZXJyb3JzLmluYyIgcm9sZT0idGVzdCIgLz4KICAgPGZpbGUgbWQ1c3VtPSIyY2RhZDNlNjJjMDU5NDE0ZGRhYjhhNDEwNzgxNDU4YyIgbmFtZT0idGVzdHMvZmV0Y2htb2Rlcy5pbmMiIHJvbGU9InRlc3QiIC8+CiAgIDxmaWxlIG1kNXN1bT0iMzczMmVkYmUxYzE1OWIxNmQ4MmMwY2VmYjIzZmIyODMiIG5hbWU9InRlc3RzL2ZldGNobW9kZV9vYmplY3QuaW5jIiByb2xlPSJ0ZXN0IiAvPgogICA8ZmlsZSBtZDVzdW09ImYzZDY2M2ZkZjE0NWU1YmIzNzk3Yzk2YjNkMGRjZjQ3IiBuYW1lPSJ0ZXN0cy9pbmNsdWRlLmluYyIgcm9sZT0idGVzdCI+CiAgICA8dGFza3M6cmVwbGFjZSBmcm9tPSJAaW5jbHVkZV9wYXRoQCIgdG89InBocF9kaXIiIHR5cGU9InBlYXItY29uZmlnIiAvPgogICA8L2ZpbGU+CiAgIDxmaWxlIG1kNXN1bT0iYjEwYmI0MjJjNzQzMmJjNzU3YThkYWI4ZTg3ODQ2YzMiIG5hbWU9InRlc3RzL2xpbWl0LmluYyIgcm9sZT0idGVzdCIgLz4KICAgPGZpbGUgbWQ1c3VtPSI4YjU2ZTk4NzdjOGUzYTYyNzQxYjE5MjU1NzQ3MWMyZCIgbmFtZT0idGVzdHMvbnVtY29scy5pbmMiIHJvbGU9InRlc3QiIC8+CiAgIDxmaWxlIG1kNXN1bT0iNGI3Mjg1YTNiMTM3MGM1MjI0ZDA0YzcxZDc5MmQwMjYiIG5hbWU9InRlc3RzL251bXJvd3MuaW5jIiByb2xlPSJ0ZXN0IiAvPgogICA8ZmlsZSBtZDVzdW09ImFkYWM5ZGVlNmUzMzliYmI0NmVlMGVlNDFkYWM3ZTMxIiBuYW1lPSJ0ZXN0cy9wcmVwZXhlLmluYyIgcm9sZT0idGVzdCIgLz4KICAgPGZpbGUgbWQ1c3VtPSJhYWM0NDRmNDdlZDNhZDE2NDIwMTM1MzlkOTlmNTc1NyIgbmFtZT0idGVzdHMvcnVuLmN2cyIgcm9sZT0idGVzdCIgLz4KICAgPGZpbGUgbWQ1c3VtPSIwYTNiNmMxNGZiM2E4Y2I2ZTNjZDhlY2U5NzM2ZTllYiIgbmFtZT0idGVzdHMvc2VxdWVuY2VzLmluYyIgcm9sZT0idGVzdCIgLz4KICAgPGZpbGUgbWQ1c3VtPSI4Zjc3M2ViMTBlZTE5MTQ1OTM3Mjk2ZGNhNjBkMjk2ZSIgbmFtZT0idGVzdHMvc2ltcGxlcXVlcnkuaW5jIiByb2xlPSJ0ZXN0IiAvPgogICA8ZmlsZSBtZDVzdW09IjVmNmY2YjYyZjk3NzliOTdhZGY1N2JkYmJjZmZlNDUwIiBuYW1lPSJ0ZXN0cy9za2lwaWYuaW5jIiByb2xlPSJ0ZXN0IiAvPgogICA8ZmlsZSBtZDVzdW09ImRkMmU1MWIyMjMwYjIxMTBmNmNjMzI3YmRjZjFjOTkyIiBuYW1lPSJ0ZXN0cy90cmFuc2FjdGlvbnMuaW5jIiByb2xlPSJ0ZXN0IiAvPgogICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbWQ1c3VtPSJkOGI4YTVmYzcwZmQzZjVkZjM2NjkzZTYyYjcyZjdmMyIgbmFtZT0iREIucGhwIiByb2xlPSJwaHAiPgogICAgPHRhc2tzOnJlcGxhY2UgZnJvbT0iQHBhY2thZ2VfdmVyc2lvbkAiIHRvPSJ2ZXJzaW9uIiB0eXBlPSJwYWNrYWdlLWluZm8iIC8+CiAgIDwvZmlsZT4KICA8L2Rpcj4KIDwvY29udGVudHM+CiA8ZGVwZW5kZW5jaWVzPgogIDxyZXF1aXJlZD4KICAgPHBocD4KICAgIDxtaW4+NC4yLjA8L21pbj4KICAgPC9waHA+CiAgIDxwZWFyaW5zdGFsbGVyPgogICAgPG1pbj4xLjQuMGIxPC9taW4+CiAgIDwvcGVhcmluc3RhbGxlcj4KICAgPHBhY2thZ2U+CiAgICA8bmFtZT5QRUFSPC9uYW1lPgogICAgPGNoYW5uZWw+cGVhci5waHAubmV0PC9jaGFubmVsPgogICAgPG1pbj4xLjBiMTwvbWluPgogICA8L3BhY2thZ2U+CiAgPC9yZXF1aXJlZD4KIDwvZGVwZW5kZW5jaWVzPgogPHBocHJlbGVhc2UgLz4KPC9wYWNrYWdlPgo=]]></data>
	</file>
	<file>
	  <filename>/lib/pear/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/pear/DB.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qIHZpbTogc2V0IGV4cGFuZHRhYiB0YWJzdG9wPTQgc2hpZnR3aWR0aD00IHNvZnR0YWJzdG9wPTQ6ICovCgovKioKICogRGF0YWJhc2UgaW5kZXBlbmRlbnQgcXVlcnkgaW50ZXJmYWNlCiAqCiAqIFBIUCB2ZXJzaW9ucyA0IGFuZCA1CiAqCiAqIExJQ0VOU0U6IFRoaXMgc291cmNlIGZpbGUgaXMgc3ViamVjdCB0byB2ZXJzaW9uIDMuMCBvZiB0aGUgUEhQIGxpY2Vuc2UKICogdGhhdCBpcyBhdmFpbGFibGUgdGhyb3VnaCB0aGUgd29ybGQtd2lkZS13ZWIgYXQgdGhlIGZvbGxvd2luZyBVUkk6CiAqIGh0dHA6Ly93d3cucGhwLm5ldC9saWNlbnNlLzNfMC50eHQuICBJZiB5b3UgZGlkIG5vdCByZWNlaXZlIGEgY29weSBvZgogKiB0aGUgUEhQIExpY2Vuc2UgYW5kIGFyZSB1bmFibGUgdG8gb2J0YWluIGl0IHRocm91Z2ggdGhlIHdlYiwgcGxlYXNlCiAqIHNlbmQgYSBub3RlIHRvIGxpY2Vuc2VAcGhwLm5ldCBzbyB3ZSBjYW4gbWFpbCB5b3UgYSBjb3B5IGltbWVkaWF0ZWx5LgogKgogKiBAY2F0ZWdvcnkgICBEYXRhYmFzZQogKiBAcGFja2FnZSAgICBEQgogKiBAYXV0aG9yICAgICBTdGlnIEJha2tlbiA8c3NiQHBocC5uZXQ+CiAqIEBhdXRob3IgICAgIFRvbWFzIFYuVi5Db3ggPGNveEBpZGVjbmV0LmNvbT4KICogQGF1dGhvciAgICAgRGFuaWVsIENvbnZpc3NvciA8ZGFuaWVsY0BwaHAubmV0PgogKiBAY29weXJpZ2h0ICAxOTk3LTIwMDUgVGhlIFBIUCBHcm91cAogKiBAbGljZW5zZSAgICBodHRwOi8vd3d3LnBocC5uZXQvbGljZW5zZS8zXzAudHh0ICBQSFAgTGljZW5zZSAzLjAKICogQHZlcnNpb24gICAgQ1ZTOiAkSWQ6IERCLnBocCx2IDEuODYgMjAwNy8wMS8yMiAwMToxNzo0OCBhaGFydmV5IEV4cCAkCiAqIEBsaW5rICAgICAgIGh0dHA6Ly9wZWFyLnBocC5uZXQvcGFja2FnZS9EQgogKi8KCi8qKgogKiBPYnRhaW4gdGhlIFBFQVIgY2xhc3Mgc28gaXQgY2FuIGJlIGV4dGVuZGVkIGZyb20KICovCnJlcXVpcmVfb25jZSAnUEVBUi5waHAnOwoKCi8vIHt7eyBjb25zdGFudHMKLy8ge3t7IGVycm9yIGNvZGVzCgovKiojQCsKICogT25lIG9mIFBFQVIgREIncyBwb3J0YWJsZSBlcnJvciBjb2Rlcy4KICogQHNlZSBEQl9jb21tb246OmVycm9yQ29kZSgpLCBEQjo6ZXJyb3JNZXNzYWdlKCkKICoKICoge0BpbnRlcm5hbCBJZiB5b3UgYWRkIGFuIGVycm9yIGNvZGUgaGVyZSwgbWFrZSBzdXJlIHlvdSBhbHNvIGFkZCBhIHRleHR1YWwKICogdmVyc2lvbiBvZiBpdCBpbiBEQjo6ZXJyb3JNZXNzYWdlKCkufX0KICovCgovKioKICogVGhlIGNvZGUgcmV0dXJuZWQgYnkgbWFueSBtZXRob2RzIHVwb24gc3VjY2VzcwogKi8KZGVmaW5lKCdEQl9PSycsIDEpOwoKLyoqCiAqIFVua293biBlcnJvcgogKi8KZGVmaW5lKCdEQl9FUlJPUicsIC0xKTsKCi8qKgogKiBTeW50YXggZXJyb3IKICovCmRlZmluZSgnREJfRVJST1JfU1lOVEFYJywgLTIpOwoKLyoqCiAqIFRyaWVkIHRvIGluc2VydCBhIGR1cGxpY2F0ZSB2YWx1ZSBpbnRvIGEgcHJpbWFyeSBvciB1bmlxdWUgaW5kZXgKICovCmRlZmluZSgnREJfRVJST1JfQ09OU1RSQUlOVCcsIC0zKTsKCi8qKgogKiBBbiBpZGVudGlmaWVyIGluIHRoZSBxdWVyeSByZWZlcnMgdG8gYSBub24tZXhpc3RhbnQgb2JqZWN0CiAqLwpkZWZpbmUoJ0RCX0VSUk9SX05PVF9GT1VORCcsIC00KTsKCi8qKgogKiBUcmllZCB0byBjcmVhdGUgYSBkdXBsaWNhdGUgb2JqZWN0CiAqLwpkZWZpbmUoJ0RCX0VSUk9SX0FMUkVBRFlfRVhJU1RTJywgLTUpOwoKLyoqCiAqIFRoZSBjdXJyZW50IGRyaXZlciBkb2VzIG5vdCBzdXBwb3J0IHRoZSBhY3Rpb24geW91IGF0dGVtcHRlZAogKi8KZGVmaW5lKCdEQl9FUlJPUl9VTlNVUFBPUlRFRCcsIC02KTsKCi8qKgogKiBUaGUgbnVtYmVyIG9mIHBhcmFtZXRlcnMgZG9lcyBub3QgbWF0Y2ggdGhlIG51bWJlciBvZiBwbGFjZWhvbGRlcnMKICovCmRlZmluZSgnREJfRVJST1JfTUlTTUFUQ0gnLCAtNyk7CgovKioKICogQSBsaXRlcmFsIHN1Ym1pdHRlZCBkaWQgbm90IG1hdGNoIHRoZSBkYXRhIHR5cGUgZXhwZWN0ZWQKICovCmRlZmluZSgnREJfRVJST1JfSU5WQUxJRCcsIC04KTsKCi8qKgogKiBUaGUgY3VycmVudCBEQk1TIGRvZXMgbm90IHN1cHBvcnQgdGhlIGFjdGlvbiB5b3UgYXR0ZW1wdGVkCiAqLwpkZWZpbmUoJ0RCX0VSUk9SX05PVF9DQVBBQkxFJywgLTkpOwoKLyoqCiAqIEEgbGl0ZXJhbCBzdWJtaXR0ZWQgd2FzIHRvbyBsb25nIHNvIHRoZSBlbmQgb2YgaXQgd2FzIHJlbW92ZWQKICovCmRlZmluZSgnREJfRVJST1JfVFJVTkNBVEVEJywgLTEwKTsKCi8qKgogKiBBIGxpdGVyYWwgbnVtYmVyIHN1Ym1pdHRlZCBkaWQgbm90IG1hdGNoIHRoZSBkYXRhIHR5cGUgZXhwZWN0ZWQKICovCmRlZmluZSgnREJfRVJST1JfSU5WQUxJRF9OVU1CRVInLCAtMTEpOwoKLyoqCiAqIEEgbGl0ZXJhbCBkYXRlIHN1Ym1pdHRlZCBkaWQgbm90IG1hdGNoIHRoZSBkYXRhIHR5cGUgZXhwZWN0ZWQKICovCmRlZmluZSgnREJfRVJST1JfSU5WQUxJRF9EQVRFJywgLTEyKTsKCi8qKgogKiBBdHRlbXB0IHRvIGRpdmlkZSBzb21ldGhpbmcgYnkgemVybwogKi8KZGVmaW5lKCdEQl9FUlJPUl9ESVZaRVJPJywgLTEzKTsKCi8qKgogKiBBIGRhdGFiYXNlIG5lZWRzIHRvIGJlIHNlbGVjdGVkCiAqLwpkZWZpbmUoJ0RCX0VSUk9SX05PREJTRUxFQ1RFRCcsIC0xNCk7CgovKioKICogQ291bGQgbm90IGNyZWF0ZSB0aGUgb2JqZWN0IHJlcXVlc3RlZAogKi8KZGVmaW5lKCdEQl9FUlJPUl9DQU5OT1RfQ1JFQVRFJywgLTE1KTsKCi8qKgogKiBDb3VsZCBub3QgZHJvcCB0aGUgZGF0YWJhc2UgcmVxdWVzdGVkIGJlY2F1c2UgaXQgZG9lcyBub3QgZXhpc3QKICovCmRlZmluZSgnREJfRVJST1JfQ0FOTk9UX0RST1AnLCAtMTcpOwoKLyoqCiAqIEFuIGlkZW50aWZpZXIgaW4gdGhlIHF1ZXJ5IHJlZmVycyB0byBhIG5vbi1leGlzdGFudCB0YWJsZQogKi8KZGVmaW5lKCdEQl9FUlJPUl9OT1NVQ0hUQUJMRScsIC0xOCk7CgovKioKICogQW4gaWRlbnRpZmllciBpbiB0aGUgcXVlcnkgcmVmZXJzIHRvIGEgbm9uLWV4aXN0YW50IGNvbHVtbgogKi8KZGVmaW5lKCdEQl9FUlJPUl9OT1NVQ0hGSUVMRCcsIC0xOSk7CgovKioKICogVGhlIGRhdGEgc3VibWl0dGVkIHRvIHRoZSBtZXRob2Qgd2FzIGluYXBwcm9wcmlhdGUKICovCmRlZmluZSgnREJfRVJST1JfTkVFRF9NT1JFX0RBVEEnLCAtMjApOwoKLyoqCiAqIFRoZSBhdHRlbXB0IHRvIGxvY2sgdGhlIHRhYmxlIGZhaWxlZAogKi8KZGVmaW5lKCdEQl9FUlJPUl9OT1RfTE9DS0VEJywgLTIxKTsKCi8qKgogKiBUaGUgbnVtYmVyIG9mIGNvbHVtbnMgZG9lc24ndCBtYXRjaCB0aGUgbnVtYmVyIG9mIHZhbHVlcwogKi8KZGVmaW5lKCdEQl9FUlJPUl9WQUxVRV9DT1VOVF9PTl9ST1cnLCAtMjIpOwoKLyoqCiAqIFRoZSBEU04gc3VibWl0dGVkIGhhcyBwcm9ibGVtcwogKi8KZGVmaW5lKCdEQl9FUlJPUl9JTlZBTElEX0RTTicsIC0yMyk7CgovKioKICogQ291bGQgbm90IGNvbm5lY3QgdG8gdGhlIGRhdGFiYXNlCiAqLwpkZWZpbmUoJ0RCX0VSUk9SX0NPTk5FQ1RfRkFJTEVEJywgLTI0KTsKCi8qKgogKiBUaGUgUEhQIGV4dGVuc2lvbiBuZWVkZWQgZm9yIHRoaXMgREJNUyBjb3VsZCBub3QgYmUgZm91bmQKICovCmRlZmluZSgnREJfRVJST1JfRVhURU5TSU9OX05PVF9GT1VORCcsLTI1KTsKCi8qKgogKiBUaGUgcHJlc2VudCB1c2VyIGhhcyBpbmFkZXF1YXRlIHBlcm1pc3Npb25zIHRvIHBlcmZvcm0gdGhlIHRhc2sgcmVxdWVzdGQKICovCmRlZmluZSgnREJfRVJST1JfQUNDRVNTX1ZJT0xBVElPTicsIC0yNik7CgovKioKICogVGhlIGRhdGFiYXNlIHJlcXVlc3RlZCBkb2VzIG5vdCBleGlzdAogKi8KZGVmaW5lKCdEQl9FUlJPUl9OT1NVQ0hEQicsIC0yNyk7CgovKioKICogVHJpZWQgdG8gaW5zZXJ0IGEgbnVsbCB2YWx1ZSBpbnRvIGEgY29sdW1uIHRoYXQgZG9lc24ndCBhbGxvdyBudWxscwogKi8KZGVmaW5lKCdEQl9FUlJPUl9DT05TVFJBSU5UX05PVF9OVUxMJywtMjkpOwovKiojQC0qLwoKCi8vIH19fQovLyB7e3sgcHJlcGFyZWQgc3RhdGVtZW50LXJlbGF0ZWQKCgovKiojQCsKICogSWRlbnRpZmllcnMgZm9yIHRoZSBwbGFjZWhvbGRlcnMgdXNlZCBpbiBwcmVwYXJlZCBzdGF0ZW1lbnRzLgogKiBAc2VlIERCX2NvbW1vbjo6cHJlcGFyZSgpCiAqLwoKLyoqCiAqIEluZGljYXRlcyBhIHNjYWxhciAoPGtiZD4/PC9rYmQ+KSBwbGFjZWhvbGRlciB3YXMgdXNlZAogKgogKiBRdW90ZSBhbmQgZXNjYXBlIHRoZSB2YWx1ZSBhcyBuZWNlc3NhcnkuCiAqLwpkZWZpbmUoJ0RCX1BBUkFNX1NDQUxBUicsIDEpOwoKLyoqCiAqIEluZGljYXRlcyBhbiBvcGFxdWUgKDxrYmQ+Jjwva2JkPikgcGxhY2Vob2xkZXIgd2FzIHVzZWQKICoKICogVGhlIHZhbHVlIHByZXNlbnRlZCBpcyBhIGZpbGUgbmFtZS4gIEV4dHJhY3QgdGhlIGNvbnRlbnRzIG9mIHRoYXQgZmlsZQogKiBhbmQgcGxhY2UgdGhlbSBpbiB0aGlzIGNvbHVtbi4KICovCmRlZmluZSgnREJfUEFSQU1fT1BBUVVFJywgMik7CgovKioKICogSW5kaWNhdGVzIGEgbWlzYyAoPGtiZD4hPC9rYmQ+KSBwbGFjZWhvbGRlciB3YXMgdXNlZAogKgogKiBUaGUgdmFsdWUgc2hvdWxkIG5vdCBiZSBxdW90ZWQgb3IgZXNjYXBlZC4KICovCmRlZmluZSgnREJfUEFSQU1fTUlTQycsICAgMyk7Ci8qKiNALSovCgoKLy8gfX19Ci8vIHt7eyBiaW5hcnkgZGF0YS1yZWxhdGVkCgoKLyoqI0ArCiAqIFRoZSBkaWZmZXJlbnQgd2F5cyBvZiByZXR1cm5pbmcgYmluYXJ5IGRhdGEgZnJvbSBxdWVyaWVzLgogKi8KCi8qKgogKiBTZW5kcyB0aGUgZmV0Y2hlZCBkYXRhIHN0cmFpZ2h0IHRocm91Z2ggdG8gb3V0cHV0CiAqLwpkZWZpbmUoJ0RCX0JJTk1PREVfUEFTU1RIUlUnLCAxKTsKCi8qKgogKiBMZXRzIHlvdSByZXR1cm4gZGF0YSBhcyB1c3VhbAogKi8KZGVmaW5lKCdEQl9CSU5NT0RFX1JFVFVSTicsIDIpOwoKLyoqCiAqIENvbnZlcnRzIHRoZSBkYXRhIHRvIGhleCBmb3JtYXQgYmVmb3JlIHJldHVybmluZyBpdAogKgogKiBGb3IgZXhhbXBsZSB0aGUgc3RyaW5nICIxMjMiIHdvdWxkIGJlY29tZSAiMzEzMjMzIi4KICovCmRlZmluZSgnREJfQklOTU9ERV9DT05WRVJUJywgMyk7Ci8qKiNALSovCgoKLy8gfX19Ci8vIHt7eyBmZXRjaCBtb2RlcwoKCi8qKiNAKwogKiBGZXRjaCBNb2Rlcy4KICogQHNlZSBEQl9jb21tb246OnNldEZldGNoTW9kZSgpCiAqLwoKLyoqCiAqIEluZGljYXRlcyB0aGUgY3VycmVudCBkZWZhdWx0IGZldGNoIG1vZGUgc2hvdWxkIGJlIHVzZWQKICogQHNlZSBEQl9jb21tb246OiRmZXRjaG1vZGUKICovCmRlZmluZSgnREJfRkVUQ0hNT0RFX0RFRkFVTFQnLCAwKTsKCi8qKgogKiBDb2x1bW4gZGF0YSBpbmRleGVkIGJ5IG51bWJlcnMsIG9yZGVyZWQgZnJvbSAwIGFuZCB1cAogKi8KZGVmaW5lKCdEQl9GRVRDSE1PREVfT1JERVJFRCcsIDEpOwoKLyoqCiAqIENvbHVtbiBkYXRhIGluZGV4ZWQgYnkgY29sdW1uIG5hbWVzCiAqLwpkZWZpbmUoJ0RCX0ZFVENITU9ERV9BU1NPQycsIDIpOwoKLyoqCiAqIENvbHVtbiBkYXRhIGFzIG9iamVjdCBwcm9wZXJ0aWVzCiAqLwpkZWZpbmUoJ0RCX0ZFVENITU9ERV9PQkpFQ1QnLCAzKTsKCi8qKgogKiBGb3IgbXVsdGktZGltZW5zaW9uYWwgcmVzdWx0cywgbWFrZSB0aGUgY29sdW1uIG5hbWUgdGhlIGZpcnN0IGxldmVsCiAqIG9mIHRoZSBhcnJheSBhbmQgcHV0IHRoZSByb3cgbnVtYmVyIGluIHRoZSBzZWNvbmQgbGV2ZWwgb2YgdGhlIGFycmF5CiAqCiAqIFRoaXMgaXMgZmxpcHBlZCBmcm9tIHRoZSBub3JtYWwgYmVoYXZpb3IsIHdoaWNoIHB1dHMgdGhlIHJvdyBudW1iZXJzCiAqIGluIHRoZSBmaXJzdCBsZXZlbCBvZiB0aGUgYXJyYXkgYW5kIHRoZSBjb2x1bW4gbmFtZXMgaW4gdGhlIHNlY29uZCBsZXZlbC4KICovCmRlZmluZSgnREJfRkVUQ0hNT0RFX0ZMSVBQRUQnLCA0KTsKLyoqI0AtKi8KCi8qKiNAKwogKiBPbGQgZmV0Y2ggbW9kZXMuICBMZWZ0IGhlcmUgZm9yIGNvbXBhdGliaWxpdHkuCiAqLwpkZWZpbmUoJ0RCX0dFVE1PREVfT1JERVJFRCcsIERCX0ZFVENITU9ERV9PUkRFUkVEKTsKZGVmaW5lKCdEQl9HRVRNT0RFX0FTU09DJywgICBEQl9GRVRDSE1PREVfQVNTT0MpOwpkZWZpbmUoJ0RCX0dFVE1PREVfRkxJUFBFRCcsIERCX0ZFVENITU9ERV9GTElQUEVEKTsKLyoqI0AtKi8KCgovLyB9fX0KLy8ge3t7IHRhYmxlSW5mbygpICYmIGF1dG9QcmVwYXJlKCktcmVsYXRlZAoKCi8qKiNAKwogKiBUaGUgdHlwZSBvZiBpbmZvcm1hdGlvbiB0byByZXR1cm4gZnJvbSB0aGUgdGFibGVJbmZvKCkgbWV0aG9kLgogKgogKiBCaXR3aXNlZCBjb25zdGFudHMsIHNvIHRoZXkgY2FuIGJlIGNvbWJpbmVkIHVzaW5nIDxrYmQ+fDwva2JkPgogKiBhbmQgcmVtb3ZlZCB1c2luZyA8a2JkPl48L2tiZD4uCiAqCiAqIEBzZWUgREJfY29tbW9uOjp0YWJsZUluZm8oKQogKgogKiB7QGludGVybmFsIFNpbmNlIHRoZSBUQUJMRUlORk8gY29uc3RhbnRzIGFyZSBiaXR3aXNlZCwgaWYgbW9yZSBvZiB0aGVtIGFyZQogKiBhZGRlZCBpbiB0aGUgZnV0dXJlLCBtYWtlIHN1cmUgdG8gYWRqdXN0IERCX1RBQkxFSU5GT19GVUxMIGFjY29yZGluZ2x5Ln19CiAqLwpkZWZpbmUoJ0RCX1RBQkxFSU5GT19PUkRFUicsIDEpOwpkZWZpbmUoJ0RCX1RBQkxFSU5GT19PUkRFUlRBQkxFJywgMik7CmRlZmluZSgnREJfVEFCTEVJTkZPX0ZVTEwnLCAzKTsKLyoqI0AtKi8KCgovKiojQCsKICogVGhlIHR5cGUgb2YgcXVlcnkgdG8gY3JlYXRlIHdpdGggdGhlIGF1dG9tYXRpYyBxdWVyeSBidWlsZGluZyBtZXRob2RzLgogKiBAc2VlIERCX2NvbW1vbjo6YXV0b1ByZXBhcmUoKSwgREJfY29tbW9uOjphdXRvRXhlY3V0ZSgpCiAqLwpkZWZpbmUoJ0RCX0FVVE9RVUVSWV9JTlNFUlQnLCAxKTsKZGVmaW5lKCdEQl9BVVRPUVVFUllfVVBEQVRFJywgMik7Ci8qKiNALSovCgoKLy8gfX19Ci8vIHt7eyBwb3J0YWJpbGl0eSBtb2RlcwoKCi8qKiNAKwogKiBQb3J0YWJpbGl0eSBNb2Rlcy4KICoKICogQml0d2lzZWQgY29uc3RhbnRzLCBzbyB0aGV5IGNhbiBiZSBjb21iaW5lZCB1c2luZyA8a2JkPnw8L2tiZD4KICogYW5kIHJlbW92ZWQgdXNpbmcgPGtiZD5ePC9rYmQ+LgogKgogKiBAc2VlIERCX2NvbW1vbjo6c2V0T3B0aW9uKCkKICoKICoge0BpbnRlcm5hbCBTaW5jZSB0aGUgUE9SVEFCSUxJVFkgY29uc3RhbnRzIGFyZSBiaXR3aXNlZCwgaWYgbW9yZSBvZiB0aGVtIGFyZQogKiBhZGRlZCBpbiB0aGUgZnV0dXJlLCBtYWtlIHN1cmUgdG8gYWRqdXN0IERCX1BPUlRBQklMSVRZX0FMTCBhY2NvcmRpbmdseS59fQogKi8KCi8qKgogKiBUdXJuIG9mZiBhbGwgcG9ydGFiaWxpdHkgZmVhdHVyZXMKICovCmRlZmluZSgnREJfUE9SVEFCSUxJVFlfTk9ORScsIDApOwoKLyoqCiAqIENvbnZlcnQgbmFtZXMgb2YgdGFibGVzIGFuZCBmaWVsZHMgdG8gbG93ZXIgY2FzZQogKiB3aGVuIHVzaW5nIHRoZSBnZXQqKCksIGZldGNoKigpIGFuZCB0YWJsZUluZm8oKSBtZXRob2RzCiAqLwpkZWZpbmUoJ0RCX1BPUlRBQklMSVRZX0xPV0VSQ0FTRScsIDEpOwoKLyoqCiAqIFJpZ2h0IHRyaW0gdGhlIGRhdGEgb3V0cHV0IGJ5IGdldCooKSBhbmQgZmV0Y2gqKCkKICovCmRlZmluZSgnREJfUE9SVEFCSUxJVFlfUlRSSU0nLCAyKTsKCi8qKgogKiBGb3JjZSByZXBvcnRpbmcgdGhlIG51bWJlciBvZiByb3dzIGRlbGV0ZWQKICovCmRlZmluZSgnREJfUE9SVEFCSUxJVFlfREVMRVRFX0NPVU5UJywgNCk7CgovKioKICogRW5hYmxlIGhhY2sgdGhhdCBtYWtlcyBudW1Sb3dzKCkgd29yayBpbiBPcmFjbGUKICovCmRlZmluZSgnREJfUE9SVEFCSUxJVFlfTlVNUk9XUycsIDgpOwoKLyoqCiAqIE1ha2VzIGNlcnRhaW4gZXJyb3IgbWVzc2FnZXMgaW4gY2VydGFpbiBkcml2ZXJzIGNvbXBhdGlibGUKICogd2l0aCB0aG9zZSBmcm9tIG90aGVyIERCTVMncwogKgogKiArIG15c3FsLCBteXNxbGk6ICBjaGFuZ2UgdW5pcXVlL3ByaW1hcnkga2V5IGNvbnN0cmFpbnRzCiAqICAgREJfRVJST1JfQUxSRUFEWV9FWElTVFMgLT4gREJfRVJST1JfQ09OU1RSQUlOVAogKgogKiArIG9kYmMoYWNjZXNzKTogIE1TJ3MgT0RCQyBkcml2ZXIgcmVwb3J0cyAnbm8gc3VjaCBmaWVsZCcgYXMgY29kZQogKiAgIDA3MDAxLCB3aGljaCBtZWFucyAndG9vIGZldyBwYXJhbWV0ZXJzLicgIFdoZW4gdGhpcyBvcHRpb24gaXMgb24KICogICB0aGF0IGNvZGUgZ2V0cyBtYXBwZWQgdG8gREJfRVJST1JfTk9TVUNIRklFTEQuCiAqLwpkZWZpbmUoJ0RCX1BPUlRBQklMSVRZX0VSUk9SUycsIDE2KTsKCi8qKgogKiBDb252ZXJ0IG51bGwgdmFsdWVzIHRvIGVtcHR5IHN0cmluZ3MgaW4gZGF0YSBvdXRwdXQgYnkKICogZ2V0KigpIGFuZCBmZXRjaCooKQogKi8KZGVmaW5lKCdEQl9QT1JUQUJJTElUWV9OVUxMX1RPX0VNUFRZJywgMzIpOwoKLyoqCiAqIFR1cm4gb24gYWxsIHBvcnRhYmlsaXR5IGZlYXR1cmVzCiAqLwpkZWZpbmUoJ0RCX1BPUlRBQklMSVRZX0FMTCcsIDYzKTsKLyoqI0AtKi8KCi8vIH19fQoKCi8vIH19fQovLyB7e3sgY2xhc3MgREIKCi8qKgogKiBEYXRhYmFzZSBpbmRlcGVuZGVudCBxdWVyeSBpbnRlcmZhY2UKICoKICogVGhlIG1haW4gIkRCIiBjbGFzcyBpcyBzaW1wbHkgYSBjb250YWluZXIgY2xhc3Mgd2l0aCBzb21lIHN0YXRpYwogKiBtZXRob2RzIGZvciBjcmVhdGluZyBEQiBvYmplY3RzIGFzIHdlbGwgYXMgc29tZSB1dGlsaXR5IGZ1bmN0aW9ucwogKiBjb21tb24gdG8gYWxsIHBhcnRzIG9mIERCLgogKgogKiBUaGUgb2JqZWN0IG1vZGVsIG9mIERCIGlzIGFzIGZvbGxvd3MgKGluZGVudGF0aW9uIG1lYW5zIGluaGVyaXRhbmNlKToKICogPHByZT4KICogREIgICAgICAgICAgIFRoZSBtYWluIERCIGNsYXNzLiAgVGhpcyBpcyBzaW1wbHkgYSB1dGlsaXR5IGNsYXNzCiAqICAgICAgICAgICAgICB3aXRoIHNvbWUgInN0YXRpYyIgbWV0aG9kcyBmb3IgY3JlYXRpbmcgREIgb2JqZWN0cyBhcwogKiAgICAgICAgICAgICAgd2VsbCBhcyBjb21tb24gdXRpbGl0eSBmdW5jdGlvbnMgZm9yIG90aGVyIERCIGNsYXNzZXMuCiAqCiAqIERCX2NvbW1vbiAgICBUaGUgYmFzZSBmb3IgZWFjaCBEQiBpbXBsZW1lbnRhdGlvbi4gIFByb3ZpZGVzIGRlZmF1bHQKICogfCAgICAgICAgICAgIGltcGxlbWVudGF0aW9ucyAoaW4gT08gbGluZ28gdmlydHVhbCBtZXRob2RzKSBmb3IKICogfCAgICAgICAgICAgIHRoZSBhY3R1YWwgREIgaW1wbGVtZW50YXRpb25zIGFzIHdlbGwgYXMgYSBidW5jaCBvZgogKiB8ICAgICAgICAgICAgcXVlcnkgdXRpbGl0eSBmdW5jdGlvbnMuCiAqIHwKICogKy1EQl9teXNxbCAgIFRoZSBEQiBpbXBsZW1lbnRhdGlvbiBmb3IgTXlTUUwuICBJbmhlcml0cyBEQl9jb21tb24uCiAqICAgICAgICAgICAgICBXaGVuIGNhbGxpbmcgREI6OmZhY3Rvcnkgb3IgREI6OmNvbm5lY3QgZm9yIE15U1FMCiAqICAgICAgICAgICAgICBjb25uZWN0aW9ucywgdGhlIG9iamVjdCByZXR1cm5lZCBpcyBhbiBpbnN0YW5jZSBvZiB0aGlzCiAqICAgICAgICAgICAgICBjbGFzcy4KICogPC9wcmU+CiAqCiAqIEBjYXRlZ29yeSAgIERhdGFiYXNlCiAqIEBwYWNrYWdlICAgIERCCiAqIEBhdXRob3IgICAgIFN0aWcgQmFra2VuIDxzc2JAcGhwLm5ldD4KICogQGF1dGhvciAgICAgVG9tYXMgVi5WLkNveCA8Y294QGlkZWNuZXQuY29tPgogKiBAYXV0aG9yICAgICBEYW5pZWwgQ29udmlzc29yIDxkYW5pZWxjQHBocC5uZXQ+CiAqIEBjb3B5cmlnaHQgIDE5OTctMjAwNSBUaGUgUEhQIEdyb3VwCiAqIEBsaWNlbnNlICAgIGh0dHA6Ly93d3cucGhwLm5ldC9saWNlbnNlLzNfMC50eHQgIFBIUCBMaWNlbnNlIDMuMAogKiBAdmVyc2lvbiAgICBSZWxlYXNlOiAxLjcuMTIKICogQGxpbmsgICAgICAgaHR0cDovL3BlYXIucGhwLm5ldC9wYWNrYWdlL0RCCiAqLwpjbGFzcyBEQgp7CiAgICAvLyB7e3sgJmZhY3RvcnkoKQoKICAgIC8qKgogICAgICogQ3JlYXRlIGEgbmV3IERCIG9iamVjdCBmb3IgdGhlIHNwZWNpZmllZCBkYXRhYmFzZSB0eXBlIGJ1dCBkb24ndAogICAgICogY29ubmVjdCB0byB0aGUgZGF0YWJhc2UKICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICR0eXBlICAgICB0aGUgZGF0YWJhc2UgdHlwZSAoZWcgIm15c3FsIikKICAgICAqIEBwYXJhbSBhcnJheSAgJG9wdGlvbnMgIGFuIGFzc29jaWF0aXZlIGFycmF5IG9mIG9wdGlvbiBuYW1lcyBhbmQgdmFsdWVzCiAgICAgKgogICAgICogQHJldHVybiBvYmplY3QgIGEgbmV3IERCIG9iamVjdC4gIEEgREJfRXJyb3Igb2JqZWN0IG9uIGZhaWx1cmUuCiAgICAgKgogICAgICogQHNlZSBEQl9jb21tb246OnNldE9wdGlvbigpCiAgICAgKi8KICAgIGZ1bmN0aW9uICZmYWN0b3J5KCR0eXBlLCAkb3B0aW9ucyA9IGZhbHNlKQogICAgewogICAgICAgIGlmICghaXNfYXJyYXkoJG9wdGlvbnMpKSB7CiAgICAgICAgICAgICRvcHRpb25zID0gYXJyYXkoJ3BlcnNpc3RlbnQnID0+ICRvcHRpb25zKTsKICAgICAgICB9CgogICAgICAgIGlmIChpc3NldCgkb3B0aW9uc1snZGVidWcnXSkgJiYgJG9wdGlvbnNbJ2RlYnVnJ10gPj0gMikgewogICAgICAgICAgICAvLyBleHBvc2UgcGhwIGVycm9ycyB3aXRoIHN1ZmZpY2llbnQgZGVidWcgbGV2ZWwKICAgICAgICAgICAgaW5jbHVkZV9vbmNlICJEQi97JHR5cGV9LnBocCI7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgQGluY2x1ZGVfb25jZSAiREIveyR0eXBlfS5waHAiOwogICAgICAgIH0KCiAgICAgICAgJGNsYXNzbmFtZSA9ICJEQl8ke3R5cGV9IjsKCiAgICAgICAgaWYgKCFjbGFzc19leGlzdHMoJGNsYXNzbmFtZSkpIHsKICAgICAgICAgICAgJHRtcCA9IFBFQVI6OnJhaXNlRXJyb3IobnVsbCwgREJfRVJST1JfTk9UX0ZPVU5ELCBudWxsLCBudWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIGluY2x1ZGUgdGhlIERCL3skdHlwZX0ucGhwIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgZmlsZSBmb3IgJyRkc24nIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0RCX0Vycm9yJywgdHJ1ZSk7CiAgICAgICAgICAgIHJldHVybiAkdG1wOwogICAgICAgIH0KCiAgICAgICAgQCRvYmogPSYgbmV3ICRjbGFzc25hbWU7CgogICAgICAgIGZvcmVhY2ggKCRvcHRpb25zIGFzICRvcHRpb24gPT4gJHZhbHVlKSB7CiAgICAgICAgICAgICR0ZXN0ID0gJG9iai0+c2V0T3B0aW9uKCRvcHRpb24sICR2YWx1ZSk7CiAgICAgICAgICAgIGlmIChEQjo6aXNFcnJvcigkdGVzdCkpIHsKICAgICAgICAgICAgICAgIHJldHVybiAkdGVzdDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRvYmo7CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgJmNvbm5lY3QoKQoKICAgIC8qKgogICAgICogQ3JlYXRlIGEgbmV3IERCIG9iamVjdCBpbmNsdWRpbmcgYSBjb25uZWN0aW9uIHRvIHRoZSBzcGVjaWZpZWQgZGF0YWJhc2UKICAgICAqCiAgICAgKiBFeGFtcGxlIDEuCiAgICAgKiA8Y29kZT4KICAgICAqIHJlcXVpcmVfb25jZSAnREIucGhwJzsKICAgICAqCiAgICAgKiAkZHNuID0gJ3Bnc3FsOi8vdXNlcjpwYXNzd29yZEBob3N0L2RhdGFiYXNlJzsKICAgICAqICRvcHRpb25zID0gYXJyYXkoCiAgICAgKiAgICAgJ2RlYnVnJyAgICAgICA9PiAyLAogICAgICogICAgICdwb3J0YWJpbGl0eScgPT4gREJfUE9SVEFCSUxJVFlfQUxMLAogICAgICogKTsKICAgICAqCiAgICAgKiAkZGIgPSYgREI6OmNvbm5lY3QoJGRzbiwgJG9wdGlvbnMpOwogICAgICogaWYgKFBFQVI6OmlzRXJyb3IoJGRiKSkgewogICAgICogICAgIGRpZSgkZGItPmdldE1lc3NhZ2UoKSk7CiAgICAgKiB9CiAgICAgKiA8L2NvZGU+CiAgICAgKgogICAgICogQHBhcmFtIG1peGVkICRkc24gICAgICB0aGUgc3RyaW5nICJkYXRhIHNvdXJjZSBuYW1lIiBvciBhcnJheSBpbiB0aGUKICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCByZXR1cm5lZCBieSBEQjo6cGFyc2VEU04oKQogICAgICogQHBhcmFtIGFycmF5ICRvcHRpb25zICBhbiBhc3NvY2lhdGl2ZSBhcnJheSBvZiBvcHRpb24gbmFtZXMgYW5kIHZhbHVlcwogICAgICoKICAgICAqIEByZXR1cm4gb2JqZWN0ICBhIG5ldyBEQiBvYmplY3QuICBBIERCX0Vycm9yIG9iamVjdCBvbiBmYWlsdXJlLgogICAgICoKICAgICAqIEB1c2VzIERCX2RiYXNlOjpjb25uZWN0KCksIERCX2Zic3FsOjpjb25uZWN0KCksIERCX2liYXNlOjpjb25uZWN0KCksCiAgICAgKiAgICAgICBEQl9pZng6OmNvbm5lY3QoKSwgREJfbXNxbDo6Y29ubmVjdCgpLCBEQl9tc3NxbDo6Y29ubmVjdCgpLAogICAgICogICAgICAgREJfbXlzcWw6OmNvbm5lY3QoKSwgREJfbXlzcWxpOjpjb25uZWN0KCksIERCX29jaTg6OmNvbm5lY3QoKSwKICAgICAqICAgICAgIERCX29kYmM6OmNvbm5lY3QoKSwgREJfcGdzcWw6OmNvbm5lY3QoKSwgREJfc3FsaXRlOjpjb25uZWN0KCksCiAgICAgKiAgICAgICBEQl9zeWJhc2U6OmNvbm5lY3QoKQogICAgICoKICAgICAqIEB1c2VzIERCOjpwYXJzZURTTigpLCBEQl9jb21tb246OnNldE9wdGlvbigpLCBQRUFSOjppc0Vycm9yKCkKICAgICAqLwogICAgZnVuY3Rpb24gJmNvbm5lY3QoJGRzbiwgJG9wdGlvbnMgPSBhcnJheSgpKQogICAgewogICAgICAgICRkc25pbmZvID0gREI6OnBhcnNlRFNOKCRkc24pOwogICAgICAgICR0eXBlID0gJGRzbmluZm9bJ3BocHR5cGUnXTsKCiAgICAgICAgaWYgKCFpc19hcnJheSgkb3B0aW9ucykpIHsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogRm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LiAgJG9wdGlvbnMgdXNlZCB0byBiZSBib29sZWFuLAogICAgICAgICAgICAgKiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGNvbm5lY3Rpb24gc2hvdWxkIGJlIHBlcnNpc3RlbnQuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICAkb3B0aW9ucyA9IGFycmF5KCdwZXJzaXN0ZW50JyA9PiAkb3B0aW9ucyk7CiAgICAgICAgfQoKICAgICAgICBpZiAoaXNzZXQoJG9wdGlvbnNbJ2RlYnVnJ10pICYmICRvcHRpb25zWydkZWJ1ZyddID49IDIpIHsKICAgICAgICAgICAgLy8gZXhwb3NlIHBocCBlcnJvcnMgd2l0aCBzdWZmaWNpZW50IGRlYnVnIGxldmVsCiAgICAgICAgICAgIGluY2x1ZGVfb25jZSAiREIvJHt0eXBlfS5waHAiOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIEBpbmNsdWRlX29uY2UgIkRCLyR7dHlwZX0ucGhwIjsKICAgICAgICB9CgogICAgICAgICRjbGFzc25hbWUgPSAiREJfJHt0eXBlfSI7CiAgICAgICAgaWYgKCFjbGFzc19leGlzdHMoJGNsYXNzbmFtZSkpIHsKICAgICAgICAgICAgJHRtcCA9IFBFQVI6OnJhaXNlRXJyb3IobnVsbCwgREJfRVJST1JfTk9UX0ZPVU5ELCBudWxsLCBudWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIGluY2x1ZGUgdGhlIERCL3skdHlwZX0ucGhwIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgZmlsZSBmb3IgJyRkc24nIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0RCX0Vycm9yJywgdHJ1ZSk7CiAgICAgICAgICAgIHJldHVybiAkdG1wOwogICAgICAgIH0KCiAgICAgICAgQCRvYmogPSYgbmV3ICRjbGFzc25hbWU7CgogICAgICAgIGZvcmVhY2ggKCRvcHRpb25zIGFzICRvcHRpb24gPT4gJHZhbHVlKSB7CiAgICAgICAgICAgICR0ZXN0ID0gJG9iai0+c2V0T3B0aW9uKCRvcHRpb24sICR2YWx1ZSk7CiAgICAgICAgICAgIGlmIChEQjo6aXNFcnJvcigkdGVzdCkpIHsKICAgICAgICAgICAgICAgIHJldHVybiAkdGVzdDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJGVyciA9ICRvYmotPmNvbm5lY3QoJGRzbmluZm8sICRvYmotPmdldE9wdGlvbigncGVyc2lzdGVudCcpKTsKICAgICAgICBpZiAoREI6OmlzRXJyb3IoJGVycikpIHsKICAgICAgICAgICAgaWYgKGlzX2FycmF5KCRkc24pKSB7CiAgICAgICAgICAgICAgICAkZXJyLT5hZGRVc2VySW5mbyhEQjo6Z2V0RFNOU3RyaW5nKCRkc24sIHRydWUpKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICRlcnItPmFkZFVzZXJJbmZvKCRkc24pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAkZXJyOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRvYmo7CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgYXBpVmVyc2lvbigpCgogICAgLyoqCiAgICAgKiBSZXR1cm4gdGhlIERCIEFQSSB2ZXJzaW9uCiAgICAgKgogICAgICogQHJldHVybiBzdHJpbmcgIHRoZSBEQiBBUEkgdmVyc2lvbiBudW1iZXIKICAgICAqLwogICAgZnVuY3Rpb24gYXBpVmVyc2lvbigpCiAgICB7CiAgICAgICAgcmV0dXJuICcxLjcuMTInOwogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IGlzRXJyb3IoKQoKICAgIC8qKgogICAgICogRGV0ZXJtaW5lcyBpZiBhIHZhcmlhYmxlIGlzIGEgREJfRXJyb3Igb2JqZWN0CiAgICAgKgogICAgICogQHBhcmFtIG1peGVkICR2YWx1ZSAgdGhlIHZhcmlhYmxlIHRvIGNoZWNrCiAgICAgKgogICAgICogQHJldHVybiBib29sICB3aGV0aGVyICR2YWx1ZSBpcyBEQl9FcnJvciBvYmplY3QKICAgICAqLwogICAgZnVuY3Rpb24gaXNFcnJvcigkdmFsdWUpCiAgICB7CiAgICAgICAgcmV0dXJuIGlzX2EoJHZhbHVlLCAnREJfRXJyb3InKTsKICAgIH0KCiAgICAvLyB9fX0KICAgIC8vIHt7eyBpc0Nvbm5lY3Rpb24oKQoKICAgIC8qKgogICAgICogRGV0ZXJtaW5lcyBpZiBhIHZhbHVlIGlzIGEgREJfPGRyaXZlcj4gb2JqZWN0CiAgICAgKgogICAgICogQHBhcmFtIG1peGVkICR2YWx1ZSAgdGhlIHZhbHVlIHRvIHRlc3QKICAgICAqCiAgICAgKiBAcmV0dXJuIGJvb2wgIHdoZXRoZXIgJHZhbHVlIGlzIGEgREJfPGRyaXZlcj4gb2JqZWN0CiAgICAgKi8KICAgIGZ1bmN0aW9uIGlzQ29ubmVjdGlvbigkdmFsdWUpCiAgICB7CiAgICAgICAgcmV0dXJuIChpc19vYmplY3QoJHZhbHVlKSAmJgogICAgICAgICAgICAgICAgaXNfc3ViY2xhc3Nfb2YoJHZhbHVlLCAnZGJfY29tbW9uJykgJiYKICAgICAgICAgICAgICAgIG1ldGhvZF9leGlzdHMoJHZhbHVlLCAnc2ltcGxlUXVlcnknKSk7CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgaXNNYW5pcCgpCgogICAgLyoqCiAgICAgKiBUZWxsIHdoZXRoZXIgYSBxdWVyeSBpcyBhIGRhdGEgbWFuaXB1bGF0aW9uIG9yIGRhdGEgZGVmaW5pdGlvbiBxdWVyeQogICAgICoKICAgICAqIEV4YW1wbGVzIG9mIGRhdGEgbWFuaXB1bGF0aW9uIHF1ZXJpZXMgYXJlIElOU0VSVCwgVVBEQVRFIGFuZCBERUxFVEUuCiAgICAgKiBFeGFtcGxlcyBvZiBkYXRhIGRlZmluaXRpb24gcXVlcmllcyBhcmUgQ1JFQVRFLCBEUk9QLCBBTFRFUiwgR1JBTlQsCiAgICAgKiBSRVZPS0UuCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkcXVlcnkgIHRoZSBxdWVyeQogICAgICoKICAgICAqIEByZXR1cm4gYm9vbGVhbiAgd2hldGhlciAkcXVlcnkgaXMgYSBkYXRhIG1hbmlwdWxhdGlvbiBxdWVyeQogICAgICovCiAgICBmdW5jdGlvbiBpc01hbmlwKCRxdWVyeSkKICAgIHsKICAgICAgICAkbWFuaXBzID0gJ0lOU0VSVHxVUERBVEV8REVMRVRFfFJFUExBQ0V8JwogICAgICAgICAgICAgICAgLiAnQ1JFQVRFfERST1B8JwogICAgICAgICAgICAgICAgLiAnTE9BRCBEQVRBfFNFTEVDVCAuKiBJTlRPIC4qIEZST018Q09QWXwnCiAgICAgICAgICAgICAgICAuICdBTFRFUnxHUkFOVHxSRVZPS0V8JwogICAgICAgICAgICAgICAgLiAnTE9DS3xVTkxPQ0snOwogICAgICAgIGlmIChwcmVnX21hdGNoKCcvXlxzKiI/KCcgLiAkbWFuaXBzIC4gJylccysvaScsICRxdWVyeSkpIHsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICAvLyB9fX0KICAgIC8vIHt7eyBlcnJvck1lc3NhZ2UoKQoKICAgIC8qKgogICAgICogUmV0dXJuIGEgdGV4dHVhbCBlcnJvciBtZXNzYWdlIGZvciBhIERCIGVycm9yIGNvZGUKICAgICAqCiAgICAgKiBAcGFyYW0gaW50ZWdlciAkdmFsdWUgIHRoZSBEQiBlcnJvciBjb2RlCiAgICAgKgogICAgICogQHJldHVybiBzdHJpbmcgIHRoZSBlcnJvciBtZXNzYWdlIG9yIGZhbHNlIGlmIHRoZSBlcnJvciBjb2RlIHdhcwogICAgICogICAgICAgICAgICAgICAgICBub3QgcmVjb2duaXplZAogICAgICovCiAgICBmdW5jdGlvbiBlcnJvck1lc3NhZ2UoJHZhbHVlKQogICAgewogICAgICAgIHN0YXRpYyAkZXJyb3JNZXNzYWdlczsKICAgICAgICBpZiAoIWlzc2V0KCRlcnJvck1lc3NhZ2VzKSkgewogICAgICAgICAgICAkZXJyb3JNZXNzYWdlcyA9IGFycmF5KAogICAgICAgICAgICAgICAgREJfRVJST1IgICAgICAgICAgICAgICAgICAgID0+ICd1bmtub3duIGVycm9yJywKICAgICAgICAgICAgICAgIERCX0VSUk9SX0FDQ0VTU19WSU9MQVRJT04gICA9PiAnaW5zdWZmaWNpZW50IHBlcm1pc3Npb25zJywKICAgICAgICAgICAgICAgIERCX0VSUk9SX0FMUkVBRFlfRVhJU1RTICAgICA9PiAnYWxyZWFkeSBleGlzdHMnLAogICAgICAgICAgICAgICAgREJfRVJST1JfQ0FOTk9UX0NSRUFURSAgICAgID0+ICdjYW4gbm90IGNyZWF0ZScsCiAgICAgICAgICAgICAgICBEQl9FUlJPUl9DQU5OT1RfRFJPUCAgICAgICAgPT4gJ2NhbiBub3QgZHJvcCcsCiAgICAgICAgICAgICAgICBEQl9FUlJPUl9DT05ORUNUX0ZBSUxFRCAgICAgPT4gJ2Nvbm5lY3QgZmFpbGVkJywKICAgICAgICAgICAgICAgIERCX0VSUk9SX0NPTlNUUkFJTlQgICAgICAgICA9PiAnY29uc3RyYWludCB2aW9sYXRpb24nLAogICAgICAgICAgICAgICAgREJfRVJST1JfQ09OU1RSQUlOVF9OT1RfTlVMTD0+ICdudWxsIHZhbHVlIHZpb2xhdGVzIG5vdC1udWxsIGNvbnN0cmFpbnQnLAogICAgICAgICAgICAgICAgREJfRVJST1JfRElWWkVSTyAgICAgICAgICAgID0+ICdkaXZpc2lvbiBieSB6ZXJvJywKICAgICAgICAgICAgICAgIERCX0VSUk9SX0VYVEVOU0lPTl9OT1RfRk9VTkQ9PiAnZXh0ZW5zaW9uIG5vdCBmb3VuZCcsCiAgICAgICAgICAgICAgICBEQl9FUlJPUl9JTlZBTElEICAgICAgICAgICAgPT4gJ2ludmFsaWQnLAogICAgICAgICAgICAgICAgREJfRVJST1JfSU5WQUxJRF9EQVRFICAgICAgID0+ICdpbnZhbGlkIGRhdGUgb3IgdGltZScsCiAgICAgICAgICAgICAgICBEQl9FUlJPUl9JTlZBTElEX0RTTiAgICAgICAgPT4gJ2ludmFsaWQgRFNOJywKICAgICAgICAgICAgICAgIERCX0VSUk9SX0lOVkFMSURfTlVNQkVSICAgICA9PiAnaW52YWxpZCBudW1iZXInLAogICAgICAgICAgICAgICAgREJfRVJST1JfTUlTTUFUQ0ggICAgICAgICAgID0+ICdtaXNtYXRjaCcsCiAgICAgICAgICAgICAgICBEQl9FUlJPUl9ORUVEX01PUkVfREFUQSAgICAgPT4gJ2luc3VmZmljaWVudCBkYXRhIHN1cHBsaWVkJywKICAgICAgICAgICAgICAgIERCX0VSUk9SX05PREJTRUxFQ1RFRCAgICAgICA9PiAnbm8gZGF0YWJhc2Ugc2VsZWN0ZWQnLAogICAgICAgICAgICAgICAgREJfRVJST1JfTk9TVUNIREIgICAgICAgICAgID0+ICdubyBzdWNoIGRhdGFiYXNlJywKICAgICAgICAgICAgICAgIERCX0VSUk9SX05PU1VDSEZJRUxEICAgICAgICA9PiAnbm8gc3VjaCBmaWVsZCcsCiAgICAgICAgICAgICAgICBEQl9FUlJPUl9OT1NVQ0hUQUJMRSAgICAgICAgPT4gJ25vIHN1Y2ggdGFibGUnLAogICAgICAgICAgICAgICAgREJfRVJST1JfTk9UX0NBUEFCTEUgICAgICAgID0+ICdEQiBiYWNrZW5kIG5vdCBjYXBhYmxlJywKICAgICAgICAgICAgICAgIERCX0VSUk9SX05PVF9GT1VORCAgICAgICAgICA9PiAnbm90IGZvdW5kJywKICAgICAgICAgICAgICAgIERCX0VSUk9SX05PVF9MT0NLRUQgICAgICAgICA9PiAnbm90IGxvY2tlZCcsCiAgICAgICAgICAgICAgICBEQl9FUlJPUl9TWU5UQVggICAgICAgICAgICAgPT4gJ3N5bnRheCBlcnJvcicsCiAgICAgICAgICAgICAgICBEQl9FUlJPUl9VTlNVUFBPUlRFRCAgICAgICAgPT4gJ25vdCBzdXBwb3J0ZWQnLAogICAgICAgICAgICAgICAgREJfRVJST1JfVFJVTkNBVEVEICAgICAgICAgID0+ICd0cnVuY2F0ZWQnLAogICAgICAgICAgICAgICAgREJfRVJST1JfVkFMVUVfQ09VTlRfT05fUk9XID0+ICd2YWx1ZSBjb3VudCBvbiByb3cnLAogICAgICAgICAgICAgICAgREJfT0sgICAgICAgICAgICAgICAgICAgICAgID0+ICdubyBlcnJvcicsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBpZiAoREI6OmlzRXJyb3IoJHZhbHVlKSkgewogICAgICAgICAgICAkdmFsdWUgPSAkdmFsdWUtPmdldENvZGUoKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBpc3NldCgkZXJyb3JNZXNzYWdlc1skdmFsdWVdKSA/ICRlcnJvck1lc3NhZ2VzWyR2YWx1ZV0KICAgICAgICAgICAgICAgICAgICAgOiAkZXJyb3JNZXNzYWdlc1tEQl9FUlJPUl07CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgcGFyc2VEU04oKQoKICAgIC8qKgogICAgICogUGFyc2UgYSBkYXRhIHNvdXJjZSBuYW1lCiAgICAgKgogICAgICogQWRkaXRpb25hbCBrZXlzIGNhbiBiZSBhZGRlZCBieSBhcHBlbmRpbmcgYSBVUkkgcXVlcnkgc3RyaW5nIHRvIHRoZQogICAgICogZW5kIG9mIHRoZSBEU04uCiAgICAgKgogICAgICogVGhlIGZvcm1hdCBvZiB0aGUgc3VwcGxpZWQgRFNOIGlzIGluIGl0cyBmdWxsZXN0IGZvcm06CiAgICAgKiA8Y29kZT4KICAgICAqICBwaHB0eXBlKGRic3ludGF4KTovL3VzZXJuYW1lOnBhc3N3b3JkQHByb3RvY29sK2hvc3RzcGVjL2RhdGFiYXNlP29wdGlvbj04JmFub3RoZXI9dHJ1ZQogICAgICogPC9jb2RlPgogICAgICoKICAgICAqIE1vc3QgdmFyaWF0aW9ucyBhcmUgYWxsb3dlZDoKICAgICAqIDxjb2RlPgogICAgICogIHBocHR5cGU6Ly91c2VybmFtZTpwYXNzd29yZEBwcm90b2NvbCtob3N0c3BlYzoxMTAvL3Vzci9kYl9maWxlLmRiP21vZGU9MDY0NAogICAgICogIHBocHR5cGU6Ly91c2VybmFtZTpwYXNzd29yZEBob3N0c3BlYy9kYXRhYmFzZV9uYW1lCiAgICAgKiAgcGhwdHlwZTovL3VzZXJuYW1lOnBhc3N3b3JkQGhvc3RzcGVjCiAgICAgKiAgcGhwdHlwZTovL3VzZXJuYW1lQGhvc3RzcGVjCiAgICAgKiAgcGhwdHlwZTovL2hvc3RzcGVjL2RhdGFiYXNlCiAgICAgKiAgcGhwdHlwZTovL2hvc3RzcGVjCiAgICAgKiAgcGhwdHlwZShkYnN5bnRheCkKICAgICAqICBwaHB0eXBlCiAgICAgKiA8L2NvZGU+CiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkZHNuIERhdGEgU291cmNlIE5hbWUgdG8gYmUgcGFyc2VkCiAgICAgKgogICAgICogQHJldHVybiBhcnJheSBhbiBhc3NvY2lhdGl2ZSBhcnJheSB3aXRoIHRoZSBmb2xsb3dpbmcga2V5czoKICAgICAqICArIHBocHR5cGU6ICBEYXRhYmFzZSBiYWNrZW5kIHVzZWQgaW4gUEhQIChteXNxbCwgb2RiYyBldGMuKQogICAgICogICsgZGJzeW50YXg6IERhdGFiYXNlIHVzZWQgd2l0aCByZWdhcmRzIHRvIFNRTCBzeW50YXggZXRjLgogICAgICogICsgcHJvdG9jb2w6IENvbW11bmljYXRpb24gcHJvdG9jb2wgdG8gdXNlICh0Y3AsIHVuaXggZXRjLikKICAgICAqICArIGhvc3RzcGVjOiBIb3N0IHNwZWNpZmljYXRpb24gKGhvc3RuYW1lWzpwb3J0XSkKICAgICAqICArIGRhdGFiYXNlOiBEYXRhYmFzZSB0byB1c2Ugb24gdGhlIERCTVMgc2VydmVyCiAgICAgKiAgKyB1c2VybmFtZTogVXNlciBuYW1lIGZvciBsb2dpbgogICAgICogICsgcGFzc3dvcmQ6IFBhc3N3b3JkIGZvciBsb2dpbgogICAgICovCiAgICBmdW5jdGlvbiBwYXJzZURTTigkZHNuKQogICAgewogICAgICAgICRwYXJzZWQgPSBhcnJheSgKICAgICAgICAgICAgJ3BocHR5cGUnICA9PiBmYWxzZSwKICAgICAgICAgICAgJ2Ric3ludGF4JyA9PiBmYWxzZSwKICAgICAgICAgICAgJ3VzZXJuYW1lJyA9PiBmYWxzZSwKICAgICAgICAgICAgJ3Bhc3N3b3JkJyA9PiBmYWxzZSwKICAgICAgICAgICAgJ3Byb3RvY29sJyA9PiBmYWxzZSwKICAgICAgICAgICAgJ2hvc3RzcGVjJyA9PiBmYWxzZSwKICAgICAgICAgICAgJ3BvcnQnICAgICA9PiBmYWxzZSwKICAgICAgICAgICAgJ3NvY2tldCcgICA9PiBmYWxzZSwKICAgICAgICAgICAgJ2RhdGFiYXNlJyA9PiBmYWxzZSwKICAgICAgICApOwoKICAgICAgICBpZiAoaXNfYXJyYXkoJGRzbikpIHsKICAgICAgICAgICAgJGRzbiA9IGFycmF5X21lcmdlKCRwYXJzZWQsICRkc24pOwogICAgICAgICAgICBpZiAoISRkc25bJ2Ric3ludGF4J10pIHsKICAgICAgICAgICAgICAgICRkc25bJ2Ric3ludGF4J10gPSAkZHNuWydwaHB0eXBlJ107CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuICRkc247CiAgICAgICAgfQoKICAgICAgICAvLyBGaW5kIHBocHR5cGUgYW5kIGRic3ludGF4CiAgICAgICAgaWYgKCgkcG9zID0gc3RycG9zKCRkc24sICc6Ly8nKSkgIT09IGZhbHNlKSB7CiAgICAgICAgICAgICRzdHIgPSBzdWJzdHIoJGRzbiwgMCwgJHBvcyk7CiAgICAgICAgICAgICRkc24gPSBzdWJzdHIoJGRzbiwgJHBvcyArIDMpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRzdHIgPSAkZHNuOwogICAgICAgICAgICAkZHNuID0gbnVsbDsKICAgICAgICB9CgogICAgICAgIC8vIEdldCBwaHB0eXBlIGFuZCBkYnN5bnRheAogICAgICAgIC8vICRzdHIgPT4gcGhwdHlwZShkYnN5bnRheCkKICAgICAgICBpZiAocHJlZ19tYXRjaCgnfF4oLis/KVwoKC4qPylcKSR8JywgJHN0ciwgJGFycikpIHsKICAgICAgICAgICAgJHBhcnNlZFsncGhwdHlwZSddICA9ICRhcnJbMV07CiAgICAgICAgICAgICRwYXJzZWRbJ2Ric3ludGF4J10gPSAhJGFyclsyXSA/ICRhcnJbMV0gOiAkYXJyWzJdOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRwYXJzZWRbJ3BocHR5cGUnXSAgPSAkc3RyOwogICAgICAgICAgICAkcGFyc2VkWydkYnN5bnRheCddID0gJHN0cjsKICAgICAgICB9CgogICAgICAgIGlmICghY291bnQoJGRzbikpIHsKICAgICAgICAgICAgcmV0dXJuICRwYXJzZWQ7CiAgICAgICAgfQoKICAgICAgICAvLyBHZXQgKGlmIGZvdW5kKTogdXNlcm5hbWUgYW5kIHBhc3N3b3JkCiAgICAgICAgLy8gJGRzbiA9PiB1c2VybmFtZTpwYXNzd29yZEBwcm90b2NvbCtob3N0c3BlYy9kYXRhYmFzZQogICAgICAgIGlmICgoJGF0ID0gc3RycnBvcygkZHNuLCdAJykpICE9PSBmYWxzZSkgewogICAgICAgICAgICAkc3RyID0gc3Vic3RyKCRkc24sIDAsICRhdCk7CiAgICAgICAgICAgICRkc24gPSBzdWJzdHIoJGRzbiwgJGF0ICsgMSk7CiAgICAgICAgICAgIGlmICgoJHBvcyA9IHN0cnBvcygkc3RyLCAnOicpKSAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgICRwYXJzZWRbJ3VzZXJuYW1lJ10gPSByYXd1cmxkZWNvZGUoc3Vic3RyKCRzdHIsIDAsICRwb3MpKTsKICAgICAgICAgICAgICAgICRwYXJzZWRbJ3Bhc3N3b3JkJ10gPSByYXd1cmxkZWNvZGUoc3Vic3RyKCRzdHIsICRwb3MgKyAxKSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkcGFyc2VkWyd1c2VybmFtZSddID0gcmF3dXJsZGVjb2RlKCRzdHIpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBGaW5kIHByb3RvY29sIGFuZCBob3N0c3BlYwoKICAgICAgICBpZiAocHJlZ19tYXRjaCgnfF4oW14oXSspXCgoLio/KVwpLz8oLio/KSR8JywgJGRzbiwgJG1hdGNoKSkgewogICAgICAgICAgICAvLyAkZHNuID0+IHByb3RvKHByb3RvX29wdHMpL2RhdGFiYXNlCiAgICAgICAgICAgICRwcm90byAgICAgICA9ICRtYXRjaFsxXTsKICAgICAgICAgICAgJHByb3RvX29wdHMgID0gJG1hdGNoWzJdID8gJG1hdGNoWzJdIDogZmFsc2U7CiAgICAgICAgICAgICRkc24gICAgICAgICA9ICRtYXRjaFszXTsKCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy8gJGRzbiA9PiBwcm90b2NvbCtob3N0c3BlYy9kYXRhYmFzZSAob2xkIGZvcm1hdCkKICAgICAgICAgICAgaWYgKHN0cnBvcygkZHNuLCAnKycpICE9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgbGlzdCgkcHJvdG8sICRkc24pID0gZXhwbG9kZSgnKycsICRkc24sIDIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChzdHJwb3MoJGRzbiwgJy8nKSAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgIGxpc3QoJHByb3RvX29wdHMsICRkc24pID0gZXhwbG9kZSgnLycsICRkc24sIDIpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJHByb3RvX29wdHMgPSAkZHNuOwogICAgICAgICAgICAgICAgJGRzbiA9IG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIHByb2Nlc3MgdGhlIGRpZmZlcmVudCBwcm90b2NvbCBvcHRpb25zCiAgICAgICAgJHBhcnNlZFsncHJvdG9jb2wnXSA9ICghZW1wdHkoJHByb3RvKSkgPyAkcHJvdG8gOiAndGNwJzsKICAgICAgICAkcHJvdG9fb3B0cyA9IHJhd3VybGRlY29kZSgkcHJvdG9fb3B0cyk7CiAgICAgICAgaWYgKHN0cnBvcygkcHJvdG9fb3B0cywgJzonKSAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgbGlzdCgkcHJvdG9fb3B0cywgJHBhcnNlZFsncG9ydCddKSA9IGV4cGxvZGUoJzonLCAkcHJvdG9fb3B0cyk7CiAgICAgICAgfQogICAgICAgIGlmICgkcGFyc2VkWydwcm90b2NvbCddID09ICd0Y3AnKSB7CiAgICAgICAgICAgICRwYXJzZWRbJ2hvc3RzcGVjJ10gPSAkcHJvdG9fb3B0czsKICAgICAgICB9IGVsc2VpZiAoJHBhcnNlZFsncHJvdG9jb2wnXSA9PSAndW5peCcpIHsKICAgICAgICAgICAgJHBhcnNlZFsnc29ja2V0J10gPSAkcHJvdG9fb3B0czsKICAgICAgICB9CgogICAgICAgIC8vIEdldCBkYWJhc2UgaWYgYW55CiAgICAgICAgLy8gJGRzbiA9PiBkYXRhYmFzZQogICAgICAgIGlmICgkZHNuKSB7CiAgICAgICAgICAgIGlmICgoJHBvcyA9IHN0cnBvcygkZHNuLCAnPycpKSA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgIC8vIC9kYXRhYmFzZQogICAgICAgICAgICAgICAgJHBhcnNlZFsnZGF0YWJhc2UnXSA9IHJhd3VybGRlY29kZSgkZHNuKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIC8vIC9kYXRhYmFzZT9wYXJhbTE9dmFsdWUxJnBhcmFtMj12YWx1ZTIKICAgICAgICAgICAgICAgICRwYXJzZWRbJ2RhdGFiYXNlJ10gPSByYXd1cmxkZWNvZGUoc3Vic3RyKCRkc24sIDAsICRwb3MpKTsKICAgICAgICAgICAgICAgICRkc24gPSBzdWJzdHIoJGRzbiwgJHBvcyArIDEpOwogICAgICAgICAgICAgICAgaWYgKHN0cnBvcygkZHNuLCAnJicpICE9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgICAgICRvcHRzID0gZXhwbG9kZSgnJicsICRkc24pOwogICAgICAgICAgICAgICAgfSBlbHNlIHsgLy8gZGF0YWJhc2U/cGFyYW0xPXZhbHVlMQogICAgICAgICAgICAgICAgICAgICRvcHRzID0gYXJyYXkoJGRzbik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmb3JlYWNoICgkb3B0cyBhcyAkb3B0KSB7CiAgICAgICAgICAgICAgICAgICAgbGlzdCgka2V5LCAkdmFsdWUpID0gZXhwbG9kZSgnPScsICRvcHQpOwogICAgICAgICAgICAgICAgICAgIGlmICghaXNzZXQoJHBhcnNlZFska2V5XSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9uJ3QgYWxsb3cgcGFyYW1zIG92ZXJ3cml0ZQogICAgICAgICAgICAgICAgICAgICAgICAkcGFyc2VkWyRrZXldID0gcmF3dXJsZGVjb2RlKCR2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJHBhcnNlZDsKICAgIH0KCiAgICAvLyB9fX0KICAgIC8vIHt7eyBnZXREU05TdHJpbmcoKQoKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgZ2l2ZW4gRFNOIGluIGEgc3RyaW5nIGZvcm1hdCBzdWl0YWJsZSBmb3Igb3V0cHV0LgogICAgICoKICAgICAqIEBwYXJhbSBhcnJheXxzdHJpbmcgdGhlIERTTiB0byBwYXJzZSBhbmQgZm9ybWF0CiAgICAgKiBAcGFyYW0gYm9vbGVhbiB0cnVlIHRvIGhpZGUgdGhlIHBhc3N3b3JkLCBmYWxzZSB0byBpbmNsdWRlIGl0CiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiBnZXREU05TdHJpbmcoJGRzbiwgJGhpZGVQYXNzd29yZCkgewogICAgICAgIC8qIENhbGxpbmcgcGFyc2VEU04gd2lsbCBlbnN1cmUgdGhhdCB3ZSBoYXZlIGFsbCB0aGUgYXJyYXkgZWxlbWVudHMKICAgICAgICAgKiBkZWZpbmVkLCBhbmQgbWVhbnMgdGhhdCB3ZSBkZWFsIHdpdGggc3RyaW5ncyBhbmQgYXJyYXkgaW4gdGhlIHNhbWUKICAgICAgICAgKiBtYW5uZXIuICovCiAgICAgICAgJGRzbkFycmF5ID0gREI6OnBhcnNlRFNOKCRkc24pOwogICAgICAgIAogICAgICAgIGlmICgkaGlkZVBhc3N3b3JkKSB7CiAgICAgICAgICAgICRkc25BcnJheVsncGFzc3dvcmQnXSA9ICdQQVNTV09SRCc7CiAgICAgICAgfQoKICAgICAgICAvKiBQcm90b2NvbCBpcyBzcGVjaWFsLWNhc2VkLCBhcyB1c2luZyB0aGUgZGVmYXVsdCAidGNwIiBhbG9uZyB3aXRoIGFuCiAgICAgICAgICogT3JhY2xlIFROUyBjb25uZWN0aW9uIHN0cmluZyBmYWlscy4gKi8KICAgICAgICBpZiAoaXNfc3RyaW5nKCRkc24pICYmIHN0cnBvcygkZHNuLCAndGNwJykgPT09IGZhbHNlICYmICRkc25BcnJheVsncHJvdG9jb2wnXSA9PSAndGNwJykgewogICAgICAgICAgICAkZHNuQXJyYXlbJ3Byb3RvY29sJ10gPSBmYWxzZTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLy8gTm93IHdlIGp1c3QgaGF2ZSB0byBjb25zdHJ1Y3QgdGhlIGFjdHVhbCBzdHJpbmcuIFRoaXMgaXMgdWdseS4KICAgICAgICAkZHNuU3RyaW5nID0gJGRzbkFycmF5WydwaHB0eXBlJ107CiAgICAgICAgaWYgKCRkc25BcnJheVsnZGJzeW50YXgnXSkgewogICAgICAgICAgICAkZHNuU3RyaW5nIC49ICcoJy4kZHNuQXJyYXlbJ2Ric3ludGF4J10uJyknOwogICAgICAgIH0KICAgICAgICAkZHNuU3RyaW5nIC49ICc6Ly8nCiAgICAgICAgICAgICAgICAgICAgIC4kZHNuQXJyYXlbJ3VzZXJuYW1lJ10KICAgICAgICAgICAgICAgICAgICAgLic6JwogICAgICAgICAgICAgICAgICAgICAuJGRzbkFycmF5WydwYXNzd29yZCddCiAgICAgICAgICAgICAgICAgICAgIC4nQCcKICAgICAgICAgICAgICAgICAgICAgLiRkc25BcnJheVsncHJvdG9jb2wnXTsKICAgICAgICBpZiAoJGRzbkFycmF5Wydzb2NrZXQnXSkgewogICAgICAgICAgICAkZHNuU3RyaW5nIC49ICcoJy4kZHNuQXJyYXlbJ3NvY2tldCddLicpJzsKICAgICAgICB9CiAgICAgICAgaWYgKCRkc25BcnJheVsncHJvdG9jb2wnXSAmJiAkZHNuQXJyYXlbJ2hvc3RzcGVjJ10pIHsKICAgICAgICAgICAgJGRzblN0cmluZyAuPSAnKyc7CiAgICAgICAgfQogICAgICAgICRkc25TdHJpbmcgLj0gJGRzbkFycmF5Wydob3N0c3BlYyddOwogICAgICAgIGlmICgkZHNuQXJyYXlbJ3BvcnQnXSkgewogICAgICAgICAgICAkZHNuU3RyaW5nIC49ICc6Jy4kZHNuQXJyYXlbJ3BvcnQnXTsKICAgICAgICB9CiAgICAgICAgJGRzblN0cmluZyAuPSAnLycuJGRzbkFycmF5WydkYXRhYmFzZSddOwogICAgICAgIAogICAgICAgIC8qIE9wdGlvbiBoYW5kbGluZy4gVW5mb3J0dW5hdGVseSwgcGFyc2VEU04gc2ltcGx5IHBsYWNlcyBvcHRpb25zIGludG8KICAgICAgICAgKiB0aGUgdG9wLWxldmVsIGFycmF5LCBzbyB3ZSdsbCBmaXJzdCBnZXQgcmlkIG9mIHRoZSBmaWVsZHMgZGVmaW5lZCBieQogICAgICAgICAqIERCIGFuZCBzZWUgd2hhdCdzIGxlZnQuICovCiAgICAgICAgdW5zZXQoJGRzbkFycmF5WydwaHB0eXBlJ10sCiAgICAgICAgICAgICAgJGRzbkFycmF5WydkYnN5bnRheCddLAogICAgICAgICAgICAgICRkc25BcnJheVsndXNlcm5hbWUnXSwKICAgICAgICAgICAgICAkZHNuQXJyYXlbJ3Bhc3N3b3JkJ10sCiAgICAgICAgICAgICAgJGRzbkFycmF5Wydwcm90b2NvbCddLAogICAgICAgICAgICAgICRkc25BcnJheVsnc29ja2V0J10sCiAgICAgICAgICAgICAgJGRzbkFycmF5Wydob3N0c3BlYyddLAogICAgICAgICAgICAgICRkc25BcnJheVsncG9ydCddLAogICAgICAgICAgICAgICRkc25BcnJheVsnZGF0YWJhc2UnXQogICAgICAgICk7CiAgICAgICAgaWYgKGNvdW50KCRkc25BcnJheSkgPiAwKSB7CiAgICAgICAgICAgICRkc25TdHJpbmcgLj0gJz8nOwogICAgICAgICAgICAkaSA9IDA7CiAgICAgICAgICAgIGZvcmVhY2ggKCRkc25BcnJheSBhcyAka2V5ID0+ICR2YWx1ZSkgewogICAgICAgICAgICAgICAgaWYgKCsrJGkgPiAxKSB7CiAgICAgICAgICAgICAgICAgICAgJGRzblN0cmluZyAuPSAnJic7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkZHNuU3RyaW5nIC49ICRrZXkuJz0nLiR2YWx1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRkc25TdHJpbmc7CiAgICB9CiAgICAKICAgIC8vIH19fQp9CgovLyB9fX0KLy8ge3t7IGNsYXNzIERCX0Vycm9yCgovKioKICogREJfRXJyb3IgaW1wbGVtZW50cyBhIGNsYXNzIGZvciByZXBvcnRpbmcgcG9ydGFibGUgZGF0YWJhc2UgZXJyb3IKICogbWVzc2FnZXMKICoKICogQGNhdGVnb3J5ICAgRGF0YWJhc2UKICogQHBhY2thZ2UgICAgREIKICogQGF1dGhvciAgICAgU3RpZyBCYWtrZW4gPHNzYkBwaHAubmV0PgogKiBAY29weXJpZ2h0ICAxOTk3LTIwMDUgVGhlIFBIUCBHcm91cAogKiBAbGljZW5zZSAgICBodHRwOi8vd3d3LnBocC5uZXQvbGljZW5zZS8zXzAudHh0ICBQSFAgTGljZW5zZSAzLjAKICogQHZlcnNpb24gICAgUmVsZWFzZTogMS43LjEyCiAqIEBsaW5rICAgICAgIGh0dHA6Ly9wZWFyLnBocC5uZXQvcGFja2FnZS9EQgogKi8KY2xhc3MgREJfRXJyb3IgZXh0ZW5kcyBQRUFSX0Vycm9yCnsKICAgIC8vIHt7eyBjb25zdHJ1Y3RvcgoKICAgIC8qKgogICAgICogREJfRXJyb3IgY29uc3RydWN0b3IKICAgICAqCiAgICAgKiBAcGFyYW0gbWl4ZWQgJGNvZGUgICAgICAgREIgZXJyb3IgY29kZSwgb3Igc3RyaW5nIHdpdGggZXJyb3IgbWVzc2FnZQogICAgICogQHBhcmFtIGludCAgICRtb2RlICAgICAgIHdoYXQgImVycm9yIG1vZGUiIHRvIG9wZXJhdGUgaW4KICAgICAqIEBwYXJhbSBpbnQgICAkbGV2ZWwgICAgICB3aGF0IGVycm9yIGxldmVsIHRvIHVzZSBmb3IgJG1vZGUgJgogICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICBQRUFSX0VSUk9SX1RSSUdHRVIKICAgICAqIEBwYXJhbSBtaXhlZCAkZGVidWdpbmZvICBhZGRpdGlvbmFsIGRlYnVnIGluZm8sIHN1Y2ggYXMgdGhlIGxhc3QgcXVlcnkKICAgICAqCiAgICAgKiBAc2VlIFBFQVJfRXJyb3IKICAgICAqLwogICAgZnVuY3Rpb24gREJfRXJyb3IoJGNvZGUgPSBEQl9FUlJPUiwgJG1vZGUgPSBQRUFSX0VSUk9SX1JFVFVSTiwKICAgICAgICAgICAgICAgICAgICAgICRsZXZlbCA9IEVfVVNFUl9OT1RJQ0UsICRkZWJ1Z2luZm8gPSBudWxsKQogICAgewogICAgICAgIGlmIChpc19pbnQoJGNvZGUpKSB7CiAgICAgICAgICAgICR0aGlzLT5QRUFSX0Vycm9yKCdEQiBFcnJvcjogJyAuIERCOjplcnJvck1lc3NhZ2UoJGNvZGUpLCAkY29kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJG1vZGUsICRsZXZlbCwgJGRlYnVnaW5mbyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJHRoaXMtPlBFQVJfRXJyb3IoIkRCIEVycm9yOiAkY29kZSIsIERCX0VSUk9SLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbW9kZSwgJGxldmVsLCAkZGVidWdpbmZvKTsKICAgICAgICB9CiAgICB9CgogICAgLy8gfX19Cn0KCi8vIH19fQovLyB7e3sgY2xhc3MgREJfcmVzdWx0CgovKioKICogVGhpcyBjbGFzcyBpbXBsZW1lbnRzIGEgd3JhcHBlciBmb3IgYSBEQiByZXN1bHQgc2V0CiAqCiAqIEEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3Mgd2lsbCBiZSByZXR1cm5lZCBieSB0aGUgREIgaW1wbGVtZW50YXRpb24KICogYWZ0ZXIgcHJvY2Vzc2luZyBhIHF1ZXJ5IHRoYXQgcmV0dXJucyBkYXRhLgogKgogKiBAY2F0ZWdvcnkgICBEYXRhYmFzZQogKiBAcGFja2FnZSAgICBEQgogKiBAYXV0aG9yICAgICBTdGlnIEJha2tlbiA8c3NiQHBocC5uZXQ+CiAqIEBjb3B5cmlnaHQgIDE5OTctMjAwNSBUaGUgUEhQIEdyb3VwCiAqIEBsaWNlbnNlICAgIGh0dHA6Ly93d3cucGhwLm5ldC9saWNlbnNlLzNfMC50eHQgIFBIUCBMaWNlbnNlIDMuMAogKiBAdmVyc2lvbiAgICBSZWxlYXNlOiAxLjcuMTIKICogQGxpbmsgICAgICAgaHR0cDovL3BlYXIucGhwLm5ldC9wYWNrYWdlL0RCCiAqLwpjbGFzcyBEQl9yZXN1bHQKewogICAgLy8ge3t7IHByb3BlcnRpZXMKCiAgICAvKioKICAgICAqIFNob3VsZCByZXN1bHRzIGJlIGZyZWVkIGF1dG9tYXRpY2FsbHkgd2hlbiB0aGVyZSBhcmUgbm8gbW9yZSByb3dzPwogICAgICogQHZhciBib29sZWFuCiAgICAgKiBAc2VlIERCX2NvbW1vbjo6JG9wdGlvbnMKICAgICAqLwogICAgdmFyICRhdXRvZnJlZTsKCiAgICAvKioKICAgICAqIEEgcmVmZXJlbmNlIHRvIHRoZSBEQl88ZHJpdmVyPiBvYmplY3QKICAgICAqIEB2YXIgb2JqZWN0CiAgICAgKi8KICAgIHZhciAkZGJoOwoKICAgIC8qKgogICAgICogVGhlIGN1cnJlbnQgZGVmYXVsdCBmZXRjaCBtb2RlCiAgICAgKiBAdmFyIGludGVnZXIKICAgICAqIEBzZWUgREJfY29tbW9uOjokZmV0Y2htb2RlCiAgICAgKi8KICAgIHZhciAkZmV0Y2htb2RlOwoKICAgIC8qKgogICAgICogVGhlIG5hbWUgb2YgdGhlIGNsYXNzIGludG8gd2hpY2ggcmVzdWx0cyBzaG91bGQgYmUgZmV0Y2hlZCB3aGVuCiAgICAgKiBEQl9GRVRDSE1PREVfT0JKRUNUIGlzIGluIGVmZmVjdAogICAgICoKICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKiBAc2VlIERCX2NvbW1vbjo6JGZldGNobW9kZV9vYmplY3RfY2xhc3MKICAgICAqLwogICAgdmFyICRmZXRjaG1vZGVfb2JqZWN0X2NsYXNzOwoKICAgIC8qKgogICAgICogVGhlIG51bWJlciBvZiByb3dzIHRvIGZldGNoIGZyb20gYSBsaW1pdCBxdWVyeQogICAgICogQHZhciBpbnRlZ2VyCiAgICAgKi8KICAgIHZhciAkbGltaXRfY291bnQgPSBudWxsOwoKICAgIC8qKgogICAgICogVGhlIHJvdyB0byBzdGFydCBmZXRjaGluZyBmcm9tIGluIGxpbWl0IHF1ZXJpZXMKICAgICAqIEB2YXIgaW50ZWdlcgogICAgICovCiAgICB2YXIgJGxpbWl0X2Zyb20gPSBudWxsOwoKICAgIC8qKgogICAgICogVGhlIGV4ZWN1dGUgcGFyYW1ldGVycyB0aGF0IGNyZWF0ZWQgdGhpcyByZXN1bHQKICAgICAqIEB2YXIgYXJyYXkKICAgICAqIEBzaW5jZSBQcm9wZXJ0eSBhdmFpbGFibGUgc2luY2UgUmVsZWFzZSAxLjcuMAogICAgICovCiAgICB2YXIgJHBhcmFtZXRlcnM7CgogICAgLyoqCiAgICAgKiBUaGUgcXVlcnkgc3RyaW5nIHRoYXQgY3JlYXRlZCB0aGlzIHJlc3VsdAogICAgICoKICAgICAqIENvcGllZCBoZXJlIGluY2FzZSBpdCBjaGFuZ2VzIGluICRkYmgsIHdoaWNoIGlzIHJlZmVyZW5jZWQKICAgICAqCiAgICAgKiBAdmFyIHN0cmluZwogICAgICogQHNpbmNlIFByb3BlcnR5IGF2YWlsYWJsZSBzaW5jZSBSZWxlYXNlIDEuNy4wCiAgICAgKi8KICAgIHZhciAkcXVlcnk7CgogICAgLyoqCiAgICAgKiBUaGUgcXVlcnkgcmVzdWx0IHJlc291cmNlIGlkIGNyZWF0ZWQgYnkgUEhQCiAgICAgKiBAdmFyIHJlc291cmNlCiAgICAgKi8KICAgIHZhciAkcmVzdWx0OwoKICAgIC8qKgogICAgICogVGhlIHByZXNlbnQgcm93IGJlaW5nIGRlYWx0IHdpdGgKICAgICAqIEB2YXIgaW50ZWdlcgogICAgICovCiAgICB2YXIgJHJvd19jb3VudGVyID0gbnVsbDsKCiAgICAvKioKICAgICAqIFRoZSBwcmVwYXJlZCBzdGF0ZW1lbnQgcmVzb3VyY2UgaWQgY3JlYXRlZCBieSBQSFAgaW4gJGRiaAogICAgICoKICAgICAqIFRoaXMgcmVzb3VyY2UgaXMgb25seSBhdmFpbGFibGUgd2hlbiB0aGUgcmVzdWx0IHNldCB3YXMgY3JlYXRlZCB1c2luZwogICAgICogYSBkcml2ZXIncyBuYXRpdmUgZXhlY3V0ZSgpIG1ldGhvZCwgbm90IFBFQVIgREIncyBlbXVsYXRlZCBvbmUuCiAgICAgKgogICAgICogQ29waWVkIGhlcmUgaW5jYXNlIGl0IGNoYW5nZXMgaW4gJGRiaCwgd2hpY2ggaXMgcmVmZXJlbmNlZAogICAgICoKICAgICAqIHtAaW50ZXJuYWwgIE1haW5seSBoZXJlIGJlY2F1c2UgdGhlIEludGVyQmFzZS9GaXJlYmlyZCBBUEkgaXMgb25seQogICAgICogYWJsZSB0byByZXRyaWV2ZSBkYXRhIGZyb20gcmVzdWx0IHNldHMgaWYgdGhlIHN0YXRlbW50IGhhbmRsZSBpcwogICAgICogc3RpbGwgaW4gc2NvcGUufX0KICAgICAqCiAgICAgKiBAdmFyIHJlc291cmNlCiAgICAgKiBAc2luY2UgUHJvcGVydHkgYXZhaWxhYmxlIHNpbmNlIFJlbGVhc2UgMS43LjAKICAgICAqLwogICAgdmFyICRzdGF0ZW1lbnQ7CgoKICAgIC8vIH19fQogICAgLy8ge3t7IGNvbnN0cnVjdG9yCgogICAgLyoqCiAgICAgKiBUaGlzIGNvbnN0cnVjdG9yIHNldHMgdGhlIG9iamVjdCdzIHByb3BlcnRpZXMKICAgICAqCiAgICAgKiBAcGFyYW0gb2JqZWN0ICAgJiRkYmggICAgIHRoZSBEQiBvYmplY3QgcmVmZXJlbmNlCiAgICAgKiBAcGFyYW0gcmVzb3VyY2UgJHJlc3VsdCAgIHRoZSByZXN1bHQgcmVzb3VyY2UgaWQKICAgICAqIEBwYXJhbSBhcnJheSAgICAkb3B0aW9ucyAgYW4gYXNzb2NpYXRpdmUgYXJyYXkgd2l0aCByZXN1bHQgb3B0aW9ucwogICAgICoKICAgICAqIEByZXR1cm4gdm9pZAogICAgICovCiAgICBmdW5jdGlvbiBEQl9yZXN1bHQoJiRkYmgsICRyZXN1bHQsICRvcHRpb25zID0gYXJyYXkoKSkKICAgIHsKICAgICAgICAkdGhpcy0+YXV0b2ZyZWUgICAgPSAkZGJoLT5vcHRpb25zWydhdXRvZnJlZSddOwogICAgICAgICR0aGlzLT5kYmggICAgICAgICA9ICYkZGJoOwogICAgICAgICR0aGlzLT5mZXRjaG1vZGUgICA9ICRkYmgtPmZldGNobW9kZTsKICAgICAgICAkdGhpcy0+ZmV0Y2htb2RlX29iamVjdF9jbGFzcyA9ICRkYmgtPmZldGNobW9kZV9vYmplY3RfY2xhc3M7CiAgICAgICAgJHRoaXMtPnBhcmFtZXRlcnMgID0gJGRiaC0+bGFzdF9wYXJhbWV0ZXJzOwogICAgICAgICR0aGlzLT5xdWVyeSAgICAgICA9ICRkYmgtPmxhc3RfcXVlcnk7CiAgICAgICAgJHRoaXMtPnJlc3VsdCAgICAgID0gJHJlc3VsdDsKICAgICAgICAkdGhpcy0+c3RhdGVtZW50ICAgPSBlbXB0eSgkZGJoLT5sYXN0X3N0bXQpID8gbnVsbCA6ICRkYmgtPmxhc3Rfc3RtdDsKICAgICAgICBmb3JlYWNoICgkb3B0aW9ucyBhcyAka2V5ID0+ICR2YWx1ZSkgewogICAgICAgICAgICAkdGhpcy0+c2V0T3B0aW9uKCRrZXksICR2YWx1ZSk7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogU2V0IG9wdGlvbnMgZm9yIHRoZSBEQl9yZXN1bHQgb2JqZWN0CiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAka2V5ICAgIHRoZSBvcHRpb24gdG8gc2V0CiAgICAgKiBAcGFyYW0gbWl4ZWQgICR2YWx1ZSAgdGhlIHZhbHVlIHRvIHNldCB0aGUgb3B0aW9uIHRvCiAgICAgKgogICAgICogQHJldHVybiB2b2lkCiAgICAgKi8KICAgIGZ1bmN0aW9uIHNldE9wdGlvbigka2V5LCAkdmFsdWUgPSBudWxsKQogICAgewogICAgICAgIHN3aXRjaCAoJGtleSkgewogICAgICAgICAgICBjYXNlICdsaW1pdF9mcm9tJzoKICAgICAgICAgICAgICAgICR0aGlzLT5saW1pdF9mcm9tID0gJHZhbHVlOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ2xpbWl0X2NvdW50JzoKICAgICAgICAgICAgICAgICR0aGlzLT5saW1pdF9jb3VudCA9ICR2YWx1ZTsKICAgICAgICB9CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgZmV0Y2hSb3coKQoKICAgIC8qKgogICAgICogRmV0Y2ggYSByb3cgb2YgZGF0YSBhbmQgcmV0dXJuIGl0IGJ5IHJlZmVyZW5jZSBpbnRvIGFuIGFycmF5CiAgICAgKgogICAgICogVGhlIHR5cGUgb2YgYXJyYXkgcmV0dXJuZWQgY2FuIGJlIGNvbnRyb2xsZWQgZWl0aGVyIGJ5IHNldHRpbmcgdGhpcwogICAgICogbWV0aG9kJ3MgPHZhcj4kZmV0Y2htb2RlPC92YXI+IHBhcmFtZXRlciBvciBieSBjaGFuZ2luZyB0aGUgZGVmYXVsdAogICAgICogZmV0Y2ggbW9kZSBzZXRGZXRjaE1vZGUoKSBiZWZvcmUgY2FsbGluZyB0aGlzIG1ldGhvZC4KICAgICAqCiAgICAgKiBUaGVyZSBhcmUgdHdvIG9wdGlvbnMgZm9yIHN0YW5kYXJkaXppbmcgdGhlIGluZm9ybWF0aW9uIHJldHVybmVkCiAgICAgKiBmcm9tIGRhdGFiYXNlcywgZW5zdXJpbmcgdGhlaXIgdmFsdWVzIGFyZSBjb25zaXN0ZW50IHdoZW4gY2hhbmdpbmcKICAgICAqIERCTVMncy4gIFRoZXNlIHBvcnRhYmlsaXR5IG9wdGlvbnMgY2FuIGJlIHR1cm5lZCBvbiB3aGVuIGNyZWF0aW5nIGEKICAgICAqIG5ldyBEQiBvYmplY3Qgb3IgYnkgdXNpbmcgc2V0T3B0aW9uKCkuCiAgICAgKgogICAgICogICArIDx2YXI+REJfUE9SVEFCSUxJVFlfTE9XRVJDQVNFPC92YXI+CiAgICAgKiAgICAgY29udmVydCBuYW1lcyBvZiBmaWVsZHMgdG8gbG93ZXIgY2FzZQogICAgICoKICAgICAqICAgKyA8dmFyPkRCX1BPUlRBQklMSVRZX1JUUklNPC92YXI+CiAgICAgKiAgICAgcmlnaHQgdHJpbSB0aGUgZGF0YQogICAgICoKICAgICAqIEBwYXJhbSBpbnQgJGZldGNobW9kZSAgdGhlIGNvbnN0YW50IGluZGljYXRpbmcgaG93IHRvIGZvcm1hdCB0aGUgZGF0YQogICAgICogQHBhcmFtIGludCAkcm93bnVtICAgICB0aGUgcm93IG51bWJlciB0byBmZXRjaCAoaW5kZXggc3RhcnRzIGF0IDApCiAgICAgKgogICAgICogQHJldHVybiBtaXhlZCAgYW4gYXJyYXkgb3Igb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHJvdydzIGRhdGEsCiAgICAgKiAgICAgICAgICAgICAgICAgTlVMTCB3aGVuIHRoZSBlbmQgb2YgdGhlIHJlc3VsdCBzZXQgaXMgcmVhY2hlZAogICAgICogICAgICAgICAgICAgICAgIG9yIGEgREJfRXJyb3Igb2JqZWN0IG9uIGZhaWx1cmUuCiAgICAgKgogICAgICogQHNlZSBEQl9jb21tb246OnNldE9wdGlvbigpLCBEQl9jb21tb246OnNldEZldGNoTW9kZSgpCiAgICAgKi8KICAgIGZ1bmN0aW9uICZmZXRjaFJvdygkZmV0Y2htb2RlID0gREJfRkVUQ0hNT0RFX0RFRkFVTFQsICRyb3dudW0gPSBudWxsKQogICAgewogICAgICAgIGlmICgkZmV0Y2htb2RlID09PSBEQl9GRVRDSE1PREVfREVGQVVMVCkgewogICAgICAgICAgICAkZmV0Y2htb2RlID0gJHRoaXMtPmZldGNobW9kZTsKICAgICAgICB9CiAgICAgICAgaWYgKCRmZXRjaG1vZGUgPT09IERCX0ZFVENITU9ERV9PQkpFQ1QpIHsKICAgICAgICAgICAgJGZldGNobW9kZSA9IERCX0ZFVENITU9ERV9BU1NPQzsKICAgICAgICAgICAgJG9iamVjdF9jbGFzcyA9ICR0aGlzLT5mZXRjaG1vZGVfb2JqZWN0X2NsYXNzOwogICAgICAgIH0KICAgICAgICBpZiAoaXNfbnVsbCgkcm93bnVtKSAmJiAkdGhpcy0+bGltaXRfZnJvbSAhPT0gbnVsbCkgewogICAgICAgICAgICBpZiAoJHRoaXMtPnJvd19jb3VudGVyID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICAkdGhpcy0+cm93X2NvdW50ZXIgPSAkdGhpcy0+bGltaXRfZnJvbTsKICAgICAgICAgICAgICAgIC8vIFNraXAgcm93cwogICAgICAgICAgICAgICAgaWYgKCR0aGlzLT5kYmgtPmZlYXR1cmVzWydsaW1pdCddID09PSBmYWxzZSkgewogICAgICAgICAgICAgICAgICAgICRpID0gMDsKICAgICAgICAgICAgICAgICAgICB3aGlsZSAoJGkrKyA8ICR0aGlzLT5saW1pdF9mcm9tKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5kYmgtPmZldGNoSW50bygkdGhpcy0+cmVzdWx0LCAkYXJyLCAkZmV0Y2htb2RlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCR0aGlzLT5yb3dfY291bnRlciA+PSAoJHRoaXMtPmxpbWl0X2Zyb20gKyAkdGhpcy0+bGltaXRfY291bnQpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoJHRoaXMtPmF1dG9mcmVlKSB7CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmZyZWUoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICR0bXAgPSBudWxsOwogICAgICAgICAgICAgICAgcmV0dXJuICR0bXA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCR0aGlzLT5kYmgtPmZlYXR1cmVzWydsaW1pdCddID09PSAnZW11bGF0ZScpIHsKICAgICAgICAgICAgICAgICRyb3dudW0gPSAkdGhpcy0+cm93X2NvdW50ZXI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJHRoaXMtPnJvd19jb3VudGVyKys7CiAgICAgICAgfQogICAgICAgICRyZXMgPSAkdGhpcy0+ZGJoLT5mZXRjaEludG8oJHRoaXMtPnJlc3VsdCwgJGFyciwgJGZldGNobW9kZSwgJHJvd251bSk7CiAgICAgICAgaWYgKCRyZXMgPT09IERCX09LKSB7CiAgICAgICAgICAgIGlmIChpc3NldCgkb2JqZWN0X2NsYXNzKSkgewogICAgICAgICAgICAgICAgLy8gVGhlIGRlZmF1bHQgbW9kZSBpcyBzcGVjaWZpZWQgaW4gdGhlCiAgICAgICAgICAgICAgICAvLyBEQl9jb21tb246OmZldGNobW9kZV9vYmplY3RfY2xhc3MgcHJvcGVydHkKICAgICAgICAgICAgICAgIGlmICgkb2JqZWN0X2NsYXNzID09ICdzdGRDbGFzcycpIHsKICAgICAgICAgICAgICAgICAgICAkYXJyID0gKG9iamVjdCkgJGFycjsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJGFyciA9ICZuZXcgJG9iamVjdF9jbGFzcygkYXJyKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gJGFycjsKICAgICAgICB9CiAgICAgICAgaWYgKCRyZXMgPT0gbnVsbCAmJiAkdGhpcy0+YXV0b2ZyZWUpIHsKICAgICAgICAgICAgJHRoaXMtPmZyZWUoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICRyZXM7CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgZmV0Y2hJbnRvKCkKCiAgICAvKioKICAgICAqIEZldGNoIGEgcm93IG9mIGRhdGEgaW50byBhbiBhcnJheSB3aGljaCBpcyBwYXNzZWQgYnkgcmVmZXJlbmNlCiAgICAgKgogICAgICogVGhlIHR5cGUgb2YgYXJyYXkgcmV0dXJuZWQgY2FuIGJlIGNvbnRyb2xsZWQgZWl0aGVyIGJ5IHNldHRpbmcgdGhpcwogICAgICogbWV0aG9kJ3MgPHZhcj4kZmV0Y2htb2RlPC92YXI+IHBhcmFtZXRlciBvciBieSBjaGFuZ2luZyB0aGUgZGVmYXVsdAogICAgICogZmV0Y2ggbW9kZSBzZXRGZXRjaE1vZGUoKSBiZWZvcmUgY2FsbGluZyB0aGlzIG1ldGhvZC4KICAgICAqCiAgICAgKiBUaGVyZSBhcmUgdHdvIG9wdGlvbnMgZm9yIHN0YW5kYXJkaXppbmcgdGhlIGluZm9ybWF0aW9uIHJldHVybmVkCiAgICAgKiBmcm9tIGRhdGFiYXNlcywgZW5zdXJpbmcgdGhlaXIgdmFsdWVzIGFyZSBjb25zaXN0ZW50IHdoZW4gY2hhbmdpbmcKICAgICAqIERCTVMncy4gIFRoZXNlIHBvcnRhYmlsaXR5IG9wdGlvbnMgY2FuIGJlIHR1cm5lZCBvbiB3aGVuIGNyZWF0aW5nIGEKICAgICAqIG5ldyBEQiBvYmplY3Qgb3IgYnkgdXNpbmcgc2V0T3B0aW9uKCkuCiAgICAgKgogICAgICogICArIDx2YXI+REJfUE9SVEFCSUxJVFlfTE9XRVJDQVNFPC92YXI+CiAgICAgKiAgICAgY29udmVydCBuYW1lcyBvZiBmaWVsZHMgdG8gbG93ZXIgY2FzZQogICAgICoKICAgICAqICAgKyA8dmFyPkRCX1BPUlRBQklMSVRZX1JUUklNPC92YXI+CiAgICAgKiAgICAgcmlnaHQgdHJpbSB0aGUgZGF0YQogICAgICoKICAgICAqIEBwYXJhbSBhcnJheSAmJGFyciAgICAgICB0aGUgdmFyaWFibGUgd2hlcmUgdGhlIGRhdGEgc2hvdWxkIGJlIHBsYWNlZAogICAgICogQHBhcmFtIGludCAgICRmZXRjaG1vZGUgIHRoZSBjb25zdGFudCBpbmRpY2F0aW5nIGhvdyB0byBmb3JtYXQgdGhlIGRhdGEKICAgICAqIEBwYXJhbSBpbnQgICAkcm93bnVtICAgICB0aGUgcm93IG51bWJlciB0byBmZXRjaCAoaW5kZXggc3RhcnRzIGF0IDApCiAgICAgKgogICAgICogQHJldHVybiBtaXhlZCAgREJfT0sgaWYgYSByb3cgaXMgcHJvY2Vzc2VkLCBOVUxMIHdoZW4gdGhlIGVuZCBvZiB0aGUKICAgICAqICAgICAgICAgICAgICAgICByZXN1bHQgc2V0IGlzIHJlYWNoZWQgb3IgYSBEQl9FcnJvciBvYmplY3Qgb24gZmFpbHVyZQogICAgICoKICAgICAqIEBzZWUgREJfY29tbW9uOjpzZXRPcHRpb24oKSwgREJfY29tbW9uOjpzZXRGZXRjaE1vZGUoKQogICAgICovCiAgICBmdW5jdGlvbiBmZXRjaEludG8oJiRhcnIsICRmZXRjaG1vZGUgPSBEQl9GRVRDSE1PREVfREVGQVVMVCwgJHJvd251bSA9IG51bGwpCiAgICB7CiAgICAgICAgaWYgKCRmZXRjaG1vZGUgPT09IERCX0ZFVENITU9ERV9ERUZBVUxUKSB7CiAgICAgICAgICAgICRmZXRjaG1vZGUgPSAkdGhpcy0+ZmV0Y2htb2RlOwogICAgICAgIH0KICAgICAgICBpZiAoJGZldGNobW9kZSA9PT0gREJfRkVUQ0hNT0RFX09CSkVDVCkgewogICAgICAgICAgICAkZmV0Y2htb2RlID0gREJfRkVUQ0hNT0RFX0FTU09DOwogICAgICAgICAgICAkb2JqZWN0X2NsYXNzID0gJHRoaXMtPmZldGNobW9kZV9vYmplY3RfY2xhc3M7CiAgICAgICAgfQogICAgICAgIGlmIChpc19udWxsKCRyb3dudW0pICYmICR0aGlzLT5saW1pdF9mcm9tICE9PSBudWxsKSB7CiAgICAgICAgICAgIGlmICgkdGhpcy0+cm93X2NvdW50ZXIgPT09IG51bGwpIHsKICAgICAgICAgICAgICAgICR0aGlzLT5yb3dfY291bnRlciA9ICR0aGlzLT5saW1pdF9mcm9tOwogICAgICAgICAgICAgICAgLy8gU2tpcCByb3dzCiAgICAgICAgICAgICAgICBpZiAoJHRoaXMtPmRiaC0+ZmVhdHVyZXNbJ2xpbWl0J10gPT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAgICAgJGkgPSAwOwogICAgICAgICAgICAgICAgICAgIHdoaWxlICgkaSsrIDwgJHRoaXMtPmxpbWl0X2Zyb20pIHsKICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmRiaC0+ZmV0Y2hJbnRvKCR0aGlzLT5yZXN1bHQsICRhcnIsICRmZXRjaG1vZGUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoJHRoaXMtPnJvd19jb3VudGVyID49ICgKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+bGltaXRfZnJvbSArICR0aGlzLT5saW1pdF9jb3VudCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICgkdGhpcy0+YXV0b2ZyZWUpIHsKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+ZnJlZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCR0aGlzLT5kYmgtPmZlYXR1cmVzWydsaW1pdCddID09PSAnZW11bGF0ZScpIHsKICAgICAgICAgICAgICAgICRyb3dudW0gPSAkdGhpcy0+cm93X2NvdW50ZXI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICR0aGlzLT5yb3dfY291bnRlcisrOwogICAgICAgIH0KICAgICAgICAkcmVzID0gJHRoaXMtPmRiaC0+ZmV0Y2hJbnRvKCR0aGlzLT5yZXN1bHQsICRhcnIsICRmZXRjaG1vZGUsICRyb3dudW0pOwogICAgICAgIGlmICgkcmVzID09PSBEQl9PSykgewogICAgICAgICAgICBpZiAoaXNzZXQoJG9iamVjdF9jbGFzcykpIHsKICAgICAgICAgICAgICAgIC8vIGRlZmF1bHQgbW9kZSBzcGVjaWZpZWQgaW4gdGhlCiAgICAgICAgICAgICAgICAvLyBEQl9jb21tb246OmZldGNobW9kZV9vYmplY3RfY2xhc3MgcHJvcGVydHkKICAgICAgICAgICAgICAgIGlmICgkb2JqZWN0X2NsYXNzID09ICdzdGRDbGFzcycpIHsKICAgICAgICAgICAgICAgICAgICAkYXJyID0gKG9iamVjdCkgJGFycjsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJGFyciA9IG5ldyAkb2JqZWN0X2NsYXNzKCRhcnIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBEQl9PSzsKICAgICAgICB9CiAgICAgICAgaWYgKCRyZXMgPT0gbnVsbCAmJiAkdGhpcy0+YXV0b2ZyZWUpIHsKICAgICAgICAgICAgJHRoaXMtPmZyZWUoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICRyZXM7CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgbnVtQ29scygpCgogICAgLyoqCiAgICAgKiBHZXQgdGhlIHRoZSBudW1iZXIgb2YgY29sdW1ucyBpbiBhIHJlc3VsdCBzZXQKICAgICAqCiAgICAgKiBAcmV0dXJuIGludCAgdGhlIG51bWJlciBvZiBjb2x1bW5zLiAgQSBEQl9FcnJvciBvYmplY3Qgb24gZmFpbHVyZS4KICAgICAqLwogICAgZnVuY3Rpb24gbnVtQ29scygpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5kYmgtPm51bUNvbHMoJHRoaXMtPnJlc3VsdCk7CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgbnVtUm93cygpCgogICAgLyoqCiAgICAgKiBHZXQgdGhlIG51bWJlciBvZiByb3dzIGluIGEgcmVzdWx0IHNldAogICAgICoKICAgICAqIEByZXR1cm4gaW50ICB0aGUgbnVtYmVyIG9mIHJvd3MuICBBIERCX0Vycm9yIG9iamVjdCBvbiBmYWlsdXJlLgogICAgICovCiAgICBmdW5jdGlvbiBudW1Sb3dzKCkKICAgIHsKICAgICAgICBpZiAoJHRoaXMtPmRiaC0+ZmVhdHVyZXNbJ251bXJvd3MnXSA9PT0gJ2VtdWxhdGUnCiAgICAgICAgICAgICYmICR0aGlzLT5kYmgtPm9wdGlvbnNbJ3BvcnRhYmlsaXR5J10gJiBEQl9QT1JUQUJJTElUWV9OVU1ST1dTKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCR0aGlzLT5kYmgtPmZlYXR1cmVzWydwcmVwYXJlJ10pIHsKICAgICAgICAgICAgICAgICRyZXMgPSAkdGhpcy0+ZGJoLT5xdWVyeSgkdGhpcy0+cXVlcnksICR0aGlzLT5wYXJhbWV0ZXJzKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICRyZXMgPSAkdGhpcy0+ZGJoLT5xdWVyeSgkdGhpcy0+cXVlcnkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChEQjo6aXNFcnJvcigkcmVzKSkgewogICAgICAgICAgICAgICAgcmV0dXJuICRyZXM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJGkgPSAwOwogICAgICAgICAgICB3aGlsZSAoJHJlcy0+ZmV0Y2hJbnRvKCR0bXAsIERCX0ZFVENITU9ERV9PUkRFUkVEKSkgewogICAgICAgICAgICAgICAgJGkrKzsKICAgICAgICAgICAgfQogICAgICAgICAgICAkY291bnQgPSAkaTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkY291bnQgPSAkdGhpcy0+ZGJoLT5udW1Sb3dzKCR0aGlzLT5yZXN1bHQpOwogICAgICAgIH0KCiAgICAgICAgLyogZmJzcWwgaXMgY2hlY2tlZCBmb3IgaGVyZSBiZWNhdXNlIGxpbWl0IHF1ZXJpZXMgYXJlIGltcGxlbWVudGVkCiAgICAgICAgICogdXNpbmcgYSBUT1AoKSBmdW5jdGlvbiwgd2hpY2ggcmVzdWx0cyBpbiBmYnNxbF9udW1fcm93cyBzdGlsbAogICAgICAgICAqIHJldHVybmluZyB0aGUgdG90YWwgbnVtYmVyIG9mIHJvd3MgdGhhdCB3b3VsZCBoYXZlIGJlZW4gcmV0dXJuZWQsCiAgICAgICAgICogcmF0aGVyIHRoYW4gdGhlIHJlYWwgbnVtYmVyLiBBcyBhIHJlc3VsdCwgd2UnbGwganVzdCBkbyB0aGUgbGltaXQKICAgICAgICAgKiBjYWxjdWxhdGlvbnMgZm9yIGZic3FsIGluIHRoZSBzYW1lIHdheSBhcyBhIGRhdGFiYXNlIHdpdGggZW11bGF0ZWQKICAgICAgICAgKiBsaW1pdHMuIFVuZm9ydHVuYXRlbHksIHdlIGNhbid0IGp1c3QgZG8gdGhpcyBpbiBEQl9mYnNxbDo6bnVtUm93cygpCiAgICAgICAgICogYmVjYXVzZSB0aGF0IG9ubHkgZ2V0cyB0aGUgcmVzdWx0IHJlc291cmNlLCByYXRoZXIgdGhhbiB0aGUgZnVsbAogICAgICAgICAqIERCX1Jlc3VsdCBvYmplY3QuICovCiAgICAgICAgaWYgKCgkdGhpcy0+ZGJoLT5mZWF0dXJlc1snbGltaXQnXSA9PT0gJ2VtdWxhdGUnCiAgICAgICAgICAgICAmJiAkdGhpcy0+bGltaXRfZnJvbSAhPT0gbnVsbCkKICAgICAgICAgICAgfHwgJHRoaXMtPmRiaC0+cGhwdHlwZSA9PSAnZmJzcWwnKSB7CiAgICAgICAgICAgICRsaW1pdF9jb3VudCA9IGlzX251bGwoJHRoaXMtPmxpbWl0X2NvdW50KSA/ICRjb3VudCA6ICR0aGlzLT5saW1pdF9jb3VudDsKICAgICAgICAgICAgaWYgKCRjb3VudCA8ICR0aGlzLT5saW1pdF9mcm9tKSB7CiAgICAgICAgICAgICAgICAkY291bnQgPSAwOwogICAgICAgICAgICB9IGVsc2VpZiAoJGNvdW50IDwgKCR0aGlzLT5saW1pdF9mcm9tICsgJGxpbWl0X2NvdW50KSkgewogICAgICAgICAgICAgICAgJGNvdW50IC09ICR0aGlzLT5saW1pdF9mcm9tOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJGNvdW50ID0gJGxpbWl0X2NvdW50OwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJGNvdW50OwogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IG5leHRSZXN1bHQoKQoKICAgIC8qKgogICAgICogR2V0IHRoZSBuZXh0IHJlc3VsdCBpZiBhIGJhdGNoIG9mIHF1ZXJpZXMgd2FzIGV4ZWN1dGVkCiAgICAgKgogICAgICogQHJldHVybiBib29sICB0cnVlIGlmIGEgbmV3IHJlc3VsdCBpcyBhdmFpbGFibGUgb3IgZmFsc2UgaWYgbm90CiAgICAgKi8KICAgIGZ1bmN0aW9uIG5leHRSZXN1bHQoKQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+ZGJoLT5uZXh0UmVzdWx0KCR0aGlzLT5yZXN1bHQpOwogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IGZyZWUoKQoKICAgIC8qKgogICAgICogRnJlZXMgdGhlIHJlc291cmNlcyBhbGxvY2F0ZWQgZm9yIHRoaXMgcmVzdWx0IHNldAogICAgICoKICAgICAqIEByZXR1cm4gYm9vbCAgdHJ1ZSBvbiBzdWNjZXNzLiAgQSBEQl9FcnJvciBvYmplY3Qgb24gZmFpbHVyZS4KICAgICAqLwogICAgZnVuY3Rpb24gZnJlZSgpCiAgICB7CiAgICAgICAgJGVyciA9ICR0aGlzLT5kYmgtPmZyZWVSZXN1bHQoJHRoaXMtPnJlc3VsdCk7CiAgICAgICAgaWYgKERCOjppc0Vycm9yKCRlcnIpKSB7CiAgICAgICAgICAgIHJldHVybiAkZXJyOwogICAgICAgIH0KICAgICAgICAkdGhpcy0+cmVzdWx0ID0gZmFsc2U7CiAgICAgICAgJHRoaXMtPnN0YXRlbWVudCA9IGZhbHNlOwogICAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IHRhYmxlSW5mbygpCgogICAgLyoqCiAgICAgKiBAc2VlIERCX2NvbW1vbjo6dGFibGVJbmZvKCkKICAgICAqIEBkZXByZWNhdGVkIE1ldGhvZCBkZXByZWNhdGVkIHNvbWUgdGltZSBiZWZvcmUgUmVsZWFzZSAxLjIKICAgICAqLwogICAgZnVuY3Rpb24gdGFibGVJbmZvKCRtb2RlID0gbnVsbCkKICAgIHsKICAgICAgICBpZiAoaXNfc3RyaW5nKCRtb2RlKSkgewogICAgICAgICAgICByZXR1cm4gJHRoaXMtPmRiaC0+cmFpc2VFcnJvcihEQl9FUlJPUl9ORUVEX01PUkVfREFUQSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiAkdGhpcy0+ZGJoLT50YWJsZUluZm8oJHRoaXMsICRtb2RlKTsKICAgIH0KCiAgICAvLyB9fX0KICAgIC8vIHt7eyBnZXRRdWVyeSgpCgogICAgLyoqCiAgICAgKiBEZXRlcm1pbmUgdGhlIHF1ZXJ5IHN0cmluZyB0aGF0IGNyZWF0ZWQgdGhpcyByZXN1bHQKICAgICAqCiAgICAgKiBAcmV0dXJuIHN0cmluZyAgdGhlIHF1ZXJ5IHN0cmluZwogICAgICoKICAgICAqIEBzaW5jZSBNZXRob2QgYXZhaWxhYmxlIHNpbmNlIFJlbGVhc2UgMS43LjAKICAgICAqLwogICAgZnVuY3Rpb24gZ2V0UXVlcnkoKQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+cXVlcnk7CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgZ2V0Um93Q291bnRlcigpCgogICAgLyoqCiAgICAgKiBUZWxscyB3aGljaCByb3cgbnVtYmVyIGlzIGN1cnJlbnRseSBiZWluZyBwcm9jZXNzZWQKICAgICAqCiAgICAgKiBAcmV0dXJuIGludGVnZXIgIHRoZSBjdXJyZW50IHJvdyBiZWluZyBsb29rZWQgYXQuICBTdGFydHMgYXQgMS4KICAgICAqLwogICAgZnVuY3Rpb24gZ2V0Um93Q291bnRlcigpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5yb3dfY291bnRlcjsKICAgIH0KCiAgICAvLyB9fX0KfQoKLy8gfX19Ci8vIHt7eyBjbGFzcyBEQl9yb3cKCi8qKgogKiBQRUFSIERCIFJvdyBPYmplY3QKICoKICogVGhlIG9iamVjdCBjb250YWlucyBhIHJvdyBvZiBkYXRhIGZyb20gYSByZXN1bHQgc2V0LiAgRWFjaCBjb2x1bW4ncyBkYXRhCiAqIGlzIHBsYWNlZCBpbiBhIHByb3BlcnR5IG5hbWVkIGZvciB0aGUgY29sdW1uLgogKgogKiBAY2F0ZWdvcnkgICBEYXRhYmFzZQogKiBAcGFja2FnZSAgICBEQgogKiBAYXV0aG9yICAgICBTdGlnIEJha2tlbiA8c3NiQHBocC5uZXQ+CiAqIEBjb3B5cmlnaHQgIDE5OTctMjAwNSBUaGUgUEhQIEdyb3VwCiAqIEBsaWNlbnNlICAgIGh0dHA6Ly93d3cucGhwLm5ldC9saWNlbnNlLzNfMC50eHQgIFBIUCBMaWNlbnNlIDMuMAogKiBAdmVyc2lvbiAgICBSZWxlYXNlOiAxLjcuMTIKICogQGxpbmsgICAgICAgaHR0cDovL3BlYXIucGhwLm5ldC9wYWNrYWdlL0RCCiAqIEBzZWUgICAgICAgIERCX2NvbW1vbjo6c2V0RmV0Y2hNb2RlKCkKICovCmNsYXNzIERCX3Jvdwp7CiAgICAvLyB7e3sgY29uc3RydWN0b3IKCiAgICAvKioKICAgICAqIFRoZSBjb25zdHJ1Y3RvciBwbGFjZXMgYSByb3cncyBkYXRhIGludG8gcHJvcGVydGllcyBvZiB0aGlzIG9iamVjdAogICAgICoKICAgICAqIEBwYXJhbSBhcnJheSAgdGhlIGFycmF5IGNvbnRhaW5pbmcgdGhlIHJvdydzIGRhdGEKICAgICAqCiAgICAgKiBAcmV0dXJuIHZvaWQKICAgICAqLwogICAgZnVuY3Rpb24gREJfcm93KCYkYXJyKQogICAgewogICAgICAgIGZvcmVhY2ggKCRhcnIgYXMgJGtleSA9PiAkdmFsdWUpIHsKICAgICAgICAgICAgJHRoaXMtPiRrZXkgPSAmJGFyclska2V5XTsKICAgICAgICB9CiAgICB9CgogICAgLy8gfX19Cn0KCi8vIH19fQoKLyoKICogTG9jYWwgdmFyaWFibGVzOgogKiB0YWItd2lkdGg6IDQKICogYy1iYXNpYy1vZmZzZXQ6IDQKICogRW5kOgogKi8KCj8+Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/pear/DB/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/pear/DB/common.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qIHZpbTogc2V0IGV4cGFuZHRhYiB0YWJzdG9wPTQgc2hpZnR3aWR0aD00IHNvZnR0YWJzdG9wPTQ6ICovCgovKioKICogQ29udGFpbnMgdGhlIERCX2NvbW1vbiBiYXNlIGNsYXNzCiAqCiAqIFBIUCB2ZXJzaW9ucyA0IGFuZCA1CiAqCiAqIExJQ0VOU0U6IFRoaXMgc291cmNlIGZpbGUgaXMgc3ViamVjdCB0byB2ZXJzaW9uIDMuMCBvZiB0aGUgUEhQIGxpY2Vuc2UKICogdGhhdCBpcyBhdmFpbGFibGUgdGhyb3VnaCB0aGUgd29ybGQtd2lkZS13ZWIgYXQgdGhlIGZvbGxvd2luZyBVUkk6CiAqIGh0dHA6Ly93d3cucGhwLm5ldC9saWNlbnNlLzNfMC50eHQuICBJZiB5b3UgZGlkIG5vdCByZWNlaXZlIGEgY29weSBvZgogKiB0aGUgUEhQIExpY2Vuc2UgYW5kIGFyZSB1bmFibGUgdG8gb2J0YWluIGl0IHRocm91Z2ggdGhlIHdlYiwgcGxlYXNlCiAqIHNlbmQgYSBub3RlIHRvIGxpY2Vuc2VAcGhwLm5ldCBzbyB3ZSBjYW4gbWFpbCB5b3UgYSBjb3B5IGltbWVkaWF0ZWx5LgogKgogKiBAY2F0ZWdvcnkgICBEYXRhYmFzZQogKiBAcGFja2FnZSAgICBEQgogKiBAYXV0aG9yICAgICBTdGlnIEJha2tlbiA8c3NiQHBocC5uZXQ+CiAqIEBhdXRob3IgICAgIFRvbWFzIFYuVi4gQ294IDxjb3hAaWRlY25ldC5jb20+CiAqIEBhdXRob3IgICAgIERhbmllbCBDb252aXNzb3IgPGRhbmllbGNAcGhwLm5ldD4KICogQGNvcHlyaWdodCAgMTk5Ny0yMDA1IFRoZSBQSFAgR3JvdXAKICogQGxpY2Vuc2UgICAgaHR0cDovL3d3dy5waHAubmV0L2xpY2Vuc2UvM18wLnR4dCAgUEhQIExpY2Vuc2UgMy4wCiAqIEB2ZXJzaW9uICAgIENWUzogJElkOiBjb21tb24ucGhwLHYgMS4xNDAgMjAwNy8wMS8xMiAwMjo0MTowNyBhaGFydmV5IEV4cCAkCiAqIEBsaW5rICAgICAgIGh0dHA6Ly9wZWFyLnBocC5uZXQvcGFja2FnZS9EQgogKi8KCi8qKgogKiBPYnRhaW4gdGhlIFBFQVIgY2xhc3Mgc28gaXQgY2FuIGJlIGV4dGVuZGVkIGZyb20KICovCnJlcXVpcmVfb25jZSAnUEVBUi5waHAnOwoKLyoqCiAqIERCX2NvbW1vbiBpcyB0aGUgYmFzZSBjbGFzcyBmcm9tIHdoaWNoIGVhY2ggZGF0YWJhc2UgZHJpdmVyIGNsYXNzIGV4dGVuZHMKICoKICogQWxsIGNvbW1vbiBtZXRob2RzIGFyZSBkZWNsYXJlZCBoZXJlLiAgSWYgYSBnaXZlbiBEQk1TIGRyaXZlciBjb250YWlucwogKiBhIHBhcnRpY3VsYXIgbWV0aG9kLCB0aGF0IG1ldGhvZCB3aWxsIG92ZXJsb2FkIHRoZSBvbmUgaGVyZS4KICoKICogQGNhdGVnb3J5ICAgRGF0YWJhc2UKICogQHBhY2thZ2UgICAgREIKICogQGF1dGhvciAgICAgU3RpZyBCYWtrZW4gPHNzYkBwaHAubmV0PgogKiBAYXV0aG9yICAgICBUb21hcyBWLlYuIENveCA8Y294QGlkZWNuZXQuY29tPgogKiBAYXV0aG9yICAgICBEYW5pZWwgQ29udmlzc29yIDxkYW5pZWxjQHBocC5uZXQ+CiAqIEBjb3B5cmlnaHQgIDE5OTctMjAwNSBUaGUgUEhQIEdyb3VwCiAqIEBsaWNlbnNlICAgIGh0dHA6Ly93d3cucGhwLm5ldC9saWNlbnNlLzNfMC50eHQgIFBIUCBMaWNlbnNlIDMuMAogKiBAdmVyc2lvbiAgICBSZWxlYXNlOiAxLjcuMTIKICogQGxpbmsgICAgICAgaHR0cDovL3BlYXIucGhwLm5ldC9wYWNrYWdlL0RCCiAqLwpjbGFzcyBEQl9jb21tb24gZXh0ZW5kcyBQRUFSCnsKICAgIC8vIHt7eyBwcm9wZXJ0aWVzCgogICAgLyoqCiAgICAgKiBUaGUgY3VycmVudCBkZWZhdWx0IGZldGNoIG1vZGUKICAgICAqIEB2YXIgaW50ZWdlcgogICAgICovCiAgICB2YXIgJGZldGNobW9kZSA9IERCX0ZFVENITU9ERV9PUkRFUkVEOwoKICAgIC8qKgogICAgICogVGhlIG5hbWUgb2YgdGhlIGNsYXNzIGludG8gd2hpY2ggcmVzdWx0cyBzaG91bGQgYmUgZmV0Y2hlZCB3aGVuCiAgICAgKiBEQl9GRVRDSE1PREVfT0JKRUNUIGlzIGluIGVmZmVjdAogICAgICoKICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHZhciAkZmV0Y2htb2RlX29iamVjdF9jbGFzcyA9ICdzdGRDbGFzcyc7CgogICAgLyoqCiAgICAgKiBXYXMgYSBjb25uZWN0aW9uIHByZXNlbnQgd2hlbiB0aGUgb2JqZWN0IHdhcyBzZXJpYWxpemVkKCk/CiAgICAgKiBAdmFyIGJvb2wKICAgICAqIEBzZWUgREJfY29tbW9uOjpfX3NsZWVwKCksIERCX2NvbW1vbjo6X193YWtlKCkKICAgICAqLwogICAgdmFyICR3YXNfY29ubmVjdGVkID0gbnVsbDsKCiAgICAvKioKICAgICAqIFRoZSBtb3N0IHJlY2VudGx5IGV4ZWN1dGVkIHF1ZXJ5CiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICB2YXIgJGxhc3RfcXVlcnkgPSAnJzsKCiAgICAvKioKICAgICAqIFJ1bi10aW1lIGNvbmZpZ3VyYXRpb24gb3B0aW9ucwogICAgICoKICAgICAqIFRoZSAnb3B0aW1pemUnIG9wdGlvbiBoYXMgYmVlbiBkZXByZWNhdGVkLiAgVXNlIHRoZSAncG9ydGFiaWxpdHknCiAgICAgKiBvcHRpb24gaW5zdGVhZC4KICAgICAqCiAgICAgKiBAdmFyIGFycmF5CiAgICAgKiBAc2VlIERCX2NvbW1vbjo6c2V0T3B0aW9uKCkKICAgICAqLwogICAgdmFyICRvcHRpb25zID0gYXJyYXkoCiAgICAgICAgJ3Jlc3VsdF9idWZmZXJpbmcnID0+IDUwMCwKICAgICAgICAncGVyc2lzdGVudCcgPT4gZmFsc2UsCiAgICAgICAgJ3NzbCcgPT4gZmFsc2UsCiAgICAgICAgJ2RlYnVnJyA9PiAwLAogICAgICAgICdzZXFuYW1lX2Zvcm1hdCcgPT4gJyVzX3NlcScsCiAgICAgICAgJ2F1dG9mcmVlJyA9PiBmYWxzZSwKICAgICAgICAncG9ydGFiaWxpdHknID0+IERCX1BPUlRBQklMSVRZX05PTkUsCiAgICAgICAgJ29wdGltaXplJyA9PiAncGVyZm9ybWFuY2UnLCAgLy8gRGVwcmVjYXRlZC4gIFVzZSAncG9ydGFiaWxpdHknLgogICAgKTsKCiAgICAvKioKICAgICAqIFRoZSBwYXJhbWV0ZXJzIGZyb20gdGhlIG1vc3QgcmVjZW50bHkgZXhlY3V0ZWQgcXVlcnkKICAgICAqIEB2YXIgYXJyYXkKICAgICAqIEBzaW5jZSBQcm9wZXJ0eSBhdmFpbGFibGUgc2luY2UgUmVsZWFzZSAxLjcuMAogICAgICovCiAgICB2YXIgJGxhc3RfcGFyYW1ldGVycyA9IGFycmF5KCk7CgogICAgLyoqCiAgICAgKiBUaGUgZWxlbWVudHMgZnJvbSBlYWNoIHByZXBhcmVkIHN0YXRlbWVudAogICAgICogQHZhciBhcnJheQogICAgICovCiAgICB2YXIgJHByZXBhcmVfdG9rZW5zID0gYXJyYXkoKTsKCiAgICAvKioKICAgICAqIFRoZSBkYXRhIHR5cGVzIG9mIHRoZSB2YXJpb3VzIGVsZW1lbnRzIGluIGVhY2ggcHJlcGFyZWQgc3RhdGVtZW50CiAgICAgKiBAdmFyIGFycmF5CiAgICAgKi8KICAgIHZhciAkcHJlcGFyZV90eXBlcyA9IGFycmF5KCk7CgogICAgLyoqCiAgICAgKiBUaGUgcHJlcGFyZWQgcXVlcmllcwogICAgICogQHZhciBhcnJheQogICAgICovCiAgICB2YXIgJHByZXBhcmVkX3F1ZXJpZXMgPSBhcnJheSgpOwoKICAgIC8qKgogICAgICogRmxhZyBpbmRpY2F0aW5nIHRoYXQgdGhlIGxhc3QgcXVlcnkgd2FzIGEgbWFuaXB1bGF0aW9uIHF1ZXJ5LgogICAgICogQGFjY2VzcyBwcm90ZWN0ZWQKICAgICAqIEB2YXIgYm9vbGVhbgogICAgICovCiAgICB2YXIgJF9sYXN0X3F1ZXJ5X21hbmlwID0gZmFsc2U7CgogICAgLyoqCiAgICAgKiBGbGFnIGluZGljYXRpbmcgdGhhdCB0aGUgbmV4dCBxdWVyeSA8ZW0+bXVzdDwvZW0+IGJlIGEgbWFuaXB1bGF0aW9uCiAgICAgKiBxdWVyeS4KICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkCiAgICAgKiBAdmFyIGJvb2xlYW4KICAgICAqLwogICAgdmFyICRfbmV4dF9xdWVyeV9tYW5pcCA9IGZhbHNlOwoKCiAgICAvLyB9fX0KICAgIC8vIHt7eyBEQl9jb21tb24KCiAgICAvKioKICAgICAqIFRoaXMgY29uc3RydWN0b3IgY2FsbHMgPGtiZD4kdGhpcy0+UEVBUignREJfRXJyb3InKTwva2JkPgogICAgICoKICAgICAqIEByZXR1cm4gdm9pZAogICAgICovCiAgICBmdW5jdGlvbiBEQl9jb21tb24oKQogICAgewogICAgICAgICR0aGlzLT5QRUFSKCdEQl9FcnJvcicpOwogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IF9fc2xlZXAoKQoKICAgIC8qKgogICAgICogQXV0b21hdGljYWxseSBpbmRpY2F0ZXMgd2hpY2ggcHJvcGVydGllcyBzaG91bGQgYmUgc2F2ZWQKICAgICAqIHdoZW4gUEhQJ3Mgc2VyaWFsaXplKCkgZnVuY3Rpb24gaXMgY2FsbGVkCiAgICAgKgogICAgICogQHJldHVybiBhcnJheSAgdGhlIGFycmF5IG9mIHByb3BlcnRpZXMgbmFtZXMgdGhhdCBzaG91bGQgYmUgc2F2ZWQKICAgICAqLwogICAgZnVuY3Rpb24gX19zbGVlcCgpCiAgICB7CiAgICAgICAgaWYgKCR0aGlzLT5jb25uZWN0aW9uKSB7CiAgICAgICAgICAgIC8vIERvbid0IGRpc2Nvbm5lY3QoKSwgcGVvcGxlIHVzZSBzZXJpYWxpemUoKSBmb3IgbWFueSByZWFzb25zCiAgICAgICAgICAgICR0aGlzLT53YXNfY29ubmVjdGVkID0gdHJ1ZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkdGhpcy0+d2FzX2Nvbm5lY3RlZCA9IGZhbHNlOwogICAgICAgIH0KICAgICAgICBpZiAoaXNzZXQoJHRoaXMtPmF1dG9jb21taXQpKSB7CiAgICAgICAgICAgIHJldHVybiBhcnJheSgnYXV0b2NvbW1pdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAnZGJzeW50YXgnLAogICAgICAgICAgICAgICAgICAgICAgICAgJ2RzbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAnZmVhdHVyZXMnLAogICAgICAgICAgICAgICAgICAgICAgICAgJ2ZldGNobW9kZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAnZmV0Y2htb2RlX29iamVjdF9jbGFzcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAnb3B0aW9ucycsCiAgICAgICAgICAgICAgICAgICAgICAgICAnd2FzX2Nvbm5lY3RlZCcsCiAgICAgICAgICAgICAgICAgICApOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiBhcnJheSgnZGJzeW50YXgnLAogICAgICAgICAgICAgICAgICAgICAgICAgJ2RzbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAnZmVhdHVyZXMnLAogICAgICAgICAgICAgICAgICAgICAgICAgJ2ZldGNobW9kZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAnZmV0Y2htb2RlX29iamVjdF9jbGFzcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAnb3B0aW9ucycsCiAgICAgICAgICAgICAgICAgICAgICAgICAnd2FzX2Nvbm5lY3RlZCcsCiAgICAgICAgICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAvLyB9fX0KICAgIC8vIHt7eyBfX3dha2V1cCgpCgogICAgLyoqCiAgICAgKiBBdXRvbWF0aWNhbGx5IHJlY29ubmVjdHMgdG8gdGhlIGRhdGFiYXNlIHdoZW4gUEhQJ3MgdW5zZXJpYWxpemUoKQogICAgICogZnVuY3Rpb24gaXMgY2FsbGVkCiAgICAgKgogICAgICogVGhlIHJlY29ubmVjdGlvbiBhdHRlbXB0IGlzIG9ubHkgcGVyZm9ybWVkIGlmIHRoZSBvYmplY3Qgd2FzIGNvbm5lY3RlZAogICAgICogYXQgdGhlIHRpbWUgUEhQJ3Mgc2VyaWFsaXplKCkgZnVuY3Rpb24gd2FzIHJ1bi4KICAgICAqCiAgICAgKiBAcmV0dXJuIHZvaWQKICAgICAqLwogICAgZnVuY3Rpb24gX193YWtldXAoKQogICAgewogICAgICAgIGlmICgkdGhpcy0+d2FzX2Nvbm5lY3RlZCkgewogICAgICAgICAgICAkdGhpcy0+Y29ubmVjdCgkdGhpcy0+ZHNuLCAkdGhpcy0+b3B0aW9ucyk7CiAgICAgICAgfQogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IF9fdG9TdHJpbmcoKQoKICAgIC8qKgogICAgICogQXV0b21hdGljIHN0cmluZyBjb252ZXJzaW9uIGZvciBQSFAgNQogICAgICoKICAgICAqIEByZXR1cm4gc3RyaW5nICBhIHN0cmluZyBkZXNjcmliaW5nIHRoZSBjdXJyZW50IFBFQVIgREIgb2JqZWN0CiAgICAgKgogICAgICogQHNpbmNlIE1ldGhvZCBhdmFpbGFibGUgc2luY2UgUmVsZWFzZSAxLjcuMAogICAgICovCiAgICBmdW5jdGlvbiBfX3RvU3RyaW5nKCkKICAgIHsKICAgICAgICAkaW5mbyA9IHN0cnRvbG93ZXIoZ2V0X2NsYXNzKCR0aGlzKSk7CiAgICAgICAgJGluZm8gLj0gICc6IChwaHB0eXBlPScgLiAkdGhpcy0+cGhwdHlwZSAuCiAgICAgICAgICAgICAgICAgICcsIGRic3ludGF4PScgLiAkdGhpcy0+ZGJzeW50YXggLgogICAgICAgICAgICAgICAgICAnKSc7CiAgICAgICAgaWYgKCR0aGlzLT5jb25uZWN0aW9uKSB7CiAgICAgICAgICAgICRpbmZvIC49ICcgW2Nvbm5lY3RlZF0nOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJGluZm87CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgdG9TdHJpbmcoKQoKICAgIC8qKgogICAgICogREVQUkVDQVRFRDogIFN0cmluZyBjb252ZXJzaW9uIG1ldGhvZAogICAgICoKICAgICAqIEByZXR1cm4gc3RyaW5nICBhIHN0cmluZyBkZXNjcmliaW5nIHRoZSBjdXJyZW50IFBFQVIgREIgb2JqZWN0CiAgICAgKgogICAgICogQGRlcHJlY2F0ZWQgTWV0aG9kIGRlcHJlY2F0ZWQgaW4gUmVsZWFzZSAxLjcuMAogICAgICovCiAgICBmdW5jdGlvbiB0b1N0cmluZygpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5fX3RvU3RyaW5nKCk7CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgcXVvdGVTdHJpbmcoKQoKICAgIC8qKgogICAgICogREVQUkVDQVRFRDogUXVvdGVzIGEgc3RyaW5nIHNvIGl0IGNhbiBiZSBzYWZlbHkgdXNlZCB3aXRoaW4gc3RyaW5nCiAgICAgKiBkZWxpbWl0ZXJzIGluIGEgcXVlcnkKICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICRzdHJpbmcgIHRoZSBzdHJpbmcgdG8gYmUgcXVvdGVkCiAgICAgKgogICAgICogQHJldHVybiBzdHJpbmcgIHRoZSBxdW90ZWQgc3RyaW5nCiAgICAgKgogICAgICogQHNlZSBEQl9jb21tb246OnF1b3RlU21hcnQoKSwgREJfY29tbW9uOjplc2NhcGVTaW1wbGUoKQogICAgICogQGRlcHJlY2F0ZWQgTWV0aG9kIGRlcHJlY2F0ZWQgc29tZSB0aW1lIGJlZm9yZSBSZWxlYXNlIDEuMgogICAgICovCiAgICBmdW5jdGlvbiBxdW90ZVN0cmluZygkc3RyaW5nKQogICAgewogICAgICAgICRzdHJpbmcgPSAkdGhpcy0+cXVvdGUoJHN0cmluZyk7CiAgICAgICAgaWYgKCRzdHJpbmd7MH0gPT0gIiciKSB7CiAgICAgICAgICAgIHJldHVybiBzdWJzdHIoJHN0cmluZywgMSwgLTEpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJHN0cmluZzsKICAgIH0KCiAgICAvLyB9fX0KICAgIC8vIHt7eyBxdW90ZSgpCgogICAgLyoqCiAgICAgKiBERVBSRUNBVEVEOiBRdW90ZXMgYSBzdHJpbmcgc28gaXQgY2FuIGJlIHNhZmVseSB1c2VkIGluIGEgcXVlcnkKICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICRzdHJpbmcgIHRoZSBzdHJpbmcgdG8gcXVvdGUKICAgICAqCiAgICAgKiBAcmV0dXJuIHN0cmluZyAgdGhlIHF1b3RlZCBzdHJpbmcgb3IgdGhlIHN0cmluZyA8c2FtcD5OVUxMPC9zYW1wPgogICAgICogICAgICAgICAgICAgICAgICBpZiB0aGUgdmFsdWUgc3VibWl0dGVkIGlzIDxrYmQ+bnVsbDwva2JkPi4KICAgICAqCiAgICAgKiBAc2VlIERCX2NvbW1vbjo6cXVvdGVTbWFydCgpLCBEQl9jb21tb246OmVzY2FwZVNpbXBsZSgpCiAgICAgKiBAZGVwcmVjYXRlZCBEZXByZWNhdGVkIGluIHJlbGVhc2UgMS42LjAKICAgICAqLwogICAgZnVuY3Rpb24gcXVvdGUoJHN0cmluZyA9IG51bGwpCiAgICB7CiAgICAgICAgcmV0dXJuICgkc3RyaW5nID09PSBudWxsKSA/ICdOVUxMJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiJyIgLiBzdHJfcmVwbGFjZSgiJyIsICInJyIsICRzdHJpbmcpIC4gIiciOwogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IHF1b3RlSWRlbnRpZmllcigpCgogICAgLyoqCiAgICAgKiBRdW90ZXMgYSBzdHJpbmcgc28gaXQgY2FuIGJlIHNhZmVseSB1c2VkIGFzIGEgdGFibGUgb3IgY29sdW1uIG5hbWUKICAgICAqCiAgICAgKiBEZWxpbWl0aW5nIHN0eWxlIGRlcGVuZHMgb24gd2hpY2ggZGF0YWJhc2UgZHJpdmVyIGlzIGJlaW5nIHVzZWQuCiAgICAgKgogICAgICogTk9URToganVzdCBiZWNhdXNlIHlvdSBDQU4gdXNlIGRlbGltaXRlZCBpZGVudGlmaWVycyBkb2Vzbid0IG1lYW4KICAgICAqIHlvdSBTSE9VTEQgdXNlIHRoZW0uICBJbiBnZW5lcmFsLCB0aGV5IGVuZCB1cCBjYXVzaW5nIHdheSBtb3JlCiAgICAgKiBwcm9ibGVtcyB0aGFuIHRoZXkgc29sdmUuCiAgICAgKgogICAgICogUG9ydGFiaWxpdHkgaXMgYnJva2VuIGJ5IHVzaW5nIHRoZSBmb2xsb3dpbmcgY2hhcmFjdGVycyBpbnNpZGUKICAgICAqIGRlbGltaXRlZCBpZGVudGlmaWVyczoKICAgICAqICAgKyBiYWNrdGljayAoPGtiZD5gPC9rYmQ+KSAtLSBkdWUgdG8gTXlTUUwKICAgICAqICAgKyBkb3VibGUgcXVvdGUgKDxrYmQ+Ijwva2JkPikgLS0gZHVlIHRvIE9yYWNsZQogICAgICogICArIGJyYWNrZXRzICg8a2JkPls8L2tiZD4gb3IgPGtiZD5dPC9rYmQ+KSAtLSBkdWUgdG8gQWNjZXNzCiAgICAgKgogICAgICogRGVsaW1pdGVkIGlkZW50aWZpZXJzIGFyZSBrbm93biB0byBnZW5lcmFsbHkgd29yayBjb3JyZWN0bHkgdW5kZXIKICAgICAqIHRoZSBmb2xsb3dpbmcgZHJpdmVyczoKICAgICAqICAgKyBtc3NxbAogICAgICogICArIG15c3FsCiAgICAgKiAgICsgbXlzcWxpCiAgICAgKiAgICsgb2NpOAogICAgICogICArIG9kYmMoYWNjZXNzKQogICAgICogICArIG9kYmMoZGIyKQogICAgICogICArIHBnc3FsCiAgICAgKiAgICsgc3FsaXRlCiAgICAgKiAgICsgc3liYXNlIChtdXN0IGV4ZWN1dGUgPGtiZD5zZXQgcXVvdGVkX2lkZW50aWZpZXIgb248L2tiZD4gc29tZXRpbWUKICAgICAqICAgICBwcmlvciB0byB1c2UpCiAgICAgKgogICAgICogSW50ZXJCYXNlIGRvZXNuJ3Qgc2VlbSB0byBiZSBhYmxlIHRvIHVzZSBkZWxpbWl0ZWQgaWRlbnRpZmllcnMKICAgICAqIHZpYSBQSFAgNC4gIFRoZXkgd29yayBmaW5lIHVuZGVyIFBIUCA1LgogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgJHN0ciAgdGhlIGlkZW50aWZpZXIgbmFtZSB0byBiZSBxdW90ZWQKICAgICAqCiAgICAgKiBAcmV0dXJuIHN0cmluZyAgdGhlIHF1b3RlZCBpZGVudGlmaWVyCiAgICAgKgogICAgICogQHNpbmNlIE1ldGhvZCBhdmFpbGFibGUgc2luY2UgUmVsZWFzZSAxLjYuMAogICAgICovCiAgICBmdW5jdGlvbiBxdW90ZUlkZW50aWZpZXIoJHN0cikKICAgIHsKICAgICAgICByZXR1cm4gJyInIC4gc3RyX3JlcGxhY2UoJyInLCAnIiInLCAkc3RyKSAuICciJzsKICAgIH0KCiAgICAvLyB9fX0KICAgIC8vIHt7eyBxdW90ZVNtYXJ0KCkKCiAgICAvKioKICAgICAqIEZvcm1hdHMgaW5wdXQgc28gaXQgY2FuIGJlIHNhZmVseSB1c2VkIGluIGEgcXVlcnkKICAgICAqCiAgICAgKiBUaGUgb3V0cHV0IGRlcGVuZHMgb24gdGhlIFBIUCBkYXRhIHR5cGUgb2YgaW5wdXQgYW5kIHRoZSBkYXRhYmFzZQogICAgICogdHlwZSBiZWluZyB1c2VkLgogICAgICoKICAgICAqIEBwYXJhbSBtaXhlZCAkaW4gIHRoZSBkYXRhIHRvIGJlIGZvcm1hdHRlZAogICAgICoKICAgICAqIEByZXR1cm4gbWl4ZWQgIHRoZSBmb3JtYXR0ZWQgZGF0YS4gIFRoZSBmb3JtYXQgZGVwZW5kcyBvbiB0aGUgaW5wdXQncwogICAgICogICAgICAgICAgICAgICAgIFBIUCB0eXBlOgogICAgICogPHVsPgogICAgICogIDxsaT4KICAgICAqICAgIDxrYmQ+aW5wdXQ8L2tiZD4gLT4gPHNhbXA+cmV0dXJuczwvc2FtcD4KICAgICAqICA8L2xpPgogICAgICogIDxsaT4KICAgICAqICAgIDxrYmQ+bnVsbDwva2JkPiAtPiB0aGUgc3RyaW5nIDxzYW1wPk5VTEw8L3NhbXA+CiAgICAgKiAgPC9saT4KICAgICAqICA8bGk+CiAgICAgKiAgICA8a2JkPmludGVnZXI8L2tiZD4gb3IgPGtiZD5kb3VibGU8L2tiZD4gLT4gdGhlIHVucXVvdGVkIG51bWJlcgogICAgICogIDwvbGk+CiAgICAgKiAgPGxpPgogICAgICogICAgPGtiZD5ib29sPC9rYmQ+IC0+IG91dHB1dCBkZXBlbmRzIG9uIHRoZSBkcml2ZXIgaW4gdXNlCiAgICAgKiAgICBNb3N0IGRyaXZlcnMgcmV0dXJuIGludGVnZXJzOiA8c2FtcD4xPC9zYW1wPiBpZgogICAgICogICAgPGtiZD50cnVlPC9rYmQ+IG9yIDxzYW1wPjA8L3NhbXA+IGlmCiAgICAgKiAgICA8a2JkPmZhbHNlPC9rYmQ+LgogICAgICogICAgU29tZSByZXR1cm4gc3RyaW5nczogPHNhbXA+VFJVRTwvc2FtcD4gaWYKICAgICAqICAgIDxrYmQ+dHJ1ZTwva2JkPiBvciA8c2FtcD5GQUxTRTwvc2FtcD4gaWYKICAgICAqICAgIDxrYmQ+ZmFsc2U8L2tiZD4uCiAgICAgKiAgICBGaW5hbGx5IG9uZSByZXR1cm5zIHN0cmluZ3M6IDxzYW1wPlQ8L3NhbXA+IGlmCiAgICAgKiAgICA8a2JkPnRydWU8L2tiZD4gb3IgPHNhbXA+Rjwvc2FtcD4gaWYKICAgICAqICAgIDxrYmQ+ZmFsc2U8L2tiZD4uIEhlcmUgaXMgYSBsaXN0IG9mIGVhY2ggREJNUywKICAgICAqICAgIHRoZSB2YWx1ZXMgcmV0dXJuZWQgYW5kIHRoZSBzdWdnZXN0ZWQgY29sdW1uIHR5cGU6CiAgICAgKiAgICA8dWw+CiAgICAgKiAgICAgIDxsaT4KICAgICAqICAgICAgICA8a2JkPmRiYXNlPC9rYmQ+IC0+IDxzYW1wPlQvRjwvc2FtcD4KICAgICAqICAgICAgICAoPGtiZD5Mb2dpY2FsPC9rYmQ+KQogICAgICogICAgICA8L2xpPgogICAgICogICAgICA8bGk+CiAgICAgKiAgICAgICAgPGtiZD5mYmFzZTwva2JkPiAtPiA8c2FtcD5UUlVFL0ZBTFNFPC9zYW1wPgogICAgICogICAgICAgICg8a2JkPkJPT0xFQU48L2tiZD4pCiAgICAgKiAgICAgIDwvbGk+CiAgICAgKiAgICAgIDxsaT4KICAgICAqICAgICAgICA8a2JkPmliYXNlPC9rYmQ+IC0+IDxzYW1wPjEvMDwvc2FtcD4KICAgICAqICAgICAgICAoPGtiZD5TTUFMTElOVDwva2JkPikgWzFdCiAgICAgKiAgICAgIDwvbGk+CiAgICAgKiAgICAgIDxsaT4KICAgICAqICAgICAgICA8a2JkPmlmeDwva2JkPiAtPiA8c2FtcD4xLzA8L3NhbXA+CiAgICAgKiAgICAgICAgKDxrYmQ+U01BTExJTlQ8L2tiZD4pIFsxXQogICAgICogICAgICA8L2xpPgogICAgICogICAgICA8bGk+CiAgICAgKiAgICAgICAgPGtiZD5tc3FsPC9rYmQ+IC0+IDxzYW1wPjEvMDwvc2FtcD4KICAgICAqICAgICAgICAoPGtiZD5JTlRFR0VSPC9rYmQ+KQogICAgICogICAgICA8L2xpPgogICAgICogICAgICA8bGk+CiAgICAgKiAgICAgICAgPGtiZD5tc3NxbDwva2JkPiAtPiA8c2FtcD4xLzA8L3NhbXA+CiAgICAgKiAgICAgICAgKDxrYmQ+QklUPC9rYmQ+KQogICAgICogICAgICA8L2xpPgogICAgICogICAgICA8bGk+CiAgICAgKiAgICAgICAgPGtiZD5teXNxbDwva2JkPiAtPiA8c2FtcD4xLzA8L3NhbXA+CiAgICAgKiAgICAgICAgKDxrYmQ+VElOWUlOVCgxKTwva2JkPikKICAgICAqICAgICAgPC9saT4KICAgICAqICAgICAgPGxpPgogICAgICogICAgICAgIDxrYmQ+bXlzcWxpPC9rYmQ+IC0+IDxzYW1wPjEvMDwvc2FtcD4KICAgICAqICAgICAgICAoPGtiZD5USU5ZSU5UKDEpPC9rYmQ+KQogICAgICogICAgICA8L2xpPgogICAgICogICAgICA8bGk+CiAgICAgKiAgICAgICAgPGtiZD5vY2k4PC9rYmQ+IC0+IDxzYW1wPjEvMDwvc2FtcD4KICAgICAqICAgICAgICAoPGtiZD5OVU1CRVIoMSk8L2tiZD4pCiAgICAgKiAgICAgIDwvbGk+CiAgICAgKiAgICAgIDxsaT4KICAgICAqICAgICAgICA8a2JkPm9kYmM8L2tiZD4gLT4gPHNhbXA+MS8wPC9zYW1wPgogICAgICogICAgICAgICg8a2JkPlNNQUxMSU5UPC9rYmQ+KSBbMV0KICAgICAqICAgICAgPC9saT4KICAgICAqICAgICAgPGxpPgogICAgICogICAgICAgIDxrYmQ+cGdzcWw8L2tiZD4gLT4gPHNhbXA+VFJVRS9GQUxTRTwvc2FtcD4KICAgICAqICAgICAgICAoPGtiZD5CT09MRUFOPC9rYmQ+KQogICAgICogICAgICA8L2xpPgogICAgICogICAgICA8bGk+CiAgICAgKiAgICAgICAgPGtiZD5zcWxpdGU8L2tiZD4gLT4gPHNhbXA+MS8wPC9zYW1wPgogICAgICogICAgICAgICg8a2JkPklOVEVHRVI8L2tiZD4pCiAgICAgKiAgICAgIDwvbGk+CiAgICAgKiAgICAgIDxsaT4KICAgICAqICAgICAgICA8a2JkPnN5YmFzZTwva2JkPiAtPiA8c2FtcD4xLzA8L3NhbXA+CiAgICAgKiAgICAgICAgKDxrYmQ+VElOWUlOVCgxKTwva2JkPikKICAgICAqICAgICAgPC9saT4KICAgICAqICAgIDwvdWw+CiAgICAgKiAgICBbMV0gQWNjb21tb2RhdGUgdGhlIGxvd2VzdCBjb21tb24gZGVub21pbmF0b3IgYmVjYXVzZSBub3QgYWxsCiAgICAgKiAgICB2ZXJzaW9ucyBvZiBoYXZlIDxrYmQ+Qk9PTEVBTjwva2JkPi4KICAgICAqICA8L2xpPgogICAgICogIDxsaT4KICAgICAqICAgIG90aGVyIChpbmNsdWRpbmcgc3RyaW5ncyBhbmQgbnVtZXJpYyBzdHJpbmdzKSAtPgogICAgICogICAgdGhlIGRhdGEgd2l0aCBzaW5nbGUgcXVvdGVzIGVzY2FwZWQgYnkgcHJlY2VlZGluZwogICAgICogICAgc2luZ2xlIHF1b3RlcywgYmFja3NsYXNoZXMgYXJlIGVzY2FwZWQgYnkgcHJlY2VlZGluZwogICAgICogICAgYmFja3NsYXNoZXMsIHRoZW4gdGhlIHdob2xlIHN0cmluZyBpcyBlbmNhcHN1bGF0ZWQKICAgICAqICAgIGJldHdlZW4gc2luZ2xlIHF1b3RlcwogICAgICogIDwvbGk+CiAgICAgKiA8L3VsPgogICAgICoKICAgICAqIEBzZWUgREJfY29tbW9uOjplc2NhcGVTaW1wbGUoKQogICAgICogQHNpbmNlIE1ldGhvZCBhdmFpbGFibGUgc2luY2UgUmVsZWFzZSAxLjYuMAogICAgICovCiAgICBmdW5jdGlvbiBxdW90ZVNtYXJ0KCRpbikKICAgIHsKICAgICAgICBpZiAoaXNfaW50KCRpbikpIHsKICAgICAgICAgICAgcmV0dXJuICRpbjsKICAgICAgICB9IGVsc2VpZiAoaXNfZmxvYXQoJGluKSkgewogICAgICAgICAgICByZXR1cm4gJHRoaXMtPnF1b3RlRmxvYXQoJGluKTsKICAgICAgICB9IGVsc2VpZiAoaXNfYm9vbCgkaW4pKSB7CiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+cXVvdGVCb29sZWFuKCRpbik7CiAgICAgICAgfSBlbHNlaWYgKGlzX251bGwoJGluKSkgewogICAgICAgICAgICByZXR1cm4gJ05VTEwnOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmICgkdGhpcy0+ZGJzeW50YXggPT0gJ2FjY2VzcycKICAgICAgICAgICAgICAgICYmIHByZWdfbWF0Y2goJy9eIy4rIyQvJywgJGluKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5lc2NhcGVTaW1wbGUoJGluKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gIiciIC4gJHRoaXMtPmVzY2FwZVNpbXBsZSgkaW4pIC4gIiciOwogICAgICAgIH0KICAgIH0KCiAgICAvLyB9fX0KICAgIC8vIHt7eyBxdW90ZUJvb2xlYW4oKQoKICAgIC8qKgogICAgICogRm9ybWF0cyBhIGJvb2xlYW4gdmFsdWUgZm9yIHVzZSB3aXRoaW4gYSBxdWVyeSBpbiBhIGxvY2FsZS1pbmRlcGVuZGVudAogICAgICogbWFubmVyLgogICAgICoKICAgICAqIEBwYXJhbSBib29sZWFuIHRoZSBib29sZWFuIHZhbHVlIHRvIGJlIHF1b3RlZC4KICAgICAqIEByZXR1cm4gc3RyaW5nIHRoZSBxdW90ZWQgc3RyaW5nLgogICAgICogQHNlZSBEQl9jb21tb246OnF1b3RlU21hcnQoKQogICAgICogQHNpbmNlIE1ldGhvZCBhdmFpbGFibGUgc2luY2UgcmVsZWFzZSAxLjcuOC4KICAgICAqLwogICAgZnVuY3Rpb24gcXVvdGVCb29sZWFuKCRib29sZWFuKSB7CiAgICAgICAgcmV0dXJuICRib29sZWFuID8gJzEnIDogJzAnOwogICAgfQogICAgIAogICAgLy8gfX19CiAgICAvLyB7e3sgcXVvdGVGbG9hdCgpCgogICAgLyoqCiAgICAgKiBGb3JtYXRzIGEgZmxvYXQgdmFsdWUgZm9yIHVzZSB3aXRoaW4gYSBxdWVyeSBpbiBhIGxvY2FsZS1pbmRlcGVuZGVudAogICAgICogbWFubmVyLgogICAgICoKICAgICAqIEBwYXJhbSBmbG9hdCB0aGUgZmxvYXQgdmFsdWUgdG8gYmUgcXVvdGVkLgogICAgICogQHJldHVybiBzdHJpbmcgdGhlIHF1b3RlZCBzdHJpbmcuCiAgICAgKiBAc2VlIERCX2NvbW1vbjo6cXVvdGVTbWFydCgpCiAgICAgKiBAc2luY2UgTWV0aG9kIGF2YWlsYWJsZSBzaW5jZSByZWxlYXNlIDEuNy44LgogICAgICovCiAgICBmdW5jdGlvbiBxdW90ZUZsb2F0KCRmbG9hdCkgewogICAgICAgIHJldHVybiAiJyIuJHRoaXMtPmVzY2FwZVNpbXBsZShzdHJfcmVwbGFjZSgnLCcsICcuJywgc3RydmFsKGZsb2F0dmFsKCRmbG9hdCkpKSkuIiciOwogICAgfQogICAgIAogICAgLy8gfX19CiAgICAvLyB7e3sgZXNjYXBlU2ltcGxlKCkKCiAgICAvKioKICAgICAqIEVzY2FwZXMgYSBzdHJpbmcgYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50IERCTVMncyBzdGFuZGFyZHMKICAgICAqCiAgICAgKiBJbiBTUUxpdGUsIHRoaXMgbWFrZXMgdGhpbmdzIHNhZmUgZm9yIGluc2VydHMvdXBkYXRlcywgYnV0IG1heQogICAgICogY2F1c2UgcHJvYmxlbXMgd2hlbiBwZXJmb3JtaW5nIHRleHQgY29tcGFyaXNvbnMgYWdhaW5zdCBjb2x1bW5zCiAgICAgKiBjb250YWluaW5nIGJpbmFyeSBkYXRhLiBTZWUgdGhlCiAgICAgKiB7QGxpbmsgaHR0cDovL3BocC5uZXQvc3FsaXRlX2VzY2FwZV9zdHJpbmcgUEhQIG1hbnVhbH0gZm9yIG1vcmUgaW5mby4KICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICRzdHIgIHRoZSBzdHJpbmcgdG8gYmUgZXNjYXBlZAogICAgICoKICAgICAqIEByZXR1cm4gc3RyaW5nICB0aGUgZXNjYXBlZCBzdHJpbmcKICAgICAqCiAgICAgKiBAc2VlIERCX2NvbW1vbjo6cXVvdGVTbWFydCgpCiAgICAgKiBAc2luY2UgTWV0aG9kIGF2YWlsYWJsZSBzaW5jZSBSZWxlYXNlIDEuNi4wCiAgICAgKi8KICAgIGZ1bmN0aW9uIGVzY2FwZVNpbXBsZSgkc3RyKQogICAgewogICAgICAgIHJldHVybiBzdHJfcmVwbGFjZSgiJyIsICInJyIsICRzdHIpOwogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IHByb3ZpZGVzKCkKCiAgICAvKioKICAgICAqIFRlbGxzIHdoZXRoZXIgdGhlIHByZXNlbnQgZHJpdmVyIHN1cHBvcnRzIGEgZ2l2ZW4gZmVhdHVyZQogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgJGZlYXR1cmUgIHRoZSBmZWF0dXJlIHlvdSdyZSBjdXJpb3VzIGFib3V0CiAgICAgKgogICAgICogQHJldHVybiBib29sICB3aGV0aGVyIHRoaXMgZHJpdmVyIHN1cHBvcnRzICRmZWF0dXJlCiAgICAgKi8KICAgIGZ1bmN0aW9uIHByb3ZpZGVzKCRmZWF0dXJlKQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+ZmVhdHVyZXNbJGZlYXR1cmVdOwogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IHNldEZldGNoTW9kZSgpCgogICAgLyoqCiAgICAgKiBTZXRzIHRoZSBmZXRjaCBtb2RlIHRoYXQgc2hvdWxkIGJlIHVzZWQgYnkgZGVmYXVsdCBmb3IgcXVlcnkgcmVzdWx0cwogICAgICoKICAgICAqIEBwYXJhbSBpbnRlZ2VyICRmZXRjaG1vZGUgICAgREJfRkVUQ0hNT0RFX09SREVSRUQsIERCX0ZFVENITU9ERV9BU1NPQwogICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgREJfRkVUQ0hNT0RFX09CSkVDVAogICAgICogQHBhcmFtIHN0cmluZyAkb2JqZWN0X2NsYXNzICB0aGUgY2xhc3MgbmFtZSBvZiB0aGUgb2JqZWN0IHRvIGJlIHJldHVybmVkCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieSB0aGUgZmV0Y2ggbWV0aG9kcyB3aGVuIHRoZQogICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJfRkVUQ0hNT0RFX09CSkVDVCBtb2RlIGlzIHNlbGVjdGVkLgogICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgbm8gY2xhc3MgaXMgc3BlY2lmaWVkIGJ5IGRlZmF1bHQgYSBjYXN0CiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBvYmplY3QgZnJvbSB0aGUgYXNzb2MgYXJyYXkgcm93IHdpbGwgYmUKICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUuICBUaGVyZSBpcyBhbHNvIHRoZSBwb3NpYmlsaXR5IHRvIHVzZQogICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGV4dGVuZCB0aGUgJ0RCX3JvdycgY2xhc3MuCiAgICAgKgogICAgICogQHNlZSBEQl9GRVRDSE1PREVfT1JERVJFRCwgREJfRkVUQ0hNT0RFX0FTU09DLCBEQl9GRVRDSE1PREVfT0JKRUNUCiAgICAgKi8KICAgIGZ1bmN0aW9uIHNldEZldGNoTW9kZSgkZmV0Y2htb2RlLCAkb2JqZWN0X2NsYXNzID0gJ3N0ZENsYXNzJykKICAgIHsKICAgICAgICBzd2l0Y2ggKCRmZXRjaG1vZGUpIHsKICAgICAgICAgICAgY2FzZSBEQl9GRVRDSE1PREVfT0JKRUNUOgogICAgICAgICAgICAgICAgJHRoaXMtPmZldGNobW9kZV9vYmplY3RfY2xhc3MgPSAkb2JqZWN0X2NsYXNzOwogICAgICAgICAgICBjYXNlIERCX0ZFVENITU9ERV9PUkRFUkVEOgogICAgICAgICAgICBjYXNlIERCX0ZFVENITU9ERV9BU1NPQzoKICAgICAgICAgICAgICAgICR0aGlzLT5mZXRjaG1vZGUgPSAkZmV0Y2htb2RlOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPnJhaXNlRXJyb3IoJ2ludmFsaWQgZmV0Y2htb2RlIG1vZGUnKTsKICAgICAgICB9CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgc2V0T3B0aW9uKCkKCiAgICAvKioKICAgICAqIFNldHMgcnVuLXRpbWUgY29uZmlndXJhdGlvbiBvcHRpb25zIGZvciBQRUFSIERCCiAgICAgKgogICAgICogT3B0aW9ucywgdGhlaXIgZGF0YSB0eXBlcywgZGVmYXVsdCB2YWx1ZXMgYW5kIGRlc2NyaXB0aW9uOgogICAgICogPHVsPgogICAgICogPGxpPgogICAgICogPHZhcj5hdXRvZnJlZTwvdmFyPiA8a2JkPmJvb2xlYW48L2tiZD4gPSA8c2FtcD5mYWxzZTwvc2FtcD4KICAgICAqICAgICAgPGJyIC8+c2hvdWxkIHJlc3VsdHMgYmUgZnJlZWQgYXV0b21hdGljYWxseSB3aGVuIHRoZXJlIGFyZSBubwogICAgICogICAgICAgICAgICBtb3JlIHJvd3M/CiAgICAgKiA8L2xpPjxsaT4KICAgICAqIDx2YXI+cmVzdWx0X2J1ZmZlcmluZzwvdmFyPiA8a2JkPmludGVnZXI8L2tiZD4gPSA8c2FtcD41MDA8L3NhbXA+CiAgICAgKiAgICAgIDxiciAvPmhvdyBtYW55IHJvd3Mgb2YgdGhlIHJlc3VsdCBzZXQgc2hvdWxkIGJlIGJ1ZmZlcmVkPwogICAgICogICAgICA8YnIgLz5JbiBteXNxbDogbXlzcWxfdW5idWZmZXJlZF9xdWVyeSgpIGlzIHVzZWQgaW5zdGVhZCBvZgogICAgICogICAgICAgICAgICBteXNxbF9xdWVyeSgpIGlmIHRoaXMgdmFsdWUgaXMgMC4gIChSZWxlYXNlIDEuNy4wKQogICAgICogICAgICA8YnIgLz5JbiBvY2k4OiB0aGlzIHZhbHVlIGlzIHBhc3NlZCB0byBvY2lzZXRwcmVmZXRjaCgpLgogICAgICogICAgICAgICAgICAoUmVsZWFzZSAxLjcuMCkKICAgICAqIDwvbGk+PGxpPgogICAgICogPHZhcj5kZWJ1ZzwvdmFyPiA8a2JkPmludGVnZXI8L2tiZD4gPSA8c2FtcD4wPC9zYW1wPgogICAgICogICAgICA8YnIgLz5kZWJ1ZyBsZXZlbAogICAgICogPC9saT48bGk+CiAgICAgKiA8dmFyPnBlcnNpc3RlbnQ8L3Zhcj4gPGtiZD5ib29sZWFuPC9rYmQ+ID0gPHNhbXA+ZmFsc2U8L3NhbXA+CiAgICAgKiAgICAgIDxiciAvPnNob3VsZCB0aGUgY29ubmVjdGlvbiBiZSBwZXJzaXN0ZW50PwogICAgICogPC9saT48bGk+CiAgICAgKiA8dmFyPnBvcnRhYmlsaXR5PC92YXI+IDxrYmQ+aW50ZWdlcjwva2JkPiA9IDxzYW1wPkRCX1BPUlRBQklMSVRZX05PTkU8L3NhbXA+CiAgICAgKiAgICAgIDxiciAvPnBvcnRhYmlsaXR5IG1vZGUgY29uc3RhbnQgKHNlZSBiZWxvdykKICAgICAqIDwvbGk+PGxpPgogICAgICogPHZhcj5zZXFuYW1lX2Zvcm1hdDwvdmFyPiA8a2JkPnN0cmluZzwva2JkPiA9IDxzYW1wPiVzX3NlcTwvc2FtcD4KICAgICAqICAgICAgPGJyIC8+dGhlIHNwcmludGYoKSBmb3JtYXQgc3RyaW5nIHVzZWQgb24gc2VxdWVuY2UgbmFtZXMuICBUaGlzCiAgICAgKiAgICAgICAgICAgIGZvcm1hdCBpcyBhcHBsaWVkIHRvIHNlcXVlbmNlIG5hbWVzIHBhc3NlZCB0bwogICAgICogICAgICAgICAgICBjcmVhdGVTZXF1ZW5jZSgpLCBuZXh0SUQoKSBhbmQgZHJvcFNlcXVlbmNlKCkuCiAgICAgKiA8L2xpPjxsaT4KICAgICAqIDx2YXI+c3NsPC92YXI+IDxrYmQ+Ym9vbGVhbjwva2JkPiA9IDxzYW1wPmZhbHNlPC9zYW1wPgogICAgICogICAgICA8YnIgLz51c2Ugc3NsIHRvIGNvbm5lY3Q/CiAgICAgKiA8L2xpPgogICAgICogPC91bD4KICAgICAqCiAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICoKICAgICAqIFBPUlRBQklMSVRZIE1PREVTCiAgICAgKgogICAgICogVGhlc2UgbW9kZXMgYXJlIGJpdHdpc2VkLCBzbyB0aGV5IGNhbiBiZSBjb21iaW5lZCB1c2luZyA8a2JkPnw8L2tiZD4KICAgICAqIGFuZCByZW1vdmVkIHVzaW5nIDxrYmQ+Xjwva2JkPi4gIFNlZSB0aGUgZXhhbXBsZXMgc2VjdGlvbiBiZWxvdyBvbiBob3cKICAgICAqIHRvIGRvIHRoaXMuCiAgICAgKgogICAgICogPHNhbXA+REJfUE9SVEFCSUxJVFlfTk9ORTwvc2FtcD4KICAgICAqIHR1cm4gb2ZmIGFsbCBwb3J0YWJpbGl0eSBmZWF0dXJlcwogICAgICoKICAgICAqIFRoaXMgbW9kZSBnZXRzIGF1dG9tYXRpY2FsbHkgdHVybmVkIG9uIGlmIHRoZSBkZXByZWNhdGVkCiAgICAgKiA8dmFyPm9wdGltaXplPC92YXI+IG9wdGlvbiBnZXRzIHNldCB0byA8c2FtcD5wZXJmb3JtYW5jZTwvc2FtcD4uCiAgICAgKgogICAgICoKICAgICAqIDxzYW1wPkRCX1BPUlRBQklMSVRZX0xPV0VSQ0FTRTwvc2FtcD4KICAgICAqIGNvbnZlcnQgbmFtZXMgb2YgdGFibGVzIGFuZCBmaWVsZHMgdG8gbG93ZXIgY2FzZSB3aGVuIHVzaW5nCiAgICAgKiA8a2JkPmdldCooKTwva2JkPiwgPGtiZD5mZXRjaCooKTwva2JkPiBhbmQgPGtiZD50YWJsZUluZm8oKTwva2JkPgogICAgICoKICAgICAqIFRoaXMgbW9kZSBnZXRzIGF1dG9tYXRpY2FsbHkgdHVybmVkIG9uIGluIHRoZSBmb2xsb3dpbmcgZGF0YWJhc2VzCiAgICAgKiBpZiB0aGUgZGVwcmVjYXRlZCBvcHRpb24gPHZhcj5vcHRpbWl6ZTwvdmFyPiBnZXRzIHNldCB0bwogICAgICogPHNhbXA+cG9ydGFiaWxpdHk8L3NhbXA+OgogICAgICogKyBvY2k4CiAgICAgKgogICAgICoKICAgICAqIDxzYW1wPkRCX1BPUlRBQklMSVRZX1JUUklNPC9zYW1wPgogICAgICogcmlnaHQgdHJpbSB0aGUgZGF0YSBvdXRwdXQgYnkgPGtiZD5nZXQqKCk8L2tiZD4gPGtiZD5mZXRjaCooKTwva2JkPgogICAgICoKICAgICAqCiAgICAgKiA8c2FtcD5EQl9QT1JUQUJJTElUWV9ERUxFVEVfQ09VTlQ8L3NhbXA+CiAgICAgKiBmb3JjZSByZXBvcnRpbmcgdGhlIG51bWJlciBvZiByb3dzIGRlbGV0ZWQKICAgICAqCiAgICAgKiBTb21lIERCTVMncyBkb24ndCBjb3VudCB0aGUgbnVtYmVyIG9mIHJvd3MgZGVsZXRlZCB3aGVuIHBlcmZvcm1pbmcKICAgICAqIHNpbXBsZSA8a2JkPkRFTEVURSBGUk9NIHRhYmxlbmFtZTwva2JkPiBxdWVyaWVzLiAgVGhpcyBwb3J0YWJpbGl0eQogICAgICogbW9kZSB0cmlja3Mgc3VjaCBEQk1TJ3MgaW50byB0ZWxsaW5nIHRoZSBjb3VudCBieSBhZGRpbmcKICAgICAqIDxzYW1wPldIRVJFIDE9MTwvc2FtcD4gdG8gdGhlIGVuZCBvZiA8a2JkPkRFTEVURTwva2JkPiBxdWVyaWVzLgogICAgICoKICAgICAqIFRoaXMgbW9kZSBnZXRzIGF1dG9tYXRpY2FsbHkgdHVybmVkIG9uIGluIHRoZSBmb2xsb3dpbmcgZGF0YWJhc2VzCiAgICAgKiBpZiB0aGUgZGVwcmVjYXRlZCBvcHRpb24gPHZhcj5vcHRpbWl6ZTwvdmFyPiBnZXRzIHNldCB0bwogICAgICogPHNhbXA+cG9ydGFiaWxpdHk8L3NhbXA+OgogICAgICogKyBmYnNxbAogICAgICogKyBteXNxbAogICAgICogKyBteXNxbGkKICAgICAqICsgc3FsaXRlCiAgICAgKgogICAgICoKICAgICAqIDxzYW1wPkRCX1BPUlRBQklMSVRZX05VTVJPV1M8L3NhbXA+CiAgICAgKiBlbmFibGUgaGFjayB0aGF0IG1ha2VzIDxrYmQ+bnVtUm93cygpPC9rYmQ+IHdvcmsgaW4gT3JhY2xlCiAgICAgKgogICAgICogVGhpcyBtb2RlIGdldHMgYXV0b21hdGljYWxseSB0dXJuZWQgb24gaW4gdGhlIGZvbGxvd2luZyBkYXRhYmFzZXMKICAgICAqIGlmIHRoZSBkZXByZWNhdGVkIG9wdGlvbiA8dmFyPm9wdGltaXplPC92YXI+IGdldHMgc2V0IHRvCiAgICAgKiA8c2FtcD5wb3J0YWJpbGl0eTwvc2FtcD46CiAgICAgKiArIG9jaTgKICAgICAqCiAgICAgKgogICAgICogPHNhbXA+REJfUE9SVEFCSUxJVFlfRVJST1JTPC9zYW1wPgogICAgICogbWFrZXMgY2VydGFpbiBlcnJvciBtZXNzYWdlcyBpbiBjZXJ0YWluIGRyaXZlcnMgY29tcGF0aWJsZQogICAgICogd2l0aCB0aG9zZSBmcm9tIG90aGVyIERCTVMncwogICAgICoKICAgICAqICsgbXlzcWwsIG15c3FsaTogIGNoYW5nZSB1bmlxdWUvcHJpbWFyeSBrZXkgY29uc3RyYWludHMKICAgICAqICAgREJfRVJST1JfQUxSRUFEWV9FWElTVFMgLT4gREJfRVJST1JfQ09OU1RSQUlOVAogICAgICoKICAgICAqICsgb2RiYyhhY2Nlc3MpOiAgTVMncyBPREJDIGRyaXZlciByZXBvcnRzICdubyBzdWNoIGZpZWxkJyBhcyBjb2RlCiAgICAgKiAgIDA3MDAxLCB3aGljaCBtZWFucyAndG9vIGZldyBwYXJhbWV0ZXJzLicgIFdoZW4gdGhpcyBvcHRpb24gaXMgb24KICAgICAqICAgdGhhdCBjb2RlIGdldHMgbWFwcGVkIHRvIERCX0VSUk9SX05PU1VDSEZJRUxELgogICAgICogICBEQl9FUlJPUl9NSVNNQVRDSCAtPiBEQl9FUlJPUl9OT1NVQ0hGSUVMRAogICAgICoKICAgICAqIDxzYW1wPkRCX1BPUlRBQklMSVRZX05VTExfVE9fRU1QVFk8L3NhbXA+CiAgICAgKiBjb252ZXJ0IG51bGwgdmFsdWVzIHRvIGVtcHR5IHN0cmluZ3MgaW4gZGF0YSBvdXRwdXQgYnkgZ2V0KigpIGFuZAogICAgICogZmV0Y2gqKCkuICBOZWVkZWQgYmVjYXVzZSBPcmFjbGUgY29uc2lkZXJzIGVtcHR5IHN0cmluZ3MgdG8gYmUgbnVsbCwKICAgICAqIHdoaWxlIG1vc3Qgb3RoZXIgREJNUydzIGtub3cgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBlbXB0eSBhbmQgbnVsbC4KICAgICAqCiAgICAgKgogICAgICogPHNhbXA+REJfUE9SVEFCSUxJVFlfQUxMPC9zYW1wPgogICAgICogdHVybiBvbiBhbGwgcG9ydGFiaWxpdHkgZmVhdHVyZXMKICAgICAqCiAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICoKICAgICAqIEV4YW1wbGUgMS4gU2ltcGxlIHNldE9wdGlvbigpIGV4YW1wbGUKICAgICAqIDxjb2RlPgogICAgICogJGRiLT5zZXRPcHRpb24oJ2F1dG9mcmVlJywgdHJ1ZSk7CiAgICAgKiA8L2NvZGU+CiAgICAgKgogICAgICogRXhhbXBsZSAyLiBQb3J0YWJpbGl0eSBmb3IgbG93ZXJjYXNpbmcgYW5kIHRyaW1taW5nCiAgICAgKiA8Y29kZT4KICAgICAqICRkYi0+c2V0T3B0aW9uKCdwb3J0YWJpbGl0eScsCiAgICAgKiAgICAgICAgICAgICAgICAgREJfUE9SVEFCSUxJVFlfTE9XRVJDQVNFIHwgREJfUE9SVEFCSUxJVFlfUlRSSU0pOwogICAgICogPC9jb2RlPgogICAgICoKICAgICAqIEV4YW1wbGUgMy4gQWxsIHBvcnRhYmlsaXR5IG9wdGlvbnMgZXhjZXB0IHRyaW1taW5nCiAgICAgKiA8Y29kZT4KICAgICAqICRkYi0+c2V0T3B0aW9uKCdwb3J0YWJpbGl0eScsCiAgICAgKiAgICAgICAgICAgICAgICAgREJfUE9SVEFCSUxJVFlfQUxMIF4gREJfUE9SVEFCSUxJVFlfUlRSSU0pOwogICAgICogPC9jb2RlPgogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgJG9wdGlvbiBvcHRpb24gbmFtZQogICAgICogQHBhcmFtIG1peGVkICAkdmFsdWUgdmFsdWUgZm9yIHRoZSBvcHRpb24KICAgICAqCiAgICAgKiBAcmV0dXJuIGludCAgREJfT0sgb24gc3VjY2Vzcy4gIEEgREJfRXJyb3Igb2JqZWN0IG9uIGZhaWx1cmUuCiAgICAgKgogICAgICogQHNlZSBEQl9jb21tb246OiRvcHRpb25zCiAgICAgKi8KICAgIGZ1bmN0aW9uIHNldE9wdGlvbigkb3B0aW9uLCAkdmFsdWUpCiAgICB7CiAgICAgICAgaWYgKGlzc2V0KCR0aGlzLT5vcHRpb25zWyRvcHRpb25dKSkgewogICAgICAgICAgICAkdGhpcy0+b3B0aW9uc1skb3B0aW9uXSA9ICR2YWx1ZTsKCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGNoZWNrIGZvciB0aGUgZGVwcmVjYXRlZCAnb3B0aW1pemUnCiAgICAgICAgICAgICAqIG9wdGlvbi4gIERvbmUgaGVyZSBpbiBjYXNlIHNldHRpbmdzIGNoYW5nZSBhZnRlciBjb25uZWN0aW5nLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgaWYgKCRvcHRpb24gPT0gJ29wdGltaXplJykgewogICAgICAgICAgICAgICAgaWYgKCR2YWx1ZSA9PSAncG9ydGFiaWxpdHknKSB7CiAgICAgICAgICAgICAgICAgICAgc3dpdGNoICgkdGhpcy0+cGhwdHlwZSkgewogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdvY2k4JzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5vcHRpb25zWydwb3J0YWJpbGl0eSddID0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJfUE9SVEFCSUxJVFlfTE9XRVJDQVNFIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJfUE9SVEFCSUxJVFlfTlVNUk9XUzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdmYnNxbCc6CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ215c3FsJzoKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnbXlzcWxpJzoKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnc3FsaXRlJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5vcHRpb25zWydwb3J0YWJpbGl0eSddID0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJfUE9SVEFCSUxJVFlfREVMRVRFX0NPVU5UOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+b3B0aW9uc1sncG9ydGFiaWxpdHknXSA9IERCX1BPUlRBQklMSVRZX05PTkU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBEQl9PSzsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICR0aGlzLT5yYWlzZUVycm9yKCJ1bmtub3duIG9wdGlvbiAkb3B0aW9uIik7CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgZ2V0T3B0aW9uKCkKCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIGFuIG9wdGlvbgogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgJG9wdGlvbiAgdGhlIG9wdGlvbiBuYW1lIHlvdSdyZSBjdXJpb3VzIGFib3V0CiAgICAgKgogICAgICogQHJldHVybiBtaXhlZCAgdGhlIG9wdGlvbidzIHZhbHVlCiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldE9wdGlvbigkb3B0aW9uKQogICAgewogICAgICAgIGlmIChpc3NldCgkdGhpcy0+b3B0aW9uc1skb3B0aW9uXSkpIHsKICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5vcHRpb25zWyRvcHRpb25dOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJHRoaXMtPnJhaXNlRXJyb3IoInVua25vd24gb3B0aW9uICRvcHRpb24iKTsKICAgIH0KCiAgICAvLyB9fX0KICAgIC8vIHt7eyBwcmVwYXJlKCkKCiAgICAvKioKICAgICAqIFByZXBhcmVzIGEgcXVlcnkgZm9yIG11bHRpcGxlIGV4ZWN1dGlvbiB3aXRoIGV4ZWN1dGUoKQogICAgICoKICAgICAqIENyZWF0ZXMgYSBxdWVyeSB0aGF0IGNhbiBiZSBydW4gbXVsdGlwbGUgdGltZXMuICBFYWNoIHRpbWUgaXQgaXMgcnVuLAogICAgICogdGhlIHBsYWNlaG9sZGVycywgaWYgYW55LCB3aWxsIGJlIHJlcGxhY2VkIGJ5IHRoZSBjb250ZW50cyBvZgogICAgICogZXhlY3V0ZSgpJ3MgJGRhdGEgYXJndW1lbnQuCiAgICAgKgogICAgICogVGhyZWUgdHlwZXMgb2YgcGxhY2Vob2xkZXJzIGNhbiBiZSB1c2VkOgogICAgICogICArIDxrYmQ+Pzwva2JkPiAgc2NhbGFyIHZhbHVlIChpLmUuIHN0cmluZ3MsIGludGVnZXJzKS4gIFRoZSBzeXN0ZW0KICAgICAqICAgICAgICAgICAgICAgICAgIHdpbGwgYXV0b21hdGljYWxseSBxdW90ZSBhbmQgZXNjYXBlIHRoZSBkYXRhLgogICAgICogICArIDxrYmQ+ITwva2JkPiAgdmFsdWUgaXMgaW5zZXJ0ZWQgJ2FzIGlzJwogICAgICogICArIDxrYmQ+Jjwva2JkPiAgcmVxdWlyZXMgYSBmaWxlIG5hbWUuICBUaGUgZmlsZSdzIGNvbnRlbnRzIGdldAogICAgICogICAgICAgICAgICAgICAgICAgaW5zZXJ0ZWQgaW50byB0aGUgcXVlcnkgKGkuZS4gc2F2aW5nIGJpbmFyeQogICAgICogICAgICAgICAgICAgICAgICAgZGF0YSBpbiBhIGRiKQogICAgICoKICAgICAqIEV4YW1wbGUgMS4KICAgICAqIDxjb2RlPgogICAgICogJHN0aCA9ICRkYi0+cHJlcGFyZSgnSU5TRVJUIElOVE8gdGJsIChhLCBiLCBjKSBWQUxVRVMgKD8sICEsICYpJyk7CiAgICAgKiAkZGF0YSA9IGFycmF5KAogICAgICogICAgICJKb2huJ3MgdGV4dCIsCiAgICAgKiAgICAgIidpdCcncyBnb29kJyIsCiAgICAgKiAgICAgJ2ZpbGVuYW1lLnR4dCcKICAgICAqICk7CiAgICAgKiAkcmVzID0gJGRiLT5leGVjdXRlKCRzdGgsICRkYXRhKTsKICAgICAqIDwvY29kZT4KICAgICAqCiAgICAgKiBVc2UgYmFja3NsYXNoZXMgdG8gZXNjYXBlIHBsYWNlaG9sZGVyIGNoYXJhY3RlcnMgaWYgeW91IGRvbid0IHdhbnQKICAgICAqIHRoZW0gdG8gYmUgaW50ZXJwcmV0ZWQgYXMgcGxhY2Vob2xkZXJzOgogICAgICogPHByZT4KICAgICAqICAgICJVUERBVEUgZm9vIFNFVCBjb2w9PyBXSEVSRSBjb2w9J292ZXIgXCYgdW5kZXInIgogICAgICogPC9wcmU+CiAgICAgKgogICAgICogV2l0aCBzb21lIGRhdGFiYXNlIGJhY2tlbmRzLCB0aGlzIGlzIGVtdWxhdGVkLgogICAgICoKICAgICAqIHtAaW50ZXJuYWwgaWJhc2UgYW5kIG9jaTggaGF2ZSB0aGVpciBvd24gcHJlcGFyZSgpIG1ldGhvZHMufX0KICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICRxdWVyeSAgdGhlIHF1ZXJ5IHRvIGJlIHByZXBhcmVkCiAgICAgKgogICAgICogQHJldHVybiBtaXhlZCAgREIgc3RhdGVtZW50IHJlc291cmNlIG9uIHN1Y2Nlc3MuIEEgREJfRXJyb3Igb2JqZWN0CiAgICAgKiAgICAgICAgICAgICAgICAgb24gZmFpbHVyZS4KICAgICAqCiAgICAgKiBAc2VlIERCX2NvbW1vbjo6ZXhlY3V0ZSgpCiAgICAgKi8KICAgIGZ1bmN0aW9uIHByZXBhcmUoJHF1ZXJ5KQogICAgewogICAgICAgICR0b2tlbnMgICA9IHByZWdfc3BsaXQoJy8oKD88IVxcXClbJj8hXSkvJywgJHF1ZXJ5LCAtMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBSRUdfU1BMSVRfREVMSU1fQ0FQVFVSRSk7CiAgICAgICAgJHRva2VuICAgICA9IDA7CiAgICAgICAgJHR5cGVzICAgICA9IGFycmF5KCk7CiAgICAgICAgJG5ld3Rva2VucyA9IGFycmF5KCk7CgogICAgICAgIGZvcmVhY2ggKCR0b2tlbnMgYXMgJHZhbCkgewogICAgICAgICAgICBzd2l0Y2ggKCR2YWwpIHsKICAgICAgICAgICAgICAgIGNhc2UgJz8nOgogICAgICAgICAgICAgICAgICAgICR0eXBlc1skdG9rZW4rK10gPSBEQl9QQVJBTV9TQ0FMQVI7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICcmJzoKICAgICAgICAgICAgICAgICAgICAkdHlwZXNbJHRva2VuKytdID0gREJfUEFSQU1fT1BBUVVFOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAnISc6CiAgICAgICAgICAgICAgICAgICAgJHR5cGVzWyR0b2tlbisrXSA9IERCX1BBUkFNX01JU0M7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICRuZXd0b2tlbnNbXSA9IHByZWdfcmVwbGFjZSgnL1xcXChbJj8hXSkvJywgIlxcMSIsICR2YWwpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkdGhpcy0+cHJlcGFyZV90b2tlbnNbXSA9ICYkbmV3dG9rZW5zOwogICAgICAgIGVuZCgkdGhpcy0+cHJlcGFyZV90b2tlbnMpOwoKICAgICAgICAkayA9IGtleSgkdGhpcy0+cHJlcGFyZV90b2tlbnMpOwogICAgICAgICR0aGlzLT5wcmVwYXJlX3R5cGVzWyRrXSA9ICR0eXBlczsKICAgICAgICAkdGhpcy0+cHJlcGFyZWRfcXVlcmllc1ska10gPSBpbXBsb2RlKCcgJywgJG5ld3Rva2Vucyk7CgogICAgICAgIHJldHVybiAkazsKICAgIH0KCiAgICAvLyB9fX0KICAgIC8vIHt7eyBhdXRvUHJlcGFyZSgpCgogICAgLyoqCiAgICAgKiBBdXRvbWF0aWNhbHkgZ2VuZXJhdGVzIGFuIGluc2VydCBvciB1cGRhdGUgcXVlcnkgYW5kIHBhc3MgaXQgdG8gcHJlcGFyZSgpCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkdGFibGUgICAgICAgICB0aGUgdGFibGUgbmFtZQogICAgICogQHBhcmFtIGFycmF5ICAkdGFibGVfZmllbGRzICB0aGUgYXJyYXkgb2YgZmllbGQgbmFtZXMKICAgICAqIEBwYXJhbSBpbnQgICAgJG1vZGUgICAgICAgICAgYSB0eXBlIG9mIHF1ZXJ5IHRvIG1ha2U6CiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQl9BVVRPUVVFUllfSU5TRVJUIG9yIERCX0FVVE9RVUVSWV9VUERBVEUKICAgICAqIEBwYXJhbSBzdHJpbmcgJHdoZXJlICAgICAgICAgZm9yIHVwZGF0ZSBxdWVyaWVzOiB0aGUgV0hFUkUgY2xhdXNlIHRvCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgdG8gdGhlIFNRTCBzdGF0ZW1lbnQuICBEb24ndAogICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZSB0aGUgIldIRVJFIiBrZXl3b3JkLgogICAgICoKICAgICAqIEByZXR1cm4gcmVzb3VyY2UgIHRoZSBxdWVyeSBoYW5kbGUKICAgICAqCiAgICAgKiBAdXNlcyBEQl9jb21tb246OnByZXBhcmUoKSwgREJfY29tbW9uOjpidWlsZE1hbmlwU1FMKCkKICAgICAqLwogICAgZnVuY3Rpb24gYXV0b1ByZXBhcmUoJHRhYmxlLCAkdGFibGVfZmllbGRzLCAkbW9kZSA9IERCX0FVVE9RVUVSWV9JTlNFUlQsCiAgICAgICAgICAgICAgICAgICAgICAgICAkd2hlcmUgPSBmYWxzZSkKICAgIHsKICAgICAgICAkcXVlcnkgPSAkdGhpcy0+YnVpbGRNYW5pcFNRTCgkdGFibGUsICR0YWJsZV9maWVsZHMsICRtb2RlLCAkd2hlcmUpOwogICAgICAgIGlmIChEQjo6aXNFcnJvcigkcXVlcnkpKSB7CiAgICAgICAgICAgIHJldHVybiAkcXVlcnk7CiAgICAgICAgfQogICAgICAgIHJldHVybiAkdGhpcy0+cHJlcGFyZSgkcXVlcnkpOwogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IGF1dG9FeGVjdXRlKCkKCiAgICAvKioKICAgICAqIEF1dG9tYXRpY2FseSBnZW5lcmF0ZXMgYW4gaW5zZXJ0IG9yIHVwZGF0ZSBxdWVyeSBhbmQgY2FsbCBwcmVwYXJlKCkKICAgICAqIGFuZCBleGVjdXRlKCkgd2l0aCBpdAogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgJHRhYmxlICAgICAgICAgdGhlIHRhYmxlIG5hbWUKICAgICAqIEBwYXJhbSBhcnJheSAgJGZpZWxkc192YWx1ZXMgdGhlIGFzc29jaWF0aXZlIGFycmF5IHdoZXJlICRrZXkgaXMgYQogICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQgbmFtZSBhbmQgJHZhbHVlIGl0cyB2YWx1ZQogICAgICogQHBhcmFtIGludCAgICAkbW9kZSAgICAgICAgICBhIHR5cGUgb2YgcXVlcnkgdG8gbWFrZToKICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCX0FVVE9RVUVSWV9JTlNFUlQgb3IgREJfQVVUT1FVRVJZX1VQREFURQogICAgICogQHBhcmFtIHN0cmluZyAkd2hlcmUgICAgICAgICBmb3IgdXBkYXRlIHF1ZXJpZXM6IHRoZSBXSEVSRSBjbGF1c2UgdG8KICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCB0byB0aGUgU1FMIHN0YXRlbWVudC4gIERvbid0CiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlIHRoZSAiV0hFUkUiIGtleXdvcmQuCiAgICAgKgogICAgICogQHJldHVybiBtaXhlZCAgYSBuZXcgREJfcmVzdWx0IG9iamVjdCBmb3Igc3VjY2Vzc2Z1bCBTRUxFQ1QgcXVlcmllcwogICAgICogICAgICAgICAgICAgICAgIG9yIERCX09LIGZvciBzdWNjZXNzdWwgZGF0YSBtYW5pcHVsYXRpb24gcXVlcmllcy4KICAgICAqICAgICAgICAgICAgICAgICBBIERCX0Vycm9yIG9iamVjdCBvbiBmYWlsdXJlLgogICAgICoKICAgICAqIEB1c2VzIERCX2NvbW1vbjo6YXV0b1ByZXBhcmUoKSwgREJfY29tbW9uOjpleGVjdXRlKCkKICAgICAqLwogICAgZnVuY3Rpb24gYXV0b0V4ZWN1dGUoJHRhYmxlLCAkZmllbGRzX3ZhbHVlcywgJG1vZGUgPSBEQl9BVVRPUVVFUllfSU5TRVJULAogICAgICAgICAgICAgICAgICAgICAgICAgJHdoZXJlID0gZmFsc2UpCiAgICB7CiAgICAgICAgJHN0aCA9ICR0aGlzLT5hdXRvUHJlcGFyZSgkdGFibGUsIGFycmF5X2tleXMoJGZpZWxkc192YWx1ZXMpLCAkbW9kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR3aGVyZSk7CiAgICAgICAgaWYgKERCOjppc0Vycm9yKCRzdGgpKSB7CiAgICAgICAgICAgIHJldHVybiAkc3RoOwogICAgICAgIH0KICAgICAgICAkcmV0ID0mICR0aGlzLT5leGVjdXRlKCRzdGgsIGFycmF5X3ZhbHVlcygkZmllbGRzX3ZhbHVlcykpOwogICAgICAgICR0aGlzLT5mcmVlUHJlcGFyZWQoJHN0aCk7CiAgICAgICAgcmV0dXJuICRyZXQ7CgogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IGJ1aWxkTWFuaXBTUUwoKQoKICAgIC8qKgogICAgICogUHJvZHVjZXMgYW4gU1FMIHF1ZXJ5IHN0cmluZyBmb3IgYXV0b1ByZXBhcmUoKQogICAgICoKICAgICAqIEV4YW1wbGU6CiAgICAgKiA8cHJlPgogICAgICogYnVpbGRNYW5pcFNRTCgndGFibGVfc3FsJywgYXJyYXkoJ2ZpZWxkMScsICdmaWVsZDInLCAnZmllbGQzJyksCiAgICAgKiAgICAgICAgICAgICAgIERCX0FVVE9RVUVSWV9JTlNFUlQpOwogICAgICogPC9wcmU+CiAgICAgKgogICAgICogVGhhdCByZXR1cm5zCiAgICAgKiA8c2FtcD4KICAgICAqIElOU0VSVCBJTlRPIHRhYmxlX3NxbCAoZmllbGQxLGZpZWxkMixmaWVsZDMpIFZBTFVFUyAoPyw/LD8pCiAgICAgKiA8L3NhbXA+CiAgICAgKgogICAgICogTk9URVM6CiAgICAgKiAgIC0gVGhpcyBiZWxvbmdzIG1vcmUgdG8gYSBTUUwgQnVpbGRlciBjbGFzcywgYnV0IHRoaXMgaXMgYSBzaW1wbGUKICAgICAqICAgICBmYWNpbGl0eS4KICAgICAqICAgLSBCZSBjYXJlZnVsbCEgSWYgeW91IGRvbid0IGdpdmUgYSAkd2hlcmUgcGFyYW0gd2l0aCBhbiBVUERBVEUKICAgICAqICAgICBxdWVyeSwgYWxsIHRoZSByZWNvcmRzIG9mIHRoZSB0YWJsZSB3aWxsIGJlIHVwZGF0ZWQhCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkdGFibGUgICAgICAgICB0aGUgdGFibGUgbmFtZQogICAgICogQHBhcmFtIGFycmF5ICAkdGFibGVfZmllbGRzICB0aGUgYXJyYXkgb2YgZmllbGQgbmFtZXMKICAgICAqIEBwYXJhbSBpbnQgICAgJG1vZGUgICAgICAgICAgYSB0eXBlIG9mIHF1ZXJ5IHRvIG1ha2U6CiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQl9BVVRPUVVFUllfSU5TRVJUIG9yIERCX0FVVE9RVUVSWV9VUERBVEUKICAgICAqIEBwYXJhbSBzdHJpbmcgJHdoZXJlICAgICAgICAgZm9yIHVwZGF0ZSBxdWVyaWVzOiB0aGUgV0hFUkUgY2xhdXNlIHRvCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgdG8gdGhlIFNRTCBzdGF0ZW1lbnQuICBEb24ndAogICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZSB0aGUgIldIRVJFIiBrZXl3b3JkLgogICAgICoKICAgICAqIEByZXR1cm4gc3RyaW5nICB0aGUgc3FsIHF1ZXJ5IGZvciBhdXRvUHJlcGFyZSgpCiAgICAgKi8KICAgIGZ1bmN0aW9uIGJ1aWxkTWFuaXBTUUwoJHRhYmxlLCAkdGFibGVfZmllbGRzLCAkbW9kZSwgJHdoZXJlID0gZmFsc2UpCiAgICB7CiAgICAgICAgaWYgKGNvdW50KCR0YWJsZV9maWVsZHMpID09IDApIHsKICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5yYWlzZUVycm9yKERCX0VSUk9SX05FRURfTU9SRV9EQVRBKTsKICAgICAgICB9CiAgICAgICAgJGZpcnN0ID0gdHJ1ZTsKICAgICAgICBzd2l0Y2ggKCRtb2RlKSB7CiAgICAgICAgICAgIGNhc2UgREJfQVVUT1FVRVJZX0lOU0VSVDoKICAgICAgICAgICAgICAgICR2YWx1ZXMgPSAnJzsKICAgICAgICAgICAgICAgICRuYW1lcyA9ICcnOwogICAgICAgICAgICAgICAgZm9yZWFjaCAoJHRhYmxlX2ZpZWxkcyBhcyAkdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJGZpcnN0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRmaXJzdCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRuYW1lcyAuPSAnLCc7CiAgICAgICAgICAgICAgICAgICAgICAgICR2YWx1ZXMgLj0gJywnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkbmFtZXMgLj0gJHZhbHVlOwogICAgICAgICAgICAgICAgICAgICR2YWx1ZXMgLj0gJz8nOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuICJJTlNFUlQgSU5UTyAkdGFibGUgKCRuYW1lcykgVkFMVUVTICgkdmFsdWVzKSI7CiAgICAgICAgICAgIGNhc2UgREJfQVVUT1FVRVJZX1VQREFURToKICAgICAgICAgICAgICAgICRzZXQgPSAnJzsKICAgICAgICAgICAgICAgIGZvcmVhY2ggKCR0YWJsZV9maWVsZHMgYXMgJHZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCRmaXJzdCkgewogICAgICAgICAgICAgICAgICAgICAgICAkZmlyc3QgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAkc2V0IC49ICcsJzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgJHNldCAuPSAiJHZhbHVlID0gPyI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkc3FsID0gIlVQREFURSAkdGFibGUgU0VUICRzZXQiOwogICAgICAgICAgICAgICAgaWYgKCR3aGVyZSkgewogICAgICAgICAgICAgICAgICAgICRzcWwgLj0gIiBXSEVSRSAkd2hlcmUiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuICRzcWw7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPnJhaXNlRXJyb3IoREJfRVJST1JfU1lOVEFYKTsKICAgICAgICB9CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgZXhlY3V0ZSgpCgogICAgLyoqCiAgICAgKiBFeGVjdXRlcyBhIERCIHN0YXRlbWVudCBwcmVwYXJlZCB3aXRoIHByZXBhcmUoKQogICAgICoKICAgICAqIEV4YW1wbGUgMS4KICAgICAqIDxjb2RlPgogICAgICogJHN0aCA9ICRkYi0+cHJlcGFyZSgnSU5TRVJUIElOVE8gdGJsIChhLCBiLCBjKSBWQUxVRVMgKD8sICEsICYpJyk7CiAgICAgKiAkZGF0YSA9IGFycmF5KAogICAgICogICAgICJKb2huJ3MgdGV4dCIsCiAgICAgKiAgICAgIidpdCcncyBnb29kJyIsCiAgICAgKiAgICAgJ2ZpbGVuYW1lLnR4dCcKICAgICAqICk7CiAgICAgKiAkcmVzID0mICRkYi0+ZXhlY3V0ZSgkc3RoLCAkZGF0YSk7CiAgICAgKiA8L2NvZGU+CiAgICAgKgogICAgICogQHBhcmFtIHJlc291cmNlICRzdG10ICBhIERCIHN0YXRlbWVudCByZXNvdXJjZSByZXR1cm5lZCBmcm9tIHByZXBhcmUoKQogICAgICogQHBhcmFtIG1peGVkICAgICRkYXRhICBhcnJheSwgc3RyaW5nIG9yIG51bWVyaWMgZGF0YSB0byBiZSB1c2VkIGluCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRpb24gb2YgdGhlIHN0YXRlbWVudC4gIFF1YW50aXR5IG9mIGl0ZW1zCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgbXVzdCBtYXRjaCBxdWFudGl0eSBvZiBwbGFjZWhvbGRlcnMgaW4KICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5OiAgbWVhbmluZyAxIHBsYWNlaG9sZGVyIGZvciBub24tYXJyYXkKICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMgb3IgMSBwbGFjZWhvbGRlciBwZXIgYXJyYXkgZWxlbWVudC4KICAgICAqCiAgICAgKiBAcmV0dXJuIG1peGVkICBhIG5ldyBEQl9yZXN1bHQgb2JqZWN0IGZvciBzdWNjZXNzZnVsIFNFTEVDVCBxdWVyaWVzCiAgICAgKiAgICAgICAgICAgICAgICAgb3IgREJfT0sgZm9yIHN1Y2Nlc3N1bCBkYXRhIG1hbmlwdWxhdGlvbiBxdWVyaWVzLgogICAgICogICAgICAgICAgICAgICAgIEEgREJfRXJyb3Igb2JqZWN0IG9uIGZhaWx1cmUuCiAgICAgKgogICAgICoge0BpbnRlcm5hbCBpYmFzZSBhbmQgb2NpOCBoYXZlIHRoZWlyIG93biBleGVjdXRlKCkgbWV0aG9kcy59fQogICAgICoKICAgICAqIEBzZWUgREJfY29tbW9uOjpwcmVwYXJlKCkKICAgICAqLwogICAgZnVuY3Rpb24gJmV4ZWN1dGUoJHN0bXQsICRkYXRhID0gYXJyYXkoKSkKICAgIHsKICAgICAgICAkcmVhbHF1ZXJ5ID0gJHRoaXMtPmV4ZWN1dGVFbXVsYXRlUXVlcnkoJHN0bXQsICRkYXRhKTsKICAgICAgICBpZiAoREI6OmlzRXJyb3IoJHJlYWxxdWVyeSkpIHsKICAgICAgICAgICAgcmV0dXJuICRyZWFscXVlcnk7CiAgICAgICAgfQogICAgICAgICRyZXN1bHQgPSAkdGhpcy0+c2ltcGxlUXVlcnkoJHJlYWxxdWVyeSk7CgogICAgICAgIGlmICgkcmVzdWx0ID09PSBEQl9PSyB8fCBEQjo6aXNFcnJvcigkcmVzdWx0KSkgewogICAgICAgICAgICByZXR1cm4gJHJlc3VsdDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkdG1wID0mIG5ldyBEQl9yZXN1bHQoJHRoaXMsICRyZXN1bHQpOwogICAgICAgICAgICByZXR1cm4gJHRtcDsKICAgICAgICB9CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgZXhlY3V0ZUVtdWxhdGVRdWVyeSgpCgogICAgLyoqCiAgICAgKiBFbXVsYXRlcyBleGVjdXRpbmcgcHJlcGFyZWQgc3RhdGVtZW50cyBpZiB0aGUgREJNUyBub3Qgc3VwcG9ydCB0aGVtCiAgICAgKgogICAgICogQHBhcmFtIHJlc291cmNlICRzdG10ICBhIERCIHN0YXRlbWVudCByZXNvdXJjZSByZXR1cm5lZCBmcm9tIGV4ZWN1dGUoKQogICAgICogQHBhcmFtIG1peGVkICAgICRkYXRhICBhcnJheSwgc3RyaW5nIG9yIG51bWVyaWMgZGF0YSB0byBiZSB1c2VkIGluCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRpb24gb2YgdGhlIHN0YXRlbWVudC4gIFF1YW50aXR5IG9mIGl0ZW1zCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgbXVzdCBtYXRjaCBxdWFudGl0eSBvZiBwbGFjZWhvbGRlcnMgaW4KICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5OiAgbWVhbmluZyAxIHBsYWNlaG9sZGVyIGZvciBub24tYXJyYXkKICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMgb3IgMSBwbGFjZWhvbGRlciBwZXIgYXJyYXkgZWxlbWVudC4KICAgICAqCiAgICAgKiBAcmV0dXJuIG1peGVkICBhIHN0cmluZyBjb250YWluaW5nIHRoZSByZWFsIHF1ZXJ5IHJ1biB3aGVuIGVtdWxhdGluZwogICAgICogICAgICAgICAgICAgICAgIHByZXBhcmUvZXhlY3V0ZS4gIEEgREJfRXJyb3Igb2JqZWN0IG9uIGZhaWx1cmUuCiAgICAgKgogICAgICogQGFjY2VzcyBwcm90ZWN0ZWQKICAgICAqIEBzZWUgREJfY29tbW9uOjpleGVjdXRlKCkKICAgICAqLwogICAgZnVuY3Rpb24gZXhlY3V0ZUVtdWxhdGVRdWVyeSgkc3RtdCwgJGRhdGEgPSBhcnJheSgpKQogICAgewogICAgICAgICRzdG10ID0gKGludCkkc3RtdDsKICAgICAgICAkZGF0YSA9IChhcnJheSkkZGF0YTsKICAgICAgICAkdGhpcy0+bGFzdF9wYXJhbWV0ZXJzID0gJGRhdGE7CgogICAgICAgIGlmIChjb3VudCgkdGhpcy0+cHJlcGFyZV90eXBlc1skc3RtdF0pICE9IGNvdW50KCRkYXRhKSkgewogICAgICAgICAgICAkdGhpcy0+bGFzdF9xdWVyeSA9ICR0aGlzLT5wcmVwYXJlZF9xdWVyaWVzWyRzdG10XTsKICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5yYWlzZUVycm9yKERCX0VSUk9SX01JU01BVENIKTsKICAgICAgICB9CgogICAgICAgICRyZWFscXVlcnkgPSAkdGhpcy0+cHJlcGFyZV90b2tlbnNbJHN0bXRdWzBdOwoKICAgICAgICAkaSA9IDA7CiAgICAgICAgZm9yZWFjaCAoJGRhdGEgYXMgJHZhbHVlKSB7CiAgICAgICAgICAgIGlmICgkdGhpcy0+cHJlcGFyZV90eXBlc1skc3RtdF1bJGldID09IERCX1BBUkFNX1NDQUxBUikgewogICAgICAgICAgICAgICAgJHJlYWxxdWVyeSAuPSAkdGhpcy0+cXVvdGVTbWFydCgkdmFsdWUpOwogICAgICAgICAgICB9IGVsc2VpZiAoJHRoaXMtPnByZXBhcmVfdHlwZXNbJHN0bXRdWyRpXSA9PSBEQl9QQVJBTV9PUEFRVUUpIHsKICAgICAgICAgICAgICAgICRmcCA9IEBmb3BlbigkdmFsdWUsICdyYicpOwogICAgICAgICAgICAgICAgaWYgKCEkZnApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPnJhaXNlRXJyb3IoREJfRVJST1JfQUNDRVNTX1ZJT0xBVElPTik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkcmVhbHF1ZXJ5IC49ICR0aGlzLT5xdW90ZVNtYXJ0KGZyZWFkKCRmcCwgZmlsZXNpemUoJHZhbHVlKSkpOwogICAgICAgICAgICAgICAgZmNsb3NlKCRmcCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkcmVhbHF1ZXJ5IC49ICR2YWx1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJHJlYWxxdWVyeSAuPSAkdGhpcy0+cHJlcGFyZV90b2tlbnNbJHN0bXRdWysrJGldOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRyZWFscXVlcnk7CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgZXhlY3V0ZU11bHRpcGxlKCkKCiAgICAvKioKICAgICAqIFBlcmZvcm1zIHNldmVyYWwgZXhlY3V0ZSgpIGNhbGxzIG9uIHRoZSBzYW1lIHN0YXRlbWVudCBoYW5kbGUKICAgICAqCiAgICAgKiAkZGF0YSBtdXN0IGJlIGFuIGFycmF5IGluZGV4ZWQgbnVtZXJpY2FsbHkKICAgICAqIGZyb20gMCwgb25lIGV4ZWN1dGUgY2FsbCBpcyBkb25lIGZvciBldmVyeSAicm93IiBpbiB0aGUgYXJyYXkuCiAgICAgKgogICAgICogSWYgYW4gZXJyb3Igb2NjdXJzIGR1cmluZyBleGVjdXRlKCksIGV4ZWN1dGVNdWx0aXBsZSgpIGRvZXMgbm90CiAgICAgKiBleGVjdXRlIHRoZSB1bmZpbmlzaGVkIHJvd3MsIGJ1dCByYXRoZXIgcmV0dXJucyB0aGF0IGVycm9yLgogICAgICoKICAgICAqIEBwYXJhbSByZXNvdXJjZSAkc3RtdCAgcXVlcnkgaGFuZGxlIGZyb20gcHJlcGFyZSgpCiAgICAgKiBAcGFyYW0gYXJyYXkgICAgJGRhdGEgIG51bWVyaWMgYXJyYXkgY29udGFpbmluZyB0aGUKICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgdG8gaW5zZXJ0IGludG8gdGhlIHF1ZXJ5CiAgICAgKgogICAgICogQHJldHVybiBpbnQgIERCX09LIG9uIHN1Y2Nlc3MuICBBIERCX0Vycm9yIG9iamVjdCBvbiBmYWlsdXJlLgogICAgICoKICAgICAqIEBzZWUgREJfY29tbW9uOjpwcmVwYXJlKCksIERCX2NvbW1vbjo6ZXhlY3V0ZSgpCiAgICAgKi8KICAgIGZ1bmN0aW9uIGV4ZWN1dGVNdWx0aXBsZSgkc3RtdCwgJGRhdGEpCiAgICB7CiAgICAgICAgZm9yZWFjaCAoJGRhdGEgYXMgJHZhbHVlKSB7CiAgICAgICAgICAgICRyZXMgPSYgJHRoaXMtPmV4ZWN1dGUoJHN0bXQsICR2YWx1ZSk7CiAgICAgICAgICAgIGlmIChEQjo6aXNFcnJvcigkcmVzKSkgewogICAgICAgICAgICAgICAgcmV0dXJuICRyZXM7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIERCX09LOwogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IGZyZWVQcmVwYXJlZCgpCgogICAgLyoqCiAgICAgKiBGcmVlcyB0aGUgaW50ZXJuYWwgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCBhIHByZXBhcmVkIHF1ZXJ5CiAgICAgKgogICAgICogQHBhcmFtIHJlc291cmNlICRzdG10ICAgICAgICAgICB0aGUgcHJlcGFyZWQgc3RhdGVtZW50J3MgUEhQIHJlc291cmNlCiAgICAgKiBAcGFyYW0gYm9vbCAgICAgJGZyZWVfcmVzb3VyY2UgIHNob3VsZCB0aGUgUEhQIHJlc291cmNlIGJlIGZyZWVkIHRvbz8KICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZSBmYWxzZSBpZiB5b3UgbmVlZCB0byBnZXQgZGF0YQogICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSB0aGUgcmVzdWx0IHNldCBsYXRlci4KICAgICAqCiAgICAgKiBAcmV0dXJuIGJvb2wgIFRSVUUgb24gc3VjY2VzcywgRkFMU0UgaWYgJHJlc3VsdCBpcyBpbnZhbGlkCiAgICAgKgogICAgICogQHNlZSBEQl9jb21tb246OnByZXBhcmUoKQogICAgICovCiAgICBmdW5jdGlvbiBmcmVlUHJlcGFyZWQoJHN0bXQsICRmcmVlX3Jlc291cmNlID0gdHJ1ZSkKICAgIHsKICAgICAgICAkc3RtdCA9IChpbnQpJHN0bXQ7CiAgICAgICAgaWYgKGlzc2V0KCR0aGlzLT5wcmVwYXJlX3Rva2Vuc1skc3RtdF0pKSB7CiAgICAgICAgICAgIHVuc2V0KCR0aGlzLT5wcmVwYXJlX3Rva2Vuc1skc3RtdF0pOwogICAgICAgICAgICB1bnNldCgkdGhpcy0+cHJlcGFyZV90eXBlc1skc3RtdF0pOwogICAgICAgICAgICB1bnNldCgkdGhpcy0+cHJlcGFyZWRfcXVlcmllc1skc3RtdF0pOwogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IG1vZGlmeVF1ZXJ5KCkKCiAgICAvKioKICAgICAqIENoYW5nZXMgYSBxdWVyeSBzdHJpbmcgZm9yIHZhcmlvdXMgREJNUyBzcGVjaWZpYyByZWFzb25zCiAgICAgKgogICAgICogSXQgaXMgZGVmaW5lZCBoZXJlIHRvIGVuc3VyZSBhbGwgZHJpdmVycyBoYXZlIHRoaXMgbWV0aG9kIGF2YWlsYWJsZS4KICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICRxdWVyeSAgdGhlIHF1ZXJ5IHN0cmluZyB0byBtb2RpZnkKICAgICAqCiAgICAgKiBAcmV0dXJuIHN0cmluZyAgdGhlIG1vZGlmaWVkIHF1ZXJ5IHN0cmluZwogICAgICoKICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkCiAgICAgKiBAc2VlIERCX215c3FsOjptb2RpZnlRdWVyeSgpLCBEQl9vY2k4Ojptb2RpZnlRdWVyeSgpLAogICAgICogICAgICBEQl9zcWxpdGU6Om1vZGlmeVF1ZXJ5KCkKICAgICAqLwogICAgZnVuY3Rpb24gbW9kaWZ5UXVlcnkoJHF1ZXJ5KQogICAgewogICAgICAgIHJldHVybiAkcXVlcnk7CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgbW9kaWZ5TGltaXRRdWVyeSgpCgogICAgLyoqCiAgICAgKiBBZGRzIExJTUlUIGNsYXVzZXMgdG8gYSBxdWVyeSBzdHJpbmcgYWNjb3JkaW5nIHRvIGN1cnJlbnQgREJNUyBzdGFuZGFyZHMKICAgICAqCiAgICAgKiBJdCBpcyBkZWZpbmVkIGhlcmUgdG8gYXNzdXJlIHRoYXQgYWxsIGltcGxlbWVudGF0aW9ucwogICAgICogaGF2ZSB0aGlzIG1ldGhvZCBkZWZpbmVkLgogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgJHF1ZXJ5ICAgdGhlIHF1ZXJ5IHRvIG1vZGlmeQogICAgICogQHBhcmFtIGludCAgICAkZnJvbSAgICB0aGUgcm93IHRvIHN0YXJ0IHRvIGZldGNoaW5nICgwID0gdGhlIGZpcnN0IHJvdykKICAgICAqIEBwYXJhbSBpbnQgICAgJGNvdW50ICAgdGhlIG51bWJlcnMgb2Ygcm93cyB0byBmZXRjaAogICAgICogQHBhcmFtIG1peGVkICAkcGFyYW1zICBhcnJheSwgc3RyaW5nIG9yIG51bWVyaWMgZGF0YSB0byBiZSB1c2VkIGluCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRpb24gb2YgdGhlIHN0YXRlbWVudC4gIFF1YW50aXR5IG9mIGl0ZW1zCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgbXVzdCBtYXRjaCBxdWFudGl0eSBvZiBwbGFjZWhvbGRlcnMgaW4KICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5OiAgbWVhbmluZyAxIHBsYWNlaG9sZGVyIGZvciBub24tYXJyYXkKICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMgb3IgMSBwbGFjZWhvbGRlciBwZXIgYXJyYXkgZWxlbWVudC4KICAgICAqCiAgICAgKiBAcmV0dXJuIHN0cmluZyAgdGhlIHF1ZXJ5IHN0cmluZyB3aXRoIExJTUlUIGNsYXVzZXMgYWRkZWQKICAgICAqCiAgICAgKiBAYWNjZXNzIHByb3RlY3RlZAogICAgICovCiAgICBmdW5jdGlvbiBtb2RpZnlMaW1pdFF1ZXJ5KCRxdWVyeSwgJGZyb20sICRjb3VudCwgJHBhcmFtcyA9IGFycmF5KCkpCiAgICB7CiAgICAgICAgcmV0dXJuICRxdWVyeTsKICAgIH0KCiAgICAvLyB9fX0KICAgIC8vIHt7eyBxdWVyeSgpCgogICAgLyoqCiAgICAgKiBTZW5kcyBhIHF1ZXJ5IHRvIHRoZSBkYXRhYmFzZSBzZXJ2ZXIKICAgICAqCiAgICAgKiBUaGUgcXVlcnkgc3RyaW5nIGNhbiBiZSBlaXRoZXIgYSBub3JtYWwgc3RhdGVtZW50IHRvIGJlIHNlbnQgZGlyZWN0bHkKICAgICAqIHRvIHRoZSBzZXJ2ZXIgT1IgaWYgPHZhcj4kcGFyYW1zPC92YXI+IGFyZSBwYXNzZWQgdGhlIHF1ZXJ5IGNhbiBoYXZlCiAgICAgKiBwbGFjZWhvbGRlcnMgYW5kIGl0IHdpbGwgYmUgcGFzc2VkIHRocm91Z2ggcHJlcGFyZSgpIGFuZCBleGVjdXRlKCkuCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkcXVlcnkgICB0aGUgU1FMIHF1ZXJ5IG9yIHRoZSBzdGF0ZW1lbnQgdG8gcHJlcGFyZQogICAgICogQHBhcmFtIG1peGVkICAkcGFyYW1zICBhcnJheSwgc3RyaW5nIG9yIG51bWVyaWMgZGF0YSB0byBiZSB1c2VkIGluCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRpb24gb2YgdGhlIHN0YXRlbWVudC4gIFF1YW50aXR5IG9mIGl0ZW1zCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgbXVzdCBtYXRjaCBxdWFudGl0eSBvZiBwbGFjZWhvbGRlcnMgaW4KICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5OiAgbWVhbmluZyAxIHBsYWNlaG9sZGVyIGZvciBub24tYXJyYXkKICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMgb3IgMSBwbGFjZWhvbGRlciBwZXIgYXJyYXkgZWxlbWVudC4KICAgICAqCiAgICAgKiBAcmV0dXJuIG1peGVkICBhIG5ldyBEQl9yZXN1bHQgb2JqZWN0IGZvciBzdWNjZXNzZnVsIFNFTEVDVCBxdWVyaWVzCiAgICAgKiAgICAgICAgICAgICAgICAgb3IgREJfT0sgZm9yIHN1Y2Nlc3N1bCBkYXRhIG1hbmlwdWxhdGlvbiBxdWVyaWVzLgogICAgICogICAgICAgICAgICAgICAgIEEgREJfRXJyb3Igb2JqZWN0IG9uIGZhaWx1cmUuCiAgICAgKgogICAgICogQHNlZSBEQl9yZXN1bHQsIERCX2NvbW1vbjo6cHJlcGFyZSgpLCBEQl9jb21tb246OmV4ZWN1dGUoKQogICAgICovCiAgICBmdW5jdGlvbiAmcXVlcnkoJHF1ZXJ5LCAkcGFyYW1zID0gYXJyYXkoKSkKICAgIHsKICAgICAgICBpZiAoc2l6ZW9mKCRwYXJhbXMpID4gMCkgewogICAgICAgICAgICAkc3RoID0gJHRoaXMtPnByZXBhcmUoJHF1ZXJ5KTsKICAgICAgICAgICAgaWYgKERCOjppc0Vycm9yKCRzdGgpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJHN0aDsKICAgICAgICAgICAgfQogICAgICAgICAgICAkcmV0ID0mICR0aGlzLT5leGVjdXRlKCRzdGgsICRwYXJhbXMpOwogICAgICAgICAgICAkdGhpcy0+ZnJlZVByZXBhcmVkKCRzdGgsIGZhbHNlKTsKICAgICAgICAgICAgcmV0dXJuICRyZXQ7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJHRoaXMtPmxhc3RfcGFyYW1ldGVycyA9IGFycmF5KCk7CiAgICAgICAgICAgICRyZXN1bHQgPSAkdGhpcy0+c2ltcGxlUXVlcnkoJHF1ZXJ5KTsKICAgICAgICAgICAgaWYgKCRyZXN1bHQgPT09IERCX09LIHx8IERCOjppc0Vycm9yKCRyZXN1bHQpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJHJlc3VsdDsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICR0bXAgPSYgbmV3IERCX3Jlc3VsdCgkdGhpcywgJHJlc3VsdCk7CiAgICAgICAgICAgICAgICByZXR1cm4gJHRtcDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAvLyB9fX0KICAgIC8vIHt7eyBsaW1pdFF1ZXJ5KCkKCiAgICAvKioKICAgICAqIEdlbmVyYXRlcyBhbmQgZXhlY3V0ZXMgYSBMSU1JVCBxdWVyeQogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgJHF1ZXJ5ICAgdGhlIHF1ZXJ5CiAgICAgKiBAcGFyYW0gaW50ciAgICRmcm9tICAgIHRoZSByb3cgdG8gc3RhcnQgdG8gZmV0Y2hpbmcgKDAgPSB0aGUgZmlyc3Qgcm93KQogICAgICogQHBhcmFtIGludCAgICAkY291bnQgICB0aGUgbnVtYmVycyBvZiByb3dzIHRvIGZldGNoCiAgICAgKiBAcGFyYW0gbWl4ZWQgICRwYXJhbXMgIGFycmF5LCBzdHJpbmcgb3IgbnVtZXJpYyBkYXRhIHRvIGJlIHVzZWQgaW4KICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGlvbiBvZiB0aGUgc3RhdGVtZW50LiAgUXVhbnRpdHkgb2YgaXRlbXMKICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCBtdXN0IG1hdGNoIHF1YW50aXR5IG9mIHBsYWNlaG9sZGVycyBpbgogICAgICogICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnk6ICBtZWFuaW5nIDEgcGxhY2Vob2xkZXIgZm9yIG5vbi1hcnJheQogICAgICogICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVycyBvciAxIHBsYWNlaG9sZGVyIHBlciBhcnJheSBlbGVtZW50LgogICAgICoKICAgICAqIEByZXR1cm4gbWl4ZWQgIGEgbmV3IERCX3Jlc3VsdCBvYmplY3QgZm9yIHN1Y2Nlc3NmdWwgU0VMRUNUIHF1ZXJpZXMKICAgICAqICAgICAgICAgICAgICAgICBvciBEQl9PSyBmb3Igc3VjY2Vzc3VsIGRhdGEgbWFuaXB1bGF0aW9uIHF1ZXJpZXMuCiAgICAgKiAgICAgICAgICAgICAgICAgQSBEQl9FcnJvciBvYmplY3Qgb24gZmFpbHVyZS4KICAgICAqLwogICAgZnVuY3Rpb24gJmxpbWl0UXVlcnkoJHF1ZXJ5LCAkZnJvbSwgJGNvdW50LCAkcGFyYW1zID0gYXJyYXkoKSkKICAgIHsKICAgICAgICAkcXVlcnkgPSAkdGhpcy0+bW9kaWZ5TGltaXRRdWVyeSgkcXVlcnksICRmcm9tLCAkY291bnQsICRwYXJhbXMpOwogICAgICAgIGlmIChEQjo6aXNFcnJvcigkcXVlcnkpKXsKICAgICAgICAgICAgcmV0dXJuICRxdWVyeTsKICAgICAgICB9CiAgICAgICAgJHJlc3VsdCA9JiAkdGhpcy0+cXVlcnkoJHF1ZXJ5LCAkcGFyYW1zKTsKICAgICAgICBpZiAoaXNfYSgkcmVzdWx0LCAnREJfcmVzdWx0JykpIHsKICAgICAgICAgICAgJHJlc3VsdC0+c2V0T3B0aW9uKCdsaW1pdF9mcm9tJywgJGZyb20pOwogICAgICAgICAgICAkcmVzdWx0LT5zZXRPcHRpb24oJ2xpbWl0X2NvdW50JywgJGNvdW50KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICRyZXN1bHQ7CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgZ2V0T25lKCkKCiAgICAvKioKICAgICAqIEZldGNoZXMgdGhlIGZpcnN0IGNvbHVtbiBvZiB0aGUgZmlyc3Qgcm93IGZyb20gYSBxdWVyeSByZXN1bHQKICAgICAqCiAgICAgKiBUYWtlcyBjYXJlIG9mIGRvaW5nIHRoZSBxdWVyeSBhbmQgZnJlZWluZyB0aGUgcmVzdWx0cyB3aGVuIGZpbmlzaGVkLgogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgJHF1ZXJ5ICAgdGhlIFNRTCBxdWVyeQogICAgICogQHBhcmFtIG1peGVkICAkcGFyYW1zICBhcnJheSwgc3RyaW5nIG9yIG51bWVyaWMgZGF0YSB0byBiZSB1c2VkIGluCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRpb24gb2YgdGhlIHN0YXRlbWVudC4gIFF1YW50aXR5IG9mIGl0ZW1zCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgbXVzdCBtYXRjaCBxdWFudGl0eSBvZiBwbGFjZWhvbGRlcnMgaW4KICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5OiAgbWVhbmluZyAxIHBsYWNlaG9sZGVyIGZvciBub24tYXJyYXkKICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMgb3IgMSBwbGFjZWhvbGRlciBwZXIgYXJyYXkgZWxlbWVudC4KICAgICAqCiAgICAgKiBAcmV0dXJuIG1peGVkICB0aGUgcmV0dXJuZWQgdmFsdWUgb2YgdGhlIHF1ZXJ5LgogICAgICogICAgICAgICAgICAgICAgIEEgREJfRXJyb3Igb2JqZWN0IG9uIGZhaWx1cmUuCiAgICAgKi8KICAgIGZ1bmN0aW9uICZnZXRPbmUoJHF1ZXJ5LCAkcGFyYW1zID0gYXJyYXkoKSkKICAgIHsKICAgICAgICAkcGFyYW1zID0gKGFycmF5KSRwYXJhbXM7CiAgICAgICAgLy8gbW9kaWZ5TGltaXRRdWVyeSgpIHdvdWxkIGJlIG5pY2UgaGVyZSwgYnV0IGl0IGNhdXNlcyBCQyBpc3N1ZXMKICAgICAgICBpZiAoc2l6ZW9mKCRwYXJhbXMpID4gMCkgewogICAgICAgICAgICAkc3RoID0gJHRoaXMtPnByZXBhcmUoJHF1ZXJ5KTsKICAgICAgICAgICAgaWYgKERCOjppc0Vycm9yKCRzdGgpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJHN0aDsKICAgICAgICAgICAgfQogICAgICAgICAgICAkcmVzID0mICR0aGlzLT5leGVjdXRlKCRzdGgsICRwYXJhbXMpOwogICAgICAgICAgICAkdGhpcy0+ZnJlZVByZXBhcmVkKCRzdGgpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRyZXMgPSYgJHRoaXMtPnF1ZXJ5KCRxdWVyeSk7CiAgICAgICAgfQoKICAgICAgICBpZiAoREI6OmlzRXJyb3IoJHJlcykpIHsKICAgICAgICAgICAgcmV0dXJuICRyZXM7CiAgICAgICAgfQoKICAgICAgICAkZXJyID0gJHJlcy0+ZmV0Y2hJbnRvKCRyb3csIERCX0ZFVENITU9ERV9PUkRFUkVEKTsKICAgICAgICAkcmVzLT5mcmVlKCk7CgogICAgICAgIGlmICgkZXJyICE9PSBEQl9PSykgewogICAgICAgICAgICByZXR1cm4gJGVycjsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkcm93WzBdOwogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IGdldFJvdygpCgogICAgLyoqCiAgICAgKiBGZXRjaGVzIHRoZSBmaXJzdCByb3cgb2YgZGF0YSByZXR1cm5lZCBmcm9tIGEgcXVlcnkgcmVzdWx0CiAgICAgKgogICAgICogVGFrZXMgY2FyZSBvZiBkb2luZyB0aGUgcXVlcnkgYW5kIGZyZWVpbmcgdGhlIHJlc3VsdHMgd2hlbiBmaW5pc2hlZC4KICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICRxdWVyeSAgIHRoZSBTUUwgcXVlcnkKICAgICAqIEBwYXJhbSBtaXhlZCAgJHBhcmFtcyAgYXJyYXksIHN0cmluZyBvciBudW1lcmljIGRhdGEgdG8gYmUgdXNlZCBpbgogICAgICogICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0aW9uIG9mIHRoZSBzdGF0ZW1lbnQuICBRdWFudGl0eSBvZiBpdGVtcwogICAgICogICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkIG11c3QgbWF0Y2ggcXVhbnRpdHkgb2YgcGxhY2Vob2xkZXJzIGluCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeTogIG1lYW5pbmcgMSBwbGFjZWhvbGRlciBmb3Igbm9uLWFycmF5CiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzIG9yIDEgcGxhY2Vob2xkZXIgcGVyIGFycmF5IGVsZW1lbnQuCiAgICAgKiBAcGFyYW0gaW50ICRmZXRjaG1vZGUgIHRoZSBmZXRjaCBtb2RlIHRvIHVzZQogICAgICoKICAgICAqIEByZXR1cm4gYXJyYXkgIHRoZSBmaXJzdCByb3cgb2YgcmVzdWx0cyBhcyBhbiBhcnJheS4KICAgICAqICAgICAgICAgICAgICAgICBBIERCX0Vycm9yIG9iamVjdCBvbiBmYWlsdXJlLgogICAgICovCiAgICBmdW5jdGlvbiAmZ2V0Um93KCRxdWVyeSwgJHBhcmFtcyA9IGFycmF5KCksCiAgICAgICAgICAgICAgICAgICAgICRmZXRjaG1vZGUgPSBEQl9GRVRDSE1PREVfREVGQVVMVCkKICAgIHsKICAgICAgICAvLyBjb21wYXQgY2hlY2ssIHRoZSBwYXJhbXMgYW5kIGZldGNobW9kZSBwYXJhbWV0ZXJzIHVzZWQgdG8KICAgICAgICAvLyBoYXZlIHRoZSBvcHBvc2l0ZSBvcmRlcgogICAgICAgIGlmICghaXNfYXJyYXkoJHBhcmFtcykpIHsKICAgICAgICAgICAgaWYgKGlzX2FycmF5KCRmZXRjaG1vZGUpKSB7CiAgICAgICAgICAgICAgICBpZiAoJHBhcmFtcyA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICR0bXAgPSBEQl9GRVRDSE1PREVfREVGQVVMVDsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJHRtcCA9ICRwYXJhbXM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkcGFyYW1zID0gJGZldGNobW9kZTsKICAgICAgICAgICAgICAgICRmZXRjaG1vZGUgPSAkdG1wOwogICAgICAgICAgICB9IGVsc2VpZiAoJHBhcmFtcyAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgJGZldGNobW9kZSA9ICRwYXJhbXM7CiAgICAgICAgICAgICAgICAkcGFyYW1zID0gYXJyYXkoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvLyBtb2RpZnlMaW1pdFF1ZXJ5KCkgd291bGQgYmUgbmljZSBoZXJlLCBidXQgaXQgY2F1c2VzIEJDIGlzc3VlcwogICAgICAgIGlmIChzaXplb2YoJHBhcmFtcykgPiAwKSB7CiAgICAgICAgICAgICRzdGggPSAkdGhpcy0+cHJlcGFyZSgkcXVlcnkpOwogICAgICAgICAgICBpZiAoREI6OmlzRXJyb3IoJHN0aCkpIHsKICAgICAgICAgICAgICAgIHJldHVybiAkc3RoOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRyZXMgPSYgJHRoaXMtPmV4ZWN1dGUoJHN0aCwgJHBhcmFtcyk7CiAgICAgICAgICAgICR0aGlzLT5mcmVlUHJlcGFyZWQoJHN0aCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJHJlcyA9JiAkdGhpcy0+cXVlcnkoJHF1ZXJ5KTsKICAgICAgICB9CgogICAgICAgIGlmIChEQjo6aXNFcnJvcigkcmVzKSkgewogICAgICAgICAgICByZXR1cm4gJHJlczsKICAgICAgICB9CgogICAgICAgICRlcnIgPSAkcmVzLT5mZXRjaEludG8oJHJvdywgJGZldGNobW9kZSk7CgogICAgICAgICRyZXMtPmZyZWUoKTsKCiAgICAgICAgaWYgKCRlcnIgIT09IERCX09LKSB7CiAgICAgICAgICAgIHJldHVybiAkZXJyOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRyb3c7CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgZ2V0Q29sKCkKCiAgICAvKioKICAgICAqIEZldGNoZXMgYSBzaW5nbGUgY29sdW1uIGZyb20gYSBxdWVyeSByZXN1bHQgYW5kIHJldHVybnMgaXQgYXMgYW4KICAgICAqIGluZGV4ZWQgYXJyYXkKICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICRxdWVyeSAgIHRoZSBTUUwgcXVlcnkKICAgICAqIEBwYXJhbSBtaXhlZCAgJGNvbCAgICAgd2hpY2ggY29sdW1uIHRvIHJldHVybiAoaW50ZWdlciBbY29sdW1uIG51bWJlciwKICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0aW5nIGF0IDBdIG9yIHN0cmluZyBbY29sdW1uIG5hbWVdKQogICAgICogQHBhcmFtIG1peGVkICAkcGFyYW1zICBhcnJheSwgc3RyaW5nIG9yIG51bWVyaWMgZGF0YSB0byBiZSB1c2VkIGluCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRpb24gb2YgdGhlIHN0YXRlbWVudC4gIFF1YW50aXR5IG9mIGl0ZW1zCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgbXVzdCBtYXRjaCBxdWFudGl0eSBvZiBwbGFjZWhvbGRlcnMgaW4KICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5OiAgbWVhbmluZyAxIHBsYWNlaG9sZGVyIGZvciBub24tYXJyYXkKICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMgb3IgMSBwbGFjZWhvbGRlciBwZXIgYXJyYXkgZWxlbWVudC4KICAgICAqCiAgICAgKiBAcmV0dXJuIGFycmF5ICB0aGUgcmVzdWx0cyBhcyBhbiBhcnJheS4gIEEgREJfRXJyb3Igb2JqZWN0IG9uIGZhaWx1cmUuCiAgICAgKgogICAgICogQHNlZSBEQl9jb21tb246OnF1ZXJ5KCkKICAgICAqLwogICAgZnVuY3Rpb24gJmdldENvbCgkcXVlcnksICRjb2wgPSAwLCAkcGFyYW1zID0gYXJyYXkoKSkKICAgIHsKICAgICAgICAkcGFyYW1zID0gKGFycmF5KSRwYXJhbXM7CiAgICAgICAgaWYgKHNpemVvZigkcGFyYW1zKSA+IDApIHsKICAgICAgICAgICAgJHN0aCA9ICR0aGlzLT5wcmVwYXJlKCRxdWVyeSk7CgogICAgICAgICAgICBpZiAoREI6OmlzRXJyb3IoJHN0aCkpIHsKICAgICAgICAgICAgICAgIHJldHVybiAkc3RoOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkcmVzID0mICR0aGlzLT5leGVjdXRlKCRzdGgsICRwYXJhbXMpOwogICAgICAgICAgICAkdGhpcy0+ZnJlZVByZXBhcmVkKCRzdGgpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRyZXMgPSYgJHRoaXMtPnF1ZXJ5KCRxdWVyeSk7CiAgICAgICAgfQoKICAgICAgICBpZiAoREI6OmlzRXJyb3IoJHJlcykpIHsKICAgICAgICAgICAgcmV0dXJuICRyZXM7CiAgICAgICAgfQoKICAgICAgICAkZmV0Y2htb2RlID0gaXNfaW50KCRjb2wpID8gREJfRkVUQ0hNT0RFX09SREVSRUQgOiBEQl9GRVRDSE1PREVfQVNTT0M7CgogICAgICAgIGlmICghaXNfYXJyYXkoJHJvdyA9ICRyZXMtPmZldGNoUm93KCRmZXRjaG1vZGUpKSkgewogICAgICAgICAgICAkcmV0ID0gYXJyYXkoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiAoIWFycmF5X2tleV9leGlzdHMoJGNvbCwgJHJvdykpIHsKICAgICAgICAgICAgICAgICRyZXQgPSYgJHRoaXMtPnJhaXNlRXJyb3IoREJfRVJST1JfTk9TVUNIRklFTEQpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJHJldCA9IGFycmF5KCRyb3dbJGNvbF0pOwogICAgICAgICAgICAgICAgd2hpbGUgKGlzX2FycmF5KCRyb3cgPSAkcmVzLT5mZXRjaFJvdygkZmV0Y2htb2RlKSkpIHsKICAgICAgICAgICAgICAgICAgICAkcmV0W10gPSAkcm93WyRjb2xdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkcmVzLT5mcmVlKCk7CgogICAgICAgIGlmIChEQjo6aXNFcnJvcigkcm93KSkgewogICAgICAgICAgICAkcmV0ID0gJHJvdzsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkcmV0OwogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IGdldEFzc29jKCkKCiAgICAvKioKICAgICAqIEZldGNoZXMgYW4gZW50aXJlIHF1ZXJ5IHJlc3VsdCBhbmQgcmV0dXJucyBpdCBhcyBhbgogICAgICogYXNzb2NpYXRpdmUgYXJyYXkgdXNpbmcgdGhlIGZpcnN0IGNvbHVtbiBhcyB0aGUga2V5CiAgICAgKgogICAgICogSWYgdGhlIHJlc3VsdCBzZXQgY29udGFpbnMgbW9yZSB0aGFuIHR3byBjb2x1bW5zLCB0aGUgdmFsdWUKICAgICAqIHdpbGwgYmUgYW4gYXJyYXkgb2YgdGhlIHZhbHVlcyBmcm9tIGNvbHVtbiAyLW4uICBJZiB0aGUgcmVzdWx0CiAgICAgKiBzZXQgY29udGFpbnMgb25seSB0d28gY29sdW1ucywgdGhlIHJldHVybmVkIHZhbHVlIHdpbGwgYmUgYQogICAgICogc2NhbGFyIHdpdGggdGhlIHZhbHVlIG9mIHRoZSBzZWNvbmQgY29sdW1uICh1bmxlc3MgZm9yY2VkIHRvIGFuCiAgICAgKiBhcnJheSB3aXRoIHRoZSAkZm9yY2VfYXJyYXkgcGFyYW1ldGVyKS4gIEEgREIgZXJyb3IgY29kZSBpcwogICAgICogcmV0dXJuZWQgb24gZXJyb3JzLiAgSWYgdGhlIHJlc3VsdCBzZXQgY29udGFpbnMgZmV3ZXIgdGhhbiB0d28KICAgICAqIGNvbHVtbnMsIGEgREJfRVJST1JfVFJVTkNBVEVEIGVycm9yIGlzIHJldHVybmVkLgogICAgICoKICAgICAqIEZvciBleGFtcGxlLCBpZiB0aGUgdGFibGUgIm15dGFibGUiIGNvbnRhaW5zOgogICAgICoKICAgICAqIDxwcmU+CiAgICAgKiAgSUQgICAgICBURVhUICAgICAgIERBVEUKICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgKiAgMSAgICAgICAnb25lJyAgICAgIDk0NDY3OTQwOAogICAgICogIDIgICAgICAgJ3R3bycgICAgICA5NDQ2Nzk0MDgKICAgICAqICAzICAgICAgICd0aHJlZScgICAgOTQ0Njc5NDA4CiAgICAgKiA8L3ByZT4KICAgICAqCiAgICAgKiBUaGVuIHRoZSBjYWxsIGdldEFzc29jKCdTRUxFQ1QgaWQsdGV4dCBGUk9NIG15dGFibGUnKSByZXR1cm5zOgogICAgICogPHByZT4KICAgICAqICAgYXJyYXkoCiAgICAgKiAgICAgJzEnID0+ICdvbmUnLAogICAgICogICAgICcyJyA9PiAndHdvJywKICAgICAqICAgICAnMycgPT4gJ3RocmVlJywKICAgICAqICAgKQogICAgICogPC9wcmU+CiAgICAgKgogICAgICogLi4ud2hpbGUgdGhlIGNhbGwgZ2V0QXNzb2MoJ1NFTEVDVCBpZCx0ZXh0LGRhdGUgRlJPTSBteXRhYmxlJykgcmV0dXJuczoKICAgICAqIDxwcmU+CiAgICAgKiAgIGFycmF5KAogICAgICogICAgICcxJyA9PiBhcnJheSgnb25lJywgJzk0NDY3OTQwOCcpLAogICAgICogICAgICcyJyA9PiBhcnJheSgndHdvJywgJzk0NDY3OTQwOCcpLAogICAgICogICAgICczJyA9PiBhcnJheSgndGhyZWUnLCAnOTQ0Njc5NDA4JykKICAgICAqICAgKQogICAgICogPC9wcmU+CiAgICAgKgogICAgICogSWYgdGhlIG1vcmUgdGhhbiBvbmUgcm93IG9jY3VycyB3aXRoIHRoZSBzYW1lIHZhbHVlIGluIHRoZQogICAgICogZmlyc3QgY29sdW1uLCB0aGUgbGFzdCByb3cgb3ZlcndyaXRlcyBhbGwgcHJldmlvdXMgb25lcyBieQogICAgICogZGVmYXVsdC4gIFVzZSB0aGUgJGdyb3VwIHBhcmFtZXRlciBpZiB5b3UgZG9uJ3Qgd2FudCB0bwogICAgICogb3ZlcndyaXRlIGxpa2UgdGhpcy4gIEV4YW1wbGU6CiAgICAgKgogICAgICogPHByZT4KICAgICAqIGdldEFzc29jKCdTRUxFQ1QgY2F0ZWdvcnksaWQsbmFtZSBGUk9NIG15dGFibGUnLCBmYWxzZSwgbnVsbCwKICAgICAqICAgICAgICAgIERCX0ZFVENITU9ERV9BU1NPQywgdHJ1ZSkgcmV0dXJuczoKICAgICAqCiAgICAgKiAgIGFycmF5KAogICAgICogICAgICcxJyA9PiBhcnJheShhcnJheSgnaWQnID0+ICc0JywgJ25hbWUnID0+ICdudW1iZXIgZm91cicpLAogICAgICogICAgICAgICAgICAgICAgICBhcnJheSgnaWQnID0+ICc2JywgJ25hbWUnID0+ICdudW1iZXIgc2l4JykKICAgICAqICAgICAgICAgICAgKSwKICAgICAqICAgICAnOScgPT4gYXJyYXkoYXJyYXkoJ2lkJyA9PiAnNCcsICduYW1lJyA9PiAnbnVtYmVyIGZvdXInKSwKICAgICAqICAgICAgICAgICAgICAgICAgYXJyYXkoJ2lkJyA9PiAnNicsICduYW1lJyA9PiAnbnVtYmVyIHNpeCcpCiAgICAgKiAgICAgICAgICAgICkKICAgICAqICAgKQogICAgICogPC9wcmU+CiAgICAgKgogICAgICogS2VlcCBpbiBtaW5kIHRoYXQgZGF0YWJhc2UgZnVuY3Rpb25zIGluIFBIUCB1c3VhbGx5IHJldHVybiBzdHJpbmcKICAgICAqIHZhbHVlcyBmb3IgcmVzdWx0cyByZWdhcmRsZXNzIG9mIHRoZSBkYXRhYmFzZSdzIGludGVybmFsIHR5cGUuCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkcXVlcnkgICAgICAgIHRoZSBTUUwgcXVlcnkKICAgICAqIEBwYXJhbSBib29sICAgJGZvcmNlX2FycmF5ICB1c2VkIG9ubHkgd2hlbiB0aGUgcXVlcnkgcmV0dXJucwogICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGFjdGx5IHR3byBjb2x1bW5zLiAgSWYgdHJ1ZSwgdGhlIHZhbHVlcwogICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGUgcmV0dXJuZWQgYXJyYXkgd2lsbCBiZSBvbmUtZWxlbWVudAogICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheXMgaW5zdGVhZCBvZiBzY2FsYXJzLgogICAgICogQHBhcmFtIG1peGVkICAkcGFyYW1zICAgICAgIGFycmF5LCBzdHJpbmcgb3IgbnVtZXJpYyBkYXRhIHRvIGJlIHVzZWQgaW4KICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0aW9uIG9mIHRoZSBzdGF0ZW1lbnQuICBRdWFudGl0eSBvZgogICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtcyBwYXNzZWQgbXVzdCBtYXRjaCBxdWFudGl0eSBvZgogICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcnMgaW4gcXVlcnk6ICBtZWFuaW5nIDEKICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXIgZm9yIG5vbi1hcnJheSBwYXJhbWV0ZXJzIG9yCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgcGxhY2Vob2xkZXIgcGVyIGFycmF5IGVsZW1lbnQuCiAgICAgKiBAcGFyYW0gaW50ICAgJGZldGNobW9kZSAgICAgdGhlIGZldGNoIG1vZGUgdG8gdXNlCiAgICAgKiBAcGFyYW0gYm9vbCAgJGdyb3VwICAgICAgICAgaWYgdHJ1ZSwgdGhlIHZhbHVlcyBvZiB0aGUgcmV0dXJuZWQgYXJyYXkKICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgd3JhcHBlZCBpbiBhbm90aGVyIGFycmF5LiAgSWYgdGhlIHNhbWUKICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5IHZhbHVlIChpbiB0aGUgZmlyc3QgY29sdW1uKSByZXBlYXRzCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0c2VsZiwgdGhlIHZhbHVlcyB3aWxsIGJlIGFwcGVuZGVkIHRvCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgYXJyYXkgaW5zdGVhZCBvZiBvdmVyd3JpdGluZyB0aGUKICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmcgdmFsdWVzLgogICAgICoKICAgICAqIEByZXR1cm4gYXJyYXkgIHRoZSBhc3NvY2lhdGl2ZSBhcnJheSBjb250YWluaW5nIHRoZSBxdWVyeSByZXN1bHRzLgogICAgICogICAgICAgICAgICAgICAgQSBEQl9FcnJvciBvYmplY3Qgb24gZmFpbHVyZS4KICAgICAqLwogICAgZnVuY3Rpb24gJmdldEFzc29jKCRxdWVyeSwgJGZvcmNlX2FycmF5ID0gZmFsc2UsICRwYXJhbXMgPSBhcnJheSgpLAogICAgICAgICAgICAgICAgICAgICAgICRmZXRjaG1vZGUgPSBEQl9GRVRDSE1PREVfREVGQVVMVCwgJGdyb3VwID0gZmFsc2UpCiAgICB7CiAgICAgICAgJHBhcmFtcyA9IChhcnJheSkkcGFyYW1zOwogICAgICAgIGlmIChzaXplb2YoJHBhcmFtcykgPiAwKSB7CiAgICAgICAgICAgICRzdGggPSAkdGhpcy0+cHJlcGFyZSgkcXVlcnkpOwoKICAgICAgICAgICAgaWYgKERCOjppc0Vycm9yKCRzdGgpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJHN0aDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJHJlcyA9JiAkdGhpcy0+ZXhlY3V0ZSgkc3RoLCAkcGFyYW1zKTsKICAgICAgICAgICAgJHRoaXMtPmZyZWVQcmVwYXJlZCgkc3RoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkcmVzID0mICR0aGlzLT5xdWVyeSgkcXVlcnkpOwogICAgICAgIH0KCiAgICAgICAgaWYgKERCOjppc0Vycm9yKCRyZXMpKSB7CiAgICAgICAgICAgIHJldHVybiAkcmVzOwogICAgICAgIH0KICAgICAgICBpZiAoJGZldGNobW9kZSA9PSBEQl9GRVRDSE1PREVfREVGQVVMVCkgewogICAgICAgICAgICAkZmV0Y2htb2RlID0gJHRoaXMtPmZldGNobW9kZTsKICAgICAgICB9CiAgICAgICAgJGNvbHMgPSAkcmVzLT5udW1Db2xzKCk7CgogICAgICAgIGlmICgkY29scyA8IDIpIHsKICAgICAgICAgICAgJHRtcCA9JiAkdGhpcy0+cmFpc2VFcnJvcihEQl9FUlJPUl9UUlVOQ0FURUQpOwogICAgICAgICAgICByZXR1cm4gJHRtcDsKICAgICAgICB9CgogICAgICAgICRyZXN1bHRzID0gYXJyYXkoKTsKCiAgICAgICAgaWYgKCRjb2xzID4gMiB8fCAkZm9yY2VfYXJyYXkpIHsKICAgICAgICAgICAgLy8gcmV0dXJuIGFycmF5IHZhbHVlcwogICAgICAgICAgICAvLyBYWFggdGhpcyBwYXJ0IGNhbiBiZSBvcHRpbWl6ZWQKICAgICAgICAgICAgaWYgKCRmZXRjaG1vZGUgPT0gREJfRkVUQ0hNT0RFX0FTU09DKSB7CiAgICAgICAgICAgICAgICB3aGlsZSAoaXNfYXJyYXkoJHJvdyA9ICRyZXMtPmZldGNoUm93KERCX0ZFVENITU9ERV9BU1NPQykpKSB7CiAgICAgICAgICAgICAgICAgICAgcmVzZXQoJHJvdyk7CiAgICAgICAgICAgICAgICAgICAgJGtleSA9IGN1cnJlbnQoJHJvdyk7CiAgICAgICAgICAgICAgICAgICAgdW5zZXQoJHJvd1trZXkoJHJvdyldKTsKICAgICAgICAgICAgICAgICAgICBpZiAoJGdyb3VwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRyZXN1bHRzWyRrZXldW10gPSAkcm93OwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRyZXN1bHRzWyRrZXldID0gJHJvdzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZWlmICgkZmV0Y2htb2RlID09IERCX0ZFVENITU9ERV9PQkpFQ1QpIHsKICAgICAgICAgICAgICAgIHdoaWxlICgkcm93ID0gJHJlcy0+ZmV0Y2hSb3coREJfRkVUQ0hNT0RFX09CSkVDVCkpIHsKICAgICAgICAgICAgICAgICAgICAkYXJyID0gZ2V0X29iamVjdF92YXJzKCRyb3cpOwogICAgICAgICAgICAgICAgICAgICRrZXkgPSBjdXJyZW50KCRhcnIpOwogICAgICAgICAgICAgICAgICAgIGlmICgkZ3JvdXApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3VsdHNbJGtleV1bXSA9ICRyb3c7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3VsdHNbJGtleV0gPSAkcm93OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHdoaWxlIChpc19hcnJheSgkcm93ID0gJHJlcy0+ZmV0Y2hSb3coREJfRkVUQ0hNT0RFX09SREVSRUQpKSkgewogICAgICAgICAgICAgICAgICAgIC8vIHdlIHNoaWZ0IGF3YXkgdGhlIGZpcnN0IGVsZW1lbnQgdG8gZ2V0CiAgICAgICAgICAgICAgICAgICAgLy8gaW5kaWNlcyBydW5uaW5nIGZyb20gMCBhZ2FpbgogICAgICAgICAgICAgICAgICAgICRrZXkgPSBhcnJheV9zaGlmdCgkcm93KTsKICAgICAgICAgICAgICAgICAgICBpZiAoJGdyb3VwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRyZXN1bHRzWyRrZXldW10gPSAkcm93OwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRyZXN1bHRzWyRrZXldID0gJHJvdzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKERCOjppc0Vycm9yKCRyb3cpKSB7CiAgICAgICAgICAgICAgICAkcmVzdWx0cyA9ICRyb3c7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvLyByZXR1cm4gc2NhbGFyIHZhbHVlcwogICAgICAgICAgICB3aGlsZSAoaXNfYXJyYXkoJHJvdyA9ICRyZXMtPmZldGNoUm93KERCX0ZFVENITU9ERV9PUkRFUkVEKSkpIHsKICAgICAgICAgICAgICAgIGlmICgkZ3JvdXApIHsKICAgICAgICAgICAgICAgICAgICAkcmVzdWx0c1skcm93WzBdXVtdID0gJHJvd1sxXTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJHJlc3VsdHNbJHJvd1swXV0gPSAkcm93WzFdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChEQjo6aXNFcnJvcigkcm93KSkgewogICAgICAgICAgICAgICAgJHJlc3VsdHMgPSAkcm93OwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkcmVzLT5mcmVlKCk7CgogICAgICAgIHJldHVybiAkcmVzdWx0czsKICAgIH0KCiAgICAvLyB9fX0KICAgIC8vIHt7eyBnZXRBbGwoKQoKICAgIC8qKgogICAgICogRmV0Y2hlcyBhbGwgb2YgdGhlIHJvd3MgZnJvbSBhIHF1ZXJ5IHJlc3VsdAogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgJHF1ZXJ5ICAgICAgdGhlIFNRTCBxdWVyeQogICAgICogQHBhcmFtIG1peGVkICAkcGFyYW1zICAgICBhcnJheSwgc3RyaW5nIG9yIG51bWVyaWMgZGF0YSB0byBiZSB1c2VkIGluCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRpb24gb2YgdGhlIHN0YXRlbWVudC4gIFF1YW50aXR5IG9mCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtcyBwYXNzZWQgbXVzdCBtYXRjaCBxdWFudGl0eSBvZgogICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXJzIGluIHF1ZXJ5OiAgbWVhbmluZyAxCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlciBmb3Igbm9uLWFycmF5IHBhcmFtZXRlcnMgb3IKICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgcGxhY2Vob2xkZXIgcGVyIGFycmF5IGVsZW1lbnQuCiAgICAgKiBAcGFyYW0gaW50ICAgICRmZXRjaG1vZGUgIHRoZSBmZXRjaCBtb2RlIHRvIHVzZToKICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgREJfRkVUQ0hNT0RFX09SREVSRUQKICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgREJfRkVUQ0hNT0RFX0FTU09DCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICArIERCX0ZFVENITU9ERV9PUkRFUkVEIHwgREJfRkVUQ0hNT0RFX0ZMSVBQRUQKICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgREJfRkVUQ0hNT0RFX0FTU09DIHwgREJfRkVUQ0hNT0RFX0ZMSVBQRUQKICAgICAqCiAgICAgKiBAcmV0dXJuIGFycmF5ICB0aGUgbmVzdGVkIGFycmF5LiAgQSBEQl9FcnJvciBvYmplY3Qgb24gZmFpbHVyZS4KICAgICAqLwogICAgZnVuY3Rpb24gJmdldEFsbCgkcXVlcnksICRwYXJhbXMgPSBhcnJheSgpLAogICAgICAgICAgICAgICAgICAgICAkZmV0Y2htb2RlID0gREJfRkVUQ0hNT0RFX0RFRkFVTFQpCiAgICB7CiAgICAgICAgLy8gY29tcGF0IGNoZWNrLCB0aGUgcGFyYW1zIGFuZCBmZXRjaG1vZGUgcGFyYW1ldGVycyB1c2VkIHRvCiAgICAgICAgLy8gaGF2ZSB0aGUgb3Bwb3NpdGUgb3JkZXIKICAgICAgICBpZiAoIWlzX2FycmF5KCRwYXJhbXMpKSB7CiAgICAgICAgICAgIGlmIChpc19hcnJheSgkZmV0Y2htb2RlKSkgewogICAgICAgICAgICAgICAgaWYgKCRwYXJhbXMgPT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAkdG1wID0gREJfRkVUQ0hNT0RFX0RFRkFVTFQ7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICR0bXAgPSAkcGFyYW1zOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJHBhcmFtcyA9ICRmZXRjaG1vZGU7CiAgICAgICAgICAgICAgICAkZmV0Y2htb2RlID0gJHRtcDsKICAgICAgICAgICAgfSBlbHNlaWYgKCRwYXJhbXMgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgICRmZXRjaG1vZGUgPSAkcGFyYW1zOwogICAgICAgICAgICAgICAgJHBhcmFtcyA9IGFycmF5KCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmIChzaXplb2YoJHBhcmFtcykgPiAwKSB7CiAgICAgICAgICAgICRzdGggPSAkdGhpcy0+cHJlcGFyZSgkcXVlcnkpOwoKICAgICAgICAgICAgaWYgKERCOjppc0Vycm9yKCRzdGgpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJHN0aDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJHJlcyA9JiAkdGhpcy0+ZXhlY3V0ZSgkc3RoLCAkcGFyYW1zKTsKICAgICAgICAgICAgJHRoaXMtPmZyZWVQcmVwYXJlZCgkc3RoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkcmVzID0mICR0aGlzLT5xdWVyeSgkcXVlcnkpOwogICAgICAgIH0KCiAgICAgICAgaWYgKCRyZXMgPT09IERCX09LIHx8IERCOjppc0Vycm9yKCRyZXMpKSB7CiAgICAgICAgICAgIHJldHVybiAkcmVzOwogICAgICAgIH0KCiAgICAgICAgJHJlc3VsdHMgPSBhcnJheSgpOwogICAgICAgIHdoaWxlIChEQl9PSyA9PT0gJHJlcy0+ZmV0Y2hJbnRvKCRyb3csICRmZXRjaG1vZGUpKSB7CiAgICAgICAgICAgIGlmICgkZmV0Y2htb2RlICYgREJfRkVUQ0hNT0RFX0ZMSVBQRUQpIHsKICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRyb3cgYXMgJGtleSA9PiAkdmFsKSB7CiAgICAgICAgICAgICAgICAgICAgJHJlc3VsdHNbJGtleV1bXSA9ICR2YWw7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkcmVzdWx0c1tdID0gJHJvdzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJHJlcy0+ZnJlZSgpOwoKICAgICAgICBpZiAoREI6OmlzRXJyb3IoJHJvdykpIHsKICAgICAgICAgICAgJHRtcCA9JiAkdGhpcy0+cmFpc2VFcnJvcigkcm93KTsKICAgICAgICAgICAgcmV0dXJuICR0bXA7CiAgICAgICAgfQogICAgICAgIHJldHVybiAkcmVzdWx0czsKICAgIH0KCiAgICAvLyB9fX0KICAgIC8vIHt7eyBhdXRvQ29tbWl0KCkKCiAgICAvKioKICAgICAqIEVuYWJsZXMgb3IgZGlzYWJsZXMgYXV0b21hdGljIGNvbW1pdHMKICAgICAqCiAgICAgKiBAcGFyYW0gYm9vbCAkb25vZmYgIHRydWUgdHVybnMgaXQgb24sIGZhbHNlIHR1cm5zIGl0IG9mZgogICAgICoKICAgICAqIEByZXR1cm4gaW50ICBEQl9PSyBvbiBzdWNjZXNzLiAgQSBEQl9FcnJvciBvYmplY3QgaWYgdGhlIGRyaXZlcgogICAgICogICAgICAgICAgICAgICBkb2Vzbid0IHN1cHBvcnQgYXV0by1jb21taXR0aW5nIHRyYW5zYWN0aW9ucy4KICAgICAqLwogICAgZnVuY3Rpb24gYXV0b0NvbW1pdCgkb25vZmYgPSBmYWxzZSkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnJhaXNlRXJyb3IoREJfRVJST1JfTk9UX0NBUEFCTEUpOwogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IGNvbW1pdCgpCgogICAgLyoqCiAgICAgKiBDb21taXRzIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uCiAgICAgKgogICAgICogQHJldHVybiBpbnQgIERCX09LIG9uIHN1Y2Nlc3MuICBBIERCX0Vycm9yIG9iamVjdCBvbiBmYWlsdXJlLgogICAgICovCiAgICBmdW5jdGlvbiBjb21taXQoKQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+cmFpc2VFcnJvcihEQl9FUlJPUl9OT1RfQ0FQQUJMRSk7CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgcm9sbGJhY2soKQoKICAgIC8qKgogICAgICogUmV2ZXJ0cyB0aGUgY3VycmVudCB0cmFuc2FjdGlvbgogICAgICoKICAgICAqIEByZXR1cm4gaW50ICBEQl9PSyBvbiBzdWNjZXNzLiAgQSBEQl9FcnJvciBvYmplY3Qgb24gZmFpbHVyZS4KICAgICAqLwogICAgZnVuY3Rpb24gcm9sbGJhY2soKQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+cmFpc2VFcnJvcihEQl9FUlJPUl9OT1RfQ0FQQUJMRSk7CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgbnVtUm93cygpCgogICAgLyoqCiAgICAgKiBEZXRlcm1pbmVzIHRoZSBudW1iZXIgb2Ygcm93cyBpbiBhIHF1ZXJ5IHJlc3VsdAogICAgICoKICAgICAqIEBwYXJhbSByZXNvdXJjZSAkcmVzdWx0ICB0aGUgcXVlcnkgcmVzdWx0IGlkZW5pZmllciBwcm9kdWNlZCBieSBQSFAKICAgICAqCiAgICAgKiBAcmV0dXJuIGludCAgdGhlIG51bWJlciBvZiByb3dzLiAgQSBEQl9FcnJvciBvYmplY3Qgb24gZmFpbHVyZS4KICAgICAqLwogICAgZnVuY3Rpb24gbnVtUm93cygkcmVzdWx0KQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+cmFpc2VFcnJvcihEQl9FUlJPUl9OT1RfQ0FQQUJMRSk7CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgYWZmZWN0ZWRSb3dzKCkKCiAgICAvKioKICAgICAqIERldGVybWluZXMgdGhlIG51bWJlciBvZiByb3dzIGFmZmVjdGVkIGJ5IGEgZGF0YSBtYW5pdXBsYXRpb24gcXVlcnkKICAgICAqCiAgICAgKiAwIGlzIHJldHVybmVkIGZvciBxdWVyaWVzIHRoYXQgZG9uJ3QgbWFuaXB1bGF0ZSBkYXRhLgogICAgICoKICAgICAqIEByZXR1cm4gaW50ICB0aGUgbnVtYmVyIG9mIHJvd3MuICBBIERCX0Vycm9yIG9iamVjdCBvbiBmYWlsdXJlLgogICAgICovCiAgICBmdW5jdGlvbiBhZmZlY3RlZFJvd3MoKQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+cmFpc2VFcnJvcihEQl9FUlJPUl9OT1RfQ0FQQUJMRSk7CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgZ2V0U2VxdWVuY2VOYW1lKCkKCiAgICAvKioKICAgICAqIEdlbmVyYXRlcyB0aGUgbmFtZSB1c2VkIGluc2lkZSB0aGUgZGF0YWJhc2UgZm9yIGEgc2VxdWVuY2UKICAgICAqCiAgICAgKiBUaGUgY3JlYXRlU2VxdWVuY2UoKSBkb2NibG9jayBjb250YWlucyBub3RlcyBhYm91dCBzdG9yaW5nIHNlcXVlbmNlCiAgICAgKiBuYW1lcy4KICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICRzcW4gIHRoZSBzZXF1ZW5jZSdzIHB1YmxpYyBuYW1lCiAgICAgKgogICAgICogQHJldHVybiBzdHJpbmcgIHRoZSBzZXF1ZW5jZSdzIG5hbWUgaW4gdGhlIGJhY2tlbmQKICAgICAqCiAgICAgKiBAYWNjZXNzIHByb3RlY3RlZAogICAgICogQHNlZSBEQl9jb21tb246OmNyZWF0ZVNlcXVlbmNlKCksIERCX2NvbW1vbjo6ZHJvcFNlcXVlbmNlKCksCiAgICAgKiAgICAgIERCX2NvbW1vbjo6bmV4dElEKCksIERCX2NvbW1vbjo6c2V0T3B0aW9uKCkKICAgICAqLwogICAgZnVuY3Rpb24gZ2V0U2VxdWVuY2VOYW1lKCRzcW4pCiAgICB7CiAgICAgICAgcmV0dXJuIHNwcmludGYoJHRoaXMtPmdldE9wdGlvbignc2VxbmFtZV9mb3JtYXQnKSwKICAgICAgICAgICAgICAgICAgICAgICBwcmVnX3JlcGxhY2UoJy9bXmEtejAtOV8uXS9pJywgJ18nLCAkc3FuKSk7CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgbmV4dElkKCkKCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIG5leHQgZnJlZSBpZCBpbiBhIHNlcXVlbmNlCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAgJHNlcV9uYW1lICBuYW1lIG9mIHRoZSBzZXF1ZW5jZQogICAgICogQHBhcmFtIGJvb2xlYW4gJG9uZGVtYW5kICB3aGVuIHRydWUsIHRoZSBzZXFlbmNlIGlzIGF1dG9tYXRpY2FsbHkKICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZWQgaWYgaXQgZG9lcyBub3QgZXhpc3QKICAgICAqCiAgICAgKiBAcmV0dXJuIGludCAgdGhlIG5leHQgaWQgbnVtYmVyIGluIHRoZSBzZXF1ZW5jZS4KICAgICAqICAgICAgICAgICAgICAgQSBEQl9FcnJvciBvYmplY3Qgb24gZmFpbHVyZS4KICAgICAqCiAgICAgKiBAc2VlIERCX2NvbW1vbjo6Y3JlYXRlU2VxdWVuY2UoKSwgREJfY29tbW9uOjpkcm9wU2VxdWVuY2UoKSwKICAgICAqICAgICAgREJfY29tbW9uOjpnZXRTZXF1ZW5jZU5hbWUoKQogICAgICovCiAgICBmdW5jdGlvbiBuZXh0SWQoJHNlcV9uYW1lLCAkb25kZW1hbmQgPSB0cnVlKQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+cmFpc2VFcnJvcihEQl9FUlJPUl9OT1RfQ0FQQUJMRSk7CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgY3JlYXRlU2VxdWVuY2UoKQoKICAgIC8qKgogICAgICogQ3JlYXRlcyBhIG5ldyBzZXF1ZW5jZQogICAgICoKICAgICAqIFRoZSBuYW1lIG9mIGEgZ2l2ZW4gc2VxdWVuY2UgaXMgZGV0ZXJtaW5lZCBieSBwYXNzaW5nIHRoZSBzdHJpbmcKICAgICAqIHByb3ZpZGVkIGluIHRoZSA8dmFyPiRzZXFfbmFtZTwvdmFyPiBhcmd1bWVudCB0aHJvdWdoIFBIUCdzIHNwcmludGYoKQogICAgICogZnVuY3Rpb24gdXNpbmcgdGhlIHZhbHVlIGZyb20gdGhlIDx2YXI+c2VxbmFtZV9mb3JtYXQ8L3Zhcj4gb3B0aW9uIGFzCiAgICAgKiB0aGUgc3ByaW50ZigpJ3MgZm9ybWF0IGFyZ3VtZW50LgogICAgICoKICAgICAqIDx2YXI+c2VxbmFtZV9mb3JtYXQ8L3Zhcj4gaXMgc2V0IHZpYSBzZXRPcHRpb24oKS4KICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICRzZXFfbmFtZSAgbmFtZSBvZiB0aGUgbmV3IHNlcXVlbmNlCiAgICAgKgogICAgICogQHJldHVybiBpbnQgIERCX09LIG9uIHN1Y2Nlc3MuICBBIERCX0Vycm9yIG9iamVjdCBvbiBmYWlsdXJlLgogICAgICoKICAgICAqIEBzZWUgREJfY29tbW9uOjpkcm9wU2VxdWVuY2UoKSwgREJfY29tbW9uOjpnZXRTZXF1ZW5jZU5hbWUoKSwKICAgICAqICAgICAgREJfY29tbW9uOjpuZXh0SUQoKQogICAgICovCiAgICBmdW5jdGlvbiBjcmVhdGVTZXF1ZW5jZSgkc2VxX25hbWUpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5yYWlzZUVycm9yKERCX0VSUk9SX05PVF9DQVBBQkxFKTsKICAgIH0KCiAgICAvLyB9fX0KICAgIC8vIHt7eyBkcm9wU2VxdWVuY2UoKQoKICAgIC8qKgogICAgICogRGVsZXRlcyBhIHNlcXVlbmNlCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkc2VxX25hbWUgIG5hbWUgb2YgdGhlIHNlcXVlbmNlIHRvIGJlIGRlbGV0ZWQKICAgICAqCiAgICAgKiBAcmV0dXJuIGludCAgREJfT0sgb24gc3VjY2Vzcy4gIEEgREJfRXJyb3Igb2JqZWN0IG9uIGZhaWx1cmUuCiAgICAgKgogICAgICogQHNlZSBEQl9jb21tb246OmNyZWF0ZVNlcXVlbmNlKCksIERCX2NvbW1vbjo6Z2V0U2VxdWVuY2VOYW1lKCksCiAgICAgKiAgICAgIERCX2NvbW1vbjo6bmV4dElEKCkKICAgICAqLwogICAgZnVuY3Rpb24gZHJvcFNlcXVlbmNlKCRzZXFfbmFtZSkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnJhaXNlRXJyb3IoREJfRVJST1JfTk9UX0NBUEFCTEUpOwogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IHJhaXNlRXJyb3IoKQoKICAgIC8qKgogICAgICogQ29tbXVuaWNhdGVzIGFuIGVycm9yIGFuZCBpbnZva2UgZXJyb3IgY2FsbGJhY2tzLCBldGMKICAgICAqCiAgICAgKiBCYXNpY2FsbHkgYSB3cmFwcGVyIGZvciBQRUFSOjpyYWlzZUVycm9yIHdpdGhvdXQgdGhlIG1lc3NhZ2Ugc3RyaW5nLgogICAgICoKICAgICAqIEBwYXJhbSBtaXhlZCAgIGludGVnZXIgZXJyb3IgY29kZSwgb3IgYSBQRUFSIGVycm9yIG9iamVjdCAoYWxsCiAgICAgKiAgICAgICAgICAgICAgICAgb3RoZXIgcGFyYW1ldGVycyBhcmUgaWdub3JlZCBpZiB0aGlzIHBhcmFtZXRlciBpcwogICAgICogICAgICAgICAgICAgICAgIGFuIG9iamVjdAogICAgICogQHBhcmFtIGludCAgICAgZXJyb3IgbW9kZSwgc2VlIFBFQVJfRXJyb3IgZG9jcwogICAgICogQHBhcmFtIG1peGVkICAgaWYgZXJyb3IgbW9kZSBpcyBQRUFSX0VSUk9SX1RSSUdHRVIsIHRoaXMgaXMgdGhlCiAgICAgKiAgICAgICAgICAgICAgICAgZXJyb3IgbGV2ZWwgKEVfVVNFUl9OT1RJQ0UgZXRjKS4gIElmIGVycm9yIG1vZGUgaXMKICAgICAqICAgICAgICAgICAgICAgICBQRUFSX0VSUk9SX0NBTExCQUNLLCB0aGlzIGlzIHRoZSBjYWxsYmFjayBmdW5jdGlvbiwKICAgICAqICAgICAgICAgICAgICAgICBlaXRoZXIgYXMgYSBmdW5jdGlvbiBuYW1lLCBvciBhcyBhbiBhcnJheSBvZiBhbgogICAgICogICAgICAgICAgICAgICAgIG9iamVjdCBhbmQgbWV0aG9kIG5hbWUuICBGb3Igb3RoZXIgZXJyb3IgbW9kZXMgdGhpcwogICAgICogICAgICAgICAgICAgICAgIHBhcmFtZXRlciBpcyBpZ25vcmVkLgogICAgICogQHBhcmFtIHN0cmluZyAgZXh0cmEgZGVidWcgaW5mb3JtYXRpb24uICBEZWZhdWx0cyB0byB0aGUgbGFzdAogICAgICogICAgICAgICAgICAgICAgIHF1ZXJ5IGFuZCBuYXRpdmUgZXJyb3IgY29kZS4KICAgICAqIEBwYXJhbSBtaXhlZCAgIG5hdGl2ZSBlcnJvciBjb2RlLCBpbnRlZ2VyIG9yIHN0cmluZyBkZXBlbmRpbmcgdGhlCiAgICAgKiAgICAgICAgICAgICAgICAgYmFja2VuZAogICAgICoKICAgICAqIEByZXR1cm4gb2JqZWN0ICB0aGUgUEVBUl9FcnJvciBvYmplY3QKICAgICAqCiAgICAgKiBAc2VlIFBFQVJfRXJyb3IKICAgICAqLwogICAgZnVuY3Rpb24gJnJhaXNlRXJyb3IoJGNvZGUgPSBEQl9FUlJPUiwgJG1vZGUgPSBudWxsLCAkb3B0aW9ucyA9IG51bGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAkdXNlcmluZm8gPSBudWxsLCAkbmF0aXZlY29kZSA9IG51bGwpCiAgICB7CiAgICAgICAgLy8gVGhlIGVycm9yIGlzIHlldCBhIERCIGVycm9yIG9iamVjdAogICAgICAgIGlmIChpc19vYmplY3QoJGNvZGUpKSB7CiAgICAgICAgICAgIC8vIGJlY2F1c2Ugd2UgdGhlIHN0YXRpYyBQRUFSOjpyYWlzZUVycm9yLCBvdXIgZ2xvYmFsCiAgICAgICAgICAgIC8vIGhhbmRsZXIgc2hvdWxkIGJlIHVzZWQgaWYgaXQgaXMgc2V0CiAgICAgICAgICAgIGlmICgkbW9kZSA9PT0gbnVsbCAmJiAhZW1wdHkoJHRoaXMtPl9kZWZhdWx0X2Vycm9yX21vZGUpKSB7CiAgICAgICAgICAgICAgICAkbW9kZSAgICA9ICR0aGlzLT5fZGVmYXVsdF9lcnJvcl9tb2RlOwogICAgICAgICAgICAgICAgJG9wdGlvbnMgPSAkdGhpcy0+X2RlZmF1bHRfZXJyb3Jfb3B0aW9uczsKICAgICAgICAgICAgfQogICAgICAgICAgICAkdG1wID0gUEVBUjo6cmFpc2VFcnJvcigkY29kZSwgbnVsbCwgJG1vZGUsICRvcHRpb25zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBudWxsLCB0cnVlKTsKICAgICAgICAgICAgcmV0dXJuICR0bXA7CiAgICAgICAgfQoKICAgICAgICBpZiAoJHVzZXJpbmZvID09PSBudWxsKSB7CiAgICAgICAgICAgICR1c2VyaW5mbyA9ICR0aGlzLT5sYXN0X3F1ZXJ5OwogICAgICAgIH0KCiAgICAgICAgaWYgKCRuYXRpdmVjb2RlKSB7CiAgICAgICAgICAgICR1c2VyaW5mbyAuPSAnIFtuYXRpdmVjb2RlPScgLiB0cmltKCRuYXRpdmVjb2RlKSAuICddJzsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkdXNlcmluZm8gLj0gJyBbREIgRXJyb3I6ICcgLiBEQjo6ZXJyb3JNZXNzYWdlKCRjb2RlKSAuICddJzsKICAgICAgICB9CgogICAgICAgICR0bXAgPSBQRUFSOjpyYWlzZUVycm9yKG51bGwsICRjb2RlLCAkbW9kZSwgJG9wdGlvbnMsICR1c2VyaW5mbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnREJfRXJyb3InLCB0cnVlKTsKICAgICAgICByZXR1cm4gJHRtcDsKICAgIH0KCiAgICAvLyB9fX0KICAgIC8vIHt7eyBlcnJvck5hdGl2ZSgpCgogICAgLyoqCiAgICAgKiBHZXRzIHRoZSBEQk1TJyBuYXRpdmUgZXJyb3IgY29kZSBwcm9kdWNlZCBieSB0aGUgbGFzdCBxdWVyeQogICAgICoKICAgICAqIEByZXR1cm4gbWl4ZWQgIHRoZSBEQk1TJyBlcnJvciBjb2RlLiAgQSBEQl9FcnJvciBvYmplY3Qgb24gZmFpbHVyZS4KICAgICAqLwogICAgZnVuY3Rpb24gZXJyb3JOYXRpdmUoKQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+cmFpc2VFcnJvcihEQl9FUlJPUl9OT1RfQ0FQQUJMRSk7CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgZXJyb3JDb2RlKCkKCiAgICAvKioKICAgICAqIE1hcHMgbmF0aXZlIGVycm9yIGNvZGVzIHRvIERCJ3MgcG9ydGFibGUgb25lcwogICAgICoKICAgICAqIFVzZXMgdGhlIDx2YXI+JGVycm9yY29kZV9tYXA8L3Zhcj4gcHJvcGVydHkgZGVmaW5lZCBpbiBlYWNoIGRyaXZlci4KICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nfGludCAkbmF0aXZlY29kZSAgdGhlIGVycm9yIGNvZGUgcmV0dXJuZWQgYnkgdGhlIERCTVMKICAgICAqCiAgICAgKiBAcmV0dXJuIGludCAgdGhlIHBvcnRhYmxlIERCIGVycm9yIGNvZGUuICBSZXR1cm4gREJfRVJST1IgaWYgdGhlCiAgICAgKiAgICAgICAgICAgICAgIGN1cnJlbnQgZHJpdmVyIGRvZXNuJ3QgaGF2ZSBhIG1hcHBpbmcgZm9yIHRoZQogICAgICogICAgICAgICAgICAgICAkbmF0aXZlY29kZSBzdWJtaXR0ZWQuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGVycm9yQ29kZSgkbmF0aXZlY29kZSkKICAgIHsKICAgICAgICBpZiAoaXNzZXQoJHRoaXMtPmVycm9yY29kZV9tYXBbJG5hdGl2ZWNvZGVdKSkgewogICAgICAgICAgICByZXR1cm4gJHRoaXMtPmVycm9yY29kZV9tYXBbJG5hdGl2ZWNvZGVdOwogICAgICAgIH0KICAgICAgICAvLyBGYWxsIGJhY2sgdG8gREJfRVJST1IgaWYgdGhlcmUgd2FzIG5vIG1hcHBpbmcuCiAgICAgICAgcmV0dXJuIERCX0VSUk9SOwogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IGVycm9yTWVzc2FnZSgpCgogICAgLyoqCiAgICAgKiBNYXBzIGEgREIgZXJyb3IgY29kZSB0byBhIHRleHR1YWwgbWVzc2FnZQogICAgICoKICAgICAqIEBwYXJhbSBpbnRlZ2VyICRkYmNvZGUgIHRoZSBEQiBlcnJvciBjb2RlCiAgICAgKgogICAgICogQHJldHVybiBzdHJpbmcgIHRoZSBlcnJvciBtZXNzYWdlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGVycm9yIGNvZGUKICAgICAqICAgICAgICAgICAgICAgICAgc3VibWl0dGVkLiAgRkFMU0UgaWYgdGhlIGVycm9yIGNvZGUgaXMgdW5rbm93bi4KICAgICAqCiAgICAgKiBAc2VlIERCOjplcnJvck1lc3NhZ2UoKQogICAgICovCiAgICBmdW5jdGlvbiBlcnJvck1lc3NhZ2UoJGRiY29kZSkKICAgIHsKICAgICAgICByZXR1cm4gREI6OmVycm9yTWVzc2FnZSgkdGhpcy0+ZXJyb3Jjb2RlX21hcFskZGJjb2RlXSk7CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgdGFibGVJbmZvKCkKCiAgICAvKioKICAgICAqIFJldHVybnMgaW5mb3JtYXRpb24gYWJvdXQgYSB0YWJsZSBvciBhIHJlc3VsdCBzZXQKICAgICAqCiAgICAgKiBUaGUgZm9ybWF0IG9mIHRoZSByZXN1bHRpbmcgYXJyYXkgZGVwZW5kcyBvbiB3aGljaCA8dmFyPiRtb2RlPC92YXI+CiAgICAgKiB5b3Ugc2VsZWN0LiAgVGhlIHNhbXBsZSBvdXRwdXQgYmVsb3cgaXMgYmFzZWQgb24gdGhpcyBxdWVyeToKICAgICAqIDxwcmU+CiAgICAgKiAgICBTRUxFQ1QgdGJsRm9vLmZsZElELCB0YmxGb28uZmxkUGhvbmUsIHRibEJhci5mbGRJZAogICAgICogICAgRlJPTSB0YmxGb28KICAgICAqICAgIEpPSU4gdGJsQmFyIE9OIHRibEZvby5mbGRJZCA9IHRibEJhci5mbGRJZAogICAgICogPC9wcmU+CiAgICAgKgogICAgICogPHVsPgogICAgICogPGxpPgogICAgICoKICAgICAqIDxrYmQ+bnVsbDwva2JkPiAoZGVmYXVsdCkKICAgICAqICAgPHByZT4KICAgICAqICAgWzBdID0+IEFycmF5ICgKICAgICAqICAgICAgIFt0YWJsZV0gPT4gdGJsRm9vCiAgICAgKiAgICAgICBbbmFtZV0gPT4gZmxkSWQKICAgICAqICAgICAgIFt0eXBlXSA9PiBpbnQKICAgICAqICAgICAgIFtsZW5dID0+IDExCiAgICAgKiAgICAgICBbZmxhZ3NdID0+IHByaW1hcnlfa2V5IG5vdF9udWxsCiAgICAgKiAgICkKICAgICAqICAgWzFdID0+IEFycmF5ICgKICAgICAqICAgICAgIFt0YWJsZV0gPT4gdGJsRm9vCiAgICAgKiAgICAgICBbbmFtZV0gPT4gZmxkUGhvbmUKICAgICAqICAgICAgIFt0eXBlXSA9PiBzdHJpbmcKICAgICAqICAgICAgIFtsZW5dID0+IDIwCiAgICAgKiAgICAgICBbZmxhZ3NdID0+CiAgICAgKiAgICkKICAgICAqICAgWzJdID0+IEFycmF5ICgKICAgICAqICAgICAgIFt0YWJsZV0gPT4gdGJsQmFyCiAgICAgKiAgICAgICBbbmFtZV0gPT4gZmxkSWQKICAgICAqICAgICAgIFt0eXBlXSA9PiBpbnQKICAgICAqICAgICAgIFtsZW5dID0+IDExCiAgICAgKiAgICAgICBbZmxhZ3NdID0+IHByaW1hcnlfa2V5IG5vdF9udWxsCiAgICAgKiAgICkKICAgICAqICAgPC9wcmU+CiAgICAgKgogICAgICogPC9saT48bGk+CiAgICAgKgogICAgICogPGtiZD5EQl9UQUJMRUlORk9fT1JERVI8L2tiZD4KICAgICAqCiAgICAgKiAgIDxwPkluIGFkZGl0aW9uIHRvIHRoZSBpbmZvcm1hdGlvbiBmb3VuZCBpbiB0aGUgZGVmYXVsdCBvdXRwdXQsCiAgICAgKiAgIGEgbm90YXRpb24gb2YgdGhlIG51bWJlciBvZiBjb2x1bW5zIGlzIHByb3ZpZGVkIGJ5IHRoZQogICAgICogICA8c2FtcD5udW1fZmllbGRzPC9zYW1wPiBlbGVtZW50IHdoaWxlIHRoZSA8c2FtcD5vcmRlcjwvc2FtcD4KICAgICAqICAgZWxlbWVudCBwcm92aWRlcyBhbiBhcnJheSB3aXRoIHRoZSBjb2x1bW4gbmFtZXMgYXMgdGhlIGtleXMgYW5kCiAgICAgKiAgIHRoZWlyIGxvY2F0aW9uIGluZGV4IG51bWJlciAoY29ycmVzcG9uZGluZyB0byB0aGUga2V5cyBpbiB0aGUKICAgICAqICAgdGhlIGRlZmF1bHQgb3V0cHV0KSBhcyB0aGUgdmFsdWVzLjwvcD4KICAgICAqCiAgICAgKiAgIDxwPklmIGEgcmVzdWx0IHNldCBoYXMgaWRlbnRpY2FsIGZpZWxkIG5hbWVzLCB0aGUgbGFzdCBvbmUgaXMKICAgICAqICAgdXNlZC48L3A+CiAgICAgKgogICAgICogICA8cHJlPgogICAgICogICBbbnVtX2ZpZWxkc10gPT4gMwogICAgICogICBbb3JkZXJdID0+IEFycmF5ICgKICAgICAqICAgICAgIFtmbGRJZF0gPT4gMgogICAgICogICAgICAgW2ZsZFRyYW5zXSA9PiAxCiAgICAgKiAgICkKICAgICAqICAgPC9wcmU+CiAgICAgKgogICAgICogPC9saT48bGk+CiAgICAgKgogICAgICogPGtiZD5EQl9UQUJMRUlORk9fT1JERVJUQUJMRTwva2JkPgogICAgICoKICAgICAqICAgPHA+U2ltaWxhciB0byA8a2JkPkRCX1RBQkxFSU5GT19PUkRFUjwva2JkPiBidXQgYWRkcyBtb3JlCiAgICAgKiAgIGRpbWVuc2lvbnMgdG8gdGhlIGFycmF5IGluIHdoaWNoIHRoZSB0YWJsZSBuYW1lcyBhcmUga2V5cyBhbmQKICAgICAqICAgdGhlIGZpZWxkIG5hbWVzIGFyZSBzdWIta2V5cy4gIFRoaXMgaXMgaGVscGZ1bCBmb3IgcXVlcmllcyB0aGF0CiAgICAgKiAgIGpvaW4gdGFibGVzIHdoaWNoIGhhdmUgaWRlbnRpY2FsIGZpZWxkIG5hbWVzLjwvcD4KICAgICAqCiAgICAgKiAgIDxwcmU+CiAgICAgKiAgIFtudW1fZmllbGRzXSA9PiAzCiAgICAgKiAgIFtvcmRlcnRhYmxlXSA9PiBBcnJheSAoCiAgICAgKiAgICAgICBbdGJsRm9vXSA9PiBBcnJheSAoCiAgICAgKiAgICAgICAgICAgW2ZsZElkXSA9PiAwCiAgICAgKiAgICAgICAgICAgW2ZsZFBob25lXSA9PiAxCiAgICAgKiAgICAgICApCiAgICAgKiAgICAgICBbdGJsQmFyXSA9PiBBcnJheSAoCiAgICAgKiAgICAgICAgICAgW2ZsZElkXSA9PiAyCiAgICAgKiAgICAgICApCiAgICAgKiAgICkKICAgICAqICAgPC9wcmU+CiAgICAgKgogICAgICogPC9saT4KICAgICAqIDwvdWw+CiAgICAgKgogICAgICogVGhlIDxzYW1wPmZsYWdzPC9zYW1wPiBlbGVtZW50IGNvbnRhaW5zIGEgc3BhY2Ugc2VwYXJhdGVkIGxpc3QKICAgICAqIG9mIGV4dHJhIGluZm9ybWF0aW9uIGFib3V0IHRoZSBmaWVsZC4gIFRoaXMgZGF0YSBpcyBpbmNvbnNpc3RlbnQKICAgICAqIGJldHdlZW4gREJNUydzIGR1ZSB0byB0aGUgd2F5IGVhY2ggREJNUyB3b3Jrcy4KICAgICAqICAgKyA8c2FtcD5wcmltYXJ5X2tleTwvc2FtcD4KICAgICAqICAgKyA8c2FtcD51bmlxdWVfa2V5PC9zYW1wPgogICAgICogICArIDxzYW1wPm11bHRpcGxlX2tleTwvc2FtcD4KICAgICAqICAgKyA8c2FtcD5ub3RfbnVsbDwvc2FtcD4KICAgICAqCiAgICAgKiBNb3N0IERCTVMncyBvbmx5IHByb3ZpZGUgdGhlIDxzYW1wPnRhYmxlPC9zYW1wPiBhbmQgPHNhbXA+ZmxhZ3M8L3NhbXA+CiAgICAgKiBlbGVtZW50cyBpZiA8dmFyPiRyZXN1bHQ8L3Zhcj4gaXMgYSB0YWJsZSBuYW1lLiAgVGhlIGZvbGxvd2luZyBEQk1TJ3MKICAgICAqIHByb3ZpZGUgZnVsbCBpbmZvcm1hdGlvbiBmcm9tIHF1ZXJpZXM6CiAgICAgKiAgICsgZmJzcWwKICAgICAqICAgKyBteXNxbAogICAgICoKICAgICAqIElmIHRoZSAncG9ydGFiaWxpdHknIG9wdGlvbiBoYXMgPHNhbXA+REJfUE9SVEFCSUxJVFlfTE9XRVJDQVNFPC9zYW1wPgogICAgICogdHVybmVkIG9uLCB0aGUgbmFtZXMgb2YgdGFibGVzIGFuZCBmaWVsZHMgd2lsbCBiZSBsb3dlcmNhc2VkLgogICAgICoKICAgICAqIEBwYXJhbSBvYmplY3R8c3RyaW5nICAkcmVzdWx0ICBEQl9yZXN1bHQgb2JqZWN0IGZyb20gYSBxdWVyeSBvciBhCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIG5hbWUgb2YgYSB0YWJsZS4KICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaGlsZSB0aGlzIGFsc28gYWNjZXB0cyBhIHF1ZXJ5IHJlc3VsdAogICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlIGlkZW50aWZpZXIsIHRoaXMgYmVoYXZpb3IgaXMKICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXByZWNhdGVkLgogICAgICogQHBhcmFtIGludCAgJG1vZGUgICBlaXRoZXIgdW51c2VkIG9yIG9uZSBvZiB0aGUgdGFibGVJbmZvIG1vZGVzOgogICAgICogICAgICAgICAgICAgICAgICAgICA8a2JkPkRCX1RBQkxFSU5GT19PUkRFUlRBQkxFPC9rYmQ+LAogICAgICogICAgICAgICAgICAgICAgICAgICA8a2JkPkRCX1RBQkxFSU5GT19PUkRFUjwva2JkPiBvcgogICAgICogICAgICAgICAgICAgICAgICAgICA8a2JkPkRCX1RBQkxFSU5GT19GVUxMPC9rYmQ+ICh3aGljaCBkb2VzIGJvdGgpLgogICAgICogICAgICAgICAgICAgICAgICAgICBUaGVzZSBhcmUgYml0d2lzZSwgc28gdGhlIGZpcnN0IHR3byBjYW4gYmUKICAgICAqICAgICAgICAgICAgICAgICAgICAgY29tYmluZWQgdXNpbmcgPGtiZD58PC9rYmQ+LgogICAgICoKICAgICAqIEByZXR1cm4gYXJyYXkgIGFuIGFzc29jaWF0aXZlIGFycmF5IHdpdGggdGhlIGluZm9ybWF0aW9uIHJlcXVlc3RlZC4KICAgICAqICAgICAgICAgICAgICAgICBBIERCX0Vycm9yIG9iamVjdCBvbiBmYWlsdXJlLgogICAgICoKICAgICAqIEBzZWUgREJfY29tbW9uOjpzZXRPcHRpb24oKQogICAgICovCiAgICBmdW5jdGlvbiB0YWJsZUluZm8oJHJlc3VsdCwgJG1vZGUgPSBudWxsKQogICAgewogICAgICAgIC8qCiAgICAgICAgICogSWYgdGhlIERCXzxkcml2ZXI+IGNsYXNzIGhhcyBhIHRhYmxlSW5mbygpIG1ldGhvZCwgdGhhdCBvbmUKICAgICAgICAgKiBvdmVycmlkZXMgdGhpcyBvbmUuICBCdXQsIGlmIHRoZSBkcml2ZXIgZG9lc24ndCBoYXZlIG9uZSwKICAgICAgICAgKiB0aGlzIG1ldGhvZCBydW5zIGFuZCB0ZWxscyB1c2VycyBhYm91dCB0aGF0IGZhY3QuCiAgICAgICAgICovCiAgICAgICAgcmV0dXJuICR0aGlzLT5yYWlzZUVycm9yKERCX0VSUk9SX05PVF9DQVBBQkxFKTsKICAgIH0KCiAgICAvLyB9fX0KICAgIC8vIHt7eyBnZXRUYWJsZXMoKQoKICAgIC8qKgogICAgICogTGlzdHMgdGhlIHRhYmxlcyBpbiB0aGUgY3VycmVudCBkYXRhYmFzZQogICAgICoKICAgICAqIEByZXR1cm4gYXJyYXkgIHRoZSBsaXN0IG9mIHRhYmxlcy4gIEEgREJfRXJyb3Igb2JqZWN0IG9uIGZhaWx1cmUuCiAgICAgKgogICAgICogQGRlcHJlY2F0ZWQgTWV0aG9kIGRlcHJlY2F0ZWQgc29tZSB0aW1lIGJlZm9yZSBSZWxlYXNlIDEuMgogICAgICovCiAgICBmdW5jdGlvbiBnZXRUYWJsZXMoKQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+Z2V0TGlzdE9mKCd0YWJsZXMnKTsKICAgIH0KCiAgICAvLyB9fX0KICAgIC8vIHt7eyBnZXRMaXN0T2YoKQoKICAgIC8qKgogICAgICogTGlzdHMgaW50ZXJuYWwgZGF0YWJhc2UgaW5mb3JtYXRpb24KICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICR0eXBlICB0eXBlIG9mIGluZm9ybWF0aW9uIGJlaW5nIHNvdWdodC4KICAgICAqICAgICAgICAgICAgICAgICAgICAgICBDb21tb24gaXRlbXMgYmVpbmcgc291Z2h0IGFyZToKICAgICAqICAgICAgICAgICAgICAgICAgICAgICB0YWJsZXMsIGRhdGFiYXNlcywgdXNlcnMsIHZpZXdzLCBmdW5jdGlvbnMKICAgICAqICAgICAgICAgICAgICAgICAgICAgICBFYWNoIERCTVMncyBoYXMgaXRzIG93biBjYXBhYmlsaXRpZXMuCiAgICAgKgogICAgICogQHJldHVybiBhcnJheSAgYW4gYXJyYXkgbGlzdGluZyB0aGUgaXRlbXMgc291Z2h0LgogICAgICogICAgICAgICAgICAgICAgIEEgREIgREJfRXJyb3Igb2JqZWN0IG9uIGZhaWx1cmUuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldExpc3RPZigkdHlwZSkKICAgIHsKICAgICAgICAkc3FsID0gJHRoaXMtPmdldFNwZWNpYWxRdWVyeSgkdHlwZSk7CiAgICAgICAgaWYgKCRzcWwgPT09IG51bGwpIHsKICAgICAgICAgICAgJHRoaXMtPmxhc3RfcXVlcnkgPSAnJzsKICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5yYWlzZUVycm9yKERCX0VSUk9SX1VOU1VQUE9SVEVEKTsKICAgICAgICB9IGVsc2VpZiAoaXNfaW50KCRzcWwpIHx8IERCOjppc0Vycm9yKCRzcWwpKSB7CiAgICAgICAgICAgIC8vIFByZXZpb3VzIGVycm9yCiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+cmFpc2VFcnJvcigkc3FsKTsKICAgICAgICB9IGVsc2VpZiAoaXNfYXJyYXkoJHNxbCkpIHsKICAgICAgICAgICAgLy8gQWxyZWFkeSB0aGUgcmVzdWx0CiAgICAgICAgICAgIHJldHVybiAkc3FsOwogICAgICAgIH0KICAgICAgICAvLyBMYXVuY2ggdGhpcyBxdWVyeQogICAgICAgIHJldHVybiAkdGhpcy0+Z2V0Q29sKCRzcWwpOwogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IGdldFNwZWNpYWxRdWVyeSgpCgogICAgLyoqCiAgICAgKiBPYnRhaW5zIHRoZSBxdWVyeSBzdHJpbmcgbmVlZGVkIGZvciBsaXN0aW5nIGEgZ2l2ZW4gdHlwZSBvZiBvYmplY3RzCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkdHlwZSAgdGhlIGtpbmQgb2Ygb2JqZWN0cyB5b3Ugd2FudCB0byByZXRyaWV2ZQogICAgICoKICAgICAqIEByZXR1cm4gc3RyaW5nICB0aGUgU1FMIHF1ZXJ5IHN0cmluZyBvciBudWxsIGlmIHRoZSBkcml2ZXIgZG9lc24ndAogICAgICogICAgICAgICAgICAgICAgICBzdXBwb3J0IHRoZSBvYmplY3QgdHlwZSByZXF1ZXN0ZWQKICAgICAqCiAgICAgKiBAYWNjZXNzIHByb3RlY3RlZAogICAgICogQHNlZSBEQl9jb21tb246OmdldExpc3RPZigpCiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldFNwZWNpYWxRdWVyeSgkdHlwZSkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnJhaXNlRXJyb3IoREJfRVJST1JfVU5TVVBQT1JURUQpOwogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IG5leHRRdWVyeUlzTWFuaXAoKQoKICAgIC8qKgogICAgICogU2V0cyAob3IgdW5zZXRzKSBhIGZsYWcgaW5kaWNhdGluZyB0aGF0IHRoZSBuZXh0IHF1ZXJ5IHdpbGwgYmUgYQogICAgICogbWFuaXB1bGF0aW9uIHF1ZXJ5LCByZWdhcmRsZXNzIG9mIHRoZSB1c3VhbCBEQjo6aXNNYW5pcCgpIGhldXJpc3RpY3MuCiAgICAgKgogICAgICogQHBhcmFtIGJvb2xlYW4gdHJ1ZSB0byBzZXQgdGhlIGZsYWcgb3ZlcnJpZGluZyB0aGUgaXNNYW5pcCgpIGJlaGF2aW91ciwKICAgICAqIGZhbHNlIHRvIGNsZWFyIGl0IGFuZCBmYWxsIGJhY2sgb250byBpc01hbmlwKCkKICAgICAqCiAgICAgKiBAcmV0dXJuIHZvaWQKICAgICAqCiAgICAgKiBAYWNjZXNzIHB1YmxpYwogICAgICovCiAgICBmdW5jdGlvbiBuZXh0UXVlcnlJc01hbmlwKCRtYW5pcCkKICAgIHsKICAgICAgICAkdGhpcy0+X25leHRfcXVlcnlfbWFuaXAgPSAkbWFuaXA7CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgX2NoZWNrTWFuaXAoKQoKICAgIC8qKgogICAgICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBxdWVyeSBpcyBhIG1hbmlwdWxhdGlvbiBxdWVyeS4gVGhpcyBhbHNvIHRha2VzIGludG8KICAgICAqIGFjY291bnQgdGhlIF9uZXh0X3F1ZXJ5X21hbmlwIGZsYWcgYW5kIHNldHMgdGhlIF9sYXN0X3F1ZXJ5X21hbmlwIGZsYWcKICAgICAqIChhbmQgcmVzZXRzIF9uZXh0X3F1ZXJ5X21hbmlwKSBhY2NvcmRpbmcgdG8gdGhlIHJlc3VsdC4KICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nIFRoZSBxdWVyeSB0byBjaGVjay4KICAgICAqCiAgICAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBpZiB0aGUgcXVlcnkgaXMgYSBtYW5pcHVsYXRpb24gcXVlcnksIGZhbHNlCiAgICAgKiBvdGhlcndpc2UKICAgICAqCiAgICAgKiBAYWNjZXNzIHByb3RlY3RlZAogICAgICovCiAgICBmdW5jdGlvbiBfY2hlY2tNYW5pcCgkcXVlcnkpCiAgICB7CiAgICAgICAgaWYgKCR0aGlzLT5fbmV4dF9xdWVyeV9tYW5pcCB8fCBEQjo6aXNNYW5pcCgkcXVlcnkpKSB7CiAgICAgICAgICAgICR0aGlzLT5fbGFzdF9xdWVyeV9tYW5pcCA9IHRydWU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJHRoaXMtPl9sYXN0X3F1ZXJ5X21hbmlwID0gZmFsc2U7CiAgICAgICAgfQogICAgICAgICR0aGlzLT5fbmV4dF9xdWVyeV9tYW5pcCA9IGZhbHNlOwogICAgICAgIHJldHVybiAkdGhpcy0+X2xhc3RfcXVlcnlfbWFuaXA7CiAgICAgICAgJG1hbmlwID0gJHRoaXMtPl9uZXh0X3F1ZXJ5X21hbmlwOwogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IF9ydHJpbUFycmF5VmFsdWVzKCkKCiAgICAvKioKICAgICAqIFJpZ2h0LXRyaW1zIGFsbCBzdHJpbmdzIGluIGFuIGFycmF5CiAgICAgKgogICAgICogQHBhcmFtIGFycmF5ICRhcnJheSAgdGhlIGFycmF5IHRvIGJlIHRyaW1tZWQgKHBhc3NlZCBieSByZWZlcmVuY2UpCiAgICAgKgogICAgICogQHJldHVybiB2b2lkCiAgICAgKgogICAgICogQGFjY2VzcyBwcm90ZWN0ZWQKICAgICAqLwogICAgZnVuY3Rpb24gX3J0cmltQXJyYXlWYWx1ZXMoJiRhcnJheSkKICAgIHsKICAgICAgICBmb3JlYWNoICgkYXJyYXkgYXMgJGtleSA9PiAkdmFsdWUpIHsKICAgICAgICAgICAgaWYgKGlzX3N0cmluZygkdmFsdWUpKSB7CiAgICAgICAgICAgICAgICAkYXJyYXlbJGtleV0gPSBydHJpbSgkdmFsdWUpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IF9jb252ZXJ0TnVsbEFycmF5VmFsdWVzVG9FbXB0eSgpCgogICAgLyoqCiAgICAgKiBDb252ZXJ0cyBhbGwgbnVsbCB2YWx1ZXMgaW4gYW4gYXJyYXkgdG8gZW1wdHkgc3RyaW5ncwogICAgICoKICAgICAqIEBwYXJhbSBhcnJheSAgJGFycmF5ICB0aGUgYXJyYXkgdG8gYmUgZGUtbnVsbGlmaWVkIChwYXNzZWQgYnkgcmVmZXJlbmNlKQogICAgICoKICAgICAqIEByZXR1cm4gdm9pZAogICAgICoKICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkCiAgICAgKi8KICAgIGZ1bmN0aW9uIF9jb252ZXJ0TnVsbEFycmF5VmFsdWVzVG9FbXB0eSgmJGFycmF5KQogICAgewogICAgICAgIGZvcmVhY2ggKCRhcnJheSBhcyAka2V5ID0+ICR2YWx1ZSkgewogICAgICAgICAgICBpZiAoaXNfbnVsbCgkdmFsdWUpKSB7CiAgICAgICAgICAgICAgICAkYXJyYXlbJGtleV0gPSAnJzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAvLyB9fX0KfQoKLyoKICogTG9jYWwgdmFyaWFibGVzOgogKiB0YWItd2lkdGg6IDQKICogYy1iYXNpYy1vZmZzZXQ6IDQKICogRW5kOgogKi8KCj8+Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/pear/DB/dbase.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qIHZpbTogc2V0IGV4cGFuZHRhYiB0YWJzdG9wPTQgc2hpZnR3aWR0aD00IHNvZnR0YWJzdG9wPTQ6ICovCgovKioKICogVGhlIFBFQVIgREIgZHJpdmVyIGZvciBQSFAncyBkYmFzZSBleHRlbnNpb24KICogZm9yIGludGVyYWN0aW5nIHdpdGggZEJhc2UgZGF0YWJhc2VzCiAqCiAqIFBIUCB2ZXJzaW9ucyA0IGFuZCA1CiAqCiAqIExJQ0VOU0U6IFRoaXMgc291cmNlIGZpbGUgaXMgc3ViamVjdCB0byB2ZXJzaW9uIDMuMCBvZiB0aGUgUEhQIGxpY2Vuc2UKICogdGhhdCBpcyBhdmFpbGFibGUgdGhyb3VnaCB0aGUgd29ybGQtd2lkZS13ZWIgYXQgdGhlIGZvbGxvd2luZyBVUkk6CiAqIGh0dHA6Ly93d3cucGhwLm5ldC9saWNlbnNlLzNfMC50eHQuICBJZiB5b3UgZGlkIG5vdCByZWNlaXZlIGEgY29weSBvZgogKiB0aGUgUEhQIExpY2Vuc2UgYW5kIGFyZSB1bmFibGUgdG8gb2J0YWluIGl0IHRocm91Z2ggdGhlIHdlYiwgcGxlYXNlCiAqIHNlbmQgYSBub3RlIHRvIGxpY2Vuc2VAcGhwLm5ldCBzbyB3ZSBjYW4gbWFpbCB5b3UgYSBjb3B5IGltbWVkaWF0ZWx5LgogKgogKiBAY2F0ZWdvcnkgICBEYXRhYmFzZQogKiBAcGFja2FnZSAgICBEQgogKiBAYXV0aG9yICAgICBUb21hcyBWLlYuIENveCA8Y294QGlkZWNuZXQuY29tPgogKiBAYXV0aG9yICAgICBEYW5pZWwgQ29udmlzc29yIDxkYW5pZWxjQHBocC5uZXQ+CiAqIEBjb3B5cmlnaHQgIDE5OTctMjAwNSBUaGUgUEhQIEdyb3VwCiAqIEBsaWNlbnNlICAgIGh0dHA6Ly93d3cucGhwLm5ldC9saWNlbnNlLzNfMC50eHQgIFBIUCBMaWNlbnNlIDMuMAogKiBAdmVyc2lvbiAgICBDVlM6ICRJZDogZGJhc2UucGhwLHYgMS40MiAyMDA3LzAxLzExIDA3OjQzOjA5IGFoYXJ2ZXkgRXhwICQKICogQGxpbmsgICAgICAgaHR0cDovL3BlYXIucGhwLm5ldC9wYWNrYWdlL0RCCiAqLwoKLyoqCiAqIE9idGFpbiB0aGUgREJfY29tbW9uIGNsYXNzIHNvIGl0IGNhbiBiZSBleHRlbmRlZCBmcm9tCiAqLwpyZXF1aXJlX29uY2UgJ0RCL2NvbW1vbi5waHAnOwoKLyoqCiAqIFRoZSBtZXRob2RzIFBFQVIgREIgdXNlcyB0byBpbnRlcmFjdCB3aXRoIFBIUCdzIGRiYXNlIGV4dGVuc2lvbgogKiBmb3IgaW50ZXJhY3Rpbmcgd2l0aCBkQmFzZSBkYXRhYmFzZXMKICoKICogVGhlc2UgbWV0aG9kcyBvdmVybG9hZCB0aGUgb25lcyBkZWNsYXJlZCBpbiBEQl9jb21tb24uCiAqCiAqIEBjYXRlZ29yeSAgIERhdGFiYXNlCiAqIEBwYWNrYWdlICAgIERCCiAqIEBhdXRob3IgICAgIFRvbWFzIFYuVi4gQ294IDxjb3hAaWRlY25ldC5jb20+CiAqIEBhdXRob3IgICAgIERhbmllbCBDb252aXNzb3IgPGRhbmllbGNAcGhwLm5ldD4KICogQGNvcHlyaWdodCAgMTk5Ny0yMDA1IFRoZSBQSFAgR3JvdXAKICogQGxpY2Vuc2UgICAgaHR0cDovL3d3dy5waHAubmV0L2xpY2Vuc2UvM18wLnR4dCAgUEhQIExpY2Vuc2UgMy4wCiAqIEB2ZXJzaW9uICAgIFJlbGVhc2U6IDEuNy4xMgogKiBAbGluayAgICAgICBodHRwOi8vcGVhci5waHAubmV0L3BhY2thZ2UvREIKICovCmNsYXNzIERCX2RiYXNlIGV4dGVuZHMgREJfY29tbW9uCnsKICAgIC8vIHt7eyBwcm9wZXJ0aWVzCgogICAgLyoqCiAgICAgKiBUaGUgREIgZHJpdmVyIHR5cGUgKG15c3FsLCBvY2k4LCBvZGJjLCBldGMuKQogICAgICogQHZhciBzdHJpbmcKICAgICAqLwogICAgdmFyICRwaHB0eXBlID0gJ2RiYXNlJzsKCiAgICAvKioKICAgICAqIFRoZSBkYXRhYmFzZSBzeW50YXggdmFyaWFudCB0byBiZSB1c2VkIChkYjIsIGFjY2VzcywgZXRjLiksIGlmIGFueQogICAgICogQHZhciBzdHJpbmcKICAgICAqLwogICAgdmFyICRkYnN5bnRheCA9ICdkYmFzZSc7CgogICAgLyoqCiAgICAgKiBUaGUgY2FwYWJpbGl0aWVzIG9mIHRoaXMgREIgaW1wbGVtZW50YXRpb24KICAgICAqCiAgICAgKiBUaGUgJ25ld19saW5rJyBlbGVtZW50IGNvbnRhaW5zIHRoZSBQSFAgdmVyc2lvbiB0aGF0IGZpcnN0IHByb3ZpZGVkCiAgICAgKiBuZXdfbGluayBzdXBwb3J0IGZvciB0aGlzIERCTVMuICBDb250YWlucyBmYWxzZSBpZiBpdCdzIHVuc3VwcG9ydGVkLgogICAgICoKICAgICAqIE1lYW5pbmcgb2YgdGhlICdsaW1pdCcgZWxlbWVudDoKICAgICAqICAgKyAnZW11bGF0ZScgPSBlbXVsYXRlIHdpdGggZmV0Y2ggcm93IGJ5IG51bWJlcgogICAgICogICArICdhbHRlcicgICA9IGFsdGVyIHRoZSBxdWVyeQogICAgICogICArIGZhbHNlICAgICA9IHNraXAgcm93cwogICAgICoKICAgICAqIEB2YXIgYXJyYXkKICAgICAqLwogICAgdmFyICRmZWF0dXJlcyA9IGFycmF5KAogICAgICAgICdsaW1pdCcgICAgICAgICA9PiBmYWxzZSwKICAgICAgICAnbmV3X2xpbmsnICAgICAgPT4gZmFsc2UsCiAgICAgICAgJ251bXJvd3MnICAgICAgID0+IHRydWUsCiAgICAgICAgJ3Bjb25uZWN0JyAgICAgID0+IGZhbHNlLAogICAgICAgICdwcmVwYXJlJyAgICAgICA9PiBmYWxzZSwKICAgICAgICAnc3NsJyAgICAgICAgICAgPT4gZmFsc2UsCiAgICAgICAgJ3RyYW5zYWN0aW9ucycgID0+IGZhbHNlLAogICAgKTsKCiAgICAvKioKICAgICAqIEEgbWFwcGluZyBvZiBuYXRpdmUgZXJyb3IgY29kZXMgdG8gREIgZXJyb3IgY29kZXMKICAgICAqIEB2YXIgYXJyYXkKICAgICAqLwogICAgdmFyICRlcnJvcmNvZGVfbWFwID0gYXJyYXkoCiAgICApOwoKICAgIC8qKgogICAgICogVGhlIHJhdyBkYXRhYmFzZSBjb25uZWN0aW9uIGNyZWF0ZWQgYnkgUEhQCiAgICAgKiBAdmFyIHJlc291cmNlCiAgICAgKi8KICAgIHZhciAkY29ubmVjdGlvbjsKCiAgICAvKioKICAgICAqIFRoZSBEU04gaW5mb3JtYXRpb24gZm9yIGNvbm5lY3RpbmcgdG8gYSBkYXRhYmFzZQogICAgICogQHZhciBhcnJheQogICAgICovCiAgICB2YXIgJGRzbiA9IGFycmF5KCk7CgoKICAgIC8qKgogICAgICogQSBtZWFucyBvZiBlbXVsYXRpbmcgcmVzdWx0IHJlc291cmNlcwogICAgICogQHZhciBhcnJheQogICAgICovCiAgICB2YXIgJHJlc19yb3cgPSBhcnJheSgpOwoKICAgIC8qKgogICAgICogVGhlIHF1YW50aXR5IG9mIHJlc3VsdHMgc28gZmFyCiAgICAgKgogICAgICogRm9yIGVtdWxhdGluZyByZXN1bHQgcmVzb3VyY2VzLgogICAgICoKICAgICAqIEB2YXIgaW50ZWdlcgogICAgICovCiAgICB2YXIgJHJlc3VsdCA9IDA7CgogICAgLyoqCiAgICAgKiBNYXBzIGRiYXNlIGRhdGEgdHlwZSBpZCdzIHRvIGh1bWFuIHJlYWRhYmxlIHN0cmluZ3MKICAgICAqCiAgICAgKiBUaGUgaHVtYW4gcmVhZGFibGUgdmFsdWVzIGFyZSBiYXNlZCBvbiB0aGUgb3V0cHV0IG9mIFBIUCdzCiAgICAgKiBkYmFzZV9nZXRfaGVhZGVyX2luZm8oKSBmdW5jdGlvbi4KICAgICAqCiAgICAgKiBAdmFyIGFycmF5CiAgICAgKiBAc2luY2UgUHJvcGVydHkgYXZhaWxhYmxlIHNpbmNlIFJlbGVhc2UgMS43LjAKICAgICAqLwogICAgdmFyICR0eXBlcyA9IGFycmF5KAogICAgICAgICdDJyA9PiAnY2hhcmFjdGVyJywKICAgICAgICAnRCcgPT4gJ2RhdGUnLAogICAgICAgICdMJyA9PiAnYm9vbGVhbicsCiAgICAgICAgJ00nID0+ICdtZW1vJywKICAgICAgICAnTicgPT4gJ251bWJlcicsCiAgICApOwoKCiAgICAvLyB9fX0KICAgIC8vIHt7eyBjb25zdHJ1Y3RvcgoKICAgIC8qKgogICAgICogVGhpcyBjb25zdHJ1Y3RvciBjYWxscyA8a2JkPiR0aGlzLT5EQl9jb21tb24oKTwva2JkPgogICAgICoKICAgICAqIEByZXR1cm4gdm9pZAogICAgICovCiAgICBmdW5jdGlvbiBEQl9kYmFzZSgpCiAgICB7CiAgICAgICAgJHRoaXMtPkRCX2NvbW1vbigpOwogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IGNvbm5lY3QoKQoKICAgIC8qKgogICAgICogQ29ubmVjdCB0byB0aGUgZGF0YWJhc2UgYW5kIGNyZWF0ZSBpdCBpZiBpdCBkb2Vzbid0IGV4aXN0CiAgICAgKgogICAgICogRG9uJ3QgY2FsbCB0aGlzIG1ldGhvZCBkaXJlY3RseS4gIFVzZSBEQjo6Y29ubmVjdCgpIGluc3RlYWQuCiAgICAgKgogICAgICogUEVBUiBEQidzIGRiYXNlIGRyaXZlciBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIGV4dHJhIERTTiBvcHRpb25zOgogICAgICogICArIG1vZGUgICAgQW4gaW50ZWdlciBzcGVjaWZ5aW5nIHRoZSByZWFkL3dyaXRlIG1vZGUgdG8gdXNlCiAgICAgKiAgICAgICAgICAgICAgKDAgPSByZWFkIG9ubHksIDEgPSB3cml0ZSBvbmx5LCAyID0gcmVhZC93cml0ZSkuCiAgICAgKiAgICAgICAgICAgICAgQXZhaWxhYmxlIHNpbmNlIFBFQVIgREIgMS43LjAuCiAgICAgKiAgICsgZmllbGRzICBBbiBhcnJheSBvZiBhcnJheXMgdGhhdCBQSFAncyBkYmFzZV9jcmVhdGUoKSBmdW5jdGlvbiBuZWVkcwogICAgICogICAgICAgICAgICAgIHRvIGNyZWF0ZSBhIG5ldyBkYXRhYmFzZS4gIFRoaXMgaW5mb3JtYXRpb24gaXMgdXNlZCBpZiB0aGUKICAgICAqICAgICAgICAgICAgICBkQmFzZSBmaWxlIHNwZWNpZmllZCBpbiB0aGUgImRhdGFiYXNlIiBzZWdtZW50IG9mIHRoZSBEU04KICAgICAqICAgICAgICAgICAgICBkb2VzIG5vdCBleGlzdC4gIEZvciBtb3JlIGluZm8sIHNlZSB0aGUgUEhQIG1hbnVhbCdzCiAgICAgKiAgICAgICAgICAgICAge0BsaW5rIGh0dHA6Ly9waHAubmV0L2RiYXNlX2NyZWF0ZSBkYmFzZV9jcmVhdGUoKX0gcGFnZS4KICAgICAqICAgICAgICAgICAgICBBdmFpbGFibGUgc2luY2UgUEVBUiBEQiAxLjcuMC4KICAgICAqCiAgICAgKiBFeGFtcGxlIG9mIGhvdyB0byBjb25uZWN0IGFuZCBlc3RhYmxpc2ggYSBuZXcgZEJhc2UgZmlsZSBpZiBuZWNlc3Nhcnk6CiAgICAgKiA8Y29kZT4KICAgICAqIHJlcXVpcmVfb25jZSAnREIucGhwJzsKICAgICAqCiAgICAgKiAkZHNuID0gYXJyYXkoCiAgICAgKiAgICAgJ3BocHR5cGUnICA9PiAnZGJhc2UnLAogICAgICogICAgICdkYXRhYmFzZScgPT4gJy9wYXRoL2FuZC9uYW1lL29mL2RiYXNlL2ZpbGUnLAogICAgICogICAgICdtb2RlJyAgICAgPT4gMiwKICAgICAqICAgICAnZmllbGRzJyAgID0+IGFycmF5KAogICAgICogICAgICAgICBhcnJheSgnYScsICdOJywgNSwgMCksCiAgICAgKiAgICAgICAgIGFycmF5KCdiJywgJ0MnLCA0MCksCiAgICAgKiAgICAgICAgIGFycmF5KCdjJywgJ0MnLCAyNTUpLAogICAgICogICAgICAgICBhcnJheSgnZCcsICdDJywgMjApLAogICAgICogICAgICksCiAgICAgKiApOwogICAgICogJG9wdGlvbnMgPSBhcnJheSgKICAgICAqICAgICAnZGVidWcnICAgICAgID0+IDIsCiAgICAgKiAgICAgJ3BvcnRhYmlsaXR5JyA9PiBEQl9QT1JUQUJJTElUWV9BTEwsCiAgICAgKiApOwogICAgICoKICAgICAqICRkYiA9JiBEQjo6Y29ubmVjdCgkZHNuLCAkb3B0aW9ucyk7CiAgICAgKiBpZiAoUEVBUjo6aXNFcnJvcigkZGIpKSB7CiAgICAgKiAgICAgZGllKCRkYi0+Z2V0TWVzc2FnZSgpKTsKICAgICAqIH0KICAgICAqIDwvY29kZT4KICAgICAqCiAgICAgKiBAcGFyYW0gYXJyYXkgJGRzbiAgICAgICAgIHRoZSBkYXRhIHNvdXJjZSBuYW1lCiAgICAgKiBAcGFyYW0gYm9vbCAgJHBlcnNpc3RlbnQgIHNob3VsZCB0aGUgY29ubmVjdGlvbiBiZSBwZXJzaXN0ZW50PwogICAgICoKICAgICAqIEByZXR1cm4gaW50ICBEQl9PSyBvbiBzdWNjZXNzLiBBIERCX0Vycm9yIG9iamVjdCBvbiBmYWlsdXJlLgogICAgICovCiAgICBmdW5jdGlvbiBjb25uZWN0KCRkc24sICRwZXJzaXN0ZW50ID0gZmFsc2UpCiAgICB7CiAgICAgICAgaWYgKCFQRUFSOjpsb2FkRXh0ZW5zaW9uKCdkYmFzZScpKSB7CiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+cmFpc2VFcnJvcihEQl9FUlJPUl9FWFRFTlNJT05fTk9UX0ZPVU5EKTsKICAgICAgICB9CgogICAgICAgICR0aGlzLT5kc24gPSAkZHNuOwogICAgICAgIGlmICgkZHNuWydkYnN5bnRheCddKSB7CiAgICAgICAgICAgICR0aGlzLT5kYnN5bnRheCA9ICRkc25bJ2Ric3ludGF4J107CiAgICAgICAgfQoKICAgICAgICAvKgogICAgICAgICAqIFR1cm4gdHJhY2tfZXJyb3JzIG9uIGZvciBlbnRpcmUgc2NyaXB0IHNpbmNlICRwaHBfZXJyb3Jtc2cKICAgICAgICAgKiBpcyB0aGUgb25seSB3YXkgdG8gZmluZCBlcnJvcnMgZnJvbSB0aGUgZGJhc2UgZXh0ZW5zaW9uLgogICAgICAgICAqLwogICAgICAgIEBpbmlfc2V0KCd0cmFja19lcnJvcnMnLCAxKTsKICAgICAgICAkcGhwX2Vycm9ybXNnID0gJyc7CgogICAgICAgIGlmICghZmlsZV9leGlzdHMoJGRzblsnZGF0YWJhc2UnXSkpIHsKICAgICAgICAgICAgJHRoaXMtPmRzblsnbW9kZSddID0gMjsKICAgICAgICAgICAgaWYgKGVtcHR5KCRkc25bJ2ZpZWxkcyddKSB8fCAhaXNfYXJyYXkoJGRzblsnZmllbGRzJ10pKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPnJhaXNlRXJyb3IoREJfRVJST1JfQ09OTkVDVF9GQUlMRUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwgbnVsbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGhlIGRiYXNlIGZpbGUgZG9lcyBub3QgZXhpc3QgYW5kICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICdpdCBjb3VsZCBub3QgYmUgY3JlYXRlZCBiZWNhdXNlICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICd0aGUgImZpZWxkcyIgZWxlbWVudCBvZiB0aGUgRFNOICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICdpcyBub3QgcHJvcGVybHkgc2V0Jyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJHRoaXMtPmNvbm5lY3Rpb24gPSBAZGJhc2VfY3JlYXRlKCRkc25bJ2RhdGFiYXNlJ10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZHNuWydmaWVsZHMnXSk7CiAgICAgICAgICAgIGlmICghJHRoaXMtPmNvbm5lY3Rpb24pIHsKICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+cmFpc2VFcnJvcihEQl9FUlJPUl9DT05ORUNUX0ZBSUxFRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBudWxsLCBudWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0aGUgZGJhc2UgZmlsZSBkb2VzIG5vdCBleGlzdCBhbmQgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJ3RoZSBhdHRlbXB0IHRvIGNyZWF0ZSBpdCBmYWlsZWQ6ICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICRwaHBfZXJyb3Jtc2cpOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKCFpc3NldCgkdGhpcy0+ZHNuWydtb2RlJ10pKSB7CiAgICAgICAgICAgICAgICAkdGhpcy0+ZHNuWydtb2RlJ10gPSAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgICR0aGlzLT5jb25uZWN0aW9uID0gQGRiYXNlX29wZW4oJGRzblsnZGF0YWJhc2UnXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+ZHNuWydtb2RlJ10pOwogICAgICAgICAgICBpZiAoISR0aGlzLT5jb25uZWN0aW9uKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPnJhaXNlRXJyb3IoREJfRVJST1JfQ09OTkVDVF9GQUlMRUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwgbnVsbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcGhwX2Vycm9ybXNnKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gREJfT0s7CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgZGlzY29ubmVjdCgpCgogICAgLyoqCiAgICAgKiBEaXNjb25uZWN0cyBmcm9tIHRoZSBkYXRhYmFzZSBzZXJ2ZXIKICAgICAqCiAgICAgKiBAcmV0dXJuIGJvb2wgIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZQogICAgICovCiAgICBmdW5jdGlvbiBkaXNjb25uZWN0KCkKICAgIHsKICAgICAgICAkcmV0ID0gQGRiYXNlX2Nsb3NlKCR0aGlzLT5jb25uZWN0aW9uKTsKICAgICAgICAkdGhpcy0+Y29ubmVjdGlvbiA9IG51bGw7CiAgICAgICAgcmV0dXJuICRyZXQ7CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgJnF1ZXJ5KCkKCiAgICBmdW5jdGlvbiAmcXVlcnkoJHF1ZXJ5ID0gbnVsbCkKICAgIHsKICAgICAgICAvLyBlbXVsYXRlIHJlc3VsdCByZXNvdXJjZXMKICAgICAgICAkdGhpcy0+cmVzX3Jvd1soaW50KSR0aGlzLT5yZXN1bHRdID0gMDsKICAgICAgICAkdG1wID0mIG5ldyBEQl9yZXN1bHQoJHRoaXMsICR0aGlzLT5yZXN1bHQrKyk7CiAgICAgICAgcmV0dXJuICR0bXA7CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgZmV0Y2hJbnRvKCkKCiAgICAvKioKICAgICAqIFBsYWNlcyBhIHJvdyBmcm9tIHRoZSByZXN1bHQgc2V0IGludG8gdGhlIGdpdmVuIGFycmF5CiAgICAgKgogICAgICogRm9ybWF0aW5nIG9mIHRoZSBhcnJheSBhbmQgdGhlIGRhdGEgdGhlcmVpbiBhcmUgY29uZmlndXJhYmxlLgogICAgICogU2VlIERCX3Jlc3VsdDo6ZmV0Y2hJbnRvKCkgZm9yIG1vcmUgaW5mb3JtYXRpb24uCiAgICAgKgogICAgICogVGhpcyBtZXRob2QgaXMgbm90IG1lYW50IHRvIGJlIGNhbGxlZCBkaXJlY3RseS4gIFVzZQogICAgICogREJfcmVzdWx0OjpmZXRjaEludG8oKSBpbnN0ZWFkLiAgSXQgY2FuJ3QgYmUgZGVjbGFyZWQgInByb3RlY3RlZCIKICAgICAqIGJlY2F1c2UgREJfcmVzdWx0IGlzIGEgc2VwYXJhdGUgb2JqZWN0LgogICAgICoKICAgICAqIEBwYXJhbSByZXNvdXJjZSAkcmVzdWx0ICAgIHRoZSBxdWVyeSByZXN1bHQgcmVzb3VyY2UKICAgICAqIEBwYXJhbSBhcnJheSAgICAkYXJyICAgICAgIHRoZSByZWZlcmVuY2VkIGFycmF5IHRvIHB1dCB0aGUgZGF0YSBpbgogICAgICogQHBhcmFtIGludCAgICAgICRmZXRjaG1vZGUgaG93IHRoZSByZXN1bHRpbmcgYXJyYXkgc2hvdWxkIGJlIGluZGV4ZWQKICAgICAqIEBwYXJhbSBpbnQgICAgICAkcm93bnVtICAgIHRoZSByb3cgbnVtYmVyIHRvIGZldGNoICgwID0gZmlyc3Qgcm93KQogICAgICoKICAgICAqIEByZXR1cm4gbWl4ZWQgIERCX09LIG9uIHN1Y2Nlc3MsIE5VTEwgd2hlbiB0aGUgZW5kIG9mIGEgcmVzdWx0IHNldCBpcwogICAgICogICAgICAgICAgICAgICAgIHJlYWNoZWQgb3Igb24gZmFpbHVyZQogICAgICoKICAgICAqIEBzZWUgREJfcmVzdWx0OjpmZXRjaEludG8oKQogICAgICovCiAgICBmdW5jdGlvbiBmZXRjaEludG8oJHJlc3VsdCwgJiRhcnIsICRmZXRjaG1vZGUsICRyb3dudW0gPSBudWxsKQogICAgewogICAgICAgIGlmICgkcm93bnVtID09PSBudWxsKSB7CiAgICAgICAgICAgICRyb3dudW0gPSAkdGhpcy0+cmVzX3Jvd1soaW50KSRyZXN1bHRdKys7CiAgICAgICAgfQogICAgICAgIGlmICgkZmV0Y2htb2RlICYgREJfRkVUQ0hNT0RFX0FTU09DKSB7CiAgICAgICAgICAgICRhcnIgPSBAZGJhc2VfZ2V0X3JlY29yZF93aXRoX25hbWVzKCR0aGlzLT5jb25uZWN0aW9uLCAkcm93bnVtKTsKICAgICAgICAgICAgaWYgKCR0aGlzLT5vcHRpb25zWydwb3J0YWJpbGl0eSddICYgREJfUE9SVEFCSUxJVFlfTE9XRVJDQVNFICYmICRhcnIpIHsKICAgICAgICAgICAgICAgICRhcnIgPSBhcnJheV9jaGFuZ2Vfa2V5X2Nhc2UoJGFyciwgQ0FTRV9MT1dFUik7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkYXJyID0gQGRiYXNlX2dldF9yZWNvcmQoJHRoaXMtPmNvbm5lY3Rpb24sICRyb3dudW0pOwogICAgICAgIH0KICAgICAgICBpZiAoISRhcnIpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIGlmICgkdGhpcy0+b3B0aW9uc1sncG9ydGFiaWxpdHknXSAmIERCX1BPUlRBQklMSVRZX1JUUklNKSB7CiAgICAgICAgICAgICR0aGlzLT5fcnRyaW1BcnJheVZhbHVlcygkYXJyKTsKICAgICAgICB9CiAgICAgICAgaWYgKCR0aGlzLT5vcHRpb25zWydwb3J0YWJpbGl0eSddICYgREJfUE9SVEFCSUxJVFlfTlVMTF9UT19FTVBUWSkgewogICAgICAgICAgICAkdGhpcy0+X2NvbnZlcnROdWxsQXJyYXlWYWx1ZXNUb0VtcHR5KCRhcnIpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gREJfT0s7CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgZnJlZVJlc3VsdCgpCgogICAgLyoqCiAgICAgKiBEZWxldGVzIHRoZSByZXN1bHQgc2V0IGFuZCBmcmVlcyB0aGUgbWVtb3J5IG9jY3VwaWVkIGJ5IHRoZSByZXN1bHQgc2V0LgogICAgICoKICAgICAqIFRoaXMgbWV0aG9kIGlzIGEgbm8tb3AgZm9yIGRiYXNlLCBhcyB0aGVyZSBhcmVuJ3QgcmVzdWx0IHJlc291cmNlcyBpbgogICAgICogdGhlIHNhbWUgc2Vuc2UgYXMgbW9zdCBvdGhlciBkYXRhYmFzZSBiYWNrZW5kcy4KICAgICAqCiAgICAgKiBAcGFyYW0gcmVzb3VyY2UgJHJlc3VsdCAgUEhQJ3MgcXVlcnkgcmVzdWx0IHJlc291cmNlCiAgICAgKgogICAgICogQHJldHVybiBib29sICBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIGlmICRyZXN1bHQgaXMgaW52YWxpZAogICAgICoKICAgICAqIEBzZWUgREJfcmVzdWx0OjpmcmVlKCkKICAgICAqLwogICAgZnVuY3Rpb24gZnJlZVJlc3VsdCgkcmVzdWx0KQogICAgewogICAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IG51bUNvbHMoKQoKICAgIC8qKgogICAgICogR2V0cyB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgaW4gYSByZXN1bHQgc2V0CiAgICAgKgogICAgICogVGhpcyBtZXRob2QgaXMgbm90IG1lYW50IHRvIGJlIGNhbGxlZCBkaXJlY3RseS4gIFVzZQogICAgICogREJfcmVzdWx0OjpudW1Db2xzKCkgaW5zdGVhZC4gIEl0IGNhbid0IGJlIGRlY2xhcmVkICJwcm90ZWN0ZWQiCiAgICAgKiBiZWNhdXNlIERCX3Jlc3VsdCBpcyBhIHNlcGFyYXRlIG9iamVjdC4KICAgICAqCiAgICAgKiBAcGFyYW0gcmVzb3VyY2UgJHJlc3VsdCAgUEhQJ3MgcXVlcnkgcmVzdWx0IHJlc291cmNlCiAgICAgKgogICAgICogQHJldHVybiBpbnQgIHRoZSBudW1iZXIgb2YgY29sdW1ucy4gIEEgREJfRXJyb3Igb2JqZWN0IG9uIGZhaWx1cmUuCiAgICAgKgogICAgICogQHNlZSBEQl9yZXN1bHQ6Om51bUNvbHMoKQogICAgICovCiAgICBmdW5jdGlvbiBudW1Db2xzKCRmb28pCiAgICB7CiAgICAgICAgcmV0dXJuIEBkYmFzZV9udW1maWVsZHMoJHRoaXMtPmNvbm5lY3Rpb24pOwogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IG51bVJvd3MoKQoKICAgIC8qKgogICAgICogR2V0cyB0aGUgbnVtYmVyIG9mIHJvd3MgaW4gYSByZXN1bHQgc2V0CiAgICAgKgogICAgICogVGhpcyBtZXRob2QgaXMgbm90IG1lYW50IHRvIGJlIGNhbGxlZCBkaXJlY3RseS4gIFVzZQogICAgICogREJfcmVzdWx0OjpudW1Sb3dzKCkgaW5zdGVhZC4gIEl0IGNhbid0IGJlIGRlY2xhcmVkICJwcm90ZWN0ZWQiCiAgICAgKiBiZWNhdXNlIERCX3Jlc3VsdCBpcyBhIHNlcGFyYXRlIG9iamVjdC4KICAgICAqCiAgICAgKiBAcGFyYW0gcmVzb3VyY2UgJHJlc3VsdCAgUEhQJ3MgcXVlcnkgcmVzdWx0IHJlc291cmNlCiAgICAgKgogICAgICogQHJldHVybiBpbnQgIHRoZSBudW1iZXIgb2Ygcm93cy4gIEEgREJfRXJyb3Igb2JqZWN0IG9uIGZhaWx1cmUuCiAgICAgKgogICAgICogQHNlZSBEQl9yZXN1bHQ6Om51bVJvd3MoKQogICAgICovCiAgICBmdW5jdGlvbiBudW1Sb3dzKCRmb28pCiAgICB7CiAgICAgICAgcmV0dXJuIEBkYmFzZV9udW1yZWNvcmRzKCR0aGlzLT5jb25uZWN0aW9uKTsKICAgIH0KCiAgICAvLyB9fX0KICAgIC8vIHt7eyBxdW90ZUJvb2xlYW4oKQoKICAgIC8qKgogICAgICogRm9ybWF0cyBhIGJvb2xlYW4gdmFsdWUgZm9yIHVzZSB3aXRoaW4gYSBxdWVyeSBpbiBhIGxvY2FsZS1pbmRlcGVuZGVudAogICAgICogbWFubmVyLgogICAgICoKICAgICAqIEBwYXJhbSBib29sZWFuIHRoZSBib29sZWFuIHZhbHVlIHRvIGJlIHF1b3RlZC4KICAgICAqIEByZXR1cm4gc3RyaW5nIHRoZSBxdW90ZWQgc3RyaW5nLgogICAgICogQHNlZSBEQl9jb21tb246OnF1b3RlU21hcnQoKQogICAgICogQHNpbmNlIE1ldGhvZCBhdmFpbGFibGUgc2luY2UgcmVsZWFzZSAxLjcuOC4KICAgICAqLwogICAgZnVuY3Rpb24gcXVvdGVCb29sZWFuKCRib29sZWFuKSB7CiAgICAgICAgcmV0dXJuICRib29sZWFuID8gJ1QnIDogJ0YnOwogICAgfQogICAgIAogICAgLy8gfX19CiAgICAvLyB7e3sgdGFibGVJbmZvKCkKCiAgICAvKioKICAgICAqIFJldHVybnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGN1cnJlbnQgZGF0YWJhc2UKICAgICAqCiAgICAgKiBAcGFyYW0gbWl4ZWQgJHJlc3VsdCAgVEhJUyBJUyBVTlVTRUQgSU4gREJBU0UuICBUaGUgY3VycmVudCBkYXRhYmFzZQogICAgICogICAgICAgICAgICAgICAgICAgICAgIGlzIGV4YW1pbmVkIHJlZ2FyZGxlc3Mgb2Ygd2hhdCBpcyBwcm92aWRlZCBoZXJlLgogICAgICogQHBhcmFtIGludCAgICRtb2RlICAgIGEgdmFsaWQgdGFibGVJbmZvIG1vZGUKICAgICAqCiAgICAgKiBAcmV0dXJuIGFycmF5ICBhbiBhc3NvY2lhdGl2ZSBhcnJheSB3aXRoIHRoZSBpbmZvcm1hdGlvbiByZXF1ZXN0ZWQuCiAgICAgKiAgICAgICAgICAgICAgICAgQSBEQl9FcnJvciBvYmplY3Qgb24gZmFpbHVyZS4KICAgICAqCiAgICAgKiBAc2VlIERCX2NvbW1vbjo6dGFibGVJbmZvKCkKICAgICAqIEBzaW5jZSBNZXRob2QgYXZhaWxhYmxlIHNpbmNlIFJlbGVhc2UgMS43LjAKICAgICAqLwogICAgZnVuY3Rpb24gdGFibGVJbmZvKCRyZXN1bHQgPSBudWxsLCAkbW9kZSA9IG51bGwpCiAgICB7CiAgICAgICAgaWYgKGZ1bmN0aW9uX2V4aXN0cygnZGJhc2VfZ2V0X2hlYWRlcl9pbmZvJykpIHsKICAgICAgICAgICAgJGlkID0gQGRiYXNlX2dldF9oZWFkZXJfaW5mbygkdGhpcy0+Y29ubmVjdGlvbik7CiAgICAgICAgICAgIGlmICghJGlkICYmICRwaHBfZXJyb3Jtc2cpIHsKICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+cmFpc2VFcnJvcihEQl9FUlJPUiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBudWxsLCBudWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRwaHBfZXJyb3Jtc2cpOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogVGhpcyBzZWdtZW50IGZvciBQSFAgNCBpcyBsb29zZWx5IGJhc2VkIG9uIGNvZGUgYnkKICAgICAgICAgICAgICogSGFkaSBSdXNpYWggPGRlZWdvc0B5YWhvby5jb20+IGluIHRoZSBjb21tZW50cyBvbgogICAgICAgICAgICAgKiB0aGUgZEJhc2UgcmVmZXJlbmNlIHBhZ2UgaW4gdGhlIFBIUCBtYW51YWwuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICAkZGIgPSBAZm9wZW4oJHRoaXMtPmRzblsnZGF0YWJhc2UnXSwgJ3InKTsKICAgICAgICAgICAgaWYgKCEkZGIpIHsKICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+cmFpc2VFcnJvcihEQl9FUlJPUl9DT05ORUNUX0ZBSUxFRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBudWxsLCBudWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRwaHBfZXJyb3Jtc2cpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkaWQgPSBhcnJheSgpOwogICAgICAgICAgICAkaSAgPSAwOwoKICAgICAgICAgICAgJGxpbmUgPSBmcmVhZCgkZGIsIDMyKTsKICAgICAgICAgICAgd2hpbGUgKCFmZW9mKCRkYikpIHsKICAgICAgICAgICAgICAgICRsaW5lID0gZnJlYWQoJGRiLCAzMik7CiAgICAgICAgICAgICAgICBpZiAoc3Vic3RyKCRsaW5lLCAwLCAxKSA9PSBjaHIoMTMpKSB7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICRwb3MgPSBzdHJwb3Moc3Vic3RyKCRsaW5lLCAwLCAxMCksIGNocigwKSk7CiAgICAgICAgICAgICAgICAgICAgJHBvcyA9ICgkcG9zID09IDAgPyAxMCA6ICRwb3MpOwogICAgICAgICAgICAgICAgICAgICRpZFskaV0gPSBhcnJheSgKICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnICAgPT4gc3Vic3RyKCRsaW5lLCAwLCAkcG9zKSwKICAgICAgICAgICAgICAgICAgICAgICAgJ3R5cGUnICAgPT4gJHRoaXMtPnR5cGVzW3N1YnN0cigkbGluZSwgMTEsIDEpXSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2xlbmd0aCcgPT4gb3JkKHN1YnN0cigkbGluZSwgMTYsIDEpKSwKICAgICAgICAgICAgICAgICAgICAgICAgJ3ByZWNpc2lvbicgPT4gb3JkKHN1YnN0cigkbGluZSwgMTcsIDEpKSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJGkrKzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZmNsb3NlKCRkYik7CiAgICAgICAgfQoKICAgICAgICBpZiAoJHRoaXMtPm9wdGlvbnNbJ3BvcnRhYmlsaXR5J10gJiBEQl9QT1JUQUJJTElUWV9MT1dFUkNBU0UpIHsKICAgICAgICAgICAgJGNhc2VfZnVuYyA9ICdzdHJ0b2xvd2VyJzsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkY2FzZV9mdW5jID0gJ3N0cnZhbCc7CiAgICAgICAgfQoKICAgICAgICAkcmVzICAgPSBhcnJheSgpOwogICAgICAgICRjb3VudCA9IGNvdW50KCRpZCk7CgogICAgICAgIGlmICgkbW9kZSkgewogICAgICAgICAgICAkcmVzWydudW1fZmllbGRzJ10gPSAkY291bnQ7CiAgICAgICAgfQoKICAgICAgICBmb3IgKCRpID0gMDsgJGkgPCAkY291bnQ7ICRpKyspIHsKICAgICAgICAgICAgJHJlc1skaV0gPSBhcnJheSgKICAgICAgICAgICAgICAgICd0YWJsZScgPT4gJHRoaXMtPmRzblsnZGF0YWJhc2UnXSwKICAgICAgICAgICAgICAgICduYW1lJyAgPT4gJGNhc2VfZnVuYygkaWRbJGldWyduYW1lJ10pLAogICAgICAgICAgICAgICAgJ3R5cGUnICA9PiAkaWRbJGldWyd0eXBlJ10sCiAgICAgICAgICAgICAgICAnbGVuJyAgID0+ICRpZFskaV1bJ2xlbmd0aCddLAogICAgICAgICAgICAgICAgJ2ZsYWdzJyA9PiAnJwogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoJG1vZGUgJiBEQl9UQUJMRUlORk9fT1JERVIpIHsKICAgICAgICAgICAgICAgICRyZXNbJ29yZGVyJ11bJHJlc1skaV1bJ25hbWUnXV0gPSAkaTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoJG1vZGUgJiBEQl9UQUJMRUlORk9fT1JERVJUQUJMRSkgewogICAgICAgICAgICAgICAgJHJlc1snb3JkZXJ0YWJsZSddWyRyZXNbJGldWyd0YWJsZSddXVskcmVzWyRpXVsnbmFtZSddXSA9ICRpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJHJlczsKICAgIH0KCiAgICAvLyB9fX0KfQoKLyoKICogTG9jYWwgdmFyaWFibGVzOgogKiB0YWItd2lkdGg6IDQKICogYy1iYXNpYy1vZmZzZXQ6IDQKICogRW5kOgogKi8KCj8+Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/pear/DB/fbsql.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qIHZpbTogc2V0IGV4cGFuZHRhYiB0YWJzdG9wPTQgc2hpZnR3aWR0aD00IHNvZnR0YWJzdG9wPTQ6ICovCgovKioKICogVGhlIFBFQVIgREIgZHJpdmVyIGZvciBQSFAncyBmYnNxbCBleHRlbnNpb24KICogZm9yIGludGVyYWN0aW5nIHdpdGggRnJvbnRCYXNlIGRhdGFiYXNlcwogKgogKiBQSFAgdmVyc2lvbnMgNCBhbmQgNQogKgogKiBMSUNFTlNFOiBUaGlzIHNvdXJjZSBmaWxlIGlzIHN1YmplY3QgdG8gdmVyc2lvbiAzLjAgb2YgdGhlIFBIUCBsaWNlbnNlCiAqIHRoYXQgaXMgYXZhaWxhYmxlIHRocm91Z2ggdGhlIHdvcmxkLXdpZGUtd2ViIGF0IHRoZSBmb2xsb3dpbmcgVVJJOgogKiBodHRwOi8vd3d3LnBocC5uZXQvbGljZW5zZS8zXzAudHh0LiAgSWYgeW91IGRpZCBub3QgcmVjZWl2ZSBhIGNvcHkgb2YKICogdGhlIFBIUCBMaWNlbnNlIGFuZCBhcmUgdW5hYmxlIHRvIG9idGFpbiBpdCB0aHJvdWdoIHRoZSB3ZWIsIHBsZWFzZQogKiBzZW5kIGEgbm90ZSB0byBsaWNlbnNlQHBocC5uZXQgc28gd2UgY2FuIG1haWwgeW91IGEgY29weSBpbW1lZGlhdGVseS4KICoKICogQGNhdGVnb3J5ICAgRGF0YWJhc2UKICogQHBhY2thZ2UgICAgREIKICogQGF1dGhvciAgICAgRnJhbmsgTS4gS3JvbWFubiA8ZnJhbmtAZnJvbnRiYXNlLmNvbT4KICogQGF1dGhvciAgICAgRGFuaWVsIENvbnZpc3NvciA8ZGFuaWVsY0BwaHAubmV0PgogKiBAY29weXJpZ2h0ICAxOTk3LTIwMDUgVGhlIFBIUCBHcm91cAogKiBAbGljZW5zZSAgICBodHRwOi8vd3d3LnBocC5uZXQvbGljZW5zZS8zXzAudHh0ICBQSFAgTGljZW5zZSAzLjAKICogQHZlcnNpb24gICAgQ1ZTOiAkSWQ6IGZic3FsLnBocCx2IDEuODcgMjAwNy8wMy8yOCAwODowMjozNSBhaGFydmV5IEV4cCAkCiAqIEBsaW5rICAgICAgIGh0dHA6Ly9wZWFyLnBocC5uZXQvcGFja2FnZS9EQgogKi8KCi8qKgogKiBPYnRhaW4gdGhlIERCX2NvbW1vbiBjbGFzcyBzbyBpdCBjYW4gYmUgZXh0ZW5kZWQgZnJvbQogKi8KcmVxdWlyZV9vbmNlICdEQi9jb21tb24ucGhwJzsKCi8qKgogKiBUaGUgbWV0aG9kcyBQRUFSIERCIHVzZXMgdG8gaW50ZXJhY3Qgd2l0aCBQSFAncyBmYnNxbCBleHRlbnNpb24KICogZm9yIGludGVyYWN0aW5nIHdpdGggRnJvbnRCYXNlIGRhdGFiYXNlcwogKgogKiBUaGVzZSBtZXRob2RzIG92ZXJsb2FkIHRoZSBvbmVzIGRlY2xhcmVkIGluIERCX2NvbW1vbi4KICoKICogQGNhdGVnb3J5ICAgRGF0YWJhc2UKICogQHBhY2thZ2UgICAgREIKICogQGF1dGhvciAgICAgRnJhbmsgTS4gS3JvbWFubiA8ZnJhbmtAZnJvbnRiYXNlLmNvbT4KICogQGF1dGhvciAgICAgRGFuaWVsIENvbnZpc3NvciA8ZGFuaWVsY0BwaHAubmV0PgogKiBAY29weXJpZ2h0ICAxOTk3LTIwMDUgVGhlIFBIUCBHcm91cAogKiBAbGljZW5zZSAgICBodHRwOi8vd3d3LnBocC5uZXQvbGljZW5zZS8zXzAudHh0ICBQSFAgTGljZW5zZSAzLjAKICogQHZlcnNpb24gICAgUmVsZWFzZTogMS43LjEyCiAqIEBsaW5rICAgICAgIGh0dHA6Ly9wZWFyLnBocC5uZXQvcGFja2FnZS9EQgogKiBAc2luY2UgICAgICBDbGFzcyBmdW5jdGlvbmFsIHNpbmNlIFJlbGVhc2UgMS43LjAKICovCmNsYXNzIERCX2Zic3FsIGV4dGVuZHMgREJfY29tbW9uCnsKICAgIC8vIHt7eyBwcm9wZXJ0aWVzCgogICAgLyoqCiAgICAgKiBUaGUgREIgZHJpdmVyIHR5cGUgKG15c3FsLCBvY2k4LCBvZGJjLCBldGMuKQogICAgICogQHZhciBzdHJpbmcKICAgICAqLwogICAgdmFyICRwaHB0eXBlID0gJ2Zic3FsJzsKCiAgICAvKioKICAgICAqIFRoZSBkYXRhYmFzZSBzeW50YXggdmFyaWFudCB0byBiZSB1c2VkIChkYjIsIGFjY2VzcywgZXRjLiksIGlmIGFueQogICAgICogQHZhciBzdHJpbmcKICAgICAqLwogICAgdmFyICRkYnN5bnRheCA9ICdmYnNxbCc7CgogICAgLyoqCiAgICAgKiBUaGUgY2FwYWJpbGl0aWVzIG9mIHRoaXMgREIgaW1wbGVtZW50YXRpb24KICAgICAqCiAgICAgKiBUaGUgJ25ld19saW5rJyBlbGVtZW50IGNvbnRhaW5zIHRoZSBQSFAgdmVyc2lvbiB0aGF0IGZpcnN0IHByb3ZpZGVkCiAgICAgKiBuZXdfbGluayBzdXBwb3J0IGZvciB0aGlzIERCTVMuICBDb250YWlucyBmYWxzZSBpZiBpdCdzIHVuc3VwcG9ydGVkLgogICAgICoKICAgICAqIE1lYW5pbmcgb2YgdGhlICdsaW1pdCcgZWxlbWVudDoKICAgICAqICAgKyAnZW11bGF0ZScgPSBlbXVsYXRlIHdpdGggZmV0Y2ggcm93IGJ5IG51bWJlcgogICAgICogICArICdhbHRlcicgICA9IGFsdGVyIHRoZSBxdWVyeQogICAgICogICArIGZhbHNlICAgICA9IHNraXAgcm93cwogICAgICoKICAgICAqIEB2YXIgYXJyYXkKICAgICAqLwogICAgdmFyICRmZWF0dXJlcyA9IGFycmF5KAogICAgICAgICdsaW1pdCcgICAgICAgICA9PiAnYWx0ZXInLAogICAgICAgICduZXdfbGluaycgICAgICA9PiBmYWxzZSwKICAgICAgICAnbnVtcm93cycgICAgICAgPT4gdHJ1ZSwKICAgICAgICAncGNvbm5lY3QnICAgICAgPT4gdHJ1ZSwKICAgICAgICAncHJlcGFyZScgICAgICAgPT4gZmFsc2UsCiAgICAgICAgJ3NzbCcgICAgICAgICAgID0+IGZhbHNlLAogICAgICAgICd0cmFuc2FjdGlvbnMnICA9PiB0cnVlLAogICAgKTsKCiAgICAvKioKICAgICAqIEEgbWFwcGluZyBvZiBuYXRpdmUgZXJyb3IgY29kZXMgdG8gREIgZXJyb3IgY29kZXMKICAgICAqIEB2YXIgYXJyYXkKICAgICAqLwogICAgdmFyICRlcnJvcmNvZGVfbWFwID0gYXJyYXkoCiAgICAgICAgIDIyID0+IERCX0VSUk9SX1NZTlRBWCwKICAgICAgICAgODUgPT4gREJfRVJST1JfQUxSRUFEWV9FWElTVFMsCiAgICAgICAgMTA4ID0+IERCX0VSUk9SX1NZTlRBWCwKICAgICAgICAxMTYgPT4gREJfRVJST1JfTk9TVUNIVEFCTEUsCiAgICAgICAgMTI0ID0+IERCX0VSUk9SX1ZBTFVFX0NPVU5UX09OX1JPVywKICAgICAgICAyMTUgPT4gREJfRVJST1JfTk9TVUNIRklFTEQsCiAgICAgICAgMjE3ID0+IERCX0VSUk9SX0lOVkFMSURfTlVNQkVSLAogICAgICAgIDIyNiA9PiBEQl9FUlJPUl9OT1NVQ0hGSUVMRCwKICAgICAgICAyMzEgPT4gREJfRVJST1JfSU5WQUxJRCwKICAgICAgICAyMzkgPT4gREJfRVJST1JfVFJVTkNBVEVELAogICAgICAgIDI1MSA9PiBEQl9FUlJPUl9TWU5UQVgsCiAgICAgICAgMjY2ID0+IERCX0VSUk9SX05PVF9GT1VORCwKICAgICAgICAzNTcgPT4gREJfRVJST1JfQ09OU1RSQUlOVF9OT1RfTlVMTCwKICAgICAgICAzNTggPT4gREJfRVJST1JfQ09OU1RSQUlOVCwKICAgICAgICAzNjAgPT4gREJfRVJST1JfQ09OU1RSQUlOVCwKICAgICAgICAzNjEgPT4gREJfRVJST1JfQ09OU1RSQUlOVCwKICAgICk7CgogICAgLyoqCiAgICAgKiBUaGUgcmF3IGRhdGFiYXNlIGNvbm5lY3Rpb24gY3JlYXRlZCBieSBQSFAKICAgICAqIEB2YXIgcmVzb3VyY2UKICAgICAqLwogICAgdmFyICRjb25uZWN0aW9uOwoKICAgIC8qKgogICAgICogVGhlIERTTiBpbmZvcm1hdGlvbiBmb3IgY29ubmVjdGluZyB0byBhIGRhdGFiYXNlCiAgICAgKiBAdmFyIGFycmF5CiAgICAgKi8KICAgIHZhciAkZHNuID0gYXJyYXkoKTsKCgogICAgLy8gfX19CiAgICAvLyB7e3sgY29uc3RydWN0b3IKCiAgICAvKioKICAgICAqIFRoaXMgY29uc3RydWN0b3IgY2FsbHMgPGtiZD4kdGhpcy0+REJfY29tbW9uKCk8L2tiZD4KICAgICAqCiAgICAgKiBAcmV0dXJuIHZvaWQKICAgICAqLwogICAgZnVuY3Rpb24gREJfZmJzcWwoKQogICAgewogICAgICAgICR0aGlzLT5EQl9jb21tb24oKTsKICAgIH0KCiAgICAvLyB9fX0KICAgIC8vIHt7eyBjb25uZWN0KCkKCiAgICAvKioKICAgICAqIENvbm5lY3QgdG8gdGhlIGRhdGFiYXNlIHNlcnZlciwgbG9nIGluIGFuZCBvcGVuIHRoZSBkYXRhYmFzZQogICAgICoKICAgICAqIERvbid0IGNhbGwgdGhpcyBtZXRob2QgZGlyZWN0bHkuICBVc2UgREI6OmNvbm5lY3QoKSBpbnN0ZWFkLgogICAgICoKICAgICAqIEBwYXJhbSBhcnJheSAkZHNuICAgICAgICAgdGhlIGRhdGEgc291cmNlIG5hbWUKICAgICAqIEBwYXJhbSBib29sICAkcGVyc2lzdGVudCAgc2hvdWxkIHRoZSBjb25uZWN0aW9uIGJlIHBlcnNpc3RlbnQ/CiAgICAgKgogICAgICogQHJldHVybiBpbnQgIERCX09LIG9uIHN1Y2Nlc3MuIEEgREJfRXJyb3Igb2JqZWN0IG9uIGZhaWx1cmUuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGNvbm5lY3QoJGRzbiwgJHBlcnNpc3RlbnQgPSBmYWxzZSkKICAgIHsKICAgICAgICBpZiAoIVBFQVI6OmxvYWRFeHRlbnNpb24oJ2Zic3FsJykpIHsKICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5yYWlzZUVycm9yKERCX0VSUk9SX0VYVEVOU0lPTl9OT1RfRk9VTkQpOwogICAgICAgIH0KCiAgICAgICAgJHRoaXMtPmRzbiA9ICRkc247CiAgICAgICAgaWYgKCRkc25bJ2Ric3ludGF4J10pIHsKICAgICAgICAgICAgJHRoaXMtPmRic3ludGF4ID0gJGRzblsnZGJzeW50YXgnXTsKICAgICAgICB9CgogICAgICAgICRwYXJhbXMgPSBhcnJheSgKICAgICAgICAgICAgJGRzblsnaG9zdHNwZWMnXSA/ICRkc25bJ2hvc3RzcGVjJ10gOiAnbG9jYWxob3N0JywKICAgICAgICAgICAgJGRzblsndXNlcm5hbWUnXSA/ICRkc25bJ3VzZXJuYW1lJ10gOiBudWxsLAogICAgICAgICAgICAkZHNuWydwYXNzd29yZCddID8gJGRzblsncGFzc3dvcmQnXSA6IG51bGwsCiAgICAgICAgKTsKCiAgICAgICAgJGNvbm5lY3RfZnVuY3Rpb24gPSAkcGVyc2lzdGVudCA/ICdmYnNxbF9wY29ubmVjdCcgOiAnZmJzcWxfY29ubmVjdCc7CgogICAgICAgICRpbmkgPSBpbmlfZ2V0KCd0cmFja19lcnJvcnMnKTsKICAgICAgICAkcGhwX2Vycm9ybXNnID0gJyc7CiAgICAgICAgaWYgKCRpbmkpIHsKICAgICAgICAgICAgJHRoaXMtPmNvbm5lY3Rpb24gPSBAY2FsbF91c2VyX2Z1bmNfYXJyYXkoJGNvbm5lY3RfZnVuY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRwYXJhbXMpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIEBpbmlfc2V0KCd0cmFja19lcnJvcnMnLCAxKTsKICAgICAgICAgICAgJHRoaXMtPmNvbm5lY3Rpb24gPSBAY2FsbF91c2VyX2Z1bmNfYXJyYXkoJGNvbm5lY3RfZnVuY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRwYXJhbXMpOwogICAgICAgICAgICBAaW5pX3NldCgndHJhY2tfZXJyb3JzJywgJGluaSk7CiAgICAgICAgfQoKICAgICAgICBpZiAoISR0aGlzLT5jb25uZWN0aW9uKSB7CiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+cmFpc2VFcnJvcihEQl9FUlJPUl9DT05ORUNUX0ZBSUxFRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIG51bGwsIG51bGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcGhwX2Vycm9ybXNnKTsKICAgICAgICB9CgogICAgICAgIGlmICgkZHNuWydkYXRhYmFzZSddKSB7CiAgICAgICAgICAgIGlmICghQGZic3FsX3NlbGVjdF9kYigkZHNuWydkYXRhYmFzZSddLCAkdGhpcy0+Y29ubmVjdGlvbikpIHsKICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+ZmJzcWxSYWlzZUVycm9yKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiBEQl9PSzsKICAgIH0KCiAgICAvLyB9fX0KICAgIC8vIHt7eyBkaXNjb25uZWN0KCkKCiAgICAvKioKICAgICAqIERpc2Nvbm5lY3RzIGZyb20gdGhlIGRhdGFiYXNlIHNlcnZlcgogICAgICoKICAgICAqIEByZXR1cm4gYm9vbCAgVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlCiAgICAgKi8KICAgIGZ1bmN0aW9uIGRpc2Nvbm5lY3QoKQogICAgewogICAgICAgICRyZXQgPSBAZmJzcWxfY2xvc2UoJHRoaXMtPmNvbm5lY3Rpb24pOwogICAgICAgICR0aGlzLT5jb25uZWN0aW9uID0gbnVsbDsKICAgICAgICByZXR1cm4gJHJldDsKICAgIH0KCiAgICAvLyB9fX0KICAgIC8vIHt7eyBzaW1wbGVRdWVyeSgpCgogICAgLyoqCiAgICAgKiBTZW5kcyBhIHF1ZXJ5IHRvIHRoZSBkYXRhYmFzZSBzZXJ2ZXIKICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICB0aGUgU1FMIHF1ZXJ5IHN0cmluZwogICAgICoKICAgICAqIEByZXR1cm4gbWl4ZWQgICsgYSBQSFAgcmVzdWx0IHJlc3JvdWNlIGZvciBzdWNjZXNzZnVsIFNFTEVDVCBxdWVyaWVzCiAgICAgKiAgICAgICAgICAgICAgICArIHRoZSBEQl9PSyBjb25zdGFudCBmb3Igb3RoZXIgc3VjY2Vzc2Z1bCBxdWVyaWVzCiAgICAgKiAgICAgICAgICAgICAgICArIGEgREJfRXJyb3Igb2JqZWN0IG9uIGZhaWx1cmUKICAgICAqLwogICAgZnVuY3Rpb24gc2ltcGxlUXVlcnkoJHF1ZXJ5KQogICAgewogICAgICAgICR0aGlzLT5sYXN0X3F1ZXJ5ID0gJHF1ZXJ5OwogICAgICAgICRxdWVyeSA9ICR0aGlzLT5tb2RpZnlRdWVyeSgkcXVlcnkpOwogICAgICAgICRyZXN1bHQgPSBAZmJzcWxfcXVlcnkoIiRxdWVyeTsiLCAkdGhpcy0+Y29ubmVjdGlvbik7CiAgICAgICAgaWYgKCEkcmVzdWx0KSB7CiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+ZmJzcWxSYWlzZUVycm9yKCk7CiAgICAgICAgfQogICAgICAgIC8vIERldGVybWluZSB3aGljaCBxdWVyaWVzIHRoYXQgc2hvdWxkIHJldHVybiBkYXRhLCBhbmQgd2hpY2gKICAgICAgICAvLyBzaG91bGQgcmV0dXJuIGFuIGVycm9yIGNvZGUgb25seS4KICAgICAgICBpZiAoJHRoaXMtPl9jaGVja01hbmlwKCRxdWVyeSkpIHsKICAgICAgICAgICAgcmV0dXJuIERCX09LOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJHJlc3VsdDsKICAgIH0KCiAgICAvLyB9fX0KICAgIC8vIHt7eyBuZXh0UmVzdWx0KCkKCiAgICAvKioKICAgICAqIE1vdmUgdGhlIGludGVybmFsIGZic3FsIHJlc3VsdCBwb2ludGVyIHRvIHRoZSBuZXh0IGF2YWlsYWJsZSByZXN1bHQKICAgICAqCiAgICAgKiBAcGFyYW0gYSB2YWxpZCBmYnNxbCByZXN1bHQgcmVzb3VyY2UKICAgICAqCiAgICAgKiBAYWNjZXNzIHB1YmxpYwogICAgICoKICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBhIHJlc3VsdCBpcyBhdmFpbGFibGUgb3RoZXJ3aXNlIHJldHVybiBmYWxzZQogICAgICovCiAgICBmdW5jdGlvbiBuZXh0UmVzdWx0KCRyZXN1bHQpCiAgICB7CiAgICAgICAgcmV0dXJuIEBmYnNxbF9uZXh0X3Jlc3VsdCgkcmVzdWx0KTsKICAgIH0KCiAgICAvLyB9fX0KICAgIC8vIHt7eyBmZXRjaEludG8oKQoKICAgIC8qKgogICAgICogUGxhY2VzIGEgcm93IGZyb20gdGhlIHJlc3VsdCBzZXQgaW50byB0aGUgZ2l2ZW4gYXJyYXkKICAgICAqCiAgICAgKiBGb3JtYXRpbmcgb2YgdGhlIGFycmF5IGFuZCB0aGUgZGF0YSB0aGVyZWluIGFyZSBjb25maWd1cmFibGUuCiAgICAgKiBTZWUgREJfcmVzdWx0OjpmZXRjaEludG8oKSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KICAgICAqCiAgICAgKiBUaGlzIG1ldGhvZCBpcyBub3QgbWVhbnQgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LiAgVXNlCiAgICAgKiBEQl9yZXN1bHQ6OmZldGNoSW50bygpIGluc3RlYWQuICBJdCBjYW4ndCBiZSBkZWNsYXJlZCAicHJvdGVjdGVkIgogICAgICogYmVjYXVzZSBEQl9yZXN1bHQgaXMgYSBzZXBhcmF0ZSBvYmplY3QuCiAgICAgKgogICAgICogQHBhcmFtIHJlc291cmNlICRyZXN1bHQgICAgdGhlIHF1ZXJ5IHJlc3VsdCByZXNvdXJjZQogICAgICogQHBhcmFtIGFycmF5ICAgICRhcnIgICAgICAgdGhlIHJlZmVyZW5jZWQgYXJyYXkgdG8gcHV0IHRoZSBkYXRhIGluCiAgICAgKiBAcGFyYW0gaW50ICAgICAgJGZldGNobW9kZSBob3cgdGhlIHJlc3VsdGluZyBhcnJheSBzaG91bGQgYmUgaW5kZXhlZAogICAgICogQHBhcmFtIGludCAgICAgICRyb3dudW0gICAgdGhlIHJvdyBudW1iZXIgdG8gZmV0Y2ggKDAgPSBmaXJzdCByb3cpCiAgICAgKgogICAgICogQHJldHVybiBtaXhlZCAgREJfT0sgb24gc3VjY2VzcywgTlVMTCB3aGVuIHRoZSBlbmQgb2YgYSByZXN1bHQgc2V0IGlzCiAgICAgKiAgICAgICAgICAgICAgICAgcmVhY2hlZCBvciBvbiBmYWlsdXJlCiAgICAgKgogICAgICogQHNlZSBEQl9yZXN1bHQ6OmZldGNoSW50bygpCiAgICAgKi8KICAgIGZ1bmN0aW9uIGZldGNoSW50bygkcmVzdWx0LCAmJGFyciwgJGZldGNobW9kZSwgJHJvd251bSA9IG51bGwpCiAgICB7CiAgICAgICAgaWYgKCRyb3dudW0gIT09IG51bGwpIHsKICAgICAgICAgICAgaWYgKCFAZmJzcWxfZGF0YV9zZWVrKCRyZXN1bHQsICRyb3dudW0pKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoJGZldGNobW9kZSAmIERCX0ZFVENITU9ERV9BU1NPQykgewogICAgICAgICAgICAkYXJyID0gQGZic3FsX2ZldGNoX2FycmF5KCRyZXN1bHQsIEZCU1FMX0FTU09DKTsKICAgICAgICAgICAgaWYgKCR0aGlzLT5vcHRpb25zWydwb3J0YWJpbGl0eSddICYgREJfUE9SVEFCSUxJVFlfTE9XRVJDQVNFICYmICRhcnIpIHsKICAgICAgICAgICAgICAgICRhcnIgPSBhcnJheV9jaGFuZ2Vfa2V5X2Nhc2UoJGFyciwgQ0FTRV9MT1dFUik7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkYXJyID0gQGZic3FsX2ZldGNoX3JvdygkcmVzdWx0KTsKICAgICAgICB9CiAgICAgICAgaWYgKCEkYXJyKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICBpZiAoJHRoaXMtPm9wdGlvbnNbJ3BvcnRhYmlsaXR5J10gJiBEQl9QT1JUQUJJTElUWV9SVFJJTSkgewogICAgICAgICAgICAkdGhpcy0+X3J0cmltQXJyYXlWYWx1ZXMoJGFycik7CiAgICAgICAgfQogICAgICAgIGlmICgkdGhpcy0+b3B0aW9uc1sncG9ydGFiaWxpdHknXSAmIERCX1BPUlRBQklMSVRZX05VTExfVE9fRU1QVFkpIHsKICAgICAgICAgICAgJHRoaXMtPl9jb252ZXJ0TnVsbEFycmF5VmFsdWVzVG9FbXB0eSgkYXJyKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIERCX09LOwogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IGZyZWVSZXN1bHQoKQoKICAgIC8qKgogICAgICogRGVsZXRlcyB0aGUgcmVzdWx0IHNldCBhbmQgZnJlZXMgdGhlIG1lbW9yeSBvY2N1cGllZCBieSB0aGUgcmVzdWx0IHNldAogICAgICoKICAgICAqIFRoaXMgbWV0aG9kIGlzIG5vdCBtZWFudCB0byBiZSBjYWxsZWQgZGlyZWN0bHkuICBVc2UKICAgICAqIERCX3Jlc3VsdDo6ZnJlZSgpIGluc3RlYWQuICBJdCBjYW4ndCBiZSBkZWNsYXJlZCAicHJvdGVjdGVkIgogICAgICogYmVjYXVzZSBEQl9yZXN1bHQgaXMgYSBzZXBhcmF0ZSBvYmplY3QuCiAgICAgKgogICAgICogQHBhcmFtIHJlc291cmNlICRyZXN1bHQgIFBIUCdzIHF1ZXJ5IHJlc3VsdCByZXNvdXJjZQogICAgICoKICAgICAqIEByZXR1cm4gYm9vbCAgVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBpZiAkcmVzdWx0IGlzIGludmFsaWQKICAgICAqCiAgICAgKiBAc2VlIERCX3Jlc3VsdDo6ZnJlZSgpCiAgICAgKi8KICAgIGZ1bmN0aW9uIGZyZWVSZXN1bHQoJHJlc3VsdCkKICAgIHsKICAgICAgICByZXR1cm4gaXNfcmVzb3VyY2UoJHJlc3VsdCkgPyBmYnNxbF9mcmVlX3Jlc3VsdCgkcmVzdWx0KSA6IGZhbHNlOwogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IGF1dG9Db21taXQoKQoKICAgIC8qKgogICAgICogRW5hYmxlcyBvciBkaXNhYmxlcyBhdXRvbWF0aWMgY29tbWl0cwogICAgICoKICAgICAqIEBwYXJhbSBib29sICRvbm9mZiAgdHJ1ZSB0dXJucyBpdCBvbiwgZmFsc2UgdHVybnMgaXQgb2ZmCiAgICAgKgogICAgICogQHJldHVybiBpbnQgIERCX09LIG9uIHN1Y2Nlc3MuICBBIERCX0Vycm9yIG9iamVjdCBpZiB0aGUgZHJpdmVyCiAgICAgKiAgICAgICAgICAgICAgIGRvZXNuJ3Qgc3VwcG9ydCBhdXRvLWNvbW1pdHRpbmcgdHJhbnNhY3Rpb25zLgogICAgICovCiAgICBmdW5jdGlvbiBhdXRvQ29tbWl0KCRvbm9mZj1mYWxzZSkKICAgIHsKICAgICAgICBpZiAoJG9ub2ZmKSB7CiAgICAgICAgICAgICR0aGlzLT5xdWVyeSgiU0VUIENPTU1JVCBUUlVFIik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJHRoaXMtPnF1ZXJ5KCJTRVQgQ09NTUlUIEZBTFNFIik7CiAgICAgICAgfQogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IGNvbW1pdCgpCgogICAgLyoqCiAgICAgKiBDb21taXRzIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uCiAgICAgKgogICAgICogQHJldHVybiBpbnQgIERCX09LIG9uIHN1Y2Nlc3MuICBBIERCX0Vycm9yIG9iamVjdCBvbiBmYWlsdXJlLgogICAgICovCiAgICBmdW5jdGlvbiBjb21taXQoKQogICAgewogICAgICAgIEBmYnNxbF9jb21taXQoJHRoaXMtPmNvbm5lY3Rpb24pOwogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IHJvbGxiYWNrKCkKCiAgICAvKioKICAgICAqIFJldmVydHMgdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24KICAgICAqCiAgICAgKiBAcmV0dXJuIGludCAgREJfT0sgb24gc3VjY2Vzcy4gIEEgREJfRXJyb3Igb2JqZWN0IG9uIGZhaWx1cmUuCiAgICAgKi8KICAgIGZ1bmN0aW9uIHJvbGxiYWNrKCkKICAgIHsKICAgICAgICBAZmJzcWxfcm9sbGJhY2soJHRoaXMtPmNvbm5lY3Rpb24pOwogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IG51bUNvbHMoKQoKICAgIC8qKgogICAgICogR2V0cyB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgaW4gYSByZXN1bHQgc2V0CiAgICAgKgogICAgICogVGhpcyBtZXRob2QgaXMgbm90IG1lYW50IHRvIGJlIGNhbGxlZCBkaXJlY3RseS4gIFVzZQogICAgICogREJfcmVzdWx0OjpudW1Db2xzKCkgaW5zdGVhZC4gIEl0IGNhbid0IGJlIGRlY2xhcmVkICJwcm90ZWN0ZWQiCiAgICAgKiBiZWNhdXNlIERCX3Jlc3VsdCBpcyBhIHNlcGFyYXRlIG9iamVjdC4KICAgICAqCiAgICAgKiBAcGFyYW0gcmVzb3VyY2UgJHJlc3VsdCAgUEhQJ3MgcXVlcnkgcmVzdWx0IHJlc291cmNlCiAgICAgKgogICAgICogQHJldHVybiBpbnQgIHRoZSBudW1iZXIgb2YgY29sdW1ucy4gIEEgREJfRXJyb3Igb2JqZWN0IG9uIGZhaWx1cmUuCiAgICAgKgogICAgICogQHNlZSBEQl9yZXN1bHQ6Om51bUNvbHMoKQogICAgICovCiAgICBmdW5jdGlvbiBudW1Db2xzKCRyZXN1bHQpCiAgICB7CiAgICAgICAgJGNvbHMgPSBAZmJzcWxfbnVtX2ZpZWxkcygkcmVzdWx0KTsKICAgICAgICBpZiAoISRjb2xzKSB7CiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+ZmJzcWxSYWlzZUVycm9yKCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiAkY29sczsKICAgIH0KCiAgICAvLyB9fX0KICAgIC8vIHt7eyBudW1Sb3dzKCkKCiAgICAvKioKICAgICAqIEdldHMgdGhlIG51bWJlciBvZiByb3dzIGluIGEgcmVzdWx0IHNldAogICAgICoKICAgICAqIFRoaXMgbWV0aG9kIGlzIG5vdCBtZWFudCB0byBiZSBjYWxsZWQgZGlyZWN0bHkuICBVc2UKICAgICAqIERCX3Jlc3VsdDo6bnVtUm93cygpIGluc3RlYWQuICBJdCBjYW4ndCBiZSBkZWNsYXJlZCAicHJvdGVjdGVkIgogICAgICogYmVjYXVzZSBEQl9yZXN1bHQgaXMgYSBzZXBhcmF0ZSBvYmplY3QuCiAgICAgKgogICAgICogQHBhcmFtIHJlc291cmNlICRyZXN1bHQgIFBIUCdzIHF1ZXJ5IHJlc3VsdCByZXNvdXJjZQogICAgICoKICAgICAqIEByZXR1cm4gaW50ICB0aGUgbnVtYmVyIG9mIHJvd3MuICBBIERCX0Vycm9yIG9iamVjdCBvbiBmYWlsdXJlLgogICAgICoKICAgICAqIEBzZWUgREJfcmVzdWx0OjpudW1Sb3dzKCkKICAgICAqLwogICAgZnVuY3Rpb24gbnVtUm93cygkcmVzdWx0KQogICAgewogICAgICAgICRyb3dzID0gQGZic3FsX251bV9yb3dzKCRyZXN1bHQpOwogICAgICAgIGlmICgkcm93cyA9PT0gbnVsbCkgewogICAgICAgICAgICByZXR1cm4gJHRoaXMtPmZic3FsUmFpc2VFcnJvcigpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJHJvd3M7CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgYWZmZWN0ZWRSb3dzKCkKCiAgICAvKioKICAgICAqIERldGVybWluZXMgdGhlIG51bWJlciBvZiByb3dzIGFmZmVjdGVkIGJ5IGEgZGF0YSBtYW5pdXBsYXRpb24gcXVlcnkKICAgICAqCiAgICAgKiAwIGlzIHJldHVybmVkIGZvciBxdWVyaWVzIHRoYXQgZG9uJ3QgbWFuaXB1bGF0ZSBkYXRhLgogICAgICoKICAgICAqIEByZXR1cm4gaW50ICB0aGUgbnVtYmVyIG9mIHJvd3MuICBBIERCX0Vycm9yIG9iamVjdCBvbiBmYWlsdXJlLgogICAgICovCiAgICBmdW5jdGlvbiBhZmZlY3RlZFJvd3MoKQogICAgewogICAgICAgIGlmICgkdGhpcy0+X2xhc3RfcXVlcnlfbWFuaXApIHsKICAgICAgICAgICAgJHJlc3VsdCA9IEBmYnNxbF9hZmZlY3RlZF9yb3dzKCR0aGlzLT5jb25uZWN0aW9uKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkcmVzdWx0ID0gMDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICRyZXN1bHQ7CiAgICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IG5leHRJZCgpCgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBuZXh0IGZyZWUgaWQgaW4gYSBzZXF1ZW5jZQogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgICRzZXFfbmFtZSAgbmFtZSBvZiB0aGUgc2VxdWVuY2UKICAgICAqIEBwYXJhbSBib29sZWFuICRvbmRlbWFuZCAgd2hlbiB0cnVlLCB0aGUgc2VxZW5jZSBpcyBhdXRvbWF0aWNhbGx5CiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVkIGlmIGl0IGRvZXMgbm90IGV4aXN0CiAgICAgKgogICAgICogQHJldHVybiBpbnQgIHRoZSBuZXh0IGlkIG51bWJlciBpbiB0aGUgc2VxdWVuY2UuCiAgICAgKiAgICAgICAgICAgICAgIEEgREJfRXJyb3Igb2JqZWN0IG9uIGZhaWx1cmUuCiAgICAgKgogICAgICogQHNlZSBEQl9jb21tb246Om5leHRJRCgpLCBEQl9jb21tb246OmdldFNlcXVlbmNlTmFtZSgpLAogICAgICogICAgICBEQl9mYnNxbDo6Y3JlYXRlU2VxdWVuY2UoKSwgREJfZmJzcWw6OmRyb3BTZXF1ZW5jZSgpCiAgICAgKi8KICAgIGZ1bmN0aW9uIG5leHRJZCgkc2VxX25hbWUsICRvbmRlbWFuZCA9IHRydWUpCiAgICB7CiAgICAgICAgJHNlcW5hbWUgPSAkdGhpcy0+Z2V0U2VxdWVuY2VOYW1lKCRzZXFfbmFtZSk7CiAgICAgICAgZG8gewogICAgICAgICAgICAkcmVwZWF0ID0gMDsKICAgICAgICAgICAgJHRoaXMtPnB1c2hFcnJvckhhbmRsaW5nKFBFQVJfRVJST1JfUkVUVVJOKTsKICAgICAgICAgICAgJHJlc3VsdCA9ICR0aGlzLT5xdWVyeSgnU0VMRUNUIFVOSVFVRSBGUk9NICcgLiAkc2VxbmFtZSk7CiAgICAgICAgICAgICR0aGlzLT5wb3BFcnJvckhhbmRsaW5nKCk7CiAgICAgICAgICAgIGlmICgkb25kZW1hbmQgJiYgREI6OmlzRXJyb3IoJHJlc3VsdCkgJiYKICAgICAgICAgICAgICAgICRyZXN1bHQtPmdldENvZGUoKSA9PSBEQl9FUlJPUl9OT1NVQ0hUQUJMRSkgewogICAgICAgICAgICAgICAgJHJlcGVhdCA9IDE7CiAgICAgICAgICAgICAgICAkcmVzdWx0ID0gJHRoaXMtPmNyZWF0ZVNlcXVlbmNlKCRzZXFfbmFtZSk7CiAgICAgICAgICAgICAgICBpZiAoREI6OmlzRXJyb3IoJHJlc3VsdCkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHJlc3VsdDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICRyZXBlYXQgPSAwOwogICAgICAgICAgICB9CiAgICAgICAgfSB3aGlsZSAoJHJlcGVhdCk7CiAgICAgICAgaWYgKERCOjppc0Vycm9yKCRyZXN1bHQpKSB7CiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+ZmJzcWxSYWlzZUVycm9yKCk7CiAgICAgICAgfQogICAgICAgICRyZXN1bHQtPmZldGNoSW50bygkdG1wLCBEQl9GRVRDSE1PREVfT1JERVJFRCk7CiAgICAgICAgcmV0dXJuICR0bXBbMF07CiAgICB9CgogICAgLyoqCiAgICAgKiBDcmVhdGVzIGEgbmV3IHNlcXVlbmNlCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkc2VxX25hbWUgIG5hbWUgb2YgdGhlIG5ldyBzZXF1ZW5jZQogICAgICoKICAgICAqIEByZXR1cm4gaW50ICBEQl9PSyBvbiBzdWNjZXNzLiAgQSBEQl9FcnJvciBvYmplY3Qgb24gZmFpbHVyZS4KICAgICAqCiAgICAgKiBAc2VlIERCX2NvbW1vbjo6Y3JlYXRlU2VxdWVuY2UoKSwgREJfY29tbW9uOjpnZXRTZXF1ZW5jZU5hbWUoKSwKICAgICAqICAgICAgREJfZmJzcWw6Om5leHRJRCgpLCBEQl9mYnNxbDo6ZHJvcFNlcXVlbmNlKCkKICAgICAqLwogICAgZnVuY3Rpb24gY3JlYXRlU2VxdWVuY2UoJHNlcV9uYW1lKQogICAgewogICAgICAgICRzZXFuYW1lID0gJHRoaXMtPmdldFNlcXVlbmNlTmFtZSgkc2VxX25hbWUpOwogICAgICAgICRyZXMgPSAkdGhpcy0+cXVlcnkoJ0NSRUFURSBUQUJMRSAnIC4gJHNlcW5hbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJyAoaWQgSU5URUdFUiBOT1QgTlVMTCwnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICcgUFJJTUFSWSBLRVkoaWQpKScpOwogICAgICAgIGlmICgkcmVzKSB7CiAgICAgICAgICAgICRyZXMgPSAkdGhpcy0+cXVlcnkoJ1NFVCBVTklRVUUgPSAwIEZPUiAnIC4gJHNlcW5hbWUpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJHJlczsKICAgIH0KCiAgICAvLyB9fX0KICAgIC8vIHt7eyBkcm9wU2VxdWVuY2UoKQoKICAgIC8qKgogICAgICogRGVsZXRlcyBhIHNlcXVlbmNlCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkc2VxX25hbWUgIG5hbWUgb2YgdGhlIHNlcXVlbmNlIHRvIGJlIGRlbGV0ZWQKICAgICAqCiAgICAgKiBAcmV0dXJuIGludCAgREJfT0sgb24gc3VjY2Vzcy4gIEEgREJfRXJyb3Igb2JqZWN0IG9uIGZhaWx1cmUuCiAgICAgKgogICAgICogQHNlZSBEQl9jb21tb246OmRyb3BTZXF1ZW5jZSgpLCBEQl9jb21tb246OmdldFNlcXVlbmNlTmFtZSgpLAogICAgICogICAgICBEQl9mYnNxbDo6bmV4dElEKCksIERCX2Zic3FsOjpjcmVhdGVTZXF1ZW5jZSgpCiAgICAgKi8KICAgIGZ1bmN0aW9uIGRyb3BTZXF1ZW5jZSgkc2VxX25hbWUpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5xdWVyeSgnRFJPUCBUQUJMRSAnIC4gJHRoaXMtPmdldFNlcXVlbmNlTmFtZSgkc2VxX25hbWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICcgUkVTVFJJQ1QnKTsKICAgIH0KCiAgICAvLyB9fX0KICAgIC8vIHt7eyBtb2RpZnlMaW1pdFF1ZXJ5KCkKCiAgICAvKioKICAgICAqIEFkZHMgTElNSVQgY2xhdXNlcyB0byBhIHF1ZXJ5IHN0cmluZyBhY2NvcmRpbmcgdG8gY3VycmVudCBEQk1TIHN0YW5kYXJkcwogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgJHF1ZXJ5ICAgdGhlIHF1ZXJ5IHRvIG1vZGlmeQogICAgICogQHBhcmFtIGludCAgICAkZnJvbSAgICB0aGUgcm93IHRvIHN0YXJ0IHRvIGZldGNoaW5nICgwID0gdGhlIGZpcnN0IHJvdykKICAgICAqIEBwYXJhbSBpbnQgICAgJGNvdW50ICAgdGhlIG51bWJlcnMgb2Ygcm93cyB0byBmZXRjaAogICAgICogQHBhcmFtIG1peGVkICAkcGFyYW1zICBhcnJheSwgc3RyaW5nIG9yIG51bWVyaWMgZGF0YSB0byBiZSB1c2VkIGluCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRpb24gb2YgdGhlIHN0YXRlbWVudC4gIFF1YW50aXR5IG9mIGl0ZW1zCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgbXVzdCBtYXRjaCBxdWFudGl0eSBvZiBwbGFjZWhvbGRlcnMgaW4KICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5OiAgbWVhbmluZyAxIHBsYWNlaG9sZGVyIGZvciBub24tYXJyYXkKICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMgb3IgMSBwbGFjZWhvbGRlciBwZXIgYXJyYXkgZWxlbWVudC4KICAgICAqCiAgICAgKiBAcmV0dXJuIHN0cmluZyAgdGhlIHF1ZXJ5IHN0cmluZyB3aXRoIExJTUlUIGNsYXVzZXMgYWRkZWQKICAgICAqCiAgICAgKiBAYWNjZXNzIHByb3RlY3RlZAogICAgICovCiAgICBmdW5jdGlvbiBtb2RpZnlMaW1pdFF1ZXJ5KCRxdWVyeSwgJGZyb20sICRjb3VudCwgJHBhcmFtcyA9IGFycmF5KCkpCiAgICB7CiAgICAgICAgaWYgKERCOjppc01hbmlwKCRxdWVyeSkgfHwgJHRoaXMtPl9uZXh0X3F1ZXJ5X21hbmlwKSB7CiAgICAgICAgICAgIHJldHVybiBwcmVnX3JlcGxhY2UoJy9eKFtccyhdKSpTRUxFQ1QvaScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxcMVNFTEVDVCBUT1AoJGNvdW50KSIsICRxdWVyeSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIHByZWdfcmVwbGFjZSgnLyhbXHMoXSkqU0VMRUNUL2knLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcXDFTRUxFQ1QgVE9QKCRmcm9tLCAkY291bnQpIiwgJHF1ZXJ5KTsKICAgICAgICB9CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgcXVvdGVCb29sZWFuKCkKCiAgICAvKioKICAgICAqIEZvcm1hdHMgYSBib29sZWFuIHZhbHVlIGZvciB1c2Ugd2l0aGluIGEgcXVlcnkgaW4gYSBsb2NhbGUtaW5kZXBlbmRlbnQKICAgICAqIG1hbm5lci4KICAgICAqCiAgICAgKiBAcGFyYW0gYm9vbGVhbiB0aGUgYm9vbGVhbiB2YWx1ZSB0byBiZSBxdW90ZWQuCiAgICAgKiBAcmV0dXJuIHN0cmluZyB0aGUgcXVvdGVkIHN0cmluZy4KICAgICAqIEBzZWUgREJfY29tbW9uOjpxdW90ZVNtYXJ0KCkKICAgICAqIEBzaW5jZSBNZXRob2QgYXZhaWxhYmxlIHNpbmNlIHJlbGVhc2UgMS43LjguCiAgICAgKi8KICAgIGZ1bmN0aW9uIHF1b3RlQm9vbGVhbigkYm9vbGVhbikgewogICAgICAgIHJldHVybiAkYm9vbGVhbiA/ICdUUlVFJyA6ICdGQUxTRSc7CiAgICB9CiAgICAgCiAgICAvLyB9fX0KICAgIC8vIHt7eyBxdW90ZUZsb2F0KCkKCiAgICAvKioKICAgICAqIEZvcm1hdHMgYSBmbG9hdCB2YWx1ZSBmb3IgdXNlIHdpdGhpbiBhIHF1ZXJ5IGluIGEgbG9jYWxlLWluZGVwZW5kZW50CiAgICAgKiBtYW5uZXIuCiAgICAgKgogICAgICogQHBhcmFtIGZsb2F0IHRoZSBmbG9hdCB2YWx1ZSB0byBiZSBxdW90ZWQuCiAgICAgKiBAcmV0dXJuIHN0cmluZyB0aGUgcXVvdGVkIHN0cmluZy4KICAgICAqIEBzZWUgREJfY29tbW9uOjpxdW90ZVNtYXJ0KCkKICAgICAqIEBzaW5jZSBNZXRob2QgYXZhaWxhYmxlIHNpbmNlIHJlbGVhc2UgMS43LjguCiAgICAgKi8KICAgIGZ1bmN0aW9uIHF1b3RlRmxvYXQoJGZsb2F0KSB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5lc2NhcGVTaW1wbGUoc3RyX3JlcGxhY2UoJywnLCAnLicsIHN0cnZhbChmbG9hdHZhbCgkZmxvYXQpKSkpOwogICAgfQogICAgIAogICAgLy8gfX19CiAgICAvLyB7e3sgZmJzcWxSYWlzZUVycm9yKCkKCiAgICAvKioKICAgICAqIFByb2R1Y2VzIGEgREJfRXJyb3Igb2JqZWN0IHJlZ2FyZGluZyB0aGUgY3VycmVudCBwcm9ibGVtCiAgICAgKgogICAgICogQHBhcmFtIGludCAkZXJybm8gIGlmIHRoZSBlcnJvciBpcyBiZWluZyBtYW51YWxseSByYWlzZWQgcGFzcyBhCiAgICAgKiAgICAgICAgICAgICAgICAgICAgIERCX0VSUk9SKiBjb25zdGFudCBoZXJlLiAgSWYgdGhpcyBpc24ndCBwYXNzZWQKICAgICAqICAgICAgICAgICAgICAgICAgICAgdGhlIGVycm9yIGluZm9ybWF0aW9uIGdhdGhlcmVkIGZyb20gdGhlIERCTVMuCiAgICAgKgogICAgICogQHJldHVybiBvYmplY3QgIHRoZSBEQl9FcnJvciBvYmplY3QKICAgICAqCiAgICAgKiBAc2VlIERCX2NvbW1vbjo6cmFpc2VFcnJvcigpLAogICAgICogICAgICBEQl9mYnNxbDo6ZXJyb3JOYXRpdmUoKSwgREJfY29tbW9uOjplcnJvckNvZGUoKQogICAgICovCiAgICBmdW5jdGlvbiBmYnNxbFJhaXNlRXJyb3IoJGVycm5vID0gbnVsbCkKICAgIHsKICAgICAgICBpZiAoJGVycm5vID09PSBudWxsKSB7CiAgICAgICAgICAgICRlcnJubyA9ICR0aGlzLT5lcnJvckNvZGUoZmJzcWxfZXJybm8oJHRoaXMtPmNvbm5lY3Rpb24pKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICR0aGlzLT5yYWlzZUVycm9yKCRlcnJubywgbnVsbCwgbnVsbCwgbnVsbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGZic3FsX2Vycm9yKCR0aGlzLT5jb25uZWN0aW9uKSk7CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgZXJyb3JOYXRpdmUoKQoKICAgIC8qKgogICAgICogR2V0cyB0aGUgREJNUycgbmF0aXZlIGVycm9yIGNvZGUgcHJvZHVjZWQgYnkgdGhlIGxhc3QgcXVlcnkKICAgICAqCiAgICAgKiBAcmV0dXJuIGludCAgdGhlIERCTVMnIGVycm9yIGNvZGUKICAgICAqLwogICAgZnVuY3Rpb24gZXJyb3JOYXRpdmUoKQogICAgewogICAgICAgIHJldHVybiBAZmJzcWxfZXJybm8oJHRoaXMtPmNvbm5lY3Rpb24pOwogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IHRhYmxlSW5mbygpCgogICAgLyoqCiAgICAgKiBSZXR1cm5zIGluZm9ybWF0aW9uIGFib3V0IGEgdGFibGUgb3IgYSByZXN1bHQgc2V0CiAgICAgKgogICAgICogQHBhcmFtIG9iamVjdHxzdHJpbmcgICRyZXN1bHQgIERCX3Jlc3VsdCBvYmplY3QgZnJvbSBhIHF1ZXJ5IG9yIGEKICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIG5hbWUgb2YgYSB0YWJsZS4KICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2hpbGUgdGhpcyBhbHNvIGFjY2VwdHMgYSBxdWVyeSByZXN1bHQKICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2UgaWRlbnRpZmllciwgdGhpcyBiZWhhdmlvciBpcwogICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXByZWNhdGVkLgogICAgICogQHBhcmFtIGludCAgICAgICAgICAgICRtb2RlICAgIGEgdmFsaWQgdGFibGVJbmZvIG1vZGUKICAgICAqCiAgICAgKiBAcmV0dXJuIGFycmF5ICBhbiBhc3NvY2lhdGl2ZSBhcnJheSB3aXRoIHRoZSBpbmZvcm1hdGlvbiByZXF1ZXN0ZWQuCiAgICAgKiAgICAgICAgICAgICAgICAgQSBEQl9FcnJvciBvYmplY3Qgb24gZmFpbHVyZS4KICAgICAqCiAgICAgKiBAc2VlIERCX2NvbW1vbjo6dGFibGVJbmZvKCkKICAgICAqLwogICAgZnVuY3Rpb24gdGFibGVJbmZvKCRyZXN1bHQsICRtb2RlID0gbnVsbCkKICAgIHsKICAgICAgICBpZiAoaXNfc3RyaW5nKCRyZXN1bHQpKSB7CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIFByb2JhYmx5IHJlY2VpdmVkIGEgdGFibGUgbmFtZS4KICAgICAgICAgICAgICogQ3JlYXRlIGEgcmVzdWx0IHJlc291cmNlIGlkZW50aWZpZXIuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICAkaWQgPSBAZmJzcWxfbGlzdF9maWVsZHMoJHRoaXMtPmRzblsnZGF0YWJhc2UnXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRyZXN1bHQsICR0aGlzLT5jb25uZWN0aW9uKTsKICAgICAgICAgICAgJGdvdF9zdHJpbmcgPSB0cnVlOwogICAgICAgIH0gZWxzZWlmIChpc3NldCgkcmVzdWx0LT5yZXN1bHQpKSB7CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIFByb2JhYmx5IHJlY2VpdmVkIGEgcmVzdWx0IG9iamVjdC4KICAgICAgICAgICAgICogRXh0cmFjdCB0aGUgcmVzdWx0IHJlc291cmNlIGlkZW50aWZpZXIuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICAkaWQgPSAkcmVzdWx0LT5yZXN1bHQ7CiAgICAgICAgICAgICRnb3Rfc3RyaW5nID0gZmFsc2U7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogUHJvYmFibHkgcmVjZWl2ZWQgYSByZXN1bHQgcmVzb3VyY2UgaWRlbnRpZmllci4KICAgICAgICAgICAgICogQ29weSBpdC4KICAgICAgICAgICAgICogRGVwcmVjYXRlZC4gIEhlcmUgZm9yIGNvbXBhdGliaWxpdHkgb25seS4KICAgICAgICAgICAgICovCiAgICAgICAgICAgICRpZCA9ICRyZXN1bHQ7CiAgICAgICAgICAgICRnb3Rfc3RyaW5nID0gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICBpZiAoIWlzX3Jlc291cmNlKCRpZCkpIHsKICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5mYnNxbFJhaXNlRXJyb3IoREJfRVJST1JfTkVFRF9NT1JFX0RBVEEpOwogICAgICAgIH0KCiAgICAgICAgaWYgKCR0aGlzLT5vcHRpb25zWydwb3J0YWJpbGl0eSddICYgREJfUE9SVEFCSUxJVFlfTE9XRVJDQVNFKSB7CiAgICAgICAgICAgICRjYXNlX2Z1bmMgPSAnc3RydG9sb3dlcic7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJGNhc2VfZnVuYyA9ICdzdHJ2YWwnOwogICAgICAgIH0KCiAgICAgICAgJGNvdW50ID0gQGZic3FsX251bV9maWVsZHMoJGlkKTsKICAgICAgICAkcmVzICAgPSBhcnJheSgpOwoKICAgICAgICBpZiAoJG1vZGUpIHsKICAgICAgICAgICAgJHJlc1snbnVtX2ZpZWxkcyddID0gJGNvdW50OwogICAgICAgIH0KCiAgICAgICAgZm9yICgkaSA9IDA7ICRpIDwgJGNvdW50OyAkaSsrKSB7CiAgICAgICAgICAgICRyZXNbJGldID0gYXJyYXkoCiAgICAgICAgICAgICAgICAndGFibGUnID0+ICRjYXNlX2Z1bmMoQGZic3FsX2ZpZWxkX3RhYmxlKCRpZCwgJGkpKSwKICAgICAgICAgICAgICAgICduYW1lJyAgPT4gJGNhc2VfZnVuYyhAZmJzcWxfZmllbGRfbmFtZSgkaWQsICRpKSksCiAgICAgICAgICAgICAgICAndHlwZScgID0+IEBmYnNxbF9maWVsZF90eXBlKCRpZCwgJGkpLAogICAgICAgICAgICAgICAgJ2xlbicgICA9PiBAZmJzcWxfZmllbGRfbGVuKCRpZCwgJGkpLAogICAgICAgICAgICAgICAgJ2ZsYWdzJyA9PiBAZmJzcWxfZmllbGRfZmxhZ3MoJGlkLCAkaSksCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICgkbW9kZSAmIERCX1RBQkxFSU5GT19PUkRFUikgewogICAgICAgICAgICAgICAgJHJlc1snb3JkZXInXVskcmVzWyRpXVsnbmFtZSddXSA9ICRpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkbW9kZSAmIERCX1RBQkxFSU5GT19PUkRFUlRBQkxFKSB7CiAgICAgICAgICAgICAgICAkcmVzWydvcmRlcnRhYmxlJ11bJHJlc1skaV1bJ3RhYmxlJ11dWyRyZXNbJGldWyduYW1lJ11dID0gJGk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIGZyZWUgdGhlIHJlc3VsdCBvbmx5IGlmIHdlIHdlcmUgY2FsbGVkIG9uIGEgdGFibGUKICAgICAgICBpZiAoJGdvdF9zdHJpbmcpIHsKICAgICAgICAgICAgQGZic3FsX2ZyZWVfcmVzdWx0KCRpZCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiAkcmVzOwogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IGdldFNwZWNpYWxRdWVyeSgpCgogICAgLyoqCiAgICAgKiBPYnRhaW5zIHRoZSBxdWVyeSBzdHJpbmcgbmVlZGVkIGZvciBsaXN0aW5nIGEgZ2l2ZW4gdHlwZSBvZiBvYmplY3RzCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkdHlwZSAgdGhlIGtpbmQgb2Ygb2JqZWN0cyB5b3Ugd2FudCB0byByZXRyaWV2ZQogICAgICoKICAgICAqIEByZXR1cm4gc3RyaW5nICB0aGUgU1FMIHF1ZXJ5IHN0cmluZyBvciBudWxsIGlmIHRoZSBkcml2ZXIgZG9lc24ndAogICAgICogICAgICAgICAgICAgICAgICBzdXBwb3J0IHRoZSBvYmplY3QgdHlwZSByZXF1ZXN0ZWQKICAgICAqCiAgICAgKiBAYWNjZXNzIHByb3RlY3RlZAogICAgICogQHNlZSBEQl9jb21tb246OmdldExpc3RPZigpCiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldFNwZWNpYWxRdWVyeSgkdHlwZSkKICAgIHsKICAgICAgICBzd2l0Y2ggKCR0eXBlKSB7CiAgICAgICAgICAgIGNhc2UgJ3RhYmxlcyc6CiAgICAgICAgICAgICAgICByZXR1cm4gJ1NFTEVDVCAidGFibGVfbmFtZSIgRlJPTSBpbmZvcm1hdGlvbl9zY2hlbWEudGFibGVzJwogICAgICAgICAgICAgICAgICAgICAgIC4gJyB0MCwgaW5mb3JtYXRpb25fc2NoZW1hLnNjaGVtYXRhIHQxJwogICAgICAgICAgICAgICAgICAgICAgIC4gJyBXSEVSRSB0MC5zY2hlbWFfcGs9dDEuc2NoZW1hX3BrIEFORCcKICAgICAgICAgICAgICAgICAgICAgICAuICcgInRhYmxlX3R5cGUiID0gXCdCQVNFIFRBQkxFXCcnCiAgICAgICAgICAgICAgICAgICAgICAgLiAnIEFORCAic2NoZW1hX25hbWUiID0gY3VycmVudF9zY2hlbWEnOwogICAgICAgICAgICBjYXNlICd2aWV3cyc6CiAgICAgICAgICAgICAgICByZXR1cm4gJ1NFTEVDVCAidGFibGVfbmFtZSIgRlJPTSBpbmZvcm1hdGlvbl9zY2hlbWEudGFibGVzJwogICAgICAgICAgICAgICAgICAgICAgIC4gJyB0MCwgaW5mb3JtYXRpb25fc2NoZW1hLnNjaGVtYXRhIHQxJwogICAgICAgICAgICAgICAgICAgICAgIC4gJyBXSEVSRSB0MC5zY2hlbWFfcGs9dDEuc2NoZW1hX3BrIEFORCcKICAgICAgICAgICAgICAgICAgICAgICAuICcgInRhYmxlX3R5cGUiID0gXCdWSUVXXCcnCiAgICAgICAgICAgICAgICAgICAgICAgLiAnIEFORCAic2NoZW1hX25hbWUiID0gY3VycmVudF9zY2hlbWEnOwogICAgICAgICAgICBjYXNlICd1c2Vycyc6CiAgICAgICAgICAgICAgICByZXR1cm4gJ1NFTEVDVCAidXNlcl9uYW1lIiBmcm9tIGluZm9ybWF0aW9uX3NjaGVtYS51c2Vycyc7IAogICAgICAgICAgICBjYXNlICdmdW5jdGlvbnMnOgogICAgICAgICAgICAgICAgcmV0dXJuICdTRUxFQ1QgInJvdXRpbmVfbmFtZSIgRlJPTScKICAgICAgICAgICAgICAgICAgICAgICAuICcgaW5mb3JtYXRpb25fc2NoZW1hLnBzbV9yb3V0aW5lcycKICAgICAgICAgICAgICAgICAgICAgICAuICcgdDAsIGluZm9ybWF0aW9uX3NjaGVtYS5zY2hlbWF0YSB0MScKICAgICAgICAgICAgICAgICAgICAgICAuICcgV0hFUkUgdDAuc2NoZW1hX3BrPXQxLnNjaGVtYV9waycKICAgICAgICAgICAgICAgICAgICAgICAuICcgQU5EICJyb3V0aW5lX2tpbmQiPVwnRlVOQ1RJT05cJycKICAgICAgICAgICAgICAgICAgICAgICAuICcgQU5EICJzY2hlbWFfbmFtZSIgPSBjdXJyZW50X3NjaGVtYSc7CiAgICAgICAgICAgIGNhc2UgJ3Byb2NlZHVyZXMnOgogICAgICAgICAgICAgICAgcmV0dXJuICdTRUxFQ1QgInJvdXRpbmVfbmFtZSIgRlJPTScKICAgICAgICAgICAgICAgICAgICAgICAuICcgaW5mb3JtYXRpb25fc2NoZW1hLnBzbV9yb3V0aW5lcycKICAgICAgICAgICAgICAgICAgICAgICAuICcgdDAsIGluZm9ybWF0aW9uX3NjaGVtYS5zY2hlbWF0YSB0MScKICAgICAgICAgICAgICAgICAgICAgICAuICcgV0hFUkUgdDAuc2NoZW1hX3BrPXQxLnNjaGVtYV9waycKICAgICAgICAgICAgICAgICAgICAgICAuICcgQU5EICJyb3V0aW5lX2tpbmQiPVwnUFJPQ0VEVVJFXCcnCiAgICAgICAgICAgICAgICAgICAgICAgLiAnIEFORCAic2NoZW1hX25hbWUiID0gY3VycmVudF9zY2hlbWEnOwogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgfQoKICAgIC8vIH19fQp9CgovKgogKiBMb2NhbCB2YXJpYWJsZXM6CiAqIHRhYi13aWR0aDogNAogKiBjLWJhc2ljLW9mZnNldDogNAogKiBFbmQ6CiAqLwoKPz4K]]></data>
	</file>
	<file>
	  <filename>/lib/pear/DB/ibase.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qIHZpbTogc2V0IGV4cGFuZHRhYiB0YWJzdG9wPTQgc2hpZnR3aWR0aD00IHNvZnR0YWJzdG9wPTQ6ICovCgovKioKICogVGhlIFBFQVIgREIgZHJpdmVyIGZvciBQSFAncyBpbnRlcmJhc2UgZXh0ZW5zaW9uCiAqIGZvciBpbnRlcmFjdGluZyB3aXRoIEludGVyYmFzZSBhbmQgRmlyZWJpcmQgZGF0YWJhc2VzCiAqCiAqIFdoaWxlIHRoaXMgY2xhc3Mgd29ya3Mgd2l0aCBQSFAgNCwgUEhQJ3MgSW50ZXJCYXNlIGV4dGVuc2lvbiBpcwogKiB1bnN0YWJsZSBpbiBQSFAgNC4gIFVzZSBQSFAgNS4KICoKICogUEhQIHZlcnNpb25zIDQgYW5kIDUKICoKICogTElDRU5TRTogVGhpcyBzb3VyY2UgZmlsZSBpcyBzdWJqZWN0IHRvIHZlcnNpb24gMy4wIG9mIHRoZSBQSFAgbGljZW5zZQogKiB0aGF0IGlzIGF2YWlsYWJsZSB0aHJvdWdoIHRoZSB3b3JsZC13aWRlLXdlYiBhdCB0aGUgZm9sbG93aW5nIFVSSToKICogaHR0cDovL3d3dy5waHAubmV0L2xpY2Vuc2UvM18wLnR4dC4gIElmIHlvdSBkaWQgbm90IHJlY2VpdmUgYSBjb3B5IG9mCiAqIHRoZSBQSFAgTGljZW5zZSBhbmQgYXJlIHVuYWJsZSB0byBvYnRhaW4gaXQgdGhyb3VnaCB0aGUgd2ViLCBwbGVhc2UKICogc2VuZCBhIG5vdGUgdG8gbGljZW5zZUBwaHAubmV0IHNvIHdlIGNhbiBtYWlsIHlvdSBhIGNvcHkgaW1tZWRpYXRlbHkuCiAqCiAqIEBjYXRlZ29yeSAgIERhdGFiYXNlCiAqIEBwYWNrYWdlICAgIERCCiAqIEBhdXRob3IgICAgIFN0ZXJsaW5nIEh1Z2hlcyA8c3RlcmxpbmdAcGhwLm5ldD4KICogQGF1dGhvciAgICAgRGFuaWVsIENvbnZpc3NvciA8ZGFuaWVsY0BwaHAubmV0PgogKiBAY29weXJpZ2h0ICAxOTk3LTIwMDUgVGhlIFBIUCBHcm91cAogKiBAbGljZW5zZSAgICBodHRwOi8vd3d3LnBocC5uZXQvbGljZW5zZS8zXzAudHh0ICBQSFAgTGljZW5zZSAzLjAKICogQHZlcnNpb24gICAgQ1ZTOiAkSWQ6IGliYXNlLnBocCx2IDEuMTEzIDIwMDcvMDEvMTIgMDM6MTE6MTcgYWhhcnZleSBFeHAgJAogKiBAbGluayAgICAgICBodHRwOi8vcGVhci5waHAubmV0L3BhY2thZ2UvREIKICovCgovKioKICogT2J0YWluIHRoZSBEQl9jb21tb24gY2xhc3Mgc28gaXQgY2FuIGJlIGV4dGVuZGVkIGZyb20KICovCnJlcXVpcmVfb25jZSAnREIvY29tbW9uLnBocCc7CgovKioKICogVGhlIG1ldGhvZHMgUEVBUiBEQiB1c2VzIHRvIGludGVyYWN0IHdpdGggUEhQJ3MgaW50ZXJiYXNlIGV4dGVuc2lvbgogKiBmb3IgaW50ZXJhY3Rpbmcgd2l0aCBJbnRlcmJhc2UgYW5kIEZpcmViaXJkIGRhdGFiYXNlcwogKgogKiBUaGVzZSBtZXRob2RzIG92ZXJsb2FkIHRoZSBvbmVzIGRlY2xhcmVkIGluIERCX2NvbW1vbi4KICoKICogV2hpbGUgdGhpcyBjbGFzcyB3b3JrcyB3aXRoIFBIUCA0LCBQSFAncyBJbnRlckJhc2UgZXh0ZW5zaW9uIGlzCiAqIHVuc3RhYmxlIGluIFBIUCA0LiAgVXNlIFBIUCA1LgogKgogKiBOT1RJQ0U6ICBsaW1pdFF1ZXJ5KCkgb25seSB3b3JrcyBmb3IgRmlyZWJpcmQuCiAqCiAqIEBjYXRlZ29yeSAgIERhdGFiYXNlCiAqIEBwYWNrYWdlICAgIERCCiAqIEBhdXRob3IgICAgIFN0ZXJsaW5nIEh1Z2hlcyA8c3RlcmxpbmdAcGhwLm5ldD4KICogQGF1dGhvciAgICAgRGFuaWVsIENvbnZpc3NvciA8ZGFuaWVsY0BwaHAubmV0PgogKiBAY29weXJpZ2h0ICAxOTk3LTIwMDUgVGhlIFBIUCBHcm91cAogKiBAbGljZW5zZSAgICBodHRwOi8vd3d3LnBocC5uZXQvbGljZW5zZS8zXzAudHh0ICBQSFAgTGljZW5zZSAzLjAKICogQHZlcnNpb24gICAgUmVsZWFzZTogMS43LjEyCiAqIEBsaW5rICAgICAgIGh0dHA6Ly9wZWFyLnBocC5uZXQvcGFja2FnZS9EQgogKiBAc2luY2UgICAgICBDbGFzcyBiZWNhbWUgc3RhYmxlIGluIFJlbGVhc2UgMS43LjAKICovCmNsYXNzIERCX2liYXNlIGV4dGVuZHMgREJfY29tbW9uCnsKICAgIC8vIHt7eyBwcm9wZXJ0aWVzCgogICAgLyoqCiAgICAgKiBUaGUgREIgZHJpdmVyIHR5cGUgKG15c3FsLCBvY2k4LCBvZGJjLCBldGMuKQogICAgICogQHZhciBzdHJpbmcKICAgICAqLwogICAgdmFyICRwaHB0eXBlID0gJ2liYXNlJzsKCiAgICAvKioKICAgICAqIFRoZSBkYXRhYmFzZSBzeW50YXggdmFyaWFudCB0byBiZSB1c2VkIChkYjIsIGFjY2VzcywgZXRjLiksIGlmIGFueQogICAgICogQHZhciBzdHJpbmcKICAgICAqLwogICAgdmFyICRkYnN5bnRheCA9ICdpYmFzZSc7CgogICAgLyoqCiAgICAgKiBUaGUgY2FwYWJpbGl0aWVzIG9mIHRoaXMgREIgaW1wbGVtZW50YXRpb24KICAgICAqCiAgICAgKiBUaGUgJ25ld19saW5rJyBlbGVtZW50IGNvbnRhaW5zIHRoZSBQSFAgdmVyc2lvbiB0aGF0IGZpcnN0IHByb3ZpZGVkCiAgICAgKiBuZXdfbGluayBzdXBwb3J0IGZvciB0aGlzIERCTVMuICBDb250YWlucyBmYWxzZSBpZiBpdCdzIHVuc3VwcG9ydGVkLgogICAgICoKICAgICAqIE1lYW5pbmcgb2YgdGhlICdsaW1pdCcgZWxlbWVudDoKICAgICAqICAgKyAnZW11bGF0ZScgPSBlbXVsYXRlIHdpdGggZmV0Y2ggcm93IGJ5IG51bWJlcgogICAgICogICArICdhbHRlcicgICA9IGFsdGVyIHRoZSBxdWVyeQogICAgICogICArIGZhbHNlICAgICA9IHNraXAgcm93cwogICAgICoKICAgICAqIE5PVEU6IG9ubHkgZmlyZWJpcmQgc3VwcG9ydHMgbGltaXQuCiAgICAgKgogICAgICogQHZhciBhcnJheQogICAgICovCiAgICB2YXIgJGZlYXR1cmVzID0gYXJyYXkoCiAgICAgICAgJ2xpbWl0JyAgICAgICAgID0+IGZhbHNlLAogICAgICAgICduZXdfbGluaycgICAgICA9PiBmYWxzZSwKICAgICAgICAnbnVtcm93cycgICAgICAgPT4gJ2VtdWxhdGUnLAogICAgICAgICdwY29ubmVjdCcgICAgICA9PiB0cnVlLAogICAgICAgICdwcmVwYXJlJyAgICAgICA9PiB0cnVlLAogICAgICAgICdzc2wnICAgICAgICAgICA9PiBmYWxzZSwKICAgICAgICAndHJhbnNhY3Rpb25zJyAgPT4gdHJ1ZSwKICAgICk7CgogICAgLyoqCiAgICAgKiBBIG1hcHBpbmcgb2YgbmF0aXZlIGVycm9yIGNvZGVzIHRvIERCIGVycm9yIGNvZGVzCiAgICAgKiBAdmFyIGFycmF5CiAgICAgKi8KICAgIHZhciAkZXJyb3Jjb2RlX21hcCA9IGFycmF5KAogICAgICAgIC0xMDQgPT4gREJfRVJST1JfU1lOVEFYLAogICAgICAgIC0xNTAgPT4gREJfRVJST1JfQUNDRVNTX1ZJT0xBVElPTiwKICAgICAgICAtMTUxID0+IERCX0VSUk9SX0FDQ0VTU19WSU9MQVRJT04sCiAgICAgICAgLTE1NSA9PiBEQl9FUlJPUl9OT1NVQ0hUQUJMRSwKICAgICAgICAtMTU3ID0+IERCX0VSUk9SX05PU1VDSEZJRUxELAogICAgICAgIC0xNTggPT4gREJfRVJST1JfVkFMVUVfQ09VTlRfT05fUk9XLAogICAgICAgIC0xNzAgPT4gREJfRVJST1JfTUlTTUFUQ0gsCiAgICAgICAgLTE3MSA9PiBEQl9FUlJPUl9NSVNNQVRDSCwKICAgICAgICAtMTcyID0+IERCX0VSUk9SX0lOVkFMSUQsCiAgICAgICAgLy8gLTIwNCA9PiAgLy8gQ292ZXJzIHRvbyBtYW55IGVycm9ycywgbmVlZCB0byB1c2UgcmVnZXggb24gbXNnCiAgICAgICAgLTIwNSA9PiBEQl9FUlJPUl9OT1NVQ0hGSUVMRCwKICAgICAgICAtMjA2ID0+IERCX0VSUk9SX05PU1VDSEZJRUxELAogICAgICAgIC0yMDggPT4gREJfRVJST1JfSU5WQUxJRCwKICAgICAgICAtMjE5ID0+IERCX0VSUk9SX05PU1VDSFRBQkxFLAogICAgICAgIC0yOTcgPT4gREJfRVJST1JfQ09OU1RSQUlOVCwKICAgICAgICAtMzAzID0+IERCX0VSUk9SX0lOVkFMSUQsCiAgICAgICAgLTQxMyA9PiBEQl9FUlJPUl9JTlZBTElEX05VTUJFUiwKICAgICAgICAtNTMwID0+IERCX0VSUk9SX0NPTlNUUkFJTlQsCiAgICAgICAgLTU1MSA9PiBEQl9FUlJPUl9BQ0NFU1NfVklPTEFUSU9OLAogICAgICAgIC01NTIgPT4gREJfRVJST1JfQUNDRVNTX1ZJT0xBVElPTiwKICAgICAgICAvLyAtNjA3ID0+ICAvLyBDb3ZlcnMgdG9vIG1hbnkgZXJyb3JzLCBuZWVkIHRvIHVzZSByZWdleCBvbiBtc2cKICAgICAgICAtNjI1ID0+IERCX0VSUk9SX0NPTlNUUkFJTlRfTk9UX05VTEwsCiAgICAgICAgLTgwMyA9PiBEQl9FUlJPUl9DT05TVFJBSU5ULAogICAgICAgIC04MDQgPT4gREJfRVJST1JfVkFMVUVfQ09VTlRfT05fUk9XLAogICAgICAgIC8vIC05MDIgPT4gIC8vIENvdmVycyB0b28gbWFueSBlcnJvcnMsIG5lZWQgdG8gdXNlIHJlZ2V4IG9uIG1zZwogICAgICAgIC05MDQgPT4gREJfRVJST1JfQ09OTkVDVF9GQUlMRUQsCiAgICAgICAgLTkyMiA9PiBEQl9FUlJPUl9OT1NVQ0hEQiwKICAgICAgICAtOTIzID0+IERCX0VSUk9SX0NPTk5FQ1RfRkFJTEVELAogICAgICAgIC05MjQgPT4gREJfRVJST1JfQ09OTkVDVF9GQUlMRUQKICAgICk7CgogICAgLyoqCiAgICAgKiBUaGUgcmF3IGRhdGFiYXNlIGNvbm5lY3Rpb24gY3JlYXRlZCBieSBQSFAKICAgICAqIEB2YXIgcmVzb3VyY2UKICAgICAqLwogICAgdmFyICRjb25uZWN0aW9uOwoKICAgIC8qKgogICAgICogVGhlIERTTiBpbmZvcm1hdGlvbiBmb3IgY29ubmVjdGluZyB0byBhIGRhdGFiYXNlCiAgICAgKiBAdmFyIGFycmF5CiAgICAgKi8KICAgIHZhciAkZHNuID0gYXJyYXkoKTsKCgogICAgLyoqCiAgICAgKiBUaGUgbnVtYmVyIG9mIHJvd3MgYWZmZWN0ZWQgYnkgYSBkYXRhIG1hbmlwdWxhdGlvbiBxdWVyeQogICAgICogQHZhciBpbnRlZ2VyCiAgICAgKiBAYWNjZXNzIHByaXZhdGUKICAgICAqLwogICAgdmFyICRhZmZlY3RlZCA9IDA7CgogICAgLyoqCiAgICAgKiBTaG91bGQgZGF0YSBtYW5pcHVsYXRpb24gcXVlcmllcyBiZSBjb21taXR0ZWQgYXV0b21hdGljYWxseT8KICAgICAqIEB2YXIgYm9vbAogICAgICogQGFjY2VzcyBwcml2YXRlCiAgICAgKi8KICAgIHZhciAkYXV0b2NvbW1pdCA9IHRydWU7CgogICAgLyoqCiAgICAgKiBUaGUgcHJlcGFyZWQgc3RhdGVtZW50IGhhbmRsZSBmcm9tIHRoZSBtb3N0IHJlY2VudGx5IGV4ZWN1dGVkIHN0YXRlbWVudAogICAgICoKICAgICAqIHtAaW50ZXJuYWwgIE1haW5seSBoZXJlIGJlY2F1c2UgdGhlIEludGVyQmFzZS9GaXJlYmlyZCBBUEkgaXMgb25seQogICAgICogYWJsZSB0byByZXRyaWV2ZSBkYXRhIGZyb20gcmVzdWx0IHNldHMgaWYgdGhlIHN0YXRlbW50IGhhbmRsZSBpcwogICAgICogc3RpbGwgaW4gc2NvcGUufX0KICAgICAqCiAgICAgKiBAdmFyIHJlc291cmNlCiAgICAgKi8KICAgIHZhciAkbGFzdF9zdG10OwoKICAgIC8qKgogICAgICogSXMgdGhlIGdpdmVuIHByZXBhcmVkIHN0YXRlbWVudCBhIGRhdGEgbWFuaXB1bGF0aW9uIHF1ZXJ5PwogICAgICogQHZhciBhcnJheQogICAgICogQGFjY2VzcyBwcml2YXRlCiAgICAgKi8KICAgIHZhciAkbWFuaXBfcXVlcnkgPSBhcnJheSgpOwoKCiAgICAvLyB9fX0KICAgIC8vIHt7eyBjb25zdHJ1Y3RvcgoKICAgIC8qKgogICAgICogVGhpcyBjb25zdHJ1Y3RvciBjYWxscyA8a2JkPiR0aGlzLT5EQl9jb21tb24oKTwva2JkPgogICAgICoKICAgICAqIEByZXR1cm4gdm9pZAogICAgICovCiAgICBmdW5jdGlvbiBEQl9pYmFzZSgpCiAgICB7CiAgICAgICAgJHRoaXMtPkRCX2NvbW1vbigpOwogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IGNvbm5lY3QoKQoKICAgIC8qKgogICAgICogQ29ubmVjdCB0byB0aGUgZGF0YWJhc2Ugc2VydmVyLCBsb2cgaW4gYW5kIG9wZW4gdGhlIGRhdGFiYXNlCiAgICAgKgogICAgICogRG9uJ3QgY2FsbCB0aGlzIG1ldGhvZCBkaXJlY3RseS4gIFVzZSBEQjo6Y29ubmVjdCgpIGluc3RlYWQuCiAgICAgKgogICAgICogUEVBUiBEQidzIGliYXNlIGRyaXZlciBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIGV4dHJhIERTTiBvcHRpb25zOgogICAgICogICArIGJ1ZmZlcnMgICAgVGhlIG51bWJlciBvZiBkYXRhYmFzZSBidWZmZXJzIHRvIGFsbG9jYXRlIGZvciB0aGUKICAgICAqICAgICAgICAgICAgICAgICBzZXJ2ZXItc2lkZSBjYWNoZS4KICAgICAqICAgKyBjaGFyc2V0ICAgIFRoZSBkZWZhdWx0IGNoYXJhY3RlciBzZXQgZm9yIGEgZGF0YWJhc2UuCiAgICAgKiAgICsgZGlhbGVjdCAgICBUaGUgZGVmYXVsdCBTUUwgZGlhbGVjdCBmb3IgYW55IHN0YXRlbWVudAogICAgICogICAgICAgICAgICAgICAgIGV4ZWN1dGVkIHdpdGhpbiBhIGNvbm5lY3Rpb24uICBEZWZhdWx0cyB0byB0aGUKICAgICAqICAgICAgICAgICAgICAgICBoaWdoZXN0IG9uZSBzdXBwb3J0ZWQgYnkgY2xpZW50IGxpYnJhcmllcy4KICAgICAqICAgICAgICAgICAgICAgICBGdW5jdGlvbmFsIG9ubHkgd2l0aCBJbnRlckJhc2UgNiBhbmQgdXAuCiAgICAgKiAgICsgcm9sZSAgICAgICBGdW5jdGlvbmFsIG9ubHkgd2l0aCBJbnRlckJhc2UgNSBhbmQgdXAuCiAgICAgKgogICAgICogQHBhcmFtIGFycmF5ICRkc24gICAgICAgICB0aGUgZGF0YSBzb3VyY2UgbmFtZQogICAgICogQHBhcmFtIGJvb2wgICRwZXJzaXN0ZW50ICBzaG91bGQgdGhlIGNvbm5lY3Rpb24gYmUgcGVyc2lzdGVudD8KICAgICAqCiAgICAgKiBAcmV0dXJuIGludCAgREJfT0sgb24gc3VjY2Vzcy4gQSBEQl9FcnJvciBvYmplY3Qgb24gZmFpbHVyZS4KICAgICAqLwogICAgZnVuY3Rpb24gY29ubmVjdCgkZHNuLCAkcGVyc2lzdGVudCA9IGZhbHNlKQogICAgewogICAgICAgIGlmICghUEVBUjo6bG9hZEV4dGVuc2lvbignaW50ZXJiYXNlJykpIHsKICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5yYWlzZUVycm9yKERCX0VSUk9SX0VYVEVOU0lPTl9OT1RfRk9VTkQpOwogICAgICAgIH0KCiAgICAgICAgJHRoaXMtPmRzbiA9ICRkc247CiAgICAgICAgaWYgKCRkc25bJ2Ric3ludGF4J10pIHsKICAgICAgICAgICAgJHRoaXMtPmRic3ludGF4ID0gJGRzblsnZGJzeW50YXgnXTsKICAgICAgICB9CiAgICAgICAgaWYgKCR0aGlzLT5kYnN5bnRheCA9PSAnZmlyZWJpcmQnKSB7CiAgICAgICAgICAgICR0aGlzLT5mZWF0dXJlc1snbGltaXQnXSA9ICdhbHRlcic7CiAgICAgICAgfQoKICAgICAgICAkcGFyYW1zID0gYXJyYXkoCiAgICAgICAgICAgICRkc25bJ2hvc3RzcGVjJ10KICAgICAgICAgICAgICAgICAgICA/ICgkZHNuWydob3N0c3BlYyddIC4gJzonIC4gJGRzblsnZGF0YWJhc2UnXSkKICAgICAgICAgICAgICAgICAgICA6ICRkc25bJ2RhdGFiYXNlJ10sCiAgICAgICAgICAgICRkc25bJ3VzZXJuYW1lJ10gPyAkZHNuWyd1c2VybmFtZSddIDogbnVsbCwKICAgICAgICAgICAgJGRzblsncGFzc3dvcmQnXSA/ICRkc25bJ3Bhc3N3b3JkJ10gOiBudWxsLAogICAgICAgICAgICBpc3NldCgkZHNuWydjaGFyc2V0J10pID8gJGRzblsnY2hhcnNldCddIDogbnVsbCwKICAgICAgICAgICAgaXNzZXQoJGRzblsnYnVmZmVycyddKSA/ICRkc25bJ2J1ZmZlcnMnXSA6IG51bGwsCiAgICAgICAgICAgIGlzc2V0KCRkc25bJ2RpYWxlY3QnXSkgPyAkZHNuWydkaWFsZWN0J10gOiBudWxsLAogICAgICAgICAgICBpc3NldCgkZHNuWydyb2xlJ10pICAgID8gJGRzblsncm9sZSddIDogbnVsbCwKICAgICAgICApOwoKICAgICAgICAkY29ubmVjdF9mdW5jdGlvbiA9ICRwZXJzaXN0ZW50ID8gJ2liYXNlX3Bjb25uZWN0JyA6ICdpYmFzZV9jb25uZWN0JzsKCiAgICAgICAgJHRoaXMtPmNvbm5lY3Rpb24gPSBAY2FsbF91c2VyX2Z1bmNfYXJyYXkoJGNvbm5lY3RfZnVuY3Rpb24sICRwYXJhbXMpOwogICAgICAgIGlmICghJHRoaXMtPmNvbm5lY3Rpb24pIHsKICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5pYmFzZVJhaXNlRXJyb3IoREJfRVJST1JfQ09OTkVDVF9GQUlMRUQpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gREJfT0s7CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgZGlzY29ubmVjdCgpCgogICAgLyoqCiAgICAgKiBEaXNjb25uZWN0cyBmcm9tIHRoZSBkYXRhYmFzZSBzZXJ2ZXIKICAgICAqCiAgICAgKiBAcmV0dXJuIGJvb2wgIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZQogICAgICovCiAgICBmdW5jdGlvbiBkaXNjb25uZWN0KCkKICAgIHsKICAgICAgICAkcmV0ID0gQGliYXNlX2Nsb3NlKCR0aGlzLT5jb25uZWN0aW9uKTsKICAgICAgICAkdGhpcy0+Y29ubmVjdGlvbiA9IG51bGw7CiAgICAgICAgcmV0dXJuICRyZXQ7CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgc2ltcGxlUXVlcnkoKQoKICAgIC8qKgogICAgICogU2VuZHMgYSBxdWVyeSB0byB0aGUgZGF0YWJhc2Ugc2VydmVyCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAgdGhlIFNRTCBxdWVyeSBzdHJpbmcKICAgICAqCiAgICAgKiBAcmV0dXJuIG1peGVkICArIGEgUEhQIHJlc3VsdCByZXNyb3VjZSBmb3Igc3VjY2Vzc2Z1bCBTRUxFQ1QgcXVlcmllcwogICAgICogICAgICAgICAgICAgICAgKyB0aGUgREJfT0sgY29uc3RhbnQgZm9yIG90aGVyIHN1Y2Nlc3NmdWwgcXVlcmllcwogICAgICogICAgICAgICAgICAgICAgKyBhIERCX0Vycm9yIG9iamVjdCBvbiBmYWlsdXJlCiAgICAgKi8KICAgIGZ1bmN0aW9uIHNpbXBsZVF1ZXJ5KCRxdWVyeSkKICAgIHsKICAgICAgICAkaXNtYW5pcCA9ICR0aGlzLT5fY2hlY2tNYW5pcCgkcXVlcnkpOwogICAgICAgICR0aGlzLT5sYXN0X3F1ZXJ5ID0gJHF1ZXJ5OwogICAgICAgICRxdWVyeSA9ICR0aGlzLT5tb2RpZnlRdWVyeSgkcXVlcnkpOwogICAgICAgICRyZXN1bHQgPSBAaWJhc2VfcXVlcnkoJHRoaXMtPmNvbm5lY3Rpb24sICRxdWVyeSk7CgogICAgICAgIGlmICghJHJlc3VsdCkgewogICAgICAgICAgICByZXR1cm4gJHRoaXMtPmliYXNlUmFpc2VFcnJvcigpOwogICAgICAgIH0KICAgICAgICBpZiAoJHRoaXMtPmF1dG9jb21taXQgJiYgJGlzbWFuaXApIHsKICAgICAgICAgICAgQGliYXNlX2NvbW1pdCgkdGhpcy0+Y29ubmVjdGlvbik7CiAgICAgICAgfQogICAgICAgIGlmICgkaXNtYW5pcCkgewogICAgICAgICAgICAkdGhpcy0+YWZmZWN0ZWQgPSAkcmVzdWx0OwogICAgICAgICAgICByZXR1cm4gREJfT0s7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJHRoaXMtPmFmZmVjdGVkID0gMDsKICAgICAgICAgICAgcmV0dXJuICRyZXN1bHQ7CiAgICAgICAgfQogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IG1vZGlmeUxpbWl0UXVlcnkoKQoKICAgIC8qKgogICAgICogQWRkcyBMSU1JVCBjbGF1c2VzIHRvIGEgcXVlcnkgc3RyaW5nIGFjY29yZGluZyB0byBjdXJyZW50IERCTVMgc3RhbmRhcmRzCiAgICAgKgogICAgICogT25seSB3b3JrcyB3aXRoIEZpcmViaXJkLgogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgJHF1ZXJ5ICAgdGhlIHF1ZXJ5IHRvIG1vZGlmeQogICAgICogQHBhcmFtIGludCAgICAkZnJvbSAgICB0aGUgcm93IHRvIHN0YXJ0IHRvIGZldGNoaW5nICgwID0gdGhlIGZpcnN0IHJvdykKICAgICAqIEBwYXJhbSBpbnQgICAgJGNvdW50ICAgdGhlIG51bWJlcnMgb2Ygcm93cyB0byBmZXRjaAogICAgICogQHBhcmFtIG1peGVkICAkcGFyYW1zICBhcnJheSwgc3RyaW5nIG9yIG51bWVyaWMgZGF0YSB0byBiZSB1c2VkIGluCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRpb24gb2YgdGhlIHN0YXRlbWVudC4gIFF1YW50aXR5IG9mIGl0ZW1zCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgbXVzdCBtYXRjaCBxdWFudGl0eSBvZiBwbGFjZWhvbGRlcnMgaW4KICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5OiAgbWVhbmluZyAxIHBsYWNlaG9sZGVyIGZvciBub24tYXJyYXkKICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMgb3IgMSBwbGFjZWhvbGRlciBwZXIgYXJyYXkgZWxlbWVudC4KICAgICAqCiAgICAgKiBAcmV0dXJuIHN0cmluZyAgdGhlIHF1ZXJ5IHN0cmluZyB3aXRoIExJTUlUIGNsYXVzZXMgYWRkZWQKICAgICAqCiAgICAgKiBAYWNjZXNzIHByb3RlY3RlZAogICAgICovCiAgICBmdW5jdGlvbiBtb2RpZnlMaW1pdFF1ZXJ5KCRxdWVyeSwgJGZyb20sICRjb3VudCwgJHBhcmFtcyA9IGFycmF5KCkpCiAgICB7CiAgICAgICAgaWYgKCR0aGlzLT5kc25bJ2Ric3ludGF4J10gPT0gJ2ZpcmViaXJkJykgewogICAgICAgICAgICAkcXVlcnkgPSBwcmVnX3JlcGxhY2UoJy9eKFtccyhdKSpTRUxFQ1QvaScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU0VMRUNUIEZJUlNUICRjb3VudCBTS0lQICRmcm9tIiwgJHF1ZXJ5KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICRxdWVyeTsKICAgIH0KCiAgICAvLyB9fX0KICAgIC8vIHt7eyBuZXh0UmVzdWx0KCkKCiAgICAvKioKICAgICAqIE1vdmUgdGhlIGludGVybmFsIGliYXNlIHJlc3VsdCBwb2ludGVyIHRvIHRoZSBuZXh0IGF2YWlsYWJsZSByZXN1bHQKICAgICAqCiAgICAgKiBAcGFyYW0gYSB2YWxpZCBmYnNxbCByZXN1bHQgcmVzb3VyY2UKICAgICAqCiAgICAgKiBAYWNjZXNzIHB1YmxpYwogICAgICoKICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBhIHJlc3VsdCBpcyBhdmFpbGFibGUgb3RoZXJ3aXNlIHJldHVybiBmYWxzZQogICAgICovCiAgICBmdW5jdGlvbiBuZXh0UmVzdWx0KCRyZXN1bHQpCiAgICB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IGZldGNoSW50bygpCgogICAgLyoqCiAgICAgKiBQbGFjZXMgYSByb3cgZnJvbSB0aGUgcmVzdWx0IHNldCBpbnRvIHRoZSBnaXZlbiBhcnJheQogICAgICoKICAgICAqIEZvcm1hdGluZyBvZiB0aGUgYXJyYXkgYW5kIHRoZSBkYXRhIHRoZXJlaW4gYXJlIGNvbmZpZ3VyYWJsZS4KICAgICAqIFNlZSBEQl9yZXN1bHQ6OmZldGNoSW50bygpIGZvciBtb3JlIGluZm9ybWF0aW9uLgogICAgICoKICAgICAqIFRoaXMgbWV0aG9kIGlzIG5vdCBtZWFudCB0byBiZSBjYWxsZWQgZGlyZWN0bHkuICBVc2UKICAgICAqIERCX3Jlc3VsdDo6ZmV0Y2hJbnRvKCkgaW5zdGVhZC4gIEl0IGNhbid0IGJlIGRlY2xhcmVkICJwcm90ZWN0ZWQiCiAgICAgKiBiZWNhdXNlIERCX3Jlc3VsdCBpcyBhIHNlcGFyYXRlIG9iamVjdC4KICAgICAqCiAgICAgKiBAcGFyYW0gcmVzb3VyY2UgJHJlc3VsdCAgICB0aGUgcXVlcnkgcmVzdWx0IHJlc291cmNlCiAgICAgKiBAcGFyYW0gYXJyYXkgICAgJGFyciAgICAgICB0aGUgcmVmZXJlbmNlZCBhcnJheSB0byBwdXQgdGhlIGRhdGEgaW4KICAgICAqIEBwYXJhbSBpbnQgICAgICAkZmV0Y2htb2RlIGhvdyB0aGUgcmVzdWx0aW5nIGFycmF5IHNob3VsZCBiZSBpbmRleGVkCiAgICAgKiBAcGFyYW0gaW50ICAgICAgJHJvd251bSAgICB0aGUgcm93IG51bWJlciB0byBmZXRjaCAoMCA9IGZpcnN0IHJvdykKICAgICAqCiAgICAgKiBAcmV0dXJuIG1peGVkICBEQl9PSyBvbiBzdWNjZXNzLCBOVUxMIHdoZW4gdGhlIGVuZCBvZiBhIHJlc3VsdCBzZXQgaXMKICAgICAqICAgICAgICAgICAgICAgICByZWFjaGVkIG9yIG9uIGZhaWx1cmUKICAgICAqCiAgICAgKiBAc2VlIERCX3Jlc3VsdDo6ZmV0Y2hJbnRvKCkKICAgICAqLwogICAgZnVuY3Rpb24gZmV0Y2hJbnRvKCRyZXN1bHQsICYkYXJyLCAkZmV0Y2htb2RlLCAkcm93bnVtID0gbnVsbCkKICAgIHsKICAgICAgICBpZiAoJHJvd251bSAhPT0gbnVsbCkgewogICAgICAgICAgICByZXR1cm4gJHRoaXMtPmliYXNlUmFpc2VFcnJvcihEQl9FUlJPUl9OT1RfQ0FQQUJMRSk7CiAgICAgICAgfQogICAgICAgIGlmICgkZmV0Y2htb2RlICYgREJfRkVUQ0hNT0RFX0FTU09DKSB7CiAgICAgICAgICAgIGlmIChmdW5jdGlvbl9leGlzdHMoJ2liYXNlX2ZldGNoX2Fzc29jJykpIHsKICAgICAgICAgICAgICAgICRhcnIgPSBAaWJhc2VfZmV0Y2hfYXNzb2MoJHJlc3VsdCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkYXJyID0gZ2V0X29iamVjdF92YXJzKGliYXNlX2ZldGNoX29iamVjdCgkcmVzdWx0KSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCR0aGlzLT5vcHRpb25zWydwb3J0YWJpbGl0eSddICYgREJfUE9SVEFCSUxJVFlfTE9XRVJDQVNFICYmICRhcnIpIHsKICAgICAgICAgICAgICAgICRhcnIgPSBhcnJheV9jaGFuZ2Vfa2V5X2Nhc2UoJGFyciwgQ0FTRV9MT1dFUik7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkYXJyID0gQGliYXNlX2ZldGNoX3JvdygkcmVzdWx0KTsKICAgICAgICB9CiAgICAgICAgaWYgKCEkYXJyKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICBpZiAoJHRoaXMtPm9wdGlvbnNbJ3BvcnRhYmlsaXR5J10gJiBEQl9QT1JUQUJJTElUWV9SVFJJTSkgewogICAgICAgICAgICAkdGhpcy0+X3J0cmltQXJyYXlWYWx1ZXMoJGFycik7CiAgICAgICAgfQogICAgICAgIGlmICgkdGhpcy0+b3B0aW9uc1sncG9ydGFiaWxpdHknXSAmIERCX1BPUlRBQklMSVRZX05VTExfVE9fRU1QVFkpIHsKICAgICAgICAgICAgJHRoaXMtPl9jb252ZXJ0TnVsbEFycmF5VmFsdWVzVG9FbXB0eSgkYXJyKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIERCX09LOwogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IGZyZWVSZXN1bHQoKQoKICAgIC8qKgogICAgICogRGVsZXRlcyB0aGUgcmVzdWx0IHNldCBhbmQgZnJlZXMgdGhlIG1lbW9yeSBvY2N1cGllZCBieSB0aGUgcmVzdWx0IHNldAogICAgICoKICAgICAqIFRoaXMgbWV0aG9kIGlzIG5vdCBtZWFudCB0byBiZSBjYWxsZWQgZGlyZWN0bHkuICBVc2UKICAgICAqIERCX3Jlc3VsdDo6ZnJlZSgpIGluc3RlYWQuICBJdCBjYW4ndCBiZSBkZWNsYXJlZCAicHJvdGVjdGVkIgogICAgICogYmVjYXVzZSBEQl9yZXN1bHQgaXMgYSBzZXBhcmF0ZSBvYmplY3QuCiAgICAgKgogICAgICogQHBhcmFtIHJlc291cmNlICRyZXN1bHQgIFBIUCdzIHF1ZXJ5IHJlc3VsdCByZXNvdXJjZQogICAgICoKICAgICAqIEByZXR1cm4gYm9vbCAgVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBpZiAkcmVzdWx0IGlzIGludmFsaWQKICAgICAqCiAgICAgKiBAc2VlIERCX3Jlc3VsdDo6ZnJlZSgpCiAgICAgKi8KICAgIGZ1bmN0aW9uIGZyZWVSZXN1bHQoJHJlc3VsdCkKICAgIHsKICAgICAgICByZXR1cm4gaXNfcmVzb3VyY2UoJHJlc3VsdCkgPyBpYmFzZV9mcmVlX3Jlc3VsdCgkcmVzdWx0KSA6IGZhbHNlOwogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IGZyZWVRdWVyeSgpCgogICAgZnVuY3Rpb24gZnJlZVF1ZXJ5KCRxdWVyeSkKICAgIHsKICAgICAgICByZXR1cm4gaXNfcmVzb3VyY2UoJHF1ZXJ5KSA/IGliYXNlX2ZyZWVfcXVlcnkoJHF1ZXJ5KSA6IGZhbHNlOwogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IGFmZmVjdGVkUm93cygpCgogICAgLyoqCiAgICAgKiBEZXRlcm1pbmVzIHRoZSBudW1iZXIgb2Ygcm93cyBhZmZlY3RlZCBieSBhIGRhdGEgbWFuaXVwbGF0aW9uIHF1ZXJ5CiAgICAgKgogICAgICogMCBpcyByZXR1cm5lZCBmb3IgcXVlcmllcyB0aGF0IGRvbid0IG1hbmlwdWxhdGUgZGF0YS4KICAgICAqCiAgICAgKiBAcmV0dXJuIGludCAgdGhlIG51bWJlciBvZiByb3dzLiAgQSBEQl9FcnJvciBvYmplY3Qgb24gZmFpbHVyZS4KICAgICAqLwogICAgZnVuY3Rpb24gYWZmZWN0ZWRSb3dzKCkKICAgIHsKICAgICAgICBpZiAoaXNfaW50ZWdlcigkdGhpcy0+YWZmZWN0ZWQpKSB7CiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+YWZmZWN0ZWQ7CiAgICAgICAgfQogICAgICAgIHJldHVybiAkdGhpcy0+aWJhc2VSYWlzZUVycm9yKERCX0VSUk9SX05PVF9DQVBBQkxFKTsKICAgIH0KCiAgICAvLyB9fX0KICAgIC8vIHt7eyBudW1Db2xzKCkKCiAgICAvKioKICAgICAqIEdldHMgdGhlIG51bWJlciBvZiBjb2x1bW5zIGluIGEgcmVzdWx0IHNldAogICAgICoKICAgICAqIFRoaXMgbWV0aG9kIGlzIG5vdCBtZWFudCB0byBiZSBjYWxsZWQgZGlyZWN0bHkuICBVc2UKICAgICAqIERCX3Jlc3VsdDo6bnVtQ29scygpIGluc3RlYWQuICBJdCBjYW4ndCBiZSBkZWNsYXJlZCAicHJvdGVjdGVkIgogICAgICogYmVjYXVzZSBEQl9yZXN1bHQgaXMgYSBzZXBhcmF0ZSBvYmplY3QuCiAgICAgKgogICAgICogQHBhcmFtIHJlc291cmNlICRyZXN1bHQgIFBIUCdzIHF1ZXJ5IHJlc3VsdCByZXNvdXJjZQogICAgICoKICAgICAqIEByZXR1cm4gaW50ICB0aGUgbnVtYmVyIG9mIGNvbHVtbnMuICBBIERCX0Vycm9yIG9iamVjdCBvbiBmYWlsdXJlLgogICAgICoKICAgICAqIEBzZWUgREJfcmVzdWx0OjpudW1Db2xzKCkKICAgICAqLwogICAgZnVuY3Rpb24gbnVtQ29scygkcmVzdWx0KQogICAgewogICAgICAgICRjb2xzID0gQGliYXNlX251bV9maWVsZHMoJHJlc3VsdCk7CiAgICAgICAgaWYgKCEkY29scykgewogICAgICAgICAgICByZXR1cm4gJHRoaXMtPmliYXNlUmFpc2VFcnJvcigpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJGNvbHM7CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgcHJlcGFyZSgpCgogICAgLyoqCiAgICAgKiBQcmVwYXJlcyBhIHF1ZXJ5IGZvciBtdWx0aXBsZSBleGVjdXRpb24gd2l0aCBleGVjdXRlKCkuCiAgICAgKgogICAgICogcHJlcGFyZSgpIHJlcXVpcmVzIGEgZ2VuZXJpYyBxdWVyeSBhcyBzdHJpbmcgbGlrZSA8Y29kZT4KICAgICAqICAgIElOU0VSVCBJTlRPIG51bWJlcnMgVkFMVUVTICg/LCA/LCA/KQogICAgICogPC9jb2RlPi4gIFRoZSA8a2JkPj88L2tiZD4gY2hhcmFjdGVycyBhcmUgcGxhY2Vob2xkZXJzLgogICAgICoKICAgICAqIFRocmVlIHR5cGVzIG9mIHBsYWNlaG9sZGVycyBjYW4gYmUgdXNlZDoKICAgICAqICAgKyA8a2JkPj88L2tiZD4gIGEgcXVvdGVkIHNjYWxhciB2YWx1ZSwgaS5lLiBzdHJpbmdzLCBpbnRlZ2VycwogICAgICogICArIDxrYmQ+ITwva2JkPiAgdmFsdWUgaXMgaW5zZXJ0ZWQgJ2FzIGlzJwogICAgICogICArIDxrYmQ+Jjwva2JkPiAgcmVxdWlyZXMgYSBmaWxlIG5hbWUuICBUaGUgZmlsZSdzIGNvbnRlbnRzIGdldAogICAgICogICAgICAgICAgICAgICAgICAgICBpbnNlcnRlZCBpbnRvIHRoZSBxdWVyeSAoaS5lLiBzYXZpbmcgYmluYXJ5CiAgICAgKiAgICAgICAgICAgICAgICAgICAgIGRhdGEgaW4gYSBkYikKICAgICAqCiAgICAgKiBVc2UgYmFja3NsYXNoZXMgdG8gZXNjYXBlIHBsYWNlaG9sZGVyIGNoYXJhY3RlcnMgaWYgeW91IGRvbid0IHdhbnQKICAgICAqIHRoZW0gdG8gYmUgaW50ZXJwcmV0ZWQgYXMgcGxhY2Vob2xkZXJzLiAgRXhhbXBsZTogPGNvZGU+CiAgICAgKiAgICAiVVBEQVRFIGZvbyBTRVQgY29sPT8gV0hFUkUgY29sPSdvdmVyIFwmIHVuZGVyJyIKICAgICAqIDwvY29kZT4KICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICRxdWVyeSBxdWVyeSB0byBiZSBwcmVwYXJlZAogICAgICogQHJldHVybiBtaXhlZCBEQiBzdGF0ZW1lbnQgcmVzb3VyY2Ugb24gc3VjY2Vzcy4gREJfRXJyb3Igb24gZmFpbHVyZS4KICAgICAqLwogICAgZnVuY3Rpb24gcHJlcGFyZSgkcXVlcnkpCiAgICB7CiAgICAgICAgJHRva2VucyAgID0gcHJlZ19zcGxpdCgnLygoPzwhXFxcKVsmPyFdKS8nLCAkcXVlcnksIC0xLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJFR19TUExJVF9ERUxJTV9DQVBUVVJFKTsKICAgICAgICAkdG9rZW4gICAgPSAwOwogICAgICAgICR0eXBlcyAgICA9IGFycmF5KCk7CiAgICAgICAgJG5ld3F1ZXJ5ID0gJyc7CgogICAgICAgIGZvcmVhY2ggKCR0b2tlbnMgYXMgJGtleSA9PiAkdmFsKSB7CiAgICAgICAgICAgIHN3aXRjaCAoJHZhbCkgewogICAgICAgICAgICAgICAgY2FzZSAnPyc6CiAgICAgICAgICAgICAgICAgICAgJHR5cGVzWyR0b2tlbisrXSA9IERCX1BBUkFNX1NDQUxBUjsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJyYnOgogICAgICAgICAgICAgICAgICAgICR0eXBlc1skdG9rZW4rK10gPSBEQl9QQVJBTV9PUEFRVUU7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICchJzoKICAgICAgICAgICAgICAgICAgICAkdHlwZXNbJHRva2VuKytdID0gREJfUEFSQU1fTUlTQzsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgJHRva2Vuc1ska2V5XSA9IHByZWdfcmVwbGFjZSgnL1xcXChbJj8hXSkvJywgIlxcMSIsICR2YWwpOwogICAgICAgICAgICAgICAgICAgICRuZXdxdWVyeSAuPSAkdG9rZW5zWyRrZXldIC4gJz8nOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkbmV3cXVlcnkgPSBzdWJzdHIoJG5ld3F1ZXJ5LCAwLCAtMSk7CiAgICAgICAgJHRoaXMtPmxhc3RfcXVlcnkgPSAkcXVlcnk7CiAgICAgICAgJG5ld3F1ZXJ5ID0gJHRoaXMtPm1vZGlmeVF1ZXJ5KCRuZXdxdWVyeSk7CiAgICAgICAgJHN0bXQgPSBAaWJhc2VfcHJlcGFyZSgkdGhpcy0+Y29ubmVjdGlvbiwgJG5ld3F1ZXJ5KTsKCiAgICAgICAgaWYgKCRzdG10ID09PSBmYWxzZSkgewogICAgICAgICAgICAkc3RtdCA9ICR0aGlzLT5pYmFzZVJhaXNlRXJyb3IoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkdGhpcy0+cHJlcGFyZV90eXBlc1soaW50KSRzdG10XSA9ICR0eXBlczsKICAgICAgICAgICAgJHRoaXMtPm1hbmlwX3F1ZXJ5WyhpbnQpJHN0bXRdICAgPSBEQjo6aXNNYW5pcCgkcXVlcnkpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRzdG10OwogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IGV4ZWN1dGUoKQoKICAgIC8qKgogICAgICogRXhlY3V0ZXMgYSBEQiBzdGF0ZW1lbnQgcHJlcGFyZWQgd2l0aCBwcmVwYXJlKCkuCiAgICAgKgogICAgICogQHBhcmFtIHJlc291cmNlICAkc3RtdCAgYSBEQiBzdGF0ZW1lbnQgcmVzb3VyY2UgcmV0dXJuZWQgZnJvbSBwcmVwYXJlKCkKICAgICAqIEBwYXJhbSBtaXhlZCAgJGRhdGEgIGFycmF5LCBzdHJpbmcgb3IgbnVtZXJpYyBkYXRhIHRvIGJlIHVzZWQgaW4KICAgICAqICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGlvbiBvZiB0aGUgc3RhdGVtZW50LiAgUXVhbnRpdHkgb2YgaXRlbXMKICAgICAqICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCBtdXN0IG1hdGNoIHF1YW50aXR5IG9mIHBsYWNlaG9sZGVycyBpbgogICAgICogICAgICAgICAgICAgICAgICAgICAgcXVlcnk6ICBtZWFuaW5nIDEgZm9yIG5vbi1hcnJheSBpdGVtcyBvciB0aGUKICAgICAqICAgICAgICAgICAgICAgICAgICAgIHF1YW50aXR5IG9mIGVsZW1lbnRzIGluIHRoZSBhcnJheS4KICAgICAqIEByZXR1cm4gb2JqZWN0ICBhIG5ldyBEQl9SZXN1bHQgb3IgYSBEQl9FcnJvciB3aGVuIGZhaWwKICAgICAqIEBzZWUgREJfaWJhc2U6OnByZXBhcmUoKQogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqLwogICAgZnVuY3Rpb24gJmV4ZWN1dGUoJHN0bXQsICRkYXRhID0gYXJyYXkoKSkKICAgIHsKICAgICAgICAkZGF0YSA9IChhcnJheSkkZGF0YTsKICAgICAgICAkdGhpcy0+bGFzdF9wYXJhbWV0ZXJzID0gJGRhdGE7CgogICAgICAgICR0eXBlcyA9JiAkdGhpcy0+cHJlcGFyZV90eXBlc1soaW50KSRzdG10XTsKICAgICAgICBpZiAoY291bnQoJHR5cGVzKSAhPSBjb3VudCgkZGF0YSkpIHsKICAgICAgICAgICAgJHRtcCA9JiAkdGhpcy0+cmFpc2VFcnJvcihEQl9FUlJPUl9NSVNNQVRDSCk7CiAgICAgICAgICAgIHJldHVybiAkdG1wOwogICAgICAgIH0KCiAgICAgICAgJGkgPSAwOwogICAgICAgIGZvcmVhY2ggKCRkYXRhIGFzICRrZXkgPT4gJHZhbHVlKSB7CiAgICAgICAgICAgIGlmICgkdHlwZXNbJGldID09IERCX1BBUkFNX01JU0MpIHsKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiBpYmFzZSBkb2Vzbid0IHNlZW0gdG8gaGF2ZSB0aGUgYWJpbGl0eSB0byBwYXNzIGEKICAgICAgICAgICAgICAgICAqIHBhcmFtZXRlciBhbG9uZyB1bmNoYW5nZWQsIHNvIHN0cmlwIG9mZiBxdW90ZXMgZnJvbSBzdGFydAogICAgICAgICAgICAgICAgICogYW5kIGVuZCwgcGx1cyB0dXJuIHR3byBzaW5nbGUgcXVvdGVzIHRvIG9uZSBzaW5nbGUgcXVvdGUsCiAgICAgICAgICAgICAgICAgKiBpbiBvcmRlciB0byBhdm9pZCB0aGUgcXVvdGVzIGdldHRpbmcgZXNjYXBlZCBieQogICAgICAgICAgICAgICAgICogaWJhc2UgYW5kIGVuZGluZyB1cCBpbiB0aGUgZGF0YWJhc2UuCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICRkYXRhWyRrZXldID0gcHJlZ19yZXBsYWNlKCIvXicoLiopJyQvIiwgIlxcMSIsICRkYXRhWyRrZXldKTsKICAgICAgICAgICAgICAgICRkYXRhWyRrZXldID0gc3RyX3JlcGxhY2UoIicnIiwgIiciLCAkZGF0YVska2V5XSk7CiAgICAgICAgICAgIH0gZWxzZWlmICgkdHlwZXNbJGldID09IERCX1BBUkFNX09QQVFVRSkgewogICAgICAgICAgICAgICAgJGZwID0gQGZvcGVuKCRkYXRhWyRrZXldLCAncmInKTsKICAgICAgICAgICAgICAgIGlmICghJGZwKSB7CiAgICAgICAgICAgICAgICAgICAgJHRtcCA9JiAkdGhpcy0+cmFpc2VFcnJvcihEQl9FUlJPUl9BQ0NFU1NfVklPTEFUSU9OKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHRtcDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRkYXRhWyRrZXldID0gZnJlYWQoJGZwLCBmaWxlc2l6ZSgkZGF0YVska2V5XSkpOwogICAgICAgICAgICAgICAgZmNsb3NlKCRmcCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJGkrKzsKICAgICAgICB9CgogICAgICAgIGFycmF5X3Vuc2hpZnQoJGRhdGEsICRzdG10KTsKCiAgICAgICAgJHJlcyA9IGNhbGxfdXNlcl9mdW5jX2FycmF5KCdpYmFzZV9leGVjdXRlJywgJGRhdGEpOwogICAgICAgIGlmICghJHJlcykgewogICAgICAgICAgICAkdG1wID0mICR0aGlzLT5pYmFzZVJhaXNlRXJyb3IoKTsKICAgICAgICAgICAgcmV0dXJuICR0bXA7CiAgICAgICAgfQogICAgICAgIC8qIFhYWCBuZWVkIHRoaXM/CiAgICAgICAgaWYgKCR0aGlzLT5hdXRvY29tbWl0ICYmICR0aGlzLT5tYW5pcF9xdWVyeVsoaW50KSRzdG10XSkgewogICAgICAgICAgICBAaWJhc2VfY29tbWl0KCR0aGlzLT5jb25uZWN0aW9uKTsKICAgICAgICB9Ki8KICAgICAgICAkdGhpcy0+bGFzdF9zdG10ID0gJHN0bXQ7CiAgICAgICAgaWYgKCR0aGlzLT5tYW5pcF9xdWVyeVsoaW50KSRzdG10XSB8fCAkdGhpcy0+X25leHRfcXVlcnlfbWFuaXApIHsKICAgICAgICAgICAgJHRoaXMtPl9sYXN0X3F1ZXJ5X21hbmlwID0gdHJ1ZTsKICAgICAgICAgICAgJHRoaXMtPl9uZXh0X3F1ZXJ5X21hbmlwID0gZmFsc2U7CiAgICAgICAgICAgICR0bXAgPSBEQl9PSzsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkdGhpcy0+X2xhc3RfcXVlcnlfbWFuaXAgPSBmYWxzZTsKICAgICAgICAgICAgJHRtcCA9JiBuZXcgREJfcmVzdWx0KCR0aGlzLCAkcmVzKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICR0bXA7CiAgICB9CgogICAgLyoqCiAgICAgKiBGcmVlcyB0aGUgaW50ZXJuYWwgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCBhIHByZXBhcmVkIHF1ZXJ5CiAgICAgKgogICAgICogQHBhcmFtIHJlc291cmNlICRzdG10ICAgICAgICAgICB0aGUgcHJlcGFyZWQgc3RhdGVtZW50J3MgUEhQIHJlc291cmNlCiAgICAgKiBAcGFyYW0gYm9vbCAgICAgJGZyZWVfcmVzb3VyY2UgIHNob3VsZCB0aGUgUEhQIHJlc291cmNlIGJlIGZyZWVkIHRvbz8KICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZSBmYWxzZSBpZiB5b3UgbmVlZCB0byBnZXQgZGF0YQogICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSB0aGUgcmVzdWx0IHNldCBsYXRlci4KICAgICAqCiAgICAgKiBAcmV0dXJuIGJvb2wgIFRSVUUgb24gc3VjY2VzcywgRkFMU0UgaWYgJHJlc3VsdCBpcyBpbnZhbGlkCiAgICAgKgogICAgICogQHNlZSBEQl9pYmFzZTo6cHJlcGFyZSgpCiAgICAgKi8KICAgIGZ1bmN0aW9uIGZyZWVQcmVwYXJlZCgkc3RtdCwgJGZyZWVfcmVzb3VyY2UgPSB0cnVlKQogICAgewogICAgICAgIGlmICghaXNfcmVzb3VyY2UoJHN0bXQpKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgaWYgKCRmcmVlX3Jlc291cmNlKSB7CiAgICAgICAgICAgIEBpYmFzZV9mcmVlX3F1ZXJ5KCRzdG10KTsKICAgICAgICB9CiAgICAgICAgdW5zZXQoJHRoaXMtPnByZXBhcmVfdG9rZW5zWyhpbnQpJHN0bXRdKTsKICAgICAgICB1bnNldCgkdGhpcy0+cHJlcGFyZV90eXBlc1soaW50KSRzdG10XSk7CiAgICAgICAgdW5zZXQoJHRoaXMtPm1hbmlwX3F1ZXJ5WyhpbnQpJHN0bXRdKTsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICAvLyB9fX0KICAgIC8vIHt7eyBhdXRvQ29tbWl0KCkKCiAgICAvKioKICAgICAqIEVuYWJsZXMgb3IgZGlzYWJsZXMgYXV0b21hdGljIGNvbW1pdHMKICAgICAqCiAgICAgKiBAcGFyYW0gYm9vbCAkb25vZmYgIHRydWUgdHVybnMgaXQgb24sIGZhbHNlIHR1cm5zIGl0IG9mZgogICAgICoKICAgICAqIEByZXR1cm4gaW50ICBEQl9PSyBvbiBzdWNjZXNzLiAgQSBEQl9FcnJvciBvYmplY3QgaWYgdGhlIGRyaXZlcgogICAgICogICAgICAgICAgICAgICBkb2Vzbid0IHN1cHBvcnQgYXV0by1jb21taXR0aW5nIHRyYW5zYWN0aW9ucy4KICAgICAqLwogICAgZnVuY3Rpb24gYXV0b0NvbW1pdCgkb25vZmYgPSBmYWxzZSkKICAgIHsKICAgICAgICAkdGhpcy0+YXV0b2NvbW1pdCA9ICRvbm9mZiA/IDEgOiAwOwogICAgICAgIHJldHVybiBEQl9PSzsKICAgIH0KCiAgICAvLyB9fX0KICAgIC8vIHt7eyBjb21taXQoKQoKICAgIC8qKgogICAgICogQ29tbWl0cyB0aGUgY3VycmVudCB0cmFuc2FjdGlvbgogICAgICoKICAgICAqIEByZXR1cm4gaW50ICBEQl9PSyBvbiBzdWNjZXNzLiAgQSBEQl9FcnJvciBvYmplY3Qgb24gZmFpbHVyZS4KICAgICAqLwogICAgZnVuY3Rpb24gY29tbWl0KCkKICAgIHsKICAgICAgICByZXR1cm4gQGliYXNlX2NvbW1pdCgkdGhpcy0+Y29ubmVjdGlvbik7CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgcm9sbGJhY2soKQoKICAgIC8qKgogICAgICogUmV2ZXJ0cyB0aGUgY3VycmVudCB0cmFuc2FjdGlvbgogICAgICoKICAgICAqIEByZXR1cm4gaW50ICBEQl9PSyBvbiBzdWNjZXNzLiAgQSBEQl9FcnJvciBvYmplY3Qgb24gZmFpbHVyZS4KICAgICAqLwogICAgZnVuY3Rpb24gcm9sbGJhY2soKQogICAgewogICAgICAgIHJldHVybiBAaWJhc2Vfcm9sbGJhY2soJHRoaXMtPmNvbm5lY3Rpb24pOwogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IHRyYW5zYWN0aW9uSW5pdCgpCgogICAgZnVuY3Rpb24gdHJhbnNhY3Rpb25Jbml0KCR0cmFuc19hcmdzID0gMCkKICAgIHsKICAgICAgICByZXR1cm4gJHRyYW5zX2FyZ3MKICAgICAgICAgICAgICAgID8gQGliYXNlX3RyYW5zKCR0cmFuc19hcmdzLCAkdGhpcy0+Y29ubmVjdGlvbikKICAgICAgICAgICAgICAgIDogQGliYXNlX3RyYW5zKCk7CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgbmV4dElkKCkKCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIG5leHQgZnJlZSBpZCBpbiBhIHNlcXVlbmNlCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAgJHNlcV9uYW1lICBuYW1lIG9mIHRoZSBzZXF1ZW5jZQogICAgICogQHBhcmFtIGJvb2xlYW4gJG9uZGVtYW5kICB3aGVuIHRydWUsIHRoZSBzZXFlbmNlIGlzIGF1dG9tYXRpY2FsbHkKICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZWQgaWYgaXQgZG9lcyBub3QgZXhpc3QKICAgICAqCiAgICAgKiBAcmV0dXJuIGludCAgdGhlIG5leHQgaWQgbnVtYmVyIGluIHRoZSBzZXF1ZW5jZS4KICAgICAqICAgICAgICAgICAgICAgQSBEQl9FcnJvciBvYmplY3Qgb24gZmFpbHVyZS4KICAgICAqCiAgICAgKiBAc2VlIERCX2NvbW1vbjo6bmV4dElEKCksIERCX2NvbW1vbjo6Z2V0U2VxdWVuY2VOYW1lKCksCiAgICAgKiAgICAgIERCX2liYXNlOjpjcmVhdGVTZXF1ZW5jZSgpLCBEQl9pYmFzZTo6ZHJvcFNlcXVlbmNlKCkKICAgICAqLwogICAgZnVuY3Rpb24gbmV4dElkKCRzZXFfbmFtZSwgJG9uZGVtYW5kID0gdHJ1ZSkKICAgIHsKICAgICAgICAkc3FuID0gc3RydG91cHBlcigkdGhpcy0+Z2V0U2VxdWVuY2VOYW1lKCRzZXFfbmFtZSkpOwogICAgICAgICRyZXBlYXQgPSAwOwogICAgICAgIGRvIHsKICAgICAgICAgICAgJHRoaXMtPnB1c2hFcnJvckhhbmRsaW5nKFBFQVJfRVJST1JfUkVUVVJOKTsKICAgICAgICAgICAgJHJlc3VsdCA9JiAkdGhpcy0+cXVlcnkoIlNFTEVDVCBHRU5fSUQoJHtzcW59LCAxKSAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAnRlJPTSBSREIkR0VORVJBVE9SUyAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiV0hFUkUgUkRCXCRHRU5FUkFUT1JfTkFNRT0nJHtzcW59JyIpOwogICAgICAgICAgICAkdGhpcy0+cG9wRXJyb3JIYW5kbGluZygpOwogICAgICAgICAgICBpZiAoJG9uZGVtYW5kICYmIERCOjppc0Vycm9yKCRyZXN1bHQpKSB7CiAgICAgICAgICAgICAgICAkcmVwZWF0ID0gMTsKICAgICAgICAgICAgICAgICRyZXN1bHQgPSAkdGhpcy0+Y3JlYXRlU2VxdWVuY2UoJHNlcV9uYW1lKTsKICAgICAgICAgICAgICAgIGlmIChEQjo6aXNFcnJvcigkcmVzdWx0KSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkcmVzdWx0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJHJlcGVhdCA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICB9IHdoaWxlICgkcmVwZWF0KTsKICAgICAgICBpZiAoREI6OmlzRXJyb3IoJHJlc3VsdCkpIHsKICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5yYWlzZUVycm9yKCRyZXN1bHQpOwogICAgICAgIH0KICAgICAgICAkYXJyID0gJHJlc3VsdC0+ZmV0Y2hSb3coREJfRkVUQ0hNT0RFX09SREVSRUQpOwogICAgICAgICRyZXN1bHQtPmZyZWUoKTsKICAgICAgICByZXR1cm4gJGFyclswXTsKICAgIH0KCiAgICAvLyB9fX0KICAgIC8vIHt7eyBjcmVhdGVTZXF1ZW5jZSgpCgogICAgLyoqCiAgICAgKiBDcmVhdGVzIGEgbmV3IHNlcXVlbmNlCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkc2VxX25hbWUgIG5hbWUgb2YgdGhlIG5ldyBzZXF1ZW5jZQogICAgICoKICAgICAqIEByZXR1cm4gaW50ICBEQl9PSyBvbiBzdWNjZXNzLiAgQSBEQl9FcnJvciBvYmplY3Qgb24gZmFpbHVyZS4KICAgICAqCiAgICAgKiBAc2VlIERCX2NvbW1vbjo6Y3JlYXRlU2VxdWVuY2UoKSwgREJfY29tbW9uOjpnZXRTZXF1ZW5jZU5hbWUoKSwKICAgICAqICAgICAgREJfaWJhc2U6Om5leHRJRCgpLCBEQl9pYmFzZTo6ZHJvcFNlcXVlbmNlKCkKICAgICAqLwogICAgZnVuY3Rpb24gY3JlYXRlU2VxdWVuY2UoJHNlcV9uYW1lKQogICAgewogICAgICAgICRzcW4gPSBzdHJ0b3VwcGVyKCR0aGlzLT5nZXRTZXF1ZW5jZU5hbWUoJHNlcV9uYW1lKSk7CiAgICAgICAgJHRoaXMtPnB1c2hFcnJvckhhbmRsaW5nKFBFQVJfRVJST1JfUkVUVVJOKTsKICAgICAgICAkcmVzdWx0ID0gJHRoaXMtPnF1ZXJ5KCJDUkVBVEUgR0VORVJBVE9SICR7c3FufSIpOwogICAgICAgICR0aGlzLT5wb3BFcnJvckhhbmRsaW5nKCk7CgogICAgICAgIHJldHVybiAkcmVzdWx0OwogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IGRyb3BTZXF1ZW5jZSgpCgogICAgLyoqCiAgICAgKiBEZWxldGVzIGEgc2VxdWVuY2UKICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICRzZXFfbmFtZSAgbmFtZSBvZiB0aGUgc2VxdWVuY2UgdG8gYmUgZGVsZXRlZAogICAgICoKICAgICAqIEByZXR1cm4gaW50ICBEQl9PSyBvbiBzdWNjZXNzLiAgQSBEQl9FcnJvciBvYmplY3Qgb24gZmFpbHVyZS4KICAgICAqCiAgICAgKiBAc2VlIERCX2NvbW1vbjo6ZHJvcFNlcXVlbmNlKCksIERCX2NvbW1vbjo6Z2V0U2VxdWVuY2VOYW1lKCksCiAgICAgKiAgICAgIERCX2liYXNlOjpuZXh0SUQoKSwgREJfaWJhc2U6OmNyZWF0ZVNlcXVlbmNlKCkKICAgICAqLwogICAgZnVuY3Rpb24gZHJvcFNlcXVlbmNlKCRzZXFfbmFtZSkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnF1ZXJ5KCdERUxFVEUgRlJPTSBSREIkR0VORVJBVE9SUyAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICJXSEVSRSBSREJcJEdFTkVSQVRPUl9OQU1FPSciCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuIHN0cnRvdXBwZXIoJHRoaXMtPmdldFNlcXVlbmNlTmFtZSgkc2VxX25hbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiJyIpOwogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IF9pYmFzZUZpZWxkRmxhZ3MoKQoKICAgIC8qKgogICAgICogR2V0IHRoZSBjb2x1bW4ncyBmbGFncwogICAgICoKICAgICAqIFN1cHBvcnRzICJwcmltYXJ5X2tleSIsICJ1bmlxdWVfa2V5IiwgIm5vdF9udWxsIiwgImRlZmF1bHQiLAogICAgICogImNvbXB1dGVkIiBhbmQgImJsb2IiLgogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgJGZpZWxkX25hbWUgIHRoZSBuYW1lIG9mIHRoZSBmaWVsZAogICAgICogQHBhcmFtIHN0cmluZyAkdGFibGVfbmFtZSAgdGhlIG5hbWUgb2YgdGhlIHRhYmxlCiAgICAgKgogICAgICogQHJldHVybiBzdHJpbmcgIHRoZSBmbGFncwogICAgICoKICAgICAqIEBhY2Nlc3MgcHJpdmF0ZQogICAgICovCiAgICBmdW5jdGlvbiBfaWJhc2VGaWVsZEZsYWdzKCRmaWVsZF9uYW1lLCAkdGFibGVfbmFtZSkKICAgIHsKICAgICAgICAkc3FsID0gJ1NFTEVDVCBSLlJEQiRDT05TVFJBSU5UX1RZUEUgQ1RZUEUnCiAgICAgICAgICAgICAgIC4nIEZST00gUkRCJElOREVYX1NFR01FTlRTIEknCiAgICAgICAgICAgICAgIC4nICBKT0lOIFJEQiRSRUxBVElPTl9DT05TVFJBSU5UUyBSIE9OIEkuUkRCJElOREVYX05BTUU9Ui5SREIkSU5ERVhfTkFNRScKICAgICAgICAgICAgICAgLicgV0hFUkUgSS5SREIkRklFTERfTkFNRT1cJycgLiAkZmllbGRfbmFtZSAuICdcJycKICAgICAgICAgICAgICAgLicgIEFORCBVUFBFUihSLlJEQiRSRUxBVElPTl9OQU1FKT1cJycgLiBzdHJ0b3VwcGVyKCR0YWJsZV9uYW1lKSAuICdcJyc7CgogICAgICAgICRyZXN1bHQgPSBAaWJhc2VfcXVlcnkoJHRoaXMtPmNvbm5lY3Rpb24sICRzcWwpOwogICAgICAgIGlmICghJHJlc3VsdCkgewogICAgICAgICAgICByZXR1cm4gJHRoaXMtPmliYXNlUmFpc2VFcnJvcigpOwogICAgICAgIH0KCiAgICAgICAgJGZsYWdzID0gJyc7CiAgICAgICAgaWYgKCRvYmogPSBAaWJhc2VfZmV0Y2hfb2JqZWN0KCRyZXN1bHQpKSB7CiAgICAgICAgICAgIEBpYmFzZV9mcmVlX3Jlc3VsdCgkcmVzdWx0KTsKICAgICAgICAgICAgaWYgKGlzc2V0KCRvYmotPkNUWVBFKSAgJiYgdHJpbSgkb2JqLT5DVFlQRSkgPT0gJ1BSSU1BUlkgS0VZJykgewogICAgICAgICAgICAgICAgJGZsYWdzIC49ICdwcmltYXJ5X2tleSAnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChpc3NldCgkb2JqLT5DVFlQRSkgICYmIHRyaW0oJG9iai0+Q1RZUEUpID09ICdVTklRVUUnKSB7CiAgICAgICAgICAgICAgICAkZmxhZ3MgLj0gJ3VuaXF1ZV9rZXkgJzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJHNxbCA9ICdTRUxFQ1QgUi5SREIkTlVMTF9GTEFHIEFTIE5GTEFHLCcKICAgICAgICAgICAgICAgLicgIFIuUkRCJERFRkFVTFRfU09VUkNFIEFTIERTT1VSQ0UsJwogICAgICAgICAgICAgICAuJyAgRi5SREIkRklFTERfVFlQRSBBUyBGVFlQRSwnCiAgICAgICAgICAgICAgIC4nICBGLlJEQiRDT01QVVRFRF9TT1VSQ0UgQVMgQ1NPVVJDRScKICAgICAgICAgICAgICAgLicgRlJPTSBSREIkUkVMQVRJT05fRklFTERTIFIgJwogICAgICAgICAgICAgICAuJyAgSk9JTiBSREIkRklFTERTIEYgT04gUi5SREIkRklFTERfU09VUkNFPUYuUkRCJEZJRUxEX05BTUUnCiAgICAgICAgICAgICAgIC4nIFdIRVJFIFVQUEVSKFIuUkRCJFJFTEFUSU9OX05BTUUpPVwnJyAuIHN0cnRvdXBwZXIoJHRhYmxlX25hbWUpIC4gJ1wnJwogICAgICAgICAgICAgICAuJyAgQU5EIFIuUkRCJEZJRUxEX05BTUU9XCcnIC4gJGZpZWxkX25hbWUgLiAnXCcnOwoKICAgICAgICAkcmVzdWx0ID0gQGliYXNlX3F1ZXJ5KCR0aGlzLT5jb25uZWN0aW9uLCAkc3FsKTsKICAgICAgICBpZiAoISRyZXN1bHQpIHsKICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5pYmFzZVJhaXNlRXJyb3IoKTsKICAgICAgICB9CiAgICAgICAgaWYgKCRvYmogPSBAaWJhc2VfZmV0Y2hfb2JqZWN0KCRyZXN1bHQpKSB7CiAgICAgICAgICAgIEBpYmFzZV9mcmVlX3Jlc3VsdCgkcmVzdWx0KTsKICAgICAgICAgICAgaWYgKGlzc2V0KCRvYmotPk5GTEFHKSkgewogICAgICAgICAgICAgICAgJGZsYWdzIC49ICdub3RfbnVsbCAnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChpc3NldCgkb2JqLT5EU09VUkNFKSkgewogICAgICAgICAgICAgICAgJGZsYWdzIC49ICdkZWZhdWx0ICc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGlzc2V0KCRvYmotPkNTT1VSQ0UpKSB7CiAgICAgICAgICAgICAgICAkZmxhZ3MgLj0gJ2NvbXB1dGVkICc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGlzc2V0KCRvYmotPkZUWVBFKSAgJiYgJG9iai0+RlRZUEUgPT0gMjYxKSB7CiAgICAgICAgICAgICAgICAkZmxhZ3MgLj0gJ2Jsb2IgJzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHRyaW0oJGZsYWdzKTsKICAgIH0KCiAgICAvLyB9fX0KICAgIC8vIHt7eyBpYmFzZVJhaXNlRXJyb3IoKQoKICAgIC8qKgogICAgICogUHJvZHVjZXMgYSBEQl9FcnJvciBvYmplY3QgcmVnYXJkaW5nIHRoZSBjdXJyZW50IHByb2JsZW0KICAgICAqCiAgICAgKiBAcGFyYW0gaW50ICRlcnJubyAgaWYgdGhlIGVycm9yIGlzIGJlaW5nIG1hbnVhbGx5IHJhaXNlZCBwYXNzIGEKICAgICAqICAgICAgICAgICAgICAgICAgICAgREJfRVJST1IqIGNvbnN0YW50IGhlcmUuICBJZiB0aGlzIGlzbid0IHBhc3NlZAogICAgICogICAgICAgICAgICAgICAgICAgICB0aGUgZXJyb3IgaW5mb3JtYXRpb24gZ2F0aGVyZWQgZnJvbSB0aGUgREJNUy4KICAgICAqCiAgICAgKiBAcmV0dXJuIG9iamVjdCAgdGhlIERCX0Vycm9yIG9iamVjdAogICAgICoKICAgICAqIEBzZWUgREJfY29tbW9uOjpyYWlzZUVycm9yKCksCiAgICAgKiAgICAgIERCX2liYXNlOjplcnJvck5hdGl2ZSgpLCBEQl9pYmFzZTo6ZXJyb3JDb2RlKCkKICAgICAqLwogICAgZnVuY3Rpb24gJmliYXNlUmFpc2VFcnJvcigkZXJybm8gPSBudWxsKQogICAgewogICAgICAgIGlmICgkZXJybm8gPT09IG51bGwpIHsKICAgICAgICAgICAgJGVycm5vID0gJHRoaXMtPmVycm9yQ29kZSgkdGhpcy0+ZXJyb3JOYXRpdmUoKSk7CiAgICAgICAgfQogICAgICAgICR0bXAgPSYgJHRoaXMtPnJhaXNlRXJyb3IoJGVycm5vLCBudWxsLCBudWxsLCBudWxsLCBAaWJhc2VfZXJybXNnKCkpOwogICAgICAgIHJldHVybiAkdG1wOwogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IGVycm9yTmF0aXZlKCkKCiAgICAvKioKICAgICAqIEdldHMgdGhlIERCTVMnIG5hdGl2ZSBlcnJvciBjb2RlIHByb2R1Y2VkIGJ5IHRoZSBsYXN0IHF1ZXJ5CiAgICAgKgogICAgICogQHJldHVybiBpbnQgIHRoZSBEQk1TJyBlcnJvciBjb2RlLiAgTlVMTCBpZiB0aGVyZSBpcyBubyBlcnJvciBjb2RlLgogICAgICoKICAgICAqIEBzaW5jZSBNZXRob2QgYXZhaWxhYmxlIHNpbmNlIFJlbGVhc2UgMS43LjAKICAgICAqLwogICAgZnVuY3Rpb24gZXJyb3JOYXRpdmUoKQogICAgewogICAgICAgIGlmIChmdW5jdGlvbl9leGlzdHMoJ2liYXNlX2VycmNvZGUnKSkgewogICAgICAgICAgICByZXR1cm4gQGliYXNlX2VycmNvZGUoKTsKICAgICAgICB9CiAgICAgICAgaWYgKHByZWdfbWF0Y2goJy9eRHluYW1pYyBTUUwgRXJyb3IgU1FMIGVycm9yIGNvZGUgPSAoWzAtOS1dKykvaScsCiAgICAgICAgICAgICAgICAgICAgICAgQGliYXNlX2Vycm1zZygpLCAkbSkpIHsKICAgICAgICAgICAgcmV0dXJuIChpbnQpJG1bMV07CiAgICAgICAgfQogICAgICAgIHJldHVybiBudWxsOwogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IGVycm9yQ29kZSgpCgogICAgLyoqCiAgICAgKiBNYXBzIG5hdGl2ZSBlcnJvciBjb2RlcyB0byBEQidzIHBvcnRhYmxlIG9uZXMKICAgICAqCiAgICAgKiBAcGFyYW0gaW50ICRuYXRpdmVjb2RlICB0aGUgZXJyb3IgY29kZSByZXR1cm5lZCBieSB0aGUgREJNUwogICAgICoKICAgICAqIEByZXR1cm4gaW50ICB0aGUgcG9ydGFibGUgREIgZXJyb3IgY29kZS4gIFJldHVybiBEQl9FUlJPUiBpZiB0aGUKICAgICAqICAgICAgICAgICAgICAgY3VycmVudCBkcml2ZXIgZG9lc24ndCBoYXZlIGEgbWFwcGluZyBmb3IgdGhlCiAgICAgKiAgICAgICAgICAgICAgICRuYXRpdmVjb2RlIHN1Ym1pdHRlZC4KICAgICAqCiAgICAgKiBAc2luY2UgTWV0aG9kIGF2YWlsYWJsZSBzaW5jZSBSZWxlYXNlIDEuNy4wCiAgICAgKi8KICAgIGZ1bmN0aW9uIGVycm9yQ29kZSgkbmF0aXZlY29kZSA9IG51bGwpCiAgICB7CiAgICAgICAgaWYgKGlzc2V0KCR0aGlzLT5lcnJvcmNvZGVfbWFwWyRuYXRpdmVjb2RlXSkpIHsKICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5lcnJvcmNvZGVfbWFwWyRuYXRpdmVjb2RlXTsKICAgICAgICB9CgogICAgICAgIHN0YXRpYyAkZXJyb3JfcmVnZXhwczsKICAgICAgICBpZiAoIWlzc2V0KCRlcnJvcl9yZWdleHBzKSkgewogICAgICAgICAgICAkZXJyb3JfcmVnZXhwcyA9IGFycmF5KAogICAgICAgICAgICAgICAgJy9nZW5lcmF0b3IgLiogaXMgbm90IGRlZmluZWQvJwogICAgICAgICAgICAgICAgICAgID0+IERCX0VSUk9SX1NZTlRBWCwgIC8vIGZvciBjb21wYXQuIHcgaWJhc2VfZXJyY29kZSgpCiAgICAgICAgICAgICAgICAnL3RhYmxlLioobm90IGV4aXN0fG5vdCBmb3VuZHx1bmtub3duKS9pJwogICAgICAgICAgICAgICAgICAgID0+IERCX0VSUk9SX05PU1VDSFRBQkxFLAogICAgICAgICAgICAgICAgJy90YWJsZSAuKiBhbHJlYWR5IGV4aXN0cy9pJwogICAgICAgICAgICAgICAgICAgID0+IERCX0VSUk9SX0FMUkVBRFlfRVhJU1RTLAogICAgICAgICAgICAgICAgJy91bnN1Y2Nlc3NmdWwgbWV0YWRhdGEgdXBkYXRlIC4qIGZhaWxlZCBhdHRlbXB0IHRvIHN0b3JlIGR1cGxpY2F0ZSB2YWx1ZS9pJwogICAgICAgICAgICAgICAgICAgID0+IERCX0VSUk9SX0FMUkVBRFlfRVhJU1RTLAogICAgICAgICAgICAgICAgJy91bnN1Y2Nlc3NmdWwgbWV0YWRhdGEgdXBkYXRlIC4qIG5vdCBmb3VuZC9pJwogICAgICAgICAgICAgICAgICAgID0+IERCX0VSUk9SX05PVF9GT1VORCwKICAgICAgICAgICAgICAgICcvdmFsaWRhdGlvbiBlcnJvciBmb3IgY29sdW1uIC4qIHZhbHVlICJcKlwqXCogbnVsbC9pJwogICAgICAgICAgICAgICAgICAgID0+IERCX0VSUk9SX0NPTlNUUkFJTlRfTk9UX05VTEwsCiAgICAgICAgICAgICAgICAnL3Zpb2xhdGlvbiBvZiBbXHcgXSsgY29uc3RyYWludC9pJwogICAgICAgICAgICAgICAgICAgID0+IERCX0VSUk9SX0NPTlNUUkFJTlQsCiAgICAgICAgICAgICAgICAnL2NvbnZlcnNpb24gZXJyb3IgZnJvbSBzdHJpbmcvaScKICAgICAgICAgICAgICAgICAgICA9PiBEQl9FUlJPUl9JTlZBTElEX05VTUJFUiwKICAgICAgICAgICAgICAgICcvbm8gcGVybWlzc2lvbiBmb3IvaScKICAgICAgICAgICAgICAgICAgICA9PiBEQl9FUlJPUl9BQ0NFU1NfVklPTEFUSU9OLAogICAgICAgICAgICAgICAgJy9hcml0aG1ldGljIGV4Y2VwdGlvbiwgbnVtZXJpYyBvdmVyZmxvdywgb3Igc3RyaW5nIHRydW5jYXRpb24vaScKICAgICAgICAgICAgICAgICAgICA9PiBEQl9FUlJPUl9JTlZBTElELAogICAgICAgICAgICAgICAgJy9mZWF0dXJlIGlzIG5vdCBzdXBwb3J0ZWQvaScKICAgICAgICAgICAgICAgICAgICA9PiBEQl9FUlJPUl9OT1RfQ0FQQUJMRSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICRlcnJvcm1zZyA9IEBpYmFzZV9lcnJtc2coKTsKICAgICAgICBmb3JlYWNoICgkZXJyb3JfcmVnZXhwcyBhcyAkcmVnZXhwID0+ICRjb2RlKSB7CiAgICAgICAgICAgIGlmIChwcmVnX21hdGNoKCRyZWdleHAsICRlcnJvcm1zZykpIHsKICAgICAgICAgICAgICAgIHJldHVybiAkY29kZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gREJfRVJST1I7CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgdGFibGVJbmZvKCkKCiAgICAvKioKICAgICAqIFJldHVybnMgaW5mb3JtYXRpb24gYWJvdXQgYSB0YWJsZSBvciBhIHJlc3VsdCBzZXQKICAgICAqCiAgICAgKiBOT1RFOiBvbmx5IHN1cHBvcnRzICd0YWJsZScgYW5kICdmbGFncycgaWYgPHZhcj4kcmVzdWx0PC92YXI+CiAgICAgKiBpcyBhIHRhYmxlIG5hbWUuCiAgICAgKgogICAgICogQHBhcmFtIG9iamVjdHxzdHJpbmcgICRyZXN1bHQgIERCX3Jlc3VsdCBvYmplY3QgZnJvbSBhIHF1ZXJ5IG9yIGEKICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIG5hbWUgb2YgYSB0YWJsZS4KICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2hpbGUgdGhpcyBhbHNvIGFjY2VwdHMgYSBxdWVyeSByZXN1bHQKICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2UgaWRlbnRpZmllciwgdGhpcyBiZWhhdmlvciBpcwogICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXByZWNhdGVkLgogICAgICogQHBhcmFtIGludCAgICAgICAgICAgICRtb2RlICAgIGEgdmFsaWQgdGFibGVJbmZvIG1vZGUKICAgICAqCiAgICAgKiBAcmV0dXJuIGFycmF5ICBhbiBhc3NvY2lhdGl2ZSBhcnJheSB3aXRoIHRoZSBpbmZvcm1hdGlvbiByZXF1ZXN0ZWQuCiAgICAgKiAgICAgICAgICAgICAgICAgQSBEQl9FcnJvciBvYmplY3Qgb24gZmFpbHVyZS4KICAgICAqCiAgICAgKiBAc2VlIERCX2NvbW1vbjo6dGFibGVJbmZvKCkKICAgICAqLwogICAgZnVuY3Rpb24gdGFibGVJbmZvKCRyZXN1bHQsICRtb2RlID0gbnVsbCkKICAgIHsKICAgICAgICBpZiAoaXNfc3RyaW5nKCRyZXN1bHQpKSB7CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIFByb2JhYmx5IHJlY2VpdmVkIGEgdGFibGUgbmFtZS4KICAgICAgICAgICAgICogQ3JlYXRlIGEgcmVzdWx0IHJlc291cmNlIGlkZW50aWZpZXIuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICAkaWQgPSBAaWJhc2VfcXVlcnkoJHRoaXMtPmNvbm5lY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU0VMRUNUICogRlJPTSAkcmVzdWx0IFdIRVJFIDE9MCIpOwogICAgICAgICAgICAkZ290X3N0cmluZyA9IHRydWU7CiAgICAgICAgfSBlbHNlaWYgKGlzc2V0KCRyZXN1bHQtPnJlc3VsdCkpIHsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogUHJvYmFibHkgcmVjZWl2ZWQgYSByZXN1bHQgb2JqZWN0LgogICAgICAgICAgICAgKiBFeHRyYWN0IHRoZSByZXN1bHQgcmVzb3VyY2UgaWRlbnRpZmllci4KICAgICAgICAgICAgICovCiAgICAgICAgICAgICRpZCA9ICRyZXN1bHQtPnJlc3VsdDsKICAgICAgICAgICAgJGdvdF9zdHJpbmcgPSBmYWxzZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBQcm9iYWJseSByZWNlaXZlZCBhIHJlc3VsdCByZXNvdXJjZSBpZGVudGlmaWVyLgogICAgICAgICAgICAgKiBDb3B5IGl0LgogICAgICAgICAgICAgKiBEZXByZWNhdGVkLiAgSGVyZSBmb3IgY29tcGF0aWJpbGl0eSBvbmx5LgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgJGlkID0gJHJlc3VsdDsKICAgICAgICAgICAgJGdvdF9zdHJpbmcgPSBmYWxzZTsKICAgICAgICB9CgogICAgICAgIGlmICghaXNfcmVzb3VyY2UoJGlkKSkgewogICAgICAgICAgICByZXR1cm4gJHRoaXMtPmliYXNlUmFpc2VFcnJvcihEQl9FUlJPUl9ORUVEX01PUkVfREFUQSk7CiAgICAgICAgfQoKICAgICAgICBpZiAoJHRoaXMtPm9wdGlvbnNbJ3BvcnRhYmlsaXR5J10gJiBEQl9QT1JUQUJJTElUWV9MT1dFUkNBU0UpIHsKICAgICAgICAgICAgJGNhc2VfZnVuYyA9ICdzdHJ0b2xvd2VyJzsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkY2FzZV9mdW5jID0gJ3N0cnZhbCc7CiAgICAgICAgfQoKICAgICAgICAkY291bnQgPSBAaWJhc2VfbnVtX2ZpZWxkcygkaWQpOwogICAgICAgICRyZXMgICA9IGFycmF5KCk7CgogICAgICAgIGlmICgkbW9kZSkgewogICAgICAgICAgICAkcmVzWydudW1fZmllbGRzJ10gPSAkY291bnQ7CiAgICAgICAgfQoKICAgICAgICBmb3IgKCRpID0gMDsgJGkgPCAkY291bnQ7ICRpKyspIHsKICAgICAgICAgICAgJGluZm8gPSBAaWJhc2VfZmllbGRfaW5mbygkaWQsICRpKTsKICAgICAgICAgICAgJHJlc1skaV0gPSBhcnJheSgKICAgICAgICAgICAgICAgICd0YWJsZScgPT4gJGdvdF9zdHJpbmcgPyAkY2FzZV9mdW5jKCRyZXN1bHQpIDogJycsCiAgICAgICAgICAgICAgICAnbmFtZScgID0+ICRjYXNlX2Z1bmMoJGluZm9bJ25hbWUnXSksCiAgICAgICAgICAgICAgICAndHlwZScgID0+ICRpbmZvWyd0eXBlJ10sCiAgICAgICAgICAgICAgICAnbGVuJyAgID0+ICRpbmZvWydsZW5ndGgnXSwKICAgICAgICAgICAgICAgICdmbGFncycgPT4gKCRnb3Rfc3RyaW5nKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAkdGhpcy0+X2liYXNlRmllbGRGbGFncygkaW5mb1snbmFtZSddLCAkcmVzdWx0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAnJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCRtb2RlICYgREJfVEFCTEVJTkZPX09SREVSKSB7CiAgICAgICAgICAgICAgICAkcmVzWydvcmRlciddWyRyZXNbJGldWyduYW1lJ11dID0gJGk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCRtb2RlICYgREJfVEFCTEVJTkZPX09SREVSVEFCTEUpIHsKICAgICAgICAgICAgICAgICRyZXNbJ29yZGVydGFibGUnXVskcmVzWyRpXVsndGFibGUnXV1bJHJlc1skaV1bJ25hbWUnXV0gPSAkaTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gZnJlZSB0aGUgcmVzdWx0IG9ubHkgaWYgd2Ugd2VyZSBjYWxsZWQgb24gYSB0YWJsZQogICAgICAgIGlmICgkZ290X3N0cmluZykgewogICAgICAgICAgICBAaWJhc2VfZnJlZV9yZXN1bHQoJGlkKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICRyZXM7CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgZ2V0U3BlY2lhbFF1ZXJ5KCkKCiAgICAvKioKICAgICAqIE9idGFpbnMgdGhlIHF1ZXJ5IHN0cmluZyBuZWVkZWQgZm9yIGxpc3RpbmcgYSBnaXZlbiB0eXBlIG9mIG9iamVjdHMKICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICR0eXBlICB0aGUga2luZCBvZiBvYmplY3RzIHlvdSB3YW50IHRvIHJldHJpZXZlCiAgICAgKgogICAgICogQHJldHVybiBzdHJpbmcgIHRoZSBTUUwgcXVlcnkgc3RyaW5nIG9yIG51bGwgaWYgdGhlIGRyaXZlciBkb2Vzbid0CiAgICAgKiAgICAgICAgICAgICAgICAgIHN1cHBvcnQgdGhlIG9iamVjdCB0eXBlIHJlcXVlc3RlZAogICAgICoKICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkCiAgICAgKiBAc2VlIERCX2NvbW1vbjo6Z2V0TGlzdE9mKCkKICAgICAqLwogICAgZnVuY3Rpb24gZ2V0U3BlY2lhbFF1ZXJ5KCR0eXBlKQogICAgewogICAgICAgIHN3aXRjaCAoJHR5cGUpIHsKICAgICAgICAgICAgY2FzZSAndGFibGVzJzoKICAgICAgICAgICAgICAgIHJldHVybiAnU0VMRUNUIERJU1RJTkNUIFIuUkRCJFJFTEFUSU9OX05BTUUgRlJPTSAnCiAgICAgICAgICAgICAgICAgICAgICAgLiAnUkRCJFJFTEFUSU9OX0ZJRUxEUyBSIFdIRVJFIFIuUkRCJFNZU1RFTV9GTEFHPTAnOwogICAgICAgICAgICBjYXNlICd2aWV3cyc6CiAgICAgICAgICAgICAgICByZXR1cm4gJ1NFTEVDVCBESVNUSU5DVCBSREIkVklFV19OQU1FIGZyb20gUkRCJFZJRVdfUkVMQVRJT05TJzsKICAgICAgICAgICAgY2FzZSAndXNlcnMnOgogICAgICAgICAgICAgICAgcmV0dXJuICdTRUxFQ1QgRElTVElOQ1QgUkRCJFVTRVIgRlJPTSBSREIkVVNFUl9QUklWSUxFR0VTJzsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgIH0KCiAgICAvLyB9fX0KCn0KCi8qCiAqIExvY2FsIHZhcmlhYmxlczoKICogdGFiLXdpZHRoOiA0CiAqIGMtYmFzaWMtb2Zmc2V0OiA0CiAqIEVuZDoKICovCgo/Pgo=]]></data>
	</file>
	<file>
	  <filename>/lib/pear/DB/ifx.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qIHZpbTogc2V0IGV4cGFuZHRhYiB0YWJzdG9wPTQgc2hpZnR3aWR0aD00IHNvZnR0YWJzdG9wPTQ6ICovCgovKioKICogVGhlIFBFQVIgREIgZHJpdmVyIGZvciBQSFAncyBpZnggZXh0ZW5zaW9uCiAqIGZvciBpbnRlcmFjdGluZyB3aXRoIEluZm9ybWl4IGRhdGFiYXNlcwogKgogKiBQSFAgdmVyc2lvbnMgNCBhbmQgNQogKgogKiBMSUNFTlNFOiBUaGlzIHNvdXJjZSBmaWxlIGlzIHN1YmplY3QgdG8gdmVyc2lvbiAzLjAgb2YgdGhlIFBIUCBsaWNlbnNlCiAqIHRoYXQgaXMgYXZhaWxhYmxlIHRocm91Z2ggdGhlIHdvcmxkLXdpZGUtd2ViIGF0IHRoZSBmb2xsb3dpbmcgVVJJOgogKiBodHRwOi8vd3d3LnBocC5uZXQvbGljZW5zZS8zXzAudHh0LiAgSWYgeW91IGRpZCBub3QgcmVjZWl2ZSBhIGNvcHkgb2YKICogdGhlIFBIUCBMaWNlbnNlIGFuZCBhcmUgdW5hYmxlIHRvIG9idGFpbiBpdCB0aHJvdWdoIHRoZSB3ZWIsIHBsZWFzZQogKiBzZW5kIGEgbm90ZSB0byBsaWNlbnNlQHBocC5uZXQgc28gd2UgY2FuIG1haWwgeW91IGEgY29weSBpbW1lZGlhdGVseS4KICoKICogQGNhdGVnb3J5ICAgRGF0YWJhc2UKICogQHBhY2thZ2UgICAgREIKICogQGF1dGhvciAgICAgVG9tYXMgVi5WLkNveCA8Y294QGlkZWNuZXQuY29tPgogKiBAYXV0aG9yICAgICBEYW5pZWwgQ29udmlzc29yIDxkYW5pZWxjQHBocC5uZXQ+CiAqIEBjb3B5cmlnaHQgIDE5OTctMjAwNSBUaGUgUEhQIEdyb3VwCiAqIEBsaWNlbnNlICAgIGh0dHA6Ly93d3cucGhwLm5ldC9saWNlbnNlLzNfMC50eHQgIFBIUCBMaWNlbnNlIDMuMAogKiBAdmVyc2lvbiAgICBDVlM6ICRJZDogaWZ4LnBocCx2IDEuNzQgMjAwNy8wMS8xMiAwMzoxMToxNyBhaGFydmV5IEV4cCAkCiAqIEBsaW5rICAgICAgIGh0dHA6Ly9wZWFyLnBocC5uZXQvcGFja2FnZS9EQgogKi8KCi8qKgogKiBPYnRhaW4gdGhlIERCX2NvbW1vbiBjbGFzcyBzbyBpdCBjYW4gYmUgZXh0ZW5kZWQgZnJvbQogKi8KcmVxdWlyZV9vbmNlICdEQi9jb21tb24ucGhwJzsKCi8qKgogKiBUaGUgbWV0aG9kcyBQRUFSIERCIHVzZXMgdG8gaW50ZXJhY3Qgd2l0aCBQSFAncyBpZnggZXh0ZW5zaW9uCiAqIGZvciBpbnRlcmFjdGluZyB3aXRoIEluZm9ybWl4IGRhdGFiYXNlcwogKgogKiBUaGVzZSBtZXRob2RzIG92ZXJsb2FkIHRoZSBvbmVzIGRlY2xhcmVkIGluIERCX2NvbW1vbi4KICoKICogTW9yZSBpbmZvIG9uIEluZm9ybWl4IGVycm9ycyBjYW4gYmUgZm91bmQgYXQ6CiAqIGh0dHA6Ly93d3cuaW5mb3JtaXguY29tL2Fuc3dlcnMvZW5nbGlzaC9pZXJyb3JzLmh0bQogKgogKiBUT0RPOgogKiAgIC0gc2V0IG5lZWRlZCBlbnYgSW5mb3JtaXggdmFycyBvbiBjb25uZWN0CiAqICAgLSBpbXBsZW1lbnQgbmF0aXZlIHByZXBhcmUvZXhlY3V0ZQogKgogKiBAY2F0ZWdvcnkgICBEYXRhYmFzZQogKiBAcGFja2FnZSAgICBEQgogKiBAYXV0aG9yICAgICBUb21hcyBWLlYuQ294IDxjb3hAaWRlY25ldC5jb20+CiAqIEBhdXRob3IgICAgIERhbmllbCBDb252aXNzb3IgPGRhbmllbGNAcGhwLm5ldD4KICogQGNvcHlyaWdodCAgMTk5Ny0yMDA1IFRoZSBQSFAgR3JvdXAKICogQGxpY2Vuc2UgICAgaHR0cDovL3d3dy5waHAubmV0L2xpY2Vuc2UvM18wLnR4dCAgUEhQIExpY2Vuc2UgMy4wCiAqIEB2ZXJzaW9uICAgIFJlbGVhc2U6IDEuNy4xMgogKiBAbGluayAgICAgICBodHRwOi8vcGVhci5waHAubmV0L3BhY2thZ2UvREIKICovCmNsYXNzIERCX2lmeCBleHRlbmRzIERCX2NvbW1vbgp7CiAgICAvLyB7e3sgcHJvcGVydGllcwoKICAgIC8qKgogICAgICogVGhlIERCIGRyaXZlciB0eXBlIChteXNxbCwgb2NpOCwgb2RiYywgZXRjLikKICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHZhciAkcGhwdHlwZSA9ICdpZngnOwoKICAgIC8qKgogICAgICogVGhlIGRhdGFiYXNlIHN5bnRheCB2YXJpYW50IHRvIGJlIHVzZWQgKGRiMiwgYWNjZXNzLCBldGMuKSwgaWYgYW55CiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICB2YXIgJGRic3ludGF4ID0gJ2lmeCc7CgogICAgLyoqCiAgICAgKiBUaGUgY2FwYWJpbGl0aWVzIG9mIHRoaXMgREIgaW1wbGVtZW50YXRpb24KICAgICAqCiAgICAgKiBUaGUgJ25ld19saW5rJyBlbGVtZW50IGNvbnRhaW5zIHRoZSBQSFAgdmVyc2lvbiB0aGF0IGZpcnN0IHByb3ZpZGVkCiAgICAgKiBuZXdfbGluayBzdXBwb3J0IGZvciB0aGlzIERCTVMuICBDb250YWlucyBmYWxzZSBpZiBpdCdzIHVuc3VwcG9ydGVkLgogICAgICoKICAgICAqIE1lYW5pbmcgb2YgdGhlICdsaW1pdCcgZWxlbWVudDoKICAgICAqICAgKyAnZW11bGF0ZScgPSBlbXVsYXRlIHdpdGggZmV0Y2ggcm93IGJ5IG51bWJlcgogICAgICogICArICdhbHRlcicgICA9IGFsdGVyIHRoZSBxdWVyeQogICAgICogICArIGZhbHNlICAgICA9IHNraXAgcm93cwogICAgICoKICAgICAqIEB2YXIgYXJyYXkKICAgICAqLwogICAgdmFyICRmZWF0dXJlcyA9IGFycmF5KAogICAgICAgICdsaW1pdCcgICAgICAgICA9PiAnZW11bGF0ZScsCiAgICAgICAgJ25ld19saW5rJyAgICAgID0+IGZhbHNlLAogICAgICAgICdudW1yb3dzJyAgICAgICA9PiAnZW11bGF0ZScsCiAgICAgICAgJ3Bjb25uZWN0JyAgICAgID0+IHRydWUsCiAgICAgICAgJ3ByZXBhcmUnICAgICAgID0+IGZhbHNlLAogICAgICAgICdzc2wnICAgICAgICAgICA9PiBmYWxzZSwKICAgICAgICAndHJhbnNhY3Rpb25zJyAgPT4gdHJ1ZSwKICAgICk7CgogICAgLyoqCiAgICAgKiBBIG1hcHBpbmcgb2YgbmF0aXZlIGVycm9yIGNvZGVzIHRvIERCIGVycm9yIGNvZGVzCiAgICAgKiBAdmFyIGFycmF5CiAgICAgKi8KICAgIHZhciAkZXJyb3Jjb2RlX21hcCA9IGFycmF5KAogICAgICAgICctMjAxJyAgICA9PiBEQl9FUlJPUl9TWU5UQVgsCiAgICAgICAgJy0yMDYnICAgID0+IERCX0VSUk9SX05PU1VDSFRBQkxFLAogICAgICAgICctMjE3JyAgICA9PiBEQl9FUlJPUl9OT1NVQ0hGSUVMRCwKICAgICAgICAnLTIzNicgICAgPT4gREJfRVJST1JfVkFMVUVfQ09VTlRfT05fUk9XLAogICAgICAgICctMjM5JyAgICA9PiBEQl9FUlJPUl9DT05TVFJBSU5ULAogICAgICAgICctMjUzJyAgICA9PiBEQl9FUlJPUl9TWU5UQVgsCiAgICAgICAgJy0yNjgnICAgID0+IERCX0VSUk9SX0NPTlNUUkFJTlQsCiAgICAgICAgJy0yOTInICAgID0+IERCX0VSUk9SX0NPTlNUUkFJTlRfTk9UX05VTEwsCiAgICAgICAgJy0zMTAnICAgID0+IERCX0VSUk9SX0FMUkVBRFlfRVhJU1RTLAogICAgICAgICctMzE2JyAgICA9PiBEQl9FUlJPUl9BTFJFQURZX0VYSVNUUywKICAgICAgICAnLTMxOScgICAgPT4gREJfRVJST1JfTk9UX0ZPVU5ELAogICAgICAgICctMzI5JyAgICA9PiBEQl9FUlJPUl9OT0RCU0VMRUNURUQsCiAgICAgICAgJy0zNDYnICAgID0+IERCX0VSUk9SX0NPTlNUUkFJTlQsCiAgICAgICAgJy0zODYnICAgID0+IERCX0VSUk9SX0NPTlNUUkFJTlRfTk9UX05VTEwsCiAgICAgICAgJy0zOTEnICAgID0+IERCX0VSUk9SX0NPTlNUUkFJTlRfTk9UX05VTEwsCiAgICAgICAgJy01NTQnICAgID0+IERCX0VSUk9SX1NZTlRBWCwKICAgICAgICAnLTY5MScgICAgPT4gREJfRVJST1JfQ09OU1RSQUlOVCwKICAgICAgICAnLTY5MicgICAgPT4gREJfRVJST1JfQ09OU1RSQUlOVCwKICAgICAgICAnLTcwMycgICAgPT4gREJfRVJST1JfQ09OU1RSQUlOVF9OT1RfTlVMTCwKICAgICAgICAnLTEyMDInICAgPT4gREJfRVJST1JfRElWWkVSTywKICAgICAgICAnLTEyMDQnICAgPT4gREJfRVJST1JfSU5WQUxJRF9EQVRFLAogICAgICAgICctMTIwNScgICA9PiBEQl9FUlJPUl9JTlZBTElEX0RBVEUsCiAgICAgICAgJy0xMjA2JyAgID0+IERCX0VSUk9SX0lOVkFMSURfREFURSwKICAgICAgICAnLTEyMDknICAgPT4gREJfRVJST1JfSU5WQUxJRF9EQVRFLAogICAgICAgICctMTIxMCcgICA9PiBEQl9FUlJPUl9JTlZBTElEX0RBVEUsCiAgICAgICAgJy0xMjEyJyAgID0+IERCX0VSUk9SX0lOVkFMSURfREFURSwKICAgICAgICAnLTEyMTMnICAgPT4gREJfRVJST1JfSU5WQUxJRF9OVU1CRVIsCiAgICApOwoKICAgIC8qKgogICAgICogVGhlIHJhdyBkYXRhYmFzZSBjb25uZWN0aW9uIGNyZWF0ZWQgYnkgUEhQCiAgICAgKiBAdmFyIHJlc291cmNlCiAgICAgKi8KICAgIHZhciAkY29ubmVjdGlvbjsKCiAgICAvKioKICAgICAqIFRoZSBEU04gaW5mb3JtYXRpb24gZm9yIGNvbm5lY3RpbmcgdG8gYSBkYXRhYmFzZQogICAgICogQHZhciBhcnJheQogICAgICovCiAgICB2YXIgJGRzbiA9IGFycmF5KCk7CgoKICAgIC8qKgogICAgICogU2hvdWxkIGRhdGEgbWFuaXB1bGF0aW9uIHF1ZXJpZXMgYmUgY29tbWl0dGVkIGF1dG9tYXRpY2FsbHk/CiAgICAgKiBAdmFyIGJvb2wKICAgICAqIEBhY2Nlc3MgcHJpdmF0ZQogICAgICovCiAgICB2YXIgJGF1dG9jb21taXQgPSB0cnVlOwoKICAgIC8qKgogICAgICogVGhlIHF1YW50aXR5IG9mIHRyYW5zYWN0aW9ucyBiZWd1bgogICAgICoKICAgICAqIHtAaW50ZXJuYWwgIFdoaWxlIHRoaXMgaXMgcHJpdmF0ZSwgaXQgY2FuJ3QgYWN0dWFsbHkgYmUgZGVzaWduYXRlZAogICAgICogcHJpdmF0ZSBpbiBQSFAgNSBiZWNhdXNlIGl0IGlzIGRpcmVjdGx5IGFjY2Vzc2VkIGluIHRoZSB0ZXN0IHN1aXRlLn19CiAgICAgKgogICAgICogQHZhciBpbnRlZ2VyCiAgICAgKiBAYWNjZXNzIHByaXZhdGUKICAgICAqLwogICAgdmFyICR0cmFuc2FjdGlvbl9vcGNvdW50ID0gMDsKCiAgICAvKioKICAgICAqIFRoZSBudW1iZXIgb2Ygcm93cyBhZmZlY3RlZCBieSBhIGRhdGEgbWFuaXB1bGF0aW9uIHF1ZXJ5CiAgICAgKiBAdmFyIGludGVnZXIKICAgICAqIEBhY2Nlc3MgcHJpdmF0ZQogICAgICovCiAgICB2YXIgJGFmZmVjdGVkID0gMDsKCgogICAgLy8gfX19CiAgICAvLyB7e3sgY29uc3RydWN0b3IKCiAgICAvKioKICAgICAqIFRoaXMgY29uc3RydWN0b3IgY2FsbHMgPGtiZD4kdGhpcy0+REJfY29tbW9uKCk8L2tiZD4KICAgICAqCiAgICAgKiBAcmV0dXJuIHZvaWQKICAgICAqLwogICAgZnVuY3Rpb24gREJfaWZ4KCkKICAgIHsKICAgICAgICAkdGhpcy0+REJfY29tbW9uKCk7CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgY29ubmVjdCgpCgogICAgLyoqCiAgICAgKiBDb25uZWN0IHRvIHRoZSBkYXRhYmFzZSBzZXJ2ZXIsIGxvZyBpbiBhbmQgb3BlbiB0aGUgZGF0YWJhc2UKICAgICAqCiAgICAgKiBEb24ndCBjYWxsIHRoaXMgbWV0aG9kIGRpcmVjdGx5LiAgVXNlIERCOjpjb25uZWN0KCkgaW5zdGVhZC4KICAgICAqCiAgICAgKiBAcGFyYW0gYXJyYXkgJGRzbiAgICAgICAgIHRoZSBkYXRhIHNvdXJjZSBuYW1lCiAgICAgKiBAcGFyYW0gYm9vbCAgJHBlcnNpc3RlbnQgIHNob3VsZCB0aGUgY29ubmVjdGlvbiBiZSBwZXJzaXN0ZW50PwogICAgICoKICAgICAqIEByZXR1cm4gaW50ICBEQl9PSyBvbiBzdWNjZXNzLiBBIERCX0Vycm9yIG9iamVjdCBvbiBmYWlsdXJlLgogICAgICovCiAgICBmdW5jdGlvbiBjb25uZWN0KCRkc24sICRwZXJzaXN0ZW50ID0gZmFsc2UpCiAgICB7CiAgICAgICAgaWYgKCFQRUFSOjpsb2FkRXh0ZW5zaW9uKCdpbmZvcm1peCcpICYmCiAgICAgICAgICAgICFQRUFSOjpsb2FkRXh0ZW5zaW9uKCdJbmZvcm1peCcpKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5yYWlzZUVycm9yKERCX0VSUk9SX0VYVEVOU0lPTl9OT1RfRk9VTkQpOwogICAgICAgIH0KCiAgICAgICAgJHRoaXMtPmRzbiA9ICRkc247CiAgICAgICAgaWYgKCRkc25bJ2Ric3ludGF4J10pIHsKICAgICAgICAgICAgJHRoaXMtPmRic3ludGF4ID0gJGRzblsnZGJzeW50YXgnXTsKICAgICAgICB9CgogICAgICAgICRkYmhvc3QgPSAkZHNuWydob3N0c3BlYyddID8gJ0AnIC4gJGRzblsnaG9zdHNwZWMnXSA6ICcnOwogICAgICAgICRkYm5hbWUgPSAkZHNuWydkYXRhYmFzZSddID8gJGRzblsnZGF0YWJhc2UnXSAuICRkYmhvc3QgOiAnJzsKICAgICAgICAkdXNlciA9ICRkc25bJ3VzZXJuYW1lJ10gPyAkZHNuWyd1c2VybmFtZSddIDogJyc7CiAgICAgICAgJHB3ID0gJGRzblsncGFzc3dvcmQnXSA/ICRkc25bJ3Bhc3N3b3JkJ10gOiAnJzsKCiAgICAgICAgJGNvbm5lY3RfZnVuY3Rpb24gPSAkcGVyc2lzdGVudCA/ICdpZnhfcGNvbm5lY3QnIDogJ2lmeF9jb25uZWN0JzsKCiAgICAgICAgJHRoaXMtPmNvbm5lY3Rpb24gPSBAJGNvbm5lY3RfZnVuY3Rpb24oJGRibmFtZSwgJHVzZXIsICRwdyk7CiAgICAgICAgaWYgKCFpc19yZXNvdXJjZSgkdGhpcy0+Y29ubmVjdGlvbikpIHsKICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5pZnhSYWlzZUVycm9yKERCX0VSUk9SX0NPTk5FQ1RfRkFJTEVEKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIERCX09LOwogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IGRpc2Nvbm5lY3QoKQoKICAgIC8qKgogICAgICogRGlzY29ubmVjdHMgZnJvbSB0aGUgZGF0YWJhc2Ugc2VydmVyCiAgICAgKgogICAgICogQHJldHVybiBib29sICBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUKICAgICAqLwogICAgZnVuY3Rpb24gZGlzY29ubmVjdCgpCiAgICB7CiAgICAgICAgJHJldCA9IEBpZnhfY2xvc2UoJHRoaXMtPmNvbm5lY3Rpb24pOwogICAgICAgICR0aGlzLT5jb25uZWN0aW9uID0gbnVsbDsKICAgICAgICByZXR1cm4gJHJldDsKICAgIH0KCiAgICAvLyB9fX0KICAgIC8vIHt7eyBzaW1wbGVRdWVyeSgpCgogICAgLyoqCiAgICAgKiBTZW5kcyBhIHF1ZXJ5IHRvIHRoZSBkYXRhYmFzZSBzZXJ2ZXIKICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICB0aGUgU1FMIHF1ZXJ5IHN0cmluZwogICAgICoKICAgICAqIEByZXR1cm4gbWl4ZWQgICsgYSBQSFAgcmVzdWx0IHJlc3JvdWNlIGZvciBzdWNjZXNzZnVsIFNFTEVDVCBxdWVyaWVzCiAgICAgKiAgICAgICAgICAgICAgICArIHRoZSBEQl9PSyBjb25zdGFudCBmb3Igb3RoZXIgc3VjY2Vzc2Z1bCBxdWVyaWVzCiAgICAgKiAgICAgICAgICAgICAgICArIGEgREJfRXJyb3Igb2JqZWN0IG9uIGZhaWx1cmUKICAgICAqLwogICAgZnVuY3Rpb24gc2ltcGxlUXVlcnkoJHF1ZXJ5KQogICAgewogICAgICAgICRpc21hbmlwID0gJHRoaXMtPl9jaGVja01hbmlwKCRxdWVyeSk7CiAgICAgICAgJHRoaXMtPmxhc3RfcXVlcnkgPSAkcXVlcnk7CiAgICAgICAgJHRoaXMtPmFmZmVjdGVkICAgPSBudWxsOwogICAgICAgIGlmIChwcmVnX21hdGNoKCcvKFNFTEVDVHxFWEVDVVRFKS9pJywgJHF1ZXJ5KSkgeyAgICAvL1RFU1RNRTogVXNlICFEQjo6aXNNYW5pcCgpPwogICAgICAgICAgICAvLyB0aGUgc2Nyb2xsIGlzIG5lZWRlZCBmb3IgZmV0Y2hpbmcgYWJzb2x1dGUgcm93IG51bWJlcnMKICAgICAgICAgICAgLy8gaW4gYSBzZWxlY3QgcXVlcnkgcmVzdWx0CiAgICAgICAgICAgICRyZXN1bHQgPSBAaWZ4X3F1ZXJ5KCRxdWVyeSwgJHRoaXMtPmNvbm5lY3Rpb24sIElGWF9TQ1JPTEwpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmICghJHRoaXMtPmF1dG9jb21taXQgJiYgJGlzbWFuaXApIHsKICAgICAgICAgICAgICAgIGlmICgkdGhpcy0+dHJhbnNhY3Rpb25fb3Bjb3VudCA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgJHJlc3VsdCA9IEBpZnhfcXVlcnkoJ0JFR0lOIFdPUksnLCAkdGhpcy0+Y29ubmVjdGlvbik7CiAgICAgICAgICAgICAgICAgICAgaWYgKCEkcmVzdWx0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+aWZ4UmFpc2VFcnJvcigpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICR0aGlzLT50cmFuc2FjdGlvbl9vcGNvdW50Kys7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJHJlc3VsdCA9IEBpZnhfcXVlcnkoJHF1ZXJ5LCAkdGhpcy0+Y29ubmVjdGlvbik7CiAgICAgICAgfQogICAgICAgIGlmICghJHJlc3VsdCkgewogICAgICAgICAgICByZXR1cm4gJHRoaXMtPmlmeFJhaXNlRXJyb3IoKTsKICAgICAgICB9CiAgICAgICAgJHRoaXMtPmFmZmVjdGVkID0gQGlmeF9hZmZlY3RlZF9yb3dzKCRyZXN1bHQpOwogICAgICAgIC8vIERldGVybWluZSB3aGljaCBxdWVyaWVzIHNob3VsZCByZXR1cm4gZGF0YSwgYW5kIHdoaWNoCiAgICAgICAgLy8gc2hvdWxkIHJldHVybiBhbiBlcnJvciBjb2RlIG9ubHkuCiAgICAgICAgaWYgKHByZWdfbWF0Y2goJy8oU0VMRUNUfEVYRUNVVEUpL2knLCAkcXVlcnkpKSB7CiAgICAgICAgICAgIHJldHVybiAkcmVzdWx0OwogICAgICAgIH0KICAgICAgICAvLyBYWFggVGVzdG1lOiBmcmVlIHJlc3VsdHMgaW5zaWRlIGEgdHJhbnNhY3Rpb24KICAgICAgICAvLyBtYXkgY2F1c2UgdG8gc3RvcCBpdCBhbmQgY29tbWl0IHRoZSB3b3JrPwoKICAgICAgICAvLyBSZXN1bHQgaGFzIHRvIGJlIGZyZWVkIGV2ZW4gd2l0aCBhIGluc2VydCBvciB1cGRhdGUKICAgICAgICBAaWZ4X2ZyZWVfcmVzdWx0KCRyZXN1bHQpOwoKICAgICAgICByZXR1cm4gREJfT0s7CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgbmV4dFJlc3VsdCgpCgogICAgLyoqCiAgICAgKiBNb3ZlIHRoZSBpbnRlcm5hbCBpZnggcmVzdWx0IHBvaW50ZXIgdG8gdGhlIG5leHQgYXZhaWxhYmxlIHJlc3VsdAogICAgICoKICAgICAqIEBwYXJhbSBhIHZhbGlkIGZic3FsIHJlc3VsdCByZXNvdXJjZQogICAgICoKICAgICAqIEBhY2Nlc3MgcHVibGljCiAgICAgKgogICAgICogQHJldHVybiB0cnVlIGlmIGEgcmVzdWx0IGlzIGF2YWlsYWJsZSBvdGhlcndpc2UgcmV0dXJuIGZhbHNlCiAgICAgKi8KICAgIGZ1bmN0aW9uIG5leHRSZXN1bHQoJHJlc3VsdCkKICAgIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgYWZmZWN0ZWRSb3dzKCkKCiAgICAvKioKICAgICAqIERldGVybWluZXMgdGhlIG51bWJlciBvZiByb3dzIGFmZmVjdGVkIGJ5IGEgZGF0YSBtYW5pdXBsYXRpb24gcXVlcnkKICAgICAqCiAgICAgKiAwIGlzIHJldHVybmVkIGZvciBxdWVyaWVzIHRoYXQgZG9uJ3QgbWFuaXB1bGF0ZSBkYXRhLgogICAgICoKICAgICAqIEByZXR1cm4gaW50ICB0aGUgbnVtYmVyIG9mIHJvd3MuICBBIERCX0Vycm9yIG9iamVjdCBvbiBmYWlsdXJlLgogICAgICovCiAgICBmdW5jdGlvbiBhZmZlY3RlZFJvd3MoKQogICAgewogICAgICAgIGlmICgkdGhpcy0+X2xhc3RfcXVlcnlfbWFuaXApIHsKICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5hZmZlY3RlZDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgZmV0Y2hJbnRvKCkKCiAgICAvKioKICAgICAqIFBsYWNlcyBhIHJvdyBmcm9tIHRoZSByZXN1bHQgc2V0IGludG8gdGhlIGdpdmVuIGFycmF5CiAgICAgKgogICAgICogRm9ybWF0aW5nIG9mIHRoZSBhcnJheSBhbmQgdGhlIGRhdGEgdGhlcmVpbiBhcmUgY29uZmlndXJhYmxlLgogICAgICogU2VlIERCX3Jlc3VsdDo6ZmV0Y2hJbnRvKCkgZm9yIG1vcmUgaW5mb3JtYXRpb24uCiAgICAgKgogICAgICogVGhpcyBtZXRob2QgaXMgbm90IG1lYW50IHRvIGJlIGNhbGxlZCBkaXJlY3RseS4gIFVzZQogICAgICogREJfcmVzdWx0OjpmZXRjaEludG8oKSBpbnN0ZWFkLiAgSXQgY2FuJ3QgYmUgZGVjbGFyZWQgInByb3RlY3RlZCIKICAgICAqIGJlY2F1c2UgREJfcmVzdWx0IGlzIGEgc2VwYXJhdGUgb2JqZWN0LgogICAgICoKICAgICAqIEBwYXJhbSByZXNvdXJjZSAkcmVzdWx0ICAgIHRoZSBxdWVyeSByZXN1bHQgcmVzb3VyY2UKICAgICAqIEBwYXJhbSBhcnJheSAgICAkYXJyICAgICAgIHRoZSByZWZlcmVuY2VkIGFycmF5IHRvIHB1dCB0aGUgZGF0YSBpbgogICAgICogQHBhcmFtIGludCAgICAgICRmZXRjaG1vZGUgaG93IHRoZSByZXN1bHRpbmcgYXJyYXkgc2hvdWxkIGJlIGluZGV4ZWQKICAgICAqIEBwYXJhbSBpbnQgICAgICAkcm93bnVtICAgIHRoZSByb3cgbnVtYmVyIHRvIGZldGNoICgwID0gZmlyc3Qgcm93KQogICAgICoKICAgICAqIEByZXR1cm4gbWl4ZWQgIERCX09LIG9uIHN1Y2Nlc3MsIE5VTEwgd2hlbiB0aGUgZW5kIG9mIGEgcmVzdWx0IHNldCBpcwogICAgICogICAgICAgICAgICAgICAgIHJlYWNoZWQgb3Igb24gZmFpbHVyZQogICAgICoKICAgICAqIEBzZWUgREJfcmVzdWx0OjpmZXRjaEludG8oKQogICAgICovCiAgICBmdW5jdGlvbiBmZXRjaEludG8oJHJlc3VsdCwgJiRhcnIsICRmZXRjaG1vZGUsICRyb3dudW0gPSBudWxsKQogICAgewogICAgICAgIGlmICgoJHJvd251bSAhPT0gbnVsbCkgJiYgKCRyb3dudW0gPCAwKSkgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgaWYgKCRyb3dudW0gPT09IG51bGwpIHsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogRXZlbiB0aG91Z2ggZmV0Y2hfcm93KCkgc2hvdWxkIHJldHVybiB0aGUgbmV4dCByb3cgIGlmCiAgICAgICAgICAgICAqICRyb3dudW0gaXMgbnVsbCwgaXQgZG9lc24ndCBpbiBhbGwgY2FzZXMuICBCdWcgNTk4LgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgJHJvd251bSA9ICdORVhUJzsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvLyBJbmRleCBzdGFydHMgYXQgcm93IDEsIHVubGlrZSBtb3N0IERCTVMncyBzdGFydGluZyBhdCAwLgogICAgICAgICAgICAkcm93bnVtKys7CiAgICAgICAgfQogICAgICAgIGlmICghJGFyciA9IEBpZnhfZmV0Y2hfcm93KCRyZXN1bHQsICRyb3dudW0pKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICBpZiAoJGZldGNobW9kZSAhPT0gREJfRkVUQ0hNT0RFX0FTU09DKSB7CiAgICAgICAgICAgICRpPTA7CiAgICAgICAgICAgICRvcmRlciA9IGFycmF5KCk7CiAgICAgICAgICAgIGZvcmVhY2ggKCRhcnIgYXMgJHZhbCkgewogICAgICAgICAgICAgICAgJG9yZGVyWyRpKytdID0gJHZhbDsKICAgICAgICAgICAgfQogICAgICAgICAgICAkYXJyID0gJG9yZGVyOwogICAgICAgIH0gZWxzZWlmICgkZmV0Y2htb2RlID09IERCX0ZFVENITU9ERV9BU1NPQyAmJgogICAgICAgICAgICAgICAgICAkdGhpcy0+b3B0aW9uc1sncG9ydGFiaWxpdHknXSAmIERCX1BPUlRBQklMSVRZX0xPV0VSQ0FTRSkKICAgICAgICB7CiAgICAgICAgICAgICRhcnIgPSBhcnJheV9jaGFuZ2Vfa2V5X2Nhc2UoJGFyciwgQ0FTRV9MT1dFUik7CiAgICAgICAgfQogICAgICAgIGlmICgkdGhpcy0+b3B0aW9uc1sncG9ydGFiaWxpdHknXSAmIERCX1BPUlRBQklMSVRZX1JUUklNKSB7CiAgICAgICAgICAgICR0aGlzLT5fcnRyaW1BcnJheVZhbHVlcygkYXJyKTsKICAgICAgICB9CiAgICAgICAgaWYgKCR0aGlzLT5vcHRpb25zWydwb3J0YWJpbGl0eSddICYgREJfUE9SVEFCSUxJVFlfTlVMTF9UT19FTVBUWSkgewogICAgICAgICAgICAkdGhpcy0+X2NvbnZlcnROdWxsQXJyYXlWYWx1ZXNUb0VtcHR5KCRhcnIpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gREJfT0s7CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgbnVtQ29scygpCgogICAgLyoqCiAgICAgKiBHZXRzIHRoZSBudW1iZXIgb2YgY29sdW1ucyBpbiBhIHJlc3VsdCBzZXQKICAgICAqCiAgICAgKiBUaGlzIG1ldGhvZCBpcyBub3QgbWVhbnQgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LiAgVXNlCiAgICAgKiBEQl9yZXN1bHQ6Om51bUNvbHMoKSBpbnN0ZWFkLiAgSXQgY2FuJ3QgYmUgZGVjbGFyZWQgInByb3RlY3RlZCIKICAgICAqIGJlY2F1c2UgREJfcmVzdWx0IGlzIGEgc2VwYXJhdGUgb2JqZWN0LgogICAgICoKICAgICAqIEBwYXJhbSByZXNvdXJjZSAkcmVzdWx0ICBQSFAncyBxdWVyeSByZXN1bHQgcmVzb3VyY2UKICAgICAqCiAgICAgKiBAcmV0dXJuIGludCAgdGhlIG51bWJlciBvZiBjb2x1bW5zLiAgQSBEQl9FcnJvciBvYmplY3Qgb24gZmFpbHVyZS4KICAgICAqCiAgICAgKiBAc2VlIERCX3Jlc3VsdDo6bnVtQ29scygpCiAgICAgKi8KICAgIGZ1bmN0aW9uIG51bUNvbHMoJHJlc3VsdCkKICAgIHsKICAgICAgICBpZiAoISRjb2xzID0gQGlmeF9udW1fZmllbGRzKCRyZXN1bHQpKSB7CiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+aWZ4UmFpc2VFcnJvcigpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJGNvbHM7CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgZnJlZVJlc3VsdCgpCgogICAgLyoqCiAgICAgKiBEZWxldGVzIHRoZSByZXN1bHQgc2V0IGFuZCBmcmVlcyB0aGUgbWVtb3J5IG9jY3VwaWVkIGJ5IHRoZSByZXN1bHQgc2V0CiAgICAgKgogICAgICogVGhpcyBtZXRob2QgaXMgbm90IG1lYW50IHRvIGJlIGNhbGxlZCBkaXJlY3RseS4gIFVzZQogICAgICogREJfcmVzdWx0OjpmcmVlKCkgaW5zdGVhZC4gIEl0IGNhbid0IGJlIGRlY2xhcmVkICJwcm90ZWN0ZWQiCiAgICAgKiBiZWNhdXNlIERCX3Jlc3VsdCBpcyBhIHNlcGFyYXRlIG9iamVjdC4KICAgICAqCiAgICAgKiBAcGFyYW0gcmVzb3VyY2UgJHJlc3VsdCAgUEhQJ3MgcXVlcnkgcmVzdWx0IHJlc291cmNlCiAgICAgKgogICAgICogQHJldHVybiBib29sICBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIGlmICRyZXN1bHQgaXMgaW52YWxpZAogICAgICoKICAgICAqIEBzZWUgREJfcmVzdWx0OjpmcmVlKCkKICAgICAqLwogICAgZnVuY3Rpb24gZnJlZVJlc3VsdCgkcmVzdWx0KQogICAgewogICAgICAgIHJldHVybiBpc19yZXNvdXJjZSgkcmVzdWx0KSA/IGlmeF9mcmVlX3Jlc3VsdCgkcmVzdWx0KSA6IGZhbHNlOwogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IGF1dG9Db21taXQoKQoKICAgIC8qKgogICAgICogRW5hYmxlcyBvciBkaXNhYmxlcyBhdXRvbWF0aWMgY29tbWl0cwogICAgICoKICAgICAqIEBwYXJhbSBib29sICRvbm9mZiAgdHJ1ZSB0dXJucyBpdCBvbiwgZmFsc2UgdHVybnMgaXQgb2ZmCiAgICAgKgogICAgICogQHJldHVybiBpbnQgIERCX09LIG9uIHN1Y2Nlc3MuICBBIERCX0Vycm9yIG9iamVjdCBpZiB0aGUgZHJpdmVyCiAgICAgKiAgICAgICAgICAgICAgIGRvZXNuJ3Qgc3VwcG9ydCBhdXRvLWNvbW1pdHRpbmcgdHJhbnNhY3Rpb25zLgogICAgICovCiAgICBmdW5jdGlvbiBhdXRvQ29tbWl0KCRvbm9mZiA9IHRydWUpCiAgICB7CiAgICAgICAgLy8gWFhYIGlmICR0aGlzLT50cmFuc2FjdGlvbl9vcGNvdW50ID4gMCwgd2Ugc2hvdWxkIHByb2JhYmx5CiAgICAgICAgLy8gaXNzdWUgYSB3YXJuaW5nIGhlcmUuCiAgICAgICAgJHRoaXMtPmF1dG9jb21taXQgPSAkb25vZmYgPyB0cnVlIDogZmFsc2U7CiAgICAgICAgcmV0dXJuIERCX09LOwogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IGNvbW1pdCgpCgogICAgLyoqCiAgICAgKiBDb21taXRzIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uCiAgICAgKgogICAgICogQHJldHVybiBpbnQgIERCX09LIG9uIHN1Y2Nlc3MuICBBIERCX0Vycm9yIG9iamVjdCBvbiBmYWlsdXJlLgogICAgICovCiAgICBmdW5jdGlvbiBjb21taXQoKQogICAgewogICAgICAgIGlmICgkdGhpcy0+dHJhbnNhY3Rpb25fb3Bjb3VudCA+IDApIHsKICAgICAgICAgICAgJHJlc3VsdCA9IEBpZnhfcXVlcnkoJ0NPTU1JVCBXT1JLJywgJHRoaXMtPmNvbm5lY3Rpb24pOwogICAgICAgICAgICAkdGhpcy0+dHJhbnNhY3Rpb25fb3Bjb3VudCA9IDA7CiAgICAgICAgICAgIGlmICghJHJlc3VsdCkgewogICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5pZnhSYWlzZUVycm9yKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIERCX09LOwogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IHJvbGxiYWNrKCkKCiAgICAvKioKICAgICAqIFJldmVydHMgdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24KICAgICAqCiAgICAgKiBAcmV0dXJuIGludCAgREJfT0sgb24gc3VjY2Vzcy4gIEEgREJfRXJyb3Igb2JqZWN0IG9uIGZhaWx1cmUuCiAgICAgKi8KICAgIGZ1bmN0aW9uIHJvbGxiYWNrKCkKICAgIHsKICAgICAgICBpZiAoJHRoaXMtPnRyYW5zYWN0aW9uX29wY291bnQgPiAwKSB7CiAgICAgICAgICAgICRyZXN1bHQgPSBAaWZ4X3F1ZXJ5KCdST0xMQkFDSyBXT1JLJywgJHRoaXMtPmNvbm5lY3Rpb24pOwogICAgICAgICAgICAkdGhpcy0+dHJhbnNhY3Rpb25fb3Bjb3VudCA9IDA7CiAgICAgICAgICAgIGlmICghJHJlc3VsdCkgewogICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5pZnhSYWlzZUVycm9yKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIERCX09LOwogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IGlmeFJhaXNlRXJyb3IoKQoKICAgIC8qKgogICAgICogUHJvZHVjZXMgYSBEQl9FcnJvciBvYmplY3QgcmVnYXJkaW5nIHRoZSBjdXJyZW50IHByb2JsZW0KICAgICAqCiAgICAgKiBAcGFyYW0gaW50ICRlcnJubyAgaWYgdGhlIGVycm9yIGlzIGJlaW5nIG1hbnVhbGx5IHJhaXNlZCBwYXNzIGEKICAgICAqICAgICAgICAgICAgICAgICAgICAgREJfRVJST1IqIGNvbnN0YW50IGhlcmUuICBJZiB0aGlzIGlzbid0IHBhc3NlZAogICAgICogICAgICAgICAgICAgICAgICAgICB0aGUgZXJyb3IgaW5mb3JtYXRpb24gZ2F0aGVyZWQgZnJvbSB0aGUgREJNUy4KICAgICAqCiAgICAgKiBAcmV0dXJuIG9iamVjdCAgdGhlIERCX0Vycm9yIG9iamVjdAogICAgICoKICAgICAqIEBzZWUgREJfY29tbW9uOjpyYWlzZUVycm9yKCksCiAgICAgKiAgICAgIERCX2lmeDo6ZXJyb3JOYXRpdmUoKSwgREJfaWZ4OjplcnJvckNvZGUoKQogICAgICovCiAgICBmdW5jdGlvbiBpZnhSYWlzZUVycm9yKCRlcnJubyA9IG51bGwpCiAgICB7CiAgICAgICAgaWYgKCRlcnJubyA9PT0gbnVsbCkgewogICAgICAgICAgICAkZXJybm8gPSAkdGhpcy0+ZXJyb3JDb2RlKGlmeF9lcnJvcigpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICR0aGlzLT5yYWlzZUVycm9yKCRlcnJubywgbnVsbCwgbnVsbCwgbnVsbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmVycm9yTmF0aXZlKCkpOwogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IGVycm9yTmF0aXZlKCkKCiAgICAvKioKICAgICAqIEdldHMgdGhlIERCTVMnIG5hdGl2ZSBlcnJvciBjb2RlIGFuZCBtZXNzYWdlIHByb2R1Y2VkIGJ5IHRoZSBsYXN0IHF1ZXJ5CiAgICAgKgogICAgICogQHJldHVybiBzdHJpbmcgIHRoZSBEQk1TJyBlcnJvciBjb2RlIGFuZCBtZXNzYWdlCiAgICAgKi8KICAgIGZ1bmN0aW9uIGVycm9yTmF0aXZlKCkKICAgIHsKICAgICAgICByZXR1cm4gQGlmeF9lcnJvcigpIC4gJyAnIC4gQGlmeF9lcnJvcm1zZygpOwogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IGVycm9yQ29kZSgpCgogICAgLyoqCiAgICAgKiBNYXBzIG5hdGl2ZSBlcnJvciBjb2RlcyB0byBEQidzIHBvcnRhYmxlIG9uZXMuCiAgICAgKgogICAgICogUmVxdWlyZXMgdGhhdCB0aGUgREIgaW1wbGVtZW50YXRpb24ncyBjb25zdHJ1Y3RvciBmaWxscwogICAgICogaW4gdGhlIDx2YXI+JGVycm9yY29kZV9tYXA8L3Zhcj4gcHJvcGVydHkuCiAgICAgKgogICAgICogQHBhcmFtICBzdHJpbmcgICRuYXRpdmVjb2RlICBlcnJvciBjb2RlIHJldHVybmVkIGJ5IHRoZSBkYXRhYmFzZQogICAgICogQHJldHVybiBpbnQgYSBwb3J0YWJsZSBEQiBlcnJvciBjb2RlLCBvciBEQl9FUlJPUiBpZiB0aGlzIERCCiAgICAgKiBpbXBsZW1lbnRhdGlvbiBoYXMgbm8gbWFwcGluZyBmb3IgdGhlIGdpdmVuIGVycm9yIGNvZGUuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGVycm9yQ29kZSgkbmF0aXZlY29kZSkKICAgIHsKICAgICAgICBpZiAoZXJlZygnU1FMQ09ERT0oLiopXScsICRuYXRpdmVjb2RlLCAkbWF0Y2gpKSB7CiAgICAgICAgICAgICRjb2RlID0gJG1hdGNoWzFdOwogICAgICAgICAgICBpZiAoaXNzZXQoJHRoaXMtPmVycm9yY29kZV9tYXBbJGNvZGVdKSkgewogICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5lcnJvcmNvZGVfbWFwWyRjb2RlXTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gREJfRVJST1I7CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgdGFibGVJbmZvKCkKCiAgICAvKioKICAgICAqIFJldHVybnMgaW5mb3JtYXRpb24gYWJvdXQgYSB0YWJsZSBvciBhIHJlc3VsdCBzZXQKICAgICAqCiAgICAgKiBOT1RFOiBvbmx5IHN1cHBvcnRzICd0YWJsZScgaWYgPHZhcj4kcmVzdWx0PC92YXI+IGlzIGEgdGFibGUgbmFtZS4KICAgICAqCiAgICAgKiBJZiBhbmFseXppbmcgYSBxdWVyeSByZXN1bHQgYW5kIHRoZSByZXN1bHQgaGFzIGR1cGxpY2F0ZSBmaWVsZCBuYW1lcywKICAgICAqIGFuIGVycm9yIHdpbGwgYmUgcmFpc2VkIHNheWluZwogICAgICogPHNhbXA+Y2FuJ3QgZGlzdGluZ3Vpc2ggZHVwbGljYXRlIGZpZWxkIG5hbWVzPC9zYW1wPi4KICAgICAqCiAgICAgKiBAcGFyYW0gb2JqZWN0fHN0cmluZyAgJHJlc3VsdCAgREJfcmVzdWx0IG9iamVjdCBmcm9tIGEgcXVlcnkgb3IgYQogICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgY29udGFpbmluZyB0aGUgbmFtZSBvZiBhIHRhYmxlLgogICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaGlsZSB0aGlzIGFsc28gYWNjZXB0cyBhIHF1ZXJ5IHJlc3VsdAogICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZSBpZGVudGlmaWVyLCB0aGlzIGJlaGF2aW9yIGlzCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHJlY2F0ZWQuCiAgICAgKiBAcGFyYW0gaW50ICAgICAgICAgICAgJG1vZGUgICAgYSB2YWxpZCB0YWJsZUluZm8gbW9kZQogICAgICoKICAgICAqIEByZXR1cm4gYXJyYXkgIGFuIGFzc29jaWF0aXZlIGFycmF5IHdpdGggdGhlIGluZm9ybWF0aW9uIHJlcXVlc3RlZC4KICAgICAqICAgICAgICAgICAgICAgICBBIERCX0Vycm9yIG9iamVjdCBvbiBmYWlsdXJlLgogICAgICoKICAgICAqIEBzZWUgREJfY29tbW9uOjp0YWJsZUluZm8oKQogICAgICogQHNpbmNlIE1ldGhvZCBhdmFpbGFibGUgc2luY2UgUmVsZWFzZSAxLjYuMAogICAgICovCiAgICBmdW5jdGlvbiB0YWJsZUluZm8oJHJlc3VsdCwgJG1vZGUgPSBudWxsKQogICAgewogICAgICAgIGlmIChpc19zdHJpbmcoJHJlc3VsdCkpIHsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogUHJvYmFibHkgcmVjZWl2ZWQgYSB0YWJsZSBuYW1lLgogICAgICAgICAgICAgKiBDcmVhdGUgYSByZXN1bHQgcmVzb3VyY2UgaWRlbnRpZmllci4KICAgICAgICAgICAgICovCiAgICAgICAgICAgICRpZCA9IEBpZnhfcXVlcnkoIlNFTEVDVCAqIEZST00gJHJlc3VsdCBXSEVSRSAxPTAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5jb25uZWN0aW9uKTsKICAgICAgICAgICAgJGdvdF9zdHJpbmcgPSB0cnVlOwogICAgICAgIH0gZWxzZWlmIChpc3NldCgkcmVzdWx0LT5yZXN1bHQpKSB7CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIFByb2JhYmx5IHJlY2VpdmVkIGEgcmVzdWx0IG9iamVjdC4KICAgICAgICAgICAgICogRXh0cmFjdCB0aGUgcmVzdWx0IHJlc291cmNlIGlkZW50aWZpZXIuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICAkaWQgPSAkcmVzdWx0LT5yZXN1bHQ7CiAgICAgICAgICAgICRnb3Rfc3RyaW5nID0gZmFsc2U7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogUHJvYmFibHkgcmVjZWl2ZWQgYSByZXN1bHQgcmVzb3VyY2UgaWRlbnRpZmllci4KICAgICAgICAgICAgICogQ29weSBpdC4KICAgICAgICAgICAgICovCiAgICAgICAgICAgICRpZCA9ICRyZXN1bHQ7CiAgICAgICAgICAgICRnb3Rfc3RyaW5nID0gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICBpZiAoIWlzX3Jlc291cmNlKCRpZCkpIHsKICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5pZnhSYWlzZUVycm9yKERCX0VSUk9SX05FRURfTU9SRV9EQVRBKTsKICAgICAgICB9CgogICAgICAgICRmbGRzID0gQGlmeF9maWVsZHByb3BlcnRpZXMoJGlkKTsKICAgICAgICAkY291bnQgPSBAaWZ4X251bV9maWVsZHMoJGlkKTsKCiAgICAgICAgaWYgKGNvdW50KCRmbGRzKSAhPSAkY291bnQpIHsKICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5yYWlzZUVycm9yKCJjYW4ndCBkaXN0aW5ndWlzaCBkdXBsaWNhdGUgZmllbGQgbmFtZXMiKTsKICAgICAgICB9CgogICAgICAgIGlmICgkdGhpcy0+b3B0aW9uc1sncG9ydGFiaWxpdHknXSAmIERCX1BPUlRBQklMSVRZX0xPV0VSQ0FTRSkgewogICAgICAgICAgICAkY2FzZV9mdW5jID0gJ3N0cnRvbG93ZXInOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRjYXNlX2Z1bmMgPSAnc3RydmFsJzsKICAgICAgICB9CgogICAgICAgICRpICAgPSAwOwogICAgICAgICRyZXMgPSBhcnJheSgpOwoKICAgICAgICBpZiAoJG1vZGUpIHsKICAgICAgICAgICAgJHJlc1snbnVtX2ZpZWxkcyddID0gJGNvdW50OwogICAgICAgIH0KCiAgICAgICAgZm9yZWFjaCAoJGZsZHMgYXMgJGtleSA9PiAkdmFsdWUpIHsKICAgICAgICAgICAgJHByb3BzID0gZXhwbG9kZSgnOycsICR2YWx1ZSk7CiAgICAgICAgICAgICRyZXNbJGldID0gYXJyYXkoCiAgICAgICAgICAgICAgICAndGFibGUnID0+ICRnb3Rfc3RyaW5nID8gJGNhc2VfZnVuYygkcmVzdWx0KSA6ICcnLAogICAgICAgICAgICAgICAgJ25hbWUnICA9PiAkY2FzZV9mdW5jKCRrZXkpLAogICAgICAgICAgICAgICAgJ3R5cGUnICA9PiAkcHJvcHNbMF0sCiAgICAgICAgICAgICAgICAnbGVuJyAgID0+ICRwcm9wc1sxXSwKICAgICAgICAgICAgICAgICdmbGFncycgPT4gJHByb3BzWzRdID09ICdOJyA/ICdub3RfbnVsbCcgOiAnJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCRtb2RlICYgREJfVEFCTEVJTkZPX09SREVSKSB7CiAgICAgICAgICAgICAgICAkcmVzWydvcmRlciddWyRyZXNbJGldWyduYW1lJ11dID0gJGk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCRtb2RlICYgREJfVEFCTEVJTkZPX09SREVSVEFCTEUpIHsKICAgICAgICAgICAgICAgICRyZXNbJ29yZGVydGFibGUnXVskcmVzWyRpXVsndGFibGUnXV1bJHJlc1skaV1bJ25hbWUnXV0gPSAkaTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkaSsrOwogICAgICAgIH0KCiAgICAgICAgLy8gZnJlZSB0aGUgcmVzdWx0IG9ubHkgaWYgd2Ugd2VyZSBjYWxsZWQgb24gYSB0YWJsZQogICAgICAgIGlmICgkZ290X3N0cmluZykgewogICAgICAgICAgICBAaWZ4X2ZyZWVfcmVzdWx0KCRpZCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiAkcmVzOwogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IGdldFNwZWNpYWxRdWVyeSgpCgogICAgLyoqCiAgICAgKiBPYnRhaW5zIHRoZSBxdWVyeSBzdHJpbmcgbmVlZGVkIGZvciBsaXN0aW5nIGEgZ2l2ZW4gdHlwZSBvZiBvYmplY3RzCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkdHlwZSAgdGhlIGtpbmQgb2Ygb2JqZWN0cyB5b3Ugd2FudCB0byByZXRyaWV2ZQogICAgICoKICAgICAqIEByZXR1cm4gc3RyaW5nICB0aGUgU1FMIHF1ZXJ5IHN0cmluZyBvciBudWxsIGlmIHRoZSBkcml2ZXIgZG9lc24ndAogICAgICogICAgICAgICAgICAgICAgICBzdXBwb3J0IHRoZSBvYmplY3QgdHlwZSByZXF1ZXN0ZWQKICAgICAqCiAgICAgKiBAYWNjZXNzIHByb3RlY3RlZAogICAgICogQHNlZSBEQl9jb21tb246OmdldExpc3RPZigpCiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldFNwZWNpYWxRdWVyeSgkdHlwZSkKICAgIHsKICAgICAgICBzd2l0Y2ggKCR0eXBlKSB7CiAgICAgICAgICAgIGNhc2UgJ3RhYmxlcyc6CiAgICAgICAgICAgICAgICByZXR1cm4gJ1NFTEVDVCB0YWJuYW1lIEZST00gc3lzdGFibGVzIFdIRVJFIHRhYmlkID49IDEwMCc7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICB9CgogICAgLy8gfX19Cgp9CgovKgogKiBMb2NhbCB2YXJpYWJsZXM6CiAqIHRhYi13aWR0aDogNAogKiBjLWJhc2ljLW9mZnNldDogNAogKiBFbmQ6CiAqLwoKPz4K]]></data>
	</file>
	<file>
	  <filename>/lib/pear/DB/msql.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qIHZpbTogc2V0IGV4cGFuZHRhYiB0YWJzdG9wPTQgc2hpZnR3aWR0aD00IHNvZnR0YWJzdG9wPTQ6ICovCgovKioKICogVGhlIFBFQVIgREIgZHJpdmVyIGZvciBQSFAncyBtc3FsIGV4dGVuc2lvbgogKiBmb3IgaW50ZXJhY3Rpbmcgd2l0aCBNaW5pIFNRTCBkYXRhYmFzZXMKICoKICogUEhQJ3MgbVNRTCBleHRlbnNpb24gZGlkIHdlaXJkIHRoaW5ncyB3aXRoIE5VTEwgdmFsdWVzIHByaW9yIHRvIFBIUAogKiA0LjMuMTEgYW5kIDUuMC40LiAgTWFrZSBzdXJlIHlvdXIgdmVyc2lvbiBvZiBQSFAgbWVldHMgb3IgZXhjZWVkcwogKiB0aG9zZSB2ZXJzaW9ucy4KICoKICogUEhQIHZlcnNpb25zIDQgYW5kIDUKICoKICogTElDRU5TRTogVGhpcyBzb3VyY2UgZmlsZSBpcyBzdWJqZWN0IHRvIHZlcnNpb24gMy4wIG9mIHRoZSBQSFAgbGljZW5zZQogKiB0aGF0IGlzIGF2YWlsYWJsZSB0aHJvdWdoIHRoZSB3b3JsZC13aWRlLXdlYiBhdCB0aGUgZm9sbG93aW5nIFVSSToKICogaHR0cDovL3d3dy5waHAubmV0L2xpY2Vuc2UvM18wLnR4dC4gIElmIHlvdSBkaWQgbm90IHJlY2VpdmUgYSBjb3B5IG9mCiAqIHRoZSBQSFAgTGljZW5zZSBhbmQgYXJlIHVuYWJsZSB0byBvYnRhaW4gaXQgdGhyb3VnaCB0aGUgd2ViLCBwbGVhc2UKICogc2VuZCBhIG5vdGUgdG8gbGljZW5zZUBwaHAubmV0IHNvIHdlIGNhbiBtYWlsIHlvdSBhIGNvcHkgaW1tZWRpYXRlbHkuCiAqCiAqIEBjYXRlZ29yeSAgIERhdGFiYXNlCiAqIEBwYWNrYWdlICAgIERCCiAqIEBhdXRob3IgICAgIERhbmllbCBDb252aXNzb3IgPGRhbmllbGNAcGhwLm5ldD4KICogQGNvcHlyaWdodCAgMTk5Ny0yMDA1IFRoZSBQSFAgR3JvdXAKICogQGxpY2Vuc2UgICAgaHR0cDovL3d3dy5waHAubmV0L2xpY2Vuc2UvM18wLnR4dCAgUEhQIExpY2Vuc2UgMy4wCiAqIEB2ZXJzaW9uICAgIENWUzogJElkOiBtc3FsLnBocCx2IDEuNjIgMjAwNy8wMS8xMiAwMzoxMToxNyBhaGFydmV5IEV4cCAkCiAqIEBsaW5rICAgICAgIGh0dHA6Ly9wZWFyLnBocC5uZXQvcGFja2FnZS9EQgogKi8KCi8qKgogKiBPYnRhaW4gdGhlIERCX2NvbW1vbiBjbGFzcyBzbyBpdCBjYW4gYmUgZXh0ZW5kZWQgZnJvbQogKi8KcmVxdWlyZV9vbmNlICdEQi9jb21tb24ucGhwJzsKCi8qKgogKiBUaGUgbWV0aG9kcyBQRUFSIERCIHVzZXMgdG8gaW50ZXJhY3Qgd2l0aCBQSFAncyBtc3FsIGV4dGVuc2lvbgogKiBmb3IgaW50ZXJhY3Rpbmcgd2l0aCBNaW5pIFNRTCBkYXRhYmFzZXMKICoKICogVGhlc2UgbWV0aG9kcyBvdmVybG9hZCB0aGUgb25lcyBkZWNsYXJlZCBpbiBEQl9jb21tb24uCiAqCiAqIFBIUCdzIG1TUUwgZXh0ZW5zaW9uIGRpZCB3ZWlyZCB0aGluZ3Mgd2l0aCBOVUxMIHZhbHVlcyBwcmlvciB0byBQSFAKICogNC4zLjExIGFuZCA1LjAuNC4gIE1ha2Ugc3VyZSB5b3VyIHZlcnNpb24gb2YgUEhQIG1lZXRzIG9yIGV4Y2VlZHMKICogdGhvc2UgdmVyc2lvbnMuCiAqCiAqIEBjYXRlZ29yeSAgIERhdGFiYXNlCiAqIEBwYWNrYWdlICAgIERCCiAqIEBhdXRob3IgICAgIERhbmllbCBDb252aXNzb3IgPGRhbmllbGNAcGhwLm5ldD4KICogQGNvcHlyaWdodCAgMTk5Ny0yMDA1IFRoZSBQSFAgR3JvdXAKICogQGxpY2Vuc2UgICAgaHR0cDovL3d3dy5waHAubmV0L2xpY2Vuc2UvM18wLnR4dCAgUEhQIExpY2Vuc2UgMy4wCiAqIEB2ZXJzaW9uICAgIFJlbGVhc2U6IDEuNy4xMgogKiBAbGluayAgICAgICBodHRwOi8vcGVhci5waHAubmV0L3BhY2thZ2UvREIKICogQHNpbmNlICAgICAgQ2xhc3Mgbm90IGZ1bmN0aW9uYWwgdW50aWwgUmVsZWFzZSAxLjcuMAogKi8KY2xhc3MgREJfbXNxbCBleHRlbmRzIERCX2NvbW1vbgp7CiAgICAvLyB7e3sgcHJvcGVydGllcwoKICAgIC8qKgogICAgICogVGhlIERCIGRyaXZlciB0eXBlIChteXNxbCwgb2NpOCwgb2RiYywgZXRjLikKICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHZhciAkcGhwdHlwZSA9ICdtc3FsJzsKCiAgICAvKioKICAgICAqIFRoZSBkYXRhYmFzZSBzeW50YXggdmFyaWFudCB0byBiZSB1c2VkIChkYjIsIGFjY2VzcywgZXRjLiksIGlmIGFueQogICAgICogQHZhciBzdHJpbmcKICAgICAqLwogICAgdmFyICRkYnN5bnRheCA9ICdtc3FsJzsKCiAgICAvKioKICAgICAqIFRoZSBjYXBhYmlsaXRpZXMgb2YgdGhpcyBEQiBpbXBsZW1lbnRhdGlvbgogICAgICoKICAgICAqIFRoZSAnbmV3X2xpbmsnIGVsZW1lbnQgY29udGFpbnMgdGhlIFBIUCB2ZXJzaW9uIHRoYXQgZmlyc3QgcHJvdmlkZWQKICAgICAqIG5ld19saW5rIHN1cHBvcnQgZm9yIHRoaXMgREJNUy4gIENvbnRhaW5zIGZhbHNlIGlmIGl0J3MgdW5zdXBwb3J0ZWQuCiAgICAgKgogICAgICogTWVhbmluZyBvZiB0aGUgJ2xpbWl0JyBlbGVtZW50OgogICAgICogICArICdlbXVsYXRlJyA9IGVtdWxhdGUgd2l0aCBmZXRjaCByb3cgYnkgbnVtYmVyCiAgICAgKiAgICsgJ2FsdGVyJyAgID0gYWx0ZXIgdGhlIHF1ZXJ5CiAgICAgKiAgICsgZmFsc2UgICAgID0gc2tpcCByb3dzCiAgICAgKgogICAgICogQHZhciBhcnJheQogICAgICovCiAgICB2YXIgJGZlYXR1cmVzID0gYXJyYXkoCiAgICAgICAgJ2xpbWl0JyAgICAgICAgID0+ICdlbXVsYXRlJywKICAgICAgICAnbmV3X2xpbmsnICAgICAgPT4gZmFsc2UsCiAgICAgICAgJ251bXJvd3MnICAgICAgID0+IHRydWUsCiAgICAgICAgJ3Bjb25uZWN0JyAgICAgID0+IHRydWUsCiAgICAgICAgJ3ByZXBhcmUnICAgICAgID0+IGZhbHNlLAogICAgICAgICdzc2wnICAgICAgICAgICA9PiBmYWxzZSwKICAgICAgICAndHJhbnNhY3Rpb25zJyAgPT4gZmFsc2UsCiAgICApOwoKICAgIC8qKgogICAgICogQSBtYXBwaW5nIG9mIG5hdGl2ZSBlcnJvciBjb2RlcyB0byBEQiBlcnJvciBjb2RlcwogICAgICogQHZhciBhcnJheQogICAgICovCiAgICB2YXIgJGVycm9yY29kZV9tYXAgPSBhcnJheSgKICAgICk7CgogICAgLyoqCiAgICAgKiBUaGUgcmF3IGRhdGFiYXNlIGNvbm5lY3Rpb24gY3JlYXRlZCBieSBQSFAKICAgICAqIEB2YXIgcmVzb3VyY2UKICAgICAqLwogICAgdmFyICRjb25uZWN0aW9uOwoKICAgIC8qKgogICAgICogVGhlIERTTiBpbmZvcm1hdGlvbiBmb3IgY29ubmVjdGluZyB0byBhIGRhdGFiYXNlCiAgICAgKiBAdmFyIGFycmF5CiAgICAgKi8KICAgIHZhciAkZHNuID0gYXJyYXkoKTsKCgogICAgLyoqCiAgICAgKiBUaGUgcXVlcnkgcmVzdWx0IHJlc291cmNlIGNyZWF0ZWQgYnkgUEhQCiAgICAgKgogICAgICogVXNlZCB0byBtYWtlIGFmZmVjdGVkUm93cygpIHdvcmsuICBPbmx5IGNvbnRhaW5zIHRoZSByZXN1bHQgZm9yCiAgICAgKiBkYXRhIG1hbmlwdWxhdGlvbiBxdWVyaWVzLiAgQ29udGFpbnMgZmFsc2UgZm9yIG90aGVyIHF1ZXJpZXMuCiAgICAgKgogICAgICogQHZhciByZXNvdXJjZQogICAgICogQGFjY2VzcyBwcml2YXRlCiAgICAgKi8KICAgIHZhciAkX3Jlc3VsdDsKCgogICAgLy8gfX19CiAgICAvLyB7e3sgY29uc3RydWN0b3IKCiAgICAvKioKICAgICAqIFRoaXMgY29uc3RydWN0b3IgY2FsbHMgPGtiZD4kdGhpcy0+REJfY29tbW9uKCk8L2tiZD4KICAgICAqCiAgICAgKiBAcmV0dXJuIHZvaWQKICAgICAqLwogICAgZnVuY3Rpb24gREJfbXNxbCgpCiAgICB7CiAgICAgICAgJHRoaXMtPkRCX2NvbW1vbigpOwogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IGNvbm5lY3QoKQoKICAgIC8qKgogICAgICogQ29ubmVjdCB0byB0aGUgZGF0YWJhc2Ugc2VydmVyLCBsb2cgaW4gYW5kIG9wZW4gdGhlIGRhdGFiYXNlCiAgICAgKgogICAgICogRG9uJ3QgY2FsbCB0aGlzIG1ldGhvZCBkaXJlY3RseS4gIFVzZSBEQjo6Y29ubmVjdCgpIGluc3RlYWQuCiAgICAgKgogICAgICogRXhhbXBsZSBvZiBob3cgdG8gY29ubmVjdDoKICAgICAqIDxjb2RlPgogICAgICogcmVxdWlyZV9vbmNlICdEQi5waHAnOwogICAgICogCiAgICAgKiAvLyAkZHNuID0gJ21zcWw6Ly9ob3N0bmFtZS9kYm5hbWUnOyAgLy8gdXNlIGEgVENQIGNvbm5lY3Rpb24KICAgICAqICRkc24gPSAnbXNxbDovLy9kYm5hbWUnOyAgICAgICAgICAgICAvLyB1c2UgYSBzb2NrZXQKICAgICAqICRvcHRpb25zID0gYXJyYXkoCiAgICAgKiAgICAgJ3BvcnRhYmlsaXR5JyA9PiBEQl9QT1JUQUJJTElUWV9BTEwsCiAgICAgKiApOwogICAgICogCiAgICAgKiAkZGIgPSYgREI6OmNvbm5lY3QoJGRzbiwgJG9wdGlvbnMpOwogICAgICogaWYgKFBFQVI6OmlzRXJyb3IoJGRiKSkgewogICAgICogICAgIGRpZSgkZGItPmdldE1lc3NhZ2UoKSk7CiAgICAgKiB9CiAgICAgKiA8L2NvZGU+CiAgICAgKgogICAgICogQHBhcmFtIGFycmF5ICRkc24gICAgICAgICB0aGUgZGF0YSBzb3VyY2UgbmFtZQogICAgICogQHBhcmFtIGJvb2wgICRwZXJzaXN0ZW50ICBzaG91bGQgdGhlIGNvbm5lY3Rpb24gYmUgcGVyc2lzdGVudD8KICAgICAqCiAgICAgKiBAcmV0dXJuIGludCAgREJfT0sgb24gc3VjY2Vzcy4gQSBEQl9FcnJvciBvYmplY3Qgb24gZmFpbHVyZS4KICAgICAqLwogICAgZnVuY3Rpb24gY29ubmVjdCgkZHNuLCAkcGVyc2lzdGVudCA9IGZhbHNlKQogICAgewogICAgICAgIGlmICghUEVBUjo6bG9hZEV4dGVuc2lvbignbXNxbCcpKSB7CiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+cmFpc2VFcnJvcihEQl9FUlJPUl9FWFRFTlNJT05fTk9UX0ZPVU5EKTsKICAgICAgICB9CgogICAgICAgICR0aGlzLT5kc24gPSAkZHNuOwogICAgICAgIGlmICgkZHNuWydkYnN5bnRheCddKSB7CiAgICAgICAgICAgICR0aGlzLT5kYnN5bnRheCA9ICRkc25bJ2Ric3ludGF4J107CiAgICAgICAgfQoKICAgICAgICAkcGFyYW1zID0gYXJyYXkoKTsKICAgICAgICBpZiAoJGRzblsnaG9zdHNwZWMnXSkgewogICAgICAgICAgICAkcGFyYW1zW10gPSAkZHNuWydwb3J0J10KICAgICAgICAgICAgICAgICAgICAgICAgPyAkZHNuWydob3N0c3BlYyddIC4gJywnIC4gJGRzblsncG9ydCddCiAgICAgICAgICAgICAgICAgICAgICAgIDogJGRzblsnaG9zdHNwZWMnXTsKICAgICAgICB9CgogICAgICAgICRjb25uZWN0X2Z1bmN0aW9uID0gJHBlcnNpc3RlbnQgPyAnbXNxbF9wY29ubmVjdCcgOiAnbXNxbF9jb25uZWN0JzsKCiAgICAgICAgJGluaSA9IGluaV9nZXQoJ3RyYWNrX2Vycm9ycycpOwogICAgICAgICRwaHBfZXJyb3Jtc2cgPSAnJzsKICAgICAgICBpZiAoJGluaSkgewogICAgICAgICAgICAkdGhpcy0+Y29ubmVjdGlvbiA9IEBjYWxsX3VzZXJfZnVuY19hcnJheSgkY29ubmVjdF9mdW5jdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHBhcmFtcyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgQGluaV9zZXQoJ3RyYWNrX2Vycm9ycycsIDEpOwogICAgICAgICAgICAkdGhpcy0+Y29ubmVjdGlvbiA9IEBjYWxsX3VzZXJfZnVuY19hcnJheSgkY29ubmVjdF9mdW5jdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHBhcmFtcyk7CiAgICAgICAgICAgIEBpbmlfc2V0KCd0cmFja19lcnJvcnMnLCAkaW5pKTsKICAgICAgICB9CgogICAgICAgIGlmICghJHRoaXMtPmNvbm5lY3Rpb24pIHsKICAgICAgICAgICAgaWYgKCgkZXJyID0gQG1zcWxfZXJyb3IoKSkgIT0gJycpIHsKICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+cmFpc2VFcnJvcihEQl9FUlJPUl9DT05ORUNUX0ZBSUxFRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBudWxsLCBudWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRlcnIpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5yYWlzZUVycm9yKERCX0VSUk9SX0NPTk5FQ1RfRkFJTEVELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIG51bGwsIG51bGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHBocF9lcnJvcm1zZyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICghQG1zcWxfc2VsZWN0X2RiKCRkc25bJ2RhdGFiYXNlJ10sICR0aGlzLT5jb25uZWN0aW9uKSkgewogICAgICAgICAgICByZXR1cm4gJHRoaXMtPm1zcWxSYWlzZUVycm9yKCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBEQl9PSzsKICAgIH0KCiAgICAvLyB9fX0KICAgIC8vIHt7eyBkaXNjb25uZWN0KCkKCiAgICAvKioKICAgICAqIERpc2Nvbm5lY3RzIGZyb20gdGhlIGRhdGFiYXNlIHNlcnZlcgogICAgICoKICAgICAqIEByZXR1cm4gYm9vbCAgVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlCiAgICAgKi8KICAgIGZ1bmN0aW9uIGRpc2Nvbm5lY3QoKQogICAgewogICAgICAgICRyZXQgPSBAbXNxbF9jbG9zZSgkdGhpcy0+Y29ubmVjdGlvbik7CiAgICAgICAgJHRoaXMtPmNvbm5lY3Rpb24gPSBudWxsOwogICAgICAgIHJldHVybiAkcmV0OwogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IHNpbXBsZVF1ZXJ5KCkKCiAgICAvKioKICAgICAqIFNlbmRzIGEgcXVlcnkgdG8gdGhlIGRhdGFiYXNlIHNlcnZlcgogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgIHRoZSBTUUwgcXVlcnkgc3RyaW5nCiAgICAgKgogICAgICogQHJldHVybiBtaXhlZCAgKyBhIFBIUCByZXN1bHQgcmVzcm91Y2UgZm9yIHN1Y2Nlc3NmdWwgU0VMRUNUIHF1ZXJpZXMKICAgICAqICAgICAgICAgICAgICAgICsgdGhlIERCX09LIGNvbnN0YW50IGZvciBvdGhlciBzdWNjZXNzZnVsIHF1ZXJpZXMKICAgICAqICAgICAgICAgICAgICAgICsgYSBEQl9FcnJvciBvYmplY3Qgb24gZmFpbHVyZQogICAgICovCiAgICBmdW5jdGlvbiBzaW1wbGVRdWVyeSgkcXVlcnkpCiAgICB7CiAgICAgICAgJHRoaXMtPmxhc3RfcXVlcnkgPSAkcXVlcnk7CiAgICAgICAgJHF1ZXJ5ID0gJHRoaXMtPm1vZGlmeVF1ZXJ5KCRxdWVyeSk7CiAgICAgICAgJHJlc3VsdCA9IEBtc3FsX3F1ZXJ5KCRxdWVyeSwgJHRoaXMtPmNvbm5lY3Rpb24pOwogICAgICAgIGlmICghJHJlc3VsdCkgewogICAgICAgICAgICByZXR1cm4gJHRoaXMtPm1zcWxSYWlzZUVycm9yKCk7CiAgICAgICAgfQogICAgICAgIC8vIERldGVybWluZSB3aGljaCBxdWVyaWVzIHRoYXQgc2hvdWxkIHJldHVybiBkYXRhLCBhbmQgd2hpY2gKICAgICAgICAvLyBzaG91bGQgcmV0dXJuIGFuIGVycm9yIGNvZGUgb25seS4KICAgICAgICBpZiAoJHRoaXMtPl9jaGVja01hbmlwKCRxdWVyeSkpIHsKICAgICAgICAgICAgJHRoaXMtPl9yZXN1bHQgPSAkcmVzdWx0OwogICAgICAgICAgICByZXR1cm4gREJfT0s7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJHRoaXMtPl9yZXN1bHQgPSBmYWxzZTsKICAgICAgICAgICAgcmV0dXJuICRyZXN1bHQ7CiAgICAgICAgfQogICAgfQoKCiAgICAvLyB9fX0KICAgIC8vIHt7eyBuZXh0UmVzdWx0KCkKCiAgICAvKioKICAgICAqIE1vdmUgdGhlIGludGVybmFsIG1zcWwgcmVzdWx0IHBvaW50ZXIgdG8gdGhlIG5leHQgYXZhaWxhYmxlIHJlc3VsdAogICAgICoKICAgICAqIEBwYXJhbSBhIHZhbGlkIGZic3FsIHJlc3VsdCByZXNvdXJjZQogICAgICoKICAgICAqIEBhY2Nlc3MgcHVibGljCiAgICAgKgogICAgICogQHJldHVybiB0cnVlIGlmIGEgcmVzdWx0IGlzIGF2YWlsYWJsZSBvdGhlcndpc2UgcmV0dXJuIGZhbHNlCiAgICAgKi8KICAgIGZ1bmN0aW9uIG5leHRSZXN1bHQoJHJlc3VsdCkKICAgIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgZmV0Y2hJbnRvKCkKCiAgICAvKioKICAgICAqIFBsYWNlcyBhIHJvdyBmcm9tIHRoZSByZXN1bHQgc2V0IGludG8gdGhlIGdpdmVuIGFycmF5CiAgICAgKgogICAgICogRm9ybWF0aW5nIG9mIHRoZSBhcnJheSBhbmQgdGhlIGRhdGEgdGhlcmVpbiBhcmUgY29uZmlndXJhYmxlLgogICAgICogU2VlIERCX3Jlc3VsdDo6ZmV0Y2hJbnRvKCkgZm9yIG1vcmUgaW5mb3JtYXRpb24uCiAgICAgKgogICAgICogVGhpcyBtZXRob2QgaXMgbm90IG1lYW50IHRvIGJlIGNhbGxlZCBkaXJlY3RseS4gIFVzZQogICAgICogREJfcmVzdWx0OjpmZXRjaEludG8oKSBpbnN0ZWFkLiAgSXQgY2FuJ3QgYmUgZGVjbGFyZWQgInByb3RlY3RlZCIKICAgICAqIGJlY2F1c2UgREJfcmVzdWx0IGlzIGEgc2VwYXJhdGUgb2JqZWN0LgogICAgICoKICAgICAqIFBIUCdzIG1TUUwgZXh0ZW5zaW9uIGRpZCB3ZWlyZCB0aGluZ3Mgd2l0aCBOVUxMIHZhbHVlcyBwcmlvciB0byBQSFAKICAgICAqIDQuMy4xMSBhbmQgNS4wLjQuICBNYWtlIHN1cmUgeW91ciB2ZXJzaW9uIG9mIFBIUCBtZWV0cyBvciBleGNlZWRzCiAgICAgKiB0aG9zZSB2ZXJzaW9ucy4KICAgICAqCiAgICAgKiBAcGFyYW0gcmVzb3VyY2UgJHJlc3VsdCAgICB0aGUgcXVlcnkgcmVzdWx0IHJlc291cmNlCiAgICAgKiBAcGFyYW0gYXJyYXkgICAgJGFyciAgICAgICB0aGUgcmVmZXJlbmNlZCBhcnJheSB0byBwdXQgdGhlIGRhdGEgaW4KICAgICAqIEBwYXJhbSBpbnQgICAgICAkZmV0Y2htb2RlIGhvdyB0aGUgcmVzdWx0aW5nIGFycmF5IHNob3VsZCBiZSBpbmRleGVkCiAgICAgKiBAcGFyYW0gaW50ICAgICAgJHJvd251bSAgICB0aGUgcm93IG51bWJlciB0byBmZXRjaCAoMCA9IGZpcnN0IHJvdykKICAgICAqCiAgICAgKiBAcmV0dXJuIG1peGVkICBEQl9PSyBvbiBzdWNjZXNzLCBOVUxMIHdoZW4gdGhlIGVuZCBvZiBhIHJlc3VsdCBzZXQgaXMKICAgICAqICAgICAgICAgICAgICAgICByZWFjaGVkIG9yIG9uIGZhaWx1cmUKICAgICAqCiAgICAgKiBAc2VlIERCX3Jlc3VsdDo6ZmV0Y2hJbnRvKCkKICAgICAqLwogICAgZnVuY3Rpb24gZmV0Y2hJbnRvKCRyZXN1bHQsICYkYXJyLCAkZmV0Y2htb2RlLCAkcm93bnVtID0gbnVsbCkKICAgIHsKICAgICAgICBpZiAoJHJvd251bSAhPT0gbnVsbCkgewogICAgICAgICAgICBpZiAoIUBtc3FsX2RhdGFfc2VlaygkcmVzdWx0LCAkcm93bnVtKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCRmZXRjaG1vZGUgJiBEQl9GRVRDSE1PREVfQVNTT0MpIHsKICAgICAgICAgICAgJGFyciA9IEBtc3FsX2ZldGNoX2FycmF5KCRyZXN1bHQsIE1TUUxfQVNTT0MpOwogICAgICAgICAgICBpZiAoJHRoaXMtPm9wdGlvbnNbJ3BvcnRhYmlsaXR5J10gJiBEQl9QT1JUQUJJTElUWV9MT1dFUkNBU0UgJiYgJGFycikgewogICAgICAgICAgICAgICAgJGFyciA9IGFycmF5X2NoYW5nZV9rZXlfY2FzZSgkYXJyLCBDQVNFX0xPV0VSKTsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRhcnIgPSBAbXNxbF9mZXRjaF9yb3coJHJlc3VsdCk7CiAgICAgICAgfQogICAgICAgIGlmICghJGFycikgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgaWYgKCR0aGlzLT5vcHRpb25zWydwb3J0YWJpbGl0eSddICYgREJfUE9SVEFCSUxJVFlfUlRSSU0pIHsKICAgICAgICAgICAgJHRoaXMtPl9ydHJpbUFycmF5VmFsdWVzKCRhcnIpOwogICAgICAgIH0KICAgICAgICBpZiAoJHRoaXMtPm9wdGlvbnNbJ3BvcnRhYmlsaXR5J10gJiBEQl9QT1JUQUJJTElUWV9OVUxMX1RPX0VNUFRZKSB7CiAgICAgICAgICAgICR0aGlzLT5fY29udmVydE51bGxBcnJheVZhbHVlc1RvRW1wdHkoJGFycik7CiAgICAgICAgfQogICAgICAgIHJldHVybiBEQl9PSzsKICAgIH0KCiAgICAvLyB9fX0KICAgIC8vIHt7eyBmcmVlUmVzdWx0KCkKCiAgICAvKioKICAgICAqIERlbGV0ZXMgdGhlIHJlc3VsdCBzZXQgYW5kIGZyZWVzIHRoZSBtZW1vcnkgb2NjdXBpZWQgYnkgdGhlIHJlc3VsdCBzZXQKICAgICAqCiAgICAgKiBUaGlzIG1ldGhvZCBpcyBub3QgbWVhbnQgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LiAgVXNlCiAgICAgKiBEQl9yZXN1bHQ6OmZyZWUoKSBpbnN0ZWFkLiAgSXQgY2FuJ3QgYmUgZGVjbGFyZWQgInByb3RlY3RlZCIKICAgICAqIGJlY2F1c2UgREJfcmVzdWx0IGlzIGEgc2VwYXJhdGUgb2JqZWN0LgogICAgICoKICAgICAqIEBwYXJhbSByZXNvdXJjZSAkcmVzdWx0ICBQSFAncyBxdWVyeSByZXN1bHQgcmVzb3VyY2UKICAgICAqCiAgICAgKiBAcmV0dXJuIGJvb2wgIFRSVUUgb24gc3VjY2VzcywgRkFMU0UgaWYgJHJlc3VsdCBpcyBpbnZhbGlkCiAgICAgKgogICAgICogQHNlZSBEQl9yZXN1bHQ6OmZyZWUoKQogICAgICovCiAgICBmdW5jdGlvbiBmcmVlUmVzdWx0KCRyZXN1bHQpCiAgICB7CiAgICAgICAgcmV0dXJuIGlzX3Jlc291cmNlKCRyZXN1bHQpID8gbXNxbF9mcmVlX3Jlc3VsdCgkcmVzdWx0KSA6IGZhbHNlOwogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IG51bUNvbHMoKQoKICAgIC8qKgogICAgICogR2V0cyB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgaW4gYSByZXN1bHQgc2V0CiAgICAgKgogICAgICogVGhpcyBtZXRob2QgaXMgbm90IG1lYW50IHRvIGJlIGNhbGxlZCBkaXJlY3RseS4gIFVzZQogICAgICogREJfcmVzdWx0OjpudW1Db2xzKCkgaW5zdGVhZC4gIEl0IGNhbid0IGJlIGRlY2xhcmVkICJwcm90ZWN0ZWQiCiAgICAgKiBiZWNhdXNlIERCX3Jlc3VsdCBpcyBhIHNlcGFyYXRlIG9iamVjdC4KICAgICAqCiAgICAgKiBAcGFyYW0gcmVzb3VyY2UgJHJlc3VsdCAgUEhQJ3MgcXVlcnkgcmVzdWx0IHJlc291cmNlCiAgICAgKgogICAgICogQHJldHVybiBpbnQgIHRoZSBudW1iZXIgb2YgY29sdW1ucy4gIEEgREJfRXJyb3Igb2JqZWN0IG9uIGZhaWx1cmUuCiAgICAgKgogICAgICogQHNlZSBEQl9yZXN1bHQ6Om51bUNvbHMoKQogICAgICovCiAgICBmdW5jdGlvbiBudW1Db2xzKCRyZXN1bHQpCiAgICB7CiAgICAgICAgJGNvbHMgPSBAbXNxbF9udW1fZmllbGRzKCRyZXN1bHQpOwogICAgICAgIGlmICghJGNvbHMpIHsKICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5tc3FsUmFpc2VFcnJvcigpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJGNvbHM7CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgbnVtUm93cygpCgogICAgLyoqCiAgICAgKiBHZXRzIHRoZSBudW1iZXIgb2Ygcm93cyBpbiBhIHJlc3VsdCBzZXQKICAgICAqCiAgICAgKiBUaGlzIG1ldGhvZCBpcyBub3QgbWVhbnQgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LiAgVXNlCiAgICAgKiBEQl9yZXN1bHQ6Om51bVJvd3MoKSBpbnN0ZWFkLiAgSXQgY2FuJ3QgYmUgZGVjbGFyZWQgInByb3RlY3RlZCIKICAgICAqIGJlY2F1c2UgREJfcmVzdWx0IGlzIGEgc2VwYXJhdGUgb2JqZWN0LgogICAgICoKICAgICAqIEBwYXJhbSByZXNvdXJjZSAkcmVzdWx0ICBQSFAncyBxdWVyeSByZXN1bHQgcmVzb3VyY2UKICAgICAqCiAgICAgKiBAcmV0dXJuIGludCAgdGhlIG51bWJlciBvZiByb3dzLiAgQSBEQl9FcnJvciBvYmplY3Qgb24gZmFpbHVyZS4KICAgICAqCiAgICAgKiBAc2VlIERCX3Jlc3VsdDo6bnVtUm93cygpCiAgICAgKi8KICAgIGZ1bmN0aW9uIG51bVJvd3MoJHJlc3VsdCkKICAgIHsKICAgICAgICAkcm93cyA9IEBtc3FsX251bV9yb3dzKCRyZXN1bHQpOwogICAgICAgIGlmICgkcm93cyA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5tc3FsUmFpc2VFcnJvcigpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJHJvd3M7CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgYWZmZWN0ZWQoKQoKICAgIC8qKgogICAgICogRGV0ZXJtaW5lcyB0aGUgbnVtYmVyIG9mIHJvd3MgYWZmZWN0ZWQgYnkgYSBkYXRhIG1hbml1cGxhdGlvbiBxdWVyeQogICAgICoKICAgICAqIDAgaXMgcmV0dXJuZWQgZm9yIHF1ZXJpZXMgdGhhdCBkb24ndCBtYW5pcHVsYXRlIGRhdGEuCiAgICAgKgogICAgICogQHJldHVybiBpbnQgIHRoZSBudW1iZXIgb2Ygcm93cy4gIEEgREJfRXJyb3Igb2JqZWN0IG9uIGZhaWx1cmUuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGFmZmVjdGVkUm93cygpCiAgICB7CiAgICAgICAgaWYgKCEkdGhpcy0+X3Jlc3VsdCkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG1zcWxfYWZmZWN0ZWRfcm93cygkdGhpcy0+X3Jlc3VsdCk7CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgbmV4dElkKCkKCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIG5leHQgZnJlZSBpZCBpbiBhIHNlcXVlbmNlCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAgJHNlcV9uYW1lICBuYW1lIG9mIHRoZSBzZXF1ZW5jZQogICAgICogQHBhcmFtIGJvb2xlYW4gJG9uZGVtYW5kICB3aGVuIHRydWUsIHRoZSBzZXFlbmNlIGlzIGF1dG9tYXRpY2FsbHkKICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZWQgaWYgaXQgZG9lcyBub3QgZXhpc3QKICAgICAqCiAgICAgKiBAcmV0dXJuIGludCAgdGhlIG5leHQgaWQgbnVtYmVyIGluIHRoZSBzZXF1ZW5jZS4KICAgICAqICAgICAgICAgICAgICAgQSBEQl9FcnJvciBvYmplY3Qgb24gZmFpbHVyZS4KICAgICAqCiAgICAgKiBAc2VlIERCX2NvbW1vbjo6bmV4dElEKCksIERCX2NvbW1vbjo6Z2V0U2VxdWVuY2VOYW1lKCksCiAgICAgKiAgICAgIERCX21zcWw6OmNyZWF0ZVNlcXVlbmNlKCksIERCX21zcWw6OmRyb3BTZXF1ZW5jZSgpCiAgICAgKi8KICAgIGZ1bmN0aW9uIG5leHRJZCgkc2VxX25hbWUsICRvbmRlbWFuZCA9IHRydWUpCiAgICB7CiAgICAgICAgJHNlcW5hbWUgPSAkdGhpcy0+Z2V0U2VxdWVuY2VOYW1lKCRzZXFfbmFtZSk7CiAgICAgICAgJHJlcGVhdCA9IGZhbHNlOwogICAgICAgIGRvIHsKICAgICAgICAgICAgJHRoaXMtPnB1c2hFcnJvckhhbmRsaW5nKFBFQVJfRVJST1JfUkVUVVJOKTsKICAgICAgICAgICAgJHJlc3VsdCA9JiAkdGhpcy0+cXVlcnkoIlNFTEVDVCBfc2VxIEZST00gJHtzZXFuYW1lfSIpOwogICAgICAgICAgICAkdGhpcy0+cG9wRXJyb3JIYW5kbGluZygpOwogICAgICAgICAgICBpZiAoJG9uZGVtYW5kICYmIERCOjppc0Vycm9yKCRyZXN1bHQpICYmCiAgICAgICAgICAgICAgICAkcmVzdWx0LT5nZXRDb2RlKCkgPT0gREJfRVJST1JfTk9TVUNIVEFCTEUpIHsKICAgICAgICAgICAgICAgICRyZXBlYXQgPSB0cnVlOwogICAgICAgICAgICAgICAgJHRoaXMtPnB1c2hFcnJvckhhbmRsaW5nKFBFQVJfRVJST1JfUkVUVVJOKTsKICAgICAgICAgICAgICAgICRyZXN1bHQgPSAkdGhpcy0+Y3JlYXRlU2VxdWVuY2UoJHNlcV9uYW1lKTsKICAgICAgICAgICAgICAgICR0aGlzLT5wb3BFcnJvckhhbmRsaW5nKCk7CiAgICAgICAgICAgICAgICBpZiAoREI6OmlzRXJyb3IoJHJlc3VsdCkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPnJhaXNlRXJyb3IoJHJlc3VsdCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkcmVwZWF0ID0gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICB9IHdoaWxlICgkcmVwZWF0KTsKICAgICAgICBpZiAoREI6OmlzRXJyb3IoJHJlc3VsdCkpIHsKICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5yYWlzZUVycm9yKCRyZXN1bHQpOwogICAgICAgIH0KICAgICAgICAkYXJyID0gJHJlc3VsdC0+ZmV0Y2hSb3coREJfRkVUQ0hNT0RFX09SREVSRUQpOwogICAgICAgICRyZXN1bHQtPmZyZWUoKTsKICAgICAgICByZXR1cm4gJGFyclswXTsKICAgIH0KCiAgICAvLyB9fX0KICAgIC8vIHt7eyBjcmVhdGVTZXF1ZW5jZSgpCgogICAgLyoqCiAgICAgKiBDcmVhdGVzIGEgbmV3IHNlcXVlbmNlCiAgICAgKgogICAgICogQWxzbyBjcmVhdGVzIGEgbmV3IHRhYmxlIHRvIGFzc29jaWF0ZSB0aGUgc2VxdWVuY2Ugd2l0aC4gIFVzZXMKICAgICAqIGEgc2VwYXJhdGUgdGFibGUgdG8gZW5zdXJlIHBvcnRhYmlsaXR5IHdpdGggb3RoZXIgZHJpdmVycy4KICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICRzZXFfbmFtZSAgbmFtZSBvZiB0aGUgbmV3IHNlcXVlbmNlCiAgICAgKgogICAgICogQHJldHVybiBpbnQgIERCX09LIG9uIHN1Y2Nlc3MuICBBIERCX0Vycm9yIG9iamVjdCBvbiBmYWlsdXJlLgogICAgICoKICAgICAqIEBzZWUgREJfY29tbW9uOjpjcmVhdGVTZXF1ZW5jZSgpLCBEQl9jb21tb246OmdldFNlcXVlbmNlTmFtZSgpLAogICAgICogICAgICBEQl9tc3FsOjpuZXh0SUQoKSwgREJfbXNxbDo6ZHJvcFNlcXVlbmNlKCkKICAgICAqLwogICAgZnVuY3Rpb24gY3JlYXRlU2VxdWVuY2UoJHNlcV9uYW1lKQogICAgewogICAgICAgICRzZXFuYW1lID0gJHRoaXMtPmdldFNlcXVlbmNlTmFtZSgkc2VxX25hbWUpOwogICAgICAgICRyZXMgPSAkdGhpcy0+cXVlcnkoJ0NSRUFURSBUQUJMRSAnIC4gJHNlcW5hbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJyAoaWQgSU5URUdFUiBOT1QgTlVMTCknKTsKICAgICAgICBpZiAoREI6OmlzRXJyb3IoJHJlcykpIHsKICAgICAgICAgICAgcmV0dXJuICRyZXM7CiAgICAgICAgfQogICAgICAgICRyZXMgPSAkdGhpcy0+cXVlcnkoIkNSRUFURSBTRVFVRU5DRSBPTiAke3NlcW5hbWV9Iik7CiAgICAgICAgcmV0dXJuICRyZXM7CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgZHJvcFNlcXVlbmNlKCkKCiAgICAvKioKICAgICAqIERlbGV0ZXMgYSBzZXF1ZW5jZQogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgJHNlcV9uYW1lICBuYW1lIG9mIHRoZSBzZXF1ZW5jZSB0byBiZSBkZWxldGVkCiAgICAgKgogICAgICogQHJldHVybiBpbnQgIERCX09LIG9uIHN1Y2Nlc3MuICBBIERCX0Vycm9yIG9iamVjdCBvbiBmYWlsdXJlLgogICAgICoKICAgICAqIEBzZWUgREJfY29tbW9uOjpkcm9wU2VxdWVuY2UoKSwgREJfY29tbW9uOjpnZXRTZXF1ZW5jZU5hbWUoKSwKICAgICAqICAgICAgREJfbXNxbDo6bmV4dElEKCksIERCX21zcWw6OmNyZWF0ZVNlcXVlbmNlKCkKICAgICAqLwogICAgZnVuY3Rpb24gZHJvcFNlcXVlbmNlKCRzZXFfbmFtZSkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnF1ZXJ5KCdEUk9QIFRBQkxFICcgLiAkdGhpcy0+Z2V0U2VxdWVuY2VOYW1lKCRzZXFfbmFtZSkpOwogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IHF1b3RlSWRlbnRpZmllcigpCgogICAgLyoqCiAgICAgKiBtU1FMIGRvZXMgbm90IHN1cHBvcnQgZGVsaW1pdGVkIGlkZW50aWZpZXJzCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkc3RyICB0aGUgaWRlbnRpZmllciBuYW1lIHRvIGJlIHF1b3RlZAogICAgICoKICAgICAqIEByZXR1cm4gb2JqZWN0ICBhIERCX0Vycm9yIG9iamVjdAogICAgICoKICAgICAqIEBzZWUgREJfY29tbW9uOjpxdW90ZUlkZW50aWZpZXIoKQogICAgICogQHNpbmNlIE1ldGhvZCBhdmFpbGFibGUgc2luY2UgUmVsZWFzZSAxLjcuMAogICAgICovCiAgICBmdW5jdGlvbiBxdW90ZUlkZW50aWZpZXIoJHN0cikKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnJhaXNlRXJyb3IoREJfRVJST1JfVU5TVVBQT1JURUQpOwogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IHF1b3RlRmxvYXQoKQoKICAgIC8qKgogICAgICogRm9ybWF0cyBhIGZsb2F0IHZhbHVlIGZvciB1c2Ugd2l0aGluIGEgcXVlcnkgaW4gYSBsb2NhbGUtaW5kZXBlbmRlbnQKICAgICAqIG1hbm5lci4KICAgICAqCiAgICAgKiBAcGFyYW0gZmxvYXQgdGhlIGZsb2F0IHZhbHVlIHRvIGJlIHF1b3RlZC4KICAgICAqIEByZXR1cm4gc3RyaW5nIHRoZSBxdW90ZWQgc3RyaW5nLgogICAgICogQHNlZSBEQl9jb21tb246OnF1b3RlU21hcnQoKQogICAgICogQHNpbmNlIE1ldGhvZCBhdmFpbGFibGUgc2luY2UgcmVsZWFzZSAxLjcuOC4KICAgICAqLwogICAgZnVuY3Rpb24gcXVvdGVGbG9hdCgkZmxvYXQpIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmVzY2FwZVNpbXBsZShzdHJfcmVwbGFjZSgnLCcsICcuJywgc3RydmFsKGZsb2F0dmFsKCRmbG9hdCkpKSk7CiAgICB9CiAgICAgCiAgICAvLyB9fX0KICAgIC8vIHt7eyBlc2NhcGVTaW1wbGUoKQoKICAgIC8qKgogICAgICogRXNjYXBlcyBhIHN0cmluZyBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgREJNUydzIHN0YW5kYXJkcwogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgJHN0ciAgdGhlIHN0cmluZyB0byBiZSBlc2NhcGVkCiAgICAgKgogICAgICogQHJldHVybiBzdHJpbmcgIHRoZSBlc2NhcGVkIHN0cmluZwogICAgICoKICAgICAqIEBzZWUgREJfY29tbW9uOjpxdW90ZVNtYXJ0KCkKICAgICAqIEBzaW5jZSBNZXRob2QgYXZhaWxhYmxlIHNpbmNlIFJlbGVhc2UgMS43LjAKICAgICAqLwogICAgZnVuY3Rpb24gZXNjYXBlU2ltcGxlKCRzdHIpCiAgICB7CiAgICAgICAgcmV0dXJuIGFkZHNsYXNoZXMoJHN0cik7CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgbXNxbFJhaXNlRXJyb3IoKQoKICAgIC8qKgogICAgICogUHJvZHVjZXMgYSBEQl9FcnJvciBvYmplY3QgcmVnYXJkaW5nIHRoZSBjdXJyZW50IHByb2JsZW0KICAgICAqCiAgICAgKiBAcGFyYW0gaW50ICRlcnJubyAgaWYgdGhlIGVycm9yIGlzIGJlaW5nIG1hbnVhbGx5IHJhaXNlZCBwYXNzIGEKICAgICAqICAgICAgICAgICAgICAgICAgICAgREJfRVJST1IqIGNvbnN0YW50IGhlcmUuICBJZiB0aGlzIGlzbid0IHBhc3NlZAogICAgICogICAgICAgICAgICAgICAgICAgICB0aGUgZXJyb3IgaW5mb3JtYXRpb24gZ2F0aGVyZWQgZnJvbSB0aGUgREJNUy4KICAgICAqCiAgICAgKiBAcmV0dXJuIG9iamVjdCAgdGhlIERCX0Vycm9yIG9iamVjdAogICAgICoKICAgICAqIEBzZWUgREJfY29tbW9uOjpyYWlzZUVycm9yKCksCiAgICAgKiAgICAgIERCX21zcWw6OmVycm9yTmF0aXZlKCksIERCX21zcWw6OmVycm9yQ29kZSgpCiAgICAgKi8KICAgIGZ1bmN0aW9uIG1zcWxSYWlzZUVycm9yKCRlcnJubyA9IG51bGwpCiAgICB7CiAgICAgICAgJG5hdGl2ZSA9ICR0aGlzLT5lcnJvck5hdGl2ZSgpOwogICAgICAgIGlmICgkZXJybm8gPT09IG51bGwpIHsKICAgICAgICAgICAgJGVycm5vID0gJHRoaXMtPmVycm9yQ29kZSgkbmF0aXZlKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICR0aGlzLT5yYWlzZUVycm9yKCRlcnJubywgbnVsbCwgbnVsbCwgbnVsbCwgJG5hdGl2ZSk7CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgZXJyb3JOYXRpdmUoKQoKICAgIC8qKgogICAgICogR2V0cyB0aGUgREJNUycgbmF0aXZlIGVycm9yIG1lc3NhZ2UgcHJvZHVjZWQgYnkgdGhlIGxhc3QgcXVlcnkKICAgICAqCiAgICAgKiBAcmV0dXJuIHN0cmluZyAgdGhlIERCTVMnIGVycm9yIG1lc3NhZ2UKICAgICAqLwogICAgZnVuY3Rpb24gZXJyb3JOYXRpdmUoKQogICAgewogICAgICAgIHJldHVybiBAbXNxbF9lcnJvcigpOwogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IGVycm9yQ29kZSgpCgogICAgLyoqCiAgICAgKiBEZXRlcm1pbmVzIFBFQVI6OkRCIGVycm9yIGNvZGUgZnJvbSB0aGUgZGF0YWJhc2UncyB0ZXh0IGVycm9yIG1lc3NhZ2UKICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICRlcnJvcm1zZyAgdGhlIGVycm9yIG1lc3NhZ2UgcmV0dXJuZWQgZnJvbSB0aGUgZGF0YWJhc2UKICAgICAqCiAgICAgKiBAcmV0dXJuIGludGVnZXIgIHRoZSBlcnJvciBudW1iZXIgZnJvbSBhIERCX0VSUk9SKiBjb25zdGFudAogICAgICovCiAgICBmdW5jdGlvbiBlcnJvckNvZGUoJGVycm9ybXNnKQogICAgewogICAgICAgIHN0YXRpYyAkZXJyb3JfcmVnZXhwczsKICAgICAgICAKICAgICAgICAvLyBQSFAgNS4yKyBwcmVwZW5kcyB0aGUgZnVuY3Rpb24gbmFtZSB0byAkcGhwX2Vycm9ybXNnLCBzbyB3ZSBuZWVkCiAgICAgICAgLy8gdGhpcyBoYWNrIHRvIHdvcmsgYXJvdW5kIGl0LCBwZXIgYnVnICM5NTk5LgogICAgICAgICRlcnJvcm1zZyA9IHByZWdfcmVwbGFjZSgnL15tc3FsW2Etel9dK1woXCk6IC8nLCAnJywgJGVycm9ybXNnKTsKCiAgICAgICAgaWYgKCFpc3NldCgkZXJyb3JfcmVnZXhwcykpIHsKICAgICAgICAgICAgJGVycm9yX3JlZ2V4cHMgPSBhcnJheSgKICAgICAgICAgICAgICAgICcvXkFjY2VzcyB0byBkYXRhYmFzZSBkZW5pZWQvaScKICAgICAgICAgICAgICAgICAgICA9PiBEQl9FUlJPUl9BQ0NFU1NfVklPTEFUSU9OLAogICAgICAgICAgICAgICAgJy9eQmFkIGluZGV4IG5hbWUvaScKICAgICAgICAgICAgICAgICAgICA9PiBEQl9FUlJPUl9BTFJFQURZX0VYSVNUUywKICAgICAgICAgICAgICAgICcvXkJhZCBvcmRlciBmaWVsZC9pJwogICAgICAgICAgICAgICAgICAgID0+IERCX0VSUk9SX1NZTlRBWCwKICAgICAgICAgICAgICAgICcvXkJhZCB0eXBlIGZvciBjb21wYXJpc29uL2knCiAgICAgICAgICAgICAgICAgICAgPT4gREJfRVJST1JfU1lOVEFYLAogICAgICAgICAgICAgICAgJy9eQ2FuXCd0IHBlcmZvcm0gTElLRSBvbi9pJwogICAgICAgICAgICAgICAgICAgID0+IERCX0VSUk9SX1NZTlRBWCwKICAgICAgICAgICAgICAgICcvXkNhblwndCB1c2UgVEVYVCBmaWVsZHMgaW4gTElLRSBjb21wYXJpc29uL2knCiAgICAgICAgICAgICAgICAgICAgPT4gREJfRVJST1JfU1lOVEFYLAogICAgICAgICAgICAgICAgJy9eQ291bGRuXCd0IGNyZWF0ZSB0ZW1wb3JhcnkgdGFibGUvaScKICAgICAgICAgICAgICAgICAgICA9PiBEQl9FUlJPUl9DQU5OT1RfQ1JFQVRFLAogICAgICAgICAgICAgICAgJy9eRXJyb3IgY3JlYXRpbmcgdGFibGUgZmlsZS9pJwogICAgICAgICAgICAgICAgICAgID0+IERCX0VSUk9SX0NBTk5PVF9DUkVBVEUsCiAgICAgICAgICAgICAgICAnL15GaWVsZCAuKiBjYW5ub3QgYmUgbnVsbCQvaScKICAgICAgICAgICAgICAgICAgICA9PiBEQl9FUlJPUl9DT05TVFJBSU5UX05PVF9OVUxMLAogICAgICAgICAgICAgICAgJy9eSW5kZXggKGZpZWxkfGNvbmRpdGlvbikgLiogY2Fubm90IGJlIG51bGwkL2knCiAgICAgICAgICAgICAgICAgICAgPT4gREJfRVJST1JfU1lOVEFYLAogICAgICAgICAgICAgICAgJy9eSW52YWxpZCBkYXRlIGZvcm1hdC9pJwogICAgICAgICAgICAgICAgICAgID0+IERCX0VSUk9SX0lOVkFMSURfREFURSwKICAgICAgICAgICAgICAgICcvXkludmFsaWQgdGltZSBmb3JtYXQvaScKICAgICAgICAgICAgICAgICAgICA9PiBEQl9FUlJPUl9JTlZBTElELAogICAgICAgICAgICAgICAgJy9eTGl0ZXJhbCB2YWx1ZSBmb3IgLiogaXMgd3JvbmcgdHlwZSQvaScKICAgICAgICAgICAgICAgICAgICA9PiBEQl9FUlJPUl9JTlZBTElEX05VTUJFUiwKICAgICAgICAgICAgICAgICcvXk5vIERhdGFiYXNlIFNlbGVjdGVkL2knCiAgICAgICAgICAgICAgICAgICAgPT4gREJfRVJST1JfTk9EQlNFTEVDVEVELAogICAgICAgICAgICAgICAgJy9eTm8gdmFsdWUgc3BlY2lmaWVkIGZvciBmaWVsZC9pJwogICAgICAgICAgICAgICAgICAgID0+IERCX0VSUk9SX1ZBTFVFX0NPVU5UX09OX1JPVywKICAgICAgICAgICAgICAgICcvXk5vbiB1bmlxdWUgdmFsdWUgZm9yIHVuaXF1ZSBpbmRleC9pJwogICAgICAgICAgICAgICAgICAgID0+IERCX0VSUk9SX0NPTlNUUkFJTlQsCiAgICAgICAgICAgICAgICAnL15PdXQgb2YgbWVtb3J5IGZvciB0ZW1wb3JhcnkgdGFibGUvaScKICAgICAgICAgICAgICAgICAgICA9PiBEQl9FUlJPUl9DQU5OT1RfQ1JFQVRFLAogICAgICAgICAgICAgICAgJy9eUGVybWlzc2lvbiBkZW5pZWQvaScKICAgICAgICAgICAgICAgICAgICA9PiBEQl9FUlJPUl9BQ0NFU1NfVklPTEFUSU9OLAogICAgICAgICAgICAgICAgJy9eUmVmZXJlbmNlIHRvIHVuLXNlbGVjdGVkIHRhYmxlL2knCiAgICAgICAgICAgICAgICAgICAgPT4gREJfRVJST1JfU1lOVEFYLAogICAgICAgICAgICAgICAgJy9ec3ludGF4IGVycm9yL2knCiAgICAgICAgICAgICAgICAgICAgPT4gREJfRVJST1JfU1lOVEFYLAogICAgICAgICAgICAgICAgJy9eVGFibGUgLiogZXhpc3RzJC9pJwogICAgICAgICAgICAgICAgICAgID0+IERCX0VSUk9SX0FMUkVBRFlfRVhJU1RTLAogICAgICAgICAgICAgICAgJy9eVW5rbm93biBkYXRhYmFzZS9pJwogICAgICAgICAgICAgICAgICAgID0+IERCX0VSUk9SX05PU1VDSERCLAogICAgICAgICAgICAgICAgJy9eVW5rbm93biBmaWVsZC9pJwogICAgICAgICAgICAgICAgICAgID0+IERCX0VSUk9SX05PU1VDSEZJRUxELAogICAgICAgICAgICAgICAgJy9eVW5rbm93biAoaW5kZXh8c3lzdGVtIHZhcmlhYmxlKS9pJwogICAgICAgICAgICAgICAgICAgID0+IERCX0VSUk9SX05PVF9GT1VORCwKICAgICAgICAgICAgICAgICcvXlVua25vd24gdGFibGUvaScKICAgICAgICAgICAgICAgICAgICA9PiBEQl9FUlJPUl9OT1NVQ0hUQUJMRSwKICAgICAgICAgICAgICAgICcvXlVucXVhbGlmaWVkIGZpZWxkL2knCiAgICAgICAgICAgICAgICAgICAgPT4gREJfRVJST1JfU1lOVEFYLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgZm9yZWFjaCAoJGVycm9yX3JlZ2V4cHMgYXMgJHJlZ2V4cCA9PiAkY29kZSkgewogICAgICAgICAgICBpZiAocHJlZ19tYXRjaCgkcmVnZXhwLCAkZXJyb3Jtc2cpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJGNvZGU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIERCX0VSUk9SOwogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IHRhYmxlSW5mbygpCgogICAgLyoqCiAgICAgKiBSZXR1cm5zIGluZm9ybWF0aW9uIGFib3V0IGEgdGFibGUgb3IgYSByZXN1bHQgc2V0CiAgICAgKgogICAgICogQHBhcmFtIG9iamVjdHxzdHJpbmcgICRyZXN1bHQgIERCX3Jlc3VsdCBvYmplY3QgZnJvbSBhIHF1ZXJ5IG9yIGEKICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIG5hbWUgb2YgYSB0YWJsZS4KICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2hpbGUgdGhpcyBhbHNvIGFjY2VwdHMgYSBxdWVyeSByZXN1bHQKICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2UgaWRlbnRpZmllciwgdGhpcyBiZWhhdmlvciBpcwogICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXByZWNhdGVkLgogICAgICogQHBhcmFtIGludCAgICAgICAgICAgICRtb2RlICAgIGEgdmFsaWQgdGFibGVJbmZvIG1vZGUKICAgICAqCiAgICAgKiBAcmV0dXJuIGFycmF5ICBhbiBhc3NvY2lhdGl2ZSBhcnJheSB3aXRoIHRoZSBpbmZvcm1hdGlvbiByZXF1ZXN0ZWQuCiAgICAgKiAgICAgICAgICAgICAgICAgQSBEQl9FcnJvciBvYmplY3Qgb24gZmFpbHVyZS4KICAgICAqCiAgICAgKiBAc2VlIERCX2NvbW1vbjo6c2V0T3B0aW9uKCkKICAgICAqLwogICAgZnVuY3Rpb24gdGFibGVJbmZvKCRyZXN1bHQsICRtb2RlID0gbnVsbCkKICAgIHsKICAgICAgICBpZiAoaXNfc3RyaW5nKCRyZXN1bHQpKSB7CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIFByb2JhYmx5IHJlY2VpdmVkIGEgdGFibGUgbmFtZS4KICAgICAgICAgICAgICogQ3JlYXRlIGEgcmVzdWx0IHJlc291cmNlIGlkZW50aWZpZXIuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICAkaWQgPSBAbXNxbF9xdWVyeSgiU0VMRUNUICogRlJPTSAkcmVzdWx0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmNvbm5lY3Rpb24pOwogICAgICAgICAgICAkZ290X3N0cmluZyA9IHRydWU7CiAgICAgICAgfSBlbHNlaWYgKGlzc2V0KCRyZXN1bHQtPnJlc3VsdCkpIHsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogUHJvYmFibHkgcmVjZWl2ZWQgYSByZXN1bHQgb2JqZWN0LgogICAgICAgICAgICAgKiBFeHRyYWN0IHRoZSByZXN1bHQgcmVzb3VyY2UgaWRlbnRpZmllci4KICAgICAgICAgICAgICovCiAgICAgICAgICAgICRpZCA9ICRyZXN1bHQtPnJlc3VsdDsKICAgICAgICAgICAgJGdvdF9zdHJpbmcgPSBmYWxzZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBQcm9iYWJseSByZWNlaXZlZCBhIHJlc3VsdCByZXNvdXJjZSBpZGVudGlmaWVyLgogICAgICAgICAgICAgKiBDb3B5IGl0LgogICAgICAgICAgICAgKiBEZXByZWNhdGVkLiAgSGVyZSBmb3IgY29tcGF0aWJpbGl0eSBvbmx5LgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgJGlkID0gJHJlc3VsdDsKICAgICAgICAgICAgJGdvdF9zdHJpbmcgPSBmYWxzZTsKICAgICAgICB9CgogICAgICAgIGlmICghaXNfcmVzb3VyY2UoJGlkKSkgewogICAgICAgICAgICByZXR1cm4gJHRoaXMtPnJhaXNlRXJyb3IoREJfRVJST1JfTkVFRF9NT1JFX0RBVEEpOwogICAgICAgIH0KCiAgICAgICAgaWYgKCR0aGlzLT5vcHRpb25zWydwb3J0YWJpbGl0eSddICYgREJfUE9SVEFCSUxJVFlfTE9XRVJDQVNFKSB7CiAgICAgICAgICAgICRjYXNlX2Z1bmMgPSAnc3RydG9sb3dlcic7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJGNhc2VfZnVuYyA9ICdzdHJ2YWwnOwogICAgICAgIH0KCiAgICAgICAgJGNvdW50ID0gQG1zcWxfbnVtX2ZpZWxkcygkaWQpOwogICAgICAgICRyZXMgICA9IGFycmF5KCk7CgogICAgICAgIGlmICgkbW9kZSkgewogICAgICAgICAgICAkcmVzWydudW1fZmllbGRzJ10gPSAkY291bnQ7CiAgICAgICAgfQoKICAgICAgICBmb3IgKCRpID0gMDsgJGkgPCAkY291bnQ7ICRpKyspIHsKICAgICAgICAgICAgJHRtcCA9IEBtc3FsX2ZldGNoX2ZpZWxkKCRpZCk7CgogICAgICAgICAgICAkZmxhZ3MgPSAnJzsKICAgICAgICAgICAgaWYgKCR0bXAtPm5vdF9udWxsKSB7CiAgICAgICAgICAgICAgICAkZmxhZ3MgLj0gJ25vdF9udWxsICc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCR0bXAtPnVuaXF1ZSkgewogICAgICAgICAgICAgICAgJGZsYWdzIC49ICd1bmlxdWVfa2V5ICc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJGZsYWdzID0gdHJpbSgkZmxhZ3MpOwoKICAgICAgICAgICAgJHJlc1skaV0gPSBhcnJheSgKICAgICAgICAgICAgICAgICd0YWJsZScgPT4gJGNhc2VfZnVuYygkdG1wLT50YWJsZSksCiAgICAgICAgICAgICAgICAnbmFtZScgID0+ICRjYXNlX2Z1bmMoJHRtcC0+bmFtZSksCiAgICAgICAgICAgICAgICAndHlwZScgID0+ICR0bXAtPnR5cGUsCiAgICAgICAgICAgICAgICAnbGVuJyAgID0+IG1zcWxfZmllbGRfbGVuKCRpZCwgJGkpLAogICAgICAgICAgICAgICAgJ2ZsYWdzJyA9PiAkZmxhZ3MsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoJG1vZGUgJiBEQl9UQUJMRUlORk9fT1JERVIpIHsKICAgICAgICAgICAgICAgICRyZXNbJ29yZGVyJ11bJHJlc1skaV1bJ25hbWUnXV0gPSAkaTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoJG1vZGUgJiBEQl9UQUJMRUlORk9fT1JERVJUQUJMRSkgewogICAgICAgICAgICAgICAgJHJlc1snb3JkZXJ0YWJsZSddWyRyZXNbJGldWyd0YWJsZSddXVskcmVzWyRpXVsnbmFtZSddXSA9ICRpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBmcmVlIHRoZSByZXN1bHQgb25seSBpZiB3ZSB3ZXJlIGNhbGxlZCBvbiBhIHRhYmxlCiAgICAgICAgaWYgKCRnb3Rfc3RyaW5nKSB7CiAgICAgICAgICAgIEBtc3FsX2ZyZWVfcmVzdWx0KCRpZCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiAkcmVzOwogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IGdldFNwZWNpYWxRdWVyeSgpCgogICAgLyoqCiAgICAgKiBPYnRhaW4gYSBsaXN0IG9mIGEgZ2l2ZW4gdHlwZSBvZiBvYmplY3RzCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkdHlwZSAgdGhlIGtpbmQgb2Ygb2JqZWN0cyB5b3Ugd2FudCB0byByZXRyaWV2ZQogICAgICoKICAgICAqIEByZXR1cm4gYXJyYXkgIHRoZSBhcnJheSBjb250YWluaW5nIHRoZSBsaXN0IG9mIG9iamVjdHMgcmVxdWVzdGVkCiAgICAgKgogICAgICogQGFjY2VzcyBwcm90ZWN0ZWQKICAgICAqIEBzZWUgREJfY29tbW9uOjpnZXRMaXN0T2YoKQogICAgICovCiAgICBmdW5jdGlvbiBnZXRTcGVjaWFsUXVlcnkoJHR5cGUpCiAgICB7CiAgICAgICAgc3dpdGNoICgkdHlwZSkgewogICAgICAgICAgICBjYXNlICdkYXRhYmFzZXMnOgogICAgICAgICAgICAgICAgJGlkID0gQG1zcWxfbGlzdF9kYnMoJHRoaXMtPmNvbm5lY3Rpb24pOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ3RhYmxlcyc6CiAgICAgICAgICAgICAgICAkaWQgPSBAbXNxbF9saXN0X3RhYmxlcygkdGhpcy0+ZHNuWydkYXRhYmFzZSddLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmNvbm5lY3Rpb24pOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgaWYgKCEkaWQpIHsKICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5tc3FsUmFpc2VFcnJvcigpOwogICAgICAgIH0KICAgICAgICAkb3V0ID0gYXJyYXkoKTsKICAgICAgICB3aGlsZSAoJHJvdyA9IEBtc3FsX2ZldGNoX3JvdygkaWQpKSB7CiAgICAgICAgICAgICRvdXRbXSA9ICRyb3dbMF07CiAgICAgICAgfQogICAgICAgIHJldHVybiAkb3V0OwogICAgfQoKICAgIC8vIH19fQoKfQoKLyoKICogTG9jYWwgdmFyaWFibGVzOgogKiB0YWItd2lkdGg6IDQKICogYy1iYXNpYy1vZmZzZXQ6IDQKICogRW5kOgogKi8KCj8+Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/pear/DB/mssql.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qIHZpbTogc2V0IGV4cGFuZHRhYiB0YWJzdG9wPTQgc2hpZnR3aWR0aD00IHNvZnR0YWJzdG9wPTQ6ICovCgovKioKICogVGhlIFBFQVIgREIgZHJpdmVyIGZvciBQSFAncyBtc3NxbCBleHRlbnNpb24KICogZm9yIGludGVyYWN0aW5nIHdpdGggTWljcm9zb2Z0IFNRTCBTZXJ2ZXIgZGF0YWJhc2VzCiAqCiAqIFBIUCB2ZXJzaW9ucyA0IGFuZCA1CiAqCiAqIExJQ0VOU0U6IFRoaXMgc291cmNlIGZpbGUgaXMgc3ViamVjdCB0byB2ZXJzaW9uIDMuMCBvZiB0aGUgUEhQIGxpY2Vuc2UKICogdGhhdCBpcyBhdmFpbGFibGUgdGhyb3VnaCB0aGUgd29ybGQtd2lkZS13ZWIgYXQgdGhlIGZvbGxvd2luZyBVUkk6CiAqIGh0dHA6Ly93d3cucGhwLm5ldC9saWNlbnNlLzNfMC50eHQuICBJZiB5b3UgZGlkIG5vdCByZWNlaXZlIGEgY29weSBvZgogKiB0aGUgUEhQIExpY2Vuc2UgYW5kIGFyZSB1bmFibGUgdG8gb2J0YWluIGl0IHRocm91Z2ggdGhlIHdlYiwgcGxlYXNlCiAqIHNlbmQgYSBub3RlIHRvIGxpY2Vuc2VAcGhwLm5ldCBzbyB3ZSBjYW4gbWFpbCB5b3UgYSBjb3B5IGltbWVkaWF0ZWx5LgogKgogKiBAY2F0ZWdvcnkgICBEYXRhYmFzZQogKiBAcGFja2FnZSAgICBEQgogKiBAYXV0aG9yICAgICBTdGVybGluZyBIdWdoZXMgPHN0ZXJsaW5nQHBocC5uZXQ+CiAqIEBhdXRob3IgICAgIERhbmllbCBDb252aXNzb3IgPGRhbmllbGNAcGhwLm5ldD4KICogQGNvcHlyaWdodCAgMTk5Ny0yMDA1IFRoZSBQSFAgR3JvdXAKICogQGxpY2Vuc2UgICAgaHR0cDovL3d3dy5waHAubmV0L2xpY2Vuc2UvM18wLnR4dCAgUEhQIExpY2Vuc2UgMy4wCiAqIEB2ZXJzaW9uICAgIENWUzogJElkOiBtc3NxbC5waHAsdiAxLjkwIDIwMDcvMDEvMTIgMDU6MTY6MjIgYWhhcnZleSBFeHAgJAogKiBAbGluayAgICAgICBodHRwOi8vcGVhci5waHAubmV0L3BhY2thZ2UvREIKICovCgovKioKICogT2J0YWluIHRoZSBEQl9jb21tb24gY2xhc3Mgc28gaXQgY2FuIGJlIGV4dGVuZGVkIGZyb20KICovCnJlcXVpcmVfb25jZSAnREIvY29tbW9uLnBocCc7CgovKioKICogVGhlIG1ldGhvZHMgUEVBUiBEQiB1c2VzIHRvIGludGVyYWN0IHdpdGggUEhQJ3MgbXNzcWwgZXh0ZW5zaW9uCiAqIGZvciBpbnRlcmFjdGluZyB3aXRoIE1pY3Jvc29mdCBTUUwgU2VydmVyIGRhdGFiYXNlcwogKgogKiBUaGVzZSBtZXRob2RzIG92ZXJsb2FkIHRoZSBvbmVzIGRlY2xhcmVkIGluIERCX2NvbW1vbi4KICoKICogREIncyBtc3NxbCBkcml2ZXIgaXMgb25seSBmb3IgTWljcm9zZm9mdCBTUUwgU2VydmVyIGRhdGFiYXNlcy4KICoKICogSWYgeW91J3JlIGNvbm5lY3RpbmcgdG8gYSBTeWJhc2UgZGF0YWJhc2UsIHlvdSBNVVNUIHNwZWNpZnkgInN5YmFzZSIKICogYXMgdGhlICJwaHB0eXBlIiBpbiB0aGUgRFNOLgogKgogKiBUaGlzIGNsYXNzIG9ubHkgd29ya3MgY29ycmVjdGx5IGlmIHlvdSBoYXZlIGNvbXBpbGVkIFBIUCB1c2luZwogKiAtLXdpdGgtbXNzcWw9W2Rpcl90b19GcmVlVERTXS4KICoKICogQGNhdGVnb3J5ICAgRGF0YWJhc2UKICogQHBhY2thZ2UgICAgREIKICogQGF1dGhvciAgICAgU3RlcmxpbmcgSHVnaGVzIDxzdGVybGluZ0BwaHAubmV0PgogKiBAYXV0aG9yICAgICBEYW5pZWwgQ29udmlzc29yIDxkYW5pZWxjQHBocC5uZXQ+CiAqIEBjb3B5cmlnaHQgIDE5OTctMjAwNSBUaGUgUEhQIEdyb3VwCiAqIEBsaWNlbnNlICAgIGh0dHA6Ly93d3cucGhwLm5ldC9saWNlbnNlLzNfMC50eHQgIFBIUCBMaWNlbnNlIDMuMAogKiBAdmVyc2lvbiAgICBSZWxlYXNlOiAxLjcuMTIKICogQGxpbmsgICAgICAgaHR0cDovL3BlYXIucGhwLm5ldC9wYWNrYWdlL0RCCiAqLwpjbGFzcyBEQl9tc3NxbCBleHRlbmRzIERCX2NvbW1vbgp7CiAgICAvLyB7e3sgcHJvcGVydGllcwoKICAgIC8qKgogICAgICogVGhlIERCIGRyaXZlciB0eXBlIChteXNxbCwgb2NpOCwgb2RiYywgZXRjLikKICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHZhciAkcGhwdHlwZSA9ICdtc3NxbCc7CgogICAgLyoqCiAgICAgKiBUaGUgZGF0YWJhc2Ugc3ludGF4IHZhcmlhbnQgdG8gYmUgdXNlZCAoZGIyLCBhY2Nlc3MsIGV0Yy4pLCBpZiBhbnkKICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHZhciAkZGJzeW50YXggPSAnbXNzcWwnOwoKICAgIC8qKgogICAgICogVGhlIGNhcGFiaWxpdGllcyBvZiB0aGlzIERCIGltcGxlbWVudGF0aW9uCiAgICAgKgogICAgICogVGhlICduZXdfbGluaycgZWxlbWVudCBjb250YWlucyB0aGUgUEhQIHZlcnNpb24gdGhhdCBmaXJzdCBwcm92aWRlZAogICAgICogbmV3X2xpbmsgc3VwcG9ydCBmb3IgdGhpcyBEQk1TLiAgQ29udGFpbnMgZmFsc2UgaWYgaXQncyB1bnN1cHBvcnRlZC4KICAgICAqCiAgICAgKiBNZWFuaW5nIG9mIHRoZSAnbGltaXQnIGVsZW1lbnQ6CiAgICAgKiAgICsgJ2VtdWxhdGUnID0gZW11bGF0ZSB3aXRoIGZldGNoIHJvdyBieSBudW1iZXIKICAgICAqICAgKyAnYWx0ZXInICAgPSBhbHRlciB0aGUgcXVlcnkKICAgICAqICAgKyBmYWxzZSAgICAgPSBza2lwIHJvd3MKICAgICAqCiAgICAgKiBAdmFyIGFycmF5CiAgICAgKi8KICAgIHZhciAkZmVhdHVyZXMgPSBhcnJheSgKICAgICAgICAnbGltaXQnICAgICAgICAgPT4gJ2VtdWxhdGUnLAogICAgICAgICduZXdfbGluaycgICAgICA9PiBmYWxzZSwKICAgICAgICAnbnVtcm93cycgICAgICAgPT4gdHJ1ZSwKICAgICAgICAncGNvbm5lY3QnICAgICAgPT4gdHJ1ZSwKICAgICAgICAncHJlcGFyZScgICAgICAgPT4gZmFsc2UsCiAgICAgICAgJ3NzbCcgICAgICAgICAgID0+IGZhbHNlLAogICAgICAgICd0cmFuc2FjdGlvbnMnICA9PiB0cnVlLAogICAgKTsKCiAgICAvKioKICAgICAqIEEgbWFwcGluZyBvZiBuYXRpdmUgZXJyb3IgY29kZXMgdG8gREIgZXJyb3IgY29kZXMKICAgICAqIEB2YXIgYXJyYXkKICAgICAqLwogICAgLy8gWFhYIEFkZCBoZXJlIGVycm9yIGNvZGVzIGllOiAnUzEwMEUnID0+IERCX0VSUk9SX1NZTlRBWAogICAgdmFyICRlcnJvcmNvZGVfbWFwID0gYXJyYXkoCiAgICAgICAgMTAyICAgPT4gREJfRVJST1JfU1lOVEFYLAogICAgICAgIDExMCAgID0+IERCX0VSUk9SX1ZBTFVFX0NPVU5UX09OX1JPVywKICAgICAgICAxNTUgICA9PiBEQl9FUlJPUl9OT1NVQ0hGSUVMRCwKICAgICAgICAxNTYgICA9PiBEQl9FUlJPUl9TWU5UQVgsCiAgICAgICAgMTcwICAgPT4gREJfRVJST1JfU1lOVEFYLAogICAgICAgIDIwNyAgID0+IERCX0VSUk9SX05PU1VDSEZJRUxELAogICAgICAgIDIwOCAgID0+IERCX0VSUk9SX05PU1VDSFRBQkxFLAogICAgICAgIDI0NSAgID0+IERCX0VSUk9SX0lOVkFMSURfTlVNQkVSLAogICAgICAgIDMxOSAgID0+IERCX0VSUk9SX1NZTlRBWCwKICAgICAgICAzMjEgICA9PiBEQl9FUlJPUl9OT1NVQ0hGSUVMRCwKICAgICAgICAzMjUgICA9PiBEQl9FUlJPUl9TWU5UQVgsCiAgICAgICAgMzM2ICAgPT4gREJfRVJST1JfU1lOVEFYLAogICAgICAgIDUxNSAgID0+IERCX0VSUk9SX0NPTlNUUkFJTlRfTk9UX05VTEwsCiAgICAgICAgNTQ3ICAgPT4gREJfRVJST1JfQ09OU1RSQUlOVCwKICAgICAgICAxMDE4ICA9PiBEQl9FUlJPUl9TWU5UQVgsCiAgICAgICAgMTAzNSAgPT4gREJfRVJST1JfU1lOVEFYLAogICAgICAgIDE5MTMgID0+IERCX0VSUk9SX0FMUkVBRFlfRVhJU1RTLAogICAgICAgIDIyMDkgID0+IERCX0VSUk9SX1NZTlRBWCwKICAgICAgICAyMjIzICA9PiBEQl9FUlJPUl9TWU5UQVgsCiAgICAgICAgMjI0OCAgPT4gREJfRVJST1JfU1lOVEFYLAogICAgICAgIDIyNTYgID0+IERCX0VSUk9SX1NZTlRBWCwKICAgICAgICAyMjU3ICA9PiBEQl9FUlJPUl9TWU5UQVgsCiAgICAgICAgMjYyNyAgPT4gREJfRVJST1JfQ09OU1RSQUlOVCwKICAgICAgICAyNzE0ICA9PiBEQl9FUlJPUl9BTFJFQURZX0VYSVNUUywKICAgICAgICAzNjA3ICA9PiBEQl9FUlJPUl9ESVZaRVJPLAogICAgICAgIDM3MDEgID0+IERCX0VSUk9SX05PU1VDSFRBQkxFLAogICAgICAgIDc2MzAgID0+IERCX0VSUk9SX1NZTlRBWCwKICAgICAgICA4MTM0ICA9PiBEQl9FUlJPUl9ESVZaRVJPLAogICAgICAgIDkzMDMgID0+IERCX0VSUk9SX1NZTlRBWCwKICAgICAgICA5MzE3ICA9PiBEQl9FUlJPUl9TWU5UQVgsCiAgICAgICAgOTMxOCAgPT4gREJfRVJST1JfU1lOVEFYLAogICAgICAgIDkzMzEgID0+IERCX0VSUk9SX1NZTlRBWCwKICAgICAgICA5MzMyICA9PiBEQl9FUlJPUl9TWU5UQVgsCiAgICAgICAgMTUyNTMgPT4gREJfRVJST1JfU1lOVEFYLAogICAgKTsKCiAgICAvKioKICAgICAqIFRoZSByYXcgZGF0YWJhc2UgY29ubmVjdGlvbiBjcmVhdGVkIGJ5IFBIUAogICAgICogQHZhciByZXNvdXJjZQogICAgICovCiAgICB2YXIgJGNvbm5lY3Rpb247CgogICAgLyoqCiAgICAgKiBUaGUgRFNOIGluZm9ybWF0aW9uIGZvciBjb25uZWN0aW5nIHRvIGEgZGF0YWJhc2UKICAgICAqIEB2YXIgYXJyYXkKICAgICAqLwogICAgdmFyICRkc24gPSBhcnJheSgpOwoKCiAgICAvKioKICAgICAqIFNob3VsZCBkYXRhIG1hbmlwdWxhdGlvbiBxdWVyaWVzIGJlIGNvbW1pdHRlZCBhdXRvbWF0aWNhbGx5PwogICAgICogQHZhciBib29sCiAgICAgKiBAYWNjZXNzIHByaXZhdGUKICAgICAqLwogICAgdmFyICRhdXRvY29tbWl0ID0gdHJ1ZTsKCiAgICAvKioKICAgICAqIFRoZSBxdWFudGl0eSBvZiB0cmFuc2FjdGlvbnMgYmVndW4KICAgICAqCiAgICAgKiB7QGludGVybmFsICBXaGlsZSB0aGlzIGlzIHByaXZhdGUsIGl0IGNhbid0IGFjdHVhbGx5IGJlIGRlc2lnbmF0ZWQKICAgICAqIHByaXZhdGUgaW4gUEhQIDUgYmVjYXVzZSBpdCBpcyBkaXJlY3RseSBhY2Nlc3NlZCBpbiB0aGUgdGVzdCBzdWl0ZS59fQogICAgICoKICAgICAqIEB2YXIgaW50ZWdlcgogICAgICogQGFjY2VzcyBwcml2YXRlCiAgICAgKi8KICAgIHZhciAkdHJhbnNhY3Rpb25fb3Bjb3VudCA9IDA7CgogICAgLyoqCiAgICAgKiBUaGUgZGF0YWJhc2Ugc3BlY2lmaWVkIGluIHRoZSBEU04KICAgICAqCiAgICAgKiBJdCdzIGEgZml4IHRvIGFsbG93IGNhbGxzIHRvIGRpZmZlcmVudCBkYXRhYmFzZXMgaW4gdGhlIHNhbWUgc2NyaXB0LgogICAgICoKICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKiBAYWNjZXNzIHByaXZhdGUKICAgICAqLwogICAgdmFyICRfZGIgPSBudWxsOwoKCiAgICAvLyB9fX0KICAgIC8vIHt7eyBjb25zdHJ1Y3RvcgoKICAgIC8qKgogICAgICogVGhpcyBjb25zdHJ1Y3RvciBjYWxscyA8a2JkPiR0aGlzLT5EQl9jb21tb24oKTwva2JkPgogICAgICoKICAgICAqIEByZXR1cm4gdm9pZAogICAgICovCiAgICBmdW5jdGlvbiBEQl9tc3NxbCgpCiAgICB7CiAgICAgICAgJHRoaXMtPkRCX2NvbW1vbigpOwogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IGNvbm5lY3QoKQoKICAgIC8qKgogICAgICogQ29ubmVjdCB0byB0aGUgZGF0YWJhc2Ugc2VydmVyLCBsb2cgaW4gYW5kIG9wZW4gdGhlIGRhdGFiYXNlCiAgICAgKgogICAgICogRG9uJ3QgY2FsbCB0aGlzIG1ldGhvZCBkaXJlY3RseS4gIFVzZSBEQjo6Y29ubmVjdCgpIGluc3RlYWQuCiAgICAgKgogICAgICogQHBhcmFtIGFycmF5ICRkc24gICAgICAgICB0aGUgZGF0YSBzb3VyY2UgbmFtZQogICAgICogQHBhcmFtIGJvb2wgICRwZXJzaXN0ZW50ICBzaG91bGQgdGhlIGNvbm5lY3Rpb24gYmUgcGVyc2lzdGVudD8KICAgICAqCiAgICAgKiBAcmV0dXJuIGludCAgREJfT0sgb24gc3VjY2Vzcy4gQSBEQl9FcnJvciBvYmplY3Qgb24gZmFpbHVyZS4KICAgICAqLwogICAgZnVuY3Rpb24gY29ubmVjdCgkZHNuLCAkcGVyc2lzdGVudCA9IGZhbHNlKQogICAgewogICAgICAgIGlmICghUEVBUjo6bG9hZEV4dGVuc2lvbignbXNzcWwnKSAmJiAhUEVBUjo6bG9hZEV4dGVuc2lvbignc3liYXNlJykKICAgICAgICAgICAgJiYgIVBFQVI6OmxvYWRFeHRlbnNpb24oJ3N5YmFzZV9jdCcpKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5yYWlzZUVycm9yKERCX0VSUk9SX0VYVEVOU0lPTl9OT1RfRk9VTkQpOwogICAgICAgIH0KCiAgICAgICAgJHRoaXMtPmRzbiA9ICRkc247CiAgICAgICAgaWYgKCRkc25bJ2Ric3ludGF4J10pIHsKICAgICAgICAgICAgJHRoaXMtPmRic3ludGF4ID0gJGRzblsnZGJzeW50YXgnXTsKICAgICAgICB9CgogICAgICAgICRwYXJhbXMgPSBhcnJheSgKICAgICAgICAgICAgJGRzblsnaG9zdHNwZWMnXSA/ICRkc25bJ2hvc3RzcGVjJ10gOiAnbG9jYWxob3N0JywKICAgICAgICAgICAgJGRzblsndXNlcm5hbWUnXSA/ICRkc25bJ3VzZXJuYW1lJ10gOiBudWxsLAogICAgICAgICAgICAkZHNuWydwYXNzd29yZCddID8gJGRzblsncGFzc3dvcmQnXSA6IG51bGwsCiAgICAgICAgKTsKICAgICAgICBpZiAoJGRzblsncG9ydCddKSB7CiAgICAgICAgICAgICRwYXJhbXNbMF0gLj0gKChzdWJzdHIoUEhQX09TLCAwLCAzKSA9PSAnV0lOJykgPyAnLCcgOiAnOicpCiAgICAgICAgICAgICAgICAgICAgICAgIC4gJGRzblsncG9ydCddOwogICAgICAgIH0KCiAgICAgICAgJGNvbm5lY3RfZnVuY3Rpb24gPSAkcGVyc2lzdGVudCA/ICdtc3NxbF9wY29ubmVjdCcgOiAnbXNzcWxfY29ubmVjdCc7CgogICAgICAgICR0aGlzLT5jb25uZWN0aW9uID0gQGNhbGxfdXNlcl9mdW5jX2FycmF5KCRjb25uZWN0X2Z1bmN0aW9uLCAkcGFyYW1zKTsKCiAgICAgICAgaWYgKCEkdGhpcy0+Y29ubmVjdGlvbikgewogICAgICAgICAgICByZXR1cm4gJHRoaXMtPnJhaXNlRXJyb3IoREJfRVJST1JfQ09OTkVDVF9GQUlMRUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBudWxsLCBudWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQG1zc3FsX2dldF9sYXN0X21lc3NhZ2UoKSk7CiAgICAgICAgfQogICAgICAgIGlmICgkZHNuWydkYXRhYmFzZSddKSB7CiAgICAgICAgICAgIGlmICghQG1zc3FsX3NlbGVjdF9kYigkZHNuWydkYXRhYmFzZSddLCAkdGhpcy0+Y29ubmVjdGlvbikpIHsKICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+cmFpc2VFcnJvcihEQl9FUlJPUl9OT0RCU0VMRUNURUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwgbnVsbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAbXNzcWxfZ2V0X2xhc3RfbWVzc2FnZSgpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkdGhpcy0+X2RiID0gJGRzblsnZGF0YWJhc2UnXTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIERCX09LOwogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IGRpc2Nvbm5lY3QoKQoKICAgIC8qKgogICAgICogRGlzY29ubmVjdHMgZnJvbSB0aGUgZGF0YWJhc2Ugc2VydmVyCiAgICAgKgogICAgICogQHJldHVybiBib29sICBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUKICAgICAqLwogICAgZnVuY3Rpb24gZGlzY29ubmVjdCgpCiAgICB7CiAgICAgICAgJHJldCA9IEBtc3NxbF9jbG9zZSgkdGhpcy0+Y29ubmVjdGlvbik7CiAgICAgICAgJHRoaXMtPmNvbm5lY3Rpb24gPSBudWxsOwogICAgICAgIHJldHVybiAkcmV0OwogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IHNpbXBsZVF1ZXJ5KCkKCiAgICAvKioKICAgICAqIFNlbmRzIGEgcXVlcnkgdG8gdGhlIGRhdGFiYXNlIHNlcnZlcgogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgIHRoZSBTUUwgcXVlcnkgc3RyaW5nCiAgICAgKgogICAgICogQHJldHVybiBtaXhlZCAgKyBhIFBIUCByZXN1bHQgcmVzcm91Y2UgZm9yIHN1Y2Nlc3NmdWwgU0VMRUNUIHF1ZXJpZXMKICAgICAqICAgICAgICAgICAgICAgICsgdGhlIERCX09LIGNvbnN0YW50IGZvciBvdGhlciBzdWNjZXNzZnVsIHF1ZXJpZXMKICAgICAqICAgICAgICAgICAgICAgICsgYSBEQl9FcnJvciBvYmplY3Qgb24gZmFpbHVyZQogICAgICovCiAgICBmdW5jdGlvbiBzaW1wbGVRdWVyeSgkcXVlcnkpCiAgICB7CiAgICAgICAgJGlzbWFuaXAgPSAkdGhpcy0+X2NoZWNrTWFuaXAoJHF1ZXJ5KTsKICAgICAgICAkdGhpcy0+bGFzdF9xdWVyeSA9ICRxdWVyeTsKICAgICAgICBpZiAoIUBtc3NxbF9zZWxlY3RfZGIoJHRoaXMtPl9kYiwgJHRoaXMtPmNvbm5lY3Rpb24pKSB7CiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+bXNzcWxSYWlzZUVycm9yKERCX0VSUk9SX05PREJTRUxFQ1RFRCk7CiAgICAgICAgfQogICAgICAgICRxdWVyeSA9ICR0aGlzLT5tb2RpZnlRdWVyeSgkcXVlcnkpOwogICAgICAgIGlmICghJHRoaXMtPmF1dG9jb21taXQgJiYgJGlzbWFuaXApIHsKICAgICAgICAgICAgaWYgKCR0aGlzLT50cmFuc2FjdGlvbl9vcGNvdW50ID09IDApIHsKICAgICAgICAgICAgICAgICRyZXN1bHQgPSBAbXNzcWxfcXVlcnkoJ0JFR0lOIFRSQU4nLCAkdGhpcy0+Y29ubmVjdGlvbik7CiAgICAgICAgICAgICAgICBpZiAoISRyZXN1bHQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPm1zc3FsUmFpc2VFcnJvcigpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgICR0aGlzLT50cmFuc2FjdGlvbl9vcGNvdW50Kys7CiAgICAgICAgfQogICAgICAgICRyZXN1bHQgPSBAbXNzcWxfcXVlcnkoJHF1ZXJ5LCAkdGhpcy0+Y29ubmVjdGlvbik7CiAgICAgICAgaWYgKCEkcmVzdWx0KSB7CiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+bXNzcWxSYWlzZUVycm9yKCk7CiAgICAgICAgfQogICAgICAgIC8vIERldGVybWluZSB3aGljaCBxdWVyaWVzIHRoYXQgc2hvdWxkIHJldHVybiBkYXRhLCBhbmQgd2hpY2gKICAgICAgICAvLyBzaG91bGQgcmV0dXJuIGFuIGVycm9yIGNvZGUgb25seS4KICAgICAgICByZXR1cm4gJGlzbWFuaXAgPyBEQl9PSyA6ICRyZXN1bHQ7CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgbmV4dFJlc3VsdCgpCgogICAgLyoqCiAgICAgKiBNb3ZlIHRoZSBpbnRlcm5hbCBtc3NxbCByZXN1bHQgcG9pbnRlciB0byB0aGUgbmV4dCBhdmFpbGFibGUgcmVzdWx0CiAgICAgKgogICAgICogQHBhcmFtIGEgdmFsaWQgZmJzcWwgcmVzdWx0IHJlc291cmNlCiAgICAgKgogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqCiAgICAgKiBAcmV0dXJuIHRydWUgaWYgYSByZXN1bHQgaXMgYXZhaWxhYmxlIG90aGVyd2lzZSByZXR1cm4gZmFsc2UKICAgICAqLwogICAgZnVuY3Rpb24gbmV4dFJlc3VsdCgkcmVzdWx0KQogICAgewogICAgICAgIHJldHVybiBAbXNzcWxfbmV4dF9yZXN1bHQoJHJlc3VsdCk7CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgZmV0Y2hJbnRvKCkKCiAgICAvKioKICAgICAqIFBsYWNlcyBhIHJvdyBmcm9tIHRoZSByZXN1bHQgc2V0IGludG8gdGhlIGdpdmVuIGFycmF5CiAgICAgKgogICAgICogRm9ybWF0aW5nIG9mIHRoZSBhcnJheSBhbmQgdGhlIGRhdGEgdGhlcmVpbiBhcmUgY29uZmlndXJhYmxlLgogICAgICogU2VlIERCX3Jlc3VsdDo6ZmV0Y2hJbnRvKCkgZm9yIG1vcmUgaW5mb3JtYXRpb24uCiAgICAgKgogICAgICogVGhpcyBtZXRob2QgaXMgbm90IG1lYW50IHRvIGJlIGNhbGxlZCBkaXJlY3RseS4gIFVzZQogICAgICogREJfcmVzdWx0OjpmZXRjaEludG8oKSBpbnN0ZWFkLiAgSXQgY2FuJ3QgYmUgZGVjbGFyZWQgInByb3RlY3RlZCIKICAgICAqIGJlY2F1c2UgREJfcmVzdWx0IGlzIGEgc2VwYXJhdGUgb2JqZWN0LgogICAgICoKICAgICAqIEBwYXJhbSByZXNvdXJjZSAkcmVzdWx0ICAgIHRoZSBxdWVyeSByZXN1bHQgcmVzb3VyY2UKICAgICAqIEBwYXJhbSBhcnJheSAgICAkYXJyICAgICAgIHRoZSByZWZlcmVuY2VkIGFycmF5IHRvIHB1dCB0aGUgZGF0YSBpbgogICAgICogQHBhcmFtIGludCAgICAgICRmZXRjaG1vZGUgaG93IHRoZSByZXN1bHRpbmcgYXJyYXkgc2hvdWxkIGJlIGluZGV4ZWQKICAgICAqIEBwYXJhbSBpbnQgICAgICAkcm93bnVtICAgIHRoZSByb3cgbnVtYmVyIHRvIGZldGNoICgwID0gZmlyc3Qgcm93KQogICAgICoKICAgICAqIEByZXR1cm4gbWl4ZWQgIERCX09LIG9uIHN1Y2Nlc3MsIE5VTEwgd2hlbiB0aGUgZW5kIG9mIGEgcmVzdWx0IHNldCBpcwogICAgICogICAgICAgICAgICAgICAgIHJlYWNoZWQgb3Igb24gZmFpbHVyZQogICAgICoKICAgICAqIEBzZWUgREJfcmVzdWx0OjpmZXRjaEludG8oKQogICAgICovCiAgICBmdW5jdGlvbiBmZXRjaEludG8oJHJlc3VsdCwgJiRhcnIsICRmZXRjaG1vZGUsICRyb3dudW0gPSBudWxsKQogICAgewogICAgICAgIGlmICgkcm93bnVtICE9PSBudWxsKSB7CiAgICAgICAgICAgIGlmICghQG1zc3FsX2RhdGFfc2VlaygkcmVzdWx0LCAkcm93bnVtKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCRmZXRjaG1vZGUgJiBEQl9GRVRDSE1PREVfQVNTT0MpIHsKICAgICAgICAgICAgJGFyciA9IEBtc3NxbF9mZXRjaF9hc3NvYygkcmVzdWx0KTsKICAgICAgICAgICAgaWYgKCR0aGlzLT5vcHRpb25zWydwb3J0YWJpbGl0eSddICYgREJfUE9SVEFCSUxJVFlfTE9XRVJDQVNFICYmICRhcnIpIHsKICAgICAgICAgICAgICAgICRhcnIgPSBhcnJheV9jaGFuZ2Vfa2V5X2Nhc2UoJGFyciwgQ0FTRV9MT1dFUik7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkYXJyID0gQG1zc3FsX2ZldGNoX3JvdygkcmVzdWx0KTsKICAgICAgICB9CiAgICAgICAgaWYgKCEkYXJyKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICBpZiAoJHRoaXMtPm9wdGlvbnNbJ3BvcnRhYmlsaXR5J10gJiBEQl9QT1JUQUJJTElUWV9SVFJJTSkgewogICAgICAgICAgICAkdGhpcy0+X3J0cmltQXJyYXlWYWx1ZXMoJGFycik7CiAgICAgICAgfQogICAgICAgIGlmICgkdGhpcy0+b3B0aW9uc1sncG9ydGFiaWxpdHknXSAmIERCX1BPUlRBQklMSVRZX05VTExfVE9fRU1QVFkpIHsKICAgICAgICAgICAgJHRoaXMtPl9jb252ZXJ0TnVsbEFycmF5VmFsdWVzVG9FbXB0eSgkYXJyKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIERCX09LOwogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IGZyZWVSZXN1bHQoKQoKICAgIC8qKgogICAgICogRGVsZXRlcyB0aGUgcmVzdWx0IHNldCBhbmQgZnJlZXMgdGhlIG1lbW9yeSBvY2N1cGllZCBieSB0aGUgcmVzdWx0IHNldAogICAgICoKICAgICAqIFRoaXMgbWV0aG9kIGlzIG5vdCBtZWFudCB0byBiZSBjYWxsZWQgZGlyZWN0bHkuICBVc2UKICAgICAqIERCX3Jlc3VsdDo6ZnJlZSgpIGluc3RlYWQuICBJdCBjYW4ndCBiZSBkZWNsYXJlZCAicHJvdGVjdGVkIgogICAgICogYmVjYXVzZSBEQl9yZXN1bHQgaXMgYSBzZXBhcmF0ZSBvYmplY3QuCiAgICAgKgogICAgICogQHBhcmFtIHJlc291cmNlICRyZXN1bHQgIFBIUCdzIHF1ZXJ5IHJlc3VsdCByZXNvdXJjZQogICAgICoKICAgICAqIEByZXR1cm4gYm9vbCAgVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBpZiAkcmVzdWx0IGlzIGludmFsaWQKICAgICAqCiAgICAgKiBAc2VlIERCX3Jlc3VsdDo6ZnJlZSgpCiAgICAgKi8KICAgIGZ1bmN0aW9uIGZyZWVSZXN1bHQoJHJlc3VsdCkKICAgIHsKICAgICAgICByZXR1cm4gaXNfcmVzb3VyY2UoJHJlc3VsdCkgPyBtc3NxbF9mcmVlX3Jlc3VsdCgkcmVzdWx0KSA6IGZhbHNlOwogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IG51bUNvbHMoKQoKICAgIC8qKgogICAgICogR2V0cyB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgaW4gYSByZXN1bHQgc2V0CiAgICAgKgogICAgICogVGhpcyBtZXRob2QgaXMgbm90IG1lYW50IHRvIGJlIGNhbGxlZCBkaXJlY3RseS4gIFVzZQogICAgICogREJfcmVzdWx0OjpudW1Db2xzKCkgaW5zdGVhZC4gIEl0IGNhbid0IGJlIGRlY2xhcmVkICJwcm90ZWN0ZWQiCiAgICAgKiBiZWNhdXNlIERCX3Jlc3VsdCBpcyBhIHNlcGFyYXRlIG9iamVjdC4KICAgICAqCiAgICAgKiBAcGFyYW0gcmVzb3VyY2UgJHJlc3VsdCAgUEhQJ3MgcXVlcnkgcmVzdWx0IHJlc291cmNlCiAgICAgKgogICAgICogQHJldHVybiBpbnQgIHRoZSBudW1iZXIgb2YgY29sdW1ucy4gIEEgREJfRXJyb3Igb2JqZWN0IG9uIGZhaWx1cmUuCiAgICAgKgogICAgICogQHNlZSBEQl9yZXN1bHQ6Om51bUNvbHMoKQogICAgICovCiAgICBmdW5jdGlvbiBudW1Db2xzKCRyZXN1bHQpCiAgICB7CiAgICAgICAgJGNvbHMgPSBAbXNzcWxfbnVtX2ZpZWxkcygkcmVzdWx0KTsKICAgICAgICBpZiAoISRjb2xzKSB7CiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+bXNzcWxSYWlzZUVycm9yKCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiAkY29sczsKICAgIH0KCiAgICAvLyB9fX0KICAgIC8vIHt7eyBudW1Sb3dzKCkKCiAgICAvKioKICAgICAqIEdldHMgdGhlIG51bWJlciBvZiByb3dzIGluIGEgcmVzdWx0IHNldAogICAgICoKICAgICAqIFRoaXMgbWV0aG9kIGlzIG5vdCBtZWFudCB0byBiZSBjYWxsZWQgZGlyZWN0bHkuICBVc2UKICAgICAqIERCX3Jlc3VsdDo6bnVtUm93cygpIGluc3RlYWQuICBJdCBjYW4ndCBiZSBkZWNsYXJlZCAicHJvdGVjdGVkIgogICAgICogYmVjYXVzZSBEQl9yZXN1bHQgaXMgYSBzZXBhcmF0ZSBvYmplY3QuCiAgICAgKgogICAgICogQHBhcmFtIHJlc291cmNlICRyZXN1bHQgIFBIUCdzIHF1ZXJ5IHJlc3VsdCByZXNvdXJjZQogICAgICoKICAgICAqIEByZXR1cm4gaW50ICB0aGUgbnVtYmVyIG9mIHJvd3MuICBBIERCX0Vycm9yIG9iamVjdCBvbiBmYWlsdXJlLgogICAgICoKICAgICAqIEBzZWUgREJfcmVzdWx0OjpudW1Sb3dzKCkKICAgICAqLwogICAgZnVuY3Rpb24gbnVtUm93cygkcmVzdWx0KQogICAgewogICAgICAgICRyb3dzID0gQG1zc3FsX251bV9yb3dzKCRyZXN1bHQpOwogICAgICAgIGlmICgkcm93cyA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5tc3NxbFJhaXNlRXJyb3IoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICRyb3dzOwogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IGF1dG9Db21taXQoKQoKICAgIC8qKgogICAgICogRW5hYmxlcyBvciBkaXNhYmxlcyBhdXRvbWF0aWMgY29tbWl0cwogICAgICoKICAgICAqIEBwYXJhbSBib29sICRvbm9mZiAgdHJ1ZSB0dXJucyBpdCBvbiwgZmFsc2UgdHVybnMgaXQgb2ZmCiAgICAgKgogICAgICogQHJldHVybiBpbnQgIERCX09LIG9uIHN1Y2Nlc3MuICBBIERCX0Vycm9yIG9iamVjdCBpZiB0aGUgZHJpdmVyCiAgICAgKiAgICAgICAgICAgICAgIGRvZXNuJ3Qgc3VwcG9ydCBhdXRvLWNvbW1pdHRpbmcgdHJhbnNhY3Rpb25zLgogICAgICovCiAgICBmdW5jdGlvbiBhdXRvQ29tbWl0KCRvbm9mZiA9IGZhbHNlKQogICAgewogICAgICAgIC8vIFhYWCBpZiAkdGhpcy0+dHJhbnNhY3Rpb25fb3Bjb3VudCA+IDAsIHdlIHNob3VsZCBwcm9iYWJseQogICAgICAgIC8vIGlzc3VlIGEgd2FybmluZyBoZXJlLgogICAgICAgICR0aGlzLT5hdXRvY29tbWl0ID0gJG9ub2ZmID8gdHJ1ZSA6IGZhbHNlOwogICAgICAgIHJldHVybiBEQl9PSzsKICAgIH0KCiAgICAvLyB9fX0KICAgIC8vIHt7eyBjb21taXQoKQoKICAgIC8qKgogICAgICogQ29tbWl0cyB0aGUgY3VycmVudCB0cmFuc2FjdGlvbgogICAgICoKICAgICAqIEByZXR1cm4gaW50ICBEQl9PSyBvbiBzdWNjZXNzLiAgQSBEQl9FcnJvciBvYmplY3Qgb24gZmFpbHVyZS4KICAgICAqLwogICAgZnVuY3Rpb24gY29tbWl0KCkKICAgIHsKICAgICAgICBpZiAoJHRoaXMtPnRyYW5zYWN0aW9uX29wY291bnQgPiAwKSB7CiAgICAgICAgICAgIGlmICghQG1zc3FsX3NlbGVjdF9kYigkdGhpcy0+X2RiLCAkdGhpcy0+Y29ubmVjdGlvbikpIHsKICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+bXNzcWxSYWlzZUVycm9yKERCX0VSUk9SX05PREJTRUxFQ1RFRCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJHJlc3VsdCA9IEBtc3NxbF9xdWVyeSgnQ09NTUlUIFRSQU4nLCAkdGhpcy0+Y29ubmVjdGlvbik7CiAgICAgICAgICAgICR0aGlzLT50cmFuc2FjdGlvbl9vcGNvdW50ID0gMDsKICAgICAgICAgICAgaWYgKCEkcmVzdWx0KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPm1zc3FsUmFpc2VFcnJvcigpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBEQl9PSzsKICAgIH0KCiAgICAvLyB9fX0KICAgIC8vIHt7eyByb2xsYmFjaygpCgogICAgLyoqCiAgICAgKiBSZXZlcnRzIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uCiAgICAgKgogICAgICogQHJldHVybiBpbnQgIERCX09LIG9uIHN1Y2Nlc3MuICBBIERCX0Vycm9yIG9iamVjdCBvbiBmYWlsdXJlLgogICAgICovCiAgICBmdW5jdGlvbiByb2xsYmFjaygpCiAgICB7CiAgICAgICAgaWYgKCR0aGlzLT50cmFuc2FjdGlvbl9vcGNvdW50ID4gMCkgewogICAgICAgICAgICBpZiAoIUBtc3NxbF9zZWxlY3RfZGIoJHRoaXMtPl9kYiwgJHRoaXMtPmNvbm5lY3Rpb24pKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPm1zc3FsUmFpc2VFcnJvcihEQl9FUlJPUl9OT0RCU0VMRUNURUQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRyZXN1bHQgPSBAbXNzcWxfcXVlcnkoJ1JPTExCQUNLIFRSQU4nLCAkdGhpcy0+Y29ubmVjdGlvbik7CiAgICAgICAgICAgICR0aGlzLT50cmFuc2FjdGlvbl9vcGNvdW50ID0gMDsKICAgICAgICAgICAgaWYgKCEkcmVzdWx0KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPm1zc3FsUmFpc2VFcnJvcigpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBEQl9PSzsKICAgIH0KCiAgICAvLyB9fX0KICAgIC8vIHt7eyBhZmZlY3RlZFJvd3MoKQoKICAgIC8qKgogICAgICogRGV0ZXJtaW5lcyB0aGUgbnVtYmVyIG9mIHJvd3MgYWZmZWN0ZWQgYnkgYSBkYXRhIG1hbml1cGxhdGlvbiBxdWVyeQogICAgICoKICAgICAqIDAgaXMgcmV0dXJuZWQgZm9yIHF1ZXJpZXMgdGhhdCBkb24ndCBtYW5pcHVsYXRlIGRhdGEuCiAgICAgKgogICAgICogQHJldHVybiBpbnQgIHRoZSBudW1iZXIgb2Ygcm93cy4gIEEgREJfRXJyb3Igb2JqZWN0IG9uIGZhaWx1cmUuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGFmZmVjdGVkUm93cygpCiAgICB7CiAgICAgICAgaWYgKCR0aGlzLT5fbGFzdF9xdWVyeV9tYW5pcCkgewogICAgICAgICAgICAkcmVzID0gQG1zc3FsX3F1ZXJ5KCdzZWxlY3QgQEByb3djb3VudCcsICR0aGlzLT5jb25uZWN0aW9uKTsKICAgICAgICAgICAgaWYgKCEkcmVzKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPm1zc3FsUmFpc2VFcnJvcigpOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRhciA9IEBtc3NxbF9mZXRjaF9yb3coJHJlcyk7CiAgICAgICAgICAgIGlmICghJGFyKSB7CiAgICAgICAgICAgICAgICAkcmVzdWx0ID0gMDsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIEBtc3NxbF9mcmVlX3Jlc3VsdCgkcmVzKTsKICAgICAgICAgICAgICAgICRyZXN1bHQgPSAkYXJbMF07CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkcmVzdWx0ID0gMDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICRyZXN1bHQ7CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgbmV4dElkKCkKCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIG5leHQgZnJlZSBpZCBpbiBhIHNlcXVlbmNlCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAgJHNlcV9uYW1lICBuYW1lIG9mIHRoZSBzZXF1ZW5jZQogICAgICogQHBhcmFtIGJvb2xlYW4gJG9uZGVtYW5kICB3aGVuIHRydWUsIHRoZSBzZXFlbmNlIGlzIGF1dG9tYXRpY2FsbHkKICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZWQgaWYgaXQgZG9lcyBub3QgZXhpc3QKICAgICAqCiAgICAgKiBAcmV0dXJuIGludCAgdGhlIG5leHQgaWQgbnVtYmVyIGluIHRoZSBzZXF1ZW5jZS4KICAgICAqICAgICAgICAgICAgICAgQSBEQl9FcnJvciBvYmplY3Qgb24gZmFpbHVyZS4KICAgICAqCiAgICAgKiBAc2VlIERCX2NvbW1vbjo6bmV4dElEKCksIERCX2NvbW1vbjo6Z2V0U2VxdWVuY2VOYW1lKCksCiAgICAgKiAgICAgIERCX21zc3FsOjpjcmVhdGVTZXF1ZW5jZSgpLCBEQl9tc3NxbDo6ZHJvcFNlcXVlbmNlKCkKICAgICAqLwogICAgZnVuY3Rpb24gbmV4dElkKCRzZXFfbmFtZSwgJG9uZGVtYW5kID0gdHJ1ZSkKICAgIHsKICAgICAgICAkc2VxbmFtZSA9ICR0aGlzLT5nZXRTZXF1ZW5jZU5hbWUoJHNlcV9uYW1lKTsKICAgICAgICBpZiAoIUBtc3NxbF9zZWxlY3RfZGIoJHRoaXMtPl9kYiwgJHRoaXMtPmNvbm5lY3Rpb24pKSB7CiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+bXNzcWxSYWlzZUVycm9yKERCX0VSUk9SX05PREJTRUxFQ1RFRCk7CiAgICAgICAgfQogICAgICAgICRyZXBlYXQgPSAwOwogICAgICAgIGRvIHsKICAgICAgICAgICAgJHRoaXMtPnB1c2hFcnJvckhhbmRsaW5nKFBFQVJfRVJST1JfUkVUVVJOKTsKICAgICAgICAgICAgJHJlc3VsdCA9ICR0aGlzLT5xdWVyeSgiSU5TRVJUIElOVE8gJHNlcW5hbWUgKHZhcG9yKSBWQUxVRVMgKDApIik7CiAgICAgICAgICAgICR0aGlzLT5wb3BFcnJvckhhbmRsaW5nKCk7CiAgICAgICAgICAgIGlmICgkb25kZW1hbmQgJiYgREI6OmlzRXJyb3IoJHJlc3VsdCkgJiYKICAgICAgICAgICAgICAgICgkcmVzdWx0LT5nZXRDb2RlKCkgPT0gREJfRVJST1IgfHwgJHJlc3VsdC0+Z2V0Q29kZSgpID09IERCX0VSUk9SX05PU1VDSFRBQkxFKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJHJlcGVhdCA9IDE7CiAgICAgICAgICAgICAgICAkcmVzdWx0ID0gJHRoaXMtPmNyZWF0ZVNlcXVlbmNlKCRzZXFfbmFtZSk7CiAgICAgICAgICAgICAgICBpZiAoREI6OmlzRXJyb3IoJHJlc3VsdCkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPnJhaXNlRXJyb3IoJHJlc3VsdCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZWlmICghREI6OmlzRXJyb3IoJHJlc3VsdCkpIHsKICAgICAgICAgICAgICAgICRyZXN1bHQgPSYgJHRoaXMtPnF1ZXJ5KCJTRUxFQ1QgSURFTlRfQ1VSUkVOVCgnJHNlcW5hbWUnKSIpOwogICAgICAgICAgICAgICAgaWYgKERCOjppc0Vycm9yKCRyZXN1bHQpKSB7CiAgICAgICAgICAgICAgICAgICAgLyogRmFsbGJhY2sgY29kZSBmb3IgTVMgU1FMIFNlcnZlciA3LjAsIHdoaWNoIGRvZXNuJ3QgaGF2ZQogICAgICAgICAgICAgICAgICAgICAqIElERU5UX0NVUlJFTlQuIFRoaXMgaXMgKm5vdCogc2FmZSBmb3IgY29uY3VycmVudAogICAgICAgICAgICAgICAgICAgICAqIHJlcXVlc3RzLCBhbmQgcmVhbGx5LCBpZiB5b3UncmUgdXNpbmcgaXQsIHlvdSdyZSBpbiBhCiAgICAgICAgICAgICAgICAgICAgICogd29ybGQgb2YgaHVydC4gTmV2ZXJ0aGVsZXNzLCBpdCdzIGhlcmUgdG8gZW5zdXJlIEJDLiBTZWUKICAgICAgICAgICAgICAgICAgICAgKiBidWcgIzE4MSBmb3IgdGhlIGdvcnkgZGV0YWlscy4qLwogICAgICAgICAgICAgICAgICAgICRyZXN1bHQgPSYgJHRoaXMtPnF1ZXJ5KCJTRUxFQ1QgQEBJREVOVElUWSBGUk9NICRzZXFuYW1lIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkcmVwZWF0ID0gMDsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICRyZXBlYXQgPSBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgIH0gd2hpbGUgKCRyZXBlYXQpOwogICAgICAgIGlmIChEQjo6aXNFcnJvcigkcmVzdWx0KSkgewogICAgICAgICAgICByZXR1cm4gJHRoaXMtPnJhaXNlRXJyb3IoJHJlc3VsdCk7CiAgICAgICAgfQogICAgICAgICRyZXN1bHQgPSAkcmVzdWx0LT5mZXRjaFJvdyhEQl9GRVRDSE1PREVfT1JERVJFRCk7CiAgICAgICAgcmV0dXJuICRyZXN1bHRbMF07CiAgICB9CgogICAgLyoqCiAgICAgKiBDcmVhdGVzIGEgbmV3IHNlcXVlbmNlCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkc2VxX25hbWUgIG5hbWUgb2YgdGhlIG5ldyBzZXF1ZW5jZQogICAgICoKICAgICAqIEByZXR1cm4gaW50ICBEQl9PSyBvbiBzdWNjZXNzLiAgQSBEQl9FcnJvciBvYmplY3Qgb24gZmFpbHVyZS4KICAgICAqCiAgICAgKiBAc2VlIERCX2NvbW1vbjo6Y3JlYXRlU2VxdWVuY2UoKSwgREJfY29tbW9uOjpnZXRTZXF1ZW5jZU5hbWUoKSwKICAgICAqICAgICAgREJfbXNzcWw6Om5leHRJRCgpLCBEQl9tc3NxbDo6ZHJvcFNlcXVlbmNlKCkKICAgICAqLwogICAgZnVuY3Rpb24gY3JlYXRlU2VxdWVuY2UoJHNlcV9uYW1lKQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+cXVlcnkoJ0NSRUFURSBUQUJMRSAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICR0aGlzLT5nZXRTZXF1ZW5jZU5hbWUoJHNlcV9uYW1lKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAnIChbaWRdIFtpbnRdIElERU5USVRZICgxLCAxKSBOT1QgTlVMTCwnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICcgW3ZhcG9yXSBbaW50XSBOVUxMKScpOwogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IGRyb3BTZXF1ZW5jZSgpCgogICAgLyoqCiAgICAgKiBEZWxldGVzIGEgc2VxdWVuY2UKICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICRzZXFfbmFtZSAgbmFtZSBvZiB0aGUgc2VxdWVuY2UgdG8gYmUgZGVsZXRlZAogICAgICoKICAgICAqIEByZXR1cm4gaW50ICBEQl9PSyBvbiBzdWNjZXNzLiAgQSBEQl9FcnJvciBvYmplY3Qgb24gZmFpbHVyZS4KICAgICAqCiAgICAgKiBAc2VlIERCX2NvbW1vbjo6ZHJvcFNlcXVlbmNlKCksIERCX2NvbW1vbjo6Z2V0U2VxdWVuY2VOYW1lKCksCiAgICAgKiAgICAgIERCX21zc3FsOjpuZXh0SUQoKSwgREJfbXNzcWw6OmNyZWF0ZVNlcXVlbmNlKCkKICAgICAqLwogICAgZnVuY3Rpb24gZHJvcFNlcXVlbmNlKCRzZXFfbmFtZSkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnF1ZXJ5KCdEUk9QIFRBQkxFICcgLiAkdGhpcy0+Z2V0U2VxdWVuY2VOYW1lKCRzZXFfbmFtZSkpOwogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IHF1b3RlSWRlbnRpZmllcigpCgogICAgLyoqCiAgICAgKiBRdW90ZXMgYSBzdHJpbmcgc28gaXQgY2FuIGJlIHNhZmVseSB1c2VkIGFzIGEgdGFibGUgb3IgY29sdW1uIG5hbWUKICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICRzdHIgIGlkZW50aWZpZXIgbmFtZSB0byBiZSBxdW90ZWQKICAgICAqCiAgICAgKiBAcmV0dXJuIHN0cmluZyAgcXVvdGVkIGlkZW50aWZpZXIgc3RyaW5nCiAgICAgKgogICAgICogQHNlZSBEQl9jb21tb246OnF1b3RlSWRlbnRpZmllcigpCiAgICAgKiBAc2luY2UgTWV0aG9kIGF2YWlsYWJsZSBzaW5jZSBSZWxlYXNlIDEuNi4wCiAgICAgKi8KICAgIGZ1bmN0aW9uIHF1b3RlSWRlbnRpZmllcigkc3RyKQogICAgewogICAgICAgIHJldHVybiAnWycgLiBzdHJfcmVwbGFjZSgnXScsICddXScsICRzdHIpIC4gJ10nOwogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IG1zc3FsUmFpc2VFcnJvcigpCgogICAgLyoqCiAgICAgKiBQcm9kdWNlcyBhIERCX0Vycm9yIG9iamVjdCByZWdhcmRpbmcgdGhlIGN1cnJlbnQgcHJvYmxlbQogICAgICoKICAgICAqIEBwYXJhbSBpbnQgJGVycm5vICBpZiB0aGUgZXJyb3IgaXMgYmVpbmcgbWFudWFsbHkgcmFpc2VkIHBhc3MgYQogICAgICogICAgICAgICAgICAgICAgICAgICBEQl9FUlJPUiogY29uc3RhbnQgaGVyZS4gIElmIHRoaXMgaXNuJ3QgcGFzc2VkCiAgICAgKiAgICAgICAgICAgICAgICAgICAgIHRoZSBlcnJvciBpbmZvcm1hdGlvbiBnYXRoZXJlZCBmcm9tIHRoZSBEQk1TLgogICAgICoKICAgICAqIEByZXR1cm4gb2JqZWN0ICB0aGUgREJfRXJyb3Igb2JqZWN0CiAgICAgKgogICAgICogQHNlZSBEQl9jb21tb246OnJhaXNlRXJyb3IoKSwKICAgICAqICAgICAgREJfbXNzcWw6OmVycm9yTmF0aXZlKCksIERCX21zc3FsOjplcnJvckNvZGUoKQogICAgICovCiAgICBmdW5jdGlvbiBtc3NxbFJhaXNlRXJyb3IoJGNvZGUgPSBudWxsKQogICAgewogICAgICAgICRtZXNzYWdlID0gQG1zc3FsX2dldF9sYXN0X21lc3NhZ2UoKTsKICAgICAgICBpZiAoISRjb2RlKSB7CiAgICAgICAgICAgICRjb2RlID0gJHRoaXMtPmVycm9yTmF0aXZlKCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiAkdGhpcy0+cmFpc2VFcnJvcigkdGhpcy0+ZXJyb3JDb2RlKCRjb2RlLCAkbWVzc2FnZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIG51bGwsIG51bGwsICIkY29kZSAtICRtZXNzYWdlIik7CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgZXJyb3JOYXRpdmUoKQoKICAgIC8qKgogICAgICogR2V0cyB0aGUgREJNUycgbmF0aXZlIGVycm9yIGNvZGUgcHJvZHVjZWQgYnkgdGhlIGxhc3QgcXVlcnkKICAgICAqCiAgICAgKiBAcmV0dXJuIGludCAgdGhlIERCTVMnIGVycm9yIGNvZGUKICAgICAqLwogICAgZnVuY3Rpb24gZXJyb3JOYXRpdmUoKQogICAgewogICAgICAgICRyZXMgPSBAbXNzcWxfcXVlcnkoJ3NlbGVjdCBAQEVSUk9SIGFzIEVycm9yQ29kZScsICR0aGlzLT5jb25uZWN0aW9uKTsKICAgICAgICBpZiAoISRyZXMpIHsKICAgICAgICAgICAgcmV0dXJuIERCX0VSUk9SOwogICAgICAgIH0KICAgICAgICAkcm93ID0gQG1zc3FsX2ZldGNoX3JvdygkcmVzKTsKICAgICAgICByZXR1cm4gJHJvd1swXTsKICAgIH0KCiAgICAvLyB9fX0KICAgIC8vIHt7eyBlcnJvckNvZGUoKQoKICAgIC8qKgogICAgICogRGV0ZXJtaW5lcyBQRUFSOjpEQiBlcnJvciBjb2RlIGZyb20gbXNzcWwncyBuYXRpdmUgY29kZXMuCiAgICAgKgogICAgICogSWYgPHZhcj4kbmF0aXZlY29kZTwvdmFyPiBpc24ndCBrbm93biB5ZXQsIGl0IHdpbGwgYmUgbG9va2VkIHVwLgogICAgICoKICAgICAqIEBwYXJhbSAgbWl4ZWQgICRuYXRpdmVjb2RlICBtc3NxbCBlcnJvciBjb2RlLCBpZiBrbm93bgogICAgICogQHJldHVybiBpbnRlZ2VyICBhbiBlcnJvciBudW1iZXIgZnJvbSBhIERCIGVycm9yIGNvbnN0YW50CiAgICAgKiBAc2VlIGVycm9yTmF0aXZlKCkKICAgICAqLwogICAgZnVuY3Rpb24gZXJyb3JDb2RlKCRuYXRpdmVjb2RlID0gbnVsbCwgJG1zZyA9ICcnKQogICAgewogICAgICAgIGlmICghJG5hdGl2ZWNvZGUpIHsKICAgICAgICAgICAgJG5hdGl2ZWNvZGUgPSAkdGhpcy0+ZXJyb3JOYXRpdmUoKTsKICAgICAgICB9CiAgICAgICAgaWYgKGlzc2V0KCR0aGlzLT5lcnJvcmNvZGVfbWFwWyRuYXRpdmVjb2RlXSkpIHsKICAgICAgICAgICAgaWYgKCRuYXRpdmVjb2RlID09IDM3MDEKICAgICAgICAgICAgICAgICYmIHByZWdfbWF0Y2goJy9DYW5ub3QgZHJvcCB0aGUgaW5kZXgvaScsICRtc2cpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gREJfRVJST1JfTk9UX0ZPVU5EOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+ZXJyb3Jjb2RlX21hcFskbmF0aXZlY29kZV07CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIERCX0VSUk9SOwogICAgICAgIH0KICAgIH0KCiAgICAvLyB9fX0KICAgIC8vIHt7eyB0YWJsZUluZm8oKQoKICAgIC8qKgogICAgICogUmV0dXJucyBpbmZvcm1hdGlvbiBhYm91dCBhIHRhYmxlIG9yIGEgcmVzdWx0IHNldAogICAgICoKICAgICAqIE5PVEU6IG9ubHkgc3VwcG9ydHMgJ3RhYmxlJyBhbmQgJ2ZsYWdzJyBpZiA8dmFyPiRyZXN1bHQ8L3Zhcj4KICAgICAqIGlzIGEgdGFibGUgbmFtZS4KICAgICAqCiAgICAgKiBAcGFyYW0gb2JqZWN0fHN0cmluZyAgJHJlc3VsdCAgREJfcmVzdWx0IG9iamVjdCBmcm9tIGEgcXVlcnkgb3IgYQogICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgY29udGFpbmluZyB0aGUgbmFtZSBvZiBhIHRhYmxlLgogICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaGlsZSB0aGlzIGFsc28gYWNjZXB0cyBhIHF1ZXJ5IHJlc3VsdAogICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZSBpZGVudGlmaWVyLCB0aGlzIGJlaGF2aW9yIGlzCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHJlY2F0ZWQuCiAgICAgKiBAcGFyYW0gaW50ICAgICAgICAgICAgJG1vZGUgICAgYSB2YWxpZCB0YWJsZUluZm8gbW9kZQogICAgICoKICAgICAqIEByZXR1cm4gYXJyYXkgIGFuIGFzc29jaWF0aXZlIGFycmF5IHdpdGggdGhlIGluZm9ybWF0aW9uIHJlcXVlc3RlZC4KICAgICAqICAgICAgICAgICAgICAgICBBIERCX0Vycm9yIG9iamVjdCBvbiBmYWlsdXJlLgogICAgICoKICAgICAqIEBzZWUgREJfY29tbW9uOjp0YWJsZUluZm8oKQogICAgICovCiAgICBmdW5jdGlvbiB0YWJsZUluZm8oJHJlc3VsdCwgJG1vZGUgPSBudWxsKQogICAgewogICAgICAgIGlmIChpc19zdHJpbmcoJHJlc3VsdCkpIHsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogUHJvYmFibHkgcmVjZWl2ZWQgYSB0YWJsZSBuYW1lLgogICAgICAgICAgICAgKiBDcmVhdGUgYSByZXN1bHQgcmVzb3VyY2UgaWRlbnRpZmllci4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGlmICghQG1zc3FsX3NlbGVjdF9kYigkdGhpcy0+X2RiLCAkdGhpcy0+Y29ubmVjdGlvbikpIHsKICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+bXNzcWxSYWlzZUVycm9yKERCX0VSUk9SX05PREJTRUxFQ1RFRCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJGlkID0gQG1zc3FsX3F1ZXJ5KCJTRUxFQ1QgKiBGUk9NICRyZXN1bHQgV0hFUkUgMT0wIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5jb25uZWN0aW9uKTsKICAgICAgICAgICAgJGdvdF9zdHJpbmcgPSB0cnVlOwogICAgICAgIH0gZWxzZWlmIChpc3NldCgkcmVzdWx0LT5yZXN1bHQpKSB7CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIFByb2JhYmx5IHJlY2VpdmVkIGEgcmVzdWx0IG9iamVjdC4KICAgICAgICAgICAgICogRXh0cmFjdCB0aGUgcmVzdWx0IHJlc291cmNlIGlkZW50aWZpZXIuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICAkaWQgPSAkcmVzdWx0LT5yZXN1bHQ7CiAgICAgICAgICAgICRnb3Rfc3RyaW5nID0gZmFsc2U7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogUHJvYmFibHkgcmVjZWl2ZWQgYSByZXN1bHQgcmVzb3VyY2UgaWRlbnRpZmllci4KICAgICAgICAgICAgICogQ29weSBpdC4KICAgICAgICAgICAgICogRGVwcmVjYXRlZC4gIEhlcmUgZm9yIGNvbXBhdGliaWxpdHkgb25seS4KICAgICAgICAgICAgICovCiAgICAgICAgICAgICRpZCA9ICRyZXN1bHQ7CiAgICAgICAgICAgICRnb3Rfc3RyaW5nID0gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICBpZiAoIWlzX3Jlc291cmNlKCRpZCkpIHsKICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5tc3NxbFJhaXNlRXJyb3IoREJfRVJST1JfTkVFRF9NT1JFX0RBVEEpOwogICAgICAgIH0KCiAgICAgICAgaWYgKCR0aGlzLT5vcHRpb25zWydwb3J0YWJpbGl0eSddICYgREJfUE9SVEFCSUxJVFlfTE9XRVJDQVNFKSB7CiAgICAgICAgICAgICRjYXNlX2Z1bmMgPSAnc3RydG9sb3dlcic7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJGNhc2VfZnVuYyA9ICdzdHJ2YWwnOwogICAgICAgIH0KCiAgICAgICAgJGNvdW50ID0gQG1zc3FsX251bV9maWVsZHMoJGlkKTsKICAgICAgICAkcmVzICAgPSBhcnJheSgpOwoKICAgICAgICBpZiAoJG1vZGUpIHsKICAgICAgICAgICAgJHJlc1snbnVtX2ZpZWxkcyddID0gJGNvdW50OwogICAgICAgIH0KCiAgICAgICAgZm9yICgkaSA9IDA7ICRpIDwgJGNvdW50OyAkaSsrKSB7CiAgICAgICAgICAgIGlmICgkZ290X3N0cmluZykgewogICAgICAgICAgICAgICAgJGZsYWdzID0gJHRoaXMtPl9tc3NxbF9maWVsZF9mbGFncygkcmVzdWx0LAogICAgICAgICAgICAgICAgICAgICAgICBAbXNzcWxfZmllbGRfbmFtZSgkaWQsICRpKSk7CiAgICAgICAgICAgICAgICBpZiAoREI6OmlzRXJyb3IoJGZsYWdzKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkZmxhZ3M7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkZmxhZ3MgPSAnJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJHJlc1skaV0gPSBhcnJheSgKICAgICAgICAgICAgICAgICd0YWJsZScgPT4gJGdvdF9zdHJpbmcgPyAkY2FzZV9mdW5jKCRyZXN1bHQpIDogJycsCiAgICAgICAgICAgICAgICAnbmFtZScgID0+ICRjYXNlX2Z1bmMoQG1zc3FsX2ZpZWxkX25hbWUoJGlkLCAkaSkpLAogICAgICAgICAgICAgICAgJ3R5cGUnICA9PiBAbXNzcWxfZmllbGRfdHlwZSgkaWQsICRpKSwKICAgICAgICAgICAgICAgICdsZW4nICAgPT4gQG1zc3FsX2ZpZWxkX2xlbmd0aCgkaWQsICRpKSwKICAgICAgICAgICAgICAgICdmbGFncycgPT4gJGZsYWdzLAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoJG1vZGUgJiBEQl9UQUJMRUlORk9fT1JERVIpIHsKICAgICAgICAgICAgICAgICRyZXNbJ29yZGVyJ11bJHJlc1skaV1bJ25hbWUnXV0gPSAkaTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoJG1vZGUgJiBEQl9UQUJMRUlORk9fT1JERVJUQUJMRSkgewogICAgICAgICAgICAgICAgJHJlc1snb3JkZXJ0YWJsZSddWyRyZXNbJGldWyd0YWJsZSddXVskcmVzWyRpXVsnbmFtZSddXSA9ICRpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBmcmVlIHRoZSByZXN1bHQgb25seSBpZiB3ZSB3ZXJlIGNhbGxlZCBvbiBhIHRhYmxlCiAgICAgICAgaWYgKCRnb3Rfc3RyaW5nKSB7CiAgICAgICAgICAgIEBtc3NxbF9mcmVlX3Jlc3VsdCgkaWQpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJHJlczsKICAgIH0KCiAgICAvLyB9fX0KICAgIC8vIHt7eyBfbXNzcWxfZmllbGRfZmxhZ3MoKQoKICAgIC8qKgogICAgICogR2V0IGEgY29sdW1uJ3MgZmxhZ3MKICAgICAqCiAgICAgKiBTdXBwb3J0cyAibm90X251bGwiLCAicHJpbWFyeV9rZXkiLAogICAgICogImF1dG9faW5jcmVtZW50IiAobXNzcWwgaWRlbnRpdHkpLCAidGltZXN0YW1wIiAobXNzcWwgdGltZXN0YW1wKSwKICAgICAqICJ1bmlxdWVfa2V5IiAobXNzcWwgdW5pcXVlIGluZGV4LCB1bmlxdWUgY2hlY2sgb3IgcHJpbWFyeV9rZXkpIGFuZAogICAgICogIm11bHRpcGxlX2tleSIgKG11bHRpa2V5IGluZGV4KQogICAgICoKICAgICAqIG1zc3FsIHRpbWVzdGFtcCBpcyBOT1Qgc2ltaWxhciB0byB0aGUgbXlzcWwgdGltZXN0YW1wIHNvIHRoaXMgaXMgbWF5YmUKICAgICAqIG5vdCB1c2VmdWwgYXQgYWxsIC0gaXMgdGhlIGJlaGF2aW91ciBvZiBteXNxbF9maWVsZF9mbGFncyB0aGF0IHByaW1hcnkKICAgICAqIGtleXMgYXJlIGFsd2F5IHVuaXF1ZT8gaXMgdGhlIGludGVycHJldGF0aW9uIG9mIG11bHRpcGxlX2tleSBjb3JyZWN0PwogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgJHRhYmxlICAgdGhlIHRhYmxlIG5hbWUKICAgICAqIEBwYXJhbSBzdHJpbmcgJGNvbHVtbiAgdGhlIGZpZWxkIG5hbWUKICAgICAqCiAgICAgKiBAcmV0dXJuIHN0cmluZyAgdGhlIGZsYWdzCiAgICAgKgogICAgICogQGFjY2VzcyBwcml2YXRlCiAgICAgKiBAYXV0aG9yIEpvZXJuIEJhcnRoZWwgPGpfYmFydGhlbEB3ZWIuZGU+CiAgICAgKi8KICAgIGZ1bmN0aW9uIF9tc3NxbF9maWVsZF9mbGFncygkdGFibGUsICRjb2x1bW4pCiAgICB7CiAgICAgICAgc3RhdGljICR0YWJsZU5hbWUgPSBudWxsOwogICAgICAgIHN0YXRpYyAkZmxhZ3MgPSBhcnJheSgpOwoKICAgICAgICBpZiAoJHRhYmxlICE9ICR0YWJsZU5hbWUpIHsKCiAgICAgICAgICAgICRmbGFncyA9IGFycmF5KCk7CiAgICAgICAgICAgICR0YWJsZU5hbWUgPSAkdGFibGU7CgogICAgICAgICAgICAvLyBnZXQgdW5pcXVlIGFuZCBwcmltYXJ5IGtleXMKICAgICAgICAgICAgJHJlcyA9ICR0aGlzLT5nZXRBbGwoIkVYRUMgU1BfSEVMUElOREVYICR0YWJsZSIsIERCX0ZFVENITU9ERV9BU1NPQyk7CiAgICAgICAgICAgIGlmIChEQjo6aXNFcnJvcigkcmVzKSkgewogICAgICAgICAgICAgICAgcmV0dXJuICRyZXM7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGZvcmVhY2ggKCRyZXMgYXMgJHZhbCkgewogICAgICAgICAgICAgICAgJGtleXMgPSBleHBsb2RlKCcsICcsICR2YWxbJ2luZGV4X2tleXMnXSk7CgogICAgICAgICAgICAgICAgaWYgKHNpemVvZigka2V5cykgPiAxKSB7CiAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAoJGtleXMgYXMgJGtleSkgewogICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+X2FkZF9mbGFnKCRmbGFnc1ska2V5XSwgJ211bHRpcGxlX2tleScpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoc3RycG9zKCR2YWxbJ2luZGV4X2Rlc2NyaXB0aW9uJ10sICdwcmltYXJ5IGtleScpKSB7CiAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAoJGtleXMgYXMgJGtleSkgewogICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+X2FkZF9mbGFnKCRmbGFnc1ska2V5XSwgJ3ByaW1hcnlfa2V5Jyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBlbHNlaWYgKHN0cnBvcygkdmFsWydpbmRleF9kZXNjcmlwdGlvbiddLCAndW5pcXVlJykpIHsKICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICgka2V5cyBhcyAka2V5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5fYWRkX2ZsYWcoJGZsYWdzWyRrZXldLCAndW5pcXVlX2tleScpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZ2V0IGF1dG9faW5jcmVtZW50LCBub3RfbnVsbCBhbmQgdGltZXN0YW1wCiAgICAgICAgICAgICRyZXMgPSAkdGhpcy0+Z2V0QWxsKCJFWEVDIFNQX0NPTFVNTlMgJHRhYmxlIiwgREJfRkVUQ0hNT0RFX0FTU09DKTsKICAgICAgICAgICAgaWYgKERCOjppc0Vycm9yKCRyZXMpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJHJlczsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZm9yZWFjaCAoJHJlcyBhcyAkdmFsKSB7CiAgICAgICAgICAgICAgICAkdmFsID0gYXJyYXlfY2hhbmdlX2tleV9jYXNlKCR2YWwsIENBU0VfTE9XRVIpOwogICAgICAgICAgICAgICAgaWYgKCR2YWxbJ251bGxhYmxlJ10gPT0gJzAnKSB7CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPl9hZGRfZmxhZygkZmxhZ3NbJHZhbFsnY29sdW1uX25hbWUnXV0sICdub3RfbnVsbCcpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHN0cnBvcygkdmFsWyd0eXBlX25hbWUnXSwgJ2lkZW50aXR5JykpIHsKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+X2FkZF9mbGFnKCRmbGFnc1skdmFsWydjb2x1bW5fbmFtZSddXSwgJ2F1dG9faW5jcmVtZW50Jyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoc3RycG9zKCR2YWxbJ3R5cGVfbmFtZSddLCAndGltZXN0YW1wJykpIHsKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+X2FkZF9mbGFnKCRmbGFnc1skdmFsWydjb2x1bW5fbmFtZSddXSwgJ3RpbWVzdGFtcCcpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoYXJyYXlfa2V5X2V4aXN0cygkY29sdW1uLCAkZmxhZ3MpKSB7CiAgICAgICAgICAgIHJldHVybihpbXBsb2RlKCcgJywgJGZsYWdzWyRjb2x1bW5dKSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiAnJzsKICAgIH0KCiAgICAvLyB9fX0KICAgIC8vIHt7eyBfYWRkX2ZsYWcoKQoKICAgIC8qKgogICAgICogQWRkcyBhIHN0cmluZyB0byB0aGUgZmxhZ3MgYXJyYXkgaWYgdGhlIGZsYWcgaXMgbm90IHlldCBpbiB0aGVyZQogICAgICogLSBpZiB0aGVyZSBpcyBubyBmbGFnIHByZXNlbnQgdGhlIGFycmF5IGlzIGNyZWF0ZWQKICAgICAqCiAgICAgKiBAcGFyYW0gYXJyYXkgICYkYXJyYXkgIHRoZSByZWZlcmVuY2UgdG8gdGhlIGZsYWctYXJyYXkKICAgICAqIEBwYXJhbSBzdHJpbmcgJHZhbHVlICAgdGhlIGZsYWcgdmFsdWUKICAgICAqCiAgICAgKiBAcmV0dXJuIHZvaWQKICAgICAqCiAgICAgKiBAYWNjZXNzIHByaXZhdGUKICAgICAqIEBhdXRob3IgSm9lcm4gQmFydGhlbCA8al9iYXJ0aGVsQHdlYi5kZT4KICAgICAqLwogICAgZnVuY3Rpb24gX2FkZF9mbGFnKCYkYXJyYXksICR2YWx1ZSkKICAgIHsKICAgICAgICBpZiAoIWlzX2FycmF5KCRhcnJheSkpIHsKICAgICAgICAgICAgJGFycmF5ID0gYXJyYXkoJHZhbHVlKTsKICAgICAgICB9IGVsc2VpZiAoIWluX2FycmF5KCR2YWx1ZSwgJGFycmF5KSkgewogICAgICAgICAgICBhcnJheV9wdXNoKCRhcnJheSwgJHZhbHVlKTsKICAgICAgICB9CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgZ2V0U3BlY2lhbFF1ZXJ5KCkKCiAgICAvKioKICAgICAqIE9idGFpbnMgdGhlIHF1ZXJ5IHN0cmluZyBuZWVkZWQgZm9yIGxpc3RpbmcgYSBnaXZlbiB0eXBlIG9mIG9iamVjdHMKICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICR0eXBlICB0aGUga2luZCBvZiBvYmplY3RzIHlvdSB3YW50IHRvIHJldHJpZXZlCiAgICAgKgogICAgICogQHJldHVybiBzdHJpbmcgIHRoZSBTUUwgcXVlcnkgc3RyaW5nIG9yIG51bGwgaWYgdGhlIGRyaXZlciBkb2Vzbid0CiAgICAgKiAgICAgICAgICAgICAgICAgIHN1cHBvcnQgdGhlIG9iamVjdCB0eXBlIHJlcXVlc3RlZAogICAgICoKICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkCiAgICAgKiBAc2VlIERCX2NvbW1vbjo6Z2V0TGlzdE9mKCkKICAgICAqLwogICAgZnVuY3Rpb24gZ2V0U3BlY2lhbFF1ZXJ5KCR0eXBlKQogICAgewogICAgICAgIHN3aXRjaCAoJHR5cGUpIHsKICAgICAgICAgICAgY2FzZSAndGFibGVzJzoKICAgICAgICAgICAgICAgIHJldHVybiAiU0VMRUNUIG5hbWUgRlJPTSBzeXNvYmplY3RzIFdIRVJFIHR5cGUgPSAnVSciCiAgICAgICAgICAgICAgICAgICAgICAgLiAnIE9SREVSIEJZIG5hbWUnOwogICAgICAgICAgICBjYXNlICd2aWV3cyc6CiAgICAgICAgICAgICAgICByZXR1cm4gIlNFTEVDVCBuYW1lIEZST00gc3lzb2JqZWN0cyBXSEVSRSB0eXBlID0gJ1YnIjsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgIH0KCiAgICAvLyB9fX0KfQoKLyoKICogTG9jYWwgdmFyaWFibGVzOgogKiB0YWItd2lkdGg6IDQKICogYy1iYXNpYy1vZmZzZXQ6IDQKICogRW5kOgogKi8KCj8+Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/pear/DB/mysql.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qIHZpbTogc2V0IGV4cGFuZHRhYiB0YWJzdG9wPTQgc2hpZnR3aWR0aD00IHNvZnR0YWJzdG9wPTQ6ICovCgovKioKICogVGhlIFBFQVIgREIgZHJpdmVyIGZvciBQSFAncyBteXNxbCBleHRlbnNpb24KICogZm9yIGludGVyYWN0aW5nIHdpdGggTXlTUUwgZGF0YWJhc2VzCiAqCiAqIFBIUCB2ZXJzaW9ucyA0IGFuZCA1CiAqCiAqIExJQ0VOU0U6IFRoaXMgc291cmNlIGZpbGUgaXMgc3ViamVjdCB0byB2ZXJzaW9uIDMuMCBvZiB0aGUgUEhQIGxpY2Vuc2UKICogdGhhdCBpcyBhdmFpbGFibGUgdGhyb3VnaCB0aGUgd29ybGQtd2lkZS13ZWIgYXQgdGhlIGZvbGxvd2luZyBVUkk6CiAqIGh0dHA6Ly93d3cucGhwLm5ldC9saWNlbnNlLzNfMC50eHQuICBJZiB5b3UgZGlkIG5vdCByZWNlaXZlIGEgY29weSBvZgogKiB0aGUgUEhQIExpY2Vuc2UgYW5kIGFyZSB1bmFibGUgdG8gb2J0YWluIGl0IHRocm91Z2ggdGhlIHdlYiwgcGxlYXNlCiAqIHNlbmQgYSBub3RlIHRvIGxpY2Vuc2VAcGhwLm5ldCBzbyB3ZSBjYW4gbWFpbCB5b3UgYSBjb3B5IGltbWVkaWF0ZWx5LgogKgogKiBAY2F0ZWdvcnkgICBEYXRhYmFzZQogKiBAcGFja2FnZSAgICBEQgogKiBAYXV0aG9yICAgICBTdGlnIEJha2tlbiA8c3NiQHBocC5uZXQ+CiAqIEBhdXRob3IgICAgIERhbmllbCBDb252aXNzb3IgPGRhbmllbGNAcGhwLm5ldD4KICogQGNvcHlyaWdodCAgMTk5Ny0yMDA1IFRoZSBQSFAgR3JvdXAKICogQGxpY2Vuc2UgICAgaHR0cDovL3d3dy5waHAubmV0L2xpY2Vuc2UvM18wLnR4dCAgUEhQIExpY2Vuc2UgMy4wCiAqIEB2ZXJzaW9uICAgIENWUzogJElkOiBteXNxbC5waHAsdiAxLjEyNCAyMDA3LzAxLzEyIDAzOjExOjE3IGFoYXJ2ZXkgRXhwICQKICogQGxpbmsgICAgICAgaHR0cDovL3BlYXIucGhwLm5ldC9wYWNrYWdlL0RCCiAqLwoKLyoqCiAqIE9idGFpbiB0aGUgREJfY29tbW9uIGNsYXNzIHNvIGl0IGNhbiBiZSBleHRlbmRlZCBmcm9tCiAqLwpyZXF1aXJlX29uY2UgJ0RCL2NvbW1vbi5waHAnOwoKLyoqCiAqIFRoZSBtZXRob2RzIFBFQVIgREIgdXNlcyB0byBpbnRlcmFjdCB3aXRoIFBIUCdzIG15c3FsIGV4dGVuc2lvbgogKiBmb3IgaW50ZXJhY3Rpbmcgd2l0aCBNeVNRTCBkYXRhYmFzZXMKICoKICogVGhlc2UgbWV0aG9kcyBvdmVybG9hZCB0aGUgb25lcyBkZWNsYXJlZCBpbiBEQl9jb21tb24uCiAqCiAqIEBjYXRlZ29yeSAgIERhdGFiYXNlCiAqIEBwYWNrYWdlICAgIERCCiAqIEBhdXRob3IgICAgIFN0aWcgQmFra2VuIDxzc2JAcGhwLm5ldD4KICogQGF1dGhvciAgICAgRGFuaWVsIENvbnZpc3NvciA8ZGFuaWVsY0BwaHAubmV0PgogKiBAY29weXJpZ2h0ICAxOTk3LTIwMDUgVGhlIFBIUCBHcm91cAogKiBAbGljZW5zZSAgICBodHRwOi8vd3d3LnBocC5uZXQvbGljZW5zZS8zXzAudHh0ICBQSFAgTGljZW5zZSAzLjAKICogQHZlcnNpb24gICAgUmVsZWFzZTogMS43LjEyCiAqIEBsaW5rICAgICAgIGh0dHA6Ly9wZWFyLnBocC5uZXQvcGFja2FnZS9EQgogKi8KY2xhc3MgREJfbXlzcWwgZXh0ZW5kcyBEQl9jb21tb24KewogICAgLy8ge3t7IHByb3BlcnRpZXMKCiAgICAvKioKICAgICAqIFRoZSBEQiBkcml2ZXIgdHlwZSAobXlzcWwsIG9jaTgsIG9kYmMsIGV0Yy4pCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICB2YXIgJHBocHR5cGUgPSAnbXlzcWwnOwoKICAgIC8qKgogICAgICogVGhlIGRhdGFiYXNlIHN5bnRheCB2YXJpYW50IHRvIGJlIHVzZWQgKGRiMiwgYWNjZXNzLCBldGMuKSwgaWYgYW55CiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICB2YXIgJGRic3ludGF4ID0gJ215c3FsJzsKCiAgICAvKioKICAgICAqIFRoZSBjYXBhYmlsaXRpZXMgb2YgdGhpcyBEQiBpbXBsZW1lbnRhdGlvbgogICAgICoKICAgICAqIFRoZSAnbmV3X2xpbmsnIGVsZW1lbnQgY29udGFpbnMgdGhlIFBIUCB2ZXJzaW9uIHRoYXQgZmlyc3QgcHJvdmlkZWQKICAgICAqIG5ld19saW5rIHN1cHBvcnQgZm9yIHRoaXMgREJNUy4gIENvbnRhaW5zIGZhbHNlIGlmIGl0J3MgdW5zdXBwb3J0ZWQuCiAgICAgKgogICAgICogTWVhbmluZyBvZiB0aGUgJ2xpbWl0JyBlbGVtZW50OgogICAgICogICArICdlbXVsYXRlJyA9IGVtdWxhdGUgd2l0aCBmZXRjaCByb3cgYnkgbnVtYmVyCiAgICAgKiAgICsgJ2FsdGVyJyAgID0gYWx0ZXIgdGhlIHF1ZXJ5CiAgICAgKiAgICsgZmFsc2UgICAgID0gc2tpcCByb3dzCiAgICAgKgogICAgICogQHZhciBhcnJheQogICAgICovCiAgICB2YXIgJGZlYXR1cmVzID0gYXJyYXkoCiAgICAgICAgJ2xpbWl0JyAgICAgICAgID0+ICdhbHRlcicsCiAgICAgICAgJ25ld19saW5rJyAgICAgID0+ICc0LjIuMCcsCiAgICAgICAgJ251bXJvd3MnICAgICAgID0+IHRydWUsCiAgICAgICAgJ3Bjb25uZWN0JyAgICAgID0+IHRydWUsCiAgICAgICAgJ3ByZXBhcmUnICAgICAgID0+IGZhbHNlLAogICAgICAgICdzc2wnICAgICAgICAgICA9PiBmYWxzZSwKICAgICAgICAndHJhbnNhY3Rpb25zJyAgPT4gdHJ1ZSwKICAgICk7CgogICAgLyoqCiAgICAgKiBBIG1hcHBpbmcgb2YgbmF0aXZlIGVycm9yIGNvZGVzIHRvIERCIGVycm9yIGNvZGVzCiAgICAgKiBAdmFyIGFycmF5CiAgICAgKi8KICAgIHZhciAkZXJyb3Jjb2RlX21hcCA9IGFycmF5KAogICAgICAgIDEwMDQgPT4gREJfRVJST1JfQ0FOTk9UX0NSRUFURSwKICAgICAgICAxMDA1ID0+IERCX0VSUk9SX0NBTk5PVF9DUkVBVEUsCiAgICAgICAgMTAwNiA9PiBEQl9FUlJPUl9DQU5OT1RfQ1JFQVRFLAogICAgICAgIDEwMDcgPT4gREJfRVJST1JfQUxSRUFEWV9FWElTVFMsCiAgICAgICAgMTAwOCA9PiBEQl9FUlJPUl9DQU5OT1RfRFJPUCwKICAgICAgICAxMDIyID0+IERCX0VSUk9SX0FMUkVBRFlfRVhJU1RTLAogICAgICAgIDEwNDQgPT4gREJfRVJST1JfQUNDRVNTX1ZJT0xBVElPTiwKICAgICAgICAxMDQ2ID0+IERCX0VSUk9SX05PREJTRUxFQ1RFRCwKICAgICAgICAxMDQ4ID0+IERCX0VSUk9SX0NPTlNUUkFJTlQsCiAgICAgICAgMTA0OSA9PiBEQl9FUlJPUl9OT1NVQ0hEQiwKICAgICAgICAxMDUwID0+IERCX0VSUk9SX0FMUkVBRFlfRVhJU1RTLAogICAgICAgIDEwNTEgPT4gREJfRVJST1JfTk9TVUNIVEFCTEUsCiAgICAgICAgMTA1NCA9PiBEQl9FUlJPUl9OT1NVQ0hGSUVMRCwKICAgICAgICAxMDYxID0+IERCX0VSUk9SX0FMUkVBRFlfRVhJU1RTLAogICAgICAgIDEwNjIgPT4gREJfRVJST1JfQUxSRUFEWV9FWElTVFMsCiAgICAgICAgMTA2NCA9PiBEQl9FUlJPUl9TWU5UQVgsCiAgICAgICAgMTA5MSA9PiBEQl9FUlJPUl9OT1RfRk9VTkQsCiAgICAgICAgMTEwMCA9PiBEQl9FUlJPUl9OT1RfTE9DS0VELAogICAgICAgIDExMzYgPT4gREJfRVJST1JfVkFMVUVfQ09VTlRfT05fUk9XLAogICAgICAgIDExNDIgPT4gREJfRVJST1JfQUNDRVNTX1ZJT0xBVElPTiwKICAgICAgICAxMTQ2ID0+IERCX0VSUk9SX05PU1VDSFRBQkxFLAogICAgICAgIDEyMTYgPT4gREJfRVJST1JfQ09OU1RSQUlOVCwKICAgICAgICAxMjE3ID0+IERCX0VSUk9SX0NPTlNUUkFJTlQsCiAgICAgICAgMTM1NiA9PiBEQl9FUlJPUl9ESVZaRVJPLAogICAgICAgIDE0NTEgPT4gREJfRVJST1JfQ09OU1RSQUlOVCwKICAgICAgICAxNDUyID0+IERCX0VSUk9SX0NPTlNUUkFJTlQsCiAgICApOwoKICAgIC8qKgogICAgICogVGhlIHJhdyBkYXRhYmFzZSBjb25uZWN0aW9uIGNyZWF0ZWQgYnkgUEhQCiAgICAgKiBAdmFyIHJlc291cmNlCiAgICAgKi8KICAgIHZhciAkY29ubmVjdGlvbjsKCiAgICAvKioKICAgICAqIFRoZSBEU04gaW5mb3JtYXRpb24gZm9yIGNvbm5lY3RpbmcgdG8gYSBkYXRhYmFzZQogICAgICogQHZhciBhcnJheQogICAgICovCiAgICB2YXIgJGRzbiA9IGFycmF5KCk7CgoKICAgIC8qKgogICAgICogU2hvdWxkIGRhdGEgbWFuaXB1bGF0aW9uIHF1ZXJpZXMgYmUgY29tbWl0dGVkIGF1dG9tYXRpY2FsbHk/CiAgICAgKiBAdmFyIGJvb2wKICAgICAqIEBhY2Nlc3MgcHJpdmF0ZQogICAgICovCiAgICB2YXIgJGF1dG9jb21taXQgPSB0cnVlOwoKICAgIC8qKgogICAgICogVGhlIHF1YW50aXR5IG9mIHRyYW5zYWN0aW9ucyBiZWd1bgogICAgICoKICAgICAqIHtAaW50ZXJuYWwgIFdoaWxlIHRoaXMgaXMgcHJpdmF0ZSwgaXQgY2FuJ3QgYWN0dWFsbHkgYmUgZGVzaWduYXRlZAogICAgICogcHJpdmF0ZSBpbiBQSFAgNSBiZWNhdXNlIGl0IGlzIGRpcmVjdGx5IGFjY2Vzc2VkIGluIHRoZSB0ZXN0IHN1aXRlLn19CiAgICAgKgogICAgICogQHZhciBpbnRlZ2VyCiAgICAgKiBAYWNjZXNzIHByaXZhdGUKICAgICAqLwogICAgdmFyICR0cmFuc2FjdGlvbl9vcGNvdW50ID0gMDsKCiAgICAvKioKICAgICAqIFRoZSBkYXRhYmFzZSBzcGVjaWZpZWQgaW4gdGhlIERTTgogICAgICoKICAgICAqIEl0J3MgYSBmaXggdG8gYWxsb3cgY2FsbHMgdG8gZGlmZmVyZW50IGRhdGFiYXNlcyBpbiB0aGUgc2FtZSBzY3JpcHQuCiAgICAgKgogICAgICogQHZhciBzdHJpbmcKICAgICAqIEBhY2Nlc3MgcHJpdmF0ZQogICAgICovCiAgICB2YXIgJF9kYiA9ICcnOwoKCiAgICAvLyB9fX0KICAgIC8vIHt7eyBjb25zdHJ1Y3RvcgoKICAgIC8qKgogICAgICogVGhpcyBjb25zdHJ1Y3RvciBjYWxscyA8a2JkPiR0aGlzLT5EQl9jb21tb24oKTwva2JkPgogICAgICoKICAgICAqIEByZXR1cm4gdm9pZAogICAgICovCiAgICBmdW5jdGlvbiBEQl9teXNxbCgpCiAgICB7CiAgICAgICAgJHRoaXMtPkRCX2NvbW1vbigpOwogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IGNvbm5lY3QoKQoKICAgIC8qKgogICAgICogQ29ubmVjdCB0byB0aGUgZGF0YWJhc2Ugc2VydmVyLCBsb2cgaW4gYW5kIG9wZW4gdGhlIGRhdGFiYXNlCiAgICAgKgogICAgICogRG9uJ3QgY2FsbCB0aGlzIG1ldGhvZCBkaXJlY3RseS4gIFVzZSBEQjo6Y29ubmVjdCgpIGluc3RlYWQuCiAgICAgKgogICAgICogUEVBUiBEQidzIG15c3FsIGRyaXZlciBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIGV4dHJhIERTTiBvcHRpb25zOgogICAgICogICArIG5ld19saW5rICAgICAgSWYgc2V0IHRvIHRydWUsIGNhdXNlcyBzdWJzZXF1ZW50IGNhbGxzIHRvIGNvbm5lY3QoKQogICAgICogICAgICAgICAgICAgICAgICAgIHRvIHJldHVybiBhIG5ldyBjb25uZWN0aW9uIGxpbmsgaW5zdGVhZCBvZiB0aGUKICAgICAqICAgICAgICAgICAgICAgICAgICBleGlzdGluZyBvbmUuICBXQVJOSU5HOiB0aGlzIGlzIG5vdCBwb3J0YWJsZSB0bwogICAgICogICAgICAgICAgICAgICAgICAgIG90aGVyIERCTVMncy4gQXZhaWxhYmxlIHNpbmNlIFBFQVIgREIgMS43LjAuCiAgICAgKiAgICsgY2xpZW50X2ZsYWdzICBBbnkgY29tYmluYXRpb24gb2YgTVlTUUxfQ0xJRU5UXyogY29uc3RhbnRzLgogICAgICogICAgICAgICAgICAgICAgICAgIE9ubHkgdXNlZCBpZiBQSFAgaXMgYXQgdmVyc2lvbiA0LjMuMCBvciBncmVhdGVyLgogICAgICogICAgICAgICAgICAgICAgICAgIEF2YWlsYWJsZSBzaW5jZSBQRUFSIERCIDEuNy4wLgogICAgICoKICAgICAqIEBwYXJhbSBhcnJheSAkZHNuICAgICAgICAgdGhlIGRhdGEgc291cmNlIG5hbWUKICAgICAqIEBwYXJhbSBib29sICAkcGVyc2lzdGVudCAgc2hvdWxkIHRoZSBjb25uZWN0aW9uIGJlIHBlcnNpc3RlbnQ/CiAgICAgKgogICAgICogQHJldHVybiBpbnQgIERCX09LIG9uIHN1Y2Nlc3MuIEEgREJfRXJyb3Igb2JqZWN0IG9uIGZhaWx1cmUuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGNvbm5lY3QoJGRzbiwgJHBlcnNpc3RlbnQgPSBmYWxzZSkKICAgIHsKICAgICAgICBpZiAoIVBFQVI6OmxvYWRFeHRlbnNpb24oJ215c3FsJykpIHsKICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5yYWlzZUVycm9yKERCX0VSUk9SX0VYVEVOU0lPTl9OT1RfRk9VTkQpOwogICAgICAgIH0KCiAgICAgICAgJHRoaXMtPmRzbiA9ICRkc247CiAgICAgICAgaWYgKCRkc25bJ2Ric3ludGF4J10pIHsKICAgICAgICAgICAgJHRoaXMtPmRic3ludGF4ID0gJGRzblsnZGJzeW50YXgnXTsKICAgICAgICB9CgogICAgICAgICRwYXJhbXMgPSBhcnJheSgpOwogICAgICAgIGlmICgkZHNuWydwcm90b2NvbCddICYmICRkc25bJ3Byb3RvY29sJ10gPT0gJ3VuaXgnKSB7CiAgICAgICAgICAgICRwYXJhbXNbMF0gPSAnOicgLiAkZHNuWydzb2NrZXQnXTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkcGFyYW1zWzBdID0gJGRzblsnaG9zdHNwZWMnXSA/ICRkc25bJ2hvc3RzcGVjJ10KICAgICAgICAgICAgICAgICAgICAgICAgIDogJ2xvY2FsaG9zdCc7CiAgICAgICAgICAgIGlmICgkZHNuWydwb3J0J10pIHsKICAgICAgICAgICAgICAgICRwYXJhbXNbMF0gLj0gJzonIC4gJGRzblsncG9ydCddOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICRwYXJhbXNbXSA9ICRkc25bJ3VzZXJuYW1lJ10gPyAkZHNuWyd1c2VybmFtZSddIDogbnVsbDsKICAgICAgICAkcGFyYW1zW10gPSAkZHNuWydwYXNzd29yZCddID8gJGRzblsncGFzc3dvcmQnXSA6IG51bGw7CgogICAgICAgIGlmICghJHBlcnNpc3RlbnQpIHsKICAgICAgICAgICAgaWYgKGlzc2V0KCRkc25bJ25ld19saW5rJ10pCiAgICAgICAgICAgICAgICAmJiAoJGRzblsnbmV3X2xpbmsnXSA9PSAndHJ1ZScgfHwgJGRzblsnbmV3X2xpbmsnXSA9PT0gdHJ1ZSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRwYXJhbXNbXSA9IHRydWU7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkcGFyYW1zW10gPSBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAodmVyc2lvbl9jb21wYXJlKHBocHZlcnNpb24oKSwgJzQuMy4wJywgJz49JykpIHsKICAgICAgICAgICAgJHBhcmFtc1tdID0gaXNzZXQoJGRzblsnY2xpZW50X2ZsYWdzJ10pCiAgICAgICAgICAgICAgICAgICAgICAgID8gJGRzblsnY2xpZW50X2ZsYWdzJ10gOiBudWxsOwogICAgICAgIH0KCiAgICAgICAgJGNvbm5lY3RfZnVuY3Rpb24gPSAkcGVyc2lzdGVudCA/ICdteXNxbF9wY29ubmVjdCcgOiAnbXlzcWxfY29ubmVjdCc7CgogICAgICAgICRpbmkgPSBpbmlfZ2V0KCd0cmFja19lcnJvcnMnKTsKICAgICAgICAkcGhwX2Vycm9ybXNnID0gJyc7CiAgICAgICAgaWYgKCRpbmkpIHsKICAgICAgICAgICAgJHRoaXMtPmNvbm5lY3Rpb24gPSBAY2FsbF91c2VyX2Z1bmNfYXJyYXkoJGNvbm5lY3RfZnVuY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRwYXJhbXMpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIEBpbmlfc2V0KCd0cmFja19lcnJvcnMnLCAxKTsKICAgICAgICAgICAgJHRoaXMtPmNvbm5lY3Rpb24gPSBAY2FsbF91c2VyX2Z1bmNfYXJyYXkoJGNvbm5lY3RfZnVuY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRwYXJhbXMpOwogICAgICAgICAgICBAaW5pX3NldCgndHJhY2tfZXJyb3JzJywgJGluaSk7CiAgICAgICAgfQoKICAgICAgICBpZiAoISR0aGlzLT5jb25uZWN0aW9uKSB7CiAgICAgICAgICAgIGlmICgoJGVyciA9IEBteXNxbF9lcnJvcigpKSAhPSAnJykgewogICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5yYWlzZUVycm9yKERCX0VSUk9SX0NPTk5FQ1RfRkFJTEVELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIG51bGwsIG51bGwsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRlcnIpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5yYWlzZUVycm9yKERCX0VSUk9SX0NPTk5FQ1RfRkFJTEVELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIG51bGwsIG51bGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHBocF9lcnJvcm1zZyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICgkZHNuWydkYXRhYmFzZSddKSB7CiAgICAgICAgICAgIGlmICghQG15c3FsX3NlbGVjdF9kYigkZHNuWydkYXRhYmFzZSddLCAkdGhpcy0+Y29ubmVjdGlvbikpIHsKICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+bXlzcWxSYWlzZUVycm9yKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJHRoaXMtPl9kYiA9ICRkc25bJ2RhdGFiYXNlJ107CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gREJfT0s7CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgZGlzY29ubmVjdCgpCgogICAgLyoqCiAgICAgKiBEaXNjb25uZWN0cyBmcm9tIHRoZSBkYXRhYmFzZSBzZXJ2ZXIKICAgICAqCiAgICAgKiBAcmV0dXJuIGJvb2wgIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZQogICAgICovCiAgICBmdW5jdGlvbiBkaXNjb25uZWN0KCkKICAgIHsKICAgICAgICAkcmV0ID0gQG15c3FsX2Nsb3NlKCR0aGlzLT5jb25uZWN0aW9uKTsKICAgICAgICAkdGhpcy0+Y29ubmVjdGlvbiA9IG51bGw7CiAgICAgICAgcmV0dXJuICRyZXQ7CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgc2ltcGxlUXVlcnkoKQoKICAgIC8qKgogICAgICogU2VuZHMgYSBxdWVyeSB0byB0aGUgZGF0YWJhc2Ugc2VydmVyCiAgICAgKgogICAgICogR2VuZXJhbGx5IHVzZXMgbXlzcWxfcXVlcnkoKS4gIElmIHlvdSB3YW50IHRvIHVzZQogICAgICogbXlzcWxfdW5idWZmZXJlZF9xdWVyeSgpIHNldCB0aGUgInJlc3VsdF9idWZmZXJpbmciIG9wdGlvbiB0byAwIHVzaW5nCiAgICAgKiBzZXRPcHRpb25zKCkuICBUaGlzIG9wdGlvbiB3YXMgYWRkZWQgaW4gUmVsZWFzZSAxLjcuMC4KICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICB0aGUgU1FMIHF1ZXJ5IHN0cmluZwogICAgICoKICAgICAqIEByZXR1cm4gbWl4ZWQgICsgYSBQSFAgcmVzdWx0IHJlc3JvdWNlIGZvciBzdWNjZXNzZnVsIFNFTEVDVCBxdWVyaWVzCiAgICAgKiAgICAgICAgICAgICAgICArIHRoZSBEQl9PSyBjb25zdGFudCBmb3Igb3RoZXIgc3VjY2Vzc2Z1bCBxdWVyaWVzCiAgICAgKiAgICAgICAgICAgICAgICArIGEgREJfRXJyb3Igb2JqZWN0IG9uIGZhaWx1cmUKICAgICAqLwogICAgZnVuY3Rpb24gc2ltcGxlUXVlcnkoJHF1ZXJ5KQogICAgewogICAgICAgICRpc21hbmlwID0gJHRoaXMtPl9jaGVja01hbmlwKCRxdWVyeSk7CiAgICAgICAgJHRoaXMtPmxhc3RfcXVlcnkgPSAkcXVlcnk7CiAgICAgICAgJHF1ZXJ5ID0gJHRoaXMtPm1vZGlmeVF1ZXJ5KCRxdWVyeSk7CiAgICAgICAgaWYgKCR0aGlzLT5fZGIpIHsKICAgICAgICAgICAgaWYgKCFAbXlzcWxfc2VsZWN0X2RiKCR0aGlzLT5fZGIsICR0aGlzLT5jb25uZWN0aW9uKSkgewogICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5teXNxbFJhaXNlRXJyb3IoREJfRVJST1JfTk9EQlNFTEVDVEVEKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoISR0aGlzLT5hdXRvY29tbWl0ICYmICRpc21hbmlwKSB7CiAgICAgICAgICAgIGlmICgkdGhpcy0+dHJhbnNhY3Rpb25fb3Bjb3VudCA9PSAwKSB7CiAgICAgICAgICAgICAgICAkcmVzdWx0ID0gQG15c3FsX3F1ZXJ5KCdTRVQgQVVUT0NPTU1JVD0wJywgJHRoaXMtPmNvbm5lY3Rpb24pOwogICAgICAgICAgICAgICAgJHJlc3VsdCA9IEBteXNxbF9xdWVyeSgnQkVHSU4nLCAkdGhpcy0+Y29ubmVjdGlvbik7CiAgICAgICAgICAgICAgICBpZiAoISRyZXN1bHQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPm15c3FsUmFpc2VFcnJvcigpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgICR0aGlzLT50cmFuc2FjdGlvbl9vcGNvdW50Kys7CiAgICAgICAgfQogICAgICAgIGlmICghJHRoaXMtPm9wdGlvbnNbJ3Jlc3VsdF9idWZmZXJpbmcnXSkgewogICAgICAgICAgICAkcmVzdWx0ID0gQG15c3FsX3VuYnVmZmVyZWRfcXVlcnkoJHF1ZXJ5LCAkdGhpcy0+Y29ubmVjdGlvbik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJHJlc3VsdCA9IEBteXNxbF9xdWVyeSgkcXVlcnksICR0aGlzLT5jb25uZWN0aW9uKTsKICAgICAgICB9CiAgICAgICAgaWYgKCEkcmVzdWx0KSB7CiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+bXlzcWxSYWlzZUVycm9yKCk7CiAgICAgICAgfQogICAgICAgIGlmIChpc19yZXNvdXJjZSgkcmVzdWx0KSkgewogICAgICAgICAgICByZXR1cm4gJHJlc3VsdDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIERCX09LOwogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IG5leHRSZXN1bHQoKQoKICAgIC8qKgogICAgICogTW92ZSB0aGUgaW50ZXJuYWwgbXlzcWwgcmVzdWx0IHBvaW50ZXIgdG8gdGhlIG5leHQgYXZhaWxhYmxlIHJlc3VsdAogICAgICoKICAgICAqIFRoaXMgbWV0aG9kIGhhcyBub3QgYmVlbiBpbXBsZW1lbnRlZCB5ZXQuCiAgICAgKgogICAgICogQHBhcmFtIGEgdmFsaWQgc3FsIHJlc3VsdCByZXNvdXJjZQogICAgICoKICAgICAqIEByZXR1cm4gZmFsc2UKICAgICAqLwogICAgZnVuY3Rpb24gbmV4dFJlc3VsdCgkcmVzdWx0KQogICAgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICAvLyB9fX0KICAgIC8vIHt7eyBmZXRjaEludG8oKQoKICAgIC8qKgogICAgICogUGxhY2VzIGEgcm93IGZyb20gdGhlIHJlc3VsdCBzZXQgaW50byB0aGUgZ2l2ZW4gYXJyYXkKICAgICAqCiAgICAgKiBGb3JtYXRpbmcgb2YgdGhlIGFycmF5IGFuZCB0aGUgZGF0YSB0aGVyZWluIGFyZSBjb25maWd1cmFibGUuCiAgICAgKiBTZWUgREJfcmVzdWx0OjpmZXRjaEludG8oKSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KICAgICAqCiAgICAgKiBUaGlzIG1ldGhvZCBpcyBub3QgbWVhbnQgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LiAgVXNlCiAgICAgKiBEQl9yZXN1bHQ6OmZldGNoSW50bygpIGluc3RlYWQuICBJdCBjYW4ndCBiZSBkZWNsYXJlZCAicHJvdGVjdGVkIgogICAgICogYmVjYXVzZSBEQl9yZXN1bHQgaXMgYSBzZXBhcmF0ZSBvYmplY3QuCiAgICAgKgogICAgICogQHBhcmFtIHJlc291cmNlICRyZXN1bHQgICAgdGhlIHF1ZXJ5IHJlc3VsdCByZXNvdXJjZQogICAgICogQHBhcmFtIGFycmF5ICAgICRhcnIgICAgICAgdGhlIHJlZmVyZW5jZWQgYXJyYXkgdG8gcHV0IHRoZSBkYXRhIGluCiAgICAgKiBAcGFyYW0gaW50ICAgICAgJGZldGNobW9kZSBob3cgdGhlIHJlc3VsdGluZyBhcnJheSBzaG91bGQgYmUgaW5kZXhlZAogICAgICogQHBhcmFtIGludCAgICAgICRyb3dudW0gICAgdGhlIHJvdyBudW1iZXIgdG8gZmV0Y2ggKDAgPSBmaXJzdCByb3cpCiAgICAgKgogICAgICogQHJldHVybiBtaXhlZCAgREJfT0sgb24gc3VjY2VzcywgTlVMTCB3aGVuIHRoZSBlbmQgb2YgYSByZXN1bHQgc2V0IGlzCiAgICAgKiAgICAgICAgICAgICAgICAgcmVhY2hlZCBvciBvbiBmYWlsdXJlCiAgICAgKgogICAgICogQHNlZSBEQl9yZXN1bHQ6OmZldGNoSW50bygpCiAgICAgKi8KICAgIGZ1bmN0aW9uIGZldGNoSW50bygkcmVzdWx0LCAmJGFyciwgJGZldGNobW9kZSwgJHJvd251bSA9IG51bGwpCiAgICB7CiAgICAgICAgaWYgKCRyb3dudW0gIT09IG51bGwpIHsKICAgICAgICAgICAgaWYgKCFAbXlzcWxfZGF0YV9zZWVrKCRyZXN1bHQsICRyb3dudW0pKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoJGZldGNobW9kZSAmIERCX0ZFVENITU9ERV9BU1NPQykgewogICAgICAgICAgICAkYXJyID0gQG15c3FsX2ZldGNoX2FycmF5KCRyZXN1bHQsIE1ZU1FMX0FTU09DKTsKICAgICAgICAgICAgaWYgKCR0aGlzLT5vcHRpb25zWydwb3J0YWJpbGl0eSddICYgREJfUE9SVEFCSUxJVFlfTE9XRVJDQVNFICYmICRhcnIpIHsKICAgICAgICAgICAgICAgICRhcnIgPSBhcnJheV9jaGFuZ2Vfa2V5X2Nhc2UoJGFyciwgQ0FTRV9MT1dFUik7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkYXJyID0gQG15c3FsX2ZldGNoX3JvdygkcmVzdWx0KTsKICAgICAgICB9CiAgICAgICAgaWYgKCEkYXJyKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICBpZiAoJHRoaXMtPm9wdGlvbnNbJ3BvcnRhYmlsaXR5J10gJiBEQl9QT1JUQUJJTElUWV9SVFJJTSkgewogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBFdmVuIHRob3VnaCB0aGlzIERCTVMgYWxyZWFkeSB0cmltcyBvdXRwdXQsIHdlIGRvIHRoaXMgYmVjYXVzZQogICAgICAgICAgICAgKiBhIGZpZWxkIG1pZ2h0IGhhdmUgaW50ZW50aW9uYWwgd2hpdGVzcGFjZSBhdCB0aGUgZW5kIHRoYXQKICAgICAgICAgICAgICogZ2V0cyByZW1vdmVkIGJ5IERCX1BPUlRBQklMSVRZX1JUUklNIHVuZGVyIGFub3RoZXIgZHJpdmVyLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgJHRoaXMtPl9ydHJpbUFycmF5VmFsdWVzKCRhcnIpOwogICAgICAgIH0KICAgICAgICBpZiAoJHRoaXMtPm9wdGlvbnNbJ3BvcnRhYmlsaXR5J10gJiBEQl9QT1JUQUJJTElUWV9OVUxMX1RPX0VNUFRZKSB7CiAgICAgICAgICAgICR0aGlzLT5fY29udmVydE51bGxBcnJheVZhbHVlc1RvRW1wdHkoJGFycik7CiAgICAgICAgfQogICAgICAgIHJldHVybiBEQl9PSzsKICAgIH0KCiAgICAvLyB9fX0KICAgIC8vIHt7eyBmcmVlUmVzdWx0KCkKCiAgICAvKioKICAgICAqIERlbGV0ZXMgdGhlIHJlc3VsdCBzZXQgYW5kIGZyZWVzIHRoZSBtZW1vcnkgb2NjdXBpZWQgYnkgdGhlIHJlc3VsdCBzZXQKICAgICAqCiAgICAgKiBUaGlzIG1ldGhvZCBpcyBub3QgbWVhbnQgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LiAgVXNlCiAgICAgKiBEQl9yZXN1bHQ6OmZyZWUoKSBpbnN0ZWFkLiAgSXQgY2FuJ3QgYmUgZGVjbGFyZWQgInByb3RlY3RlZCIKICAgICAqIGJlY2F1c2UgREJfcmVzdWx0IGlzIGEgc2VwYXJhdGUgb2JqZWN0LgogICAgICoKICAgICAqIEBwYXJhbSByZXNvdXJjZSAkcmVzdWx0ICBQSFAncyBxdWVyeSByZXN1bHQgcmVzb3VyY2UKICAgICAqCiAgICAgKiBAcmV0dXJuIGJvb2wgIFRSVUUgb24gc3VjY2VzcywgRkFMU0UgaWYgJHJlc3VsdCBpcyBpbnZhbGlkCiAgICAgKgogICAgICogQHNlZSBEQl9yZXN1bHQ6OmZyZWUoKQogICAgICovCiAgICBmdW5jdGlvbiBmcmVlUmVzdWx0KCRyZXN1bHQpCiAgICB7CiAgICAgICAgcmV0dXJuIGlzX3Jlc291cmNlKCRyZXN1bHQpID8gbXlzcWxfZnJlZV9yZXN1bHQoJHJlc3VsdCkgOiBmYWxzZTsKICAgIH0KCiAgICAvLyB9fX0KICAgIC8vIHt7eyBudW1Db2xzKCkKCiAgICAvKioKICAgICAqIEdldHMgdGhlIG51bWJlciBvZiBjb2x1bW5zIGluIGEgcmVzdWx0IHNldAogICAgICoKICAgICAqIFRoaXMgbWV0aG9kIGlzIG5vdCBtZWFudCB0byBiZSBjYWxsZWQgZGlyZWN0bHkuICBVc2UKICAgICAqIERCX3Jlc3VsdDo6bnVtQ29scygpIGluc3RlYWQuICBJdCBjYW4ndCBiZSBkZWNsYXJlZCAicHJvdGVjdGVkIgogICAgICogYmVjYXVzZSBEQl9yZXN1bHQgaXMgYSBzZXBhcmF0ZSBvYmplY3QuCiAgICAgKgogICAgICogQHBhcmFtIHJlc291cmNlICRyZXN1bHQgIFBIUCdzIHF1ZXJ5IHJlc3VsdCByZXNvdXJjZQogICAgICoKICAgICAqIEByZXR1cm4gaW50ICB0aGUgbnVtYmVyIG9mIGNvbHVtbnMuICBBIERCX0Vycm9yIG9iamVjdCBvbiBmYWlsdXJlLgogICAgICoKICAgICAqIEBzZWUgREJfcmVzdWx0OjpudW1Db2xzKCkKICAgICAqLwogICAgZnVuY3Rpb24gbnVtQ29scygkcmVzdWx0KQogICAgewogICAgICAgICRjb2xzID0gQG15c3FsX251bV9maWVsZHMoJHJlc3VsdCk7CiAgICAgICAgaWYgKCEkY29scykgewogICAgICAgICAgICByZXR1cm4gJHRoaXMtPm15c3FsUmFpc2VFcnJvcigpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJGNvbHM7CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgbnVtUm93cygpCgogICAgLyoqCiAgICAgKiBHZXRzIHRoZSBudW1iZXIgb2Ygcm93cyBpbiBhIHJlc3VsdCBzZXQKICAgICAqCiAgICAgKiBUaGlzIG1ldGhvZCBpcyBub3QgbWVhbnQgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LiAgVXNlCiAgICAgKiBEQl9yZXN1bHQ6Om51bVJvd3MoKSBpbnN0ZWFkLiAgSXQgY2FuJ3QgYmUgZGVjbGFyZWQgInByb3RlY3RlZCIKICAgICAqIGJlY2F1c2UgREJfcmVzdWx0IGlzIGEgc2VwYXJhdGUgb2JqZWN0LgogICAgICoKICAgICAqIEBwYXJhbSByZXNvdXJjZSAkcmVzdWx0ICBQSFAncyBxdWVyeSByZXN1bHQgcmVzb3VyY2UKICAgICAqCiAgICAgKiBAcmV0dXJuIGludCAgdGhlIG51bWJlciBvZiByb3dzLiAgQSBEQl9FcnJvciBvYmplY3Qgb24gZmFpbHVyZS4KICAgICAqCiAgICAgKiBAc2VlIERCX3Jlc3VsdDo6bnVtUm93cygpCiAgICAgKi8KICAgIGZ1bmN0aW9uIG51bVJvd3MoJHJlc3VsdCkKICAgIHsKICAgICAgICAkcm93cyA9IEBteXNxbF9udW1fcm93cygkcmVzdWx0KTsKICAgICAgICBpZiAoJHJvd3MgPT09IG51bGwpIHsKICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5teXNxbFJhaXNlRXJyb3IoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICRyb3dzOwogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IGF1dG9Db21taXQoKQoKICAgIC8qKgogICAgICogRW5hYmxlcyBvciBkaXNhYmxlcyBhdXRvbWF0aWMgY29tbWl0cwogICAgICoKICAgICAqIEBwYXJhbSBib29sICRvbm9mZiAgdHJ1ZSB0dXJucyBpdCBvbiwgZmFsc2UgdHVybnMgaXQgb2ZmCiAgICAgKgogICAgICogQHJldHVybiBpbnQgIERCX09LIG9uIHN1Y2Nlc3MuICBBIERCX0Vycm9yIG9iamVjdCBpZiB0aGUgZHJpdmVyCiAgICAgKiAgICAgICAgICAgICAgIGRvZXNuJ3Qgc3VwcG9ydCBhdXRvLWNvbW1pdHRpbmcgdHJhbnNhY3Rpb25zLgogICAgICovCiAgICBmdW5jdGlvbiBhdXRvQ29tbWl0KCRvbm9mZiA9IGZhbHNlKQogICAgewogICAgICAgIC8vIFhYWCBpZiAkdGhpcy0+dHJhbnNhY3Rpb25fb3Bjb3VudCA+IDAsIHdlIHNob3VsZCBwcm9iYWJseQogICAgICAgIC8vIGlzc3VlIGEgd2FybmluZyBoZXJlLgogICAgICAgICR0aGlzLT5hdXRvY29tbWl0ID0gJG9ub2ZmID8gdHJ1ZSA6IGZhbHNlOwogICAgICAgIHJldHVybiBEQl9PSzsKICAgIH0KCiAgICAvLyB9fX0KICAgIC8vIHt7eyBjb21taXQoKQoKICAgIC8qKgogICAgICogQ29tbWl0cyB0aGUgY3VycmVudCB0cmFuc2FjdGlvbgogICAgICoKICAgICAqIEByZXR1cm4gaW50ICBEQl9PSyBvbiBzdWNjZXNzLiAgQSBEQl9FcnJvciBvYmplY3Qgb24gZmFpbHVyZS4KICAgICAqLwogICAgZnVuY3Rpb24gY29tbWl0KCkKICAgIHsKICAgICAgICBpZiAoJHRoaXMtPnRyYW5zYWN0aW9uX29wY291bnQgPiAwKSB7CiAgICAgICAgICAgIGlmICgkdGhpcy0+X2RiKSB7CiAgICAgICAgICAgICAgICBpZiAoIUBteXNxbF9zZWxlY3RfZGIoJHRoaXMtPl9kYiwgJHRoaXMtPmNvbm5lY3Rpb24pKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5teXNxbFJhaXNlRXJyb3IoREJfRVJST1JfTk9EQlNFTEVDVEVEKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAkcmVzdWx0ID0gQG15c3FsX3F1ZXJ5KCdDT01NSVQnLCAkdGhpcy0+Y29ubmVjdGlvbik7CiAgICAgICAgICAgICRyZXN1bHQgPSBAbXlzcWxfcXVlcnkoJ1NFVCBBVVRPQ09NTUlUPTEnLCAkdGhpcy0+Y29ubmVjdGlvbik7CiAgICAgICAgICAgICR0aGlzLT50cmFuc2FjdGlvbl9vcGNvdW50ID0gMDsKICAgICAgICAgICAgaWYgKCEkcmVzdWx0KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPm15c3FsUmFpc2VFcnJvcigpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBEQl9PSzsKICAgIH0KCiAgICAvLyB9fX0KICAgIC8vIHt7eyByb2xsYmFjaygpCgogICAgLyoqCiAgICAgKiBSZXZlcnRzIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uCiAgICAgKgogICAgICogQHJldHVybiBpbnQgIERCX09LIG9uIHN1Y2Nlc3MuICBBIERCX0Vycm9yIG9iamVjdCBvbiBmYWlsdXJlLgogICAgICovCiAgICBmdW5jdGlvbiByb2xsYmFjaygpCiAgICB7CiAgICAgICAgaWYgKCR0aGlzLT50cmFuc2FjdGlvbl9vcGNvdW50ID4gMCkgewogICAgICAgICAgICBpZiAoJHRoaXMtPl9kYikgewogICAgICAgICAgICAgICAgaWYgKCFAbXlzcWxfc2VsZWN0X2RiKCR0aGlzLT5fZGIsICR0aGlzLT5jb25uZWN0aW9uKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+bXlzcWxSYWlzZUVycm9yKERCX0VSUk9SX05PREJTRUxFQ1RFRCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJHJlc3VsdCA9IEBteXNxbF9xdWVyeSgnUk9MTEJBQ0snLCAkdGhpcy0+Y29ubmVjdGlvbik7CiAgICAgICAgICAgICRyZXN1bHQgPSBAbXlzcWxfcXVlcnkoJ1NFVCBBVVRPQ09NTUlUPTEnLCAkdGhpcy0+Y29ubmVjdGlvbik7CiAgICAgICAgICAgICR0aGlzLT50cmFuc2FjdGlvbl9vcGNvdW50ID0gMDsKICAgICAgICAgICAgaWYgKCEkcmVzdWx0KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPm15c3FsUmFpc2VFcnJvcigpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBEQl9PSzsKICAgIH0KCiAgICAvLyB9fX0KICAgIC8vIHt7eyBhZmZlY3RlZFJvd3MoKQoKICAgIC8qKgogICAgICogRGV0ZXJtaW5lcyB0aGUgbnVtYmVyIG9mIHJvd3MgYWZmZWN0ZWQgYnkgYSBkYXRhIG1hbml1cGxhdGlvbiBxdWVyeQogICAgICoKICAgICAqIDAgaXMgcmV0dXJuZWQgZm9yIHF1ZXJpZXMgdGhhdCBkb24ndCBtYW5pcHVsYXRlIGRhdGEuCiAgICAgKgogICAgICogQHJldHVybiBpbnQgIHRoZSBudW1iZXIgb2Ygcm93cy4gIEEgREJfRXJyb3Igb2JqZWN0IG9uIGZhaWx1cmUuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGFmZmVjdGVkUm93cygpCiAgICB7CiAgICAgICAgaWYgKCR0aGlzLT5fbGFzdF9xdWVyeV9tYW5pcCkgewogICAgICAgICAgICByZXR1cm4gQG15c3FsX2FmZmVjdGVkX3Jvd3MoJHRoaXMtPmNvbm5lY3Rpb24pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgbmV4dElkKCkKCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIG5leHQgZnJlZSBpZCBpbiBhIHNlcXVlbmNlCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAgJHNlcV9uYW1lICBuYW1lIG9mIHRoZSBzZXF1ZW5jZQogICAgICogQHBhcmFtIGJvb2xlYW4gJG9uZGVtYW5kICB3aGVuIHRydWUsIHRoZSBzZXFlbmNlIGlzIGF1dG9tYXRpY2FsbHkKICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZWQgaWYgaXQgZG9lcyBub3QgZXhpc3QKICAgICAqCiAgICAgKiBAcmV0dXJuIGludCAgdGhlIG5leHQgaWQgbnVtYmVyIGluIHRoZSBzZXF1ZW5jZS4KICAgICAqICAgICAgICAgICAgICAgQSBEQl9FcnJvciBvYmplY3Qgb24gZmFpbHVyZS4KICAgICAqCiAgICAgKiBAc2VlIERCX2NvbW1vbjo6bmV4dElEKCksIERCX2NvbW1vbjo6Z2V0U2VxdWVuY2VOYW1lKCksCiAgICAgKiAgICAgIERCX215c3FsOjpjcmVhdGVTZXF1ZW5jZSgpLCBEQl9teXNxbDo6ZHJvcFNlcXVlbmNlKCkKICAgICAqLwogICAgZnVuY3Rpb24gbmV4dElkKCRzZXFfbmFtZSwgJG9uZGVtYW5kID0gdHJ1ZSkKICAgIHsKICAgICAgICAkc2VxbmFtZSA9ICR0aGlzLT5nZXRTZXF1ZW5jZU5hbWUoJHNlcV9uYW1lKTsKICAgICAgICBkbyB7CiAgICAgICAgICAgICRyZXBlYXQgPSAwOwogICAgICAgICAgICAkdGhpcy0+cHVzaEVycm9ySGFuZGxpbmcoUEVBUl9FUlJPUl9SRVRVUk4pOwogICAgICAgICAgICAkcmVzdWx0ID0gJHRoaXMtPnF1ZXJ5KCJVUERBVEUgJHtzZXFuYW1lfSAiLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdTRVQgaWQ9TEFTVF9JTlNFUlRfSUQoaWQrMSknKTsKICAgICAgICAgICAgJHRoaXMtPnBvcEVycm9ySGFuZGxpbmcoKTsKICAgICAgICAgICAgaWYgKCRyZXN1bHQgPT09IERCX09LKSB7CiAgICAgICAgICAgICAgICAvLyBDT01NT04gQ0FTRQogICAgICAgICAgICAgICAgJGlkID0gQG15c3FsX2luc2VydF9pZCgkdGhpcy0+Y29ubmVjdGlvbik7CiAgICAgICAgICAgICAgICBpZiAoJGlkICE9IDApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJGlkOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gRU1QVFkgU0VRIFRBQkxFCiAgICAgICAgICAgICAgICAvLyBTZXF1ZW5jZSB0YWJsZSBtdXN0IGJlIGVtcHR5IGZvciBzb21lIHJlYXNvbiwgc28gZmlsbAogICAgICAgICAgICAgICAgLy8gaXQgYW5kIHJldHVybiAxIGFuZCBvYnRhaW4gYSB1c2VyLWxldmVsIGxvY2sKICAgICAgICAgICAgICAgICRyZXN1bHQgPSAkdGhpcy0+Z2V0T25lKCJTRUxFQ1QgR0VUX0xPQ0soJyR7c2VxbmFtZX1fbG9jaycsMTApIik7CiAgICAgICAgICAgICAgICBpZiAoREI6OmlzRXJyb3IoJHJlc3VsdCkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPnJhaXNlRXJyb3IoJHJlc3VsdCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoJHJlc3VsdCA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gRmFpbGVkIHRvIGdldCB0aGUgbG9jawogICAgICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+bXlzcWxSYWlzZUVycm9yKERCX0VSUk9SX05PVF9MT0NLRUQpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGFkZCB0aGUgZGVmYXVsdCB2YWx1ZQogICAgICAgICAgICAgICAgJHJlc3VsdCA9ICR0aGlzLT5xdWVyeSgiUkVQTEFDRSBJTlRPICR7c2VxbmFtZX0gKGlkKSBWQUxVRVMgKDApIik7CiAgICAgICAgICAgICAgICBpZiAoREI6OmlzRXJyb3IoJHJlc3VsdCkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPnJhaXNlRXJyb3IoJHJlc3VsdCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gUmVsZWFzZSB0aGUgbG9jawogICAgICAgICAgICAgICAgJHJlc3VsdCA9ICR0aGlzLT5nZXRPbmUoJ1NFTEVDVCBSRUxFQVNFX0xPQ0soJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiJyR7c2VxbmFtZX1fbG9jaycpIik7CiAgICAgICAgICAgICAgICBpZiAoREI6OmlzRXJyb3IoJHJlc3VsdCkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPnJhaXNlRXJyb3IoJHJlc3VsdCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvLyBXZSBrbm93IHdoYXQgdGhlIHJlc3VsdCB3aWxsIGJlLCBzbyBubyBuZWVkIHRvIHRyeSBhZ2FpbgogICAgICAgICAgICAgICAgcmV0dXJuIDE7CgogICAgICAgICAgICB9IGVsc2VpZiAoJG9uZGVtYW5kICYmIERCOjppc0Vycm9yKCRyZXN1bHQpICYmCiAgICAgICAgICAgICAgICAkcmVzdWx0LT5nZXRDb2RlKCkgPT0gREJfRVJST1JfTk9TVUNIVEFCTEUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIE9OREVNQU5EIFRBQkxFIENSRUFUSU9OCiAgICAgICAgICAgICAgICAkcmVzdWx0ID0gJHRoaXMtPmNyZWF0ZVNlcXVlbmNlKCRzZXFfbmFtZSk7CiAgICAgICAgICAgICAgICBpZiAoREI6OmlzRXJyb3IoJHJlc3VsdCkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPnJhaXNlRXJyb3IoJHJlc3VsdCk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICRyZXBlYXQgPSAxOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgfSBlbHNlaWYgKERCOjppc0Vycm9yKCRyZXN1bHQpICYmCiAgICAgICAgICAgICAgICAgICAgICAkcmVzdWx0LT5nZXRDb2RlKCkgPT0gREJfRVJST1JfQUxSRUFEWV9FWElTVFMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIEJBQ0tXQVJEUyBDT01QQVQKICAgICAgICAgICAgICAgIC8vIHNlZSBfQkNzZXF1ZW5jZSgpIGNvbW1lbnQKICAgICAgICAgICAgICAgICRyZXN1bHQgPSAkdGhpcy0+X0JDc2VxdWVuY2UoJHNlcW5hbWUpOwogICAgICAgICAgICAgICAgaWYgKERCOjppc0Vycm9yKCRyZXN1bHQpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5yYWlzZUVycm9yKCRyZXN1bHQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJHJlcGVhdCA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9IHdoaWxlICgkcmVwZWF0KTsKCiAgICAgICAgcmV0dXJuICR0aGlzLT5yYWlzZUVycm9yKCRyZXN1bHQpOwogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IGNyZWF0ZVNlcXVlbmNlKCkKCiAgICAvKioKICAgICAqIENyZWF0ZXMgYSBuZXcgc2VxdWVuY2UKICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICRzZXFfbmFtZSAgbmFtZSBvZiB0aGUgbmV3IHNlcXVlbmNlCiAgICAgKgogICAgICogQHJldHVybiBpbnQgIERCX09LIG9uIHN1Y2Nlc3MuICBBIERCX0Vycm9yIG9iamVjdCBvbiBmYWlsdXJlLgogICAgICoKICAgICAqIEBzZWUgREJfY29tbW9uOjpjcmVhdGVTZXF1ZW5jZSgpLCBEQl9jb21tb246OmdldFNlcXVlbmNlTmFtZSgpLAogICAgICogICAgICBEQl9teXNxbDo6bmV4dElEKCksIERCX215c3FsOjpkcm9wU2VxdWVuY2UoKQogICAgICovCiAgICBmdW5jdGlvbiBjcmVhdGVTZXF1ZW5jZSgkc2VxX25hbWUpCiAgICB7CiAgICAgICAgJHNlcW5hbWUgPSAkdGhpcy0+Z2V0U2VxdWVuY2VOYW1lKCRzZXFfbmFtZSk7CiAgICAgICAgJHJlcyA9ICR0aGlzLT5xdWVyeSgnQ1JFQVRFIFRBQkxFICcgLiAkc2VxbmFtZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAnIChpZCBJTlRFR0VSIFVOU0lHTkVEIEFVVE9fSU5DUkVNRU5UIE5PVCBOVUxMLCcKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJyBQUklNQVJZIEtFWShpZCkpJyk7CiAgICAgICAgaWYgKERCOjppc0Vycm9yKCRyZXMpKSB7CiAgICAgICAgICAgIHJldHVybiAkcmVzOwogICAgICAgIH0KICAgICAgICAvLyBpbnNlcnQgeWllbGRzIHZhbHVlIDEsIG5leHRJZCBjYWxsIHdpbGwgZ2VuZXJhdGUgSUQgMgogICAgICAgICRyZXMgPSAkdGhpcy0+cXVlcnkoIklOU0VSVCBJTlRPICR7c2VxbmFtZX0gKGlkKSBWQUxVRVMgKDApIik7CiAgICAgICAgaWYgKERCOjppc0Vycm9yKCRyZXMpKSB7CiAgICAgICAgICAgIHJldHVybiAkcmVzOwogICAgICAgIH0KICAgICAgICAvLyBzbyByZXNldCB0byB6ZXJvCiAgICAgICAgcmV0dXJuICR0aGlzLT5xdWVyeSgiVVBEQVRFICR7c2VxbmFtZX0gU0VUIGlkID0gMCIpOwogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IGRyb3BTZXF1ZW5jZSgpCgogICAgLyoqCiAgICAgKiBEZWxldGVzIGEgc2VxdWVuY2UKICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICRzZXFfbmFtZSAgbmFtZSBvZiB0aGUgc2VxdWVuY2UgdG8gYmUgZGVsZXRlZAogICAgICoKICAgICAqIEByZXR1cm4gaW50ICBEQl9PSyBvbiBzdWNjZXNzLiAgQSBEQl9FcnJvciBvYmplY3Qgb24gZmFpbHVyZS4KICAgICAqCiAgICAgKiBAc2VlIERCX2NvbW1vbjo6ZHJvcFNlcXVlbmNlKCksIERCX2NvbW1vbjo6Z2V0U2VxdWVuY2VOYW1lKCksCiAgICAgKiAgICAgIERCX215c3FsOjpuZXh0SUQoKSwgREJfbXlzcWw6OmNyZWF0ZVNlcXVlbmNlKCkKICAgICAqLwogICAgZnVuY3Rpb24gZHJvcFNlcXVlbmNlKCRzZXFfbmFtZSkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnF1ZXJ5KCdEUk9QIFRBQkxFICcgLiAkdGhpcy0+Z2V0U2VxdWVuY2VOYW1lKCRzZXFfbmFtZSkpOwogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IF9CQ3NlcXVlbmNlKCkKCiAgICAvKioKICAgICAqIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHdpdGggb2xkIHNlcXVlbmNlIGVtdWxhdGlvbiBpbXBsZW1lbnRhdGlvbgogICAgICogKGNsZWFuIHVwIHRoZSBkdXBlcykKICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICRzZXFuYW1lICB0aGUgc2VxdWVuY2UgbmFtZSB0byBjbGVhbiB1cAogICAgICoKICAgICAqIEByZXR1cm4gYm9vbCAgdHJ1ZSBvbiBzdWNjZXNzLiAgQSBEQl9FcnJvciBvYmplY3Qgb24gZmFpbHVyZS4KICAgICAqCiAgICAgKiBAYWNjZXNzIHByaXZhdGUKICAgICAqLwogICAgZnVuY3Rpb24gX0JDc2VxdWVuY2UoJHNlcW5hbWUpCiAgICB7CiAgICAgICAgLy8gT2J0YWluIGEgdXNlci1sZXZlbCBsb2NrLi4uIHRoaXMgd2lsbCByZWxlYXNlIGFueSBwcmV2aW91cwogICAgICAgIC8vIGFwcGxpY2F0aW9uIGxvY2tzLCBidXQgdW5saWtlIExPQ0sgVEFCTEVTLCBpdCBkb2VzIG5vdCBhYm9ydAogICAgICAgIC8vIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uIGFuZCBpcyBtdWNoIGxlc3MgZnJlcXVlbnRseSB1c2VkLgogICAgICAgICRyZXN1bHQgPSAkdGhpcy0+Z2V0T25lKCJTRUxFQ1QgR0VUX0xPQ0soJyR7c2VxbmFtZX1fbG9jaycsMTApIik7CiAgICAgICAgaWYgKERCOjppc0Vycm9yKCRyZXN1bHQpKSB7CiAgICAgICAgICAgIHJldHVybiAkcmVzdWx0OwogICAgICAgIH0KICAgICAgICBpZiAoJHJlc3VsdCA9PSAwKSB7CiAgICAgICAgICAgIC8vIEZhaWxlZCB0byBnZXQgdGhlIGxvY2ssIGNhbid0IGRvIHRoZSBjb252ZXJzaW9uLCBiYWlsCiAgICAgICAgICAgIC8vIHdpdGggYSBEQl9FUlJPUl9OT1RfTE9DS0VEIGVycm9yCiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+bXlzcWxSYWlzZUVycm9yKERCX0VSUk9SX05PVF9MT0NLRUQpOwogICAgICAgIH0KCiAgICAgICAgJGhpZ2hlc3RfaWQgPSAkdGhpcy0+Z2V0T25lKCJTRUxFQ1QgTUFYKGlkKSBGUk9NICR7c2VxbmFtZX0iKTsKICAgICAgICBpZiAoREI6OmlzRXJyb3IoJGhpZ2hlc3RfaWQpKSB7CiAgICAgICAgICAgIHJldHVybiAkaGlnaGVzdF9pZDsKICAgICAgICB9CiAgICAgICAgLy8gVGhpcyBzaG91bGQga2lsbCBhbGwgcm93cyBleGNlcHQgdGhlIGhpZ2hlc3QKICAgICAgICAvLyBXZSBzaG91bGQgcHJvYmFibHkgZG8gc29tZXRoaW5nIGlmICRoaWdoZXN0X2lkIGlzbid0CiAgICAgICAgLy8gbnVtZXJpYywgYnV0IEknbSBhdCBhIGxvc3MgYXMgaG93IHRvIGhhbmRsZSB0aGF0Li4uCiAgICAgICAgJHJlc3VsdCA9ICR0aGlzLT5xdWVyeSgnREVMRVRFIEZST00gJyAuICRzZXFuYW1lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgV0hFUkUgaWQgPD4gJGhpZ2hlc3RfaWQiKTsKICAgICAgICBpZiAoREI6OmlzRXJyb3IoJHJlc3VsdCkpIHsKICAgICAgICAgICAgcmV0dXJuICRyZXN1bHQ7CiAgICAgICAgfQoKICAgICAgICAvLyBJZiBhbm90aGVyIHRocmVhZCBoYXMgYmVlbiB3YWl0aW5nIGZvciB0aGlzIGxvY2ssCiAgICAgICAgLy8gaXQgd2lsbCBnbyB0aHJ1IHRoZSBhYm92ZSBwcm9jZWR1cmUsIGJ1dCB3aWxsIGhhdmUgbm8KICAgICAgICAvLyByZWFsIGVmZmVjdAogICAgICAgICRyZXN1bHQgPSAkdGhpcy0+Z2V0T25lKCJTRUxFQ1QgUkVMRUFTRV9MT0NLKCcke3NlcW5hbWV9X2xvY2snKSIpOwogICAgICAgIGlmIChEQjo6aXNFcnJvcigkcmVzdWx0KSkgewogICAgICAgICAgICByZXR1cm4gJHJlc3VsdDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgcXVvdGVJZGVudGlmaWVyKCkKCiAgICAvKioKICAgICAqIFF1b3RlcyBhIHN0cmluZyBzbyBpdCBjYW4gYmUgc2FmZWx5IHVzZWQgYXMgYSB0YWJsZSBvciBjb2x1bW4gbmFtZQogICAgICogKFdBUk5JTkc6IHVzaW5nIG5hbWVzIHRoYXQgcmVxdWlyZSB0aGlzIGlzIGEgUkVBTExZIEJBRCBJREVBKQogICAgICoKICAgICAqIFdBUk5JTkc6ICBPbGRlciB2ZXJzaW9ucyBvZiBNeVNRTCBjYW4ndCBoYW5kbGUgdGhlIGJhY2t0aWNrCiAgICAgKiBjaGFyYWN0ZXIgKDxrYmQ+YDwva2JkPikgaW4gdGFibGUgb3IgY29sdW1uIG5hbWVzLgogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgJHN0ciAgaWRlbnRpZmllciBuYW1lIHRvIGJlIHF1b3RlZAogICAgICoKICAgICAqIEByZXR1cm4gc3RyaW5nICBxdW90ZWQgaWRlbnRpZmllciBzdHJpbmcKICAgICAqCiAgICAgKiBAc2VlIERCX2NvbW1vbjo6cXVvdGVJZGVudGlmaWVyKCkKICAgICAqIEBzaW5jZSBNZXRob2QgYXZhaWxhYmxlIHNpbmNlIFJlbGVhc2UgMS42LjAKICAgICAqLwogICAgZnVuY3Rpb24gcXVvdGVJZGVudGlmaWVyKCRzdHIpCiAgICB7CiAgICAgICAgcmV0dXJuICdgJyAuIHN0cl9yZXBsYWNlKCdgJywgJ2BgJywgJHN0cikgLiAnYCc7CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgcXVvdGUoKQoKICAgIC8qKgogICAgICogQGRlcHJlY2F0ZWQgIERlcHJlY2F0ZWQgaW4gcmVsZWFzZSAxLjYuMAogICAgICovCiAgICBmdW5jdGlvbiBxdW90ZSgkc3RyKQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+cXVvdGVTbWFydCgkc3RyKTsKICAgIH0KCiAgICAvLyB9fX0KICAgIC8vIHt7eyBlc2NhcGVTaW1wbGUoKQoKICAgIC8qKgogICAgICogRXNjYXBlcyBhIHN0cmluZyBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgREJNUydzIHN0YW5kYXJkcwogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgJHN0ciAgdGhlIHN0cmluZyB0byBiZSBlc2NhcGVkCiAgICAgKgogICAgICogQHJldHVybiBzdHJpbmcgIHRoZSBlc2NhcGVkIHN0cmluZwogICAgICoKICAgICAqIEBzZWUgREJfY29tbW9uOjpxdW90ZVNtYXJ0KCkKICAgICAqIEBzaW5jZSBNZXRob2QgYXZhaWxhYmxlIHNpbmNlIFJlbGVhc2UgMS42LjAKICAgICAqLwogICAgZnVuY3Rpb24gZXNjYXBlU2ltcGxlKCRzdHIpCiAgICB7CiAgICAgICAgaWYgKGZ1bmN0aW9uX2V4aXN0cygnbXlzcWxfcmVhbF9lc2NhcGVfc3RyaW5nJykpIHsKICAgICAgICAgICAgcmV0dXJuIEBteXNxbF9yZWFsX2VzY2FwZV9zdHJpbmcoJHN0ciwgJHRoaXMtPmNvbm5lY3Rpb24pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiBAbXlzcWxfZXNjYXBlX3N0cmluZygkc3RyKTsKICAgICAgICB9CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgbW9kaWZ5UXVlcnkoKQoKICAgIC8qKgogICAgICogQ2hhbmdlcyBhIHF1ZXJ5IHN0cmluZyBmb3IgdmFyaW91cyBEQk1TIHNwZWNpZmljIHJlYXNvbnMKICAgICAqCiAgICAgKiBUaGlzIGxpdHRsZSBoYWNrIGxldHMgeW91IGtub3cgaG93IG1hbnkgcm93cyB3ZXJlIGRlbGV0ZWQKICAgICAqIHdoZW4gcnVubmluZyBhICJERUxFVEUgRlJPTSB0YWJsZSIgcXVlcnkuICBPbmx5IGltcGxlbWVudGVkCiAgICAgKiBpZiB0aGUgREJfUE9SVEFCSUxJVFlfREVMRVRFX0NPVU5UIHBvcnRhYmlsaXR5IG9wdGlvbiBpcyBvbi4KICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICRxdWVyeSAgdGhlIHF1ZXJ5IHN0cmluZyB0byBtb2RpZnkKICAgICAqCiAgICAgKiBAcmV0dXJuIHN0cmluZyAgdGhlIG1vZGlmaWVkIHF1ZXJ5IHN0cmluZwogICAgICoKICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkCiAgICAgKiBAc2VlIERCX2NvbW1vbjo6c2V0T3B0aW9uKCkKICAgICAqLwogICAgZnVuY3Rpb24gbW9kaWZ5UXVlcnkoJHF1ZXJ5KQogICAgewogICAgICAgIGlmICgkdGhpcy0+b3B0aW9uc1sncG9ydGFiaWxpdHknXSAmIERCX1BPUlRBQklMSVRZX0RFTEVURV9DT1VOVCkgewogICAgICAgICAgICAvLyAiREVMRVRFIEZST00gdGFibGUiIGdpdmVzIDAgYWZmZWN0ZWQgcm93cyBpbiBNeVNRTC4KICAgICAgICAgICAgLy8gVGhpcyBsaXR0bGUgaGFjayBsZXRzIHlvdSBrbm93IGhvdyBtYW55IHJvd3Mgd2VyZSBkZWxldGVkLgogICAgICAgICAgICBpZiAocHJlZ19tYXRjaCgnL15ccypERUxFVEVccytGUk9NXHMrKFxTKylccyokL2knLCAkcXVlcnkpKSB7CiAgICAgICAgICAgICAgICAkcXVlcnkgPSBwcmVnX3JlcGxhY2UoJy9eXHMqREVMRVRFXHMrRlJPTVxzKyhcUyspXHMqJC8nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdERUxFVEUgRlJPTSBcMSBXSEVSRSAxPTEnLCAkcXVlcnkpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiAkcXVlcnk7CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgbW9kaWZ5TGltaXRRdWVyeSgpCgogICAgLyoqCiAgICAgKiBBZGRzIExJTUlUIGNsYXVzZXMgdG8gYSBxdWVyeSBzdHJpbmcgYWNjb3JkaW5nIHRvIGN1cnJlbnQgREJNUyBzdGFuZGFyZHMKICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICRxdWVyeSAgIHRoZSBxdWVyeSB0byBtb2RpZnkKICAgICAqIEBwYXJhbSBpbnQgICAgJGZyb20gICAgdGhlIHJvdyB0byBzdGFydCB0byBmZXRjaGluZyAoMCA9IHRoZSBmaXJzdCByb3cpCiAgICAgKiBAcGFyYW0gaW50ICAgICRjb3VudCAgIHRoZSBudW1iZXJzIG9mIHJvd3MgdG8gZmV0Y2gKICAgICAqIEBwYXJhbSBtaXhlZCAgJHBhcmFtcyAgYXJyYXksIHN0cmluZyBvciBudW1lcmljIGRhdGEgdG8gYmUgdXNlZCBpbgogICAgICogICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0aW9uIG9mIHRoZSBzdGF0ZW1lbnQuICBRdWFudGl0eSBvZiBpdGVtcwogICAgICogICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkIG11c3QgbWF0Y2ggcXVhbnRpdHkgb2YgcGxhY2Vob2xkZXJzIGluCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeTogIG1lYW5pbmcgMSBwbGFjZWhvbGRlciBmb3Igbm9uLWFycmF5CiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzIG9yIDEgcGxhY2Vob2xkZXIgcGVyIGFycmF5IGVsZW1lbnQuCiAgICAgKgogICAgICogQHJldHVybiBzdHJpbmcgIHRoZSBxdWVyeSBzdHJpbmcgd2l0aCBMSU1JVCBjbGF1c2VzIGFkZGVkCiAgICAgKgogICAgICogQGFjY2VzcyBwcm90ZWN0ZWQKICAgICAqLwogICAgZnVuY3Rpb24gbW9kaWZ5TGltaXRRdWVyeSgkcXVlcnksICRmcm9tLCAkY291bnQsICRwYXJhbXMgPSBhcnJheSgpKQogICAgewogICAgICAgIGlmIChEQjo6aXNNYW5pcCgkcXVlcnkpIHx8ICR0aGlzLT5fbmV4dF9xdWVyeV9tYW5pcCkgewogICAgICAgICAgICByZXR1cm4gJHF1ZXJ5IC4gIiBMSU1JVCAkY291bnQiOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiAkcXVlcnkgLiAiIExJTUlUICRmcm9tLCAkY291bnQiOwogICAgICAgIH0KICAgIH0KCiAgICAvLyB9fX0KICAgIC8vIHt7eyBteXNxbFJhaXNlRXJyb3IoKQoKICAgIC8qKgogICAgICogUHJvZHVjZXMgYSBEQl9FcnJvciBvYmplY3QgcmVnYXJkaW5nIHRoZSBjdXJyZW50IHByb2JsZW0KICAgICAqCiAgICAgKiBAcGFyYW0gaW50ICRlcnJubyAgaWYgdGhlIGVycm9yIGlzIGJlaW5nIG1hbnVhbGx5IHJhaXNlZCBwYXNzIGEKICAgICAqICAgICAgICAgICAgICAgICAgICAgREJfRVJST1IqIGNvbnN0YW50IGhlcmUuICBJZiB0aGlzIGlzbid0IHBhc3NlZAogICAgICogICAgICAgICAgICAgICAgICAgICB0aGUgZXJyb3IgaW5mb3JtYXRpb24gZ2F0aGVyZWQgZnJvbSB0aGUgREJNUy4KICAgICAqCiAgICAgKiBAcmV0dXJuIG9iamVjdCAgdGhlIERCX0Vycm9yIG9iamVjdAogICAgICoKICAgICAqIEBzZWUgREJfY29tbW9uOjpyYWlzZUVycm9yKCksCiAgICAgKiAgICAgIERCX215c3FsOjplcnJvck5hdGl2ZSgpLCBEQl9jb21tb246OmVycm9yQ29kZSgpCiAgICAgKi8KICAgIGZ1bmN0aW9uIG15c3FsUmFpc2VFcnJvcigkZXJybm8gPSBudWxsKQogICAgewogICAgICAgIGlmICgkZXJybm8gPT09IG51bGwpIHsKICAgICAgICAgICAgaWYgKCR0aGlzLT5vcHRpb25zWydwb3J0YWJpbGl0eSddICYgREJfUE9SVEFCSUxJVFlfRVJST1JTKSB7CiAgICAgICAgICAgICAgICAkdGhpcy0+ZXJyb3Jjb2RlX21hcFsxMDIyXSA9IERCX0VSUk9SX0NPTlNUUkFJTlQ7CiAgICAgICAgICAgICAgICAkdGhpcy0+ZXJyb3Jjb2RlX21hcFsxMDQ4XSA9IERCX0VSUk9SX0NPTlNUUkFJTlRfTk9UX05VTEw7CiAgICAgICAgICAgICAgICAkdGhpcy0+ZXJyb3Jjb2RlX21hcFsxMDYyXSA9IERCX0VSUk9SX0NPTlNUUkFJTlQ7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAvLyBEb2luZyB0aGlzIGluIGNhc2UgbW9kZSBjaGFuZ2VzIGR1cmluZyBydW50aW1lLgogICAgICAgICAgICAgICAgJHRoaXMtPmVycm9yY29kZV9tYXBbMTAyMl0gPSBEQl9FUlJPUl9BTFJFQURZX0VYSVNUUzsKICAgICAgICAgICAgICAgICR0aGlzLT5lcnJvcmNvZGVfbWFwWzEwNDhdID0gREJfRVJST1JfQ09OU1RSQUlOVDsKICAgICAgICAgICAgICAgICR0aGlzLT5lcnJvcmNvZGVfbWFwWzEwNjJdID0gREJfRVJST1JfQUxSRUFEWV9FWElTVFM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJGVycm5vID0gJHRoaXMtPmVycm9yQ29kZShteXNxbF9lcnJubygkdGhpcy0+Y29ubmVjdGlvbikpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJHRoaXMtPnJhaXNlRXJyb3IoJGVycm5vLCBudWxsLCBudWxsLCBudWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAbXlzcWxfZXJybm8oJHRoaXMtPmNvbm5lY3Rpb24pIC4gJyAqKiAnIC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQG15c3FsX2Vycm9yKCR0aGlzLT5jb25uZWN0aW9uKSk7CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgZXJyb3JOYXRpdmUoKQoKICAgIC8qKgogICAgICogR2V0cyB0aGUgREJNUycgbmF0aXZlIGVycm9yIGNvZGUgcHJvZHVjZWQgYnkgdGhlIGxhc3QgcXVlcnkKICAgICAqCiAgICAgKiBAcmV0dXJuIGludCAgdGhlIERCTVMnIGVycm9yIGNvZGUKICAgICAqLwogICAgZnVuY3Rpb24gZXJyb3JOYXRpdmUoKQogICAgewogICAgICAgIHJldHVybiBAbXlzcWxfZXJybm8oJHRoaXMtPmNvbm5lY3Rpb24pOwogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IHRhYmxlSW5mbygpCgogICAgLyoqCiAgICAgKiBSZXR1cm5zIGluZm9ybWF0aW9uIGFib3V0IGEgdGFibGUgb3IgYSByZXN1bHQgc2V0CiAgICAgKgogICAgICogQHBhcmFtIG9iamVjdHxzdHJpbmcgICRyZXN1bHQgIERCX3Jlc3VsdCBvYmplY3QgZnJvbSBhIHF1ZXJ5IG9yIGEKICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIG5hbWUgb2YgYSB0YWJsZS4KICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2hpbGUgdGhpcyBhbHNvIGFjY2VwdHMgYSBxdWVyeSByZXN1bHQKICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2UgaWRlbnRpZmllciwgdGhpcyBiZWhhdmlvciBpcwogICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXByZWNhdGVkLgogICAgICogQHBhcmFtIGludCAgICAgICAgICAgICRtb2RlICAgIGEgdmFsaWQgdGFibGVJbmZvIG1vZGUKICAgICAqCiAgICAgKiBAcmV0dXJuIGFycmF5ICBhbiBhc3NvY2lhdGl2ZSBhcnJheSB3aXRoIHRoZSBpbmZvcm1hdGlvbiByZXF1ZXN0ZWQuCiAgICAgKiAgICAgICAgICAgICAgICAgQSBEQl9FcnJvciBvYmplY3Qgb24gZmFpbHVyZS4KICAgICAqCiAgICAgKiBAc2VlIERCX2NvbW1vbjo6dGFibGVJbmZvKCkKICAgICAqLwogICAgZnVuY3Rpb24gdGFibGVJbmZvKCRyZXN1bHQsICRtb2RlID0gbnVsbCkKICAgIHsKICAgICAgICBpZiAoaXNfc3RyaW5nKCRyZXN1bHQpKSB7CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIFByb2JhYmx5IHJlY2VpdmVkIGEgdGFibGUgbmFtZS4KICAgICAgICAgICAgICogQ3JlYXRlIGEgcmVzdWx0IHJlc291cmNlIGlkZW50aWZpZXIuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICAkaWQgPSBAbXlzcWxfcXVlcnkoIlNFTEVDVCAqIEZST00gJHJlc3VsdCBMSU1JVCAwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5jb25uZWN0aW9uKTsKICAgICAgICAgICAgJGdvdF9zdHJpbmcgPSB0cnVlOwogICAgICAgIH0gZWxzZWlmIChpc3NldCgkcmVzdWx0LT5yZXN1bHQpKSB7CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIFByb2JhYmx5IHJlY2VpdmVkIGEgcmVzdWx0IG9iamVjdC4KICAgICAgICAgICAgICogRXh0cmFjdCB0aGUgcmVzdWx0IHJlc291cmNlIGlkZW50aWZpZXIuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICAkaWQgPSAkcmVzdWx0LT5yZXN1bHQ7CiAgICAgICAgICAgICRnb3Rfc3RyaW5nID0gZmFsc2U7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogUHJvYmFibHkgcmVjZWl2ZWQgYSByZXN1bHQgcmVzb3VyY2UgaWRlbnRpZmllci4KICAgICAgICAgICAgICogQ29weSBpdC4KICAgICAgICAgICAgICogRGVwcmVjYXRlZC4gIEhlcmUgZm9yIGNvbXBhdGliaWxpdHkgb25seS4KICAgICAgICAgICAgICovCiAgICAgICAgICAgICRpZCA9ICRyZXN1bHQ7CiAgICAgICAgICAgICRnb3Rfc3RyaW5nID0gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICBpZiAoIWlzX3Jlc291cmNlKCRpZCkpIHsKICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5teXNxbFJhaXNlRXJyb3IoREJfRVJST1JfTkVFRF9NT1JFX0RBVEEpOwogICAgICAgIH0KCiAgICAgICAgaWYgKCR0aGlzLT5vcHRpb25zWydwb3J0YWJpbGl0eSddICYgREJfUE9SVEFCSUxJVFlfTE9XRVJDQVNFKSB7CiAgICAgICAgICAgICRjYXNlX2Z1bmMgPSAnc3RydG9sb3dlcic7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJGNhc2VfZnVuYyA9ICdzdHJ2YWwnOwogICAgICAgIH0KCiAgICAgICAgJGNvdW50ID0gQG15c3FsX251bV9maWVsZHMoJGlkKTsKICAgICAgICAkcmVzICAgPSBhcnJheSgpOwoKICAgICAgICBpZiAoJG1vZGUpIHsKICAgICAgICAgICAgJHJlc1snbnVtX2ZpZWxkcyddID0gJGNvdW50OwogICAgICAgIH0KCiAgICAgICAgZm9yICgkaSA9IDA7ICRpIDwgJGNvdW50OyAkaSsrKSB7CiAgICAgICAgICAgICRyZXNbJGldID0gYXJyYXkoCiAgICAgICAgICAgICAgICAndGFibGUnID0+ICRjYXNlX2Z1bmMoQG15c3FsX2ZpZWxkX3RhYmxlKCRpZCwgJGkpKSwKICAgICAgICAgICAgICAgICduYW1lJyAgPT4gJGNhc2VfZnVuYyhAbXlzcWxfZmllbGRfbmFtZSgkaWQsICRpKSksCiAgICAgICAgICAgICAgICAndHlwZScgID0+IEBteXNxbF9maWVsZF90eXBlKCRpZCwgJGkpLAogICAgICAgICAgICAgICAgJ2xlbicgICA9PiBAbXlzcWxfZmllbGRfbGVuKCRpZCwgJGkpLAogICAgICAgICAgICAgICAgJ2ZsYWdzJyA9PiBAbXlzcWxfZmllbGRfZmxhZ3MoJGlkLCAkaSksCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICgkbW9kZSAmIERCX1RBQkxFSU5GT19PUkRFUikgewogICAgICAgICAgICAgICAgJHJlc1snb3JkZXInXVskcmVzWyRpXVsnbmFtZSddXSA9ICRpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkbW9kZSAmIERCX1RBQkxFSU5GT19PUkRFUlRBQkxFKSB7CiAgICAgICAgICAgICAgICAkcmVzWydvcmRlcnRhYmxlJ11bJHJlc1skaV1bJ3RhYmxlJ11dWyRyZXNbJGldWyduYW1lJ11dID0gJGk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIGZyZWUgdGhlIHJlc3VsdCBvbmx5IGlmIHdlIHdlcmUgY2FsbGVkIG9uIGEgdGFibGUKICAgICAgICBpZiAoJGdvdF9zdHJpbmcpIHsKICAgICAgICAgICAgQG15c3FsX2ZyZWVfcmVzdWx0KCRpZCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiAkcmVzOwogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IGdldFNwZWNpYWxRdWVyeSgpCgogICAgLyoqCiAgICAgKiBPYnRhaW5zIHRoZSBxdWVyeSBzdHJpbmcgbmVlZGVkIGZvciBsaXN0aW5nIGEgZ2l2ZW4gdHlwZSBvZiBvYmplY3RzCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkdHlwZSAgdGhlIGtpbmQgb2Ygb2JqZWN0cyB5b3Ugd2FudCB0byByZXRyaWV2ZQogICAgICoKICAgICAqIEByZXR1cm4gc3RyaW5nICB0aGUgU1FMIHF1ZXJ5IHN0cmluZyBvciBudWxsIGlmIHRoZSBkcml2ZXIgZG9lc24ndAogICAgICogICAgICAgICAgICAgICAgICBzdXBwb3J0IHRoZSBvYmplY3QgdHlwZSByZXF1ZXN0ZWQKICAgICAqCiAgICAgKiBAYWNjZXNzIHByb3RlY3RlZAogICAgICogQHNlZSBEQl9jb21tb246OmdldExpc3RPZigpCiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldFNwZWNpYWxRdWVyeSgkdHlwZSkKICAgIHsKICAgICAgICBzd2l0Y2ggKCR0eXBlKSB7CiAgICAgICAgICAgIGNhc2UgJ3RhYmxlcyc6CiAgICAgICAgICAgICAgICByZXR1cm4gJ1NIT1cgVEFCTEVTJzsKICAgICAgICAgICAgY2FzZSAndXNlcnMnOgogICAgICAgICAgICAgICAgcmV0dXJuICdTRUxFQ1QgRElTVElOQ1QgVXNlciBGUk9NIG15c3FsLnVzZXInOwogICAgICAgICAgICBjYXNlICdkYXRhYmFzZXMnOgogICAgICAgICAgICAgICAgcmV0dXJuICdTSE9XIERBVEFCQVNFUyc7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICB9CgogICAgLy8gfX19Cgp9CgovKgogKiBMb2NhbCB2YXJpYWJsZXM6CiAqIHRhYi13aWR0aDogNAogKiBjLWJhc2ljLW9mZnNldDogNAogKiBFbmQ6CiAqLwoKPz4K]]></data>
	</file>
	<file>
	  <filename>/lib/pear/DB/mysqli.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qIHZpbTogc2V0IGV4cGFuZHRhYiB0YWJzdG9wPTQgc2hpZnR3aWR0aD00IHNvZnR0YWJzdG9wPTQ6ICovCgovKioKICogVGhlIFBFQVIgREIgZHJpdmVyIGZvciBQSFAncyBteXNxbGkgZXh0ZW5zaW9uCiAqIGZvciBpbnRlcmFjdGluZyB3aXRoIE15U1FMIGRhdGFiYXNlcwogKgogKiBQSFAgdmVyc2lvbnMgNCBhbmQgNQogKgogKiBMSUNFTlNFOiBUaGlzIHNvdXJjZSBmaWxlIGlzIHN1YmplY3QgdG8gdmVyc2lvbiAzLjAgb2YgdGhlIFBIUCBsaWNlbnNlCiAqIHRoYXQgaXMgYXZhaWxhYmxlIHRocm91Z2ggdGhlIHdvcmxkLXdpZGUtd2ViIGF0IHRoZSBmb2xsb3dpbmcgVVJJOgogKiBodHRwOi8vd3d3LnBocC5uZXQvbGljZW5zZS8zXzAudHh0LiAgSWYgeW91IGRpZCBub3QgcmVjZWl2ZSBhIGNvcHkgb2YKICogdGhlIFBIUCBMaWNlbnNlIGFuZCBhcmUgdW5hYmxlIHRvIG9idGFpbiBpdCB0aHJvdWdoIHRoZSB3ZWIsIHBsZWFzZQogKiBzZW5kIGEgbm90ZSB0byBsaWNlbnNlQHBocC5uZXQgc28gd2UgY2FuIG1haWwgeW91IGEgY29weSBpbW1lZGlhdGVseS4KICoKICogQGNhdGVnb3J5ICAgRGF0YWJhc2UKICogQHBhY2thZ2UgICAgREIKICogQGF1dGhvciAgICAgRGFuaWVsIENvbnZpc3NvciA8ZGFuaWVsY0BwaHAubmV0PgogKiBAY29weXJpZ2h0ICAxOTk3LTIwMDUgVGhlIFBIUCBHcm91cAogKiBAbGljZW5zZSAgICBodHRwOi8vd3d3LnBocC5uZXQvbGljZW5zZS8zXzAudHh0ICBQSFAgTGljZW5zZSAzLjAKICogQHZlcnNpb24gICAgQ1ZTOiAkSWQ6IG15c3FsaS5waHAsdiAxLjc5IDIwMDcvMDMvMjAgMTA6MjI6MDQgYWhhcnZleSBFeHAgJAogKiBAbGluayAgICAgICBodHRwOi8vcGVhci5waHAubmV0L3BhY2thZ2UvREIKICovCgovKioKICogT2J0YWluIHRoZSBEQl9jb21tb24gY2xhc3Mgc28gaXQgY2FuIGJlIGV4dGVuZGVkIGZyb20KICovCnJlcXVpcmVfb25jZSAnREIvY29tbW9uLnBocCc7CgovKioKICogVGhlIG1ldGhvZHMgUEVBUiBEQiB1c2VzIHRvIGludGVyYWN0IHdpdGggUEhQJ3MgbXlzcWxpIGV4dGVuc2lvbgogKiBmb3IgaW50ZXJhY3Rpbmcgd2l0aCBNeVNRTCBkYXRhYmFzZXMKICoKICogVGhpcyBpcyBmb3IgTXlTUUwgdmVyc2lvbnMgNC4xIGFuZCBhYm92ZS4gIFJlcXVpcmVzIFBIUCA1LgogKgogKiBOb3RlIHRoYXQgcGVyc2lzdGVudCBjb25uZWN0aW9ucyBubyBsb25nZXIgZXhpc3QuCiAqCiAqIFRoZXNlIG1ldGhvZHMgb3ZlcmxvYWQgdGhlIG9uZXMgZGVjbGFyZWQgaW4gREJfY29tbW9uLgogKgogKiBAY2F0ZWdvcnkgICBEYXRhYmFzZQogKiBAcGFja2FnZSAgICBEQgogKiBAYXV0aG9yICAgICBEYW5pZWwgQ29udmlzc29yIDxkYW5pZWxjQHBocC5uZXQ+CiAqIEBjb3B5cmlnaHQgIDE5OTctMjAwNSBUaGUgUEhQIEdyb3VwCiAqIEBsaWNlbnNlICAgIGh0dHA6Ly93d3cucGhwLm5ldC9saWNlbnNlLzNfMC50eHQgIFBIUCBMaWNlbnNlIDMuMAogKiBAdmVyc2lvbiAgICBSZWxlYXNlOiAxLjcuMTIKICogQGxpbmsgICAgICAgaHR0cDovL3BlYXIucGhwLm5ldC9wYWNrYWdlL0RCCiAqIEBzaW5jZSAgICAgIENsYXNzIGZ1bmN0aW9uYWwgc2luY2UgUmVsZWFzZSAxLjYuMwogKi8KY2xhc3MgREJfbXlzcWxpIGV4dGVuZHMgREJfY29tbW9uCnsKICAgIC8vIHt7eyBwcm9wZXJ0aWVzCgogICAgLyoqCiAgICAgKiBUaGUgREIgZHJpdmVyIHR5cGUgKG15c3FsLCBvY2k4LCBvZGJjLCBldGMuKQogICAgICogQHZhciBzdHJpbmcKICAgICAqLwogICAgdmFyICRwaHB0eXBlID0gJ215c3FsaSc7CgogICAgLyoqCiAgICAgKiBUaGUgZGF0YWJhc2Ugc3ludGF4IHZhcmlhbnQgdG8gYmUgdXNlZCAoZGIyLCBhY2Nlc3MsIGV0Yy4pLCBpZiBhbnkKICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHZhciAkZGJzeW50YXggPSAnbXlzcWxpJzsKCiAgICAvKioKICAgICAqIFRoZSBjYXBhYmlsaXRpZXMgb2YgdGhpcyBEQiBpbXBsZW1lbnRhdGlvbgogICAgICoKICAgICAqIFRoZSAnbmV3X2xpbmsnIGVsZW1lbnQgY29udGFpbnMgdGhlIFBIUCB2ZXJzaW9uIHRoYXQgZmlyc3QgcHJvdmlkZWQKICAgICAqIG5ld19saW5rIHN1cHBvcnQgZm9yIHRoaXMgREJNUy4gIENvbnRhaW5zIGZhbHNlIGlmIGl0J3MgdW5zdXBwb3J0ZWQuCiAgICAgKgogICAgICogTWVhbmluZyBvZiB0aGUgJ2xpbWl0JyBlbGVtZW50OgogICAgICogICArICdlbXVsYXRlJyA9IGVtdWxhdGUgd2l0aCBmZXRjaCByb3cgYnkgbnVtYmVyCiAgICAgKiAgICsgJ2FsdGVyJyAgID0gYWx0ZXIgdGhlIHF1ZXJ5CiAgICAgKiAgICsgZmFsc2UgICAgID0gc2tpcCByb3dzCiAgICAgKgogICAgICogQHZhciBhcnJheQogICAgICovCiAgICB2YXIgJGZlYXR1cmVzID0gYXJyYXkoCiAgICAgICAgJ2xpbWl0JyAgICAgICAgID0+ICdhbHRlcicsCiAgICAgICAgJ25ld19saW5rJyAgICAgID0+IGZhbHNlLAogICAgICAgICdudW1yb3dzJyAgICAgICA9PiB0cnVlLAogICAgICAgICdwY29ubmVjdCcgICAgICA9PiBmYWxzZSwKICAgICAgICAncHJlcGFyZScgICAgICAgPT4gZmFsc2UsCiAgICAgICAgJ3NzbCcgICAgICAgICAgID0+IHRydWUsCiAgICAgICAgJ3RyYW5zYWN0aW9ucycgID0+IHRydWUsCiAgICApOwoKICAgIC8qKgogICAgICogQSBtYXBwaW5nIG9mIG5hdGl2ZSBlcnJvciBjb2RlcyB0byBEQiBlcnJvciBjb2RlcwogICAgICogQHZhciBhcnJheQogICAgICovCiAgICB2YXIgJGVycm9yY29kZV9tYXAgPSBhcnJheSgKICAgICAgICAxMDA0ID0+IERCX0VSUk9SX0NBTk5PVF9DUkVBVEUsCiAgICAgICAgMTAwNSA9PiBEQl9FUlJPUl9DQU5OT1RfQ1JFQVRFLAogICAgICAgIDEwMDYgPT4gREJfRVJST1JfQ0FOTk9UX0NSRUFURSwKICAgICAgICAxMDA3ID0+IERCX0VSUk9SX0FMUkVBRFlfRVhJU1RTLAogICAgICAgIDEwMDggPT4gREJfRVJST1JfQ0FOTk9UX0RST1AsCiAgICAgICAgMTAyMiA9PiBEQl9FUlJPUl9BTFJFQURZX0VYSVNUUywKICAgICAgICAxMDQ0ID0+IERCX0VSUk9SX0FDQ0VTU19WSU9MQVRJT04sCiAgICAgICAgMTA0NiA9PiBEQl9FUlJPUl9OT0RCU0VMRUNURUQsCiAgICAgICAgMTA0OCA9PiBEQl9FUlJPUl9DT05TVFJBSU5ULAogICAgICAgIDEwNDkgPT4gREJfRVJST1JfTk9TVUNIREIsCiAgICAgICAgMTA1MCA9PiBEQl9FUlJPUl9BTFJFQURZX0VYSVNUUywKICAgICAgICAxMDUxID0+IERCX0VSUk9SX05PU1VDSFRBQkxFLAogICAgICAgIDEwNTQgPT4gREJfRVJST1JfTk9TVUNIRklFTEQsCiAgICAgICAgMTA2MSA9PiBEQl9FUlJPUl9BTFJFQURZX0VYSVNUUywKICAgICAgICAxMDYyID0+IERCX0VSUk9SX0FMUkVBRFlfRVhJU1RTLAogICAgICAgIDEwNjQgPT4gREJfRVJST1JfU1lOVEFYLAogICAgICAgIDEwOTEgPT4gREJfRVJST1JfTk9UX0ZPVU5ELAogICAgICAgIDExMDAgPT4gREJfRVJST1JfTk9UX0xPQ0tFRCwKICAgICAgICAxMTM2ID0+IERCX0VSUk9SX1ZBTFVFX0NPVU5UX09OX1JPVywKICAgICAgICAxMTQyID0+IERCX0VSUk9SX0FDQ0VTU19WSU9MQVRJT04sCiAgICAgICAgMTE0NiA9PiBEQl9FUlJPUl9OT1NVQ0hUQUJMRSwKICAgICAgICAxMjE2ID0+IERCX0VSUk9SX0NPTlNUUkFJTlQsCiAgICAgICAgMTIxNyA9PiBEQl9FUlJPUl9DT05TVFJBSU5ULAogICAgICAgIDEzNTYgPT4gREJfRVJST1JfRElWWkVSTywKICAgICAgICAxNDUxID0+IERCX0VSUk9SX0NPTlNUUkFJTlQsCiAgICAgICAgMTQ1MiA9PiBEQl9FUlJPUl9DT05TVFJBSU5ULAogICAgKTsKCiAgICAvKioKICAgICAqIFRoZSByYXcgZGF0YWJhc2UgY29ubmVjdGlvbiBjcmVhdGVkIGJ5IFBIUAogICAgICogQHZhciByZXNvdXJjZQogICAgICovCiAgICB2YXIgJGNvbm5lY3Rpb247CgogICAgLyoqCiAgICAgKiBUaGUgRFNOIGluZm9ybWF0aW9uIGZvciBjb25uZWN0aW5nIHRvIGEgZGF0YWJhc2UKICAgICAqIEB2YXIgYXJyYXkKICAgICAqLwogICAgdmFyICRkc24gPSBhcnJheSgpOwoKCiAgICAvKioKICAgICAqIFNob3VsZCBkYXRhIG1hbmlwdWxhdGlvbiBxdWVyaWVzIGJlIGNvbW1pdHRlZCBhdXRvbWF0aWNhbGx5PwogICAgICogQHZhciBib29sCiAgICAgKiBAYWNjZXNzIHByaXZhdGUKICAgICAqLwogICAgdmFyICRhdXRvY29tbWl0ID0gdHJ1ZTsKCiAgICAvKioKICAgICAqIFRoZSBxdWFudGl0eSBvZiB0cmFuc2FjdGlvbnMgYmVndW4KICAgICAqCiAgICAgKiB7QGludGVybmFsICBXaGlsZSB0aGlzIGlzIHByaXZhdGUsIGl0IGNhbid0IGFjdHVhbGx5IGJlIGRlc2lnbmF0ZWQKICAgICAqIHByaXZhdGUgaW4gUEhQIDUgYmVjYXVzZSBpdCBpcyBkaXJlY3RseSBhY2Nlc3NlZCBpbiB0aGUgdGVzdCBzdWl0ZS59fQogICAgICoKICAgICAqIEB2YXIgaW50ZWdlcgogICAgICogQGFjY2VzcyBwcml2YXRlCiAgICAgKi8KICAgIHZhciAkdHJhbnNhY3Rpb25fb3Bjb3VudCA9IDA7CgogICAgLyoqCiAgICAgKiBUaGUgZGF0YWJhc2Ugc3BlY2lmaWVkIGluIHRoZSBEU04KICAgICAqCiAgICAgKiBJdCdzIGEgZml4IHRvIGFsbG93IGNhbGxzIHRvIGRpZmZlcmVudCBkYXRhYmFzZXMgaW4gdGhlIHNhbWUgc2NyaXB0LgogICAgICoKICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKiBAYWNjZXNzIHByaXZhdGUKICAgICAqLwogICAgdmFyICRfZGIgPSAnJzsKCiAgICAvKioKICAgICAqIEFycmF5IGZvciBjb252ZXJ0aW5nIE1ZU1FMSV8qX0ZMQUcgY29uc3RhbnRzIHRvIHRleHQgdmFsdWVzCiAgICAgKiBAdmFyICAgIGFycmF5CiAgICAgKiBAYWNjZXNzIHB1YmxpYwogICAgICogQHNpbmNlICBQcm9wZXJ0eSBhdmFpbGFibGUgc2luY2UgUmVsZWFzZSAxLjYuNQogICAgICovCiAgICB2YXIgJG15c3FsaV9mbGFncyA9IGFycmF5KAogICAgICAgIE1ZU1FMSV9OT1RfTlVMTF9GTEFHICAgICAgICA9PiAnbm90X251bGwnLAogICAgICAgIE1ZU1FMSV9QUklfS0VZX0ZMQUcgICAgICAgICA9PiAncHJpbWFyeV9rZXknLAogICAgICAgIE1ZU1FMSV9VTklRVUVfS0VZX0ZMQUcgICAgICA9PiAndW5pcXVlX2tleScsCiAgICAgICAgTVlTUUxJX01VTFRJUExFX0tFWV9GTEFHICAgID0+ICdtdWx0aXBsZV9rZXknLAogICAgICAgIE1ZU1FMSV9CTE9CX0ZMQUcgICAgICAgICAgICA9PiAnYmxvYicsCiAgICAgICAgTVlTUUxJX1VOU0lHTkVEX0ZMQUcgICAgICAgID0+ICd1bnNpZ25lZCcsCiAgICAgICAgTVlTUUxJX1pFUk9GSUxMX0ZMQUcgICAgICAgID0+ICd6ZXJvZmlsbCcsCiAgICAgICAgTVlTUUxJX0FVVE9fSU5DUkVNRU5UX0ZMQUcgID0+ICdhdXRvX2luY3JlbWVudCcsCiAgICAgICAgTVlTUUxJX1RJTUVTVEFNUF9GTEFHICAgICAgID0+ICd0aW1lc3RhbXAnLAogICAgICAgIE1ZU1FMSV9TRVRfRkxBRyAgICAgICAgICAgICA9PiAnc2V0JywKICAgICAgICAvLyBNWVNRTElfTlVNX0ZMQUcgICAgICAgICAgICAgPT4gJ251bWVyaWMnLCAgLy8gdW5uZWNlc3NhcnkKICAgICAgICAvLyBNWVNRTElfUEFSVF9LRVlfRkxBRyAgICAgICAgPT4gJ211bHRpcGxlX2tleScsICAvLyBkdXBsaWNhdHZpZQogICAgICAgIE1ZU1FMSV9HUk9VUF9GTEFHICAgICAgICAgICA9PiAnZ3JvdXBfYnknCiAgICApOwoKICAgIC8qKgogICAgICogQXJyYXkgZm9yIGNvbnZlcnRpbmcgTVlTUUxJX1RZUEVfKiBjb25zdGFudHMgdG8gdGV4dCB2YWx1ZXMKICAgICAqIEB2YXIgICAgYXJyYXkKICAgICAqIEBhY2Nlc3MgcHVibGljCiAgICAgKiBAc2luY2UgIFByb3BlcnR5IGF2YWlsYWJsZSBzaW5jZSBSZWxlYXNlIDEuNi41CiAgICAgKi8KICAgIHZhciAkbXlzcWxpX3R5cGVzID0gYXJyYXkoCiAgICAgICAgTVlTUUxJX1RZUEVfREVDSU1BTCAgICAgPT4gJ2RlY2ltYWwnLAogICAgICAgIE1ZU1FMSV9UWVBFX1RJTlkgICAgICAgID0+ICd0aW55aW50JywKICAgICAgICBNWVNRTElfVFlQRV9TSE9SVCAgICAgICA9PiAnaW50JywKICAgICAgICBNWVNRTElfVFlQRV9MT05HICAgICAgICA9PiAnaW50JywKICAgICAgICBNWVNRTElfVFlQRV9GTE9BVCAgICAgICA9PiAnZmxvYXQnLAogICAgICAgIE1ZU1FMSV9UWVBFX0RPVUJMRSAgICAgID0+ICdkb3VibGUnLAogICAgICAgIC8vIE1ZU1FMSV9UWVBFX05VTEwgICAgICAgID0+ICdERUZBVUxUIE5VTEwnLCAgLy8gbGV0IGZsYWdzIGhhbmRsZSBpdAogICAgICAgIE1ZU1FMSV9UWVBFX1RJTUVTVEFNUCAgID0+ICd0aW1lc3RhbXAnLAogICAgICAgIE1ZU1FMSV9UWVBFX0xPTkdMT05HICAgID0+ICdiaWdpbnQnLAogICAgICAgIE1ZU1FMSV9UWVBFX0lOVDI0ICAgICAgID0+ICdtZWRpdW1pbnQnLAogICAgICAgIE1ZU1FMSV9UWVBFX0RBVEUgICAgICAgID0+ICdkYXRlJywKICAgICAgICBNWVNRTElfVFlQRV9USU1FICAgICAgICA9PiAndGltZScsCiAgICAgICAgTVlTUUxJX1RZUEVfREFURVRJTUUgICAgPT4gJ2RhdGV0aW1lJywKICAgICAgICBNWVNRTElfVFlQRV9ZRUFSICAgICAgICA9PiAneWVhcicsCiAgICAgICAgTVlTUUxJX1RZUEVfTkVXREFURSAgICAgPT4gJ2RhdGUnLAogICAgICAgIE1ZU1FMSV9UWVBFX0VOVU0gICAgICAgID0+ICdlbnVtJywKICAgICAgICBNWVNRTElfVFlQRV9TRVQgICAgICAgICA9PiAnc2V0JywKICAgICAgICBNWVNRTElfVFlQRV9USU5ZX0JMT0IgICA9PiAndGlueWJsb2InLAogICAgICAgIE1ZU1FMSV9UWVBFX01FRElVTV9CTE9CID0+ICdtZWRpdW1ibG9iJywKICAgICAgICBNWVNRTElfVFlQRV9MT05HX0JMT0IgICA9PiAnbG9uZ2Jsb2InLAogICAgICAgIE1ZU1FMSV9UWVBFX0JMT0IgICAgICAgID0+ICdibG9iJywKICAgICAgICBNWVNRTElfVFlQRV9WQVJfU1RSSU5HICA9PiAndmFyY2hhcicsCiAgICAgICAgTVlTUUxJX1RZUEVfU1RSSU5HICAgICAgPT4gJ2NoYXInLAogICAgICAgIE1ZU1FMSV9UWVBFX0dFT01FVFJZICAgID0+ICdnZW9tZXRyeScsCiAgICAgICAgLyogVGhlc2UgY29uc3RhbnRzIGFyZSBjb25kaXRpb25hbGx5IGNvbXBpbGVkIGluIGV4dC9teXNxbGksIHNvIHdlJ2xsCiAgICAgICAgICogZGVmaW5lIHRoZW0gYnkgbnVtYmVyIHJhdGhlciB0aGFuIGNvbnN0YW50LiAqLwogICAgICAgIDE2ICAgICAgICAgICAgICAgICAgICAgID0+ICdiaXQnLAogICAgICAgIDI0NiAgICAgICAgICAgICAgICAgICAgID0+ICdkZWNpbWFsJywKICAgICk7CgoKICAgIC8vIH19fQogICAgLy8ge3t7IGNvbnN0cnVjdG9yCgogICAgLyoqCiAgICAgKiBUaGlzIGNvbnN0cnVjdG9yIGNhbGxzIDxrYmQ+JHRoaXMtPkRCX2NvbW1vbigpPC9rYmQ+CiAgICAgKgogICAgICogQHJldHVybiB2b2lkCiAgICAgKi8KICAgIGZ1bmN0aW9uIERCX215c3FsaSgpCiAgICB7CiAgICAgICAgJHRoaXMtPkRCX2NvbW1vbigpOwogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IGNvbm5lY3QoKQoKICAgIC8qKgogICAgICogQ29ubmVjdCB0byB0aGUgZGF0YWJhc2Ugc2VydmVyLCBsb2cgaW4gYW5kIG9wZW4gdGhlIGRhdGFiYXNlCiAgICAgKgogICAgICogRG9uJ3QgY2FsbCB0aGlzIG1ldGhvZCBkaXJlY3RseS4gIFVzZSBEQjo6Y29ubmVjdCgpIGluc3RlYWQuCiAgICAgKgogICAgICogUEVBUiBEQidzIG15c3FsaSBkcml2ZXIgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBleHRyYSBEU04gb3B0aW9uczoKICAgICAqICAgKyBXaGVuIHRoZSAnc3NsJyAkb3B0aW9uIHBhc3NlZCB0byBEQjo6Y29ubmVjdCgpIGlzIHRydWU6CiAgICAgKiAgICAgKyBrZXkgICAgICBUaGUgcGF0aCB0byB0aGUga2V5IGZpbGUuCiAgICAgKiAgICAgKyBjZXJ0ICAgICBUaGUgcGF0aCB0byB0aGUgY2VydGlmaWNhdGUgZmlsZS4KICAgICAqICAgICArIGNhICAgICAgIFRoZSBwYXRoIHRvIHRoZSBjZXJ0aWZpY2F0ZSBhdXRob3JpdHkgZmlsZS4KICAgICAqICAgICArIGNhcGF0aCAgIFRoZSBwYXRoIHRvIGEgZGlyZWN0b3J5IHRoYXQgY29udGFpbnMgdHJ1c3RlZCBTU0wKICAgICAqICAgICAgICAgICAgICAgICBDQSBjZXJ0aWZpY2F0ZXMgaW4gcGVtIGZvcm1hdC4KICAgICAqICAgICArIGNpcGhlciAgIFRoZSBsaXN0IG9mIGFsbG93YWJsZSBjaXBoZXJzIGZvciBTU0wgZW5jcnlwdGlvbi4KICAgICAqCiAgICAgKiBFeGFtcGxlIG9mIGhvdyB0byBjb25uZWN0IHVzaW5nIFNTTDoKICAgICAqIDxjb2RlPgogICAgICogcmVxdWlyZV9vbmNlICdEQi5waHAnOwogICAgICogCiAgICAgKiAkZHNuID0gYXJyYXkoCiAgICAgKiAgICAgJ3BocHR5cGUnICA9PiAnbXlzcWxpJywKICAgICAqICAgICAndXNlcm5hbWUnID0+ICdzb21ldXNlcicsCiAgICAgKiAgICAgJ3Bhc3N3b3JkJyA9PiAnYXBhc3N3ZCcsCiAgICAgKiAgICAgJ2hvc3RzcGVjJyA9PiAnbG9jYWxob3N0JywKICAgICAqICAgICAnZGF0YWJhc2UnID0+ICd0aGVkYicsCiAgICAgKiAgICAgJ2tleScgICAgICA9PiAnY2xpZW50LWtleS5wZW0nLAogICAgICogICAgICdjZXJ0JyAgICAgPT4gJ2NsaWVudC1jZXJ0LnBlbScsCiAgICAgKiAgICAgJ2NhJyAgICAgICA9PiAnY2FjZXJ0LnBlbScsCiAgICAgKiAgICAgJ2NhcGF0aCcgICA9PiAnL3BhdGgvdG8vY2EvZGlyJywKICAgICAqICAgICAnY2lwaGVyJyAgID0+ICdBRVMnLAogICAgICogKTsKICAgICAqIAogICAgICogJG9wdGlvbnMgPSBhcnJheSgKICAgICAqICAgICAnc3NsJyA9PiB0cnVlLAogICAgICogKTsKICAgICAqIAogICAgICogJGRiID0mIERCOjpjb25uZWN0KCRkc24sICRvcHRpb25zKTsKICAgICAqIGlmIChQRUFSOjppc0Vycm9yKCRkYikpIHsKICAgICAqICAgICBkaWUoJGRiLT5nZXRNZXNzYWdlKCkpOwogICAgICogfQogICAgICogPC9jb2RlPgogICAgICoKICAgICAqIEBwYXJhbSBhcnJheSAkZHNuICAgICAgICAgdGhlIGRhdGEgc291cmNlIG5hbWUKICAgICAqIEBwYXJhbSBib29sICAkcGVyc2lzdGVudCAgc2hvdWxkIHRoZSBjb25uZWN0aW9uIGJlIHBlcnNpc3RlbnQ/CiAgICAgKgogICAgICogQHJldHVybiBpbnQgIERCX09LIG9uIHN1Y2Nlc3MuIEEgREJfRXJyb3Igb2JqZWN0IG9uIGZhaWx1cmUuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGNvbm5lY3QoJGRzbiwgJHBlcnNpc3RlbnQgPSBmYWxzZSkKICAgIHsKICAgICAgICBpZiAoIVBFQVI6OmxvYWRFeHRlbnNpb24oJ215c3FsaScpKSB7CiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+cmFpc2VFcnJvcihEQl9FUlJPUl9FWFRFTlNJT05fTk9UX0ZPVU5EKTsKICAgICAgICB9CgogICAgICAgICR0aGlzLT5kc24gPSAkZHNuOwogICAgICAgIGlmICgkZHNuWydkYnN5bnRheCddKSB7CiAgICAgICAgICAgICR0aGlzLT5kYnN5bnRheCA9ICRkc25bJ2Ric3ludGF4J107CiAgICAgICAgfQoKICAgICAgICAkaW5pID0gaW5pX2dldCgndHJhY2tfZXJyb3JzJyk7CiAgICAgICAgQGluaV9zZXQoJ3RyYWNrX2Vycm9ycycsIDEpOwogICAgICAgICRwaHBfZXJyb3Jtc2cgPSAnJzsKCiAgICAgICAgaWYgKCgoaW50KSAkdGhpcy0+Z2V0T3B0aW9uKCdzc2wnKSkgPT09IDEpIHsKICAgICAgICAgICAgJGluaXQgPSBteXNxbGlfaW5pdCgpOwogICAgICAgICAgICBteXNxbGlfc3NsX3NldCgKICAgICAgICAgICAgICAgICRpbml0LAogICAgICAgICAgICAgICAgZW1wdHkoJGRzblsna2V5J10pICAgID8gbnVsbCA6ICRkc25bJ2tleSddLAogICAgICAgICAgICAgICAgZW1wdHkoJGRzblsnY2VydCddKSAgID8gbnVsbCA6ICRkc25bJ2NlcnQnXSwKICAgICAgICAgICAgICAgIGVtcHR5KCRkc25bJ2NhJ10pICAgICA/IG51bGwgOiAkZHNuWydjYSddLAogICAgICAgICAgICAgICAgZW1wdHkoJGRzblsnY2FwYXRoJ10pID8gbnVsbCA6ICRkc25bJ2NhcGF0aCddLAogICAgICAgICAgICAgICAgZW1wdHkoJGRzblsnY2lwaGVyJ10pID8gbnVsbCA6ICRkc25bJ2NpcGhlciddCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICgkdGhpcy0+Y29ubmVjdGlvbiA9IEBteXNxbGlfcmVhbF9jb25uZWN0KAogICAgICAgICAgICAgICAgICAgICRpbml0LAogICAgICAgICAgICAgICAgICAgICRkc25bJ2hvc3RzcGVjJ10sCiAgICAgICAgICAgICAgICAgICAgJGRzblsndXNlcm5hbWUnXSwKICAgICAgICAgICAgICAgICAgICAkZHNuWydwYXNzd29yZCddLAogICAgICAgICAgICAgICAgICAgICRkc25bJ2RhdGFiYXNlJ10sCiAgICAgICAgICAgICAgICAgICAgJGRzblsncG9ydCddLAogICAgICAgICAgICAgICAgICAgICRkc25bJ3NvY2tldCddKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJHRoaXMtPmNvbm5lY3Rpb24gPSAkaW5pdDsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICR0aGlzLT5jb25uZWN0aW9uID0gQG15c3FsaV9jb25uZWN0KAogICAgICAgICAgICAgICAgJGRzblsnaG9zdHNwZWMnXSwKICAgICAgICAgICAgICAgICRkc25bJ3VzZXJuYW1lJ10sCiAgICAgICAgICAgICAgICAkZHNuWydwYXNzd29yZCddLAogICAgICAgICAgICAgICAgJGRzblsnZGF0YWJhc2UnXSwKICAgICAgICAgICAgICAgICRkc25bJ3BvcnQnXSwKICAgICAgICAgICAgICAgICRkc25bJ3NvY2tldCddCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBAaW5pX3NldCgndHJhY2tfZXJyb3JzJywgJGluaSk7CgogICAgICAgIGlmICghJHRoaXMtPmNvbm5lY3Rpb24pIHsKICAgICAgICAgICAgaWYgKCgkZXJyID0gQG15c3FsaV9jb25uZWN0X2Vycm9yKCkpICE9ICcnKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPnJhaXNlRXJyb3IoREJfRVJST1JfQ09OTkVDVF9GQUlMRUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwgbnVsbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZXJyKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+cmFpc2VFcnJvcihEQl9FUlJPUl9DT05ORUNUX0ZBSUxFRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBudWxsLCBudWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRwaHBfZXJyb3Jtc2cpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoJGRzblsnZGF0YWJhc2UnXSkgewogICAgICAgICAgICAkdGhpcy0+X2RiID0gJGRzblsnZGF0YWJhc2UnXTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBEQl9PSzsKICAgIH0KCiAgICAvLyB9fX0KICAgIC8vIHt7eyBkaXNjb25uZWN0KCkKCiAgICAvKioKICAgICAqIERpc2Nvbm5lY3RzIGZyb20gdGhlIGRhdGFiYXNlIHNlcnZlcgogICAgICoKICAgICAqIEByZXR1cm4gYm9vbCAgVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlCiAgICAgKi8KICAgIGZ1bmN0aW9uIGRpc2Nvbm5lY3QoKQogICAgewogICAgICAgICRyZXQgPSBAbXlzcWxpX2Nsb3NlKCR0aGlzLT5jb25uZWN0aW9uKTsKICAgICAgICAkdGhpcy0+Y29ubmVjdGlvbiA9IG51bGw7CiAgICAgICAgcmV0dXJuICRyZXQ7CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgc2ltcGxlUXVlcnkoKQoKICAgIC8qKgogICAgICogU2VuZHMgYSBxdWVyeSB0byB0aGUgZGF0YWJhc2Ugc2VydmVyCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAgdGhlIFNRTCBxdWVyeSBzdHJpbmcKICAgICAqCiAgICAgKiBAcmV0dXJuIG1peGVkICArIGEgUEhQIHJlc3VsdCByZXNyb3VjZSBmb3Igc3VjY2Vzc2Z1bCBTRUxFQ1QgcXVlcmllcwogICAgICogICAgICAgICAgICAgICAgKyB0aGUgREJfT0sgY29uc3RhbnQgZm9yIG90aGVyIHN1Y2Nlc3NmdWwgcXVlcmllcwogICAgICogICAgICAgICAgICAgICAgKyBhIERCX0Vycm9yIG9iamVjdCBvbiBmYWlsdXJlCiAgICAgKi8KICAgIGZ1bmN0aW9uIHNpbXBsZVF1ZXJ5KCRxdWVyeSkKICAgIHsKICAgICAgICAkaXNtYW5pcCA9ICR0aGlzLT5fY2hlY2tNYW5pcCgkcXVlcnkpOwogICAgICAgICR0aGlzLT5sYXN0X3F1ZXJ5ID0gJHF1ZXJ5OwogICAgICAgICRxdWVyeSA9ICR0aGlzLT5tb2RpZnlRdWVyeSgkcXVlcnkpOwogICAgICAgIGlmICgkdGhpcy0+X2RiKSB7CiAgICAgICAgICAgIGlmICghQG15c3FsaV9zZWxlY3RfZGIoJHRoaXMtPmNvbm5lY3Rpb24sICR0aGlzLT5fZGIpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPm15c3FsaVJhaXNlRXJyb3IoREJfRVJST1JfTk9EQlNFTEVDVEVEKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoISR0aGlzLT5hdXRvY29tbWl0ICYmICRpc21hbmlwKSB7CiAgICAgICAgICAgIGlmICgkdGhpcy0+dHJhbnNhY3Rpb25fb3Bjb3VudCA9PSAwKSB7CiAgICAgICAgICAgICAgICAkcmVzdWx0ID0gQG15c3FsaV9xdWVyeSgkdGhpcy0+Y29ubmVjdGlvbiwgJ1NFVCBBVVRPQ09NTUlUPTAnKTsKICAgICAgICAgICAgICAgICRyZXN1bHQgPSBAbXlzcWxpX3F1ZXJ5KCR0aGlzLT5jb25uZWN0aW9uLCAnQkVHSU4nKTsKICAgICAgICAgICAgICAgIGlmICghJHJlc3VsdCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+bXlzcWxpUmFpc2VFcnJvcigpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgICR0aGlzLT50cmFuc2FjdGlvbl9vcGNvdW50Kys7CiAgICAgICAgfQogICAgICAgICRyZXN1bHQgPSBAbXlzcWxpX3F1ZXJ5KCR0aGlzLT5jb25uZWN0aW9uLCAkcXVlcnkpOwogICAgICAgIGlmICghJHJlc3VsdCkgewogICAgICAgICAgICByZXR1cm4gJHRoaXMtPm15c3FsaVJhaXNlRXJyb3IoKTsKICAgICAgICB9CiAgICAgICAgaWYgKGlzX29iamVjdCgkcmVzdWx0KSkgewogICAgICAgICAgICByZXR1cm4gJHJlc3VsdDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIERCX09LOwogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IG5leHRSZXN1bHQoKQoKICAgIC8qKgogICAgICogTW92ZSB0aGUgaW50ZXJuYWwgbXlzcWwgcmVzdWx0IHBvaW50ZXIgdG8gdGhlIG5leHQgYXZhaWxhYmxlIHJlc3VsdC4KICAgICAqCiAgICAgKiBUaGlzIG1ldGhvZCBoYXMgbm90IGJlZW4gaW1wbGVtZW50ZWQgeWV0LgogICAgICoKICAgICAqIEBwYXJhbSByZXNvdXJjZSAkcmVzdWx0IGEgdmFsaWQgc3FsIHJlc3VsdCByZXNvdXJjZQogICAgICogQHJldHVybiBmYWxzZQogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqLwogICAgZnVuY3Rpb24gbmV4dFJlc3VsdCgkcmVzdWx0KQogICAgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICAvLyB9fX0KICAgIC8vIHt7eyBmZXRjaEludG8oKQoKICAgIC8qKgogICAgICogUGxhY2VzIGEgcm93IGZyb20gdGhlIHJlc3VsdCBzZXQgaW50byB0aGUgZ2l2ZW4gYXJyYXkKICAgICAqCiAgICAgKiBGb3JtYXRpbmcgb2YgdGhlIGFycmF5IGFuZCB0aGUgZGF0YSB0aGVyZWluIGFyZSBjb25maWd1cmFibGUuCiAgICAgKiBTZWUgREJfcmVzdWx0OjpmZXRjaEludG8oKSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KICAgICAqCiAgICAgKiBUaGlzIG1ldGhvZCBpcyBub3QgbWVhbnQgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LiAgVXNlCiAgICAgKiBEQl9yZXN1bHQ6OmZldGNoSW50bygpIGluc3RlYWQuICBJdCBjYW4ndCBiZSBkZWNsYXJlZCAicHJvdGVjdGVkIgogICAgICogYmVjYXVzZSBEQl9yZXN1bHQgaXMgYSBzZXBhcmF0ZSBvYmplY3QuCiAgICAgKgogICAgICogQHBhcmFtIHJlc291cmNlICRyZXN1bHQgICAgdGhlIHF1ZXJ5IHJlc3VsdCByZXNvdXJjZQogICAgICogQHBhcmFtIGFycmF5ICAgICRhcnIgICAgICAgdGhlIHJlZmVyZW5jZWQgYXJyYXkgdG8gcHV0IHRoZSBkYXRhIGluCiAgICAgKiBAcGFyYW0gaW50ICAgICAgJGZldGNobW9kZSBob3cgdGhlIHJlc3VsdGluZyBhcnJheSBzaG91bGQgYmUgaW5kZXhlZAogICAgICogQHBhcmFtIGludCAgICAgICRyb3dudW0gICAgdGhlIHJvdyBudW1iZXIgdG8gZmV0Y2ggKDAgPSBmaXJzdCByb3cpCiAgICAgKgogICAgICogQHJldHVybiBtaXhlZCAgREJfT0sgb24gc3VjY2VzcywgTlVMTCB3aGVuIHRoZSBlbmQgb2YgYSByZXN1bHQgc2V0IGlzCiAgICAgKiAgICAgICAgICAgICAgICAgcmVhY2hlZCBvciBvbiBmYWlsdXJlCiAgICAgKgogICAgICogQHNlZSBEQl9yZXN1bHQ6OmZldGNoSW50bygpCiAgICAgKi8KICAgIGZ1bmN0aW9uIGZldGNoSW50bygkcmVzdWx0LCAmJGFyciwgJGZldGNobW9kZSwgJHJvd251bSA9IG51bGwpCiAgICB7CiAgICAgICAgaWYgKCRyb3dudW0gIT09IG51bGwpIHsKICAgICAgICAgICAgaWYgKCFAbXlzcWxpX2RhdGFfc2VlaygkcmVzdWx0LCAkcm93bnVtKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCRmZXRjaG1vZGUgJiBEQl9GRVRDSE1PREVfQVNTT0MpIHsKICAgICAgICAgICAgJGFyciA9IEBteXNxbGlfZmV0Y2hfYXJyYXkoJHJlc3VsdCwgTVlTUUxJX0FTU09DKTsKICAgICAgICAgICAgaWYgKCR0aGlzLT5vcHRpb25zWydwb3J0YWJpbGl0eSddICYgREJfUE9SVEFCSUxJVFlfTE9XRVJDQVNFICYmICRhcnIpIHsKICAgICAgICAgICAgICAgICRhcnIgPSBhcnJheV9jaGFuZ2Vfa2V5X2Nhc2UoJGFyciwgQ0FTRV9MT1dFUik7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkYXJyID0gQG15c3FsaV9mZXRjaF9yb3coJHJlc3VsdCk7CiAgICAgICAgfQogICAgICAgIGlmICghJGFycikgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgaWYgKCR0aGlzLT5vcHRpb25zWydwb3J0YWJpbGl0eSddICYgREJfUE9SVEFCSUxJVFlfUlRSSU0pIHsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogRXZlbiB0aG91Z2ggdGhpcyBEQk1TIGFscmVhZHkgdHJpbXMgb3V0cHV0LCB3ZSBkbyB0aGlzIGJlY2F1c2UKICAgICAgICAgICAgICogYSBmaWVsZCBtaWdodCBoYXZlIGludGVudGlvbmFsIHdoaXRlc3BhY2UgYXQgdGhlIGVuZCB0aGF0CiAgICAgICAgICAgICAqIGdldHMgcmVtb3ZlZCBieSBEQl9QT1JUQUJJTElUWV9SVFJJTSB1bmRlciBhbm90aGVyIGRyaXZlci4KICAgICAgICAgICAgICovCiAgICAgICAgICAgICR0aGlzLT5fcnRyaW1BcnJheVZhbHVlcygkYXJyKTsKICAgICAgICB9CiAgICAgICAgaWYgKCR0aGlzLT5vcHRpb25zWydwb3J0YWJpbGl0eSddICYgREJfUE9SVEFCSUxJVFlfTlVMTF9UT19FTVBUWSkgewogICAgICAgICAgICAkdGhpcy0+X2NvbnZlcnROdWxsQXJyYXlWYWx1ZXNUb0VtcHR5KCRhcnIpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gREJfT0s7CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgZnJlZVJlc3VsdCgpCgogICAgLyoqCiAgICAgKiBEZWxldGVzIHRoZSByZXN1bHQgc2V0IGFuZCBmcmVlcyB0aGUgbWVtb3J5IG9jY3VwaWVkIGJ5IHRoZSByZXN1bHQgc2V0CiAgICAgKgogICAgICogVGhpcyBtZXRob2QgaXMgbm90IG1lYW50IHRvIGJlIGNhbGxlZCBkaXJlY3RseS4gIFVzZQogICAgICogREJfcmVzdWx0OjpmcmVlKCkgaW5zdGVhZC4gIEl0IGNhbid0IGJlIGRlY2xhcmVkICJwcm90ZWN0ZWQiCiAgICAgKiBiZWNhdXNlIERCX3Jlc3VsdCBpcyBhIHNlcGFyYXRlIG9iamVjdC4KICAgICAqCiAgICAgKiBAcGFyYW0gcmVzb3VyY2UgJHJlc3VsdCAgUEhQJ3MgcXVlcnkgcmVzdWx0IHJlc291cmNlCiAgICAgKgogICAgICogQHJldHVybiBib29sICBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIGlmICRyZXN1bHQgaXMgaW52YWxpZAogICAgICoKICAgICAqIEBzZWUgREJfcmVzdWx0OjpmcmVlKCkKICAgICAqLwogICAgZnVuY3Rpb24gZnJlZVJlc3VsdCgkcmVzdWx0KQogICAgewogICAgICAgIHJldHVybiBpc19yZXNvdXJjZSgkcmVzdWx0KSA/IG15c3FsaV9mcmVlX3Jlc3VsdCgkcmVzdWx0KSA6IGZhbHNlOwogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IG51bUNvbHMoKQoKICAgIC8qKgogICAgICogR2V0cyB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgaW4gYSByZXN1bHQgc2V0CiAgICAgKgogICAgICogVGhpcyBtZXRob2QgaXMgbm90IG1lYW50IHRvIGJlIGNhbGxlZCBkaXJlY3RseS4gIFVzZQogICAgICogREJfcmVzdWx0OjpudW1Db2xzKCkgaW5zdGVhZC4gIEl0IGNhbid0IGJlIGRlY2xhcmVkICJwcm90ZWN0ZWQiCiAgICAgKiBiZWNhdXNlIERCX3Jlc3VsdCBpcyBhIHNlcGFyYXRlIG9iamVjdC4KICAgICAqCiAgICAgKiBAcGFyYW0gcmVzb3VyY2UgJHJlc3VsdCAgUEhQJ3MgcXVlcnkgcmVzdWx0IHJlc291cmNlCiAgICAgKgogICAgICogQHJldHVybiBpbnQgIHRoZSBudW1iZXIgb2YgY29sdW1ucy4gIEEgREJfRXJyb3Igb2JqZWN0IG9uIGZhaWx1cmUuCiAgICAgKgogICAgICogQHNlZSBEQl9yZXN1bHQ6Om51bUNvbHMoKQogICAgICovCiAgICBmdW5jdGlvbiBudW1Db2xzKCRyZXN1bHQpCiAgICB7CiAgICAgICAgJGNvbHMgPSBAbXlzcWxpX251bV9maWVsZHMoJHJlc3VsdCk7CiAgICAgICAgaWYgKCEkY29scykgewogICAgICAgICAgICByZXR1cm4gJHRoaXMtPm15c3FsaVJhaXNlRXJyb3IoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICRjb2xzOwogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IG51bVJvd3MoKQoKICAgIC8qKgogICAgICogR2V0cyB0aGUgbnVtYmVyIG9mIHJvd3MgaW4gYSByZXN1bHQgc2V0CiAgICAgKgogICAgICogVGhpcyBtZXRob2QgaXMgbm90IG1lYW50IHRvIGJlIGNhbGxlZCBkaXJlY3RseS4gIFVzZQogICAgICogREJfcmVzdWx0OjpudW1Sb3dzKCkgaW5zdGVhZC4gIEl0IGNhbid0IGJlIGRlY2xhcmVkICJwcm90ZWN0ZWQiCiAgICAgKiBiZWNhdXNlIERCX3Jlc3VsdCBpcyBhIHNlcGFyYXRlIG9iamVjdC4KICAgICAqCiAgICAgKiBAcGFyYW0gcmVzb3VyY2UgJHJlc3VsdCAgUEhQJ3MgcXVlcnkgcmVzdWx0IHJlc291cmNlCiAgICAgKgogICAgICogQHJldHVybiBpbnQgIHRoZSBudW1iZXIgb2Ygcm93cy4gIEEgREJfRXJyb3Igb2JqZWN0IG9uIGZhaWx1cmUuCiAgICAgKgogICAgICogQHNlZSBEQl9yZXN1bHQ6Om51bVJvd3MoKQogICAgICovCiAgICBmdW5jdGlvbiBudW1Sb3dzKCRyZXN1bHQpCiAgICB7CiAgICAgICAgJHJvd3MgPSBAbXlzcWxpX251bV9yb3dzKCRyZXN1bHQpOwogICAgICAgIGlmICgkcm93cyA9PT0gbnVsbCkgewogICAgICAgICAgICByZXR1cm4gJHRoaXMtPm15c3FsaVJhaXNlRXJyb3IoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICRyb3dzOwogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IGF1dG9Db21taXQoKQoKICAgIC8qKgogICAgICogRW5hYmxlcyBvciBkaXNhYmxlcyBhdXRvbWF0aWMgY29tbWl0cwogICAgICoKICAgICAqIEBwYXJhbSBib29sICRvbm9mZiAgdHJ1ZSB0dXJucyBpdCBvbiwgZmFsc2UgdHVybnMgaXQgb2ZmCiAgICAgKgogICAgICogQHJldHVybiBpbnQgIERCX09LIG9uIHN1Y2Nlc3MuICBBIERCX0Vycm9yIG9iamVjdCBpZiB0aGUgZHJpdmVyCiAgICAgKiAgICAgICAgICAgICAgIGRvZXNuJ3Qgc3VwcG9ydCBhdXRvLWNvbW1pdHRpbmcgdHJhbnNhY3Rpb25zLgogICAgICovCiAgICBmdW5jdGlvbiBhdXRvQ29tbWl0KCRvbm9mZiA9IGZhbHNlKQogICAgewogICAgICAgIC8vIFhYWCBpZiAkdGhpcy0+dHJhbnNhY3Rpb25fb3Bjb3VudCA+IDAsIHdlIHNob3VsZCBwcm9iYWJseQogICAgICAgIC8vIGlzc3VlIGEgd2FybmluZyBoZXJlLgogICAgICAgICR0aGlzLT5hdXRvY29tbWl0ID0gJG9ub2ZmID8gdHJ1ZSA6IGZhbHNlOwogICAgICAgIHJldHVybiBEQl9PSzsKICAgIH0KCiAgICAvLyB9fX0KICAgIC8vIHt7eyBjb21taXQoKQoKICAgIC8qKgogICAgICogQ29tbWl0cyB0aGUgY3VycmVudCB0cmFuc2FjdGlvbgogICAgICoKICAgICAqIEByZXR1cm4gaW50ICBEQl9PSyBvbiBzdWNjZXNzLiAgQSBEQl9FcnJvciBvYmplY3Qgb24gZmFpbHVyZS4KICAgICAqLwogICAgZnVuY3Rpb24gY29tbWl0KCkKICAgIHsKICAgICAgICBpZiAoJHRoaXMtPnRyYW5zYWN0aW9uX29wY291bnQgPiAwKSB7CiAgICAgICAgICAgIGlmICgkdGhpcy0+X2RiKSB7CiAgICAgICAgICAgICAgICBpZiAoIUBteXNxbGlfc2VsZWN0X2RiKCR0aGlzLT5jb25uZWN0aW9uLCAkdGhpcy0+X2RiKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+bXlzcWxpUmFpc2VFcnJvcihEQl9FUlJPUl9OT0RCU0VMRUNURUQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgICRyZXN1bHQgPSBAbXlzcWxpX3F1ZXJ5KCR0aGlzLT5jb25uZWN0aW9uLCAnQ09NTUlUJyk7CiAgICAgICAgICAgICRyZXN1bHQgPSBAbXlzcWxpX3F1ZXJ5KCR0aGlzLT5jb25uZWN0aW9uLCAnU0VUIEFVVE9DT01NSVQ9MScpOwogICAgICAgICAgICAkdGhpcy0+dHJhbnNhY3Rpb25fb3Bjb3VudCA9IDA7CiAgICAgICAgICAgIGlmICghJHJlc3VsdCkgewogICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5teXNxbGlSYWlzZUVycm9yKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIERCX09LOwogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IHJvbGxiYWNrKCkKCiAgICAvKioKICAgICAqIFJldmVydHMgdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24KICAgICAqCiAgICAgKiBAcmV0dXJuIGludCAgREJfT0sgb24gc3VjY2Vzcy4gIEEgREJfRXJyb3Igb2JqZWN0IG9uIGZhaWx1cmUuCiAgICAgKi8KICAgIGZ1bmN0aW9uIHJvbGxiYWNrKCkKICAgIHsKICAgICAgICBpZiAoJHRoaXMtPnRyYW5zYWN0aW9uX29wY291bnQgPiAwKSB7CiAgICAgICAgICAgIGlmICgkdGhpcy0+X2RiKSB7CiAgICAgICAgICAgICAgICBpZiAoIUBteXNxbGlfc2VsZWN0X2RiKCR0aGlzLT5jb25uZWN0aW9uLCAkdGhpcy0+X2RiKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+bXlzcWxpUmFpc2VFcnJvcihEQl9FUlJPUl9OT0RCU0VMRUNURUQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgICRyZXN1bHQgPSBAbXlzcWxpX3F1ZXJ5KCR0aGlzLT5jb25uZWN0aW9uLCAnUk9MTEJBQ0snKTsKICAgICAgICAgICAgJHJlc3VsdCA9IEBteXNxbGlfcXVlcnkoJHRoaXMtPmNvbm5lY3Rpb24sICdTRVQgQVVUT0NPTU1JVD0xJyk7CiAgICAgICAgICAgICR0aGlzLT50cmFuc2FjdGlvbl9vcGNvdW50ID0gMDsKICAgICAgICAgICAgaWYgKCEkcmVzdWx0KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPm15c3FsaVJhaXNlRXJyb3IoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gREJfT0s7CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgYWZmZWN0ZWRSb3dzKCkKCiAgICAvKioKICAgICAqIERldGVybWluZXMgdGhlIG51bWJlciBvZiByb3dzIGFmZmVjdGVkIGJ5IGEgZGF0YSBtYW5pdXBsYXRpb24gcXVlcnkKICAgICAqCiAgICAgKiAwIGlzIHJldHVybmVkIGZvciBxdWVyaWVzIHRoYXQgZG9uJ3QgbWFuaXB1bGF0ZSBkYXRhLgogICAgICoKICAgICAqIEByZXR1cm4gaW50ICB0aGUgbnVtYmVyIG9mIHJvd3MuICBBIERCX0Vycm9yIG9iamVjdCBvbiBmYWlsdXJlLgogICAgICovCiAgICBmdW5jdGlvbiBhZmZlY3RlZFJvd3MoKQogICAgewogICAgICAgIGlmICgkdGhpcy0+X2xhc3RfcXVlcnlfbWFuaXApIHsKICAgICAgICAgICAgcmV0dXJuIEBteXNxbGlfYWZmZWN0ZWRfcm93cygkdGhpcy0+Y29ubmVjdGlvbik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgIH0KCiAgICAvLyB9fX0KICAgIC8vIHt7eyBuZXh0SWQoKQoKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgbmV4dCBmcmVlIGlkIGluIGEgc2VxdWVuY2UKICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICAkc2VxX25hbWUgIG5hbWUgb2YgdGhlIHNlcXVlbmNlCiAgICAgKiBAcGFyYW0gYm9vbGVhbiAkb25kZW1hbmQgIHdoZW4gdHJ1ZSwgdGhlIHNlcWVuY2UgaXMgYXV0b21hdGljYWxseQogICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlZCBpZiBpdCBkb2VzIG5vdCBleGlzdAogICAgICoKICAgICAqIEByZXR1cm4gaW50ICB0aGUgbmV4dCBpZCBudW1iZXIgaW4gdGhlIHNlcXVlbmNlLgogICAgICogICAgICAgICAgICAgICBBIERCX0Vycm9yIG9iamVjdCBvbiBmYWlsdXJlLgogICAgICoKICAgICAqIEBzZWUgREJfY29tbW9uOjpuZXh0SUQoKSwgREJfY29tbW9uOjpnZXRTZXF1ZW5jZU5hbWUoKSwKICAgICAqICAgICAgREJfbXlzcWxpOjpjcmVhdGVTZXF1ZW5jZSgpLCBEQl9teXNxbGk6OmRyb3BTZXF1ZW5jZSgpCiAgICAgKi8KICAgIGZ1bmN0aW9uIG5leHRJZCgkc2VxX25hbWUsICRvbmRlbWFuZCA9IHRydWUpCiAgICB7CiAgICAgICAgJHNlcW5hbWUgPSAkdGhpcy0+Z2V0U2VxdWVuY2VOYW1lKCRzZXFfbmFtZSk7CiAgICAgICAgZG8gewogICAgICAgICAgICAkcmVwZWF0ID0gMDsKICAgICAgICAgICAgJHRoaXMtPnB1c2hFcnJvckhhbmRsaW5nKFBFQVJfRVJST1JfUkVUVVJOKTsKICAgICAgICAgICAgJHJlc3VsdCA9ICR0aGlzLT5xdWVyeSgnVVBEQVRFICcgLiAkc2VxbmFtZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJyBTRVQgaWQgPSBMQVNUX0lOU0VSVF9JRChpZCArIDEpJyk7CiAgICAgICAgICAgICR0aGlzLT5wb3BFcnJvckhhbmRsaW5nKCk7CiAgICAgICAgICAgIGlmICgkcmVzdWx0ID09PSBEQl9PSykgewogICAgICAgICAgICAgICAgLy8gQ09NTU9OIENBU0UKICAgICAgICAgICAgICAgICRpZCA9IEBteXNxbGlfaW5zZXJ0X2lkKCR0aGlzLT5jb25uZWN0aW9uKTsKICAgICAgICAgICAgICAgIGlmICgkaWQgIT0gMCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkaWQ7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gRU1QVFkgU0VRIFRBQkxFCiAgICAgICAgICAgICAgICAvLyBTZXF1ZW5jZSB0YWJsZSBtdXN0IGJlIGVtcHR5IGZvciBzb21lIHJlYXNvbiwKICAgICAgICAgICAgICAgIC8vIHNvIGZpbGwgaXQgYW5kIHJldHVybiAxCiAgICAgICAgICAgICAgICAvLyBPYnRhaW4gYSB1c2VyLWxldmVsIGxvY2sKICAgICAgICAgICAgICAgICRyZXN1bHQgPSAkdGhpcy0+Z2V0T25lKCdTRUxFQ1QgR0VUX0xPQ0soJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiJyR7c2VxbmFtZX1fbG9jaycsIDEwKSIpOwogICAgICAgICAgICAgICAgaWYgKERCOjppc0Vycm9yKCRyZXN1bHQpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5yYWlzZUVycm9yKCRyZXN1bHQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCRyZXN1bHQgPT0gMCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+bXlzcWxpUmFpc2VFcnJvcihEQl9FUlJPUl9OT1RfTE9DS0VEKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBhZGQgdGhlIGRlZmF1bHQgdmFsdWUKICAgICAgICAgICAgICAgICRyZXN1bHQgPSAkdGhpcy0+cXVlcnkoJ1JFUExBQ0UgSU5UTyAnIC4gJHNlcW5hbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAnIChpZCkgVkFMVUVTICgwKScpOwogICAgICAgICAgICAgICAgaWYgKERCOjppc0Vycm9yKCRyZXN1bHQpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5yYWlzZUVycm9yKCRyZXN1bHQpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIFJlbGVhc2UgdGhlIGxvY2sKICAgICAgICAgICAgICAgICRyZXN1bHQgPSAkdGhpcy0+Z2V0T25lKCdTRUxFQ1QgUkVMRUFTRV9MT0NLKCcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIicke3NlcW5hbWV9X2xvY2snKSIpOwogICAgICAgICAgICAgICAgaWYgKERCOjppc0Vycm9yKCRyZXN1bHQpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5yYWlzZUVycm9yKCRyZXN1bHQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gV2Uga25vdyB3aGF0IHRoZSByZXN1bHQgd2lsbCBiZSwgc28gbm8gbmVlZCB0byB0cnkgYWdhaW4KICAgICAgICAgICAgICAgIHJldHVybiAxOwoKICAgICAgICAgICAgfSBlbHNlaWYgKCRvbmRlbWFuZCAmJiBEQjo6aXNFcnJvcigkcmVzdWx0KSAmJgogICAgICAgICAgICAgICAgJHJlc3VsdC0+Z2V0Q29kZSgpID09IERCX0VSUk9SX05PU1VDSFRBQkxFKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBPTkRFTUFORCBUQUJMRSBDUkVBVElPTgogICAgICAgICAgICAgICAgJHJlc3VsdCA9ICR0aGlzLT5jcmVhdGVTZXF1ZW5jZSgkc2VxX25hbWUpOwoKICAgICAgICAgICAgICAgIC8vIFNpbmNlIGNyZWF0ZVNlcXVlbmNlIGluaXRpYWxpemVzIHRoZSBJRCB0byBiZSAxLAogICAgICAgICAgICAgICAgLy8gd2UgZG8gbm90IG5lZWQgdG8gcmV0cmlldmUgdGhlIElEIGFnYWluIChvciB3ZSB3aWxsIGdldCAyKQogICAgICAgICAgICAgICAgaWYgKERCOjppc0Vycm9yKCRyZXN1bHQpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5yYWlzZUVycm9yKCRyZXN1bHQpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAvLyBGaXJzdCBJRCBvZiBhIG5ld2x5IGNyZWF0ZWQgc2VxdWVuY2UgaXMgMQogICAgICAgICAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgfSBlbHNlaWYgKERCOjppc0Vycm9yKCRyZXN1bHQpICYmCiAgICAgICAgICAgICAgICAgICAgICAkcmVzdWx0LT5nZXRDb2RlKCkgPT0gREJfRVJST1JfQUxSRUFEWV9FWElTVFMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIEJBQ0tXQVJEUyBDT01QQVQKICAgICAgICAgICAgICAgIC8vIHNlZSBfQkNzZXF1ZW5jZSgpIGNvbW1lbnQKICAgICAgICAgICAgICAgICRyZXN1bHQgPSAkdGhpcy0+X0JDc2VxdWVuY2UoJHNlcW5hbWUpOwogICAgICAgICAgICAgICAgaWYgKERCOjppc0Vycm9yKCRyZXN1bHQpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5yYWlzZUVycm9yKCRyZXN1bHQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJHJlcGVhdCA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9IHdoaWxlICgkcmVwZWF0KTsKCiAgICAgICAgcmV0dXJuICR0aGlzLT5yYWlzZUVycm9yKCRyZXN1bHQpOwogICAgfQoKICAgIC8qKgogICAgICogQ3JlYXRlcyBhIG5ldyBzZXF1ZW5jZQogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgJHNlcV9uYW1lICBuYW1lIG9mIHRoZSBuZXcgc2VxdWVuY2UKICAgICAqCiAgICAgKiBAcmV0dXJuIGludCAgREJfT0sgb24gc3VjY2Vzcy4gIEEgREJfRXJyb3Igb2JqZWN0IG9uIGZhaWx1cmUuCiAgICAgKgogICAgICogQHNlZSBEQl9jb21tb246OmNyZWF0ZVNlcXVlbmNlKCksIERCX2NvbW1vbjo6Z2V0U2VxdWVuY2VOYW1lKCksCiAgICAgKiAgICAgIERCX215c3FsaTo6bmV4dElEKCksIERCX215c3FsaTo6ZHJvcFNlcXVlbmNlKCkKICAgICAqLwogICAgZnVuY3Rpb24gY3JlYXRlU2VxdWVuY2UoJHNlcV9uYW1lKQogICAgewogICAgICAgICRzZXFuYW1lID0gJHRoaXMtPmdldFNlcXVlbmNlTmFtZSgkc2VxX25hbWUpOwogICAgICAgICRyZXMgPSAkdGhpcy0+cXVlcnkoJ0NSRUFURSBUQUJMRSAnIC4gJHNlcW5hbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJyAoaWQgSU5URUdFUiBVTlNJR05FRCBBVVRPX0lOQ1JFTUVOVCBOT1QgTlVMTCwnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICcgUFJJTUFSWSBLRVkoaWQpKScpOwogICAgICAgIGlmIChEQjo6aXNFcnJvcigkcmVzKSkgewogICAgICAgICAgICByZXR1cm4gJHJlczsKICAgICAgICB9CiAgICAgICAgLy8gaW5zZXJ0IHlpZWxkcyB2YWx1ZSAxLCBuZXh0SWQgY2FsbCB3aWxsIGdlbmVyYXRlIElEIDIKICAgICAgICByZXR1cm4gJHRoaXMtPnF1ZXJ5KCJJTlNFUlQgSU5UTyAke3NlcW5hbWV9IChpZCkgVkFMVUVTICgwKSIpOwogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IGRyb3BTZXF1ZW5jZSgpCgogICAgLyoqCiAgICAgKiBEZWxldGVzIGEgc2VxdWVuY2UKICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICRzZXFfbmFtZSAgbmFtZSBvZiB0aGUgc2VxdWVuY2UgdG8gYmUgZGVsZXRlZAogICAgICoKICAgICAqIEByZXR1cm4gaW50ICBEQl9PSyBvbiBzdWNjZXNzLiAgQSBEQl9FcnJvciBvYmplY3Qgb24gZmFpbHVyZS4KICAgICAqCiAgICAgKiBAc2VlIERCX2NvbW1vbjo6ZHJvcFNlcXVlbmNlKCksIERCX2NvbW1vbjo6Z2V0U2VxdWVuY2VOYW1lKCksCiAgICAgKiAgICAgIERCX215c3FsOjpuZXh0SUQoKSwgREJfbXlzcWw6OmNyZWF0ZVNlcXVlbmNlKCkKICAgICAqLwogICAgZnVuY3Rpb24gZHJvcFNlcXVlbmNlKCRzZXFfbmFtZSkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnF1ZXJ5KCdEUk9QIFRBQkxFICcgLiAkdGhpcy0+Z2V0U2VxdWVuY2VOYW1lKCRzZXFfbmFtZSkpOwogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IF9CQ3NlcXVlbmNlKCkKCiAgICAvKioKICAgICAqIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHdpdGggb2xkIHNlcXVlbmNlIGVtdWxhdGlvbiBpbXBsZW1lbnRhdGlvbgogICAgICogKGNsZWFuIHVwIHRoZSBkdXBlcykKICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICRzZXFuYW1lICB0aGUgc2VxdWVuY2UgbmFtZSB0byBjbGVhbiB1cAogICAgICoKICAgICAqIEByZXR1cm4gYm9vbCAgdHJ1ZSBvbiBzdWNjZXNzLiAgQSBEQl9FcnJvciBvYmplY3Qgb24gZmFpbHVyZS4KICAgICAqCiAgICAgKiBAYWNjZXNzIHByaXZhdGUKICAgICAqLwogICAgZnVuY3Rpb24gX0JDc2VxdWVuY2UoJHNlcW5hbWUpCiAgICB7CiAgICAgICAgLy8gT2J0YWluIGEgdXNlci1sZXZlbCBsb2NrLi4uIHRoaXMgd2lsbCByZWxlYXNlIGFueSBwcmV2aW91cwogICAgICAgIC8vIGFwcGxpY2F0aW9uIGxvY2tzLCBidXQgdW5saWtlIExPQ0sgVEFCTEVTLCBpdCBkb2VzIG5vdCBhYm9ydAogICAgICAgIC8vIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uIGFuZCBpcyBtdWNoIGxlc3MgZnJlcXVlbnRseSB1c2VkLgogICAgICAgICRyZXN1bHQgPSAkdGhpcy0+Z2V0T25lKCJTRUxFQ1QgR0VUX0xPQ0soJyR7c2VxbmFtZX1fbG9jaycsMTApIik7CiAgICAgICAgaWYgKERCOjppc0Vycm9yKCRyZXN1bHQpKSB7CiAgICAgICAgICAgIHJldHVybiAkcmVzdWx0OwogICAgICAgIH0KICAgICAgICBpZiAoJHJlc3VsdCA9PSAwKSB7CiAgICAgICAgICAgIC8vIEZhaWxlZCB0byBnZXQgdGhlIGxvY2ssIGNhbid0IGRvIHRoZSBjb252ZXJzaW9uLCBiYWlsCiAgICAgICAgICAgIC8vIHdpdGggYSBEQl9FUlJPUl9OT1RfTE9DS0VEIGVycm9yCiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+bXlzcWxpUmFpc2VFcnJvcihEQl9FUlJPUl9OT1RfTE9DS0VEKTsKICAgICAgICB9CgogICAgICAgICRoaWdoZXN0X2lkID0gJHRoaXMtPmdldE9uZSgiU0VMRUNUIE1BWChpZCkgRlJPTSAke3NlcW5hbWV9Iik7CiAgICAgICAgaWYgKERCOjppc0Vycm9yKCRoaWdoZXN0X2lkKSkgewogICAgICAgICAgICByZXR1cm4gJGhpZ2hlc3RfaWQ7CiAgICAgICAgfQoKICAgICAgICAvLyBUaGlzIHNob3VsZCBraWxsIGFsbCByb3dzIGV4Y2VwdCB0aGUgaGlnaGVzdAogICAgICAgIC8vIFdlIHNob3VsZCBwcm9iYWJseSBkbyBzb21ldGhpbmcgaWYgJGhpZ2hlc3RfaWQgaXNuJ3QKICAgICAgICAvLyBudW1lcmljLCBidXQgSSdtIGF0IGEgbG9zcyBhcyBob3cgdG8gaGFuZGxlIHRoYXQuLi4KICAgICAgICAkcmVzdWx0ID0gJHRoaXMtPnF1ZXJ5KCdERUxFVEUgRlJPTSAnIC4gJHNlcW5hbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBXSEVSRSBpZCA8PiAkaGlnaGVzdF9pZCIpOwogICAgICAgIGlmIChEQjo6aXNFcnJvcigkcmVzdWx0KSkgewogICAgICAgICAgICByZXR1cm4gJHJlc3VsdDsKICAgICAgICB9CgogICAgICAgIC8vIElmIGFub3RoZXIgdGhyZWFkIGhhcyBiZWVuIHdhaXRpbmcgZm9yIHRoaXMgbG9jaywKICAgICAgICAvLyBpdCB3aWxsIGdvIHRocnUgdGhlIGFib3ZlIHByb2NlZHVyZSwgYnV0IHdpbGwgaGF2ZSBubwogICAgICAgIC8vIHJlYWwgZWZmZWN0CiAgICAgICAgJHJlc3VsdCA9ICR0aGlzLT5nZXRPbmUoIlNFTEVDVCBSRUxFQVNFX0xPQ0soJyR7c2VxbmFtZX1fbG9jaycpIik7CiAgICAgICAgaWYgKERCOjppc0Vycm9yKCRyZXN1bHQpKSB7CiAgICAgICAgICAgIHJldHVybiAkcmVzdWx0OwogICAgICAgIH0KICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICAvLyB9fX0KICAgIC8vIHt7eyBxdW90ZUlkZW50aWZpZXIoKQoKICAgIC8qKgogICAgICogUXVvdGVzIGEgc3RyaW5nIHNvIGl0IGNhbiBiZSBzYWZlbHkgdXNlZCBhcyBhIHRhYmxlIG9yIGNvbHVtbiBuYW1lCiAgICAgKiAoV0FSTklORzogdXNpbmcgbmFtZXMgdGhhdCByZXF1aXJlIHRoaXMgaXMgYSBSRUFMTFkgQkFEIElERUEpCiAgICAgKgogICAgICogV0FSTklORzogIE9sZGVyIHZlcnNpb25zIG9mIE15U1FMIGNhbid0IGhhbmRsZSB0aGUgYmFja3RpY2sKICAgICAqIGNoYXJhY3RlciAoPGtiZD5gPC9rYmQ+KSBpbiB0YWJsZSBvciBjb2x1bW4gbmFtZXMuCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkc3RyICBpZGVudGlmaWVyIG5hbWUgdG8gYmUgcXVvdGVkCiAgICAgKgogICAgICogQHJldHVybiBzdHJpbmcgIHF1b3RlZCBpZGVudGlmaWVyIHN0cmluZwogICAgICoKICAgICAqIEBzZWUgREJfY29tbW9uOjpxdW90ZUlkZW50aWZpZXIoKQogICAgICogQHNpbmNlIE1ldGhvZCBhdmFpbGFibGUgc2luY2UgUmVsZWFzZSAxLjYuMAogICAgICovCiAgICBmdW5jdGlvbiBxdW90ZUlkZW50aWZpZXIoJHN0cikKICAgIHsKICAgICAgICByZXR1cm4gJ2AnIC4gc3RyX3JlcGxhY2UoJ2AnLCAnYGAnLCAkc3RyKSAuICdgJzsKICAgIH0KCiAgICAvLyB9fX0KICAgIC8vIHt7eyBlc2NhcGVTaW1wbGUoKQoKICAgIC8qKgogICAgICogRXNjYXBlcyBhIHN0cmluZyBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgREJNUydzIHN0YW5kYXJkcwogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgJHN0ciAgdGhlIHN0cmluZyB0byBiZSBlc2NhcGVkCiAgICAgKgogICAgICogQHJldHVybiBzdHJpbmcgIHRoZSBlc2NhcGVkIHN0cmluZwogICAgICoKICAgICAqIEBzZWUgREJfY29tbW9uOjpxdW90ZVNtYXJ0KCkKICAgICAqIEBzaW5jZSBNZXRob2QgYXZhaWxhYmxlIHNpbmNlIFJlbGVhc2UgMS42LjAKICAgICAqLwogICAgZnVuY3Rpb24gZXNjYXBlU2ltcGxlKCRzdHIpCiAgICB7CiAgICAgICAgcmV0dXJuIEBteXNxbGlfcmVhbF9lc2NhcGVfc3RyaW5nKCR0aGlzLT5jb25uZWN0aW9uLCAkc3RyKTsKICAgIH0KCiAgICAvLyB9fX0KICAgIC8vIHt7eyBtb2RpZnlMaW1pdFF1ZXJ5KCkKCiAgICAvKioKICAgICAqIEFkZHMgTElNSVQgY2xhdXNlcyB0byBhIHF1ZXJ5IHN0cmluZyBhY2NvcmRpbmcgdG8gY3VycmVudCBEQk1TIHN0YW5kYXJkcwogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgJHF1ZXJ5ICAgdGhlIHF1ZXJ5IHRvIG1vZGlmeQogICAgICogQHBhcmFtIGludCAgICAkZnJvbSAgICB0aGUgcm93IHRvIHN0YXJ0IHRvIGZldGNoaW5nICgwID0gdGhlIGZpcnN0IHJvdykKICAgICAqIEBwYXJhbSBpbnQgICAgJGNvdW50ICAgdGhlIG51bWJlcnMgb2Ygcm93cyB0byBmZXRjaAogICAgICogQHBhcmFtIG1peGVkICAkcGFyYW1zICBhcnJheSwgc3RyaW5nIG9yIG51bWVyaWMgZGF0YSB0byBiZSB1c2VkIGluCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRpb24gb2YgdGhlIHN0YXRlbWVudC4gIFF1YW50aXR5IG9mIGl0ZW1zCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgbXVzdCBtYXRjaCBxdWFudGl0eSBvZiBwbGFjZWhvbGRlcnMgaW4KICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5OiAgbWVhbmluZyAxIHBsYWNlaG9sZGVyIGZvciBub24tYXJyYXkKICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMgb3IgMSBwbGFjZWhvbGRlciBwZXIgYXJyYXkgZWxlbWVudC4KICAgICAqCiAgICAgKiBAcmV0dXJuIHN0cmluZyAgdGhlIHF1ZXJ5IHN0cmluZyB3aXRoIExJTUlUIGNsYXVzZXMgYWRkZWQKICAgICAqCiAgICAgKiBAYWNjZXNzIHByb3RlY3RlZAogICAgICovCiAgICBmdW5jdGlvbiBtb2RpZnlMaW1pdFF1ZXJ5KCRxdWVyeSwgJGZyb20sICRjb3VudCwgJHBhcmFtcyA9IGFycmF5KCkpCiAgICB7CiAgICAgICAgaWYgKERCOjppc01hbmlwKCRxdWVyeSkgfHwgJHRoaXMtPl9uZXh0X3F1ZXJ5X21hbmlwKSB7CiAgICAgICAgICAgIHJldHVybiAkcXVlcnkgLiAiIExJTUlUICRjb3VudCI7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuICRxdWVyeSAuICIgTElNSVQgJGZyb20sICRjb3VudCI7CiAgICAgICAgfQogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IG15c3FsaVJhaXNlRXJyb3IoKQoKICAgIC8qKgogICAgICogUHJvZHVjZXMgYSBEQl9FcnJvciBvYmplY3QgcmVnYXJkaW5nIHRoZSBjdXJyZW50IHByb2JsZW0KICAgICAqCiAgICAgKiBAcGFyYW0gaW50ICRlcnJubyAgaWYgdGhlIGVycm9yIGlzIGJlaW5nIG1hbnVhbGx5IHJhaXNlZCBwYXNzIGEKICAgICAqICAgICAgICAgICAgICAgICAgICAgREJfRVJST1IqIGNvbnN0YW50IGhlcmUuICBJZiB0aGlzIGlzbid0IHBhc3NlZAogICAgICogICAgICAgICAgICAgICAgICAgICB0aGUgZXJyb3IgaW5mb3JtYXRpb24gZ2F0aGVyZWQgZnJvbSB0aGUgREJNUy4KICAgICAqCiAgICAgKiBAcmV0dXJuIG9iamVjdCAgdGhlIERCX0Vycm9yIG9iamVjdAogICAgICoKICAgICAqIEBzZWUgREJfY29tbW9uOjpyYWlzZUVycm9yKCksCiAgICAgKiAgICAgIERCX215c3FsaTo6ZXJyb3JOYXRpdmUoKSwgREJfY29tbW9uOjplcnJvckNvZGUoKQogICAgICovCiAgICBmdW5jdGlvbiBteXNxbGlSYWlzZUVycm9yKCRlcnJubyA9IG51bGwpCiAgICB7CiAgICAgICAgaWYgKCRlcnJubyA9PT0gbnVsbCkgewogICAgICAgICAgICBpZiAoJHRoaXMtPm9wdGlvbnNbJ3BvcnRhYmlsaXR5J10gJiBEQl9QT1JUQUJJTElUWV9FUlJPUlMpIHsKICAgICAgICAgICAgICAgICR0aGlzLT5lcnJvcmNvZGVfbWFwWzEwMjJdID0gREJfRVJST1JfQ09OU1RSQUlOVDsKICAgICAgICAgICAgICAgICR0aGlzLT5lcnJvcmNvZGVfbWFwWzEwNDhdID0gREJfRVJST1JfQ09OU1RSQUlOVF9OT1RfTlVMTDsKICAgICAgICAgICAgICAgICR0aGlzLT5lcnJvcmNvZGVfbWFwWzEwNjJdID0gREJfRVJST1JfQ09OU1RSQUlOVDsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIC8vIERvaW5nIHRoaXMgaW4gY2FzZSBtb2RlIGNoYW5nZXMgZHVyaW5nIHJ1bnRpbWUuCiAgICAgICAgICAgICAgICAkdGhpcy0+ZXJyb3Jjb2RlX21hcFsxMDIyXSA9IERCX0VSUk9SX0FMUkVBRFlfRVhJU1RTOwogICAgICAgICAgICAgICAgJHRoaXMtPmVycm9yY29kZV9tYXBbMTA0OF0gPSBEQl9FUlJPUl9DT05TVFJBSU5UOwogICAgICAgICAgICAgICAgJHRoaXMtPmVycm9yY29kZV9tYXBbMTA2Ml0gPSBEQl9FUlJPUl9BTFJFQURZX0VYSVNUUzsKICAgICAgICAgICAgfQogICAgICAgICAgICAkZXJybm8gPSAkdGhpcy0+ZXJyb3JDb2RlKG15c3FsaV9lcnJubygkdGhpcy0+Y29ubmVjdGlvbikpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJHRoaXMtPnJhaXNlRXJyb3IoJGVycm5vLCBudWxsLCBudWxsLCBudWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAbXlzcWxpX2Vycm5vKCR0aGlzLT5jb25uZWN0aW9uKSAuICcgKiogJyAuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBteXNxbGlfZXJyb3IoJHRoaXMtPmNvbm5lY3Rpb24pKTsKICAgIH0KCiAgICAvLyB9fX0KICAgIC8vIHt7eyBlcnJvck5hdGl2ZSgpCgogICAgLyoqCiAgICAgKiBHZXRzIHRoZSBEQk1TJyBuYXRpdmUgZXJyb3IgY29kZSBwcm9kdWNlZCBieSB0aGUgbGFzdCBxdWVyeQogICAgICoKICAgICAqIEByZXR1cm4gaW50ICB0aGUgREJNUycgZXJyb3IgY29kZQogICAgICovCiAgICBmdW5jdGlvbiBlcnJvck5hdGl2ZSgpCiAgICB7CiAgICAgICAgcmV0dXJuIEBteXNxbGlfZXJybm8oJHRoaXMtPmNvbm5lY3Rpb24pOwogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IHRhYmxlSW5mbygpCgogICAgLyoqCiAgICAgKiBSZXR1cm5zIGluZm9ybWF0aW9uIGFib3V0IGEgdGFibGUgb3IgYSByZXN1bHQgc2V0CiAgICAgKgogICAgICogQHBhcmFtIG9iamVjdHxzdHJpbmcgICRyZXN1bHQgIERCX3Jlc3VsdCBvYmplY3QgZnJvbSBhIHF1ZXJ5IG9yIGEKICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIG5hbWUgb2YgYSB0YWJsZS4KICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2hpbGUgdGhpcyBhbHNvIGFjY2VwdHMgYSBxdWVyeSByZXN1bHQKICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2UgaWRlbnRpZmllciwgdGhpcyBiZWhhdmlvciBpcwogICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXByZWNhdGVkLgogICAgICogQHBhcmFtIGludCAgICAgICAgICAgICRtb2RlICAgIGEgdmFsaWQgdGFibGVJbmZvIG1vZGUKICAgICAqCiAgICAgKiBAcmV0dXJuIGFycmF5ICBhbiBhc3NvY2lhdGl2ZSBhcnJheSB3aXRoIHRoZSBpbmZvcm1hdGlvbiByZXF1ZXN0ZWQuCiAgICAgKiAgICAgICAgICAgICAgICAgQSBEQl9FcnJvciBvYmplY3Qgb24gZmFpbHVyZS4KICAgICAqCiAgICAgKiBAc2VlIERCX2NvbW1vbjo6c2V0T3B0aW9uKCkKICAgICAqLwogICAgZnVuY3Rpb24gdGFibGVJbmZvKCRyZXN1bHQsICRtb2RlID0gbnVsbCkKICAgIHsKICAgICAgICBpZiAoaXNfc3RyaW5nKCRyZXN1bHQpKSB7CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIFByb2JhYmx5IHJlY2VpdmVkIGEgdGFibGUgbmFtZS4KICAgICAgICAgICAgICogQ3JlYXRlIGEgcmVzdWx0IHJlc291cmNlIGlkZW50aWZpZXIuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICAkaWQgPSBAbXlzcWxpX3F1ZXJ5KCR0aGlzLT5jb25uZWN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTRUxFQ1QgKiBGUk9NICRyZXN1bHQgTElNSVQgMCIpOwogICAgICAgICAgICAkZ290X3N0cmluZyA9IHRydWU7CiAgICAgICAgfSBlbHNlaWYgKGlzc2V0KCRyZXN1bHQtPnJlc3VsdCkpIHsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogUHJvYmFibHkgcmVjZWl2ZWQgYSByZXN1bHQgb2JqZWN0LgogICAgICAgICAgICAgKiBFeHRyYWN0IHRoZSByZXN1bHQgcmVzb3VyY2UgaWRlbnRpZmllci4KICAgICAgICAgICAgICovCiAgICAgICAgICAgICRpZCA9ICRyZXN1bHQtPnJlc3VsdDsKICAgICAgICAgICAgJGdvdF9zdHJpbmcgPSBmYWxzZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBQcm9iYWJseSByZWNlaXZlZCBhIHJlc3VsdCByZXNvdXJjZSBpZGVudGlmaWVyLgogICAgICAgICAgICAgKiBDb3B5IGl0LgogICAgICAgICAgICAgKiBEZXByZWNhdGVkLiAgSGVyZSBmb3IgY29tcGF0aWJpbGl0eSBvbmx5LgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgJGlkID0gJHJlc3VsdDsKICAgICAgICAgICAgJGdvdF9zdHJpbmcgPSBmYWxzZTsKICAgICAgICB9CgogICAgICAgIGlmICghaXNfYSgkaWQsICdteXNxbGlfcmVzdWx0JykpIHsKICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5teXNxbGlSYWlzZUVycm9yKERCX0VSUk9SX05FRURfTU9SRV9EQVRBKTsKICAgICAgICB9CgogICAgICAgIGlmICgkdGhpcy0+b3B0aW9uc1sncG9ydGFiaWxpdHknXSAmIERCX1BPUlRBQklMSVRZX0xPV0VSQ0FTRSkgewogICAgICAgICAgICAkY2FzZV9mdW5jID0gJ3N0cnRvbG93ZXInOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRjYXNlX2Z1bmMgPSAnc3RydmFsJzsKICAgICAgICB9CgogICAgICAgICRjb3VudCA9IEBteXNxbGlfbnVtX2ZpZWxkcygkaWQpOwogICAgICAgICRyZXMgICA9IGFycmF5KCk7CgogICAgICAgIGlmICgkbW9kZSkgewogICAgICAgICAgICAkcmVzWydudW1fZmllbGRzJ10gPSAkY291bnQ7CiAgICAgICAgfQoKICAgICAgICBmb3IgKCRpID0gMDsgJGkgPCAkY291bnQ7ICRpKyspIHsKICAgICAgICAgICAgJHRtcCA9IEBteXNxbGlfZmV0Y2hfZmllbGQoJGlkKTsKCiAgICAgICAgICAgICRmbGFncyA9ICcnOwogICAgICAgICAgICBmb3JlYWNoICgkdGhpcy0+bXlzcWxpX2ZsYWdzIGFzICRjb25zdCA9PiAkbWVhbnMpIHsKICAgICAgICAgICAgICAgIGlmICgkdG1wLT5mbGFncyAmICRjb25zdCkgewogICAgICAgICAgICAgICAgICAgICRmbGFncyAuPSAkbWVhbnMgLiAnICc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCR0bXAtPmRlZikgewogICAgICAgICAgICAgICAgJGZsYWdzIC49ICdkZWZhdWx0XycgLiByYXd1cmxlbmNvZGUoJHRtcC0+ZGVmKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkZmxhZ3MgPSB0cmltKCRmbGFncyk7CgogICAgICAgICAgICAkcmVzWyRpXSA9IGFycmF5KAogICAgICAgICAgICAgICAgJ3RhYmxlJyA9PiAkY2FzZV9mdW5jKCR0bXAtPnRhYmxlKSwKICAgICAgICAgICAgICAgICduYW1lJyAgPT4gJGNhc2VfZnVuYygkdG1wLT5uYW1lKSwKICAgICAgICAgICAgICAgICd0eXBlJyAgPT4gaXNzZXQoJHRoaXMtPm15c3FsaV90eXBlc1skdG1wLT50eXBlXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAkdGhpcy0+bXlzcWxpX3R5cGVzWyR0bXAtPnR5cGVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJ3Vua25vd24nLAogICAgICAgICAgICAgICAgLy8gaHR0cDovL2J1Z3MucGhwLm5ldC8/aWQ9MzY1NzkKICAgICAgICAgICAgICAgICdsZW4nICAgPT4gJHRtcC0+bGVuZ3RoLAogICAgICAgICAgICAgICAgJ2ZsYWdzJyA9PiAkZmxhZ3MsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoJG1vZGUgJiBEQl9UQUJMRUlORk9fT1JERVIpIHsKICAgICAgICAgICAgICAgICRyZXNbJ29yZGVyJ11bJHJlc1skaV1bJ25hbWUnXV0gPSAkaTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoJG1vZGUgJiBEQl9UQUJMRUlORk9fT1JERVJUQUJMRSkgewogICAgICAgICAgICAgICAgJHJlc1snb3JkZXJ0YWJsZSddWyRyZXNbJGldWyd0YWJsZSddXVskcmVzWyRpXVsnbmFtZSddXSA9ICRpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBmcmVlIHRoZSByZXN1bHQgb25seSBpZiB3ZSB3ZXJlIGNhbGxlZCBvbiBhIHRhYmxlCiAgICAgICAgaWYgKCRnb3Rfc3RyaW5nKSB7CiAgICAgICAgICAgIEBteXNxbGlfZnJlZV9yZXN1bHQoJGlkKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICRyZXM7CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgZ2V0U3BlY2lhbFF1ZXJ5KCkKCiAgICAvKioKICAgICAqIE9idGFpbnMgdGhlIHF1ZXJ5IHN0cmluZyBuZWVkZWQgZm9yIGxpc3RpbmcgYSBnaXZlbiB0eXBlIG9mIG9iamVjdHMKICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICR0eXBlICB0aGUga2luZCBvZiBvYmplY3RzIHlvdSB3YW50IHRvIHJldHJpZXZlCiAgICAgKgogICAgICogQHJldHVybiBzdHJpbmcgIHRoZSBTUUwgcXVlcnkgc3RyaW5nIG9yIG51bGwgaWYgdGhlIGRyaXZlciBkb2Vzbid0CiAgICAgKiAgICAgICAgICAgICAgICAgIHN1cHBvcnQgdGhlIG9iamVjdCB0eXBlIHJlcXVlc3RlZAogICAgICoKICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkCiAgICAgKiBAc2VlIERCX2NvbW1vbjo6Z2V0TGlzdE9mKCkKICAgICAqLwogICAgZnVuY3Rpb24gZ2V0U3BlY2lhbFF1ZXJ5KCR0eXBlKQogICAgewogICAgICAgIHN3aXRjaCAoJHR5cGUpIHsKICAgICAgICAgICAgY2FzZSAndGFibGVzJzoKICAgICAgICAgICAgICAgIHJldHVybiAnU0hPVyBUQUJMRVMnOwogICAgICAgICAgICBjYXNlICd1c2Vycyc6CiAgICAgICAgICAgICAgICByZXR1cm4gJ1NFTEVDVCBESVNUSU5DVCBVc2VyIEZST00gbXlzcWwudXNlcic7CiAgICAgICAgICAgIGNhc2UgJ2RhdGFiYXNlcyc6CiAgICAgICAgICAgICAgICByZXR1cm4gJ1NIT1cgREFUQUJBU0VTJzsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgIH0KCiAgICAvLyB9fX0KCn0KCi8qCiAqIExvY2FsIHZhcmlhYmxlczoKICogdGFiLXdpZHRoOiA0CiAqIGMtYmFzaWMtb2Zmc2V0OiA0CiAqIEVuZDoKICovCgo/Pgo=]]></data>
	</file>
	<file>
	  <filename>/lib/pear/DB/oci8.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qIHZpbTogc2V0IGV4cGFuZHRhYiB0YWJzdG9wPTQgc2hpZnR3aWR0aD00IHNvZnR0YWJzdG9wPTQ6ICovCgovKioKICogVGhlIFBFQVIgREIgZHJpdmVyIGZvciBQSFAncyBvY2k4IGV4dGVuc2lvbgogKiBmb3IgaW50ZXJhY3Rpbmcgd2l0aCBPcmFjbGUgZGF0YWJhc2VzCiAqCiAqIFBIUCB2ZXJzaW9ucyA0IGFuZCA1CiAqCiAqIExJQ0VOU0U6IFRoaXMgc291cmNlIGZpbGUgaXMgc3ViamVjdCB0byB2ZXJzaW9uIDMuMCBvZiB0aGUgUEhQIGxpY2Vuc2UKICogdGhhdCBpcyBhdmFpbGFibGUgdGhyb3VnaCB0aGUgd29ybGQtd2lkZS13ZWIgYXQgdGhlIGZvbGxvd2luZyBVUkk6CiAqIGh0dHA6Ly93d3cucGhwLm5ldC9saWNlbnNlLzNfMC50eHQuICBJZiB5b3UgZGlkIG5vdCByZWNlaXZlIGEgY29weSBvZgogKiB0aGUgUEhQIExpY2Vuc2UgYW5kIGFyZSB1bmFibGUgdG8gb2J0YWluIGl0IHRocm91Z2ggdGhlIHdlYiwgcGxlYXNlCiAqIHNlbmQgYSBub3RlIHRvIGxpY2Vuc2VAcGhwLm5ldCBzbyB3ZSBjYW4gbWFpbCB5b3UgYSBjb3B5IGltbWVkaWF0ZWx5LgogKgogKiBAY2F0ZWdvcnkgICBEYXRhYmFzZQogKiBAcGFja2FnZSAgICBEQgogKiBAYXV0aG9yICAgICBKYW1lcyBMLiBQaW5lIDxqbHBAdmFsaW51eC5jb20+CiAqIEBhdXRob3IgICAgIERhbmllbCBDb252aXNzb3IgPGRhbmllbGNAcGhwLm5ldD4KICogQGNvcHlyaWdodCAgMTk5Ny0yMDA1IFRoZSBQSFAgR3JvdXAKICogQGxpY2Vuc2UgICAgaHR0cDovL3d3dy5waHAubmV0L2xpY2Vuc2UvM18wLnR4dCAgUEhQIExpY2Vuc2UgMy4wCiAqIEB2ZXJzaW9uICAgIENWUzogJElkOiBvY2k4LnBocCx2IDEuMTEyIDIwMDcvMDYvMjkgMTM6MDY6MTYgYWhhcnZleSBFeHAgJAogKiBAbGluayAgICAgICBodHRwOi8vcGVhci5waHAubmV0L3BhY2thZ2UvREIKICovCgovKioKICogT2J0YWluIHRoZSBEQl9jb21tb24gY2xhc3Mgc28gaXQgY2FuIGJlIGV4dGVuZGVkIGZyb20KICovCnJlcXVpcmVfb25jZSAnREIvY29tbW9uLnBocCc7CgovKioKICogVGhlIG1ldGhvZHMgUEVBUiBEQiB1c2VzIHRvIGludGVyYWN0IHdpdGggUEhQJ3Mgb2NpOCBleHRlbnNpb24KICogZm9yIGludGVyYWN0aW5nIHdpdGggT3JhY2xlIGRhdGFiYXNlcwogKgogKiBEZWZpbml0ZWx5IHdvcmtzIHdpdGggdmVyc2lvbnMgOCBhbmQgOSBvZiBPcmFjbGUuCiAqCiAqIFRoZXNlIG1ldGhvZHMgb3ZlcmxvYWQgdGhlIG9uZXMgZGVjbGFyZWQgaW4gREJfY29tbW9uLgogKgogKiBCZSBhd2FyZS4uLiAgT0NJRXJyb3IoKSBvbmx5IGFwcGVhcnMgdG8gcmV0dXJuIGFueXRoaW5nIHdoZW4gZ2l2ZW4gYQogKiBzdGF0ZW1lbnQsIHNvIGZ1bmN0aW9ucyByZXR1cm4gdGhlIGdlbmVyaWMgREJfRVJST1IgaW5zdGVhZCBvZiBtb3JlCiAqIHVzZWZ1bCBlcnJvcnMgdGhhdCBoYXZlIHRvIGRvIHdpdGggZmVlZGJhY2sgZnJvbSB0aGUgZGF0YWJhc2UuCiAqCiAqIEBjYXRlZ29yeSAgIERhdGFiYXNlCiAqIEBwYWNrYWdlICAgIERCCiAqIEBhdXRob3IgICAgIEphbWVzIEwuIFBpbmUgPGpscEB2YWxpbnV4LmNvbT4KICogQGF1dGhvciAgICAgRGFuaWVsIENvbnZpc3NvciA8ZGFuaWVsY0BwaHAubmV0PgogKiBAY29weXJpZ2h0ICAxOTk3LTIwMDUgVGhlIFBIUCBHcm91cAogKiBAbGljZW5zZSAgICBodHRwOi8vd3d3LnBocC5uZXQvbGljZW5zZS8zXzAudHh0ICBQSFAgTGljZW5zZSAzLjAKICogQHZlcnNpb24gICAgUmVsZWFzZTogMS43LjEyCiAqIEBsaW5rICAgICAgIGh0dHA6Ly9wZWFyLnBocC5uZXQvcGFja2FnZS9EQgogKi8KY2xhc3MgREJfb2NpOCBleHRlbmRzIERCX2NvbW1vbgp7CiAgICAvLyB7e3sgcHJvcGVydGllcwoKICAgIC8qKgogICAgICogVGhlIERCIGRyaXZlciB0eXBlIChteXNxbCwgb2NpOCwgb2RiYywgZXRjLikKICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHZhciAkcGhwdHlwZSA9ICdvY2k4JzsKCiAgICAvKioKICAgICAqIFRoZSBkYXRhYmFzZSBzeW50YXggdmFyaWFudCB0byBiZSB1c2VkIChkYjIsIGFjY2VzcywgZXRjLiksIGlmIGFueQogICAgICogQHZhciBzdHJpbmcKICAgICAqLwogICAgdmFyICRkYnN5bnRheCA9ICdvY2k4JzsKCiAgICAvKioKICAgICAqIFRoZSBjYXBhYmlsaXRpZXMgb2YgdGhpcyBEQiBpbXBsZW1lbnRhdGlvbgogICAgICoKICAgICAqIFRoZSAnbmV3X2xpbmsnIGVsZW1lbnQgY29udGFpbnMgdGhlIFBIUCB2ZXJzaW9uIHRoYXQgZmlyc3QgcHJvdmlkZWQKICAgICAqIG5ld19saW5rIHN1cHBvcnQgZm9yIHRoaXMgREJNUy4gIENvbnRhaW5zIGZhbHNlIGlmIGl0J3MgdW5zdXBwb3J0ZWQuCiAgICAgKgogICAgICogTWVhbmluZyBvZiB0aGUgJ2xpbWl0JyBlbGVtZW50OgogICAgICogICArICdlbXVsYXRlJyA9IGVtdWxhdGUgd2l0aCBmZXRjaCByb3cgYnkgbnVtYmVyCiAgICAgKiAgICsgJ2FsdGVyJyAgID0gYWx0ZXIgdGhlIHF1ZXJ5CiAgICAgKiAgICsgZmFsc2UgICAgID0gc2tpcCByb3dzCiAgICAgKgogICAgICogQHZhciBhcnJheQogICAgICovCiAgICB2YXIgJGZlYXR1cmVzID0gYXJyYXkoCiAgICAgICAgJ2xpbWl0JyAgICAgICAgID0+ICdhbHRlcicsCiAgICAgICAgJ25ld19saW5rJyAgICAgID0+ICc1LjAuMCcsCiAgICAgICAgJ251bXJvd3MnICAgICAgID0+ICdzdWJxdWVyeScsCiAgICAgICAgJ3Bjb25uZWN0JyAgICAgID0+IHRydWUsCiAgICAgICAgJ3ByZXBhcmUnICAgICAgID0+IHRydWUsCiAgICAgICAgJ3NzbCcgICAgICAgICAgID0+IGZhbHNlLAogICAgICAgICd0cmFuc2FjdGlvbnMnICA9PiB0cnVlLAogICAgKTsKCiAgICAvKioKICAgICAqIEEgbWFwcGluZyBvZiBuYXRpdmUgZXJyb3IgY29kZXMgdG8gREIgZXJyb3IgY29kZXMKICAgICAqIEB2YXIgYXJyYXkKICAgICAqLwogICAgdmFyICRlcnJvcmNvZGVfbWFwID0gYXJyYXkoCiAgICAgICAgMSAgICAgPT4gREJfRVJST1JfQ09OU1RSQUlOVCwKICAgICAgICA5MDAgICA9PiBEQl9FUlJPUl9TWU5UQVgsCiAgICAgICAgOTA0ICAgPT4gREJfRVJST1JfTk9TVUNIRklFTEQsCiAgICAgICAgOTEzICAgPT4gREJfRVJST1JfVkFMVUVfQ09VTlRfT05fUk9XLAogICAgICAgIDkyMSAgID0+IERCX0VSUk9SX1NZTlRBWCwKICAgICAgICA5MjMgICA9PiBEQl9FUlJPUl9TWU5UQVgsCiAgICAgICAgOTQyICAgPT4gREJfRVJST1JfTk9TVUNIVEFCTEUsCiAgICAgICAgOTU1ICAgPT4gREJfRVJST1JfQUxSRUFEWV9FWElTVFMsCiAgICAgICAgMTQwMCAgPT4gREJfRVJST1JfQ09OU1RSQUlOVF9OT1RfTlVMTCwKICAgICAgICAxNDAxICA9PiBEQl9FUlJPUl9JTlZBTElELAogICAgICAgIDE0MDcgID0+IERCX0VSUk9SX0NPTlNUUkFJTlRfTk9UX05VTEwsCiAgICAgICAgMTQxOCAgPT4gREJfRVJST1JfTk9UX0ZPVU5ELAogICAgICAgIDE0NzYgID0+IERCX0VSUk9SX0RJVlpFUk8sCiAgICAgICAgMTcyMiAgPT4gREJfRVJST1JfSU5WQUxJRF9OVU1CRVIsCiAgICAgICAgMjI4OSAgPT4gREJfRVJST1JfTk9TVUNIVEFCTEUsCiAgICAgICAgMjI5MSAgPT4gREJfRVJST1JfQ09OU1RSQUlOVCwKICAgICAgICAyMjkyICA9PiBEQl9FUlJPUl9DT05TVFJBSU5ULAogICAgICAgIDI0NDkgID0+IERCX0VSUk9SX0NPTlNUUkFJTlQsCiAgICAgICAgMTI4OTkgPT4gREJfRVJST1JfSU5WQUxJRCwKICAgICk7CgogICAgLyoqCiAgICAgKiBUaGUgcmF3IGRhdGFiYXNlIGNvbm5lY3Rpb24gY3JlYXRlZCBieSBQSFAKICAgICAqIEB2YXIgcmVzb3VyY2UKICAgICAqLwogICAgdmFyICRjb25uZWN0aW9uOwoKICAgIC8qKgogICAgICogVGhlIERTTiBpbmZvcm1hdGlvbiBmb3IgY29ubmVjdGluZyB0byBhIGRhdGFiYXNlCiAgICAgKiBAdmFyIGFycmF5CiAgICAgKi8KICAgIHZhciAkZHNuID0gYXJyYXkoKTsKCgogICAgLyoqCiAgICAgKiBTaG91bGQgZGF0YSBtYW5pcHVsYXRpb24gcXVlcmllcyBiZSBjb21taXR0ZWQgYXV0b21hdGljYWxseT8KICAgICAqIEB2YXIgYm9vbAogICAgICogQGFjY2VzcyBwcml2YXRlCiAgICAgKi8KICAgIHZhciAkYXV0b2NvbW1pdCA9IHRydWU7CgogICAgLyoqCiAgICAgKiBTdG9yZXMgdGhlICRkYXRhIHBhc3NlZCB0byBleGVjdXRlKCkgaW4gdGhlIG9jaTggZHJpdmVyCiAgICAgKgogICAgICogR2V0cyByZXNldCB0byBhcnJheSgpIHdoZW4gc2ltcGxlUXVlcnkoKSBpcyBydW4uCiAgICAgKgogICAgICogTmVlZGVkIGluIGNhc2UgdXNlciB3YW50cyB0byBjYWxsIG51bVJvd3MoKSBhZnRlciBwcmVwYXJlL2V4ZWN1dGUKICAgICAqIHdhcyB1c2VkLgogICAgICoKICAgICAqIEB2YXIgYXJyYXkKICAgICAqIEBhY2Nlc3MgcHJpdmF0ZQogICAgICovCiAgICB2YXIgJF9kYXRhID0gYXJyYXkoKTsKCiAgICAvKioKICAgICAqIFRoZSByZXN1bHQgb3Igc3RhdGVtZW50IGhhbmRsZSBmcm9tIHRoZSBtb3N0IHJlY2VudGx5IGV4ZWN1dGVkIHF1ZXJ5CiAgICAgKiBAdmFyIHJlc291cmNlCiAgICAgKi8KICAgIHZhciAkbGFzdF9zdG10OwoKICAgIC8qKgogICAgICogSXMgdGhlIGdpdmVuIHByZXBhcmVkIHN0YXRlbWVudCBhIGRhdGEgbWFuaXB1bGF0aW9uIHF1ZXJ5PwogICAgICogQHZhciBhcnJheQogICAgICogQGFjY2VzcyBwcml2YXRlCiAgICAgKi8KICAgIHZhciAkbWFuaXBfcXVlcnkgPSBhcnJheSgpOwoKICAgIC8qKgogICAgICogU3RvcmUgb2YgcHJlcGFyZWQgU1FMIHF1ZXJpZXMuCiAgICAgKiBAdmFyIGFycmF5CiAgICAgKiBAYWNjZXNzIHByaXZhdGUKICAgICAqLwogICAgdmFyICRfcHJlcGFyZWRfcXVlcmllcyA9IGFycmF5KCk7CgoKICAgIC8vIH19fQogICAgLy8ge3t7IGNvbnN0cnVjdG9yCgogICAgLyoqCiAgICAgKiBUaGlzIGNvbnN0cnVjdG9yIGNhbGxzIDxrYmQ+JHRoaXMtPkRCX2NvbW1vbigpPC9rYmQ+CiAgICAgKgogICAgICogQHJldHVybiB2b2lkCiAgICAgKi8KICAgIGZ1bmN0aW9uIERCX29jaTgoKQogICAgewogICAgICAgICR0aGlzLT5EQl9jb21tb24oKTsKICAgIH0KCiAgICAvLyB9fX0KICAgIC8vIHt7eyBjb25uZWN0KCkKCiAgICAvKioKICAgICAqIENvbm5lY3QgdG8gdGhlIGRhdGFiYXNlIHNlcnZlciwgbG9nIGluIGFuZCBvcGVuIHRoZSBkYXRhYmFzZQogICAgICoKICAgICAqIERvbid0IGNhbGwgdGhpcyBtZXRob2QgZGlyZWN0bHkuICBVc2UgREI6OmNvbm5lY3QoKSBpbnN0ZWFkLgogICAgICoKICAgICAqIElmIFBIUCBpcyBhdCB2ZXJzaW9uIDUuMC4wIG9yIGdyZWF0ZXI6CiAgICAgKiAgICsgR2VuZXJhbGx5LCBvY2lfY29ubmVjdCgpIG9yIG9jaV9wY29ubmVjdCgpIGFyZSB1c2VkLgogICAgICogICArIEJ1dCBpZiB0aGUgbmV3X2xpbmsgRFNOIG9wdGlvbiBpcyBzZXQgdG8gdHJ1ZSwgb2NpX25ld19jb25uZWN0KCkKICAgICAqICAgICBpcyB1c2VkLgogICAgICoKICAgICAqIFdoZW4gdXNpbmcgUEhQIHZlcnNpb24gNC54LCBPQ0lMb2dvbigpIG9yIE9DSVBMb2dvbigpIGFyZSB1c2VkLgogICAgICoKICAgICAqIFBFQVIgREIncyBvY2k4IGRyaXZlciBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIGV4dHJhIERTTiBvcHRpb25zOgogICAgICogICArIGNoYXJzZXQgICAgICAgVGhlIGNoYXJhY3RlciBzZXQgdG8gYmUgdXNlZCBvbiB0aGUgY29ubmVjdGlvbi4KICAgICAqICAgICAgICAgICAgICAgICAgICBPbmx5IHVzZWQgaWYgUEhQIGlzIGF0IHZlcnNpb24gNS4wLjAgb3IgZ3JlYXRlcgogICAgICogICAgICAgICAgICAgICAgICAgIGFuZCB0aGUgT3JhY2xlIHNlcnZlciBpcyBhdCA5LjIgb3IgZ3JlYXRlci4KICAgICAqICAgICAgICAgICAgICAgICAgICBBdmFpbGFibGUgc2luY2UgUEVBUiBEQiAxLjcuMC4KICAgICAqICAgKyBuZXdfbGluayAgICAgIElmIHNldCB0byB0cnVlLCBjYXVzZXMgc3Vic2VxdWVudCBjYWxscyB0bwogICAgICogICAgICAgICAgICAgICAgICAgIGNvbm5lY3QoKSB0byByZXR1cm4gYSBuZXcgY29ubmVjdGlvbiBsaW5rCiAgICAgKiAgICAgICAgICAgICAgICAgICAgaW5zdGVhZCBvZiB0aGUgZXhpc3Rpbmcgb25lLiAgV0FSTklORzogdGhpcyBpcwogICAgICogICAgICAgICAgICAgICAgICAgIG5vdCBwb3J0YWJsZSB0byBvdGhlciBEQk1TJ3MuCiAgICAgKiAgICAgICAgICAgICAgICAgICAgQXZhaWxhYmxlIHNpbmNlIFBFQVIgREIgMS43LjAuCiAgICAgKgogICAgICogQHBhcmFtIGFycmF5ICRkc24gICAgICAgICB0aGUgZGF0YSBzb3VyY2UgbmFtZQogICAgICogQHBhcmFtIGJvb2wgICRwZXJzaXN0ZW50ICBzaG91bGQgdGhlIGNvbm5lY3Rpb24gYmUgcGVyc2lzdGVudD8KICAgICAqCiAgICAgKiBAcmV0dXJuIGludCAgREJfT0sgb24gc3VjY2Vzcy4gQSBEQl9FcnJvciBvYmplY3Qgb24gZmFpbHVyZS4KICAgICAqLwogICAgZnVuY3Rpb24gY29ubmVjdCgkZHNuLCAkcGVyc2lzdGVudCA9IGZhbHNlKQogICAgewogICAgICAgIGlmICghUEVBUjo6bG9hZEV4dGVuc2lvbignb2NpOCcpKSB7CiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+cmFpc2VFcnJvcihEQl9FUlJPUl9FWFRFTlNJT05fTk9UX0ZPVU5EKTsKICAgICAgICB9CgogICAgICAgICR0aGlzLT5kc24gPSAkZHNuOwogICAgICAgIGlmICgkZHNuWydkYnN5bnRheCddKSB7CiAgICAgICAgICAgICR0aGlzLT5kYnN5bnRheCA9ICRkc25bJ2Ric3ludGF4J107CiAgICAgICAgfQoKICAgICAgICAvLyBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoIERCIDwgMS43LjAKICAgICAgICBpZiAoZW1wdHkoJGRzblsnZGF0YWJhc2UnXSkgJiYgIWVtcHR5KCRkc25bJ2hvc3RzcGVjJ10pKSB7CiAgICAgICAgICAgICRkYiA9ICRkc25bJ2hvc3RzcGVjJ107CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJGRiID0gJGRzblsnZGF0YWJhc2UnXTsKICAgICAgICB9CgogICAgICAgIGlmIChmdW5jdGlvbl9leGlzdHMoJ29jaV9jb25uZWN0JykpIHsKICAgICAgICAgICAgaWYgKGlzc2V0KCRkc25bJ25ld19saW5rJ10pCiAgICAgICAgICAgICAgICAmJiAoJGRzblsnbmV3X2xpbmsnXSA9PSAndHJ1ZScgfHwgJGRzblsnbmV3X2xpbmsnXSA9PT0gdHJ1ZSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRjb25uZWN0X2Z1bmN0aW9uID0gJ29jaV9uZXdfY29ubmVjdCc7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkY29ubmVjdF9mdW5jdGlvbiA9ICRwZXJzaXN0ZW50ID8gJ29jaV9wY29ubmVjdCcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAnb2NpX2Nvbm5lY3QnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChpc3NldCgkdGhpcy0+ZHNuWydwb3J0J10pICYmICR0aGlzLT5kc25bJ3BvcnQnXSkgewogICAgICAgICAgICAgICAgJGRiID0gJy8vJy4kZGIuJzonLiR0aGlzLT5kc25bJ3BvcnQnXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJGNoYXIgPSBlbXB0eSgkZHNuWydjaGFyc2V0J10pID8gbnVsbCA6ICRkc25bJ2NoYXJzZXQnXTsKICAgICAgICAgICAgJHRoaXMtPmNvbm5lY3Rpb24gPSBAJGNvbm5lY3RfZnVuY3Rpb24oJGRzblsndXNlcm5hbWUnXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGRzblsncGFzc3dvcmQnXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGRiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkY2hhcik7CiAgICAgICAgICAgICRlcnJvciA9IE9DSUVycm9yKCk7CiAgICAgICAgICAgIGlmICghZW1wdHkoJGVycm9yKSAmJiAkZXJyb3JbJ2NvZGUnXSA9PSAxMjU0MSkgewogICAgICAgICAgICAgICAgLy8gQ291bGRuJ3QgZmluZCBUTlMgbGlzdGVuZXIuICBUcnkgZGlyZWN0IGNvbm5lY3Rpb24uCiAgICAgICAgICAgICAgICAkdGhpcy0+Y29ubmVjdGlvbiA9IEAkY29ubmVjdF9mdW5jdGlvbigkZHNuWyd1c2VybmFtZSddLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGRzblsncGFzc3dvcmQnXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkY2hhcik7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkY29ubmVjdF9mdW5jdGlvbiA9ICRwZXJzaXN0ZW50ID8gJ09DSVBMb2dvbicgOiAnT0NJTG9nb24nOwogICAgICAgICAgICBpZiAoJGRiKSB7CiAgICAgICAgICAgICAgICAkdGhpcy0+Y29ubmVjdGlvbiA9IEAkY29ubmVjdF9mdW5jdGlvbigkZHNuWyd1c2VybmFtZSddLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGRzblsncGFzc3dvcmQnXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRkYik7CiAgICAgICAgICAgIH0gZWxzZWlmICgkZHNuWyd1c2VybmFtZSddIHx8ICRkc25bJ3Bhc3N3b3JkJ10pIHsKICAgICAgICAgICAgICAgICR0aGlzLT5jb25uZWN0aW9uID0gQCRjb25uZWN0X2Z1bmN0aW9uKCRkc25bJ3VzZXJuYW1lJ10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZHNuWydwYXNzd29yZCddKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCEkdGhpcy0+Y29ubmVjdGlvbikgewogICAgICAgICAgICAkZXJyb3IgPSBPQ0lFcnJvcigpOwogICAgICAgICAgICAkZXJyb3IgPSAoaXNfYXJyYXkoJGVycm9yKSkgPyAkZXJyb3JbJ21lc3NhZ2UnXSA6IG51bGw7CiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+cmFpc2VFcnJvcihEQl9FUlJPUl9DT05ORUNUX0ZBSUxFRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIG51bGwsIG51bGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZXJyb3IpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gREJfT0s7CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgZGlzY29ubmVjdCgpCgogICAgLyoqCiAgICAgKiBEaXNjb25uZWN0cyBmcm9tIHRoZSBkYXRhYmFzZSBzZXJ2ZXIKICAgICAqCiAgICAgKiBAcmV0dXJuIGJvb2wgIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZQogICAgICovCiAgICBmdW5jdGlvbiBkaXNjb25uZWN0KCkKICAgIHsKICAgICAgICBpZiAoZnVuY3Rpb25fZXhpc3RzKCdvY2lfY2xvc2UnKSkgewogICAgICAgICAgICAkcmV0ID0gQG9jaV9jbG9zZSgkdGhpcy0+Y29ubmVjdGlvbik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJHJldCA9IEBPQ0lMb2dPZmYoJHRoaXMtPmNvbm5lY3Rpb24pOwogICAgICAgIH0KICAgICAgICAkdGhpcy0+Y29ubmVjdGlvbiA9IG51bGw7CiAgICAgICAgcmV0dXJuICRyZXQ7CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgc2ltcGxlUXVlcnkoKQoKICAgIC8qKgogICAgICogU2VuZHMgYSBxdWVyeSB0byB0aGUgZGF0YWJhc2Ugc2VydmVyCiAgICAgKgogICAgICogVG8gZGV0ZXJtaW5lIGhvdyBtYW55IHJvd3Mgb2YgYSByZXN1bHQgc2V0IGdldCBidWZmZXJlZCB1c2luZwogICAgICogb2Npc2V0cHJlZmV0Y2goKSwgc2VlIHRoZSAicmVzdWx0X2J1ZmZlcmluZyIgb3B0aW9uIGluIHNldE9wdGlvbnMoKS4KICAgICAqIFRoaXMgb3B0aW9uIHdhcyBhZGRlZCBpbiBSZWxlYXNlIDEuNy4wLgogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgIHRoZSBTUUwgcXVlcnkgc3RyaW5nCiAgICAgKgogICAgICogQHJldHVybiBtaXhlZCAgKyBhIFBIUCByZXN1bHQgcmVzcm91Y2UgZm9yIHN1Y2Nlc3NmdWwgU0VMRUNUIHF1ZXJpZXMKICAgICAqICAgICAgICAgICAgICAgICsgdGhlIERCX09LIGNvbnN0YW50IGZvciBvdGhlciBzdWNjZXNzZnVsIHF1ZXJpZXMKICAgICAqICAgICAgICAgICAgICAgICsgYSBEQl9FcnJvciBvYmplY3Qgb24gZmFpbHVyZQogICAgICovCiAgICBmdW5jdGlvbiBzaW1wbGVRdWVyeSgkcXVlcnkpCiAgICB7CiAgICAgICAgJHRoaXMtPl9kYXRhID0gYXJyYXkoKTsKICAgICAgICAkdGhpcy0+bGFzdF9wYXJhbWV0ZXJzID0gYXJyYXkoKTsKICAgICAgICAkdGhpcy0+bGFzdF9xdWVyeSA9ICRxdWVyeTsKICAgICAgICAkcXVlcnkgPSAkdGhpcy0+bW9kaWZ5UXVlcnkoJHF1ZXJ5KTsKICAgICAgICAkcmVzdWx0ID0gQE9DSVBhcnNlKCR0aGlzLT5jb25uZWN0aW9uLCAkcXVlcnkpOwogICAgICAgIGlmICghJHJlc3VsdCkgewogICAgICAgICAgICByZXR1cm4gJHRoaXMtPm9jaThSYWlzZUVycm9yKCk7CiAgICAgICAgfQogICAgICAgIGlmICgkdGhpcy0+YXV0b2NvbW1pdCkgewogICAgICAgICAgICAkc3VjY2VzcyA9IEBPQ0lFeGVjdXRlKCRyZXN1bHQsT0NJX0NPTU1JVF9PTl9TVUNDRVNTKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkc3VjY2VzcyA9IEBPQ0lFeGVjdXRlKCRyZXN1bHQsT0NJX0RFRkFVTFQpOwogICAgICAgIH0KICAgICAgICBpZiAoISRzdWNjZXNzKSB7CiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+b2NpOFJhaXNlRXJyb3IoJHJlc3VsdCk7CiAgICAgICAgfQogICAgICAgICR0aGlzLT5sYXN0X3N0bXQgPSAkcmVzdWx0OwogICAgICAgIGlmICgkdGhpcy0+X2NoZWNrTWFuaXAoJHF1ZXJ5KSkgewogICAgICAgICAgICByZXR1cm4gREJfT0s7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgQG9jaXNldHByZWZldGNoKCRyZXN1bHQsICR0aGlzLT5vcHRpb25zWydyZXN1bHRfYnVmZmVyaW5nJ10pOwogICAgICAgICAgICByZXR1cm4gJHJlc3VsdDsKICAgICAgICB9CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgbmV4dFJlc3VsdCgpCgogICAgLyoqCiAgICAgKiBNb3ZlIHRoZSBpbnRlcm5hbCBvcmFjbGUgcmVzdWx0IHBvaW50ZXIgdG8gdGhlIG5leHQgYXZhaWxhYmxlIHJlc3VsdAogICAgICoKICAgICAqIEBwYXJhbSBhIHZhbGlkIG9jaTggcmVzdWx0IHJlc291cmNlCiAgICAgKgogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqCiAgICAgKiBAcmV0dXJuIHRydWUgaWYgYSByZXN1bHQgaXMgYXZhaWxhYmxlIG90aGVyd2lzZSByZXR1cm4gZmFsc2UKICAgICAqLwogICAgZnVuY3Rpb24gbmV4dFJlc3VsdCgkcmVzdWx0KQogICAgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICAvLyB9fX0KICAgIC8vIHt7eyBmZXRjaEludG8oKQoKICAgIC8qKgogICAgICogUGxhY2VzIGEgcm93IGZyb20gdGhlIHJlc3VsdCBzZXQgaW50byB0aGUgZ2l2ZW4gYXJyYXkKICAgICAqCiAgICAgKiBGb3JtYXRpbmcgb2YgdGhlIGFycmF5IGFuZCB0aGUgZGF0YSB0aGVyZWluIGFyZSBjb25maWd1cmFibGUuCiAgICAgKiBTZWUgREJfcmVzdWx0OjpmZXRjaEludG8oKSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KICAgICAqCiAgICAgKiBUaGlzIG1ldGhvZCBpcyBub3QgbWVhbnQgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LiAgVXNlCiAgICAgKiBEQl9yZXN1bHQ6OmZldGNoSW50bygpIGluc3RlYWQuICBJdCBjYW4ndCBiZSBkZWNsYXJlZCAicHJvdGVjdGVkIgogICAgICogYmVjYXVzZSBEQl9yZXN1bHQgaXMgYSBzZXBhcmF0ZSBvYmplY3QuCiAgICAgKgogICAgICogQHBhcmFtIHJlc291cmNlICRyZXN1bHQgICAgdGhlIHF1ZXJ5IHJlc3VsdCByZXNvdXJjZQogICAgICogQHBhcmFtIGFycmF5ICAgICRhcnIgICAgICAgdGhlIHJlZmVyZW5jZWQgYXJyYXkgdG8gcHV0IHRoZSBkYXRhIGluCiAgICAgKiBAcGFyYW0gaW50ICAgICAgJGZldGNobW9kZSBob3cgdGhlIHJlc3VsdGluZyBhcnJheSBzaG91bGQgYmUgaW5kZXhlZAogICAgICogQHBhcmFtIGludCAgICAgICRyb3dudW0gICAgdGhlIHJvdyBudW1iZXIgdG8gZmV0Y2ggKDAgPSBmaXJzdCByb3cpCiAgICAgKgogICAgICogQHJldHVybiBtaXhlZCAgREJfT0sgb24gc3VjY2VzcywgTlVMTCB3aGVuIHRoZSBlbmQgb2YgYSByZXN1bHQgc2V0IGlzCiAgICAgKiAgICAgICAgICAgICAgICAgcmVhY2hlZCBvciBvbiBmYWlsdXJlCiAgICAgKgogICAgICogQHNlZSBEQl9yZXN1bHQ6OmZldGNoSW50bygpCiAgICAgKi8KICAgIGZ1bmN0aW9uIGZldGNoSW50bygkcmVzdWx0LCAmJGFyciwgJGZldGNobW9kZSwgJHJvd251bSA9IG51bGwpCiAgICB7CiAgICAgICAgaWYgKCRyb3dudW0gIT09IG51bGwpIHsKICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5yYWlzZUVycm9yKERCX0VSUk9SX05PVF9DQVBBQkxFKTsKICAgICAgICB9CiAgICAgICAgaWYgKCRmZXRjaG1vZGUgJiBEQl9GRVRDSE1PREVfQVNTT0MpIHsKICAgICAgICAgICAgJG1vcmVkYXRhID0gQE9DSUZldGNoSW50bygkcmVzdWx0LCRhcnIsT0NJX0FTU09DK09DSV9SRVRVUk5fTlVMTFMrT0NJX1JFVFVSTl9MT0JTKTsKICAgICAgICAgICAgaWYgKCR0aGlzLT5vcHRpb25zWydwb3J0YWJpbGl0eSddICYgREJfUE9SVEFCSUxJVFlfTE9XRVJDQVNFICYmCiAgICAgICAgICAgICAgICAkbW9yZWRhdGEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRhcnIgPSBhcnJheV9jaGFuZ2Vfa2V5X2Nhc2UoJGFyciwgQ0FTRV9MT1dFUik7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkbW9yZWRhdGEgPSBPQ0lGZXRjaEludG8oJHJlc3VsdCwkYXJyLE9DSV9SRVRVUk5fTlVMTFMrT0NJX1JFVFVSTl9MT0JTKTsKICAgICAgICB9CiAgICAgICAgaWYgKCEkbW9yZWRhdGEpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIGlmICgkdGhpcy0+b3B0aW9uc1sncG9ydGFiaWxpdHknXSAmIERCX1BPUlRBQklMSVRZX1JUUklNKSB7CiAgICAgICAgICAgICR0aGlzLT5fcnRyaW1BcnJheVZhbHVlcygkYXJyKTsKICAgICAgICB9CiAgICAgICAgaWYgKCR0aGlzLT5vcHRpb25zWydwb3J0YWJpbGl0eSddICYgREJfUE9SVEFCSUxJVFlfTlVMTF9UT19FTVBUWSkgewogICAgICAgICAgICAkdGhpcy0+X2NvbnZlcnROdWxsQXJyYXlWYWx1ZXNUb0VtcHR5KCRhcnIpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gREJfT0s7CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgZnJlZVJlc3VsdCgpCgogICAgLyoqCiAgICAgKiBEZWxldGVzIHRoZSByZXN1bHQgc2V0IGFuZCBmcmVlcyB0aGUgbWVtb3J5IG9jY3VwaWVkIGJ5IHRoZSByZXN1bHQgc2V0CiAgICAgKgogICAgICogVGhpcyBtZXRob2QgaXMgbm90IG1lYW50IHRvIGJlIGNhbGxlZCBkaXJlY3RseS4gIFVzZQogICAgICogREJfcmVzdWx0OjpmcmVlKCkgaW5zdGVhZC4gIEl0IGNhbid0IGJlIGRlY2xhcmVkICJwcm90ZWN0ZWQiCiAgICAgKiBiZWNhdXNlIERCX3Jlc3VsdCBpcyBhIHNlcGFyYXRlIG9iamVjdC4KICAgICAqCiAgICAgKiBAcGFyYW0gcmVzb3VyY2UgJHJlc3VsdCAgUEhQJ3MgcXVlcnkgcmVzdWx0IHJlc291cmNlCiAgICAgKgogICAgICogQHJldHVybiBib29sICBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIGlmICRyZXN1bHQgaXMgaW52YWxpZAogICAgICoKICAgICAqIEBzZWUgREJfcmVzdWx0OjpmcmVlKCkKICAgICAqLwogICAgZnVuY3Rpb24gZnJlZVJlc3VsdCgkcmVzdWx0KQogICAgewogICAgICAgIHJldHVybiBpc19yZXNvdXJjZSgkcmVzdWx0KSA/IE9DSUZyZWVTdGF0ZW1lbnQoJHJlc3VsdCkgOiBmYWxzZTsKICAgIH0KCiAgICAvKioKICAgICAqIEZyZWVzIHRoZSBpbnRlcm5hbCByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIGEgcHJlcGFyZWQgcXVlcnkKICAgICAqCiAgICAgKiBAcGFyYW0gcmVzb3VyY2UgJHN0bXQgICAgICAgICAgIHRoZSBwcmVwYXJlZCBzdGF0ZW1lbnQncyByZXNvdXJjZQogICAgICogQHBhcmFtIGJvb2wgICAgICRmcmVlX3Jlc291cmNlICBzaG91bGQgdGhlIFBIUCByZXNvdXJjZSBiZSBmcmVlZCB0b28/CiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2UgZmFsc2UgaWYgeW91IG5lZWQgdG8gZ2V0IGRhdGEKICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gdGhlIHJlc3VsdCBzZXQgbGF0ZXIuCiAgICAgKgogICAgICogQHJldHVybiBib29sICBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIGlmICRyZXN1bHQgaXMgaW52YWxpZAogICAgICoKICAgICAqIEBzZWUgREJfb2NpODo6cHJlcGFyZSgpCiAgICAgKi8KICAgIGZ1bmN0aW9uIGZyZWVQcmVwYXJlZCgkc3RtdCwgJGZyZWVfcmVzb3VyY2UgPSB0cnVlKQogICAgewogICAgICAgIGlmICghaXNfcmVzb3VyY2UoJHN0bXQpKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgaWYgKCRmcmVlX3Jlc291cmNlKSB7CiAgICAgICAgICAgIEBvY2lmcmVlc3RhdGVtZW50KCRzdG10KTsKICAgICAgICB9CiAgICAgICAgaWYgKGlzc2V0KCR0aGlzLT5wcmVwYXJlX3R5cGVzWyhpbnQpJHN0bXRdKSkgewogICAgICAgICAgICB1bnNldCgkdGhpcy0+cHJlcGFyZV90eXBlc1soaW50KSRzdG10XSk7CiAgICAgICAgICAgIHVuc2V0KCR0aGlzLT5tYW5pcF9xdWVyeVsoaW50KSRzdG10XSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICAvLyB9fX0KICAgIC8vIHt7eyBudW1Sb3dzKCkKCiAgICAvKioKICAgICAqIEdldHMgdGhlIG51bWJlciBvZiByb3dzIGluIGEgcmVzdWx0IHNldAogICAgICoKICAgICAqIE9ubHkgd29ya3MgaWYgdGhlIERCX1BPUlRBQklMSVRZX05VTVJPV1MgcG9ydGFiaWxpdHkgb3B0aW9uCiAgICAgKiBpcyB0dXJuZWQgb24uCiAgICAgKgogICAgICogVGhpcyBtZXRob2QgaXMgbm90IG1lYW50IHRvIGJlIGNhbGxlZCBkaXJlY3RseS4gIFVzZQogICAgICogREJfcmVzdWx0OjpudW1Sb3dzKCkgaW5zdGVhZC4gIEl0IGNhbid0IGJlIGRlY2xhcmVkICJwcm90ZWN0ZWQiCiAgICAgKiBiZWNhdXNlIERCX3Jlc3VsdCBpcyBhIHNlcGFyYXRlIG9iamVjdC4KICAgICAqCiAgICAgKiBAcGFyYW0gcmVzb3VyY2UgJHJlc3VsdCAgUEhQJ3MgcXVlcnkgcmVzdWx0IHJlc291cmNlCiAgICAgKgogICAgICogQHJldHVybiBpbnQgIHRoZSBudW1iZXIgb2Ygcm93cy4gIEEgREJfRXJyb3Igb2JqZWN0IG9uIGZhaWx1cmUuCiAgICAgKgogICAgICogQHNlZSBEQl9yZXN1bHQ6Om51bVJvd3MoKSwgREJfY29tbW9uOjpzZXRPcHRpb24oKQogICAgICovCiAgICBmdW5jdGlvbiBudW1Sb3dzKCRyZXN1bHQpCiAgICB7CiAgICAgICAgLy8gZW11bGF0ZSBudW1Sb3dzIGZvciBPcmFjbGUuICB5dWNrLgogICAgICAgIGlmICgkdGhpcy0+b3B0aW9uc1sncG9ydGFiaWxpdHknXSAmIERCX1BPUlRBQklMSVRZX05VTVJPV1MgJiYKICAgICAgICAgICAgJHJlc3VsdCA9PT0gJHRoaXMtPmxhc3Rfc3RtdCkKICAgICAgICB7CiAgICAgICAgICAgICRjb3VudHF1ZXJ5ID0gJ1NFTEVDVCBDT1VOVCgqKSBGUk9NICgnLiR0aGlzLT5sYXN0X3F1ZXJ5LicpJzsKICAgICAgICAgICAgJHNhdmVfcXVlcnkgPSAkdGhpcy0+bGFzdF9xdWVyeTsKICAgICAgICAgICAgJHNhdmVfc3RtdCA9ICR0aGlzLT5sYXN0X3N0bXQ7CgogICAgICAgICAgICAkY291bnQgPSYgJHRoaXMtPnF1ZXJ5KCRjb3VudHF1ZXJ5KTsKCiAgICAgICAgICAgIC8vIFJlc3RvcmUgdGhlIGxhc3QgcXVlcnkgYW5kIHN0YXRlbWVudC4KICAgICAgICAgICAgJHRoaXMtPmxhc3RfcXVlcnkgPSAkc2F2ZV9xdWVyeTsKICAgICAgICAgICAgJHRoaXMtPmxhc3Rfc3RtdCA9ICRzYXZlX3N0bXQ7CiAgICAgICAgICAgIAogICAgICAgICAgICBpZiAoREI6OmlzRXJyb3IoJGNvdW50KSB8fAogICAgICAgICAgICAgICAgREI6OmlzRXJyb3IoJHJvdyA9ICRjb3VudC0+ZmV0Y2hSb3coREJfRkVUQ0hNT0RFX09SREVSRUQpKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5yYWlzZUVycm9yKERCX0VSUk9SX05PVF9DQVBBQkxFKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuICRyb3dbMF07CiAgICAgICAgfQogICAgICAgIHJldHVybiAkdGhpcy0+cmFpc2VFcnJvcihEQl9FUlJPUl9OT1RfQ0FQQUJMRSk7CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgbnVtQ29scygpCgogICAgLyoqCiAgICAgKiBHZXRzIHRoZSBudW1iZXIgb2YgY29sdW1ucyBpbiBhIHJlc3VsdCBzZXQKICAgICAqCiAgICAgKiBUaGlzIG1ldGhvZCBpcyBub3QgbWVhbnQgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LiAgVXNlCiAgICAgKiBEQl9yZXN1bHQ6Om51bUNvbHMoKSBpbnN0ZWFkLiAgSXQgY2FuJ3QgYmUgZGVjbGFyZWQgInByb3RlY3RlZCIKICAgICAqIGJlY2F1c2UgREJfcmVzdWx0IGlzIGEgc2VwYXJhdGUgb2JqZWN0LgogICAgICoKICAgICAqIEBwYXJhbSByZXNvdXJjZSAkcmVzdWx0ICBQSFAncyBxdWVyeSByZXN1bHQgcmVzb3VyY2UKICAgICAqCiAgICAgKiBAcmV0dXJuIGludCAgdGhlIG51bWJlciBvZiBjb2x1bW5zLiAgQSBEQl9FcnJvciBvYmplY3Qgb24gZmFpbHVyZS4KICAgICAqCiAgICAgKiBAc2VlIERCX3Jlc3VsdDo6bnVtQ29scygpCiAgICAgKi8KICAgIGZ1bmN0aW9uIG51bUNvbHMoJHJlc3VsdCkKICAgIHsKICAgICAgICAkY29scyA9IEBPQ0lOdW1Db2xzKCRyZXN1bHQpOwogICAgICAgIGlmICghJGNvbHMpIHsKICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5vY2k4UmFpc2VFcnJvcigkcmVzdWx0KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICRjb2xzOwogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IHByZXBhcmUoKQoKICAgIC8qKgogICAgICogUHJlcGFyZXMgYSBxdWVyeSBmb3IgbXVsdGlwbGUgZXhlY3V0aW9uIHdpdGggZXhlY3V0ZSgpLgogICAgICoKICAgICAqIFdpdGggb2NpOCwgdGhpcyBpcyBlbXVsYXRlZC4KICAgICAqCiAgICAgKiBwcmVwYXJlKCkgcmVxdWlyZXMgYSBnZW5lcmljIHF1ZXJ5IGFzIHN0cmluZyBsaWtlIDxjb2RlPgogICAgICogICAgSU5TRVJUIElOVE8gbnVtYmVycyBWQUxVRVMgKD8sID8sID8pCiAgICAgKiA8L2NvZGU+LiAgVGhlIDxrYmQ+Pzwva2JkPiBjaGFyYWN0ZXJzIGFyZSBwbGFjZWhvbGRlcnMuCiAgICAgKgogICAgICogVGhyZWUgdHlwZXMgb2YgcGxhY2Vob2xkZXJzIGNhbiBiZSB1c2VkOgogICAgICogICArIDxrYmQ+Pzwva2JkPiAgYSBxdW90ZWQgc2NhbGFyIHZhbHVlLCBpLmUuIHN0cmluZ3MsIGludGVnZXJzCiAgICAgKiAgICsgPGtiZD4hPC9rYmQ+ICB2YWx1ZSBpcyBpbnNlcnRlZCAnYXMgaXMnCiAgICAgKiAgICsgPGtiZD4mPC9rYmQ+ICByZXF1aXJlcyBhIGZpbGUgbmFtZS4gIFRoZSBmaWxlJ3MgY29udGVudHMgZ2V0CiAgICAgKiAgICAgICAgICAgICAgICAgICAgIGluc2VydGVkIGludG8gdGhlIHF1ZXJ5IChpLmUuIHNhdmluZyBiaW5hcnkKICAgICAqICAgICAgICAgICAgICAgICAgICAgZGF0YSBpbiBhIGRiKQogICAgICoKICAgICAqIFVzZSBiYWNrc2xhc2hlcyB0byBlc2NhcGUgcGxhY2Vob2xkZXIgY2hhcmFjdGVycyBpZiB5b3UgZG9uJ3Qgd2FudAogICAgICogdGhlbSB0byBiZSBpbnRlcnByZXRlZCBhcyBwbGFjZWhvbGRlcnMuICBFeGFtcGxlOiA8Y29kZT4KICAgICAqICAgICJVUERBVEUgZm9vIFNFVCBjb2w9PyBXSEVSRSBjb2w9J292ZXIgXCYgdW5kZXInIgogICAgICogPC9jb2RlPgogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgJHF1ZXJ5ICB0aGUgcXVlcnkgdG8gYmUgcHJlcGFyZWQKICAgICAqCiAgICAgKiBAcmV0dXJuIG1peGVkICBEQiBzdGF0ZW1lbnQgcmVzb3VyY2Ugb24gc3VjY2Vzcy4gREJfRXJyb3Igb24gZmFpbHVyZS4KICAgICAqCiAgICAgKiBAc2VlIERCX29jaTg6OmV4ZWN1dGUoKQogICAgICovCiAgICBmdW5jdGlvbiBwcmVwYXJlKCRxdWVyeSkKICAgIHsKICAgICAgICAkdG9rZW5zICAgPSBwcmVnX3NwbGl0KCcvKCg/PCFcXFwpWyY/IV0pLycsICRxdWVyeSwgLTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUkVHX1NQTElUX0RFTElNX0NBUFRVUkUpOwogICAgICAgICRiaW5kcyAgICA9IGNvdW50KCR0b2tlbnMpIC0gMTsKICAgICAgICAkdG9rZW4gICAgPSAwOwogICAgICAgICR0eXBlcyAgICA9IGFycmF5KCk7CiAgICAgICAgJG5ld3F1ZXJ5ID0gJyc7CgogICAgICAgIGZvcmVhY2ggKCR0b2tlbnMgYXMgJGtleSA9PiAkdmFsKSB7CiAgICAgICAgICAgIHN3aXRjaCAoJHZhbCkgewogICAgICAgICAgICAgICAgY2FzZSAnPyc6CiAgICAgICAgICAgICAgICAgICAgJHR5cGVzWyR0b2tlbisrXSA9IERCX1BBUkFNX1NDQUxBUjsKICAgICAgICAgICAgICAgICAgICB1bnNldCgkdG9rZW5zWyRrZXldKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJyYnOgogICAgICAgICAgICAgICAgICAgICR0eXBlc1skdG9rZW4rK10gPSBEQl9QQVJBTV9PUEFRVUU7CiAgICAgICAgICAgICAgICAgICAgdW5zZXQoJHRva2Vuc1ska2V5XSk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICchJzoKICAgICAgICAgICAgICAgICAgICAkdHlwZXNbJHRva2VuKytdID0gREJfUEFSQU1fTUlTQzsKICAgICAgICAgICAgICAgICAgICB1bnNldCgkdG9rZW5zWyRrZXldKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgJHRva2Vuc1ska2V5XSA9IHByZWdfcmVwbGFjZSgnL1xcXChbJj8hXSkvJywgIlxcMSIsICR2YWwpOwogICAgICAgICAgICAgICAgICAgIGlmICgka2V5ICE9ICRiaW5kcykgewogICAgICAgICAgICAgICAgICAgICAgICAkbmV3cXVlcnkgLj0gJHRva2Vuc1ska2V5XSAuICc6YmluZCcgLiAkdG9rZW47CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgJG5ld3F1ZXJ5IC49ICR0b2tlbnNbJGtleV07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkdGhpcy0+bGFzdF9xdWVyeSA9ICRxdWVyeTsKICAgICAgICAkbmV3cXVlcnkgPSAkdGhpcy0+bW9kaWZ5UXVlcnkoJG5ld3F1ZXJ5KTsKICAgICAgICBpZiAoISRzdG10ID0gQE9DSVBhcnNlKCR0aGlzLT5jb25uZWN0aW9uLCAkbmV3cXVlcnkpKSB7CiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+b2NpOFJhaXNlRXJyb3IoKTsKICAgICAgICB9CiAgICAgICAgJHRoaXMtPnByZXBhcmVfdHlwZXNbKGludCkkc3RtdF0gPSAkdHlwZXM7CiAgICAgICAgJHRoaXMtPm1hbmlwX3F1ZXJ5WyhpbnQpJHN0bXRdID0gREI6OmlzTWFuaXAoJHF1ZXJ5KTsKICAgICAgICAkdGhpcy0+X3ByZXBhcmVkX3F1ZXJpZXNbKGludCkkc3RtdF0gPSAkbmV3cXVlcnk7CiAgICAgICAgcmV0dXJuICRzdG10OwogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IGV4ZWN1dGUoKQoKICAgIC8qKgogICAgICogRXhlY3V0ZXMgYSBEQiBzdGF0ZW1lbnQgcHJlcGFyZWQgd2l0aCBwcmVwYXJlKCkuCiAgICAgKgogICAgICogVG8gZGV0ZXJtaW5lIGhvdyBtYW55IHJvd3Mgb2YgYSByZXN1bHQgc2V0IGdldCBidWZmZXJlZCB1c2luZwogICAgICogb2Npc2V0cHJlZmV0Y2goKSwgc2VlIHRoZSAicmVzdWx0X2J1ZmZlcmluZyIgb3B0aW9uIGluIHNldE9wdGlvbnMoKS4KICAgICAqIFRoaXMgb3B0aW9uIHdhcyBhZGRlZCBpbiBSZWxlYXNlIDEuNy4wLgogICAgICoKICAgICAqIEBwYXJhbSByZXNvdXJjZSAgJHN0bXQgIGEgREIgc3RhdGVtZW50IHJlc291cmNlIHJldHVybmVkIGZyb20gcHJlcGFyZSgpCiAgICAgKiBAcGFyYW0gbWl4ZWQgICRkYXRhICBhcnJheSwgc3RyaW5nIG9yIG51bWVyaWMgZGF0YSB0byBiZSB1c2VkIGluCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICBleGVjdXRpb24gb2YgdGhlIHN0YXRlbWVudC4gIFF1YW50aXR5IG9mIGl0ZW1zCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgbXVzdCBtYXRjaCBxdWFudGl0eSBvZiBwbGFjZWhvbGRlcnMgaW4KICAgICAqICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5OiAgbWVhbmluZyAxIGZvciBub24tYXJyYXkgaXRlbXMgb3IgdGhlCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICBxdWFudGl0eSBvZiBlbGVtZW50cyBpbiB0aGUgYXJyYXkuCiAgICAgKgogICAgICogQHJldHVybiBtaXhlZCAgcmV0dXJucyBhbiBvaWM4IHJlc3VsdCByZXNvdXJjZSBmb3Igc3VjY2Vzc2Z1bCBTRUxFQ1QKICAgICAqICAgICAgICAgICAgICAgIHF1ZXJpZXMsIERCX09LIGZvciBvdGhlciBzdWNjZXNzZnVsIHF1ZXJpZXMuCiAgICAgKiAgICAgICAgICAgICAgICBBIERCIGVycm9yIG9iamVjdCBpcyByZXR1cm5lZCBvbiBmYWlsdXJlLgogICAgICoKICAgICAqIEBzZWUgREJfb2NpODo6cHJlcGFyZSgpCiAgICAgKi8KICAgIGZ1bmN0aW9uICZleGVjdXRlKCRzdG10LCAkZGF0YSA9IGFycmF5KCkpCiAgICB7CiAgICAgICAgJGRhdGEgPSAoYXJyYXkpJGRhdGE7CiAgICAgICAgJHRoaXMtPmxhc3RfcGFyYW1ldGVycyA9ICRkYXRhOwogICAgICAgICR0aGlzLT5sYXN0X3F1ZXJ5ID0gJHRoaXMtPl9wcmVwYXJlZF9xdWVyaWVzWyhpbnQpJHN0bXRdOwogICAgICAgICR0aGlzLT5fZGF0YSA9ICRkYXRhOwoKICAgICAgICAkdHlwZXMgPSYgJHRoaXMtPnByZXBhcmVfdHlwZXNbKGludCkkc3RtdF07CiAgICAgICAgaWYgKGNvdW50KCR0eXBlcykgIT0gY291bnQoJGRhdGEpKSB7CiAgICAgICAgICAgICR0bXAgPSYgJHRoaXMtPnJhaXNlRXJyb3IoREJfRVJST1JfTUlTTUFUQ0gpOwogICAgICAgICAgICByZXR1cm4gJHRtcDsKICAgICAgICB9CgogICAgICAgICRpID0gMDsKICAgICAgICBmb3JlYWNoICgkZGF0YSBhcyAka2V5ID0+ICR2YWx1ZSkgewogICAgICAgICAgICBpZiAoJHR5cGVzWyRpXSA9PSBEQl9QQVJBTV9NSVNDKSB7CiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogT3JhY2xlIGRvZXNuJ3Qgc2VlbSB0byBoYXZlIHRoZSBhYmlsaXR5IHRvIHBhc3MgYQogICAgICAgICAgICAgICAgICogcGFyYW1ldGVyIGFsb25nIHVuY2hhbmdlZCwgc28gc3RyaXAgb2ZmIHF1b3RlcyBmcm9tIHN0YXJ0CiAgICAgICAgICAgICAgICAgKiBhbmQgZW5kLCBwbHVzIHR1cm4gdHdvIHNpbmdsZSBxdW90ZXMgdG8gb25lIHNpbmdsZSBxdW90ZSwKICAgICAgICAgICAgICAgICAqIGluIG9yZGVyIHRvIGF2b2lkIHRoZSBxdW90ZXMgZ2V0dGluZyBlc2NhcGVkIGJ5CiAgICAgICAgICAgICAgICAgKiBPcmFjbGUgYW5kIGVuZGluZyB1cCBpbiB0aGUgZGF0YWJhc2UuCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICRkYXRhWyRrZXldID0gcHJlZ19yZXBsYWNlKCIvXicoLiopJyQvIiwgIlxcMSIsICRkYXRhWyRrZXldKTsKICAgICAgICAgICAgICAgICRkYXRhWyRrZXldID0gc3RyX3JlcGxhY2UoIicnIiwgIiciLCAkZGF0YVska2V5XSk7CiAgICAgICAgICAgIH0gZWxzZWlmICgkdHlwZXNbJGldID09IERCX1BBUkFNX09QQVFVRSkgewogICAgICAgICAgICAgICAgJGZwID0gQGZvcGVuKCRkYXRhWyRrZXldLCAncmInKTsKICAgICAgICAgICAgICAgIGlmICghJGZwKSB7CiAgICAgICAgICAgICAgICAgICAgJHRtcCA9JiAkdGhpcy0+cmFpc2VFcnJvcihEQl9FUlJPUl9BQ0NFU1NfVklPTEFUSU9OKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHRtcDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRkYXRhWyRrZXldID0gZnJlYWQoJGZwLCBmaWxlc2l6ZSgkZGF0YVska2V5XSkpOwogICAgICAgICAgICAgICAgZmNsb3NlKCRmcCk7CiAgICAgICAgICAgIH0gZWxzZWlmICgkdHlwZXNbJGldID09IERCX1BBUkFNX1NDQUxBUikgewogICAgICAgICAgICAgICAgLy8gRmxvYXRzIGhhdmUgdG8gYmUgY29udmVydGVkIHRvIGEgbG9jYWxlLW5ldXRyYWwKICAgICAgICAgICAgICAgIC8vIHJlcHJlc2VudGF0aW9uLgogICAgICAgICAgICAgICAgaWYgKGlzX2Zsb2F0KCRkYXRhWyRrZXldKSkgewogICAgICAgICAgICAgICAgICAgICRkYXRhWyRrZXldID0gJHRoaXMtPnF1b3RlRmxvYXQoJGRhdGFbJGtleV0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghQE9DSUJpbmRCeU5hbWUoJHN0bXQsICc6YmluZCcgLiAkaSwgJGRhdGFbJGtleV0sIC0xKSkgewogICAgICAgICAgICAgICAgJHRtcCA9ICR0aGlzLT5vY2k4UmFpc2VFcnJvcigkc3RtdCk7CiAgICAgICAgICAgICAgICByZXR1cm4gJHRtcDsKICAgICAgICAgICAgfQogICAgICAgICAgICAkdGhpcy0+bGFzdF9xdWVyeSA9IHN0cl9yZXBsYWNlKCc6YmluZCcuJGksICR0aGlzLT5xdW90ZVNtYXJ0KCRkYXRhWyRrZXldKSwgJHRoaXMtPmxhc3RfcXVlcnkpOwogICAgICAgICAgICAkaSsrOwogICAgICAgIH0KICAgICAgICBpZiAoJHRoaXMtPmF1dG9jb21taXQpIHsKICAgICAgICAgICAgJHN1Y2Nlc3MgPSBAT0NJRXhlY3V0ZSgkc3RtdCwgT0NJX0NPTU1JVF9PTl9TVUNDRVNTKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkc3VjY2VzcyA9IEBPQ0lFeGVjdXRlKCRzdG10LCBPQ0lfREVGQVVMVCk7CiAgICAgICAgfQogICAgICAgIGlmICghJHN1Y2Nlc3MpIHsKICAgICAgICAgICAgJHRtcCA9ICR0aGlzLT5vY2k4UmFpc2VFcnJvcigkc3RtdCk7CiAgICAgICAgICAgIHJldHVybiAkdG1wOwogICAgICAgIH0KICAgICAgICAkdGhpcy0+bGFzdF9zdG10ID0gJHN0bXQ7CiAgICAgICAgaWYgKCR0aGlzLT5tYW5pcF9xdWVyeVsoaW50KSRzdG10XSB8fCAkdGhpcy0+X25leHRfcXVlcnlfbWFuaXApIHsKICAgICAgICAgICAgJHRoaXMtPl9sYXN0X3F1ZXJ5X21hbmlwID0gdHJ1ZTsKICAgICAgICAgICAgJHRoaXMtPl9uZXh0X3F1ZXJ5X21hbmlwID0gZmFsc2U7CiAgICAgICAgICAgICR0bXAgPSBEQl9PSzsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkdGhpcy0+X2xhc3RfcXVlcnlfbWFuaXAgPSBmYWxzZTsKICAgICAgICAgICAgQG9jaXNldHByZWZldGNoKCRzdG10LCAkdGhpcy0+b3B0aW9uc1sncmVzdWx0X2J1ZmZlcmluZyddKTsKICAgICAgICAgICAgJHRtcCA9JiBuZXcgREJfcmVzdWx0KCR0aGlzLCAkc3RtdCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiAkdG1wOwogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IGF1dG9Db21taXQoKQoKICAgIC8qKgogICAgICogRW5hYmxlcyBvciBkaXNhYmxlcyBhdXRvbWF0aWMgY29tbWl0cwogICAgICoKICAgICAqIEBwYXJhbSBib29sICRvbm9mZiAgdHJ1ZSB0dXJucyBpdCBvbiwgZmFsc2UgdHVybnMgaXQgb2ZmCiAgICAgKgogICAgICogQHJldHVybiBpbnQgIERCX09LIG9uIHN1Y2Nlc3MuICBBIERCX0Vycm9yIG9iamVjdCBpZiB0aGUgZHJpdmVyCiAgICAgKiAgICAgICAgICAgICAgIGRvZXNuJ3Qgc3VwcG9ydCBhdXRvLWNvbW1pdHRpbmcgdHJhbnNhY3Rpb25zLgogICAgICovCiAgICBmdW5jdGlvbiBhdXRvQ29tbWl0KCRvbm9mZiA9IGZhbHNlKQogICAgewogICAgICAgICR0aGlzLT5hdXRvY29tbWl0ID0gKGJvb2wpJG9ub2ZmOzsKICAgICAgICByZXR1cm4gREJfT0s7CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgY29tbWl0KCkKCiAgICAvKioKICAgICAqIENvbW1pdHMgdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24KICAgICAqCiAgICAgKiBAcmV0dXJuIGludCAgREJfT0sgb24gc3VjY2Vzcy4gIEEgREJfRXJyb3Igb2JqZWN0IG9uIGZhaWx1cmUuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGNvbW1pdCgpCiAgICB7CiAgICAgICAgJHJlc3VsdCA9IEBPQ0lDb21taXQoJHRoaXMtPmNvbm5lY3Rpb24pOwogICAgICAgIGlmICghJHJlc3VsdCkgewogICAgICAgICAgICByZXR1cm4gJHRoaXMtPm9jaThSYWlzZUVycm9yKCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBEQl9PSzsKICAgIH0KCiAgICAvLyB9fX0KICAgIC8vIHt7eyByb2xsYmFjaygpCgogICAgLyoqCiAgICAgKiBSZXZlcnRzIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uCiAgICAgKgogICAgICogQHJldHVybiBpbnQgIERCX09LIG9uIHN1Y2Nlc3MuICBBIERCX0Vycm9yIG9iamVjdCBvbiBmYWlsdXJlLgogICAgICovCiAgICBmdW5jdGlvbiByb2xsYmFjaygpCiAgICB7CiAgICAgICAgJHJlc3VsdCA9IEBPQ0lSb2xsYmFjaygkdGhpcy0+Y29ubmVjdGlvbik7CiAgICAgICAgaWYgKCEkcmVzdWx0KSB7CiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+b2NpOFJhaXNlRXJyb3IoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIERCX09LOwogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IGFmZmVjdGVkUm93cygpCgogICAgLyoqCiAgICAgKiBEZXRlcm1pbmVzIHRoZSBudW1iZXIgb2Ygcm93cyBhZmZlY3RlZCBieSBhIGRhdGEgbWFuaXVwbGF0aW9uIHF1ZXJ5CiAgICAgKgogICAgICogMCBpcyByZXR1cm5lZCBmb3IgcXVlcmllcyB0aGF0IGRvbid0IG1hbmlwdWxhdGUgZGF0YS4KICAgICAqCiAgICAgKiBAcmV0dXJuIGludCAgdGhlIG51bWJlciBvZiByb3dzLiAgQSBEQl9FcnJvciBvYmplY3Qgb24gZmFpbHVyZS4KICAgICAqLwogICAgZnVuY3Rpb24gYWZmZWN0ZWRSb3dzKCkKICAgIHsKICAgICAgICBpZiAoJHRoaXMtPmxhc3Rfc3RtdCA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5vY2k4UmFpc2VFcnJvcigpOwogICAgICAgIH0KICAgICAgICAkcmVzdWx0ID0gQE9DSVJvd0NvdW50KCR0aGlzLT5sYXN0X3N0bXQpOwogICAgICAgIGlmICgkcmVzdWx0ID09PSBmYWxzZSkgewogICAgICAgICAgICByZXR1cm4gJHRoaXMtPm9jaThSYWlzZUVycm9yKCR0aGlzLT5sYXN0X3N0bXQpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJHJlc3VsdDsKICAgIH0KCiAgICAvLyB9fX0KICAgIC8vIHt7eyBtb2RpZnlRdWVyeSgpCgogICAgLyoqCiAgICAgKiBDaGFuZ2VzIGEgcXVlcnkgc3RyaW5nIGZvciB2YXJpb3VzIERCTVMgc3BlY2lmaWMgcmVhc29ucwogICAgICoKICAgICAqICJTRUxFQ1QgMisyIiBtdXN0IGJlICJTRUxFQ1QgMisyIEZST00gZHVhbCIgaW4gT3JhY2xlLgogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgJHF1ZXJ5ICB0aGUgcXVlcnkgc3RyaW5nIHRvIG1vZGlmeQogICAgICoKICAgICAqIEByZXR1cm4gc3RyaW5nICB0aGUgbW9kaWZpZWQgcXVlcnkgc3RyaW5nCiAgICAgKgogICAgICogQGFjY2VzcyBwcm90ZWN0ZWQKICAgICAqLwogICAgZnVuY3Rpb24gbW9kaWZ5UXVlcnkoJHF1ZXJ5KQogICAgewogICAgICAgIGlmIChwcmVnX21hdGNoKCcvXlxzKlNFTEVDVC9pJywgJHF1ZXJ5KSAmJgogICAgICAgICAgICAhcHJlZ19tYXRjaCgnL1xzRlJPTVxzL2knLCAkcXVlcnkpKSB7CiAgICAgICAgICAgICRxdWVyeSAuPSAnIEZST00gZHVhbCc7CiAgICAgICAgfQogICAgICAgIHJldHVybiAkcXVlcnk7CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgbW9kaWZ5TGltaXRRdWVyeSgpCgogICAgLyoqCiAgICAgKiBBZGRzIExJTUlUIGNsYXVzZXMgdG8gYSBxdWVyeSBzdHJpbmcgYWNjb3JkaW5nIHRvIGN1cnJlbnQgREJNUyBzdGFuZGFyZHMKICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICRxdWVyeSAgIHRoZSBxdWVyeSB0byBtb2RpZnkKICAgICAqIEBwYXJhbSBpbnQgICAgJGZyb20gICAgdGhlIHJvdyB0byBzdGFydCB0byBmZXRjaGluZyAoMCA9IHRoZSBmaXJzdCByb3cpCiAgICAgKiBAcGFyYW0gaW50ICAgICRjb3VudCAgIHRoZSBudW1iZXJzIG9mIHJvd3MgdG8gZmV0Y2gKICAgICAqIEBwYXJhbSBtaXhlZCAgJHBhcmFtcyAgYXJyYXksIHN0cmluZyBvciBudW1lcmljIGRhdGEgdG8gYmUgdXNlZCBpbgogICAgICogICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0aW9uIG9mIHRoZSBzdGF0ZW1lbnQuICBRdWFudGl0eSBvZiBpdGVtcwogICAgICogICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkIG11c3QgbWF0Y2ggcXVhbnRpdHkgb2YgcGxhY2Vob2xkZXJzIGluCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeTogIG1lYW5pbmcgMSBwbGFjZWhvbGRlciBmb3Igbm9uLWFycmF5CiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzIG9yIDEgcGxhY2Vob2xkZXIgcGVyIGFycmF5IGVsZW1lbnQuCiAgICAgKgogICAgICogQHJldHVybiBzdHJpbmcgIHRoZSBxdWVyeSBzdHJpbmcgd2l0aCBMSU1JVCBjbGF1c2VzIGFkZGVkCiAgICAgKgogICAgICogQGFjY2VzcyBwcm90ZWN0ZWQKICAgICAqLwogICAgZnVuY3Rpb24gbW9kaWZ5TGltaXRRdWVyeSgkcXVlcnksICRmcm9tLCAkY291bnQsICRwYXJhbXMgPSBhcnJheSgpKQogICAgewogICAgICAgIC8vIExldCBPcmFjbGUgcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBjb2x1bW5zIGluc3RlYWQgb2YKICAgICAgICAvLyBjb2RpbmcgYSAiaG9tZSIgU1FMIHBhcnNlcgoKICAgICAgICBpZiAoY291bnQoJHBhcmFtcykpIHsKICAgICAgICAgICAgJHJlc3VsdCA9ICR0aGlzLT5wcmVwYXJlKCJTRUxFQ1QgKiBGUk9NICgkcXVlcnkpICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJ1dIRVJFIE5VTEwgPSBOVUxMJyk7CiAgICAgICAgICAgICR0bXAgPSYgJHRoaXMtPmV4ZWN1dGUoJHJlc3VsdCwgJHBhcmFtcyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJHFfZmllbGRzID0gIlNFTEVDVCAqIEZST00gKCRxdWVyeSkgV0hFUkUgTlVMTCA9IE5VTEwiOwoKICAgICAgICAgICAgaWYgKCEkcmVzdWx0ID0gQE9DSVBhcnNlKCR0aGlzLT5jb25uZWN0aW9uLCAkcV9maWVsZHMpKSB7CiAgICAgICAgICAgICAgICAkdGhpcy0+bGFzdF9xdWVyeSA9ICRxX2ZpZWxkczsKICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+b2NpOFJhaXNlRXJyb3IoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIUBPQ0lFeGVjdXRlKCRyZXN1bHQsIE9DSV9ERUZBVUxUKSkgewogICAgICAgICAgICAgICAgJHRoaXMtPmxhc3RfcXVlcnkgPSAkcV9maWVsZHM7CiAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPm9jaThSYWlzZUVycm9yKCRyZXN1bHQpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkbmNvbHMgPSBPQ0lOdW1Db2xzKCRyZXN1bHQpOwogICAgICAgICRjb2xzICA9IGFycmF5KCk7CiAgICAgICAgZm9yICggJGkgPSAxOyAkaSA8PSAkbmNvbHM7ICRpKysgKSB7CiAgICAgICAgICAgICRjb2xzW10gPSAnIicgLiBPQ0lDb2x1bW5OYW1lKCRyZXN1bHQsICRpKSAuICciJzsKICAgICAgICB9CiAgICAgICAgJGZpZWxkcyA9IGltcGxvZGUoJywgJywgJGNvbHMpOwogICAgICAgIC8vIFhYWCBUZXN0IHRoYXQgKHRpcCBieSBKb2huIExpbSkKICAgICAgICAvL2lmIChwcmVnX21hdGNoKCcvXlxzKlNFTEVDVFxzKy9pcycsICRxdWVyeSwgJG1hdGNoKSkgewogICAgICAgIC8vICAgIC8vIEludHJvZHVjZSB0aGUgRklSU1RfUk9XUyBPcmFjbGUgcXVlcnkgb3B0aW1pemVyCiAgICAgICAgLy8gICAgJHF1ZXJ5ID0gc3Vic3RyKCRxdWVyeSwgc3RybGVuKCRtYXRjaFswXSksIHN0cmxlbigkcXVlcnkpKTsKICAgICAgICAvLyAgICAkcXVlcnkgPSAiU0VMRUNUIC8qICtGSVJTVF9ST1dTICovICIgLiAkcXVlcnk7CiAgICAgICAgLy99CgogICAgICAgIC8vIENvbnN0cnVjdCB0aGUgcXVlcnkKICAgICAgICAvLyBtb3JlIGF0OiBodHRwOi8vbWFyYy50aGVhaW1zZ3JvdXAuY29tLz9sPXBocC1kYiZtPTk5ODMxOTU4MTAxMjEyJnc9MgogICAgICAgIC8vIFBlcmhhcHMgdGhpcyBjb3VsZCBiZSBvcHRpbWl6ZWQgd2l0aCB0aGUgdXNlIG9mIFVuaW9ucwogICAgICAgICRxdWVyeSA9ICJTRUxFQ1QgJGZpZWxkcyBGUk9NIi4KICAgICAgICAgICAgICAgICAiICAoU0VMRUNUIHJvd251bSBhcyBsaW5lbnVtLCAkZmllbGRzIEZST00iLgogICAgICAgICAgICAgICAgICIgICAgICAoJHF1ZXJ5KSIuCiAgICAgICAgICAgICAgICAgJyAgV0hFUkUgcm93bnVtIDw9ICcuICgkZnJvbSArICRjb3VudCkgLgogICAgICAgICAgICAgICAgICcpIFdIRVJFIGxpbmVudW0gPj0gJyAuICsrJGZyb207CiAgICAgICAgcmV0dXJuICRxdWVyeTsKICAgIH0KCiAgICAvLyB9fX0KICAgIC8vIHt7eyBuZXh0SWQoKQoKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgbmV4dCBmcmVlIGlkIGluIGEgc2VxdWVuY2UKICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICAkc2VxX25hbWUgIG5hbWUgb2YgdGhlIHNlcXVlbmNlCiAgICAgKiBAcGFyYW0gYm9vbGVhbiAkb25kZW1hbmQgIHdoZW4gdHJ1ZSwgdGhlIHNlcWVuY2UgaXMgYXV0b21hdGljYWxseQogICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlZCBpZiBpdCBkb2VzIG5vdCBleGlzdAogICAgICoKICAgICAqIEByZXR1cm4gaW50ICB0aGUgbmV4dCBpZCBudW1iZXIgaW4gdGhlIHNlcXVlbmNlLgogICAgICogICAgICAgICAgICAgICBBIERCX0Vycm9yIG9iamVjdCBvbiBmYWlsdXJlLgogICAgICoKICAgICAqIEBzZWUgREJfY29tbW9uOjpuZXh0SUQoKSwgREJfY29tbW9uOjpnZXRTZXF1ZW5jZU5hbWUoKSwKICAgICAqICAgICAgREJfb2NpODo6Y3JlYXRlU2VxdWVuY2UoKSwgREJfb2NpODo6ZHJvcFNlcXVlbmNlKCkKICAgICAqLwogICAgZnVuY3Rpb24gbmV4dElkKCRzZXFfbmFtZSwgJG9uZGVtYW5kID0gdHJ1ZSkKICAgIHsKICAgICAgICAkc2VxbmFtZSA9ICR0aGlzLT5nZXRTZXF1ZW5jZU5hbWUoJHNlcV9uYW1lKTsKICAgICAgICAkcmVwZWF0ID0gMDsKICAgICAgICBkbyB7CiAgICAgICAgICAgICR0aGlzLT5leHBlY3RFcnJvcihEQl9FUlJPUl9OT1NVQ0hUQUJMRSk7CiAgICAgICAgICAgICRyZXN1bHQgPSYgJHRoaXMtPnF1ZXJ5KCJTRUxFQ1QgJHtzZXFuYW1lfS5uZXh0dmFsIEZST00gZHVhbCIpOwogICAgICAgICAgICAkdGhpcy0+cG9wRXhwZWN0KCk7CiAgICAgICAgICAgIGlmICgkb25kZW1hbmQgJiYgREI6OmlzRXJyb3IoJHJlc3VsdCkgJiYKICAgICAgICAgICAgICAgICRyZXN1bHQtPmdldENvZGUoKSA9PSBEQl9FUlJPUl9OT1NVQ0hUQUJMRSkgewogICAgICAgICAgICAgICAgJHJlcGVhdCA9IDE7CiAgICAgICAgICAgICAgICAkcmVzdWx0ID0gJHRoaXMtPmNyZWF0ZVNlcXVlbmNlKCRzZXFfbmFtZSk7CiAgICAgICAgICAgICAgICBpZiAoREI6OmlzRXJyb3IoJHJlc3VsdCkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPnJhaXNlRXJyb3IoJHJlc3VsdCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkcmVwZWF0ID0gMDsKICAgICAgICAgICAgfQogICAgICAgIH0gd2hpbGUgKCRyZXBlYXQpOwogICAgICAgIGlmIChEQjo6aXNFcnJvcigkcmVzdWx0KSkgewogICAgICAgICAgICByZXR1cm4gJHRoaXMtPnJhaXNlRXJyb3IoJHJlc3VsdCk7CiAgICAgICAgfQogICAgICAgICRhcnIgPSAkcmVzdWx0LT5mZXRjaFJvdyhEQl9GRVRDSE1PREVfT1JERVJFRCk7CiAgICAgICAgcmV0dXJuICRhcnJbMF07CiAgICB9CgogICAgLyoqCiAgICAgKiBDcmVhdGVzIGEgbmV3IHNlcXVlbmNlCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkc2VxX25hbWUgIG5hbWUgb2YgdGhlIG5ldyBzZXF1ZW5jZQogICAgICoKICAgICAqIEByZXR1cm4gaW50ICBEQl9PSyBvbiBzdWNjZXNzLiAgQSBEQl9FcnJvciBvYmplY3Qgb24gZmFpbHVyZS4KICAgICAqCiAgICAgKiBAc2VlIERCX2NvbW1vbjo6Y3JlYXRlU2VxdWVuY2UoKSwgREJfY29tbW9uOjpnZXRTZXF1ZW5jZU5hbWUoKSwKICAgICAqICAgICAgREJfb2NpODo6bmV4dElEKCksIERCX29jaTg6OmRyb3BTZXF1ZW5jZSgpCiAgICAgKi8KICAgIGZ1bmN0aW9uIGNyZWF0ZVNlcXVlbmNlKCRzZXFfbmFtZSkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnF1ZXJ5KCdDUkVBVEUgU0VRVUVOQ0UgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAkdGhpcy0+Z2V0U2VxdWVuY2VOYW1lKCRzZXFfbmFtZSkpOwogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IGRyb3BTZXF1ZW5jZSgpCgogICAgLyoqCiAgICAgKiBEZWxldGVzIGEgc2VxdWVuY2UKICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICRzZXFfbmFtZSAgbmFtZSBvZiB0aGUgc2VxdWVuY2UgdG8gYmUgZGVsZXRlZAogICAgICoKICAgICAqIEByZXR1cm4gaW50ICBEQl9PSyBvbiBzdWNjZXNzLiAgQSBEQl9FcnJvciBvYmplY3Qgb24gZmFpbHVyZS4KICAgICAqCiAgICAgKiBAc2VlIERCX2NvbW1vbjo6ZHJvcFNlcXVlbmNlKCksIERCX2NvbW1vbjo6Z2V0U2VxdWVuY2VOYW1lKCksCiAgICAgKiAgICAgIERCX29jaTg6Om5leHRJRCgpLCBEQl9vY2k4OjpjcmVhdGVTZXF1ZW5jZSgpCiAgICAgKi8KICAgIGZ1bmN0aW9uIGRyb3BTZXF1ZW5jZSgkc2VxX25hbWUpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5xdWVyeSgnRFJPUCBTRVFVRU5DRSAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICR0aGlzLT5nZXRTZXF1ZW5jZU5hbWUoJHNlcV9uYW1lKSk7CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgb2NpOFJhaXNlRXJyb3IoKQoKICAgIC8qKgogICAgICogUHJvZHVjZXMgYSBEQl9FcnJvciBvYmplY3QgcmVnYXJkaW5nIHRoZSBjdXJyZW50IHByb2JsZW0KICAgICAqCiAgICAgKiBAcGFyYW0gaW50ICRlcnJubyAgaWYgdGhlIGVycm9yIGlzIGJlaW5nIG1hbnVhbGx5IHJhaXNlZCBwYXNzIGEKICAgICAqICAgICAgICAgICAgICAgICAgICAgREJfRVJST1IqIGNvbnN0YW50IGhlcmUuICBJZiB0aGlzIGlzbid0IHBhc3NlZAogICAgICogICAgICAgICAgICAgICAgICAgICB0aGUgZXJyb3IgaW5mb3JtYXRpb24gZ2F0aGVyZWQgZnJvbSB0aGUgREJNUy4KICAgICAqCiAgICAgKiBAcmV0dXJuIG9iamVjdCAgdGhlIERCX0Vycm9yIG9iamVjdAogICAgICoKICAgICAqIEBzZWUgREJfY29tbW9uOjpyYWlzZUVycm9yKCksCiAgICAgKiAgICAgIERCX29jaTg6OmVycm9yTmF0aXZlKCksIERCX29jaTg6OmVycm9yQ29kZSgpCiAgICAgKi8KICAgIGZ1bmN0aW9uIG9jaThSYWlzZUVycm9yKCRlcnJubyA9IG51bGwpCiAgICB7CiAgICAgICAgaWYgKCRlcnJubyA9PT0gbnVsbCkgewogICAgICAgICAgICAkZXJyb3IgPSBAT0NJRXJyb3IoJHRoaXMtPmNvbm5lY3Rpb24pOwogICAgICAgICAgICByZXR1cm4gJHRoaXMtPnJhaXNlRXJyb3IoJHRoaXMtPmVycm9yQ29kZSgkZXJyb3JbJ2NvZGUnXSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBudWxsLCBudWxsLCAkZXJyb3JbJ21lc3NhZ2UnXSk7CiAgICAgICAgfSBlbHNlaWYgKGlzX3Jlc291cmNlKCRlcnJubykpIHsKICAgICAgICAgICAgJGVycm9yID0gQE9DSUVycm9yKCRlcnJubyk7CiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+cmFpc2VFcnJvcigkdGhpcy0+ZXJyb3JDb2RlKCRlcnJvclsnY29kZSddKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIG51bGwsIG51bGwsICRlcnJvclsnbWVzc2FnZSddKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICR0aGlzLT5yYWlzZUVycm9yKCR0aGlzLT5lcnJvckNvZGUoJGVycm5vKSk7CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgZXJyb3JOYXRpdmUoKQoKICAgIC8qKgogICAgICogR2V0cyB0aGUgREJNUycgbmF0aXZlIGVycm9yIGNvZGUgcHJvZHVjZWQgYnkgdGhlIGxhc3QgcXVlcnkKICAgICAqCiAgICAgKiBAcmV0dXJuIGludCAgdGhlIERCTVMnIGVycm9yIGNvZGUuICBGQUxTRSBpZiB0aGUgY29kZSBjb3VsZCBub3QgYmUKICAgICAqICAgICAgICAgICAgICAgZGV0ZXJtaW5lZAogICAgICovCiAgICBmdW5jdGlvbiBlcnJvck5hdGl2ZSgpCiAgICB7CiAgICAgICAgaWYgKGlzX3Jlc291cmNlKCR0aGlzLT5sYXN0X3N0bXQpKSB7CiAgICAgICAgICAgICRlcnJvciA9IEBPQ0lFcnJvcigkdGhpcy0+bGFzdF9zdG10KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkZXJyb3IgPSBAT0NJRXJyb3IoJHRoaXMtPmNvbm5lY3Rpb24pOwogICAgICAgIH0KICAgICAgICBpZiAoaXNfYXJyYXkoJGVycm9yKSkgewogICAgICAgICAgICByZXR1cm4gJGVycm9yWydjb2RlJ107CiAgICAgICAgfQogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICAvLyB9fX0KICAgIC8vIHt7eyB0YWJsZUluZm8oKQoKICAgIC8qKgogICAgICogUmV0dXJucyBpbmZvcm1hdGlvbiBhYm91dCBhIHRhYmxlIG9yIGEgcmVzdWx0IHNldAogICAgICoKICAgICAqIE5PVEU6IG9ubHkgc3VwcG9ydHMgJ3RhYmxlJyBhbmQgJ2ZsYWdzJyBpZiA8dmFyPiRyZXN1bHQ8L3Zhcj4KICAgICAqIGlzIGEgdGFibGUgbmFtZS4KICAgICAqCiAgICAgKiBOT1RFOiBmbGFncyB3b24ndCBjb250YWluIGluZGV4IGluZm9ybWF0aW9uLgogICAgICoKICAgICAqIEBwYXJhbSBvYmplY3R8c3RyaW5nICAkcmVzdWx0ICBEQl9yZXN1bHQgb2JqZWN0IGZyb20gYSBxdWVyeSBvciBhCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBjb250YWluaW5nIHRoZSBuYW1lIG9mIGEgdGFibGUuCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdoaWxlIHRoaXMgYWxzbyBhY2NlcHRzIGEgcXVlcnkgcmVzdWx0CiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlIGlkZW50aWZpZXIsIHRoaXMgYmVoYXZpb3IgaXMKICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwcmVjYXRlZC4KICAgICAqIEBwYXJhbSBpbnQgICAgICAgICAgICAkbW9kZSAgICBhIHZhbGlkIHRhYmxlSW5mbyBtb2RlCiAgICAgKgogICAgICogQHJldHVybiBhcnJheSAgYW4gYXNzb2NpYXRpdmUgYXJyYXkgd2l0aCB0aGUgaW5mb3JtYXRpb24gcmVxdWVzdGVkLgogICAgICogICAgICAgICAgICAgICAgIEEgREJfRXJyb3Igb2JqZWN0IG9uIGZhaWx1cmUuCiAgICAgKgogICAgICogQHNlZSBEQl9jb21tb246OnRhYmxlSW5mbygpCiAgICAgKi8KICAgIGZ1bmN0aW9uIHRhYmxlSW5mbygkcmVzdWx0LCAkbW9kZSA9IG51bGwpCiAgICB7CiAgICAgICAgaWYgKCR0aGlzLT5vcHRpb25zWydwb3J0YWJpbGl0eSddICYgREJfUE9SVEFCSUxJVFlfTE9XRVJDQVNFKSB7CiAgICAgICAgICAgICRjYXNlX2Z1bmMgPSAnc3RydG9sb3dlcic7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJGNhc2VfZnVuYyA9ICdzdHJ2YWwnOwogICAgICAgIH0KCiAgICAgICAgJHJlcyA9IGFycmF5KCk7CgogICAgICAgIGlmIChpc19zdHJpbmcoJHJlc3VsdCkpIHsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogUHJvYmFibHkgcmVjZWl2ZWQgYSB0YWJsZSBuYW1lLgogICAgICAgICAgICAgKiBDcmVhdGUgYSByZXN1bHQgcmVzb3VyY2UgaWRlbnRpZmllci4KICAgICAgICAgICAgICovCiAgICAgICAgICAgICRyZXN1bHQgPSBzdHJ0b3VwcGVyKCRyZXN1bHQpOwogICAgICAgICAgICAkcV9maWVsZHMgPSAnU0VMRUNUIGNvbHVtbl9uYW1lLCBkYXRhX3R5cGUsIGRhdGFfbGVuZ3RoLCAnCiAgICAgICAgICAgICAgICAgICAgICAgIC4gJ251bGxhYmxlICcKICAgICAgICAgICAgICAgICAgICAgICAgLiAnRlJPTSB1c2VyX3RhYl9jb2x1bW5zICcKICAgICAgICAgICAgICAgICAgICAgICAgLiAiV0hFUkUgdGFibGVfbmFtZT0nJHJlc3VsdCcgT1JERVIgQlkgY29sdW1uX2lkIjsKCiAgICAgICAgICAgICR0aGlzLT5sYXN0X3F1ZXJ5ID0gJHFfZmllbGRzOwoKICAgICAgICAgICAgaWYgKCEkc3RtdCA9IEBPQ0lQYXJzZSgkdGhpcy0+Y29ubmVjdGlvbiwgJHFfZmllbGRzKSkgewogICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5vY2k4UmFpc2VFcnJvcihEQl9FUlJPUl9ORUVEX01PUkVfREFUQSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFAT0NJRXhlY3V0ZSgkc3RtdCwgT0NJX0RFRkFVTFQpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPm9jaThSYWlzZUVycm9yKCRzdG10KTsKICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgJGkgPSAwOwogICAgICAgICAgICB3aGlsZSAoQE9DSUZldGNoKCRzdG10KSkgewogICAgICAgICAgICAgICAgJHJlc1skaV0gPSBhcnJheSgKICAgICAgICAgICAgICAgICAgICAndGFibGUnID0+ICRjYXNlX2Z1bmMoJHJlc3VsdCksCiAgICAgICAgICAgICAgICAgICAgJ25hbWUnICA9PiAkY2FzZV9mdW5jKEBPQ0lSZXN1bHQoJHN0bXQsIDEpKSwKICAgICAgICAgICAgICAgICAgICAndHlwZScgID0+IEBPQ0lSZXN1bHQoJHN0bXQsIDIpLAogICAgICAgICAgICAgICAgICAgICdsZW4nICAgPT4gQE9DSVJlc3VsdCgkc3RtdCwgMyksCiAgICAgICAgICAgICAgICAgICAgJ2ZsYWdzJyA9PiAoQE9DSVJlc3VsdCgkc3RtdCwgNCkgPT0gJ04nKSA/ICdub3RfbnVsbCcgOiAnJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBpZiAoJG1vZGUgJiBEQl9UQUJMRUlORk9fT1JERVIpIHsKICAgICAgICAgICAgICAgICAgICAkcmVzWydvcmRlciddWyRyZXNbJGldWyduYW1lJ11dID0gJGk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoJG1vZGUgJiBEQl9UQUJMRUlORk9fT1JERVJUQUJMRSkgewogICAgICAgICAgICAgICAgICAgICRyZXNbJ29yZGVydGFibGUnXVskcmVzWyRpXVsndGFibGUnXV1bJHJlc1skaV1bJ25hbWUnXV0gPSAkaTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRpKys7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICgkbW9kZSkgewogICAgICAgICAgICAgICAgJHJlc1snbnVtX2ZpZWxkcyddID0gJGk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgQE9DSUZyZWVTdGF0ZW1lbnQoJHN0bXQpOwoKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiAoaXNzZXQoJHJlc3VsdC0+cmVzdWx0KSkgewogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqIFByb2JhYmx5IHJlY2VpdmVkIGEgcmVzdWx0IG9iamVjdC4KICAgICAgICAgICAgICAgICAqIEV4dHJhY3QgdGhlIHJlc3VsdCByZXNvdXJjZSBpZGVudGlmaWVyLgogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAkcmVzdWx0ID0gJHJlc3VsdC0+cmVzdWx0OwogICAgICAgICAgICB9CgogICAgICAgICAgICAkcmVzID0gYXJyYXkoKTsKCiAgICAgICAgICAgIGlmICgkcmVzdWx0ID09PSAkdGhpcy0+bGFzdF9zdG10KSB7CiAgICAgICAgICAgICAgICAkY291bnQgPSBAT0NJTnVtQ29scygkcmVzdWx0KTsKICAgICAgICAgICAgICAgIGlmICgkbW9kZSkgewogICAgICAgICAgICAgICAgICAgICRyZXNbJ251bV9maWVsZHMnXSA9ICRjb3VudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZvciAoJGkgPSAwOyAkaSA8ICRjb3VudDsgJGkrKykgewogICAgICAgICAgICAgICAgICAgICRyZXNbJGldID0gYXJyYXkoCiAgICAgICAgICAgICAgICAgICAgICAgICd0YWJsZScgPT4gJycsCiAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJyAgPT4gJGNhc2VfZnVuYyhAT0NJQ29sdW1uTmFtZSgkcmVzdWx0LCAkaSsxKSksCiAgICAgICAgICAgICAgICAgICAgICAgICd0eXBlJyAgPT4gQE9DSUNvbHVtblR5cGUoJHJlc3VsdCwgJGkrMSksCiAgICAgICAgICAgICAgICAgICAgICAgICdsZW4nICAgPT4gQE9DSUNvbHVtblNpemUoJHJlc3VsdCwgJGkrMSksCiAgICAgICAgICAgICAgICAgICAgICAgICdmbGFncycgPT4gJycsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICBpZiAoJG1vZGUgJiBEQl9UQUJMRUlORk9fT1JERVIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJHJlc1snb3JkZXInXVskcmVzWyRpXVsnbmFtZSddXSA9ICRpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoJG1vZGUgJiBEQl9UQUJMRUlORk9fT1JERVJUQUJMRSkgewogICAgICAgICAgICAgICAgICAgICAgICAkcmVzWydvcmRlcnRhYmxlJ11bJHJlc1skaV1bJ3RhYmxlJ11dWyRyZXNbJGldWyduYW1lJ11dID0gJGk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5yYWlzZUVycm9yKERCX0VSUk9SX05PVF9DQVBBQkxFKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gJHJlczsKICAgIH0KCiAgICAvLyB9fX0KICAgIC8vIHt7eyBnZXRTcGVjaWFsUXVlcnkoKQoKICAgIC8qKgogICAgICogT2J0YWlucyB0aGUgcXVlcnkgc3RyaW5nIG5lZWRlZCBmb3IgbGlzdGluZyBhIGdpdmVuIHR5cGUgb2Ygb2JqZWN0cwogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgJHR5cGUgIHRoZSBraW5kIG9mIG9iamVjdHMgeW91IHdhbnQgdG8gcmV0cmlldmUKICAgICAqCiAgICAgKiBAcmV0dXJuIHN0cmluZyAgdGhlIFNRTCBxdWVyeSBzdHJpbmcgb3IgbnVsbCBpZiB0aGUgZHJpdmVyIGRvZXNuJ3QKICAgICAqICAgICAgICAgICAgICAgICAgc3VwcG9ydCB0aGUgb2JqZWN0IHR5cGUgcmVxdWVzdGVkCiAgICAgKgogICAgICogQGFjY2VzcyBwcm90ZWN0ZWQKICAgICAqIEBzZWUgREJfY29tbW9uOjpnZXRMaXN0T2YoKQogICAgICovCiAgICBmdW5jdGlvbiBnZXRTcGVjaWFsUXVlcnkoJHR5cGUpCiAgICB7CiAgICAgICAgc3dpdGNoICgkdHlwZSkgewogICAgICAgICAgICBjYXNlICd0YWJsZXMnOgogICAgICAgICAgICAgICAgcmV0dXJuICdTRUxFQ1QgdGFibGVfbmFtZSBGUk9NIHVzZXJfdGFibGVzJzsKICAgICAgICAgICAgY2FzZSAnc3lub255bXMnOgogICAgICAgICAgICAgICAgcmV0dXJuICdTRUxFQ1Qgc3lub255bV9uYW1lIEZST00gdXNlcl9zeW5vbnltcyc7CiAgICAgICAgICAgIGNhc2UgJ3ZpZXdzJzoKICAgICAgICAgICAgICAgIHJldHVybiAnU0VMRUNUIHZpZXdfbmFtZSBGUk9NIHVzZXJfdmlld3MnOwogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IHF1b3RlRmxvYXQoKQoKICAgIC8qKgogICAgICogRm9ybWF0cyBhIGZsb2F0IHZhbHVlIGZvciB1c2Ugd2l0aGluIGEgcXVlcnkgaW4gYSBsb2NhbGUtaW5kZXBlbmRlbnQKICAgICAqIG1hbm5lci4KICAgICAqCiAgICAgKiBAcGFyYW0gZmxvYXQgdGhlIGZsb2F0IHZhbHVlIHRvIGJlIHF1b3RlZC4KICAgICAqIEByZXR1cm4gc3RyaW5nIHRoZSBxdW90ZWQgc3RyaW5nLgogICAgICogQHNlZSBEQl9jb21tb246OnF1b3RlU21hcnQoKQogICAgICogQHNpbmNlIE1ldGhvZCBhdmFpbGFibGUgc2luY2UgcmVsZWFzZSAxLjcuOC4KICAgICAqLwogICAgZnVuY3Rpb24gcXVvdGVGbG9hdCgkZmxvYXQpIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmVzY2FwZVNpbXBsZShzdHJfcmVwbGFjZSgnLCcsICcuJywgc3RydmFsKGZsb2F0dmFsKCRmbG9hdCkpKSk7CiAgICB9CiAgICAgCiAgICAvLyB9fX0KCn0KCi8qCiAqIExvY2FsIHZhcmlhYmxlczoKICogdGFiLXdpZHRoOiA0CiAqIGMtYmFzaWMtb2Zmc2V0OiA0CiAqIEVuZDoKICovCgo/Pgo=]]></data>
	</file>
	<file>
	  <filename>/lib/pear/DB/odbc.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qIHZpbTogc2V0IGV4cGFuZHRhYiB0YWJzdG9wPTQgc2hpZnR3aWR0aD00IHNvZnR0YWJzdG9wPTQ6ICovCgovKioKICogVGhlIFBFQVIgREIgZHJpdmVyIGZvciBQSFAncyBvZGJjIGV4dGVuc2lvbgogKiBmb3IgaW50ZXJhY3Rpbmcgd2l0aCBkYXRhYmFzZXMgdmlhIE9EQkMgY29ubmVjdGlvbnMKICoKICogUEhQIHZlcnNpb25zIDQgYW5kIDUKICoKICogTElDRU5TRTogVGhpcyBzb3VyY2UgZmlsZSBpcyBzdWJqZWN0IHRvIHZlcnNpb24gMy4wIG9mIHRoZSBQSFAgbGljZW5zZQogKiB0aGF0IGlzIGF2YWlsYWJsZSB0aHJvdWdoIHRoZSB3b3JsZC13aWRlLXdlYiBhdCB0aGUgZm9sbG93aW5nIFVSSToKICogaHR0cDovL3d3dy5waHAubmV0L2xpY2Vuc2UvM18wLnR4dC4gIElmIHlvdSBkaWQgbm90IHJlY2VpdmUgYSBjb3B5IG9mCiAqIHRoZSBQSFAgTGljZW5zZSBhbmQgYXJlIHVuYWJsZSB0byBvYnRhaW4gaXQgdGhyb3VnaCB0aGUgd2ViLCBwbGVhc2UKICogc2VuZCBhIG5vdGUgdG8gbGljZW5zZUBwaHAubmV0IHNvIHdlIGNhbiBtYWlsIHlvdSBhIGNvcHkgaW1tZWRpYXRlbHkuCiAqCiAqIEBjYXRlZ29yeSAgIERhdGFiYXNlCiAqIEBwYWNrYWdlICAgIERCCiAqIEBhdXRob3IgICAgIFN0aWcgQmFra2VuIDxzc2JAcGhwLm5ldD4KICogQGF1dGhvciAgICAgRGFuaWVsIENvbnZpc3NvciA8ZGFuaWVsY0BwaHAubmV0PgogKiBAY29weXJpZ2h0ICAxOTk3LTIwMDUgVGhlIFBIUCBHcm91cAogKiBAbGljZW5zZSAgICBodHRwOi8vd3d3LnBocC5uZXQvbGljZW5zZS8zXzAudHh0ICBQSFAgTGljZW5zZSAzLjAKICogQHZlcnNpb24gICAgQ1ZTOiAkSWQ6IG9kYmMucGhwLHYgMS44MCAyMDA3LzAxLzEyIDAzOjExOjE3IGFoYXJ2ZXkgRXhwICQKICogQGxpbmsgICAgICAgaHR0cDovL3BlYXIucGhwLm5ldC9wYWNrYWdlL0RCCiAqLwoKLyoqCiAqIE9idGFpbiB0aGUgREJfY29tbW9uIGNsYXNzIHNvIGl0IGNhbiBiZSBleHRlbmRlZCBmcm9tCiAqLwpyZXF1aXJlX29uY2UgJ0RCL2NvbW1vbi5waHAnOwoKLyoqCiAqIFRoZSBtZXRob2RzIFBFQVIgREIgdXNlcyB0byBpbnRlcmFjdCB3aXRoIFBIUCdzIG9kYmMgZXh0ZW5zaW9uCiAqIGZvciBpbnRlcmFjdGluZyB3aXRoIGRhdGFiYXNlcyB2aWEgT0RCQyBjb25uZWN0aW9ucwogKgogKiBUaGVzZSBtZXRob2RzIG92ZXJsb2FkIHRoZSBvbmVzIGRlY2xhcmVkIGluIERCX2NvbW1vbi4KICoKICogTW9yZSBpbmZvIG9uIE9EQkMgZXJyb3JzIGNvdWxkIGJlIGZvdW5kIGhlcmU6CiAqIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vbGlicmFyeS9kZWZhdWx0LmFzcD91cmw9L2xpYnJhcnkvZW4tdXMvdHJibHNxbC90cl9lcnJfb2RiY181c3R6LmFzcAogKgogKiBAY2F0ZWdvcnkgICBEYXRhYmFzZQogKiBAcGFja2FnZSAgICBEQgogKiBAYXV0aG9yICAgICBTdGlnIEJha2tlbiA8c3NiQHBocC5uZXQ+CiAqIEBhdXRob3IgICAgIERhbmllbCBDb252aXNzb3IgPGRhbmllbGNAcGhwLm5ldD4KICogQGNvcHlyaWdodCAgMTk5Ny0yMDA1IFRoZSBQSFAgR3JvdXAKICogQGxpY2Vuc2UgICAgaHR0cDovL3d3dy5waHAubmV0L2xpY2Vuc2UvM18wLnR4dCAgUEhQIExpY2Vuc2UgMy4wCiAqIEB2ZXJzaW9uICAgIFJlbGVhc2U6IDEuNy4xMgogKiBAbGluayAgICAgICBodHRwOi8vcGVhci5waHAubmV0L3BhY2thZ2UvREIKICovCmNsYXNzIERCX29kYmMgZXh0ZW5kcyBEQl9jb21tb24KewogICAgLy8ge3t7IHByb3BlcnRpZXMKCiAgICAvKioKICAgICAqIFRoZSBEQiBkcml2ZXIgdHlwZSAobXlzcWwsIG9jaTgsIG9kYmMsIGV0Yy4pCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICB2YXIgJHBocHR5cGUgPSAnb2RiYyc7CgogICAgLyoqCiAgICAgKiBUaGUgZGF0YWJhc2Ugc3ludGF4IHZhcmlhbnQgdG8gYmUgdXNlZCAoZGIyLCBhY2Nlc3MsIGV0Yy4pLCBpZiBhbnkKICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHZhciAkZGJzeW50YXggPSAnc3FsOTInOwoKICAgIC8qKgogICAgICogVGhlIGNhcGFiaWxpdGllcyBvZiB0aGlzIERCIGltcGxlbWVudGF0aW9uCiAgICAgKgogICAgICogVGhlICduZXdfbGluaycgZWxlbWVudCBjb250YWlucyB0aGUgUEhQIHZlcnNpb24gdGhhdCBmaXJzdCBwcm92aWRlZAogICAgICogbmV3X2xpbmsgc3VwcG9ydCBmb3IgdGhpcyBEQk1TLiAgQ29udGFpbnMgZmFsc2UgaWYgaXQncyB1bnN1cHBvcnRlZC4KICAgICAqCiAgICAgKiBNZWFuaW5nIG9mIHRoZSAnbGltaXQnIGVsZW1lbnQ6CiAgICAgKiAgICsgJ2VtdWxhdGUnID0gZW11bGF0ZSB3aXRoIGZldGNoIHJvdyBieSBudW1iZXIKICAgICAqICAgKyAnYWx0ZXInICAgPSBhbHRlciB0aGUgcXVlcnkKICAgICAqICAgKyBmYWxzZSAgICAgPSBza2lwIHJvd3MKICAgICAqCiAgICAgKiBOT1RFOiBUaGUgZmVhdHVyZSBzZXQgb2YgdGhlIGZvbGxvd2luZyBkcml2ZXJzIGFyZSBkaWZmZXJlbnQgdGhhbgogICAgICogdGhlIGRlZmF1bHQ6CiAgICAgKiAgICsgc29saWQ6ICd0cmFuc2FjdGlvbnMnID0gdHJ1ZQogICAgICogICArIG5hdmlzaW9uOiAnbGltaXQnID0gZmFsc2UKICAgICAqCiAgICAgKiBAdmFyIGFycmF5CiAgICAgKi8KICAgIHZhciAkZmVhdHVyZXMgPSBhcnJheSgKICAgICAgICAnbGltaXQnICAgICAgICAgPT4gJ2VtdWxhdGUnLAogICAgICAgICduZXdfbGluaycgICAgICA9PiBmYWxzZSwKICAgICAgICAnbnVtcm93cycgICAgICAgPT4gdHJ1ZSwKICAgICAgICAncGNvbm5lY3QnICAgICAgPT4gdHJ1ZSwKICAgICAgICAncHJlcGFyZScgICAgICAgPT4gZmFsc2UsCiAgICAgICAgJ3NzbCcgICAgICAgICAgID0+IGZhbHNlLAogICAgICAgICd0cmFuc2FjdGlvbnMnICA9PiBmYWxzZSwKICAgICk7CgogICAgLyoqCiAgICAgKiBBIG1hcHBpbmcgb2YgbmF0aXZlIGVycm9yIGNvZGVzIHRvIERCIGVycm9yIGNvZGVzCiAgICAgKiBAdmFyIGFycmF5CiAgICAgKi8KICAgIHZhciAkZXJyb3Jjb2RlX21hcCA9IGFycmF5KAogICAgICAgICcwMTAwNCcgPT4gREJfRVJST1JfVFJVTkNBVEVELAogICAgICAgICcwNzAwMScgPT4gREJfRVJST1JfTUlTTUFUQ0gsCiAgICAgICAgJzIxUzAxJyA9PiBEQl9FUlJPUl9WQUxVRV9DT1VOVF9PTl9ST1csCiAgICAgICAgJzIxUzAyJyA9PiBEQl9FUlJPUl9NSVNNQVRDSCwKICAgICAgICAnMjIwMDEnID0+IERCX0VSUk9SX0lOVkFMSUQsCiAgICAgICAgJzIyMDAzJyA9PiBEQl9FUlJPUl9JTlZBTElEX05VTUJFUiwKICAgICAgICAnMjIwMDUnID0+IERCX0VSUk9SX0lOVkFMSURfTlVNQkVSLAogICAgICAgICcyMjAwOCcgPT4gREJfRVJST1JfSU5WQUxJRF9EQVRFLAogICAgICAgICcyMjAxMicgPT4gREJfRVJST1JfRElWWkVSTywKICAgICAgICAnMjMwMDAnID0+IERCX0VSUk9SX0NPTlNUUkFJTlQsCiAgICAgICAgJzIzNTAyJyA9PiBEQl9FUlJPUl9DT05TVFJBSU5UX05PVF9OVUxMLAogICAgICAgICcyMzUwMycgPT4gREJfRVJST1JfQ09OU1RSQUlOVCwKICAgICAgICAnMjM1MDQnID0+IERCX0VSUk9SX0NPTlNUUkFJTlQsCiAgICAgICAgJzIzNTA1JyA9PiBEQl9FUlJPUl9DT05TVFJBSU5ULAogICAgICAgICcyNDAwMCcgPT4gREJfRVJST1JfSU5WQUxJRCwKICAgICAgICAnMzQwMDAnID0+IERCX0VSUk9SX0lOVkFMSUQsCiAgICAgICAgJzM3MDAwJyA9PiBEQl9FUlJPUl9TWU5UQVgsCiAgICAgICAgJzQyMDAwJyA9PiBEQl9FUlJPUl9TWU5UQVgsCiAgICAgICAgJzQyNjAxJyA9PiBEQl9FUlJPUl9TWU5UQVgsCiAgICAgICAgJ0lNMDAxJyA9PiBEQl9FUlJPUl9VTlNVUFBPUlRFRCwKICAgICAgICAnUzAwMDAnID0+IERCX0VSUk9SX05PU1VDSFRBQkxFLAogICAgICAgICdTMDAwMScgPT4gREJfRVJST1JfQUxSRUFEWV9FWElTVFMsCiAgICAgICAgJ1MwMDAyJyA9PiBEQl9FUlJPUl9OT1NVQ0hUQUJMRSwKICAgICAgICAnUzAwMTEnID0+IERCX0VSUk9SX0FMUkVBRFlfRVhJU1RTLAogICAgICAgICdTMDAxMicgPT4gREJfRVJST1JfTk9UX0ZPVU5ELAogICAgICAgICdTMDAyMScgPT4gREJfRVJST1JfQUxSRUFEWV9FWElTVFMsCiAgICAgICAgJ1MwMDIyJyA9PiBEQl9FUlJPUl9OT1NVQ0hGSUVMRCwKICAgICAgICAnUzEwMDknID0+IERCX0VSUk9SX0lOVkFMSUQsCiAgICAgICAgJ1MxMDkwJyA9PiBEQl9FUlJPUl9JTlZBTElELAogICAgICAgICdTMUMwMCcgPT4gREJfRVJST1JfTk9UX0NBUEFCTEUsCiAgICApOwoKICAgIC8qKgogICAgICogVGhlIHJhdyBkYXRhYmFzZSBjb25uZWN0aW9uIGNyZWF0ZWQgYnkgUEhQCiAgICAgKiBAdmFyIHJlc291cmNlCiAgICAgKi8KICAgIHZhciAkY29ubmVjdGlvbjsKCiAgICAvKioKICAgICAqIFRoZSBEU04gaW5mb3JtYXRpb24gZm9yIGNvbm5lY3RpbmcgdG8gYSBkYXRhYmFzZQogICAgICogQHZhciBhcnJheQogICAgICovCiAgICB2YXIgJGRzbiA9IGFycmF5KCk7CgoKICAgIC8qKgogICAgICogVGhlIG51bWJlciBvZiByb3dzIGFmZmVjdGVkIGJ5IGEgZGF0YSBtYW5pcHVsYXRpb24gcXVlcnkKICAgICAqIEB2YXIgaW50ZWdlcgogICAgICogQGFjY2VzcyBwcml2YXRlCiAgICAgKi8KICAgIHZhciAkYWZmZWN0ZWQgPSAwOwoKCiAgICAvLyB9fX0KICAgIC8vIHt7eyBjb25zdHJ1Y3RvcgoKICAgIC8qKgogICAgICogVGhpcyBjb25zdHJ1Y3RvciBjYWxscyA8a2JkPiR0aGlzLT5EQl9jb21tb24oKTwva2JkPgogICAgICoKICAgICAqIEByZXR1cm4gdm9pZAogICAgICovCiAgICBmdW5jdGlvbiBEQl9vZGJjKCkKICAgIHsKICAgICAgICAkdGhpcy0+REJfY29tbW9uKCk7CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgY29ubmVjdCgpCgogICAgLyoqCiAgICAgKiBDb25uZWN0IHRvIHRoZSBkYXRhYmFzZSBzZXJ2ZXIsIGxvZyBpbiBhbmQgb3BlbiB0aGUgZGF0YWJhc2UKICAgICAqCiAgICAgKiBEb24ndCBjYWxsIHRoaXMgbWV0aG9kIGRpcmVjdGx5LiAgVXNlIERCOjpjb25uZWN0KCkgaW5zdGVhZC4KICAgICAqCiAgICAgKiBQRUFSIERCJ3Mgb2RiYyBkcml2ZXIgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBleHRyYSBEU04gb3B0aW9uczoKICAgICAqICAgKyBjdXJzb3IgIFRoZSB0eXBlIG9mIGN1cnNvciB0byBiZSB1c2VkIGZvciB0aGlzIGNvbm5lY3Rpb24uCiAgICAgKgogICAgICogQHBhcmFtIGFycmF5ICRkc24gICAgICAgICB0aGUgZGF0YSBzb3VyY2UgbmFtZQogICAgICogQHBhcmFtIGJvb2wgICRwZXJzaXN0ZW50ICBzaG91bGQgdGhlIGNvbm5lY3Rpb24gYmUgcGVyc2lzdGVudD8KICAgICAqCiAgICAgKiBAcmV0dXJuIGludCAgREJfT0sgb24gc3VjY2Vzcy4gQSBEQl9FcnJvciBvYmplY3Qgb24gZmFpbHVyZS4KICAgICAqLwogICAgZnVuY3Rpb24gY29ubmVjdCgkZHNuLCAkcGVyc2lzdGVudCA9IGZhbHNlKQogICAgewogICAgICAgIGlmICghUEVBUjo6bG9hZEV4dGVuc2lvbignb2RiYycpKSB7CiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+cmFpc2VFcnJvcihEQl9FUlJPUl9FWFRFTlNJT05fTk9UX0ZPVU5EKTsKICAgICAgICB9CgogICAgICAgICR0aGlzLT5kc24gPSAkZHNuOwogICAgICAgIGlmICgkZHNuWydkYnN5bnRheCddKSB7CiAgICAgICAgICAgICR0aGlzLT5kYnN5bnRheCA9ICRkc25bJ2Ric3ludGF4J107CiAgICAgICAgfQogICAgICAgIHN3aXRjaCAoJHRoaXMtPmRic3ludGF4KSB7CiAgICAgICAgICAgIGNhc2UgJ2FjY2Vzcyc6CiAgICAgICAgICAgIGNhc2UgJ2RiMic6CiAgICAgICAgICAgIGNhc2UgJ3NvbGlkJzoKICAgICAgICAgICAgICAgICR0aGlzLT5mZWF0dXJlc1sndHJhbnNhY3Rpb25zJ10gPSB0cnVlOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ25hdmlzaW9uJzoKICAgICAgICAgICAgICAgICR0aGlzLT5mZWF0dXJlc1snbGltaXQnXSA9IGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgLyoKICAgICAgICAgKiBUaGlzIGlzIGhlYXIgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LiBTaG91bGQgaGF2ZSBiZWVuIHVzaW5nCiAgICAgICAgICogJ2RhdGFiYXNlJyBhbGwgYWxvbmcsIGJ1dCBwcmlvciB0byAxLjYuMFJDMyAnaG9zdHNwZWMnIHdhcyB1c2VkLgogICAgICAgICAqLwogICAgICAgIGlmICgkZHNuWydkYXRhYmFzZSddKSB7CiAgICAgICAgICAgICRvZGJjZHNuID0gJGRzblsnZGF0YWJhc2UnXTsKICAgICAgICB9IGVsc2VpZiAoJGRzblsnaG9zdHNwZWMnXSkgewogICAgICAgICAgICAkb2RiY2RzbiA9ICRkc25bJ2hvc3RzcGVjJ107CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJG9kYmNkc24gPSAnbG9jYWxob3N0JzsKICAgICAgICB9CgogICAgICAgICRjb25uZWN0X2Z1bmN0aW9uID0gJHBlcnNpc3RlbnQgPyAnb2RiY19wY29ubmVjdCcgOiAnb2RiY19jb25uZWN0JzsKCiAgICAgICAgaWYgKGVtcHR5KCRkc25bJ2N1cnNvciddKSkgewogICAgICAgICAgICAkdGhpcy0+Y29ubmVjdGlvbiA9IEAkY29ubmVjdF9mdW5jdGlvbigkb2RiY2RzbiwgJGRzblsndXNlcm5hbWUnXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGRzblsncGFzc3dvcmQnXSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJHRoaXMtPmNvbm5lY3Rpb24gPSBAJGNvbm5lY3RfZnVuY3Rpb24oJG9kYmNkc24sICRkc25bJ3VzZXJuYW1lJ10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRkc25bJ3Bhc3N3b3JkJ10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRkc25bJ2N1cnNvciddKTsKICAgICAgICB9CgogICAgICAgIGlmICghaXNfcmVzb3VyY2UoJHRoaXMtPmNvbm5lY3Rpb24pKSB7CiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+cmFpc2VFcnJvcihEQl9FUlJPUl9DT05ORUNUX0ZBSUxFRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIG51bGwsIG51bGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+ZXJyb3JOYXRpdmUoKSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBEQl9PSzsKICAgIH0KCiAgICAvLyB9fX0KICAgIC8vIHt7eyBkaXNjb25uZWN0KCkKCiAgICAvKioKICAgICAqIERpc2Nvbm5lY3RzIGZyb20gdGhlIGRhdGFiYXNlIHNlcnZlcgogICAgICoKICAgICAqIEByZXR1cm4gYm9vbCAgVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlCiAgICAgKi8KICAgIGZ1bmN0aW9uIGRpc2Nvbm5lY3QoKQogICAgewogICAgICAgICRlcnIgPSBAb2RiY19jbG9zZSgkdGhpcy0+Y29ubmVjdGlvbik7CiAgICAgICAgJHRoaXMtPmNvbm5lY3Rpb24gPSBudWxsOwogICAgICAgIHJldHVybiAkZXJyOwogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IHNpbXBsZVF1ZXJ5KCkKCiAgICAvKioKICAgICAqIFNlbmRzIGEgcXVlcnkgdG8gdGhlIGRhdGFiYXNlIHNlcnZlcgogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgIHRoZSBTUUwgcXVlcnkgc3RyaW5nCiAgICAgKgogICAgICogQHJldHVybiBtaXhlZCAgKyBhIFBIUCByZXN1bHQgcmVzcm91Y2UgZm9yIHN1Y2Nlc3NmdWwgU0VMRUNUIHF1ZXJpZXMKICAgICAqICAgICAgICAgICAgICAgICsgdGhlIERCX09LIGNvbnN0YW50IGZvciBvdGhlciBzdWNjZXNzZnVsIHF1ZXJpZXMKICAgICAqICAgICAgICAgICAgICAgICsgYSBEQl9FcnJvciBvYmplY3Qgb24gZmFpbHVyZQogICAgICovCiAgICBmdW5jdGlvbiBzaW1wbGVRdWVyeSgkcXVlcnkpCiAgICB7CiAgICAgICAgJHRoaXMtPmxhc3RfcXVlcnkgPSAkcXVlcnk7CiAgICAgICAgJHF1ZXJ5ID0gJHRoaXMtPm1vZGlmeVF1ZXJ5KCRxdWVyeSk7CiAgICAgICAgJHJlc3VsdCA9IEBvZGJjX2V4ZWMoJHRoaXMtPmNvbm5lY3Rpb24sICRxdWVyeSk7CiAgICAgICAgaWYgKCEkcmVzdWx0KSB7CiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+b2RiY1JhaXNlRXJyb3IoKTsgLy8gWFhYIEVSUk9STVNHCiAgICAgICAgfQogICAgICAgIC8vIERldGVybWluZSB3aGljaCBxdWVyaWVzIHRoYXQgc2hvdWxkIHJldHVybiBkYXRhLCBhbmQgd2hpY2gKICAgICAgICAvLyBzaG91bGQgcmV0dXJuIGFuIGVycm9yIGNvZGUgb25seS4KICAgICAgICBpZiAoJHRoaXMtPl9jaGVja01hbmlwKCRxdWVyeSkpIHsKICAgICAgICAgICAgJHRoaXMtPmFmZmVjdGVkID0gJHJlc3VsdDsgLy8gRm9yIGFmZmVjdGVkUm93cygpCiAgICAgICAgICAgIHJldHVybiBEQl9PSzsKICAgICAgICB9CiAgICAgICAgJHRoaXMtPmFmZmVjdGVkID0gMDsKICAgICAgICByZXR1cm4gJHJlc3VsdDsKICAgIH0KCiAgICAvLyB9fX0KICAgIC8vIHt7eyBuZXh0UmVzdWx0KCkKCiAgICAvKioKICAgICAqIE1vdmUgdGhlIGludGVybmFsIG9kYmMgcmVzdWx0IHBvaW50ZXIgdG8gdGhlIG5leHQgYXZhaWxhYmxlIHJlc3VsdAogICAgICoKICAgICAqIEBwYXJhbSBhIHZhbGlkIGZic3FsIHJlc3VsdCByZXNvdXJjZQogICAgICoKICAgICAqIEBhY2Nlc3MgcHVibGljCiAgICAgKgogICAgICogQHJldHVybiB0cnVlIGlmIGEgcmVzdWx0IGlzIGF2YWlsYWJsZSBvdGhlcndpc2UgcmV0dXJuIGZhbHNlCiAgICAgKi8KICAgIGZ1bmN0aW9uIG5leHRSZXN1bHQoJHJlc3VsdCkKICAgIHsKICAgICAgICByZXR1cm4gQG9kYmNfbmV4dF9yZXN1bHQoJHJlc3VsdCk7CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgZmV0Y2hJbnRvKCkKCiAgICAvKioKICAgICAqIFBsYWNlcyBhIHJvdyBmcm9tIHRoZSByZXN1bHQgc2V0IGludG8gdGhlIGdpdmVuIGFycmF5CiAgICAgKgogICAgICogRm9ybWF0aW5nIG9mIHRoZSBhcnJheSBhbmQgdGhlIGRhdGEgdGhlcmVpbiBhcmUgY29uZmlndXJhYmxlLgogICAgICogU2VlIERCX3Jlc3VsdDo6ZmV0Y2hJbnRvKCkgZm9yIG1vcmUgaW5mb3JtYXRpb24uCiAgICAgKgogICAgICogVGhpcyBtZXRob2QgaXMgbm90IG1lYW50IHRvIGJlIGNhbGxlZCBkaXJlY3RseS4gIFVzZQogICAgICogREJfcmVzdWx0OjpmZXRjaEludG8oKSBpbnN0ZWFkLiAgSXQgY2FuJ3QgYmUgZGVjbGFyZWQgInByb3RlY3RlZCIKICAgICAqIGJlY2F1c2UgREJfcmVzdWx0IGlzIGEgc2VwYXJhdGUgb2JqZWN0LgogICAgICoKICAgICAqIEBwYXJhbSByZXNvdXJjZSAkcmVzdWx0ICAgIHRoZSBxdWVyeSByZXN1bHQgcmVzb3VyY2UKICAgICAqIEBwYXJhbSBhcnJheSAgICAkYXJyICAgICAgIHRoZSByZWZlcmVuY2VkIGFycmF5IHRvIHB1dCB0aGUgZGF0YSBpbgogICAgICogQHBhcmFtIGludCAgICAgICRmZXRjaG1vZGUgaG93IHRoZSByZXN1bHRpbmcgYXJyYXkgc2hvdWxkIGJlIGluZGV4ZWQKICAgICAqIEBwYXJhbSBpbnQgICAgICAkcm93bnVtICAgIHRoZSByb3cgbnVtYmVyIHRvIGZldGNoICgwID0gZmlyc3Qgcm93KQogICAgICoKICAgICAqIEByZXR1cm4gbWl4ZWQgIERCX09LIG9uIHN1Y2Nlc3MsIE5VTEwgd2hlbiB0aGUgZW5kIG9mIGEgcmVzdWx0IHNldCBpcwogICAgICogICAgICAgICAgICAgICAgIHJlYWNoZWQgb3Igb24gZmFpbHVyZQogICAgICoKICAgICAqIEBzZWUgREJfcmVzdWx0OjpmZXRjaEludG8oKQogICAgICovCiAgICBmdW5jdGlvbiBmZXRjaEludG8oJHJlc3VsdCwgJiRhcnIsICRmZXRjaG1vZGUsICRyb3dudW0gPSBudWxsKQogICAgewogICAgICAgICRhcnIgPSBhcnJheSgpOwogICAgICAgIGlmICgkcm93bnVtICE9PSBudWxsKSB7CiAgICAgICAgICAgICRyb3dudW0rKzsgLy8gT0RCQyBmaXJzdCByb3cgaXMgMQogICAgICAgICAgICBpZiAodmVyc2lvbl9jb21wYXJlKHBocHZlcnNpb24oKSwgJzQuMi4wJywgJ2dlJykpIHsKICAgICAgICAgICAgICAgICRjb2xzID0gQG9kYmNfZmV0Y2hfaW50bygkcmVzdWx0LCAkYXJyLCAkcm93bnVtKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICRjb2xzID0gQG9kYmNfZmV0Y2hfaW50bygkcmVzdWx0LCAkcm93bnVtLCAkYXJyKTsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRjb2xzID0gQG9kYmNfZmV0Y2hfaW50bygkcmVzdWx0LCAkYXJyKTsKICAgICAgICB9CiAgICAgICAgaWYgKCEkY29scykgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgaWYgKCRmZXRjaG1vZGUgIT09IERCX0ZFVENITU9ERV9PUkRFUkVEKSB7CiAgICAgICAgICAgIGZvciAoJGkgPSAwOyAkaSA8IGNvdW50KCRhcnIpOyAkaSsrKSB7CiAgICAgICAgICAgICAgICAkY29sTmFtZSA9IEBvZGJjX2ZpZWxkX25hbWUoJHJlc3VsdCwgJGkrMSk7CiAgICAgICAgICAgICAgICAkYVskY29sTmFtZV0gPSAkYXJyWyRpXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoJHRoaXMtPm9wdGlvbnNbJ3BvcnRhYmlsaXR5J10gJiBEQl9QT1JUQUJJTElUWV9MT1dFUkNBU0UpIHsKICAgICAgICAgICAgICAgICRhID0gYXJyYXlfY2hhbmdlX2tleV9jYXNlKCRhLCBDQVNFX0xPV0VSKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkYXJyID0gJGE7CiAgICAgICAgfQogICAgICAgIGlmICgkdGhpcy0+b3B0aW9uc1sncG9ydGFiaWxpdHknXSAmIERCX1BPUlRBQklMSVRZX1JUUklNKSB7CiAgICAgICAgICAgICR0aGlzLT5fcnRyaW1BcnJheVZhbHVlcygkYXJyKTsKICAgICAgICB9CiAgICAgICAgaWYgKCR0aGlzLT5vcHRpb25zWydwb3J0YWJpbGl0eSddICYgREJfUE9SVEFCSUxJVFlfTlVMTF9UT19FTVBUWSkgewogICAgICAgICAgICAkdGhpcy0+X2NvbnZlcnROdWxsQXJyYXlWYWx1ZXNUb0VtcHR5KCRhcnIpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gREJfT0s7CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgZnJlZVJlc3VsdCgpCgogICAgLyoqCiAgICAgKiBEZWxldGVzIHRoZSByZXN1bHQgc2V0IGFuZCBmcmVlcyB0aGUgbWVtb3J5IG9jY3VwaWVkIGJ5IHRoZSByZXN1bHQgc2V0CiAgICAgKgogICAgICogVGhpcyBtZXRob2QgaXMgbm90IG1lYW50IHRvIGJlIGNhbGxlZCBkaXJlY3RseS4gIFVzZQogICAgICogREJfcmVzdWx0OjpmcmVlKCkgaW5zdGVhZC4gIEl0IGNhbid0IGJlIGRlY2xhcmVkICJwcm90ZWN0ZWQiCiAgICAgKiBiZWNhdXNlIERCX3Jlc3VsdCBpcyBhIHNlcGFyYXRlIG9iamVjdC4KICAgICAqCiAgICAgKiBAcGFyYW0gcmVzb3VyY2UgJHJlc3VsdCAgUEhQJ3MgcXVlcnkgcmVzdWx0IHJlc291cmNlCiAgICAgKgogICAgICogQHJldHVybiBib29sICBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIGlmICRyZXN1bHQgaXMgaW52YWxpZAogICAgICoKICAgICAqIEBzZWUgREJfcmVzdWx0OjpmcmVlKCkKICAgICAqLwogICAgZnVuY3Rpb24gZnJlZVJlc3VsdCgkcmVzdWx0KQogICAgewogICAgICAgIHJldHVybiBpc19yZXNvdXJjZSgkcmVzdWx0KSA/IG9kYmNfZnJlZV9yZXN1bHQoJHJlc3VsdCkgOiBmYWxzZTsKICAgIH0KCiAgICAvLyB9fX0KICAgIC8vIHt7eyBudW1Db2xzKCkKCiAgICAvKioKICAgICAqIEdldHMgdGhlIG51bWJlciBvZiBjb2x1bW5zIGluIGEgcmVzdWx0IHNldAogICAgICoKICAgICAqIFRoaXMgbWV0aG9kIGlzIG5vdCBtZWFudCB0byBiZSBjYWxsZWQgZGlyZWN0bHkuICBVc2UKICAgICAqIERCX3Jlc3VsdDo6bnVtQ29scygpIGluc3RlYWQuICBJdCBjYW4ndCBiZSBkZWNsYXJlZCAicHJvdGVjdGVkIgogICAgICogYmVjYXVzZSBEQl9yZXN1bHQgaXMgYSBzZXBhcmF0ZSBvYmplY3QuCiAgICAgKgogICAgICogQHBhcmFtIHJlc291cmNlICRyZXN1bHQgIFBIUCdzIHF1ZXJ5IHJlc3VsdCByZXNvdXJjZQogICAgICoKICAgICAqIEByZXR1cm4gaW50ICB0aGUgbnVtYmVyIG9mIGNvbHVtbnMuICBBIERCX0Vycm9yIG9iamVjdCBvbiBmYWlsdXJlLgogICAgICoKICAgICAqIEBzZWUgREJfcmVzdWx0OjpudW1Db2xzKCkKICAgICAqLwogICAgZnVuY3Rpb24gbnVtQ29scygkcmVzdWx0KQogICAgewogICAgICAgICRjb2xzID0gQG9kYmNfbnVtX2ZpZWxkcygkcmVzdWx0KTsKICAgICAgICBpZiAoISRjb2xzKSB7CiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+b2RiY1JhaXNlRXJyb3IoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICRjb2xzOwogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IGFmZmVjdGVkUm93cygpCgogICAgLyoqCiAgICAgKiBEZXRlcm1pbmVzIHRoZSBudW1iZXIgb2Ygcm93cyBhZmZlY3RlZCBieSBhIGRhdGEgbWFuaXVwbGF0aW9uIHF1ZXJ5CiAgICAgKgogICAgICogMCBpcyByZXR1cm5lZCBmb3IgcXVlcmllcyB0aGF0IGRvbid0IG1hbmlwdWxhdGUgZGF0YS4KICAgICAqCiAgICAgKiBAcmV0dXJuIGludCAgdGhlIG51bWJlciBvZiByb3dzLiAgQSBEQl9FcnJvciBvYmplY3Qgb24gZmFpbHVyZS4KICAgICAqLwogICAgZnVuY3Rpb24gYWZmZWN0ZWRSb3dzKCkKICAgIHsKICAgICAgICBpZiAoZW1wdHkoJHRoaXMtPmFmZmVjdGVkKSkgeyAgLy8gSW4gY2FzZSBvZiBTRUxFQ1Qgc3RtcwogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICAgICAgJG5yb3dzID0gQG9kYmNfbnVtX3Jvd3MoJHRoaXMtPmFmZmVjdGVkKTsKICAgICAgICBpZiAoJG5yb3dzID09IC0xKSB7CiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+b2RiY1JhaXNlRXJyb3IoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICRucm93czsKICAgIH0KCiAgICAvLyB9fX0KICAgIC8vIHt7eyBudW1Sb3dzKCkKCiAgICAvKioKICAgICAqIEdldHMgdGhlIG51bWJlciBvZiByb3dzIGluIGEgcmVzdWx0IHNldAogICAgICoKICAgICAqIE5vdCBhbGwgT0RCQyBkcml2ZXJzIHN1cHBvcnQgdGhpcyBmdW5jdGlvbmFsaXR5LiAgSWYgdGhleSBkb24ndAogICAgICogYSBEQl9FcnJvciBvYmplY3QgZm9yIERCX0VSUk9SX1VOU1VQUE9SVEVEIGlzIHJldHVybmVkLgogICAgICoKICAgICAqIFRoaXMgbWV0aG9kIGlzIG5vdCBtZWFudCB0byBiZSBjYWxsZWQgZGlyZWN0bHkuICBVc2UKICAgICAqIERCX3Jlc3VsdDo6bnVtUm93cygpIGluc3RlYWQuICBJdCBjYW4ndCBiZSBkZWNsYXJlZCAicHJvdGVjdGVkIgogICAgICogYmVjYXVzZSBEQl9yZXN1bHQgaXMgYSBzZXBhcmF0ZSBvYmplY3QuCiAgICAgKgogICAgICogQHBhcmFtIHJlc291cmNlICRyZXN1bHQgIFBIUCdzIHF1ZXJ5IHJlc3VsdCByZXNvdXJjZQogICAgICoKICAgICAqIEByZXR1cm4gaW50ICB0aGUgbnVtYmVyIG9mIHJvd3MuICBBIERCX0Vycm9yIG9iamVjdCBvbiBmYWlsdXJlLgogICAgICoKICAgICAqIEBzZWUgREJfcmVzdWx0OjpudW1Sb3dzKCkKICAgICAqLwogICAgZnVuY3Rpb24gbnVtUm93cygkcmVzdWx0KQogICAgewogICAgICAgICRucm93cyA9IEBvZGJjX251bV9yb3dzKCRyZXN1bHQpOwogICAgICAgIGlmICgkbnJvd3MgPT0gLTEpIHsKICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5vZGJjUmFpc2VFcnJvcihEQl9FUlJPUl9VTlNVUFBPUlRFRCk7CiAgICAgICAgfQogICAgICAgIGlmICgkbnJvd3MgPT09IGZhbHNlKSB7CiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+b2RiY1JhaXNlRXJyb3IoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICRucm93czsKICAgIH0KCiAgICAvLyB9fX0KICAgIC8vIHt7eyBxdW90ZUlkZW50aWZpZXIoKQoKICAgIC8qKgogICAgICogUXVvdGVzIGEgc3RyaW5nIHNvIGl0IGNhbiBiZSBzYWZlbHkgdXNlZCBhcyBhIHRhYmxlIG9yIGNvbHVtbiBuYW1lCiAgICAgKgogICAgICogVXNlICdtc3NxbCcgYXMgdGhlIGRic3ludGF4IGluIHRoZSBEQiBEU04gb25seSBpZiB5b3UndmUgdW5jaGVja2VkCiAgICAgKiAiVXNlIEFOU0kgcXVvdGVkIGlkZW50aWZpZXJzIiB3aGVuIHNldHRpbmcgdXAgdGhlIE9EQkMgZGF0YSBzb3VyY2UuCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkc3RyICBpZGVudGlmaWVyIG5hbWUgdG8gYmUgcXVvdGVkCiAgICAgKgogICAgICogQHJldHVybiBzdHJpbmcgIHF1b3RlZCBpZGVudGlmaWVyIHN0cmluZwogICAgICoKICAgICAqIEBzZWUgREJfY29tbW9uOjpxdW90ZUlkZW50aWZpZXIoKQogICAgICogQHNpbmNlIE1ldGhvZCBhdmFpbGFibGUgc2luY2UgUmVsZWFzZSAxLjYuMAogICAgICovCiAgICBmdW5jdGlvbiBxdW90ZUlkZW50aWZpZXIoJHN0cikKICAgIHsKICAgICAgICBzd2l0Y2ggKCR0aGlzLT5kc25bJ2Ric3ludGF4J10pIHsKICAgICAgICAgICAgY2FzZSAnYWNjZXNzJzoKICAgICAgICAgICAgICAgIHJldHVybiAnWycgLiAkc3RyIC4gJ10nOwogICAgICAgICAgICBjYXNlICdtc3NxbCc6CiAgICAgICAgICAgIGNhc2UgJ3N5YmFzZSc6CiAgICAgICAgICAgICAgICByZXR1cm4gJ1snIC4gc3RyX3JlcGxhY2UoJ10nLCAnXV0nLCAkc3RyKSAuICddJzsKICAgICAgICAgICAgY2FzZSAnbXlzcWwnOgogICAgICAgICAgICBjYXNlICdteXNxbGknOgogICAgICAgICAgICAgICAgcmV0dXJuICdgJyAuICRzdHIgLiAnYCc7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICByZXR1cm4gJyInIC4gc3RyX3JlcGxhY2UoJyInLCAnIiInLCAkc3RyKSAuICciJzsKICAgICAgICB9CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgcXVvdGUoKQoKICAgIC8qKgogICAgICogQGRlcHJlY2F0ZWQgIERlcHJlY2F0ZWQgaW4gcmVsZWFzZSAxLjYuMAogICAgICogQGludGVybmFsCiAgICAgKi8KICAgIGZ1bmN0aW9uIHF1b3RlKCRzdHIpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5xdW90ZVNtYXJ0KCRzdHIpOwogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IG5leHRJZCgpCgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBuZXh0IGZyZWUgaWQgaW4gYSBzZXF1ZW5jZQogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgICRzZXFfbmFtZSAgbmFtZSBvZiB0aGUgc2VxdWVuY2UKICAgICAqIEBwYXJhbSBib29sZWFuICRvbmRlbWFuZCAgd2hlbiB0cnVlLCB0aGUgc2VxZW5jZSBpcyBhdXRvbWF0aWNhbGx5CiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVkIGlmIGl0IGRvZXMgbm90IGV4aXN0CiAgICAgKgogICAgICogQHJldHVybiBpbnQgIHRoZSBuZXh0IGlkIG51bWJlciBpbiB0aGUgc2VxdWVuY2UuCiAgICAgKiAgICAgICAgICAgICAgIEEgREJfRXJyb3Igb2JqZWN0IG9uIGZhaWx1cmUuCiAgICAgKgogICAgICogQHNlZSBEQl9jb21tb246Om5leHRJRCgpLCBEQl9jb21tb246OmdldFNlcXVlbmNlTmFtZSgpLAogICAgICogICAgICBEQl9vZGJjOjpjcmVhdGVTZXF1ZW5jZSgpLCBEQl9vZGJjOjpkcm9wU2VxdWVuY2UoKQogICAgICovCiAgICBmdW5jdGlvbiBuZXh0SWQoJHNlcV9uYW1lLCAkb25kZW1hbmQgPSB0cnVlKQogICAgewogICAgICAgICRzZXFuYW1lID0gJHRoaXMtPmdldFNlcXVlbmNlTmFtZSgkc2VxX25hbWUpOwogICAgICAgICRyZXBlYXQgPSAwOwogICAgICAgIGRvIHsKICAgICAgICAgICAgJHRoaXMtPnB1c2hFcnJvckhhbmRsaW5nKFBFQVJfRVJST1JfUkVUVVJOKTsKICAgICAgICAgICAgJHJlc3VsdCA9ICR0aGlzLT5xdWVyeSgidXBkYXRlICR7c2VxbmFtZX0gc2V0IGlkID0gaWQgKyAxIik7CiAgICAgICAgICAgICR0aGlzLT5wb3BFcnJvckhhbmRsaW5nKCk7CiAgICAgICAgICAgIGlmICgkb25kZW1hbmQgJiYgREI6OmlzRXJyb3IoJHJlc3VsdCkgJiYKICAgICAgICAgICAgICAgICRyZXN1bHQtPmdldENvZGUoKSA9PSBEQl9FUlJPUl9OT1NVQ0hUQUJMRSkgewogICAgICAgICAgICAgICAgJHJlcGVhdCA9IDE7CiAgICAgICAgICAgICAgICAkdGhpcy0+cHVzaEVycm9ySGFuZGxpbmcoUEVBUl9FUlJPUl9SRVRVUk4pOwogICAgICAgICAgICAgICAgJHJlc3VsdCA9ICR0aGlzLT5jcmVhdGVTZXF1ZW5jZSgkc2VxX25hbWUpOwogICAgICAgICAgICAgICAgJHRoaXMtPnBvcEVycm9ySGFuZGxpbmcoKTsKICAgICAgICAgICAgICAgIGlmIChEQjo6aXNFcnJvcigkcmVzdWx0KSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+cmFpc2VFcnJvcigkcmVzdWx0KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRyZXN1bHQgPSAkdGhpcy0+cXVlcnkoImluc2VydCBpbnRvICR7c2VxbmFtZX0gKGlkKSB2YWx1ZXMoMCkiKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICRyZXBlYXQgPSAwOwogICAgICAgICAgICB9CiAgICAgICAgfSB3aGlsZSAoJHJlcGVhdCk7CgogICAgICAgIGlmIChEQjo6aXNFcnJvcigkcmVzdWx0KSkgewogICAgICAgICAgICByZXR1cm4gJHRoaXMtPnJhaXNlRXJyb3IoJHJlc3VsdCk7CiAgICAgICAgfQoKICAgICAgICAkcmVzdWx0ID0gJHRoaXMtPnF1ZXJ5KCJzZWxlY3QgaWQgZnJvbSAke3NlcW5hbWV9Iik7CiAgICAgICAgaWYgKERCOjppc0Vycm9yKCRyZXN1bHQpKSB7CiAgICAgICAgICAgIHJldHVybiAkcmVzdWx0OwogICAgICAgIH0KCiAgICAgICAgJHJvdyA9ICRyZXN1bHQtPmZldGNoUm93KERCX0ZFVENITU9ERV9PUkRFUkVEKTsKICAgICAgICBpZiAoREI6OmlzRXJyb3IoJHJvdyB8fCAhJHJvdykpIHsKICAgICAgICAgICAgcmV0dXJuICRyb3c7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJHJvd1swXTsKICAgIH0KCiAgICAvKioKICAgICAqIENyZWF0ZXMgYSBuZXcgc2VxdWVuY2UKICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICRzZXFfbmFtZSAgbmFtZSBvZiB0aGUgbmV3IHNlcXVlbmNlCiAgICAgKgogICAgICogQHJldHVybiBpbnQgIERCX09LIG9uIHN1Y2Nlc3MuICBBIERCX0Vycm9yIG9iamVjdCBvbiBmYWlsdXJlLgogICAgICoKICAgICAqIEBzZWUgREJfY29tbW9uOjpjcmVhdGVTZXF1ZW5jZSgpLCBEQl9jb21tb246OmdldFNlcXVlbmNlTmFtZSgpLAogICAgICogICAgICBEQl9vZGJjOjpuZXh0SUQoKSwgREJfb2RiYzo6ZHJvcFNlcXVlbmNlKCkKICAgICAqLwogICAgZnVuY3Rpb24gY3JlYXRlU2VxdWVuY2UoJHNlcV9uYW1lKQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+cXVlcnkoJ0NSRUFURSBUQUJMRSAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICR0aGlzLT5nZXRTZXF1ZW5jZU5hbWUoJHNlcV9uYW1lKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAnIChpZCBpbnRlZ2VyIE5PVCBOVUxMLCcKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJyBQUklNQVJZIEtFWShpZCkpJyk7CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgZHJvcFNlcXVlbmNlKCkKCiAgICAvKioKICAgICAqIERlbGV0ZXMgYSBzZXF1ZW5jZQogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgJHNlcV9uYW1lICBuYW1lIG9mIHRoZSBzZXF1ZW5jZSB0byBiZSBkZWxldGVkCiAgICAgKgogICAgICogQHJldHVybiBpbnQgIERCX09LIG9uIHN1Y2Nlc3MuICBBIERCX0Vycm9yIG9iamVjdCBvbiBmYWlsdXJlLgogICAgICoKICAgICAqIEBzZWUgREJfY29tbW9uOjpkcm9wU2VxdWVuY2UoKSwgREJfY29tbW9uOjpnZXRTZXF1ZW5jZU5hbWUoKSwKICAgICAqICAgICAgREJfb2RiYzo6bmV4dElEKCksIERCX29kYmM6OmNyZWF0ZVNlcXVlbmNlKCkKICAgICAqLwogICAgZnVuY3Rpb24gZHJvcFNlcXVlbmNlKCRzZXFfbmFtZSkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnF1ZXJ5KCdEUk9QIFRBQkxFICcgLiAkdGhpcy0+Z2V0U2VxdWVuY2VOYW1lKCRzZXFfbmFtZSkpOwogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IGF1dG9Db21taXQoKQoKICAgIC8qKgogICAgICogRW5hYmxlcyBvciBkaXNhYmxlcyBhdXRvbWF0aWMgY29tbWl0cwogICAgICoKICAgICAqIEBwYXJhbSBib29sICRvbm9mZiAgdHJ1ZSB0dXJucyBpdCBvbiwgZmFsc2UgdHVybnMgaXQgb2ZmCiAgICAgKgogICAgICogQHJldHVybiBpbnQgIERCX09LIG9uIHN1Y2Nlc3MuICBBIERCX0Vycm9yIG9iamVjdCBpZiB0aGUgZHJpdmVyCiAgICAgKiAgICAgICAgICAgICAgIGRvZXNuJ3Qgc3VwcG9ydCBhdXRvLWNvbW1pdHRpbmcgdHJhbnNhY3Rpb25zLgogICAgICovCiAgICBmdW5jdGlvbiBhdXRvQ29tbWl0KCRvbm9mZiA9IGZhbHNlKQogICAgewogICAgICAgIGlmICghQG9kYmNfYXV0b2NvbW1pdCgkdGhpcy0+Y29ubmVjdGlvbiwgJG9ub2ZmKSkgewogICAgICAgICAgICByZXR1cm4gJHRoaXMtPm9kYmNSYWlzZUVycm9yKCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBEQl9PSzsKICAgIH0KCiAgICAvLyB9fX0KICAgIC8vIHt7eyBjb21taXQoKQoKICAgIC8qKgogICAgICogQ29tbWl0cyB0aGUgY3VycmVudCB0cmFuc2FjdGlvbgogICAgICoKICAgICAqIEByZXR1cm4gaW50ICBEQl9PSyBvbiBzdWNjZXNzLiAgQSBEQl9FcnJvciBvYmplY3Qgb24gZmFpbHVyZS4KICAgICAqLwogICAgZnVuY3Rpb24gY29tbWl0KCkKICAgIHsKICAgICAgICBpZiAoIUBvZGJjX2NvbW1pdCgkdGhpcy0+Y29ubmVjdGlvbikpIHsKICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5vZGJjUmFpc2VFcnJvcigpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gREJfT0s7CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgcm9sbGJhY2soKQoKICAgIC8qKgogICAgICogUmV2ZXJ0cyB0aGUgY3VycmVudCB0cmFuc2FjdGlvbgogICAgICoKICAgICAqIEByZXR1cm4gaW50ICBEQl9PSyBvbiBzdWNjZXNzLiAgQSBEQl9FcnJvciBvYmplY3Qgb24gZmFpbHVyZS4KICAgICAqLwogICAgZnVuY3Rpb24gcm9sbGJhY2soKQogICAgewogICAgICAgIGlmICghQG9kYmNfcm9sbGJhY2soJHRoaXMtPmNvbm5lY3Rpb24pKSB7CiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+b2RiY1JhaXNlRXJyb3IoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIERCX09LOwogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IG9kYmNSYWlzZUVycm9yKCkKCiAgICAvKioKICAgICAqIFByb2R1Y2VzIGEgREJfRXJyb3Igb2JqZWN0IHJlZ2FyZGluZyB0aGUgY3VycmVudCBwcm9ibGVtCiAgICAgKgogICAgICogQHBhcmFtIGludCAkZXJybm8gIGlmIHRoZSBlcnJvciBpcyBiZWluZyBtYW51YWxseSByYWlzZWQgcGFzcyBhCiAgICAgKiAgICAgICAgICAgICAgICAgICAgIERCX0VSUk9SKiBjb25zdGFudCBoZXJlLiAgSWYgdGhpcyBpc24ndCBwYXNzZWQKICAgICAqICAgICAgICAgICAgICAgICAgICAgdGhlIGVycm9yIGluZm9ybWF0aW9uIGdhdGhlcmVkIGZyb20gdGhlIERCTVMuCiAgICAgKgogICAgICogQHJldHVybiBvYmplY3QgIHRoZSBEQl9FcnJvciBvYmplY3QKICAgICAqCiAgICAgKiBAc2VlIERCX2NvbW1vbjo6cmFpc2VFcnJvcigpLAogICAgICogICAgICBEQl9vZGJjOjplcnJvck5hdGl2ZSgpLCBEQl9jb21tb246OmVycm9yQ29kZSgpCiAgICAgKi8KICAgIGZ1bmN0aW9uIG9kYmNSYWlzZUVycm9yKCRlcnJubyA9IG51bGwpCiAgICB7CiAgICAgICAgaWYgKCRlcnJubyA9PT0gbnVsbCkgewogICAgICAgICAgICBzd2l0Y2ggKCR0aGlzLT5kYnN5bnRheCkgewogICAgICAgICAgICAgICAgY2FzZSAnYWNjZXNzJzoKICAgICAgICAgICAgICAgICAgICBpZiAoJHRoaXMtPm9wdGlvbnNbJ3BvcnRhYmlsaXR5J10gJiBEQl9QT1JUQUJJTElUWV9FUlJPUlMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmVycm9yY29kZV9tYXBbJzA3MDAxJ10gPSBEQl9FUlJPUl9OT1NVQ0hGSUVMRDsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBEb2luZyB0aGlzIGluIGNhc2UgbW9kZSBjaGFuZ2VzIGR1cmluZyBydW50aW1lLgogICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+ZXJyb3Jjb2RlX21hcFsnMDcwMDEnXSA9IERCX0VSUk9SX01JU01BVENIOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgJG5hdGl2ZV9jb2RlID0gb2RiY19lcnJvcigkdGhpcy0+Y29ubmVjdGlvbik7CgogICAgICAgICAgICAgICAgICAgIC8vIFMxMDAwIGlzIGZvciAiR2VuZXJhbCBFcnJvci4iICBMZXQncyBiZSBtb3JlIHNwZWNpZmljLgogICAgICAgICAgICAgICAgICAgIGlmICgkbmF0aXZlX2NvZGUgPT0gJ1MxMDAwJykgewogICAgICAgICAgICAgICAgICAgICAgICAkZXJyb3Jtc2cgPSBvZGJjX2Vycm9ybXNnKCR0aGlzLT5jb25uZWN0aW9uKTsKICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljICRlcnJvcl9yZWdleHBzOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzc2V0KCRlcnJvcl9yZWdleHBzKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGVycm9yX3JlZ2V4cHMgPSBhcnJheSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2luY2x1ZGVzIHJlbGF0ZWQgcmVjb3Jkcy4kL2knICA9PiBEQl9FUlJPUl9DT05TVFJBSU5ULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvY2Fubm90IGNvbnRhaW4gYSBOdWxsIHZhbHVlL2knID0+IERCX0VSUk9SX0NPTlNUUkFJTlRfTk9UX05VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRlcnJvcl9yZWdleHBzIGFzICRyZWdleHAgPT4gJGNvZGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVnX21hdGNoKCRyZWdleHAsICRlcnJvcm1zZykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPnJhaXNlRXJyb3IoJGNvZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBudWxsLCBudWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJG5hdGl2ZV9jb2RlIC4gJyAnIC4gJGVycm9ybXNnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAkZXJybm8gPSBEQl9FUlJPUjsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAkZXJybm8gPSAkdGhpcy0+ZXJyb3JDb2RlKCRuYXRpdmVfY29kZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAkZXJybm8gPSAkdGhpcy0+ZXJyb3JDb2RlKG9kYmNfZXJyb3IoJHRoaXMtPmNvbm5lY3Rpb24pKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gJHRoaXMtPnJhaXNlRXJyb3IoJGVycm5vLCBudWxsLCBudWxsLCBudWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+ZXJyb3JOYXRpdmUoKSk7CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgZXJyb3JOYXRpdmUoKQoKICAgIC8qKgogICAgICogR2V0cyB0aGUgREJNUycgbmF0aXZlIGVycm9yIGNvZGUgYW5kIG1lc3NhZ2UgcHJvZHVjZWQgYnkgdGhlIGxhc3QgcXVlcnkKICAgICAqCiAgICAgKiBAcmV0dXJuIHN0cmluZyAgdGhlIERCTVMnIGVycm9yIGNvZGUgYW5kIG1lc3NhZ2UKICAgICAqLwogICAgZnVuY3Rpb24gZXJyb3JOYXRpdmUoKQogICAgewogICAgICAgIGlmICghaXNfcmVzb3VyY2UoJHRoaXMtPmNvbm5lY3Rpb24pKSB7CiAgICAgICAgICAgIHJldHVybiBAb2RiY19lcnJvcigpIC4gJyAnIC4gQG9kYmNfZXJyb3Jtc2coKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIEBvZGJjX2Vycm9yKCR0aGlzLT5jb25uZWN0aW9uKSAuICcgJyAuIEBvZGJjX2Vycm9ybXNnKCR0aGlzLT5jb25uZWN0aW9uKTsKICAgIH0KCiAgICAvLyB9fX0KICAgIC8vIHt7eyB0YWJsZUluZm8oKQoKICAgIC8qKgogICAgICogUmV0dXJucyBpbmZvcm1hdGlvbiBhYm91dCBhIHRhYmxlIG9yIGEgcmVzdWx0IHNldAogICAgICoKICAgICAqIEBwYXJhbSBvYmplY3R8c3RyaW5nICAkcmVzdWx0ICBEQl9yZXN1bHQgb2JqZWN0IGZyb20gYSBxdWVyeSBvciBhCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBjb250YWluaW5nIHRoZSBuYW1lIG9mIGEgdGFibGUuCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdoaWxlIHRoaXMgYWxzbyBhY2NlcHRzIGEgcXVlcnkgcmVzdWx0CiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlIGlkZW50aWZpZXIsIHRoaXMgYmVoYXZpb3IgaXMKICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwcmVjYXRlZC4KICAgICAqIEBwYXJhbSBpbnQgICAgICAgICAgICAkbW9kZSAgICBhIHZhbGlkIHRhYmxlSW5mbyBtb2RlCiAgICAgKgogICAgICogQHJldHVybiBhcnJheSAgYW4gYXNzb2NpYXRpdmUgYXJyYXkgd2l0aCB0aGUgaW5mb3JtYXRpb24gcmVxdWVzdGVkLgogICAgICogICAgICAgICAgICAgICAgIEEgREJfRXJyb3Igb2JqZWN0IG9uIGZhaWx1cmUuCiAgICAgKgogICAgICogQHNlZSBEQl9jb21tb246OnRhYmxlSW5mbygpCiAgICAgKiBAc2luY2UgTWV0aG9kIGF2YWlsYWJsZSBzaW5jZSBSZWxlYXNlIDEuNy4wCiAgICAgKi8KICAgIGZ1bmN0aW9uIHRhYmxlSW5mbygkcmVzdWx0LCAkbW9kZSA9IG51bGwpCiAgICB7CiAgICAgICAgaWYgKGlzX3N0cmluZygkcmVzdWx0KSkgewogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBQcm9iYWJseSByZWNlaXZlZCBhIHRhYmxlIG5hbWUuCiAgICAgICAgICAgICAqIENyZWF0ZSBhIHJlc3VsdCByZXNvdXJjZSBpZGVudGlmaWVyLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgJGlkID0gQG9kYmNfZXhlYygkdGhpcy0+Y29ubmVjdGlvbiwgIlNFTEVDVCAqIEZST00gJHJlc3VsdCIpOwogICAgICAgICAgICBpZiAoISRpZCkgewogICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5vZGJjUmFpc2VFcnJvcigpOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRnb3Rfc3RyaW5nID0gdHJ1ZTsKICAgICAgICB9IGVsc2VpZiAoaXNzZXQoJHJlc3VsdC0+cmVzdWx0KSkgewogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBQcm9iYWJseSByZWNlaXZlZCBhIHJlc3VsdCBvYmplY3QuCiAgICAgICAgICAgICAqIEV4dHJhY3QgdGhlIHJlc3VsdCByZXNvdXJjZSBpZGVudGlmaWVyLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgJGlkID0gJHJlc3VsdC0+cmVzdWx0OwogICAgICAgICAgICAkZ290X3N0cmluZyA9IGZhbHNlOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIFByb2JhYmx5IHJlY2VpdmVkIGEgcmVzdWx0IHJlc291cmNlIGlkZW50aWZpZXIuCiAgICAgICAgICAgICAqIENvcHkgaXQuCiAgICAgICAgICAgICAqIERlcHJlY2F0ZWQuICBIZXJlIGZvciBjb21wYXRpYmlsaXR5IG9ubHkuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICAkaWQgPSAkcmVzdWx0OwogICAgICAgICAgICAkZ290X3N0cmluZyA9IGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgaWYgKCFpc19yZXNvdXJjZSgkaWQpKSB7CiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+b2RiY1JhaXNlRXJyb3IoREJfRVJST1JfTkVFRF9NT1JFX0RBVEEpOwogICAgICAgIH0KCiAgICAgICAgaWYgKCR0aGlzLT5vcHRpb25zWydwb3J0YWJpbGl0eSddICYgREJfUE9SVEFCSUxJVFlfTE9XRVJDQVNFKSB7CiAgICAgICAgICAgICRjYXNlX2Z1bmMgPSAnc3RydG9sb3dlcic7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJGNhc2VfZnVuYyA9ICdzdHJ2YWwnOwogICAgICAgIH0KCiAgICAgICAgJGNvdW50ID0gQG9kYmNfbnVtX2ZpZWxkcygkaWQpOwogICAgICAgICRyZXMgICA9IGFycmF5KCk7CgogICAgICAgIGlmICgkbW9kZSkgewogICAgICAgICAgICAkcmVzWydudW1fZmllbGRzJ10gPSAkY291bnQ7CiAgICAgICAgfQoKICAgICAgICBmb3IgKCRpID0gMDsgJGkgPCAkY291bnQ7ICRpKyspIHsKICAgICAgICAgICAgJGNvbCA9ICRpICsgMTsKICAgICAgICAgICAgJHJlc1skaV0gPSBhcnJheSgKICAgICAgICAgICAgICAgICd0YWJsZScgPT4gJGdvdF9zdHJpbmcgPyAkY2FzZV9mdW5jKCRyZXN1bHQpIDogJycsCiAgICAgICAgICAgICAgICAnbmFtZScgID0+ICRjYXNlX2Z1bmMoQG9kYmNfZmllbGRfbmFtZSgkaWQsICRjb2wpKSwKICAgICAgICAgICAgICAgICd0eXBlJyAgPT4gQG9kYmNfZmllbGRfdHlwZSgkaWQsICRjb2wpLAogICAgICAgICAgICAgICAgJ2xlbicgICA9PiBAb2RiY19maWVsZF9sZW4oJGlkLCAkY29sKSwKICAgICAgICAgICAgICAgICdmbGFncycgPT4gJycsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICgkbW9kZSAmIERCX1RBQkxFSU5GT19PUkRFUikgewogICAgICAgICAgICAgICAgJHJlc1snb3JkZXInXVskcmVzWyRpXVsnbmFtZSddXSA9ICRpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkbW9kZSAmIERCX1RBQkxFSU5GT19PUkRFUlRBQkxFKSB7CiAgICAgICAgICAgICAgICAkcmVzWydvcmRlcnRhYmxlJ11bJHJlc1skaV1bJ3RhYmxlJ11dWyRyZXNbJGldWyduYW1lJ11dID0gJGk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIGZyZWUgdGhlIHJlc3VsdCBvbmx5IGlmIHdlIHdlcmUgY2FsbGVkIG9uIGEgdGFibGUKICAgICAgICBpZiAoJGdvdF9zdHJpbmcpIHsKICAgICAgICAgICAgQG9kYmNfZnJlZV9yZXN1bHQoJGlkKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICRyZXM7CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgZ2V0U3BlY2lhbFF1ZXJ5KCkKCiAgICAvKioKICAgICAqIE9idGFpbnMgdGhlIHF1ZXJ5IHN0cmluZyBuZWVkZWQgZm9yIGxpc3RpbmcgYSBnaXZlbiB0eXBlIG9mIG9iamVjdHMKICAgICAqCiAgICAgKiBUaGFua3MgdG8gc3ltYm9sMUBnbWFpbC5jb20gYW5kIFBoaWxpcHBlLkphdXNpb25zQDExYWJhY3VzLmNvbS4KICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICR0eXBlICB0aGUga2luZCBvZiBvYmplY3RzIHlvdSB3YW50IHRvIHJldHJpZXZlCiAgICAgKgogICAgICogQHJldHVybiBzdHJpbmcgIHRoZSBsaXN0IG9mIG9iamVjdHMgcmVxdWVzdGVkCiAgICAgKgogICAgICogQGFjY2VzcyBwcm90ZWN0ZWQKICAgICAqIEBzZWUgREJfY29tbW9uOjpnZXRMaXN0T2YoKQogICAgICogQHNpbmNlIE1ldGhvZCBhdmFpbGFibGUgc2luY2UgUmVsZWFzZSAxLjcuMAogICAgICovCiAgICBmdW5jdGlvbiBnZXRTcGVjaWFsUXVlcnkoJHR5cGUpCiAgICB7CiAgICAgICAgc3dpdGNoICgkdHlwZSkgewogICAgICAgICAgICBjYXNlICdkYXRhYmFzZXMnOgogICAgICAgICAgICAgICAgaWYgKCFmdW5jdGlvbl9leGlzdHMoJ29kYmNfZGF0YV9zb3VyY2UnKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJHJlcyA9IEBvZGJjX2RhdGFfc291cmNlKCR0aGlzLT5jb25uZWN0aW9uLCBTUUxfRkVUQ0hfRklSU1QpOwogICAgICAgICAgICAgICAgaWYgKGlzX2FycmF5KCRyZXMpKSB7CiAgICAgICAgICAgICAgICAgICAgJG91dCA9IGFycmF5KCRyZXNbJ3NlcnZlciddKTsKICAgICAgICAgICAgICAgICAgICB3aGlsZSgkcmVzID0gQG9kYmNfZGF0YV9zb3VyY2UoJHRoaXMtPmNvbm5lY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNRTF9GRVRDSF9ORVhUKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICRvdXRbXSA9ICRyZXNbJ3NlcnZlciddOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gJG91dDsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5vZGJjUmFpc2VFcnJvcigpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ3RhYmxlcyc6CiAgICAgICAgICAgIGNhc2UgJ3NjaGVtYS50YWJsZXMnOgogICAgICAgICAgICAgICAgJGtlZXAgPSAnVEFCTEUnOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ3ZpZXdzJzoKICAgICAgICAgICAgICAgICRrZWVwID0gJ1ZJRVcnOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CgogICAgICAgIC8qCiAgICAgICAgICogUmVtb3Zpbmcgbm9uLWNvbmZvcm1pbmcgaXRlbXMgaW4gdGhlIHdoaWxlIGxvb3AgcmF0aGVyIHRoYW4KICAgICAgICAgKiBpbiB0aGUgb2RiY190YWJsZXMoKSBjYWxsIGJlY2F1c2Ugc29tZSBiYWNrZW5kcyBjaG9rZSBvbiB0aGlzOgogICAgICAgICAqICAgICBvZGJjX3RhYmxlcygkdGhpcy0+Y29ubmVjdGlvbiwgJycsICcnLCAnJywgJ1RBQkxFJykKICAgICAgICAgKi8KICAgICAgICAkcmVzICA9IEBvZGJjX3RhYmxlcygkdGhpcy0+Y29ubmVjdGlvbik7CiAgICAgICAgaWYgKCEkcmVzKSB7CiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+b2RiY1JhaXNlRXJyb3IoKTsKICAgICAgICB9CiAgICAgICAgJG91dCA9IGFycmF5KCk7CiAgICAgICAgd2hpbGUgKCRyb3cgPSBvZGJjX2ZldGNoX2FycmF5KCRyZXMpKSB7CiAgICAgICAgICAgIGlmICgkcm93WydUQUJMRV9UWVBFJ10gIT0gJGtlZXApIHsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkdHlwZSA9PSAnc2NoZW1hLnRhYmxlcycpIHsKICAgICAgICAgICAgICAgICRvdXRbXSA9ICRyb3dbJ1RBQkxFX1NDSEVNJ10gLiAnLicgLiAkcm93WydUQUJMRV9OQU1FJ107CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkb3V0W10gPSAkcm93WydUQUJMRV9OQU1FJ107CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuICRvdXQ7CiAgICB9CgogICAgLy8gfX19Cgp9CgovKgogKiBMb2NhbCB2YXJpYWJsZXM6CiAqIHRhYi13aWR0aDogNAogKiBjLWJhc2ljLW9mZnNldDogNAogKiBFbmQ6CiAqLwoKPz4K]]></data>
	</file>
	<file>
	  <filename>/lib/pear/DB/pgsql.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qIHZpbTogc2V0IGV4cGFuZHRhYiB0YWJzdG9wPTQgc2hpZnR3aWR0aD00IHNvZnR0YWJzdG9wPTQ6ICovCgovKioKICogVGhlIFBFQVIgREIgZHJpdmVyIGZvciBQSFAncyBwZ3NxbCBleHRlbnNpb24KICogZm9yIGludGVyYWN0aW5nIHdpdGggUG9zdGdyZVNRTCBkYXRhYmFzZXMKICoKICogUEhQIHZlcnNpb25zIDQgYW5kIDUKICoKICogTElDRU5TRTogVGhpcyBzb3VyY2UgZmlsZSBpcyBzdWJqZWN0IHRvIHZlcnNpb24gMy4wIG9mIHRoZSBQSFAgbGljZW5zZQogKiB0aGF0IGlzIGF2YWlsYWJsZSB0aHJvdWdoIHRoZSB3b3JsZC13aWRlLXdlYiBhdCB0aGUgZm9sbG93aW5nIFVSSToKICogaHR0cDovL3d3dy5waHAubmV0L2xpY2Vuc2UvM18wLnR4dC4gIElmIHlvdSBkaWQgbm90IHJlY2VpdmUgYSBjb3B5IG9mCiAqIHRoZSBQSFAgTGljZW5zZSBhbmQgYXJlIHVuYWJsZSB0byBvYnRhaW4gaXQgdGhyb3VnaCB0aGUgd2ViLCBwbGVhc2UKICogc2VuZCBhIG5vdGUgdG8gbGljZW5zZUBwaHAubmV0IHNvIHdlIGNhbiBtYWlsIHlvdSBhIGNvcHkgaW1tZWRpYXRlbHkuCiAqCiAqIEBjYXRlZ29yeSAgIERhdGFiYXNlCiAqIEBwYWNrYWdlICAgIERCCiAqIEBhdXRob3IgICAgIFJ1aSBIaXJva2F3YSA8aGlyb2thd2FAcGhwLm5ldD4KICogQGF1dGhvciAgICAgU3RpZyBCYWtrZW4gPHNzYkBwaHAubmV0PgogKiBAYXV0aG9yICAgICBEYW5pZWwgQ29udmlzc29yIDxkYW5pZWxjQHBocC5uZXQ+CiAqIEBjb3B5cmlnaHQgIDE5OTctMjAwNSBUaGUgUEhQIEdyb3VwCiAqIEBsaWNlbnNlICAgIGh0dHA6Ly93d3cucGhwLm5ldC9saWNlbnNlLzNfMC50eHQgIFBIUCBMaWNlbnNlIDMuMAogKiBAdmVyc2lvbiAgICBDVlM6ICRJZDogcGdzcWwucGhwLHYgMS4xMzYgMjAwNy8wNi8yOSAxMzoxMDo0MCBhaGFydmV5IEV4cCAkCiAqIEBsaW5rICAgICAgIGh0dHA6Ly9wZWFyLnBocC5uZXQvcGFja2FnZS9EQgogKi8KCi8qKgogKiBPYnRhaW4gdGhlIERCX2NvbW1vbiBjbGFzcyBzbyBpdCBjYW4gYmUgZXh0ZW5kZWQgZnJvbQogKi8KcmVxdWlyZV9vbmNlICdEQi9jb21tb24ucGhwJzsKCi8qKgogKiBUaGUgbWV0aG9kcyBQRUFSIERCIHVzZXMgdG8gaW50ZXJhY3Qgd2l0aCBQSFAncyBwZ3NxbCBleHRlbnNpb24KICogZm9yIGludGVyYWN0aW5nIHdpdGggUG9zdGdyZVNRTCBkYXRhYmFzZXMKICoKICogVGhlc2UgbWV0aG9kcyBvdmVybG9hZCB0aGUgb25lcyBkZWNsYXJlZCBpbiBEQl9jb21tb24uCiAqCiAqIEBjYXRlZ29yeSAgIERhdGFiYXNlCiAqIEBwYWNrYWdlICAgIERCCiAqIEBhdXRob3IgICAgIFJ1aSBIaXJva2F3YSA8aGlyb2thd2FAcGhwLm5ldD4KICogQGF1dGhvciAgICAgU3RpZyBCYWtrZW4gPHNzYkBwaHAubmV0PgogKiBAYXV0aG9yICAgICBEYW5pZWwgQ29udmlzc29yIDxkYW5pZWxjQHBocC5uZXQ+CiAqIEBjb3B5cmlnaHQgIDE5OTctMjAwNSBUaGUgUEhQIEdyb3VwCiAqIEBsaWNlbnNlICAgIGh0dHA6Ly93d3cucGhwLm5ldC9saWNlbnNlLzNfMC50eHQgIFBIUCBMaWNlbnNlIDMuMAogKiBAdmVyc2lvbiAgICBSZWxlYXNlOiAxLjcuMTIKICogQGxpbmsgICAgICAgaHR0cDovL3BlYXIucGhwLm5ldC9wYWNrYWdlL0RCCiAqLwpjbGFzcyBEQl9wZ3NxbCBleHRlbmRzIERCX2NvbW1vbgp7CiAgICAvLyB7e3sgcHJvcGVydGllcwoKICAgIC8qKgogICAgICogVGhlIERCIGRyaXZlciB0eXBlIChteXNxbCwgb2NpOCwgb2RiYywgZXRjLikKICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHZhciAkcGhwdHlwZSA9ICdwZ3NxbCc7CgogICAgLyoqCiAgICAgKiBUaGUgZGF0YWJhc2Ugc3ludGF4IHZhcmlhbnQgdG8gYmUgdXNlZCAoZGIyLCBhY2Nlc3MsIGV0Yy4pLCBpZiBhbnkKICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHZhciAkZGJzeW50YXggPSAncGdzcWwnOwoKICAgIC8qKgogICAgICogVGhlIGNhcGFiaWxpdGllcyBvZiB0aGlzIERCIGltcGxlbWVudGF0aW9uCiAgICAgKgogICAgICogVGhlICduZXdfbGluaycgZWxlbWVudCBjb250YWlucyB0aGUgUEhQIHZlcnNpb24gdGhhdCBmaXJzdCBwcm92aWRlZAogICAgICogbmV3X2xpbmsgc3VwcG9ydCBmb3IgdGhpcyBEQk1TLiAgQ29udGFpbnMgZmFsc2UgaWYgaXQncyB1bnN1cHBvcnRlZC4KICAgICAqCiAgICAgKiBNZWFuaW5nIG9mIHRoZSAnbGltaXQnIGVsZW1lbnQ6CiAgICAgKiAgICsgJ2VtdWxhdGUnID0gZW11bGF0ZSB3aXRoIGZldGNoIHJvdyBieSBudW1iZXIKICAgICAqICAgKyAnYWx0ZXInICAgPSBhbHRlciB0aGUgcXVlcnkKICAgICAqICAgKyBmYWxzZSAgICAgPSBza2lwIHJvd3MKICAgICAqCiAgICAgKiBAdmFyIGFycmF5CiAgICAgKi8KICAgIHZhciAkZmVhdHVyZXMgPSBhcnJheSgKICAgICAgICAnbGltaXQnICAgICAgICAgPT4gJ2FsdGVyJywKICAgICAgICAnbmV3X2xpbmsnICAgICAgPT4gJzQuMy4wJywKICAgICAgICAnbnVtcm93cycgICAgICAgPT4gdHJ1ZSwKICAgICAgICAncGNvbm5lY3QnICAgICAgPT4gdHJ1ZSwKICAgICAgICAncHJlcGFyZScgICAgICAgPT4gZmFsc2UsCiAgICAgICAgJ3NzbCcgICAgICAgICAgID0+IHRydWUsCiAgICAgICAgJ3RyYW5zYWN0aW9ucycgID0+IHRydWUsCiAgICApOwoKICAgIC8qKgogICAgICogQSBtYXBwaW5nIG9mIG5hdGl2ZSBlcnJvciBjb2RlcyB0byBEQiBlcnJvciBjb2RlcwogICAgICogQHZhciBhcnJheQogICAgICovCiAgICB2YXIgJGVycm9yY29kZV9tYXAgPSBhcnJheSgKICAgICk7CgogICAgLyoqCiAgICAgKiBUaGUgcmF3IGRhdGFiYXNlIGNvbm5lY3Rpb24gY3JlYXRlZCBieSBQSFAKICAgICAqIEB2YXIgcmVzb3VyY2UKICAgICAqLwogICAgdmFyICRjb25uZWN0aW9uOwoKICAgIC8qKgogICAgICogVGhlIERTTiBpbmZvcm1hdGlvbiBmb3IgY29ubmVjdGluZyB0byBhIGRhdGFiYXNlCiAgICAgKiBAdmFyIGFycmF5CiAgICAgKi8KICAgIHZhciAkZHNuID0gYXJyYXkoKTsKCgogICAgLyoqCiAgICAgKiBTaG91bGQgZGF0YSBtYW5pcHVsYXRpb24gcXVlcmllcyBiZSBjb21taXR0ZWQgYXV0b21hdGljYWxseT8KICAgICAqIEB2YXIgYm9vbAogICAgICogQGFjY2VzcyBwcml2YXRlCiAgICAgKi8KICAgIHZhciAkYXV0b2NvbW1pdCA9IHRydWU7CgogICAgLyoqCiAgICAgKiBUaGUgcXVhbnRpdHkgb2YgdHJhbnNhY3Rpb25zIGJlZ3VuCiAgICAgKgogICAgICoge0BpbnRlcm5hbCAgV2hpbGUgdGhpcyBpcyBwcml2YXRlLCBpdCBjYW4ndCBhY3R1YWxseSBiZSBkZXNpZ25hdGVkCiAgICAgKiBwcml2YXRlIGluIFBIUCA1IGJlY2F1c2UgaXQgaXMgZGlyZWN0bHkgYWNjZXNzZWQgaW4gdGhlIHRlc3Qgc3VpdGUufX0KICAgICAqCiAgICAgKiBAdmFyIGludGVnZXIKICAgICAqIEBhY2Nlc3MgcHJpdmF0ZQogICAgICovCiAgICB2YXIgJHRyYW5zYWN0aW9uX29wY291bnQgPSAwOwoKICAgIC8qKgogICAgICogVGhlIG51bWJlciBvZiByb3dzIGFmZmVjdGVkIGJ5IGEgZGF0YSBtYW5pcHVsYXRpb24gcXVlcnkKICAgICAqIEB2YXIgaW50ZWdlcgogICAgICovCiAgICB2YXIgJGFmZmVjdGVkID0gMDsKCiAgICAvKioKICAgICAqIFRoZSBjdXJyZW50IHJvdyBiZWluZyBsb29rZWQgYXQgaW4gZmV0Y2hJbnRvKCkKICAgICAqIEB2YXIgYXJyYXkKICAgICAqIEBhY2Nlc3MgcHJpdmF0ZQogICAgICovCiAgICB2YXIgJHJvdyA9IGFycmF5KCk7CgogICAgLyoqCiAgICAgKiBUaGUgbnVtYmVyIG9mIHJvd3MgaW4gYSBnaXZlbiByZXN1bHQgc2V0CiAgICAgKiBAdmFyIGFycmF5CiAgICAgKiBAYWNjZXNzIHByaXZhdGUKICAgICAqLwogICAgdmFyICRfbnVtX3Jvd3MgPSBhcnJheSgpOwoKCiAgICAvLyB9fX0KICAgIC8vIHt7eyBjb25zdHJ1Y3RvcgoKICAgIC8qKgogICAgICogVGhpcyBjb25zdHJ1Y3RvciBjYWxscyA8a2JkPiR0aGlzLT5EQl9jb21tb24oKTwva2JkPgogICAgICoKICAgICAqIEByZXR1cm4gdm9pZAogICAgICovCiAgICBmdW5jdGlvbiBEQl9wZ3NxbCgpCiAgICB7CiAgICAgICAgJHRoaXMtPkRCX2NvbW1vbigpOwogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IGNvbm5lY3QoKQoKICAgIC8qKgogICAgICogQ29ubmVjdCB0byB0aGUgZGF0YWJhc2Ugc2VydmVyLCBsb2cgaW4gYW5kIG9wZW4gdGhlIGRhdGFiYXNlCiAgICAgKgogICAgICogRG9uJ3QgY2FsbCB0aGlzIG1ldGhvZCBkaXJlY3RseS4gIFVzZSBEQjo6Y29ubmVjdCgpIGluc3RlYWQuCiAgICAgKgogICAgICogUEVBUiBEQidzIHBnc3FsIGRyaXZlciBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIGV4dHJhIERTTiBvcHRpb25zOgogICAgICogICArIGNvbm5lY3RfdGltZW91dCAgSG93IG1hbnkgc2Vjb25kcyB0byB3YWl0IGZvciBhIGNvbm5lY3Rpb24gdG8KICAgICAqICAgICAgICAgICAgICAgICAgICAgICBiZSBlc3RhYmxpc2hlZC4gIEF2YWlsYWJsZSBzaW5jZSBQRUFSIERCIDEuNy4wLgogICAgICogICArIG5ld19saW5rICAgICAgICAgSWYgc2V0IHRvIHRydWUsIGNhdXNlcyBzdWJzZXF1ZW50IGNhbGxzIHRvCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdCgpIHRvIHJldHVybiBhIG5ldyBjb25uZWN0aW9uIGxpbmsKICAgICAqICAgICAgICAgICAgICAgICAgICAgICBpbnN0ZWFkIG9mIHRoZSBleGlzdGluZyBvbmUuICBXQVJOSU5HOiB0aGlzIGlzCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgbm90IHBvcnRhYmxlIHRvIG90aGVyIERCTVMncy4gIEF2YWlsYWJsZSBvbmx5CiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgaWYgUEhQIGlzID49IDQuMy4wIGFuZCBQRUFSIERCIGlzID49IDEuNy4wLgogICAgICogICArIG9wdGlvbnMgICAgICAgICAgQ29tbWFuZCBsaW5lIG9wdGlvbnMgdG8gYmUgc2VudCB0byB0aGUgc2VydmVyLgogICAgICogICAgICAgICAgICAgICAgICAgICAgIEF2YWlsYWJsZSBzaW5jZSBQRUFSIERCIDEuNi40LgogICAgICogICArIHNlcnZpY2UgICAgICAgICAgU3BlY2lmaWVzIGEgc2VydmljZSBuYW1lIGluIHBnX3NlcnZpY2UuY29uZiB0aGF0CiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgaG9sZHMgYWRkaXRpb25hbCBjb25uZWN0aW9uIHBhcmFtZXRlcnMuCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgQXZhaWxhYmxlIHNpbmNlIFBFQVIgREIgMS43LjAuCiAgICAgKiAgICsgc3NsbW9kZSAgICAgICAgICBIb3cgc2hvdWxkIFNTTCBiZSB1c2VkIHdoZW4gY29ubmVjdGluZz8gIFZhbHVlczoKICAgICAqICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlLCBhbGxvdywgcHJlZmVyIG9yIHJlcXVpcmUuCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgQXZhaWxhYmxlIHNpbmNlIFBFQVIgREIgMS43LjAuCiAgICAgKiAgICsgdHR5ICAgICAgICAgICAgICBUaGlzIHdhcyB1c2VkIHRvIHNwZWNpZnkgd2hlcmUgdG8gc2VuZCBzZXJ2ZXIKICAgICAqICAgICAgICAgICAgICAgICAgICAgICBkZWJ1ZyBvdXRwdXQuICBBdmFpbGFibGUgc2luY2UgUEVBUiBEQiAxLjYuNC4KICAgICAqCiAgICAgKiBFeGFtcGxlIG9mIGNvbm5lY3RpbmcgdG8gYSBuZXcgbGluayB2aWEgYSBzb2NrZXQ6CiAgICAgKiA8Y29kZT4KICAgICAqIHJlcXVpcmVfb25jZSAnREIucGhwJzsKICAgICAqIAogICAgICogJGRzbiA9ICdwZ3NxbDovL3VzZXI6cGFzc0B1bml4KC90bXApL2RibmFtZT9uZXdfbGluaz10cnVlJzsKICAgICAqICRvcHRpb25zID0gYXJyYXkoCiAgICAgKiAgICAgJ3BvcnRhYmlsaXR5JyA9PiBEQl9QT1JUQUJJTElUWV9BTEwsCiAgICAgKiApOwogICAgICogCiAgICAgKiAkZGIgPSYgREI6OmNvbm5lY3QoJGRzbiwgJG9wdGlvbnMpOwogICAgICogaWYgKFBFQVI6OmlzRXJyb3IoJGRiKSkgewogICAgICogICAgIGRpZSgkZGItPmdldE1lc3NhZ2UoKSk7CiAgICAgKiB9CiAgICAgKiA8L2NvZGU+CiAgICAgKgogICAgICogQHBhcmFtIGFycmF5ICRkc24gICAgICAgICB0aGUgZGF0YSBzb3VyY2UgbmFtZQogICAgICogQHBhcmFtIGJvb2wgICRwZXJzaXN0ZW50ICBzaG91bGQgdGhlIGNvbm5lY3Rpb24gYmUgcGVyc2lzdGVudD8KICAgICAqCiAgICAgKiBAcmV0dXJuIGludCAgREJfT0sgb24gc3VjY2Vzcy4gQSBEQl9FcnJvciBvYmplY3Qgb24gZmFpbHVyZS4KICAgICAqCiAgICAgKiBAbGluayBodHRwOi8vd3d3LnBvc3RncmVzcWwub3JnL2RvY3MvY3VycmVudC9zdGF0aWMvbGlicHEuaHRtbCNMSUJQUS1DT05ORUNUCiAgICAgKi8KICAgIGZ1bmN0aW9uIGNvbm5lY3QoJGRzbiwgJHBlcnNpc3RlbnQgPSBmYWxzZSkKICAgIHsKICAgICAgICBpZiAoIVBFQVI6OmxvYWRFeHRlbnNpb24oJ3Bnc3FsJykpIHsKICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5yYWlzZUVycm9yKERCX0VSUk9SX0VYVEVOU0lPTl9OT1RfRk9VTkQpOwogICAgICAgIH0KCiAgICAgICAgJHRoaXMtPmRzbiA9ICRkc247CiAgICAgICAgaWYgKCRkc25bJ2Ric3ludGF4J10pIHsKICAgICAgICAgICAgJHRoaXMtPmRic3ludGF4ID0gJGRzblsnZGJzeW50YXgnXTsKICAgICAgICB9CgogICAgICAgICRwcm90b2NvbCA9ICRkc25bJ3Byb3RvY29sJ10gPyAkZHNuWydwcm90b2NvbCddIDogJ3RjcCc7CgogICAgICAgICRwYXJhbXMgPSBhcnJheSgnJyk7CiAgICAgICAgaWYgKCRwcm90b2NvbCA9PSAndGNwJykgewogICAgICAgICAgICBpZiAoJGRzblsnaG9zdHNwZWMnXSkgewogICAgICAgICAgICAgICAgJHBhcmFtc1swXSAuPSAnaG9zdD0nIC4gJGRzblsnaG9zdHNwZWMnXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoJGRzblsncG9ydCddKSB7CiAgICAgICAgICAgICAgICAkcGFyYW1zWzBdIC49ICcgcG9ydD0nIC4gJGRzblsncG9ydCddOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlaWYgKCRwcm90b2NvbCA9PSAndW5peCcpIHsKICAgICAgICAgICAgLy8gQWxsb3cgZm9yIHBnIHNvY2tldCBpbiBub24tc3RhbmRhcmQgbG9jYXRpb25zLgogICAgICAgICAgICBpZiAoJGRzblsnc29ja2V0J10pIHsKICAgICAgICAgICAgICAgICRwYXJhbXNbMF0gLj0gJ2hvc3Q9JyAuICRkc25bJ3NvY2tldCddOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkZHNuWydwb3J0J10pIHsKICAgICAgICAgICAgICAgICRwYXJhbXNbMF0gLj0gJyBwb3J0PScgLiAkZHNuWydwb3J0J107CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCRkc25bJ2RhdGFiYXNlJ10pIHsKICAgICAgICAgICAgJHBhcmFtc1swXSAuPSAnIGRibmFtZT1cJycgLiBhZGRzbGFzaGVzKCRkc25bJ2RhdGFiYXNlJ10pIC4gJ1wnJzsKICAgICAgICB9CiAgICAgICAgaWYgKCRkc25bJ3VzZXJuYW1lJ10pIHsKICAgICAgICAgICAgJHBhcmFtc1swXSAuPSAnIHVzZXI9XCcnIC4gYWRkc2xhc2hlcygkZHNuWyd1c2VybmFtZSddKSAuICdcJyc7CiAgICAgICAgfQogICAgICAgIGlmICgkZHNuWydwYXNzd29yZCddKSB7CiAgICAgICAgICAgICRwYXJhbXNbMF0gLj0gJyBwYXNzd29yZD1cJycgLiBhZGRzbGFzaGVzKCRkc25bJ3Bhc3N3b3JkJ10pIC4gJ1wnJzsKICAgICAgICB9CiAgICAgICAgaWYgKCFlbXB0eSgkZHNuWydvcHRpb25zJ10pKSB7CiAgICAgICAgICAgICRwYXJhbXNbMF0gLj0gJyBvcHRpb25zPScgLiAkZHNuWydvcHRpb25zJ107CiAgICAgICAgfQogICAgICAgIGlmICghZW1wdHkoJGRzblsndHR5J10pKSB7CiAgICAgICAgICAgICRwYXJhbXNbMF0gLj0gJyB0dHk9JyAuICRkc25bJ3R0eSddOwogICAgICAgIH0KICAgICAgICBpZiAoIWVtcHR5KCRkc25bJ2Nvbm5lY3RfdGltZW91dCddKSkgewogICAgICAgICAgICAkcGFyYW1zWzBdIC49ICcgY29ubmVjdF90aW1lb3V0PScgLiAkZHNuWydjb25uZWN0X3RpbWVvdXQnXTsKICAgICAgICB9CiAgICAgICAgaWYgKCFlbXB0eSgkZHNuWydzc2xtb2RlJ10pKSB7CiAgICAgICAgICAgICRwYXJhbXNbMF0gLj0gJyBzc2xtb2RlPScgLiAkZHNuWydzc2xtb2RlJ107CiAgICAgICAgfQogICAgICAgIGlmICghZW1wdHkoJGRzblsnc2VydmljZSddKSkgewogICAgICAgICAgICAkcGFyYW1zWzBdIC49ICcgc2VydmljZT0nIC4gJGRzblsnc2VydmljZSddOwogICAgICAgIH0KCiAgICAgICAgaWYgKGlzc2V0KCRkc25bJ25ld19saW5rJ10pCiAgICAgICAgICAgICYmICgkZHNuWyduZXdfbGluayddID09ICd0cnVlJyB8fCAkZHNuWyduZXdfbGluayddID09PSB0cnVlKSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh2ZXJzaW9uX2NvbXBhcmUocGhwdmVyc2lvbigpLCAnNC4zLjAnLCAnPj0nKSkgewogICAgICAgICAgICAgICAgJHBhcmFtc1tdID0gUEdTUUxfQ09OTkVDVF9GT1JDRV9ORVc7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICRjb25uZWN0X2Z1bmN0aW9uID0gJHBlcnNpc3RlbnQgPyAncGdfcGNvbm5lY3QnIDogJ3BnX2Nvbm5lY3QnOwoKICAgICAgICAkaW5pID0gaW5pX2dldCgndHJhY2tfZXJyb3JzJyk7CiAgICAgICAgJHBocF9lcnJvcm1zZyA9ICcnOwogICAgICAgIGlmICgkaW5pKSB7CiAgICAgICAgICAgICR0aGlzLT5jb25uZWN0aW9uID0gQGNhbGxfdXNlcl9mdW5jX2FycmF5KCRjb25uZWN0X2Z1bmN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcGFyYW1zKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBAaW5pX3NldCgndHJhY2tfZXJyb3JzJywgMSk7CiAgICAgICAgICAgICR0aGlzLT5jb25uZWN0aW9uID0gQGNhbGxfdXNlcl9mdW5jX2FycmF5KCRjb25uZWN0X2Z1bmN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcGFyYW1zKTsKICAgICAgICAgICAgQGluaV9zZXQoJ3RyYWNrX2Vycm9ycycsICRpbmkpOwogICAgICAgIH0KCiAgICAgICAgaWYgKCEkdGhpcy0+Y29ubmVjdGlvbikgewogICAgICAgICAgICByZXR1cm4gJHRoaXMtPnJhaXNlRXJyb3IoREJfRVJST1JfQ09OTkVDVF9GQUlMRUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBudWxsLCBudWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHBocF9lcnJvcm1zZyk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBEQl9PSzsKICAgIH0KCiAgICAvLyB9fX0KICAgIC8vIHt7eyBkaXNjb25uZWN0KCkKCiAgICAvKioKICAgICAqIERpc2Nvbm5lY3RzIGZyb20gdGhlIGRhdGFiYXNlIHNlcnZlcgogICAgICoKICAgICAqIEByZXR1cm4gYm9vbCAgVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlCiAgICAgKi8KICAgIGZ1bmN0aW9uIGRpc2Nvbm5lY3QoKQogICAgewogICAgICAgICRyZXQgPSBAcGdfY2xvc2UoJHRoaXMtPmNvbm5lY3Rpb24pOwogICAgICAgICR0aGlzLT5jb25uZWN0aW9uID0gbnVsbDsKICAgICAgICByZXR1cm4gJHJldDsKICAgIH0KCiAgICAvLyB9fX0KICAgIC8vIHt7eyBzaW1wbGVRdWVyeSgpCgogICAgLyoqCiAgICAgKiBTZW5kcyBhIHF1ZXJ5IHRvIHRoZSBkYXRhYmFzZSBzZXJ2ZXIKICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICB0aGUgU1FMIHF1ZXJ5IHN0cmluZwogICAgICoKICAgICAqIEByZXR1cm4gbWl4ZWQgICsgYSBQSFAgcmVzdWx0IHJlc3JvdWNlIGZvciBzdWNjZXNzZnVsIFNFTEVDVCBxdWVyaWVzCiAgICAgKiAgICAgICAgICAgICAgICArIHRoZSBEQl9PSyBjb25zdGFudCBmb3Igb3RoZXIgc3VjY2Vzc2Z1bCBxdWVyaWVzCiAgICAgKiAgICAgICAgICAgICAgICArIGEgREJfRXJyb3Igb2JqZWN0IG9uIGZhaWx1cmUKICAgICAqLwogICAgZnVuY3Rpb24gc2ltcGxlUXVlcnkoJHF1ZXJ5KQogICAgewogICAgICAgICRpc21hbmlwID0gJHRoaXMtPl9jaGVja01hbmlwKCRxdWVyeSk7CiAgICAgICAgJHRoaXMtPmxhc3RfcXVlcnkgPSAkcXVlcnk7CiAgICAgICAgJHF1ZXJ5ID0gJHRoaXMtPm1vZGlmeVF1ZXJ5KCRxdWVyeSk7CiAgICAgICAgaWYgKCEkdGhpcy0+YXV0b2NvbW1pdCAmJiAkaXNtYW5pcCkgewogICAgICAgICAgICBpZiAoJHRoaXMtPnRyYW5zYWN0aW9uX29wY291bnQgPT0gMCkgewogICAgICAgICAgICAgICAgJHJlc3VsdCA9IEBwZ19leGVjKCR0aGlzLT5jb25uZWN0aW9uLCAnYmVnaW47Jyk7CiAgICAgICAgICAgICAgICBpZiAoISRyZXN1bHQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPnBnc3FsUmFpc2VFcnJvcigpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgICR0aGlzLT50cmFuc2FjdGlvbl9vcGNvdW50Kys7CiAgICAgICAgfQogICAgICAgICRyZXN1bHQgPSBAcGdfZXhlYygkdGhpcy0+Y29ubmVjdGlvbiwgJHF1ZXJ5KTsKICAgICAgICBpZiAoISRyZXN1bHQpIHsKICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5wZ3NxbFJhaXNlRXJyb3IoKTsKICAgICAgICB9CgogICAgICAgIC8qCiAgICAgICAgICogRGV0ZXJtaW5lIHdoZXRoZXIgcXVlcmllcyBwcm9kdWNlIGFmZmVjdGVkIHJvd3MsIHJlc3VsdCBvciBub3RoaW5nLgogICAgICAgICAqCiAgICAgICAgICogVGhpcyBsb2dpYyB3YXMgaW50cm9kdWNlZCBpbiB2ZXJzaW9uIDEuMSBvZiB0aGUgZmlsZSBieSBzc2IsCiAgICAgICAgICogdGhvdWdoIHRoZSByZWdleCBoYXMgYmVlbiBtb2RpZmllZCBzbGlnaHRseSBzaW5jZSB0aGVuLgogICAgICAgICAqCiAgICAgICAgICogUG9zdGdyZVNRTCBjb21tYW5kczoKICAgICAgICAgKiBBQk9SVCwgQUxURVIsIEJFR0lOLCBDTE9TRSwgQ0xVU1RFUiwgQ09NTUlULCBDT1BZLAogICAgICAgICAqIENSRUFURSwgREVDTEFSRSwgREVMRVRFLCBEUk9QIFRBQkxFLCBFWFBMQUlOLCBGRVRDSCwKICAgICAgICAgKiBHUkFOVCwgSU5TRVJULCBMSVNURU4sIExPQUQsIExPQ0ssIE1PVkUsIE5PVElGWSwgUkVTRVQsCiAgICAgICAgICogUkVWT0tFLCBST0xMQkFDSywgU0VMRUNULCBTRUxFQ1QgSU5UTywgU0VULCBTSE9XLAogICAgICAgICAqIFVOTElTVEVOLCBVUERBVEUsIFZBQ1VVTQogICAgICAgICAqLwogICAgICAgIGlmICgkaXNtYW5pcCkgewogICAgICAgICAgICAkdGhpcy0+YWZmZWN0ZWQgPSBAcGdfYWZmZWN0ZWRfcm93cygkcmVzdWx0KTsKICAgICAgICAgICAgcmV0dXJuIERCX09LOwogICAgICAgIH0gZWxzZWlmIChwcmVnX21hdGNoKCcvXlxzKlwoKlxzKihTRUxFQ1R8RVhQTEFJTnxGRVRDSHxTSE9XKVxzL3NpJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcXVlcnkpKQogICAgICAgIHsKICAgICAgICAgICAgJHRoaXMtPnJvd1soaW50KSRyZXN1bHRdID0gMDsgLy8gcmVzZXQgdGhlIHJvdyBjb3VudGVyLgogICAgICAgICAgICAkbnVtcm93cyA9ICR0aGlzLT5udW1Sb3dzKCRyZXN1bHQpOwogICAgICAgICAgICBpZiAoaXNfb2JqZWN0KCRudW1yb3dzKSkgewogICAgICAgICAgICAgICAgcmV0dXJuICRudW1yb3dzOwogICAgICAgICAgICB9CiAgICAgICAgICAgICR0aGlzLT5fbnVtX3Jvd3NbKGludCkkcmVzdWx0XSA9ICRudW1yb3dzOwogICAgICAgICAgICAkdGhpcy0+YWZmZWN0ZWQgPSAwOwogICAgICAgICAgICByZXR1cm4gJHJlc3VsdDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkdGhpcy0+YWZmZWN0ZWQgPSAwOwogICAgICAgICAgICByZXR1cm4gREJfT0s7CiAgICAgICAgfQogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IG5leHRSZXN1bHQoKQoKICAgIC8qKgogICAgICogTW92ZSB0aGUgaW50ZXJuYWwgcGdzcWwgcmVzdWx0IHBvaW50ZXIgdG8gdGhlIG5leHQgYXZhaWxhYmxlIHJlc3VsdAogICAgICoKICAgICAqIEBwYXJhbSBhIHZhbGlkIGZic3FsIHJlc3VsdCByZXNvdXJjZQogICAgICoKICAgICAqIEBhY2Nlc3MgcHVibGljCiAgICAgKgogICAgICogQHJldHVybiB0cnVlIGlmIGEgcmVzdWx0IGlzIGF2YWlsYWJsZSBvdGhlcndpc2UgcmV0dXJuIGZhbHNlCiAgICAgKi8KICAgIGZ1bmN0aW9uIG5leHRSZXN1bHQoJHJlc3VsdCkKICAgIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgZmV0Y2hJbnRvKCkKCiAgICAvKioKICAgICAqIFBsYWNlcyBhIHJvdyBmcm9tIHRoZSByZXN1bHQgc2V0IGludG8gdGhlIGdpdmVuIGFycmF5CiAgICAgKgogICAgICogRm9ybWF0aW5nIG9mIHRoZSBhcnJheSBhbmQgdGhlIGRhdGEgdGhlcmVpbiBhcmUgY29uZmlndXJhYmxlLgogICAgICogU2VlIERCX3Jlc3VsdDo6ZmV0Y2hJbnRvKCkgZm9yIG1vcmUgaW5mb3JtYXRpb24uCiAgICAgKgogICAgICogVGhpcyBtZXRob2QgaXMgbm90IG1lYW50IHRvIGJlIGNhbGxlZCBkaXJlY3RseS4gIFVzZQogICAgICogREJfcmVzdWx0OjpmZXRjaEludG8oKSBpbnN0ZWFkLiAgSXQgY2FuJ3QgYmUgZGVjbGFyZWQgInByb3RlY3RlZCIKICAgICAqIGJlY2F1c2UgREJfcmVzdWx0IGlzIGEgc2VwYXJhdGUgb2JqZWN0LgogICAgICoKICAgICAqIEBwYXJhbSByZXNvdXJjZSAkcmVzdWx0ICAgIHRoZSBxdWVyeSByZXN1bHQgcmVzb3VyY2UKICAgICAqIEBwYXJhbSBhcnJheSAgICAkYXJyICAgICAgIHRoZSByZWZlcmVuY2VkIGFycmF5IHRvIHB1dCB0aGUgZGF0YSBpbgogICAgICogQHBhcmFtIGludCAgICAgICRmZXRjaG1vZGUgaG93IHRoZSByZXN1bHRpbmcgYXJyYXkgc2hvdWxkIGJlIGluZGV4ZWQKICAgICAqIEBwYXJhbSBpbnQgICAgICAkcm93bnVtICAgIHRoZSByb3cgbnVtYmVyIHRvIGZldGNoICgwID0gZmlyc3Qgcm93KQogICAgICoKICAgICAqIEByZXR1cm4gbWl4ZWQgIERCX09LIG9uIHN1Y2Nlc3MsIE5VTEwgd2hlbiB0aGUgZW5kIG9mIGEgcmVzdWx0IHNldCBpcwogICAgICogICAgICAgICAgICAgICAgIHJlYWNoZWQgb3Igb24gZmFpbHVyZQogICAgICoKICAgICAqIEBzZWUgREJfcmVzdWx0OjpmZXRjaEludG8oKQogICAgICovCiAgICBmdW5jdGlvbiBmZXRjaEludG8oJHJlc3VsdCwgJiRhcnIsICRmZXRjaG1vZGUsICRyb3dudW0gPSBudWxsKQogICAgewogICAgICAgICRyZXN1bHRfaW50ID0gKGludCkkcmVzdWx0OwogICAgICAgICRyb3dudW0gPSAoJHJvd251bSAhPT0gbnVsbCkgPyAkcm93bnVtIDogJHRoaXMtPnJvd1skcmVzdWx0X2ludF07CiAgICAgICAgaWYgKCRyb3dudW0gPj0gJHRoaXMtPl9udW1fcm93c1skcmVzdWx0X2ludF0pIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIGlmICgkZmV0Y2htb2RlICYgREJfRkVUQ0hNT0RFX0FTU09DKSB7CiAgICAgICAgICAgICRhcnIgPSBAcGdfZmV0Y2hfYXJyYXkoJHJlc3VsdCwgJHJvd251bSwgUEdTUUxfQVNTT0MpOwogICAgICAgICAgICBpZiAoJHRoaXMtPm9wdGlvbnNbJ3BvcnRhYmlsaXR5J10gJiBEQl9QT1JUQUJJTElUWV9MT1dFUkNBU0UgJiYgJGFycikgewogICAgICAgICAgICAgICAgJGFyciA9IGFycmF5X2NoYW5nZV9rZXlfY2FzZSgkYXJyLCBDQVNFX0xPV0VSKTsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRhcnIgPSBAcGdfZmV0Y2hfcm93KCRyZXN1bHQsICRyb3dudW0pOwogICAgICAgIH0KICAgICAgICBpZiAoISRhcnIpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIGlmICgkdGhpcy0+b3B0aW9uc1sncG9ydGFiaWxpdHknXSAmIERCX1BPUlRBQklMSVRZX1JUUklNKSB7CiAgICAgICAgICAgICR0aGlzLT5fcnRyaW1BcnJheVZhbHVlcygkYXJyKTsKICAgICAgICB9CiAgICAgICAgaWYgKCR0aGlzLT5vcHRpb25zWydwb3J0YWJpbGl0eSddICYgREJfUE9SVEFCSUxJVFlfTlVMTF9UT19FTVBUWSkgewogICAgICAgICAgICAkdGhpcy0+X2NvbnZlcnROdWxsQXJyYXlWYWx1ZXNUb0VtcHR5KCRhcnIpOwogICAgICAgIH0KICAgICAgICAkdGhpcy0+cm93WyRyZXN1bHRfaW50XSA9ICsrJHJvd251bTsKICAgICAgICByZXR1cm4gREJfT0s7CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgZnJlZVJlc3VsdCgpCgogICAgLyoqCiAgICAgKiBEZWxldGVzIHRoZSByZXN1bHQgc2V0IGFuZCBmcmVlcyB0aGUgbWVtb3J5IG9jY3VwaWVkIGJ5IHRoZSByZXN1bHQgc2V0CiAgICAgKgogICAgICogVGhpcyBtZXRob2QgaXMgbm90IG1lYW50IHRvIGJlIGNhbGxlZCBkaXJlY3RseS4gIFVzZQogICAgICogREJfcmVzdWx0OjpmcmVlKCkgaW5zdGVhZC4gIEl0IGNhbid0IGJlIGRlY2xhcmVkICJwcm90ZWN0ZWQiCiAgICAgKiBiZWNhdXNlIERCX3Jlc3VsdCBpcyBhIHNlcGFyYXRlIG9iamVjdC4KICAgICAqCiAgICAgKiBAcGFyYW0gcmVzb3VyY2UgJHJlc3VsdCAgUEhQJ3MgcXVlcnkgcmVzdWx0IHJlc291cmNlCiAgICAgKgogICAgICogQHJldHVybiBib29sICBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIGlmICRyZXN1bHQgaXMgaW52YWxpZAogICAgICoKICAgICAqIEBzZWUgREJfcmVzdWx0OjpmcmVlKCkKICAgICAqLwogICAgZnVuY3Rpb24gZnJlZVJlc3VsdCgkcmVzdWx0KQogICAgewogICAgICAgIGlmIChpc19yZXNvdXJjZSgkcmVzdWx0KSkgewogICAgICAgICAgICB1bnNldCgkdGhpcy0+cm93WyhpbnQpJHJlc3VsdF0pOwogICAgICAgICAgICB1bnNldCgkdGhpcy0+X251bV9yb3dzWyhpbnQpJHJlc3VsdF0pOwogICAgICAgICAgICAkdGhpcy0+YWZmZWN0ZWQgPSAwOwogICAgICAgICAgICByZXR1cm4gQHBnX2ZyZWVyZXN1bHQoJHJlc3VsdCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICAvLyB9fX0KICAgIC8vIHt7eyBxdW90ZSgpCgogICAgLyoqCiAgICAgKiBAZGVwcmVjYXRlZCAgRGVwcmVjYXRlZCBpbiByZWxlYXNlIDEuNi4wCiAgICAgKiBAaW50ZXJuYWwKICAgICAqLwogICAgZnVuY3Rpb24gcXVvdGUoJHN0cikKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnF1b3RlU21hcnQoJHN0cik7CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgcXVvdGVCb29sZWFuKCkKCiAgICAvKioKICAgICAqIEZvcm1hdHMgYSBib29sZWFuIHZhbHVlIGZvciB1c2Ugd2l0aGluIGEgcXVlcnkgaW4gYSBsb2NhbGUtaW5kZXBlbmRlbnQKICAgICAqIG1hbm5lci4KICAgICAqCiAgICAgKiBAcGFyYW0gYm9vbGVhbiB0aGUgYm9vbGVhbiB2YWx1ZSB0byBiZSBxdW90ZWQuCiAgICAgKiBAcmV0dXJuIHN0cmluZyB0aGUgcXVvdGVkIHN0cmluZy4KICAgICAqIEBzZWUgREJfY29tbW9uOjpxdW90ZVNtYXJ0KCkKICAgICAqIEBzaW5jZSBNZXRob2QgYXZhaWxhYmxlIHNpbmNlIHJlbGVhc2UgMS43LjguCiAgICAgKi8KICAgIGZ1bmN0aW9uIHF1b3RlQm9vbGVhbigkYm9vbGVhbikgewogICAgICAgIHJldHVybiAkYm9vbGVhbiA/ICdUUlVFJyA6ICdGQUxTRSc7CiAgICB9CiAgICAgCiAgICAvLyB9fX0KICAgIC8vIHt7eyBlc2NhcGVTaW1wbGUoKQoKICAgIC8qKgogICAgICogRXNjYXBlcyBhIHN0cmluZyBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgREJNUydzIHN0YW5kYXJkcwogICAgICoKICAgICAqIHtAaW50ZXJuYWwgUG9zdGdyZVNRTCB0cmVhdHMgYSBiYWNrc2xhc2ggYXMgYW4gZXNjYXBlIGNoYXJhY3RlciwKICAgICAqIHNvIHRoZXkgYXJlIGVzY2FwZWQgYXMgd2VsbC4KICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICRzdHIgIHRoZSBzdHJpbmcgdG8gYmUgZXNjYXBlZAogICAgICoKICAgICAqIEByZXR1cm4gc3RyaW5nICB0aGUgZXNjYXBlZCBzdHJpbmcKICAgICAqCiAgICAgKiBAc2VlIERCX2NvbW1vbjo6cXVvdGVTbWFydCgpCiAgICAgKiBAc2luY2UgTWV0aG9kIGF2YWlsYWJsZSBzaW5jZSBSZWxlYXNlIDEuNi4wCiAgICAgKi8KICAgIGZ1bmN0aW9uIGVzY2FwZVNpbXBsZSgkc3RyKQogICAgewogICAgICAgIGlmIChmdW5jdGlvbl9leGlzdHMoJ3BnX2VzY2FwZV9zdHJpbmcnKSkgewogICAgICAgICAgICAvKiBUaGlzIGZpeGVzIGFuIHVuZG9jdW1lbnRlZCBCQyBicmVhayBpbiBQSFAgNS4yLjAgd2hpY2ggY2hhbmdlZAogICAgICAgICAgICAgKiB0aGUgcHJvdG90eXBlIG9mIHBnX2VzY2FwZV9zdHJpbmcuIEknbSBub3QgdGhyaWxsZWQgYWJvdXQgaGF2aW5nCiAgICAgICAgICAgICAqIHRvIHNuaWZmIHRoZSBQSFAgdmVyc2lvbiwgcXVpdGUgZnJhbmtseSwgYnV0IGl0J3MgdGhlIG9ubHkgd2F5CiAgICAgICAgICAgICAqIHRvIGRlYWwgd2l0aCB0aGUgcHJvYmxlbS4gUmV2aXNpb24gMS4zMzEuMi4xMy4yLjEwIG9uCiAgICAgICAgICAgICAqIHBocC1zcmMvZXh0L3Bnc3FsL3Bnc3FsLmMgKFBIUF81XzIgYnJhbmNoKSBpcyB0byBibGFtZSwgZm9yIHRoZQogICAgICAgICAgICAgKiByZWNvcmQuICovCiAgICAgICAgICAgIGlmICh2ZXJzaW9uX2NvbXBhcmUoUEhQX1ZFUlNJT04sICc1LjIuMCcsICc+PScpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gcGdfZXNjYXBlX3N0cmluZygkdGhpcy0+Y29ubmVjdGlvbiwgJHN0cik7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gcGdfZXNjYXBlX3N0cmluZygkc3RyKTsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiBzdHJfcmVwbGFjZSgiJyIsICInJyIsIHN0cl9yZXBsYWNlKCdcXCcsICdcXFxcJywgJHN0cikpOwogICAgICAgIH0KICAgIH0KCiAgICAvLyB9fX0KICAgIC8vIHt7eyBudW1Db2xzKCkKCiAgICAvKioKICAgICAqIEdldHMgdGhlIG51bWJlciBvZiBjb2x1bW5zIGluIGEgcmVzdWx0IHNldAogICAgICoKICAgICAqIFRoaXMgbWV0aG9kIGlzIG5vdCBtZWFudCB0byBiZSBjYWxsZWQgZGlyZWN0bHkuICBVc2UKICAgICAqIERCX3Jlc3VsdDo6bnVtQ29scygpIGluc3RlYWQuICBJdCBjYW4ndCBiZSBkZWNsYXJlZCAicHJvdGVjdGVkIgogICAgICogYmVjYXVzZSBEQl9yZXN1bHQgaXMgYSBzZXBhcmF0ZSBvYmplY3QuCiAgICAgKgogICAgICogQHBhcmFtIHJlc291cmNlICRyZXN1bHQgIFBIUCdzIHF1ZXJ5IHJlc3VsdCByZXNvdXJjZQogICAgICoKICAgICAqIEByZXR1cm4gaW50ICB0aGUgbnVtYmVyIG9mIGNvbHVtbnMuICBBIERCX0Vycm9yIG9iamVjdCBvbiBmYWlsdXJlLgogICAgICoKICAgICAqIEBzZWUgREJfcmVzdWx0OjpudW1Db2xzKCkKICAgICAqLwogICAgZnVuY3Rpb24gbnVtQ29scygkcmVzdWx0KQogICAgewogICAgICAgICRjb2xzID0gQHBnX251bWZpZWxkcygkcmVzdWx0KTsKICAgICAgICBpZiAoISRjb2xzKSB7CiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+cGdzcWxSYWlzZUVycm9yKCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiAkY29sczsKICAgIH0KCiAgICAvLyB9fX0KICAgIC8vIHt7eyBudW1Sb3dzKCkKCiAgICAvKioKICAgICAqIEdldHMgdGhlIG51bWJlciBvZiByb3dzIGluIGEgcmVzdWx0IHNldAogICAgICoKICAgICAqIFRoaXMgbWV0aG9kIGlzIG5vdCBtZWFudCB0byBiZSBjYWxsZWQgZGlyZWN0bHkuICBVc2UKICAgICAqIERCX3Jlc3VsdDo6bnVtUm93cygpIGluc3RlYWQuICBJdCBjYW4ndCBiZSBkZWNsYXJlZCAicHJvdGVjdGVkIgogICAgICogYmVjYXVzZSBEQl9yZXN1bHQgaXMgYSBzZXBhcmF0ZSBvYmplY3QuCiAgICAgKgogICAgICogQHBhcmFtIHJlc291cmNlICRyZXN1bHQgIFBIUCdzIHF1ZXJ5IHJlc3VsdCByZXNvdXJjZQogICAgICoKICAgICAqIEByZXR1cm4gaW50ICB0aGUgbnVtYmVyIG9mIHJvd3MuICBBIERCX0Vycm9yIG9iamVjdCBvbiBmYWlsdXJlLgogICAgICoKICAgICAqIEBzZWUgREJfcmVzdWx0OjpudW1Sb3dzKCkKICAgICAqLwogICAgZnVuY3Rpb24gbnVtUm93cygkcmVzdWx0KQogICAgewogICAgICAgICRyb3dzID0gQHBnX251bXJvd3MoJHJlc3VsdCk7CiAgICAgICAgaWYgKCRyb3dzID09PSBudWxsKSB7CiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+cGdzcWxSYWlzZUVycm9yKCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiAkcm93czsKICAgIH0KCiAgICAvLyB9fX0KICAgIC8vIHt7eyBhdXRvQ29tbWl0KCkKCiAgICAvKioKICAgICAqIEVuYWJsZXMgb3IgZGlzYWJsZXMgYXV0b21hdGljIGNvbW1pdHMKICAgICAqCiAgICAgKiBAcGFyYW0gYm9vbCAkb25vZmYgIHRydWUgdHVybnMgaXQgb24sIGZhbHNlIHR1cm5zIGl0IG9mZgogICAgICoKICAgICAqIEByZXR1cm4gaW50ICBEQl9PSyBvbiBzdWNjZXNzLiAgQSBEQl9FcnJvciBvYmplY3QgaWYgdGhlIGRyaXZlcgogICAgICogICAgICAgICAgICAgICBkb2Vzbid0IHN1cHBvcnQgYXV0by1jb21taXR0aW5nIHRyYW5zYWN0aW9ucy4KICAgICAqLwogICAgZnVuY3Rpb24gYXV0b0NvbW1pdCgkb25vZmYgPSBmYWxzZSkKICAgIHsKICAgICAgICAvLyBYWFggaWYgJHRoaXMtPnRyYW5zYWN0aW9uX29wY291bnQgPiAwLCB3ZSBzaG91bGQgcHJvYmFibHkKICAgICAgICAvLyBpc3N1ZSBhIHdhcm5pbmcgaGVyZS4KICAgICAgICAkdGhpcy0+YXV0b2NvbW1pdCA9ICRvbm9mZiA/IHRydWUgOiBmYWxzZTsKICAgICAgICByZXR1cm4gREJfT0s7CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgY29tbWl0KCkKCiAgICAvKioKICAgICAqIENvbW1pdHMgdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24KICAgICAqCiAgICAgKiBAcmV0dXJuIGludCAgREJfT0sgb24gc3VjY2Vzcy4gIEEgREJfRXJyb3Igb2JqZWN0IG9uIGZhaWx1cmUuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGNvbW1pdCgpCiAgICB7CiAgICAgICAgaWYgKCR0aGlzLT50cmFuc2FjdGlvbl9vcGNvdW50ID4gMCkgewogICAgICAgICAgICAvLyAoZGlzYWJsZWQpIGhhY2sgdG8gc2h1dCB1cCBlcnJvciBtZXNzYWdlcyBmcm9tIGxpYnBxLmEKICAgICAgICAgICAgLy9AZmNsb3NlKEBmb3BlbigicGhwOi8vc3RkZXJyIiwgInciKSk7CiAgICAgICAgICAgICRyZXN1bHQgPSBAcGdfZXhlYygkdGhpcy0+Y29ubmVjdGlvbiwgJ2VuZDsnKTsKICAgICAgICAgICAgJHRoaXMtPnRyYW5zYWN0aW9uX29wY291bnQgPSAwOwogICAgICAgICAgICBpZiAoISRyZXN1bHQpIHsKICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+cGdzcWxSYWlzZUVycm9yKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIERCX09LOwogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IHJvbGxiYWNrKCkKCiAgICAvKioKICAgICAqIFJldmVydHMgdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24KICAgICAqCiAgICAgKiBAcmV0dXJuIGludCAgREJfT0sgb24gc3VjY2Vzcy4gIEEgREJfRXJyb3Igb2JqZWN0IG9uIGZhaWx1cmUuCiAgICAgKi8KICAgIGZ1bmN0aW9uIHJvbGxiYWNrKCkKICAgIHsKICAgICAgICBpZiAoJHRoaXMtPnRyYW5zYWN0aW9uX29wY291bnQgPiAwKSB7CiAgICAgICAgICAgICRyZXN1bHQgPSBAcGdfZXhlYygkdGhpcy0+Y29ubmVjdGlvbiwgJ2Fib3J0OycpOwogICAgICAgICAgICAkdGhpcy0+dHJhbnNhY3Rpb25fb3Bjb3VudCA9IDA7CiAgICAgICAgICAgIGlmICghJHJlc3VsdCkgewogICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5wZ3NxbFJhaXNlRXJyb3IoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gREJfT0s7CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgYWZmZWN0ZWRSb3dzKCkKCiAgICAvKioKICAgICAqIERldGVybWluZXMgdGhlIG51bWJlciBvZiByb3dzIGFmZmVjdGVkIGJ5IGEgZGF0YSBtYW5pdXBsYXRpb24gcXVlcnkKICAgICAqCiAgICAgKiAwIGlzIHJldHVybmVkIGZvciBxdWVyaWVzIHRoYXQgZG9uJ3QgbWFuaXB1bGF0ZSBkYXRhLgogICAgICoKICAgICAqIEByZXR1cm4gaW50ICB0aGUgbnVtYmVyIG9mIHJvd3MuICBBIERCX0Vycm9yIG9iamVjdCBvbiBmYWlsdXJlLgogICAgICovCiAgICBmdW5jdGlvbiBhZmZlY3RlZFJvd3MoKQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+YWZmZWN0ZWQ7CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgbmV4dElkKCkKCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIG5leHQgZnJlZSBpZCBpbiBhIHNlcXVlbmNlCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAgJHNlcV9uYW1lICBuYW1lIG9mIHRoZSBzZXF1ZW5jZQogICAgICogQHBhcmFtIGJvb2xlYW4gJG9uZGVtYW5kICB3aGVuIHRydWUsIHRoZSBzZXFlbmNlIGlzIGF1dG9tYXRpY2FsbHkKICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZWQgaWYgaXQgZG9lcyBub3QgZXhpc3QKICAgICAqCiAgICAgKiBAcmV0dXJuIGludCAgdGhlIG5leHQgaWQgbnVtYmVyIGluIHRoZSBzZXF1ZW5jZS4KICAgICAqICAgICAgICAgICAgICAgQSBEQl9FcnJvciBvYmplY3Qgb24gZmFpbHVyZS4KICAgICAqCiAgICAgKiBAc2VlIERCX2NvbW1vbjo6bmV4dElEKCksIERCX2NvbW1vbjo6Z2V0U2VxdWVuY2VOYW1lKCksCiAgICAgKiAgICAgIERCX3Bnc3FsOjpjcmVhdGVTZXF1ZW5jZSgpLCBEQl9wZ3NxbDo6ZHJvcFNlcXVlbmNlKCkKICAgICAqLwogICAgZnVuY3Rpb24gbmV4dElkKCRzZXFfbmFtZSwgJG9uZGVtYW5kID0gdHJ1ZSkKICAgIHsKICAgICAgICAkc2VxbmFtZSA9ICR0aGlzLT5nZXRTZXF1ZW5jZU5hbWUoJHNlcV9uYW1lKTsKICAgICAgICAkcmVwZWF0ID0gZmFsc2U7CiAgICAgICAgZG8gewogICAgICAgICAgICAkdGhpcy0+cHVzaEVycm9ySGFuZGxpbmcoUEVBUl9FUlJPUl9SRVRVUk4pOwogICAgICAgICAgICAkcmVzdWx0ID0mICR0aGlzLT5xdWVyeSgiU0VMRUNUIE5FWFRWQUwoJyR7c2VxbmFtZX0nKSIpOwogICAgICAgICAgICAkdGhpcy0+cG9wRXJyb3JIYW5kbGluZygpOwogICAgICAgICAgICBpZiAoJG9uZGVtYW5kICYmIERCOjppc0Vycm9yKCRyZXN1bHQpICYmCiAgICAgICAgICAgICAgICAkcmVzdWx0LT5nZXRDb2RlKCkgPT0gREJfRVJST1JfTk9TVUNIVEFCTEUpIHsKICAgICAgICAgICAgICAgICRyZXBlYXQgPSB0cnVlOwogICAgICAgICAgICAgICAgJHRoaXMtPnB1c2hFcnJvckhhbmRsaW5nKFBFQVJfRVJST1JfUkVUVVJOKTsKICAgICAgICAgICAgICAgICRyZXN1bHQgPSAkdGhpcy0+Y3JlYXRlU2VxdWVuY2UoJHNlcV9uYW1lKTsKICAgICAgICAgICAgICAgICR0aGlzLT5wb3BFcnJvckhhbmRsaW5nKCk7CiAgICAgICAgICAgICAgICBpZiAoREI6OmlzRXJyb3IoJHJlc3VsdCkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPnJhaXNlRXJyb3IoJHJlc3VsdCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkcmVwZWF0ID0gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICB9IHdoaWxlICgkcmVwZWF0KTsKICAgICAgICBpZiAoREI6OmlzRXJyb3IoJHJlc3VsdCkpIHsKICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5yYWlzZUVycm9yKCRyZXN1bHQpOwogICAgICAgIH0KICAgICAgICAkYXJyID0gJHJlc3VsdC0+ZmV0Y2hSb3coREJfRkVUQ0hNT0RFX09SREVSRUQpOwogICAgICAgICRyZXN1bHQtPmZyZWUoKTsKICAgICAgICByZXR1cm4gJGFyclswXTsKICAgIH0KCiAgICAvLyB9fX0KICAgIC8vIHt7eyBjcmVhdGVTZXF1ZW5jZSgpCgogICAgLyoqCiAgICAgKiBDcmVhdGVzIGEgbmV3IHNlcXVlbmNlCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkc2VxX25hbWUgIG5hbWUgb2YgdGhlIG5ldyBzZXF1ZW5jZQogICAgICoKICAgICAqIEByZXR1cm4gaW50ICBEQl9PSyBvbiBzdWNjZXNzLiAgQSBEQl9FcnJvciBvYmplY3Qgb24gZmFpbHVyZS4KICAgICAqCiAgICAgKiBAc2VlIERCX2NvbW1vbjo6Y3JlYXRlU2VxdWVuY2UoKSwgREJfY29tbW9uOjpnZXRTZXF1ZW5jZU5hbWUoKSwKICAgICAqICAgICAgREJfcGdzcWw6Om5leHRJRCgpLCBEQl9wZ3NxbDo6ZHJvcFNlcXVlbmNlKCkKICAgICAqLwogICAgZnVuY3Rpb24gY3JlYXRlU2VxdWVuY2UoJHNlcV9uYW1lKQogICAgewogICAgICAgICRzZXFuYW1lID0gJHRoaXMtPmdldFNlcXVlbmNlTmFtZSgkc2VxX25hbWUpOwogICAgICAgICRyZXN1bHQgPSAkdGhpcy0+cXVlcnkoIkNSRUFURSBTRVFVRU5DRSAke3NlcW5hbWV9Iik7CiAgICAgICAgcmV0dXJuICRyZXN1bHQ7CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgZHJvcFNlcXVlbmNlKCkKCiAgICAvKioKICAgICAqIERlbGV0ZXMgYSBzZXF1ZW5jZQogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgJHNlcV9uYW1lICBuYW1lIG9mIHRoZSBzZXF1ZW5jZSB0byBiZSBkZWxldGVkCiAgICAgKgogICAgICogQHJldHVybiBpbnQgIERCX09LIG9uIHN1Y2Nlc3MuICBBIERCX0Vycm9yIG9iamVjdCBvbiBmYWlsdXJlLgogICAgICoKICAgICAqIEBzZWUgREJfY29tbW9uOjpkcm9wU2VxdWVuY2UoKSwgREJfY29tbW9uOjpnZXRTZXF1ZW5jZU5hbWUoKSwKICAgICAqICAgICAgREJfcGdzcWw6Om5leHRJRCgpLCBEQl9wZ3NxbDo6Y3JlYXRlU2VxdWVuY2UoKQogICAgICovCiAgICBmdW5jdGlvbiBkcm9wU2VxdWVuY2UoJHNlcV9uYW1lKQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+cXVlcnkoJ0RST1AgU0VRVUVOQ0UgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAkdGhpcy0+Z2V0U2VxdWVuY2VOYW1lKCRzZXFfbmFtZSkpOwogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IG1vZGlmeUxpbWl0UXVlcnkoKQoKICAgIC8qKgogICAgICogQWRkcyBMSU1JVCBjbGF1c2VzIHRvIGEgcXVlcnkgc3RyaW5nIGFjY29yZGluZyB0byBjdXJyZW50IERCTVMgc3RhbmRhcmRzCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkcXVlcnkgICB0aGUgcXVlcnkgdG8gbW9kaWZ5CiAgICAgKiBAcGFyYW0gaW50ICAgICRmcm9tICAgIHRoZSByb3cgdG8gc3RhcnQgdG8gZmV0Y2hpbmcgKDAgPSB0aGUgZmlyc3Qgcm93KQogICAgICogQHBhcmFtIGludCAgICAkY291bnQgICB0aGUgbnVtYmVycyBvZiByb3dzIHRvIGZldGNoCiAgICAgKiBAcGFyYW0gbWl4ZWQgICRwYXJhbXMgIGFycmF5LCBzdHJpbmcgb3IgbnVtZXJpYyBkYXRhIHRvIGJlIHVzZWQgaW4KICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGlvbiBvZiB0aGUgc3RhdGVtZW50LiAgUXVhbnRpdHkgb2YgaXRlbXMKICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCBtdXN0IG1hdGNoIHF1YW50aXR5IG9mIHBsYWNlaG9sZGVycyBpbgogICAgICogICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnk6ICBtZWFuaW5nIDEgcGxhY2Vob2xkZXIgZm9yIG5vbi1hcnJheQogICAgICogICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVycyBvciAxIHBsYWNlaG9sZGVyIHBlciBhcnJheSBlbGVtZW50LgogICAgICoKICAgICAqIEByZXR1cm4gc3RyaW5nICB0aGUgcXVlcnkgc3RyaW5nIHdpdGggTElNSVQgY2xhdXNlcyBhZGRlZAogICAgICoKICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkCiAgICAgKi8KICAgIGZ1bmN0aW9uIG1vZGlmeUxpbWl0UXVlcnkoJHF1ZXJ5LCAkZnJvbSwgJGNvdW50LCAkcGFyYW1zID0gYXJyYXkoKSkKICAgIHsKICAgICAgICByZXR1cm4gIiRxdWVyeSBMSU1JVCAkY291bnQgT0ZGU0VUICRmcm9tIjsKICAgIH0KCiAgICAvLyB9fX0KICAgIC8vIHt7eyBwZ3NxbFJhaXNlRXJyb3IoKQoKICAgIC8qKgogICAgICogUHJvZHVjZXMgYSBEQl9FcnJvciBvYmplY3QgcmVnYXJkaW5nIHRoZSBjdXJyZW50IHByb2JsZW0KICAgICAqCiAgICAgKiBAcGFyYW0gaW50ICRlcnJubyAgaWYgdGhlIGVycm9yIGlzIGJlaW5nIG1hbnVhbGx5IHJhaXNlZCBwYXNzIGEKICAgICAqICAgICAgICAgICAgICAgICAgICAgREJfRVJST1IqIGNvbnN0YW50IGhlcmUuICBJZiB0aGlzIGlzbid0IHBhc3NlZAogICAgICogICAgICAgICAgICAgICAgICAgICB0aGUgZXJyb3IgaW5mb3JtYXRpb24gZ2F0aGVyZWQgZnJvbSB0aGUgREJNUy4KICAgICAqCiAgICAgKiBAcmV0dXJuIG9iamVjdCAgdGhlIERCX0Vycm9yIG9iamVjdAogICAgICoKICAgICAqIEBzZWUgREJfY29tbW9uOjpyYWlzZUVycm9yKCksCiAgICAgKiAgICAgIERCX3Bnc3FsOjplcnJvck5hdGl2ZSgpLCBEQl9wZ3NxbDo6ZXJyb3JDb2RlKCkKICAgICAqLwogICAgZnVuY3Rpb24gcGdzcWxSYWlzZUVycm9yKCRlcnJubyA9IG51bGwpCiAgICB7CiAgICAgICAgJG5hdGl2ZSA9ICR0aGlzLT5lcnJvck5hdGl2ZSgpOwogICAgICAgIGlmICghJG5hdGl2ZSkgewogICAgICAgICAgICAkbmF0aXZlID0gJ0RhdGFiYXNlIGNvbm5lY3Rpb24gaGFzIGJlZW4gbG9zdC4nOwogICAgICAgICAgICAkZXJybm8gPSBEQl9FUlJPUl9DT05ORUNUX0ZBSUxFRDsKICAgICAgICB9CiAgICAgICAgaWYgKCRlcnJubyA9PT0gbnVsbCkgewogICAgICAgICAgICAkZXJybm8gPSAkdGhpcy0+ZXJyb3JDb2RlKCRuYXRpdmUpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJHRoaXMtPnJhaXNlRXJyb3IoJGVycm5vLCBudWxsLCBudWxsLCBudWxsLCAkbmF0aXZlKTsKICAgIH0KCiAgICAvLyB9fX0KICAgIC8vIHt7eyBlcnJvck5hdGl2ZSgpCgogICAgLyoqCiAgICAgKiBHZXRzIHRoZSBEQk1TJyBuYXRpdmUgZXJyb3IgbWVzc2FnZSBwcm9kdWNlZCBieSB0aGUgbGFzdCBxdWVyeQogICAgICoKICAgICAqIHtAaW50ZXJuYWwgRXJyb3IgbWVzc2FnZXMgYXJlIHVzZWQgaW5zdGVhZCBvZiBlcnJvciBjb2RlcyAKICAgICAqIGluIG9yZGVyIHRvIHN1cHBvcnQgb2xkZXIgdmVyc2lvbnMgb2YgUG9zdGdyZVNRTC59fQogICAgICoKICAgICAqIEByZXR1cm4gc3RyaW5nICB0aGUgREJNUycgZXJyb3IgbWVzc2FnZQogICAgICovCiAgICBmdW5jdGlvbiBlcnJvck5hdGl2ZSgpCiAgICB7CiAgICAgICAgcmV0dXJuIEBwZ19lcnJvcm1lc3NhZ2UoJHRoaXMtPmNvbm5lY3Rpb24pOwogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IGVycm9yQ29kZSgpCgogICAgLyoqCiAgICAgKiBEZXRlcm1pbmVzIFBFQVI6OkRCIGVycm9yIGNvZGUgZnJvbSB0aGUgZGF0YWJhc2UncyB0ZXh0IGVycm9yIG1lc3NhZ2UuCiAgICAgKgogICAgICogQHBhcmFtICBzdHJpbmcgICRlcnJvcm1zZyAgZXJyb3IgbWVzc2FnZSByZXR1cm5lZCBmcm9tIHRoZSBkYXRhYmFzZQogICAgICogQHJldHVybiBpbnRlZ2VyICBhbiBlcnJvciBudW1iZXIgZnJvbSBhIERCIGVycm9yIGNvbnN0YW50CiAgICAgKi8KICAgIGZ1bmN0aW9uIGVycm9yQ29kZSgkZXJyb3Jtc2cpCiAgICB7CiAgICAgICAgc3RhdGljICRlcnJvcl9yZWdleHBzOwogICAgICAgIGlmICghaXNzZXQoJGVycm9yX3JlZ2V4cHMpKSB7CiAgICAgICAgICAgICRlcnJvcl9yZWdleHBzID0gYXJyYXkoCiAgICAgICAgICAgICAgICAnL2NvbHVtbiAuKiAob2YgcmVsYXRpb24gLiopP2RvZXMgbm90IGV4aXN0L2knCiAgICAgICAgICAgICAgICAgICAgPT4gREJfRVJST1JfTk9TVUNIRklFTEQsCiAgICAgICAgICAgICAgICAnLyhyZWxhdGlvbnxzZXF1ZW5jZXx0YWJsZSkuKmRvZXMgbm90IGV4aXN0fGNsYXNzIC4qIG5vdCBmb3VuZC9pJwogICAgICAgICAgICAgICAgICAgID0+IERCX0VSUk9SX05PU1VDSFRBQkxFLAogICAgICAgICAgICAgICAgJy9pbmRleCAuKiBkb2VzIG5vdCBleGlzdC8nCiAgICAgICAgICAgICAgICAgICAgPT4gREJfRVJST1JfTk9UX0ZPVU5ELAogICAgICAgICAgICAgICAgJy9yZWxhdGlvbiAuKiBhbHJlYWR5IGV4aXN0cy9pJwogICAgICAgICAgICAgICAgICAgID0+IERCX0VSUk9SX0FMUkVBRFlfRVhJU1RTLAogICAgICAgICAgICAgICAgJy8oZGl2aWRlfGRpdmlzaW9uKSBieSB6ZXJvJC9pJwogICAgICAgICAgICAgICAgICAgID0+IERCX0VSUk9SX0RJVlpFUk8sCiAgICAgICAgICAgICAgICAnL3BnX2F0b2k6IGVycm9yIGluIC4qOiBjYW5cJ3QgcGFyc2UgL2knCiAgICAgICAgICAgICAgICAgICAgPT4gREJfRVJST1JfSU5WQUxJRF9OVU1CRVIsCiAgICAgICAgICAgICAgICAnL2ludmFsaWQgaW5wdXQgc3ludGF4IGZvciggdHlwZSk/IChpbnRlZ2VyfG51bWVyaWMpL2knCiAgICAgICAgICAgICAgICAgICAgPT4gREJfRVJST1JfSU5WQUxJRF9OVU1CRVIsCiAgICAgICAgICAgICAgICAnL3ZhbHVlIC4qIGlzIG91dCBvZiByYW5nZSBmb3IgdHlwZSBcdyppbnQvaScKICAgICAgICAgICAgICAgICAgICA9PiBEQl9FUlJPUl9JTlZBTElEX05VTUJFUiwKICAgICAgICAgICAgICAgICcvaW50ZWdlciBvdXQgb2YgcmFuZ2UvaScKICAgICAgICAgICAgICAgICAgICA9PiBEQl9FUlJPUl9JTlZBTElEX05VTUJFUiwKICAgICAgICAgICAgICAgICcvdmFsdWUgdG9vIGxvbmcgZm9yIHR5cGUgY2hhcmFjdGVyL2knCiAgICAgICAgICAgICAgICAgICAgPT4gREJfRVJST1JfSU5WQUxJRCwKICAgICAgICAgICAgICAgICcvYXR0cmlidXRlIC4qIG5vdCBmb3VuZHxyZWxhdGlvbiAuKiBkb2VzIG5vdCBoYXZlIGF0dHJpYnV0ZS9pJwogICAgICAgICAgICAgICAgICAgID0+IERCX0VSUk9SX05PU1VDSEZJRUxELAogICAgICAgICAgICAgICAgJy9jb2x1bW4gLiogc3BlY2lmaWVkIGluIFVTSU5HIGNsYXVzZSBkb2VzIG5vdCBleGlzdCBpbiAobGVmdHxyaWdodCkgdGFibGUvaScKICAgICAgICAgICAgICAgICAgICA9PiBEQl9FUlJPUl9OT1NVQ0hGSUVMRCwKICAgICAgICAgICAgICAgICcvcGFyc2VyOiBwYXJzZSBlcnJvciBhdCBvciBuZWFyL2knCiAgICAgICAgICAgICAgICAgICAgPT4gREJfRVJST1JfU1lOVEFYLAogICAgICAgICAgICAgICAgJy9zeW50YXggZXJyb3IgYXQvJwogICAgICAgICAgICAgICAgICAgID0+IERCX0VSUk9SX1NZTlRBWCwKICAgICAgICAgICAgICAgICcvY29sdW1uIHJlZmVyZW5jZSAuKiBpcyBhbWJpZ3VvdXMvaScKICAgICAgICAgICAgICAgICAgICA9PiBEQl9FUlJPUl9TWU5UQVgsCiAgICAgICAgICAgICAgICAnL3Blcm1pc3Npb24gZGVuaWVkLycKICAgICAgICAgICAgICAgICAgICA9PiBEQl9FUlJPUl9BQ0NFU1NfVklPTEFUSU9OLAogICAgICAgICAgICAgICAgJy92aW9sYXRlcyBub3QtbnVsbCBjb25zdHJhaW50LycKICAgICAgICAgICAgICAgICAgICA9PiBEQl9FUlJPUl9DT05TVFJBSU5UX05PVF9OVUxMLAogICAgICAgICAgICAgICAgJy92aW9sYXRlcyBbXHcgXSsgY29uc3RyYWludC8nCiAgICAgICAgICAgICAgICAgICAgPT4gREJfRVJST1JfQ09OU1RSQUlOVCwKICAgICAgICAgICAgICAgICcvcmVmZXJlbnRpYWwgaW50ZWdyaXR5IHZpb2xhdGlvbi8nCiAgICAgICAgICAgICAgICAgICAgPT4gREJfRVJST1JfQ09OU1RSQUlOVCwKICAgICAgICAgICAgICAgICcvbW9yZSBleHByZXNzaW9ucyB0aGFuIHRhcmdldCBjb2x1bW5zL2knCiAgICAgICAgICAgICAgICAgICAgPT4gREJfRVJST1JfVkFMVUVfQ09VTlRfT05fUk9XLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBmb3JlYWNoICgkZXJyb3JfcmVnZXhwcyBhcyAkcmVnZXhwID0+ICRjb2RlKSB7CiAgICAgICAgICAgIGlmIChwcmVnX21hdGNoKCRyZWdleHAsICRlcnJvcm1zZykpIHsKICAgICAgICAgICAgICAgIHJldHVybiAkY29kZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvLyBGYWxsIGJhY2sgdG8gREJfRVJST1IgaWYgdGhlcmUgd2FzIG5vIG1hcHBpbmcuCiAgICAgICAgcmV0dXJuIERCX0VSUk9SOwogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IHRhYmxlSW5mbygpCgogICAgLyoqCiAgICAgKiBSZXR1cm5zIGluZm9ybWF0aW9uIGFib3V0IGEgdGFibGUgb3IgYSByZXN1bHQgc2V0CiAgICAgKgogICAgICogTk9URTogb25seSBzdXBwb3J0cyAndGFibGUnIGFuZCAnZmxhZ3MnIGlmIDx2YXI+JHJlc3VsdDwvdmFyPgogICAgICogaXMgYSB0YWJsZSBuYW1lLgogICAgICoKICAgICAqIEBwYXJhbSBvYmplY3R8c3RyaW5nICAkcmVzdWx0ICBEQl9yZXN1bHQgb2JqZWN0IGZyb20gYSBxdWVyeSBvciBhCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBjb250YWluaW5nIHRoZSBuYW1lIG9mIGEgdGFibGUuCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdoaWxlIHRoaXMgYWxzbyBhY2NlcHRzIGEgcXVlcnkgcmVzdWx0CiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlIGlkZW50aWZpZXIsIHRoaXMgYmVoYXZpb3IgaXMKICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwcmVjYXRlZC4KICAgICAqIEBwYXJhbSBpbnQgICAgICAgICAgICAkbW9kZSAgICBhIHZhbGlkIHRhYmxlSW5mbyBtb2RlCiAgICAgKgogICAgICogQHJldHVybiBhcnJheSAgYW4gYXNzb2NpYXRpdmUgYXJyYXkgd2l0aCB0aGUgaW5mb3JtYXRpb24gcmVxdWVzdGVkLgogICAgICogICAgICAgICAgICAgICAgIEEgREJfRXJyb3Igb2JqZWN0IG9uIGZhaWx1cmUuCiAgICAgKgogICAgICogQHNlZSBEQl9jb21tb246OnRhYmxlSW5mbygpCiAgICAgKi8KICAgIGZ1bmN0aW9uIHRhYmxlSW5mbygkcmVzdWx0LCAkbW9kZSA9IG51bGwpCiAgICB7CiAgICAgICAgaWYgKGlzX3N0cmluZygkcmVzdWx0KSkgewogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBQcm9iYWJseSByZWNlaXZlZCBhIHRhYmxlIG5hbWUuCiAgICAgICAgICAgICAqIENyZWF0ZSBhIHJlc3VsdCByZXNvdXJjZSBpZGVudGlmaWVyLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgJGlkID0gQHBnX2V4ZWMoJHRoaXMtPmNvbm5lY3Rpb24sICJTRUxFQ1QgKiBGUk9NICRyZXN1bHQgTElNSVQgMCIpOwogICAgICAgICAgICAkZ290X3N0cmluZyA9IHRydWU7CiAgICAgICAgfSBlbHNlaWYgKGlzc2V0KCRyZXN1bHQtPnJlc3VsdCkpIHsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogUHJvYmFibHkgcmVjZWl2ZWQgYSByZXN1bHQgb2JqZWN0LgogICAgICAgICAgICAgKiBFeHRyYWN0IHRoZSByZXN1bHQgcmVzb3VyY2UgaWRlbnRpZmllci4KICAgICAgICAgICAgICovCiAgICAgICAgICAgICRpZCA9ICRyZXN1bHQtPnJlc3VsdDsKICAgICAgICAgICAgJGdvdF9zdHJpbmcgPSBmYWxzZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBQcm9iYWJseSByZWNlaXZlZCBhIHJlc3VsdCByZXNvdXJjZSBpZGVudGlmaWVyLgogICAgICAgICAgICAgKiBDb3B5IGl0LgogICAgICAgICAgICAgKiBEZXByZWNhdGVkLiAgSGVyZSBmb3IgY29tcGF0aWJpbGl0eSBvbmx5LgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgJGlkID0gJHJlc3VsdDsKICAgICAgICAgICAgJGdvdF9zdHJpbmcgPSBmYWxzZTsKICAgICAgICB9CgogICAgICAgIGlmICghaXNfcmVzb3VyY2UoJGlkKSkgewogICAgICAgICAgICByZXR1cm4gJHRoaXMtPnBnc3FsUmFpc2VFcnJvcihEQl9FUlJPUl9ORUVEX01PUkVfREFUQSk7CiAgICAgICAgfQoKICAgICAgICBpZiAoJHRoaXMtPm9wdGlvbnNbJ3BvcnRhYmlsaXR5J10gJiBEQl9QT1JUQUJJTElUWV9MT1dFUkNBU0UpIHsKICAgICAgICAgICAgJGNhc2VfZnVuYyA9ICdzdHJ0b2xvd2VyJzsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkY2FzZV9mdW5jID0gJ3N0cnZhbCc7CiAgICAgICAgfQoKICAgICAgICAkY291bnQgPSBAcGdfbnVtZmllbGRzKCRpZCk7CiAgICAgICAgJHJlcyAgID0gYXJyYXkoKTsKCiAgICAgICAgaWYgKCRtb2RlKSB7CiAgICAgICAgICAgICRyZXNbJ251bV9maWVsZHMnXSA9ICRjb3VudDsKICAgICAgICB9CgogICAgICAgIGZvciAoJGkgPSAwOyAkaSA8ICRjb3VudDsgJGkrKykgewogICAgICAgICAgICAkcmVzWyRpXSA9IGFycmF5KAogICAgICAgICAgICAgICAgJ3RhYmxlJyA9PiAkZ290X3N0cmluZyA/ICRjYXNlX2Z1bmMoJHJlc3VsdCkgOiAnJywKICAgICAgICAgICAgICAgICduYW1lJyAgPT4gJGNhc2VfZnVuYyhAcGdfZmllbGRuYW1lKCRpZCwgJGkpKSwKICAgICAgICAgICAgICAgICd0eXBlJyAgPT4gQHBnX2ZpZWxkdHlwZSgkaWQsICRpKSwKICAgICAgICAgICAgICAgICdsZW4nICAgPT4gQHBnX2ZpZWxkc2l6ZSgkaWQsICRpKSwKICAgICAgICAgICAgICAgICdmbGFncycgPT4gJGdvdF9zdHJpbmcKICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAkdGhpcy0+X3BnRmllbGRGbGFncygkaWQsICRpLCAkcmVzdWx0KQogICAgICAgICAgICAgICAgICAgICAgICAgICA6ICcnLAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoJG1vZGUgJiBEQl9UQUJMRUlORk9fT1JERVIpIHsKICAgICAgICAgICAgICAgICRyZXNbJ29yZGVyJ11bJHJlc1skaV1bJ25hbWUnXV0gPSAkaTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoJG1vZGUgJiBEQl9UQUJMRUlORk9fT1JERVJUQUJMRSkgewogICAgICAgICAgICAgICAgJHJlc1snb3JkZXJ0YWJsZSddWyRyZXNbJGldWyd0YWJsZSddXVskcmVzWyRpXVsnbmFtZSddXSA9ICRpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBmcmVlIHRoZSByZXN1bHQgb25seSBpZiB3ZSB3ZXJlIGNhbGxlZCBvbiBhIHRhYmxlCiAgICAgICAgaWYgKCRnb3Rfc3RyaW5nKSB7CiAgICAgICAgICAgIEBwZ19mcmVlcmVzdWx0KCRpZCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiAkcmVzOwogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IF9wZ0ZpZWxkRmxhZ3MoKQoKICAgIC8qKgogICAgICogR2V0IGEgY29sdW1uJ3MgZmxhZ3MKICAgICAqCiAgICAgKiBTdXBwb3J0cyAibm90X251bGwiLCAiZGVmYXVsdF92YWx1ZSIsICJwcmltYXJ5X2tleSIsICJ1bmlxdWVfa2V5IgogICAgICogYW5kICJtdWx0aXBsZV9rZXkiLiAgVGhlIGRlZmF1bHQgdmFsdWUgaXMgcGFzc2VkIHRocm91Z2gKICAgICAqIHJhd3VybGVuY29kZSgpIGluIGNhc2UgdGhlcmUgYXJlIHNwYWNlcyBpbiBpdC4KICAgICAqCiAgICAgKiBAcGFyYW0gaW50ICRyZXNvdXJjZSAgIHRoZSBQb3N0Z3JlU1FMIHJlc3VsdCBpZGVudGlmaWVyCiAgICAgKiBAcGFyYW0gaW50ICRudW1fZmllbGQgIHRoZSBmaWVsZCBudW1iZXIKICAgICAqCiAgICAgKiBAcmV0dXJuIHN0cmluZyAgdGhlIGZsYWdzCiAgICAgKgogICAgICogQGFjY2VzcyBwcml2YXRlCiAgICAgKi8KICAgIGZ1bmN0aW9uIF9wZ0ZpZWxkRmxhZ3MoJHJlc291cmNlLCAkbnVtX2ZpZWxkLCAkdGFibGVfbmFtZSkKICAgIHsKICAgICAgICAkZmllbGRfbmFtZSA9IEBwZ19maWVsZG5hbWUoJHJlc291cmNlLCAkbnVtX2ZpZWxkKTsKCiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlcmUncyBhIHNjaGVtYSBpbiAkdGFibGVfbmFtZSBhbmQgdXBkYXRlIHRoaW5ncwogICAgICAgIC8vIGFjY29yZGluZ2x5LgogICAgICAgICRmcm9tID0gJ3BnX2F0dHJpYnV0ZSBmLCBwZ19jbGFzcyB0YWIsIHBnX3R5cGUgdHlwJzsKICAgICAgICBpZiAoc3RycG9zKCR0YWJsZV9uYW1lLCAnLicpICE9PSBmYWxzZSkgewogICAgICAgICAgICAkZnJvbSAuPSAnLCBwZ19uYW1lc3BhY2UgbnNwJzsKICAgICAgICAgICAgbGlzdCgkc2NoZW1hLCAkdGFibGUpID0gZXhwbG9kZSgnLicsICR0YWJsZV9uYW1lKTsKICAgICAgICAgICAgJHRhYmxlV2hlcmUgPSAidGFiLnJlbG5hbWUgPSAnJHRhYmxlJyBBTkQgdGFiLnJlbG5hbWVzcGFjZSA9IG5zcC5vaWQgQU5EIG5zcC5uc3BuYW1lID0gJyRzY2hlbWEnIjsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkdGFibGVXaGVyZSA9ICJ0YWIucmVsbmFtZSA9ICckdGFibGVfbmFtZSciOwogICAgICAgIH0KCiAgICAgICAgJHJlc3VsdCA9IEBwZ19leGVjKCR0aGlzLT5jb25uZWN0aW9uLCAiU0VMRUNUIGYuYXR0bm90bnVsbCwgZi5hdHRoYXNkZWYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUk9NICRmcm9tCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFUkUgdGFiLnJlbG5hbWUgPSB0eXAudHlwbmFtZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFORCB0eXAudHlwcmVsaWQgPSBmLmF0dHJlbGlkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU5EIGYuYXR0bmFtZSA9ICckZmllbGRfbmFtZScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTkQgJHRhYmxlV2hlcmUiKTsKICAgICAgICBpZiAoQHBnX251bXJvd3MoJHJlc3VsdCkgPiAwKSB7CiAgICAgICAgICAgICRyb3cgPSBAcGdfZmV0Y2hfcm93KCRyZXN1bHQsIDApOwogICAgICAgICAgICAkZmxhZ3MgID0gKCRyb3dbMF0gPT0gJ3QnKSA/ICdub3RfbnVsbCAnIDogJyc7CgogICAgICAgICAgICBpZiAoJHJvd1sxXSA9PSAndCcpIHsKICAgICAgICAgICAgICAgICRyZXN1bHQgPSBAcGdfZXhlYygkdGhpcy0+Y29ubmVjdGlvbiwgIlNFTEVDVCBhLmFkc3JjCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZST00gJGZyb20sIHBnX2F0dHJkZWYgYQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVSRSB0YWIucmVsbmFtZSA9IHR5cC50eXBuYW1lIEFORCB0eXAudHlwcmVsaWQgPSBmLmF0dHJlbGlkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFORCBmLmF0dHJlbGlkID0gYS5hZHJlbGlkIEFORCBmLmF0dG5hbWUgPSAnJGZpZWxkX25hbWUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFORCAkdGFibGVXaGVyZSBBTkQgZi5hdHRudW0gPSBhLmFkbnVtIik7CiAgICAgICAgICAgICAgICAkcm93ID0gQHBnX2ZldGNoX3JvdygkcmVzdWx0LCAwKTsKICAgICAgICAgICAgICAgICRudW0gPSBwcmVnX3JlcGxhY2UoIi8nKC4qKSc6Olx3Ky8iLCAiXFwxIiwgJHJvd1swXSk7CiAgICAgICAgICAgICAgICAkZmxhZ3MgLj0gJ2RlZmF1bHRfJyAuIHJhd3VybGVuY29kZSgkbnVtKSAuICcgJzsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRmbGFncyA9ICcnOwogICAgICAgIH0KICAgICAgICAkcmVzdWx0ID0gQHBnX2V4ZWMoJHRoaXMtPmNvbm5lY3Rpb24sICJTRUxFQ1QgaS5pbmRpc3VuaXF1ZSwgaS5pbmRpc3ByaW1hcnksIGkuaW5ka2V5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJPTSAkZnJvbSwgcGdfaW5kZXggaQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRVJFIHRhYi5yZWxuYW1lID0gdHlwLnR5cG5hbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTkQgdHlwLnR5cHJlbGlkID0gZi5hdHRyZWxpZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFORCBmLmF0dHJlbGlkID0gaS5pbmRyZWxpZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFORCBmLmF0dG5hbWUgPSAnJGZpZWxkX25hbWUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU5EICR0YWJsZVdoZXJlIik7CiAgICAgICAgJGNvdW50ID0gQHBnX251bXJvd3MoJHJlc3VsdCk7CgogICAgICAgIGZvciAoJGkgPSAwOyAkaSA8ICRjb3VudCA7ICRpKyspIHsKICAgICAgICAgICAgJHJvdyA9IEBwZ19mZXRjaF9yb3coJHJlc3VsdCwgJGkpOwogICAgICAgICAgICAka2V5cyA9IGV4cGxvZGUoJyAnLCAkcm93WzJdKTsKCiAgICAgICAgICAgIGlmIChpbl9hcnJheSgkbnVtX2ZpZWxkICsgMSwgJGtleXMpKSB7CiAgICAgICAgICAgICAgICAkZmxhZ3MgLj0gKCRyb3dbMF0gPT0gJ3QnICYmICRyb3dbMV0gPT0gJ2YnKSA/ICd1bmlxdWVfa2V5ICcgOiAnJzsKICAgICAgICAgICAgICAgICRmbGFncyAuPSAoJHJvd1sxXSA9PSAndCcpID8gJ3ByaW1hcnlfa2V5ICcgOiAnJzsKICAgICAgICAgICAgICAgIGlmIChjb3VudCgka2V5cykgPiAxKQogICAgICAgICAgICAgICAgICAgICRmbGFncyAuPSAnbXVsdGlwbGVfa2V5ICc7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiB0cmltKCRmbGFncyk7CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgZ2V0U3BlY2lhbFF1ZXJ5KCkKCiAgICAvKioKICAgICAqIE9idGFpbnMgdGhlIHF1ZXJ5IHN0cmluZyBuZWVkZWQgZm9yIGxpc3RpbmcgYSBnaXZlbiB0eXBlIG9mIG9iamVjdHMKICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICR0eXBlICB0aGUga2luZCBvZiBvYmplY3RzIHlvdSB3YW50IHRvIHJldHJpZXZlCiAgICAgKgogICAgICogQHJldHVybiBzdHJpbmcgIHRoZSBTUUwgcXVlcnkgc3RyaW5nIG9yIG51bGwgaWYgdGhlIGRyaXZlciBkb2Vzbid0CiAgICAgKiAgICAgICAgICAgICAgICAgIHN1cHBvcnQgdGhlIG9iamVjdCB0eXBlIHJlcXVlc3RlZAogICAgICoKICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkCiAgICAgKiBAc2VlIERCX2NvbW1vbjo6Z2V0TGlzdE9mKCkKICAgICAqLwogICAgZnVuY3Rpb24gZ2V0U3BlY2lhbFF1ZXJ5KCR0eXBlKQogICAgewogICAgICAgIHN3aXRjaCAoJHR5cGUpIHsKICAgICAgICAgICAgY2FzZSAndGFibGVzJzoKICAgICAgICAgICAgICAgIHJldHVybiAnU0VMRUNUIGMucmVsbmFtZSBBUyAiTmFtZSInCiAgICAgICAgICAgICAgICAgICAgICAgIC4gJyBGUk9NIHBnX2NsYXNzIGMsIHBnX3VzZXIgdScKICAgICAgICAgICAgICAgICAgICAgICAgLiAnIFdIRVJFIGMucmVsb3duZXIgPSB1LnVzZXN5c2lkJwogICAgICAgICAgICAgICAgICAgICAgICAuICIgQU5EIGMucmVsa2luZCA9ICdyJyIKICAgICAgICAgICAgICAgICAgICAgICAgLiAnIEFORCBOT1QgRVhJU1RTJwogICAgICAgICAgICAgICAgICAgICAgICAuICcgKFNFTEVDVCAxIEZST00gcGdfdmlld3MnCiAgICAgICAgICAgICAgICAgICAgICAgIC4gJyAgV0hFUkUgdmlld25hbWUgPSBjLnJlbG5hbWUpJwogICAgICAgICAgICAgICAgICAgICAgICAuICIgQU5EIGMucmVsbmFtZSAhfiAnXihwZ198c3FsXyknIgogICAgICAgICAgICAgICAgICAgICAgICAuICcgVU5JT04nCiAgICAgICAgICAgICAgICAgICAgICAgIC4gJyBTRUxFQ1QgYy5yZWxuYW1lIEFTICJOYW1lIicKICAgICAgICAgICAgICAgICAgICAgICAgLiAnIEZST00gcGdfY2xhc3MgYycKICAgICAgICAgICAgICAgICAgICAgICAgLiAiIFdIRVJFIGMucmVsa2luZCA9ICdyJyIKICAgICAgICAgICAgICAgICAgICAgICAgLiAnIEFORCBOT1QgRVhJU1RTJwogICAgICAgICAgICAgICAgICAgICAgICAuICcgKFNFTEVDVCAxIEZST00gcGdfdmlld3MnCiAgICAgICAgICAgICAgICAgICAgICAgIC4gJyAgV0hFUkUgdmlld25hbWUgPSBjLnJlbG5hbWUpJwogICAgICAgICAgICAgICAgICAgICAgICAuICcgQU5EIE5PVCBFWElTVFMnCiAgICAgICAgICAgICAgICAgICAgICAgIC4gJyAoU0VMRUNUIDEgRlJPTSBwZ191c2VyJwogICAgICAgICAgICAgICAgICAgICAgICAuICcgIFdIRVJFIHVzZXN5c2lkID0gYy5yZWxvd25lciknCiAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBBTkQgYy5yZWxuYW1lICF+ICdecGdfJyI7CiAgICAgICAgICAgIGNhc2UgJ3NjaGVtYS50YWJsZXMnOgogICAgICAgICAgICAgICAgcmV0dXJuICJTRUxFQ1Qgc2NoZW1hbmFtZSB8fCAnLicgfHwgdGFibGVuYW1lIgogICAgICAgICAgICAgICAgICAgICAgICAuICcgQVMgIk5hbWUiJwogICAgICAgICAgICAgICAgICAgICAgICAuICcgRlJPTSBwZ19jYXRhbG9nLnBnX3RhYmxlcycKICAgICAgICAgICAgICAgICAgICAgICAgLiAnIFdIRVJFIHNjaGVtYW5hbWUgTk9UIElOJwogICAgICAgICAgICAgICAgICAgICAgICAuICIgKCdwZ19jYXRhbG9nJywgJ2luZm9ybWF0aW9uX3NjaGVtYScsICdwZ190b2FzdCcpIjsKICAgICAgICAgICAgY2FzZSAnc2NoZW1hLnZpZXdzJzoKICAgICAgICAgICAgICAgIHJldHVybiAiU0VMRUNUIHNjaGVtYW5hbWUgfHwgJy4nIHx8IHZpZXduYW1lIGZyb20gcGdfdmlld3MgV0hFUkUgc2NoZW1hbmFtZSIKICAgICAgICAgICAgICAgICAgICAgICAgLiAiIE5PVCBJTiAoJ2luZm9ybWF0aW9uX3NjaGVtYScsICdwZ19jYXRhbG9nJykiOwogICAgICAgICAgICBjYXNlICd2aWV3cyc6CiAgICAgICAgICAgICAgICAvLyBUYWJsZSBjb2xzOiB2aWV3bmFtZSB8IHZpZXdvd25lciB8IGRlZmluaXRpb24KICAgICAgICAgICAgICAgIHJldHVybiAnU0VMRUNUIHZpZXduYW1lIGZyb20gcGdfdmlld3MgV0hFUkUgc2NoZW1hbmFtZScKICAgICAgICAgICAgICAgICAgICAgICAgLiAiIE5PVCBJTiAoJ2luZm9ybWF0aW9uX3NjaGVtYScsICdwZ19jYXRhbG9nJykiOwogICAgICAgICAgICBjYXNlICd1c2Vycyc6CiAgICAgICAgICAgICAgICAvLyBjb2xzOiB1c2VuYW1lIHx1c2VzeXNpZHx1c2VjcmVhdGVkYnx1c2V0cmFjZXx1c2VzdXBlcnx1c2VjYXR1cGR8cGFzc3dkICB8dmFsdW50aWwKICAgICAgICAgICAgICAgIHJldHVybiAnU0VMRUNUIHVzZW5hbWUgRlJPTSBwZ191c2VyJzsKICAgICAgICAgICAgY2FzZSAnZGF0YWJhc2VzJzoKICAgICAgICAgICAgICAgIHJldHVybiAnU0VMRUNUIGRhdG5hbWUgRlJPTSBwZ19kYXRhYmFzZSc7CiAgICAgICAgICAgIGNhc2UgJ2Z1bmN0aW9ucyc6CiAgICAgICAgICAgIGNhc2UgJ3Byb2NlZHVyZXMnOgogICAgICAgICAgICAgICAgcmV0dXJuICdTRUxFQ1QgcHJvbmFtZSBGUk9NIHBnX3Byb2MgV0hFUkUgcHJvb3duZXIgPD4gMSc7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICB9CgogICAgLy8gfX19Cgp9CgovKgogKiBMb2NhbCB2YXJpYWJsZXM6CiAqIHRhYi13aWR0aDogNAogKiBjLWJhc2ljLW9mZnNldDogNAogKiBFbmQ6CiAqLwoKPz4K]]></data>
	</file>
	<file>
	  <filename>/lib/pear/DB/sqlite.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qIHZpbTogc2V0IGV4cGFuZHRhYiB0YWJzdG9wPTQgc2hpZnR3aWR0aD00IHNvZnR0YWJzdG9wPTQ6ICovCgovKioKICogVGhlIFBFQVIgREIgZHJpdmVyIGZvciBQSFAncyBzcWxpdGUgZXh0ZW5zaW9uCiAqIGZvciBpbnRlcmFjdGluZyB3aXRoIFNRTGl0ZSBkYXRhYmFzZXMKICoKICogUEhQIHZlcnNpb25zIDQgYW5kIDUKICoKICogTElDRU5TRTogVGhpcyBzb3VyY2UgZmlsZSBpcyBzdWJqZWN0IHRvIHZlcnNpb24gMy4wIG9mIHRoZSBQSFAgbGljZW5zZQogKiB0aGF0IGlzIGF2YWlsYWJsZSB0aHJvdWdoIHRoZSB3b3JsZC13aWRlLXdlYiBhdCB0aGUgZm9sbG93aW5nIFVSSToKICogaHR0cDovL3d3dy5waHAubmV0L2xpY2Vuc2UvM18wLnR4dC4gIElmIHlvdSBkaWQgbm90IHJlY2VpdmUgYSBjb3B5IG9mCiAqIHRoZSBQSFAgTGljZW5zZSBhbmQgYXJlIHVuYWJsZSB0byBvYnRhaW4gaXQgdGhyb3VnaCB0aGUgd2ViLCBwbGVhc2UKICogc2VuZCBhIG5vdGUgdG8gbGljZW5zZUBwaHAubmV0IHNvIHdlIGNhbiBtYWlsIHlvdSBhIGNvcHkgaW1tZWRpYXRlbHkuCiAqCiAqIEBjYXRlZ29yeSAgIERhdGFiYXNlCiAqIEBwYWNrYWdlICAgIERCCiAqIEBhdXRob3IgICAgIFVycyBHZWhyaWcgPHVyc0BjaXJjbGUuY2g+CiAqIEBhdXRob3IgICAgIE1pa2EgVHV1cG9sYSA8dHV1cG9sYUBhcHBlbHNpaW5pLm5ldD4KICogQGF1dGhvciAgICAgRGFuaWVsIENvbnZpc3NvciA8ZGFuaWVsY0BwaHAubmV0PgogKiBAY29weXJpZ2h0ICAxOTk3LTIwMDUgVGhlIFBIUCBHcm91cAogKiBAbGljZW5zZSAgICBodHRwOi8vd3d3LnBocC5uZXQvbGljZW5zZS8zXzAudHh0ICBQSFAgTGljZW5zZSAzLjAgMy4wCiAqIEB2ZXJzaW9uICAgIENWUzogJElkOiBzcWxpdGUucGhwLHYgMS4xMTQgMjAwNy8wMS8xMiAwMjo0MTowNyBhaGFydmV5IEV4cCAkCiAqIEBsaW5rICAgICAgIGh0dHA6Ly9wZWFyLnBocC5uZXQvcGFja2FnZS9EQgogKi8KCi8qKgogKiBPYnRhaW4gdGhlIERCX2NvbW1vbiBjbGFzcyBzbyBpdCBjYW4gYmUgZXh0ZW5kZWQgZnJvbQogKi8KcmVxdWlyZV9vbmNlICdEQi9jb21tb24ucGhwJzsKCi8qKgogKiBUaGUgbWV0aG9kcyBQRUFSIERCIHVzZXMgdG8gaW50ZXJhY3Qgd2l0aCBQSFAncyBzcWxpdGUgZXh0ZW5zaW9uCiAqIGZvciBpbnRlcmFjdGluZyB3aXRoIFNRTGl0ZSBkYXRhYmFzZXMKICoKICogVGhlc2UgbWV0aG9kcyBvdmVybG9hZCB0aGUgb25lcyBkZWNsYXJlZCBpbiBEQl9jb21tb24uCiAqCiAqIE5PVElDRTogIFRoaXMgZHJpdmVyIG5lZWRzIFBIUCdzIHRyYWNrX2Vycm9ycyBpbmkgc2V0dGluZyB0byBiZSBvbi4KICogSXQgaXMgYXV0b21hdGljYWxseSB0dXJuZWQgb24gd2hlbiBjb25uZWN0aW5nIHRvIHRoZSBkYXRhYmFzZS4KICogTWFrZSBzdXJlIHlvdXIgc2NyaXB0cyBkb24ndCB0dXJuIGl0IG9mZi4KICoKICogQGNhdGVnb3J5ICAgRGF0YWJhc2UKICogQHBhY2thZ2UgICAgREIKICogQGF1dGhvciAgICAgVXJzIEdlaHJpZyA8dXJzQGNpcmNsZS5jaD4KICogQGF1dGhvciAgICAgTWlrYSBUdXVwb2xhIDx0dXVwb2xhQGFwcGVsc2lpbmkubmV0PgogKiBAYXV0aG9yICAgICBEYW5pZWwgQ29udmlzc29yIDxkYW5pZWxjQHBocC5uZXQ+CiAqIEBjb3B5cmlnaHQgIDE5OTctMjAwNSBUaGUgUEhQIEdyb3VwCiAqIEBsaWNlbnNlICAgIGh0dHA6Ly93d3cucGhwLm5ldC9saWNlbnNlLzNfMC50eHQgIFBIUCBMaWNlbnNlIDMuMCAzLjAKICogQHZlcnNpb24gICAgUmVsZWFzZTogMS43LjEyCiAqIEBsaW5rICAgICAgIGh0dHA6Ly9wZWFyLnBocC5uZXQvcGFja2FnZS9EQgogKi8KY2xhc3MgREJfc3FsaXRlIGV4dGVuZHMgREJfY29tbW9uCnsKICAgIC8vIHt7eyBwcm9wZXJ0aWVzCgogICAgLyoqCiAgICAgKiBUaGUgREIgZHJpdmVyIHR5cGUgKG15c3FsLCBvY2k4LCBvZGJjLCBldGMuKQogICAgICogQHZhciBzdHJpbmcKICAgICAqLwogICAgdmFyICRwaHB0eXBlID0gJ3NxbGl0ZSc7CgogICAgLyoqCiAgICAgKiBUaGUgZGF0YWJhc2Ugc3ludGF4IHZhcmlhbnQgdG8gYmUgdXNlZCAoZGIyLCBhY2Nlc3MsIGV0Yy4pLCBpZiBhbnkKICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHZhciAkZGJzeW50YXggPSAnc3FsaXRlJzsKCiAgICAvKioKICAgICAqIFRoZSBjYXBhYmlsaXRpZXMgb2YgdGhpcyBEQiBpbXBsZW1lbnRhdGlvbgogICAgICoKICAgICAqIFRoZSAnbmV3X2xpbmsnIGVsZW1lbnQgY29udGFpbnMgdGhlIFBIUCB2ZXJzaW9uIHRoYXQgZmlyc3QgcHJvdmlkZWQKICAgICAqIG5ld19saW5rIHN1cHBvcnQgZm9yIHRoaXMgREJNUy4gIENvbnRhaW5zIGZhbHNlIGlmIGl0J3MgdW5zdXBwb3J0ZWQuCiAgICAgKgogICAgICogTWVhbmluZyBvZiB0aGUgJ2xpbWl0JyBlbGVtZW50OgogICAgICogICArICdlbXVsYXRlJyA9IGVtdWxhdGUgd2l0aCBmZXRjaCByb3cgYnkgbnVtYmVyCiAgICAgKiAgICsgJ2FsdGVyJyAgID0gYWx0ZXIgdGhlIHF1ZXJ5CiAgICAgKiAgICsgZmFsc2UgICAgID0gc2tpcCByb3dzCiAgICAgKgogICAgICogQHZhciBhcnJheQogICAgICovCiAgICB2YXIgJGZlYXR1cmVzID0gYXJyYXkoCiAgICAgICAgJ2xpbWl0JyAgICAgICAgID0+ICdhbHRlcicsCiAgICAgICAgJ25ld19saW5rJyAgICAgID0+IGZhbHNlLAogICAgICAgICdudW1yb3dzJyAgICAgICA9PiB0cnVlLAogICAgICAgICdwY29ubmVjdCcgICAgICA9PiB0cnVlLAogICAgICAgICdwcmVwYXJlJyAgICAgICA9PiBmYWxzZSwKICAgICAgICAnc3NsJyAgICAgICAgICAgPT4gZmFsc2UsCiAgICAgICAgJ3RyYW5zYWN0aW9ucycgID0+IGZhbHNlLAogICAgKTsKCiAgICAvKioKICAgICAqIEEgbWFwcGluZyBvZiBuYXRpdmUgZXJyb3IgY29kZXMgdG8gREIgZXJyb3IgY29kZXMKICAgICAqCiAgICAgKiB7QGludGVybmFsICBFcnJvciBjb2RlcyBhY2NvcmRpbmcgdG8gc3FsaXRlX2V4ZWMuICBTZWUgdGhlIG9ubGluZQogICAgICogbWFudWFsIGF0IGh0dHA6Ly9zcWxpdGUub3JnL2NfaW50ZXJmYWNlLmh0bWwgZm9yIGluZm8uCiAgICAgKiBUaGlzIGVycm9yIGhhbmRsaW5nIGJhc2VkIG9uIHNxbGl0ZV9leGVjIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQufX0KICAgICAqCiAgICAgKiBAdmFyIGFycmF5CiAgICAgKi8KICAgIHZhciAkZXJyb3Jjb2RlX21hcCA9IGFycmF5KAogICAgKTsKCiAgICAvKioKICAgICAqIFRoZSByYXcgZGF0YWJhc2UgY29ubmVjdGlvbiBjcmVhdGVkIGJ5IFBIUAogICAgICogQHZhciByZXNvdXJjZQogICAgICovCiAgICB2YXIgJGNvbm5lY3Rpb247CgogICAgLyoqCiAgICAgKiBUaGUgRFNOIGluZm9ybWF0aW9uIGZvciBjb25uZWN0aW5nIHRvIGEgZGF0YWJhc2UKICAgICAqIEB2YXIgYXJyYXkKICAgICAqLwogICAgdmFyICRkc24gPSBhcnJheSgpOwoKCiAgICAvKioKICAgICAqIFNRTGl0ZSBkYXRhIHR5cGVzCiAgICAgKgogICAgICogQGxpbmsgaHR0cDovL3d3dy5zcWxpdGUub3JnL2RhdGF0eXBlcy5odG1sCiAgICAgKgogICAgICogQHZhciBhcnJheQogICAgICovCiAgICB2YXIgJGtleXdvcmRzID0gYXJyYXkgKAogICAgICAgICdCTE9CJyAgICAgID0+ICcnLAogICAgICAgICdCT09MRUFOJyAgID0+ICcnLAogICAgICAgICdDSEFSQUNURVInID0+ICcnLAogICAgICAgICdDTE9CJyAgICAgID0+ICcnLAogICAgICAgICdGTE9BVCcgICAgID0+ICcnLAogICAgICAgICdJTlRFR0VSJyAgID0+ICcnLAogICAgICAgICdLRVknICAgICAgID0+ICcnLAogICAgICAgICdOQVRJT05BTCcgID0+ICcnLAogICAgICAgICdOVU1FUklDJyAgID0+ICcnLAogICAgICAgICdOVkFSQ0hBUicgID0+ICcnLAogICAgICAgICdQUklNQVJZJyAgID0+ICcnLAogICAgICAgICdURVhUJyAgICAgID0+ICcnLAogICAgICAgICdUSU1FU1RBTVAnID0+ICcnLAogICAgICAgICdVTklRVUUnICAgID0+ICcnLAogICAgICAgICdWQVJDSEFSJyAgID0+ICcnLAogICAgICAgICdWQVJZSU5HJyAgID0+ICcnLAogICAgKTsKCiAgICAvKioKICAgICAqIFRoZSBtb3N0IHJlY2VudCBlcnJvciBtZXNzYWdlIGZyb20gJHBocF9lcnJvcm1zZwogICAgICogQHZhciBzdHJpbmcKICAgICAqIEBhY2Nlc3MgcHJpdmF0ZQogICAgICovCiAgICB2YXIgJF9sYXN0ZXJyb3IgPSAnJzsKCgogICAgLy8gfX19CiAgICAvLyB7e3sgY29uc3RydWN0b3IKCiAgICAvKioKICAgICAqIFRoaXMgY29uc3RydWN0b3IgY2FsbHMgPGtiZD4kdGhpcy0+REJfY29tbW9uKCk8L2tiZD4KICAgICAqCiAgICAgKiBAcmV0dXJuIHZvaWQKICAgICAqLwogICAgZnVuY3Rpb24gREJfc3FsaXRlKCkKICAgIHsKICAgICAgICAkdGhpcy0+REJfY29tbW9uKCk7CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgY29ubmVjdCgpCgogICAgLyoqCiAgICAgKiBDb25uZWN0IHRvIHRoZSBkYXRhYmFzZSBzZXJ2ZXIsIGxvZyBpbiBhbmQgb3BlbiB0aGUgZGF0YWJhc2UKICAgICAqCiAgICAgKiBEb24ndCBjYWxsIHRoaXMgbWV0aG9kIGRpcmVjdGx5LiAgVXNlIERCOjpjb25uZWN0KCkgaW5zdGVhZC4KICAgICAqCiAgICAgKiBQRUFSIERCJ3Mgc3FsaXRlIGRyaXZlciBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIGV4dHJhIERTTiBvcHRpb25zOgogICAgICogICArIG1vZGUgIFRoZSBwZXJtaXNzaW9ucyBmb3IgdGhlIGRhdGFiYXNlIGZpbGUsIGluIGZvdXIgZGlnaXQKICAgICAqICAgICAgICAgICAgY2htb2Qgb2N0YWwgZm9ybWF0IChlZyAiMDYwMCIpLgogICAgICoKICAgICAqIEV4YW1wbGUgb2YgY29ubmVjdGluZyB0byBhIGRhdGFiYXNlIGluIHJlYWQtb25seSBtb2RlOgogICAgICogPGNvZGU+CiAgICAgKiByZXF1aXJlX29uY2UgJ0RCLnBocCc7CiAgICAgKiAKICAgICAqICRkc24gPSAnc3FsaXRlOi8vL3BhdGgvYW5kL25hbWUvb2YvZGIvZmlsZT9tb2RlPTA0MDAnOwogICAgICogJG9wdGlvbnMgPSBhcnJheSgKICAgICAqICAgICAncG9ydGFiaWxpdHknID0+IERCX1BPUlRBQklMSVRZX0FMTCwKICAgICAqICk7CiAgICAgKiAKICAgICAqICRkYiA9JiBEQjo6Y29ubmVjdCgkZHNuLCAkb3B0aW9ucyk7CiAgICAgKiBpZiAoUEVBUjo6aXNFcnJvcigkZGIpKSB7CiAgICAgKiAgICAgZGllKCRkYi0+Z2V0TWVzc2FnZSgpKTsKICAgICAqIH0KICAgICAqIDwvY29kZT4KICAgICAqCiAgICAgKiBAcGFyYW0gYXJyYXkgJGRzbiAgICAgICAgIHRoZSBkYXRhIHNvdXJjZSBuYW1lCiAgICAgKiBAcGFyYW0gYm9vbCAgJHBlcnNpc3RlbnQgIHNob3VsZCB0aGUgY29ubmVjdGlvbiBiZSBwZXJzaXN0ZW50PwogICAgICoKICAgICAqIEByZXR1cm4gaW50ICBEQl9PSyBvbiBzdWNjZXNzLiBBIERCX0Vycm9yIG9iamVjdCBvbiBmYWlsdXJlLgogICAgICovCiAgICBmdW5jdGlvbiBjb25uZWN0KCRkc24sICRwZXJzaXN0ZW50ID0gZmFsc2UpCiAgICB7CiAgICAgICAgaWYgKCFQRUFSOjpsb2FkRXh0ZW5zaW9uKCdzcWxpdGUnKSkgewogICAgICAgICAgICByZXR1cm4gJHRoaXMtPnJhaXNlRXJyb3IoREJfRVJST1JfRVhURU5TSU9OX05PVF9GT1VORCk7CiAgICAgICAgfQoKICAgICAgICAkdGhpcy0+ZHNuID0gJGRzbjsKICAgICAgICBpZiAoJGRzblsnZGJzeW50YXgnXSkgewogICAgICAgICAgICAkdGhpcy0+ZGJzeW50YXggPSAkZHNuWydkYnN5bnRheCddOwogICAgICAgIH0KCiAgICAgICAgaWYgKCEkZHNuWydkYXRhYmFzZSddKSB7CiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+c3FsaXRlUmFpc2VFcnJvcihEQl9FUlJPUl9BQ0NFU1NfVklPTEFUSU9OKTsKICAgICAgICB9CgogICAgICAgIGlmICgkZHNuWydkYXRhYmFzZSddICE9PSAnOm1lbW9yeTonKSB7CiAgICAgICAgICAgIGlmICghZmlsZV9leGlzdHMoJGRzblsnZGF0YWJhc2UnXSkpIHsKICAgICAgICAgICAgICAgIGlmICghdG91Y2goJGRzblsnZGF0YWJhc2UnXSkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPnNxbGl0ZVJhaXNlRXJyb3IoREJfRVJST1JfTk9UX0ZPVU5EKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICghaXNzZXQoJGRzblsnbW9kZSddKSB8fAogICAgICAgICAgICAgICAgICAgICFpc19udW1lcmljKCRkc25bJ21vZGUnXSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJG1vZGUgPSAwNjQ0OwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkbW9kZSA9IG9jdGRlYygkZHNuWydtb2RlJ10pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCFjaG1vZCgkZHNuWydkYXRhYmFzZSddLCAkbW9kZSkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPnNxbGl0ZVJhaXNlRXJyb3IoREJfRVJST1JfTk9UX0ZPVU5EKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICghZmlsZV9leGlzdHMoJGRzblsnZGF0YWJhc2UnXSkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPnNxbGl0ZVJhaXNlRXJyb3IoREJfRVJST1JfTk9UX0ZPVU5EKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIWlzX2ZpbGUoJGRzblsnZGF0YWJhc2UnXSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+c3FsaXRlUmFpc2VFcnJvcihEQl9FUlJPUl9JTlZBTElEKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIWlzX3JlYWRhYmxlKCRkc25bJ2RhdGFiYXNlJ10pKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPnNxbGl0ZVJhaXNlRXJyb3IoREJfRVJST1JfQUNDRVNTX1ZJT0xBVElPTik7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICRjb25uZWN0X2Z1bmN0aW9uID0gJHBlcnNpc3RlbnQgPyAnc3FsaXRlX3BvcGVuJyA6ICdzcWxpdGVfb3Blbic7CgogICAgICAgIC8vIHRyYWNrX2Vycm9ycyBtdXN0IHJlbWFpbiBvbiBmb3Igc2ltcGxlUXVlcnkoKQogICAgICAgIEBpbmlfc2V0KCd0cmFja19lcnJvcnMnLCAxKTsKICAgICAgICAkcGhwX2Vycm9ybXNnID0gJyc7CgogICAgICAgIGlmICghJHRoaXMtPmNvbm5lY3Rpb24gPSBAJGNvbm5lY3RfZnVuY3Rpb24oJGRzblsnZGF0YWJhc2UnXSkpIHsKICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5yYWlzZUVycm9yKERCX0VSUk9SX05PREJTRUxFQ1RFRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIG51bGwsIG51bGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcGhwX2Vycm9ybXNnKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIERCX09LOwogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IGRpc2Nvbm5lY3QoKQoKICAgIC8qKgogICAgICogRGlzY29ubmVjdHMgZnJvbSB0aGUgZGF0YWJhc2Ugc2VydmVyCiAgICAgKgogICAgICogQHJldHVybiBib29sICBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUKICAgICAqLwogICAgZnVuY3Rpb24gZGlzY29ubmVjdCgpCiAgICB7CiAgICAgICAgJHJldCA9IEBzcWxpdGVfY2xvc2UoJHRoaXMtPmNvbm5lY3Rpb24pOwogICAgICAgICR0aGlzLT5jb25uZWN0aW9uID0gbnVsbDsKICAgICAgICByZXR1cm4gJHJldDsKICAgIH0KCiAgICAvLyB9fX0KICAgIC8vIHt7eyBzaW1wbGVRdWVyeSgpCgogICAgLyoqCiAgICAgKiBTZW5kcyBhIHF1ZXJ5IHRvIHRoZSBkYXRhYmFzZSBzZXJ2ZXIKICAgICAqCiAgICAgKiBOT1RJQ0U6ICBUaGlzIG1ldGhvZCBuZWVkcyBQSFAncyB0cmFja19lcnJvcnMgaW5pIHNldHRpbmcgdG8gYmUgb24uCiAgICAgKiBJdCBpcyBhdXRvbWF0aWNhbGx5IHR1cm5lZCBvbiB3aGVuIGNvbm5lY3RpbmcgdG8gdGhlIGRhdGFiYXNlLgogICAgICogTWFrZSBzdXJlIHlvdXIgc2NyaXB0cyBkb24ndCB0dXJuIGl0IG9mZi4KICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICB0aGUgU1FMIHF1ZXJ5IHN0cmluZwogICAgICoKICAgICAqIEByZXR1cm4gbWl4ZWQgICsgYSBQSFAgcmVzdWx0IHJlc3JvdWNlIGZvciBzdWNjZXNzZnVsIFNFTEVDVCBxdWVyaWVzCiAgICAgKiAgICAgICAgICAgICAgICArIHRoZSBEQl9PSyBjb25zdGFudCBmb3Igb3RoZXIgc3VjY2Vzc2Z1bCBxdWVyaWVzCiAgICAgKiAgICAgICAgICAgICAgICArIGEgREJfRXJyb3Igb2JqZWN0IG9uIGZhaWx1cmUKICAgICAqLwogICAgZnVuY3Rpb24gc2ltcGxlUXVlcnkoJHF1ZXJ5KQogICAgewogICAgICAgICRpc21hbmlwID0gJHRoaXMtPl9jaGVja01hbmlwKCRxdWVyeSk7CiAgICAgICAgJHRoaXMtPmxhc3RfcXVlcnkgPSAkcXVlcnk7CiAgICAgICAgJHF1ZXJ5ID0gJHRoaXMtPm1vZGlmeVF1ZXJ5KCRxdWVyeSk7CgogICAgICAgICRwaHBfZXJyb3Jtc2cgPSAnJzsKCiAgICAgICAgJHJlc3VsdCA9IEBzcWxpdGVfcXVlcnkoJHF1ZXJ5LCAkdGhpcy0+Y29ubmVjdGlvbik7CiAgICAgICAgJHRoaXMtPl9sYXN0ZXJyb3IgPSAkcGhwX2Vycm9ybXNnID8gJHBocF9lcnJvcm1zZyA6ICcnOwoKICAgICAgICAkdGhpcy0+cmVzdWx0ID0gJHJlc3VsdDsKICAgICAgICBpZiAoISR0aGlzLT5yZXN1bHQpIHsKICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5zcWxpdGVSYWlzZUVycm9yKG51bGwpOwogICAgICAgIH0KCiAgICAgICAgLy8gc3FsaXRlX3F1ZXJ5KCkgc2VlbXMgdG8gYWxsd2F5cyByZXR1cm4gYSByZXNvdXJjZQogICAgICAgIC8vIHNvIGNhbnQgdXNlIHRoYXQuIFVzaW5nICRpc21hbmlwIGluc3RlYWQKICAgICAgICBpZiAoISRpc21hbmlwKSB7CiAgICAgICAgICAgICRudW1Sb3dzID0gJHRoaXMtPm51bVJvd3MoJHJlc3VsdCk7CiAgICAgICAgICAgIGlmIChpc19vYmplY3QoJG51bVJvd3MpKSB7CiAgICAgICAgICAgICAgICAvLyB3ZSd2ZSBnb3QgUEVBUl9FcnJvcgogICAgICAgICAgICAgICAgcmV0dXJuICRudW1Sb3dzOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAkcmVzdWx0OwogICAgICAgIH0KICAgICAgICByZXR1cm4gREJfT0s7CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgbmV4dFJlc3VsdCgpCgogICAgLyoqCiAgICAgKiBNb3ZlIHRoZSBpbnRlcm5hbCBzcWxpdGUgcmVzdWx0IHBvaW50ZXIgdG8gdGhlIG5leHQgYXZhaWxhYmxlIHJlc3VsdAogICAgICoKICAgICAqIEBwYXJhbSByZXNvdXJjZSAkcmVzdWx0ICB0aGUgdmFsaWQgc3FsaXRlIHJlc3VsdCByZXNvdXJjZQogICAgICoKICAgICAqIEByZXR1cm4gYm9vbCAgdHJ1ZSBpZiBhIHJlc3VsdCBpcyBhdmFpbGFibGUgb3RoZXJ3aXNlIHJldHVybiBmYWxzZQogICAgICovCiAgICBmdW5jdGlvbiBuZXh0UmVzdWx0KCRyZXN1bHQpCiAgICB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IGZldGNoSW50bygpCgogICAgLyoqCiAgICAgKiBQbGFjZXMgYSByb3cgZnJvbSB0aGUgcmVzdWx0IHNldCBpbnRvIHRoZSBnaXZlbiBhcnJheQogICAgICoKICAgICAqIEZvcm1hdGluZyBvZiB0aGUgYXJyYXkgYW5kIHRoZSBkYXRhIHRoZXJlaW4gYXJlIGNvbmZpZ3VyYWJsZS4KICAgICAqIFNlZSBEQl9yZXN1bHQ6OmZldGNoSW50bygpIGZvciBtb3JlIGluZm9ybWF0aW9uLgogICAgICoKICAgICAqIFRoaXMgbWV0aG9kIGlzIG5vdCBtZWFudCB0byBiZSBjYWxsZWQgZGlyZWN0bHkuICBVc2UKICAgICAqIERCX3Jlc3VsdDo6ZmV0Y2hJbnRvKCkgaW5zdGVhZC4gIEl0IGNhbid0IGJlIGRlY2xhcmVkICJwcm90ZWN0ZWQiCiAgICAgKiBiZWNhdXNlIERCX3Jlc3VsdCBpcyBhIHNlcGFyYXRlIG9iamVjdC4KICAgICAqCiAgICAgKiBAcGFyYW0gcmVzb3VyY2UgJHJlc3VsdCAgICB0aGUgcXVlcnkgcmVzdWx0IHJlc291cmNlCiAgICAgKiBAcGFyYW0gYXJyYXkgICAgJGFyciAgICAgICB0aGUgcmVmZXJlbmNlZCBhcnJheSB0byBwdXQgdGhlIGRhdGEgaW4KICAgICAqIEBwYXJhbSBpbnQgICAgICAkZmV0Y2htb2RlIGhvdyB0aGUgcmVzdWx0aW5nIGFycmF5IHNob3VsZCBiZSBpbmRleGVkCiAgICAgKiBAcGFyYW0gaW50ICAgICAgJHJvd251bSAgICB0aGUgcm93IG51bWJlciB0byBmZXRjaCAoMCA9IGZpcnN0IHJvdykKICAgICAqCiAgICAgKiBAcmV0dXJuIG1peGVkICBEQl9PSyBvbiBzdWNjZXNzLCBOVUxMIHdoZW4gdGhlIGVuZCBvZiBhIHJlc3VsdCBzZXQgaXMKICAgICAqICAgICAgICAgICAgICAgICByZWFjaGVkIG9yIG9uIGZhaWx1cmUKICAgICAqCiAgICAgKiBAc2VlIERCX3Jlc3VsdDo6ZmV0Y2hJbnRvKCkKICAgICAqLwogICAgZnVuY3Rpb24gZmV0Y2hJbnRvKCRyZXN1bHQsICYkYXJyLCAkZmV0Y2htb2RlLCAkcm93bnVtID0gbnVsbCkKICAgIHsKICAgICAgICBpZiAoJHJvd251bSAhPT0gbnVsbCkgewogICAgICAgICAgICBpZiAoIUBzcWxpdGVfc2VlaygkdGhpcy0+cmVzdWx0LCAkcm93bnVtKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCRmZXRjaG1vZGUgJiBEQl9GRVRDSE1PREVfQVNTT0MpIHsKICAgICAgICAgICAgJGFyciA9IEBzcWxpdGVfZmV0Y2hfYXJyYXkoJHJlc3VsdCwgU1FMSVRFX0FTU09DKTsKICAgICAgICAgICAgaWYgKCR0aGlzLT5vcHRpb25zWydwb3J0YWJpbGl0eSddICYgREJfUE9SVEFCSUxJVFlfTE9XRVJDQVNFICYmICRhcnIpIHsKICAgICAgICAgICAgICAgICRhcnIgPSBhcnJheV9jaGFuZ2Vfa2V5X2Nhc2UoJGFyciwgQ0FTRV9MT1dFUik7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkYXJyID0gQHNxbGl0ZV9mZXRjaF9hcnJheSgkcmVzdWx0LCBTUUxJVEVfTlVNKTsKICAgICAgICB9CiAgICAgICAgaWYgKCEkYXJyKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICBpZiAoJHRoaXMtPm9wdGlvbnNbJ3BvcnRhYmlsaXR5J10gJiBEQl9QT1JUQUJJTElUWV9SVFJJTSkgewogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBFdmVuIHRob3VnaCB0aGlzIERCTVMgYWxyZWFkeSB0cmltcyBvdXRwdXQsIHdlIGRvIHRoaXMgYmVjYXVzZQogICAgICAgICAgICAgKiBhIGZpZWxkIG1pZ2h0IGhhdmUgaW50ZW50aW9uYWwgd2hpdGVzcGFjZSBhdCB0aGUgZW5kIHRoYXQKICAgICAgICAgICAgICogZ2V0cyByZW1vdmVkIGJ5IERCX1BPUlRBQklMSVRZX1JUUklNIHVuZGVyIGFub3RoZXIgZHJpdmVyLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgJHRoaXMtPl9ydHJpbUFycmF5VmFsdWVzKCRhcnIpOwogICAgICAgIH0KICAgICAgICBpZiAoJHRoaXMtPm9wdGlvbnNbJ3BvcnRhYmlsaXR5J10gJiBEQl9QT1JUQUJJTElUWV9OVUxMX1RPX0VNUFRZKSB7CiAgICAgICAgICAgICR0aGlzLT5fY29udmVydE51bGxBcnJheVZhbHVlc1RvRW1wdHkoJGFycik7CiAgICAgICAgfQogICAgICAgIHJldHVybiBEQl9PSzsKICAgIH0KCiAgICAvLyB9fX0KICAgIC8vIHt7eyBmcmVlUmVzdWx0KCkKCiAgICAvKioKICAgICAqIERlbGV0ZXMgdGhlIHJlc3VsdCBzZXQgYW5kIGZyZWVzIHRoZSBtZW1vcnkgb2NjdXBpZWQgYnkgdGhlIHJlc3VsdCBzZXQKICAgICAqCiAgICAgKiBUaGlzIG1ldGhvZCBpcyBub3QgbWVhbnQgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LiAgVXNlCiAgICAgKiBEQl9yZXN1bHQ6OmZyZWUoKSBpbnN0ZWFkLiAgSXQgY2FuJ3QgYmUgZGVjbGFyZWQgInByb3RlY3RlZCIKICAgICAqIGJlY2F1c2UgREJfcmVzdWx0IGlzIGEgc2VwYXJhdGUgb2JqZWN0LgogICAgICoKICAgICAqIEBwYXJhbSByZXNvdXJjZSAkcmVzdWx0ICBQSFAncyBxdWVyeSByZXN1bHQgcmVzb3VyY2UKICAgICAqCiAgICAgKiBAcmV0dXJuIGJvb2wgIFRSVUUgb24gc3VjY2VzcywgRkFMU0UgaWYgJHJlc3VsdCBpcyBpbnZhbGlkCiAgICAgKgogICAgICogQHNlZSBEQl9yZXN1bHQ6OmZyZWUoKQogICAgICovCiAgICBmdW5jdGlvbiBmcmVlUmVzdWx0KCYkcmVzdWx0KQogICAgewogICAgICAgIC8vIFhYWCBObyBuYXRpdmUgZnJlZT8KICAgICAgICBpZiAoIWlzX3Jlc291cmNlKCRyZXN1bHQpKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgJHJlc3VsdCA9IG51bGw7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgbnVtQ29scygpCgogICAgLyoqCiAgICAgKiBHZXRzIHRoZSBudW1iZXIgb2YgY29sdW1ucyBpbiBhIHJlc3VsdCBzZXQKICAgICAqCiAgICAgKiBUaGlzIG1ldGhvZCBpcyBub3QgbWVhbnQgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LiAgVXNlCiAgICAgKiBEQl9yZXN1bHQ6Om51bUNvbHMoKSBpbnN0ZWFkLiAgSXQgY2FuJ3QgYmUgZGVjbGFyZWQgInByb3RlY3RlZCIKICAgICAqIGJlY2F1c2UgREJfcmVzdWx0IGlzIGEgc2VwYXJhdGUgb2JqZWN0LgogICAgICoKICAgICAqIEBwYXJhbSByZXNvdXJjZSAkcmVzdWx0ICBQSFAncyBxdWVyeSByZXN1bHQgcmVzb3VyY2UKICAgICAqCiAgICAgKiBAcmV0dXJuIGludCAgdGhlIG51bWJlciBvZiBjb2x1bW5zLiAgQSBEQl9FcnJvciBvYmplY3Qgb24gZmFpbHVyZS4KICAgICAqCiAgICAgKiBAc2VlIERCX3Jlc3VsdDo6bnVtQ29scygpCiAgICAgKi8KICAgIGZ1bmN0aW9uIG51bUNvbHMoJHJlc3VsdCkKICAgIHsKICAgICAgICAkY29scyA9IEBzcWxpdGVfbnVtX2ZpZWxkcygkcmVzdWx0KTsKICAgICAgICBpZiAoISRjb2xzKSB7CiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+c3FsaXRlUmFpc2VFcnJvcigpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJGNvbHM7CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgbnVtUm93cygpCgogICAgLyoqCiAgICAgKiBHZXRzIHRoZSBudW1iZXIgb2Ygcm93cyBpbiBhIHJlc3VsdCBzZXQKICAgICAqCiAgICAgKiBUaGlzIG1ldGhvZCBpcyBub3QgbWVhbnQgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LiAgVXNlCiAgICAgKiBEQl9yZXN1bHQ6Om51bVJvd3MoKSBpbnN0ZWFkLiAgSXQgY2FuJ3QgYmUgZGVjbGFyZWQgInByb3RlY3RlZCIKICAgICAqIGJlY2F1c2UgREJfcmVzdWx0IGlzIGEgc2VwYXJhdGUgb2JqZWN0LgogICAgICoKICAgICAqIEBwYXJhbSByZXNvdXJjZSAkcmVzdWx0ICBQSFAncyBxdWVyeSByZXN1bHQgcmVzb3VyY2UKICAgICAqCiAgICAgKiBAcmV0dXJuIGludCAgdGhlIG51bWJlciBvZiByb3dzLiAgQSBEQl9FcnJvciBvYmplY3Qgb24gZmFpbHVyZS4KICAgICAqCiAgICAgKiBAc2VlIERCX3Jlc3VsdDo6bnVtUm93cygpCiAgICAgKi8KICAgIGZ1bmN0aW9uIG51bVJvd3MoJHJlc3VsdCkKICAgIHsKICAgICAgICAkcm93cyA9IEBzcWxpdGVfbnVtX3Jvd3MoJHJlc3VsdCk7CiAgICAgICAgaWYgKCRyb3dzID09PSBudWxsKSB7CiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+c3FsaXRlUmFpc2VFcnJvcigpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJHJvd3M7CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgYWZmZWN0ZWQoKQoKICAgIC8qKgogICAgICogRGV0ZXJtaW5lcyB0aGUgbnVtYmVyIG9mIHJvd3MgYWZmZWN0ZWQgYnkgYSBkYXRhIG1hbml1cGxhdGlvbiBxdWVyeQogICAgICoKICAgICAqIDAgaXMgcmV0dXJuZWQgZm9yIHF1ZXJpZXMgdGhhdCBkb24ndCBtYW5pcHVsYXRlIGRhdGEuCiAgICAgKgogICAgICogQHJldHVybiBpbnQgIHRoZSBudW1iZXIgb2Ygcm93cy4gIEEgREJfRXJyb3Igb2JqZWN0IG9uIGZhaWx1cmUuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGFmZmVjdGVkUm93cygpCiAgICB7CiAgICAgICAgcmV0dXJuIEBzcWxpdGVfY2hhbmdlcygkdGhpcy0+Y29ubmVjdGlvbik7CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgZHJvcFNlcXVlbmNlKCkKCiAgICAvKioKICAgICAqIERlbGV0ZXMgYSBzZXF1ZW5jZQogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgJHNlcV9uYW1lICBuYW1lIG9mIHRoZSBzZXF1ZW5jZSB0byBiZSBkZWxldGVkCiAgICAgKgogICAgICogQHJldHVybiBpbnQgIERCX09LIG9uIHN1Y2Nlc3MuICBBIERCX0Vycm9yIG9iamVjdCBvbiBmYWlsdXJlLgogICAgICoKICAgICAqIEBzZWUgREJfY29tbW9uOjpkcm9wU2VxdWVuY2UoKSwgREJfY29tbW9uOjpnZXRTZXF1ZW5jZU5hbWUoKSwKICAgICAqICAgICAgREJfc3FsaXRlOjpuZXh0SUQoKSwgREJfc3FsaXRlOjpjcmVhdGVTZXF1ZW5jZSgpCiAgICAgKi8KICAgIGZ1bmN0aW9uIGRyb3BTZXF1ZW5jZSgkc2VxX25hbWUpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5xdWVyeSgnRFJPUCBUQUJMRSAnIC4gJHRoaXMtPmdldFNlcXVlbmNlTmFtZSgkc2VxX25hbWUpKTsKICAgIH0KCiAgICAvKioKICAgICAqIENyZWF0ZXMgYSBuZXcgc2VxdWVuY2UKICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICRzZXFfbmFtZSAgbmFtZSBvZiB0aGUgbmV3IHNlcXVlbmNlCiAgICAgKgogICAgICogQHJldHVybiBpbnQgIERCX09LIG9uIHN1Y2Nlc3MuICBBIERCX0Vycm9yIG9iamVjdCBvbiBmYWlsdXJlLgogICAgICoKICAgICAqIEBzZWUgREJfY29tbW9uOjpjcmVhdGVTZXF1ZW5jZSgpLCBEQl9jb21tb246OmdldFNlcXVlbmNlTmFtZSgpLAogICAgICogICAgICBEQl9zcWxpdGU6Om5leHRJRCgpLCBEQl9zcWxpdGU6OmRyb3BTZXF1ZW5jZSgpCiAgICAgKi8KICAgIGZ1bmN0aW9uIGNyZWF0ZVNlcXVlbmNlKCRzZXFfbmFtZSkKICAgIHsKICAgICAgICAkc2VxbmFtZSA9ICR0aGlzLT5nZXRTZXF1ZW5jZU5hbWUoJHNlcV9uYW1lKTsKICAgICAgICAkcXVlcnkgICA9ICdDUkVBVEUgVEFCTEUgJyAuICRzZXFuYW1lIC4KICAgICAgICAgICAgICAgICAgICcgKGlkIElOVEVHRVIgVU5TSUdORUQgUFJJTUFSWSBLRVkpICc7CiAgICAgICAgJHJlc3VsdCAgPSAkdGhpcy0+cXVlcnkoJHF1ZXJ5KTsKICAgICAgICBpZiAoREI6OmlzRXJyb3IoJHJlc3VsdCkpIHsKICAgICAgICAgICAgcmV0dXJuKCRyZXN1bHQpOwogICAgICAgIH0KICAgICAgICAkcXVlcnkgICA9ICJDUkVBVEUgVFJJR0dFUiAke3NlcW5hbWV9X2NsZWFudXAgQUZURVIgSU5TRVJUIE9OICRzZXFuYW1lCiAgICAgICAgICAgICAgICAgICAgQkVHSU4KICAgICAgICAgICAgICAgICAgICAgICAgREVMRVRFIEZST00gJHNlcW5hbWUgV0hFUkUgaWQ8TEFTVF9JTlNFUlRfUk9XSUQoKTsKICAgICAgICAgICAgICAgICAgICBFTkQgIjsKICAgICAgICAkcmVzdWx0ICA9ICR0aGlzLT5xdWVyeSgkcXVlcnkpOwogICAgICAgIGlmIChEQjo6aXNFcnJvcigkcmVzdWx0KSkgewogICAgICAgICAgICByZXR1cm4oJHJlc3VsdCk7CiAgICAgICAgfQogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IG5leHRJZCgpCgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBuZXh0IGZyZWUgaWQgaW4gYSBzZXF1ZW5jZQogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgICRzZXFfbmFtZSAgbmFtZSBvZiB0aGUgc2VxdWVuY2UKICAgICAqIEBwYXJhbSBib29sZWFuICRvbmRlbWFuZCAgd2hlbiB0cnVlLCB0aGUgc2VxZW5jZSBpcyBhdXRvbWF0aWNhbGx5CiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVkIGlmIGl0IGRvZXMgbm90IGV4aXN0CiAgICAgKgogICAgICogQHJldHVybiBpbnQgIHRoZSBuZXh0IGlkIG51bWJlciBpbiB0aGUgc2VxdWVuY2UuCiAgICAgKiAgICAgICAgICAgICAgIEEgREJfRXJyb3Igb2JqZWN0IG9uIGZhaWx1cmUuCiAgICAgKgogICAgICogQHNlZSBEQl9jb21tb246Om5leHRJRCgpLCBEQl9jb21tb246OmdldFNlcXVlbmNlTmFtZSgpLAogICAgICogICAgICBEQl9zcWxpdGU6OmNyZWF0ZVNlcXVlbmNlKCksIERCX3NxbGl0ZTo6ZHJvcFNlcXVlbmNlKCkKICAgICAqLwogICAgZnVuY3Rpb24gbmV4dElkKCRzZXFfbmFtZSwgJG9uZGVtYW5kID0gdHJ1ZSkKICAgIHsKICAgICAgICAkc2VxbmFtZSA9ICR0aGlzLT5nZXRTZXF1ZW5jZU5hbWUoJHNlcV9uYW1lKTsKCiAgICAgICAgZG8gewogICAgICAgICAgICAkcmVwZWF0ID0gMDsKICAgICAgICAgICAgJHRoaXMtPnB1c2hFcnJvckhhbmRsaW5nKFBFQVJfRVJST1JfUkVUVVJOKTsKICAgICAgICAgICAgJHJlc3VsdCA9ICR0aGlzLT5xdWVyeSgiSU5TRVJUIElOVE8gJHNlcW5hbWUgKGlkKSBWQUxVRVMgKE5VTEwpIik7CiAgICAgICAgICAgICR0aGlzLT5wb3BFcnJvckhhbmRsaW5nKCk7CiAgICAgICAgICAgIGlmICgkcmVzdWx0ID09PSBEQl9PSykgewogICAgICAgICAgICAgICAgJGlkID0gQHNxbGl0ZV9sYXN0X2luc2VydF9yb3dpZCgkdGhpcy0+Y29ubmVjdGlvbik7CiAgICAgICAgICAgICAgICBpZiAoJGlkICE9IDApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJGlkOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2VpZiAoJG9uZGVtYW5kICYmIERCOjppc0Vycm9yKCRyZXN1bHQpICYmCiAgICAgICAgICAgICAgICAgICAgICAkcmVzdWx0LT5nZXRDb2RlKCkgPT0gREJfRVJST1JfTk9TVUNIVEFCTEUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRyZXN1bHQgPSAkdGhpcy0+Y3JlYXRlU2VxdWVuY2UoJHNlcV9uYW1lKTsKICAgICAgICAgICAgICAgIGlmIChEQjo6aXNFcnJvcigkcmVzdWx0KSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+cmFpc2VFcnJvcigkcmVzdWx0KTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJHJlcGVhdCA9IDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9IHdoaWxlICgkcmVwZWF0KTsKCiAgICAgICAgcmV0dXJuICR0aGlzLT5yYWlzZUVycm9yKCRyZXN1bHQpOwogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IGdldERiRmlsZVN0YXRzKCkKCiAgICAvKioKICAgICAqIEdldCB0aGUgZmlsZSBzdGF0cyBmb3IgdGhlIGN1cnJlbnQgZGF0YWJhc2UKICAgICAqCiAgICAgKiBQb3NzaWJsZSBhcmd1bWVudHMgYXJlIGRldiwgaW5vLCBtb2RlLCBubGluaywgdWlkLCBnaWQsIHJkZXYsIHNpemUsCiAgICAgKiBhdGltZSwgbXRpbWUsIGN0aW1lLCBibGtzaXplLCBibG9ja3Mgb3IgYSBudW1lcmljIGtleSBiZXR3ZWVuCiAgICAgKiAwIGFuZCAxMi4KICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICRhcmcgIHRoZSBhcnJheSBrZXkgZm9yIHN0YXRzKCkKICAgICAqCiAgICAgKiBAcmV0dXJuIG1peGVkICBhbiBhcnJheSBvbiBhbiB1bnNwZWNpZmllZCBrZXksIGludGVnZXIgb24gYSBwYXNzZWQKICAgICAqICAgICAgICAgICAgICAgIGFyZyBhbmQgZmFsc2UgYXQgYSBzdGF0cyBlcnJvcgogICAgICovCiAgICBmdW5jdGlvbiBnZXREYkZpbGVTdGF0cygkYXJnID0gJycpCiAgICB7CiAgICAgICAgJHN0YXRzID0gc3RhdCgkdGhpcy0+ZHNuWydkYXRhYmFzZSddKTsKICAgICAgICBpZiAoJHN0YXRzID09IGZhbHNlKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgaWYgKGlzX2FycmF5KCRzdGF0cykpIHsKICAgICAgICAgICAgaWYgKGlzX251bWVyaWMoJGFyZykpIHsKICAgICAgICAgICAgICAgIGlmICgoKGludCkkYXJnIDw9IDEyKSAmICgoaW50KSRhcmcgPj0gMCkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gJHN0YXRzWyRhcmcgXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoYXJyYXlfa2V5X2V4aXN0cyh0cmltKCRhcmcpLCAkc3RhdHMpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJHN0YXRzWyRhcmcgXTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gJHN0YXRzOwogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IGVzY2FwZVNpbXBsZSgpCgogICAgLyoqCiAgICAgKiBFc2NhcGVzIGEgc3RyaW5nIGFjY29yZGluZyB0byB0aGUgY3VycmVudCBEQk1TJ3Mgc3RhbmRhcmRzCiAgICAgKgogICAgICogSW4gU1FMaXRlLCB0aGlzIG1ha2VzIHRoaW5ncyBzYWZlIGZvciBpbnNlcnRzL3VwZGF0ZXMsIGJ1dCBtYXkKICAgICAqIGNhdXNlIHByb2JsZW1zIHdoZW4gcGVyZm9ybWluZyB0ZXh0IGNvbXBhcmlzb25zIGFnYWluc3QgY29sdW1ucwogICAgICogY29udGFpbmluZyBiaW5hcnkgZGF0YS4gU2VlIHRoZQogICAgICoge0BsaW5rIGh0dHA6Ly9waHAubmV0L3NxbGl0ZV9lc2NhcGVfc3RyaW5nIFBIUCBtYW51YWx9IGZvciBtb3JlIGluZm8uCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkc3RyICB0aGUgc3RyaW5nIHRvIGJlIGVzY2FwZWQKICAgICAqCiAgICAgKiBAcmV0dXJuIHN0cmluZyAgdGhlIGVzY2FwZWQgc3RyaW5nCiAgICAgKgogICAgICogQHNpbmNlIE1ldGhvZCBhdmFpbGFibGUgc2luY2UgUmVsZWFzZSAxLjYuMQogICAgICogQHNlZSBEQl9jb21tb246OmVzY2FwZVNpbXBsZSgpCiAgICAgKi8KICAgIGZ1bmN0aW9uIGVzY2FwZVNpbXBsZSgkc3RyKQogICAgewogICAgICAgIHJldHVybiBAc3FsaXRlX2VzY2FwZV9zdHJpbmcoJHN0cik7CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgbW9kaWZ5TGltaXRRdWVyeSgpCgogICAgLyoqCiAgICAgKiBBZGRzIExJTUlUIGNsYXVzZXMgdG8gYSBxdWVyeSBzdHJpbmcgYWNjb3JkaW5nIHRvIGN1cnJlbnQgREJNUyBzdGFuZGFyZHMKICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICRxdWVyeSAgIHRoZSBxdWVyeSB0byBtb2RpZnkKICAgICAqIEBwYXJhbSBpbnQgICAgJGZyb20gICAgdGhlIHJvdyB0byBzdGFydCB0byBmZXRjaGluZyAoMCA9IHRoZSBmaXJzdCByb3cpCiAgICAgKiBAcGFyYW0gaW50ICAgICRjb3VudCAgIHRoZSBudW1iZXJzIG9mIHJvd3MgdG8gZmV0Y2gKICAgICAqIEBwYXJhbSBtaXhlZCAgJHBhcmFtcyAgYXJyYXksIHN0cmluZyBvciBudW1lcmljIGRhdGEgdG8gYmUgdXNlZCBpbgogICAgICogICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0aW9uIG9mIHRoZSBzdGF0ZW1lbnQuICBRdWFudGl0eSBvZiBpdGVtcwogICAgICogICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkIG11c3QgbWF0Y2ggcXVhbnRpdHkgb2YgcGxhY2Vob2xkZXJzIGluCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeTogIG1lYW5pbmcgMSBwbGFjZWhvbGRlciBmb3Igbm9uLWFycmF5CiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzIG9yIDEgcGxhY2Vob2xkZXIgcGVyIGFycmF5IGVsZW1lbnQuCiAgICAgKgogICAgICogQHJldHVybiBzdHJpbmcgIHRoZSBxdWVyeSBzdHJpbmcgd2l0aCBMSU1JVCBjbGF1c2VzIGFkZGVkCiAgICAgKgogICAgICogQGFjY2VzcyBwcm90ZWN0ZWQKICAgICAqLwogICAgZnVuY3Rpb24gbW9kaWZ5TGltaXRRdWVyeSgkcXVlcnksICRmcm9tLCAkY291bnQsICRwYXJhbXMgPSBhcnJheSgpKQogICAgewogICAgICAgIHJldHVybiAiJHF1ZXJ5IExJTUlUICRjb3VudCBPRkZTRVQgJGZyb20iOwogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IG1vZGlmeVF1ZXJ5KCkKCiAgICAvKioKICAgICAqIENoYW5nZXMgYSBxdWVyeSBzdHJpbmcgZm9yIHZhcmlvdXMgREJNUyBzcGVjaWZpYyByZWFzb25zCiAgICAgKgogICAgICogVGhpcyBsaXR0bGUgaGFjayBsZXRzIHlvdSBrbm93IGhvdyBtYW55IHJvd3Mgd2VyZSBkZWxldGVkCiAgICAgKiB3aGVuIHJ1bm5pbmcgYSAiREVMRVRFIEZST00gdGFibGUiIHF1ZXJ5LiAgT25seSBpbXBsZW1lbnRlZAogICAgICogaWYgdGhlIERCX1BPUlRBQklMSVRZX0RFTEVURV9DT1VOVCBwb3J0YWJpbGl0eSBvcHRpb24gaXMgb24uCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkcXVlcnkgIHRoZSBxdWVyeSBzdHJpbmcgdG8gbW9kaWZ5CiAgICAgKgogICAgICogQHJldHVybiBzdHJpbmcgIHRoZSBtb2RpZmllZCBxdWVyeSBzdHJpbmcKICAgICAqCiAgICAgKiBAYWNjZXNzIHByb3RlY3RlZAogICAgICogQHNlZSBEQl9jb21tb246OnNldE9wdGlvbigpCiAgICAgKi8KICAgIGZ1bmN0aW9uIG1vZGlmeVF1ZXJ5KCRxdWVyeSkKICAgIHsKICAgICAgICBpZiAoJHRoaXMtPm9wdGlvbnNbJ3BvcnRhYmlsaXR5J10gJiBEQl9QT1JUQUJJTElUWV9ERUxFVEVfQ09VTlQpIHsKICAgICAgICAgICAgaWYgKHByZWdfbWF0Y2goJy9eXHMqREVMRVRFXHMrRlJPTVxzKyhcUyspXHMqJC9pJywgJHF1ZXJ5KSkgewogICAgICAgICAgICAgICAgJHF1ZXJ5ID0gcHJlZ19yZXBsYWNlKCcvXlxzKkRFTEVURVxzK0ZST01ccysoXFMrKVxzKiQvJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnREVMRVRFIEZST00gXDEgV0hFUkUgMT0xJywgJHF1ZXJ5KTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gJHF1ZXJ5OwogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IHNxbGl0ZVJhaXNlRXJyb3IoKQoKICAgIC8qKgogICAgICogUHJvZHVjZXMgYSBEQl9FcnJvciBvYmplY3QgcmVnYXJkaW5nIHRoZSBjdXJyZW50IHByb2JsZW0KICAgICAqCiAgICAgKiBAcGFyYW0gaW50ICRlcnJubyAgaWYgdGhlIGVycm9yIGlzIGJlaW5nIG1hbnVhbGx5IHJhaXNlZCBwYXNzIGEKICAgICAqICAgICAgICAgICAgICAgICAgICAgREJfRVJST1IqIGNvbnN0YW50IGhlcmUuICBJZiB0aGlzIGlzbid0IHBhc3NlZAogICAgICogICAgICAgICAgICAgICAgICAgICB0aGUgZXJyb3IgaW5mb3JtYXRpb24gZ2F0aGVyZWQgZnJvbSB0aGUgREJNUy4KICAgICAqCiAgICAgKiBAcmV0dXJuIG9iamVjdCAgdGhlIERCX0Vycm9yIG9iamVjdAogICAgICoKICAgICAqIEBzZWUgREJfY29tbW9uOjpyYWlzZUVycm9yKCksCiAgICAgKiAgICAgIERCX3NxbGl0ZTo6ZXJyb3JOYXRpdmUoKSwgREJfc3FsaXRlOjplcnJvckNvZGUoKQogICAgICovCiAgICBmdW5jdGlvbiBzcWxpdGVSYWlzZUVycm9yKCRlcnJubyA9IG51bGwpCiAgICB7CiAgICAgICAgJG5hdGl2ZSA9ICR0aGlzLT5lcnJvck5hdGl2ZSgpOwogICAgICAgIGlmICgkZXJybm8gPT09IG51bGwpIHsKICAgICAgICAgICAgJGVycm5vID0gJHRoaXMtPmVycm9yQ29kZSgkbmF0aXZlKTsKICAgICAgICB9CgogICAgICAgICRlcnJvcmNvZGUgPSBAc3FsaXRlX2xhc3RfZXJyb3IoJHRoaXMtPmNvbm5lY3Rpb24pOwogICAgICAgICR1c2VyaW5mbyA9ICIkZXJyb3Jjb2RlICoqICR0aGlzLT5sYXN0X3F1ZXJ5IjsKCiAgICAgICAgcmV0dXJuICR0aGlzLT5yYWlzZUVycm9yKCRlcnJubywgbnVsbCwgbnVsbCwgJHVzZXJpbmZvLCAkbmF0aXZlKTsKICAgIH0KCiAgICAvLyB9fX0KICAgIC8vIHt7eyBlcnJvck5hdGl2ZSgpCgogICAgLyoqCiAgICAgKiBHZXRzIHRoZSBEQk1TJyBuYXRpdmUgZXJyb3IgbWVzc2FnZSBwcm9kdWNlZCBieSB0aGUgbGFzdCBxdWVyeQogICAgICoKICAgICAqIHtAaW50ZXJuYWwgVGhpcyBpcyB1c2VkIHRvIHJldHJpZXZlIG1vcmUgbWVhbmluZ2Z1bGwgZXJyb3IgbWVzc2FnZXMKICAgICAqIGJlY2F1c2Ugc3FsaXRlX2xhc3RfZXJyb3IoKSBkb2VzIG5vdCBwcm92aWRlIGFkZXF1YXRlIGluZm8ufX0KICAgICAqCiAgICAgKiBAcmV0dXJuIHN0cmluZyAgdGhlIERCTVMnIGVycm9yIG1lc3NhZ2UKICAgICAqLwogICAgZnVuY3Rpb24gZXJyb3JOYXRpdmUoKQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+X2xhc3RlcnJvcjsKICAgIH0KCiAgICAvLyB9fX0KICAgIC8vIHt7eyBlcnJvckNvZGUoKQoKICAgIC8qKgogICAgICogRGV0ZXJtaW5lcyBQRUFSOjpEQiBlcnJvciBjb2RlIGZyb20gdGhlIGRhdGFiYXNlJ3MgdGV4dCBlcnJvciBtZXNzYWdlCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkZXJyb3Jtc2cgIHRoZSBlcnJvciBtZXNzYWdlIHJldHVybmVkIGZyb20gdGhlIGRhdGFiYXNlCiAgICAgKgogICAgICogQHJldHVybiBpbnRlZ2VyICB0aGUgREIgZXJyb3IgbnVtYmVyCiAgICAgKi8KICAgIGZ1bmN0aW9uIGVycm9yQ29kZSgkZXJyb3Jtc2cpCiAgICB7CiAgICAgICAgc3RhdGljICRlcnJvcl9yZWdleHBzOwogICAgICAgIAogICAgICAgIC8vIFBIUCA1LjIrIHByZXBlbmRzIHRoZSBmdW5jdGlvbiBuYW1lIHRvICRwaHBfZXJyb3Jtc2csIHNvIHdlIG5lZWQKICAgICAgICAvLyB0aGlzIGhhY2sgdG8gd29yayBhcm91bmQgaXQsIHBlciBidWcgIzk1OTkuCiAgICAgICAgJGVycm9ybXNnID0gcHJlZ19yZXBsYWNlKCcvXnNxbGl0ZVthLXpfXStcKFwpOiAvJywgJycsICRlcnJvcm1zZyk7CiAgICAgICAgCiAgICAgICAgaWYgKCFpc3NldCgkZXJyb3JfcmVnZXhwcykpIHsKICAgICAgICAgICAgJGVycm9yX3JlZ2V4cHMgPSBhcnJheSgKICAgICAgICAgICAgICAgICcvXm5vIHN1Y2ggdGFibGU6LycgPT4gREJfRVJST1JfTk9TVUNIVEFCTEUsCiAgICAgICAgICAgICAgICAnL15ubyBzdWNoIGluZGV4Oi8nID0+IERCX0VSUk9SX05PVF9GT1VORCwKICAgICAgICAgICAgICAgICcvXih0YWJsZXxpbmRleCkgLiogYWxyZWFkeSBleGlzdHMkLycgPT4gREJfRVJST1JfQUxSRUFEWV9FWElTVFMsCiAgICAgICAgICAgICAgICAnL1BSSU1BUlkgS0VZIG11c3QgYmUgdW5pcXVlL2knID0+IERCX0VSUk9SX0NPTlNUUkFJTlQsCiAgICAgICAgICAgICAgICAnL2lzIG5vdCB1bmlxdWUvJyA9PiBEQl9FUlJPUl9DT05TVFJBSU5ULAogICAgICAgICAgICAgICAgJy9jb2x1bW5zIC4qIGFyZSBub3QgdW5pcXVlL2knID0+IERCX0VSUk9SX0NPTlNUUkFJTlQsCiAgICAgICAgICAgICAgICAnL3VuaXF1ZW5lc3MgY29uc3RyYWludCBmYWlsZWQvJyA9PiBEQl9FUlJPUl9DT05TVFJBSU5ULAogICAgICAgICAgICAgICAgJy9tYXkgbm90IGJlIE5VTEwvJyA9PiBEQl9FUlJPUl9DT05TVFJBSU5UX05PVF9OVUxMLAogICAgICAgICAgICAgICAgJy9ebm8gc3VjaCBjb2x1bW46LycgPT4gREJfRVJST1JfTk9TVUNIRklFTEQsCiAgICAgICAgICAgICAgICAnL2NvbHVtbiBub3QgcHJlc2VudCBpbiBib3RoIHRhYmxlcy9pJyA9PiBEQl9FUlJPUl9OT1NVQ0hGSUVMRCwKICAgICAgICAgICAgICAgICcvXm5lYXIgIi4qIjogc3ludGF4IGVycm9yJC8nID0+IERCX0VSUk9SX1NZTlRBWCwKICAgICAgICAgICAgICAgICcvWzAtOV0rIHZhbHVlcyBmb3IgWzAtOV0rIGNvbHVtbnMvaScgPT4gREJfRVJST1JfVkFMVUVfQ09VTlRfT05fUk9XLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBmb3JlYWNoICgkZXJyb3JfcmVnZXhwcyBhcyAkcmVnZXhwID0+ICRjb2RlKSB7CiAgICAgICAgICAgIGlmIChwcmVnX21hdGNoKCRyZWdleHAsICRlcnJvcm1zZykpIHsKICAgICAgICAgICAgICAgIHJldHVybiAkY29kZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvLyBGYWxsIGJhY2sgdG8gREJfRVJST1IgaWYgdGhlcmUgd2FzIG5vIG1hcHBpbmcuCiAgICAgICAgcmV0dXJuIERCX0VSUk9SOwogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IHRhYmxlSW5mbygpCgogICAgLyoqCiAgICAgKiBSZXR1cm5zIGluZm9ybWF0aW9uIGFib3V0IGEgdGFibGUKICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICAgICAgICAgJHJlc3VsdCAgYSBzdHJpbmcgY29udGFpbmluZyB0aGUgbmFtZSBvZiBhIHRhYmxlCiAgICAgKiBAcGFyYW0gaW50ICAgICAgICAgICAgJG1vZGUgICAgYSB2YWxpZCB0YWJsZUluZm8gbW9kZQogICAgICoKICAgICAqIEByZXR1cm4gYXJyYXkgIGFuIGFzc29jaWF0aXZlIGFycmF5IHdpdGggdGhlIGluZm9ybWF0aW9uIHJlcXVlc3RlZC4KICAgICAqICAgICAgICAgICAgICAgICBBIERCX0Vycm9yIG9iamVjdCBvbiBmYWlsdXJlLgogICAgICoKICAgICAqIEBzZWUgREJfY29tbW9uOjp0YWJsZUluZm8oKQogICAgICogQHNpbmNlIE1ldGhvZCBhdmFpbGFibGUgc2luY2UgUmVsZWFzZSAxLjcuMAogICAgICovCiAgICBmdW5jdGlvbiB0YWJsZUluZm8oJHJlc3VsdCwgJG1vZGUgPSBudWxsKQogICAgewogICAgICAgIGlmIChpc19zdHJpbmcoJHJlc3VsdCkpIHsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogUHJvYmFibHkgcmVjZWl2ZWQgYSB0YWJsZSBuYW1lLgogICAgICAgICAgICAgKiBDcmVhdGUgYSByZXN1bHQgcmVzb3VyY2UgaWRlbnRpZmllci4KICAgICAgICAgICAgICovCiAgICAgICAgICAgICRpZCA9IEBzcWxpdGVfYXJyYXlfcXVlcnkoJHRoaXMtPmNvbm5lY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBSQUdNQSB0YWJsZV9pbmZvKCckcmVzdWx0Jyk7IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTUUxJVEVfQVNTT0MpOwogICAgICAgICAgICAkZ290X3N0cmluZyA9IHRydWU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJHRoaXMtPmxhc3RfcXVlcnkgPSAnJzsKICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5yYWlzZUVycm9yKERCX0VSUk9SX05PVF9DQVBBQkxFLCBudWxsLCBudWxsLCBudWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1RoaXMgREJNUyBjYW4gbm90IG9idGFpbiB0YWJsZUluZm8nIC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgZnJvbSByZXN1bHQgc2V0cycpOwogICAgICAgIH0KCiAgICAgICAgaWYgKCR0aGlzLT5vcHRpb25zWydwb3J0YWJpbGl0eSddICYgREJfUE9SVEFCSUxJVFlfTE9XRVJDQVNFKSB7CiAgICAgICAgICAgICRjYXNlX2Z1bmMgPSAnc3RydG9sb3dlcic7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJGNhc2VfZnVuYyA9ICdzdHJ2YWwnOwogICAgICAgIH0KCiAgICAgICAgJGNvdW50ID0gY291bnQoJGlkKTsKICAgICAgICAkcmVzICAgPSBhcnJheSgpOwoKICAgICAgICBpZiAoJG1vZGUpIHsKICAgICAgICAgICAgJHJlc1snbnVtX2ZpZWxkcyddID0gJGNvdW50OwogICAgICAgIH0KCiAgICAgICAgZm9yICgkaSA9IDA7ICRpIDwgJGNvdW50OyAkaSsrKSB7CiAgICAgICAgICAgIGlmIChzdHJwb3MoJGlkWyRpXVsndHlwZSddLCAnKCcpICE9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgJGJpdHMgPSBleHBsb2RlKCcoJywgJGlkWyRpXVsndHlwZSddKTsKICAgICAgICAgICAgICAgICR0eXBlID0gJGJpdHNbMF07CiAgICAgICAgICAgICAgICAkbGVuICA9IHJ0cmltKCRiaXRzWzFdLCcpJyk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkdHlwZSA9ICRpZFskaV1bJ3R5cGUnXTsKICAgICAgICAgICAgICAgICRsZW4gID0gMDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJGZsYWdzID0gJyc7CiAgICAgICAgICAgIGlmICgkaWRbJGldWydwayddKSB7CiAgICAgICAgICAgICAgICAkZmxhZ3MgLj0gJ3ByaW1hcnlfa2V5ICc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCRpZFskaV1bJ25vdG51bGwnXSkgewogICAgICAgICAgICAgICAgJGZsYWdzIC49ICdub3RfbnVsbCAnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkaWRbJGldWydkZmx0X3ZhbHVlJ10gIT09IG51bGwpIHsKICAgICAgICAgICAgICAgICRmbGFncyAuPSAnZGVmYXVsdF8nIC4gcmF3dXJsZW5jb2RlKCRpZFskaV1bJ2RmbHRfdmFsdWUnXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJGZsYWdzID0gdHJpbSgkZmxhZ3MpOwoKICAgICAgICAgICAgJHJlc1skaV0gPSBhcnJheSgKICAgICAgICAgICAgICAgICd0YWJsZScgPT4gJGNhc2VfZnVuYygkcmVzdWx0KSwKICAgICAgICAgICAgICAgICduYW1lJyAgPT4gJGNhc2VfZnVuYygkaWRbJGldWyduYW1lJ10pLAogICAgICAgICAgICAgICAgJ3R5cGUnICA9PiAkdHlwZSwKICAgICAgICAgICAgICAgICdsZW4nICAgPT4gJGxlbiwKICAgICAgICAgICAgICAgICdmbGFncycgPT4gJGZsYWdzLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCRtb2RlICYgREJfVEFCTEVJTkZPX09SREVSKSB7CiAgICAgICAgICAgICAgICAkcmVzWydvcmRlciddWyRyZXNbJGldWyduYW1lJ11dID0gJGk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCRtb2RlICYgREJfVEFCTEVJTkZPX09SREVSVEFCTEUpIHsKICAgICAgICAgICAgICAgICRyZXNbJ29yZGVydGFibGUnXVskcmVzWyRpXVsndGFibGUnXV1bJHJlc1skaV1bJ25hbWUnXV0gPSAkaTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRyZXM7CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgZ2V0U3BlY2lhbFF1ZXJ5KCkKCiAgICAvKioKICAgICAqIE9idGFpbnMgdGhlIHF1ZXJ5IHN0cmluZyBuZWVkZWQgZm9yIGxpc3RpbmcgYSBnaXZlbiB0eXBlIG9mIG9iamVjdHMKICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICR0eXBlICB0aGUga2luZCBvZiBvYmplY3RzIHlvdSB3YW50IHRvIHJldHJpZXZlCiAgICAgKiBAcGFyYW0gYXJyYXkgICRhcmdzICBTUUxJVEUgRFJJVkVSIE9OTFk6IGEgcHJpdmF0ZSBhcnJheSBvZiBhcmd1bWVudHMKICAgICAqICAgICAgICAgICAgICAgICAgICAgICB1c2VkIGJ5IHRoZSBnZXRTcGVjaWFsUXVlcnkoKS4gIERvIG5vdCB1c2UKICAgICAqICAgICAgICAgICAgICAgICAgICAgICB0aGlzIGRpcmVjdGx5LgogICAgICoKICAgICAqIEByZXR1cm4gc3RyaW5nICB0aGUgU1FMIHF1ZXJ5IHN0cmluZyBvciBudWxsIGlmIHRoZSBkcml2ZXIgZG9lc24ndAogICAgICogICAgICAgICAgICAgICAgICBzdXBwb3J0IHRoZSBvYmplY3QgdHlwZSByZXF1ZXN0ZWQKICAgICAqCiAgICAgKiBAYWNjZXNzIHByb3RlY3RlZAogICAgICogQHNlZSBEQl9jb21tb246OmdldExpc3RPZigpCiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldFNwZWNpYWxRdWVyeSgkdHlwZSwgJGFyZ3MgPSBhcnJheSgpKQogICAgewogICAgICAgIGlmICghaXNfYXJyYXkoJGFyZ3MpKSB7CiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+cmFpc2VFcnJvcignbm8ga2V5IHNwZWNpZmllZCcsIG51bGwsIG51bGwsIG51bGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQXJndW1lbnQgaGFzIHRvIGJlIGFuIGFycmF5LicpOwogICAgICAgIH0KCiAgICAgICAgc3dpdGNoICgkdHlwZSkgewogICAgICAgICAgICBjYXNlICdtYXN0ZXInOgogICAgICAgICAgICAgICAgcmV0dXJuICdTRUxFQ1QgKiBGUk9NIHNxbGl0ZV9tYXN0ZXI7JzsKICAgICAgICAgICAgY2FzZSAndGFibGVzJzoKICAgICAgICAgICAgICAgIHJldHVybiAiU0VMRUNUIG5hbWUgRlJPTSBzcWxpdGVfbWFzdGVyIFdIRVJFIHR5cGU9J3RhYmxlJyAiCiAgICAgICAgICAgICAgICAgICAgICAgLiAnVU5JT04gQUxMIFNFTEVDVCBuYW1lIEZST00gc3FsaXRlX3RlbXBfbWFzdGVyICcKICAgICAgICAgICAgICAgICAgICAgICAuICJXSEVSRSB0eXBlPSd0YWJsZScgT1JERVIgQlkgbmFtZTsiOwogICAgICAgICAgICBjYXNlICdzY2hlbWEnOgogICAgICAgICAgICAgICAgcmV0dXJuICdTRUxFQ1Qgc3FsIEZST00gKFNFTEVDVCAqIEZST00gc3FsaXRlX21hc3RlciAnCiAgICAgICAgICAgICAgICAgICAgICAgLiAnVU5JT04gQUxMIFNFTEVDVCAqIEZST00gc3FsaXRlX3RlbXBfbWFzdGVyKSAnCiAgICAgICAgICAgICAgICAgICAgICAgLiAiV0hFUkUgdHlwZSE9J21ldGEnICIKICAgICAgICAgICAgICAgICAgICAgICAuICdPUkRFUiBCWSB0YmxfbmFtZSwgdHlwZSBERVNDLCBuYW1lOyc7CiAgICAgICAgICAgIGNhc2UgJ3NjaGVtYXgnOgogICAgICAgICAgICBjYXNlICdzY2hlbWFfeCc6CiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogVXNlIGxpa2U6CiAgICAgICAgICAgICAgICAgKiAkcmVzID0gJGRiLT5xdWVyeSgkZGItPmdldFNwZWNpYWxRdWVyeSgnc2NoZW1hX3gnLAogICAgICAgICAgICAgICAgICogICAgICAgICAgICAgICAgICAgYXJyYXkoJ3RhYmxlJyA9PiAndGFibGUzJykpKTsKICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgcmV0dXJuICdTRUxFQ1Qgc3FsIEZST00gKFNFTEVDVCAqIEZST00gc3FsaXRlX21hc3RlciAnCiAgICAgICAgICAgICAgICAgICAgICAgLiAnVU5JT04gQUxMIFNFTEVDVCAqIEZST00gc3FsaXRlX3RlbXBfbWFzdGVyKSAnCiAgICAgICAgICAgICAgICAgICAgICAgLiAiV0hFUkUgdGJsX25hbWUgTElLRSAneyRhcmdzWyd0YWJsZSddfScgIgogICAgICAgICAgICAgICAgICAgICAgIC4gIkFORCB0eXBlIT0nbWV0YScgIgogICAgICAgICAgICAgICAgICAgICAgIC4gJ09SREVSIEJZIHR5cGUgREVTQywgbmFtZTsnOwogICAgICAgICAgICBjYXNlICdhbHRlcic6CiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogU1FMaXRlIGRvZXMgbm90IHN1cHBvcnQgQUxURVIgVEFCTEU7IHRoaXMgaXMgYSBoZWxwZXIgcXVlcnkKICAgICAgICAgICAgICAgICAqIHRvIGhhbmRsZSB0aGlzLiAndGFibGUnIHJlcHJlc2VudHMgdGhlIHRhYmxlIG5hbWUsICdyb3dzJwogICAgICAgICAgICAgICAgICogdGhlIG5ld3Mgcm93cyB0byBjcmVhdGUsICdzYXZlJyB0aGUgcm93KHMpIHRvIGtlZXAgX3dpdGhfCiAgICAgICAgICAgICAgICAgKiB0aGUgZGF0YS4KICAgICAgICAgICAgICAgICAqCiAgICAgICAgICAgICAgICAgKiBVc2UgbGlrZToKICAgICAgICAgICAgICAgICAqICRhcmdzID0gYXJyYXkoCiAgICAgICAgICAgICAgICAgKiAgICAgJ3RhYmxlJyA9PiAkdGFibGUsCiAgICAgICAgICAgICAgICAgKiAgICAgJ3Jvd3MnICA9PiAiaWQgSU5URUdFUiBQUklNQVJZIEtFWSwgZmlyc3RuYW1lIFRFWFQsIHN1cm5hbWUgVEVYVCwgZGF0ZXRpbWUgVEVYVCIsCiAgICAgICAgICAgICAgICAgKiAgICAgJ3NhdmUnICA9PiAiTlVMTCwgdGl0ZWwsIGNvbnRlbnQsIGRhdGV0aW1lIgogICAgICAgICAgICAgICAgICogKTsKICAgICAgICAgICAgICAgICAqICRyZXMgPSAkZGItPnF1ZXJ5KCAkZGItPmdldFNwZWNpYWxRdWVyeSgnYWx0ZXInLCAkYXJncykpOwogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAkcm93cyA9IHN0cnRyKCRhcmdzWydyb3dzJ10sICR0aGlzLT5rZXl3b3Jkcyk7CgogICAgICAgICAgICAgICAgJHEgPSBhcnJheSgKICAgICAgICAgICAgICAgICAgICAnQkVHSU4gVFJBTlNBQ1RJT04nLAogICAgICAgICAgICAgICAgICAgICJDUkVBVEUgVEVNUE9SQVJZIFRBQkxFIHskYXJnc1sndGFibGUnXX1fYmFja3VwICh7JGFyZ3NbJ3Jvd3MnXX0pIiwKICAgICAgICAgICAgICAgICAgICAiSU5TRVJUIElOVE8geyRhcmdzWyd0YWJsZSddfV9iYWNrdXAgU0VMRUNUIHskYXJnc1snc2F2ZSddfSBGUk9NIHskYXJnc1sndGFibGUnXX0iLAogICAgICAgICAgICAgICAgICAgICJEUk9QIFRBQkxFIHskYXJnc1sndGFibGUnXX0iLAogICAgICAgICAgICAgICAgICAgICJDUkVBVEUgVEFCTEUgeyRhcmdzWyd0YWJsZSddfSAoeyRhcmdzWydyb3dzJ119KSIsCiAgICAgICAgICAgICAgICAgICAgIklOU0VSVCBJTlRPIHskYXJnc1sndGFibGUnXX0gU0VMRUNUIHskcm93c30gRlJPTSB7JGFyZ3NbJ3RhYmxlJ119X2JhY2t1cCIsCiAgICAgICAgICAgICAgICAgICAgIkRST1AgVEFCTEUgeyRhcmdzWyd0YWJsZSddfV9iYWNrdXAiLAogICAgICAgICAgICAgICAgICAgICdDT01NSVQnLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogVGhpcyBpcyBhIGRpcnR5IGhhY2ssIHNpbmNlIHRoZSBhYm92ZSBxdWVyeSB3aWxsIG5vdCBnZXQKICAgICAgICAgICAgICAgICAqIGV4ZWN1dGVkIHdpdGggYSBzaW5nbGUgcXVlcnkgY2FsbCBzbyBoZXJlIHRoZSBxdWVyeSBtZXRob2QKICAgICAgICAgICAgICAgICAqIHdpbGwgYmUgY2FsbGVkIGRpcmVjdGx5IGFuZCByZXR1cm4gYSBzZWxlY3QgaW5zdGVhZC4KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgZm9yZWFjaCAoJHEgYXMgJHF1ZXJ5KSB7CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnF1ZXJ5KCRxdWVyeSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gIlNFTEVDVCAqIEZST00geyRhcmdzWyd0YWJsZSddfTsiOwogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgfQoKICAgIC8vIH19fQp9CgovKgogKiBMb2NhbCB2YXJpYWJsZXM6CiAqIHRhYi13aWR0aDogNAogKiBjLWJhc2ljLW9mZnNldDogNAogKiBFbmQ6CiAqLwoKPz4K]]></data>
	</file>
	<file>
	  <filename>/lib/pear/DB/storage.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qIHZpbTogc2V0IGV4cGFuZHRhYiB0YWJzdG9wPTQgc2hpZnR3aWR0aD00IHNvZnR0YWJzdG9wPTQ6ICovCgovKioKICogUHJvdmlkZXMgYW4gb2JqZWN0IGludGVyZmFjZSB0byBhIHRhYmxlIHJvdwogKgogKiBQSFAgdmVyc2lvbnMgNCBhbmQgNQogKgogKiBMSUNFTlNFOiBUaGlzIHNvdXJjZSBmaWxlIGlzIHN1YmplY3QgdG8gdmVyc2lvbiAzLjAgb2YgdGhlIFBIUCBsaWNlbnNlCiAqIHRoYXQgaXMgYXZhaWxhYmxlIHRocm91Z2ggdGhlIHdvcmxkLXdpZGUtd2ViIGF0IHRoZSBmb2xsb3dpbmcgVVJJOgogKiBodHRwOi8vd3d3LnBocC5uZXQvbGljZW5zZS8zXzAudHh0LiAgSWYgeW91IGRpZCBub3QgcmVjZWl2ZSBhIGNvcHkgb2YKICogdGhlIFBIUCBMaWNlbnNlIGFuZCBhcmUgdW5hYmxlIHRvIG9idGFpbiBpdCB0aHJvdWdoIHRoZSB3ZWIsIHBsZWFzZQogKiBzZW5kIGEgbm90ZSB0byBsaWNlbnNlQHBocC5uZXQgc28gd2UgY2FuIG1haWwgeW91IGEgY29weSBpbW1lZGlhdGVseS4KICoKICogQGNhdGVnb3J5ICAgRGF0YWJhc2UKICogQHBhY2thZ2UgICAgREIKICogQGF1dGhvciAgICAgU3RpZyBCYWtrZW4gPHN0aWdAcGhwLm5ldD4KICogQGNvcHlyaWdodCAgMTk5Ny0yMDA1IFRoZSBQSFAgR3JvdXAKICogQGxpY2Vuc2UgICAgaHR0cDovL3d3dy5waHAubmV0L2xpY2Vuc2UvM18wLnR4dCAgUEhQIExpY2Vuc2UgMy4wCiAqIEB2ZXJzaW9uICAgIENWUzogJElkOiBzdG9yYWdlLnBocCx2IDEuMjIgMjAwNS8wNy8xMCAxMzozODo1MSBkYW5pZWxjIEV4cCAkCiAqIEBsaW5rICAgICAgIGh0dHA6Ly9wZWFyLnBocC5uZXQvcGFja2FnZS9EQgogKi8KCi8qKgogKiBPYnRhaW4gdGhlIERCIGNsYXNzIHNvIGl0IGNhbiBiZSBleHRlbmRlZCBmcm9tCiAqLwpyZXF1aXJlX29uY2UgJ0RCLnBocCc7CgovKioKICogUHJvdmlkZXMgYW4gb2JqZWN0IGludGVyZmFjZSB0byBhIHRhYmxlIHJvdwogKgogKiBJdCBsZXRzIHlvdSBhZGQsIGRlbGV0ZSBhbmQgY2hhbmdlIHJvd3MgdXNpbmcgb2JqZWN0cyByYXRoZXIgdGhhbiBTUUwKICogc3RhdGVtZW50cy4KICoKICogQGNhdGVnb3J5ICAgRGF0YWJhc2UKICogQHBhY2thZ2UgICAgREIKICogQGF1dGhvciAgICAgU3RpZyBCYWtrZW4gPHN0aWdAcGhwLm5ldD4KICogQGNvcHlyaWdodCAgMTk5Ny0yMDA1IFRoZSBQSFAgR3JvdXAKICogQGxpY2Vuc2UgICAgaHR0cDovL3d3dy5waHAubmV0L2xpY2Vuc2UvM18wLnR4dCAgUEhQIExpY2Vuc2UgMy4wCiAqIEB2ZXJzaW9uICAgIFJlbGVhc2U6IDEuNy4xMgogKiBAbGluayAgICAgICBodHRwOi8vcGVhci5waHAubmV0L3BhY2thZ2UvREIKICovCmNsYXNzIERCX3N0b3JhZ2UgZXh0ZW5kcyBQRUFSCnsKICAgIC8vIHt7eyBwcm9wZXJ0aWVzCgogICAgLyoqIHRoZSBuYW1lIG9mIHRoZSB0YWJsZSAob3IgdmlldywgaWYgdGhlIGJhY2tlbmQgZGF0YWJhc2Ugc3VwcG9ydHMKICAgICAgICB1cGRhdGVzIGluIHZpZXdzKSB3ZSBob2xkIGRhdGEgZnJvbSAqLwogICAgdmFyICRfdGFibGUgPSBudWxsOwoKICAgIC8qKiB3aGljaCBjb2x1bW4ocykgaW4gdGhlIHRhYmxlIGNvbnRhaW5zIHByaW1hcnkga2V5cywgY2FuIGJlIGEKICAgICAgICBzdHJpbmcgZm9yIHNpbmdsZS1jb2x1bW4gcHJpbWFyeSBrZXlzLCBvciBhbiBhcnJheSBvZiBzdHJpbmdzCiAgICAgICAgZm9yIG11bHRpcGxlLWNvbHVtbiBwcmltYXJ5IGtleXMgKi8KICAgIHZhciAkX2tleWNvbHVtbiA9IG51bGw7CgogICAgLyoqIERCIGNvbm5lY3Rpb24gaGFuZGxlIHVzZWQgZm9yIGFsbCB0cmFuc2FjdGlvbnMgKi8KICAgIHZhciAkX2RiaCA9IG51bGw7CgogICAgLyoqIGFuIGFzc29jIHdpdGggdGhlIG5hbWVzIG9mIGRhdGFiYXNlIGZpZWxkcyBzdG9yZWQgYXMgcHJvcGVydGllcwogICAgICAgIGluIHRoaXMgb2JqZWN0ICovCiAgICB2YXIgJF9wcm9wZXJ0aWVzID0gYXJyYXkoKTsKCiAgICAvKiogYW4gYXNzb2Mgd2l0aCB0aGUgbmFtZXMgb2YgdGhlIHByb3BlcnRpZXMgaW4gdGhpcyBvYmplY3QgdGhhdAogICAgICAgIGhhdmUgYmVlbiBjaGFuZ2VkIHNpbmNlIHRoZXkgd2VyZSBmZXRjaGVkIGZyb20gdGhlIGRhdGFiYXNlICovCiAgICB2YXIgJF9jaGFuZ2VzID0gYXJyYXkoKTsKCiAgICAvKiogZmxhZyB0aGF0IGRlY2lkZXMgaWYgZGF0YSBpbiB0aGlzIG9iamVjdCBjYW4gYmUgY2hhbmdlZC4KICAgICAgICBvYmplY3RzIHRoYXQgZG9uJ3QgaGF2ZSB0aGVpciB0YWJsZSdzIGtleSBjb2x1bW4gaW4gdGhlaXIKICAgICAgICBwcm9wZXJ0eSBsaXN0cyB3aWxsIGJlIGZsYWdnZWQgYXMgcmVhZC1vbmx5LiAqLwogICAgdmFyICRfcmVhZG9ubHkgPSBmYWxzZTsKCiAgICAvKiogZnVuY3Rpb24gb3IgbWV0aG9kIHRoYXQgaW1wbGVtZW50cyBhIHZhbGlkYXRvciBmb3IgZmllbGRzIHRoYXQKICAgICAgICBhcmUgc2V0LCB0aGlzIHZhbGlkYXRvciBmdW5jdGlvbiByZXR1cm5zIHRydWUgaWYgdGhlIGZpZWxkIGlzCiAgICAgICAgdmFsaWQsIGZhbHNlIGlmIG5vdCAqLwogICAgdmFyICRfdmFsaWRhdG9yID0gbnVsbDsKCiAgICAvLyB9fX0KICAgIC8vIHt7eyBjb25zdHJ1Y3RvcgoKICAgIC8qKgogICAgICogQ29uc3RydWN0b3IKICAgICAqCiAgICAgKiBAcGFyYW0gJHRhYmxlIHN0cmluZyB0aGUgbmFtZSBvZiB0aGUgZGF0YWJhc2UgdGFibGUKICAgICAqCiAgICAgKiBAcGFyYW0gJGtleWNvbHVtbiBtaXhlZCBzdHJpbmcgd2l0aCBuYW1lIG9mIGtleSBjb2x1bW4sIG9yIGFycmF5IG9mCiAgICAgKiBzdHJpbmdzIGlmIHRoZSB0YWJsZSBoYXMgYSBwcmltYXJ5IGtleSBvZiBtb3JlIHRoYW4gb25lIGNvbHVtbgogICAgICoKICAgICAqIEBwYXJhbSAkZGJoIG9iamVjdCBkYXRhYmFzZSBjb25uZWN0aW9uIG9iamVjdAogICAgICoKICAgICAqIEBwYXJhbSAkdmFsaWRhdG9yIG1peGVkIGZ1bmN0aW9uIG9yIG1ldGhvZCB1c2VkIHRvIHZhbGlkYXRlCiAgICAgKiBlYWNoIG5ldyB2YWx1ZSwgY2FsbGVkIHdpdGggdGhyZWUgcGFyYW1ldGVyczogdGhlIG5hbWUgb2YgdGhlCiAgICAgKiBmaWVsZC9jb2x1bW4gdGhhdCBpcyBjaGFuZ2luZywgYSByZWZlcmVuY2UgdG8gdGhlIG5ldyB2YWx1ZSBhbmQKICAgICAqIGEgcmVmZXJlbmNlIHRvIHRoaXMgb2JqZWN0CiAgICAgKgogICAgICovCiAgICBmdW5jdGlvbiBEQl9zdG9yYWdlKCR0YWJsZSwgJGtleWNvbHVtbiwgJiRkYmgsICR2YWxpZGF0b3IgPSBudWxsKQogICAgewogICAgICAgICR0aGlzLT5QRUFSKCdEQl9FcnJvcicpOwogICAgICAgICR0aGlzLT5fdGFibGUgPSAkdGFibGU7CiAgICAgICAgJHRoaXMtPl9rZXljb2x1bW4gPSAka2V5Y29sdW1uOwogICAgICAgICR0aGlzLT5fZGJoID0gJGRiaDsKICAgICAgICAkdGhpcy0+X3JlYWRvbmx5ID0gZmFsc2U7CiAgICAgICAgJHRoaXMtPl92YWxpZGF0b3IgPSAkdmFsaWRhdG9yOwogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IF9tYWtlV2hlcmUoKQoKICAgIC8qKgogICAgICogVXRpbGl0eSBtZXRob2QgdG8gYnVpbGQgYSAiV0hFUkUiIGNsYXVzZSB0byBsb2NhdGUgb3Vyc2VsdmVzIGluCiAgICAgKiB0aGUgdGFibGUuCiAgICAgKgogICAgICogWFhYIGZ1dHVyZSBpbXByb3ZlbWVudDogdXNlIHJvd2lkcz8KICAgICAqCiAgICAgKiBAYWNjZXNzIHByaXZhdGUKICAgICAqLwogICAgZnVuY3Rpb24gX21ha2VXaGVyZSgka2V5dmFsID0gbnVsbCkKICAgIHsKICAgICAgICBpZiAoaXNfYXJyYXkoJHRoaXMtPl9rZXljb2x1bW4pKSB7CiAgICAgICAgICAgIGlmICgka2V5dmFsID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICBmb3IgKCRpID0gMDsgJGkgPCBzaXplb2YoJHRoaXMtPl9rZXljb2x1bW4pOyAkaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgJGtleXZhbFtdID0gJHRoaXMtPnskdGhpcy0+X2tleWNvbHVtblskaV19OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgICR3aGVyZWNsYXVzZSA9ICcnOwogICAgICAgICAgICBmb3IgKCRpID0gMDsgJGkgPCBzaXplb2YoJHRoaXMtPl9rZXljb2x1bW4pOyAkaSsrKSB7CiAgICAgICAgICAgICAgICBpZiAoJGkgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgJHdoZXJlY2xhdXNlIC49ICcgQU5EICc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkd2hlcmVjbGF1c2UgLj0gJHRoaXMtPl9rZXljb2x1bW5bJGldOwogICAgICAgICAgICAgICAgaWYgKGlzX251bGwoJGtleXZhbFskaV0pKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gdGhlcmUncyBub3QgbXVjaCBwb2ludCBpbiBoYXZpbmcgYSBOVUxMIGtleSwKICAgICAgICAgICAgICAgICAgICAvLyBidXQgd2Ugc3VwcG9ydCBpdCBhbnl3YXkKICAgICAgICAgICAgICAgICAgICAkd2hlcmVjbGF1c2UgLj0gJyBJUyBOVUxMJzsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJHdoZXJlY2xhdXNlIC49ICcgPSAnIC4gJHRoaXMtPl9kYmgtPnF1b3RlKCRrZXl2YWxbJGldKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmICgka2V5dmFsID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICAka2V5dmFsID0gQCR0aGlzLT57JHRoaXMtPl9rZXljb2x1bW59OwogICAgICAgICAgICB9CiAgICAgICAgICAgICR3aGVyZWNsYXVzZSA9ICR0aGlzLT5fa2V5Y29sdW1uOwogICAgICAgICAgICBpZiAoaXNfbnVsbCgka2V5dmFsKSkgewogICAgICAgICAgICAgICAgLy8gdGhlcmUncyBub3QgbXVjaCBwb2ludCBpbiBoYXZpbmcgYSBOVUxMIGtleSwKICAgICAgICAgICAgICAgIC8vIGJ1dCB3ZSBzdXBwb3J0IGl0IGFueXdheQogICAgICAgICAgICAgICAgJHdoZXJlY2xhdXNlIC49ICcgSVMgTlVMTCc7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkd2hlcmVjbGF1c2UgLj0gJyA9ICcgLiAkdGhpcy0+X2RiaC0+cXVvdGUoJGtleXZhbCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuICR3aGVyZWNsYXVzZTsKICAgIH0KCiAgICAvLyB9fX0KICAgIC8vIHt7eyBzZXR1cCgpCgogICAgLyoqCiAgICAgKiBNZXRob2QgdXNlZCB0byBpbml0aWFsaXplIGEgREJfc3RvcmFnZSBvYmplY3QgZnJvbSB0aGUKICAgICAqIGNvbmZpZ3VyZWQgdGFibGUuCiAgICAgKgogICAgICogQHBhcmFtICRrZXl2YWwgbWl4ZWQgdGhlIGtleVtzXSBvZiB0aGUgcm93IHRvIGZldGNoIChzdHJpbmcgb3IgYXJyYXkpCiAgICAgKgogICAgICogQHJldHVybiBpbnQgREJfT0sgb24gc3VjY2VzcywgYSBEQiBlcnJvciBpZiBub3QKICAgICAqLwogICAgZnVuY3Rpb24gc2V0dXAoJGtleXZhbCkKICAgIHsKICAgICAgICAkd2hlcmVjbGF1c2UgPSAkdGhpcy0+X21ha2VXaGVyZSgka2V5dmFsKTsKICAgICAgICAkcXVlcnkgPSAnU0VMRUNUICogRlJPTSAnIC4gJHRoaXMtPl90YWJsZSAuICcgV0hFUkUgJyAuICR3aGVyZWNsYXVzZTsKICAgICAgICAkc3RoID0gJHRoaXMtPl9kYmgtPnF1ZXJ5KCRxdWVyeSk7CiAgICAgICAgaWYgKERCOjppc0Vycm9yKCRzdGgpKSB7CiAgICAgICAgICAgIHJldHVybiAkc3RoOwogICAgICAgIH0KICAgICAgICAkcm93ID0gJHN0aC0+ZmV0Y2hSb3coREJfRkVUQ0hNT0RFX0FTU09DKTsKICAgICAgICBpZiAoREI6OmlzRXJyb3IoJHJvdykpIHsKICAgICAgICAgICAgcmV0dXJuICRyb3c7CiAgICAgICAgfQogICAgICAgIGlmICghJHJvdykgewogICAgICAgICAgICByZXR1cm4gJHRoaXMtPnJhaXNlRXJyb3IobnVsbCwgREJfRVJST1JfTk9UX0ZPVU5ELCBudWxsLCBudWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHF1ZXJ5LCBudWxsLCB0cnVlKTsKICAgICAgICB9CiAgICAgICAgZm9yZWFjaCAoJHJvdyBhcyAka2V5ID0+ICR2YWx1ZSkgewogICAgICAgICAgICAkdGhpcy0+X3Byb3BlcnRpZXNbJGtleV0gPSB0cnVlOwogICAgICAgICAgICAkdGhpcy0+JGtleSA9ICR2YWx1ZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIERCX09LOwogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IGluc2VydCgpCgogICAgLyoqCiAgICAgKiBDcmVhdGUgYSBuZXcgKGVtcHR5KSByb3cgaW4gdGhlIGNvbmZpZ3VyZWQgdGFibGUgZm9yIHRoaXMKICAgICAqIG9iamVjdC4KICAgICAqLwogICAgZnVuY3Rpb24gaW5zZXJ0KCRuZXdwaykKICAgIHsKICAgICAgICBpZiAoaXNfYXJyYXkoJHRoaXMtPl9rZXljb2x1bW4pKSB7CiAgICAgICAgICAgICRwcmltYXJ5a2V5ID0gJHRoaXMtPl9rZXljb2x1bW47CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJHByaW1hcnlrZXkgPSBhcnJheSgkdGhpcy0+X2tleWNvbHVtbik7CiAgICAgICAgfQogICAgICAgIHNldHR5cGUoJG5ld3BrLCAiYXJyYXkiKTsKICAgICAgICBmb3IgKCRpID0gMDsgJGkgPCBzaXplb2YoJHByaW1hcnlrZXkpOyAkaSsrKSB7CiAgICAgICAgICAgICRwa3ZhbHNbXSA9ICR0aGlzLT5fZGJoLT5xdW90ZSgkbmV3cGtbJGldKTsKICAgICAgICB9CgogICAgICAgICRzdGggPSAkdGhpcy0+X2RiaC0+cXVlcnkoIklOU0VSVCBJTlRPICR0aGlzLT5fdGFibGUgKCIgLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbG9kZSgiLCIsICRwcmltYXJ5a2V5KSAuICIpIFZBTFVFUygiIC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxvZGUoIiwiLCAkcGt2YWxzKSAuICIpIik7CiAgICAgICAgaWYgKERCOjppc0Vycm9yKCRzdGgpKSB7CiAgICAgICAgICAgIHJldHVybiAkc3RoOwogICAgICAgIH0KICAgICAgICBpZiAoc2l6ZW9mKCRuZXdwaykgPT0gMSkgewogICAgICAgICAgICAkbmV3cGsgPSAkbmV3cGtbMF07CiAgICAgICAgfQogICAgICAgICR0aGlzLT5zZXR1cCgkbmV3cGspOwogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IHRvU3RyaW5nKCkKCiAgICAvKioKICAgICAqIE91dHB1dCBhIHNpbXBsZSBkZXNjcmlwdGlvbiBvZiB0aGlzIERCX3N0b3JhZ2Ugb2JqZWN0LgogICAgICogQHJldHVybiBzdHJpbmcgb2JqZWN0IGRlc2NyaXB0aW9uCiAgICAgKi8KICAgIGZ1bmN0aW9uIHRvU3RyaW5nKCkKICAgIHsKICAgICAgICAkaW5mbyA9IHN0cnRvbG93ZXIoZ2V0X2NsYXNzKCR0aGlzKSk7CiAgICAgICAgJGluZm8gLj0gIiAodGFibGU9IjsKICAgICAgICAkaW5mbyAuPSAkdGhpcy0+X3RhYmxlOwogICAgICAgICRpbmZvIC49ICIsIGtleWNvbHVtbj0iOwogICAgICAgIGlmIChpc19hcnJheSgkdGhpcy0+X2tleWNvbHVtbikpIHsKICAgICAgICAgICAgJGluZm8gLj0gIigiIC4gaW1wbG9kZSgiLCIsICR0aGlzLT5fa2V5Y29sdW1uKSAuICIpIjsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkaW5mbyAuPSAkdGhpcy0+X2tleWNvbHVtbjsKICAgICAgICB9CiAgICAgICAgJGluZm8gLj0gIiwgZGJoPSI7CiAgICAgICAgaWYgKGlzX29iamVjdCgkdGhpcy0+X2RiaCkpIHsKICAgICAgICAgICAgJGluZm8gLj0gJHRoaXMtPl9kYmgtPnRvU3RyaW5nKCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJGluZm8gLj0gIm51bGwiOwogICAgICAgIH0KICAgICAgICAkaW5mbyAuPSAiKSI7CiAgICAgICAgaWYgKHNpemVvZigkdGhpcy0+X3Byb3BlcnRpZXMpKSB7CiAgICAgICAgICAgICRpbmZvIC49ICIgW2xvYWRlZCwga2V5PSI7CiAgICAgICAgICAgICRrZXluYW1lID0gJHRoaXMtPl9rZXljb2x1bW47CiAgICAgICAgICAgIGlmIChpc19hcnJheSgka2V5bmFtZSkpIHsKICAgICAgICAgICAgICAgICRpbmZvIC49ICIoIjsKICAgICAgICAgICAgICAgIGZvciAoJGkgPSAwOyAkaSA8IHNpemVvZigka2V5bmFtZSk7ICRpKyspIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJGkgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRpbmZvIC49ICIsIjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgJGluZm8gLj0gJHRoaXMtPiRrZXluYW1lWyRpXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRpbmZvIC49ICIpIjsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICRpbmZvIC49ICR0aGlzLT4ka2V5bmFtZTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkaW5mbyAuPSAiXSI7CiAgICAgICAgfQogICAgICAgIGlmIChzaXplb2YoJHRoaXMtPl9jaGFuZ2VzKSkgewogICAgICAgICAgICAkaW5mbyAuPSAiIFttb2RpZmllZF0iOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJGluZm87CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgZHVtcCgpCgogICAgLyoqCiAgICAgKiBEdW1wIHRoZSBjb250ZW50cyBvZiB0aGlzIG9iamVjdCB0byAic3RhbmRhcmQgb3V0cHV0Ii4KICAgICAqLwogICAgZnVuY3Rpb24gZHVtcCgpCiAgICB7CiAgICAgICAgZm9yZWFjaCAoJHRoaXMtPl9wcm9wZXJ0aWVzIGFzICRwcm9wID0+ICRmb28pIHsKICAgICAgICAgICAgcHJpbnQgIiRwcm9wID0gIjsKICAgICAgICAgICAgcHJpbnQgaHRtbGVudGl0aWVzKCR0aGlzLT4kcHJvcCk7CiAgICAgICAgICAgIHByaW50ICI8YnIgLz5cbiI7CiAgICAgICAgfQogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7ICZjcmVhdGUoKQoKICAgIC8qKgogICAgICogU3RhdGljIG1ldGhvZCB1c2VkIHRvIGNyZWF0ZSBuZXcgREIgc3RvcmFnZSBvYmplY3RzLgogICAgICogQHBhcmFtICRkYXRhIGFzc29jLiBhcnJheSB3aGVyZSB0aGUga2V5cyBhcmUgdGhlIG5hbWVzCiAgICAgKiAgICAgICAgICAgICAgb2YgcHJvcGVydGllcy9jb2x1bW5zCiAgICAgKiBAcmV0dXJuIG9iamVjdCBhIG5ldyBpbnN0YW5jZSBvZiBEQl9zdG9yYWdlIG9yIGEgc3ViY2xhc3Mgb2YgaXQKICAgICAqLwogICAgZnVuY3Rpb24gJmNyZWF0ZSgkdGFibGUsICYkZGF0YSkKICAgIHsKICAgICAgICAkY2xhc3NuYW1lID0gc3RydG9sb3dlcihnZXRfY2xhc3MoJHRoaXMpKTsKICAgICAgICAkb2JqID0mIG5ldyAkY2xhc3NuYW1lKCR0YWJsZSk7CiAgICAgICAgZm9yZWFjaCAoJGRhdGEgYXMgJG5hbWUgPT4gJHZhbHVlKSB7CiAgICAgICAgICAgICRvYmotPl9wcm9wZXJ0aWVzWyRuYW1lXSA9IHRydWU7CiAgICAgICAgICAgICRvYmotPiRuYW1lID0gJiR2YWx1ZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICRvYmo7CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgbG9hZEZyb21RdWVyeSgpCgogICAgLyoqCiAgICAgKiBMb2FkcyBkYXRhIGludG8gdGhpcyBvYmplY3QgZnJvbSB0aGUgZ2l2ZW4gcXVlcnkuICBJZiB0aGlzCiAgICAgKiBvYmplY3QgYWxyZWFkeSBjb250YWlucyB0YWJsZSBkYXRhLCBjaGFuZ2VzIHdpbGwgYmUgc2F2ZWQgYW5kCiAgICAgKiB0aGUgb2JqZWN0IHJlLWluaXRpYWxpemVkIGZpcnN0LgogICAgICoKICAgICAqIEBwYXJhbSAkcXVlcnkgU1FMIHF1ZXJ5CiAgICAgKgogICAgICogQHBhcmFtICRwYXJhbXMgcGFyYW1ldGVyIGxpc3QgaW4gY2FzZSB5b3Ugd2FudCB0byB1c2UKICAgICAqIHByZXBhcmUvZXhlY3V0ZSBtb2RlCiAgICAgKgogICAgICogQHJldHVybiBpbnQgREJfT0sgb24gc3VjY2VzcywgREJfV0FSTklOR19SRUFEX09OTFkgaWYgdGhlCiAgICAgKiByZXR1cm5lZCBvYmplY3QgaXMgcmVhZC1vbmx5IChiZWNhdXNlIHRoZSBvYmplY3QncyBzcGVjaWZpZWQKICAgICAqIGtleSBjb2x1bW4gd2FzIG5vdCBmb3VuZCBhbW9uZyB0aGUgY29sdW1ucyByZXR1cm5lZCBieSAkcXVlcnkpLAogICAgICogb3IgYW5vdGhlciBEQiBlcnJvciBjb2RlIGluIGNhc2Ugb2YgZXJyb3JzLgogICAgICovCi8vIFhYWCBjb21tZW50ZWQgb3V0IGZvciBub3cKLyoKICAgIGZ1bmN0aW9uIGxvYWRGcm9tUXVlcnkoJHF1ZXJ5LCAkcGFyYW1zID0gbnVsbCkKICAgIHsKICAgICAgICBpZiAoc2l6ZW9mKCR0aGlzLT5fcHJvcGVydGllcykpIHsKICAgICAgICAgICAgaWYgKHNpemVvZigkdGhpcy0+X2NoYW5nZXMpKSB7CiAgICAgICAgICAgICAgICAkdGhpcy0+c3RvcmUoKTsKICAgICAgICAgICAgICAgICR0aGlzLT5fY2hhbmdlcyA9IGFycmF5KCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJHRoaXMtPl9wcm9wZXJ0aWVzID0gYXJyYXkoKTsKICAgICAgICB9CiAgICAgICAgJHJvd2RhdGEgPSAkdGhpcy0+X2RiaC0+Z2V0Um93KCRxdWVyeSwgREJfRkVUQ0hNT0RFX0FTU09DLCAkcGFyYW1zKTsKICAgICAgICBpZiAoREI6OmlzRXJyb3IoJHJvd2RhdGEpKSB7CiAgICAgICAgICAgIHJldHVybiAkcm93ZGF0YTsKICAgICAgICB9CiAgICAgICAgcmVzZXQoJHJvd2RhdGEpOwogICAgICAgICRmb3VuZF9rZXljb2x1bW4gPSBmYWxzZTsKICAgICAgICB3aGlsZSAobGlzdCgka2V5LCAkdmFsdWUpID0gZWFjaCgkcm93ZGF0YSkpIHsKICAgICAgICAgICAgaWYgKCRrZXkgPT0gJHRoaXMtPl9rZXljb2x1bW4pIHsKICAgICAgICAgICAgICAgICRmb3VuZF9rZXljb2x1bW4gPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgICR0aGlzLT5fcHJvcGVydGllc1ska2V5XSA9IHRydWU7CiAgICAgICAgICAgICR0aGlzLT4ka2V5ID0gJiR2YWx1ZTsKICAgICAgICAgICAgdW5zZXQoJHZhbHVlKTsgLy8gaGF2ZSB0byB1bnNldCwgb3IgYWxsIHByb3BlcnRpZXMgd2lsbAogICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWZlciB0byB0aGUgc2FtZSB2YWx1ZQogICAgICAgIH0KICAgICAgICBpZiAoISRmb3VuZF9rZXljb2x1bW4pIHsKICAgICAgICAgICAgJHRoaXMtPl9yZWFkb25seSA9IHRydWU7CiAgICAgICAgICAgIHJldHVybiBEQl9XQVJOSU5HX1JFQURfT05MWTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIERCX09LOwogICAgfQogKi8KCiAgICAvLyB9fX0KICAgIC8vIHt7eyBzZXQoKQoKICAgIC8qKgogICAgICogTW9kaWZ5IGFuIGF0dHJpdXRlIHZhbHVlLgogICAgICovCiAgICBmdW5jdGlvbiBzZXQoJHByb3BlcnR5LCAkbmV3dmFsdWUpCiAgICB7CiAgICAgICAgLy8gb25seSBjaGFuZ2UgaWYgJHByb3BlcnR5IGlzIGtub3duIGFuZCBvYmplY3QgaXMgbm90CiAgICAgICAgLy8gcmVhZC1vbmx5CiAgICAgICAgaWYgKCR0aGlzLT5fcmVhZG9ubHkpIHsKICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5yYWlzZUVycm9yKG51bGwsIERCX1dBUk5JTkdfUkVBRF9PTkxZLCBudWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwgbnVsbCwgdHJ1ZSk7CiAgICAgICAgfQogICAgICAgIGlmIChAaXNzZXQoJHRoaXMtPl9wcm9wZXJ0aWVzWyRwcm9wZXJ0eV0pKSB7CiAgICAgICAgICAgIGlmIChlbXB0eSgkdGhpcy0+X3ZhbGlkYXRvcikpIHsKICAgICAgICAgICAgICAgICR2YWxpZCA9IHRydWU7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkdmFsaWQgPSBAY2FsbF91c2VyX2Z1bmMoJHRoaXMtPl92YWxpZGF0b3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPl90YWJsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcHJvcGVydHksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJG5ld3ZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT4kcHJvcGVydHksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkdmFsaWQpIHsKICAgICAgICAgICAgICAgICR0aGlzLT4kcHJvcGVydHkgPSAkbmV3dmFsdWU7CiAgICAgICAgICAgICAgICBpZiAoZW1wdHkoJHRoaXMtPl9jaGFuZ2VzWyRwcm9wZXJ0eV0pKSB7CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPl9jaGFuZ2VzWyRwcm9wZXJ0eV0gPSAwOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+X2NoYW5nZXNbJHByb3BlcnR5XSsrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5yYWlzZUVycm9yKG51bGwsIERCX0VSUk9SX0lOVkFMSUQsIG51bGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgImludmFsaWQgZmllbGQ6ICRwcm9wZXJ0eSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgdHJ1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICAgIHJldHVybiAkdGhpcy0+cmFpc2VFcnJvcihudWxsLCBEQl9FUlJPUl9OT1NVQ0hGSUVMRCwgbnVsbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgInVua25vd24gZmllbGQ6ICRwcm9wZXJ0eSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIHRydWUpOwogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7ICZnZXQoKQoKICAgIC8qKgogICAgICogRmV0Y2ggYW4gYXR0cmlidXRlIHZhbHVlLgogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgYXR0cmlidXRlIG5hbWUKICAgICAqCiAgICAgKiBAcmV0dXJuIGF0dHJpYnV0ZSBjb250ZW50cywgb3IgbnVsbCBpZiB0aGUgYXR0cmlidXRlIG5hbWUgaXMKICAgICAqIHVua25vd24KICAgICAqLwogICAgZnVuY3Rpb24gJmdldCgkcHJvcGVydHkpCiAgICB7CiAgICAgICAgLy8gb25seSByZXR1cm4gaWYgJHByb3BlcnR5IGlzIGtub3duCiAgICAgICAgaWYgKGlzc2V0KCR0aGlzLT5fcHJvcGVydGllc1skcHJvcGVydHldKSkgewogICAgICAgICAgICByZXR1cm4gJHRoaXMtPiRwcm9wZXJ0eTsKICAgICAgICB9CiAgICAgICAgJHRtcCA9IG51bGw7CiAgICAgICAgcmV0dXJuICR0bXA7CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgX0RCX3N0b3JhZ2UoKQoKICAgIC8qKgogICAgICogRGVzdHJ1Y3RvciwgY2FsbHMgREJfc3RvcmFnZTo6c3RvcmUoKSBpZiB0aGVyZSBhcmUgY2hhbmdlcwogICAgICogdGhhdCBhcmUgdG8gYmUga2VwdC4KICAgICAqLwogICAgZnVuY3Rpb24gX0RCX3N0b3JhZ2UoKQogICAgewogICAgICAgIGlmIChzaXplb2YoJHRoaXMtPl9jaGFuZ2VzKSkgewogICAgICAgICAgICAkdGhpcy0+c3RvcmUoKTsKICAgICAgICB9CiAgICAgICAgJHRoaXMtPl9wcm9wZXJ0aWVzID0gYXJyYXkoKTsKICAgICAgICAkdGhpcy0+X2NoYW5nZXMgPSBhcnJheSgpOwogICAgICAgICR0aGlzLT5fdGFibGUgPSBudWxsOwogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IHN0b3JlKCkKCiAgICAvKioKICAgICAqIFN0b3JlcyBjaGFuZ2VzIHRvIHRoaXMgb2JqZWN0IGluIHRoZSBkYXRhYmFzZS4KICAgICAqCiAgICAgKiBAcmV0dXJuIERCX09LIG9yIGEgREIgZXJyb3IKICAgICAqLwogICAgZnVuY3Rpb24gc3RvcmUoKQogICAgewogICAgICAgICRwYXJhbXMgPSBhcnJheSgpOwogICAgICAgICR2YXJzID0gYXJyYXkoKTsKICAgICAgICBmb3JlYWNoICgkdGhpcy0+X2NoYW5nZXMgYXMgJG5hbWUgPT4gJGZvbykgewogICAgICAgICAgICAkcGFyYW1zW10gPSAmJHRoaXMtPiRuYW1lOwogICAgICAgICAgICAkdmFyc1tdID0gJG5hbWUgLiAnID0gPyc7CiAgICAgICAgfQogICAgICAgIGlmICgkdmFycykgewogICAgICAgICAgICAkcXVlcnkgPSAnVVBEQVRFICcgLiAkdGhpcy0+X3RhYmxlIC4gJyBTRVQgJyAuCiAgICAgICAgICAgICAgICBpbXBsb2RlKCcsICcsICR2YXJzKSAuICcgV0hFUkUgJyAuCiAgICAgICAgICAgICAgICAkdGhpcy0+X21ha2VXaGVyZSgpOwogICAgICAgICAgICAkc3RtdCA9ICR0aGlzLT5fZGJoLT5wcmVwYXJlKCRxdWVyeSk7CiAgICAgICAgICAgICRyZXMgPSAkdGhpcy0+X2RiaC0+ZXhlY3V0ZSgkc3RtdCwgJHBhcmFtcyk7CiAgICAgICAgICAgIGlmIChEQjo6aXNFcnJvcigkcmVzKSkgewogICAgICAgICAgICAgICAgcmV0dXJuICRyZXM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJHRoaXMtPl9jaGFuZ2VzID0gYXJyYXkoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIERCX09LOwogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IHJlbW92ZSgpCgogICAgLyoqCiAgICAgKiBSZW1vdmUgdGhlIHJvdyByZXByZXNlbnRlZCBieSB0aGlzIG9iamVjdCBmcm9tIHRoZSBkYXRhYmFzZS4KICAgICAqCiAgICAgKiBAcmV0dXJuIG1peGVkIERCX09LIG9yIGEgREIgZXJyb3IKICAgICAqLwogICAgZnVuY3Rpb24gcmVtb3ZlKCkKICAgIHsKICAgICAgICBpZiAoJHRoaXMtPl9yZWFkb25seSkgewogICAgICAgICAgICByZXR1cm4gJHRoaXMtPnJhaXNlRXJyb3IobnVsbCwgREJfV0FSTklOR19SRUFEX09OTFksIG51bGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBudWxsLCBudWxsLCB0cnVlKTsKICAgICAgICB9CiAgICAgICAgJHF1ZXJ5ID0gJ0RFTEVURSBGUk9NICcgLiAkdGhpcy0+X3RhYmxlIC4nIFdIRVJFICcuCiAgICAgICAgICAgICR0aGlzLT5fbWFrZVdoZXJlKCk7CiAgICAgICAgJHJlcyA9ICR0aGlzLT5fZGJoLT5xdWVyeSgkcXVlcnkpOwogICAgICAgIGlmIChEQjo6aXNFcnJvcigkcmVzKSkgewogICAgICAgICAgICByZXR1cm4gJHJlczsKICAgICAgICB9CiAgICAgICAgZm9yZWFjaCAoJHRoaXMtPl9wcm9wZXJ0aWVzIGFzICRwcm9wID0+ICRmb28pIHsKICAgICAgICAgICAgdW5zZXQoJHRoaXMtPiRwcm9wKTsKICAgICAgICB9CiAgICAgICAgJHRoaXMtPl9wcm9wZXJ0aWVzID0gYXJyYXkoKTsKICAgICAgICAkdGhpcy0+X2NoYW5nZXMgPSBhcnJheSgpOwogICAgICAgIHJldHVybiBEQl9PSzsKICAgIH0KCiAgICAvLyB9fX0KfQoKLyoKICogTG9jYWwgdmFyaWFibGVzOgogKiB0YWItd2lkdGg6IDQKICogYy1iYXNpYy1vZmZzZXQ6IDQKICogRW5kOgogKi8KCj8+Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/pear/DB/sybase.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qIHZpbTogc2V0IGV4cGFuZHRhYiB0YWJzdG9wPTQgc2hpZnR3aWR0aD00IHNvZnR0YWJzdG9wPTQ6ICovCgovKioKICogVGhlIFBFQVIgREIgZHJpdmVyIGZvciBQSFAncyBzeWJhc2UgZXh0ZW5zaW9uCiAqIGZvciBpbnRlcmFjdGluZyB3aXRoIFN5YmFzZSBkYXRhYmFzZXMKICoKICogUEhQIHZlcnNpb25zIDQgYW5kIDUKICoKICogTElDRU5TRTogVGhpcyBzb3VyY2UgZmlsZSBpcyBzdWJqZWN0IHRvIHZlcnNpb24gMy4wIG9mIHRoZSBQSFAgbGljZW5zZQogKiB0aGF0IGlzIGF2YWlsYWJsZSB0aHJvdWdoIHRoZSB3b3JsZC13aWRlLXdlYiBhdCB0aGUgZm9sbG93aW5nIFVSSToKICogaHR0cDovL3d3dy5waHAubmV0L2xpY2Vuc2UvM18wLnR4dC4gIElmIHlvdSBkaWQgbm90IHJlY2VpdmUgYSBjb3B5IG9mCiAqIHRoZSBQSFAgTGljZW5zZSBhbmQgYXJlIHVuYWJsZSB0byBvYnRhaW4gaXQgdGhyb3VnaCB0aGUgd2ViLCBwbGVhc2UKICogc2VuZCBhIG5vdGUgdG8gbGljZW5zZUBwaHAubmV0IHNvIHdlIGNhbiBtYWlsIHlvdSBhIGNvcHkgaW1tZWRpYXRlbHkuCiAqCiAqIEBjYXRlZ29yeSAgIERhdGFiYXNlCiAqIEBwYWNrYWdlICAgIERCCiAqIEBhdXRob3IgICAgIFN0ZXJsaW5nIEh1Z2hlcyA8c3RlcmxpbmdAcGhwLm5ldD4KICogQGF1dGhvciAgICAgQW509G5pbyBDYXJsb3MgVmVu4m5jaW8gSvpuaW9yIDxmbG9yaXBhQHBocC5uZXQ+CiAqIEBhdXRob3IgICAgIERhbmllbCBDb252aXNzb3IgPGRhbmllbGNAcGhwLm5ldD4KICogQGNvcHlyaWdodCAgMTk5Ny0yMDA1IFRoZSBQSFAgR3JvdXAKICogQGxpY2Vuc2UgICAgaHR0cDovL3d3dy5waHAubmV0L2xpY2Vuc2UvM18wLnR4dCAgUEhQIExpY2Vuc2UgMy4wCiAqIEB2ZXJzaW9uICAgIENWUzogJElkOiBzeWJhc2UucGhwLHYgMS44NSAyMDA3LzAyLzA2IDA3OjM1OjA3IGFoYXJ2ZXkgRXhwICQKICogQGxpbmsgICAgICAgaHR0cDovL3BlYXIucGhwLm5ldC9wYWNrYWdlL0RCCiAqLwoKLyoqCiAqIE9idGFpbiB0aGUgREJfY29tbW9uIGNsYXNzIHNvIGl0IGNhbiBiZSBleHRlbmRlZCBmcm9tCiAqLwpyZXF1aXJlX29uY2UgJ0RCL2NvbW1vbi5waHAnOwoKLyoqCiAqIFRoZSBtZXRob2RzIFBFQVIgREIgdXNlcyB0byBpbnRlcmFjdCB3aXRoIFBIUCdzIHN5YmFzZSBleHRlbnNpb24KICogZm9yIGludGVyYWN0aW5nIHdpdGggU3liYXNlIGRhdGFiYXNlcwogKgogKiBUaGVzZSBtZXRob2RzIG92ZXJsb2FkIHRoZSBvbmVzIGRlY2xhcmVkIGluIERCX2NvbW1vbi4KICoKICogV0FSTklORzogIFRoaXMgZHJpdmVyIG1heSBmYWlsIHdpdGggbXVsdGlwbGUgY29ubmVjdGlvbnMgdW5kZXIgdGhlCiAqIHNhbWUgdXNlci9wYXNzL2hvc3QgYW5kIGRpZmZlcmVudCBkYXRhYmFzZXMuCiAqCiAqIEBjYXRlZ29yeSAgIERhdGFiYXNlCiAqIEBwYWNrYWdlICAgIERCCiAqIEBhdXRob3IgICAgIFN0ZXJsaW5nIEh1Z2hlcyA8c3RlcmxpbmdAcGhwLm5ldD4KICogQGF1dGhvciAgICAgQW509G5pbyBDYXJsb3MgVmVu4m5jaW8gSvpuaW9yIDxmbG9yaXBhQHBocC5uZXQ+CiAqIEBhdXRob3IgICAgIERhbmllbCBDb252aXNzb3IgPGRhbmllbGNAcGhwLm5ldD4KICogQGNvcHlyaWdodCAgMTk5Ny0yMDA1IFRoZSBQSFAgR3JvdXAKICogQGxpY2Vuc2UgICAgaHR0cDovL3d3dy5waHAubmV0L2xpY2Vuc2UvM18wLnR4dCAgUEhQIExpY2Vuc2UgMy4wCiAqIEB2ZXJzaW9uICAgIFJlbGVhc2U6IDEuNy4xMgogKiBAbGluayAgICAgICBodHRwOi8vcGVhci5waHAubmV0L3BhY2thZ2UvREIKICovCmNsYXNzIERCX3N5YmFzZSBleHRlbmRzIERCX2NvbW1vbgp7CiAgICAvLyB7e3sgcHJvcGVydGllcwoKICAgIC8qKgogICAgICogVGhlIERCIGRyaXZlciB0eXBlIChteXNxbCwgb2NpOCwgb2RiYywgZXRjLikKICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHZhciAkcGhwdHlwZSA9ICdzeWJhc2UnOwoKICAgIC8qKgogICAgICogVGhlIGRhdGFiYXNlIHN5bnRheCB2YXJpYW50IHRvIGJlIHVzZWQgKGRiMiwgYWNjZXNzLCBldGMuKSwgaWYgYW55CiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICB2YXIgJGRic3ludGF4ID0gJ3N5YmFzZSc7CgogICAgLyoqCiAgICAgKiBUaGUgY2FwYWJpbGl0aWVzIG9mIHRoaXMgREIgaW1wbGVtZW50YXRpb24KICAgICAqCiAgICAgKiBUaGUgJ25ld19saW5rJyBlbGVtZW50IGNvbnRhaW5zIHRoZSBQSFAgdmVyc2lvbiB0aGF0IGZpcnN0IHByb3ZpZGVkCiAgICAgKiBuZXdfbGluayBzdXBwb3J0IGZvciB0aGlzIERCTVMuICBDb250YWlucyBmYWxzZSBpZiBpdCdzIHVuc3VwcG9ydGVkLgogICAgICoKICAgICAqIE1lYW5pbmcgb2YgdGhlICdsaW1pdCcgZWxlbWVudDoKICAgICAqICAgKyAnZW11bGF0ZScgPSBlbXVsYXRlIHdpdGggZmV0Y2ggcm93IGJ5IG51bWJlcgogICAgICogICArICdhbHRlcicgICA9IGFsdGVyIHRoZSBxdWVyeQogICAgICogICArIGZhbHNlICAgICA9IHNraXAgcm93cwogICAgICoKICAgICAqIEB2YXIgYXJyYXkKICAgICAqLwogICAgdmFyICRmZWF0dXJlcyA9IGFycmF5KAogICAgICAgICdsaW1pdCcgICAgICAgICA9PiAnZW11bGF0ZScsCiAgICAgICAgJ25ld19saW5rJyAgICAgID0+IGZhbHNlLAogICAgICAgICdudW1yb3dzJyAgICAgICA9PiB0cnVlLAogICAgICAgICdwY29ubmVjdCcgICAgICA9PiB0cnVlLAogICAgICAgICdwcmVwYXJlJyAgICAgICA9PiBmYWxzZSwKICAgICAgICAnc3NsJyAgICAgICAgICAgPT4gZmFsc2UsCiAgICAgICAgJ3RyYW5zYWN0aW9ucycgID0+IHRydWUsCiAgICApOwoKICAgIC8qKgogICAgICogQSBtYXBwaW5nIG9mIG5hdGl2ZSBlcnJvciBjb2RlcyB0byBEQiBlcnJvciBjb2RlcwogICAgICogQHZhciBhcnJheQogICAgICovCiAgICB2YXIgJGVycm9yY29kZV9tYXAgPSBhcnJheSgKICAgICk7CgogICAgLyoqCiAgICAgKiBUaGUgcmF3IGRhdGFiYXNlIGNvbm5lY3Rpb24gY3JlYXRlZCBieSBQSFAKICAgICAqIEB2YXIgcmVzb3VyY2UKICAgICAqLwogICAgdmFyICRjb25uZWN0aW9uOwoKICAgIC8qKgogICAgICogVGhlIERTTiBpbmZvcm1hdGlvbiBmb3IgY29ubmVjdGluZyB0byBhIGRhdGFiYXNlCiAgICAgKiBAdmFyIGFycmF5CiAgICAgKi8KICAgIHZhciAkZHNuID0gYXJyYXkoKTsKCgogICAgLyoqCiAgICAgKiBTaG91bGQgZGF0YSBtYW5pcHVsYXRpb24gcXVlcmllcyBiZSBjb21taXR0ZWQgYXV0b21hdGljYWxseT8KICAgICAqIEB2YXIgYm9vbAogICAgICogQGFjY2VzcyBwcml2YXRlCiAgICAgKi8KICAgIHZhciAkYXV0b2NvbW1pdCA9IHRydWU7CgogICAgLyoqCiAgICAgKiBUaGUgcXVhbnRpdHkgb2YgdHJhbnNhY3Rpb25zIGJlZ3VuCiAgICAgKgogICAgICoge0BpbnRlcm5hbCAgV2hpbGUgdGhpcyBpcyBwcml2YXRlLCBpdCBjYW4ndCBhY3R1YWxseSBiZSBkZXNpZ25hdGVkCiAgICAgKiBwcml2YXRlIGluIFBIUCA1IGJlY2F1c2UgaXQgaXMgZGlyZWN0bHkgYWNjZXNzZWQgaW4gdGhlIHRlc3Qgc3VpdGUufX0KICAgICAqCiAgICAgKiBAdmFyIGludGVnZXIKICAgICAqIEBhY2Nlc3MgcHJpdmF0ZQogICAgICovCiAgICB2YXIgJHRyYW5zYWN0aW9uX29wY291bnQgPSAwOwoKICAgIC8qKgogICAgICogVGhlIGRhdGFiYXNlIHNwZWNpZmllZCBpbiB0aGUgRFNOCiAgICAgKgogICAgICogSXQncyBhIGZpeCB0byBhbGxvdyBjYWxscyB0byBkaWZmZXJlbnQgZGF0YWJhc2VzIGluIHRoZSBzYW1lIHNjcmlwdC4KICAgICAqCiAgICAgKiBAdmFyIHN0cmluZwogICAgICogQGFjY2VzcyBwcml2YXRlCiAgICAgKi8KICAgIHZhciAkX2RiID0gJyc7CgoKICAgIC8vIH19fQogICAgLy8ge3t7IGNvbnN0cnVjdG9yCgogICAgLyoqCiAgICAgKiBUaGlzIGNvbnN0cnVjdG9yIGNhbGxzIDxrYmQ+JHRoaXMtPkRCX2NvbW1vbigpPC9rYmQ+CiAgICAgKgogICAgICogQHJldHVybiB2b2lkCiAgICAgKi8KICAgIGZ1bmN0aW9uIERCX3N5YmFzZSgpCiAgICB7CiAgICAgICAgJHRoaXMtPkRCX2NvbW1vbigpOwogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IGNvbm5lY3QoKQoKICAgIC8qKgogICAgICogQ29ubmVjdCB0byB0aGUgZGF0YWJhc2Ugc2VydmVyLCBsb2cgaW4gYW5kIG9wZW4gdGhlIGRhdGFiYXNlCiAgICAgKgogICAgICogRG9uJ3QgY2FsbCB0aGlzIG1ldGhvZCBkaXJlY3RseS4gIFVzZSBEQjo6Y29ubmVjdCgpIGluc3RlYWQuCiAgICAgKgogICAgICogUEVBUiBEQidzIHN5YmFzZSBkcml2ZXIgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBleHRyYSBEU04gb3B0aW9uczoKICAgICAqICAgKyBhcHBuYW1lICAgICAgIFRoZSBhcHBsaWNhdGlvbiBuYW1lIHRvIHVzZSBvbiB0aGlzIGNvbm5lY3Rpb24uCiAgICAgKiAgICAgICAgICAgICAgICAgICBBdmFpbGFibGUgc2luY2UgUEVBUiBEQiAxLjcuMC4KICAgICAqICAgKyBjaGFyc2V0ICAgICAgIFRoZSBjaGFyYWN0ZXIgc2V0IHRvIHVzZSBvbiB0aGlzIGNvbm5lY3Rpb24uCiAgICAgKiAgICAgICAgICAgICAgICAgICBBdmFpbGFibGUgc2luY2UgUEVBUiBEQiAxLjcuMC4KICAgICAqCiAgICAgKiBAcGFyYW0gYXJyYXkgJGRzbiAgICAgICAgIHRoZSBkYXRhIHNvdXJjZSBuYW1lCiAgICAgKiBAcGFyYW0gYm9vbCAgJHBlcnNpc3RlbnQgIHNob3VsZCB0aGUgY29ubmVjdGlvbiBiZSBwZXJzaXN0ZW50PwogICAgICoKICAgICAqIEByZXR1cm4gaW50ICBEQl9PSyBvbiBzdWNjZXNzLiBBIERCX0Vycm9yIG9iamVjdCBvbiBmYWlsdXJlLgogICAgICovCiAgICBmdW5jdGlvbiBjb25uZWN0KCRkc24sICRwZXJzaXN0ZW50ID0gZmFsc2UpCiAgICB7CiAgICAgICAgaWYgKCFQRUFSOjpsb2FkRXh0ZW5zaW9uKCdzeWJhc2UnKSAmJgogICAgICAgICAgICAhUEVBUjo6bG9hZEV4dGVuc2lvbignc3liYXNlX2N0JykpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gJHRoaXMtPnJhaXNlRXJyb3IoREJfRVJST1JfRVhURU5TSU9OX05PVF9GT1VORCk7CiAgICAgICAgfQoKICAgICAgICAkdGhpcy0+ZHNuID0gJGRzbjsKICAgICAgICBpZiAoJGRzblsnZGJzeW50YXgnXSkgewogICAgICAgICAgICAkdGhpcy0+ZGJzeW50YXggPSAkZHNuWydkYnN5bnRheCddOwogICAgICAgIH0KCiAgICAgICAgJGRzblsnaG9zdHNwZWMnXSA9ICRkc25bJ2hvc3RzcGVjJ10gPyAkZHNuWydob3N0c3BlYyddIDogJ2xvY2FsaG9zdCc7CiAgICAgICAgJGRzblsncGFzc3dvcmQnXSA9ICFlbXB0eSgkZHNuWydwYXNzd29yZCddKSA/ICRkc25bJ3Bhc3N3b3JkJ10gOiBmYWxzZTsKICAgICAgICAkZHNuWydjaGFyc2V0J10gPSBpc3NldCgkZHNuWydjaGFyc2V0J10pID8gJGRzblsnY2hhcnNldCddIDogZmFsc2U7CiAgICAgICAgJGRzblsnYXBwbmFtZSddID0gaXNzZXQoJGRzblsnYXBwbmFtZSddKSA/ICRkc25bJ2FwcG5hbWUnXSA6IGZhbHNlOwoKICAgICAgICAkY29ubmVjdF9mdW5jdGlvbiA9ICRwZXJzaXN0ZW50ID8gJ3N5YmFzZV9wY29ubmVjdCcgOiAnc3liYXNlX2Nvbm5lY3QnOwoKICAgICAgICBpZiAoJGRzblsndXNlcm5hbWUnXSkgewogICAgICAgICAgICAkdGhpcy0+Y29ubmVjdGlvbiA9IEAkY29ubmVjdF9mdW5jdGlvbigkZHNuWydob3N0c3BlYyddLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZHNuWyd1c2VybmFtZSddLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZHNuWydwYXNzd29yZCddLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZHNuWydjaGFyc2V0J10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRkc25bJ2FwcG5hbWUnXSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5yYWlzZUVycm9yKERCX0VSUk9SX0NPTk5FQ1RfRkFJTEVELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwgbnVsbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUaGUgRFNOIGRpZCBub3QgY29udGFpbiBhIHVzZXJuYW1lLicpOwogICAgICAgIH0KCiAgICAgICAgaWYgKCEkdGhpcy0+Y29ubmVjdGlvbikgewogICAgICAgICAgICByZXR1cm4gJHRoaXMtPnJhaXNlRXJyb3IoREJfRVJST1JfQ09OTkVDVF9GQUlMRUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBudWxsLCBudWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQHN5YmFzZV9nZXRfbGFzdF9tZXNzYWdlKCkpOwogICAgICAgIH0KCiAgICAgICAgaWYgKCRkc25bJ2RhdGFiYXNlJ10pIHsKICAgICAgICAgICAgaWYgKCFAc3liYXNlX3NlbGVjdF9kYigkZHNuWydkYXRhYmFzZSddLCAkdGhpcy0+Y29ubmVjdGlvbikpIHsKICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+cmFpc2VFcnJvcihEQl9FUlJPUl9OT0RCU0VMRUNURUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwgbnVsbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAc3liYXNlX2dldF9sYXN0X21lc3NhZ2UoKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJHRoaXMtPl9kYiA9ICRkc25bJ2RhdGFiYXNlJ107CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gREJfT0s7CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgZGlzY29ubmVjdCgpCgogICAgLyoqCiAgICAgKiBEaXNjb25uZWN0cyBmcm9tIHRoZSBkYXRhYmFzZSBzZXJ2ZXIKICAgICAqCiAgICAgKiBAcmV0dXJuIGJvb2wgIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZQogICAgICovCiAgICBmdW5jdGlvbiBkaXNjb25uZWN0KCkKICAgIHsKICAgICAgICAkcmV0ID0gQHN5YmFzZV9jbG9zZSgkdGhpcy0+Y29ubmVjdGlvbik7CiAgICAgICAgJHRoaXMtPmNvbm5lY3Rpb24gPSBudWxsOwogICAgICAgIHJldHVybiAkcmV0OwogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IHNpbXBsZVF1ZXJ5KCkKCiAgICAvKioKICAgICAqIFNlbmRzIGEgcXVlcnkgdG8gdGhlIGRhdGFiYXNlIHNlcnZlcgogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgIHRoZSBTUUwgcXVlcnkgc3RyaW5nCiAgICAgKgogICAgICogQHJldHVybiBtaXhlZCAgKyBhIFBIUCByZXN1bHQgcmVzcm91Y2UgZm9yIHN1Y2Nlc3NmdWwgU0VMRUNUIHF1ZXJpZXMKICAgICAqICAgICAgICAgICAgICAgICsgdGhlIERCX09LIGNvbnN0YW50IGZvciBvdGhlciBzdWNjZXNzZnVsIHF1ZXJpZXMKICAgICAqICAgICAgICAgICAgICAgICsgYSBEQl9FcnJvciBvYmplY3Qgb24gZmFpbHVyZQogICAgICovCiAgICBmdW5jdGlvbiBzaW1wbGVRdWVyeSgkcXVlcnkpCiAgICB7CiAgICAgICAgJGlzbWFuaXAgPSAkdGhpcy0+X2NoZWNrTWFuaXAoJHF1ZXJ5KTsKICAgICAgICAkdGhpcy0+bGFzdF9xdWVyeSA9ICRxdWVyeTsKICAgICAgICBpZiAoJHRoaXMtPl9kYiAmJiAhQHN5YmFzZV9zZWxlY3RfZGIoJHRoaXMtPl9kYiwgJHRoaXMtPmNvbm5lY3Rpb24pKSB7CiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+c3liYXNlUmFpc2VFcnJvcihEQl9FUlJPUl9OT0RCU0VMRUNURUQpOwogICAgICAgIH0KICAgICAgICAkcXVlcnkgPSAkdGhpcy0+bW9kaWZ5UXVlcnkoJHF1ZXJ5KTsKICAgICAgICBpZiAoISR0aGlzLT5hdXRvY29tbWl0ICYmICRpc21hbmlwKSB7CiAgICAgICAgICAgIGlmICgkdGhpcy0+dHJhbnNhY3Rpb25fb3Bjb3VudCA9PSAwKSB7CiAgICAgICAgICAgICAgICAkcmVzdWx0ID0gQHN5YmFzZV9xdWVyeSgnQkVHSU4gVFJBTlNBQ1RJT04nLCAkdGhpcy0+Y29ubmVjdGlvbik7CiAgICAgICAgICAgICAgICBpZiAoISRyZXN1bHQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPnN5YmFzZVJhaXNlRXJyb3IoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAkdGhpcy0+dHJhbnNhY3Rpb25fb3Bjb3VudCsrOwogICAgICAgIH0KICAgICAgICAkcmVzdWx0ID0gQHN5YmFzZV9xdWVyeSgkcXVlcnksICR0aGlzLT5jb25uZWN0aW9uKTsKICAgICAgICBpZiAoISRyZXN1bHQpIHsKICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5zeWJhc2VSYWlzZUVycm9yKCk7CiAgICAgICAgfQogICAgICAgIGlmIChpc19yZXNvdXJjZSgkcmVzdWx0KSkgewogICAgICAgICAgICByZXR1cm4gJHJlc3VsdDsKICAgICAgICB9CiAgICAgICAgLy8gRGV0ZXJtaW5lIHdoaWNoIHF1ZXJpZXMgdGhhdCBzaG91bGQgcmV0dXJuIGRhdGEsIGFuZCB3aGljaAogICAgICAgIC8vIHNob3VsZCByZXR1cm4gYW4gZXJyb3IgY29kZSBvbmx5LgogICAgICAgIHJldHVybiAkaXNtYW5pcCA/IERCX09LIDogJHJlc3VsdDsKICAgIH0KCiAgICAvLyB9fX0KICAgIC8vIHt7eyBuZXh0UmVzdWx0KCkKCiAgICAvKioKICAgICAqIE1vdmUgdGhlIGludGVybmFsIHN5YmFzZSByZXN1bHQgcG9pbnRlciB0byB0aGUgbmV4dCBhdmFpbGFibGUgcmVzdWx0CiAgICAgKgogICAgICogQHBhcmFtIGEgdmFsaWQgc3liYXNlIHJlc3VsdCByZXNvdXJjZQogICAgICoKICAgICAqIEBhY2Nlc3MgcHVibGljCiAgICAgKgogICAgICogQHJldHVybiB0cnVlIGlmIGEgcmVzdWx0IGlzIGF2YWlsYWJsZSBvdGhlcndpc2UgcmV0dXJuIGZhbHNlCiAgICAgKi8KICAgIGZ1bmN0aW9uIG5leHRSZXN1bHQoJHJlc3VsdCkKICAgIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgZmV0Y2hJbnRvKCkKCiAgICAvKioKICAgICAqIFBsYWNlcyBhIHJvdyBmcm9tIHRoZSByZXN1bHQgc2V0IGludG8gdGhlIGdpdmVuIGFycmF5CiAgICAgKgogICAgICogRm9ybWF0aW5nIG9mIHRoZSBhcnJheSBhbmQgdGhlIGRhdGEgdGhlcmVpbiBhcmUgY29uZmlndXJhYmxlLgogICAgICogU2VlIERCX3Jlc3VsdDo6ZmV0Y2hJbnRvKCkgZm9yIG1vcmUgaW5mb3JtYXRpb24uCiAgICAgKgogICAgICogVGhpcyBtZXRob2QgaXMgbm90IG1lYW50IHRvIGJlIGNhbGxlZCBkaXJlY3RseS4gIFVzZQogICAgICogREJfcmVzdWx0OjpmZXRjaEludG8oKSBpbnN0ZWFkLiAgSXQgY2FuJ3QgYmUgZGVjbGFyZWQgInByb3RlY3RlZCIKICAgICAqIGJlY2F1c2UgREJfcmVzdWx0IGlzIGEgc2VwYXJhdGUgb2JqZWN0LgogICAgICoKICAgICAqIEBwYXJhbSByZXNvdXJjZSAkcmVzdWx0ICAgIHRoZSBxdWVyeSByZXN1bHQgcmVzb3VyY2UKICAgICAqIEBwYXJhbSBhcnJheSAgICAkYXJyICAgICAgIHRoZSByZWZlcmVuY2VkIGFycmF5IHRvIHB1dCB0aGUgZGF0YSBpbgogICAgICogQHBhcmFtIGludCAgICAgICRmZXRjaG1vZGUgaG93IHRoZSByZXN1bHRpbmcgYXJyYXkgc2hvdWxkIGJlIGluZGV4ZWQKICAgICAqIEBwYXJhbSBpbnQgICAgICAkcm93bnVtICAgIHRoZSByb3cgbnVtYmVyIHRvIGZldGNoICgwID0gZmlyc3Qgcm93KQogICAgICoKICAgICAqIEByZXR1cm4gbWl4ZWQgIERCX09LIG9uIHN1Y2Nlc3MsIE5VTEwgd2hlbiB0aGUgZW5kIG9mIGEgcmVzdWx0IHNldCBpcwogICAgICogICAgICAgICAgICAgICAgIHJlYWNoZWQgb3Igb24gZmFpbHVyZQogICAgICoKICAgICAqIEBzZWUgREJfcmVzdWx0OjpmZXRjaEludG8oKQogICAgICovCiAgICBmdW5jdGlvbiBmZXRjaEludG8oJHJlc3VsdCwgJiRhcnIsICRmZXRjaG1vZGUsICRyb3dudW0gPSBudWxsKQogICAgewogICAgICAgIGlmICgkcm93bnVtICE9PSBudWxsKSB7CiAgICAgICAgICAgIGlmICghQHN5YmFzZV9kYXRhX3NlZWsoJHJlc3VsdCwgJHJvd251bSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICgkZmV0Y2htb2RlICYgREJfRkVUQ0hNT0RFX0FTU09DKSB7CiAgICAgICAgICAgIGlmIChmdW5jdGlvbl9leGlzdHMoJ3N5YmFzZV9mZXRjaF9hc3NvYycpKSB7CiAgICAgICAgICAgICAgICAkYXJyID0gQHN5YmFzZV9mZXRjaF9hc3NvYygkcmVzdWx0KTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGlmICgkYXJyID0gQHN5YmFzZV9mZXRjaF9hcnJheSgkcmVzdWx0KSkgewogICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRhcnIgYXMgJGtleSA9PiAkdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzX2ludCgka2V5KSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zZXQoJGFyclska2V5XSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCR0aGlzLT5vcHRpb25zWydwb3J0YWJpbGl0eSddICYgREJfUE9SVEFCSUxJVFlfTE9XRVJDQVNFICYmICRhcnIpIHsKICAgICAgICAgICAgICAgICRhcnIgPSBhcnJheV9jaGFuZ2Vfa2V5X2Nhc2UoJGFyciwgQ0FTRV9MT1dFUik7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkYXJyID0gQHN5YmFzZV9mZXRjaF9yb3coJHJlc3VsdCk7CiAgICAgICAgfQogICAgICAgIGlmICghJGFycikgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgaWYgKCR0aGlzLT5vcHRpb25zWydwb3J0YWJpbGl0eSddICYgREJfUE9SVEFCSUxJVFlfUlRSSU0pIHsKICAgICAgICAgICAgJHRoaXMtPl9ydHJpbUFycmF5VmFsdWVzKCRhcnIpOwogICAgICAgIH0KICAgICAgICBpZiAoJHRoaXMtPm9wdGlvbnNbJ3BvcnRhYmlsaXR5J10gJiBEQl9QT1JUQUJJTElUWV9OVUxMX1RPX0VNUFRZKSB7CiAgICAgICAgICAgICR0aGlzLT5fY29udmVydE51bGxBcnJheVZhbHVlc1RvRW1wdHkoJGFycik7CiAgICAgICAgfQogICAgICAgIHJldHVybiBEQl9PSzsKICAgIH0KCiAgICAvLyB9fX0KICAgIC8vIHt7eyBmcmVlUmVzdWx0KCkKCiAgICAvKioKICAgICAqIERlbGV0ZXMgdGhlIHJlc3VsdCBzZXQgYW5kIGZyZWVzIHRoZSBtZW1vcnkgb2NjdXBpZWQgYnkgdGhlIHJlc3VsdCBzZXQKICAgICAqCiAgICAgKiBUaGlzIG1ldGhvZCBpcyBub3QgbWVhbnQgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LiAgVXNlCiAgICAgKiBEQl9yZXN1bHQ6OmZyZWUoKSBpbnN0ZWFkLiAgSXQgY2FuJ3QgYmUgZGVjbGFyZWQgInByb3RlY3RlZCIKICAgICAqIGJlY2F1c2UgREJfcmVzdWx0IGlzIGEgc2VwYXJhdGUgb2JqZWN0LgogICAgICoKICAgICAqIEBwYXJhbSByZXNvdXJjZSAkcmVzdWx0ICBQSFAncyBxdWVyeSByZXN1bHQgcmVzb3VyY2UKICAgICAqCiAgICAgKiBAcmV0dXJuIGJvb2wgIFRSVUUgb24gc3VjY2VzcywgRkFMU0UgaWYgJHJlc3VsdCBpcyBpbnZhbGlkCiAgICAgKgogICAgICogQHNlZSBEQl9yZXN1bHQ6OmZyZWUoKQogICAgICovCiAgICBmdW5jdGlvbiBmcmVlUmVzdWx0KCRyZXN1bHQpCiAgICB7CiAgICAgICAgcmV0dXJuIGlzX3Jlc291cmNlKCRyZXN1bHQpID8gc3liYXNlX2ZyZWVfcmVzdWx0KCRyZXN1bHQpIDogZmFsc2U7CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgbnVtQ29scygpCgogICAgLyoqCiAgICAgKiBHZXRzIHRoZSBudW1iZXIgb2YgY29sdW1ucyBpbiBhIHJlc3VsdCBzZXQKICAgICAqCiAgICAgKiBUaGlzIG1ldGhvZCBpcyBub3QgbWVhbnQgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LiAgVXNlCiAgICAgKiBEQl9yZXN1bHQ6Om51bUNvbHMoKSBpbnN0ZWFkLiAgSXQgY2FuJ3QgYmUgZGVjbGFyZWQgInByb3RlY3RlZCIKICAgICAqIGJlY2F1c2UgREJfcmVzdWx0IGlzIGEgc2VwYXJhdGUgb2JqZWN0LgogICAgICoKICAgICAqIEBwYXJhbSByZXNvdXJjZSAkcmVzdWx0ICBQSFAncyBxdWVyeSByZXN1bHQgcmVzb3VyY2UKICAgICAqCiAgICAgKiBAcmV0dXJuIGludCAgdGhlIG51bWJlciBvZiBjb2x1bW5zLiAgQSBEQl9FcnJvciBvYmplY3Qgb24gZmFpbHVyZS4KICAgICAqCiAgICAgKiBAc2VlIERCX3Jlc3VsdDo6bnVtQ29scygpCiAgICAgKi8KICAgIGZ1bmN0aW9uIG51bUNvbHMoJHJlc3VsdCkKICAgIHsKICAgICAgICAkY29scyA9IEBzeWJhc2VfbnVtX2ZpZWxkcygkcmVzdWx0KTsKICAgICAgICBpZiAoISRjb2xzKSB7CiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+c3liYXNlUmFpc2VFcnJvcigpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJGNvbHM7CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgbnVtUm93cygpCgogICAgLyoqCiAgICAgKiBHZXRzIHRoZSBudW1iZXIgb2Ygcm93cyBpbiBhIHJlc3VsdCBzZXQKICAgICAqCiAgICAgKiBUaGlzIG1ldGhvZCBpcyBub3QgbWVhbnQgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LiAgVXNlCiAgICAgKiBEQl9yZXN1bHQ6Om51bVJvd3MoKSBpbnN0ZWFkLiAgSXQgY2FuJ3QgYmUgZGVjbGFyZWQgInByb3RlY3RlZCIKICAgICAqIGJlY2F1c2UgREJfcmVzdWx0IGlzIGEgc2VwYXJhdGUgb2JqZWN0LgogICAgICoKICAgICAqIEBwYXJhbSByZXNvdXJjZSAkcmVzdWx0ICBQSFAncyBxdWVyeSByZXN1bHQgcmVzb3VyY2UKICAgICAqCiAgICAgKiBAcmV0dXJuIGludCAgdGhlIG51bWJlciBvZiByb3dzLiAgQSBEQl9FcnJvciBvYmplY3Qgb24gZmFpbHVyZS4KICAgICAqCiAgICAgKiBAc2VlIERCX3Jlc3VsdDo6bnVtUm93cygpCiAgICAgKi8KICAgIGZ1bmN0aW9uIG51bVJvd3MoJHJlc3VsdCkKICAgIHsKICAgICAgICAkcm93cyA9IEBzeWJhc2VfbnVtX3Jvd3MoJHJlc3VsdCk7CiAgICAgICAgaWYgKCRyb3dzID09PSBmYWxzZSkgewogICAgICAgICAgICByZXR1cm4gJHRoaXMtPnN5YmFzZVJhaXNlRXJyb3IoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICRyb3dzOwogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IGFmZmVjdGVkUm93cygpCgogICAgLyoqCiAgICAgKiBEZXRlcm1pbmVzIHRoZSBudW1iZXIgb2Ygcm93cyBhZmZlY3RlZCBieSBhIGRhdGEgbWFuaXVwbGF0aW9uIHF1ZXJ5CiAgICAgKgogICAgICogMCBpcyByZXR1cm5lZCBmb3IgcXVlcmllcyB0aGF0IGRvbid0IG1hbmlwdWxhdGUgZGF0YS4KICAgICAqCiAgICAgKiBAcmV0dXJuIGludCAgdGhlIG51bWJlciBvZiByb3dzLiAgQSBEQl9FcnJvciBvYmplY3Qgb24gZmFpbHVyZS4KICAgICAqLwogICAgZnVuY3Rpb24gYWZmZWN0ZWRSb3dzKCkKICAgIHsKICAgICAgICBpZiAoJHRoaXMtPl9sYXN0X3F1ZXJ5X21hbmlwKSB7CiAgICAgICAgICAgICRyZXN1bHQgPSBAc3liYXNlX2FmZmVjdGVkX3Jvd3MoJHRoaXMtPmNvbm5lY3Rpb24pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRyZXN1bHQgPSAwOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJHJlc3VsdDsKICAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgbmV4dElkKCkKCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIG5leHQgZnJlZSBpZCBpbiBhIHNlcXVlbmNlCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAgJHNlcV9uYW1lICBuYW1lIG9mIHRoZSBzZXF1ZW5jZQogICAgICogQHBhcmFtIGJvb2xlYW4gJG9uZGVtYW5kICB3aGVuIHRydWUsIHRoZSBzZXFlbmNlIGlzIGF1dG9tYXRpY2FsbHkKICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZWQgaWYgaXQgZG9lcyBub3QgZXhpc3QKICAgICAqCiAgICAgKiBAcmV0dXJuIGludCAgdGhlIG5leHQgaWQgbnVtYmVyIGluIHRoZSBzZXF1ZW5jZS4KICAgICAqICAgICAgICAgICAgICAgQSBEQl9FcnJvciBvYmplY3Qgb24gZmFpbHVyZS4KICAgICAqCiAgICAgKiBAc2VlIERCX2NvbW1vbjo6bmV4dElEKCksIERCX2NvbW1vbjo6Z2V0U2VxdWVuY2VOYW1lKCksCiAgICAgKiAgICAgIERCX3N5YmFzZTo6Y3JlYXRlU2VxdWVuY2UoKSwgREJfc3liYXNlOjpkcm9wU2VxdWVuY2UoKQogICAgICovCiAgICBmdW5jdGlvbiBuZXh0SWQoJHNlcV9uYW1lLCAkb25kZW1hbmQgPSB0cnVlKQogICAgewogICAgICAgICRzZXFuYW1lID0gJHRoaXMtPmdldFNlcXVlbmNlTmFtZSgkc2VxX25hbWUpOwogICAgICAgIGlmICgkdGhpcy0+X2RiICYmICFAc3liYXNlX3NlbGVjdF9kYigkdGhpcy0+X2RiLCAkdGhpcy0+Y29ubmVjdGlvbikpIHsKICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5zeWJhc2VSYWlzZUVycm9yKERCX0VSUk9SX05PREJTRUxFQ1RFRCk7CiAgICAgICAgfQogICAgICAgICRyZXBlYXQgPSAwOwogICAgICAgIGRvIHsKICAgICAgICAgICAgJHRoaXMtPnB1c2hFcnJvckhhbmRsaW5nKFBFQVJfRVJST1JfUkVUVVJOKTsKICAgICAgICAgICAgJHJlc3VsdCA9ICR0aGlzLT5xdWVyeSgiSU5TRVJUIElOVE8gJHNlcW5hbWUgKHZhcG9yKSBWQUxVRVMgKDApIik7CiAgICAgICAgICAgICR0aGlzLT5wb3BFcnJvckhhbmRsaW5nKCk7CiAgICAgICAgICAgIGlmICgkb25kZW1hbmQgJiYgREI6OmlzRXJyb3IoJHJlc3VsdCkgJiYKICAgICAgICAgICAgICAgICgkcmVzdWx0LT5nZXRDb2RlKCkgPT0gREJfRVJST1IgfHwgJHJlc3VsdC0+Z2V0Q29kZSgpID09IERCX0VSUk9SX05PU1VDSFRBQkxFKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJHJlcGVhdCA9IDE7CiAgICAgICAgICAgICAgICAkcmVzdWx0ID0gJHRoaXMtPmNyZWF0ZVNlcXVlbmNlKCRzZXFfbmFtZSk7CiAgICAgICAgICAgICAgICBpZiAoREI6OmlzRXJyb3IoJHJlc3VsdCkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPnJhaXNlRXJyb3IoJHJlc3VsdCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZWlmICghREI6OmlzRXJyb3IoJHJlc3VsdCkpIHsKICAgICAgICAgICAgICAgICRyZXN1bHQgPSYgJHRoaXMtPnF1ZXJ5KCJTRUxFQ1QgQEBJREVOVElUWSBGUk9NICRzZXFuYW1lIik7CiAgICAgICAgICAgICAgICAkcmVwZWF0ID0gMDsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICRyZXBlYXQgPSBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgIH0gd2hpbGUgKCRyZXBlYXQpOwogICAgICAgIGlmIChEQjo6aXNFcnJvcigkcmVzdWx0KSkgewogICAgICAgICAgICByZXR1cm4gJHRoaXMtPnJhaXNlRXJyb3IoJHJlc3VsdCk7CiAgICAgICAgfQogICAgICAgICRyZXN1bHQgPSAkcmVzdWx0LT5mZXRjaFJvdyhEQl9GRVRDSE1PREVfT1JERVJFRCk7CiAgICAgICAgcmV0dXJuICRyZXN1bHRbMF07CiAgICB9CgogICAgLyoqCiAgICAgKiBDcmVhdGVzIGEgbmV3IHNlcXVlbmNlCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkc2VxX25hbWUgIG5hbWUgb2YgdGhlIG5ldyBzZXF1ZW5jZQogICAgICoKICAgICAqIEByZXR1cm4gaW50ICBEQl9PSyBvbiBzdWNjZXNzLiAgQSBEQl9FcnJvciBvYmplY3Qgb24gZmFpbHVyZS4KICAgICAqCiAgICAgKiBAc2VlIERCX2NvbW1vbjo6Y3JlYXRlU2VxdWVuY2UoKSwgREJfY29tbW9uOjpnZXRTZXF1ZW5jZU5hbWUoKSwKICAgICAqICAgICAgREJfc3liYXNlOjpuZXh0SUQoKSwgREJfc3liYXNlOjpkcm9wU2VxdWVuY2UoKQogICAgICovCiAgICBmdW5jdGlvbiBjcmVhdGVTZXF1ZW5jZSgkc2VxX25hbWUpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5xdWVyeSgnQ1JFQVRFIFRBQkxFICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJHRoaXMtPmdldFNlcXVlbmNlTmFtZSgkc2VxX25hbWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICcgKGlkIG51bWVyaWMoMTAsIDApIElERU5USVRZIE5PVCBOVUxMLCcKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJyB2YXBvciBpbnQgTlVMTCknKTsKICAgIH0KCiAgICAvLyB9fX0KICAgIC8vIHt7eyBkcm9wU2VxdWVuY2UoKQoKICAgIC8qKgogICAgICogRGVsZXRlcyBhIHNlcXVlbmNlCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkc2VxX25hbWUgIG5hbWUgb2YgdGhlIHNlcXVlbmNlIHRvIGJlIGRlbGV0ZWQKICAgICAqCiAgICAgKiBAcmV0dXJuIGludCAgREJfT0sgb24gc3VjY2Vzcy4gIEEgREJfRXJyb3Igb2JqZWN0IG9uIGZhaWx1cmUuCiAgICAgKgogICAgICogQHNlZSBEQl9jb21tb246OmRyb3BTZXF1ZW5jZSgpLCBEQl9jb21tb246OmdldFNlcXVlbmNlTmFtZSgpLAogICAgICogICAgICBEQl9zeWJhc2U6Om5leHRJRCgpLCBEQl9zeWJhc2U6OmNyZWF0ZVNlcXVlbmNlKCkKICAgICAqLwogICAgZnVuY3Rpb24gZHJvcFNlcXVlbmNlKCRzZXFfbmFtZSkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnF1ZXJ5KCdEUk9QIFRBQkxFICcgLiAkdGhpcy0+Z2V0U2VxdWVuY2VOYW1lKCRzZXFfbmFtZSkpOwogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IHF1b3RlRmxvYXQoKQoKICAgIC8qKgogICAgICogRm9ybWF0cyBhIGZsb2F0IHZhbHVlIGZvciB1c2Ugd2l0aGluIGEgcXVlcnkgaW4gYSBsb2NhbGUtaW5kZXBlbmRlbnQKICAgICAqIG1hbm5lci4KICAgICAqCiAgICAgKiBAcGFyYW0gZmxvYXQgdGhlIGZsb2F0IHZhbHVlIHRvIGJlIHF1b3RlZC4KICAgICAqIEByZXR1cm4gc3RyaW5nIHRoZSBxdW90ZWQgc3RyaW5nLgogICAgICogQHNlZSBEQl9jb21tb246OnF1b3RlU21hcnQoKQogICAgICogQHNpbmNlIE1ldGhvZCBhdmFpbGFibGUgc2luY2UgcmVsZWFzZSAxLjcuOC4KICAgICAqLwogICAgZnVuY3Rpb24gcXVvdGVGbG9hdCgkZmxvYXQpIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmVzY2FwZVNpbXBsZShzdHJfcmVwbGFjZSgnLCcsICcuJywgc3RydmFsKGZsb2F0dmFsKCRmbG9hdCkpKSk7CiAgICB9CiAgICAgCiAgICAvLyB9fX0KICAgIC8vIHt7eyBhdXRvQ29tbWl0KCkKCiAgICAvKioKICAgICAqIEVuYWJsZXMgb3IgZGlzYWJsZXMgYXV0b21hdGljIGNvbW1pdHMKICAgICAqCiAgICAgKiBAcGFyYW0gYm9vbCAkb25vZmYgIHRydWUgdHVybnMgaXQgb24sIGZhbHNlIHR1cm5zIGl0IG9mZgogICAgICoKICAgICAqIEByZXR1cm4gaW50ICBEQl9PSyBvbiBzdWNjZXNzLiAgQSBEQl9FcnJvciBvYmplY3QgaWYgdGhlIGRyaXZlcgogICAgICogICAgICAgICAgICAgICBkb2Vzbid0IHN1cHBvcnQgYXV0by1jb21taXR0aW5nIHRyYW5zYWN0aW9ucy4KICAgICAqLwogICAgZnVuY3Rpb24gYXV0b0NvbW1pdCgkb25vZmYgPSBmYWxzZSkKICAgIHsKICAgICAgICAvLyBYWFggaWYgJHRoaXMtPnRyYW5zYWN0aW9uX29wY291bnQgPiAwLCB3ZSBzaG91bGQgcHJvYmFibHkKICAgICAgICAvLyBpc3N1ZSBhIHdhcm5pbmcgaGVyZS4KICAgICAgICAkdGhpcy0+YXV0b2NvbW1pdCA9ICRvbm9mZiA/IHRydWUgOiBmYWxzZTsKICAgICAgICByZXR1cm4gREJfT0s7CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgY29tbWl0KCkKCiAgICAvKioKICAgICAqIENvbW1pdHMgdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24KICAgICAqCiAgICAgKiBAcmV0dXJuIGludCAgREJfT0sgb24gc3VjY2Vzcy4gIEEgREJfRXJyb3Igb2JqZWN0IG9uIGZhaWx1cmUuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGNvbW1pdCgpCiAgICB7CiAgICAgICAgaWYgKCR0aGlzLT50cmFuc2FjdGlvbl9vcGNvdW50ID4gMCkgewogICAgICAgICAgICBpZiAoJHRoaXMtPl9kYiAmJiAhQHN5YmFzZV9zZWxlY3RfZGIoJHRoaXMtPl9kYiwgJHRoaXMtPmNvbm5lY3Rpb24pKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPnN5YmFzZVJhaXNlRXJyb3IoREJfRVJST1JfTk9EQlNFTEVDVEVEKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkcmVzdWx0ID0gQHN5YmFzZV9xdWVyeSgnQ09NTUlUJywgJHRoaXMtPmNvbm5lY3Rpb24pOwogICAgICAgICAgICAkdGhpcy0+dHJhbnNhY3Rpb25fb3Bjb3VudCA9IDA7CiAgICAgICAgICAgIGlmICghJHJlc3VsdCkgewogICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5zeWJhc2VSYWlzZUVycm9yKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIERCX09LOwogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IHJvbGxiYWNrKCkKCiAgICAvKioKICAgICAqIFJldmVydHMgdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24KICAgICAqCiAgICAgKiBAcmV0dXJuIGludCAgREJfT0sgb24gc3VjY2Vzcy4gIEEgREJfRXJyb3Igb2JqZWN0IG9uIGZhaWx1cmUuCiAgICAgKi8KICAgIGZ1bmN0aW9uIHJvbGxiYWNrKCkKICAgIHsKICAgICAgICBpZiAoJHRoaXMtPnRyYW5zYWN0aW9uX29wY291bnQgPiAwKSB7CiAgICAgICAgICAgIGlmICgkdGhpcy0+X2RiICYmICFAc3liYXNlX3NlbGVjdF9kYigkdGhpcy0+X2RiLCAkdGhpcy0+Y29ubmVjdGlvbikpIHsKICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+c3liYXNlUmFpc2VFcnJvcihEQl9FUlJPUl9OT0RCU0VMRUNURUQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRyZXN1bHQgPSBAc3liYXNlX3F1ZXJ5KCdST0xMQkFDSycsICR0aGlzLT5jb25uZWN0aW9uKTsKICAgICAgICAgICAgJHRoaXMtPnRyYW5zYWN0aW9uX29wY291bnQgPSAwOwogICAgICAgICAgICBpZiAoISRyZXN1bHQpIHsKICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+c3liYXNlUmFpc2VFcnJvcigpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBEQl9PSzsKICAgIH0KCiAgICAvLyB9fX0KICAgIC8vIHt7eyBzeWJhc2VSYWlzZUVycm9yKCkKCiAgICAvKioKICAgICAqIFByb2R1Y2VzIGEgREJfRXJyb3Igb2JqZWN0IHJlZ2FyZGluZyB0aGUgY3VycmVudCBwcm9ibGVtCiAgICAgKgogICAgICogQHBhcmFtIGludCAkZXJybm8gIGlmIHRoZSBlcnJvciBpcyBiZWluZyBtYW51YWxseSByYWlzZWQgcGFzcyBhCiAgICAgKiAgICAgICAgICAgICAgICAgICAgIERCX0VSUk9SKiBjb25zdGFudCBoZXJlLiAgSWYgdGhpcyBpc24ndCBwYXNzZWQKICAgICAqICAgICAgICAgICAgICAgICAgICAgdGhlIGVycm9yIGluZm9ybWF0aW9uIGdhdGhlcmVkIGZyb20gdGhlIERCTVMuCiAgICAgKgogICAgICogQHJldHVybiBvYmplY3QgIHRoZSBEQl9FcnJvciBvYmplY3QKICAgICAqCiAgICAgKiBAc2VlIERCX2NvbW1vbjo6cmFpc2VFcnJvcigpLAogICAgICogICAgICBEQl9zeWJhc2U6OmVycm9yTmF0aXZlKCksIERCX3N5YmFzZTo6ZXJyb3JDb2RlKCkKICAgICAqLwogICAgZnVuY3Rpb24gc3liYXNlUmFpc2VFcnJvcigkZXJybm8gPSBudWxsKQogICAgewogICAgICAgICRuYXRpdmUgPSAkdGhpcy0+ZXJyb3JOYXRpdmUoKTsKICAgICAgICBpZiAoJGVycm5vID09PSBudWxsKSB7CiAgICAgICAgICAgICRlcnJubyA9ICR0aGlzLT5lcnJvckNvZGUoJG5hdGl2ZSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiAkdGhpcy0+cmFpc2VFcnJvcigkZXJybm8sIG51bGwsIG51bGwsIG51bGwsICRuYXRpdmUpOwogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IGVycm9yTmF0aXZlKCkKCiAgICAvKioKICAgICAqIEdldHMgdGhlIERCTVMnIG5hdGl2ZSBlcnJvciBtZXNzYWdlIHByb2R1Y2VkIGJ5IHRoZSBsYXN0IHF1ZXJ5CiAgICAgKgogICAgICogQHJldHVybiBzdHJpbmcgIHRoZSBEQk1TJyBlcnJvciBtZXNzYWdlCiAgICAgKi8KICAgIGZ1bmN0aW9uIGVycm9yTmF0aXZlKCkKICAgIHsKICAgICAgICByZXR1cm4gQHN5YmFzZV9nZXRfbGFzdF9tZXNzYWdlKCk7CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgZXJyb3JDb2RlKCkKCiAgICAvKioKICAgICAqIERldGVybWluZXMgUEVBUjo6REIgZXJyb3IgY29kZSBmcm9tIHRoZSBkYXRhYmFzZSdzIHRleHQgZXJyb3IgbWVzc2FnZS4KICAgICAqCiAgICAgKiBAcGFyYW0gIHN0cmluZyAgJGVycm9ybXNnICBlcnJvciBtZXNzYWdlIHJldHVybmVkIGZyb20gdGhlIGRhdGFiYXNlCiAgICAgKiBAcmV0dXJuIGludGVnZXIgIGFuIGVycm9yIG51bWJlciBmcm9tIGEgREIgZXJyb3IgY29uc3RhbnQKICAgICAqLwogICAgZnVuY3Rpb24gZXJyb3JDb2RlKCRlcnJvcm1zZykKICAgIHsKICAgICAgICBzdGF0aWMgJGVycm9yX3JlZ2V4cHM7CiAgICAgICAgCiAgICAgICAgLy8gUEhQIDUuMisgcHJlcGVuZHMgdGhlIGZ1bmN0aW9uIG5hbWUgdG8gJHBocF9lcnJvcm1zZywgc28gd2UgbmVlZAogICAgICAgIC8vIHRoaXMgaGFjayB0byB3b3JrIGFyb3VuZCBpdCwgcGVyIGJ1ZyAjOTU5OS4KICAgICAgICAkZXJyb3Jtc2cgPSBwcmVnX3JlcGxhY2UoJy9ec3liYXNlW2Etel9dK1woXCk6IC8nLCAnJywgJGVycm9ybXNnKTsKICAgICAgICAKICAgICAgICBpZiAoIWlzc2V0KCRlcnJvcl9yZWdleHBzKSkgewogICAgICAgICAgICAkZXJyb3JfcmVnZXhwcyA9IGFycmF5KAogICAgICAgICAgICAgICAgJy9JbmNvcnJlY3Qgc3ludGF4IG5lYXIvJwogICAgICAgICAgICAgICAgICAgID0+IERCX0VSUk9SX1NZTlRBWCwKICAgICAgICAgICAgICAgICcvXlVuY2xvc2VkIHF1b3RlIGJlZm9yZSB0aGUgY2hhcmFjdGVyIHN0cmluZyBbXCJcJ10uKltcIlwnXVwuLycKICAgICAgICAgICAgICAgICAgICA9PiBEQl9FUlJPUl9TWU5UQVgsCiAgICAgICAgICAgICAgICAnL0ltcGxpY2l0IGNvbnZlcnNpb24gKGZyb20gZGF0YXR5cGV8b2YgTlVNRVJJQyB2YWx1ZSkvaScKICAgICAgICAgICAgICAgICAgICA9PiBEQl9FUlJPUl9JTlZBTElEX05VTUJFUiwKICAgICAgICAgICAgICAgICcvQ2Fubm90IGRyb3AgdGhlIHRhYmxlIFtcIlwnXS4rW1wiXCddLCBiZWNhdXNlIGl0IGRvZXNuXCd0IGV4aXN0IGluIHRoZSBzeXN0ZW0gY2F0YWxvZ3NcLi8nCiAgICAgICAgICAgICAgICAgICAgPT4gREJfRVJST1JfTk9TVUNIVEFCTEUsCiAgICAgICAgICAgICAgICAnL09ubHkgdGhlIG93bmVyIG9mIG9iamVjdCBbXCJcJ10uK1tcIlwnXSBvciBhIHVzZXIgd2l0aCBTeXN0ZW0gQWRtaW5pc3RyYXRvciBcKFNBXCkgcm9sZSBjYW4gcnVuIHRoaXMgY29tbWFuZFwuLycKICAgICAgICAgICAgICAgICAgICA9PiBEQl9FUlJPUl9BQ0NFU1NfVklPTEFUSU9OLAogICAgICAgICAgICAgICAgJy9eLisgcGVybWlzc2lvbiBkZW5pZWQgb24gb2JqZWN0IC4rLCBkYXRhYmFzZSAuKywgb3duZXIgLisvJwogICAgICAgICAgICAgICAgICAgID0+IERCX0VSUk9SX0FDQ0VTU19WSU9MQVRJT04sCiAgICAgICAgICAgICAgICAnL14uKiBwZXJtaXNzaW9uIGRlbmllZCwgZGF0YWJhc2UgLissIG93bmVyIC4rLycKICAgICAgICAgICAgICAgICAgICA9PiBEQl9FUlJPUl9BQ0NFU1NfVklPTEFUSU9OLAogICAgICAgICAgICAgICAgJy9bXi4qXSBub3QgZm91bmRcLi8nCiAgICAgICAgICAgICAgICAgICAgPT4gREJfRVJST1JfTk9TVUNIVEFCTEUsCiAgICAgICAgICAgICAgICAnL1RoZXJlIGlzIGFscmVhZHkgYW4gb2JqZWN0IG5hbWVkLycKICAgICAgICAgICAgICAgICAgICA9PiBEQl9FUlJPUl9BTFJFQURZX0VYSVNUUywKICAgICAgICAgICAgICAgICcvSW52YWxpZCBjb2x1bW4gbmFtZS8nCiAgICAgICAgICAgICAgICAgICAgPT4gREJfRVJST1JfTk9TVUNIRklFTEQsCiAgICAgICAgICAgICAgICAnL2RvZXMgbm90IGFsbG93IG51bGwgdmFsdWVzLycKICAgICAgICAgICAgICAgICAgICA9PiBEQl9FUlJPUl9DT05TVFJBSU5UX05PVF9OVUxMLAogICAgICAgICAgICAgICAgJy9Db21tYW5kIGhhcyBiZWVuIGFib3J0ZWQvJwogICAgICAgICAgICAgICAgICAgID0+IERCX0VSUk9SX0NPTlNUUkFJTlQsCiAgICAgICAgICAgICAgICAnL15DYW5ub3QgZHJvcCB0aGUgaW5kZXggLiogYmVjYXVzZSBpdCBkb2VzblwndCBleGlzdC9pJwogICAgICAgICAgICAgICAgICAgID0+IERCX0VSUk9SX05PVF9GT1VORCwKICAgICAgICAgICAgICAgICcvXlRoZXJlIGlzIGFscmVhZHkgYW4gaW5kZXgvaScKICAgICAgICAgICAgICAgICAgICA9PiBEQl9FUlJPUl9BTFJFQURZX0VYSVNUUywKICAgICAgICAgICAgICAgICcvXlRoZXJlIGFyZSBmZXdlciBjb2x1bW5zIGluIHRoZSBJTlNFUlQgc3RhdGVtZW50IHRoYW4gdmFsdWVzIHNwZWNpZmllZC9pJwogICAgICAgICAgICAgICAgICAgID0+IERCX0VSUk9SX1ZBTFVFX0NPVU5UX09OX1JPVywKICAgICAgICAgICAgICAgICcvRGl2aWRlIGJ5IHplcm8vaScKICAgICAgICAgICAgICAgICAgICA9PiBEQl9FUlJPUl9ESVZaRVJPLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgZm9yZWFjaCAoJGVycm9yX3JlZ2V4cHMgYXMgJHJlZ2V4cCA9PiAkY29kZSkgewogICAgICAgICAgICBpZiAocHJlZ19tYXRjaCgkcmVnZXhwLCAkZXJyb3Jtc2cpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJGNvZGU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIERCX0VSUk9SOwogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IHRhYmxlSW5mbygpCgogICAgLyoqCiAgICAgKiBSZXR1cm5zIGluZm9ybWF0aW9uIGFib3V0IGEgdGFibGUgb3IgYSByZXN1bHQgc2V0CiAgICAgKgogICAgICogTk9URTogb25seSBzdXBwb3J0cyAndGFibGUnIGFuZCAnZmxhZ3MnIGlmIDx2YXI+JHJlc3VsdDwvdmFyPgogICAgICogaXMgYSB0YWJsZSBuYW1lLgogICAgICoKICAgICAqIEBwYXJhbSBvYmplY3R8c3RyaW5nICAkcmVzdWx0ICBEQl9yZXN1bHQgb2JqZWN0IGZyb20gYSBxdWVyeSBvciBhCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBjb250YWluaW5nIHRoZSBuYW1lIG9mIGEgdGFibGUuCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdoaWxlIHRoaXMgYWxzbyBhY2NlcHRzIGEgcXVlcnkgcmVzdWx0CiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlIGlkZW50aWZpZXIsIHRoaXMgYmVoYXZpb3IgaXMKICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwcmVjYXRlZC4KICAgICAqIEBwYXJhbSBpbnQgICAgICAgICAgICAkbW9kZSAgICBhIHZhbGlkIHRhYmxlSW5mbyBtb2RlCiAgICAgKgogICAgICogQHJldHVybiBhcnJheSAgYW4gYXNzb2NpYXRpdmUgYXJyYXkgd2l0aCB0aGUgaW5mb3JtYXRpb24gcmVxdWVzdGVkLgogICAgICogICAgICAgICAgICAgICAgIEEgREJfRXJyb3Igb2JqZWN0IG9uIGZhaWx1cmUuCiAgICAgKgogICAgICogQHNlZSBEQl9jb21tb246OnRhYmxlSW5mbygpCiAgICAgKiBAc2luY2UgTWV0aG9kIGF2YWlsYWJsZSBzaW5jZSBSZWxlYXNlIDEuNi4wCiAgICAgKi8KICAgIGZ1bmN0aW9uIHRhYmxlSW5mbygkcmVzdWx0LCAkbW9kZSA9IG51bGwpCiAgICB7CiAgICAgICAgaWYgKGlzX3N0cmluZygkcmVzdWx0KSkgewogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBQcm9iYWJseSByZWNlaXZlZCBhIHRhYmxlIG5hbWUuCiAgICAgICAgICAgICAqIENyZWF0ZSBhIHJlc3VsdCByZXNvdXJjZSBpZGVudGlmaWVyLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgaWYgKCR0aGlzLT5fZGIgJiYgIUBzeWJhc2Vfc2VsZWN0X2RiKCR0aGlzLT5fZGIsICR0aGlzLT5jb25uZWN0aW9uKSkgewogICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5zeWJhc2VSYWlzZUVycm9yKERCX0VSUk9SX05PREJTRUxFQ1RFRCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJGlkID0gQHN5YmFzZV9xdWVyeSgiU0VMRUNUICogRlJPTSAkcmVzdWx0IFdIRVJFIDE9MCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmNvbm5lY3Rpb24pOwogICAgICAgICAgICAkZ290X3N0cmluZyA9IHRydWU7CiAgICAgICAgfSBlbHNlaWYgKGlzc2V0KCRyZXN1bHQtPnJlc3VsdCkpIHsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogUHJvYmFibHkgcmVjZWl2ZWQgYSByZXN1bHQgb2JqZWN0LgogICAgICAgICAgICAgKiBFeHRyYWN0IHRoZSByZXN1bHQgcmVzb3VyY2UgaWRlbnRpZmllci4KICAgICAgICAgICAgICovCiAgICAgICAgICAgICRpZCA9ICRyZXN1bHQtPnJlc3VsdDsKICAgICAgICAgICAgJGdvdF9zdHJpbmcgPSBmYWxzZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBQcm9iYWJseSByZWNlaXZlZCBhIHJlc3VsdCByZXNvdXJjZSBpZGVudGlmaWVyLgogICAgICAgICAgICAgKiBDb3B5IGl0LgogICAgICAgICAgICAgKiBEZXByZWNhdGVkLiAgSGVyZSBmb3IgY29tcGF0aWJpbGl0eSBvbmx5LgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgJGlkID0gJHJlc3VsdDsKICAgICAgICAgICAgJGdvdF9zdHJpbmcgPSBmYWxzZTsKICAgICAgICB9CgogICAgICAgIGlmICghaXNfcmVzb3VyY2UoJGlkKSkgewogICAgICAgICAgICByZXR1cm4gJHRoaXMtPnN5YmFzZVJhaXNlRXJyb3IoREJfRVJST1JfTkVFRF9NT1JFX0RBVEEpOwogICAgICAgIH0KCiAgICAgICAgaWYgKCR0aGlzLT5vcHRpb25zWydwb3J0YWJpbGl0eSddICYgREJfUE9SVEFCSUxJVFlfTE9XRVJDQVNFKSB7CiAgICAgICAgICAgICRjYXNlX2Z1bmMgPSAnc3RydG9sb3dlcic7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJGNhc2VfZnVuYyA9ICdzdHJ2YWwnOwogICAgICAgIH0KCiAgICAgICAgJGNvdW50ID0gQHN5YmFzZV9udW1fZmllbGRzKCRpZCk7CiAgICAgICAgJHJlcyAgID0gYXJyYXkoKTsKCiAgICAgICAgaWYgKCRtb2RlKSB7CiAgICAgICAgICAgICRyZXNbJ251bV9maWVsZHMnXSA9ICRjb3VudDsKICAgICAgICB9CgogICAgICAgIGZvciAoJGkgPSAwOyAkaSA8ICRjb3VudDsgJGkrKykgewogICAgICAgICAgICAkZiA9IEBzeWJhc2VfZmV0Y2hfZmllbGQoJGlkLCAkaSk7CiAgICAgICAgICAgIC8vIGNvbHVtbl9zb3VyY2UgaXMgb2Z0ZW4gYmxhbmsKICAgICAgICAgICAgJHJlc1skaV0gPSBhcnJheSgKICAgICAgICAgICAgICAgICd0YWJsZScgPT4gJGdvdF9zdHJpbmcKICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAkY2FzZV9mdW5jKCRyZXN1bHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJGNhc2VfZnVuYygkZi0+Y29sdW1uX3NvdXJjZSksCiAgICAgICAgICAgICAgICAnbmFtZScgID0+ICRjYXNlX2Z1bmMoJGYtPm5hbWUpLAogICAgICAgICAgICAgICAgJ3R5cGUnICA9PiAkZi0+dHlwZSwKICAgICAgICAgICAgICAgICdsZW4nICAgPT4gJGYtPm1heF9sZW5ndGgsCiAgICAgICAgICAgICAgICAnZmxhZ3MnID0+ICcnLAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoJHJlc1skaV1bJ3RhYmxlJ10pIHsKICAgICAgICAgICAgICAgICRyZXNbJGldWydmbGFncyddID0gJHRoaXMtPl9zeWJhc2VfZmllbGRfZmxhZ3MoCiAgICAgICAgICAgICAgICAgICAgICAgICRyZXNbJGldWyd0YWJsZSddLCAkcmVzWyRpXVsnbmFtZSddKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoJG1vZGUgJiBEQl9UQUJMRUlORk9fT1JERVIpIHsKICAgICAgICAgICAgICAgICRyZXNbJ29yZGVyJ11bJHJlc1skaV1bJ25hbWUnXV0gPSAkaTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoJG1vZGUgJiBEQl9UQUJMRUlORk9fT1JERVJUQUJMRSkgewogICAgICAgICAgICAgICAgJHJlc1snb3JkZXJ0YWJsZSddWyRyZXNbJGldWyd0YWJsZSddXVskcmVzWyRpXVsnbmFtZSddXSA9ICRpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBmcmVlIHRoZSByZXN1bHQgb25seSBpZiB3ZSB3ZXJlIGNhbGxlZCBvbiBhIHRhYmxlCiAgICAgICAgaWYgKCRnb3Rfc3RyaW5nKSB7CiAgICAgICAgICAgIEBzeWJhc2VfZnJlZV9yZXN1bHQoJGlkKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICRyZXM7CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgX3N5YmFzZV9maWVsZF9mbGFncygpCgogICAgLyoqCiAgICAgKiBHZXQgdGhlIGZsYWdzIGZvciBhIGZpZWxkCiAgICAgKgogICAgICogQ3VycmVudGx5IHN1cHBvcnRzOgogICAgICogICsgPHNhbXA+dW5pcXVlX2tleTwvc2FtcD4gICAgKHVuaXF1ZSBpbmRleCwgdW5pcXVlIGNoZWNrIG9yIHByaW1hcnlfa2V5KQogICAgICogICsgPHNhbXA+bXVsdGlwbGVfa2V5PC9zYW1wPiAgKG11bHRpLWtleSBpbmRleCkKICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICAkdGFibGUgICB0aGUgdGFibGUgbmFtZQogICAgICogQHBhcmFtIHN0cmluZyAgJGNvbHVtbiAgdGhlIGZpZWxkIG5hbWUKICAgICAqCiAgICAgKiBAcmV0dXJuIHN0cmluZyAgc3BhY2UgZGVsaW1pdGVkIHN0cmluZyBvZiBmbGFncy4gIEVtcHR5IHN0cmluZyBpZiBub25lLgogICAgICoKICAgICAqIEBhY2Nlc3MgcHJpdmF0ZQogICAgICovCiAgICBmdW5jdGlvbiBfc3liYXNlX2ZpZWxkX2ZsYWdzKCR0YWJsZSwgJGNvbHVtbikKICAgIHsKICAgICAgICBzdGF0aWMgJHRhYmxlTmFtZSA9IG51bGw7CiAgICAgICAgc3RhdGljICRmbGFncyA9IGFycmF5KCk7CgogICAgICAgIGlmICgkdGFibGUgIT0gJHRhYmxlTmFtZSkgewogICAgICAgICAgICAkZmxhZ3MgPSBhcnJheSgpOwogICAgICAgICAgICAkdGFibGVOYW1lID0gJHRhYmxlOwoKICAgICAgICAgICAgLyogV2UncmUgcnVubmluZyBzcF9oZWxwaW5kZXggZGlyZWN0bHkgYmVjYXVzZSBpdCBkb2Vzbid0IGV4aXN0IGluCiAgICAgICAgICAgICAqIG9sZGVyIHZlcnNpb25zIG9mIEFTRSAtLSB1bmZvcnR1bmF0ZWx5LCB3ZSBjYW4ndCBqdXN0IHVzZQogICAgICAgICAgICAgKiBEQjo6aXNFcnJvcigpIGJlY2F1c2UgdGhlIHVzZXIgbWF5IGJlIHVzaW5nIGNhbGxiYWNrIGVycm9yCiAgICAgICAgICAgICAqIGhhbmRsaW5nLiAqLwogICAgICAgICAgICAkcmVzID0gQHN5YmFzZV9xdWVyeSgic3BfaGVscGluZGV4ICR0YWJsZSIsICR0aGlzLT5jb25uZWN0aW9uKTsKCiAgICAgICAgICAgIGlmICgkcmVzID09PSBmYWxzZSB8fCAkcmVzID09PSB0cnVlKSB7CiAgICAgICAgICAgICAgICAvLyBGYWtlIGEgdmFsaWQgcmVzcG9uc2UgZm9yIEJDIHJlYXNvbnMuCiAgICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHdoaWxlICgoJHZhbCA9IHN5YmFzZV9mZXRjaF9hc3NvYygkcmVzKSkgIT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICBpZiAoIWlzc2V0KCR2YWxbJ2luZGV4X2tleXMnXSkpIHsKICAgICAgICAgICAgICAgICAgICAvKiBObyB1c2VmdWwgaW5mb3JtYXRpb24gcmV0dXJuZWQuIEJyZWFrIGFuZCBiZSBkb25lIHdpdGgKICAgICAgICAgICAgICAgICAgICAgKiBpdCwgd2hpY2ggcHJlc2VydmVzIHRoZSBwcmUtMS43LjkgYmVoYXZpb3VyLiAqLwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRrZXlzID0gZXhwbG9kZSgnLCAnLCB0cmltKCR2YWxbJ2luZGV4X2tleXMnXSkpOwoKICAgICAgICAgICAgICAgIGlmIChzaXplb2YoJGtleXMpID4gMSkgewogICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRrZXlzIGFzICRrZXkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPl9hZGRfZmxhZygkZmxhZ3NbJGtleV0sICdtdWx0aXBsZV9rZXknKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKHN0cnBvcygkdmFsWydpbmRleF9kZXNjcmlwdGlvbiddLCAndW5pcXVlJykpIHsKICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICgka2V5cyBhcyAka2V5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5fYWRkX2ZsYWcoJGZsYWdzWyRrZXldLCAndW5pcXVlX2tleScpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgc3liYXNlX2ZyZWVfcmVzdWx0KCRyZXMpOwoKICAgICAgICB9CgogICAgICAgIGlmIChhcnJheV9rZXlfZXhpc3RzKCRjb2x1bW4sICRmbGFncykpIHsKICAgICAgICAgICAgcmV0dXJuKGltcGxvZGUoJyAnLCAkZmxhZ3NbJGNvbHVtbl0pKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAnJzsKICAgIH0KCiAgICAvLyB9fX0KICAgIC8vIHt7eyBfYWRkX2ZsYWcoKQoKICAgIC8qKgogICAgICogQWRkcyBhIHN0cmluZyB0byB0aGUgZmxhZ3MgYXJyYXkgaWYgdGhlIGZsYWcgaXMgbm90IHlldCBpbiB0aGVyZQogICAgICogLSBpZiB0aGVyZSBpcyBubyBmbGFnIHByZXNlbnQgdGhlIGFycmF5IGlzIGNyZWF0ZWQKICAgICAqCiAgICAgKiBAcGFyYW0gYXJyYXkgICRhcnJheSAgcmVmZXJlbmNlIG9mIGZsYWdzIGFycmF5IHRvIGFkZCBhIHZhbHVlIHRvCiAgICAgKiBAcGFyYW0gbWl4ZWQgICR2YWx1ZSAgdmFsdWUgdG8gYWRkIHRvIHRoZSBmbGFnIGFycmF5CiAgICAgKgogICAgICogQHJldHVybiB2b2lkCiAgICAgKgogICAgICogQGFjY2VzcyBwcml2YXRlCiAgICAgKi8KICAgIGZ1bmN0aW9uIF9hZGRfZmxhZygmJGFycmF5LCAkdmFsdWUpCiAgICB7CiAgICAgICAgaWYgKCFpc19hcnJheSgkYXJyYXkpKSB7CiAgICAgICAgICAgICRhcnJheSA9IGFycmF5KCR2YWx1ZSk7CiAgICAgICAgfSBlbHNlaWYgKCFpbl9hcnJheSgkdmFsdWUsICRhcnJheSkpIHsKICAgICAgICAgICAgYXJyYXlfcHVzaCgkYXJyYXksICR2YWx1ZSk7CiAgICAgICAgfQogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IGdldFNwZWNpYWxRdWVyeSgpCgogICAgLyoqCiAgICAgKiBPYnRhaW5zIHRoZSBxdWVyeSBzdHJpbmcgbmVlZGVkIGZvciBsaXN0aW5nIGEgZ2l2ZW4gdHlwZSBvZiBvYmplY3RzCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkdHlwZSAgdGhlIGtpbmQgb2Ygb2JqZWN0cyB5b3Ugd2FudCB0byByZXRyaWV2ZQogICAgICoKICAgICAqIEByZXR1cm4gc3RyaW5nICB0aGUgU1FMIHF1ZXJ5IHN0cmluZyBvciBudWxsIGlmIHRoZSBkcml2ZXIgZG9lc24ndAogICAgICogICAgICAgICAgICAgICAgICBzdXBwb3J0IHRoZSBvYmplY3QgdHlwZSByZXF1ZXN0ZWQKICAgICAqCiAgICAgKiBAYWNjZXNzIHByb3RlY3RlZAogICAgICogQHNlZSBEQl9jb21tb246OmdldExpc3RPZigpCiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldFNwZWNpYWxRdWVyeSgkdHlwZSkKICAgIHsKICAgICAgICBzd2l0Y2ggKCR0eXBlKSB7CiAgICAgICAgICAgIGNhc2UgJ3RhYmxlcyc6CiAgICAgICAgICAgICAgICByZXR1cm4gIlNFTEVDVCBuYW1lIEZST00gc3lzb2JqZWN0cyBXSEVSRSB0eXBlID0gJ1UnIgogICAgICAgICAgICAgICAgICAgICAgIC4gJyBPUkRFUiBCWSBuYW1lJzsKICAgICAgICAgICAgY2FzZSAndmlld3MnOgogICAgICAgICAgICAgICAgcmV0dXJuICJTRUxFQ1QgbmFtZSBGUk9NIHN5c29iamVjdHMgV0hFUkUgdHlwZSA9ICdWJyI7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICB9CgogICAgLy8gfX19Cgp9CgovKgogKiBMb2NhbCB2YXJpYWJsZXM6CiAqIHRhYi13aWR0aDogNAogKiBjLWJhc2ljLW9mZnNldDogNAogKiBFbmQ6CiAqLwoKPz4K]]></data>
	</file>
	<file>
	  <filename>/lib/pear/doc/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/pear/doc/IDEAS</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[QWJzdHJhY3RlZCBUeXBlcyAoU3RpZykKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCkRCIG5lZWRzIGEgc2V0IG9mIHR5cGVzIHJlcHJlc2VudGluZyB0aGUgbW9zdCBjb21tb25seSB1c2VkIHR5cGVzIGluCmFsbCBiYWNrZW5kcy4gIFRoaXMgdHlwZSBzZXQgY291bGQgYWxzbyBiZSBnZWFyZWQgdG93YXJkcyBpbnRlZ3JhdGlvbgp3aXRoIHRoaW5ncyBsaWtlIFhNTC1SUEMvU09BUCBpbXBsZW1lbnRhdGlvbnMsIEhUTUwgZm9ybSBjbGFzc2VzLCBldGMuCgpSZWFsIFF1ZXJ5IFBhcnNlciAoU3RpZykKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpXaXRoIGEgcmVhbCBxdWVyeSBwYXJzZXIsIERCIGNhbiBpbXBsZW1lbnQgbW9yZSBvZiBpdHMgcG9ydGFiaWxpdHkKYmFzZWQgb24gdGhlIHF1ZXJ5LCBpbnN0ZWFkIG9mIGhhdmluZyBzdXBwb3J0IGZ1bmN0aW9ucyBmb3IKZXZlcnl0aGluZy4gIE9uZSBleGFtcGxlIHdvdWxkIGJlIExJTUlULCBhbm90aGVyICJJTlNFUlQKLi4uIFJFVFVSTklORyIuCgpQb3J0YWJsZSB0cmFuc2FjdGlvbnMgKFN0aWcpCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCklmIERCIGNhbiBwYXJzZSBxdWVyaWVzIGVub3VnaCB0byBkZXRlcm1pbmUgd2hhdCB0YWJsZXMgYXJlIGFmZmVjdGVkCmJ5IHF1ZXJpZXMsIGl0IHNob3VsZCBiZSBwb3NzaWJsZSB0byBtYWtlIGEgcmVwbGF5YWJsZSB0cmFuc2FjdGlvbgpsb2cuICBHTk9NRSB1c2VzIGFuIFhNTCBmb3JtYXQgZm9yIGNvbmZpZ3VyYXRpb24gZGF0YSB0aGF0IGxldHMgeW91CmNoZWNrcG9pbnQgc3RhdGUgb25jZSBpbiBhIHdoaWxlLCBhbmQgcmV2ZXJ0IHRvIHRoYXQgc3RhdGUgbGF0ZXIuCldpdGggYSBzaW1pbGFyIGFwcHJvYWNoIGZvciB0cmFuc2FjdGlvbnMgaW4gREIgd2UgY2FuIGltcGxlbWVudApwb3J0YWJsZSB0cmFuc2FjdGlvbnMgYW5kIGNoZWNrcG9pbnRpbmcgZXZlbiBmb3IgdGhlIGRhdGFiYXNlcyB0aGF0CmRvbid0IHN1cHBvcnQgdGhlbS4KCgpFcnJvciByZXBvcnRpbmcgY2xlYW4tdXAvZGVidWcgKFRvbWFzKQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCk5vdyBlYWNoIGRyaXZlciBoYXMgaXRzIG93biByYWlzZUVycm9yIG1ldGhvZCwgY29tbW9uIGhhcyBhIHJhaXNlRXJyb3IgYW5kCkRCIGhhcyBhIERCX2Vycm9yIGNsYXNzIGFuZCBpdHMgb3duIGlzRXJyb3IoKSBtZXRob2QuIFRoaXMgZXJyb3Igc3R1ZmYgCm92ZXJoZWFkIGNvdWxkIGJlIHNpbXBsaWZpZWQgd2l0aCBvbmx5IG9uZSByYWlzZUVycm9yLCBkcm9waW5nIHRoZSBEQiBFcnJvcgpjbGFzcyBhbmQgYWxzbyB0aGUgREI6OmlzRXJyb3IoKSAodXNlIHRoZSBQRUFSLnBocCBvbmVzIGluc3RlYWQpLgpPdGhlciBpZGVhIGNvdWxkIGJlIHRvIGFkZCBhIHN5c3RlbSBmb3IgYWxsb3dpbmcgcGVvcGxlIGFjY2VzcyB0byBhbGwgdGhlCnF1ZXJpZXMgc2VuZGVkIGJ5IFBFQVIgREIgdG8gdGhlIGJhY2tlbmQuIEFsc28gYSBuZXcgUEVBUl9FUlJPUl9ERUJVRwpmbGFnIHRoYXQgYXV0b21hdGljYWxseSAoc2hvd3x0cmlnZ2VycykgZGVidWcgaW5mbywgcGVyaGFwcwp3aXRoIGEgbmV3IFBFQVJfKFdhcm5pbmd8RGVidWcpIG9iamVjdC4KClF1b3RlIGNsZWFuLXVwIChTdGlnKQotLS0tLS0tLS0tLS0tLS0tLS0tLS0KMS4gS2VlcCBxdW90ZSBhbmQgcXVvdGVTdHJpbmcsIGJ1dCBtb3ZlIHF1b3Rpbmcgb2Ygc3RyaW5ncyBiYWNrIGludG8KICAgcXVvdGVTdHJpbmcgYW5kIG1ha2UgcXVvdGUgY2FsbCBpdCBmb3Igc3RyaW5ncy4KCjIuIEFkZCBhbiBvcHRpb25hbCAib3BlcmF0b3IiIHBhcmFtZXRlciB0byBxdW90ZSB0aGF0IGlzIG9uZSBvZiAiPSIsCiAgICI8IiwgIj4iIG9yICI8PiIgdGhhdCB3aWxsIGJlIGluc2VydGVkIGluIGZyb250IG9mIHRoZSBxdW90ZWQgdmFsdWUKICAgdW5sZXNzIGl0IGlzIE5VTEwsIGluIHdoaWNoIGNhc2UgaXQgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gIklTIiAoZm9yCiAgICI9Iikgb3IgIklTIE5PVCIgKGZvciB0aGUgb3RoZXJzKS4KCkF1dG8gZnJlZSBzdGF0ZW1lbnRzIChUb21hcykKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpCeSBzZXR0aW5nIGEgcGFyYW0gaW4gcXVlcnkoKSBvciBmb3IgdGhlIGhvbGUgREIgaW5zdGFuY2UsIFBFQVIgREIKY291bGQgYXV0by1mcmVlIHJlc3VsdHMgaW4gREJfcmVzdWx0LT5mZXRjaChJbnRvfFJvdykgd2hlbiB0aGUgZHJpdmVyCnJldHVybnMgZmFsc2UuCgpEYXRhdHlwZXMgaW4gcHJlcGFyZSBzeW50YXggKFRvbWFzKQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpFeHRlbmQgdGhlIGFjdHVhbCBwcmVwYXJlL2V4ZWN1dGUgcGxhY2Vob2xkZXJzIHRvIHN1cHBvcnQgZGF0YSB0eXBlcywgYm90aAp0byBjaGVjayB0aGUgZGF0YSBpbnRyb2R1Y2VkIHRvIHRoZSBxdWVyeSBhbmQgdG8gImNhc3QiIHRoZSByZXN1bHQKdG8gbmF0aXZlIHBocCBkYXRhIHR5cGVzLiBFeDoKCiRzcWwgPSAiSU5TRVJUIElOVE8gdGFibGUgVkFMVUVTICh7e2ludCg0KX19LCB7e2Jvb2x9fSwge3tkYXRlKCdZLW0tZCcpfX0pIjsKJHJvdyA9ICRkYi0+cXVlcnkoJHNxbCwgYXJyYXkoOCwgJ3QnLCAnMjAwMS0wNC0xJykpOwoKRm9ybWF0OiB7ezxkYXRhX3R5cGU+KDxwYXJhbTE+LDxwYXJhbTI+KX19CgoicGFyYW0iIGNvdWxkIGJlIHRoZSBtYXggbGVuZ2h0IG9mIHRoZSBkYXRhLCBkYXRlIGZvcm1hdHMsIG5vdF9udWxsCmNoZWNrcyBvciBkZWZhdWx0IHZhbHVlcy4KCk90aGVyIGlkZWFzIGNvdWxkIGJlOgoKMSkKJHNxbCA9ICJJTlNFUlQgSU5UTyB0YWJsZSBWQUxVRVMgKD8sID8sID8pIjsKJHN0aCA9ICRkYi0+cHJlcGFyZSgkc3FsLCBhcnJheSgnaW50KDQpJywgJ2Jvb2wnLCAnZGF0ZScpOwokcmVzID0gJGRiLT5leGVjdXRlKCRzdGgsIGFycmF5KCRhLCAkYiwgJGMpOwoKMikKJHNxbCA9ICJJTlNFUlQgSU5UTyB0YWJsZSBWQUxVRVMgKD8sID8sID8pIjsKJHBhcmFtcyA9IGFycmF5KAoJMCA9PiBhcnJheSgkYSwgJ2ludCg0KScpLAoJMSA9PiBhcnJheSgkYiwgJ2Jvb2wnKQopOwokcmVzID0gJGRiLT5xdWVyeSgkc3FsLCAkcGFyYW1zKTsKCkF1dG8gY29ubmVjdCBmZWF0dXJlIChUb21hcykKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpBZGQgdGhlIGFiaWxpdHkgdG8gY3JlYXRlIGZvciBleGFtcGxlIGEgbGlnaHQgYW5kIGR1bXAgREIgb2JqZWN0IHdoaWNoCndpbGwgb25seSBzZXQgdXAgdGhlIGNvbm5lY3Rpb24gd2hlbiBuZWVkZWQuIFdpdGggdGhhdCBwZW9wbGUgY291bGQKY3JlYXRlIHRoZSBEQiBvYmplY3QgaW4gYSBjb21tb24gcHJlcGVuZCBvciBkZWZhdWx0IGZpbGUgd2l0aG91dCB0aGUKbmVlZCB0byB3YXN0ZSBzeXN0ZW0gcmVzb3VyY2VzIGlmIHRoZSB1c2Ugb2YgdGhlIGRhdGFiYXNlIGlzIGZpbmFsbHkKbm90IG5lZWRlZC4K]]></data>
	</file>
	<file>
	  <filename>/lib/pear/doc/MAINTAINERS</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[TWFpbnRhaW5lcnMgZm9yIERCIGRhdGFiYXNlIGJhY2tlbmRzL2RyaXZlcnM6CgpkYmFzZSAgIDogRGFuaWVsIENvbnZpc3NvciA8ZGFuaWVsY0BwaHAubmV0PgpmYnNxbCAgIDogRGFuaWVsIENvbnZpc3NvciA8ZGFuaWVsY0BwaHAubmV0PgogICAgICAgICAgRnJhbmsgTS4gS3JvbWFubiA8ZnJhbmtAa3JvbWFubi5pbmZvPgppYmFzZSAgIDogRGFuaWVsIENvbnZpc3NvciA8ZGFuaWVsY0BwaHAubmV0PgppZnggICAgIDogRGFuaWVsIENvbnZpc3NvciA8ZGFuaWVsY0BwaHAubmV0Pgptc3FsICAgIDogRGFuaWVsIENvbnZpc3NvciA8ZGFuaWVsY0BwaHAubmV0Pgptc3NxbCAgIDogRGFuaWVsIENvbnZpc3NvciA8ZGFuaWVsY0BwaHAubmV0PgpteXNxbCAgIDogRGFuaWVsIENvbnZpc3NvciA8ZGFuaWVsY0BwaHAubmV0PgpteXNxbGkgIDogRGFuaWVsIENvbnZpc3NvciA8ZGFuaWVsY0BwaHAubmV0PgpvY2k4ICAgIDogRGFuaWVsIENvbnZpc3NvciA8ZGFuaWVsY0BwaHAubmV0PgpvZGJjICAgIDogRGFuaWVsIENvbnZpc3NvciA8ZGFuaWVsY0BwaHAubmV0PgpwZ3NxbCAgIDogRGFuaWVsIENvbnZpc3NvciA8ZGFuaWVsY0BwaHAubmV0PgpzcWxpdGUgIDogRGFuaWVsIENvbnZpc3NvciA8ZGFuaWVsY0BwaHAubmV0PgpzeWJhc2UgIDogRGFuaWVsIENvbnZpc3NvciA8ZGFuaWVsY0BwaHAubmV0Pgo=]]></data>
	</file>
	<file>
	  <filename>/lib/pear/doc/STATUS</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[U1RBVFVTIE9GIFRIRSBQRUFSIERCIFBBQ0tBR0UKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiRJZDogU1RBVFVTLHYgMS4zMyAyMDA1LzAyLzIyIDE1OjQ1OjM2IGRhbmllbGMgRXhwICQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpEQiBEcml2ZXIgRmVhdHVyZSBNYXRyaXgKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClN5bWJvbHM6CiAgeCAgPSAgaW1wbGVtZW50ZWQsIGJ1dCB3aXRob3V0IHRlc3RzCiAgdCAgPSAgaW1wbGVtZW50ZWQsIGJ1dCBvbmUgb3IgbW9yZSB0ZXN0cyBmYWlsCiAgVCAgPSAgaW1wbGVtZW50ZWQsIHBhc3NpbmcgYWxsIHRlc3RzCiAgZSAgPSAgZW11bGF0ZWQsIHdpdGhvdXQgdGVzdHMKICBsICA9ICBlbXVsYXRlZCwgYnV0IG9uZSBvciBtb3JlIHRlc3RzIGZhaWwKICBFICA9ICBlbXVsYXRlZCwgcGFzc2luZyBhbGwgdGVzdHMKICBuICA9ICByZXR1cm5zICJub3QgY2FwYWJsZSIKICAtICA9ICBubyBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGZlYXR1cmUgb3Igc3RhdHVzIHVua25vd24KCiAgICAgICAgICAgICAgICAgICAgZmJzcWwgICAgICBpZnggICAgICBtc3NxbCAgICAgbXlzcWxpICAgICBvZGJjICAgICBzcWxpdGUKRkVBVFVSRSAgICAgICAgZGJhc2UgIHwgIGliYXNlICB8ICBtc3FsICAgfCAgbXlzcWwgIHwgICBvY2k4ICB8ICBwZ3NxbCAgfCAgc3liYXNlCnNpbXBsZVF1ZXJ5ICAgICAgLSAgICBUICAgIFQgICAgVCAgICBUICAgIFQgICAgVCAgICBUICAgIFQgICAgVCAgICBUICAgIFQgICAgVApudW1Db2xzICAgICAgICAgIHggICAgVCAgICBUICAgIFQgICAgVCAgICBUICAgIFQgICAgVCAgICBUICAgIFQgICAgVCAgICBUICAgIFQKbnVtUm93cyAgICAgICAgICB4ICAgIFQgICAgRSAgICBFICAgIFQgICAgVCAgICBUICAgIFQgICAgRSAgICBUICAgIFQgICAgVCAgICBUCmVycm9yTmF0aXZlICAgICAgbiAgICBUICAgIFQgICAgVCAgICBUICAgIFQgICAgVCAgICBUICAgIFQgICAgVCAgICBUICAgIEUgICAgVApwcmVwYXJlL2V4ZWN1dGUgIGUgICAgRSAgICBUICAgIEUgICAgRSAgICBFICAgIEUgICAgRSAgICBUICAgIEUgICAgRSAgICBFICAgIEUKc2VxdWVuY2VzICAgICAgICBuICAgIFQgICAgVCAgICBuICAgIFQgICAgVCAgICBUICAgIFQgICAgVCAgICBFICAgIFQgICAgRSAgICBUCmFmZmVjdGVkUm93cyAgICAgbiAgICBUICAgIEUgICAgRSAgICBUICAgIFQgICAgVCAgICBUICAgIFQgICAgVCAgICBFICAgIFQgICAgVApmZXRjaCBtb2RlcyAgICAgIHggICAgVCAgICBUICAgIFQgICAgVCAgICBUICAgIFQgICAgVCAgICBUICAgIFQgICAgVCAgICBUICAgIFQKZmV0Y2ggcm93IGJ5IG5vICB4ICAgIHggICAgbiAgICBuICAgIHggICAgeCAgICB4ICAgIHggICAgbiAgICB4ICAgIHggICAgeCAgICB4CnRyYW5zYWN0aW9ucyAgICAgLSAgICBUICAgIFQgICAgVCAgICBuICAgIFQgICAgVCAgICBUICAgIFQgICAgVCAgICBUICAgIG4gICAgVAphdXRvLWNvbW1pdCAgICAgIG4gICAgVCAgICBFICAgIEUgICAgbiAgICBFICAgIEUgICAgRSAgICBFICAgIFQgICAgRSAgICBuICAgIEUKZXJyb3IgbWFwcGluZyAgICAtICAgIFQgICAgVCAgICBUICAgIFQgICAgVCAgICBUICAgIFQgICAgVCAgICBUICAgIFQgICAgVCAgICBUCnRhYmxlSW5mbyAgICAgICAgeCAgICBUICAgIFQgICAgdCAgICBUICAgIFQgICAgVCAgICBUICAgIFQgICAgVCAgICBUICAgIFQgICAgVAoKZ2V0TGlzdE9mKCkgVFlQRVMKdGFibGVzICAgICAgICAgICAtICAgIFQgICAgVCAgICBUICAgIFQgICAgVCAgICBUICAgIFQgICAgVCAgICBUICAgIFQgICAgVCAgICBUCnZpZXdzICAgICAgICAgICAgLSAgICBUICAgIFQgICAgLSAgICAtICAgIFQgICAgLSAgICAtICAgIC0gICAgVCAgICBUICAgIC0gICAgVAp1c2VycyAgICAgICAgICAgIC0gICAgVCAgICBUICAgIC0gICAgLSAgICAtICAgIFQgICAgVCAgICAtICAgIC0gICAgVCAgICAtICAgIC0KZGF0YWJhc2VzICAgICAgICAtICAgIC0gICAgLSAgICAtICAgIFQgICAgLSAgICBUICAgIFQgICAgLSAgICBUICAgIFQgICAgLSAgICAtCmZ1bmN0aW9ucyAgICAgICAgLSAgICBUICAgIC0gICAgLSAgICAtICAgIC0gICAgLSAgICAtICAgIC0gICAgLSAgICBUICAgIC0gICAgLQpzeW5vbnltcyAgICAgICAgIC0gICAgLSAgICAtICAgIC0gICAgLSAgICAtICAgIC0gICAgLSAgICBUICAgIC0gICAgLSAgICAtICAgIC0KCgpUZXN0IENvbmZvcm1hbmNlCi0tLS0tLS0tLS0tLS0tLS0KU3ltYm9sczoKICAgIG8gID0gIFRlc3QgcGFzc2VkCiAgICBYICA9ICBUZXN0IGZhaWxlZAogICAgTCAgPSAgU29tZSBwb3J0aW9ucyBvZiB0aGUgdGVzdCBmYWlsZWQgZHVlIHRvIGxpbWl0YXRpb25zIGluIFBIUCBvciBEQk1TCiAgICBuICA9ICBUZXN0IHJldHVybnMgIm5vdCBjYXBhYmxlIgogICAgLSAgPSAgTm90IHRlc3RlZAoKICAgICAgICAgICAgICAgICAgICBmYnNxbCAgICAgIGlmeCAgICAgIG1zc3FsICAgICBteXNxbGkgICAgIG9kYmMgICAgIHNxbGl0ZQogICAgICAgICAgICAgICBkYmFzZSAgfCAgaWJhc2UgIHwgIG1zcWwgICB8ICBteXNxbCAgfCAgIG9jaTggIHwgIHBnc3FsICB8ICBzeWJhc2UKMDFjb25uZWN0ICAgICAgICBvICAgIG8gICAgbyAgICBvICAgIG8gICAgbyAgICBvICAgIG8gICAgbyAgICBvICAgIG8gICAgbyAgICBvCjAyZmV0Y2ggICAgICAgICAgLSAgICBvICAgIG8gICAgbyAgICBvICAgIG8gICAgbyAgICBvICAgIG8gICAgbyAgICBvICAgIG8gICAgbwowM3NpbXBsZXF1ZXJ5ICAgIC0gICAgbyAgICBvICAgIG8gICAgbyAgICBvICAgIG8gICAgbyAgICBvICAgIG8gICAgbyAgICBvICAgIG8KMDRudW1jb2xzICAgICAgICAtICAgIG8gICAgbyAgICBvICAgIG8gICAgbyAgICBvICAgIG8gICAgbyAgICBvICAgIG8gICAgbyAgICBvCjA1c2VxdWVuY2VzICAgICAgLSAgICBvICAgIG8gICAgbyAgICBvICAgIG8gICAgbyAgICBvICAgIG8gICAgbyAgICBvICAgIG8gICAgbwowNnByZXBleGVjICAgICAgIC0gICAgbyAgICBvICAgIG8gICAgTCAgICBvICAgIG8gICAgbyAgICBvICAgIG8gICAgbyAgICBvICAgIG8KMDhhZmZlY3RlZHJvd3MgICAtICAgIG8gICAgbyAgICBvICAgIG8gICAgbyAgICBvICAgIG8gICAgbyAgICBvICAgIG8gICAgbyAgICBvCjA5bnVtcm93cyAgICAgICAgLSAgICBvICAgIG8gICAgbyAgICBvICAgIG8gICAgbyAgICBvICAgIG8gICAgbyAgICBvICAgIG8gICAgbwoxMGVycm9ybWFwICAgICAgIC0gICAgbyAgICBvICAgIG8gICAgbyAgICBvICAgIG8gICAgbyAgICBvICAgIG8gICAgbyAgICBvICAgIG8KMTF0cmFuc2FjdGlvbnMgICAtICAgIG8gICAgbyAgICBvICAgIG4gICAgbyAgICBvICAgIG8gICAgbyAgICBvICAgIG8gICAgbiAgICBvCjEzbGltaXQgICAgICAgICAgLSAgICBvICAgIG8gICAgbyAgICBvICAgIG8gICAgbyAgICBvICAgIG8gICAgbyAgICBvICAgIG8gICAgbwoxNGZldGNobW9kZV9vYmplIC0gICAgbyAgICBvICAgIG8gICAgbyAgICBvICAgIG8gICAgbyAgICBvICAgIG8gICAgbyAgICBvICAgIG8KMTVxdW90ZSAgICAgICAgICAtICAgIG8gICAgbyAgICBvICAgIG8gICAgbyAgICBvICAgIG8gICAgbyAgICBvICAgIG8gICAgbyAgICBvCjE2dGFibGVpbmZvICAgICAgLSAgICBvICAgIG8gICAgTCAgICBvICAgIG8gICAgbyAgICBvICAgIG8gICAgbyAgICBvICAgIG8gICAgbwoxN3F1ZXJ5ICAgICAgICAgIC0gICAgbyAgICBvICAgIG8gICAgbyAgICBvICAgIG8gICAgbyAgICBvICAgIG8gICAgbyAgICBvICAgIG8KMThnZXQgICAgICAgICAgICAtICAgIG8gICAgbyAgICBvICAgIG8gICAgbyAgICBvICAgIG8gICAgbyAgICBvICAgIG8gICAgbyAgICBvCjE5Z2V0bGlzdG9mICAgICAgLSAgICBvICAgIG8gICAgbyAgICBvICAgIG8gICAgbyAgICBvICAgIG8gICAgbyAgICBvICAgIG8gICAgbwoKCkRCTVMgVmVyc2lvbnMgVGVzdGVkCi0tLS0tLS0tLS0tLS0tLS0tLS0tCmRiYXNlICAgbi9hCmZic3FsICAgNC4xLjYKaWJhc2UgICBGaXJlYmlyZCAxLjUuMSAgKFBIUCA1IG9ubHkpCmlmeCAgICAgNy4yIFN0YW5kYXJkIEVkdGl0aW9uCm1zcWwgICAgMy42ICAoUEhQIHNuYXBzaG90cyBkYXRlZCAyMDA1LTAyLTE4KQptc3NxbCAgIDguMC43NjAKbXlzcWwgICA0LjAuMjEKbXlzcWxpICA0LjEuNSAgKFBIUCA1IG9ubHkpCm9jaTggICAgOS4yCm9kYmMgICAgREIyIEVTRSA4LjEgYW5kIE1TIEFjY2VzcyAyMDAwCnBnc3FsICAgNy40LjEgYW5kIDguMC4xCnNxbGl0ZSAgUEhQIDU6IGV4dGVuc2lvbi4gIFBIUCA0OiBQRUNMIHNuYXBzaG90LgpzeWJhc2UgIEFTRSAxMi41LjMKClRlc3RzIHdlcmUgcGVyZm9ybWVkIHVuZGVyIGJvdGggb2YgdGhlIGZvbGxvd2luZyBQSFAgdmVyc2lvbnMKdW5sZXMgb3RoZXJ3aXNlIG5vdGVkOgogICAgNC4zLjExLWRldiBkYXRlZCAyMDA1LTAyLTIyCiAgICA1LjEuMC1kZXYgZGF0ZWQgMjAwNS0wMi0yMgo=]]></data>
	</file>
	<file>
	  <filename>/lib/pear/doc/TESTERS</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PT09PT09PT09PT09PT09PT09PQpIT1cgVE8gVEVTVCBQRUFSIERCCj09PT09PT09PT09PT09PT09PT0KCiRJZDogVEVTVEVSUyx2IDEuMjAgMjAwNS8wMi8xNiAwNjozMzoxMiBkYW5pZWxjIEV4cCAkCgoKSU5UUk9EVUNUSU9OCj09PT09PT09PT09PQoKVGhlc2UgYXJlIGluc3RydWN0aW9ucyBmb3IgdGVzdGluZyBQRUFSIERCIG9uIGEgV2luZG93cyBtYWNoaW5lIHVzaW5nIGEKQ3lnd2luIEJhc2ggc2hlbGwuICBBZGp1c3QgdGhlIHBhdGhzIGFuZCBjb21tYW5kcyB0byBtYXRjaCB5b3VyIHN5c3RlbS4KVGhpcyBjb25maWd1cmF0aW9uIGlzIHVzZWQgYmVjYXVzZSB0aGVzZSBwcmVjaXNlIHN0ZXBzIGFyZSBrbm93biB0byB3b3JrLgoKTk9URTogIFlvdSBtdXN0IGxvZyBvbiBhcyBhIHVzZXIgd2hpY2ggaGFzIHBlcm1pc3Npb25zIHRvIG1vZGlmeSB0aGUKY29udGVudHMgb2YgeW91ciBQSFAgZXhlY3V0YWJsZSdzIGRpcmVjdG9yeS4gIFRoaXMgaXMgbmVjZXNzYXJ5IGZvciBib3RoCmNvbmZpZ3VyaW5nIEFORCBydW5uaW5nIHRoZSB0ZXN0IHN5c3RlbS4KCgpJTlNUQUxMQVRJT04KPT09PT09PT09PT09CgpPYnRhaW4gUEhQJ3MgVGVzdCBGcmFtZXdvcmsKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCklmIHlvdSBkb24ndCBoYXZlIFBIUCdzIHRlc3QgZnJhbWV3b3JrLCB5b3UgbmVlZCB0byBvYnRhaW4gaXQuICBUaGVzZQpzdGVwcyBpbmNsdWRlIGNoYW5naW5nIHRoZSB3b3JraW5nIGRpcmVjdG9yeSwgZG93bmxvYWRpbmcgcnVuLXRlc3RzLnBocAp2aWEgQ1ZTIGFuZCBjb3B5aW5nIHRoZSBmaWxlIGludG8gcGxhY2UuICBDaGFuZ2UgdGhlIHJldmlzaW9uIGZsYWcgaW4gdGhlCkNWUyBjb21tYW5kIGFzIGFwcHJvcHJpYXRlIGZvciB5b3VyIHByZXNlbnQgdmVyc2lvbiBvZiBQSFAuCgogY2QgYzovcHJvZ3JhfjEvcGhwCiBjdnMgLWQgOnBzZXJ2ZXI6Y3ZzcmVhZEBjdnMucGhwLm5ldDovcmVwb3NpdG9yeSBsb2dpbiAgICMgcGFzc3dvcmQgaXMgcGhwZmkKIGN2cyAtZCA6cHNlcnZlcjpjdnNyZWFkQGN2cy5waHAubmV0Oi9yZXBvc2l0b3J5IGNvIC1yIFBIUF80XzMgXAogICAgIC1kIHRlc3QgcGhwLXNyYy9ydW4tdGVzdHMucGhwCiBjcCB0ZXN0L3J1bi10ZXN0cy5waHAgLgogcm0gLXJmIHRlc3QKCgpPYnRhaW4gREIgYW5kIGl0cyBUZXN0IEZyYW1ld29yawotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoqIElGIFBFQVIgREIgSVMgQUxSRUFEWSBJTlNUQUxMRUQ6CgogIElmIHlvdSBoYXZlIFBFQVIgREIgaW5zdGFsbGVkIGFscmVhZHksIGdvb2QuICBUaGUgdGVzdCBzdWl0ZQogIGlzIGluIHBsYWNlLiAgT3BlbiB1cCBhIGNvbW1hbmQvc2hlbGwgcHJvbXB0IGFuZCBtb3ZlIGludG8KICB0aGUgdGVzdCBkaXJlY3RvcnkuCgogICBjZCA8cGF0aCB0byBwZWFyIGluc2FsbD4vdGVzdHMvREIvdGVzdHMKCiogVklBIEEgTkVXIElOU1RBTExBVElPTiBVU0lORyBUSEUgUEVBUiBJTlNUQUxMRVI6CgogIEluc3RhbGxpbmcgUEVBUiBoYXMgZ290dGVuIGZhaXJseSBlYXN5LiAgRm9sbG93IHRoZSBpbnN0cnVjdGlvbnMKICBmcm9tIHRoZSBtYW51YWw6ICBodHRwOi8vcGVhci5waHAubmV0L21hbnVhbC9lbi9pbnN0YWxsYXRpb24ucGhwCiAgT25jZSBQRUFSIGFuZCBEQiBhcmUgaW5zdGFsbGVkLCBtb3ZlIHRvIHRoZSB0ZXN0IGRpcmVjdG9yeS4KCiAgIGNkIHBlYXIvdGVzdHMvREIvdGVzdHMKCiogVklBIENWUzoKCiAgQ3JlYXRlIGEgbG9jYXRpb24gdG8gc3RvcmUgdGhlIHRlc3QgaW5zdGFsbGF0aW9uIG9mIERCIGFuZCBpdHMKICB0ZXN0IHNjcmlwdHMuCgogICBta2RpciBkOi9wZWFydGVzdAogICBjZCBkOi9wZWFydGVzdAogICBjdnMgLWQgOnBzZXJ2ZXI6Y3ZzcmVhZEBjdnMucGhwLm5ldDovcmVwb3NpdG9yeSBjbyAtUCBwZWFyL0RCCgogIFdlIGFzc3VtZSB5b3UgYWxyZWFkeSBoYXZlIHRoZSBQRUFSIGJhc2UgcGFja2FnZSBpbnN0YWxsZWQuICBJZgogIHlvdSBkb24ndCwgeW91IHdpbGwgbmVlZCB0byBkbyBzbywgYnV0IHRoZSBpbnN0cnVjdGlvbnMgZm9yCiAgZG9pbmcgdGhhdCBhcmUgYmV5b25kIHRoZSBzY29wZSBvZiB0aGlzIGRvY3VtZW50LiAgU2VlCiAgaHR0cDovL3BlYXIucGhwLm5ldC9tYW51YWwvZW4vaW5zdGFsbGF0aW9uLnBocCBmb3IgbW9yZSBpbmZvLgoKICBNb3ZlIHRvIHRoZSB0ZXN0IGRpcmVjdG9yeS4KCiAgIGNkIHBlYXIvREIvdGVzdHMKCgpDb3B5IHRoZSBTdGFydGVyIFNoZWxsIFNjcmlwdCBhbmQgRWRpdCB0aGUgUGF0aHMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClRvIG1ha2Ugc3RhcnRpbmcgdXAgZWFjaCB0ZXN0IHJ1biBlYXNpZXIsIHdlIGhhdmUgaW5jbHVkZWQgdHdvIHNoZWxsCnNjcmlwdHMuICBUaGUgb3JpZ2luYWwgZmlsZXMgYXJlIG5hbWVkICJydW4uY3ZzIi4gIFRoZXkgbmVlZCB0byBiZQpyZW5hbWVkIHRvICJydW4iIHNvIENWUyB3b24ndCBib3RoZXIgeW91IHdpdGggdHJhY2tpbmcgdGhlbS4gIFRoZW4sCnRoZSBwYXRocyBhbmQgZmlsZSBuYW1lcyBpbiB0aGVtIG5lZWQgdG8gYmUgc2V0IHRvIHRob3NlIHVzZWQgYnkKeW91ciBzeXN0ZW0uCgogY3AgcnVuLmN2cyBydW4KIGNobW9kIDc1NSBydW4KIHZpIHJ1bgoKIGNkIGRyaXZlcgogY3AgcnVuLmN2cyBydW4KIGNobW9kIDc1NSBydW4KIHZpIHJ1bgoKCkNvcHkgdGhlIFNldHVwIEZpbGUgYW5kIEVkaXQgdGhlIERTTidzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClRoZSB0ZXN0IHN1aXRlIGNvbnRhaW5zIGEgZmlsZSB0aGF0IHN0b3JlcyB0aGUgRFNOJ3MgbmVlZGVkIHRvCmNvbm5lY3QgdG8geW91ciBkYXRhYmFzZS4gIFRoZSBvcmlnaW5hbCBmaWxlIGlzICJzZXR1cC5pbmMuY3ZzIgphbmQgaXQgbmVlZHMgdG8gYmUgcmVuYW1lZCAic2V0dXAuaW5jIiBzbyBDVlMgd29uJ3QgdHJhY2sgaXQuClRoZW4geW91J2xsIG5lZWQgdG8gZWRpdCB0aGUgRFNOJ3MgaW4gaXQuCgogY3Agc2V0dXAuaW5jLmN2cyBzZXR1cC5pbmMKIHZpIHNldHVwLmluYwoKClJVTiBUSEUgVEVTVFMKPT09PT09PT09PT09PQoKVG8gcnVuIGFsbCB0ZXN0czogIC4vcnVuClRvIHJ1biBvbmUgdGVzdDogICAuL3J1biA8dGVzdCBmaWxlIG5hbWU+CkV4YW1wbGU6ICAgICAgICAgICAuL3J1biBkYl9wYXJzZWRzbi5waHB0CgoKVGVzdCBUeXBlcyBhbmQgTG9jYXRpb25zCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQp0ZXN0cyAgICAgICAgICAgICBDb21tb24gUEVBUiBEQiB0ZXN0cwp0ZXN0cy9kcml2ZXIgICAgICBDb21tb24gdGVzdHMgZm9yIGFsbCB0aGUgZHJpdmVycwoKClJlc3VsdHMgYW5kIFdoYXQgVG8gRG8gV2l0aCBUaGVtCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkVhY2ggdGVzdCB0aGF0IGZhaWxzIGdlbmVyYXRlcyBhIC5waHAgKHdoaWNoIHlvdSBjYW4gZXhlY3V0ZSksIGEgLmV4cAoodGhlIGV4cGVjdGVkIG91dHB1dCksIGEgLm91dCAodGhlIHRlc3Qgb3V0cHV0KSBhbmQgYSAuZGlmZiAoYSBkaWZmIC11CmZyb20gdGhlIC5leHAgYW5kIC5vdXQgZmlsZXMpLgoKSWYgeW91IHJ1biB0aGUgdGVzdHMsIHBsZWFzZSByZXBvcnQgb3IgZmlsbCB0aGUgVEVTVCBDT05GT1JNQU5DRSB0YWJsZQppbiB0aGUgU1RBVFVTIGRvY3VtZW50LiAgQmVmb3JlIGFueSBjb21taXQgdG8gQ1ZTIGJlIHN1cmUgdG8gcnVuIHRoZQp0ZXN0cyBhbmQgbm90aGluZyBnb3QgYnJva2VuIHdpdGggdGhlIGNoYW5nZS4KCklmIHlvdSBnZXQgdGhlIG1lc3NhZ2UgIlNLSVAiLCBtZWFucyB0aGF0IHRoZSB0ZXN0IGl0J3Mgbm90IGV4ZWN1dGVkLgpMb29rIGF0IHRoZSBEQi90ZXN0cy9kcml2ZXIvc2tpcGlmLmluYyB0byBzZWUgd2hhdCdzIHRoZSBwcm9ibGVtCihwcm9iYWJseSBhIGNvbm5lY3Rpb24gcHJvYmxlbSkuCgoKREIgVEVTVEVSIE1BVFJJWAo9PT09PT09PT09PT09PT09CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmJzcWwgICAgaWZ4ICAgIG1zc3FsICAgbXlzcWxpICAgb2RiYyAgIHNxbGl0ZQpURVNURVIgICAgICAgICAgICAgICAgICAgICAgZGJhc2UgfCBpYmFzZSB8ICBtc3FsIHwgbXlzcWwgfCAgb2NpOCB8IHBnc3FsIHwgc3liYXNlCkpvaG4gSG9ydG9uICAgICAgICAgICAgICAgICAgIC0gICAtICAgLSAgIFggICAtICAgLSAgIC0gICAtICAgLSAgIC0gICAtICAgLSAgIC0KVGltIFppY2t1cyAgICAgICAgICAgICAgICAgICAgLSAgIC0gICAtICAgLSAgIC0gICAtICAgLSAgIC0gICBYICAgLSAgIC0gICAtICAgLQpUaW0gUGFya2luICAgICAgICAgICAgICAgICAgICAtICAgLSAgIC0gICAtICAgLSAgIC0gICAtICAgLSAgIFggICAtICAgLSAgIC0gICAtClBhdWwgR2FyZGluZXIgICAgICAgICAgICAgICAgIC0gICAtICAgLSAgIFggICAtICAgLSAgIC0gICAtICAgLSAgIC0gICAtICAgLSAgIC0KcGV0ZXJ3YkBpYWZyaWNhLmNvbSAgICAgICAgICAgLSAgIC0gICAtICAgWCAgIC0gICAtICAgLSAgIC0gICAtICAgLSAgIC0gICAtICAgLQpEYW5pZWwsIEFkYW0gICAgICAgICAgICAgICAgICAtICAgLSAgIC0gICAtICAgLSAgIC0gICAtICAgLSAgIFggICAtICAgLSAgIC0gICAtCnN6aWlAc3ppaXNvZnQuY29tICAgICAgICAgICAgIC0gICAtICAgLSAgIC0gICAtICAgLSAgIC0gICAtICAgLSAgIFi5ICAtICAgLSAgIC0Kam1oM0BsaW51eGZyZWFrLmNvbSAgICAgICAgICAgLSAgIC0gICAtICAgLSAgIC0gICAtICAgLSAgIC0gICAtICAgLSAgIFggICAtICAgLQpLZXZpbiBIZW5yaWtzb24gICAgICAgICAgICAgICAtICAgLSAgIC0gICAtICAgLSAgIC0gICAtICAgLSAgIFggICAtICAgLSAgIC0gICAtClN0aWcgQmFra2VuICAgICAgICAgICAgICAgICAgIC0gICAtICAgLSAgIC0gICAtICAgLSAgIFggICAtICAgLSAgIC0gICBYICAgLSAgIC0KQ2h1Y2sgSGFnZW5idWNoICAgICAgICAgICAgICAgLSAgIC0gICAtICAgLSAgIC0gICBYICAgLSAgIC0gICAtICAgLSAgIC0gICAtICAgLQpMdWRvdmljbyBNYWdub2NhdmFsbG8gICAgICAgICAtICAgLSAgIFggICAtICAgLSAgIC0gICAtICAgLSAgIC0gICAtICAgLSAgIC0gICAtCkRhbmllbCBDb252aXNzb3IgICAgICAgICAgICAgIFggICBYICAgWCAgIC0gICBYICAgWCAgIFggICBYICAgWCAgIFiyICBYICAgWCAgIFgKCk1JU1NJTkcgVEVTVEVSUyAgICAgICAgICAgICAgIC0gICAtICAgLSAgIC0gICAtICAgLSAgIC0gICAtICAgLSAgIC0gICAtICAgLSAgIC0KCkNvbW1lbnRzOgoKWzFdOiBPREJDIHVzaW5nIElCTSBEQjIKWzJdOiBPREJDIHVzaW5nIElCTSBEQjIgYW5kIE1TIEFjY2Vzcwo=]]></data>
	</file>
	<file>
	  <filename>/lib/pear/PEAR.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFBFQVIsIHRoZSBQSFAgRXh0ZW5zaW9uIGFuZCBBcHBsaWNhdGlvbiBSZXBvc2l0b3J5CiAqCiAqIFBFQVIgY2xhc3MgYW5kIFBFQVJfRXJyb3IgY2xhc3MKICoKICogUEhQIHZlcnNpb25zIDQgYW5kIDUKICoKICogTElDRU5TRTogVGhpcyBzb3VyY2UgZmlsZSBpcyBzdWJqZWN0IHRvIHZlcnNpb24gMy4wIG9mIHRoZSBQSFAgbGljZW5zZQogKiB0aGF0IGlzIGF2YWlsYWJsZSB0aHJvdWdoIHRoZSB3b3JsZC13aWRlLXdlYiBhdCB0aGUgZm9sbG93aW5nIFVSSToKICogaHR0cDovL3d3dy5waHAubmV0L2xpY2Vuc2UvM18wLnR4dC4gIElmIHlvdSBkaWQgbm90IHJlY2VpdmUgYSBjb3B5IG9mCiAqIHRoZSBQSFAgTGljZW5zZSBhbmQgYXJlIHVuYWJsZSB0byBvYnRhaW4gaXQgdGhyb3VnaCB0aGUgd2ViLCBwbGVhc2UKICogc2VuZCBhIG5vdGUgdG8gbGljZW5zZUBwaHAubmV0IHNvIHdlIGNhbiBtYWlsIHlvdSBhIGNvcHkgaW1tZWRpYXRlbHkuCiAqCiAqIEBjYXRlZ29yeSAgIHBlYXIKICogQHBhY2thZ2UgICAgUEVBUgogKiBAYXV0aG9yICAgICBTdGVybGluZyBIdWdoZXMgPHN0ZXJsaW5nQHBocC5uZXQ+CiAqIEBhdXRob3IgICAgIFN0aWcgQmFra2VuIDxzc2JAcGhwLm5ldD4KICogQGF1dGhvciAgICAgVG9tYXMgVi5WLkNveCA8Y294QGlkZWNuZXQuY29tPgogKiBAYXV0aG9yICAgICBHcmVnIEJlYXZlciA8Y2VsbG9nQHBocC5uZXQ+CiAqIEBjb3B5cmlnaHQgIDE5OTctMjAwNiBUaGUgUEhQIEdyb3VwCiAqIEBsaWNlbnNlICAgIGh0dHA6Ly93d3cucGhwLm5ldC9saWNlbnNlLzNfMC50eHQgIFBIUCBMaWNlbnNlIDMuMAogKiBAdmVyc2lvbiAgICBDVlM6ICRJZDogUEVBUi5waHAsdiAxLjEwMSAyMDA2LzA0LzI1IDAyOjQxOjAzIGNlbGxvZyBFeHAgJAogKiBAbGluayAgICAgICBodHRwOi8vcGVhci5waHAubmV0L3BhY2thZ2UvUEVBUgogKiBAc2luY2UgICAgICBGaWxlIGF2YWlsYWJsZSBzaW5jZSBSZWxlYXNlIDAuMQogKi8KCi8qKiNAKwogKiBFUlJPUiBjb25zdGFudHMKICovCmRlZmluZSgnUEVBUl9FUlJPUl9SRVRVUk4nLCAgICAgMSk7CmRlZmluZSgnUEVBUl9FUlJPUl9QUklOVCcsICAgICAgMik7CmRlZmluZSgnUEVBUl9FUlJPUl9UUklHR0VSJywgICAgNCk7CmRlZmluZSgnUEVBUl9FUlJPUl9ESUUnLCAgICAgICAgOCk7CmRlZmluZSgnUEVBUl9FUlJPUl9DQUxMQkFDSycsICAxNik7Ci8qKgogKiBXQVJOSU5HOiBvYnNvbGV0ZQogKiBAZGVwcmVjYXRlZAogKi8KZGVmaW5lKCdQRUFSX0VSUk9SX0VYQ0VQVElPTicsIDMyKTsKLyoqI0AtKi8KZGVmaW5lKCdQRUFSX1pFMicsIChmdW5jdGlvbl9leGlzdHMoJ3ZlcnNpb25fY29tcGFyZScpICYmCiAgICAgICAgICAgICAgICAgICAgdmVyc2lvbl9jb21wYXJlKHplbmRfdmVyc2lvbigpLCAiMi1kZXYiLCAiZ2UiKSkpOwoKaWYgKHN1YnN0cihQSFBfT1MsIDAsIDMpID09ICdXSU4nKSB7CiAgICBkZWZpbmUoJ09TX1dJTkRPV1MnLCB0cnVlKTsKICAgIGRlZmluZSgnT1NfVU5JWCcsICAgIGZhbHNlKTsKICAgIGRlZmluZSgnUEVBUl9PUycsICAgICdXaW5kb3dzJyk7Cn0gZWxzZSB7CiAgICBkZWZpbmUoJ09TX1dJTkRPV1MnLCBmYWxzZSk7CiAgICBkZWZpbmUoJ09TX1VOSVgnLCAgICB0cnVlKTsKICAgIGRlZmluZSgnUEVBUl9PUycsICAgICdVbml4Jyk7IC8vIGJsYXRhbnQgYXNzdW1wdGlvbgp9CgovLyBpbnN0YW50IGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5CmlmICghZGVmaW5lZCgnUEFUSF9TRVBBUkFUT1InKSkgewogICAgaWYgKE9TX1dJTkRPV1MpIHsKICAgICAgICBkZWZpbmUoJ1BBVEhfU0VQQVJBVE9SJywgJzsnKTsKICAgIH0gZWxzZSB7CiAgICAgICAgZGVmaW5lKCdQQVRIX1NFUEFSQVRPUicsICc6Jyk7CiAgICB9Cn0KCiRHTE9CQUxTWydfUEVBUl9kZWZhdWx0X2Vycm9yX21vZGUnXSAgICAgPSBQRUFSX0VSUk9SX1JFVFVSTjsKJEdMT0JBTFNbJ19QRUFSX2RlZmF1bHRfZXJyb3Jfb3B0aW9ucyddICA9IEVfVVNFUl9OT1RJQ0U7CiRHTE9CQUxTWydfUEVBUl9kZXN0cnVjdG9yX29iamVjdF9saXN0J10gPSBhcnJheSgpOwokR0xPQkFMU1snX1BFQVJfc2h1dGRvd25fZnVuY3MnXSAgICAgICAgID0gYXJyYXkoKTsKJEdMT0JBTFNbJ19QRUFSX2Vycm9yX2hhbmRsZXJfc3RhY2snXSAgICA9IGFycmF5KCk7CgpAaW5pX3NldCgndHJhY2tfZXJyb3JzJywgdHJ1ZSk7CgovKioKICogQmFzZSBjbGFzcyBmb3Igb3RoZXIgUEVBUiBjbGFzc2VzLiAgUHJvdmlkZXMgcnVkaW1lbnRhcnkKICogZW11bGF0aW9uIG9mIGRlc3RydWN0b3JzLgogKgogKiBJZiB5b3Ugd2FudCBhIGRlc3RydWN0b3IgaW4geW91ciBjbGFzcywgaW5oZXJpdCBQRUFSIGFuZCBtYWtlIGEKICogZGVzdHJ1Y3RvciBtZXRob2QgY2FsbGVkIF95b3VyY2xhc3NuYW1lIChzYW1lIG5hbWUgYXMgdGhlCiAqIGNvbnN0cnVjdG9yLCBidXQgd2l0aCBhICJfIiBwcmVmaXgpLiAgQWxzbywgaW4geW91ciBjb25zdHJ1Y3RvciB5b3UKICogaGF2ZSB0byBjYWxsIHRoZSBQRUFSIGNvbnN0cnVjdG9yOiAkdGhpcy0+UEVBUigpOy4KICogVGhlIGRlc3RydWN0b3IgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIHdpdGhvdXQgcGFyYW1ldGVycy4gIE5vdGUgdGhhdAogKiBhdCBpbiBzb21lIFNBUEkgaW1wbGVtZW50YXRpb25zIChzdWNoIGFzIEFwYWNoZSksIGFueSBvdXRwdXQgZHVyaW5nCiAqIHRoZSByZXF1ZXN0IHNodXRkb3duIChpbiB3aGljaCBkZXN0cnVjdG9ycyBhcmUgY2FsbGVkKSBzZWVtcyB0byBiZQogKiBkaXNjYXJkZWQuICBJZiB5b3UgbmVlZCB0byBnZXQgYW55IGRlYnVnIGluZm9ybWF0aW9uIGZyb20geW91cgogKiBkZXN0cnVjdG9yLCB1c2UgZXJyb3JfbG9nKCksIHN5c2xvZygpIG9yIHNvbWV0aGluZyBzaW1pbGFyLgogKgogKiBJTVBPUlRBTlQhIFRvIHVzZSB0aGUgZW11bGF0ZWQgZGVzdHJ1Y3RvcnMgeW91IG5lZWQgdG8gY3JlYXRlIHRoZQogKiBvYmplY3RzIGJ5IHJlZmVyZW5jZTogJG9iaiA9JiBuZXcgUEVBUl9jaGlsZDsKICoKICogQGNhdGVnb3J5ICAgcGVhcgogKiBAcGFja2FnZSAgICBQRUFSCiAqIEBhdXRob3IgICAgIFN0aWcgQmFra2VuIDxzc2JAcGhwLm5ldD4KICogQGF1dGhvciAgICAgVG9tYXMgVi5WLiBDb3ggPGNveEBpZGVjbmV0LmNvbT4KICogQGF1dGhvciAgICAgR3JlZyBCZWF2ZXIgPGNlbGxvZ0BwaHAubmV0PgogKiBAY29weXJpZ2h0ICAxOTk3LTIwMDYgVGhlIFBIUCBHcm91cAogKiBAbGljZW5zZSAgICBodHRwOi8vd3d3LnBocC5uZXQvbGljZW5zZS8zXzAudHh0ICBQSFAgTGljZW5zZSAzLjAKICogQHZlcnNpb24gICAgUmVsZWFzZTogMS42LjIKICogQGxpbmsgICAgICAgaHR0cDovL3BlYXIucGhwLm5ldC9wYWNrYWdlL1BFQVIKICogQHNlZSAgICAgICAgUEVBUl9FcnJvcgogKiBAc2luY2UgICAgICBDbGFzcyBhdmFpbGFibGUgc2luY2UgUEhQIDQuMC4yCiAqIEBsaW5rICAgICAgICBodHRwOi8vcGVhci5waHAubmV0L21hbnVhbC9lbi9jb3JlLnBlYXIucGhwI2NvcmUucGVhci5wZWFyCiAqLwpjbGFzcyBQRUFSCnsKICAgIC8vIHt7eyBwcm9wZXJ0aWVzCgogICAgLyoqCiAgICAgKiBXaGV0aGVyIHRvIGVuYWJsZSBpbnRlcm5hbCBkZWJ1ZyBtZXNzYWdlcy4KICAgICAqCiAgICAgKiBAdmFyICAgICBib29sCiAgICAgKiBAYWNjZXNzICBwcml2YXRlCiAgICAgKi8KICAgIHZhciAkX2RlYnVnID0gZmFsc2U7CgogICAgLyoqCiAgICAgKiBEZWZhdWx0IGVycm9yIG1vZGUgZm9yIHRoaXMgb2JqZWN0LgogICAgICoKICAgICAqIEB2YXIgICAgIGludAogICAgICogQGFjY2VzcyAgcHJpdmF0ZQogICAgICovCiAgICB2YXIgJF9kZWZhdWx0X2Vycm9yX21vZGUgPSBudWxsOwoKICAgIC8qKgogICAgICogRGVmYXVsdCBlcnJvciBvcHRpb25zIHVzZWQgZm9yIHRoaXMgb2JqZWN0IHdoZW4gZXJyb3IgbW9kZQogICAgICogaXMgUEVBUl9FUlJPUl9UUklHR0VSLgogICAgICoKICAgICAqIEB2YXIgICAgIGludAogICAgICogQGFjY2VzcyAgcHJpdmF0ZQogICAgICovCiAgICB2YXIgJF9kZWZhdWx0X2Vycm9yX29wdGlvbnMgPSBudWxsOwoKICAgIC8qKgogICAgICogRGVmYXVsdCBlcnJvciBoYW5kbGVyIChjYWxsYmFjaykgZm9yIHRoaXMgb2JqZWN0LCBpZiBlcnJvciBtb2RlIGlzCiAgICAgKiBQRUFSX0VSUk9SX0NBTExCQUNLLgogICAgICoKICAgICAqIEB2YXIgICAgIHN0cmluZwogICAgICogQGFjY2VzcyAgcHJpdmF0ZQogICAgICovCiAgICB2YXIgJF9kZWZhdWx0X2Vycm9yX2hhbmRsZXIgPSAnJzsKCiAgICAvKioKICAgICAqIFdoaWNoIGNsYXNzIHRvIHVzZSBmb3IgZXJyb3Igb2JqZWN0cy4KICAgICAqCiAgICAgKiBAdmFyICAgICBzdHJpbmcKICAgICAqIEBhY2Nlc3MgIHByaXZhdGUKICAgICAqLwogICAgdmFyICRfZXJyb3JfY2xhc3MgPSAnUEVBUl9FcnJvcic7CgogICAgLyoqCiAgICAgKiBBbiBhcnJheSBvZiBleHBlY3RlZCBlcnJvcnMuCiAgICAgKgogICAgICogQHZhciAgICAgYXJyYXkKICAgICAqIEBhY2Nlc3MgIHByaXZhdGUKICAgICAqLwogICAgdmFyICRfZXhwZWN0ZWRfZXJyb3JzID0gYXJyYXkoKTsKCiAgICAvLyB9fX0KCiAgICAvLyB7e3sgY29uc3RydWN0b3IKCiAgICAvKioKICAgICAqIENvbnN0cnVjdG9yLiAgUmVnaXN0ZXJzIHRoaXMgb2JqZWN0IGluCiAgICAgKiAkX1BFQVJfZGVzdHJ1Y3Rvcl9vYmplY3RfbGlzdCBmb3IgZGVzdHJ1Y3RvciBlbXVsYXRpb24gaWYgYQogICAgICogZGVzdHJ1Y3RvciBvYmplY3QgZXhpc3RzLgogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgJGVycm9yX2NsYXNzICAob3B0aW9uYWwpIHdoaWNoIGNsYXNzIHRvIHVzZSBmb3IKICAgICAqICAgICAgICBlcnJvciBvYmplY3RzLCBkZWZhdWx0cyB0byBQRUFSX0Vycm9yLgogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEByZXR1cm4gdm9pZAogICAgICovCiAgICBmdW5jdGlvbiBQRUFSKCRlcnJvcl9jbGFzcyA9IG51bGwpCiAgICB7CiAgICAgICAgJGNsYXNzbmFtZSA9IHN0cnRvbG93ZXIoZ2V0X2NsYXNzKCR0aGlzKSk7CiAgICAgICAgaWYgKCR0aGlzLT5fZGVidWcpIHsKICAgICAgICAgICAgcHJpbnQgIlBFQVIgY29uc3RydWN0b3IgY2FsbGVkLCBjbGFzcz0kY2xhc3NuYW1lXG4iOwogICAgICAgIH0KICAgICAgICBpZiAoJGVycm9yX2NsYXNzICE9PSBudWxsKSB7CiAgICAgICAgICAgICR0aGlzLT5fZXJyb3JfY2xhc3MgPSAkZXJyb3JfY2xhc3M7CiAgICAgICAgfQogICAgICAgIHdoaWxlICgkY2xhc3NuYW1lICYmIHN0cmNhc2VjbXAoJGNsYXNzbmFtZSwgInBlYXIiKSkgewogICAgICAgICAgICAkZGVzdHJ1Y3RvciA9ICJfJGNsYXNzbmFtZSI7CiAgICAgICAgICAgIGlmIChtZXRob2RfZXhpc3RzKCR0aGlzLCAkZGVzdHJ1Y3RvcikpIHsKICAgICAgICAgICAgICAgIGdsb2JhbCAkX1BFQVJfZGVzdHJ1Y3Rvcl9vYmplY3RfbGlzdDsKICAgICAgICAgICAgICAgICRfUEVBUl9kZXN0cnVjdG9yX29iamVjdF9saXN0W10gPSAmJHRoaXM7CiAgICAgICAgICAgICAgICBpZiAoIWlzc2V0KCRHTE9CQUxTWydfUEVBUl9TSFVURE9XTl9SRUdJU1RFUkVEJ10pKSB7CiAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJfc2h1dGRvd25fZnVuY3Rpb24oIl9QRUFSX2NhbGxfZGVzdHJ1Y3RvcnMiKTsKICAgICAgICAgICAgICAgICAgICAkR0xPQkFMU1snX1BFQVJfU0hVVERPV05fUkVHSVNURVJFRCddID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJGNsYXNzbmFtZSA9IGdldF9wYXJlbnRfY2xhc3MoJGNsYXNzbmFtZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgZGVzdHJ1Y3RvcgoKICAgIC8qKgogICAgICogRGVzdHJ1Y3RvciAodGhlIGVtdWxhdGVkIHR5cGUgb2YuLi4pLiAgRG9lcyBub3RoaW5nIHJpZ2h0IG5vdywKICAgICAqIGJ1dCBpcyBpbmNsdWRlZCBmb3IgZm9yd2FyZCBjb21wYXRpYmlsaXR5LCBzbyBzdWJjbGFzcwogICAgICogZGVzdHJ1Y3RvcnMgc2hvdWxkIGFsd2F5cyBjYWxsIGl0LgogICAgICoKICAgICAqIFNlZSB0aGUgbm90ZSBpbiB0aGUgY2xhc3MgZGVzY2lwdGlvbiBhYm91dCBvdXRwdXQgZnJvbQogICAgICogZGVzdHJ1Y3RvcnMuCiAgICAgKgogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEByZXR1cm4gdm9pZAogICAgICovCiAgICBmdW5jdGlvbiBfUEVBUigpIHsKICAgICAgICBpZiAoJHRoaXMtPl9kZWJ1ZykgewogICAgICAgICAgICBwcmludGYoIlBFQVIgZGVzdHJ1Y3RvciBjYWxsZWQsIGNsYXNzPSVzXG4iLCBzdHJ0b2xvd2VyKGdldF9jbGFzcygkdGhpcykpKTsKICAgICAgICB9CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgZ2V0U3RhdGljUHJvcGVydHkoKQoKICAgIC8qKgogICAgKiBJZiB5b3UgaGF2ZSBhIGNsYXNzIHRoYXQncyBtb3N0bHkvZW50aXJlbHkgc3RhdGljLCBhbmQgeW91IG5lZWQgc3RhdGljCiAgICAqIHByb3BlcnRpZXMsIHlvdSBjYW4gdXNlIHRoaXMgbWV0aG9kIHRvIHNpbXVsYXRlIHRoZW0uIEVnLiBpbiB5b3VyIG1ldGhvZChzKQogICAgKiBkbyB0aGlzOiAkbXlWYXIgPSAmUEVBUjo6Z2V0U3RhdGljUHJvcGVydHkoJ215Y2xhc3MnLCAnbXlWYXInKTsKICAgICogWW91IE1VU1QgdXNlIGEgcmVmZXJlbmNlLCBvciB0aGV5IHdpbGwgbm90IHBlcnNpc3QhCiAgICAqCiAgICAqIEBhY2Nlc3MgcHVibGljCiAgICAqIEBwYXJhbSAgc3RyaW5nICRjbGFzcyAgVGhlIGNhbGxpbmcgY2xhc3NuYW1lLCB0byBwcmV2ZW50IGNsYXNoZXMKICAgICogQHBhcmFtICBzdHJpbmcgJHZhciAgICBUaGUgdmFyaWFibGUgdG8gcmV0cmlldmUuCiAgICAqIEByZXR1cm4gbWl4ZWQgICBBIHJlZmVyZW5jZSB0byB0aGUgdmFyaWFibGUuIElmIG5vdCBzZXQgaXQgd2lsbCBiZQogICAgKiAgICAgICAgICAgICAgICAgYXV0byBpbml0aWFsaXNlZCB0byBOVUxMLgogICAgKi8KICAgIGZ1bmN0aW9uICZnZXRTdGF0aWNQcm9wZXJ0eSgkY2xhc3MsICR2YXIpCiAgICB7CiAgICAgICAgc3RhdGljICRwcm9wZXJ0aWVzOwogICAgICAgIGlmICghaXNzZXQoJHByb3BlcnRpZXNbJGNsYXNzXSkpIHsKICAgICAgICAgICAgJHByb3BlcnRpZXNbJGNsYXNzXSA9IGFycmF5KCk7CiAgICAgICAgfQogICAgICAgIGlmICghYXJyYXlfa2V5X2V4aXN0cygkdmFyLCAkcHJvcGVydGllc1skY2xhc3NdKSkgewogICAgICAgICAgICAkcHJvcGVydGllc1skY2xhc3NdWyR2YXJdID0gbnVsbDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICRwcm9wZXJ0aWVzWyRjbGFzc11bJHZhcl07CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgcmVnaXN0ZXJTaHV0ZG93bkZ1bmMoKQoKICAgIC8qKgogICAgKiBVc2UgdGhpcyBmdW5jdGlvbiB0byByZWdpc3RlciBhIHNodXRkb3duIG1ldGhvZCBmb3Igc3RhdGljCiAgICAqIGNsYXNzZXMuCiAgICAqCiAgICAqIEBhY2Nlc3MgcHVibGljCiAgICAqIEBwYXJhbSAgbWl4ZWQgJGZ1bmMgIFRoZSBmdW5jdGlvbiBuYW1lIChvciBhcnJheSBvZiBjbGFzcy9tZXRob2QpIHRvIGNhbGwKICAgICogQHBhcmFtICBtaXhlZCAkYXJncyAgVGhlIGFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBmdW5jdGlvbgogICAgKiBAcmV0dXJuIHZvaWQKICAgICovCiAgICBmdW5jdGlvbiByZWdpc3RlclNodXRkb3duRnVuYygkZnVuYywgJGFyZ3MgPSBhcnJheSgpKQogICAgewogICAgICAgIC8vIGlmIHdlIGFyZSBjYWxsZWQgc3RhdGljYWxseSwgdGhlcmUgaXMgYSBwb3RlbnRpYWwKICAgICAgICAvLyB0aGF0IG5vIHNodXRkb3duIGZ1bmMgaXMgcmVnaXN0ZXJlZC4gIEJ1ZyAjNjQ0NQogICAgICAgIGlmICghaXNzZXQoJEdMT0JBTFNbJ19QRUFSX1NIVVRET1dOX1JFR0lTVEVSRUQnXSkpIHsKICAgICAgICAgICAgcmVnaXN0ZXJfc2h1dGRvd25fZnVuY3Rpb24oIl9QRUFSX2NhbGxfZGVzdHJ1Y3RvcnMiKTsKICAgICAgICAgICAgJEdMT0JBTFNbJ19QRUFSX1NIVVRET1dOX1JFR0lTVEVSRUQnXSA9IHRydWU7CiAgICAgICAgfQogICAgICAgICRHTE9CQUxTWydfUEVBUl9zaHV0ZG93bl9mdW5jcyddW10gPSBhcnJheSgkZnVuYywgJGFyZ3MpOwogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IGlzRXJyb3IoKQoKICAgIC8qKgogICAgICogVGVsbCB3aGV0aGVyIGEgdmFsdWUgaXMgYSBQRUFSIGVycm9yLgogICAgICoKICAgICAqIEBwYXJhbSAgIG1peGVkICRkYXRhICAgdGhlIHZhbHVlIHRvIHRlc3QKICAgICAqIEBwYXJhbSAgIGludCAgICRjb2RlICAgaWYgJGRhdGEgaXMgYW4gZXJyb3Igb2JqZWN0LCByZXR1cm4gdHJ1ZQogICAgICogICAgICAgICAgICAgICAgICAgICAgICBvbmx5IGlmICRjb2RlIGlzIGEgc3RyaW5nIGFuZAogICAgICogICAgICAgICAgICAgICAgICAgICAgICAkb2JqLT5nZXRNZXNzYWdlKCkgPT0gJGNvZGUgb3IKICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgJGNvZGUgaXMgYW4gaW50ZWdlciBhbmQgJG9iai0+Z2V0Q29kZSgpID09ICRjb2RlCiAgICAgKiBAYWNjZXNzICBwdWJsaWMKICAgICAqIEByZXR1cm4gIGJvb2wgICAgdHJ1ZSBpZiBwYXJhbWV0ZXIgaXMgYW4gZXJyb3IKICAgICAqLwogICAgZnVuY3Rpb24gaXNFcnJvcigkZGF0YSwgJGNvZGUgPSBudWxsKQogICAgewogICAgICAgIGlmIChpc19hKCRkYXRhLCAnUEVBUl9FcnJvcicpKSB7CiAgICAgICAgICAgIGlmIChpc19udWxsKCRjb2RlKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0gZWxzZWlmIChpc19zdHJpbmcoJGNvZGUpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJGRhdGEtPmdldE1lc3NhZ2UoKSA9PSAkY29kZTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybiAkZGF0YS0+Z2V0Q29kZSgpID09ICRjb2RlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICAvLyB9fX0KICAgIC8vIHt7eyBzZXRFcnJvckhhbmRsaW5nKCkKCiAgICAvKioKICAgICAqIFNldHMgaG93IGVycm9ycyBnZW5lcmF0ZWQgYnkgdGhpcyBvYmplY3Qgc2hvdWxkIGJlIGhhbmRsZWQuCiAgICAgKiBDYW4gYmUgaW52b2tlZCBib3RoIGluIG9iamVjdHMgYW5kIHN0YXRpY2FsbHkuICBJZiBjYWxsZWQKICAgICAqIHN0YXRpY2FsbHksIHNldEVycm9ySGFuZGxpbmcgc2V0cyB0aGUgZGVmYXVsdCBiZWhhdmlvdXIgZm9yIGFsbAogICAgICogUEVBUiBvYmplY3RzLiAgSWYgY2FsbGVkIGluIGFuIG9iamVjdCwgc2V0RXJyb3JIYW5kbGluZyBzZXRzCiAgICAgKiB0aGUgZGVmYXVsdCBiZWhhdmlvdXIgZm9yIHRoYXQgb2JqZWN0LgogICAgICoKICAgICAqIEBwYXJhbSBpbnQgJG1vZGUKICAgICAqICAgICAgICBPbmUgb2YgUEVBUl9FUlJPUl9SRVRVUk4sIFBFQVJfRVJST1JfUFJJTlQsCiAgICAgKiAgICAgICAgUEVBUl9FUlJPUl9UUklHR0VSLCBQRUFSX0VSUk9SX0RJRSwKICAgICAqICAgICAgICBQRUFSX0VSUk9SX0NBTExCQUNLIG9yIFBFQVJfRVJST1JfRVhDRVBUSU9OLgogICAgICoKICAgICAqIEBwYXJhbSBtaXhlZCAkb3B0aW9ucwogICAgICogICAgICAgIFdoZW4gJG1vZGUgaXMgUEVBUl9FUlJPUl9UUklHR0VSLCB0aGlzIGlzIHRoZSBlcnJvciBsZXZlbCAob25lCiAgICAgKiAgICAgICAgb2YgRV9VU0VSX05PVElDRSwgRV9VU0VSX1dBUk5JTkcgb3IgRV9VU0VSX0VSUk9SKS4KICAgICAqCiAgICAgKiAgICAgICAgV2hlbiAkbW9kZSBpcyBQRUFSX0VSUk9SX0NBTExCQUNLLCB0aGlzIHBhcmFtZXRlciBpcyBleHBlY3RlZAogICAgICogICAgICAgIHRvIGJlIHRoZSBjYWxsYmFjayBmdW5jdGlvbiBvciBtZXRob2QuICBBIGNhbGxiYWNrCiAgICAgKiAgICAgICAgZnVuY3Rpb24gaXMgYSBzdHJpbmcgd2l0aCB0aGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24sIGEKICAgICAqICAgICAgICBjYWxsYmFjayBtZXRob2QgaXMgYW4gYXJyYXkgb2YgdHdvIGVsZW1lbnRzOiB0aGUgZWxlbWVudAogICAgICogICAgICAgIGF0IGluZGV4IDAgaXMgdGhlIG9iamVjdCwgYW5kIHRoZSBlbGVtZW50IGF0IGluZGV4IDEgaXMKICAgICAqICAgICAgICB0aGUgbmFtZSBvZiB0aGUgbWV0aG9kIHRvIGNhbGwgaW4gdGhlIG9iamVjdC4KICAgICAqCiAgICAgKiAgICAgICAgV2hlbiAkbW9kZSBpcyBQRUFSX0VSUk9SX1BSSU5UIG9yIFBFQVJfRVJST1JfRElFLCB0aGlzIGlzCiAgICAgKiAgICAgICAgYSBwcmludGYgZm9ybWF0IHN0cmluZyB1c2VkIHdoZW4gcHJpbnRpbmcgdGhlIGVycm9yCiAgICAgKiAgICAgICAgbWVzc2FnZS4KICAgICAqCiAgICAgKiBAYWNjZXNzIHB1YmxpYwogICAgICogQHJldHVybiB2b2lkCiAgICAgKiBAc2VlIFBFQVJfRVJST1JfUkVUVVJOCiAgICAgKiBAc2VlIFBFQVJfRVJST1JfUFJJTlQKICAgICAqIEBzZWUgUEVBUl9FUlJPUl9UUklHR0VSCiAgICAgKiBAc2VlIFBFQVJfRVJST1JfRElFCiAgICAgKiBAc2VlIFBFQVJfRVJST1JfQ0FMTEJBQ0sKICAgICAqIEBzZWUgUEVBUl9FUlJPUl9FWENFUFRJT04KICAgICAqCiAgICAgKiBAc2luY2UgUEhQIDQuMC41CiAgICAgKi8KCiAgICBmdW5jdGlvbiBzZXRFcnJvckhhbmRsaW5nKCRtb2RlID0gbnVsbCwgJG9wdGlvbnMgPSBudWxsKQogICAgewogICAgICAgIGlmIChpc3NldCgkdGhpcykgJiYgaXNfYSgkdGhpcywgJ1BFQVInKSkgewogICAgICAgICAgICAkc2V0bW9kZSAgICAgPSAmJHRoaXMtPl9kZWZhdWx0X2Vycm9yX21vZGU7CiAgICAgICAgICAgICRzZXRvcHRpb25zICA9ICYkdGhpcy0+X2RlZmF1bHRfZXJyb3Jfb3B0aW9uczsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkc2V0bW9kZSAgICAgPSAmJEdMT0JBTFNbJ19QRUFSX2RlZmF1bHRfZXJyb3JfbW9kZSddOwogICAgICAgICAgICAkc2V0b3B0aW9ucyAgPSAmJEdMT0JBTFNbJ19QRUFSX2RlZmF1bHRfZXJyb3Jfb3B0aW9ucyddOwogICAgICAgIH0KCiAgICAgICAgc3dpdGNoICgkbW9kZSkgewogICAgICAgICAgICBjYXNlIFBFQVJfRVJST1JfRVhDRVBUSU9OOgogICAgICAgICAgICBjYXNlIFBFQVJfRVJST1JfUkVUVVJOOgogICAgICAgICAgICBjYXNlIFBFQVJfRVJST1JfUFJJTlQ6CiAgICAgICAgICAgIGNhc2UgUEVBUl9FUlJPUl9UUklHR0VSOgogICAgICAgICAgICBjYXNlIFBFQVJfRVJST1JfRElFOgogICAgICAgICAgICBjYXNlIG51bGw6CiAgICAgICAgICAgICAgICAkc2V0bW9kZSA9ICRtb2RlOwogICAgICAgICAgICAgICAgJHNldG9wdGlvbnMgPSAkb3B0aW9uczsKICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSBQRUFSX0VSUk9SX0NBTExCQUNLOgogICAgICAgICAgICAgICAgJHNldG1vZGUgPSAkbW9kZTsKICAgICAgICAgICAgICAgIC8vIGNsYXNzL29iamVjdCBtZXRob2QgY2FsbGJhY2sKICAgICAgICAgICAgICAgIGlmIChpc19jYWxsYWJsZSgkb3B0aW9ucykpIHsKICAgICAgICAgICAgICAgICAgICAkc2V0b3B0aW9ucyA9ICRvcHRpb25zOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyX2Vycm9yKCJpbnZhbGlkIGVycm9yIGNhbGxiYWNrIiwgRV9VU0VSX1dBUk5JTkcpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgdHJpZ2dlcl9lcnJvcigiaW52YWxpZCBlcnJvciBtb2RlIiwgRV9VU0VSX1dBUk5JTkcpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IGV4cGVjdEVycm9yKCkKCiAgICAvKioKICAgICAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gdGVsbCB3aGljaCBlcnJvcnMgeW91IGV4cGVjdCB0byBnZXQuCiAgICAgKiBFeHBlY3RlZCBlcnJvcnMgYXJlIGFsd2F5cyByZXR1cm5lZCB3aXRoIGVycm9yIG1vZGUKICAgICAqIFBFQVJfRVJST1JfUkVUVVJOLiAgRXhwZWN0ZWQgZXJyb3IgY29kZXMgYXJlIHN0b3JlZCBpbiBhIHN0YWNrLAogICAgICogYW5kIHRoaXMgbWV0aG9kIHB1c2hlcyBhIG5ldyBlbGVtZW50IG9udG8gaXQuICBUaGUgbGlzdCBvZgogICAgICogZXhwZWN0ZWQgZXJyb3JzIGFyZSBpbiBlZmZlY3QgdW50aWwgdGhleSBhcmUgcG9wcGVkIG9mZiB0aGUKICAgICAqIHN0YWNrIHdpdGggdGhlIHBvcEV4cGVjdCgpIG1ldGhvZC4KICAgICAqCiAgICAgKiBOb3RlIHRoYXQgdGhpcyBtZXRob2QgY2FuIG5vdCBiZSBjYWxsZWQgc3RhdGljYWxseQogICAgICoKICAgICAqIEBwYXJhbSBtaXhlZCAkY29kZSBhIHNpbmdsZSBlcnJvciBjb2RlIG9yIGFuIGFycmF5IG9mIGVycm9yIGNvZGVzIHRvIGV4cGVjdAogICAgICoKICAgICAqIEByZXR1cm4gaW50ICAgICB0aGUgbmV3IGRlcHRoIG9mIHRoZSAiZXhwZWN0ZWQgZXJyb3JzIiBzdGFjawogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqLwogICAgZnVuY3Rpb24gZXhwZWN0RXJyb3IoJGNvZGUgPSAnKicpCiAgICB7CiAgICAgICAgaWYgKGlzX2FycmF5KCRjb2RlKSkgewogICAgICAgICAgICBhcnJheV9wdXNoKCR0aGlzLT5fZXhwZWN0ZWRfZXJyb3JzLCAkY29kZSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgYXJyYXlfcHVzaCgkdGhpcy0+X2V4cGVjdGVkX2Vycm9ycywgYXJyYXkoJGNvZGUpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHNpemVvZigkdGhpcy0+X2V4cGVjdGVkX2Vycm9ycyk7CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgcG9wRXhwZWN0KCkKCiAgICAvKioKICAgICAqIFRoaXMgbWV0aG9kIHBvcHMgb25lIGVsZW1lbnQgb2ZmIHRoZSBleHBlY3RlZCBlcnJvciBjb2RlcwogICAgICogc3RhY2suCiAgICAgKgogICAgICogQHJldHVybiBhcnJheSAgIHRoZSBsaXN0IG9mIGVycm9yIGNvZGVzIHRoYXQgd2VyZSBwb3BwZWQKICAgICAqLwogICAgZnVuY3Rpb24gcG9wRXhwZWN0KCkKICAgIHsKICAgICAgICByZXR1cm4gYXJyYXlfcG9wKCR0aGlzLT5fZXhwZWN0ZWRfZXJyb3JzKTsKICAgIH0KCiAgICAvLyB9fX0KICAgIC8vIHt7eyBfY2hlY2tEZWxFeHBlY3QoKQoKICAgIC8qKgogICAgICogVGhpcyBtZXRob2QgY2hlY2tzIHVuc2V0cyBhbiBlcnJvciBjb2RlIGlmIGF2YWlsYWJsZQogICAgICoKICAgICAqIEBwYXJhbSBtaXhlZCBlcnJvciBjb2RlCiAgICAgKiBAcmV0dXJuIGJvb2wgdHJ1ZSBpZiB0aGUgZXJyb3IgY29kZSB3YXMgdW5zZXQsIGZhbHNlIG90aGVyd2lzZQogICAgICogQGFjY2VzcyBwcml2YXRlCiAgICAgKiBAc2luY2UgUEhQIDQuMy4wCiAgICAgKi8KICAgIGZ1bmN0aW9uIF9jaGVja0RlbEV4cGVjdCgkZXJyb3JfY29kZSkKICAgIHsKICAgICAgICAkZGVsZXRlZCA9IGZhbHNlOwoKICAgICAgICBmb3JlYWNoICgkdGhpcy0+X2V4cGVjdGVkX2Vycm9ycyBBUyAka2V5ID0+ICRlcnJvcl9hcnJheSkgewogICAgICAgICAgICBpZiAoaW5fYXJyYXkoJGVycm9yX2NvZGUsICRlcnJvcl9hcnJheSkpIHsKICAgICAgICAgICAgICAgIHVuc2V0KCR0aGlzLT5fZXhwZWN0ZWRfZXJyb3JzWyRrZXldW2FycmF5X3NlYXJjaCgkZXJyb3JfY29kZSwgJGVycm9yX2FycmF5KV0pOwogICAgICAgICAgICAgICAgJGRlbGV0ZWQgPSB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjbGVhbiB1cCBlbXB0eSBhcnJheXMKICAgICAgICAgICAgaWYgKDAgPT0gY291bnQoJHRoaXMtPl9leHBlY3RlZF9lcnJvcnNbJGtleV0pKSB7CiAgICAgICAgICAgICAgICB1bnNldCgkdGhpcy0+X2V4cGVjdGVkX2Vycm9yc1ska2V5XSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuICRkZWxldGVkOwogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IGRlbEV4cGVjdCgpCgogICAgLyoqCiAgICAgKiBUaGlzIG1ldGhvZCBkZWxldGVzIGFsbCBvY2N1cmVuY2VzIG9mIHRoZSBzcGVjaWZpZWQgZWxlbWVudCBmcm9tCiAgICAgKiB0aGUgZXhwZWN0ZWQgZXJyb3IgY29kZXMgc3RhY2suCiAgICAgKgogICAgICogQHBhcmFtICBtaXhlZCAkZXJyb3JfY29kZSBlcnJvciBjb2RlIHRoYXQgc2hvdWxkIGJlIGRlbGV0ZWQKICAgICAqIEByZXR1cm4gbWl4ZWQgbGlzdCBvZiBlcnJvciBjb2RlcyB0aGF0IHdlcmUgZGVsZXRlZCBvciBlcnJvcgogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEBzaW5jZSBQSFAgNC4zLjAKICAgICAqLwogICAgZnVuY3Rpb24gZGVsRXhwZWN0KCRlcnJvcl9jb2RlKQogICAgewogICAgICAgICRkZWxldGVkID0gZmFsc2U7CgogICAgICAgIGlmICgoaXNfYXJyYXkoJGVycm9yX2NvZGUpICYmICgwICE9IGNvdW50KCRlcnJvcl9jb2RlKSkpKSB7CiAgICAgICAgICAgIC8vICRlcnJvcl9jb2RlIGlzIGEgbm9uLWVtcHR5IGFycmF5IGhlcmU7CiAgICAgICAgICAgIC8vIHdlIHdhbGsgdGhyb3VnaCBpdCB0cnlpbmcgdG8gdW5zZXQgYWxsCiAgICAgICAgICAgIC8vIHZhbHVlcwogICAgICAgICAgICBmb3JlYWNoKCRlcnJvcl9jb2RlIGFzICRrZXkgPT4gJGVycm9yKSB7CiAgICAgICAgICAgICAgICBpZiAoJHRoaXMtPl9jaGVja0RlbEV4cGVjdCgkZXJyb3IpKSB7CiAgICAgICAgICAgICAgICAgICAgJGRlbGV0ZWQgPSAgdHJ1ZTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJGRlbGV0ZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gJGRlbGV0ZWQgPyB0cnVlIDogUEVBUjo6cmFpc2VFcnJvcigiVGhlIGV4cGVjdGVkIGVycm9yIHlvdSBzdWJtaXR0ZWQgZG9lcyBub3QgZXhpc3QiKTsgLy8gSU1QUk9WRSBNRQogICAgICAgIH0gZWxzZWlmICghZW1wdHkoJGVycm9yX2NvZGUpKSB7CiAgICAgICAgICAgIC8vICRlcnJvcl9jb2RlIGNvbWVzIGFsb25lLCB0cnlpbmcgdG8gdW5zZXQgaXQKICAgICAgICAgICAgaWYgKCR0aGlzLT5fY2hlY2tEZWxFeHBlY3QoJGVycm9yX2NvZGUpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybiBQRUFSOjpyYWlzZUVycm9yKCJUaGUgZXhwZWN0ZWQgZXJyb3IgeW91IHN1Ym1pdHRlZCBkb2VzIG5vdCBleGlzdCIpOyAvLyBJTVBST1ZFIE1FCiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvLyAkZXJyb3JfY29kZSBpcyBlbXB0eQogICAgICAgICAgICByZXR1cm4gUEVBUjo6cmFpc2VFcnJvcigiVGhlIGV4cGVjdGVkIGVycm9yIHlvdSBzdWJtaXR0ZWQgaXMgZW1wdHkiKTsgLy8gSU1QUk9WRSBNRQogICAgICAgIH0KICAgIH0KCiAgICAvLyB9fX0KICAgIC8vIHt7eyByYWlzZUVycm9yKCkKCiAgICAvKioKICAgICAqIFRoaXMgbWV0aG9kIGlzIGEgd3JhcHBlciB0aGF0IHJldHVybnMgYW4gaW5zdGFuY2Ugb2YgdGhlCiAgICAgKiBjb25maWd1cmVkIGVycm9yIGNsYXNzIHdpdGggdGhpcyBvYmplY3QncyBkZWZhdWx0IGVycm9yCiAgICAgKiBoYW5kbGluZyBhcHBsaWVkLiAgSWYgdGhlICRtb2RlIGFuZCAkb3B0aW9ucyBwYXJhbWV0ZXJzIGFyZSBub3QKICAgICAqIHNwZWNpZmllZCwgdGhlIG9iamVjdCdzIGRlZmF1bHRzIGFyZSB1c2VkLgogICAgICoKICAgICAqIEBwYXJhbSBtaXhlZCAkbWVzc2FnZSBhIHRleHQgZXJyb3IgbWVzc2FnZSBvciBhIFBFQVIgZXJyb3Igb2JqZWN0CiAgICAgKgogICAgICogQHBhcmFtIGludCAkY29kZSAgICAgIGEgbnVtZXJpYyBlcnJvciBjb2RlIChpdCBpcyB1cCB0byB5b3VyIGNsYXNzCiAgICAgKiAgICAgICAgICAgICAgICAgIHRvIGRlZmluZSB0aGVzZSBpZiB5b3Ugd2FudCB0byB1c2UgY29kZXMpCiAgICAgKgogICAgICogQHBhcmFtIGludCAkbW9kZSAgICAgIE9uZSBvZiBQRUFSX0VSUk9SX1JFVFVSTiwgUEVBUl9FUlJPUl9QUklOVCwKICAgICAqICAgICAgICAgICAgICAgICAgUEVBUl9FUlJPUl9UUklHR0VSLCBQRUFSX0VSUk9SX0RJRSwKICAgICAqICAgICAgICAgICAgICAgICAgUEVBUl9FUlJPUl9DQUxMQkFDSywgUEVBUl9FUlJPUl9FWENFUFRJT04uCiAgICAgKgogICAgICogQHBhcmFtIG1peGVkICRvcHRpb25zIElmICRtb2RlIGlzIFBFQVJfRVJST1JfVFJJR0dFUiwgdGhpcyBwYXJhbWV0ZXIKICAgICAqICAgICAgICAgICAgICAgICAgc3BlY2lmaWVzIHRoZSBQSFAtaW50ZXJuYWwgZXJyb3IgbGV2ZWwgKG9uZSBvZgogICAgICogICAgICAgICAgICAgICAgICBFX1VTRVJfTk9USUNFLCBFX1VTRVJfV0FSTklORyBvciBFX1VTRVJfRVJST1IpLgogICAgICogICAgICAgICAgICAgICAgICBJZiAkbW9kZSBpcyBQRUFSX0VSUk9SX0NBTExCQUNLLCB0aGlzCiAgICAgKiAgICAgICAgICAgICAgICAgIHBhcmFtZXRlciBzcGVjaWZpZXMgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIG9yCiAgICAgKiAgICAgICAgICAgICAgICAgIG1ldGhvZC4gIEluIG90aGVyIGVycm9yIG1vZGVzIHRoaXMgcGFyYW1ldGVyCiAgICAgKiAgICAgICAgICAgICAgICAgIGlzIGlnbm9yZWQuCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkdXNlcmluZm8gSWYgeW91IG5lZWQgdG8gcGFzcyBhbG9uZyBmb3IgZXhhbXBsZSBkZWJ1ZwogICAgICogICAgICAgICAgICAgICAgICBpbmZvcm1hdGlvbiwgdGhpcyBwYXJhbWV0ZXIgaXMgbWVhbnQgZm9yIHRoYXQuCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkZXJyb3JfY2xhc3MgVGhlIHJldHVybmVkIGVycm9yIG9iamVjdCB3aWxsIGJlCiAgICAgKiAgICAgICAgICAgICAgICAgIGluc3RhbnRpYXRlZCBmcm9tIHRoaXMgY2xhc3MsIGlmIHNwZWNpZmllZC4KICAgICAqCiAgICAgKiBAcGFyYW0gYm9vbCAkc2tpcG1zZyBJZiB0cnVlLCByYWlzZUVycm9yIHdpbGwgb25seSBwYXNzIGVycm9yIGNvZGVzLAogICAgICogICAgICAgICAgICAgICAgICB0aGUgZXJyb3IgbWVzc2FnZSBwYXJhbWV0ZXIgd2lsbCBiZSBkcm9wcGVkLgogICAgICoKICAgICAqIEBhY2Nlc3MgcHVibGljCiAgICAgKiBAcmV0dXJuIG9iamVjdCAgIGEgUEVBUiBlcnJvciBvYmplY3QKICAgICAqIEBzZWUgUEVBUjo6c2V0RXJyb3JIYW5kbGluZwogICAgICogQHNpbmNlIFBIUCA0LjAuNQogICAgICovCiAgICBmdW5jdGlvbiAmcmFpc2VFcnJvcigkbWVzc2FnZSA9IG51bGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAkY29kZSA9IG51bGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAkbW9kZSA9IG51bGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAkb3B0aW9ucyA9IG51bGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAkdXNlcmluZm8gPSBudWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgJGVycm9yX2NsYXNzID0gbnVsbCwKICAgICAgICAgICAgICAgICAgICAgICAgICRza2lwbXNnID0gZmFsc2UpCiAgICB7CiAgICAgICAgLy8gVGhlIGVycm9yIGlzIHlldCBhIFBFQVIgZXJyb3Igb2JqZWN0CiAgICAgICAgaWYgKGlzX29iamVjdCgkbWVzc2FnZSkpIHsKICAgICAgICAgICAgJGNvZGUgICAgICAgID0gJG1lc3NhZ2UtPmdldENvZGUoKTsKICAgICAgICAgICAgJHVzZXJpbmZvICAgID0gJG1lc3NhZ2UtPmdldFVzZXJJbmZvKCk7CiAgICAgICAgICAgICRlcnJvcl9jbGFzcyA9ICRtZXNzYWdlLT5nZXRUeXBlKCk7CiAgICAgICAgICAgICRtZXNzYWdlLT5lcnJvcl9tZXNzYWdlX3ByZWZpeCA9ICcnOwogICAgICAgICAgICAkbWVzc2FnZSAgICAgPSAkbWVzc2FnZS0+Z2V0TWVzc2FnZSgpOwogICAgICAgIH0KCiAgICAgICAgaWYgKGlzc2V0KCR0aGlzKSAmJiBpc3NldCgkdGhpcy0+X2V4cGVjdGVkX2Vycm9ycykgJiYgc2l6ZW9mKCR0aGlzLT5fZXhwZWN0ZWRfZXJyb3JzKSA+IDAgJiYgc2l6ZW9mKCRleHAgPSBlbmQoJHRoaXMtPl9leHBlY3RlZF9lcnJvcnMpKSkgewogICAgICAgICAgICBpZiAoJGV4cFswXSA9PSAiKiIgfHwKICAgICAgICAgICAgICAgIChpc19pbnQocmVzZXQoJGV4cCkpICYmIGluX2FycmF5KCRjb2RlLCAkZXhwKSkgfHwKICAgICAgICAgICAgICAgIChpc19zdHJpbmcocmVzZXQoJGV4cCkpICYmIGluX2FycmF5KCRtZXNzYWdlLCAkZXhwKSkpIHsKICAgICAgICAgICAgICAgICRtb2RlID0gUEVBUl9FUlJPUl9SRVRVUk47CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLy8gTm8gbW9kZSBnaXZlbiwgdHJ5IGdsb2JhbCBvbmVzCiAgICAgICAgaWYgKCRtb2RlID09PSBudWxsKSB7CiAgICAgICAgICAgIC8vIENsYXNzIGVycm9yIGhhbmRsZXIKICAgICAgICAgICAgaWYgKGlzc2V0KCR0aGlzKSAmJiBpc3NldCgkdGhpcy0+X2RlZmF1bHRfZXJyb3JfbW9kZSkpIHsKICAgICAgICAgICAgICAgICRtb2RlICAgID0gJHRoaXMtPl9kZWZhdWx0X2Vycm9yX21vZGU7CiAgICAgICAgICAgICAgICAkb3B0aW9ucyA9ICR0aGlzLT5fZGVmYXVsdF9lcnJvcl9vcHRpb25zOwogICAgICAgICAgICAvLyBHbG9iYWwgZXJyb3IgaGFuZGxlcgogICAgICAgICAgICB9IGVsc2VpZiAoaXNzZXQoJEdMT0JBTFNbJ19QRUFSX2RlZmF1bHRfZXJyb3JfbW9kZSddKSkgewogICAgICAgICAgICAgICAgJG1vZGUgICAgPSAkR0xPQkFMU1snX1BFQVJfZGVmYXVsdF9lcnJvcl9tb2RlJ107CiAgICAgICAgICAgICAgICAkb3B0aW9ucyA9ICRHTE9CQUxTWydfUEVBUl9kZWZhdWx0X2Vycm9yX29wdGlvbnMnXTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCRlcnJvcl9jbGFzcyAhPT0gbnVsbCkgewogICAgICAgICAgICAkZWMgPSAkZXJyb3JfY2xhc3M7CiAgICAgICAgfSBlbHNlaWYgKGlzc2V0KCR0aGlzKSAmJiBpc3NldCgkdGhpcy0+X2Vycm9yX2NsYXNzKSkgewogICAgICAgICAgICAkZWMgPSAkdGhpcy0+X2Vycm9yX2NsYXNzOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRlYyA9ICdQRUFSX0Vycm9yJzsKICAgICAgICB9CiAgICAgICAgaWYgKCRza2lwbXNnKSB7CiAgICAgICAgICAgICRhID0gJm5ldyAkZWMoJGNvZGUsICRtb2RlLCAkb3B0aW9ucywgJHVzZXJpbmZvKTsKICAgICAgICAgICAgcmV0dXJuICRhOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRhID0gJm5ldyAkZWMoJG1lc3NhZ2UsICRjb2RlLCAkbW9kZSwgJG9wdGlvbnMsICR1c2VyaW5mbyk7CiAgICAgICAgICAgIHJldHVybiAkYTsKICAgICAgICB9CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgdGhyb3dFcnJvcigpCgogICAgLyoqCiAgICAgKiBTaW1wbGVyIGZvcm0gb2YgcmFpc2VFcnJvciB3aXRoIGZld2VyIG9wdGlvbnMuICBJbiBtb3N0IGNhc2VzCiAgICAgKiBtZXNzYWdlLCBjb2RlIGFuZCB1c2VyaW5mbyBhcmUgZW5vdWdoLgogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgJG1lc3NhZ2UKICAgICAqCiAgICAgKi8KICAgIGZ1bmN0aW9uICZ0aHJvd0Vycm9yKCRtZXNzYWdlID0gbnVsbCwKICAgICAgICAgICAgICAgICAgICAgICAgICRjb2RlID0gbnVsbCwKICAgICAgICAgICAgICAgICAgICAgICAgICR1c2VyaW5mbyA9IG51bGwpCiAgICB7CiAgICAgICAgaWYgKGlzc2V0KCR0aGlzKSAmJiBpc19hKCR0aGlzLCAnUEVBUicpKSB7CiAgICAgICAgICAgICRhID0gJiR0aGlzLT5yYWlzZUVycm9yKCRtZXNzYWdlLCAkY29kZSwgbnVsbCwgbnVsbCwgJHVzZXJpbmZvKTsKICAgICAgICAgICAgcmV0dXJuICRhOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRhID0gJlBFQVI6OnJhaXNlRXJyb3IoJG1lc3NhZ2UsICRjb2RlLCBudWxsLCBudWxsLCAkdXNlcmluZm8pOwogICAgICAgICAgICByZXR1cm4gJGE7CiAgICAgICAgfQogICAgfQoKICAgIC8vIH19fQogICAgZnVuY3Rpb24gc3RhdGljUHVzaEVycm9ySGFuZGxpbmcoJG1vZGUsICRvcHRpb25zID0gbnVsbCkKICAgIHsKICAgICAgICAkc3RhY2sgPSAmJEdMT0JBTFNbJ19QRUFSX2Vycm9yX2hhbmRsZXJfc3RhY2snXTsKICAgICAgICAkZGVmX21vZGUgICAgPSAmJEdMT0JBTFNbJ19QRUFSX2RlZmF1bHRfZXJyb3JfbW9kZSddOwogICAgICAgICRkZWZfb3B0aW9ucyA9ICYkR0xPQkFMU1snX1BFQVJfZGVmYXVsdF9lcnJvcl9vcHRpb25zJ107CiAgICAgICAgJHN0YWNrW10gPSBhcnJheSgkZGVmX21vZGUsICRkZWZfb3B0aW9ucyk7CiAgICAgICAgc3dpdGNoICgkbW9kZSkgewogICAgICAgICAgICBjYXNlIFBFQVJfRVJST1JfRVhDRVBUSU9OOgogICAgICAgICAgICBjYXNlIFBFQVJfRVJST1JfUkVUVVJOOgogICAgICAgICAgICBjYXNlIFBFQVJfRVJST1JfUFJJTlQ6CiAgICAgICAgICAgIGNhc2UgUEVBUl9FUlJPUl9UUklHR0VSOgogICAgICAgICAgICBjYXNlIFBFQVJfRVJST1JfRElFOgogICAgICAgICAgICBjYXNlIG51bGw6CiAgICAgICAgICAgICAgICAkZGVmX21vZGUgPSAkbW9kZTsKICAgICAgICAgICAgICAgICRkZWZfb3B0aW9ucyA9ICRvcHRpb25zOwogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIFBFQVJfRVJST1JfQ0FMTEJBQ0s6CiAgICAgICAgICAgICAgICAkZGVmX21vZGUgPSAkbW9kZTsKICAgICAgICAgICAgICAgIC8vIGNsYXNzL29iamVjdCBtZXRob2QgY2FsbGJhY2sKICAgICAgICAgICAgICAgIGlmIChpc19jYWxsYWJsZSgkb3B0aW9ucykpIHsKICAgICAgICAgICAgICAgICAgICAkZGVmX29wdGlvbnMgPSAkb3B0aW9uczsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdHJpZ2dlcl9lcnJvcigiaW52YWxpZCBlcnJvciBjYWxsYmFjayIsIEVfVVNFUl9XQVJOSU5HKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIHRyaWdnZXJfZXJyb3IoImludmFsaWQgZXJyb3IgbW9kZSIsIEVfVVNFUl9XQVJOSU5HKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICAkc3RhY2tbXSA9IGFycmF5KCRtb2RlLCAkb3B0aW9ucyk7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgZnVuY3Rpb24gc3RhdGljUG9wRXJyb3JIYW5kbGluZygpCiAgICB7CiAgICAgICAgJHN0YWNrID0gJiRHTE9CQUxTWydfUEVBUl9lcnJvcl9oYW5kbGVyX3N0YWNrJ107CiAgICAgICAgJHNldG1vZGUgICAgID0gJiRHTE9CQUxTWydfUEVBUl9kZWZhdWx0X2Vycm9yX21vZGUnXTsKICAgICAgICAkc2V0b3B0aW9ucyAgPSAmJEdMT0JBTFNbJ19QRUFSX2RlZmF1bHRfZXJyb3Jfb3B0aW9ucyddOwogICAgICAgIGFycmF5X3BvcCgkc3RhY2spOwogICAgICAgIGxpc3QoJG1vZGUsICRvcHRpb25zKSA9ICRzdGFja1tzaXplb2YoJHN0YWNrKSAtIDFdOwogICAgICAgIGFycmF5X3BvcCgkc3RhY2spOwogICAgICAgIHN3aXRjaCAoJG1vZGUpIHsKICAgICAgICAgICAgY2FzZSBQRUFSX0VSUk9SX0VYQ0VQVElPTjoKICAgICAgICAgICAgY2FzZSBQRUFSX0VSUk9SX1JFVFVSTjoKICAgICAgICAgICAgY2FzZSBQRUFSX0VSUk9SX1BSSU5UOgogICAgICAgICAgICBjYXNlIFBFQVJfRVJST1JfVFJJR0dFUjoKICAgICAgICAgICAgY2FzZSBQRUFSX0VSUk9SX0RJRToKICAgICAgICAgICAgY2FzZSBudWxsOgogICAgICAgICAgICAgICAgJHNldG1vZGUgPSAkbW9kZTsKICAgICAgICAgICAgICAgICRzZXRvcHRpb25zID0gJG9wdGlvbnM7CiAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgUEVBUl9FUlJPUl9DQUxMQkFDSzoKICAgICAgICAgICAgICAgICRzZXRtb2RlID0gJG1vZGU7CiAgICAgICAgICAgICAgICAvLyBjbGFzcy9vYmplY3QgbWV0aG9kIGNhbGxiYWNrCiAgICAgICAgICAgICAgICBpZiAoaXNfY2FsbGFibGUoJG9wdGlvbnMpKSB7CiAgICAgICAgICAgICAgICAgICAgJHNldG9wdGlvbnMgPSAkb3B0aW9uczsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdHJpZ2dlcl9lcnJvcigiaW52YWxpZCBlcnJvciBjYWxsYmFjayIsIEVfVVNFUl9XQVJOSU5HKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIHRyaWdnZXJfZXJyb3IoImludmFsaWQgZXJyb3IgbW9kZSIsIEVfVVNFUl9XQVJOSU5HKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICAvLyB7e3sgcHVzaEVycm9ySGFuZGxpbmcoKQoKICAgIC8qKgogICAgICogUHVzaCBhIG5ldyBlcnJvciBoYW5kbGVyIG9uIHRvcCBvZiB0aGUgZXJyb3IgaGFuZGxlciBvcHRpb25zIHN0YWNrLiBXaXRoIHRoaXMKICAgICAqIHlvdSBjYW4gZWFzaWx5IG92ZXJyaWRlIHRoZSBhY3R1YWwgZXJyb3IgaGFuZGxlciBmb3Igc29tZSBjb2RlIGFuZCByZXN0b3JlCiAgICAgKiBpdCBsYXRlciB3aXRoIHBvcEVycm9ySGFuZGxpbmcuCiAgICAgKgogICAgICogQHBhcmFtIG1peGVkICRtb2RlIChzYW1lIGFzIHNldEVycm9ySGFuZGxpbmcpCiAgICAgKiBAcGFyYW0gbWl4ZWQgJG9wdGlvbnMgKHNhbWUgYXMgc2V0RXJyb3JIYW5kbGluZykKICAgICAqCiAgICAgKiBAcmV0dXJuIGJvb2wgQWx3YXlzIHRydWUKICAgICAqCiAgICAgKiBAc2VlIFBFQVI6OnNldEVycm9ySGFuZGxpbmcKICAgICAqLwogICAgZnVuY3Rpb24gcHVzaEVycm9ySGFuZGxpbmcoJG1vZGUsICRvcHRpb25zID0gbnVsbCkKICAgIHsKICAgICAgICAkc3RhY2sgPSAmJEdMT0JBTFNbJ19QRUFSX2Vycm9yX2hhbmRsZXJfc3RhY2snXTsKICAgICAgICBpZiAoaXNzZXQoJHRoaXMpICYmIGlzX2EoJHRoaXMsICdQRUFSJykpIHsKICAgICAgICAgICAgJGRlZl9tb2RlICAgID0gJiR0aGlzLT5fZGVmYXVsdF9lcnJvcl9tb2RlOwogICAgICAgICAgICAkZGVmX29wdGlvbnMgPSAmJHRoaXMtPl9kZWZhdWx0X2Vycm9yX29wdGlvbnM7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJGRlZl9tb2RlICAgID0gJiRHTE9CQUxTWydfUEVBUl9kZWZhdWx0X2Vycm9yX21vZGUnXTsKICAgICAgICAgICAgJGRlZl9vcHRpb25zID0gJiRHTE9CQUxTWydfUEVBUl9kZWZhdWx0X2Vycm9yX29wdGlvbnMnXTsKICAgICAgICB9CiAgICAgICAgJHN0YWNrW10gPSBhcnJheSgkZGVmX21vZGUsICRkZWZfb3B0aW9ucyk7CgogICAgICAgIGlmIChpc3NldCgkdGhpcykgJiYgaXNfYSgkdGhpcywgJ1BFQVInKSkgewogICAgICAgICAgICAkdGhpcy0+c2V0RXJyb3JIYW5kbGluZygkbW9kZSwgJG9wdGlvbnMpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIFBFQVI6OnNldEVycm9ySGFuZGxpbmcoJG1vZGUsICRvcHRpb25zKTsKICAgICAgICB9CiAgICAgICAgJHN0YWNrW10gPSBhcnJheSgkbW9kZSwgJG9wdGlvbnMpOwogICAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IHBvcEVycm9ySGFuZGxpbmcoKQoKICAgIC8qKgogICAgKiBQb3AgdGhlIGxhc3QgZXJyb3IgaGFuZGxlciB1c2VkCiAgICAqCiAgICAqIEByZXR1cm4gYm9vbCBBbHdheXMgdHJ1ZQogICAgKgogICAgKiBAc2VlIFBFQVI6OnB1c2hFcnJvckhhbmRsaW5nCiAgICAqLwogICAgZnVuY3Rpb24gcG9wRXJyb3JIYW5kbGluZygpCiAgICB7CiAgICAgICAgJHN0YWNrID0gJiRHTE9CQUxTWydfUEVBUl9lcnJvcl9oYW5kbGVyX3N0YWNrJ107CiAgICAgICAgYXJyYXlfcG9wKCRzdGFjayk7CiAgICAgICAgbGlzdCgkbW9kZSwgJG9wdGlvbnMpID0gJHN0YWNrW3NpemVvZigkc3RhY2spIC0gMV07CiAgICAgICAgYXJyYXlfcG9wKCRzdGFjayk7CiAgICAgICAgaWYgKGlzc2V0KCR0aGlzKSAmJiBpc19hKCR0aGlzLCAnUEVBUicpKSB7CiAgICAgICAgICAgICR0aGlzLT5zZXRFcnJvckhhbmRsaW5nKCRtb2RlLCAkb3B0aW9ucyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgUEVBUjo6c2V0RXJyb3JIYW5kbGluZygkbW9kZSwgJG9wdGlvbnMpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICAvLyB9fX0KICAgIC8vIHt7eyBsb2FkRXh0ZW5zaW9uKCkKCiAgICAvKioKICAgICogT1MgaW5kZXBlbmRhbnQgUEhQIGV4dGVuc2lvbiBsb2FkLiBSZW1lbWJlciB0byB0YWtlIGNhcmUKICAgICogb24gdGhlIGNvcnJlY3QgZXh0ZW5zaW9uIG5hbWUgZm9yIGNhc2Ugc2Vuc2l0aXZlIE9TZXMuCiAgICAqCiAgICAqIEBwYXJhbSBzdHJpbmcgJGV4dCBUaGUgZXh0ZW5zaW9uIG5hbWUKICAgICogQHJldHVybiBib29sIFN1Y2Nlc3Mgb3Igbm90IG9uIHRoZSBkbCgpIGNhbGwKICAgICovCiAgICBmdW5jdGlvbiBsb2FkRXh0ZW5zaW9uKCRleHQpCiAgICB7CiAgICAgICAgaWYgKCFleHRlbnNpb25fbG9hZGVkKCRleHQpKSB7CiAgICAgICAgICAgIC8vIGlmIGVpdGhlciByZXR1cm5zIHRydWUgZGwoKSB3aWxsIHByb2R1Y2UgYSBGQVRBTCBlcnJvciwgc3RvcCB0aGF0CiAgICAgICAgICAgIGlmICgoaW5pX2dldCgnZW5hYmxlX2RsJykgIT0gMSkgfHwgKGluaV9nZXQoJ3NhZmVfbW9kZScpID09IDEpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKE9TX1dJTkRPV1MpIHsKICAgICAgICAgICAgICAgICRzdWZmaXggPSAnLmRsbCc7CiAgICAgICAgICAgIH0gZWxzZWlmIChQSFBfT1MgPT0gJ0hQLVVYJykgewogICAgICAgICAgICAgICAgJHN1ZmZpeCA9ICcuc2wnOwogICAgICAgICAgICB9IGVsc2VpZiAoUEhQX09TID09ICdBSVgnKSB7CiAgICAgICAgICAgICAgICAkc3VmZml4ID0gJy5hJzsKICAgICAgICAgICAgfSBlbHNlaWYgKFBIUF9PUyA9PSAnT1NYJykgewogICAgICAgICAgICAgICAgJHN1ZmZpeCA9ICcuYnVuZGxlJzsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICRzdWZmaXggPSAnLnNvJzsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gQGRsKCdwaHBfJy4kZXh0LiRzdWZmaXgpIHx8IEBkbCgkZXh0LiRzdWZmaXgpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICAvLyB9fX0KfQoKLy8ge3t7IF9QRUFSX2NhbGxfZGVzdHJ1Y3RvcnMoKQoKZnVuY3Rpb24gX1BFQVJfY2FsbF9kZXN0cnVjdG9ycygpCnsKICAgIGdsb2JhbCAkX1BFQVJfZGVzdHJ1Y3Rvcl9vYmplY3RfbGlzdDsKICAgIGlmIChpc19hcnJheSgkX1BFQVJfZGVzdHJ1Y3Rvcl9vYmplY3RfbGlzdCkgJiYKICAgICAgICBzaXplb2YoJF9QRUFSX2Rlc3RydWN0b3Jfb2JqZWN0X2xpc3QpKQogICAgewogICAgICAgIHJlc2V0KCRfUEVBUl9kZXN0cnVjdG9yX29iamVjdF9saXN0KTsKICAgICAgICBpZiAoUEVBUjo6Z2V0U3RhdGljUHJvcGVydHkoJ1BFQVInLCAnZGVzdHJ1Y3RsaWZvJykpIHsKICAgICAgICAgICAgJF9QRUFSX2Rlc3RydWN0b3Jfb2JqZWN0X2xpc3QgPSBhcnJheV9yZXZlcnNlKCRfUEVBUl9kZXN0cnVjdG9yX29iamVjdF9saXN0KTsKICAgICAgICB9CiAgICAgICAgd2hpbGUgKGxpc3QoJGssICRvYmpyZWYpID0gZWFjaCgkX1BFQVJfZGVzdHJ1Y3Rvcl9vYmplY3RfbGlzdCkpIHsKICAgICAgICAgICAgJGNsYXNzbmFtZSA9IGdldF9jbGFzcygkb2JqcmVmKTsKICAgICAgICAgICAgd2hpbGUgKCRjbGFzc25hbWUpIHsKICAgICAgICAgICAgICAgICRkZXN0cnVjdG9yID0gIl8kY2xhc3NuYW1lIjsKICAgICAgICAgICAgICAgIGlmIChtZXRob2RfZXhpc3RzKCRvYmpyZWYsICRkZXN0cnVjdG9yKSkgewogICAgICAgICAgICAgICAgICAgICRvYmpyZWYtPiRkZXN0cnVjdG9yKCk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICRjbGFzc25hbWUgPSBnZXRfcGFyZW50X2NsYXNzKCRjbGFzc25hbWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vIEVtcHR5IHRoZSBvYmplY3QgbGlzdCB0byBlbnN1cmUgdGhhdCBkZXN0cnVjdG9ycyBhcmUKICAgICAgICAvLyBub3QgY2FsbGVkIG1vcmUgdGhhbiBvbmNlLgogICAgICAgICRfUEVBUl9kZXN0cnVjdG9yX29iamVjdF9saXN0ID0gYXJyYXkoKTsKICAgIH0KCiAgICAvLyBOb3cgY2FsbCB0aGUgc2h1dGRvd24gZnVuY3Rpb25zCiAgICBpZiAoaXNfYXJyYXkoJEdMT0JBTFNbJ19QRUFSX3NodXRkb3duX2Z1bmNzJ10pIEFORCAhZW1wdHkoJEdMT0JBTFNbJ19QRUFSX3NodXRkb3duX2Z1bmNzJ10pKSB7CiAgICAgICAgZm9yZWFjaCAoJEdMT0JBTFNbJ19QRUFSX3NodXRkb3duX2Z1bmNzJ10gYXMgJHZhbHVlKSB7CiAgICAgICAgICAgIGNhbGxfdXNlcl9mdW5jX2FycmF5KCR2YWx1ZVswXSwgJHZhbHVlWzFdKTsKICAgICAgICB9CiAgICB9Cn0KCi8vIH19fQovKioKICogU3RhbmRhcmQgUEVBUiBlcnJvciBjbGFzcyBmb3IgUEhQIDQKICoKICogVGhpcyBjbGFzcyBpcyBzdXBzZXJzZWRlZCBieSB7QGxpbmsgUEVBUl9FeGNlcHRpb259IGluIFBIUCA1CiAqCiAqIEBjYXRlZ29yeSAgIHBlYXIKICogQHBhY2thZ2UgICAgUEVBUgogKiBAYXV0aG9yICAgICBTdGlnIEJha2tlbiA8c3NiQHBocC5uZXQ+CiAqIEBhdXRob3IgICAgIFRvbWFzIFYuVi4gQ294IDxjb3hAaWRlY25ldC5jb20+CiAqIEBhdXRob3IgICAgIEdyZWdvcnkgQmVhdmVyIDxjZWxsb2dAcGhwLm5ldD4KICogQGNvcHlyaWdodCAgMTk5Ny0yMDA2IFRoZSBQSFAgR3JvdXAKICogQGxpY2Vuc2UgICAgaHR0cDovL3d3dy5waHAubmV0L2xpY2Vuc2UvM18wLnR4dCAgUEhQIExpY2Vuc2UgMy4wCiAqIEB2ZXJzaW9uICAgIFJlbGVhc2U6IDEuNi4yCiAqIEBsaW5rICAgICAgIGh0dHA6Ly9wZWFyLnBocC5uZXQvbWFudWFsL2VuL2NvcmUucGVhci5wZWFyLWVycm9yLnBocAogKiBAc2VlICAgICAgICBQRUFSOjpyYWlzZUVycm9yKCksIFBFQVI6OnRocm93RXJyb3IoKQogKiBAc2luY2UgICAgICBDbGFzcyBhdmFpbGFibGUgc2luY2UgUEhQIDQuMC4yCiAqLwpjbGFzcyBQRUFSX0Vycm9yCnsKICAgIC8vIHt7eyBwcm9wZXJ0aWVzCgogICAgdmFyICRlcnJvcl9tZXNzYWdlX3ByZWZpeCA9ICcnOwogICAgdmFyICRtb2RlICAgICAgICAgICAgICAgICA9IFBFQVJfRVJST1JfUkVUVVJOOwogICAgdmFyICRsZXZlbCAgICAgICAgICAgICAgICA9IEVfVVNFUl9OT1RJQ0U7CiAgICB2YXIgJGNvZGUgICAgICAgICAgICAgICAgID0gLTE7CiAgICB2YXIgJG1lc3NhZ2UgICAgICAgICAgICAgID0gJyc7CiAgICB2YXIgJHVzZXJpbmZvICAgICAgICAgICAgID0gJyc7CiAgICB2YXIgJGJhY2t0cmFjZSAgICAgICAgICAgID0gbnVsbDsKCiAgICAvLyB9fX0KICAgIC8vIHt7eyBjb25zdHJ1Y3RvcgoKICAgIC8qKgogICAgICogUEVBUl9FcnJvciBjb25zdHJ1Y3RvcgogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgJG1lc3NhZ2UgIG1lc3NhZ2UKICAgICAqCiAgICAgKiBAcGFyYW0gaW50ICRjb2RlICAgICAob3B0aW9uYWwpIGVycm9yIGNvZGUKICAgICAqCiAgICAgKiBAcGFyYW0gaW50ICRtb2RlICAgICAob3B0aW9uYWwpIGVycm9yIG1vZGUsIG9uZSBvZjogUEVBUl9FUlJPUl9SRVRVUk4sCiAgICAgKiBQRUFSX0VSUk9SX1BSSU5ULCBQRUFSX0VSUk9SX0RJRSwgUEVBUl9FUlJPUl9UUklHR0VSLAogICAgICogUEVBUl9FUlJPUl9DQUxMQkFDSyBvciBQRUFSX0VSUk9SX0VYQ0VQVElPTgogICAgICoKICAgICAqIEBwYXJhbSBtaXhlZCAkb3B0aW9ucyAgIChvcHRpb25hbCkgZXJyb3IgbGV2ZWwsIF9PUl8gaW4gdGhlIGNhc2Ugb2YKICAgICAqIFBFQVJfRVJST1JfQ0FMTEJBQ0ssIHRoZSBjYWxsYmFjayBmdW5jdGlvbiBvciBvYmplY3QvbWV0aG9kCiAgICAgKiB0dXBsZS4KICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICR1c2VyaW5mbyAob3B0aW9uYWwpIGFkZGl0aW9uYWwgdXNlci9kZWJ1ZyBpbmZvCiAgICAgKgogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqCiAgICAgKi8KICAgIGZ1bmN0aW9uIFBFQVJfRXJyb3IoJG1lc3NhZ2UgPSAndW5rbm93biBlcnJvcicsICRjb2RlID0gbnVsbCwKICAgICAgICAgICAgICAgICAgICAgICAgJG1vZGUgPSBudWxsLCAkb3B0aW9ucyA9IG51bGwsICR1c2VyaW5mbyA9IG51bGwpCiAgICB7CiAgICAgICAgaWYgKCRtb2RlID09PSBudWxsKSB7CiAgICAgICAgICAgICRtb2RlID0gUEVBUl9FUlJPUl9SRVRVUk47CiAgICAgICAgfQogICAgICAgICR0aGlzLT5tZXNzYWdlICAgPSAkbWVzc2FnZTsKICAgICAgICAkdGhpcy0+Y29kZSAgICAgID0gJGNvZGU7CiAgICAgICAgJHRoaXMtPm1vZGUgICAgICA9ICRtb2RlOwogICAgICAgICR0aGlzLT51c2VyaW5mbyAgPSAkdXNlcmluZm87CiAgICAgICAgaWYgKCFQRUFSOjpnZXRTdGF0aWNQcm9wZXJ0eSgnUEVBUl9FcnJvcicsICdza2lwdHJhY2UnKSkgewogICAgICAgICAgICAkdGhpcy0+YmFja3RyYWNlID0gZGVidWdfYmFja3RyYWNlKCk7CiAgICAgICAgICAgIGlmIChpc3NldCgkdGhpcy0+YmFja3RyYWNlWzBdKSAmJiBpc3NldCgkdGhpcy0+YmFja3RyYWNlWzBdWydvYmplY3QnXSkpIHsKICAgICAgICAgICAgICAgIHVuc2V0KCR0aGlzLT5iYWNrdHJhY2VbMF1bJ29iamVjdCddKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoJG1vZGUgJiBQRUFSX0VSUk9SX0NBTExCQUNLKSB7CiAgICAgICAgICAgICR0aGlzLT5sZXZlbCA9IEVfVVNFUl9OT1RJQ0U7CiAgICAgICAgICAgICR0aGlzLT5jYWxsYmFjayA9ICRvcHRpb25zOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmICgkb3B0aW9ucyA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgJG9wdGlvbnMgPSBFX1VTRVJfTk9USUNFOwogICAgICAgICAgICB9CiAgICAgICAgICAgICR0aGlzLT5sZXZlbCA9ICRvcHRpb25zOwogICAgICAgICAgICAkdGhpcy0+Y2FsbGJhY2sgPSBudWxsOwogICAgICAgIH0KICAgICAgICBpZiAoJHRoaXMtPm1vZGUgJiBQRUFSX0VSUk9SX1BSSU5UKSB7CiAgICAgICAgICAgIGlmIChpc19udWxsKCRvcHRpb25zKSB8fCBpc19pbnQoJG9wdGlvbnMpKSB7CiAgICAgICAgICAgICAgICAkZm9ybWF0ID0gIiVzIjsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICRmb3JtYXQgPSAkb3B0aW9uczsKICAgICAgICAgICAgfQogICAgICAgICAgICBwcmludGYoJGZvcm1hdCwgJHRoaXMtPmdldE1lc3NhZ2UoKSk7CiAgICAgICAgfQogICAgICAgIGlmICgkdGhpcy0+bW9kZSAmIFBFQVJfRVJST1JfVFJJR0dFUikgewogICAgICAgICAgICB0cmlnZ2VyX2Vycm9yKCR0aGlzLT5nZXRNZXNzYWdlKCksICR0aGlzLT5sZXZlbCk7CiAgICAgICAgfQogICAgICAgIGlmICgkdGhpcy0+bW9kZSAmIFBFQVJfRVJST1JfRElFKSB7CiAgICAgICAgICAgICRtc2cgPSAkdGhpcy0+Z2V0TWVzc2FnZSgpOwogICAgICAgICAgICBpZiAoaXNfbnVsbCgkb3B0aW9ucykgfHwgaXNfaW50KCRvcHRpb25zKSkgewogICAgICAgICAgICAgICAgJGZvcm1hdCA9ICIlcyI7CiAgICAgICAgICAgICAgICBpZiAoc3Vic3RyKCRtc2csIC0xKSAhPSAiXG4iKSB7CiAgICAgICAgICAgICAgICAgICAgJG1zZyAuPSAiXG4iOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJGZvcm1hdCA9ICRvcHRpb25zOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGRpZShzcHJpbnRmKCRmb3JtYXQsICRtc2cpKTsKICAgICAgICB9CiAgICAgICAgaWYgKCR0aGlzLT5tb2RlICYgUEVBUl9FUlJPUl9DQUxMQkFDSykgewogICAgICAgICAgICBpZiAoaXNfY2FsbGFibGUoJHRoaXMtPmNhbGxiYWNrKSkgewogICAgICAgICAgICAgICAgY2FsbF91c2VyX2Z1bmMoJHRoaXMtPmNhbGxiYWNrLCAkdGhpcyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCR0aGlzLT5tb2RlICYgUEVBUl9FUlJPUl9FWENFUFRJT04pIHsKICAgICAgICAgICAgdHJpZ2dlcl9lcnJvcigiUEVBUl9FUlJPUl9FWENFUFRJT04gaXMgb2Jzb2xldGUsIHVzZSBjbGFzcyBQRUFSX0V4Y2VwdGlvbiBmb3IgZXhjZXB0aW9ucyIsIEVfVVNFUl9XQVJOSU5HKTsKICAgICAgICAgICAgZXZhbCgnJGUgPSBuZXcgRXhjZXB0aW9uKCR0aGlzLT5tZXNzYWdlLCAkdGhpcy0+Y29kZSk7dGhyb3coJGUpOycpOwogICAgICAgIH0KICAgIH0KCiAgICAvLyB9fX0KICAgIC8vIHt7eyBnZXRNb2RlKCkKCiAgICAvKioKICAgICAqIEdldCB0aGUgZXJyb3IgbW9kZSBmcm9tIGFuIGVycm9yIG9iamVjdC4KICAgICAqCiAgICAgKiBAcmV0dXJuIGludCBlcnJvciBtb2RlCiAgICAgKiBAYWNjZXNzIHB1YmxpYwogICAgICovCiAgICBmdW5jdGlvbiBnZXRNb2RlKCkgewogICAgICAgIHJldHVybiAkdGhpcy0+bW9kZTsKICAgIH0KCiAgICAvLyB9fX0KICAgIC8vIHt7eyBnZXRDYWxsYmFjaygpCgogICAgLyoqCiAgICAgKiBHZXQgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uL21ldGhvZCBmcm9tIGFuIGVycm9yIG9iamVjdC4KICAgICAqCiAgICAgKiBAcmV0dXJuIG1peGVkIGNhbGxiYWNrIGZ1bmN0aW9uIG9yIG9iamVjdC9tZXRob2QgYXJyYXkKICAgICAqIEBhY2Nlc3MgcHVibGljCiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldENhbGxiYWNrKCkgewogICAgICAgIHJldHVybiAkdGhpcy0+Y2FsbGJhY2s7CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgZ2V0TWVzc2FnZSgpCgoKICAgIC8qKgogICAgICogR2V0IHRoZSBlcnJvciBtZXNzYWdlIGZyb20gYW4gZXJyb3Igb2JqZWN0LgogICAgICoKICAgICAqIEByZXR1cm4gIHN0cmluZyAgZnVsbCBlcnJvciBtZXNzYWdlCiAgICAgKiBAYWNjZXNzIHB1YmxpYwogICAgICovCiAgICBmdW5jdGlvbiBnZXRNZXNzYWdlKCkKICAgIHsKICAgICAgICByZXR1cm4gKCR0aGlzLT5lcnJvcl9tZXNzYWdlX3ByZWZpeCAuICR0aGlzLT5tZXNzYWdlKTsKICAgIH0KCgogICAgLy8gfX19CiAgICAvLyB7e3sgZ2V0Q29kZSgpCgogICAgLyoqCiAgICAgKiBHZXQgZXJyb3IgY29kZSBmcm9tIGFuIGVycm9yIG9iamVjdAogICAgICoKICAgICAqIEByZXR1cm4gaW50IGVycm9yIGNvZGUKICAgICAqIEBhY2Nlc3MgcHVibGljCiAgICAgKi8KICAgICBmdW5jdGlvbiBnZXRDb2RlKCkKICAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5jb2RlOwogICAgIH0KCiAgICAvLyB9fX0KICAgIC8vIHt7eyBnZXRUeXBlKCkKCiAgICAvKioKICAgICAqIEdldCB0aGUgbmFtZSBvZiB0aGlzIGVycm9yL2V4Y2VwdGlvbi4KICAgICAqCiAgICAgKiBAcmV0dXJuIHN0cmluZyBlcnJvci9leGNlcHRpb24gbmFtZSAodHlwZSkKICAgICAqIEBhY2Nlc3MgcHVibGljCiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldFR5cGUoKQogICAgewogICAgICAgIHJldHVybiBnZXRfY2xhc3MoJHRoaXMpOwogICAgfQoKICAgIC8vIH19fQogICAgLy8ge3t7IGdldFVzZXJJbmZvKCkKCiAgICAvKioKICAgICAqIEdldCBhZGRpdGlvbmFsIHVzZXItc3VwcGxpZWQgaW5mb3JtYXRpb24uCiAgICAgKgogICAgICogQHJldHVybiBzdHJpbmcgdXNlci1zdXBwbGllZCBpbmZvcm1hdGlvbgogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqLwogICAgZnVuY3Rpb24gZ2V0VXNlckluZm8oKQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+dXNlcmluZm87CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgZ2V0RGVidWdJbmZvKCkKCiAgICAvKioKICAgICAqIEdldCBhZGRpdGlvbmFsIGRlYnVnIGluZm9ybWF0aW9uIHN1cHBsaWVkIGJ5IHRoZSBhcHBsaWNhdGlvbi4KICAgICAqCiAgICAgKiBAcmV0dXJuIHN0cmluZyBkZWJ1ZyBpbmZvcm1hdGlvbgogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqLwogICAgZnVuY3Rpb24gZ2V0RGVidWdJbmZvKCkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmdldFVzZXJJbmZvKCk7CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgZ2V0QmFja3RyYWNlKCkKCiAgICAvKioKICAgICAqIEdldCB0aGUgY2FsbCBiYWNrdHJhY2UgZnJvbSB3aGVyZSB0aGUgZXJyb3Igd2FzIGdlbmVyYXRlZC4KICAgICAqIFN1cHBvcnRlZCB3aXRoIFBIUCA0LjMuMCBvciBuZXdlci4KICAgICAqCiAgICAgKiBAcGFyYW0gaW50ICRmcmFtZSAob3B0aW9uYWwpIHdoYXQgZnJhbWUgdG8gZmV0Y2gKICAgICAqIEByZXR1cm4gYXJyYXkgQmFja3RyYWNlLCBvciBOVUxMIGlmIG5vdCBhdmFpbGFibGUuCiAgICAgKiBAYWNjZXNzIHB1YmxpYwogICAgICovCiAgICBmdW5jdGlvbiBnZXRCYWNrdHJhY2UoJGZyYW1lID0gbnVsbCkKICAgIHsKICAgICAgICBpZiAoZGVmaW5lZCgnUEVBUl9JR05PUkVfQkFDS1RSQUNFJykpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIGlmICgkZnJhbWUgPT09IG51bGwpIHsKICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5iYWNrdHJhY2U7CiAgICAgICAgfQogICAgICAgIHJldHVybiAkdGhpcy0+YmFja3RyYWNlWyRmcmFtZV07CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgYWRkVXNlckluZm8oKQoKICAgIGZ1bmN0aW9uIGFkZFVzZXJJbmZvKCRpbmZvKQogICAgewogICAgICAgIGlmIChlbXB0eSgkdGhpcy0+dXNlcmluZm8pKSB7CiAgICAgICAgICAgICR0aGlzLT51c2VyaW5mbyA9ICRpbmZvOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICR0aGlzLT51c2VyaW5mbyAuPSAiICoqICRpbmZvIjsKICAgICAgICB9CiAgICB9CgogICAgLy8gfX19CiAgICAvLyB7e3sgdG9TdHJpbmcoKQoKICAgIC8qKgogICAgICogTWFrZSBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdC4KICAgICAqCiAgICAgKiBAcmV0dXJuIHN0cmluZyBhIHN0cmluZyB3aXRoIGFuIG9iamVjdCBzdW1tYXJ5CiAgICAgKiBAYWNjZXNzIHB1YmxpYwogICAgICovCiAgICBmdW5jdGlvbiB0b1N0cmluZygpIHsKICAgICAgICAkbW9kZXMgPSBhcnJheSgpOwogICAgICAgICRsZXZlbHMgPSBhcnJheShFX1VTRVJfTk9USUNFICA9PiAnbm90aWNlJywKICAgICAgICAgICAgICAgICAgICAgICAgRV9VU0VSX1dBUk5JTkcgPT4gJ3dhcm5pbmcnLAogICAgICAgICAgICAgICAgICAgICAgICBFX1VTRVJfRVJST1IgICA9PiAnZXJyb3InKTsKICAgICAgICBpZiAoJHRoaXMtPm1vZGUgJiBQRUFSX0VSUk9SX0NBTExCQUNLKSB7CiAgICAgICAgICAgIGlmIChpc19hcnJheSgkdGhpcy0+Y2FsbGJhY2spKSB7CiAgICAgICAgICAgICAgICAkY2FsbGJhY2sgPSAoaXNfb2JqZWN0KCR0aGlzLT5jYWxsYmFja1swXSkgPwogICAgICAgICAgICAgICAgICAgIHN0cnRvbG93ZXIoZ2V0X2NsYXNzKCR0aGlzLT5jYWxsYmFja1swXSkpIDoKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+Y2FsbGJhY2tbMF0pIC4gJzo6JyAuCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmNhbGxiYWNrWzFdOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJGNhbGxiYWNrID0gJHRoaXMtPmNhbGxiYWNrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBzcHJpbnRmKCdbJXM6IG1lc3NhZ2U9IiVzIiBjb2RlPSVkIG1vZGU9Y2FsbGJhY2sgJy4KICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NhbGxiYWNrPSVzIHByZWZpeD0iJXMiIGluZm89IiVzIl0nLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ0b2xvd2VyKGdldF9jbGFzcygkdGhpcykpLCAkdGhpcy0+bWVzc2FnZSwgJHRoaXMtPmNvZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICRjYWxsYmFjaywgJHRoaXMtPmVycm9yX21lc3NhZ2VfcHJlZml4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+dXNlcmluZm8pOwogICAgICAgIH0KICAgICAgICBpZiAoJHRoaXMtPm1vZGUgJiBQRUFSX0VSUk9SX1BSSU5UKSB7CiAgICAgICAgICAgICRtb2Rlc1tdID0gJ3ByaW50JzsKICAgICAgICB9CiAgICAgICAgaWYgKCR0aGlzLT5tb2RlICYgUEVBUl9FUlJPUl9UUklHR0VSKSB7CiAgICAgICAgICAgICRtb2Rlc1tdID0gJ3RyaWdnZXInOwogICAgICAgIH0KICAgICAgICBpZiAoJHRoaXMtPm1vZGUgJiBQRUFSX0VSUk9SX0RJRSkgewogICAgICAgICAgICAkbW9kZXNbXSA9ICdkaWUnOwogICAgICAgIH0KICAgICAgICBpZiAoJHRoaXMtPm1vZGUgJiBQRUFSX0VSUk9SX1JFVFVSTikgewogICAgICAgICAgICAkbW9kZXNbXSA9ICdyZXR1cm4nOwogICAgICAgIH0KICAgICAgICByZXR1cm4gc3ByaW50ZignWyVzOiBtZXNzYWdlPSIlcyIgY29kZT0lZCBtb2RlPSVzIGxldmVsPSVzICcuCiAgICAgICAgICAgICAgICAgICAgICAgJ3ByZWZpeD0iJXMiIGluZm89IiVzIl0nLAogICAgICAgICAgICAgICAgICAgICAgIHN0cnRvbG93ZXIoZ2V0X2NsYXNzKCR0aGlzKSksICR0aGlzLT5tZXNzYWdlLCAkdGhpcy0+Y29kZSwKICAgICAgICAgICAgICAgICAgICAgICBpbXBsb2RlKCJ8IiwgJG1vZGVzKSwgJGxldmVsc1skdGhpcy0+bGV2ZWxdLAogICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5lcnJvcl9tZXNzYWdlX3ByZWZpeCwKICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+dXNlcmluZm8pOwogICAgfQoKICAgIC8vIH19fQp9CgovKgogKiBMb2NhbCBWYXJpYWJsZXM6CiAqIG1vZGU6IHBocAogKiB0YWItd2lkdGg6IDQKICogYy1iYXNpYy1vZmZzZXQ6IDQKICogRW5kOgogKi8KPz4K]]></data>
	</file>
	<file>
	  <filename>/lib/pear/tests/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/pear/tests/db_error.phpt</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LS1URVNULS0KREI6OkRCX0Vycm9yCi0tU0tJUElGLS0KPD9waHAgY2hkaXIoZGlybmFtZShfX0ZJTEVfXykpOyByZXF1aXJlX29uY2UgJy4vc2tpcGlmLmluYyc7ID8+Ci0tRklMRS0tCjw/cGhwIC8vIC0qLSBDKysgLSotCnJlcXVpcmVfb25jZSAnLi9pbmNsdWRlLmluYyc7CnJlcXVpcmVfb25jZSAnREIucGhwJzsKCmZ1bmN0aW9uIHRlc3RfZXJyb3JfaGFuZGxlcigkZXJybm8sICRlcnJtc2csICRmaWxlLCAkbGluZSwgJHZhcnMpIHsKICAgIGlmIChkZWZpbmVkKCdFX1NUUklDVCcpKSB7CiAgICAgICAgaWYgKCRlcnJubyAmIEVfU1RSSUNUCiAgICAgICAgICAgICYmIChlcnJvcl9yZXBvcnRpbmcoKSAmIEVfU1RSSUNUKSAhPSBFX1NUUklDVCkgewogICAgICAgICAgICAvLyBJZ25vcmUgRV9TVFJJQ1Qgbm90aWNlcyB1bmxlc3MgdGhleSBoYXZlIGJlZW4gdHVybmVkIG9uCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9IGVsc2UgewogICAgICAgIGRlZmluZSgnRV9TVFJJQ1QnLCAyMDQ4KTsKICAgIH0KICAgICRlcnJvcnR5cGUgPSBhcnJheSAoCiAgICAgICAgRV9FUlJPUiA9PiAnRXJyb3InLAogICAgICAgIEVfV0FSTklORyA9PiAnV2FybmluZycsCiAgICAgICAgRV9QQVJTRSA9PiAnUGFyc2luZyBFcnJvcicsCiAgICAgICAgRV9OT1RJQ0UgPT4gJ05vdGljZScsCiAgICAgICAgRV9DT1JFX0VSUk9SID0+ICdDb3JlIEVycm9yJywKICAgICAgICBFX0NPUkVfV0FSTklORyA9PiAnQ29yZSBXYXJuaW5nJywKICAgICAgICBFX0NPTVBJTEVfRVJST1IgPT4gJ0NvbXBpbGUgRXJyb3InLAogICAgICAgIEVfQ09NUElMRV9XQVJOSU5HID0+ICdDb21waWxlIFdhcm5pbmcnLAogICAgICAgIEVfVVNFUl9FUlJPUiA9PiAnVXNlciBFcnJvcicsCiAgICAgICAgRV9VU0VSX1dBUk5JTkcgPT4gJ1VzZXIgV2FybmluZycsCiAgICAgICAgRV9VU0VSX05PVElDRSA9PiAnVXNlciBOb3RpY2UnLAogICAgICAgIEVfU1RSSUNUID0+ICdTdHJpY3QgTm90aWNlJywKICAgICk7CiAgICAkcHJlZml4ID0gJGVycm9ydHlwZVskZXJybm9dOwogICAgcHJpbnQgIlxuJHByZWZpeDogJGVycm1zZyBpbiAiIC4gYmFzZW5hbWUoJGZpbGUpIC4gIiBvbiBsaW5lIFhYWFxuIjsKfQoKZXJyb3JfcmVwb3J0aW5nKEVfQUxMKTsKc2V0X2Vycm9yX2hhbmRsZXIoJ3Rlc3RfZXJyb3JfaGFuZGxlcicpOwoKcHJpbnQgInRlc3RpbmcgZGlmZmVyZW50IGVycm9yIGNvZGVzLi4uXG4iOwokZSA9IG5ldyBEQl9FcnJvcigpOyBwcmludCBzdHJ0b2xvd2VyKCRlLT50b1N0cmluZygpKS4iXG4iOwokZSA9IG5ldyBEQl9FcnJvcigidGVzdCBlcnJvciIpOyBwcmludCBzdHJ0b2xvd2VyKCRlLT50b1N0cmluZygpKS4iXG4iOwokZSA9IG5ldyBEQl9FcnJvcihEQl9PSyk7IHByaW50IHN0cnRvbG93ZXIoJGUtPnRvU3RyaW5nKCkpLiJcbiI7CiRlID0gbmV3IERCX0Vycm9yKERCX0VSUk9SKTsgcHJpbnQgc3RydG9sb3dlcigkZS0+dG9TdHJpbmcoKSkuIlxuIjsKJGUgPSBuZXcgREJfRXJyb3IoREJfRVJST1JfU1lOVEFYKTsgcHJpbnQgc3RydG9sb3dlcigkZS0+dG9TdHJpbmcoKSkuIlxuIjsKJGUgPSBuZXcgREJfRXJyb3IoREJfRVJST1JfRElWWkVSTyk7IHByaW50IHN0cnRvbG93ZXIoJGUtPnRvU3RyaW5nKCkpLiJcbiI7CgpwcmludCAidGVzdGluZyBkaWZmZXJlbnQgZXJyb3IgbW9kZXMuLi5cbiI7CiRlID0gbmV3IERCX0Vycm9yKERCX0VSUk9SLCBQRUFSX0VSUk9SX1BSSU5UKTsgcHJpbnQgc3RydG9sb3dlcigkZS0+dG9TdHJpbmcoKSkuIlxuIjsKJGUgPSBuZXcgREJfRXJyb3IoREJfRVJST1JfU1lOVEFYLCBQRUFSX0VSUk9SX1RSSUdHRVIpOwoKcHJpbnQgInRlc3RpbmcgZGlmZmVyZW50IGVycm9yIHNlcnZlcml0aWVzLi4uXG4iOwokZSA9IG5ldyBEQl9FcnJvcihEQl9FUlJPUl9TWU5UQVgsIFBFQVJfRVJST1JfVFJJR0dFUiwgRV9VU0VSX05PVElDRSk7CiRlID0gbmV3IERCX0Vycm9yKERCX0VSUk9SX1NZTlRBWCwgUEVBUl9FUlJPUl9UUklHR0VSLCBFX1VTRVJfV0FSTklORyk7CiRlID0gbmV3IERCX0Vycm9yKERCX0VSUk9SX1NZTlRBWCwgUEVBUl9FUlJPUl9UUklHR0VSLCBFX1VTRVJfRVJST1IpOwoKPz4KLS1HRVQtLQotLVBPU1QtLQotLUVYUEVDVC0tCnRlc3RpbmcgZGlmZmVyZW50IGVycm9yIGNvZGVzLi4uCltkYl9lcnJvcjogbWVzc2FnZT0iZGIgZXJyb3I6IHVua25vd24gZXJyb3IiIGNvZGU9LTEgbW9kZT1yZXR1cm4gbGV2ZWw9bm90aWNlIHByZWZpeD0iIiBpbmZvPSIiXQpbZGJfZXJyb3I6IG1lc3NhZ2U9ImRiIGVycm9yOiB0ZXN0IGVycm9yIiBjb2RlPS0xIG1vZGU9cmV0dXJuIGxldmVsPW5vdGljZSBwcmVmaXg9IiIgaW5mbz0iIl0KW2RiX2Vycm9yOiBtZXNzYWdlPSJkYiBlcnJvcjogbm8gZXJyb3IiIGNvZGU9MSBtb2RlPXJldHVybiBsZXZlbD1ub3RpY2UgcHJlZml4PSIiIGluZm89IiJdCltkYl9lcnJvcjogbWVzc2FnZT0iZGIgZXJyb3I6IHVua25vd24gZXJyb3IiIGNvZGU9LTEgbW9kZT1yZXR1cm4gbGV2ZWw9bm90aWNlIHByZWZpeD0iIiBpbmZvPSIiXQpbZGJfZXJyb3I6IG1lc3NhZ2U9ImRiIGVycm9yOiBzeW50YXggZXJyb3IiIGNvZGU9LTIgbW9kZT1yZXR1cm4gbGV2ZWw9bm90aWNlIHByZWZpeD0iIiBpbmZvPSIiXQpbZGJfZXJyb3I6IG1lc3NhZ2U9ImRiIGVycm9yOiBkaXZpc2lvbiBieSB6ZXJvIiBjb2RlPS0xMyBtb2RlPXJldHVybiBsZXZlbD1ub3RpY2UgcHJlZml4PSIiIGluZm89IiJdCnRlc3RpbmcgZGlmZmVyZW50IGVycm9yIG1vZGVzLi4uCkRCIEVycm9yOiB1bmtub3duIGVycm9yW2RiX2Vycm9yOiBtZXNzYWdlPSJkYiBlcnJvcjogdW5rbm93biBlcnJvciIgY29kZT0tMSBtb2RlPXByaW50IGxldmVsPW5vdGljZSBwcmVmaXg9IiIgaW5mbz0iIl0KClVzZXIgTm90aWNlOiBEQiBFcnJvcjogc3ludGF4IGVycm9yIGluIFBFQVIucGhwIG9uIGxpbmUgWFhYCnRlc3RpbmcgZGlmZmVyZW50IGVycm9yIHNlcnZlcml0aWVzLi4uCgpVc2VyIE5vdGljZTogREIgRXJyb3I6IHN5bnRheCBlcnJvciBpbiBQRUFSLnBocCBvbiBsaW5lIFhYWAoKVXNlciBXYXJuaW5nOiBEQiBFcnJvcjogc3ludGF4IGVycm9yIGluIFBFQVIucGhwIG9uIGxpbmUgWFhYCgpVc2VyIEVycm9yOiBEQiBFcnJvcjogc3ludGF4IGVycm9yIGluIFBFQVIucGhwIG9uIGxpbmUgWFhYCg==]]></data>
	</file>
	<file>
	  <filename>/lib/pear/tests/db_error2.phpt</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LS1URVNULS0KREI6OkVycm9yIDIKLS1TS0lQSUYtLQo8P3BocCBjaGRpcihkaXJuYW1lKF9fRklMRV9fKSk7IHJlcXVpcmVfb25jZSAnLi9za2lwaWYuaW5jJzsgPz4KLS1GSUxFLS0KPD9waHAKcmVxdWlyZV9vbmNlICcuL2luY2x1ZGUuaW5jJzsKcmVxdWlyZV9vbmNlICdEQi5waHAnOwoKZXJyb3JfcmVwb3J0aW5nKEVfQUxMKTsKCmZ1bmN0aW9uIG15ZnVuYygmJG9iaikgewogICAgcHJpbnQgJ215ZnVuYyBoZXJlLCBvYmo9JwogICAgICAgICAgLiBzdHJ0b2xvd2VyKCRvYmotPnRvU3RyaW5nKCkpIC4gIlxuIjsKfQpmdW5jdGlvbiBteWZ1bmMyKCYkb2JqKSB7CiAgICBwcmludCAnbXlmdW5jMiBoZXJlLCBvYmo9JwogICAgICAgICAgLiBzdHJ0b2xvd2VyKCRvYmotPnRvU3RyaW5nKCkpIC4gIlxuIjsKfQpjbGFzcyBteWNsYXNzIHsKICAgIGZ1bmN0aW9uIG15ZnVuYygmJG9iaikgewogICAgICAgIHByaW50ICdteWNsYXNzOjpteWZ1bmMgaGVyZSwgb2JqPScKICAgICAgICAgIC4gc3RydG9sb3dlcigkb2JqLT50b1N0cmluZygpKSAuICJcbiI7CiAgICB9Cn0KZnVuY3Rpb24gdGVzdF9lcnJvcl9oYW5kbGVyKCRlcnJubywgJGVycm1zZywgJGZpbGUsICRsaW5lLCAkdmFycykgewogICAgaWYgKGRlZmluZWQoJ0VfU1RSSUNUJykpIHsKICAgICAgICBpZiAoJGVycm5vICYgRV9TVFJJQ1QKICAgICAgICAgICAgJiYgKGVycm9yX3JlcG9ydGluZygpICYgRV9TVFJJQ1QpICE9IEVfU1RSSUNUKSB7CiAgICAgICAgICAgIC8vIElnbm9yZSBFX1NUUklDVCBub3RpY2VzIHVubGVzcyB0aGV5IGhhdmUgYmVlbiB0dXJuZWQgb24KICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgICAgZGVmaW5lKCdFX1NUUklDVCcsIDIwNDgpOwogICAgfQogICAgJGVycm9ydHlwZSA9IGFycmF5ICgKICAgICAgICBFX0VSUk9SID0+ICdFcnJvcicsCiAgICAgICAgRV9XQVJOSU5HID0+ICdXYXJuaW5nJywKICAgICAgICBFX1BBUlNFID0+ICdQYXJzaW5nIEVycm9yJywKICAgICAgICBFX05PVElDRSA9PiAnTm90aWNlJywKICAgICAgICBFX0NPUkVfRVJST1IgPT4gJ0NvcmUgRXJyb3InLAogICAgICAgIEVfQ09SRV9XQVJOSU5HID0+ICdDb3JlIFdhcm5pbmcnLAogICAgICAgIEVfQ09NUElMRV9FUlJPUiA9PiAnQ29tcGlsZSBFcnJvcicsCiAgICAgICAgRV9DT01QSUxFX1dBUk5JTkcgPT4gJ0NvbXBpbGUgV2FybmluZycsCiAgICAgICAgRV9VU0VSX0VSUk9SID0+ICdVc2VyIEVycm9yJywKICAgICAgICBFX1VTRVJfV0FSTklORyA9PiAnVXNlciBXYXJuaW5nJywKICAgICAgICBFX1VTRVJfTk9USUNFID0+ICdVc2VyIE5vdGljZScsCiAgICAgICAgRV9TVFJJQ1QgPT4gJ1N0cmljdCBOb3RpY2UnLAogICAgKTsKICAgICRwcmVmaXggPSAkZXJyb3J0eXBlWyRlcnJub107CiAgICBwcmludCBzdHJ0b2xvd2VyKCIkcHJlZml4OiAkZXJybXNnIGluICIgLiBiYXNlbmFtZSgkZmlsZSkKICAgICAgICAgICAgICAgICAgICAgLiAiIG9uIGxpbmUgWFhYXG4iKTsKfQoKJG9iaiA9IG5ldyBteWNsYXNzOwoKJGRiaCA9IERCOjpmYWN0b3J5KCJteXNxbCIpOwoKcHJpbnQgImRlZmF1bHQ6ICI7CiRlID0gJGRiaC0+cmFpc2VFcnJvcigicmV0dXJuIHRlc3RpbmcgZXJyb3IiKTsKcHJpbnQgc3RydG9sb3dlcigkZS0+dG9TdHJpbmcoKSkgLiAiXG4iOwoKcHJpbnQgImdsb2JhbCBkZWZhdWx0OiAiOwpQRUFSOjpzZXRFcnJvckhhbmRsaW5nKFBFQVJfRVJST1JfQ0FMTEJBQ0ssICJteWZ1bmMyIik7CiRlID0gJGRiaC0+cmFpc2VFcnJvcigiZ2xvYmFsIGRlZmF1bHQgdGVzdCIpOwoKJGRiaC0+c2V0RXJyb3JIYW5kbGluZyhQRUFSX0VSUk9SX1BSSU5UKTsKcHJpbnQgIm1vZGU9cHJpbnQ6ICI7CiRlID0gJGRiaC0+cmFpc2VFcnJvcigicHJpbnQgdGVzdGluZyBlcnJvciIpOwpwcmludCAiXG4iOwoKJGRiaC0+c2V0RXJyb3JIYW5kbGluZyhQRUFSX0VSUk9SX0NBTExCQUNLLCAibXlmdW5jIik7CnByaW50ICJtb2RlPWZ1bmN0aW9uIGNhbGxiYWNrOiAiOwokZSA9ICRkYmgtPnJhaXNlRXJyb3IoImZ1bmN0aW9uIGNhbGxiYWNrIHRlc3RpbmcgZXJyb3IiKTsKCiRkYmgtPnNldEVycm9ySGFuZGxpbmcoUEVBUl9FUlJPUl9DQUxMQkFDSywgYXJyYXkoJG9iaiwgIm15ZnVuYyIpKTsKcHJpbnQgIm1vZGU9b2JqZWN0IGNhbGxiYWNrOiAiOwokZSA9ICRkYmgtPnJhaXNlRXJyb3IoIm9iamVjdCBjYWxsYmFjayB0ZXN0aW5nIGVycm9yIik7CgpzZXRfZXJyb3JfaGFuZGxlcigidGVzdF9lcnJvcl9oYW5kbGVyIik7CiRkYmgtPnNldEVycm9ySGFuZGxpbmcoUEVBUl9FUlJPUl9UUklHR0VSKTsKcHJpbnQgIm1vZGU9dHJpZ2dlcjogIjsKJGUgPSAkZGJoLT5yYWlzZUVycm9yKCJ0cmlnZ2VyIHRlc3RpbmcgZXJyb3IiKTsKCj8+Ci0tRVhQRUNULS0KZGVmYXVsdDogW2RiX2Vycm9yOiBtZXNzYWdlPSJkYiBlcnJvcjogcmV0dXJuIHRlc3RpbmcgZXJyb3IiIGNvZGU9LTEgbW9kZT1yZXR1cm4gbGV2ZWw9bm90aWNlIHByZWZpeD0iIiBpbmZvPSIgW2RiIGVycm9yOiB1bmtub3duIGVycm9yXSJdCmdsb2JhbCBkZWZhdWx0OiBteWZ1bmMyIGhlcmUsIG9iaj1bZGJfZXJyb3I6IG1lc3NhZ2U9ImRiIGVycm9yOiBnbG9iYWwgZGVmYXVsdCB0ZXN0IiBjb2RlPS0xIG1vZGU9Y2FsbGJhY2sgY2FsbGJhY2s9bXlmdW5jMiBwcmVmaXg9IiIgaW5mbz0iIFtkYiBlcnJvcjogdW5rbm93biBlcnJvcl0iXQptb2RlPXByaW50OiBEQiBFcnJvcjogcHJpbnQgdGVzdGluZyBlcnJvcgptb2RlPWZ1bmN0aW9uIGNhbGxiYWNrOiBteWZ1bmMgaGVyZSwgb2JqPVtkYl9lcnJvcjogbWVzc2FnZT0iZGIgZXJyb3I6IGZ1bmN0aW9uIGNhbGxiYWNrIHRlc3RpbmcgZXJyb3IiIGNvZGU9LTEgbW9kZT1jYWxsYmFjayBjYWxsYmFjaz1teWZ1bmMgcHJlZml4PSIiIGluZm89IiBbZGIgZXJyb3I6IHVua25vd24gZXJyb3JdIl0KbW9kZT1vYmplY3QgY2FsbGJhY2s6IG15Y2xhc3M6Om15ZnVuYyBoZXJlLCBvYmo9W2RiX2Vycm9yOiBtZXNzYWdlPSJkYiBlcnJvcjogb2JqZWN0IGNhbGxiYWNrIHRlc3RpbmcgZXJyb3IiIGNvZGU9LTEgbW9kZT1jYWxsYmFjayBjYWxsYmFjaz1teWNsYXNzOjpteWZ1bmMgcHJlZml4PSIiIGluZm89IiBbZGIgZXJyb3I6IHVua25vd24gZXJyb3JdIl0KbW9kZT10cmlnZ2VyOiB1c2VyIG5vdGljZTogZGIgZXJyb3I6IHRyaWdnZXIgdGVzdGluZyBlcnJvciBpbiBwZWFyLnBocCBvbiBsaW5lIHh4eAo=]]></data>
	</file>
	<file>
	  <filename>/lib/pear/tests/db_factory.phpt</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LS1URVNULS0KREI6OmZhY3RvcnkKLS1TS0lQSUYtLQo8P3BocCBjaGRpcihkaXJuYW1lKF9fRklMRV9fKSk7IHJlcXVpcmVfb25jZSAnLi9za2lwaWYuaW5jJzsgPz4KLS1GSUxFLS0KPD9waHAgLy8gLSotIEMrKyAtKi0KcmVxdWlyZV9vbmNlICcuL2luY2x1ZGUuaW5jJzsKcmVxdWlyZV9vbmNlICdEQi5waHAnOwoKJGJhY2tlbmRzID0gYXJyYXkoCiAgICAnZGJhc2UnLAogICAgJ2Zic3FsJywKICAgICdpYmFzZScsCiAgICAnaWZ4JywKICAgICdtc3FsJywKICAgICdtc3NxbCcsCiAgICAnbXlzcWwnLAogICAgJ215c3FsaScsCiAgICAnb2NpOCcsCiAgICAnb2RiYycsCiAgICAncGdzcWwnLAogICAgJ3NxbGl0ZScsCiAgICAnc3liYXNlJywKKTsKCmZvcmVhY2ggKCRiYWNrZW5kcyBhcyAkbmFtZSkgewogICAgJG9iaiA9IERCOjpmYWN0b3J5KCRuYW1lKTsKCiAgICBwcmludCAidGVzdGluZyAkbmFtZTogIjsKICAgIGlmIChEQjo6aXNFcnJvcigkb2JqKSkgewoJICAgIHByaW50ICdlcnJvcjogJyAuICRvYmotPmdldE1lc3NhZ2UoKSAuICJcbiI7CiAgICB9IGVsc2UgewoJICAgIHByaW50ICdvYmplY3Q6ICcgLiAkb2JqLT50b1N0cmluZygpIC4gIlxuIjsKICAgIH0KfQoKPz4KLS1HRVQtLQotLVBPU1QtLQotLUVYUEVDVC0tCnRlc3RpbmcgZGJhc2U6IG9iamVjdDogZGJfZGJhc2U6IChwaHB0eXBlPWRiYXNlLCBkYnN5bnRheD1kYmFzZSkKdGVzdGluZyBmYnNxbDogb2JqZWN0OiBkYl9mYnNxbDogKHBocHR5cGU9ZmJzcWwsIGRic3ludGF4PWZic3FsKQp0ZXN0aW5nIGliYXNlOiBvYmplY3Q6IGRiX2liYXNlOiAocGhwdHlwZT1pYmFzZSwgZGJzeW50YXg9aWJhc2UpCnRlc3RpbmcgaWZ4OiBvYmplY3Q6IGRiX2lmeDogKHBocHR5cGU9aWZ4LCBkYnN5bnRheD1pZngpCnRlc3RpbmcgbXNxbDogb2JqZWN0OiBkYl9tc3FsOiAocGhwdHlwZT1tc3FsLCBkYnN5bnRheD1tc3FsKQp0ZXN0aW5nIG1zc3FsOiBvYmplY3Q6IGRiX21zc3FsOiAocGhwdHlwZT1tc3NxbCwgZGJzeW50YXg9bXNzcWwpCnRlc3RpbmcgbXlzcWw6IG9iamVjdDogZGJfbXlzcWw6IChwaHB0eXBlPW15c3FsLCBkYnN5bnRheD1teXNxbCkKdGVzdGluZyBteXNxbGk6IG9iamVjdDogZGJfbXlzcWxpOiAocGhwdHlwZT1teXNxbGksIGRic3ludGF4PW15c3FsaSkKdGVzdGluZyBvY2k4OiBvYmplY3Q6IGRiX29jaTg6IChwaHB0eXBlPW9jaTgsIGRic3ludGF4PW9jaTgpCnRlc3Rpbmcgb2RiYzogb2JqZWN0OiBkYl9vZGJjOiAocGhwdHlwZT1vZGJjLCBkYnN5bnRheD1zcWw5MikKdGVzdGluZyBwZ3NxbDogb2JqZWN0OiBkYl9wZ3NxbDogKHBocHR5cGU9cGdzcWwsIGRic3ludGF4PXBnc3FsKQp0ZXN0aW5nIHNxbGl0ZTogb2JqZWN0OiBkYl9zcWxpdGU6IChwaHB0eXBlPXNxbGl0ZSwgZGJzeW50YXg9c3FsaXRlKQp0ZXN0aW5nIHN5YmFzZTogb2JqZWN0OiBkYl9zeWJhc2U6IChwaHB0eXBlPXN5YmFzZSwgZGJzeW50YXg9c3liYXNlKQo=]]></data>
	</file>
	<file>
	  <filename>/lib/pear/tests/db_ismanip.phpt</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LS1URVNULS0KREI6OmlzTWFuaXAKLS1TS0lQSUYtLQo8P3BocCBjaGRpcihkaXJuYW1lKF9fRklMRV9fKSk7IHJlcXVpcmVfb25jZSAnLi9za2lwaWYuaW5jJzsgPz4KLS1GSUxFLS0KPD9waHAgLy8gLSotIEMrKyAtKi0KcmVxdWlyZV9vbmNlICcuL2luY2x1ZGUuaW5jJzsKcmVxdWlyZV9vbmNlICdEQi5waHAnOwoKZnVuY3Rpb24gdGVzdCgkcXVlcnkpIHsKICAgIHByaW50ZigiJXMgOiAlZFxuIiwgcHJlZ19yZXBsYWNlKCcvXHMrLiovJywgJycsICRxdWVyeSksCiAgICAgICAgICAgREI6OmlzTWFuaXAoJHF1ZXJ5KSk7Cn0KCnByaW50ICJ0ZXN0aW5nIERCOjppc01hbmlwLi4uXG4iOwoKdGVzdCgiU0VMRUNUICogRlJPTSB0YWJsZSIpOwp0ZXN0KCJTZWxlY3QgKiBmcm9tIHRhYmxlIik7CnRlc3QoInNlbGVjdCAqIEZyb20gdGFibGUiKTsKdGVzdCgic0VsRUN0ICogZnJPbSB0YWJsZSIpOwp0ZXN0KCJTRUxFQ1QgRElTVElOQ1QgbmFtZSBGUk9NIHRhYmxlIik7CnRlc3QoIlNFTEVDVCBhLCBiIElOVE8gdGFibGUyIEZST00gdGFibGUxIik7CnRlc3QoIlNFTEVDVCBhLCBiIEZST00gdGFibGUgV0hFUkUgYiA9ICcgSU5UTyAnIik7CnRlc3QoIlVQREFURSB0YWJsZSBTRVQgZm9vID0gJ2JhciciKTsKdGVzdCgiREVMRVRFIEZST00gdGFibGUiKTsKdGVzdCgiZGVsZXRlIGZyb20gdGFibGUgd2hlcmUgaWQgaXMgbnVsbCIpOwp0ZXN0KCJjcmVhdGUgdGFibGUgKGlkIGludGVnZXIsIG5hbWUgdmFyY2hhcigxMDApKSIpOwp0ZXN0KCJDUkVBVEUgU0VRVUVOQ0UgZm9vIik7CnRlc3QoIlwiQ1JFQVRFIFBST0NFRFVSRSBmb29cIiIpOwp0ZXN0KCJHUkFOVCBTRUxFQ1QgT04gdGFibGUgVE8gdXNlciIpOwp0ZXN0KCJSRVZPS0UgU0VMRUNUIE9OIHRhYmxlIEZST00gdXNlciIpOwp0ZXN0KCJTSE9XIE9QVElPTlMiKTsKdGVzdCgiRFJPUCBUQUJMRSBmb28iKTsKdGVzdCgiQUxURVIgVEFCTEUgZm9vIEFERCBDT0xVTU4gKGJhciBJTlRFR0VSKSIpOwp0ZXN0KCIgIFNFTEVDVCAqIEZST00gdGFibGUiKTsKdGVzdCgiICBERUxFVEUgRlJPTSB0YWJsZSIpOwo/PgotLUdFVC0tCi0tUE9TVC0tCi0tRVhQRUNULS0KdGVzdGluZyBEQjo6aXNNYW5pcC4uLgpTRUxFQ1QgOiAwClNlbGVjdCA6IDAKc2VsZWN0IDogMApzRWxFQ3QgOiAwClNFTEVDVCA6IDAKU0VMRUNUIDogMQpTRUxFQ1QgOiAwClVQREFURSA6IDEKREVMRVRFIDogMQpkZWxldGUgOiAxCmNyZWF0ZSA6IDEKQ1JFQVRFIDogMQoiQ1JFQVRFIDogMQpHUkFOVCA6IDEKUkVWT0tFIDogMQpTSE9XIDogMApEUk9QIDogMQpBTFRFUiA6IDEKIDogMAogOiAxCg==]]></data>
	</file>
	<file>
	  <filename>/lib/pear/tests/db_parsedsn.phpt</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LS1URVNULS0KREI6OnBhcnNlRFNOCi0tU0tJUElGLS0KPD9waHAgY2hkaXIoZGlybmFtZShfX0ZJTEVfXykpOyByZXF1aXJlX29uY2UgJy4vc2tpcGlmLmluYyc7ID8+Ci0tRklMRS0tCjw/cGhwIC8vIC0qLSBDKysgLSotCnJlcXVpcmVfb25jZSAnLi9pbmNsdWRlLmluYyc7CnJlcXVpcmVfb25jZSAnREIucGhwJzsKCmZ1bmN0aW9uIHJlcGFyc2VEU04oJGRzbikgewogICAgJHBhcnNlZCA9IERCOjpwYXJzZURTTigkZHNuKTsKICAgICRyZXBhcnNlZCA9IERCOjpwYXJzZURTTihEQjo6Z2V0RFNOU3RyaW5nKCRkc24sIGZhbHNlKSk7CiAgICBpZiAoY291bnQoJGRpZmYgPSBhcnJheV9kaWZmKCRwYXJzZWQsICRyZXBhcnNlZCkpID4gMCkgewogICAgICAgIGVjaG8gIlBhcnNpbmcgdGhlIG9yaWdpbmFsIERTTiBhbmQgdGhlIERTTiBnZW5lcmF0ZWQgYnkgZ2V0RFNOU3RyaW5nIHJlc3VsdHMgaW4gZGlmZmVyZW5jZXM6XG4iOwogICAgICAgIHByaW50ZigiJS0yMHMlLTI5cyUtMjlzXG4iLCAnRmllbGQnLCAnUGFyc2VkJywgJ1JlcGFyc2VkJyk7CiAgICAgICAgcHJpbnRmKCIlLTIwcyUtMjlzJS0yOXNcbiIsICctLS0tLScsICctLS0tLS0nLCAnLS0tLS0tLS0nKTsKICAgICAgICBmb3JlYWNoICgkcGFyc2VkIGFzICRrZXkgPT4gJHZhbHVlKSB7CiAgICAgICAgICAgIHByaW50ZigiJS0yMHMlLTI5cyUtMjlzXG4iLCAka2V5LCAkdmFsdWUsICRyZXBhcnNlZFska2V5XSk7CiAgICAgICAgfQogICAgICAgIGVjaG8gIlRoZSByZXBhcnNlZCBEU04gd2FzOiAiLkRCOjpnZXREU05TdHJpbmcoJGRzbiwgZmFsc2UpLiJcbiI7CiAgICB9Cn0KCmZ1bmN0aW9uIHRlc3QoJGRzbikgewogICAgZWNobyAiRFNOOiAkZHNuXG4iOwogICAgcHJpbnRfcihEQjo6cGFyc2VEU04oJGRzbikpOwogICAgcmVwYXJzZURTTigkZHNuKTsKfQoKZnVuY3Rpb24gdGVzdEFycmF5KCRkc24pIHsKICAgIGVjaG8gIkRTTjogYXJyYXlcbiI7CiAgICBwcmludF9yKERCOjpwYXJzZURTTigkZHNuKSk7CiAgICByZXBhcnNlRFNOKCRkc24pOwp9CgpwcmludCAidGVzdGluZyBEQjo6cGFyc2VEU04uLi5cblxuIjsKCnRlc3QoIm15c3FsIik7CnRlc3QoIm9kYmMobXNzcWwpIik7CnRlc3QoJ29kYmMoZGIyKTovL3VzZXI6cGFzc3dvcmRAL2RhdGFiYXNlJyk7CnRlc3QoJ29kYmMoYWNjZXNzKTovLy9kYXRhYmFzZScpOwp0ZXN0KCdvZGJjOi8vYWRtaW5AL2RhdGFzb3VyY2VOYW1lJyk7CnRlc3QoIm15c3FsOi8vbG9jYWxob3N0Iik7CnRlc3QoIm15c3FsOi8vcmVtb3RlLmhvc3QuY29tL2RiIik7CnRlc3QoIm9jaTg6Ly9zeXN0ZW06bWFuYWdlckAiKTsKdGVzdCgib2NpODovL3VzZXI6cGFzc0B0bnMtbmFtZSIpOwp0ZXN0KCJvZGJjKHNvbGlkKTovL2ZvbzpiYXJAdGNwK2xvY2FsaG9zdCsxMzEzIik7ICAvLyBkZXByZWNhdGVkCnRlc3QoInBnc3FsOi8vdXNlckB1bml4K2xvY2FsaG9zdC9wZWFyIik7ICAgICAgICAgIC8vIGRlcHJlY2F0ZWQKdGVzdCgiaWJhc2U6Ly91c2VyJTQwZG9tYWluOnBhc3N3b3JkQGhvc3QiKTsKdGVzdCgiaWJhc2U6Ly91c2VyQGRvbWFpbjpwYXNzQHdvcmRAL2RhdGFiYXNlIik7ICAgLy8gYWxzbyBzdXBwb3J0ZWQKdGVzdCgiaWZ4Oi8vdXNlckBkb21haW46cGFzc0B3b3JkQGhvc3QuY29tLy91c3IvZGIvZ2VuZXJhbC5kYiIpOwp0ZXN0KCdpZng6Ly9yZW1vdGUuaG9zdC5jb20vYzpcd2luZG93c1xteS5kYicpOwp0ZXN0KCdvY2k4Oi8vU0hPT1RPVVQ6KioqKioqQChERVNDUklQVElPTj0oQUREUkVTU19MSVNUPShBRERSRVNTPShQUk9UT0NPTD1UQ1ApKEhPU1Q9MTkyLjE2OC4xMDEuMTYxKShQT1JUPTE1MjEpKSkoQ09OTkVDVF9EQVRBPShTRVJWSUNFX05BTUU9VElTKSkpJyk7CgovLyBuZXcgZm9ybWF0cwp0ZXN0KCJvZGJjKHNvbGlkKTovL2ZvbzpiYXJAbG9jYWxob3N0OjEzMTMiKTsKdGVzdCgicGdzcWw6Ly91c2VyQHVuaXgoKS9wZWFyIik7CnRlc3QoIm15c3FsOi8vdXNlckB1bml4KC9wYXRoL3RvL3NvY2tldCkvcGVhciIpOwp0ZXN0KCJwZ3NxbDovL3VzZXJAdGNwKCkvcGVhciIpOwp0ZXN0KCJwZ3NxbDovL3VzZXJAdGNwKHNvbWVob3N0KS9wZWFyIik7CnRlc3QoInBnc3FsOi8vdXNlcjpwYXNzQHdvcmRAdGNwKHNvbWVob3N0Ojc3NzcpL3BlYXIiKTsKCi8vIHNwZWNpYWwgYmFja2VuZCBvcHRpb25zCnRlc3QoJ2liYXNlOi8vdXNlcjpwYXNzQGxvY2FsaG9zdC8vdmFyL2xpYi9kYmFzZS5kYmY/cm9sZT1mb28nKTsKdGVzdCgnZGJhc2U6Ly9ALz9yb2xlPWZvbyZkaWFsZWN0PWJhcicpOwp0ZXN0KCdzcWxpdGU6Ly8vL3VuaXgvcGF0aC90by9kYXRhYmFzZT9vcHRpb249dmFsdWUmYW5vdGhlcm9wdGlvbj1hbm90aGVydmFsdWUnKTsKdGVzdCgnc3FsaXRlOi8vL2M6L3dpbi9wYXRoL3RvL2RhdGFiYXNlP29wdGlvbj12YWx1ZScpOwoKLy8gc29tZSBleGFtcGxlcyBmcm9tIG1hbnVhbAp0ZXN0KCdteXNxbDovL3VzZXJuYW1lQGhvc3RzcGVjJyk7CnRlc3QoJ215c3FsOi8vaG9zdHNwZWMvZGF0YWJhc2UnKTsKdGVzdCgnbXlzcWw6Ly9ob3N0c3BlYycpOwp0ZXN0KCdteXNxbDovLy9kYXRhYmFzZScpOwoKLy8gYXJyYXkgdGVzdHMKJGFycmF5ID0gYXJyYXkoCiAgICAncGhwdHlwZScgID0+ICdteXNxbCcsCiAgICAnaG9zdHNwZWMnID0+ICdmb29iYXInLAopOwp0ZXN0QXJyYXkoJGFycmF5KTsKCj8+Ci0tR0VULS0KLS1QT1NULS0KLS1FWFBFQ1QtLQp0ZXN0aW5nIERCOjpwYXJzZURTTi4uLgoKRFNOOiBteXNxbApBcnJheQooCiAgICBbcGhwdHlwZV0gPT4gbXlzcWwKICAgIFtkYnN5bnRheF0gPT4gbXlzcWwKICAgIFt1c2VybmFtZV0gPT4gCiAgICBbcGFzc3dvcmRdID0+IAogICAgW3Byb3RvY29sXSA9PiAKICAgIFtob3N0c3BlY10gPT4gCiAgICBbcG9ydF0gPT4gCiAgICBbc29ja2V0XSA9PiAKICAgIFtkYXRhYmFzZV0gPT4gCikKRFNOOiBvZGJjKG1zc3FsKQpBcnJheQooCiAgICBbcGhwdHlwZV0gPT4gb2RiYwogICAgW2Ric3ludGF4XSA9PiBtc3NxbAogICAgW3VzZXJuYW1lXSA9PiAKICAgIFtwYXNzd29yZF0gPT4gCiAgICBbcHJvdG9jb2xdID0+IAogICAgW2hvc3RzcGVjXSA9PiAKICAgIFtwb3J0XSA9PiAKICAgIFtzb2NrZXRdID0+IAogICAgW2RhdGFiYXNlXSA9PiAKKQpEU046IG9kYmMoZGIyKTovL3VzZXI6cGFzc3dvcmRAL2RhdGFiYXNlCkFycmF5CigKICAgIFtwaHB0eXBlXSA9PiBvZGJjCiAgICBbZGJzeW50YXhdID0+IGRiMgogICAgW3VzZXJuYW1lXSA9PiB1c2VyCiAgICBbcGFzc3dvcmRdID0+IHBhc3N3b3JkCiAgICBbcHJvdG9jb2xdID0+IHRjcAogICAgW2hvc3RzcGVjXSA9PiAKICAgIFtwb3J0XSA9PiAKICAgIFtzb2NrZXRdID0+IAogICAgW2RhdGFiYXNlXSA9PiBkYXRhYmFzZQopCkRTTjogb2RiYyhhY2Nlc3MpOi8vL2RhdGFiYXNlCkFycmF5CigKICAgIFtwaHB0eXBlXSA9PiBvZGJjCiAgICBbZGJzeW50YXhdID0+IGFjY2VzcwogICAgW3VzZXJuYW1lXSA9PiAKICAgIFtwYXNzd29yZF0gPT4gCiAgICBbcHJvdG9jb2xdID0+IHRjcAogICAgW2hvc3RzcGVjXSA9PiAKICAgIFtwb3J0XSA9PiAKICAgIFtzb2NrZXRdID0+IAogICAgW2RhdGFiYXNlXSA9PiBkYXRhYmFzZQopCkRTTjogb2RiYzovL2FkbWluQC9kYXRhc291cmNlTmFtZQpBcnJheQooCiAgICBbcGhwdHlwZV0gPT4gb2RiYwogICAgW2Ric3ludGF4XSA9PiBvZGJjCiAgICBbdXNlcm5hbWVdID0+IGFkbWluCiAgICBbcGFzc3dvcmRdID0+IAogICAgW3Byb3RvY29sXSA9PiB0Y3AKICAgIFtob3N0c3BlY10gPT4gCiAgICBbcG9ydF0gPT4gCiAgICBbc29ja2V0XSA9PiAKICAgIFtkYXRhYmFzZV0gPT4gZGF0YXNvdXJjZU5hbWUKKQpEU046IG15c3FsOi8vbG9jYWxob3N0CkFycmF5CigKICAgIFtwaHB0eXBlXSA9PiBteXNxbAogICAgW2Ric3ludGF4XSA9PiBteXNxbAogICAgW3VzZXJuYW1lXSA9PiAKICAgIFtwYXNzd29yZF0gPT4gCiAgICBbcHJvdG9jb2xdID0+IHRjcAogICAgW2hvc3RzcGVjXSA9PiBsb2NhbGhvc3QKICAgIFtwb3J0XSA9PiAKICAgIFtzb2NrZXRdID0+IAogICAgW2RhdGFiYXNlXSA9PiAKKQpEU046IG15c3FsOi8vcmVtb3RlLmhvc3QuY29tL2RiCkFycmF5CigKICAgIFtwaHB0eXBlXSA9PiBteXNxbAogICAgW2Ric3ludGF4XSA9PiBteXNxbAogICAgW3VzZXJuYW1lXSA9PiAKICAgIFtwYXNzd29yZF0gPT4gCiAgICBbcHJvdG9jb2xdID0+IHRjcAogICAgW2hvc3RzcGVjXSA9PiByZW1vdGUuaG9zdC5jb20KICAgIFtwb3J0XSA9PiAKICAgIFtzb2NrZXRdID0+IAogICAgW2RhdGFiYXNlXSA9PiBkYgopCkRTTjogb2NpODovL3N5c3RlbTptYW5hZ2VyQApBcnJheQooCiAgICBbcGhwdHlwZV0gPT4gb2NpOAogICAgW2Ric3ludGF4XSA9PiBvY2k4CiAgICBbdXNlcm5hbWVdID0+IHN5c3RlbQogICAgW3Bhc3N3b3JkXSA9PiBtYW5hZ2VyCiAgICBbcHJvdG9jb2xdID0+IHRjcAogICAgW2hvc3RzcGVjXSA9PiAKICAgIFtwb3J0XSA9PiAKICAgIFtzb2NrZXRdID0+IAogICAgW2RhdGFiYXNlXSA9PiAKKQpEU046IG9jaTg6Ly91c2VyOnBhc3NAdG5zLW5hbWUKQXJyYXkKKAogICAgW3BocHR5cGVdID0+IG9jaTgKICAgIFtkYnN5bnRheF0gPT4gb2NpOAogICAgW3VzZXJuYW1lXSA9PiB1c2VyCiAgICBbcGFzc3dvcmRdID0+IHBhc3MKICAgIFtwcm90b2NvbF0gPT4gdGNwCiAgICBbaG9zdHNwZWNdID0+IHRucy1uYW1lCiAgICBbcG9ydF0gPT4gCiAgICBbc29ja2V0XSA9PiAKICAgIFtkYXRhYmFzZV0gPT4gCikKRFNOOiBvZGJjKHNvbGlkKTovL2ZvbzpiYXJAdGNwK2xvY2FsaG9zdCsxMzEzCkFycmF5CigKICAgIFtwaHB0eXBlXSA9PiBvZGJjCiAgICBbZGJzeW50YXhdID0+IHNvbGlkCiAgICBbdXNlcm5hbWVdID0+IGZvbwogICAgW3Bhc3N3b3JkXSA9PiBiYXIKICAgIFtwcm90b2NvbF0gPT4gdGNwCiAgICBbaG9zdHNwZWNdID0+IGxvY2FsaG9zdCsxMzEzCiAgICBbcG9ydF0gPT4gCiAgICBbc29ja2V0XSA9PiAKICAgIFtkYXRhYmFzZV0gPT4gCikKRFNOOiBwZ3NxbDovL3VzZXJAdW5peCtsb2NhbGhvc3QvcGVhcgpBcnJheQooCiAgICBbcGhwdHlwZV0gPT4gcGdzcWwKICAgIFtkYnN5bnRheF0gPT4gcGdzcWwKICAgIFt1c2VybmFtZV0gPT4gdXNlcgogICAgW3Bhc3N3b3JkXSA9PiAKICAgIFtwcm90b2NvbF0gPT4gdW5peAogICAgW2hvc3RzcGVjXSA9PiAKICAgIFtwb3J0XSA9PiAKICAgIFtzb2NrZXRdID0+IGxvY2FsaG9zdAogICAgW2RhdGFiYXNlXSA9PiBwZWFyCikKRFNOOiBpYmFzZTovL3VzZXIlNDBkb21haW46cGFzc3dvcmRAaG9zdApBcnJheQooCiAgICBbcGhwdHlwZV0gPT4gaWJhc2UKICAgIFtkYnN5bnRheF0gPT4gaWJhc2UKICAgIFt1c2VybmFtZV0gPT4gdXNlckBkb21haW4KICAgIFtwYXNzd29yZF0gPT4gcGFzc3dvcmQKICAgIFtwcm90b2NvbF0gPT4gdGNwCiAgICBbaG9zdHNwZWNdID0+IGhvc3QKICAgIFtwb3J0XSA9PiAKICAgIFtzb2NrZXRdID0+IAogICAgW2RhdGFiYXNlXSA9PiAKKQpEU046IGliYXNlOi8vdXNlckBkb21haW46cGFzc0B3b3JkQC9kYXRhYmFzZQpBcnJheQooCiAgICBbcGhwdHlwZV0gPT4gaWJhc2UKICAgIFtkYnN5bnRheF0gPT4gaWJhc2UKICAgIFt1c2VybmFtZV0gPT4gdXNlckBkb21haW4KICAgIFtwYXNzd29yZF0gPT4gcGFzc0B3b3JkCiAgICBbcHJvdG9jb2xdID0+IHRjcAogICAgW2hvc3RzcGVjXSA9PiAKICAgIFtwb3J0XSA9PiAKICAgIFtzb2NrZXRdID0+IAogICAgW2RhdGFiYXNlXSA9PiBkYXRhYmFzZQopCkRTTjogaWZ4Oi8vdXNlckBkb21haW46cGFzc0B3b3JkQGhvc3QuY29tLy91c3IvZGIvZ2VuZXJhbC5kYgpBcnJheQooCiAgICBbcGhwdHlwZV0gPT4gaWZ4CiAgICBbZGJzeW50YXhdID0+IGlmeAogICAgW3VzZXJuYW1lXSA9PiB1c2VyQGRvbWFpbgogICAgW3Bhc3N3b3JkXSA9PiBwYXNzQHdvcmQKICAgIFtwcm90b2NvbF0gPT4gdGNwCiAgICBbaG9zdHNwZWNdID0+IGhvc3QuY29tCiAgICBbcG9ydF0gPT4gCiAgICBbc29ja2V0XSA9PiAKICAgIFtkYXRhYmFzZV0gPT4gL3Vzci9kYi9nZW5lcmFsLmRiCikKRFNOOiBpZng6Ly9yZW1vdGUuaG9zdC5jb20vYzpcd2luZG93c1xteS5kYgpBcnJheQooCiAgICBbcGhwdHlwZV0gPT4gaWZ4CiAgICBbZGJzeW50YXhdID0+IGlmeAogICAgW3VzZXJuYW1lXSA9PiAKICAgIFtwYXNzd29yZF0gPT4gCiAgICBbcHJvdG9jb2xdID0+IHRjcAogICAgW2hvc3RzcGVjXSA9PiByZW1vdGUuaG9zdC5jb20KICAgIFtwb3J0XSA9PiAKICAgIFtzb2NrZXRdID0+IAogICAgW2RhdGFiYXNlXSA9PiBjOlx3aW5kb3dzXG15LmRiCikKRFNOOiBvY2k4Oi8vU0hPT1RPVVQ6KioqKioqQChERVNDUklQVElPTj0oQUREUkVTU19MSVNUPShBRERSRVNTPShQUk9UT0NPTD1UQ1ApKEhPU1Q9MTkyLjE2OC4xMDEuMTYxKShQT1JUPTE1MjEpKSkoQ09OTkVDVF9EQVRBPShTRVJWSUNFX05BTUU9VElTKSkpCkFycmF5CigKICAgIFtwaHB0eXBlXSA9PiBvY2k4CiAgICBbZGJzeW50YXhdID0+IG9jaTgKICAgIFt1c2VybmFtZV0gPT4gU0hPT1RPVVQKICAgIFtwYXNzd29yZF0gPT4gKioqKioqCiAgICBbcHJvdG9jb2xdID0+IHRjcAogICAgW2hvc3RzcGVjXSA9PiAoREVTQ1JJUFRJT049KEFERFJFU1NfTElTVD0oQUREUkVTUz0oUFJPVE9DT0w9VENQKShIT1NUPTE5Mi4xNjguMTAxLjE2MSkoUE9SVD0xNTIxKSkpKENPTk5FQ1RfREFUQT0oU0VSVklDRV9OQU1FPVRJUykpKQogICAgW3BvcnRdID0+IAogICAgW3NvY2tldF0gPT4gCiAgICBbZGF0YWJhc2VdID0+IAopCkRTTjogb2RiYyhzb2xpZCk6Ly9mb286YmFyQGxvY2FsaG9zdDoxMzEzCkFycmF5CigKICAgIFtwaHB0eXBlXSA9PiBvZGJjCiAgICBbZGJzeW50YXhdID0+IHNvbGlkCiAgICBbdXNlcm5hbWVdID0+IGZvbwogICAgW3Bhc3N3b3JkXSA9PiBiYXIKICAgIFtwcm90b2NvbF0gPT4gdGNwCiAgICBbaG9zdHNwZWNdID0+IGxvY2FsaG9zdAogICAgW3BvcnRdID0+IDEzMTMKICAgIFtzb2NrZXRdID0+IAogICAgW2RhdGFiYXNlXSA9PiAKKQpEU046IHBnc3FsOi8vdXNlckB1bml4KCkvcGVhcgpBcnJheQooCiAgICBbcGhwdHlwZV0gPT4gcGdzcWwKICAgIFtkYnN5bnRheF0gPT4gcGdzcWwKICAgIFt1c2VybmFtZV0gPT4gdXNlcgogICAgW3Bhc3N3b3JkXSA9PiAKICAgIFtwcm90b2NvbF0gPT4gdW5peAogICAgW2hvc3RzcGVjXSA9PiAKICAgIFtwb3J0XSA9PiAKICAgIFtzb2NrZXRdID0+IAogICAgW2RhdGFiYXNlXSA9PiBwZWFyCikKRFNOOiBteXNxbDovL3VzZXJAdW5peCgvcGF0aC90by9zb2NrZXQpL3BlYXIKQXJyYXkKKAogICAgW3BocHR5cGVdID0+IG15c3FsCiAgICBbZGJzeW50YXhdID0+IG15c3FsCiAgICBbdXNlcm5hbWVdID0+IHVzZXIKICAgIFtwYXNzd29yZF0gPT4gCiAgICBbcHJvdG9jb2xdID0+IHVuaXgKICAgIFtob3N0c3BlY10gPT4gCiAgICBbcG9ydF0gPT4gCiAgICBbc29ja2V0XSA9PiAvcGF0aC90by9zb2NrZXQKICAgIFtkYXRhYmFzZV0gPT4gcGVhcgopCkRTTjogcGdzcWw6Ly91c2VyQHRjcCgpL3BlYXIKQXJyYXkKKAogICAgW3BocHR5cGVdID0+IHBnc3FsCiAgICBbZGJzeW50YXhdID0+IHBnc3FsCiAgICBbdXNlcm5hbWVdID0+IHVzZXIKICAgIFtwYXNzd29yZF0gPT4gCiAgICBbcHJvdG9jb2xdID0+IHRjcAogICAgW2hvc3RzcGVjXSA9PiAKICAgIFtwb3J0XSA9PiAKICAgIFtzb2NrZXRdID0+IAogICAgW2RhdGFiYXNlXSA9PiBwZWFyCikKRFNOOiBwZ3NxbDovL3VzZXJAdGNwKHNvbWVob3N0KS9wZWFyCkFycmF5CigKICAgIFtwaHB0eXBlXSA9PiBwZ3NxbAogICAgW2Ric3ludGF4XSA9PiBwZ3NxbAogICAgW3VzZXJuYW1lXSA9PiB1c2VyCiAgICBbcGFzc3dvcmRdID0+IAogICAgW3Byb3RvY29sXSA9PiB0Y3AKICAgIFtob3N0c3BlY10gPT4gc29tZWhvc3QKICAgIFtwb3J0XSA9PiAKICAgIFtzb2NrZXRdID0+IAogICAgW2RhdGFiYXNlXSA9PiBwZWFyCikKRFNOOiBwZ3NxbDovL3VzZXI6cGFzc0B3b3JkQHRjcChzb21laG9zdDo3Nzc3KS9wZWFyCkFycmF5CigKICAgIFtwaHB0eXBlXSA9PiBwZ3NxbAogICAgW2Ric3ludGF4XSA9PiBwZ3NxbAogICAgW3VzZXJuYW1lXSA9PiB1c2VyCiAgICBbcGFzc3dvcmRdID0+IHBhc3NAd29yZAogICAgW3Byb3RvY29sXSA9PiB0Y3AKICAgIFtob3N0c3BlY10gPT4gc29tZWhvc3QKICAgIFtwb3J0XSA9PiA3Nzc3CiAgICBbc29ja2V0XSA9PiAKICAgIFtkYXRhYmFzZV0gPT4gcGVhcgopCkRTTjogaWJhc2U6Ly91c2VyOnBhc3NAbG9jYWxob3N0Ly92YXIvbGliL2RiYXNlLmRiZj9yb2xlPWZvbwpBcnJheQooCiAgICBbcGhwdHlwZV0gPT4gaWJhc2UKICAgIFtkYnN5bnRheF0gPT4gaWJhc2UKICAgIFt1c2VybmFtZV0gPT4gdXNlcgogICAgW3Bhc3N3b3JkXSA9PiBwYXNzCiAgICBbcHJvdG9jb2xdID0+IHRjcAogICAgW2hvc3RzcGVjXSA9PiBsb2NhbGhvc3QKICAgIFtwb3J0XSA9PiAKICAgIFtzb2NrZXRdID0+IAogICAgW2RhdGFiYXNlXSA9PiAvdmFyL2xpYi9kYmFzZS5kYmYKICAgIFtyb2xlXSA9PiBmb28KKQpEU046IGRiYXNlOi8vQC8/cm9sZT1mb28mZGlhbGVjdD1iYXIKQXJyYXkKKAogICAgW3BocHR5cGVdID0+IGRiYXNlCiAgICBbZGJzeW50YXhdID0+IGRiYXNlCiAgICBbdXNlcm5hbWVdID0+IAogICAgW3Bhc3N3b3JkXSA9PiAKICAgIFtwcm90b2NvbF0gPT4gdGNwCiAgICBbaG9zdHNwZWNdID0+IAogICAgW3BvcnRdID0+IAogICAgW3NvY2tldF0gPT4gCiAgICBbZGF0YWJhc2VdID0+IAogICAgW3JvbGVdID0+IGZvbwogICAgW2RpYWxlY3RdID0+IGJhcgopCkRTTjogc3FsaXRlOi8vLy91bml4L3BhdGgvdG8vZGF0YWJhc2U/b3B0aW9uPXZhbHVlJmFub3RoZXJvcHRpb249YW5vdGhlcnZhbHVlCkFycmF5CigKICAgIFtwaHB0eXBlXSA9PiBzcWxpdGUKICAgIFtkYnN5bnRheF0gPT4gc3FsaXRlCiAgICBbdXNlcm5hbWVdID0+IAogICAgW3Bhc3N3b3JkXSA9PiAKICAgIFtwcm90b2NvbF0gPT4gdGNwCiAgICBbaG9zdHNwZWNdID0+IAogICAgW3BvcnRdID0+IAogICAgW3NvY2tldF0gPT4gCiAgICBbZGF0YWJhc2VdID0+IC91bml4L3BhdGgvdG8vZGF0YWJhc2UKICAgIFtvcHRpb25dID0+IHZhbHVlCiAgICBbYW5vdGhlcm9wdGlvbl0gPT4gYW5vdGhlcnZhbHVlCikKRFNOOiBzcWxpdGU6Ly8vYzovd2luL3BhdGgvdG8vZGF0YWJhc2U/b3B0aW9uPXZhbHVlCkFycmF5CigKICAgIFtwaHB0eXBlXSA9PiBzcWxpdGUKICAgIFtkYnN5bnRheF0gPT4gc3FsaXRlCiAgICBbdXNlcm5hbWVdID0+IAogICAgW3Bhc3N3b3JkXSA9PiAKICAgIFtwcm90b2NvbF0gPT4gdGNwCiAgICBbaG9zdHNwZWNdID0+IAogICAgW3BvcnRdID0+IAogICAgW3NvY2tldF0gPT4gCiAgICBbZGF0YWJhc2VdID0+IGM6L3dpbi9wYXRoL3RvL2RhdGFiYXNlCiAgICBbb3B0aW9uXSA9PiB2YWx1ZQopCkRTTjogbXlzcWw6Ly91c2VybmFtZUBob3N0c3BlYwpBcnJheQooCiAgICBbcGhwdHlwZV0gPT4gbXlzcWwKICAgIFtkYnN5bnRheF0gPT4gbXlzcWwKICAgIFt1c2VybmFtZV0gPT4gdXNlcm5hbWUKICAgIFtwYXNzd29yZF0gPT4gCiAgICBbcHJvdG9jb2xdID0+IHRjcAogICAgW2hvc3RzcGVjXSA9PiBob3N0c3BlYwogICAgW3BvcnRdID0+IAogICAgW3NvY2tldF0gPT4gCiAgICBbZGF0YWJhc2VdID0+IAopCkRTTjogbXlzcWw6Ly9ob3N0c3BlYy9kYXRhYmFzZQpBcnJheQooCiAgICBbcGhwdHlwZV0gPT4gbXlzcWwKICAgIFtkYnN5bnRheF0gPT4gbXlzcWwKICAgIFt1c2VybmFtZV0gPT4gCiAgICBbcGFzc3dvcmRdID0+IAogICAgW3Byb3RvY29sXSA9PiB0Y3AKICAgIFtob3N0c3BlY10gPT4gaG9zdHNwZWMKICAgIFtwb3J0XSA9PiAKICAgIFtzb2NrZXRdID0+IAogICAgW2RhdGFiYXNlXSA9PiBkYXRhYmFzZQopCkRTTjogbXlzcWw6Ly9ob3N0c3BlYwpBcnJheQooCiAgICBbcGhwdHlwZV0gPT4gbXlzcWwKICAgIFtkYnN5bnRheF0gPT4gbXlzcWwKICAgIFt1c2VybmFtZV0gPT4gCiAgICBbcGFzc3dvcmRdID0+IAogICAgW3Byb3RvY29sXSA9PiB0Y3AKICAgIFtob3N0c3BlY10gPT4gaG9zdHNwZWMKICAgIFtwb3J0XSA9PiAKICAgIFtzb2NrZXRdID0+IAogICAgW2RhdGFiYXNlXSA9PiAKKQpEU046IG15c3FsOi8vL2RhdGFiYXNlCkFycmF5CigKICAgIFtwaHB0eXBlXSA9PiBteXNxbAogICAgW2Ric3ludGF4XSA9PiBteXNxbAogICAgW3VzZXJuYW1lXSA9PiAKICAgIFtwYXNzd29yZF0gPT4gCiAgICBbcHJvdG9jb2xdID0+IHRjcAogICAgW2hvc3RzcGVjXSA9PiAKICAgIFtwb3J0XSA9PiAKICAgIFtzb2NrZXRdID0+IAogICAgW2RhdGFiYXNlXSA9PiBkYXRhYmFzZQopCkRTTjogYXJyYXkKQXJyYXkKKAogICAgW3BocHR5cGVdID0+IG15c3FsCiAgICBbZGJzeW50YXhdID0+IG15c3FsCiAgICBbdXNlcm5hbWVdID0+IAogICAgW3Bhc3N3b3JkXSA9PiAKICAgIFtwcm90b2NvbF0gPT4gCiAgICBbaG9zdHNwZWNdID0+IGZvb2JhcgogICAgW3BvcnRdID0+IAogICAgW3NvY2tldF0gPT4gCiAgICBbZGF0YWJhc2VdID0+IAopCg==]]></data>
	</file>
	<file>
	  <filename>/lib/pear/tests/driver/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/pear/tests/driver/01connect.phpt</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LS1URVNULS0KREJfZHJpdmVyOjpjb25uZWN0Ci0tSU5JLS0KZXJyb3JfcmVwb3J0aW5nID0gMjA0NwotLVNLSVBJRi0tCjw/cGhwIGNoZGlyKGRpcm5hbWUoX19GSUxFX18pKTsgcmVxdWlyZV9vbmNlICcuL3NraXBpZi5pbmMnOyA/PgotLUZJTEUtLQo8P3BocApyZXF1aXJlX29uY2UgJy4vY29ubmVjdC5pbmMnOwoKLyoqCiAqIERldGVybWluZSBpZiB0aGUgZGF0YWJhc2UgY29ubmVjdGlvbiBtYXRjaGVzIHdoYXQncyBleHBlY3RlZAogKgogKiBAcGFyYW0gb2JqZWN0ICRkYmggICB0aGUgUEVBUiBEQiBvYmplY3QKICogQHBhcmFtIHN0cmluZyAkbmFtZSAgdGhlIG5hbWUgb2YgdGhlIGN1cnJlbnQgdGVzdAogKgogKiBAcmV0dXJuIHZvaWQKICovCmZ1bmN0aW9uIGNoZWNrX2RiaCgkZGJoLCAkbmFtZSkgewogICAgaWYgKERCOjppc0Vycm9yKCRkYmgpKSB7CiAgICAgICAgZGllKCdjb25uZWN0LmluYzogJyAuICRkYmgtPnRvU3RyaW5nKCkpOwogICAgfQogICAgaWYgKGlzX29iamVjdCgkZGJoKSkgewogICAgICAgIHByaW50ICIkbmFtZSBpcyBhbiBvYmplY3RcbiI7CiAgICB9CiAgICBzd2l0Y2ggKCRkYmgtPnBocHR5cGUpIHsKICAgICAgICBjYXNlICdkYmFzZSc6CiAgICAgICAgICAgIGlmIChpc19pbnQoJGRiaC0+Y29ubmVjdGlvbikpIHsKICAgICAgICAgICAgICAgIHByaW50ICIkbmFtZSBpcyBjb25uZWN0ZWRcbiI7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBwcmludCAiJG5hbWUgTk9UIGNvbm5lY3RlZFxuIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdteXNxbGknOgogICAgICAgICAgICBpZiAoaXNfYSgkZGJoLT5jb25uZWN0aW9uLCAnbXlzcWxpJykpIHsKICAgICAgICAgICAgICAgIHByaW50ICIkbmFtZSBpcyBjb25uZWN0ZWRcbiI7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBwcmludCAiJG5hbWUgTk9UIGNvbm5lY3RlZFxuIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdzeWJhc2UnOgogICAgICAgICAgICBpZiAoZ2V0dHlwZSgkZGJoLT5jb25uZWN0aW9uKSA9PSAncmVzb3VyY2UnIHx8CiAgICAgICAgICAgICAgICAoZ2V0dHlwZSgkZGJoLT5jb25uZWN0aW9uKSA9PSAnaW50ZWdlcicgJiYgJGRiaC0+Y29ubmVjdGlvbiA+IDApKSB7CiAgICAgICAgICAgICAgICBwcmludCAiJG5hbWUgaXMgY29ubmVjdGVkXG4iOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgcHJpbnQgIiRuYW1lIE5PVCBjb25uZWN0ZWRcbiI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgaWYgKGdldHR5cGUoJGRiaC0+Y29ubmVjdGlvbikgPT0gJ3Jlc291cmNlJykgewogICAgICAgICAgICAgICAgcHJpbnQgIiRuYW1lIGlzIGNvbm5lY3RlZFxuIjsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHByaW50ICIkbmFtZSBOT1QgY29ubmVjdGVkXG4iOwogICAgICAgICAgICB9CiAgICB9Cn0KCgpjaGVja19kYmgoJGRiaCwgJyRkYmgnKTsKCgokdGVzdF9hcnJheV9kc24gPSBEQjo6cGFyc2VEU04oJGRzbik7CmZvcmVhY2ggKCR0ZXN0X2FycmF5X2RzbiBhcyAka2V5ID0+ICR2YWx1ZSkgewogICAgaWYgKCR2YWx1ZSA9PT0gZmFsc2UpIHsKICAgICAgICB1bnNldCgkdGVzdF9hcnJheV9kc25bJGtleV0pOwogICAgfQp9CgokZGJoYSA9JiBEQjo6Y29ubmVjdCgkdGVzdF9hcnJheV9kc24sICRvcHRpb25zKTsKY2hlY2tfZGJoKCRkYmhhLCAnJGRiaGEnKTsKCgokdG1wICA9IHNlcmlhbGl6ZSgkZGJoYSk7CiRkYmh1ID0gdW5zZXJpYWxpemUoJHRtcCk7CmNoZWNrX2RiaCgkZGJodSwgJyRkYmh1Jyk7Cgo/PgotLUVYUEVDVC0tCiRkYmggaXMgYW4gb2JqZWN0CiRkYmggaXMgY29ubmVjdGVkCiRkYmhhIGlzIGFuIG9iamVjdAokZGJoYSBpcyBjb25uZWN0ZWQKJGRiaHUgaXMgYW4gb2JqZWN0CiRkYmh1IGlzIGNvbm5lY3RlZAo=]]></data>
	</file>
	<file>
	  <filename>/lib/pear/tests/driver/02fetch.phpt</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LS1URVNULS0KREJfZHJpdmVyOjpmZXRjaAotLUlOSS0tCmVycm9yX3JlcG9ydGluZyA9IDIwNDcKLS1TS0lQSUYtLQo8P3BocCBjaGRpcihkaXJuYW1lKF9fRklMRV9fKSk7IHJlcXVpcmVfb25jZSAnLi9za2lwaWYuaW5jJzsgPz4KLS1GSUxFLS0KPD9waHAKcmVxdWlyZV9vbmNlICcuL21rdGFibGUuaW5jJzsKcmVxdWlyZV9vbmNlICcuLi9mZXRjaG1vZGVzLmluYyc7Cj8+Ci0tRVhQRUNULS0KdGVzdGluZyBmZXRjaHJvdzoKcm93IDE6IDQyLCBiaW5nLCBUaGlzIGlzIGEgdGVzdCwgMTk5OS0xMS0yMQpyb3cgMjogMSwgb25lLCBPbmUsIDIwMDEtMDItMTYKcm93IDM6IDIsIHR3bywgVHdvLCAyMDAxLTAyLTE1CnJvdyA0OiAzLCB0aHJlZSwgVGhyZWUsIDIwMDEtMDItMTQKcm93IDU6IE5VTEwKdGVzdGluZyBmZXRjaG1vZGVzOiBmZXRjaHJvdyBkZWZhdWx0IGRlZmF1bHQsIHBvcnRhYmlsaXR5IG1vZGUgREJfUE9SVEFCSUxJVFlfQUxMIF4gREJfUE9SVEFCSUxJVFlfUlRSSU0KMCAxIDIgMwpvdXRwdXQgbWF0Y2hlZCBleHBlY3RlZCBmb3JtYXQKdGVzdGluZyBmZXRjaG1vZGVzOiBmZXRjaGludG8gZGVmYXVsdCBkZWZhdWx0CjAgMSAyIDMKNDIgYmluZyBUaGlzIGlzIGEgdGVzdCAxOTk5LTExLTIxCnRlc3RpbmcgZmV0Y2htb2RlczogZmV0Y2hyb3cgb3JkZXJlZCBkZWZhdWx0CjAgMSAyIDMKdGVzdGluZyBmZXRjaG1vZGVzOiBmZXRjaHJvdyBhc3NvYyBkZWZhdWx0CmEgYiBjYyBkCnRlc3RpbmcgZmV0Y2htb2RlczogZmV0Y2hyb3cgb3JkZXJlZCBkZWZhdWx0IHdpdGggYXNzb2Mgc3BlY2lmaWVkCmEgYiBjYyBkCnRlc3RpbmcgZmV0Y2htb2RlczogZmV0Y2hyb3cgYXNzb2MgZGVmYXVsdCB3aXRoIG9yZGVyZWQgc3BlY2lmaWVkCjAgMSAyIDMKdGVzdGluZyBmZXRjaG1vZGVzOiBmZXRjaGludG8gb3JkZXJlZCBkZWZhdWx0CjAgMSAyIDMKdGVzdGluZyBmZXRjaG1vZGVzOiBmZXRjaGludG8gYXNzb2MgZGVmYXVsdAphIGIgY2MgZAp0ZXN0aW5nIGZldGNobW9kZXM6IGZldGNoaW50byBvcmRlcmVkIGRlZmF1bHQgd2l0aCBhc3NvYyBzcGVjaWZpZWQKYSBiIGNjIGQKdGVzdGluZyBmZXRjaG1vZGVzOiBmZXRjaGludG8gYXNzb2MgZGVmYXVsdCB3aXRoIG9yZGVyZWQgc3BlY2lmaWVkCjAgMSAyIDMK]]></data>
	</file>
	<file>
	  <filename>/lib/pear/tests/driver/03simplequery.phpt</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LS1URVNULS0KREJfZHJpdmVyOjpzaW1wbGVRdWVyeQotLUlOSS0tCmVycm9yX3JlcG9ydGluZyA9IDIwNDcKLS1TS0lQSUYtLQo8P3BocCBjaGRpcihkaXJuYW1lKF9fRklMRV9fKSk7IHJlcXVpcmVfb25jZSAnLi9za2lwaWYuaW5jJzsgPz4KLS1GSUxFLS0KPD9waHAKcmVxdWlyZV9vbmNlICcuL21rdGFibGUuaW5jJzsKcmVxdWlyZV9vbmNlICcuLi9zaW1wbGVxdWVyeS5pbmMnOwo/PgotLUVYUEVDVC0tCnBhc3NlZAo=]]></data>
	</file>
	<file>
	  <filename>/lib/pear/tests/driver/04numcols.phpt</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LS1URVNULS0KREJfZHJpdmVyOjpudW1Db2xzCi0tSU5JLS0KZXJyb3JfcmVwb3J0aW5nID0gMjA0NwotLVNLSVBJRi0tCjw/cGhwIGNoZGlyKGRpcm5hbWUoX19GSUxFX18pKTsgcmVxdWlyZV9vbmNlICcuL3NraXBpZi5pbmMnOyA/PgotLUZJTEUtLQo8P3BocApyZXF1aXJlX29uY2UgJy4vbWt0YWJsZS5pbmMnOwpyZXF1aXJlX29uY2UgJy4uL251bWNvbHMuaW5jJzsKPz4KLS1FWFBFQ1QtLQoxCjIKMwo0Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/pear/tests/driver/05sequences.phpt</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LS1URVNULS0KREJfZHJpdmVyOjpzZXF1ZW5jZXMKLS1JTkktLQplcnJvcl9yZXBvcnRpbmcgPSAyMDQ3Ci0tU0tJUElGLS0KPD9waHAKZXJyb3JfcmVwb3J0aW5nKEVfQUxMKTsKY2hkaXIoZGlybmFtZShfX0ZJTEVfXykpOwpyZXF1aXJlX29uY2UgJy4vc2tpcGlmLmluYyc7CiR0YWJsZUluZm8gPSAkZGJoLT5kcm9wU2VxdWVuY2UoJ2Fqa2RzbGZham9pamthZGllJyk7CmlmIChEQjo6aXNFcnJvcigkdGFibGVJbmZvKSAmJiAkdGFibGVJbmZvLT5jb2RlID09IERCX0VSUk9SX05PVF9DQVBBQkxFKSB7CiAgICBkaWUoInNraXAgJHRhYmxlSW5mby0+bWVzc2FnZSIpOwp9Cj8+Ci0tRklMRS0tCjw/cGhwCnJlcXVpcmVfb25jZSAnLi9jb25uZWN0LmluYyc7CnJlcXVpcmVfb25jZSAnLi4vc2VxdWVuY2VzLmluYyc7Cj8+Ci0tRVhQRUNULS0KYW4gZXJyb3IgaXMgdGhlIHByb3BlciByZXNwb25zZSBoZXJlCmFuIGVycm9yIGNvdWdodCBieSB0aGUgZXJyb3IgaGFuZGxlciBpcyBnb29kCmE9MQpiPTIKYi1hPTEKYz0xCmQ9MQplPTEK]]></data>
	</file>
	<file>
	  <filename>/lib/pear/tests/driver/06prepexec.phpt</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LS1URVNULS0KREJfZHJpdmVyOjpwcmVwYXJlL2V4ZWN1dGUKLS1JTkktLQplcnJvcl9yZXBvcnRpbmcgPSAyMDQ3Ci0tU0tJUElGLS0KPD9waHAgY2hkaXIoZGlybmFtZShfX0ZJTEVfXykpOyByZXF1aXJlX29uY2UgJy4vc2tpcGlmLmluYyc7ID8+Ci0tRklMRS0tCjw/cGhwCnJlcXVpcmVfb25jZSAnLi9ta3RhYmxlLmluYyc7CnJlcXVpcmVfb25jZSAnLi4vcHJlcGV4ZS5pbmMnOwo/PgotLUVYUEVDVC0tCi0tLS0tLS0tLS0tLTEtLS0tLS0tLS0tLS0Kc3RoMSxzdGgyLHN0aDMsc3RoNCBjcmVhdGVkCnN0aDE6ID8gYXMgcGFyYW0sIHBhc3NpbmcgYXMgYXJyYXkuLi4gc3RoMSBleGVjdXRlZApzdGgyOiAhIGFuZCA/IGFzIHBhcmFtcywgcGFzc2luZyBhcyBhcnJheS4uLiBzdGgyIGV4ZWN1dGVkCnN0aDM6ID8sICEgYW5kICYgYXMgcGFyYW1zLCBwYXNzaW5nIGFzIGFycmF5Li4uIHN0aDMgZXhlY3V0ZWQKc3RoNDogbm8gcGFyYW1zLi4uIHN0aDQgZXhlY3V0ZWQKcmVzdWx0czoKfDcyIC0gYSAtICAtIHwKfDcyIC0gZGlyZWN0IC0gIC0gfAp8NzIgLSBpdCdzIGdvb2QgLSBvcGFxdWUgcGxhY2Vob2xkZXIncyB0ZXN0IC0gfAp8NzIgLSB0aGF0J3MgcmlnaHQgLSAgLSB8CgotLS0tLS0tLS0tLS0yLS0tLS0tLS0tLS0tCnJlc3VsdHM6Cnw3MiAtIHNldDEgLSBvcGFxdWUgcGxhY2Vob2xkZXIncyB0ZXN0IC0gMTIzNC01Ni03OHwKfDcyIC0gc2V0MiAtIG9wYXF1ZSBwbGFjZWhvbGRlcidzIHRlc3QgLSB8Cnw3MiAtIHNldDMgLSBvcGFxdWUgcGxhY2Vob2xkZXIncyB0ZXN0IC0gfAoKLS0tLS0tLS0tLS0tMy0tLS0tLS0tLS0tLQpUUlVFCkZBTFNFCgotLS0tLS0tLS0tLS00LS0tLS0tLS0tLS0tCnw3MiAtIHNldDEgLSBvcGFxdWUgcGxhY2Vob2xkZXIncyB0ZXN0IC0gMTIzNC01Ni03OHwKfDcyIC0gc2V0MiAtIG9wYXF1ZSBwbGFjZWhvbGRlcidzIHRlc3QgLSB8Cnw3MiAtIHNldDMgLSBvcGFxdWUgcGxhY2Vob2xkZXIncyB0ZXN0IC0gfAp+fgp+fgp8NzIgLSBzZXQxIC0gb3BhcXVlIHBsYWNlaG9sZGVyJ3MgdGVzdCAtIDEyMzQtNTYtNzh8Cn5+Cnw3MiAtIHNldDEgLSBvcGFxdWUgcGxhY2Vob2xkZXIncyB0ZXN0IC0gMTIzNC01Ni03OHwKfDcyIC0gc2V0MiAtIG9wYXF1ZSBwbGFjZWhvbGRlcidzIHRlc3QgLSB8Cnw3MiAtIHNldDMgLSBvcGFxdWUgcGxhY2Vob2xkZXIncyB0ZXN0IC0gfAp+fgoKLS0tLS0tLS0tLS0tNS0tLS0tLS0tLS0tLQppbnNlcnQ6IG9rYXkKYSA9IDExLCBiID0gdGhyZWUsIGQgPSBnb3QgZXhwZWN0ZWQgb3V0Y29tZQo=]]></data>
	</file>
	<file>
	  <filename>/lib/pear/tests/driver/08affectedrows.phpt</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LS1URVNULS0KREJfZHJpdmVyOjphZmZlY3RlZFJvd3MKLS1JTkktLQplcnJvcl9yZXBvcnRpbmcgPSAyMDQ3Ci0tU0tJUElGLS0KPD9waHAgY2hkaXIoZGlybmFtZShfX0ZJTEVfXykpOyByZXF1aXJlX29uY2UgJy4vc2tpcGlmLmluYyc7ID8+Ci0tRklMRS0tCjw/cGhwCnJlcXVpcmVfb25jZSAnLi9ta3RhYmxlLmluYyc7CgovKioKICogTG9jYWwgZXJyb3IgY2FsbGJhY2sgaGFuZGxlci4KICoKICogRHJvcHMgdGhlIHBocHRlc3QgdGFibGUsIHByaW50cyBvdXQgYW4gZXJyb3IgbWVzc2FnZSBhbmQga2lsbHMgdGhlCiAqIHByb2Nlc3MuCiAqCiAqIEBwYXJhbSBvYmplY3QgICRvICBQRUFSIGVycm9yIG9iamVjdCBhdXRvbWF0aWNhbGx5IHBhc3NlZCB0byB0aGlzIG1ldGhvZAogKiBAcmV0dXJuIHZvaWQKICogQHNlZSBQRUFSOjpzZXRFcnJvckhhbmRsaW5nKCkKICovCmZ1bmN0aW9uIHBlKCRvKSB7CiAgICBnbG9iYWwgJGRiaDsKCiAgICAkZGJoLT5zZXRFcnJvckhhbmRsaW5nKFBFQVJfRVJST1JfUkVUVVJOKTsKICAgIGRyb3BfdGFibGUoJGRiaCwgJ3BocHRlc3QnKTsKCiAgICBkaWUoJG8tPnRvU3RyaW5nKCkpOwp9CgokZGJoLT5zZXRFcnJvckhhbmRsaW5nKFBFQVJfRVJST1JfQ0FMTEJBQ0ssICdwZScpOwoKCi8vIENsZWFuIHRhYmxlCiRkYmgtPnF1ZXJ5KCJERUxFVEUgRlJPTSBwaHB0ZXN0Iik7CgovLyBBZmZlY3RlZCByb3dzIGJ5IElOU0VSVCBzdGF0ZW1lbnQKJGRiaC0+cXVlcnkoIklOU0VSVCBJTlRPIHBocHRlc3QgKGEsYikgVkFMVUVTKDEsICd0ZXN0JykiKTsKJGRiaC0+cXVlcnkoIklOU0VSVCBJTlRPIHBocHRlc3QgKGEsYikgVkFMVUVTKDIsICd0ZXN0JykiKTsKcHJpbnRmKCIlZCBhZnRlciBpbnNlcnRcbiIsICRkYmgtPmFmZmVjdGVkUm93cygpKTsKCi8vIEFmZmVjdGVkIHJvd3MgYnkgU0VMRUNUIHN0YXRlbWVudAokZGJoLT5xdWVyeSgiU0VMRUNUICogRlJPTSBwaHB0ZXN0Iik7CnByaW50ZigiJWQgYWZ0ZXIgc2VsZWN0XG4iLCAkZGJoLT5hZmZlY3RlZFJvd3MoKSk7CiRkYmgtPnF1ZXJ5KCJERUxFVEUgRlJPTSBwaHB0ZXN0IFdIRVJFIGIgPSAndGVzdCciKTsKcHJpbnRmKCIlZCBhZnRlciBkZWxldGVcbiIsICRkYmgtPmFmZmVjdGVkUm93cygpKTsKCi8vIEFmZmVjdGVkIHJvd3MgYnkgREVMRVRFIHN0YXRlbWVudAokZGJoLT5xdWVyeSgiSU5TRVJUIElOVE8gcGhwdGVzdCAoYSxiKSBWQUxVRVMoMSwgJ3Rlc3QnKSIpOwokZGJoLT5xdWVyeSgiSU5TRVJUIElOVE8gcGhwdGVzdCAoYSxiKSBWQUxVRVMoMiwgJ3Rlc3QnKSIpOwokZGJoLT5xdWVyeSgiREVMRVRFIEZST00gcGhwdGVzdCIpOwpwcmludGYoIiVkIGFmdGVyIGRlbGV0ZSBhbGxcbiIsICRkYmgtPmFmZmVjdGVkUm93cygpKTsKCgokZGJoLT5zZXRFcnJvckhhbmRsaW5nKFBFQVJfRVJST1JfUkVUVVJOKTsKZHJvcF90YWJsZSgkZGJoLCAncGhwdGVzdCcpOwoKPz4KLS1FWFBFQ1QtLQoxIGFmdGVyIGluc2VydAowIGFmdGVyIHNlbGVjdAoyIGFmdGVyIGRlbGV0ZQoyIGFmdGVyIGRlbGV0ZSBhbGwK]]></data>
	</file>
	<file>
	  <filename>/lib/pear/tests/driver/09numrows.phpt</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LS1URVNULS0KREJfZHJpdmVyOjpudW1Sb3dzCi0tSU5JLS0KZXJyb3JfcmVwb3J0aW5nID0gMjA0NwotLVNLSVBJRi0tCjw/cGhwIGNoZGlyKGRpcm5hbWUoX19GSUxFX18pKTsgcmVxdWlyZV9vbmNlICcuL3NraXBpZi5pbmMnOyA/PgotLUZJTEUtLQo8P3BocApyZXF1aXJlX29uY2UgJy4vbWt0YWJsZS5pbmMnOwpyZXF1aXJlX29uY2UgJy4uL251bXJvd3MuaW5jJzsKPz4KLS1FWFBFQ1QtLQood2FudCAxKSBnb3QgMSBmcm9tIGZpcnN0Cih3YW50IDIpIGdvdCAyIGZyb20gMAood2FudCAzKSBnb3QgMyBmcm9tIDEKKHdhbnQgNCkgZ290IDQgZnJvbSAyCih3YW50IDUpIGdvdCA1IGZyb20gMwood2FudCA2KSBnb3QgNiBmcm9tIDQKKHdhbnQgNSkgZ290IDUgZnJvbSA+IDAgKHBhc3NpbmcgcGFyYW1zIHRvIHF1ZXJ5KQood2FudCA0KSBnb3QgNCBmcm9tIDwgNCAoZG9pbmcgcHJlcGFyZS9leGVjdXRlKQood2FudCAyKSBnb3QgMiBmcm9tIDUgYW5kIDYgbm90IGRlbGV0ZWQKKHdhbnQgMCkgZ290IDAgZnJvbSA8IDAK]]></data>
	</file>
	<file>
	  <filename>/lib/pear/tests/driver/10errormap.phpt</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LS1URVNULS0KREJfZHJpdmVyOjplcnJvciBtYXBwaW5nCi0tSU5JLS0KZXJyb3JfcmVwb3J0aW5nID0gMjA0NwotLVNLSVBJRi0tCjw/cGhwIGNoZGlyKGRpcm5hbWUoX19GSUxFX18pKTsgcmVxdWlyZV9vbmNlICcuL3NraXBpZi5pbmMnOyA/PgotLUZJTEUtLQo8P3BocApyZXF1aXJlX29uY2UgJy4vbWt0YWJsZS5pbmMnOwpyZXF1aXJlX29uY2UgJy4uL2Vycm9ycy5pbmMnOwo/PgotLUVYUEVDVC0tCkRCX0VSUk9SX05PU1VDSFRBQkxFIGZvciBzZWxlY3Q6ICBtYXRjaGVzIGV4cGVjdGVkIG91dGNvbWUKREJfRVJST1JfTk9TVUNIVEFCTEUgZm9yIGRyb3A6ICBtYXRjaGVzIGV4cGVjdGVkIG91dGNvbWUKREJfRVJST1JfTk9UX0ZPVU5EIGZvciBkcm9wIGluZGV4OiAgbWF0Y2hlcyBleHBlY3RlZCBvdXRjb21lCkRCX0VSUk9SX0FMUkVBRFlfRVhJU1RTIGZvciBjcmVhdGUgdGFibGU6ICBtYXRjaGVzIGV4cGVjdGVkIG91dGNvbWUKREJfRVJST1JfQUxSRUFEWV9FWElTVFMgZm9yIGNyZWF0ZSBpbmRleDogIG1hdGNoZXMgZXhwZWN0ZWQgb3V0Y29tZQpEQl9FUlJPUl9DT05TVFJBSU5UIGZvciBwcmltYXJ5IGtleSBpbnNlcnQgZHVwbGljYXRlOiAgbWF0Y2hlcyBleHBlY3RlZCBvdXRjb21lCkRCX0VSUk9SX0NPTlNUUkFJTlQgZm9yIHByaW1hcnkga2V5IHVwZGF0ZSBkdXBsaWNhdGU6ICBtYXRjaGVzIGV4cGVjdGVkIG91dGNvbWUKREJfRVJST1JfQ09OU1RSQUlOVCBmb3IgdW5pcXVlIGtleSBpbnNlcnQgZHVwbGljYXRlOiAgbWF0Y2hlcyBleHBlY3RlZCBvdXRjb21lCkRCX0VSUk9SX0NPTlNUUkFJTlQgZm9yIHVuaXF1ZSBrZXkgdXBkYXRlIGR1cGxpY2F0ZTogIG1hdGNoZXMgZXhwZWN0ZWQgb3V0Y29tZQpEQl9FUlJPUl9DT05TVFJBSU5UIGZvciBmb3JlaWduIGtleSBvbiBpbnNlcnQ6ICBtYXRjaGVzIGV4cGVjdGVkIG91dGNvbWUKREJfRVJST1JfQ09OU1RSQUlOVCBmb3IgZm9yZWlnbiBrZXkgb24gZGVsZXRlOiAgbWF0Y2hlcyBleHBlY3RlZCBvdXRjb21lCkRCX0VSUk9SX0NPTlNUUkFJTlRfTk9UX05VTEwgb24gaW5zZXJ0OiAgbWF0Y2hlcyBleHBlY3RlZCBvdXRjb21lCkRCX0VSUk9SX0NPTlNUUkFJTlRfTk9UX05VTEwgb24gdXBkYXRlOiAgbWF0Y2hlcyBleHBlY3RlZCBvdXRjb21lCkRCX0VSUk9SX05PU1VDSEZJRUxEIGpvaW5pbmcgT04gYm9ndXMgY29sdW1uOiAgbWF0Y2hlcyBleHBlY3RlZCBvdXRjb21lCkRCX0VSUk9SX05PU1VDSEZJRUxEIGpvaW5pbmcgVVNJTkcgYm9ndXMgY29sdW1uOiAgbWF0Y2hlcyBleHBlY3RlZCBvdXRjb21lCkRCX0VSUk9SX0RJVlpFUk86ICBtYXRjaGVzIGV4cGVjdGVkIG91dGNvbWUKREJfRVJST1JfSU5WQUxJRF9OVU1CRVIgcHV0dGluZyBjaGFycyBpbiBJTlQgY29sdW1uOiAgbWF0Y2hlcyBleHBlY3RlZCBvdXRjb21lCkRCX0VSUk9SX0lOVkFMSURfTlVNQkVSIHB1dHRpbmcgZmxvYXQgaW4gSU5UIGNvbHVtbjogIG1hdGNoZXMgZXhwZWN0ZWQgb3V0Y29tZQpEQl9FUlJPUl9JTlZBTElEX05VTUJFUiBwdXR0aW5nIGV4Y2Vzc2l2ZSBpbnQgaW4gSU5UIGNvbHVtbjogIG1hdGNoZXMgZXhwZWN0ZWQgb3V0Y29tZQpEQl9FUlJPUl9JTlZBTElEX05VTUJFUiBwdXR0aW5nIGludCBpbiBDSEFSIGNvbHVtbjogIG1hdGNoZXMgZXhwZWN0ZWQgb3V0Y29tZQpEQl9FUlJPUl9OT1NVQ0hGSUVMRDogIG1hdGNoZXMgZXhwZWN0ZWQgb3V0Y29tZQpEQl9FUlJPUl9TWU5UQVg6ICBtYXRjaGVzIGV4cGVjdGVkIG91dGNvbWUKREJfRVJST1JfVkFMVUVfQ09VTlRfT05fUk9XOiAgbWF0Y2hlcyBleHBlY3RlZCBvdXRjb21lCkRCX0VSUk9SX0lOVkFMSUQgb24gQ0hBUiBjb2x1bW4gZGF0YSB0b28gbG9uZzogIG1hdGNoZXMgZXhwZWN0ZWQgb3V0Y29tZQpEQl9FUlJPUl9JTlZBTElEIG9uIFZBUkNIQVIgY29sdW1uIGRhdGEgdG9vIGxvbmc6ICBtYXRjaGVzIGV4cGVjdGVkIG91dGNvbWUK]]></data>
	</file>
	<file>
	  <filename>/lib/pear/tests/driver/11transactions.phpt</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LS1URVNULS0KREJfZHJpdmVyOjp0cmFuc2FjdGlvbiB0ZXN0Ci0tSU5JLS0KZXJyb3JfcmVwb3J0aW5nID0gMjA0NwotLVNLSVBJRi0tCjw/cGhwCmNoZGlyKGRpcm5hbWUoX19GSUxFX18pKTsgcmVxdWlyZV9vbmNlICcuL3NraXBpZi5pbmMnOwppZiAoISRkYmgtPmZlYXR1cmVzWyd0cmFuc2FjdGlvbnMnXSkgewogICAgZGllKCdza2lwIHRoaXMgZHJpdmVyIGRvZXMgbm90IHN1cHBvcnQgdHJhbnNhY3Rpb25zJyk7Cn0KPz4KLS1GSUxFLS0KPD9waHAKJG5lZWRpbm5vZGIgPSB0cnVlOwpyZXF1aXJlX29uY2UgJy4vbWt0YWJsZS5pbmMnOwpyZXF1aXJlX29uY2UgJy4uL3RyYW5zYWN0aW9ucy5pbmMnOwo/PgotLUVYUEVDVC0tCjEpIGFmdGVyIGF1dG9jb21taXQ6IGJpbmcgb25lLiAgb3BzPW9rCjIpIGJlZm9yZSBjb21taXQ6IGJpbmcgb25lIHR3byB0aHJlZS4gIG9wcz1vawozKSBhZnRlciBjb21taXQ6IGJpbmcgb25lIHR3byB0aHJlZS4gIG9wcz1vawo0KSBiZWZvcmUgcm9sbGJhY2s6IGJpbmcgb25lIHR3byB0aHJlZSBmb3VyIGZpdmUuICBvcHM9b2sKNSkgYWZ0ZXIgcm9sbGJhY2s6IGJpbmcgb25lIHR3byB0aHJlZS4gIG9wcz1vawo2KSBiZWZvcmUgYXV0b2NvbW1pdCtyb2xsYmFjazogYmluZyBvbmUgdHdvIHRocmVlIHNpeCBzZXZlbi4gIG9wcz1vawo3KSBhZnRlciBhdXRvY29tbWl0K3JvbGxiYWNrOiBiaW5nIG9uZSB0d28gdGhyZWUgc2l4IHNldmVuLiAgb3BzPW9rCjgpIHRlc3RpbmcgdGhhdCBzZWxlY3QgZG9lc24ndCBkaXN0dXJiZSBvcGNvdW50OiBvawo=]]></data>
	</file>
	<file>
	  <filename>/lib/pear/tests/driver/13limit.phpt</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LS1URVNULS0KREJfZHJpdmVyOjpyb3cgbGltaXQKLS1JTkktLQplcnJvcl9yZXBvcnRpbmcgPSAyMDQ3Ci0tU0tJUElGLS0KPD9waHAgY2hkaXIoZGlybmFtZShfX0ZJTEVfXykpOyByZXF1aXJlX29uY2UgJy4vc2tpcGlmLmluYyc7ID8+Ci0tRklMRS0tCjw/cGhwCnJlcXVpcmVfb25jZSAnLi9jb25uZWN0LmluYyc7CnJlcXVpcmVfb25jZSAnLi9kcm9wdGFibGUuaW5jJzsKcmVxdWlyZV9vbmNlICcuLi9saW1pdC5pbmMnOwo/PgotLUVYUEVDVC0tCj09PT09PT0gRnJvbTogMCB8fCBOdW1iZXIgb2Ygcm93cyB0byBmZXRjaDogMTAgPT09PT09PQoxLi0gcmVzdWx0IDAKMi4tIHJlc3VsdCAxCjMuLSByZXN1bHQgMgo0Li0gcmVzdWx0IDMKNS4tIHJlc3VsdCA0CjYuLSByZXN1bHQgNQo3Li0gcmVzdWx0IDYKOC4tIHJlc3VsdCA3CjkuLSByZXN1bHQgOAoxMC4tIHJlc3VsdCA5ClJvdyBjb3VudCBmb3IgbGltaXRlZCByZXN1bHQ6IDEwCj09PT09PT0gRnJvbTogMTAgfHwgTnVtYmVyIG9mIHJvd3MgdG8gZmV0Y2g6IDEwID09PT09PT0KMTEuLSByZXN1bHQgMTAKMTIuLSByZXN1bHQgMTEKMTMuLSByZXN1bHQgMTIKMTQuLSByZXN1bHQgMTMKMTUuLSByZXN1bHQgMTQKMTYuLSByZXN1bHQgMTUKMTcuLSByZXN1bHQgMTYKMTguLSByZXN1bHQgMTcKMTkuLSByZXN1bHQgMTgKMjAuLSByZXN1bHQgMTkKUm93IGNvdW50IGZvciBsaW1pdGVkIHJlc3VsdDogMTAKPT09PT09PSBGcm9tOiAyMCB8fCBOdW1iZXIgb2Ygcm93cyB0byBmZXRjaDogMTAgPT09PT09PQoyMS4tIHJlc3VsdCAyMAoyMi4tIHJlc3VsdCAyMQoyMy4tIHJlc3VsdCAyMgoyNC4tIHJlc3VsdCAyMwoyNS4tIHJlc3VsdCAyNAoyNi4tIHJlc3VsdCAyNQoyNy4tIHJlc3VsdCAyNgoyOC4tIHJlc3VsdCAyNwoyOS4tIHJlc3VsdCAyOAozMC4tIHJlc3VsdCAyOQpSb3cgY291bnQgZm9yIGxpbWl0ZWQgcmVzdWx0OiAxMAo9PT09PT09IEZyb206IDMwIHx8IE51bWJlciBvZiByb3dzIHRvIGZldGNoOiAxMCA9PT09PT09CjMxLi0gcmVzdWx0IDMwCjMyLi0gcmVzdWx0IDMxCjMzLi0gcmVzdWx0IDMyClJvdyBjb3VudCBmb3IgbGltaXRlZCByZXN1bHQ6IDMKPT09PT09PSBQYXNzaW5nICRwYXJhbXMgfHwgRnJvbTogMTEgfHwgTnVtYmVyIG9mIHJvd3MgdG8gZmV0Y2g6IDMgPT09PT09PQoxMi4tIHJlc3VsdCAxMQoxMy4tIHJlc3VsdCAxMgoxNC4tIHJlc3VsdCAxMwo9PT09PT09IEZyb206IDAgfHwgTnVtYmVyIG9mIHJvd3MgdG8gZmV0Y2g6IDMgfHwgSXRlcmF0aW9uczogMTAgPT09PT09PQpSb3cgY291bnQgZm9yIGxpbWl0ZWQgcmVzdWx0OiAzCg==]]></data>
	</file>
	<file>
	  <filename>/lib/pear/tests/driver/14fetchmode_object.phpt</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LS1URVNULS0KREJfZHJpdmVyOjpmZXRjaG1vZGUgb2JqZWN0Ci0tSU5JLS0KZXJyb3JfcmVwb3J0aW5nID0gMjA0NwotLVNLSVBJRi0tCjw/cGhwIGNoZGlyKGRpcm5hbWUoX19GSUxFX18pKTsgcmVxdWlyZV9vbmNlICcuL3NraXBpZi5pbmMnOyA/PgotLUZJTEUtLQo8P3BocApyZXF1aXJlX29uY2UgJy4vbWt0YWJsZS5pbmMnOwpyZXF1aXJlX29uY2UgJy4uL2ZldGNobW9kZV9vYmplY3QuaW5jJzsKPz4KLS1FWFBFQ1QtLQotLS0gZmV0Y2ggd2l0aCBwYXJhbSBEQl9GRVRDSE1PREVfT0JKRUNUIC0tLQpzdGRjbGFzcyAtPiBhIGIgY2MgZApzdGRjbGFzcyAtPiBhIGIgY2MgZAotLS0gZmV0Y2ggd2l0aCBkZWZhdWx0IGZldGNobW9kZSBEQl9GRVRDSE1PREVfT0JKRUNUIC0tLQpzdGRjbGFzcyAtPiBhIGIgY2MgZApzdGRjbGFzcyAtPiBhIGIgY2MgZAotLS0gZmV0Y2ggd2l0aCBkZWZhdWx0IGZldGNobW9kZSBEQl9GRVRDSE1PREVfT0JKRUNUIGFuZCBjbGFzcyBEQl9yb3cgLS0tCmRiX3JvdyAtPiBhIGIgY2MgZApkYl9yb3cgLT4gYSBiIGNjIGQKLS0tIGZldGNoIHdpdGggZGVmYXVsdCBmZXRjaG1vZGUgREJfRkVUQ0hNT0RFX09CSkVDVCB3aXRoIG5vIGNsYXNzIHRoZW4gREJfcm93IC0tLQpzdGRjbGFzcyAtPiBhIGIgY2MgZApkYl9yb3cgLT4gYSBiIGNjIGQK]]></data>
	</file>
	<file>
	  <filename>/lib/pear/tests/driver/15quote.phpt</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LS1URVNULS0KREJfZHJpdmVyOjpxdW90ZQotLUlOSS0tCmVycm9yX3JlcG9ydGluZyA9IDIwNDcKLS1TS0lQSUYtLQo8P3BocCBjaGRpcihkaXJuYW1lKF9fRklMRV9fKSk7IHJlcXVpcmVfb25jZSAnLi9za2lwaWYuaW5jJzsgPz4KLS1GSUxFLS0KPD9waHAKcmVxdWlyZV9vbmNlICcuL2Nvbm5lY3QuaW5jJzsKcmVxdWlyZV9vbmNlICcuL2Ryb3B0YWJsZS5pbmMnOwoKCi8qKgogKiBMb2NhbCBlcnJvciBjYWxsYmFjayBoYW5kbGVyLgogKgogKiBEcm9wcyB0aGUgcGhwdGVzdCB0YWJsZSwgcHJpbnRzIG91dCBhbiBlcnJvciBtZXNzYWdlIGFuZCBraWxscyB0aGUKICogcHJvY2Vzcy4KICoKICogQHBhcmFtIG9iamVjdCAgJG8gIFBFQVIgZXJyb3Igb2JqZWN0IGF1dG9tYXRpY2FsbHkgcGFzc2VkIHRvIHRoaXMgbWV0aG9kCiAqIEByZXR1cm4gdm9pZAogKiBAc2VlIFBFQVI6OnNldEVycm9ySGFuZGxpbmcoKQogKi8KZnVuY3Rpb24gcGUoJG8pIHsKICAgIGdsb2JhbCAkZGJoOwoKICAgICRkYmgtPnNldEVycm9ySGFuZGxpbmcoUEVBUl9FUlJPUl9SRVRVUk4pOwogICAgZHJvcF90YWJsZSgkZGJoLCAncGVhcnF1b3RlJyk7CgogICAgZGllKCRvLT50b1N0cmluZygpKTsKfQoKLy8gREJNUyBib29sZWFuIGNvbHVtbiB0eXBlIHNpbXVsYXRpb24uLi4KJGJvb2xlYW5fY29sX3R5cGUgPSBhcnJheSgKICAgICdkYmFzZScgID0+ICdMb2dpY2FsJywKICAgICdmYnNxbCcgID0+ICdCT09MRUFOJywKICAgICdpYmFzZScgID0+ICdTTUFMTElOVCcsCiAgICAnaWZ4JyAgICA9PiAnU01BTExJTlQnLAogICAgJ21zcWwnICAgPT4gJ0lOVEVHRVInLAogICAgJ21zc3FsJyAgPT4gJ0JJVCcsCiAgICAnbXlzcWwnICA9PiAnVElOWUlOVCgxKScsCiAgICAnbXlzcWxpJyA9PiAnVElOWUlOVCgxKScsCiAgICAnb2NpOCcgICA9PiAnTlVNQkVSKDEpJywKICAgICdvZGJjJyAgID0+ICdTTUFMTElOVCcsCiAgICAncGdzcWwnICA9PiAnQk9PTEVBTicsCiAgICAnc3FsaXRlJyA9PiAnSU5URUdFUicsCiAgICAnc3liYXNlJyA9PiAnVElOWUlOVCcsCik7CgovLyBhZGp1c3QgdGhpbmdzIGZvciBzcGVjaWZpYyBEQk1TJ3MKCmlmICgkZGJoLT5waHB0eXBlID09ICdvZGJjJykgewogICAgaWYgKCRkYmgtPmRic3ludGF4ID09ICdvZGJjJykgewogICAgICAgICR0eXBlID0gJGRiaC0+cGhwdHlwZTsKICAgIH0gZWxzZSB7CiAgICAgICAgJHR5cGUgPSAkZGJoLT5kYnN5bnRheDsKICAgIH0KfSBlbHNlIHsKICAgICR0eXBlID0gJGRiaC0+cGhwdHlwZTsKfQoKc3dpdGNoICgkdHlwZSkgewogICAgY2FzZSAnYWNjZXNzJzoKICAgICAgICAkZGVjaW1hbCA9ICdTSU5HTEUnOwogICAgICAgICRudWxsID0gJyc7CiAgICAgICAgJGNociAgPSAnVkFSQ0hBUig4KSc7CiAgICAgICAgJGlkZW50aWZpZXIgPSAncVx1dCAiZG50JzsKICAgICAgICBicmVhazsKICAgIGNhc2UgJ2RiMic6CiAgICBjYXNlICdpYmFzZSc6CiAgICAgICAgJGRlY2ltYWwgPSAnREVDSU1BTCgzLDEpJzsKICAgICAgICAkbnVsbCA9ICcnOwogICAgICAgICRjaHIgID0gJ1ZBUkNIQVIoOCknOwogICAgICAgICRpZGVudGlmaWVyID0gJ3FcdXRdICJkblt0JzsKICAgICAgICBicmVhazsKICAgIGNhc2UgJ2lmeCc6CiAgICAgICAgLy8gZG9pbmcgdGhpcyBmb3IgaWZ4IHRvIGtlZXAgY2VydGFpbiB2ZXJzaW9ucyBoYXBweQogICAgICAgICRkZWNpbWFsID0gJ0RFQ0lNQUwoMywxKSc7CiAgICAgICAgJG51bGwgPSAnJzsKICAgICAgICAkY2hyICA9ICdDSEFSKDgpJzsKICAgICAgICAkaWRlbnRpZmllciA9ICcnOwogICAgICAgIGJyZWFrOwogICAgY2FzZSAnbXNxbCc6CiAgICAgICAgJGRlY2ltYWwgPSAnUkVBTCc7CiAgICAgICAgJG51bGwgPSAnJzsKICAgICAgICAkY2hyICA9ICdDSEFSKDgpJzsKICAgICAgICAkaWRlbnRpZmllciA9ICcnOwogICAgICAgIGJyZWFrOwogICAgY2FzZSAnZmJzcWwnOgogICAgY2FzZSAnb2NpOCc6CiAgICAgICAgJGRlY2ltYWwgPSAnREVDSU1BTCgzLDEpJzsKICAgICAgICAkbnVsbCA9ICcnOwogICAgICAgICRjaHIgID0gJ1ZBUkNIQVIoOCknOwogICAgICAgICRpZGVudGlmaWVyID0gJ3FcdXRdIGRuW3QnOwogICAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgICAkZGVjaW1hbCA9ICdERUNJTUFMKDMsMSknOwogICAgICAgICRudWxsID0gJ05VTEwnOwogICAgICAgICRjaHIgID0gJ1ZBUkNIQVIoOCknOwogICAgICAgICRpZGVudGlmaWVyID0gJ3FcdXRdICJkblt0JzsKfQoKJGRiaC0+c2V0RXJyb3JIYW5kbGluZyhQRUFSX0VSUk9SX1JFVFVSTik7CmRyb3BfdGFibGUoJGRiaCwgJ3BlYXJxdW90ZScpOwoKCmlmICgkaWRlbnRpZmllcikgewogICAgc3dpdGNoICgkZGJoLT5waHB0eXBlKSB7CiAgICAgICAgY2FzZSAnc3liYXNlJzoKICAgICAgICAgICAgJHJlcyA9ICRkYmgtPnF1ZXJ5KCdzZXQgcXVvdGVkX2lkZW50aWZpZXIgb24nKTsKICAgICAgICAgICAgaWYgKERCOjppc0Vycm9yKCRyZXMpICkgewogICAgICAgICAgICAgICAgcGUoJHJlcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgIH0KICAgICRjcmVhdGUgPSAkZGJoLT5xdWVyeSgiCiAgICAgICAgQ1JFQVRFIFRBQkxFIHBlYXJxdW90ZSAoCiAgICAgICAgICBuICRkZWNpbWFsICRudWxsLAogICAgICAgICAgcyAkY2hyICRudWxsLAogICAgICAgICAgIiAuICRkYmgtPnF1b3RlSWRlbnRpZmllcigkaWRlbnRpZmllcikgLiAiICRkZWNpbWFsICRudWxsLAogICAgICAgICAgYiB7JGJvb2xlYW5fY29sX3R5cGVbJGRiaC0+cGhwdHlwZV19ICRudWxsCiAgICAgICAgKQogICAgIik7CgogICAgaWYgKERCOjppc0Vycm9yKCRjcmVhdGUpICkgewogICAgICAgIHBlKCRjcmVhdGUpOwogICAgfQoKICAgICRpbmZvID0gJGRiaC0+dGFibGVJbmZvKCdwZWFycXVvdGUnKTsKICAgIGlmIChEQjo6aXNFcnJvcigkaW5mbykgKSB7CiAgICAgICAgaWYgKCRpbmZvLT5jb2RlID09IERCX0VSUk9SX05PVF9DQVBBQkxFKSB7CiAgICAgICAgICAgIHByaW50ICJHb3Qgb3V0Y29tZSBleHBlY3RlZCBmcm9tIGRlbGltaXRlZCBpZGVudGlmaWVyLlxuIjsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBwcmludCAidGFibGVJbmZvKCkgZmFpbGVkLlxuIjsKICAgICAgICB9CiAgICB9IGVsc2UgewogICAgICAgIGlmICgkaWRlbnRpZmllciA9PSAkaW5mb1syXVsnbmFtZSddKSB7CiAgICAgICAgICAgIHByaW50ICJHb3Qgb3V0Y29tZSBleHBlY3RlZCBmcm9tIGRlbGltaXRlZCBpZGVudGlmaWVyLlxuIjsKICAgICAgICAgICAgLy8gcHJpbnQgIkNPTFVNTiBOQU1FIElTOiB7JGluZm9bMl1bJ25hbWUnXX1cbiI7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcHJpbnQgIkV4cGVjdGVkIGNvbHVtbiBuYW1lOiAnJGlkZW50aWZpZXInIC4uLiAiOwogICAgICAgICAgICBwcmludCAiQWN0dWFsIGNvbHVtbiBuYW1lOiAneyRpbmZvWzJdWyduYW1lJ119J1xuIjsKICAgICAgICB9CiAgICB9Cgp9IGVsc2UgewogICAgJGRiaC0+cXVlcnkoIgogICAgICAgIENSRUFURSBUQUJMRSBwZWFycXVvdGUgKAogICAgICAgICAgbiAkZGVjaW1hbCAkbnVsbCwKICAgICAgICAgIHMgJGNociAkbnVsbCwKICAgICAgICAgIHBsYWluaWRlbnRpZmllciAkZGVjaW1hbCAkbnVsbCwKICAgICAgICAgIGIgeyRib29sZWFuX2NvbF90eXBlWyRkYmgtPnBocHR5cGVdfSAkbnVsbAogICAgICAgICkKICAgICIpOwogICAgcHJpbnQgIkdvdCBvdXRjb21lIGV4cGVjdGVkIGZyb20gZGVsaW1pdGVkIGlkZW50aWZpZXIuXG4iOwp9CgoKJGRiaC0+c2V0RXJyb3JIYW5kbGluZyhQRUFSX0VSUk9SX0NBTExCQUNLLCAncGUnKTsKCgokc3RyaW5ncyA9IGFycmF5KAogICAgIiciLAogICAgIlwiIiwKICAgICJcXCIsCiAgICAiJSIsCiAgICAiXyIsCiAgICAiJyciLAogICAgIlwiXCIiLAogICAgIlxcXFwiLAogICAgIlxcJ1xcJyIsCiAgICAiXFxcIlxcXCIiCik7CgokbnVtcyA9IGFycmF5KAogICAgMTIuMywKICAgIDE1LAopOwoKJGJvb2xzID0gYXJyYXkoCiAgICBUUlVFLAogICAgRkFMU0UsCik7CgoKZWNobyAiU3RyaW5nIGVzY2FwZSB0ZXN0OiAiOwpmb3JlYWNoICgkc3RyaW5ncyBhcyAkcykgewogICAgJHF1b3RlZCA9ICRkYmgtPnF1b3RlU21hcnQoJHMpOwogICAgJGRiaC0+cXVlcnkoIklOU0VSVCBJTlRPIHBlYXJxdW90ZSAocykgVkFMVUVTICgkcXVvdGVkKSIpOwp9CiRkaWZmID0gYXJyYXlfZGlmZigkc3RyaW5ncywgJHJlcyA9ICRkYmgtPmdldENvbCgiU0VMRUNUIHMgRlJPTSBwZWFycXVvdGUiKSk7CmlmIChjb3VudCgkZGlmZikgPiAwKSB7CiAgICBlY2hvICJGQUlMIjsKICAgIHByaW50X3IoJHN0cmluZ3MpOwogICAgcHJpbnRfcigkcmVzKTsKfSBlbHNlIHsKICAgIGVjaG8gIk9LIjsKfQoKJGRiaC0+cXVlcnkoIkRFTEVURSBGUk9NIHBlYXJxdW90ZSIpOwoKCmVjaG8gIlxuTnVtYmVyIGVzY2FwZSB0ZXN0OiAiOwpmb3JlYWNoICgkbnVtcyBhcyAkbikgewogICAgJHF1b3RlZCA9ICRkYmgtPnF1b3RlU21hcnQoJG4pOwogICAgJGRiaC0+cXVlcnkoIklOU0VSVCBJTlRPIHBlYXJxdW90ZSAobikgVkFMVUVTICgkcXVvdGVkKSIpOwp9CgokZGlmZiA9IGFycmF5KCk7CiRyZXMgPSYgJGRiaC0+Z2V0Q29sKCdTRUxFQ1QgbiBGUk9NIHBlYXJxdW90ZSBPUkRFUiBCWSBuJyk7CmZvcmVhY2ggKCRudW1zIGFzICRrZXkgPT4gJHZhbCkgewogICAgaWYgKCR2YWwgIT0gJHJlc1ska2V5XSkgewogICAgICAgICRkaWZmW10gPSAiJHZhbCAhPSB7JHJlc1ska2V5XX0iOwogICAgfQp9CgppZiAoY291bnQoJGRpZmYpID4gMCkgewogICAgZWNobyAiRkFJTFxuIjsKICAgIHByaW50X3IoJGRpZmYpOwp9IGVsc2UgewogICAgZWNobyAnT0snOwp9CgokZGJoLT5xdWVyeSgnREVMRVRFIEZST00gcGVhcnF1b3RlJyk7CgoKZWNobyAiXG5Cb29sZWFuIGVzY2FwZSB0ZXN0OiAiOwokaSA9IDE7CmZvcmVhY2ggKCRib29scyBhcyAkYikgewogICAgJHF1b3RlZCA9ICRkYmgtPnF1b3RlU21hcnQoJGIpOwogICAgJGRiaC0+cXVlcnkoIklOU0VSVCBJTlRPIHBlYXJxdW90ZSAobiwgYikgVkFMVUVTICgkaSwgJHF1b3RlZCkiKTsKICAgICRpKys7Cn0KCiRkaWZmID0gYXJyYXkoKTsKJHJlcyA9JiAkZGJoLT5nZXRDb2woJ1NFTEVDVCBiLCBuIEZST00gcGVhcnF1b3RlIE9SREVSIEJZIG4nKTsKZm9yZWFjaCAoJGJvb2xzIGFzICRrZXkgPT4gJHZhbCkgewogICAgaWYgKCR2YWwgPT09IHRydWUpIHsKICAgICAgICBpZiAoJHJlc1ska2V5XSA9PSAxIHx8ICRyZXNbJGtleV0gPT0gdHJ1ZSB8fAogICAgICAgICAgICBzdWJzdHIoc3RydG9sb3dlcigkcmVzWyRrZXldKSwgMCwgMSkgPT0gJ3QnKQogICAgICAgIHsKICAgICAgICAgICAgLy8gZ29vZAogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRkaWZmW10gPSAiaW46dHJ1ZSAhPSBvdXQ6eyRyZXNbJGtleV19IjsKICAgICAgICB9CiAgICB9IGVsc2UgewogICAgICAgIGlmICgkcmVzWyRrZXldID09IDAgfHwgJHJlc1ska2V5XSA9PSBmYWxzZSB8fAogICAgICAgICAgICBzdWJzdHIoc3RydG9sb3dlcigkcmVzWyRrZXldKSwgMCwgMSkgPT0gJ2YnKQogICAgICAgIHsKICAgICAgICAgICAgLy8gZ29vZAogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRkaWZmW10gPSAiaW46ZmFsc2UgIT0gb3V0OnskcmVzWyRrZXldfSI7CiAgICAgICAgfQogICAgfQp9CgppZiAoY291bnQoJGRpZmYpID4gMCkgewogICAgZWNobyAiRkFJTFxuIjsKICAgIHByaW50X3IoJGRpZmYpOwp9IGVsc2UgewogICAgZWNobyAiT0tcbiI7Cn0KCgokZGJoLT5zZXRFcnJvckhhbmRsaW5nKFBFQVJfRVJST1JfUkVUVVJOKTsKZHJvcF90YWJsZSgkZGJoLCAncGVhcnF1b3RlJyk7Cgo/PgotLUVYUEVDVC0tCkdvdCBvdXRjb21lIGV4cGVjdGVkIGZyb20gZGVsaW1pdGVkIGlkZW50aWZpZXIuClN0cmluZyBlc2NhcGUgdGVzdDogT0sKTnVtYmVyIGVzY2FwZSB0ZXN0OiBPSwpCb29sZWFuIGVzY2FwZSB0ZXN0OiBPSwo=]]></data>
	</file>
	<file>
	  <filename>/lib/pear/tests/driver/16tableinfo.phpt</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LS1URVNULS0KREJfZHJpdmVyOjp0YWJsZUluZm8KLS1JTkktLQplcnJvcl9yZXBvcnRpbmcgPSAyMDQ3Ci0tU0tJUElGLS0KPD9waHAKCi8qKgogKiBDYWxscyB0YWJsZUluZm8oKSBpbiB2YXJpb3VzIHdheXMgYW5kIGNoZWNrcyB0byBzZWUgdGhhdCB0aGUgb3V0cHV0CiAqIG1hdGNoZXMgd2hhdCdzIGV4cGVjdGVkLgogKgogKiBUaGVzZSB0ZXN0cyBhY2NvdW50IGZvciBlYWNoIERCTVMgdXNpbmcgZGlmZmVyZW50IGNvbHVtbiB0eXBlcyBhbmQKICogcmVwb3J0aW5nIGJhY2sgZGlmZmVyZW50IGluZm9ybWF0aW9uLiAgVGhlc2UgZGlmZmVyZW5jZXMgYXJlIGFjY291bnRlZAogKiBmb3IgaW4gdGhlIDx2YXI+JHF1aXJrczwvdmFyPiBhcnJheSwgd2hpY2ggaGFzIHRoZSBmb2xsb3dpbmcgZm9ybWF0OgogKgogKiA8cHJlPgogKiAnZHJpdmVyJyA9PiBhcnJheSgKICogICAgICdjbG9iJyA9PiBEQk1TJ3MgY29sdW1uIHR5cGUgZm9yIGNyZWF0aW5nIENMT0IgZmllbGRzCiAqICAgICAnZGF0ZScgPT4gREJNUydzIGNvbHVtbiB0eXBlIGZvciBjcmVhdGluZyBEQVRFIGZpZWxkcwogKiAgICAgJ2RhdGVsaXRlcmFsJyA9PiBUaGUgU1FMIGtleXdvcmQgbmVjZXNzYXJ5IGZvciBkZWZpbmluZyBkYXRlcwogKiAgICAgJ2ZpbmRzX3RhYmxlJyA9PiBDYW4gdGhpcyBEQk1TIGRldGVybWluZSB0YWJsZSBuYW1lcyBmcm9tIHF1ZXJpZXM/CiAqICAgICAnc2l6ZV9mcm9tX3RhYmxlJyA9PiBEb2VzIHRoaXMgREJNUyBrbm93IHRoZSBjb2x1bW4gc2l6ZSB2aWEgdGFibGUgbmFtZT8KICogICAgICdoYW5kbGVzX3Jlc3VsdHMnID0+IENhbiB0aGUgREJNUyBnZXQgaW5mbyBmcm9tIHF1ZXJ5IHJlc3VsdHM/CiAqICAgICAnY29tbWFuZHMnID0+IGFycmF5KAogKiAgICAgICAgIEV4dHJhIGNvbW1hbmRzIHRvIGJlIHBhc3NlZCB0byBQSFAncyBldmFsKCkgZnVuY3Rpb24KICogICAgICkKICogICAgIDAgPT4gYXJyYXkoCiAqICAgICAgICAgLy8gIEluZm8gZXhwZWN0ZWQgdG8gYmUgcmVwb3J0ZWQgZm9yIHBocHRlc3RfZmsuYQogKiAgICAgICAgIC8vICAoSU5URUdFUiBOT1QgTlVMTCkgKFVOSVFVRSBLRVkgd2l0aCBkKQogKiAgICAgICAgICd0eXBlJyA9PiBDb2x1bW4gdHlwZSByZXBvcnRlZCBieSB0aGUgREJNUwogKiAgICAgICAgICdsZW4nID0+IENvbHVtbiBzaXplIHJlcG9ydGVkIGJ5IHRoZSBEQk1TCiAqICAgICAgICAgJ2ZsYWdzJyA9PiBGbGFncyByZXBvcnRlZCBieSB0aGUgREJNUwogKiAgICAgKQogKiAgICAgMSA9PiBhcnJheSgpICBJbmZvIGV4cGVjdGVkIHRvIGJlIHJlcG9ydGVkIGZvciBwaHB0ZXN0X2ZrLmZrCiAqICAgICAgICAgICAgICAgICAgIChJTlRFR0VSIE5PVCBOVUxMKSAoUFJJTUFSWSBLRVkpCiAqICAgICAyID0+IGFycmF5KCkgIEluZm8gZXhwZWN0ZWQgdG8gYmUgcmVwb3J0ZWQgZm9yIHBocHRlc3RfZmsuYwogKiAgICAgICAgICAgICAgICAgICAoQ0xPQi9DSEFSL1ZBUkNIQVIgTlVMTCkKICogICAgIDMgPT4gYXJyYXkoKSAgSW5mbyBleHBlY3RlZCB0byBiZSByZXBvcnRlZCBmb3IgcGhwdGVzdF9may5kCiAqICAgICAgICAgICAgICAgICAgIChEQVRFIE5PVCBOVUxMKSAoVU5JUVVFIEtFWSB3aXRoIGEpCiAqICAgICA0ID0+IGFycmF5KCkgIEluZm8gZXhwZWN0ZWQgdG8gYmUgcmVwb3J0ZWQgZm9yIHBocHRlc3RfZmsuZQogKiAgICAgICAgICAgICAgICAgICAoQ0hBUigyKSBERUZBVUxUICcgZScgTk9UIE5VTEwpCiAqICAgICA1ID0+IGFycmF5KCkgIEluZm8gZXhwZWN0ZWQgdG8gYmUgcmVwb3J0ZWQgZm9yIHBocHRlc3RfZmsuZgogKiAgICAgICAgICAgICAgICAgICAoREVDSU1BTCgyLDEpIE5VTEwpCiAqICAgICA5ID0+IGFycmF5KCkgIEluZm8gZXhwZWN0ZWQgdG8gYmUgcmVwb3J0ZWQgZm9yIHBocHRlc3QuZAogKiAgICAgICAgICAgICAgICAgICAoVkFSQ0hBUigyMCkgTlVMTCkKICogKQogKiA8L3ByZT4KICoKICogQGNhdGVnb3J5IERhdGFiYXNlCiAqIEBwYWNrYWdlICBEQgogKiBAdmVyc2lvbiAgJElkOiAxNnRhYmxlaW5mby5waHB0LHYgMS40MCAyMDA3LzAyLzA2IDA3OjEyOjMwIGFoYXJ2ZXkgRXhwICQKICogQGF1dGhvciAgIERhbmllbCBDb252aXNzb3IgPGRhbmllbGNAYW5hbHlzaXNhbmRzb2x1dGlvbnMuY29tPgogKiBAc2VlICAgICAgREJfY29tbW9uOjp0YWJsZUluZm8oKQogKi8KCmVycm9yX3JlcG9ydGluZyhFX0FMTCk7CmNoZGlyKGRpcm5hbWUoX19GSUxFX18pKTsKcmVxdWlyZV9vbmNlICcuL3NraXBpZi5pbmMnOwokdGFibGVJbmZvID0gJGRiaC0+dGFibGVJbmZvKCdhamtkc2xmYWpvaWprYWRpZScpOwppZiAoREI6OmlzRXJyb3IoJHRhYmxlSW5mbykgJiYgJHRhYmxlSW5mby0+Y29kZSA9PSBEQl9FUlJPUl9OT1RfQ0FQQUJMRSkgewogICAgZGllKCJza2lwICR0YWJsZUluZm8tPm1lc3NhZ2UiKTsKfQoKPz4KLS1GSUxFLS0KPD9waHAKCi8vICAkSWQ6IDE2dGFibGVpbmZvLnBocHQsdiAxLjQwIDIwMDcvMDIvMDYgMDc6MTI6MzAgYWhhcnZleSBFeHAgJAoKLyoqCiAqIENvbm5lY3QgdG8gdGhlIGRhdGFiYXNlIGFuZCBtYWtlIHRoZSBwaHB0ZXN0IHRhYmxlLgogKi8KcmVxdWlyZV9vbmNlICcuL21rdGFibGUuaW5jJzsKCi8qKgogKiBMb2NhbCBlcnJvciBjYWxsYmFjayBoYW5kbGVyLgogKgogKiBJbiBnZW5lcmFsLCBpdCBwcmludHMgb3V0IGFuIGVycm9yIG1lc3NhZ2UgYW5kIGtpbGxzIHRoZSBwcm9jZXNzLgogKiBCdXQgc29tZSBlcnJvcnMgYXJlIGV4cGVjdGVkIGFuZCBhbGxvd2VkIHRvIGV4aXN0LgogKgogKiBAcGFyYW0gb2JqZWN0ICAkbyAgUEVBUiBlcnJvciBvYmplY3QgYXV0b21hdGljYWxseSBwYXNzZWQgdG8gdGhpcyBtZXRob2QKICogQHJldHVybiB2b2lkCiAqIEBzZWUgUEVBUjo6c2V0RXJyb3JIYW5kbGluZygpCiAqLwpmdW5jdGlvbiBwZSgkbyl7CiAgICBnbG9iYWwgJGRiaCwgJHF1aXJrczsKCiAgICBpZiAoJG8tPmdldE1lc3NhZ2UoKSA9PSAiREIgRXJyb3I6IGNhbid0IGRpc3Rpbmd1aXNoIGR1cGxpY2F0ZSBmaWVsZCBuYW1lcyIpIHsKICAgICAgICBwcmludCAiTk9USUNFOiAkZGJoLT5waHB0eXBlIGNhbid0IGRpc3Rpbmd1aXNoIGR1cGxpY2F0ZSBmaWVsZCBuYW1lcyI7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGlmICgkby0+Z2V0Q29kZSgpID09IERCX0VSUk9SX05PVF9DQVBBQkxFICYmCiAgICAgICAgISRxdWlya3NbJGRiaC0+cGhwdHlwZSAuICc6JyAuICRkYmgtPmRic3ludGF4XVsnaGFuZGxlc19yZXN1bHRzJ10pCiAgICB7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICRkYmgtPnNldEVycm9ySGFuZGxpbmcoUEVBUl9FUlJPUl9SRVRVUk4pOwogICAgZHJvcF90YWJsZSgkZGJoLCAncGhwdGVzdCcpOwogICAgZHJvcF90YWJsZSgkZGJoLCAncGhwdGVzdF9maycpOwoKICAgIGRpZSgkby0+dG9TdHJpbmcoKSk7Cn0KCi8qKgogKiBMb29wIHRocm91Z2ggYW4gYXJyYXkgcmV0dXJuZWQgZnJvbSB0YWJsZUluZm8oKSwgY29tcGFyZSB0aGUgYWN0dWFsCiAqIGNvbnRlbnRzIHRvIHRoZSBleHBlY3RlZCBjb250ZW50cy4gIElmIHRoZSBhY3R1YWwgcmVzdWx0cyBtYXRjaCB0aGUKICogZXhwZWN0YXRpb25zLCBzYXkgc28uICBJZiBub3QsIHNheSBzbyBhbmQgc2hvdyB0aGUgaW5mb3JtYXRpb24uCiAqCiAqIEBwYXJhbSBhcnJheSAgICRhcnJheSAgICAgdGhlIGFycmF5IHRvIGJlIGV4YW1pbmVkCiAqIEBwYXJhbSBzdHJpbmcgICRleHBlY3RlZCAgdGhlIGV4cGVjdGVkIGNvbnRlbnRzIG9mIHRoZSBhcnJheQogKiBAcGFyYW0gc3RyaW5nICAkZmllbGQgICAgIGZpZWxkIGluZGV4IG51bWJlciBvZiAkcXVyaWtzIGFuZCB0YWJsZQogKiBAcGFyYW0gYm9vbGVhbiAkcXVlcnkgICAgIHRydWUgaWYgYXJyYXkgaXMgZnJvbSBhIHF1ZXJ5IG9yIGZhbHNlIGlmIGFycmF5CiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgdGFibGVJbmZvKCkKICogQHJldHVybiB2b2lkCiAqLwpmdW5jdGlvbiBleGFtaW5lQXJyYXlEYXRhKCRhcnJheSwgJGV4cGVjdGVkLCAkZmllbGQgPSBmYWxzZSwgJHF1ZXJ5ID0gdHJ1ZSkgewogICAgZ2xvYmFsICRkYmgsICRxdWlya3M7CgogICAgJHF1aXJrX2tleSA9ICRkYmgtPnBocHR5cGUgLiAnOicgLiAkZGJoLT5kYnN5bnRheDsKCiAgICBpZiAoREI6OmlzRXJyb3IoJGFycmF5KSAmJiAkYXJyYXktPmdldENvZGUoKSA9PSBEQl9FUlJPUl9OT1RfQ0FQQUJMRSkgewogICAgICAgIHByaW50ICJtYXRjaGVkIGV4cGVjdGVkIHJlc3VsdFxuIjsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgaWYgKCFpc19hcnJheSgkYXJyYXkpKSB7CiAgICAgICAgcHJpbnQgIlRoaXMgRE1CUyBkaWRuJ3QgcHJvZHVjZSBwcm9wZXIgcmVzdWx0c1xuIjsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgaWYgKGlzX2ludCgkZmllbGQpKSB7CiAgICAgICAgJGFycmF5ID0gJGFycmF5WyRmaWVsZF07CiAgICB9CgogICAgJGFjdHVhbCA9ICcnOwogICAgZm9yZWFjaCAoJGFycmF5IGFzICRrZXkgPT4gJHZhbHVlKSB7CiAgICAgICAgaWYgKCRmaWVsZCAhPT0gZmFsc2UgJiYKICAgICAgICAgICAgaXNzZXQoJHF1aXJrc1skcXVpcmtfa2V5XVskZmllbGRdWyRrZXldKSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICgka2V5ID09ICdmbGFncycgJiYgJHZhbHVlID09ICcnICYmICRxdWVyeSAmJgogICAgICAgICAgICAgICAgISRxdWlya3NbJHF1aXJrX2tleV1bJ2ZpbmRzX3RhYmxlJ10pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRhY3R1YWwgLj0gIiRrZXkgLi4uIG1hdGNoZWQgZXhwZWN0ZWQgdmFsdWVcbiI7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBpZiAoJHF1aXJrc1skcXVpcmtfa2V5XVskZmllbGRdWyRrZXldID09ICR2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgICRhY3R1YWwgLj0gIiRrZXkgLi4uIG1hdGNoZWQgZXhwZWN0ZWQgdmFsdWVcbiI7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGlmICgkdmFsdWUgPT0gMAogICAgICAgICAgICAgICAgICAgICAgICAmJiAhJHF1aXJrc1skcXVpcmtfa2V5XVsnc2l6ZV9mcm9tX3RhYmxlJ10pCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAkYWN0dWFsIC49ICIka2V5IC4uLiBtYXRjaGVkIGV4cGVjdGVkIHZhbHVlXG4iOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRhY3R1YWwgLj0gIiRrZXkgLi4uIHdhcyAnJHZhbHVlJyBidXQgd2UgZXhwZWN0ZWQgIjsKICAgICAgICAgICAgICAgICAgICAgICAgJGFjdHVhbCAuPSAiJ3skcXVpcmtzWyRxdWlya19rZXldWyRmaWVsZF1bJGtleV19J1xuIjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiAoJGtleSA9PSAndGFibGUnKSB7CiAgICAgICAgICAgICAgICBpZiAoJGZpZWxkIDw9IDUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJHZhbHVlID09ICdwaHB0ZXN0X2ZrJykgewogICAgICAgICAgICAgICAgICAgICAgICAkYWN0dWFsIC49ICIka2V5IC4uLiBtYXRjaGVkIGV4cGVjdGVkIHZhbHVlXG4iOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkdmFsdWUgPT0gJycgJiYgJHF1ZXJ5ICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAhJHF1aXJrc1skcXVpcmtfa2V5XVsnZmluZHNfdGFibGUnXSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGFjdHVhbCAuPSAiJGtleSAuLi4gbWF0Y2hlZCBleHBlY3RlZCB2YWx1ZVxuIjsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRhY3R1YWwgLj0gIiRrZXkgLi4uIHdhcyAnJHZhbHVlJyBidXQgd2UgZXhwZWN0ZWQgJ3BocHRlc3RfZmsnXG4iOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJHZhbHVlID09ICdwaHB0ZXN0JykgewogICAgICAgICAgICAgICAgICAgICAgICAkYWN0dWFsIC49ICIka2V5IC4uLiBtYXRjaGVkIGV4cGVjdGVkIHZhbHVlXG4iOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkdmFsdWUgPT0gJycgJiYgJHF1ZXJ5ICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAhJHF1aXJrc1skcXVpcmtfa2V5XVsnZmluZHNfdGFibGUnXSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGFjdHVhbCAuPSAiJGtleSAuLi4gbWF0Y2hlZCBleHBlY3RlZCB2YWx1ZVxuIjsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRhY3R1YWwgLj0gIiRrZXkgLi4uIHdhcyAnJHZhbHVlJyBidXQgd2UgZXhwZWN0ZWQgJ3BocHRlc3RfZmsnXG4iOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJGFjdHVhbCAuPSAiJGtleSA9PiAkdmFsdWVcbiI7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBpZiAoJGFjdHVhbCA9PSAkZXhwZWN0ZWQpIHsKICAgICAgICBwcmludCAibWF0Y2hlZCBleHBlY3RlZCByZXN1bHRcbiI7CiAgICB9IGVsc2UgewogICAgICAgIHByaW50ICJESUROJ1QgbWF0Y2ggZXhwZWN0ZWQgdmFsdWVzLi4uXG4iOwogICAgICAgIHByaW50ICJ+fn5+fn5+flxuRXhwZWN0ZWQ6XG4kZXhwZWN0ZWRcbiI7CiAgICAgICAgcHJpbnQgIn5+fn5cbkFjdHVhbDpcbiRhY3R1YWxcbn5+fn5+fn5+XG5cbiI7CiAgICB9Cn0KCi8qKgogKiBMb29wIHRocm91Z2ggYW4gYXJyYXkgb2YgdGFibGUgaW5mbyBkYXRhIGFuZCByZXR1cm4gdGhlIHJlc3VsdHMuCiAqCiAqIEBwYXJhbSBhcnJheSAgJGFycmF5ICB0aGUgYXJyYXkgdG8gYmUgZXhhbWluZWQKICogQHJldHVybiBzdHJpbmcKICovCmZ1bmN0aW9uIHJldHVybkFycmF5RGF0YSgkYXJyYXkpIHsKICAgIGdsb2JhbCAkZGJoLCAkcXVpcmtzOwoKICAgICRxdWlya19rZXkgPSAkZGJoLT5waHB0eXBlIC4gJzonIC4gJGRiaC0+ZGJzeW50YXg7CgogICAgaWYgKCEkcXVpcmtzWyRxdWlya19rZXldWydoYW5kbGVzX3Jlc3VsdHMnXSkgewogICAgICAgIHJldHVybiAiXG4iOwogICAgfQoKICAgICRvdXQgPSAnJzsKICAgIGZvcmVhY2ggKCRhcnJheSBhcyAka2V5ID0+ICR2YWx1ZSkgewogICAgICAgICRvdXQgLj0gIiRrZXkgPT4gJHZhbHVlXG4iOwogICAgfQogICAgcmV0dXJuICRvdXQ7Cn0KCgokZGJoLT5zZXRFcnJvckhhbmRsaW5nKFBFQVJfRVJST1JfQ0FMTEJBQ0ssICdwZScpOwoKCiRxdWlya3MgPSBhcnJheSgKICAgICdmYnNxbDpmYnNxbCcgPT4gYXJyYXkoCiAgICAgICAgJ2Nsb2InID0+ICdDSEFSKDI5KScsCiAgICAgICAgJ2RhdGUnID0+ICdEQVRFJywKICAgICAgICAnZGF0ZWxpdGVyYWwnID0+ICcgREFURSAnLAogICAgICAgICdmaW5kc190YWJsZScgPT4gZmFsc2UsCiAgICAgICAgJ3NpemVfZnJvbV90YWJsZScgPT4gZmFsc2UsCiAgICAgICAgJ2hhbmRsZXNfcmVzdWx0cycgPT4gdHJ1ZSwKICAgICAgICAnY29tbWFuZHMnID0+IGFycmF5KAogICAgICAgICksCiAgICAgICAgMCA9PiBhcnJheSgKICAgICAgICAgICAgJ3R5cGUnID0+ICdJTlRFR0VSJywKICAgICAgICAgICAgJ2xlbicgPT4gMCwKICAgICAgICAgICAgJ2ZsYWdzJyA9PiAnJywKICAgICAgICApLAogICAgICAgIDEgPT4gYXJyYXkoCiAgICAgICAgICAgICd0eXBlJyA9PiAnSU5URUdFUicsCiAgICAgICAgICAgICdsZW4nID0+IDAsCiAgICAgICAgICAgICdmbGFncycgPT4gJ25vdF9udWxsJywKICAgICAgICApLAogICAgICAgIDIgPT4gYXJyYXkoCiAgICAgICAgICAgICd0eXBlJyA9PiAnQ0hBUkFDVEVSJywKICAgICAgICAgICAgJ2xlbicgPT4gMjksCiAgICAgICAgICAgICdmbGFncycgPT4gJycsCiAgICAgICAgKSwKICAgICAgICAzID0+IGFycmF5KAogICAgICAgICAgICAndHlwZScgPT4gJ0RBVEUnLAogICAgICAgICAgICAnbGVuJyA9PiAwLAogICAgICAgICAgICAnZmxhZ3MnID0+ICcnLAogICAgICAgICksCiAgICAgICAgNCA9PiBhcnJheSgKICAgICAgICAgICAgJ3R5cGUnID0+ICdDSEFSQUNURVInLAogICAgICAgICAgICAnbGVuJyA9PiAyLAogICAgICAgICAgICAnZmxhZ3MnID0+ICcnLAogICAgICAgICksCiAgICAgICAgNSA9PiBhcnJheSgKICAgICAgICAgICAgJ3R5cGUnID0+ICdERUNJTUFMJywKICAgICAgICAgICAgJ2xlbicgPT4gMCwKICAgICAgICAgICAgJ2ZsYWdzJyA9PiAnJywKICAgICAgICApLAogICAgICAgIDkgPT4gYXJyYXkoCiAgICAgICAgICAgICd0eXBlJyA9PiAnQ0hBUkFDVEVSJywKICAgICAgICAgICAgJ2xlbicgPT4gMjAsCiAgICAgICAgICAgICdmbGFncycgPT4gJycsCiAgICAgICAgKSwKICAgICksCgogICAgJ2liYXNlOmliYXNlJyA9PiBhcnJheSgKICAgICAgICAnY2xvYicgPT4gJ1ZBUkNIQVIoNTApJywKICAgICAgICAnZGF0ZScgPT4gJ0RBVEUnLAogICAgICAgICdkYXRlbGl0ZXJhbCcgPT4gJycsCiAgICAgICAgJ2ZpbmRzX3RhYmxlJyA9PiBmYWxzZSwKICAgICAgICAnc2l6ZV9mcm9tX3RhYmxlJyA9PiBmYWxzZSwKICAgICAgICAnaGFuZGxlc19yZXN1bHRzJyA9PiB0cnVlLAogICAgICAgICdjb21tYW5kcycgPT4gYXJyYXkoCiAgICAgICAgKSwKICAgICAgICAwID0+IGFycmF5KAogICAgICAgICAgICAndHlwZScgPT4gJ0lOVEVHRVInLAogICAgICAgICAgICAnbGVuJyA9PiA0LAogICAgICAgICAgICAnZmxhZ3MnID0+ICd1bmlxdWVfa2V5IG5vdF9udWxsJywKICAgICAgICApLAogICAgICAgIDEgPT4gYXJyYXkoCiAgICAgICAgICAgICd0eXBlJyA9PiAnSU5URUdFUicsCiAgICAgICAgICAgICdsZW4nID0+IDQsCiAgICAgICAgICAgICdmbGFncycgPT4gJ3ByaW1hcnlfa2V5IG5vdF9udWxsJywKICAgICAgICApLAogICAgICAgIDIgPT4gYXJyYXkoCiAgICAgICAgICAgICd0eXBlJyA9PiAnVkFSQ0hBUicsCiAgICAgICAgICAgICdsZW4nID0+IDUwLAogICAgICAgICAgICAnZmxhZ3MnID0+ICcnLAogICAgICAgICksCiAgICAgICAgMyA9PiBhcnJheSgKICAgICAgICAgICAgJ3R5cGUnID0+ICdEQVRFJywKICAgICAgICAgICAgJ2xlbicgPT4gNCwKICAgICAgICAgICAgJ2ZsYWdzJyA9PiAndW5pcXVlX2tleSBub3RfbnVsbCcsCiAgICAgICAgKSwKICAgICAgICA0ID0+IGFycmF5KAogICAgICAgICAgICAndHlwZScgPT4gJ0NIQVInLAogICAgICAgICAgICAnbGVuJyA9PiAyLAogICAgICAgICAgICAnZmxhZ3MnID0+ICdub3RfbnVsbCBkZWZhdWx0JywKICAgICAgICApLAogICAgICAgIDUgPT4gYXJyYXkoCiAgICAgICAgICAgICd0eXBlJyA9PiAnTlVNRVJJQyg5LDEpJywKICAgICAgICAgICAgJ2xlbicgPT4gNCwKICAgICAgICAgICAgJ2ZsYWdzJyA9PiAnJywKICAgICAgICApLAogICAgICAgIDkgPT4gYXJyYXkoCiAgICAgICAgICAgICd0eXBlJyA9PiAnVkFSQ0hBUicsCiAgICAgICAgICAgICdsZW4nID0+IDIwLAogICAgICAgICAgICAnZmxhZ3MnID0+ICcnLAogICAgICAgICksCiAgICApLAoKICAgICdpYmFzZTpmaXJlYmlyZCcgPT4gYXJyYXkoCiAgICAgICAgJ2Nsb2InID0+ICdWQVJDSEFSKDUwKScsCiAgICAgICAgJ2RhdGUnID0+ICdEQVRFJywKICAgICAgICAnZGF0ZWxpdGVyYWwnID0+ICcnLAogICAgICAgICdmaW5kc190YWJsZScgPT4gZmFsc2UsCiAgICAgICAgJ3NpemVfZnJvbV90YWJsZScgPT4gZmFsc2UsCiAgICAgICAgJ2hhbmRsZXNfcmVzdWx0cycgPT4gdHJ1ZSwKICAgICAgICAnY29tbWFuZHMnID0+IGFycmF5KAogICAgICAgICksCiAgICAgICAgMCA9PiBhcnJheSgKICAgICAgICAgICAgJ3R5cGUnID0+ICdJTlRFR0VSJywKICAgICAgICAgICAgJ2xlbicgPT4gNCwKICAgICAgICAgICAgJ2ZsYWdzJyA9PiAndW5pcXVlX2tleSBub3RfbnVsbCcsCiAgICAgICAgKSwKICAgICAgICAxID0+IGFycmF5KAogICAgICAgICAgICAndHlwZScgPT4gJ0lOVEVHRVInLAogICAgICAgICAgICAnbGVuJyA9PiA0LAogICAgICAgICAgICAnZmxhZ3MnID0+ICdwcmltYXJ5X2tleSBub3RfbnVsbCcsCiAgICAgICAgKSwKICAgICAgICAyID0+IGFycmF5KAogICAgICAgICAgICAndHlwZScgPT4gJ1ZBUkNIQVInLAogICAgICAgICAgICAnbGVuJyA9PiA1MCwKICAgICAgICAgICAgJ2ZsYWdzJyA9PiAnJywKICAgICAgICApLAogICAgICAgIDMgPT4gYXJyYXkoCiAgICAgICAgICAgICd0eXBlJyA9PiAnREFURScsCiAgICAgICAgICAgICdsZW4nID0+IDQsCiAgICAgICAgICAgICdmbGFncycgPT4gJ3VuaXF1ZV9rZXkgbm90X251bGwnLAogICAgICAgICksCiAgICAgICAgNCA9PiBhcnJheSgKICAgICAgICAgICAgJ3R5cGUnID0+ICdDSEFSJywKICAgICAgICAgICAgJ2xlbicgPT4gMiwKICAgICAgICAgICAgJ2ZsYWdzJyA9PiAnbm90X251bGwgZGVmYXVsdCcsCiAgICAgICAgKSwKICAgICAgICA1ID0+IGFycmF5KAogICAgICAgICAgICAndHlwZScgPT4gJ05VTUVSSUMoOSwxKScsCiAgICAgICAgICAgICdsZW4nID0+IDQsCiAgICAgICAgICAgICdmbGFncycgPT4gJycsCiAgICAgICAgKSwKICAgICAgICA5ID0+IGFycmF5KAogICAgICAgICAgICAndHlwZScgPT4gJ1ZBUkNIQVInLAogICAgICAgICAgICAnbGVuJyA9PiAyMCwKICAgICAgICAgICAgJ2ZsYWdzJyA9PiAnJywKICAgICAgICApLAogICAgKSwKCiAgICAnaWZ4OmlmeCcgPT4gYXJyYXkoCiAgICAgICAgJ2Nsb2InID0+ICdDSEFSKDI5KScsCiAgICAgICAgJ2RhdGUnID0+ICdDSEFSKDEwKScsCiAgICAgICAgJ2RhdGVsaXRlcmFsJyA9PiAnJywKICAgICAgICAnZmluZHNfdGFibGUnID0+IGZhbHNlLAogICAgICAgICdzaXplX2Zyb21fdGFibGUnID0+IGZhbHNlLAogICAgICAgICdoYW5kbGVzX3Jlc3VsdHMnID0+IHRydWUsCiAgICAgICAgJ2NvbW1hbmRzJyA9PiBhcnJheSgKICAgICAgICApLAogICAgICAgIDAgPT4gYXJyYXkoCiAgICAgICAgICAgICd0eXBlJyA9PiAnU1FMSU5UJywKICAgICAgICAgICAgJ2xlbicgPT4gNCwKICAgICAgICAgICAgJ2ZsYWdzJyA9PiAnbm90X251bGwnLAogICAgICAgICksCiAgICAgICAgMSA9PiBhcnJheSgKICAgICAgICAgICAgJ3R5cGUnID0+ICdTUUxJTlQnLAogICAgICAgICAgICAnbGVuJyA9PiA0LAogICAgICAgICAgICAnZmxhZ3MnID0+ICdub3RfbnVsbCcsCiAgICAgICAgKSwKICAgICAgICAyID0+IGFycmF5KAogICAgICAgICAgICAndHlwZScgPT4gJ1NRTENIQVInLAogICAgICAgICAgICAnbGVuJyA9PiAyOSwKICAgICAgICAgICAgJ2ZsYWdzJyA9PiAnJywKICAgICAgICApLAogICAgICAgIDMgPT4gYXJyYXkoCiAgICAgICAgICAgICd0eXBlJyA9PiAnU1FMQ0hBUicsCiAgICAgICAgICAgICdsZW4nID0+IDEwLAogICAgICAgICAgICAnZmxhZ3MnID0+ICdub3RfbnVsbCcsCiAgICAgICAgKSwKICAgICAgICA0ID0+IGFycmF5KAogICAgICAgICAgICAndHlwZScgPT4gJ1NRTENIQVInLAogICAgICAgICAgICAnbGVuJyA9PiAyLAogICAgICAgICAgICAnZmxhZ3MnID0+ICdub3RfbnVsbCcsCiAgICAgICAgKSwKICAgICAgICA1ID0+IGFycmF5KAogICAgICAgICAgICAndHlwZScgPT4gJ1NRTERFQ0lNQUwnLAogICAgICAgICAgICAnbGVuJyA9PiA1MTMsCiAgICAgICAgICAgICdmbGFncycgPT4gJycsCiAgICAgICAgKSwKICAgICAgICA5ID0+IGFycmF5KAogICAgICAgICAgICAndHlwZScgPT4gJ1NRTENIQVInLAogICAgICAgICAgICAnbGVuJyA9PiAyMCwKICAgICAgICAgICAgJ2ZsYWdzJyA9PiAnJywKICAgICAgICApLAogICAgKSwKCiAgICAnbXNxbDptc3FsJyA9PiBhcnJheSgKICAgICAgICAnY2xvYicgPT4gJ1RFWFQoMjU1KScsCiAgICAgICAgJ2RhdGUnID0+ICdDSEFSKDEwKScsCiAgICAgICAgJ2RhdGVsaXRlcmFsJyA9PiAnJywKICAgICAgICAnZmluZHNfdGFibGUnID0+IHRydWUsCiAgICAgICAgJ3NpemVfZnJvbV90YWJsZScgPT4gdHJ1ZSwKICAgICAgICAnaGFuZGxlc19yZXN1bHRzJyA9PiB0cnVlLAogICAgICAgICdjb21tYW5kcycgPT4gYXJyYXkoCiAgICAgICAgKSwKICAgICAgICAwID0+IGFycmF5KAogICAgICAgICAgICAndHlwZScgPT4gJ2ludCcsCiAgICAgICAgICAgICdsZW4nID0+IDQsCiAgICAgICAgICAgICdmbGFncycgPT4gJ25vdF9udWxsJywKICAgICAgICApLAogICAgICAgIDEgPT4gYXJyYXkoCiAgICAgICAgICAgICd0eXBlJyA9PiAnaW50JywKICAgICAgICAgICAgJ2xlbicgPT4gNCwKICAgICAgICAgICAgLy8gZm9yIHNvbWUgcmVhc29uLCB0aGUgdW5pcXVlIHByb3BlcnR5IGFsd2F5cyBjb250YWlucyAwCiAgICAgICAgICAgIC8vICdmbGFncycgPT4gJ3VuaXF1ZV9rZXkgbm90X251bGwnLAogICAgICAgICAgICAnZmxhZ3MnID0+ICdub3RfbnVsbCcsCiAgICAgICAgKSwKICAgICAgICAyID0+IGFycmF5KAogICAgICAgICAgICAndHlwZScgPT4gJ3RleHQnLAogICAgICAgICAgICAnbGVuJyA9PiAyNTUsCiAgICAgICAgICAgICdmbGFncycgPT4gJycsCiAgICAgICAgKSwKICAgICAgICAzID0+IGFycmF5KAogICAgICAgICAgICAndHlwZScgPT4gJ2NoYXInLAogICAgICAgICAgICAnbGVuJyA9PiAxMCwKICAgICAgICAgICAgJ2ZsYWdzJyA9PiAnbm90X251bGwnLAogICAgICAgICksCiAgICAgICAgNCA9PiBhcnJheSgKICAgICAgICAgICAgJ3R5cGUnID0+ICdjaGFyJywKICAgICAgICAgICAgJ2xlbicgPT4gMiwKICAgICAgICAgICAgJ2ZsYWdzJyA9PiAnbm90X251bGwnLAogICAgICAgICksCiAgICAgICAgNSA9PiBhcnJheSgKICAgICAgICAgICAgJ3R5cGUnID0+ICdyZWFsJywKICAgICAgICAgICAgJ2xlbicgPT4gOCwKICAgICAgICAgICAgJ2ZsYWdzJyA9PiAnJywKICAgICAgICApLAogICAgICAgIDkgPT4gYXJyYXkoCiAgICAgICAgICAgICd0eXBlJyA9PiAnY2hhcicsCiAgICAgICAgICAgICdsZW4nID0+IDIwLAogICAgICAgICAgICAnZmxhZ3MnID0+ICcnLAogICAgICAgICksCiAgICApLAoKICAgICdtc3NxbDptc3NxbCcgPT4gYXJyYXkoCiAgICAgICAgJ2Nsb2InID0+ICdURVhUJywKICAgICAgICAnZGF0ZScgPT4gJ1NNQUxMREFURVRJTUUnLAogICAgICAgICdkYXRlbGl0ZXJhbCcgPT4gJycsCiAgICAgICAgJ2ZpbmRzX3RhYmxlJyA9PiBmYWxzZSwKICAgICAgICAnc2l6ZV9mcm9tX3RhYmxlJyA9PiBmYWxzZSwKICAgICAgICAnaGFuZGxlc19yZXN1bHRzJyA9PiB0cnVlLAogICAgICAgICdjb21tYW5kcycgPT4gYXJyYXkoCiAgICAgICAgICAgICdpbmlfc2V0KCJtc3NxbC5kYXRldGltZWNvbnZlcnQiLCAiT2ZmIik7JywKICAgICAgICAgICAgJyRkYmgtPnF1ZXJ5KCJTRVQgREFURUZPUk1BVCB5bWQiKTsnLAogICAgICAgICksCiAgICAgICAgMCA9PiBhcnJheSgKICAgICAgICAgICAgJ3R5cGUnID0+ICdpbnQnLAogICAgICAgICAgICAnbGVuJyA9PiA0LAogICAgICAgICAgICAnZmxhZ3MnID0+ICdtdWx0aXBsZV9rZXkgdW5pcXVlX2tleSBub3RfbnVsbCcsCiAgICAgICAgKSwKICAgICAgICAxID0+IGFycmF5KAogICAgICAgICAgICAndHlwZScgPT4gJ2ludCcsCiAgICAgICAgICAgICdsZW4nID0+IDQsCiAgICAgICAgICAgICdmbGFncycgPT4gJ3ByaW1hcnlfa2V5IG5vdF9udWxsJywKICAgICAgICApLAogICAgICAgIDIgPT4gYXJyYXkoCiAgICAgICAgICAgICd0eXBlJyA9PiAndGV4dCcsCiAgICAgICAgICAgICdsZW4nID0+IDQwOTYsCiAgICAgICAgICAgICdmbGFncycgPT4gJycsCiAgICAgICAgKSwKICAgICAgICAzID0+IGFycmF5KAogICAgICAgICAgICAndHlwZScgPT4gJ2RhdGV0aW1lJywKICAgICAgICAgICAgJ2xlbicgPT4gNCwKICAgICAgICAgICAgJ2ZsYWdzJyA9PiAnbXVsdGlwbGVfa2V5IHVuaXF1ZV9rZXkgbm90X251bGwnLAogICAgICAgICksCiAgICAgICAgNCA9PiBhcnJheSgKICAgICAgICAgICAgJ3R5cGUnID0+ICdjaGFyJywKICAgICAgICAgICAgJ2xlbicgPT4gMiwKICAgICAgICAgICAgJ2ZsYWdzJyA9PiAnbm90X251bGwnLAogICAgICAgICksCiAgICAgICAgNSA9PiBhcnJheSgKICAgICAgICAgICAgJ3R5cGUnID0+ICdyZWFsJywKICAgICAgICAgICAgJ2xlbicgPT4gOCwKICAgICAgICAgICAgJ2ZsYWdzJyA9PiAnJywKICAgICAgICApLAogICAgICAgIDkgPT4gYXJyYXkoCiAgICAgICAgICAgICd0eXBlJyA9PiAnY2hhcicsCiAgICAgICAgICAgICdsZW4nID0+IDIwLAogICAgICAgICAgICAnZmxhZ3MnID0+ICcnLAogICAgICAgICksCiAgICApLAoKICAgICdteXNxbDpteXNxbCcgPT4gYXJyYXkoCiAgICAgICAgJ2Nsb2InID0+ICdURVhUJywKICAgICAgICAnZGF0ZScgPT4gJ0RBVEUnLAogICAgICAgICdkYXRlbGl0ZXJhbCcgPT4gJycsCiAgICAgICAgJ2ZpbmRzX3RhYmxlJyA9PiB0cnVlLAogICAgICAgICdzaXplX2Zyb21fdGFibGUnID0+IHRydWUsCiAgICAgICAgJ2hhbmRsZXNfcmVzdWx0cycgPT4gdHJ1ZSwKICAgICAgICAnY29tbWFuZHMnID0+IGFycmF5KAogICAgICAgICksCiAgICAgICAgMCA9PiBhcnJheSgKICAgICAgICAgICAgJ3R5cGUnID0+ICdpbnQnLAogICAgICAgICAgICAnbGVuJyA9PiAxMSwKICAgICAgICAgICAgJ2ZsYWdzJyA9PiAnbm90X251bGwgbXVsdGlwbGVfa2V5JywKICAgICAgICApLAogICAgICAgIDEgPT4gYXJyYXkoCiAgICAgICAgICAgICd0eXBlJyA9PiAnaW50JywKICAgICAgICAgICAgJ2xlbicgPT4gMTEsCiAgICAgICAgICAgICdmbGFncycgPT4gJ25vdF9udWxsIHByaW1hcnlfa2V5JywKICAgICAgICApLAogICAgICAgIDIgPT4gYXJyYXkoCiAgICAgICAgICAgICd0eXBlJyA9PiAnYmxvYicsCiAgICAgICAgICAgICdsZW4nID0+IDY1NTM1LAogICAgICAgICAgICAnZmxhZ3MnID0+ICdibG9iJywKICAgICAgICApLAogICAgICAgIDMgPT4gYXJyYXkoCiAgICAgICAgICAgICd0eXBlJyA9PiAnZGF0ZScsCiAgICAgICAgICAgICdsZW4nID0+IDEwLAogICAgICAgICAgICAnZmxhZ3MnID0+ICdub3RfbnVsbCBtdWx0aXBsZV9rZXkgYmluYXJ5JywKICAgICAgICApLAogICAgICAgIDQgPT4gYXJyYXkoCiAgICAgICAgICAgICd0eXBlJyA9PiAnc3RyaW5nJywKICAgICAgICAgICAgJ2xlbicgPT4gMiwKICAgICAgICAgICAgJ2ZsYWdzJyA9PiAnbm90X251bGwnLAogICAgICAgICksCiAgICAgICAgNSA9PiBhcnJheSgKICAgICAgICAgICAgJ3R5cGUnID0+ICdyZWFsJywKICAgICAgICAgICAgJ2xlbicgPT4gNCwKICAgICAgICAgICAgJ2ZsYWdzJyA9PiAnJywKICAgICAgICApLAogICAgICAgIDkgPT4gYXJyYXkoCiAgICAgICAgICAgICd0eXBlJyA9PiAnc3RyaW5nJywKICAgICAgICAgICAgJ2xlbicgPT4gMjAsCiAgICAgICAgICAgICdmbGFncycgPT4gJycsCiAgICAgICAgKSwKICAgICksCgogICAgJ215c3FsaTpteXNxbGknID0+IGFycmF5KAogICAgICAgICdjbG9iJyA9PiAnVEVYVCcsCiAgICAgICAgJ2RhdGUnID0+ICdEQVRFJywKICAgICAgICAnZGF0ZWxpdGVyYWwnID0+ICcnLAogICAgICAgICdmaW5kc190YWJsZScgPT4gdHJ1ZSwKICAgICAgICAnc2l6ZV9mcm9tX3RhYmxlJyA9PiBmYWxzZSwKICAgICAgICAnaGFuZGxlc19yZXN1bHRzJyA9PiB0cnVlLAogICAgICAgICdjb21tYW5kcycgPT4gYXJyYXkoCiAgICAgICAgKSwKICAgICAgICAwID0+IGFycmF5KAogICAgICAgICAgICAndHlwZScgPT4gJ2ludCcsCiAgICAgICAgICAgICdsZW4nID0+IDExLAogICAgICAgICAgICAnZmxhZ3MnID0+ICdub3RfbnVsbCBtdWx0aXBsZV9rZXknLAogICAgICAgICksCiAgICAgICAgMSA9PiBhcnJheSgKICAgICAgICAgICAgJ3R5cGUnID0+ICdpbnQnLAogICAgICAgICAgICAnbGVuJyA9PiAxMSwKICAgICAgICAgICAgJ2ZsYWdzJyA9PiAnbm90X251bGwgcHJpbWFyeV9rZXknLAogICAgICAgICksCiAgICAgICAgMiA9PiBhcnJheSgKICAgICAgICAgICAgJ3R5cGUnID0+ICdibG9iJywKICAgICAgICAgICAgJ2xlbicgPT4gNjU1MzUsCiAgICAgICAgICAgICdmbGFncycgPT4gJ2Jsb2InLAogICAgICAgICksCiAgICAgICAgMyA9PiBhcnJheSgKICAgICAgICAgICAgJ3R5cGUnID0+ICdkYXRlJywKICAgICAgICAgICAgJ2xlbicgPT4gMTAsCiAgICAgICAgICAgICdmbGFncycgPT4gJ25vdF9udWxsIG11bHRpcGxlX2tleSBiaW5hcnknLAogICAgICAgICksCiAgICAgICAgNCA9PiBhcnJheSgKICAgICAgICAgICAgJ3R5cGUnID0+ICdzdHJpbmcnLAogICAgICAgICAgICAnbGVuJyA9PiAyLAogICAgICAgICAgICAnZmxhZ3MnID0+ICdub3RfbnVsbCcsCiAgICAgICAgKSwKICAgICAgICA1ID0+IGFycmF5KAogICAgICAgICAgICAndHlwZScgPT4gJ3JlYWwnLAogICAgICAgICAgICAnbGVuJyA9PiA0LAogICAgICAgICAgICAnZmxhZ3MnID0+ICcnLAogICAgICAgICksCiAgICAgICAgOSA9PiBhcnJheSgKICAgICAgICAgICAgJ3R5cGUnID0+ICdzdHJpbmcnLAogICAgICAgICAgICAnbGVuJyA9PiAyMCwKICAgICAgICAgICAgJ2ZsYWdzJyA9PiAnJywKICAgICAgICApLAogICAgKSwKCiAgICAnb2NpODpvY2k4JyA9PiBhcnJheSgKICAgICAgICAnY2xvYicgPT4gJ0NMT0InLAogICAgICAgICdkYXRlJyA9PiAnREFURScsCiAgICAgICAgJ2RhdGVsaXRlcmFsJyA9PiAnJywKICAgICAgICAnZmluZHNfdGFibGUnID0+IGZhbHNlLAogICAgICAgICdzaXplX2Zyb21fdGFibGUnID0+IGZhbHNlLAogICAgICAgICdoYW5kbGVzX3Jlc3VsdHMnID0+IHRydWUsCiAgICAgICAgJ2NvbW1hbmRzJyA9PiBhcnJheSgKICAgICAgICAgICAgJyRkYmgtPnF1ZXJ5KCJBTFRFUiBTRVNTSU9OIFNFVCBOTFNfREFURV9GT1JNQVQgPSBcJ1lZWVktTU0tRERcJyIpOycsCiAgICAgICAgKSwKICAgICAgICAwID0+IGFycmF5KAogICAgICAgICAgICAndHlwZScgPT4gJ05VTUJFUicsCiAgICAgICAgICAgICdsZW4nID0+IDIyLAogICAgICAgICAgICAnZmxhZ3MnID0+ICdub3RfbnVsbCcsCiAgICAgICAgKSwKICAgICAgICAxID0+IGFycmF5KAogICAgICAgICAgICAndHlwZScgPT4gJ05VTUJFUicsCiAgICAgICAgICAgICdsZW4nID0+IDIyLAogICAgICAgICAgICAnZmxhZ3MnID0+ICdub3RfbnVsbCcsCiAgICAgICAgKSwKICAgICAgICAyID0+IGFycmF5KAogICAgICAgICAgICAndHlwZScgPT4gJ0NMT0InLAogICAgICAgICAgICAnbGVuJyA9PiA0MDAwLAogICAgICAgICAgICAnZmxhZ3MnID0+ICcnLAogICAgICAgICksCiAgICAgICAgMyA9PiBhcnJheSgKICAgICAgICAgICAgJ3R5cGUnID0+ICdEQVRFJywKICAgICAgICAgICAgJ2xlbicgPT4gNywKICAgICAgICAgICAgJ2ZsYWdzJyA9PiAnbm90X251bGwnLAogICAgICAgICksCiAgICAgICAgNCA9PiBhcnJheSgKICAgICAgICAgICAgJ3R5cGUnID0+ICdDSEFSJywKICAgICAgICAgICAgJ2xlbicgPT4gMiwKICAgICAgICAgICAgJ2ZsYWdzJyA9PiAnbm90X251bGwnLAogICAgICAgICksCiAgICAgICAgNSA9PiBhcnJheSgKICAgICAgICAgICAgJ3R5cGUnID0+ICdOVU1CRVInLAogICAgICAgICAgICAnbGVuJyA9PiAyMiwKICAgICAgICAgICAgJ2ZsYWdzJyA9PiAnJywKICAgICAgICApLAogICAgICAgIDkgPT4gYXJyYXkoCiAgICAgICAgICAgICd0eXBlJyA9PiAnVkFSQ0hBUicsCiAgICAgICAgICAgICdsZW4nID0+IDIwLAogICAgICAgICAgICAnZmxhZ3MnID0+ICcnLAogICAgICAgICksCiAgICApLAoKICAgICdvZGJjOmFjY2VzcycgPT4gYXJyYXkoCiAgICAgICAgJ2Nsb2InID0+ICdURVhUJywKICAgICAgICAnZGF0ZScgPT4gJ0RBVEVUSU1FJywKICAgICAgICAnZGF0ZWxpdGVyYWwnID0+ICcnLAogICAgICAgICdmaW5kc190YWJsZScgPT4gZmFsc2UsCiAgICAgICAgJ3NpemVfZnJvbV90YWJsZScgPT4gZmFsc2UsCiAgICAgICAgJ2hhbmRsZXNfcmVzdWx0cycgPT4gdHJ1ZSwKICAgICAgICAnY29tbWFuZHMnID0+IGFycmF5KAogICAgICAgICksCiAgICAgICAgMCA9PiBhcnJheSgKICAgICAgICAgICAgJ3R5cGUnID0+ICdJTlRFR0VSJywKICAgICAgICAgICAgJ2xlbicgPT4gMTAsCiAgICAgICAgICAgICdmbGFncycgPT4gJ25vdF9udWxsJywKICAgICAgICApLAogICAgICAgIDEgPT4gYXJyYXkoCiAgICAgICAgICAgICd0eXBlJyA9PiAnSU5URUdFUicsCiAgICAgICAgICAgICdsZW4nID0+IDEwLAogICAgICAgICAgICAnZmxhZ3MnID0+ICdub3RfbnVsbCcsCiAgICAgICAgKSwKICAgICAgICAyID0+IGFycmF5KAogICAgICAgICAgICAndHlwZScgPT4gJ0xPTkdDSEFSJywKICAgICAgICAgICAgJ2xlbicgPT4gMjU1LAogICAgICAgICAgICAnZmxhZ3MnID0+ICcnLAogICAgICAgICksCiAgICAgICAgMyA9PiBhcnJheSgKICAgICAgICAgICAgJ3R5cGUnID0+ICdEQVRFVElNRScsCiAgICAgICAgICAgICdsZW4nID0+IDE5LAogICAgICAgICAgICAnZmxhZ3MnID0+ICdub3RfbnVsbCcsCiAgICAgICAgKSwKICAgICAgICA0ID0+IGFycmF5KAogICAgICAgICAgICAndHlwZScgPT4gJ1ZBUkNIQVInLAogICAgICAgICAgICAnbGVuJyA9PiAyLAogICAgICAgICAgICAnZmxhZ3MnID0+ICdub3RfbnVsbCcsCiAgICAgICAgKSwKICAgICAgICA1ID0+IGFycmF5KAogICAgICAgICAgICAndHlwZScgPT4gJ0RFQ0lNQUwnLAogICAgICAgICAgICAnbGVuJyA9PiAxNSwKICAgICAgICAgICAgJ2ZsYWdzJyA9PiAnJywKICAgICAgICApLAogICAgICAgIDkgPT4gYXJyYXkoCiAgICAgICAgICAgICd0eXBlJyA9PiAnVkFSQ0hBUicsCiAgICAgICAgICAgICdsZW4nID0+IDIwLAogICAgICAgICAgICAnZmxhZ3MnID0+ICcnLAogICAgICAgICksCiAgICApLAoKICAgICdvZGJjOmRiMicgPT4gYXJyYXkoCiAgICAgICAgJ2Nsb2InID0+ICdDTE9CJywKICAgICAgICAnZGF0ZScgPT4gJ0RBVEUnLAogICAgICAgICdkYXRlbGl0ZXJhbCcgPT4gJycsCiAgICAgICAgJ2ZpbmRzX3RhYmxlJyA9PiBmYWxzZSwKICAgICAgICAnc2l6ZV9mcm9tX3RhYmxlJyA9PiBmYWxzZSwKICAgICAgICAnaGFuZGxlc19yZXN1bHRzJyA9PiB0cnVlLAogICAgICAgICdjb21tYW5kcycgPT4gYXJyYXkoCiAgICAgICAgKSwKICAgICAgICAwID0+IGFycmF5KAogICAgICAgICAgICAndHlwZScgPT4gJ0lOVEVHRVInLAogICAgICAgICAgICAnbGVuJyA9PiAxMCwKICAgICAgICAgICAgJ2ZsYWdzJyA9PiAnbm90X251bGwnLAogICAgICAgICksCiAgICAgICAgMSA9PiBhcnJheSgKICAgICAgICAgICAgJ3R5cGUnID0+ICdJTlRFR0VSJywKICAgICAgICAgICAgJ2xlbicgPT4gMTAsCiAgICAgICAgICAgICdmbGFncycgPT4gJ25vdF9udWxsJywKICAgICAgICApLAogICAgICAgIDIgPT4gYXJyYXkoCiAgICAgICAgICAgICd0eXBlJyA9PiAnQ0xPQicsCiAgICAgICAgICAgICdsZW4nID0+IDEwNDg1NzYsCiAgICAgICAgICAgICdmbGFncycgPT4gJycsCiAgICAgICAgKSwKICAgICAgICAzID0+IGFycmF5KAogICAgICAgICAgICAndHlwZScgPT4gJ0RBVEUnLAogICAgICAgICAgICAnbGVuJyA9PiAxMCwKICAgICAgICAgICAgJ2ZsYWdzJyA9PiAnbm90X251bGwnLAogICAgICAgICksCiAgICAgICAgNCA9PiBhcnJheSgKICAgICAgICAgICAgJ3R5cGUnID0+ICdDSEFSJywKICAgICAgICAgICAgJ2xlbicgPT4gMiwKICAgICAgICAgICAgJ2ZsYWdzJyA9PiAnbm90X251bGwnLAogICAgICAgICksCiAgICAgICAgNSA9PiBhcnJheSgKICAgICAgICAgICAgJ3R5cGUnID0+ICdERUNJTUFMJywKICAgICAgICAgICAgJ2xlbicgPT4gMiwKICAgICAgICAgICAgJ2ZsYWdzJyA9PiAnJywKICAgICAgICApLAogICAgICAgIDkgPT4gYXJyYXkoCiAgICAgICAgICAgICd0eXBlJyA9PiAnVkFSQ0hBUicsCiAgICAgICAgICAgICdsZW4nID0+IDIwLAogICAgICAgICAgICAnZmxhZ3MnID0+ICcnLAogICAgICAgICksCiAgICApLAoKICAgICdwZ3NxbDpwZ3NxbCcgPT4gYXJyYXkoCiAgICAgICAgJ2Nsb2InID0+ICdURVhUJywKICAgICAgICAnZGF0ZScgPT4gJ0RBVEUnLAogICAgICAgICdkYXRlbGl0ZXJhbCcgPT4gJycsCiAgICAgICAgJ2ZpbmRzX3RhYmxlJyA9PiBmYWxzZSwKICAgICAgICAnc2l6ZV9mcm9tX3RhYmxlJyA9PiBmYWxzZSwKICAgICAgICAnaGFuZGxlc19yZXN1bHRzJyA9PiB0cnVlLAogICAgICAgICdjb21tYW5kcycgPT4gYXJyYXkoCiAgICAgICAgICAgICckZGJoLT5xdWVyeSgiU0VUIERBVEVTVFlMRSA9IElTTyIpOycsCiAgICAgICAgKSwKICAgICAgICAwID0+IGFycmF5KAogICAgICAgICAgICAndHlwZScgPT4gJ2ludDQnLAogICAgICAgICAgICAnbGVuJyA9PiA0LAogICAgICAgICAgICAnZmxhZ3MnID0+ICdub3RfbnVsbCB1bmlxdWVfa2V5IG11bHRpcGxlX2tleScsCiAgICAgICAgKSwKICAgICAgICAxID0+IGFycmF5KAogICAgICAgICAgICAndHlwZScgPT4gJ2ludDQnLAogICAgICAgICAgICAnbGVuJyA9PiA0LAogICAgICAgICAgICAnZmxhZ3MnID0+ICdub3RfbnVsbCBwcmltYXJ5X2tleScsCiAgICAgICAgKSwKICAgICAgICAyID0+IGFycmF5KAogICAgICAgICAgICAndHlwZScgPT4gJ3RleHQnLAogICAgICAgICAgICAnbGVuJyA9PiAtMSwKICAgICAgICAgICAgJ2ZsYWdzJyA9PiAnJywKICAgICAgICApLAogICAgICAgIDMgPT4gYXJyYXkoCiAgICAgICAgICAgICd0eXBlJyA9PiAnZGF0ZScsCiAgICAgICAgICAgICdsZW4nID0+IDQsCiAgICAgICAgICAgICdmbGFncycgPT4gJ25vdF9udWxsIHVuaXF1ZV9rZXkgbXVsdGlwbGVfa2V5JywKICAgICAgICApLAogICAgICAgIDQgPT4gYXJyYXkoCiAgICAgICAgICAgICd0eXBlJyA9PiAnYnBjaGFyJywKICAgICAgICAgICAgJ2xlbicgPT4gLTEsCiAgICAgICAgICAgICdmbGFncycgPT4gJ25vdF9udWxsIGRlZmF1bHRfJTIwZScsCiAgICAgICAgKSwKICAgICAgICA1ID0+IGFycmF5KAogICAgICAgICAgICAndHlwZScgPT4gJ251bWVyaWMnLAogICAgICAgICAgICAnbGVuJyA9PiAtMSwKICAgICAgICAgICAgJ2ZsYWdzJyA9PiAnJywKICAgICAgICApLAogICAgICAgIDkgPT4gYXJyYXkoCiAgICAgICAgICAgICd0eXBlJyA9PiAndmFyY2hhcicsCiAgICAgICAgICAgICdsZW4nID0+IC0xLAogICAgICAgICAgICAnZmxhZ3MnID0+ICcnLAogICAgICAgICksCiAgICApLAoKICAgICdzcWxpdGU6c3FsaXRlJyA9PiBhcnJheSgKICAgICAgICAnY2xvYicgPT4gJ0NMT0InLAogICAgICAgICdkYXRlJyA9PiAnREFURScsCiAgICAgICAgJ2RhdGVsaXRlcmFsJyA9PiAnJywKICAgICAgICAnZmluZHNfdGFibGUnID0+IGZhbHNlLAogICAgICAgICdzaXplX2Zyb21fdGFibGUnID0+IGZhbHNlLAogICAgICAgICdoYW5kbGVzX3Jlc3VsdHMnID0+IGZhbHNlLAogICAgICAgICdjb21tYW5kcycgPT4gYXJyYXkoCiAgICAgICAgKSwKICAgICAgICAwID0+IGFycmF5KAogICAgICAgICAgICAndHlwZScgPT4gJ0lOVEVHRVInLAogICAgICAgICAgICAnbGVuJyA9PiAwLAogICAgICAgICAgICAnZmxhZ3MnID0+ICdub3RfbnVsbCcsCiAgICAgICAgKSwKICAgICAgICAxID0+IGFycmF5KAogICAgICAgICAgICAndHlwZScgPT4gJ0lOVEVHRVInLAogICAgICAgICAgICAnbGVuJyA9PiAwLAogICAgICAgICAgICAnZmxhZ3MnID0+ICdwcmltYXJ5X2tleSBub3RfbnVsbCcsCiAgICAgICAgKSwKICAgICAgICAyID0+IGFycmF5KAogICAgICAgICAgICAndHlwZScgPT4gJ0NMT0InLAogICAgICAgICAgICAnbGVuJyA9PiAwLAogICAgICAgICAgICAnZmxhZ3MnID0+ICcnLAogICAgICAgICksCiAgICAgICAgMyA9PiBhcnJheSgKICAgICAgICAgICAgJ3R5cGUnID0+ICdEQVRFJywKICAgICAgICAgICAgJ2xlbicgPT4gMCwKICAgICAgICAgICAgJ2ZsYWdzJyA9PiAnbm90X251bGwnLAogICAgICAgICksCiAgICAgICAgNCA9PiBhcnJheSgKICAgICAgICAgICAgJ3R5cGUnID0+ICdDSEFSJywKICAgICAgICAgICAgJ2xlbicgPT4gMiwKICAgICAgICAgICAgJ2ZsYWdzJyA9PiAnbm90X251bGwgZGVmYXVsdF8lMjBlJywKICAgICAgICApLAogICAgICAgIDUgPT4gYXJyYXkoCiAgICAgICAgICAgICd0eXBlJyA9PiAnREVDSU1BTCcsCiAgICAgICAgICAgICdsZW4nID0+IDIsCiAgICAgICAgICAgICdmbGFncycgPT4gJycsCiAgICAgICAgKSwKICAgICAgICA5ID0+IGFycmF5KAogICAgICAgICAgICAndHlwZScgPT4gJ1ZBUkNIQVInLAogICAgICAgICAgICAnbGVuJyA9PiAyMCwKICAgICAgICAgICAgJ2ZsYWdzJyA9PiAnJywKICAgICAgICApLAogICAgKSwKCiAgICAnc3liYXNlOnN5YmFzZScgPT4gYXJyYXkoCiAgICAgICAgJ2Nsb2InID0+ICdURVhUJywKICAgICAgICAnZGF0ZScgPT4gJ1NNQUxMREFURVRJTUUnLAogICAgICAgICdkYXRlbGl0ZXJhbCcgPT4gJycsCiAgICAgICAgJ2ZpbmRzX3RhYmxlJyA9PiBmYWxzZSwKICAgICAgICAnc2l6ZV9mcm9tX3RhYmxlJyA9PiBmYWxzZSwKICAgICAgICAnaGFuZGxlc19yZXN1bHRzJyA9PiB0cnVlLAogICAgICAgICdjb21tYW5kcycgPT4gYXJyYXkoCiAgICAgICAgICAgICckZGJoLT5xdWVyeSgiU0VUIERBVEVGT1JNQVQgeW1kIik7JywKICAgICAgICApLAogICAgICAgIDAgPT4gYXJyYXkoCiAgICAgICAgICAgICd0eXBlJyA9PiAnaW50JywKICAgICAgICAgICAgJ2xlbicgPT4gMTEsCiAgICAgICAgICAgICdmbGFncycgPT4gJ211bHRpcGxlX2tleSB1bmlxdWVfa2V5JywKICAgICAgICApLAogICAgICAgIDEgPT4gYXJyYXkoCiAgICAgICAgICAgICd0eXBlJyA9PiAnaW50JywKICAgICAgICAgICAgJ2xlbicgPT4gMTEsCiAgICAgICAgICAgICdmbGFncycgPT4gJ3VuaXF1ZV9rZXknLAogICAgICAgICksCiAgICAgICAgMiA9PiBhcnJheSgKICAgICAgICAgICAgJ3R5cGUnID0+ICdzdHJpbmcnLAogICAgICAgICAgICAnbGVuJyA9PiA2NDUxMiwKICAgICAgICAgICAgJ2ZsYWdzJyA9PiAnJywKICAgICAgICApLAogICAgICAgIDMgPT4gYXJyYXkoCiAgICAgICAgICAgICd0eXBlJyA9PiAnZGF0ZXRpbWUnLAogICAgICAgICAgICAnbGVuJyA9PiAyOSwKICAgICAgICAgICAgJ2ZsYWdzJyA9PiAnbXVsdGlwbGVfa2V5IHVuaXF1ZV9rZXknLAogICAgICAgICksCiAgICAgICAgNCA9PiBhcnJheSgKICAgICAgICAgICAgJ3R5cGUnID0+ICdzdHJpbmcnLAogICAgICAgICAgICAnbGVuJyA9PiAyLAogICAgICAgICAgICAnZmxhZ3MnID0+ICcnLAogICAgICAgICksCiAgICAgICAgNSA9PiBhcnJheSgKICAgICAgICAgICAgJ3R5cGUnID0+ICdyZWFsJywKICAgICAgICAgICAgJ2xlbicgPT4gNCwKICAgICAgICAgICAgJ2ZsYWdzJyA9PiAnJywKICAgICAgICApLAogICAgICAgIDkgPT4gYXJyYXkoCiAgICAgICAgICAgICd0eXBlJyA9PiAnc3RyaW5nJywKICAgICAgICAgICAgJ2xlbicgPT4gMjAsCiAgICAgICAgICAgICdmbGFncycgPT4gJycsCiAgICAgICAgKSwKICAgICksCik7CgoKJHF1aXJrX2tleSA9ICRkYmgtPnBocHR5cGUgLiAnOicgLiAkZGJoLT5kYnN5bnRheDsKCmlmICghaXNzZXQoJHF1aXJrc1skcXVpcmtfa2V5XSkpIHsKICAgIGRpZSgiVGhpcyB0ZXN0IGRvZXMgbm90IHlldCBzdXBwb3J0ICRxdWlya19rZXkiKTsKfQoKaWYgKGNvdW50KCRxdWlya3NbJHF1aXJrX2tleV1bJ2NvbW1hbmRzJ10pKSB7CiAgICBmb3JlYWNoICgkcXVpcmtzWyRxdWlya19rZXldWydjb21tYW5kcyddIGFzICR2YWx1ZSkgewogICAgICAgIGV2YWwoJHZhbHVlKTsKICAgIH0KfQoKCiRkYmgtPnF1ZXJ5KCdERUxFVEUgRlJPTSBwaHB0ZXN0Jyk7CiRkYmgtPnF1ZXJ5KCJJTlNFUlQgSU5UTyBwaHB0ZXN0IFZBTFVFUyAoMSwgJ29uZScsICdPbmUnLCAnMjAwMS0wMi0xNicpIik7CiRkYmgtPnF1ZXJ5KCJJTlNFUlQgSU5UTyBwaHB0ZXN0IFZBTFVFUyAoMiwgJ3R3bycsICdUd28nLCAnMjAwMS0wMi0xNScpIik7CiRkYmgtPnF1ZXJ5KCJJTlNFUlQgSU5UTyBwaHB0ZXN0IFZBTFVFUyAoMywgJ3RocmVlJywgJ1RocmVlJywgJzIwMDEtMDItMTQnKSIpOwoKCiRkYmgtPnNldEVycm9ySGFuZGxpbmcoUEVBUl9FUlJPUl9SRVRVUk4pOwpkcm9wX3RhYmxlKCRkYmgsICdwaHB0ZXN0X2ZrJyk7CiRkYmgtPnNldEVycm9ySGFuZGxpbmcoUEVBUl9FUlJPUl9DQUxMQkFDSywgJ3BlJyk7CgoKaWYgKCRxdWlya19rZXkgPT0gJ29kYmM6YWNjZXNzJykgewogICAgJGRlZmF1bHRfZSA9ICcnOwogICAgJGRlY2ltYWwgICA9ICdOVU1FUklDJzsKfSBlbHNlaWYgKCRxdWlya19rZXkgPT0gJ21zcWw6bXNxbCcpIHsKICAgICRkZWZhdWx0X2UgPSAnJzsKICAgICRkZWNpbWFsICAgPSAnUkVBTCc7Cn0gZWxzZSB7CiAgICAkZGVmYXVsdF9lID0gIkRFRkFVTFQgJyBlJyI7CiAgICAkZGVjaW1hbCAgID0gJ0RFQ0lNQUwoMiwxKSc7Cn0KCmlmICgkcXVpcmtfa2V5ID09ICdtc3NxbDptc3NxbCcpIHsKICAgIC8qIFdlIG5lZWQgdG8gcmVzZXQgdGhlIGV4cGVjdGVkIGxlbmd0aCBvZiBwaHB0ZXN0X2ZrLmMgdG8gbWF0Y2gKICAgICAqIEBAVEVYVFNJWkUsIHNpbmNlIHRoZSBkZWZhdWx0IHZhbHVlIHNlZW1zIHRvIHZhcnkgYmFzZWQgb24gdGhlIHZlcnNpb24KICAgICAqIG9mIFNRTCBTZXJ2ZXIgd2UncmUgdGFsa2luZyB0byBhbmQgaXRzIGNvbmZpZ3VyYXRpb24uICovCiAgICAkdGV4dHNpemUgPSAkZGJoLT5nZXRPbmUoJ1NFTEVDVCBAQFRFWFRTSVpFJyk7CiAgICBpZiAoREI6OmlzRXJyb3IoJHRleHRzaXplKSkgewogICAgICAgIGVjaG8gJ0Vycm9yIHJldHJpZXZpbmcgQEBURVhUU0laRTogJy4kdGV4dHNpemUtPmdldE1lc3NhZ2UoKS4iXG4iOwogICAgfSBlbHNlIHsKICAgICAgICAkcXVpcmtzWyRxdWlya19rZXldWzJdWydsZW4nXSA9IChpbnRlZ2VyKSAkdGV4dHNpemU7CiAgICB9Cn0KCi8vICRudWxsIGlzIHNldCBpbiBta3RhYmxlLmluYwoKc3dpdGNoICgkZGJoLT5waHB0eXBlKSB7CiAgICBjYXNlICdtc3FsJzoKICAgICAgICAkZGJoLT5xdWVyeSgiCiAgICAgICAgICAgIENSRUFURSBUQUJMRSBwaHB0ZXN0X2ZrICgKICAgICAgICAgICAgICAgIGEgSU5URUdFUiBOT1QgTlVMTCwKICAgICAgICAgICAgICAgIGZrIElOVEVHRVIgTk9UIE5VTEwsCiAgICAgICAgICAgICAgICBjYyB7JHF1aXJrc1skcXVpcmtfa2V5XVsnY2xvYiddfSAkbnVsbCwKICAgICAgICAgICAgICAgIGQgeyRxdWlya3NbJHF1aXJrX2tleV1bJ2RhdGUnXX0gTk9UIE5VTEwsCiAgICAgICAgICAgICAgICBlIENIQVIoMikgJGRlZmF1bHRfZSBOT1QgTlVMTCwKICAgICAgICAgICAgICAgIGYgJGRlY2ltYWwgJG51bGwKICAgICAgICAgICAgKQogICAgICAgICIpOwogICAgICAgICRkYmgtPnF1ZXJ5KCdDUkVBVEUgVU5JUVVFIElOREVYIGZrcGsgT04gcGhwdGVzdF9mayAoZmspJyk7CiAgICAgICAgJGRiaC0+cXVlcnkoJ0NSRUFURSBVTklRVUUgSU5ERVggZmt1ayBPTiBwaHB0ZXN0X2ZrIChhLCBkKScpOwogICAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgICAkZGJoLT5xdWVyeSgiCiAgICAgICAgICAgIENSRUFURSBUQUJMRSBwaHB0ZXN0X2ZrICgKICAgICAgICAgICAgICAgIGEgSU5URUdFUiBOT1QgTlVMTCwKICAgICAgICAgICAgICAgIGZrIElOVEVHRVIgTk9UIE5VTEwsCiAgICAgICAgICAgICAgICBjYyB7JHF1aXJrc1skcXVpcmtfa2V5XVsnY2xvYiddfSAkbnVsbCwKICAgICAgICAgICAgICAgIGQgeyRxdWlya3NbJHF1aXJrX2tleV1bJ2RhdGUnXX0gTk9UIE5VTEwsCiAgICAgICAgICAgICAgICBlIENIQVIoMikgJGRlZmF1bHRfZSBOT1QgTlVMTCwKICAgICAgICAgICAgICAgIGYgJGRlY2ltYWwgJG51bGwsCiAgICAgICAgICAgICAgICBQUklNQVJZIEtFWSAoZmspLAogICAgICAgICAgICAgICAgVU5JUVVFIChhLCBkKQogICAgICAgICAgICApCiAgICAgICAgIik7Cn0KCiRkYmgtPnF1ZXJ5KCJDUkVBVEUgSU5ERVggdGhlZGlkeCBPTiBwaHB0ZXN0X2ZrIChkKSIpOwokZGJoLT5xdWVyeSgiSU5TRVJUIElOVE8gcGhwdGVzdF9mayBWQUxVRVMgKDEwLCAxLCAnT25lJywiCiAgICAgICAgICAgIC4gJHF1aXJrc1skcXVpcmtfa2V5XVsnZGF0ZWxpdGVyYWwnXSAuICInMjAwMS0wMi0xNicsICAnYzEnLCAxLjEpIik7CiRkYmgtPnF1ZXJ5KCJJTlNFUlQgSU5UTyBwaHB0ZXN0X2ZrIFZBTFVFUyAoMjAsIDIsICdUd28nLCIKICAgICAgICAgICAgLiAkcXVpcmtzWyRxdWlya19rZXldWydkYXRlbGl0ZXJhbCddIC4gIicyMDAxLTAyLTE1JywgJ2MyJywgMi4yKSIpOwokZGJoLT5xdWVyeSgiSU5TRVJUIElOVE8gcGhwdGVzdF9mayBWQUxVRVMgKDMwLCAzLCAnVGhyZWUnLCIKICAgICAgICAgICAgLiAkcXVpcmtzWyRxdWlya19rZXldWydkYXRlbGl0ZXJhbCddIC4gIicyMDAxLTAyLTE0JywgJ2MzJywgMy4zKSIpOwoKZnVuY3Rpb24gJnJ1blF1ZXJ5KCkgewogICAgZ2xvYmFsICRkYmgsICRyZXN1bHRvYmo7CgogICAgJHF1aXJrX2tleSA9ICRkYmgtPnBocHR5cGUgLiAnOicgLiAkZGJoLT5kYnN5bnRheDsKCiAgICBzd2l0Y2ggKCRxdWlya19rZXkpIHsKICAgICAgICBjYXNlICdvZGJjOmRiMic6CiAgICAgICAgICAgIC8vIGNhbid0IGV4dHJhY3QgYmxvYidzIHRoaXMgd2F5IHNvIG1ha2UgYSBmYWtlIGNvbHVtbgogICAgICAgICAgICAkcXVlcnkgPSAiU0VMRUNUIHBocHRlc3RfZmsuYSwgcGhwdGVzdF9may5maywgJ3RlbXB4eXonIEFTIGNjLCIKICAgICAgICAgICAgICAgICAgIC4gJyBwaHB0ZXN0X2ZrLmQsIHBocHRlc3RfZmsuZSwgcGhwdGVzdF9may5mLCcKICAgICAgICAgICAgICAgICAgIC4gJyBwaHB0ZXN0LmEsIHBocHRlc3QuYiwgcGhwdGVzdC5jYywgcGhwdGVzdC5kJwogICAgICAgICAgICAgICAgICAgLiAnIEZST00gcGhwdGVzdF9maywgcGhwdGVzdCcKICAgICAgICAgICAgICAgICAgIC4gJyBXSEVSRSBwaHB0ZXN0LmEgPSBwaHB0ZXN0X2ZrLmZrJzsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnbXNxbDptc3FsJzoKICAgICAgICAgICAgJHF1ZXJ5ID0gJ1NFTEVDVCBwaHB0ZXN0X2ZrLmEsIHBocHRlc3RfZmsuZmssIHBocHRlc3RfZmsuY2MsJwogICAgICAgICAgICAgICAgICAgLiAnIHBocHRlc3RfZmsuZCwgcGhwdGVzdF9may5lLCBwaHB0ZXN0X2ZrLmYsJwogICAgICAgICAgICAgICAgICAgLiAnIHBocHRlc3QuYSwgcGhwdGVzdC5iLCBwaHB0ZXN0LmNjLCBwaHB0ZXN0LmQnCiAgICAgICAgICAgICAgICAgICAuICcgRlJPTSBwaHB0ZXN0X2ZrLCBwaHB0ZXN0JwogICAgICAgICAgICAgICAgICAgLiAnIFdIRVJFIHBocHRlc3QuYSA9IHBocHRlc3RfZmsuZmsnOwogICAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAkcXVlcnkgPSAnU0VMRUNUIHBocHRlc3RfZmsuYSwgcGhwdGVzdF9may5maywgcGhwdGVzdF9may5jYywnCiAgICAgICAgICAgICAgICAgICAuICcgcGhwdGVzdF9may5kLCBwaHB0ZXN0X2ZrLmUsIHBocHRlc3RfZmsuZiwnCiAgICAgICAgICAgICAgICAgICAuICcgcGhwdGVzdC5hLCBwaHB0ZXN0LmIsIHBocHRlc3QuY2MsIHBocHRlc3QuZCcKICAgICAgICAgICAgICAgICAgIC4gJyBGUk9NIHBocHRlc3RfZmssIHBocHRlc3QnCiAgICAgICAgICAgICAgICAgICAuICcgV0hFUkUgcGhwdGVzdC5hID0gcGhwdGVzdF9may5mayc7CiAgICB9CiAgICAkcmVzdWx0b2JqID0mICRkYmgtPnF1ZXJ5KCRxdWVyeSk7CiAgICByZXR1cm4gJHJlc3VsdG9iajsKfQoKCiRleHBlY3RlZDAxID0gJ3RhYmxlIC4uLiBtYXRjaGVkIGV4cGVjdGVkIHZhbHVlCm5hbWUgPT4gYQp0eXBlIC4uLiBtYXRjaGVkIGV4cGVjdGVkIHZhbHVlCmxlbiAuLi4gbWF0Y2hlZCBleHBlY3RlZCB2YWx1ZQpmbGFncyAuLi4gbWF0Y2hlZCBleHBlY3RlZCB2YWx1ZQonOwoKJGV4cGVjdGVkMDIgPSAndGFibGUgLi4uIG1hdGNoZWQgZXhwZWN0ZWQgdmFsdWUKbmFtZSA9PiBmawp0eXBlIC4uLiBtYXRjaGVkIGV4cGVjdGVkIHZhbHVlCmxlbiAuLi4gbWF0Y2hlZCBleHBlY3RlZCB2YWx1ZQpmbGFncyAuLi4gbWF0Y2hlZCBleHBlY3RlZCB2YWx1ZQonOwoKJGV4cGVjdGVkMDMgPSAndGFibGUgLi4uIG1hdGNoZWQgZXhwZWN0ZWQgdmFsdWUKbmFtZSA9PiBjYwp0eXBlIC4uLiBtYXRjaGVkIGV4cGVjdGVkIHZhbHVlCmxlbiAuLi4gbWF0Y2hlZCBleHBlY3RlZCB2YWx1ZQpmbGFncyAuLi4gbWF0Y2hlZCBleHBlY3RlZCB2YWx1ZQonOwoKJGV4cGVjdGVkMDQgPSAndGFibGUgLi4uIG1hdGNoZWQgZXhwZWN0ZWQgdmFsdWUKbmFtZSA9PiBkCnR5cGUgLi4uIG1hdGNoZWQgZXhwZWN0ZWQgdmFsdWUKbGVuIC4uLiBtYXRjaGVkIGV4cGVjdGVkIHZhbHVlCmZsYWdzIC4uLiBtYXRjaGVkIGV4cGVjdGVkIHZhbHVlCic7CgokZXhwZWN0ZWQwNSA9ICd0YWJsZSAuLi4gbWF0Y2hlZCBleHBlY3RlZCB2YWx1ZQpuYW1lID0+IGUKdHlwZSAuLi4gbWF0Y2hlZCBleHBlY3RlZCB2YWx1ZQpsZW4gLi4uIG1hdGNoZWQgZXhwZWN0ZWQgdmFsdWUKZmxhZ3MgLi4uIG1hdGNoZWQgZXhwZWN0ZWQgdmFsdWUKJzsKCiRleHBlY3RlZDA2ID0gJ3RhYmxlIC4uLiBtYXRjaGVkIGV4cGVjdGVkIHZhbHVlCm5hbWUgPT4gZgp0eXBlIC4uLiBtYXRjaGVkIGV4cGVjdGVkIHZhbHVlCmxlbiAuLi4gbWF0Y2hlZCBleHBlY3RlZCB2YWx1ZQpmbGFncyAuLi4gbWF0Y2hlZCBleHBlY3RlZCB2YWx1ZQonOwoKJGV4cGVjdGVkMTAgPSAndGFibGUgLi4uIG1hdGNoZWQgZXhwZWN0ZWQgdmFsdWUKbmFtZSA9PiBkCnR5cGUgLi4uIG1hdGNoZWQgZXhwZWN0ZWQgdmFsdWUKbGVuIC4uLiBtYXRjaGVkIGV4cGVjdGVkIHZhbHVlCmZsYWdzIC4uLiBtYXRjaGVkIGV4cGVjdGVkIHZhbHVlCic7CgoKCnByaW50ICJcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIjsKcHJpbnQgIlBhc3NpbmcgcmVzdWx0IE9CSkVDVCB0byBtZXRob2QgaW4gREJfPHR5cGU+LlxuIjsKcHJpbnQgIk91dHB1dCA9IGRlZmF1bHQuXG4iOwpwcmludCAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iOwokcmVzdWx0b2JqID0mIHJ1blF1ZXJ5KCk7Ci8vIFRoaXMgbnVtUm93cyBjYWxsIHByb3ZpZGVzIGEgcmVncmVzc2lvbiB0ZXN0IGZvciBidWcgIzQzODguCiRyZXN1bHRvYmotPm51bVJvd3MoKTsKJGFycmF5ID0gJGRiaC0+dGFibGVJbmZvKCRyZXN1bHRvYmopOwoKcHJpbnQgIlxuY29sdW1uIDA6XG4iOwpleGFtaW5lQXJyYXlEYXRhKCRhcnJheSwgJGV4cGVjdGVkMDEsIDApOwoKcHJpbnQgIlxuY29sdW1uIDk6XG4iOwpleGFtaW5lQXJyYXlEYXRhKCRhcnJheSwgJGV4cGVjdGVkMTAsIDkpOwoKCnByaW50ICJcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIjsKcHJpbnQgIlBhc3NpbmcgcmVzdWx0IElEIHRvIG1ldGhvZCBpbiBEQl88dHlwZT4uXG4iOwpwcmludCAiT3V0cHV0ID0gREJfVEFCTEVJTkZPX09SREVSLlxuIjsKcHJpbnQgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIjsKJHJlc3VsdG9iaiA9JiBydW5RdWVyeSgpOwokYXJyYXkgPSAkZGJoLT50YWJsZUluZm8oJHJlc3VsdG9iai0+cmVzdWx0LCBEQl9UQUJMRUlORk9fT1JERVIpOwoKcHJpbnQgIlxuY29sdW1uIDA6XG4iOwpleGFtaW5lQXJyYXlEYXRhKCRhcnJheSwgJGV4cGVjdGVkMDEsIDApOwoKcHJpbnQgIlxuY29sdW1uIDM6XG4iOwpleGFtaW5lQXJyYXlEYXRhKCRhcnJheSwgJGV4cGVjdGVkMDQsIDMpOwoKcHJpbnQgIlxubnVtX2ZpZWxkczogIjsKaWYgKCRxdWlya3NbJHF1aXJrX2tleV1bJ2hhbmRsZXNfcmVzdWx0cyddICYmICRhcnJheVsnbnVtX2ZpZWxkcyddID09IDEwKSB7CiAgICBwcmludCAibWF0Y2hlZCBleHBlY3RlZCByZXN1bHRcbiI7Cn0gZWxzZWlmIChEQjo6aXNFcnJvcigkYXJyYXkpICYmICRhcnJheS0+Z2V0Q29kZSgpID09IERCX0VSUk9SX05PVF9DQVBBQkxFKSB7CiAgICBwcmludCAibWF0Y2hlZCBleHBlY3RlZCByZXN1bHRcbiI7Cn0gZWxzZSB7CiAgICBwcmludCAiVGhpcyBETUJTIGRpZG4ndCBwcm9kdWNlIHByb3BlciByZXN1bHRzXG4iOwp9CgpwcmludCAiXG5vcmRlcjpcbiI7CmlmICgkcXVpcmtzWyRxdWlya19rZXldWydoYW5kbGVzX3Jlc3VsdHMnXSAmJiBpc19hcnJheSgkYXJyYXlbJ29yZGVyJ10pKSB7CiAgICAkZXhwZWN0ZWQgPSAnYSA9PiA2CmIgPT4gNwpjYyA9PiA4CmQgPT4gOQplID0+IDQKZiA9PiA1CmZrID0+IDEKJzsKICAgIGtzb3J0KCRhcnJheVsnb3JkZXInXSk7CiAgICBleGFtaW5lQXJyYXlEYXRhKCRhcnJheVsnb3JkZXInXSwgJGV4cGVjdGVkKTsKfSBlbHNlaWYgKERCOjppc0Vycm9yKCRhcnJheSkgJiYgJGFycmF5LT5nZXRDb2RlKCkgPT0gREJfRVJST1JfTk9UX0NBUEFCTEUpIHsKICAgIHByaW50ICJtYXRjaGVkIGV4cGVjdGVkIHJlc3VsdFxuIjsKfSBlbHNlIHsKICAgIHByaW50ICJUaGlzIERNQlMgZGlkbid0IHByb2R1Y2UgcHJvcGVyIHJlc3VsdHNcbiI7Cn0KCgoKcHJpbnQgIlxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iOwpwcmludCAiUGFzc2luZyBEQl9UQUJMRUlORk9fT1JERVJUQUJMRSB0byBtZXRob2QgaW4gREJfcmVzdWx0LlxuIjsKcHJpbnQgIk91dHB1dCA9IERCX1RBQkxFSU5GT19PUkRFUlRBQkxFLlxuIjsKcHJpbnQgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIjsKJHJlc3VsdG9iaiA9JiBydW5RdWVyeSgpOwokYXJyYXkgPSAkcmVzdWx0b2JqLT50YWJsZUluZm8oREJfVEFCTEVJTkZPX09SREVSVEFCTEUpOwovLyBGcmVlIHRoaXMgdG8ga2VlcCBpbnRlcmJhc2UgaGFwcHkuCiRyZXN1bHRvYmotPmZyZWUoKTsKCnByaW50ICJcbmNvbHVtbiAwOlxuIjsKZXhhbWluZUFycmF5RGF0YSgkYXJyYXksICRleHBlY3RlZDAxLCAwKTsKCnByaW50ICJcbmNvbHVtbiAzOlxuIjsKZXhhbWluZUFycmF5RGF0YSgkYXJyYXksICRleHBlY3RlZDA0LCAzKTsKCnByaW50ICJcbm51bV9maWVsZHM6ICI7CmlmICgkcXVpcmtzWyRxdWlya19rZXldWydoYW5kbGVzX3Jlc3VsdHMnXSAmJiAkYXJyYXlbJ251bV9maWVsZHMnXSA9PSAxMCkgewogICAgcHJpbnQgIm1hdGNoZWQgZXhwZWN0ZWQgcmVzdWx0XG4iOwp9IGVsc2VpZiAoREI6OmlzRXJyb3IoJGFycmF5KSAmJiAkYXJyYXktPmdldENvZGUoKSA9PSBEQl9FUlJPUl9OT1RfQ0FQQUJMRSkgewogICAgcHJpbnQgIm1hdGNoZWQgZXhwZWN0ZWQgcmVzdWx0XG4iOwp9IGVsc2UgewogICAgcHJpbnQgIlRoaXMgRE1CUyBkaWRuJ3QgcHJvZHVjZSBwcm9wZXIgcmVzdWx0c1xuIjsKfQoKCnByaW50ICdvcmRlcnRhYmxlW3BocHRlc3RdOiAnOwokZXhwZWN0ZWQgPSAnYSA9PiA2CmIgPT4gNwpjYyA9PiA4CmQgPT4gOQonOwppZiAoJHF1aXJrc1skcXVpcmtfa2V5XVsnaGFuZGxlc19yZXN1bHRzJ10KICAgICYmIGlzc2V0KCRhcnJheVsnb3JkZXJ0YWJsZSddWydwaHB0ZXN0J10pKSB7CiAgICAkYWN0dWFsID0gcmV0dXJuQXJyYXlEYXRhKCRhcnJheVsnb3JkZXJ0YWJsZSddWydwaHB0ZXN0J10pOwp9IGVsc2UgewogICAgJGFjdHVhbCA9ICcnOwp9CmlmICgkYWN0dWFsID09ICRleHBlY3RlZCkgewogICAgcHJpbnQgIm1hdGNoZWQgZXhwZWN0ZWQgcmVzdWx0XG4iOwp9IGVsc2UgewogICAgaWYgKCgkcXVpcmtzWyRxdWlya19rZXldWydmaW5kc190YWJsZSddID09PSBmYWxzZSAKICAgICAgICB8fCBEQjo6aXNFcnJvcigkYXJyYXkpICYmICRhcnJheS0+Z2V0Q29kZSgpID09IERCX0VSUk9SX05PVF9DQVBBQkxFKQogICAgICAgICYmICRhY3R1YWwgPT0gJycpIHsKICAgICAgICBwcmludCAibWF0Y2hlZCBleHBlY3RlZCByZXN1bHRcbiI7CiAgICB9IGVsc2UgewogICAgICAgIHByaW50ICJESUROJ1QgbWF0Y2ggZXhwZWN0ZWQgdmFsdWVzLi4uXG4iOwogICAgICAgIHByaW50ICJ+fn5+fn5+flxuRXhwZWN0ZWQ6XG4kZXhwZWN0ZWRcbiI7CiAgICAgICAgcHJpbnQgIn5+fn5cbkFjdHVhbDpcbiRhY3R1YWxcbn5+fn5+fn5+XG5cbiI7CiAgICB9Cn0KCgpwcmludCAnb3JkZXJ0YWJsZVtwaHB0ZXN0X2ZrXTogJzsKJGV4cGVjdGVkID0gJ2EgPT4gMApmayA9PiAxCmNjID0+IDIKZCA9PiAzCmUgPT4gNApmID0+IDUKJzsKaWYgKCRxdWlya3NbJHF1aXJrX2tleV1bJ2hhbmRsZXNfcmVzdWx0cyddCiAgICAmJiBpc3NldCgkYXJyYXlbJ29yZGVydGFibGUnXVsncGhwdGVzdF9mayddKSkgewogICAgJGFjdHVhbCA9IHJldHVybkFycmF5RGF0YSgkYXJyYXlbJ29yZGVydGFibGUnXVsncGhwdGVzdF9mayddKTsKfSBlbHNlIHsKICAgICRhY3R1YWwgPSAnJzsKfQppZiAoJGFjdHVhbCA9PSAkZXhwZWN0ZWQpIHsKICAgIHByaW50ICJtYXRjaGVkIGV4cGVjdGVkIHJlc3VsdFxuIjsKfSBlbHNlIHsKICAgIGlmICgoJHF1aXJrc1skcXVpcmtfa2V5XVsnZmluZHNfdGFibGUnXSA9PT0gZmFsc2UgCiAgICAgICAgfHwgREI6OmlzRXJyb3IoJGFycmF5KSAmJiAkYXJyYXktPmdldENvZGUoKSA9PSBEQl9FUlJPUl9OT1RfQ0FQQUJMRSkKICAgICAgICAmJiAkYWN0dWFsID09ICcnKSB7CiAgICAgICAgcHJpbnQgIm1hdGNoZWQgZXhwZWN0ZWQgcmVzdWx0XG4iOwogICAgfSBlbHNlIHsKICAgICAgICBwcmludCAiRElETidUIG1hdGNoIGV4cGVjdGVkIHZhbHVlcy4uLlxuIjsKICAgICAgICBwcmludCAifn5+fn5+fn5cbkV4cGVjdGVkOlxuJGV4cGVjdGVkXG4iOwogICAgICAgIHByaW50ICJ+fn5+XG5BY3R1YWw6XG4kYWN0dWFsXG5+fn5+fn5+flxuXG4iOwogICAgfQp9CgoKcHJpbnQgIlxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iOwpwcmludCAiUGFzc2luZyBUQUJMRSBOQU1FICdwaHB0ZXN0X2ZrJyB0byBtZXRob2QgaW4gREJfPGRyaXZlcj4uXG4iOwpwcmludCAiT3V0cHV0ID0gZGVmYXVsdC5cbiI7CnByaW50ICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiI7CiRhcnJheSA9ICRkYmgtPnRhYmxlSW5mbygncGhwdGVzdF9maycpOwoKcHJpbnQgIlxuY29sdW1uIDA6XG4iOwpleGFtaW5lQXJyYXlEYXRhKCRhcnJheSwgJGV4cGVjdGVkMDEsIDAsIGZhbHNlKTsKCnByaW50ICJcbmNvbHVtbiAxOlxuIjsKZXhhbWluZUFycmF5RGF0YSgkYXJyYXksICRleHBlY3RlZDAyLCAxLCBmYWxzZSk7CgpwcmludCAiXG5jb2x1bW4gMjpcbiI7CmV4YW1pbmVBcnJheURhdGEoJGFycmF5LCAkZXhwZWN0ZWQwMywgMiwgZmFsc2UpOwoKcHJpbnQgIlxuY29sdW1uIDM6XG4iOwpleGFtaW5lQXJyYXlEYXRhKCRhcnJheSwgJGV4cGVjdGVkMDQsIDMsIGZhbHNlKTsKCnByaW50ICJcbmNvbHVtbiA0OlxuIjsKZXhhbWluZUFycmF5RGF0YSgkYXJyYXksICRleHBlY3RlZDA1LCA0LCBmYWxzZSk7CgpwcmludCAiXG5jb2x1bW4gNTpcbiI7CmV4YW1pbmVBcnJheURhdGEoJGFycmF5LCAkZXhwZWN0ZWQwNiwgNSwgZmFsc2UpOwoKCnByaW50ICJcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIjsKcHJpbnQgIlBhc3NpbmcgVEFCTEUgTkFNRSAncGhwdGVzdF9maycgdG8gbWV0aG9kIGluIERCXzxkcml2ZXI+LlxuIjsKcHJpbnQgIk91dHB1dCA9IERCX1RBQkxFSU5GT19GVUxMLlxuIjsKcHJpbnQgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIjsKJGFycmF5ID0gJGRiaC0+dGFibGVJbmZvKCdwaHB0ZXN0X2ZrJywgREJfVEFCTEVJTkZPX0ZVTEwpOwoKcHJpbnQgIlxuY29sdW1uIDA6XG4iOwpleGFtaW5lQXJyYXlEYXRhKCRhcnJheSwgJGV4cGVjdGVkMDEsIDAsIGZhbHNlKTsKCnByaW50ICJcbm9yZGVyOlxuIjsKJGV4cGVjdCA9J2EgPT4gMApmayA9PiAxCmNjID0+IDIKZCA9PiAzCmUgPT4gNApmID0+IDUKJzsKZXhhbWluZUFycmF5RGF0YSgkYXJyYXlbJ29yZGVyJ10sICRleHBlY3QsIGZhbHNlLCBmYWxzZSk7CgpwcmludCAiXG5vcmRlcnRhYmxlW3BocHRlc3RfZmtdOlxuIjsKJGV4cGVjdCA9J2EgPT4gMApmayA9PiAxCmNjID0+IDIKZCA9PiAzCmUgPT4gNApmID0+IDUKJzsKZXhhbWluZUFycmF5RGF0YSgkYXJyYXlbJ29yZGVydGFibGUnXVsncGhwdGVzdF9mayddLCAkZXhwZWN0KTsKCgoKcHJpbnQgIlxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iOwpwcmludCAiUGFzc2luZyBUQUJMRSBOQU1FICdwaHB0ZXN0X2ZrJyB0byBtZXRob2QgaW4gREJfPGRyaXZlcj4gQUdBSU4uXG4iOwpwcmludCAiT3V0cHV0ID0gREJfVEFCTEVJTkZPX0ZVTEwsIGxvd2VyY2FzaW5nIHR1cm5lZCBvZmYuXG4iOwpwcmludCAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iOwokZGJoLT5zZXRPcHRpb24oJ3BvcnRhYmlsaXR5JywgREJfUE9SVEFCSUxJVFlfQUxMIF4gREJfUE9SVEFCSUxJVFlfTE9XRVJDQVNFKTsKJGFycmF5ID0gJGRiaC0+dGFibGVJbmZvKCdwaHB0ZXN0X2ZrJywgREJfVEFCTEVJTkZPX0ZVTEwpOwoKLy8gdGVzdGluZyBub24tbG93ZXJjYXNpbmcgYWJvdmUgdG8gZW5zdXJlIHByb2dyYW0gZG9lc24ndCBkaWUuCi8vIGxvd2VyY2FzZSB0aGUgbmFtZXMgaGVyZSB0byBlbnN1cmUgdGVzdCB1bmlmb3JtaXR5LgokYXJyYXlbMF1bJ3RhYmxlJ10gPSBzdHJ0b2xvd2VyKCRhcnJheVswXVsndGFibGUnXSk7CiRhcnJheVswXVsnbmFtZSddID0gc3RydG9sb3dlcigkYXJyYXlbMF1bJ25hbWUnXSk7CgpwcmludCAiXG5jb2x1bW4gMDpcbiI7CmV4YW1pbmVBcnJheURhdGEoJGFycmF5LCAwLCBmYWxzZSk7CgoKJGRiaC0+c2V0RXJyb3JIYW5kbGluZyhQRUFSX0VSUk9SX1JFVFVSTik7CmRyb3BfdGFibGUoJGRiaCwgJ3BocHRlc3QnKTsKZHJvcF90YWJsZSgkZGJoLCAncGhwdGVzdF9maycpOwoKPz4KLS1FWFBFQ1QtLQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KUGFzc2luZyByZXN1bHQgT0JKRUNUIHRvIG1ldGhvZCBpbiBEQl88dHlwZT4uCk91dHB1dCA9IGRlZmF1bHQuCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKY29sdW1uIDA6Cm1hdGNoZWQgZXhwZWN0ZWQgcmVzdWx0Cgpjb2x1bW4gOToKbWF0Y2hlZCBleHBlY3RlZCByZXN1bHQKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpQYXNzaW5nIHJlc3VsdCBJRCB0byBtZXRob2QgaW4gREJfPHR5cGU+LgpPdXRwdXQgPSBEQl9UQUJMRUlORk9fT1JERVIuCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKY29sdW1uIDA6Cm1hdGNoZWQgZXhwZWN0ZWQgcmVzdWx0Cgpjb2x1bW4gMzoKbWF0Y2hlZCBleHBlY3RlZCByZXN1bHQKCm51bV9maWVsZHM6IG1hdGNoZWQgZXhwZWN0ZWQgcmVzdWx0CgpvcmRlcjoKbWF0Y2hlZCBleHBlY3RlZCByZXN1bHQKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpQYXNzaW5nIERCX1RBQkxFSU5GT19PUkRFUlRBQkxFIHRvIG1ldGhvZCBpbiBEQl9yZXN1bHQuCk91dHB1dCA9IERCX1RBQkxFSU5GT19PUkRFUlRBQkxFLgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCmNvbHVtbiAwOgptYXRjaGVkIGV4cGVjdGVkIHJlc3VsdAoKY29sdW1uIDM6Cm1hdGNoZWQgZXhwZWN0ZWQgcmVzdWx0CgpudW1fZmllbGRzOiBtYXRjaGVkIGV4cGVjdGVkIHJlc3VsdApvcmRlcnRhYmxlW3BocHRlc3RdOiBtYXRjaGVkIGV4cGVjdGVkIHJlc3VsdApvcmRlcnRhYmxlW3BocHRlc3RfZmtdOiBtYXRjaGVkIGV4cGVjdGVkIHJlc3VsdAoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClBhc3NpbmcgVEFCTEUgTkFNRSAncGhwdGVzdF9maycgdG8gbWV0aG9kIGluIERCXzxkcml2ZXI+LgpPdXRwdXQgPSBkZWZhdWx0LgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCmNvbHVtbiAwOgptYXRjaGVkIGV4cGVjdGVkIHJlc3VsdAoKY29sdW1uIDE6Cm1hdGNoZWQgZXhwZWN0ZWQgcmVzdWx0Cgpjb2x1bW4gMjoKbWF0Y2hlZCBleHBlY3RlZCByZXN1bHQKCmNvbHVtbiAzOgptYXRjaGVkIGV4cGVjdGVkIHJlc3VsdAoKY29sdW1uIDQ6Cm1hdGNoZWQgZXhwZWN0ZWQgcmVzdWx0Cgpjb2x1bW4gNToKbWF0Y2hlZCBleHBlY3RlZCByZXN1bHQKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpQYXNzaW5nIFRBQkxFIE5BTUUgJ3BocHRlc3RfZmsnIHRvIG1ldGhvZCBpbiBEQl88ZHJpdmVyPi4KT3V0cHV0ID0gREJfVEFCTEVJTkZPX0ZVTEwuCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKY29sdW1uIDA6Cm1hdGNoZWQgZXhwZWN0ZWQgcmVzdWx0CgpvcmRlcjoKbWF0Y2hlZCBleHBlY3RlZCByZXN1bHQKCm9yZGVydGFibGVbcGhwdGVzdF9ma106Cm1hdGNoZWQgZXhwZWN0ZWQgcmVzdWx0Cgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KUGFzc2luZyBUQUJMRSBOQU1FICdwaHB0ZXN0X2ZrJyB0byBtZXRob2QgaW4gREJfPGRyaXZlcj4gQUdBSU4uCk91dHB1dCA9IERCX1RBQkxFSU5GT19GVUxMLCBsb3dlcmNhc2luZyB0dXJuZWQgb2ZmLgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCmNvbHVtbiAwOgptYXRjaGVkIGV4cGVjdGVkIHJlc3VsdAo=]]></data>
	</file>
	<file>
	  <filename>/lib/pear/tests/driver/17query.phpt</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LS1URVNULS0KREJfZHJpdmVyOjpxdWVyeQotLUlOSS0tCmVycm9yX3JlcG9ydGluZyA9IDIwNDcKLS1TS0lQSUYtLQo8P3BocAoKLyoqCiAqIENhbGxzIHRoZSBxdWVyeSgpIG1ldGhvZCBpbiB2YXJpb3VzIHdheXMgYWdhaW5zdCBhbnkgREJNUy4KICoKICogQHNlZSAgICAgIERCX2NvbW1vbjo6cXVlcnkoKQogKiAKICogQHBhY2thZ2UgIERCCiAqIEB2ZXJzaW9uICAkSWQ6IDE3cXVlcnkucGhwdCx2IDEuMTYgMjAwNy8wMS8xMiAwMjo0MTowNyBhaGFydmV5IEV4cCAkCiAqIEBjYXRlZ29yeSBEYXRhYmFzZQogKiBAYXV0aG9yICAgRGFuaWVsIENvbnZpc3NvciA8ZGFuaWVsY0BhbmFseXNpc2FuZHNvbHV0aW9ucy5jb20+CiAqIEBpbnRlcm5hbAogKi8KCmNoZGlyKGRpcm5hbWUoX19GSUxFX18pKTsKcmVxdWlyZV9vbmNlICcuL3NraXBpZi5pbmMnOwoKPz4KLS1GSUxFLS0KPD9waHAKCi8vICRJZDogMTdxdWVyeS5waHB0LHYgMS4xNiAyMDA3LzAxLzEyIDAyOjQxOjA3IGFoYXJ2ZXkgRXhwICQKCi8qKgogKiBDb25uZWN0IHRvIHRoZSBkYXRhYmFzZSBhbmQgbWFrZSB0aGUgcGhwdGVzdCB0YWJsZS4KICovCnJlcXVpcmVfb25jZSAnLi9ta3RhYmxlLmluYyc7CgoKLyoqCiAqIExvY2FsIGVycm9yIGNhbGxiYWNrIGhhbmRsZXIuCiAqCiAqIERyb3BzIHRoZSBwaHB0ZXN0IHRhYmxlLCBwcmludHMgb3V0IGFuIGVycm9yIG1lc3NhZ2UgYW5kIGtpbGxzIHRoZQogKiBwcm9jZXNzLgogKgogKiBAcGFyYW0gb2JqZWN0ICAkbyAgUEVBUiBlcnJvciBvYmplY3QgYXV0b21hdGljYWxseSBwYXNzZWQgdG8gdGhpcyBtZXRob2QKICogQHJldHVybiB2b2lkCiAqIEBzZWUgUEVBUjo6c2V0RXJyb3JIYW5kbGluZygpCiAqLwpmdW5jdGlvbiBwZSgkbykgewogICAgZ2xvYmFsICRkYmg7CgogICAgJGRiaC0+c2V0RXJyb3JIYW5kbGluZyhQRUFSX0VSUk9SX1JFVFVSTik7CiAgICBkcm9wX3RhYmxlKCRkYmgsICdwaHB0ZXN0Jyk7CgogICAgZGllKCRvLT50b1N0cmluZygpKTsKfQoKJGRiaC0+c2V0RXJyb3JIYW5kbGluZyhQRUFSX0VSUk9SX0NBTExCQUNLLCAncGUnKTsKCgokZGJoLT5zZXRGZXRjaE1vZGUoREJfRkVUQ0hNT0RFX0FTU09DKTsKCgokcmVzID0mICRkYmgtPnF1ZXJ5KCdERUxFVEUgRlJPTSBwaHB0ZXN0IFdIRVJFIGEgPSAxNycpOwpwcmludCAnMSkgZGVsZXRlOiAnIC4gKCRyZXMgPT09IERCX09LID8gJ29rYXknIDogJ2Vycm9yJykgLiAiXG4iOwoKJHJlcyA9JiAkZGJoLT5xdWVyeSgiSU5TRVJUIElOVE8gcGhwdGVzdCAoYSwgYiwgY2MpIFZBTFVFUyAoMTcsICdvbmUnLCAnT25lJykiKTsKcHJpbnQgJzIpIGluc2VydDogJyAuICgkcmVzID09PSBEQl9PSyA/ICdva2F5JyA6ICdlcnJvcicpIC4gIlxuIjsKCiRyZXMgPSYgJGRiaC0+cXVlcnkoJ0lOU0VSVCBJTlRPIHBocHRlc3QgKGEsIGIsIGNjKSBWQUxVRVMgKD8sID8sID8pJywgYXJyYXkoMTcsICd0d28nLCAnVHdvJykpOwpwcmludCAnMykgaW5zZXJ0OiAnIC4gKCRyZXMgPT09IERCX09LID8gJ29rYXknIDogJ2Vycm9yJykgLiAiXG4iOwoKCiRyZXMgPSYgJGRiaC0+cXVlcnkoJ1NFTEVDVCBhLCBiIEZST00gcGhwdGVzdCBXSEVSRSBhID0gMTcnKTsKJHJvdyA9ICRyZXMtPmZldGNoUm93KCk7CnByaW50ICI0KSBhID0geyRyb3dbJ2EnXX0sIGIgPSB7JHJvd1snYiddfVxuIjsKJHJlcy0+ZnJlZSgpOyAgLy8ga2VlcCBmYnNxbCBoYXBweS4KCiRyZXMgPSYgJGRiaC0+cXVlcnkoJ1NFTEVDVCBhLCBiIEZST00gcGhwdGVzdCBXSEVSRSBjYyA9ID8nLCBhcnJheSgnVHdvJykpOwokcm93ID0gJHJlcy0+ZmV0Y2hSb3coKTsKcHJpbnQgIjUpIGEgPSB7JHJvd1snYSddfSwgYiA9IHskcm93WydiJ119XG4iOwoKCiRhcnJheSA9IGFycmF5KAogICAgJ2ZvbycgPT4gMTEsCiAgICAnYmFyJyA9PiAndGhyZWUnLAogICAgJ2JheicgPT4gbnVsbCwKKTsKJHJlcyA9JiAkZGJoLT5xdWVyeSgnSU5TRVJUIElOVE8gcGhwdGVzdCAoYSwgYiwgZCkgVkFMVUVTICg/LCA/LCA/KScsICRhcnJheSk7CnByaW50ICc2KSBpbnNlcnQ6ICcgLiAoJHJlcyA9PT0gREJfT0sgPyAnb2theScgOiAnZXJyb3InKSAuICJcbiI7CgokcmVzID0mICRkYmgtPnF1ZXJ5KCdTRUxFQ1QgYSwgYiwgZCBGUk9NIHBocHRlc3QgV0hFUkUgYSA9ID8nLCAxMSk7CiRyb3cgPSAkcmVzLT5mZXRjaFJvdygpOwpwcmludCAiNykgYSA9IHskcm93WydhJ119LCBiID0geyRyb3dbJ2InXX0sIGQgPSAiOwppZiAoJGRiaC0+cGhwdHlwZSA9PSAnbXNxbCcpIHsKICAgIGlmIChhcnJheV9rZXlfZXhpc3RzKCdkJywgJHJvdykpIHsKICAgICAgICAkdHlwZSA9IGdldHR5cGUoJHJvd1snZCddKTsKICAgICAgICBpZiAoJHR5cGUgPT0gJ05VTEwnIHx8ICRyb3dbJ2QnXSA9PSAnJykgewogICAgICAgICAgICBwcmludCAiZ290IGV4cGVjdGVkIHZhbHVlXG4iOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHByaW50ICJFUlI6IGV4cGVjdGVkIGQncyB0eXBlIHRvIGJlIE5VTEwgYnV0IGl0J3MgJHR5cGUgYW5kIHRoZSB2YWx1ZSBpcyAiOwogICAgICAgICAgICBwcmludCAkcm93WydkJ10gLiAiXG4iOwogICAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgICAgLy8gaHR0cDovL2J1Z3MucGhwLm5ldC8/aWQ9MzE5NjAKICAgICAgICBwcmludCAiUHJpb3IgdG8gUEhQIDQuMy4xMSBvciA1LjAuNCwgUEhQJ3MgbXNxbCBleHRlbnNpb24gc2lsZW50bHkiCiAgICAgICAgICAgICAgLiAiIGRyb3BwZWQgY29sdW1ucyB3aXRoIG51bGwgdmFsdWVzLiBZb3UgbmVlZCB0byB1cGdyYWRlLlxuIjsKICAgIH0KfSBlbHNlIHsKICAgICR0eXBlID0gZ2V0dHlwZSgkcm93WydkJ10pOwogICAgaWYgKCR0eXBlID09ICdOVUxMJyB8fCAkcm93WydkJ10gPT0gJycpIHsKICAgICAgICBwcmludCAiZ290IGV4cGVjdGVkIHZhbHVlXG4iOwogICAgfSBlbHNlIHsKICAgICAgICBwcmludCAiRVJSOiBleHBlY3RlZCBkJ3MgdHlwZSB0byBiZSBOVUxMIGJ1dCBpdCdzICR0eXBlIGFuZCB0aGUgdmFsdWUgaXMgIjsKICAgICAgICBwcmludCAkcm93WydkJ10gLiAiXG4iOwogICAgfQp9CgoKJHJlcyA9JiAkZGJoLT5xdWVyeSgnREVMRVRFIEZST00gcGhwdGVzdCBXSEVSRSBhID0gPycsIGFycmF5KDE3KSk7CnByaW50ICc4KSBkZWxldGU6ICcgLiAoJHJlcyA9PT0gREJfT0sgPyAnb2theScgOiAnZXJyb3InKSAuICJcbiI7CgokcmVzID0mICRkYmgtPnF1ZXJ5KCdERUxFVEUgRlJPTSBwaHB0ZXN0IFdIRVJFIGEgPSA/JywgYXJyYXkoMCkpOwpwcmludCAnOSkgZGVsZXRlIHdpdGggYXJyYXkoMCkgYXMgcGFyYW06ICcgLiAoJHJlcyA9PT0gREJfT0sgPyAnb2theScgOiAnZXJyb3InKSAuICJcbiI7CgokcmVzID0mICRkYmgtPnF1ZXJ5KCdERUxFVEUgRlJPTSBwaHB0ZXN0IFdIRVJFIGEgPSA/JywgMCk7CnByaW50ICcxMCkgZGVsZXRlIHdpdGggMCBhcyBwYXJhbTogJyAuICgkcmVzID09PSBEQl9PSyA/ICdva2F5JyA6ICdlcnJvcicpIC4gIlxuIjsKCiRkYmgtPm5leHRRdWVyeUlzTWFuaXAodHJ1ZSk7CiRyZXMgPSYgJGRiaC0+cXVlcnkoJ1NFTEVDVCAqIEZST00gcGhwdGVzdCcpOwpwcmludCAnMTEpIHF1ZXJ5IGlzIG1hbmlwICh3aXRoIG92ZXJyaWRlKTogJyAuICgkZGJoLT5fbGFzdF9xdWVyeV9tYW5pcCA/ICd0cnVlJyA6ICdmYWxzZScpIC4gIlxuIjsKCiRkYmgtPm5leHRRdWVyeUlzTWFuaXAoZmFsc2UpOwokcmVzID0mICRkYmgtPnF1ZXJ5KCdTRUxFQ1QgKiBGUk9NIHBocHRlc3QnKTsKcHJpbnQgJzEyKSBxdWVyeSBpcyBtYW5pcCAod2l0aG91dCBvdmVycmlkZSk6ICcgLiAoJGRiaC0+X2xhc3RfcXVlcnlfbWFuaXAgPyAndHJ1ZScgOiAnZmFsc2UnKSAuICJcbiI7CgoKJGRiaC0+c2V0RXJyb3JIYW5kbGluZyhQRUFSX0VSUk9SX1JFVFVSTik7CmRyb3BfdGFibGUoJGRiaCwgJ3BocHRlc3QnKTsKCj8+Ci0tRVhQRUNULS0KMSkgZGVsZXRlOiBva2F5CjIpIGluc2VydDogb2theQozKSBpbnNlcnQ6IG9rYXkKNCkgYSA9IDE3LCBiID0gb25lCjUpIGEgPSAxNywgYiA9IHR3bwo2KSBpbnNlcnQ6IG9rYXkKNykgYSA9IDExLCBiID0gdGhyZWUsIGQgPSBnb3QgZXhwZWN0ZWQgdmFsdWUKOCkgZGVsZXRlOiBva2F5CjkpIGRlbGV0ZSB3aXRoIGFycmF5KDApIGFzIHBhcmFtOiBva2F5CjEwKSBkZWxldGUgd2l0aCAwIGFzIHBhcmFtOiBva2F5CjExKSBxdWVyeSBpcyBtYW5pcCAod2l0aCBvdmVycmlkZSk6IHRydWUKMTIpIHF1ZXJ5IGlzIG1hbmlwICh3aXRob3V0IG92ZXJyaWRlKTogZmFsc2UK]]></data>
	</file>
	<file>
	  <filename>/lib/pear/tests/driver/18get.phpt</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LS1URVNULS0KREJfZHJpdmVyOjpnZXQKLS1JTkktLQplcnJvcl9yZXBvcnRpbmcgPSAyMDQ3Ci0tU0tJUElGLS0KPD9waHAKCi8qKgogKiBDYWxscyB0aGUgZ2V0KigpIG1ldGhvZHMgaW4gdmFyaW91cyB3YXlzIGFnYWluc3QgYW55IERCTVMuCiAqCiAqIEBzZWUgREJfQ29tbW9uOjpnZXRBbGwoKSwgREJfQ29tbW9uOjpnZXRBc3NvYygpLCBEQl9Db21tb246OmdldENvbCgpCiAqICAgICAgREJfQ29tbW9uOjpnZXRMaXN0T2YoKSwgREJfQ29tbW9uOjpnZXRPbmUoKSwgREJfQ29tbW9uOjpnZXRSb3coKQogKgogKiBAcGFja2FnZSAgREIKICogQHZlcnNpb24gICRJZDogMThnZXQucGhwdCx2IDEuMTEgMjAwNy8wMS8wOCAwMDoxOTo0OCBhaGFydmV5IEV4cCAkCiAqIEBjYXRlZ29yeSBEYXRhYmFzZQogKiBAYXV0aG9yICAgRGFuaWVsIENvbnZpc3NvciA8ZGFuaWVsY0BhbmFseXNpc2FuZHNvbHV0aW9ucy5jb20+CiAqIEBpbnRlcm5hbAogKi8KCmNoZGlyKGRpcm5hbWUoX19GSUxFX18pKTsKcmVxdWlyZV9vbmNlICcuL3NraXBpZi5pbmMnOwoKPz4KLS1GSUxFLS0KPD9waHAKCi8vICRJZDogMThnZXQucGhwdCx2IDEuMTEgMjAwNy8wMS8wOCAwMDoxOTo0OCBhaGFydmV5IEV4cCAkCgovKioKICogQ29ubmVjdCB0byB0aGUgZGF0YWJhc2UgYW5kIG1ha2UgdGhlIDxrYmQ+cGhwdGVzdDwva2JkPiB0YWJsZS4KICovCnJlcXVpcmVfb25jZSAnLi9ta3RhYmxlLmluYyc7CgoKLyoqCiAqIExvY2FsIGVycm9yIGNhbGxiYWNrIGhhbmRsZXIuCiAqCiAqIERyb3BzIHRoZSBwaHB0ZXN0IHRhYmxlLCBwcmludHMgb3V0IGFuIGVycm9yIG1lc3NhZ2UgYW5kIGtpbGxzIHRoZQogKiBwcm9jZXNzLgogKgogKiBAcGFyYW0gb2JqZWN0ICAkbyAgUEVBUiBlcnJvciBvYmplY3QgYXV0b21hdGljYWxseSBwYXNzZWQgdG8gdGhpcyBtZXRob2QKICogQHJldHVybiB2b2lkCiAqIEBzZWUgUEVBUjo6c2V0RXJyb3JIYW5kbGluZygpCiAqLwpmdW5jdGlvbiBwZSgkbyl7CiAgICBnbG9iYWwgJGRiaDsKCiAgICAkZGJoLT5zZXRFcnJvckhhbmRsaW5nKFBFQVJfRVJST1JfUkVUVVJOKTsKICAgIGRyb3BfdGFibGUoJGRiaCwgJ3BocHRlc3QnKTsKCiAgICBkaWUoJG8tPnRvU3RyaW5nKCkpOwp9CgokZGJoLT5zZXRFcnJvckhhbmRsaW5nKFBFQVJfRVJST1JfQ0FMTEJBQ0ssICdwZScpOwoKCiRkYmgtPnF1ZXJ5KCJJTlNFUlQgSU5UTyBwaHB0ZXN0IFZBTFVFUyAoMiwgJ3R3bycsICdUd28nLCAnMjAwMi0wMi0yMicpIik7CiRkYmgtPnF1ZXJ5KCJJTlNFUlQgSU5UTyBwaHB0ZXN0IFZBTFVFUyAoNDIsICd0aHJlZScsICdUaHJlZScsICcyMDAzLTAzLTIzJykiKTsKCgpwcmludCAiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iOwpwcmludCAndGVzdGluZyBnZXRPbmU6ICc7CiRyZXQgPSYgJGRiaC0+Z2V0T25lKCJTRUxFQ1QgKiBGUk9NIHBocHRlc3QgV0hFUkUgY2MgPSAnVHdvJyIpOwpwcmludF9yKCRyZXQpOwpwcmludCAiXG4iOwoKcHJpbnQgJ3Rlc3RpbmcgZ2V0T25lIHdpdGggc3RyaW5nIHBhcmFtczogJzsKJHJldCA9JiAkZGJoLT5nZXRPbmUoJ1NFTEVDVCAqIEZST00gcGhwdGVzdCBXSEVSRSBjYyA9ID8nLCAnVGhyZWUnKTsKcHJpbnRfcigkcmV0KTsKcHJpbnQgIlxuIjsKCnByaW50ICd0ZXN0aW5nIGdldE9uZSB3aXRoIGFycmF5IHBhcmFtczogJzsKJHJldCA9JiAkZGJoLT5nZXRPbmUoJ1NFTEVDVCAqIEZST00gcGhwdGVzdCBXSEVSRSBjYyA9ID8nLCBhcnJheSgnVHdvJykpOwpwcmludF9yKCRyZXQpOwpwcmludCAiXG4iOwoKcHJpbnQgIlxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iOwpwcmludCAidGVzdGluZyBnZXRSb3c6XG4iOwokcmV0ID0mICRkYmgtPmdldFJvdygiU0VMRUNUICogRlJPTSBwaHB0ZXN0IFdIRVJFIGNjID0gJ1R3byciKTsKcHJpbnRfcigkcmV0KTsKCnByaW50ICJ0ZXN0aW5nIGdldFJvdyB3aXRoIG51bGwgcGFyYW1zLCBEQl9GRVRDSE1PREVfT1JERVJFRDpcbiI7CiRyZXQgPSYgJGRiaC0+Z2V0Um93KCJTRUxFQ1QgKiBGUk9NIHBocHRlc3QgV0hFUkUgY2MgPSAnVHdvJyIsCiAgICAgICAgbnVsbCwgREJfRkVUQ0hNT0RFX09SREVSRUQpOwpwcmludF9yKCRyZXQpOwoKLy8gVEhJUyBET0VTTidUIFdPUksgRFVFIFRPIEJBQ0tXQVJEUyBDT01QQVRJQklMSVRZIENSQVAKLy8gcHJpbnQgInRlc3RpbmcgZ2V0Um93IHdpdGggc3RyaW5nIHBhcmFtcywgREJfRkVUQ0hNT0RFX09SREVSRUQ6XG4iOwovLyAkcmV0ID0mICRkYmgtPmdldFJvdygnU0VMRUNUICogRlJPTSBwaHB0ZXN0IFdIRVJFIGNjID0gPycsCi8vICAgICAgICAgJ1R3bycsIERCX0ZFVENITU9ERV9PUkRFUkVEKTsKLy8gcHJpbnRfcigkcmV0KTsKLy8KLy8gdGVzdGluZyBnZXRSb3cgd2l0aCBzdHJpbmcgcGFyYW1zLCBEQl9GRVRDSE1PREVfT1JERVJFRDoKLy8gQXJyYXkKLy8gKAovLyAgICAgWzBdID0+IDIKLy8gICAgIFsxXSA9PiB0d28KLy8gICAgIFsyXSA9PiBUd28KLy8gICAgIFszXSA9PiAyMDAyLTAyLTIyCi8vICkKCiAgIHByaW50ICJ0ZXN0aW5nIGdldFJvdyB3aXRoIFJFVkVSU0VEIGFyZ3M6IERCX0ZFVENITU9ERV9BU1NPQywgYXJyYXkgcGFyYW1zOlxuIjsKICAgJHJldCA9JiAkZGJoLT5nZXRSb3coJ1NFTEVDVCAqIEZST00gcGhwdGVzdCBXSEVSRSBjYyA9ID8nLAogICAgICAgICAgIERCX0ZFVENITU9ERV9BU1NPQywgYXJyYXkoJ1R3bycpKTsKICAgcHJpbnRfcigkcmV0KTsKICAgCiAgIHByaW50ICJ0ZXN0aW5nIGdldFJvdyB3aXRoIFJFVkVSU0VEIGFyZ3M6IERCX0ZFVENITU9ERV9BU1NPQzpcbiI7CiAgICRyZXQgPSYgJGRiaC0+Z2V0Um93KCJTRUxFQ1QgKiBGUk9NIHBocHRlc3QgV0hFUkUgY2MgPSAnVHdvJyIsCiAgICAgICAgICAgREJfRkVUQ0hNT0RFX0FTU09DKTsKICAgcHJpbnRfcigkcmV0KTsKCnByaW50ICJ0ZXN0aW5nIGdldFJvdyB3aXRoIGFycmF5IHBhcmFtcywgREJfRkVUQ0hNT0RFX0FTU09DOlxuIjsKJHJldCA9JiAkZGJoLT5nZXRSb3coJ1NFTEVDVCAqIEZST00gcGhwdGVzdCBXSEVSRSBjYyA9ID8nLAogICAgICAgIGFycmF5KCdUd28nKSwgREJfRkVUQ0hNT0RFX0FTU09DKTsKcHJpbnRfcigkcmV0KTsKCnByaW50ICJ0ZXN0aW5nIGdldFJvdyB3aXRoIGFycmF5IHBhcmFtcywgREJfRkVUQ0hNT0RFX09CSkVDVDpcbiI7CiRyZXQgPSYgJGRiaC0+Z2V0Um93KCdTRUxFQ1QgKiBGUk9NIHBocHRlc3QgV0hFUkUgY2MgPSA/JywKICAgICAgICBhcnJheSgnVHdvJyksIERCX0ZFVENITU9ERV9PQkpFQ1QpOwpwcmludF9yKCRyZXQpOwoKCnByaW50ICJcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIjsKcHJpbnQgInRlc3RpbmcgZ2V0Q29sOlxuIjsKJHJldCA9JiAkZGJoLT5nZXRDb2woIlNFTEVDVCAqIEZST00gcGhwdGVzdCBPUkRFUiBCWSBiIik7CnByaW50X3IoJHJldCk7CgpwcmludCAidGVzdGluZyBnZXRDb2wgb24gcXVlcnkgd2l0aCBubyByZWNvcmRzOlxuIjsKJHJldCA9JiAkZGJoLT5nZXRDb2woJ1NFTEVDVCAqIEZST00gcGhwdGVzdCBXSEVSRSBhID4gMjAwJyk7CnByaW50X3IoJHJldCk7CgpwcmludCAidGVzdGluZyBnZXRDb2wgd2l0aCBpbnZhbGlkIGNvbHVtbiBpZDpcbiI7CiRkYmgtPnNldEVycm9ySGFuZGxpbmcoUEVBUl9FUlJPUl9SRVRVUk4pOwokcmV0ID0mICRkYmgtPmdldENvbCgnU0VMRUNUIGIgRlJPTSBwaHB0ZXN0IE9SREVSIEJZIGInLCAxKTsKaWYgKERCOjppc0Vycm9yKCRyZXQpKSB7CiAgICBlY2hvICRyZXQtPmdldE1lc3NhZ2UoKSAuICJcbiI7Cn0gZWxzZSB7CiAgICBwcmludCAiPj4gU2hvdWxkIGhhdmUgcHJvZHVjZWQgJ25vIHN1Y2ggZmllbGQnIGVycm9yXG4iOwp9CiRkYmgtPnNldEVycm9ySGFuZGxpbmcoUEVBUl9FUlJPUl9DQUxMQkFDSywgJ3BlJyk7CgpwcmludCAidGVzdGluZyBnZXRDb2wgd2l0aCAxIGNvbDpcbiI7CiRyZXQgPSYgJGRiaC0+Z2V0Q29sKCJTRUxFQ1QgKiBGUk9NIHBocHRlc3QgT1JERVIgQlkgYiIsIDEpOwpwcmludF9yKCRyZXQpOwoKcHJpbnQgInRlc3RpbmcgZ2V0Q29sIHdpdGggYiBjb2w6XG4iOwokcmV0ID0mICRkYmgtPmdldENvbCgiU0VMRUNUICogRlJPTSBwaHB0ZXN0IE9SREVSIEJZIGIiLCAnYicpOwpwcmludF9yKCRyZXQpOwoKcHJpbnQgInRlc3RpbmcgZ2V0Q29sIHdpdGggYiBjb2wsIHNjYWxhciBwYXJhbXM6XG4iOwokcmV0ID0mICRkYmgtPmdldENvbCgiU0VMRUNUICogRlJPTSBwaHB0ZXN0IFdIRVJFIGEgPCA/IE9SREVSIEJZIGIiLAogICAgICAgICdiJywgMTAwKTsKcHJpbnRfcigkcmV0KTsKCnByaW50ICJ0ZXN0aW5nIGdldENvbCB3aXRoIGIgY29sLCBhcnJheSBwYXJhbXM6XG4iOwokcmV0ID0mICRkYmgtPmdldENvbCgiU0VMRUNUICogRlJPTSBwaHB0ZXN0IFdIRVJFIGEgPCA/IE9SREVSIEJZIGIiLAogICAgICAgICdiJywgYXJyYXkoMTAwKSk7CnByaW50X3IoJHJldCk7CgoKcHJpbnQgIlxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iOwpwcmludCAidGVzdGluZyBnZXRBc3NvYzpcbiI7CiRyZXQgPSYgJGRiaC0+Z2V0QXNzb2MoJ1NFTEVDVCBhLCBiLCBjYyBGUk9NIHBocHRlc3QgV0hFUkUgYSA8IDEwMCBPUkRFUiBCWSBiJyk7CnByaW50X3IoJHJldCk7CgpwcmludCAidGVzdGluZyBnZXRBc3NvYyB3aXRoIGZhbHNlIGZvcmNlLCBudWxsIHBhcmFtcywgREJfRkVUQ0hNT0RFX09SREVSRUQ6XG4iOwokcmV0ID0mICRkYmgtPmdldEFzc29jKCJTRUxFQ1QgYSwgYiwgY2MgRlJPTSBwaHB0ZXN0IFdIRVJFIGEgPCAxMDAgT1JERVIgQlkgYiIsCiAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBudWxsLCBEQl9GRVRDSE1PREVfT1JERVJFRCk7CnByaW50X3IoJHJldCk7CgpwcmludCAidGVzdGluZyBnZXRBc3NvYyB3aXRoIGZhbHNlIGZvcmNlLCBzY2FsYXIgcGFyYW1zLCBEQl9GRVRDSE1PREVfQVNTT0M6XG4iOwokcmV0ID0mICRkYmgtPmdldEFzc29jKCdTRUxFQ1QgYSwgYiwgY2MgRlJPTSBwaHB0ZXN0IFdIRVJFIGEgPCA/IE9SREVSIEJZIGInLAogICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgMTAwLCBEQl9GRVRDSE1PREVfQVNTT0MpOwpwcmludF9yKCRyZXQpOwoKcHJpbnQgInRlc3RpbmcgZ2V0QXNzb2Mgd2l0aCB0d28gY29scywgZmFsc2UgZm9yY2UsIHNjYWxhciBwYXJhbXMsIERCX0ZFVENITU9ERV9BU1NPQzpcbiI7CiRyZXQgPSYgJGRiaC0+Z2V0QXNzb2MoJ1NFTEVDVCBhLCBiIEZST00gcGhwdGVzdCBXSEVSRSBhIDwgPyBPUkRFUiBCWSBiJywKICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIDEwMCwgREJfRkVUQ0hNT0RFX0FTU09DKTsKcHJpbnRfcigkcmV0KTsKCnByaW50ICJ0ZXN0aW5nIGdldEFzc29jIHdpdGggdHdvIGNvbHMsIHRydWUgZm9yY2UsIHNjYWxhciBwYXJhbXMsIERCX0ZFVENITU9ERV9BU1NPQzpcbiI7CiRyZXQgPSYgJGRiaC0+Z2V0QXNzb2MoJ1NFTEVDVCBhLCBiIEZST00gcGhwdGVzdCBXSEVSRSBhIDwgPyBPUkRFUiBCWSBiJywKICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgMTAwLCBEQl9GRVRDSE1PREVfQVNTT0MpOwpwcmludF9yKCRyZXQpOwoKcHJpbnQgInRlc3RpbmcgZ2V0QXNzb2Mgd2l0aCBmYWxzZSBmb3JjZSwgc2NhbGFyIHBhcmFtcywgREJfRkVUQ0hNT0RFX0FTU09DLCB0cnVlIGdyb3VwOlxuIjsKJHJldCA9JiAkZGJoLT5nZXRBc3NvYygnU0VMRUNUIGEsIGIsIGNjIEZST00gcGhwdGVzdCBXSEVSRSBhIDwgPyBPUkRFUiBCWSBiJywKICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIDEwMCwgREJfRkVUQ0hNT0RFX0FTU09DLCB0cnVlKTsKcHJpbnRfcigkcmV0KTsKCnByaW50ICJ0ZXN0aW5nIGdldEFzc29jIHdpdGggZmFsc2UgZm9yY2UsIGFycmF5IHBhcmFtcywgREJfRkVUQ0hNT0RFX09CSkVDVDpcbiI7CiRyZXQgPSYgJGRiaC0+Z2V0QXNzb2MoJ1NFTEVDVCBhLCBiLCBjYyBGUk9NIHBocHRlc3QgV0hFUkUgYSA8ID8gT1JERVIgQlkgYicsCiAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBhcnJheSgxMDApLCBEQl9GRVRDSE1PREVfT0JKRUNUKTsKcHJpbnRfcigkcmV0KTsKCnByaW50ICJ0ZXN0aW5nIGdldEFzc29jIHdpdGggdHJ1ZSBmb3JjZSwgYXJyYXkgcGFyYW1zLCBEQl9GRVRDSE1PREVfT0JKRUNULCB0cnVlIGdyb3VwOlxuIjsKJHJldCA9JiAkZGJoLT5nZXRBc3NvYygnU0VMRUNUIGEsIGIsIGNjIEZST00gcGhwdGVzdCBXSEVSRSBhIDwgPyBPUkRFUiBCWSBiJywKICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGFycmF5KDEwMCksIERCX0ZFVENITU9ERV9PQkpFQ1QsIHRydWUpOwpwcmludF9yKCRyZXQpOwoKCnByaW50ICJcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIjsKcHJpbnQgInRlc3RpbmcgZ2V0QWxsOlxuIjsKJHJldCA9JiAkZGJoLT5nZXRBbGwoIlNFTEVDVCAqIEZST00gcGhwdGVzdCBXSEVSRSBjYyA9ICdUd28nIE9SIGNjID0gJ1RocmVlJyIpOwpwcmludF9yKCRyZXQpOwoKcHJpbnQgInRlc3RpbmcgZ2V0QWxsIHdpdGggbnVsbCBwYXJhbXMsIERCX0ZFVENITU9ERV9PUkRFUkVEOlxuIjsKJHJldCA9JiAkZGJoLT5nZXRBbGwoIlNFTEVDVCAqIEZST00gcGhwdGVzdCBXSEVSRSBjYyA9ICdUd28nIE9SIGNjID0gJ1RocmVlJyIsCiAgICAgICAgbnVsbCwgREJfRkVUQ0hNT0RFX09SREVSRUQpOwpwcmludF9yKCRyZXQpOwoKLy8gVEhJUyBET0VTTidUIFdPUksgRFVFIFRPIEJBQ0tXQVJEUyBDT01QQVRJQklMSVRZIENSQVAKLy8gcHJpbnQgInRlc3RpbmcgZ2V0QWxsIHdpdGggc3RyaW5nIHBhcmFtcywgREJfRkVUQ0hNT0RFX09SREVSRUQ6XG4iOwovLyAkcmV0ID0mICRkYmgtPmdldEFsbCgnU0VMRUNUICogRlJPTSBwaHB0ZXN0IFdIRVJFIGNjID0gPycsCi8vICAgICAgICAgJ1R3bycsIERCX0ZFVENITU9ERV9PUkRFUkVEKTsKLy8gcHJpbnRfcigkcmV0KTsKLy8KLy8gdGVzdGluZyBnZXRBbGwgd2l0aCBzdHJpbmcgcGFyYW1zLCBEQl9GRVRDSE1PREVfT1JERVJFRDoKLy8gQXJyYXkKLy8gKAovLyAgICAgWzBdID0+IDIKLy8gICAgIFsxXSA9PiB0d28KLy8gICAgIFsyXSA9PiBUd28KLy8gICAgIFszXSA9PiAyMDAyLTAyLTIyCi8vICkKCiAgIHByaW50ICJ0ZXN0aW5nIGdldEFsbCB3aXRoIFJFVkVSU0VEIGFyZ3M6IERCX0ZFVENITU9ERV9BU1NPQywgYXJyYXkgcGFyYW1zOlxuIjsKICAgJHJldCA9JiAkZGJoLT5nZXRBbGwoJ1NFTEVDVCAqIEZST00gcGhwdGVzdCBXSEVSRSBjYyA9ID8gT1IgY2MgPSA/IE9SREVSIEJZIGNjJywKICAgICAgICAgICBEQl9GRVRDSE1PREVfQVNTT0MsIGFycmF5KCdUd28nLCAnVGhyZWUnKSk7CiAgIHByaW50X3IoJHJldCk7CiAgIAogICBwcmludCAidGVzdGluZyBnZXRBbGwgd2l0aCBSRVZFUlNFRCBhcmdzOiBEQl9GRVRDSE1PREVfQVNTT0M6XG4iOwogICAkcmV0ID0mICRkYmgtPmdldEFsbCgiU0VMRUNUICogRlJPTSBwaHB0ZXN0IFdIRVJFIGNjID0gJ1R3bycgT1IgY2MgPSAnVGhyZWUnIiwKICAgICAgICAgICBEQl9GRVRDSE1PREVfQVNTT0MpOwogICBwcmludF9yKCRyZXQpOwoKcHJpbnQgInRlc3RpbmcgZ2V0QWxsIHdpdGggYXJyYXkgcGFyYW1zLCBEQl9GRVRDSE1PREVfQVNTT0M6XG4iOwokcmV0ID0mICRkYmgtPmdldEFsbCgnU0VMRUNUICogRlJPTSBwaHB0ZXN0IFdIRVJFIGNjID0gPyBPUiBjYyA9ID8gT1JERVIgQlkgY2MnLAogICAgICAgIGFycmF5KCdUd28nLCAnVGhyZWUnKSwgREJfRkVUQ0hNT0RFX0FTU09DKTsKcHJpbnRfcigkcmV0KTsKCnByaW50ICJ0ZXN0aW5nIGdldEFsbCB3aXRoIGFycmF5IHBhcmFtcywgREJfRkVUQ0hNT0RFX09CSkVDVDpcbiI7CiRyZXQgPSYgJGRiaC0+Z2V0QWxsKCdTRUxFQ1QgKiBGUk9NIHBocHRlc3QgV0hFUkUgY2MgPSA/IE9SIGNjID0gPyBPUkRFUiBCWSBjYycsCiAgICAgICAgYXJyYXkoJ1R3bycsICdUaHJlZScpLCBEQl9GRVRDSE1PREVfT0JKRUNUKTsKcHJpbnRfcigkcmV0KTsKCgpwcmludCAiXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiI7CnByaW50ICd0ZXN0aW5nIGdldE9uZSB3aXRoIG51bGwgdmFsdWUgaW4gY29sdW1uOiAnOwokZGJoLT5xdWVyeSgiSU5TRVJUIElOVE8gcGhwdGVzdCBWQUxVRVMgKDksICduaW5lJywgJycsIE5VTEwpIik7CiRyZXQgPSYgJGRiaC0+Z2V0T25lKCdTRUxFQ1QgZCBGUk9NIHBocHRlc3QgV0hFUkUgYSA9IDknKTsKaWYgKCRyZXQgPT09ICcnKSB7CiAgICBwcmludCAibWF0Y2hlcyBleHBlY3RlZCByZXN1bHRcbiI7Cn0gZWxzZSB7CiAgICBpZiAoJGRiaC0+cGhwdHlwZSA9PSAnbXNxbCcpIHsKICAgICAgICBpZiAoZ2V0dHlwZSgkcmV0KSA9PSAnTlVMTCcpIHsKICAgICAgICAgICAgLy8gbXNxbCBkb2Vzbid0IGV2ZW4gcmV0dXJuIHRoZSBjb2x1bW4uICBKb3khIDopCiAgICAgICAgICAgIC8vIGh0dHA6Ly9idWdzLnBocC5uZXQvP2lkPTMxOTYwCiAgICAgICAgICAgIHByaW50ICJtYXRjaGVzIGV4cGVjdGVkIHJlc3VsdFxuIjsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBwcmludCAiV09XLCBtU1FMIG5vdyByZXR1cm5zIGNvbHVtbnMgdGhhdCBoYXZlIE5VTExTIGluIHRoZW1cbiI7CiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICBwcmludCAndHlwZT0nIC4gZ2V0dHlwZSgkcmV0KSAuICIsIHZhbHVlPSRyZXRcbiI7CiAgICB9Cn0KCnByaW50ICd0ZXN0aW5nIGdldE9uZSB3aXRoIGVtcHR5IHN0cmluZyBpbiBjb2x1bW46ICc7CiRyZXQgPSYgJGRiaC0+Z2V0T25lKCdTRUxFQ1QgY2MgRlJPTSBwaHB0ZXN0IFdIRVJFIGEgPSA5Jyk7CmlmICgkcmV0ID09PSAnJykgewogICAgcHJpbnQgImVtcHR5IHN0cmluZ1xuIjsKfSBlbHNlIHsKICAgIHByaW50ICd0eXBlPScgLiBnZXR0eXBlKCRyZXQpIC4gIiwgdmFsdWU9JHJldFxuIjsKfQoKCnByaW50ICJcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIjsKCgpkcm9wX3RhYmxlKCRkYmgsICdwaHB0ZXN0Jyk7CgoKPz4KLS1FWFBFQ1QtLQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KdGVzdGluZyBnZXRPbmU6IDIKdGVzdGluZyBnZXRPbmUgd2l0aCBzdHJpbmcgcGFyYW1zOiA0Mgp0ZXN0aW5nIGdldE9uZSB3aXRoIGFycmF5IHBhcmFtczogMgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CnRlc3RpbmcgZ2V0Um93OgpBcnJheQooCiAgICBbMF0gPT4gMgogICAgWzFdID0+IHR3bwogICAgWzJdID0+IFR3bwogICAgWzNdID0+IDIwMDItMDItMjIKKQp0ZXN0aW5nIGdldFJvdyB3aXRoIG51bGwgcGFyYW1zLCBEQl9GRVRDSE1PREVfT1JERVJFRDoKQXJyYXkKKAogICAgWzBdID0+IDIKICAgIFsxXSA9PiB0d28KICAgIFsyXSA9PiBUd28KICAgIFszXSA9PiAyMDAyLTAyLTIyCikKdGVzdGluZyBnZXRSb3cgd2l0aCBSRVZFUlNFRCBhcmdzOiBEQl9GRVRDSE1PREVfQVNTT0MsIGFycmF5IHBhcmFtczoKQXJyYXkKKAogICAgW2FdID0+IDIKICAgIFtiXSA9PiB0d28KICAgIFtjY10gPT4gVHdvCiAgICBbZF0gPT4gMjAwMi0wMi0yMgopCnRlc3RpbmcgZ2V0Um93IHdpdGggUkVWRVJTRUQgYXJnczogREJfRkVUQ0hNT0RFX0FTU09DOgpBcnJheQooCiAgICBbYV0gPT4gMgogICAgW2JdID0+IHR3bwogICAgW2NjXSA9PiBUd28KICAgIFtkXSA9PiAyMDAyLTAyLTIyCikKdGVzdGluZyBnZXRSb3cgd2l0aCBhcnJheSBwYXJhbXMsIERCX0ZFVENITU9ERV9BU1NPQzoKQXJyYXkKKAogICAgW2FdID0+IDIKICAgIFtiXSA9PiB0d28KICAgIFtjY10gPT4gVHdvCiAgICBbZF0gPT4gMjAwMi0wMi0yMgopCnRlc3RpbmcgZ2V0Um93IHdpdGggYXJyYXkgcGFyYW1zLCBEQl9GRVRDSE1PREVfT0JKRUNUOgpzdGRDbGFzcyBPYmplY3QKKAogICAgW2FdID0+IDIKICAgIFtiXSA9PiB0d28KICAgIFtjY10gPT4gVHdvCiAgICBbZF0gPT4gMjAwMi0wMi0yMgopCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KdGVzdGluZyBnZXRDb2w6CkFycmF5CigKICAgIFswXSA9PiA0MgogICAgWzFdID0+IDQyCiAgICBbMl0gPT4gMgopCnRlc3RpbmcgZ2V0Q29sIG9uIHF1ZXJ5IHdpdGggbm8gcmVjb3JkczoKQXJyYXkKKAopCnRlc3RpbmcgZ2V0Q29sIHdpdGggaW52YWxpZCBjb2x1bW4gaWQ6CkRCIEVycm9yOiBubyBzdWNoIGZpZWxkCnRlc3RpbmcgZ2V0Q29sIHdpdGggMSBjb2w6CkFycmF5CigKICAgIFswXSA9PiBiaW5nCiAgICBbMV0gPT4gdGhyZWUKICAgIFsyXSA9PiB0d28KKQp0ZXN0aW5nIGdldENvbCB3aXRoIGIgY29sOgpBcnJheQooCiAgICBbMF0gPT4gYmluZwogICAgWzFdID0+IHRocmVlCiAgICBbMl0gPT4gdHdvCikKdGVzdGluZyBnZXRDb2wgd2l0aCBiIGNvbCwgc2NhbGFyIHBhcmFtczoKQXJyYXkKKAogICAgWzBdID0+IGJpbmcKICAgIFsxXSA9PiB0aHJlZQogICAgWzJdID0+IHR3bwopCnRlc3RpbmcgZ2V0Q29sIHdpdGggYiBjb2wsIGFycmF5IHBhcmFtczoKQXJyYXkKKAogICAgWzBdID0+IGJpbmcKICAgIFsxXSA9PiB0aHJlZQogICAgWzJdID0+IHR3bwopCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KdGVzdGluZyBnZXRBc3NvYzoKQXJyYXkKKAogICAgWzQyXSA9PiBBcnJheQogICAgICAgICgKICAgICAgICAgICAgWzBdID0+IHRocmVlCiAgICAgICAgICAgIFsxXSA9PiBUaHJlZQogICAgICAgICkKCiAgICBbMl0gPT4gQXJyYXkKICAgICAgICAoCiAgICAgICAgICAgIFswXSA9PiB0d28KICAgICAgICAgICAgWzFdID0+IFR3bwogICAgICAgICkKCikKdGVzdGluZyBnZXRBc3NvYyB3aXRoIGZhbHNlIGZvcmNlLCBudWxsIHBhcmFtcywgREJfRkVUQ0hNT0RFX09SREVSRUQ6CkFycmF5CigKICAgIFs0Ml0gPT4gQXJyYXkKICAgICAgICAoCiAgICAgICAgICAgIFswXSA9PiB0aHJlZQogICAgICAgICAgICBbMV0gPT4gVGhyZWUKICAgICAgICApCgogICAgWzJdID0+IEFycmF5CiAgICAgICAgKAogICAgICAgICAgICBbMF0gPT4gdHdvCiAgICAgICAgICAgIFsxXSA9PiBUd28KICAgICAgICApCgopCnRlc3RpbmcgZ2V0QXNzb2Mgd2l0aCBmYWxzZSBmb3JjZSwgc2NhbGFyIHBhcmFtcywgREJfRkVUQ0hNT0RFX0FTU09DOgpBcnJheQooCiAgICBbNDJdID0+IEFycmF5CiAgICAgICAgKAogICAgICAgICAgICBbYl0gPT4gdGhyZWUKICAgICAgICAgICAgW2NjXSA9PiBUaHJlZQogICAgICAgICkKCiAgICBbMl0gPT4gQXJyYXkKICAgICAgICAoCiAgICAgICAgICAgIFtiXSA9PiB0d28KICAgICAgICAgICAgW2NjXSA9PiBUd28KICAgICAgICApCgopCnRlc3RpbmcgZ2V0QXNzb2Mgd2l0aCB0d28gY29scywgZmFsc2UgZm9yY2UsIHNjYWxhciBwYXJhbXMsIERCX0ZFVENITU9ERV9BU1NPQzoKQXJyYXkKKAogICAgWzQyXSA9PiB0aHJlZQogICAgWzJdID0+IHR3bwopCnRlc3RpbmcgZ2V0QXNzb2Mgd2l0aCB0d28gY29scywgdHJ1ZSBmb3JjZSwgc2NhbGFyIHBhcmFtcywgREJfRkVUQ0hNT0RFX0FTU09DOgpBcnJheQooCiAgICBbNDJdID0+IEFycmF5CiAgICAgICAgKAogICAgICAgICAgICBbYl0gPT4gdGhyZWUKICAgICAgICApCgogICAgWzJdID0+IEFycmF5CiAgICAgICAgKAogICAgICAgICAgICBbYl0gPT4gdHdvCiAgICAgICAgKQoKKQp0ZXN0aW5nIGdldEFzc29jIHdpdGggZmFsc2UgZm9yY2UsIHNjYWxhciBwYXJhbXMsIERCX0ZFVENITU9ERV9BU1NPQywgdHJ1ZSBncm91cDoKQXJyYXkKKAogICAgWzQyXSA9PiBBcnJheQogICAgICAgICgKICAgICAgICAgICAgWzBdID0+IEFycmF5CiAgICAgICAgICAgICAgICAoCiAgICAgICAgICAgICAgICAgICAgW2JdID0+IGJpbmcKICAgICAgICAgICAgICAgICAgICBbY2NdID0+IFRoaXMgaXMgYSB0ZXN0CiAgICAgICAgICAgICAgICApCgogICAgICAgICAgICBbMV0gPT4gQXJyYXkKICAgICAgICAgICAgICAgICgKICAgICAgICAgICAgICAgICAgICBbYl0gPT4gdGhyZWUKICAgICAgICAgICAgICAgICAgICBbY2NdID0+IFRocmVlCiAgICAgICAgICAgICAgICApCgogICAgICAgICkKCiAgICBbMl0gPT4gQXJyYXkKICAgICAgICAoCiAgICAgICAgICAgIFswXSA9PiBBcnJheQogICAgICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgICAgIFtiXSA9PiB0d28KICAgICAgICAgICAgICAgICAgICBbY2NdID0+IFR3bwogICAgICAgICAgICAgICAgKQoKICAgICAgICApCgopCnRlc3RpbmcgZ2V0QXNzb2Mgd2l0aCBmYWxzZSBmb3JjZSwgYXJyYXkgcGFyYW1zLCBEQl9GRVRDSE1PREVfT0JKRUNUOgpBcnJheQooCiAgICBbNDJdID0+IHN0ZENsYXNzIE9iamVjdAogICAgICAgICgKICAgICAgICAgICAgW2FdID0+IDQyCiAgICAgICAgICAgIFtiXSA9PiB0aHJlZQogICAgICAgICAgICBbY2NdID0+IFRocmVlCiAgICAgICAgKQoKICAgIFsyXSA9PiBzdGRDbGFzcyBPYmplY3QKICAgICAgICAoCiAgICAgICAgICAgIFthXSA9PiAyCiAgICAgICAgICAgIFtiXSA9PiB0d28KICAgICAgICAgICAgW2NjXSA9PiBUd28KICAgICAgICApCgopCnRlc3RpbmcgZ2V0QXNzb2Mgd2l0aCB0cnVlIGZvcmNlLCBhcnJheSBwYXJhbXMsIERCX0ZFVENITU9ERV9PQkpFQ1QsIHRydWUgZ3JvdXA6CkFycmF5CigKICAgIFs0Ml0gPT4gQXJyYXkKICAgICAgICAoCiAgICAgICAgICAgIFswXSA9PiBzdGRDbGFzcyBPYmplY3QKICAgICAgICAgICAgICAgICgKICAgICAgICAgICAgICAgICAgICBbYV0gPT4gNDIKICAgICAgICAgICAgICAgICAgICBbYl0gPT4gYmluZwogICAgICAgICAgICAgICAgICAgIFtjY10gPT4gVGhpcyBpcyBhIHRlc3QKICAgICAgICAgICAgICAgICkKCiAgICAgICAgICAgIFsxXSA9PiBzdGRDbGFzcyBPYmplY3QKICAgICAgICAgICAgICAgICgKICAgICAgICAgICAgICAgICAgICBbYV0gPT4gNDIKICAgICAgICAgICAgICAgICAgICBbYl0gPT4gdGhyZWUKICAgICAgICAgICAgICAgICAgICBbY2NdID0+IFRocmVlCiAgICAgICAgICAgICAgICApCgogICAgICAgICkKCiAgICBbMl0gPT4gQXJyYXkKICAgICAgICAoCiAgICAgICAgICAgIFswXSA9PiBzdGRDbGFzcyBPYmplY3QKICAgICAgICAgICAgICAgICgKICAgICAgICAgICAgICAgICAgICBbYV0gPT4gMgogICAgICAgICAgICAgICAgICAgIFtiXSA9PiB0d28KICAgICAgICAgICAgICAgICAgICBbY2NdID0+IFR3bwogICAgICAgICAgICAgICAgKQoKICAgICAgICApCgopCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KdGVzdGluZyBnZXRBbGw6CkFycmF5CigKICAgIFswXSA9PiBBcnJheQogICAgICAgICgKICAgICAgICAgICAgWzBdID0+IDIKICAgICAgICAgICAgWzFdID0+IHR3bwogICAgICAgICAgICBbMl0gPT4gVHdvCiAgICAgICAgICAgIFszXSA9PiAyMDAyLTAyLTIyCiAgICAgICAgKQoKICAgIFsxXSA9PiBBcnJheQogICAgICAgICgKICAgICAgICAgICAgWzBdID0+IDQyCiAgICAgICAgICAgIFsxXSA9PiB0aHJlZQogICAgICAgICAgICBbMl0gPT4gVGhyZWUKICAgICAgICAgICAgWzNdID0+IDIwMDMtMDMtMjMKICAgICAgICApCgopCnRlc3RpbmcgZ2V0QWxsIHdpdGggbnVsbCBwYXJhbXMsIERCX0ZFVENITU9ERV9PUkRFUkVEOgpBcnJheQooCiAgICBbMF0gPT4gQXJyYXkKICAgICAgICAoCiAgICAgICAgICAgIFswXSA9PiAyCiAgICAgICAgICAgIFsxXSA9PiB0d28KICAgICAgICAgICAgWzJdID0+IFR3bwogICAgICAgICAgICBbM10gPT4gMjAwMi0wMi0yMgogICAgICAgICkKCiAgICBbMV0gPT4gQXJyYXkKICAgICAgICAoCiAgICAgICAgICAgIFswXSA9PiA0MgogICAgICAgICAgICBbMV0gPT4gdGhyZWUKICAgICAgICAgICAgWzJdID0+IFRocmVlCiAgICAgICAgICAgIFszXSA9PiAyMDAzLTAzLTIzCiAgICAgICAgKQoKKQp0ZXN0aW5nIGdldEFsbCB3aXRoIFJFVkVSU0VEIGFyZ3M6IERCX0ZFVENITU9ERV9BU1NPQywgYXJyYXkgcGFyYW1zOgpBcnJheQooCiAgICBbMF0gPT4gQXJyYXkKICAgICAgICAoCiAgICAgICAgICAgIFthXSA9PiA0MgogICAgICAgICAgICBbYl0gPT4gdGhyZWUKICAgICAgICAgICAgW2NjXSA9PiBUaHJlZQogICAgICAgICAgICBbZF0gPT4gMjAwMy0wMy0yMwogICAgICAgICkKCiAgICBbMV0gPT4gQXJyYXkKICAgICAgICAoCiAgICAgICAgICAgIFthXSA9PiAyCiAgICAgICAgICAgIFtiXSA9PiB0d28KICAgICAgICAgICAgW2NjXSA9PiBUd28KICAgICAgICAgICAgW2RdID0+IDIwMDItMDItMjIKICAgICAgICApCgopCnRlc3RpbmcgZ2V0QWxsIHdpdGggUkVWRVJTRUQgYXJnczogREJfRkVUQ0hNT0RFX0FTU09DOgpBcnJheQooCiAgICBbMF0gPT4gQXJyYXkKICAgICAgICAoCiAgICAgICAgICAgIFthXSA9PiAyCiAgICAgICAgICAgIFtiXSA9PiB0d28KICAgICAgICAgICAgW2NjXSA9PiBUd28KICAgICAgICAgICAgW2RdID0+IDIwMDItMDItMjIKICAgICAgICApCgogICAgWzFdID0+IEFycmF5CiAgICAgICAgKAogICAgICAgICAgICBbYV0gPT4gNDIKICAgICAgICAgICAgW2JdID0+IHRocmVlCiAgICAgICAgICAgIFtjY10gPT4gVGhyZWUKICAgICAgICAgICAgW2RdID0+IDIwMDMtMDMtMjMKICAgICAgICApCgopCnRlc3RpbmcgZ2V0QWxsIHdpdGggYXJyYXkgcGFyYW1zLCBEQl9GRVRDSE1PREVfQVNTT0M6CkFycmF5CigKICAgIFswXSA9PiBBcnJheQogICAgICAgICgKICAgICAgICAgICAgW2FdID0+IDQyCiAgICAgICAgICAgIFtiXSA9PiB0aHJlZQogICAgICAgICAgICBbY2NdID0+IFRocmVlCiAgICAgICAgICAgIFtkXSA9PiAyMDAzLTAzLTIzCiAgICAgICAgKQoKICAgIFsxXSA9PiBBcnJheQogICAgICAgICgKICAgICAgICAgICAgW2FdID0+IDIKICAgICAgICAgICAgW2JdID0+IHR3bwogICAgICAgICAgICBbY2NdID0+IFR3bwogICAgICAgICAgICBbZF0gPT4gMjAwMi0wMi0yMgogICAgICAgICkKCikKdGVzdGluZyBnZXRBbGwgd2l0aCBhcnJheSBwYXJhbXMsIERCX0ZFVENITU9ERV9PQkpFQ1Q6CkFycmF5CigKICAgIFswXSA9PiBzdGRDbGFzcyBPYmplY3QKICAgICAgICAoCiAgICAgICAgICAgIFthXSA9PiA0MgogICAgICAgICAgICBbYl0gPT4gdGhyZWUKICAgICAgICAgICAgW2NjXSA9PiBUaHJlZQogICAgICAgICAgICBbZF0gPT4gMjAwMy0wMy0yMwogICAgICAgICkKCiAgICBbMV0gPT4gc3RkQ2xhc3MgT2JqZWN0CiAgICAgICAgKAogICAgICAgICAgICBbYV0gPT4gMgogICAgICAgICAgICBbYl0gPT4gdHdvCiAgICAgICAgICAgIFtjY10gPT4gVHdvCiAgICAgICAgICAgIFtkXSA9PiAyMDAyLTAyLTIyCiAgICAgICAgKQoKKQoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CnRlc3RpbmcgZ2V0T25lIHdpdGggbnVsbCB2YWx1ZSBpbiBjb2x1bW46IG1hdGNoZXMgZXhwZWN0ZWQgcmVzdWx0CnRlc3RpbmcgZ2V0T25lIHdpdGggZW1wdHkgc3RyaW5nIGluIGNvbHVtbjogZW1wdHkgc3RyaW5nCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K]]></data>
	</file>
	<file>
	  <filename>/lib/pear/tests/driver/19getlistof.phpt</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LS1URVNULS0KREJfZHJpdmVyOjpnZXRMaXN0T2YKLS1JTkktLQplcnJvcl9yZXBvcnRpbmcgPSAyMDQ3Ci0tU0tJUElGLS0KPD9waHAgY2hkaXIoZGlybmFtZShfX0ZJTEVfXykpOyByZXF1aXJlX29uY2UgJy4vc2tpcGlmLmluYyc7ID8+Ci0tRklMRS0tCjw/cGhwCgpyZXF1aXJlX29uY2UgJy4vbWt0YWJsZS5pbmMnOwoKLyoKICogQW4gYXJyYXkgd2l0aCBrZXlzIGNvbnRhaW5pbmcgdGhlICR0eXBlIHRvIGJlIHBhc3NlZCB0byB0aGUgZ2V0TGlzdE9mKCkKICogbWV0aG9kLiAgVGhlIHZhbHVlcyBvZiB0aGUgbWFpbiBhcnJheSBhcmUgYSBzdWItYXJyYXkgdGhhdCBoYXMga2V5cwogKiBsaXN0aW5nIHRoZSBwaHB0eXBlIGFuZCBkYnN5bnRheCBvZiBlYWNoIGRyaXZlciBhbmQgdmFsdWVzIG9mIHRoZQogKiByZXN1bHQgZXhwZWN0ZWQgZnJvbSB0aGUgY29tYmluYXRpb24gb2YgYWxsIHRoZXNlIGZhY3RvcnMuCiAqLwokdGVzdHMgPSBhcnJheSgKICAgICd0YWJsZXMnID0+IGFycmF5KAogICAgICAgICdkYmFzZTpkYmFzZScgPT4gREJfRVJST1JfVU5TVVBQT1JURUQsCiAgICAgICAgJ2Zic3FsOmZic3FsJyA9PiAnYXJyYXknLAogICAgICAgICdpYmFzZTppYmFzZScgPT4gJ2FycmF5JywKICAgICAgICAnaWJhc2U6ZmlyZWJpcmQnID0+ICdhcnJheScsCiAgICAgICAgJ2lmeDppZngnID0+ICdhcnJheScsCiAgICAgICAgJ21zcWw6bXNxbCcgPT4gJ2FycmF5JywKICAgICAgICAnbXNzcWw6bXNzcWwnID0+ICdhcnJheScsCiAgICAgICAgJ215c3FsOm15c3FsJyA9PiAnYXJyYXknLAogICAgICAgICdteXNxbGk6bXlzcWxpJyA9PiAnYXJyYXknLAogICAgICAgICdvY2k4Om9jaTgnID0+ICdhcnJheScsCiAgICAgICAgJ29kYmM6YWNjZXNzJyA9PiAnYXJyYXknLAogICAgICAgICdvZGJjOmRiMicgPT4gJ2FycmF5JywKICAgICAgICAncGdzcWw6cGdzcWwnID0+ICdhcnJheScsCiAgICAgICAgJ3NxbGl0ZTpzcWxpdGUnID0+ICdhcnJheScsCiAgICAgICAgJ3N5YmFzZTpzeWJhc2UnID0+ICdhcnJheScsCiAgICApLAogICAgJ3ZpZXdzJyA9PiBhcnJheSgKICAgICAgICAnZGJhc2U6ZGJhc2UnID0+IERCX0VSUk9SX1VOU1VQUE9SVEVELAogICAgICAgICdmYnNxbDpmYnNxbCcgPT4gJ2FycmF5JywKICAgICAgICAnaWJhc2U6aWJhc2UnID0+ICdhcnJheScsCiAgICAgICAgJ2liYXNlOmZpcmViaXJkJyA9PiAnYXJyYXknLAogICAgICAgICdpZng6aWZ4JyA9PiBEQl9FUlJPUl9VTlNVUFBPUlRFRCwKICAgICAgICAnbXNxbDptc3FsJyA9PiBEQl9FUlJPUl9VTlNVUFBPUlRFRCwKICAgICAgICAnbXNzcWw6bXNzcWwnID0+ICdhcnJheScsCiAgICAgICAgJ215c3FsOm15c3FsJyA9PiBEQl9FUlJPUl9VTlNVUFBPUlRFRCwKICAgICAgICAnbXlzcWxpOm15c3FsaScgPT4gREJfRVJST1JfVU5TVVBQT1JURUQsCiAgICAgICAgJ29jaTg6b2NpOCcgPT4gJ2FycmF5JywKICAgICAgICAnb2RiYzphY2Nlc3MnID0+ICdhcnJheScsCiAgICAgICAgJ29kYmM6ZGIyJyA9PiAnYXJyYXknLAogICAgICAgICdwZ3NxbDpwZ3NxbCcgPT4gJ2FycmF5JywKICAgICAgICAnc3FsaXRlOnNxbGl0ZScgPT4gREJfRVJST1JfVU5TVVBQT1JURUQsCiAgICAgICAgJ3N5YmFzZTpzeWJhc2UnID0+ICdhcnJheScsCiAgICApLAogICAgJ3VzZXJzJyA9PiBhcnJheSgKICAgICAgICAnZGJhc2U6ZGJhc2UnID0+IERCX0VSUk9SX1VOU1VQUE9SVEVELAogICAgICAgICdmYnNxbDpmYnNxbCcgPT4gJ2FycmF5JywKICAgICAgICAnaWJhc2U6aWJhc2UnID0+ICdhcnJheScsCiAgICAgICAgJ2liYXNlOmZpcmViaXJkJyA9PiAnYXJyYXknLAogICAgICAgICdpZng6aWZ4JyA9PiBEQl9FUlJPUl9VTlNVUFBPUlRFRCwKICAgICAgICAnbXNxbDptc3FsJyA9PiBEQl9FUlJPUl9VTlNVUFBPUlRFRCwKICAgICAgICAnbXNzcWw6bXNzcWwnID0+IERCX0VSUk9SX1VOU1VQUE9SVEVELAogICAgICAgICdteXNxbDpteXNxbCcgPT4gREJfRVJST1JfQUNDRVNTX1ZJT0xBVElPTiwKICAgICAgICAnbXlzcWxpOm15c3FsaScgPT4gREJfRVJST1JfQUNDRVNTX1ZJT0xBVElPTiwKICAgICAgICAnb2NpODpvY2k4JyA9PiBEQl9FUlJPUl9VTlNVUFBPUlRFRCwKICAgICAgICAnb2RiYzphY2Nlc3MnID0+IERCX0VSUk9SX1VOU1VQUE9SVEVELAogICAgICAgICdvZGJjOmRiMicgPT4gREJfRVJST1JfVU5TVVBQT1JURUQsCiAgICAgICAgJ3Bnc3FsOnBnc3FsJyA9PiAnYXJyYXknLAogICAgICAgICdzcWxpdGU6c3FsaXRlJyA9PiBEQl9FUlJPUl9VTlNVUFBPUlRFRCwKICAgICAgICAnc3liYXNlOnN5YmFzZScgPT4gREJfRVJST1JfVU5TVVBQT1JURUQsCiAgICApLAogICAgJ2RhdGFiYXNlcycgPT4gYXJyYXkoCiAgICAgICAgJ2RiYXNlOmRiYXNlJyA9PiBEQl9FUlJPUl9VTlNVUFBPUlRFRCwKICAgICAgICAnZmJzcWw6ZmJzcWwnID0+IERCX0VSUk9SX1VOU1VQUE9SVEVELAogICAgICAgICdpYmFzZTppYmFzZScgPT4gREJfRVJST1JfVU5TVVBQT1JURUQsCiAgICAgICAgJ2liYXNlOmZpcmViaXJkJyA9PiBEQl9FUlJPUl9VTlNVUFBPUlRFRCwKICAgICAgICAnaWZ4OmlmeCcgPT4gREJfRVJST1JfVU5TVVBQT1JURUQsCiAgICAgICAgJ21zcWw6bXNxbCcgPT4gJ2FycmF5JywKICAgICAgICAnbXNzcWw6bXNzcWwnID0+IERCX0VSUk9SX1VOU1VQUE9SVEVELAogICAgICAgICdteXNxbDpteXNxbCcgPT4gJ2FycmF5JywKICAgICAgICAnbXlzcWxpOm15c3FsaScgPT4gJ2FycmF5JywKICAgICAgICAnb2NpODpvY2k4JyA9PiBEQl9FUlJPUl9VTlNVUFBPUlRFRCwKICAgICAgICAnb2RiYzphY2Nlc3MnID0+ICdhcnJheScsCiAgICAgICAgJ29kYmM6ZGIyJyA9PiAnYXJyYXknLAogICAgICAgICdwZ3NxbDpwZ3NxbCcgPT4gJ2FycmF5JywKICAgICAgICAnc3FsaXRlOnNxbGl0ZScgPT4gREJfRVJST1JfVU5TVVBQT1JURUQsCiAgICAgICAgJ3N5YmFzZTpzeWJhc2UnID0+IERCX0VSUk9SX1VOU1VQUE9SVEVELAogICAgKSwKICAgICdmdW5jdGlvbnMnID0+IGFycmF5KAogICAgICAgICdkYmFzZTpkYmFzZScgPT4gREJfRVJST1JfVU5TVVBQT1JURUQsCiAgICAgICAgJ2Zic3FsOmZic3FsJyA9PiAnYXJyYXknLAogICAgICAgICdpYmFzZTppYmFzZScgPT4gREJfRVJST1JfVU5TVVBQT1JURUQsCiAgICAgICAgJ2liYXNlOmZpcmViaXJkJyA9PiBEQl9FUlJPUl9VTlNVUFBPUlRFRCwKICAgICAgICAnaWZ4OmlmeCcgPT4gREJfRVJST1JfVU5TVVBQT1JURUQsCiAgICAgICAgJ21zcWw6bXNxbCcgPT4gREJfRVJST1JfVU5TVVBQT1JURUQsCiAgICAgICAgJ21zc3FsOm1zc3FsJyA9PiBEQl9FUlJPUl9VTlNVUFBPUlRFRCwKICAgICAgICAnbXlzcWw6bXlzcWwnID0+IERCX0VSUk9SX1VOU1VQUE9SVEVELAogICAgICAgICdteXNxbGk6bXlzcWxpJyA9PiBEQl9FUlJPUl9VTlNVUFBPUlRFRCwKICAgICAgICAnb2NpODpvY2k4JyA9PiBEQl9FUlJPUl9VTlNVUFBPUlRFRCwKICAgICAgICAnb2RiYzphY2Nlc3MnID0+IERCX0VSUk9SX1VOU1VQUE9SVEVELAogICAgICAgICdvZGJjOmRiMicgPT4gREJfRVJST1JfVU5TVVBQT1JURUQsCiAgICAgICAgJ3Bnc3FsOnBnc3FsJyA9PiAnYXJyYXknLAogICAgICAgICdzcWxpdGU6c3FsaXRlJyA9PiBEQl9FUlJPUl9VTlNVUFBPUlRFRCwKICAgICAgICAnc3liYXNlOnN5YmFzZScgPT4gREJfRVJST1JfVU5TVVBQT1JURUQsCiAgICApLAogICAgJ3Byb2NlZHVyZXMnID0+IGFycmF5KAogICAgICAgICdkYmFzZTpkYmFzZScgPT4gREJfRVJST1JfVU5TVVBQT1JURUQsCiAgICAgICAgJ2Zic3FsOmZic3FsJyA9PiAnYXJyYXknLAogICAgICAgICdpYmFzZTppYmFzZScgPT4gREJfRVJST1JfVU5TVVBQT1JURUQsCiAgICAgICAgJ2liYXNlOmZpcmViaXJkJyA9PiBEQl9FUlJPUl9VTlNVUFBPUlRFRCwKICAgICAgICAnaWZ4OmlmeCcgPT4gREJfRVJST1JfVU5TVVBQT1JURUQsCiAgICAgICAgJ21zcWw6bXNxbCcgPT4gREJfRVJST1JfVU5TVVBQT1JURUQsCiAgICAgICAgJ21zc3FsOm1zc3FsJyA9PiBEQl9FUlJPUl9VTlNVUFBPUlRFRCwKICAgICAgICAnbXlzcWw6bXlzcWwnID0+IERCX0VSUk9SX1VOU1VQUE9SVEVELAogICAgICAgICdteXNxbGk6bXlzcWxpJyA9PiBEQl9FUlJPUl9VTlNVUFBPUlRFRCwKICAgICAgICAnb2NpODpvY2k4JyA9PiBEQl9FUlJPUl9VTlNVUFBPUlRFRCwKICAgICAgICAnb2RiYzphY2Nlc3MnID0+IERCX0VSUk9SX1VOU1VQUE9SVEVELAogICAgICAgICdvZGJjOmRiMicgPT4gREJfRVJST1JfVU5TVVBQT1JURUQsCiAgICAgICAgJ3Bnc3FsOnBnc3FsJyA9PiAnYXJyYXknLAogICAgICAgICdzcWxpdGU6c3FsaXRlJyA9PiBEQl9FUlJPUl9VTlNVUFBPUlRFRCwKICAgICAgICAnc3liYXNlOnN5YmFzZScgPT4gREJfRVJST1JfVU5TVVBQT1JURUQsCiAgICApLAogICAgJ3NjaGVtYS50YWJsZXMnID0+IGFycmF5KAogICAgICAgICdkYmFzZTpkYmFzZScgPT4gREJfRVJST1JfVU5TVVBQT1JURUQsCiAgICAgICAgJ2Zic3FsOmZic3FsJyA9PiBEQl9FUlJPUl9VTlNVUFBPUlRFRCwKICAgICAgICAnaWJhc2U6aWJhc2UnID0+IERCX0VSUk9SX1VOU1VQUE9SVEVELAogICAgICAgICdpYmFzZTpmaXJlYmlyZCcgPT4gREJfRVJST1JfVU5TVVBQT1JURUQsCiAgICAgICAgJ2lmeDppZngnID0+IERCX0VSUk9SX1VOU1VQUE9SVEVELAogICAgICAgICdtc3FsOm1zcWwnID0+IERCX0VSUk9SX1VOU1VQUE9SVEVELAogICAgICAgICdtc3NxbDptc3NxbCcgPT4gREJfRVJST1JfVU5TVVBQT1JURUQsCiAgICAgICAgJ215c3FsOm15c3FsJyA9PiBEQl9FUlJPUl9VTlNVUFBPUlRFRCwKICAgICAgICAnbXlzcWxpOm15c3FsaScgPT4gREJfRVJST1JfVU5TVVBQT1JURUQsCiAgICAgICAgJ29jaTg6b2NpOCcgPT4gREJfRVJST1JfVU5TVVBQT1JURUQsCiAgICAgICAgJ29kYmM6YWNjZXNzJyA9PiAnYXJyYXknLAogICAgICAgICdvZGJjOmRiMicgPT4gJ2FycmF5JywKICAgICAgICAncGdzcWw6cGdzcWwnID0+ICdhcnJheScsCiAgICAgICAgJ3NxbGl0ZTpzcWxpdGUnID0+IERCX0VSUk9SX1VOU1VQUE9SVEVELAogICAgICAgICdzeWJhc2U6c3liYXNlJyA9PiBEQl9FUlJPUl9VTlNVUFBPUlRFRCwKICAgICksCiAgICAnc2NoZW1hLnZpZXdzJyA9PiBhcnJheSgKICAgICAgICAnZGJhc2U6ZGJhc2UnID0+IERCX0VSUk9SX1VOU1VQUE9SVEVELAogICAgICAgICdmYnNxbDpmYnNxbCcgPT4gREJfRVJST1JfVU5TVVBQT1JURUQsCiAgICAgICAgJ2liYXNlOmliYXNlJyA9PiBEQl9FUlJPUl9VTlNVUFBPUlRFRCwKICAgICAgICAnaWJhc2U6ZmlyZWJpcmQnID0+IERCX0VSUk9SX1VOU1VQUE9SVEVELAogICAgICAgICdpZng6aWZ4JyA9PiBEQl9FUlJPUl9VTlNVUFBPUlRFRCwKICAgICAgICAnbXNxbDptc3FsJyA9PiBEQl9FUlJPUl9VTlNVUFBPUlRFRCwKICAgICAgICAnbXNzcWw6bXNzcWwnID0+IERCX0VSUk9SX1VOU1VQUE9SVEVELAogICAgICAgICdteXNxbDpteXNxbCcgPT4gREJfRVJST1JfVU5TVVBQT1JURUQsCiAgICAgICAgJ215c3FsaTpteXNxbGknID0+IERCX0VSUk9SX1VOU1VQUE9SVEVELAogICAgICAgICdvY2k4Om9jaTgnID0+IERCX0VSUk9SX1VOU1VQUE9SVEVELAogICAgICAgICdvZGJjOmFjY2VzcycgPT4gREJfRVJST1JfVU5TVVBQT1JURUQsCiAgICAgICAgJ29kYmM6ZGIyJyA9PiBEQl9FUlJPUl9VTlNVUFBPUlRFRCwKICAgICAgICAncGdzcWw6cGdzcWwnID0+ICdhcnJheScsCiAgICAgICAgJ3NxbGl0ZTpzcWxpdGUnID0+IERCX0VSUk9SX1VOU1VQUE9SVEVELAogICAgICAgICdzeWJhc2U6c3liYXNlJyA9PiBEQl9FUlJPUl9VTlNVUFBPUlRFRCwKICAgICksCiAgICAnc3lub255bXMnID0+IGFycmF5KAogICAgICAgICdkYmFzZTpkYmFzZScgPT4gREJfRVJST1JfVU5TVVBQT1JURUQsCiAgICAgICAgJ2Zic3FsOmZic3FsJyA9PiBEQl9FUlJPUl9VTlNVUFBPUlRFRCwKICAgICAgICAnaWJhc2U6aWJhc2UnID0+IERCX0VSUk9SX1VOU1VQUE9SVEVELAogICAgICAgICdpYmFzZTpmaXJlYmlyZCcgPT4gREJfRVJST1JfVU5TVVBQT1JURUQsCiAgICAgICAgJ2lmeDppZngnID0+IERCX0VSUk9SX1VOU1VQUE9SVEVELAogICAgICAgICdtc3FsOm1zcWwnID0+IERCX0VSUk9SX1VOU1VQUE9SVEVELAogICAgICAgICdtc3NxbDptc3NxbCcgPT4gREJfRVJST1JfVU5TVVBQT1JURUQsCiAgICAgICAgJ215c3FsOm15c3FsJyA9PiBEQl9FUlJPUl9VTlNVUFBPUlRFRCwKICAgICAgICAnbXlzcWxpOm15c3FsaScgPT4gREJfRVJST1JfVU5TVVBQT1JURUQsCiAgICAgICAgJ29jaTg6b2NpOCcgPT4gJ2FycmF5JywKICAgICAgICAnb2RiYzphY2Nlc3MnID0+IERCX0VSUk9SX1VOU1VQUE9SVEVELAogICAgICAgICdvZGJjOmRiMicgPT4gREJfRVJST1JfVU5TVVBQT1JURUQsCiAgICAgICAgJ3Bnc3FsOnBnc3FsJyA9PiBEQl9FUlJPUl9VTlNVUFBPUlRFRCwKICAgICAgICAnc3FsaXRlOnNxbGl0ZScgPT4gREJfRVJST1JfVU5TVVBQT1JURUQsCiAgICAgICAgJ3N5YmFzZTpzeWJhc2UnID0+IERCX0VSUk9SX1VOU1VQUE9SVEVELAogICAgKSwKKTsKCi8qKgogKiBEZXRlcm1pbmUgaWYgdGhlIG91dHB1dCBmcm9tIHRoZSBkcml2ZXIgbWF0Y2hlcyB3aGF0IHdlIGV4cGVjdAogKgogKiBJZiB0aGluZ3MgYXJlIGFzIHdlIGV4cGVjdCwgbm90aGluZyBpcyBwcmludGVkIG91dC4KICoKICogSWYgdGhpbmdzIGdvIHdyb25nLCBwcmludCAiVU5FWFBFQ1RFRCBPVVRDT01FIiBhbmQgZGlzcGxheQogKiB3aGF0IGhhcHBlbmVkLgogKgogKiBAcGFyYW0gbWl4ZWQgICRyZXN1bHQgICAgdGhlIHJlc3VsdCBmcm9tIGdldExpc3RPZgogKiBAcGFyYW0gbWl4ZWQgICRleHBlY3RlZCAgdGhlIGV4cGVjdGVkIHJlc3VsdAogKiBAcGFyYW0gc3RyaW5nICRuYW1lICAgICAgdGhlIG5hbWUgb2YgdGhlIGN1cnJlbnQgdGVzdAogKgogKiBAcmV0dXJuIHZvaWQKICovCmZ1bmN0aW9uIGNoZWNrX291dHB1dCgkcmVzdWx0LCAkZXhwZWN0ZWQsICRuYW1lKSB7CiAgICBpZiAoaXNfb2JqZWN0KCRyZXN1bHQpKSB7CiAgICAgICAgaWYgKCRyZXN1bHQtPmdldENvZGUoKSAhPT0gJGV4cGVjdGVkKSB7CiAgICAgICAgICAgIGVjaG8gIlVORVhQRUNURUQgT1VUQ09NRSBGT1IgJG5hbWUuLi5cbiI7CiAgICAgICAgICAgIGVjaG8gJHJlc3VsdC0+Z2V0RGVidWdJbmZvKCkgLiAiXG4iOwogICAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgICAgJHR5cGUgPSBnZXR0eXBlKCRyZXN1bHQpOwogICAgICAgIGlmICgkdHlwZSAhPSAkZXhwZWN0ZWQpIHsKICAgICAgICAgICAgaWYgKCRleHBlY3RlZCA9PT0gREJfRVJST1JfQUNDRVNTX1ZJT0xBVElPTgogICAgICAgICAgICAgICAgJiYgJHR5cGUgPT0gJ2FycmF5JykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gVGhpcyB1c2VyIGhhcyBhY2Nlc3MgdG8gdGhlIG15c3FsIHRhYmxlLgogICAgICAgICAgICAgICAgLy8gTm90IGEgcHJvYmxlbQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgZWNobyAiVU5FWFBFQ1RFRCBPVVRDT01FIEZPUiAkbmFtZS4uLlxuIjsKICAgICAgICAgICAgICAgIGVjaG8gIiAgRXhwZWN0ZWQ6ICRleHBlY3RlZFxuIjsKICAgICAgICAgICAgICAgIGVjaG8gJyAgUmVzdWx0OiAnOwogICAgICAgICAgICAgICAgcHJpbnRfcigkcmVzdWx0KTsKICAgICAgICAgICAgICAgIGVjaG8gIlxuIjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KfQoKCiRkYmgtPnNldEVycm9ySGFuZGxpbmcoUEVBUl9FUlJPUl9SRVRVUk4pOwpmb3JlYWNoICgkdGVzdHMgYXMgJHRlc3QgPT4gJGRibXMpIHsKICAgIGNoZWNrX291dHB1dCgkZGJoLT5nZXRMaXN0T2YoJHRlc3QpLAogICAgICAgICAgICAgICAgICRkYm1zWyRkYmgtPnBocHR5cGUgLiAnOicgLiAkZGJoLT5kYnN5bnRheF0sCiAgICAgICAgICAgICAgICAgJHRlc3QpOwp9CgoKZHJvcF90YWJsZSgkZGJoLCAncGhwdGVzdCcpOwoKPz4KLS1FWFBFQ1QtLQo=]]></data>
	</file>
	<file>
	  <filename>/lib/pear/tests/driver/20locale.phpt</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LS1URVNULS0KREJfZHJpdmVyOjpsb2NhbGUKLS1JTkktLQplcnJvcl9yZXBvcnRpbmcgPSAyMDQ3Ci0tU0tJUElGLS0KPD9waHBpCmNoZGlyKGRpcm5hbWUoX19GSUxFX18pKTsgcmVxdWlyZV9vbmNlICcuL3NraXBpZi5pbmMnOwppZiAoIWZ1bmN0aW9uX2V4aXN0cygnc2V0bG9jYWxlJykpIHsKICAgIGRpZSgnc2tpcCBzZXRsb2NhbGUgaXMgbm90IGRlZmluZWQnKTsKfQppZiAoIU9TX1VOSVgpIHsKICAgIGRpZSgnc2tpcCBub3Qgb24gYSBVTklYLWxpa2UgcGxhdGZvcm0nKTsKfQo/PgotLUZJTEUtLQo8P3BocApyZXF1aXJlX29uY2UgJy4vbWt0YWJsZS5pbmMnOwoKaWYgKCRkYmgtPnBocHR5cGUgPT0gJ29kYmMnKSB7CiAgICBpZiAoJGRiaC0+ZGJzeW50YXggPT0gJ29kYmMnKSB7CiAgICAgICAgJHR5cGUgPSAkZGJoLT5waHB0eXBlOwogICAgfSBlbHNlIHsKICAgICAgICAkdHlwZSA9ICRkYmgtPmRic3ludGF4OwogICAgfQp9IGVsc2UgewogICAgJHR5cGUgPSAkZGJoLT5waHB0eXBlOwp9Cgpzd2l0Y2ggKCR0eXBlKSB7CiAgICBjYXNlICdhY2Nlc3MnOgogICAgICAgICRkZWNpbWFsID0gJ1NJTkdMRSc7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlICdkYjInOgogICAgY2FzZSAnaWJhc2UnOgogICAgICAgICRkZWNpbWFsID0gJ0RFQ0lNQUwoMywxKSc7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlICdpZngnOgogICAgICAgIC8vIGRvaW5nIHRoaXMgZm9yIGlmeCB0byBrZWVwIGNlcnRhaW4gdmVyc2lvbnMgaGFwcHkKICAgICAgICAkZGVjaW1hbCA9ICdERUNJTUFMKDMsMSknOwogICAgICAgIGJyZWFrOwogICAgY2FzZSAnbXNxbCc6CiAgICAgICAgJGRlY2ltYWwgPSAnUkVBTCc7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlICdmYnNxbCc6CiAgICBjYXNlICdvY2k4JzoKICAgICAgICAkZGVjaW1hbCA9ICdERUNJTUFMKDMsMSknOwogICAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgICAkZGVjaW1hbCA9ICdERUNJTUFMKDMsMSknOwp9CgokZGJoLT5zZXRFcnJvckhhbmRsaW5nKFBFQVJfRVJST1JfUkVUVVJOKTsKZHJvcF90YWJsZSgkZGJoLCAnbG9jYWxldGVzdCcpOwoKJHJlcyA9ICRkYmgtPnF1ZXJ5KCJDUkVBVEUgVEFCTEUgbG9jYWxldGVzdCAoYSAkZGVjaW1hbCkiKTsKaWYgKERCOjppc0Vycm9yKCRyZXMpKSB7CiAgICBlY2hvICdVbmFibGUgdG8gY3JlYXRlIHRhYmxlOiAnLiRyZXMtPmdldE1lc3NhZ2UoKS4iXG4iOwp9CgpzZXRsb2NhbGUoTENfTlVNRVJJQywgJ2RlX0RFJyk7CgokcmVzID0gJGRiaC0+cXVlcnkoJ0lOU0VSVCBJTlRPIGxvY2FsZXRlc3QgKGEpIFZBTFVFUyAoPyknLCBhcnJheSg0Mi4yKSk7CmlmIChEQjo6aXNFcnJvcigkcmVzKSkgewogICAgZWNobyAnRXJyb3IgaW5zZXJ0aW5nIHJlY29yZDogJy4kcmVzLT5nZXRNZXNzYWdlKCkuIlxuIjsKICAgIHZhcl9kdW1wKCRyZXMpOwp9CgpzZXRsb2NhbGUoTENfTlVNRVJJQywgJ2VuX0FVJyk7CgokcmVzID0gJGRiaC0+cXVlcnkoJ0lOU0VSVCBJTlRPIGxvY2FsZXRlc3QgKGEpIFZBTFVFUyAoPyknLCBhcnJheSg0Mi4yKSk7CmlmIChEQjo6aXNFcnJvcigkcmVzKSkgewogICAgZWNobyAnRXJyb3IgaW5zZXJ0aW5nIHJlY29yZDogJy4kcmVzLT5nZXRNZXNzYWdlKCkuIlxuIjsKICAgIHZhcl9kdW1wKCRyZXMpOwp9CgokcmVzID0gJGRiaC0+cXVlcnkoJ1NFTEVDVCAqIEZST00gbG9jYWxldGVzdCcpOwppZiAoREI6OmlzRXJyb3IoJHJlcykpIHsKICAgIGVjaG8gJ0Vycm9yIHJldHJpZXZpbmcgY291bnQ6ICcuJHJlcy0+Z2V0TWVzc2FnZSgpLiJcbiI7CiAgICB2YXJfZHVtcCgkcmVzKTsKfSBlbHNlIHsKICAgIGVjaG8gJ0dvdCAnLiRyZXMtPm51bVJvd3MoKS4iIHJlY29yZHMuXG4iOwp9Cgpkcm9wX3RhYmxlKCRkYmgsICdsb2NhbGV0ZXN0Jyk7Cgo/PgotLUVYUEVDVC0tCkdvdCAyIHJlY29yZHMuCg==]]></data>
	</file>
	<file>
	  <filename>/lib/pear/tests/driver/21freeResult.phpt</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LS1URVNULS0KREJfZHJpdmVyOjpmcmVlUmVzdWx0Ci0tSU5JLS0KZXJyb3JfcmVwb3J0aW5nID0gMjA0NwotLVNLSVBJRi0tCjw/cGhwCmNoZGlyKGRpcm5hbWUoX19GSUxFX18pKTsgcmVxdWlyZV9vbmNlICcuL3NraXBpZi5pbmMnOwppZiAoJGRiaC0+cGhwdHlwZSA9PSAnbXlzcWxpJykgZGllICgnc2tpcCBteXNxbGkgcmV0dXJucyByZXN1bHQgb2JqZWN0cyByYXRoZXIgdGhhbiByZXNvdXJjZXMnKTsKPz4KLS1GSUxFLS0KPD9waHAKcmVxdWlyZV9vbmNlICcuL21rdGFibGUuaW5jJzsKCiRyZXMgPSAkZGJoLT5xdWVyeSgnU0VMRUNUICogRlJPTSBwaHB0ZXN0Jyk7CgppZiAoREI6OmlzRXJyb3IoJHJlcykpIHsKICAgIGVjaG8gIlJlc3VsdCBpcyBhIERCX0Vycm9yLlxuIjsKfQoKaWYgKGlzX3Jlc291cmNlKCRyZXMtPnJlc3VsdCkpIHsKICAgIGVjaG8gIlJlc3VsdCBpbmNsdWRlcyByZXNvdXJjZS5cbiI7Cn0gZWxzZSB7CiAgICBlY2hvICJSZXN1bHQgZG9lcyBub3QgaW5jbHVkZSBhIHJlc291cmNlIVxuIjsKICAgIHByaW50X3IoJHJlcy0+cmVzdWx0KTsKfQoKaWYgKCRkYmgtPmZyZWVSZXN1bHQoJHJlcy0+cmVzdWx0KSkgewogICAgZWNobyAiUmVzb3VyY2Ugd2FzIGZyZWVkIHN1Y2Nlc3NmdWxseS5cbiI7Cn0gZWxzZSB7CiAgICBlY2hvICJFcnJvciBmcmVlaW5nIHJlc3VsdC5cbiI7Cn0KCmRyb3BfdGFibGUoJGRiaCwgJ3BocHRlc3QnKTsKPz4KLS1FWFBFQ1QtLQpSZXN1bHQgaW5jbHVkZXMgcmVzb3VyY2UuClJlc291cmNlIHdhcyBmcmVlZCBzdWNjZXNzZnVsbHkuCg==]]></data>
	</file>
	<file>
	  <filename>/lib/pear/tests/driver/connect.inc</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBDb25uZWN0cyB0byB0aGUgZGF0YWJhc2UKICoKICogUEhQIHZlcnNpb25zIDQgYW5kIDUKICoKICogTElDRU5TRTogVGhpcyBzb3VyY2UgZmlsZSBpcyBzdWJqZWN0IHRvIHZlcnNpb24gMy4wIG9mIHRoZSBQSFAgbGljZW5zZQogKiB0aGF0IGlzIGF2YWlsYWJsZSB0aHJvdWdoIHRoZSB3b3JsZC13aWRlLXdlYiBhdCB0aGUgZm9sbG93aW5nIFVSSToKICogaHR0cDovL3d3dy5waHAubmV0L2xpY2Vuc2UvM18wLnR4dC4gIElmIHlvdSBkaWQgbm90IHJlY2VpdmUgYSBjb3B5IG9mCiAqIHRoZSBQSFAgTGljZW5zZSBhbmQgYXJlIHVuYWJsZSB0byBvYnRhaW4gaXQgdGhyb3VnaCB0aGUgd2ViLCBwbGVhc2UKICogc2VuZCBhIG5vdGUgdG8gbGljZW5zZUBwaHAubmV0IHNvIHdlIGNhbiBtYWlsIHlvdSBhIGNvcHkgaW1tZWRpYXRlbHkuCiAqCiAqIEBjYXRlZ29yeSAgIERhdGFiYXNlCiAqIEBwYWNrYWdlICAgIERCCiAqIEBhdXRob3IgICAgIERhbmllbCBDb252aXNzb3IgPGRhbmllbGNAcGhwLm5ldD4KICogQGNvcHlyaWdodCAgMTk5Ny0yMDA1IFRoZSBQSFAgR3JvdXAKICogQGxpY2Vuc2UgICAgaHR0cDovL3d3dy5waHAubmV0L2xpY2Vuc2UvM18wLnR4dCAgUEhQIExpY2Vuc2UgMy4wCiAqIEB2ZXJzaW9uICAgICRJZDogY29ubmVjdC5pbmMsdiAxLjEyIDIwMDUvMDIvMDIgMDA6NDA6MjMgZGFuaWVsYyBFeHAgJAogKiBAbGluayAgICAgICBodHRwOi8vcGVhci5waHAubmV0L3BhY2thZ2UvREIKICovCgplcnJvcl9yZXBvcnRpbmcoRV9BTEwpOwoKLy8gU2V0dGluZyBvZiAkb3B0aW9ucyBhbmQgcmVxdWlyaW5nIERCIGFyZSBkb25lIGluIHNldHVwLmluYwoKLyoqCiAqIEVzdGFibGlzaCB0aGUgaW5jbHVkZV9wYXRoLCBEU04ncyBhbmQgY29ubmVjdGlvbiAkb3B0aW9ucwogKi8KcmVxdWlyZV9vbmNlICcuL3NldHVwLmluYyc7CgppZiAoZW1wdHkoJGRzbnMpKSB7CiAgICBkaWUoJ0F0IGxlYXN0IG9uZSBlbGVtZW50IG9mICRkc25zIG11c3QgYmUgZGVmaW5lZCBpbiBzZXR1cC5pbmMnKTsKfQoKbGlzdCgkZGJtcywgJGRzbikgPSBlYWNoKCRkc25zKTsKCmlmICgkZGJtcyA9PSAnbXNzcWwnKSB7CiAgICBpbmlfc2V0KCdtc3NxbC50ZXh0bGltaXQnLCA0MDk2KTsKICAgIGluaV9zZXQoJ21zc3FsLnRleHRzaXplJywgNDA5Nik7Cn0KCiRkYmggPSYgREI6OmNvbm5lY3QoJGRzbiwgJG9wdGlvbnMpOwppZiAoREI6OmlzRXJyb3IoJGRiaCkpIHsKICAgIGRpZSgnY29ubmVjdC5pbmM6ICcgLiAkZGJoLT50b1N0cmluZygpKTsKfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/pear/tests/driver/droptable.inc</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBDb250YWlucyB0aGUgZnVuY3Rpb24gZm9yIGRyb3BwaW5nIHRhYmxlcwogKgogKiBQSFAgdmVyc2lvbnMgNCBhbmQgNQogKgogKiBMSUNFTlNFOiBUaGlzIHNvdXJjZSBmaWxlIGlzIHN1YmplY3QgdG8gdmVyc2lvbiAzLjAgb2YgdGhlIFBIUCBsaWNlbnNlCiAqIHRoYXQgaXMgYXZhaWxhYmxlIHRocm91Z2ggdGhlIHdvcmxkLXdpZGUtd2ViIGF0IHRoZSBmb2xsb3dpbmcgVVJJOgogKiBodHRwOi8vd3d3LnBocC5uZXQvbGljZW5zZS8zXzAudHh0LiAgSWYgeW91IGRpZCBub3QgcmVjZWl2ZSBhIGNvcHkgb2YKICogdGhlIFBIUCBMaWNlbnNlIGFuZCBhcmUgdW5hYmxlIHRvIG9idGFpbiBpdCB0aHJvdWdoIHRoZSB3ZWIsIHBsZWFzZQogKiBzZW5kIGEgbm90ZSB0byBsaWNlbnNlQHBocC5uZXQgc28gd2UgY2FuIG1haWwgeW91IGEgY29weSBpbW1lZGlhdGVseS4KICoKICogQGNhdGVnb3J5ICAgRGF0YWJhc2UKICogQHBhY2thZ2UgICAgREIKICogQGF1dGhvciAgICAgRGFuaWVsIENvbnZpc3NvciA8ZGFuaWVsY0BwaHAubmV0PgogKiBAY29weXJpZ2h0ICAxOTk3LTIwMDUgVGhlIFBIUCBHcm91cAogKiBAbGljZW5zZSAgICBodHRwOi8vd3d3LnBocC5uZXQvbGljZW5zZS8zXzAudHh0ICBQSFAgTGljZW5zZSAzLjAKICogQHZlcnNpb24gICAgJElkOiBkcm9wdGFibGUuaW5jLHYgMS4yIDIwMDUvMDIvMDIgMDA6NDA6MjMgZGFuaWVsYyBFeHAgJAogKiBAbGluayAgICAgICBodHRwOi8vcGVhci5waHAubmV0L3BhY2thZ2UvREIKICovCgovKioKICogRHJvcHMgdGhlIHJlcXVlc3RlZCB0YWJsZQogKgogKiBAcGFyYW0gb2JqZWN0ICRkYmggICAgdGhlIFBFQVIgREIgb2JqZWN0IGN1cnJlbnRseSBpbiB1c2UKICogQHBhcmFtIHN0cmluZyAkdGFibGUgIHRoZSBuYW1lIG9mIHRoZSB0YWJsZSB0byBiZSBkcm9wcGVkCiAqCiAqIEByZXR1cm4gaW50ICBEQl9PSyBvbiBzdWNjZXNzLiAgREJfRXJyb3Igb2JqZWN0IG9uIGZhaWx1cmUuCiAqLwpmdW5jdGlvbiBkcm9wX3RhYmxlKCRkYmgsICR0YWJsZSkgewogICAgc3dpdGNoICgkZGJoLT5waHB0eXBlKSB7CiAgICAgICAgY2FzZSAnZmJzcWwnOgogICAgICAgICAgICAkcmVzID0gJGRiaC0+cXVlcnkoIkRST1AgVEFCTEUgJHRhYmxlIENBU0NBREUiKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgJHJlcyA9ICRkYmgtPnF1ZXJ5KCJEUk9QIFRBQkxFICR0YWJsZSIpOwogICAgfQogICAgcmV0dXJuICRyZXM7Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/pear/tests/driver/mktable.inc</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBDcmVhdGVzIHRoZSA8a2JkPnBocHRlc3Q8L2tiZD4gdGFibGUKICoKICogVHJpZXMgdG8gZHJvcCB0aGUgdGFibGUgZmlyc3QsIGluIGNhc2UgaXQgYWxyZWFkeSBleGlzdHMuCiAqCiAqIDxwcmU+CiAqIENSRUFURSBUQUJMRSBwaHB0ZXN0ICgKICogICBhIElOVEVHRVIgTlVMTCwKICogICBiIENIQVIoNDApIERFRkFVTFQgJ2RlZicgTk9UIE5VTEwsCiAqICAgY2MgVkFSQ0hBUigyNTUpIE5VTEwsCiAqICAgZCBWQVJDSEFSKDIwKSBOVUxMKQogKiA8L3ByZT4KICoKICogTmVlZCA8a2JkPk5PVCBOVUxMPC9rYmQ+IG9uIDxrYmQ+Yjwva2JkPiB0byB0ZXN0CiAqIDxrYmQ+REJfUE9SVEFCSUxJVFlfUlRSSU08L2tiZD4uICBNUyBTUUwgYW5kIFN5YmFzZSB0cmltIG91dHB1dCBmcm9tCiAqIDxrYmQ+VkFSQ0hBUjwva2JkPiwgYnV0IG5vdCBvbiA8a2JkPkNIQVI8L2tiZD4uCiAqCiAqIE5lZWQgPGtiZD5ERUZBVUxUPC9rYmQ+IHZhbHVlIG9uIDxrYmQ+Yjwva2JkPiBiZWNhdXNlIE9yYWNsZSBjb25zaWRlcnMKICogYW4gZW1wdHkgc3RyaW5nIHRvIGJlIDxrYmQ+TlVMTDwva2JkPi4KICoKICogSW4gT3JhY2xlLCB3aGVuIHVzaW5nIHBsYWNlaG9sZGVycyBpbiA8a2JkPldIRVJFPC9rYmQ+IGNsYXVzZXMgb24gCiAqIDxrYmQ+Q0hBUjwva2JkPiBjb2x1bW5zLCB0aGUgY29sdW1uIG11c3QgaGF2ZSA8a2JkPlJUUklNKCk8L2tiZD4gcnVuIG9uCiAqIHRoZSBjb2x1bW46CiAqIDxzYW1wPgogKiAgICBTRUxFQ1QgKiBGUk9NIHBocHRlc3QgV0hFUkUgUlRSSU0oYikgPSA/CiAqIDwvc2FtcD4KICoKICogUEhQIHZlcnNpb25zIDQgYW5kIDUKICoKICogTElDRU5TRTogVGhpcyBzb3VyY2UgZmlsZSBpcyBzdWJqZWN0IHRvIHZlcnNpb24gMy4wIG9mIHRoZSBQSFAgbGljZW5zZQogKiB0aGF0IGlzIGF2YWlsYWJsZSB0aHJvdWdoIHRoZSB3b3JsZC13aWRlLXdlYiBhdCB0aGUgZm9sbG93aW5nIFVSSToKICogaHR0cDovL3d3dy5waHAubmV0L2xpY2Vuc2UvM18wLnR4dC4gIElmIHlvdSBkaWQgbm90IHJlY2VpdmUgYSBjb3B5IG9mCiAqIHRoZSBQSFAgTGljZW5zZSBhbmQgYXJlIHVuYWJsZSB0byBvYnRhaW4gaXQgdGhyb3VnaCB0aGUgd2ViLCBwbGVhc2UKICogc2VuZCBhIG5vdGUgdG8gbGljZW5zZUBwaHAubmV0IHNvIHdlIGNhbiBtYWlsIHlvdSBhIGNvcHkgaW1tZWRpYXRlbHkuCiAqCiAqIEBjYXRlZ29yeSAgIERhdGFiYXNlCiAqIEBwYWNrYWdlICAgIERCCiAqIEBhdXRob3IgICAgIERhbmllbCBDb252aXNzb3IgPGRhbmllbGNAcGhwLm5ldD4KICogQGNvcHlyaWdodCAgMTk5Ny0yMDA1IFRoZSBQSFAgR3JvdXAKICogQGxpY2Vuc2UgICAgaHR0cDovL3d3dy5waHAubmV0L2xpY2Vuc2UvM18wLnR4dCAgUEhQIExpY2Vuc2UgMy4wCiAqIEB2ZXJzaW9uICAgICRJZDogbWt0YWJsZS5pbmMsdiAxLjIwIDIwMDcvMDEvMDUgMTU6MTI6NTYgZGFuaWVsYyBFeHAgJAogKiBAbGluayAgICAgICBodHRwOi8vcGVhci5waHAubmV0L3BhY2thZ2UvREIKICovCgovKioKICogRXN0YWJsaXNoZXMgdGhlIERCIG9iamVjdCBhbmQgY29ubmVjdHMgdG8gdGhlIGRhdGFiYXNlCiAqLwpyZXF1aXJlX29uY2UgJy4vY29ubmVjdC5pbmMnOwoKLyoqCiAqIEdldCB0aGUgZHJvcF90YWJsZSgpIGZ1bmN0aW9uCiAqLwpyZXF1aXJlX29uY2UgJy4vZHJvcHRhYmxlLmluYyc7CgovKioKICogVGhlIGVycm9yIGhhbmRsZXIgZm9yIHRoZSBkcm9wIHRhYmxlIHByb2NlZHVyZQogKgogKiBQcmludHMgb3V0IGFuIGVycm9yIG1lc3NhZ2UgYW5kIGRpZXMuCiAqLwpmdW5jdGlvbiBkZWJ1Z19kaWUoJG8pewogICAgZGllKCRvLT50b1N0cmluZygpKTsKfQoKCiRkYmgtPnNldEVycm9ySGFuZGxpbmcoUEVBUl9FUlJPUl9SRVRVUk4pOwpkcm9wX3RhYmxlKCRkYmgsICdwaHB0ZXN0Jyk7CgovLyRkYmgtPnNldEVycm9ySGFuZGxpbmcoUEVBUl9FUlJPUl9UUklHR0VSKTsKJGRiaC0+c2V0RXJyb3JIYW5kbGluZyhQRUFSX0VSUk9SX0NBTExCQUNLLCAnZGVidWdfZGllJyk7CgppZiAoJGRiaC0+cGhwdHlwZSA9PSAnb2RiYycpIHsKICAgIGlmICgkZGJoLT5kYnN5bnRheCA9PSAnb2RiYycpIHsKICAgICAgICAkdHlwZSA9ICRkYmgtPnBocHR5cGU7CiAgICB9IGVsc2UgewogICAgICAgICR0eXBlID0gJGRiaC0+ZGJzeW50YXg7CiAgICB9Cn0gZWxzZSB7CiAgICAkdHlwZSA9ICRkYmgtPnBocHR5cGU7Cn0KCgpzd2l0Y2ggKCR0eXBlKSB7CiAgICBjYXNlICdhY2Nlc3MnOgogICAgICAgICRudWxsID0gJ05VTEwnOwogICAgICAgICRjaHJjID0gJ1ZBUkNIQVIoMjU1KSc7CiAgICAgICAgJGNocmQgPSAnVkFSQ0hBUigyMCknOwogICAgICAgICRkZWZhdWx0ID0gJyc7CiAgICAgICAgJHRhYmxldHlwZSA9ICcnOwogICAgICAgIGJyZWFrOwogICAgY2FzZSAnZGIyJzoKICAgIGNhc2UgJ2liYXNlJzoKICAgICAgICAkbnVsbCA9ICcnOwogICAgICAgICRjaHJjID0gJ1ZBUkNIQVIoMjU1KSc7CiAgICAgICAgJGNocmQgPSAnVkFSQ0hBUigyMCknOwogICAgICAgICRkZWZhdWx0ID0gIkRFRkFVTFQgJ2RlZicgTk9UIE5VTEwiOwogICAgICAgICR0YWJsZXR5cGUgPSAnJzsKICAgICAgICBicmVhazsKICAgIGNhc2UgJ2Zic3FsJzoKICAgICAgICAkbnVsbCA9ICcnOwogICAgICAgICRjaHJjID0gJ0NIQVIoMjU1KSc7CiAgICAgICAgJGNocmQgPSAnQ0hBUigyMCknOwogICAgICAgICRkZWZhdWx0ID0gIkRFRkFVTFQgJ2RlZicgTk9UIE5VTEwiOwogICAgICAgICRkYXRlX2xpdGVyYWwgPSAnIERBVEUgJzsKICAgICAgICAkdGFibGV0eXBlID0gJyc7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlICdpZngnOgogICAgICAgIC8vIGRvaW5nIHRoaXMgZm9yIGlmeCB0byBrZWVwIGNlcnRhaW4gdmVyc2lvbnMgaGFwcHkKICAgICAgICAkbnVsbCA9ICcnOwogICAgICAgICRjaHJjID0gJ0NIQVIoMjU1KSc7CiAgICAgICAgJGNocmQgPSAnQ0hBUigyMCknOwogICAgICAgICRkZWZhdWx0ID0gIkRFRkFVTFQgJ2RlZicgTk9UIE5VTEwiOwogICAgICAgICR0YWJsZXR5cGUgPSAnJzsKICAgICAgICBicmVhazsKICAgIGNhc2UgJ21zcWwnOgogICAgICAgICRudWxsID0gJyc7CiAgICAgICAgJGNocmMgPSAnQ0hBUigyNTUpJzsKICAgICAgICAkY2hyZCA9ICdDSEFSKDIwKSc7CiAgICAgICAgJGRlZmF1bHQgPSAnJzsKICAgICAgICAkdGFibGV0eXBlID0gJyc7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlICdteXNxbCc6CiAgICBjYXNlICdteXNxbGknOgogICAgICAgICRudWxsID0gJ05VTEwnOwogICAgICAgICRjaHJjID0gJ1ZBUkNIQVIoMjU1KSc7CiAgICAgICAgJGNocmQgPSAnVkFSQ0hBUigyMCknOwogICAgICAgICRkZWZhdWx0ID0gIkRFRkFVTFQgJ2RlZicgTk9UIE5VTEwiOwogICAgICAgIGlmICghZW1wdHkoJG5lZWRpbm5vZGIpKSB7CiAgICAgICAgICAgICR0YWJsZXR5cGUgPSAnVFlQRT1JTk5PREInOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICR0YWJsZXR5cGUgPSAnJzsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICAgICRudWxsID0gJ05VTEwnOwogICAgICAgICRjaHJjID0gJ1ZBUkNIQVIoMjU1KSc7CiAgICAgICAgJGNocmQgPSAnVkFSQ0hBUigyMCknOwogICAgICAgICRkZWZhdWx0ID0gIkRFRkFVTFQgJ2RlZicgTk9UIE5VTEwiOwogICAgICAgICR0YWJsZXR5cGUgPSAnJzsKfQoKc3dpdGNoICgkZGJoLT5waHB0eXBlKSB7CiAgICBjYXNlICdkYmFzZSc6CiAgICAgICAgLy8gZmlsZSBleGlzdHMgb3Igd2FzIGNyZWF0ZWQgaW4gREJfZGJhc2U6OmNvbm5lY3QoKQogICAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgICAkdGVzdF9ta3RhYmxlX3F1ZXJ5ID0gIgogICAgICAgICAgICBDUkVBVEUgVEFCTEUgcGhwdGVzdCAoCiAgICAgICAgICAgICAgYSBJTlRFR0VSICRudWxsLAogICAgICAgICAgICAgIGIgQ0hBUig0MCkgJGRlZmF1bHQsCiAgICAgICAgICAgICAgY2MgJGNocmMgJG51bGwsCiAgICAgICAgICAgICAgZCAkY2hyZCAkbnVsbCkgJHRhYmxldHlwZQogICAgICAgICI7Cn0KCgokZGJoLT5xdWVyeSgkdGVzdF9ta3RhYmxlX3F1ZXJ5KTsKJGRiaC0+cXVlcnkoIklOU0VSVCBJTlRPIHBocHRlc3QgVkFMVUVTKDQyLCAnYmluZycsICdUaGlzIGlzIGEgdGVzdCcsICcxOTk5LTExLTIxJykiKTsKCiRkYmgtPnNldEVycm9ySGFuZGxpbmcoUEVBUl9FUlJPUl9SRVRVUk4pOwo=]]></data>
	</file>
	<file>
	  <filename>/lib/pear/tests/driver/multiconnect.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBUZXN0cyB0aGUgdmFyaW91cyB3YXlzIERCJ3MgY29ubmVjdCgpIGZ1bmN0aW9uIG9wZXJhdGVzCiAqCiAqIFBIUCB2ZXJzaW9ucyA0IGFuZCA1CiAqCiAqIExJQ0VOU0U6IFRoaXMgc291cmNlIGZpbGUgaXMgc3ViamVjdCB0byB2ZXJzaW9uIDMuMCBvZiB0aGUgUEhQIGxpY2Vuc2UKICogdGhhdCBpcyBhdmFpbGFibGUgdGhyb3VnaCB0aGUgd29ybGQtd2lkZS13ZWIgYXQgdGhlIGZvbGxvd2luZyBVUkk6CiAqIGh0dHA6Ly93d3cucGhwLm5ldC9saWNlbnNlLzNfMC50eHQuICBJZiB5b3UgZGlkIG5vdCByZWNlaXZlIGEgY29weSBvZgogKiB0aGUgUEhQIExpY2Vuc2UgYW5kIGFyZSB1bmFibGUgdG8gb2J0YWluIGl0IHRocm91Z2ggdGhlIHdlYiwgcGxlYXNlCiAqIHNlbmQgYSBub3RlIHRvIGxpY2Vuc2VAcGhwLm5ldCBzbyB3ZSBjYW4gbWFpbCB5b3UgYSBjb3B5IGltbWVkaWF0ZWx5LgogKgogKiBAY2F0ZWdvcnkgICBEYXRhYmFzZQogKiBAcGFja2FnZSAgICBEQgogKiBAYXV0aG9yICAgICBEYW5pZWwgQ29udmlzc29yIDxkYW5pZWxjQHBocC5uZXQ+CiAqIEBjb3B5cmlnaHQgIDE5OTctMjAwNSBUaGUgUEhQIEdyb3VwCiAqIEBsaWNlbnNlICAgIGh0dHA6Ly93d3cucGhwLm5ldC9saWNlbnNlLzNfMC50eHQgIFBIUCBMaWNlbnNlIDMuMAogKiBAdmVyc2lvbiAgICAkSWQ6IG11bHRpY29ubmVjdC5waHAsdiAxLjIgMjAwNS8wMi8wMyAwNTo0OTo0NSBkYW5pZWxjIEV4cCAkCiAqIEBsaW5rICAgICAgIGh0dHA6Ly9wZWFyLnBocC5uZXQvcGFja2FnZS9EQgogKiBAc2luY2UgICAgICBGaWxlIGF2YWlsYWJsZSBzaW5jZSBSZWxlYXNlIDEuNy4wCiAqLwoKLyoqCiAqIEVzdGFibGlzaCB0aGUgaW5jbHVkZV9wYXRoLCBEU04ncyBhbmQgY29ubmVjdGlvbiAkb3B0aW9ucwogKi8KcmVxdWlyZV9vbmNlICcuL3NldHVwLmluYyc7Cgpmb3JlYWNoICgkZHNucyBhcyAkZGJtcyA9PiAkZHNuKSB7CiAgICBlY2hvICI9PT09PT09PSAkZGJtcyA9PT09PT09PVxuIjsKICAgICRvcHRpb25zWydwZXJzaXN0ZW50J10gPSBmYWxzZTsKICAgICRkYmggPSYgREI6OmNvbm5lY3QoJGRzbiwgJG9wdGlvbnMpOwogICAgaWYgKERCOjppc0Vycm9yKCRkYmgpKSB7CiAgICAgICAgZWNobyAnUFJPQkxFTTogJyAuICRkYmgtPmdldFVzZXJJbmZvKCkgLiAiXG4iOwogICAgICAgIGNvbnRpbnVlOwogICAgfQoKICAgIGlmICgkZGJoLT5wcm92aWRlcygnbmV3X2xpbmsnKQogICAgICAgICYmIHZlcnNpb25fY29tcGFyZShwaHB2ZXJzaW9uKCksICRkYmgtPnByb3ZpZGVzKCduZXdfbGluaycpLCAnPj0nKSkKICAgIHsKICAgICAgICAkcHJvYnMgPSBmYWxzZTsKICAgICAgICAkZHNuID0gREI6OnBhcnNlRFNOKCRkc24pOwogICAgICAgICRkc25bJ25ld19saW5rJ10gPSB0cnVlOwogICAgICAgICRkYmggPSYgREI6OmNvbm5lY3QoJGRzbiwgJG9wdGlvbnMpOwogICAgICAgIGlmIChEQjo6aXNFcnJvcigkZGJoKSkgewogICAgICAgICAgICBlY2hvICdORVcgTElOSyBQUk9CTEVNOiAnIC4gJGRiaC0+Z2V0VXNlckluZm8oKSAuICJcbiI7CiAgICAgICAgICAgICRwcm9icyA9IHRydWU7CiAgICAgICAgfQoKICAgICAgICBpZiAoJGRiaC0+cHJvdmlkZXMoJ3Bjb25uZWN0JykpIHsKICAgICAgICAgICAgJG9wdGlvbnNbJ3BlcnNpc3RlbnQnXSA9IHRydWU7CiAgICAgICAgICAgICRkYmgtPmRpc2Nvbm5lY3QoKTsKICAgICAgICAgICAgJGRiaCA9JiBEQjo6Y29ubmVjdCgkZHNuLCAkb3B0aW9ucyk7CiAgICAgICAgICAgIGlmIChEQjo6aXNFcnJvcigkZGJoKSkgewogICAgICAgICAgICAgICAgZWNobyAnUEVSU0lTVCBORVdDT04gUFJPQkxFTTogJyAuICRkYmgtPmdldFVzZXJJbmZvKCkgLiAiXG4iOwogICAgICAgICAgICAgICAgJHByb2JzID0gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdW5zZXQoJGRzblsnbmV3X2xpbmsnXSk7CiAgICAgICAgICAgICRkYmgtPmRpc2Nvbm5lY3QoKTsKICAgICAgICAgICAgJGRiaCA9JiBEQjo6Y29ubmVjdCgkZHNuLCAkb3B0aW9ucyk7CiAgICAgICAgICAgIGlmIChEQjo6aXNFcnJvcigkZGJoKSkgewogICAgICAgICAgICAgICAgZWNobyAnUEVSU0lTVCBPTERDT04gUFJPQkxFTTogJyAuICRkYmgtPmdldFVzZXJJbmZvKCkgLiAiXG4iOwogICAgICAgICAgICAgICAgJHByb2JzID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoJHByb2JzKSB7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICAkZGJoLT5kaXNjb25uZWN0KCk7CgogICAgfSBlbHNlaWYgKCRkYmgtPnByb3ZpZGVzKCdwY29ubmVjdCcpKSB7CiAgICAgICAgJG9wdGlvbnNbJ3BlcnNpc3RlbnQnXSA9IHRydWU7CiAgICAgICAgJGRiaC0+ZGlzY29ubmVjdCgpOwogICAgICAgICRkYmggPSYgREI6OmNvbm5lY3QoJGRzbiwgJG9wdGlvbnMpOwogICAgICAgIGlmIChEQjo6aXNFcnJvcigkZGJoKSkgewogICAgICAgICAgICBlY2hvICdQRVJTSVNUIFBST0JMRU06ICcgLiAkZGJoLT5nZXRVc2VySW5mbygpIC4gIlxuIjsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgICRkYmgtPmRpc2Nvbm5lY3QoKTsKICAgIH0KICAgIGVjaG8gIkdPT0RcbiI7Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/pear/tests/driver/run.cvs</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[IyEgL2Jpbi9zaAoKIyAkSWQ6IHJ1bi5jdnMsdiAxLjIgMjAwNC8wMi8yMCAxODo1Nzo1MiBkYW5pZWxjIEV4cCAkCgojIHZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2CiMgUEVBUiBEQiBURVNUIFNUQVJURVIKIwojICAgVG8gcnVuIGFsbCB0ZXN0czogIC4vcnVuCiMgICBUbyBydW4gb25lIHRlc3Q6ICAgLi9ydW4gPHRlc3QgZmlsZSBuYW1lPgojICAgRXhhbXBsZTogICAgICAgICAgIC4vcnVuIGRiX3BhcnNlZHNuLnBocHQKIwojIEJlZm9yZSBydW5uaW5nIHRoZSB0ZXN0cyB5b3UgbXVzdCBhZGp1c3QgdGhlCiMgZm9sbG93aW5nIHRocmVlIHZhcmlhYmxlczoKCiMgICBUaGUgZnVsbCBwYXRoIHRvIHlvdXIgUEhQIGRpcmVjdG9yeToKICAgIERCX1RFU1RfUEhQX1BBVEg9YzovcHJvZ3JhfjEvcGhwCgojICAgVGhlIG5hbWUgb2YgeW91ciBQSFAgQ0xJIGV4ZWN1dGFibGUKIyAgIChleGFtcGxlcyBwaHAuZXhlLCBwaHAtY2xpLmV4ZSwgY2xpL3BocC5leGUpOgogICAgREJfVEVTVF9QSFBfQ0xJPXBocC5leGUKCiMgICBUaGUgZnVsbCBwYXRoIHRvIHRoZSBwcmVzZW50IGRpcmVjdG9yeQojICAgKG5vdCB1c2luZyAkUFdEIGR1ZSB0byBDeWd3aW4pOgogICAgREJfVEVTVF9ESVI9ZDovcGVhcnRlc3QvcGVhci9EQi90ZXN0cy9kcml2ZXIKCiMgXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl4KCgoKVEVTVF9QSFBfRVhFQ1VUQUJMRT0kREJfVEVTVF9QSFBfUEFUSC8kREJfVEVTVF9QSFBfQ0xJCmV4cG9ydCBURVNUX1BIUF9FWEVDVVRBQkxFCgppZiBbICQjIC1ndCAwIF0KdGhlbgogICAgdGVzdD0kMQplbHNlCiAgICB0ZXN0PSoucGhwdApmaQoKJFRFU1RfUEhQX0VYRUNVVEFCTEUgJERCX1RFU1RfUEhQX1BBVEgvcnVuLXRlc3RzLnBocCAkREJfVEVTVF9ESVIvJHt0ZXN0fQo=]]></data>
	</file>
	<file>
	  <filename>/lib/pear/tests/driver/setup.inc.cvs</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBFc3RhYmxpc2hlcyB0aGUgaW5jbHVkZV9wYXRoLCBEU04ncyBhbmQgY29ubmVjdGlvbiAkb3B0aW9ucwogKgogKiBJZiB0aGlzIGZpbGUgaXMgbmFtZWQgInNldHVwLmluYy5jdnMsIiBpdCBpcyB0aGUgb3JpZ2luYWwgb25lIGZyb20gQ1ZTLgogKiBQbGVhc2UgZG8gdGhlIGZvbGxvd2luZzoKICogICAxKSBNYWtlIGEgY29weSBvZiB0aGlzIGZpbGUgbmFtZWQgInNldHVwLmluYyIuCiAqICAgMikgVGhlbiwgaW4gdGhlIGNvcHksIGVkaXQgdGhlICRkc25zIGFycmF5IGFzIGFwcHJvcHJpYXRlIGZvciB5b3VyCiAqICAgICAgZW52aXJvbm1lbnQuCiAqICAgMykgQXQgbGVhc3Qgb25lIGVsZW1lbnQgb2YgdGhlICRkc25zIGFycmF5IG5lZWRzIHRvIGJlIHVuY29tbWVudGVkLgogKgogKiBQSFAgdmVyc2lvbnMgNCBhbmQgNQogKgogKiBMSUNFTlNFOiBUaGlzIHNvdXJjZSBmaWxlIGlzIHN1YmplY3QgdG8gdmVyc2lvbiAzLjAgb2YgdGhlIFBIUCBsaWNlbnNlCiAqIHRoYXQgaXMgYXZhaWxhYmxlIHRocm91Z2ggdGhlIHdvcmxkLXdpZGUtd2ViIGF0IHRoZSBmb2xsb3dpbmcgVVJJOgogKiBodHRwOi8vd3d3LnBocC5uZXQvbGljZW5zZS8zXzAudHh0LiAgSWYgeW91IGRpZCBub3QgcmVjZWl2ZSBhIGNvcHkgb2YKICogdGhlIFBIUCBMaWNlbnNlIGFuZCBhcmUgdW5hYmxlIHRvIG9idGFpbiBpdCB0aHJvdWdoIHRoZSB3ZWIsIHBsZWFzZQogKiBzZW5kIGEgbm90ZSB0byBsaWNlbnNlQHBocC5uZXQgc28gd2UgY2FuIG1haWwgeW91IGEgY29weSBpbW1lZGlhdGVseS4KICoKICogQGNhdGVnb3J5ICAgRGF0YWJhc2UKICogQHBhY2thZ2UgICAgREIKICogQGF1dGhvciAgICAgRGFuaWVsIENvbnZpc3NvciA8ZGFuaWVsY0BwaHAubmV0PgogKiBAY29weXJpZ2h0ICAxOTk3LTIwMDUgVGhlIFBIUCBHcm91cAogKiBAbGljZW5zZSAgICBodHRwOi8vd3d3LnBocC5uZXQvbGljZW5zZS8zXzAudHh0ICBQSFAgTGljZW5zZSAzLjAKICogQHZlcnNpb24gICAgJElkOiBzZXR1cC5pbmMuY3ZzLHYgMS42IDIwMDUvMDIvMTQgMjM6MzM6MjAgZGFuaWVsYyBFeHAgJAogKiBAbGluayAgICAgICBodHRwOi8vcGVhci5waHAubmV0L3BhY2thZ2UvREIKICovCgppZiAoIWRlZmluZWQoJ1BBVEhfU0VQQVJBVE9SJykpIHsKICAgIGlmIChzdHJpc3RyKFBIUF9PUywgJ1dJTicpKSB7CiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIHN0cmluZyB1c2VkIHRvIGRlbGltaXQgZWxlbWVudHMgb2YgdGhlIHBhdGguCiAgICAgICAgICovCiAgICAgICAgZGVmaW5lKCdQQVRIX1NFUEFSQVRPUicsICc7Jyk7CiAgICB9IGVsc2UgewogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBzdHJpbmcgdXNlZCB0byBkZWxpbWl0IGVsZW1lbnRzIG9mIHRoZSBwYXRoLgogICAgICAgICAqLwogICAgICAgIGRlZmluZSgnUEFUSF9TRVBBUkFUT1InLCAnOicpOwogICAgfQp9CgovKgogKiBJZiB0aGUgcGF0aCB0byB5b3VyIFBFQVIgaW5zdGFsbGF0aW9uIGlzIGZvdW5kIGluIHRoZSBsZWZ0IGhhbmQKICogcG9ydGlvbiBvZiB0aGUgaWYoKSBleHByZXNzaW9uIGJlbG93LCB0aGF0IG1lYW5zIHRoaXMgZmlsZSBoYXMKICogY29tZSBmcm9tIHRoZSBQRUFSIGluc3RhbGxlci4gIFRoZXJlZm9yZSwgbGV0J3MgdXNlIHRoZQogKiBpbnN0YWxsZWQgdmVyc2lvbiBvZiBEQiwgd2hpY2ggc2hvdWxkIGJlIGZvdW5kIHZpYSB0aGUKICogY29tcHV0ZXIncyBkZWZhdWx0IGluY2x1ZGVfcGF0aC4gIEFkZCAnLicgdG8gdGhlIGluY2x1ZGVfcGF0aAogKiB0byBlbnN1cmUgJy4nIGlzIGluIHRoZXJlLgogKiAKICogSWYgdGhlIHBhdGggaGFzIG5vdCBiZWVuIHN1YnN0aXR1dGVkIGluIHRoZSBpZigpIGV4cHJlc3Npb24sCiAqIHRoaXMgZmlsZSBoYXMgbGlrZWx5IGNvbWUgZnJvbSBhIENWUyBjaGVja291dCBvciBhIC50YXIgZmlsZS4KICogVGhlcmVmb3JlLCB3ZSdsbCBhc3N1bWUgdGhlIHRlc3RzIHNob3VsZCB1c2UgdGhlIHZlcnNpb24gb2YKICogREIgdGhhdCBoYXMgY29tZSBmcm9tIHRoZXJlIGFzIHdlbGwuCiAqLwppZiAoJ0BpbmNsdWRlX3BhdGhAJyAhPSAnQCcuJ2luY2x1ZGVfcGF0aCcuJ0AnKSB7CiAgICBpbmlfc2V0KCdpbmNsdWRlX3BhdGgnLCBpbmlfZ2V0KCdpbmNsdWRlX3BhdGgnKQogICAgICAgICAgICAuIFBBVEhfU0VQQVJBVE9SIC4gJy4nCiAgICApOwp9IGVsc2UgewogICAgaW5pX3NldCgnaW5jbHVkZV9wYXRoJywgcmVhbHBhdGgoZGlybmFtZShfX0ZJTEVfXykgLiAnLy4uLy4uJykKICAgICAgICAgICAgLiBQQVRIX1NFUEFSQVRPUiAuICcuJyAuIFBBVEhfU0VQQVJBVE9SCiAgICAgICAgICAgIC4gaW5pX2dldCgnaW5jbHVkZV9wYXRoJykKICAgICk7Cn0KCi8qKgogKiBHcmFiIHRoZSBQRUFSIERCIGNsYXNzZXMuCiAqLwpyZXF1aXJlX29uY2UgJ0RCLnBocCc7CgovLyBPcHRpb25zIHVzZWQgd2hlbiBjb25uZWN0aW5nCiRvcHRpb25zID0gYXJyYXkoCiAgICAvLydvcHRpbWl6ZScgPT4gJ3BvcnRhYmlsaXR5JywKICAgICdwb3J0YWJpbGl0eScgPT4gREJfUE9SVEFCSUxJVFlfQUxMLAogICAgJ2RlYnVnJyA9PiAyLAopOwoKJGRiYXNlZHNuID0gYXJyYXkoCiAgICAncGhwdHlwZScgID0+ICdkYmFzZScsCiAgICAnZGF0YWJhc2UnID0+ICcvcGF0aC9hbmQvbmFtZS9vZi9kYmFzZS9maWxlJywKICAgICdtb2RlJyAgICAgPT4gMiwKICAgICdmaWVsZHMnICAgPT4gYXJyYXkoCiAgICAgICAgYXJyYXkoJ2EnLCAnTicsIDUsIDApLAogICAgICAgIGFycmF5KCdiJywgJ0MnLCA0MCksCiAgICAgICAgYXJyYXkoJ2MnLCAnQycsIDI1NSksCiAgICAgICAgYXJyYXkoJ2QnLCAnQycsIDIwKSwKICAgICksCik7CgovKgogKiBVbmNvbW1lbnQgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgZWxlbWVudHMuCiAqIFdoZW4gcnVubmluZyB0aGUgLnBocHQgdGVzdHMsIHRoZSBmaXJzdCB1bmNvbW1lbnRlZCBlbGVtZW50IGlzIHVzZWQuCiAqIFdoZW4gcnVubmluZyB0aGUgbXVsdGljb25uZWN0LnBocCB0ZXN0LCBhbGwgdW5jb21tZW50ZWQgZWxlbWVudHMgYXJlIHVzZWQuCiAqLwokZHNucyA9IGFycmF5KAogICAgLy8gJ2RiYXNlJyAgICA9PiAkZGJhc2Vkc24sCiAgICAvLyAnZmJzcWwnICAgID0+ICdmYnNxbDovL19zeXN0ZW06QC9kYicsCiAgICAvLyAnZmlyZWJpcmQnID0+ICdpYmFzZShmaXJlYmlyZCk6Ly9TWVNEQkE6bWFzdGVya2V5QC8vb3B0L2ludGVyYmFzZS9leGFtcGxlcy9lbXBsb3llZS5nZGI/ZGlhbGVjdD0zJywKICAgIC8vICdpZngnICAgICAgPT4gJ2lmeDovL3VzZXI6cHdAbG9jYWxob3N0L2RiJywKICAgIC8vICdtc3FsJyAgICAgPT4gJ21zcWw6Ly8vZGInLAoKICAgIC8vIEl0J3MgYWR2aXNhYmxlIHRvIHVzZSBvbmx5IG9uZSBvZiB0aGUgZm9sbG93aW5nIGF0IGEgdGltZToKICAgIC8vICdtc3NxbCcgICAgPT4gJ21zc3FsOi8vc2FAc29tZWhvc3QvcHVicycsCiAgICAvLyAnc3liYXNlJyAgID0+ICdzeWJhc2U6Ly9zYUBzb21laG9zdC9wdWJzJywKCiAgICAvLyAnbXlzcWwnICAgID0+ICdteXNxbDovL3Jvb3RAbG9jYWxob3N0L3Rlc3QnLAogICAgLy8gJ215c3FsaScgICA9PiAnbXlzcWxpOi8vcm9vdEBsb2NhbGhvc3QvdGVzdCcsCiAgICAvLyAnb2NpOCcgICAgID0+ICdvY2k4Oi8vc3lzdGVtOm1hbmFnZXJAJywKICAgIC8vICdhY2Nlc3MnICAgPT4gJ29kYmMoYWNjZXNzKTovL2FkbWluQC9TeXN0ZW1Ec25OYW1lJywKICAgIC8vICdkYjInICAgICAgPT4gJ29kYmMoZGIyKTovL2RiMmluc3QxOlhYWFhAL1NBTVBMRScsCiAgICAvLyAncGdzcWwnICAgID0+ICdwZ3NxbDovL3Bvc3RncmVzQGxvY2FsaG9zdC90ZXN0JywKICAgIC8vICdzcWxpdGUnICAgPT4gJ3NxbGl0ZTovL2R1bW15OkBsb2NhbGhvc3QvJyAuIGdldGN3ZCgpIC4gRElSRUNUT1JZX1NFUEFSQVRPUiAuICd0ZXN0LmRiP21vZGU9MDY0NCcsCik7Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/pear/tests/driver/skipif.inc</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBBIHRlc3QgdG8gbWFrZSBzdXJlIHRoZSBkYXRhYmFzZSBjYW4gYmUgY29ubmVjdGVkIHRvCiAqCiAqIFBIUCB2ZXJzaW9ucyA0IGFuZCA1CiAqCiAqIExJQ0VOU0U6IFRoaXMgc291cmNlIGZpbGUgaXMgc3ViamVjdCB0byB2ZXJzaW9uIDMuMCBvZiB0aGUgUEhQIGxpY2Vuc2UKICogdGhhdCBpcyBhdmFpbGFibGUgdGhyb3VnaCB0aGUgd29ybGQtd2lkZS13ZWIgYXQgdGhlIGZvbGxvd2luZyBVUkk6CiAqIGh0dHA6Ly93d3cucGhwLm5ldC9saWNlbnNlLzNfMC50eHQuICBJZiB5b3UgZGlkIG5vdCByZWNlaXZlIGEgY29weSBvZgogKiB0aGUgUEhQIExpY2Vuc2UgYW5kIGFyZSB1bmFibGUgdG8gb2J0YWluIGl0IHRocm91Z2ggdGhlIHdlYiwgcGxlYXNlCiAqIHNlbmQgYSBub3RlIHRvIGxpY2Vuc2VAcGhwLm5ldCBzbyB3ZSBjYW4gbWFpbCB5b3UgYSBjb3B5IGltbWVkaWF0ZWx5LgogKgogKiBAY2F0ZWdvcnkgICBEYXRhYmFzZQogKiBAcGFja2FnZSAgICBEQgogKiBAYXV0aG9yICAgICBEYW5pZWwgQ29udmlzc29yIDxkYW5pZWxjQHBocC5uZXQ+CiAqIEBjb3B5cmlnaHQgIDE5OTctMjAwNiBUaGUgUEhQIEdyb3VwCiAqIEBsaWNlbnNlICAgIGh0dHA6Ly93d3cucGhwLm5ldC9saWNlbnNlLzNfMC50eHQgIFBIUCBMaWNlbnNlIDMuMAogKiBAdmVyc2lvbiAgICAkSWQ6IHNraXBpZi5pbmMsdiAxLjggMjAwNi8wOC8yMSAwMTozNzo1MCBkYW5pZWxjIEV4cCAkCiAqIEBsaW5rICAgICAgIGh0dHA6Ly9wZWFyLnBocC5uZXQvcGFja2FnZS9EQgogKi8KCi8qKgogKiBFc3RhYmxpc2ggdGhlIGluY2x1ZGVfcGF0aCwgRFNOJ3MgYW5kIGNvbm5lY3Rpb24gJG9wdGlvbnMKICovCnJlcXVpcmVfb25jZSAnLi9zZXR1cC5pbmMnOwoKaWYgKGVtcHR5KCRkc25zKSkgewogICAgZGllKCdza2lwIEF0IGxlYXN0IG9uZSBlbGVtZW50IG9mICRkc25zIG11c3QgYmUgZGVmaW5lZCBpbiBzZXR1cC5pbmMnKTsKfQoKbGlzdCgkZGJtcywgJGRzbikgPSBlYWNoKCRkc25zKTsKCiRkYmggPSYgREI6OmNvbm5lY3QoJGRzbiwgJG9wdGlvbnMpOwppZiAoREI6OmlzRXJyb3IoJGRiaCkpIHsKICAgIGRpZSgnc2tpcCAnIC4gJGRiaC0+Z2V0VXNlckluZm8oKSk7Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/pear/tests/errors.inc</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBUZXN0cyB0aGUgZHJpdmVycycgZXJyb3IgbWFwcGluZwogKgogKiBFeGVjdXRlZCBieSBkcml2ZXIvMTBlcnJvcm1hcC5waHB0CiAqCiAqIFBIUCB2ZXJzaW9ucyA0IGFuZCA1CiAqCiAqIExJQ0VOU0U6IFRoaXMgc291cmNlIGZpbGUgaXMgc3ViamVjdCB0byB2ZXJzaW9uIDMuMCBvZiB0aGUgUEhQIGxpY2Vuc2UKICogdGhhdCBpcyBhdmFpbGFibGUgdGhyb3VnaCB0aGUgd29ybGQtd2lkZS13ZWIgYXQgdGhlIGZvbGxvd2luZyBVUkk6CiAqIGh0dHA6Ly93d3cucGhwLm5ldC9saWNlbnNlLzNfMC50eHQuICBJZiB5b3UgZGlkIG5vdCByZWNlaXZlIGEgY29weSBvZgogKiB0aGUgUEhQIExpY2Vuc2UgYW5kIGFyZSB1bmFibGUgdG8gb2J0YWluIGl0IHRocm91Z2ggdGhlIHdlYiwgcGxlYXNlCiAqIHNlbmQgYSBub3RlIHRvIGxpY2Vuc2VAcGhwLm5ldCBzbyB3ZSBjYW4gbWFpbCB5b3UgYSBjb3B5IGltbWVkaWF0ZWx5LgogKgogKiBAY2F0ZWdvcnkgICBEYXRhYmFzZQogKiBAcGFja2FnZSAgICBEQgogKiBAYXV0aG9yICAgICBEYW5pZWwgQ29udmlzc29yIDxkYW5pZWxjQHBocC5uZXQ+CiAqIEBjb3B5cmlnaHQgIDE5OTctMjAwNSBUaGUgUEhQIEdyb3VwCiAqIEBsaWNlbnNlICAgIGh0dHA6Ly93d3cucGhwLm5ldC9saWNlbnNlLzNfMC50eHQgIFBIUCBMaWNlbnNlIDMuMAogKiBAdmVyc2lvbiAgICAkSWQ6IGVycm9ycy5pbmMsdiAxLjM5IDIwMDcvMDYvMjkgMTI6NTE6MzEgYWhhcnZleSBFeHAgJAogKiBAbGluayAgICAgICBodHRwOi8vcGVhci5waHAubmV0L3BhY2thZ2UvREIKICovCgovKioKICogRGV0ZXJtaW5lIGlmIHRoZSBlcnJvciBmcm9tIHRoZSBkcml2ZXIgbWF0Y2hlcyB0aGUgZXJyb3Igd2UgZXhwZWN0CiAqCiAqIElmIHRoaW5ncyBhcmUgYXMgd2UgZXhwZWN0LCBwcmludCBvdXQgIm1hdGNoZXMgZXhwZWN0ZWQgb3V0Y29tZSIKICoKICogSWYgdGhpbmdzIGdvIHdyb25nLCBwcmludCAiVU5FWFBFQ1RFRCBPVVRDT01FIiBhbmQgZGlzcGxheSB0aGUKICogZXJyb3IncyBpbmZvcm1hdGlvbi4KICoKICogQHBhcmFtIG9iamVjdCAgJGUgICAgICAgICAgICAgICAgIHRoZSBEQl9FcnJvciBvYmplY3QgZnJvbSB0aGUgcXVlcnkKICogQHBhcmFtIGludCAgICAgJGV4cGVjdGVkX2RiX2NvZGUgIHRoZSBEQl9FUlJPUiogY29uc3RhbnQgdG8gZXhwZWN0CiAqIEBwYXJhbSBib29sZWFuICRzaG91bGRfYmVfZXJyb3IgICBkb2VzIHRoZSBEQk1TIGNvbnNpZGVyIHRoaXMgYW4gZXJyb3I/CiAqCiAqIEByZXR1cm4gdm9pZAogKi8KZnVuY3Rpb24gY2hlY2tfZXJyb3IoJGUsICRleHBlY3RlZF9kYl9jb2RlLCAkc2hvdWxkX2JlX2Vycm9yID0gdHJ1ZSkgewogICAgaWYgKCRzaG91bGRfYmVfZXJyb3IpIHsKICAgICAgICBpZiAoREI6OmlzRXJyb3IoJGUpKSB7CiAgICAgICAgICAgIGlmICgkZS0+Z2V0Q29kZSgpID09ICRleHBlY3RlZF9kYl9jb2RlKSB7CiAgICAgICAgICAgICAgICBwcmludCAibWF0Y2hlcyBleHBlY3RlZCBvdXRjb21lXG4iOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgcHJpbnQgIlVORVhQRUNURUQgT1VUQ09NRS4uLlxuIjsKICAgICAgICAgICAgICAgIHByaW50ICcgICAgUEVBUjo6REIgZXJyb3Jjb2RlOiAnIC4gJGUtPmdldENvZGUoKSAuICJcbiI7CiAgICAgICAgICAgICAgICBwcmludCAnICAgICcgLiAkZS0+Z2V0VXNlckluZm8oKSAuICJcbiI7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBwcmludCAiXG4gICAgVU5FWFBFQ1RFRCBPVVRDT01FLi4uIGV4cGVjdGVkIGVycm9yIGJ1dCBpdCB3YXNuJ3RcbiI7CiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICBpZiAoREI6OmlzRXJyb3IoJGUpKSB7CiAgICAgICAgICAgIHByaW50ICJVTkVYUEVDVEVEIE9VVENPTUUuLi4gZGlkbid0IGV4cGVjdCBlcnJvciBidXQgaXQgd2FzXG4iOwogICAgICAgICAgICBwcmludCAnICAgIFBFQVI6OkRCIGVycm9yY29kZTogJyAuICRlLT5nZXRDb2RlKCkgLiAiXG4iOwogICAgICAgICAgICBwcmludCAnICAgICcgLiAkZS0+Z2V0VXNlckluZm8oKSAuICJcbiI7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcHJpbnQgIm1hdGNoZXMgZXhwZWN0ZWQgb3V0Y29tZVxuIjsKICAgICAgICB9CiAgICB9Cn0KCi8qKgogKiBMb2NhbCBlcnJvciBjYWxsYmFjayBoYW5kbGVyCiAqIAogKiBAcGFyYW0gb2JqZWN0ICAkbyAgUEVBUiBlcnJvciBvYmplY3QgYXV0b21hdGljYWxseSBwYXNzZWQgdG8gdGhpcyBtZXRob2QKICogQHJldHVybiB2b2lkCiAqIEBzZWUgUEVBUjo6c2V0RXJyb3JIYW5kbGluZygpCiAqLwpmdW5jdGlvbiBwZSgkbykgewogICAgcHJpbnQgIlxuLS0tLS0tLS0tLS0tLS0tXG4iOwogICAgcHJpbnQgIkhhdmluZyBwcm9ibGVtcyBjcmVhdGluZyBhIHRhYmxlIGZvciB0ZXN0aW5nLi4uXG4iOwogICAgcHJpbnQgJG8tPmdldERlYnVnSW5mbygpIC4gIlxuIjsKICAgIHByaW50ICItLS0tLS0tLS0tLS0tLS1cbiI7Cn0KCgokZGJoLT5zZXRFcnJvckhhbmRsaW5nKFBFQVJfRVJST1JfUkVUVVJOKTsKCgpwcmludCAnREJfRVJST1JfTk9TVUNIVEFCTEUgZm9yIHNlbGVjdDogICc7CiRyZXMgPSAkZGJoLT5xdWVyeSgnU0VMRUNUICogRlJPTSB0YWJsZVRoYXRzQm9ndXMnKTsKY2hlY2tfZXJyb3IoJHJlcywgREJfRVJST1JfTk9TVUNIVEFCTEUpOwoKcHJpbnQgJ0RCX0VSUk9SX05PU1VDSFRBQkxFIGZvciBkcm9wOiAgJzsKJHJlcyA9IGRyb3BfdGFibGUoJGRiaCwgJ3RhYmxlVGhhdHNCb2d1cycpOwpjaGVja19lcnJvcigkcmVzLCBEQl9FUlJPUl9OT1NVQ0hUQUJMRSk7CgpwcmludCAnREJfRVJST1JfTk9UX0ZPVU5EIGZvciBkcm9wIGluZGV4OiAgJzsKc3dpdGNoICgkZGJoLT5waHB0eXBlIC4gJzonIC4gJGRiaC0+ZGJzeW50YXgpIHsKICAgIGNhc2UgJ2Zic3FsOmZic3FsJzoKICAgIGNhc2UgJ2liYXNlOmZpcmViaXJkJzoKICAgIGNhc2UgJ2liYXNlOmliYXNlJzoKICAgIGNhc2UgJ2lmeDppZngnOgogICAgY2FzZSAnb2RiYzpkYjInOgogICAgY2FzZSAnb2NpODpvY2k4JzoKICAgIGNhc2UgJ3Bnc3FsOnBnc3FsJzoKICAgIGNhc2UgJ3NxbGl0ZTpzcWxpdGUnOgogICAgICAgICRyZXMgPSAkZGJoLT5xdWVyeSgnRFJPUCBJTkRFWCBmYWtlaW5kZXgnKTsKICAgICAgICBicmVhazsKICAgIGNhc2UgJ21zc3FsOm1zc3FsJzoKICAgIGNhc2UgJ3N5YmFzZTpzeWJhc2UnOgogICAgICAgICRyZXMgPSAkZGJoLT5xdWVyeSgnRFJPUCBJTkRFWCBwaHB0ZXN0LmZha2VpbmRleCcpOwogICAgICAgIGJyZWFrOwogICAgY2FzZSAnbXNxbDptc3FsJzoKICAgICAgICAkcmVzID0gJGRiaC0+cXVlcnkoJ0RST1AgSU5ERVggZmFrZWluZGV4IEZST00gcGhwdGVzdCcpOwogICAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgICAkcmVzID0gJGRiaC0+cXVlcnkoJ0RST1AgSU5ERVggZmFrZWluZGV4IE9OIHBocHRlc3QnKTsKfQpjaGVja19lcnJvcigkcmVzLCBEQl9FUlJPUl9OT1RfRk9VTkQpOwoKCnByaW50ICdEQl9FUlJPUl9BTFJFQURZX0VYSVNUUyBmb3IgY3JlYXRlIHRhYmxlOiAgJzsKJHJlcyA9ICRkYmgtPnF1ZXJ5KCR0ZXN0X21rdGFibGVfcXVlcnkpOwpjaGVja19lcnJvcigkcmVzLCBEQl9FUlJPUl9BTFJFQURZX0VYSVNUUyk7CgpwcmludCAnREJfRVJST1JfQUxSRUFEWV9FWElTVFMgZm9yIGNyZWF0ZSBpbmRleDogICc7CiRyZXMgPSBkcm9wX3RhYmxlKCRkYmgsICdhJyk7CiRkYmgtPnB1c2hFcnJvckhhbmRsaW5nKFBFQVJfRVJST1JfQ0FMTEJBQ0ssICdwZScpOwokcmVzID0gJGRiaC0+cXVlcnkoJ0NSRUFURSBUQUJMRSBhIChhIElOVEVHRVIpJyk7CiRkYmgtPnBvcEVycm9ySGFuZGxpbmcoKTsKJHJlcyA9ICRkYmgtPnF1ZXJ5KCdDUkVBVEUgSU5ERVggYWFfaWR4IE9OIGEgKGEpJyk7CiRyZXMgPSAkZGJoLT5xdWVyeSgnQ1JFQVRFIElOREVYIGFhX2lkeCBPTiBhIChhKScpOwpzd2l0Y2ggKCRkYmgtPnBocHR5cGUpIHsKICAgIGNhc2UgJ2Zic3FsJzoKICAgICAgICAvLyBGcm9udEJhc2UgZG9lc24ndCBhc3NpZ24gYSBzcGVjaWZpYyBjb2RlIGZvciB0aGlzIHlldC4KICAgICAgICBjaGVja19lcnJvcigkcmVzLCBEQl9FUlJPUl9BTFJFQURZX0VYSVNUUywgZmFsc2UpOwogICAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgICBjaGVja19lcnJvcigkcmVzLCBEQl9FUlJPUl9BTFJFQURZX0VYSVNUUyk7Cn0KJHJlcyA9IGRyb3BfdGFibGUoJGRiaCwgJ2EnKTsKCgpwcmludCAnREJfRVJST1JfQ09OU1RSQUlOVCBmb3IgcHJpbWFyeSBrZXkgaW5zZXJ0IGR1cGxpY2F0ZTogICc7CiRyZXMgPSBkcm9wX3RhYmxlKCRkYmgsICdhJyk7CiRkYmgtPnB1c2hFcnJvckhhbmRsaW5nKFBFQVJfRVJST1JfQ0FMTEJBQ0ssICdwZScpOwpzd2l0Y2ggKCRkYmgtPnBocHR5cGUpIHsKICAgIGNhc2UgJ21zcWwnOgogICAgICAgICRyZXMgPSAkZGJoLT5xdWVyeSgnQ1JFQVRFIFRBQkxFIGEgKGEgSU5URUdFUiBOT1QgTlVMTCknKTsKICAgICAgICAkcmVzID0gJGRiaC0+cXVlcnkoJ0NSRUFURSBVTklRVUUgSU5ERVggYXBrIE9OIGEgKGEpJyk7CiAgICAgICAgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICAgICRyZXMgPSAkZGJoLT5xdWVyeSgnQ1JFQVRFIFRBQkxFIGEgKGEgSU5URUdFUiBOT1QgTlVMTCwgUFJJTUFSWSBLRVkgKGEpKScpOwp9CiRkYmgtPnBvcEVycm9ySGFuZGxpbmcoKTsKJHJlcyA9ICRkYmgtPnF1ZXJ5KCdJTlNFUlQgSU5UTyBhIFZBTFVFUyAoMSknKTsKJHJlcyA9ICRkYmgtPnF1ZXJ5KCdJTlNFUlQgSU5UTyBhIFZBTFVFUyAoMSknKTsKY2hlY2tfZXJyb3IoJHJlcywgREJfRVJST1JfQ09OU1RSQUlOVCk7CgoKcHJpbnQgJ0RCX0VSUk9SX0NPTlNUUkFJTlQgZm9yIHByaW1hcnkga2V5IHVwZGF0ZSBkdXBsaWNhdGU6ICAnOwokcmVzID0gJGRiaC0+cXVlcnkoJ0lOU0VSVCBJTlRPIGEgVkFMVUVTICgyKScpOwokcmVzID0gJGRiaC0+cXVlcnkoJ1VQREFURSBhIFNFVCBhPTEgV0hFUkUgYT0yJyk7CmNoZWNrX2Vycm9yKCRyZXMsIERCX0VSUk9SX0NPTlNUUkFJTlQpOwoKCnByaW50ICdEQl9FUlJPUl9DT05TVFJBSU5UIGZvciB1bmlxdWUga2V5IGluc2VydCBkdXBsaWNhdGU6ICAnOwokcmVzID0gZHJvcF90YWJsZSgkZGJoLCAnYScpOwokZGJoLT5wdXNoRXJyb3JIYW5kbGluZyhQRUFSX0VSUk9SX0NBTExCQUNLLCAncGUnKTsKc3dpdGNoICgkZGJoLT5waHB0eXBlKSB7CiAgICBjYXNlICdtc3FsJzoKICAgICAgICAkcmVzID0gJGRiaC0+cXVlcnkoJ0NSRUFURSBUQUJMRSBhIChhIElOVEVHRVIgTk9UIE5VTEwpJyk7CiAgICAgICAgJHJlcyA9ICRkYmgtPnF1ZXJ5KCdDUkVBVEUgVU5JUVVFIElOREVYIGF1ayBPTiBhIChhKScpOwogICAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgICAkcmVzID0gJGRiaC0+cXVlcnkoJ0NSRUFURSBUQUJMRSBhIChhIElOVEVHRVIgTk9UIE5VTEwsIFVOSVFVRSAoYSkpJyk7Cn0KJGRiaC0+cG9wRXJyb3JIYW5kbGluZygpOwokcmVzID0gJGRiaC0+cXVlcnkoJ0lOU0VSVCBJTlRPIGEgVkFMVUVTICgxKScpOwokcmVzID0gJGRiaC0+cXVlcnkoJ0lOU0VSVCBJTlRPIGEgVkFMVUVTICgxKScpOwpjaGVja19lcnJvcigkcmVzLCBEQl9FUlJPUl9DT05TVFJBSU5UKTsKCgpwcmludCAnREJfRVJST1JfQ09OU1RSQUlOVCBmb3IgdW5pcXVlIGtleSB1cGRhdGUgZHVwbGljYXRlOiAgJzsKJHJlcyA9ICRkYmgtPnF1ZXJ5KCdJTlNFUlQgSU5UTyBhIFZBTFVFUyAoMiknKTsKJHJlcyA9ICRkYmgtPnF1ZXJ5KCdVUERBVEUgYSBTRVQgYT0xIFdIRVJFIGE9MicpOwpjaGVja19lcnJvcigkcmVzLCBEQl9FUlJPUl9DT05TVFJBSU5UKTsKCgpwcmludCAnREJfRVJST1JfQ09OU1RSQUlOVCBmb3IgZm9yZWlnbiBrZXkgb24gaW5zZXJ0OiAgJzsKJHJlcyA9IGRyb3BfdGFibGUoJGRiaCwgJ2InKTsKJHJlcyA9IGRyb3BfdGFibGUoJGRiaCwgJ2EnKTsKJGRiaC0+cHVzaEVycm9ySGFuZGxpbmcoUEVBUl9FUlJPUl9DQUxMQkFDSywgJ3BlJyk7CnN3aXRjaCAoJGRiaC0+cGhwdHlwZSkgewogICAgY2FzZSAnbXlzcWwnOgogICAgY2FzZSAnbXlzcWxpJzoKICAgICAgICAkcmVzID0gJGRiaC0+cXVlcnkoJ0NSRUFURSBUQUJMRSBhIChhIElOVCBOT1QgTlVMTCwgJwogICAgICAgICAgICAgICAgICAgIC4gJ1BSSU1BUlkgS0VZIChhKSkgJwogICAgICAgICAgICAgICAgICAgIC4gJ1RZUEU9SU5OT0RCJyk7CiAgICAgICAgJHJlcyA9ICRkYmgtPnF1ZXJ5KCdDUkVBVEUgVEFCTEUgYiAoYiBJTlQsICcKICAgICAgICAgICAgICAgICAgICAuICdJTkRFWCBwYXJfaW5kIChiKSwgJwogICAgICAgICAgICAgICAgICAgIC4gJ0ZPUkVJR04gS0VZIChiKSBSRUZFUkVOQ0VTIGEgKGEpKSAnCiAgICAgICAgICAgICAgICAgICAgLiAnVFlQRT1JTk5PREInKTsKICAgICAgICAkZGJoLT5wb3BFcnJvckhhbmRsaW5nKCk7CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSAnbXNxbCc6CiAgICAgICAgLy8gbXNxbCBkb2VzIG5vdCBzdXBwb3J0IGZvcmVpZ24ga2V5cwogICAgICAgICRyZXMgPSAkZGJoLT5xdWVyeSgnQ1JFQVRFIFRBQkxFIGEgKGEgSU5URUdFUiBOT1QgTlVMTCknKTsKICAgICAgICAkcmVzID0gJGRiaC0+cXVlcnkoJ0NSRUFURSBVTklRVUUgSU5ERVggYXVrIE9OIGEgKGEpJyk7CiAgICAgICAgJGRiaC0+cG9wRXJyb3JIYW5kbGluZygpOwogICAgICAgICRyZXMgPSAkZGJoLT5xdWVyeSgnQ1JFQVRFIFRBQkxFIGIgKGIgSU5URUdFUiBSRUZFUkVOQ0VTIGEgKGEpKScpOwogICAgICAgIGlmIChEQjo6aXNFcnJvcigkcmVzKSkgewogICAgICAgICAgICBwcmludCAibWF0Y2hlcyBleHBlY3RlZCBvdXRjb21lXG4iOwogICAgICAgICAgICBwcmludCAiREJfRVJST1JfQ09OU1RSQUlOVCBmb3IgZm9yZWlnbiBrZXkgb24gZGVsZXRlOiAgbWF0Y2hlcyBleHBlY3RlZCBvdXRjb21lXG4iOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHByaW50ICJXT1csIGl0IHNlZW1zIG1TUUwgbm93IHN1cHBvcnRzIHJlZmVyZW5jZXNcbiI7CiAgICAgICAgICAgIHByaW50ICJXT1csIGl0IHNlZW1zIG1TUUwgbm93IHN1cHBvcnRzIHJlZmVyZW5jZXNcbiI7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwoKICAgIGRlZmF1bHQ6CiAgICAgICAgJHJlcyA9ICRkYmgtPnF1ZXJ5KCdDUkVBVEUgVEFCTEUgYSAoYSBJTlRFR0VSIE5PVCBOVUxMLCBQUklNQVJZIEtFWSAoYSkpJyk7CiAgICAgICAgJHJlcyA9ICRkYmgtPnF1ZXJ5KCdDUkVBVEUgVEFCTEUgYiAoYiBJTlRFR0VSIFJFRkVSRU5DRVMgYSAoYSkpJyk7CiAgICAgICAgJGRiaC0+cG9wRXJyb3JIYW5kbGluZygpOwp9CgppZiAoJGRiaC0+cGhwdHlwZSAhPSAnbXNxbCcpIHsKICAgICRyZXMgPSAkZGJoLT5xdWVyeSgnSU5TRVJUIElOVE8gYSAoYSkgdmFsdWVzICgxKScpOwogICAgJHJlcyA9ICRkYmgtPnF1ZXJ5KCdJTlNFUlQgSU5UTyBiIChiKSB2YWx1ZXMgKDIpJyk7CiAgICBzd2l0Y2ggKCRkYmgtPnBocHR5cGUpIHsKICAgICAgICBjYXNlICdzcWxpdGUnOgogICAgICAgICAgICBjaGVja19lcnJvcigkcmVzLCBEQl9FUlJPUl9DT05TVFJBSU5ULCBmYWxzZSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIGNoZWNrX2Vycm9yKCRyZXMsIERCX0VSUk9SX0NPTlNUUkFJTlQpOwogICAgfSAgIAoKICAgIHByaW50ICdEQl9FUlJPUl9DT05TVFJBSU5UIGZvciBmb3JlaWduIGtleSBvbiBkZWxldGU6ICAnOwogICAgJHJlcyA9ICRkYmgtPnF1ZXJ5KCdJTlNFUlQgSU5UTyBiIChiKSB2YWx1ZXMgKDEpJyk7CiAgICAkcmVzID0gJGRiaC0+cXVlcnkoJ0RFTEVURSBGUk9NIGEgV0hFUkUgYSA9IDEnKTsKICAgIHN3aXRjaCAoJGRiaC0+cGhwdHlwZSkgewogICAgICAgIGNhc2UgJ3NxbGl0ZSc6CiAgICAgICAgICAgIGNoZWNrX2Vycm9yKCRyZXMsIERCX0VSUk9SX0NPTlNUUkFJTlQsIGZhbHNlKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgY2hlY2tfZXJyb3IoJHJlcywgREJfRVJST1JfQ09OU1RSQUlOVCk7CiAgICB9Cn0KCgpwcmludCAnREJfRVJST1JfQ09OU1RSQUlOVF9OT1RfTlVMTCBvbiBpbnNlcnQ6ICAnOwokcmVzID0gZHJvcF90YWJsZSgkZGJoLCAncGVhcnRlc3RudWxsJyk7CiRkYmgtPnB1c2hFcnJvckhhbmRsaW5nKFBFQVJfRVJST1JfQ0FMTEJBQ0ssICdwZScpOwokcmVzID0gJGRiaC0+cXVlcnkoJ0NSRUFURSBUQUJMRSBwZWFydGVzdG51bGwgKGEgQ0hBUigzKSBOT1QgTlVMTCknKTsKJGRiaC0+cG9wRXJyb3JIYW5kbGluZygpOwokcmVzID0gJGRiaC0+cXVlcnkoJ0lOU0VSVCBJTlRPIHBlYXJ0ZXN0bnVsbCBWQUxVRVMgKE5VTEwpJyk7CmNoZWNrX2Vycm9yKCRyZXMsIERCX0VSUk9SX0NPTlNUUkFJTlRfTk9UX05VTEwpOwoKCnByaW50ICdEQl9FUlJPUl9DT05TVFJBSU5UX05PVF9OVUxMIG9uIHVwZGF0ZTogICc7CiRyZXMgPSAkZGJoLT5xdWVyeSgiSU5TRVJUIElOVE8gcGVhcnRlc3RudWxsIFZBTFVFUyAoJ29uZScpIik7CiRyZXMgPSAkZGJoLT5xdWVyeSgiVVBEQVRFIHBlYXJ0ZXN0bnVsbCBTRVQgYSA9IE5VTEwgV0hFUkUgYSA9ICdvbmUnIik7CnN3aXRjaCAoJGRiaC0+cGhwdHlwZSkgewogICAgY2FzZSAnbXlzcWwnOgogICAgY2FzZSAnbXlzcWxpJzoKICAgICAgICBjaGVja19lcnJvcigkcmVzLCBEQl9FUlJPUl9DT05TVFJBSU5UX05PVF9OVUxMLCBmYWxzZSk7CiAgICAgICAgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICAgIGNoZWNrX2Vycm9yKCRyZXMsIERCX0VSUk9SX0NPTlNUUkFJTlRfTk9UX05VTEwpOwp9CgoKcHJpbnQgJ0RCX0VSUk9SX05PU1VDSEZJRUxEIGpvaW5pbmcgT04gYm9ndXMgY29sdW1uOiAgJzsKJHJlcyA9ICRkYmgtPnF1ZXJ5KCdTRUxFQ1QgKiBGUk9NIHBocHRlc3QgSk9JTiBhIE9OIChwaHB0ZXN0LmEgPSBhLmIpJyk7CnN3aXRjaCAoJGRiaC0+cGhwdHlwZSAuICc6JyAuICRkYmgtPmRic3ludGF4KSB7CiAgICBjYXNlICdtc3FsOm1zcWwnOgogICAgY2FzZSAnb2RiYzphY2Nlc3MnOgogICAgICAgIGNoZWNrX2Vycm9yKCRyZXMsIERCX0VSUk9SX1NZTlRBWCk7CiAgICAgICAgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICAgIGNoZWNrX2Vycm9yKCRyZXMsIERCX0VSUk9SX05PU1VDSEZJRUxEKTsKfQoKCnByaW50ICdEQl9FUlJPUl9OT1NVQ0hGSUVMRCBqb2luaW5nIFVTSU5HIGJvZ3VzIGNvbHVtbjogICc7CiRyZXMgPSAkZGJoLT5xdWVyeSgnU0VMRUNUICogRlJPTSBwaHB0ZXN0IEpPSU4gYSBVU0lORyAoYiknKTsKc3dpdGNoICgkZGJoLT5waHB0eXBlIC4gJzonIC4gJGRiaC0+ZGJzeW50YXgpIHsKICAgIGNhc2UgJ2liYXNlOmZpcmViaXJkJzoKICAgICAgICAvKiBGaXJlYmlyZFNRTCAyIHJldHVybnMgLTkwMiAoZmVhdHVyZSBpcyBub3Qgc3VwcG9ydGVkKSBmb3IgdGhpcyB0ZXN0CiAgICAgICAgICogcmF0aGVyIHRoYW4gYSBzeW50YXggZXJyb3IuIEZvciBub3csIHdlJ2xsIHRlc3QgZm9yIGJvdGguICovCiAgICAgICAgaWYgKCRyZXMtPmdldENvZGUoKSA9PSBEQl9FUlJPUl9TWU5UQVgpCiAgICAgICAgICAgIGNoZWNrX2Vycm9yKCRyZXMsIERCX0VSUk9SX1NZTlRBWCk7CiAgICAgICAgZWxzZQogICAgICAgICAgICBjaGVja19lcnJvcigkcmVzLCBEQl9FUlJPUl9OT1RfQ0FQQUJMRSk7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlICdpYmFzZTppYmFzZSc6CiAgICBjYXNlICdpZng6aWZ4JzoKICAgIGNhc2UgJ21zcWw6bXNxbCc6CiAgICBjYXNlICdvZGJjOmFjY2Vzcyc6CiAgICBjYXNlICdvZGJjOmRiMic6CiAgICBjYXNlICdzeWJhc2U6c3liYXNlJzoKICAgICAgICBjaGVja19lcnJvcigkcmVzLCBEQl9FUlJPUl9TWU5UQVgpOwogICAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgICBjaGVja19lcnJvcigkcmVzLCBEQl9FUlJPUl9OT1NVQ0hGSUVMRCk7Cn0KCgpwcmludCAnREJfRVJST1JfRElWWkVSTzogICc7Ci8vIEludGVyYmFzZSBkZXRlY3RzIHRoZSBlcnJvciBvbiBmZXRjaGluZwokcmVzID0gJGRiaC0+Z2V0QWxsKCdTRUxFQ1QgMC8wIEZST00gcGhwdGVzdCcpOwpzd2l0Y2ggKCRkYmgtPnBocHR5cGUpIHsKICAgIGNhc2UgJ29kYmMnOgogICAgICAgIHN3aXRjaCAoJGRiaC0+ZGJzeW50YXgpIHsKICAgICAgICAgICAgY2FzZSAnYWNjZXNzJzoKICAgICAgICAgICAgICAgIGNoZWNrX2Vycm9yKCRyZXMsIERCX0VSUk9SX0RJVlpFUk8sIGZhbHNlKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdkYjInOgogICAgICAgICAgICAgICAgY2hlY2tfZXJyb3IoJHJlcywgREJfRVJST1JfRElWWkVSTyk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICBjYXNlICdtc3FsJzoKICAgICAgICBjaGVja19lcnJvcigkcmVzLCBEQl9FUlJPUl9TWU5UQVgpOwogICAgICAgIGJyZWFrOwogICAgY2FzZSAnZmJzcWwnOgogICAgY2FzZSAnaWJhc2UnOgogICAgY2FzZSAnbXNzcWwnOgogICAgY2FzZSAnbXlzcWwnOgogICAgY2FzZSAnbXlzcWxpJzoKICAgIGNhc2UgJ3NxbGl0ZSc6CiAgICAgICAgLyogTm90IGFsbCBkYXRhYmFzZXMgZGV0ZWN0IGRpdmlzaW9uIGJ5IHplcm8gZXJyb3JzLiBXZSBjYWxsIHRoZXNlCiAgICAgICAgICogZGF0YWJhc2VzICJicm9rZW4iLiAqLwogICAgICAgIGNoZWNrX2Vycm9yKCRyZXMsIG51bGwsIGZhbHNlKTsKICAgICAgICBicmVhazsKICAgIGRlZmF1bHQ6CiAgICAgICAgY2hlY2tfZXJyb3IoJHJlcywgREJfRVJST1JfRElWWkVSTyk7Cn0KCgpwcmludCAnREJfRVJST1JfSU5WQUxJRF9OVU1CRVIgcHV0dGluZyBjaGFycyBpbiBJTlQgY29sdW1uOiAgJzsKJHJlcyA9ICRkYmgtPnF1ZXJ5KCJVUERBVEUgcGhwdGVzdCBTRVQgYSA9ICdhYmMnIFdIRVJFIGEgPSA0MiIpOwpzd2l0Y2ggKCRkYmgtPnBocHR5cGUpIHsKICAgIGNhc2UgJ215c3FsJzoKICAgIGNhc2UgJ215c3FsaSc6CiAgICBjYXNlICdzcWxpdGUnOgogICAgICAgIGNoZWNrX2Vycm9yKCRyZXMsIERCX0VSUk9SX0lOVkFMSURfTlVNQkVSLCBmYWxzZSk7CiAgICAgICAgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICAgIGNoZWNrX2Vycm9yKCRyZXMsIERCX0VSUk9SX0lOVkFMSURfTlVNQkVSKTsKfQoKCnByaW50ICdEQl9FUlJPUl9JTlZBTElEX05VTUJFUiBwdXR0aW5nIGZsb2F0IGluIElOVCBjb2x1bW46ICAnOwokcmVzID0gJGRiaC0+cXVlcnkoIlVQREFURSBwaHB0ZXN0IFNFVCBhID0gOC45IFdIRVJFIGEgPSA0MiIpOwpzd2l0Y2ggKCRkYmgtPnBocHR5cGUpIHsKICAgIGNhc2UgJ2Zic3FsJzoKICAgIGNhc2UgJ2liYXNlJzoKICAgIGNhc2UgJ2lmeCc6CiAgICBjYXNlICdtc3NxbCc6CiAgICBjYXNlICdteXNxbCc6CiAgICBjYXNlICdteXNxbGknOgogICAgY2FzZSAnb2NpOCc6CiAgICBjYXNlICdvZGJjJzoKICAgIGNhc2UgJ3Bnc3FsJzoKICAgIGNhc2UgJ3NxbGl0ZSc6CiAgICAgICAgY2hlY2tfZXJyb3IoJHJlcywgREJfRVJST1JfSU5WQUxJRF9OVU1CRVIsIGZhbHNlKTsKICAgICAgICBicmVhazsKICAgIGRlZmF1bHQ6CiAgICAgICAgY2hlY2tfZXJyb3IoJHJlcywgREJfRVJST1JfSU5WQUxJRF9OVU1CRVIpOwp9CgoKcHJpbnQgJ0RCX0VSUk9SX0lOVkFMSURfTlVNQkVSIHB1dHRpbmcgZXhjZXNzaXZlIGludCBpbiBJTlQgY29sdW1uOiAgJzsKJHJlcyA9ICRkYmgtPnF1ZXJ5KCJVUERBVEUgcGhwdGVzdCBTRVQgYSA9IDE4NDQ2NzQ0MDczNzA5NTUxNjE2IFdIRVJFIGEgPSA0MiIpOwpzd2l0Y2ggKCRkYmgtPnBocHR5cGUgLiAnOicgLiAkZGJoLT5kYnN5bnRheCkgewogICAgY2FzZSAnaWJhc2U6aWJhc2UnOgogICAgY2FzZSAnaWJhc2U6ZmlyZWJpcmQnOgogICAgICAgIGNoZWNrX2Vycm9yKCRyZXMsIERCX0VSUk9SX1NZTlRBWCk7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlICdmYnNxbDpmYnNxbCc6CiAgICBjYXNlICdpZng6aWZ4JzoKICAgIGNhc2UgJ21zcWw6bXNxbCc6CiAgICBjYXNlICdtc3NxbDptc3NxbCc6CiAgICBjYXNlICdteXNxbDpteXNxbCc6CiAgICBjYXNlICdteXNxbGk6bXlzcWxpJzoKICAgIGNhc2UgJ29jaTg6b2NpOCc6CiAgICBjYXNlICdvZGJjOmFjY2Vzcyc6CiAgICBjYXNlICdzcWxpdGU6c3FsaXRlJzoKICAgICAgICBjaGVja19lcnJvcigkcmVzLCBEQl9FUlJPUl9JTlZBTElEX05VTUJFUiwgZmFsc2UpOwogICAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgICBjaGVja19lcnJvcigkcmVzLCBEQl9FUlJPUl9JTlZBTElEX05VTUJFUik7Cn0KCgpwcmludCAnREJfRVJST1JfSU5WQUxJRF9OVU1CRVIgcHV0dGluZyBpbnQgaW4gQ0hBUiBjb2x1bW46ICAnOwokcmVzID0gJGRiaC0+cXVlcnkoIlVQREFURSBwaHB0ZXN0IFNFVCBiID0gOCBXSEVSRSBhID0gNDIiKTsKc3dpdGNoICgkZGJoLT5waHB0eXBlIC4gJzonIC4gJGRiaC0+ZGJzeW50YXgpIHsKICAgIGNhc2UgJ2liYXNlOmliYXNlJzoKICAgIGNhc2UgJ2liYXNlOmZpcmViaXJkJzoKICAgIGNhc2UgJ2lmeDppZngnOgogICAgY2FzZSAnbXNzcWw6bXNzcWwnOgogICAgY2FzZSAnbXlzcWw6bXlzcWwnOgogICAgY2FzZSAnbXlzcWxpOm15c3FsaSc6CiAgICBjYXNlICdvY2k4Om9jaTgnOgogICAgY2FzZSAnb2RiYzphY2Nlc3MnOgogICAgY2FzZSAncGdzcWw6cGdzcWwnOgogICAgY2FzZSAnc3FsaXRlOnNxbGl0ZSc6CiAgICAgICAgY2hlY2tfZXJyb3IoJHJlcywgREJfRVJST1JfSU5WQUxJRF9OVU1CRVIsIGZhbHNlKTsKICAgICAgICBicmVhazsKICAgIGRlZmF1bHQ6CiAgICAgICAgY2hlY2tfZXJyb3IoJHJlcywgREJfRVJST1JfSU5WQUxJRF9OVU1CRVIpOwp9CgoKcHJpbnQgJ0RCX0VSUk9SX05PU1VDSEZJRUxEOiAgJzsKJHJlcyA9ICRkYmgtPnF1ZXJ5KCdTRUxFQ1QgZSBGUk9NIHBocHRlc3QnKTsKY2hlY2tfZXJyb3IoJHJlcywgREJfRVJST1JfTk9TVUNIRklFTEQpOwoKCnByaW50ICdEQl9FUlJPUl9TWU5UQVg6ICAnOwokcmVzID0gJGRiaC0+cXVlcnkoJ0NSRUFURScpOwpjaGVja19lcnJvcigkcmVzLCBEQl9FUlJPUl9TWU5UQVgpOwoKCnByaW50ICdEQl9FUlJPUl9WQUxVRV9DT1VOVF9PTl9ST1c6ICAnOwokcmVzID0gJGRiaC0+cXVlcnkoJ0lOU0VSVCBJTlRPIHBocHRlc3QgKGEpIFZBTFVFUyAoNjc4LCAyKScpOwpzd2l0Y2ggKCRkYmgtPnBocHR5cGUpIHsKICAgIGNhc2UgJ21zcWwnOgogICAgICAgIGNoZWNrX2Vycm9yKCRyZXMsIERCX0VSUk9SX1ZBTFVFX0NPVU5UX09OX1JPVywgZmFsc2UpOwogICAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgICBjaGVja19lcnJvcigkcmVzLCBEQl9FUlJPUl9WQUxVRV9DT1VOVF9PTl9ST1cpOwp9CgoKcHJpbnQgJ0RCX0VSUk9SX0lOVkFMSUQgb24gQ0hBUiBjb2x1bW4gZGF0YSB0b28gbG9uZzogICc7CiRyZXMgPSAkZGJoLT5xdWVyeSgiSU5TRVJUIElOVE8gcGhwdGVzdCAoYikgVkFMVUVTICgnMTIzNDU2Nzg5LjEyMzQ1Njc4OS4xMjM0NTY3ODkuMTIzNDU2Nzg5LjEnKSIpOwpzd2l0Y2ggKCRkYmgtPnBocHR5cGUgLiAnOicgLiAkZGJoLT5kYnN5bnRheCkgewogICAgY2FzZSAnaWZ4OmlmeCc6CiAgICBjYXNlICdtc3FsOm1zcWwnOgogICAgY2FzZSAnbXNzcWw6bXNzcWwnOgogICAgY2FzZSAnbXlzcWw6bXlzcWwnOgogICAgY2FzZSAnbXlzcWxpOm15c3FsaSc6CiAgICBjYXNlICdvZGJjOmFjY2Vzcyc6CiAgICBjYXNlICdzcWxpdGU6c3FsaXRlJzoKICAgIGNhc2UgJ3N5YmFzZTpzeWJhc2UnOgogICAgICAgIGNoZWNrX2Vycm9yKCRyZXMsIERCX0VSUk9SX0lOVkFMSUQsIGZhbHNlKTsKICAgICAgICBicmVhazsKICAgIGNhc2UgJ2Zic3FsOmZic3FsJzoKICAgICAgICBjaGVja19lcnJvcigkcmVzLCBEQl9FUlJPUl9UUlVOQ0FURUQpOwogICAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgICBjaGVja19lcnJvcigkcmVzLCBEQl9FUlJPUl9JTlZBTElEKTsKfQoKCnByaW50ICdEQl9FUlJPUl9JTlZBTElEIG9uIFZBUkNIQVIgY29sdW1uIGRhdGEgdG9vIGxvbmc6ICAnOwokcmVzID0gJGRiaC0+cXVlcnkoIklOU0VSVCBJTlRPIHBocHRlc3QgKGQpIFZBTFVFUyAoJzEyMzQ1Njc4OS4xMjM0NTY3ODkuMScpIik7CnN3aXRjaCAoJGRiaC0+cGhwdHlwZSAuICc6JyAuICRkYmgtPmRic3ludGF4KSB7CiAgICBjYXNlICdpZng6aWZ4JzoKICAgIGNhc2UgJ21zcWw6bXNxbCc6CiAgICBjYXNlICdtc3NxbDptc3NxbCc6CiAgICBjYXNlICdteXNxbDpteXNxbCc6CiAgICBjYXNlICdteXNxbGk6bXlzcWxpJzoKICAgIGNhc2UgJ29kYmM6YWNjZXNzJzoKICAgIGNhc2UgJ3NxbGl0ZTpzcWxpdGUnOgogICAgY2FzZSAnc3liYXNlOnN5YmFzZSc6CiAgICAgICAgY2hlY2tfZXJyb3IoJHJlcywgREJfRVJST1JfSU5WQUxJRCwgZmFsc2UpOwogICAgICAgIGJyZWFrOwogICAgY2FzZSAnZmJzcWw6ZmJzcWwnOgogICAgICAgIGNoZWNrX2Vycm9yKCRyZXMsIERCX0VSUk9SX1RSVU5DQVRFRCk7CiAgICAgICAgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICAgIGNoZWNrX2Vycm9yKCRyZXMsIERCX0VSUk9SX0lOVkFMSUQpOwp9CgoKCmRyb3BfdGFibGUoJGRiaCwgJ3BocHRlc3QnKTsKZHJvcF90YWJsZSgkZGJoLCAnYicpOwpkcm9wX3RhYmxlKCRkYmgsICdhJyk7CmRyb3BfdGFibGUoJGRiaCwgJ3BlYXJ0ZXN0bnVsbCcpOwo=]]></data>
	</file>
	<file>
	  <filename>/lib/pear/tests/fetchmodes.inc</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBUZXN0cyB0aGUgZHJpdmVycycgdmFyaW91cyBmZXRjaCBtZXRob2RzCiAqCiAqIEV4ZWN1dGVkIGJ5IGRyaXZlci8wMmZldGNoLnBocHQKICoKICogUEhQIHZlcnNpb25zIDQgYW5kIDUKICoKICogTElDRU5TRTogVGhpcyBzb3VyY2UgZmlsZSBpcyBzdWJqZWN0IHRvIHZlcnNpb24gMy4wIG9mIHRoZSBQSFAgbGljZW5zZQogKiB0aGF0IGlzIGF2YWlsYWJsZSB0aHJvdWdoIHRoZSB3b3JsZC13aWRlLXdlYiBhdCB0aGUgZm9sbG93aW5nIFVSSToKICogaHR0cDovL3d3dy5waHAubmV0L2xpY2Vuc2UvM18wLnR4dC4gIElmIHlvdSBkaWQgbm90IHJlY2VpdmUgYSBjb3B5IG9mCiAqIHRoZSBQSFAgTGljZW5zZSBhbmQgYXJlIHVuYWJsZSB0byBvYnRhaW4gaXQgdGhyb3VnaCB0aGUgd2ViLCBwbGVhc2UKICogc2VuZCBhIG5vdGUgdG8gbGljZW5zZUBwaHAubmV0IHNvIHdlIGNhbiBtYWlsIHlvdSBhIGNvcHkgaW1tZWRpYXRlbHkuCiAqCiAqIEBjYXRlZ29yeSAgIERhdGFiYXNlCiAqIEBwYWNrYWdlICAgIERCCiAqIEBhdXRob3IgICAgIERhbmllbCBDb252aXNzb3IgPGRhbmllbGNAcGhwLm5ldD4KICogQGNvcHlyaWdodCAgMTk5Ny0yMDA1IFRoZSBQSFAgR3JvdXAKICogQGxpY2Vuc2UgICAgaHR0cDovL3d3dy5waHAubmV0L2xpY2Vuc2UvM18wLnR4dCAgUEhQIExpY2Vuc2UgMy4wCiAqIEB2ZXJzaW9uICAgICRJZDogZmV0Y2htb2Rlcy5pbmMsdiAxLjExIDIwMDUvMDIvMTQgMTc6MDQ6MTQgZGFuaWVsYyBFeHAgJAogKiBAbGluayAgICAgICBodHRwOi8vcGVhci5waHAubmV0L3BhY2thZ2UvREIKICovCgovKioKICogTG9jYWwgZXJyb3IgY2FsbGJhY2sgaGFuZGxlcgogKgogKiBEcm9wcyB0aGUgcGhwdGVzdCB0YWJsZSwgcHJpbnRzIG91dCBhbiBlcnJvciBtZXNzYWdlIGFuZCBraWxscyB0aGUKICogcHJvY2Vzcy4KICoKICogQHBhcmFtIG9iamVjdCAgJG8gIFBFQVIgZXJyb3Igb2JqZWN0IGF1dG9tYXRpY2FsbHkgcGFzc2VkIHRvIHRoaXMgbWV0aG9kCiAqIEByZXR1cm4gdm9pZAogKiBAc2VlIFBFQVI6OnNldEVycm9ySGFuZGxpbmcoKQogKi8KZnVuY3Rpb24gcGUoJG8pIHsKICAgIGdsb2JhbCAkZGJoOwoKICAgICRkYmgtPnNldEVycm9ySGFuZGxpbmcoUEVBUl9FUlJPUl9SRVRVUk4pOwogICAgZHJvcF90YWJsZSgkZGJoLCAncGhwdGVzdCcpOwoKICAgIGRpZSgkby0+dG9TdHJpbmcoKSk7Cn0KCiRkYmgtPnNldEVycm9ySGFuZGxpbmcoUEVBUl9FUlJPUl9DQUxMQkFDSywgJ3BlJyk7CiRkYmgtPnNldE9wdGlvbignYXV0b2ZyZWUnLCB0cnVlKTsKCiRkYmgtPnF1ZXJ5KCJJTlNFUlQgSU5UTyBwaHB0ZXN0IFZBTFVFUyAoMSwgJ29uZScsICdPbmUnLCAnMjAwMS0wMi0xNicpIik7CiRkYmgtPnF1ZXJ5KCJJTlNFUlQgSU5UTyBwaHB0ZXN0IFZBTFVFUyAoMiwgJ3R3bycsICdUd28nLCAnMjAwMS0wMi0xNScpIik7CiRkYmgtPnF1ZXJ5KCJJTlNFUlQgSU5UTyBwaHB0ZXN0IFZBTFVFUyAoMywgJ3RocmVlJywgJ1RocmVlJywgJzIwMDEtMDItMTQnKSIpOwoKcHJpbnQgInRlc3RpbmcgZmV0Y2hyb3c6XG4iOwokc3RoID0gJGRiaC0+cXVlcnkoIlNFTEVDVCAqIEZST00gcGhwdGVzdCIpOwpmb3IgKCRpID0gMTsgJGkgPD0gNTsgJGkrKykgewogICAgcHJpbnQgInJvdyAkaTogIjsKICAgICRyb3cgPSAkc3RoLT5mZXRjaFJvdygpOwogICAgaWYgKERCOjppc0Vycm9yKCRyb3cpKSB7CiAgICAgICAgcHJpbnQgJHJvdy0+dG9TdHJpbmcoKSAuICJcbiI7CiAgICAgICAgY29udGludWU7CiAgICB9CiAgICBpZiAoaXNfYXJyYXkoJHJvdykpIHsKICAgICAgICBwcmludCBpbXBsb2RlKCcsICcsICRyb3cpIC4gIlxuIjsKICAgIH0gZWxzZSB7CiAgICAgICAgdmFyX2R1bXAoJHJvdyk7CiAgICB9Cn0KJHN0aC0+ZnJlZSgpOyAgLy8ga2VlcCBmYnNxbCBoYXBweS4KCiRkYmgtPnF1ZXJ5KCdERUxFVEUgRlJPTSBwaHB0ZXN0IFdIRVJFIGEgPD4gNDInKTsKCgpwcmludCAidGVzdGluZyBmZXRjaG1vZGVzOiBmZXRjaHJvdyBkZWZhdWx0IGRlZmF1bHQsIHBvcnRhYmlsaXR5IG1vZGUgREJfUE9SVEFCSUxJVFlfQUxMIF4gREJfUE9SVEFCSUxJVFlfUlRSSU1cbiI7CiRkYmgtPnNldE9wdGlvbigncG9ydGFiaWxpdHknLCBEQl9QT1JUQUJJTElUWV9BTEwgXiBEQl9QT1JUQUJJTElUWV9SVFJJTSk7CiRzdGggPSAkZGJoLT5xdWVyeSgiU0VMRUNUICogRlJPTSBwaHB0ZXN0Iik7CiRyb3cgPSAkc3RoLT5mZXRjaFJvdygpOwpwcmludCBpbXBsb2RlKCIgIiwgYXJyYXlfa2V5cygkcm93KSkuIlxuIjsKJGFjdHVhbCA9IGltcGxvZGUoJyAnLCBhcnJheV92YWx1ZXMoJHJvdykpOwpzd2l0Y2ggKCRkYmgtPnBocHR5cGUpIHsKICAgIGNhc2UgJ2Zic3FsJzoKICAgIGNhc2UgJ21zcWwnOgogICAgY2FzZSAnbXlzcWwnOgogICAgY2FzZSAnbXlzcWxpJzoKICAgIGNhc2UgJ3NxbGl0ZSc6CiAgICAgICAgJGV4cGVjdGVkID0gJzQyIGJpbmcgVGhpcyBpcyBhIHRlc3QgMTk5OS0xMS0yMSc7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlICdpZngnOgogICAgICAgICRleHBlY3RlZCA9ICc0MiBiaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgaXMgYSB0ZXN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOTk5LTExLTIxICAgICAgICAgICc7CiAgICAgICAgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICAgICRleHBlY3RlZCA9ICc0MiBiaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgaXMgYSB0ZXN0IDE5OTktMTEtMjEnOwp9CmlmICgkYWN0dWFsID09ICRleHBlY3RlZCkgewogICAgZWNobyAib3V0cHV0IG1hdGNoZWQgZXhwZWN0ZWQgZm9ybWF0XG4iOwp9IGVsc2UgewogICAgZWNobyAiRElETidUIE1BVENIISAgRXhwZWN0ZWQgb3V0cHV0OiAnJGV4cGVjdGVkJy4gIEFjdHVhbCBvdXRwdXQ6ICckYWN0dWFsJy5cbiI7Cn0KJHN0aC0+ZnJlZSgpOyAgLy8ga2VlcCBmYnNxbCBoYXBweS4KCnByaW50ICJ0ZXN0aW5nIGZldGNobW9kZXM6IGZldGNoaW50byBkZWZhdWx0IGRlZmF1bHRcbiI7CiRkYmgtPnNldE9wdGlvbigncG9ydGFiaWxpdHknLCBEQl9QT1JUQUJJTElUWV9BTEwpOwokc3RoID0gJGRiaC0+cXVlcnkoIlNFTEVDVCAqIEZST00gcGhwdGVzdCIpOwokcm93ID0gYXJyYXkoKTsKJHN0aC0+ZmV0Y2hJbnRvKCRyb3cpOwpwcmludCBpbXBsb2RlKCIgIiwgYXJyYXlfa2V5cygkcm93KSkuIlxuIjsKcHJpbnQgaW1wbG9kZSgnICcsIGFycmF5X3ZhbHVlcygkcm93KSkuIlxuIjsKJHN0aC0+ZnJlZSgpOyAgLy8ga2VlcCBmYnNxbCBoYXBweS4KCnByaW50ICJ0ZXN0aW5nIGZldGNobW9kZXM6IGZldGNocm93IG9yZGVyZWQgZGVmYXVsdFxuIjsKJGRiaC0+c2V0RmV0Y2hNb2RlKERCX0ZFVENITU9ERV9PUkRFUkVEKTsKJHN0aCA9ICRkYmgtPnF1ZXJ5KCJTRUxFQ1QgKiBGUk9NIHBocHRlc3QiKTsKJHJvdyA9ICRzdGgtPmZldGNoUm93KCk7CnByaW50IGltcGxvZGUoIiAiLCBhcnJheV9rZXlzKCRyb3cpKS4iXG4iOwokc3RoLT5mcmVlKCk7ICAvLyBrZWVwIGZic3FsIGhhcHB5LgoKcHJpbnQgInRlc3RpbmcgZmV0Y2htb2RlczogZmV0Y2hyb3cgYXNzb2MgZGVmYXVsdFxuIjsKJGRiaC0+c2V0RmV0Y2hNb2RlKERCX0ZFVENITU9ERV9BU1NPQyk7CiRzdGggPSAkZGJoLT5xdWVyeSgiU0VMRUNUICogRlJPTSBwaHB0ZXN0Iik7CiRyb3cgPSAkc3RoLT5mZXRjaFJvdygpOwpwcmludCBpbXBsb2RlKCIgIiwgYXJyYXlfa2V5cygkcm93KSkuIlxuIjsKJHN0aC0+ZnJlZSgpOyAgLy8ga2VlcCBmYnNxbCBoYXBweS4KCnByaW50ICJ0ZXN0aW5nIGZldGNobW9kZXM6IGZldGNocm93IG9yZGVyZWQgZGVmYXVsdCB3aXRoIGFzc29jIHNwZWNpZmllZFxuIjsKJGRiaC0+c2V0RmV0Y2hNb2RlKERCX0ZFVENITU9ERV9PUkRFUkVEKTsKJHN0aCA9ICRkYmgtPnF1ZXJ5KCJTRUxFQ1QgKiBGUk9NIHBocHRlc3QiKTsKJHJvdyA9ICRzdGgtPmZldGNoUm93KERCX0ZFVENITU9ERV9BU1NPQyk7CnByaW50IGltcGxvZGUoIiAiLCBhcnJheV9rZXlzKCRyb3cpKS4iXG4iOwokc3RoLT5mcmVlKCk7ICAvLyBrZWVwIGZic3FsIGhhcHB5LgoKcHJpbnQgInRlc3RpbmcgZmV0Y2htb2RlczogZmV0Y2hyb3cgYXNzb2MgZGVmYXVsdCB3aXRoIG9yZGVyZWQgc3BlY2lmaWVkXG4iOwokZGJoLT5zZXRGZXRjaE1vZGUoREJfRkVUQ0hNT0RFX0FTU09DKTsKJHN0aCA9ICRkYmgtPnF1ZXJ5KCJTRUxFQ1QgKiBGUk9NIHBocHRlc3QiKTsKJHJvdyA9ICRzdGgtPmZldGNoUm93KERCX0ZFVENITU9ERV9PUkRFUkVEKTsKcHJpbnQgaW1wbG9kZSgiICIsIGFycmF5X2tleXMoJHJvdykpLiJcbiI7CiRzdGgtPmZyZWUoKTsgIC8vIGtlZXAgZmJzcWwgaGFwcHkuCgpwcmludCAidGVzdGluZyBmZXRjaG1vZGVzOiBmZXRjaGludG8gb3JkZXJlZCBkZWZhdWx0XG4iOwokZGJoLT5zZXRGZXRjaE1vZGUoREJfRkVUQ0hNT0RFX09SREVSRUQpOwokc3RoID0gJGRiaC0+cXVlcnkoIlNFTEVDVCAqIEZST00gcGhwdGVzdCIpOwokcm93ID0gYXJyYXkoKTsKJHN0aC0+ZmV0Y2hJbnRvKCRyb3cpOwpwcmludCBpbXBsb2RlKCIgIiwgYXJyYXlfa2V5cygkcm93KSkuIlxuIjsKJHN0aC0+ZnJlZSgpOyAgLy8ga2VlcCBmYnNxbCBoYXBweS4KCnByaW50ICJ0ZXN0aW5nIGZldGNobW9kZXM6IGZldGNoaW50byBhc3NvYyBkZWZhdWx0XG4iOwokZGJoLT5zZXRGZXRjaE1vZGUoREJfRkVUQ0hNT0RFX0FTU09DKTsKJHN0aCA9ICRkYmgtPnF1ZXJ5KCJTRUxFQ1QgKiBGUk9NIHBocHRlc3QiKTsKJHJvdyA9IGFycmF5KCk7CiRzdGgtPmZldGNoSW50bygkcm93KTsKcHJpbnQgaW1wbG9kZSgiICIsIGFycmF5X2tleXMoJHJvdykpLiJcbiI7CiRzdGgtPmZyZWUoKTsgIC8vIGtlZXAgZmJzcWwgaGFwcHkuCgpwcmludCAidGVzdGluZyBmZXRjaG1vZGVzOiBmZXRjaGludG8gb3JkZXJlZCBkZWZhdWx0IHdpdGggYXNzb2Mgc3BlY2lmaWVkXG4iOwokZGJoLT5zZXRGZXRjaE1vZGUoREJfRkVUQ0hNT0RFX09SREVSRUQpOwokc3RoID0gJGRiaC0+cXVlcnkoIlNFTEVDVCAqIEZST00gcGhwdGVzdCIpOwokcm93ID0gYXJyYXkoKTsKJHN0aC0+ZmV0Y2hJbnRvKCRyb3csIERCX0ZFVENITU9ERV9BU1NPQyk7CnByaW50IGltcGxvZGUoIiAiLCBhcnJheV9rZXlzKCRyb3cpKS4iXG4iOwokc3RoLT5mcmVlKCk7ICAvLyBrZWVwIGZic3FsIGhhcHB5LgoKcHJpbnQgInRlc3RpbmcgZmV0Y2htb2RlczogZmV0Y2hpbnRvIGFzc29jIGRlZmF1bHQgd2l0aCBvcmRlcmVkIHNwZWNpZmllZFxuIjsKJGRiaC0+c2V0RmV0Y2hNb2RlKERCX0ZFVENITU9ERV9BU1NPQyk7CiRzdGggPSAkZGJoLT5xdWVyeSgiU0VMRUNUICogRlJPTSBwaHB0ZXN0Iik7CiRyb3cgPSBhcnJheSgpOwokc3RoLT5mZXRjaEludG8oJHJvdywgREJfRkVUQ0hNT0RFX09SREVSRUQpOwpwcmludCBpbXBsb2RlKCIgIiwgYXJyYXlfa2V5cygkcm93KSkuIlxuIjsKCiRzdGgtPmZyZWUoKTsgIC8vIGtlZXAgZmJzcWwgaGFwcHkuCiAgICAgICAgICAgICAgIC8vIGtlZXAgaWJhc2UgaGFwcHk6IGNhbid0IGRyb3AgdGJsIHRoYXQgaGFzIHJlc3VsdHMgb3BlbiBhZ2FpbnN0IGl0LgoKJGRiaC0+c2V0RXJyb3JIYW5kbGluZyhQRUFSX0VSUk9SX1JFVFVSTik7CmRyb3BfdGFibGUoJGRiaCwgJ3BocHRlc3QnKTsK]]></data>
	</file>
	<file>
	  <filename>/lib/pear/tests/fetchmode_object.inc</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBUZXN0cyB0aGUgZHJpdmVycycgb2JqZWN0IGZldGNoIG1vZGUgcHJvY2VkdXJlcwogKgogKiBFeGVjdXRlZCBieSBkcml2ZXIvMTRmZXRjaG1vZGVfb2JqZWN0LnBocHQKICoKICogUEhQIHZlcnNpb25zIDQgYW5kIDUKICoKICogTElDRU5TRTogVGhpcyBzb3VyY2UgZmlsZSBpcyBzdWJqZWN0IHRvIHZlcnNpb24gMy4wIG9mIHRoZSBQSFAgbGljZW5zZQogKiB0aGF0IGlzIGF2YWlsYWJsZSB0aHJvdWdoIHRoZSB3b3JsZC13aWRlLXdlYiBhdCB0aGUgZm9sbG93aW5nIFVSSToKICogaHR0cDovL3d3dy5waHAubmV0L2xpY2Vuc2UvM18wLnR4dC4gIElmIHlvdSBkaWQgbm90IHJlY2VpdmUgYSBjb3B5IG9mCiAqIHRoZSBQSFAgTGljZW5zZSBhbmQgYXJlIHVuYWJsZSB0byBvYnRhaW4gaXQgdGhyb3VnaCB0aGUgd2ViLCBwbGVhc2UKICogc2VuZCBhIG5vdGUgdG8gbGljZW5zZUBwaHAubmV0IHNvIHdlIGNhbiBtYWlsIHlvdSBhIGNvcHkgaW1tZWRpYXRlbHkuCiAqCiAqIEBjYXRlZ29yeSAgIERhdGFiYXNlCiAqIEBwYWNrYWdlICAgIERCCiAqIEBhdXRob3IgICAgIERhbmllbCBDb252aXNzb3IgPGRhbmllbGNAcGhwLm5ldD4KICogQGNvcHlyaWdodCAgMTk5Ny0yMDA1IFRoZSBQSFAgR3JvdXAKICogQGxpY2Vuc2UgICAgaHR0cDovL3d3dy5waHAubmV0L2xpY2Vuc2UvM18wLnR4dCAgUEhQIExpY2Vuc2UgMy4wCiAqIEB2ZXJzaW9uICAgICRJZDogZmV0Y2htb2RlX29iamVjdC5pbmMsdiAxLjExIDIwMDUvMDIvMDMgMDU6NDk6NDQgZGFuaWVsYyBFeHAgJAogKiBAbGluayAgICAgICBodHRwOi8vcGVhci5waHAubmV0L3BhY2thZ2UvREIKICovCgplcnJvcl9yZXBvcnRpbmcoRV9BTEwpOwoKLyoqCiAqIExvY2FsIGVycm9yIGNhbGxiYWNrIGhhbmRsZXIKICoKICogRHJvcHMgdGhlIHBocHRlc3QgdGFibGUsIHByaW50cyBvdXQgYW4gZXJyb3IgbWVzc2FnZSBhbmQga2lsbHMgdGhlCiAqIHByb2Nlc3MuCiAqCiAqIEBwYXJhbSBvYmplY3QgICRvICBQRUFSIGVycm9yIG9iamVjdCBhdXRvbWF0aWNhbGx5IHBhc3NlZCB0byB0aGlzIG1ldGhvZAogKiBAcmV0dXJuIHZvaWQKICogQHNlZSBQRUFSOjpzZXRFcnJvckhhbmRsaW5nKCkKICovCmZ1bmN0aW9uIHBlKCRvKSB7CiAgICBnbG9iYWwgJGRiaDsKCiAgICAkZGJoLT5zZXRFcnJvckhhbmRsaW5nKFBFQVJfRVJST1JfUkVUVVJOKTsKICAgIGRyb3BfdGFibGUoJGRiaCwgJ3BocHRlc3QnKTsKCiAgICBkaWUoJG8tPnRvU3RyaW5nKCkpOwp9CgovKioKICogUHJpbnQgb3V0IHRoZSBvYmplY3QKICovCmZ1bmN0aW9uIHByaW50X29iaigmJG9iaikgewogICAgaWYgKCFpc19vYmplY3QoJG9iaikpIHsKICAgICAgICBlY2hvICJFUlJPUjogbm8gb2JqZWN0IVxuIjsKICAgIH0gZWxzZSB7CiAgICAgICAgZWNobyBzdHJ0b2xvd2VyKGdldF9jbGFzcygkb2JqKSkgLiAnIC0+ICcgLiBpbXBsb2RlKCcgJywgYXJyYXlfa2V5cygoYXJyYXkpJG9iaikpIC4gIlxuIjsKICAgIH0KfQoKCiRkYmgtPnNldEVycm9ySGFuZGxpbmcoUEVBUl9FUlJPUl9DQUxMQkFDSywgJ3BlJyk7CgplY2hvICItLS0gZmV0Y2ggd2l0aCBwYXJhbSBEQl9GRVRDSE1PREVfT0JKRUNUIC0tLVxuIjsKJHN0aCA9ICRkYmgtPnF1ZXJ5KCJTRUxFQ1QgKiBGUk9NIHBocHRlc3QiKTsKJHJvdyA9ICRzdGgtPmZldGNoUm93KERCX0ZFVENITU9ERV9PQkpFQ1QpOwpwcmludF9vYmooJHJvdyk7CiRzdGgtPmZyZWUoKTsgIC8vIGtlZXAgZmJzcWwgaGFwcHkuCgokc3RoID0gJGRiaC0+cXVlcnkoIlNFTEVDVCAqIEZST00gcGhwdGVzdCIpOwokc3RoLT5mZXRjaEludG8oJHJvdywgREJfRkVUQ0hNT0RFX09CSkVDVCk7CnByaW50X29iaigkcm93KTsKJHN0aC0+ZnJlZSgpOyAgLy8ga2VlcCBmYnNxbCBoYXBweS4KCmVjaG8gIi0tLSBmZXRjaCB3aXRoIGRlZmF1bHQgZmV0Y2htb2RlIERCX0ZFVENITU9ERV9PQkpFQ1QgLS0tXG4iOwokZGJoLT5zZXRGZXRjaE1vZGUoREJfRkVUQ0hNT0RFX09CSkVDVCk7CiRzdGggPSAkZGJoLT5xdWVyeSgiU0VMRUNUICogRlJPTSBwaHB0ZXN0Iik7CiRyb3cgPSAkc3RoLT5mZXRjaFJvdygpOwpwcmludF9vYmooJHJvdyk7CiRzdGgtPmZyZWUoKTsgIC8vIGtlZXAgZmJzcWwgaGFwcHkuCgokc3RoID0gJGRiaC0+cXVlcnkoIlNFTEVDVCAqIEZST00gcGhwdGVzdCIpOwokc3RoLT5mZXRjaEludG8oJHJvdyk7CnByaW50X29iaigkcm93KTsKJHN0aC0+ZnJlZSgpOyAgLy8ga2VlcCBmYnNxbCBoYXBweS4KCmVjaG8gIi0tLSBmZXRjaCB3aXRoIGRlZmF1bHQgZmV0Y2htb2RlIERCX0ZFVENITU9ERV9PQkpFQ1QgYW5kIGNsYXNzIERCX3JvdyAtLS1cbiI7CiRkYmgtPnNldEZldGNoTW9kZShEQl9GRVRDSE1PREVfT0JKRUNULCAnREJfcm93Jyk7CiRzdGggPSAkZGJoLT5xdWVyeSgiU0VMRUNUICogRlJPTSBwaHB0ZXN0Iik7CiRyb3cgPSAkc3RoLT5mZXRjaFJvdygpOwpwcmludF9vYmooJHJvdyk7CiRzdGgtPmZyZWUoKTsgIC8vIGtlZXAgZmJzcWwgaGFwcHkuCgokc3RoID0gJGRiaC0+cXVlcnkoIlNFTEVDVCAqIEZST00gcGhwdGVzdCIpOwokc3RoLT5mZXRjaEludG8oJHJvdyk7CnByaW50X29iaigkcm93KTsKJHN0aC0+ZnJlZSgpOyAgLy8ga2VlcCBmYnNxbCBoYXBweS4KCmVjaG8gIi0tLSBmZXRjaCB3aXRoIGRlZmF1bHQgZmV0Y2htb2RlIERCX0ZFVENITU9ERV9PQkpFQ1Qgd2l0aCBubyBjbGFzcyB0aGVuIERCX3JvdyAtLS1cbiI7CiRkYmgtPnNldEZldGNoTW9kZShEQl9GRVRDSE1PREVfT0JKRUNUKTsKJHN0aCA9ICRkYmgtPnF1ZXJ5KCdTRUxFQ1QgKiBGUk9NIHBocHRlc3QnKTsKJHJvdyA9ICRzdGgtPmZldGNoUm93KCk7CnByaW50X29iaigkcm93KTsKJHN0aC0+ZnJlZSgpOyAgLy8ga2VlcCBmYnNxbCBoYXBweS4KCiRkYmgtPnNldEZldGNoTW9kZShEQl9GRVRDSE1PREVfT0JKRUNULCAnREJfcm93Jyk7CiRzdGggPSAkZGJoLT5xdWVyeSgnU0VMRUNUICogRlJPTSBwaHB0ZXN0Jyk7CiRyb3cgPSAkc3RoLT5mZXRjaFJvdygpOwpwcmludF9vYmooJHJvdyk7Cgokc3RoLT5mcmVlKCk7ICAvLyBrZWVwIGZic3FsIGhhcHB5LgogICAgICAgICAgICAgICAvLyBrZWVwIGliYXNlIGhhcHB5OiBjYW4ndCBkcm9wIHRibCB0aGF0IGhhcyByZXN1bHRzIG9wZW4gYWdhaW5zdCBpdC4KCiRkYmgtPnNldEVycm9ySGFuZGxpbmcoUEVBUl9FUlJPUl9SRVRVUk4pOwpkcm9wX3RhYmxlKCRkYmgsICdwaHB0ZXN0Jyk7Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/pear/tests/include.inc</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTZXRzIHRoZSBpbmNsdWRlX3BhdGgsIGVycm9yX3JlcG9ydGluZyBhbmQgUEFUSF9TRVBBUkFUT1IgZm9yIHRlc3RzCiAqIGluIHRoZSBEQi90ZXN0cyBkaXJlY3RvcnkKICoKICogUEhQIHZlcnNpb25zIDQgYW5kIDUKICoKICogTElDRU5TRTogVGhpcyBzb3VyY2UgZmlsZSBpcyBzdWJqZWN0IHRvIHZlcnNpb24gMy4wIG9mIHRoZSBQSFAgbGljZW5zZQogKiB0aGF0IGlzIGF2YWlsYWJsZSB0aHJvdWdoIHRoZSB3b3JsZC13aWRlLXdlYiBhdCB0aGUgZm9sbG93aW5nIFVSSToKICogaHR0cDovL3d3dy5waHAubmV0L2xpY2Vuc2UvM18wLnR4dC4gIElmIHlvdSBkaWQgbm90IHJlY2VpdmUgYSBjb3B5IG9mCiAqIHRoZSBQSFAgTGljZW5zZSBhbmQgYXJlIHVuYWJsZSB0byBvYnRhaW4gaXQgdGhyb3VnaCB0aGUgd2ViLCBwbGVhc2UKICogc2VuZCBhIG5vdGUgdG8gbGljZW5zZUBwaHAubmV0IHNvIHdlIGNhbiBtYWlsIHlvdSBhIGNvcHkgaW1tZWRpYXRlbHkuCiAqCiAqIEBjYXRlZ29yeSAgIERhdGFiYXNlCiAqIEBwYWNrYWdlICAgIERCCiAqIEBhdXRob3IgICAgIERhbmllbCBDb252aXNzb3IgPGRhbmllbGNAcGhwLm5ldD4KICogQGNvcHlyaWdodCAgMTk5Ny0yMDA1IFRoZSBQSFAgR3JvdXAKICogQGxpY2Vuc2UgICAgaHR0cDovL3d3dy5waHAubmV0L2xpY2Vuc2UvM18wLnR4dCAgUEhQIExpY2Vuc2UgMy4wCiAqIEB2ZXJzaW9uICAgICRJZDogaW5jbHVkZS5pbmMsdiAxLjUgMjAwNS8wMi8wMyAwNTo0OTo0NCBkYW5pZWxjIEV4cCAkCiAqIEBsaW5rICAgICAgIGh0dHA6Ly9wZWFyLnBocC5uZXQvcGFja2FnZS9EQgogKi8KCmVycm9yX3JlcG9ydGluZyhFX0FMTCk7CgppZiAoIWRlZmluZWQoJ1BBVEhfU0VQQVJBVE9SJykpIHsKICAgIGlmIChzdHJpc3RyKFBIUF9PUywgJ1dJTicpKSB7CiAgICAgICAgLyoqCiAgICAgICAgICogRGVmaW5lIHRoZSBwYXRoIHNlcGFyYXRvciBmb3Igd2luZG93cwogICAgICAgICAqLwogICAgICAgIGRlZmluZSgnUEFUSF9TRVBBUkFUT1InLCAnOycpOwogICAgfSBlbHNlIHsKICAgICAgICAvKioKICAgICAgICAgKiBEZWZpbmUgdGhlIHBhdGggc2VwYXJhdG9yIGZvciBvdGhlciBzeXN0ZW1zCiAgICAgICAgICovCiAgICAgICAgZGVmaW5lKCdQQVRIX1NFUEFSQVRPUicsICc6Jyk7CiAgICB9Cn0KCi8qCiAqIElmIHRoZSBwYXRoIHRvIHlvdXIgUEVBUiBpbnN0YWxsYXRpb24gaXMgZm91bmQgaW4gdGhlIGxlZnQgaGFuZAogKiBwb3J0aW9uIG9mIHRoZSBpZigpIGV4cHJlc3Npb24gYmVsb3csIHRoYXQgbWVhbnMgdGhpcyBmaWxlIGhhcwogKiBjb21lIGZyb20gdGhlIFBFQVIgaW5zdGFsbGVyLiAgVGhlcmVmb3JlLCBsZXQncyB1c2UgdGhlCiAqIGluc3RhbGxlZCB2ZXJzaW9uIG9mIERCLCB3aGljaCBzaG91bGQgYmUgZm91bmQgdmlhIHRoZQogKiBjb21wdXRlcidzIGRlZmF1bHQgaW5jbHVkZV9wYXRoLiAgQWRkICcuJyB0byB0aGUgaW5jbHVkZV9wYXRoCiAqIHRvIGVuc3VyZSAnLicgaXMgaW4gdGhlcmUuCiAqIAogKiBJZiB0aGUgcGF0aCBoYXMgbm90IGJlZW4gc3Vic3RpdHV0ZWQgaW4gdGhlIGlmKCkgZXhwcmVzc2lvbiwKICogdGhpcyBmaWxlIGhhcyBsaWtlbHkgY29tZSBmcm9tIGEgQ1ZTIGNoZWNrb3V0IG9yIGEgLnRhciBmaWxlLgogKiBUaGVyZWZvcmUsIHdlJ2xsIGFzc3VtZSB0aGUgdGVzdHMgc2hvdWxkIHVzZSB0aGUgdmVyc2lvbiBvZgogKiBEQiB0aGF0IGhhcyBjb21lIGZyb20gdGhlcmUgYXMgd2VsbC4KICovCmlmICgnQGluY2x1ZGVfcGF0aEAnICE9ICdAJy4naW5jbHVkZV9wYXRoJy4nQCcpIHsKICAgIGluaV9zZXQoJ2luY2x1ZGVfcGF0aCcsIGluaV9nZXQoJ2luY2x1ZGVfcGF0aCcpCiAgICAgICAgICAgIC4gUEFUSF9TRVBBUkFUT1IgLiAnLicKICAgICk7Cn0gZWxzZSB7CiAgICBpbmlfc2V0KCdpbmNsdWRlX3BhdGgnLCByZWFscGF0aChkaXJuYW1lKF9fRklMRV9fKSAuICcvLi4nKQogICAgICAgICAgICAuIFBBVEhfU0VQQVJBVE9SIC4gJy4nIC4gUEFUSF9TRVBBUkFUT1IKICAgICAgICAgICAgLiBpbmlfZ2V0KCdpbmNsdWRlX3BhdGgnKQogICAgKTsKfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/pear/tests/limit.inc</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBUZXN0cyB0aGUgZHJpdmVycycgbGltaXRRdWVyeSgpIG1ldGhvZAogKgogKiBFeGVjdXRlZCBieSBkcml2ZXIvMTNsaW1pdC5waHB0CiAqCiAqIFBIUCB2ZXJzaW9ucyA0IGFuZCA1CiAqCiAqIExJQ0VOU0U6IFRoaXMgc291cmNlIGZpbGUgaXMgc3ViamVjdCB0byB2ZXJzaW9uIDMuMCBvZiB0aGUgUEhQIGxpY2Vuc2UKICogdGhhdCBpcyBhdmFpbGFibGUgdGhyb3VnaCB0aGUgd29ybGQtd2lkZS13ZWIgYXQgdGhlIGZvbGxvd2luZyBVUkk6CiAqIGh0dHA6Ly93d3cucGhwLm5ldC9saWNlbnNlLzNfMC50eHQuICBJZiB5b3UgZGlkIG5vdCByZWNlaXZlIGEgY29weSBvZgogKiB0aGUgUEhQIExpY2Vuc2UgYW5kIGFyZSB1bmFibGUgdG8gb2J0YWluIGl0IHRocm91Z2ggdGhlIHdlYiwgcGxlYXNlCiAqIHNlbmQgYSBub3RlIHRvIGxpY2Vuc2VAcGhwLm5ldCBzbyB3ZSBjYW4gbWFpbCB5b3UgYSBjb3B5IGltbWVkaWF0ZWx5LgogKgogKiBAY2F0ZWdvcnkgICBEYXRhYmFzZQogKiBAcGFja2FnZSAgICBEQgogKiBAYXV0aG9yICAgICBEYW5pZWwgQ29udmlzc29yIDxkYW5pZWxjQHBocC5uZXQ+CiAqIEBjb3B5cmlnaHQgIDE5OTctMjAwNSBUaGUgUEhQIEdyb3VwCiAqIEBsaWNlbnNlICAgIGh0dHA6Ly93d3cucGhwLm5ldC9saWNlbnNlLzNfMC50eHQgIFBIUCBMaWNlbnNlIDMuMAogKiBAdmVyc2lvbiAgICAkSWQ6IGxpbWl0LmluYyx2IDEuMTMgMjAwNy8wMS8xMSAwOTowMzo1OCBhaGFydmV5IEV4cCAkCiAqIEBsaW5rICAgICAgIGh0dHA6Ly9wZWFyLnBocC5uZXQvcGFja2FnZS9EQgogKi8KCmVycm9yX3JlcG9ydGluZyhFX0FMTCk7CgovKioKICogTG9jYWwgZXJyb3IgY2FsbGJhY2sgaGFuZGxlcgogKgogKiBEcm9wcyB0aGUgcGhwdGVzdCB0YWJsZSwgcHJpbnRzIG91dCBhbiBlcnJvciBtZXNzYWdlIGFuZCBraWxscyB0aGUKICogcHJvY2Vzcy4KICoKICogQHBhcmFtIG9iamVjdCAgJG8gIFBFQVIgZXJyb3Igb2JqZWN0IGF1dG9tYXRpY2FsbHkgcGFzc2VkIHRvIHRoaXMgbWV0aG9kCiAqIEByZXR1cm4gdm9pZAogKiBAc2VlIFBFQVI6OnNldEVycm9ySGFuZGxpbmcoKQogKi8KZnVuY3Rpb24gcGUoJG8pIHsKICAgIGdsb2JhbCAkZGJoOwoKICAgICRkYmgtPnNldEVycm9ySGFuZGxpbmcoUEVBUl9FUlJPUl9SRVRVUk4pOwogICAgZHJvcF90YWJsZSgkZGJoLCAncGhwdGVzdCcpOwoKICAgIGRpZSgkby0+dG9TdHJpbmcoKSk7Cn0KCgokZGJoLT5zZXRFcnJvckhhbmRsaW5nKFBFQVJfRVJST1JfUkVUVVJOKTsKZHJvcF90YWJsZSgkZGJoLCAncGhwX2xpbWl0Jyk7CgokZGJoLT5zZXRFcnJvckhhbmRsaW5nKFBFQVJfRVJST1JfQ0FMTEJBQ0ssICdwZScpOwoKJGRiaC0+cXVlcnkoJ0NSRUFURSBUQUJMRSBwaHBfbGltaXQgKGEgQ0hBUigyMCkpJyk7CgoKJGZyb20gICAgPSAwOwokY291bnQgICA9IDEwOwokbnVtcm93cyA9IDMwOwoKZm9yICgkaT0wOyAkaTw9JG51bXJvd3MrMjsgJGkrKykgewogICAgJGRiaC0+cXVlcnkoIklOU0VSVCBJTlRPIHBocF9saW1pdCBWQUxVRVMoJ3Jlc3VsdCAkaScpIik7Cn0KZm9yICgkaSA9IDA7ICRpIDw9IDM7ICRpKyspIHsKICAgICRmcm9tID0gMTAgKiAkaTsKICAgICRyZXMgPSAkZGJoLT5saW1pdFF1ZXJ5KCJzZWxlY3QgKiBmcm9tIHBocF9saW1pdCIsICRmcm9tLCAkY291bnQpOwogICAgZWNobyAiPT09PT09PSBGcm9tOiAkZnJvbSB8fCBOdW1iZXIgb2Ygcm93cyB0byBmZXRjaDogJGNvdW50ID09PT09PT1cbiI7CiAgICB3aGlsZSAoJHJvdyA9ICRyZXMtPmZldGNoUm93KERCX0ZFVENITU9ERV9BU1NPQykpIHsKICAgICAgICBlY2hvICRyZXMtPmdldFJvd0NvdW50ZXIoKSAuICcuLSAnIC4gJHJvd1snYSddIC4gIlxuIjsKICAgIH0KICAgICRjb3VudCA9ICRyZXMtPm51bVJvd3MoKTsKICAgIGVjaG8gIlJvdyBjb3VudCBmb3IgbGltaXRlZCByZXN1bHQ6ICRjb3VudFxuIjsKICAgICRyZXMtPmZyZWUoKTsgIC8vIGtlZXAgZmJzcWwgaGFwcHkuCn0KCgokZnJvbSAgPSAxMTsKJGNvdW50ID0gMzsKCmVjaG8gIj09PT09PT0gUGFzc2luZyBcJHBhcmFtcyB8fCBGcm9tOiAkZnJvbSB8fCBOdW1iZXIgb2Ygcm93cyB0byBmZXRjaDogJGNvdW50ID09PT09PT1cbiI7CiRyZXMgPSAkZGJoLT5saW1pdFF1ZXJ5KCdTRUxFQ1QgKiBGUk9NIHBocF9saW1pdCBXSEVSRSBhIDwgPycsICRmcm9tLCAkY291bnQsIGFycmF5KCdyZXN1bHQgOTknKSk7CndoaWxlICgkcm93ID0gJHJlcy0+ZmV0Y2hSb3coREJfRkVUQ0hNT0RFX0FTU09DKSkgewogICAgZWNobyAkcmVzLT5nZXRSb3dDb3VudGVyKCkgLiAnLi0gJyAuICRyb3dbJ2EnXSAuICJcbiI7Cn0KCiRyZXMtPmZyZWUoKTsgIC8vIGtlZXAgZmJzcWwgaGFwcHkuCiAgICAgICAgICAgICAgIC8vIGtlZXAgaWJhc2UgaGFwcHk6IGNhbid0IGRyb3AgdGJsIHRoYXQgaGFzIHJlc3VsdHMgb3BlbiBhZ2FpbnN0IGl0LgoKLy8gUmVncmVzc2lvbiB0ZXN0IGZvciBidWcgIzc1MDIuCiRmcm9tICA9IDA7CiRjb3VudCA9IDM7CiRpdGVyICA9IDEwOwplY2hvICI9PT09PT09IEZyb206ICRmcm9tIHx8IE51bWJlciBvZiByb3dzIHRvIGZldGNoOiAkY291bnQgfHwgSXRlcmF0aW9uczogJGl0ZXIgPT09PT09PVxuIjsKJHJlcyA9ICRkYmgtPmxpbWl0UXVlcnkoInNlbGVjdCAqIGZyb20gcGhwX2xpbWl0IiwgJGZyb20sICRjb3VudCk7CmlmICghaW5fYXJyYXkoJGRiaC0+cGhwdHlwZSwgYXJyYXkoJ2liYXNlJywgJ29jaTgnKSkpIHsKICAgIGZvciAoJGkgPSAwOyAkaSA8ICRpdGVyOyArKyRpKSB7CiAgICAgICAgaWYgKGlzX251bGwoJHJvdyA9ICRyZXMtPmZldGNoUm93KERCX0ZFVENITU9ERV9BU1NPQywgMSkpKSB7CiAgICAgICAgICAgIGVjaG8gIkVycm9yIGluIGl0ZXJhdGlvbiAkaTogeyRyb3dbJ2EnXX1cbiI7CiAgICAgICAgfQogICAgfQp9CiRjb3VudCA9ICRyZXMtPm51bVJvd3MoKTsKZWNobyAiUm93IGNvdW50IGZvciBsaW1pdGVkIHJlc3VsdDogJGNvdW50XG4iOwokcmVzLT5mcmVlKCk7ICAvLyBrZWVwIGZic3FsIGhhcHB5LgoKJGRiaC0+c2V0RXJyb3JIYW5kbGluZyhQRUFSX0VSUk9SX1JFVFVSTik7CmRyb3BfdGFibGUoJGRiaCwgJ3BocF9saW1pdCcpOwo=]]></data>
	</file>
	<file>
	  <filename>/lib/pear/tests/numcols.inc</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBUZXN0cyB0aGUgZHJpdmVycycgbnVtQ29scygpIG1ldGhvZAogKgogKiBFeGVjdXRlZCBieSBkcml2ZXIvMDRudW1jb2xzLnBocHQKICoKICogUEhQIHZlcnNpb25zIDQgYW5kIDUKICoKICogTElDRU5TRTogVGhpcyBzb3VyY2UgZmlsZSBpcyBzdWJqZWN0IHRvIHZlcnNpb24gMy4wIG9mIHRoZSBQSFAgbGljZW5zZQogKiB0aGF0IGlzIGF2YWlsYWJsZSB0aHJvdWdoIHRoZSB3b3JsZC13aWRlLXdlYiBhdCB0aGUgZm9sbG93aW5nIFVSSToKICogaHR0cDovL3d3dy5waHAubmV0L2xpY2Vuc2UvM18wLnR4dC4gIElmIHlvdSBkaWQgbm90IHJlY2VpdmUgYSBjb3B5IG9mCiAqIHRoZSBQSFAgTGljZW5zZSBhbmQgYXJlIHVuYWJsZSB0byBvYnRhaW4gaXQgdGhyb3VnaCB0aGUgd2ViLCBwbGVhc2UKICogc2VuZCBhIG5vdGUgdG8gbGljZW5zZUBwaHAubmV0IHNvIHdlIGNhbiBtYWlsIHlvdSBhIGNvcHkgaW1tZWRpYXRlbHkuCiAqCiAqIEBjYXRlZ29yeSAgIERhdGFiYXNlCiAqIEBwYWNrYWdlICAgIERCCiAqIEBhdXRob3IgICAgIERhbmllbCBDb252aXNzb3IgPGRhbmllbGNAcGhwLm5ldD4KICogQGNvcHlyaWdodCAgMTk5Ny0yMDA1IFRoZSBQSFAgR3JvdXAKICogQGxpY2Vuc2UgICAgaHR0cDovL3d3dy5waHAubmV0L2xpY2Vuc2UvM18wLnR4dCAgUEhQIExpY2Vuc2UgMy4wCiAqIEB2ZXJzaW9uICAgICRJZDogbnVtY29scy5pbmMsdiAxLjggMjAwNy8wMS8wOCAwMDoxOTo0OCBhaGFydmV5IEV4cCAkCiAqIEBsaW5rICAgICAgIGh0dHA6Ly9wZWFyLnBocC5uZXQvcGFja2FnZS9EQgogKi8KCi8qKgogKiBMb2NhbCBlcnJvciBjYWxsYmFjayBoYW5kbGVyCiAqCiAqIERyb3BzIHRoZSBwaHB0ZXN0IHRhYmxlLCBwcmludHMgb3V0IGFuIGVycm9yIG1lc3NhZ2UgYW5kIGtpbGxzIHRoZQogKiBwcm9jZXNzLgogKgogKiBAcGFyYW0gb2JqZWN0ICAkbyAgUEVBUiBlcnJvciBvYmplY3QgYXV0b21hdGljYWxseSBwYXNzZWQgdG8gdGhpcyBtZXRob2QKICogQHJldHVybiB2b2lkCiAqIEBzZWUgUEVBUjo6c2V0RXJyb3JIYW5kbGluZygpCiAqLwpmdW5jdGlvbiBwZSgkbykgewogICAgZ2xvYmFsICRkYmg7CgogICAgJGRiaC0+c2V0RXJyb3JIYW5kbGluZyhQRUFSX0VSUk9SX1JFVFVSTik7CiAgICBkcm9wX3RhYmxlKCRkYmgsICdwaHB0ZXN0Jyk7CgogICAgZGllKCRvLT50b1N0cmluZygpKTsKfQoKJGRiaC0+c2V0RXJyb3JIYW5kbGluZyhQRUFSX0VSUk9SX0NBTExCQUNLLCAncGUnKTsKCgokc3RoID0gJGRiaC0+cXVlcnkoIlNFTEVDVCBhIEZST00gcGhwdGVzdCIpOwpwcmludGYoIiVkXG4iLCAkc3RoLT5udW1Db2xzKCkpOwokc3RoID0gJGRiaC0+cXVlcnkoIlNFTEVDVCBhLGIgRlJPTSBwaHB0ZXN0Iik7CnByaW50ZigiJWRcbiIsICRzdGgtPm51bUNvbHMoKSk7CiRzdGggPSAkZGJoLT5xdWVyeSgiU0VMRUNUIGEsYixjYyBGUk9NIHBocHRlc3QiKTsKcHJpbnRmKCIlZFxuIiwgJHN0aC0+bnVtQ29scygpKTsKJHN0aCA9ICRkYmgtPnF1ZXJ5KCJTRUxFQ1QgKiBGUk9NIHBocHRlc3QiKTsKcHJpbnRmKCIlZFxuIiwgJHN0aC0+bnVtQ29scygpKTsKCgpzd2l0Y2ggKCRkYmgtPnBocHR5cGUpIHsKICAgIGNhc2UgJ2liYXNlJzoKICAgICAgICAvKgogICAgICAgICAqIEludGVyYmFzZSBkb2Vzbid0IGFsbG93IGRyb3BwaW5nIHRhYmxlcyB0aGF0IGhhdmUgcmVzdWx0CiAgICAgICAgICogc2V0cyBzdGlsbCBvcGVuLgogICAgICAgICAqLwogICAgICAgICRkYmgtPmZyZWVSZXN1bHQoJHN0aC0+cmVzdWx0KTsKICAgICAgICBicmVhazsKfQokZGJoLT5zZXRFcnJvckhhbmRsaW5nKFBFQVJfRVJST1JfUkVUVVJOKTsKZHJvcF90YWJsZSgkZGJoLCAncGhwdGVzdCcpOwo=]]></data>
	</file>
	<file>
	  <filename>/lib/pear/tests/numrows.inc</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBUZXN0cyB0aGUgZHJpdmVycycgbnVtUm93cygpIG1ldGhvZAogKgogKiBFeGVjdXRlZCBieSBkcml2ZXIvMDludW1yb3dzLnBocHQKICoKICogUEhQIHZlcnNpb25zIDQgYW5kIDUKICoKICogTElDRU5TRTogVGhpcyBzb3VyY2UgZmlsZSBpcyBzdWJqZWN0IHRvIHZlcnNpb24gMy4wIG9mIHRoZSBQSFAgbGljZW5zZQogKiB0aGF0IGlzIGF2YWlsYWJsZSB0aHJvdWdoIHRoZSB3b3JsZC13aWRlLXdlYiBhdCB0aGUgZm9sbG93aW5nIFVSSToKICogaHR0cDovL3d3dy5waHAubmV0L2xpY2Vuc2UvM18wLnR4dC4gIElmIHlvdSBkaWQgbm90IHJlY2VpdmUgYSBjb3B5IG9mCiAqIHRoZSBQSFAgTGljZW5zZSBhbmQgYXJlIHVuYWJsZSB0byBvYnRhaW4gaXQgdGhyb3VnaCB0aGUgd2ViLCBwbGVhc2UKICogc2VuZCBhIG5vdGUgdG8gbGljZW5zZUBwaHAubmV0IHNvIHdlIGNhbiBtYWlsIHlvdSBhIGNvcHkgaW1tZWRpYXRlbHkuCiAqCiAqIEBjYXRlZ29yeSAgIERhdGFiYXNlCiAqIEBwYWNrYWdlICAgIERCCiAqIEBhdXRob3IgICAgIERhbmllbCBDb252aXNzb3IgPGRhbmllbGNAcGhwLm5ldD4KICogQGNvcHlyaWdodCAgMTk5Ny0yMDA1IFRoZSBQSFAgR3JvdXAKICogQGxpY2Vuc2UgICAgaHR0cDovL3d3dy5waHAubmV0L2xpY2Vuc2UvM18wLnR4dCAgUEhQIExpY2Vuc2UgMy4wCiAqIEB2ZXJzaW9uICAgICRJZDogbnVtcm93cy5pbmMsdiAxLjE0IDIwMDcvMDEvMTEgMDc6NDM6MDkgYWhhcnZleSBFeHAgJAogKiBAbGluayAgICAgICBodHRwOi8vcGVhci5waHAubmV0L3BhY2thZ2UvREIKICovCgovKioKICogTG9jYWwgZXJyb3IgY2FsbGJhY2sgaGFuZGxlcgogKgogKiBEcm9wcyB0aGUgcGhwdGVzdCB0YWJsZSwgcHJpbnRzIG91dCBhbiBlcnJvciBtZXNzYWdlIGFuZCBraWxscyB0aGUKICogcHJvY2Vzcy4KICoKICogQHBhcmFtIG9iamVjdCAgJG8gIFBFQVIgZXJyb3Igb2JqZWN0IGF1dG9tYXRpY2FsbHkgcGFzc2VkIHRvIHRoaXMgbWV0aG9kCiAqIEByZXR1cm4gdm9pZAogKiBAc2VlIFBFQVI6OnNldEVycm9ySGFuZGxpbmcoKQogKi8KZnVuY3Rpb24gcGUoJG8pIHsKICAgIGdsb2JhbCAkZGJoLCAkcmVzOwoKICAgICRkYmgtPnNldEVycm9ySGFuZGxpbmcoUEVBUl9FUlJPUl9SRVRVUk4pOwogICAgJHJlcy0+ZnJlZSgpOwogICAgZHJvcF90YWJsZSgkZGJoLCAncGhwdGVzdCcpOwoKICAgIHByaW50ICJcbi0tLS0tLS0tLS0tLVxuIjsKICAgIGlmICgkby0+Z2V0Q29kZSgpID09IERCX0VSUk9SX1VOU1VQUE9SVEVEKSB7CiAgICAgICAgcHJpbnQgIlRoaXMgREJNUyBkb2VzIG5vdCBzdXBwb3J0IG51bVJvd3MoKS4iOwogICAgfSBlbHNlaWYgKCRvLT5nZXRDb2RlKCkgPT0gREJfRVJST1JfTUlTTUFUQ0gpIHsKICAgICAgICBwcmludCAiTWlzbWF0Y2ggYmV0d2VlbiB0aGUgbnVtYmVyIG9mIHBsYWNlaG9sZGVycyBhbmQgcGFyYW1ldGVycy5cbiI7CiAgICAgICAgZm9yZWFjaCAoJG8tPmJhY2t0cmFjZSBhcyAkaXRlbSA9PiAkZGV0YWlsKSB7CiAgICAgICAgICAgIGlmICgkZGV0YWlsWydmdW5jdGlvbiddID09ICdxdWVyeScpIHsKICAgICAgICAgICAgICAgIGVjaG8gJ1FVRVJZOiAnIC4gJGRldGFpbFsnYXJncyddWzBdIC4gIlxuIjsKICAgICAgICAgICAgICAgIGVjaG8gIlBBUkFNRVRFUlM6XG4iOwogICAgICAgICAgICAgICAgcHJpbnRfcigkZGV0YWlsWydhcmdzJ11bMV0pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICBwcmludCAkby0+Z2V0RGVidWdJbmZvKCkgLiAiXG4iOwogICAgfQogICAgZXhpdDsKfQoKJGRiaC0+c2V0RXJyb3JIYW5kbGluZyhQRUFSX0VSUk9SX0NBTExCQUNLLCAncGUnKTsKCgokcmVzID0gJGRiaC0+cXVlcnkoIlNFTEVDVCBhIEZST00gcGhwdGVzdCIpOwppZiAoIURCOjppc0Vycm9yKCRyb3dzID0gJHJlcy0+bnVtUm93cygpKSkgewogICAgcHJpbnQgIih3YW50IDEpIGdvdCAkcm93cyBmcm9tIGZpcnN0XG4iOwp9IGVsc2UgewogICAgcHJpbnQgIlxuIjsKfQpmb3IgKCRpID0gMDsgJGkgPCA1OyAkaSsrKSB7CiAgICAkZGJoLT5xdWVyeSgiSU5TRVJUIElOVE8gcGhwdGVzdCAoYSkgVkFMVUVTICgkaSkiKTsKICAgICRyZXMgPSAkZGJoLT5xdWVyeSgiU0VMRUNUIGEgRlJPTSBwaHB0ZXN0Iik7CiAgICBpZiAoIURCOjppc0Vycm9yKCRyb3dzID0gJHJlcy0+bnVtUm93cygpKSkgewogICAgICAgIHByaW50ICcod2FudCAnIC4gKCRpICsgMikgLiAiKSBnb3QgJHJvd3MgZnJvbSAkaVxuIjsKICAgIH0gZWxzZSB7CiAgICAgICAgcHJpbnQgIlxuIjsKICAgIH0KfQoKJHJlcyA9ICRkYmgtPnF1ZXJ5KCdTRUxFQ1QgYSBGUk9NIHBocHRlc3QgV0hFUkUgYSA+ID8nLCBhcnJheSgwKSk7CmlmICghREI6OmlzRXJyb3IoJHJvd3MgPSAkcmVzLT5udW1Sb3dzKCkpKSB7CiAgICBwcmludCAiKHdhbnQgNSkgZ290ICRyb3dzIGZyb20gPiAwIChwYXNzaW5nIHBhcmFtcyB0byBxdWVyeSlcbiI7Cn0gZWxzZSB7CiAgICBwcmludCAiXG4iOwp9Cgokc3RoID0gJGRiaC0+cHJlcGFyZSgnU0VMRUNUIGEgRlJPTSBwaHB0ZXN0IFdIRVJFIGEgPCA/Jyk7CiRyZXMgPSAkZGJoLT5leGVjdXRlKCRzdGgsIGFycmF5KDQpKTsKaWYgKCFEQjo6aXNFcnJvcigkcm93cyA9ICRyZXMtPm51bVJvd3MoKSkpIHsKICAgIHByaW50ICIod2FudCA0KSBnb3QgJHJvd3MgZnJvbSA8IDQgKGRvaW5nIHByZXBhcmUvZXhlY3V0ZSlcbiI7Cn0gZWxzZSB7CiAgICBwcmludCAiXG4iOwp9CgokZGJoLT5xdWVyeSgiREVMRVRFIEZST00gcGhwdGVzdCBXSEVSRSBhIDwgNCIpOwokcmVzID0gJGRiaC0+cXVlcnkoIlNFTEVDVCBhIEZST00gcGhwdGVzdCIpOwppZiAoIURCOjppc0Vycm9yKCRyb3dzID0gJHJlcy0+bnVtUm93cygpKSkgewogICAgcHJpbnQgIih3YW50IDIpIGdvdCAkcm93cyBmcm9tIDUgYW5kIDYgbm90IGRlbGV0ZWRcbiI7Cn0gZWxzZSB7CiAgICBwcmludCAiXG4iOwp9CiRyZXMgPSAkZGJoLT5xdWVyeSgiU0VMRUNUIGEgRlJPTSBwaHB0ZXN0IHdoZXJlIGEgPCAwIik7CmlmICghREI6OmlzRXJyb3IoJHJvd3MgPSAkcmVzLT5udW1Sb3dzKCkpKSB7CiAgICBwcmludCAiKHdhbnQgMCkgZ290ICRyb3dzIGZyb20gPCAwXG4iOwp9IGVsc2UgewogICAgcHJpbnQgIlxuIjsKfQoKCmRyb3BfdGFibGUoJGRiaCwgJ3BocHRlc3QnKTsK]]></data>
	</file>
	<file>
	  <filename>/lib/pear/tests/prepexe.inc</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBUZXN0cyB0aGUgZHJpdmVycycgcHJlcGFyZSBhbmQgZXhlY3V0ZSBtZXRob2RzCiAqCiAqIEV4ZWN1dGVkIGJ5IGRyaXZlci8wNnByZXBleGVjLnBocHQKICoKICogUEhQIHZlcnNpb25zIDQgYW5kIDUKICoKICogTElDRU5TRTogVGhpcyBzb3VyY2UgZmlsZSBpcyBzdWJqZWN0IHRvIHZlcnNpb24gMy4wIG9mIHRoZSBQSFAgbGljZW5zZQogKiB0aGF0IGlzIGF2YWlsYWJsZSB0aHJvdWdoIHRoZSB3b3JsZC13aWRlLXdlYiBhdCB0aGUgZm9sbG93aW5nIFVSSToKICogaHR0cDovL3d3dy5waHAubmV0L2xpY2Vuc2UvM18wLnR4dC4gIElmIHlvdSBkaWQgbm90IHJlY2VpdmUgYSBjb3B5IG9mCiAqIHRoZSBQSFAgTGljZW5zZSBhbmQgYXJlIHVuYWJsZSB0byBvYnRhaW4gaXQgdGhyb3VnaCB0aGUgd2ViLCBwbGVhc2UKICogc2VuZCBhIG5vdGUgdG8gbGljZW5zZUBwaHAubmV0IHNvIHdlIGNhbiBtYWlsIHlvdSBhIGNvcHkgaW1tZWRpYXRlbHkuCiAqCiAqIEBjYXRlZ29yeSAgIERhdGFiYXNlCiAqIEBwYWNrYWdlICAgIERCCiAqIEBhdXRob3IgICAgIERhbmllbCBDb252aXNzb3IgPGRhbmllbGNAcGhwLm5ldD4KICogQGNvcHlyaWdodCAgMTk5Ny0yMDA1IFRoZSBQSFAgR3JvdXAKICogQGxpY2Vuc2UgICAgaHR0cDovL3d3dy5waHAubmV0L2xpY2Vuc2UvM18wLnR4dCAgUEhQIExpY2Vuc2UgMy4wCiAqIEB2ZXJzaW9uICAgICRJZDogcHJlcGV4ZS5pbmMsdiAxLjI3IDIwMDcvMDEvMDggMDA6MTk6NDggYWhhcnZleSBFeHAgJAogKiBAbGluayAgICAgICBodHRwOi8vcGVhci5waHAubmV0L3BhY2thZ2UvREIKICovCgokdG1wZmlsZSA9IHRlbXBuYW0oIi90bXAiLCAicGhwdG1wIik7CnJlZ2lzdGVyX3NodXRkb3duX2Z1bmN0aW9uKCJteV9zaHV0ZG93biIpOwokZnAgPSBmb3BlbigkdG1wZmlsZSwgInciKTsKJGZpbGVkYXRhID0gIm9wYXF1ZSBwbGFjZWhvbGRlcidzIHRlc3QiOwpmd3JpdGUoJGZwLCAkZmlsZWRhdGEpOwpmY2xvc2UoJGZwKTsKCgovKioKICogTG9jYWwgZXJyb3IgY2FsbGJhY2sgaGFuZGxlcgogKgogKiBQcmludHMgb3V0IGFuIGVycm9yIG1lc3NhZ2UgYW5kIGtpbGxzIHRoZSBwcm9jZXNzLgogKgogKiBAcGFyYW0gb2JqZWN0ICAkbyAgUEVBUiBlcnJvciBvYmplY3QgYXV0b21hdGljYWxseSBwYXNzZWQgdG8gdGhpcyBtZXRob2QKICogQHJldHVybiB2b2lkCiAqIEBzZWUgUEVBUjo6c2V0RXJyb3JIYW5kbGluZygpCiAqLwpmdW5jdGlvbiBwZSgkbykgewogICAgcHJpbnQgIlxuIiAuICRvLT50b1N0cmluZygpOwogICAgZXhpdDsKfQoKJGRiaC0+c2V0RXJyb3JIYW5kbGluZyhQRUFSX0VSUk9SX0NBTExCQUNLLCAncGUnKTsKCgovLyAxKSBNdWx0aXBsZSBwcmVwYXJlL2V4ZWMgSU5TRVJUIHF1ZXJpZXMKZWNobyAiLS0tLS0tLS0tLS0tMS0tLS0tLS0tLS0tLVxuIjsKCiRzdGgxID0gJGRiaC0+cHJlcGFyZSgiSU5TRVJUIElOVE8gcGhwdGVzdCAoYSwgYikgVkFMVUVTICg/LCAnYScpIik7CiRzdGgyID0gJGRiaC0+cHJlcGFyZSgiSU5TRVJUIElOVE8gcGhwdGVzdCAoYSxiKSBWQUxVRVMgKCEsPykiKTsKJHN0aDMgPSAkZGJoLT5wcmVwYXJlKCJJTlNFUlQgSU5UTyBwaHB0ZXN0IChhLGIsY2MpIFZBTFVFUyAoPywhLCYpIik7CiRzdGg0ID0gJGRiaC0+cHJlcGFyZSgiSU5TRVJUIElOVE8gcGhwdGVzdCAoYSwgYikgVkFMVUVTICg3MiwgJ2RpcmVjdCcpIik7CnByaW50ICJzdGgxLHN0aDIsc3RoMyxzdGg0IGNyZWF0ZWRcbiI7CnByaW50ICdzdGgxOiA/IGFzIHBhcmFtLCBwYXNzaW5nIGFzIGFycmF5Li4uICc7CmlmICgoJHJlcyA9ICRkYmgtPmV4ZWN1dGUoJHN0aDEsIGFycmF5KDcyKSkpID09PSBEQl9PSykgewogICAgcHJpbnQgInN0aDEgZXhlY3V0ZWRcbiI7Cn0gZWxzZSB7CiAgICBwcmludCAic3RoMSBmYWlsZWRcbiI7Cn0KCnByaW50ICdzdGgyOiAhIGFuZCA/IGFzIHBhcmFtcywgcGFzc2luZyBhcyBhcnJheS4uLiAnOwppZiAoKCRyZXMgPSAkZGJoLT5leGVjdXRlKCRzdGgyLCBhcnJheSg3MiwgInRoYXQncyByaWdodCIpKSkgPT09IERCX09LKSB7CiAgICBwcmludCAic3RoMiBleGVjdXRlZFxuIjsKfSBlbHNlIHsKICAgIHByaW50ICJzdGgyIGZhaWxlZFxuIjsKfQoKcHJpbnQgJ3N0aDM6ID8sICEgYW5kICYgYXMgcGFyYW1zLCBwYXNzaW5nIGFzIGFycmF5Li4uICc7CnN3aXRjaCAoJGRiaC0+cGhwdHlwZSkgewogICAgY2FzZSAnbXNxbCc6CiAgICAgICAgJHJlcyA9ICRkYmgtPmV4ZWN1dGUoJHN0aDMsIGFycmF5KDcyLCAiJ2l0XFwncyBnb29kJyIsICR0bXBmaWxlKSk7CiAgICAgICAgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICAgICRyZXMgPSAkZGJoLT5leGVjdXRlKCRzdGgzLCBhcnJheSg3MiwgIidpdCcncyBnb29kJyIsICR0bXBmaWxlKSk7Cn0KaWYgKCRyZXMgPT09IERCX09LKSB7CiAgICBwcmludCAic3RoMyBleGVjdXRlZFxuIjsKfSBlbHNlIHsKICAgIHByaW50ICJzdGgzIGZhaWxlZFxuIjsKfQoKcHJpbnQgJ3N0aDQ6IG5vIHBhcmFtcy4uLiAnOwppZiAoKCRyZXMgPSAkZGJoLT5leGVjdXRlKCRzdGg0KSkgPT09IERCX09LKSB7CiAgICBwcmludCAic3RoNCBleGVjdXRlZFxuIjsKfSBlbHNlIHsKICAgIHByaW50ICJzdGg0IGZhaWxlZFxuIjsKfQpwcmludF9yZXN1bHRzKCk7CgoKLy8gMikgT25lIHByZXBhcmVkLCBtdWx0aXBsZSB0aW1lIGV4ZWN1dGVkCmVjaG8gIlxuLS0tLS0tLS0tLS0tMi0tLS0tLS0tLS0tLVxuIjsKCiRkYmgtPnF1ZXJ5KCdERUxFVEUgRlJPTSBwaHB0ZXN0Jyk7CiRzdGggPSAkZGJoLT5wcmVwYXJlKCdJTlNFUlQgSU5UTyBwaHB0ZXN0IChhLCBiLCBjYywgZCkgVkFMVUVTICg/LCA/LCAmLCA/KScpOwokZGF0YSA9IGFycmF5KAogICAgMCA9PiBhcnJheSg3MiwgJ3NldDEnLCAkdG1wZmlsZSwgJzEyMzQtNTYtNzgnKSwKICAgIDEgPT4gYXJyYXkoNzIsICdzZXQyJywgJHRtcGZpbGUsIG51bGwpLAogICAgMiA9PiBhcnJheSg3MiwgJ3NldDMnLCAkdG1wZmlsZSwgbnVsbCkKKTsKJHJlcyA9ICRkYmgtPmV4ZWN1dGVNdWx0aXBsZSgkc3RoLCAkZGF0YSk7CnByaW50X3Jlc3VsdHMoKTsKCgovLyAzKSBmcmVlUHJlcGFyZWQoKSB0ZXN0CmVjaG8gIlxuLS0tLS0tLS0tLS0tMy0tLS0tLS0tLS0tLVxuIjsKCmlmICgkZGJoLT5mcmVlUHJlcGFyZWQoJHN0aCkpIHsKICAgIGVjaG8gJ1RSVUUnOwp9IGVsc2UgewogICAgZWNobyAnRkFMU0UnOwp9CmVjaG8gIlxuIjsKaWYgKCRkYmgtPmZyZWVQcmVwYXJlZCg2NjYpKSB7CiAgICBlY2hvICdUUlVFJzsKfSBlbHNlIHsKICAgIGVjaG8gJ0ZBTFNFJzsKfQplY2hvICJcbiI7CgoKLy8gNCkgU0VMRUNUcyB0ZXN0cwplY2hvICJcbi0tLS0tLS0tLS0tLTQtLS0tLS0tLS0tLS1cbiI7CiRzdGgxID0gJGRiaC0+cHJlcGFyZSgiU0VMRUNUICogRlJPTSBwaHB0ZXN0IFdIRVJFIGEgPSA/IE9SREVSIEJZIGIiKTsKcHJpbnRfNCgkc3RoMSwgNzIpOwpwcmludF80KCRzdGgxLCA3MSk7CiRzdGgyID0gJGRiaC0+cHJlcGFyZSgiU0VMRUNUICogRlJPTSBwaHB0ZXN0IFdIRVJFIGQgPSA/IE9SREVSIEJZIGIiKTsKcHJpbnRfNCgkc3RoMiwgJzEyMzQtNTYtNzgnKTsKJHN0aDMgPSAkZGJoLT5wcmVwYXJlKCJTRUxFQ1QgKiBGUk9NIHBocHRlc3QgV0hFUkUgY2MgPSAmIE9SREVSIEJZIGIiKTsKcHJpbnRfNCgkc3RoMywgJHRtcGZpbGUpOwoKCi8vIDUpIEFTU09DSUFUSVZFIEFSUkFZIHF1ZXJpZXMKZWNobyAiXG4tLS0tLS0tLS0tLS01LS0tLS0tLS0tLS0tXG4iOwoKJHN0aDUgPSAkZGJoLT5wcmVwYXJlKCdJTlNFUlQgSU5UTyBwaHB0ZXN0IChhLCBiLCBkKSBWQUxVRVMgKD8sID8sID8pJyk7CiRhcnJheSA9IGFycmF5KAogICAgJ2ZvbycgPT4gMTEsCiAgICAnYmFyJyA9PiAndGhyZWUnLAogICAgJ2JheicgPT4gbnVsbCwKKTsKJHJlcyA9ICRkYmgtPmV4ZWN1dGUoJHN0aDUsICRhcnJheSk7CnByaW50ICdpbnNlcnQ6ICcgLiAoJHJlcyA9PT0gREJfT0sgPyAnb2theScgOiAnZXJyb3InKSAuICJcbiI7Cgokc3RoNiA9ICRkYmgtPnByZXBhcmUoJ1NFTEVDVCBhLCBiLCBkIEZST00gcGhwdGVzdCBXSEVSRSBhID0gPycpOwokcmVzID0gJGRiaC0+ZXhlY3V0ZSgkc3RoNiwgYXJyYXkoMTEpKTsKJHJvdyA9ICRyZXMtPmZldGNoUm93KERCX0ZFVENITU9ERV9BU1NPQyk7CnByaW50ICJhID0geyRyb3dbJ2EnXX0sIGIgPSB7JHJvd1snYiddfSwgZCA9ICI7CmlmICgkZGJoLT5waHB0eXBlID09ICdtc3FsJykgewogICAgaWYgKGFycmF5X2tleV9leGlzdHMoJ2QnLCAkcm93KSkgewogICAgICAgICR0eXBlID0gZ2V0dHlwZSgkcm93WydkJ10pOwogICAgICAgIGlmICgkdHlwZSA9PSAnTlVMTCcgfHwgJHJvd1snZCddID09ICcnKSB7CiAgICAgICAgICAgIHByaW50ICJnb3QgZXhwZWN0ZWQgb3V0Y29tZVxuIjsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkdHlwZSA9IGdldHR5cGUoJHJvd1snZCddKTsKICAgICAgICAgICAgcHJpbnQgIlVOLWV4cGVjdGVkIG91dGNvbWU6ICR0eXBlXG4iOwogICAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgICAgLy8gaHR0cDovL2J1Z3MucGhwLm5ldC8/aWQ9MzE5NjAKICAgICAgICBwcmludCAiUHJpb3IgdG8gUEhQIDQuMy4xMSBvciA1LjAuNCwgUEhQJ3MgbXNxbCBleHRlbnNpb24gc2lsZW50bHkiCiAgICAgICAgICAgICAgLiAiIGRyb3BwZWQgY29sdW1ucyB3aXRoIG51bGwgdmFsdWVzLiBZb3UgbmVlZCB0byB1cGdyYWRlLlxuIjsKICAgIH0KfSBlbHNlIHsKICAgICR0eXBlID0gZ2V0dHlwZSgkcm93WydkJ10pOwogICAgaWYgKCR0eXBlID09ICdzdHJpbmcnKSB7CiAgICAgICAgcHJpbnQgImdvdCBleHBlY3RlZCBvdXRjb21lXG4iOwogICAgfSBlbHNlIHsKICAgICAgICBwcmludCAiVU4tZXhwZWN0ZWQgb3V0Y29tZTogJHR5cGVcbiI7CiAgICB9Cn0KCi8qKgogKiBBdXRvbWF0aWNhbGx5IGZyZWUgdGhlIHByZXBhcmVkIHN0YXRlbWVudHMgYW5kIHJlc3VsdHMgd2hlbiB0aGUgc2NyaXB0CiAqIHRlcm1pbmF0ZXMKICoKICogQHJldHVybiB2b2lkCiAqLwpmdW5jdGlvbiBteV9zaHV0ZG93bigpIHsKICAgIGdsb2JhbCAkdG1wZmlsZSwgJGRiaCwgJHN0aDEsICRzdGgyLCAkc3RoMywgJHN0aDQsICRzdGg1LCAkc3RoNiwgJHJlczsKCiAgICBzd2l0Y2ggKCRkYmgtPnBocHR5cGUpIHsKICAgICAgICBjYXNlICdpYmFzZSc6CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIEludGVyYmFzZSBkb2Vzbid0IGFsbG93IGRyb3BwaW5nIHRhYmxlcyB0aGF0IGhhdmUgcmVzdWx0CiAgICAgICAgICAgICAqIHNldHMgc3RpbGwgb3Blbi4KICAgICAgICAgICAgICovCiAgICAgICAgICAgICRkYmgtPmZyZWVQcmVwYXJlZCgkc3RoMSk7CiAgICAgICAgICAgICRkYmgtPmZyZWVQcmVwYXJlZCgkc3RoMik7CiAgICAgICAgICAgICRkYmgtPmZyZWVQcmVwYXJlZCgkc3RoMyk7CiAgICAgICAgICAgICRkYmgtPmZyZWVQcmVwYXJlZCgkc3RoNCk7CiAgICAgICAgICAgICRkYmgtPmZyZWVQcmVwYXJlZCgkc3RoNSk7CiAgICAgICAgICAgICRkYmgtPmZyZWVQcmVwYXJlZCgkc3RoNik7CiAgICAgICAgICAgICRkYmgtPmZyZWVSZXN1bHQoJHJlcy0+cmVzdWx0KTsKICAgICAgICAgICAgYnJlYWs7CiAgICB9CgogICAgJGRiaC0+c2V0RXJyb3JIYW5kbGluZyhQRUFSX0VSUk9SX1JFVFVSTik7CiAgICBkcm9wX3RhYmxlKCRkYmgsICdwaHB0ZXN0Jyk7CgogICAgdW5saW5rKCR0bXBmaWxlKTsKfQoKLyoqCiAqIFByaW50IG91dCB0aGUgZGF0YSBpbiB0ZXN0IHRhYmxlCiAqCiAqIEByZXR1cm4gdm9pZAogKi8KZnVuY3Rpb24gcHJpbnRfcmVzdWx0cygpIHsKICAgIGdsb2JhbCAkZGJoOwogICAgcHJpbnQgInJlc3VsdHM6XG4iOwogICAgJHJlcyA9ICRkYmgtPnF1ZXJ5KCJTRUxFQ1QgKiBGUk9NIHBocHRlc3QgV0hFUkUgYSA9IDcyIE9SREVSIEJZIGIiKTsKICAgICRpID0gMDsKICAgIHdoaWxlICgkcm93ID0gJHJlcy0+ZmV0Y2hSb3coREJfRkVUQ0hNT0RFX09SREVSRUQpKSB7CiAgICAgICAgcHJpbnQgJ3wnIC4gaW1wbG9kZSgiIC0gIiwgJHJvdykgLiAifFxuIjsKICAgICAgICAkaSsrOwogICAgfQogICAgaWYgKCEkaSkgewogICAgICAgIHByaW50ICJUaGUgcmVjb3JkcyB3ZXJlIG5vdCBmb3VuZC4gIERpZCB0aGV5IGdldCBpbnNlcnRlZD9cbiI7CiAgICB9Cn0KCi8qKgogKiBFeGVjdXRlIHRoZSBwcmVwYXJlZCBzdGF0ZW1lbnQgYW5kIHByaW50IG91dCB0aGUgZGF0YSBpbiB0aGUgcmVzdWx0CiAqCiAqIEBwYXJhbSByZXNvdXJjZSAgICAgJHN0aCAgIHRoZSBzdGF0ZW1lbnQgaGFuZGxlIHRvIHByb2Nlc3MKICogQHBhcmFtIHN0cmluZ3xhcnJheSAkYmluZCAgdGhlIGRhdGEgdGhhdCB3aWxsIHJlcGxhY2UgdGhlIHBsYWNlaG9sZGVycwogKgogKiBAcmV0dXJuIHZvaWQKICovCmZ1bmN0aW9uIHByaW50XzQoJHN0aCwgJGJpbmQpIHsKICAgIGdsb2JhbCAkZGJoOwogICAgJHJlcyA9ICRkYmgtPmV4ZWN1dGUoJHN0aCwgJGJpbmQpOwogICAgd2hpbGUgKCRyb3cgPSAkcmVzLT5mZXRjaFJvdyhEQl9GRVRDSE1PREVfT1JERVJFRCkpIHsKICAgICAgICBwcmludCAnfCcgLiBpbXBsb2RlKCIgLSAiLCAkcm93KSAuICJ8XG4iOwogICAgfQogICAgZWNobyAifn5cbiI7Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/pear/tests/run.cvs</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[IyEgL2Jpbi9zaAoKIyAkSWQ6IHJ1bi5jdnMsdiAxLjMgMjAwNC8wMi8yMCAxODo1Nzo1MSBkYW5pZWxjIEV4cCAkCgojIHZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2CiMgUEVBUiBEQiBURVNUIFNUQVJURVIKIwojICAgVG8gcnVuIGFsbCB0ZXN0czogIC4vcnVuCiMgICBUbyBydW4gb25lIHRlc3Q6ICAgLi9ydW4gPHRlc3QgZmlsZSBuYW1lPgojICAgRXhhbXBsZTogICAgICAgICAgIC4vcnVuIGRiX3BhcnNlZHNuLnBocHQKIwojIEJlZm9yZSBydW5uaW5nIHRoZSB0ZXN0cyB5b3UgbXVzdCBhZGp1c3QgdGhlCiMgZm9sbG93aW5nIHRocmVlIHZhcmlhYmxlczoKCiMgICBUaGUgZnVsbCBwYXRoIHRvIHlvdXIgUEhQIGRpcmVjdG9yeToKICAgIERCX1RFU1RfUEhQX1BBVEg9YzovcHJvZ3JhfjEvcGhwCgojICAgVGhlIG5hbWUgb2YgeW91ciBQSFAgQ0xJIGV4ZWN1dGFibGUKIyAgIChleGFtcGxlcyBwaHAuZXhlLCBwaHAtY2xpLmV4ZSwgY2xpL3BocC5leGUpOgogICAgREJfVEVTVF9QSFBfQ0xJPXBocC5leGUKCiMgICBUaGUgZnVsbCBwYXRoIHRvIHRoZSBwcmVzZW50IGRpcmVjdG9yeQojICAgKG5vdCB1c2luZyAkUFdEIGR1ZSB0byBDeWd3aW4pOgogICAgREJfVEVTVF9ESVI9ZDovcGVhcnRlc3QvcGVhci9EQi90ZXN0cwoKIyBeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXgoKCgpURVNUX1BIUF9FWEVDVVRBQkxFPSREQl9URVNUX1BIUF9QQVRILyREQl9URVNUX1BIUF9DTEkKZXhwb3J0IFRFU1RfUEhQX0VYRUNVVEFCTEUKCmlmIFsgJCMgLWd0IDAgXQp0aGVuCiAgICB0ZXN0PSQxCmVsc2UKICAgIHRlc3Q9Ki5waHB0CmZpCgokVEVTVF9QSFBfRVhFQ1VUQUJMRSAkREJfVEVTVF9QSFBfUEFUSC9ydW4tdGVzdHMucGhwICREQl9URVNUX0RJUi8ke3Rlc3R9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/pear/tests/sequences.inc</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBUZXN0cyB0aGUgZHJpdmVycycgc2VxdWVuY2UgKGFrYSBhdXRvX2luY3JlbWVudCkgbWV0aG9kcwogKgogKiBFeGVjdXRlZCBieSBkcml2ZXIvMDVzZXF1ZW5jZXMucGhwdAogKgogKiBQSFAgdmVyc2lvbnMgNCBhbmQgNQogKgogKiBMSUNFTlNFOiBUaGlzIHNvdXJjZSBmaWxlIGlzIHN1YmplY3QgdG8gdmVyc2lvbiAzLjAgb2YgdGhlIFBIUCBsaWNlbnNlCiAqIHRoYXQgaXMgYXZhaWxhYmxlIHRocm91Z2ggdGhlIHdvcmxkLXdpZGUtd2ViIGF0IHRoZSBmb2xsb3dpbmcgVVJJOgogKiBodHRwOi8vd3d3LnBocC5uZXQvbGljZW5zZS8zXzAudHh0LiAgSWYgeW91IGRpZCBub3QgcmVjZWl2ZSBhIGNvcHkgb2YKICogdGhlIFBIUCBMaWNlbnNlIGFuZCBhcmUgdW5hYmxlIHRvIG9idGFpbiBpdCB0aHJvdWdoIHRoZSB3ZWIsIHBsZWFzZQogKiBzZW5kIGEgbm90ZSB0byBsaWNlbnNlQHBocC5uZXQgc28gd2UgY2FuIG1haWwgeW91IGEgY29weSBpbW1lZGlhdGVseS4KICoKICogQGNhdGVnb3J5ICAgRGF0YWJhc2UKICogQHBhY2thZ2UgICAgREIKICogQGF1dGhvciAgICAgRGFuaWVsIENvbnZpc3NvciA8ZGFuaWVsY0BwaHAubmV0PgogKiBAY29weXJpZ2h0ICAxOTk3LTIwMDUgVGhlIFBIUCBHcm91cAogKiBAbGljZW5zZSAgICBodHRwOi8vd3d3LnBocC5uZXQvbGljZW5zZS8zXzAudHh0ICBQSFAgTGljZW5zZSAzLjAKICogQHZlcnNpb24gICAgJElkOiBzZXF1ZW5jZXMuaW5jLHYgMS4xMSAyMDA1LzAyLzE4IDIyOjM4OjQzIGRhbmllbGMgRXhwICQKICogQGxpbmsgICAgICAgaHR0cDovL3BlYXIucGhwLm5ldC9wYWNrYWdlL0RCCiAqLwoKLyoqCiAqIExvY2FsIGVycm9yIGhhbmRsZXIKICovCmZ1bmN0aW9uIGVycm9yX2hhbmRsZXIoJiRvYmopIHsKICAgIHByaW50ICJzZXF1ZW5jZXMuaW5jIGVycm9yX2hhbmRsZXI6XG4gICAgIjsKICAgIHByaW50ICRvYmotPmdldERlYnVnSW5mbygpIC4gIlxuXG4iOwp9Cm9iX2ltcGxpY2l0X2ZsdXNoKHRydWUpOwoKJGRyb3AgPSAkZGJoLT5kcm9wU2VxdWVuY2UoJ3Rlc3QnKTsKaWYgKERCOjppc0Vycm9yKCRkcm9wKSAmJgogICAgJGRyb3AtPmdldENvZGUoKSAhPSBEQl9FUlJPUl9OT1NVQ0hUQUJMRSkKewogICAgcHJpbnQgIkNvdWxkIG5vdCBkcm9wIHNlcXVlbmNlLi4uXG4iOwogICAgcHJpbnQgJGRyb3AtPmdldERlYnVnSW5mbygpIC4gIlxuXG4iOwogICAgaWYgKCRkYmgtPnBocHR5cGUgPT0gJ2liYXNlJyAmJgogICAgICAgICRkcm9wLT5nZXRDb2RlKCkgPT0gREJfRVJST1JfQUNDRVNTX1ZJT0xBVElPTikKICAgIHsKICAgICAgICBwcmludCAiVXNlIHRoaXMgcXVlcnkgdG8gcHJvdmlkZSB0aGUgcGVybWlzc2lvbnMgbmVlZGVkOlxuIjsKICAgICAgICBwcmludCAnICAgZ3JhbnQgYWxsIG9uIFJEQiRHRU5FUkFUT1JTIHRvIDxVU0VSTkFNRT4nOwogICAgfQogICAgZXhpdDsKfQoKLy8gMSkgdGVzdCB0aGF0IHNlcXVlbmNlcyBhcmUgbm90IGNyZWF0ZWQgaWYgIm9uZGVtYW5kIiBpcyBmYWxzZQoKJGUgPSAkZGJoLT5uZXh0SWQoInRlc3QiLCBmYWxzZSk7CmlmIChEQjo6aXNFcnJvcigkZSkgJiYgJGUtPmdldENvZGUoKSA9PSBEQl9FUlJPUl9OT1NVQ0hUQUJMRSkgewogICAgcHJpbnQgImFuIGVycm9yIGlzIHRoZSBwcm9wZXIgcmVzcG9uc2UgaGVyZVxuIjsKfSBlbHNlIHsKICAgIGlmIChEQjo6aXNFcnJvcigkZSkpIHsKICAgICAgICBpZiAoJGRiaC0+cGhwdHlwZSA9PSAnaWJhc2UnICYmICRlLT5nZXRDb2RlKCkgPT0gREJfRVJST1JfU1lOVEFYKSB7CiAgICAgICAgICAgIHByaW50ICJhbiBlcnJvciBpcyB0aGUgcHJvcGVyIHJlc3BvbnNlIGhlcmVcbiI7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcHJpbnQgInRlc3QgMSkgd2UgZXhwZWN0ZWQgdG8gZ2V0IGJhY2sgJ0RCIEVycm9yOiBubyBzdWNoIHRhYmxlJy5cbiI7CiAgICAgICAgICAgIHByaW50ICJIZXJlIGlzIHRoZSBlcnJvciB3ZSBnb3Q6XG4iOwogICAgICAgICAgICBwcmludCAnQ29kZTogJyAuICRlLT5nZXRDb2RlKCkgLiAiXG4iOwogICAgICAgICAgICBwcmludCAnTWVzc2FnZTogJyAuICRlLT5nZXRNZXNzYWdlKCkgLiAiXG4iOwogICAgICAgICAgICBwcmludCAnRGVidWc6ICcgLiAkZS0+Z2V0RGVidWdJbmZvKCkgLiAiXG5cbiI7CiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICBwcmludCAidGVzdCAxKSB3ZSBleHBlY3RlZCB0byBnZXQgYmFjayAnREIgRXJyb3I6IG5vIHN1Y2ggdGFibGUnLlxuIjsKICAgICAgICBwcmludCAiQnV0IGFuIGVycm9yIHdhc24ndCBnZW5lcmF0ZWRcblxuIjsKICAgIH0KfQoKLy8gMikgdGVzdCB0aGF0IHRoZSBzZXF1ZW5jZSBpcyBub3QgY3JlYXRlZCBidXQgdGhlIGVycm9yIGlzCi8vIGhhbmRsZWQgYnkgdGhlIGNsYXNzIGVycm9yIGhhbmRsZXIKJGRiaC0+c2V0RXJyb3JIYW5kbGluZyhQRUFSX0VSUk9SX1BSSU5ULAogICAgICAgICAgICAgICAgICAgICAgICJhbiBlcnJvciBjb3VnaHQgYnkgdGhlIGVycm9yIGhhbmRsZXIgaXMgZ29vZFxuIik7CiRlID0gJGRiaC0+bmV4dElkKCJ0ZXN0IiwgZmFsc2UpOwppZiAoIURCOjppc0Vycm9yKCRlKSkgewogICAgcHJpbnQgInRlc3QgMikgZmFpbGVkIVxuIjsKfQokZGJoLT5fZGVmYXVsdF9lcnJvcl9tb2RlID0gbnVsbDsKCi8vIDMpIHRlc3QgdGhhdCBzZXF1ZW5jZXMgYXJlIGNyZWF0ZWQgaWYgIm9uZGVtYW5kIiBpcyB0cnVlLCBhbmQgdGhhdAovLyB0d28gc3VjY2Vzc2l2ZSBuZXh0SWRzIHJldHVybiBhZGphY2VudCB2YWx1ZXMKJGEgPSAkZGJoLT5uZXh0SWQoInRlc3QiKTsKJGIgPSAkZGJoLT5uZXh0SWQoInRlc3QiKTsKaWYgKERCOjppc0Vycm9yKCRhKSkgewogICAgcHJpbnQgJ2E6ICcgLiAkYS0+Z2V0RGVidWdJbmZvKCkgLiAiXG5cbiI7Cn0gZWxzZSB7CiAgICBwcmludCAiYT0kYVxuIjsKfQppZiAoREI6OmlzRXJyb3IoJGIpKSB7CiAgICBwcmludCAnYjogJyAuICRiLT5nZXREZWJ1Z0luZm8oKSAuICJcblxuIjsKfSBlbHNlIHsKICAgIHByaW50ICJiPSRiXG4iOwp9CmlmICghREI6OmlzRXJyb3IoJGEpICYmICFEQjo6aXNFcnJvcigkYikpIHsKICAgIHByaW50ICdiLWE9JyAuICgkYi0kYSkgLiAiXG4iOwp9CgovLyA0KSB0ZXN0IHRoYXQgdGhlIHVzZXItc3BlY2lmaWVkIGVycm9yIGhhbmRsZXIgaXMgcmVhbGx5IGRpc2FibGVkCi8vIGR1cmluZyBuZXh0SWQsIHdpdGggcGVyLW9iamVjdCBoYW5kbGVyIGFzIHdlbGwgYXMgZ2xvYmFsIGhhbmRsZXIKJGRiaC0+ZHJvcFNlcXVlbmNlKCJ0ZXN0Iik7CgokZGJoLT5zZXRFcnJvckhhbmRsaW5nKFBFQVJfRVJST1JfQ0FMTEJBQ0ssICdlcnJvcl9oYW5kbGVyJyk7CiRjID0gJGRiaC0+bmV4dElkKCJ0ZXN0Iik7CmlmICghREI6OmlzRXJyb3IoJGMpKSB7CiAgICBwcmludCAiYz0kY1xuIjsKfQokZGJoLT5kcm9wU2VxdWVuY2UoInRlc3QiKTsKJGRiaC0+X2RlZmF1bHRfZXJyb3JfbW9kZSA9IG51bGw7CiRkID0gJGRiaC0+bmV4dElkKCJ0ZXN0Iik7CmlmICghREI6OmlzRXJyb3IoJGQpKSB7CiAgICBwcmludCAiZD0kZFxuIjsKfQoKLy8gNSkgdGVzdCB0aGF0IHRoZSBzZXF1ZW5jZSBpcyBoYW5kbGVkIHJpZ2h0IHdoZW4gdGhlIHRhYmxlIGlzIGVtcHR5CgovLyBCYWNrZW5kIHdpdGggcmVhbCBzZXF1ZW5jZXMgbWF5IGRvbid0IGxpa2UgdGhhdApQRUFSOjpwdXNoRXJyb3JIYW5kbGluZyhQRUFSX0VSUk9SX1JFVFVSTik7CiRkYmgtPnF1ZXJ5KCdERUxFVEUgRlJPTSB0ZXN0X3NlcScpOwpQRUFSOjpwb3BFcnJvckhhbmRsaW5nKCk7CiRlID0gJGRiaC0+bmV4dElEKCd0ZXN0Jyk7CmlmIChEQjo6aXNFcnJvcigkZCkpIHsKICAgIHByaW50ICdlOiAnIC4gJGQtPmdldERlYnVnSW5mbygpIC4gIlxuXG4iOwp9IGVsc2UgewogICAgcHJpbnQgImU9JGRcbiI7Cn0KCi8vIGZpbmFsIGNsZWFuLXVwCiRkYmgtPmRyb3BTZXF1ZW5jZSgidGVzdCIpOwo=]]></data>
	</file>
	<file>
	  <filename>/lib/pear/tests/simplequery.inc</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBUZXN0cyB0aGUgZHJpdmVycycgc2ltcGxlUXVlcnkoKSBtZXRob2QKICoKICogRXhlY3V0ZWQgYnkgZHJpdmVyLzAzc2ltcGxlcXVlcnkucGhwdAogKgogKiBQSFAgdmVyc2lvbnMgNCBhbmQgNQogKgogKiBMSUNFTlNFOiBUaGlzIHNvdXJjZSBmaWxlIGlzIHN1YmplY3QgdG8gdmVyc2lvbiAzLjAgb2YgdGhlIFBIUCBsaWNlbnNlCiAqIHRoYXQgaXMgYXZhaWxhYmxlIHRocm91Z2ggdGhlIHdvcmxkLXdpZGUtd2ViIGF0IHRoZSBmb2xsb3dpbmcgVVJJOgogKiBodHRwOi8vd3d3LnBocC5uZXQvbGljZW5zZS8zXzAudHh0LiAgSWYgeW91IGRpZCBub3QgcmVjZWl2ZSBhIGNvcHkgb2YKICogdGhlIFBIUCBMaWNlbnNlIGFuZCBhcmUgdW5hYmxlIHRvIG9idGFpbiBpdCB0aHJvdWdoIHRoZSB3ZWIsIHBsZWFzZQogKiBzZW5kIGEgbm90ZSB0byBsaWNlbnNlQHBocC5uZXQgc28gd2UgY2FuIG1haWwgeW91IGEgY29weSBpbW1lZGlhdGVseS4KICoKICogQGNhdGVnb3J5ICAgRGF0YWJhc2UKICogQHBhY2thZ2UgICAgREIKICogQGF1dGhvciAgICAgRGFuaWVsIENvbnZpc3NvciA8ZGFuaWVsY0BwaHAubmV0PgogKiBAY29weXJpZ2h0ICAxOTk3LTIwMDUgVGhlIFBIUCBHcm91cAogKiBAbGljZW5zZSAgICBodHRwOi8vd3d3LnBocC5uZXQvbGljZW5zZS8zXzAudHh0ICBQSFAgTGljZW5zZSAzLjAKICogQHZlcnNpb24gICAgJElkOiBzaW1wbGVxdWVyeS5pbmMsdiAxLjggMjAwNS8wMi8wMyAwNTo0OTo0NCBkYW5pZWxjIEV4cCAkCiAqIEBsaW5rICAgICAgIGh0dHA6Ly9wZWFyLnBocC5uZXQvcGFja2FnZS9EQgogKi8KCi8qKgogKiBMb2NhbCBlcnJvciBjYWxsYmFjayBoYW5kbGVyCiAqCiAqIERyb3BzIHRoZSBwaHB0ZXN0IHRhYmxlLCBwcmludHMgb3V0IGFuIGVycm9yIG1lc3NhZ2UgYW5kIGtpbGxzIHRoZQogKiBwcm9jZXNzLgogKgogKiBAcGFyYW0gb2JqZWN0ICAkbyAgUEVBUiBlcnJvciBvYmplY3QgYXV0b21hdGljYWxseSBwYXNzZWQgdG8gdGhpcyBtZXRob2QKICogQHJldHVybiB2b2lkCiAqIEBzZWUgUEVBUjo6c2V0RXJyb3JIYW5kbGluZygpCiAqLwpmdW5jdGlvbiBwZSgkbykgewogICAgZ2xvYmFsICRkYmg7CgogICAgJGRiaC0+c2V0RXJyb3JIYW5kbGluZyhQRUFSX0VSUk9SX1JFVFVSTik7CiAgICBkcm9wX3RhYmxlKCRkYmgsICdwaHB0ZXN0Jyk7CgogICAgZGllKCRvLT50b1N0cmluZygpKTsKfQoKJGRiaC0+c2V0RXJyb3JIYW5kbGluZyhQRUFSX0VSUk9SX0NBTExCQUNLLCAncGUnKTsKCgokc3RoID0gJGRiaC0+c2ltcGxlUXVlcnkoIlNFTEVDVCAqIEZST00gcGhwdGVzdCIpOwoKc3dpdGNoICgkZGJoLT5waHB0eXBlKSB7CiAgICBjYXNlICdteXNxbGknOgogICAgICAgIGlmIChpc19hKCRzdGgsICdteXNxbGlfcmVzdWx0JykpIHsKICAgICAgICAgICAgcHJpbnQgInBhc3NlZFxuIjsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBwcmludCAiUFJPQkxFTVxuIjsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICAgIGlmIChnZXR0eXBlKCRzdGgpID09ICdyZXNvdXJjZScpIHsKICAgICAgICAgICAgcHJpbnQgInBhc3NlZFxuIjsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBwcmludCAiUFJPQkxFTVxuIjsKICAgICAgICB9Cn0KCgpzd2l0Y2ggKCRkYmgtPnBocHR5cGUpIHsKICAgIGNhc2UgJ2liYXNlJzoKICAgICAgICAvKgogICAgICAgICAqIEludGVyYmFzZSBkb2Vzbid0IGFsbG93IGRyb3BwaW5nIHRhYmxlcyB0aGF0IGhhdmUgcmVzdWx0CiAgICAgICAgICogc2V0cyBzdGlsbCBvcGVuLgogICAgICAgICAqLwogICAgICAgICRkYmgtPmZyZWVSZXN1bHQoJHN0aCk7CiAgICAgICAgYnJlYWs7Cn0KJGRiaC0+c2V0RXJyb3JIYW5kbGluZyhQRUFSX0VSUk9SX1JFVFVSTik7CmRyb3BfdGFibGUoJGRiaCwgJ3BocHRlc3QnKTsK]]></data>
	</file>
	<file>
	  <filename>/lib/pear/tests/skipif.inc</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBBIHRlc3QgdG8gbWFrZSBzdXJlIFBFQVIgREIgY2FuIGJlIGZvdW5kCiAqCiAqIFBIUCB2ZXJzaW9ucyA0IGFuZCA1CiAqCiAqIExJQ0VOU0U6IFRoaXMgc291cmNlIGZpbGUgaXMgc3ViamVjdCB0byB2ZXJzaW9uIDMuMCBvZiB0aGUgUEhQIGxpY2Vuc2UKICogdGhhdCBpcyBhdmFpbGFibGUgdGhyb3VnaCB0aGUgd29ybGQtd2lkZS13ZWIgYXQgdGhlIGZvbGxvd2luZyBVUkk6CiAqIGh0dHA6Ly93d3cucGhwLm5ldC9saWNlbnNlLzNfMC50eHQuICBJZiB5b3UgZGlkIG5vdCByZWNlaXZlIGEgY29weSBvZgogKiB0aGUgUEhQIExpY2Vuc2UgYW5kIGFyZSB1bmFibGUgdG8gb2J0YWluIGl0IHRocm91Z2ggdGhlIHdlYiwgcGxlYXNlCiAqIHNlbmQgYSBub3RlIHRvIGxpY2Vuc2VAcGhwLm5ldCBzbyB3ZSBjYW4gbWFpbCB5b3UgYSBjb3B5IGltbWVkaWF0ZWx5LgogKgogKiBAY2F0ZWdvcnkgICBEYXRhYmFzZQogKiBAcGFja2FnZSAgICBEQgogKiBAYXV0aG9yICAgICBEYW5pZWwgQ29udmlzc29yIDxkYW5pZWxjQHBocC5uZXQ+CiAqIEBjb3B5cmlnaHQgIDE5OTctMjAwNSBUaGUgUEhQIEdyb3VwCiAqIEBsaWNlbnNlICAgIGh0dHA6Ly93d3cucGhwLm5ldC9saWNlbnNlLzNfMC50eHQgIFBIUCBMaWNlbnNlIDMuMAogKiBAdmVyc2lvbiAgICAkSWQ6IHNraXBpZi5pbmMsdiAxLjIgMjAwNS8wMi8wMyAwNTo0OTo0NCBkYW5pZWxjIEV4cCAkCiAqIEBsaW5rICAgICAgIGh0dHA6Ly9wZWFyLnBocC5uZXQvcGFja2FnZS9EQgogKi8KCi8qKgogKiBTZXQgdXAgdGhlIGluY2x1ZGVfcGF0aCwgZXJyb3JfcmVwb3J0aW5nIGFuZCBQQVRIX1NFUEFSQVRPUgogKi8KcmVxdWlyZV9vbmNlICcuL2luY2x1ZGUuaW5jJzsKCmlmICghaW5jbHVkZV9vbmNlICdEQi5waHAnKSB7CiAgICBwcmludCAnc2tpcCBjb3VsZCBub3QgZmluZCBEQi5waHAnOwp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/pear/tests/transactions.inc</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBUZXN0cyB0aGUgZHJpdmVycycgdHJhbnNhY3Rpb24gaGFuZGxpbmcgbWV0aG9kcwogKgogKiBFeGVjdXRlZCBieSBkcml2ZXIvMTF0cmFuc2FjdGlvbnMucGhwdAogKgogKiBQSFAgdmVyc2lvbnMgNCBhbmQgNQogKgogKiBMSUNFTlNFOiBUaGlzIHNvdXJjZSBmaWxlIGlzIHN1YmplY3QgdG8gdmVyc2lvbiAzLjAgb2YgdGhlIFBIUCBsaWNlbnNlCiAqIHRoYXQgaXMgYXZhaWxhYmxlIHRocm91Z2ggdGhlIHdvcmxkLXdpZGUtd2ViIGF0IHRoZSBmb2xsb3dpbmcgVVJJOgogKiBodHRwOi8vd3d3LnBocC5uZXQvbGljZW5zZS8zXzAudHh0LiAgSWYgeW91IGRpZCBub3QgcmVjZWl2ZSBhIGNvcHkgb2YKICogdGhlIFBIUCBMaWNlbnNlIGFuZCBhcmUgdW5hYmxlIHRvIG9idGFpbiBpdCB0aHJvdWdoIHRoZSB3ZWIsIHBsZWFzZQogKiBzZW5kIGEgbm90ZSB0byBsaWNlbnNlQHBocC5uZXQgc28gd2UgY2FuIG1haWwgeW91IGEgY29weSBpbW1lZGlhdGVseS4KICoKICogQGNhdGVnb3J5ICAgRGF0YWJhc2UKICogQHBhY2thZ2UgICAgREIKICogQGF1dGhvciAgICAgRGFuaWVsIENvbnZpc3NvciA8ZGFuaWVsY0BwaHAubmV0PgogKiBAY29weXJpZ2h0ICAxOTk3LTIwMDUgVGhlIFBIUCBHcm91cAogKiBAbGljZW5zZSAgICBodHRwOi8vd3d3LnBocC5uZXQvbGljZW5zZS8zXzAudHh0ICBQSFAgTGljZW5zZSAzLjAKICogQHZlcnNpb24gICAgJElkOiB0cmFuc2FjdGlvbnMuaW5jLHYgMS4xMCAyMDA3LzAxLzA4IDAwOjE5OjQ4IGFoYXJ2ZXkgRXhwICQKICogQGxpbmsgICAgICAgaHR0cDovL3BlYXIucGhwLm5ldC9wYWNrYWdlL0RCCiAqLwoKLy8gVGVzdGluZyBoZXJlIGR1ZSB0byBza2lwIG5vdCB3b3JraW5nIGN1cnJlbnRseSBpbiBoZWFkCmlmICghJGRiaC0+ZmVhdHVyZXNbJ3RyYW5zYWN0aW9ucyddKSB7CiAgICBkaWUoJ3RoaXMgZHJpdmVyIGRvZXMgbm90IHN1cHBvcnQgdHJhbnNhY3Rpb25zJyk7Cn0KCi8vIFZpZXcgdGhlIHRhYmxlIGZyb20gYSBzZXBhcmF0ZSBjb25uZWN0aW9uIHNvIHdlIGRvbid0IGRpc3R1cmIKLy8gdGhlIHRyYW5zYWN0aW9uLgokZGJoMiA9IERCOjpjb25uZWN0KCRkYmgtPmRzbik7CgpmdW5jdGlvbiBlcnJvcl9oYW5kbGVyKCYkb2JqKSB7CiAgICBwcmludCAiXG4iIC4gJG9iai0+Z2V0RGVidWdJbmZvKCkgLiAiXG4iOwp9CgpmdW5jdGlvbiBkdW1wdGFibGUoJGV4cGVjdGVkKSB7CiAgICBnbG9iYWwgJGRiaCwgJGRiaDI7CiAgICBwcmludCBpbXBsb2RlKCcgJywgJGRiaC0+Z2V0Q29sKCdTRUxFQ1QgYiBGUk9NIHBocHRlc3QnKSk7CgogICAgaWYgKGlzc2V0KCRkYmgtPnRyYW5zYWN0aW9uX29wY291bnQpKSB7CiAgICAgICAgaWYgKCRleHBlY3RlZCA9PSAkZGJoLT50cmFuc2FjdGlvbl9vcGNvdW50KSB7CiAgICAgICAgICAgIHByaW50ICIuICBvcHM9b2tcbiI7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcHJpbnQgIi4gIG9wcz0kZGJoLT50cmFuc2FjdGlvbl9vcGNvdW50XG4iOwogICAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgICAgcHJpbnQgIi4gIG9wcz1va1xuIjsKICAgIH0KfQoKJGRiaC0+c2V0RXJyb3JIYW5kbGluZyhQRUFSX0VSUk9SX0NBTExCQUNLLCAnZXJyb3JfaGFuZGxlcicpOwoKCiRkYmgtPmF1dG9Db21taXQodHJ1ZSk7CiRkYmgtPnF1ZXJ5KCJJTlNFUlQgSU5UTyBwaHB0ZXN0IFZBTFVFUygxLCAnb25lJywgJ09uZScsICcyMDAxLTAyLTE5JykiKTsKCnByaW50ICcxKSBhZnRlciBhdXRvY29tbWl0OiAnOwpkdW1wdGFibGUoMCk7CgokZGJoLT5hdXRvQ29tbWl0KGZhbHNlKTsKJGRiaC0+cXVlcnkoIklOU0VSVCBJTlRPIHBocHRlc3QgVkFMVUVTKDIsICd0d28nLCAnVHdvJywgJzIwMDEtMDItMjAnKSIpOwokZGJoLT5xdWVyeSgiSU5TRVJUIElOVE8gcGhwdGVzdCBWQUxVRVMoMywgJ3RocmVlJywgJ1RocmVlJywgJzIwMDEtMDItMjEnKSIpOwpwcmludCAnMikgYmVmb3JlIGNvbW1pdDogJzsKZHVtcHRhYmxlKDIpOwoKJGRiaC0+Y29tbWl0KCk7CnByaW50ICczKSBhZnRlciBjb21taXQ6ICc7CmR1bXB0YWJsZSgwKTsKCiRkYmgtPnF1ZXJ5KCJJTlNFUlQgSU5UTyBwaHB0ZXN0IFZBTFVFUyg0LCAnZm91cicsICdGb3VyJywgJzIwMDEtMDItMjInKSIpOwokZGJoLT5xdWVyeSgiSU5TRVJUIElOVE8gcGhwdGVzdCBWQUxVRVMoNSwgJ2ZpdmUnLCAnRml2ZScsICcyMDAxLTAyLTIzJykiKTsKcHJpbnQgJzQpIGJlZm9yZSByb2xsYmFjazogJzsKZHVtcHRhYmxlKDIpOwoKJGRiaC0+cm9sbGJhY2soKTsKcHJpbnQgJzUpIGFmdGVyIHJvbGxiYWNrOiAnOwpkdW1wdGFibGUoMCk7CiRkYmgtPnJvbGxiYWNrKCk7CgokZGJoLT5hdXRvQ29tbWl0KHRydWUpOwokZGJoLT5xdWVyeSgiSU5TRVJUIElOVE8gcGhwdGVzdCBWQUxVRVMoNiwgJ3NpeCcsICdTaXgnLCAnMjAwMS0wMi0yNCcpIik7CiRkYmgtPnF1ZXJ5KCJJTlNFUlQgSU5UTyBwaHB0ZXN0IFZBTFVFUyg3LCAnc2V2ZW4nLCAnU2V2ZW4nLCAnMjAwMS0wMi0yNScpIik7CnByaW50ICc2KSBiZWZvcmUgYXV0b2NvbW1pdCtyb2xsYmFjazogJzsKZHVtcHRhYmxlKDApOwoKJGRiaC0+cm9sbGJhY2soKTsKcHJpbnQgJzcpIGFmdGVyIGF1dG9jb21taXQrcm9sbGJhY2s6ICc7CmR1bXB0YWJsZSgwKTsKCnByaW50ICc4KSB0ZXN0aW5nIHRoYXQgc2VsZWN0IGRvZXNuXCd0IGRpc3R1cmJlIG9wY291bnQ6ICc7CiRkYmgtPmF1dG9Db21taXQoZmFsc2UpOwokZGJoLT5zaW1wbGVRdWVyeSgiU0VMRUNUICogRlJPTSBwaHB0ZXN0Iik7CiRkYmgtPnNpbXBsZVF1ZXJ5KCJTRUxFQ1QgYSxjYyBGUk9NIHBocHRlc3QiKTsKJGRiaC0+c2ltcGxlUXVlcnkoIlNFTEVDVCBiLGQgRlJPTSBwaHB0ZXN0Iik7CmlmIChlbXB0eSgkZGJoLT50cmFuc2FjdGlvbl9vcGNvdW50KSkgewogICAgcHJpbnQgIm9rXG4iOwp9IGVsc2UgewogICAgcHJpbnQgImZhaWxlZCAoY291bnQ9JGRiaC0+dHJhbnNhY3Rpb25fb3Bjb3VudClcbiI7Cn0K]]></data>
	</file>
	<file>
	  <filename>/method.install.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBNb2R1bGU6IENHR29vZ2xlTWFwcyAtIEEgc2ltcGxlIG1vZHVsZSBmb3IgY3JlYXRpbmcgZ29vZ2xlIG1hcHMuCiMgVmVyc2lvbjogMS4wLCBjYWxndXkxMDAwIDxjYWxndXkxMDAwQGhvdG1haWwuY29tPgojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgQ01TIC0gQ01TIE1hZGUgU2ltcGxlIGlzIChjKSAyMDA1IGJ5IFRlZCBLdWxwICh3aXNoeUBjbXNtYWRlc2ltcGxlLm9yZykKIyBUaGlzIHByb2plY3QncyBob21lcGFnZSBpczogaHR0cDovL3d3dy5jbXNtYWRlc2ltcGxlLm9yZwojIFRoZSBtb2R1bGUncyBob21lcGFnZSBpczogaHR0cDovL2Rldi5jbXNtYWRlc2ltcGxlLm9yZy9wcm9qZWN0cy9za2VsZXRvbi8KIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQojIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQojIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCiMgT3IgcmVhZCBpdCBvbmxpbmU6IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTAojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgppZiAoIWlzc2V0KCRnQ21zKSkgZXhpdDsKCiRkYiA9JiAkZ0Ntcy0+R2V0RGIoKTsKCi8vIG15c3FsLXNwZWNpZmljLCBidXQgaWdub3JlZCBieSBvdGhlciBkYXRhYmFzZQokdGFib3B0YXJyYXkgPSBhcnJheSgnbXlzcWwnID0+ICdUWVBFPU15SVNBTScpOwoKJGRpY3QgPSBOZXdEYXRhRGljdGlvbmFyeSgkZGIpOwoKLy8gdGFibGUgc2NoZW1hIGRlc2NyaXB0aW9uCiRmbGRzID0gIgoJbWFwX2lkIEkgQVVUTyBLRVksCiAgICAgICAgbmFtZSBDKDgwKSBOT1ROVUxMLAoJZGVzY3JpcHRpb24gWCwKICAgICAgICBjZW50ZXJfbGF0IEMoNTApLAogICAgICAgIGNlbnRlcl9sb24gQyg1MCksCiAgICAgICAgb3duZXJfaWQgSSwKICAgICAgICB0eXBlIEMoNTApLAogICAgICAgIHdpZHRoIEMoNTApLAogICAgICAgIGhlaWdodCBDKDUwKSwKICAgICAgICBjb250cm9scyBMLAogICAgICAgIGNvbnRyb2xzX3NpemUgQygxMCksCiAgICAgICAgdHlwZV9jb250cm9scyBMLAogICAgICAgIHNpZGViYXIgTCwKICAgICAgICBkaXJlY3Rpb25zIEwsCiAgICAgICAgem9vbSBDKDEwKSwKICAgICAgICB6b29tX2VuY29tcGFzcyBMLAogICAgICAgIGJvdW5kc19mdWRnZSBGLAogICAgICAgIGluZm9fd2luZG93IEwsCiAgICAgICAgaW5mb190cmlnZ2VyIEMoODApCgkiOwokc3FsYXJyYXkgPSAkZGljdC0+Q3JlYXRlVGFibGVTUUwoY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfY2dnb29nbGVtYXBzIiwgJGZsZHMsICR0YWJvcHRhcnJheSk7CiRkaWN0LT5FeGVjdXRlU1FMQXJyYXkoJHNxbGFycmF5KTsKCi8vaW5kZXggZm9yIG1hcHMKJHNxbGFycmF5ID0gJGRpY3QtPkNyZWF0ZUluZGV4U1FMKCdpX25hbWUnLCBjbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9jZ2dvb2dsZW1hcHMiLCAnbmFtZScpOwoKLy8gTWFya2VycwokZmxkcyA9ICIKICAgICAgICBtYXJrZXJfaWQgSSBBVVRPIEtFWSwKICAgICAgICBtYXBfaWQgSSwKICAgICAgICBuYW1lIEMoODApLAogICAgICAgIGluZm8gWCwKICAgICAgICBhZGRyZXNzIEMoMjU1KSwKICAgICAgICBsYXQgQygxMDApLAogICAgICAgIGxvbiBDKDEwMCksCiAgICAgICAgaWNvbiBDKDEwMCkKICAgICAgICAiOwokc3FsYXJyYXkgPSAkZGljdC0+Q3JlYXRlVGFibGVTUUwoY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfY2dnb29nbGVtYXBzX3BvaW50cyIsICRmbGRzLCAkdGFib3B0YXJyYXkpOwokZGljdC0+RXhlY3V0ZVNRTEFycmF5KCRzcWxhcnJheSk7Ci8vIGNyZWF0ZSBhIHNlcXVlbmNlCgovLyBDYWNoZSAKJGZsZHMgPSAiCiAgICAgICAgYWRkcmVzcyBDKDI1NSkgS0VZIERFRkFVTFQgJycsIAogICAgICAgIGxvbiBGLAogICAgICAgIGxhdCBGCiAgICAgICAgIjsKJHNxbGFycmF5ID0gJGRpY3QtPkNyZWF0ZVRhYmxlU1FMKGNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2NnZ29vZ2xlbWFwc19jYWNoZSIsICRmbGRzLCAkdGFib3B0YXJyYXkpOwokZGljdC0+RXhlY3V0ZVNRTEFycmF5KCRzcWxhcnJheSk7CgoKIyBQZXJtaXNzaW9ucwokdGhpcy0+Q3JlYXRlUGVybWlzc2lvbignTWFuYWdlIE1hcHMnLCdNYW5hZ2UgTWFwcycpOwokdGhpcy0+Q3JlYXRlUGVybWlzc2lvbignTWFuYWdlIE1hcCBMb2NhdGlvbnMnLCdNYW5hZ2UgTWFwIExvY2F0aW9ucycpOwoKLy8gRU9GCj8+]]></data>
	</file>
	<file>
	  <filename>/method.uninstall.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBNb2R1bGU6IENHR29vZ2xlTWFwcyAtIEEgc2ltcGxlIG1vZHVsZSBmb3IgY3JlYXRpbmcgZ29vZ2xlIG1hcHMuCiMgVmVyc2lvbjogMS4wLCBjYWxndXkxMDAwIDxjYWxndXkxMDAwQGhvdG1haWwuY29tPgojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgQ01TIC0gQ01TIE1hZGUgU2ltcGxlIGlzIChjKSAyMDA1IGJ5IFRlZCBLdWxwICh3aXNoeUBjbXNtYWRlc2ltcGxlLm9yZykKIyBUaGlzIHByb2plY3QncyBob21lcGFnZSBpczogaHR0cDovL3d3dy5jbXNtYWRlc2ltcGxlLm9yZwojIFRoZSBtb2R1bGUncyBob21lcGFnZSBpczogaHR0cDovL2Rldi5jbXNtYWRlc2ltcGxlLm9yZy9wcm9qZWN0cy9za2VsZXRvbi8KIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQojIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQojIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCiMgT3IgcmVhZCBpdCBvbmxpbmU6IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTAojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmlmICghaXNzZXQoJGdDbXMpKSBleGl0OwoKJGRiID0mICR0aGlzLT5HZXREYigpOwoKLy8gcmVtb3ZlIHRoZSBkYXRhYmFzZSB0YWJsZQokZGljdCA9IE5ld0RhdGFEaWN0aW9uYXJ5KCAkZGIgKTsKCi8vIG1hcHMKJHNxbGFycmF5ID0gJGRpY3QtPkRyb3BUYWJsZVNRTCggY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfY2dnb29nbGVtYXBzIiApOwokZGljdC0+RXhlY3V0ZVNRTEFycmF5KCRzcWxhcnJheSk7Cgokc3FsYXJyYXkgPSAkZGljdC0+RHJvcFRhYmxlU1FMKCBjbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9jZ2dvb2dsZW1hcHNfcG9pbnRzIiApOwokZGljdC0+RXhlY3V0ZVNRTEFycmF5KCRzcWxhcnJheSk7Cgokc3FsYXJyYXkgPSAkZGljdC0+RHJvcFRhYmxlU1FMKCBjbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9jZ2dvb2dsZW1hcHNfY2FjaGUiICk7CiRkaWN0LT5FeGVjdXRlU1FMQXJyYXkoJHNxbGFycmF5KTsKCiR0aGlzLT5EZWxldGVUZW1wbGF0ZSgpOwokdGhpcy0+UmVtb3ZlUHJlZmVyZW5jZSgpOwoKJHRoaXMtPlJlbW92ZVBlcm1pc3Npb24oJ01hbmFnZSBNYXBzJyk7CiR0aGlzLT5SZW1vdmVQZXJtaXNzaW9uKCdNYW5hZ2UgTWFwIExvY2F0aW9ucycpOwoKLy8gRU9GCj8+]]></data>
	</file>
	<file>
	  <filename>/skeleton.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBNb2R1bGU6IENHR29vZ2xlTWFwcyAtIEEgc2ltcGxlIG1vZHVsZSBmb3IgY3JlYXRpbmcgZ29vZ2xlIG1hcHMuCiMgVmVyc2lvbjogMS4wLCBjYWxndXkxMDAwIDxjYWxndXkxMDAwQGhvdG1haWwuY29tPgojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgQ01TIC0gQ01TIE1hZGUgU2ltcGxlIGlzIChjKSAyMDA1IGJ5IFRlZCBLdWxwICh3aXNoeUBjbXNtYWRlc2ltcGxlLm9yZykKIyBUaGlzIHByb2plY3QncyBob21lcGFnZSBpczogaHR0cDovL3d3dy5jbXNtYWRlc2ltcGxlLm9yZwojIFRoZSBtb2R1bGUncyBob21lcGFnZSBpczogaHR0cDovL2Rldi5jbXNtYWRlc2ltcGxlLm9yZy9wcm9qZWN0cy9za2VsZXRvbi8KIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQojIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQojIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCiMgT3IgcmVhZCBpdCBvbmxpbmU6IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTAojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgovLyBFT0YKPz4=]]></data>
	</file>
	<file>
	  <filename>/templates/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/templates/addmappoint.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PGgzPnskdGl0bGV9PC9oMz4KeyRmb3Jtc3RhcnR9eyRoaWRkZW59CjxwIGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgogIHskaW5mb19hZGRyZXNzX2xhdGxvbmd9CjwvcD4KPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KICA8cCBjbGFzcz0icGFnZXRleHQiPnskcHJvbXB0X25hbWV9PC9wPgogIDxwIGNsYXNzPSJwYWdlaW5wdXQiPnskaW5wdXRfbmFtZX08L3A+CjwvZGl2Pgo8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgogIDxwIGNsYXNzPSJwYWdldGV4dCI+eyRwcm9tcHRfaW5mb308L3A+CiAgPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRpbnB1dF9pbmZvfTwvcD4KPC9kaXY+CjxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CiAgPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JHByb21wdF9hZGRyZXNzfTwvcD4KICA8cCBjbGFzcz0icGFnZWlucHV0Ij57JGlucHV0X2FkZHJlc3N9PC9wPgo8L2Rpdj4KPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KICA8cCBjbGFzcz0icGFnZXRleHQiPnskcHJvbXB0X2xhdH08L3A+CiAgPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRpbnB1dF9sYXR9PC9wPgo8L2Rpdj4KPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KICA8cCBjbGFzcz0icGFnZXRleHQiPnskcHJvbXB0X2xvbn08L3A+CiAgPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRpbnB1dF9sb259PC9wPgo8L2Rpdj4KPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KICA8cCBjbGFzcz0icGFnZXRleHQiPiZuYnNwOzwvcD4KICA8cCBjbGFzcz0icGFnZWlucHV0Ij57JHN1Ym1pdH17JGNhbmNlbH08L3A+CjwvZGl2Pgp7JGZvcm1lbmR9]]></data>
	</file>
	<file>
	  <filename>/templates/add_map.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[eyRmb3Jtc3RhcnR9eyRoaWRkZW59CjxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CiAgPHAgY2xhc3M9InBhZ2V0ZXh0Ij4qeyRwcm9tcHRfbmFtZX06PC9wPgogIDxwIGNsYXNzPSJwYWdlaW5wdXQiPnskaW5wdXRfbmFtZX08L3A+CjwvZGl2Pgo8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgogIDxwIGNsYXNzPSJwYWdldGV4dCI+eyRwcm9tcHRfZGVzY3JpcHRpb259OjwvcD4KICA8cCBjbGFzcz0icGFnZWlucHV0Ij57JGlucHV0X2Rlc2NyaXB0aW9ufTwvcD4KPC9kaXY+CjxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CiAgPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JHByb21wdF9jZW50ZXJfbGF0fTo8L3A+CiAgPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRpbnB1dF9jZW50ZXJfbGF0fTwvcD4KPC9kaXY+CjxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CiAgPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JHByb21wdF9jZW50ZXJfbG9ufTo8L3A+CiAgPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRpbnB1dF9jZW50ZXJfbG9ufTwvcD4KPC9kaXY+CjxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CiAgPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JHByb21wdF90eXBlfTo8L3A+CiAgPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRpbnB1dF90eXBlfTwvcD4KPC9kaXY+CjxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CiAgPHAgY2xhc3M9InBhZ2V0ZXh0Ij4qeyRwcm9tcHRfd2lkdGh9OjwvcD4KICA8cCBjbGFzcz0icGFnZWlucHV0Ij57JGlucHV0X3dpZHRofTwvcD4KPC9kaXY+CjxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CiAgPHAgY2xhc3M9InBhZ2V0ZXh0Ij4qeyRwcm9tcHRfaGVpZ2h0fTo8L3A+CiAgPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRpbnB1dF9oZWlnaHR9PC9wPgo8L2Rpdj4KPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KICA8cCBjbGFzcz0icGFnZXRleHQiPnskcHJvbXB0X2NvbnRyb2xzfTo8L3A+CiAgPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRpbnB1dF9jb250cm9sc308L3A+CjwvZGl2Pgo8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgogIDxwIGNsYXNzPSJwYWdldGV4dCI+eyRwcm9tcHRfY29udHJvbHNfc2l6ZX06PC9wPgogIDxwIGNsYXNzPSJwYWdlaW5wdXQiPnskaW5wdXRfY29udHJvbHNfc2l6ZX08L3A+CjwvZGl2Pgo8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgogIDxwIGNsYXNzPSJwYWdldGV4dCI+eyRwcm9tcHRfdHlwZV9jb250cm9sc306PC9wPgogIDxwIGNsYXNzPSJwYWdlaW5wdXQiPnskaW5wdXRfdHlwZV9jb250cm9sc308L3A+CjwvZGl2Pgo8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgogIDxwIGNsYXNzPSJwYWdldGV4dCI+eyRwcm9tcHRfc2lkZWJhcn06PC9wPgogIDxwIGNsYXNzPSJwYWdlaW5wdXQiPnskaW5wdXRfc2lkZWJhcn08L3A+CjwvZGl2Pgo8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgogIDxwIGNsYXNzPSJwYWdldGV4dCI+eyRwcm9tcHRfZGlyZWN0aW9uc306PC9wPgogIDxwIGNsYXNzPSJwYWdlaW5wdXQiPnskaW5wdXRfZGlyZWN0aW9uc308L3A+CjwvZGl2Pgo8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgogIDxwIGNsYXNzPSJwYWdldGV4dCI+eyRwcm9tcHRfem9vbX06PC9wPgogIDxwIGNsYXNzPSJwYWdlaW5wdXQiPnskaW5wdXRfem9vbX08L3A+CjwvZGl2Pgo8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgogIDxwIGNsYXNzPSJwYWdldGV4dCI+eyRwcm9tcHRfem9vbV9lbmNvbXBhc3N9OjwvcD4KICA8cCBjbGFzcz0icGFnZWlucHV0Ij57JGlucHV0X3pvb21fZW5jb21wYXNzfTwvcD4KPC9kaXY+CjxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CiAgPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JHByb21wdF9pbmZvX3dpbmRvd306PC9wPgogIDxwIGNsYXNzPSJwYWdlaW5wdXQiPnskaW5wdXRfaW5mb193aW5kb3d9PC9wPgo8L2Rpdj4KPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KICA8cCBjbGFzcz0icGFnZXRleHQiPnskcHJvbXB0X2luZm9fdHJpZ2dlcn06PC9wPgogIDxwIGNsYXNzPSJwYWdlaW5wdXQiPnskaW5wdXRfaW5mb190cmlnZ2VyfTwvcD4KPC9kaXY+CjxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CiAgPHAgY2xhc3M9InBhZ2V0ZXh0Ij4mbmJzcDs8L3A+CiAgPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRzdWJtaXR9eyRjYW5jZWx9PC9wPgo8L2Rpdj4KeyRmb3JtZW5kfQ==]]></data>
	</file>
	<file>
	  <filename>/templates/editmappoints.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PGgzPnskdGl0bGV9PC9oMz4KPHRhYmxlIGNlbGxzcGFjaW5nPSIwIiBjbGFzcz0icGFnZXRhYmxlIj4KICA8dGhlYWQ+CiAgICA8dHI+CiAgICAgIDx0aD57JGlkdGV4dH08L3RoPgogICAgICA8dGg+eyRuYW1ldGV4dH08L3RoPgogICAgICA8dGg+eyRsb2NhdGlvbnRleHR9PC90aD4KICAgICAgPHRoIGNsYXNzPSJwYWdlaWNvbiI+Jm5ic3A7PC90aD4KICAgICAgPHRoIGNsYXNzPSJwYWdlaWNvbiI+Jm5ic3A7PC90aD4KICAgIDwvdHI+CiAgPC90aGVhZD4KICA8dGJvZHk+CiAge2ZvcmVhY2ggZnJvbT0kcG9pbnRsaXN0IGl0ZW09J3BvaW50J30KICAgIHtjeWNsZSB2YWx1ZXM9J3JvdzEscm93MicgYXNzaWduPSdyb3djbGFzcyd9CiAgICA8dHIgY2xhc3M9Inskcm93Y2xhc3N9IiBvbm1vdXNlb3Zlcj0idGhpcy5jbGFzc05hbWU9J3skcm93Y2xhc3N9aG92ZXInOyIgb25tb3VzZW91dD0idGhpcy5jbGFzc05hbWU9J3skcm93Y2xhc3N9JzsiPgogICAgICA8dGQ+eyRwb2ludC0+bWFya2VyX2lkfTwvdGQ+CiAgICAgIDx0ZD57JHBvaW50LT5uYW1lfTwvdGQ+CiAgICAgIDx0ZD57aWYgIWVtcHR5KCRwb2ludC0+bGF0KSAmJiAhZW1wdHkoJHBvaW50LT5sb24pfQogICAgICAgICAgICB7JHBvaW50LT5sYXR9LCZuYnNwO3skcG9pbnQtPmxvbn0KICAgICAgICAgIHtlbHNlfQogICAgICAgICAgICB7JHBvaW50LT5hZGRyZXNzfQogICAgICAgICAgey9pZn0KICAgICAgPC90ZD4KICAgICAgPHRkPnskcG9pbnQtPmVkaXRfbGlua308L3RkPgogICAgICA8dGQ+eyRwb2ludC0+ZGVsZXRlX2xpbmt9PC90ZD4KICAgIDwvdHI+CiAgey9mb3JlYWNofQogIDwvdGJvZHk+CjwvdGFibGU+Cjxici8+CjxwIGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgogIHskYWRkX2xpbmt9CjwvcD4=]]></data>
	</file>
	<file>
	  <filename>/templates/map.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[eyRnb29nbGVfbWFwX2hlYWRlcn0KCnsqCjwhLS0gbmVjZXNzYXJ5IGZvciBnb29nbGUgbWFwcyBwb2x5bGluZSBkcmF3aW5nIGluIElFIC0tPgp7bGl0ZXJhbH0KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4Kdlw6KiB7CiBiZWhhdmlvcjp1cmwoI2RlZmF1bHQjVk1MKTsKfQp7L2xpdGVyYWx9Cjwvc3R5bGU+Cip9Cgo8IS0tIGJlZ2luIGRpc3BsYXkgbWFwIC0tPgo8dGFibGU+CiAgPHRyPgogICAgIDx0ZD57JGdvb2dsZV9tYXB9PC90ZD4KICAgICA8dGQ+eyRnb29nbGVfbWFwX3NpZGViYXJ9PC90ZD4KICA8L3RyPgo8L3RhYmxlPgp7JG1hcF9kZXNjcmlwdGlvbn0KeyRnb29nbGVfbWFwX2pzfQo8IS0tIGVuZCBkaXNwbGF5IG1hcCAtLT4K]]></data>
	</file>
	<file>
	  <filename>/templates/maps_tab.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PHRhYmxlIGNlbGxzcGFjaW5nPSIwIiBjbGFzcz0icGFnZXRhYmxlIj4KICA8dGhlYWQ+CiAgICA8dHI+CiAgICAgIDx0aD57JGlkdGV4dH08L3RoPgogICAgICA8dGg+eyRuYW1ldGV4dH08L3RoPgogICAgICA8dGggY2xhc3M9InBhZ2VpY29uIj4mbmJzcDs8L3RoPgogICAgICA8dGggY2xhc3M9InBhZ2VpY29uIj57JGRlZmF1bHR0ZXh0fTwvdGg+CiAgICAgIDx0aCBjbGFzcz0icGFnZWljb24iPiZuYnNwOzwvdGg+CiAgICAgIDx0aCBjbGFzcz0icGFnZWljb24iPiZuYnNwOzwvdGg+CiAgICA8L3RyPgogIDwvdGhlYWQ+CiAgPHRib2R5PgogIHtmb3JlYWNoIGZyb209JG1hcGxpc3QgaXRlbT0nbWFwJ30KICAgIHtjeWNsZSB2YWx1ZXM9J3JvdzEscm93MicgYXNzaWduPSdyb3djbGFzcyd9CiAgICA8dHIgY2xhc3M9Inskcm93Y2xhc3N9IiBvbm1vdXNlb3Zlcj0idGhpcy5jbGFzc05hbWU9J3skcm93Y2xhc3N9aG92ZXInOyIgb25tb3VzZW91dD0idGhpcy5jbGFzc05hbWU9J3skcm93Y2xhc3N9JzsiPgogICAgICA8dGQ+eyRtYXAtPm1hcF9pZH08L3RkPgogICAgICA8dGQ+eyRtYXAtPm5hbWV9PC90ZD4KICAgICAgPHRkPntpZiBpc3NldCgkbWFwLT5wb2ludHNfbGluayl9eyRtYXAtPnBvaW50c19saW5rfXtlbHNlfSZuYnNwO3svaWZ9PC90ZD4KICAgICAgPHRkPntpZiBpc3NldCgkbWFwLT5kZWZhdWx0X2xpbmspfXskbWFwLT5kZWZhdWx0X2xpbmt9e2Vsc2V9Jm5ic3A7ey9pZn08L3RkPgogICAgICA8dGQ+e2lmIGlzc2V0KCRtYXAtPmVkaXRfbGluayl9eyRtYXAtPmVkaXRfbGlua317ZWxzZX0mbmJzcDt7L2lmfTwvdGQ+CiAgICAgIDx0ZD57aWYgaXNzZXQoJG1hcC0+ZGVsZXRlX2xpbmspfXskbWFwLT5kZWxldGVfbGlua317ZWxzZX0mbmJzcDt7L2lmfTwvdGQ+CiAgICA8L3RyPgogIHsvZm9yZWFjaH0KICA8L3Rib2R5Pgo8L3RhYmxlPgoKPHAgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CnskYWRkX2xpbmt9CjwvcD4=]]></data>
	</file>
	<file>
	  <filename>/templates/prefs_tab.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[eyRmb3Jtc3RhcnR9CjxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CiAgPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JHByb21wdF9hcGlrZXl9OjwvcD4KICA8cCBjbGFzcz0icGFnZWlucHV0Ij57JGlucHV0X2FwaWtleX08L3A+CjwvZGl2Pgo8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgogIDxwIGNsYXNzPSJwYWdldGV4dCI+Jm5ic3A7PC9wPgogIDxwIGNsYXNzPSJwYWdlaW5wdXQiPnskc3VibWl0fTwvcD4KPC9kaXY+CnskZm9ybWVuZH0=]]></data>
	</file>
</module>
