<?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.1</version>
  <mincmsversion>1.11.0</mincmsversion>
	<help><![CDATA[PGgzPldoYXQgRG9lcyBUaGlzIERvPzwvaDM+CjxwPm1vcmUgaW5mb3JtYXRpb25zIG9uIDogPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2Jlc3N0aW9sbGUvb3JtLW1zIiB0YXJnZXQ9Il9ibGFuayI+aHR0cHM6Ly9naXRodWIuY29tL2Jlc3N0aW9sbGUvb3JtLW1zPC9hPjwvcD4KPGgzPlBhcmFtZXRlcnM8L2gzPjx1bD48bGk+PGVtPihvcHRpb25hbCk8L2VtPiBsYW5nPSJlbl9VUyIgLSBQYXJhbcOodHJlIHV0aWxpc8OpIHBvdXIgc3DDqWNpZmllciBkYW5zIHF1ZWxsZSBsYW5ndWUgYWZmaWNoZXIgbGUgbW9kdWxlIGRhbnMgbGEgcGFydGllIHB1YmxpcXVlLiBDZSBwYXJhbcOodHJlIG4nZXN0IHBhcyBzdXBwb3J0w6kgb3UgdXRpbGUgcG91ciB0b3VzIGxlcyBtb2R1bGVzLjwvbGk+PC91bD4=]]></help>
	<about><![CDATA[PGJyIC8+QXV0aG9yOiBLZXZpbiBEYW5lemlzIChha2EgQmVzcykgJmx0O2NvbnRhY3QgYXQgZnVyaWUgcG9pbnQgYmUmZ3Q7PGJyIC8+PGJyIC8+VmVyc2lvbjogMC4zLjE8YnIgLz48YnIgLz5DaGFuZ2UgSGlzdG9yeTo8YnIgLz5zZWUgY2hhbmdlbG9nIDogPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2Jlc3N0aW9sbGUvb3JtLW1zIiB0YXJnZXQ9Il9ibGFuayI+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>/lang/ext/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/class.MyAutoload.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIENvbnRhaW5zIHRoZSBhdXRvbG9hZCBzeXN0ZW0gdGhhdCB3aWxsIG1lbW9yaXplIGFsbCB0aGUgZW50aXRpZXMgdXNlZCBieSBhbGwgdGhlIG1vZHVsZXMKICoKICogQHNpbmNlIDAuMC4xCiAqIEBhdXRob3IgQmVzcwogKiovCiAKIC8qKgogKiBTdGF0aWMgQ2xhc3MgbWFuYWdpbmcgZW50aXRpZXMgdXNlZCBpbiB0aGUgYXBwbGljYXRpb24KICoJVGhlIG1haW4gdXNlIGlzIHRvIG5vdCByZWRlY2xhcmF0ZSBYIGluc3RhbmNlcyBvZiBzYW1lIGNsYXNzZXMgaWYgaXQncyBub3QgbmVjZXNzYXJ5LgogKiBBbGwgbW9kdWxlcyBoYXZlIHRoZWlyIG93biBuYW1lc3BhY2UgdG8gYXZvaWQgc2hhcmluZyBlbnRpdGllcyBiZXR3ZWVuIHR3byBtb2R1bGVzCiAqCiAqIEBzaW5jZSAwLjAuMQogKiBAYXV0aG9yIEJlc3MKICogQHBhY2thZ2UgT3JtCiAqKi8KZmluYWwgY2xhc3MgTXlBdXRvbG9hZAp7CgkvKioKCSAqIExpc3Qgb2YgYWxsIGluc3RhbmNlcwoJICoqLwoJcHJpdmF0ZSBzdGF0aWMgJGluc3RhbmNlczsKCQoJLyoqCgkgKiBQcml2YXRlIGNvbnN0cnVjdG9yCgkgKi8KCXByb3RlY3RlZCBmdW5jdGlvbiBfX2NvbnN0cnVjdCgpe30JCgkKCS8qKgoJICogRnVuY3Rpb24gY2FsbGVkIGJ5IHRoZSBlbnRpdGllcyB0aGVtLXNlbGYgZHVyaW5nIHRoZWlyIF9jb25zdHJ1Y3QoKSBmdW5jdGlvbgoJICogaXQgd2lsbCBzdG9jayBhbiBpbnN0YW5jZSBvZiB0aGUgZW50aXR5IChpZiBub3QgYWxyZWFkeSBleGlzdGluZykgaW4gaGlzIG1lbW9yeQogICAgICogCgkgKiBAcGFyYW0gc3RyaW5nICRuYW1lc3BhY2UgbmFtZXNwYWNlIG9mIHRoZSBlbnRpdHkncyBtb2R1bGUKCSAqIEBwYXJhbSBPcm1FbnRpdHkgJGluc3RhbmNlIGFuIGluc3RhbmNlIG9mIHRoZSBlbnRpdHkKCSAqLwoJcHVibGljIGZpbmFsIHN0YXRpYyBmdW5jdGlvbiBhZGRJbnN0YW5jZSgkbmFtZXNwYWNlLCBPcm1FbnRpdHkgJGluc3RhbmNlKQoJewkKCQkkbmFtZXNwYWNlID0gc3RydG9sb3dlcigkbmFtZXNwYWNlKTsKCQkkbmFtZSA9IHN0cnRvbG93ZXIoJGluc3RhbmNlLT5nZXROYW1lKCkpOwoJCQkJCgkJaWYoIU15QXV0b2xvYWQ6OmlzVmFsaWRlTmFtZXNwYWNlKCRuYW1lc3BhY2UpKXsKCQkJc2VsZjo6JGluc3RhbmNlc1skbmFtZXNwYWNlXSA9IGFycmF5KCk7CgkJfQoJCQkJCgkJaWYoaXNzZXQoc2VsZjo6JGluc3RhbmNlc1skbmFtZXNwYWNlXVskbmFtZV0pKSB7CgkJCU9ybVRyYWNlOjpkZWJ1ZygiSW5zdGFuY2UgIi4kbmFtZS4iIGFscmVhZHkgaW4gbWVtb3J5LiIpOwoJCQlyZXR1cm47CgkJfQoJCQoJCU9ybVRyYWNlOjpkZWJ1ZygiQWRkaW5nIHRoZSBpbnN0YW5jZSAiLiRuYW1lLiIgaW50byB0aGUgbmFtZXNwYWNlICIuJG5hbWVzcGFjZSk7CgkJc2VsZjo6JGluc3RhbmNlc1skbmFtZXNwYWNlXVskbmFtZV0gPSAkaW5zdGFuY2U7Cgl9CgkKCS8qKgoJICogUmV0dXJuIGFuIGluc3RhbmNlIG9mIGVudGl0eSBmcm9tIHRoZSBtZW1vcnkuIEVhY2ggaW5zdGFuY2UgaXMgYSBjbG9uZSB0byBhdm9pZCB1c2luZwoJICogdGhlIHNhbWUgb2JqZWN0IAogICAgICogCgkgKiBAcGFyYW0gc3RyaW5nICRuYW1lc3BhY2UgbmFtZXNwYWNlIG9mIHRoZSBlbnRpdHkncyBtb2R1bGUKCSAqIEBwYXJhbSBzdHJpbmcgJGluc3RhbmNlTmFtZSBuYW1lIG9mIGFuIGluc3RhbmNlIG9mIHRoZSBlbnRpdHkKCSAqCgkgKiBAcmV0dXJuIE9ybUVudGl0eSBhbiBpbnN0YW5jZSBvZiBlbnRpdHkKCSAqLwoJcHVibGljIGZpbmFsIHN0YXRpYyBmdW5jdGlvbiBnZXRJbnN0YW5jZSgkbmFtZXNwYWNlLCAkaW5zdGFuY2VOYW1lKQoJewoJCSRuYW1lc3BhY2UgPSBzdHJ0b2xvd2VyKCRuYW1lc3BhY2UpOwoJCSRpbnN0YW5jZU5hbWUgPSBzdHJ0b2xvd2VyKCRpbnN0YW5jZU5hbWUpOwoJCWlmKCFNeUF1dG9sb2FkOjppc1ZhbGlkZU5hbWVzcGFjZSgkbmFtZXNwYWNlKSl7CgkJCU9ybVRyYWNlOjplcnJvcigiVGhlIG5hbWVzcGFjZSAnJG5hbWVzcGFjZScgZG9lc24ndCBleGlzdGUgaW50byB0aGUgT3JtIFN5c3RlbSIpOwoJCQl0aHJvdyBuZXcgT3JtSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgbmFtZXNwYWNlICckbmFtZXNwYWNlJyBkb2Vzbid0IGV4aXN0ZSBpbnRvIHRoZSBPcm0gU3lzdGVtIik7CgkJfQoJCQoJCU9ybVRyYWNlOjpkZWJ1ZygiQXNraW5nIGFuIGluc3RhbmNlIG9mICIuJGluc3RhbmNlTmFtZS4gIiBmb3IgbmFtZXNwYWNlICIuJG5hbWVzcGFjZSk7CgkJaWYoTXlBdXRvbG9hZDo6aGFzSW5zdGFuY2UoJG5hbWVzcGFjZSwgJGluc3RhbmNlTmFtZSkpCgkJewoJCQlPcm1UcmFjZTo6ZGVidWcoIkluc3RhbmNlICIuJGluc3RhbmNlTmFtZS4iIHJldHVybmVkLiIpOwoJCQlyZXR1cm4gY2xvbmUgc2VsZjo6JGluc3RhbmNlc1skbmFtZXNwYWNlXVskaW5zdGFuY2VOYW1lXTsKCQl9CgkJCgkJT3JtVHJhY2U6OmVycm9yKCJObyBpbnN0YW5jZSAkaW5zdGFuY2VOYW1lIGZvdW5kIGluIG1lbW9yeSBmb3IgbmFtZXNwYWNlICIuJG5hbWVzcGFjZSk7CgkJdGhyb3cgbmV3IEV4Y2VwdGlvbigiTm8gaW5zdGFuY2UgJGluc3RhbmNlTmFtZSBmb3VuZCBpbiBtZW1vcnkgZm9yIG5hbWVzcGFjZSAiLiRuYW1lc3BhY2UpOwoJfQoJCgkvKioKCSAqIFJldHVybiB0cnVlIGlmIHRoZSBpbnN0YW5jZSBleGlzdHMgaW4gdGhlIG1lbW9yeSBmb3IgdGhlIHNhbWUgbmFtZXNwYWNlCiAgICAgKiAKCSAqIEBwYXJhbSBzdHJpbmcgJG5hbWVzcGFjZSBuYW1lc3BhY2Ugb2YgdGhlIGVudGl0eSdzIG1vZHVsZQoJICogQHBhcmFtIHN0cmluZyAkaW5zdGFuY2VOYW1lIG5hbWUgb2YgYW4gaW5zdGFuY2Ugb2YgdGhlIGVudGl0eQoJICoKCSAqIEByZXR1cm4gQm9vbGVhbiBpZiB0aGUgaW5zdGFuY2UgZXhpc3RzCgkgKi8KCXB1YmxpYyBmaW5hbCBzdGF0aWMgZnVuY3Rpb24gaGFzSW5zdGFuY2UoJG5hbWVzcGFjZSwgJGluc3RhbmNlTmFtZSl7CgkJJG5hbWVzcGFjZSA9IHN0cnRvbG93ZXIoJG5hbWVzcGFjZSk7CgkJJGluc3RhbmNlTmFtZSA9IHN0cnRvbG93ZXIoJGluc3RhbmNlTmFtZSk7CgkJCgkJaWYoTXlBdXRvbG9hZDo6aXNWYWxpZGVOYW1lc3BhY2UoJG5hbWVzcGFjZSkpewoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJCQoJCXJldHVybiBpc3NldChzZWxmOjokaW5zdGFuY2VzWyRuYW1lc3BhY2VdWyRpbnN0YW5jZU5hbWVdKTsKCX0KCQoJLyoqCgkgKiBSZXR1cm4gYWxsIHRoZSBpbnN0YW5jZXMgb2YgYWxsIHRoZSBlbnRpdGllcyBmcm9tIGEgc2luZ2xlIG5hbWVzcGFjZQogICAgICogCgkgKiBAcGFyYW0gc3RyaW5nICRuYW1lc3BhY2UgbmFtZXNwYWNlIG9mIHRoZSBlbnRpdHkncyBtb2R1bGUKCSAqCgkgKiBAcmV0dXJuIGFycmF5PE9ybUVudGl0eT4gYW4gYXJyYXkgb2YgYWxsIHRoZSBlbnRpdGllcwoJICovCglwdWJsaWMgZmluYWwgc3RhdGljIGZ1bmN0aW9uIGdldEFsbEluc3RhbmNlcygkbmFtZXNwYWNlKQoJewoJCSRuYW1lc3BhY2UgPSBzdHJ0b2xvd2VyKCRuYW1lc3BhY2UpOwoJCWlmKCFNeUF1dG9sb2FkOjppc1ZhbGlkZU5hbWVzcGFjZSgkbmFtZXNwYWNlKSl7CgkJCU9ybVRyYWNlOjplcnJvcigiVGhlIG5hbWVzcGFjZSAnJG5hbWVzcGFjZScgZG9lc24ndCBleGlzdGUgaW50byB0aGUgT3JtIFN5c3RlbSIpOwoJCQl0aHJvdyBuZXcgT3JtSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgbmFtZXNwYWNlICckbmFtZXNwYWNlJyBkb2Vzbid0IGV4aXN0ZSBpbnRvIHRoZSBPcm0gU3lzdGVtIik7CgkJfQoJCQoJCXJldHVybiBzZWxmOjokaW5zdGFuY2VzWyRuYW1lc3BhY2VdOwoJfQoJCgkvKioKCSAqIFJldG91cm5lIHRydWUgaWYgdGhlIG5hbWVzcGFjZSBpcyBrbm93biBpbiBtZW1vcnkKICAgICAqIAoJICogQHBhcmFtIHN0cmluZyAkbmFtZXNwYWNlIG5hbWVzcGFjZSBvZiB0aGUgZW50aXR5J3MgbW9kdWxlCgkgKgoJICogQHJldHVybiBCb29sZWFuIGlmIHRoZSBuYW1lc3BhY2UgZXhpc3RzCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaXNWYWxpZGVOYW1lc3BhY2UoJG5hbWVzcGFjZSkgewoJCXJldHVybiBpc3NldChzZWxmOjokaW5zdGFuY2VzW3N0cnRvbG93ZXIoJG5hbWVzcGFjZSldKTsKCX0KfQo/Pgo=]]></data>
	</file>
	<file>
	  <filename>/lib/class.OrmCache.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIENvbnRhaW5zIHRoZSBjbGFzcyB3aGljaCBwcm92aWRlIGFuIGdsb2JhbCBpbnRlcmZhY2UgZm9yIGFsbCB0aGUgY2FjaGluZyBzeXN0ZW1zCiAqCiAqIEBzaW5jZSAwLjIuMAogKiBAYXV0aG9yIEJlc3MKICoqLwoKCi8qKgogKgogKiAgU3RhdGljIGNsYXNzZXMgdXNlZCB0byBwcm92aWRlIGxpc3Qgb2Ygc2lnbmF0dXJlIGZvciBhbGwgdGhlIGNhY2hpbmcgc3lzdGVtcwogKgogKiAgRXhhbXBsZSA6IAogKiAgPGNvZGU+CiAqICAJLy9DYWxsIHRvIGNtc21zIHRvIGdldCB0aGUgZGF0YWJhc2UgY29ubmVjdG9yCiAqICAJJGRiID0gY21zbXMoKS0+R2V0RGIoKTsKICogICAgICAkY2FjaGVJbnN0YW5jZSA9IE9ybUNhY2hlOjpnZXRJbnN0YW5jZSgpOwogKiAgCQogKiAgCS8vRGVmaW5lcyBhIG5ldyBDdXN0b21lciBlbnRpdHkKICogIAkkZW50aXR5ID0gTXlBdXRvbG9hZDo6Z2V0SW5zdGFuY2UoJ215TW9kdWxlJywgJ2N1c3RvbWVyJyk7CiAqICAJCiAqICAJLy9TZWxlY3QgYWxsIEN1c3RvbWVycwogKiAgCSRxdWVyeVNlbGVjdCA9ICdTZWxlY3QgKiBGUk9NICcuJGVudGl0eS0+Z2V0RGJuYW1lKCk7CiAqICAJCiAqICAJLy9JZiB0aGUgY2FjaGluZyBzeXN0ZW0gYWxyZWFkeSBrbm93IHRoZSBhbnN3ZXIgOiB3ZSByZXR1cm4gdGhlIHJlc3VsdCBpbW1lZGlhdGVseQogKiAgCWlmKCRjYWNoZUluc3RhbmNlLT5pc0NhY2hlKCRxdWVyeVNlbGVjdCkpIHsKICogIAkJcmV0dXJuICRjYWNoZUluc3RhbmNlLT5nZXRDYWNoZSgkcXVlcnlTZWxlY3QpOwogKiAgCX0KICogIAkKICogIAkvL1NvIHdlIG5lZWQgdG8gZXhlY3V0ZSB0aGUgcXVlcnkKICogIAkkcmVzdWx0ID0gJGRiLT5FeGVjdXRlKCRxdWVyeVNlbGVjdCk7CiAqICAJaWYgKCRyZXN1bHQgPT09IGZhbHNlKXtkaWUoIkRhdGFiYXNlIGVycm9yISIpO30KICogIAkKICogIAkkZW50aXR5cyA9IGFycmF5KCk7CiAqICAJd2hpbGUgKCRyb3cgPSAkcmVzdWx0LT5GZXRjaFJvdygpKSB7CiAqICAJCSRlbnRpdHlzW10gPSBPcm1Db3JlOjpyb3dUb0VudGl0eSgkZW50aXR5LCAkcm93KTsKICogIAl9CiAqICAJCiAqICAJLy9Eb24ndCBmb3JnZXQgdG8gcHVzaCB0aGUgcmVzdWx0IGludG8gdGhlIGNhY2hpbmcgc3lzdGVtIGZvciB0aGUgbmV4dCBjYWxsCiAqICAJJGNhY2hlSW5zdGFuY2UtPnNldENhY2hlKCRxdWVyeVNlbGVjdCwgbnVsbCwgJGVudGl0eXMpOwogCiAqICAJcmV0dXJuICRlbnRpdHlzOwogKgk8L2NvZGU+CiAqCiAqIEBzaW5jZSAwLjIuMAogKiBAYXV0aG9yIEJlc3MKICogQHBhY2thZ2UgT3JtCiAqKi8KYWJzdHJhY3QgY2xhc3MgT3JtQ2FjaGUgewkKCgkvKioKCSAqIFdvbid0IHVzZSBhbnkgY2FjaGUgc3lzdGVtCgkgKiovCglwdWJsaWMgc3RhdGljICROT05FID0gMDsKCgkvKioKCSAqIFdpbGwgdXNlIGEgY2FjaGUgZHVyaW5nIHRoZSB0aW1lIG9mIHRoZSBleGVjdXRpb24gb2YgdGhlIHNjcmlwdAoJICoqLwoJcHVibGljIHN0YXRpYyAkU0NSSVBUID0gMTsKCQkKCS8qKgoJICogUHJpdmF0ZSBjb25zdHJ1Y3RvcgoJICovCglwcm90ZWN0ZWQgZnVuY3Rpb24gX19jb25zdHJ1Y3QoKSB7fQoJCgkvKioKCSAqIFdpbGwgcmV0dXJuIGEgaW1wbGVtZW50YXRpb24gb2YgdGhlIGNhY2hlLgoJICoKCSAqIEBwYXJhbSBtaXhlZCAkdHlwZUNhY2hlIG5vdCByZXF1aXJlZCA6IHRoZSB0eXBlIG9mIGNhY2hlLiBCeSBkZWZhdWx0IGl0IHdpbGwgdGFrZSB0aGUgdHlwZSBvZiBjYWNoZSBkZWZpbmVkIGFzIGRlZmF1bHQgaW50byBDbXNNYWRlU2ltcGxlCgkgKgoJICogQHJldHVybiBhbiBpbnN0YW5jZSBvZiBDYWNoZS4KCSAqKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0SW5zdGFuY2UoJHR5cGVDYWNoZSA9IG51bGwpewoJCQoJCWlmKCR0eXBlQ2FjaGUgPT0gbnVsbCl7CgkJCSRvcm0gPSBjbXNtcygpLT5HZXRNb2R1bGVPcGVyYXRpb25zKCktPmdldF9tb2R1bGVfaW5zdGFuY2UoJ09ybScpOwoJCQkkdHlwZUNhY2hlID0gJG9ybS0+R2V0UHJlZmVyZW5jZSgnY2FjaGVUeXBlJywgT3JtQ2FjaGU6OiROT05FKTsKCQl9CgkJCgkJc3dpdGNoKCR0eXBlQ2FjaGUpewoJCQljYXNlIE9ybUNhY2hlOjokTk9ORToKCQkJCXJldHVybiBPcm1DYWNoZU5vbmU6OmdldE15T3duSW5zdGFuY2UoKTsKCQkJCWJyZWFrOwoJCQljYXNlIE9ybUNhY2hlOjokU0NSSVBUOgoJCQkJcmV0dXJuIE9ybUNhY2hlU2NyaXB0OjpnZXRNeU93bkluc3RhbmNlKCk7CgkJCQlicmVhazsKCQkJZGVmYXVsdDoKCQkJCU9ybVRyYWNlOjplcnJvcigiVHlwZSBvZiBDYWNoZSAjeyR0eXBlQ2FjaGV9IGlzIG5vdCBhIHZhbGlkIFR5cGUgb2YgQ2FjaGUiKTsKCQkJCWV4aXQgLTE7CgkJfQoJfQoJCQkKCS8qKgoJICoJU2V0IHRoZSBjYWNoZSBmb3IgYSBzcWwgcmVxdWVzdCwgaXRzIHBhcmFtZXRlcnMgYW5kIG9mIGNvdXJzZSB0aGUgcmVzdWx0CiAgICAgKiAKCSAqIEBwYXJhbSBzdHJpbmcgJHNxbCB0aGUgc3FsIHF1ZXJ5CgkgKiBAcGFyYW0gbWl4ZWRbXSAkcGFyYW1zIGFycmF5IHRoZSBwYXJhbWV0ZXJzIGludG8gYSBhcnJheS4gTWF5IGJlIG51bGwKCSAqIEBwYXJhbSBtaXhlZCAkdmFsdWUgdGhlIHJlc3VsdAoJICovCglwdWJsaWMgYWJzdHJhY3QgZnVuY3Rpb24gc2V0Q2FjaGUoJHNxbCwgJHBhcmFtcyA9IG51bGwsICR2YWx1ZSk7CgkKCS8qKgoJICogUXVlcnlpbmcgdGhlIGNhY2hlIGZvciBhIHNxbCByZXF1ZXN0IGFuZCBpdHMgcGFyYW1ldGVycwogICAgICogCgkgKiBAcGFyYW0gc3RyaW5nICRzcWwgdGhlIHNxbCBxdWVyeQoJICogQHBhcmFtIG1peGVkW10gJHBhcmFtcyBhcnJheSB0aGUgcGFyYW1ldGVycyBpbnRvIGEgYXJyYXkuIE1heSBiZSBudWxsCgkgKgoJICogQHJldHVybiBtaXhlZCB0aGUgcmVzdWx0CgkgKi8KCXB1YmxpYyBhYnN0cmFjdCBmdW5jdGlvbiBnZXRDYWNoZSgkc3FsLCAkcGFyYW1zID0gbnVsbCk7CgoJLyoqCgkgKiBSZXR1cm4gdHJ1ZSBpZiBhIGNhY2hlIGV4aXN0IGZvciBhIHNxbCByZXF1ZXN0IGFuZCBpdHMgcGFyYW1ldGVycwogICAgICogCgkgKiBAcGFyYW0gc3RyaW5nICRzcWwgdGhlIHNxbCBxdWVyeQoJICogQHBhcmFtIG1peGVkW10gJHBhcmFtcyBhcnJheSB0aGUgcGFyYW1ldGVycyBpbnRvIGEgYXJyYXkuIE1heSBiZSBudWxsCgkgKgoJICogQHJldHVybiBib29sZWFuIHRydWUgaWYgdGhlIGNhY2hlIGV4aXN0cwoJICovCQoJcHVibGljIGFic3RyYWN0IGZ1bmN0aW9uIGlzQ2FjaGUoJHNxbCwgJHBhcmFtcyA9IG51bGwpOwoKCS8qKgoJICogRW1wdHkgdGhlIGNhY2hlLiBWZXJ5IGltcG9ydGFudCBpZiBiZXR3ZWVuIDIgcXVlcnlpbmcsIHRoZSBzeXN0ZW0gbWF5IGluc2VydC9kZWxldGUvdXBkYXRlIHNvbWUgZGF0YSBpbiB0aGUgZGF0YWJhc2UKCSAqICBJbiB0aGUgT3JtIHN5c3RlbSwgd2UgYWx3YXlzIGRyb3AgdGhlIGNhY2hlIGluIHRoZSBpbnNlcnQvZGVsZXRlL3VwZGF0ZSBmdW5jdGlvbi4KCSAqLwkKCXB1YmxpYyBhYnN0cmFjdCBmdW5jdGlvbiBjbGVhckNhY2hlKCk7CgoJLyoqCgkgKiBSZXR1cm4gYSB1bmlxdWUgaGFzaCBmb3IgYSBzcWwgcmVxdWVzdCBhbmQgaXRzIHBhcmFtZXRlcnMKCSAqICB0aGlzIGhhc2ggaXMgdXNlZCB0byBEZWZpbmVzIGEgdW5pcXVlIGVudHJ5IGludG8gdGhlIGNhY2hlCiAgICAgKiAKCSAqIEBwYXJhbSBzdHJpbmcgJHNxbCB0aGUgc3FsIHF1ZXJ5CgkgKiBAcGFyYW0gbWl4ZWRbXSAkcGFyYW1zIGFycmF5IHRoZSBwYXJhbWV0ZXJzIGludG8gYSBhcnJheS4gTWF5IGJlIG51bGwKCSAqCgkgKiBAcmV0dXJuIHN0cmluZyB0aGUgaGFzaAoJICovCQoJcHVibGljIGZ1bmN0aW9uIGhhc2goJHNxbCwgJHBhcmFtcyA9IG51bGwpIHsKCQlpZigkcGFyYW1zID09IG51bGwpewoJCQkkcGFyYW1zID0gIiI7CgkJfQoJCQoJCSRwID0gc2VyaWFsaXplKCRwYXJhbXMpOwoKCQlyZXR1cm4gbWQ1KCRzcWwuJHApOwoJfQp9Cgo/Pgo=]]></data>
	</file>
	<file>
	  <filename>/lib/class.OrmCacheNone.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIENvbnRhaW5zIHRoZSBjbGFzcyB3aWNoIHByb3ZpZGUgYW4gZHVtbXkgY2FjaGluZyBzeXN0ZW0KICoKICogQHNpbmNlIDAuMi4wCiAqIEBhdXRob3IgQmVzcwogKiovCgoKLyoqCiAqCiAqICBTdGF0aWMgY2xhc3NlIHVzZWQgdG8gcHJvdmlkZSBhIHplcm8tY2FjaGluZyBzeXN0ZW0uIAogKiAgIEl0J3MgYSBzaW1wbGUgZHVtbXkgaW1wbGVtZW50YXRpb24gb2YgdGhlIHNpZ25hdHVyZSBvZiBjYWNoaW5nCiAqICAgd2ljaCB3aWxsIGFsd2F5cyBzYXkgdGhhdCB0aGVyZSBpcyBubyBjYWNoZSBhdmFpbGFibGUsIGZvcmNpbmcgCiAqICAgcHJvY2Vzc2luZyBvZiBldmVyeSBxdWVyaWVzCiAqCiAqIEBzaW5jZSAwLjIuMAogKiBAYXV0aG9yIEJlc3MKICogQHBhY2thZ2UgT3JtCiAqKi8KY2xhc3MgT3JtQ2FjaGVOb25lIGV4dGVuZHMgT3JtQ2FjaGV7CQoJCgkvKioKCSAqIEB2YXIgT3JtQ2FjaGVTY3JpcHQgJGluc3RhbmNlIFRoZSBjdXJyZW50IGluc3RhbmNlCgkgKiovCglwcml2YXRlIHN0YXRpYyAkaW5zdGFuY2U7CgkJCgkvKioKCSAqIFByaXZhdGUgY29uc3RydWN0b3IKCSAqLwoJcHJvdGVjdGVkIGZ1bmN0aW9uIF9fY29uc3RydWN0KCkge30KCQoJLyoqCgkgKiBXaWxsIHJldHVybiBhbiBpbnN0YW5jZSBvZiB0aGUgY2FjaGUgY2xhc3MKCSAqCgkgKiBAcmV0dXJuIE9ybUNhY2hlTm9uZSB0aGUgY2FjaGUgY2xhc3MKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRNeU93bkluc3RhbmNlKCl7CgkJaWYoc2VsZjo6JGluc3RhbmNlID09IG51bGwpewoJCQlzZWxmOjokaW5zdGFuY2UgPSBuZXcgT3JtQ2FjaGVOb25lKCk7CgkJfQoJCXJldHVybiBzZWxmOjokaW5zdGFuY2U7Cgl9CgkJCQoJLyoqCgkgKglTZXQgdGhlIGNhY2hlIGZvciBhIHNxbCByZXF1ZXN0LCBpdHMgcGFyYW1ldGVycyBhbmQgb2YgY291cnNlIHRoZSByZXN1bHQKICAgICAqIAoJICogQHBhcmFtIHN0cmluZyAkc3FsIHRoZSBzcWwgcXVlcnkKCSAqIEBwYXJhbSBtaXhlZFtdICRwYXJhbXMgYXJyYXkgdGhlIHBhcmFtZXRlcnMgaW50byBhIGFycmF5LiBNYXkgYmUgbnVsbAoJICogQHBhcmFtIG1peGVkICR2YWx1ZSB0aGUgcmVzdWx0CgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzZXRDYWNoZSgkc3FsLCAkcGFyYW1zID0gbnVsbCwgJHZhbHVlKSB7CQkKCQkvL05vIHByb2Nlc3NpbmcJCQoJfQoJCgkvKioKCSAqIFF1ZXJ5aW5nIHRoZSBjYWNoZSBmb3IgYSBzcWwgcmVxdWVzdCBhbmQgaXRzIHBhcmFtZXRlcnMKICAgICAqIAoJICogQHBhcmFtIHN0cmluZyAkc3FsIHRoZSBzcWwgcXVlcnkKCSAqIEBwYXJhbSBtaXhlZFtdICRwYXJhbXMgYXJyYXkgdGhlIHBhcmFtZXRlcnMgaW50byBhIGFycmF5LiBNYXkgYmUgbnVsbAoJICoKCSAqIEByZXR1cm4gbWl4ZWQgdGhlIHJlc3VsdAoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0Q2FjaGUoJHNxbCwgJHBhcmFtcyA9IG51bGwpIHsKCQlyZXR1cm4gbnVsbDsKCX0KCgkvKioKCSAqIFJldHVybiB0cnVlIGlmIGEgY2FjaGUgZXhpc3QgZm9yIGEgc3FsIHJlcXVlc3QgYW5kIGl0cyBwYXJhbWV0ZXJzCiAgICAgKiAKCSAqIEBwYXJhbSBzdHJpbmcgJHNxbCB0aGUgc3FsIHF1ZXJ5CgkgKiBAcGFyYW0gbWl4ZWRbXSAkcGFyYW1zIGFycmF5IHRoZSBwYXJhbWV0ZXJzIGludG8gYSBhcnJheS4gTWF5IGJlIG51bGwKCSAqCgkgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBpZiB0aGUgY2FjaGUgZXhpc3RzCgkgKi8JCglwdWJsaWMgZnVuY3Rpb24gaXNDYWNoZSgkc3FsLCAkcGFyYW1zID0gbnVsbCkgewoJCXJldHVybiBmYWxzZTsKCX0KCgkvKioKCSAqIEVtcHR5IHRoZSBjYWNoZS4gVmVyeSBpbXBvcnRhbnQgaWYgYmV0d2VlbiAyIHF1ZXJ5aW5nLCB0aGUgc3lzdGVtIG1heSBpbnNlcnQvZGVsZXRlL3VwZGF0ZSBzb21lIGRhdGEgaW4gdGhlIGRhdGFiYXNlCgkgKiAgSW4gdGhlIE9ybSBzeXN0ZW0sIHdlIGFsd2F5cyBkcm9wIHRoZSBjYWNoZSBpbiB0aGUgaW5zZXJ0L2RlbGV0ZS91cGRhdGUgZnVuY3Rpb24uCgkgKi8JCQoJcHVibGljIGZ1bmN0aW9uIGNsZWFyQ2FjaGUoKXsKCQkvL05vIHByb2Nlc3NpbmcJCgl9CgoJLyoqCgkgKiBSZXR1cm4gYSB1bmlxdWUgaGFzaCBmb3IgYSBzcWwgcmVxdWVzdCBhbmQgaXRzIHBhcmFtZXRlcnMKCSAqICB0aGlzIGhhc2ggaXMgdXNlZCB0byBEZWZpbmVzIGEgdW5pcXVlIGVudHJ5IGludG8gdGhlIGNhY2hlCiAgICAgKiAKCSAqIEBwYXJhbSBzdHJpbmcgJHNxbCB0aGUgc3FsIHF1ZXJ5CgkgKiBAcGFyYW0gbWl4ZWRbXSAkcGFyYW1zIGFycmF5IHRoZSBwYXJhbWV0ZXJzIGludG8gYSBhcnJheS4gTWF5IGJlIG51bGwKCSAqCgkgKiBAcmV0dXJuIHN0cmluZyB0aGUgaGFzaAoJICovCQoJcHVibGljIGZ1bmN0aW9uIGhhc2goJHNxbCwgJHBhcmFtcyA9IG51bGwpIHsKCQkvL05vIHByb2Nlc3NpbmcJCgl9Cn0KCj8+Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/class.OrmCacheScript.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIENvbnRhaW5zIHRoZSBjbGFzcyB3aWNoIHByb3ZpZGUgYSBtaW5pIGNhY2hpbmcgc3lzdGVtIG9mIE9ybSB0byBhdm9pZCBtdWx0aXBsZXMgc3FsIHJlcXVlc3RzCiAqCiAqIEBzaW5jZSAwLjIuMAogKiBAYXV0aG9yIEJlc3MKICoqLwoKLyoqCiAqCiAqICBTdGF0aWMgY2xhc3NlIHVzZWQgdG8gcHJvdmlkZSBhIHZlcnkgc2ltcGxlIGNhY2hpbmcgc3lzdGVtLiBZb3UgY2FuIHB1c2ggdGhlIHJlc3VsdCBvZiBhIHJlcXVlc3QgaW50byBpdCBhbmQgYXNraW5nIGxhdGVyCiAqCXRvIGNvbGxlY3QgdGhlIHJlc3VsdC4KICoKICogIEV4YW1wbGUgOiAKICogIDxjb2RlPgogKiAgCS8vQ2FsbCB0byBjbXNtcyB0byBnZXQgdGhlIGRhdGFiYXNlIGNvbm5lY3RvcgogKiAgCSRkYiA9IGNtc21zKCktPkdldERiKCk7CiAqICAJCiAqICAJLy9EZWZpbmVzIGEgbmV3IEN1c3RvbWVyIGVudGl0eQogKiAgCSRlbnRpdHkgPSBNeUF1dG9sb2FkOjpnZXRJbnN0YW5jZSgnbXlNb2R1bGUnLCAnY3VzdG9tZXInKTsKICogIAkKICogIAkvL1NlbGVjdCBhbGwgQ3VzdG9tZXJzCiAqICAJJHF1ZXJ5U2VsZWN0ID0gJ1NlbGVjdCAqIEZST00gJy4kZW50aXR5LT5nZXREYm5hbWUoKTsKICogIAkKICogIAkvL0lmIHRoZSBjYWNoaW5nIHN5c3RlbSBhbHJlYWR5IGtub3cgdGhlIGFuc3dlciA6IHdlIHJldHVybiB0aGUgcmVzdWx0IGltbWVkaWF0ZWx5CiAqICAJaWYoT3JtQ2FjaGU6OmdldEluc3RhbmNlKCktPmlzQ2FjaGUoJHF1ZXJ5U2VsZWN0KSkgewogKiAgCQlyZXR1cm4gT3JtQ2FjaGU6OmdldEluc3RhbmNlKCktPmdldENhY2hlKCRxdWVyeVNlbGVjdCk7CiAqICAJfQogKiAgCQogKiAgCS8vU28gd2UgbmVlZCB0byBleGVjdXRlIHRoZSBxdWVyeQogKiAgCSRyZXN1bHQgPSAkZGItPkV4ZWN1dGUoJHF1ZXJ5U2VsZWN0KTsKICogIAlpZiAoJHJlc3VsdCA9PT0gZmFsc2Upe2RpZSgiRGF0YWJhc2UgZXJyb3IhIik7fQogKiAgCQogKiAgCSRlbnRpdHlzID0gYXJyYXkoKTsKICogIAl3aGlsZSAoJHJvdyA9ICRyZXN1bHQtPkZldGNoUm93KCkpIHsKICogIAkJJGVudGl0eXNbXSA9IE9ybUNvcmU6OnJvd1RvRW50aXR5KCRlbnRpdHksICRyb3cpOwogKiAgCX0KICogIAkKICogIAkvL0Rvbid0IGZvcmdldCB0byBwdXNoIHRoZSByZXN1bHQgaW50byB0aGUgY2FjaGluZyBzeXN0ZW0gZm9yIHRoZSBuZXh0IGNhbGwKICogIAlPcm1DYWNoZTo6Z2V0SW5zdGFuY2UoKS0+c2V0Q2FjaGUoJHF1ZXJ5U2VsZWN0LCBudWxsLCAkZW50aXR5cyk7CiAKICogIAlyZXR1cm4gJGVudGl0eXM7CiAqCTwvY29kZT4KICoKICogIFRoZSBjYWNoZSBpcyBvbmx5IGF2YWlsYWJsZSBmb3IgdGhlIGN1cnJlbnQgY2FsbCBvZiB0aGUgcGhwIHNjcmlwdCAKICogIEFuZCB3aWxsIGJlIHVuYXZhaWxhYmxlIGZvciB0aGUgbmV4dCBjYWxsLgogKgogKgogKiBAc2luY2UgMC4yLjAKICogQGF1dGhvciBCZXNzCiAqIEBwYWNrYWdlIE9ybQogKiovCmNsYXNzIE9ybUNhY2hlU2NyaXB0IGV4dGVuZHMgT3JtQ2FjaGUgewkKCQoJLyoqCgkgKiBAdmFyIE9ybUNhY2hlU2NyaXB0ICRpbnN0YW5jZSBUaGUgY3VycmVudCBpbnN0YW5jZQoJICoqLwoJcHJpdmF0ZSBzdGF0aWMgJGluc3RhbmNlOwoKCS8qKgoJICogQHZhciBtaXhlZFtdICRjYWNoZSBhbiBhcnJheSBjb250YWluaW5nIGFsbCB0aGUgZGF0YSBjYWNoZWQgCgkgKiovCglwcml2YXRlIHN0YXRpYyAkY2FjaGU7CgkJCgkvKioKCSAqIFByaXZhdGUgY29uc3RydWN0b3IKCSAqLwoJcHJvdGVjdGVkIGZ1bmN0aW9uIF9fY29uc3RydWN0KCkgewoJCXNlbGY6OiRjYWNoZSA9IGFycmF5KCk7Cgl9CgkKCS8qKgoJICogV2lsbCByZXR1cm4gYW4gaW5zdGFuY2Ugb2YgdGhlIGNhY2hlIGNsYXNzCgkgKgoJICogQHJldHVybiBPcm1DYWNoZVNjcmlwdCB0aGUgY2FjaGUgY2xhc3MKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRNeU93bkluc3RhbmNlKCl7CgkJaWYoc2VsZjo6JGluc3RhbmNlID09IG51bGwpewoJCQlzZWxmOjokaW5zdGFuY2UgPSBuZXcgT3JtQ2FjaGVTY3JpcHQoKTsKCQl9CgkJcmV0dXJuIHNlbGY6OiRpbnN0YW5jZTsKCX0KCQoJLyoqCgkgKglTZXQgdGhlIGNhY2hlIGZvciBhIHNxbCByZXF1ZXN0LCBpdHMgcGFyYW1ldGVycyBhbmQgb2YgY291cnNlIHRoZSByZXN1bHQKICAgICAqIAoJICogQHBhcmFtIHN0cmluZyAkc3FsIHRoZSBzcWwgcXVlcnkKCSAqIEBwYXJhbSBtaXhlZFtdICRwYXJhbXMgYXJyYXkgdGhlIHBhcmFtZXRlcnMgaW50byBhIGFycmF5LiBNYXkgYmUgbnVsbAoJICogQHBhcmFtIG1peGVkICR2YWx1ZSB0aGUgcmVzdWx0CgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzZXRDYWNoZSgkc3FsLCAkcGFyYW1zID0gbnVsbCwgJHZhbHVlKSB7CQkKCQlzZWxmOjokY2FjaGVbc2VsZjo6aGFzaCgkc3FsLCRwYXJhbXMpXSA9ICR2YWx1ZTsKCQkKCX0KCQoJLyoqCgkgKiBRdWVyeWluZyB0aGUgY2FjaGUgZm9yIGEgc3FsIHJlcXVlc3QgYW5kIGl0cyBwYXJhbWV0ZXJzCiAgICAgKiAKCSAqIEBwYXJhbSBzdHJpbmcgJHNxbCB0aGUgc3FsIHF1ZXJ5CgkgKiBAcGFyYW0gbWl4ZWRbXSAkcGFyYW1zIGFycmF5IHRoZSBwYXJhbWV0ZXJzIGludG8gYSBhcnJheS4gTWF5IGJlIG51bGwKCSAqCgkgKiBAcmV0dXJuIG1peGVkIHRoZSByZXN1bHQKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldENhY2hlKCRzcWwsICRwYXJhbXMgPSBudWxsKSB7CgkJaWYoc2VsZjo6aXNDYWNoZSgkc3FsLCAkcGFyYW1zKSkgewoJCQlyZXR1cm4gc2VsZjo6JGNhY2hlW3NlbGY6Omhhc2goJHNxbCwkcGFyYW1zKV07CgkJfQoJCQoJCXJldHVybiBudWxsOwoJfQoKCS8qKgoJICogUmV0dXJuIHRydWUgaWYgYSBjYWNoZSBleGlzdCBmb3IgYSBzcWwgcmVxdWVzdCBhbmQgaXRzIHBhcmFtZXRlcnMKICAgICAqIAoJICogQHBhcmFtIHN0cmluZyAkc3FsIHRoZSBzcWwgcXVlcnkKCSAqIEBwYXJhbSBtaXhlZFtdICRwYXJhbXMgYXJyYXkgdGhlIHBhcmFtZXRlcnMgaW50byBhIGFycmF5LiBNYXkgYmUgbnVsbAoJICoKCSAqIEByZXR1cm4gYm9vbGVhbiB0cnVlIGlmIHRoZSBjYWNoZSBleGlzdHMKCSAqLwkKCXB1YmxpYyBmdW5jdGlvbiBpc0NhY2hlKCRzcWwsICRwYXJhbXMgPSBudWxsKSB7CgkJcmV0dXJuIGFycmF5X0tFWV9leGlzdHMoc2VsZjo6aGFzaCgkc3FsLCRwYXJhbXMpLHNlbGY6OiRjYWNoZSk7Cgl9CgoJLyoqCgkgKiBFbXB0eSB0aGUgY2FjaGUuIFZlcnkgaW1wb3J0YW50IGlmIGJldHdlZW4gMiBxdWVyeWluZywgdGhlIHN5c3RlbSBtYXkgaW5zZXJ0L2RlbGV0ZS91cGRhdGUgc29tZSBkYXRhIGluIHRoZSBkYXRhYmFzZQoJICogIEluIHRoZSBPcm0gc3lzdGVtLCB3ZSBhbHdheXMgZHJvcCB0aGUgY2FjaGUgaW4gdGhlIGluc2VydC9kZWxldGUvdXBkYXRlIGZ1bmN0aW9uLgoJICovCQoJcHVibGljIGZ1bmN0aW9uIGNsZWFyQ2FjaGUoKSB7CgkJc2VsZjo6JGNhY2hlID0gYXJyYXkoKTsKCX0KCn0KCj8+Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/class.OrmCAST.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIENvbnRhaW5zIHRoZSBjbGFzcyB3aXRoIGFsbCB0aGUgZGlmZmVyZW50IHR5cGUgZm9yIHRoZSBmaWVsZCBpbnRvIGRhdGFiYXNlCiAqCiAqIEBzaW5jZSAwLjAuMQogKiBAYXV0aG9yIEJlc3MKICoqLwoKCi8qKgogKiBDbGFzcyBEZWZpbmVzIHRoZSB0eXBlIG9mIHRoZSBmaWVsZCwgaW4gZW50aXR5IGJ1dCBhbHNvIGluIGRhdGFiYXNlCiAqIAogKiAgT3JtQ0FTVDo6JFNUUklORyBhIHNpbXBsZSBzdHJpbmcKICogIE9ybUNBU1Q6OiRCVUZGRVIgYSBmaWVsZCB3aXRoIG5vIGxpbWl0IG9mIHNpemUgKGV4Y2VwdCB0aGUgbXlzcWwgbmF0dXJhbCBsaW1pdCkKICoKICogIE9ybUNBU1Q6OiRJTlRFR0VSIGFuIGludGVnZXIKICogIE9ybUNBU1Q6OiROVU1FUklDIGEgZmllbGQgZm9yIGEgcmVhbCBudW1iZXIgKGVnIDogd2l0aCBjb21hKQogKiAgT3JtQ0FTVDo6JERPVUJMRSBhIGZpZWxkIGZvciBiaWcgbnVtYmVyCiAqIAogKiAgT3JtQ0FTVDo6JERBVEUgYSBmaWVsZCBkYXRlCiAqICBPcm1DQVNUOjokVElNRSBhIGZpZWxkIHRpbWUKICogIE9ybUNBU1Q6OiRUUyBhIGZpZWxkIHRpbWVzdGFtcAogKiAgT3JtQ0FTVDo6JERBVEVUSU1FIGEgZmllbGQgZGF0ZVRpbWUKICogIE9ybUNBU1Q6OiRVVUlEIGEgZmllbGQgVVVJRAogKgogKiAgT3JtQ0FTVDo6JE5PTkUgYSBUcmFuc2lhbnQgZmllbGQgOiB3b24ndCBiZSBwZXJzaXN0IGludG8gZGF0YWJhc2UKICoKICogQHNpbmNlIDAuMC4xCiAqIEBhdXRob3IgQmVzcwogKiBAcGFja2FnZSBPcm0KKi8KY2xhc3MgT3JtQ0FTVAp7CgkvKioKCSAqICogU3RvcmVkIGluIGRhdGFiYXNlIHVuZGVyIHRoZSBTUUwgdHlwZSBTdHJpbmcgKHgpCgkgKiovCglwdWJsaWMgc3RhdGljICRTVFJJTkcgPSAiU1RSSU5HIjsKCgkvKioKCSAqICogU3RvcmVkIGluIGRhdGFiYXNlIHVuZGVyIHRoZSBTUUwgdHlwZSBCVUZGRVIKCSAqKi8KCXB1YmxpYyBzdGF0aWMgJEJVRkZFUiA9ICJCVUZGRVIiOwoJCgkvKioKCSAqICogU3RvcmVkIGluIGRhdGFiYXNlIHVuZGVyIHRoZSBTUUwgdHlwZSBJTlRFR0VSICh4KQoJICoqLwoJcHVibGljIHN0YXRpYyAkSU5URUdFUiA9ICJJTlRFR0VSIjsKCgkvKioKCSAqICogU3RvcmVkIGluIGRhdGFiYXNlIHVuZGVyIHRoZSBTUUwgdHlwZSBOVU1CRVIgKHgpCgkgKiovCglwdWJsaWMgc3RhdGljICROVU1FUklDID0gIk5VTUVSSUMiOwoKCS8qKgoJICogKiBTdG9yZWQgaW4gZGF0YWJhc2UgdW5kZXIgdGhlIFNRTCB0eXBlIERPVUJMRSAoeCkKCSAqKi8KCXB1YmxpYyBzdGF0aWMgJERPVUJMRSA9ICJET1VCTEUiOwoJCgkvKioKCSAqICogU3RvcmVkIGluIGRhdGFiYXNlIHVuZGVyIHRoZSBTUUwgdHlwZSBEQVRFCgkgKiovCglwdWJsaWMgc3RhdGljICREQVRFID0gIkRBVEUiOwoKCS8qKgoJICogKiBTdG9yZWQgaW4gZGF0YWJhc2UgdW5kZXIgdGhlIFNRTCB0eXBlIFRJTUUKCSAqKi8KCXB1YmxpYyBzdGF0aWMgJFRJTUUgPSAiVElNRSI7CgoJLyoqCgkgKiogU3RvcmVkIGluIGRhdGFiYXNlIHVuZGVyIHRoZSBTUUwgdHlwZSBJTlRFR0VSICg/KQoJICoqLwoJcHVibGljIHN0YXRpYyAkVFMgPSAiVFMiOwoKCS8qKgoJICoqIFN0b3JlZCBpbiBkYXRhYmFzZSB1bmRlciB0aGUgU1FMIHR5cGUgREFURVRJTUUKCSAqKi8KCXB1YmxpYyBzdGF0aWMgJERBVEVUSU1FID0gIkRBVEVUSU1FIjsKCQoJLyoqCgkgKiBTdG9yZWQgaW4gZGF0YWJhc2UgdW5kZXIgdGhlIHR5cGUgU1FMIFN0cmluZyAoMzIpCgkgKiovCglwdWJsaWMgc3RhdGljICRVVUlEID0gIlVVSUQiOwoJCgkvKioKCSAqIFdpbGwgaW5oZXJpdCBmcm9tIGl0J3MgcGFyZW50cwoJICoqLwoJcHVibGljIHN0YXRpYyAkSU5IRVJJVCA9ICJJTkhFUklUIjsKCgkvKioKCSAqIFdvbid0IGJlIHN0b3JlZCBpbiBkYXRhYmFzZQoJICoqLwoJcHVibGljIHN0YXRpYyAkTk9ORSA9ICJOT05FIjsKfQoKPz4K]]></data>
	</file>
	<file>
	  <filename>/lib/class.OrmCore.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIENvbnRhaW5zIHRoZSBjbGFzcyBPcm1Db3JlCiAqIAogKiBAc2luY2UgMC4wLjEKICogQGF1dGhvciBCZXNzCiAqKi8KIAogCi8qKgogKiBNYWluIHBhcnQgb2YgdGhlIGludGVyZmFjZSBiZXR3ZWVuIENtc21hZGVzaW1wbGUgbmF0aXZlcyBmdW5jdGlvbiBhbmQgdGhlIG5lY2Vzc2l0eSBmb3IgdGhlIE9ybSBmdW5jdGlvbnMKICogICAKICogQHNpbmNlIDAuMC4xCiAqIEBhdXRob3IgQmVzcwogKiBAcGFja2FnZSBPcm0KKi8KY2xhc3MgT3JtQ29yZSB7ICAKICAgIC8qKgogICAgKiBQcm90ZWN0ZWQgY29uc3RydWN0b3IKICAgICogICAgIAogICAgKi8KCXByb3RlY3RlZCBmdW5jdGlvbiBfX2NvbnN0cnVjdCgpIHt9CiAgICAgIAogICAgLyoqCiAgICAqIHRyYW5zZm9ybXMgdGhlIGVudGl0eSdzIHN0cnVjdHVyZSBpbnRvIGFkb2RiIGluZm9ybWF0aW9ucyAKICAgICogICAgICAgICAKICAgICogQHBhcmFtIE9ybUVudGl0eSAkZW50aXR5UGFyYW0gdGhlIGVudGl0eQogICAgKiBAcmV0dXJuIFN0cmluZyB0aGUgYWRvZGIgaW5mb3JtYXRpb25zCiAgICAqLwoJcHVibGljIHN0YXRpYyBmaW5hbCBmdW5jdGlvbiBfZ2V0RmllbGRzVG9IcWwoT3JtRW50aXR5ICRlbnRpdHlQYXJhbSkgeyAgICAKCQkkaHFsID0gJyc7CgoJCSRsaXN0ZUZpZWxkID0gJGVudGl0eVBhcmFtLT5nZXRGaWVsZHMoKTsKCgkJLy9Gb3IgZWFjaCBGaWVsZCBjb250YWluZWQgaW4gdGhlIGVudGl0eQoJCWZvcmVhY2goJGxpc3RlRmllbGQgYXMgJGZpZWxkKSB7CgkJCS8vV2UgZG9uJ3QgY3JlYXRlIHRoZSBGaWVsZCB3aGljaCBhcmUgbGlua3MgZXh0ZXJuYWxzIG9uIGFzc29jaWF0aXZlIHRhYmxlcwoJCQlpZigkZmllbGQtPmlzQXNzb2NpYXRlS0VZKCkpIHsKCQkJCWNvbnRpbnVlOwoJCQl9CQoJCQkKCQkJLy9XZSBkb24ndCBjcmVhdGUgdGhlIHRyYW5zaWVudCBGaWVsZHMgCgkJCWlmKCRmaWVsZC0+Z2V0VHlwZSgpID09IE9ybUNBU1Q6OiROT05FKSB7CgkJCQljb250aW51ZTsKCQkJfQoKCQkJaWYoIWVtcHR5KCRocWwpKSB7CgkJCQkkaHFsIC49ICcgLCAnOwoJCQl9CgkJCSRocWwgLj0gJyAnLiRmaWVsZC0+Z2V0TmFtZSgpLicgJzsKCgoKCQkJJGNhc3RUeXBlID0gJGZpZWxkLT5nZXRUeXBlKCk7CgkJCSRzaXplID0gJGZpZWxkLT5nZXRTaXplKCk7CgkJCS8qaWYoT3JtQ0FTVDo6JElOSEVSSVQgPT0gJGNhc3RUeXBlKSB7CgkJCQkvL011c3QgdGFrZSB0aGUgZGlzdGFudCB0eXBlCgkJCQlsaXN0KCRlbnRpdHlBc3NvY05hbWUsICRmaWVsZEFzc29jaWF0ZU5hbWUpID0gZXhwbG9kZSgiLiIsICRmaWVsZC0+Z2V0S2V5TmFtZSgpKTsKCQkJCSRjYXN0VHlwZSA9IChuZXcgJGVudGl0eUFzc29jTmFtZSgpKS0+Z2V0RmllbGRCeU5hbWUoJGZpZWxkQXNzb2NpYXRlTmFtZSktPmdldFR5cGUoKTsKCQkJCSRzaXplID0gKG5ldyAkZW50aXR5QXNzb2NOYW1lKCkpLT5nZXRGaWVsZEJ5TmFtZSgkZmllbGRBc3NvY2lhdGVOYW1lKS0+Z2V0U2l6ZSgpOwoJCQl9Ki8KCgkJCQoJCQkkc2l6ZSA9ICRzaXplICE9ICIiID8gIiAoIi4kc2l6ZS4iKSAiIDogIiI7CgkJCXN3aXRjaCgkY2FzdFR5cGUpIHsKCQkJCWNhc2UgT3JtQ0FTVDo6JFNUUklORyA6ICRocWwgLj0gJ0MnLiRzaXplOyBicmVhazsKCgkJCQljYXNlIE9ybUNBU1Q6OiRJTlRFR0VSIDogJGhxbCAuPSAnSScuJHNpemU7IGJyZWFrOwoKCQkJCWNhc2UgT3JtQ0FTVDo6JE5VTUVSSUMgOiAkaHFsIC49ICdOJy4kc2l6ZTsgYnJlYWs7CgoJCQkJY2FzZSBPcm1DQVNUOjokRE9VQkxFIDogJGhxbCAuPSAnRicuJHNpemU7IGJyZWFrOwoKCQkJCWNhc2UgT3JtQ0FTVDo6JEJVRkZFUiA6ICRocWwgLj0gJ1gnOyBicmVhazsKCgkJCQljYXNlIE9ybUNBU1Q6OiREQVRFIDogJGhxbCAuPSAnRCc7IGJyZWFrOwoKCQkJCWNhc2UgT3JtQ0FTVDo6JFRJTUUgOiAkaHFsIC49ICdUJzsgYnJlYWs7ICAgCgoJCQkJY2FzZSBPcm1DQVNUOjokVVVJRCA6ICRocWwgLj0gJ0MgKDM2KSAnOyBicmVhazsgICAKCgkJCQljYXNlIE9ybUNBU1Q6OiRUUyA6ICRocWwgLj0gJ0kgKDEwKSAnOyBicmVhazsgLy93b3JrYXJvdW5kIGZvciB0aGUgcmVhbCB0aW1lc3RhbXAgbWlzc2luZyBpbiBBRE9EQkxJVEUKCgkJCQljYXNlIE9ybUNBU1Q6OiREQVRFVElNRSA6ICRocWwgLj0gQ01TX0FET0RCX0RUOyBicmVhazsgICAKCgkJCQlkZWZhdWx0IDogdGhyb3cgbmV3IE9ybUlsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbignQ0FTVCBUWVBFICcuJGNhc3RUeXBlLicgZm9yIHRoZSBmaWVsZCAnLiRlbnRpdHlQYXJhbS0+Z2V0TmFtZSgpLictPicuJGZpZWxkLT5nZXROYW1lKCkuJyBpcyBub3QgYSB2YWxpZCBPcm1DQVNUIG9wdGlvbicpOwoJCQl9CgkJCQoJCQkvL01hbmFnZSB0aGUgZGVmYXVsdCB2YWx1ZQoJCQlpZigkZmllbGQtPmdldERlZmF1bHRWYWx1ZSgpICE9IG51bGwpewoJCQkJaWYoJGZpZWxkLT5nZXRUeXBlKCkgPT0gT3JtQ0FTVDo6JFNUUklORyB8fCAkZmllbGQtPmdldFR5cGUoKSA9PSBPcm1DQVNUOjokQlVGRkVSKSB7CgkJCQkJJGhxbCAuPSAiICBERUZBVUxUICciLnN0cl9yZXBsYWNlKCInIiwgIicnIiwkZmllbGQtPmdldERlZmF1bHRWYWx1ZSgpKS4iJyAiOwoJCQkJfSBlbHNlIHsKCQkJCQkkaHFsIC49ICIgIERFRkFVTFQgIi4kZmllbGQtPmdldERlZmF1bHRWYWx1ZSgpLiIgIjsKCQkJCX0KCQkJCQoJCQl9CgoJCQlpZigkZmllbGQtPmlzUHJpbWFyeUtFWSgpKSB7CgkJCQlpZigkZW50aXR5UGFyYW0tPmlzQXV0b2luY3JlbWVudCgpKSB7CgkJCQkJJGhxbCAuPSAnIEtFWSBBVVRPJzsKCQkJCX0gZWxzZSB7CgkJCQkJJGhxbCAuPSAnIEtFWSAnOwoJCQkJfQoJCQl9CgkJCQkKCQl9CgkKCQlPcm1UcmFjZTo6aW5mbygkaHFsKTsKCgkJcmV0dXJuICRocWw7Cgl9CgkKICAgIC8qKgogICAgKiBDcmVhdGUgYSB0YWJsZSBpbnRvIERhdGFiYXNlIGZyb20gdGhlIHN0cnVjdHVyZSBvZiBhbiBPcm1FbnRpdHkKICAgICogIFdpbGwgYWxzbyBjcmVhdGUgdGhlIHNlcXVlbmNlIGlmIGl0J3MgbmVlZGVkCiAgICAqICAKICAgICogICBleGFtcGxlIHdpdGggYSBDdXN0b21lciBlbnRpdHkgOiAKICAgICogPGNvZGU+CiAgICAqIAogICAgKiBjbGFzcyBDdXN0b21lciBleHRlbmRzIE9ybUVudGl0eQogICAgKiB7CiAgICAqICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgpCiAgICAqICAgIHsKICAgICogICAgICAgIHBhcmVudDo6X19jb25zdHJ1Y3QoJHRoaXMtPkdldE5hbWUoKSwgJ2N1c3RvbWVyJyk7CiAgICAqICAgICAgICAKICAgICogICAgICAgICR0aGlzLT5hZGQobmV3IE9ybUZpZWxkKCdjdXN0b21lcl9pZCcgIAoJKgkJCSwgT3JtQ0FTVDo6JElOVEVHRVIKCSoJCQksIG51bGwKCSoJCQksIG51bGwKCSoJCQksIE9ybUtFWTo6JFBLIAoJKgkJCSkpOwogICAgKiAKICAgICogICAgICAgICR0aGlzLT5hZGQobmV3IE9ybUZpZWxkKCduYW1lJwogICAgKiAgICAgICAgCSwgT3JtQ0FTVDo6JFNUUklORyAKICAgICogICAgICAgIAksIDMyCiAgICAqICAgICAgICAJKSk7CiAgICAqIAogICAgKiAgICAgICAgJHRoaXMtPmFkZChuZXcgT3JtRmllbGQoJ2xhc3RuYW1lJwogICAgKiAgICAgICAgCSwgT3JtQ0FTVDo6JFNUUklORwogICAgKiAgICAgICAgCSwgMzIKCSoJCQksIHRydWUgIC8vIElzIG51bGxhYmxlCiAgICAqICAgICAgICAJKSk7CiAgICAqICAgIH0KICAgICogfQogICAgKiA8L2NvZGU+CiAgICAqIAogICAgKiAgVGhlIGJlc3Qgd2F5IHRvIGNyZWF0ZSBpdHMgdGFibGUgaW50byB0aGUgZGF0YWJhc2UgOiAKICAgICogCiAgICAqIDxjb2RlPgogICAgKiAgICRjdXN0b21lciA9IE15QXV0b2xvYWQ6OmdldEluc3RhbmNlKCR0aGlzLT5HZXROYW1lKCksICdjdXN0b21lcicpOwogICAgKiAgIE9ybUNvcmU6OmNyZWF0ZVRhYmxlKCRjdXN0b21lcik7CiAgICAqIDwvY29kZT4KICAgICogCiAgICAqICBUaGUgZnVuY3Rpb24gd2lsbCBhbHNvIHRyeSB0byBwb3B1bGF0ZSB0aGUgdGFibGUgd2l0aCBhIGNhbGwgdG8gdGhlIGZ1bmN0aW9uIGluaXRUYWJsZSgpIGlmIGl0J3MgZGVmaW5lIGludG8gdGhlIGVudGl0eSBjbGFzcy4KICAgICogCiAgICAqIEBwYXJhbSBPcm1FbnRpdHkgJGVudGl0eVBhcmFtIGFuIGluc3RhbmNlIG9mIHRoZSBlbnRpdHkKICAgICovCglwdWJsaWMgc3RhdGljIGZpbmFsIGZ1bmN0aW9uIGNyZWF0ZVRhYmxlKE9ybUVudGl0eSAkZW50aXR5UGFyYW0pIHsKCQoJCSRocWwgPSBPcm1Db3JlOjpfZ2V0RmllbGRzVG9IcWwoJGVudGl0eVBhcmFtKTsKCgkJJHJlc3VsdCA9IE9ybURiOjpjcmVhdGVUYWJsZSgkZW50aXR5UGFyYW0tPmdldERibmFtZSgpLCAkaHFsKTsKCQkJCQoJCS8vSWYgbmVjZXNzYXJ5LCBpdCB3aWxsIGNyZWF0ZSBhIHNlcXVlbmNlIG9uIHRoZSB0YWJsZS4KCQlpZigkZW50aXR5UGFyYW0tPmdldFNlcW5hbWUoKSAhPSBudWxsKXsKCQkJT3JtRGI6OmNyZWF0ZVNlcXVlbmNlKCRlbnRpdHlQYXJhbS0+Z2V0U2VxbmFtZSgpKTsKCQl9CgkJCgkJLy9XZSBtYW5hZ2UgdGhlICgidW5pcXVlIikgaW5kZXhlcwoJCSRpbmRleGVzID0gJGVudGl0eVBhcmFtLT5nZXRJbmRleGVzKCk7CgoJCS8vRm9yIGVhY2ggRmllbGQgY29udGFpbmVkIGluIHRoZSBlbnRpdHkKCQlmb3JlYWNoKCRpbmRleGVzIGFzICRpbmRleCkgewoJCQkkcmVzdWx0ID0gT3JtRGI6OmNyZWF0ZUluZGV4KCRlbnRpdHlQYXJhbS0+Z2V0RGJuYW1lKCksICRpbmRleFsnZmllbGRzJ10sICRpbmRleFsndW5pcXVlJ10pOwoJCX0KCgkJLy9XZSBpbml0aWF0ZSB0aGUgdGFibGUuCgkJJGVudGl0eVBhcmFtLT5pbml0VGFibGUoKTsKCX0KICAgIAogICAgLyoqCiAgICAqIERyb3AgdGhlIHRhYmxlIGZvciB0aGUgT3JtRW50aXR5IGluIHBhcmFtZXRlcnMKICAgICogIFdpbGwgYWxzbyBkcm9wIHRoZSBzZXF1ZW5jZSBpZiBpdCdzIG5lZWRlZAogICAgKiAKICAgICogQHBhcmFtIE9ybUVudGl0eSAkZW50aXR5UGFyYW0gYW4gaW5zdGFuY2Ugb2YgdGhlIGVudGl0eQogICAgKi8KCXB1YmxpYyBzdGF0aWMgZmluYWwgZnVuY3Rpb24gZHJvcFRhYmxlKE9ybUVudGl0eSAkZW50aXR5UGFyYW0pIHsKCgkJT3JtRGI6OmRyb3BUYWJsZSgkZW50aXR5UGFyYW0tPmdldERibmFtZSgpKTsKCgkJLy9JZiBuZWNlc3NhcnksIGl0IHdpbGwgZGVsZXRlIGEgc2VxdWVuY2Ugb24gdGhlIHRhYmxlLgoJCWlmKCRlbnRpdHlQYXJhbS0+Z2V0U2VxbmFtZSgpICE9IG51bGwpewoJCQlPcm1EYjo6ZHJvcFNlcXVlbmNlKCRlbnRpdHlQYXJhbS0+Z2V0U2VxbmFtZSgpKTsKCQl9Cgl9ICAKICAKICAgIC8qKgogICAgKiBXaWxsIGVkaXQgdGhlIHRhYmxlIG9mIHRoZSBPcm1FbnRpdHkgaW4gcGFyYW1ldGVycyB3aXRoIHRoZSBTUUwgcXVlcnkgaW4gcGFyYW1ldGVycwogICAgKiAKICAgICogICBleGFtcGxlIDogaWYgeW91IG5lZWQgdG8gZG8gCiAgICAqIAogICAgKiA8Y29kZT4gICAgICAgIAogICAgKiAgIEFMVEVSIFRBQkxFIGAgdGFibGUgb2YgdGhlIEN1c3RvbWVyIGVudGl0eSBgIEFERCBgbmV3Q29sdW1uYCBJTlQgTk9UIE5VTEwgCiAgICAqICAgQUxURVIgVEFCTEUgYCB0YWJsZSBvZiB0aGUgQ3VzdG9tZXIgZW50aXR5IGAgRFJPUCBgb2xkQ29sdW1uYCAKICAgICogPC9jb2RlPgogICAgKiAKICAgICogIHRoZSBjb2RlIG11c3QgYmUgOgogICAgKiAKICAgICogPGNvZGU+CiAgICAqICAgICAgICRjdXN0b21lciA9IE15QXV0b2xvYWQ6OmdldEluc3RhbmNlKCR0aGlzLT5HZXROYW1lKCksICdjdXN0b21lcicpOwogICAgKiAgICAgICBPcm1Db3JlOjphbHRlclRhYmxlKCRjdXN0b21lciwgIkFERCBgbmV3Q29sdW1uYCBJTlQgTk9UIE5VTEwiKTsKICAgICogICAgICAgT3JtQ29yZTo6YWx0ZXJUYWJsZSgkY3VzdG9tZXIsICJEUk9QIGBvbGRDb2x1bW5gIik7CiAgICAqIDwvY29kZT4KICAgICogICAKICAgICogCiAgICAqIEBwYXJhbSBPcm1FbnRpdHkgJGVudGl0eVBhcmFtIGFuIGluc3RhbmNlIG9mIHRoZSBlbnRpdHkKICAgICogQHBhcmFtIHN0cmluZyAkc3FsIHRoZSBTUUwgcXVlcnkKICAgICovCglwdWJsaWMgc3RhdGljIGZpbmFsIGZ1bmN0aW9uIGFsdGVyVGFibGUoT3JtRW50aXR5ICRlbnRpdHlQYXJhbSwgJHNxbCkgewkKCQkkcXVlcnlBbHRlciA9ICJBTFRFUiBUQUJMRSAiLiRlbnRpdHlQYXJhbS0+Z2V0RGJuYW1lKCkuIiAiLiRzcWw7ICAgIAoJCQoJCS8vRXhlY3V0aW9uCgkJJHJlc3VsdCA9IE9ybURiOjpleGVjdXRlKCRxdWVyeUFsdGVyLAoJCQkJCQkJCQludWxsLAoJCQkJCQkJCQkiRGF0YWJhc2UgZXJyb3IgZHVyaW5nIE9ybUNvcmU6OmFsdGVyVGFibGUoT3JtRW50aXR5ICZ7JGVudGl0eVBhcmFtLT5nZXROYW1lKCl9LCB7JHNxbH0pIik7Cgl9CiAgICAKICAgIC8qKgogICAgICogSW5zZXJ0IGRhdGEgaW50byBkYXRhYmFzZS4KICAgICAqIAogICAgICogRXhhbXBsZSBmb3IgYSBuZXcgQ3VzdG9tZXIgOiBjdXN0b21lcl9pZCwgbmFtZSwgbGFzdE5hbWUgKG9wdGlvbmFsKSAKICAgICAqICAgCiAgICAgKiA8Y29kZT4KICAgICAqICAgICAgICRjdXN0b21lciA9IE15QXV0b2xvYWQ6OmdldEluc3RhbmNlKCR0aGlzLT5HZXROYW1lKCksICdjdXN0b21lcicpOwogICAgICogICAgICAgCiAgICAgKiAgICAgICAkY3VzdG9tZXItPnNldCgnbmFtZScsJ0R1cmFudCcpOwogICAgICogICAgICAgJGN1c3RvbWVyLT5zZXQoJ2xhc3ROYW1lJz0+J0pvaG4nKTsKICAgICAqIAogICAgICogICAgICAgT3JtQ29yZTo6aW5zZXJ0RW50aXR5KCRjdXN0b21lcik7CiAgICAgKiA8L2NvZGU+CgkgKgoJICogWW91IGNvdWxkIGFsc28gY29kZSBmb3IgdGhlIGxhc3QgbGluZSA6ICRjdXN0b21lci0+c2F2ZSgpOyAgaXQgd2lsbCBhdXRvbWF0aWNhbGx5IAogICAgICogCiAgICAgKiBJbXBvcnRhbnQgOiB5b3UgbXVzdCBub3Qgc2V0IHRoZSBwcmltYXJ5S2V5IHZhbHVlLiBJdCB3aWxsIGJlIGNhbGN1bGF0ZSBieSB0aGUgc3lzdGVtIGl0LXNlbGYKICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAqIEBwYXJhbSBPcm1FbnRpdHkgJGVudGl0eVBhcmFtIGFuIGluc3RhbmNlIG9mIHRoZSBlbnRpdHkKCSAqCiAgICAgKiBAcmV0dXJuIE9ybUVudGl0eSB0aGUgZW50aXR5IHNhdmVkIHdpdGggaXRzIG5ldyBuZXcgSWQgKGN1c3RvbWVyX2lkIGluIG15IGV4YW1wbGUpCiAgICAgKi8KCXB1YmxpYyBzdGF0aWMgZmluYWwgZnVuY3Rpb24gaW5zZXJ0RW50aXR5KE9ybUVudGl0eSAkZW50aXR5UGFyYW0pIHsKCgkJJGxpc3RlRmllbGQgPSAkZW50aXR5UGFyYW0tPmdldEZpZWxkcygpOwoJCSR2YWx1ZXMgPSAkZW50aXR5UGFyYW0tPmdldFZhbHVlcygpOwoJCSRpbmRleGVzID0gJGVudGl0eVBhcmFtLT5nZXRJbmRleGVzKCk7CgoJCSRxdWVyeUluc2VydCA9ICdJTlNFUlQgSU5UTyAnLiRlbnRpdHlQYXJhbS0+Z2V0RGJuYW1lKCkuJyAoJXMpIHZhbHVlcyAoJXMpJzsKCgkJJHN0cjEgPSAiIjsKCQkkc3RyMiA9ICIiOwoKCQkkcGFyYW1zID0gYXJyYXkoKTsKCQkJICAgCgkJLy9BbGwgdGhlIHJlcXVpcmVkIHZhbHVlcyBtdXN0IGJlIHByZXNlbnQKCQlmb3JlYWNoKCRsaXN0ZUZpZWxkIGFzICRmaWVsZCkKCQl7CgkJCWlmKCRmaWVsZC0+aXNBc3NvY2lhdGVLRVkoKSkgewoJCQkJY29udGludWU7CgkJCX0KCQkJCQkJCgkJCS8vV2UgZG9uJ3QgaW5zZXJ0IHRoZSB0cmFuc2llbnQgRmllbGRzIAoJCQlpZigkZmllbGQtPmdldFR5cGUoKSA9PSBPcm1DQVNUOjokTk9ORSkgewoJCQkJY29udGludWU7CgkJCX0KCQkJCgkJCWlmKCFlbXB0eSgkc3RyMSkpIHsKCQkJCSRzdHIxIC49ICcsJzsKCQkJCSRzdHIyIC49ICcsJzsKCQkJfQoJCQkkc3RyMSAuPSAnICcuJGZpZWxkLT5nZXROYW1lKCkuJyAnOwoJCQkkc3RyMiAuPSAnPyc7CgkJCQoJCQlpZigkZmllbGQtPmlzUHJpbWFyeUtFWSgpKSB7CgkJCQlpZighZW1wdHkoJHZhbHVlc1skZmllbGQtPmdldE5hbWUoKV0pKSB7CgkJCQkJaWYoJGVudGl0eVBhcmFtLT5pc0F1dG9pbmNyZW1lbnQoKSl7CgkJCQkJCXRocm93IG5ldyBPcm1JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oJ1ByaW1hcnkgS2V5ICcuJGZpZWxkLT5nZXROYW1lKCkuJyBjYW5cJ3QgYmUgc2V0dGVkIGR1cmluZyBpbnNlcnQgb3BlcmF0aW9uIGZvciBPcm1FbnRpdHknLiRlbnRpdHlQYXJhbS0+Z2V0TmFtZSgpKTsKCQkJCQl9CgkJCQl9IGVsc2UgaWYoISRlbnRpdHlQYXJhbS0+aXNBdXRvaW5jcmVtZW50KCkpewoJCQkJCSRuZXdJZCA9IE9ybURiOjpnZW5JRCgkZW50aXR5UGFyYW0tPmdldFNlcW5hbWUoKSk7CgkJCQkJJHZhbHVlc1skZmllbGQtPmdldE5hbWUoKV0gPSAkbmV3SWQ7CgkJCQkJJGVudGl0eVBhcmFtLT5zZXQoJGZpZWxkLT5nZXROYW1lKCksICRuZXdJZCk7CgkJCQl9IGVsc2V7CgkJCQkJJHZhbHVlc1skZmllbGQtPmdldE5hbWUoKV0gPSAwOwoJCQkJCSRlbnRpdHlQYXJhbS0+c2V0KCRmaWVsZC0+Z2V0TmFtZSgpLCAwKTsKCQkJCX0KCQkJfQoJCQkKCgoJCQkvL0VtcHR5IEZpZWxkIHRoYXQgc2hvdWxkbid0IGJlICEKCQkJaWYoISRmaWVsZC0+aXNOdWxsYWJsZSgpICYmICFpc3NldCgkdmFsdWVzWyRmaWVsZC0+Z2V0TmFtZSgpXSkpIHsKCQkJCS8vRXhjZXB0aW9uIDogaWYgdGhlIGZpZWxkIGhhdmUgYSBkZWZhdWx0IHZhbHVlIHdlIHNldCBpdCBtYW51YWxseQoJCQkJaWYoIWlzX251bGwoJGZpZWxkLT5nZXREZWZhdWx0VmFsdWUoKSkpewoJCQkJCSR2YWx1ZXNbJGZpZWxkLT5nZXROYW1lKCldID0gJGZpZWxkLT5nZXREZWZhdWx0VmFsdWUoKTsKCQkJCX0gZWxzZSB7CgkJCQkJdGhyb3cgbmV3IE9ybUlsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigndGhlIGZpZWxkICcuJGZpZWxkLT5nZXROYW1lKCkuJyBvZiBPcm1FbnRpdHkgICcuJGVudGl0eVBhcmFtLT5nZXROYW1lKCkuJyBjYW5cJ3QgYmUgbnVsbCcpOwoJCQkJfQoJCQl9CgkJCQoJCQkvLyBDb250cm9sIFVVSUQgdHlwZQoJCQlpZigkZmllbGQtPmdldFR5cGUoKSA9PSBPcm1DQVNUOjokVVVJRCAmJiAhZW1wdHkoJHZhbHVlc1skZmllbGQtPmdldE5hbWUoKV0pKXsKCQkJCSRwYXR0ZXJuID0gIi9eWzAtOWEtZl17OH0tWzAtOWEtZl17NH0tWzEtNV1bMC05YS1mXXszfS1bODlhYl1bMC05YS1mXXszfS1bMC05YS1mXXsxMn0kL2kiOwoJCQkJaWYoIXByZWdfbWF0Y2goJHBhdHRlcm4sICR2YWx1ZXNbJGZpZWxkLT5nZXROYW1lKCldKSl7CgkJCQkJdGhyb3cgbmV3IE9ybUlsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigndGhlIGZpZWxkICcuJGZpZWxkLT5nZXROYW1lKCkuJyBvZiBPcm1FbnRpdHkgICcuJGVudGl0eVBhcmFtLT5nZXROYW1lKCkuJyBkb2VzblwndCBtYXRjaCB0aGUgVVVJRCBwYXR0ZXJuIDogJy4kcGF0dGVybik7CgkJCQl9CgkJCX0KCQkJCgkJCQoJCQkkdmFsID0gbnVsbDsKCQkJaWYoaXNzZXQoJHZhbHVlc1skZmllbGQtPmdldE5hbWUoKV0pKQoJCQl7CgkJCQkkcGFyYW1zW10gPSBPcm1Db3JlOjpfZmllbGRUb0RCVmFsdWUoJHZhbHVlc1skZmllbGQtPmdldE5hbWUoKV0sICRmaWVsZC0+Z2V0VHlwZSgpKTsKCQkJfSBlbHNlIHsKCQkJCSRwYXJhbXNbXSA9IG51bGw7CgkJCX0KCQl9CgkJCgkJLy9jb250cm9sIHVuaXF1ZW5lc3Mgb24gdW5pcXVlIEZpZWxkCgkJZm9yZWFjaCgkaW5kZXhlcyBhcyAkaW5kZXgpewoJCQlpZighJGluZGV4Wyd1bmlxdWUnXSl7CgkJCQljb250aW51ZTsKCQkJfQoJCQkKCQkJJHF1ZXJ5ID0gJ1NFTEVDVCBDT1VOVCgqKSBGUk9NICcuJGVudGl0eVBhcmFtLT5nZXREYm5hbWUoKS4nIFdIRVJFIDEgJzsKCQkJJGFycmF5RmluZCA9IGFycmF5KCk7CgkJCSRtc2dFcnJvciA9ICd7JzsKCQkJJGlzRmlyc3QgPSB0cnVlOwoJCQlmb3JlYWNoKCRpbmRleFsnZmllbGRzJ10gYXMgJGVsdCl7CgkJCQlpZighJGlzRmlyc3QpewoJCQkJCSRtc2dFcnJvciAuPScsJzsKCQkJCX0KCQkJCWlmKGVtcHR5KCR2YWx1ZXNbJGVsdF0pKXsKCQkJCQkkcXVlcnkgLj0gJyBBTkQgJyAuICRlbHQgLiAnIElTIE5VTEwgJzsKCQkJCX0gZWxzZSB7CgkJCQkJJHF1ZXJ5IC49ICcgQU5EICcgLiAkZWx0IC4gJyA9ID8gJzsKCQkJCQkkYXJyYXlGaW5kW10gPSAkdmFsdWVzWyRlbHRdOwoJCQkJfQoJCQkJJG1zZ0Vycm9yIC49ICIgeyRlbHR9ID0geyR2YWx1ZXNbJGVsdF19ICI7CgkJCX0KICAgICAgICAgICAgZm9yZWFjaCgkZW50aXR5UGFyYW0tPmdldFBrKCkgYXMgJHBrbmFtZSA9PiAkcGspewogICAgICAgICAgICAgICAgJHF1ZXJ5IC49ICcgQU5EICcgLiAkcGtuYW1lIC4gJyAhPSA/ICc7CiAgICAgICAgICAgICAgICAkYXJyYXlGaW5kW10gPSAkdmFsdWVzWyRwa25hbWVdOwogICAgICAgICAgICB9CgkJCSRtc2dFcnJvciAuPSAnfSc7CgkJCQoJCQkvL0V4ZWN1dGlvbgoJCQkkcmVzdWx0ID0gT3JtRGI6OmdldE9uZSgkcXVlcnksCgkJCQkJCQkJCSRhcnJheUZpbmQsCgkJCQkJCQkJCSJEYXRhYmFzZSBlcnJvciBkdXJpbmcgdW5pY2l0eSBjb250cm9sIGluIE9ybUNvcmU6Omluc2VydEVudGl0eShPcm1FbnRpdHkgJnskZW50aXR5UGFyYW0tPmdldE5hbWUoKX0pIik7CgkJCgkJCWlmKCRyZXN1bHQgIT0gMCl7CgkJCQl0aHJvdyBuZXcgT3JtSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJhbiBFbnRpdHkgeyRlbnRpdHlQYXJhbS0+Z2V0TmFtZSgpfSB3aXRoIHRoZSBzYW1lIGZpZWxkcyAoeyRtc2dFcnJvcn0pIGFscmVhZHkgZXhpc3RzIGluIGRhdGFiYXNlIik7CgkJCX0KCQl9CgkJCgkJLy9FeGVjdXRpb24KCQkkcmVzdWx0ID0gT3JtRGI6OmV4ZWN1dGUoc3ByaW50ZigkcXVlcnlJbnNlcnQsICRzdHIxLCAkc3RyMiksCgkJCQkJCQkJCSRwYXJhbXMsCgkJCQkJCQkJCSJEYXRhYmFzZSBlcnJvciBkdXJpbmcgT3JtQ29yZTo6aW5zZXJ0RW50aXR5KE9ybUVudGl0eSAmeyRlbnRpdHlQYXJhbS0+Z2V0TmFtZSgpfSkiKTsKCQkKCgkvKglpZigkZW50aXR5UGFyYW0tPmlzSW5kZXhhYmxlKCkpIHsgIAoJCQlPcm1JbmRleGluZzo6QWRkV29yZHMoJGVudGl0eVBhcmFtLT5nZXRNb2R1bGVOYW1lKCksIE9ybUNvcmU6OmZpbmRCeUlkKCRlbnRpdHlQYXJhbSwkYXJyYXlLRVlbMF0pKTsKCQl9Ki8KCQkKCQkvL2VtcHR5IGNhY2hlCgkJT3JtQ2FjaGU6OmdldEluc3RhbmNlKCktPmNsZWFyQ2FjaGUoKTsKCQkKICAgICAgICBpZigkZW50aXR5UGFyYW0tPmlzQXV0b2luY3JlbWVudCgpKXsKICAgICAgICAgICAgLy9HZXQgdGhlIGxhc3QgSWQgaW5zZXJ0ZWQgIChvbmx5IGZvciBlbnRpdHkgd2l0aCBvbmx5IDEgaW50ZWdlciBGaWVsZCBhcyBLZXkpCiAgICAgICAgICAgIC8vIEBzZWUgYWxzbyA6IGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMzcyMzg4L215c3FsLXNlbGVjdC1sYXN0LWluc2VydC1pZC1mb3ItY29tcG91bmQta2V5LWlzLWl0LXBvc3NpYmxlCiAgICAgICAgICAgICRuYlBrSW50ZWdlciA9IDA7CiAgICAgICAgICAgICRuYW1lT2ZQayA9ICcnOwogICAgICAgICAgICBmb3JlYWNoKCRlbnRpdHlQYXJhbS0+Z2V0UGsoKSBhcyAkcGspewogICAgICAgICAgICAgICAgaWYoJHBrLT5nZXRUeXBlKCkgPT0gT3JtQ0FTVDo6JElOVEVHRVIpewogICAgICAgICAgICAgICAgICAgICRuYlBrSW50ZWdlcisrOwogICAgICAgICAgICAgICAgICAgICRuYW1lT2ZQayA9ICRway0+Z2V0TmFtZSgpOwoJCSAgICAgICAgICAgIH0KICAgICAgICAgICAgCX0KICAgICAgICAgICAgaWYoJG5iUGtJbnRlZ2VyID09IDEgJiYgJG5hbWVPZlBrICE9ICcnICYmIGVtcHR5KCR2YWx1ZXNbJG5hbWVPZlBrXSkpewogICAgICAgICAgICAgICAgJG5ld0lkID0gT3JtRGI6OmdldE9uZSgiU0VMRUNUIExBU1RfSU5TRVJUX0lEKCkiKTsKICAgICAgICAgICAgICAgICRlbnRpdHlQYXJhbS0+c2V0KCRuYW1lT2ZQaywgJG5ld0lkKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAKCQlyZXR1cm4gJGVudGl0eVBhcmFtOwoKCX0KCQogICAgLyoqCiAgICAgKiAgVXBkYXRlIGRhdGEgaW50byBkYXRhYmFzZS4gVGhlIHRoaXJkIHBhcmFtZXRlciBtdXN0IGZvbGxvdyB0aGlzIHNjaGVtZQogICAgICogCiAgICAgKiBFeGFtcGxlIGZvciBhIG5ldyBDdXN0b21lciA6IAogICAgICogCiAgICAgKiA8Y29kZT4KICAgICAqICAgICAgICRteUFycmF5ID0gYXJyYXkoKTsKICAgICAqICAgICAgICRteUFycmF5W10gPSBhcnJheSgnY3VzdG9tZXJfaWQnPT4xLCAnbGFzdE5hbWUnPT5udWxsLCAnbmFtZSc9PidEdXBvbnQnKTsgICAgPC0tIHVwZGF0ZSBOYW1lIHZhbHVlLCBlcmFzZSBsYXN0TmFtZSB2YWx1ZSBpbiBkYXRhYmFzZQogICAgICogICAgICAgJG15QXJyYXlbXSA9IGFycmF5KCdjdXN0b21lcl9pZCc9PjIsICduYW1lJz0+J0R1cmFudCcpOyAgICAgICAgICAgICAgICAgICAgICA8LS0gdXBkYXRlIE5hbWUgdmFsdWUKICAgICAqICAgICAgICRteUFycmF5W10gPSBhcnJheSgnY3VzdG9tZXJfaWQnPT4zLCAnbGFzdE5hbWUnPT4nSm9obicsICduYW1lJz0+J0RvZScpOyAgICAgPC0tIHVwZGF0ZSBOYW1lIHZhbHVlIGFuZCBsYXN0TmFtZSB2YWx1ZQogICAgICogCiAgICAgKiAgICAgICAkY3VzdG9tZXIgPSBNeUF1dG9sb2FkOjpnZXRJbnN0YW5jZSgkdGhpcy0+R2V0TmFtZSgpLCAnY3VzdG9tZXInKTsKICAgICAqICAgICAgIAogICAgICogICAgICAgJGN1c3RvbWVyID0gT3JtQ29yZTo6ZmluZEJ5SWQoJGN1c3RvbWVyLCAxKTsKICAgICAqICAgICAgICRjdXN0b21lci0+c2V0KCdsYXN0TmFtZSc9PidOZXdMYXN0TmFtZScpOwogICAgICogCiAgICAgKiAgICAgICBPcm1Db3JlOjp1cGRhdGVFbnRpdHkoJGN1c3RvbWVyKTsKICAgICAqIDwvY29kZT4KICAgICAqIAkgCiAgICAgKiBZb3UgY291bGQgYWxzbyBjb2RlIGZvciB0aGUgbGFzdCBsaW5lIDogJGN1c3RvbWVyLT5zYXZlKCk7ICBpdCB3aWxsIGF1dG9tYXRpY2FsbHkgCgkgKgogICAgICogQHBhcmFtIE9ybUVudGl0eSAkZW50aXR5UGFyYW0gYW4gaW5zdGFuY2Ugb2YgdGhlIGVudGl0eQoJICoKCSAqIEByZXR1cm4gT3JtRW50aXR5IHRoZSBlbnRpdHkgc2F2ZWQgd2l0aCBpdHMgbmV3IElkIChjdXN0b21lcl9pZCBpbiBteSBleGFtcGxlKQogICAgICovCQoJcHVibGljIHN0YXRpYyBmaW5hbCBmdW5jdGlvbiB1cGRhdGVFbnRpdHkoT3JtRW50aXR5ICRlbnRpdHlQYXJhbSkgewoKCQkkbGlzdGVGaWVsZCA9ICRlbnRpdHlQYXJhbS0+Z2V0RmllbGRzKCk7CgkJJHZhbHVlcyA9ICRlbnRpdHlQYXJhbS0+Z2V0VmFsdWVzKCk7CgkJJGluZGV4ZXMgPSAkZW50aXR5UGFyYW0tPmdldEluZGV4ZXMoKTsKCgkJJHN0ciA9ICIiOwoJCSR3aGVyZSA9ICcnOwoJCSRwYXJhbXMgPSBhcnJheSgpOwoJCSRoYXNLZXkgPSBmYWxzZTsKCQkgIAoJCS8vQWxsIHRoZSByZXF1aXJlZCB2YWx1ZXMgbXVzdCBiZSBwcmVzZW50CgkJZm9yZWFjaCgkbGlzdGVGaWVsZCBhcyAkZmllbGQpIHsKCQkKCQkJLy9XZSBkb24ndCB1cGRhdGUgdGhlIHRyYW5zaWVudCBGaWVsZHMgCgkJCWlmKCRmaWVsZC0+Z2V0VHlwZSgpID09IE9ybUNBU1Q6OiROT05FKSB7CgkJCQljb250aW51ZTsKCQkJfQoKCQkJLy9pZiB0aGUgZmllbGQgaXMgZW1wdHkgYW5kIHdlIGhhdmUgYSBkZWZhdWx0IHZhbHVlIHdlIHNldCBpdCBtYW51YWxseQoJCQlpZihlbXB0eSgkdmFsdWVzWyRmaWVsZC0+Z2V0TmFtZSgpXSkgJiYgJGZpZWxkLT5nZXREZWZhdWx0VmFsdWUoKSAhPSBudWxsKXsKCQkJCSR2YWx1ZXNbJGZpZWxkLT5nZXROYW1lKCldID0gJGZpZWxkLT5nZXREZWZhdWx0VmFsdWUoKTsKCQkJfSAKCQkKCQkJLy9JZiBpdCdzIG5vdCBzZXQKCQkJaWYoaXNfbnVsbCgoJHZhbHVlc1skZmllbGQtPmdldE5hbWUoKV0pKSkgewoJCQkKCQkJCS8vSWYgaXQncyBhIHByaW1hcnlLZXkgd2UgdGhyb3cgYSBleGNlcHRpb24KCQkJCWlmKCRmaWVsZC0+aXNQcmltYXJ5S0VZKCkpIHsKCQkJCQl0aHJvdyBuZXcgT3JtSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCd0aGUgcHJpbWFyeUtleSAnLiRmaWVsZC0+Z2V0TmFtZSgpLicgaXMgbWlzc2luZyBmb3IgdGhlIGVudGl0eSA6ICcuJGVudGl0eVBhcmFtLT5nZXROYW1lKCkpOwoJCQkJfQoJCQkJCgkJCQkvL2FuIGVtcHR5IGFzc29jaWF0aXZlIGZpZWxkIDogbm8gcHJvYmxlbSwgd2UgY2FuIHBhc3MKCQkJCWlmKCRmaWVsZC0+aXNBc3NvY2lhdGVLRVkoKSkgewoJCQkJCWNvbnRpbnVlOwoJCQkJfQoJCQkJCgkJCQkvL0lmIGl0J3MgYSBubyBudWxsYWJsZSBmaWVsZCB3ZSB0aHJvdyBhIGV4Y2VwdGlvbgoJCQkJaWYoISRmaWVsZC0+aXNOdWxsYWJsZSgpKSB7CgkJCQkJdGhyb3cgbmV3IE9ybUlsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigndGhlIGZpZWxkICcuJGZpZWxkLT5nZXROYW1lKCkuJyBvZiBFbnRpdHkgICcuJGVudGl0eVBhcmFtLT5nZXROYW1lKCkuJyBjYW5cJ3QgYmUgbnVsbCcpOwoJCQkJfQoJCQl9IGVsc2UgewoJCQkJLy8gQ29udHJvbCBVVUlEIHR5cGUKCQkJCWlmKCRmaWVsZC0+Z2V0VHlwZSgpID09IE9ybUNBU1Q6OiRVVUlEKXsKCQkJCQkkcGF0dGVybiA9ICcvXlswLTlhLWZdezh9LVswLTlhLWZdezR9LVsxLTVdWzAtOWEtZl17M30tWzg5YWJdWzAtOWEtZl17M30tWzAtOWEtZl17MTJ9JC9pJzsKCQkJCQkKCQkJCQlpZighcHJlZ19tYXRjaCgkcGF0dGVybiwgJHZhbHVlc1skZmllbGQtPmdldE5hbWUoKV0pKXsKCQkJCQkJdGhyb3cgbmV3IE9ybUlsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigndGhlIGZpZWxkICcuJGZpZWxkLT5nZXROYW1lKCkuJyBvZiBFbnRpdHkgICcuJGVudGl0eVBhcmFtLT5nZXROYW1lKCkuJyBkb2VzblwndCBtYXRjaCB0aGUgVVVJRCBwYXR0ZXJuIDogJy4kcGF0dGVybik7CgkJCQkJfQoJCQkJfQoJCQl9CgkJCQoJCQkKCQkJCgkJCS8vSWYgaXQncyBhIHByaW1hcnlLZXkKCQkJaWYoJGZpZWxkLT5pc1ByaW1hcnlLRVkoKSkgewoJCQkJJHdoZXJlID0gJyBXSEVSRSAnLiRmaWVsZC0+Z2V0TmFtZSgpLicgPSA/JzsKCQkJCSRoYXNLZXkgPSB0cnVlOwoJCQkJJGtleVZhbHVlID0gJHZhbHVlc1skZmllbGQtPmdldE5hbWUoKV07CgkJCX0KCgkJCWlmKCFlbXB0eSgkc3RyKSkgewoJCQkgICRzdHIgLj0gJywnOwoJCQl9CgoJCQkkc3RyIC49ICcgJy4kZmllbGQtPmdldE5hbWUoKS4nID0gPyAnOwoKCQkJJHBhcmFtc1tdID0gT3JtQ29yZTo6X2ZpZWxkVG9EQlZhbHVlKCR2YWx1ZXNbJGZpZWxkLT5nZXROYW1lKCldLCAkZmllbGQtPmdldFR5cGUoKSk7CgoJCX0KCQkKCQkvL2NvbnRyb2wgdW5pcXVlbmVzcyBvbiB1bmlxdWUgRmllbGQKCQlmb3JlYWNoKCRpbmRleGVzIGFzICRpbmRleCl7CgkJCWlmKCEkaW5kZXhbJ3VuaXF1ZSddKXsKCQkJCWNvbnRpbnVlOwoJCQl9CgkJCQoJCQkkcXVlcnkgPSAnU0VMRUNUIENPVU5UKCopIEZST00gJy4kZW50aXR5UGFyYW0tPmdldERibmFtZSgpLicgV0hFUkUgMSAnOwoJCQkkYXJyYXlGaW5kID0gYXJyYXkoKTsKCQkJJG1zZ0Vycm9yID0gJ3snOwoJCQkkaXNGaXJzdCA9IHRydWU7CgkJCWZvcmVhY2goJGluZGV4WydmaWVsZHMnXSBhcyAkZWx0KXsKCQkJCWlmKCEkaXNGaXJzdCl7CgkJCQkJJG1zZ0Vycm9yIC49JywnOwoJCQkJfQoJCQkJaWYoZW1wdHkoJHZhbHVlc1skZWx0XSkpewoJCQkJCSRxdWVyeSAuPSAnIEFORCAnIC4gJGVsdCAuICcgSVMgTlVMTCAnOwoJCQkJfSBlbHNlIHsKCQkJCQkkcXVlcnkgLj0gJyBBTkQgJyAuICRlbHQgLiAnID0gPyAnOwoJCQkJCSRhcnJheUZpbmRbXSA9ICR2YWx1ZXNbJGVsdF07CgkJCQl9CgkJCQkkbXNnRXJyb3IgLj0gIiB7JGVsdH0gPSB7JHZhbHVlc1skZWx0XX0gIjsKCQkJfQoJCQlmb3JlYWNoKCRlbnRpdHlQYXJhbS0+Z2V0UGsoKSBhcyAkcGtuYW1lID0+ICRwayl7CgkJCQkkcXVlcnkgLj0gJyBBTkQgJyAuICRwa25hbWUgLiAnICE9ID8gJzsKCQkJCSRhcnJheUZpbmRbXSA9ICR2YWx1ZXNbJHBrbmFtZV07CQkJCgkJCX0KCgkJCSRtc2dFcnJvciAuPSAnfSc7CgkJCQoJCQkvL0V4ZWN1dGlvbgoJCQkkcmVzdWx0ID0gT3JtRGI6OmdldE9uZSgkcXVlcnksCgkJCQkJCQkJCSRhcnJheUZpbmQsCgkJCQkJCQkJCSJEYXRhYmFzZSBlcnJvciBkdXJpbmcgdW5pY2l0eSBjb250cm9sIGluIE9ybUNvcmU6OnVwZGF0ZUVudGl0eShPcm1FbnRpdHkgJnskZW50aXR5UGFyYW0tPmdldE5hbWUoKX0pIik7CgkJCgkJCWlmKCRyZXN1bHQgIT0gMCl7CgkJCQl0aHJvdyBuZXcgT3JtSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJhbiBFbnRpdHkgeyRlbnRpdHlQYXJhbS0+Z2V0TmFtZSgpfSB3aXRoIHRoZSBzYW1lIGZpZWxkcyAoeyRtc2dFcnJvcn0pIGFscmVhZHkgZXhpc3RzIGluIGRhdGFiYXNlIik7CgkJCX0KCQl9CgoJCWlmKCRoYXNLZXkpIHsKCQkJJHBhcmFtc1tdID0gJGtleVZhbHVlOwoJCX0KCgkJJHF1ZXJ5VXBkYXRlID0gJ1VQREFURSAnLiRlbnRpdHlQYXJhbS0+Z2V0RGJuYW1lKCkuJyBTRVQgJy4kc3RyLiR3aGVyZTsKCQoJCS8vRXhlY3V0aW9uCgkJJHJlc3VsdCA9IE9ybURiOjpleGVjdXRlKCRxdWVyeVVwZGF0ZSwKCQkJCQkJCQkJJHBhcmFtcywKCQkJCQkJCQkJIkRhdGFiYXNlIGVycm9yIGR1cmluZyBPcm1Db3JlOjp1cGRhdGVFbnRpdHkoT3JtRW50aXR5ICZ7JGVudGl0eVBhcmFtLT5nZXROYW1lKCl9KSIpOwoJCQoJCS8qaWYoJGVudGl0eVBhcmFtLT5pc0luZGV4YWJsZSgpKSB7ICAKCQkJT3JtSW5kZXhpbmc6OlVwZGF0ZVdvcmRzKCRlbnRpdHlQYXJhbS0+Z2V0TW9kdWxlTmFtZSgpLCAkZW50aXR5UGFyYW0pOwoJCX0qLwoJCQoJCS8vZW1wdHkgY2FjaGUKCQlPcm1DYWNoZTo6Z2V0SW5zdGFuY2UoKS0+Y2xlYXJDYWNoZSgpOwoJCQoJCXJldHVybiAkZW50aXR5UGFyYW07Cgl9CiAgCiAgICAvKioKICAgICogRGVsZXRlIGluZm9ybWF0aW9uIGludG8gZGF0YWJhc2UKICAgICogICAKICAgICogRXhhbXBsZSBmb3IgYSBzaW5nbGUgZGVsZXRpb24gOiAKICAgICogCiAgICAqIDxjb2RlPgogICAgKiAgICAgICAkY3VzdG9tZXIgPSBNeUF1dG9sb2FkOjpnZXRJbnN0YW5jZSgkdGhpcy0+R2V0TmFtZSgpLCAnY3VzdG9tZXInKTsKICAgICogCiAgICAqICAgICAgIE9ybUNvcmU6OmRlbGV0ZUJ5SWRzKCRjdXN0b21lciwgYXJyYXkoMSk7CiAgICAqIDwvY29kZT4KICAgICogCiAgICAqICBFeGFtcGxlIGZvciBtdWx0aXBsZSBkZWxldGlvbiA6IAogICAgKiAKICAgICogPGNvZGU+CiAgICAqICAgICAgICRteUFycmF5ID0gYXJyYXkoKTsKICAgICogICAgICAgJG15QXJyYXlbXSA9IDE7CiAgICAqICAgICAgICRteUFycmF5W10gPSAyOwogICAgKiAgICAgICAkbXlBcnJheVtdID0gMzsKICAgICogCiAgICAqICAgICAgICRjdXN0b21lciA9IE15QXV0b2xvYWQ6OmdldEluc3RhbmNlKCR0aGlzLT5HZXROYW1lKCksICdjdXN0b21lcicpOwogICAgKiAKICAgICogICAgICAgT3JtQ29yZTo6ZGVsZXRlQnlJZHMoJGN1c3RvbWVyLCAkbXlBcnJheSk7CiAgICAqIDwvY29kZT4KICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICogQHBhcmFtIE9ybUVudGl0eSAkZW50aXR5UGFyYW0gYW4gaW5zdGFuY2Ugb2YgdGhlIGVudGl0eSAgICAKICAgICogQHBhcmFtIG1peGVkW10gJGlkcyBhcnJheSBhbGwgdGhlIGlkcyB0byBkZWxldGUgKCRjdXN0b21lcl9pZCBpbiBteSBleGFtcGxlKQogICAgKi8KCXB1YmxpYyBzdGF0aWMgZmluYWwgZnVuY3Rpb24gZGVsZXRlQnlJZHMoT3JtRW50aXR5ICRlbnRpdHlQYXJhbSwgJGlkcykgewoKCQkkbGlzdGVGaWVsZCA9ICRlbnRpdHlQYXJhbS0+Z2V0RmllbGRzKCk7CgoJCWZvcmVhY2goJGxpc3RlRmllbGQgYXMgJGZpZWxkKQoJCXsKCQkgIGlmKCEkZmllbGQtPmlzUHJpbWFyeUtFWSgpKQoJCSAgeyAKCQkJY29udGludWU7CgkJICB9CgkJICAkdHlwZSA9ICRmaWVsZC0+Z2V0VHlwZSgpOwoJCSAgJG5hbWUgPSAkZmllbGQtPmdldE5hbWUoKTsKCQl9ICAKCgkJJHdoZXJlID0gJyc7CgkJZm9yZWFjaCgkaWRzIGFzICRzaWQpCgkJewoJCSAgaWYoIWVtcHR5KCR3aGVyZSkpCgkJICB7CgkJCSR3aGVyZSAuPSAnIE9SICc7CgkJICB9CgkJICAKCQkgICR3aGVyZSAuPSAkbmFtZS4nID0gPyc7CgkJICAkcGFyYW1zW10gPSBPcm1Db3JlOjpfZmllbGRUb0RCVmFsdWUoJHNpZCwgJHR5cGUpOyAgCgkJfQoKCgkJJHF1ZXJ5RGVsZXRlID0gJ0RFTEVURSBGUk9NICcuJGVudGl0eVBhcmFtLT5nZXREYm5hbWUoKS4nIFdIRVJFICcuJHdoZXJlOwoKCQkvL0V4ZWN1dGlvbgoJCSRyZXN1bHQgPSBPcm1EYjo6ZXhlY3V0ZSgkcXVlcnlEZWxldGUsCgkJCQkJCQkJCSRwYXJhbXMsCgkJCQkJCQkJCSJEYXRhYmFzZSBlcnJvciBkdXJpbmcgT3JtQ29yZTo6ZGVsZXRlRW50aXR5KE9ybUVudGl0eSAmeyRlbnRpdHlQYXJhbS0+Z2V0TmFtZSgpfSkiKTsKCQkJCQkJCQkJCgkJCgoJCS8vaWYoJGVudGl0eVBhcmFtLT5pc0luZGV4YWJsZSgpKQoJCS8veyAgCgkJICAvLyAkbW9kb3BzID0gY21zbXMoKS0+R2V0TW9kdWxlT3BlcmF0aW9ucygpOwoJCSAgLy8gaWYobWV0aG9kX2V4aXN0cygkbW9kb3BzLCJHZXRTZWFyY2hNb2R1bGUiKSkKCQkgIC8vIHsKCQkJLy8gT3JtSW5kZXhpbmc6OnNldFNlYXJjaCgkbW9kb3BzLT5HZXRTZWFyY2hNb2R1bGUoKSk7CgkJICAvLyB9CgkJICAvL2ZvcmVhY2goJGlkcyBhcyAkc2lkKQoJCSAgLy97CgkJCS8vT3JtSW5kZXhpbmc6OkRlbGV0ZVdvcmRzKCRlbnRpdHlQYXJhbS0+Z2V0TW9kdWxlTmFtZSgpLCAkZW50aXR5UGFyYW0sICRzaWQpOwoJCSAgLy99CgkJICAKCQkvL30KCQkKCQkvL2VtcHR5IGNhY2hlCgkJT3JtQ2FjaGU6OmdldEluc3RhbmNlKCktPmNsZWFyQ2FjaGUoKTsKCX0KICAgCiAgICAvKioKICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIG9jY3VycmVuY2VzIGZyb20gdGhlIHRhYmxlIG9mIHRoZSBlbnRpdHkgaW4gUGFyYW1ldGVycwogICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICogQHBhcmFtIE9ybUVudGl0eSAkZW50aXR5UGFyYW0gYW4gaW5zdGFuY2Ugb2YgdGhlIGVudGl0eSAgICAKCSogCiAgICAqIEByZXR1cm4gaW50IHRoZSBudW1iZXIgb2Ygb2NjdXJyZW5jZXMgZnJvbSB0aGUgdGFibGUgICAKICAgICovCglwdWJsaWMgc3RhdGljIGZpbmFsIGZ1bmN0aW9uIGNvdW50QWxsKE9ybUVudGl0eSAkZW50aXR5UGFyYW0pIHsKCgkJJHF1ZXJ5U2VsZWN0ID0gJ1NFTEVDVCBjb3VudCgqKSBGUk9NICcuJGVudGl0eVBhcmFtLT5nZXREYm5hbWUoKTsKCQkKCQkvL0V4ZWN1dGlvbgoJCSRyZXN1bHQgPSBPcm1EYjo6Z2V0T25lKCRxdWVyeVNlbGVjdCwKCQkJCQkJCQkJbnVsbCwKCQkJCQkJCQkJIkRhdGFiYXNlIGVycm9yIGR1cmluZyBPcm1Db3JlOjpjb3VudEFsbChPcm1FbnRpdHkgJnskZW50aXR5UGFyYW0tPmdldE5hbWUoKX0pIik7CgkJCgkJcmV0dXJuICRyZXN1bHQ7Cgl9CiAgCiAgICAvKioKICAgICogUmV0dXJucyBhbGwgdGhlIG9jY3VycmVuY2VzIGZyb20gdGhlIHRhYmxlIG9mIHRoZSBlbnRpdHkgaW4gUGFyYW1ldGVycwogICAgKiAKICAgICogQHBhcmFtIE9ybUVudGl0eSAkZW50aXR5UGFyYW0gYW4gaW5zdGFuY2Ugb2YgdGhlIGVudGl0eSAgCiAgICAqIEBwYXJhbSBPcm1PcmRlckJ5ICRvcmRlckJ5IHRoZSBvcmRlciBpZiBuZWNlc3NhcnkKICAgICogQHBhcmFtIE9ybUxpbWl0ICRsaW1pdCB0aGUgbGltaXQgaWYgbmVjZXNzYXJ5CgkqCiAgICAqIEByZXR1cm4gT3JtRW50aXR5W10gbGlzdCBvZiBFbnRpdGllcyBmb3VuZAogICAgKi8KCXB1YmxpYyBzdGF0aWMgZmluYWwgZnVuY3Rpb24gZmluZEFsbChPcm1FbnRpdHkgJGVudGl0eVBhcmFtLCBPcm1PcmRlckJ5ICRvcmRlckJ5PW51bGwsIE9ybUxpbWl0ICRsaW1pdCA9IG51bGwpIHsKCQlyZXR1cm4gT3JtQ29yZTo6ZmluZEJ5RXhhbXBsZSgkZW50aXR5UGFyYW0sIG5ldyBPcm1FeGFtcGxlKCksICRvcmRlckJ5LCAkbGltaXQpOwoJfQoJCgkvKioKCSAqIElubmVyIGZ1bmN0aW9uIHRvIGZhY3Rvcml6ZSBzb21lIGNvZGUgZm9yIGVhY2ggImZpbmQqIiBmdW5jdGlvbnMKCSAqICBJdCB3aWxsIHJldHJpZXZlIGFsbCB0aGUgaW5mb3JtYXRpb25zIG9uIHRoZSBBSydzIEZpZWxkCgkgKgogICAgICogQHBhcmFtIE9ybUVudGl0eSAkZW50aXR5UGFyYW0gYW4gaW5zdGFuY2Ugb2YgdGhlIGVudGl0eSAgCgkgKiBAcGFyYW0gT3JtRW50aXR5W10gJGVudGl0eXMgdGhlIGxpc3Qgb2Ygb2JqZWN0IEVudGl0eSB0byBwb3B1bGF0ZQoJICoKICAgICAqIEByZXR1cm4gT3JtRW50aXR5W10gbGlzdCBvZiBFbnRpdGllcyBwb3B1bGF0ZSB3aXRoIGFsbCB0aGUgaW5mb3JtYXRpb25zIG9uIEFLJ3MgRmllbGQKCSAqKi8KCXB1YmxpYyBzdGF0aWMgZmluYWwgZnVuY3Rpb24gcG9wdWxhdGVGaWVsZHMoT3JtRW50aXR5ICRlbnRpdHlQYXJhbSwgYXJyYXkgJGVudGl0eXMpIHsKCQkKCQlpZihlbXB0eSgkZW50aXR5cykpewoJCQlyZXR1cm4gJGVudGl0eXM7CgkJfQoKCQkkbGlzdGVGaWVsZCA9ICRlbnRpdHlQYXJhbS0+Z2V0RmllbGRzKCk7CgkJZm9yZWFjaCgkbGlzdGVGaWVsZCBhcyAkZmllbGQpIHsKCgkJCS8vVGVzdCB0aGUgcHJlc2VuY2Ugb2YgJEFLCgkJICAJaWYoJGZpZWxkLT5pc0Fzc29jaWF0ZUtFWSgpKSB7CgkJCQkkZW50aXR5cyA9IE9ybUNvcmU6OnBvcHVsYXRlQUtGaWVsZCgkZW50aXR5UGFyYW0sICRlbnRpdHlzLCAkZmllbGQpOwoJCSAgCX0gCgkJICAJCgkJICAJLy9UZXN0IHRoZSBwcmVzZW5jZSBvZiAkRksKCQkgIAlpZigkZmllbGQtPmlzRm9yZWlnbktFWSgpICYmIHN0cnBvcygkZmllbGQtPmdldEtFWU5hbWUoKSwiLiIpKSB7CgkJICAJCQoJCSAgCQlsaXN0KCRlbnRpdHlBc3NvY05hbWUsICRmaWVsZEFzc29jaWF0ZU5hbWUpID0gZXhwbG9kZSgiLiIsICRmaWVsZC0+Z2V0S0VZTmFtZSgpKTsKCQkJCSRlbnRpdHlBc3NvYyA9IG5ldyAkZW50aXR5QXNzb2NOYW1lKCk7CgkJICAJCQoJCSAgCQkvL0F2b2lkIEZLIHBvaW50aW5nIG9uIGNvbXBvc2l0ZSBwcmltYXJ5IGtleQoJCSAgCQlpZihjb3VudCgkZW50aXR5QXNzb2MtPmdldFBrKCkpID09IDEpewoJCSAgCQkJJGVudGl0eXMgPSBPcm1Db3JlOjpwb3B1bGF0ZUZLRmllbGQoJGVudGl0eVBhcmFtLCAkZW50aXR5cywgJGZpZWxkKTsKCQkgIAkJfQoJCSAgCX0KCQl9CgoJCSRhbGlhcyA9ICRlbnRpdHlQYXJhbS0+Z2V0QWxpYXMoKTsKCQlmb3JlYWNoICgkYWxpYXMgYXMgJGFuQWxpYXMgPT4gJGFsaWFzQ29tcG9uZW50KSB7CgkJCSRlbnRpdHlzID0gT3JtQ29yZTo6cG9wdWxhdGVBbGlhc0ZpZWxkKCRlbnRpdHlQYXJhbSwgJGVudGl0eXMsICRhbkFsaWFzKTsKCQl9CgkJCgkJcmV0dXJuICRlbnRpdHlzOwoJfQoKCS8qKgoJICogV2lsbCBmb3VuZCBhbGwgdGhlIGVudGl0eXMgYXZhaWxhYmxlIGZvciB0aGUgQWxpYXMgcGFyYW1ldGVyICRlbnRpdHlQYXJhbS4KCSAqICAgQWxsb3cgJG15ZW50aXR5LT5nZXQoJ215X2FsaWFzJyk7CgkgKiAKCSAqIAogICAgICogQHBhcmFtIE9ybUVudGl0eSAkZW50aXR5UGFyYW0gYW4gaW5zdGFuY2Ugb2YgdGhlIGVudGl0eSAgCgkgKiBAcGFyYW0gT3JtRW50aXR5W10gJGVudGl0eXMgYXJyYXkgbGlzdCBvZiBPYmplY3QgT3JtRW50aXR5CgkgKiBAcGFyYW0gc3RyaW5nICRhbkFsaWFzIHRoZSBhbGlhcyB0byBwb3B1bGF0ZQoJICogCgkgKiBAcmV0dXJuIE9ybUVudGl0eVtdIGxpc3Qgb2YgT2JqZWN0IHdpdGggdGhlIHZhbHVlcyBvZiB0aGUgYWxpYXMgcG9wdWxhdGVkIGJ5IHRoZSBvdGhlciBPcm1FbnRpdHkgZm91bmRlZAoJICogCgkgKiBAc2luY2UgMC4zLjAKCSAqCgkgKi8KCXB1YmxpYyBzdGF0aWMgZmluYWwgZnVuY3Rpb24gcG9wdWxhdGVBbGlhc0ZpZWxkKE9ybUVudGl0eSAkZW50aXR5UGFyYW0sICRlbnRpdHlzLCAkYW5BbGlhcykgewoKCQkkYWxpYXMgPSAkZW50aXR5UGFyYW0tPmdldEFsaWFzKCk7CgkJaWYoIWlzc2V0KCRhbGlhc1skYW5BbGlhc10pKXsKCQkJdGhyb3cgbmV3IE9ybUlsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZnVuY3Rpb24gcG9wdWxhdGVBbGlhc0ZpZWxkKFwkZW50aXR5UGFyYW0sIFwkZW50aXR5cywgXCRhbkFsaWFzKSBvbmx5IGFjY2VwdCBhbGlhcyBuYW1lIGluIHRoaXJkIHBhcmFtZXRlciIpOwoJCX0KCgkJJGFsaWFzQ29tcG9uZW50ID0gJGFsaWFzWyRhbkFsaWFzXTsgCgkJZm9yZWFjaCAoJGFsaWFzQ29tcG9uZW50IGFzICRjb21wb25lbnQpIHsKCQkJJGZpZWxkID0gJGVudGl0eVBhcmFtLT5nZXRGaWVsZEJ5TmFtZSgkY29tcG9uZW50KTsKCQkJbGlzdCgkZW50aXR5QXNzb2NOYW1lLCAkZmllbGRBc3NvY2lhdGVOYW1lKSA9IGV4cGxvZGUoIi4iLCAkZmllbGQtPmdldEtFWU5hbWUoKSk7CgkJCSRlbnRpdHlBc3NvYyA9IG5ldyAkZW50aXR5QXNzb2NOYW1lKCk7CgoJCQkvL0luaXRpYXRlIHRoZSBmaWVsZCBhc3NvY2lhdGUgd2l0aCBhbiBlbXB0eSBhcnJheS4KCQkJJGVudGl0eXNLZXlzID0gYXJyYXkoKTsKCQkJZm9yZWFjaCgkZW50aXR5cyBhcyAkZW50aXR5KXsKCQkJCSRlbnRpdHktPnNldCgkYW5BbGlhcywgbnVsbCk7CgkJCX0KCgkJCSRzcWxmaWVsZHZhbHVlW10gPSAkZmllbGQtPmdldE5hbWUoKTsKCQkJJGFzc29jRmllbGRzTmFtZVtdID0gJGZpZWxkQXNzb2NpYXRlTmFtZTsKCQkJJHNxbGZpZWxkbmFtZVtdID0gIiB7JGZpZWxkQXNzb2NpYXRlTmFtZX0gPSA/ICI7CgoJCX0KCgkJLy8gKCBmaWVsZDEgPSA/IGFuZCBmaWVsZDIgPSA/ICkgCgkJJHNxbGZpZWxkc25hbWUgPSAnICggJyAuIGltcGxvZGUoIiBBTkQgIiwgJHNxbGZpZWxkbmFtZSkgLiAnICkgJyA7CgkJJHNxbGZpZWxkc25hbWVPUiA9ICcgT1IgJyAuICRzcWxmaWVsZHNuYW1lOwoKCQkkc3FsZmllbGRzID0gIiAxICI7CgkJaWYoIWVtcHR5KCRlbnRpdHlzKSl7CgkJCSRzcWxmaWVsZHMgPSAkc3FsZmllbGRzbmFtZSAuIHN0cl9yZXBlYXQoJHNxbGZpZWxkc25hbWVPUiwgY291bnQoJGVudGl0eXMpLTEpOwkKCQl9IAoKCQkkcXVlcnlBZGQgPSAnU0VMRUNUICogRlJPTSAnIC4gJGVudGl0eUFzc29jLT5nZXREYm5hbWUoKSAuICcgV0hFUkUgJyAuICRzcWxmaWVsZHM7CgkJJHF1ZXJ5UGFyYW1zID0gYXJyYXkoKTsKCQlmb3JlYWNoKCRlbnRpdHlzIGFzICRlbnRpdHkpewoJCQoKCQkJZm9yZWFjaCAoJGFzc29jRmllbGRzTmFtZSBhcyAkZmllbGRuYW1lKSB7CgoJCQkJJHF1ZXJ5UGFyYW1zW10gPSAkZW50aXR5LT5nZXQoJGZpZWxkbmFtZSk7CgkJCX0KCQkJCgkJfQoJCQkJCQoJCS8vIE9yZGVyIEJ5IAoJCWlmKCRlbnRpdHlBc3NvYy0+Z2V0RGVmYXVsdE9yZGVyQnkoKSAhPSBudWxsKSB7CgkJCSRxdWVyeUFkZCAuPSAkZW50aXR5QXNzb2MtPmdldERlZmF1bHRPcmRlckJ5KCktPmdldE9yZGVyQnkoKTsKCQl9CgoJCS8vRXhlY3V0aW9uCgkJJHJlc3VsdCA9IE9ybURiOjpleGVjdXRlKCRxdWVyeUFkZCwKCQkJCQkJCQkkcXVlcnlQYXJhbXMsCgkJCQkJCQkJIkRhdGFiYXNlIGVycm9yIGR1cmluZyByZXF1ZXN0IHRvIGdldCBhc3NvY2lhdGl2ZSBlbnRpdHkgJGVudGl0eUFzc29jTmFtZSIpOwoJCQoJCSRjb3VudEZpZWxkcyA9IGNvdW50KCRzcWxmaWVsZHZhbHVlKTsKCgoJCXdoaWxlICgkcm93QXNzb2NpYXRlID0gJHJlc3VsdC0+RmV0Y2hSb3coKSkgewoJCQlmb3JlYWNoKCRlbnRpdHlzIGFzICRlbnRpdHkpewoJCQkJJGFscmVhZHlQcmVzZW50ID0gbnVsbDsKCQkJCSRpc21hdGNoID0gdHJ1ZTsKCQkJCWZvciAoICRpID0gMCA7ICRpIDwgJGNvdW50RmllbGRzOyAkaSsrKXsKCgkJCQkJaWYoJGVudGl0eS0+Z2V0KCRzcWxmaWVsZHZhbHVlWyRpXSkgIT09ICRyb3dBc3NvY2lhdGVbJGFzc29jRmllbGRzTmFtZVskaV1dKXsKCQkJCQkJJGlzbWF0Y2ggPSBmYWxzZTsKCQkJCQkJYnJlYWs7CgkJCQkJfQoJCQkJfQoJCQkJaWYoJGlzbWF0Y2gpewoJCQkJCS8vIEF0IHRoaXMgcG9pbnQgd2UgZm91bmQgYSByZXN1bHQgZm9yIHRoZSBjdXJyZW50IGVudGl0eS4KCQkJCQkvLyBXZSBtdXN0IGFkZCB0aGlzIHJlc3VsdCBpbnRvIHRoZSAkZmllbGQgCgoJCQkJCSRuZXdPYmplY3QgPSBPcm1Db3JlOjpyb3dUb0VudGl0eSAobmV3ICRlbnRpdHlBc3NvY05hbWUoKSwgJHJvd0Fzc29jaWF0ZSk7CgkJCQkJJGVudGl0eS0+c2V0KCRhbkFsaWFzLCAkbmV3T2JqZWN0KTsKCgkJCQl9CgkJCX0KCQl9CgoJCXJldHVybiAkZW50aXR5czsKCX0KCgkvKioKCSAqIFdpbGwgZm91bmQgYWxsIHRoZSBlbnRpdHlzIGF2YWlsYWJsZSBmb3IgdGhlIGZpZWxkIEFLIG9mIHBhcmFtZXRlciAkZW50aXR5UGFyYW0uCgkgKiAKICAgICAqIEBwYXJhbSBPcm1FbnRpdHkgJGVudGl0eVBhcmFtIGFuIGluc3RhbmNlIG9mIHRoZSBlbnRpdHkgIAoJICogQHBhcmFtIE9ybUVudGl0eVtdICRlbnRpdHlzIGFycmF5IGxpc3Qgb2YgT2JqZWN0IE9ybUVudGl0eQoJICogQHBhcmFtIE9ybUZpZWxkICRmaWVsZCB0aGUgQUsgZmllbGQgdG8gcG9wdWxhdGUKCSAqIAoJICogQHJldHVybiBPcm1FbnRpdHlbXSBsaXN0IG9mIE9iamVjdCBPcm1FbnRpdHkgd2l0aCB0aGUgdmFsdWVzIG9mIHRoZSBmaWVsZCBBSyBwb3B1bGF0ZWQgYnkgdGhlIG90aGVyIE9ybUVudGl0eSBmb3VuZGVkCgkgKiAKCSAqIEBzaW5jZSAwLjMuMAoJICoKCSAqLwoJcHVibGljIHN0YXRpYyBmaW5hbCBmdW5jdGlvbiBwb3B1bGF0ZUFLRmllbGQoT3JtRW50aXR5ICRlbnRpdHlQYXJhbSwgJGVudGl0eXMsIE9ybUZpZWxkICRmaWVsZCl7CgoJCWlmKCEkZmllbGQtPmlzQXNzb2NpYXRlS0VZKCkpewoJCQl0aHJvdyBuZXcgT3JtSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJmdW5jdGlvbiBwb3B1bGF0ZUFLRmllbGQoXCRlbnRpdHlQYXJhbSwgXCRlbnRpdHlzLCBcJGZpZWxkKSBvbmx5IGFjY2VwdCBmaWVsZHMgb2YgdHlwZSBBc3NvY2lhdGVLZXkiKTsKCQl9CgoJCSRmaWVsZEFzc29jaWF0ZU5hbWUgPSBudWxsOwoJCWlmKHN0cnBvcygkZmllbGQtPmdldEtFWU5hbWUoKSwiLiIpKXsKCQkJbGlzdCgkZW50aXR5QXNzb2NOYW1lLCAkZmllbGRBc3NvY2lhdGVOYW1lKSA9IGV4cGxvZGUoIi4iLCAkZmllbGQtPmdldEtFWU5hbWUoKSk7CgkJCSRlbnRpdHlBc3NvYyA9IG5ldyAkZW50aXR5QXNzb2NOYW1lKCk7CgkJCQoKCgkJCSRzcWxmaWVsZG5hbWUgPSBhcnJheSgpOwoJCQkkc3FsZmllbGR2YWx1ZSA9IGFycmF5KCk7CgkJCWxpc3QoJGVudGl0eUN1cnJlbnROYW1lLCAkZmllbGRDdXJyZW50TmFtZSkgPSBleHBsb2RlKCIuIiwgJGVudGl0eUFzc29jLT5nZXRGaWVsZEJ5TmFtZSgkZmllbGRBc3NvY2lhdGVOYW1lKS0+Z2V0S0VZTmFtZSgpKTsKCQkJCQkKCQkJLy9UaGUgcGF0aCBtdXN0IHJldHVybiB0byB0aGUgY3VycmVudCBlbnRpdHkKCQkJaWYoc3RyY2FzZWNtcCgkZW50aXR5Q3VycmVudE5hbWUsJGVudGl0eVBhcmFtLT5nZXROYW1lKCkpICE9IDApewoJCQkJdGhyb3cgbmV3IE9ybUlsbGVnYWxDb25maWd1cmF0aW9uRXhjZXB0aW9uKCJJdCBzZWVtcyB5b3UgaGF2ZSBhIHdyb25nIHBhdGggYmV0d2VlbiB7JGVudGl0eVBhcmFtLT5nZXROYW1lKCl9LnskZmllbGQtPmdldE5hbWUoKX0gYW5kIHskZW50aXR5QXNzb2NOYW1lfS57JGZpZWxkQXNzb2NpYXRlTmFtZX0iKTsKCQkJfQoKCQkJLy9Jbml0aWF0ZSB0aGUgZmllbGQgYXNzb2NpYXRlIHdpdGggYW4gZW1wdHkgYXJyYXkuCgkJCSRlbnRpdHlzS2V5cyA9IGFycmF5KCk7CgkJCWZvcmVhY2goJGVudGl0eXMgYXMgJGVudGl0eSl7CgkJCQkkZW50aXR5LT5zZXQoJGZpZWxkLT5nZXROYW1lKCksIGFycmF5KCkpOwoJCQl9CgoJCQkkc3FsZmllbGR2YWx1ZVtdID0gJGZpZWxkQ3VycmVudE5hbWU7CgkJCSRhc3NvY0ZpZWxkc05hbWVbXSA9ICRmaWVsZEFzc29jaWF0ZU5hbWU7CgkJCSRzcWxmaWVsZG5hbWVbXSA9ICIgeyRmaWVsZEFzc29jaWF0ZU5hbWV9ID0gPyAiOwoKCQkJCgoJCS8vIFdlIGhhdmUgYW4gQUsgd2l0aCAyL21vcmUgRksgKGFsc28gd2UgYXJlIGFuIGVudGl0eSB3aXRoIGNvbXBvc2l0ZSBwcmltYXJ5IGtleSkJCgkJfSBlbHNlIHsKCQkJJGVudGl0eUFzc29jTmFtZSA9ICRmaWVsZC0+Z2V0S0VZTmFtZSgpOwoJCQkkZW50aXR5QXNzb2MgPSBuZXcgJGVudGl0eUFzc29jTmFtZSgpOwoKCQkJLy9Jbml0aWF0ZSB0aGUgZmllbGQgYXNzb2NpYXRlIHdpdGggYW4gZW1wdHkgYXJyYXkuCgkJCSRlbnRpdHlzS2V5cyA9IGFycmF5KCk7CgkJCWZvcmVhY2goJGVudGl0eXMgYXMgJGVudGl0eSl7CgkJCQkkZW50aXR5LT5zZXQoJGZpZWxkLT5nZXROYW1lKCksIGFycmF5KCkpOwoJCQl9CgoJCQkvL1RPRE8gOiByZW1lbWJlcmluZyB0aGlzIHBhcnQgaW4gbWVtb3J5IHRvIGF2b2lkIHRyaXBsZSByZXNlYWNoCgkJCSRzcWxmaWVsZG5hbWUgPSBhcnJheSgpOwoJCQkkc3FsZmllbGR2YWx1ZSA9IGFycmF5KCk7CgkJCWZvcmVhY2ggKCRlbnRpdHlBc3NvYy0+Z2V0RmllbGRzKCkgYXMgJGFzc29jRmllbGQpIHsKCgkJCQkvLyBXZSBkb24ndCB3YW50IGFub3RoZXIgd2VpcmQgRksgb24gYW4gZW50aXJlIGVudGl0eQoJCQkJaWYoJGFzc29jRmllbGQtPmlzRm9yZWlnbktleSgpICYmIHN0cnBvcygkYXNzb2NGaWVsZC0+Z2V0S0VZTmFtZSgpLCIuIikpewoJCQkJCQoJCQkJCWxpc3QoJGVudGl0eUN1cnJlbnROYW1lLCAkZmllbGRDdXJyZW50TmFtZSkgPSBleHBsb2RlKCIuIiwgJGFzc29jRmllbGQtPmdldEtFWU5hbWUoKSk7CgoJCQkJCS8vIElmIHRoaXMgRksgcG9pbnQgYmFjayBvbiB1cwoJCQkJCWlmKHN0cmNhc2VjbXAoJGVudGl0eUN1cnJlbnROYW1lLCRlbnRpdHlQYXJhbS0+Z2V0TmFtZSgpKSA9PT0gMCl7CgkJCQkJCSRzcWxmaWVsZHZhbHVlW10gPSAkZmllbGRDdXJyZW50TmFtZTsKCQkJCQkJJGFzc29jRmllbGRzTmFtZVtdID0gJGFzc29jRmllbGQtPmdldE5hbWUoKTsKCQkJCQkJJHNxbGZpZWxkbmFtZVtdID0gIiB7JGFzc29jRmllbGQtPmdldE5hbWUoKX0gPSA/ICI7CgkJCQkJfQoJCQkJfQoJCQl9CgoJCX0KCgkJLy8gKCBmaWVsZDEgPSA/IGFuZCBmaWVsZDIgPSA/ICkgCgkJJHNxbGZpZWxkc25hbWUgPSAnICggJyAuIGltcGxvZGUoIiBBTkQgIiwgJHNxbGZpZWxkbmFtZSkgLiAnICkgJyA7CgkJJHNxbGZpZWxkc25hbWVPUiA9ICcgT1IgJyAuICRzcWxmaWVsZHNuYW1lOwoKCQkkc3FsZmllbGRzID0gIiAxICI7CgkJaWYoIWVtcHR5KCRlbnRpdHlzKSl7CgkJCSRzcWxmaWVsZHMgPSAkc3FsZmllbGRzbmFtZSAuIHN0cl9yZXBlYXQoJHNxbGZpZWxkc25hbWVPUiwgY291bnQoJGVudGl0eXMpLTEpOwkKCQl9IAoKCQkkcXVlcnlBZGQgPSAnU0VMRUNUICogRlJPTSAnIC4gJGVudGl0eUFzc29jLT5nZXREYm5hbWUoKSAuICcgV0hFUkUgJyAuICRzcWxmaWVsZHM7CgkJJHF1ZXJ5UGFyYW1zID0gYXJyYXkoKTsKCQlmb3JlYWNoKCRlbnRpdHlzIGFzICRlbnRpdHkpewoJCQlmb3JlYWNoICgkc3FsZmllbGR2YWx1ZSBhcyAkZmllbGRuYW1lKSB7CgkJCQkkcXVlcnlQYXJhbXNbXSA9ICRlbnRpdHktPmdldCgkZmllbGRuYW1lKTsKCQkJfQoJCQkKCQl9CgkJCQkJCgkJLy8gT3JkZXIgQnkgCgkJaWYoJGVudGl0eUFzc29jLT5nZXREZWZhdWx0T3JkZXJCeSgpICE9IG51bGwpIHsKCQkJJHF1ZXJ5QWRkIC49ICRlbnRpdHlBc3NvYy0+Z2V0RGVmYXVsdE9yZGVyQnkoKS0+Z2V0T3JkZXJCeSgpOwoJCX0KCgkJLy9FeGVjdXRpb24KCQkkcmVzdWx0ID0gT3JtRGI6OmV4ZWN1dGUoJHF1ZXJ5QWRkLAoJCQkJCQkJCSRxdWVyeVBhcmFtcywKCQkJCQkJCQkiRGF0YWJhc2UgZXJyb3IgZHVyaW5nIHJlcXVlc3QgdG8gZ2V0IGFzc29jaWF0aXZlIGVudGl0eSAkZW50aXR5QXNzb2NOYW1lIik7CgkJCgkJJGNvdW50RmllbGRzID0gY291bnQoJHNxbGZpZWxkdmFsdWUpOwoKCQl3aGlsZSAoJHJvd0Fzc29jaWF0ZSA9ICRyZXN1bHQtPkZldGNoUm93KCkpIHsKCQkJZm9yZWFjaCgkZW50aXR5cyBhcyAkZW50aXR5KXsKCQkJCSRhbHJlYWR5UHJlc2VudCA9IG51bGw7CgkJCQkkaXNtYXRjaCA9IHRydWU7CgkJCQlmb3IgKCAkaSA9IDAgOyAkaSA8ICRjb3VudEZpZWxkczsgJGkrKyl7CgoJCQkJCWlmKCRlbnRpdHktPmdldCgkc3FsZmllbGR2YWx1ZVskaV0pICE9PSAkcm93QXNzb2NpYXRlWyRhc3NvY0ZpZWxkc05hbWVbJGldXSl7CgkJCQkJCSRpc21hdGNoID0gZmFsc2U7CgkJCQkJCWJyZWFrOwoJCQkJCX0KCQkJCX0KCQkJCWlmKCRpc21hdGNoKXsKCQkJCQkvLyBBdCB0aGlzIHBvaW50IHdlIGZvdW5kIGEgcmVzdWx0IGZvciB0aGUgY3VycmVudCBlbnRpdHkuCgkJCQkJLy8gV2UgbXVzdCBhZGQgdGhpcyByZXN1bHQgaW50byB0aGUgJGZpZWxkIAoJCQkJCSRhbHJlYWR5UHJlc2VudCA9ICRlbnRpdHktPmdldCgkZmllbGQtPmdldE5hbWUoKSk7CgkJCQkJJGFscmVhZHlQcmVzZW50W10gPSBPcm1Db3JlOjpyb3dUb0VudGl0eSAobmV3ICRlbnRpdHlBc3NvY05hbWUoKSwgJHJvd0Fzc29jaWF0ZSk7CgoJCQkJCSRlbnRpdHktPnNldCgkZmllbGQtPmdldE5hbWUoKSwgJGFscmVhZHlQcmVzZW50KTsKCgkJCQl9CgkJCX0KCQl9CgkJcmV0dXJuICRlbnRpdHlzOwoJfQoKCgkvKioKCSAqIFdpbGwgZm91bmQgYWxsIHRoZSBlbnRpdHlzIGF2YWlsYWJsZSBmb3IgdGhlIGZpZWxkIEZLIG9mIHBhcmFtZXRlciAkZW50aXR5UGFyYW0uCgkgKiAKICAgICAqIEBwYXJhbSBPcm1FbnRpdHkgJGVudGl0eVBhcmFtIGFuIGluc3RhbmNlIG9mIHRoZSBlbnRpdHkgIAoJICogQHBhcmFtIE9ybUVudGl0eVtdICRlbnRpdHlzIGFycmF5IGxpc3Qgb2YgT2JqZWN0IE9ybUVudGl0eQoJICogQHBhcmFtIE9ybUZpZWxkICRmaWVsZCB0aGUgRksgZmllbGQgdG8gcG9wdWxhdGUKCSAqIAoJICogQHJldHVybiBPcm1FbnRpdHlbXSBsaXN0IG9mIE9iamVjdCBPcm1FbnRpdHkgd2l0aCB0aGUgdmFsdWVzIG9mIHRoZSBmaWVsZCBGSyBwb3B1bGF0ZWQgYnkgdGhlIG90aGVyIE9ybUVudGl0eSBmb3VuZGVkCgkgKiAKCSAqIEBzaW5jZSAwLjMuMAoJICoKCSAqLwoJcHVibGljIHN0YXRpYyBmaW5hbCBmdW5jdGlvbiBwb3B1bGF0ZUZLRmllbGQoT3JtRW50aXR5ICRlbnRpdHlQYXJhbSwgJGVudGl0eXMsIE9ybUZpZWxkICRmaWVsZCl7CgoJCWlmKCEkZmllbGQtPmlzRm9yZWlnbktFWSgpKXsKCQkJdGhyb3cgbmV3IE9ybUlsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZnVuY3Rpb24gcG9wdWxhdGVGS0ZpZWxkKFwkZW50aXR5UGFyYW0sIFwkZW50aXR5cywgXCRmaWVsZCkgb25seSBhY2NlcHQgZmllbGRzIG9mIHR5cGUgRm9yZWlnbktleSIpOwoJCX0KCgkJaWYoIXN0cnBvcygkZmllbGQtPmdldEtFWU5hbWUoKSwiLiIpKXsKCQkJcmV0dXJuICRlbnRpdHlzOwoJCX0KCgkJaWYoc3RycG9zKCRmaWVsZC0+Z2V0S0VZTmFtZSgpLCIuIikpewoJCQlsaXN0KCRlbnRpdHlBc3NvY05hbWUsICRmaWVsZEFzc29jaWF0ZU5hbWUpID0gZXhwbG9kZSgiLiIsICRmaWVsZC0+Z2V0S0VZTmFtZSgpKTsKCQkJJGVudGl0eUFzc29jID0gbmV3ICRlbnRpdHlBc3NvY05hbWUoKTsKCQkJJHNxbGZpZWxkdmFsdWUgPSBhcnJheSgpOwoKCQkJJHNxbGZpZWxkdmFsdWVbXSA9ICRmaWVsZC0+Z2V0TmFtZSgpOwoJCQkkYXNzb2NGaWVsZHNOYW1lW10gPSAkZmllbGRBc3NvY2lhdGVOYW1lOwoJCQkkc3FsZmllbGRuYW1lW10gPSAiIHskZmllbGRBc3NvY2lhdGVOYW1lfSA9ID8gIjsKCgkJfQoKCQkvLyAoIGZpZWxkMSA9ID8gYW5kIGZpZWxkMiA9ID8gKSAKCQkkc3FsZmllbGRzbmFtZSA9ICcgKCAnIC4gaW1wbG9kZSgiIEFORCAiLCAkc3FsZmllbGRuYW1lKSAuICcgKSAnIDsKCQkkc3FsZmllbGRzbmFtZU9SID0gJyBPUiAnIC4gJHNxbGZpZWxkc25hbWU7CgoJCSRzcWxmaWVsZHMgPSAiIDEgIjsKCQlpZighZW1wdHkoJGVudGl0eXMpKXsKCQkJJHNxbGZpZWxkcyA9ICRzcWxmaWVsZHNuYW1lIC4gc3RyX3JlcGVhdCgkc3FsZmllbGRzbmFtZU9SLCBjb3VudCgkZW50aXR5cyktMSk7CQoJCX0gCgoJCSRxdWVyeUFkZCA9ICdTRUxFQ1QgKiBGUk9NICcgLiAkZW50aXR5QXNzb2MtPmdldERibmFtZSgpIC4gJyBXSEVSRSAnIC4gJHNxbGZpZWxkczsKCQkkcXVlcnlQYXJhbXMgPSBhcnJheSgpOwoJCWZvcmVhY2goJGVudGl0eXMgYXMgJGVudGl0eSl7CgkJCQkkcXVlcnlQYXJhbXNbXSA9ICRlbnRpdHktPmdldCgkZmllbGQtPmdldE5hbWUoKSk7CgkJCQoJCX0KCQkJCQkKCQkvLyBPcmRlciBCeSAKCQlpZigkZW50aXR5QXNzb2MtPmdldERlZmF1bHRPcmRlckJ5KCkgIT0gbnVsbCkgewoJCQkkcXVlcnlBZGQgLj0gJGVudGl0eUFzc29jLT5nZXREZWZhdWx0T3JkZXJCeSgpLT5nZXRPcmRlckJ5KCk7CgkJfQoKCgkJLy9FeGVjdXRpb24KCQkkcmVzdWx0ID0gT3JtRGI6OmV4ZWN1dGUoJHF1ZXJ5QWRkLAoJCQkJCQkJCSRxdWVyeVBhcmFtcywKCQkJCQkJCQkiRGF0YWJhc2UgZXJyb3IgZHVyaW5nIHJlcXVlc3QgdG8gZ2V0IGFzc29jaWF0aXZlIGVudGl0eSAkZW50aXR5QXNzb2NOYW1lIik7CgkJCgkJJGNvdW50RmllbGRzID0gY291bnQoJHNxbGZpZWxkdmFsdWUpOwoKCQl3aGlsZSAoJHJvd0Fzc29jaWF0ZSA9ICRyZXN1bHQtPkZldGNoUm93KCkpIHsKCQkJZm9yZWFjaCgkZW50aXR5cyBhcyAkZW50aXR5KXsKCQkJCSRhbHJlYWR5UHJlc2VudCA9IG51bGw7CgkJCQkkaXNtYXRjaCA9IHRydWU7CgkJCQlmb3IgKCAkaSA9IDAgOyAkaSA8ICRjb3VudEZpZWxkczsgJGkrKyl7CgoJCQkJCWlmKCRlbnRpdHktPmdldCgkZmllbGQtPmdldE5hbWUoKSkgIT09ICRyb3dBc3NvY2lhdGVbJGFzc29jRmllbGRzTmFtZVskaV1dKXsKCQkJCQkJJGlzbWF0Y2ggPSBmYWxzZTsKCQkJCQkJYnJlYWs7CgkJCQkJfQoJCQkJfQoJCQkJaWYoJGlzbWF0Y2gpewoJCQkJCS8vIEF0IHRoaXMgcG9pbnQgd2UgZm91bmQgYSByZXN1bHQgZm9yIHRoZSBjdXJyZW50IGVudGl0eS4KCQkJCQkvLyBXZSBtdXN0IGFkZCB0aGlzIHJlc3VsdCBpbnRvIHRoZSAkZmllbGQgCgkJCQkJCgkJCQkJJG5ld09iamVjdCA9IE9ybUNvcmU6OnJvd1RvRW50aXR5IChuZXcgJGVudGl0eUFzc29jTmFtZSgpLCAkcm93QXNzb2NpYXRlKTsKCQkJCQkkZW50aXR5LT5zZXQoJGZpZWxkLT5nZXROYW1lKCksICRuZXdPYmplY3QpOwoKCQkJCX0KCQkJfQoJCX0KCgkJcmV0dXJuICRlbnRpdHlzOwoJfQogIAoJLyoqCgkqIFJldHVybiBhIE9ybUVudGl0eSBmcm9tIGl0cyBJZAoJKiAKCSogQHBhcmFtIE9ybUVudGl0eSAkZW50aXR5UGFyYW0gYW4gaW5zdGFuY2Ugb2YgdGhlIGVudGl0eSAgCgkqIEBwYXJhbSBtaXhlZCAkaWQgdGhlIElkIHRvIGZpbmQKCSoKCSogQHJldHVybiBPcm1FbnRpdHkgdGhlIE9ybUVudGl0eSBmb3VuZCBvciBOVUxMCgkqLwoJcHVibGljIHN0YXRpYyBmaW5hbCBmdW5jdGlvbiBmaW5kQnlJZChPcm1FbnRpdHkgJGVudGl0eVBhcmFtLCAkaWQpIHsKCQkkbGlzdGUgPSBPcm1Db3JlOjpmaW5kQnlJZHMoJGVudGl0eVBhcmFtLCBhcnJheSgkaWQpKTsKCQkKCQlpZighaXNzZXQoJGxpc3RlWzBdKSl7CgkJCXJldHVybiBudWxsOwoJCX0KCQkKCQlyZXR1cm4gJGxpc3RlWzBdOwoJfQogIAoJLyoqCgkqIFJldHVybiBFbnRpdGllcyBmcm9tIHRoZWlyIElkcwoJKiAKCSogQHBhcmFtIE9ybUVudGl0eSAkZW50aXR5UGFyYW0gYW4gaW5zdGFuY2Ugb2YgdGhlIGVudGl0eSAgCgkqIEBwYXJhbSBtaXhlZFtdICRpZHMgYXJyYXkgbGlzdCBvZiB0aGUgSWRzIHRvIGZpbmQKCSogQHBhcmFtIE9ybU9yZGVyQnkgJG9yZGVyQnkgdGhlIG9yZGVyYnkgb2JqZWN0IGlmIG5lY2Vzc2FyeQoJKgoJKiBAcmV0dXJuIE9ybUVudGl0eVtdIGxpc3Qgb2YgRW50aXRpZXMgZm91bmQKCSovCglwdWJsaWMgc3RhdGljIGZpbmFsIGZ1bmN0aW9uIGZpbmRCeUlkcyhPcm1FbnRpdHkgJGVudGl0eVBhcmFtLCAkaWRzLCBPcm1PcmRlckJ5ICRvcmRlckJ5PW51bGwpIHsKCQlpZihjb3VudCgkaWRzKSA9PSAwKQoJCQlyZXR1cm4gYXJyYXkoKTsKCgkJaWYoJGVudGl0eVBhcmFtLT5oYXNDb21wb3NpdGVLZXkoKSl7CgkJCXRocm93IG5ldyBPcm1JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oJ1lvdSBjYW5ub3QgdXNlZCBmdW5jdGlvbiBmaW5kQnlJZC9maW5kQnlJZHMgb24gRW50aXR5IHdpdGggYSBjb21wb3VuZCBrZXkuIFlvdSBzaG91bGQgdHJ5IGZpbmRCeUV4YW1wbGUgZnVuY3Rpb25zJyk7CgkJfQoJCQoJCWZvcmVhY2ggKCRlbnRpdHlQYXJhbS0+Z2V0UGsoKSBhcyAkcGtuYW1lID0+ICRwaykgewoJCQkkZXhhbXBsZSA9IG5ldyBPcm1FeGFtcGxlKCk7CgkJCSRleGFtcGxlLT5hZGRDcml0ZXJpYSgkcGtuYW1lLCBPcm1UeXBlQ3JpdGVyaWE6OiRFUSwgJGlkcyk7CgkJCXJldHVybiBPcm1Db3JlOjpmaW5kQnlFeGFtcGxlKCRlbnRpdHlQYXJhbSwgJGV4YW1wbGUsICRvcmRlckJ5KTsKCQl9CgoKCX0KICAKICAgIC8qKgogICAgICogQWxsb3cgc2VhcmNoIGEgbGlzdCBvZiBPcm1FbnRpdHkgZnJvbSBhIGxpc3Qgb2YgT3JtQ3JpdGVyaWEKICAgICAqIAogICAgICogRXhhbXBsZSA6IGZpbmQgdGhlIGN1c3RvbWVycyB3aXRoIGxhc3ROYW1lICdSb2dlcicgKG5vIGNhc3NlIHNlbnNpdGl2ZSkKICAgICAqIAogICAgICogIDxjb2RlPgogICAgICogICAgICAgJGN1c3RvbWVyID0gTXlBdXRvbG9hZDo6Z2V0SW5zdGFuY2UoJHRoaXMtPkdldE5hbWUoKSwgJ2N1c3RvbWVyJyk7CiAgICAgKiAKICAgICAqICAgICAgICRleGFtcGxlID0gbmV3IE9ybUV4YW1wbGUoKTsKICAgICAqICAgICAgICRleGFtcGxlLT5hZGRDcml0ZXJpYSgnbGFzdE5hbWUnLCBPcm1UeXBlQ3JpdGVyaWE6OiRFUSwgYXJyYXkoJ3JvZ2VyJyksIHRydWUpOwogICAgICogCiAgICAgKiAgICAgICBPcm1Db3JlOjpmaW5kQnlFeGFtcGxlKCRjdXN0b21lciwgJGV4YW1wbGUpOwogICAgICogPC9jb2RlPgogICAgICogCiAgICAgKiAgRXhhbXBsZSA6IGZpbmQgdGhlIGN1c3RvbWVycyB3aXRoIElkID49IDkwCiAgICAgKiAKICAgICAqIDxjb2RlPgogICAgICogICAgICAgJGN1c3RvbWVyID0gTXlBdXRvbG9hZDo6Z2V0SW5zdGFuY2UoJHRoaXMtPkdldE5hbWUoKSwgJ2N1c3RvbWVyJyk7CiAgICAgKiAKICAgICAqICAgICAgICRleGFtcGxlID0gbmV3IE9ybUV4YW1wbGUoKTsKICAgICAqICAgICAgICRleGFtcGxlLT5hZGRDcml0ZXJpYSgnY3VzdG9tZXJfaWQnLCBPcm1UeXBlQ3JpdGVyaWE6OiRHVEUsIGFycmF5KDkwKSk7CiAgICAgKiAKICAgICAqICAgICAgIE9ybUNvcmU6OmZpbmRCeUV4YW1wbGUoJGN1c3RvbWVyLCAkZXhhbXBsZSk7CiAgICAgKiA8L2NvZGU+CiAgICAgKiAKICAgICAqIE5PVEUgOiBFUSA9PiA8Yj5FUTwvYj51YWxzLCBHVEUgPT4gPGI+RzwvYj5yZWF0ZXIgPGI+VDwvYj5oYW4gb3IgPGI+RTwvYj5xdWFscwogICAgICogCiAgICAgKiBOT1RFIDIgOiB5b3UgY2FuIGFkZCBhcyBtYW55IENyaXRlcmlhcyBhcyB5b3Ugd2FudCBpbiBhbiBFeGFtcGxlIE9iamVjdAogICAgICogCiAgICAgKiBAcGFyYW0gT3JtRW50aXR5ICRlbnRpdHlQYXJhbSBhbiBpbnN0YW5jZSBvZiB0aGUgZW50aXR5CiAgICAgKiBAcGFyYW0gT3JtRXhhbXBsZSAkZXhhbXBsZSB0aGUgT2JqZWN0IE9ybUV4YW1wbGUgd2l0aCBzb21lIENyaXRlcmlhcyBpbnNpZGUKICAgICAqIEBwYXJhbSBPcm1PcmRlckJ5ICRvcmRlckJ5IHRoZSBvcmRlciBpZiBuZWNlc3NhcnkKICAgICAqIEBwYXJhbSBPcm1MaW1pdCAkbGltaXQgdGhlIGxpbWl0IGlmIG5lY2Vzc2FyeQogICAgICogQHBhcmFtIHN0cmluZyAkY29uZGl0aW9uIGxldCB1c2VyIGRlZmluZSBpZiB0aGUgbXVsdGlwbGUgY29uZGl0aW9ucyBtdXN0IG9mIHR5cGUgQU5EIG9yIE9SCiAgICAgKiBAcGFyYW0gYm9vbGVhbiAkbGF6eW1vZGUgc2V0IHRvIFRSVUUgdG8gYXZvaWQgbG9hZGluZyBjaGlsZCBvYmplY3QuIERlZmF1bHQgOiBGQUxTRQogICAgICogCiAgICAgKiBAc2VlIE9ybUV4YW1wbGUKICAgICAqIEBzZWUgT3JtVHlwZUNyaXRlcmlhCiAgICAgKi8KCXB1YmxpYyBzdGF0aWMgZmluYWwgZnVuY3Rpb24gZmluZEJ5RXhhbXBsZShPcm1FbnRpdHkgJGVudGl0eVBhcmFtLCBPcm1FeGFtcGxlICRleGFtcGxlLCBPcm1PcmRlckJ5ICRvcmRlckJ5ID0gbnVsbCwgT3JtTGltaXQgJGxpbWl0ID0gbnVsbCwgJGNvbmRpdGlvbiA9ICdBTkQnLCAkbGF6eW1vZGUgPSBmYWxzZSkgewoKCQkkbGlzdGVGaWVsZCA9ICRlbnRpdHlQYXJhbS0+Z2V0RmllbGRzKCk7CgoJCSRjcml0ZXJpYXMgPSAkZXhhbXBsZS0+Z2V0Q3JpdGVyaWFzKCk7CgkJJHNlbGVjdCA9ICJTRUxFQ1QgKiBGUk9NICIuJGVudGl0eVBhcmFtLT5nZXREYm5hbWUoKS4nIFdIRVJFICc7CgkJCQkJCQoJCWxpc3QoJGhxbCwgJHBhcmFtcykgPSBPcm1Db3JlOjpfZ2V0SHFsRXhhbXBsZSgkbGlzdGVGaWVsZCwgJGNyaXRlcmlhcywgJGNvbmRpdGlvbik7CgkJCQkKCQkvLyBPcmRlciBCeQoJCWlmKCRvcmRlckJ5ICE9IG51bGwpIHsKCQkJCSRocWwgLj0gJG9yZGVyQnktPmdldE9yZGVyQnkoKTsKCQl9CgkJZWxzZSBpZigkZW50aXR5UGFyYW0tPmdldERlZmF1bHRPcmRlckJ5KCkgIT0gbnVsbCkgewoJCQkJJGhxbCAuPSAkZW50aXR5UGFyYW0tPmdldERlZmF1bHRPcmRlckJ5KCktPmdldE9yZGVyQnkoKTsKCQl9ICAgICAgICAgICAgICAgIAoJCQoJCWlmKCRsaW1pdCAhPSBudWxsKSB7CgkJCQkkaHFsIC49ICRsaW1pdC0+Z2V0TGltaXQoKTsKCQl9CgoJCSRxdWVyeUV4YW1wbGUgPSAkc2VsZWN0LiRocWw7CgkJCgkJLy9JZiBpdCdzIGFscmVhZHkgaW4gdGhlIGNhY2hlLCB3ZSByZXR1cm4gdGhlIHJlc3VsdAoJCWlmKE9ybUNhY2hlOjpnZXRJbnN0YW5jZSgpLT5pc0NhY2hlKCRxdWVyeUV4YW1wbGUsICRwYXJhbXMpKSB7CgoJCQkJJGVudGl0aWVzID0gT3JtQ2FjaGU6OmdldEluc3RhbmNlKCktPmdldENhY2hlKCRxdWVyeUV4YW1wbGUsJHBhcmFtcyk7CgoJCX0gZWxzZSB7CgkJCQkvL0V4ZWN1dGlvbgoJCQkJJHJlc3VsdCA9IE9ybURiOjpleGVjdXRlKCRxdWVyeUV4YW1wbGUsCgkJCQkJCQkJCQkkcGFyYW1zLAoJCQkJCQkJCQkJIkRhdGFiYXNlIGVycm9yIGR1cmluZyBPcm1Db3JlOjpmaW5kQnlFeGFtcGxlKE9ybUVudGl0eSAmeyRlbnRpdHlQYXJhbS0+Z2V0TmFtZSgpfSwgT3JtRXhhbXBsZSBcJGV4YW1wbGUpIik7CgoJCQkJT3JtVHJhY2U6OmRlYnVnKCJmaW5kQnlFeGFtcGxlIDogIi4kcmVzdWx0LT5SZWNvcmRDb3VudCgpLiIgcmVzdWx0YXQocykiKTsKCgkJCQkkZW50aXRpZXMgPSBhcnJheSgpOwoJCQkJd2hpbGUgKCRyb3cgPSAkcmVzdWx0LT5GZXRjaFJvdygpKSB7CgkJCQkgICRlbnRpdGllc1tdID0gT3JtQ29yZTo6cm93VG9FbnRpdHkoJGVudGl0eVBhcmFtLCAkcm93KTsKCQkJCX0KCgkJCQlpZighJGxhenltb2RlKXsKCQkJCQkkZW50aXRpZXMgPSBPcm1Db3JlOjpwb3B1bGF0ZUZpZWxkcygkZW50aXR5UGFyYW0sICRlbnRpdGllcyk7CgkJCQl9CgkJCQkKCQkJCS8vV2UgcHVzaCB0aGUgcmVzdWx0IGludG8gdGhlIGNhY2hlIGJlZm9yZSByZXR1cm4gaXQKCQkJCU9ybUNhY2hlOjpnZXRJbnN0YW5jZSgpLT5zZXRDYWNoZSgkcXVlcnlFeGFtcGxlLCBudWxsLCAkZW50aXRpZXMpOwoJCX0KCgkJcmV0dXJuIGFycmF5X3ZhbHVlcygkZW50aXRpZXMpOwoKCX0KICAgCgkvKioKICAgICAqIEFsbG93IGRlbGV0ZSBhIGxpc3Qgb2YgT3JtRW50aXR5IGZyb20gYSBsaXN0IG9mIE9ybUNyaXRlcmlhCiAgICAgKiAKICAgICAqIEV4YW1wbGUgOiBkZWxldGUgdGhlIGN1c3RvbWVycyB3aXRoIGxhc3ROYW1lICdSb2dlcicgKG5vIGNhc3NlIHNlbnNpdGl2ZSkKICAgICAqIAogICAgICogIDxjb2RlPgogICAgICogICAgICAgJGN1c3RvbWVyID0gTXlBdXRvbG9hZDo6Z2V0SW5zdGFuY2UoJHRoaXMtPkdldE5hbWUoKSwgJ2N1c3RvbWVyJyk7CiAgICAgKiAKICAgICAqICAgICAgICRleGFtcGxlID0gbmV3IE9ybUV4YW1wbGUoKTsKICAgICAqICAgICAgICRleGFtcGxlLT5hZGRDcml0ZXJpYSgnbGFzdE5hbWUnLCBPcm1UeXBlQ3JpdGVyaWE6OiRFUSwgYXJyYXkoJ3JvZ2VyJyksIHRydWUpOwogICAgICogCiAgICAgKiAgICAgICBPcm1Db3JlOjpkZWxldGVCeUV4YW1wbGUoJGN1c3RvbWVyLCAkZXhhbXBsZSk7CiAgICAgKiA8L2NvZGU+CiAgICAgKiAKICAgICAqICBFeGFtcGxlIDogZGVsZXRlIHRoZSBjdXN0b21lcnMgd2l0aCBJZCA+PSA5MAogICAgICogCiAgICAgKiA8Y29kZT4KICAgICAqICAgICAgICRjdXN0b21lciA9IE15QXV0b2xvYWQ6OmdldEluc3RhbmNlKCR0aGlzLT5HZXROYW1lKCksICdjdXN0b21lcicpOwogICAgICogCiAgICAgKiAgICAgICAkZXhhbXBsZSA9IG5ldyBPcm1FeGFtcGxlKCk7CiAgICAgKiAgICAgICAkZXhhbXBsZS0+YWRkQ3JpdGVyaWEoJ2N1c3RvbWVyX2lkJywgT3JtVHlwZUNyaXRlcmlhOjokR1RFLCBhcnJheSg5MCkpOwogICAgICogCiAgICAgKiAgICAgICBPcm1Db3JlOjpkZWxldGVCeUV4YW1wbGUoJGN1c3RvbWVyLCAkZXhhbXBsZSk7CiAgICAgKiA8L2NvZGU+CiAgICAgKiAKICAgICAqIE5PVEUgOiBFUSA9PiA8Yj5FUTwvYj51YWxzLCBHVEUgPT4gPGI+RzwvYj5yZWF0ZXIgPGI+VDwvYj5oYW4gb3IgPGI+RTwvYj5xdWFscwogICAgICogCiAgICAgKiBOT1RFIDIgOiB5b3UgY2FuIGFkZCBhcyBtYW55IENyaXRlcmlhcyBhcyB5b3Ugd2FudCBpbiBhbiBPcm1FeGFtcGxlIE9iamVjdAogICAgICogCiAgICAgKiBAcGFyYW0gT3JtRW50aXR5ICRlbnRpdHlQYXJhbSBhbiBpbnN0YW5jZSBvZiB0aGUgZW50aXR5CiAgICAgKiBAcGFyYW0gT3JtRXhhbXBsZSAkZXhhbXBsZSB0aGUgT2JqZWN0IE9ybUV4YW1wbGUgd2l0aCBzb21lIENyaXRlcmlhcyBpbnNpZGUKICAgICAqIEBwYXJhbSAkY29uZGl0aW9uIGxldCB1c2VyIGRlZmluZSBpZiB0aGUgbXVsdGlwbGUgY29uZGl0aW9ucyBtdXN0IG9mIHR5cGUgQU5EIG9yIE9SCiAgICAgKiAKICAgICAqIEBzZWUgT3JtRXhhbXBsZQogICAgICogQHNlZSBPcm1UeXBlQ3JpdGVyaWEKICAgICAqLwoJcHVibGljIHN0YXRpYyBmaW5hbCBmdW5jdGlvbiBkZWxldGVCeUV4YW1wbGUoT3JtRW50aXR5ICRlbnRpdHlQYXJhbSwgT3JtRXhhbXBsZSAkZXhhbXBsZSwgJGNvbmRpdGlvbiA9ICdBTkQnKSB7CgkJJGxpc3RlRmllbGQgPSAkZW50aXR5UGFyYW0tPmdldEZpZWxkcygpOwoKCQkkY3JpdGVyaWFzID0gJGV4YW1wbGUtPmdldENyaXRlcmlhcygpOwoJCSRkZWxldGUgPSAiZGVsZXRlIGZyb20gIi4kZW50aXR5UGFyYW0tPmdldERibmFtZSgpLicgV0hFUkUgJzsKCQkKCQlsaXN0KCRocWwsICRwYXJhbXMpID0gT3JtQ29yZTo6X2dldEhxbEV4YW1wbGUoJGxpc3RlRmllbGQsICRjcml0ZXJpYXMsICRjb25kaXRpb24pOwoJCQoJCSRxdWVyeUV4YW1wbGUgPSAkZGVsZXRlLiRocWw7CgkJCQkJCQkJCQkKCQkvL0V4ZWN1dGlvbgoJCSRyZXN1bHQgPSBPcm1EYjo6ZXhlY3V0ZSgkcXVlcnlFeGFtcGxlLAoJCQkJCQkJCQkkcGFyYW1zLAoJCQkJCQkJCQkiRGF0YWJhc2UgZXJyb3IgZHVyaW5nIE9ybUNvcmU6OmRlbGV0ZUJ5RXhhbXBsZShPcm1FbnRpdHkgJnskZW50aXR5UGFyYW0tPmdldE5hbWUoKX0sICwgT3JtRXhhbXBsZSBcJGV4YW1wbGUpIik7CgkJICB9CgkJICAKCS8qKgoJICogSW5uZXIgZnVuY3Rpb24gdG8gZmFjdG9yaXplIHRoZSBjdXN0cnVjdGlvbiBvZiB0aGUgSFFMIGZvciB0aGUgKmJ5RXhhbXBsZSBmdW5jdGlvbnMKCSAqIEBwYXJhbSBPcm1GaWVsZFtdICRsaXN0ZUZpZWxkIHRoZSBsaXN0IG9mIEZpZWxkcwoJICogQHBhcmFtIE9ybVR5cGVDcml0ZXJpYVtdICRjcml0ZXJpYXMgdGhlIGxpc3Qgb2YgQ3JpdGVyaWEKICAgICAqIEBwYXJhbSBzdHJpbmcgJGNvbmRpdGlvbiBsZXQgdXNlciBkZWZpbmUgaWYgdGhlIG11bHRpcGxlIGNvbmRpdGlvbnMgbXVzdCBvZiB0eXBlIEFORCBvciBPUgoJICoKCSAqIEByZXR1cm4gbWl4ZWRbXSBhbiBhcnJheSB1bmRlciB0aGUgZm9ybWF0IGFycmF5KCRocWwsIG1peGVkW10gJHBhcmFtcykKCSAqKi8KCXByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIF9nZXRIcWxFeGFtcGxlKCRsaXN0ZUZpZWxkLCAkY3JpdGVyaWFzLCAkY29uZGl0aW9uKXsKCQkKCQlpZiggJGNvbmRpdGlvbiA9PSAnQU5EJyApewoJCQkkaHFsID0gIiAxICI7CgkJfSBlbHNlIHsKCQkJJGhxbCA9ICIgMCAiOwoJCSAgfQoKCQkkcGFyYW1zID0gYXJyYXkoKTsKCgkJZm9yZWFjaCgkY3JpdGVyaWFzIGFzICRjcml0ZXJpYSkgewoKCQkJaWYoJGxpc3RlRmllbGRbJGNyaXRlcmlhLT5maWVsZG5hbWVdID09IG51bGwpIHsKCQkJCXRocm93IG5ldyBFeGNlcHRpb24oIkZpZWxkICciLiRjcml0ZXJpYS0+ZmllbGRuYW1lLiInIG5vdCBkZWZpbmVkIGluIGVudGl0eSAnIi4kZW50aXR5UGFyYW0tPmdldE5hbWUoKS4iJyB3aGlsZSB5b3UncmUgc2VhcmNoaW5nIG9uIGl0Iik7CgkJCX0KCQkgICRmaWx0ZXJUeXBlID0gJGxpc3RlRmllbGRbJGNyaXRlcmlhLT5maWVsZG5hbWVdLT5nZXRUeXBlKCk7CgkJICAKCQkJLy8xIHBhcmFtZXRlcgoJCSAgaWYoJGNyaXRlcmlhLT50eXBlQ3JpdGVyaWEgPT0gT3JtVHlwZUNyaXRlcmlhOjokRVEgfHwgJGNyaXRlcmlhLT50eXBlQ3JpdGVyaWEgPT0gT3JtVHlwZUNyaXRlcmlhOjokTkVRIAoJCQl8fCAkY3JpdGVyaWEtPnR5cGVDcml0ZXJpYSA9PSBPcm1UeXBlQ3JpdGVyaWE6OiRHVCB8fCAkY3JpdGVyaWEtPnR5cGVDcml0ZXJpYSA9PSBPcm1UeXBlQ3JpdGVyaWE6OiRHVEUgCgkJCXx8ICRjcml0ZXJpYS0+dHlwZUNyaXRlcmlhID09IE9ybVR5cGVDcml0ZXJpYTo6JExUIHx8ICRjcml0ZXJpYS0+dHlwZUNyaXRlcmlhID09IE9ybVR5cGVDcml0ZXJpYTo6JExURSAKCQkJfHwgJGNyaXRlcmlhLT50eXBlQ3JpdGVyaWEgPT0gT3JtVHlwZUNyaXRlcmlhOjokQkVGT1JFIHx8ICRjcml0ZXJpYS0+dHlwZUNyaXRlcmlhID09IE9ybVR5cGVDcml0ZXJpYTo6JEFGVEVSCgkJCQl8fCAkY3JpdGVyaWEtPnR5cGVDcml0ZXJpYSA9PSBPcm1UeXBlQ3JpdGVyaWE6OiRMSUtFIHx8ICRjcml0ZXJpYS0+dHlwZUNyaXRlcmlhID09IE9ybVR5cGVDcml0ZXJpYTo6JE5MSUtFKSB7CgkJCQkkdmFsID0gJGNyaXRlcmlhLT5wYXJhbXNDcml0ZXJpYVswXTsKCQkJCQoJCQkJJHBhcmFtc1tdID0gT3JtQ29yZTo6X2ZpZWxkVG9EQlZhbHVlKCR2YWwsICRmaWx0ZXJUeXBlKTsKCQkJCSRocWwgLj0gIiB7JGNvbmRpdGlvbn0gIi4kY3JpdGVyaWEtPmZpZWxkbmFtZS4kY3JpdGVyaWEtPnR5cGVDcml0ZXJpYS4nID8gJzsKCQkJY29udGludWU7CgkJICB9CgkJICAKCQkJLy8wIHBhcmFtZXRlcgoJCQlpZigkY3JpdGVyaWEtPnR5cGVDcml0ZXJpYSA9PSBPcm1UeXBlQ3JpdGVyaWE6OiROVUxMIHx8ICRjcml0ZXJpYS0+dHlwZUNyaXRlcmlhID09IE9ybVR5cGVDcml0ZXJpYTo6JE5OVUxMKSB7CgkJCQkkaHFsIC49ICIgeyRjb25kaXRpb259ICIuJGNyaXRlcmlhLT5maWVsZG5hbWUuJGNyaXRlcmlhLT50eXBlQ3JpdGVyaWE7CgkJCWNvbnRpbnVlOwoJCSAgfQoJCSAgCgkJCS8vMiBwYXJhbWV0ZXJzCgkJCWlmKCRjcml0ZXJpYS0+dHlwZUNyaXRlcmlhID09IE9ybVR5cGVDcml0ZXJpYTo6JEJFVFdFRU4pIHsKCQkJJHBhcmFtc1tdID0gT3JtQ29yZTo6X2ZpZWxkVG9EQlZhbHVlKCRjcml0ZXJpYS0+cGFyYW1zQ3JpdGVyaWFbMF0sICRmaWx0ZXJUeXBlKTsgCgkJCSRwYXJhbXNbXSA9IE9ybUNvcmU6Ol9maWVsZFRvREJWYWx1ZSgkY3JpdGVyaWEtPnBhcmFtc0NyaXRlcmlhWzFdLCAkZmlsdGVyVHlwZSk7IAoJCQkJJGhxbCAuPSAiIHskY29uZGl0aW9ufSAiLiRjcml0ZXJpYS0+ZmllbGRuYW1lLiRjcml0ZXJpYS0+dHlwZUNyaXRlcmlhLicgPyBBTkQgPyc7CgkJCWNvbnRpbnVlOwoJCSAgfQoJCQkJCgkJCS8vIE4gcGFyYW1ldGVycwoJCQlpZigkY3JpdGVyaWEtPnR5cGVDcml0ZXJpYSA9PSBPcm1UeXBlQ3JpdGVyaWE6OiRJTiB8fCAkY3JpdGVyaWEtPnR5cGVDcml0ZXJpYSA9PSBPcm1UeXBlQ3JpdGVyaWE6OiROSU4pIHsKCQkJCWlmKGlzX2FycmF5KCRjcml0ZXJpYS0+cGFyYW1zQ3JpdGVyaWEpICYmIGNvdW50KCRjcml0ZXJpYS0+cGFyYW1zQ3JpdGVyaWEpID4gMCkgewoJCQkJCQkkaHFsIC49ICIgeyRjb25kaXRpb259ICI7CgkJCQkJCSRocWwgLj0gJGNyaXRlcmlhLT5maWVsZG5hbWUuJyAnLnNwcmludGYoJGNyaXRlcmlhLT50eXBlQ3JpdGVyaWEsIGltcGxvZGUoJywnLCBhcnJheV9maWxsKDAsIGNvdW50KCRjcml0ZXJpYS0+cGFyYW1zQ3JpdGVyaWEpLCAnPycpKSkuJyAnOwoJCQkJCQlmb3JlYWNoKCRjcml0ZXJpYS0+cGFyYW1zQ3JpdGVyaWEgYXMgJHBhcmFtKSB7CgkJCQkJCSRwYXJhbXNbXSA9IE9ybUNvcmU6Ol9maWVsZFRvREJWYWx1ZSgkcGFyYW0sICRmaWx0ZXJUeXBlKTsgCgkJCQkJCX0KCQkJCX0gZWxzZSBpZihpc19hcnJheSgkY3JpdGVyaWEtPnBhcmFtc0NyaXRlcmlhKSAmJiBjb3VudCgkY3JpdGVyaWEtPnBhcmFtc0NyaXRlcmlhKSA9PSAwKSB7CgkJCQkJJGhxbCAuPSAnQU5EIGZhbHNlICc7IC8vIG5vIHZhbHVlIHBhc3NlZCwgc28gbm8gcmVzdWx0IHRvIGJlIHJldHVybmVkCgkJCQl9CgkJCQljb250aW51ZTsKCQkJfQoJCQkJCQkKCQkJLy9PdGhlciBjYXNlcwoJCQlpZigkY3JpdGVyaWEtPnR5cGVDcml0ZXJpYSA9PSBPcm1UeXBlQ3JpdGVyaWE6OiRFTVBUWSkgewoJCQkJJGhxbCAuPSAiIHskY29uZGl0aW9ufSAoICIuJGNyaXRlcmlhLT5maWVsZG5hbWUgLicgaXMgbnVsbCB8fCAnIC4gJGNyaXRlcmlhLT5maWVsZG5hbWUgLiAiPSAnJykiOwoJCQkJY29udGludWU7CgkJCQkJfQoJCQlpZigkY3JpdGVyaWEtPnR5cGVDcml0ZXJpYSA9PSBPcm1UeXBlQ3JpdGVyaWE6OiRORU1QVFkpIHsKCQkJCSRocWwgLj0gIiB7JGNvbmRpdGlvbn0gKCAiLiRjcml0ZXJpYS0+ZmllbGRuYW1lIC4nIGlzIG5vdCBudWxsICYmICcgLiAkY3JpdGVyaWEtPmZpZWxkbmFtZSAuICIhPSAnJykiOwoJCQkJCWNvbnRpbnVlOwoJCQkJfSAgICAgICAgICAgICAgICAgICAgICAgIAoJCSAgCgkJCXRocm93IG5ldyBFeGNlcHRpb24oIlRoZSBPcm1Dcml0ZXJpYSAkY3JpdGVyaWEtPnR5cGVDcml0ZXJpYSBpcyBub3QgbWFuYWdlIik7CgkJfQoJCQkJCQkJCQkJCgkJcmV0dXJuIGFycmF5KCRocWwsICRwYXJhbXMpOwoJfQogICAgICAKICAgIC8qKgogICAgICogVHJhbnNmb3JtcyBhbiBhcnJheSBvZiB2YWx1ZSBpbnRvIGEgZW50aXJlIE9ybUVudGl0eS4gVGhlIGFycmF5IG11c3QgZmFsbG93IHRoaXMgc2NoZW1lCiAgICAgKiAKICAgICAqIEV4YW1wbGUgOgogICAgICogCiAgICAgKiA8Y29kZT4KICAgICAqICAgICAgICRteUFycmF5MSA9IGFycmF5KCdjdXN0b21lcl9pZCc9PjEsICduYW1lJz0+J0R1cG9udCcpOyAgICAgICAKICAgICAqICAgICAgICRteUFycmF5MiA9IGFycmF5KCdjdXN0b21lcl9pZCc9PjIsICduYW1lJz0+J0R1cmFuZCcsICdsYXN0TmFtZSc9PidKb2UnKTsgICAgICAgCiAgICAgKiAgIAogICAgICogICAgICAgJGN1c3RvbWVyID0gTXlBdXRvbG9hZDo6Z2V0SW5zdGFuY2UoJHRoaXMtPkdldE5hbWUoKSwgJ2N1c3RvbWVyJyk7CiAgICAgKiAKICAgICAqICAgICAgICRjdXN0b21lcjEgPSBPcm1Db3JlOjpyb3dUb0VudGl0eSgkY3VzdG9tZXIsICRteUFycmF5MSk7CiAgICAgKiAgICAgICAkY3VzdG9tZXIyID0gT3JtQ29yZTo6cm93VG9FbnRpdHkoJGN1c3RvbWVyLCAkbXlBcnJheTIpOwogICAgICogCiAgICAgKiAgICAgICBlY2hvICRjdXN0b21lcjEtPmdldCgnbGFzdE5hbWUnKTsgLy9yZXR1cm4gbnVsbAogICAgICogICAgICAgZWNobyAkY3VzdG9tZXIyLT5nZXQoJ2xhc3ROYW1lJyk7IC8vcmV0dXJuIEpvZQogICAgICogCiAgICAgKiA8L2NvZGU+CiAgICAgKiAgICAgICAgIAogICAgICogQHBhcmFtIE9ybUVudGl0eSAkZW50aXR5UGFyYW0gYW4gaW5zdGFuY2Ugb2YgdGhlIGVudGl0eQogICAgICogQHBhcmFtIG1peGVkW10gJHJvdyB0aGUgbGlzdCB3aXRoIHRoZSBkYXRhCiAgICAqLwoJcHVibGljIHN0YXRpYyBmaW5hbCBmdW5jdGlvbiByb3dUb0VudGl0eSAoT3JtRW50aXR5ICRlbnRpdHlQYXJhbSwgJHJvdykgewoKCQlPcm1UcmFjZTo6ZGVidWcoInJvd1RvRW50aXR5IDogIi5wcmludF9yKCRyb3csdHJ1ZSkpOwoJCSRsaXN0ZUZpZWxkID0gJGVudGl0eVBhcmFtLT5nZXRGaWVsZHMoKTsKCgkJJG5ld0VudGl0eSA9IGNsb25lICRlbnRpdHlQYXJhbTsKCQlmb3JlYWNoKCRsaXN0ZUZpZWxkIGFzICRmaWVsZCkKCQl7CgkJICBpZighJGZpZWxkLT5pc0Fzc29jaWF0ZUtFWSgpKQoJCSAgewoJCQkkbmV3RW50aXR5LT5zZXQoJGZpZWxkLT5nZXROYW1lKCksT3JtQ29yZTo6X2RiVmFsdWVUb0ZpZWxkKCRyb3dbJGZpZWxkLT5nZXROYW1lKCldLCAkZmllbGQtPmdldFR5cGUoKSkpOwoJCSAgfSAKCQl9CgkJcmV0dXJuICRuZXdFbnRpdHk7ICAKCX0KICAKICAgIC8qKgogICAgICogVHJhbnNmb3JtIGEgUEhQIHZhbHVlIGludG8gYSBTUUwgdmFsdWUKICAgICAqIAogICAgICogQHBhcmFtIG1peGVkICRkYXRhIHRoZSBQSFAgdmFsdWUKICAgICAqIEBwYXJhbSBtaXhlZCAkdHlwZSB0aGUgQ0FTVCB2YWx1ZQogICAgICogCiAgICAgKiBAc2VlIE9ybUNBU1QKICAgICAqLwoJcHJpdmF0ZSBzdGF0aWMgZmluYWwgZnVuY3Rpb24gX2ZpZWxkVG9EQlZhbHVlKCRkYXRhLCAkdHlwZSkgewoJCWlmKGlzX251bGwoJGRhdGEpKXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJCQoJCXN3aXRjaCgkdHlwZSkgewoJCSAgY2FzZSBPcm1DQVNUOjokU1RSSU5HIDogcmV0dXJuICRkYXRhOwoJCSAgY2FzZSBPcm1DQVNUOjokRE9VQkxFIDogcmV0dXJuICRkYXRhOwoJCSAgY2FzZSBPcm1DQVNUOjokSU5URUdFUiA6IHJldHVybiAkZGF0YTsKCQkgIGNhc2UgT3JtQ0FTVDo6JE5VTUVSSUMgOiByZXR1cm4gJGRhdGE7CgkJICBjYXNlIE9ybUNBU1Q6OiRCVUZGRVIgOiByZXR1cm4gJGRhdGE7CgkJICBjYXNlIE9ybUNBU1Q6OiRVVUlEIDogcmV0dXJuICRkYXRhOwoJCSAgCgkJICBjYXNlIE9ybUNBU1Q6OiREQVRFIDogcmV0dXJuIHN0cl9yZXBsYWNlKCInIiwgIiIsIGNtc21zKCktPkdldERiKCktPkRCRGF0ZSgkZGF0YSkpOyAgICAgICAKCQkgIGNhc2UgT3JtQ0FTVDo6JFRJTUUgOiByZXR1cm4gc3RyX3JlcGxhY2UoIiciLCAiIiwgY21zbXMoKS0+R2V0RGIoKS0+REJUaW1lU3RhbXAoJGRhdGEpKTsgICAJICAKCQkgIGNhc2UgT3JtQ0FTVDo6JERBVEVUSU1FIDogcmV0dXJuIGRhdGUoIlktbS1kIEg6aTpzIiwkZGF0YSk7IAoJCSAgY2FzZSBPcm1DQVNUOjokVFMgOiByZXR1cm4gJGRhdGE7CgkJfQoJfQogIAogICAgLyoqCiAgICAgKiBUcmFuc2Zvcm0gYSBTUUwgdmFsdWUgaW50byBhIFBIUCB2YWx1ZQogICAgICogCiAgICAgKiBAcGFyYW0gbWl4ZWQgJGRhdGEgdGhlIFNRTCB2YWx1ZSAKICAgICAqIEBwYXJhbSBtaXhlZCAkdHlwZSB0aGUgQ0FTVCB2YWx1ZQogICAgICogCiAgICAgKiBAc2VlIE9ybUNBU1QKICAgICAqLwoJcHJpdmF0ZSBzdGF0aWMgZmluYWwgZnVuY3Rpb24gX2RiVmFsdWVUb0ZpZWxkKCRkYXRhLCAkdHlwZSkgewoJCXN3aXRjaCgkdHlwZSkgewoJCSAgY2FzZSBPcm1DQVNUOjokU1RSSU5HIDogcmV0dXJuICRkYXRhOwkJICAKCQkgIGNhc2UgT3JtQ0FTVDo6JERPVUJMRSA6IHJldHVybiAkZGF0YTsKCQkgIGNhc2UgT3JtQ0FTVDo6JElOVEVHRVIgOiByZXR1cm4gJGRhdGE7CQkgIAoJCSAgY2FzZSBPcm1DQVNUOjokTlVNRVJJQyA6IHJldHVybiAkZGF0YTsJCSAgCgkJICBjYXNlIE9ybUNBU1Q6OiRCVUZGRVIgOiByZXR1cm4gJGRhdGE7CQkgIAkJCgkJICBjYXNlIE9ybUNBU1Q6OiRVVUlEIDogcmV0dXJuICRkYXRhOwoJCSAgCgkJICBjYXNlIE9ybUNBU1Q6OiREQVRFIDogcmV0dXJuIGNtc21zKCktPkdldERiKCktPlVuaXhEYXRlKCRkYXRhKTsKCQkgIGNhc2UgT3JtQ0FTVDo6JFRJTUUgOiByZXR1cm4gJGRhdGE7CgkJICBjYXNlIE9ybUNBU1Q6OiREQVRFVElNRSA6IHJldHVybiBzdHJ0b3RpbWUoJGRhdGEpOyAgCgkJICBjYXNlIE9ybUNBU1Q6OiRUUyA6IHJldHVybiAkZGF0YTsKCgkJfQoJfQogIAogICAgLyoqCiAgICAgKiBWZXJpZnkgaW4gYWxsIHR5cGUgb2YgZW50aXRpZXMgaWYgYW55b25lIHN0aWxsIGhhcyBhIGxpbmsgd2l0aCB0aGUgT3JtRW50aXR5IHBhc3NlZCBpbiBwYXJhbWV0ZXJzIChGb3JlaWduS0V5IGFuZCBBc3NvY2lhdGVLZXkpCiAgICAgKiAKICAgICAqICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYnkgdGhlIGRlbGV0ZSogZnVuY3Rpb25zIHRvIGF2b2lkIG9ycGhhbnMgZGF0YSBpbiBkYXRhYmFzZQogICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAqIEBwYXJhbSBPcm1FbnRpdHkgJGVudGl0eVBhcmFtIGFuIGluc3RhbmNlIG9mIHRoZSBlbnRpdHkKICAgICAqIEBwYXJhbSBtaXhlZCAkc2lkIHRoZSBpZCBvZiB0aGUgT3JtRW50aXR5IHRvIHZlcmlmeQoJICoKCSAqIEByZXR1cm4gYSBtZXNzYWdlIGlmIGEgbGluayBpcyBzdGlsbCBwcmVzZW50LiBub3RoaW5nIGlmIHRoZSBpbnRlZ3JpdHkgaXMgb2sKICAgICAqLwoJcHVibGljIHN0YXRpYyBmaW5hbCBmdW5jdGlvbiB2ZXJpZkludGVncml0eShPcm1FbnRpdHkgJGVudGl0eVBhcmFtLCAkc2lkKSB7CgkJJGxpc3RlRW50aXR5cyA9IE15QXV0b2xvYWQ6OmdldEFsbEluc3RhbmNlcygkZW50aXR5UGFyYW0tPmdldE1vZHVsZU5hbWUoKSk7CgoJCWZvcmVhY2goJGxpc3RlRW50aXR5cyBhcyAka2V5PT4kYW5FbnRpdHkpIHsKCQkgIGlmKCRhbkVudGl0eSBpbnN0YW5jZU9mIE9ybUVudGl0eUFzc29jaWF0aW9uKQoJCQljb250aW51ZTsKCQkJCgkJICBmb3JlYWNoKCRhbkVudGl0eS0+Z2V0RmllbGRzKCkgYXMgJGZpZWxkKSB7CgkJCWlmKCRmaWVsZC0+aXNBc3NvY2lhdGVLRVkoKSkgewoJCQkgIGNvbnRpbnVlOwoJCQl9CgoJCQkKCQkJaWYoaXNfYXJyYXkoJGZpZWxkLT5nZXRLRVlOYW1lKCkpKXsKCgkJCX0KCQkJaWYoJGZpZWxkLT5nZXRLRVlOYW1lKCkgIT0gbnVsbCkgewoJCQkgICR2YWxzID0gZXhwbG9kZSgnLicsJGZpZWxkLT5nZXRLRVlOYW1lKCksMik7CgkJCSAgCgkJCSAgaWYoc3RydG9sb3dlciAoJHZhbHNbMF0pID09IHN0cnRvbG93ZXIgKCRlbnRpdHlQYXJhbS0+Z2V0TmFtZSgpKSkgIHsKCQkJCSRPcm1FeGFtcGxlID0gbmV3IE9ybUV4YW1wbGUoKTsKCQkJCSRPcm1FeGFtcGxlLT5hZGRDcml0ZXJpYSgkZmllbGQtPmdldE5hbWUoKSwgT3JtVHlwZUNyaXRlcmlhOjokRVEsIGFycmF5KCRzaWQpKTsKCQkJCSRlbnRpdHlzID0gT3JtQ29yZTo6ZmluZEJ5RXhhbXBsZSgkYW5FbnRpdHksICRPcm1FeGFtcGxlKTsKCQkJCWlmKGNvdW50KCRlbnRpdHlzKSA+IDApCgkJCQl7CgkJCQkgIHJldHVybiAiTGEgbGlnbmUgJmFncmF2ZTsgc3VwcHJpbWVyIGVzdCBlbmNvcmUgdXRpbGlzJmVhY3V0ZTtlIHBhciAmbGFxdW87ICIuJGFuRW50aXR5LT5nZXROYW1lKCkuIiAmcmFxdW87IjsKCQkJCX0KCQkJICB9CgkJCX0KCQkgIH0KCQl9CgoJCXJldHVybjsKCgl9CiAgCgkvKioKCSAqIFdpbGwgcmV0dXJuIGEgVVVJRCA6IGEgdW5pcXVlIGlkZW50aWZpZXIKCSAqIEBzaW5jZSAwLjAuMgoJICovCiAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGZ1bmN0aW9uIGdlbmVyYXRlVVVJRCgpewoKCQkvL0V4ZWN1dGlvbgoJCSRyZXN1bHQgPSBPcm1EYjo6ZXhlY3V0ZSgnU0VMRUNUIFVVSUQoKSBBUyB1dWlkOycsCgkJCQkJCQkJCW51bGwsCgkJCQkJCQkJCSJEYXRhYmFzZSBlcnJvciBkdXJpbmcgT3JtQ29yZTo6Z2VuZXJhdGVVVUlEKCkiKTsKCgkJJHJvdz0kcmVzdWx0LT5GZXRjaFJvdygpOwoKCQlyZXR1cm4gJHJvd1sndXVpZCddOwoJfQp9Cgo/Pgo=]]></data>
	</file>
	<file>
	  <filename>/lib/class.OrmCriteria.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIENvbnRhaW5zIE9ybUNyaXRlcmlhIGNsYXNzCiAqIAogKiBAc2luY2UgMC4wLjEKICogQGF1dGhvciBCZXNzCiAqKi8KIAogCgovKioKICogQmFja2JvbmUgZm9yIE9ybUNyaXRlcmlhIGludG8gdGhlIE9ybSBzeXN0ZW0KICoKICogQHNpbmNlIDAuMC4xCiAqIEBhdXRob3IgQmVzcwogKiBAcGFja2FnZSBPcm0KICoqLwpjbGFzcyBPcm1Dcml0ZXJpYQp7CgkvKioKCSAqIE5hbWUgb2YgdGhlIGZpZWxkIAoJICovCglwdWJsaWMgJGZpZWxkbmFtZTsKCQoJLyoqCgkgKiBUeXBlIG9mIENyaXRlcmlhCgkgKi8KCXB1YmxpYyAkdHlwZUNyaXRlcmlhOwoJCgkvKioKCSAqIFBhcmFtZXRlcnMgZm9yIHRoZSB0eXBlIG9mIENyaXRlcmlhCgkgKi8KCXB1YmxpYyAkcGFyYW1zQ3JpdGVyaWE7CgkKCS8qKgoJICogQm9vbGVhbiBpZiB3ZSBtdXN0IGlnbm9yZSBjYXNlCgkgKi8KCXB1YmxpYyAkaWdub3JlQ2FzZTsKCQogICAgLyoqCiAgICAqIFB1YmxpYyBDb25zdHJ1Y3RvcgogICAgKiAKICAgICogQHBhcmFtIHN0cmluZyAkZmllbGRuYW1lIE5hbWUgb2YgdGhlIGZpZWxkIAogICAgKiBAcGFyYW0gT3JtVHlwZUNyaXRlcmlhICR0eXBlQ3JpdGVyaWEgVHlwZSBvZiBDcml0ZXJpYQogICAgKiBAcGFyYW0gbWl4ZWRbXSAkcGFyYW1zQ3JpdGVyaWEgYXJyYXkgd2l0aCBhbGwgdGhlIHBhcmFtZXRlcnMgdXNlZCBmb3IgdGhlIHBhcmFtZXRlciAkdHlwZUNyaXRlcmlhCiAgICAqIEBwYXJhbSBib29sZWFuICRpZ25vcmVDYXNlIFtPcHRpb25hbF0gaWYgd2UgbXVzdCBpZ25vcmUgdGhlIGNhc2UgKGF6ZSBlcXVhbHMgQVpFKSBvciBub3QuIERlZmF1bHQgdmFsdWUgaXMgImZhbHNlIgogICAgKgoJKiBAcmV0dXJuIE9ybUNyaXRlcmlhIGEgQ3JpdGVyaWEKCSoKCSogQHNlZSBPcm1UeXBlQ3JpdGVyaWEKICAgICovCglwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGZpZWxkbmFtZSwgJHR5cGVDcml0ZXJpYSwgJHBhcmFtc0NyaXRlcmlhLCAkaWdub3JlQ2FzZSA9IGZhbHNlKQoJewoJCSR0aGlzLT5maWVsZG5hbWUgPSAkZmllbGRuYW1lOwoJCSR0aGlzLT50eXBlQ3JpdGVyaWEgPSAkdHlwZUNyaXRlcmlhOwoJCSR0aGlzLT5wYXJhbXNDcml0ZXJpYSA9ICRwYXJhbXNDcml0ZXJpYTsKCQkkdGhpcy0+aWdub3JlQ2FzZSA9ICRpZ25vcmVDYXNlOwoJfQp9Cgo/Pgo=]]></data>
	</file>
	<file>
	  <filename>/lib/class.OrmDb.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIENvbnRhaW5zIHRoZSBjbGFzcyBPcm1EYgogKiAKICogQHNpbmNlIDAuMS4yCiAqIEBhdXRob3IgQmVzcwogKiovCiAKIAovKioKICogSW50ZXJmYWNlIGJldHdlZW4gdGhlIGZ1bmN0aW9ucyBvZiB0aGUgT3JtIGZyYW1ld29yayBhbmQgQWRvZGIKICogICAKICogQHNpbmNlIDAuMS4yCiAqIEBhdXRob3IgQmVzcwogKiBAcGFja2FnZSBPcm0KKi8KY2xhc3MgT3JtRGIgeyAgCgoJLyoqCgkgKiBDb250YWlucyB0aGUgYWRvZGIgZW5naW5lCgkgKi8KCXByaXZhdGUgc3RhdGljICRkYjsKCgkvKioKCSAqIENvbnRhaW5zIHRoZSBhZG9kYiBkaWN0aW9ubmFyeQoJICovCglwcml2YXRlIHN0YXRpYyAkZGljdDsKCQoJLyoqCgkgKiBDb250YWlucyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgZGF0YWJhc2UgYW5kIHRhYmxlIGNyZWF0aW9uIGZvciBjbXNtcwoJICovCglwcml2YXRlIHN0YXRpYyAkdGFib3B0YXJyYXkgPSBhcnJheSggJ215c3FsJyA9PiAnRU5HSU5FIE15SVNBTSBDSEFSQUNURVIgU0VUIHV0ZjggQ09MTEFURSB1dGY4X2dlbmVyYWxfY2knKTsKCgkvKioKCSAqIENvbnRhaW5zIHdvcmRzIGZvciB0aGUgVU5JUVVFIGtleQoJICovCglwcml2YXRlIHN0YXRpYyAkaWR4b3B0YXJyYXlVbmlxdWUgPSBhcnJheSgnVU5JUVVFJyk7CgogICAgLyoqCiAgICAqIFByb3RlY3RlZCBjb25zdHJ1Y3RvciAgICAKICAgICovCglwcm90ZWN0ZWQgZnVuY3Rpb24gX19jb25zdHJ1Y3QoKSB7fQoJCgkvKioKCSAqIEFsbG93IGluaXRpYWxpemluZyB0aGUgT3JtRGIgZmllbGRzCgkgKi8KCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZnVuY3Rpb24gaW5pdCgpewoJCWlmKE9ybURiOjokZGIgIT0gbnVsbCl7CgkJCXJldHVybjsKCQl9CgkJT3JtRGI6OiRkYiA9IGNtc21zKCktPkdldERiKCk7CgkJT3JtRGI6OiRkaWN0ID0gTmV3RGF0YURpY3Rpb25hcnkoIE9ybURiOjokZGIgKTsKCX0KICAgICAgCiAgICAvKioKICAgICogd2lsbCBleGVjdXRlIHRoZSBBZG9kYiAiZXhlY3V0ZSIgZnVuY3Rpb24gYW5kIGFkZCBsb2dzIG9mIGV2ZXJ5dGhpbmcKICAgICogICAgICAgICAKICAgICogQHBhcmFtIHN0cmluZyAkcXVlcnkgdGhlIHNxbCBRdWVyeQogICAgKiBAcGFyYW0gbWl4ZWRbXSAkcGFyYW1ldGVycyBhcnJheSB0aGUgbGlzdCBvZiBwYXJhbWV0ZXJzIG9yIG51bGwKICAgICogQHBhcmFtIHN0cmluZyAkZXJyb3JNc2cgdGhlIG1lc3NhZ2Ugb2YgZXJyb3IgdG8gZGlzcGxheSB0byB0aGUgdXNlcgogICAgKiBAcmV0dXJuIG1peGVkIHRoZSBhZG9kYiByZXN1bHQKCSoKCSogQGV4Y2VwdGlvbiBPcm1TcWxFeGNlcHRpb24gaWYgdGhlIHF1ZXJ5IGZhaWxlZAogICAgKi8KCXB1YmxpYyBzdGF0aWMgZmluYWwgZnVuY3Rpb24gZXhlY3V0ZSgkcXVlcnksICRwYXJhbWV0ZXJzID0gbnVsbCwgJGVycm9yTXNnID0gIkRhdGFiYXNlIGVycm9yIikgewoJCS8vQmUgc3VyZSB3ZSBpbml0aWF0ZSB0aGUgZGIgY29ubmVjdG9yOwoJCU9ybURiOjppbml0KCk7CgkJT3JtVHJhY2U6OmRlYnVnKCRxdWVyeSk7CgkJaWYoJHBhcmFtZXRlcnMgIT0gbnVsbCl7CgkJCU9ybVRyYWNlOjpkZWJ1ZygiID4gUGFyYW1ldGVycyA6ICIucHJpbnRfcigkcGFyYW1ldGVycywgdHJ1ZSkpOwoJCX0KCQkkcmVzdWx0ID0gT3JtRGI6OiRkYi0+RXhlY3V0ZSgkcXVlcnksICRwYXJhbWV0ZXJzKTsKCQlpZiAoJHJlc3VsdCA9PT0gZmFsc2UpewoJCQlPcm1UcmFjZTo6ZXJyb3IoJGVycm9yTXNnKTsKCQkJT3JtVHJhY2U6OmVycm9yKCIgPiBNeXNxbCBzYWlkIDogIi5Pcm1EYjo6JGRiLT5FcnJvck1zZygpKTsKCQkJT3JtVHJhY2U6OmVycm9yKCIgPiBUaGUgUXVlcnkgd2FzIDogIi4kcXVlcnkpOwoJCQlpZigkcGFyYW1ldGVycyAhPSBudWxsKXsKCQkJCU9ybVRyYWNlOjplcnJvcigiID4gVGhlIFBhcmFtZXRlcnMgd2FzIDogIi5wcmludF9yKCRwYXJhbWV0ZXJzLCB0cnVlKSk7CgkJCX0KCQkJdGhyb3cgbmV3IE9ybVNxbEV4Y2VwdGlvbigkZXJyb3JNc2cpOwoJCX0KCQkKCQlyZXR1cm4gJHJlc3VsdDsKCX0JCgkKCSAvKioKICAgICogd2lsbCBleGVjdXRlIHRoZSBBZG9kYiAiR2V0T25lIiBmdW5jdGlvbiBhbmQgYWRkIGxvZ3Mgb2YgZXZlcnl0aGluZwogICAgKiAgICAgICAgIAogICAgKiBAcGFyYW0gc3RyaW5nICRxdWVyeSB0aGUgc3FsIFF1ZXJ5CiAgICAqIEBwYXJhbSBtaXhlZFtdICRwYXJhbWV0ZXJzIGFycmF5IHRoZSBsaXN0IG9mIHBhcmFtZXRlcnMgb3IgbnVsbAogICAgKiBAcGFyYW0gc3RyaW5nICRlcnJvck1zZyB0aGUgbWVzc2FnZSBvZiBlcnJvciB0byBkaXNwbGF5IHRvIHRoZSB1c2VyCiAgICAqIEByZXR1cm4gbWl4ZWQgdGhlIGFkb2RiIHJlc3VsdAoJKgoJKiBAZXhjZXB0aW9uIE9ybVNxbEV4Y2VwdGlvbiBpZiB0aGUgcXVlcnkgZmFpbGVkCiAgICAqLwoJcHVibGljIHN0YXRpYyBmaW5hbCBmdW5jdGlvbiBnZXRPbmUoJHF1ZXJ5LCAkcGFyYW1ldGVycyA9IG51bGwsICRlcnJvck1zZyA9ICJEYXRhYmFzZSBlcnJvciIpIHsKCQkvL0JlIHN1cmUgd2UgaW5pdGlhdGUgdGhlIGRiIGNvbm5lY3RvcjsKCQlPcm1EYjo6aW5pdCgpOwoJCU9ybVRyYWNlOjpkZWJ1ZygkcXVlcnkpOwoJCWlmKCRwYXJhbWV0ZXJzICE9IG51bGwpewoJCQlPcm1UcmFjZTo6ZGVidWcoIiA+IFBhcmFtZXRlcnMgOiAiLnByaW50X3IoJHBhcmFtZXRlcnMsIHRydWUpKTsKCQl9CgkJJHJlc3VsdCA9IE9ybURiOjokZGItPkdldE9uZSgkcXVlcnksICRwYXJhbWV0ZXJzKTsKCQlpZiAoJHJlc3VsdCA9PT0gZmFsc2UpewoJCQlPcm1UcmFjZTo6ZXJyb3IoJGVycm9yTXNnKTsKCQkJT3JtVHJhY2U6OmVycm9yKCIgPiBNeXNxbCBzYWlkIDogIi5Pcm1EYjo6JGRiLT5FcnJvck1zZygpKTsKCQkJT3JtVHJhY2U6OmVycm9yKCIgPiBUaGUgUXVlcnkgd2FzIDogIi4kcXVlcnkpOwoJCQlpZigkcGFyYW1ldGVycyAhPSBudWxsKXsKCQkJCU9ybVRyYWNlOjplcnJvcigiID4gVGhlIFBhcmFtZXRlcnMgd2FzIDogIi5wcmludF9yKCRwYXJhbWV0ZXJzLCB0cnVlKSk7CgkJCX0KCQkJdGhyb3cgbmV3IE9ybVNxbEV4Y2VwdGlvbigkZXJyb3JNc2cpOwoJCX0KCQkKCQlyZXR1cm4gJHJlc3VsdDsKCX0JCgkKCSAvKioKICAgICogd2lsbCBleGVjdXRlIHRoZSBBZG9kYiAiR2VuSUQiIGZ1bmN0aW9uIGFuZCBhZGQgbG9ncyBvZiBldmVyeXRoaW5nCiAgICAqICAgICAgICAgCiAgICAqIEBwYXJhbSBzdHJpbmcgJHNlcW5hbWUgdGhlIHRhYmxlIHVzZWQgZm9yIHNlcXVlbmNlIAogICAgKiBAcGFyYW0gc3RyaW5nICRlcnJvck1zZyB0aGUgbWVzc2FnZSBvZiBlcnJvciB0byBkaXNwbGF5IHRvIHRoZSB1c2VyCiAgICAqCiAgICAqIEByZXR1cm4gbWl4ZWQgdGhlIGFkb2RiIHJlc3VsdAoJKgoJKiBAZXhjZXB0aW9uIE9ybVNxbEV4Y2VwdGlvbiBpZiB0aGUgcXVlcnkgZmFpbGVkCiAgICAqLwoJcHVibGljIHN0YXRpYyBmaW5hbCBmdW5jdGlvbiBnZW5JRCgkc2VxbmFtZSwgJGVycm9yTXNnID0gIkRhdGFiYXNlIGVycm9yIikgewoJCS8vQmUgc3VyZSB3ZSBpbml0aWF0ZSB0aGUgZGIgY29ubmVjdG9yOwoJCU9ybURiOjppbml0KCk7CgkJCgkJT3JtVHJhY2U6OmRlYnVnKCJnZW4gSWQoeyRzZXFuYW1lfSkiKTsKCQkkcmVzdWx0ID0gT3JtRGI6OiRkYi0+R2VuSUQoJHNlcW5hbWUpOwoJCWlmICgkcmVzdWx0ID09PSBmYWxzZSl7CgkJCU9ybVRyYWNlOjplcnJvcigkZXJyb3JNc2cpOwoJCQlPcm1UcmFjZTo6ZXJyb3IoIiA+IE15c3FsIHNhaWQgOiAiLk9ybURiOjokZGItPkVycm9yTXNnKCkpOwoJCQlPcm1UcmFjZTo6ZXJyb3IoIiA+IFRoZSBHZW5JZCB3YXMgbWFkZSBvbiA6ICIuJHNlcW5hbWUpOwoKCQkJdGhyb3cgbmV3IE9ybVNxbEV4Y2VwdGlvbigkZXJyb3JNc2cpOwoJCX0KCQkKCQlyZXR1cm4gJHJlc3VsdDsKCX0JCgkKCSAvKioKICAgICogd2lsbCBleGVjdXRlIHRoZSBBZG9kYiAiQ3JlYXRlVGFibGVTUUwiIGZ1bmN0aW9uIGFuZCBhZGQgbG9ncyBvZiBldmVyeXRoaW5nCiAgICAqICAgICAgICAgCiAgICAqIEBwYXJhbSBzdHJpbmcgJHRhYmxlTmFtZSB0aGUgdGFibGUgdXNlZCBmb3Igc2VxdWVuY2UgCiAgICAqIEBwYXJhbSBzdHJpbmcgJGhxbCB0aGUgaHFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBmaWVsZHMKICAgICoKICAgICogQHJldHVybiBtaXhlZCB0aGUgYWRvZGIgcmVzdWx0CgkqCgkqIEBleGNlcHRpb24gT3JtU3FsRXhjZXB0aW9uIGlmIHRoZSBxdWVyeSBmYWlsZWQKICAgICovCglwdWJsaWMgc3RhdGljIGZpbmFsIGZ1bmN0aW9uIGNyZWF0ZVRhYmxlKCR0YWJsZU5hbWUsICRocWwpIHsKCQkvL0JlIHN1cmUgd2UgaW5pdGlhdGUgdGhlIGRiIGNvbm5lY3RvcjsKCQlPcm1EYjo6aW5pdCgpOwoJCQoJCU9ybVRyYWNlOjpkZWJ1ZygiY3JlYXRlVGFibGUoeyR0YWJsZU5hbWV9LCB7JGhxbH0pIik7CgkJCgkJJHNxbGFycmF5ID0gT3JtRGI6OiRkaWN0LT5DcmVhdGVUYWJsZVNRTCgkdGFibGVOYW1lLCAKCQkJCQkJCQkJCQkJJGhxbCwKCQkJCQkJCQkJCQkJT3JtRGI6OiR0YWJvcHRhcnJheSk7CgkJCQkJCQkJCQkJCQoJCSRyZXN1bHQgPSBPcm1EYjo6JGRpY3QtPkV4ZWN1dGVTUUxBcnJheSgkc3FsYXJyYXkpOwoJCWlmICgkcmVzdWx0ID09PSBmYWxzZSl7CgkJCU9ybVRyYWNlOjplcnJvcigkZXJyb3JNc2cpOwoJCQlPcm1UcmFjZTo6ZXJyb3IoIiA+IE15c3FsIHNhaWQgOiAiLk9ybURiOjokZGItPkVycm9yTXNnKCkpOwoJCQlPcm1UcmFjZTo6ZXJyb3IoIiA+IFRoZSBDcmVhdGVUYWJsZSB3YXMgbWFkZSBvbiA6IHskdGFibGVOYW1lfSB3aXRoIHskaHFsfSBwYXJhbWV0ZXJzIik7CgoJCQl0aHJvdyBuZXcgT3JtU3FsRXhjZXB0aW9uKCRlcnJvck1zZyk7CgkJfQoJCQoJCXJldHVybiAkcmVzdWx0OwoJfQoKCS8qKgogICAgKiB3aWxsIGV4ZWN1dGUgdGhlIEFkb2RiICJEcm9wVGFibGVTUUwiIGZ1bmN0aW9uIGFuZCBhZGQgbG9ncyBvZiBldmVyeXRoaW5nCiAgICAqICAgICAgICAgCiAgICAqIEBwYXJhbSBzdHJpbmcgJHRhYmxlTmFtZSB0aGUgdGFibGUgdXNlZCBmb3Igc2VxdWVuY2UgCgkqIAogICAgKiBAcmV0dXJuIG1peGVkIHRoZSBhZG9kYiByZXN1bHQKCSoKCSogQGV4Y2VwdGlvbiBPcm1TcWxFeGNlcHRpb24gaWYgdGhlIHF1ZXJ5IGZhaWxlZAogICAgKi8KCXB1YmxpYyBzdGF0aWMgZmluYWwgZnVuY3Rpb24gZHJvcFRhYmxlKCR0YWJsZU5hbWUpIHsKCQkvL0JlIHN1cmUgd2UgaW5pdGlhdGUgdGhlIGRiIGNvbm5lY3RvcjsKCQlPcm1EYjo6aW5pdCgpOwoJCQoJCU9ybVRyYWNlOjpkZWJ1ZygiZHJvcFRhYmxlKHskdGFibGVOYW1lfSkiKTsKCQkKCQkkc3FsYXJyYXkgPSBPcm1EYjo6JGRpY3QtPkRyb3BUYWJsZVNRTCgkdGFibGVOYW1lKTsKCQkkcmVzdWx0ID0gT3JtRGI6OiRkaWN0LT5leGVjdXRlU1FMQXJyYXkoJHNxbGFycmF5KTsKCQkKCQlpZiAoJHJlc3VsdCA9PT0gZmFsc2UpewoJCQlPcm1UcmFjZTo6ZXJyb3IoJGVycm9yTXNnKTsKCQkJT3JtVHJhY2U6OmVycm9yKCIgPiBNeXNxbCBzYWlkIDogIi5Pcm1EYjo6JGRiLT5FcnJvck1zZygpKTsKCQkJT3JtVHJhY2U6OmVycm9yKCIgPiBUaGUgRHJvcFRhYmxlIHdhcyBtYWRlIG9uIDogeyR0YWJsZU5hbWV9Iik7CgoJCQl0aHJvdyBuZXcgT3JtU3FsRXhjZXB0aW9uKCRlcnJvck1zZyk7CgkJfQoJCQoJCXJldHVybiAkcmVzdWx0OwoJfQoJCgkvKioKICAgICogd2lsbCBleGVjdXRlIHRoZSBBZG9kYiAiQ3JlYXRlU2VxdWVuY2UiIGZ1bmN0aW9uIGFuZCBhZGQgbG9ncyBvZiBldmVyeXRoaW5nCiAgICAqICAgICAgICAgCiAgICAqIEBwYXJhbSBzdHJpbmcgJHNlcU5hbWUgdGhlIHRhYmxlIHVzZWQgZm9yIHNlcXVlbmNlIAogICAgKi8KCXB1YmxpYyBzdGF0aWMgZmluYWwgZnVuY3Rpb24gY3JlYXRlU2VxdWVuY2UoJHNlcU5hbWUpewoJCS8vQmUgc3VyZSB3ZSBpbml0aWF0ZSB0aGUgZGIgY29ubmVjdG9yOwoJCU9ybURiOjppbml0KCk7CgkJCgkJT3JtVHJhY2U6OmRlYnVnKCJjcmVhdGVTZXF1ZW5jZSh7JHNlcU5hbWV9KSIpOwoJCQoJCU9ybURiOjokZGItPkNyZWF0ZVNlcXVlbmNlKCRzZXFOYW1lKTsKCX0KCQoJLyoqCiAgICAqIHdpbGwgZXhlY3V0ZSB0aGUgQWRvZGIgIkRyb3BTZXF1ZW5jZSIgZnVuY3Rpb24gYW5kIGFkZCBsb2dzIG9mIGV2ZXJ5dGhpbmcKICAgICogICAgICAgICAKICAgICogQHBhcmFtIHN0cmluZyAkc2VxTmFtZSB0aGUgdGFibGUgdXNlZCBmb3Igc2VxdWVuY2UgCiAgICAqLwoJcHVibGljIHN0YXRpYyBmaW5hbCBmdW5jdGlvbiBkcm9wU2VxdWVuY2UoJHNlcU5hbWUpewoJCS8vQmUgc3VyZSB3ZSBpbml0aWF0ZSB0aGUgZGIgY29ubmVjdG9yOwoJCU9ybURiOjppbml0KCk7CgkJCgkJT3JtVHJhY2U6OmRlYnVnKCJkcm9wU2VxdWVuY2UoeyRzZXFOYW1lfSkiKTsKCQkKCQlPcm1EYjo6JGRiLT5Ecm9wU2VxdWVuY2UoJHNlcU5hbWUpOwoJCQoJfQoJCgkvKioKICAgICogd2lsbCBleGVjdXRlIHRoZSBBZG9kYiAiQ3JlYXRlSW5kZXhTUUwiIGZ1bmN0aW9uIHdpdGggb3Igd2l0aG91dCBVTklRVUUgcGFyYW1ldGVyIGFuZCBhZGQgbG9ncyBvZiBldmVyeXRoaW5nCiAgICAqICAgICAgICAgCiAgICAqIEBwYXJhbSBzdHJpbmcgJHRhYmxlTmFtZSB0aGUgdGFibGUgdXNlZCBmb3Igc2VxdWVuY2UgCiAgICAqIEBwYXJhbSBtaXhlZCAkbGlzdEZpZWxkcyB0aGUgbGlzdCBvZiB0aGUgRmllbGROYW1lIChhcnJheSkgb3IgYSBzaW5nbGUgZmllbGROYW1lIChTdHJpbmcpCiAgICAqIEBwYXJhbSBib29sZWFuICRpc1VuaXF1ZSB0cnVlIGlmIHRoZSBpbmRleCBtdXN0IGJlIFVOSVFVRQogICAgKgogICAgKiBAcmV0dXJuIG1peGVkIHRoZSBhZG9kYiByZXN1bHQKCSoKCSogQGV4Y2VwdGlvbiBPcm1TcWxFeGNlcHRpb24gaWYgdGhlIHF1ZXJ5IGZhaWxlZAogICAgKi8KCXB1YmxpYyBzdGF0aWMgZmluYWwgZnVuY3Rpb24gY3JlYXRlSW5kZXgoJHRhYmxlTmFtZSwgJGxpc3RGaWVsZHMsICRpc1VuaXF1ZSA9IGZhbHNlKXsKCQkvL0JlIHN1cmUgd2UgaW5pdGlhdGUgdGhlIGRiIGNvbm5lY3RvcjsKCQlPcm1EYjo6aW5pdCgpOwoJCQoJCU9ybVRyYWNlOjpkZWJ1ZygiY3JlYXRlSW5kZXgoeyR0YWJsZU5hbWV9LCB7Ii5pbXBsb2RlKCcsJywkbGlzdEZpZWxkcykuIn0sIHskaXNVbmlxdWV9KSIpOwoJCQkJCgkJLy9DYXNlIDogdW5pcXVlIGluZGV4IG9uIG1hbnkgZmllbGRzCgkJaWYoaXNfYXJyYXkoJGxpc3RGaWVsZHMpKSB7CgkJCSRpZHhmbGRzID0gaW1wbG9kZSgnLCcsICRsaXN0RmllbGRzKTsKCQkJJG1kNSA9IG1kNShzZXJpYWxpemUoJGxpc3RGaWVsZHMpKTsKCQl9IGVsc2UgewoJCQkkaWR4ZmxkcyA9ICRsaXN0RmllbGRzOwoJCQkkbWQ1ID0gbWQ1KCRsaXN0RmllbGRzKTsKCQl9CgkJaWYoJGlzVW5pcXVlKXsKCQkJJHNxbGFycmF5ID0gT3JtRGI6OiRkaWN0LT5DcmVhdGVJbmRleFNRTCgkbWQ1LCAkdGFibGVOYW1lLCAkaWR4ZmxkcywgT3JtRGI6OiRpZHhvcHRhcnJheVVuaXF1ZSk7CgkJfSBlbHNlIHsKCQkJJHNxbGFycmF5ID0gT3JtRGI6OiRkaWN0LT5DcmVhdGVJbmRleFNRTCgkbWQ1LCAkdGFibGVOYW1lLCAkaWR4Zmxkcyk7CgkJfQoJCQoJCSRyZXN1bHQgPSBPcm1EYjo6JGRpY3QtPmV4ZWN1dGVTUUxBcnJheSgkc3FsYXJyYXkpOwoJCQoJCWlmICgkcmVzdWx0ID09PSBmYWxzZSl7CgkJCU9ybVRyYWNlOjplcnJvcigkZXJyb3JNc2cpOwoJCQlPcm1UcmFjZTo6ZXJyb3IoIiA+IE15c3FsIHNhaWQgOiAiLk9ybURiOjokZGItPkVycm9yTXNnKCkpOwoJCQlPcm1UcmFjZTo6ZXJyb3IoIiA+IFRoZSBjcmVhdGVJbmRleCB3YXMgbWFkZSBvbiA6IHskdGFibGVOYW1lfSB3aXRoIHRoZSBmaWVsZHMgOiB7JGxpc3RGaWVsZHN9Iik7CgoJCQl0aHJvdyBuZXcgT3JtU3FsRXhjZXB0aW9uKCRlcnJvck1zZyk7CgkJfQoJCQoJCXJldHVybiAkcmVzdWx0OwoJfQoJCgkKCQoJCn0KCj8+Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/class.OrmEntity.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIENvbnRhaW5zIHRoZSBjbGFzcyBPcm1FbnRpdHkKICoKICogQHNpbmNlIDAuMC4xCiAqIEBhdXRob3IgQmVzcwogKiovCiAKLyoqCiAqIEFic3RyYWN0IENsYXNzZXMgZGVzY3JpYmluZyB0aGUgZnJhbWUgb2YgYW4gT3JtRW50aXR5IGludG8gT3JtCiAqCiAqIEBzaW5jZSAwLjAuMQogKiBAYXV0aG9yIEJlc3MKICogQHBhY2thZ2UgT3JtCiAqKi8KYWJzdHJhY3QgY2xhc3MgT3JtRW50aXR5CnsKCS8qKgoJICogU3RyaW5nIDogTmFtZSBvZiB0aGUgbW9kdWxlIHRoYXQgY3VycmVudGx5IHVzZSB0aGlzIGVudGl0eQoJICogKi8KCXByaXZhdGUgJG1vZHVsZU5hbWU7CgkKCS8qKgoJICogU3RyaW5nIDogdGhlIG9mZmljaWFsIG5hbWUgb2YgdGhlIGVudGl0eQoJICogKi8KCXByb3RlY3RlZCAkbmFtZTsKCgkvKioKCSAqIFN0cmluZyA6IHRoZSBuYW1lIG9mIHRoZSB0YWJsZSBpbiBkYXRhYmFzZQoJICogKi8KCXByaXZhdGUgJGRibmFtZTsKCQoJLyoqCgkgKiBTdHJpbmcgOiBuYW1lIG9mIHRoZSBzZXF1ZW5jZSBsaW5rZWQgdG8gdGhlIHRhYmxlIGluIHRoZSBkYXRhYmFzZS4gTWF5IGJlIE51bGwKCSAqICovCglwcml2YXRlICRzZXFuYW1lOwoJCgkvKioKCSAqIGxpc3QgOiBmaWVsZHMgbWFraW5nIHVwIHRoZSBlbnRpdHkKCSAqICovCglwcml2YXRlICRmaWVsZHMgPSBhcnJheSgpOwoJCgkvKioKCSAqIGxpc3QgOiB2YWx1ZXMgb2YgZWFjaCBmaWVsZHMKCSAqICovCglwcml2YXRlICR2YWx1ZXMgPSBhcnJheSgpOwoJCgkvKioKCSAqIEFycmF5IDogTmFtZXMgb2YgdGhlIGZpZWxkcyB3aWNoIHdpbGwgYmUgdXNlZCBhcyBhIChjb21wb3VuZCkgUHJpbWFyeSBLZXkKCSAqICovCglwcml2YXRlICRwayA9IGFycmF5KCk7CgkKCS8qKgoJICogQm9vbGVhbiA6IGlmIHRydWUgdGhlIGZyYW1ld29yayB3aWxsIHRyeSB0byB1c2UgdGhlIGlubmVyIGF1dG9pbmNyZW1lbnQgb2YgTXlzcWwgaW5zdGVhZCBnZW5lcmF0ZSBhIG5ldyB0YWJsZSB4eHhfc2VxIGxpa2UgdXN1YWwKCSAqLwoJcHJpdmF0ZSAkYXV0b2luY3JlbWVudCA9IGZhbHNlOwoJCgkvKioKCSAqIEFycmF5LCBjb250YWlucyBhbGwgdGhlIGluZGV4ZXMgb2YgdGhlIEVudGl0eS4KCSAqKi8JIAoJcHJpdmF0ZSAkaW5kZXhlcyA9IGFycmF5KCk7CgkKCS8qKgoJICogT3JtT3JkZXJCeSA6IGlmIHRydWUgdGhlIGZyYW1ld29yayB3aWxsIHRyeSB0byB1c2UgdGhlIGlubmVyIGF1dG9pbmNyZW1lbnQgb2YgTXlzcWwgaW5zdGVhZCBnZW5lcmF0ZSBhIG5ldyB0YWJsZSB4eHhfc2VxIGxpa2UgdXN1YWwKCSAqLwoJcHJpdmF0ZSAkZGVmYXVsdE9yZGVyQnk7CgoJLyoqCgkgKiBBcnJheSwgY29udGFpbnMgdGhlIGFsaWFzIGZvciBnZXQqIGFuZCBzZXQqIGZ1bmN0aW9uCgkgKi8gCglwcml2YXRlICRhbGlhcyA9IGFycmF5KCk7CgkKCS8qKgoJICogU3RyaW5nIDogY29uc3RhbnQsIHN1ZmZpeCBmb3IgdGhlIHNlcXVlbmNlIG5hbWUgaW50byB0aGUgZGF0YWJhc2UKCSAqICovCglwdWJsaWMgc3RhdGljICRfQ09OU1RfU0VRID0gJ19zZXEnOwoJLyoqCgkgKiBTdHJpbmcgOiBjb25zdGFudCwgc3VmZml4IHVzZWQgdG8gbmFtZWQgdGhlIHRhYmxlIGludG8gZGF0YWJhc2UgZm9yIGEgbW9kdWxlCgkgKiAqLwoJcHVibGljIHN0YXRpYyAkX0NPTlNUX01PRCA9ICdtb2R1bGUnOwoJCgkKICAgIC8qKgogICAgICogY29uc3RydWN0b3IgcHJvdGVjdGVkIHRvIGF2b2lkIGEgZGlyZWN0IGluc3RhbnRpYXRpb24gbGlrZSAibmV3IE9ybUVudGl0eSgpIgogICAgICogRWFjaCB0aW1lIGEgZW50aXR5IGlzIGNvbnN0cnVjdGVkLCB3ZSBwbGFjZSBhIGNvcHkgaW50byB0aGUgYXV0b2xvYWRlci4KICAgICAqIAogICAgICogQHBhcmFtIHN0cmluZyAkbW9kdWxlTmFtZSBUaGUgbmFtZSBvZiB0aGUgbW9kdWxlIHdobyBjYWxsaW5nIHRoaXMgbWV0aG9kIChzbyBub3QgIk9ybSIpCiAgICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lIFRoZSBuYW1lIG9mIHRoZSBlbnRpdHkKICAgICAqIEBwYXJhbSBzdHJpbmcgJHByZWZpeGUgW29wdGlvbmFsXSBQcmVmaXggdG8gdXNlIGludG8gZGF0YWJhc2UgZm9yIHRhYmxlLiBJZiBub3Qgc2V0dGVkLCBpdCB3aWxsIHVzZSB0aGUgbmFtZSBvZiB5b3VyIG1vZHVsZQogICAgICogQHBhcmFtIHN0cmluZyAkZGJOYW1lIFtvcHRpb25hbF0gVGhlIG5hbWUgb2YgdGFibGUgZm9yIHRoaXMgZW50aXR5LiBJZiBub3Qgc2V0dGVkLCBpdCB3aWxsIHVzZSB0aGUgbmFtZSBvZiB5b3VyIGVudGl0eQogICAgICoKICAgICAqIEByZXR1cm4gT3JtRW50aXR5IHRoZSBlbnRpdHkgYXMgYSBuZXcgaW5zdGFuY2UKICAgICAqIAogICAgICogQHNlZSBNeUF1dG9sb2FkCiAgICAgKi8KCXByb3RlY3RlZCBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkbW9kdWxlTmFtZSwgJG5hbWUsICRwcmVmaXhlID0gbnVsbCwgJGRiTmFtZSA9IG51bGwpIHsKCQkkdGhpcy0+bW9kdWxlTmFtZSA9IHN0cnRvbG93ZXIoJG1vZHVsZU5hbWUpOwoJCSR0aGlzLT5uYW1lID0gc3RydG9sb3dlcigkbmFtZSk7CgkJCgkJaWYoTXlBdXRvbG9hZDo6aGFzSW5zdGFuY2UoJHRoaXMtPm1vZHVsZU5hbWUsJHRoaXMtPm5hbWUpKXsKCQkJCSRpbnN0YW5jZSA9IE15QXV0b2xvYWQ6OmdldEluc3RhbmNlKCR0aGlzLT5tb2R1bGVOYW1lLCR0aGlzLT5uYW1lKTsKCQkJCXJldHVybiAgY2xvbmUgJGluc3RhbmNlOwogICAgICAgIH0gCgkJCgkJJHRoaXMtPmRibmFtZSA9ICR0aGlzLT5uYW1lOwoJCWlmKCFlbXB0eSgkZGJOYW1lKSkgewoJCQkkdGhpcy0+ZGJuYW1lID0gc3RydG9sb3dlcigkZGJOYW1lKTsKCQl9CgkJCgkJaWYoZW1wdHkoJHByZWZpeGUpKSB7CgkJCSRwcmVmaXhlID0gJHRoaXMtPm1vZHVsZU5hbWU7CgkJfSBlbHNlIHsKCQkJJHByZWZpeGUgPSBzdHJ0b2xvd2VyKCRwcmVmaXhlKTsKCQl9CgkJCgkJJHRoaXMtPmRibmFtZSA9IGNtc19kYl9wcmVmaXgoKS5Pcm1FbnRpdHk6OiRfQ09OU1RfTU9ELidfJy4kcHJlZml4ZS4nXycuJHRoaXMtPmRibmFtZTsKCQkKCQkvLyBXZSBhZGQgYW4gaW5zdGFuY2Ugb2Ygb3VyLXNlcmYgaW50byB0aGUgYXV0b2xvYWQKCQlNeUF1dG9sb2FkOjphZGRJbnN0YW5jZSgkdGhpcy0+bW9kdWxlTmFtZSwkdGhpcyk7Cgl9CgkKICAgIC8qKgogICAgKiAgQ2FuIGJlIG92ZXJyaWRlLiBMZXQgeW91IHNwZWNpZnkgaG93IHlvdXIgdGFibGUgbXVzdCBiZSBwb3B1bGF0ZWQgCiAgICAqIGFmdGVyIHlvdSBhc2tlZCB0byBjcmVhdGUgdGhlIHRhYmxlIG9mIHlvdXIgRW50aXR5CiAgICAqLwoJcHVibGljIGZ1bmN0aW9uIGluaXRUYWJsZSgpe30KICAgIAkKICAgIC8qKgogICAgKiBBZGQgYSBuZXcgRmllbGQgaW50byB0aGUgbGlzdCBvZiBGaWVsZHMKICAgICogCiAgICAqIEBwYXJhbSBPcm1GaWVsZCAkbmV3RmllbGQgdGhlIG9iamVjdCBGaWVsZCB0byBhZGQKICAgICoKICAgICogQHJldHVybiBPcm1FbnRpdHkgdGhlIGN1cnJlbnQgaW5zdGFuY2UKCSogCgkqIEBleGNlcHRpb24gT3JtSWxsZWdhbENvbmZpZ3VyYXRpb25FeGNlcHRpb24gaWYgd2UgdHJ5IHRvIHVzZSBtb3JlIHRoYW4gYSBzaW5nbGUgUHJpbWFyeUtleSBpbiB0aGUgZW50aXR5CiAgICAqLwoJcHJvdGVjdGVkIGZ1bmN0aW9uIGFkZChPcm1GaWVsZCAkbmV3RmllbGQpIHsKCQkKCQkkdGhpcy0+ZmllbGRzWyRuZXdGaWVsZC0+Z2V0TmFtZSgpXSA9ICRuZXdGaWVsZDsKCgkJLy9BZGQgYSBzZXF1ZW5jZSBvbiB0aGUga2V5cwoJCWlmKCRuZXdGaWVsZC0+aXNQcmltYXJ5S0VZKCkpIHsKCQkJCQoJCQkkdGhpcy0+cGtbXSA9ICRuZXdGaWVsZC0+Z2V0TmFtZSgpOwoJCQlpZighJHRoaXMtPmlzQXV0b2luY3JlbWVudCgpKSB7IC8vIG5vIHNlcXVlbmNlIGlmIGF1dG9pbmNyZW1lbnQgdXNlZAogICAgICAgICAgICAgICAgJHRoaXMtPnNlcW5hbWUgPSAkdGhpcy0+ZGJuYW1lLk9ybUVudGl0eTo6JF9DT05TVF9TRVE7CiAgICAgICAgICAgIH0KCQl9CgoKCgkJcmV0dXJuICR0aGlzOwoJfQoJCiAgICAvKioKICAgICogUmV0dXJuIHRoZSBsaXN0IG9mIFByaW1hcnlLZXkgRmllbGQKICAgICogCiAgICAqIEByZXR1cm4gT3JtRmllbGRbXSB0aGUgbGlzdCBvZiBQcmltYXJ5S2V5IEZpZWxkCiAgICAqCiAgICAqIEBleGNlcHRpb24gT3JtSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZXJlIGlzIG5vIFByaW1hcnlLZXkgRmllbGQKICAgICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0UGsoKSB7CgkJaWYoJHRoaXMtPnBrID09IG51bGwpIHsKCQkJdGhyb3cgbmV3IE9ybUlsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidGhlIGVudGl0eSB7JHRoaXMtPmdldE5hbWUoKX0gZG9lc24ndCBoYXZlIGFueSBQcmltYXJ5LUtleSIpOwoJCX0KCQkKICAgICAgICAkbGlzdF9wayA9IGFycmF5KCk7CiAgICAgICAgZm9yZWFjaCgkdGhpcy0+cGsgYXMgJHBrKXsKICAgICAgICAgICAgJGxpc3RfcGtbJHBrXSA9ICR0aGlzLT5maWVsZHNbJHBrXTsKICAgICAgICB9CgkJcmV0dXJuICRsaXN0X3BrOwoJfQoKCS8qKgoJICogUmV0dXJuIHRydWUgaWYgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSBQcmltYXJ5S2V5IAoJICoKCSAqIEByZXR1cm4gYm9vbGVhbiBpZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIFByaW1hcnlLZXkgCgkgKiovCglwdWJsaWMgZnVuY3Rpb24gaGFzQ29tcG9zaXRlS2V5KCl7CgkJaWYoJHRoaXMtPnBrID09IG51bGwpIHsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCQlyZXR1cm4gY291bnQoJHRoaXMtPnBrKSA+IDEgOwoJfQoKCS8qKgoJICogUmV0dXJuIGEgc2VjdXJpemVzIGFncmVnYXRlIGZvciBzaW5nbGUgb3IgY29tcG9zaXRlIFByaW1hcnlLZXkgdG8gbWFrZSBkaXN0aW5jdGlvbiBiZXR3ZWVuIDIgZW50aXR5IG9mIHRoZSBzYW1lIHR5cGUKCSAqCgkgKiBAcmV0dXJuIHN0cmluZyB0aGUgIlByaW1hcnkgVW5pcXVlIElEZW50aWZpZXIiCgkgKgoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0UFVJRCgpewoJCSR2YWxzID0gYXJyYXkoKTsKCQlmb3JlYWNoICgkdGhpcy0+Z2V0UGsoKSBhcyAkcGtuYW1lID0+ICRwaykgewoJCQkkdmFsc1tdID0gJHRoaXMtPmdldCgkcGtuYW1lKTsKCQl9CgkJcmV0dXJuIE9ybVV0aWxzOjpnZW5lcmF0ZVBVSUQoJHZhbHMpOwoJCQoJfQoJCiAgICAvKioKICAgICogUmV0dXJuIHRoZSBsaXN0IG9mIEZpZWxkcwogICAgKiAKICAgICogQHJldHVybiBGaWVsZFtdIGFuIGFycmF5IHdpdGggYWxsIHRoZSBGaWVsZHMKICAgICogCiAgICAqLwoJcHVibGljIGZ1bmN0aW9uIGdldEZpZWxkcygpIHsKCQlyZXR1cm4gJHRoaXMtPmZpZWxkczsKCX0KCQogICAgLyoqCiAgICAqIHJldHVybiBhIEZpZWxkIGJ5IG5hbWUKICAgICogCiAgICAqIEBwYXJhbSBzdHJpbmcgJGZpZWxkTmFtZSB0aGUgZmllbGQgbmFtZQogICAgKiBAcmV0dXJuIE9ybUZpZWxkIHRoZSBGaWVsZAogICAgKiAKICAgICogQGV4Y2VwdGlvbiBPcm1JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgbm8gRmllbGQgZXhpc3QgZm9yIHRoZSBuYW1lCiAgICAqLwoJcHVibGljIGZ1bmN0aW9uIGdldEZpZWxkQnlOYW1lKCRmaWVsZE5hbWUpIHsKCQkKCQlpZihlbXB0eSgkZmllbGROYW1lKSl7CgkJCXRocm93IG5ldyBPcm1JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBmdW5jdGlvbiBnZXRGaWVsZEJ5TmFtZShcJGZpZWxkTmFtZSkgZG9lc24ndCBhY2NlcHQgYSBudWxsIHBhcmFtZXRlciAoZW50aXR5IDogeyR0aGlzLT5nZXROYW1lKCl9KSIpOwoJCX0KCQoJCWlmKCFhcnJheV9LRVlfZXhpc3RzKCRmaWVsZE5hbWUsJHRoaXMtPmZpZWxkcykpewoJCQl0aHJvdyBuZXcgT3JtSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJGdW5jdGlvbiBnZXRGaWVsZEJ5TmFtZShcJGZpZWxkTmFtZSkgOiBUaGUgZmllbGQgeyRmaWVsZE5hbWV9IGRvZXNuJ3QgZXhpc3QgaW50byB0aGUgZW50aXR5IHskdGhpcy0+Z2V0TmFtZSgpfSIpOwoJCX0KCQkKCQlyZXR1cm4gJHRoaXMtPmZpZWxkc1skZmllbGROYW1lXTsKCQkKCX0KCQogICAgLyoqCiAgICAqIFJldHVybiB0cnVlIGlmIGEgRmllbGQgZXhpc3RzIGZvciB0aGUgbmFtZQogICAgKiAKICAgICogQHBhcmFtIHN0cmluZyAkbmFtZSB0aGUgbmFtZQogICAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBpZiBleGlzdHMKICAgICovCglwdWJsaWMgZnVuY3Rpb24gaXNGaWVsZEJ5TmFtZUV4aXN0cygkbmFtZSkgewoJCXJldHVybiBpc3NldCgkdGhpcy0+ZmllbGRzWyRuYW1lXSk7Cgl9CgkKICAgIC8qKgogICAgKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHRhYmxlIGludG8gdGhlIGRhdGFiYXNlCiAgICAqIAogICAgKiBAcmV0dXJuIHN0cmluZyB0aGUgbmFtZSBvZiB0aGUgdGFibGUgaW50byB0aGUgZGF0YWJhc2UKICAgICogCiAgICAqLwoJcHVibGljIGZ1bmN0aW9uIGdldERibmFtZSgpIHsKCQlyZXR1cm4gJHRoaXMtPmRibmFtZTsKCX0KCQogICAgLyoqCiAgICAqIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgZW50aXR5CiAgICAqIAogICAgKiBAcmV0dXJuIHN0cmluZyB0aGUgbmFtZSBvZiB0aGUgZW50aXR5CiAgICAqIAogICAgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXROYW1lKCkgewoJCXJldHVybiAkdGhpcy0+bmFtZTsKCX0KCQoJLyoqCgkgKiAgUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBjdXJyZW50IG1vZHVsZQoJICogIAoJICogIEByZXR1cm4gc3RyaW5nIHRoZSBuYW1lIG9mIHRoZSBjdXJyZW50IG1vZHVsZS4KCSAqKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRNb2R1bGVOYW1lKCkgewoJCXJldHVybiAkdGhpcy0+bW9kdWxlTmFtZTsKCX0KCQogICAgLyoqCiAgICAqIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgc2VxdWVuY2UgKGlmIGV4aXN0cykKICAgICogCiAgICAqIEByZXR1cm4gc3RyaW5nIHRoZSBuYW1lIG9mIHRoZSBzZXF1ZW5jZSBvciBOVUxMCiAgICAqIAogICAgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRTZXFuYW1lKCkgewoJCWlmKGVtcHR5KCR0aGlzLT5zZXFuYW1lKSkKCQkJcmV0dXJuIG51bGw7CgkJCgkJcmV0dXJuICR0aGlzLT5zZXFuYW1lOwoJfQoJCiAgICAvKioKICAgICogUmV0dXJuIHRoZSB2YWx1ZSBmb3IgYSBGaWVsZCBieSB0aGUgbmFtZSAKICAgICogCQogICAgKiBAcGFyYW0gc3RyaW5nICRmaWVsZE5hbWUgdGhlIG5hbWUgb2YgdGhlIEZpZWxkCiAgICAqIEByZXR1cm4gbWl4ZWQgdGhlIHZhbHVlIGZvciB0aGUgZmllbGQKICAgICogCiAgICAqIEBleGNlcHRpb24gT3JtSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIG5vIEZpZWxkIGV4aXN0cyBmb3IgdGhlIG5hbWUKICAgICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0KCRmaWVsZE5hbWUpIHsKCQkKCQlpZihlbXB0eSgkZmllbGROYW1lKSl7CgkJCXRocm93IG5ldyBPcm1JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBmdW5jdGlvbiBnZXQoXCRmaWVsZE5hbWUpIGRvZXNuJ3QgYWNjZXB0IGEgbnVsbCBwYXJhbWV0ZXIgKGVudGl0eSA6IHskdGhpcy0+Z2V0TmFtZSgpfSkiKTsKCQl9CgkKCQlpZighYXJyYXlfS0VZX2V4aXN0cygkZmllbGROYW1lLCR0aGlzLT5maWVsZHMpICYmICFhcnJheV9LRVlfZXhpc3RzKCRmaWVsZE5hbWUsJHRoaXMtPmFsaWFzKSl7CgkJCXRocm93IG5ldyBPcm1JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkZ1bmN0aW9uIGdldChcJGZpZWxkTmFtZSkgOiBUaGUgZmllbGQgeyRmaWVsZE5hbWV9IGRvZXNuJ3QgZXhpc3QgaW50byB0aGUgZW50aXR5IHskdGhpcy0+Z2V0TmFtZSgpfSIpOwoJCX0KCQkKCQlpZighYXJyYXlfS0VZX2V4aXN0cygkZmllbGROYW1lLCR0aGlzLT52YWx1ZXMpKXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJCQoJCXJldHVybiAkdGhpcy0+dmFsdWVzWyRmaWVsZE5hbWVdOwoJfQoJCiAgIC8qKgogICAgKiBTZXQgYSB2YWx1ZSB0byBhIEZpZWxkCiAgICAqICAgICAKICAgICogQHBhcmFtIHN0cmluZyAkZmllbGROYW1lIFRoZSBuYW1lIG9mIHRoZSBGaWVsZAogICAgKiBAcGFyYW0gbWl4ZWQgJHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlIEZpZWxkCiAgICAqIAogICAgKiBAZXhjZXB0aW9uIE9ybUlsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBubyBGaWVsZCBleGlzdHMgZm9yIHRoZSBuYW1lCiAgICAqLwoJcHVibGljIGZ1bmN0aW9uIHNldCgkZmllbGROYW1lLCR2YWx1ZSkgewoJCQoJCWlmKGVtcHR5KCRmaWVsZE5hbWUpKXsKCQkJdGhyb3cgbmV3IE9ybUlsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGZ1bmN0aW9uIHNldChcJGZpZWxkTmFtZSkgZG9lc24ndCBhY2NlcHQgYSBudWxsIHBhcmFtZXRlciAoZW50aXR5IDogeyR0aGlzLT5nZXROYW1lKCl9KSIpOwoJCX0KCQlpZighYXJyYXlfS0VZX2V4aXN0cygkZmllbGROYW1lLCR0aGlzLT5maWVsZHMpICYmICFhcnJheV9LRVlfZXhpc3RzKCRmaWVsZE5hbWUsJHRoaXMtPmFsaWFzKSl7CgkJCXRocm93IG5ldyBPcm1JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkZ1bmN0aW9uIHNldChcJGZpZWxkTmFtZSkgOiBUaGUgZmllbGQgeyRmaWVsZE5hbWV9IGRvZXNuJ3QgZXhpc3QgaW50byB0aGUgZW50aXR5IHskdGhpcy0+Z2V0TmFtZSgpfSIpOwoJCX0KCQkKCQkkdGhpcy0+dmFsdWVzWyRmaWVsZE5hbWVdID0gJHZhbHVlOwoJfQoJCiAgICAvKioKICAgICogUmV0dXJuIHRoZSB2YWx1ZXMgZm9yIGFsbCB0aGUgRmllbGRzIGludG8gYW4gYXNzb2NpYXRpdmUgYXJyYXkgd2l0aCAKICAgICogICoga2V5ID0gbmFtZSBvZiB0aGUgRmllbGQsIGFuZCAKICAgICogICogdmFsdWUgPSBpdHMgdmFsdWUKICAgICogCiAgICAqIEByZXR1cm4gYXJyYXkgYW4gYXNzb2NpYXRpdmUgYXJyYXkKICAgICogCiAgICAqLwoJcHVibGljIGZ1bmN0aW9uIGdldFZhbHVlcygpIHsKCQlyZXR1cm4gJHRoaXMtPnZhbHVlczsKCX0KCQkKCS8qKgoJICogU2hvcnRjdXQgdG8gc2F2ZSB0aGUgZW50aXR5LiBpZiB0aGUgcHJpbWFyeUtleSBpcyBzZXR0ZWQsIGl0IHdpbGwgYmUgYW4gdXBkYXRlIG9wZXJhdGlvbiwgZWxzZSBhbiBpbnNlcnQuCgkgKgoJICogQHJldHVybiB0aGUgZW50aXR5IHNhdmVkIHdpdGggaXRzIG5ldyBuZXcgSWQgKGN1c3RvbWVyX2lkIGluIG15IGV4YW1wbGUpIGlmIGl0J3MgYW4gaW5zZXJ0aW9uCgkgKiovCglwdWJsaWMgZnVuY3Rpb24gc2F2ZSgpewoJCWlmKCR0aGlzLT5wayA9PSBudWxsKSB7CgkJCXRocm93IG5ldyBPcm1JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInlvdSBjYW4ndCBzYXZlIHRoZSBlbnRpdHkgIi4kdGhpcy0+Z2V0TmFtZSgpLiIgYmVjYXVzZSBpdCBkb2Vzbid0IGhhdmUgYW55IFByaW1hcnktS2V5Iik7CgkJfQogICAgICAgIAogICAgICAgICRhc1BrRmlsbGVkID0gdHJ1ZTsKICAgICAgICAkdmFsdWVzID0gJHRoaXMtPmdldFZhbHVlcygpOwoJICAgIGZvcmVhY2goJHRoaXMtPnBrIGFzICRwayl7CiAgICAgICAgICAgIGlmKCFpc3NldCgkdmFsdWVzWyRwa10pIHx8ICR2YWx1ZXNbJHBrXSA9PT0gIiIpewogICAgICAgICAgICAgICAgJGFzUGtGaWxsZWQgPSBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgIH0KCgkJaWYoISRhc1BrRmlsbGVkKSB7CgkJCXJldHVybiBPcm1Db3JlOjppbnNlcnRFbnRpdHkoJHRoaXMpOwoJCX0gZWxzZSB7CgkJCS8vVHJ5IHRvIGZpbmQgaWYgaXQncyBhbiB1cGRhdGUgb3IgaW5zZXJ0IHdpdGggYWxyZWFkeSBhbiBJZAogICAgICAgICAgICAkb3JtRXhhbXBsZSA9IG5ldyBPcm1FeGFtcGxlKCk7CiAgICAgICAgICAgIGZvcmVhY2goJHRoaXMtPnBrIGFzICRwayl7CiAgICAgICAgICAgICAgICAkb3JtRXhhbXBsZS0+YWRkQ3JpdGVyaWEoJHBrLCBPcm1UeXBlQ3JpdGVyaWE6OiRFUSwgYXJyYXkoJHRoaXMtPmdldCgkcGspKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJGxhenltb2RlID0gdHJ1ZTsKICAgICAgICAgICAgJGVudGl0eSA9IE9ybUNvcmU6OmZpbmRCeUV4YW1wbGUoJHRoaXMsICRvcm1FeGFtcGxlLCBudWxsLCBudWxsLCAnQU5EJywgJGxhenltb2RlKTsKCQkJaWYoZW1wdHkoJGVudGl0eSkpIHsKCQkJCXJldHVybiBPcm1Db3JlOjppbnNlcnRFbnRpdHkoJHRoaXMpOwoJCQl9CgkJCQoJCQlyZXR1cm4gT3JtQ29yZTo6dXBkYXRlRW50aXR5KCR0aGlzKTsKCQl9Cgl9CgkKCS8qKgoJICogU2hvcnRjdXQgdG8gZGVsZXRlIHRoZSBlbnRpdHkKCSAqKi8KCXB1YmxpYyBmdW5jdGlvbiBkZWxldGUoKXsKCQlpZigkdGhpcy0+cGsgPT0gbnVsbCkgewoJCQl0aHJvdyBuZXcgT3JtSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ5b3UgY2FuJ3QgZGVsZXRlIHRoZSBlbnRpdHkgIi4kdGhpcy0+Z2V0TmFtZSgpLiIgYmVjYXVzZSBpdCBkb2Vzbid0IGhhdmUgYW55IFByaW1hcnktS2V5Iik7CgkJfQoJCQogICAgICAgICRhc1BrRmlsbGVkID0gdHJ1ZTsKCSAgICBmb3JlYWNoKCR0aGlzLT5wayBhcyAkcGspewogICAgICAgICAgICBpZigkdGhpcy0+Z2V0KCRwaykgPT0gbnVsbCl7CiAgICAgICAgICAgICAgICAkYXNQa0ZpbGxlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgCgkJaWYoISRhc1BrRmlsbGVkKSB7CgkJCXRocm93IG5ldyBPcm1JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInlvdSBjYW4ndCBkZWxldGUgdGhlIGVudGl0eSAiLiR0aGlzLT5nZXROYW1lKCkuIiBiZWNhdXNlIGF0IGxhc3Qgb25lIG9mIGl0cyBQcmltYXJ5LUtleSBkb2Vzbid0IGhhdmUgYW55IHZhbHVlIik7CgkJfQoJCQogICAgICAgICRvcm1FeGFtcGxlID0gbmV3IE9ybUV4YW1wbGUoKTsKICAgICAgICBmb3JlYWNoKCR0aGlzLT5wayBhcyAkcGspewogICAgICAgICAgICAkb3JtRXhhbXBsZS0+YWRkQ3JpdGVyaWEoJHBrLCBPcm1UeXBlQ3JpdGVyaWE6OiRFUSwgYXJyYXkoJHRoaXMtPmdldCgkcGspKSk7CiAgICAgICAgfQogICAgICAgICRlbnRpdHkgPSBPcm1Db3JlOjpkZWxldGVCeUV4YW1wbGUoJHRoaXMsICRvcm1FeGFtcGxlKTsKCX0KCQogICAgLyoqCiAgICAqIENhbiBiZSBvdmVycmlkZGVuIExldCB5b3UgbW9kaWZ5IHNvbWUgZGF0YSBqdXN0IGJlZm9yZSBzYXZpbmcgdGhlIGRhdGEgaW50byB0aGUgZGF0YXRhYmxlLgogICAgKiAKICAgICogQHBhcmFtIG1peGVkW10gJHJvd3MgYWxsIHRoZSB2YWx1ZXMgdG8gcHJvY2VzcwogICAgKiBAcGFyYW0gbWl4ZWRbXSAkYXJncyBbb3B0aW9uYWxdIG1vcmUgcGFyYW1ldGVycyBpZiB5b3UgbmVlZCwgaWYgeW91IHdhbnQKICAgICogCiAgICAqIEByZXR1cm4gbWl4ZWQgdG8gZGVmaW5lCiAgICAqLwoJcHVibGljIGZ1bmN0aW9uIHByb2Nlc3NWYWx1ZUZvclNhdmUoJHJvd3MsICRhcmdzID0gbnVsbCl7CgkKCQlyZXR1cm4gJHJvd3M7Cgl9CgkKCS8qKgoJICogQ2FsbCB0aGUgY29tcGFyZVRvIGZ1bmN0aW9uIGludG8geW91ciBFbnRpdHkgdG8gc29ydCB0aGUgRW50aXRpZXMuCgkgKiBUbyBhY3RpdmF0ZSB0aGlzIGZ1bmN0aW9uYWxpdHksIFRoZSBFbnRpdHkgbXVzdCBpbXBsZW1lbnQgSVNvcnRhYmxlIEludGVyZmFjZS4KCSAqCgkgKiBFeGFtcGxlIG9mIGZ1bmN0aW9uIGNvbXBhcmVUbygpIGluIGEgQ3VzdG9tZXIgRW50aXR5CgkgKiAgPGNvZGU+CgkgKiAgICAgICAKCSAqCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY29tcGFyZVRvKE9ybUVudGl0eSAkZW50aXR5MSwgT3JtRW50aXR5ICRlbnRpdHkyKQoJICoJewoJICoJCSRjb21wYXJlID0gc3RyY21wKCRlbnRpdHkxLT5nZXQoJ25hbWUnKSwgJGVudGl0eTItPmdldCgnbmFtZScpKTsKCSAqICAgICAgCXJldHVybiAkY29tcGFyZTsKCSAqCX0KCSAqIAoJICogIDwvY29kZT4KCSAqCgkgKiBAcGFyYW0gT3JtRW50aXR5W10gJGFycmF5IHRoZSBsaXN0IG9mIEVudGl0eSB0byBzb3J0CgkgKgoJICogQHJldHVybiBPcm1FbnRpdHlbXSB0aGUgbGlzdCBvZiBFbnRpdHkgZ3JhY2VmdWxseSBzb3J0ZWQKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzb3J0KGFycmF5ICRhcnJheSkgewoKCQl1c29ydCgkYXJyYXksIGFycmF5KGdldF9jYWxsZWRfY2xhc3MoKSwgImNvbXBhcmVUbyIpKTsKCQoJCXJldHVybiAkYXJyYXk7Cgl9CgkKCS8qKgoJICogTWF5IGJlIG92ZXJyaWRlIGluIHlvdXIgRW50aXR5J3MgZGVmaW5pdGlvbiB0byBhbGxvdyBTZWFyY2ggbW9kdWxlIGluZGV4aW5nIHlvdXIgZW50aXRpZXMncyBkYXRhCgkgKiAKCSAqIEV4YW1wbGUgb2YgZnVuY3Rpb24gaXNJbmRleGFibGUoKSBpbiBhIEN1c3RvbWVyIEVudGl0eQoJICogIAoJICogIDxjb2RlPgoJICogICAgICAgCgkgKglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGlzSW5kZXhhYmxlKCkKCSAqCXsKCSAqCQlyZXR1cm4gdGhpcy0+Z2V0Wydpc0FjdGl2YXRlZCddOwoJICoJfQoJICogCgkgKiAgPC9jb2RlPgoJICoKCSAqIEByZXR1cm4gYm9vbGVhbiBmYWxzZSBieSBkZWZhdWx0CgkgKiovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGlzSW5kZXhhYmxlKCl7CgkJcmV0dXJuIGZhbHNlOwoJfQoKCS8qKgogICAgKiBnZXR0ZXIgZm9yIGF1dG9pbmNyZW1lbnQKICAgICogCiAgICAqIEByZXR1cm4gYm9vbGVhbiB0cnVlIG9mIHRoZSBGaWVsZCBpcyBhdXRvaW5jcmVtZW50CiAgICAqLwoJcHVibGljIGZ1bmN0aW9uIElzQXV0b2luY3JlbWVudCgpIHsKCQlyZXR1cm4gJHRoaXMtPmF1dG9pbmNyZW1lbnQ7Cgl9CgkKCS8qKgoJICogVGhpcyBmdW5jdGlvbiB3aWxsIGxldCB5b3UgZGVmaW5lIHNvbWUgb3B0aW9uYWwgY29uZmlndXJhdGlvbiBmb3IgeW91ciBFbnRpdHkKCSAqICAgID0+IHRoZSBmaWVsZCBtdXN0IGJlIGF1dG8taW5jcmVtZW50YWwKICAgICAqCiAgICAgKiBAcmV0dXJuIE9ybUVudGl0eSB0aGUgY3VycmVudCBpbnN0YW5jZQogICAgICoKCSAqKi8KCXB1YmxpYyBmdW5jdGlvbiBnYXJuaXNoQXV0b2luY3JlbWVudCgpewoJCQogICAgICAgICRhc1BrSW50ZWdlciA9IGZhbHNlOwoJICAgIGZvcmVhY2goJHRoaXMtPnBrIGFzICRwayl7CiAgICAgICAgICAgICRmaWVsZCA9ICR0aGlzLT5nZXRGaWVsZEJ5TmFtZSgkcGspOwogICAgICAgICAgICBpZigkZmllbGQtPmdldFR5cGUoKSA9PSBPcm1DQVNUOjokSU5URUdFUil7CiAgICAgICAgICAgICAgICAkYXNQa0ludGVnZXIgPSB0cnVlOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgCgkJaWYoISRhc1BrSW50ZWdlcil7CgkJCXRocm93IG5ldyBPcm1JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImVudGl0eSAiLiR0aGlzLT5nZXROYW1lKCkuIiBkb24ndCBoYXZlIGFueSBJTlRFR0VSIFBLIGFuZCBzbyBjYW4ndCBiZSBkZWZpbmVkIGF1dG9pbmNyZW1lbnQiKTsKCQl9CiAgICAgICAgCgkJJHRoaXMtPmF1dG9pbmNyZW1lbnQgPSB0cnVlOwoJCQoJCS8vUmVtb3ZlIGFueSBzZXEgdGhhdCBjb3VsZCBiZSBhZGQgYmVmb3JlCiAgICAgICAgJHRoaXMtPnNlcW5hbWUgPSBudWxsOwoKICAgICAgICByZXR1cm4gJHRoaXM7Cgl9CgkKCS8qKgoJICogUmV0dXJuIAoJICogQHJldHVybiBzdHJpbmdbXSA6IHRoZSBsaXN0IG9mIGNvdXBsZSBvZiB1bmlxdWUgaW5kZXgKCSAqKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRJbmRleGVzKCkgewoJCXJldHVybiAkdGhpcy0+aW5kZXhlczsKCX0KCQoJLyoqCgkgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgbGV0IHlvdSBkZWZpbmUgc29tZSBvcHRpb25hbCBjb25maWd1cmF0aW9uIGZvciB5b3VyIEVudGl0eQoJICogICAgPT4gdGhlIGZpZWxkIGhhdmUgb25lIG9yIG1hbnkgKFVuaXF1ZT8pIEluZGV4ZSBvbiBvbmUgb3IgbWFueSBjb2x1bW5zLgoJICoKCSAqICBleGFtcGxlIDogCgkgKiAgPGNvZGU+CgkgKiAgICAgbXlFbnRpdHktPmFkZEluZGV4ZXMoJ2ZpZWxkMScsdHJ1ZSk7CgkgKiAgICAgbXlFbnRpdHktPmFkZEluZGV4ZXMoYXJyYXkoJ2ZpZWxkMicsICdmaWVsZDMnKSk7CgkgKiAgPGNvZGU+CgkgKiAgd2lsbCBjcmVhdGUgMSB1bmlxdWUgaW5kZXggb24gZmllbGQxIGFuZCAxIGluZGV4IG9uIGZpZWxkMixmaWVsZDMKCSAqCgkgKiBAcGFyYW0gbWl4ZWQgJGZpZWxkTmFtZXMgT25lIChzdHJpbmcpIG9yIG1hbnkgKGFycmF5KSBuYW1lIG9mIGZpZWxkIHRvIGJlIGluZGV4aW5nCgkgKiBAcGFyYW0gYm9vbGVhbiAkaXNVbmlxdWUgW29wdGlvbmFsXSBpZiB0aGUgaW5kZXggbXVzdCBiZSBVTklRVUUgKGRlZmF1bHQgPSBmYWxzZSkgCgkgKgogICAgICogQHJldHVybiBPcm1FbnRpdHkgdGhlIGN1cnJlbnQgaW5zdGFuY2UKCSAqCgkgKiovCglwdWJsaWMgZnVuY3Rpb24gYWRkSW5kZXhlcygkZmllbGROYW1lcywgJGlzVW5pcXVlID0gZmFsc2UpewoJCQoJCWlmKCFpc19hcnJheSgkZmllbGROYW1lcykpewoJCQkkZmllbGROYW1lcyA9IGFycmF5KCRmaWVsZE5hbWVzKTsKCQl9CgkJCgkJLy9UZXN0IHRoZSBleGlzdGVuY2Ugb2YgZWFjaCBtZW1iZXIKCQlmb3JlYWNoKCRmaWVsZE5hbWVzIGFzICRmaWVsZE5hbWUpewoJCQlpZighJHRoaXMtPmlzRmllbGRCeU5hbWVFeGlzdHMoJGZpZWxkTmFtZSkpewoJCQkJdGhyb3cgbmV3IE9ybUlsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiYWRkSW5kZXhlcyhcJGZpZWxkTmFtZXMsIFwkaXNVbmlxdWU9ZmFsc2UpIDogeyRmaWVsZE5hbWVzfSBpcyBub3QgYSBleGlzdGluZyBGaWVsZCBvZiB0aGUgRW50aXR5IHskdGhpcy0+Z2V0TmFtZSgpfSIpOwoJCQl9CgkJfQoJCgkJJHRoaXMtPmluZGV4ZXNbXSA9IGFycmF5KCdmaWVsZHMnID0+ICRmaWVsZE5hbWVzLCAndW5pcXVlJyA9PiAkaXNVbmlxdWUpOwoKCQlyZXR1cm4gJHRoaXM7Cgl9CgkKCS8qKgoJICogVGhpcyBmdW5jdGlvbiB3aWxsIGxldCB5b3UgZGVmaW5lIHNvbWUgb3B0aW9uYWwgY29uZmlndXJhdGlvbiBmb3IgeW91ciBFbnRpdHkKCSAqICAgID0+IHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBmaWVsZCBpcyAuLi4KCSAqCgkgKiAgZXggOiBteUVudGl0eS0+Z2FybmlzaERlZmF1bHRWYWx1ZSgnZmllbGQxJywgJ3NvbWUgdGV4dCcpCgkgKgoJICogQHBhcmFtIHN0cmluZyAkZmllbGROYW1lIHRoZSBuYW1lIG9mIHRoZSBGaWVsZAoJICogQHBhcmFtIG1peGVkICRkZWZhdWx0VmFsdWUgdGhlIGRlZmF1bHQgdmFsdWUuCgkgKgogICAgICogQHJldHVybiBPcm1FbnRpdHkgdGhlIGN1cnJlbnQgaW5zdGFuY2UKCSAqCgkgKiovCglwdWJsaWMgZnVuY3Rpb24gZ2FybmlzaERlZmF1bHRWYWx1ZSgkZmllbGROYW1lLCAkZGVmYXVsdFZhbHVlKXsKCQlpZighJHRoaXMtPmlzRmllbGRCeU5hbWVFeGlzdHMoJGZpZWxkTmFtZSkpewoJCQl0aHJvdyBuZXcgT3JtSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJnYXJuaXNoRGVmYXVsdCgpIG9ubHkgYWNjZXB0IHZhbGlkIEZpZWxkIGJ1dCAiLiRmaWVsZE5hbWUuIiBpcyBub3QgYSBleGlzdGluZyBGaWVsZCBpbiB0aGUgRW50aXR5ICIuJHRoaXMtPmdldE5hbWUoKSk7CgkJfQoJCQoJCS8vZm9yYmlkIGEgZGVmYXVsdCB2YWx1ZSBvbiBhIG51bGxhYmxlIGZpZWxkIEJlY2F1c2UgaXQncyBtYWtlIG5vIHNlbnNlCgkJaWYoJHRoaXMtPmdldEZpZWxkQnlOYW1lKCRmaWVsZE5hbWUpLT5pc051bGxhYmxlKCkpewoJCQl0aHJvdyBuZXcgT3JtSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ0aGUgRmllbGQgIi4kZmllbGROYW1lLiIgaW4gdGhlIEVudGl0eSAiLiR0aGlzLT5nZXROYW1lKCkuIiBjYW4ndCBhY2NlcHQgYSBkZWZhdWx0IHZhbHVlIGJlY2F1c2UgaXQncyBzZXR0ZWQgTnVsbGFibGUiKTsKCQl9CgkJCgkJJHRoaXMtPmdldEZpZWxkQnlOYW1lKCRmaWVsZE5hbWUpLT5zZXREZWZhdWx0VmFsdWUoJGRlZmF1bHRWYWx1ZSk7CgoJCXJldHVybiAkdGhpczsKCQkKCX0KCQoJLyoqCgkgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgbGV0IHlvdSBkZWZpbmUgc29tZSBvcHRpb25hbCBjb25maWd1cmF0aW9uIGZvciB5b3VyIEVudGl0eQoJICogICAgPT4gdGhlIGRlZmF1bHQgc29ydCBvcmRlciBpcyAuLi4KCSAqCgkgKiAgZXggOiBteUVudGl0eS0+Z2FybmlzaERlZmF1bHRPcmRlckJ5KG5ldyBPcm1PcmRlckJ5KCktPmFkZEFzYygnZmllbGQxJyktPmFkZERlc2MoJ2ZpZWxkMicpKQoJICoKCSAqIEBwYXJhbSBPcm1vcmRlckJ5ICRkZWZhdWx0T3JkZXJCeSB0aGUgZGVmYXVsdCBzb3J0IG9yZGVyLgoJICoKICAgICAqIEByZXR1cm4gT3JtRW50aXR5IHRoZSBjdXJyZW50IGluc3RhbmNlCgkgKgoJICoqLwoJcHVibGljIGZ1bmN0aW9uIGdhcm5pc2hEZWZhdWx0T3JkZXJCeShPcm1PcmRlckJ5ICRkZWZhdWx0T3JkZXJCeSl7CgkJZm9yZWFjaCgkZGVmYXVsdE9yZGVyQnkgYXMgJGZpZWxkTmFtZSA9PiAkdmFsdWUpIHsKCQkJaWYoISR0aGlzLT5pc0ZpZWxkQnlOYW1lRXhpc3RzKCRmaWVsZE5hbWUpKXsKCQkJCXRocm93IG5ldyBPcm1JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImdhcm5pc2hEZWZhdWx0T3JkZXJCeSgpIG9ubHkgYWNjZXB0IHZhbGlkIEZpZWxkIGJ1dCAiLiRmaWVsZE5hbWUuIiBpcyBub3QgYSBleGlzdGluZyBGaWVsZCBpbiB0aGUgRW50aXR5ICIuJHRoaXMtPmdldE5hbWUoKSk7CgkJCX0KCQl9CgkJJHRoaXMtPmRlZmF1bHRPcmRlckJ5ID0gJGRlZmF1bHRPcmRlckJ5OwoKCQlyZXR1cm4gJHRoaXM7Cgl9CgkKCS8qKgoJICogUmV0dXJuIHRoZSBkZWZhdWx0IG9yZGVyQnkgb2JqZWN0IGZvciB0aGUgZW50aXR5CgkgKiBAcmV0dXJuIE9ybU9yZGVyQnkgOiBkZWZhdWx0IE9ybU9yZGVyQnkKCSAqKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXREZWZhdWx0T3JkZXJCeSgpIHsKCQlyZXR1cm4gJHRoaXMtPmRlZmF1bHRPcmRlckJ5OwoJfQoKCS8qKgoJICogQWRkIGEgYWxpYXMsIHZlcnkgdXNlZnVsIGZvciBlbnRpdHkgd2l0aCAyKyBGSyBwb2ludGluZyBvbiB0aGUgc2FtZSBlbnRpdHkgd2l0aCBhIGNvbXBvc2l0ZSBwcmltYXJ5IGtleQoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJGFsaWFzTmFtZSB0aGUgbmFtZSBvZiB0aGUgYWxpYXMKCSAqIEBwYXJhbSBzdHJpbmdbXSAkcG9pbnRlcnMgdGhlIGxpc3RlIG9mIGZpZWxkbmFtZSBmb3IgdGhlIHNob3J0Y3V0CgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBhZGRBbGlhcygkYWxpYXNOYW1lLCBhcnJheSAkcG9pbnRlcnMpewoJCSR0aGlzLT5hbGlhc1skYWxpYXNOYW1lXSA9ICRwb2ludGVyczsKCX0KCgkvKioKCSAqIGdldHRlciBmb3IgZmllbGQgYWxpYXMKCSAqCgkgKiBAcmV0dXJuIHN0cmluZ1tdIAoJICoqLwoJcHVibGljIGZ1bmN0aW9uIGdldEFsaWFzKCl7CgkJcmV0dXJuICR0aGlzLT5hbGlhczsKCX0KCQp9Cgo/Pgo=]]></data>
	</file>
	<file>
	  <filename>/lib/class.OrmEntityAssociation.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIENvbnRhaW5zIE9ybUVudGl0eUFzc29jaWF0aW9uIENsYXNzIHdoaWNoIGV4dGVuZHMgT3JtRW50aXR5IGNsYXNzCiAqCiAqIEBzaW5jZSAwLjAuMQogKiBAYXV0aG9yIEJlc3MKICoqLwogCi8qKgogKiBBYnN0cmFjdCBDbGFzcyB3aGljaCBkZXNjcmliZXMgdGhlIHByb3BlcnRpZXMgZm9yIGFuIEFzc29jaWF0aXZlIEVudGl0eQogKiAgICAKICoKICogQHNpbmNlIDAuMC4xCiAqIEBhdXRob3IgQmVzcwogKiBAcGFja2FnZSBPcm0KICoqLwphYnN0cmFjdCBjbGFzcyBPcm1FbnRpdHlBc3NvY2lhdGlvbiBleHRlbmRzIE9ybUVudGl0eSAKewogICAgLyoqCiAgICAgKiBJbm5lciBjb3VudGVyIGZvciB0aGUgbnVtYmVyIG9mIGZpZWxkcwogICAgICoqLwoJcHJpdmF0ZSAkbmJGaWVsZCA9IDA7CgogICAgLyoqCiAgICAgKiBjb25zdHJ1Y3RvciBwcm90ZWN0ZWQgdG8gYXZvaWQgYSBkaXJlY3QgaW5zdGFudGlhdGlvbiBsaWtlICJuZXcgT3JtRW50aXR5QXNzb2NpYXRpb24oKSIKICAgICAqIEVhY2ggdGltZSBhIGVudGl0eSBpcyBjb25zdHJ1Y3RlZCwgd2UgcGxhY2UgYSBjb3B5IGludG8gdGhlIGF1dG9sb2FkZXIuCiAgICAgKiAKICAgICAqIEBwYXJhbSBzdHJpbmcgJG1vZHVsZU5hbWUgVGhlIG5hbWUgb2YgdGhlIG1vZHVsZSB3aG8gY2FsbGluZyB0aGlzIG1ldGhvZCAoc28gbm90ICJPcm0iKQogICAgICogQHBhcmFtIHN0cmluZyAkbmFtZSBUaGUgbmFtZSBvZiB0aGUgZW50aXR5CiAgICAgKiBAcGFyYW0gc3RyaW5nICRwcmVmaXhlIFtvcHRpb25hbF0gUHJlZml4IHRvIHVzZSBpbnRvIGRhdGFiYXNlIGZvciB0YWJsZS4gSWYgbm90IHNldHRlZCwgaXQgd2lsbCB1c2UgdGhlIG5hbWUgb2YgeW91ciBtb2R1bGUKICAgICAqIEBwYXJhbSBzdHJpbmcgJGRiTmFtZSBbb3B0aW9uYWxdIFRoZSBuYW1lIG9mIHRhYmxlIGZvciB0aGlzIGVudGl0eS4gSWYgbm90IHNldHRlZCwgaXQgd2lsbCB1c2UgdGhlIG5hbWUgb2YgeW91ciBlbnRpdHkKICAgICAqCiAgICAgKiBAcmV0dXJuIE9ybUVudGl0eUFzc29jaWF0aW9uIHRoZSBlbnRpdHkgYXMgYSBuZXcgaW5zdGFuY2UKICAgICAqIAogICAgICogQHNlZSBNeUF1dG9sb2FkCiAgICAgKi8KCXByb3RlY3RlZCBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkbW9kdWxlTmFtZSwgJG5hbWUsJHByZWZpeGUgPSBudWxsLCAkZGJOYW1lID0gbnVsbCkKCXsKCQlwYXJlbnQ6Ol9fY29uc3RydWN0KCRtb2R1bGVOYW1lLCAkbmFtZSwgJHByZWZpeGUsICRkYk5hbWUpOwoJfQoJCiAgICAvKioKICAgICogQWRkIGEgbmV3IEZpZWxkCiAgICAqIAogICAgKiBDdXJyZW50bHksIHRoZSBPcm0gU3lzdGVtIGRvZW4ndCBhbGxvdyBtb3JlIHRoYW4gdHdvIEZpZWxkIGZvciBhbiBFbnRpdHlBc3NvY2lhdGlvbgogICAgKiAKICAgICogQHBhcmFtIE9ybUZpZWxkICRuZXdGaWVsZCB0aGUgRmllbGQgdG8gYWRkLgoJKgoJKiBAZXhjZXB0aW9uIE9ybUlsbGVnYWxDb25maWd1cmF0aW9uRXhjZXB0aW9uIGlmIHdlIHRyeSB0byB1c2UgbW9yZSB0aGFuIHR3byBGaWVsZHMgaW4gdGhlIGVudGl0eQogICAgKi8KCXByb3RlY3RlZCBmdW5jdGlvbiBhZGQoT3JtRmllbGQgJG5ld0ZpZWxkKQoJewoJCSR0aGlzLT5uYkZpZWxkICsrOwoJCQoJCWlmKCR0aGlzLT5uYkZpZWxkID4gMikKCQkJdGhyb3cgbmV3IE9ybUlsbGVnYWxDb25maWd1cmF0aW9uRXhjZXB0aW9uICgiSXQncyBpbXBvc3NpYmxlIHRvIHVzZSBtb3JlIHRoYW4gdHdvIEZpZWxkIGluIHRoZSBFbnRpdHlBc3NvY2lhdGlvbiAiLiAkdGhpcy0+Z2V0TmFtZSgpKTsKCQkJCQoJCXBhcmVudDo6YWRkKCRuZXdGaWVsZCk7Cgl9Cgp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/class.OrmExample.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIENvbnRhaW5zIE9ybUV4YW1wbGUgQ2xhc3MKICoKICogQHNpbmNlIDAuMC4xCiAqIEBhdXRob3IgQmVzcwogKiovCiAKIAovKioKICogUmVwcmVzZW50cyBhIGdyb3VwIG9mIGRpZmZlcmVudCBPcm1Dcml0ZXJpYSAoQ3JpdGVyaWFzKSB0byBwcm9jZXNzIGEgc2VhcmNoICJCeSBFeGFtcGxlIiBvbiBhIE9ybUVudGl0eSBpbiBEYXRhYmFzZQogKgogKiBAc2luY2UgMC4wLjEKICogQGF1dGhvciBCZXNzCiAqIEBwYWNrYWdlIE9ybQogKiovCmNsYXNzIE9ybUV4YW1wbGUgewoKICAgIC8qKgogICAgKiBUaGUgaW5uZXIgbGlzdCBvZiBDcml0ZXJpYXMKICAgICoqLwoJcHJpdmF0ZSAkY3JpdGVyaWFzID0gYXJyYXkoKTsKCQogICAgLyoqCiAgICAqIFB1YmxpYyBDb25zdHJ1Y3RvcgogICAgKi8KCXB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgpIHsKCX0KCQogICAgCiAgICAvKioKICAgICogQWRkIGEgbmV3IENyaXRlcmlhIG9uIHRoZSBleGlzdGluZyBsaXN0CiAgICAqIAogICAgKiBAcGFyYW0gc3RyaW5nICRmaWVsZG5hbWUgTmFtZSBvZiB0aGUgZmllbGQgCiAgICAqIEBwYXJhbSBzdHJpbmcgJHR5cGVDcml0ZXJpYSBUeXBlIG9mIENyaXRlcmlhCiAgICAqIEBwYXJhbSBtaXhlZFtdICRwYXJhbXNDcml0ZXJpYSBhbGwgdGhlIHBhcmFtZXRlcnMgdXNlZCBmb3IgdGhlIHBhcmFtZXRlciAkdHlwZUNyaXRlcmlhCiAgICAqIEBwYXJhbSBib29sZWFuICRpZ25vcmVDYXNlIFtPcHRpb25hbF0gaWYgd2UgbXVzdCBpZ25vcmUgdGhlIGNhc2UgKGF6ZSBlcXVhbHMgQVpFKSBvciBub3QuIERlZmF1bHQgdmFsdWUgaXMgImZhbHNlIgogICAgKiAKICAgICogQHNlZSBPcm1UeXBlQ3JpdGVyaWEKICAgICovCglwdWJsaWMgZnVuY3Rpb24gYWRkQ3JpdGVyaWEoJGZpZWxkbmFtZSwgJHR5cGVDcml0ZXJpYSwgJHBhcmFtc0NyaXRlcmlhLCAkaWdub3JlQ2FzZSA9IGZhbHNlKSB7CgkJaWYoIWlzX2FycmF5KCRwYXJhbXNDcml0ZXJpYSkpIHsKCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbigidGhlIHBhcmFtZXRlciBcJHBhcmFtc0NyaXRlcmlhIGZvciB0aGUgQ3JpdGVyaWEgb2YgdGhlIEZpZWxkIFsiLiRmaWVsZG5hbWUuIl0gbXVzdCBiZSBhbiBhcnJheSIpOwoJCX0KCQkKCQkkdGhpcy0+Y3JpdGVyaWFzW10gPSBuZXcgT3JtQ3JpdGVyaWEoJGZpZWxkbmFtZSwgJHR5cGVDcml0ZXJpYSwgJHBhcmFtc0NyaXRlcmlhLCAkaWdub3JlQ2FzZSk7Cgl9CgogICAgLyoqCiAgICAqIFJldHVybiBhbGwgdGhlIENyaXRlcmlhcyBjb250YWluZWQgaW4gdGhlIGN1cnJlbnQgRXhhbXBsZSBPYmplY3QKICAgICogCiAgICAqIEByZXR1cm4gQ3JpdGVyaWFbXSB0aGUgbGlzdCBvZiBDcml0ZXJpYXMgY29udGFpbmVkIGluIHRoZSBjdXJyZW50IEV4YW1wbGUgT2JqZWN0CiAgICAqLwoJcHVibGljIGZ1bmN0aW9uIGdldENyaXRlcmlhcygpewoJCXJldHVybiAkdGhpcy0+Y3JpdGVyaWFzOwoJfQp9Cgo/Pgo=]]></data>
	</file>
	<file>
	  <filename>/lib/class.OrmField.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIENvbnRhaW5zIHRoZSBjbGFzcyBPcm1GaWVsZAogKgogKiBAc2luY2UgMC4wLjEKICogQGF1dGhvciBCZXNzCiAqKi8KIAovKioKICogICBSZXByZXNlbnQgYSBPcm1FbnRpdHkncyBmaWVsZCB3aXRoIGFsbCBpdHMgcHJvcGVydGllcwogKgogKiBAc2luY2UgMC4wLjEKICogQGF1dGhvciBCZXNzCiAqIEBwYWNrYWdlIE9ybQogKiovCmNsYXNzIE9ybUZpZWxkIAp7CgkvKioKCSAqIFRoZSAodW5pcXVlKSBuYW1lIG9mIHRoZSBmaWVsZAoJICovCglwcml2YXRlICRuYW1lOwoJCgkvKioKCSAqIFRoZSBPcm1DQVNUIHZhbHVlIG9mIHRoZSBmaWVsZAoJICovCglwcml2YXRlICR0eXBlOwoJCgkvKioKCSAqIFRoZSBtYXggc2l6ZSBvZiB0aGUgZmllbGQuIE1heSBiZSBudWxsIGlmICR0eXBlIGlzIERhdGUsIFRpbWUsIEJ1ZmZlciwgTm9uZSAuLi4KCSAqLwoJcHJpdmF0ZSAkc2l6ZTsKCQoJLyoqCgkgKiBCb29sZWFuIDogdHJ1ZSBpZiB0aGUgdmFsdWUgbWF5IGJlIE5VTEwKCSAqLwoJcHJpdmF0ZSAkbnVsbGFibGU7CgkKCS8qKgoJICogdGhlIE9ybUtFWSB2YWx1ZSBvZiB0aGUgZmllbGQuIE1heSBiZSBudWxsCgkgKi8KCXByaXZhdGUgJEtFWTsKCQoJLyoqCgkgKiB0aGUgbmFtZSBvZiB0aGUga2V5LiBPbmx5IHVzZWQgZm9yIEZvcmVpZ25LZXkgYW5kIEFzc29jaWF0ZUtleQoJICovCglwcml2YXRlICRLRVlOYW1lOwoJCgkvKioKCSAqIFRoZSBkZWZhdWx0IHZhbHVlLiBOb3QgdXNlZCBieSBkZWZhdWx0LgoJICoqLwoJcHJpdmF0ZSAkZGVmYXVsdFZhbHVlOwoJCiAgICAvKioKICAgICogcHVibGljIGNvbnN0cnVjdG9yCiAgICAqIAkKICAgICogQHBhcmFtIHN0cmluZyAkZmllbGRuYW1lIHRoZSAodW5pcXVlKSBuYW1lIG9mIHRoZSBmaWVsZAogICAgKiBAcGFyYW0gT3JtQ0FTVCAkY2FzdCBUaGUgT3JtQ0FTVCB2YWx1ZSBvZiB0aGUgZmllbGQgZXhhbXBsZSA6IE9ybU9ybUNBU1Q6OiRJTlRFR0VSCiAgICAqIEBwYXJhbSBpbnQgJHNpemUgVGhlIG1heCBzaXplIG9mIHRoZSBmaWVsZC4gTWF5IGJlIG51bGwgaWYgJHR5cGUgaXMgRGF0ZSwgVGltZSwgQnVmZmVyLCBOb25lIC4uLgogICAgKiBAcGFyYW0gYm9vbGVhbiAkbnVsbGFibGUgdHJ1ZSBpZiB0aGUgdmFsdWUgbWF5IGJlIE5VTEwuIERlZmF1bHQgdmFsdWUgaXMgZmFsc2UKICAgICogQHBhcmFtIE9ybUtFWSAkS0VZIHRoZSBLRVkgdmFsdWUgb2YgdGhlIGZpZWxkLiBNYXkgYmUgbnVsbCBleGFtcGxlOiBPcm1LRVk6OiRQSyBmb3IgYSBwcmltYXJ5IGtleQogICAgKiBAcGFyYW0gc3RyaW5nICRLRVlOYW1lIHRoZSBuYW1lIG9mIHRoZSBrZXkuIE9ubHkgdXNlZCBmb3IgRm9yZWlnbktleSBhbmQgQXNzb2NpYXRlS2V5IGV4YW1wbGUgOiAiQ3VzdG9tZXIuY3VzdG9tZXJfaWQiIGluIHRoZSBmaWVsZCAiY3VzdG9tZXIiIG9mIGFuIGVudGl0eSAiT3JkZXIiLgogICAgKiAKICAgICogQHJldHVybiBPcm1GaWVsZCB0aGUgRmllbGQgT2JqZWN0CiAgICAqIAogICAgKiAKICAgICogQHNlZSBPcm1DQVNUCiAgICAqIEBzZWUgT3JtS0VZCgkqIEBzZWUgT3JtRW50aXR5CiAgICAqIAogICAgKi8KCXB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkZmllbGRuYW1lLCAkY2FzdCwgJHNpemUgPSBudWxsLCAkbnVsbGFibGUgPSBmYWxzZSwgJEtFWSA9IG51bGwsICRLRVlOYW1lPW51bGwpIHsKCQkKCQkkZXJyb3JzID0gYXJyYXkoKTsKCgkJaWYoZW1wdHkoJEtFWSkgJiYgIWVtcHR5KCRLRVlOYW1lKSkgewoJCQkkZXJyb3JzW10gPSAnSW1wb3NzaWJsZSB0byBzcGVjaWZ5IGEga2V5TmFtZSBwYXJhbWV0ZXIgZm9yIHRoZSBmaWVsZCAnLiRmaWVsZG5hbWUuJyBpZiB0aGUga2V5IGlzIG5vdCAkRksgb3IgJEFLJzsKCQl9CgkJaWYoJEtFWSA9PSBPcm1LRVk6OiRQSyAmJiAhZW1wdHkoJEtFWU5hbWUpKSB7CgkJCSRlcnJvcnNbXSA9ICdJbXBvc3NpYmxlIHRvIHNwZWNpZnkgYSBrZXlOYW1lIHBhcmFtZXRlciBmb3IgdGhlIGZpZWxkICcuJGZpZWxkbmFtZS4nIGlmIHRoZSBrZXkgaXMgbm90ICRGSyBvciAkQUsnOwoJCX0KCQlpZigoJEtFWSA9PSBPcm1LRVk6OiRGSyB8fCAkS0VZID09IE9ybUtFWTo6JEFLKSAmJiBlbXB0eSgkS0VZTmFtZSkpIHsKCQkJJGVycm9yc1tdID0gJyRGSyBrZXkgb3IgJEFLIGtleSBmb3IgdGhlIGZpZWxkICcuJGZpZWxkbmFtZS4nIG5lZWQgYSBrZXlOYW1lJzsKCQl9CgoJCWlmKCgkY2FzdCA9PSBPcm1DQVNUOjokSU5IRVJJVCkgJiYgISgkS0VZID09IE9ybUtFWTo6JEZLIHx8ICRLRVkgPT0gT3JtS0VZOjokQUspKSB7CgkJCSRlcnJvcnNbXSA9ICckSU5IRVJJVCBjYXN0IGlzIG9ubHkgbWFkZSBmb3IgYSAkRksga2V5IG9yIGEgJEFLIGtleSAoZmllbGQgJy4kZmllbGRuYW1lLicpJzsKCQl9CgkJCgkJaWYoKCRjYXN0ID09IE9ybUNBU1Q6OiREQVRFIHx8ICRjYXN0ID09IE9ybUNBU1Q6OiRCVUZGRVIgfHwgJGNhc3QgPT0gT3JtQ0FTVDo6JFRJTUUKCQkJCXx8ICRjYXN0ID09IE9ybUNBU1Q6OiREQVRFVElNRSB8fCAkY2FzdCA9PSBPcm1DQVNUOjokVFMgfHwgJGNhc3QgPT0gT3JtQ0FTVDo6JFVVSUQgCgkJCQl8fCAkY2FzdCA9PSBPcm1DQVNUOjokSU5IRVJJVCB8fCAkY2FzdCA9PSBPcm1DQVNUOjokTk9ORSkgJiYgIWVtcHR5KCRzaXplKSkgewoJCQkkZXJyb3JzW10gPSAnVGhlIGZpZWxkICcuJGZpZWxkbmFtZS4nIG11c3Qgbm90IGhhdmUgc2l6ZSB2YWx1ZSBiZWNhdXNlIG9mIGl0cyBvd24gT3JtQ0FTVCc7CgkJfQoJCWlmKCgkY2FzdCA9PSBPcm1DQVNUOjokU1RSSU5HKSAmJiBlbXB0eSgkc2l6ZSkpIHsKCQkJJGVycm9yc1tdID0gJ1RoZSBmaWVsZCAnLiRmaWVsZG5hbWUuJyBtdXN0IGhhdmUgc2l6ZSB2YWx1ZSBiZWNhdXNlIG9mIGl0cyBvd24gT3JtQ0FTVCc7CgkJfQoJCQoJCWlmKCFlbXB0eSgkZXJyb3JzKSl7CgkJCXRocm93IG5ldyBPcm1JbGxlZ2FsQ29uZmlndXJhdGlvbkV4Y2VwdGlvbigkZXJyb3JzKTsKCQl9CgoJCWlmKCRudWxsYWJsZSA9PSBudWxsKSB7CgkJCSRudWxsYWJsZSA9IGZhbHNlOwoJCX0KCgkJLy9UT0RPIDogZml4IGZ1dHVyIElOSEVSSVQgZm9uY3Rpb24KCQkvKgoJCWlmKE9ybUNBU1Q6OiRJTkhFUklUID09ICRjYXN0KSB7CgkJCS8vTXVzdCB0YWtlIHRoZSBkaXN0YW50IHR5cGUKCQkJbGlzdCgkZW50aXR5QXNzb2NOYW1lLCAkZmllbGRBc3NvY2lhdGVOYW1lKSA9IGV4cGxvZGUoIi4iLCAkS0VZTmFtZSk7CgkJCSRjYXN0ID0gKG5ldyAkZW50aXR5QXNzb2NOYW1lKCkpLT5nZXRGaWVsZEJ5TmFtZSgkZmllbGRBc3NvY2lhdGVOYW1lKS0+Z2V0VHlwZSgpOwoJCQkkc2l6ZSA9IChuZXcgJGVudGl0eUFzc29jTmFtZSgpKS0+Z2V0RmllbGRCeU5hbWUoJGZpZWxkQXNzb2NpYXRlTmFtZSktPmdldFNpemUoKTsKCQl9Ki8KCQkJCgkJJHRoaXMtPm5hbWUgCT0gJGZpZWxkbmFtZTsKCQkkdGhpcy0+dHlwZSAJPSAkY2FzdDsKCQkkdGhpcy0+c2l6ZSAJPSAkc2l6ZTsKCQkkdGhpcy0+bnVsbGFibGUgPSAkbnVsbGFibGU7CgkJJHRoaXMtPktFWSAJCT0gJEtFWTsKCQkkdGhpcy0+S0VZTmFtZSAJPSAkS0VZTmFtZTsKCX0KCQoKICAgIC8qKgogICAgKiBnZXR0ZXIgZm9yIG5hbWUKICAgICogCiAgICAqIEByZXR1cm4gc3RyaW5nIHRoZSAodW5pcXVlKSBuYW1lIG9mIEZpZWxkCiAgICAqLwoJcHVibGljIGZ1bmN0aW9uIGdldE5hbWUoKQoJe3JldHVybiAkdGhpcy0+bmFtZTt9CgogICAgLyoqCiAgICAqIGdldHRlciBmb3IgdHlwZQogICAgKiAKICAgICogQHJldHVybiBzdHJpbmcgdGhlIENBU1QgdmFsdWUgb2YgRmllbGQKICAgICogCiAgICAqIEBzZWUgT3JtQ0FTVAogICAgKiAKICAgICovCQoJcHVibGljIGZ1bmN0aW9uIGdldFR5cGUoKQoJe3JldHVybiAkdGhpcy0+dHlwZTt9CgkKICAgLyoqCiAgICAqIGdldHRlciBmb3Igc2l6ZQogICAgKiAKICAgICogQHJldHVybiBpbnQgdGhlIHNpemUgb2YgRmllbGQKICAgICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0U2l6ZSgpCgl7cmV0dXJuICR0aGlzLT5zaXplO30KCiAgIC8qKgogICAgKiByZXR1cm4gdHJ1ZSBpZiBGaWVsZCBoYXMgYSAkUEsKICAgICogCiAgICAqIEByZXR1cm4gYm9vbGVhbiB0cnVlIGlmIEZpZWxkIGhhcyBhICRQSwogICAgKi8JCglwdWJsaWMgZnVuY3Rpb24gaXNQcmltYXJ5S0VZKCkKCXtyZXR1cm4gJHRoaXMtPktFWSA9PSBPcm1LRVk6OiRQSzt9CgogICAvKioKICAgICogcmV0dXJuIHRydWUgaWYgRmllbGQgaGFzIGEgJEZLCiAgICAqIAogICAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBpZiBGaWVsZCBoYXMgYSAkRksKICAgICovICAgIAkKCXB1YmxpYyBmdW5jdGlvbiBpc0ZvcmVpZ25LRVkoKQoJe3JldHVybiAkdGhpcy0+S0VZID09IE9ybUtFWTo6JEZLO30KCiAgIC8qKgogICAgKiByZXR1cm4gdHJ1ZSBpZiBGaWVsZCBoYXMgYSAkQUsKICAgICogCiAgICAqIEByZXR1cm4gYm9vbGVhbiB0cnVlIGlmIEZpZWxkIGhhcyBhICRBSwogICAgKi8gICAgCQoJcHVibGljIGZ1bmN0aW9uIGlzQXNzb2NpYXRlS0VZKCkKCXtyZXR1cm4gJHRoaXMtPktFWSA9PSBPcm1LRVk6OiRBSzt9CgkKICAgIC8qKgogICAgKiBnZXR0ZXIgZm9yIGtleU5hbWUKICAgICogCiAgICAqIEByZXR1cm4gc3RyaW5nIHRoZSBrZXlOYW1lIG9mIEZpZWxkCiAgICAqIAogICAgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRLRVlOYW1lKCkKCXtyZXR1cm4gJHRoaXMtPktFWU5hbWU7fQoJCiAgICAvKioKICAgICogZ2V0dGVyIGZvciBudWxsYWJsZSAKICAgICogCiAgICAqIEByZXR1cm4gdHJ1ZSBpZiBGaWVsZCBpcyBvcHRpb25hbCBpbiBkYXRhYmFzZQogICAgKi8KCXB1YmxpYyBmdW5jdGlvbiBpc051bGxhYmxlKCkKCXtyZXR1cm4gJHRoaXMtPm51bGxhYmxlO30KCQogICAgLyoqCiAgICAqIGdldHRlciBmb3IgZGVmYXVsdFZhbHVlCiAgICAqIAogICAgKiBAcmV0dXJuIG1peGVkIHRoZSBkZWZhdWx0IHZhbHVlIG9mIEZpZWxkCiAgICAqIAogICAgKi8JCglwdWJsaWMgZnVuY3Rpb24gZ2V0RGVmYXVsdFZhbHVlKCkKCXtyZXR1cm4gJHRoaXMtPmRlZmF1bHRWYWx1ZTt9CgkKICAgLyoqCiAgICAqIHNldHRlciBmb3IgZGVmYXVsdFZhbHVlCiAgICAqIAogICAgKiBAcGFyYW0gbWl4ZWQgJGRlZmF1bHRWYWx1ZSB0aGUgZGVmYXVsdCB2YWx1ZSBvZiBGaWVsZAogICAgKiAKICAgICovCQoJcHVibGljIGZ1bmN0aW9uIHNldERlZmF1bHRWYWx1ZSgkZGVmYXVsdFZhbHVlKXsKCQlpZigkdGhpcy0+dHlwZSA9PSBPcm1DQVNUOjokQlVGRkVSKXsKCQkJdGhyb3cgbmV3IE9ybUlsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidGhlIEZpZWxkICIuJHRoaXMtPm5hbWUuIiBvZiB0eXBlIEJVRkZFUiBjYW4ndCBoYXZlIGEgZGVmYXVsdCB2YWx1ZSAiKTsKCQl9CgkJJHRoaXMtPmRlZmF1bHRWYWx1ZSA9ICRkZWZhdWx0VmFsdWU7Cgl9CgkKfQoKPz4K]]></data>
	</file>
	<file>
	  <filename>/lib/class.OrmIllegalArgumentException.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKIC8qKgogKiBDb250YWlucyB0aGUgY2xhc3MgT3JtSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCiAqCiAqIEBzaW5jZSAwLjAuMQogKiBAYXV0aG9yIEJlc3MKICoqLwogCgovKioKICogQ2xhc3NlIGV4dGVuZHMgRXhjZXB0aW9uLCB1c2VkIHdoZW4gdGhlIHBhcmFtZXRlcnMgaXMgbm90IHRoZSBvbmUgZXhwZWN0ZWQKICoKICogQHNpbmNlIDAuMC4xCiAqIEBhdXRob3IgQmVzcwogKiBAcGFja2FnZSBPcm0KKi8KY2xhc3MgT3JtSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKIAogICAgLyoqCiAgICAqIFB1YmxpYyBjb25zdHJ1Y3RvcgogICAgKgogICAgKiBAcGFyYW0gc3RyaW5nICRtc2cgW29wdGlvbmFsXSB0aGUgZXJyb3IgbWVzc2FnZSAKICAgICogQHBhcmFtIGludCAkY29kZSBbb3B0aW9uYWxdIHRoZSBlcnJvciBjb2RlCiAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRtc2c9TlVMTCwgJGNvZGU9MCkgewogICAgCXBhcmVudDo6X19jb25zdHJ1Y3QoJG1zZywgJGNvZGUpOwogICAgfQp9CgoKPz4K]]></data>
	</file>
	<file>
	  <filename>/lib/class.OrmIllegalConfigurationException.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKIC8qKgogKiBDb250YWlucyB0aGUgY2xhc3MgT3JtSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCiAqCiAqIEBzaW5jZSAwLjAuMQogKiBAYXV0aG9yIEJlc3MKICoqLwogCgovKioKICogQ2xhc3NlIGV4dGVuZHMgRXhjZXB0aW9uLCB1c2VkIHdoZW4gdGhlIGluaXRpYWwgY29uZmlndXJhdGlvbiBvZiBFbnRpdGllcyBpc24ndCBjb3JyZWN0CiAqCiAqIEBzaW5jZSAwLjAuMQogKiBAYXV0aG9yIEJlc3MKICogQHBhY2thZ2UgT3JtCiovCmNsYXNzIE9ybUlsbGVnYWxDb25maWd1cmF0aW9uRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uICB7CiAgICAKICAgIC8qKgogICAgKiB0aGUgaW5uZXIgZXJyb3IgbWVzc2FnZXMKICAgICoqLwoJcHJpdmF0ZSAkbWVzc2FnZXMgPSBhcnJheSgpOwoKICAgIC8qKgogICAgKiBQdWJsaWMgY29uc3RydWN0b3IKICAgICoKICAgICogQHBhcmFtIHN0cmluZyAkbXNnIFtvcHRpb25hbF0gdGhlIGVycm9yIG1lc3NhZ2UgCiAgICAqIEBwYXJhbSBpbnQgJGNvZGUgW29wdGlvbmFsXSB0aGUgZXJyb3IgY29kZQogICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkbXNnPU5VTEwsICRjb2RlPTApCiAgICB7CiAgICAJaWYoaXNfYXJyYXkoJG1zZykgJiYgY291bnQoJG1zZykgPiAxICl7CiAgICAJCXBhcmVudDo6X19jb25zdHJ1Y3QoIk11bHRpcGxlIE9ybUlsbGVnYWxDb25maWd1cmF0aW9uRXhjZXB0aW9uIGRldGVjdGVkIiwgJGNvZGUpOwogICAgCQkkdGhpcy0+bWVzc2FnZXMgPSAkbXNnOwoKICAgIAl9IGVsc2VpZiggaXNfYXJyYXkoJG1zZykgKXsKICAgIAkJcGFyZW50OjpfX2NvbnN0cnVjdCgkbXNnWzBdLCAkY29kZSk7CiAgICAJCSR0aGlzLT5tZXNzYWdlcyA9ICRtc2c7CQoJCX0gZWxzZSB7CiAgICAJCXBhcmVudDo6X19jb25zdHJ1Y3QoJG1zZywgJGNvZGUpOwogICAgCQkkdGhpcy0+bWVzc2FnZXNbXSA9ICRtc2c7CQogICAgCX0KICAgIAkKICAgIH0KCiAgICAvKioKICAgICogV2lsbCByZXR1cm4gdGhlIG1lc3NhZ2VzCiAgICAqCiAgICAqIEByZXR1cm4gc3RyaW5nW10gdGhlIG1lc3NhZ2VzCiAgICAqKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRNZXNzYWdlcygpewogICAgCXJldHVybiAkdGhpcy0+bWVzc2FnZXM7CiAgICB9Cn0KCj8+Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/class.OrmKEY.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIENvbnRhaW5zIHRoZSBjbGFzcyBmb3IgdGhlIGRpZmZlcmVudCBkYXRhYmFzZSBrZXkKICogCiAqIEBzaW5jZSAwLjAuMQogKiBAYXV0aG9yIEJlc3MKICoqLwoKLyoqCiAqIENsYXNzIGRlZmluZXMgdGhlIGRpZmZlcmVudHMga2V5cyB1c2VkIGluIHRoZSBPcm0gc3lzdGVtCiAqIAogKiAgT3JtS0VZOjokUEsgZGVmaW5lcyBhIHByaW1hcnkga2V5CiAqICBPcm1LRVk6OiRGSyBkZWZpbmVzIGEgZm9yZWlnbiBrZXkgOiBhIGxpbmsgYmV0d2VlbiAyIGVudGl0aWVzIDAsMS0+biAKICogIE9ybUtFWTo6JEFLIGRlZmluZXMgYW4gYXNzb2NpYXRlIGtleSA6IGEgbGluayBiZXR3ZWVuIDIgZW50aXRpZXMgdGhhdCBuZWVkaW5nIGEgdGhpcmQgdGFibGUKICogCiAqIEBzaW5jZSAwLjAuMQogKiBAYXV0aG9yIEJlc3MKICogQHBhY2thZ2UgT3JtCiovCmNsYXNzIE9ybUtFWSB7CgoJLyoqCgkqIFByaW1hcnkgS0VZCgkqKi8KCXB1YmxpYyBzdGF0aWMgJFBLID0gMHg5OTAxOyAKCgkvKioKCSogRm9yZWlnbiBLRVkgYSBsaW5rIGJldHdlZW4gMiBlbnRpdGllcyAwLDEtPm4KCSoqLwoJcHVibGljIHN0YXRpYyAkRksgPSAweDk5MDI7IAoKCS8qKgoJKiBBc3NvY2lhdGUgS0VZIGEgbGluayBiZXR3ZWVuIDIgZW50aXRpZXMgbi0+biB0aGF0IG5lZWRpbmcgYSB0aGlyZCB0YWJsZQoJKiovCglwdWJsaWMgc3RhdGljICRBSyA9IDB4OTkwMzsgCn0KCj8+Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/class.OrmLimit.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIENvbnRhaW5zIHRoZSBjbGFzcyB3aGljaCB3aWxsIG1hbmFnZSB0aGUgU3FsIExJTUlUCiAqCiAqIEBzaW5jZSAwLjIuMAogKiBAYXV0aG9yIEhlcmlxdWV0CiAqKi8KCgovKioKICogQ29udGFpbnMgdGhlIGNsYXNzIHdoaWNoIHdpbGwgbWFuYWdlIHRoZSBTcWwgTElNSVQKICogCiAqIEBzaW5jZSAwLjIuMAogKiBAYXV0aG9yIEhlcmlxdWV0CiAqIEBwYWNrYWdlIE9ybQoqLwpjbGFzcyBPcm1MaW1pdCB7CQoKCS8qKgoJKiBpbnRlcm5hbCBvZmZzZXQKCSoqLwoJcHJpdmF0ZSAkb2Zmc2V0ID0gMDsKCgkvKioKCSogaW50ZXJuYWwgY291bnRlciBmb3Igcm93CgkqKi8KCXByaXZhdGUgJHJvd19jb3VudCA9IDA7CgoJLyoqCgkqIHB1YmxpYyBjb25zdHJ1Y3QKCSoKCSogQHBhcmFtICRvZmZzZXQgW29wdGlvbmFsXSB0aGUgb2Zmc2V0LiBEZWZhdWx0ID0gMAoJKiBAcGFyYW0gJHJvd19jb3VudCBbb3B0aW9uYWxdIHRoZSBjb3VudGVyIG9mIHJvdy4gRGVmYXVsdCA9IDAKCSoqLwoJZnVuY3Rpb24gX19jb25zdHJ1Y3QoJG9mZnNldD0wLCAkcm93X2NvdW50PTApIHsKCQlpZigkb2Zmc2V0IDwgMCkgewoJCQl0aHJvdyBuZXcgT3JtSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIG9mZnNldCB2YWx1ZTogeyRvZmZzZXR9LiBNdXN0IGJlID49IDAiKTsKCQl9CgkJCgkJaWYoJHJvd19jb3VudCA8PSAwKSB7CgkJCXRocm93IG5ldyBPcm1JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgcm93X2NvdW50IHZhbHVlOiB7JHJvd19jb3VudH0uIE11c3QgYmUgPiAwIik7CgkJfQoKCQkkdGhpcy0+b2Zmc2V0ID0gJG9mZnNldDsKCQkkdGhpcy0+cm93X2NvdW50ID0gJHJvd19jb3VudDsKCX0KCQogICAvKioKICAgICogcmV0dXJuIHRoZSBMSU1JVCBjbGF1c2UKICAgICogCiAgICAqIEByZXR1cm4gc3RyaW5nIHRoZSBMSU1JVCBjbGF1c2UgdW5kZXIgc3FsIGxhbmd1YWdlCiAgICAqLyAgICAgIAoJZnVuY3Rpb24gZ2V0TGltaXQoKQl7CgkJaWYoJHRoaXMtPm9mZnNldCA9PSAwICYmICR0aGlzLT5yb3dfY291bnQgPT0gMCkgeyAvLyBubyBsaW1pdCBzZXQKCQkJcmV0dXJuICcnOwoJCX0KCQkKCQkkbGltaXQgPSAnIExJTUlUICc7CgkJCgkJaWYoJHRoaXMtPm9mZnNldCA9IDApIHsKCQkJJGxpbWl0Lj0gJHRoaXMtPm9mZnNldDsKCQl9CgkJCgkJJGxpbWl0Lj0gJyAnLiR0aGlzLT5yb3dfY291bnQ7CgkJCgkJcmV0dXJuICRsaW1pdDsKCX0KCQogICAvKioKICAgICogU2V0IG9mZnNldAogICAgKiAKICAgICogQHBhcmFtICRvZmZzZXQgdGhlIG9mZnNldCBvZiByb3cgdG8gc2V0CiAgICAqLwoJZnVuY3Rpb24gc2V0T2Zmc2V0KCRvZmZzZXQpIHsKCQlpZigkb2Zmc2V0IDwgMCkgewoJCQl0aHJvdyBuZXcgT3JtSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIG9mZnNldCB2YWx1ZTogeyRvZmZzZXR9LiBNdXN0IGJlID49IDAiKTsKCQl9CgoJCSR0aGlzLT5vZmZzZXQgPSAkb2Zmc2V0OwoJfQoJCiAgIC8qKgogICAgKiBTZXQgcm93X2NvdW50CiAgICAqIAogICAgKiBAcGFyYW0gJHJvd19jb3VudCB0aGUgY291bnRlciBvZiByb3cgdG8gc2V0CiAgICAqLwoJZnVuY3Rpb24gc2V0Um93Q291bnQoJHJvd19jb3VudCkgewoJCWlmKCRyb3dfY291bnQgPD0gMCkgewoJCQl0aHJvdyBuZXcgT3JtSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIHJvd19jb3VudCB2YWx1ZTogeyRyb3dfY291bnR9LiBNdXN0IGJlID4gMCIpOwoJCX0KCgkJJHRoaXMtPnJvd19jb3VudCA9ICRyb3dfY291bnQ7Cgl9Cn0KCj8+Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/class.OrmOrderBy.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIENvbnRhaW5zIHRoZSBjbGFzcyB3aGljaCB3aWxsIG1hbmFnZSB0aGUgU3FsIHNvcnRpbmcgb2YgdGhlIEVudGl0eQogKgogKiBAc2luY2UgMC4yLjAKICogQGF1dGhvciBIZXJpcXVldAogKiovCgoKLyoqCiAqIENvbnRhaW5zIHRoZSBjbGFzcyB3aGljaCB3aWxsIG1hbmFnZSB0aGUgU3FsIHNvcnRpbmcgb2YgdGhlIEVudGl0eQogKiAKICogIE9ybUNBU1Q6OiRERVNDIAogKgogKiBAc2luY2UgMC4yLjAKICogQGF1dGhvciBIZXJpcXVldAogKiBAcGFja2FnZSBPcm0KKi8KY2xhc3MgT3JtT3JkZXJCeSB7CgoJLyoqCgkqIHRoZSBpbm5lciBsaXN0IG9mIG9yZGVycwoJKiovCglwcml2YXRlICRvcmRlcnMgPSBhcnJheSgpOwoKCS8qKgoJKiB0aGUgaW5uZXIgU1FMIHdvcmQgZm9yIEFTQyBzb3J0aW5nCgkqKi8KCXB1YmxpYyBzdGF0aWMgJEFTQyA9ICdBU0MnOwoKCS8qKgoJKiB0aGUgaW5uZXIgU1FMIHdvcmQgZm9yIERFU0Mgc29ydGluZwoJKiovCglwdWJsaWMgc3RhdGljICRERVNDID0gJ0RFU0MnOwoJCgkvKioKICAgICogcHVibGljIGNvbnN0cnVjdG9yCiAgICAqIAkKICAgICogQHBhcmFtIG1peGVkW10gJG9yZGVycyBhbiBoYXNoIHdpdGggb3JkZXIgYnkgZGVmaW5pdGlvbnMKCSovCglmdW5jdGlvbiBfX2NvbnN0cnVjdCgkb3JkZXJzPWFycmF5KCkpIHsKCQlmb3JlYWNoKCRvcmRlcnMgYXMgJGZpZWxkbmFtZSA9PiAkb3JkZXIpIHsKCgkJCWlmKCRvcmRlciA9PSBPcm1PcmRlckJ5OjokQVNDKSB7CgkJCQkkdGhpcy0+YWRkQXNjKCRmaWVsZG5hbWUpOwoJCQl9IGVsc2UgaWYoJG9yZGVyID09IE9ybU9yZGVyQnk6OiRERVNDKSB7CgkJCQkkdGhpcy0+YWRkRGVzYygkZmllbGRuYW1lKTsJCQkKCQkJfSBlbHNlIHsKCQkJCXRocm93IG5ldyBPcm1JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgb3JkZXIgZm9yIE9SREVSIEJZOiB7JG9yZGVyfS4iKTsKCQkJfQoJCX0KCX0KCQogICAvKioKICAgICogcmV0dXJuIHRoZSBTUUwgT1JERVIgQlkgY2xhdXNlCiAgICAqIAogICAgKiBAcmV0dXJuIE9SREVSIEJZIGNsYXVzZQogICAgKi8gICAgICAKCWZ1bmN0aW9uIGdldE9yZGVyQnkoKQl7CgkJJG9yZGVyYnkgPSAnIE9SREVSIEJZICc7CgkJCgkJaWYoY291bnQoJHRoaXMtPm9yZGVycykgPT0gMCkgewoJCQlyZXR1cm4gJyc7CgkJfQoJCQoJCSRpPTE7CgkJZm9yZWFjaCgkdGhpcy0+b3JkZXJzIGFzICRrZXkgPT4gJHZhbHVlKSB7CgkJCQoJCQkkb3JkZXJieSAuPSAoJGkrKz4xPycsJzonJykuJyAnLiRrZXkuJyAnLiR2YWx1ZTsKCQl9CgkJCgkJcmV0dXJuICRvcmRlcmJ5OwoJfQoJCiAgIC8qKgogICAgKiBBZGQgYSBuZXcgZmllbGRuYW1lIGluIG9yZGVyIGJ5OiBERVNDCiAgICAqIAogICAgKiBAcGFyYW0gc3RyaW5nICRmaWVsZG5hbWUgdGhlIG5hbWUgb2YgdGhlIGZpZWxkIHRvIGFkZGluZwogICAgKi8KCWZ1bmN0aW9uIGFkZEFzYygkZmllbGRuYW1lKSB7CgkJJHRoaXMtPm9yZGVycyA9IGFycmF5X21lcmdlKCR0aGlzLT5vcmRlcnMsIGFycmF5KCRmaWVsZG5hbWUgPT4gJycpKTsgLy8gQVNDIG5vdCBtYW5kYXRvcnkKCX0KCQogICAvKioKICAgICogQWRkIGEgbmV3IGZpZWxkbmFtZSBpbiBvcmRlciBieTogREVTQwogICAgKiAKICAgICogQHBhcmFtIHN0cmluZyAkZmllbGRuYW1lIHRoZSBuYW1lIG9mIHRoZSBmaWVsZCB0byBhZGRpbmcKICAgICovCglmdW5jdGlvbiBhZGREZXNjKCRmaWVsZG5hbWUpIHsKCQkkdGhpcy0+b3JkZXJzID0gYXJyYXlfbWVyZ2UoJHRoaXMtPm9yZGVycywgYXJyYXkoJGZpZWxkbmFtZSA9PiBPcm1PcmRlckJ5OjokREVTQykpOwoJfQp9Cgo/Pgo=]]></data>
	</file>
	<file>
	  <filename>/lib/class.OrmSqlException.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKIC8qKgogKiBDb250YWlucyB0aGUgY2xhc3MgT3JtSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCiAqCiAqIEBzaW5jZSAwLjMuMAogKiBAYXV0aG9yIEJlc3MKICoqLwogCgovKioKICogQ2xhc3MgZXh0ZW5kcyBFeGNlcHRpb24sIHVzZWQgd2hlbiB0aGUgcGFyYW1ldGVycyBpcyBub3QgdGhlIG9uZSBleHBlY3RlZAogKgogKiBAc2luY2UgMC4zLjAKICogQGF1dGhvciBCZXNzCiAqIEBwYWNrYWdlIE9ybQoqLwpjbGFzcyBPcm1TcWxFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gewogICAgCiAKICAgIC8qKgogICAgKiBQdWJsaWMgY29uc3RydWN0b3IKICAgICoKICAgICogQHBhcmFtIHN0cmluZyAkbXNnIFtvcHRpb25hbF0gdGhlIGVycm9yIG1lc3NhZ2UgCiAgICAqIEBwYXJhbSBpbnQgJGNvZGUgW29wdGlvbmFsXSB0aGUgZXJyb3IgY29kZQogICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkbXNnPU5VTEwsICRjb2RlPTApIHsKICAgIAlwYXJlbnQ6Ol9fY29uc3RydWN0KCRtc2csICRjb2RlKTsKICAgIH0KfQoKCj8+Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/class.OrmTrace.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIENvbnRhaW5zIGFsbCB0aGUgZGVidWcgc3lzdGVtLgogKgogKiBAc2luY2UgMC4wLjEKICogQGF1dGhvciBCZXNzCiAqKi8KCi8qKgogKiAgQWxsb3cgZGlzcGxheSBzdGFja3RyYWNlIGFuZCBvdGhlciBpbmZvcm1hdGlvbnMgaW4gYSBjb25zb2xlIG9yIG9uIHRoZSBwYWdlCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogKiAgZXhhbXBsZQogKiAgPGNvZGU+CiAqICAgICAgICAgIE9ybVRyYWNlOjpkZWJ1ZygnaSBhbSBoZXJlICEnKTsKICogICAgICAgICAgT3JtVHJhY2U6OmluZm8oJ3Byb2Nlc3MgZmluaXNoZWQnKTsKICogICAgICAgICAgT3JtVHJhY2U6Ondhcm4oJ0JlIGNhcmZ1bGwgOiB0b28gbXVjaCByZXN1bHRzIHdpbGwgYmUgZGlzcGxheWVkJyk7CiAqICAgICAgICAgIE9ybVRyYWNlOjplcnJvcignb3VwcyBob3VzdG9uLCB3ZSBoYXZlIGdvdCBhIHByb2JsZW0uLi4gOiggJyk7CiAqICA8L2NvZGU+CiAqIAogKiB0aGUgcHJvcGVydHkgJGxldmVsIG9mIHRoaXMgY2xhc3MgZGVmaW5lcyB0aGUgbGV2ZWwgb2YgdGhlIG1lc3NhZ2VzIHRvIGRpc3BsYXlpbmcKICogIFNvIGEgbGV2ZWwgb2YgIldBUk4iIHdpbGwgb25seSBkaXNwbGF5IHdhcm5pbmcgYW5kIGVycm9yIG1lc3NhZ2VzCiAqICBCeSBkZWZhdWx0IHRoZSBsZXZlbCBpcyBzZXR0ZWQgdG8gV0FSTgogKgogKiBAc2luY2UgMC4wLjEKICogQGF1dGhvciBCZXNzCiAqIEBwYWNrYWdlIE9ybQogKiovICAgCiAKZmluYWwgY2xhc3MgT3JtVHJhY2UgewoKCS8qKgoJKiBERUJVRyAmIElORk8gJiBXQVJOICYgRVJST1IgbGV2ZWwKCSoqLwoJcHVibGljIHN0YXRpYyAkREVCVUcgPSAwOwoKCS8qKgoJKiBJTkZPICYgV0FSTiAmIEVSUk9SIGxldmVsCgkqKi8KCXB1YmxpYyBzdGF0aWMgJElORk8gPSAxOwoKCS8qKgoJKiBXQVJOICYgRVJST1IgbGV2ZWwKCSoqLwoJcHVibGljIHN0YXRpYyAkV0FSTiA9IDI7CgoJLyoqCgkqIEVSUk9SIGxldmVsCgkqKi8KCXB1YmxpYyBzdGF0aWMgJEVSUk9SID0gMzsKCgkvKioKCSogaW5uZXIgcGF0aCB0byB0aGUgbG9nIGZpbGUKCSoqLwoJcHJvdGVjdGVkIHN0YXRpYyAkbG9nRmlsZTsKCgkvKioKCSogaW5uZXIgdXJsIHRvIHRoZSBsb2cgZmlsZSAKCSoqLwoJcHJvdGVjdGVkIHN0YXRpYyAkbG9nVXJsOwoJCgkvKioKCSogcHJvdGVjdGVkIGNvbnN0cnVjdG9yCgkqKi8KCXByb3RlY3RlZCBmdW5jdGlvbiBfX2NvbnN0cnVjdCgpIHsKCX0KCgkvKioKICAgICogRGlzcGxheSBhIG1lc3NhZ2Ugd2l0aCBERUJVRyBsZXZlbAogICAgKiAKICAgICogQHBhcmFtIHN0cmluZyAkbXNnIHRoZSBtZXNzYWdlIHRvIGRpc3BsYXkKICAgICovCglwdWJsaWMgc3RhdGljIGZpbmFsCWZ1bmN0aW9uIGRlYnVnKCRtc2cpIHsJCgkJc2VsZjo6aW5uZXJXcml0ZXIoT3JtVHJhY2U6OiRERUJVRywgJ2RlYnVnJywgJG1zZyk7Cgl9CgogICAgLyoqCiAgICAqIERpc3BsYXkgYSBtZXNzYWdlIHdpdGggSU5GTyBsZXZlbAogICAgKiAKICAgICogQHBhcmFtIHN0cmluZyAkbXNnIHRoZSBtZXNzYWdlIHRvIGRpc3BsYXkKICAgICovCglwdWJsaWMgc3RhdGljIGZpbmFsCWZ1bmN0aW9uIGluZm8oJG1zZykgewkKCQlzZWxmOjppbm5lcldyaXRlcihPcm1UcmFjZTo6JElORk8sICdpbmZvJywgJG1zZyk7Cgl9IAoKICAgIC8qKgogICAgKiBEaXNwbGF5IGEgbWVzc2FnZSB3aXRoIFdBUk4gbGV2ZWwKICAgICogCiAgICAqIEBwYXJhbSBzdHJpbmcgJG1zZyB0aGUgbWVzc2FnZSB0byBkaXNwbGF5CiAgICAqLwoJcHVibGljIHN0YXRpYyBmaW5hbAlmdW5jdGlvbiB3YXJuKCRtc2cpIHsJCgkJc2VsZjo6aW5uZXJXcml0ZXIoT3JtVHJhY2U6OiRXQVJOLCAnd2FybicsICRtc2cpOwoJfSAKCiAgICAvKioKICAgICogRGlzcGxheSBhIG1lc3NhZ2Ugd2l0aCBFUlJPUiBsZXZlbAogICAgKiAKICAgICogQHBhcmFtIHN0cmluZyAkbXNnIHRoZSBtZXNzYWdlIHRvIGRpc3BsYXkKICAgICovCglwdWJsaWMgc3RhdGljIGZpbmFsCWZ1bmN0aW9uIGVycm9yKCRtc2cpIHsJCgkJc2VsZjo6aW5uZXJXcml0ZXIoT3JtVHJhY2U6OiRFUlJPUiwgJ2Vycm9yJywgJG1zZyk7Cgl9CgkKCS8qKgoJICogV2lsbCByZXR1cm4gdGhlIHBhdGggb2YgdGhlIGxvZyBmaWxlCgkgKgoJICogQHJldHVybiBzdHJpbmcgdGhlIHBhdGggb2YgdGhlIGxvZyBmaWxlCgkgKiovCglwdWJsaWMgc3RhdGljIGZpbmFsIGZ1bmN0aW9uIGdldExvZ0ZpbGUoKXsKCQlpZihzZWxmOjokbG9nRmlsZSA9PSBudWxsKXsKCQkJJGNvbmZpZyA9IGNtc21zKCktPkdldENvbmZpZygpOwoJCQlzZWxmOjokbG9nRmlsZSA9ICRjb25maWdbJ3Jvb3RfcGF0aCddLicvdG1wL2NhY2hlL29ybS5sb2cnOwoJCX0KCQlyZXR1cm4gc2VsZjo6JGxvZ0ZpbGU7Cgl9CgkKCS8qKgoJICogV2lsbCByZXR1cm4gdGhlIHVybCBvZiB0aGUgbG9nIGZpbGUKCSAqCgkgKiBAcmV0dXJuIHN0cmluZyB0aGUgdXJsIG9mIHRoZSBsb2cgZmlsZQoJICoqLwoJcHVibGljIHN0YXRpYyBmaW5hbCBmdW5jdGlvbiBnZXRMb2dVcmwoKXsKCQlpZihzZWxmOjokbG9nVXJsID09IG51bGwpewoJCQkkY29uZmlnID0gY21zbXMoKS0+R2V0Q29uZmlnKCk7CgkJCXNlbGY6OiRsb2dVcmwgPSAkY29uZmlnWydyb290X3VybCddLicvdG1wL2NhY2hlL29ybS5sb2cnOwoJCX0KCQlyZXR1cm4gc2VsZjo6JGxvZ1VybDsKCX0KCQoJLyoqCgkgKiBEbyBhbGwgdGhlIHN1ZmYgYmVoaW5kCgkgKgoJICogQHBhcmFtIHN0cmluZyAkbGV2ZWwgdGhlIGxldmVsIG9mIG1lc3NhZ2UuCgkgKiBAcGFyYW0gc3RyaW5nICRjc3NDbGFzcyB0aGUgY3NzIGNsYXNzIHRvIGRpc3BsYXkgdGhlICJpbmxpbmUiIG1lc3NhZ2UKCSAqIEBwYXJhbSBzdHJpbmcgJG1zZyB0aGUgbWVzc2FnZSB0byBkaXNwbGF5CgkgKi8KCXByaXZhdGUgc3RhdGljIGZpbmFsIGZ1bmN0aW9uIGlubmVyV3JpdGVyKCRsZXZlbCwgJGNzc0NsYXNzLCAkbXNnKXsKCQkkb3JtID0gY21zbXMoKS0+R2V0TW9kdWxlT3BlcmF0aW9ucygpLT5nZXRfbW9kdWxlX2luc3RhbmNlKCdPcm0nKTsKCgkJaWYoJG9ybS0+R2V0UHJlZmVyZW5jZSgnbG9nbGV2ZWwnLCBPcm1UcmFjZTo6JElORk8pID4gJGxldmVsKSB7cmV0dXJuO30KCQkKCQkkY29udGVudCA9IGRhdGUoJ1ktbS1kIEg6aTpzJywgdGltZSgpKS4iIC0gWyRjc3NDbGFzc10gLSAkbXNnIFxuIjsKCQkJCQoJCS8vaW4gZmlsZSBsb2cKCQlmaWxlX3B1dF9jb250ZW50cyhzZWxmOjpnZXRMb2dGaWxlKCkgLCRjb250ZW50LCBGSUxFX0FQUEVORCApOwoKCQkvL0luIHBocCBsb2cKCQllcnJvcl9sb2coJG1zZyk7Cgl9Cn0KCj8+Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/class.OrmTypeCriteria.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIENvbnRhaW5zIHRoZSBPcm1UeXBlQ3JpdGVyaWEgY2xhc3MKICogCiAqIEBzaW5jZSAwLjAuMQogKiBAYXV0aG9yIEJlc3MKICoqLwogCgovKioKICogRW51bSBmb3IgdGhlIGRpZmZlcmVudCB0eXBlcyBvZiBPcm1UeXBlQ3JpdGVyaWEKICogCiAqIAogKiBAc2luY2UgMC4wLjEKICogQGF1dGhvciBCZXNzCiAqIEBwYWNrYWdlIE9ybQogKiovCmNsYXNzIE9ybVR5cGVDcml0ZXJpYSB7CiAgICAvKioKICAgICogSXMgZXF1YWxzIHRvCiAgICAqIAogICAgKiBAdmFyIHN0cmluZwogICAgKi8KCXB1YmxpYyBzdGF0aWMgJEVRID0gJyA9ICc7CiAgICAKICAgIC8qKgogICAgKiBJcyBkaWZmZXJlbnQgT2YKICAgICogCiAgICAqIEB2YXIgc3RyaW5nCiAgICAqLwoJcHVibGljIHN0YXRpYyAkTkVRID0gJyAhPSAnOwogICAgCiAgICAvKioKICAgICogaXMgc3RyaWN0bHkgZ3JlYXRlciAgdGhhbgogICAgKiAKICAgICogQHZhciBzdHJpbmcKICAgICovCglwdWJsaWMgc3RhdGljICRHVCA9ICcgPiAnOwogICAgCiAgICAvKioKICAgICogaXMgZ3JlYXRlciAgb3IgZXF1YWxzIHRvCiAgICAqIAogICAgKiBAdmFyIHN0cmluZwogICAgKi8KCXB1YmxpYyBzdGF0aWMgJEdURSA9ICcgPj0gJzsKICAgIAogICAgLyoqCiAgICAqIGlzIHN0cmljdGx5IGxlc3NlciB0aGFuCiAgICAqIAogICAgKiBAdmFyIHN0cmluZwogICAgKi8KCXB1YmxpYyBzdGF0aWMgJExUID0gJyA8ICc7CiAgICAKICAgIC8qKgogICAgKiBpcyBsZXNzZXIgb3IgZXF1YWxzIHRvCiAgICAqIAogICAgKiBAdmFyIHN0cmluZwogICAgKi8KCXB1YmxpYyBzdGF0aWMgJExURSA9ICcgPD0gJzsKCQoJLyoqCiAgICAqIGlzIE5VTEwgb3IgaXMgRW1wdHkKICAgICogCiAgICAqIEB2YXIgc3RyaW5nCiAgICAqLwoJcHVibGljIHN0YXRpYyAkRU1QVFkgPSAnaXMgZW1wdHkoKSc7CgkKICAgIC8qKgogICAgKiBpcyBOb3QgTlVMTCBhbmQgaXMgTm90IEVtcHR5CiAgICAqIAogICAgKiBAdmFyIHN0cmluZwogICAgKi8KCXB1YmxpYyBzdGF0aWMgJE5FTVBUWSA9ICdpcyBub3QgZW1wdHkoKSc7CiAgICAKICAgIC8qKgogICAgKiBpcyBOVUxMCiAgICAqIAogICAgKiBAdmFyIHN0cmluZwogICAgKi8KCXB1YmxpYyBzdGF0aWMgJE5VTEwgPSAnIGlzIG51bGwgJzsKICAgIAogICAgLyoqCiAgICAqIGlzIE5vdCBOVUxMCiAgICAqIAogICAgKiBAdmFyIHN0cmluZwogICAgKi8KCXB1YmxpYyBzdGF0aWMgJE5OVUxMID0gJyBpcyBub3QgbnVsbCc7CiAgICAKICAgIC8qKgogICAgKiBpcyBiZWZvcmUgKGEgRGF0ZSkKICAgICogCiAgICAqIEB2YXIgc3RyaW5nCiAgICAqLwoJcHVibGljIHN0YXRpYyAkQkVGT1JFID0gJyBiZWZvcmUgJzsKICAgIAogICAgLyoqCiAgICAqIGlzIGFmdGVyIChhIERhdGUpCiAgICAqIAogICAgKiBAdmFyIHN0cmluZwogICAgKi8KCXB1YmxpYyBzdGF0aWMgJEFGVEVSID0gJyBhZnRlciAnOwogICAgCiAgICAvKioKICAgICogaXMgYmV0d2VlbiAoYSBEYXRlKQogICAgKiAKICAgICogQHZhciBzdHJpbmcKICAgICovCglwdWJsaWMgc3RhdGljICRCRVRXRUVOID0gJyBiZXR3ZWVuICc7CiAgICAgCiAgICAvKioKICAgICogaXMgY29udGFpbmVkIGludG8gdGhlIGFycmF5CiAgICAqIAogICAgKiAvIVwgbmVlZCBhdCBsYXN0IDIgdmFsdWVzIGluIHRoZSBhcnJheQogICAgKiAKICAgICogQHZhciBzdHJpbmcKICAgICovCglwdWJsaWMgc3RhdGljICRJTiA9ICdpbiAoJWEpJzsKICAgIAogICAgLyoqCiAgICAqIGlzIG5vdCBjb250YWluZWQgaW50byB0aGUgYXJyYXkKICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAqIC8hXCBuZWVkIGF0IGxhc3QgMiB2YWx1ZXMgaW4gdGhlIGFycmF5CiAgICAqIAogICAgKiBAdmFyIHN0cmluZwogICAgKi8KCXB1YmxpYyBzdGF0aWMgJE5JTiA9ICdub3QgaW4gKCVhKSc7CiAgICAKICAgIC8qKgogICAgKiBjb250YWlucyB0aGUgc3RyaW5nCiAgICAqIAogICAgKiAvIVwgZG9uJ3QgZm9yZ2V0IHRvIGFkZCB0aGUgd2lsZGNhcmQgJyUnCiAgICAqIAogICAgKiBAdmFyIHN0cmluZwogICAgKi8KCXB1YmxpYyBzdGF0aWMgJExJS0UgPSAnIGxpa2UgJzsKICAgIAogICAgLyoqCiAgICAqIGRvZXNuJ3QgY29udGFpbiB0aGUgc3RyaW5nCiAgICAqIAogICAgKiAvIVwgZG9uJ3QgZm9yZ2V0IHRvIGFkZCB0aGUgd2lsZGNhcmQgJyUnCiAgICAqIAogICAgKiBAdmFyIHN0cmluZwogICAgKi8KCXB1YmxpYyBzdGF0aWMgJE5MSUtFID0gJyBub3QgbGlrZSAnOwp9Cj8+Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/class.OrmUtils.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIENvbnRhaW5zIHV0aWxpdGllcwogKgogKiBAc2luY2UgMC4zLjAKICogQGF1dGhvciBIZXJpcXVldAogKiovCgoKLyoqCiAqIENsYXNzIGNvbnRhaW5zIHNvbWUgdXRpbGl0aWVzCiAqIAogKiBAc2luY2UgMC4zLjAKICogQGF1dGhvciBIZXJpcXVldAogKiBAcGFja2FnZSBPcm0KKi8KY2xhc3MgT3JtVXRpbHMgewoJCgkvKioKCSogQXNzaWducyBhbGwgYXJyYXkgdmFsdWVzIHRvIHRoZSBlbnRpdHksIAoJKiBlc3BlY2lhbGx5IGZvciBoZWxwaW5nIHRoZSBkZXZlbG9wcGVyIHRvIGFzc2lnbiBhbGwgZm9ybSB2YXJpYWJsZXMgdG8gdGhlIGVudGl0eSwgCgkqIG9yIHRvIGxvYWQgYW4gZW50aXR5IHdpdGggYSBPcm1EYjo6ZXhlY3V0ZSBjdXN0b20gcXVlcnkKCSogQmUgY2FyZWZ1bGwgd2l0aCB0aGlzIGZ1bmN0aW9uCgkqIAoJKiBAcGFyYW0gT3JtRW50aXR5ICRlbnRpdHkgYW4gaW5zdGFuY2Ugb2YgdGhlIGVudGl0eSAgCgkqIEBwYXJhbSBtaXhlZFtdICRkYXRhIGFycmF5IGhhc2h0YWJsZQoJKi8gCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGFycmF5VG9FbnRpdHkoT3JtRW50aXR5ICRlbnRpdHksICRkYXRhKSB7CgkJZm9yZWFjaCgkZW50aXR5LT5nZXRGaWVsZHMoKSBhcyAkZmllbGQpIHsKCQkJaWYoaXNzZXQoJGRhdGFbJGZpZWxkLT5nZXROYW1lKCldKSkgewoJCQkJJGVudGl0eS0+c2V0KCRmaWVsZC0+Z2V0TmFtZSgpLCAkZGF0YVskZmllbGQtPmdldE5hbWUoKV0pOwoJCQl9CgkJfQoJfQoKCS8qKgoJICogUmV0dXJuIGEgdW5pcXVlIGVuY29kaW5nIGZvciB0aGUgbGlzdCBvZiBrZXkuCgkgKiBGb3Igbm93IHNpbXBseSBhbiBKc29uIEVuY29kaW5nCgkgKgoJICogQHBhcmFtIG1peGVkW10gJHByaW1hcnlLZXlzVmFsdWUgbGlzdCBvZiB0aGUgdmFsdWVzIG9mIGVhY2ggcHJpbWFyeWtleQoJICoKCSAqIEByZXR1cm4gc3RyaW5nIHNlY3VyaXplZCBoYXNoIGZvciB0aGUgZW50aXR5IChqc29uKQoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdlbmVyYXRlUFVJRChhcnJheSAkcHJpbWFyeUtleXNWYWx1ZSl7CgkJCgkJJHB1aWQgPSBqc29uX2VuY29kZSgkcHJpbWFyeUtleXNWYWx1ZSk7CgoJCXJldHVybiAkcHVpZDsKCX0KfQoKPz4=]]></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+R2V0TmFtZSgpID09PSBzZWxmOjpHZXROYW1lKCkpewoJCQkkZGlyID0gcGFyZW50OjpHZXRNb2R1bGVQYXRoKCkuJy9saWIvJzsgCgkJCSRsaWJzID0gc2NhbmRpciAoICRkaXIgKTsKCgkJCS8vRklYTUUgOiB0cnkgdG8gYXZvaWQgY29uZmxpY3QgZHVyaW5nIGxvYWRpbmcgY2xhc3MgIHh4IGV4dGVuZHMgeXkKCQkJc29ydCgkbGlicyk7CgoJCQlmb3JlYWNoICgkbGlicyBhcyAkbGlicmFpcnkpIHsKCQkJCWlmKCRsaWJyYWlyeSAhPT0gJy4nICYmICRsaWJyYWlyeSAhPT0gJy4uJyApewoJCQkJCXJlcXVpcmVfb25jZSgkZGlyLiRsaWJyYWlyeSk7CgkJCQl9CgkJCX0KCQl9IGVsc2UgewoJCQkkdGhpcy0+c2NhbigpOwoJCX0KCX0KCglmdW5jdGlvbiBHZXROYW1lKCkgewoJCXJldHVybiAnT3JtJzsKCX0KCglmdW5jdGlvbiBHZXRGcmllbmRseU5hbWUoKSB7CgkJcmV0dXJuICR0aGlzLT5MYW5nKCdmcmllbmRseW5hbWUnKTsKCX0KCglmdW5jdGlvbiBHZXRWZXJzaW9uKCkgewoJCXJldHVybiAnMC4zLjEnOwoJfQogIAoJZnVuY3Rpb24gR2V0RGVwZW5kZW5jaWVzKCkKIAl7CiAgICAJcmV0dXJuIGFycmF5KCk7Cgl9CgoJZnVuY3Rpb24gR2V0SGVscCgpIHsKCQlyZXR1cm4gJHRoaXMtPkxhbmcoJ2hlbHAnKTsKCX0KCglmdW5jdGlvbiBHZXRBdXRob3IoKSB7CgkJcmV0dXJuICdLZXZpbiBEYW5lemlzIChha2EgQmVzcyknOwoJfQoKCWZ1bmN0aW9uIEdldEF1dGhvckVtYWlsKCkgewoJCXJldHVybiAnY29udGFjdCBhdCBmdXJpZSBwb2ludCBiZSc7Cgl9CgoJZnVuY3Rpb24gR2V0Q2hhbmdlTG9nKCkgewoJCXJldHVybiAkdGhpcy0+TGFuZygnY2hhbmdlbG9nJyk7Cgl9CgoJZnVuY3Rpb24gR2V0QWRtaW5EZXNjcmlwdGlvbigpIHsKCQlyZXR1cm4gJHRoaXMtPkxhbmcoJ21vZGRlc2NyaXB0aW9uJyk7Cgl9CgoJZnVuY3Rpb24gTWluaW11bUNNU1ZlcnNpb24oKSB7CgkJcmV0dXJuICIxLjExLjAiOwoJfQoKCWZ1bmN0aW9uIElzUGx1Z2luTW9kdWxlKCkgewoJCXJldHVybiBmYWxzZTsKCX0KCglmdW5jdGlvbiBIYXNBZG1pbigpIHsKCQlyZXR1cm4gdHJ1ZTsKCX0KCglmdW5jdGlvbiBHZXRBZG1pblNlY3Rpb24oKSB7CgkJcmV0dXJuICdleHRlbnNpb25zJzsKCX0KCglmdW5jdGlvbiBWaXNpYmxlVG9BZG1pblVzZXIoKSB7CgkJcmV0dXJuICR0aGlzLT5DaGVja1Blcm1pc3Npb24oJ01hbmFnZV9Pcm0nKTsKCX0KCglmdW5jdGlvbiBJbml0aWFsaXplRnJvbnRlbmQoKSB7Cgl9CgoJZnVuY3Rpb24gSW5pdGlhbGl6ZUFkbWluKCkgewoJfQoKCWZ1bmN0aW9uIEFsbG93U21hcnR5Q2FjaGluZygpIHsKCQlyZXR1cm4gZmFsc2U7Cgl9CgoJZnVuY3Rpb24gTGF6eUxvYWRGcm9udGVuZCgpIHsKCQlyZXR1cm4gZmFsc2U7Cgl9CgoJZnVuY3Rpb24gTGF6eUxvYWRBZG1pbigpIHsKCSAgcmV0dXJuIGZhbHNlOwoJfQoJCglmdW5jdGlvbiBJbnN0YWxsUG9zdE1lc3NhZ2UoKSB7CgkJcmV0dXJuICR0aGlzLT5MYW5nKCdwb3N0aW5zdGFsbCcpOwoJfQoKCWZ1bmN0aW9uIFVuaW5zdGFsbFBvc3RNZXNzYWdlKCkgewoJCXJldHVybiAkdGhpcy0+TGFuZygncG9zdHVuaW5zdGFsbCcpOwoJfQoKCWZ1bmN0aW9uIFVuaW5zdGFsbFByZU1lc3NhZ2UoKSB7CgkJcmV0dXJuICR0aGlzLT5MYW5nKCdyZWFsbHlfdW5pbnN0YWxsJyk7Cgl9ICAKCQoJZnVuY3Rpb24gRGlzcGxheUVycm9yUGFnZSgkbXNnKSB7CgkJZWNobyAiPGgzPiIuJG1zZy4iPC9oMz4iOwoJfSAKCQkgCglwcml2YXRlIGZ1bmN0aW9uIEdldE15TW9kdWxlUGF0aCgpIHsKCQlyZXR1cm4gcGFyZW50OjpHZXRNb2R1bGVQYXRoKCk7CQkKCX0KCgkvKioKCSAqIFdpbGwgZm91bmQgZXZlcnkgRW50aXR5IGZvciB0aGUgY3VycmVudCBtb2R1bGUgYW5kIHJldHVybiB0aGUgbGlzdGUgb2YgdGhlaXIgbmFtZQoJICoKCSAqIEByZXR1cm4gQXJyYXk8U3RyaW5nPiBhIGxpc3Qgb2YgbmFtZSBvZiBlbnRpdGllcyBmb3VuZGVkCgkgKgoJICoqLwoJcHJvdGVjdGVkIGZ1bmN0aW9uIHNjYW4oKXsKCgkJLy9XZSdyZSBsaXN0aW5nIHRoZSBjbGFzcyBkZWNsYXJlZCBpbnRvIHRoZSBkaXJlY3Rvcnkgb2YgdGhlIGNoaWxkIG1vZHVsZQoJCSRkaXIgPSBjbXNfam9pbl9wYXRoKHBhcmVudDo6R2V0TW9kdWxlUGF0aCgpLCdsaWInKTsKCgkJJGxpc3RlWydlbnRpdGllcyddID0gYXJyYXkoKTsKCQkkbGlzdGVbJ2Fzc29jaWF0ZSddID0gYXJyYXkoKTsKCQkKCQkkb2JqZWN0cyA9IG5ldyBSZWN1cnNpdmVJdGVyYXRvckl0ZXJhdG9yKG5ldyBSZWN1cnNpdmVEaXJlY3RvcnlJdGVyYXRvcigkZGlyKSk7CgkJZm9yZWFjaCgkb2JqZWN0cyBhcyAkbmFtZSA9PiAkb2JqZWN0KXsKCQkJaWYoc3RyaXBvcygkbmFtZSwgJ2NsYXNzLmVudGl0eS4nKSAhPT0gRkFMU0UpewkJCQoJCQkJJGNsYXNzbmFtZSA9IHN1YnN0cigkb2JqZWN0LT5nZXRGaWxlTmFtZSgpICwgMTMgLHN0cmxlbigkb2JqZWN0LT5nZXRGaWxlTmFtZSgpKSAtIDQgLSAxMyk7CgkJCQkkbGlzdGVbJ2VudGl0aWVzJ11bXSA9IGFycmF5KCdmaWxlbmFtZSc9PiRuYW1lLCAnYmFzZW5hbWUnPT4kb2JqZWN0LT5nZXRGaWxlTmFtZSgpLCAnY2xhc3NuYW1lJz0+JGNsYXNzbmFtZSk7CgkJCX0gZWxzZWlmKHN0cmlwb3MoJG5hbWUsICdjbGFzcy5hc3NvYy4nKSAhPT0gRkFMU0UpIHsKCQkJCSRjbGFzc25hbWUgPSBzdWJzdHIoJG9iamVjdC0+Z2V0RmlsZU5hbWUoKSAsIDEyICxzdHJsZW4oJG9iamVjdC0+Z2V0RmlsZU5hbWUoKSkgLSA0IC0gMTIpOwoJCQkJJGxpc3RlWydhc3NvY2lhdGUnXVtdID0gYXJyYXkoJ2ZpbGVuYW1lJz0+JG5hbWUsICdiYXNlbmFtZSc9PiRvYmplY3QtPmdldEZpbGVOYW1lKCksICdjbGFzc25hbWUnPT4kY2xhc3NuYW1lKTsKCQkJfSBlbHNlIHsKCQkJfQoJCX0KCgkJJGVycm9ycyA9IGFycmF5KCk7CgkJCgkJZm9yZWFjaCgkbGlzdGVbJ2VudGl0aWVzJ10gYXMgJGVsZW1lbnQpIHsKCQkJJGNsYXNzTmFtZSA9ICRlbGVtZW50WydjbGFzc25hbWUnXTsKCQkJJGZpbGVuYW1lID0gJGVsZW1lbnRbJ2ZpbGVuYW1lJ107CgkJCWlmKCFjbGFzc19leGlzdHMoJGNsYXNzTmFtZSkpewoJCQkJT3JtVHJhY2U6OmRlYnVnKCJpbXBvcnRpbmcgRW50aXR5ICIuJGNsYXNzTmFtZS4iIGludG8gdGhlIG1vZHVsZSAiLiR0aGlzLT5nZXROYW1lKCkpOwoJCQkJcmVxdWlyZV9vbmNlKCRmaWxlbmFtZSk7CQoJCQkJdHJ5ewoJCQkJCSRlbnRpdHkgPSBuZXcgJGNsYXNzTmFtZSgpOwoJCQkJfSBjYXRjaChPcm1JbGxlZ2FsQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiAkb2NlKXsKCQkJCQkkZXJyb3JzWyRjbGFzc05hbWVdID0gJG9jZTsKCQkJCQljb250aW51ZTsKCQkJCX0KCQkJfQoJCX0KCgkJZm9yZWFjaCgkbGlzdGVbJ2Fzc29jaWF0ZSddIGFzICRlbGVtZW50KSB7CgkJCSRjbGFzc05hbWUgPSAkZWxlbWVudFsnY2xhc3NuYW1lJ107CgkJCSRmaWxlbmFtZSA9ICRlbGVtZW50WydmaWxlbmFtZSddOwoJCQlpZighY2xhc3NfZXhpc3RzKCRjbGFzc05hbWUpKXsKCQkJCU9ybVRyYWNlOjpkZWJ1ZygiaW1wb3J0aW5nIEFzc29jaWF0ZSBFbnRpdHkgIi4kY2xhc3NOYW1lLiIgaW50byB0aGUgbW9kdWxlICIuJHRoaXMtPmdldE5hbWUoKSk7CgkJCQlyZXF1aXJlX29uY2UoJGZpbGVuYW1lKTsKCQkJCSRlbnRpdHkgPSBuZXcgJGNsYXNzTmFtZSgpOwoJCQl9CgkJfQoKCQkvL1Byb2Nlc3MgYWxsIHRoZSBlcnJvcnMKCQlpZighZW1wdHkoJGVycm9ycykpewoJCQllY2hvICc8aDMgc3R5bGU9ImNvbG9yOiNGMDAiPlNvbWUgT3JtSWxsZWdhbENvbmZpZ3VyYXRpb25FeGNlcHRpb24gaGF2ZSBiZWVuIHRocm93bjwvaDM+JzsKCQkJCgkJCWZvcmVhY2ggKCRlcnJvcnMgYXMgJGNsYXNzTmFtZSA9PiAkZXJyb3IpIHsKCQkJCWVjaG8gJzxoND5FbnRpdHkgJy4kY2xhc3NOYW1lLicgPC9oND48b2w+JzsKCQkJCWZvcmVhY2ggKCRlcnJvci0+Z2V0TWVzc2FnZXMoKSBhcyAkbWVzc2FnZSkgewoJCQkJCWVjaG8gJzxsaT4nLiRtZXNzYWdlLic8L2xpPic7CgkJCQl9CgkJCQllY2hvICc8L29sPic7CgkJCX0KCQkJCgkJCWV4aXQ7CgkJfQoKCQlyZXR1cm4gJGxpc3RlOwoJfQoJLyoKCXB1YmxpYyBmdW5jdGlvbiBhdXRvbG9hZF9mcmFtZXdvcmsoJGNsYXNzbmFtZSl7CgkJZWNobyAiYXV0b2xvYWRfZnJhbWV3b3JrKCRjbGFzc25hbWUpIjsKCQkJCQoJCS8vJE9ybSA9IG5ldyBPcm0oKTsKCQkvLyRwYXRoID0gJE9ybS0+R2V0TXlNb2R1bGVQYXRoKCk7CgkJJHBhdGggPSBwYXJlbnQ6OkdldE1vZHVsZVBhdGgoKTsKCQkkZm4gPSBjbXNfam9pbl9wYXRoKCRwYXRoLCJsaWIiLCJjbGFzcy4iLiRjbGFzc25hbWUuIi5waHAiKTsKCQkKCQlpZihmaWxlX2V4aXN0cygkZm4pKXsKCQkJcmVxdWlyZV9vbmNlKCRmbik7CgkJCXJldHVybjsKCQl9IAoJfSovCgkKCS8qKgoJICogU2hvcnRjdXQgdG8gY2FsbCBhbGwgdGhlIGluc3RhbmNlcyBmb3IgYSBzaW5nbGUgbW9kdWxlCgkgKgoJICogQHJldHVybiBMaXN0PE9ybUVudGl0eT4gdGhlIGVudGl0aWVzIGZvciB0aGUgY3VycmVudCBwYXJlbnQncyBuYW1lc3BhY2UKCSAqKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRBbGxJbnN0YW5jZXMoKXsKCQlyZXR1cm4gTXlBdXRvbG9hZDo6Z2V0QWxsSW5zdGFuY2VzKHBhcmVudDo6R2V0TmFtZSgpKTsKCX0KCS8qCglwdWJsaWMgZnVuY3Rpb24gYXV0b2xvYWRfY2xhc3Nlc19hZGRvbigkY2xhc3NuYW1lKXsKCQlPcm1UcmFjZTo6ZGVidWcoIiZuYnNwOyZuYnNwOyZuYnNwOyRjbGFzc25hbWUiKTsKCQkKCQkkcGF0aCA9ICR0aGlzLT5HZXRNeU1vZHVsZVBhdGgoKTsKCQkKCQkkZm4gPSBudWxsOwoJICAgaWYoc3RyaXBvcygkY2xhc3NuYW1lLCAiSFRNTF9GSUVMRCIpICE9PSBGQUxTRSkKCSAgIHsKCQkJJGZuID0gY21zX2pvaW5fcGF0aCgkcGF0aCwiY2xhc3MiLCJjbGFzcy5hZGQuZmllbGRodG1sLnBocCIpOwoJICAgfSBlbHNlIGlmKHN0cmlwb3MoJGNsYXNzbmFtZSwgIlNFQVJDSF9GSUVMRCIpICE9PSBGQUxTRSkKCSAgIHsKCQkJJGZuID0gY21zX2pvaW5fcGF0aCgkcGF0aCwiY2xhc3MiLCJjbGFzcy5hZGQuc2VhcmNoZmllbGQucGhwIik7CgkgICB9IGVsc2UgaWYoc3RyaXBvcygkY2xhc3NuYW1lLCAiRklFTERfIikgIT09IEZBTFNFKQoJICAgewoJCQkkZm4gPSBjbXNfam9pbl9wYXRoKCRwYXRoLCJjbGFzcyIsImNsYXNzLmFkZC5maWVsZHNzeXN0ZW0ucGhwIik7CgkgICB9IGVsc2UgaWYoc3RyaXBvcygkY2xhc3NuYW1lLCAiRklMVFJFXyIpICE9PSBGQUxTRSkKCSAgIHsKCQkJJGZuID0gY21zX2pvaW5fcGF0aCgkcGF0aCwiY2xhc3MiLCJjbGFzcy5hZGQuZmlsdHJlLnBocCIpOwoJICAgfQoJICAgCgkgICBpZigkZm4gIT0gbnVsbCkKCSAgIHsKCQkJT3JtVHJhY2U6OmRlYnVnKCAiaW1wb3J0IGQndW4gYWRkb24gZHUgcHJvamV0ICIuJHRoaXMtPmdldE5hbWUoKS4iOiAkZm4iKTsKCSAgIAoJCQlpZihmaWxlX2V4aXN0cygkZm4pKXsKCQkJCXJlcXVpcmVfb25jZSgkZm4pOwoJCQl9CgkJfQoJfSovCgkvKgoJZnVuY3Rpb24gU2VhcmNoUmVpbmRleCgmJG1vZHVsZSA9IG51bGwpIHsKCQkvL09uIMOpdml0ZSBkZSBzJ2F1dG8taW5kZXhlci4KCQlpZigkdGhpcy0+Z2V0TmFtZSgpID09ICdNbW1mcycpCgkJCXJldHVybjsJCQoJCQkKCQkvLyBPcm1JbmRleGluZzo6c2V0U2VhcmNoKCRtb2R1bGUpOwoJCU9ybUluZGV4aW5nOjpTZWFyY2hSZWluZGV4KCR0aGlzLT5nZXROYW1lKCkpOwoJfSovCgoJLyoqCgkgKiBBcHBlbMOpZSBwYXIgU2VhcmNoIHBvdXIgYWZmaWNoZXIgdW4gcsOpc3VsdGF0CgkgKi8vKgoJZnVuY3Rpb24gU2VhcmNoUmVzdWx0KCRyZXR1cm5pZCwgJGVudGl0eUlkLCAkYXR0ciA9ICcnKSB7CQoJCS8vT24gbmUgcmV0b3VybmUgcmllbiBkZSBNbW1mcyBkZSB0b3V0ZSBtYW5pw6hyZQoJCWlmKCR0aGlzLT5nZXROYW1lKCkgPT0gJ01tbWZzJykKCQkJcmV0dXJuOwkKCQkKCQlyZXR1cm4gT3JtSW5kZXhpbmc6OlNlYXJjaFJlc3VsdCgkdGhpcywgJGlkLCAkcmV0dXJuaWQsICRlbnRpdHlJZCwgJGF0dHIpOwoJfSovCgp9IAo/Pgo=]]></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>
