<?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>Orm</name>
	<version>0.3.0</version>
  <mincmsversion>1.11.0</mincmsversion>
	<help><![CDATA[PGgzPldoYXQgRG9lcyBUaGlzIERvPzwvaDM+CjxwPm1vcmUgaW5mb3JtYXRpb25zIG9uIDogPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2Jlc3N0aW9sbGUvb3JtLW1zIiB0YXJnZXQ9Il9ibGFuayI+aHR0cHM6Ly9naXRodWIuY29tL2Jlc3N0aW9sbGUvb3JtLW1zPC9hPjwvcD4KPGgzPlBhcmFtZXRlcnM8L2gzPjx1bD48bGk+PGVtPihvcHRpb25hbCk8L2VtPiBsYW5nPSJlbl9VUyIgLSBQYXJhbWV0ZXIgaXMgdXNlZCB0byBzcGVjaWZ5IHdoYXQgbGFuZ3VhZ2UgdG8gdXNlIGZvciBkaXNwbGF5IG9uIHRoZSBmcm9udGVuZC4gTm90IGFsbCBtb2R1bGVzIHN1cHBvcnQgb3IgbmVlZCB0aGlzLjwvbGk+PC91bD4=]]></help>
	<about><![CDATA[PGJyIC8+QXV0aG9yOiBLZXZpbiBEYW5lemlzIChha2EgQmVzcykgJmx0O2NvbnRhY3QgYXQgZnVyaWUgcG9pbnQgYmUmZ3Q7PGJyIC8+PGJyIC8+VmVyc2lvbjogMC4zLjA8YnIgLz48YnIgLz5DaGFuZ2UgSGlzdG9yeTo8YnIgLz5zZWUgY2hhbmdlbG9nIDogPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2Jlc3N0aW9sbGUvb3JtLW1zIiB0YXJnZXQ9Il9ibGFuayI+aHR0cHM6Ly9naXRodWIuY29tL2Jlc3N0aW9sbGUvb3JtLW1zPC9hPjxiciAvPg==]]></about>
	<description><![CDATA[This module implements a small ORM layer for other modules]]></description>
	<file>
	  <filename>/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/action.admin_check.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCmlmICghZnVuY3Rpb25fZXhpc3RzKCJjbXNtcyIpKSBleGl0OwoKLy9GaW5kIGFsbCBtb2R1bGUgT1JNLWxpa2UKJG1vZG9wcyA9IGNtc21zKCktPkdldE1vZHVsZU9wZXJhdGlvbnMoKTsKJGFsbG1vZHMgID0gJG1vZG9wcy0+RmluZEFsbE1vZHVsZXMoKTsKJGluc3RhbmNlT3JtID0gYXJyYXkoKTsKZm9yZWFjaCAoJGFsbG1vZHMgYXMgJG1vZCkgewoJJGluc3RhbmNlID0gJG1vZG9wcy0+Z2V0X21vZHVsZV9pbnN0YW5jZSgkbW9kKTsKCWlmKGNsYXNzX2V4aXN0cygkbW9kKSAmJiAgaW5fYXJyYXkoJHRoaXMtPkdldE5hbWUoKSxjbGFzc19wYXJlbnRzKCRtb2QpKSl7CQkKCQkkaW5zdGFuY2VPcm1bJG1vZF0gPSAkaW5zdGFuY2U7Cgl9Cn0KCiR0ZW1wbmFtZSA9ICdYWFhYWFhYWFhYWCc7CiRkZXNjWFhRdWVyeSA9ICJkZXNjICIuJHRlbXBuYW1lOwoKCiRsaXN0SW5zdGFuY2UgPSBhcnJheSgpOwpmb3JlYWNoICgkaW5zdGFuY2VPcm0gYXMgJG1vZHVsZU5hbWUgPT4gJG1vZHVsZSkgewoJJGxpc3RSZXN1bHRYWCA9IGFycmF5KCk7CgkkbGlzdFJlc3VsdERCID0gYXJyYXkoKTsKCSRsaXN0RW1wdHlUYWJsZSA9IGFycmF5KCk7CgoJJGluc3RhbmNlID0gbmV3ICRtb2R1bGVOYW1lOwoJJGxpc3RlID0gJGluc3RhbmNlLT5zY2FuKCk7CgkkZW50aXRlcyA9ICRsaXN0ZVsnZW50aXRpZXMnXTsKCWZvcmVhY2ggKCRlbnRpdGVzIGFzICRlbnRpdGUpIHsKCQkkb2JqID0gbmV3ICRlbnRpdGVbJ2NsYXNzbmFtZSddKCk7CgkJJGRlc2NEQlF1ZXJ5ID0gImRlc2MgIi4kb2JqLT5nZXREYm5hbWUoKTsKCQkkZmluZERCUXVlcnkgPSAiU0hPVyBUQUJMRVMgTElLRSAnIi4kb2JqLT5nZXREYm5hbWUoKS4iJyI7CgoJCSRyZXN1bHQgPSBPcm1EYjo6ZXhlY3V0ZSgkZmluZERCUXVlcnksIG51bGwsICRlcnJvck1zZyA9ICJGaW5kIFRhYmxlIFF1ZXJ5IGVycm9yIik7CgkJJGxpc3RFbXB0eVRhYmxlWyRlbnRpdGVbJ2NsYXNzbmFtZSddXSA9ICcnOwoJCWlmKGVtcHR5KCRyZXN1bHQtPkdldEFycmF5KCkpKXsKCQkJJGxpc3RFbXB0eVRhYmxlWyRlbnRpdGVbJ2NsYXNzbmFtZSddXSA9ICRvYmotPmdldERibmFtZSgpOwoJCQljb250aW51ZTsKCQl9IAoKCQkkaHFsID0gT3JtQ29yZTo6X2dldEZpZWxkc1RvSHFsKCRvYmopOwoJCU9ybURiOjpkcm9wVGFibGUoJHRlbXBuYW1lKTsKCQlPcm1EYjo6Y3JlYXRlVGFibGUoJHRlbXBuYW1lLCAkaHFsKTsKCgkJLy9XZSBtYW5hZ2UgdGhlICgidW5pcXVlIikgaW5kZXhlcwoJCSRpbmRleGVzID0gJG9iai0+Z2V0SW5kZXhlcygpOwoKCQkvL0ZvciBlYWNoIEZpZWxkIGNvbnRhaW5lZCBpbiB0aGUgZW50aXR5CgkJZm9yZWFjaCgkaW5kZXhlcyBhcyAkaW5kZXgpIHsKCQkJJHJlc3VsdCA9IE9ybURiOjpjcmVhdGVJbmRleCgkdGVtcG5hbWUsICRpbmRleFsnZmllbGRzJ10sICRpbmRleFsndW5pcXVlJ10pOwoJCX0KCgkJJHJlc3VsdFhYID0gT3JtRGI6OmV4ZWN1dGUoJGRlc2NYWFF1ZXJ5LCBudWxsLCAkZXJyb3JNc2cgPSAiRGVzY3JpcHRpb24gb24gdGFibGUgJyIuJHRlbXBuYW1lLiInIHByb2R1Y2UgYW4gZXJyb3IiKTsKCQkkcmVzdWx0REIgPSBPcm1EYjo6ZXhlY3V0ZSgkZGVzY0RCUXVlcnksIG51bGwsICRlcnJvck1zZyA9ICJEZXNjcmlwdGlvbiBvbiB0YWJsZSAnIi4kb2JqLT5nZXREYm5hbWUoKS4iJyBwcm9kdWNlIGFuIGVycm9yIik7CgkJCgkJJGFycmF5WFggPSAkcmVzdWx0WFgtPkdldEFzc29jKCk7CgkJJGFycmF5REIgPSAkcmVzdWx0REItPkdldEFzc29jKCk7CgoJCSRkZXNjWFggPSBwcmludF9yKCRhcnJheVhYLCB0cnVlKTsKCQkkZGVzY0RCID0gcHJpbnRfcigkYXJyYXlEQiwgdHJ1ZSk7CgoJCSRsaXN0UmVzdWx0WFhbJGVudGl0ZVsnY2xhc3NuYW1lJ11dID0gJGRlc2NYWDsKCQkkbGlzdFJlc3VsdERCWyRlbnRpdGVbJ2NsYXNzbmFtZSddXSA9ICRkZXNjREI7CgoJfQoJCgkkbGlzdEluc3RhbmNlWyRtb2R1bGVOYW1lXSA9IGFycmF5KCdsaXN0UmVzdWx0WFgnID0+ICRsaXN0UmVzdWx0WFgsCgkJCQkJCQkJJ2xpc3RSZXN1bHREQicgPT4gJGxpc3RSZXN1bHREQiwKCQkJCQkJCQknbGlzdEVtcHR5VGFibGUnID0+ICRsaXN0RW1wdHlUYWJsZQoJCQkJCQkJCSk7Cn0KCk9ybURiOjpkcm9wVGFibGUoJHRlbXBuYW1lKTsKCiRzbWFydHktPmFzc2lnbignbGlzdEluc3RhbmNlJywgJGxpc3RJbnN0YW5jZSk7CiRzbWFydHktPmFzc2lnbignYmFjaycsICR0aGlzLT5DcmVhdGVMaW5rICgkaWQsICdkZWZhdWx0YWRtaW4nLCBudWxsLCAnJyxhcnJheSgpLCcnLHRydWUpKTsKCgplY2hvICR0aGlzLT5Qcm9jZXNzVGVtcGxhdGUoJ2FkbWluX2NoZWNrLnRwbCcpOwoKPz4KCgoK]]></data>
	</file>
	<file>
	  <filename>/action.admin_generate.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCmlmICghZnVuY3Rpb25fZXhpc3RzKCJjbXNtcyIpKSBleGl0OwoKLy9saXN0ZSBvZiB0YWJsZQokZmluZERCUXVlcnkgPSAiU0hPVyBUQUJMRVMiOwokcmVzdWx0ID0gT3JtRGI6OmV4ZWN1dGUoJGZpbmREQlF1ZXJ5LCBudWxsLCAkZXJyb3JNc2cgPSAiRmluZCBUYWJsZXMgUXVlcnkgZXJyb3IiKTsKJHRhYmxlcyA9ICRyZXN1bHQtPkdldEFycmF5KCk7CiRzdHJpbmdLZXkgPSBudWxsOwokaXRlbXMgPSBhcnJheSgnUGxlYXNlIHNlbGVjdCBvbmUgU1FMIHRhYmxlJyA9PiAnJyk7CmZvcmVhY2ggKCR0YWJsZXMgYXMgJHRhYmxlKSB7CglpZigkc3RyaW5nS2V5ID09IG51bGwpewoJCSRzdHJpbmdLZXkgPSBhcnJheV9rZXlzKCR0YWJsZSk7CgkJJHN0cmluZ0tleSA9ICRzdHJpbmdLZXlbMF07Cgl9CgoJJGl0ZW1zWyR0YWJsZVskc3RyaW5nS2V5XV0gPSAkdGFibGVbJHN0cmluZ0tleV07Cn0KJHBhcmFtVGFibGVOYW1lID0gbnVsbDsKaWYoaXNzZXQoJHBhcmFtc1sndGFibGVOYW1lJ10pICYmICFlbXB0eSgkcGFyYW1zWyd0YWJsZU5hbWUnXSkpewoJJHBhcmFtVGFibGVOYW1lID0gJHBhcmFtc1sndGFibGVOYW1lJ107Cn0KCiRzbWFydHktPmFzc2lnbignZHJvcGRvd24nLCAkdGhpcy0+Q3JlYXRlSW5wdXREcm9wZG93biAoJGlkLCAndGFibGVOYW1lJywgJGl0ZW1zLCBudWxsLCAkcGFyYW1UYWJsZU5hbWUpKTsKJHNtYXJ0eS0+YXNzaWduKCdmb3JtU3RhcnQnLCAkdGhpcy0+Q3JlYXRlRm9ybVN0YXJ0KCRpZCwgJ2FkbWluX2dlbmVyYXRlJywgJHJldHVybmlkKSk7CiRzbWFydHktPmFzc2lnbignY2FuY2VsJywgJHRoaXMtPkNyZWF0ZUxpbmsgKCRpZCwgJ2RlZmF1bHRhZG1pbicsICRyZXR1cm5pZCwgJycsIGFycmF5KCksICcnLCB0cnVlKSk7CgovL0lmIGEgd3JvbmcgdmFsdWUgaXMgcGFzc2VkIGluIHRoZSBwb3N0IHZhbHVlCmlmKCFhcnJheV9rZXlfZXhpc3RzKCRwYXJhbVRhYmxlTmFtZSwgJGl0ZW1zKSl7CgllY2hvICR0aGlzLT5Qcm9jZXNzVGVtcGxhdGUoJ2FkbWluX2dlbmVyYXRlLnRwbCcpOwoJcmV0dXJuOwp9CgoKJGRlc2NRdWVyeSA9ICJkZXNjICIuJHBhcmFtVGFibGVOYW1lOwokcmVzdWx0UXVlcnkgPSBPcm1EYjo6ZXhlY3V0ZSgkZGVzY1F1ZXJ5LCBudWxsLCAkZXJyb3JNc2cgPSAiRGVzY3JpcHRpb24gb24gdGFibGUgJyIuJHBhcmFtVGFibGVOYW1lLiInIHByb2R1Y2UgYW4gZXJyb3IiKTsKJGFycmF5UXVlcnkgPSAkcmVzdWx0UXVlcnktPkdldEFzc29jKCk7CmVjaG8gIjxwcmU+IjsKZWNobyB2YXJfZHVtcCgkYXJyYXlRdWVyeSk7CmVjaG8gIjwvcHJlPiI7CgokZmllbGRzID0gYXJyYXkoKTsKZm9yZWFjaCAoJGFycmF5UXVlcnkgYXMgJGtleSA9PiAkdmFsdWVzKSB7CgoJaWYoc3RycG9zKCR2YWx1ZXNbJ1R5cGUnXSwgJygnKSl7CgkJCgl9CgoJJGZpZWxkc1ska2V5XSA9IGFycmF5KCk7Cn0KCgokc21hcnR5LT5hc3NpZ24oJ291dHB1dCcsICRmaWVsZHMpOwoKZWNobyAkdGhpcy0+UHJvY2Vzc1RlbXBsYXRlKCdhZG1pbl9nZW5lcmF0ZS50cGwnKTsKPz4=]]></data>
	</file>
	<file>
	  <filename>/action.admin_save.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCmlmICghZnVuY3Rpb25fZXhpc3RzKCJjbXNtcyIpKSBleGl0OwoKaWYgKGlzc2V0KCRwYXJhbXNbJ2RlbGV0ZUxvZyddKSl7CglpZihmaWxlX2V4aXN0cyhPcm1UcmFjZTo6Z2V0TG9nRmlsZSgpKSl7CgkJdW5saW5rKE9ybVRyYWNlOjpnZXRMb2dGaWxlKCkpOwoJfQoJT3JtVHJhY2U6OmluZm8oIlJlaW5pdGlhdGUgdGhlIGxvZyBmaWxlIik7Cn0gZWxzZWlmIChpc3NldCgkcGFyYW1zWydkZWxldGVDYWNoZSddKSl7CgoJJGNhY2hlID0gT3JtQ2FjaGU6OmdldEluc3RhbmNlKCk7CgkkY2FjaGUtPmNsZWFyQ2FjaGUoKTsKCU9ybVRyYWNlOjppbmZvKCJSZWluaXRpYXRlIHRoZSBjYWNoZSBjb250ZW50Iik7Cn0gZWxzZSBpZiAoaXNzZXQoJHBhcmFtc1snbGV2ZWwnXSkgfHwgaXNzZXQoJHBhcmFtc1snY2FjaGUnXSkgKXsKCSR0aGlzLT5TZXRQcmVmZXJlbmNlKCdsb2dsZXZlbCcsICRwYXJhbXNbJ2xldmVsJ10pOwoJJHRoaXMtPlNldFByZWZlcmVuY2UoJ2NhY2hlVHlwZScsICRwYXJhbXNbJ2NhY2hlJ10pOwoJCgkvL1dlIHJlbG9hZCB0aGUgY2FjaGUgYW55d2F5CgkkY2FjaGUgPSBPcm1DYWNoZTo6Z2V0SW5zdGFuY2UoKTsKCSRjYWNoZS0+Y2xlYXJDYWNoZSgpOwoJCglPcm1UcmFjZTo6aW5mbygiSW5pdGlhdGUgdGhlIGNhY2hlIGNvbnRlbnQiKTsKfQoKJHRoaXMtPnJlZGlyZWN0KCRpZCwnZGVmYXVsdGFkbWluJyk7CgoKPz4=]]></data>
	</file>
	<file>
	  <filename>/action.defaultadmin.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCmlmICghZnVuY3Rpb25fZXhpc3RzKCJjbXNtcyIpKSBleGl0OwoKLy9DT05TVEFOVEVTCiRpdGVtc0xvZyA9IGFycmF5KCJERUJVRyI9Pk9ybVRyYWNlOjokREVCVUcsICJJTkZPIj0+T3JtVHJhY2U6OiRJTkZPLCJXQVJOIj0+T3JtVHJhY2U6OiRXQVJOLCJFUlJPUiI9Pk9ybVRyYWNlOjokRVJST1IpOwokaXRlbXNDYWNoZSA9IGFycmF5KCJOT05FIj0+T3JtQ2FjaGU6OiROT05FLCAiU0NSSVBUIj0+T3JtQ2FjaGU6OiRTQ1JJUFQpOwoKJGN1cnJlbnRMZXZlbExvZyA9ICR0aGlzLT5HZXRQcmVmZXJlbmNlKCdsb2dsZXZlbCcsIE9ybVRyYWNlOjokSU5GTyk7CiRjdXJyZW50VHlwZUNhY2hlID0gJHRoaXMtPkdldFByZWZlcmVuY2UoJ2NhY2hlVHlwZScsIE9ybUNhY2hlOjokTk9ORSk7CgovL0luaXRpYXRlIHRoZSBmaWxlIG9mIGxvZwppZighZmlsZV9leGlzdHMoT3JtVHJhY2U6OmdldExvZ0ZpbGUoKSkpewoJT3JtVHJhY2U6OmluZm8oIkluaXRpYXRlIHRoZSBsb2cgZmlsZSIpOzsKfQoKJGNoZWNrVXJsID0gJHRoaXMtPkNyZWF0ZUxpbmsgKCRpZCwgJ2FkbWluX2NoZWNrJywgbnVsbCwgJycsYXJyYXkoKSwnJyx0cnVlKTsKJGdlbmVyYXRlVXJsID0gJHRoaXMtPkNyZWF0ZUxpbmsgKCRpZCwgJ2FkbWluX2dlbmVyYXRlJywgbnVsbCwgJycsYXJyYXkoKSwnJyx0cnVlKTsKCiRzbWFydHkgPSBjbXNtcygpLT5HZXRTbWFydHkoKTsKJHNtYXJ0eS0+YXNzaWduKCJpZCIsJGlkKTsKJHNtYXJ0eS0+YXNzaWduKCJmb3Jtc3RhcnQiLCR0aGlzLT5DcmVhdGVGb3JtU3RhcnQoJGlkLCAnYWRtaW5fc2F2ZScpKTsKJHNtYXJ0eS0+YXNzaWduKCJjaGVja1VybCIsJGNoZWNrVXJsKTsKJHNtYXJ0eS0+YXNzaWduKCJnZW5lcmF0ZVVybCIsJGdlbmVyYXRlVXJsKTsKJHNtYXJ0eS0+YXNzaWduKCJzdWJtaXQiLCR0aGlzLT5DcmVhdGVJbnB1dFN1Ym1pdCAoJGlkLCAnc3VibWl0JywgJ1NhdmUgUHJlZnMnKSk7CiRzbWFydHktPmFzc2lnbigiZGVsZXRlTG9nIiwkdGhpcy0+Q3JlYXRlSW5wdXRTdWJtaXQgKCRpZCwgJ2RlbGV0ZUxvZycsICdDbGVhbiBMb2dzJykpOwokc21hcnR5LT5hc3NpZ24oImRlbGV0ZUNhY2hlIiwkdGhpcy0+Q3JlYXRlSW5wdXRTdWJtaXQgKCRpZCwgJ2RlbGV0ZUNhY2hlJywgJ0NsZWFuIENhY2hlJykpOwokc21hcnR5LT5hc3NpZ24oInNlbGVjdExvZyIsICR0aGlzLT5DcmVhdGVJbnB1dERyb3Bkb3duICgkaWQsICdsZXZlbCcsICRpdGVtc0xvZywgLTEsICRjdXJyZW50TGV2ZWxMb2cpKTsKJHNtYXJ0eS0+YXNzaWduKCJzZWxlY3RDYWNoZSIsICR0aGlzLT5DcmVhdGVJbnB1dERyb3Bkb3duICgkaWQsICdjYWNoZScsICRpdGVtc0NhY2hlLCAtMSwgJGN1cnJlbnRUeXBlQ2FjaGUpKTsKCiRzbWFydHktPmFzc2lnbigidXJsTG9nIiwgT3JtVHJhY2U6OmdldExvZ1VybCgpKTsKCmVjaG8gJHRoaXMtPlByb2Nlc3NUZW1wbGF0ZSgnYWRtaW4udHBsJyk7CgoKPz4=]]></data>
	</file>
	<file>
	  <filename>/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[]]></data>
	</file>
	<file>
	  <filename>/js/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/js/difflib.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqKgpUaGlzIGlzIHBhcnQgb2YganNkaWZmbGliIHYxLjAuIDxodHRwOi8vc25vd3RpZGUuY29tL2pzZGlmZmxpYj4KCkNvcHlyaWdodCAoYykgMjAwNywgU25vd3RpZGUgSW5mb3JtYXRpY3MgU3lzdGVtcywgSW5jLgpBbGwgcmlnaHRzIHJlc2VydmVkLgoKUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgoKCSogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzCgkJbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCgkqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKCQl0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCgkJYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCgkqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFNub3d0aWRlIEluZm9ybWF0aWNzIFN5c3RlbXMgbm9yIHRoZSBuYW1lcyBvZiBpdHMKCQljb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCgkJc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCgpUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQpFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQKU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEClRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgpBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSApEQU1BR0UuCioqKi8KLyogQXV0aG9yOiBDaGFzIEVtZXJpY2sgPGNlbWVyaWNrQHNub3d0aWRlLmNvbT4gKi8KdmFyIF9fd2hpdGVzcGFjZSA9IHsiICI6dHJ1ZSwgIlx0Ijp0cnVlLCAiXG4iOnRydWUsICJcZiI6dHJ1ZSwgIlxyIjp0cnVlfTsKCnZhciBkaWZmbGliID0gewoJZGVmYXVsdEp1bmtGdW5jdGlvbjogZnVuY3Rpb24gKGMpIHsKCQlyZXR1cm4gX193aGl0ZXNwYWNlLmhhc093blByb3BlcnR5KGMpOwoJfSwKCQoJc3RyaXBMaW5lYnJlYWtzOiBmdW5jdGlvbiAoc3RyKSB7IHJldHVybiBzdHIucmVwbGFjZSgvXltcblxyXSp8W1xuXHJdKiQvZywgIiIpOyB9LAoJCglzdHJpbmdBc0xpbmVzOiBmdW5jdGlvbiAoc3RyKSB7CgkJdmFyIGxmcG9zID0gc3RyLmluZGV4T2YoIlxuIik7CgkJdmFyIGNycG9zID0gc3RyLmluZGV4T2YoIlxyIik7CgkJdmFyIGxpbmVicmVhayA9ICgobGZwb3MgPiAtMSAmJiBjcnBvcyA+IC0xKSB8fCBjcnBvcyA8IDApID8gIlxuIiA6ICJcciI7CgkJCgkJdmFyIGxpbmVzID0gc3RyLnNwbGl0KGxpbmVicmVhayk7CgkJZm9yICh2YXIgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykgewoJCQlsaW5lc1tpXSA9IGRpZmZsaWIuc3RyaXBMaW5lYnJlYWtzKGxpbmVzW2ldKTsKCQl9CgkJCgkJcmV0dXJuIGxpbmVzOwoJfSwKCQoJLy8gaXRlcmF0aW9uLWJhc2VkIHJlZHVjZSBpbXBsZW1lbnRhdGlvbgoJX19yZWR1Y2U6IGZ1bmN0aW9uIChmdW5jLCBsaXN0LCBpbml0aWFsKSB7CgkJaWYgKGluaXRpYWwgIT0gbnVsbCkgewoJCQl2YXIgdmFsdWUgPSBpbml0aWFsOwoJCQl2YXIgaWR4ID0gMDsKCQl9IGVsc2UgaWYgKGxpc3QpIHsKCQkJdmFyIHZhbHVlID0gbGlzdFswXTsKCQkJdmFyIGlkeCA9IDE7CgkJfSBlbHNlIHsKCQkJcmV0dXJuIG51bGw7CgkJfQoJCQoJCWZvciAoOyBpZHggPCBsaXN0Lmxlbmd0aDsgaWR4KyspIHsKCQkJdmFsdWUgPSBmdW5jKHZhbHVlLCBsaXN0W2lkeF0pOwoJCX0KCQkKCQlyZXR1cm4gdmFsdWU7Cgl9LAoJCgkvLyBjb21wYXJpc29uIGZ1bmN0aW9uIGZvciBzb3J0aW5nIGxpc3RzIG9mIG51bWVyaWMgdHVwbGVzCglfX250dXBsZWNvbXA6IGZ1bmN0aW9uIChhLCBiKSB7CgkJdmFyIG1sZW4gPSBNYXRoLm1heChhLmxlbmd0aCwgYi5sZW5ndGgpOwoJCWZvciAodmFyIGkgPSAwOyBpIDwgbWxlbjsgaSsrKSB7CgkJCWlmIChhW2ldIDwgYltpXSkgcmV0dXJuIC0xOwoJCQlpZiAoYVtpXSA+IGJbaV0pIHJldHVybiAxOwoJCX0KCQkKCQlyZXR1cm4gYS5sZW5ndGggPT0gYi5sZW5ndGggPyAwIDogKGEubGVuZ3RoIDwgYi5sZW5ndGggPyAtMSA6IDEpOwoJfSwKCQoJX19jYWxjdWxhdGVfcmF0aW86IGZ1bmN0aW9uIChtYXRjaGVzLCBsZW5ndGgpIHsKCQlyZXR1cm4gbGVuZ3RoID8gMi4wICogbWF0Y2hlcyAvIGxlbmd0aCA6IDEuMDsKCX0sCgkKCS8vIHJldHVybnMgYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdHJ1ZSBpZiBhIGtleSBwYXNzZWQgdG8gdGhlIHJldHVybmVkIGZ1bmN0aW9uCgkvLyBpcyBpbiB0aGUgZGljdCAoanMgb2JqZWN0KSBwcm92aWRlZCB0byB0aGlzIGZ1bmN0aW9uOyByZXBsYWNlcyBiZWluZyBhYmxlIHRvCgkvLyBjYXJyeSBhcm91bmQgZGljdC5oYXNfa2V5IGluIHB5dGhvbi4uLgoJX19pc2luZGljdDogZnVuY3Rpb24gKGRpY3QpIHsKCQlyZXR1cm4gZnVuY3Rpb24gKGtleSkgeyByZXR1cm4gZGljdC5oYXNPd25Qcm9wZXJ0eShrZXkpOyB9OwoJfSwKCQoJLy8gcmVwbGFjZW1lbnQgZm9yIHB5dGhvbidzIGRpY3QuZ2V0IGZ1bmN0aW9uIC0tIG5lZWQgZWFzeSBkZWZhdWx0IHZhbHVlcwoJX19kaWN0Z2V0OiBmdW5jdGlvbiAoZGljdCwga2V5LCBkZWZhdWx0VmFsdWUpIHsKCQlyZXR1cm4gZGljdC5oYXNPd25Qcm9wZXJ0eShrZXkpID8gZGljdFtrZXldIDogZGVmYXVsdFZhbHVlOwoJfSwJCgkKCVNlcXVlbmNlTWF0Y2hlcjogZnVuY3Rpb24gKGEsIGIsIGlzanVuaykgewoJCXRoaXMuc2V0X3NlcXMgPSBmdW5jdGlvbiAoYSwgYikgewoJCQl0aGlzLnNldF9zZXExKGEpOwoJCQl0aGlzLnNldF9zZXEyKGIpOwoJCX0KCQkKCQl0aGlzLnNldF9zZXExID0gZnVuY3Rpb24gKGEpIHsKCQkJaWYgKGEgPT0gdGhpcy5hKSByZXR1cm47CgkJCXRoaXMuYSA9IGE7CgkJCXRoaXMubWF0Y2hpbmdfYmxvY2tzID0gdGhpcy5vcGNvZGVzID0gbnVsbDsKCQl9CgkJCgkJdGhpcy5zZXRfc2VxMiA9IGZ1bmN0aW9uIChiKSB7CgkJCWlmIChiID09IHRoaXMuYikgcmV0dXJuOwoJCQl0aGlzLmIgPSBiOwoJCQl0aGlzLm1hdGNoaW5nX2Jsb2NrcyA9IHRoaXMub3Bjb2RlcyA9IHRoaXMuZnVsbGJjb3VudCA9IG51bGw7CgkJCXRoaXMuX19jaGFpbl9iKCk7CgkJfQoJCQoJCXRoaXMuX19jaGFpbl9iID0gZnVuY3Rpb24gKCkgewoJCQl2YXIgYiA9IHRoaXMuYjsKCQkJdmFyIG4gPSBiLmxlbmd0aDsKCQkJdmFyIGIyaiA9IHRoaXMuYjJqID0ge307CgkJCXZhciBwb3B1bGFyZGljdCA9IHt9OwoJCQlmb3IgKHZhciBpID0gMDsgaSA8IGIubGVuZ3RoOyBpKyspIHsKCQkJCXZhciBlbHQgPSBiW2ldOwoJCQkJaWYgKGIyai5oYXNPd25Qcm9wZXJ0eShlbHQpKSB7CgkJCQkJdmFyIGluZGljZXMgPSBiMmpbZWx0XTsKCQkJCQlpZiAobiA+PSAyMDAgJiYgaW5kaWNlcy5sZW5ndGggKiAxMDAgPiBuKSB7CgkJCQkJCXBvcHVsYXJkaWN0W2VsdF0gPSAxOwoJCQkJCQlkZWxldGUgYjJqW2VsdF07CgkJCQkJfSBlbHNlIHsKCQkJCQkJaW5kaWNlcy5wdXNoKGkpOwoJCQkJCX0KCQkJCX0gZWxzZSB7CgkJCQkJYjJqW2VsdF0gPSBbaV07CgkJCQl9CgkJCX0KCQoJCQlmb3IgKHZhciBlbHQgaW4gcG9wdWxhcmRpY3QpIHsKCQkJCWlmIChwb3B1bGFyZGljdC5oYXNPd25Qcm9wZXJ0eShlbHQpKSB7CgkJCQkJZGVsZXRlIGIyaltlbHRdOwoJCQkJfQoJCQl9CgkJCQoJCQl2YXIgaXNqdW5rID0gdGhpcy5pc2p1bms7CgkJCXZhciBqdW5rZGljdCA9IHt9OwoJCQlpZiAoaXNqdW5rKSB7CgkJCQlmb3IgKHZhciBlbHQgaW4gcG9wdWxhcmRpY3QpIHsKCQkJCQlpZiAocG9wdWxhcmRpY3QuaGFzT3duUHJvcGVydHkoZWx0KSAmJiBpc2p1bmsoZWx0KSkgewoJCQkJCQlqdW5rZGljdFtlbHRdID0gMTsKCQkJCQkJZGVsZXRlIHBvcHVsYXJkaWN0W2VsdF07CgkJCQkJfQoJCQkJfQoJCQkJZm9yICh2YXIgZWx0IGluIGIyaikgewoJCQkJCWlmIChiMmouaGFzT3duUHJvcGVydHkoZWx0KSAmJiBpc2p1bmsoZWx0KSkgewoJCQkJCQlqdW5rZGljdFtlbHRdID0gMTsKCQkJCQkJZGVsZXRlIGIyaltlbHRdOwoJCQkJCX0KCQkJCX0KCQkJfQoJCgkJCXRoaXMuaXNianVuayA9IGRpZmZsaWIuX19pc2luZGljdChqdW5rZGljdCk7CgkJCXRoaXMuaXNicG9wdWxhciA9IGRpZmZsaWIuX19pc2luZGljdChwb3B1bGFyZGljdCk7CgkJfQoJCQoJCXRoaXMuZmluZF9sb25nZXN0X21hdGNoID0gZnVuY3Rpb24gKGFsbywgYWhpLCBibG8sIGJoaSkgewoJCQl2YXIgYSA9IHRoaXMuYTsKCQkJdmFyIGIgPSB0aGlzLmI7CgkJCXZhciBiMmogPSB0aGlzLmIyajsKCQkJdmFyIGlzYmp1bmsgPSB0aGlzLmlzYmp1bms7CgkJCXZhciBiZXN0aSA9IGFsbzsKCQkJdmFyIGJlc3RqID0gYmxvOwoJCQl2YXIgYmVzdHNpemUgPSAwOwoJCQl2YXIgaiA9IG51bGw7CgkJCXZhciBrOwoJCgkJCXZhciBqMmxlbiA9IHt9OwoJCQl2YXIgbm90aGluZyA9IFtdOwoJCQlmb3IgKHZhciBpID0gYWxvOyBpIDwgYWhpOyBpKyspIHsKCQkJCXZhciBuZXdqMmxlbiA9IHt9OwoJCQkJdmFyIGpkaWN0ID0gZGlmZmxpYi5fX2RpY3RnZXQoYjJqLCBhW2ldLCBub3RoaW5nKTsKCQkJCWZvciAodmFyIGprZXkgaW4gamRpY3QpIHsKCQkJCQlpZiAoamRpY3QuaGFzT3duUHJvcGVydHkoamtleSkpIHsKCQkJCQkJaiA9IGpkaWN0W2prZXldOwoJCQkJCQlpZiAoaiA8IGJsbykgY29udGludWU7CgkJCQkJCWlmIChqID49IGJoaSkgYnJlYWs7CgkJCQkJCW5ld2oybGVuW2pdID0gayA9IGRpZmZsaWIuX19kaWN0Z2V0KGoybGVuLCBqIC0gMSwgMCkgKyAxOwoJCQkJCQlpZiAoayA+IGJlc3RzaXplKSB7CgkJCQkJCQliZXN0aSA9IGkgLSBrICsgMTsKCQkJCQkJCWJlc3RqID0gaiAtIGsgKyAxOwoJCQkJCQkJYmVzdHNpemUgPSBrOwoJCQkJCQl9CgkJCQkJfQoJCQkJfQoJCQkJajJsZW4gPSBuZXdqMmxlbjsKCQkJfQoJCgkJCXdoaWxlIChiZXN0aSA+IGFsbyAmJiBiZXN0aiA+IGJsbyAmJiAhaXNianVuayhiW2Jlc3RqIC0gMV0pICYmIGFbYmVzdGkgLSAxXSA9PSBiW2Jlc3RqIC0gMV0pIHsKCQkJCWJlc3RpLS07CgkJCQliZXN0ai0tOwoJCQkJYmVzdHNpemUrKzsKCQkJfQoJCQkJCgkJCXdoaWxlIChiZXN0aSArIGJlc3RzaXplIDwgYWhpICYmIGJlc3RqICsgYmVzdHNpemUgPCBiaGkgJiYKCQkJCQkhaXNianVuayhiW2Jlc3RqICsgYmVzdHNpemVdKSAmJgoJCQkJCWFbYmVzdGkgKyBiZXN0c2l6ZV0gPT0gYltiZXN0aiArIGJlc3RzaXplXSkgewoJCQkJYmVzdHNpemUrKzsKCQkJfQoJCgkJCXdoaWxlIChiZXN0aSA+IGFsbyAmJiBiZXN0aiA+IGJsbyAmJiBpc2JqdW5rKGJbYmVzdGogLSAxXSkgJiYgYVtiZXN0aSAtIDFdID09IGJbYmVzdGogLSAxXSkgewoJCQkJYmVzdGktLTsKCQkJCWJlc3RqLS07CgkJCQliZXN0c2l6ZSsrOwoJCQl9CgkJCQoJCQl3aGlsZSAoYmVzdGkgKyBiZXN0c2l6ZSA8IGFoaSAmJiBiZXN0aiArIGJlc3RzaXplIDwgYmhpICYmIGlzYmp1bmsoYltiZXN0aiArIGJlc3RzaXplXSkgJiYKCQkJCQlhW2Jlc3RpICsgYmVzdHNpemVdID09IGJbYmVzdGogKyBiZXN0c2l6ZV0pIHsKCQkJCWJlc3RzaXplKys7CgkJCX0KCQoJCQlyZXR1cm4gW2Jlc3RpLCBiZXN0aiwgYmVzdHNpemVdOwoJCX0KCQkKCQl0aGlzLmdldF9tYXRjaGluZ19ibG9ja3MgPSBmdW5jdGlvbiAoKSB7CgkJCWlmICh0aGlzLm1hdGNoaW5nX2Jsb2NrcyAhPSBudWxsKSByZXR1cm4gdGhpcy5tYXRjaGluZ19ibG9ja3M7CgkJCXZhciBsYSA9IHRoaXMuYS5sZW5ndGg7CgkJCXZhciBsYiA9IHRoaXMuYi5sZW5ndGg7CgkKCQkJdmFyIHF1ZXVlID0gW1swLCBsYSwgMCwgbGJdXTsKCQkJdmFyIG1hdGNoaW5nX2Jsb2NrcyA9IFtdOwoJCQl2YXIgYWxvLCBhaGksIGJsbywgYmhpLCBxaSwgaSwgaiwgaywgeDsKCQkJd2hpbGUgKHF1ZXVlLmxlbmd0aCkgewoJCQkJcWkgPSBxdWV1ZS5wb3AoKTsKCQkJCWFsbyA9IHFpWzBdOwoJCQkJYWhpID0gcWlbMV07CgkJCQlibG8gPSBxaVsyXTsKCQkJCWJoaSA9IHFpWzNdOwoJCQkJeCA9IHRoaXMuZmluZF9sb25nZXN0X21hdGNoKGFsbywgYWhpLCBibG8sIGJoaSk7CgkJCQlpID0geFswXTsKCQkJCWogPSB4WzFdOwoJCQkJayA9IHhbMl07CgkKCQkJCWlmIChrKSB7CgkJCQkJbWF0Y2hpbmdfYmxvY2tzLnB1c2goeCk7CgkJCQkJaWYgKGFsbyA8IGkgJiYgYmxvIDwgaikKCQkJCQkJcXVldWUucHVzaChbYWxvLCBpLCBibG8sIGpdKTsKCQkJCQlpZiAoaStrIDwgYWhpICYmIGorayA8IGJoaSkKCQkJCQkJcXVldWUucHVzaChbaSArIGssIGFoaSwgaiArIGssIGJoaV0pOwoJCQkJfQoJCQl9CgkJCQoJCQltYXRjaGluZ19ibG9ja3Muc29ydChkaWZmbGliLl9fbnR1cGxlY29tcCk7CgkKCQkJdmFyIGkxID0gMCwgajEgPSAwLCBrMSA9IDAsIGJsb2NrID0gMDsKCQkJdmFyIGkyLCBqMiwgazI7CgkJCXZhciBub25fYWRqYWNlbnQgPSBbXTsKCQkJZm9yICh2YXIgaWR4IGluIG1hdGNoaW5nX2Jsb2NrcykgewoJCQkJaWYgKG1hdGNoaW5nX2Jsb2Nrcy5oYXNPd25Qcm9wZXJ0eShpZHgpKSB7CgkJCQkJYmxvY2sgPSBtYXRjaGluZ19ibG9ja3NbaWR4XTsKCQkJCQlpMiA9IGJsb2NrWzBdOwoJCQkJCWoyID0gYmxvY2tbMV07CgkJCQkJazIgPSBibG9ja1syXTsKCQkJCQlpZiAoaTEgKyBrMSA9PSBpMiAmJiBqMSArIGsxID09IGoyKSB7CgkJCQkJCWsxICs9IGsyOwoJCQkJCX0gZWxzZSB7CgkJCQkJCWlmIChrMSkgbm9uX2FkamFjZW50LnB1c2goW2kxLCBqMSwgazFdKTsKCQkJCQkJaTEgPSBpMjsKCQkJCQkJajEgPSBqMjsKCQkJCQkJazEgPSBrMjsKCQkJCQl9CgkJCQl9CgkJCX0KCQkJCgkJCWlmIChrMSkgbm9uX2FkamFjZW50LnB1c2goW2kxLCBqMSwgazFdKTsKCQoJCQlub25fYWRqYWNlbnQucHVzaChbbGEsIGxiLCAwXSk7CgkJCXRoaXMubWF0Y2hpbmdfYmxvY2tzID0gbm9uX2FkamFjZW50OwoJCQlyZXR1cm4gdGhpcy5tYXRjaGluZ19ibG9ja3M7CgkJfQoJCQoJCXRoaXMuZ2V0X29wY29kZXMgPSBmdW5jdGlvbiAoKSB7CgkJCWlmICh0aGlzLm9wY29kZXMgIT0gbnVsbCkgcmV0dXJuIHRoaXMub3Bjb2RlczsKCQkJdmFyIGkgPSAwOwoJCQl2YXIgaiA9IDA7CgkJCXZhciBhbnN3ZXIgPSBbXTsKCQkJdGhpcy5vcGNvZGVzID0gYW5zd2VyOwoJCQl2YXIgYmxvY2ssIGFpLCBiaiwgc2l6ZSwgdGFnOwoJCQl2YXIgYmxvY2tzID0gdGhpcy5nZXRfbWF0Y2hpbmdfYmxvY2tzKCk7CgkJCWZvciAodmFyIGlkeCBpbiBibG9ja3MpIHsKCQkJCWlmIChibG9ja3MuaGFzT3duUHJvcGVydHkoaWR4KSkgewoJCQkJCWJsb2NrID0gYmxvY2tzW2lkeF07CgkJCQkJYWkgPSBibG9ja1swXTsKCQkJCQliaiA9IGJsb2NrWzFdOwoJCQkJCXNpemUgPSBibG9ja1syXTsKCQkJCQl0YWcgPSAnJzsKCQkJCQlpZiAoaSA8IGFpICYmIGogPCBiaikgewoJCQkJCQl0YWcgPSAncmVwbGFjZSc7CgkJCQkJfSBlbHNlIGlmIChpIDwgYWkpIHsKCQkJCQkJdGFnID0gJ2RlbGV0ZSc7CgkJCQkJfSBlbHNlIGlmIChqIDwgYmopIHsKCQkJCQkJdGFnID0gJ2luc2VydCc7CgkJCQkJfQoJCQkJCWlmICh0YWcpIGFuc3dlci5wdXNoKFt0YWcsIGksIGFpLCBqLCBial0pOwoJCQkJCWkgPSBhaSArIHNpemU7CgkJCQkJaiA9IGJqICsgc2l6ZTsKCQkJCQkKCQkJCQlpZiAoc2l6ZSkgYW5zd2VyLnB1c2goWydlcXVhbCcsIGFpLCBpLCBiaiwgal0pOwoJCQkJfQoJCQl9CgkJCQoJCQlyZXR1cm4gYW5zd2VyOwoJCX0KCQkKCQkvLyB0aGlzIGlzIGEgZ2VuZXJhdG9yIGZ1bmN0aW9uIGluIHRoZSBweXRob24gbGliLCB3aGljaCBvZiBjb3Vyc2UgaXMgbm90IHN1cHBvcnRlZCBpbiBqYXZhc2NyaXB0CgkJLy8gdGhlIHJlaW1wbGVtZW50YXRpb24gYnVpbGRzIHVwIHRoZSBncm91cGVkIG9wY29kZXMgaW50byBhIGxpc3QgaW4gdGhlaXIgZW50aXJldHkgYW5kIHJldHVybnMgdGhhdC4KCQl0aGlzLmdldF9ncm91cGVkX29wY29kZXMgPSBmdW5jdGlvbiAobikgewoJCQlpZiAoIW4pIG4gPSAzOwoJCQl2YXIgY29kZXMgPSB0aGlzLmdldF9vcGNvZGVzKCk7CgkJCWlmICghY29kZXMpIGNvZGVzID0gW1siZXF1YWwiLCAwLCAxLCAwLCAxXV07CgkJCXZhciBjb2RlLCB0YWcsIGkxLCBpMiwgajEsIGoyOwoJCQlpZiAoY29kZXNbMF1bMF0gPT0gJ2VxdWFsJykgewoJCQkJY29kZSA9IGNvZGVzWzBdOwoJCQkJdGFnID0gY29kZVswXTsKCQkJCWkxID0gY29kZVsxXTsKCQkJCWkyID0gY29kZVsyXTsKCQkJCWoxID0gY29kZVszXTsKCQkJCWoyID0gY29kZVs0XTsKCQkJCWNvZGVzWzBdID0gW3RhZywgTWF0aC5tYXgoaTEsIGkyIC0gbiksIGkyLCBNYXRoLm1heChqMSwgajIgLSBuKSwgajJdOwoJCQl9CgkJCWlmIChjb2Rlc1tjb2Rlcy5sZW5ndGggLSAxXVswXSA9PSAnZXF1YWwnKSB7CgkJCQljb2RlID0gY29kZXNbY29kZXMubGVuZ3RoIC0gMV07CgkJCQl0YWcgPSBjb2RlWzBdOwoJCQkJaTEgPSBjb2RlWzFdOwoJCQkJaTIgPSBjb2RlWzJdOwoJCQkJajEgPSBjb2RlWzNdOwoJCQkJajIgPSBjb2RlWzRdOwoJCQkJY29kZXNbY29kZXMubGVuZ3RoIC0gMV0gPSBbdGFnLCBpMSwgTWF0aC5taW4oaTIsIGkxICsgbiksIGoxLCBNYXRoLm1pbihqMiwgajEgKyBuKV07CgkJCX0KCQoJCQl2YXIgbm4gPSBuICsgbjsKCQkJdmFyIGdyb3VwID0gW107CgkJCXZhciBncm91cHMgPSBbXTsKCQkJZm9yICh2YXIgaWR4IGluIGNvZGVzKSB7CgkJCQlpZiAoY29kZXMuaGFzT3duUHJvcGVydHkoaWR4KSkgewoJCQkJCWNvZGUgPSBjb2Rlc1tpZHhdOwoJCQkJCXRhZyA9IGNvZGVbMF07CgkJCQkJaTEgPSBjb2RlWzFdOwoJCQkJCWkyID0gY29kZVsyXTsKCQkJCQlqMSA9IGNvZGVbM107CgkJCQkJajIgPSBjb2RlWzRdOwoJCQkJCWlmICh0YWcgPT0gJ2VxdWFsJyAmJiBpMiAtIGkxID4gbm4pIHsKCQkJCQkJZ3JvdXAucHVzaChbdGFnLCBpMSwgTWF0aC5taW4oaTIsIGkxICsgbiksIGoxLCBNYXRoLm1pbihqMiwgajEgKyBuKV0pOwoJCQkJCQlncm91cHMucHVzaChncm91cCk7CgkJCQkJCWdyb3VwID0gW107CgkJCQkJCWkxID0gTWF0aC5tYXgoaTEsIGkyLW4pOwoJCQkJCQlqMSA9IE1hdGgubWF4KGoxLCBqMi1uKTsKCQkJCQl9CgkJCQkJCgkJCQkJZ3JvdXAucHVzaChbdGFnLCBpMSwgaTIsIGoxLCBqMl0pOwoJCQkJfQoJCQl9CgkJCQoJCQlpZiAoZ3JvdXAgJiYgIShncm91cC5sZW5ndGggPT0gMSAmJiBncm91cFswXVswXSA9PSAnZXF1YWwnKSkgZ3JvdXBzLnB1c2goZ3JvdXApCgkJCQoJCQlyZXR1cm4gZ3JvdXBzOwoJCX0KCQkKCQl0aGlzLnJhdGlvID0gZnVuY3Rpb24gKCkgewoJCQltYXRjaGVzID0gZGlmZmxpYi5fX3JlZHVjZSgKCQkJCQkJCWZ1bmN0aW9uIChzdW0sIHRyaXBsZSkgeyByZXR1cm4gc3VtICsgdHJpcGxlW3RyaXBsZS5sZW5ndGggLSAxXTsgfSwKCQkJCQkJCXRoaXMuZ2V0X21hdGNoaW5nX2Jsb2NrcygpLCAwKTsKCQkJcmV0dXJuIGRpZmZsaWIuX19jYWxjdWxhdGVfcmF0aW8obWF0Y2hlcywgdGhpcy5hLmxlbmd0aCArIHRoaXMuYi5sZW5ndGgpOwoJCX0KCQkKCQl0aGlzLnF1aWNrX3JhdGlvID0gZnVuY3Rpb24gKCkgewoJCQl2YXIgZnVsbGJjb3VudCwgZWx0OwoJCQlpZiAodGhpcy5mdWxsYmNvdW50ID09IG51bGwpIHsKCQkJCXRoaXMuZnVsbGJjb3VudCA9IGZ1bGxiY291bnQgPSB7fTsKCQkJCWZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5iLmxlbmd0aDsgaSsrKSB7CgkJCQkJZWx0ID0gdGhpcy5iW2ldOwoJCQkJCWZ1bGxiY291bnRbZWx0XSA9IGRpZmZsaWIuX19kaWN0Z2V0KGZ1bGxiY291bnQsIGVsdCwgMCkgKyAxOwoJCQkJfQoJCQl9CgkJCWZ1bGxiY291bnQgPSB0aGlzLmZ1bGxiY291bnQ7CgkKCQkJdmFyIGF2YWlsID0ge307CgkJCXZhciBhdmFpbGhhcyA9IGRpZmZsaWIuX19pc2luZGljdChhdmFpbCk7CgkJCXZhciBtYXRjaGVzID0gbnVtYiA9IDA7CgkJCWZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5hLmxlbmd0aDsgaSsrKSB7CgkJCQllbHQgPSB0aGlzLmFbaV07CgkJCQlpZiAoYXZhaWxoYXMoZWx0KSkgewoJCQkJCW51bWIgPSBhdmFpbFtlbHRdOwoJCQkJfSBlbHNlIHsKCQkJCQludW1iID0gZGlmZmxpYi5fX2RpY3RnZXQoZnVsbGJjb3VudCwgZWx0LCAwKTsKCQkJCX0KCQkJCWF2YWlsW2VsdF0gPSBudW1iIC0gMTsKCQkJCWlmIChudW1iID4gMCkgbWF0Y2hlcysrOwoJCQl9CgkJCQoJCQlyZXR1cm4gZGlmZmxpYi5fX2NhbGN1bGF0ZV9yYXRpbyhtYXRjaGVzLCB0aGlzLmEubGVuZ3RoICsgdGhpcy5iLmxlbmd0aCk7CgkJfQoJCQoJCXRoaXMucmVhbF9xdWlja19yYXRpbyA9IGZ1bmN0aW9uICgpIHsKCQkJdmFyIGxhID0gdGhpcy5hLmxlbmd0aDsKCQkJdmFyIGxiID0gdGhpcy5iLmxlbmd0aDsKCQkJcmV0dXJuIF9jYWxjdWxhdGVfcmF0aW8oTWF0aC5taW4obGEsIGxiKSwgbGEgKyBsYik7CgkJfQoJCQoJCXRoaXMuaXNqdW5rID0gaXNqdW5rID8gaXNqdW5rIDogZGlmZmxpYi5kZWZhdWx0SnVua0Z1bmN0aW9uOwoJCXRoaXMuYSA9IHRoaXMuYiA9IG51bGw7CgkJdGhpcy5zZXRfc2VxcyhhLCBiKTsKCX0KfTsKCg==]]></data>
	</file>
	<file>
	  <filename>/js/diffview.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKVGhpcyBpcyBwYXJ0IG9mIGpzZGlmZmxpYiB2MS4wLiA8aHR0cDovL2dpdGh1Yi5jb20vY2VtZXJpY2svanNkaWZmbGliPgoKQ29weXJpZ2h0IDIwMDcgLSAyMDExIENoYXMgRW1lcmljayA8Y2VtZXJpY2tAc25vd3RpZGUuY29tPi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KClJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZQpwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKCiAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mCiAgICAgIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KCiAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0CiAgICAgIG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCiAgICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KClRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQ2hhcyBFbWVyaWNrIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRApXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5ECkZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBDaGFzIEVtZXJpY2sgT1IKQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgpTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCkFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGCkFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgoKVGhlIHZpZXdzIGFuZCBjb25jbHVzaW9ucyBjb250YWluZWQgaW4gdGhlIHNvZnR3YXJlIGFuZCBkb2N1bWVudGF0aW9uIGFyZSB0aG9zZSBvZiB0aGUKYXV0aG9ycyBhbmQgc2hvdWxkIG5vdCBiZSBpbnRlcnByZXRlZCBhcyByZXByZXNlbnRpbmcgb2ZmaWNpYWwgcG9saWNpZXMsIGVpdGhlciBleHByZXNzZWQKb3IgaW1wbGllZCwgb2YgQ2hhcyBFbWVyaWNrLgoqLwp0YWJsZS5kaWZmIHsKCWJvcmRlci1jb2xsYXBzZTpjb2xsYXBzZTsKCWJvcmRlcjoxcHggc29saWQgZGFya2dyYXk7Cgl3aGl0ZS1zcGFjZTpwcmUtd3JhcAp9CnRhYmxlLmRpZmYgdGJvZHkgeyAKCWZvbnQtZmFtaWx5OkNvdXJpZXIsIG1vbm9zcGFjZQp9CnRhYmxlLmRpZmYgdGJvZHkgdGggewoJZm9udC1mYW1pbHk6dmVyZGFuYSxhcmlhbCwnQml0c3RyZWFtIFZlcmEgU2FucycsaGVsdmV0aWNhLHNhbnMtc2VyaWY7CgliYWNrZ3JvdW5kOiNFRUQ7Cglmb250LXNpemU6MTFweDsKCWZvbnQtd2VpZ2h0Om5vcm1hbDsKCWJvcmRlcjoxcHggc29saWQgI0JCQzsKCWNvbG9yOiM4ODY7CglwYWRkaW5nOi4zZW0gLjVlbSAuMWVtIDJlbTsKCXRleHQtYWxpZ246cmlnaHQ7Cgl2ZXJ0aWNhbC1hbGlnbjp0b3AKfQp0YWJsZS5kaWZmIHRoZWFkIHsKCWJvcmRlci1ib3R0b206MXB4IHNvbGlkICNCQkM7CgliYWNrZ3JvdW5kOiNFRkVGRUY7Cglmb250LWZhbWlseTpWZXJkYW5hCn0KdGFibGUuZGlmZiB0aGVhZCB0aC50ZXh0dGl0bGUgewoJdGV4dC1hbGlnbjpsZWZ0Cn0KdGFibGUuZGlmZiB0Ym9keSB0ZCB7CglwYWRkaW5nOjBweCAuNGVtOwoJcGFkZGluZy10b3A6LjRlbTsKCXZlcnRpY2FsLWFsaWduOnRvcDsKfQp0YWJsZS5kaWZmIC5lbXB0eSB7CgliYWNrZ3JvdW5kLWNvbG9yOiNEREQ7Cn0KdGFibGUuZGlmZiAucmVwbGFjZSB7CgliYWNrZ3JvdW5kLWNvbG9yOiNGRDgKfQp0YWJsZS5kaWZmIC5kZWxldGUgewoJYmFja2dyb3VuZC1jb2xvcjojRTk5Owp9CnRhYmxlLmRpZmYgLnNraXAgewoJYmFja2dyb3VuZC1jb2xvcjojRUZFRkVGOwoJYm9yZGVyOjFweCBzb2xpZCAjQUFBOwoJYm9yZGVyLXJpZ2h0OjFweCBzb2xpZCAjQkJDOwp9CnRhYmxlLmRpZmYgLmluc2VydCB7CgliYWNrZ3JvdW5kLWNvbG9yOiM5RTkKfQp0YWJsZS5kaWZmIHRoLmF1dGhvciB7Cgl0ZXh0LWFsaWduOnJpZ2h0OwoJYm9yZGVyLXRvcDoxcHggc29saWQgI0JCQzsKCWJhY2tncm91bmQ6I0VGRUZFRgp9]]></data>
	</file>
	<file>
	  <filename>/js/diffview.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKVGhpcyBpcyBwYXJ0IG9mIGpzZGlmZmxpYiB2MS4wLiA8aHR0cDovL2dpdGh1Yi5jb20vY2VtZXJpY2svanNkaWZmbGliPgoKQ29weXJpZ2h0IDIwMDcgLSAyMDExIENoYXMgRW1lcmljayA8Y2VtZXJpY2tAc25vd3RpZGUuY29tPi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KClJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZQpwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKCiAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mCiAgICAgIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KCiAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0CiAgICAgIG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCiAgICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KClRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQ2hhcyBFbWVyaWNrIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRApXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5ECkZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBDaGFzIEVtZXJpY2sgT1IKQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgpTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCkFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGCkFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgoKVGhlIHZpZXdzIGFuZCBjb25jbHVzaW9ucyBjb250YWluZWQgaW4gdGhlIHNvZnR3YXJlIGFuZCBkb2N1bWVudGF0aW9uIGFyZSB0aG9zZSBvZiB0aGUKYXV0aG9ycyBhbmQgc2hvdWxkIG5vdCBiZSBpbnRlcnByZXRlZCBhcyByZXByZXNlbnRpbmcgb2ZmaWNpYWwgcG9saWNpZXMsIGVpdGhlciBleHByZXNzZWQKb3IgaW1wbGllZCwgb2YgQ2hhcyBFbWVyaWNrLgoqLwpkaWZmdmlldyA9IHsKCS8qKgoJICogQnVpbGRzIGFuZCByZXR1cm5zIGEgdmlzdWFsIGRpZmYgdmlldy4gIFRoZSBzaW5nbGUgcGFyYW1ldGVyLCBgcGFyYW1zJywgc2hvdWxkIGNvbnRhaW4KCSAqIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgoJICoKCSAqIC0gYmFzZVRleHRMaW5lczogdGhlIGFycmF5IG9mIHN0cmluZ3MgdGhhdCB3YXMgdXNlZCBhcyB0aGUgYmFzZSB0ZXh0IGlucHV0IHRvIFNlcXVlbmNlTWF0Y2hlcgoJICogLSBuZXdUZXh0TGluZXM6IHRoZSBhcnJheSBvZiBzdHJpbmdzIHRoYXQgd2FzIHVzZWQgYXMgdGhlIG5ldyB0ZXh0IGlucHV0IHRvIFNlcXVlbmNlTWF0Y2hlcgoJICogLSBvcGNvZGVzOiB0aGUgYXJyYXkgb2YgYXJyYXlzIHJldHVybmVkIGJ5IFNlcXVlbmNlTWF0Y2hlci5nZXRfb3Bjb2RlcygpCgkgKiAtIGJhc2VUZXh0TmFtZTogdGhlIHRpdGxlIHRvIGJlIGRpc3BsYXllZCBhYm92ZSB0aGUgYmFzZSB0ZXh0IGxpc3RpbmcgaW4gdGhlIGRpZmYgdmlldzsgZGVmYXVsdHMKCSAqCSAgIHRvICJCYXNlIFRleHQiCgkgKiAtIG5ld1RleHROYW1lOiB0aGUgdGl0bGUgdG8gYmUgZGlzcGxheWVkIGFib3ZlIHRoZSBuZXcgdGV4dCBsaXN0aW5nIGluIHRoZSBkaWZmIHZpZXc7IGRlZmF1bHRzCgkgKgkgICB0byAiTmV3IFRleHQiCgkgKiAtIGNvbnRleHRTaXplOiB0aGUgbnVtYmVyIG9mIGxpbmVzIG9mIGNvbnRleHQgdG8gc2hvdyBhcm91bmQgZGlmZmVyZW5jZXM7IGJ5IGRlZmF1bHQsIGFsbCBsaW5lcwoJICoJICAgYXJlIHNob3duCgkgKiAtIHZpZXdUeXBlOiBpZiAwLCBhIHNpZGUtYnktc2lkZSBkaWZmIHZpZXcgaXMgZ2VuZXJhdGVkIChkZWZhdWx0KTsgaWYgMSwgYW4gaW5saW5lIGRpZmYgdmlldyBpcwoJICoJICAgZ2VuZXJhdGVkCgkgKi8KCWJ1aWxkVmlldzogZnVuY3Rpb24gKHBhcmFtcykgewoJCXZhciBiYXNlVGV4dExpbmVzID0gcGFyYW1zLmJhc2VUZXh0TGluZXM7CgkJdmFyIG5ld1RleHRMaW5lcyA9IHBhcmFtcy5uZXdUZXh0TGluZXM7CgkJdmFyIG9wY29kZXMgPSBwYXJhbXMub3Bjb2RlczsKCQl2YXIgYmFzZVRleHROYW1lID0gcGFyYW1zLmJhc2VUZXh0TmFtZSA/IHBhcmFtcy5iYXNlVGV4dE5hbWUgOiAiQmFzZSBUZXh0IjsKCQl2YXIgbmV3VGV4dE5hbWUgPSBwYXJhbXMubmV3VGV4dE5hbWUgPyBwYXJhbXMubmV3VGV4dE5hbWUgOiAiTmV3IFRleHQiOwoJCXZhciBjb250ZXh0U2l6ZSA9IHBhcmFtcy5jb250ZXh0U2l6ZTsKCQl2YXIgaW5saW5lID0gKHBhcmFtcy52aWV3VHlwZSA9PSAwIHx8IHBhcmFtcy52aWV3VHlwZSA9PSAxKSA/IHBhcmFtcy52aWV3VHlwZSA6IDA7CgoJCWlmIChiYXNlVGV4dExpbmVzID09IG51bGwpCgkJCXRocm93ICJDYW5ub3QgYnVpbGQgZGlmZiB2aWV3OyBiYXNlVGV4dExpbmVzIGlzIG5vdCBkZWZpbmVkLiI7CgkJaWYgKG5ld1RleHRMaW5lcyA9PSBudWxsKQoJCQl0aHJvdyAiQ2Fubm90IGJ1aWxkIGRpZmYgdmlldzsgbmV3VGV4dExpbmVzIGlzIG5vdCBkZWZpbmVkLiI7CgkJaWYgKCFvcGNvZGVzKQoJCQl0aHJvdyAiQ2Fubm8gYnVpbGQgZGlmZiB2aWV3OyBvcGNvZGVzIGlzIG5vdCBkZWZpbmVkLiI7CgkJCgkJZnVuY3Rpb24gY2VsdCAobmFtZSwgY2xhenopIHsKCQkJdmFyIGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KG5hbWUpOwoJCQllLmNsYXNzTmFtZSA9IGNsYXp6OwoJCQlyZXR1cm4gZTsKCQl9CgkJCgkJZnVuY3Rpb24gdGVsdCAobmFtZSwgdGV4dCkgewoJCQl2YXIgZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQobmFtZSk7CgkJCWUuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodGV4dCkpOwoJCQlyZXR1cm4gZTsKCQl9CgkJCgkJZnVuY3Rpb24gY3RlbHQgKG5hbWUsIGNsYXp6LCB0ZXh0KSB7CgkJCXZhciBlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChuYW1lKTsKCQkJZS5jbGFzc05hbWUgPSBjbGF6ejsKCQkJZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh0ZXh0KSk7CgkJCXJldHVybiBlOwoJCX0KCQoJCXZhciB0ZGF0YSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRoZWFkIik7CgkJdmFyIG5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ciIpOwoJCXRkYXRhLmFwcGVuZENoaWxkKG5vZGUpOwoJCWlmIChpbmxpbmUpIHsKCQkJbm9kZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0aCIpKTsKCQkJbm9kZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0aCIpKTsKCQkJbm9kZS5hcHBlbmRDaGlsZChjdGVsdCgidGgiLCAidGV4dHRpdGxlIiwgYmFzZVRleHROYW1lICsgIiB2cy4gIiArIG5ld1RleHROYW1lKSk7CgkJfSBlbHNlIHsKCQkJbm9kZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0aCIpKTsKCQkJbm9kZS5hcHBlbmRDaGlsZChjdGVsdCgidGgiLCAidGV4dHRpdGxlIiwgYmFzZVRleHROYW1lKSk7CgkJCW5vZGUuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGgiKSk7CgkJCW5vZGUuYXBwZW5kQ2hpbGQoY3RlbHQoInRoIiwgInRleHR0aXRsZSIsIG5ld1RleHROYW1lKSk7CgkJfQoJCXRkYXRhID0gW3RkYXRhXTsKCQkKCQl2YXIgcm93cyA9IFtdOwoJCXZhciBub2RlMjsKCQkKCQkvKioKCQkgKiBBZGRzIHR3byBjZWxscyB0byB0aGUgZ2l2ZW4gcm93OyBpZiB0aGUgZ2l2ZW4gcm93IGNvcnJlc3BvbmRzIHRvIGEgcmVhbAoJCSAqIGxpbmUgbnVtYmVyIChiYXNlZCBvbiB0aGUgbGluZSBpbmRleCB0aWR4IGFuZCB0aGUgZW5kcG9pbnQgb2YgdGhlIAoJCSAqIHJhbmdlIGluIHF1ZXN0aW9uIHRlbmQpLCB0aGVuIHRoZSBjZWxscyB3aWxsIGNvbnRhaW4gdGhlIGxpbmUgbnVtYmVyCgkJICogYW5kIHRoZSBsaW5lIG9mIHRleHQgZnJvbSB0ZXh0TGluZXMgYXQgcG9zaXRpb24gdGlkeCAod2l0aCB0aGUgY2xhc3Mgb2YKCQkgKiB0aGUgc2Vjb25kIGNlbGwgc2V0IHRvIHRoZSBuYW1lIG9mIHRoZSBjaGFuZ2UgcmVwcmVzZW50ZWQpLCBhbmQgdGlkeCArIDEgd2lsbAoJCSAqIGJlIHJldHVybmVkLgkgT3RoZXJ3aXNlLCB0aWR4IGlzIHJldHVybmVkLCBhbmQgdHdvIGVtcHR5IGNlbGxzIGFyZSBhZGRlZAoJCSAqIHRvIHRoZSBnaXZlbiByb3cuCgkJICovCgkJZnVuY3Rpb24gYWRkQ2VsbHMgKHJvdywgdGlkeCwgdGVuZCwgdGV4dExpbmVzLCBjaGFuZ2UpIHsKCQkJaWYgKHRpZHggPCB0ZW5kKSB7CgkJCQlyb3cuYXBwZW5kQ2hpbGQodGVsdCgidGgiLCAodGlkeCArIDEpLnRvU3RyaW5nKCkpKTsKCQkJCXJvdy5hcHBlbmRDaGlsZChjdGVsdCgidGQiLCBjaGFuZ2UsIHRleHRMaW5lc1t0aWR4XS5yZXBsYWNlKC9cdC9nLCAiXHUwMGEwXHUwMGEwXHUwMGEwXHUwMGEwIikpKTsKCQkJCXJldHVybiB0aWR4ICsgMTsKCQkJfSBlbHNlIHsKCQkJCXJvdy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0aCIpKTsKCQkJCXJvdy5hcHBlbmRDaGlsZChjZWx0KCJ0ZCIsICJlbXB0eSIpKTsKCQkJCXJldHVybiB0aWR4OwoJCQl9CgkJfQoJCQoJCWZ1bmN0aW9uIGFkZENlbGxzSW5saW5lIChyb3csIHRpZHgsIHRpZHgyLCB0ZXh0TGluZXMsIGNoYW5nZSkgewoJCQlyb3cuYXBwZW5kQ2hpbGQodGVsdCgidGgiLCB0aWR4ID09IG51bGwgPyAiIiA6ICh0aWR4ICsgMSkudG9TdHJpbmcoKSkpOwoJCQlyb3cuYXBwZW5kQ2hpbGQodGVsdCgidGgiLCB0aWR4MiA9PSBudWxsID8gIiIgOiAodGlkeDIgKyAxKS50b1N0cmluZygpKSk7CgkJCXJvdy5hcHBlbmRDaGlsZChjdGVsdCgidGQiLCBjaGFuZ2UsIHRleHRMaW5lc1t0aWR4ICE9IG51bGwgPyB0aWR4IDogdGlkeDJdLnJlcGxhY2UoL1x0L2csICJcdTAwYTBcdTAwYTBcdTAwYTBcdTAwYTAiKSkpOwoJCX0KCQkKCQlmb3IgKHZhciBpZHggPSAwOyBpZHggPCBvcGNvZGVzLmxlbmd0aDsgaWR4KyspIHsKCQkJY29kZSA9IG9wY29kZXNbaWR4XTsKCQkJY2hhbmdlID0gY29kZVswXTsKCQkJdmFyIGIgPSBjb2RlWzFdOwoJCQl2YXIgYmUgPSBjb2RlWzJdOwoJCQl2YXIgbiA9IGNvZGVbM107CgkJCXZhciBuZSA9IGNvZGVbNF07CgkJCXZhciByb3djbnQgPSBNYXRoLm1heChiZSAtIGIsIG5lIC0gbik7CgkJCXZhciB0b3Byb3dzID0gW107CgkJCXZhciBib3Ryb3dzID0gW107CgkJCWZvciAodmFyIGkgPSAwOyBpIDwgcm93Y250OyBpKyspIHsKCQkJCS8vIGp1bXAgYWhlYWQgaWYgd2UndmUgYWxyZWR5IHByb3ZpZGVkIGxlYWRpbmcgY29udGV4dCBvciBpZiB0aGlzIGlzIHRoZSBmaXJzdCByYW5nZQoJCQkJaWYgKGNvbnRleHRTaXplICYmIG9wY29kZXMubGVuZ3RoID4gMSAmJiAoKGlkeCA+IDAgJiYgaSA9PSBjb250ZXh0U2l6ZSkgfHwgKGlkeCA9PSAwICYmIGkgPT0gMCkpICYmIGNoYW5nZT09ImVxdWFsIikgewoJCQkJCXZhciBqdW1wID0gcm93Y250IC0gKChpZHggPT0gMCA/IDEgOiAyKSAqIGNvbnRleHRTaXplKTsKCQkJCQlpZiAoanVtcCA+IDEpIHsKCQkJCQkJdG9wcm93cy5wdXNoKG5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ciIpKTsKCQkJCQkJCgkJCQkJCWIgKz0ganVtcDsKCQkJCQkJbiArPSBqdW1wOwoJCQkJCQlpICs9IGp1bXAgLSAxOwoJCQkJCQlub2RlLmFwcGVuZENoaWxkKHRlbHQoInRoIiwgIi4uLiIpKTsKCQkJCQkJaWYgKCFpbmxpbmUpIG5vZGUuYXBwZW5kQ2hpbGQoY3RlbHQoInRkIiwgInNraXAiLCAiIikpOwoJCQkJCQlub2RlLmFwcGVuZENoaWxkKHRlbHQoInRoIiwgIi4uLiIpKTsKCQkJCQkJbm9kZS5hcHBlbmRDaGlsZChjdGVsdCgidGQiLCAic2tpcCIsICIiKSk7CgkJCQkJCQoJCQkJCQkvLyBza2lwIGxhc3QgbGluZXMgaWYgdGhleSdyZSBhbGwgZXF1YWwKCQkJCQkJaWYgKGlkeCArIDEgPT0gb3Bjb2Rlcy5sZW5ndGgpIHsKCQkJCQkJCWJyZWFrOwoJCQkJCQl9IGVsc2UgewoJCQkJCQkJY29udGludWU7CgkJCQkJCX0KCQkJCQl9CgkJCQl9CgkJCQkKCQkJCXRvcHJvd3MucHVzaChub2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidHIiKSk7CgkJCQlpZiAoaW5saW5lKSB7CgkJCQkJaWYgKGNoYW5nZSA9PSAiaW5zZXJ0IikgewoJCQkJCQlhZGRDZWxsc0lubGluZShub2RlLCBudWxsLCBuKyssIG5ld1RleHRMaW5lcywgY2hhbmdlKTsKCQkJCQl9IGVsc2UgaWYgKGNoYW5nZSA9PSAicmVwbGFjZSIpIHsKCQkJCQkJYm90cm93cy5wdXNoKG5vZGUyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidHIiKSk7CgkJCQkJCWlmIChiIDwgYmUpIGFkZENlbGxzSW5saW5lKG5vZGUsIGIrKywgbnVsbCwgYmFzZVRleHRMaW5lcywgImRlbGV0ZSIpOwoJCQkJCQlpZiAobiA8IG5lKSBhZGRDZWxsc0lubGluZShub2RlMiwgbnVsbCwgbisrLCBuZXdUZXh0TGluZXMsICJpbnNlcnQiKTsKCQkJCQl9IGVsc2UgaWYgKGNoYW5nZSA9PSAiZGVsZXRlIikgewoJCQkJCQlhZGRDZWxsc0lubGluZShub2RlLCBiKyssIG51bGwsIGJhc2VUZXh0TGluZXMsIGNoYW5nZSk7CgkJCQkJfSBlbHNlIHsKCQkJCQkJLy8gZXF1YWwKCQkJCQkJYWRkQ2VsbHNJbmxpbmUobm9kZSwgYisrLCBuKyssIGJhc2VUZXh0TGluZXMsIGNoYW5nZSk7CgkJCQkJfQoJCQkJfSBlbHNlIHsKCQkJCQliID0gYWRkQ2VsbHMobm9kZSwgYiwgYmUsIGJhc2VUZXh0TGluZXMsIGNoYW5nZSk7CgkJCQkJbiA9IGFkZENlbGxzKG5vZGUsIG4sIG5lLCBuZXdUZXh0TGluZXMsIGNoYW5nZSk7CgkJCQl9CgkJCX0KCgkJCWZvciAodmFyIGkgPSAwOyBpIDwgdG9wcm93cy5sZW5ndGg7IGkrKykgcm93cy5wdXNoKHRvcHJvd3NbaV0pOwoJCQlmb3IgKHZhciBpID0gMDsgaSA8IGJvdHJvd3MubGVuZ3RoOyBpKyspIHJvd3MucHVzaChib3Ryb3dzW2ldKTsKCQl9CgkJCgkJcm93cy5wdXNoKG5vZGUgPSBjdGVsdCgidGgiLCAiYXV0aG9yIiwgImRpZmYgdmlldyBnZW5lcmF0ZWQgYnkgIikpOwoJCW5vZGUuc2V0QXR0cmlidXRlKCJjb2xzcGFuIiwgaW5saW5lID8gMyA6IDQpOwoJCW5vZGUuYXBwZW5kQ2hpbGQobm9kZTIgPSB0ZWx0KCJhIiwgImpzZGlmZmxpYiIpKTsKCQlub2RlMi5zZXRBdHRyaWJ1dGUoImhyZWYiLCAiaHR0cDovL2dpdGh1Yi5jb20vY2VtZXJpY2svanNkaWZmbGliIik7CgkJCgkJdGRhdGEucHVzaChub2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGJvZHkiKSk7CgkJZm9yICh2YXIgaWR4IGluIHJvd3MpIHJvd3MuaGFzT3duUHJvcGVydHkoaWR4KSAmJiBub2RlLmFwcGVuZENoaWxkKHJvd3NbaWR4XSk7CgkJCgkJbm9kZSA9IGNlbHQoInRhYmxlIiwgImRpZmYiICsgKGlubGluZSA/ICIgaW5saW5lZGlmZiIgOiAiIikpOwoJCWZvciAodmFyIGlkeCBpbiB0ZGF0YSkgdGRhdGEuaGFzT3duUHJvcGVydHkoaWR4KSAmJiBub2RlLmFwcGVuZENoaWxkKHRkYXRhW2lkeF0pOwoJCXJldHVybiBub2RlOwoJfQp9OwoK]]></data>
	</file>
	<file>
	  <filename>/lang/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lang/en_US.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbJ2ZyaWVuZGx5bmFtZSddID0gJ1NpbXBsZSBPcm0nOwokbGFuZ1sncG9zdGluc3RhbGwnXSA9ICcnOwokbGFuZ1sncG9zdHVuaW5zdGFsbCddID0gJ01vZHVsZSB1bmluc3RhbGxlZCwgYnllICEiJzsKJGxhbmdbJ3JlYWxseV91bmluc3RhbGwnXSA9ICdSZWFsbHk/IEFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byB1bmluc3RhbGwgdGhpcyBmaW5lIG1vZHVsZT8nOwokbGFuZ1sndW5pbnN0YWxsZWQnXSA9ICdNb2R1bGUgVW5pbnN0YWxsZWQuJzsKJGxhbmdbJ2luc3RhbGxlZCddID0gJ01vZHVsZSB2ZXJzaW9uICVzIGluc3RhbGxlZC4nOwokbGFuZ1snbW9kZGVzY3JpcHRpb24nXSA9ICdUaGlzIG1vZHVsZSBpbXBsZW1lbnRzIGEgc21hbGwgT1JNIGxheWVyIGZvciBvdGhlciBtb2R1bGVzJzsKJGxhbmdbJ2NoYW5nZWxvZyddID0gJ3NlZSBjaGFuZ2Vsb2cgOiA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vYmVzc3Rpb2xsZS9vcm0tbXMiIHRhcmdldD0iX2JsYW5rIj5odHRwczovL2dpdGh1Yi5jb20vYmVzc3Rpb2xsZS9vcm0tbXM8L2E+JzsKJGxhbmdbJ2hlbHAnXSA9ICc8aDM+V2hhdCBEb2VzIFRoaXMgRG8/PC9oMz4KPHA+bW9yZSBpbmZvcm1hdGlvbnMgb24gOiA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vYmVzc3Rpb2xsZS9vcm0tbXMiIHRhcmdldD0iX2JsYW5rIj5odHRwczovL2dpdGh1Yi5jb20vYmVzc3Rpb2xsZS9vcm0tbXM8L2E+PC9wPgonOwo/Pgo=]]></data>
	</file>
	<file>
	  <filename>/lib/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/class.MyAutoload.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIENvbnRhaW5zIHRoZSBhdXRvbG9hZCBzeXN0ZW0gdGhhdCB3aWxsIG1lbW9yaXplIGFsbCB0aGUgZW50aXRpZXMgdXNlZCBieSBhbGwgdGhlIG1vZHVsZXMKICoKICogQHNpbmNlIDAuMC4xCiAqIEBhdXRob3IgQmVzcwogKiBAcGFja2FnZSBPcm0KICoqLwogCiAvKioKICogU3RhdGljIENsYXNzIG1hbmFnaW5nIGVudGl0aWVzIHVzZWQgaW4gdGhlIGFwcGxpY2F0aW9uCiAqCVRoZSBtYWluIHVzZSBpcyB0byBub3QgcmVkZWNsYXJhdGUgWCBpbnN0YW5jZXMgb2Ygc2FtZSBjbGFzc2VzIGlmIGl0J3Mgbm90IG5lY2Vzc2FyeS4KICogQWxsIG1vZHVsZXMgaGF2ZSB0aGVpciBvd24gbmFtZXNwYWNlIHRvIGF2b2lkIHNoYXJpbmcgZW50aXRpZXMgYmV0d2VlbiB0d28gbW9kdWxlcwogKgogKiBAc2luY2UgMC4wLjEKICogQGF1dGhvciBCZXNzCiAqIEBwYWNrYWdlIE9ybQogKiovCmZpbmFsIGNsYXNzIE15QXV0b2xvYWQKewoJcHJpdmF0ZSBzdGF0aWMgJGluc3RhbmNlczsKCQoJLyoqCgkgKiBQcml2YXRlIGNvbnN0cnVjdG9yCgkgKi8KCXByb3RlY3RlZCBmdW5jdGlvbiBfX2NvbnN0cnVjdCgpe30JCgkKCS8qKgoJICogRnVuY3Rpb24gY2FsbGVkIGJ5IHRoZSBlbnRpdGllcyB0aGVtLXNlbGYgZHVyaW5nIHRoZWlyIF9jb25zdHJ1Y3QoKSBmdW5jdGlvbgoJICogaXQgd2lsbCBzdG9jayBhbiBpbnN0YW5jZSBvZiB0aGUgZW50aXR5IChpZiBub3QgYWxyZWFkeSBleGlzdGluZykgaW4gaGlzIG1lbW9yeQogICAgICogCgkgKiBAcGFyYW0gbmFtZXNwYWNlIG5hbWVzcGFjZSBvZiB0aGUgZW50aXR5J3MgbW9kdWxlCgkgKiBAcGFyYW0gc3RyaW5nIGFuIGluc3RhbmNlIG9mIHRoZSBlbnRpdHkKCSAqLwoJcHVibGljIGZpbmFsIHN0YXRpYyBmdW5jdGlvbiBhZGRJbnN0YW5jZSgkbmFtZXNwYWNlLCBPcm1FbnRpdHkgJGluc3RhbmNlKQoJewkKCQkkbmFtZXNwYWNlID0gc3RydG9sb3dlcigkbmFtZXNwYWNlKTsKCQkkbmFtZSA9IHN0cnRvbG93ZXIoJGluc3RhbmNlLT5nZXROYW1lKCkpOwoJCQkJCgkJaWYoIU15QXV0b2xvYWQ6OmlzVmFsaWRlTmFtZXNwYWNlKCRuYW1lc3BhY2UpKXsKCQkJc2VsZjo6JGluc3RhbmNlc1skbmFtZXNwYWNlXSA9IGFycmF5KCk7CgkJfQoJCQkJCgkJaWYoaXNzZXQoc2VsZjo6JGluc3RhbmNlc1skbmFtZXNwYWNlXVskbmFtZV0pKSB7CgkJCU9ybVRyYWNlOjpkZWJ1ZygiSW5zdGFuY2UgIi4kbmFtZS4iIGFscmVhZHkgaW4gbWVtb3J5LiIpOwoJCQlyZXR1cm47CgkJfQoJCQoJCU9ybVRyYWNlOjpkZWJ1ZygiQWRkaW5nIHRoZSBpbnN0YW5jZSAiLiRuYW1lLiIgaW50byB0aGUgbmFtZXNwYWNlICIuJG5hbWVzcGFjZSk7CgkJc2VsZjo6JGluc3RhbmNlc1skbmFtZXNwYWNlXVskbmFtZV0gPSAkaW5zdGFuY2U7Cgl9CgkKCS8qKgoJICogUmV0dXJuIGFuIGluc3RhbmNlIG9mIGVudGl0eSBmcm9tIHRoZSBtZW1vcnkuIEVhY2ggaW5zdGFuY2UgaXMgYSBjbG9uZSB0byBhdm9pZCB1c2luZwoJICogdGhlIHNhbWUgb2JqZWN0IAogICAgICogCgkgKiBAcGFyYW0gbmFtZXNwYWNlIG5hbWVzcGFjZSBvZiB0aGUgZW50aXR5J3MgbW9kdWxlCgkgKiBAcGFyYW0gc3RyaW5nIGFuIGluc3RhbmNlIG9mIHRoZSBlbnRpdHkKCSAqCgkgKiBAcmV0dXJuIE9ybUVudGl0eSBhbiBpbnN0YW5jZSBvZiBlbnRpdHkKCSAqLwoJcHVibGljIGZpbmFsIHN0YXRpYyBmdW5jdGlvbiBnZXRJbnN0YW5jZSgkbmFtZXNwYWNlLCAkaW5zdGFuY2VOYW1lKQoJewoJCSRuYW1lc3BhY2UgPSBzdHJ0b2xvd2VyKCRuYW1lc3BhY2UpOwoJCSRpbnN0YW5jZU5hbWUgPSBzdHJ0b2xvd2VyKCRpbnN0YW5jZU5hbWUpOwoJCWlmKCFNeUF1dG9sb2FkOjppc1ZhbGlkZU5hbWVzcGFjZSgkbmFtZXNwYWNlKSl7CgkJCU9ybVRyYWNlOjplcnJvcigiVGhlIG5hbWVzcGFjZSAnJG5hbWVzcGFjZScgZG9lc24ndCBleGlzdGUgaW50byB0aGUgT3JtIFN5c3RlbSIpOwoJCQl0aHJvdyBuZXcgT3JtSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgbmFtZXNwYWNlICckbmFtZXNwYWNlJyBkb2Vzbid0IGV4aXN0ZSBpbnRvIHRoZSBPcm0gU3lzdGVtIik7CgkJfQoJCQoJCU9ybVRyYWNlOjpkZWJ1ZygiQXNraW5nIGFuIGluc3RhbmNlIG9mICIuJGluc3RhbmNlTmFtZS4gIiBmb3IgbmFtZXNwYWNlICIuJG5hbWVzcGFjZSk7CgkJaWYoTXlBdXRvbG9hZDo6aGFzSW5zdGFuY2UoJG5hbWVzcGFjZSwgJGluc3RhbmNlTmFtZSkpCgkJewoJCQlPcm1UcmFjZTo6ZGVidWcoIkluc3RhbmNlICIuJGluc3RhbmNlTmFtZS4iIHJldHVybmVkLiIpOwoJCQlyZXR1cm4gY2xvbmUgc2VsZjo6JGluc3RhbmNlc1skbmFtZXNwYWNlXVskaW5zdGFuY2VOYW1lXTsKCQl9CgkJCgkJT3JtVHJhY2U6OmVycm9yKCJObyBpbnN0YW5jZSAkaW5zdGFuY2VOYW1lIGZvdW5kIGluIG1lbW9yeSBmb3IgbmFtZXNwYWNlICIuJG5hbWVzcGFjZSk7CgkJdGhyb3cgbmV3IEV4Y2VwdGlvbigiTm8gaW5zdGFuY2UgJGluc3RhbmNlTmFtZSBmb3VuZCBpbiBtZW1vcnkgZm9yIG5hbWVzcGFjZSAiLiRuYW1lc3BhY2UpOwoJfQoJCgkvKioKCSAqIFJldHVybiB0cnVlIGlmIHRoZSBpbnN0YW5jZSBleGlzdHMgaW4gdGhlIG1lbW9yeSBmb3IgdGhlIHNhbWUgbmFtZXNwYWNlCiAgICAgKiAKCSAqIEBwYXJhbSBuYW1lc3BhY2UgbmFtZXNwYWNlIG9mIHRoZSBlbnRpdHkncyBtb2R1bGUKCSAqIEBwYXJhbSBzdHJpbmcgYW4gaW5zdGFuY2Ugb2YgdGhlIGVudGl0eQoJICoKCSAqIEByZXR1cm4gQm9vbGVhbiBpZiB0aGUgaW5zdGFuY2UgZXhpc3RzCgkgKi8KCXB1YmxpYyBmaW5hbCBzdGF0aWMgZnVuY3Rpb24gaGFzSW5zdGFuY2UoJG5hbWVzcGFjZSwgJGluc3RhbmNlTmFtZSl7CgkJJG5hbWVzcGFjZSA9IHN0cnRvbG93ZXIoJG5hbWVzcGFjZSk7CgkJJGluc3RhbmNlTmFtZSA9IHN0cnRvbG93ZXIoJGluc3RhbmNlTmFtZSk7CgkJCgkJaWYoTXlBdXRvbG9hZDo6aXNWYWxpZGVOYW1lc3BhY2UoJG5hbWVzcGFjZSkpewoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJCQoJCXJldHVybiBpc3NldChzZWxmOjokaW5zdGFuY2VzWyRuYW1lc3BhY2VdWyRpbnN0YW5jZU5hbWVdKTsKCX0KCQoJLyoqCgkgKiBSZXR1cm4gYWxsIHRoZSBpbnN0YW5jZXMgb2YgYWxsIHRoZSBlbnRpdGllcyBmcm9tIGEgc2luZ2xlIG5hbWVzcGFjZQogICAgICogCgkgKiBAcGFyYW0gbmFtZXNwYWNlIG5hbWVzcGFjZSBvZiB0aGUgZW50aXR5J3MgbW9kdWxlCgkgKiBAcGFyYW0gc3RyaW5nIGFuIGluc3RhbmNlIG9mIHRoZSBlbnRpdHkKCSAqCgkgKiBAcmV0dXJuIGFycmF5PE9ybUVudGl0eT4gYW4gYXJyYXkgb2YgYWxsIHRoZSBlbnRpdGllcwoJICovCglwdWJsaWMgZmluYWwgc3RhdGljIGZ1bmN0aW9uIGdldEFsbEluc3RhbmNlcygkbmFtZXNwYWNlKQoJewoJCSRuYW1lc3BhY2UgPSBzdHJ0b2xvd2VyKCRuYW1lc3BhY2UpOwoJCWlmKCFNeUF1dG9sb2FkOjppc1ZhbGlkZU5hbWVzcGFjZSgkbmFtZXNwYWNlKSl7CgkJCU9ybVRyYWNlOjplcnJvcigiVGhlIG5hbWVzcGFjZSAnJG5hbWVzcGFjZScgZG9lc24ndCBleGlzdGUgaW50byB0aGUgT3JtIFN5c3RlbSIpOwoJCQl0aHJvdyBuZXcgT3JtSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgbmFtZXNwYWNlICckbmFtZXNwYWNlJyBkb2Vzbid0IGV4aXN0ZSBpbnRvIHRoZSBPcm0gU3lzdGVtIik7CgkJfQoJCQoJCXJldHVybiBzZWxmOjokaW5zdGFuY2VzWyRuYW1lc3BhY2VdOwoJfQoJCgkvKioKCSAqIFJldG91cm5lIHRydWUgaWYgdGhlIG5hbWVzcGFjZSBpcyBrbm93biBpbiBtZW1vcnkKICAgICAqIAoJICogQHBhcmFtIG5hbWVzcGFjZSBuYW1lc3BhY2Ugb2YgdGhlIGVudGl0eSdzIG1vZHVsZQoJICoKCSAqIEByZXR1cm4gQm9vbGVhbiBpZiB0aGUgbmFtZXNwYWNlIGV4aXN0cwoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGlzVmFsaWRlTmFtZXNwYWNlKCRuYW1lc3BhY2UpIHsKCQlyZXR1cm4gaXNzZXQoc2VsZjo6JGluc3RhbmNlc1tzdHJ0b2xvd2VyKCRuYW1lc3BhY2UpXSk7Cgl9Cn0KPz4K]]></data>
	</file>
	<file>
	  <filename>/lib/class.OrmCache.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIENvbnRhaW5zIHRoZSBjbGFzcyB3aGljaCBwcm92aWRlIGFuIGdsb2JhbCBpbnRlcmZhY2UgZm9yIGFsbCB0aGUgY2FjaGluZyBzeXN0ZW1zCiAqCiAqIEBzaW5jZSAwLjIuMAogKiBAYXV0aG9yIEJlc3MKICogQHBhY2thZ2UgT3JtCiAqKi8KCgovKioKICoKICogIFN0YXRpYyBjbGFzc2VzIHVzZWQgdG8gcHJvdmlkZSBsaXN0IG9mIHNpZ25hdHVyZSBmb3IgYWxsIHRoZSBjYWNoaW5nIHN5c3RlbXMKICoKICogIEV4YW1wbGUgOiAKICogIDxjb2RlPgogKiAgCS8vQ2FsbCB0byBjbXNtcyB0byBnZXQgdGhlIGRhdGFiYXNlIGNvbm5lY3RvcgogKiAgCSRkYiA9IGNtc21zKCktPkdldERiKCk7CiAqICAgICAgJGNhY2hlSW5zdGFuY2UgPSBPcm1DYWNoZTo6Z2V0SW5zdGFuY2UoKTsKICogIAkKICogIAkvL0RlZmluZXMgYSBuZXcgQ3VzdG9tZXIgZW50aXR5CiAqICAJJGVudGl0eSA9IE15QXV0b2xvYWQ6OmdldEluc3RhbmNlKCdteU1vZHVsZScsICdjdXN0b21lcicpOwogKiAgCQogKiAgCS8vU2VsZWN0IGFsbCBDdXN0b21lcnMKICogIAkkcXVlcnlTZWxlY3QgPSAnU2VsZWN0ICogRlJPTSAnLiRlbnRpdHktPmdldERibmFtZSgpOwogKiAgCQogKiAgCS8vSWYgdGhlIGNhY2hpbmcgc3lzdGVtIGFscmVhZHkga25vdyB0aGUgYW5zd2VyIDogd2UgcmV0dXJuIHRoZSByZXN1bHQgaW1tZWRpYXRlbHkKICogIAlpZigkY2FjaGVJbnN0YW5jZS0+aXNDYWNoZSgkcXVlcnlTZWxlY3QpKSB7CiAqICAJCXJldHVybiAkY2FjaGVJbnN0YW5jZS0+Z2V0Q2FjaGUoJHF1ZXJ5U2VsZWN0KTsKICogIAl9CiAqICAJCiAqICAJLy9TbyB3ZSBuZWVkIHRvIGV4ZWN1dGUgdGhlIHF1ZXJ5CiAqICAJJHJlc3VsdCA9ICRkYi0+RXhlY3V0ZSgkcXVlcnlTZWxlY3QpOwogKiAgCWlmICgkcmVzdWx0ID09PSBmYWxzZSl7ZGllKCJEYXRhYmFzZSBlcnJvciEiKTt9CiAqICAJCiAqICAJJGVudGl0eXMgPSBhcnJheSgpOwogKiAgCXdoaWxlICgkcm93ID0gJHJlc3VsdC0+RmV0Y2hSb3coKSkgewogKiAgCQkkZW50aXR5c1tdID0gT3JtQ29yZTo6cm93VG9FbnRpdHkoJGVudGl0eSwgJHJvdyk7CiAqICAJfQogKiAgCQogKiAgCS8vRG9uJ3QgZm9yZ2V0IHRvIHB1c2ggdGhlIHJlc3VsdCBpbnRvIHRoZSBjYWNoaW5nIHN5c3RlbSBmb3IgdGhlIG5leHQgY2FsbAogKiAgCSRjYWNoZUluc3RhbmNlLT5zZXRDYWNoZSgkcXVlcnlTZWxlY3QsIG51bGwsICRlbnRpdHlzKTsKIAogKiAgCXJldHVybiAkZW50aXR5czsKICoJPC9jb2RlPgogKgogKiBAc2luY2UgMC4yLjAKICogQGF1dGhvciBCZXNzCiAqIEBwYWNrYWdlIE9ybQogKiovCmFic3RyYWN0IGNsYXNzIE9ybUNhY2hlIHsJCgoJcHVibGljIHN0YXRpYyAkTk9ORSA9IDA7CglwdWJsaWMgc3RhdGljICRTQ1JJUFQgPSAxOwoJCQoJLyoqCgkgKiBQcml2YXRlIGNvbnN0cnVjdG9yCgkgKi8KCXByb3RlY3RlZCBmdW5jdGlvbiBfX2NvbnN0cnVjdCgpIHt9CgkKCS8qKgoJICogV2lsbCByZXR1cm4gYSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgY2FjaGUuCgkgKgoJICogQHBhcmFtIG1peGVkIG5vdCByZXF1aXJlZCA6IHRoZSB0eXBlIG9mIGNhY2hlLiBCeSBkZWZhdWx0IGl0IHdpbGwgdGFrZSB0aGUgdHlwZSBvZiBjYWNoZSBkZWZpbmVkIGFzIGRlZmF1bHQgaW50byBDbXNNYWRlU2ltcGxlCgkgKgoJICogQHJldHVybiBhbiBpbnN0YW5jZSBvZiBDYWNoZS4KCSAqKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0SW5zdGFuY2UoJHR5cGVDYWNoZSA9IG51bGwpewoJCQoJCWlmKCR0eXBlQ2FjaGUgPT0gbnVsbCl7CgkJCSRvcm0gPSBjbXNtcygpLT5HZXRNb2R1bGVPcGVyYXRpb25zKCktPmdldF9tb2R1bGVfaW5zdGFuY2UoJ09ybScpOwoJCQkkdHlwZUNhY2hlID0gJG9ybS0+R2V0UHJlZmVyZW5jZSgnY2FjaGVUeXBlJywgT3JtQ2FjaGU6OiROT05FKTsKCQl9CgkJCgkJc3dpdGNoKCR0eXBlQ2FjaGUpewoJCQljYXNlIE9ybUNhY2hlOjokTk9ORToKCQkJCXJldHVybiBPcm1DYWNoZU5vbmU6OmdldE15T3duSW5zdGFuY2UoKTsKCQkJCWJyZWFrOwoJCQljYXNlIE9ybUNhY2hlOjokU0NSSVBUOgoJCQkJcmV0dXJuIE9ybUNhY2hlU2NyaXB0OjpnZXRNeU93bkluc3RhbmNlKCk7CgkJCQlicmVhazsKCQkJZGVmYXVsdDoKCQkJCU9ybVRyYWNlOjplcnJvcigiVHlwZSBvZiBDYWNoZSAjeyR0eXBlQ2FjaGV9IGlzIG5vdCBhIHZhbGlkIFR5cGUgb2YgQ2FjaGUiKTsKCQkJCWV4aXQgLTE7CgkJfQoJfQoJCQkKCS8qKgoJICoJU2V0IHRoZSBjYWNoZSBmb3IgYSBzcWwgcmVxdWVzdCwgaXRzIHBhcmFtZXRlcnMgYW5kIG9mIGNvdXJzZSB0aGUgcmVzdWx0CiAgICAgKiAKCSAqIEBwYXJhbSBzdHJpbmcgdGhlIHNxbCBxdWVyeQoJICogQHBhcmFtIGFycmF5IHRoZSBwYXJhbWV0ZXJzIGludG8gYSBhcnJheS4gTWF5IGJlIG51bGwKCSAqIEBwYXJhbSBvYmplY3QgdGhlIHJlc3VsdAoJICovCglwdWJsaWMgYWJzdHJhY3QgZnVuY3Rpb24gc2V0Q2FjaGUoJHNxbCwgJHBhcmFtcyA9IG51bGwsICR2YWx1ZSk7CgkKCS8qKgoJICogUXVlcnlpbmcgdGhlIGNhY2hlIGZvciBhIHNxbCByZXF1ZXN0IGFuZCBpdHMgcGFyYW1ldGVycwogICAgICogCgkgKiBAcGFyYW0gc3RyaW5nIHRoZSBzcWwgcXVlcnkKCSAqIEBwYXJhbSBhcnJheSB0aGUgcGFyYW1ldGVycyBpbnRvIGEgYXJyYXkuIE1heSBiZSBudWxsCgkgKgoJICogQHJldHVybiBvYmplY3QgdGhlIHJlc3VsdAoJICovCglwdWJsaWMgYWJzdHJhY3QgZnVuY3Rpb24gZ2V0Q2FjaGUoJHNxbCwgJHBhcmFtcyA9IG51bGwpOwoKCS8qKgoJICogUmV0dXJuIHRydWUgaWYgYSBjYWNoZSBleGlzdCBmb3IgYSBzcWwgcmVxdWVzdCBhbmQgaXRzIHBhcmFtZXRlcnMKICAgICAqIAoJICogQHBhcmFtIHN0cmluZyB0aGUgc3FsIHF1ZXJ5CgkgKiBAcGFyYW0gYXJyYXkgdGhlIHBhcmFtZXRlcnMgaW50byBhIGFycmF5LiBNYXkgYmUgbnVsbAoJICoKCSAqIEByZXR1cm4gYm9vbGVhbiB0cnVlIGlmIHRoZSBjYWNoZSBleGlzdHMKCSAqLwkKCXB1YmxpYyBhYnN0cmFjdCBmdW5jdGlvbiBpc0NhY2hlKCRzcWwsICRwYXJhbXMgPSBudWxsKTsKCgkvKioKCSAqIEVtcHR5IHRoZSBjYWNoZS4gVmVyeSBpbXBvcnRhbnQgaWYgYmV0d2VlbiAyIHF1ZXJ5aW5nLCB0aGUgc3lzdGVtIG1heSBpbnNlcnQvZGVsZXRlL3VwZGF0ZSBzb21lIGRhdGEgaW4gdGhlIGRhdGFiYXNlCgkgKiAgSW4gdGhlIE9ybSBzeXN0ZW0sIHdlIGFsd2F5cyBkcm9wIHRoZSBjYWNoZSBpbiB0aGUgaW5zZXJ0L2RlbGV0ZS91cGRhdGUgZnVuY3Rpb24uCgkgKi8JCglwdWJsaWMgYWJzdHJhY3QgZnVuY3Rpb24gY2xlYXJDYWNoZSgpOwoKCS8qKgoJICogUmV0dXJuIGEgdW5pcXVlIGhhc2ggZm9yIGEgc3FsIHJlcXVlc3QgYW5kIGl0cyBwYXJhbWV0ZXJzCgkgKiAgdGhpcyBoYXNoIGlzIHVzZWQgdG8gRGVmaW5lcyBhIHVuaXF1ZSBlbnRyeSBpbnRvIHRoZSBjYWNoZQogICAgICogCgkgKiBAcGFyYW0gc3RyaW5nIHRoZSBzcWwgcXVlcnkKCSAqIEBwYXJhbSBhcnJheSB0aGUgcGFyYW1ldGVycyBpbnRvIGEgYXJyYXkuIE1heSBiZSBudWxsCgkgKgoJICogQHJldHVybiBzdHJpbmcgdGhlIGhhc2gKCSAqLwkKCXB1YmxpYyBmdW5jdGlvbiBoYXNoKCRzcWwsICRwYXJhbXMgPSBudWxsKSB7CgkJaWYoJHBhcmFtcyA9PSBudWxsKXsKCQkJJHBhcmFtcyA9ICIiOwoJCX0KCQkKCQkkcCA9IHNlcmlhbGl6ZSgkcGFyYW1zKTsKCgkJcmV0dXJuIG1kNSgkc3FsLiRwKTsKCX0KfQoKPz4K]]></data>
	</file>
	<file>
	  <filename>/lib/class.OrmCacheNone.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIENvbnRhaW5zIHRoZSBjbGFzcyB3aWNoIHByb3ZpZGUgYW4gZHVtbXkgY2FjaGluZyBzeXN0ZW0KICoKICogQHNpbmNlIDAuMi4wCiAqIEBhdXRob3IgQmVzcwogKiBAcGFja2FnZSBPcm0KICoqLwoKCi8qKgogKgogKiAgU3RhdGljIGNsYXNzZSB1c2VkIHRvIHByb3ZpZGUgYSB6ZXJvLWNhY2hpbmcgc3lzdGVtLiAKICogICBJdCdzIGEgc2ltcGxlIGR1bW15IGltcGxlbWVudGF0aW9uIG9mIHRoZSBzaWduYXR1cmUgb2YgY2FjaGluZwogKiAgIHdpY2ggd2lsbCBhbHdheXMgc2F5IHRoYXQgdGhlcmUgaXMgbm8gY2FjaGUgYXZhaWxhYmxlLCBmb3JjaW5nIAogKiAgIHByb2Nlc3Npbmcgb2YgZXZlcnkgcXVlcmllcwogKgogKiBAc2luY2UgMC4yLjAKICogQGF1dGhvciBCZXNzCiAqIEBwYWNrYWdlIE9ybQogKiovCmNsYXNzIE9ybUNhY2hlTm9uZSBleHRlbmRzIE9ybUNhY2hlewkKCQoJcHJpdmF0ZSBzdGF0aWMgJGluc3RhbmNlOwoJCQoJLyoqCgkgKiBQcml2YXRlIGNvbnN0cnVjdG9yCgkgKi8KCXByb3RlY3RlZCBmdW5jdGlvbiBfX2NvbnN0cnVjdCgpIHt9CgkKCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0TXlPd25JbnN0YW5jZSgpewoJCWlmKHNlbGY6OiRpbnN0YW5jZSA9PSBudWxsKXsKCQkJc2VsZjo6JGluc3RhbmNlID0gbmV3IE9ybUNhY2hlTm9uZSgpOwoJCX0KCQlyZXR1cm4gc2VsZjo6JGluc3RhbmNlOwoJfQoJCQkKCS8qKgoJICoJU2V0IHRoZSBjYWNoZSBmb3IgYSBzcWwgcmVxdWVzdCwgaXRzIHBhcmFtZXRlcnMgYW5kIG9mIGNvdXJzZSB0aGUgcmVzdWx0CiAgICAgKiAKCSAqIEBwYXJhbSBzdHJpbmcgdGhlIHNxbCBxdWVyeQoJICogQHBhcmFtIGFycmF5IHRoZSBwYXJhbWV0ZXJzIGludG8gYSBhcnJheS4gTWF5IGJlIG51bGwKCSAqIEBwYXJhbSBvYmplY3QgdGhlIHJlc3VsdAoJICovCglwdWJsaWMgZnVuY3Rpb24gc2V0Q2FjaGUoJHNxbCwgJHBhcmFtcyA9IG51bGwsICR2YWx1ZSkgewkJCgkJLy9ObyBwcm9jZXNzaW5nCQkKCX0KCQoJLyoqCgkgKiBRdWVyeWluZyB0aGUgY2FjaGUgZm9yIGEgc3FsIHJlcXVlc3QgYW5kIGl0cyBwYXJhbWV0ZXJzCiAgICAgKiAKCSAqIEBwYXJhbSBzdHJpbmcgdGhlIHNxbCBxdWVyeQoJICogQHBhcmFtIGFycmF5IHRoZSBwYXJhbWV0ZXJzIGludG8gYSBhcnJheS4gTWF5IGJlIG51bGwKCSAqCgkgKiBAcmV0dXJuIG9iamVjdCB0aGUgcmVzdWx0CgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRDYWNoZSgkc3FsLCAkcGFyYW1zID0gbnVsbCkgewoJCXJldHVybiBudWxsOwoJfQoKCS8qKgoJICogUmV0dXJuIHRydWUgaWYgYSBjYWNoZSBleGlzdCBmb3IgYSBzcWwgcmVxdWVzdCBhbmQgaXRzIHBhcmFtZXRlcnMKICAgICAqIAoJICogQHBhcmFtIHN0cmluZyB0aGUgc3FsIHF1ZXJ5CgkgKiBAcGFyYW0gYXJyYXkgdGhlIHBhcmFtZXRlcnMgaW50byBhIGFycmF5LiBNYXkgYmUgbnVsbAoJICoKCSAqIEByZXR1cm4gYm9vbGVhbiB0cnVlIGlmIHRoZSBjYWNoZSBleGlzdHMKCSAqLwkKCXB1YmxpYyBmdW5jdGlvbiBpc0NhY2hlKCRzcWwsICRwYXJhbXMgPSBudWxsKSB7CgkJcmV0dXJuIGZhbHNlOwoJfQoKCS8qKgoJICogRW1wdHkgdGhlIGNhY2hlLiBWZXJ5IGltcG9ydGFudCBpZiBiZXR3ZWVuIDIgcXVlcnlpbmcsIHRoZSBzeXN0ZW0gbWF5IGluc2VydC9kZWxldGUvdXBkYXRlIHNvbWUgZGF0YSBpbiB0aGUgZGF0YWJhc2UKCSAqICBJbiB0aGUgT3JtIHN5c3RlbSwgd2UgYWx3YXlzIGRyb3AgdGhlIGNhY2hlIGluIHRoZSBpbnNlcnQvZGVsZXRlL3VwZGF0ZSBmdW5jdGlvbi4KCSAqLwkKCXB1YmxpYyBmdW5jdGlvbiBjbGVhckNhY2hlKCl7CgkJLy9ObyBwcm9jZXNzaW5nCQoJfQoKCS8qKgoJICogUmV0dXJuIGEgdW5pcXVlIGhhc2ggZm9yIGEgc3FsIHJlcXVlc3QgYW5kIGl0cyBwYXJhbWV0ZXJzCgkgKiAgdGhpcyBoYXNoIGlzIHVzZWQgdG8gRGVmaW5lcyBhIHVuaXF1ZSBlbnRyeSBpbnRvIHRoZSBjYWNoZQogICAgICogCgkgKiBAcGFyYW0gc3RyaW5nIHRoZSBzcWwgcXVlcnkKCSAqIEBwYXJhbSBhcnJheSB0aGUgcGFyYW1ldGVycyBpbnRvIGEgYXJyYXkuIE1heSBiZSBudWxsCgkgKgoJICogQHJldHVybiBzdHJpbmcgdGhlIGhhc2gKCSAqLwkKCXB1YmxpYyBmdW5jdGlvbiBoYXNoKCRzcWwsICRwYXJhbXMgPSBudWxsKSB7CgkJLy9ObyBwcm9jZXNzaW5nCQoJfQp9Cgo/Pgo=]]></data>
	</file>
	<file>
	  <filename>/lib/class.OrmCacheScript.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIENvbnRhaW5zIHRoZSBjbGFzcyB3aWNoIHByb3ZpZGUgYSBtaW5pIGNhY2hpbmcgc3lzdGVtIG9mIE9ybSB0byBhdm9pZCBtdWx0aXBsZXMgc3FsIHJlcXVlc3RzCiAqCiAqIEBzaW5jZSAwLjIuMAogKiBAYXV0aG9yIEJlc3MKICogQHBhY2thZ2UgT3JtCiAqKi8KCi8qKgogKgogKiAgU3RhdGljIGNsYXNzZSB1c2VkIHRvIHByb3ZpZGUgYSB2ZXJ5IHNpbXBsZSBjYWNoaW5nIHN5c3RlbS4gWW91IGNhbiBwdXNoIHRoZSByZXN1bHQgb2YgYSByZXF1ZXN0IGludG8gaXQgYW5kIGFza2luZyBsYXRlcgogKgl0byBjb2xsZWN0IHRoZSByZXN1bHQuCiAqCiAqICBFeGFtcGxlIDogCiAqICA8Y29kZT4KICogIAkvL0NhbGwgdG8gY21zbXMgdG8gZ2V0IHRoZSBkYXRhYmFzZSBjb25uZWN0b3IKICogIAkkZGIgPSBjbXNtcygpLT5HZXREYigpOwogKiAgCQogKiAgCS8vRGVmaW5lcyBhIG5ldyBDdXN0b21lciBlbnRpdHkKICogIAkkZW50aXR5ID0gTXlBdXRvbG9hZDo6Z2V0SW5zdGFuY2UoJ215TW9kdWxlJywgJ2N1c3RvbWVyJyk7CiAqICAJCiAqICAJLy9TZWxlY3QgYWxsIEN1c3RvbWVycwogKiAgCSRxdWVyeVNlbGVjdCA9ICdTZWxlY3QgKiBGUk9NICcuJGVudGl0eS0+Z2V0RGJuYW1lKCk7CiAqICAJCiAqICAJLy9JZiB0aGUgY2FjaGluZyBzeXN0ZW0gYWxyZWFkeSBrbm93IHRoZSBhbnN3ZXIgOiB3ZSByZXR1cm4gdGhlIHJlc3VsdCBpbW1lZGlhdGVseQogKiAgCWlmKE9ybUNhY2hlOjpnZXRJbnN0YW5jZSgpLT5pc0NhY2hlKCRxdWVyeVNlbGVjdCkpIHsKICogIAkJcmV0dXJuIE9ybUNhY2hlOjpnZXRJbnN0YW5jZSgpLT5nZXRDYWNoZSgkcXVlcnlTZWxlY3QpOwogKiAgCX0KICogIAkKICogIAkvL1NvIHdlIG5lZWQgdG8gZXhlY3V0ZSB0aGUgcXVlcnkKICogIAkkcmVzdWx0ID0gJGRiLT5FeGVjdXRlKCRxdWVyeVNlbGVjdCk7CiAqICAJaWYgKCRyZXN1bHQgPT09IGZhbHNlKXtkaWUoIkRhdGFiYXNlIGVycm9yISIpO30KICogIAkKICogIAkkZW50aXR5cyA9IGFycmF5KCk7CiAqICAJd2hpbGUgKCRyb3cgPSAkcmVzdWx0LT5GZXRjaFJvdygpKSB7CiAqICAJCSRlbnRpdHlzW10gPSBPcm1Db3JlOjpyb3dUb0VudGl0eSgkZW50aXR5LCAkcm93KTsKICogIAl9CiAqICAJCiAqICAJLy9Eb24ndCBmb3JnZXQgdG8gcHVzaCB0aGUgcmVzdWx0IGludG8gdGhlIGNhY2hpbmcgc3lzdGVtIGZvciB0aGUgbmV4dCBjYWxsCiAqICAJT3JtQ2FjaGU6OmdldEluc3RhbmNlKCktPnNldENhY2hlKCRxdWVyeVNlbGVjdCwgbnVsbCwgJGVudGl0eXMpOwogCiAqICAJcmV0dXJuICRlbnRpdHlzOwogKgk8L2NvZGU+CiAqCiAqICBUaGUgY2FjaGUgaXMgb25seSBhdmFpbGFibGUgZm9yIHRoZSBjdXJyZW50IGNhbGwgb2YgdGhlIHBocCBzY3JpcHQgCiAqICBBbmQgd2lsbCBiZSB1bmF2YWlsYWJsZSBmb3IgdGhlIG5leHQgY2FsbC4KICoKICoKICogQHNpbmNlIDAuMi4wCiAqIEBhdXRob3IgQmVzcwogKiBAcGFja2FnZSBPcm0KICoqLwpjbGFzcyBPcm1DYWNoZVNjcmlwdCBleHRlbmRzIE9ybUNhY2hlIHsJCgkKCXByaXZhdGUgc3RhdGljICRpbnN0YW5jZTsKCXByaXZhdGUgc3RhdGljICRjYWNoZTsKCQkKCS8qKgoJICogUHJpdmF0ZSBjb25zdHJ1Y3RvcgoJICovCglwcm90ZWN0ZWQgZnVuY3Rpb24gX19jb25zdHJ1Y3QoKSB7CgkJc2VsZjo6JGNhY2hlID0gYXJyYXkoKTsKCX0KCQoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRNeU93bkluc3RhbmNlKCl7CgkJaWYoc2VsZjo6JGluc3RhbmNlID09IG51bGwpewoJCQlzZWxmOjokaW5zdGFuY2UgPSBuZXcgT3JtQ2FjaGVTY3JpcHQoKTsKCQl9CgkJcmV0dXJuIHNlbGY6OiRpbnN0YW5jZTsKCX0KCQoJLyoqCgkgKglTZXQgdGhlIGNhY2hlIGZvciBhIHNxbCByZXF1ZXN0LCBpdHMgcGFyYW1ldGVycyBhbmQgb2YgY291cnNlIHRoZSByZXN1bHQKICAgICAqIAoJICogQHBhcmFtIHN0cmluZyB0aGUgc3FsIHF1ZXJ5CgkgKiBAcGFyYW0gYXJyYXkgdGhlIHBhcmFtZXRlcnMgaW50byBhIGFycmF5LiBNYXkgYmUgbnVsbAoJICogQHBhcmFtIG9iamVjdCB0aGUgcmVzdWx0CgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzZXRDYWNoZSgkc3FsLCAkcGFyYW1zID0gbnVsbCwgJHZhbHVlKSB7CQkKCQlzZWxmOjokY2FjaGVbc2VsZjo6aGFzaCgkc3FsLCRwYXJhbXMpXSA9ICR2YWx1ZTsKCQkKCX0KCQoJLyoqCgkgKiBRdWVyeWluZyB0aGUgY2FjaGUgZm9yIGEgc3FsIHJlcXVlc3QgYW5kIGl0cyBwYXJhbWV0ZXJzCiAgICAgKiAKCSAqIEBwYXJhbSBzdHJpbmcgdGhlIHNxbCBxdWVyeQoJICogQHBhcmFtIGFycmF5IHRoZSBwYXJhbWV0ZXJzIGludG8gYSBhcnJheS4gTWF5IGJlIG51bGwKCSAqCgkgKiBAcmV0dXJuIG9iamVjdCB0aGUgcmVzdWx0CgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRDYWNoZSgkc3FsLCAkcGFyYW1zID0gbnVsbCkgewoJCWlmKHNlbGY6OmlzQ2FjaGUoJHNxbCwgJHBhcmFtcykpIHsKCQkJcmV0dXJuIHNlbGY6OiRjYWNoZVtzZWxmOjpoYXNoKCRzcWwsJHBhcmFtcyldOwoJCX0KCQkKCQlyZXR1cm4gbnVsbDsKCX0KCgkvKioKCSAqIFJldHVybiB0cnVlIGlmIGEgY2FjaGUgZXhpc3QgZm9yIGEgc3FsIHJlcXVlc3QgYW5kIGl0cyBwYXJhbWV0ZXJzCiAgICAgKiAKCSAqIEBwYXJhbSBzdHJpbmcgdGhlIHNxbCBxdWVyeQoJICogQHBhcmFtIGFycmF5IHRoZSBwYXJhbWV0ZXJzIGludG8gYSBhcnJheS4gTWF5IGJlIG51bGwKCSAqCgkgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBpZiB0aGUgY2FjaGUgZXhpc3RzCgkgKi8JCglwdWJsaWMgZnVuY3Rpb24gaXNDYWNoZSgkc3FsLCAkcGFyYW1zID0gbnVsbCkgewoJCXJldHVybiBhcnJheV9LRVlfZXhpc3RzKHNlbGY6Omhhc2goJHNxbCwkcGFyYW1zKSxzZWxmOjokY2FjaGUpOwoJfQoKCS8qKgoJICogRW1wdHkgdGhlIGNhY2hlLiBWZXJ5IGltcG9ydGFudCBpZiBiZXR3ZWVuIDIgcXVlcnlpbmcsIHRoZSBzeXN0ZW0gbWF5IGluc2VydC9kZWxldGUvdXBkYXRlIHNvbWUgZGF0YSBpbiB0aGUgZGF0YWJhc2UKCSAqICBJbiB0aGUgT3JtIHN5c3RlbSwgd2UgYWx3YXlzIGRyb3AgdGhlIGNhY2hlIGluIHRoZSBpbnNlcnQvZGVsZXRlL3VwZGF0ZSBmdW5jdGlvbi4KCSAqLwkKCXB1YmxpYyBmdW5jdGlvbiBjbGVhckNhY2hlKCkgewoJCXNlbGY6OiRjYWNoZSA9IGFycmF5KCk7Cgl9Cgp9Cgo/Pgo=]]></data>
	</file>
	<file>
	  <filename>/lib/class.OrmCAST.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIENvbnRhaW5zIHRoZSBjbGFzcyB3aXRoIGFsbCB0aGUgZGlmZmVyZW50IHR5cGUgZm9yIHRoZSBmaWVsZCBpbnRvIGRhdGFiYXNlCiAqCiAqIEBzaW5jZSAwLjAuMQogKiBAYXV0aG9yIEJlc3MKICogQHBhY2thZ2UgT3JtCiAqKi8KCgovKioKICogQ2xhc3MgRGVmaW5lcyB0aGUgdHlwZSBvZiB0aGUgZmllbGQsIGluIGVudGl0eSBidXQgYWxzbyBpbiBkYXRhYmFzZQogKiAKICogIE9ybUNBU1Q6OiRTVFJJTkcgYSBzaW1wbGUgc3RyaW5nCiAqICBPcm1DQVNUOjokQlVGRkVSIGEgZmllbGQgd2l0aCBubyBsaW1pdCBvZiBzaXplIChleGNlcHQgdGhlIG15c3FsIG5hdHVyYWwgbGltaXQpCiAqCiAqICBPcm1DQVNUOjokSU5URUdFUiBhbiBpbnRlZ2VyCiAqICBPcm1DQVNUOjokTlVNRVJJQyBhIGZpZWxkIGZvciBhIHJlYWwgbnVtYmVyIChlZyA6IHdpdGggY29tYSkKICogIE9ybUNBU1Q6OiRET1VCTEUgYSBmaWVsZCBmb3IgYmlnIG51bWJlcgogKiAKICogIE9ybUNBU1Q6OiREQVRFIGEgZmllbGQgZGF0ZQogKiAgT3JtQ0FTVDo6JFRJTUUgYSBmaWVsZCB0aW1lCiAqICBPcm1DQVNUOjokVFMgYSBmaWVsZCB0aW1lc3RhbXAKICogIE9ybUNBU1Q6OiREQVRFVElNRSBhIGZpZWxkIGRhdGVUaW1lCiAqICBPcm1DQVNUOjokVVVJRCBhIGZpZWxkIFVVSUQKICoKICogIE9ybUNBU1Q6OiROT05FIGEgVHJhbnNpYW50IGZpZWxkIDogd29uJ3QgYmUgcGVyc2lzdCBpbnRvIGRhdGFiYXNlCiAqCiAqIEBzaW5jZSAwLjAuMQogKiBAYXV0aG9yIEJlc3MKICogQHBhY2thZ2UgT3JtCiovCmNsYXNzIE9ybUNBU1QKewoJcHVibGljIHN0YXRpYyAkU1RSSU5HID0gIlNUUklORyI7CglwdWJsaWMgc3RhdGljICRCVUZGRVIgPSAiQlVGRkVSIjsKCQoJcHVibGljIHN0YXRpYyAkSU5URUdFUiA9ICJJTlRFR0VSIjsKCXB1YmxpYyBzdGF0aWMgJE5VTUVSSUMgPSAiTlVNRVJJQyI7CglwdWJsaWMgc3RhdGljICRET1VCTEUgPSAiRE9VQkxFIjsKCQoJcHVibGljIHN0YXRpYyAkREFURSA9ICJEQVRFIjsKCXB1YmxpYyBzdGF0aWMgJFRJTUUgPSAiVElNRSI7CglwdWJsaWMgc3RhdGljICRUUyA9ICJUUyI7CglwdWJsaWMgc3RhdGljICREQVRFVElNRSA9ICJEQVRFVElNRSI7CgkKCXB1YmxpYyBzdGF0aWMgJFVVSUQgPSAiVVVJRCI7CgkJICAKCXB1YmxpYyBzdGF0aWMgJElOSEVSSVQgPSAiSU5IRVJJVCI7CglwdWJsaWMgc3RhdGljICROT05FID0gIk5PTkUiOwp9Cgo/Pgo=]]></data>
	</file>
	<file>
	  <filename>/lib/class.OrmCore.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIENvbnRhaW5zIHRoZSBjbGFzcyBPcm1Db3JlCiAqIAogKiBAc2luY2UgMC4wLjEKICogQGF1dGhvciBCZXNzCiAqIEBwYWNrYWdlIE9ybQogKiovCiAKIAovKioKICogTWFpbiBwYXJ0IG9mIHRoZSBpbnRlcmZhY2UgYmV0d2VlbiBDbXNtYWRlc2ltcGxlIG5hdGl2ZXMgZnVuY3Rpb24gYW5kIHRoZSBuZWNlc3NpdHkgZm9yIHRoZSBPcm0gZnVuY3Rpb25zCiAqICAgCiAqIEBzaW5jZSAwLjAuMQogKiBAYXV0aG9yIEJlc3MKICogQHBhY2thZ2UgT3JtCiovCmNsYXNzIE9ybUNvcmUgeyAgCiAgICAvKioKICAgICogUHJvdGVjdGVkIGNvbnN0cnVjdG9yCiAgICAqICAgICAKICAgICovCglwcm90ZWN0ZWQgZnVuY3Rpb24gX19jb25zdHJ1Y3QoKSB7fQogICAgICAKICAgIC8qKgogICAgKiB0cmFuc2Zvcm1zIHRoZSBlbnRpdHkncyBzdHJ1Y3R1cmUgaW50byBhZG9kYiBpbmZvcm1hdGlvbnMgCiAgICAqICAgICAgICAgCiAgICAqIEBwYXJhbSBPcm1FbnRpdHkgdGhlIGVudGl0eQogICAgKiBAcmV0dXJuIHRoZSBhZG9kYiBpbmZvcm1hdGlvbnMKICAgICovCglwdWJsaWMgc3RhdGljIGZpbmFsIGZ1bmN0aW9uIF9nZXRGaWVsZHNUb0hxbChPcm1FbnRpdHkgJiRlbnRpdHlQYXJhbSkgeyAgICAKCQkkaHFsID0gJyc7CgoJCSRsaXN0ZUZpZWxkID0gJGVudGl0eVBhcmFtLT5nZXRGaWVsZHMoKTsKCgkJLy9Gb3IgZWFjaCBGaWVsZCBjb250YWluZWQgaW4gdGhlIGVudGl0eQoJCWZvcmVhY2goJGxpc3RlRmllbGQgYXMgJGZpZWxkKSB7CgkJCS8vV2UgZG9uJ3QgY3JlYXRlIHRoZSBGaWVsZCB3aGljaCBhcmUgbGlua3MgZXh0ZXJuYWxzIG9uIGFzc29jaWF0aXZlIHRhYmxlcwoJCQlpZigkZmllbGQtPmlzQXNzb2NpYXRlS0VZKCkpIHsKCQkJCWNvbnRpbnVlOwoJCQl9CQoJCQkKCQkJLy9XZSBkb24ndCBjcmVhdGUgdGhlIHRyYW5zaWVudCBGaWVsZHMgCgkJCWlmKCRmaWVsZC0+Z2V0VHlwZSgpID09IE9ybUNBU1Q6OiROT05FKSB7CgkJCQljb250aW51ZTsKCQkJfQoKCQkJaWYoIWVtcHR5KCRocWwpKSB7CgkJCQkkaHFsIC49ICcgLCAnOwoJCQl9CgkJCSRocWwgLj0gJyAnLiRmaWVsZC0+Z2V0TmFtZSgpLicgJzsKCgoKCQkJJGNhc3RUeXBlID0gJGZpZWxkLT5nZXRUeXBlKCk7CgkJCSRzaXplID0gJGZpZWxkLT5nZXRTaXplKCk7CgkJCS8qaWYoT3JtQ0FTVDo6JElOSEVSSVQgPT0gJGNhc3RUeXBlKSB7CgkJCQkvL011c3QgdGFrZSB0aGUgZGlzdGFudCB0eXBlCgkJCQlsaXN0KCRlbnRpdHlBc3NvY05hbWUsICRmaWVsZEFzc29jaWF0ZU5hbWUpID0gZXhwbG9kZSgiLiIsICRmaWVsZC0+Z2V0S2V5TmFtZSgpKTsKCQkJCSRjYXN0VHlwZSA9IChuZXcgJGVudGl0eUFzc29jTmFtZSgpKS0+Z2V0RmllbGRCeU5hbWUoJGZpZWxkQXNzb2NpYXRlTmFtZSktPmdldFR5cGUoKTsKCQkJCSRzaXplID0gKG5ldyAkZW50aXR5QXNzb2NOYW1lKCkpLT5nZXRGaWVsZEJ5TmFtZSgkZmllbGRBc3NvY2lhdGVOYW1lKS0+Z2V0U2l6ZSgpOwoJCQl9Ki8KCgkJCQoJCQkkc2l6ZSA9ICRzaXplICE9ICIiID8gIiAoIi4kc2l6ZS4iKSAiIDogIiI7CgkJCXN3aXRjaCgkY2FzdFR5cGUpIHsKCQkJCWNhc2UgT3JtQ0FTVDo6JFNUUklORyA6ICRocWwgLj0gJ0MnLiRzaXplOyBicmVhazsKCgkJCQljYXNlIE9ybUNBU1Q6OiRJTlRFR0VSIDogJGhxbCAuPSAnSScuJHNpemU7IGJyZWFrOwoKCQkJCWNhc2UgT3JtQ0FTVDo6JE5VTUVSSUMgOiAkaHFsIC49ICdOJy4kc2l6ZTsgYnJlYWs7CgoJCQkJY2FzZSBPcm1DQVNUOjokRE9VQkxFIDogJGhxbCAuPSAnRicuJHNpemU7IGJyZWFrOwoKCQkJCWNhc2UgT3JtQ0FTVDo6JEJVRkZFUiA6ICRocWwgLj0gJ1gnOyBicmVhazsKCgkJCQljYXNlIE9ybUNBU1Q6OiREQVRFIDogJGhxbCAuPSAnRCc7IGJyZWFrOwoKCQkJCWNhc2UgT3JtQ0FTVDo6JFRJTUUgOiAkaHFsIC49ICdUJzsgYnJlYWs7ICAgCgoJCQkJY2FzZSBPcm1DQVNUOjokVVVJRCA6ICRocWwgLj0gJ0MgKDM2KSAnOyBicmVhazsgICAKCgkJCQljYXNlIE9ybUNBU1Q6OiRUUyA6ICRocWwgLj0gJ0kgKDEwKSAnOyBicmVhazsgLy93b3JrYXJvdW5kIGZvciB0aGUgcmVhbCB0aW1lc3RhbXAgbWlzc2luZyBpbiBBRE9EQkxJVEUKCgkJCQljYXNlIE9ybUNBU1Q6OiREQVRFVElNRSA6ICRocWwgLj0gQ01TX0FET0RCX0RUOyBicmVhazsgICAKCgkJCQlkZWZhdWx0IDogdGhyb3cgbmV3IE9ybUlsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbignQ0FTVCBUWVBFICcuJGNhc3RUeXBlLicgZm9yIHRoZSBmaWVsZCAnLiRlbnRpdHlQYXJhbS0+Z2V0TmFtZSgpLictPicuJGZpZWxkLT5nZXROYW1lKCkuJyBpcyBub3QgYSB2YWxpZCBPcm1DQVNUIG9wdGlvbicpOwoJCQl9CgkJCQoJCQkvL01hbmFnZSB0aGUgZGVmYXVsdCB2YWx1ZQoJCQlpZigkZmllbGQtPmdldERlZmF1bHRWYWx1ZSgpICE9IG51bGwpewoJCQkJaWYoJGZpZWxkLT5nZXRUeXBlKCkgPT0gT3JtQ0FTVDo6JFNUUklORyB8fCAkZmllbGQtPmdldFR5cGUoKSA9PSBPcm1DQVNUOjokQlVGRkVSKSB7CgkJCQkJJGhxbCAuPSAiICBERUZBVUxUICciLnN0cl9yZXBsYWNlKCInIiwgIicnIiwkZmllbGQtPmdldERlZmF1bHRWYWx1ZSgpKS4iJyAiOwoJCQkJfSBlbHNlIHsKCQkJCQkkaHFsIC49ICIgIERFRkFVTFQgIi4kZmllbGQtPmdldERlZmF1bHRWYWx1ZSgpLiIgIjsKCQkJCX0KCQkJCQoJCQl9CgoJCQlpZigkZmllbGQtPmlzUHJpbWFyeUtFWSgpKSB7CgkJCQlpZigkZW50aXR5UGFyYW0tPmlzQXV0b2luY3JlbWVudCgpKSB7CgkJCQkJJGhxbCAuPSAnIEtFWSBBVVRPJzsKCQkJCX0gZWxzZSB7CgkJCQkJJGhxbCAuPSAnIEtFWSAnOwoJCQkJfQoJCQl9CgkJCQkKCQl9CgkKCQlPcm1UcmFjZTo6aW5mbygkaHFsKTsKCgkJcmV0dXJuICRocWw7Cgl9CgkKICAgIC8qKgogICAgKiBDcmVhdGUgYSB0YWJsZSBpbnRvIERhdGFiYXNlIGZyb20gdGhlIHN0cnVjdHVyZSBvZiBhbiBPcm1FbnRpdHkKICAgICogIFdpbGwgYWxzbyBjcmVhdGUgdGhlIHNlcXVlbmNlIGlmIGl0J3MgbmVlZGVkCiAgICAqICAKICAgICogICBleGFtcGxlIHdpdGggYSBDdXN0b21lciBlbnRpdHkgOiAKICAgICogPGNvZGU+CiAgICAqIAogICAgKiBjbGFzcyBDdXN0b21lciBleHRlbmRzIE9ybUVudGl0eQogICAgKiB7CiAgICAqICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgpCiAgICAqICAgIHsKICAgICogICAgICAgIHBhcmVudDo6X19jb25zdHJ1Y3QoJHRoaXMtPkdldE5hbWUoKSwgJ2N1c3RvbWVyJyk7CiAgICAqICAgICAgICAKICAgICogICAgICAgICR0aGlzLT5hZGQobmV3IE9ybUZpZWxkKCdjdXN0b21lcl9pZCcgIAoJKgkJCSwgT3JtQ0FTVDo6JElOVEVHRVIKCSoJCQksIG51bGwKCSoJCQksIG51bGwKCSoJCQksIE9ybUtFWTo6JFBLIAoJKgkJCSkpOwogICAgKiAKICAgICogICAgICAgICR0aGlzLT5hZGQobmV3IE9ybUZpZWxkKCduYW1lJwogICAgKiAgICAgICAgCSwgT3JtQ0FTVDo6JFNUUklORyAKICAgICogICAgICAgIAksIDMyCiAgICAqICAgICAgICAJKSk7CiAgICAqIAogICAgKiAgICAgICAgJHRoaXMtPmFkZChuZXcgT3JtRmllbGQoJ2xhc3RuYW1lJwogICAgKiAgICAgICAgCSwgT3JtQ0FTVDo6JFNUUklORwogICAgKiAgICAgICAgCSwgMzIKCSoJCQksIHRydWUgIC8vIElzIG51bGxhYmxlCiAgICAqICAgICAgICAJKSk7CiAgICAqICAgIH0KICAgICogfQogICAgKiA8L2NvZGU+CiAgICAqIAogICAgKiAgVGhlIGJlc3Qgd2F5IHRvIGNyZWF0ZSBpdHMgdGFibGUgaW50byB0aGUgZGF0YWJhc2UgOiAKICAgICogCiAgICAqIDxjb2RlPgogICAgKiAgICRjdXN0b21lciA9IE15QXV0b2xvYWQ6OmdldEluc3RhbmNlKCR0aGlzLT5HZXROYW1lKCksICdjdXN0b21lcicpOwogICAgKiAgIE9ybUNvcmU6OmNyZWF0ZVRhYmxlKCRjdXN0b21lcik7CiAgICAqIDwvY29kZT4KICAgICogCiAgICAqICBUaGUgZnVuY3Rpb24gd2lsbCBhbHNvIHRyeSB0byBwb3B1bGF0ZSB0aGUgdGFibGUgd2l0aCBhIGNhbGwgdG8gdGhlIGZ1bmN0aW9uIGluaXRUYWJsZSgpIGlmIGl0J3MgZGVmaW5lIGludG8gdGhlIGVudGl0eSBjbGFzcy4KICAgICogCgkqIEBwYXJhbSBPcm0gdGhlIG1vZHVsZSB3aGljaCBleHRlbmRzIHRoZSBPcm0gbW9kdWxlCiAgICAqIEBwYXJhbSBPcm1FbnRpdHkgYW4gaW5zdGFuY2Ugb2YgdGhlIGVudGl0eQogICAgKi8KCXB1YmxpYyBzdGF0aWMgZmluYWwgZnVuY3Rpb24gY3JlYXRlVGFibGUoT3JtRW50aXR5ICYkZW50aXR5UGFyYW0pIHsKCQoJCSRocWwgPSBPcm1Db3JlOjpfZ2V0RmllbGRzVG9IcWwoJGVudGl0eVBhcmFtKTsKCgkJJHJlc3VsdCA9IE9ybURiOjpjcmVhdGVUYWJsZSgkZW50aXR5UGFyYW0tPmdldERibmFtZSgpLCAkaHFsKTsKCQkJCQoJCS8vSWYgbmVjZXNzYXJ5LCBpdCB3aWxsIGNyZWF0ZSBhIHNlcXVlbmNlIG9uIHRoZSB0YWJsZS4KCQlpZigkZW50aXR5UGFyYW0tPmdldFNlcW5hbWUoKSAhPSBudWxsKXsKCQkJT3JtRGI6OmNyZWF0ZVNlcXVlbmNlKCRlbnRpdHlQYXJhbS0+Z2V0U2VxbmFtZSgpKTsKCQl9CgkJCgkJLy9XZSBtYW5hZ2UgdGhlICgidW5pcXVlIikgaW5kZXhlcwoJCSRpbmRleGVzID0gJGVudGl0eVBhcmFtLT5nZXRJbmRleGVzKCk7CgoJCS8vRm9yIGVhY2ggRmllbGQgY29udGFpbmVkIGluIHRoZSBlbnRpdHkKCQlmb3JlYWNoKCRpbmRleGVzIGFzICRpbmRleCkgewoJCQkkcmVzdWx0ID0gT3JtRGI6OmNyZWF0ZUluZGV4KCRlbnRpdHlQYXJhbS0+Z2V0RGJuYW1lKCksICRpbmRleFsnZmllbGRzJ10sICRpbmRleFsndW5pcXVlJ10pOwoJCX0KCgkJLy9XZSBpbml0aWF0ZSB0aGUgdGFibGUuCgkJJGVudGl0eVBhcmFtLT5pbml0VGFibGUoKTsKCX0KICAgIAogICAgLyoqCiAgICAqIERyb3AgdGhlIHRhYmxlIGZvciB0aGUgT3JtRW50aXR5IGluIHBhcmFtZXRlcnMKICAgICogIFdpbGwgYWxzbyBkcm9wIHRoZSBzZXF1ZW5jZSBpZiBpdCdzIG5lZWRlZAogICAgKiAKICAgICogQHBhcmFtIE9ybUVudGl0eSBhbiBpbnN0YW5jZSBvZiB0aGUgZW50aXR5CiAgICAqLwoJcHVibGljIHN0YXRpYyBmaW5hbCBmdW5jdGlvbiBkcm9wVGFibGUoT3JtRW50aXR5ICYkZW50aXR5UGFyYW0pIHsKCgkJT3JtRGI6OmRyb3BUYWJsZSgkZW50aXR5UGFyYW0tPmdldERibmFtZSgpKTsKCgkJLy9JZiBuZWNlc3NhcnksIGl0IHdpbGwgZGVsZXRlIGEgc2VxdWVuY2Ugb24gdGhlIHRhYmxlLgoJCWlmKCRlbnRpdHlQYXJhbS0+Z2V0U2VxbmFtZSgpICE9IG51bGwpewoJCQlPcm1EYjo6ZHJvcFNlcXVlbmNlKCRlbnRpdHlQYXJhbS0+Z2V0U2VxbmFtZSgpKTsKCQl9Cgl9ICAKICAKICAgIC8qKgogICAgKiBXaWxsIGVkaXQgdGhlIHRhYmxlIG9mIHRoZSBPcm1FbnRpdHkgaW4gcGFyYW1ldGVycyB3aXRoIHRoZSBTUUwgcXVlcnkgaW4gcGFyYW1ldGVycwogICAgKiAKICAgICogICBleGFtcGxlIDogaWYgeW91IG5lZWQgdG8gZG8gCiAgICAqIAogICAgKiA8Y29kZT4gICAgICAgIAogICAgKiAgIEFMVEVSIFRBQkxFIGAgdGFibGUgb2YgdGhlIEN1c3RvbWVyIGVudGl0eSBgIEFERCBgbmV3Q29sdW1uYCBJTlQgTk9UIE5VTEwgCiAgICAqICAgQUxURVIgVEFCTEUgYCB0YWJsZSBvZiB0aGUgQ3VzdG9tZXIgZW50aXR5IGAgRFJPUCBgb2xkQ29sdW1uYCAKICAgICogPC9jb2RlPgogICAgKiAKICAgICogIHRoZSBjb2RlIG11c3QgYmUgOgogICAgKiAKICAgICogPGNvZGU+CiAgICAqICAgICAgICRjdXN0b21lciA9IE15QXV0b2xvYWQ6OmdldEluc3RhbmNlKCR0aGlzLT5HZXROYW1lKCksICdjdXN0b21lcicpOwogICAgKiAgICAgICBPcm1Db3JlOjphbHRlclRhYmxlKCRjdXN0b21lciwgIkFERCBgbmV3Q29sdW1uYCBJTlQgTk9UIE5VTEwiKTsKICAgICogICAgICAgT3JtQ29yZTo6YWx0ZXJUYWJsZSgkY3VzdG9tZXIsICJEUk9QIGBvbGRDb2x1bW5gIik7CiAgICAqIDwvY29kZT4KICAgICogICAKICAgICogCiAgICAqIEBwYXJhbSBPcm1FbnRpdHkgYW4gaW5zdGFuY2Ugb2YgdGhlIGVudGl0eQogICAgKiBAcGFyYW0gc3RyaW5nIHRoZSBTUUwgcXVlcnkKICAgICovCglwdWJsaWMgc3RhdGljIGZpbmFsIGZ1bmN0aW9uIGFsdGVyVGFibGUoT3JtRW50aXR5ICYkZW50aXR5UGFyYW0sICRzcWwpIHsJCgkJJHF1ZXJ5QWx0ZXIgPSAiQUxURVIgVEFCTEUgIi4kZW50aXR5UGFyYW0tPmdldERibmFtZSgpLiIgIi4kc3FsOyAgICAKCQkKCQkvL0V4ZWN1dGlvbgoJCSRyZXN1bHQgPSBPcm1EYjo6ZXhlY3V0ZSgkcXVlcnlBbHRlciwKCQkJCQkJCQkJbnVsbCwKCQkJCQkJCQkJIkRhdGFiYXNlIGVycm9yIGR1cmluZyBPcm1Db3JlOjphbHRlclRhYmxlKE9ybUVudGl0eSAmeyRlbnRpdHlQYXJhbS0+Z2V0TmFtZSgpfSwgeyRzcWx9KSIpOwoJfQogICAgCiAgICAvKioKICAgICAqIEluc2VydCBkYXRhIGludG8gZGF0YWJhc2UuCiAgICAgKiAKICAgICAqIEV4YW1wbGUgZm9yIGEgbmV3IEN1c3RvbWVyIDogY3VzdG9tZXJfaWQsIG5hbWUsIGxhc3ROYW1lIChvcHRpb25hbCkgCiAgICAgKiAgIAogICAgICogPGNvZGU+CiAgICAgKiAgICAgICAkY3VzdG9tZXIgPSBNeUF1dG9sb2FkOjpnZXRJbnN0YW5jZSgkdGhpcy0+R2V0TmFtZSgpLCAnY3VzdG9tZXInKTsKICAgICAqICAgICAgIAogICAgICogICAgICAgJGN1c3RvbWVyLT5zZXQoJ25hbWUnLCdEdXJhbnQnKTsKICAgICAqICAgICAgICRjdXN0b21lci0+c2V0KCdsYXN0TmFtZSc9PidKb2huJyk7CiAgICAgKiAKICAgICAqICAgICAgIE9ybUNvcmU6Omluc2VydEVudGl0eSgkY3VzdG9tZXIpOwogICAgICogPC9jb2RlPgoJICoKCSAqIFlvdSBjb3VsZCBhbHNvIGNvZGUgZm9yIHRoZSBsYXN0IGxpbmUgOiAkY3VzdG9tZXItPnNhdmUoKTsgIGl0IHdpbGwgYXV0b21hdGljYWxseSAKICAgICAqIAogICAgICogSW1wb3J0YW50IDogeW91IG11c3Qgbm90IHNldCB0aGUgcHJpbWFyeUtleSB2YWx1ZS4gSXQgd2lsbCBiZSBjYWxjdWxhdGUgYnkgdGhlIHN5c3RlbSBpdC1zZWxmCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgKiBAcGFyYW0gT3JtRW50aXR5IGFuIGluc3RhbmNlIG9mIHRoZSBlbnRpdHkKCSAqCiAgICAgKiBAcmV0dXJuIHRoZSBlbnRpdHkgc2F2ZWQgd2l0aCBpdHMgbmV3IG5ldyBJZCAoY3VzdG9tZXJfaWQgaW4gbXkgZXhhbXBsZSkKICAgICAqLwoJcHVibGljIHN0YXRpYyBmaW5hbCBmdW5jdGlvbiBpbnNlcnRFbnRpdHkoT3JtRW50aXR5ICYkZW50aXR5UGFyYW0pIHsKCgkJJGxpc3RlRmllbGQgPSAkZW50aXR5UGFyYW0tPmdldEZpZWxkcygpOwoJCSR2YWx1ZXMgPSAkZW50aXR5UGFyYW0tPmdldFZhbHVlcygpOwoJCSRpbmRleGVzID0gJGVudGl0eVBhcmFtLT5nZXRJbmRleGVzKCk7CgoJCSRxdWVyeUluc2VydCA9ICdJTlNFUlQgSU5UTyAnLiRlbnRpdHlQYXJhbS0+Z2V0RGJuYW1lKCkuJyAoJXMpIHZhbHVlcyAoJXMpJzsKCgkJJHN0cjEgPSAiIjsKCQkkc3RyMiA9ICIiOwoKCQkkcGFyYW1zID0gYXJyYXkoKTsKCQkJICAgCgkJLy9BbGwgdGhlIHJlcXVpcmVkIHZhbHVlcyBtdXN0IGJlIHByZXNlbnQKCQlmb3JlYWNoKCRsaXN0ZUZpZWxkIGFzICRmaWVsZCkKCQl7CgkJCWlmKCRmaWVsZC0+aXNBc3NvY2lhdGVLRVkoKSkgewoJCQkJY29udGludWU7CgkJCX0KCQkJCQkJCgkJCS8vV2UgZG9uJ3QgaW5zZXJ0IHRoZSB0cmFuc2llbnQgRmllbGRzIAoJCQlpZigkZmllbGQtPmdldFR5cGUoKSA9PSBPcm1DQVNUOjokTk9ORSkgewoJCQkJY29udGludWU7CgkJCX0KCQkJCgkJCWlmKCFlbXB0eSgkc3RyMSkpIHsKCQkJCSRzdHIxIC49ICcsJzsKCQkJCSRzdHIyIC49ICcsJzsKCQkJfQoJCQkkc3RyMSAuPSAnICcuJGZpZWxkLT5nZXROYW1lKCkuJyAnOwoJCQkkc3RyMiAuPSAnPyc7CgkJCQoJCQlpZigkZmllbGQtPmlzUHJpbWFyeUtFWSgpKSB7CgkJCQlpZighZW1wdHkoJHZhbHVlc1skZmllbGQtPmdldE5hbWUoKV0pKSB7CgkJCQkJaWYoJGVudGl0eVBhcmFtLT5pc0F1dG9pbmNyZW1lbnQoKSl7CgkJCQkJCXRocm93IG5ldyBPcm1JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oJ1ByaW1hcnkgS2V5ICcuJGZpZWxkLT5nZXROYW1lKCkuJyBjYW5cJ3QgYmUgc2V0dGVkIGR1cmluZyBpbnNlcnQgb3BlcmF0aW9uIGZvciBPcm1FbnRpdHknLiRlbnRpdHlQYXJhbS0+Z2V0TmFtZSgpKTsKCQkJCQl9CgkJCQl9IGVsc2UgaWYoISRlbnRpdHlQYXJhbS0+aXNBdXRvaW5jcmVtZW50KCkpewoJCQkJCSRuZXdJZCA9IE9ybURiOjpnZW5JRCgkZW50aXR5UGFyYW0tPmdldFNlcW5hbWUoKSk7CgkJCQkJJHZhbHVlc1skZmllbGQtPmdldE5hbWUoKV0gPSAkbmV3SWQ7CgkJCQkJJGVudGl0eVBhcmFtLT5zZXQoJGZpZWxkLT5nZXROYW1lKCksICRuZXdJZCk7CgkJCQl9IGVsc2V7CgkJCQkJJHZhbHVlc1skZmllbGQtPmdldE5hbWUoKV0gPSAwOwoJCQkJCSRlbnRpdHlQYXJhbS0+c2V0KCRmaWVsZC0+Z2V0TmFtZSgpLCAwKTsKCQkJCX0KCQkJfQoJCQkKCgoJCQkvL0VtcHR5IEZpZWxkIHRoYXQgc2hvdWxkbid0IGJlICEKCQkJaWYoISRmaWVsZC0+aXNOdWxsYWJsZSgpICYmICFpc3NldCgkdmFsdWVzWyRmaWVsZC0+Z2V0TmFtZSgpXSkpIHsKCQkJCS8vRXhjZXB0aW9uIDogaWYgdGhlIGZpZWxkIGhhdmUgYSBkZWZhdWx0IHZhbHVlIHdlIHNldCBpdCBtYW51YWxseQoJCQkJaWYoIWlzX251bGwoJGZpZWxkLT5nZXREZWZhdWx0VmFsdWUoKSkpewoJCQkJCSR2YWx1ZXNbJGZpZWxkLT5nZXROYW1lKCldID0gJGZpZWxkLT5nZXREZWZhdWx0VmFsdWUoKTsKCQkJCX0gZWxzZSB7CgkJCQkJdGhyb3cgbmV3IE9ybUlsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigndGhlIGZpZWxkICcuJGZpZWxkLT5nZXROYW1lKCkuJyBvZiBPcm1FbnRpdHkgICcuJGVudGl0eVBhcmFtLT5nZXROYW1lKCkuJyBjYW5cJ3QgYmUgbnVsbCcpOwoJCQkJfQoJCQl9CgkJCQoJCQkvLyBDb250cm9sIFVVSUQgdHlwZQoJCQlpZigkZmllbGQtPmdldFR5cGUoKSA9PSBPcm1DQVNUOjokVVVJRCAmJiAhZW1wdHkoJHZhbHVlc1skZmllbGQtPmdldE5hbWUoKV0pKXsKCQkJCSRwYXR0ZXJuID0gIi9eWzAtOWEtZl17OH0tWzAtOWEtZl17NH0tWzEtNV1bMC05YS1mXXszfS1bODlhYl1bMC05YS1mXXszfS1bMC05YS1mXXsxMn0kL2kiOwoJCQkJaWYoIXByZWdfbWF0Y2goJHBhdHRlcm4sICR2YWx1ZXNbJGZpZWxkLT5nZXROYW1lKCldKSl7CgkJCQkJdGhyb3cgbmV3IE9ybUlsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigndGhlIGZpZWxkICcuJGZpZWxkLT5nZXROYW1lKCkuJyBvZiBPcm1FbnRpdHkgICcuJGVudGl0eVBhcmFtLT5nZXROYW1lKCkuJyBkb2VzblwndCBtYXRjaCB0aGUgVVVJRCBwYXR0ZXJuIDogJy4kcGF0dGVybik7CgkJCQl9CgkJCX0KCQkJCgkJCQoJCQkkdmFsID0gbnVsbDsKCQkJaWYoaXNzZXQoJHZhbHVlc1skZmllbGQtPmdldE5hbWUoKV0pKQoJCQl7CgkJCQkkcGFyYW1zW10gPSBPcm1Db3JlOjpfZmllbGRUb0RCVmFsdWUoJHZhbHVlc1skZmllbGQtPmdldE5hbWUoKV0sICRmaWVsZC0+Z2V0VHlwZSgpKTsKCQkJfSBlbHNlIHsKCQkJCSRwYXJhbXNbXSA9IG51bGw7CgkJCX0KCQl9CgkJCgkJLy9jb250cm9sIHVuaXF1ZW5lc3Mgb24gdW5pcXVlIEZpZWxkCgkJZm9yZWFjaCgkaW5kZXhlcyBhcyAkaW5kZXgpewoJCQlpZighJGluZGV4Wyd1bmlxdWUnXSl7CgkJCQljb250aW51ZTsKCQkJfQoJCQkKCQkJJHF1ZXJ5ID0gJ1NFTEVDVCBDT1VOVCgqKSBGUk9NICcuJGVudGl0eVBhcmFtLT5nZXREYm5hbWUoKS4nIFdIRVJFIDEgJzsKCQkJJGFycmF5RmluZCA9IGFycmF5KCk7CgkJCSRtc2dFcnJvciA9ICd7JzsKCQkJJGlzRmlyc3QgPSB0cnVlOwoJCQlmb3JlYWNoKCRpbmRleFsnZmllbGRzJ10gYXMgJGVsdCl7CgkJCQlpZighJGlzRmlyc3QpewoJCQkJCSRtc2dFcnJvciAuPScsJzsKCQkJCX0KCQkJCWlmKGVtcHR5KCR2YWx1ZXNbJGVsdF0pKXsKCQkJCQkkcXVlcnkgLj0gJyBBTkQgJyAuICRlbHQgLiAnIElTIE5VTEwgJzsKCQkJCX0gZWxzZSB7CgkJCQkJJHF1ZXJ5IC49ICcgQU5EICcgLiAkZWx0IC4gJyA9ID8gJzsKCQkJCQkkYXJyYXlGaW5kW10gPSAkdmFsdWVzWyRlbHRdOwoJCQkJfQoJCQkJJG1zZ0Vycm9yIC49ICIgeyRlbHR9ID0geyR2YWx1ZXNbJGVsdF19ICI7CgkJCX0KICAgICAgICAgICAgZm9yZWFjaCgkZW50aXR5UGFyYW0tPmdldFBrKCkgYXMgJHBrbmFtZSA9PiAkcGspewogICAgICAgICAgICAgICAgJHF1ZXJ5IC49ICcgQU5EICcgLiAkcGtuYW1lIC4gJyAhPSA/ICc7CiAgICAgICAgICAgICAgICAkYXJyYXlGaW5kW10gPSAkdmFsdWVzWyRwa25hbWVdOwogICAgICAgICAgICB9CgkJCSRtc2dFcnJvciAuPSAnfSc7CgkJCQoJCQkvL0V4ZWN1dGlvbgoJCQkkcmVzdWx0ID0gT3JtRGI6OmdldE9uZSgkcXVlcnksCgkJCQkJCQkJCSRhcnJheUZpbmQsCgkJCQkJCQkJCSJEYXRhYmFzZSBlcnJvciBkdXJpbmcgdW5pY2l0eSBjb250cm9sIGluIE9ybUNvcmU6Omluc2VydEVudGl0eShPcm1FbnRpdHkgJnskZW50aXR5UGFyYW0tPmdldE5hbWUoKX0pIik7CgkJCgkJCWlmKCRyZXN1bHQgIT0gMCl7CgkJCQl0aHJvdyBuZXcgT3JtSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJhbiBFbnRpdHkgeyRlbnRpdHlQYXJhbS0+Z2V0TmFtZSgpfSB3aXRoIHRoZSBzYW1lIGZpZWxkcyAoeyRtc2dFcnJvcn0pIGFscmVhZHkgZXhpc3RzIGluIGRhdGFiYXNlIik7CgkJCX0KCQl9CgkJCgkJLy9FeGVjdXRpb24KCQkkcmVzdWx0ID0gT3JtRGI6OmV4ZWN1dGUoc3ByaW50ZigkcXVlcnlJbnNlcnQsICRzdHIxLCAkc3RyMiksCgkJCQkJCQkJCSRwYXJhbXMsCgkJCQkJCQkJCSJEYXRhYmFzZSBlcnJvciBkdXJpbmcgT3JtQ29yZTo6aW5zZXJ0RW50aXR5KE9ybUVudGl0eSAmeyRlbnRpdHlQYXJhbS0+Z2V0TmFtZSgpfSkiKTsKCQkKCgkvKglpZigkZW50aXR5UGFyYW0tPmlzSW5kZXhhYmxlKCkpIHsgIAoJCQlPcm1JbmRleGluZzo6QWRkV29yZHMoJGVudGl0eVBhcmFtLT5nZXRNb2R1bGVOYW1lKCksIE9ybUNvcmU6OmZpbmRCeUlkKCRlbnRpdHlQYXJhbSwkYXJyYXlLRVlbMF0pKTsKCQl9Ki8KCQkKCQkvL2VtcHR5IGNhY2hlCgkJT3JtQ2FjaGU6OmdldEluc3RhbmNlKCktPmNsZWFyQ2FjaGUoKTsKCQkKICAgICAgICBpZigkZW50aXR5UGFyYW0tPmlzQXV0b2luY3JlbWVudCgpKXsKICAgICAgICAgICAgLy9HZXQgdGhlIGxhc3QgSWQgaW5zZXJ0ZWQgIChvbmx5IGZvciBlbnRpdHkgd2l0aCBvbmx5IDEgaW50ZWdlciBGaWVsZCBhcyBLZXkpCiAgICAgICAgICAgIC8vIEBzZWUgYWxzbyA6IGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMzcyMzg4L215c3FsLXNlbGVjdC1sYXN0LWluc2VydC1pZC1mb3ItY29tcG91bmQta2V5LWlzLWl0LXBvc3NpYmxlCiAgICAgICAgICAgICRuYlBrSW50ZWdlciA9IDA7CiAgICAgICAgICAgICRuYW1lT2ZQayA9ICcnOwogICAgICAgICAgICBmb3JlYWNoKCRlbnRpdHlQYXJhbS0+Z2V0UGsoKSBhcyAkcGspewogICAgICAgICAgICAgICAgaWYoJHBrLT5nZXRUeXBlKCkgPT0gT3JtQ0FTVDo6JElOVEVHRVIpewogICAgICAgICAgICAgICAgICAgICRuYlBrSW50ZWdlcisrOwogICAgICAgICAgICAgICAgICAgICRuYW1lT2ZQayA9ICRway0+Z2V0TmFtZSgpOwoJCSAgICAgICAgICAgIH0KICAgICAgICAgICAgCX0KICAgICAgICAgICAgaWYoJG5iUGtJbnRlZ2VyID09IDEgJiYgJG5hbWVPZlBrICE9ICcnICYmIGVtcHR5KCR2YWx1ZXNbJG5hbWVPZlBrXSkpewogICAgICAgICAgICAgICAgJG5ld0lkID0gT3JtRGI6OmdldE9uZSgiU0VMRUNUIExBU1RfSU5TRVJUX0lEKCkiKTsKICAgICAgICAgICAgICAgICRlbnRpdHlQYXJhbS0+c2V0KCRuYW1lT2ZQaywgJG5ld0lkKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAKCQlyZXR1cm4gJGVudGl0eVBhcmFtOwoKCX0KCQogICAgLyoqCiAgICAgKiAgVXBkYXRlIGRhdGEgaW50byBkYXRhYmFzZS4gVGhlIHRoaXJkIHBhcmFtZXRlciBtdXN0IGZvbGxvdyB0aGlzIHNjaGVtZQogICAgICogCiAgICAgKiBFeGFtcGxlIGZvciBhIG5ldyBDdXN0b21lciA6IAogICAgICogCiAgICAgKiA8Y29kZT4KICAgICAqICAgICAgICRteUFycmF5ID0gYXJyYXkoKTsKICAgICAqICAgICAgICRteUFycmF5W10gPSBhcnJheSgnY3VzdG9tZXJfaWQnPT4xLCAnbGFzdE5hbWUnPT5udWxsLCAnbmFtZSc9PidEdXBvbnQnKTsgICAgPC0tIHVwZGF0ZSBOYW1lIHZhbHVlLCBlcmFzZSBsYXN0TmFtZSB2YWx1ZSBpbiBkYXRhYmFzZQogICAgICogICAgICAgJG15QXJyYXlbXSA9IGFycmF5KCdjdXN0b21lcl9pZCc9PjIsICduYW1lJz0+J0R1cmFudCcpOyAgICAgICAgICAgICAgICAgICAgICA8LS0gdXBkYXRlIE5hbWUgdmFsdWUKICAgICAqICAgICAgICRteUFycmF5W10gPSBhcnJheSgnY3VzdG9tZXJfaWQnPT4zLCAnbGFzdE5hbWUnPT4nSm9obicsICduYW1lJz0+J0RvZScpOyAgICAgPC0tIHVwZGF0ZSBOYW1lIHZhbHVlIGFuZCBsYXN0TmFtZSB2YWx1ZQogICAgICogCiAgICAgKiAgICAgICAkY3VzdG9tZXIgPSBNeUF1dG9sb2FkOjpnZXRJbnN0YW5jZSgkdGhpcy0+R2V0TmFtZSgpLCAnY3VzdG9tZXInKTsKICAgICAqICAgICAgIAogICAgICogICAgICAgJGN1c3RvbWVyID0gT3JtQ29yZTo6ZmluZEJ5SWQoJGN1c3RvbWVyLCAxKTsKICAgICAqICAgICAgICRjdXN0b21lci0+c2V0KCdsYXN0TmFtZSc9PidOZXdMYXN0TmFtZScpOwogICAgICogCiAgICAgKiAgICAgICBPcm1Db3JlOjp1cGRhdGVFbnRpdHkoJGN1c3RvbWVyKTsKICAgICAqIDwvY29kZT4KICAgICAqIAkgCiAgICAgKiBZb3UgY291bGQgYWxzbyBjb2RlIGZvciB0aGUgbGFzdCBsaW5lIDogJGN1c3RvbWVyLT5zYXZlKCk7ICBpdCB3aWxsIGF1dG9tYXRpY2FsbHkgCgkgKgogICAgICogQHBhcmFtIE9ybUVudGl0eSBhbiBpbnN0YW5jZSBvZiB0aGUgZW50aXR5CgkgKgoJICogQHJldHVybiB0aGUgZW50aXR5IHNhdmVkIHdpdGggaXRzIG5ldyBJZCAoY3VzdG9tZXJfaWQgaW4gbXkgZXhhbXBsZSkKICAgICAqLwkKCXB1YmxpYyBzdGF0aWMgZmluYWwgZnVuY3Rpb24gdXBkYXRlRW50aXR5KE9ybUVudGl0eSAmJGVudGl0eVBhcmFtKSB7CgoJCSRsaXN0ZUZpZWxkID0gJGVudGl0eVBhcmFtLT5nZXRGaWVsZHMoKTsKCQkkdmFsdWVzID0gJGVudGl0eVBhcmFtLT5nZXRWYWx1ZXMoKTsKCQkkaW5kZXhlcyA9ICRlbnRpdHlQYXJhbS0+Z2V0SW5kZXhlcygpOwoKCQkkc3RyID0gIiI7CgkJJHdoZXJlID0gJyc7CgkJJHBhcmFtcyA9IGFycmF5KCk7CgkJJGhhc0tleSA9IGZhbHNlOwoJCSAgCgkJLy9BbGwgdGhlIHJlcXVpcmVkIHZhbHVlcyBtdXN0IGJlIHByZXNlbnQKCQlmb3JlYWNoKCRsaXN0ZUZpZWxkIGFzICRmaWVsZCkgewoJCQoJCQkvL1dlIGRvbid0IHVwZGF0ZSB0aGUgdHJhbnNpZW50IEZpZWxkcyAKCQkJaWYoJGZpZWxkLT5nZXRUeXBlKCkgPT0gT3JtQ0FTVDo6JE5PTkUpIHsKCQkJCWNvbnRpbnVlOwoJCQl9CgoJCQkvL2lmIHRoZSBmaWVsZCBpcyBlbXB0eSBhbmQgd2UgaGF2ZSBhIGRlZmF1bHQgdmFsdWUgd2Ugc2V0IGl0IG1hbnVhbGx5CgkJCWlmKGVtcHR5KCR2YWx1ZXNbJGZpZWxkLT5nZXROYW1lKCldKSAmJiAkZmllbGQtPmdldERlZmF1bHRWYWx1ZSgpICE9IG51bGwpewoJCQkJJHZhbHVlc1skZmllbGQtPmdldE5hbWUoKV0gPSAkZmllbGQtPmdldERlZmF1bHRWYWx1ZSgpOwoJCQl9IAoJCQoJCQkvL0lmIGl0J3Mgbm90IHNldAoJCQlpZihpc19udWxsKCgkdmFsdWVzWyRmaWVsZC0+Z2V0TmFtZSgpXSkpKSB7CgkJCQoJCQkJLy9JZiBpdCdzIGEgcHJpbWFyeUtleSB3ZSB0aHJvdyBhIGV4Y2VwdGlvbgoJCQkJaWYoJGZpZWxkLT5pc1ByaW1hcnlLRVkoKSkgewoJCQkJCXRocm93IG5ldyBPcm1JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oJ3RoZSBwcmltYXJ5S2V5ICcuJGZpZWxkLT5nZXROYW1lKCkuJyBpcyBtaXNzaW5nIGZvciB0aGUgZW50aXR5IDogJy4kZW50aXR5UGFyYW0tPmdldE5hbWUoKSk7CgkJCQl9CgkJCQkKCQkJCS8vYW4gZW1wdHkgYXNzb2NpYXRpdmUgZmllbGQgOiBubyBwcm9ibGVtLCB3ZSBjYW4gcGFzcwoJCQkJaWYoJGZpZWxkLT5pc0Fzc29jaWF0ZUtFWSgpKSB7CgkJCQkJY29udGludWU7CgkJCQl9CgkJCQkKCQkJCS8vSWYgaXQncyBhIG5vIG51bGxhYmxlIGZpZWxkIHdlIHRocm93IGEgZXhjZXB0aW9uCgkJCQlpZighJGZpZWxkLT5pc051bGxhYmxlKCkpIHsKCQkJCQl0aHJvdyBuZXcgT3JtSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCd0aGUgZmllbGQgJy4kZmllbGQtPmdldE5hbWUoKS4nIG9mIEVudGl0eSAgJy4kZW50aXR5UGFyYW0tPmdldE5hbWUoKS4nIGNhblwndCBiZSBudWxsJyk7CgkJCQl9CgkJCX0gZWxzZSB7CgkJCQkvLyBDb250cm9sIFVVSUQgdHlwZQoJCQkJaWYoJGZpZWxkLT5nZXRUeXBlKCkgPT0gT3JtQ0FTVDo6JFVVSUQpewoJCQkJCSRwYXR0ZXJuID0gJy9eWzAtOWEtZl17OH0tWzAtOWEtZl17NH0tWzEtNV1bMC05YS1mXXszfS1bODlhYl1bMC05YS1mXXszfS1bMC05YS1mXXsxMn0kL2knOwoJCQkJCQoJCQkJCWlmKCFwcmVnX21hdGNoKCRwYXR0ZXJuLCAkdmFsdWVzWyRmaWVsZC0+Z2V0TmFtZSgpXSkpewoJCQkJCQl0aHJvdyBuZXcgT3JtSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCd0aGUgZmllbGQgJy4kZmllbGQtPmdldE5hbWUoKS4nIG9mIEVudGl0eSAgJy4kZW50aXR5UGFyYW0tPmdldE5hbWUoKS4nIGRvZXNuXCd0IG1hdGNoIHRoZSBVVUlEIHBhdHRlcm4gOiAnLiRwYXR0ZXJuKTsKCQkJCQl9CgkJCQl9CgkJCX0KCQkJCgkJCQoJCQkKCQkJLy9JZiBpdCdzIGEgcHJpbWFyeUtleQoJCQlpZigkZmllbGQtPmlzUHJpbWFyeUtFWSgpKSB7CgkJCQkkd2hlcmUgPSAnIFdIRVJFICcuJGZpZWxkLT5nZXROYW1lKCkuJyA9ID8nOwoJCQkJJGhhc0tleSA9IHRydWU7CgkJCQkka2V5VmFsdWUgPSAkdmFsdWVzWyRmaWVsZC0+Z2V0TmFtZSgpXTsKCQkJfQoKCQkJaWYoIWVtcHR5KCRzdHIpKSB7CgkJCSAgJHN0ciAuPSAnLCc7CgkJCX0KCgkJCSRzdHIgLj0gJyAnLiRmaWVsZC0+Z2V0TmFtZSgpLicgPSA/ICc7CgoJCQkkcGFyYW1zW10gPSBPcm1Db3JlOjpfZmllbGRUb0RCVmFsdWUoJHZhbHVlc1skZmllbGQtPmdldE5hbWUoKV0sICRmaWVsZC0+Z2V0VHlwZSgpKTsKCgkJfQoJCQoJCS8vY29udHJvbCB1bmlxdWVuZXNzIG9uIHVuaXF1ZSBGaWVsZAoJCWZvcmVhY2goJGluZGV4ZXMgYXMgJGluZGV4KXsKCQkJaWYoISRpbmRleFsndW5pcXVlJ10pewoJCQkJY29udGludWU7CgkJCX0KCQkJCgkJCSRxdWVyeSA9ICdTRUxFQ1QgQ09VTlQoKikgRlJPTSAnLiRlbnRpdHlQYXJhbS0+Z2V0RGJuYW1lKCkuJyBXSEVSRSAxICc7CgkJCSRhcnJheUZpbmQgPSBhcnJheSgpOwoJCQkkbXNnRXJyb3IgPSAneyc7CgkJCSRpc0ZpcnN0ID0gdHJ1ZTsKCQkJZm9yZWFjaCgkaW5kZXhbJ2ZpZWxkcyddIGFzICRlbHQpewoJCQkJaWYoISRpc0ZpcnN0KXsKCQkJCQkkbXNnRXJyb3IgLj0nLCc7CgkJCQl9CgkJCQlpZihlbXB0eSgkdmFsdWVzWyRlbHRdKSl7CgkJCQkJJHF1ZXJ5IC49ICcgQU5EICcgLiAkZWx0IC4gJyBJUyBOVUxMICc7CgkJCQl9IGVsc2UgewoJCQkJCSRxdWVyeSAuPSAnIEFORCAnIC4gJGVsdCAuICcgPSA/ICc7CgkJCQkJJGFycmF5RmluZFtdID0gJHZhbHVlc1skZWx0XTsKCQkJCX0KCQkJCSRtc2dFcnJvciAuPSAiIHskZWx0fSA9IHskdmFsdWVzWyRlbHRdfSAiOwoJCQl9CgkJCWZvcmVhY2goJGVudGl0eVBhcmFtLT5nZXRQaygpIGFzICRwa25hbWUgPT4gJHBrKXsKCQkJCSRxdWVyeSAuPSAnIEFORCAnIC4gJHBrbmFtZSAuICcgIT0gPyAnOwoJCQkJJGFycmF5RmluZFtdID0gJHZhbHVlc1skcGtuYW1lXTsJCQkKCQkJfQoKCQkJJG1zZ0Vycm9yIC49ICd9JzsKCQkJCgkJCS8vRXhlY3V0aW9uCgkJCSRyZXN1bHQgPSBPcm1EYjo6Z2V0T25lKCRxdWVyeSwKCQkJCQkJCQkJJGFycmF5RmluZCwKCQkJCQkJCQkJIkRhdGFiYXNlIGVycm9yIGR1cmluZyB1bmljaXR5IGNvbnRyb2wgaW4gT3JtQ29yZTo6dXBkYXRlRW50aXR5KE9ybUVudGl0eSAmeyRlbnRpdHlQYXJhbS0+Z2V0TmFtZSgpfSkiKTsKCQkKCQkJaWYoJHJlc3VsdCAhPSAwKXsKCQkJCXRocm93IG5ldyBPcm1JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImFuIEVudGl0eSB7JGVudGl0eVBhcmFtLT5nZXROYW1lKCl9IHdpdGggdGhlIHNhbWUgZmllbGRzICh7JG1zZ0Vycm9yfSkgYWxyZWFkeSBleGlzdHMgaW4gZGF0YWJhc2UiKTsKCQkJfQoJCX0KCgkJaWYoJGhhc0tleSkgewoJCQkkcGFyYW1zW10gPSAka2V5VmFsdWU7CgkJfQoKCQkkcXVlcnlVcGRhdGUgPSAnVVBEQVRFICcuJGVudGl0eVBhcmFtLT5nZXREYm5hbWUoKS4nIFNFVCAnLiRzdHIuJHdoZXJlOwoJCgkJLy9FeGVjdXRpb24KCQkkcmVzdWx0ID0gT3JtRGI6OmV4ZWN1dGUoJHF1ZXJ5VXBkYXRlLAoJCQkJCQkJCQkkcGFyYW1zLAoJCQkJCQkJCQkiRGF0YWJhc2UgZXJyb3IgZHVyaW5nIE9ybUNvcmU6OnVwZGF0ZUVudGl0eShPcm1FbnRpdHkgJnskZW50aXR5UGFyYW0tPmdldE5hbWUoKX0pIik7CgkJCgkJLyppZigkZW50aXR5UGFyYW0tPmlzSW5kZXhhYmxlKCkpIHsgIAoJCQlPcm1JbmRleGluZzo6VXBkYXRlV29yZHMoJGVudGl0eVBhcmFtLT5nZXRNb2R1bGVOYW1lKCksICRlbnRpdHlQYXJhbSk7CgkJfSovCgkJCgkJLy9lbXB0eSBjYWNoZQoJCU9ybUNhY2hlOjpnZXRJbnN0YW5jZSgpLT5jbGVhckNhY2hlKCk7CgkJCgkJcmV0dXJuICRlbnRpdHlQYXJhbTsKCX0KICAKICAgIC8qKgogICAgKiBEZWxldGUgaW5mb3JtYXRpb24gaW50byBkYXRhYmFzZQogICAgKiAgIAogICAgKiBFeGFtcGxlIGZvciBhIHNpbmdsZSBkZWxldGlvbiA6IAogICAgKiAKICAgICogPGNvZGU+CiAgICAqICAgICAgICRjdXN0b21lciA9IE15QXV0b2xvYWQ6OmdldEluc3RhbmNlKCR0aGlzLT5HZXROYW1lKCksICdjdXN0b21lcicpOwogICAgKiAKICAgICogICAgICAgT3JtQ29yZTo6ZGVsZXRlQnlJZHMoJGN1c3RvbWVyLCBhcnJheSgxKTsKICAgICogPC9jb2RlPgogICAgKiAKICAgICogIEV4YW1wbGUgZm9yIG11bHRpcGxlIGRlbGV0aW9uIDogCiAgICAqIAogICAgKiA8Y29kZT4KICAgICogICAgICAgJG15QXJyYXkgPSBhcnJheSgpOwogICAgKiAgICAgICAkbXlBcnJheVtdID0gMTsKICAgICogICAgICAgJG15QXJyYXlbXSA9IDI7CiAgICAqICAgICAgICRteUFycmF5W10gPSAzOwogICAgKiAKICAgICogICAgICAgJGN1c3RvbWVyID0gTXlBdXRvbG9hZDo6Z2V0SW5zdGFuY2UoJHRoaXMtPkdldE5hbWUoKSwgJ2N1c3RvbWVyJyk7CiAgICAqIAogICAgKiAgICAgICBPcm1Db3JlOjpkZWxldGVCeUlkcygkY3VzdG9tZXIsICRteUFycmF5KTsKICAgICogPC9jb2RlPgogICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgKiBAcGFyYW0gT3JtRW50aXR5IGFuIGluc3RhbmNlIG9mIHRoZSBlbnRpdHkgICAgCiAgICAqIEBwYXJhbSBhcnJheSBhbGwgdGhlIGlkcyB0byBkZWxldGUgKCRjdXN0b21lcl9pZCBpbiBteSBleGFtcGxlKQogICAgKi8KCXB1YmxpYyBzdGF0aWMgZmluYWwgZnVuY3Rpb24gZGVsZXRlQnlJZHMoT3JtRW50aXR5ICYkZW50aXR5UGFyYW0sICRpZHMpIHsKCgkJJGxpc3RlRmllbGQgPSAkZW50aXR5UGFyYW0tPmdldEZpZWxkcygpOwoKCQlmb3JlYWNoKCRsaXN0ZUZpZWxkIGFzICRmaWVsZCkKCQl7CgkJICBpZighJGZpZWxkLT5pc1ByaW1hcnlLRVkoKSkKCQkgIHsgCgkJCWNvbnRpbnVlOwoJCSAgfQoJCSAgJHR5cGUgPSAkZmllbGQtPmdldFR5cGUoKTsKCQkgICRuYW1lID0gJGZpZWxkLT5nZXROYW1lKCk7CgkJfSAgCgoJCSR3aGVyZSA9ICcnOwoJCWZvcmVhY2goJGlkcyBhcyAkc2lkKQoJCXsKCQkgIGlmKCFlbXB0eSgkd2hlcmUpKQoJCSAgewoJCQkkd2hlcmUgLj0gJyBPUiAnOwoJCSAgfQoJCSAgCgkJICAkd2hlcmUgLj0gJG5hbWUuJyA9ID8nOwoJCSAgJHBhcmFtc1tdID0gT3JtQ29yZTo6X2ZpZWxkVG9EQlZhbHVlKCRzaWQsICR0eXBlKTsgIAoJCX0KCgoJCSRxdWVyeURlbGV0ZSA9ICdERUxFVEUgRlJPTSAnLiRlbnRpdHlQYXJhbS0+Z2V0RGJuYW1lKCkuJyBXSEVSRSAnLiR3aGVyZTsKCgkJLy9FeGVjdXRpb24KCQkkcmVzdWx0ID0gT3JtRGI6OmV4ZWN1dGUoJHF1ZXJ5RGVsZXRlLAoJCQkJCQkJCQkkcGFyYW1zLAoJCQkJCQkJCQkiRGF0YWJhc2UgZXJyb3IgZHVyaW5nIE9ybUNvcmU6OmRlbGV0ZUVudGl0eShPcm1FbnRpdHkgJnskZW50aXR5UGFyYW0tPmdldE5hbWUoKX0pIik7CgkJCQkJCQkJCQoJCQoKCQkvL2lmKCRlbnRpdHlQYXJhbS0+aXNJbmRleGFibGUoKSkKCQkvL3sgIAoJCSAgLy8gJG1vZG9wcyA9IGNtc21zKCktPkdldE1vZHVsZU9wZXJhdGlvbnMoKTsKCQkgIC8vIGlmKG1ldGhvZF9leGlzdHMoJG1vZG9wcywiR2V0U2VhcmNoTW9kdWxlIikpCgkJICAvLyB7CgkJCS8vIE9ybUluZGV4aW5nOjpzZXRTZWFyY2goJG1vZG9wcy0+R2V0U2VhcmNoTW9kdWxlKCkpOwoJCSAgLy8gfQoJCSAgLy9mb3JlYWNoKCRpZHMgYXMgJHNpZCkKCQkgIC8vewoJCQkvL09ybUluZGV4aW5nOjpEZWxldGVXb3JkcygkZW50aXR5UGFyYW0tPmdldE1vZHVsZU5hbWUoKSwgJGVudGl0eVBhcmFtLCAkc2lkKTsKCQkgIC8vfQoJCSAgCgkJLy99CgkJCgkJLy9lbXB0eSBjYWNoZQoJCU9ybUNhY2hlOjpnZXRJbnN0YW5jZSgpLT5jbGVhckNhY2hlKCk7Cgl9CiAgIAogICAgLyoqCiAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBvY2N1cnJlbmNlcyBmcm9tIHRoZSB0YWJsZSBvZiB0aGUgZW50aXR5IGluIFBhcmFtZXRlcnMKICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAqIEBwYXJhbSBPcm1FbnRpdHkgYW4gaW5zdGFuY2Ugb2YgdGhlIGVudGl0eSAgICAKCSogCiAgICAqIEByZXR1cm4gaW50IHRoZSBudW1iZXIgb2Ygb2NjdXJyZW5jZXMgZnJvbSB0aGUgdGFibGUgICAKICAgICovCglwdWJsaWMgc3RhdGljIGZpbmFsIGZ1bmN0aW9uIGNvdW50QWxsKE9ybUVudGl0eSAmJGVudGl0eVBhcmFtKSB7CgoJCSRxdWVyeVNlbGVjdCA9ICdTRUxFQ1QgY291bnQoKikgRlJPTSAnLiRlbnRpdHlQYXJhbS0+Z2V0RGJuYW1lKCk7CgkJCgkJLy9FeGVjdXRpb24KCQkkcmVzdWx0ID0gT3JtRGI6OmdldE9uZSgkcXVlcnlTZWxlY3QsCgkJCQkJCQkJCW51bGwsCgkJCQkJCQkJCSJEYXRhYmFzZSBlcnJvciBkdXJpbmcgT3JtQ29yZTo6Y291bnRBbGwoT3JtRW50aXR5ICZ7JGVudGl0eVBhcmFtLT5nZXROYW1lKCl9KSIpOwoJCQoJCXJldHVybiAkcmVzdWx0OwoJfQogIAogICAgLyoqCiAgICAqIFJldHVybnMgYWxsIHRoZSBvY2N1cnJlbmNlcyBmcm9tIHRoZSB0YWJsZSBvZiB0aGUgZW50aXR5IGluIFBhcmFtZXRlcnMKICAgICogCiAgICAqIEBwYXJhbSBPcm1FbnRpdHkgYW4gaW5zdGFuY2Ugb2YgdGhlIGVudGl0eSAgCgkqCiAgICAqIEByZXR1cm4gYXJyYXk8T3JtRW50aXR5PiBsaXN0IG9mIEVudGl0aWVzIGZvdW5kCiAgICAqLwoJcHVibGljIHN0YXRpYyBmaW5hbCBmdW5jdGlvbiBmaW5kQWxsKE9ybUVudGl0eSAmJGVudGl0eVBhcmFtLCBPcm1PcmRlckJ5ICYkb3JkZXJCeT1udWxsLCBPcm1MaW1pdCAmJGxpbWl0ID0gbnVsbCkgewoJCXJldHVybiBPcm1Db3JlOjpmaW5kQnlFeGFtcGxlKCRlbnRpdHlQYXJhbSwgbmV3IE9ybUV4YW1wbGUoKSwgJG9yZGVyQnksICRsaW1pdCk7Cgl9CgkKCS8qKgoJICogSW5uZXIgZnVuY3Rpb24gdG8gZmFjdG9yaXplIHNvbWUgY29kZSBmb3IgZWFjaCAiZmluZCoiIGZ1bmN0aW9ucwoJICogIEl0IHdpbGwgcmV0cmlldmUgYWxsIHRoZSBpbmZvcm1hdGlvbnMgb24gdGhlIEFLJ3MgRmllbGQKCSAqCiAgICAgKiBAcGFyYW0gT3JtRW50aXR5IGFuIGluc3RhbmNlIG9mIHRoZSBlbnRpdHkgIAoJICogQHBhcmFtIGFycmF5IHRoZSBsaXN0IG9mIG9iamVjdCBFbnRpdHkgdG8gcG9wdWxhdGUKCSAqCiAgICAgKiBAcmV0dXJuIGFycmF5PE9ybUVudGl0eT4gbGlzdCBvZiBFbnRpdGllcyBwb3B1bGF0ZSB3aXRoIGFsbCB0aGUgaW5mb3JtYXRpb25zIG9uIEFLJ3MgRmllbGQKCSAqKi8KCXB1YmxpYyBzdGF0aWMgZmluYWwgZnVuY3Rpb24gcG9wdWxhdGVGaWVsZHMoT3JtRW50aXR5ICYkZW50aXR5UGFyYW0sIGFycmF5ICRlbnRpdHlzKSB7CgkJCgkJaWYoZW1wdHkoJGVudGl0eXMpKXsKCQkJcmV0dXJuICRlbnRpdHlzOwoJCX0KCgkJJGxpc3RlRmllbGQgPSAkZW50aXR5UGFyYW0tPmdldEZpZWxkcygpOwoJCWZvcmVhY2goJGxpc3RlRmllbGQgYXMgJGZpZWxkKSB7CgoJCQkvL1Rlc3QgdGhlIHByZXNlbmNlIG9mICRBSwoJCSAgCWlmKCRmaWVsZC0+aXNBc3NvY2lhdGVLRVkoKSkgewoJCQkJJGVudGl0eXMgPSBPcm1Db3JlOjpwb3B1bGF0ZUFLRmllbGQoJGVudGl0eVBhcmFtLCAkZW50aXR5cywgJGZpZWxkKTsKCQkgIAl9IAoJCSAgCQoJCSAgCS8vVGVzdCB0aGUgcHJlc2VuY2Ugb2YgJEZLCgkJICAJaWYoJGZpZWxkLT5pc0ZvcmVpZ25LRVkoKSAmJiBzdHJwb3MoJGZpZWxkLT5nZXRLRVlOYW1lKCksIi4iKSkgewoJCSAgCQkKCQkgIAkJbGlzdCgkZW50aXR5QXNzb2NOYW1lLCAkZmllbGRBc3NvY2lhdGVOYW1lKSA9IGV4cGxvZGUoIi4iLCAkZmllbGQtPmdldEtFWU5hbWUoKSk7CgkJCQkkZW50aXR5QXNzb2MgPSBuZXcgJGVudGl0eUFzc29jTmFtZSgpOwoJCSAgCQkKCQkgIAkJLy9Bdm9pZCBGSyBwb2ludGluZyBvbiBjb21wb3NpdGUgcHJpbWFyeSBrZXkKCQkgIAkJaWYoY291bnQoJGVudGl0eUFzc29jLT5nZXRQaygpKSA9PSAxKXsKCQkgIAkJCSRlbnRpdHlzID0gT3JtQ29yZTo6cG9wdWxhdGVGS0ZpZWxkKCRlbnRpdHlQYXJhbSwgJGVudGl0eXMsICRmaWVsZCk7CgkJICAJCX0KCQkgIAl9CgkJfQoKCQkkYWxpYXMgPSAkZW50aXR5UGFyYW0tPmdldEFsaWFzKCk7CgkJZm9yZWFjaCAoJGFsaWFzIGFzICRhbkFsaWFzID0+ICRhbGlhc0NvbXBvbmVudCkgewoJCQkkZW50aXR5cyA9IE9ybUNvcmU6OnBvcHVsYXRlQWxpYXNGaWVsZCgkZW50aXR5UGFyYW0sICRlbnRpdHlzLCAkYW5BbGlhcyk7CgkJfQoJCQoJCXJldHVybiAkZW50aXR5czsKCX0KCgkvKioKCSAqIFdpbGwgZm91bmQgYWxsIHRoZSBlbnRpdHlzIGF2YWlsYWJsZSBmb3IgdGhlIEFsaWFzIHBhcmFtZXRlciAkZW50aXR5UGFyYW0uCgkgKiAgIEFsbG93ICRteWVudGl0eS0+Z2V0KCdteV9hbGlhcycpOwoJICogCgkgKiAKCSAqIEBwYXJhbSBPcm1FbnRpdHkgCgkgKiBAcGFyYW0gYXJyYXkgbGlzdCBvZiBPYmplY3QgT3JtRW50aXR5CgkgKiBAcGFyYW0gc3RyaW5nIHRoZSBhbGlhcyB0byBwb3B1bGF0ZQoJICogCgkgKiBAcmV0dXJuIGxpc3Qgb2YgT2JqZWN0IE9ybUVudGl0eSB3aXRoIHRoZSB2YWx1ZXMgb2YgdGhlIGFsaWFzIHBvcHVsYXRlZCBieSB0aGUgb3RoZXIgT3JtRW50aXR5IGZvdW5kZWQKCSAqIAoJICogQHNpbmNlIDAuMy4wCgkgKgoJICovCglwdWJsaWMgc3RhdGljIGZpbmFsIGZ1bmN0aW9uIHBvcHVsYXRlQWxpYXNGaWVsZCgkZW50aXR5UGFyYW0sICRlbnRpdHlzLCAkYW5BbGlhcykgewoKCQkkYWxpYXMgPSAkZW50aXR5UGFyYW0tPmdldEFsaWFzKCk7CgkJaWYoIWlzc2V0KCRhbGlhc1skYW5BbGlhc10pKXsKCQkJdGhyb3cgbmV3IE9ybUlsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZnVuY3Rpb24gcG9wdWxhdGVBbGlhc0ZpZWxkKFwkZW50aXR5UGFyYW0sIFwkZW50aXR5cywgXCRhbkFsaWFzKSBvbmx5IGFjY2VwdCBhbGlhcyBuYW1lIGluIHRoaXJkIHBhcmFtZXRlciIpOwoJCX0KCgkJJGFsaWFzQ29tcG9uZW50ID0gJGFsaWFzWyRhbkFsaWFzXTsgCgkJZm9yZWFjaCAoJGFsaWFzQ29tcG9uZW50IGFzICRjb21wb25lbnQpIHsKCQkJJGZpZWxkID0gJGVudGl0eVBhcmFtLT5nZXRGaWVsZEJ5TmFtZSgkY29tcG9uZW50KTsKCQkJbGlzdCgkZW50aXR5QXNzb2NOYW1lLCAkZmllbGRBc3NvY2lhdGVOYW1lKSA9IGV4cGxvZGUoIi4iLCAkZmllbGQtPmdldEtFWU5hbWUoKSk7CgkJCSRlbnRpdHlBc3NvYyA9IG5ldyAkZW50aXR5QXNzb2NOYW1lKCk7CgoJCQkvL0luaXRpYXRlIHRoZSBmaWVsZCBhc3NvY2lhdGUgd2l0aCBhbiBlbXB0eSBhcnJheS4KCQkJJGVudGl0eXNLZXlzID0gYXJyYXkoKTsKCQkJZm9yZWFjaCgkZW50aXR5cyBhcyAkZW50aXR5KXsKCQkJCSRlbnRpdHktPnNldCgkYW5BbGlhcywgbnVsbCk7CgkJCX0KCgkJCSRzcWxmaWVsZHZhbHVlW10gPSAkZmllbGQtPmdldE5hbWUoKTsKCQkJJGFzc29jRmllbGRzTmFtZVtdID0gJGZpZWxkQXNzb2NpYXRlTmFtZTsKCQkJJHNxbGZpZWxkbmFtZVtdID0gIiB7JGZpZWxkQXNzb2NpYXRlTmFtZX0gPSA/ICI7CgoJCX0KCgkJLy8gKCBmaWVsZDEgPSA/IGFuZCBmaWVsZDIgPSA/ICkgCgkJJHNxbGZpZWxkc25hbWUgPSAnICggJyAuIGltcGxvZGUoIiBBTkQgIiwgJHNxbGZpZWxkbmFtZSkgLiAnICkgJyA7CgkJJHNxbGZpZWxkc25hbWVPUiA9ICcgT1IgJyAuICRzcWxmaWVsZHNuYW1lOwoKCQkkc3FsZmllbGRzID0gIiAxICI7CgkJaWYoIWVtcHR5KCRlbnRpdHlzKSl7CgkJCSRzcWxmaWVsZHMgPSAkc3FsZmllbGRzbmFtZSAuIHN0cl9yZXBlYXQoJHNxbGZpZWxkc25hbWVPUiwgY291bnQoJGVudGl0eXMpLTEpOwkKCQl9IAoKCQkkcXVlcnlBZGQgPSAnU0VMRUNUICogRlJPTSAnIC4gJGVudGl0eUFzc29jLT5nZXREYm5hbWUoKSAuICcgV0hFUkUgJyAuICRzcWxmaWVsZHM7CgkJJHF1ZXJ5UGFyYW1zID0gYXJyYXkoKTsKCQlmb3JlYWNoKCRlbnRpdHlzIGFzICRlbnRpdHkpewoJCQoKCQkJZm9yZWFjaCAoJGFzc29jRmllbGRzTmFtZSBhcyAkZmllbGRuYW1lKSB7CgoJCQkJJHF1ZXJ5UGFyYW1zW10gPSAkZW50aXR5LT5nZXQoJGZpZWxkbmFtZSk7CgkJCX0KCQkJCgkJfQoJCQkJCQoJCS8vIE9yZGVyIEJ5IAoJCWlmKCRlbnRpdHlBc3NvYy0+Z2V0RGVmYXVsdE9yZGVyQnkoKSAhPSBudWxsKSB7CgkJCSRxdWVyeUFkZCAuPSAkZW50aXR5QXNzb2MtPmdldERlZmF1bHRPcmRlckJ5KCktPmdldE9yZGVyQnkoKTsKCQl9CgoJCS8vRXhlY3V0aW9uCgkJJHJlc3VsdCA9IE9ybURiOjpleGVjdXRlKCRxdWVyeUFkZCwKCQkJCQkJCQkkcXVlcnlQYXJhbXMsCgkJCQkJCQkJIkRhdGFiYXNlIGVycm9yIGR1cmluZyByZXF1ZXN0IHRvIGdldCBhc3NvY2lhdGl2ZSBlbnRpdHkgJGVudGl0eUFzc29jTmFtZSIpOwoJCQoJCSRjb3VudEZpZWxkcyA9IGNvdW50KCRzcWxmaWVsZHZhbHVlKTsKCgoJCXdoaWxlICgkcm93QXNzb2NpYXRlID0gJHJlc3VsdC0+RmV0Y2hSb3coKSkgewoJCQlmb3JlYWNoKCRlbnRpdHlzIGFzICRlbnRpdHkpewoJCQkJJGFscmVhZHlQcmVzZW50ID0gbnVsbDsKCQkJCSRpc21hdGNoID0gdHJ1ZTsKCQkJCWZvciAoICRpID0gMCA7ICRpIDwgJGNvdW50RmllbGRzOyAkaSsrKXsKCgkJCQkJaWYoJGVudGl0eS0+Z2V0KCRzcWxmaWVsZHZhbHVlWyRpXSkgIT09ICRyb3dBc3NvY2lhdGVbJGFzc29jRmllbGRzTmFtZVskaV1dKXsKCQkJCQkJJGlzbWF0Y2ggPSBmYWxzZTsKCQkJCQkJYnJlYWs7CgkJCQkJfQoJCQkJfQoJCQkJaWYoJGlzbWF0Y2gpewoJCQkJCS8vIEF0IHRoaXMgcG9pbnQgd2UgZm91bmQgYSByZXN1bHQgZm9yIHRoZSBjdXJyZW50IGVudGl0eS4KCQkJCQkvLyBXZSBtdXN0IGFkZCB0aGlzIHJlc3VsdCBpbnRvIHRoZSAkZmllbGQgCgoJCQkJCSRuZXdPYmplY3QgPSBPcm1Db3JlOjpyb3dUb0VudGl0eSAobmV3ICRlbnRpdHlBc3NvY05hbWUoKSwgJHJvd0Fzc29jaWF0ZSk7CgkJCQkJJGVudGl0eS0+c2V0KCRhbkFsaWFzLCAkbmV3T2JqZWN0KTsKCgkJCQl9CgkJCX0KCQl9CgoJCXJldHVybiAkZW50aXR5czsKCX0KCgkvKioKCSAqIFdpbGwgZm91bmQgYWxsIHRoZSBlbnRpdHlzIGF2YWlsYWJsZSBmb3IgdGhlIGZpZWxkIEFLIG9mIHBhcmFtZXRlciAkZW50aXR5UGFyYW0uCgkgKiAKCSAqIEBwYXJhbSBPcm1FbnRpdHkgCgkgKiBAcGFyYW0gYXJyYXkgbGlzdCBvZiBPYmplY3QgT3JtRW50aXR5CgkgKiBAcGFyYW0gT3JtRmllbGQgdGhlIEFLIGZpZWxkIHRvIHBvcHVsYXRlCgkgKiAKCSAqIEByZXR1cm4gbGlzdCBvZiBPYmplY3QgT3JtRW50aXR5IHdpdGggdGhlIHZhbHVlcyBvZiB0aGUgZmllbGQgQUsgcG9wdWxhdGVkIGJ5IHRoZSBvdGhlciBPcm1FbnRpdHkgZm91bmRlZAoJICogCgkgKiBAc2luY2UgMC4zLjAKCSAqCgkgKi8KCXB1YmxpYyBzdGF0aWMgZmluYWwgZnVuY3Rpb24gcG9wdWxhdGVBS0ZpZWxkKCRlbnRpdHlQYXJhbSwgJGVudGl0eXMsICRmaWVsZCl7CgoJCWlmKCEkZmllbGQtPmlzQXNzb2NpYXRlS0VZKCkpewoJCQl0aHJvdyBuZXcgT3JtSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJmdW5jdGlvbiBwb3B1bGF0ZUFLRmllbGQoXCRlbnRpdHlQYXJhbSwgXCRlbnRpdHlzLCBcJGZpZWxkKSBvbmx5IGFjY2VwdCBmaWVsZHMgb2YgdHlwZSBBc3NvY2lhdGVLZXkiKTsKCQl9CgoJCSRmaWVsZEFzc29jaWF0ZU5hbWUgPSBudWxsOwoJCWlmKHN0cnBvcygkZmllbGQtPmdldEtFWU5hbWUoKSwiLiIpKXsKCQkJbGlzdCgkZW50aXR5QXNzb2NOYW1lLCAkZmllbGRBc3NvY2lhdGVOYW1lKSA9IGV4cGxvZGUoIi4iLCAkZmllbGQtPmdldEtFWU5hbWUoKSk7CgkJCSRlbnRpdHlBc3NvYyA9IG5ldyAkZW50aXR5QXNzb2NOYW1lKCk7CgkJCQoKCgkJCSRzcWxmaWVsZG5hbWUgPSBhcnJheSgpOwoJCQkkc3FsZmllbGR2YWx1ZSA9IGFycmF5KCk7CgkJCWxpc3QoJGVudGl0eUN1cnJlbnROYW1lLCAkZmllbGRDdXJyZW50TmFtZSkgPSBleHBsb2RlKCIuIiwgJGVudGl0eUFzc29jLT5nZXRGaWVsZEJ5TmFtZSgkZmllbGRBc3NvY2lhdGVOYW1lKS0+Z2V0S0VZTmFtZSgpKTsKCQkJCQkKCQkJLy9UaGUgcGF0aCBtdXN0IHJldHVybiB0byB0aGUgY3VycmVudCBlbnRpdHkKCQkJaWYoc3RyY2FzZWNtcCgkZW50aXR5Q3VycmVudE5hbWUsJGVudGl0eVBhcmFtLT5nZXROYW1lKCkpICE9IDApewoJCQkJdGhyb3cgbmV3IE9ybUlsbGVnYWxDb25maWd1cmF0aW9uRXhjZXB0aW9uKCJJdCBzZWVtcyB5b3UgaGF2ZSBhIHdyb25nIHBhdGggYmV0d2VlbiB7JGVudGl0eVBhcmFtLT5nZXROYW1lKCl9LnskZmllbGQtPmdldE5hbWUoKX0gYW5kIHskZW50aXR5QXNzb2NOYW1lfS57JGZpZWxkQXNzb2NpYXRlTmFtZX0iKTsKCQkJfQoKCQkJLy9Jbml0aWF0ZSB0aGUgZmllbGQgYXNzb2NpYXRlIHdpdGggYW4gZW1wdHkgYXJyYXkuCgkJCSRlbnRpdHlzS2V5cyA9IGFycmF5KCk7CgkJCWZvcmVhY2goJGVudGl0eXMgYXMgJGVudGl0eSl7CgkJCQkkZW50aXR5LT5zZXQoJGZpZWxkLT5nZXROYW1lKCksIGFycmF5KCkpOwoJCQl9CgoJCQkkc3FsZmllbGR2YWx1ZVtdID0gJGZpZWxkQ3VycmVudE5hbWU7CgkJCSRhc3NvY0ZpZWxkc05hbWVbXSA9ICRmaWVsZEFzc29jaWF0ZU5hbWU7CgkJCSRzcWxmaWVsZG5hbWVbXSA9ICIgeyRmaWVsZEFzc29jaWF0ZU5hbWV9ID0gPyAiOwoKCQkJCgoJCS8vIFdlIGhhdmUgYW4gQUsgd2l0aCAyL21vcmUgRksgKGFsc28gd2UgYXJlIGFuIGVudGl0eSB3aXRoIGNvbXBvc2l0ZSBwcmltYXJ5IGtleSkJCgkJfSBlbHNlIHsKCQkJJGVudGl0eUFzc29jTmFtZSA9ICRmaWVsZC0+Z2V0S0VZTmFtZSgpOwoJCQkkZW50aXR5QXNzb2MgPSBuZXcgJGVudGl0eUFzc29jTmFtZSgpOwoKCQkJLy9Jbml0aWF0ZSB0aGUgZmllbGQgYXNzb2NpYXRlIHdpdGggYW4gZW1wdHkgYXJyYXkuCgkJCSRlbnRpdHlzS2V5cyA9IGFycmF5KCk7CgkJCWZvcmVhY2goJGVudGl0eXMgYXMgJGVudGl0eSl7CgkJCQkkZW50aXR5LT5zZXQoJGZpZWxkLT5nZXROYW1lKCksIGFycmF5KCkpOwoJCQl9CgoJCQkvL1RPRE8gOiByZW1lbWJlcmluZyB0aGlzIHBhcnQgaW4gbWVtb3J5IHRvIGF2b2lkIHRyaXBsZSByZXNlYWNoCgkJCSRzcWxmaWVsZG5hbWUgPSBhcnJheSgpOwoJCQkkc3FsZmllbGR2YWx1ZSA9IGFycmF5KCk7CgkJCWZvcmVhY2ggKCRlbnRpdHlBc3NvYy0+Z2V0RmllbGRzKCkgYXMgJGFzc29jRmllbGQpIHsKCgkJCQkvLyBXZSBkb24ndCB3YW50IGFub3RoZXIgd2VpcmQgRksgb24gYW4gZW50aXJlIGVudGl0eQoJCQkJaWYoJGFzc29jRmllbGQtPmlzRm9yZWlnbktleSgpICYmIHN0cnBvcygkYXNzb2NGaWVsZC0+Z2V0S0VZTmFtZSgpLCIuIikpewoJCQkJCQoJCQkJCWxpc3QoJGVudGl0eUN1cnJlbnROYW1lLCAkZmllbGRDdXJyZW50TmFtZSkgPSBleHBsb2RlKCIuIiwgJGFzc29jRmllbGQtPmdldEtFWU5hbWUoKSk7CgoJCQkJCS8vIElmIHRoaXMgRksgcG9pbnQgYmFjayBvbiB1cwoJCQkJCWlmKHN0cmNhc2VjbXAoJGVudGl0eUN1cnJlbnROYW1lLCRlbnRpdHlQYXJhbS0+Z2V0TmFtZSgpKSA9PT0gMCl7CgkJCQkJCSRzcWxmaWVsZHZhbHVlW10gPSAkZmllbGRDdXJyZW50TmFtZTsKCQkJCQkJJGFzc29jRmllbGRzTmFtZVtdID0gJGFzc29jRmllbGQtPmdldE5hbWUoKTsKCQkJCQkJJHNxbGZpZWxkbmFtZVtdID0gIiB7JGFzc29jRmllbGQtPmdldE5hbWUoKX0gPSA/ICI7CgkJCQkJfQoJCQkJfQoJCQl9CgoJCX0KCgkJLy8gKCBmaWVsZDEgPSA/IGFuZCBmaWVsZDIgPSA/ICkgCgkJJHNxbGZpZWxkc25hbWUgPSAnICggJyAuIGltcGxvZGUoIiBBTkQgIiwgJHNxbGZpZWxkbmFtZSkgLiAnICkgJyA7CgkJJHNxbGZpZWxkc25hbWVPUiA9ICcgT1IgJyAuICRzcWxmaWVsZHNuYW1lOwoKCQkkc3FsZmllbGRzID0gIiAxICI7CgkJaWYoIWVtcHR5KCRlbnRpdHlzKSl7CgkJCSRzcWxmaWVsZHMgPSAkc3FsZmllbGRzbmFtZSAuIHN0cl9yZXBlYXQoJHNxbGZpZWxkc25hbWVPUiwgY291bnQoJGVudGl0eXMpLTEpOwkKCQl9IAoKCQkkcXVlcnlBZGQgPSAnU0VMRUNUICogRlJPTSAnIC4gJGVudGl0eUFzc29jLT5nZXREYm5hbWUoKSAuICcgV0hFUkUgJyAuICRzcWxmaWVsZHM7CgkJJHF1ZXJ5UGFyYW1zID0gYXJyYXkoKTsKCQlmb3JlYWNoKCRlbnRpdHlzIGFzICRlbnRpdHkpewoJCQlmb3JlYWNoICgkc3FsZmllbGR2YWx1ZSBhcyAkZmllbGRuYW1lKSB7CgkJCQkkcXVlcnlQYXJhbXNbXSA9ICRlbnRpdHktPmdldCgkZmllbGRuYW1lKTsKCQkJfQoJCQkKCQl9CgkJCQkJCgkJLy8gT3JkZXIgQnkgCgkJaWYoJGVudGl0eUFzc29jLT5nZXREZWZhdWx0T3JkZXJCeSgpICE9IG51bGwpIHsKCQkJJHF1ZXJ5QWRkIC49ICRlbnRpdHlBc3NvYy0+Z2V0RGVmYXVsdE9yZGVyQnkoKS0+Z2V0T3JkZXJCeSgpOwoJCX0KCgkJLy9FeGVjdXRpb24KCQkkcmVzdWx0ID0gT3JtRGI6OmV4ZWN1dGUoJHF1ZXJ5QWRkLAoJCQkJCQkJCSRxdWVyeVBhcmFtcywKCQkJCQkJCQkiRGF0YWJhc2UgZXJyb3IgZHVyaW5nIHJlcXVlc3QgdG8gZ2V0IGFzc29jaWF0aXZlIGVudGl0eSAkZW50aXR5QXNzb2NOYW1lIik7CgkJCgkJJGNvdW50RmllbGRzID0gY291bnQoJHNxbGZpZWxkdmFsdWUpOwoKCQl3aGlsZSAoJHJvd0Fzc29jaWF0ZSA9ICRyZXN1bHQtPkZldGNoUm93KCkpIHsKCQkJZm9yZWFjaCgkZW50aXR5cyBhcyAkZW50aXR5KXsKCQkJCSRhbHJlYWR5UHJlc2VudCA9IG51bGw7CgkJCQkkaXNtYXRjaCA9IHRydWU7CgkJCQlmb3IgKCAkaSA9IDAgOyAkaSA8ICRjb3VudEZpZWxkczsgJGkrKyl7CgoJCQkJCWlmKCRlbnRpdHktPmdldCgkc3FsZmllbGR2YWx1ZVskaV0pICE9PSAkcm93QXNzb2NpYXRlWyRhc3NvY0ZpZWxkc05hbWVbJGldXSl7CgkJCQkJCSRpc21hdGNoID0gZmFsc2U7CgkJCQkJCWJyZWFrOwoJCQkJCX0KCQkJCX0KCQkJCWlmKCRpc21hdGNoKXsKCQkJCQkvLyBBdCB0aGlzIHBvaW50IHdlIGZvdW5kIGEgcmVzdWx0IGZvciB0aGUgY3VycmVudCBlbnRpdHkuCgkJCQkJLy8gV2UgbXVzdCBhZGQgdGhpcyByZXN1bHQgaW50byB0aGUgJGZpZWxkIAoJCQkJCSRhbHJlYWR5UHJlc2VudCA9ICRlbnRpdHktPmdldCgkZmllbGQtPmdldE5hbWUoKSk7CgkJCQkJJGFscmVhZHlQcmVzZW50W10gPSBPcm1Db3JlOjpyb3dUb0VudGl0eSAobmV3ICRlbnRpdHlBc3NvY05hbWUoKSwgJHJvd0Fzc29jaWF0ZSk7CgoJCQkJCSRlbnRpdHktPnNldCgkZmllbGQtPmdldE5hbWUoKSwgJGFscmVhZHlQcmVzZW50KTsKCgkJCQl9CgkJCX0KCQl9CgkJcmV0dXJuICRlbnRpdHlzOwoJfQoKCgkvKioKCSAqIFdpbGwgZm91bmQgYWxsIHRoZSBlbnRpdHlzIGF2YWlsYWJsZSBmb3IgdGhlIGZpZWxkIEZLIG9mIHBhcmFtZXRlciAkZW50aXR5UGFyYW0uCgkgKiAKCSAqIEBwYXJhbSBPcm1FbnRpdHkgCgkgKiBAcGFyYW0gYXJyYXkgbGlzdCBvZiBPYmplY3QgT3JtRW50aXR5CgkgKiBAcGFyYW0gT3JtRmllbGQgdGhlIEZLIGZpZWxkIHRvIHBvcHVsYXRlCgkgKiAKCSAqIEByZXR1cm4gbGlzdCBvZiBPYmplY3QgT3JtRW50aXR5IHdpdGggdGhlIHZhbHVlcyBvZiB0aGUgZmllbGQgRksgcG9wdWxhdGVkIGJ5IHRoZSBvdGhlciBPcm1FbnRpdHkgZm91bmRlZAoJICogCgkgKiBAc2luY2UgMC4zLjAKCSAqCgkgKi8KCXB1YmxpYyBzdGF0aWMgZmluYWwgZnVuY3Rpb24gcG9wdWxhdGVGS0ZpZWxkKCRlbnRpdHlQYXJhbSwgJGVudGl0eXMsICRmaWVsZCl7CgoJCWlmKCEkZmllbGQtPmlzRm9yZWlnbktFWSgpKXsKCQkJdGhyb3cgbmV3IE9ybUlsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZnVuY3Rpb24gcG9wdWxhdGVGS0ZpZWxkKFwkZW50aXR5UGFyYW0sIFwkZW50aXR5cywgXCRmaWVsZCkgb25seSBhY2NlcHQgZmllbGRzIG9mIHR5cGUgRm9yZWlnbktleSIpOwoJCX0KCgkJaWYoIXN0cnBvcygkZmllbGQtPmdldEtFWU5hbWUoKSwiLiIpKXsKCQkJcmV0dXJuICRlbnRpdHlzOwoJCX0KCgkJaWYoc3RycG9zKCRmaWVsZC0+Z2V0S0VZTmFtZSgpLCIuIikpewoJCQlsaXN0KCRlbnRpdHlBc3NvY05hbWUsICRmaWVsZEFzc29jaWF0ZU5hbWUpID0gZXhwbG9kZSgiLiIsICRmaWVsZC0+Z2V0S0VZTmFtZSgpKTsKCQkJJGVudGl0eUFzc29jID0gbmV3ICRlbnRpdHlBc3NvY05hbWUoKTsKCQkJJHNxbGZpZWxkdmFsdWUgPSBhcnJheSgpOwoKCQkJJHNxbGZpZWxkdmFsdWVbXSA9ICRmaWVsZC0+Z2V0TmFtZSgpOwoJCQkkYXNzb2NGaWVsZHNOYW1lW10gPSAkZmllbGRBc3NvY2lhdGVOYW1lOwoJCQkkc3FsZmllbGRuYW1lW10gPSAiIHskZmllbGRBc3NvY2lhdGVOYW1lfSA9ID8gIjsKCgkJfQoKCQkvLyAoIGZpZWxkMSA9ID8gYW5kIGZpZWxkMiA9ID8gKSAKCQkkc3FsZmllbGRzbmFtZSA9ICcgKCAnIC4gaW1wbG9kZSgiIEFORCAiLCAkc3FsZmllbGRuYW1lKSAuICcgKSAnIDsKCQkkc3FsZmllbGRzbmFtZU9SID0gJyBPUiAnIC4gJHNxbGZpZWxkc25hbWU7CgoJCSRzcWxmaWVsZHMgPSAiIDEgIjsKCQlpZighZW1wdHkoJGVudGl0eXMpKXsKCQkJJHNxbGZpZWxkcyA9ICRzcWxmaWVsZHNuYW1lIC4gc3RyX3JlcGVhdCgkc3FsZmllbGRzbmFtZU9SLCBjb3VudCgkZW50aXR5cyktMSk7CQoJCX0gCgoJCSRxdWVyeUFkZCA9ICdTRUxFQ1QgKiBGUk9NICcgLiAkZW50aXR5QXNzb2MtPmdldERibmFtZSgpIC4gJyBXSEVSRSAnIC4gJHNxbGZpZWxkczsKCQkkcXVlcnlQYXJhbXMgPSBhcnJheSgpOwoJCWZvcmVhY2goJGVudGl0eXMgYXMgJGVudGl0eSl7CgkJCQkkcXVlcnlQYXJhbXNbXSA9ICRlbnRpdHktPmdldCgkZmllbGQtPmdldE5hbWUoKSk7CgkJCQoJCX0KCQkJCQkKCQkvLyBPcmRlciBCeSAKCQlpZigkZW50aXR5QXNzb2MtPmdldERlZmF1bHRPcmRlckJ5KCkgIT0gbnVsbCkgewoJCQkkcXVlcnlBZGQgLj0gJGVudGl0eUFzc29jLT5nZXREZWZhdWx0T3JkZXJCeSgpLT5nZXRPcmRlckJ5KCk7CgkJfQoKCgkJLy9FeGVjdXRpb24KCQkkcmVzdWx0ID0gT3JtRGI6OmV4ZWN1dGUoJHF1ZXJ5QWRkLAoJCQkJCQkJCSRxdWVyeVBhcmFtcywKCQkJCQkJCQkiRGF0YWJhc2UgZXJyb3IgZHVyaW5nIHJlcXVlc3QgdG8gZ2V0IGFzc29jaWF0aXZlIGVudGl0eSAkZW50aXR5QXNzb2NOYW1lIik7CgkJCgkJJGNvdW50RmllbGRzID0gY291bnQoJHNxbGZpZWxkdmFsdWUpOwoKCQl3aGlsZSAoJHJvd0Fzc29jaWF0ZSA9ICRyZXN1bHQtPkZldGNoUm93KCkpIHsKCQkJZm9yZWFjaCgkZW50aXR5cyBhcyAkZW50aXR5KXsKCQkJCSRhbHJlYWR5UHJlc2VudCA9IG51bGw7CgkJCQkkaXNtYXRjaCA9IHRydWU7CgkJCQlmb3IgKCAkaSA9IDAgOyAkaSA8ICRjb3VudEZpZWxkczsgJGkrKyl7CgoJCQkJCWlmKCRlbnRpdHktPmdldCgkZmllbGQtPmdldE5hbWUoKSkgIT09ICRyb3dBc3NvY2lhdGVbJGFzc29jRmllbGRzTmFtZVskaV1dKXsKCQkJCQkJJGlzbWF0Y2ggPSBmYWxzZTsKCQkJCQkJYnJlYWs7CgkJCQkJfQoJCQkJfQoJCQkJaWYoJGlzbWF0Y2gpewoJCQkJCS8vIEF0IHRoaXMgcG9pbnQgd2UgZm91bmQgYSByZXN1bHQgZm9yIHRoZSBjdXJyZW50IGVudGl0eS4KCQkJCQkvLyBXZSBtdXN0IGFkZCB0aGlzIHJlc3VsdCBpbnRvIHRoZSAkZmllbGQgCgkJCQkJCgkJCQkJJG5ld09iamVjdCA9IE9ybUNvcmU6OnJvd1RvRW50aXR5IChuZXcgJGVudGl0eUFzc29jTmFtZSgpLCAkcm93QXNzb2NpYXRlKTsKCQkJCQkkZW50aXR5LT5zZXQoJGZpZWxkLT5nZXROYW1lKCksICRuZXdPYmplY3QpOwoKCQkJCX0KCQkJfQoJCX0KCgkJcmV0dXJuICRlbnRpdHlzOwoJfQogIAoJLyoqCgkqIFJldHVybiBhIE9ybUVudGl0eSBmcm9tIGl0cyBJZAoJKiAKCSogQHBhcmFtIE9ybUVudGl0eSBhbiBpbnN0YW5jZSBvZiB0aGUgZW50aXR5ICAKCSogQHBhcmFtIG1peGVkIHRoZSBJZCB0byBmaW5kCgkqIEByZXR1cm4gT3JtRW50aXR5IHRoZSBPcm1FbnRpdHkgZm91bmQgb3IgTlVMTAoJKi8KCXB1YmxpYyBzdGF0aWMgZmluYWwgZnVuY3Rpb24gZmluZEJ5SWQoT3JtRW50aXR5ICYkZW50aXR5UGFyYW0sICRpZCkgewoJCSRsaXN0ZSA9IE9ybUNvcmU6OmZpbmRCeUlkcygkZW50aXR5UGFyYW0sIGFycmF5KCRpZCkpOwoJCQoJCWlmKCFpc3NldCgkbGlzdGVbMF0pKXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJCQoJCXJldHVybiAkbGlzdGVbMF07Cgl9CiAgCgkvKioKCSogUmV0dXJuIEVudGl0aWVzIGZyb20gdGhlaXIgSWRzCgkqIAoJKiBAcGFyYW0gT3JtRW50aXR5IGFuIGluc3RhbmNlIG9mIHRoZSBlbnRpdHkgIAoJKiBAcGFyYW0gYXJyYXkgbGlzdCBvZiB0aGUgSWRzIHRvIGZpbmQKCSoKCSogQHJldHVybiBhcnJheTxPcm1FbnRpdHk+IGxpc3Qgb2YgRW50aXRpZXMgZm91bmQKCSovCglwdWJsaWMgc3RhdGljIGZpbmFsIGZ1bmN0aW9uIGZpbmRCeUlkcyhPcm1FbnRpdHkgJiRlbnRpdHlQYXJhbSwgJGlkcywgT3JtT3JkZXJCeSAmJG9yZGVyQnk9bnVsbCkgewoJCWlmKGNvdW50KCRpZHMpID09IDApCgkJCXJldHVybiBhcnJheSgpOwoKCQlpZigkZW50aXR5UGFyYW0tPmhhc0NvbXBvc2l0ZUtleSgpKXsKCQkJdGhyb3cgbmV3IE9ybUlsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbignWW91IGNhbm5vdCB1c2VkIGZ1bmN0aW9uIGZpbmRCeUlkL2ZpbmRCeUlkcyBvbiBFbnRpdHkgd2l0aCBhIGNvbXBvdW5kIGtleS4gWW91IHNob3VsZCB0cnkgZmluZEJ5RXhhbXBsZSBmdW5jdGlvbnMnKTsKCQl9CgkJCgkJZm9yZWFjaCAoJGVudGl0eVBhcmFtLT5nZXRQaygpIGFzICRwa25hbWUgPT4gJHBrKSB7CgkJCSRleGFtcGxlID0gbmV3IE9ybUV4YW1wbGUoKTsKCQkJJGV4YW1wbGUtPmFkZENyaXRlcmlhKCRwa25hbWUsIE9ybVR5cGVDcml0ZXJpYTo6JEVRLCAkaWRzKTsKCQkJcmV0dXJuIE9ybUNvcmU6OmZpbmRCeUV4YW1wbGUoJGVudGl0eVBhcmFtLCAkZXhhbXBsZSwgJG9yZGVyQnkpOwoJCX0KCgoJfQogIAogICAgLyoqCiAgICAgKiBBbGxvdyBzZWFyY2ggYSBsaXN0IG9mIE9ybUVudGl0eSBmcm9tIGEgbGlzdCBvZiBPcm1Dcml0ZXJpYQogICAgICogCiAgICAgKiBFeGFtcGxlIDogZmluZCB0aGUgY3VzdG9tZXJzIHdpdGggbGFzdE5hbWUgJ1JvZ2VyJyAobm8gY2Fzc2Ugc2Vuc2l0aXZlKQogICAgICogCiAgICAgKiAgPGNvZGU+CiAgICAgKiAgICAgICAkY3VzdG9tZXIgPSBNeUF1dG9sb2FkOjpnZXRJbnN0YW5jZSgkdGhpcy0+R2V0TmFtZSgpLCAnY3VzdG9tZXInKTsKICAgICAqIAogICAgICogICAgICAgJGV4YW1wbGUgPSBuZXcgT3JtRXhhbXBsZSgpOwogICAgICogICAgICAgJGV4YW1wbGUtPmFkZENyaXRlcmlhKCdsYXN0TmFtZScsIE9ybVR5cGVDcml0ZXJpYTo6JEVRLCBhcnJheSgncm9nZXInKSwgdHJ1ZSk7CiAgICAgKiAKICAgICAqICAgICAgIE9ybUNvcmU6OmZpbmRCeUV4YW1wbGUoJGN1c3RvbWVyLCAkZXhhbXBsZSk7CiAgICAgKiA8L2NvZGU+CiAgICAgKiAKICAgICAqICBFeGFtcGxlIDogZmluZCB0aGUgY3VzdG9tZXJzIHdpdGggSWQgPj0gOTAKICAgICAqIAogICAgICogPGNvZGU+CiAgICAgKiAgICAgICAkY3VzdG9tZXIgPSBNeUF1dG9sb2FkOjpnZXRJbnN0YW5jZSgkdGhpcy0+R2V0TmFtZSgpLCAnY3VzdG9tZXInKTsKICAgICAqIAogICAgICogICAgICAgJGV4YW1wbGUgPSBuZXcgT3JtRXhhbXBsZSgpOwogICAgICogICAgICAgJGV4YW1wbGUtPmFkZENyaXRlcmlhKCdjdXN0b21lcl9pZCcsIE9ybVR5cGVDcml0ZXJpYTo6JEdURSwgYXJyYXkoOTApKTsKICAgICAqIAogICAgICogICAgICAgT3JtQ29yZTo6ZmluZEJ5RXhhbXBsZSgkY3VzdG9tZXIsICRleGFtcGxlKTsKICAgICAqIDwvY29kZT4KICAgICAqIAogICAgICogTk9URSA6IEVRID0+IDxiPkVRPC9iPnVhbHMsIEdURSA9PiA8Yj5HPC9iPnJlYXRlciA8Yj5UPC9iPmhhbiBvciA8Yj5FPC9iPnF1YWxzCiAgICAgKiAKICAgICAqIE5PVEUgMiA6IHlvdSBjYW4gYWRkIGFzIG1hbnkgQ3JpdGVyaWFzIGFzIHlvdSB3YW50IGluIGFuIEV4YW1wbGUgT2JqZWN0CiAgICAgKiAKICAgICAqIEBwYXJhbSBPcm1FbnRpdHkgYW4gaW5zdGFuY2Ugb2YgdGhlIGVudGl0eQogICAgICogQHBhcmFtIE9ybUV4YW1wbGUgdGhlIE9iamVjdCBPcm1FeGFtcGxlIHdpdGggc29tZSBDcml0ZXJpYXMgaW5zaWRlCiAgICAgKiAKICAgICAqIEBzZWUgT3JtRXhhbXBsZQogICAgICogQHNlZSBPcm1UeXBlQ3JpdGVyaWEKICAgICAqLwoJcHVibGljIHN0YXRpYyBmaW5hbCBmdW5jdGlvbiBmaW5kQnlFeGFtcGxlKE9ybUVudGl0eSAkZW50aXR5UGFyYW0sIE9ybUV4YW1wbGUgJGV4YW1wbGUsIE9ybU9yZGVyQnkgJG9yZGVyQnkgPSBudWxsLCBPcm1MaW1pdCAkbGltaXQgPSBudWxsLCAkY29uZGl0aW9uID0gJ0FORCcsICRsYXp5bW9kZSA9IGZhbHNlKSB7CgoJCSRsaXN0ZUZpZWxkID0gJGVudGl0eVBhcmFtLT5nZXRGaWVsZHMoKTsKCgkJJGNyaXRlcmlhcyA9ICRleGFtcGxlLT5nZXRDcml0ZXJpYXMoKTsKCQkkc2VsZWN0ID0gIlNFTEVDVCAqIEZST00gIi4kZW50aXR5UGFyYW0tPmdldERibmFtZSgpLicgV0hFUkUgJzsKCQkJCQkJCgkJbGlzdCgkaHFsLCAkcGFyYW1zKSA9IE9ybUNvcmU6Ol9nZXRIcWxFeGFtcGxlKCRsaXN0ZUZpZWxkLCAkY3JpdGVyaWFzLCAkY29uZGl0aW9uKTsKCQkJCQoJCS8vIE9yZGVyIEJ5CgkJaWYoJG9yZGVyQnkgIT0gbnVsbCkgewoJCQkJJGhxbCAuPSAkb3JkZXJCeS0+Z2V0T3JkZXJCeSgpOwoJCX0KCQllbHNlIGlmKCRlbnRpdHlQYXJhbS0+Z2V0RGVmYXVsdE9yZGVyQnkoKSAhPSBudWxsKSB7CgkJCQkkaHFsIC49ICRlbnRpdHlQYXJhbS0+Z2V0RGVmYXVsdE9yZGVyQnkoKS0+Z2V0T3JkZXJCeSgpOwoJCX0gICAgICAgICAgICAgICAgCgkJCgkJaWYoJGxpbWl0ICE9IG51bGwpIHsKCQkJCSRocWwgLj0gJGxpbWl0LT5nZXRMaW1pdCgpOwoJCX0KCgkJJHF1ZXJ5RXhhbXBsZSA9ICRzZWxlY3QuJGhxbDsKCQkKCQkvL0lmIGl0J3MgYWxyZWFkeSBpbiB0aGUgY2FjaGUsIHdlIHJldHVybiB0aGUgcmVzdWx0CgkJaWYoT3JtQ2FjaGU6OmdldEluc3RhbmNlKCktPmlzQ2FjaGUoJHF1ZXJ5RXhhbXBsZSwgJHBhcmFtcykpIHsKCgkJCQkkZW50aXRpZXMgPSBPcm1DYWNoZTo6Z2V0SW5zdGFuY2UoKS0+Z2V0Q2FjaGUoJHF1ZXJ5RXhhbXBsZSwkcGFyYW1zKTsKCgkJfSBlbHNlIHsKCQkJCS8vRXhlY3V0aW9uCgkJCQkkcmVzdWx0ID0gT3JtRGI6OmV4ZWN1dGUoJHF1ZXJ5RXhhbXBsZSwKCQkJCQkJCQkJCSRwYXJhbXMsCgkJCQkJCQkJCQkiRGF0YWJhc2UgZXJyb3IgZHVyaW5nIE9ybUNvcmU6OmZpbmRCeUV4YW1wbGUoT3JtRW50aXR5ICZ7JGVudGl0eVBhcmFtLT5nZXROYW1lKCl9LCBPcm1FeGFtcGxlIFwkZXhhbXBsZSkiKTsKCgkJCQlPcm1UcmFjZTo6ZGVidWcoImZpbmRCeUV4YW1wbGUgOiAiLiRyZXN1bHQtPlJlY29yZENvdW50KCkuIiByZXN1bHRhdChzKSIpOwoKCQkJCSRlbnRpdGllcyA9IGFycmF5KCk7CgkJCQl3aGlsZSAoJHJvdyA9ICRyZXN1bHQtPkZldGNoUm93KCkpIHsKCQkJCSAgJGVudGl0aWVzW10gPSBPcm1Db3JlOjpyb3dUb0VudGl0eSgkZW50aXR5UGFyYW0sICRyb3cpOwoJCQkJfQoKCQkJCWlmKCEkbGF6eW1vZGUpewoJCQkJCSRlbnRpdGllcyA9IE9ybUNvcmU6OnBvcHVsYXRlRmllbGRzKCRlbnRpdHlQYXJhbSwgJGVudGl0aWVzKTsKCQkJCX0KCQkJCQoJCQkJLy9XZSBwdXNoIHRoZSByZXN1bHQgaW50byB0aGUgY2FjaGUgYmVmb3JlIHJldHVybiBpdAoJCQkJT3JtQ2FjaGU6OmdldEluc3RhbmNlKCktPnNldENhY2hlKCRxdWVyeUV4YW1wbGUsIG51bGwsICRlbnRpdGllcyk7CgkJfQoKCQlyZXR1cm4gYXJyYXlfdmFsdWVzKCRlbnRpdGllcyk7CgoJfQogICAKCS8qKgogICAgICogQWxsb3cgZGVsZXRlIGEgbGlzdCBvZiBPcm1FbnRpdHkgZnJvbSBhIGxpc3Qgb2YgT3JtQ3JpdGVyaWEKICAgICAqIAogICAgICogRXhhbXBsZSA6IGRlbGV0ZSB0aGUgY3VzdG9tZXJzIHdpdGggbGFzdE5hbWUgJ1JvZ2VyJyAobm8gY2Fzc2Ugc2Vuc2l0aXZlKQogICAgICogCiAgICAgKiAgPGNvZGU+CiAgICAgKiAgICAgICAkY3VzdG9tZXIgPSBNeUF1dG9sb2FkOjpnZXRJbnN0YW5jZSgkdGhpcy0+R2V0TmFtZSgpLCAnY3VzdG9tZXInKTsKICAgICAqIAogICAgICogICAgICAgJGV4YW1wbGUgPSBuZXcgT3JtRXhhbXBsZSgpOwogICAgICogICAgICAgJGV4YW1wbGUtPmFkZENyaXRlcmlhKCdsYXN0TmFtZScsIE9ybVR5cGVDcml0ZXJpYTo6JEVRLCBhcnJheSgncm9nZXInKSwgdHJ1ZSk7CiAgICAgKiAKICAgICAqICAgICAgIE9ybUNvcmU6OmRlbGV0ZUJ5RXhhbXBsZSgkY3VzdG9tZXIsICRleGFtcGxlKTsKICAgICAqIDwvY29kZT4KICAgICAqIAogICAgICogIEV4YW1wbGUgOiBkZWxldGUgdGhlIGN1c3RvbWVycyB3aXRoIElkID49IDkwCiAgICAgKiAKICAgICAqIDxjb2RlPgogICAgICogICAgICAgJGN1c3RvbWVyID0gTXlBdXRvbG9hZDo6Z2V0SW5zdGFuY2UoJHRoaXMtPkdldE5hbWUoKSwgJ2N1c3RvbWVyJyk7CiAgICAgKiAKICAgICAqICAgICAgICRleGFtcGxlID0gbmV3IE9ybUV4YW1wbGUoKTsKICAgICAqICAgICAgICRleGFtcGxlLT5hZGRDcml0ZXJpYSgnY3VzdG9tZXJfaWQnLCBPcm1UeXBlQ3JpdGVyaWE6OiRHVEUsIGFycmF5KDkwKSk7CiAgICAgKiAKICAgICAqICAgICAgIE9ybUNvcmU6OmRlbGV0ZUJ5RXhhbXBsZSgkY3VzdG9tZXIsICRleGFtcGxlKTsKICAgICAqIDwvY29kZT4KICAgICAqIAogICAgICogTk9URSA6IEVRID0+IDxiPkVRPC9iPnVhbHMsIEdURSA9PiA8Yj5HPC9iPnJlYXRlciA8Yj5UPC9iPmhhbiBvciA8Yj5FPC9iPnF1YWxzCiAgICAgKiAKICAgICAqIE5PVEUgMiA6IHlvdSBjYW4gYWRkIGFzIG1hbnkgQ3JpdGVyaWFzIGFzIHlvdSB3YW50IGluIGFuIE9ybUV4YW1wbGUgT2JqZWN0CiAgICAgKiAKICAgICAqIEBwYXJhbSBPcm1FbnRpdHkgYW4gaW5zdGFuY2Ugb2YgdGhlIGVudGl0eQogICAgICogQHBhcmFtIE9ybUV4YW1wbGUgdGhlIE9iamVjdCBPcm1FeGFtcGxlIHdpdGggc29tZSBDcml0ZXJpYXMgaW5zaWRlCiAgICAgKiAKICAgICAqIEBzZWUgT3JtRXhhbXBsZQogICAgICogQHNlZSBPcm1UeXBlQ3JpdGVyaWEKICAgICAqLwoJcHVibGljIHN0YXRpYyBmaW5hbCBmdW5jdGlvbiBkZWxldGVCeUV4YW1wbGUoT3JtRW50aXR5ICYkZW50aXR5UGFyYW0sIE9ybUV4YW1wbGUgJE9ybUV4YW1wbGUsICRjb25kaXRpb24gPSAnQU5EJykgewoJCSRsaXN0ZUZpZWxkID0gJGVudGl0eVBhcmFtLT5nZXRGaWVsZHMoKTsKCgkJJGNyaXRlcmlhcyA9ICRPcm1FeGFtcGxlLT5nZXRDcml0ZXJpYXMoKTsKCQkkZGVsZXRlID0gImRlbGV0ZSBmcm9tICIuJGVudGl0eVBhcmFtLT5nZXREYm5hbWUoKS4nIFdIRVJFICc7CgkJCgkJbGlzdCgkaHFsLCAkcGFyYW1zKSA9IE9ybUNvcmU6Ol9nZXRIcWxFeGFtcGxlKCRsaXN0ZUZpZWxkLCAkY3JpdGVyaWFzLCAkY29uZGl0aW9uKTsKCQkKCQkkcXVlcnlFeGFtcGxlID0gJGRlbGV0ZS4kaHFsOwoJCQkJCQkJCQkJCgkJLy9FeGVjdXRpb24KCQkkcmVzdWx0ID0gT3JtRGI6OmV4ZWN1dGUoJHF1ZXJ5RXhhbXBsZSwKCQkJCQkJCQkJJHBhcmFtcywKCQkJCQkJCQkJIkRhdGFiYXNlIGVycm9yIGR1cmluZyBPcm1Db3JlOjpkZWxldGVCeUV4YW1wbGUoT3JtRW50aXR5ICZ7JGVudGl0eVBhcmFtLT5nZXROYW1lKCl9LCAsIE9ybUV4YW1wbGUgXCRleGFtcGxlKSIpOwoJCSAgfQoJCSAgCgkvKioKCSAqIElubmVyIGZ1bmN0aW9uIHRvIGZhY3Rvcml6ZSB0aGUgY3VzdHJ1Y3Rpb24gb2YgdGhlIEhRTCBmb3IgdGhlICpieUV4YW1wbGUgZnVuY3Rpb25zCgkgKiBAcGFyYW0gOiAkbGlzdGVGaWVsZCB0aGUgbGlzdCBvZiBGaWVsZHMKCSAqIEBwYXJhbSA6ICRjcml0ZXJpYXMgdGhlIGxpc3Qgb2YgQ3JpdGVyaWEKCSAqCgkgKiBAcmV0dXJuIDogTGlzdFskaHFsLCAkcGFyYW1zXQoJICoqLwoJcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gX2dldEhxbEV4YW1wbGUoJGxpc3RlRmllbGQsICRjcml0ZXJpYXMsICRjb25kaXRpb24pewoJCQoJCWlmKCAkY29uZGl0aW9uID09ICdBTkQnICl7CgkJCSRocWwgPSAiIDEgIjsKCQl9IGVsc2UgewoJCQkkaHFsID0gIiAwICI7CgkJICB9CgoJCSRwYXJhbXMgPSBhcnJheSgpOwoKCQlmb3JlYWNoKCRjcml0ZXJpYXMgYXMgJGNyaXRlcmlhKSB7CgoJCQlpZigkbGlzdGVGaWVsZFskY3JpdGVyaWEtPmZpZWxkbmFtZV0gPT0gbnVsbCkgewoJCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbigiRmllbGQgJyIuJGNyaXRlcmlhLT5maWVsZG5hbWUuIicgbm90IGRlZmluZWQgaW4gZW50aXR5ICciLiRlbnRpdHlQYXJhbS0+Z2V0TmFtZSgpLiInIHdoaWxlIHlvdSdyZSBzZWFyY2hpbmcgb24gaXQiKTsKCQkJfQoJCSAgJGZpbHRlclR5cGUgPSAkbGlzdGVGaWVsZFskY3JpdGVyaWEtPmZpZWxkbmFtZV0tPmdldFR5cGUoKTsKCQkgIAoJCQkvLzEgcGFyYW1ldGVyCgkJICBpZigkY3JpdGVyaWEtPnR5cGVDcml0ZXJpYSA9PSBPcm1UeXBlQ3JpdGVyaWE6OiRFUSB8fCAkY3JpdGVyaWEtPnR5cGVDcml0ZXJpYSA9PSBPcm1UeXBlQ3JpdGVyaWE6OiRORVEgCgkJCXx8ICRjcml0ZXJpYS0+dHlwZUNyaXRlcmlhID09IE9ybVR5cGVDcml0ZXJpYTo6JEdUIHx8ICRjcml0ZXJpYS0+dHlwZUNyaXRlcmlhID09IE9ybVR5cGVDcml0ZXJpYTo6JEdURSAKCQkJfHwgJGNyaXRlcmlhLT50eXBlQ3JpdGVyaWEgPT0gT3JtVHlwZUNyaXRlcmlhOjokTFQgfHwgJGNyaXRlcmlhLT50eXBlQ3JpdGVyaWEgPT0gT3JtVHlwZUNyaXRlcmlhOjokTFRFIAoJCQl8fCAkY3JpdGVyaWEtPnR5cGVDcml0ZXJpYSA9PSBPcm1UeXBlQ3JpdGVyaWE6OiRCRUZPUkUgfHwgJGNyaXRlcmlhLT50eXBlQ3JpdGVyaWEgPT0gT3JtVHlwZUNyaXRlcmlhOjokQUZURVIKCQkJCXx8ICRjcml0ZXJpYS0+dHlwZUNyaXRlcmlhID09IE9ybVR5cGVDcml0ZXJpYTo6JExJS0UgfHwgJGNyaXRlcmlhLT50eXBlQ3JpdGVyaWEgPT0gT3JtVHlwZUNyaXRlcmlhOjokTkxJS0UpIHsKCQkJCSR2YWwgPSAkY3JpdGVyaWEtPnBhcmFtc0NyaXRlcmlhWzBdOwoJCQkJCgkJCQkkcGFyYW1zW10gPSBPcm1Db3JlOjpfZmllbGRUb0RCVmFsdWUoJHZhbCwgJGZpbHRlclR5cGUpOwoJCQkJJGhxbCAuPSAiIHskY29uZGl0aW9ufSAiLiRjcml0ZXJpYS0+ZmllbGRuYW1lLiRjcml0ZXJpYS0+dHlwZUNyaXRlcmlhLicgPyAnOwoJCQljb250aW51ZTsKCQkgIH0KCQkgIAoJCQkvLzAgcGFyYW1ldGVyCgkJCWlmKCRjcml0ZXJpYS0+dHlwZUNyaXRlcmlhID09IE9ybVR5cGVDcml0ZXJpYTo6JE5VTEwgfHwgJGNyaXRlcmlhLT50eXBlQ3JpdGVyaWEgPT0gT3JtVHlwZUNyaXRlcmlhOjokTk5VTEwpIHsKCQkJCSRocWwgLj0gIiB7JGNvbmRpdGlvbn0gIi4kY3JpdGVyaWEtPmZpZWxkbmFtZS4kY3JpdGVyaWEtPnR5cGVDcml0ZXJpYTsKCQkJY29udGludWU7CgkJICB9CgkJICAKCQkJLy8yIHBhcmFtZXRlcnMKCQkJaWYoJGNyaXRlcmlhLT50eXBlQ3JpdGVyaWEgPT0gT3JtVHlwZUNyaXRlcmlhOjokQkVUV0VFTikgewoJCQkkcGFyYW1zW10gPSBPcm1Db3JlOjpfZmllbGRUb0RCVmFsdWUoJGNyaXRlcmlhLT5wYXJhbXNDcml0ZXJpYVswXSwgJGZpbHRlclR5cGUpOyAKCQkJJHBhcmFtc1tdID0gT3JtQ29yZTo6X2ZpZWxkVG9EQlZhbHVlKCRjcml0ZXJpYS0+cGFyYW1zQ3JpdGVyaWFbMV0sICRmaWx0ZXJUeXBlKTsgCgkJCQkkaHFsIC49ICIgeyRjb25kaXRpb259ICIuJGNyaXRlcmlhLT5maWVsZG5hbWUuJGNyaXRlcmlhLT50eXBlQ3JpdGVyaWEuJyA/IEFORCA/JzsKCQkJY29udGludWU7CgkJICB9CgkJCQkKCQkJLy8gTiBwYXJhbWV0ZXJzCgkJCWlmKCRjcml0ZXJpYS0+dHlwZUNyaXRlcmlhID09IE9ybVR5cGVDcml0ZXJpYTo6JElOIHx8ICRjcml0ZXJpYS0+dHlwZUNyaXRlcmlhID09IE9ybVR5cGVDcml0ZXJpYTo6JE5JTikgewoJCQkJaWYoaXNfYXJyYXkoJGNyaXRlcmlhLT5wYXJhbXNDcml0ZXJpYSkgJiYgY291bnQoJGNyaXRlcmlhLT5wYXJhbXNDcml0ZXJpYSkgPiAwKSB7CgkJCQkJCSRocWwgLj0gIiB7JGNvbmRpdGlvbn0gIjsKCQkJCQkJJGhxbCAuPSAkY3JpdGVyaWEtPmZpZWxkbmFtZS4nICcuc3ByaW50ZigkY3JpdGVyaWEtPnR5cGVDcml0ZXJpYSwgaW1wbG9kZSgnLCcsIGFycmF5X2ZpbGwoMCwgY291bnQoJGNyaXRlcmlhLT5wYXJhbXNDcml0ZXJpYSksICc/JykpKS4nICc7CgkJCQkJCWZvcmVhY2goJGNyaXRlcmlhLT5wYXJhbXNDcml0ZXJpYSBhcyAkcGFyYW0pIHsKCQkJCQkJJHBhcmFtc1tdID0gT3JtQ29yZTo6X2ZpZWxkVG9EQlZhbHVlKCRwYXJhbSwgJGZpbHRlclR5cGUpOyAKCQkJCQkJfQoJCQkJfSBlbHNlIGlmKGlzX2FycmF5KCRjcml0ZXJpYS0+cGFyYW1zQ3JpdGVyaWEpICYmIGNvdW50KCRjcml0ZXJpYS0+cGFyYW1zQ3JpdGVyaWEpID09IDApIHsKCQkJCQkkaHFsIC49ICdBTkQgZmFsc2UgJzsgLy8gbm8gdmFsdWUgcGFzc2VkLCBzbyBubyByZXN1bHQgdG8gYmUgcmV0dXJuZWQKCQkJCX0KCQkJCWNvbnRpbnVlOwoJCQl9CgkJCQkJCQoJCQkvL090aGVyIGNhc2VzCgkJCWlmKCRjcml0ZXJpYS0+dHlwZUNyaXRlcmlhID09IE9ybVR5cGVDcml0ZXJpYTo6JEVNUFRZKSB7CgkJCQkkaHFsIC49ICIgeyRjb25kaXRpb259ICggIi4kY3JpdGVyaWEtPmZpZWxkbmFtZSAuJyBpcyBudWxsIHx8ICcgLiAkY3JpdGVyaWEtPmZpZWxkbmFtZSAuICI9ICcnKSI7CgkJCQljb250aW51ZTsKCQkJCQl9CgkJCWlmKCRjcml0ZXJpYS0+dHlwZUNyaXRlcmlhID09IE9ybVR5cGVDcml0ZXJpYTo6JE5FTVBUWSkgewoJCQkJJGhxbCAuPSAiIHskY29uZGl0aW9ufSAoICIuJGNyaXRlcmlhLT5maWVsZG5hbWUgLicgaXMgbm90IG51bGwgJiYgJyAuICRjcml0ZXJpYS0+ZmllbGRuYW1lIC4gIiE9ICcnKSI7CgkJCQkJY29udGludWU7CgkJCQl9ICAgICAgICAgICAgICAgICAgICAgICAgCgkJICAKCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbigiVGhlIE9ybUNyaXRlcmlhICRjcml0ZXJpYS0+dHlwZUNyaXRlcmlhIGlzIG5vdCBtYW5hZ2UiKTsKCQl9CgkJCQkJCQkJCQkKCQlyZXR1cm4gYXJyYXkoJGhxbCwgJHBhcmFtcyk7Cgl9CiAgICAgIAogICAgLyoqCiAgICAgKiBUcmFuc2Zvcm1zIGFuIGFycmF5IG9mIHZhbHVlIGludG8gYSBlbnRpcmUgT3JtRW50aXR5LiBUaGUgYXJyYXkgbXVzdCBmYWxsb3cgdGhpcyBzY2hlbWUKICAgICAqIAogICAgICogRXhhbXBsZSA6CiAgICAgKiAKICAgICAqIDxjb2RlPgogICAgICogICAgICAgJG15QXJyYXkxID0gYXJyYXkoJ2N1c3RvbWVyX2lkJz0+MSwgJ25hbWUnPT4nRHVwb250Jyk7ICAgICAgIAogICAgICogICAgICAgJG15QXJyYXkyID0gYXJyYXkoJ2N1c3RvbWVyX2lkJz0+MiwgJ25hbWUnPT4nRHVyYW5kJywgJ2xhc3ROYW1lJz0+J0pvZScpOyAgICAgICAKICAgICAqICAgCiAgICAgKiAgICAgICAkY3VzdG9tZXIgPSBNeUF1dG9sb2FkOjpnZXRJbnN0YW5jZSgkdGhpcy0+R2V0TmFtZSgpLCAnY3VzdG9tZXInKTsKICAgICAqIAogICAgICogICAgICAgJGN1c3RvbWVyMSA9IE9ybUNvcmU6OnJvd1RvRW50aXR5KCRjdXN0b21lciwgJG15QXJyYXkxKTsKICAgICAqICAgICAgICRjdXN0b21lcjIgPSBPcm1Db3JlOjpyb3dUb0VudGl0eSgkY3VzdG9tZXIsICRteUFycmF5Mik7CiAgICAgKiAKICAgICAqICAgICAgIGVjaG8gJGN1c3RvbWVyMS0+Z2V0KCdsYXN0TmFtZScpOyAvL3JldHVybiBudWxsCiAgICAgKiAgICAgICBlY2hvICRjdXN0b21lcjItPmdldCgnbGFzdE5hbWUnKTsgLy9yZXR1cm4gSm9lCiAgICAgKiAKICAgICAqIDwvY29kZT4KICAgICAqICAgICAgICAgCiAgICAgKiBAcGFyYW0gT3JtRW50aXR5IGFuIGluc3RhbmNlIG9mIHRoZSBlbnRpdHkKICAgICAqIEBwYXJhbSBhcnJheSB0aGUgbGlzdCB3aXRoIHRoZSBkYXRhCiAgICAqLwoJcHVibGljIHN0YXRpYyBmaW5hbCBmdW5jdGlvbiByb3dUb0VudGl0eSAoT3JtRW50aXR5ICYkZW50aXR5UGFyYW0sICRyb3cpIHsKCgkJT3JtVHJhY2U6OmRlYnVnKCJyb3dUb0VudGl0eSA6ICIucHJpbnRfcigkcm93LHRydWUpKTsKCQkkbGlzdGVGaWVsZCA9ICRlbnRpdHlQYXJhbS0+Z2V0RmllbGRzKCk7CgoJCSRuZXdFbnRpdHkgPSBjbG9uZSAkZW50aXR5UGFyYW07CgkJZm9yZWFjaCgkbGlzdGVGaWVsZCBhcyAkZmllbGQpCgkJewoJCSAgaWYoISRmaWVsZC0+aXNBc3NvY2lhdGVLRVkoKSkKCQkgIHsKCQkJJG5ld0VudGl0eS0+c2V0KCRmaWVsZC0+Z2V0TmFtZSgpLE9ybUNvcmU6Ol9kYlZhbHVlVG9GaWVsZCgkcm93WyRmaWVsZC0+Z2V0TmFtZSgpXSwgJGZpZWxkLT5nZXRUeXBlKCkpKTsKCQkgIH0gCgkJfQoJCXJldHVybiAkbmV3RW50aXR5OyAgCgl9CiAgCiAgICAvKioKICAgICAqIFRyYW5zZm9ybSBhIFBIUCB2YWx1ZSBpbnRvIGEgU1FMIHZhbHVlCiAgICAgKiAKICAgICAqIEBwYXJhbSBtaXhlZCB0aGUgUEhQIHZhbHVlCiAgICAgKiBAcGFyYW0gbWl4ZWQgdGhlIENBU1QgdmFsdWUKICAgICAqIAogICAgICogQHNlZSBPcm1DQVNUCiAgICAgKi8KCXByaXZhdGUgc3RhdGljIGZpbmFsIGZ1bmN0aW9uIF9maWVsZFRvREJWYWx1ZSgkZGF0YSwgJHR5cGUpIHsKCQlpZihpc19udWxsKCRkYXRhKSl7CgkJCXJldHVybiBudWxsOwoJCX0KCQkKCQlzd2l0Y2goJHR5cGUpIHsKCQkgIGNhc2UgT3JtQ0FTVDo6JFNUUklORyA6IHJldHVybiAkZGF0YTsKCQkgIGNhc2UgT3JtQ0FTVDo6JERPVUJMRSA6IHJldHVybiAkZGF0YTsKCQkgIGNhc2UgT3JtQ0FTVDo6JElOVEVHRVIgOiByZXR1cm4gJGRhdGE7CgkJICBjYXNlIE9ybUNBU1Q6OiROVU1FUklDIDogcmV0dXJuICRkYXRhOwoJCSAgY2FzZSBPcm1DQVNUOjokQlVGRkVSIDogcmV0dXJuICRkYXRhOwoJCSAgY2FzZSBPcm1DQVNUOjokVVVJRCA6IHJldHVybiAkZGF0YTsKCQkgIAoJCSAgY2FzZSBPcm1DQVNUOjokREFURSA6IHJldHVybiBzdHJfcmVwbGFjZSgiJyIsICIiLCBjbXNtcygpLT5HZXREYigpLT5EQkRhdGUoJGRhdGEpKTsgICAgICAgCgkJICBjYXNlIE9ybUNBU1Q6OiRUSU1FIDogcmV0dXJuIHN0cl9yZXBsYWNlKCInIiwgIiIsIGNtc21zKCktPkdldERiKCktPkRCVGltZVN0YW1wKCRkYXRhKSk7ICAgCSAgCgkJICBjYXNlIE9ybUNBU1Q6OiREQVRFVElNRSA6IHJldHVybiBkYXRlKCJZLW0tZCBIOmk6cyIsJGRhdGEpOyAKCQkgIGNhc2UgT3JtQ0FTVDo6JFRTIDogcmV0dXJuICRkYXRhOwoJCX0KCX0KICAKICAgIC8qKgogICAgICogVHJhbnNmb3JtIGEgU1FMIHZhbHVlIGludG8gYSBQSFAgdmFsdWUKICAgICAqIAogICAgICogQHBhcmFtIG1peGVkIHRoZSBTUUwgdmFsdWUgCiAgICAgKiBAcGFyYW0gbWl4ZWQgdGhlIENBU1QgdmFsdWUKICAgICAqIAogICAgICogQHNlZSBPcm1DQVNUCiAgICAgKi8KCXByaXZhdGUgc3RhdGljIGZpbmFsIGZ1bmN0aW9uIF9kYlZhbHVlVG9GaWVsZCgkZGF0YSwgJHR5cGUpIHsKCQlzd2l0Y2goJHR5cGUpIHsKCQkgIGNhc2UgT3JtQ0FTVDo6JFNUUklORyA6IHJldHVybiAkZGF0YTsJCSAgCgkJICBjYXNlIE9ybUNBU1Q6OiRET1VCTEUgOiByZXR1cm4gJGRhdGE7CgkJICBjYXNlIE9ybUNBU1Q6OiRJTlRFR0VSIDogcmV0dXJuICRkYXRhOwkJICAKCQkgIGNhc2UgT3JtQ0FTVDo6JE5VTUVSSUMgOiByZXR1cm4gJGRhdGE7CQkgIAoJCSAgY2FzZSBPcm1DQVNUOjokQlVGRkVSIDogcmV0dXJuICRkYXRhOwkJICAJCQoJCSAgY2FzZSBPcm1DQVNUOjokVVVJRCA6IHJldHVybiAkZGF0YTsKCQkgIAoJCSAgY2FzZSBPcm1DQVNUOjokREFURSA6IHJldHVybiBjbXNtcygpLT5HZXREYigpLT5Vbml4RGF0ZSgkZGF0YSk7CgkJICBjYXNlIE9ybUNBU1Q6OiRUSU1FIDogcmV0dXJuICRkYXRhOwoJCSAgY2FzZSBPcm1DQVNUOjokREFURVRJTUUgOiByZXR1cm4gc3RydG90aW1lKCRkYXRhKTsgIAoJCSAgY2FzZSBPcm1DQVNUOjokVFMgOiByZXR1cm4gJGRhdGE7CgoJCX0KCX0KICAKICAgIC8qKgogICAgICogVmVyaWZ5IGluIGFsbCB0eXBlIG9mIGVudGl0aWVzIGlmIGFueW9uZSBzdGlsbCBoYXMgYSBsaW5rIHdpdGggdGhlIE9ybUVudGl0eSBwYXNzZWQgaW4gcGFyYW1ldGVycyAoRm9yZWlnbktFeSBhbmQgQXNzb2NpYXRlS2V5KQogICAgICogCiAgICAgKiAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGJ5IHRoZSBkZWxldGUqIGZ1bmN0aW9ucyB0byBhdm9pZCBvcnBoYW5zIGRhdGEgaW4gZGF0YWJhc2UKICAgICAqIAoJICogQHBhcmFtIE9ybSB0aGUgbW9kdWxlIHdoaWNoIGV4dGVuZHMgdGhlIE9ybSBtb2R1bGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICogQHBhcmFtIE9ybUVudGl0eSBhbiBpbnN0YW5jZSBvZiB0aGUgZW50aXR5CiAgICAgKiBAcGFyYW0gbWl4ZWQgdGhlIGlkIG9mIHRoZSBPcm1FbnRpdHkgdG8gdmVyaWZ5CgkgKgoJICogQHJldHVybiBhIG1lc3NhZ2UgaWYgYSBsaW5rIGlzIHN0aWxsIHByZXNlbnQuIG5vdGhpbmcgaWYgdGhlIGludGVncml0eSBpcyBvawogICAgICovCglwdWJsaWMgc3RhdGljIGZpbmFsIGZ1bmN0aW9uIHZlcmlmSW50ZWdyaXR5KE9ybUVudGl0eSAmJGVudGl0eVBhcmFtLCAkc2lkKSB7CgkJJGxpc3RlRW50aXR5cyA9IE15QXV0b2xvYWQ6OmdldEFsbEluc3RhbmNlcygkZW50aXR5UGFyYW0tPmdldE1vZHVsZU5hbWUoKSk7CgoJCWZvcmVhY2goJGxpc3RlRW50aXR5cyBhcyAka2V5PT4kYW5FbnRpdHkpIHsKCQkgIGlmKCRhbkVudGl0eSBpbnN0YW5jZU9mIE9ybUVudGl0eUFzc29jaWF0aW9uKQoJCQljb250aW51ZTsKCQkJCgkJICBmb3JlYWNoKCRhbkVudGl0eS0+Z2V0RmllbGRzKCkgYXMgJGZpZWxkKSB7CgkJCWlmKCRmaWVsZC0+aXNBc3NvY2lhdGVLRVkoKSkgewoJCQkgIGNvbnRpbnVlOwoJCQl9CgoJCQkKCQkJaWYoaXNfYXJyYXkoJGZpZWxkLT5nZXRLRVlOYW1lKCkpKXsKCgkJCX0KCQkJaWYoJGZpZWxkLT5nZXRLRVlOYW1lKCkgIT0gbnVsbCkgewoJCQkgICR2YWxzID0gZXhwbG9kZSgnLicsJGZpZWxkLT5nZXRLRVlOYW1lKCksMik7CgkJCSAgCgkJCSAgaWYoc3RydG9sb3dlciAoJHZhbHNbMF0pID09IHN0cnRvbG93ZXIgKCRlbnRpdHlQYXJhbS0+Z2V0TmFtZSgpKSkgIHsKCQkJCSRPcm1FeGFtcGxlID0gbmV3IE9ybUV4YW1wbGUoKTsKCQkJCSRPcm1FeGFtcGxlLT5hZGRDcml0ZXJpYSgkZmllbGQtPmdldE5hbWUoKSwgT3JtVHlwZUNyaXRlcmlhOjokRVEsIGFycmF5KCRzaWQpKTsKCQkJCSRlbnRpdHlzID0gT3JtQ29yZTo6ZmluZEJ5RXhhbXBsZSgkYW5FbnRpdHksICRPcm1FeGFtcGxlKTsKCQkJCWlmKGNvdW50KCRlbnRpdHlzKSA+IDApCgkJCQl7CgkJCQkgIHJldHVybiAiTGEgbGlnbmUgJmFncmF2ZTsgc3VwcHJpbWVyIGVzdCBlbmNvcmUgdXRpbGlzJmVhY3V0ZTtlIHBhciAmbGFxdW87ICIuJGFuRW50aXR5LT5nZXROYW1lKCkuIiAmcmFxdW87IjsKCQkJCX0KCQkJICB9CgkJCX0KCQkgIH0KCQl9CgoJCXJldHVybjsKCgl9CiAgCgkvKioKCSAqIFdpbGwgcmV0dXJuIGEgVVVJRCA6IGEgdW5pcXVlIGlkZW50aWZpZXIKCSAqIEBzaW5jZSAwLjAuMgoJICovCiAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGZ1bmN0aW9uIGdlbmVyYXRlVVVJRCgpewoKCQkvL0V4ZWN1dGlvbgoJCSRyZXN1bHQgPSBPcm1EYjo6ZXhlY3V0ZSgnU0VMRUNUIFVVSUQoKSBBUyB1dWlkOycsCgkJCQkJCQkJCW51bGwsCgkJCQkJCQkJCSJEYXRhYmFzZSBlcnJvciBkdXJpbmcgT3JtQ29yZTo6Z2VuZXJhdGVVVUlEKCkiKTsKCgkJJHJvdz0kcmVzdWx0LT5GZXRjaFJvdygpOwoKCQlyZXR1cm4gJHJvd1sndXVpZCddOwoJfQp9Cgo/Pgo=]]></data>
	</file>
	<file>
	  <filename>/lib/class.OrmCriteria.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIENvbnRhaW5zIE9ybUNyaXRlcmlhIGNsYXNzCiAqIAogKiBAc2luY2UgMC4wLjEKICogQGF1dGhvciBCZXNzCiAqIEBwYWNrYWdlIE9ybQogKiovCiAKIAoKLyoqCiAqIEJhY2tib25lIGZvciBPcm1Dcml0ZXJpYSBpbnRvIHRoZSBPcm0gc3lzdGVtCiAqCiAqIEBzaW5jZSAwLjAuMQogKiBAYXV0aG9yIEJlc3MKICogQHBhY2thZ2UgT3JtCiAqKi8KY2xhc3MgT3JtQ3JpdGVyaWEKewoJLyoqCgkgKiBOYW1lIG9mIHRoZSBmaWVsZCAKCSAqLwoJcHVibGljICRmaWVsZG5hbWU7CgkKCS8qKgoJICogVHlwZSBvZiBDcml0ZXJpYQoJICovCglwdWJsaWMgJHR5cGVDcml0ZXJpYTsKCQoJLyoqCgkgKiBQYXJhbWV0ZXJzIGZvciB0aGUgdHlwZSBvZiBDcml0ZXJpYQoJICovCglwdWJsaWMgJHBhcmFtc0NyaXRlcmlhOwoJCgkvKioKCSAqIEJvb2xlYW4gaWYgd2UgbXVzdCBpZ25vcmUgY2FzZQoJICovCglwdWJsaWMgJGlnbm9yZUNhc2U7CgkKICAgIC8qKgogICAgKiBQdWJsaWMgQ29uc3RydWN0b3IKICAgICogCiAgICAqIEBwYXJhbSBzdHJpbmcgTmFtZSBvZiB0aGUgZmllbGQgCiAgICAqIEBwYXJhbSBPcm1UeXBlQ3JpdGVyaWEgVHlwZSBvZiBDcml0ZXJpYQogICAgKiBAcGFyYW0gYXJyYXkgYWxsIHRoZSBwYXJhbWV0ZXJzIHVzZWQgZm9yIHRoZSBwYXJhbWV0ZXIgJHR5cGVDcml0ZXJpYQogICAgKiBAcGFyYW0gYm9vbGVhbiBbT3B0aW9uYWxdIGlmIHdlIG11c3QgaWdub3JlIHRoZSBjYXNlIChhemUgZXF1YWxzIEFaRSkgb3Igbm90LiBEZWZhdWx0IHZhbHVlIGlzICJmYWxzZSIKICAgICoKCSogQHJldHVybiBPcm1Dcml0ZXJpYSBhIENyaXRlcmlhCgkqCgkqIEBzZWUgT3JtVHlwZUNyaXRlcmlhCiAgICAqLwoJcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRmaWVsZG5hbWUsICR0eXBlQ3JpdGVyaWEsICRwYXJhbXNDcml0ZXJpYSwgJGlnbm9yZUNhc2UgPSBmYWxzZSkKCXsKCQkkdGhpcy0+ZmllbGRuYW1lID0gJGZpZWxkbmFtZTsKCQkkdGhpcy0+dHlwZUNyaXRlcmlhID0gJHR5cGVDcml0ZXJpYTsKCQkkdGhpcy0+cGFyYW1zQ3JpdGVyaWEgPSAkcGFyYW1zQ3JpdGVyaWE7CgkJJHRoaXMtPmlnbm9yZUNhc2UgPSAkaWdub3JlQ2FzZTsKCX0KfQoKPz4K]]></data>
	</file>
	<file>
	  <filename>/lib/class.OrmDb.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIENvbnRhaW5zIHRoZSBjbGFzcyBPcm1EYgogKiAKICogQHNpbmNlIDAuMS4yCiAqIEBhdXRob3IgQmVzcwogKiBAcGFja2FnZSBPcm0KICoqLwogCiAKLyoqCiAqIEludGVyZmFjZSBiZXR3ZWVuIHRoZSBmdW5jdGlvbnMgb2YgdGhlIE9ybSBmcmFtZXdvcmsgYW5kIEFkb2RiCiAqICAgCiAqIEBzaW5jZSAwLjEuMgogKiBAYXV0aG9yIEJlc3MKICogQHBhY2thZ2UgT3JtCiovCmNsYXNzIE9ybURiIHsgIAoKCXByaXZhdGUgc3RhdGljICRkYjsKCXByaXZhdGUgc3RhdGljICRkaWN0OwoJCglwcml2YXRlIHN0YXRpYyAkdGFib3B0YXJyYXkgPSBhcnJheSggJ215c3FsJyA9PiAnRU5HSU5FIE15SVNBTSBDSEFSQUNURVIgU0VUIHV0ZjggQ09MTEFURSB1dGY4X2dlbmVyYWxfY2knKTsKCXByaXZhdGUgc3RhdGljICRpZHhvcHRhcnJheVVuaXF1ZSA9IGFycmF5KCdVTklRVUUnKTsKCiAgICAvKioKICAgICogUHJvdGVjdGVkIGNvbnN0cnVjdG9yICAgIAogICAgKi8KCXByb3RlY3RlZCBmdW5jdGlvbiBfX2NvbnN0cnVjdCgpIHt9CgkKCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZnVuY3Rpb24gaW5pdCgpewoJCWlmKE9ybURiOjokZGIgIT0gbnVsbCl7CgkJCXJldHVybjsKCQl9CgkJT3JtRGI6OiRkYiA9IGNtc21zKCktPkdldERiKCk7CgkJT3JtRGI6OiRkaWN0ID0gTmV3RGF0YURpY3Rpb25hcnkoIE9ybURiOjokZGIgKTsKCX0KICAgICAgCiAgICAvKioKICAgICogd2lsbCBleGVjdXRlIHRoZSBBZG9kYiAiZXhlY3V0ZSIgZnVuY3Rpb24gYW5kIGFkZCBsb2dzIG9mIGV2ZXJ5dGhpbmcKICAgICogICAgICAgICAKICAgICogQHBhcmFtIHN0cmluZyB0aGUgc3FsIFF1ZXJ5CiAgICAqIEBwYXJhbSBhcnJheSB0aGUgbGlzdCBvZiBwYXJhbWV0ZXJzIG9yIG51bGwKICAgICogQHBhcmFtIHN0cmluZyB0aGUgbWVzc2FnZSBvZiBlcnJvciB0byBkaXNwbGF5IHRvIHRoZSB1c2VyCiAgICAqIEByZXR1cm4gdGhlIGFkb2RiIHJlc3VsdAoJKgoJKiBAZXhjZXB0aW9uIE9ybVNxbEV4Y2VwdGlvbiBpZiB0aGUgcXVlcnkgZmFpbGVkCiAgICAqLwoJcHVibGljIHN0YXRpYyBmaW5hbCBmdW5jdGlvbiBleGVjdXRlKCRxdWVyeSwgJHBhcmFtZXRlcnMgPSBudWxsLCAkZXJyb3JNc2cgPSAiRGF0YWJhc2UgZXJyb3IiKSB7CgkJLy9CZSBzdXJlIHdlIGluaXRpYXRlIHRoZSBkYiBjb25uZWN0b3I7CgkJT3JtRGI6OmluaXQoKTsKCQlPcm1UcmFjZTo6ZGVidWcoJHF1ZXJ5KTsKCQlpZigkcGFyYW1ldGVycyAhPSBudWxsKXsKCQkJT3JtVHJhY2U6OmRlYnVnKCIgPiBQYXJhbWV0ZXJzIDogIi5wcmludF9yKCRwYXJhbWV0ZXJzLCB0cnVlKSk7CgkJfQoJCSRyZXN1bHQgPSBPcm1EYjo6JGRiLT5FeGVjdXRlKCRxdWVyeSwgJHBhcmFtZXRlcnMpOwoJCWlmICgkcmVzdWx0ID09PSBmYWxzZSl7CgkJCU9ybVRyYWNlOjplcnJvcigkZXJyb3JNc2cpOwoJCQlPcm1UcmFjZTo6ZXJyb3IoIiA+IE15c3FsIHNhaWQgOiAiLk9ybURiOjokZGItPkVycm9yTXNnKCkpOwoJCQlPcm1UcmFjZTo6ZXJyb3IoIiA+IFRoZSBRdWVyeSB3YXMgOiAiLiRxdWVyeSk7CgkJCWlmKCRwYXJhbWV0ZXJzICE9IG51bGwpewoJCQkJT3JtVHJhY2U6OmVycm9yKCIgPiBUaGUgUGFyYW1ldGVycyB3YXMgOiAiLnByaW50X3IoJHBhcmFtZXRlcnMsIHRydWUpKTsKCQkJfQoJCQl0aHJvdyBuZXcgT3JtU3FsRXhjZXB0aW9uKCRlcnJvck1zZyk7CgkJfQoJCQoJCXJldHVybiAkcmVzdWx0OwoJfQkKCQoJIC8qKgogICAgKiB3aWxsIGV4ZWN1dGUgdGhlIEFkb2RiICJHZXRPbmUiIGZ1bmN0aW9uIGFuZCBhZGQgbG9ncyBvZiBldmVyeXRoaW5nCiAgICAqICAgICAgICAgCiAgICAqIEBwYXJhbSBzdHJpbmcgdGhlIHNxbCBRdWVyeQogICAgKiBAcGFyYW0gYXJyYXkgdGhlIGxpc3Qgb2YgcGFyYW1ldGVycyBvciBudWxsCiAgICAqIEBwYXJhbSBzdHJpbmcgdGhlIG1lc3NhZ2Ugb2YgZXJyb3IgdG8gZGlzcGxheSB0byB0aGUgdXNlcgogICAgKiBAcmV0dXJuIHRoZSBhZG9kYiByZXN1bHQKCSoKCSogQGV4Y2VwdGlvbiBPcm1TcWxFeGNlcHRpb24gaWYgdGhlIHF1ZXJ5IGZhaWxlZAogICAgKi8KCXB1YmxpYyBzdGF0aWMgZmluYWwgZnVuY3Rpb24gZ2V0T25lKCRxdWVyeSwgJHBhcmFtZXRlcnMgPSBudWxsLCAkZXJyb3JNc2cgPSAiRGF0YWJhc2UgZXJyb3IiKSB7CgkJLy9CZSBzdXJlIHdlIGluaXRpYXRlIHRoZSBkYiBjb25uZWN0b3I7CgkJT3JtRGI6OmluaXQoKTsKCQlPcm1UcmFjZTo6ZGVidWcoJHF1ZXJ5KTsKCQlpZigkcGFyYW1ldGVycyAhPSBudWxsKXsKCQkJT3JtVHJhY2U6OmRlYnVnKCIgPiBQYXJhbWV0ZXJzIDogIi5wcmludF9yKCRwYXJhbWV0ZXJzLCB0cnVlKSk7CgkJfQoJCSRyZXN1bHQgPSBPcm1EYjo6JGRiLT5HZXRPbmUoJHF1ZXJ5LCAkcGFyYW1ldGVycyk7CgkJaWYgKCRyZXN1bHQgPT09IGZhbHNlKXsKCQkJT3JtVHJhY2U6OmVycm9yKCRlcnJvck1zZyk7CgkJCU9ybVRyYWNlOjplcnJvcigiID4gTXlzcWwgc2FpZCA6ICIuT3JtRGI6OiRkYi0+RXJyb3JNc2coKSk7CgkJCU9ybVRyYWNlOjplcnJvcigiID4gVGhlIFF1ZXJ5IHdhcyA6ICIuJHF1ZXJ5KTsKCQkJaWYoJHBhcmFtZXRlcnMgIT0gbnVsbCl7CgkJCQlPcm1UcmFjZTo6ZXJyb3IoIiA+IFRoZSBQYXJhbWV0ZXJzIHdhcyA6ICIucHJpbnRfcigkcGFyYW1ldGVycywgdHJ1ZSkpOwoJCQl9CgkJCXRocm93IG5ldyBPcm1TcWxFeGNlcHRpb24oJGVycm9yTXNnKTsKCQl9CgkJCgkJcmV0dXJuICRyZXN1bHQ7Cgl9CQoJCgkgLyoqCiAgICAqIHdpbGwgZXhlY3V0ZSB0aGUgQWRvZGIgIkdlbklEIiBmdW5jdGlvbiBhbmQgYWRkIGxvZ3Mgb2YgZXZlcnl0aGluZwogICAgKiAgICAgICAgIAogICAgKiBAcGFyYW0gc3RyaW5nIHRoZSB0YWJsZSB1c2VkIGZvciBzZXF1ZW5jZSAKICAgICogQHBhcmFtIHN0cmluZyB0aGUgbWVzc2FnZSBvZiBlcnJvciB0byBkaXNwbGF5IHRvIHRoZSB1c2VyCiAgICAqIEByZXR1cm4gdGhlIGFkb2RiIHJlc3VsdAoJKgoJKiBAZXhjZXB0aW9uIE9ybVNxbEV4Y2VwdGlvbiBpZiB0aGUgcXVlcnkgZmFpbGVkCiAgICAqLwoJcHVibGljIHN0YXRpYyBmaW5hbCBmdW5jdGlvbiBnZW5JRCgkc2VxbmFtZSwgJGVycm9yTXNnID0gIkRhdGFiYXNlIGVycm9yIikgewoJCS8vQmUgc3VyZSB3ZSBpbml0aWF0ZSB0aGUgZGIgY29ubmVjdG9yOwoJCU9ybURiOjppbml0KCk7CgkJCgkJT3JtVHJhY2U6OmRlYnVnKCJnZW4gSWQoeyRzZXFuYW1lfSkiKTsKCQkkcmVzdWx0ID0gT3JtRGI6OiRkYi0+R2VuSUQoJHNlcW5hbWUpOwoJCWlmICgkcmVzdWx0ID09PSBmYWxzZSl7CgkJCU9ybVRyYWNlOjplcnJvcigkZXJyb3JNc2cpOwoJCQlPcm1UcmFjZTo6ZXJyb3IoIiA+IE15c3FsIHNhaWQgOiAiLk9ybURiOjokZGItPkVycm9yTXNnKCkpOwoJCQlPcm1UcmFjZTo6ZXJyb3IoIiA+IFRoZSBHZW5JZCB3YXMgbWFkZSBvbiA6ICIuJHNlcW5hbWUpOwoKCQkJdGhyb3cgbmV3IE9ybVNxbEV4Y2VwdGlvbigkZXJyb3JNc2cpOwoJCX0KCQkKCQlyZXR1cm4gJHJlc3VsdDsKCX0JCgkKCSAvKioKICAgICogd2lsbCBleGVjdXRlIHRoZSBBZG9kYiAiQ3JlYXRlVGFibGVTUUwiIGZ1bmN0aW9uIGFuZCBhZGQgbG9ncyBvZiBldmVyeXRoaW5nCiAgICAqICAgICAgICAgCiAgICAqIEBwYXJhbSBzdHJpbmcgdGhlIHRhYmxlIHVzZWQgZm9yIHNlcXVlbmNlIAogICAgKiBAcGFyYW0gc3RyaW5nIHRoZSBocWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGZpZWxkcwogICAgKiBAcmV0dXJuIHRoZSBhZG9kYiByZXN1bHQKCSoKCSogQGV4Y2VwdGlvbiBPcm1TcWxFeGNlcHRpb24gaWYgdGhlIHF1ZXJ5IGZhaWxlZAogICAgKi8KCXB1YmxpYyBzdGF0aWMgZmluYWwgZnVuY3Rpb24gY3JlYXRlVGFibGUoJHRhYmxlTmFtZSwgJGhxbCkgewoJCS8vQmUgc3VyZSB3ZSBpbml0aWF0ZSB0aGUgZGIgY29ubmVjdG9yOwoJCU9ybURiOjppbml0KCk7CgkJCgkJT3JtVHJhY2U6OmRlYnVnKCJjcmVhdGVUYWJsZSh7JHRhYmxlTmFtZX0sIHskaHFsfSkiKTsKCQkKCQkkc3FsYXJyYXkgPSBPcm1EYjo6JGRpY3QtPkNyZWF0ZVRhYmxlU1FMKCR0YWJsZU5hbWUsIAoJCQkJCQkJCQkJCQkkaHFsLAoJCQkJCQkJCQkJCQlPcm1EYjo6JHRhYm9wdGFycmF5KTsKCQkJCQkJCQkJCQkJCgkJJHJlc3VsdCA9IE9ybURiOjokZGljdC0+RXhlY3V0ZVNRTEFycmF5KCRzcWxhcnJheSk7CgkJaWYgKCRyZXN1bHQgPT09IGZhbHNlKXsKCQkJT3JtVHJhY2U6OmVycm9yKCRlcnJvck1zZyk7CgkJCU9ybVRyYWNlOjplcnJvcigiID4gTXlzcWwgc2FpZCA6ICIuT3JtRGI6OiRkYi0+RXJyb3JNc2coKSk7CgkJCU9ybVRyYWNlOjplcnJvcigiID4gVGhlIENyZWF0ZVRhYmxlIHdhcyBtYWRlIG9uIDogeyR0YWJsZU5hbWV9IHdpdGggeyRocWx9IHBhcmFtZXRlcnMiKTsKCgkJCXRocm93IG5ldyBPcm1TcWxFeGNlcHRpb24oJGVycm9yTXNnKTsKCQl9CgkJCgkJcmV0dXJuICRyZXN1bHQ7Cgl9CgkvKioKICAgICogd2lsbCBleGVjdXRlIHRoZSBBZG9kYiAiRHJvcFRhYmxlU1FMIiBmdW5jdGlvbiBhbmQgYWRkIGxvZ3Mgb2YgZXZlcnl0aGluZwogICAgKiAgICAgICAgIAogICAgKiBAcGFyYW0gc3RyaW5nIHRoZSB0YWJsZSB1c2VkIGZvciBzZXF1ZW5jZSAKICAgICogQHBhcmFtIHN0cmluZyB0aGUgaHFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBmaWVsZHMKICAgICogQHJldHVybiB0aGUgYWRvZGIgcmVzdWx0CgkqCgkqIEBleGNlcHRpb24gT3JtU3FsRXhjZXB0aW9uIGlmIHRoZSBxdWVyeSBmYWlsZWQKICAgICovCglwdWJsaWMgc3RhdGljIGZpbmFsIGZ1bmN0aW9uIGRyb3BUYWJsZSgkdGFibGVOYW1lKSB7CgkJLy9CZSBzdXJlIHdlIGluaXRpYXRlIHRoZSBkYiBjb25uZWN0b3I7CgkJT3JtRGI6OmluaXQoKTsKCQkKCQlPcm1UcmFjZTo6ZGVidWcoImRyb3BUYWJsZSh7JHRhYmxlTmFtZX0pIik7CgkJCgkJJHNxbGFycmF5ID0gT3JtRGI6OiRkaWN0LT5Ecm9wVGFibGVTUUwoJHRhYmxlTmFtZSk7CgkJJHJlc3VsdCA9IE9ybURiOjokZGljdC0+ZXhlY3V0ZVNRTEFycmF5KCRzcWxhcnJheSk7CgkJCgkJaWYgKCRyZXN1bHQgPT09IGZhbHNlKXsKCQkJT3JtVHJhY2U6OmVycm9yKCRlcnJvck1zZyk7CgkJCU9ybVRyYWNlOjplcnJvcigiID4gTXlzcWwgc2FpZCA6ICIuT3JtRGI6OiRkYi0+RXJyb3JNc2coKSk7CgkJCU9ybVRyYWNlOjplcnJvcigiID4gVGhlIERyb3BUYWJsZSB3YXMgbWFkZSBvbiA6IHskdGFibGVOYW1lfSIpOwoKCQkJdGhyb3cgbmV3IE9ybVNxbEV4Y2VwdGlvbigkZXJyb3JNc2cpOwoJCX0KCQkKCQlyZXR1cm4gJHJlc3VsdDsKCX0KCQoJLyoqCiAgICAqIHdpbGwgZXhlY3V0ZSB0aGUgQWRvZGIgIkNyZWF0ZVNlcXVlbmNlIiBmdW5jdGlvbiBhbmQgYWRkIGxvZ3Mgb2YgZXZlcnl0aGluZwogICAgKiAgICAgICAgIAogICAgKiBAcGFyYW0gc3RyaW5nIHRoZSB0YWJsZSB1c2VkIGZvciBzZXF1ZW5jZSAKICAgICovCglwdWJsaWMgc3RhdGljIGZpbmFsIGZ1bmN0aW9uIGNyZWF0ZVNlcXVlbmNlKCRzZXFOYW1lKXsKCQkvL0JlIHN1cmUgd2UgaW5pdGlhdGUgdGhlIGRiIGNvbm5lY3RvcjsKCQlPcm1EYjo6aW5pdCgpOwoJCQoJCU9ybVRyYWNlOjpkZWJ1ZygiY3JlYXRlU2VxdWVuY2UoeyRzZXFOYW1lfSkiKTsKCQkKCQlPcm1EYjo6JGRiLT5DcmVhdGVTZXF1ZW5jZSgkc2VxTmFtZSk7Cgl9CgkKCS8qKgogICAgKiB3aWxsIGV4ZWN1dGUgdGhlIEFkb2RiICJEcm9wU2VxdWVuY2UiIGZ1bmN0aW9uIGFuZCBhZGQgbG9ncyBvZiBldmVyeXRoaW5nCiAgICAqICAgICAgICAgCiAgICAqIEBwYXJhbSBzdHJpbmcgdGhlIHRhYmxlIHVzZWQgZm9yIHNlcXVlbmNlIAogICAgKi8KCXB1YmxpYyBzdGF0aWMgZmluYWwgZnVuY3Rpb24gZHJvcFNlcXVlbmNlKCRzZXFOYW1lKXsKCQkvL0JlIHN1cmUgd2UgaW5pdGlhdGUgdGhlIGRiIGNvbm5lY3RvcjsKCQlPcm1EYjo6aW5pdCgpOwoJCQoJCU9ybVRyYWNlOjpkZWJ1ZygiZHJvcFNlcXVlbmNlKHskc2VxTmFtZX0pIik7CgkJCgkJT3JtRGI6OiRkYi0+RHJvcFNlcXVlbmNlKCRzZXFOYW1lKTsKCQkKCX0KCQoJLyoqCiAgICAqIHdpbGwgZXhlY3V0ZSB0aGUgQWRvZGIgIkNyZWF0ZUluZGV4U1FMIiBmdW5jdGlvbiB3aXRoIG9yIHdpdGhvdXQgVU5JUVVFIHBhcmFtZXRlciBhbmQgYWRkIGxvZ3Mgb2YgZXZlcnl0aGluZwogICAgKiAgICAgICAgIAogICAgKiBAcGFyYW0gc3RyaW5nIHRoZSB0YWJsZSB1c2VkIGZvciBzZXF1ZW5jZSAKICAgICogQHBhcmFtIG1peGVkIHRoZSBsaXN0IG9mIHRoZSBGaWVsZE5hbWUgKGFycmF5KSBvciBhIHNpbmdsZSBmaWVsZE5hbWUgKFN0cmluZykKICAgICogQHBhcmFtIGJvb2xlYW4gdHJ1ZSBpZiB0aGUgaW5kZXggbXVzdCBiZSBVTklRVUUKICAgICogQHJldHVybiB0aGUgYWRvZGIgcmVzdWx0CgkqCgkqIEBleGNlcHRpb24gT3JtU3FsRXhjZXB0aW9uIGlmIHRoZSBxdWVyeSBmYWlsZWQKICAgICovCglwdWJsaWMgc3RhdGljIGZpbmFsIGZ1bmN0aW9uIGNyZWF0ZUluZGV4KCR0YWJsZU5hbWUsICRsaXN0RmllbGRzLCAkaXNVbmlxdWUgPSBmYWxzZSl7CgkJLy9CZSBzdXJlIHdlIGluaXRpYXRlIHRoZSBkYiBjb25uZWN0b3I7CgkJT3JtRGI6OmluaXQoKTsKCQkKCQlPcm1UcmFjZTo6ZGVidWcoImNyZWF0ZUluZGV4KHskdGFibGVOYW1lfSwgeyIuaW1wbG9kZSgnLCcsJGxpc3RGaWVsZHMpLiJ9LCB7JGlzVW5pcXVlfSkiKTsKCQkJCQoJCS8vQ2FzZSA6IHVuaXF1ZSBpbmRleCBvbiBtYW55IGZpZWxkcwoJCWlmKGlzX2FycmF5KCRsaXN0RmllbGRzKSkgewoJCQkkaWR4ZmxkcyA9IGltcGxvZGUoJywnLCAkbGlzdEZpZWxkcyk7CgkJCSRtZDUgPSBtZDUoc2VyaWFsaXplKCRsaXN0RmllbGRzKSk7CgkJfSBlbHNlIHsKCQkJJGlkeGZsZHMgPSAkbGlzdEZpZWxkczsKCQkJJG1kNSA9IG1kNSgkbGlzdEZpZWxkcyk7CgkJfQoJCWlmKCRpc1VuaXF1ZSl7CgkJCSRzcWxhcnJheSA9IE9ybURiOjokZGljdC0+Q3JlYXRlSW5kZXhTUUwoJG1kNSwgJHRhYmxlTmFtZSwgJGlkeGZsZHMsIE9ybURiOjokaWR4b3B0YXJyYXlVbmlxdWUpOwoJCX0gZWxzZSB7CgkJCSRzcWxhcnJheSA9IE9ybURiOjokZGljdC0+Q3JlYXRlSW5kZXhTUUwoJG1kNSwgJHRhYmxlTmFtZSwgJGlkeGZsZHMpOwoJCX0KCQkKCQkkcmVzdWx0ID0gT3JtRGI6OiRkaWN0LT5leGVjdXRlU1FMQXJyYXkoJHNxbGFycmF5KTsKCQkKCQlpZiAoJHJlc3VsdCA9PT0gZmFsc2UpewoJCQlPcm1UcmFjZTo6ZXJyb3IoJGVycm9yTXNnKTsKCQkJT3JtVHJhY2U6OmVycm9yKCIgPiBNeXNxbCBzYWlkIDogIi5Pcm1EYjo6JGRiLT5FcnJvck1zZygpKTsKCQkJT3JtVHJhY2U6OmVycm9yKCIgPiBUaGUgY3JlYXRlSW5kZXggd2FzIG1hZGUgb24gOiB7JHRhYmxlTmFtZX0gd2l0aCB0aGUgZmllbGRzIDogeyRsaXN0RmllbGRzfSIpOwoKCQkJdGhyb3cgbmV3IE9ybVNxbEV4Y2VwdGlvbigkZXJyb3JNc2cpOwoJCX0KCQkKCQlyZXR1cm4gJHJlc3VsdDsKCX0KCQoJCgkKCQp9Cgo/Pgo=]]></data>
	</file>
	<file>
	  <filename>/lib/class.OrmEntity.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIENvbnRhaW5zIHRoZSBjbGFzcyBPcm1FbnRpdHkKICoKICogQHNpbmNlIDAuMC4xCiAqIEBhdXRob3IgQmVzcwogKiBAcGFja2FnZSBPcm0KICoqLwogCi8qKgogKiBBYnN0cmFjdCBDbGFzc2VzIGRlc2NyaWJpbmcgdGhlIGZyYW1lIG9mIGFuIE9ybUVudGl0eSBpbnRvIE9ybQogKgogKiBAc2luY2UgMC4wLjEKICogQGF1dGhvciBCZXNzCiAqIEBwYWNrYWdlIE9ybQogKiovCmFic3RyYWN0IGNsYXNzIE9ybUVudGl0eQp7CgkvKioKCSAqIFN0cmluZyA6IE5hbWUgb2YgdGhlIG1vZHVsZSB0aGF0IGN1cnJlbnRseSB1c2UgdGhpcyBlbnRpdHkKCSAqICovCglwcml2YXRlICRtb2R1bGVOYW1lOwoJCgkvKioKCSAqIFN0cmluZyA6IHRoZSBvZmZpY2lhbCBuYW1lIG9mIHRoZSBlbnRpdHkKCSAqICovCglwcm90ZWN0ZWQgJG5hbWU7CgoJLyoqCgkgKiBTdHJpbmcgOiB0aGUgbmFtZSBvZiB0aGUgdGFibGUgaW4gZGF0YWJhc2UKCSAqICovCglwcml2YXRlICRkYm5hbWU7CgkKCS8qKgoJICogU3RyaW5nIDogbmFtZSBvZiB0aGUgc2VxdWVuY2UgbGlua2VkIHRvIHRoZSB0YWJsZSBpbiB0aGUgZGF0YWJhc2UuIE1heSBiZSBOdWxsCgkgKiAqLwoJcHJpdmF0ZSAkc2VxbmFtZTsKCQoJLyoqCgkgKiBsaXN0IDogZmllbGRzIG1ha2luZyB1cCB0aGUgZW50aXR5CgkgKiAqLwoJcHJpdmF0ZSAkZmllbGRzID0gYXJyYXkoKTsKCQoJLyoqCgkgKiBsaXN0IDogdmFsdWVzIG9mIGVhY2ggZmllbGRzCgkgKiAqLwoJcHJpdmF0ZSAkdmFsdWVzID0gYXJyYXkoKTsKCQoJLyoqCgkgKiBBcnJheSA6IE5hbWVzIG9mIHRoZSBmaWVsZHMgd2ljaCB3aWxsIGJlIHVzZWQgYXMgYSAoY29tcG91bmQpIFByaW1hcnkgS2V5CgkgKiAqLwoJcHJpdmF0ZSAkcGsgPSBhcnJheSgpOwoJCgkvKioKCSAqIEJvb2xlYW4gOiBpZiB0cnVlIHRoZSBmcmFtZXdvcmsgd2lsbCB0cnkgdG8gdXNlIHRoZSBpbm5lciBhdXRvaW5jcmVtZW50IG9mIE15c3FsIGluc3RlYWQgZ2VuZXJhdGUgYSBuZXcgdGFibGUgeHh4X3NlcSBsaWtlIHVzdWFsCgkgKi8KCXByaXZhdGUgJGF1dG9pbmNyZW1lbnQgPSBmYWxzZTsKCQoJLyoqCgkgKiBBcnJheSwgY29udGFpbnMgYWxsIHRoZSBpbmRleGVzIG9mIHRoZSBFbnRpdHkuCgkgKiovCSAKCXByaXZhdGUgJGluZGV4ZXMgPSBhcnJheSgpOwoJCgkvKioKCSAqIE9ybU9yZGVyQnkgOiBpZiB0cnVlIHRoZSBmcmFtZXdvcmsgd2lsbCB0cnkgdG8gdXNlIHRoZSBpbm5lciBhdXRvaW5jcmVtZW50IG9mIE15c3FsIGluc3RlYWQgZ2VuZXJhdGUgYSBuZXcgdGFibGUgeHh4X3NlcSBsaWtlIHVzdWFsCgkgKi8KCXByaXZhdGUgJGRlZmF1bHRPcmRlckJ5OwoKCS8qKgoJICogQXJyYXksIGNvbnRhaW5zIHRoZSBhbGlhcyBmb3IgZ2V0KiBhbmQgc2V0KiBmdW5jdGlvbgoJICovIAoJcHJpdmF0ZSAkYWxpYXMgPSBhcnJheSgpOwoJCgkvKioKCSAqIFN0cmluZyA6IGNvbnN0YW50LCBzdWZmaXggZm9yIHRoZSBzZXF1ZW5jZSBuYW1lIGludG8gdGhlIGRhdGFiYXNlCgkgKiAqLwoJcHVibGljIHN0YXRpYyAkX0NPTlNUX1NFUSA9ICdfc2VxJzsKCS8qKgoJICogU3RyaW5nIDogY29uc3RhbnQsIHN1ZmZpeCB1c2VkIHRvIG5hbWVkIHRoZSB0YWJsZSBpbnRvIGRhdGFiYXNlIGZvciBhIG1vZHVsZQoJICogKi8KCXB1YmxpYyBzdGF0aWMgJF9DT05TVF9NT0QgPSAnbW9kdWxlJzsKCQoJCiAgICAvKioKICAgICAqIGNvbnN0cnVjdG9yIHByb3RlY3RlZCB0byBhdm9pZCBhIGRpcmVjdCBpbnN0YW50aWF0aW9uIGxpa2UgIm5ldyBPcm1FbnRpdHkoKSIKICAgICAqIEVhY2ggdGltZSBhIGVudGl0eSBpcyBjb25zdHJ1Y3RlZCwgd2UgcGxhY2UgYSBjb3B5IGludG8gdGhlIGF1dG9sb2FkZXIuCiAgICAgKiAKICAgICAqIEBwYXJhbSBzdHJpbmcgVGhlIG5hbWUgb2YgdGhlIG1vZHVsZSB3aG8gY2FsbGluZyB0aGlzIG1ldGhvZCAoc28gbm90ICJPcm0iKQogICAgICogQHBhcmFtIHN0cmluZyBUaGUgbmFtZSBvZiB0aGUgZW50aXR5CiAgICAgKiBAcGFyYW0gc3RyaW5nIFtvcHRpb25hbF0gUHJlZml4IHRvIHVzZSBpbnRvIGRhdGFiYXNlIGZvciB0YWJsZS4gSWYgbm90IHNldHRlZCwgaXQgd2lsbCB1c2UgdGhlIG5hbWUgb2YgeW91ciBtb2R1bGUKICAgICAqIEBwYXJhbSBzdHJpbmcgW29wdGlvbmFsXSBUaGUgbmFtZSBvZiB0YWJsZSBmb3IgdGhpcyBlbnRpdHkuIElmIG5vdCBzZXR0ZWQsIGl0IHdpbGwgdXNlIHRoZSBuYW1lIG9mIHlvdXIgZW50aXR5CiAgICAgKgogICAgICogQHJldHVybiBPcm1FbnRpdHkgdGhlIGVudGl0eSBhcyBhIG5ldyBpbnN0YW5jZQogICAgICogCiAgICAgKiBAc2VlIE15QXV0b2xvYWQKICAgICAqLwoJcHJvdGVjdGVkIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRtb2R1bGVOYW1lLCAkbmFtZSwgJHByZWZpeGUgPSBudWxsLCAkZGJOYW1lID0gbnVsbCkgewoJCSR0aGlzLT5tb2R1bGVOYW1lID0gc3RydG9sb3dlcigkbW9kdWxlTmFtZSk7CgkJJHRoaXMtPm5hbWUgPSBzdHJ0b2xvd2VyKCRuYW1lKTsKCQkKCQlpZihNeUF1dG9sb2FkOjpoYXNJbnN0YW5jZSgkdGhpcy0+bW9kdWxlTmFtZSwkdGhpcy0+bmFtZSkpewoJCQkJJGluc3RhbmNlID0gTXlBdXRvbG9hZDo6Z2V0SW5zdGFuY2UoJHRoaXMtPm1vZHVsZU5hbWUsJHRoaXMtPm5hbWUpOwoJCQkJcmV0dXJuICBjbG9uZSAkaW5zdGFuY2U7CiAgICAgICAgfSAKCQkKCQkkdGhpcy0+ZGJuYW1lID0gJHRoaXMtPm5hbWU7CgkJaWYoIWVtcHR5KCRkYk5hbWUpKSB7CgkJCSR0aGlzLT5kYm5hbWUgPSBzdHJ0b2xvd2VyKCRkYk5hbWUpOwoJCX0KCQkKCQlpZihlbXB0eSgkcHJlZml4ZSkpIHsKCQkJJHByZWZpeGUgPSAkdGhpcy0+bW9kdWxlTmFtZTsKCQl9IGVsc2UgewoJCQkkcHJlZml4ZSA9IHN0cnRvbG93ZXIoJHByZWZpeGUpOwoJCX0KCQkKCQkkdGhpcy0+ZGJuYW1lID0gY21zX2RiX3ByZWZpeCgpLk9ybUVudGl0eTo6JF9DT05TVF9NT0QuJ18nLiRwcmVmaXhlLidfJy4kdGhpcy0+ZGJuYW1lOwoJCQoJCS8vIFdlIGFkZCBhbiBpbnN0YW5jZSBvZiBvdXItc2VyZiBpbnRvIHRoZSBhdXRvbG9hZAoJCU15QXV0b2xvYWQ6OmFkZEluc3RhbmNlKCR0aGlzLT5tb2R1bGVOYW1lLCR0aGlzKTsKCX0KCQogICAgLyoqCiAgICAqICBDYW4gYmUgb3ZlcnJpZGUuIExldCB5b3Ugc3BlY2lmeSBob3cgeW91ciB0YWJsZSBtdXN0IGJlIHBvcHVsYXRlZCAKICAgICogYWZ0ZXIgeW91IGFza2VkIHRvIGNyZWF0ZSB0aGUgdGFibGUgb2YgeW91ciBFbnRpdHkKICAgICovCglwdWJsaWMgZnVuY3Rpb24gaW5pdFRhYmxlKCl7fQogICAgCQogICAgLyoqCiAgICAqIEFkZCBhIG5ldyBGaWVsZCBpbnRvIHRoZSBsaXN0IG9mIEZpZWxkcwogICAgKiAKICAgICogQHBhcmFtIE9ybUZpZWxkIHRoZSBvYmplY3QgRmllbGQgdG8gYWRkCiAgICAqIEByZXR1cm4gT3JtRW50aXR5IHRoZSBjdXJyZW50IGluc3RhbmNlCgkqIAoJKiBAZXhjZXB0aW9uIE9ybUlsbGVnYWxDb25maWd1cmF0aW9uRXhjZXB0aW9uIGlmIHdlIHRyeSB0byB1c2UgbW9yZSB0aGFuIGEgc2luZ2xlIFByaW1hcnlLZXkgaW4gdGhlIGVudGl0eQogICAgKi8KCXByb3RlY3RlZCBmdW5jdGlvbiBhZGQoT3JtRmllbGQgJG5ld0ZpZWxkKSB7CgkJCgkJJHRoaXMtPmZpZWxkc1skbmV3RmllbGQtPmdldE5hbWUoKV0gPSAkbmV3RmllbGQ7CgoJCS8vQWRkIGEgc2VxdWVuY2Ugb24gdGhlIGtleXMKCQlpZigkbmV3RmllbGQtPmlzUHJpbWFyeUtFWSgpKSB7CgkJCQkKCQkJJHRoaXMtPnBrW10gPSAkbmV3RmllbGQtPmdldE5hbWUoKTsKCQkJaWYoISR0aGlzLT5pc0F1dG9pbmNyZW1lbnQoKSkgeyAvLyBubyBzZXF1ZW5jZSBpZiBhdXRvaW5jcmVtZW50IHVzZWQKICAgICAgICAgICAgICAgICR0aGlzLT5zZXFuYW1lID0gJHRoaXMtPmRibmFtZS5Pcm1FbnRpdHk6OiRfQ09OU1RfU0VROwogICAgICAgICAgICB9CgkJfQoKCgoJCXJldHVybiAkdGhpczsKCX0KCQogICAgLyoqCiAgICAqIFJldHVybiB0aGUgbGlzdCBvZiBQcmltYXJ5S2V5IEZpZWxkCiAgICAqIAogICAgKiBAcmV0dXJuIGFycmF5PE9ybUZpZWxkPiB0aGUgbGlzdCBvZiBQcmltYXJ5S2V5IEZpZWxkCiAgICAqIEBleGNlcHRpb24gT3JtSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZXJlIGlzIG5vIFByaW1hcnlLZXkgRmllbGQKICAgICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0UGsoKSB7CgkJaWYoJHRoaXMtPnBrID09IG51bGwpIHsKCQkJdGhyb3cgbmV3IE9ybUlsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidGhlIGVudGl0eSB7JHRoaXMtPmdldE5hbWUoKX0gZG9lc24ndCBoYXZlIGFueSBQcmltYXJ5LUtleSIpOwoJCX0KCQkKICAgICAgICAkbGlzdF9wayA9IGFycmF5KCk7CiAgICAgICAgZm9yZWFjaCgkdGhpcy0+cGsgYXMgJHBrKXsKICAgICAgICAgICAgJGxpc3RfcGtbJHBrXSA9ICR0aGlzLT5maWVsZHNbJHBrXTsKICAgICAgICB9CgkJcmV0dXJuICRsaXN0X3BrOwoJfQoKCS8qCgkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIFByaW1hcnlLZXkgCgkgKgoJICogQHJldHVybiBCb29sZWFuICBpZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIFByaW1hcnlLZXkgCgkgKiovCglwdWJsaWMgZnVuY3Rpb24gaGFzQ29tcG9zaXRlS2V5KCl7CgkJaWYoJHRoaXMtPnBrID09IG51bGwpIHsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCQlyZXR1cm4gY291bnQoJHRoaXMtPnBrKSA+IDEgOwoJfQoKCS8qKgoJICogUmV0dXJuIGEgc2VjdXJpemVzIGFncmVnYXRlIGZvciBzaW5nbGUgb3IgY29tcG9zaXRlIFByaW1hcnlLZXkgdG8gbWFrZSBkaXN0aW5jdGlvbiBiZXR3ZWVuIDIgZW50aXR5IG9mIHRoZSBzYW1lIHR5cGUKCSAqCgkgKiBAcmV0dXJuIFN0cmluZyB0aGUgIlByaW1hcnkgVW5pcXVlIElEZW50aWZpZXIiCgkgKgoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0UFVJRCgpewoJCSR2YWxzID0gYXJyYXkoKTsKCQlmb3JlYWNoICgkdGhpcy0+Z2V0UGsoKSBhcyAkcGtuYW1lID0+ICRwaykgewoJCQkkdmFsc1tdID0gJHRoaXMtPmdldCgkcGtuYW1lKTsKCQl9CgkJcmV0dXJuIE9ybVV0aWxzOjpnZW5lcmF0ZVBVSUQoJHZhbHMpOwoJCQoJfQoJCiAgICAvKioKICAgICogUmV0dXJuIHRoZSBsaXN0IG9mIEZpZWxkcwogICAgKiAKICAgICogQHJldHVybiBhcnJheTxGaWVsZD4gYW4gYXJyYXkgd2l0aCBhbGwgdGhlIEZpZWxkcwogICAgKiAKICAgICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0RmllbGRzKCkgewoJCXJldHVybiAkdGhpcy0+ZmllbGRzOwoJfQoJCiAgICAvKioKICAgICogcmV0dXJuIGEgRmllbGQgYnkgbmFtZQogICAgKiAKICAgICogQHBhcmFtIHN0cmluZyB0aGUgZmllbGQgbmFtZQogICAgKiBAcmV0dXJuIE9ybUZpZWxkIHRoZSBGaWVsZAogICAgKiAKICAgICogQGV4Y2VwdGlvbiBPcm1JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgbm8gRmllbGQgZXhpc3QgZm9yIHRoZSBuYW1lCiAgICAqLwoJcHVibGljIGZ1bmN0aW9uIGdldEZpZWxkQnlOYW1lKCRmaWVsZE5hbWUpIHsKCQkKCQlpZihlbXB0eSgkZmllbGROYW1lKSl7CgkJCXRocm93IG5ldyBPcm1JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBmdW5jdGlvbiBnZXRGaWVsZEJ5TmFtZShcJGZpZWxkTmFtZSkgZG9lc24ndCBhY2NlcHQgYSBudWxsIHBhcmFtZXRlciAoZW50aXR5IDogeyR0aGlzLT5nZXROYW1lKCl9KSIpOwoJCX0KCQoJCWlmKCFhcnJheV9LRVlfZXhpc3RzKCRmaWVsZE5hbWUsJHRoaXMtPmZpZWxkcykpewoJCQl0aHJvdyBuZXcgT3JtSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJGdW5jdGlvbiBnZXRGaWVsZEJ5TmFtZShcJGZpZWxkTmFtZSkgOiBUaGUgZmllbGQgeyRmaWVsZE5hbWV9IGRvZXNuJ3QgZXhpc3QgaW50byB0aGUgZW50aXR5IHskdGhpcy0+Z2V0TmFtZSgpfSIpOwoJCX0KCQkKCQlyZXR1cm4gJHRoaXMtPmZpZWxkc1skZmllbGROYW1lXTsKCQkKCX0KCQogICAgLyoqCiAgICAqIFJldHVybiB0cnVlIGlmIGEgRmllbGQgZXhpc3RzIGZvciB0aGUgbmFtZQogICAgKiAKICAgICogQHBhcmFtIHN0cmluZyB0aGUgbmFtZQogICAgKiBAcmV0dXJuIEJvb2xlYW4gaWYgZXhpc3RzCiAgICAqLwoJcHVibGljIGZ1bmN0aW9uIGlzRmllbGRCeU5hbWVFeGlzdHMoJG5hbWUpIHsKCQlyZXR1cm4gaXNzZXQoJHRoaXMtPmZpZWxkc1skbmFtZV0pOwoJfQoJCiAgICAvKioKICAgICogUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSB0YWJsZSBpbnRvIHRoZSBkYXRhYmFzZQogICAgKiAKICAgICogQHJldHVybiBzdHJpbmcgdGhlIG5hbWUgb2YgdGhlIHRhYmxlIGludG8gdGhlIGRhdGFiYXNlCiAgICAqIAogICAgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXREYm5hbWUoKSB7CgkJcmV0dXJuICR0aGlzLT5kYm5hbWU7Cgl9CgkKICAgIC8qKgogICAgKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGVudGl0eQogICAgKiAKICAgICogQHJldHVybiBzdHJpbmcgdGhlIG5hbWUgb2YgdGhlIGVudGl0eQogICAgKiAKICAgICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0TmFtZSgpIHsKCQlyZXR1cm4gJHRoaXMtPm5hbWU7Cgl9CgkKCS8qKgoJICogIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgY3VycmVudCBtb2R1bGUKCSAqICAKCSAqICBAcmV0dXJuIHN0cmluZyB0aGUgbmFtZSBvZiB0aGUgY3VycmVudCBtb2R1bGUuCgkgKiovCglwdWJsaWMgZnVuY3Rpb24gZ2V0TW9kdWxlTmFtZSgpIHsKCQlyZXR1cm4gJHRoaXMtPm1vZHVsZU5hbWU7Cgl9CgkKICAgIC8qKgogICAgKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHNlcXVlbmNlIChpZiBleGlzdHMpCiAgICAqIAogICAgKiBAcmV0dXJuIHN0cmluZyB0aGUgbmFtZSBvZiB0aGUgc2VxdWVuY2Ugb3IgTlVMTAogICAgKiAKICAgICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0U2VxbmFtZSgpIHsKCQlpZihlbXB0eSgkdGhpcy0+c2VxbmFtZSkpCgkJCXJldHVybiBudWxsOwoJCQoJCXJldHVybiAkdGhpcy0+c2VxbmFtZTsKCX0KCQogICAgLyoqCiAgICAqIFJldHVybiB0aGUgdmFsdWUgZm9yIGEgRmllbGQgYnkgdGhlIG5hbWUgCiAgICAqIAkKICAgICogQHBhcmFtIHN0cmluZyB0aGUgbmFtZSBvZiB0aGUgRmllbGQKICAgICogQHJldHVybiBtaXhlZCB0aGUgdmFsdWUgZm9yIHRoZSBmaWVsZAogICAgKiAKICAgICogQGV4Y2VwdGlvbiBPcm1JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgbm8gRmllbGQgZXhpc3RzIGZvciB0aGUgbmFtZQogICAgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXQoJGZpZWxkTmFtZSkgewoJCQoJCWlmKGVtcHR5KCRmaWVsZE5hbWUpKXsKCQkJdGhyb3cgbmV3IE9ybUlsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGZ1bmN0aW9uIGdldChcJGZpZWxkTmFtZSkgZG9lc24ndCBhY2NlcHQgYSBudWxsIHBhcmFtZXRlciAoZW50aXR5IDogeyR0aGlzLT5nZXROYW1lKCl9KSIpOwoJCX0KCQoJCWlmKCFhcnJheV9LRVlfZXhpc3RzKCRmaWVsZE5hbWUsJHRoaXMtPmZpZWxkcykgJiYgIWFycmF5X0tFWV9leGlzdHMoJGZpZWxkTmFtZSwkdGhpcy0+YWxpYXMpKXsKCQkJdGhyb3cgbmV3IE9ybUlsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiRnVuY3Rpb24gZ2V0KFwkZmllbGROYW1lKSA6IFRoZSBmaWVsZCB7JGZpZWxkTmFtZX0gZG9lc24ndCBleGlzdCBpbnRvIHRoZSBlbnRpdHkgeyR0aGlzLT5nZXROYW1lKCl9Iik7CgkJfQoJCQoJCWlmKCFhcnJheV9LRVlfZXhpc3RzKCRmaWVsZE5hbWUsJHRoaXMtPnZhbHVlcykpewoJCQlyZXR1cm4gbnVsbDsKCQl9CgkJCgkJcmV0dXJuICR0aGlzLT52YWx1ZXNbJGZpZWxkTmFtZV07Cgl9CgkKICAgLyoqCiAgICAqIFNldCBhIHZhbHVlIHRvIGEgRmllbGQKICAgICogICAgIAogICAgKiBAcGFyYW0gc3RyaW5nIFRoZSBuYW1lIG9mIHRoZSBGaWVsZAogICAgKiBAcGFyYW0gbWl4ZWQgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgRmllbGQKICAgICogCiAgICAqIEBleGNlcHRpb24gT3JtSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIG5vIEZpZWxkIGV4aXN0cyBmb3IgdGhlIG5hbWUKICAgICovCglwdWJsaWMgZnVuY3Rpb24gc2V0KCRmaWVsZE5hbWUsJHZhbHVlKSB7CgkJCgkJaWYoZW1wdHkoJGZpZWxkTmFtZSkpewoJCQl0aHJvdyBuZXcgT3JtSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgZnVuY3Rpb24gc2V0KFwkZmllbGROYW1lKSBkb2Vzbid0IGFjY2VwdCBhIG51bGwgcGFyYW1ldGVyIChlbnRpdHkgOiB7JHRoaXMtPmdldE5hbWUoKX0pIik7CgkJfQoJCWlmKCFhcnJheV9LRVlfZXhpc3RzKCRmaWVsZE5hbWUsJHRoaXMtPmZpZWxkcykgJiYgIWFycmF5X0tFWV9leGlzdHMoJGZpZWxkTmFtZSwkdGhpcy0+YWxpYXMpKXsKCQkJdGhyb3cgbmV3IE9ybUlsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiRnVuY3Rpb24gc2V0KFwkZmllbGROYW1lKSA6IFRoZSBmaWVsZCB7JGZpZWxkTmFtZX0gZG9lc24ndCBleGlzdCBpbnRvIHRoZSBlbnRpdHkgeyR0aGlzLT5nZXROYW1lKCl9Iik7CgkJfQoJCQoJCSR0aGlzLT52YWx1ZXNbJGZpZWxkTmFtZV0gPSAkdmFsdWU7Cgl9CgkKICAgIC8qKgogICAgKiBSZXR1cm4gdGhlIHZhbHVlcyBmb3IgYWxsIHRoZSBGaWVsZHMgaW50byBhbiBhc3NvY2lhdGl2ZSBhcnJheSB3aXRoIAogICAgKiAgKiBrZXkgPSBuYW1lIG9mIHRoZSBGaWVsZCwgYW5kIAogICAgKiAgKiB2YWx1ZSA9IGl0cyB2YWx1ZQogICAgKiAKICAgICogQHJldHVybiBhcnJheSBhbiBhc3NvY2lhdGl2ZSBhcnJheQogICAgKiAKICAgICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0VmFsdWVzKCkgewoJCXJldHVybiAkdGhpcy0+dmFsdWVzOwoJfQoJCQoJLyoqCgkgKiBTaG9ydGN1dCB0byBzYXZlIHRoZSBlbnRpdHkuIGlmIHRoZSBwcmltYXJ5S2V5IGlzIHNldHRlZCwgaXQgd2lsbCBiZSBhbiB1cGRhdGUgb3BlcmF0aW9uLCBlbHNlIGFuIGluc2VydC4KCSAqCgkgKiBAcmV0dXJuIHRoZSBlbnRpdHkgc2F2ZWQgd2l0aCBpdHMgbmV3IG5ldyBJZCAoY3VzdG9tZXJfaWQgaW4gbXkgZXhhbXBsZSkgaWYgaXQncyBhbiBpbnNlcnRpb24KCSAqKi8KCXB1YmxpYyBmdW5jdGlvbiBzYXZlKCl7CgkJaWYoJHRoaXMtPnBrID09IG51bGwpIHsKCQkJdGhyb3cgbmV3IE9ybUlsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigieW91IGNhbid0IHNhdmUgdGhlIGVudGl0eSAiLiR0aGlzLT5nZXROYW1lKCkuIiBiZWNhdXNlIGl0IGRvZXNuJ3QgaGF2ZSBhbnkgUHJpbWFyeS1LZXkiKTsKCQl9CiAgICAgICAgCiAgICAgICAgJGFzUGtGaWxsZWQgPSB0cnVlOwogICAgICAgICR2YWx1ZXMgPSAkdGhpcy0+Z2V0VmFsdWVzKCk7CgkgICAgZm9yZWFjaCgkdGhpcy0+cGsgYXMgJHBrKXsKICAgICAgICAgICAgaWYoIWlzc2V0KCR2YWx1ZXNbJHBrXSkgfHwgJHZhbHVlc1skcGtdID09PSAiIil7CiAgICAgICAgICAgICAgICAkYXNQa0ZpbGxlZCA9IGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgfQoKCQlpZighJGFzUGtGaWxsZWQpIHsKCQkJcmV0dXJuIE9ybUNvcmU6Omluc2VydEVudGl0eSgkdGhpcyk7CgkJfSBlbHNlIHsKCQkJLy9UcnkgdG8gZmluZCBpZiBpdCdzIGFuIHVwZGF0ZSBvciBpbnNlcnQgd2l0aCBhbHJlYWR5IGFuIElkCiAgICAgICAgICAgICRvcm1FeGFtcGxlID0gbmV3IE9ybUV4YW1wbGUoKTsKICAgICAgICAgICAgZm9yZWFjaCgkdGhpcy0+cGsgYXMgJHBrKXsKICAgICAgICAgICAgICAgICRvcm1FeGFtcGxlLT5hZGRDcml0ZXJpYSgkcGssIE9ybVR5cGVDcml0ZXJpYTo6JEVRLCBhcnJheSgkdGhpcy0+Z2V0KCRwaykpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkbGF6eW1vZGUgPSB0cnVlOwogICAgICAgICAgICAkZW50aXR5ID0gT3JtQ29yZTo6ZmluZEJ5RXhhbXBsZSgkdGhpcywgJG9ybUV4YW1wbGUsIG51bGwsIG51bGwsICdBTkQnLCAkbGF6eW1vZGUpOwoJCQlpZihlbXB0eSgkZW50aXR5KSkgewoJCQkJcmV0dXJuIE9ybUNvcmU6Omluc2VydEVudGl0eSgkdGhpcyk7CgkJCX0KCQkJCgkJCXJldHVybiBPcm1Db3JlOjp1cGRhdGVFbnRpdHkoJHRoaXMpOwoJCX0KCX0KCQoJLyoqCgkgKiBTaG9ydGN1dCB0byBkZWxldGUgdGhlIGVudGl0eQoJICoqLwoJcHVibGljIGZ1bmN0aW9uIGRlbGV0ZSgpewoJCWlmKCR0aGlzLT5wayA9PSBudWxsKSB7CgkJCXRocm93IG5ldyBPcm1JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInlvdSBjYW4ndCBkZWxldGUgdGhlIGVudGl0eSAiLiR0aGlzLT5nZXROYW1lKCkuIiBiZWNhdXNlIGl0IGRvZXNuJ3QgaGF2ZSBhbnkgUHJpbWFyeS1LZXkiKTsKCQl9CgkJCiAgICAgICAgJGFzUGtGaWxsZWQgPSB0cnVlOwoJICAgIGZvcmVhY2goJHRoaXMtPnBrIGFzICRwayl7CiAgICAgICAgICAgIGlmKCR0aGlzLT5nZXQoJHBrKSA9PSBudWxsKXsKICAgICAgICAgICAgICAgICRhc1BrRmlsbGVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAKCQlpZighJGFzUGtGaWxsZWQpIHsKCQkJdGhyb3cgbmV3IE9ybUlsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigieW91IGNhbid0IGRlbGV0ZSB0aGUgZW50aXR5ICIuJHRoaXMtPmdldE5hbWUoKS4iIGJlY2F1c2UgYXQgbGFzdCBvbmUgb2YgaXRzIFByaW1hcnktS2V5IGRvZXNuJ3QgaGF2ZSBhbnkgdmFsdWUiKTsKCQl9CgkJCiAgICAgICAgJG9ybUV4YW1wbGUgPSBuZXcgT3JtRXhhbXBsZSgpOwogICAgICAgIGZvcmVhY2goJHRoaXMtPnBrIGFzICRwayl7CiAgICAgICAgICAgICRvcm1FeGFtcGxlLT5hZGRDcml0ZXJpYSgkcGssIE9ybVR5cGVDcml0ZXJpYTo6JEVRLCBhcnJheSgkdGhpcy0+Z2V0KCRwaykpKTsKICAgICAgICB9CiAgICAgICAgJGVudGl0eSA9IE9ybUNvcmU6OmRlbGV0ZUJ5RXhhbXBsZSgkdGhpcywgJG9ybUV4YW1wbGUpOwoJfQoJCiAgICAvKioKICAgICogQ2FuIGJlIG92ZXJyaWRkZW4gTGV0IHlvdSBtb2RpZnkgc29tZSBkYXRhIGp1c3QgYmVmb3JlIHNhdmluZyB0aGUgZGF0YSBpbnRvIHRoZSBkYXRhdGFibGUuCiAgICAqIAogICAgKiBAcGFyYW0gYXJyYXkgYWxsIHRoZSB2YWx1ZXMgdG8gcHJvY2VzcwogICAgKiBAcGFyYW0gYXJyYXkgbW9yZSBwYXJhbWV0ZXJzIGlmIHlvdSBuZWVkLCBpZiB5b3Ugd2FudAogICAgKiAKICAgICogQHJldHVybiBtaXhlZCB0byBkZWZpbmUKICAgICovCglwdWJsaWMgZnVuY3Rpb24gcHJvY2Vzc1ZhbHVlRm9yU2F2ZSgkcm93cywgJGFyZ3MgPSBudWxsKXsKCQoJCXJldHVybiAkcm93czsKCX0KCQoJLyoqCgkgKiBDYWxsIHRoZSBjb21wYXJlVG8gZnVuY3Rpb24gaW50byB5b3VyIEVudGl0eSB0byBzb3J0IHRoZSBFbnRpdGllcy4KCSAqIFRvIGFjdGl2YXRlIHRoaXMgZnVuY3Rpb25hbGl0eSwgVGhlIEVudGl0eSBtdXN0IGltcGxlbWVudCBJU29ydGFibGUgSW50ZXJmYWNlLgoJICoKCSAqIEV4YW1wbGUgb2YgZnVuY3Rpb24gY29tcGFyZVRvKCkgaW4gYSBDdXN0b21lciBFbnRpdHkKCSAqICA8Y29kZT4KCSAqICAgICAgIAoJICoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjb21wYXJlVG8oT3JtRW50aXR5ICRlbnRpdHkxLCBPcm1FbnRpdHkgJGVudGl0eTIpCgkgKgl7CgkgKgkJJGNvbXBhcmUgPSBzdHJjbXAoJGVudGl0eTEtPmdldCgnbmFtZScpLCAkZW50aXR5Mi0+Z2V0KCduYW1lJykpOwoJICogICAgICAJcmV0dXJuICRjb21wYXJlOwoJICoJfQoJICogCgkgKiAgPC9jb2RlPgoJICoKCSAqIEBwYXJhbSBhcnJheTxPcm1FbnRpdHk+IHRoZSBsaXN0IG9mIEVudGl0eSB0byBzb3J0CgkgKgoJICogQHJldHVybiBhcnJheTxPcm1FbnRpdHk+IHRoZSBsaXN0IG9mIEVudGl0eSBncmFjZWZ1bGx5IHNvcnRlZAoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHNvcnQoYXJyYXkgJGFycmF5KSB7CgoJCXVzb3J0KCRhcnJheSwgYXJyYXkoZ2V0X2NhbGxlZF9jbGFzcygpLCAiY29tcGFyZVRvIikpOwoJCgkJcmV0dXJuICRhcnJheTsKCX0KCQoJLyoqCgkgKiBNYXkgYmUgb3ZlcnJpZGUgaW4geW91ciBFbnRpdHkncyBkZWZpbml0aW9uIHRvIGFsbG93IFNlYXJjaCBtb2R1bGUgaW5kZXhpbmcgeW91ciBlbnRpdGllcydzIGRhdGEKCSAqIAoJICogRXhhbXBsZSBvZiBmdW5jdGlvbiBpc0luZGV4YWJsZSgpIGluIGEgQ3VzdG9tZXIgRW50aXR5CgkgKiAgCgkgKiAgPGNvZGU+CgkgKiAgICAgICAKCSAqCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaXNJbmRleGFibGUoKQoJICoJewoJICoJCXJldHVybiB0aGlzLT5nZXRbJ2lzQWN0aXZhdGVkJ107CgkgKgl9CgkgKiAKCSAqICA8L2NvZGU+CgkgKiovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGlzSW5kZXhhYmxlKCl7CgkJcmV0dXJuIGZhbHNlOwoJfQoKCS8qKgogICAgKiBnZXR0ZXIgZm9yIGF1dG9pbmNyZW1lbnQKICAgICogCiAgICAqIEByZXR1cm4gdHJ1ZSBvZiB0aGUgRmllbGQgaXMgYXV0b2luY3JlbWVudAogICAgKi8KCXB1YmxpYyBmdW5jdGlvbiBJc0F1dG9pbmNyZW1lbnQoKSB7CgkJcmV0dXJuICR0aGlzLT5hdXRvaW5jcmVtZW50OwoJfQoJCgkvKioKCSAqIFRoaXMgZnVuY3Rpb24gd2lsbCBsZXQgeW91IGRlZmluZSBzb21lIG9wdGlvbmFsIGNvbmZpZ3VyYXRpb24gZm9yIHlvdXIgRW50aXR5CgkgKiAgICA9PiB0aGUgZmllbGQgbXVzdCBiZSBhdXRvLWluY3JlbWVudGFsCiAgICAgKgogICAgICogQHJldHVybiBPcm1FbnRpdHkgdGhlIGN1cnJlbnQgaW5zdGFuY2UKICAgICAqCgkgKiovCglwdWJsaWMgZnVuY3Rpb24gZ2FybmlzaEF1dG9pbmNyZW1lbnQoKXsKCQkKICAgICAgICAkYXNQa0ludGVnZXIgPSBmYWxzZTsKCSAgICBmb3JlYWNoKCR0aGlzLT5wayBhcyAkcGspewogICAgICAgICAgICAkZmllbGQgPSAkdGhpcy0+Z2V0RmllbGRCeU5hbWUoJHBrKTsKICAgICAgICAgICAgaWYoJGZpZWxkLT5nZXRUeXBlKCkgPT0gT3JtQ0FTVDo6JElOVEVHRVIpewogICAgICAgICAgICAgICAgJGFzUGtJbnRlZ2VyID0gdHJ1ZTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIAoJCWlmKCEkYXNQa0ludGVnZXIpewoJCQl0aHJvdyBuZXcgT3JtSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJlbnRpdHkgIi4kdGhpcy0+Z2V0TmFtZSgpLiIgZG9uJ3QgaGF2ZSBhbnkgSU5URUdFUiBQSyBhbmQgc28gY2FuJ3QgYmUgZGVmaW5lZCBhdXRvaW5jcmVtZW50Iik7CgkJfQogICAgICAgIAoJCSR0aGlzLT5hdXRvaW5jcmVtZW50ID0gdHJ1ZTsKCQkKCQkvL1JlbW92ZSBhbnkgc2VxIHRoYXQgY291bGQgYmUgYWRkIGJlZm9yZQogICAgICAgICR0aGlzLT5zZXFuYW1lID0gbnVsbDsKCiAgICAgICAgcmV0dXJuICR0aGlzOwoJfQoJCgkvKioKCSAqIFJldHVybiAKCSAqIEByZXR1cm4gYXJyYXkgOiB0aGUgbGlzdCBvZiBjb3VwbGUgb2YgdW5pcXVlIGluZGV4CgkgKiovCglwdWJsaWMgZnVuY3Rpb24gZ2V0SW5kZXhlcygpIHsKCQlyZXR1cm4gJHRoaXMtPmluZGV4ZXM7Cgl9CgkKCS8qKgoJICogVGhpcyBmdW5jdGlvbiB3aWxsIGxldCB5b3UgZGVmaW5lIHNvbWUgb3B0aW9uYWwgY29uZmlndXJhdGlvbiBmb3IgeW91ciBFbnRpdHkKCSAqICAgID0+IHRoZSBmaWVsZCBoYXZlIG9uZSBvciBtYW55IChVbmlxdWU/KSBJbmRleGUgb24gb25lIG9yIG1hbnkgY29sdW1ucy4KCSAqCgkgKiAgZXhhbXBsZSA6IAoJICogIDxjb2RlPgoJICogICAgIG15RW50aXR5LT5hZGRJbmRleGVzKCdmaWVsZDEnLHRydWUpOwoJICogICAgIG15RW50aXR5LT5hZGRJbmRleGVzKGFycmF5KCdmaWVsZDInLCAnZmllbGQzJykpOwoJICogIDxjb2RlPgoJICogIHdpbGwgY3JlYXRlIDEgdW5pcXVlIGluZGV4IG9uIGZpZWxkMSBhbmQgMSBpbmRleCBvbiBmaWVsZDIsZmllbGQzCgkgKgoJICogQHBhcmFtIG1peGVkIE9uZSAoc3RyaW5nKSBvciBtYW55IChhcnJheSkgbmFtZSBvZiBmaWVsZCB0byBiZSBpbmRleGluZwoJICogQHBhcmFtIGJvb2xlYW4gaWYgdGhlIGluZGV4IG11c3QgYmUgVU5JUVVFIChkZWZhdWx0ID0gZmFsc2UpIAoJICoKICAgICAqIEByZXR1cm4gT3JtRW50aXR5IHRoZSBjdXJyZW50IGluc3RhbmNlCgkgKgoJICoqLwoJcHVibGljIGZ1bmN0aW9uIGFkZEluZGV4ZXMoJGZpZWxkTmFtZXMsICRpc1VuaXF1ZT1mYWxzZSl7CgkJCgkJaWYoIWlzX2FycmF5KCRmaWVsZE5hbWVzKSl7CgkJCSRmaWVsZE5hbWVzID0gYXJyYXkoJGZpZWxkTmFtZXMpOwoJCX0KCQkKCQkvL1Rlc3QgdGhlIGV4aXN0ZW5jZSBvZiBlYWNoIG1lbWJlcgoJCWZvcmVhY2goJGZpZWxkTmFtZXMgYXMgJGZpZWxkTmFtZSl7CgkJCWlmKCEkdGhpcy0+aXNGaWVsZEJ5TmFtZUV4aXN0cygkZmllbGROYW1lKSl7CgkJCQl0aHJvdyBuZXcgT3JtSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJhZGRJbmRleGVzKFwkZmllbGROYW1lcywgXCRpc1VuaXF1ZT1mYWxzZSkgOiB7JGZpZWxkTmFtZXN9IGlzIG5vdCBhIGV4aXN0aW5nIEZpZWxkIG9mIHRoZSBFbnRpdHkgeyR0aGlzLT5nZXROYW1lKCl9Iik7CgkJCX0KCQl9CgkKCQkkdGhpcy0+aW5kZXhlc1tdID0gYXJyYXkoJ2ZpZWxkcycgPT4gJGZpZWxkTmFtZXMsICd1bmlxdWUnID0+ICRpc1VuaXF1ZSk7CgoJCXJldHVybiAkdGhpczsKCX0KCQoJLyoqCgkgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgbGV0IHlvdSBkZWZpbmUgc29tZSBvcHRpb25hbCBjb25maWd1cmF0aW9uIGZvciB5b3VyIEVudGl0eQoJICogICAgPT4gdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIGZpZWxkIGlzIC4uLgoJICoKCSAqICBleCA6IG15RW50aXR5LT5nYXJuaXNoRGVmYXVsdFZhbHVlKCdmaWVsZDEnLCAnc29tZSB0ZXh0JykKCSAqCgkgKiBAcGFyYW0gU3RyaW5nIHRoZSBuYW1lIG9mIHRoZSBGaWVsZAoJICogQHBhcmFtIE1peGVkIHRoZSBkZWZhdWx0IHZhbHVlLgoJICoKICAgICAqIEByZXR1cm4gT3JtRW50aXR5IHRoZSBjdXJyZW50IGluc3RhbmNlCgkgKgoJICoqLwoJcHVibGljIGZ1bmN0aW9uIGdhcm5pc2hEZWZhdWx0VmFsdWUoJGZpZWxkTmFtZSwkZGVmYXVsdFZhbHVlKXsKCQlpZighJHRoaXMtPmlzRmllbGRCeU5hbWVFeGlzdHMoJGZpZWxkTmFtZSkpewoJCQl0aHJvdyBuZXcgT3JtSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJnYXJuaXNoRGVmYXVsdCgpIG9ubHkgYWNjZXB0IHZhbGlkIEZpZWxkIGJ1dCAiLiRmaWVsZE5hbWUuIiBpcyBub3QgYSBleGlzdGluZyBGaWVsZCBpbiB0aGUgRW50aXR5ICIuJHRoaXMtPmdldE5hbWUoKSk7CgkJfQoJCQoJCS8vZm9yYmlkIGEgZGVmYXVsdCB2YWx1ZSBvbiBhIG51bGxhYmxlIGZpZWxkIEJlY2F1c2UgaXQncyBtYWtlIG5vIHNlbnNlCgkJaWYoJHRoaXMtPmdldEZpZWxkQnlOYW1lKCRmaWVsZE5hbWUpLT5pc051bGxhYmxlKCkpewoJCQl0aHJvdyBuZXcgT3JtSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ0aGUgRmllbGQgIi4kZmllbGROYW1lLiIgaW4gdGhlIEVudGl0eSAiLiR0aGlzLT5nZXROYW1lKCkuIiBjYW4ndCBhY2NlcHQgYSBkZWZhdWx0IHZhbHVlIGJlY2F1c2UgaXQncyBzZXR0ZWQgTnVsbGFibGUiKTsKCQl9CgkJCgkJJHRoaXMtPmdldEZpZWxkQnlOYW1lKCRmaWVsZE5hbWUpLT5zZXREZWZhdWx0VmFsdWUoJGRlZmF1bHRWYWx1ZSk7CgoJCXJldHVybiAkdGhpczsKCQkKCX0KCQoJLyoqCgkgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgbGV0IHlvdSBkZWZpbmUgc29tZSBvcHRpb25hbCBjb25maWd1cmF0aW9uIGZvciB5b3VyIEVudGl0eQoJICogICAgPT4gdGhlIGRlZmF1bHQgc29ydCBvcmRlciBpcyAuLi4KCSAqCgkgKiAgZXggOiBteUVudGl0eS0+Z2FybmlzaERlZmF1bHRPcmRlckJ5KG5ldyBPcm1PcmRlckJ5KCktPmFkZEFzYygnZmllbGQxJyktPmFkZERlc2MoJ2ZpZWxkMicpKQoJICoKCSAqIEBwYXJhbSBPcm1vcmRlckJ5IHRoZSBkZWZhdWx0IHNvcnQgb3JkZXIuCgkgKgogICAgICogQHJldHVybiBPcm1FbnRpdHkgdGhlIGN1cnJlbnQgaW5zdGFuY2UKCSAqCgkgKiovCglwdWJsaWMgZnVuY3Rpb24gZ2FybmlzaERlZmF1bHRPcmRlckJ5KE9ybU9yZGVyQnkgJGRlZmF1bHRPcmRlckJ5KXsKCQlmb3JlYWNoKCRkZWZhdWx0T3JkZXJCeSBhcyAkZmllbGROYW1lID0+ICR2YWx1ZSkgewoJCQlpZighJHRoaXMtPmlzRmllbGRCeU5hbWVFeGlzdHMoJGZpZWxkTmFtZSkpewoJCQkJdGhyb3cgbmV3IE9ybUlsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZ2FybmlzaERlZmF1bHRPcmRlckJ5KCkgb25seSBhY2NlcHQgdmFsaWQgRmllbGQgYnV0ICIuJGZpZWxkTmFtZS4iIGlzIG5vdCBhIGV4aXN0aW5nIEZpZWxkIGluIHRoZSBFbnRpdHkgIi4kdGhpcy0+Z2V0TmFtZSgpKTsKCQkJfQoJCX0KCQkkdGhpcy0+ZGVmYXVsdE9yZGVyQnkgPSAkZGVmYXVsdE9yZGVyQnk7CgoJCXJldHVybiAkdGhpczsKCX0KCQoJLyoqCgkgKiBSZXR1cm4gdGhlIGRlZmF1bHQgb3JkZXJCeSBvYmplY3QgZm9yIHRoZSBlbnRpdHkKCSAqIEByZXR1cm4gT3JtT3JkZXJCeSA6IGRlZmF1bHQgT3JtT3JkZXJCeQoJICoqLwoJcHVibGljIGZ1bmN0aW9uIGdldERlZmF1bHRPcmRlckJ5KCkgewoJCXJldHVybiAkdGhpcy0+ZGVmYXVsdE9yZGVyQnk7Cgl9CgoJLyoqCgkgKiBBZGQgYSBhbGlhcywgdmVyeSB1c2VmdWwgZm9yIGVudGl0eSB3aXRoIDIrIEZLIHBvaW50aW5nIG9uIHRoZSBzYW1lIGVudGl0eSB3aXRoIGEgY29tcG9zaXRlIHByaW1hcnkga2V5CgkgKgoJICogQHBhcmFtIHN0cmluZyA6IHRoZSBuYW1lIG9mIHRoZSBhbGlhcwoJICogQHBhcmFtIGFycmF5IDogdGhlIGxpc3RlIG9mIGZpZWxkbmFtZSBmb3IgdGhlIHNob3J0Y3V0CgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBhZGRBbGlhcygkYWxpYXNOYW1lLCBhcnJheSAkcG9pbnRlcnMpewoJCSR0aGlzLT5hbGlhc1skYWxpYXNOYW1lXSA9ICRwb2ludGVyczsKCX0KCgkvKioKCSAqIGdldHRlciBmb3IgZmllbGQgYWxpYXMKCSAqCgkgKiBAcmV0dXJuIGFycmF5IAoJICoqLwoJcHVibGljIGZ1bmN0aW9uIGdldEFsaWFzKCl7CgkJcmV0dXJuICR0aGlzLT5hbGlhczsKCX0KCQoJCn0KCj8+Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/class.OrmEntityAssociation.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIENvbnRhaW5zIE9ybUVudGl0eUFzc29jaWF0aW9uIENsYXNzIHdoaWNoIGV4dGVuZHMgT3JtRW50aXR5IGNsYXNzCiAqCiAqIEBzaW5jZSAwLjAuMQogKiBAYXV0aG9yIEJlc3MKICogQHBhY2thZ2UgT3JtCiAqKi8KIAovKioKICogQWJzdHJhY3QgQ2xhc3Mgd2hpY2ggZGVzY3JpYmVzIHRoZSBwcm9wZXJ0aWVzIGZvciBhbiBBc3NvY2lhdGl2ZSBFbnRpdHkKICogICAgCiAqCiAqIEBzaW5jZSAwLjAuMQogKiBAYXV0aG9yIEJlc3MKICogQHBhY2thZ2UgT3JtCiAqKi8KYWJzdHJhY3QgY2xhc3MgT3JtRW50aXR5QXNzb2NpYXRpb24gZXh0ZW5kcyBPcm1FbnRpdHkgCnsKCXByaXZhdGUgJG5iRmllbGQgPSAwOwoKICAgIC8qKgogICAgICogY29uc3RydWN0b3IgcHJvdGVjdGVkIHRvIGF2b2lkIGEgZGlyZWN0IGluc3RhbmNpYXRpb24gbGlrZSAibmV3IE9ybUVudGl0eUFzc29jaWF0aW9uKCkiCiAgICAgKiBFYWNoIHRpbWUgYSBlbnRpdHkgaXMgY29uc3RydWN0ZWQsIHdlIHBsYWNlIGEgY29weSBpbnRvIHRoZSBhdXRvbG9hZGVyLgogICAgICogCiAgICAgKiBAcGFyYW0gc3RyaW5nIFRoZSBuYW1lIG9mIHRoZSBtb2R1bGUgd2hvIGNhbGxpbmcgdGhpcyBtZXRob2QgKHNvIG5vdCAiT3JtIikKICAgICAqIEBwYXJhbSBzdHJpbmcgVGhlIG5hbWUgb2YgdGhlIGVudGl0eQogICAgICogQHBhcmFtIHN0cmluZyBbb3B0aW9uYWxdIFByZWZpeCB0byB1c2UgaW50byBkYXRhYmFzZSBmb3IgdGFibGUuIElmIG5vdCBzZXR0ZWQsIGl0IHdpbGwgdXNlIHRoZSBuYW1lIG9mIHlvdXIgbW9kdWxlCiAgICAgKiBAcGFyYW0gc3RyaW5nIFtvcHRpb25hbF0gVGhlIG5hbWUgb2YgdGFibGUgZm9yIHRoaXMgZW50aXR5LiBJZiBub3Qgc2V0dGVkLCBpdCB3aWxsIHVzZSB0aGUgbmFtZSBvZiB5b3VyIGVudGl0eQogICAgICoKICAgICAqIEByZXR1cm4gT3JtRW50aXR5QXNzb2NpYXRpb24gdGhlIGVudGl0eSBhcyBhIG5ldyBpbnN0YW5jZQogICAgICogCiAgICAgKiBAc2VlIE15QXV0b2xvYWQKICAgICAqLwoJcHJvdGVjdGVkIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRtb2R1bGVOYW1lLCAkbmFtZSwkcHJlZml4ZSA9IG51bGwsICRkYk5hbWUgPSBudWxsKQoJewoJCXBhcmVudDo6X19jb25zdHJ1Y3QoJG1vZHVsZU5hbWUsICRuYW1lLCAkcHJlZml4ZSwgJGRiTmFtZSk7Cgl9CgkKICAgIC8qKgogICAgKiBBZGQgYSBuZXcgRmllbGQKICAgICogCiAgICAqIEN1cnJlbnRseSwgdGhlIE9ybSBTeXN0ZW0gZG9lbid0IGFsbG93IG1vcmUgdGhhbiB0d28gRmllbGQgZm9yIGFuIEVudGl0eUFzc29jaWF0aW9uCiAgICAqIAogICAgKiBAcGFyYW0gT3JtRmllbGQgdGhlIEZpZWxkIHRvIGFkZC4KCSoKCSogQGV4Y2VwdGlvbiBPcm1JbGxlZ2FsQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBpZiB3ZSB0cnkgdG8gdXNlIG1vcmUgdGhhbiB0d28gRmllbGRzIGluIHRoZSBlbnRpdHkKICAgICovCglwcm90ZWN0ZWQgZnVuY3Rpb24gYWRkKE9ybUZpZWxkICRuZXdGaWVsZCkKCXsKCQkkdGhpcy0+bmJGaWVsZCArKzsKCQkKCQlpZigkdGhpcy0+bmJGaWVsZCA+IDIpCgkJCXRocm93IG5ldyBPcm1JbGxlZ2FsQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiAoIkl0J3MgaW1wb3NzaWJsZSB0byB1c2UgbW9yZSB0aGFuIHR3byBGaWVsZCBpbiB0aGUgRW50aXR5QXNzb2NpYXRpb24gIi4gJHRoaXMtPmdldE5hbWUoKSk7CgkJCQkKCQlwYXJlbnQ6OmFkZCgkbmV3RmllbGQpOwoJfQoKfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/class.OrmExample.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIENvbnRhaW5zIE9ybUV4YW1wbGUgQ2xhc3MKICoKICogQHNpbmNlIDAuMC4xCiAqIEBhdXRob3IgQmVzcwogKiBAcGFja2FnZSBPcm0KICoqLwogCiAKLyoqCiAqIFJlcHJlc2VudHMgYSBncm91cCBvZiBkaWZmZXJlbnQgT3JtQ3JpdGVyaWEgKENyaXRlcmlhcykgdG8gcHJvY2VzcyBhIHNlYXJjaCAiQnkgRXhhbXBsZSIgb24gYSBPcm1FbnRpdHkgaW4gRGF0YWJhc2UKICoKICogQHNpbmNlIDAuMC4xCiAqIEBhdXRob3IgQmVzcwogKiBAcGFja2FnZSBPcm0KICoqLwpjbGFzcyBPcm1FeGFtcGxlIHsKCglwcml2YXRlICRDcml0ZXJpYXMgPSBhcnJheSgpOwoJCiAgICAvKioKICAgICogUHVibGljIENvbnN0cnVjdG9yCiAgICAqIAogICAgKi8KCXB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgpIHsKCX0KCQogICAgCiAgICAvKioKICAgICogQWRkIGEgbmV3IENyaXRlcmlhIG9uIHRoZSBleGlzdGluZyBsaXN0CiAgICAqIAogICAgKiBAcGFyYW0gc3RyaW5nIE5hbWUgb2YgdGhlIGZpZWxkIAogICAgKiBAcGFyYW0gT3JtVHlwZUNyaXRlcmlhIFR5cGUgb2YgQ3JpdGVyaWEKICAgICogQHBhcmFtIGFycmF5IGFsbCB0aGUgcGFyYW1ldGVycyB1c2VkIGZvciB0aGUgcGFyYW1ldGVyICR0eXBlQ3JpdGVyaWEKICAgICogQHBhcmFtIGJvb2xlYW4gW09wdGlvbmFsXSBpZiB3ZSBtdXN0IGlnbm9yZSB0aGUgY2FzZSAoYXplIGVxdWFscyBBWkUpIG9yIG5vdC4gRGVmYXVsdCB2YWx1ZSBpcyAiZmFsc2UiCiAgICAqIAogICAgKiBAc2VlIE9ybVR5cGVDcml0ZXJpYQogICAgKi8KCXB1YmxpYyBmdW5jdGlvbiBhZGRDcml0ZXJpYSgkZmllbGRuYW1lLCAkdHlwZUNyaXRlcmlhLCAkcGFyYW1zQ3JpdGVyaWEsICRpZ25vcmVDYXNlID0gZmFsc2UpIHsKCQlpZighaXNfYXJyYXkoJHBhcmFtc0NyaXRlcmlhKSkgewoJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCJ0aGUgcGFyYW1ldGVyIFwkcGFyYW1zQ3JpdGVyaWEgZm9yIHRoZSBDcml0ZXJpYSBvZiB0aGUgRmllbGQgWyIuJGZpZWxkbmFtZS4iXSBtdXN0IGJlIGFuIGFycmF5Iik7CgkJfQoJCQoJCSR0aGlzLT5Dcml0ZXJpYXNbXSA9IG5ldyBPcm1Dcml0ZXJpYSgkZmllbGRuYW1lLCAkdHlwZUNyaXRlcmlhLCAkcGFyYW1zQ3JpdGVyaWEsICRpZ25vcmVDYXNlKTsKCX0KCiAgICAvKioKICAgICogUmV0dXJuIGFsbCB0aGUgQ3JpdGVyaWFzIGNvbnRhaW5lZCBpbiB0aGUgY3VycmVudCBFeGFtcGxlIE9iamVjdAogICAgKiAKICAgICogQHJldHVybiBhcnJheTxDcml0ZXJpYT4gdGhlIGxpc3Qgb2YgQ3JpdGVyaWFzIGNvbnRhaW5lZCBpbiB0aGUgY3VycmVudCBFeGFtcGxlIE9iamVjdAogICAgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRDcml0ZXJpYXMoKXsKCQlyZXR1cm4gJHRoaXMtPkNyaXRlcmlhczsKCX0KfQoKPz4K]]></data>
	</file>
	<file>
	  <filename>/lib/class.OrmField.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIENvbnRhaW5zIHRoZSBjbGFzcyBPcm1GaWVsZAogKgogKiBAc2luY2UgMC4wLjEKICogQGF1dGhvciBCZXNzCiAqIEBwYWNrYWdlIE9ybQogKiovCiAKLyoqCiAqICAgUmVwcmVzZW50IGEgT3JtRW50aXR5J3MgZmllbGQgd2l0aCBhbGwgaXRzIHByb3BlcnRpZXMKICoKICogQHNpbmNlIDAuMC4xCiAqIEBhdXRob3IgQmVzcwogKiBAcGFja2FnZSBPcm0KICoqLwpjbGFzcyBPcm1GaWVsZCAKewoJLyoqCgkgKiBUaGUgKHVuaXF1ZSkgbmFtZSBvZiB0aGUgZmllbGQKCSAqLwoJcHJpdmF0ZSAkbmFtZTsKCQoJLyoqCgkgKiBUaGUgT3JtQ0FTVCB2YWx1ZSBvZiB0aGUgZmllbGQKCSAqLwoJcHJpdmF0ZSAkdHlwZTsKCQoJLyoqCgkgKiBUaGUgbWF4IHNpemUgb2YgdGhlIGZpZWxkLiBNYXkgYmUgbnVsbCBpZiAkdHlwZSBpcyBEYXRlLCBUaW1lLCBCdWZmZXIsIE5vbmUgLi4uCgkgKi8KCXByaXZhdGUgJHNpemU7CgkKCS8qKgoJICogQm9vbGVhbiA6IHRydWUgaWYgdGhlIHZhbHVlIG1heSBiZSBOVUxMCgkgKi8KCXByaXZhdGUgJG51bGxhYmxlOwoJCgkvKioKCSAqIHRoZSBPcm1LRVkgdmFsdWUgb2YgdGhlIGZpZWxkLiBNYXkgYmUgbnVsbAoJICovCglwcml2YXRlICRLRVk7CgkKCS8qKgoJICogdGhlIG5hbWUgb2YgdGhlIGtleS4gT25seSB1c2VkIGZvciBGb3JlaWduS2V5IGFuZCBBc3NvY2lhdGVLZXkKCSAqLwoJcHJpdmF0ZSAkS0VZTmFtZTsKCQoJLyoqCgkgKiBUaGUgZGVmYXVsdCB2YWx1ZS4gTm90IHVzZWQgYnkgZGVmYXVsdC4KCSAqKi8KCXByaXZhdGUgJGRlZmF1bHRWYWx1ZTsKCQogICAgLyoqCiAgICAqIHB1YmxpYyBjb25zdHJ1Y3RvcgogICAgKiAJCiAgICAqIEBwYXJhbSBzdHJpbmcgdGhlICh1bmlxdWUpIG5hbWUgb2YgdGhlIGZpZWxkCiAgICAqIEBwYXJhbSBPcm1DQVNUIFRoZSBPcm1DQVNUIHZhbHVlIG9mIHRoZSBmaWVsZCBleGFtcGxlIDogT3JtT3JtQ0FTVDo6JElOVEVHRVIKICAgICogQHBhcmFtIGludCBUaGUgbWF4IHNpemUgb2YgdGhlIGZpZWxkLiBNYXkgYmUgbnVsbCBpZiAkdHlwZSBpcyBEYXRlLCBUaW1lLCBCdWZmZXIsIE5vbmUgLi4uCiAgICAqIEBwYXJhbSB0cnVlIGlmIHRoZSB2YWx1ZSBtYXkgYmUgTlVMTC4gRGVmYXVsdCB2YWx1ZSBpcyBmYWxzZQogICAgKiBAcGFyYW0gT3JtS0VZIHRoZSBLRVkgdmFsdWUgb2YgdGhlIGZpZWxkLiBNYXkgYmUgbnVsbCBleGFtcGxlOiBPcm1LRVk6OiRQSyBmb3IgYSBwcmltYXJ5IGtleQogICAgKiBAcGFyYW0gc3RyaW5nIHRoZSBuYW1lIG9mIHRoZSBrZXkuIE9ubHkgdXNlZCBmb3IgRm9yZWlnbktleSBhbmQgQXNzb2NpYXRlS2V5IGV4YW1wbGUgOiAiQ3VzdG9tZXIuY3VzdG9tZXJfaWQiIGluIHRoZSBmaWVsZCAiY3VzdG9tZXIiIG9mIGFuIGVudGl0eSAiT3JkZXIiLgogICAgKiAKICAgICogQHJldHVybiBPcm1GaWVsZCB0aGUgRmllbGQgT2JqZWN0CiAgICAqIAogICAgKiAKICAgICogQHNlZSBPcm1DQVNUCiAgICAqIEBzZWUgT3JtS0VZCgkqIEBzZWUgT3JtRW50aXR5CiAgICAqIAogICAgKi8KCXB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkZmllbGRuYW1lLCAkY2FzdCwgJHNpemUgPSBudWxsLCAkbnVsbGFibGUgPSBmYWxzZSwgJEtFWSA9IG51bGwsICRLRVlOYW1lPW51bGwpIHsKCQkKCQkkZXJyb3JzID0gYXJyYXkoKTsKCgkJaWYoZW1wdHkoJEtFWSkgJiYgIWVtcHR5KCRLRVlOYW1lKSkgewoJCQkkZXJyb3JzW10gPSAnSW1wb3NzaWJsZSB0byBzcGVjaWZ5IGEga2V5TmFtZSBwYXJhbWV0ZXIgZm9yIHRoZSBmaWVsZCAnLiRmaWVsZG5hbWUuJyBpZiB0aGUga2V5IGlzIG5vdCAkRksgb3IgJEFLJzsKCQl9CgkJaWYoJEtFWSA9PSBPcm1LRVk6OiRQSyAmJiAhZW1wdHkoJEtFWU5hbWUpKSB7CgkJCSRlcnJvcnNbXSA9ICdJbXBvc3NpYmxlIHRvIHNwZWNpZnkgYSBrZXlOYW1lIHBhcmFtZXRlciBmb3IgdGhlIGZpZWxkICcuJGZpZWxkbmFtZS4nIGlmIHRoZSBrZXkgaXMgbm90ICRGSyBvciAkQUsnOwoJCX0KCQlpZigoJEtFWSA9PSBPcm1LRVk6OiRGSyB8fCAkS0VZID09IE9ybUtFWTo6JEFLKSAmJiBlbXB0eSgkS0VZTmFtZSkpIHsKCQkJJGVycm9yc1tdID0gJyRGSyBrZXkgb3IgJEFLIGtleSBmb3IgdGhlIGZpZWxkICcuJGZpZWxkbmFtZS4nIG5lZWQgYSBrZXlOYW1lJzsKCQl9CgoJCWlmKCgkY2FzdCA9PSBPcm1DQVNUOjokSU5IRVJJVCkgJiYgISgkS0VZID09IE9ybUtFWTo6JEZLIHx8ICRLRVkgPT0gT3JtS0VZOjokQUspKSB7CgkJCSRlcnJvcnNbXSA9ICckSU5IRVJJVCBjYXN0IGlzIG9ubHkgbWFkZSBmb3IgYSAkRksga2V5IG9yIGEgJEFLIGtleSAoZmllbGQgJy4kZmllbGRuYW1lLicpJzsKCQl9CgkJCgkJaWYoKCRjYXN0ID09IE9ybUNBU1Q6OiREQVRFIHx8ICRjYXN0ID09IE9ybUNBU1Q6OiRCVUZGRVIgfHwgJGNhc3QgPT0gT3JtQ0FTVDo6JFRJTUUKCQkJCXx8ICRjYXN0ID09IE9ybUNBU1Q6OiREQVRFVElNRSB8fCAkY2FzdCA9PSBPcm1DQVNUOjokVFMgfHwgJGNhc3QgPT0gT3JtQ0FTVDo6JFVVSUQgCgkJCQl8fCAkY2FzdCA9PSBPcm1DQVNUOjokSU5IRVJJVCB8fCAkY2FzdCA9PSBPcm1DQVNUOjokTk9ORSkgJiYgIWVtcHR5KCRzaXplKSkgewoJCQkkZXJyb3JzW10gPSAnVGhlIGZpZWxkICcuJGZpZWxkbmFtZS4nIG11c3Qgbm90IGhhdmUgc2l6ZSB2YWx1ZSBiZWNhdXNlIG9mIGl0cyBvd24gT3JtQ0FTVCc7CgkJfQoJCWlmKCgkY2FzdCA9PSBPcm1DQVNUOjokU1RSSU5HKSAmJiBlbXB0eSgkc2l6ZSkpIHsKCQkJJGVycm9yc1tdID0gJ1RoZSBmaWVsZCAnLiRmaWVsZG5hbWUuJyBtdXN0IGhhdmUgc2l6ZSB2YWx1ZSBiZWNhdXNlIG9mIGl0cyBvd24gT3JtQ0FTVCc7CgkJfQoJCQoJCWlmKCFlbXB0eSgkZXJyb3JzKSl7CgkJCXRocm93IG5ldyBPcm1JbGxlZ2FsQ29uZmlndXJhdGlvbkV4Y2VwdGlvbigkZXJyb3JzKTsKCQl9CgoJCWlmKCRudWxsYWJsZSA9PSBudWxsKSB7CgkJCSRudWxsYWJsZSA9IGZhbHNlOwoJCX0KCgkJLy9UT0RPIDogZml4IGZ1dHVyIElOSEVSSVQgZm9uY3Rpb24KCQkvKgoJCWlmKE9ybUNBU1Q6OiRJTkhFUklUID09ICRjYXN0KSB7CgkJCS8vTXVzdCB0YWtlIHRoZSBkaXN0YW50IHR5cGUKCQkJbGlzdCgkZW50aXR5QXNzb2NOYW1lLCAkZmllbGRBc3NvY2lhdGVOYW1lKSA9IGV4cGxvZGUoIi4iLCAkS0VZTmFtZSk7CgkJCSRjYXN0ID0gKG5ldyAkZW50aXR5QXNzb2NOYW1lKCkpLT5nZXRGaWVsZEJ5TmFtZSgkZmllbGRBc3NvY2lhdGVOYW1lKS0+Z2V0VHlwZSgpOwoJCQkkc2l6ZSA9IChuZXcgJGVudGl0eUFzc29jTmFtZSgpKS0+Z2V0RmllbGRCeU5hbWUoJGZpZWxkQXNzb2NpYXRlTmFtZSktPmdldFNpemUoKTsKCQl9Ki8KCQkJCgkJJHRoaXMtPm5hbWUgCT0gJGZpZWxkbmFtZTsKCQkkdGhpcy0+dHlwZSAJPSAkY2FzdDsKCQkkdGhpcy0+c2l6ZSAJPSAkc2l6ZTsKCQkkdGhpcy0+bnVsbGFibGUgPSAkbnVsbGFibGU7CgkJJHRoaXMtPktFWSAJCT0gJEtFWTsKCQkkdGhpcy0+S0VZTmFtZSAJPSAkS0VZTmFtZTsKCX0KCQoKICAgIC8qKgogICAgKiBnZXR0ZXIgZm9yIG5hbWUKICAgICogCiAgICAqIEByZXR1cm4gc3RyaW5nIHRoZSAodW5pcXVlKSBuYW1lIG9mIEZpZWxkCiAgICAqLwoJcHVibGljIGZ1bmN0aW9uIGdldE5hbWUoKQoJe3JldHVybiAkdGhpcy0+bmFtZTt9CgogICAgLyoqCiAgICAqIGdldHRlciBmb3IgdHlwZQogICAgKiAKICAgICogQHJldHVybiBzdHJpbmcgdGhlIENBU1QgdmFsdWUgb2YgRmllbGQKICAgICogCiAgICAqIEBzZWUgT3JtQ0FTVAogICAgKiAKICAgICovCQoJcHVibGljIGZ1bmN0aW9uIGdldFR5cGUoKQoJe3JldHVybiAkdGhpcy0+dHlwZTt9CgkKICAgLyoqCiAgICAqIGdldHRlciBmb3Igc2l6ZQogICAgKiAKICAgICogQHJldHVybiBpbnQgdGhlIHNpemUgb2YgRmllbGQKICAgICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0U2l6ZSgpCgl7cmV0dXJuICR0aGlzLT5zaXplO30KCiAgIC8qKgogICAgKiByZXR1cm4gdHJ1ZSBpZiBGaWVsZCBoYXMgYSAkUEsKICAgICogCiAgICAqIEByZXR1cm4gYm9vbGVhbiB0cnVlIGlmIEZpZWxkIGhhcyBhICRQSwogICAgKi8JCglwdWJsaWMgZnVuY3Rpb24gaXNQcmltYXJ5S0VZKCkKCXtyZXR1cm4gJHRoaXMtPktFWSA9PSBPcm1LRVk6OiRQSzt9CgogICAvKioKICAgICogcmV0dXJuIHRydWUgaWYgRmllbGQgaGFzIGEgJEZLCiAgICAqIAogICAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBpZiBGaWVsZCBoYXMgYSAkRksKICAgICovICAgIAkKCXB1YmxpYyBmdW5jdGlvbiBpc0ZvcmVpZ25LRVkoKQoJe3JldHVybiAkdGhpcy0+S0VZID09IE9ybUtFWTo6JEZLO30KCiAgIC8qKgogICAgKiByZXR1cm4gdHJ1ZSBpZiBGaWVsZCBoYXMgYSAkQUsKICAgICogCiAgICAqIEByZXR1cm4gYm9vbGVhbiB0cnVlIGlmIEZpZWxkIGhhcyBhICRBSwogICAgKi8gICAgCQoJcHVibGljIGZ1bmN0aW9uIGlzQXNzb2NpYXRlS0VZKCkKCXtyZXR1cm4gJHRoaXMtPktFWSA9PSBPcm1LRVk6OiRBSzt9CgkKICAgIC8qKgogICAgKiBnZXR0ZXIgZm9yIGtleU5hbWUKICAgICogCiAgICAqIEByZXR1cm4gc3RyaW5nIHRoZSBrZXlOYW1lIG9mIEZpZWxkCiAgICAqIAogICAgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRLRVlOYW1lKCkKCXtyZXR1cm4gJHRoaXMtPktFWU5hbWU7fQoJCiAgICAvKioKICAgICogZ2V0dGVyIGZvciBudWxsYWJsZSAKICAgICogCiAgICAqIEByZXR1cm4gdHJ1ZSBpZiBGaWVsZCBpcyBvcHRpb25hbCBpbiBkYXRhYmFzZQogICAgKi8KCXB1YmxpYyBmdW5jdGlvbiBpc051bGxhYmxlKCkKCXtyZXR1cm4gJHRoaXMtPm51bGxhYmxlO30KCQogICAgLyoqCiAgICAqIGdldHRlciBmb3IgZGVmYXVsdFZhbHVlCiAgICAqIAogICAgKiBAcmV0dXJuIG1peGVkIHRoZSBkZWZhdWx0IHZhbHVlIG9mIEZpZWxkCiAgICAqIAogICAgKi8JCglwdWJsaWMgZnVuY3Rpb24gZ2V0RGVmYXVsdFZhbHVlKCkKCXtyZXR1cm4gJHRoaXMtPmRlZmF1bHRWYWx1ZTt9CgkKICAgLyoqCiAgICAqIHNldHRlciBmb3IgZGVmYXVsdFZhbHVlCiAgICAqIAogICAgKiBAcGFyYW0gbWl4ZWQgdGhlIGRlZmF1bHQgdmFsdWUgb2YgRmllbGQKICAgICogCiAgICAqLwkKCXB1YmxpYyBmdW5jdGlvbiBzZXREZWZhdWx0VmFsdWUoJGRlZmF1bHRWYWx1ZSl7CgkJaWYoJHRoaXMtPnR5cGUgPT0gT3JtQ0FTVDo6JEJVRkZFUil7CgkJCXRocm93IG5ldyBPcm1JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInRoZSBGaWVsZCAiLiR0aGlzLT5uYW1lLiIgb2YgdHlwZSBCVUZGRVIgY2FuJ3QgaGF2ZSBhIGRlZmF1bHQgdmFsdWUgIik7CgkJfQoJCSR0aGlzLT5kZWZhdWx0VmFsdWUgPSAkZGVmYXVsdFZhbHVlOwoJfQoJCn0KCj8+Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/class.OrmIllegalArgumentException.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKIC8qKgogKiBDb250YWlucyB0aGUgY2xhc3MgT3JtSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCiAqCiAqIEBzaW5jZSAwLjAuMQogKiBAYXV0aG9yIEJlc3MKICogQHBhY2thZ2UgT3JtCiAqKi8KIAoKLyoqCiAqIENsYXNzZSBleHRlbmRzIEV4Y2VwdGlvbiwgdXNlZCB3aGVuIHRoZSBwYXJhbWV0ZXJzIGlzIG5vdCB0aGUgb25lIGV4cGVjdGVkCiAqCiAqIEBzaW5jZSAwLjAuMQogKiBAYXV0aG9yIEJlc3MKICogQHBhY2thZ2UgT3JtCiovCmNsYXNzIE9ybUlsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7CiAgICAKICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkbXNnPU5VTEwsICRjb2RlPTApCiAgICB7cGFyZW50OjpfX2NvbnN0cnVjdCgkbXNnLCAkY29kZSk7fQp9CgoKPz4K]]></data>
	</file>
	<file>
	  <filename>/lib/class.OrmIllegalConfigurationException.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKIC8qKgogKiBDb250YWlucyB0aGUgY2xhc3MgT3JtSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCiAqCiAqIEBzaW5jZSAwLjAuMQogKiBAYXV0aG9yIEJlc3MKICogQHBhY2thZ2UgT3JtCiAqKi8KIAoKLyoqCiAqIENsYXNzZSBleHRlbmRzIEV4Y2VwdGlvbiwgdXNlZCB3aGVuIHRoZSBpbml0aWFsIGNvbmZpZ3VyYXRpb24gb2YgRW50aXRpZXMgaXNuJ3QgY29ycmVjdAogKgogKiBAc2luY2UgMC4wLjEKICogQGF1dGhvciBCZXNzCiAqIEBwYWNrYWdlIE9ybQoqLwpjbGFzcyBPcm1JbGxlZ2FsQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiAgewogICAgCglwcml2YXRlICRtZXNzYWdlcyA9IGFycmF5KCk7CgogICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRtc2c9TlVMTCwgJGNvZGU9MCkKICAgIHsKICAgIAlpZihpc19hcnJheSgkbXNnKSAmJiBjb3VudCgkbXNnKSA+IDEgKXsKICAgIAkJcGFyZW50OjpfX2NvbnN0cnVjdCgiTXVsdGlwbGUgT3JtSWxsZWdhbENvbmZpZ3VyYXRpb25FeGNlcHRpb24gZGV0ZWN0ZWQiLCAkY29kZSk7CiAgICAJCSR0aGlzLT5tZXNzYWdlcyA9ICRtc2c7CgogICAgCX0gZWxzZWlmKCBpc19hcnJheSgkbXNnKSApewogICAgCQlwYXJlbnQ6Ol9fY29uc3RydWN0KCRtc2dbMF0sICRjb2RlKTsKICAgIAkJJHRoaXMtPm1lc3NhZ2VzID0gJG1zZzsJCgkJfSBlbHNlIHsKICAgIAkJcGFyZW50OjpfX2NvbnN0cnVjdCgkbXNnLCAkY29kZSk7CiAgICAJCSR0aGlzLT5tZXNzYWdlc1tdID0gJG1zZzsJCiAgICAJfQogICAgCQogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRNZXNzYWdlcygpewogICAgCXJldHVybiAkdGhpcy0+bWVzc2FnZXM7CiAgICB9Cn0KCj8+Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/class.OrmKEY.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIENvbnRhaW5zIHRoZSBjbGFzcyBmb3IgdGhlIGRpZmZlcmVudCBkYXRhYmFzZSBrZXkKICogCiAqIEBzaW5jZSAwLjAuMQogKiBAYXV0aG9yIEJlc3MKICogQHBhY2thZ2UgT3JtCiAqKi8KCi8qKgogKiBDbGFzcyBkZWZpbmVzIHRoZSBkaWZmZXJlbnRzIGtleXMgdXNlZCBpbiB0aGUgT3JtIHN5c3RlbQogKiAKICogIE9ybUtFWTo6JFBLIGRlZmluZXMgYSBwcmltYXJ5IGtleQogKiAgT3JtS0VZOjokRksgZGVmaW5lcyBhIGZvcmVpZ24ga2V5IDogYSBsaW5rIGJldHdlZW4gMiBlbnRpdGllcyAwLDEtPm4gCiAqICBPcm1LRVk6OiRBSyBkZWZpbmVzIGFuIGFzc29jaWF0ZSBrZXkgOiBhIGxpbmsgYmV0d2VlbiAyIGVudGl0aWVzIHRoYXQgbmVlZGluZyBhIHRoaXJkIHRhYmxlCiAqIAogKiBAc2luY2UgMC4wLjEKICogQGF1dGhvciBCZXNzCiAqIEBwYWNrYWdlIE9ybQoqLwpjbGFzcyBPcm1LRVkKewoJcHVibGljIHN0YXRpYyAkUEsgPSAweDk5MDE7IC8vIFByaW1hcnkgS0VZCglwdWJsaWMgc3RhdGljICRGSyA9IDB4OTkwMjsgLy8gRm9yZWlnbiBLRVkgYSBsaW5rIGJldHdlZW4gMiBlbnRpdGllcyAwLDEtPm4KCXB1YmxpYyBzdGF0aWMgJEFLID0gMHg5OTAzOyAvLyBBc3NvY2lhdGUgS0VZIGEgbGluayBiZXR3ZWVuIDIgZW50aXRpZXMgbi0+biB0aGF0IG5lZWRpbmcgYSB0aGlyZCB0YWJsZQp9Cgo/Pgo=]]></data>
	</file>
	<file>
	  <filename>/lib/class.OrmLimit.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIENvbnRhaW5zIHRoZSBjbGFzcyB3aGljaCB3aWxsIG1hbmFnZSB0aGUgU3FsIExJTUlUCiAqCiAqIEBzaW5jZSAwLjIuMAogKiBAYXV0aG9yIEhlcmlxdWV0CiAqIEBwYWNrYWdlIE9ybQogKiovCgoKLyoqCiAqIENvbnRhaW5zIHRoZSBjbGFzcyB3aGljaCB3aWxsIG1hbmFnZSB0aGUgU3FsIExJTUlUCiAqIAogKiBAc2luY2UgMC4yLjAKICogQGF1dGhvciBIZXJpcXVldAogKiBAcGFja2FnZSBPcm0KKi8KY2xhc3MgT3JtTGltaXQKewkKCXByaXZhdGUgJG9mZnNldCA9IDA7Cglwcml2YXRlICRyb3dfY291bnQgPSAwOwoKCWZ1bmN0aW9uIF9fY29uc3RydWN0KCRvZmZzZXQ9MCwgJHJvd19jb3VudD0wKSB7CgkJJHRoaXMtPm9mZnNldCA9ICRvZmZzZXQ7CgkJJHRoaXMtPnJvd19jb3VudCA9ICRyb3dfY291bnQ7Cgl9CgkKICAgLyoqCiAgICAqIHJldHVybiB0aGUgTElNSVQgY2xhdXNlCiAgICAqIAogICAgKiBAcmV0dXJuIHRoZSBMSU1JVCBjbGF1c2UKICAgICovICAgICAgCglmdW5jdGlvbiBnZXRMaW1pdCgpCXsKCQlpZigkdGhpcy0+b2Zmc2V0ID09IDAgJiYgJHRoaXMtPnJvd19jb3VudCA9PSAwKSB7IC8vIG5vIGxpbWl0IHNldAoJCQlyZXR1cm4gJyc7CgkJfQoJCQoJCWlmKCR0aGlzLT5vZmZzZXQgPCAwKSB7CgkJCXRocm93IG5ldyBPcm1JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgb2Zmc2V0IHZhbHVlOiB7JHRoaXMtPm9mZnNldH0uIE11c3QgYmUgPj0gMCIpOwoJCX0KCQkKCQlpZigkdGhpcy0+cm93X2NvdW50IDw9IDApIHsKCQkJdGhyb3cgbmV3IE9ybUlsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCByb3dfY291bnQgdmFsdWU6IHskdGhpcy0+cm93X2NvdW50fS4gTXVzdCBiZSA+IDAiKTsKCQl9CgkJCgkJJGxpbWl0ID0gJyBMSU1JVCAnOwoJCQoJCWlmKCR0aGlzLT5vZmZzZXQgPSAwKSB7CgkJCSRsaW1pdC49ICR0aGlzLT5vZmZzZXQ7CgkJfQoJCQoJCSRsaW1pdC49ICcgJy4kdGhpcy0+cm93X2NvdW50OwoJCQoJCXJldHVybiAkbGltaXQ7Cgl9CgkKICAgLyoqCiAgICAqIFNldCBvZmZzZXQKICAgICogCiAgICAqLwoJZnVuY3Rpb24gc2V0T2Zmc2V0KCRvZmZzZXQpIHsKCQkkdGhpcy0+b2Zmc2V0ID0gJG9mZnNldDsKCX0KCQogICAvKioKICAgICogU2V0IHJvd19jb3VudAogICAgKiAKICAgICovCglmdW5jdGlvbiBzZXRSb3dDb3VudCgkcm93X2NvdW50KSB7CgkJJHRoaXMtPnJvd19jb3VudCA9ICRyb3dfY291bnQ7Cgl9Cn0KCj8+Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/class.OrmOrderBy.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIENvbnRhaW5zIHRoZSBjbGFzcyB3aGljaCB3aWxsIG1hbmFnZSB0aGUgU3FsIHNvcnRpbmcgb2YgdGhlIEVudGl0eQogKgogKiBAc2luY2UgMC4yLjAKICogQGF1dGhvciBIZXJpcXVldAogKiBAcGFja2FnZSBPcm0KICoqLwoKCi8qKgogKiBDb250YWlucyB0aGUgY2xhc3Mgd2hpY2ggd2lsbCBtYW5hZ2UgdGhlIFNxbCBzb3J0aW5nIG9mIHRoZSBFbnRpdHkKICogCiAqICBPcm1DQVNUOjokREVTQyAKICoKICogQHNpbmNlIDAuMi4wCiAqIEBhdXRob3IgSGVyaXF1ZXQKICogQHBhY2thZ2UgT3JtCiovCmNsYXNzIE9ybU9yZGVyQnkKewoJcHJpdmF0ZSAkb3JkZXJzID0gYXJyYXkoKTsKCglwdWJsaWMgc3RhdGljICRBU0MgPSAnQVNDJzsKCXB1YmxpYyBzdGF0aWMgJERFU0MgPSAnREVTQyc7CgkKCS8qKgogICAgKiBwdWJsaWMgY29uc3RydWN0b3IKICAgICogCQogICAgKiBAcGFyYW0gYXJyYXkgJG9yZGVycyBhbiBoYXNoIHdpdGggb3JkZXIgYnkgZGVmaW5pdGlvbnMKCSovCglmdW5jdGlvbiBfX2NvbnN0cnVjdCgkb3JkZXJzPWFycmF5KCkpIHsKCQlmb3JlYWNoKCRvcmRlcnMgYXMgJGZpZWxkID0+ICRvcmRlcikgewoJCQlpZigkb3JkZXIgPT0gT3JtT3JkZXJCeTo6JEFTQykgewoJCQkJJHRoaXMtPmFkZEFzYygkZmllbGQpOwoJCQl9CgkJCWVsc2UgaWYoJG9yZGVyID09IE9ybU9yZGVyQnk6OiRERVNDKSB7CgkJCQkkdGhpcy0+YWRkRGVzYygkZmllbGQpOwkJCQoJCQl9CgkJCWVsc2UgewoJCQkJdGhyb3cgbmV3IE9ybUlsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCBvcmRlciBmb3IgT1JERVIgQlk6IHskb3JkZXJ9LiIpOwoJCQl9CgkJfQoJfQoJCiAgIC8qKgogICAgKiByZXR1cm4gT1JERVIgQlkgY2xhdXNlCiAgICAqIAogICAgKiBAcmV0dXJuIE9SREVSIEJZIGNsYXVzZQogICAgKi8gICAgICAKCWZ1bmN0aW9uIGdldE9yZGVyQnkoKQl7CgkJJG9yZGVyYnkgPSAnIE9SREVSIEJZICc7CgkJCgkJaWYoY291bnQoJHRoaXMtPm9yZGVycykgPT0gMCkgewoJCQlyZXR1cm4gJyc7CgkJfQoJCQoJCSRpPTE7CgkJZm9yZWFjaCgkdGhpcy0+b3JkZXJzIGFzICRrZXkgPT4gJHZhbHVlKSB7CgkJCQoJCQkkb3JkZXJieSAuPSAoJGkrKz4xPycsJzonJykuJyAnLiRrZXkuJyAnLiR2YWx1ZTsKCQl9CgkJCgkJcmV0dXJuICRvcmRlcmJ5OwoJfQoJCiAgIC8qKgogICAgKiBBZGQgYSBuZXcgZmllbGQgaW4gb3JkZXIgYnk6IERFU0MKICAgICogCiAgICAqLwoJZnVuY3Rpb24gYWRkQXNjKCRmaWVsZCkgewoJCSR0aGlzLT5vcmRlcnMgPSBhcnJheV9tZXJnZSgkdGhpcy0+b3JkZXJzLCBhcnJheSgkZmllbGQgPT4gJycpKTsgLy8gQVNDIG5vdCBtYW5kYXRvcnkKCX0KCQogICAvKioKICAgICogQWRkIGEgbmV3IGZpZWxkIGluIG9yZGVyIGJ5OiBERVNDCiAgICAqIAogICAgKi8KCWZ1bmN0aW9uIGFkZERlc2MoJGZpZWxkKSB7CgkJJHRoaXMtPm9yZGVycyA9IGFycmF5X21lcmdlKCR0aGlzLT5vcmRlcnMsIGFycmF5KCRmaWVsZCA9PiBPcm1PcmRlckJ5OjokREVTQykpOwoJfQp9Cgo/Pgo=]]></data>
	</file>
	<file>
	  <filename>/lib/class.OrmSqlException.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKIC8qKgogKiBDb250YWlucyB0aGUgY2xhc3MgT3JtSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCiAqCiAqIEBzaW5jZSAwLjMuMAogKiBAYXV0aG9yIEJlc3MKICogQHBhY2thZ2UgT3JtCiAqKi8KIAoKLyoqCiAqIENsYXNzIGV4dGVuZHMgRXhjZXB0aW9uLCB1c2VkIHdoZW4gdGhlIHBhcmFtZXRlcnMgaXMgbm90IHRoZSBvbmUgZXhwZWN0ZWQKICoKICogQHNpbmNlIDAuMy4wCiAqIEBhdXRob3IgQmVzcwogKiBAcGFja2FnZSBPcm0KKi8KY2xhc3MgT3JtU3FsRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKICAgIAogICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRtc2c9TlVMTCwgJGNvZGU9MCkKICAgIHtwYXJlbnQ6Ol9fY29uc3RydWN0KCRtc2csICRjb2RlKTt9Cn0KCgo/Pgo=]]></data>
	</file>
	<file>
	  <filename>/lib/class.OrmTrace.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIENvbnRhaW5zIGFsbCB0aGUgZGVidWcgc3lzdGVtLgogKgogKiBAc2luY2UgMC4wLjEKICogQGF1dGhvciBCZXNzCiAqIEBwYWNrYWdlIE9ybQogKiovCgovKioKICogIEFsbG93IGRpc3BsYXkgc3RhY2t0cmFjZSBhbmQgb3RoZXIgaW5mb3JtYXRpb25zIGluIGEgY29uc29sZSBvciBvbiB0aGUgcGFnZQogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICogIGV4YW1wbGUKICogIDxjb2RlPgogKiAgICAgICAgICBPcm1UcmFjZTo6ZGVidWcoJ2kgYW0gaGVyZSAhJyk7CiAqICAgICAgICAgIE9ybVRyYWNlOjppbmZvKCdwcm9jZXNzIGZpbmlzaGVkJyk7CiAqICAgICAgICAgIE9ybVRyYWNlOjp3YXJuKCdCZSBjYXJmdWxsIDogdG9vIG11Y2ggcmVzdWx0cyB3aWxsIGJlIGRpc3BsYXllZCcpOwogKiAgICAgICAgICBPcm1UcmFjZTo6ZXJyb3IoJ291cHMgaG91c3Rvbiwgd2UgaGF2ZSBnb3QgYSBwcm9ibGVtLi4uIDooICcpOwogKiAgPC9jb2RlPgogKiAKICogdGhlIHByb3BlcnR5ICRsZXZlbCBvZiB0aGlzIGNsYXNzIGRlZmluZXMgdGhlIGxldmVsIG9mIHRoZSBtZXNzYWdlcyB0byBkaXNwbGF5aW5nCiAqICBTbyBhIGxldmVsIG9mICJXQVJOIiB3aWxsIG9ubHkgZGlzcGxheSB3YXJuaW5nIGFuZCBlcnJvciBtZXNzYWdlcwogKiAgQnkgZGVmYXVsdCB0aGUgbGV2ZWwgaXMgc2V0dGVkIHRvIFdBUk4KICoKICogQHNpbmNlIDAuMC4xCiAqIEBhdXRob3IgQmVzcwogKiBAcGFja2FnZSBPcm0KICoqLyAgIAogCmZpbmFsIGNsYXNzIE9ybVRyYWNlCnsKCXB1YmxpYyBzdGF0aWMgJERFQlVHID0gMDsKCXB1YmxpYyBzdGF0aWMgJElORk8gPSAxOwoJcHVibGljIHN0YXRpYyAkV0FSTiA9IDI7CglwdWJsaWMgc3RhdGljICRFUlJPUiA9IDM7CgkKCXByb3RlY3RlZCBzdGF0aWMgJGxvZ0ZpbGU7Cglwcm90ZWN0ZWQgc3RhdGljICRsb2dVcmw7CgkKCXByb3RlY3RlZCBmdW5jdGlvbiBfX2NvbnN0cnVjdCgpIHsKCX0KCgkvKioKICAgICogRGlzcGxheSBhIG1lc3NhZ2Ugd2l0aCBERUJVRyBsZXZlbAogICAgKiAKICAgICogQHBhcmFtIHN0cmluZyB0aGUgbWVzc2FnZSB0byBkaXNwbGF5CiAgICAqLwoJcHVibGljIHN0YXRpYyBmaW5hbAlmdW5jdGlvbiBkZWJ1ZygkbXNnKSB7CQoJCXNlbGY6OmlubmVyV3JpdGVyKE9ybVRyYWNlOjokREVCVUcsICdkZWJ1ZycsICRtc2cpOwoJfQoKICAgIC8qKgogICAgKiBEaXNwbGF5IGEgbWVzc2FnZSB3aXRoIElORk8gbGV2ZWwKICAgICogCiAgICAqIEBwYXJhbSBzdHJpbmcgdGhlIG1lc3NhZ2UgdG8gZGlzcGxheQogICAgKi8KCXB1YmxpYyBzdGF0aWMgZmluYWwJZnVuY3Rpb24gaW5mbygkbXNnKSB7CQoJCXNlbGY6OmlubmVyV3JpdGVyKE9ybVRyYWNlOjokSU5GTywgJ2luZm8nLCAkbXNnKTsKCX0gCgogICAgLyoqCiAgICAqIERpc3BsYXkgYSBtZXNzYWdlIHdpdGggV0FSTiBsZXZlbAogICAgKiAKICAgICogQHBhcmFtIHN0cmluZyB0aGUgbWVzc2FnZSB0byBkaXNwbGF5CiAgICAqLwoJcHVibGljIHN0YXRpYyBmaW5hbAlmdW5jdGlvbiB3YXJuKCRtc2cpIHsJCgkJc2VsZjo6aW5uZXJXcml0ZXIoT3JtVHJhY2U6OiRXQVJOLCAnd2FybicsICRtc2cpOwoJfSAKCiAgICAvKioKICAgICogRGlzcGxheSBhIG1lc3NhZ2Ugd2l0aCBFUlJPUiBsZXZlbAogICAgKiAKICAgICogQHBhcmFtIHN0cmluZyB0aGUgbWVzc2FnZSB0byBkaXNwbGF5CiAgICAqLwoJcHVibGljIHN0YXRpYyBmaW5hbAlmdW5jdGlvbiBlcnJvcigkbXNnKSB7CQoJCXNlbGY6OmlubmVyV3JpdGVyKE9ybVRyYWNlOjokRVJST1IsICdlcnJvcicsICRtc2cpOwoJfQoJCgkvKioKCSAqIFdpbGwgcmV0dXJuIHRoZSBwYXRoIG9mIHRoZSBsb2cgZmlsZQoJICoKCSAqIEByZXR1cm4gc3RyaW5nIHRoZSBwYXRoIG9mIHRoZSBsb2cgZmlsZQoJICoqLwoJcHVibGljIHN0YXRpYyBmaW5hbCBmdW5jdGlvbiBnZXRMb2dGaWxlKCl7CgkJaWYoc2VsZjo6JGxvZ0ZpbGUgPT0gbnVsbCl7CgkJCSRjb25maWcgPSBjbXNtcygpLT5HZXRDb25maWcoKTsKCQkJc2VsZjo6JGxvZ0ZpbGUgPSAkY29uZmlnWydyb290X3BhdGgnXS4nL3RtcC9jYWNoZS9vcm0ubG9nJzsKCQl9CgkJcmV0dXJuIHNlbGY6OiRsb2dGaWxlOwoJfQoJCgkvKioKCSAqIFdpbGwgcmV0dXJuIHRoZSB1cmwgb2YgdGhlIGxvZyBmaWxlCgkgKgoJICogQHJldHVybiBzdHJpbmcgdGhlIHVybCBvZiB0aGUgbG9nIGZpbGUKCSAqKi8KCXB1YmxpYyBzdGF0aWMgZmluYWwgZnVuY3Rpb24gZ2V0TG9nVXJsKCl7CgkJaWYoc2VsZjo6JGxvZ1VybCA9PSBudWxsKXsKCQkJJGNvbmZpZyA9IGNtc21zKCktPkdldENvbmZpZygpOwoJCQlzZWxmOjokbG9nVXJsID0gJGNvbmZpZ1sncm9vdF91cmwnXS4nL3RtcC9jYWNoZS9vcm0ubG9nJzsKCQl9CgkJcmV0dXJuIHNlbGY6OiRsb2dVcmw7Cgl9CgkKCS8qKgoJICogRG8gYWxsIHRoZSBzdWZmIGJlaGluZAoJICoKCSAqIEBwYXJhbSBzdHJpbmcgdGhlIGxldmVsIG9mIG1lc3NhZ2UuCgkgKiBAcGFyYW0gc3RyaW5nIHRoZSBjc3MgY2xhc3MgdG8gZGlzcGxheSB0aGUgImlubGluZSIgbWVzc2FnZQoJICogQHBhcmFtIHN0cmluZyB0aGUgbWVzc2FnZSB0byBkaXNwbGF5CgkgKi8KCXByaXZhdGUgc3RhdGljIGZpbmFsIGZ1bmN0aW9uIGlubmVyV3JpdGVyKCRsZXZlbCwgJGNzc0NsYXNzLCAkbXNnKXsKCQkkb3JtID0gY21zbXMoKS0+R2V0TW9kdWxlT3BlcmF0aW9ucygpLT5nZXRfbW9kdWxlX2luc3RhbmNlKCdPcm0nKTsKCgkJaWYoJG9ybS0+R2V0UHJlZmVyZW5jZSgnbG9nbGV2ZWwnLCBPcm1UcmFjZTo6JElORk8pID4gJGxldmVsKSB7cmV0dXJuO30KCQkKCQkkY29udGVudCA9IGRhdGUoJ1ktbS1kIEg6aTpzJywgdGltZSgpKS4iIC0gWyRjc3NDbGFzc10gLSAkbXNnIFxuIjsKCS8vCSRjb250ZW50ID0gdXRmOF9lbmNvZGUoJGNvbnRlbnQpOwoJCQkJCgkJLy9pbiBmaWxlIGxvZwoJCWZpbGVfcHV0X2NvbnRlbnRzKHNlbGY6OmdldExvZ0ZpbGUoKSAsJGNvbnRlbnQsIEZJTEVfQVBQRU5EICk7CgoJCS8vSW4gcGhwIGxvZwoJCWVycm9yX2xvZygkbXNnKTsKCX0KfQoKPz4K]]></data>
	</file>
	<file>
	  <filename>/lib/class.OrmTypeCriteria.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIENvbnRhaW5zIHRoZSBPcm1UeXBlQ3JpdGVyaWEgY2xhc3MKICogCiAqIEBzaW5jZSAwLjAuMQogKiBAYXV0aG9yIEJlc3MKICogQHBhY2thZ2UgT3JtCiAqKi8KIAoKLyoqCiAqIEVudW0gZm9yIHRoZSBkaWZmZXJlbnQgdHlwZXMgb2YgT3JtVHlwZUNyaXRlcmlhCiAqIAogKiAKICogQHNpbmNlIDAuMC4xCiAqIEBhdXRob3IgQmVzcwogKiBAcGFja2FnZSBPcm0KICoqLwpjbGFzcyBPcm1UeXBlQ3JpdGVyaWEgewogICAgLyoqCiAgICAqIElzIGVxdWFscyB0bwogICAgKiAKICAgICogQHZhciBzdHJpbmcKICAgICovCglwdWJsaWMgc3RhdGljICRFUSA9ICcgPSAnOwogICAgCiAgICAvKioKICAgICogSXMgZGlmZmVyZW50IE9mCiAgICAqIAogICAgKiBAdmFyIHN0cmluZwogICAgKi8KCXB1YmxpYyBzdGF0aWMgJE5FUSA9ICcgIT0gJzsKICAgIAogICAgLyoqCiAgICAqIGlzIHN0cmljdGx5IGdyZWF0ZXIgIHRoYW4KICAgICogCiAgICAqIEB2YXIgc3RyaW5nCiAgICAqLwoJcHVibGljIHN0YXRpYyAkR1QgPSAnID4gJzsKICAgIAogICAgLyoqCiAgICAqIGlzIGdyZWF0ZXIgIG9yIGVxdWFscyB0bwogICAgKiAKICAgICogQHZhciBzdHJpbmcKICAgICovCglwdWJsaWMgc3RhdGljICRHVEUgPSAnID49ICc7CiAgICAKICAgIC8qKgogICAgKiBpcyBzdHJpY3RseSBsZXNzZXIgdGhhbgogICAgKiAKICAgICogQHZhciBzdHJpbmcKICAgICovCglwdWJsaWMgc3RhdGljICRMVCA9ICcgPCAnOwogICAgCiAgICAvKioKICAgICogaXMgbGVzc2VyIG9yIGVxdWFscyB0bwogICAgKiAKICAgICogQHZhciBzdHJpbmcKICAgICovCglwdWJsaWMgc3RhdGljICRMVEUgPSAnIDw9ICc7CgkKCS8qKgogICAgKiBpcyBOVUxMIG9yIGlzIEVtcHR5CiAgICAqIAogICAgKiBAdmFyIHN0cmluZwogICAgKi8KCXB1YmxpYyBzdGF0aWMgJEVNUFRZID0gJ2lzIGVtcHR5KCknOwoJCiAgICAvKioKICAgICogaXMgTm90IE5VTEwgYW5kIGlzIE5vdCBFbXB0eQogICAgKiAKICAgICogQHZhciBzdHJpbmcKICAgICovCglwdWJsaWMgc3RhdGljICRORU1QVFkgPSAnaXMgbm90IGVtcHR5KCknOwogICAgCiAgICAvKioKICAgICogaXMgTlVMTAogICAgKiAKICAgICogQHZhciBzdHJpbmcKICAgICovCglwdWJsaWMgc3RhdGljICROVUxMID0gJyBpcyBudWxsICc7CiAgICAKICAgIC8qKgogICAgKiBpcyBOb3QgTlVMTAogICAgKiAKICAgICogQHZhciBzdHJpbmcKICAgICovCglwdWJsaWMgc3RhdGljICROTlVMTCA9ICcgaXMgbm90IG51bGwnOwogICAgCiAgICAvKioKICAgICogaXMgYmVmb3JlIChhIERhdGUpCiAgICAqIAogICAgKiBAdmFyIHN0cmluZwogICAgKi8KCXB1YmxpYyBzdGF0aWMgJEJFRk9SRSA9ICcgYmVmb3JlICc7CiAgICAKICAgIC8qKgogICAgKiBpcyBhZnRlciAoYSBEYXRlKQogICAgKiAKICAgICogQHZhciBzdHJpbmcKICAgICovCglwdWJsaWMgc3RhdGljICRBRlRFUiA9ICcgYWZ0ZXIgJzsKICAgIAogICAgLyoqCiAgICAqIGlzIGJldHdlZW4gKGEgRGF0ZSkKICAgICogCiAgICAqIEB2YXIgc3RyaW5nCiAgICAqLwoJcHVibGljIHN0YXRpYyAkQkVUV0VFTiA9ICcgYmV0d2VlbiAnOwogICAgIAogICAgLyoqCiAgICAqIGlzIGNvbnRhaW5lZCBpbnRvIHRoZSBhcnJheQogICAgKiAKICAgICogLyFcIG5lZWQgYXQgbGFzdCAyIHZhbHVlcyBpbiB0aGUgYXJyYXkKICAgICogCiAgICAqIEB2YXIgc3RyaW5nCiAgICAqLwoJcHVibGljIHN0YXRpYyAkSU4gPSAnaW4gKCVhKSc7CiAgICAKICAgIC8qKgogICAgKiBpcyBub3QgY29udGFpbmVkIGludG8gdGhlIGFycmF5CiAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgKiAvIVwgbmVlZCBhdCBsYXN0IDIgdmFsdWVzIGluIHRoZSBhcnJheQogICAgKiAKICAgICogQHZhciBzdHJpbmcKICAgICovCglwdWJsaWMgc3RhdGljICROSU4gPSAnbm90IGluICglYSknOwogICAgCiAgICAvKioKICAgICogY29udGFpbnMgdGhlIHN0cmluZwogICAgKiAKICAgICogLyFcIGRvbid0IGZvcmdldCB0byBhZGQgdGhlIHdpbGRjYXJkICclJwogICAgKiAKICAgICogQHZhciBzdHJpbmcKICAgICovCglwdWJsaWMgc3RhdGljICRMSUtFID0gJyBsaWtlICc7CiAgICAKICAgIC8qKgogICAgKiBkb2Vzbid0IGNvbnRhaW4gdGhlIHN0cmluZwogICAgKiAKICAgICogLyFcIGRvbid0IGZvcmdldCB0byBhZGQgdGhlIHdpbGRjYXJkICclJwogICAgKiAKICAgICogQHZhciBzdHJpbmcKICAgICovCglwdWJsaWMgc3RhdGljICROTElLRSA9ICcgbm90IGxpa2UgJzsKfQo/Pgo=]]></data>
	</file>
	<file>
	  <filename>/lib/class.OrmUtils.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIENvbnRhaW5zIHV0aWxpdGllcwogKgogKiBAc2luY2UgMC4zLjAKICogQGF1dGhvciBIZXJpcXVldAogKiBAcGFja2FnZSBPcm0KICoqLwoKCi8qKgogKiBDbGFzcyBjb250YWlucyBzb21lIHV0aWxpdGllcwogKiAKICogQHNpbmNlIDAuMy4wCiAqIEBhdXRob3IgSGVyaXF1ZXQKICogQHBhY2thZ2UgT3JtCiovCmNsYXNzIE9ybVV0aWxzCnsKCS8qCgkqIEFzc2lnbnMgYWxsIGFycmF5IHZhbHVlcyB0byB0aGUgZW50aXR5LCAKCSogZXNwZWNpYWxseSBmb3IgaGVscGluZyB0aGUgZGV2ZWxvcHBlciB0byBhc3NpZ24gYWxsIGZvcm0gdmFyaWFibGVzIHRvIHRoZSBlbnRpdHksIAoJKiBvciB0byBsb2FkIGFuIGVudGl0eSB3aXRoIGEgT3JtRGI6OmV4ZWN1dGUgY3VzdG9tIHF1ZXJ5CgkqIEJlIGNhcmVmdWxsIHdpdGggdGhpcyBmdW5jdGlvbgoJKiAKCSogQHBhcmFtIE9ybUVudGl0eSBhbiBpbnN0YW5jZSBvZiB0aGUgZW50aXR5ICAKCSogQHBhcmFtIGRhdGEgYXJyYXkgaGFzaHRhYmxlCgkqLyAKCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gYXJyYXlUb0VudGl0eShPcm1FbnRpdHkgJiRlbnRpdHksICYkZGF0YSkgewoJCWZvcmVhY2goJGVudGl0eS0+Z2V0RmllbGRzKCkgYXMgJGZpZWxkKSB7CgkJCWlmKGlzc2V0KCRkYXRhWyRmaWVsZC0+Z2V0TmFtZSgpXSkpIHsKCQkJCSRlbnRpdHktPnNldCgkZmllbGQtPmdldE5hbWUoKSwgJGRhdGFbJGZpZWxkLT5nZXROYW1lKCldKTsKCQkJfQoJCX0KCX0KCgkvKioKCSAqIFJldHVybiBhIHVuaXF1ZSBlbmNvZGluZyBmb3IgdGhlIGxpc3Qgb2Yga2V5LgoJICogRm9yIG5vdyBzaW1wbHkgYW4gSnNvbiBFbmNvZGluZwoJICoKCSAqIEByZXR1cm4gc2VjdXJpemVkIGhhc2ggZm9yIHRoZSBlbnRpdHkKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZW5lcmF0ZVBVSUQoYXJyYXkgJHByaW1hcnlLZXlzVmFsdWUpewoJCQoJCSRwdWlkID0ganNvbl9lbmNvZGUoJHByaW1hcnlLZXlzVmFsdWUpOwoKCQlyZXR1cm4gJHB1aWQ7Cgl9Cn0KCj8+]]></data>
	</file>
	<file>
	  <filename>/method.install.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCmlmICghZnVuY3Rpb25fZXhpc3RzKCJjbXNtcyIpKSBleGl0OwoKJGNvbmZpZyA9IGNtc21zKCktPkdldENvbmZpZygpOwppZiggIWNsYXNzX2V4aXN0cygiT3JtVHJhY2UiKSkgewoJcmVxdWlyZV9vbmNlKCRjb25maWdbJ3Jvb3RfcGF0aCddLicvbW9kdWxlcy9Pcm0vbGliL2NsYXNzLk9ybVRyYWNlLnBocCcpOwp9CmlmKCAhY2xhc3NfZXhpc3RzKCJPcm1DYWNoZSIpKSB7CglyZXF1aXJlX29uY2UoJGNvbmZpZ1sncm9vdF9wYXRoJ10uJy9tb2R1bGVzL09ybS9saWIvY2xhc3MuT3JtQ2FjaGUucGhwJyk7Cn0KCiR0aGlzLT5TZXRQcmVmZXJlbmNlKCdsb2dsZXZlbCcsIE9ybVRyYWNlOjokSU5GTyk7CiR0aGlzLT5TZXRQcmVmZXJlbmNlKCdjYWNoZVR5cGUnLCBPcm1DYWNoZTo6JE5PTkUpOwokdGhpcy0+U2V0UHJlZmVyZW5jZSgndXNlQ2FjaGUnLCB0cnVlKTsKCiR0aGlzLT5DcmVhdGVQZXJtaXNzaW9uKCdNYW5hZ2VfT3JtJywgJ01hbmFnZSBPcm0nKTsKCiR0aGlzLT5BdWRpdCggMCwgCgkgICAgICAkdGhpcy0+TGFuZygnZnJpZW5kbHluYW1lJyksIAoJICAgICAgJHRoaXMtPkxhbmcoJ2luc3RhbGxlZCcsICR0aGlzLT5HZXRWZXJzaW9uKCkpICk7Cj8+]]></data>
	</file>
	<file>
	  <filename>/method.uninstall.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCmlmICghZnVuY3Rpb25fZXhpc3RzKCJjbXNtcyIpKSBleGl0OwoKJHRoaXMtPlJlbW92ZVByZWZlcmVuY2UoKTsKJHRoaXMtPlJlbW92ZVBlcm1pc3Npb24oJ01hbmFnZV9Pcm0nKTsKCi8vIHB1dCBtZW50aW9uIGludG8gdGhlIGFkbWluIGxvZwokdGhpcy0+QXVkaXQoIDAsICR0aGlzLT5MYW5nKCdmcmllbmRseW5hbWUnKSwgJHRoaXMtPkxhbmcoJ3VuaW5zdGFsbGVkJykpOwoKPz4=]]></data>
	</file>
	<file>
	  <filename>/method.upgrade.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCmlmICghZnVuY3Rpb25fZXhpc3RzKCJjbXNtcyIpKSBleGl0OwoKCmlmKCB2ZXJzaW9uX2NvbXBhcmUoJG9sZHZlcnNpb24sICcwLjIuMicpIDwgMCApIHsKCSR0aGlzLT5DcmVhdGVQZXJtaXNzaW9uKCdNYW5hZ2VfT3JtJywgJ01hbmFnZSBPcm0nKTsKfQoKc3dpdGNoKCRvbGR2ZXJzaW9uKXsKCWNhc2UgJzAuMi4yJzoKCQkkdGhpcy0+U2V0UHJlZmVyZW5jZSgndXNlQ2FjaGUnLCB0cnVlKTsKCWNhc2UgJzAuMy4wJzoKfQoKCgovLyBwdXQgbWVudGlvbiBpbnRvIHRoZSBhZG1pbiBsb2cKJHRoaXMtPkF1ZGl0KCAwLCAgJHRoaXMtPkxhbmcoJ2ZyaWVuZGx5bmFtZScpLCAgJHRoaXMtPkxhbmcoJ3VwZ3JhZGVkJywgJHRoaXMtPkdldFZlcnNpb24oKSkpOwoKCj8+]]></data>
	</file>
	<file>
	  <filename>/Orm.module.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiogQ2xhc3Mgb2YgY21zbWFkZXNpbXBsZSdzIEFQSS4gVXNlZCB0byBtYWtlIGEgbGluayBiZXR3ZWVuIHRoZSBBUEkgb2YgQ21zTWFkZVNpbXBsZSBhbmQgb3RoZXIgbW9kdWxlcycKKgoqIEBzaW5jZSAwLjAuMQoqIEBhdXRob3IgQmVzcwoqIEBwYWNrYWdlIE9ybQoqKi8KCgkvKioKCSogVGhlIENsYXNzIE9ybSBkZWZpbmUgdGhlIG1vZHVsZSBPcm0gYW5kIGFsbG93IGhhdmluZyBhbGwgdGhlIG9ybSBmdW5jdGlvbmFsaXRpZXMgaW50byBhbm90aGVyIG1vZHVsZQoJKgoJKiBAc2luY2UgMC4wLjEKCSogQGF1dGhvciBCZXNzCgkqIEBwYWNrYWdlIGNtc21zCgkqLwpjbGFzcyBPcm0gZXh0ZW5kcyBDTVNNb2R1bGUgewoKCWZ1bmN0aW9uIF9fY29uc3RydWN0KCl7CgoJCS8vUmVxdWlyZWQgdG8gcHJlc2VydmUgdGhlIHtNb2R1bGV9IG9uIEZyb250LU9mZmljZQoJCXBhcmVudDo6X19jb25zdHJ1Y3QoKTsKCgkJLy9Mb2FkIGFsbCB0aGUgbGlicmFpcmllcyBmb3IgT1JNIGV4Y2x1c2l2bHkKCQlpZigkdGhpcy0+R2V0TmFtZSgpID09PSBzZWxmOjpHZXROYW1lKCkpewoJCQkkZGlyID0gcGFyZW50OjpHZXRNb2R1bGVQYXRoKCkuJy9saWIvJzsgCgkJCSRsaWJzID0gc2NhbmRpciAoICRkaXIgKTsKCQkJZm9yZWFjaCAoJGxpYnMgYXMgJGxpYnJhaXJ5KSB7CgkJCQlpZigkbGlicmFpcnkgIT09ICcuJyAmJiAkbGlicmFpcnkgIT09ICcuLicgKXsKCQkJCQlyZXF1aXJlX29uY2UoJGRpci4kbGlicmFpcnkpOwoJCQkJfQoJCQl9CgkJfSBlbHNlIHsKCQkJJHRoaXMtPnNjYW4oKTsKCQl9Cgl9CgoJZnVuY3Rpb24gR2V0TmFtZSgpIHsKCQlyZXR1cm4gJ09ybSc7Cgl9CgoJZnVuY3Rpb24gR2V0RnJpZW5kbHlOYW1lKCkgewoJCXJldHVybiAkdGhpcy0+TGFuZygnZnJpZW5kbHluYW1lJyk7Cgl9CgoJZnVuY3Rpb24gR2V0VmVyc2lvbigpIHsKCQlyZXR1cm4gJzAuMy4wJzsKCX0KICAKCWZ1bmN0aW9uIEdldERlcGVuZGVuY2llcygpCiAJewogICAgCXJldHVybiBhcnJheSgpOwoJfQoKCWZ1bmN0aW9uIEdldEhlbHAoKSB7CgkJcmV0dXJuICR0aGlzLT5MYW5nKCdoZWxwJyk7Cgl9CgoJZnVuY3Rpb24gR2V0QXV0aG9yKCkgewoJCXJldHVybiAnS2V2aW4gRGFuZXppcyAoYWthIEJlc3MpJzsKCX0KCglmdW5jdGlvbiBHZXRBdXRob3JFbWFpbCgpIHsKCQlyZXR1cm4gJ2NvbnRhY3QgYXQgZnVyaWUgcG9pbnQgYmUnOwoJfQoKCWZ1bmN0aW9uIEdldENoYW5nZUxvZygpIHsKCQlyZXR1cm4gJHRoaXMtPkxhbmcoJ2NoYW5nZWxvZycpOwoJfQoKCWZ1bmN0aW9uIEdldEFkbWluRGVzY3JpcHRpb24oKSB7CgkJcmV0dXJuICR0aGlzLT5MYW5nKCdtb2RkZXNjcmlwdGlvbicpOwoJfQoKCWZ1bmN0aW9uIE1pbmltdW1DTVNWZXJzaW9uKCkgewoJCXJldHVybiAiMS4xMS4wIjsKCX0KCglmdW5jdGlvbiBJc1BsdWdpbk1vZHVsZSgpIHsKCQlyZXR1cm4gZmFsc2U7Cgl9CgoJZnVuY3Rpb24gSGFzQWRtaW4oKSB7CgkJcmV0dXJuIHRydWU7Cgl9CgoJZnVuY3Rpb24gR2V0QWRtaW5TZWN0aW9uKCkgewoJCXJldHVybiAnZXh0ZW5zaW9ucyc7Cgl9CgoJZnVuY3Rpb24gVmlzaWJsZVRvQWRtaW5Vc2VyKCkgewoJCXJldHVybiAkdGhpcy0+Q2hlY2tQZXJtaXNzaW9uKCdNYW5hZ2VfT3JtJyk7Cgl9CgoJZnVuY3Rpb24gSW5pdGlhbGl6ZUZyb250ZW5kKCkgewoJfQoKCWZ1bmN0aW9uIEluaXRpYWxpemVBZG1pbigpIHsKCX0KCglmdW5jdGlvbiBBbGxvd1NtYXJ0eUNhY2hpbmcoKSB7CgkJcmV0dXJuIGZhbHNlOwoJfQoKCWZ1bmN0aW9uIExhenlMb2FkRnJvbnRlbmQoKSB7CgkJcmV0dXJuIGZhbHNlOwoJfQoKCWZ1bmN0aW9uIExhenlMb2FkQWRtaW4oKSB7CgkgIHJldHVybiBmYWxzZTsKCX0KCQoJZnVuY3Rpb24gSW5zdGFsbFBvc3RNZXNzYWdlKCkgewoJCXJldHVybiAkdGhpcy0+TGFuZygncG9zdGluc3RhbGwnKTsKCX0KCglmdW5jdGlvbiBVbmluc3RhbGxQb3N0TWVzc2FnZSgpIHsKCQlyZXR1cm4gJHRoaXMtPkxhbmcoJ3Bvc3R1bmluc3RhbGwnKTsKCX0KCglmdW5jdGlvbiBVbmluc3RhbGxQcmVNZXNzYWdlKCkgewoJCXJldHVybiAkdGhpcy0+TGFuZygncmVhbGx5X3VuaW5zdGFsbCcpOwoJfSAgCgkKCWZ1bmN0aW9uIERpc3BsYXlFcnJvclBhZ2UoJG1zZykgewoJCWVjaG8gIjxoMz4iLiRtc2cuIjwvaDM+IjsKCX0gCgkJIAoJcHJpdmF0ZSBmdW5jdGlvbiBHZXRNeU1vZHVsZVBhdGgoKSB7CgkJcmV0dXJuIHBhcmVudDo6R2V0TW9kdWxlUGF0aCgpOwkJCgl9CgoJLyoqCgkgKiBXaWxsIGZvdW5kIGV2ZXJ5IEVudGl0eSBmb3IgdGhlIGN1cnJlbnQgbW9kdWxlIGFuZCByZXR1cm4gdGhlIGxpc3RlIG9mIHRoZWlyIG5hbWUKCSAqCgkgKiBAcmV0dXJuIEFycmF5PFN0cmluZz4gYSBsaXN0IG9mIG5hbWUgb2YgZW50aXRpZXMgZm91bmRlZAoJICoKCSAqKi8KCXByb3RlY3RlZCBmdW5jdGlvbiBzY2FuKCl7CgoJCS8vV2UncmUgbGlzdGluZyB0aGUgY2xhc3MgZGVjbGFyZWQgaW50byB0aGUgZGlyZWN0b3J5IG9mIHRoZSBjaGlsZCBtb2R1bGUKCQkkZGlyID0gY21zX2pvaW5fcGF0aChwYXJlbnQ6OkdldE1vZHVsZVBhdGgoKSwnbGliJyk7CgoJCSRsaXN0ZVsnZW50aXRpZXMnXSA9IGFycmF5KCk7CgkJJGxpc3RlWydhc3NvY2lhdGUnXSA9IGFycmF5KCk7CgkJCgkJJG9iamVjdHMgPSBuZXcgUmVjdXJzaXZlSXRlcmF0b3JJdGVyYXRvcihuZXcgUmVjdXJzaXZlRGlyZWN0b3J5SXRlcmF0b3IoJGRpcikpOwoJCWZvcmVhY2goJG9iamVjdHMgYXMgJG5hbWUgPT4gJG9iamVjdCl7CgkJCWlmKHN0cmlwb3MoJG5hbWUsICdjbGFzcy5lbnRpdHkuJykgIT09IEZBTFNFKXsJCQkKCQkJCSRjbGFzc25hbWUgPSBzdWJzdHIoJG9iamVjdC0+Z2V0RmlsZU5hbWUoKSAsIDEzICxzdHJsZW4oJG9iamVjdC0+Z2V0RmlsZU5hbWUoKSkgLSA0IC0gMTMpOwoJCQkJJGxpc3RlWydlbnRpdGllcyddW10gPSBhcnJheSgnZmlsZW5hbWUnPT4kbmFtZSwgJ2Jhc2VuYW1lJz0+JG9iamVjdC0+Z2V0RmlsZU5hbWUoKSwgJ2NsYXNzbmFtZSc9PiRjbGFzc25hbWUpOwoJCQl9IGVsc2VpZihzdHJpcG9zKCRuYW1lLCAnY2xhc3MuYXNzb2MuJykgIT09IEZBTFNFKSB7CgkJCQkkY2xhc3NuYW1lID0gc3Vic3RyKCRvYmplY3QtPmdldEZpbGVOYW1lKCkgLCAxMiAsc3RybGVuKCRvYmplY3QtPmdldEZpbGVOYW1lKCkpIC0gNCAtIDEyKTsKCQkJCSRsaXN0ZVsnYXNzb2NpYXRlJ11bXSA9IGFycmF5KCdmaWxlbmFtZSc9PiRuYW1lLCAnYmFzZW5hbWUnPT4kb2JqZWN0LT5nZXRGaWxlTmFtZSgpLCAnY2xhc3NuYW1lJz0+JGNsYXNzbmFtZSk7CgkJCX0gZWxzZSB7CgkJCX0KCQl9CgoJCSRlcnJvcnMgPSBhcnJheSgpOwoJCQoJCWZvcmVhY2goJGxpc3RlWydlbnRpdGllcyddIGFzICRlbGVtZW50KSB7CgkJCSRjbGFzc05hbWUgPSAkZWxlbWVudFsnY2xhc3NuYW1lJ107CgkJCSRmaWxlbmFtZSA9ICRlbGVtZW50WydmaWxlbmFtZSddOwoJCQlpZighY2xhc3NfZXhpc3RzKCRjbGFzc05hbWUpKXsKCQkJCU9ybVRyYWNlOjpkZWJ1ZygiaW1wb3J0aW5nIEVudGl0eSAiLiRjbGFzc05hbWUuIiBpbnRvIHRoZSBtb2R1bGUgIi4kdGhpcy0+Z2V0TmFtZSgpKTsKCQkJCXJlcXVpcmVfb25jZSgkZmlsZW5hbWUpOwkKCQkJCXRyeXsKCQkJCQkkZW50aXR5ID0gbmV3ICRjbGFzc05hbWUoKTsKCQkJCX0gY2F0Y2goT3JtSWxsZWdhbENvbmZpZ3VyYXRpb25FeGNlcHRpb24gJG9jZSl7CgkJCQkJJGVycm9yc1skY2xhc3NOYW1lXSA9ICRvY2U7CgkJCQkJY29udGludWU7CgkJCQl9CgkJCX0KCQl9CgoJCWZvcmVhY2goJGxpc3RlWydhc3NvY2lhdGUnXSBhcyAkZWxlbWVudCkgewoJCQkkY2xhc3NOYW1lID0gJGVsZW1lbnRbJ2NsYXNzbmFtZSddOwoJCQkkZmlsZW5hbWUgPSAkZWxlbWVudFsnZmlsZW5hbWUnXTsKCQkJaWYoIWNsYXNzX2V4aXN0cygkY2xhc3NOYW1lKSl7CgkJCQlPcm1UcmFjZTo6ZGVidWcoImltcG9ydGluZyBBc3NvY2lhdGUgRW50aXR5ICIuJGNsYXNzTmFtZS4iIGludG8gdGhlIG1vZHVsZSAiLiR0aGlzLT5nZXROYW1lKCkpOwoJCQkJcmVxdWlyZV9vbmNlKCRmaWxlbmFtZSk7CgkJCQkkZW50aXR5ID0gbmV3ICRjbGFzc05hbWUoKTsKCQkJfQoJCX0KCgkJLy9Qcm9jZXNzIGFsbCB0aGUgZXJyb3JzCgkJaWYoIWVtcHR5KCRlcnJvcnMpKXsKCQkJZWNobyAnPGgzIHN0eWxlPSJjb2xvcjojRjAwIj5Tb21lIE9ybUlsbGVnYWxDb25maWd1cmF0aW9uRXhjZXB0aW9uIGhhdmUgYmVlbiB0aHJvd248L2gzPic7CgkJCQoJCQlmb3JlYWNoICgkZXJyb3JzIGFzICRjbGFzc05hbWUgPT4gJGVycm9yKSB7CgkJCQllY2hvICc8aDQ+RW50aXR5ICcuJGNsYXNzTmFtZS4nIDwvaDQ+PG9sPic7CgkJCQlmb3JlYWNoICgkZXJyb3ItPmdldE1lc3NhZ2VzKCkgYXMgJG1lc3NhZ2UpIHsKCQkJCQllY2hvICc8bGk+Jy4kbWVzc2FnZS4nPC9saT4nOwoJCQkJfQoJCQkJZWNobyAnPC9vbD4nOwoJCQl9CgkJCQoJCQlleGl0OwoJCX0KCgkJcmV0dXJuICRsaXN0ZTsKCX0KCS8qCglwdWJsaWMgZnVuY3Rpb24gYXV0b2xvYWRfZnJhbWV3b3JrKCRjbGFzc25hbWUpewoJCWVjaG8gImF1dG9sb2FkX2ZyYW1ld29yaygkY2xhc3NuYW1lKSI7CgkJCQkKCQkvLyRPcm0gPSBuZXcgT3JtKCk7CgkJLy8kcGF0aCA9ICRPcm0tPkdldE15TW9kdWxlUGF0aCgpOwoJCSRwYXRoID0gcGFyZW50OjpHZXRNb2R1bGVQYXRoKCk7CgkJJGZuID0gY21zX2pvaW5fcGF0aCgkcGF0aCwibGliIiwiY2xhc3MuIi4kY2xhc3NuYW1lLiIucGhwIik7CgkJCgkJaWYoZmlsZV9leGlzdHMoJGZuKSl7CgkJCXJlcXVpcmVfb25jZSgkZm4pOwoJCQlyZXR1cm47CgkJfSAKCX0qLwoJCgkvKioKCSAqIFNob3J0Y3V0IHRvIGNhbGwgYWxsIHRoZSBpbnN0YW5jZXMgZm9yIGEgc2luZ2xlIG1vZHVsZQoJICoKCSAqIEByZXR1cm4gTGlzdDxPcm1FbnRpdHk+IHRoZSBlbnRpdGllcyBmb3IgdGhlIGN1cnJlbnQgcGFyZW50J3MgbmFtZXNwYWNlCgkgKiovCglwdWJsaWMgZnVuY3Rpb24gZ2V0QWxsSW5zdGFuY2VzKCl7CgkJcmV0dXJuIE15QXV0b2xvYWQ6OmdldEFsbEluc3RhbmNlcyhwYXJlbnQ6OkdldE5hbWUoKSk7Cgl9CgkvKgoJcHVibGljIGZ1bmN0aW9uIGF1dG9sb2FkX2NsYXNzZXNfYWRkb24oJGNsYXNzbmFtZSl7CgkJT3JtVHJhY2U6OmRlYnVnKCImbmJzcDsmbmJzcDsmbmJzcDskY2xhc3NuYW1lIik7CgkJCgkJJHBhdGggPSAkdGhpcy0+R2V0TXlNb2R1bGVQYXRoKCk7CgkJCgkJJGZuID0gbnVsbDsKCSAgIGlmKHN0cmlwb3MoJGNsYXNzbmFtZSwgIkhUTUxfRklFTEQiKSAhPT0gRkFMU0UpCgkgICB7CgkJCSRmbiA9IGNtc19qb2luX3BhdGgoJHBhdGgsImNsYXNzIiwiY2xhc3MuYWRkLmZpZWxkaHRtbC5waHAiKTsKCSAgIH0gZWxzZSBpZihzdHJpcG9zKCRjbGFzc25hbWUsICJTRUFSQ0hfRklFTEQiKSAhPT0gRkFMU0UpCgkgICB7CgkJCSRmbiA9IGNtc19qb2luX3BhdGgoJHBhdGgsImNsYXNzIiwiY2xhc3MuYWRkLnNlYXJjaGZpZWxkLnBocCIpOwoJICAgfSBlbHNlIGlmKHN0cmlwb3MoJGNsYXNzbmFtZSwgIkZJRUxEXyIpICE9PSBGQUxTRSkKCSAgIHsKCQkJJGZuID0gY21zX2pvaW5fcGF0aCgkcGF0aCwiY2xhc3MiLCJjbGFzcy5hZGQuZmllbGRzc3lzdGVtLnBocCIpOwoJICAgfSBlbHNlIGlmKHN0cmlwb3MoJGNsYXNzbmFtZSwgIkZJTFRSRV8iKSAhPT0gRkFMU0UpCgkgICB7CgkJCSRmbiA9IGNtc19qb2luX3BhdGgoJHBhdGgsImNsYXNzIiwiY2xhc3MuYWRkLmZpbHRyZS5waHAiKTsKCSAgIH0KCSAgIAoJICAgaWYoJGZuICE9IG51bGwpCgkgICB7CgkJCU9ybVRyYWNlOjpkZWJ1ZyggImltcG9ydCBkJ3VuIGFkZG9uIGR1IHByb2pldCAiLiR0aGlzLT5nZXROYW1lKCkuIjogJGZuIik7CgkgICAKCQkJaWYoZmlsZV9leGlzdHMoJGZuKSl7CgkJCQlyZXF1aXJlX29uY2UoJGZuKTsKCQkJfQoJCX0KCX0qLwoJLyoKCWZ1bmN0aW9uIFNlYXJjaFJlaW5kZXgoJiRtb2R1bGUgPSBudWxsKSB7CgkJLy9PbiDDqXZpdGUgZGUgcydhdXRvLWluZGV4ZXIuCgkJaWYoJHRoaXMtPmdldE5hbWUoKSA9PSAnTW1tZnMnKQoJCQlyZXR1cm47CQkKCQkJCgkJLy8gT3JtSW5kZXhpbmc6OnNldFNlYXJjaCgkbW9kdWxlKTsKCQlPcm1JbmRleGluZzo6U2VhcmNoUmVpbmRleCgkdGhpcy0+Z2V0TmFtZSgpKTsKCX0qLwoKCS8qKgoJICogQXBwZWzDqWUgcGFyIFNlYXJjaCBwb3VyIGFmZmljaGVyIHVuIHLDqXN1bHRhdAoJICovLyoKCWZ1bmN0aW9uIFNlYXJjaFJlc3VsdCgkcmV0dXJuaWQsICRlbnRpdHlJZCwgJGF0dHIgPSAnJykgewkKCQkvL09uIG5lIHJldG91cm5lIHJpZW4gZGUgTW1tZnMgZGUgdG91dGUgbWFuacOocmUKCQlpZigkdGhpcy0+Z2V0TmFtZSgpID09ICdNbW1mcycpCgkJCXJldHVybjsJCgkJCgkJcmV0dXJuIE9ybUluZGV4aW5nOjpTZWFyY2hSZXN1bHQoJHRoaXMsICRpZCwgJHJldHVybmlkLCAkZW50aXR5SWQsICRhdHRyKTsKCX0qLwoKfSAKPz4K]]></data>
	</file>
	<file>
	  <filename>/templates/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/templates/admin.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PHN0eWxlPgoJbGFiZWwuaGVscHsKCQkKCX0KCQoJZGl2LmxlZnR7CgkgICAgZmxvYXQ6IGxlZnQ7CgkJdGV4dC1hbGlnbjogY2VudGVyOwoJCXdpZHRoOiA1MHB4OwoJfQoJCglkaXYucmlnaHR7CgkJYm9yZGVyLWxlZnQ6IDJweCBzb2xpZCAjQ0NDQ0NDOwoJCWZsb2F0OiBsZWZ0OwoJCXBhZGRpbmctbGVmdDogNXB4OwoJfQoJLm9ybWJ1dHRvbiB7CgkJY2xlYXI6IGJvdGg7CgkJdGV4dC1hbGlnbjogbGVmdAoJfQoJYS5vcm1idXR0b257CgkJZGlzcGxheTogaW5saW5lLWJsb2NrOwoJCXBvc2l0aW9uOiByZWxhdGl2ZTsKCQltYXJnaW46IDEwcHggMDsKCQlsaW5lLWhlaWdodDogMjZweDsKCQljb2xvcjogIzIzMjMyMzsKCQl0ZXh0LWRlY29yYXRpb246IG5vbmU7CgkJcGFkZGluZzogMXB4IDhweCAycHggMjBweDsKCX0KCWEub3JtYnV0dG9uIC51aS1pY29uIHsKCQlwb3NpdGlvbjogYWJzb2x1dGU7CgkJbGVmdDogMDsKCQl0b3A6IDZweDsKCX0KCWEub3JtYnV0dG9uOmhvdmVyIHsKCQljb2xvcjogI2ZmZgoJfQo8L3N0eWxlPgoKCnskZm9ybXN0YXJ0fQoKPGgzPkVudGl0eSBHZW5lcmF0b3I8L2gzPgoJPGRpdiBjbGFzcz0nbGVmdCc+PGltZyBzcmM9J2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQ0FBQUFBZ0NBWUFBQUJ6ZW5yMEFBQUhkMGxFUVZSWVI4V1hhMndVMXhYSC83TXpPN003Ky9KcmJhL1hEd3dHQTA0SmtCaUlRb0EwVGhyRktTaEJKTFFmVXRvOGxQUkxGU1VSU3FTcWtLb1NhajZRaDBKVXRhaHE4NlVTb1dxaXRpZ2hKTVU4Z213Z1Rsd2FiQXdHRm1NN2p0ZVBYZll4czd2VGMrNTZ5V0xNMnBZaVphUnI3K3c4enUvK3ovbWZlMWZDOTN4SU04WGZ2bU5YcmMvbldWVlM1RnZsY251V2E1cGFZcGRsYUE2dDFtNjMrNjFNQnNtazJXZWFSamhGbjJQeDJPVm81RnJuYUhpMFBUd3cycjU3OTQ1d29SalRBanl6ZmJ1dnFYN3hrelUxMVM5VlZ2Z3JpendlT0p3T3lEWkFvVDgybTQwK3k1QnNFcXlNaFhRNkRaT0dUYkxCTUV5a0xRdnhSQUtqWStNWUhCenF2QlFLdmRGeDVKTjM5KzNibDU0S2N4UEFxNis5L3RQYmw5MjJwM0hCZkI5Zk5GTXArbXRCb3BmTEZGaFY3V0FGSkJwOG5xWlpaeWg0aWdmZG15UUFockxvS1pza1FkVlVBc3pndjJlNyswK2U2bnIwOXp1M3QrZEQzQUN3WmNzV2Rlc1RUNDAwTlRhNEk5ZWlTSm9wRVZqam9Jb0MxYTZBWkJmbk1wM25BTktUZ1UzVGhFSFBNRFNETUJpcnBkRnpMcGNMN1oxZmR2N3NzVWRXM0JMQXNpenB4TW5PRE1zOVBESkN3U1dTbklKU01CRll5d1pYNmJOaVYrbWFuSjI1YVZCZ1V3U2xlZ0NETUVRcXplcVJFcFN1OHBKaWpFeU1ENjVmM1Z4RjcyV0J4SEZUQ2pvKzc3THE2NnB4WldBUUEwUERJcjkyaFlLcUtuU0hTc1dud3FGcUJLU1NDcFNDVklZQ0drZ1lTU1FUQm1JMERNTWdnQ3lFcmpzUjhQdFJWVm1CN3Q0TFEzZXZXbGw1U3dYNHdxRWpuMWwxMVVFeDB5S2ZWd0JjaThjUmpjWm9kZ25JSkNjclFHa1ZSV21rcUs0eU5FZ3RJMm1BU2dJZXR3dTZTNGZINVlTTjVqZzZQaUZTMDNPK0wvUlF5L3JhR1FHcUE1VVlqMFRFZlI2M0cwVmVOK1ZRcDF5cUhFY0lKMU4wVGhFZmxEb0J5a2VLeUpMSkpDS3hHTVlvY0NLUkZQZjV5RW05ZlpmbUJzQXZsaW5Qbkd1RjZvQXRhT2RDNUFMa1FTOW15M0VSY2cxd3RZdmlJeG00Tm5KUVhJaHpBZ2hTdmxnQmZsRStBTHRBMkRBSE1HbERCdUI4bXlRekE0anpQQUIrQndPY3YzaDVaZ1VPdGgyenFzckxNUkdOWmwzQUR1RFpYN2RobmdMVEFIQ3V1Ujh3RUN2QUt2TGhwVlJlQ0lXdVBOeHliMDFCRy83bmVIdUdpNGc3bWJDYmtENmJnbXdmbUIxQUxnVVo3cFJVcEU1eXp2QlllT0NCZFd1REJXMTRyT08wTmErNkNxR3JnL2htZEV3MEVxZm1nRTY5d2FVN0pqdWhJbG96ZzNFblpOc2xxUEE0QlFucUEzRnlUWnpPdVFCdGRJK2Zla0F3VUlHZTNyNkJlOWV1cmlyb2dvL2JqZ3NiY29FWGt3M2o1T3V4aVloSVNZd3FteTl3NERoWmpsczB6MUNtTllFVjRwbEtaRHd2S2VqeHVGRGk5UXJGMklic0hMWmg2LzBiQ3R2dzRPSGpWbTB3Y04yR3V0TkpmdGFGRFoyYVJqTmlaM05BV2c4bWJaaXJlczYzU1gyQkZZakc0b2hFcjRtdW1MTmg5L21Mb1I4L01BUEFSd1JRTndud1hkdHdWZ0FmSGo1bTFWVmxGWml0RFQ4K0Y4ZWVqamo2SjZnTnp1S2dpZlhTZUxsLzUyM3YzYlFXSFBqMHFGVkxCVE1YRzk2M2R4aS9makNJUlJXNldJWUxIUnl3WnlpR0YvOFJDbC9aMFZSNkF3Q3Zob2VPbnNnVWVUMXpzbUh6bnEreCthNDZkQXlrUURWWjhLQjZSWE5Bd2Y3UExpSDBtNldUVlpUM1NOdUpEbXRCWGMyY2JNZ0E2Mit2UmU5b2RqMVlFMVN3YlptR1VxZUVydUUwM3V4SVlDenhMVmxEc1l6RFgxeWVIdURBSjIxV3c3eTZPZG53MmFObFdQZURHdlNHMDFoUnFlQ2RWaGYrZm5vSVhhRnhiRnhaSmZySGt4K1FJeVpMcEtGRVJsdFhhSHFBZng5cUV3cmtWc044RytvT3g3UTJyUHZ0V2R6VGxBWFk5VVBhZ3NVbjhNTDcvWkFkYnRnVFlmenJWeXV4czgxQWUzOVdJUVk0Y21hV0FGTVhvK2xhTWFkZzdWSUNHRWxqNzhNeTJ2c204SWN6cnV4U1RjM3BqNjB5UHVoTzRaOFhsQ3hBcVl5ai95c0FzTEMrVm5TL3FYM2dWbXNCQTl5OXFCcm5DT0Q1bFRIYzAxaUdKL1pUTXpJc05GWEkrTk1qYnZ6a3o1ZHhNZWtUQUFzSjRGalBsWnRUUUp0U2VldTJwNUxMbHk2UjQ3ekZvbjdPWFl5MzRJVVdJd1pZVXg5RUR4V2NNeGJDMzU1ZENLK3VZU0JpWVVHcERSTXhBNC8vWlJSaFV4TUFpL3d5VHZUMVh3ZGdLK2FHdkd2MzI3OWJzN3I1eGNweXYranhvbmJKV3hML0ZxQTJ6QzJZMTRMOFhmR2Ridy9oanNvQStadVczMHdLdHZCWDJOUk0rOEF5TnpwN3Y4RXZXdXBSWHVyRnRyOUdFSTVscUYvSU9EVTR3QURzU3NnME9Ea3FEMTNYMVIrMWJscXlkdDJHbnpjdWFkenNMeTUyOHNMaXBBTFVhR09xMEVaVXBwMnlqUjdsTGJ0bFpiRHM5WDRzOXdYUVBaamRCY09pblhKc0JGYUtWa1BWQmNVWXhydlBOK0hUY3pic1BXS2drWnpTT1M0QUZBYmc0QUxBN1hacnRJbFFLZmQ4VGx0T1NDMnRHeGZQYjFpd3RNSWZhUFI2UFdVK3I3ZkI3ZEh0dEV1Mks1TGlTRm1weEhQSEEvUHZLQW5nN0swYUVVRW1oNytDN0N5RzZxM0NZbXBFcDhMZkFqQUVCK1BCYXVRVXNYazhIcGxnYkpORDR2OTU2UkpkbEw2VHkxNCsyYlY1UmRDVlNNdXdreks4VzU3YTR6bVZ2Sk0yS1owT09ZMzlwNjlHcVJVWFQ3MHZ2eDd5UDNPczNMMDNQRU8vZUlxOFQrLzdwVnc4N3hXNndQQXpIZ1NUem94ZGZmWHE3cGEzWnZ4MVBPUGJBQ2VuajlTeTArcDVYYkU4cFlSUVBNaFJHUjYweTBwSEloR1R2alArRDFmY0NZTFpHQXFhQUFBQUFFbEZUa1N1UW1DQycgLz48L2Rpdj4KPGRpdiBjbGFzcz0ncmlnaHQnPgoJPGxhYmVsIGZvcj0neyRpZH1jaGVjaycgY2xhc3M9J2hlbHAnIC8+V2lsbCBwcm9wb3NlIHlvdSBhIHBocCB2ZXJzaW9uIG9mIGFuIGVudGl0eSBiYXNlZCBvbiBpdHMgbXlzcWwgdGFibGUuIExlYXJuIG1vcmUgYWJvdXQgdGhlc2Ugb3B0aW9ucyBvbiA8YSBocmVmPScjJyB0YXJnZXQ9J19ibGFuayc+dGhlIHdpa2k8L2E+LjwvbGFiZWw+Cgk8YnIvPgoJPGEgY2xhc3M9Im9ybWJ1dHRvbiB1aS1zdGF0ZS1kZWZhdWx0IHVpLWNvcm5lci1hbGwiIGhyZWY9InskZ2VuZXJhdGVVcmx9Ij4KCQk8c3BhbiBjbGFzcz0idWktaWNvbiB1aS1pY29uLWNpcmNsZS1jaGVjayI+PC9zcGFuPgoJCUdlbmVyYXRlCgk8L2E+CjwvZGl2Pgo8ZGl2IGNsYXNzPSdjbGVhcic+PC9kaXY+Cgo8ZGl2IGNsYXNzPSdsaW5lJz4KCTxoMz5BdXRvLUNoZWNraW5nPC9oMz4KCTxkaXYgY2xhc3M9J2xlZnQnPjxpbWcgc3JjPSdkYXRhOmltYWdlL3BuZztiYXNlNjQsCmlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFDQUFBQUFnQ0FZQUFBQnplbnIwQUFBQUJtSkxSMFFBL3dEL0FQK2d2YWVUQUFBQUNYQklXWE1BQUFzVEFBQUxFd0VBbXB3WUFBQUFCM1JKVFVVSDNnY0REeGM3KzZHT2pnQUFBMGxKUkVGVVdNTzlsczlyWEZVVXh6LzMzUGZtWmVaTlhycm9KQ05ESFZJaG9CUkNOK0lJUmVuT2hZaDA0VUowcXdzWHJnUVJGeXBDM2ZsSDlBOW9GNkxnUWxCVWFFQ0twU1JDRE9rUHRERnFER25tWmZMZTNPTmlNbWxlNWtkZUp0T2N6ZVBkSCtkODd6bmZjNy9YY01DZS91d0hxWVNGdWpIR0dvYWJBc2JBUnR6bXpJVGxxUFZkY3daOXNCSGZYZnZrcFJUQU96ZzVGZGdMbXp2cDk0QS95SUhwQmdkU05idzZGM0xqdDBjVTVQRzREZ2R1THRhaUs5L0ExejBBa3Jiem5WSld4U1p0N1hIa2llSDVxa2ZxSUhIdzlqTXAzeTcrenNjWHExeS9ML2dDWW1EeG56YWJMZGNEM04vTGErQ1pjTjluUDVRVHZ1WGR4bE40aHdwaDNTNFhrbVZTWXp2L3dKWDVHV1QzRWUrZDc2d1JkZHc3WDJQVFJwbTliYWRjKytVaFd6dnBIcHdoQUY2b1IzeHd1ZDQ3MFU3NStlWTZ2dCtwa0dvblI2WjBwa01Jb04xdTg4YXo1eWhIVXozYi85aHFjZVAyZWphckE4bmlGSkhIU0ZVVll6MGFqVVl1c3FrcXhtVDNheDl5eUNDRzk1RFA1T1Y1Yi9CaDVnMmJiRGFicks2dVpzYm01dWJ3dktIYmVvS3I2bWdBa2lRaERNT01vemlPbVp5Y1pHTmpJOWNKcmJWRVVUUVFoSmZuSk4ydnFpTFNxVnFhcG4xUFd5Z1VzalVXR2IwRWVldDlFSEFVUlVQWEhBdUF0YmJIUWJmK2xVb2xOd0dOTWFPVklBekREQWZ5c1B3NDNUS3dEVS9UaG1aZys5NWRscis4aWhGQjFRSENjNTkrZ1IrV1IrYkpzVExnRm41a1p1bFhLcmR1Y3E1VVpHYnhGcnNMUDUxZUJrUUV0WmFnY1ltcDl6L2tyN2RlUjB3SDg4cktTaTRPRkFvRmFyWGFhQ1JFQVZWS3I3ekcranR2NG5iaS9ZdTZIOWxFaEhxOVByNDJsTE5uSVpqZzM4OC93aFJMU0xtTXJWUlJZSFoyTm5lYVIyN0Q0cVhMVEx6NDh1SExBWE5hSE1BSXhwTVRxZDNKMm5CN202V2xwWXdXek0vUEg2bUdZK05Ba2lSTVQwOW5IRFdiVGFJb0lvN2pJN1BRRmE4Z0NFYmpnSWpnbk5zUDVKemIxNGRCY254WS9YemZKd2lDazZsaFAvVDl4a1NFYXJVNlhqVVVrVXdHdXZXdjFXcFB2ZzFMcFJMRll2RkVhamRhRjdoT214a3p2b0RHR05ScFBnQkprdkRuMmtQc0dFL3JWR20xV2tjQTJJdDNleTNtNm5mM3NUSk9BTER3SURrWXBnK0FOR2tiYkxxMXEzeTE0c2IrK0ZBVUZFbVRKT2tQNE8vVk95WW9OenpGUHNGSGtDNy90M09uKy9NL1dMUkdCRUV2QnRVQUFBQUFTVVZPUks1Q1lJST0KJyAvPjwvZGl2Pgo8ZGl2IGNsYXNzPSdyaWdodCc+Cgk8bGFiZWwgZm9yPSd7JGlkfWNoZWNrJyBjbGFzcz0naGVscCcgLz5XaWxsIGFsbG93IHNvbWUgY2hlY2sgb24geW91ciBjb25maWd1cmF0aW9uLiBMZWFybiBtb3JlIGFib3V0IHRoZXNlIG9wdGlvbnMgb24gPGEgaHJlZj0nIycgdGFyZ2V0PSdfYmxhbmsnPnRoZSB3aWtpPC9hPi48L2xhYmVsPgoJPGJyLz4KCTxhIGNsYXNzPSJvcm1idXR0b24gdWktc3RhdGUtZGVmYXVsdCB1aS1jb3JuZXItYWxsIiBocmVmPSJ7JGNoZWNrVXJsfSI+CgkJPHNwYW4gY2xhc3M9InVpLWljb24gdWktaWNvbi1jaXJjbGUtY2hlY2siPjwvc3Bhbj4KCQlDaGVjawoJPC9hPgo8L2Rpdj4KPGRpdiBjbGFzcz0nY2xlYXInPjwvZGl2PgoKCTxoMz5TZWxlY3QgdGhlIHR5cGUgT2YgQ2FjaGU8L2gzPgoJPGRpdiBjbGFzcz0nbGVmdCc+PGltZyBzcmM9J2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQ0FBQUFBZ0NBWUFBQUJ6ZW5yMEFBQUlFVWxFUVZSWWhiMlhhM0NVMVJuSEgrdHRwcTBqVmt4bjJpOGRlOU5xbGFtdHREaUNlRUhyV0dzZDIrazQ2clJUblhhY3FneGFvTFVpbFpzaG1rQ1dCQklnMlNRa0lSQUMwdHdESk5uTmJuYXp0K3o5K3U0bXU3bVFHN0RaRUhMLzlVTVdocUFrZ2pOOVp2NmZ6anZuK2Ivbm5OL3puQ015TjI1SXk4bGJtcm0vZUV1V3VzeVJwVDRZelM0OHhKZFJsdnBnTkV0ZDVzamNYN3dsTFNkdnFZamNJTmNRTjZyeVNsS3ppdzVSVkZGRFphTUJ2ZDFQbTFzaDBoY25mUHJjdklyMHhXbHpLK2p0ZmlvYkRSUlYxSkJkZUFoVlhrbXFpTnk0VVBLYk12T0tqeGNjcWNMa0R1UHQ3TU1kNmNVVjdzR3BkT05VdW5HRXV1YlZ4ZTljNFI3Y2tWNjhuWDIwQjZJVUhLa2lNNi80dUlqY05KK0IyN0lMeTdCNE9qQjdPakM1dzdTNWxLOGtrenVNMlJQQjR1a2d1N0FNRWJsdFBnTjNxZkpMVUxvSDBaamRhTXh1dEJZUFdxdVhsbXVVMXVwRmEvRmNta2ZwSGtTVlg0S0kzRFdmZ1JSVlhnbm5weUFZNjZmSjZLUk9hNkZlWjZWQlo2VkJiK1BFQW1yUTIyalFXYW5YV2FuVFdtZ3lPZ25HK2prL0JUa0hEaU1pS2ZNYnlDK2gwV0JqY0dTTWtRa1lHQjRqRU8zREdZaWh0M25SbUZ6elNtL3o0Z3pFQ0VUN0dCaWVuZVAwdVJFYURiYUxLN0NBQVhVcDFhZGFxV3pVb3pFNWNBYWpSUHZQMFhzbVFXSmltdUh4YVliSHBvbVBUYzNSOE5qc1dHSjhtdDR6Q2FMOVozR0dvbWpOVHFvYlc2bHBOS0JTbHk1c1lGZCtDYlZOQm1vMVJ1cTFaazdxclRRYUhHaE5idlJXUDIyT0VGWlBCdzUvREk5eUdtKzRIMmVnRzV1M0U3TkxvZFVXb01Yc29jbm81RlNyallZV0MzV2FOdXFhMjFEbGZ3a0RxcnhpNnBxTjFHbmJPS0d6MEdob24xMWFxeGVqUFlqRkhhYmRGOFVWN01ZYjdzTVg2Y2NkNnNIdWoySDFSR2h6aE5EYmZHak1IaHFOVGs2MnRsT250VkNyTWJNanIyeEJBNHMzcHUyb1BWQlJUWDJMaVpONkswMUcrd0lHQnVZYWNJYlIyeFdhYlJGT21rUFVHd05VNnp3VVY3V3labXYyVVJGWlBKK0JSUitsN2F3cUtxK2s4RWdWdGMxR05DWW5MUllQaG5ZL0pxZUN6UlBCN28vaER2WGdpL1RqN3hqRW8vVGlDSFJoODNYUzV1ckVwSzFEVVMwanFGcE9VTFdTMEs0blVMS2VSTWwrbXVEdVp3bmtQRTl3MzRzRTgxNUNSRzZaWXlBanQ1Q3VnVGdsUjJ2WXVhK1lQWVdIS1R2ZXdHZjFPaG9OZGpRbU56WnZKOTd3YVFLZGd3U2paL0JGK25DRmV0RGJBcHd5K1RBZXkyS281VU9ZOURMUms4bEViM1pTS2lhSFNoa2ZQSVl2NTNrT3JsdStYcTRvVEl2VGM5Vm9UVTc2NDZQRStzNWljUWVvMTdSeCtMOG5LRGhjU2NHaFNvcktxeW1wcUtYa1dEMEhqelZRWEZGSFVYa05CWWRyVUI4NWlTYjNUVVlDK3hqdnpTZmV0cEs0NlNuaXBpZUpXNTVoWmtJaFd2RUN4b3huUWlKeWo0aDhmYzRoek1oVlU5TmtvTHFwbFJhTEM0L1NSZmZRTVAzeFVjNVB3Y2prckJJVE15UW1wcE9hWVdSaWhwRXBHQUdDQmE4d2VmWVVJNzUzaU51ZUkyNzdMWEhyYzR6MTdDZmhmeC8zcm1kWTg3dDdYMHVlaDYvTk1aQ2VxNmEyMlVpdHhraERpemw1RUIyMG1OMjAydnlZbkNHc25rNGMvaTQ4U3Q5bEdFWXh1enZSdWZyd3EzNE9vMmFHMjMvRHNQMGxoaDIvSitGNmhZbWhNanJMZjAzRDVoV25ST1J1RWJuMWN4aG01S2hudWIwT0RDMitMa3phRTRTTG5tZHlxSUtFOHc4a1hDK1RjTDNNaGNnR0V1Ni80bEt0NHR0MzNyeFVSRzZYTDdnbkxINS9TMXJ0Z2FNMTFPdXVGY011TFA1ZXJGVjdPRjMvT3VQZGFZeTRYMlhFOHlmT2UvL0NXTWRhbE5MbjJQL1dRenRGNUx0eWxiYTg2TjliUDYwNlVGNTFWUXl0VjhIUUh1akdFdWpEV3JxV3MrYTFqSFg4aS9QKzF6bnZmNFBSNEJ0RWo3K0FiZnVqdEtldndKNnhBa2ZHWXpneUg4ZVY5UlR1M1U5ZnduRlJXdFpldWdhSEtUbGFlMVVNbmNIdXoyT29uTWJrRzhDKzUwVkdReHU1b0t4bU5QVDNwTjVrY2lDZnFhRjhwcytvbVQ2cmhuZ2gwK2VLQ0JZOWkyNzc4cFBKTFpIRjI3TnkwWnJueDdEd1NneVAxRkZVWGtmK1VRM09qKzludXY5REptUHZNaEY5ai9IT05ZeUYzK2FDOGhZWGxMY1pDNy9OZU1kcXhpS3I4ZTFmUmRXR2g1dEY1TUdMOVNBbE5TdjMrakNjbkVYUXNmVnVsUHhsaFBJZkpaRC9HTjY5SzVnZXJtYXNheHNYT3Y3QmVHdzk0OUYxZVBjOVJlVUhEMnRFNUdjeWUwbTVTVVFrWmZ1dTNPdkQwQmZEN0lsaWNQZWljL2JTYU85RFUxbEVxT2h4bU9saHJITWRFOTBiR1BHOWgydjNTcmE5ZXM5V0VWbVNyQVdYTHFzcHFhcWM2OFp3dGh1R2FiVXJOTGZIYU52OUVrUEdOY3ljTzhoVTMzOFlEYXlqZmNjeVBuN3RSMXRFNUY0UnVlTktHbEpTZCtWUTAyeTQxQTBYTm5CRk4zUW90Tm9WdEFZejFrMTNNeE92WUdid0V5NkUxbVBPZUpUVVY3Ky9XVVIrbk56ek9WVlFST1N1OXpkdGE5NjVWMDFOczRIbU5nY2FreE9kMWZ1RkdQbzdCZ2gwWHRZTnZSMllYQkZhWFRFTTVadng3UGtWakpVeUh2a0FhL292MmZqaCt1YmtuMzloY2trT1BQRG1tdlVIdCszY3pjNjlCUlFjK296S0V6cnF0U2JhZlRGY29XNjhrWDVDMFNFaVBjTjA5Q1pRdXM3ZzZ4akFyZlRTSHVpbFN1L0htdkVJUThiVlRQU2s0VWhmd2o5WC83a2tlZHJ2dUZweVNlN0huU0p5bjRnc1gvSGtxcmYrOXM2N3BSOXMyeDdaK0hGNi81YU1YV3hPVjdFNVBaTk42WmxzK3ZReXBhdjRLR00zRzNia2tmSEp4dkgyN1Q4aFd2MEsrclJmOUQ5eDN6Zi9LQ0wzaThpM3JsWUJMNDhiUmVRYk1udDErcDZJL0ZSRWxvckljaEZaS1NKUExLQlZGV3QvVUcvN1pBbTZyUThNaXNnanlYbHVreS94TkxzOGJoQ1JtNU5tN3BCWlhGSVcwcTIzeWcrdG55N0JrUHBnUWtTV2ljaDNaTGJNWHRNRDlhdkU3VEs3YWc4bGs5LzgvMHA4TVc0UmtVVkpYVlB5L3dFc2JoQklmS1l2OWdBQUFBQkpSVTVFcmtKZ2dnPT0nIC8+PC9kaXY+Cgk8ZGl2IGNsYXNzPSdyaWdodCc+CgkJeyRzZWxlY3RDYWNoZX17JGRlbGV0ZUNhY2hlfTxsYWJlbCBmb3I9J3skaWR9Y2FjaGUnIGNsYXNzPSdoZWxwJyAvPkxlYXJuIG1vcmUgYWJvdXQgdGhlc2Ugb3B0aW9ucyBvbiA8YSBocmVmPSdodHRwczovL2dpdGh1Yi5jb20vYmVzc3Rpb2xsZS9vcm0tbXMvd2lraS9NZWNoYW5pc20tQWR2YW5jZWQnIHRhcmdldD0nX2JsYW5rJz50aGUgd2lraTwvYT4uPC9sYWJlbD4KCTxici8+Cgl7JHN1Ym1pdH0KCTwvZGl2PgoJPGRpdiBjbGFzcz0nY2xlYXInPjwvZGl2Pgo8L2Rpdj4KCjxkaXYgY2xhc3M9J2xpbmUnPgoJPGgzPlNlbGVjdCB0aGUgbGV2ZWwgb2YgbWVzc2FnZSBpbnRvIHRoZSBjb25zb2xlPC9oMz4KCTxkaXYgY2xhc3M9J2xlZnQnPjxpbWcgc3JjPSdkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUNBQUFBQWdDQVlBQUFCemVucjBBQUFINEVsRVFWUlloYldYeVc4YjV4bkdCZVRVU3c5dEQxM2NCZ2lDSklLejNKTUFBWklBUVJEa0g4aTU2S0ZvRGtFRHV4YUNKb2NBQ1pEV3NKRWlobzNBc21UWnBoYUt0QzFib3BaWUlqVmFLSEhmUkVta1JJN0lJWWZia0p3WmNvYkxyd2RiZ2h6Yk1WT2dIL0FjdnRQeis3N25mZDl2cHEvdjRmWE1tMisrK2FkMzMzMzN1ZitIWG4vOTlXZjcrdnFlNlh2UzZ1L3YvOTJGQ3hkR1BSNVA1SUdpRDNTMDkzcTlVWi9QRi9INWZKRkFJQkFOQm9QUllEQVlDWVZDa1ZBb0ZBMkZRdEZ3T0J3Smg4T1A3QzlkdWpUKzJtdXYvZUdKQUsrKyt1cUpHemR1Q0lsRWd1TktKcFBzN2UyUlNxVklwOU9Jb2tnbWt5R2J6U0pKRXJsY2pudytUejZmUjVabENvWENZMlcxV2xmNysvdWZmVHJBN2k2SjNWMFNpUVI3ZTN2czcrOC8xdmpROE5DMFdDeFNLcFVvbFVxVXkrVWZxOXM3UUNKQjBuS2QvZXNqcEM1L2p4aUpJSDU3anN6SU1KbHZ2a1lVMDl5ZXVrMG9GTVRyOVRBN04wc2tFaUVROE9QMWVoQkZFWS9YZzlmblpWbFlwbHF0VXExV3U1T1RrNzBCSkpOSjl1OU1rYjR6aFRneVJDWVlKSE45QkducEhya2JJeVFTdTh6TnorRjBMaEdOUm5FNmwvRDcvUWdyQWo2L2oyUXl5Y2FHbTNYM091dnJheWlLZ3FxcTJPMzJwd05ZTEJiaDhNb1BEZzRldXU1Q29YQjB2WlZLaFdxMVNxMVdvMTZ2bzZvcW1xYWhhUnE2cnFQck9vMUc0eUhkdkhuejZRQmpZMlBDY2ZOY0xvY3N5MGY1VmlvVkZFVjV4UGpRc05sc1loakc0OVR0R2VEZzRJRE0vQ3pTL0N5NTI3Y29paUt5ZFl6aXZJUFN4QmlWU29XMTlWVnkrUnlwZElwd09FUmV6cFBMNThoS1dlcjErdjNpVGUzajlYbW8xK3VZcHRrYndQajR1SkROWnBIdVRwRzdmUk41WW94eU1rbmgyakNWcFVWS2c5OXprRG5nN3ZRZG5DNG5PenM3TEM3ZXcrLzM0VnAyc3U1ZUo1WGF4NzNoWm0xdEZhL1BRN1Bab04xdWMrdldyZDRBY3JrY3NpaFN5bVlwSjNaUkpJbWFsRVdWWlRSWlBzcTZWcXVoS0FybGNobGQxNm5YNitpNmptRVlOSnNObXMwR3hXS1JWcXRGcDlQcEhVQ1c1YU84cTlVcTlYb2RUZE1leXRnMFRWcXRGcTFXaTNhN1RidmRwdFBwL0pTNlBRRk1URXdJeFdLUm9zOUhPUmhBV1YxQnExYXByUXBvMFNqcTJncUdZYkN6czMxMDZrSkJSbFZWR28wR3VxNWptZ2F5Zkw5cllyRW9qVWFEZHJ2ZE8wQzVYS1k0ZllmeUxUc1ZteFZOVEtNTVg2SHVtRWE1K0IyRlFvRzUrVmxXMTFhSlJpTTRIRE1FZ2dGY0xpZUNzTXorL2g2Ym5rM1czZXU0WEU0VXBZSnBtcjIxb2RWcUZTcVZDdFYwaXZxQmlMb2RwMUVxMGRqZnc1QmxEREdOcnV0SWtrU2hVS0JTcVNCSkVwVktoWHcrUjZsVW9scXRJa2xaTXBrTW9paWlxaXE2cnZjT2NKaTdydXVQWkg0ODYzYTdUYXZWd2pSTkRNTTRpa0RUTk9yMStwRWV6SXh1VDVQUVpyTUp0Vm9OTlpOQnowazBVdnVZaGtFem5jSXNGVEhGTkoxT2gyS3hlR1I2T0JFUHUwSlJGQ1JKUXBJa1JGRkVsdVhlSHlPYnpTYW9xa3AxemtGdCtnNzFtVHVZcFJLMWE4Tm9NM2VwZnZjdGlxSXc0NWdoRVBBVGkwV1ptNThsRVBDenNycUN5K1VrdmgxbldYRGhkQzB4UGpGR1BCNG5uOC8zOWh6YmJEWkIwelMwV0JROUhrTnpMV0ZJV1JvYjZ4akpCQTJ2aDRwU0liWVZZMnNyUmlLeGk4ZnJZWHM3anRmbkpSd09zNzI5amNlemlkdTl6ckt3ek5iV0ZxSW9NalkyMWh2QTRUQjVYTzZIbVRlYlRWUlZwVnF0VWk2WEtSUUtTSkxFd2NFQnFWU0taRExKenM0TzhYaWNlRHpPOXZaMjEyS3g5QWJRYURRd1ZCVlQwekRyOWZzRnAybTBHZzJNYXBWbXM0bWlLRWZtK1h5ZVRDWkRPcDBta1VnUWk4WHdlcjJzcmEyeHRMU0VJQWlzcnE1MnIxNjkyaHRBczlsRWRTNmkzVnRBZFV6VEtwZFF4MGRSSFhkUmhpNmpLQXIzRm44Z0Zvdmk4WHFZbVpsbWMzTVRwOU9Kd3pIRHdzSUNvNk1XaG9lSCtQZlpmekUrUG83ZGJ1ZlNwVXRQQjdEYjdZSmhHR2diYm5UM091ck1YVnI1UE5yMEZMcmZTOVZ1SlpQTk1MOXcvNE1rR0F3d08rdGdjV21SU2Rza1krT2pYTDkramZQbnovSFYxMS94K1JmLzVQejU4d3dORFhXKy9QTEx1WmRmZnZtUFBRR1loa0hMTkdrYkJwMVdpNVpoWURhYk5GU1ZlcjFPdVZ4R2xtWEVBNUZFSWtFNEhNYmxjbUczMjdGWUxJeVBqMk96MlppZm4rOHVMQ3gwTDF5NEVIcnJyYmYrY3VMRWlWLzBCUEM0NGpNTUExM1hxZFZxUjltTG9zak96ZzRiR3h0TVQwOHpPRGpJMnRvYXBtbFNMcGU3UHArdmMvbnk1ZEFiYjd6eDUrZWZmLzZYVHpRL0RtQ2FKbzJkYlpxN096VDlYdHE2anU1ZVI0OUdxQW91RkVYQjcvZVJUcWVKUkNNSUt3SUxDd3RZTEJiT25Udkg1dVltcFZLSlFDRFF2WHIxNnRZNzc3enoxNU1uVC83cUo4MS9ES0Qrc0lEbW1FYWJ1VXVyWEtJNk1rUnQxa0hwUCtkSnAxTk1UazR3NDVoaFpVWGcydlVSUnE2TjhNMi92dUdMTHo3SEgvQVRDQVM2bzZPamUyKy8vZmJmWG5ycHBWOC8xZnpIQUlZc1l4WUxHSWxkV3VVeXpkUStEU2xMTGJGTG9TQ1RTT3dTMjRvUkNBWllXbHBrYW1xS2l4Y3ZjdmJzMmE3YjdlNU9URXlrUHZqZ2c5TTluZnh4QU1kcm9OMXVQelI4RkVXaFVDaVF5V1JJSnBNRUFnSG01dVlZSGg3dVhybHlwVHN4TWJIMy92dnYvLzJGRjE3NFRjL21Ud0RvZGpxZDdyRWk3R3FhMWoxV2hOMTBPdDNkMnRwQ0VBVHNkbnQzY0hCdzc4TVBQL3pIeVpNbmYvdXp6UHY2N3YrY2Z2VFJSOThOREF4WVAvdnNzMGMwTURCZ0hSZ1lzSjQ1YzhaNjVzd1o2K25UcDYyblRwMnlmdnJwcDlaUFB2bkUrdkhISDF2ZmUrKzlVeSsrK09MdmY3YjVnL1ZNZjMvL3M2Kzg4c3B6LzZ0K1Z1WjlmWDMvQlhQeXBSdlNEWTQ2QUFBQUFFbEZUa1N1UW1DQycgLz48L2Rpdj4KCTxkaXYgY2xhc3M9J3JpZ2h0Jz4KCQl7JHNlbGVjdExvZ317JGRlbGV0ZUxvZ308bGFiZWwgZm9yPSd7JGlkfWxldmVsJyBjbGFzcz0naGVscCcgLz5MZWFybiBtb3JlIGFib3V0IHRoZXNlIG9wdGlvbnMgb24gPGEgaHJlZj0naHR0cHM6Ly9naXRodWIuY29tL2Jlc3N0aW9sbGUvb3JtLW1zL3dpa2kvbG9nLW1hbmFnZW1lbnQnIHRhcmdldD0nX2JsYW5rJz50aGUgd2lraTwvYT4uPC9sYWJlbD4KCTxici8+Cgl7JHN1Ym1pdH0KCTwvZGl2PgoJPGRpdiBjbGFzcz0nY2xlYXInPjwvZGl2Pgo8L2Rpdj4KCjwvZm9ybT4KCjxoci8+eyoKPHVsPjxsaT48Yj5ERUJVRyA6PC9iPiBFdmVyeXRoaW5nIHdpbGwgYmUgd3JvdGUuIEVWRVJZVEhJTkcgITwvbGk+CjxsaT48Yj5JTkZPIDo8L2I+IHRoZSBkZWZhdWx0IHZhbHVlLiBHcmVhdCBmb3IgYSBwcm9kdWN0aW9uIGVudmlyb25tZW50LjwvbGk+CjxsaT48Yj5XQVJOIDo8L2I+IHdpbGwgYmUgZGlzcGxheWVkIDogdGhlIGVycm9ycyBhbmQgdGhlIHdhcm5pbmdzLjwvbGk+CjxsaT48Yj5FUlJPUiA6PC9iPiAgd2lsbCBiZSBkaXNwbGF5ZWQgOiB0aGUgZXJyb3JzLjwvbGk+PC91bD4KPHVsPjxsaT48Yj5OT05FIDo8L2I+IHdlIHdvbid0IHVzZSBjYWNoaW5nIHN5c3RlbSA6IEdyZWF0IGR1cmluZyB5b3VyIGRldmVsb3BtZW50PC9saT4KPGxpPjxiPkNBTEwgOjwvYj4gdGhlIGZyYW1ld29yayB3aWxsIHRyeSB0byByZW1lbWJlciB0aGUgbGFzdCByZXNlYXJjaCBidXQgb25seSBmb3IgdGhlIGN1cnJlbnQgY2FsbCBvZiBQSFAuPC9saT48L3VsPip9Cgo8cHJlIGlkPSdvdXRwdXQnPjwvcHJlPgp7bGl0ZXJhbH0KPHNjcmlwdD4KCmZ1bmN0aW9uIGRvVXBkYXRlKCkgewokLmFqYXgoe3R5cGU6ICJHRVQiLCB1cmwgOiAiey9saXRlcmFsfXskdXJsTG9nfXtsaXRlcmFsfSIsIGNhY2hlOmZhbHNlLAogICAgICAgICAgc3VjY2VzczogZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgICAgICAgIGlmIChkYXRhLmxlbmd0aCA+IDQpIHsKICAgICAgICAgICAgICAgIC8vIERhdGEgYXJlIGFzc3VtZWQgdG8gYmUgaW4gSFRNTCBmb3JtYXQKICAgICAgICAgICAgICAgIC8vIFJldHVybiBzb21ldGhpbmcgbGlrZSA8cC8+IGluIGNhc2Ugb2Ygbm8gdXBkYXRlcwogICAgICAgICAgICAgICAgJCgiI291dHB1dCIpLnRleHQoZGF0YSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBzZXRUaW1lb3V0KCJkb1VwZGF0ZSgpIiwgMjAwMCk7CiAgICAgICAgICAgfX0pOwogIAp9CgpzZXRUaW1lb3V0KCJkb1VwZGF0ZSgpIiwgMjAwMCk7Cjwvc2NyaXB0PnsvbGl0ZXJhbH0=]]></data>
	</file>
	<file>
	  <filename>/templates/admin_check.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PHN0eWxlPgoJbGFiZWwuaGVscHsKCQkKCX0KCQoJZGl2LmxlZnR7CgkgICAgZmxvYXQ6IGxlZnQ7CgkJdGV4dC1hbGlnbjogY2VudGVyOwoJCXdpZHRoOiA1MHB4OwoJfQoJCglkaXYucmlnaHR7CgkJYm9yZGVyLWxlZnQ6IDJweCBzb2xpZCAjQ0NDQ0NDOwoJCWZsb2F0OiBsZWZ0OwoJCXBhZGRpbmctbGVmdDogNXB4OwoJfQoJLm9ybWJ1dHRvbiB7CgkJY2xlYXI6IGJvdGg7CgkJdGV4dC1hbGlnbjogbGVmdAoJfQoJYS5vcm1idXR0b257CgkJZGlzcGxheTogaW5saW5lLWJsb2NrOwoJCXBvc2l0aW9uOiByZWxhdGl2ZTsKCQltYXJnaW46IDEwcHggMDsKCQlsaW5lLWhlaWdodDogMjZweDsKCQljb2xvcjogIzIzMjMyMzsKCQl0ZXh0LWRlY29yYXRpb246IG5vbmU7CgkJcGFkZGluZzogMXB4IDhweCAycHggMjBweDsKCX0KCWEub3JtYnV0dG9uIC51aS1pY29uIHsKCQlwb3NpdGlvbjogYWJzb2x1dGU7CgkJbGVmdDogMDsKCQl0b3A6IDZweDsKCX0KCWEub3JtYnV0dG9uOmhvdmVyIHsKCQljb2xvcjogI2ZmZgoJfQoJLmhpZGRlbnsKCQlkaXNwbGF5Om5vbmU7Cgl9CgoJLmRpdl9fb3V0cHV0ewoJCW1heC1oZWlnaHQ6IDMwMHB4OwoJCW92ZXJmbG93OiBhdXRvOwoJCWJvcmRlcjogMXB4IHNvbGlkICMwMDA7Cgl9Cjwvc3R5bGU+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9J3tyb290X3VybH0vbW9kdWxlcy9Pcm0vanMvZGlmZnZpZXcuanMnPjwvc2NyaXB0Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSd7cm9vdF91cmx9L21vZHVsZXMvT3JtL2pzL2RpZmZsaWIuanMnPjwvc2NyaXB0Pgo8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJ7cm9vdF91cmx9L21vZHVsZXMvT3JtL2pzL2RpZmZ2aWV3LmNzcyIgbWVkaWE9InNjcmVlbiIgLz4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgoJZnVuY3Rpb24gZGlmZlVzaW5nSlModmlld1R5cGUsaWRiYXNlLCBpZG5ldywgaWRvdXRwdXQpIHsKCSJ1c2Ugc3RyaWN0IjsKCXZhciBieUlkID0gZnVuY3Rpb24gKGlkKSB7IHJldHVybiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7IH0sCgkJYmFzZSA9IGRpZmZsaWIuc3RyaW5nQXNMaW5lcyhieUlkKGlkYmFzZSkudmFsdWUpLAoJCW5ld3R4dCA9IGRpZmZsaWIuc3RyaW5nQXNMaW5lcyhieUlkKGlkbmV3KS52YWx1ZSksCgkJc20gPSBuZXcgZGlmZmxpYi5TZXF1ZW5jZU1hdGNoZXIoYmFzZSwgbmV3dHh0KSwKCQlvcGNvZGVzID0gc20uZ2V0X29wY29kZXMoKSwKCQlkaWZmb3V0cHV0ZGl2ID0gYnlJZChpZG91dHB1dCksCgkJY29udGV4dFNpemUgPSBudWxsOyAKCglkaWZmb3V0cHV0ZGl2LmlubmVySFRNTCA9ICIiOwoJY29udGV4dFNpemUgPSBjb250ZXh0U2l6ZSB8fCBudWxsOwoKCWRpZmZvdXRwdXRkaXYuYXBwZW5kQ2hpbGQoZGlmZnZpZXcuYnVpbGRWaWV3KHsKCQliYXNlVGV4dExpbmVzOiBiYXNlLAoJCW5ld1RleHRMaW5lczogbmV3dHh0LAoJCW9wY29kZXM6IG9wY29kZXMsCgkJYmFzZVRleHROYW1lOiAiT3JtIFZhbHVlcyIsCgkJbmV3VGV4dE5hbWU6ICJEYXRhYmFzZSBWYWx1ZXMiLAoJCWNvbnRleHRTaXplOiBjb250ZXh0U2l6ZSwKCQl2aWV3VHlwZTogdmlld1R5cGUKCX0pKTsKfQo8L3NjcmlwdD4KCgp7aWYgZW1wdHkoJGxpc3RJbnN0YW5jZSl9CglObyBtb2R1bGUgZGV0ZWN0ZWQKey9pZn0KCntmb3JlYWNoICRsaXN0SW5zdGFuY2UgYXMgJG1vZHVsZU5hbWUgPT4gJG1vZHVsZX0KCTxoMz5Nb2R1bGUgeyRtb2R1bGVOYW1lfTwvaDM+Cgl7Zm9yZWFjaCAkbW9kdWxlWydsaXN0RW1wdHlUYWJsZSddIGFzICRlbnRpdHluYW1lID0+ICRlbXB0eVRhYmxlfQoJCTxoNSBzdHlsZT0nbWFyZ2luLWxlZnQ6MTBweDsnPnskZW50aXR5bmFtZX08L2g1PgoKCQl7aWYgIWVtcHR5KCRlbXB0eVRhYmxlKX0KCgkJCTxwIHN0eWxlPSdjb2xvcjojODcwOTA5Oyc+CgkJCQlUaGUgdGFibGUgPGI+eyRlbXB0eVRhYmxlfTwvYj4gZm9yIGVudGl0eSA8Yj57JGVudGl0eW5hbWV9PC9iPiBkb2Vzbid0IG5vdCBleGlzdC4KCQkJPC9wPgoKCQl7ZWxzZWlmICRtb2R1bGVbJ2xpc3RSZXN1bHRYWCddWyRlbnRpdHluYW1lXSA9PSAkbW9kdWxlWydsaXN0UmVzdWx0REInXVskZW50aXR5bmFtZV19CgoJCQk8cCBzdHlsZT0nY29sb3I6IzA5ODcwRTsnPgoJCQkJVGhlIHRhYmxlIGZvciBlbnRpdHkgPGI+eyRlbnRpdHluYW1lfTwvYj4gaXMgd2VsbCBmb3JtZWQKCQkJPC9wPgoKCQl7ZWxzZX0KCgkJCTxwIHN0eWxlPSdjb2xvcjojRkFBMDBGOyc+VGhlIHRhYmxlIGZvciBlbnRpdHkgPGI+eyRtb2R1bGVOYW1lfTwvYj4gaGF2ZSBzb21lIGRpZmZlcmVudHMuPC9wPgoJCQk8dGV4dGFyZWEgaWQ9J2Jhc2VUZXh0X3skZW50aXR5bmFtZX0nIGNsYXNzPSdoaWRkZW4nPgoJCQkJeyRtb2R1bGVbJ2xpc3RSZXN1bHRYWCddWyRlbnRpdHluYW1lXX0KCQkJPC90ZXh0YXJlYT4KCQkJPHRleHRhcmVhIGlkPSduZXdUZXh0X3skZW50aXR5bmFtZX0nIGNsYXNzPSdoaWRkZW4nPgoJCQkJeyRtb2R1bGVbJ2xpc3RSZXN1bHREQiddWyRlbnRpdHluYW1lXX0KCQkJPC90ZXh0YXJlYT4KCQkJPGRpdiBpZD0iZGlmZm91dHB1dF97JGVudGl0eW5hbWV9IiBjbGFzcz0nZGl2X19vdXRwdXQnPiA8L2Rpdj4KCgkJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiA+CgkJCQkkKCBkb2N1bWVudCApLnJlYWR5KGZ1bmN0aW9uKCkgewoJCQkJCWRpZmZVc2luZ0pTKDAsICJiYXNlVGV4dF97JGVudGl0eW5hbWV9IiwgIm5ld1RleHRfeyRlbnRpdHluYW1lfSIsICJkaWZmb3V0cHV0X3skZW50aXR5bmFtZX0iKTsKCQkJCX0pOwoJCQkJCgkJCTwvc2NyaXB0PgoKCQl7L2lmfQoJey9mb3JlYWNofQp7L2ZvcmVhY2h9CgoKPGEgY2xhc3M9Im9ybWJ1dHRvbiB1aS1zdGF0ZS1kZWZhdWx0IHVpLWNvcm5lci1hbGwiIGhyZWY9InskYmFja30iPgoJPHNwYW4gY2xhc3M9InVpLWljb24gIHVpLWljb24tYXJyb3dyZXR1cm50aGljay0xLXciPjwvc3Bhbj4KCUJhY2sKPC9hPg==]]></data>
	</file>
	<file>
	  <filename>/templates/admin_generate.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PHN0eWxlPgoJLm9ybWJ1dHRvbiB7CgkJY2xlYXI6IGJvdGg7CgkJdGV4dC1hbGlnbjogbGVmdAoJfQoJYS5vcm1idXR0b257CgkJZGlzcGxheTogaW5saW5lLWJsb2NrOwoJCXBvc2l0aW9uOiByZWxhdGl2ZTsKCQltYXJnaW46IDEwcHggMDsKCQlsaW5lLWhlaWdodDogMjZweDsKCQljb2xvcjogIzIzMjMyMzsKCQl0ZXh0LWRlY29yYXRpb246IG5vbmU7CgkJcGFkZGluZzogMXB4IDhweCAycHggMjBweDsKCX0KCWEub3JtYnV0dG9uIC51aS1pY29uIHsKCQlwb3NpdGlvbjogYWJzb2x1dGU7CgkJbGVmdDogMDsKCQl0b3A6IDZweDsKCX0KCWEub3JtYnV0dG9uOmhvdmVyIHsKCQljb2xvcjogI2ZmZgoJfQo8L3N0eWxlPgoKeyRmb3JtU3RhcnR9Cgl7JGRyb3Bkb3dufQoJPGlucHV0IHR5cGU9J3N1Ym1pdCcgdmFsdWU9J0dlbmVyYXRlIFBIUCBjb2RlJyAvPgoJPGEgY2xhc3M9J29ybWJ1dHRvbiB1aS1zdGF0ZS1kZWZhdWx0IHVpLWNvcm5lci1hbGwnIGhyZWY9J3skY2FuY2VsfSc+CgkJPHNwYW4gY2xhc3M9InVpLWljb24gIHVpLWljb24tYXJyb3dyZXR1cm50aGljay0xLXciPjwvc3Bhbj4KCQlCYWNrCgk8L2E+CgoJe2lmIGlzc2V0KCRvdXRwdXQpfTxici8+CgkJPHRleHRhcmVhPgo8P3BocAoJLyoqCgkgKiBIZXJlIHlvdSB3aWxsIHByb3ZpZGUgc29tZSBpbmZvcm1hdGlvbnMgYWJvdXQgdGhpcyBuZXcgRW50aXR5CgkgKgoJICogRG9uJ3QgZm9yZ2V0IHRvIGZpbmQgYSBnb29kIG5hbWUgZm9yIHRoaXMgbmV3IEVudGl0eSAhCgkgKiovIAoJY2xhc3MgUmVuYW1lVGhpc0VudGl0eSBleHRlbmRzIE9ybUVudGl0eSB7CgkJcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCkgewoJCQlwYXJlbnQ6Ol9fY29uc3RydWN0KCd5b3VybW9kdWxlbmFtZScsJ3JlbmFtZXRoaXNlbnRpdHknKTsKCntmb3JlYWNoICRvdXRwdXQgYXMgJGtleSA9PiAkdmFsdWVzfQoJCQkkdGhpcy0+YWRkKG5ldyBPcm1GaWVsZCgneyRrZXl9JwkKCQkJCSwgT3JtQ0FTVDo6JElOVEVHRVIgCgkJCQksIG51bGwJCgkJCQksIG51bGwgCQkKCQkJCSwgT3JtS0VZOjokUEsJCgkJCSkpOwoKey9mb3JlYWNofQoKCQl9CQoJfQo/PgoKCQk8L3RleHRhcmVhPgoJey9pZn0KPC9mb3JtPg==]]></data>
	</file>
</module>
