<?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>NeoModule</name>
	<version>0.2.4</version>
  <mincmsversion>1.6</mincmsversion>
	<help><![CDATA[PHN0cm9uZz5Ob3RpY2UhIFRoaXMgaXMgYSBtb2R1bGUtZGV2ZWxvcGVyLW9ubHkgbW9kdWxlLiBJZiB5b3UgYXJlIG5vdCBhIGRldmVsb3Blcgp5b3UnbGwgcHJvYmFibHkganVzdCB3YW50IHRvIHNraXAgdGhlIGdvcnkgZGV0YWlscyBvZiB0aGlzIHBhZ2UgYW5kIHJlbHkgb24gdGhhdAp0aGUgbW9kdWxlIGp1c3QgZG9lcyBpdCdzIHdvcmsuPC9zdHJvbmc+CjxoMz5QdXJwb3NlIG9mIHRoZSBtb2R1bGU8L2gzPgpUaGUgcHVycG9zZSBvZiB0aGlzIG1vZHVsZSBpcyB0byBjdXQgb2ZmIG9uIGRldmVsb3BtZW50dGltZSBwcm92aWRpbmcgc29tZQplYXN5IHRvIHVzZSBmdW5jdGlvbnMgZXh0ZW5kaW5nIHRoZSBtb2R1bGUtQVBJIG9mIENNUyBNYWRlIFNpbXBsZS4gVGhpcyBpbmNsdWRlcywKYnV0IGlzIG5vIGxpbWl0ZWQgdG8sIHNob3J0Y3V0cyB0byBOZW9EYXRhU3RvcmFnZS1mdW5jaW9uYWxpdHksIGEgY291cGxlIG9mIG5pY2UKU21hcnR5LXNob3J0Y3V0cywgRmlyZVBIUC1pbnRlZ3JhdGlvbiBldGMuCjxoMz5Vc2FnZSBvZiB0aGUgbW9kdWxlPC9oMz4KVG8gdXNlIHRoaXMgZXh0ZW5kZWQgbW9kdWxlLWNsYXNzIHlvdSBzaG91bGQgaW5oZXJpdCBmcm9tIE5lb01vZHVsZS1jbGFzcyBpbnN0ZWFkCm9mIHRoZSB1c3VhbCBDTVNNb2R1bGUtY2xhc3MuIFRoaXMgY2FuIGJlIGRvbmUgbGlrZSB0aGlzOgo8cHJlPgpyZXF1aXJlX29uY2UoZGlybmFtZShkaXJuYW1lKF9fRklMRV9fKSkuIi9OZW9Nb2R1bGUvTmVvTW9kdWxlLm1vZHVsZS5waHAiKTsKY2xhc3MgTXlNb2R1bGUgZXh0ZW5kcyBOZW9Nb2R1bGUgewo8L3ByZT4KSWYgeW91IHdpc2ggdG8gdXNlIHRoZSBOZXdEYXRhU3RvcmFnZSBmdW5jdGlvbmFsaXR5LCB5b3Ugc2hvdWxkIG9mIGNvdXJzZSBhbHNvCmluc3RhbGwgdGhhdCBtb2R1bGUuCjxoMz5Ib3cgdG8gZ2V0IGhlbHA8L2gzPgpJIHdpbGwgcmVwZWF0LCB0aGlzIG1vZHVsZSBpcyBmb3IgZGV2ZWxvcGVycyBvbmx5LiBJZiB5b3UgY2Fubm90IHJlYWQgcGhwLXNvdXJjZSBjb2RlLAp5b3Ugc2hvdWxkIHVzZSBpdCBmb3IgZGV2ZWxvcG1lbnQgYW55d2F5LiBJZiB5b3UgY2FuLCBhbHdheXMgY2hlY2sgb3V0IHRoZSBjb2RlIApmb3IgaGludHMgb24gaG93IHRvIG1ha2UgaXQgd29yay4gSWYgeW91IHN0aWxsIGhhdmUgcXVlc3Rpb25zIG9yIHN1Z2dlc3Rpb25zIGZvcgpmaXhlcy9pbXByb3ZlbWVudHMsIHBsZWFzZSBmZWVsIGZyZWUgdG8gY2F0Y2ggbWUgKFNpbG1hcmlsbGlvbikgaW4gdGhlIGZvcnVtIG9nICNpcmMuCgo8aDM+TGlzdCBvZiBtZXRob2RzPC9oMz4KSSB3aWxsIHRyeSB0byBrZWVwIHRoaXMgbGlzdCB1cHRvZGF0ZSwgYnV0IGZvciBtb3N0IHJlY2VudCBsaXN0LCBwbGVhc2UKY2hlY2sgdGhlIE5lb01vZHVsZS5tb2R1bGUucGhwLWZpbGUgaXRzZWxmLiBTb21lIGRvY3VtZW50YXRpb24gb2YgdGhlIG1ldGhvZHMKbWF5IGV2ZW4gc25lYWsgaW4gdGhlcmUgc29tIGRheS4KPHByZT4KLyoKICoKICogU2V0dXAgZnVuY3Rpb25zCiAqCiAqLwoKZnVuY3Rpb24gU2V0SWQoJGlkKQpmdW5jdGlvbiBOZW9TZXRJZCgkaWQpCgoKICAvKgogICAqCiAgICogR2VuZXJhbCBzaG9ydGN1dCBmdW5jdGlvbnMKICAgKgogICAqLwpmdW5jdGlvbiBQcmVmKCRwcmVmbmFtZSwkZGVmYXVsdD0iIikKZnVuY3Rpb24gTmVvQ21zTGluaygkcGFyYW1zPWFycmF5KCkpCmZ1bmN0aW9uIE5lb0Ntc1VybCgkcGFyYW1zPWFycmF5KCkpCmZ1bmN0aW9uIE5lb1JlZGlyZWN0KCRwYXJhbXM9YXJyYXkoKSkKLyoKICoKICogRm9ybS1nZW5lcmF0aW9uIGZ1bmN0aW9ucwogKgogKi8KCmZ1bmN0aW9uIE5lb0Zvcm1TdGFydCgkcGFyYW1zPWFycmF5KCkpCmZ1bmN0aW9uIE5lb0Zvcm1FbmQoJHBhcmFtcz1hcnJheSgpKQpmdW5jdGlvbiBOZW9JbnB1dFRleHQoJHBhcmFtcz1hcnJheSgpCmZ1bmN0aW9uIE5lb1RleHRhcmVhKCRwYXJhbXM9YXJyYXkoKSkKZnVuY3Rpb24gTmVvSW5wdXRDaGVja2JveCgkcGFyYW1zPWFycmF5KCkpCmZ1bmN0aW9uIE5lb0lucHV0U3VibWl0KCRwYXJhbXM9YXJyYXkoKSkKZnVuY3Rpb24gTmVvSW5wdXRSZXNldCgkcGFyYW1zPWFycmF5KCkpCmZ1bmN0aW9uIE5lb0lucHV0SW5wdXREcm9wZG93bigkcGFyYW1zPWFycmF5KCkpCgovKiBmdW5jdGlvbiBiZWxvdyBpbmNsdWRlIHNtYXJ0eWFzc2lnbm1lbnQsIGRvZXMgbm90IHJldHVybiBhbnl0aGluZyAqLwpmdW5jdGlvbiBTbWFydHlGb3JtU3RhcnQoJHNtYXJ0eW5hbWUsJHBhcmFtcz1hcnJheSgpKQpmdW5jdGlvbiBTbWFydHlVcGxvYWRGb3JtU3RhcnQoJHNtYXJ0eW5hbWUsJHBhcmFtcz1hcnJheSgpKQpmdW5jdGlvbiBTbWFydHlGb3JtRW5kKCRzbWFydHluYW1lKQpmdW5jdGlvbiBTbWFydHlJbnB1dFN1Ym1pdCgkc21hcnR5bmFtZSwkbmFtZSwkdGV4dCwkY29uZmlybXRleHQ9IiIpCmZ1bmN0aW9uIFNtYXJ0eUlucHV0SGlkZGVuKCRzbWFydHluYW1lLCRuYW1lLCR2YWx1ZSkKZnVuY3Rpb24gU21hcnR5SW5wdXRNdWx0aUhpZGRlbigkc21hcnR5bmFtZSwkZmllbGRzPWFycmF5KCkpCgovKgogKgogKiBOZW9EYXRhU3RvcmFnZSBzaG9ydGN1dHMKICoKICovCmZ1bmN0aW9uIEFkZEVudGl0eSgkdGFibGUsICRwcm9wcz1hcnJheSgpKQpmdW5jdGlvbiBEZWxldGVFbnRpdHkoJGlkKQpmdW5jdGlvbiBHZXRFbnRpdHkoJGlkLCAkb3ZlcnJpZGVwcm9wcz1hcnJheSgpKQpmdW5jdGlvbiBHZXRFbnRpdGllcygkdGFibGU9IiIsICRjcml0ZXJpYT1hcnJheSgpLCAkYWx3YXlzcmV0dXJuYXJyYXk9ZmFsc2UpCmZ1bmN0aW9uIEdldE9uZUVudGl0eSgkdGFibGUsICRjcml0ZXJpYT1hcnJheSgpLCAkZmFpbGlmbXVsdGlwbGU9ZmFsc2UpCmZ1bmN0aW9uIEdldEVudGl0aWVzRnVsbCgkdGFibGU9IiIsICRjcml0ZXJpYT1hcnJheSgpLCAkYWx3YXlzcmV0dXJuYXJyYXk9ZmFsc2UpCmZ1bmN0aW9uIFNldEVudGl0eVByb3AoJGlkLCRwcm9wbmFtZSwkcHJvcHZhbHVlLCRwcm9wdHlwZT0idW5kZWZpbmVkIikKZnVuY3Rpb24gQ2xlYXJFbnRpdHlQcm9wKCRpZCwgJHByb3BuYW1lKQpmdW5jdGlvbiBTZXRFbnRpdHlQcm9wcygkaWQsICRwcm9wcywgJGNsZWFyPXRydWUpCmZ1bmN0aW9uIFNldEVudGl0eVByb3BzRnJvbUFycmF5KCRpZCwgJHByb3BzLCAkdmFsdWVzLCAkY2xlYXI9dHJ1ZSwgJGZpbGw9ZmFsc2UpCmZ1bmN0aW9uIFNldEVudGl0eVByb3BzT25Dcml0ZXJpYSgkdGFibGUsICRwcm9wcywgJGNyaXRlcmlhLCAkY3JlYXRlPXRydWUsICRjbGVhcj1mYWxzZSkgLy9Eb2VzIG5vdCB3b3JrCmZ1bmN0aW9uIFJlc2V0RW50aXR5UHJvcHMoJGlkLCAkbmV3cHJvcHM9YXJyYXkoKSkKZnVuY3Rpb24gUmVtb3ZlTW9kdWxlRW50aXRpZXMoKQpmdW5jdGlvbiBDbGVhckVudGl0eVByb3BzKCRpZCkKZnVuY3Rpb24gQ29tcGFyZUVudGl0aWVzKCRlbnRpdHkxLCAkZW50aXR5MiwgJHNvcnRmaWVsZCkKZnVuY3Rpb24gQ29tcGFyZUVudGl0aWVzQ29tcGxleCgkZW50aXR5MSwgJGVudGl0eTIsICRzb3J0ZmllbGRzKQpmdW5jdGlvbiBTb3J0RW50aXRpZXMoJGxpc3QsICRzb3J0ZmllbGRzKQpmdW5jdGlvbiBFbnRpdGllc0NvdW50KCR0YWJsZT0iIiwgJGNyaXRlcmlhPWFycmF5KCkpCmZ1bmN0aW9uIENsZWFyTW9kdWxlRW50aXRpZXMoKQpmdW5jdGlvbiBTZXRFbnRpdHlDb25uZWN0aW9uKCRpZDEsICRpZDIsICR0eXBlPSIiKQpmdW5jdGlvbiBDbGVhckVudGl0eUNvbm5lY3Rpb25zKCRpZDEsICRpZDI9LTEsICR0eXBlPSIiKQpmdW5jdGlvbiBDbGVhckVudGl0eUNvbm5lY3Rpb24oJGlkMSwgJGlkMiwgJHR5cGU9IiIpCmZ1bmN0aW9uIENoZWNrRW50aXR5Q29ubmVjdGlvbigkaWQxLCRpZDIsJHR5cGU9IiIsJHJldHVybnZhbHVlPXRydWUpCmZ1bmN0aW9uIEdldEVudGl0eUNvbm5lY3Rpb25zKCRpZDEsICRpZDI9LTEsICR0eXBlPSIiKQpmdW5jdGlvbiBBZGRGaWVsZFNldCgkbmFtZSwkZmllbGRzKQpmdW5jdGlvbiBHZXRGaWVsZFNldCgkbmFtZSkKZnVuY3Rpb24gRW50aXR5U2V0VW5zZXRQcm9wcygkZW50aXR5LCRmaWVsZHNldCwkZmlsbHZhbHVlPSIiKSB7CmZ1bmN0aW9uIEdldERTRXJyb3JzKCRubDJicj10cnVlLCRjbGVhcj10cnVlKQpmdW5jdGlvbiBPdXRwdXREU0Vycm9ycygkY2xlYXI9dHJ1ZSkKZnVuY3Rpb24gRFNJbkVycm9yKCkKZnVuY3Rpb24gTWFrZVNpbXBsZUFycmF5KCR0YWJsZSwkZmllbGQpCmZ1bmN0aW9uIE1ha2VBc3NvY0FycmF5KCR0YWJsZSwkZmllbGRzKQoKCi8qCiAqCiAqIExpbmsgYW5kIGljb24gZnVuY3Rpb25zCiAqCiAqLwoKZnVuY3Rpb24gTmVvRGVsZXRlSWNvbigkYWN0aW9uLCR0ZXh0LCRwYXJhbXM9YXJyYXkoKSwkY29uZmlybWF0aW9uPSIiKQpmdW5jdGlvbiBOZW9Db3B5SWNvbigkYWN0aW9uLCR0ZXh0LCRwYXJhbXM9YXJyYXkoKSwkY29uZmlybWF0aW9uPSIiKQpmdW5jdGlvbiBOZW9FZGl0SWNvbigkYWN0aW9uLCR0ZXh0LCRwYXJhbXM9YXJyYXkoKSwkY29uZmlybWF0aW9uPSIiKQpmdW5jdGlvbiBOZW9BZGRJY29uKCRhY3Rpb24sJHRleHQsJHBhcmFtcz1hcnJheSgpLCRjb25maXJtYXRpb249IiIpCmZ1bmN0aW9uIE5lb1RydWVJY29uKCRhY3Rpb24sJHRleHQsJHBhcmFtcz1hcnJheSgpLCRjb25maXJtYXRpb249IiIpCmZ1bmN0aW9uIE5lb0ZhbHNlSWNvbigkYWN0aW9uLCR0ZXh0LCRwYXJhbXM9YXJyYXkoKSwkY29uZmlybWF0aW9uPSIiKQpmdW5jdGlvbiBOZW9TeXN0ZW1JY29uKCRpY29uLCR0ZXh0PSIiKQoKLyoKICoKICogVXRpbGl0eSBmdW5jdGlvbnMKICoKICovCmZ1bmN0aW9uIE5lb1NsYXNoZXMoJHVybCkKZnVuY3Rpb24gU2xhc2goJHN0ciwkc3RyMj0iIiwkc3RyMz0iIikKZnVuY3Rpb24gU2xhc2hlcygkdXJsKQpmdW5jdGlvbiBpc19hc3NvYygkYXJyYXkpCmZ1bmN0aW9uIE5lb0Rpckxpc3QoJHJvb3QsJHdoYXQ9ImZpbGVzIiwkaW50cm9kdWN0aW9uPWFycmF5KCksJGV4Y2x1ZGVzPWFycmF5KCkpCgovKkNoZWNrcyBmb3IgdGhlIGV4aXN0ZW5jZSBvZiBhbiBpbmRleCBpbiBhbiBhcnJheSBhbmQgcmV0dXJuIHRoZSB2YWx1ZSBpZiBpdCdzIHRoZXJlCiAqYW5kIHRoZSBkZWZhdWx0IHZhbHVlIGlmIGl0J3Mgbm90CiovCmZ1bmN0aW9uIE5lb1BhcmFtVmFsdWUoJG5hbWUsJHBhcmFtcywkZGVmYXVsdD0iIikKCi8vU2hvcnRjdXQgZm9yIHRoZSBhYm92ZQpmdW5jdGlvbiBOUFYoJG5hbWUsICRwYXJhbXMpCmZ1bmN0aW9uIE5lb0FwcGx5UGFyYW1WYWx1ZXMoJHRoaXNhcnJheSwgJHBhcmFtcywgJGluZGV4ZXMsICRhbHdheXNmaWxsPWZhbHNlKQpmdW5jdGlvbiBDaGVja0ZpbGVFeHRlbnNpb24oJGZpbGVuYW1lLCAkYWxsb3dlZGV4dGVuc2lvbnM9YXJyYXkoKSkKCi8vRm9yIG5vdywgcmVhZCBzb3VyY2UgdG8gdW5kZXJzdGFuZApmdW5jdGlvbiBOZW9Ub29sVGlwKCRwYXJhbXM9YXJyYXkoKSkgLy9yZXF1aXJlcyAyIGNzcy1jbGFzc2VzIHRvIGJlIHNldCB1cAoKLy9DaGVja3MgYm90aCB3aGV0aGVyIHRoZSBpbmRleCBleGlzdHMgaW4gdGhlIGFycmF5IGFuZCB3aGV0aGVyIGl0IGhhcyBhIHZhbHVlIGRpZmZlcmVudCBmb21yIG5vdGhpbmcgb3Qgb25seSBzcGFjZXMKZnVuY3Rpb24gTmVvRW1wdHkoJGluZGV4PSIiLCRkYXRhPWFycmF5KCkpCgovL1ZhbGlkYXRlcyBhbiBlbWFpbGFkcmVzcwpmdW5jdGlvbiBOZW9WYWxpZGF0ZUVtYWlsKCRlbWFpbCkKCi8vUmV0dXJucyBhIHZlcnNpb24gb2YgdGhlIHN0cmluZyB3aGljaCBjYW5ub3QgKHBlcmhhcHMpIGJlIGxpbmUtYnJva2VuCmZ1bmN0aW9uIE5lb05vQnJlYWtzKCRzdHJpbmcpCgovL3NhbWUgYXMgcHJpbnRfciwgYnV0IHdyYXBzIGluIDxwcmU+J3MgYW5kIGluIGEgZGl2IHRyeWluZyB0byBtYWtlIGl0IG1vcmUgcmVhZGFibGUKZnVuY3Rpb24gTmVvUHJpbnRSKCRkYXRhPWFycmF5KCksJHNlbmRvdXQ9dHJ1ZSkKCi8qCiAqCiAqIFNtYXJ0eSBzaG9ydGN1dHMKICoKICovCmZ1bmN0aW9uIFNtYXJ0eUFzc2lnbigkc21hcnR5aW5mbywgJHNtYXJ0eWNvbnRlbnQ9IiIpCmZ1bmN0aW9uIFNtYXJ0eUFzc2lnblByZWYoJHNtYXJ0eW5hbWUsICRwcmVmZXJlbmNlbmFtZT0iIikgewpmdW5jdGlvbiBTbWFydHlBc3NpZ25DTVMoJG1vZHVsZSwkdmFybmFtZT0iY21zIikKZnVuY3Rpb24gU21hcnR5VXBsb2FkRm9ybVN0YXJ0KCRzbWFydHluYW1lLCRwYXJhbXM9YXJyYXkoKSkgewoKLyoKICoKICogRGVidWdnaW5nIGZ1bmN0aW9ucwogKgogKi8KZnVuY3Rpb24gRmlyZURlYnVnKCRjb21tYW5kLCRtZXNzYWdlPSIiLCR2YXJpYWJsZXM9YXJyYXkoKSkKCi8qCiAqCiAqIEVycm9yIGhhbmRsaW5nCiAqCiAqLwpmdW5jdGlvbiBFcnJvcigkZXJyb3J0ZXh0LCRyZXR1cm52YWx1ZT1mYWxzZSwkcGFyYW1zPWFycmF5KCkpCmZ1bmN0aW9uIEdldEVycm9ycygkbmwyYnI9dHJ1ZSwkY2xlYXI9dHJ1ZSwkaW5jbHVkZWRzPXRydWUpCmZ1bmN0aW9uIE91dHB1dEVycm9ycygkY2xlYXI9dHJ1ZSwkaW5jbHVkZWRzPXRydWUpCmZ1bmN0aW9uIEluRXJyb3IoKQo8L3ByZT48aDM+UGFyYW1ldHJlPC9oMz48dWw+PGxpPjxlbT4ob3B0aW9uYWwpPC9lbT4gbGFuZz0iZW5fVVMiIC0gUGFyYW1ldHJldCBhbmdpdmVyIGh2aWxrZXQgc3Byb2cgZGVyIHNrYWwgYnJ1Z2VzIHRpbCB2aXNuaW5nIGZvciBiZXMmb3NsYXNoO2dlbmRlLiBJa2tlIGFsbGUgbW9kdWxlciB1bmRlcnN0Jm9zbGFzaDt0dGVyIGVsbGVyIGJlaCZvc2xhc2g7dmVyIGRldHRlLjwvbGk+PC91bD4=]]></help>
	<about><![CDATA[PGJyIC8+TGF2ZXQgYWY6IE1vcnRlbiBQb3Vsc2VuICZsdDttb3J0ZW5AcG91bHNlbi5vcmcmZ3Q7PGJyIC8+PGJyIC8+VmVyc2lvbjogMC4yLjQ8YnIgLz48YnIgLz5IaXN0b3JpayBvdmVyICZhZWxpZztuZHJpbmdlcjo8YnIgLz48dWw+CjxsaT52ZXJzaW9uIDAuMi40PGJyLz4KQWRkZWQgTmVvRW1wdHktZnVuY3Rpb24gd2hpY2ggY2hlY2tzIGZvciBhbiBpbmRleCBpbiBhbiBhcnJheQo8YnIvPgpNYWRlIE5lb1ByaW50UiBvdXRwdXQgY29udGVudCBvZiAkX3BhcmFtcyBpZiBubyBwYXJhbWV0ZXIgd2FzIGdpdmVuCjxici8+QWRkZWQgTmVvVmFsaWRhdGVFbWFpbC1mdW5jdGlvbgo8YnIvPkFkZGVkIE5lb05vQnJlYWtzLWZ1bmN0aW9uCgo8bGk+dmVyc2lvbiAwLjIuMzxici8+Ck5vdyBwb3NzaWJsZSB0byByZWdpc3RlciAkcGFyYW1zIGZvciBldmVuIGVhc2llciBzeW50YXggaW4gcmVsZXZhbnQgZnVuY3Rpb25zIGxpa2UgTlBWCjxici8+CkFkZGVkIENyZWF0ZUlucHV0UGFzc3dvcmQtd3JhcHBlcgo8YnIvPgpBZGRlZCBmaWxsIHBhcmFtZXRlciB0byBTZXRFbnRpdHlQcm9wc0Zyb21BcnJheQoKCjxsaT52ZXJzaW9uIDAuMi4yPGJyLz4KQWRkZWQgYSBjdXN0b20gcmV0dXJudmFsdWUgdG8gY2hlY2tlbnRpdHljb25uZWN0aW9ucwo8YnIvPgpJbXBsZW1lbnRlZCBNYWtlU2ltcGxlQXJyYXkKPGJyLz4KQWRkZWQgTmVvVHJ1ZUljb24gYW5kICBOZW9UcnVlSWNvbiAKCjxsaT52ZXJzaW9uIDAuMi4xPGJyLz4KYWRkZWQgYXJyYXlfZGlmZl9rZXkgaW1wbGVtZW50YXRpb24gZm9yIHByZS01LjEuMCB2ZXJzaW9uCjxici8+CkFkZGVkICRhbHdheXNyZXR1cm5hcnJheT1mYWxzZSB0byBHZXRFbnRpdGllcyhGdWxsKS1tZXRob2RzCjxici8+CkFkZGVkIFNtYXJ0QXNzaWduUHJlZi1tZXRob2QKPGJyLz4KQWRkZWQgVG9vbHRpcC1TdXBwb3J0Cjxici8+CkFkZGVkIE5lb1JlZGlyZWN0LWZ1bmN0aW9uCgogIDxsaT52ZXJzaW9uIDAuMi4wPGJyLz4KLSBnZW5lcmFsIGJ1Z2ZpeGluZzxici8+Ci0gQWRkZWQgYSBOZW9EaXJMaXN0LWZ1bmN0aW9uPGJyLz4KLSBGaXhlZCBuYW1lIGVycm9yIG9uIE5lb0lucHV0RHJvcGRvd248YnIvPgotIGFkZGVkIHN1cHBvcnQgZm9yIDNyZCBwYXJhbWV0ZXIgdG8gU2xhc2gtZnVuY3Rpb248YnIvPgotIGFkZGVkIE5lb0Ntc0xpbmsgYW5kIE5lb0Ntc1VybCBzaG9ydGN1dHM8YnIvPgotIGFkZGVkIFNtYXJ0eVVwbG9hZEZvcm1TdGFydDxici8+Ci0gYWRkZWQgU21hcnR5SW5wdXRNdWx0aUhpZGRlbjxici8+CgogIDwvbGk+CiAgPGxpPnZlcnNpb24gMC4xLjA8YnIvPgogICAtIGluaXRpYWwgcmVsZWFzZTwvbGk+CjwvdWw+PGJyIC8+]]></about>
	<description><![CDATA[An extended module-class, mainly for the Neo-series modules, but also for others to use]]></description>
	<file>
	  <filename>/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/NeoModule.module.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKIyBOZW9Nb2R1bGUuIEFuIGV4dGVuZGVkIG1vZHVsZWNsYXNzIGZvciBDTVMgLSBDTVMgTWFkZSBTaW1wbGUKIyBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgTW9ydGVuIFBvdWxzZW4gPG1vcnRlbkBwb3Vsc2VuLm9yZz4KIwojQ01TIC0gQ01TIE1hZGUgU2ltcGxlCiMoYykyMDA0LTA5IGJ5IFRlZCBLdWxwICh3aXNoeUB1c2Vycy5zZi5uZXQpCiNUaGlzIHByb2plY3QncyBob21lcGFnZSBpczogaHR0cDovL2Ntc21hZGVzaW1wbGUuc2YubmV0CiMKI1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiNpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQojdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKIyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMKI1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKI01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKI0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiNZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKI0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKIwoKCmlmICghZnVuY3Rpb25fZXhpc3RzKCJzdHJpcG9zIikpIHsKCWZ1bmN0aW9uIHN0cmlwb3MoJHN0ciwkbmVlZGxlKSB7CgkJcmV0dXJuIHN0cnBvcyhzdHJ0b2xvd2VyKCRzdHIpLHN0cnRvbG93ZXIoJG5lZWRsZSkpOwoJfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCJhcnJheV9kaWZmX2tleSIpKSB7CiAgICBmdW5jdGlvbiBhcnJheV9kaWZmX2tleSgpCiAgICB7CiAgICAgICAgJGFycnMgPSBmdW5jX2dldF9hcmdzKCk7CiAgICAgICAgJHJlc3VsdCA9IGFycmF5X3NoaWZ0KCRhcnJzKTsKICAgICAgICBmb3JlYWNoICgkYXJycyBhcyAkYXJyYXkpIHsKICAgICAgICAgICAgZm9yZWFjaCAoJHJlc3VsdCBhcyAka2V5ID0+ICR2KSB7CiAgICAgICAgICAgICAgICBpZiAoYXJyYXlfa2V5X2V4aXN0cygka2V5LCAkYXJyYXkpKSB7CiAgICAgICAgICAgICAgICAgICAgdW5zZXQoJHJlc3VsdFska2V5XSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuICRyZXN1bHQ7CiAgIH0KfQoKaWYgKCFmdW5jdGlvbl9leGlzdHMoImlzX2Fzc29jIikpIHsKICBmdW5jdGlvbiBpc19hc3NvYygkYXJyYXkpIHsKICAgIHJldHVybiAoaXNfYXJyYXkoJGFycmF5KSAmJiAwICE9PSBjb3VudChhcnJheV9kaWZmX2tleSgkYXJyYXksIGFycmF5X2tleXMoYXJyYXlfa2V5cygkYXJyYXkpKSkpKTsKICB9Cn0KCmNsYXNzIE5lb01vZHVsZSBleHRlbmRzIENNU01vZHVsZSB7CiAgLyoKICAgKgogICAqIEEgY291cGxlIG9mIHZhcmlhYmxlcyBhbmQgbWV0aG9kcyBmb3IgaW50ZXJuYWwgbW9kdWxlIHVzYWdlCiAgICoKICAgKi8KICB2YXIgJF9kYXRhc3RvcmFnZT1mYWxzZTsKICB2YXIgJF9pZD1mYWxzZTsKICB2YXIgJF9yZXR1cm5pZD1mYWxzZTsKICB2YXIgJF9lcnJvcnM9IiI7CiAgdmFyICRfdGhlbWVvYmplY3Q9ZmFsc2U7CiAgdmFyICRfcGFyYW1zPWFycmF5KCk7CiAgZnVuY3Rpb24gX2dldGRzKCkgewogICAgaWYgKCR0aGlzLT5fZGF0YXN0b3JhZ2UhPT1mYWxzZSkgcmV0dXJuICR0aGlzLT5fZGF0YXN0b3JhZ2U7CiAgICAkdGhpcy0+X2RhdGFzdG9yYWdlPSR0aGlzLT5HZXRNb2R1bGVJbnN0YW5jZSgiTmVvRGF0YVN0b3JhZ2UiKTsKICAgIHJldHVybiAkdGhpcy0+X2RhdGFzdG9yYWdlOwogIH0KICBmdW5jdGlvbiBfZ2V0dGhlbWVvYmooKSB7CiAgICBnbG9iYWwgJGdDbXM7CiAgICBpZiAoJHRoaXMtPl90aGVtZW9iamVjdCE9PWZhbHNlKSByZXR1cm4gJHRoaXMtPl90aGVtZW9iamVjdDsKICAgICR0aGlzLT5fdGhlbWVvYmplY3Q9JHRoZW1lT2JqZWN0ID0gJGdDbXMtPnZhcmlhYmxlc1snYWRtaW50aGVtZSddOwogICAgcmV0dXJuICR0aGlzLT5fdGhlbWVvYmplY3Q7CiAgfQoKICAvKgogICAqCiAgICogU3RhbmRhcmQgbW9kdWxlLUFQSS1tZXRob2RzIGJlaGF2aW5nIGluIGEgc3RhbmRhcmQgd2F5CiAgICoKICAgKi8KCglmdW5jdGlvbiBHZXROYW1lKCkgewoJCXJldHVybiAnTmVvTW9kdWxlJzsKCX0KCiAgZnVuY3Rpb24gR2V0VmVyc2lvbigpIHsKICAgIHJldHVybiAiMC4yLjQiOwogIH0KCiAgZnVuY3Rpb24gR2V0RnJpZW5kbHlOYW1lKCkgewoJCXJldHVybiAiTmVvIE1vZHVsZSBiYXNlLWNsYXNzIjsKCX0KCglmdW5jdGlvbiBJc1BsdWdpbk1vZHVsZSgpIHsKCQlyZXR1cm4gZmFsc2U7Cgl9CgoJZnVuY3Rpb24gTWluaW11bUNNU1ZlcnNpb24oKSB7CgkJcmV0dXJuICcxLjYnOwoJfQoKCWZ1bmN0aW9uIEdldEFkbWluRGVzY3JpcHRpb24oKSB7CgkJcmV0dXJuICJBbiBleHRlbmRlZCBtb2R1bGUtY2xhc3MsIG1haW5seSBmb3IgdGhlIE5lby1zZXJpZXMgbW9kdWxlcywgYnV0IGFsc28gZm9yIG90aGVycyB0byB1c2UiOwoJfQoKCWZ1bmN0aW9uIEhhc0FkbWluKCkgewoJCXJldHVybiBmYWxzZTsKCX0KCglmdW5jdGlvbiBHZXRBdXRob3IoKSB7CgkJcmV0dXJuICdNb3J0ZW4gUG91bHNlbic7Cgl9CgoJZnVuY3Rpb24gR2V0QXV0aG9yRW1haWwoKQl7CgkJcmV0dXJuICdtb3J0ZW5AcG91bHNlbi5vcmcnOwoJfQoKICBmdW5jdGlvbiBHZXRIZWxwKCRsYW5nPSdlbl9VUycpIHsKICAgIHJldHVybiAkdGhpcy0+UHJvY2Vzc1RlbXBsYXRlKCdoZWxwLnRwbCcpOwogCX0KCiAgZnVuY3Rpb24gR2V0Q2hhbmdlTG9nKCkJewoJCXJldHVybiAkdGhpcy0+UHJvY2Vzc1RlbXBsYXRlKCJjaGFuZ2Vsb2cudHBsIik7Cgl9CgogIC8qCiAgICoKICAgKiBTZXR1cCBmdW5jdGlvbnMKICAgKgogICAqLyAgCiAgZnVuY3Rpb24gTmVvU2V0SWQoJGlkKSB7CiAgICAkdGhpcy0+X2lkPSRpZDsKICB9ICAKICBmdW5jdGlvbiBOZW9TZXRSZXR1cm5JZCgkcmV0dXJuaWQpIHsKICAgICR0aGlzLT5fcmV0dXJuaWQ9JHJldHVybmlkOwogIH0KICBmdW5jdGlvbiBOZW9TZXRQYXJhbXMoJHBhcmFtcz1hcnJheSgpKSB7CiAgICAkdGhpcy0+X3BhcmFtcz0kcGFyYW1zOwogIH0KICBmdW5jdGlvbiBOZW9TZXR1cCgkaWQsJG1vZHVsZSwkcmV0dXJuaWQ9IjAiLCRwYXJhbXM9YXJyYXkoKSkgewogICAgJHRoaXMtPk5lb1NldElkKCRpZCk7CiAgICAkdGhpcy0+TmVvU2V0UmV0dXJuSWQoJHJldHVybmlkKTsKICAgICR0aGlzLT5OZW9TZXRQYXJhbXMoJHBhcmFtcyk7CiAgICAkdGhpcy0+U21hcnR5QXNzaWduQ01TKCRtb2R1bGUpOwogICAgJHRoaXMtPlNtYXJ0eUFzc2lnbigibW9kdWxlX2lkIiwkaWQpOwogIH0KCgogIC8qCiAgICoKICAgKiBHZW5lcmFsIHNob3J0Y3V0IGZ1bmN0aW9ucwogICAqCiAgICovCiAgZnVuY3Rpb24gUHJlZigkcHJlZm5hbWUsJGRlZmF1bHQ9IiIpIHsKICAgIHJldHVybiAkdGhpcy0+R2V0UHJlZmVyZW5jZSgkcHJlZm5hbWUsJGRlZmF1bHQpOwogIH0KCiAgZnVuY3Rpb24gTmVvQ21zTGluaygkcGFyYW1zPWFycmF5KCkpIHsKICAgIC8vQ3JlYXRlTGluaygkaWQsICRhY3Rpb24sICRyZXR1cm5pZD0nJywgJGNvbnRlbnRzPScnLCAkcGFyYW1zPWFycmF5KCksICR3YXJuX21lc3NhZ2U9JycsICRvbmx5aHJlZj1mYWxzZSwgJGlubGluZT1mYWxzZSwgJGFkZHR0ZXh0PScnLCAkdGFyZ2V0Y29udGVudG9ubHk9ZmFsc2UsICRwcmV0dHl1cmw9JycpCiAgICByZXR1cm4gJHRoaXMtPkNyZWF0ZUxpbmsoCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJpZCIsJHBhcmFtcywkdGhpcy0+X2lkKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImFjdGlvbiIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJyZXR1cm5pZCIsJHBhcmFtcywkdGhpcy0+X3JldHVybmlkKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImNvbnRlbnQiLCRwYXJhbXMsIiIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgicGFyYW1zIiwkcGFyYW1zLGFycmF5KCkpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgid2Fybm1lc3NhZ2UiLCRwYXJhbXMsIiIpLAogICAgICBmYWxzZSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImlubGluZSIsJHBhcmFtcyxmYWxzZSksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJhZGR0ZXh0IiwkcGFyYW1zLCIiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoInByZXR0eXVybCIsJHBhcmFtcywiIikKICAgICk7CiAgfQoKICBmdW5jdGlvbiBOZW9DbXNVcmwoJHBhcmFtcz1hcnJheSgpKSB7CiAgICAvL0NyZWF0ZUxpbmsoJGlkLCAkYWN0aW9uLCAkcmV0dXJuaWQ9JycsICRjb250ZW50cz0nJywgJHBhcmFtcz1hcnJheSgpLCAkd2Fybl9tZXNzYWdlPScnLCAkb25seWhyZWY9ZmFsc2UsICRpbmxpbmU9ZmFsc2UsICRhZGR0dGV4dD0nJywgJHRhcmdldGNvbnRlbnRvbmx5PWZhbHNlLCAkcHJldHR5dXJsPScnKQogICAgcmV0dXJuICR0aGlzLT5DcmVhdGVMaW5rKAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiaWQiLCRwYXJhbXMsJHRoaXMtPl9pZCksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJhY3Rpb24iLCRwYXJhbXMsIiIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgicmV0dXJuaWQiLCRwYXJhbXMsJHRoaXMtPl9yZXR1cm5pZCksCiAgICAgICIiLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgicGFyYW1zIiwkcGFyYW1zLGFycmF5KCkpLAogICAgICAiIiwKICAgICAgdHJ1ZSAsCiAgICAgIGZhbHNlLAogICAgICAiIiwKICAgICAgZmFsc2UsCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJwcmV0dHl1cmwiLCRwYXJhbXMsIiIpCiAgICApOwogIH0KCiAgZnVuY3Rpb24gTmVvUmVkaXJlY3QoJHBhcmFtcz1hcnJheSgpKSB7CiAgICAvL1JlZGlyZWN0KCRpZCwgJGFjdGlvbiwgJHJldHVybmlkPScnLCAkcGFyYW1zPWFycmF5KCksICRpbmxpbmU9ZmFsc2UpCiAgICByZXR1cm4gJHRoaXMtPlJlZGlyZWN0KAogICAgICAkdGhpcy0+TlBWKCJpZCIsJHBhcmFtcywkdGhpcy0+X2lkKSwKICAgICAgJHRoaXMtPk5QVigiYWN0aW9uIiwkcGFyYW1zLCIiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoInJldHVybmlkIiwkcGFyYW1zLCR0aGlzLT5fcmV0dXJuaWQpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgicGFyYW1zIiwkcGFyYW1zLGFycmF5KCkpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiaW5saW5lIiwkcGFyYW1zLGZhbHNlKQogICAgKTsKICB9CgoKICAvKgogICAqCiAgICogRm9ybS1nZW5lcmF0aW9uIGZ1bmN0aW9ucywgaW5jbHVkaW5nIHNtYXJ0eSBhc3NpZ25tZW50cwogICAqCiAgICovCgogIGZ1bmN0aW9uIE5lb0Zvcm1TdGFydCgkcGFyYW1zPWFycmF5KCkpIHsKICAgIC8vQ3JlYXRlRm9ybVN0YXJ0KCRpZCwgJGFjdGlvbj0nZGVmYXVsdCcsICRyZXR1cm5pZD0nJywgJG1ldGhvZD0ncG9zdCcsICRlbmN0eXBlPScnLCAkaW5saW5lPWZhbHNlLCAkaWRzdWZmaXg9JycsICRwYXJhbXMgPSBhcnJheSgpLCAkZXh0cmE9JycpICAgIAogICAgcmV0dXJuICR0aGlzLT5DcmVhdGVGb3JtU3RhcnQoCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJpZCIsJHBhcmFtcywkdGhpcy0+X2lkKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImFjdGlvbiIsJHBhcmFtcywiZGVmYXVsdCIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgicmV0dXJuaWQiLCRwYXJhbXMsJHRoaXMtPl9yZXR1cm5pZCksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJtZXRob2QiLCRwYXJhbXMsInBvc3QiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoYXJyYXkoImVuY3R5cGUiLCJlbmNvZGluZyIpLCRwYXJhbXMsIiIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiaW5saW5lIiwkcGFyYW1zLGZhbHNlKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImlkc3VmZml4IiwkcGFyYW1zLCIiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoInBhcmFtcyIsJHBhcmFtcyxhcnJheSgpKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImV4dHJhIiwkcGFyYW1zLCIiKQogICAgKTsKICB9CiAgZnVuY3Rpb24gU21hcnR5Rm9ybVN0YXJ0KCRzbWFydHluYW1lLCRwYXJhbXM9YXJyYXkoKSkgewogICAgJHRoaXMtPlNtYXJ0eUFzc2lnbigkc21hcnR5bmFtZSwkdGhpcy0+TmVvRm9ybVN0YXJ0KCRwYXJhbXMpKTsKICB9CiAgZnVuY3Rpb24gU21hcnR5VXBsb2FkRm9ybVN0YXJ0KCRzbWFydHluYW1lLCRwYXJhbXM9YXJyYXkoKSkgewogICAgJHBhcmFtc1sibWV0aG9kIl09InBvc3QiOwogICAgJHBhcmFtc1siZW5jdHlwZSJdPSJtdWx0aXBhcnQvZm9ybS1kYXRhIjsKICAgICR0aGlzLT5TbWFydHlGb3JtU3RhcnQoJHNtYXJ0eW5hbWUsJHBhcmFtcyk7CiAgfQoKICBmdW5jdGlvbiBOZW9Gb3JtRW5kKCkgewogICAgcmV0dXJuICR0aGlzLT5DcmVhdGVGb3JtRW5kKCk7CiAgfQogIGZ1bmN0aW9uIFNtYXJ0eUZvcm1FbmQoJHNtYXJ0eW5hbWUpIHsKICAgICR0aGlzLT5TbWFydHlBc3NpZ24oJHNtYXJ0eW5hbWUsJHRoaXMtPk5lb0Zvcm1FbmQoKSk7CiAgfQogIGZ1bmN0aW9uIFNtYXJ0eUlucHV0U3VibWl0KCRzbWFydHluYW1lLCRuYW1lLCR0ZXh0LCRjb25maXJtdGV4dD0iIikgewogICAgJHRoaXMtPlNtYXJ0eUFzc2lnbigkc21hcnR5bmFtZSwkdGhpcy0+TmVvSW5wdXRTdWJtaXQoYXJyYXkoIm5hbWUiPT4kbmFtZSwidmFsdWUiPT4kdGV4dCwiY29uZmlybXRleHQiPT4kY29uZmlybXRleHQpKSk7CiAgfQogIGZ1bmN0aW9uIFNtYXJ0eUlucHV0SGlkZGVuKCRzbWFydHluYW1lLCRuYW1lLCR2YWx1ZT0iIikgewogICAgJHRoaXMtPlNtYXJ0eUFzc2lnbigkc21hcnR5bmFtZSwkdGhpcy0+TmVvSW5wdXRIaWRkZW4oYXJyYXkoIm5hbWUiPT4kbmFtZSwidmFsdWUiPT4kdmFsdWUpKSk7CiAgfQogIGZ1bmN0aW9uIFNtYXJ0eUlucHV0SGlkZGVuTXVsdGkoJHNtYXJ0eW5hbWUsJGZpZWxkcz1hcnJheSgpKSB7CiAgICAkb3V0cHV0PSJcbiI7CiAgICBmb3JlYWNoKCRmaWVsZHMgYXMgJG5hbWU9PiR2YWx1ZSkgewogICAgICAkb3V0cHV0Lj0kdGhpcy0+TmVvSW5wdXRIaWRkZW4oYXJyYXkoIm5hbWUiPT4kbmFtZSwidmFsdWUiPT4kdmFsdWUpKS4iXG4iOwogICAgfQogICAgJG91dHB1dC49IlxuIjsKICAgICR0aGlzLT5TbWFydHlBc3NpZ24oJHNtYXJ0eW5hbWUsJG91dHB1dCk7CiAgfQoKICBmdW5jdGlvbiBTbWFydHlMaW5rKCRzbWFydHluYW1lLCRmaWVsZHM9YXJyYXkoKSkgewogICAgJHRoaXMtPlNtYXJ0eUFzc2lnbigkc21hcnR5bmFtZSwkdGhpcy0+TmVvQ21zTGluaygkZmllbGRzKSk7CiAgfQoKICBmdW5jdGlvbiBOZW9JbnB1dEZpbGUoJHBhcmFtcykgeyAgCiAgIHJldHVybiAkdGhpcy0+Q3JlYXRlSW5wdXRGaWxlKAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiaWQiLCRwYXJhbXMsJHRoaXMtPl9pZCksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJuYW1lIiwkcGFyYW1zLCIiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImFjY2VwdCIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJzaXplIiwkcGFyYW1zLCIxMCIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiYWRkdGV4dCIsJHBhcmFtcywiIikKICAgICk7CiAgfQoKICBmdW5jdGlvbiBOZW9JbnB1dFRleHQoJHBhcmFtcz1hcnJheSgpKSB7CiAgICByZXR1cm4gJHRoaXMtPkNyZWF0ZUlucHV0VGV4dCgKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImlkIiwkcGFyYW1zLCR0aGlzLT5faWQpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgibmFtZSIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJ2YWx1ZSIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJzaXplIiwkcGFyYW1zLCIxMCIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgibWF4bGVuZ3RoIiwkcGFyYW1zLCIyNTUiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImFkZHRleHQiLCRwYXJhbXMsIiIpCiAgICApOwogIH0KCiAgZnVuY3Rpb24gTmVvSW5wdXRQYXNzd29yZCgkcGFyYW1zPWFycmF5KCkpIHsgICAgCiAgICByZXR1cm4gJHRoaXMtPkNyZWF0ZUlucHV0UGFzc3dvcmQoCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJpZCIsJHBhcmFtcywkdGhpcy0+X2lkKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoIm5hbWUiLCRwYXJhbXMsIiIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgidmFsdWUiLCRwYXJhbXMsIiIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgic2l6ZSIsJHBhcmFtcywiMTAiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoIm1heGxlbmd0aCIsJHBhcmFtcywiMjU1IiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJhZGR0ZXh0IiwkcGFyYW1zLCIiKQogICAgKTsKICB9CgogIGZ1bmN0aW9uIE5lb1RleHRhcmVhKCRwYXJhbXM9YXJyYXkoKSkgeyAgICAKICAgIHJldHVybiAkdGhpcy0+Q3JlYXRlVGV4dEFyZWEoCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJlbmFibGV3eXNpd3lnIiwkcGFyYW1zLGZhbHNlKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImlkIiwkcGFyYW1zLCR0aGlzLT5faWQpLCAgICAgIAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZShhcnJheSgidmFsdWUiLCJ0ZXh0IiksJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJuYW1lIiwkcGFyYW1zLCIiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImNsYXNzbmFtZSIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJodG1saWQiLCRwYXJhbXMsIiIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiZW5jb2RpbmciLCRwYXJhbXMsIiIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgic3R5bGVzaGVldCIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJjb2xzIiwkcGFyYW1zLCI4MCIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgicm93cyIsJHBhcmFtcywiMTUiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImZvcmNld3lzaXd5ZyIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJ3YW50ZWRzeW50YXgiLCRwYXJhbXMsIiIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiYWRkdGV4dCIsJHBhcmFtcywiIikKICAgICk7CiAgfQoKICBmdW5jdGlvbiBOZW9JbnB1dENoZWNrYm94KCRwYXJhbXM9YXJyYXkoKSkgewogICAgaWYgKGlzc2V0KCRwYXJhbXNbImNoZWNrZWQiXSkgJiYgJHBhcmFtc1siY2hlY2tlZCJdPT10cnVlKSB7CiAgICAgICRwYXJhbXNbInNlbGVjdGVkdmFsdWUiXT0kcGFyYW1zWyJ2YWx1ZSJdOwogICAgfQogICAgcmV0dXJuICR0aGlzLT5DcmVhdGVJbnB1dENoZWNrYm94KAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiaWQiLCRwYXJhbXMsJHRoaXMtPl9pZCksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJuYW1lIiwkcGFyYW1zLCIiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoInZhbHVlIiwkcGFyYW1zLCIiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoInNlbGVjdGVkdmFsdWUiLCRwYXJhbXMsIiIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiYWRkdGV4dCIsJHBhcmFtcywiIikKICAgICk7CiAgfSAgCgogIGZ1bmN0aW9uIE5lb0lucHV0U3VibWl0KCRwYXJhbXM9YXJyYXkoKSkgewogICAgcmV0dXJuICR0aGlzLT5DcmVhdGVJbnB1dFN1Ym1pdCgKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImlkIiwkcGFyYW1zLCR0aGlzLT5faWQpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgibmFtZSIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJ2YWx1ZSIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJhZGR0ZXh0IiwkcGFyYW1zLCIiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImltYWdlIiwkcGFyYW1zLCIiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImNvbmZpcm10ZXh0IiwkcGFyYW1zLCIiKQogICAgKTsKICB9CgogIGZ1bmN0aW9uIE5lb0lucHV0UmVzZXQoJHBhcmFtcz1hcnJheSgpKSB7CiAgICByZXR1cm4gJHRoaXMtPkNyZWF0ZUlucHV0VGV4dCgKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImlkIiwkcGFyYW1zLCR0aGlzLT5faWQpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgibmFtZSIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJ2YWx1ZSIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJhZGR0ZXh0IiwkcGFyYW1zLCJSZXNldCIpCiAgICApOwogIH0KCiAgZnVuY3Rpb24gTmVvSW5wdXRIaWRkZW4oJHBhcmFtcz1hcnJheSgpKSB7CiAgICByZXR1cm4gJHRoaXMtPkNyZWF0ZUlucHV0SGlkZGVuKAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiaWQiLCRwYXJhbXMsJHRoaXMtPl9pZCksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJuYW1lIiwkcGFyYW1zLCIiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoInZhbHVlIiwkcGFyYW1zLCIiKQogICAgKTsKICB9CiAgCiAgZnVuY3Rpb24gTmVvSW5wdXREcm9wZG93bigkcGFyYW1zPWFycmF5KCkpIHsKICAgIHJldHVybiAkdGhpcy0+Q3JlYXRlSW5wdXREcm9wZG93bigKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImlkIiwkcGFyYW1zLCR0aGlzLT5faWQpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgibmFtZSIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJpdGVtcyIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJzZWxlY3RlZGluZGV4IiwkcGFyYW1zLC0xKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoInNlbGVjdGVkdmFsdWUiLCRwYXJhbXMsIiIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiYWRkdGV4dCIsJHBhcmFtcywiIikKICAgICk7CiAgfQoKICBmdW5jdGlvbiBOZW9JbnB1dFJhZGlvR3JvdXAoJHBhcmFtcz1hcnJheSgpKSB7CiAgICByZXR1cm4gJHRoaXMtPkNyZWF0ZUlucHV0UmFkaW9Hcm91cCgKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImlkIiwkcGFyYW1zLCR0aGlzLT5faWQpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgibmFtZSIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJpdGVtcyIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJzZWxlY3RlZHZhbHVlIiwkcGFyYW1zLC0xKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImFkZHRleHQiLCRwYXJhbXMsIiIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiZGVsaW1pdGVyIiwkcGFyYW1zLCIiKQogICAgKTsKICB9CiAgCiAgZnVuY3Rpb24gTmVvSW5wdXRTZWxlY3RMaXN0KCRwYXJhbXM9YXJyYXkoKSkgewogICAgcmV0dXJuICR0aGlzLT5DcmVhdGVJbnB1dFNlbGVjdExpc3QoCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJpZCIsJHBhcmFtcywkdGhpcy0+X2lkKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoIm5hbWUiLCRwYXJhbXMsIiIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiaXRlbXMiLCRwYXJhbXMsIiIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgic2VsZWN0ZWRpdGVtcyIsJHBhcmFtcyxhcnJheSgpKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoInNpemUiLCRwYXJhbXMsMyksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJhZGR0ZXh0IiwkcGFyYW1zLCIiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoIm11bHRpcGxlIiwkcGFyYW1zLHRydWUpCiAgICApOwogIH0gIAoKICAvKioKICAgKgogICAqIExpc3QgaGVscGVyIGZ1bmN0aW9ucwogICAqCiAgICovCiAgIGZ1bmN0aW9uIE5lb0RlbGV0ZUljb24oJGFjdGlvbiwkdGV4dCwkcGFyYW1zPWFycmF5KCksJGNvbmZpcm1hdGlvbj0iIikgewogICAgICRpY29uPSR0aGlzLT5DcmVhdGVMaW5rKCR0aGlzLT5faWQsICRhY3Rpb24sICR0aGlzLT5fcmV0dXJuaWQsJHRoaXMtPk5lb1N5c3RlbUljb24oImRlbGV0ZS5naWYiLCR0ZXh0KSwkcGFyYW1zLCAkY29uZmlybWF0aW9uKTsKICAgICByZXR1cm4gJGljb247CiAgIH0KCiAgIGZ1bmN0aW9uIE5lb0NvcHlJY29uKCRhY3Rpb24sJHRleHQsJHBhcmFtcz1hcnJheSgpLCRjb25maXJtYXRpb249IiIpIHsgICAgIAogICAgICRpY29uPSR0aGlzLT5DcmVhdGVMaW5rKCR0aGlzLT5faWQsICRhY3Rpb24sICR0aGlzLT5fcmV0dXJuaWQsCSR0aGlzLT5OZW9TeXN0ZW1JY29uKCJjb3B5LmdpZiIsJHRleHQpLCAkcGFyYW1zLCAkY29uZmlybWF0aW9uKTsKICAgICByZXR1cm4gJGljb247CiAgIH0KCiAgIGZ1bmN0aW9uIE5lb0VkaXRJY29uKCRhY3Rpb24sJHRleHQsJHBhcmFtcz1hcnJheSgpLCRjb25maXJtYXRpb249IiIpIHsKICAgICAkaWNvbj0kdGhpcy0+Q3JlYXRlTGluaygkdGhpcy0+X2lkLCAkYWN0aW9uLCAkdGhpcy0+X3JldHVybmlkLAkkdGhpcy0+TmVvU3lzdGVtSWNvbigiZWRpdC5naWYiLCR0ZXh0KSwJJHBhcmFtcywgJGNvbmZpcm1hdGlvbik7CiAgICAgcmV0dXJuICRpY29uOwogICB9CiAgIGZ1bmN0aW9uIE5lb1RydWVJY29uKCRhY3Rpb24sJHRleHQsJHBhcmFtcz1hcnJheSgpLCRjb25maXJtYXRpb249IiIpIHsKICAgICAkaWNvbj0kdGhpcy0+Q3JlYXRlTGluaygkdGhpcy0+X2lkLCAkYWN0aW9uLCAkdGhpcy0+X3JldHVybmlkLAkkdGhpcy0+TmVvU3lzdGVtSWNvbigidHJ1ZS5naWYiLCR0ZXh0KSwJJHBhcmFtcywgJGNvbmZpcm1hdGlvbik7CiAgICAgcmV0dXJuICRpY29uOwogICB9CiAgIGZ1bmN0aW9uIE5lb0ZhbHNlSWNvbigkYWN0aW9uLCR0ZXh0LCRwYXJhbXM9YXJyYXkoKSwkY29uZmlybWF0aW9uPSIiKSB7CiAgICAgJGljb249JHRoaXMtPkNyZWF0ZUxpbmsoJHRoaXMtPl9pZCwgJGFjdGlvbiwgJHRoaXMtPl9yZXR1cm5pZCwJJHRoaXMtPk5lb1N5c3RlbUljb24oImZhbHNlLmdpZiIsJHRleHQpLAkkcGFyYW1zLCAkY29uZmlybWF0aW9uKTsKICAgICByZXR1cm4gJGljb247CiAgIH0KCiAgIGZ1bmN0aW9uIE5lb0FkZEljb24oJGFjdGlvbiwkdGV4dCwkcGFyYW1zPWFycmF5KCksJGNvbmZpcm1hdGlvbj0iIikgeyAgICAgCiAgICAgJGljb249JHRoaXMtPkNyZWF0ZUxpbmsoJHRoaXMtPl9pZCwgJGFjdGlvbiwgJHRoaXMtPl9yZXR1cm5pZCwgJHRoaXMtPk5lb1N5c3RlbUljb24oIm5ld29iamVjdC5naWYiLCR0ZXh0KSwgJHBhcmFtcywgJGNvbmZpcm1hdGlvbik7CiAgICAgLy8kaWNvbi49JHRoaXMtPkNyZWF0ZUxpbmsoJHRoaXMtPl9pZCwgICRhY3Rpb24sICR0aGlzLT5fcmV0dXJuaWQsICR0ZXh0LCAkcGFyYW1zLCAkY29uZmlybWF0aW9uLCBmYWxzZSwgZmFsc2UsICdjbGFzcz0icGFnZW9wdGlvbnMiJyk7CgogICAgIC8vPSR0aGlzLT5DcmVhdGVMaW5rKCRpZCwgJ2VkaXR0ZW1wbGF0ZScsIDAsICR0aGVtZU9iamVjdC0+RGlzcGxheUltYWdlKCdpY29ucy9zeXN0ZW0vbmV3b2JqZWN0LmdpZicsJHRoaXMtPkxhbmcoImFkZHRlbXBsYXRlIiksJycsJycsJ3N5c3RlbWljb24nKSwgYXJyYXkoKSwgJycsIGZhbHNlLCBmYWxzZSwgJycpIC4nICcuICR0aGlzLT5DcmVhdGVMaW5rKCRpZCwgJ2VkaXR0ZW1wbGF0ZScsICRyZXR1cm5pZCwgJHRoaXMtPkxhbmcoImFkZHRlbXBsYXRlIiksIGFycmF5KCJ0b2RvIj0+ImFkZCIpLCAnJywgZmFsc2UsIGZhbHNlLCAnY2xhc3M9InBhZ2VvcHRpb25zIicpOwogICAgcmV0dXJuICRpY29uOwogICB9CiAgIAogICBmdW5jdGlvbiBOZW9TeXN0ZW1JY29uKCRpY29uLCR0ZXh0PSIiKSB7CiAgICAgJHRoZW1lb2JqPSR0aGlzLT5fZ2V0dGhlbWVvYmooKTsKICAgICByZXR1cm4gJHRoZW1lb2JqLT5EaXNwbGF5SW1hZ2UoJ2ljb25zL3N5c3RlbS8nLiRpY29uLCAkdGV4dCwnJywnJywnc3lzdGVtaWNvbicpOwogICB9CgogICBmdW5jdGlvbiBOZW9IaWRkZW5Db250ZW50KCR0ZXh0LCAkY29udGVudCwgJGNsaWNrdHlwZT0idGV4dCIsICRzdGFydHNob3duPWZhbHNlKSB7CiAgICAgcmV0dXJuICI8c3Ryb25nPiR0ZXh0PC9zdHJvbmc+PGJyLz4kY29udGVudCI7CiAgIH0KICAgCQkJCgogIC8qKgogICAqCiAgICogTmVvRGF0YVN0b3JhZ2Ugc2hvcnRjdXRzCiAgICoKICAgKi8KICBmdW5jdGlvbiBBZGRFbnRpdHkoJHRhYmxlLCAkcHJvcHM9YXJyYXkoKSkgewogICAgJGRzPSR0aGlzLT5fZ2V0ZHMoKTsKICAgIGlmICgkZHMhPT1mYWxzZSkgewogICAgICByZXR1cm4gJGRzLT5BZGRFbnRpdHkoJHRoaXMtPkdldE5hbWUoKSwkdGFibGUsJHByb3BzKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAkdGhpcy0+RXJyb3IoImZ1bmN0aW9uIEFkZEVudGl0eTogQ2Fubm90IGFjY2VzcyBOZW9EYXRhU3RvcmFnZSBtb2R1bGUiKTsKICAgIH0KICB9CgoKICBmdW5jdGlvbiBEZWxldGVFbnRpdHkoJGlkKSB7CiAgICAkZHM9JHRoaXMtPl9nZXRkcygpOwogICAgaWYgKCRkcyE9PWZhbHNlKSB7CiAgICAgIHJldHVybiAkZHMtPkRlbGV0ZUVudGl0eSgkaWQpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICR0aGlzLT5FcnJvcigiZnVuY3Rpb24gRGVsZXRlRW50aXR5OiBDYW5ub3QgYWNjZXNzIE5lb0RhdGFTdG9yYWdlIG1vZHVsZSIpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gR2V0RW50aXR5KCRpZCwgJG92ZXJyaWRlcHJvcHM9YXJyYXkoKSwgJGZpbGxmaWVsZHM9YXJyYXkoKSkgewogICAgJGRzPSR0aGlzLT5fZ2V0ZHMoKTsKICAgIGlmICgkZHMhPT1mYWxzZSkgewogICAgICByZXR1cm4gJGRzLT5HZXRFbnRpdHkoJGlkLCAkb3ZlcnJpZGVwcm9wcywgJGZpbGxmaWVsZHMpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICR0aGlzLT5FcnJvcigiZnVuY3Rpb24gR2V0RW50aXR5OiBDYW5ub3QgYWNjZXNzIE5lb0RhdGFTdG9yYWdlIG1vZHVsZSIpOwogICAgfSAgICAKICB9CgogIGZ1bmN0aW9uIEdldEVudGl0aWVzKCR0YWJsZT0iIiwgJGNyaXRlcmlhPWFycmF5KCksICRhbHdheXNyZXR1cm5hcnJheT1mYWxzZSkgewogICAgJGRzPSR0aGlzLT5fZ2V0ZHMoKTsKICAgIGlmICgkZHMhPT1mYWxzZSkgewogICAgICByZXR1cm4gJGRzLT5HZXRFbnRpdGllcygkdGhpcy0+R2V0TmFtZSgpLCAkdGFibGUsICRjcml0ZXJpYSk7CiAgICB9IGVsc2UgewogICAgICBpZiAoJGFsd2F5c3JldHVybmFycmF5KSB7CiAgICAgICAgcmV0dXJuIGFycmF5KCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5FcnJvcigiZnVuY3Rpb24gR2V0RW50aXRpZXM6IENhbm5vdCBhY2Nlc3MgTmVvRGF0YVN0b3JhZ2UgbW9kdWxlIik7CiAgICAgIH0KICAgIH0KICB9CgogIGZ1bmN0aW9uIEdldE9uZUVudGl0eSgkdGFibGUsICRjcml0ZXJpYT1hcnJheSgpLCAkZmFpbGlmbXVsdGlwbGU9ZmFsc2UpIHsKICAgICRkcz0kdGhpcy0+X2dldGRzKCk7CiAgICAKICAgIGlmICgkZHMhPT1mYWxzZSkgewogICAgICByZXR1cm4gJGRzLT5HZXRPbmVFbnRpdHkoJHRoaXMtPkdldE5hbWUoKSwgJHRhYmxlLCAkY3JpdGVyaWEsICRmYWlsaWZtdWx0aXBsZSk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gJHRoaXMtPkVycm9yKCJmdW5jdGlvbiBHZXRPbmVFbnRpdHk6IENhbm5vdCBhY2Nlc3MgTmVvRGF0YVN0b3JhZ2UgbW9kdWxlIik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBHZXRPbmVTb3J0ZWRFbnRpdHkoJHRhYmxlLCAkY3JpdGVyaWE9YXJyYXkoKSwgJHNvcnRmaWVsZHMgKSB7CiAgICAkZHM9JHRoaXMtPl9nZXRkcygpOwogICAgaWYgKCRkcyE9PWZhbHNlKSB7CiAgICAgIHJldHVybiAkZHMtPkdldE9uZUVudGl0eSgkdGhpcy0+R2V0TmFtZSgpLCAkdGFibGUsICRjcml0ZXJpYSwgJGZhaWxpZm11bHRpcGxlKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAkdGhpcy0+RXJyb3IoImZ1bmN0aW9uIEdldE9uZUVudGl0eTogQ2Fubm90IGFjY2VzcyBOZW9EYXRhU3RvcmFnZSBtb2R1bGUiKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIEdldEVudGl0aWVzRnVsbCgkdGFibGU9IiIsICRjcml0ZXJpYT1hcnJheSgpLCAkYWx3YXlzcmV0dXJuYXJyYXk9ZmFsc2UpIHsKICAgICRkcz0kdGhpcy0+X2dldGRzKCk7CiAgICBpZiAoJGRzIT09ZmFsc2UpIHsKICAgICAgcmV0dXJuICRkcy0+R2V0RW50aXRpZXNGdWxsKCR0aGlzLT5HZXROYW1lKCksICR0YWJsZSwgJGNyaXRlcmlhKTsKICAgIH0gZWxzZSB7CiAgICAgIGlmICgkYWx3YXlzcmV0dXJuYXJyYXkpIHsKICAgICAgICByZXR1cm4gYXJyYXkoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gJHRoaXMtPkVycm9yKCJmdW5jdGlvbiBHZXRFbnRpdGllc0Z1bGw6IENhbm5vdCBhY2Nlc3MgTmVvRGF0YVN0b3JhZ2UgbW9kdWxlIik7CiAgICAgIH0KICAgIH0KICB9CgogIGZ1bmN0aW9uIFNldEVudGl0eVByb3AoJGlkLCRwcm9wbmFtZSwkcHJvcHZhbHVlLCRwcm9wdHlwZT0idW5kZWZpbmVkIikgewogICAgJGRzPSR0aGlzLT5fZ2V0ZHMoKTsKICAgIGlmICgkZHMhPT1mYWxzZSkgewogICAgICByZXR1cm4gJGRzLT5TZXRFbnRpdHlQcm9wKCRpZCwkcHJvcG5hbWUsJHByb3B2YWx1ZSwkcHJvcHR5cGUpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICR0aGlzLT5FcnJvcigiZnVuY3Rpb24gU2V0RW50aXR5UHJvcDogQ2Fubm90IGFjY2VzcyBOZW9EYXRhU3RvcmFnZSBtb2R1bGUiKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIENsZWFyRW50aXR5UHJvcCgkaWQsICRwcm9wbmFtZSkgewogICAgJGRzPSR0aGlzLT5fZ2V0ZHMoKTsKICAgIGlmICgkZHMhPT1mYWxzZSkgewogICAgICByZXR1cm4gJGRzLT5DbGVhckVudGl0eVByb3AoJGlkLCAkcHJvcG5hbWUpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICR0aGlzLT5FcnJvcigiZnVuY3Rpb24gQ2xlYXJFbnRpdHlQcm9wOiBDYW5ub3QgYWNjZXNzIE5lb0RhdGFTdG9yYWdlIG1vZHVsZSIpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gU2V0RW50aXR5UHJvcHMoJGlkLCAkcHJvcHMvKiwgJGNsZWFyPXRydWUqLykgewogICAgLy9lY2hvICJoaTEiO2RpZSgpOwogICAgJGRzPSR0aGlzLT5fZ2V0ZHMoKTsKICAgIGlmICgkZHMhPT1mYWxzZSkgewogICAgICByZXR1cm4gJGRzLT5TZXRFbnRpdHlQcm9wcygkaWQsICRwcm9wcy8qLCAkY2xlYXIqLyk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gJHRoaXMtPkVycm9yKCJmdW5jdGlvbiBTZXRFbnRpdHlQcm9wczogQ2Fubm90IGFjY2VzcyBOZW9EYXRhU3RvcmFnZSBtb2R1bGUiKTsKICAgIH0KICB9CiAgCiAgZnVuY3Rpb24gU2V0RW50aXR5UHJvcHNGcm9tQXJyYXkoJGlkLCAkcHJvcHMsICR2YWx1ZXMsICRjbGVhcj10cnVlLCAkZmlsbD1mYWxzZSkgewogICAgLy9lY2hvICJoaTEiO2RpZSgpOwogICAgJGRzPSR0aGlzLT5fZ2V0ZHMoKTsKICAgIGlmICgkZHMhPT1mYWxzZSkgewogICAgICByZXR1cm4gJGRzLT5TZXRFbnRpdHlQcm9wc0Zyb21BcnJheSgkaWQsICRwcm9wcywgJHZhbHVlcywgJGNsZWFyLCAkZmlsbCk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gJHRoaXMtPkVycm9yKCJmdW5jdGlvbiBTZXRFbnRpdHlQcm9wc0Zyb21BcnJheTogQ2Fubm90IGFjY2VzcyBOZW9EYXRhU3RvcmFnZSBtb2R1bGUiKTsKICAgIH0KICB9CgoKCiAgZnVuY3Rpb24gU2V0RW50aXR5UHJvcHNPbkNyaXRlcmlhKCR0YWJsZSwgJHByb3BzLCAkY3JpdGVyaWEsICRjcmVhdGU9dHJ1ZSwgJGNsZWFyPWZhbHNlKSB7CiAgICAkZHM9JHRoaXMtPl9nZXRkcygpOwogICAgaWYgKCRkcyE9PWZhbHNlKSB7CiAgICAgIHJldHVybiAkZHMtPlNldEVudGl0eVByb3BzT25Dcml0ZXJpYSgkdGhpcy0+R2V0TmFtZSgpLCAkdGFibGUsICRwcm9wcywgJGNyaXRlcmlhLCAkY3JlYXRlLCAkY2xlYXIpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICR0aGlzLT5FcnJvcigiZnVuY3Rpb24gU2V0RW50aXR5UHJvcHNPbkNyaXRlcmlhOiBDYW5ub3QgYWNjZXNzIE5lb0RhdGFTdG9yYWdlIG1vZHVsZSIpOzs7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBSZXNldEVudGl0eVByb3BzKCRpZCwgJG5ld3Byb3BzPWFycmF5KCkpIHsKICAgICRkcz0kdGhpcy0+X2dldGRzKCk7CiAgICBpZiAoJGRzIT09ZmFsc2UpIHsKICAgICAgcmV0dXJuICRkcy0+UmVzZXRFbnRpdHlQcm9wcygkaWQsICRuZXdwcm9wKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAkdGhpcy0+RXJyb3IoImZ1bmN0aW9uIFJlc2V0RW50aXR5UHJvcHM6IENhbm5vdCBhY2Nlc3MgTmVvRGF0YVN0b3JhZ2UgbW9kdWxlIik7OzsKICAgIH0KICB9CgogIGZ1bmN0aW9uIFJlbW92ZU1vZHVsZUVudGl0aWVzKCkgewogICAgJGRzPSR0aGlzLT5fZ2V0ZHMoKTsKICAgIGlmICgkZHMhPT1mYWxzZSkgewogICAgICByZXR1cm4gJGRzLT5SZW1vdmVNb2R1bGVFbnRpdGllcygkdGhpcy0+R2V0TmFtZSgpKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAkdGhpcy0+RXJyb3IoImZ1bmN0aW9uIFJlbW92ZU1vZHVsZUVudGl0aWVzOiBDYW5ub3QgYWNjZXNzIE5lb0RhdGFTdG9yYWdlIG1vZHVsZSIpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gQ2xlYXJFbnRpdHlQcm9wcygkaWQpIHsKICAgICRkcz0kdGhpcy0+X2dldGRzKCk7CiAgICBpZiAoJGRzIT09ZmFsc2UpIHsKICAgICAgcmV0dXJuICRkcy0+Q2xlYXJFbnRpdHlQcm9wcygkaWQpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICR0aGlzLT5FcnJvcigiZnVuY3Rpb24gQ2xlYXJFbnRpdHlQcm9wczogQ2Fubm90IGFjY2VzcyBOZW9EYXRhU3RvcmFnZSBtb2R1bGUiKTsKICAgIH0gICAgCiAgfQoKICBmdW5jdGlvbiBDb21wYXJlRW50aXRpZXMoJGVudGl0eTEsICRlbnRpdHkyLCAkc29ydGZpZWxkKSB7CiAgICAkZHM9JHRoaXMtPl9nZXRkcygpOwogICAgaWYgKCRkcyE9PWZhbHNlKSB7CiAgICAgICRkcy0+Q29tcGFyZUVudGl0aWVzKCRlbnRpdHkxLCAkZW50aXR5MiwgJHNvcnRmaWVsZCk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gJHRoaXMtPkVycm9yKCJmdW5jdGlvbiBDb21wYXJlRW50aXRpZXM6IENhbm5vdCBhY2Nlc3MgTmVvRGF0YVN0b3JhZ2UgbW9kdWxlIik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBDb21wYXJlRW50aXRpZXNDb21wbGV4KCRlbnRpdHkxLCAkZW50aXR5MiwgJHNvcnRmaWVsZHMpIHsKICAgICRkcz0kdGhpcy0+X2dldGRzKCk7CiAgICBpZiAoJGRzIT09ZmFsc2UpIHsKICAgICAgJGRzLT5Db21wYXJlRW50aXRpZXNDb21wbGV4KCRlbnRpdHkxLCAkZW50aXR5MiwgJHNvcnRmaWVsZCk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gJHRoaXMtPkVycm9yKCJmdW5jdGlvbiBDb21wYXJlRW50aXRpZXNDb21wbGV4OiBDYW5ub3QgYWNjZXNzIE5lb0RhdGFTdG9yYWdlIG1vZHVsZSIpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gU29ydEVudGl0aWVzKCRsaXN0LCAkc29ydGZpZWxkcykgewogICAgJGRzPSR0aGlzLT5fZ2V0ZHMoKTsKICAgIGlmICgkZHMhPT1mYWxzZSkgewogICAgICAkZHMtPlNvcnRFbnRpdGllcygkbGlzdCwgJHNvcnRmaWVsZHMpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICR0aGlzLT5FcnJvcigiZnVuY3Rpb24gU29ydEVudGl0aWVzOiBDYW5ub3QgYWNjZXNzIE5lb0RhdGFTdG9yYWdlIG1vZHVsZSIpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gRW50aXRpZXNDb3VudCgkdGFibGU9IiIsICRjcml0ZXJpYT1hcnJheSgpKSB7CiAgICAkZHM9JHRoaXMtPl9nZXRkcygpOwogICAgaWYgKCRkcyE9PWZhbHNlKSB7CiAgICAgIHJldHVybiAkZHMtPkVudGl0aWVzQ291bnQoJHRoaXMtPkdldE5hbWUoKSwgJHRhYmxlLCAkY3JpdGVyaWEpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICR0aGlzLT5FcnJvcigiZnVuY3Rpb24gRW50aXRpZXNDb3VudDogQ2Fubm90IGFjY2VzcyBOZW9EYXRhU3RvcmFnZSBtb2R1bGUiKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIENsZWFyTW9kdWxlRW50aXRpZXMoKSB7ICAgIAogICAgJGRzPSR0aGlzLT5fZ2V0ZHMoKTsKICAgIGlmICgkZHMhPT1mYWxzZSkgeyAgICAgIAogICAgICByZXR1cm4gJGRzLT5DbGVhck1vZHVsZUVudGl0aWVzKCR0aGlzLT5HZXROYW1lKCkpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICR0aGlzLT5FcnJvcigiZnVuY3Rpb24gQ2xlYXJNb2R1bGVFbnRpdGllczogQ2Fubm90IGFjY2VzcyBOZW9EYXRhU3RvcmFnZSBtb2R1bGUiKTsKICAgIH0KICB9CgogIC8qCiAgICoKICAgKiBDb25uZWN0aW9uIGZ1bmN0aW9ucwogICAqCiAgICovCgogIGZ1bmN0aW9uIFNldEVudGl0eUNvbm5lY3Rpb24oJGlkMSwgJGlkMiwgJHR5cGU9IiIpIHsKICAgICRkcz0kdGhpcy0+X2dldGRzKCk7CiAgICBpZiAoJGRzIT09ZmFsc2UpIHsKICAgICAgcmV0dXJuICRkcy0+U2V0RW50aXR5Q29ubmVjdGlvbigkaWQxLCAkaWQyLCAkdHlwZSk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gJHRoaXMtPkVycm9yKCJmdW5jdGlvbiBTZXRFbnRpdHlDb25uZWN0aW9uOiBDYW5ub3QgYWNjZXNzIE5lb0RhdGFTdG9yYWdlIG1vZHVsZSIpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gQ2xlYXJFbnRpdHlDb25uZWN0aW9ucygkaWQxLCAkaWQyPS0xLCAkdHlwZT0iIikgewogICAgJGRzPSR0aGlzLT5fZ2V0ZHMoKTsKICAgIGlmICgkZHMhPT1mYWxzZSkgewogICAgICByZXR1cm4gJGRzLT5DbGVhckVudGl0eUNvbm5lY3Rpb25zKCRpZDEsICRpZDIsICR0eXBlKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAkdGhpcy0+RXJyb3IoImZ1bmN0aW9uIENsZWFyRW50aXR5Q29ubmVjdGlvbnM6IENhbm5vdCBhY2Nlc3MgTmVvRGF0YVN0b3JhZ2UgbW9kdWxlIik7CiAgICB9ICAgIAogIH0KCgoKICBmdW5jdGlvbiBDbGVhckVudGl0eUNvbm5lY3Rpb24oJGlkMSwgJGlkMiwgJHR5cGU9IiIpIHsKICAgICRkcz0kdGhpcy0+X2dldGRzKCk7CiAgICBpZiAoJGRzIT09ZmFsc2UpIHsKICAgICAgcmV0dXJuICRkcy0+Q2xlYXJFbnRpdHlDb25uZWN0aW9uKCRpZDEsICRpZDIsICR0eXBlKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAkdGhpcy0+RXJyb3IoImZ1bmN0aW9uIENsZWFyRW50aXR5Q29ubmVjdGlvbjogQ2Fubm90IGFjY2VzcyBOZW9EYXRhU3RvcmFnZSBtb2R1bGUiKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIENoZWNrRW50aXR5Q29ubmVjdGlvbigkaWQxLCAkaWQyLCAkdHlwZT0iIiwgJHJldHVybnZhbHVlPXRydWUpIHsKICAgICRkcz0kdGhpcy0+X2dldGRzKCk7CiAgICBpZiAoJGRzIT09ZmFsc2UpIHsKICAgICAgcmV0dXJuICRkcy0+Q2hlY2tFbnRpdHlDb25uZWN0aW9uKCRpZDEsICRpZDIsICR0eXBlLCAkcmV0dXJudmFsdWUpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICR0aGlzLT5FcnJvcigiZnVuY3Rpb24gQ2hlY2tFbnRpdHlDb25uZWN0aW9uOiBDYW5ub3QgYWNjZXNzIE5lb0RhdGFTdG9yYWdlIG1vZHVsZSIpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gR2V0RW50aXR5Q29ubmVjdGlvbnMoJGlkMSwgJGlkMj0tMSwgJHR5cGU9IiIpIHsKICAgICRkcz0kdGhpcy0+X2dldGRzKCk7CiAgICBpZiAoJGRzIT09ZmFsc2UpIHsKICAgICAgcmV0dXJuICRkcy0+R2V0RW50aXR5Q29ubmVjdGlvbnMoJGlkMSwgJGlkMiwgJHR5cGUpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICR0aGlzLT5FcnJvcigiZnVuY3Rpb24gR2V0RW50aXR5Q29ubmVjdGlvbnM6IENhbm5vdCBhY2Nlc3MgTmVvRGF0YVN0b3JhZ2UgbW9kdWxlIik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBBZGRGaWVsZFNldCgkbmFtZSwkZmllbGRzKSB7CiAgICAkZHM9JHRoaXMtPl9nZXRkcygpOwogICAgaWYgKCRkcyE9PWZhbHNlKSB7CiAgICAgIHJldHVybiAkZHMtPkFkZEZpZWxkU2V0KCR0aGlzLT5HZXROYW1lKCksJG5hbWUsJGZpZWxkcyk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gJHRoaXMtPkVycm9yKCJmdW5jdGlvbiBBZGRGaWVsZFNldDogQ2Fubm90IGFjY2VzcyBOZW9EYXRhU3RvcmFnZSBtb2R1bGUiKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIEdldEZpZWxkU2V0KCRuYW1lKSB7CiAgICAkZHM9JHRoaXMtPl9nZXRkcygpOwogICAgaWYgKCRkcyE9PWZhbHNlKSB7CiAgICAgIHJldHVybiAkZHMtPkdldEZpZWxkU2V0KCR0aGlzLT5HZXROYW1lKCksJG5hbWUpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICR0aGlzLT5FcnJvcigiZnVuY3Rpb24gR2V0RmllbGRTZXQ6IENhbm5vdCBhY2Nlc3MgTmVvRGF0YVN0b3JhZ2UgbW9kdWxlIik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBFbnRpdHlTZXRVbnNldFByb3BzKCRlbnRpdHksJGZpZWxkc2V0LCRmaWxsdmFsdWU9IiIpIHsKICAgICRkcz0kdGhpcy0+X2dldGRzKCk7CiAgICBpZiAoJGRzIT09ZmFsc2UpIHsKICAgICAgcmV0dXJuICRkcy0+RW50aXR5U2V0VW5zZXRQcm9wcygkdGhpcy0+R2V0RmllbGRTZXQoJHRoaXMtPkdldE5hbWUoKSksJGVudGl0eSwkZmllbGRzZXQsJGZpbGx2YWx1ZT0iIik7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gJHRoaXMtPkVycm9yKCJmdW5jdGlvbiBHZXRGaWVsZFNldDogQ2Fubm90IGFjY2VzcyBOZW9EYXRhU3RvcmFnZSBtb2R1bGUiKTsKICAgIH0KICB9CgoKICBmdW5jdGlvbiBHZXREU0Vycm9ycygkbmwyYnI9dHJ1ZSwkY2xlYXI9dHJ1ZSkgewogICAgJGRzPSR0aGlzLT5fZ2V0ZHMoKTsKICAgIGlmICgkZHMhPT1mYWxzZSkgewogICAgICByZXR1cm4gJGRzLT5HZXRFcnJvcnMoJG5sMmJyLCRjbGVhcik7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gJHRoaXMtPkVycm9yKCJmdW5jdGlvbiBHZXRGaWVsZFNldDogQ2Fubm90IGFjY2VzcyBOZW9EYXRhU3RvcmFnZSBtb2R1bGUiKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIFNob3dEU0Vycm9ycygkY2xlYXI9dHJ1ZSkgewogICAgJGRzPSR0aGlzLT5fZ2V0ZHMoKTsKICAgIGlmICgkZHMhPT1mYWxzZSkgewogICAgICByZXR1cm4gJGRzLT5HZXRFcnJvcnMoJGNsZWFyKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAkdGhpcy0+RXJyb3IoImZ1bmN0aW9uIFNob3dEU0Vycm9yczogQ2Fubm90IGFjY2VzcyBOZW9EYXRhU3RvcmFnZSBtb2R1bGUiKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIERTSW5FcnJvcigpIHsKICAgICRkcz0kdGhpcy0+X2dldGRzKCk7CiAgICBpZiAoJGRzIT09ZmFsc2UpIHsKICAgICAgcmV0dXJuICRkcy0+SW5FcnJvcigpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICR0aGlzLT5FcnJvcigiZnVuY3Rpb24gRFNJbkVycm9yOiBDYW5ub3QgYWNjZXNzIE5lb0RhdGFTdG9yYWdlIG1vZHVsZSIpOwogICAgfQogIH0KCiAgLyoKICAgKgogICAqIFV0aWxpdHkgZnVuY3Rpb25zCiAgICoKICAgKi8KCiAgZnVuY3Rpb24gTmVvU2xhc2hlcygkdXJsKSB7CgkJJHJlc3VsdD1zdHJfcmVwbGFjZSgiXFwiLCIvIiwkdXJsKTsKICAgIC8vWWVzLCBwaHAgdW5kZXIgd2luZG93cyBydW5zIHBlcmZlY3RseSB3aXRoIHRob3NlIHNsYXNoZXMsIGFzIGxvbmcgYXMgeW91CiAgICAvL2Rvbid0IG1peCB0aGVtIHdpdGggYmFja3NsYXNoZXMhIQoJCS8vJHJlc3VsdD1zdHJfcmVwbGFjZSgiLyIsRElSRUNUT1JZX1NFUEFSQVRPUiwkdXJsKTsKCQkvL3JldHVybiBzdHJfcmVwbGFjZSgiXFwiLERJUkVDVE9SWV9TRVBBUkFUT1IsJHJlc3VsdCk7CgkJcmV0dXJuICRyZXN1bHQ7Cgl9CgogIGZ1bmN0aW9uIFNsYXNoZXMoJHVybCkgewogICAgcmV0dXJuICR0aGlzLT5OZW9TbGFzaGVzKCR1cmwpOwogIH0KCglmdW5jdGlvbiBTbGFzaCgkc3RyLCRzdHIyPSIiLCRzdHIzPSIiKSB7CgkJaWYgKCRzdHI9PSIiKSByZXR1cm4gJHN0cjI7CgkJaWYgKCRzdHIyPT0iIiAmJiAkc3RyMz09IiIpIHJldHVybiAkc3RyOwogICAgJHJlc3VsdD0iIjsKCQlpZiAoJHN0cltzdHJsZW4oJHN0ciktMV0hPSIvIikgewoJCQlpZiAoJHN0cjJbMF0hPSIvIikgewoJCQkJJHJlc3VsdD0kc3RyLiIvIi4kc3RyMjsKCQkJfSBlbHNlIHsKCQkJCSRyZXN1bHQ9JHN0ci4kc3RyMjsKCQkJfQoJCX0gZWxzZSB7CgkJCWlmICgkc3RyMlswXSE9Ii8iKSB7CgkJCQkkcmVzdWx0PSRzdHIuJHN0cjI7CgkJCX0gZWxzZSB7CgkJCQkkcmVzdWx0PSRzdHIuc3Vic3RyKCRzdHIyLDEpOyAvL3RyaW0gYXdheSBvbmUgb2YgdGhlIHNsYXNoZXMKCQkJfQoJCX0KICAgIGlmICgkc3RyMz09IiIpIHJldHVybiAkcmVzdWx0OwogICAgaWYgKCRyZXN1bHRbc3RybGVuKCRyZXN1bHQpLTFdIT0iLyIpIHsKCQkJaWYgKCRzdHIzWzBdIT0iLyIpIHsKCQkJCSRyZXN1bHQ9JHJlc3VsdC4iLyIuJHN0cjM7CgkJCX0gZWxzZSB7CgkJCQkkcmVzdWx0PSRyZXN1bHQuJHN0cjM7CgkJCX0KCQl9IGVsc2UgewoJCQlpZiAoJHN0cjNbMF0hPSIvIikgewoJCQkJJHJlc3VsdD0kcmVzdWx0LiRzdHIzOwoJCQl9IGVsc2UgewoJCQkJJHJlc3VsdD0kcmVzdWx0LnN1YnN0cigkc3RyMywxKTsgLy90cmltIGF3YXkgb25lIG9mIHRoZSBzbGFzaGVzCgkJCX0KCQl9CiAgICByZXR1cm4gJHJlc3VsdDsJCQoJfSAgCgogIGZ1bmN0aW9uIE5lb0Rpckxpc3QoJHJvb3QsJHJldHVybj0iZmlsZXMiLCRpbnRyb2R1Y3Rpb249YXJyYXkoKSwkZXhjbHVkZXM9YXJyYXkoKSwkbWF4cmVjdXJzaW9uPS0xKSB7CiAgICAkZGlybGlzdD1hcnJheSgpOwogICAgJGNvbmZpZz0kdGhpcy0+R2V0Q29uZmlnKCk7CiAgICAkbW9kZT0iIjsKICAgIHN3aXRjaCgkcmV0dXJuKSB7CiAgICAgIGNhc2UgImZpbGVzIjogJG1vZGU9IkZJTEVTIjticmVhazsKICAgICAgY2FzZSAiZGlycyI6ICRtb2RlPSJESVJTIjticmVhazsKICAgICAgY2FzZSAiYm90aCI6ICRtb2RlPSJGVUxMIjticmVhazsKICAgIH0KICAgICRmdWxscm9vdD0kdGhpcy0+U2xhc2goJGNvbmZpZ1sicm9vdF9wYXRoIl0sJHJvb3QpOwogICAgJGZpbGVyZWM9IGdldF9yZWN1cnNpdmVfZmlsZV9saXN0ICgkZnVsbHJvb3QsICRleGNsdWRlcyAsJG1heHJlY3Vyc2lvbiAsJG1vZGUpOyAvL05vIG1heGRlcHRoIGluIHJlY3Vyc2lvbgogICAgaWYgKCFlbXB0eSgkaW50cm9kdWN0aW9uKSkgewogICAgICAkZGlybGlzdD0kaW50cm9kdWN0aW9uOwogICAgfSAgICAKICAgIGZvcmVhY2goJGZpbGVyZWMgYXMgJGtleT0+JHZhbHVlKSB7CiAgICAgICR2YWx1ZTE9JHRoaXMtPlNsYXNoZXMoc3RyX3JlcGxhY2UoJGNvbmZpZ1sncm9vdF9wYXRoJ10sJycsJHZhbHVlKSk7CiAgICAgIC8vcHJldmVudCBjdXJyZW50IGRpciBmcm9tIHNob3dpbmcgdXAKICAgICAgLy9pZiAoJHZhbHVlMT09KCRwcm9maWxlWyJwYXRoIl0uIi8iKSkgY29udGludWU7CiAgICAgIC8vQ2hlY2sgZm9yIGhpZGRlbiBmaWxlcwogICAgICAkZGlycz1leHBsb2RlKCIvIiwkdmFsdWUxKTsKICAgICAgJGhpZGRlbj1mYWxzZTsKICAgICAgZm9yZWFjaCgkZGlycyBhcyAkZGlyKSB7CiAgICAgICAgaWYgKHN1YnN0cigkZGlyLDAsMSk9PSIuIikgeyRoaWRkZW49dHJ1ZTsgYnJlYWs7fQogICAgICB9CiAgICAgIGlmICgkaGlkZGVuKSBjb250aW51ZTsKCiAgICAgIC8vbm90IGhpZGRlbiwgYWRkIHRvIGxpc3QKICAgICAgJGRpcmxpc3RbJHZhbHVlMV09JHZhbHVlMTsKICAgIH0KICAgIHJldHVybiAkZGlybGlzdDsKICB9CgogIC8qQ2hlY2tzIGZvciB0aGUgZXhpc3RlbmNlIG9mIGFuIGluZGV4IGluIGFuIGFycmF5IGFuZCByZXR1cm4gdGhlIHZhbHVlIGlmIGl0J3MgdGhlcmUKICAgKmFuZCB0aGUgZGVmYXVsdCB2YWx1ZSBpZiBpdCdzIG5vdAogICovCiAgZnVuY3Rpb24gTmVvUGFyYW1WYWx1ZSgkbmFtZSwkcGFyYW1zPWFycmF5KCksJGRlZmF1bHQ9IiIpIHsKICAgIGlmIChlbXB0eSgkcGFyYW1zKSkgJHBhcmFtcz0kdGhpcy0+X3BhcmFtczsKICAgIGlmICghaXNfYXJyYXkoJG5hbWUpKSB7CiAgICAgIGlmIChpc3NldCgkcGFyYW1zWyRuYW1lXSkpIHJldHVybiAkcGFyYW1zWyRuYW1lXTsgICAgICAKICAgICAgcmV0dXJuICRkZWZhdWx0OwogICAgfSBlbHNlIHsKICAgICAgZm9yZWFjaCAoJG5hbWUgYXMgJHNpbmdsZW5hbWUpIHsKICAgICAgICBpZiAoaXNzZXQoJHBhcmFtc1skc2luZ2xlbmFtZV0pKSByZXR1cm4gJHBhcmFtc1skc2luZ2xlbmFtZV07CiAgICAgIH0KICAgICAgcmV0dXJuICRkZWZhdWx0OwogICAgfQogIH0KCiAgLy9TaG9ydGN1dCBmb3IgdGhlIGFib3ZlCiAgZnVuY3Rpb24gTlBWKCRuYW1lLCAkcGFyYW1zPWZhbHNlLCAkZGVmYXVsdD0iIikgewogICAgcmV0dXJuICR0aGlzLT5OZW9QYXJhbVZhbHVlKCRuYW1lLCAkcGFyYW1zLCAkZGVmYXVsdCk7CiAgfQoKICBGdW5jdGlvbiBOZW9BcHBseVBhcmFtVmFsdWVzKCR0aGlzYXJyYXksICRwYXJhbXM9YXJyYXkoKSwgJGluZGV4ZXM9YXJyYXkoKSwgJGFsd2F5c2ZpbGw9ZmFsc2UpIHsKICAgIGlmIChlbXB0eSgkcGFyYW1zKSkgJHBhcmFtcz0kdGhpcy0+X3BhcmFtczsKICAgIGlmIChlbXB0eSgkcGFyYW1zKSB8fCBlbXB0eSgkaW5kZXhlcykpIHJldHVybiAkdGhpc2FycmF5OwogICAgaWYgKGlzX2Fzc29jKCRpbmRleGVzKSkgewogICAgICBmb3JlYWNoKCRpbmRleGVzIGFzICRpbmRleD0+JGRlZmF1bHR2YWx1ZSkgewogICAgICAgIGlmIChpc3NldCgkcGFyYW1zWyRpbmRleF0pKSB7CiAgICAgICAgICAkdGhpc2FycmF5WyRpbmRleF09JHBhcmFtc1skaW5kZXhdOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAkdGhpc2FycmF5WyRpbmRleF09JGRlZmF1bHR2YWx1ZTsKICAgICAgICB9CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGZvcmVhY2goJGluZGV4ZXMgYXMgJGluZGV4KSB7ICAgICAgICAKICAgICAgICBpZiAoaXNzZXQoJHBhcmFtc1skaW5kZXhdKSkgewogICAgICAgICAgJHRoaXNhcnJheVskaW5kZXhdPSRwYXJhbXNbJGluZGV4XTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgaWYgKCRhbHdheXNmaWxsKSB7CiAgICAgICAgICAgIGlmICghaXNzZXQoJHRoaXNhcnJheVskaW5kZXhdKSkgJHRoaXNhcnJheVskaW5kZXhdPSIiOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogICAgLy9wcmludF9yKCR0aGlzYXJyYXkpOwogICAgcmV0dXJuICR0aGlzYXJyYXk7CiAgfQoKICBmdW5jdGlvbiBNYWtlU2ltcGxlQXJyYXkoJHRhYmxlLCRmaWVsZCwkYXNzb2NpZD10cnVlKSB7CiAgICAkZHM9JHRoaXMtPl9nZXRkcygpOwogICAgaWYgKCRkcyE9PWZhbHNlKSB7CiAgICAgIHJldHVybiAkZHMtPk1ha2VTaW1wbGVBcnJheSgkdGhpcy0+R2V0TmFtZSgpLCAkdGFibGUsICRmaWVsZCwgJGFzc29jaWQpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICR0aGlzLT5FcnJvcigiZnVuY3Rpb24gTWFrZVNpbXBsZUFycmF5OiBDYW5ub3QgYWNjZXNzIE5lb0RhdGFTdG9yYWdlIG1vZHVsZSIpOzsKICAgIH0KICB9CgogIGZ1bmN0aW9uIE1ha2VBc3NvY0FycmF5KCR0YWJsZSwkZmllbGRzKSB7CiAgICAkZHM9JHRoaXMtPl9nZXRkcygpOwogICAgaWYgKCRkcyE9PWZhbHNlKSB7CiAgICAgIHJldHVybiAkZHMtPk1ha2VBc3NvY0FycmF5KCR0aGlzLT5HZXROYW1lKCksICR0YWJsZSwgJGZpZWxkcyk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gJHRoaXMtPkVycm9yKCJmdW5jdGlvbiBNYWtlQXNzb2NBcnJheTogQ2Fubm90IGFjY2VzcyBOZW9EYXRhU3RvcmFnZSBtb2R1bGUiKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIENoZWNrRmlsZUV4dGVuc2lvbigkZmlsZW5hbWUsICRhbGxvd2VkZXh0ZW5zaW9ucz1hcnJheSgpKSB7CgkJJGV4cGxvZGVkZmlsZT1leHBsb2RlKCIuIiwkZmlsZW5hbWUpOwoJCSRleHQ9c3RydG9sb3dlcihhcnJheV9wb3AoJGV4cGxvZGVkZmlsZSkpOwoJCWlmIChpbl9hcnJheSgkZXh0LCRhbGxvd2VkZXh0ZW5zaW9ucykpIHJldHVybiB0cnVlOwogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgZnVuY3Rpb24gTmVvVG9vbFRpcCgkcGFyYW1zPWFycmF5KCkpIHsKICAgICR0ZXh0PSR0aGlzLT5OUFYoInRleHQiLCRwYXJhbXMsIj8iKTsKICAgICR1cmw9JHRoaXMtPk5QVigidXJsIiwkcGFyYW1zLCIiKTsKICAgICR0aXRsZT0kdGhpcy0+TlBWKCJ0aXRsZSIsJHBhcmFtcywiIik7CiAgICAkY29udGVudD0kdGhpcy0+TlBWKCJjb250ZW50IiwkcGFyYW1zLCIiKTsKICAgICRzcGFuY2xhc3M9JHRoaXMtPk5QVigic3BhbmNsYXNzIiwkcGFyYW1zLCJuZW90b29sdGlwIik7CiAgICBpZiAoJHVybCE9IiIpIHsKICAgICAgJHJlc3VsdD0nPGEgY2xhc3M9IicuJHNwYW5jbGFzcy4nIiBocmVmPSInLiR1cmwuJyI+JzsKICAgIH0gZWxzZSB7CiAgICAgICRyZXN1bHQ9JzxhIGNsYXNzPSInLiRzcGFuY2xhc3MuJyIgc3R5bGU9ImN1cnNvcjogZGVmYXVsdDsiIGhyZWY9IiMiIG9uY2xpY2s9InJldHVybiBmYWxzZTsiPic7CiAgICB9CiAgICAkcmVzdWx0Lj0kdGV4dDsKICAgICRyZXN1bHQuPSc8c3Bhbj4nOwogICAgaWYgKCR0aXRsZSE9IiIpIHsKICAgICAgJHJlc3VsdC49IjxzdHJvbmc+Ii4kdGl0bGUuIjwvc3Ryb25nPjxici8+IjsKICAgIH0KICAgICRyZXN1bHQuPSRjb250ZW50OwogICAgJHJlc3VsdC49Ijwvc3Bhbj4iOwogICAgJHJlc3VsdC49IjwvYT4iOyAgICAgICAgIAogICAgcmV0dXJuICRyZXN1bHQ7CiAgfQoKICBmdW5jdGlvbiBOZW9FbXB0eSgkaW5kZXg9IiIsJGRhdGE9YXJyYXkoKSkgewogICAgaWYgKCFpc19hcnJheSgkZGF0YSkpIHJldHVybiB0cnVlOwogICAgaWYgKGVtcHR5KCRkYXRhKSkgewogICAgICAkZGF0YT0kdGhpcy0+X3BhcmFtczsKICAgIH0KICAgIGlmIChlbXB0eSgkZGF0YSkpIHJldHVybiB0cnVlOyAgICAgICAKICAgIGlmICgkaW5kZXg9PSIiKSByZXR1cm4gdHJ1ZTsKICAgIGlmICghaXNzZXQoJGRhdGFbJGluZGV4XSkpIHJldHVybiB0cnVlOwogICAgaWYgKHRyaW0oJGRhdGFbJGluZGV4XSk9PSIiKSByZXR1cm4gdHJ1ZTsKICAgIHJldHVybiBmYWxzZTsKICB9CgogIGZ1bmN0aW9uIE5lb1ZhbGlkYXRlRW1haWwoJGVtYWlsKSB7CiAgICByZXR1cm4gKHByZWdfbWF0Y2goJy9eW15AXStAW2EtekEtWjAtOS5fLV0rXC5bYS16QS1aXSskL2knLCAkZW1haWwpPjApOwogIH0KCiAgZnVuY3Rpb24gTmVvTm9CcmVha3MoJHN0cmluZykgewogICAgJHN0cmluZz1zdHJfcmVwbGFjZSgiICIsIiZuYnNwOyIsJHN0cmluZyk7CiAgICByZXR1cm4gJHN0cmluZzsKICB9CgogIGZ1bmN0aW9uIE5lb1ByaW50UigkZGF0YT1hcnJheSgpLCRzZW5kb3V0PXRydWUpIHsKICAgIGlmIChlbXB0eSgkZGF0YSkpIHsKICAgICAgJGRhdGE9JHRoaXMtPl9wYXJhbXM7CiAgICB9CiAgICBpZiAoZW1wdHkoJGRhdGEpKSB7CiAgICAgICRkYXRhPSJubyBjb250ZW50IGZvdW5kIjsKICAgIH0KICAgICRvdXRwdXQ9Jzxici8+PGRpdiBzdHlsZT0iYm9yZGVyOjFweCBzb2xpZCBibGFjayI+JzsKICAgICRvdXRwdXQuPSI8cHJlPiI7CiAgICAkb3V0cHV0Lj1wcmludF9yKCRkYXRhLHRydWUpOwogICAgJG91dHB1dC49IjwvcHJlPiI7CiAgICAkb3V0cHV0Lj0iPC9kaXY+PGJyLz4iOwogICAgaWYgKCRzZW5kb3V0KSB7CiAgICAgIGVjaG8gJG91dHB1dDsKICAgIH0KICAgIHJldHVybiAkb3V0cHV0OwogIH0KCiAgLyoKICAgKgogICAqIFNtYXJ0eSBzaG9ydGN1dHMKICAgKgogICAqLwogIGZ1bmN0aW9uIFNtYXJ0eUFzc2lnbigkc21hcnR5aW5mbywgJHNtYXJ0eWNvbnRlbnQ9IiIpIHsKICAgIGlmICghaXNfYXJyYXkoJHNtYXJ0eWluZm8pKSB7CiAgICAgIGlmICgkc21hcnR5aW5mbyE9IiIgJiYgJHNtYXJ0eWNvbnRlbnQhPSIiKSB7CiAgICAgICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCRzbWFydHlpbmZvLCAkc21hcnR5Y29udGVudCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKCRzbWFydHlpbmZvPT0iIikgewogICAgICAgICAgcmV0dXJuICR0aGlzLT5FcnJvcigiZnVuY3Rpb24gU21hcnR5QXNzaWduOiBzbWFydHktdmFybmFtZSBub3Qgc2V0IixmYWxzZSxhcnJheSgic21hcnR5aW5mbyI9PiRzbWFydHlpbmZvLCJzbWFydHljb250ZW50Ij0+JHNtYXJ0eWNvbnRlbnQpKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICAvL09rIGl0J3MgYW4gYXJyYXkKICAgIGlmIChpc19hc3NvYygkc21hcnR5aW5mbykpIHsKICAgICAgLy9JdCdzIGFuIGFzc29jX2FycmF5LCBzbyB3ZSBhc3NpZ24gZXZlcnkgc2luZ2xlIHBhaXIgb2YgaW5mbwogICAgICBmb3JlYWNoKCRzbWFydHlpbmZvIGFzICRzbWFydHluYW1lPT4kc21hcnR5Y29udGVudCkgewogICAgICAgIGlmIChpc19hcnJheSgkc21hcnR5Y29udGVudCkpIHsKICAgICAgICAgIC8vaXQncyBhIG5lc3RlZCBhcnJheQogICAgICAgICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduX2J5X3JlZigkc21hcnR5bmFtZSwgJHNtYXJ0eWNvbnRlbnQpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJHNtYXJ0eW5hbWUsICRzbWFydHljb250ZW50KTsKICAgICAgICB9CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIC8vSXQncyBub3QgYW4gYXNzb2NfYXJyYXksIHNvIHdlIHNpbXBseSByZWYtYXNzaWduIGl0LgogICAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ25fYnlfcmVmKCRzbWFydHlpbmZvLCAkc21hcnR5Y29udGVudCk7CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIGZ1bmN0aW9uIE5lb1NtYXJ0eUFzc2lnbigkc21hcnR5aW5mbywgJHNtYXJ0eWNvbnRlbnQ9IiIpIHsKICAgICR0aGlzLT5TbWFydHlBc3NpZ24oJHNtYXJ0eWluZm8sICRzbWFydHljb250ZW50KTsKICB9CgogIGZ1bmN0aW9uIFNtYXJ0eUFzc2lnblByZWYoJHNtYXJ0eW5hbWUsICRwcmVmZXJlbmNlbmFtZT0iIikgewogICAgaWYgKCRwcmVmZXJlbmNlbmFtZSE9IiIpIHsKICAgICAgJHRoaXMtPlNtYXJ0eUFzc2lnbigkc21hcnR5bmFtZSwgJHRoaXMtPlByZWYoJHByZWZlcmVuY2VuYW1lKSk7CiAgICB9IGVsc2UgewogICAgICAkdGhpcy0+U21hcnR5QXNzaWduKCRzbWFydHluYW1lLCAkdGhpcy0+UHJlZigkc21hcnR5bmFtZSkpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gU21hcnR5QXNzaWduQ01TKCRtb2R1bGUsJHNtYXJ0eW5hbWU9Im1vZHVsZSIpIHsKICAgIGlmIChpc19vYmplY3QoJG1vZHVsZSkpIHsKICAgICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduX2J5X3JlZigkc21hcnR5bmFtZSwgJG1vZHVsZSk7CiAgICB9IGVsc2UgewogICAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ25fYnlfcmVmKCRzbWFydHluYW1lLCAkdGhpcy0+R2V0TW9kdWxlSW5zdGFuY2UoJG1vZHVsZSkpOwogICAgfQogIH0KCiAgLyoKICAgKgogICAqIERlYnVnZ2luZyBmdW5jdGlvbnMKICAgKgogICAqLwoKICBmdW5jdGlvbiBGaXJlRGVidWcoJGNvbW1hbmQsJG1lc3NhZ2U9IiIsJHZhcmlhYmxlcz1hcnJheSgpKSB7CiAgICAkZmlyZXBocG1vZHVsZT0kdGhpcy0+R2V0TW9kdWxlSW5zdGFuY2UoJ0ZpcmVQSFBEZWJ1ZycpOwogICAgaWYgKCRmaXJlcGhwbW9kdWxlKSB7CiAgICAgIC8vTW9kdWxlIGZvdW5kCiAgICAgICRmaXJlcGhwbW9kdWxlLT5TZXRNb2R1bGVOYW1lKCR0aGlzLT5HZXROYW1lKCkpOwogICAgICAkZmlyZXBocG1vZHVsZS0+Q29tbWFuZCgkY29tbWFuZCwgJG1lc3NhZ2UsICR2YXJpYWJsZXMpOwogICAgfSAvL2Vsc2UgTW9kdWxlIG5vdCBmb3VuZH0KICB9CgoKICAvKgogICAqCiAgICogRXJyb3IgaGFuZGxpbmcKICAgKgogICAqLwogIGZ1bmN0aW9uIEVycm9yKCRlcnJvcnRleHQsJHJldHVybnZhbHVlPWZhbHNlLCRwYXJhbXM9YXJyYXkoKSkgewogICAgJHRoaXMtPl9lcnJvcnMuPSR0ZXh0OwogICAgaWYgKCFlbXB0eSgkcGFyYW1zKSAmJiBpc19hcnJheSgkcGFyYW1zKSkgewogICAgICAkdGhpcy0+X2Vycm9ycy49IiAoIjsKICAgICAgJGZpcnN0PXRydWU7IC8vSGFuZGxpbmcgdGhlIGNvbW1hCiAgICAgIGZvcmVhY2ggKCRwYXJhbXMgYXMgJHBhcmFtPT4kdmFsdWUpIHsKICAgICAgICBpZiAoJGZpcnN0KSAkZmlyc3Q9ZmFsc2U7IGVsc2UgJHRoaXMtPl9lcnJvcnMuPSIsIjsKICAgICAgICAkdGhpcy0+X2Vycm9ycy49JHBhcmFtLiI9PiIuJHZhbHVlOwogICAgICB9CiAgICAgICR0aGlzLT5fZXJyb3JzLj0iKSI7CiAgICB9CiAgICAkdGhpcy0+X2Vycm9ycy49IlxuIjsKICAgIHJldHVybiAkcmV0dXJudmFsdWU7CiAgfQoKICBmdW5jdGlvbiBHZXRFcnJvcnMoJG5sMmJyPXRydWUsJGNsZWFyPXRydWUsJGluY2x1ZGVkcz10cnVlKSB7CiAgICAkZXJyb3JzPSR0aGlzLT5fZXJyb3JzOwogICAgaWYgKCRubDJicikgewogICAgICAkZXJyb3JzPW5sMmJyKCRlcnJvcnMpOwogICAgfQogICAgaWYgKCRpbmNsdWRlZHMpIHsKICAgICAgaWYgKCR0aGlzLT5EU0luRXJyb3IoKSkgewogICAgICAgICRlcnJvcnMuPSR0aGlzLT5HZXREU0Vycm9ycygkbmwyYnIsJGNsZWFyKTsKICAgICAgfQogICAgfQogICAgaWYgKCRjbGVhcikgewogICAgICAkdGhpcy0+X2Vycm9ycz0iIjsKICAgIH0KICAgIHJldHVybiAkZXJyb3JzOwogIH0KCiAgZnVuY3Rpb24gT3V0cHV0RXJyb3JzKCRjbGVhcj10cnVlLCRpbmNsdWRlZHM9dHJ1ZSkgewogICAgaWYgKCR0aGlzLT5JbkVycm9yKCkpIHsKICAgICAgZWNobyAiXG5cbjxkaXYgc3R5bGU9J2JvcmRlcjozcHggc29saWQgcmVkPlxuIjsKICAgICAgZWNobyAkdGhpcy0+R2V0RXJyb3JzKHRydWUsJGNsZWFyLCRpbmNsdWRlZHMpOwogICAgICBlY2hvICJcbjwvZGl2PlxuXG4iOwogICAgfQogIH0KCiAgZnVuY3Rpb24gSW5FcnJvcigpIHsKICAgIHJldHVybiAoJHRoaXMtPl9lcnJvcnMhPSIiKTsKICB9Cgp9Cj8+Cg==]]></data>
	</file>
	<file>
	  <filename>/templates/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/templates/changelog.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PHVsPgo8bGk+dmVyc2lvbiAwLjIuNDxici8+CkFkZGVkIE5lb0VtcHR5LWZ1bmN0aW9uIHdoaWNoIGNoZWNrcyBmb3IgYW4gaW5kZXggaW4gYW4gYXJyYXkKPGJyLz4KTWFkZSBOZW9QcmludFIgb3V0cHV0IGNvbnRlbnQgb2YgJF9wYXJhbXMgaWYgbm8gcGFyYW1ldGVyIHdhcyBnaXZlbgo8YnIvPkFkZGVkIE5lb1ZhbGlkYXRlRW1haWwtZnVuY3Rpb24KPGJyLz5BZGRlZCBOZW9Ob0JyZWFrcy1mdW5jdGlvbgoKPGxpPnZlcnNpb24gMC4yLjM8YnIvPgpOb3cgcG9zc2libGUgdG8gcmVnaXN0ZXIgJHBhcmFtcyBmb3IgZXZlbiBlYXNpZXIgc3ludGF4IGluIHJlbGV2YW50IGZ1bmN0aW9ucyBsaWtlIE5QVgo8YnIvPgpBZGRlZCBDcmVhdGVJbnB1dFBhc3N3b3JkLXdyYXBwZXIKPGJyLz4KQWRkZWQgZmlsbCBwYXJhbWV0ZXIgdG8gU2V0RW50aXR5UHJvcHNGcm9tQXJyYXkKCgo8bGk+dmVyc2lvbiAwLjIuMjxici8+CkFkZGVkIGEgY3VzdG9tIHJldHVybnZhbHVlIHRvIGNoZWNrZW50aXR5Y29ubmVjdGlvbnMKPGJyLz4KSW1wbGVtZW50ZWQgTWFrZVNpbXBsZUFycmF5Cjxici8+CkFkZGVkIE5lb1RydWVJY29uIGFuZCAgTmVvVHJ1ZUljb24gCgo8bGk+dmVyc2lvbiAwLjIuMTxici8+CmFkZGVkIGFycmF5X2RpZmZfa2V5IGltcGxlbWVudGF0aW9uIGZvciBwcmUtNS4xLjAgdmVyc2lvbgo8YnIvPgpBZGRlZCAkYWx3YXlzcmV0dXJuYXJyYXk9ZmFsc2UgdG8gR2V0RW50aXRpZXMoRnVsbCktbWV0aG9kcwo8YnIvPgpBZGRlZCBTbWFydEFzc2lnblByZWYtbWV0aG9kCjxici8+CkFkZGVkIFRvb2x0aXAtU3VwcG9ydAo8YnIvPgpBZGRlZCBOZW9SZWRpcmVjdC1mdW5jdGlvbgoKICA8bGk+dmVyc2lvbiAwLjIuMDxici8+Ci0gZ2VuZXJhbCBidWdmaXhpbmc8YnIvPgotIEFkZGVkIGEgTmVvRGlyTGlzdC1mdW5jdGlvbjxici8+Ci0gRml4ZWQgbmFtZSBlcnJvciBvbiBOZW9JbnB1dERyb3Bkb3duPGJyLz4KLSBhZGRlZCBzdXBwb3J0IGZvciAzcmQgcGFyYW1ldGVyIHRvIFNsYXNoLWZ1bmN0aW9uPGJyLz4KLSBhZGRlZCBOZW9DbXNMaW5rIGFuZCBOZW9DbXNVcmwgc2hvcnRjdXRzPGJyLz4KLSBhZGRlZCBTbWFydHlVcGxvYWRGb3JtU3RhcnQ8YnIvPgotIGFkZGVkIFNtYXJ0eUlucHV0TXVsdGlIaWRkZW48YnIvPgoKICA8L2xpPgogIDxsaT52ZXJzaW9uIDAuMS4wPGJyLz4KICAgLSBpbml0aWFsIHJlbGVhc2U8L2xpPgo8L3VsPg==]]></data>
	</file>
	<file>
	  <filename>/templates/help.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PHN0cm9uZz5Ob3RpY2UhIFRoaXMgaXMgYSBtb2R1bGUtZGV2ZWxvcGVyLW9ubHkgbW9kdWxlLiBJZiB5b3UgYXJlIG5vdCBhIGRldmVsb3Blcgp5b3UnbGwgcHJvYmFibHkganVzdCB3YW50IHRvIHNraXAgdGhlIGdvcnkgZGV0YWlscyBvZiB0aGlzIHBhZ2UgYW5kIHJlbHkgb24gdGhhdAp0aGUgbW9kdWxlIGp1c3QgZG9lcyBpdCdzIHdvcmsuPC9zdHJvbmc+CjxoMz5QdXJwb3NlIG9mIHRoZSBtb2R1bGU8L2gzPgpUaGUgcHVycG9zZSBvZiB0aGlzIG1vZHVsZSBpcyB0byBjdXQgb2ZmIG9uIGRldmVsb3BtZW50dGltZSBwcm92aWRpbmcgc29tZQplYXN5IHRvIHVzZSBmdW5jdGlvbnMgZXh0ZW5kaW5nIHRoZSBtb2R1bGUtQVBJIG9mIENNUyBNYWRlIFNpbXBsZS4gVGhpcyBpbmNsdWRlcywKYnV0IGlzIG5vIGxpbWl0ZWQgdG8sIHNob3J0Y3V0cyB0byBOZW9EYXRhU3RvcmFnZS1mdW5jaW9uYWxpdHksIGEgY291cGxlIG9mIG5pY2UKU21hcnR5LXNob3J0Y3V0cywgRmlyZVBIUC1pbnRlZ3JhdGlvbiBldGMuCjxoMz5Vc2FnZSBvZiB0aGUgbW9kdWxlPC9oMz4KVG8gdXNlIHRoaXMgZXh0ZW5kZWQgbW9kdWxlLWNsYXNzIHlvdSBzaG91bGQgaW5oZXJpdCBmcm9tIE5lb01vZHVsZS1jbGFzcyBpbnN0ZWFkCm9mIHRoZSB1c3VhbCBDTVNNb2R1bGUtY2xhc3MuIFRoaXMgY2FuIGJlIGRvbmUgbGlrZSB0aGlzOgo8cHJlPgpyZXF1aXJlX29uY2UoZGlybmFtZShkaXJuYW1lKF9fRklMRV9fKSkuIi9OZW9Nb2R1bGUvTmVvTW9kdWxlLm1vZHVsZS5waHAiKTsKY2xhc3MgTXlNb2R1bGUgZXh0ZW5kcyBOZW9Nb2R1bGUgewo8L3ByZT4KSWYgeW91IHdpc2ggdG8gdXNlIHRoZSBOZXdEYXRhU3RvcmFnZSBmdW5jdGlvbmFsaXR5LCB5b3Ugc2hvdWxkIG9mIGNvdXJzZSBhbHNvCmluc3RhbGwgdGhhdCBtb2R1bGUuCjxoMz5Ib3cgdG8gZ2V0IGhlbHA8L2gzPgpJIHdpbGwgcmVwZWF0LCB0aGlzIG1vZHVsZSBpcyBmb3IgZGV2ZWxvcGVycyBvbmx5LiBJZiB5b3UgY2Fubm90IHJlYWQgcGhwLXNvdXJjZSBjb2RlLAp5b3Ugc2hvdWxkIHVzZSBpdCBmb3IgZGV2ZWxvcG1lbnQgYW55d2F5LiBJZiB5b3UgY2FuLCBhbHdheXMgY2hlY2sgb3V0IHRoZSBjb2RlIApmb3IgaGludHMgb24gaG93IHRvIG1ha2UgaXQgd29yay4gSWYgeW91IHN0aWxsIGhhdmUgcXVlc3Rpb25zIG9yIHN1Z2dlc3Rpb25zIGZvcgpmaXhlcy9pbXByb3ZlbWVudHMsIHBsZWFzZSBmZWVsIGZyZWUgdG8gY2F0Y2ggbWUgKFNpbG1hcmlsbGlvbikgaW4gdGhlIGZvcnVtIG9nICNpcmMuCgo8aDM+TGlzdCBvZiBtZXRob2RzPC9oMz4KSSB3aWxsIHRyeSB0byBrZWVwIHRoaXMgbGlzdCB1cHRvZGF0ZSwgYnV0IGZvciBtb3N0IHJlY2VudCBsaXN0LCBwbGVhc2UKY2hlY2sgdGhlIE5lb01vZHVsZS5tb2R1bGUucGhwLWZpbGUgaXRzZWxmLiBTb21lIGRvY3VtZW50YXRpb24gb2YgdGhlIG1ldGhvZHMKbWF5IGV2ZW4gc25lYWsgaW4gdGhlcmUgc29tIGRheS4KPHByZT4KLyoKICoKICogU2V0dXAgZnVuY3Rpb25zCiAqCiAqLwoKZnVuY3Rpb24gU2V0SWQoJGlkKQpmdW5jdGlvbiBOZW9TZXRJZCgkaWQpCgoKICAvKgogICAqCiAgICogR2VuZXJhbCBzaG9ydGN1dCBmdW5jdGlvbnMKICAgKgogICAqLwpmdW5jdGlvbiBQcmVmKCRwcmVmbmFtZSwkZGVmYXVsdD0iIikKZnVuY3Rpb24gTmVvQ21zTGluaygkcGFyYW1zPWFycmF5KCkpCmZ1bmN0aW9uIE5lb0Ntc1VybCgkcGFyYW1zPWFycmF5KCkpCmZ1bmN0aW9uIE5lb1JlZGlyZWN0KCRwYXJhbXM9YXJyYXkoKSkKLyoKICoKICogRm9ybS1nZW5lcmF0aW9uIGZ1bmN0aW9ucwogKgogKi8KCmZ1bmN0aW9uIE5lb0Zvcm1TdGFydCgkcGFyYW1zPWFycmF5KCkpCmZ1bmN0aW9uIE5lb0Zvcm1FbmQoJHBhcmFtcz1hcnJheSgpKQpmdW5jdGlvbiBOZW9JbnB1dFRleHQoJHBhcmFtcz1hcnJheSgpCmZ1bmN0aW9uIE5lb1RleHRhcmVhKCRwYXJhbXM9YXJyYXkoKSkKZnVuY3Rpb24gTmVvSW5wdXRDaGVja2JveCgkcGFyYW1zPWFycmF5KCkpCmZ1bmN0aW9uIE5lb0lucHV0U3VibWl0KCRwYXJhbXM9YXJyYXkoKSkKZnVuY3Rpb24gTmVvSW5wdXRSZXNldCgkcGFyYW1zPWFycmF5KCkpCmZ1bmN0aW9uIE5lb0lucHV0SW5wdXREcm9wZG93bigkcGFyYW1zPWFycmF5KCkpCgovKiBmdW5jdGlvbiBiZWxvdyBpbmNsdWRlIHNtYXJ0eWFzc2lnbm1lbnQsIGRvZXMgbm90IHJldHVybiBhbnl0aGluZyAqLwpmdW5jdGlvbiBTbWFydHlGb3JtU3RhcnQoJHNtYXJ0eW5hbWUsJHBhcmFtcz1hcnJheSgpKQpmdW5jdGlvbiBTbWFydHlVcGxvYWRGb3JtU3RhcnQoJHNtYXJ0eW5hbWUsJHBhcmFtcz1hcnJheSgpKQpmdW5jdGlvbiBTbWFydHlGb3JtRW5kKCRzbWFydHluYW1lKQpmdW5jdGlvbiBTbWFydHlJbnB1dFN1Ym1pdCgkc21hcnR5bmFtZSwkbmFtZSwkdGV4dCwkY29uZmlybXRleHQ9IiIpCmZ1bmN0aW9uIFNtYXJ0eUlucHV0SGlkZGVuKCRzbWFydHluYW1lLCRuYW1lLCR2YWx1ZSkKZnVuY3Rpb24gU21hcnR5SW5wdXRNdWx0aUhpZGRlbigkc21hcnR5bmFtZSwkZmllbGRzPWFycmF5KCkpCgovKgogKgogKiBOZW9EYXRhU3RvcmFnZSBzaG9ydGN1dHMKICoKICovCmZ1bmN0aW9uIEFkZEVudGl0eSgkdGFibGUsICRwcm9wcz1hcnJheSgpKQpmdW5jdGlvbiBEZWxldGVFbnRpdHkoJGlkKQpmdW5jdGlvbiBHZXRFbnRpdHkoJGlkLCAkb3ZlcnJpZGVwcm9wcz1hcnJheSgpKQpmdW5jdGlvbiBHZXRFbnRpdGllcygkdGFibGU9IiIsICRjcml0ZXJpYT1hcnJheSgpLCAkYWx3YXlzcmV0dXJuYXJyYXk9ZmFsc2UpCmZ1bmN0aW9uIEdldE9uZUVudGl0eSgkdGFibGUsICRjcml0ZXJpYT1hcnJheSgpLCAkZmFpbGlmbXVsdGlwbGU9ZmFsc2UpCmZ1bmN0aW9uIEdldEVudGl0aWVzRnVsbCgkdGFibGU9IiIsICRjcml0ZXJpYT1hcnJheSgpLCAkYWx3YXlzcmV0dXJuYXJyYXk9ZmFsc2UpCmZ1bmN0aW9uIFNldEVudGl0eVByb3AoJGlkLCRwcm9wbmFtZSwkcHJvcHZhbHVlLCRwcm9wdHlwZT0idW5kZWZpbmVkIikKZnVuY3Rpb24gQ2xlYXJFbnRpdHlQcm9wKCRpZCwgJHByb3BuYW1lKQpmdW5jdGlvbiBTZXRFbnRpdHlQcm9wcygkaWQsICRwcm9wcywgJGNsZWFyPXRydWUpCmZ1bmN0aW9uIFNldEVudGl0eVByb3BzRnJvbUFycmF5KCRpZCwgJHByb3BzLCAkdmFsdWVzLCAkY2xlYXI9dHJ1ZSwgJGZpbGw9ZmFsc2UpCmZ1bmN0aW9uIFNldEVudGl0eVByb3BzT25Dcml0ZXJpYSgkdGFibGUsICRwcm9wcywgJGNyaXRlcmlhLCAkY3JlYXRlPXRydWUsICRjbGVhcj1mYWxzZSkgLy9Eb2VzIG5vdCB3b3JrCmZ1bmN0aW9uIFJlc2V0RW50aXR5UHJvcHMoJGlkLCAkbmV3cHJvcHM9YXJyYXkoKSkKZnVuY3Rpb24gUmVtb3ZlTW9kdWxlRW50aXRpZXMoKQpmdW5jdGlvbiBDbGVhckVudGl0eVByb3BzKCRpZCkKZnVuY3Rpb24gQ29tcGFyZUVudGl0aWVzKCRlbnRpdHkxLCAkZW50aXR5MiwgJHNvcnRmaWVsZCkKZnVuY3Rpb24gQ29tcGFyZUVudGl0aWVzQ29tcGxleCgkZW50aXR5MSwgJGVudGl0eTIsICRzb3J0ZmllbGRzKQpmdW5jdGlvbiBTb3J0RW50aXRpZXMoJGxpc3QsICRzb3J0ZmllbGRzKQpmdW5jdGlvbiBFbnRpdGllc0NvdW50KCR0YWJsZT0iIiwgJGNyaXRlcmlhPWFycmF5KCkpCmZ1bmN0aW9uIENsZWFyTW9kdWxlRW50aXRpZXMoKQpmdW5jdGlvbiBTZXRFbnRpdHlDb25uZWN0aW9uKCRpZDEsICRpZDIsICR0eXBlPSIiKQpmdW5jdGlvbiBDbGVhckVudGl0eUNvbm5lY3Rpb25zKCRpZDEsICRpZDI9LTEsICR0eXBlPSIiKQpmdW5jdGlvbiBDbGVhckVudGl0eUNvbm5lY3Rpb24oJGlkMSwgJGlkMiwgJHR5cGU9IiIpCmZ1bmN0aW9uIENoZWNrRW50aXR5Q29ubmVjdGlvbigkaWQxLCRpZDIsJHR5cGU9IiIsJHJldHVybnZhbHVlPXRydWUpCmZ1bmN0aW9uIEdldEVudGl0eUNvbm5lY3Rpb25zKCRpZDEsICRpZDI9LTEsICR0eXBlPSIiKQpmdW5jdGlvbiBBZGRGaWVsZFNldCgkbmFtZSwkZmllbGRzKQpmdW5jdGlvbiBHZXRGaWVsZFNldCgkbmFtZSkKZnVuY3Rpb24gRW50aXR5U2V0VW5zZXRQcm9wcygkZW50aXR5LCRmaWVsZHNldCwkZmlsbHZhbHVlPSIiKSB7CmZ1bmN0aW9uIEdldERTRXJyb3JzKCRubDJicj10cnVlLCRjbGVhcj10cnVlKQpmdW5jdGlvbiBPdXRwdXREU0Vycm9ycygkY2xlYXI9dHJ1ZSkKZnVuY3Rpb24gRFNJbkVycm9yKCkKZnVuY3Rpb24gTWFrZVNpbXBsZUFycmF5KCR0YWJsZSwkZmllbGQpCmZ1bmN0aW9uIE1ha2VBc3NvY0FycmF5KCR0YWJsZSwkZmllbGRzKQoKCi8qCiAqCiAqIExpbmsgYW5kIGljb24gZnVuY3Rpb25zCiAqCiAqLwoKZnVuY3Rpb24gTmVvRGVsZXRlSWNvbigkYWN0aW9uLCR0ZXh0LCRwYXJhbXM9YXJyYXkoKSwkY29uZmlybWF0aW9uPSIiKQpmdW5jdGlvbiBOZW9Db3B5SWNvbigkYWN0aW9uLCR0ZXh0LCRwYXJhbXM9YXJyYXkoKSwkY29uZmlybWF0aW9uPSIiKQpmdW5jdGlvbiBOZW9FZGl0SWNvbigkYWN0aW9uLCR0ZXh0LCRwYXJhbXM9YXJyYXkoKSwkY29uZmlybWF0aW9uPSIiKQpmdW5jdGlvbiBOZW9BZGRJY29uKCRhY3Rpb24sJHRleHQsJHBhcmFtcz1hcnJheSgpLCRjb25maXJtYXRpb249IiIpCmZ1bmN0aW9uIE5lb1RydWVJY29uKCRhY3Rpb24sJHRleHQsJHBhcmFtcz1hcnJheSgpLCRjb25maXJtYXRpb249IiIpCmZ1bmN0aW9uIE5lb0ZhbHNlSWNvbigkYWN0aW9uLCR0ZXh0LCRwYXJhbXM9YXJyYXkoKSwkY29uZmlybWF0aW9uPSIiKQpmdW5jdGlvbiBOZW9TeXN0ZW1JY29uKCRpY29uLCR0ZXh0PSIiKQoKLyoKICoKICogVXRpbGl0eSBmdW5jdGlvbnMKICoKICovCmZ1bmN0aW9uIE5lb1NsYXNoZXMoJHVybCkKZnVuY3Rpb24gU2xhc2goJHN0ciwkc3RyMj0iIiwkc3RyMz0iIikKZnVuY3Rpb24gU2xhc2hlcygkdXJsKQpmdW5jdGlvbiBpc19hc3NvYygkYXJyYXkpCmZ1bmN0aW9uIE5lb0Rpckxpc3QoJHJvb3QsJHdoYXQ9ImZpbGVzIiwkaW50cm9kdWN0aW9uPWFycmF5KCksJGV4Y2x1ZGVzPWFycmF5KCkpCgovKkNoZWNrcyBmb3IgdGhlIGV4aXN0ZW5jZSBvZiBhbiBpbmRleCBpbiBhbiBhcnJheSBhbmQgcmV0dXJuIHRoZSB2YWx1ZSBpZiBpdCdzIHRoZXJlCiAqYW5kIHRoZSBkZWZhdWx0IHZhbHVlIGlmIGl0J3Mgbm90CiovCmZ1bmN0aW9uIE5lb1BhcmFtVmFsdWUoJG5hbWUsJHBhcmFtcywkZGVmYXVsdD0iIikKCi8vU2hvcnRjdXQgZm9yIHRoZSBhYm92ZQpmdW5jdGlvbiBOUFYoJG5hbWUsICRwYXJhbXMpCmZ1bmN0aW9uIE5lb0FwcGx5UGFyYW1WYWx1ZXMoJHRoaXNhcnJheSwgJHBhcmFtcywgJGluZGV4ZXMsICRhbHdheXNmaWxsPWZhbHNlKQpmdW5jdGlvbiBDaGVja0ZpbGVFeHRlbnNpb24oJGZpbGVuYW1lLCAkYWxsb3dlZGV4dGVuc2lvbnM9YXJyYXkoKSkKCi8vRm9yIG5vdywgcmVhZCBzb3VyY2UgdG8gdW5kZXJzdGFuZApmdW5jdGlvbiBOZW9Ub29sVGlwKCRwYXJhbXM9YXJyYXkoKSkgLy9yZXF1aXJlcyAyIGNzcy1jbGFzc2VzIHRvIGJlIHNldCB1cAoKLy9DaGVja3MgYm90aCB3aGV0aGVyIHRoZSBpbmRleCBleGlzdHMgaW4gdGhlIGFycmF5IGFuZCB3aGV0aGVyIGl0IGhhcyBhIHZhbHVlIGRpZmZlcmVudCBmb21yIG5vdGhpbmcgb3Qgb25seSBzcGFjZXMKZnVuY3Rpb24gTmVvRW1wdHkoJGluZGV4PSIiLCRkYXRhPWFycmF5KCkpCgovL1ZhbGlkYXRlcyBhbiBlbWFpbGFkcmVzcwpmdW5jdGlvbiBOZW9WYWxpZGF0ZUVtYWlsKCRlbWFpbCkKCi8vUmV0dXJucyBhIHZlcnNpb24gb2YgdGhlIHN0cmluZyB3aGljaCBjYW5ub3QgKHBlcmhhcHMpIGJlIGxpbmUtYnJva2VuCmZ1bmN0aW9uIE5lb05vQnJlYWtzKCRzdHJpbmcpCgovL3NhbWUgYXMgcHJpbnRfciwgYnV0IHdyYXBzIGluIDxwcmU+J3MgYW5kIGluIGEgZGl2IHRyeWluZyB0byBtYWtlIGl0IG1vcmUgcmVhZGFibGUKZnVuY3Rpb24gTmVvUHJpbnRSKCRkYXRhPWFycmF5KCksJHNlbmRvdXQ9dHJ1ZSkKCi8qCiAqCiAqIFNtYXJ0eSBzaG9ydGN1dHMKICoKICovCmZ1bmN0aW9uIFNtYXJ0eUFzc2lnbigkc21hcnR5aW5mbywgJHNtYXJ0eWNvbnRlbnQ9IiIpCmZ1bmN0aW9uIFNtYXJ0eUFzc2lnblByZWYoJHNtYXJ0eW5hbWUsICRwcmVmZXJlbmNlbmFtZT0iIikgewpmdW5jdGlvbiBTbWFydHlBc3NpZ25DTVMoJG1vZHVsZSwkdmFybmFtZT0iY21zIikKZnVuY3Rpb24gU21hcnR5VXBsb2FkRm9ybVN0YXJ0KCRzbWFydHluYW1lLCRwYXJhbXM9YXJyYXkoKSkgewoKLyoKICoKICogRGVidWdnaW5nIGZ1bmN0aW9ucwogKgogKi8KZnVuY3Rpb24gRmlyZURlYnVnKCRjb21tYW5kLCRtZXNzYWdlPSIiLCR2YXJpYWJsZXM9YXJyYXkoKSkKCi8qCiAqCiAqIEVycm9yIGhhbmRsaW5nCiAqCiAqLwpmdW5jdGlvbiBFcnJvcigkZXJyb3J0ZXh0LCRyZXR1cm52YWx1ZT1mYWxzZSwkcGFyYW1zPWFycmF5KCkpCmZ1bmN0aW9uIEdldEVycm9ycygkbmwyYnI9dHJ1ZSwkY2xlYXI9dHJ1ZSwkaW5jbHVkZWRzPXRydWUpCmZ1bmN0aW9uIE91dHB1dEVycm9ycygkY2xlYXI9dHJ1ZSwkaW5jbHVkZWRzPXRydWUpCmZ1bmN0aW9uIEluRXJyb3IoKQo8L3ByZT4=]]></data>
	</file>
</module>
