<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE module [
  <!ELEMENT module (name,version,description*,help*,about*,requires*,file+)>
  <!ELEMENT name (#PCDATA)>
  <!ELEMENT version (#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>
  <name>Skeleton</name>
  <version>1.2</version>
  <help>PGgzPldoYXQgRG9lcyBUaGlzIERvPzwvaDM+CjxwPk5vdGhpbmcuIEl0J3MgZGVzaWduZWQgdG8gYmUgYSBzdGFydGluZyBwb2ludCBmb3IgeW91IHRvIGRldmVsb3AgeW91ciBvd24gbW9kdWxlcy48L3A+CjxoMz5Ib3cgRG8gSSBVc2UgSXQ8L2gzPgo8cD5XZWxsLCB5b3UgY291bGQgYWN0dWFsbHkgaW5zdGFsbCBpdCBieSBwbGFjaW5nIHRoZSBtb2R1bGUgaW4gYSBwYWdlIG9yIHRlbXBsYXRlIHVzaW5nIHRoZSBzbWFydHkgdGFnICYjMTIzO2Ntc19tb2R1bGUgbW9kdWxlPSdTa2VsZXRvbid9PC9wPgo8cD5Zb3Ugd291bGQgYmUgd2lzZXIsIGhvd2V2ZXIsIHRvIHVzZSB0aGUgbW9kdWxlIGFzIGEgc3RhcnRpbmcgcG9pbnQsIGFuZCBlZGl0aW5nIHRoZSBjb2RlIHRvIGRvIHdoYXRldmVyIGl0IGlzIHlvdSBhcmUgd2FudGluZyB0byBkby48L3A+CjxoMz5TdXBwb3J0PC9oMz4KPHA+VGhpcyBtb2R1bGUgZG9lcyBub3QgaW5jbHVkZSBjb21tZXJjaWFsIHN1cHBvcnQuIEhvd2V2ZXIsIHRoZXJlIGFyZSBhIG51bWJlciBvZiByZXNvdXJjZXMgYXZhaWxhYmxlIHRvIGhlbHAgeW91IHdpdGggaXQ6PC9wPgo8dWw+CjxsaT5Gb3IgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHRoaXMgbW9kdWxlLCBGQVFzLCBvciB0byBmaWxlIGEgQnVnIFJlcG9ydCBvciBidXkgY29tbWVyY2lhbCBzdXBwb3J0LCBwbGVhc2UgdmlzaXQgU2pHJ3MKbW9kdWxlIGhvbWVwYWdlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuY21zbW9kdWxlcy5jb20iPkNNU01vZHVsZXMuY29tPC9hPi48L2xpPgo8bGk+QWRkaXRpb25hbCBkaXNjdXNzaW9uIG9mIHRoaXMgbW9kdWxlIG1heSBhbHNvIGJlIGZvdW5kIGluIHRoZSA8YSBocmVmPSJodHRwOi8vZm9ydW0uY21zbWFkZXNpbXBsZS5vcmciPkNNUyBNYWRlIFNpbXBsZSBGb3J1bXM8L2E+LjwvbGk+CjxsaT5UaGUgYXV0aG9yLCBTakcsIGNhbiBvZnRlbiBiZSBmb3VuZCBpbiB0aGUgPGEgaHJlZj0iaXJjOi8vaXJjLmZyZWVub2RlLm5ldC8jY21zIj5DTVMgSVJDIENoYW5uZWw8L2E+LjwvbGk+CjxsaT5MYXN0bHksIHlvdSBtYXkgaGF2ZSBzb21lIHN1Y2Nlc3MgZW1haWxpbmcgdGhlIGF1dGhvciBkaXJlY3RseS48L2xpPiAgCjwvdWw+CjxwPkFzIHBlciB0aGUgR1BMLCB0aGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGFzLWlzLiBQbGVhc2UgcmVhZCB0aGUgdGV4dApvZiB0aGUgbGljZW5zZSBmb3IgdGhlIGZ1bGwgZGlzY2xhaW1lci48L3A+Cgo8aDM+Q29weXJpZ2h0IGFuZCBMaWNlbnNlPC9oMz4KPHA+Q29weXJpZ2h0ICZjb3B5OyAyMDA2LCBTYW11ZWwgR29sZHN0ZWluIDxhIGhyZWY9Im1haWx0bzpzamdAY21zbW9kdWxlcy5jb20iPiZsdDtzamdAY21zbW9kdWxlcy5jb20mZ3Q7PC9hPi4gQWxsIFJpZ2h0cyBBcmUgUmVzZXJ2ZWQuPC9wPgo8cD5UaGlzIG1vZHVsZSBoYXMgYmVlbiByZWxlYXNlZCB1bmRlciB0aGUgPGEgaHJlZj0iaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xpY2Vuc2VzLmh0bWwjR1BMIj5HTlUgUHVibGljIExpY2Vuc2U8L2E+LiBZb3UgbXVzdCBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UgYmVmb3JlIHVzaW5nIHRoZSBtb2R1bGUuPC9wPgo8aDM+UGFyYW1ldGVyczwvaDM+PHVsPjxsaT48ZW0+KG9wdGlvbmFsKTwvZW0+IGxhbmc9ImVuX1VTIiAtIFBhcmFtZXRlciBpcyB1c2VkIHRvIHNwZWNpZnkgd2hhdCBsYW5ndWFnZSB0byB1c2UgZm9yIGRpc3BsYXkgb24gdGhlIGZyb250ZW5kLiBOb3QgYWxsIG1vZHVsZXMgc3VwcG9ydCBvciBuZWVkIHRoaXMuPC9saT48L3VsPg==</help>
  <about>PGJyIC8+QXV0aG9yOiBTakcgJmx0O3NqZ0BjbXNtb2R1bGVzLmNvbSZndDs8YnIgLz48YnIgLz5WZXJzaW9uOiAxLjI8YnIgLz48YnIgLz5DaGFuZ2UgSGlzdG9yeTo8YnIgLz48dWw+CjxsaT5WZXJzaW9uIDEuMi4gMjkgRGVjZW1iZXIgMjAwNS4gRml4ZXMgdG8gYnVncyBwb2ludGVkIG91dCBieSBQYXRyaWNrIExvc2NobWlkdC4gVXBkYXRlcyB0byBiZSBjb3JyZWN0IGZvciBDTVMgTWFkZSBTaW1wbGUgdmVyc2lvbnMgMC4xMS54LjwvbGk+CjxsaT5WZXJzaW9uIDEuMS4gMTEgU2VwdGVtYmVyIDIwMDUuIENsZWFuZWQgdXAgcmVmZXJlbmNlcyB0aGF0IGNhdXNlZCBwcm9ibGVtcyBmb3IgUEhQIDQuNC54IG9yIDUuMC41LjwvbGk+CjxsaT5WZXJzaW9uIDEuMC4gNiBBdWd1c3QgMjAwNS4gSW5pdGlhbCBSZWxlYXNlLjwvbGk+PC91bD48YnIgLz4=</about>
  <file>
    <filename>/</filename>
    <isdir>1</isdir>
  </file>
  <file>
    <filename>/images/</filename>
    <isdir>1</isdir>
  </file>
  <file>
    <filename>/images/icon.gif</filename>
    <isdir>0</isdir>
    <data><![CDATA[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]]></data>
  </file>
  <file>
    <filename>/index.html</filename>
    <isdir>0</isdir>
    <data><![CDATA[]]></data>
  </file>
  <file>
    <filename>/lang/</filename>
    <isdir>1</isdir>
  </file>
  <file>
    <filename>/lang/en_US/</filename>
    <isdir>1</isdir>
  </file>
  <file>
    <filename>/lang/en_US/en_US.php</filename>
    <isdir>0</isdir>
    <data><![CDATA[PD9waHAKJGxhbmdbJ2ZyaWVuZGx5bmFtZSddID0gJ1BlZGFudGljIFNrZWxldG9uIE1vZHVsZSc7CiRsYW5nWydwb3N0aW5zdGFsbCddID0gJ1Bvc3QgSW5zdGFsbCBNZXNzYWdlLCBlLmcuLCBCZSBzdXJlIHRvIHNldCAiVXNlIFNrZWxldG9ucyIgcGVybWlzc2lvbnMgdG8gdXNlIHRoaXMgbW9kdWxlISc7CiRsYW5nWydwb3N0dW5pbnN0YWxsJ10gPSAnUG9zdCBVbmluc3RhbGwgTWVzc2FnZSwgZS5nLiwgIkN1cnNlcyEgRm9pbGVkIEFnYWluISInOwokbGFuZ1sncmVhbGx5X3VuaW5zdGFsbCddID0gJ1JlYWxseT8gWW91XCdyZSBzdXJlIHlvdSB3YW50IHRvIHVuaW5zdGFsbCB0aGlzIGZpbmUgbW9kdWxlPyc7CiRsYW5nWyd1bmluc3RhbGxlZCddID0gJ01vZHVsZSBVbmluc3RhbGxlZC4nOwokbGFuZ1snaW5zdGFsbGVkJ10gPSAnTW9kdWxlIHZlcnNpb24gJXMgaW5zdGFsbGVkLic7CiRsYW5nWydwcmVmc3VwZGF0ZWQnXSA9ICdNb2R1bGUgcHJlZmVyZW5jZXMgdXBkYXRlZC4nOwokbGFuZ1snbG91ZCddID0gJ0xPVUQuJzsKJGxhbmdbJ3F1aWV0J10gPSAncXVpZXQnOwokbGFuZ1snYWNjZXNzZGVuaWVkJ10gPSAnQWNjZXNzIERlbmllZC4gUGxlYXNlIGNoZWNrIHlvdXIgcGVybWlzc2lvbnMuJzsKJGxhbmdbJ2Vycm9yJ10gPSAnRXJyb3IhJzsKJGxhbmdbJ3VwZ3JhZGVkJ10gPSAnTW9kdWxlIHVwZ3JhZGVkIHRvIHZlcnNpb24gJXMuJzsKJGxhbmdbJ3RpdGxlX3NpbmdfbG91ZGx5J10gPSAnU2luZyBMb3VkbHk/JzsKJGxhbmdbJ3RpdGxlX21vZF9wcmVmcyddID0gJ01vZHVsZSBQcmVmZXJlbmNlcyc7CiRsYW5nWyd0aXRsZV9tb2RfYWRtaW4nXSA9ICdNb2R1bGUgQWRtaW4gUGFuZWwnOwokbGFuZ1sndGl0bGVfYWRtaW5fcGFuZWwnXSA9ICdTa2VsZXRvbiBNb2R1bGUnOwokbGFuZ1snbW9kZGVzY3JpcHRpb24nXSA9ICdUaGlzIG1vZHVsZSBpcyBhIHNrZWxldG9uIG1vZHVsZSB0aGF0IGRvZXMgbm90aGluZy4nOwokbGFuZ1snd2VsY29tZV90ZXh0J10gPSAnPHA+V2VsY29tZSB0byB0aGUgUGVkYW50aWMgU2tlbGV0b24gTW9kdWxlIGFkbWluIHNlY3Rpb24uIFNvbWV0aGluZyBlbHNlIHdvdWxkIHByb2JhYmx5IGdvIGhlcmUgaWYgdGhlIG1vZHVsZSBhY3R1YWxseSBkaWQgc29tZXRoaW5nLjwvcD4nOwokbGFuZ1snY2hhbmdlbG9nJ10gPSAnPHVsPgo8bGk+VmVyc2lvbiAxLjIuIDI5IERlY2VtYmVyIDIwMDUuIEZpeGVzIHRvIGJ1Z3MgcG9pbnRlZCBvdXQgYnkgUGF0cmljayBMb3NjaG1pZHQuIFVwZGF0ZXMgdG8gYmUgY29ycmVjdCBmb3IgQ01TIE1hZGUgU2ltcGxlIHZlcnNpb25zIDAuMTEueC48L2xpPgo8bGk+VmVyc2lvbiAxLjEuIDExIFNlcHRlbWJlciAyMDA1LiBDbGVhbmVkIHVwIHJlZmVyZW5jZXMgdGhhdCBjYXVzZWQgcHJvYmxlbXMgZm9yIFBIUCA0LjQueCBvciA1LjAuNS48L2xpPgo8bGk+VmVyc2lvbiAxLjAuIDYgQXVndXN0IDIwMDUuIEluaXRpYWwgUmVsZWFzZS48L2xpPjwvdWw+JzsKJGxhbmdbJ2hlbHAnXSA9ICc8aDM+V2hhdCBEb2VzIFRoaXMgRG8/PC9oMz4KPHA+Tm90aGluZy4gSXRcJ3MgZGVzaWduZWQgdG8gYmUgYSBzdGFydGluZyBwb2ludCBmb3IgeW91IHRvIGRldmVsb3AgeW91ciBvd24gbW9kdWxlcy48L3A+CjxoMz5Ib3cgRG8gSSBVc2UgSXQ8L2gzPgo8cD5XZWxsLCB5b3UgY291bGQgYWN0dWFsbHkgaW5zdGFsbCBpdCBieSBwbGFjaW5nIHRoZSBtb2R1bGUgaW4gYSBwYWdlIG9yIHRlbXBsYXRlIHVzaW5nIHRoZSBzbWFydHkgdGFnICYjMTIzO2Ntc19tb2R1bGUgbW9kdWxlPVwnU2tlbGV0b25cJ308L3A+CjxwPllvdSB3b3VsZCBiZSB3aXNlciwgaG93ZXZlciwgdG8gdXNlIHRoZSBtb2R1bGUgYXMgYSBzdGFydGluZyBwb2ludCwgYW5kIGVkaXRpbmcgdGhlIGNvZGUgdG8gZG8gd2hhdGV2ZXIgaXQgaXMgeW91IGFyZSB3YW50aW5nIHRvIGRvLjwvcD4KPGgzPlN1cHBvcnQ8L2gzPgo8cD5UaGlzIG1vZHVsZSBkb2VzIG5vdCBpbmNsdWRlIGNvbW1lcmNpYWwgc3VwcG9ydC4gSG93ZXZlciwgdGhlcmUgYXJlIGEgbnVtYmVyIG9mIHJlc291cmNlcyBhdmFpbGFibGUgdG8gaGVscCB5b3Ugd2l0aCBpdDo8L3A+Cjx1bD4KPGxpPkZvciB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgdGhpcyBtb2R1bGUsIEZBUXMsIG9yIHRvIGZpbGUgYSBCdWcgUmVwb3J0IG9yIGJ1eSBjb21tZXJjaWFsIHN1cHBvcnQsIHBsZWFzZSB2aXNpdCBTakdcJ3MKbW9kdWxlIGhvbWVwYWdlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuY21zbW9kdWxlcy5jb20iPkNNU01vZHVsZXMuY29tPC9hPi48L2xpPgo8bGk+QWRkaXRpb25hbCBkaXNjdXNzaW9uIG9mIHRoaXMgbW9kdWxlIG1heSBhbHNvIGJlIGZvdW5kIGluIHRoZSA8YSBocmVmPSJodHRwOi8vZm9ydW0uY21zbWFkZXNpbXBsZS5vcmciPkNNUyBNYWRlIFNpbXBsZSBGb3J1bXM8L2E+LjwvbGk+CjxsaT5UaGUgYXV0aG9yLCBTakcsIGNhbiBvZnRlbiBiZSBmb3VuZCBpbiB0aGUgPGEgaHJlZj0iaXJjOi8vaXJjLmZyZWVub2RlLm5ldC8jY21zIj5DTVMgSVJDIENoYW5uZWw8L2E+LjwvbGk+CjxsaT5MYXN0bHksIHlvdSBtYXkgaGF2ZSBzb21lIHN1Y2Nlc3MgZW1haWxpbmcgdGhlIGF1dGhvciBkaXJlY3RseS48L2xpPiAgCjwvdWw+CjxwPkFzIHBlciB0aGUgR1BMLCB0aGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGFzLWlzLiBQbGVhc2UgcmVhZCB0aGUgdGV4dApvZiB0aGUgbGljZW5zZSBmb3IgdGhlIGZ1bGwgZGlzY2xhaW1lci48L3A+Cgo8aDM+Q29weXJpZ2h0IGFuZCBMaWNlbnNlPC9oMz4KPHA+Q29weXJpZ2h0ICZjb3B5OyAyMDA2LCBTYW11ZWwgR29sZHN0ZWluIDxhIGhyZWY9Im1haWx0bzpzamdAY21zbW9kdWxlcy5jb20iPiZsdDtzamdAY21zbW9kdWxlcy5jb20mZ3Q7PC9hPi4gQWxsIFJpZ2h0cyBBcmUgUmVzZXJ2ZWQuPC9wPgo8cD5UaGlzIG1vZHVsZSBoYXMgYmVlbiByZWxlYXNlZCB1bmRlciB0aGUgPGEgaHJlZj0iaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xpY2Vuc2VzLmh0bWwjR1BMIj5HTlUgUHVibGljIExpY2Vuc2U8L2E+LiBZb3UgbXVzdCBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UgYmVmb3JlIHVzaW5nIHRoZSBtb2R1bGUuPC9wPgonOwo/Pgo=]]></data>
  </file>
  <file>
    <filename>/Skeleton.module.php</filename>
    <isdir>0</isdir>
    <data><![CDATA[PD9waHAKLyoKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgTk9URVMgRk9SIFRIRSBBU1BJUklORywgVU5FWFBFUklFTkNFRCwgT1IgRk9SR0VURlVMIE1PRFVMRSBERVZFTE9QRVIKCkFzIG9uZSBvZiB0aGUgbGF0dGVyLCBJIHB1dCB0b2dldGhlciB0aGVzZSBub3RlcyB0byBoZWxwIG1lIHdoZW4gSSBuZWVkCnRvIHN0YXJ0IHdvcmsgb24gYSBuZXcgbW9kdWxlLiBJIHRha2UgdGhpcyBTa2VsZXRvbiBmaWxlLCBkZWxldGUgbW9zdCBvZgp0aGUgY29tbWVudHMsIGFuZCBjdXN0b21pemUgaXQgdG8gZG8gd2hhdGV2ZXIgaXQgaXMgSSBuZWVkIGRvbmUuCgpLZWVwIGluIG1pbmQgdGhhdCB0aGUgbW9kdWxlIGludGVyZmFjZSBoYXMgYSBodWdlIG51bWJlciBvZiBob29rcwphdmFpbGFibGUgdG8gY29udHJvbCBtYW55LCBtYW55IGFzcGVjdHMgb2YgaG93IENNUyBNYWRlIFNpbXBsZSB3b3Jrcy4KVGhpcyBtb2R1bGUgZG9lcyBub3QgZXZlbiBiZWdpbiB0byBzY3JhdGNoIHRoZSBzdXJmYWNlLCBleGNlcHQsCnBlcmhhcHMsIGFzIGFuIGV4YW1wbGUgb2YgYSAicGx1Zy1pbiIgdHlwZSBtb2R1bGUuIFRoZXJlIGFyZQptYW55IGZ1bmN0aW9uYWwgaG9va3MgZm9yIG1vZGlmeWluZyB1c2VycywgZ3JvdXBzLCBjb250ZW50LCB0ZW1wbGF0ZXMsCmh0bWwgYmxvYnMsIG9uIGluc2VydGlvbiwgZGVsZXRpb24sIGNoYW5nZSwgYW5kIG11Y2gsIG11Y2ggbW9yZS4KRm9yIHRoZSBkZWZpbml0aXZlIGxpc3Qgb2YgdGhlc2UgZnVuY3Rpb25zLCBsb29rIGF0IHRoZSBiYXNlIGNsYXNzOgoKQ01TX1JPT1QvbGliL2NsYXNzZXMvY2xhc3MubW9kdWxlLmluYy5waHAKCkl0J3MgZ29vZCByZWFkaW4nLCBhbmQgaXQgdGVsbHMgeW91IGV2ZXJ5dGhpbmcgeW91IG5lZWQgdG8ga25vdy4gSQpsZWFybiBzb21ldGhpbmcgbmV3IGV2ZXJ5IHRpbWUgSSBsb29rIGF0IGl0LgoKMS4gRGlyZWN0b3J5IFN0cnVjdHVyZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpVbmRlcm5lYXRoIHRoaXMgY3VycmVudCBkaXJlY3RvcnksIHRoZXJlIGFyZSAibGFuZyIgYW5kICJ0ZW1wbGF0ZXMiCmRpcmVjdG9yaWVzLiBUaGUgbWFnaWMgb2YgdGhlIENNUyBtb2R1bGUgaW50ZXJmYWNlIHN5c3RlbSBpcyBzdWNoCnRoYXQgZmlsZXMgd2l0aGluIHRob3NlIGRpcmVjdG9yaWVzIGFyZSBhdXRvbWF0aWNhbGx5IGF2YWlsYWJsZSB0bwp5b3VyIG1vZHVsZSwgcGFydGljdWxhcmx5IHdoZW4gaXQgY29tZXMgdG8gbG9jYWxpemF0aW9uIGFuZApzbWFydHkgdGVtcGxhdGVzLgoKMi4gTG9jYWxpemF0aW9uCi0tLS0tLS0tLS0tLS0tLQoKSW4gdGhlICJsYW5nIiBkaXJlY3RvcnksIHlvdSBjYW4gY3JlYXRlIHlvdXIgbGFuZ3VhZ2UgZmlsZXMuCk5vdGUgdGhhdCB0aGUgbmV3IHN0cnVjdHVyZSBpbnZvbHZlcyBhIGRpcmVjdG9yeSBwZXIgbGFuZ3VhZ2UsIHNvLCBmb3IgZXhhbXBsZSwKeW91ciBVUyBFbmdsaXNoIGxhbmd1YWdlIGZpbGVzIHdvdWxkIGJlIGluIGxhbmcvZW5fVVMvZW5fVVMucGhwLCB3aGlsZSB5b3VyClN3ZWRpc2ggbGFuZ3VhZ2UgZmlsZXMgd291bGQgYmUgaW4gbGFuZy9zdl9TRS9zdl9TRS5waHAuCgpGb3IgZWFjaCBsb2NhbGl6ZWQgd29yZCwgY3JlYXRlIGFuIGVudHJ5IGluIHRoYXQgZmlsZSBvZiB0aGUgZm9ybToKCiRsYW5nWyd3b3JkJ10gPSAnTG9jYWxpemVkIFZlcnNpb24gb2YgV29yZCc7CgpOb3csIHdpdGhpbmcgeW91ciBtb2R1bGUsIGFueSB0aW1lIHlvdSB3YW50IGEgbG9jYWxpemVkIHZlcnNpb24gb2YgdGhlCndvcmQsIHlvdSBzaW1wbHkgcmVmZXIgdG86CgokdGhpcy0+TGFuZygnd29yZCcpCgozLiBUZW1wbGF0ZXMKLS0tLS0tLS0tLS0tCgpTbWFydHkgaXMgYnVpbHQtaW4gdG8gdGhlIG1vZHVsZSBBUEkuIFRlbXBsYXRlcyBhcmUgYXNzdW1lZCB0byBiZSBpbiB0aGUKInRlbXBsYXRlcyIgZGlyZWN0b3J5IG9mIHRoZSBtb2R1bGUuIFNlZSB0aGUgQ3JlYXRlRm9ybSBtZXRob2QgYmVsb3cuCgo0LiBBZG1pbiBJY29ucwotLS0tLS0tLS0tLS0tLQoKSWYgeW91ciBtb2R1bGUgaGFzIGFuIEFkbWluIHBhbmVsLCBhbmQgeW91J2QgbGlrZSB0byBnaXZlIGl0IGEgY3VzdG9tCmljb24sIHNpbXBseSBjcmVhdGUgYSBkaXJlY3RvcnkgY2FsbGVkICJpbWFnZXMiIGFuZCBwbGFjZSB5b3VyIGljb24gaW4KdGhhdCBkaXJlY3Rvcnkgd2l0aCB0aGUgbmFtZSAiaWNvbi5naWYiIFRoaXMgaXMgb25seSBndWFyYW50ZWVkIHRvIHdvcmsKd2l0aCB0aGUgZGVmYXVsdCBhZG1pbiB0aGVtZS4KCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiovCgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIE1vZHVsZTogU2tlbGV0b24gLSBhIHBlZGFudGljICJzdGFydGluZyBwb2ludCIgbW9kdWxlCiMgVmVyc2lvbjogMS4yLCBTakcKIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIENNUyAtIENNUyBNYWRlIFNpbXBsZSBpcyAoYykgMjAwNSBieSBUZWQgS3VscCAod2lzaHlAY21zbWFkZXNpbXBsZS5vcmcpCiMgVGhpcyBwcm9qZWN0J3MgaG9tZXBhZ2UgaXM6IGh0dHA6Ly93d3cuY21zbWFkZXNpbXBsZS5vcmcKIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQojIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQojIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCiMgT3IgcmVhZCBpdCBvbmxpbmU6IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTAojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgoKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLyogWW91ciBpbml0aWFsIENsYXNzIGRlY2xhcmF0aW9uLiBUaGlzIGZpbGUncyBuYW1lIG11c3QKICAgYmUgIltjbGFzcydzIG5hbWVdLm1vZHVsZS5waHAiLCBvciwgaW4gdGhpcyBjYXNlLAogICBTa2VsZXRvbi5tb2R1bGUucGhwCiovIApjbGFzcyBTa2VsZXRvbiBleHRlbmRzIENNU01vZHVsZQp7CgoJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCSAgIEdldE5hbWUoKQoJICAgbXVzdCByZXR1cm4gdGhlIGV4YWN0IGNsYXNzIG5hbWUgb2YgdGhlIG1vZHVsZS4KCSAgIElmIHRoZXNlIGRvIG5vdCBtYXRjaCwgYmFkIHRoaW5ncyBoYXBwZW4uCgkgICAKCSAgIFRoaXMgaXMgdGhlIG5hbWUgdGhhdCdzIHNob3duIGluIHRoZSBtYWluIE1vZHVsZXMKCSAgIHBhZ2UgaW4gdGhlIEFkbWluLgoJICAgCgkgICBJZiB5b3Ugd2FudCB0byBiZSBzYWZlLCB5b3UgY2FuIGp1c3QgcmVwbGFjZSB0aGUgYm9keQoJICAgb2YgdGhpcyBmdW5jdGlvbiB3aXRoOgoJICAgcmV0dXJuIGdldF9jbGFzcygkdGhpcyk7IAoJICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoJZnVuY3Rpb24gR2V0TmFtZSgpCgl7CgkJcmV0dXJuICdTa2VsZXRvbic7Cgl9CgoJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCSAgIEdldEZyaWVuZGx5TmFtZSgpCgkgICBUaGlzIGNhbiByZXR1cm4gYW55IHN0cmluZywgcHJlZmVyYWJseSBhIGxvY2FsaXplZCBuYW1lCgkgICBvZiB0aGUgbW9kdWxlLiBUaGlzIGlzIHRoZSBuYW1lIHRoYXQncyBzaG93biBpbiB0aGUKCSAgIEFkbWluIE1lbnVzIGFuZCBzZWN0aW9uIHBhZ2VzIChpZiB0aGUgbW9kdWxlIGhhcyBhbiBhZG1pbgoJICAgY29tcG9uZW50KS4KCSAgIAoJICAgU2VlIHRoZSBub3RlIG9uIGxvY2FsaXphdGlvbiBhdCB0aGUgdG9wIG9mIHRoaXMgZmlsZS4KCSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCWZ1bmN0aW9uIEdldEZyaWVuZGx5TmFtZSgpCgl7CgkJcmV0dXJuICR0aGlzLT5MYW5nKCdmcmllbmRseW5hbWUnKTsKCX0KCgkKCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgkgICBHZXRWZXJzaW9uKCkKCSAgIFRoaXMgY2FuIHJldHVybiBhbnkgc3RyaW5nLCBwcmVmZXJhYmx5IGEgbnVtYmVyIG9yCgkgICBzb21ldGhpbmcgdGhhdCBtYWtlcyBzZW5zZSBmb3IgZGVzaWduYXRpbmcgYSB2ZXJzaW9uLgoJICAgVGhlIENNUyB3aWxsIHVzZSB0aGlzIHRvIGlkZW50aWZ5IHdoZXRoZXIgb3Igbm90CgkgICB0aGUgaW5zdGFsbGVkIHZlcnNpb24gb2YgdGhlIG1vZHVsZSBpcyBjdXJyZW50LCBhbmQKCSAgIHRoZSBtb2R1bGUgd2lsbCB1c2UgaXQgdG8gZmlndXJlIG91dCBob3cgdG8gdXBncmFkZQoJICAgaXRzZWxmIGlmIHJlcXVlc3RlZC4JICAgCgkgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCglmdW5jdGlvbiBHZXRWZXJzaW9uKCkKCXsKCQlyZXR1cm4gJzEuMic7Cgl9CgoJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCSAgIEdldEhlbHAoKQoJICAgVGhpcyByZXR1cm5zIEhUTUwgaW5mb3JtYXRpb24gb24gdGhlIG1vZHVsZS4KCSAgIFR5cGljYWxseSwgeW91J2xsIHdhbnQgdG8gaW5jbHVkZSBpbmZvcm1hdGlvbiBvbiBob3cgdG8KCSAgIHVzZSB0aGUgbW9kdWxlLgoJICAgCgkgICBTZWUgdGhlIG5vdGUgb24gbG9jYWxpemF0aW9uIGF0IHRoZSB0b3Agb2YgdGhpcyBmaWxlLgoJICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoJZnVuY3Rpb24gR2V0SGVscCgpCgl7CgkJcmV0dXJuICR0aGlzLT5MYW5nKCdoZWxwJyk7Cgl9CgoJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCSAgIEdldEF1dGhvcigpCgkgICBUaGlzIHJldHVybnMgYSBzdHJpbmcgdGhhdCBpcyBwcmVzZW50ZWQgaW4gdGhlIE1vZHVsZQoJICAgQWRtaW4gaWYgeW91IGNsaWNrIG9uIHRoZSAiQWJvdXQiIGxpbmsuCgkgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCglmdW5jdGlvbiBHZXRBdXRob3IoKQoJewoJCXJldHVybiAnU2pHJzsKCX0KCgkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJICAgR2V0QXV0aG9yRW1haWwoKQoJICAgVGhpcyByZXR1cm5zIGEgc3RyaW5nIHRoYXQgaXMgcHJlc2VudGVkIGluIHRoZSBNb2R1bGUKCSAgIEFkbWluIGlmIHlvdSBjbGljayBvbiB0aGUgIkFib3V0IiBsaW5rLiBJdCBoZWxwcyB1c2VycwoJICAgb2YgeW91ciBtb2R1bGUgZ2V0IGluIHRvdWNoIHdpdGggeW91IHRvIHNlbmQgYnVnIHJlcG9ydHMsCgkgICBxdWVzdGlvbnMsIGNhc2VzIG9mIGJlZXIsIGFuZC9vciBsYXJnZSBzdW1zIG9mIG1vbmV5LgoJICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoJZnVuY3Rpb24gR2V0QXV0aG9yRW1haWwoKQoJewoJCXJldHVybiAnc2pnQGNtc21vZHVsZXMuY29tJzsKCX0KCgkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJICAgR2V0Q2hhbmdlTG9nKCkKCSAgIFRoaXMgcmV0dXJucyBhIHN0cmluZyB0aGF0IGlzIHByZXNlbnRlZCBpbiB0aGUgbW9kdWxlCgkgICBBZG1pbiBpZiB5b3UgY2xpY2sgb24gdGhlIEFib3V0IGxpbmsuIEl0IGhlbHBzIHVzZXJzCgkgICBmaWd1cmUgb3V0IHdoYXQncyBjaGFuZ2VkIGJldHdlZW4gcmVsZWFzZXMuCgkgICBTZWUgdGhlIG5vdGUgb24gbG9jYWxpemF0aW9uIGF0IHRoZSB0b3Agb2YgdGhpcyBmaWxlLgoJICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoJZnVuY3Rpb24gR2V0Q2hhbmdlTG9nKCkKCXsKCQlyZXR1cm4gJHRoaXMtPkxhbmcoJ2NoYW5nZWxvZycpOwoJfQoKCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgkgICBJc1BsdWdpbk1vZHVsZSgpCgkgICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSBvciBmYWxzZSwgZGVwZW5kaW5nIHVwb24KCSAgIHdoZXRoZXIgdXNlcnMgY2FuIGluY2x1ZGUgdGhlIG1vZHVsZSBpbiBhIHBhZ2Ugb3IKCSAgIHRlbXBsYXRlIHVzaW5nIGEgc21hcnR5IHRhZyBvZiB0aGUgZm9ybQoJICAge2Ntc19tb2R1bGUgbW9kdWxlPSdTa2VsZXRvbicgcGFyYW0xPXZhbCBwYXJhbTI9dmFsLi4ufQoJICAgCgkgICBJZiB5b3VyIG1vZHVsZSBkb2VzIG5vdCBnZXQgaW5jbHVkZWQgaW4gcGFnZXMgb3IKCSAgIHRlbXBsYXRlcywgcmV0dXJuICJmYWxzZSIgaGVyZS4KCSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCWZ1bmN0aW9uIElzUGx1Z2luTW9kdWxlKCkKCXsKCQlyZXR1cm4gdHJ1ZTsKCX0KCgkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJICAgSGFzQWRtaW4oKQoJICAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgYm9vbGVhbiB2YWx1ZSwgZGVwZW5kaW5nIG9uCgkgICB3aGV0aGVyIHlvdXIgbW9kdWxlIGFkZHMgYW55dGhpbmcgdG8gdGhlIEFkbWluIGFyZWEgb2YKCSAgIHRoZSBzaXRlLiBGb3IgdGhlIHJlc3Qgb2YgdGhlc2UgY29tbWVudHMsIEknbGwgYmUgY2FsbGluZwoJICAgdGhlIGFkbWluIHBhcnQgb2YgeW91ciBtb2R1bGUgdGhlICJBZG1pbiBQYW5lbCIgZm9yCgkgICB3YW50IG9mIGEgYmV0dGVyIHRlcm0uCgkgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCglmdW5jdGlvbiBIYXNBZG1pbigpCgl7CgkJcmV0dXJuIHRydWU7Cgl9CgoJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCSAgIEdldEFkbWluU2VjdGlvbigpCgkgICBJZiB5b3VyIG1vZHVsZSBoYXMgYW4gQWRtaW4gUGFuZWwsIHlvdSBjYW4gc3BlY2lmeQoJICAgd2hpY2ggQWRtaW4gU2VjdGlvbiAob3IgdG9wLWxldmVsIEFkbWluIE1lbnUpIGl0IHNob3dzCgkgICB1cCBpbi4gVGhpcyBtZXRob2QgcmV0dXJucyBhIHN0cmluZyB0byBzcGVjaWZ5IHRoYXQKCSAgIHNlY3Rpb24uIFZhbGlkIHJldHVybiB2YWx1ZXMgYXJlOgoKCSAgIG1haW4gICAgICAgIC0gdGhlIE1haW4gbWVudSB0YWIuCgkgICBjb250ZW50ICAgICAtIHRoZSBDb250ZW50IG1lbnUKCSAgIGxheW91dCAgICAgIC0gdGhlIExheW91dCBtZW51CgkgICB1c2Vyc2dyb3VwcyAtIHRoZSBVc2VycyBhbmQgR3JvdXBzIG1lbnUKCSAgIGV4dGVuc2lvbnMgIC0gdGhlIEV4dGVuc2lvbnMgbWVudSAodGhpcyBpcyB0aGUgZGVmYXVsdCkKCSAgIHNpdGVhZG1pbiAgIC0gdGhlIFNpdGUgQWRtaW4gbWVudQoJICAgdmlld3NpdGUgICAgLSB0aGUgVmlldyBTaXRlIG1lbnUgdGFiCgkgICBsb2dvdXQgICAgICAtIHRoZSBMb2dvdXQgbWVudSB0YWIKCSAgIAoJICAgTm90ZSB0aGF0IGlmIHlvdSBwbGFjZSB5b3VyIG1vZHVsZSBpbiB0aGUgbWFpbiwKCSAgIHZpZXdzaXRlLCBvciBsb2dvdXQgc2VjdGlvbnMsIGl0IHdpbGwgc2hvdyB1cCBpbiB0aGUKCSAgIG1lbnVzLCBidXQgd2lsbCBub3QgYmUgdmlzaWJsZSBpbiBhbnkgdG9wLWxldmVsCgkgICBzZWN0aW9uIHBhZ2VzLgoJICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoJZnVuY3Rpb24gR2V0QWRtaW5TZWN0aW9uKCkKCXsKCQlyZXR1cm4gJ2V4dGVuc2lvbnMnOwoJfQoKCgkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJICAgR2V0QWRtaW5EZXNjcmlwdGlvbigpCgkgICBJZiB5b3VyIG1vZHVsZSBkb2VzIGhhdmUgYW4gQWRtaW4gUGFuZWwsIHlvdQoJICAgY2FuIGhhdmUgaXQgcmV0dXJuIGEgZGVzY3JpcHRpb24gc3RyaW5nIHRoYXQgZ2V0cyBzaG93bgoJICAgaW4gdGhlIEFkbWluIFNlY3Rpb24gcGFnZSB0aGF0IGNvbnRhaW5zIHRoZSBtb2R1bGUuCgkgICAKCSAgIFNlZSB0aGUgbm90ZSBvbiBsb2NhbGl6YXRpb24gYXQgdGhlIHRvcCBvZiB0aGlzIGZpbGUuCgkgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCglmdW5jdGlvbiBHZXRBZG1pbkRlc2NyaXB0aW9uKCkKCXsKCQlyZXR1cm4gJHRoaXMtPkxhbmcoJ21vZGRlc2NyaXB0aW9uJyk7Cgl9CgoKCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgkgICBWaXNpYmxlVG9BZG1pblVzZXIoKQoJICAgSWYgeW91ciBtb2R1bGUgZG9lcyBoYXZlIGFuIEFkbWluIFBhbmVsLCB5b3UKCSAgIGNhbiBjb250cm9sIHdoZXRoZXIgb3Igbm90IGl0J3MgZGlzcGxheWVkIGJ5IHRoZSBib29sZWFuCgkgICB0aGF0IGlzIHJldHVybmVkIGJ5IHRoaXMgbWV0aG9kLiBUaGlzIGlzIHByaW1hcmlseSB1c2VkCgkgICB0byBoaWRlIG1vZHVsZXMgZnJvbSBhZG1pbnMgd2hvIGxhY2sgcGVybWlzc2lvbiB0byB1c2UKCSAgIHRoZW0uCgkgICBJbiB0aGlzIGNhc2UsIHRoZSBtb2R1bGUgd2lsbCBvbmx5IGJlIHZpc2libGUgdG8gYWRtaW5zCgkgICB3aG8gaGF2ZSAiVXNlIFNrZWxldG9uIiBwZXJtaXNzaW9ucy4KCSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCWZ1bmN0aW9uIFZpc2libGVUb0FkbWluVXNlcigpCgl7CiAgICAgICAgcmV0dXJuICR0aGlzLT5DaGVja1Blcm1pc3Npb24oJ1VzZSBTa2VsZXRvbicpOwoJfQoKCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgkgICBHZXREZXBlbmRlbmNpZXMoKQoJICAgWW91ciBtb2R1bGUgbWF5IG5lZWQgYW5vdGhlciBtb2R1bGUgdG8gYWxyZWFkeSBiZSBpbnN0YWxsZWQKCSAgIGJlZm9yZSB5b3UgY2FuIGluc3RhbGwgaXQuCgkgICBUaGlzIG1ldGhvZCByZXR1cm5zIGEgbGlzdCBvZiB0aG9zZSBkZXBlbmRlbmNpZXMgYW5kCgkgICBtaW5pbXVtIHZlcnNpb24gbnVtYmVycyB0aGF0IHRoaXMgbW9kdWxlIHJlcXVpcmVzLgoJICAgCgkgICBJdCBzaG91bGQgcmV0dXJuIGFuIGhhc2gsIGVnLgoJICAgcmV0dXJuIGFycmF5KCdzb21lbW9kdWxlJz0+JzEuMCcsICdvdGhlcm1vZHVsZSc9PicxLjEnKTsKCSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCWZ1bmN0aW9uIEdldERlcGVuZGVuY2llcygpCgl7CgkJcmV0dXJuIGFycmF5KCk7Cgl9CgoJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCSAgIE1pbmltdW1DTVNWZXJzaW9uKCkKCSAgIFlvdXIgbW9kdWxlIG1heSByZXF1aXJlIGZ1bmN0aW9ucyBvciBvYmplY3RzIGZyb20KCSAgIGEgc3BlY2lmaWMgdmVyc2lvbiBvZiBDTVMgTWFkZSBTaW1wbGUuCgkgICBFdmVyIHNpbmNlIHZlcnNpb24gMC4xMSwgeW91IGNhbiBzcGVjaWZ5IHdoaWNoIG1pbmltdW0KCSAgIENNUyBNUyB2ZXJzaW9uIGlzIHJlcXVpcmVkIGZvciB5b3VyIG1vZHVsZSwgd2hpY2ggd2lsbAoJICAgcHJldmVudCBpdCBmcm9tIGJlaW5nIGluc3RhbGxlZCBieSBhIHZlcnNpb24gb2YgQ01TIHRoYXQKCSAgIGNhbid0IHJ1biBpdC4KCSAgIAoJICAgVGhpcyBtZXRob2QgcmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlCgkgICBtaW5pbXVtIHZlcnNpb24gdGhhdCB0aGlzIG1vZHVsZSByZXF1aXJlcy4KCSAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCglmdW5jdGlvbiBNaW5pbXVtQ01TVmVyc2lvbigpCgl7CgkJcmV0dXJuICIwLjExIjsKCX0KCgoJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCSAgIEluc3RhbGwoKQoJICAgV2hlbiB5b3VyIG1vZHVsZSBpcyBpbnN0YWxsZWQsIHlvdSBtYXkgbmVlZCB0byBkbyBzb21lCgkgICBzZXR1cC4gVHlwaWNhbCB0aGluZ3MgdGhhdCBoYXBwZW4gaGVyZSBhcmUgdGhlIGNyZWF0aW9uCgkgICBhbmQgcHJlcG9wdWxhdGlvbiBvZiBkYXRhYmFzZSB0YWJsZXMsIGRhdGFiYXNlIHNlcXVlbmNlcywKCSAgIHBlcm1pc3Npb25zLCBwcmVmZXJlbmNlcywgZXRjLgoJICAgCgkgICBUaGlzIGV4YW1wbGUgY3JlYXRlcyBhIFNrZWxldG9uIGRhdGFiYXNlIHRhYmxlIGFuZAoJICAgc2VxdWVuY2UsIGl0IGNyZWF0ZXMgdGhlICJVc2UgU2tlbGV0b24iIHBlcm1pc3Npb24sCgkgICBhbmQgc2V0cyB0aGUgIlNpbmcgTG91ZGx5IiBwcmVmZXJlbmNlLgoJICAgCgkgICBUaGUgZGF0YWJhc2UgaXMgbm90IGFjdHVhbGx5IHVzZWQgaW4gdGhpcyBleGFtcGxlOwoJICAgY2hlY2sgYW55IG9uZSBvZiB0aGUgb3RoZXIgbW9kdWxlcyBpZiB5b3Ugd2FudCB0byBzZWUKCSAgIG1ldGhvZCBjb2RlIHRoYXQgdXNlcyB0aGUgZGF0YWJhc2UuCgkgICAKCSAgIEZvciBpbmZvcm1hdGlvbiBvbiB0aGUgY3JlYXRpb24gb2YgZGF0YWJhc2UgdGFibGVzLAoJICAgY2hlY2sgb3V0IHRoZSBBRE9EQiBEYXRhIERpY3Rpb25hcnkgcGFnZSBhdAoJICAgaHR0cDovL3BocGxlbnMuY29tL2xlbnMvYWRvZGIvZG9jcy1kYXRhZGljdC5odG0KCSAgIAoJICAgVGhpcyBmdW5jdGlvbiBjYW4gcmV0dXJuIGEgc3RyaW5nIGluIGNhc2Ugb2YgYW55IGVycm9yLAoJICAgYW5kIENNUyB3aWxsIG5vdCBjb25zaWRlciB0aGUgbW9kdWxlIGluc3RhbGxlZC4KCSAgIFN1Y2Nlc3NmdWwgaW5zdGFsbHMgc2hvdWxkIHJldHVybiBGQUxTRSBvciBub3RoaW5nIGF0IGFsbC4KCSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCWZ1bmN0aW9uIEluc3RhbGwoKQoJewoJCSRkYiA9ICYkdGhpcy0+Y21zLT5kYjsKCQkKCQkvLyBteXNxbC1zcGVjaWZpYywgYnV0IGlnbm9yZWQgYnkgb3RoZXIgZGF0YWJhc2UKCQkkdGFib3B0YXJyYXkgPSBhcnJheSgnbXlzcWwnID0+ICdUWVBFPU15SVNBTScpOwoKCQkkZGljdCA9IE5ld0RhdGFEaWN0aW9uYXJ5KCRkYik7CgkJCiAgICAgICAgLy8gdGFibGUgc2NoZW1hIGRlc2NyaXB0aW9uCiAgICAgICAgJGZsZHMgPSAiCgkJCXNrZWxldG9uX2lkIEkgS0VZLAoJCQlkZXNjcmlwdGlvbiBDKDgwKQoJCQkiOwoKCQkvLyBjcmVhdGUgaXQuIFRoaXMgc2hvdWxkIGRvIGVycm9yIGNoZWNraW5nLCBidXQgSSdtIGEgbGF6eSBzb2QuCgkJJHNxbGFycmF5ID0gJGRpY3QtPkNyZWF0ZVRhYmxlU1FMKGNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX3NrZWxldG9uIiwKCQkJCSRmbGRzLCAkdGFib3B0YXJyYXkpOwoJCSRkaWN0LT5FeGVjdXRlU1FMQXJyYXkoJHNxbGFycmF5KTsKCgkJLy8gY3JlYXRlIGEgc2VxdWVuY2UKCQkkZGItPkNyZWF0ZVNlcXVlbmNlKGNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX3NrZWxldG9uX3NlcSIpOwoKCQkvLyBjcmVhdGUgYSBwZXJtaXNzaW9uCiAgICAgICAgJHRoaXMtPkNyZWF0ZVBlcm1pc3Npb24oJ1VzZSBTa2VsZXRvbicsICdVc2UgU2tlbGV0b24nKTsKICAgICAgICAKICAgICAgICAvLyBjcmVhdGUgYSBwcmVmZXJlbmNlCiAgICAgICAgJHRoaXMtPlNldFByZWZlcmVuY2UoInNpbmdfbG91ZGx5IiwgdHJ1ZSk7CgoJCS8vIHB1dCBtZW50aW9uIGludG8gdGhlIGFkbWluIGxvZwoJCSR0aGlzLT5BdWRpdCggMCwgJHRoaXMtPkxhbmcoJ2ZyaWVuZGx5bmFtZScpLCAkdGhpcy0+TGFuZygnaW5zdGFsbGVkJywkdGhpcy0+R2V0VmVyc2lvbigpKSk7Cgl9CgoJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCSAgIEluc3RhbGxQb3N0TWVzc2FnZSgpCgkgICBBZnRlciBpbnN0YWxsYXRpb24sIHRoZXJlIG1heSBiZSB0aGluZ3MgeW91IHdhbnQgdG8KCSAgIGNvbW11bmljYXRlIHRvIHlvdXIgYWRtaW4uIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhCgkgICBzdHJpbmcgd2hpY2ggd2lsbCBiZSBkaXNwbGF5ZWQuCgkgICAKCSAgIFNlZSB0aGUgbm90ZSBvbiBsb2NhbGl6YXRpb24gYXQgdGhlIHRvcCBvZiB0aGlzIGZpbGUuCgkgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCglmdW5jdGlvbiBJbnN0YWxsUG9zdE1lc3NhZ2UoKQoJewoJCXJldHVybiAkdGhpcy0+TGFuZygncG9zdGluc3RhbGwnKTsKCX0KCgkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJICAgVW5pbnN0YWxsUG9zdE1lc3NhZ2UoKQoJICAgQWZ0ZXIgcmVtb3ZpbmcgYSBtb2R1bGUsIHRoZXJlIG1heSBiZSB0aGluZ3MgeW91IHdhbnQgdG8KCSAgIGNvbW11bmljYXRlIHRvIHlvdXIgYWRtaW4uIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhCgkgICBzdHJpbmcgd2hpY2ggd2lsbCBiZSBkaXNwbGF5ZWQuCgkgICAKCSAgIFNlZSB0aGUgbm90ZSBvbiBsb2NhbGl6YXRpb24gYXQgdGhlIHRvcCBvZiB0aGlzIGZpbGUuCgkgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCglmdW5jdGlvbiBVbmluc3RhbGxQb3N0TWVzc2FnZSgpCgl7CgkJcmV0dXJuICR0aGlzLT5MYW5nKCdwb3N0dW5pbnN0YWxsJyk7Cgl9CgoKCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgkgICBVcGdyYWRlKCkKCSAgIElmIHlvdXIgbW9kdWxlIHZlcnNpb24gbnVtYmVyIGRvZXMgbm90IG1hdGNoIHRoZSB2ZXJzaW9uCgkgICBudW1iZXIgb2YgdGhlIGluc3RhbGxlZCBtb2R1bGUsIHRoZSBDTVMgQWRtaW4gd2lsbCBnaXZlCgkgICB5b3UgYSBjaGFuY2UgdG8gdXBncmFkZSB0aGUgbW9kdWxlLiBUaGlzIGlzIHRoZSBmdW5jdGlvbgoJICAgdGhhdCBhY3R1YWxseSBoYW5kbGVzIHRoZSB1cGdyYWRlLgoJICAgSWRlYWxseSwgdGhpcyBmdW5jdGlvbiBzaG91bGQgaGFuZGxlIHVwZ3JhZGVzIGluY3JlbWVudGFsbHksCgkgICBzbyB5b3UgY291bGQgdXBncmFkZSBmcm9tIHZlcnNpb24gMC4wLjEgdG8gMTAuNS43IHdpdGgKCSAgIGEgc2luZ2xlIGNhbGwuIEZvciBhIGdyZWF0IGV4YW1wbGUgb2YgdGhpcywgc2VlIHRoZSBOZXdzCgkgICBtb2R1bGUgaW4gdGhlIHN0YW5kYXJkIENNUyBpbnN0YWxsLgoJICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoJZnVuY3Rpb24gVXBncmFkZSgkb2xkdmVyc2lvbiwgJG5ld3ZlcnNpb24pCgl7CgkJJGN1cnJlbnRfdmVyc2lvbiA9ICRvbGR2ZXJzaW9uOwoJCXN3aXRjaCgkY3VycmVudF92ZXJzaW9uKQoJCXsKCQkJY2FzZSAiMS4wIjoKCQkJICAgICBicmVhazsKCQkJY2FzZSAiMS4xIjoKCQkJICAgICBicmVhazsKCQl9CgkJCgkJLy8gcHV0IG1lbnRpb24gaW50byB0aGUgYWRtaW4gbG9nCgkJJHRoaXMtPkF1ZGl0KCAwLCAkdGhpcy0+TGFuZygnZnJpZW5kbHluYW1lJyksICR0aGlzLT5MYW5nKCd1cGdyYWRlZCcsJHRoaXMtPkdldFZlcnNpb24oKSkpOwoJfQoKCgkvKioKCSAqIFVuaW5zdGFsbFByZU1lc3NhZ2UoKQoJICogVGhpcyBhbGxvd3MgeW91IHRvIGRpc3BsYXkgYSBtZXNzYWdlIGFsb25nIHdpdGggYSBZZXMvTm8gZGlhbG9nIGJveC4gSWYgdGhlIHVzZXIgcmVzcG9uZHMKCSAqIGluIHRoZSBhZmZpcm1hdGl2ZSB0byB5b3VyIG1lc3NhZ2UsIHRoZSB1bmluc3RhbGwgd2lsbCBwcm9jZWVkLiBJZiB0aGV5IHJlc3BvbmQgaW4gdGhlCgkgKiBuZWdhdGl2ZSwgdGhlIHVuaW5zdGFsbCB3aWxsIGJlIGNhbmNlbGVkLiBUaHVzLCB5b3VyIG1lc3NhZ2Ugc2hvdWxkIGJlIG9mIHRoZSBmb3JtCgkgKiAiQWxsIG1vZHVsZSBkYXRhIHdpbGwgYmUgZGVsZXRlZC4gQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIHVuaW5zdGFsbCB0aGlzIG1vZHVsZT8iCgkgKgoJICogSWYgeW91IGRvbid0IHdhbnQgdGhlIGRpYWxvZywgaGF2ZSB0aGlzIG1ldGhvZCByZXR1cm4gYSBGQUxTRSwgd2hpY2ggd2lsbCBjYXVzZSB0aGUKCSAqIG1vZHVsZSB0byB1bmluc3RhbGwgaW1tZWRpYXRlbHkgaWYgdGhlIHVzZXIgY2xpY2tzIHRoZSAidW5pbnN0YWxsIiBsaW5rLgoJICovCglmdW5jdGlvbiBVbmluc3RhbGxQcmVNZXNzYWdlKCkKCXsKCQlyZXR1cm4gJHRoaXMtPkxhbmcoJ3JlYWxseV91bmluc3RhbGwnKTsKCX0KCQoJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCSAgIFVuaW5zdGFsbCgpCgkgICBTb21ldGltZXMsIGFuIGV4Y2VwdGlvbmFsbHkgdW5lbmxpZ2h0ZW5lZCBvciBpZ25vcmFudAoJICAgYWRtaW4gd2lsbCB3aXNoIHRvIHVuaW5zdGFsbCB5b3VyIG1vZHVsZS4gV2hpbGUgaXQKCSAgIHdvdWxkIGJlIGJlc3QgdG8gbGF5IGludG8gdGhlc2UgaWRpb3RzIHdpdGggYSBjbHVlc3RpY2ssCgkgICB3ZSB3aWxsIGRvIHRoZSBtYWduYW5pbW91cyB0aGluZyBhbmQgcmVtb3ZlIHRoZSBtb2R1bGUKCSAgIGFuZCBjbGVhbiB1cCB0aGUgZGF0YWJhc2UsIHBlcm1pc3Npb25zLCBhbmQgcHJlZmVyZW5jZXMKCSAgIHRoYXQgYXJlIHNwZWNpZmljIHRvIGl0LgoJICAgVGhpcyBpcyB0aGUgbWV0aG9kIHdoZXJlIHdlIGRvIHRoaXMuCgkgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCglmdW5jdGlvbiBVbmluc3RhbGwoKQoJewoJCSRkYiA9ICYkdGhpcy0+Y21zLT5kYjsKCQkKCQkvLyByZW1vdmUgdGhlIGRhdGFiYXNlIHRhYmxlCgkJJGRpY3QgPSBOZXdEYXRhRGljdGlvbmFyeSggJGRiICk7CgkJJHNxbGFycmF5ID0gJGRpY3QtPkRyb3BUYWJsZVNRTCggY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfc2tlbGV0b24iICk7CgkJJGRpY3QtPkV4ZWN1dGVTUUxBcnJheSgkc3FsYXJyYXkpOwoKCQkvLyByZW1vdmUgdGhlIHNlcXVlbmNlCgkJJGRiLT5Ecm9wU2VxdWVuY2UoIGNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX3NrZWxldG9uX3NlcSIgKTsKCgkJLy8gcmVtb3ZlIHRoZSBwZXJtaXNzaW9ucwoJCSR0aGlzLT5SZW1vdmVQZXJtaXNzaW9uKCdVc2UgU2tlbGV0b24nKTsKCQkKCQkvLyByZW1vdmUgdGhlIHByZWZlcmVuY2UKCQkkdGhpcy0+UmVtb3ZlUHJlZmVyZW5jZSgic2luZ19sb3VkbHkiKTsKCQkKCQkvLyBwdXQgbWVudGlvbiBpbnRvIHRoZSBhZG1pbiBsb2cKCQkkdGhpcy0+QXVkaXQoIDAsICR0aGlzLT5MYW5nKCdmcmllbmRseW5hbWUnKSwgJHRoaXMtPkxhbmcoJ3VuaW5zdGFsbGVkJykpOwoJfQoKCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgkgICBEb0FjdGlvbigkYWN0aW9uLCAkaWQsICRwYXJhbXMsICRyZXR1cm5faWQpCgkgICBUaGlzIGlzIHRoZSBtYWluIGZ1bmN0aW9uIHRoYXQgZ2V0cyBjYWxsZWQgaWYgeW91ciBtb2R1bGUKCSAgIGlzIGEgcGx1Zy1pbiB0eXBlIG1vZHVsZS4KCSAgIAoJICAgSW4gZ2VuZXJhbCwgeW91J2xsIHdhbnQgdG8gY2FsbCB2YXJpb3VzIGRpZmZlcmVudAoJICAgbWV0aG9kcywgZGVwZW5kaW5nIHVwb24gdGhlIHJlcXVlc3RlZCAiYWN0aW9uLiIKCSAgIAoJICAgVGhlcmUgYXJlIHR3byBidWlsdC1pbiBhY3Rpb25zOiAiZGVmYXVsdCIgd2hpY2ggZ2V0cwoJICAgY2FsbGVkIGlmIHRoZSBtb2R1bGUgaXMgYWNjZXNzZWQgZnJvbSBhIHBhZ2Ugb3IgdGVtcGxhdGUsCgkgICBhbmQgImRlZmF1bHRhZG1pbiIgd2hpY2ggZ2V0cyBjYWxsZWQgZnJvbSB0aGUgQWRtaW4KCSAgIHBhbmVsLgoJICAgCgkgICBUaGUgQWN0aW9uIGNhbiBiZSBvdmVycmlkZGVuIGJ5IHBhc3NpbmcgYSBkaWZmZXJlbnQKCSAgIGFjdGlvbiBlaXRoZXIgaW4geW91ciB0YWcsIGUuZy4sCgkgICB7Y21zX21vZHVsZSBtb2R1bGU9J1NrZWxldG9uJyBhY3Rpb249J3NvbWV0aGluZyd9CgkgICBvciBieSBwYXNzaW5nIGl0IGluIGEgbGluayBjcmVhdGUgYnkgdGhlIENyZWF0ZUxpbmsKCSAgIG1ldGhvZC4gTW9yZSBvbiB0aGF0IGNhbiBiZSBzZWVuIGJlbG93IGluIHRoZQoJICAgRGlzcGxheUFkbWluTmF2IG1ldGhvZC4KCSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCWZ1bmN0aW9uIERvQWN0aW9uKCRhY3Rpb24sICRpZCwgJHBhcmFtcywgJHJldHVybl9pZD0tMSkKCXsKCQlzd2l0Y2ggKCRhY3Rpb24pCgkJewogICAgICAgICAgICBjYXNlICdkZWZhdWx0JzoKICAgICAgICAgICAgCXsKICAgICAgICAgICAgCS8vIHRoaXMgaXMgdGhlIHBsdWctaW4gc2lkZSwgaS5lLiwgbm9uLUFkbWluCiAgICAgICAgICAgIAkkdGhpcy0+RGlzcGxheU1vZHVsZU91dHB1dCgkYWN0aW9uLCAkaWQsICRwYXJhbXMpOwogICAgICAgICAgICAJYnJlYWs7CiAgICAgICAgICAgIAl9CiAgICAgICAgICAgIGNhc2UgJ2RlZmF1bHRhZG1pbic6CiAgICAgICAgICAgIAl7CiAgICAgICAgICAgIAkvLyBvbmx5IGxldCBwZW9wbGUgYWNjZXNzIG1vZHVsZSBwcmVmZXJlbmNlcyBpZiB0aGV5IGhhdmUgcGVybWlzc2lvbgogICAgICAgICAgICAJaWYgKCR0aGlzLT5DaGVja1Blcm1pc3Npb24oJ1VzZSBTa2VsZXRvbicpKQogICAgICAgICAgICAJCXsKICAgICAgICAgICAgCQkkdGhpcy0+RGlzcGxheUFkbWluUGFuZWwoJGlkLCAkcGFyYW1zLCAkcmV0dXJuX2lkKTsKICAgICAgICAgICAgCQl9CiAgICAgICAgICAgIAllbHNlCiAgICAgICAgICAgIAkJewogICAgICAgICAgICAJCSR0aGlzLT5EaXNwbGF5RXJyb3JQYWdlKCRpZCwgJHBhcmFtcywgJHJldHVybl9pZCwKICAgICAgICAgICAgCQkJJHRoaXMtPkxhbmcoJ2FjY2Vzc2RlbmllZCcpKTsKICAgICAgICAgICAgCQl9CiAgICAgICAgICAgIAlicmVhazsKICAgICAgICAgICAgCX0KICAgICAgICAgICAgY2FzZSAnYWRtaW5fcHJlZnMnOgogICAgICAgICAgICAJewogICAgICAgICAgICAJLy8gb25seSBsZXQgcGVvcGxlIGFjY2VzcyBtb2R1bGUgcHJlZmVyZW5jZXMgaWYgdGhleSBoYXZlIHBlcm1pc3Npb24KICAgICAgICAgICAgCWlmICgkdGhpcy0+Q2hlY2tQZXJtaXNzaW9uKCdVc2UgU2tlbGV0b24nKSkKICAgICAgICAgICAgCQl7CiAgICAgICAgICAgIAkJJHRoaXMtPkRpc3BsYXlBZG1pblByZWZzKCRpZCwgJHBhcmFtcywgJHJldHVybl9pZCk7CiAgICAgICAgICAgIAkJfQogICAgICAgICAgICAJYnJlYWs7CiAgICAgICAgICAgIAl9CiAgICAgICAgICAgIGNhc2UgJ3NhdmVfYWRtaW5fcHJlZnMnOgogICAgICAgICAgICAJewogICAgICAgICAgICAJLy8gb25seSBsZXQgcGVvcGxlIHNhdmUgbW9kdWxlIHByZWZlcmVuY2VzIGlmIHRoZXkgaGF2ZSBwZXJtaXNzaW9uCiAgICAgICAgICAgIAlpZiAoJHRoaXMtPkNoZWNrUGVybWlzc2lvbignVXNlIFNrZWxldG9uJykpCiAgICAgICAgICAgIAkJewogICAgICAgICAgICAJCSR0aGlzLT5TYXZlQWRtaW5QcmVmcygkaWQsICRwYXJhbXMsICRyZXR1cm5faWQpOwogICAgICAgICAgICAJCX0KICAgICAgICAgICAgCWJyZWFrOwogICAgICAgICAgICAJfQoJCX0KCgl9CgoJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCSAgIERpc3BsYXlBZG1pblByZWZzKCRpZCwgJHBhcmFtcywgJHJldHVybl9pZCwgJG1lc3NhZ2UpCgkgICBOT1QgUEFSVCBPRiBUSEUgTU9EVUxFIEFQSQoKCSAgIFRoaXMgaXMgYW4gZXhhbXBsZSBvZiBhIHNpbXBsZSBtZXRob2QgdG8gcHJlc2VudCBhbiBBZG1pbgoJICAgZm9ybSB0aGF0IGNvbnRhaW5zIHByZWZlcmVuY2UgaW5mb3JtYXRpb24uCgkgICAKCSAgIEl0IHNldHMgc21hcnR5IHRhZyB2YWx1ZXMsIGFuZCB0aGVuIGNhbGxzIHRoZQoJICAgY29kZSBuZWNlc3NhcnkgdG8gcmVuZGVyIHRoZSB0ZW1wbGF0ZS4gICAKCSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgIGZ1bmN0aW9uIERpc3BsYXlBZG1pblByZWZzKCRpZCwgJiRwYXJhbXMsICRyZXR1cm5pZCwgJG1lc3NhZ2U9JycpCiAgICB7CgogICAgCS8vIHNpbXBsZSB3YXkgdG8gaGF2ZSBjb21tb24gbmF2IGF2YWlsYWJsZSB0byBhbGwgYWRtaW4gcGFnZXMKICAgIAkkdGhpcy0+RGlzcGxheUFkbWluTmF2KCRpZCwgJHBhcmFtcywgJHJldHVybmlkKTsKCiAgICAJLy8gQ3JlYXRlRm9ybVN0YXJ0IHNldHMgdXAgYSBwcm9wZXIgZm9ybSB0YWcgdGhhdCB3aWxsIGNhdXNlIHRoZSBzdWJtaXQgdG8KICAgIAkvLyByZXR1cm4gY29udHJvbCB0byB0aGlzIG1vZHVsZSBmb3IgcHJvY2Vzc2luZy4KCQkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3N0YXJ0Zm9ybScsCgkJCSR0aGlzLT5DcmVhdGVGb3JtU3RhcnQoJGlkLCAnc2F2ZV9hZG1pbl9wcmVmcycsICRyZXR1cm5pZCkpOwoJCSR0aGlzLT5zbWFydHktPmFzc2lnbignZW5kZm9ybScsICR0aGlzLT5DcmVhdGVGb3JtRW5kKCkpOwoJCSR0aGlzLT5zbWFydHktPmFzc2lnbignc3VibWl0JywKCQkJJHRoaXMtPkNyZWF0ZUlucHV0U3VibWl0KCRpZCwgJ3N1Ym1pdCcsICdTdWJtaXQnKSk7CgoKCQkvLyBpdCdzIGdvb2QgcHJhY3RpY2UgdG8gc2V0IGV2ZW4gc3RhdGljIHRpdGxlcyB1c2luZyBzbWFydHksIHNvIGxvY2FsaXphdGlvbiBpcwoJCS8vIGVhc2llci4KCQkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3RpdGxlX3NpbmdfbG91ZGx5JywgJHRoaXMtPkxhbmcoJ3RpdGxlX3NpbmdfbG91ZGx5JykpOwoJCSR0aGlzLT5zbWFydHktPmFzc2lnbigndGl0bGVfc2VjdGlvbicsICR0aGlzLT5MYW5nKCd0aXRsZV9tb2RfcHJlZnMnKSk7CgkJCgkJLy8geW91J2xsIG9mdGVuIHdhbnQgdG8gZG8gdGhpbmdzIGxpa2UgdGhpcyB0byBwcm92aWRlIGZlZWRiYWNrOgoJCSR0aGlzLT5zbWFydHktPmFzc2lnbl9ieV9yZWYoJ21lc3NhZ2UnLCAkbWVzc2FnZSk7CgoJCS8qIHByZXNlbnQgYSBjb250cm9sIG9mIHRoZSBwcmVmZXJlbmNlOyBpbiB0aGlzIGNhc2UsIGl0J3MgYSBjaGVja2JveAoJCSAgIGZvciBvdXIgIlNpbmcgTG91ZGx5IiBvcHRpb24uCgkJICAgCgkJICAgVGFrZSBhIGxvb2sgYXQgQ01TUk9PVC9saWIvY2xhc3Nlcy9jbGFzcy5tb2R1bGUuaW5jLnBocCBmb3IgYSBsYXJnZSBjb2xsZWN0aW9uCgkJICAgb2YgbWV0aG9kcyB0byBjcmVhdGUgSFRNTCBhbmQgZm9ybSB3aWRnZXRzOgoJCSAgIAoJCSAgIC0gQ3JlYXRlSW5wdXRQYXNzd29yZAkJLSBDcmVhdGVJbnB1dFRleHQKCQkgICAtIENyZWF0ZUxpbmsJCQkJCS0gQ3JlYXRlRmlsZVVwbG9hZElucHV0CgkJICAgLSBDcmVhdGVUZXh0QXJlYQkJCQktIENyZWF0ZUlucHV0U3VibWl0CgkJICAgLSBDcmVhdGVJbnB1dFJhZGlvR3JvdXAJCS0gQ3JlYXRlSW5wdXRDaGVja2JveAoJCSAgIC0gQ3JlYXRlSW5wdXRTZWxlY3RMaXN0CQktIENyZWF0ZUlucHV0SGlkZGVuCgkJICAgCgkJICAgVGhlcmUgYXJlIGFsc28gbWV0aG9kcyBmb3IgbWFraW5nIHRhYmJlZCBpbnRlcmZhY2VzOgoJCSAgIC0gU3RhcnRUYWJIZWFkZXJzCQkJLSBTZXRUYWJIZWFkZXIKCQkgICAtIEVuZFRhYkhlYWRlcnMJCQkJLSBTdGFydFRhYkNvbnRlbnQKCQkgICAtIEVuZFRhYkNvbnRlbnQJCQkJLSBTdGFydFRhYgoJCSAgIC0gRW5kVGFiCgkJKi8KICAgICAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2lucHV0X3NpbmdfbG91ZGx5JywKICAgICAgICAJJHRoaXMtPkNyZWF0ZUlucHV0Q2hlY2tib3goJGlkLCAnc2luZ19sb3VkbHknLCAxLAogICAgICAgIAkJJHRoaXMtPkdldFByZWZlcmVuY2UoJ3NpbmdfbG91ZGx5JywgJzEnKSkuJyAnLgogICAgICAgIAkJJHRoaXMtPkxhbmcoJ3RpdGxlX3NpbmdfbG91ZGx5JykpOwoKICAgICAgICAvLyBEaXNwbGF5IHRoZSBwb3B1bGF0ZWQgdGVtcGxhdGUKICAgICAgICBlY2hvICR0aGlzLT5Qcm9jZXNzVGVtcGxhdGUoJ2FkbWlucHJlZnMudHBsJyk7CiAgICB9CgoJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCSAgIFNhdmVBZG1pblByZWZzKCRpZCwgJHBhcmFtcywgJHJldHVybl9pZCwgJG1lc3NhZ2UpCgkgICBOT1QgUEFSVCBPRiBUSEUgTU9EVUxFIEFQSQoKCSAgIFRoaXMgaXMgYW4gZXhhbXBsZSBvZiBhIHNpbXBsZSBtZXRob2QgdG8gc2F2ZSBBZG1pbgoJICAgcHJlZnMgZnJvbSB0aGUgZm9ybSBjcmVhdGVkIGJ5IERpc3BsYXlBZG1pblByZWZzLgoJICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgZnVuY3Rpb24gU2F2ZUFkbWluUHJlZnMoJGlkLCAmJHBhcmFtcywgJHJldHVybmlkKQogICAgewogICAgICAgICR0aGlzLT5TZXRQcmVmZXJlbmNlKCdzaW5nX2xvdWRseScsIGlzc2V0KCRwYXJhbXNbJ3NpbmdfbG91ZGx5J10pPyRwYXJhbXNbJ3NpbmdfbG91ZGx5J106JzAnKTsKCiAgICAgICAgLy8gaWYgeW91IHdhbnRlZCB0byBoYXZlIGEgY29tcHJlaGVuc2l2ZSBhdWRpdCBsb2csIHlvdSBjb3VsZCB3cml0ZSBzb21ldGhpbmcgaGVyZS4KICAgICAgICAKICAgICAgICByZXR1cm4gJHRoaXMtPkRpc3BsYXlBZG1pblByZWZzKCRpZCwgJHBhcmFtcywgJHJldHVybmlkLCAkdGhpcy0+TGFuZygncHJlZnN1cGRhdGVkJykpOwogICAgfQoKCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgkgICBEaXNwbGF5TW9kdWxlT3V0cHV0KCRpZCwgJHBhcmFtcywgJHJldHVybl9pZCwgJG1lc3NhZ2UpCgkgICBOT1QgUEFSVCBPRiBUSEUgTU9EVUxFIEFQSQoKCSAgIFRoaXMgaXMgYW4gZXhhbXBsZSBvZiBhIHNpbXBsZSBtZXRob2QgdG8gZGlzcGxheQoJICAgc29tZXRoaW5nIHdoZXJlIGEgcGFnZSBvciB0ZW1wbGF0ZSBoYXMgYSB0YWcgY2FsbGluZwoJICAgdGhpcyBtb2R1bGUuCgkgICAKCSAgIE5vdGUgdGhhdCBpdCB1c2VzIGEgdGVtcGxhdGUsIGFuZCBpcyB0aHVzIHZlcnkgcG93ZXJmdWwsCgkgICBldmVuIGlmIGl0J3Mgc2ltcGxlLgoJICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgZnVuY3Rpb24gRGlzcGxheU1vZHVsZU91dHB1dCgkaWQsICYkcGFyYW1zLCAkcmV0dXJuaWQpCiAgICB7CgkJaWYgKCR0aGlzLT5HZXRQcmVmZXJlbmNlKCdzaW5nX2xvdWRseScsMSkgPT0gMSkKCQkJewoJCQkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2xvdWRuZXNzJywgJHRoaXMtPkxhbmcoJ2xvdWQnKSk7CgkJCX0KCQllbHNlCgkJCXsKCQkJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdsb3VkbmVzcycsICR0aGlzLT5MYW5nKCdxdWlldCcpKTsKCQkJfQoKICAgICAgICAvLyBEaXNwbGF5IHRoZSBwb3B1bGF0ZWQgdGVtcGxhdGUKICAgICAgICBlY2hvICR0aGlzLT5Qcm9jZXNzVGVtcGxhdGUoJ3BsdWdpbi50cGwnKTsKICAgIH0KCgkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJICAgRGlzcGxheUVycm9yUGFnZSgkaWQsICRwYXJhbXMsICRyZXR1cm5faWQsICRtZXNzYWdlKQoJICAgTk9UIFBBUlQgT0YgVEhFIE1PRFVMRSBBUEkKCgkgICBUaGlzIGlzIGFuIGV4YW1wbGUgb2YgYSBzaW1wbGUgbWV0aG9kIHRvIGRpc3BsYXkKCSAgIGVycm9yIGluZm9ybWF0aW9uIG9uIHRoZSBhZG1pbiBzaWRlLgoJICAgCSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgIGZ1bmN0aW9uIERpc3BsYXlFcnJvclBhZ2UoJGlkLCAmJHBhcmFtcywgJHJldHVybmlkLCAkbWVzc2FnZT0nJykKICAgIHsKCQkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3RpdGxlX2Vycm9yJywgJHRoaXMtPkxhbmcoJ2Vycm9yJykpOwoJCWlmICgkbWVzc2FnZSAhPSAnJykKCQkJewoJCQkkdGhpcy0+c21hcnR5LT5hc3NpZ25fYnlfcmVmKCdtZXNzYWdlJywgJG1lc3NhZ2UpOwoJCQl9CgogICAgICAgIC8vIERpc3BsYXkgdGhlIHBvcHVsYXRlZCB0ZW1wbGF0ZQogICAgICAgIGVjaG8gJHRoaXMtPlByb2Nlc3NUZW1wbGF0ZSgnZXJyb3IudHBsJyk7CiAgICB9CgoJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCSAgIERpc3BsYXlBZG1pblBhbmVsKCRpZCwgJHBhcmFtcywgJHJldHVybl9pZCwgJG1lc3NhZ2UpCgkgICBOT1QgUEFSVCBPRiBUSEUgTU9EVUxFIEFQSQoKCSAgIFRoaXMgaXMgYW4gZXhhbXBsZSBvZiBhIHNpbXBsZSBtZXRob2QgdG8gcHJlc2VudCBhbiBBZG1pbgoJICAgcGFuZWwuCgkgICAKCSAgIEl0IHNldHMgc21hcnR5IHRhZyB2YWx1ZXMsIGFuZCB0aGVuIGNhbGxzIHRoZQoJICAgY29kZSBuZWNlc3NhcnkgdG8gcmVuZGVyIHRoZSB0ZW1wbGF0ZS4gICAKCSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgIGZ1bmN0aW9uIERpc3BsYXlBZG1pblBhbmVsKCRpZCwgJiRwYXJhbXMsICRyZXR1cm5pZCwgJG1lc3NhZ2U9JycpCiAgICB7CiAgICAJLy8gc2ltcGxlIHdheSB0byBoYXZlIGNvbW1vbiBuYXYgYXZhaWxhYmxlIHRvIGFsbCBhZG1pbiBwYWdlcwogICAgCSR0aGlzLT5EaXNwbGF5QWRtaW5OYXYoJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQpOwogICAgCiAgICAJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCd0aXRsZV9zZWN0aW9uJywgJHRoaXMtPkxhbmcoJ3RpdGxlX2FkbWluX3BhbmVsJykpOwogICAgCSR0aGlzLT5zbWFydHktPmFzc2lnbignd2VsY29tZV90ZXh0JywgJHRoaXMtPkxhbmcoJ3dlbGNvbWVfdGV4dCcpKTsKICAgIAogICAgICAgIC8vIERpc3BsYXkgdGhlIHBvcHVsYXRlZCB0ZW1wbGF0ZQogICAgICAgIGVjaG8gJHRoaXMtPlByb2Nlc3NUZW1wbGF0ZSgnYWRtaW5wYW5lbC50cGwnKTsKICAgIH0KCgkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJICAgRGlzcGxheUFkbWluTmF2KCRpZCwgJHBhcmFtcywgJHJldHVybl9pZCwgJG1lc3NhZ2UpCgkgICBOT1QgUEFSVCBPRiBUSEUgTU9EVUxFIEFQSQoKCSAgIFRoaXMgaXMgYW4gZXhhbXBsZSBvZiBhIHNpbXBsZSBtZXRob2QgdG8gcHJlc2VudCBhCgkgICBjb21tb24gYWRtaW4gbWVudS4KCSAgIAkgICAKCSAgIEl0IHNpbXBseSBzZXRzIGEgY29sbGVjdGlvbiBzbWFydHkgdGFnIHZhbHVlcy4gICAKCSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgIGZ1bmN0aW9uIERpc3BsYXlBZG1pbk5hdigkaWQsICYkcGFyYW1zLCAkcmV0dXJuaWQpCiAgICAgICAgewoJCSR0aGlzLT5zbWFydHktPmFzc2lnbignYWRtaW5fbmF2JywKCQkJJHRoaXMtPkNyZWF0ZUxpbmsoJGlkLCAnZGVmYXVsdGFkbWluJywgJHJldHVybmlkLCAkdGhpcy0+TGFuZygndGl0bGVfbW9kX2FkbWluJyksIGFycmF5KCkpIC4KCQkJJyA6ICcgLgoJCQkkdGhpcy0+Q3JlYXRlTGluaygkaWQsICdhZG1pbl9wcmVmcycsICRyZXR1cm5pZCwgJHRoaXMtPkxhbmcoJ3RpdGxlX21vZF9wcmVmcycpLCBhcnJheSgpKSk7CiAgICAgICAgfQoKCn0KCj8+Cg==]]></data>
  </file>
  <file>
    <filename>/templates/</filename>
    <isdir>1</isdir>
  </file>
  <file>
    <filename>/templates/adminpanel.tpl</filename>
    <isdir>0</isdir>
    <data><![CDATA[PGgzPnskdGl0bGVfc2VjdGlvbn08L2gzPgo8cD57JGFkbWluX25hdn08L3A+Cnskd2VsY29tZV90ZXh0fQ==]]></data>
  </file>
  <file>
    <filename>/templates/adminprefs.tpl</filename>
    <isdir>0</isdir>
    <data><![CDATA[PGgzPnskdGl0bGVfc2VjdGlvbn08L2gzPgo8cD57JGFkbWluX25hdn08L3A+CntpZiAkbWVzc2FnZSE9Jyd9PHA+eyRtZXNzYWdlfTwvcD57L2lmfQp7JHN0YXJ0Zm9ybX0KCTxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CgkJPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JHRpdGxlX3NpbmdfbG91ZGx5fTo8L3A+CgkJPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRpbnB1dF9zaW5nX2xvdWRseX08L3A+Cgk8L2Rpdj4KCTxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CgkJPHAgY2xhc3M9InBhZ2V0ZXh0Ij4mbmJzcDs8L3A+CgkJPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRzdWJtaXR9PC9wPgoJPC9kaXY+CnskZW5kZm9ybX0K]]></data>
  </file>
  <file>
    <filename>/templates/error.tpl</filename>
    <isdir>0</isdir>
    <data><![CDATA[PGgzPnskdGl0bGVfZXJyb3J9PC9oMz4KPHA+eyRhZG1pbl9uYXZ9PC9wPgp7aWYgJG1lc3NhZ2UhPScnfTxwPnskbWVzc2FnZX08L3A+ey9pZn0=]]></data>
  </file>
  <file>
    <filename>/templates/plugin.tpl</filename>
    <isdir>0</isdir>
    <data><![CDATA[PGgzPnskbG91ZG5lc3N9PC9oMz4=]]></data>
  </file>
</module>
