PD9waHAKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLyBGaWxlOglKUEdSQVBIX0dBTlRULlBIUAovLyBEZXNjcmlwdGlvbjoJSnBHcmFwaCBHYW50dCBwbG90IGV4dGVuc2lvbgovLyBDcmVhdGVkOiAJMjAwMS0xMS0xMgovLyBBdXRob3I6CUpvaGFuIFBlcnNzb24gKGpvaGFucEBhZGl0dXMubnUpCi8vIFZlcjoJCSRJZCQKLy8KLy8gQ29weXJpZ2h0IChjKSBBZGl0dXMgQ29uc3VsdGluZy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKi8KCnJlcXVpcmVfb25jZSgnanBncmFwaF9wbG90YmFuZC5waHAnKTsgCnJlcXVpcmVfb25jZSgnanBncmFwaF9pY29ucGxvdC5waHAnKTsgCnJlcXVpcmVfb25jZSgnanBncmFwaF9wbG90bWFyay5pbmMnKTsKCi8vIE1heGltdW0gc2l6ZSBmb3IgQXV0b21hdGljIEdhbnR0IGNoYXJ0CkRFRklORSgnTUFYX0dBTlRUSU1HX1NJWkVfVycsNDAwMCk7CkRFRklORSgnTUFYX0dBTlRUSU1HX1NJWkVfSCcsNTAwMCk7CgovLyBTY2FsZSBIZWFkZXIgdHlwZXMKREVGSU5FKCJHQU5UVF9IREFZIiwxKTsKREVGSU5FKCJHQU5UVF9IV0VFSyIsMik7CkRFRklORSgiR0FOVFRfSE1PTlRIIiw0KTsKREVGSU5FKCJHQU5UVF9IWUVBUiIsOCk7CkRFRklORSgiR0FOVFRfSEhPVVIiLDE2KTsKREVGSU5FKCJHQU5UVF9ITUlOIiwzMik7CgovLyBCYXIgcGF0dGVybnMKREVGSU5FKCJHQU5UVF9SRElBRyIsQkFORF9SRElBRyk7CS8vIFJpZ2h0IGRpYWdvbmFsIGxpbmVzCkRFRklORSgiR0FOVFRfTERJQUciLEJBTkRfTERJQUcpOyAvLyBMZWZ0IGRpYWdvbmFsIGxpbmVzCkRFRklORSgiR0FOVFRfU09MSUQiLEJBTkRfU09MSUQpOyAvLyBTb2xpZCBvbmUgY29sb3IKREVGSU5FKCJHQU5UVF9WTElORSIsQkFORF9WTElORSk7IC8vIFZlcnRpY2FsIGxpbmVzCkRFRklORSgiR0FOVFRfSExJTkUiLEJBTkRfSExJTkUpOyAgLy8gSG9yaXpvbnRhbCBsaW5lcwpERUZJTkUoIkdBTlRUXzNEUExBTkUiLEJBTkRfM0RQTEFORSk7ICAvLyAiM0QiIFBsYW5lCkRFRklORSgiR0FOVFRfSFZDUk9TUyIsQkFORF9IVkNST1NTKTsgIC8vIFZlcnRpY2FsL0hvciBjcm9zc2VzCkRFRklORSgiR0FOVFRfRElBR0NST1NTIixCQU5EX0RJQUdDUk9TUyk7IC8vIERpYWdvbmFsIGNyb3NzZXMKCi8vIENvbnZlcnNpb24gY29uc3RhbnQKREVGSU5FKCJTRUNQRVJEQVkiLDM2MDAqMjQpOwoKLy8gTG9jYWxlcy4gT05MWSBLRVBUIEZPUiBCQUNLV0FSRFMgQ09NUEFUSUJJTElUWQovLyBZb3Ugc2hvdWxkIHVzZSB0aGUgcHJvcGVyIGxvY2FsZSBzdHJpbmdzIGRpcmVjdGx5IAovLyBmcm9tIG5vdyBvbi4gCkRFRklORSgiTE9DQUxFX0VOIiwiZW5fVUsiKTsKREVGSU5FKCJMT0NBTEVfU1YiLCJzdl9TRSIpOwoKLy8gTGF5b3V0IG9mIGJhcnMKREVGSU5FKCJHQU5UVF9FVkVOIiwxKTsKREVGSU5FKCJHQU5UVF9GUk9NVE9QIiwyKTsKCi8vIFN0eWxlIGZvciBtaW51dGUgaGVhZGVyCkRFRklORSgiTUlOVVRFU1RZTEVfTU0iLDApOwkJLy8gMTUKREVGSU5FKCJNSU5VVEVTVFlMRV9DVVNUT00iLDIpOwkJLy8gQ3VzdG9tIGZvcm1hdAoKCi8vIFN0eWxlIGZvciBob3VyIGhlYWRlcgpERUZJTkUoIkhPVVJTVFlMRV9ITTI0IiwwKTsJCS8vIDEzOjEwCkRFRklORSgiSE9VUlNUWUxFX0hNQU1QTSIsMSk7CQkvLyAxOjEwcG0KREVGSU5FKCJIT1VSU1RZTEVfSDI0IiwyKTsJCS8vIDEzCkRFRklORSgiSE9VUlNUWUxFX0hBTVBNIiwzKTsJCS8vIDFwbQpERUZJTkUoIkhPVVJTVFlMRV9DVVNUT00iLDQpOwkJLy8gVXNlciBkZWZpbmVkCgovLyBTdHlsZSBmb3IgZGF5IGhlYWRlcgpERUZJTkUoIkRBWVNUWUxFX09ORUxFVFRFUiIsMCk7CQkvLyAiTSIKREVGSU5FKCJEQVlTVFlMRV9MT05HIiwxKTsJCS8vICJNb25kYXkiCkRFRklORSgiREFZU1RZTEVfTE9OR0RBWURBVEUxIiwyKTsJLy8gIk1vbmRheSAyMyBKdW4iCkRFRklORSgiREFZU1RZTEVfTE9OR0RBWURBVEUyIiwzKTsJLy8gIk1vbmRheSAyMyBKdW4gMjAwMyIKREVGSU5FKCJEQVlTVFlMRV9TSE9SVCIsNCk7CQkvLyAiTW9uIgpERUZJTkUoIkRBWVNUWUxFX1NIT1JUREFZREFURTEiLDUpOwkvLyAiTW9uIDIzLzYiCkRFRklORSgiREFZU1RZTEVfU0hPUlREQVlEQVRFMiIsNik7CS8vICJNb24gMjMgSnVuIgpERUZJTkUoIkRBWVNUWUxFX1NIT1JUREFZREFURTMiLDcpOwkvLyAiTW9uIDIzIgpERUZJTkUoIkRBWVNUWUxFX1NIT1JUREFURTEiLDgpOwkvLyAiMjMvNiIKREVGSU5FKCJEQVlTVFlMRV9TSE9SVERBVEUyIiw5KTsJLy8gIjIzIEp1biIKREVGSU5FKCJEQVlTVFlMRV9TSE9SVERBVEUzIiwxMCk7CS8vICJNb24gMjMiCkRFRklORSgiREFZU1RZTEVfU0hPUlREQVRFNCIsMTEpOwkvLyAiMjMiCkRFRklORSgiREFZU1RZTEVfQ1VTVE9NIiwxMik7CQkvLyAiTSIKCi8vIFN0eWxlcyBmb3Igd2VlayBoZWFkZXIKREVGSU5FKCJXRUVLU1RZTEVfV05CUiIsMCk7CkRFRklORSgiV0VFS1NUWUxFX0ZJUlNUREFZIiwxKTsKREVGSU5FKCJXRUVLU1RZTEVfRklSU1REQVkyIiwyKTsKREVGSU5FKCJXRUVLU1RZTEVfRklSU1REQVlXTkJSIiwzKTsKREVGSU5FKCJXRUVLU1RZTEVfRklSU1REQVkyV05CUiIsNCk7CgovLyBTdHlsZXMgZm9yIG1vbnRoIGhlYWRlcgpERUZJTkUoIk1PTlRIU1RZTEVfU0hPUlROQU1FIiwwKTsKREVGSU5FKCJNT05USFNUWUxFX0xPTkdOQU1FIiwxKTsKREVGSU5FKCJNT05USFNUWUxFX0xPTkdOQU1FWUVBUjIiLDIpOwpERUZJTkUoIk1PTlRIU1RZTEVfU0hPUlROQU1FWUVBUjIiLDMpOwpERUZJTkUoIk1PTlRIU1RZTEVfTE9OR05BTUVZRUFSNCIsNCk7CkRFRklORSgiTU9OVEhTVFlMRV9TSE9SVE5BTUVZRUFSNCIsNSk7CkRFRklORSgiTU9OVEhTVFlMRV9GSVJTVExFVFRFUiIsNik7CgoKLy8gVHlwZXMgb2YgY29uc3RyYWluIGxpbmtzCkRFRklORSgnQ09OU1RSQUlOX1NUQVJUU1RBUlQnLDApOwpERUZJTkUoJ0NPTlNUUkFJTl9TVEFSVEVORCcsMSk7CkRFRklORSgnQ09OU1RSQUlOX0VORFNUQVJUJywyKTsKREVGSU5FKCdDT05TVFJBSU5fRU5ERU5EJywzKTsKCi8vIEFycm93IGRpcmVjdGlvbiBmb3IgY29uc3RyYWluIGxpbmtzCkRFRklORSgnQVJST1dfRE9XTicsMCk7CkRFRklORSgnQVJST1dfVVAnLDEpOwpERUZJTkUoJ0FSUk9XX0xFRlQnLDIpOwpERUZJTkUoJ0FSUk9XX1JJR0hUJywzKTsKCi8vIEFycm93IHR5cGUgZm9yIGNvbnN0cmFpbiB0eXBlCkRFRklORSgnQVJST1dUX1NPTElEJywwKTsKREVGSU5FKCdBUlJPV1RfT1BFTicsMSk7CgovLyBBcnJvdyBzaXplIGZvciBjb25zdHJhaW4gbGluZXMKREVGSU5FKCdBUlJPV19TMScsMCk7CkRFRklORSgnQVJST1dfUzInLDEpOwpERUZJTkUoJ0FSUk9XX1MzJywyKTsKREVGSU5FKCdBUlJPV19TNCcsMyk7CkRFRklORSgnQVJST1dfUzUnLDQpOwoKLy8gQWN0aXZpdHkgdHlwZXMgZm9yIHVzZSB3aXRoIHV0aWxpdHkgbWV0aG9kIENyZWF0ZVNpbXBsZSgpCkRFRklORSgnQUNUWVBFX05PUk1BTCcsMCk7CkRFRklORSgnQUNUWVBFX0dST1VQJywxKTsKREVGSU5FKCdBQ1RZUEVfTUlMRVNUT05FJywyKTsKCkRFRklORSgnQUNUSU5GT18zRCcsMSk7CkRFRklORSgnQUNUSU5GT18yRCcsMCk7CgoKLy8gQ2hlY2sgaWYgYXJyYXlfZmlsbCgpIGV4aXN0cwppZiAoIWZ1bmN0aW9uX2V4aXN0cygnYXJyYXlfZmlsbCcpKSB7CiAgICBmdW5jdGlvbiBhcnJheV9maWxsKCRpU3RhcnQsICRpTGVuLCAkdlZhbHVlKSB7CgkkYVJlc3VsdCA9IGFycmF5KCk7Cglmb3IgKCRpQ291bnQgPSAkaVN0YXJ0OyAkaUNvdW50IDwgJGlMZW4gKyAkaVN0YXJ0OyAkaUNvdW50KyspIHsKCSAgICAkYVJlc3VsdFskaUNvdW50XSA9ICR2VmFsdWU7Cgl9CglyZXR1cm4gJGFSZXN1bHQ7CiAgICB9Cn0KCi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci8vIENMQVNTIEdhbnR0QWN0aXZpdHlJbmZvCi8vIERlc2NyaXB0aW9uOiAKLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KY2xhc3MgR2FudHRBY3Rpdml0eUluZm8gewogICAgdmFyICRpQ29sb3I9J2JsYWNrJzsKICAgIHZhciAkaUJhY2tncm91bmRDb2xvcj0nbGlnaHRncmF5JzsKICAgIHZhciAkaUZGYW1pbHk9RkZfRk9OVDEsJGlGU3R5bGU9RlNfTk9STUFMLCRpRlNpemU9MTAsJGlGb250Q29sb3I9J2JsYWNrJzsKICAgIHZhciAkaVRpdGxlcz1hcnJheSgpOwogICAgdmFyICRpV2lkdGg9YXJyYXkoKSwkaUhlaWdodD0tMTsKICAgIHZhciAkaUxlZnRDb2xNYXJnaW49NCwkaVJpZ2h0Q29sTWFyZ2luPTEsJGlUb3BDb2xNYXJnaW49MSwkaUJvdHRvbUNvbE1hcmdpbj0zOwogICAgdmFyICRpVG9wSGVhZGVyTWFyZ2luID0gNDsKICAgIHZhciAkdmdyaWQgPSBudWxsOwogICAgdmFyICRpU3R5bGU9MTsKICAgIHZhciAkaVNob3c9dHJ1ZTsKICAgIHZhciAkaUhlYWRlckFsaWduPSdjZW50ZXInOwoKICAgIGZ1bmN0aW9uIEdhbnR0QWN0aXZpdHlJbmZvKCkgewoJJHRoaXMtPnZncmlkID0gbmV3IExpbmVQcm9wZXJ0eSgpOwogICAgfQoKICAgIGZ1bmN0aW9uIEhpZGUoJGFGPXRydWUpIHsKCSR0aGlzLT5pU2hvdz0hJGFGOwogICAgfQoKICAgIGZ1bmN0aW9uIFNob3coJGFGPXRydWUpIHsKCSR0aGlzLT5pU2hvdz0kYUY7CiAgICB9CgogICAgLy8gU3BlY2lmeSBmb250CiAgICBmdW5jdGlvbiBTZXRGb250KCRhRkZhbWlseSwkYUZTdHlsZT1GU19OT1JNQUwsJGFGU2l6ZT0xMCkgewoJJHRoaXMtPmlGRmFtaWx5ID0gJGFGRmFtaWx5OwoJJHRoaXMtPmlGU3R5bGUJID0gJGFGU3R5bGU7CgkkdGhpcy0+aUZTaXplCSA9ICRhRlNpemU7CiAgICB9CgogICAgZnVuY3Rpb24gU2V0U3R5bGUoJGFTdHlsZSkgewoJJHRoaXMtPmlTdHlsZSA9ICRhU3R5bGU7CiAgICB9CgogICAgZnVuY3Rpb24gU2V0Q29sdW1uTWFyZ2luKCRhTGVmdCwkYVJpZ2h0KSB7CgkkdGhpcy0+aUxlZnRDb2xNYXJnaW4gPSAkYUxlZnQ7CgkkdGhpcy0+aVJpZ2h0Q29sTWFyZ2luID0gJGFSaWdodDsKICAgIH0KCiAgICBmdW5jdGlvbiBTZXRGb250Q29sb3IoJGFGb250Q29sb3IpIHsKCSR0aGlzLT5pRm9udENvbG9yID0gJGFGb250Q29sb3I7CiAgICB9CgogICAgZnVuY3Rpb24gU2V0Q29sb3IoJGFDb2xvcikgewoJJHRoaXMtPmlDb2xvciA9ICRhQ29sb3I7CiAgICB9CgogICAgZnVuY3Rpb24gU2V0QmFja2dyb3VuZENvbG9yKCRhQ29sb3IpIHsKCSR0aGlzLT5pQmFja2dyb3VuZENvbG9yID0gJGFDb2xvcjsKICAgIH0KCiAgICBmdW5jdGlvbiBTZXRDb2xUaXRsZXMoJGFUaXRsZXMsJGFXaWR0aD1udWxsKSB7CgkkdGhpcy0+aVRpdGxlcyA9ICRhVGl0bGVzOwoJJHRoaXMtPmlXaWR0aCA9ICRhV2lkdGg7CiAgICB9CgogICAgZnVuY3Rpb24gU2V0TWluQ29sV2lkdGgoJGFXaWR0aHMpIHsKCSRuID0gbWluKGNvdW50KCR0aGlzLT5pVGl0bGVzKSxjb3VudCgkYVdpZHRocykpOwoJZm9yKCRpPTA7ICRpIDwgJG47ICsrJGkgKSB7CgkgICAgaWYoICFlbXB0eSgkYVdpZHRoc1skaV0pICkgewoJCWlmKCBlbXB0eSgkdGhpcy0+aVdpZHRoWyRpXSkgKSB7CgkJICAgICR0aGlzLT5pV2lkdGhbJGldID0gJGFXaWR0aHNbJGldOwoJCX0KCQllbHNlIHsKCQkgICAgJHRoaXMtPmlXaWR0aFskaV0gPSBtYXgoJHRoaXMtPmlXaWR0aFskaV0sJGFXaWR0aHNbJGldKTsKCQl9CgkgICAgfQoJfQogICAgfQoKICAgIGZ1bmN0aW9uIEdldFdpZHRoKCYkYUltZykgewoJJHR4dCA9IG5ldyBUZXh0UHJvcGVydHkoKTsKCSR0eHQtPlNldEZvbnQoJHRoaXMtPmlGRmFtaWx5LCR0aGlzLT5pRlN0eWxlLCR0aGlzLT5pRlNpemUpOwoJJG4gPSBjb3VudCgkdGhpcy0+aVRpdGxlcykgOwoJJHJtPSR0aGlzLT5pUmlnaHRDb2xNYXJnaW47CgkkdyA9IDA7Cglmb3IoJGg9MCwgJGk9MDsgJGkgPCAkbjsgKyskaSApIHsKCSAgICAkdyArPSAkdGhpcy0+aUxlZnRDb2xNYXJnaW47CgkgICAgJHR4dC0+U2V0KCR0aGlzLT5pVGl0bGVzWyRpXSk7CgkgICAgaWYoICFlbXB0eSgkdGhpcy0+aVdpZHRoWyRpXSkgKSB7CgkJJHcxID0gbWF4KCR0eHQtPkdldFdpZHRoKCRhSW1nKSskcm0sJHRoaXMtPmlXaWR0aFskaV0pOwoJICAgIH0KCSAgICBlbHNlIHsKCQkkdzEgPSAkdHh0LT5HZXRXaWR0aCgkYUltZykrJHJtOwoJICAgIH0KCSAgICAkdGhpcy0+aVdpZHRoWyRpXSA9ICR3MTsKCSAgICAkdyArPSAkdzE7CgkgICAgJGggPSBtYXgoJGgsJHR4dC0+R2V0SGVpZ2h0KCRhSW1nKSk7Cgl9CgkkdGhpcy0+aUhlaWdodCA9ICRoKyR0aGlzLT5pVG9wSGVhZGVyTWFyZ2luOwogICAgICAgICR0eHQ9Jyc7CglyZXR1cm4gJHc7CiAgICB9CiAgICAKICAgIGZ1bmN0aW9uIEdldENvbFN0YXJ0KCYkYUltZywmJGlvU3RhcnQsJGFBZGRMZWZ0TWFyZ2luPWZhbHNlKSB7CgkkbiA9IGNvdW50KCR0aGlzLT5pVGl0bGVzKSA7CgkkYWRqID0gJGFBZGRMZWZ0TWFyZ2luID8gJHRoaXMtPmlMZWZ0Q29sTWFyZ2luIDogMDsKCSRpb1N0YXJ0PWFycmF5KCRhSW1nLT5sZWZ0X21hcmdpbiskYWRqKTsKCWZvciggJGk9MTsgJGkgPCAkbjsgKyskaSApIHsKCSAgICAkaW9TdGFydFskaV0gPSAkaW9TdGFydFskaS0xXSskdGhpcy0+aUxlZnRDb2xNYXJnaW4rJHRoaXMtPmlXaWR0aFskaS0xXTsKCX0KICAgIH0KICAgIAogICAgLy8gQWRqdXN0IGhlYWRlcnMgbGVmdCwgcmlnaHQgb3IgY2VudGVyZWQKICAgIGZ1bmN0aW9uIFNldEhlYWRlckFsaWduKCRhQWxpZ24pIHsKCSR0aGlzLT5pSGVhZGVyQWxpZ249JGFBbGlnbjsKICAgIH0KCiAgICBmdW5jdGlvbiBTdHJva2UoJiRhSW1nLCRhWExlZnQsJGFZVG9wLCRhWFJpZ2h0LCRhWUJvdHRvbSwkYVVzZVRleHRIZWlnaHQ9ZmFsc2UpIHsKCglpZiggISR0aGlzLT5pU2hvdyApIHJldHVybjsKCgkkdHh0ID0gbmV3IFRleHRQcm9wZXJ0eSgpOwoJJHR4dC0+U2V0Rm9udCgkdGhpcy0+aUZGYW1pbHksJHRoaXMtPmlGU3R5bGUsJHRoaXMtPmlGU2l6ZSk7CgkkdHh0LT5TZXRDb2xvcigkdGhpcy0+aUZvbnRDb2xvcik7CgkkdHh0LT5TZXRBbGlnbigkdGhpcy0+aUhlYWRlckFsaWduLCd0b3AnKTsKCSRuPWNvdW50KCR0aGlzLT5pVGl0bGVzKTsKCglpZiggJG4gPT0gMCApIAoJICAgIHJldHVybjsKCQoJJHggPSAkYVhMZWZ0OwoJJGggPSAkdGhpcy0+aUhlaWdodDsKCSR5VG9wID0gJGFVc2VUZXh0SGVpZ2h0ID8gJGFZQm90dG9tLSRoLSR0aGlzLT5pVG9wQ29sTWFyZ2luLSR0aGlzLT5pQm90dG9tQ29sTWFyZ2luIDogJGFZVG9wIDsKCglpZiggJGggPCAwICkgewoJICAgIEpwR3JhcGhFcnJvcjo6UmFpc2VMKDYwMDEpOwovLygnSW50ZXJuYWwgZXJyb3IuIEhlaWdodCBmb3IgQWN0aXZpdHlUaXRsZXMgaXMgPCAwJyk7Cgl9CgoJJGFJbWctPlNldExpbmVXZWlnaHQoMSk7CgkvLyBTZXQgYmFja2dyb3VuZCBjb2xvcgoJJGFJbWctPlNldENvbG9yKCR0aGlzLT5pQmFja2dyb3VuZENvbG9yKTsKCSRhSW1nLT5GaWxsZWRSZWN0YW5nbGUoJGFYTGVmdCwkeVRvcCwkYVhSaWdodCwkYVlCb3R0b20tMSk7CgoJaWYoICR0aGlzLT5pU3R5bGUgPT0gMSApIHsKCSAgICAvLyBNYWtlIGEgM0QgZWZmZWN0CgkgICAgJGFJbWctPlNldENvbG9yKCd3aGl0ZScpOwoJICAgICRhSW1nLT5MaW5lKCRhWExlZnQsJHlUb3ArMSwKCQkJJGFYUmlnaHQsJHlUb3ArMSk7Cgl9CgkKCWZvcigkaT0wOyAkaSA8ICRuOyArKyRpICkgewoJICAgIGlmKCAkdGhpcy0+aVN0eWxlID09IDEgKSB7CgkJLy8gTWFrZSBhIDNEIGVmZmVjdAoJCSRhSW1nLT5TZXRDb2xvcignd2hpdGUnKTsKCQkkYUltZy0+TGluZSgkeCsxLCR5VG9wLCR4KzEsJGFZQm90dG9tKTsKCSAgICB9CgkgICAgJHggKz0gJHRoaXMtPmlMZWZ0Q29sTWFyZ2luOwoJICAgICR0eHQtPlNldCgkdGhpcy0+aVRpdGxlc1skaV0pOwoJICAgIAoJICAgIC8vIEFkanVzdCB0aGUgdGV4dCBhbmNob3IgcG9zaXRpb24gYWNjb3JkaW5nIHRvIHRoZSBjaG9vc2VuIGFsaWdubWVudAoJICAgICR4cCA9ICR4OwoJICAgIGlmKCAkdGhpcy0+aUhlYWRlckFsaWduID09ICdjZW50ZXInICkgewoJCSR4cCA9ICgoJHgtJHRoaXMtPmlMZWZ0Q29sTWFyZ2luKSsoJHgrJHRoaXMtPmlXaWR0aFskaV0pKS8yOwoJICAgIH0KCSAgICBlbHNlaWYoICR0aGlzLT5pSGVhZGVyQWxpZ24gPT0gJ3JpZ2h0JyApIHsKCQkkeHAgPSAkeCArJHRoaXMtPmlXaWR0aFskaV0tJHRoaXMtPmlSaWdodENvbE1hcmdpbjsKCSAgICB9CgkJICAgIAoJICAgICR0eHQtPlN0cm9rZSgkYUltZywkeHAsJHlUb3ArJHRoaXMtPmlUb3BIZWFkZXJNYXJnaW4pOwoJICAgICR4ICs9ICR0aGlzLT5pV2lkdGhbJGldOwoJICAgIGlmKCAkaSA8ICRuLTEgKSB7CgkJJGFJbWctPlNldENvbG9yKCR0aGlzLT5pQ29sb3IpOwoJCSRhSW1nLT5MaW5lKCR4LCR5VG9wLCR4LCRhWUJvdHRvbSk7CgkgICAgfQoJfQoKCSRhSW1nLT5TZXRDb2xvcigkdGhpcy0+aUNvbG9yKTsKCSRhSW1nLT5MaW5lKCRhWExlZnQsJHlUb3AsICRhWFJpZ2h0LCR5VG9wKTsKCgkvLyBTdHJva2UgdmVydGljYWwgY29sdW1uIGRpdmlkZXJzCgkkY29scz1hcnJheSgpOwoJJHRoaXMtPkdldENvbFN0YXJ0KCRhSW1nLCRjb2xzKTsKCSRuPWNvdW50KCRjb2xzKTsKCWZvciggJGk9MTsgJGkgPCAkbjsgKyskaSApIHsKCSAgICAkdGhpcy0+dmdyaWQtPlN0cm9rZSgkYUltZywkY29sc1skaV0sJGFZQm90dG9tLCRjb2xzWyRpXSwKCQkJCSAgICAkYUltZy0+aGVpZ2h0IC0gJGFJbWctPmJvdHRvbV9tYXJnaW4pOwoJfQogICAgfQp9CgoKLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8gQ0xBU1MgR2FudHRHcmFwaAovLyBEZXNjcmlwdGlvbjogTWFpbiBjbGFzcyB0byBoYW5kbGUgZ2FudHQgZ3JhcGhzCi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CmNsYXNzIEdhbnR0R3JhcGggZXh0ZW5kcyBHcmFwaCB7CiAgICB2YXIgJHNjYWxlOwkJCQkJCQkvLyBQdWJsaWMgYWNjZXNzaWJsZQogICAgdmFyICRpT2JqPWFycmF5KCk7CQkJCS8vIEdhbnR0IG9iamVjdHMKICAgIHZhciAkaUxhYmVsSE1hcmdpbkZhY3Rvcj0wLjI7CS8vIDEwJSBtYXJnaW4gb24gZWFjaCBzaWRlIG9mIHRoZSBsYWJlbHMKICAgIHZhciAkaUxhYmVsVk1hcmdpbkZhY3Rvcj0wLjQ7CS8vIDQwJSBtYXJnaW4gb24gdG9wIGFuZCBib3R0b20gb2YgbGFiZWwKICAgIHZhciAkaUxheW91dD1HQU5UVF9GUk9NVE9QOwkvLyBDb3VsZCBhbHNvIGJlIEdBTlRUX0VWRU4KICAgIHZhciAkaVNpbXBsZUZvbnQgPSBGRl9GT05UMSwkaVNpbXBsZUZvbnRTaXplPTExOwogICAgdmFyICRpU2ltcGxlU3R5bGU9R0FOVFRfUkRJQUcsJGlTaW1wbGVDb2xvcj0neWVsbG93JywkaVNpbXBsZUJrZ0NvbG9yPSdyZWQnOwogICAgdmFyICRpU2ltcGxlUHJvZ3Jlc3NCa2dDb2xvcj0nZ3JheScsJGlTaW1wbGVQcm9ncmVzc0NvbG9yPSdkYXJrZ3JlZW4nOwogICAgdmFyICRpU2ltcGxlUHJvZ3Jlc3NTdHlsZT1HQU5UVF9TT0xJRDsKICAgIHZhciAkaGdyaWQ9bnVsbDsKLy8tLS0tLS0tLS0tLS0tLS0KLy8gQ09OU1RSVUNUT1IJCiAgICAvLyBDcmVhdGUgYSBuZXcgZ2FudHQgZ3JhcGgKICAgIGZ1bmN0aW9uIEdhbnR0R3JhcGgoJGFXaWR0aD0wLCRhSGVpZ2h0PTAsJGFDYWNoZWROYW1lPSIiLCRhVGltZU91dD0wLCRhSW5saW5lPXRydWUpIHsKCgkvLyBCYWNrd2FyZCBjb21wYXRpYmlsaXR5CglpZiggJGFXaWR0aCA9PSAtMSApICRhV2lkdGg9MDsKCWlmKCAkYUhlaWdodCA9PSAtMSApICRhSGVpZ2h0PTA7CgoJaWYoICRhV2lkdGg8ICAwIHx8ICRhSGVpZ2h0IDwgMCApIHsKCSAgICBKcGdyYXBoRXJyb3I6OlJhaXNlTCg2MDAyKTsKLy8oIllvdSBjYW4ndCBzcGVjaWZ5IG5lZ2F0aXZlIHNpemVzIGZvciBHYW50dCBncmFwaCBkaW1lbnNpb25zLiBVc2UgMCB0byBpbmRpY2F0ZSB0aGF0IHlvdSB3YW50IHRoZSBsaWJyYXJ5IHRvIGF1dG9tYXRpY2FsbHkgZGV0ZXJtaW5lIGEgZGltZW5zaW9uLiIpOwoJfQoJR3JhcGg6OkdyYXBoKCRhV2lkdGgsJGFIZWlnaHQsJGFDYWNoZWROYW1lLCRhVGltZU91dCwkYUlubGluZSk7CQkKCSR0aGlzLT5zY2FsZSA9IG5ldyBHYW50dFNjYWxlKCR0aGlzLT5pbWcpOwoKCS8vIERlZmF1bHQgbWFyZ2lucwoJJHRoaXMtPmltZy0+U2V0TWFyZ2luKDE1LDE3LDI1LDE1KTsKCgkkdGhpcy0+aGdyaWQgPSBuZXcgSG9yaXpvbnRhbEdyaWRMaW5lKCk7CgkJCgkkdGhpcy0+c2NhbGUtPlNob3dIZWFkZXJzKEdBTlRUX0hXRUVLfEdBTlRUX0hEQVkpOwoJJHRoaXMtPlNldEJveCgpOwogICAgfQoJCi8vLS0tLS0tLS0tLS0tLS0tCi8vIFBVQkxJQyBNRVRIT0RTCgogICAgLy8gCgogICAgZnVuY3Rpb24gU2V0U2ltcGxlRm9udCgkYUZvbnQsJGFTaXplKSB7CgkkdGhpcy0+aVNpbXBsZUZvbnQgPSAkYUZvbnQ7CgkkdGhpcy0+aVNpbXBsZUZvbnRTaXplID0gJGFTaXplOwogICAgfQoKICAgIGZ1bmN0aW9uIFNldFNpbXBsZVN0eWxlKCRhQmFuZCwkYUNvbG9yLCRhQmtnQ29sb3IpIHsKCSR0aGlzLT5pU2ltcGxlU3R5bGUgPSAkYUJhbmQ7CgkkdGhpcy0+aVNpbXBsZUNvbG9yID0gJGFDb2xvcjsKCSR0aGlzLT5pU2ltcGxlQmtnQ29sb3IgPSAkYUJrZ0NvbG9yOwogICAgfQoKICAgIC8vIEEgdXRpbGl0eSBmdW5jdGlvbiB0byBoZWxwIGNyZWF0ZSBiYXNpYyBHYW50dCBjaGFydHMKICAgIGZ1bmN0aW9uIENyZWF0ZVNpbXBsZSgkZGF0YSwkY29uc3RyYWlucz1hcnJheSgpLCRwcm9ncmVzcz1hcnJheSgpKSB7CgkkbnVtID0gY291bnQoJGRhdGEpOwoJZm9yKCAkaT0wOyAkaSA8ICRudW07ICsrJGkpIHsKCSAgICBzd2l0Y2goICRkYXRhWyRpXVsxXSApIHsKCQljYXNlIEFDVFlQRV9HUk9VUDoKCQkgICAgLy8gQ3JlYXRlIGEgc2xpZ2h0bHkgc21hbGxlciBoZWlnaHQgYmFyIHNpbmNlIHRoZQoJCSAgICAvLyAid2luZ3MiIGF0IHRoZSBlbmQgd2lsbCBtYWtlIGl0IGxvb2sgdGFsbGVyCgkJICAgICRhID0gbmV3IEdhbnR0QmFyKCRkYXRhWyRpXVswXSwkZGF0YVskaV1bMl0sJGRhdGFbJGldWzNdLCRkYXRhWyRpXVs0XSwnJyw4KTsKCQkgICAgJGEtPnRpdGxlLT5TZXRGb250KCR0aGlzLT5pU2ltcGxlRm9udCxGU19CT0xELCR0aGlzLT5pU2ltcGxlRm9udFNpemUpOwkJCgkJICAgICRhLT5yaWdodE1hcmstPlNob3coKTsKCQkgICAgJGEtPnJpZ2h0TWFyay0+U2V0VHlwZShNQVJLX1JJR0hUVFJJQU5HTEUpOwoJCSAgICAkYS0+cmlnaHRNYXJrLT5TZXRXaWR0aCg4KTsKCQkgICAgJGEtPnJpZ2h0TWFyay0+U2V0Q29sb3IoJ2JsYWNrJyk7CgkJICAgICRhLT5yaWdodE1hcmstPlNldEZpbGxDb2xvcignYmxhY2snKTsKCSAgICAKCQkgICAgJGEtPmxlZnRNYXJrLT5TaG93KCk7CgkJICAgICRhLT5sZWZ0TWFyay0+U2V0VHlwZShNQVJLX0xFRlRUUklBTkdMRSk7CgkJICAgICRhLT5sZWZ0TWFyay0+U2V0V2lkdGgoOCk7CgkJICAgICRhLT5sZWZ0TWFyay0+U2V0Q29sb3IoJ2JsYWNrJyk7CgkJICAgICRhLT5sZWZ0TWFyay0+U2V0RmlsbENvbG9yKCdibGFjaycpOwoJICAgIAoJCSAgICAkYS0+U2V0UGF0dGVybihCQU5EX1NPTElELCdibGFjaycpOwoJCSAgICAkY3NpbXBvcyA9IDY7CgkJICAgIGJyZWFrOwoJCQoJCWNhc2UgQUNUWVBFX05PUk1BTDoKCQkgICAgJGEgPSBuZXcgR2FudHRCYXIoJGRhdGFbJGldWzBdLCRkYXRhWyRpXVsyXSwkZGF0YVskaV1bM10sJGRhdGFbJGldWzRdLCcnLDEwKTsKCQkgICAgJGEtPnRpdGxlLT5TZXRGb250KCR0aGlzLT5pU2ltcGxlRm9udCxGU19OT1JNQUwsJHRoaXMtPmlTaW1wbGVGb250U2l6ZSk7CgkJICAgICRhLT5TZXRQYXR0ZXJuKCR0aGlzLT5pU2ltcGxlU3R5bGUsJHRoaXMtPmlTaW1wbGVDb2xvcik7CgkJICAgICRhLT5TZXRGaWxsQ29sb3IoJHRoaXMtPmlTaW1wbGVCa2dDb2xvcik7CgkJICAgIC8vIENoZWNrIGlmIHRoaXMgYWN0aXZpdHkgc2hvdWxkIGhhdmUgYSBjb25zdHJhaW4gbGluZQoJCSAgICAkbiA9IGNvdW50KCRjb25zdHJhaW5zKTsKCQkgICAgZm9yKCAkaj0wOyAkaiA8ICRuOyArKyRqICkgewoJCQlpZiggZW1wdHkoJGNvbnN0cmFpbnNbJGpdKSB8fCAoY291bnQoJGNvbnN0cmFpbnNbJGpdKSAhPSAzKSApIHsKCQkJICAgIEpwR3JhcGhFcnJvcjo6UmFpc2VMKDYwMDMsJGopOwovLygiSW52YWxpZCBmb3JtYXQgZm9yIENvbnN0cmFpbiBwYXJhbWV0ZXIgYXQgaW5kZXg9JGogaW4gQ3JlYXRlU2ltcGxlKCkuIFBhcmFtZXRlciBtdXN0IHN0YXJ0IHdpdGggaW5kZXggMCBhbmQgY29udGFpbiBhcnJheXMgb2YgKFJvdyxDb25zdHJhaW4tVG8sQ29uc3RyYWluLVR5cGUpIik7CSAKCQkJfQoJCQlpZiggJGNvbnN0cmFpbnNbJGpdWzBdPT0kZGF0YVskaV1bMF0gKSB7CgkJCSAgICAkYS0+U2V0Q29uc3RyYWluKCRjb25zdHJhaW5zWyRqXVsxXSwkY29uc3RyYWluc1skal1bMl0sJ2JsYWNrJyxBUlJPV19TMixBUlJPV1RfU09MSUQpOyAgICAKCQkJfQoJCSAgICB9CgoJCSAgICAvLyBDaGVjayBpZiB0aGlzIGFjdGl2aXR5IGhhdmUgYSBwcm9ncmVzcyBiYXIKCQkgICAgJG4gPSBjb3VudCgkcHJvZ3Jlc3MpOwoJCSAgICBmb3IoICRqPTA7ICRqIDwgJG47ICsrJGogKSB7CgkJCQoJCQlpZiggZW1wdHkoJHByb2dyZXNzWyRqXSkgfHwgKGNvdW50KCRwcm9ncmVzc1skal0pICE9IDIpICkgewoJCQkgICAgSnBHcmFwaEVycm9yOjpSYWlzZUwoNjAwNCwkaik7Ci8vKCJJbnZhbGlkIGZvcm1hdCBmb3IgUHJvZ3Jlc3MgcGFyYW1ldGVyIGF0IGluZGV4PSRqIGluIENyZWF0ZVNpbXBsZSgpLiBQYXJhbWV0ZXIgbXVzdCBzdGFydCB3aXRoIGluZGV4IDAgYW5kIGNvbnRhaW4gYXJyYXlzIG9mIChSb3csUHJvZ3Jlc3MpIik7CQoJCQl9CgkJCWlmKCAkcHJvZ3Jlc3NbJGpdWzBdPT0kZGF0YVskaV1bMF0gKSB7CgkJCSAgICAkYS0+cHJvZ3Jlc3MtPlNldCgkcHJvZ3Jlc3NbJGpdWzFdKTsKCQkJICAgICRhLT5wcm9ncmVzcy0+U2V0SGVpZ2h0KDAuNSk7CgkJCSAgICAkYS0+cHJvZ3Jlc3MtPlNldFBhdHRlcm4oJHRoaXMtPmlTaW1wbGVQcm9ncmVzc1N0eWxlLAoJCQkJCQkgICAgICR0aGlzLT5pU2ltcGxlUHJvZ3Jlc3NDb2xvcik7CgkJCSAgICAkYS0+cHJvZ3Jlc3MtPlNldEZpbGxDb2xvcigkdGhpcy0+aVNpbXBsZVByb2dyZXNzQmtnQ29sb3IpOwoJCQkgICAgLy8kYS0+cHJvZ3Jlc3MtPlNldFBhdHRlcm4oJHByb2dyZXNzWyRqXVsyXSwkcHJvZ3Jlc3NbJGpdWzNdKTsKCQkJICAgIGJyZWFrOwoJCQl9CgkJICAgIH0KCQkgICAgJGNzaW1wb3MgPSA2OwoJCSAgICBicmVhazsKCgkJY2FzZSBBQ1RZUEVfTUlMRVNUT05FOgoJCSAgICAkYSA9IG5ldyBNaWxlU3RvbmUoJGRhdGFbJGldWzBdLCRkYXRhWyRpXVsyXSwkZGF0YVskaV1bM10pOwoJCSAgICAkYS0+dGl0bGUtPlNldEZvbnQoJHRoaXMtPmlTaW1wbGVGb250LEZTX05PUk1BTCwkdGhpcy0+aVNpbXBsZUZvbnRTaXplKTsKCQkgICAgJGEtPmNhcHRpb24tPlNldEZvbnQoJHRoaXMtPmlTaW1wbGVGb250LEZTX05PUk1BTCwkdGhpcy0+aVNpbXBsZUZvbnRTaXplKTsKCQkgICAgJGNzaW1wb3MgPSA1OwoJCSAgICBicmVhazsKCQlkZWZhdWx0OgoJCSAgICBkaWUoJ1Vua25vd24gYWN0aXZpdHkgdHlwZScpOwoJCSAgICBicmVhazsKCSAgICB9CgoJICAgIC8vIFNldHVwIGNhcHRpb24KCSAgICAkYS0+Y2FwdGlvbi0+U2V0KCRkYXRhWyRpXVskY3NpbXBvcy0xXSk7CgoJICAgIC8vIENoZWNrIGlmIHRoaXMgYWN0aXZpdHkgc2hvdWxkIGhhdmUgYSBDU0lNIHRhcmdldKA/CgkgICAgaWYoICFlbXB0eSgkZGF0YVskaV1bJGNzaW1wb3NdKSApIHsKCQkkYS0+U2V0Q1NJTVRhcmdldCgkZGF0YVskaV1bJGNzaW1wb3NdKTsKCQkkYS0+U2V0Q1NJTUFsdCgkZGF0YVskaV1bJGNzaW1wb3MrMV0pOwoJICAgIH0KCSAgICBpZiggIWVtcHR5KCRkYXRhWyRpXVskY3NpbXBvcysyXSkgKSB7CgkJJGEtPnRpdGxlLT5TZXRDU0lNVGFyZ2V0KCRkYXRhWyRpXVskY3NpbXBvcysyXSk7CgkJJGEtPnRpdGxlLT5TZXRDU0lNQWx0KCRkYXRhWyRpXVskY3NpbXBvcyszXSk7CgkgICAgfQoKCSAgICAkdGhpcy0+QWRkKCRhKTsKCX0KICAgIH0KCgkKICAgIC8vIFNldCB3aGF0IGhlYWRlcnMgc2hvdWxkIGJlIHNob3duCiAgICBmdW5jdGlvbiBTaG93SGVhZGVycygkYUZsZykgewoJJHRoaXMtPnNjYWxlLT5TaG93SGVhZGVycygkYUZsZyk7CiAgICB9CgkKICAgIC8vIFNwZWNpZnkgdGhlIGZyYWN0aW9uIG9mIHRoZSBmb250IGhlaWdodCB0aGF0IHNob3VsZCBiZSBhZGRlZCAKICAgIC8vIGFzIHZlcnRpY2FsIG1hcmdpbgogICAgZnVuY3Rpb24gU2V0TGFiZWxWTWFyZ2luRmFjdG9yKCRhVmFsKSB7CgkkdGhpcy0+aUxhYmVsVk1hcmdpbkZhY3RvciA9ICRhVmFsOwogICAgfQoKICAgIC8vIFN5bm9ueW0gdG8gdGhlIG1ldGhvZCBhYm92ZQogICAgZnVuY3Rpb24gU2V0Vk1hcmdpbkZhY3RvcigkYVZhbCkgewoJJHRoaXMtPmlMYWJlbFZNYXJnaW5GYWN0b3IgPSAkYVZhbDsKICAgIH0KCQoJCiAgICAvLyBBZGQgYSBuZXcgR2FudHQgb2JqZWN0CiAgICBmdW5jdGlvbiBBZGQoJGFPYmplY3QpIHsKCWlmKCBpc19hcnJheSgkYU9iamVjdCkgJiYgY291bnQoJGFPYmplY3QpID4gMCApIHsKCSAgICAkY2wgPSAkYU9iamVjdFswXTsKCSAgICBpZiggaXNfYSgkY2wsJ0ljb25QbG90JykgKSB7CgkJJHRoaXMtPkFkZEljb24oJGFPYmplY3QpOwoJICAgIH0KCSAgICBlbHNlIHsKCQkkbiA9IGNvdW50KCRhT2JqZWN0KTsKCQlmb3IoJGk9MDsgJGkgPCAkbjsgKyskaSkKCQkgICAgJHRoaXMtPmlPYmpbXSA9ICRhT2JqZWN0WyRpXTsKCSAgICB9Cgl9CgllbHNlIHsKCSAgICBpZiggaXNfYSgkYU9iamVjdCwnSWNvblBsb3QnKSApIHsKCQkkdGhpcy0+QWRkSWNvbigkYU9iamVjdCk7CgkgICAgfQoJICAgIGVsc2UgewkgICAgCgkJJHRoaXMtPmlPYmpbXSA9ICRhT2JqZWN0OwoJICAgIH0KCX0KICAgIH0KCiAgICAvLyBPdmVycmlkZSBpbmhlcml0IG1ldGhvZCBmcm9tIEdyYXBoIGFuZCBnaXZlIGEgd2FybmluZyBtZXNzYWdlCiAgICBmdW5jdGlvbiBTZXRTY2FsZSgpIHsKCUpwR3JhcGhFcnJvcjo6UmFpc2VMKDYwMDUpOwovLygiU2V0U2NhbGUoKSBpcyBub3QgbWVhbmluZ2Z1bGwgd2l0aCBHYW50dCBjaGFydHMuIik7CiAgICB9CgogICAgLy8gU3BlY2lmeSB0aGUgZGF0ZSByYW5nZSBmb3IgR2FudHQgZ3JhcGhzIChpZiB0aGlzIGlzIG5vdCBzZXQgaXQgd2lsbCBiZQogICAgLy8gYXV0b210aWNhbGx5IGRldGVybWluZWQgZnJvbSB0aGUgaW5wdXQgZGF0YSkKICAgIGZ1bmN0aW9uIFNldERhdGVSYW5nZSgkYVN0YXJ0LCRhRW5kKSB7CgkvLyBBZGp1c3QgdGhlIHN0YXJ0IGFuZCBlbmQgc28gdGhhdCB0aGUgaW5kaWNhdGUgdGhlCgkvLyBiZWdpbmluZyBhbmQgZW5kIG9mIHJlc3BlY3RpdmUgc3RhcnQgYW5kIGVuZCBkYXlzCglpZiggc3RycG9zKCRhU3RhcnQsJzonKSA9PT0gZmFsc2UgKQoJICAgICRhU3RhcnQgPSBkYXRlKCdZLW0tZCAwMDowMCcsc3RydG90aW1lKCRhU3RhcnQpKTsKCWlmKCBzdHJwb3MoJGFFbmQsJzonKSA9PT0gZmFsc2UgKQoJICAgICRhRW5kID0gZGF0ZSgnWS1tLWQgMjM6NTknLHN0cnRvdGltZSgkYUVuZCkpOwoJJHRoaXMtPnNjYWxlLT5TZXRSYW5nZSgkYVN0YXJ0LCRhRW5kKTsKICAgIH0KCQogICAgLy8gR2V0IHRoZSBtYXhpbXVtIHdpZHRoIG9mIHRoZSBhY3Rpdml0eSB0aXRsZXMgY29sdW1ucyBmb3IgdGhlIGJhcnMKICAgIC8vIFRoZSBuYW1lIGlzIGxpZ2h0bHkgbWlzbGVhZGluZyBzaW5jZSB3ZSBmcm9tIG5vdyBvbiBjYW4gaGF2ZQogICAgLy8gbXVsdGlwbGUgY29sdW1ucyBpbiB0aGUgbGFiZWwgc2VjdGlvbi4gV2hlbiB0aGlzIHdhcyBmaXJzdCB3cml0dGVuCiAgICAvLyBpdCBvbmx5IHN1cHBvcnRlZCBhIHNpbmdsZSBsYWJlbCwgaGVuY2UgdGhlIG5hbWUuCiAgICBmdW5jdGlvbiBHZXRNYXhMYWJlbFdpZHRoKCkgewoJJG09NTA7CglpZiggJHRoaXMtPmlPYmogIT0gbnVsbCApIHsKCSAgICAkbWFyZyA9ICR0aGlzLT5zY2FsZS0+YWN0aW5mby0+aUxlZnRDb2xNYXJnaW4rJHRoaXMtPnNjYWxlLT5hY3RpbmZvLT5pUmlnaHRDb2xNYXJnaW47CgkgICAgJG0gPSAkdGhpcy0+aU9ialswXS0+dGl0bGUtPkdldFdpZHRoKCR0aGlzLT5pbWcpKyRtYXJnOwoJICAgICRuID0gY291bnQoJHRoaXMtPmlPYmopOwoJICAgIGZvcigkaT0xOyAkaSA8ICRuOyArKyRpKSB7CgkJaWYoICFlbXB0eSgkdGhpcy0+aU9ialskaV0tPnRpdGxlKSApIHsKCQkgICAgaWYoICR0aGlzLT5pT2JqWyRpXS0+dGl0bGUtPkhhc1RhYnMoKSApIHsKCQkJbGlzdCgkdG90LCR3KSA9ICR0aGlzLT5pT2JqWyRpXS0+dGl0bGUtPkdldFdpZHRoKCR0aGlzLT5pbWcsdHJ1ZSk7CgkJCSRtPW1heCgkbSwkdG90KTsKCQkgICAgfQoJCSAgICBlbHNlIAoJCQkkbT1tYXgoJG0sJHRoaXMtPmlPYmpbJGldLT50aXRsZS0+R2V0V2lkdGgoJHRoaXMtPmltZykpOwoJCX0KCSAgICB9Cgl9CglyZXR1cm4gJG07CiAgICB9CgkKICAgIC8vIEdldCB0aGUgbWF4aW11bSBoZWlnaHQgb2YgdGhlIHRpdGxlcyBmb3IgdGhlIGJhcnMKICAgIGZ1bmN0aW9uIEdldE1heExhYmVsSGVpZ2h0KCkgewoJJG09MDsKCWlmKCAkdGhpcy0+aU9iaiAhPSBudWxsICkgewoJICAgICRtID0gJHRoaXMtPmlPYmpbMF0tPnRpdGxlLT5HZXRIZWlnaHQoJHRoaXMtPmltZyk7CgkgICAgJG4gPSBjb3VudCgkdGhpcy0+aU9iaik7CgkgICAgZm9yKCRpPTE7ICRpIDwgJG47ICsrJGkpIHsKCQlpZiggIWVtcHR5KCR0aGlzLT5pT2JqWyRpXS0+dGl0bGUpICkgewoJCSAgICAkbT1tYXgoJG0sJHRoaXMtPmlPYmpbJGldLT50aXRsZS0+R2V0SGVpZ2h0KCR0aGlzLT5pbWcpKTsKCQl9CgkgICAgfQoJfQoJcmV0dXJuICRtOwogICAgfQoKICAgIGZ1bmN0aW9uIEdldE1heEJhckFic0hlaWdodCgpIHsKCSRtPTA7CglpZiggJHRoaXMtPmlPYmogIT0gbnVsbCApIHsKCSAgICAkbSA9ICR0aGlzLT5pT2JqWzBdLT5HZXRBYnNIZWlnaHQoJHRoaXMtPmltZyk7CgkgICAgJG4gPSBjb3VudCgkdGhpcy0+aU9iaik7CgkgICAgZm9yKCRpPTE7ICRpIDwgJG47ICsrJGkpIHsKCQkkbT1tYXgoJG0sJHRoaXMtPmlPYmpbJGldLT5HZXRBYnNIZWlnaHQoJHRoaXMtPmltZykpOwoJICAgIH0KCX0KCXJldHVybiAkbTsJCQogICAgfQoJCiAgICAvLyBHZXQgdGhlIG1heGltdW0gdXNlZCBsaW5lIG51bWJlciAodmVydGljYWwgcG9zaXRpb24pIGZvciBiYXJzCiAgICBmdW5jdGlvbiBHZXRCYXJNYXhMaW5lTnVtYmVyKCkgewoJJG09MDsKCWlmKCAkdGhpcy0+aU9iaiAhPSBudWxsICkgewoJICAgICRtID0gJHRoaXMtPmlPYmpbMF0tPkdldExpbmVOYnIoKTsKCSAgICAkbiA9IGNvdW50KCR0aGlzLT5pT2JqKTsKCSAgICBmb3IoJGk9MTsgJGkgPCAkbjsgKyskaSkgewoJCSRtPW1heCgkbSwkdGhpcy0+aU9ialskaV0tPkdldExpbmVOYnIoKSk7CgkgICAgfQoJfQoJcmV0dXJuICRtOwogICAgfQoJCiAgICAvLyBHZXQgdGhlIG1pbnVtdW0gYW5kIG1heGltdW0gdXNlZCBkYXRlcyBmb3IgYWxsIGJhcnMKICAgIGZ1bmN0aW9uIEdldEJhck1pbk1heCgpIHsKCSRzdGFydCA9IDAgOwoJJG4gPSBjb3VudCgkdGhpcy0+aU9iaik7CgoJd2hpbGUoICRzdGFydCA8ICRuICYmICR0aGlzLT5pT2JqWyRzdGFydF0tPkdldE1heERhdGUoKSA9PT0gZmFsc2UgKQoJICAgICsrJHN0YXJ0OwoJaWYoICRzdGFydCA+PSAkbiApIHsKCSAgICBKcGdyYXBoRXJyb3I6OlJhaXNlTCg2MDA2KTsKLy8oJ0Nhbm5vdCBhdXRvc2NhbGUgR2FudHQgY2hhcnQuIE5vIGRhdGVkIGFjdGl2aXRpZXMgZXhpc3QuIFtHZXRCYXJNaW5NYXgoKSBzdGFydCA+PSBuXScpOwoJfQoKCSRtYXg9JHRoaXMtPnNjYWxlLT5Ob3JtYWxpemVEYXRlKCR0aGlzLT5pT2JqWyRzdGFydF0tPkdldE1heERhdGUoKSk7CgkkbWluPSR0aGlzLT5zY2FsZS0+Tm9ybWFsaXplRGF0ZSgkdGhpcy0+aU9ialskc3RhcnRdLT5HZXRNaW5EYXRlKCkpOwoKCWZvcigkaT0kc3RhcnQrMTsgJGkgPCAkbjsgKyskaSkgewoJICAgICRybWF4ID0gJHRoaXMtPnNjYWxlLT5Ob3JtYWxpemVEYXRlKCR0aGlzLT5pT2JqWyRpXS0+R2V0TWF4RGF0ZSgpKTsKCSAgICBpZiggJHJtYXggIT0gZmFsc2UgKSAKCQkkbWF4PU1heCgkbWF4LCRybWF4KTsKCSAgICAkcm1pbiA9ICR0aGlzLT5zY2FsZS0+Tm9ybWFsaXplRGF0ZSgkdGhpcy0+aU9ialskaV0tPkdldE1pbkRhdGUoKSk7CgkgICAgaWYoICRybWluICE9IGZhbHNlICkgCgkJJG1pbj1NaW4oJG1pbiwkcm1pbik7Cgl9CgkkbWluRGF0ZSA9IGRhdGUoIlktbS1kIiwkbWluKTsKCSRtaW4gPSBzdHJ0b3RpbWUoJG1pbkRhdGUpOwoJJG1heERhdGUgPSBkYXRlKCJZLW0tZCAyMzo1OSIsJG1heCk7CgkkbWF4ID0gc3RydG90aW1lKCRtYXhEYXRlKTsJCglyZXR1cm4gYXJyYXkoJG1pbiwkbWF4KTsKICAgIH0KCiAgICAvLyBDcmVhdGUgYSBuZXcgYXV0byBzaXplZCBjYW52YXMgaWYgdGhlIHVzZXIgaGFzbid0IHNwZWNpZmllZCBhIHNpemUKICAgIC8vIFRoZSBzaXplIGlzIGRldGVybWluZWQgYnkgd2hhdCBzY2FsZSB0aGUgdXNlciBoYXMgY2hvb3NlbiBhbmQgaGVuY2UKICAgIC8vIHRoZSBtaW5pbXVtIHdpZHRoIG5lZWRlZCB0byBkaXNwbGF5IHRoZSBoZWFkZXJzLiBTb21lIG1hcmdpbnMgYXJlCiAgICAvLyBhbHNvIGFkZGVkIHRvIG1ha2UgaXQgYmV0dGVyIGxvb2tpbmcuCiAgICBmdW5jdGlvbiBBdXRvU2l6ZSgpIHsKCWlmKCAkdGhpcy0+aW1nLT5pbWcgPT0gbnVsbCApIHsKCSAgICAvLyBUaGUgcHJlZGVmaW5lZCBsZWZ0LCByaWdodCwgdG9wLCBib3R0b20gbWFyZ2lucy4KCSAgICAvLyBOb3RlIHRoYXQgdGhlIHRvcCBtYXJnaW4gbWlnaHQgaW5jZWFzZSBkZXBlbmRpbmcgb24KCSAgICAvLyB0aGUgdGl0bGUuCgkgICAgJGxtID0gJHRoaXMtPmltZy0+bGVmdF9tYXJnaW47IAoJICAgICRybSA9ICR0aGlzLT5pbWctPnJpZ2h0X21hcmdpbjsgCgkgICAgJHJtICs9IDIgOwoJICAgICR0bSA9ICR0aGlzLT5pbWctPnRvcF9tYXJnaW47IAoJICAgICRibSA9ICR0aGlzLT5pbWctPmJvdHRvbV9tYXJnaW47IAoJICAgICRibSArPSAxOyAKCSAgICBpZiggQlJBTkRfVElNSU5HICkgJGJtICs9IDEwOwoJCQkKCSAgICAvLyBGaXJzdCBmaW5kIG91dCB0aGUgaGVpZ2h0CQkJCgkgICAgJG49JHRoaXMtPkdldEJhck1heExpbmVOdW1iZXIoKSsxOwoJICAgICRtPW1heCgkdGhpcy0+R2V0TWF4TGFiZWxIZWlnaHQoKSwkdGhpcy0+R2V0TWF4QmFyQWJzSGVpZ2h0KCkpOwoJICAgICRoZWlnaHQ9JG4qKCgxKyR0aGlzLT5pTGFiZWxWTWFyZ2luRmFjdG9yKSokbSk7CQkJCgkJCQoJICAgIC8vIEFkZCB0aGUgaGVpZ2h0IG9mIHRoZSBzY2FsZSB0aXRsZXMJCQkKCSAgICAkaD0kdGhpcy0+c2NhbGUtPkdldEhlYWRlckhlaWdodCgpOwoJICAgICRoZWlnaHQgKz0gJGg7CgoJICAgIC8vIENhbGN1bGF0ZSB0aGUgdG9wIG1hcmdpbiBuZWVkZWQgZm9yIHRpdGxlIGFuZCBzdWJ0aXRsZQoJICAgIGlmKCAkdGhpcy0+dGl0bGUtPnQgIT0gIiIgKSB7CgkJJHRtICs9ICR0aGlzLT50aXRsZS0+R2V0Rm9udEhlaWdodCgkdGhpcy0+aW1nKTsKCSAgICB9CgkgICAgaWYoICR0aGlzLT5zdWJ0aXRsZS0+dCAhPSAiIiApIHsKCQkkdG0gKz0gJHRoaXMtPnN1YnRpdGxlLT5HZXRGb250SGVpZ2h0KCR0aGlzLT5pbWcpOwoJICAgIH0KCgkgICAgLy8gLi4uYW5kIHRoZW4gdGFrZSB0aGUgYm90dG9tIGFuZCB0b3AgcGxvdCBtYXJnaW5zIGludG8gYWNjb3VudAoJICAgICRoZWlnaHQgKz0gJHRtICsgJGJtICsgJHRoaXMtPnNjYWxlLT5pVG9wUGxvdE1hcmdpbiArICR0aGlzLT5zY2FsZS0+aUJvdHRvbVBsb3RNYXJnaW47CgkgICAgLy8gTm93IGZpbmQgdGhlIG1pbmltdW0gd2lkdGggZm9yIHRoZSBjaGFydCByZXF1aXJlZAoKCSAgICAvLyBJZiBkYXkgc2NhbGUgb3Igc21hbGxlciBpcyBzaG93biB0aGVuIHdlIHVzZSB0aGUgZGF5IGZvbnQgd2lkdGgKCSAgICAvLyBhcyB0aGUgYmFzZSBzaXplIHVuaXQuCgkgICAgLy8gSWYgb25seSB3ZWVrcyBvciBhYm92ZSBpcyBkaXNwbGF5ZWQgd2UgdXNlIGEgbW9kaWZpZWQgdW5pdCB0bwoJICAgIC8vIGdldCBhIHNtYWxsZXIgaW1hZ2UuCgkgICAgaWYoICR0aGlzLT5zY2FsZS0+SXNEaXNwbGF5SG91cigpIHx8ICR0aGlzLT5zY2FsZS0+SXNEaXNwbGF5TWludXRlKCkgKSB7CgkJLy8gQWRkIDIgcGl4ZWwgbWFyZ2luIG9uIGVhY2ggc2lkZQoJCSRmdz0kdGhpcy0+c2NhbGUtPmRheS0+R2V0Rm9udFdpZHRoKCR0aGlzLT5pbWcpKzQ7IAoJICAgIH0KCSAgICBlbHNlaWYoICR0aGlzLT5zY2FsZS0+SXNEaXNwbGF5V2VlaygpICkgewoJCSRmdyA9IDg7CgkgICAgfQoJICAgIGVsc2VpZiggJHRoaXMtPnNjYWxlLT5Jc0Rpc3BsYXlNb250aCgpICkgewoJCSRmdyA9IDQ7CgkgICAgfQoJICAgIGVsc2UgewoJCSRmdyA9IDI7CgkgICAgfQoKCSAgICAkbmQ9JHRoaXMtPnNjYWxlLT5HZXROdW1iZXJPZkRheXMoKTsKCgkgICAgaWYoICR0aGlzLT5zY2FsZS0+SXNEaXNwbGF5RGF5KCkgKSB7CgkJLy8gSWYgdGhlIGRheXMgYXJlIGRpc3BsYXllZCB3ZSBhbHNvIG5lZWQgdG8gZmlndXJlIG91dAoJCS8vIGhvdyBtdWNoIHNwYWNlIGVhY2ggZGF5J3MgdGl0bGUgd2lsbCByZXF1aXJlLgoJCXN3aXRjaCggJHRoaXMtPnNjYWxlLT5kYXktPmlTdHlsZSApIHsKCQkgICAgY2FzZSBEQVlTVFlMRV9MT05HIDoKCQkJJHR4dCA9ICJNb25kYXkiOwoJCQlicmVhazsKCQkgICAgY2FzZSBEQVlTVFlMRV9MT05HREFZREFURTEgOgoJCQkkdHh0ID0gICJNb25kYXkgMjMgSnVuIjsKCQkJYnJlYWs7CgkJICAgIGNhc2UgREFZU1RZTEVfTE9OR0RBWURBVEUyIDoKCQkJJHR4dCA9ICAiTW9uZGF5IDIzIEp1biAyMDAzIjsKCQkJYnJlYWs7CgkJICAgIGNhc2UgREFZU1RZTEVfU0hPUlQgOiAKCQkJJHR4dCA9ICAiTW9uIjsKCQkJYnJlYWs7CgkJICAgIGNhc2UgREFZU1RZTEVfU0hPUlREQVlEQVRFMSA6IAogICAgICAgICAgICAgICAgICAgICAgICAkdHh0ID0gICJNb24gMjMvNiI7CgkJCWJyZWFrOwoJCSAgICBjYXNlIERBWVNUWUxFX1NIT1JUREFZREFURTIgOgoJCQkkdHh0ID0gICJNb24gMjMgSnVuIjsKCQkJYnJlYWs7CgkJICAgIGNhc2UgREFZU1RZTEVfU0hPUlREQVlEQVRFMyA6CgkJCSR0eHQgPSAgIk1vbiAyMyI7CgkJCWJyZWFrOwoJCSAgICBjYXNlIERBWVNUWUxFX1NIT1JUREFURTEgOgogICAgICAgICAgICAgICAgICAgICAgICAkdHh0ID0gICIyMy82IjsKCQkJYnJlYWs7CgkJICAgIGNhc2UgREFZU1RZTEVfU0hPUlREQVRFMiA6CgkJCSR0eHQgPSAgIjIzIEp1biI7CgkJCWJyZWFrOwoJCSAgICBjYXNlIERBWVNUWUxFX1NIT1JUREFURTMgOgoJCQkkdHh0ID0gICJNb24gMjMiOwoJCQlicmVhazsKCQkgICAgY2FzZSBEQVlTVFlMRV9TSE9SVERBVEU0IDoKCQkJJHR4dCA9ICAiODgiOwoJCQlicmVhazsKCQkgICAgY2FzZSBEQVlTVFlMRV9DVVNUT00gOgoJCQkkdHh0ID0gZGF0ZSgkdGhpcy0+c2NhbGUtPmRheS0+aUxhYmVsRm9ybVN0ciwKCQkJCSAgICBzdHJ0b3RpbWUoJzIwMDMtMTItMjAgMTg6MDAnKSk7CgkJCWJyZWFrOwoJCSAgICBjYXNlIERBWVNUWUxFX09ORUxFVFRFUiA6CgkJICAgIGRlZmF1bHQ6CgkJCSR0eHQgPSAiTSI7CgkJCWJyZWFrOwoJCX0KCQkkZncgPSAkdGhpcy0+c2NhbGUtPmRheS0+R2V0U3RyV2lkdGgoJHRoaXMtPmltZywkdHh0KSs2OwoJICAgIH0KCgkgICAgLy8gSWYgd2UgaGF2ZSBob3VycyBlbmFibGVkIHdlIG11c3QgbWFrZSBzdXJlIHRoYXQgZWFjaCBkYXkgaGFzIGVub3VnaAoJICAgIC8vIHNwYWNlIHRvIGZpdCB0aGUgbnVtYmVyIG9mIGhvdXJzIHRvIGJlIGRpc3BsYXllZC4KCSAgICBpZiggJHRoaXMtPnNjYWxlLT5Jc0Rpc3BsYXlIb3VyKCkgKSB7CgkJLy8gRGVwZW5kaW5nIG9uIHdoYXQgZm9ybWF0IHRoZSB1c2VyIGhhcyBjaG9vc2Ugd2UgbmVlZCBkaWZmZXJlbnQgYW1vdW50CgkJLy8gb2Ygc3BhY2UuIFdlIHRoZXJlZm9yZSBjcmVhdGUgYSB0eXBpY2FsIHN0cmluZyBmb3IgdGhlIGNob29zZW4gZm9ybWF0CgkJLy8gYW5kIGRldGVybWluZSB0aGUgbGVuZ3RoIG9mIHRoYXQgc3RyaW5nLgoJCXN3aXRjaCggJHRoaXMtPnNjYWxlLT5ob3VyLT5pU3R5bGUgKSB7CgkJICAgIGNhc2UgSE9VUlNUWUxFX0hNQU1QTToKCQkJJHR4dCA9ICcxMjowMHBtJzsKCQkJYnJlYWs7CgkJICAgIGNhc2UgSE9VUlNUWUxFX0gyNDoKCQkJLy8gMTMKCQkJJHR4dCA9ICcyNCc7CgkJCWJyZWFrOwoJCSAgICBjYXNlIEhPVVJTVFlMRV9IQU1QTToKCQkJJHR4dCA9ICcxMnBtJzsKCQkJYnJlYWs7CgkJICAgIGNhc2UgSE9VUlNUWUxFX0NVU1RPTToKCQkJJHR4dCA9IGRhdGUoJHRoaXMtPnNjYWxlLT5ob3VyLT5pTGFiZWxGb3JtU3RyLHN0cnRvdGltZSgnMjAwMy0xMi0yMCAxODowMCcpKTsKCQkJYnJlYWs7CgkJICAgIGNhc2UgSE9VUlNUWUxFX0hNMjQ6CgkJICAgIGRlZmF1bHQ6CgkJCSR0eHQgPSAnMjQ6MDAnOwoJCQlicmVhazsKCQl9CgoJCSRoZncgPSAkdGhpcy0+c2NhbGUtPmhvdXItPkdldFN0cldpZHRoKCR0aGlzLT5pbWcsJHR4dCkrNjsKCQkkbXcgPSAkaGZ3OwoJCWlmKCAkdGhpcy0+c2NhbGUtPklzRGlzcGxheU1pbnV0ZSgpICkgewoJCSAgICAvLyBEZXBlbmRpbmcgb24gd2hhdCBmb3JtYXQgdGhlIHVzZXIgaGFzIGNob29zZSB3ZSBuZWVkIGRpZmZlcmVudCBhbW91bnQKCQkgICAgLy8gb2Ygc3BhY2UuIFdlIHRoZXJlZm9yZSBjcmVhdGUgYSB0eXBpY2FsIHN0cmluZyBmb3IgdGhlIGNob29zZW4gZm9ybWF0CgkJICAgIC8vIGFuZCBkZXRlcm1pbmUgdGhlIGxlbmd0aCBvZiB0aGF0IHN0cmluZy4KCQkgICAgc3dpdGNoKCAkdGhpcy0+c2NhbGUtPm1pbnV0ZS0+aVN0eWxlICkgewoJCQljYXNlIEhPVVJTVFlMRV9DVVNUT006CgkJCSAgICAkdHh0MiA9IGRhdGUoJHRoaXMtPnNjYWxlLT5taW51dGUtPmlMYWJlbEZvcm1TdHIsc3RydG90aW1lKCcyMDA1LTA1LTE1IDE4OjU1JykpOwoJCQkgICAgYnJlYWs7CgkJCWNhc2UgTUlOVVRFU1RZTEVfTU06CgkJCWRlZmF1bHQ6CgkJCSAgICAkdHh0MiA9ICcxNSc7CgkJCSAgICBicmVhazsKCQkgICAgfQoJCSAgICAKCQkgICAgJG1mdyA9ICR0aGlzLT5zY2FsZS0+bWludXRlLT5HZXRTdHJXaWR0aCgkdGhpcy0+aW1nLCR0eHQyKSs2OwoJCSAgICAkbjIgPSBjZWlsKDYwIC8gJHRoaXMtPnNjYWxlLT5taW51dGUtPkdldEludGVydmFsbCgpICk7CgkJICAgICRtdyA9ICRuMiAqICRtZnc7CgkJfQoJCSRoZncgPSAkaGZ3IDwgJG13ID8gJG13IDogJGhmdyA7ICAgCgkJJG4gPSBjZWlsKDI0KjYwIC8gJHRoaXMtPnNjYWxlLT5UaW1lVG9NaW51dGVzKCR0aGlzLT5zY2FsZS0+aG91ci0+R2V0SW50ZXJ2YWxsKCkpICk7CgkJJGh3ID0gJG4gKiAkaGZ3OwoJCSRmdyA9ICRmdyA8ICRodyA/ICRodyA6ICRmdyA7CgkgICAgfQoKCSAgICAvLyBXZSBuZWVkIHRvIHJlcGVhdCB0aGlzIGNvZGUgYmxvY2sgaGVyZSBhcyB3ZWxsLiAKCSAgICAvLyBUSElTIGlTIE5PVCBBIE1JU1RBS0UgIQoJICAgIC8vIFdlIHJlYWxseSBuZWVkIGl0IHNpbmNlIHdlIG5lZWQgdG8gYWRqdXN0IGZvciBtaW51dGVzIGJvdGggaW4gdGhlIGNhc2UKCSAgICAvLyB3aGVyZSBob3VyIHNjYWxlIGlzIHNob3duIGFuZCB3aGVuIGl0IGlzIG5vdCBzaG93bi4KCgkgICAgaWYoICR0aGlzLT5zY2FsZS0+SXNEaXNwbGF5TWludXRlKCkgKSB7CgkJLy8gRGVwZW5kaW5nIG9uIHdoYXQgZm9ybWF0IHRoZSB1c2VyIGhhcyBjaG9vc2Ugd2UgbmVlZCBkaWZmZXJlbnQgYW1vdW50CgkJLy8gb2Ygc3BhY2UuIFdlIHRoZXJlZm9yZSBjcmVhdGUgYSB0eXBpY2FsIHN0cmluZyBmb3IgdGhlIGNob29zZW4gZm9ybWF0CgkJLy8gYW5kIGRldGVybWluZSB0aGUgbGVuZ3RoIG9mIHRoYXQgc3RyaW5nLgoJCXN3aXRjaCggJHRoaXMtPnNjYWxlLT5taW51dGUtPmlTdHlsZSApIHsKCQkgICAgY2FzZSBIT1VSU1RZTEVfQ1VTVE9NOgoJCQkkdHh0ID0gZGF0ZSgkdGhpcy0+c2NhbGUtPm1pbnV0ZS0+aUxhYmVsRm9ybVN0cixzdHJ0b3RpbWUoJzIwMDUtMDUtMTUgMTg6NTUnKSk7CgkJCWJyZWFrOwoJCSAgICBjYXNlIE1JTlVURVNUWUxFX01NOgoJCSAgICBkZWZhdWx0OgoJCQkkdHh0ID0gJzE1JzsKCQkJYnJlYWs7CgkJfQoJCQoJCSRtZncgPSAkdGhpcy0+c2NhbGUtPm1pbnV0ZS0+R2V0U3RyV2lkdGgoJHRoaXMtPmltZywkdHh0KSs2OwoJCSRuID0gY2VpbCg2MCAvICR0aGlzLT5zY2FsZS0+VGltZVRvTWludXRlcygkdGhpcy0+c2NhbGUtPm1pbnV0ZS0+R2V0SW50ZXJ2YWxsKCkpICk7CgkJJG13ID0gJG4gKiAkbWZ3OwoJCSRmdyA9ICRmdyA8ICRtdyA/ICRtdyA6ICRmdyA7CgkgICAgfQoKCSAgICAvLyBJZiB3ZSBkaXNwbGF5IHdlZWsgd2UgbXVzdCBtYWtlIHN1cmUgdGhhdCA3KiRmdyBpcyBlbm91Z2gKCSAgICAvLyB0byBmaXQgdXAgdG8gMTAgY2hhcmFjdGVycyBvZiB0aGUgd2VlayBmb250IChpZiB0aGUgd2VlayBpcyBlbmFibGVkKQoJICAgIGlmKCAkdGhpcy0+c2NhbGUtPklzRGlzcGxheVdlZWsoKSApIHsKCQkvLyBEZXBlbmRpbmcgb24gd2hhdCBmb3JtYXQgdGhlIHVzZXIgaGFzIGNob29zZSB3ZSBuZWVkIGRpZmZlcmVudCBhbW91bnQKCQkvLyBvZiBzcGFjZQoJCSRmc3cgPSBzdHJsZW4oJHRoaXMtPnNjYWxlLT53ZWVrLT5pTGFiZWxGb3JtU3RyKTsKCQlpZiggJHRoaXMtPnNjYWxlLT53ZWVrLT5pU3R5bGU9PVdFRUtTVFlMRV9GSVJTVERBWTJXTkJSICkgewoJCSAgICAkZnN3ICs9IDg7CgkJfQoJCWVsc2VpZiggJHRoaXMtPnNjYWxlLT53ZWVrLT5pU3R5bGU9PVdFRUtTVFlMRV9GSVJTVERBWVdOQlIgKSB7CgkJICAgICRmc3cgKz0gNzsKCQl9CgkJZWxzZSB7CgkJICAgICRmc3cgKz0gNDsKCQl9CgkJICAgIAoJCSR3dyA9ICRmc3cqJHRoaXMtPnNjYWxlLT53ZWVrLT5HZXRGb250V2lkdGgoJHRoaXMtPmltZyk7CgkJaWYoIDcqJGZ3IDwgJHd3ICkgewoJCSAgICAkZncgPSBjZWlsKCR3dy83KTsKCQl9CgkgICAgfQoKCSAgICBpZiggISR0aGlzLT5zY2FsZS0+SXNEaXNwbGF5RGF5KCkgJiYgISR0aGlzLT5zY2FsZS0+SXNEaXNwbGF5SG91cigpICYmCgkJISggKCR0aGlzLT5zY2FsZS0+d2Vlay0+aVN0eWxlPT1XRUVLU1RZTEVfRklSU1REQVlXTkJSIHx8IAoJCSAgICAkdGhpcy0+c2NhbGUtPndlZWstPmlTdHlsZT09V0VFS1NUWUxFX0ZJUlNUREFZMldOQlIpICYmICR0aGlzLT5zY2FsZS0+SXNEaXNwbGF5V2VlaygpICkgKSB7CgkJLy8gSWYgd2UgZG9uJ3QgZGlzcGxheSB0aGUgaW5kaXZpZHVhbCBkYXlzIHdlIGNhbiBzaHJpbmsgdGhlCgkJLy8gc2NhbGUgYSBsaXR0bGUgYml0LiBUaGlzIGlzIGEgbGl0dGxlIGJpdCBwcmFnbWF0aWMgYXQgdGhlIAoJCS8vIG1vbWVudCBhbmQgc2hvdWxkIGJlIHJlLXdyaXR0ZW4gdG8gdGFrZSBpbnRvIGFjY291bnQKCQkvLyBhKSBXaGF0IHNjYWxlcyBleGFjdGx5IGFyZSBzaG93biBhbmQgCgkJLy8gYikgd2hhdCBmb3JtYXQgZG8gdGhleSB1c2Ugc28gd2Uga25vdyBob3cgd2lkZSB3ZSBuZWVkIHRvCgkJLy8gbWFrZSBlYWNoIHNjYWxlIHRleHQgc3BhY2UgYXQgbWluaW11bS4KCQkkZncgLz0gMjsKCQlpZiggISR0aGlzLT5zY2FsZS0+SXNEaXNwbGF5V2VlaygpICkgewoJCSAgICAkZncgLz0gMS44OwoJCX0KCSAgICB9CgoJICAgICRjdyA9ICR0aGlzLT5HZXRNYXhBY3RJbmZvQ29sV2lkdGgoKSA7CgkgICAgJHRoaXMtPnNjYWxlLT5hY3RpbmZvLT5TZXRNaW5Db2xXaWR0aCgkY3cpOyAKCSAgICBpZiggJHRoaXMtPmltZy0+d2lkdGggPD0gMCApIHsKCQkvLyBOb3cgZGV0ZXJtaW5lIHRoZSB3aWR0aCBmb3IgdGhlIGFjdGl2aXR5IHRpdGxlcyBjb2x1bW4KCgkJLy8gRmlyZHN0IGZpbmQgb3V0IHRoZSBtYXhpbXVtIHdpZHRoIG9mIGVhY2ggb2JqZWN0IGNvbHVtbgoJCSR0aXRsZXdpZHRoID0gbWF4KG1heCgkdGhpcy0+R2V0TWF4TGFiZWxXaWR0aCgpLAoJCQkJICAgICAgJHRoaXMtPnNjYWxlLT50YWJsZVRpdGxlLT5HZXRXaWR0aCgkdGhpcy0+aW1nKSksIAoJCQkJICAkdGhpcy0+c2NhbGUtPmFjdGluZm8tPkdldFdpZHRoKCR0aGlzLT5pbWcpKTsKCgkJLy8gQWRkIHRoZSB3aWR0aCBvZiB0aGUgdmVydGl2Y2FsIGRpdmlkZXIgbGluZQoJCSR0aXRsZXdpZHRoICs9ICR0aGlzLT5zY2FsZS0+ZGl2aWRlci0+aVdlaWdodCoyOwoKCgkJLy8gTm93IGdldCB0aGUgdG90YWwgd2lkdGggdGFraW5nIAoJCS8vIHRpdGxld2lkdGgsIGxlZnQgYW5kIHJpZ3QgbWFyZ2luLCBkYXlmb250IHNpemUgCgkJLy8gaW50byBhY2NvdW50CgkJJHdpZHRoID0gJHRpdGxld2lkdGggKyAkbmQqJGZ3ICsgJGxtKyRybTsKCSAgICB9CgkgICAgZWxzZSB7CgkJJHdpZHRoID0gJHRoaXMtPmltZy0+d2lkdGg7CgkgICAgfQoKCSAgICAkd2lkdGggPSByb3VuZCgkd2lkdGgpOwoJICAgICRoZWlnaHQgPSByb3VuZCgkaGVpZ2h0KTsKCSAgICBpZiggJHdpZHRoID4gTUFYX0dBTlRUSU1HX1NJWkVfVyB8fCAkaGVpZ2h0ID4gTUFYX0dBTlRUSU1HX1NJWkVfSCApIHsKCQlKcGdyYXBoRXJyb3I6OlJhaXNlTCg2MDA3LCR3aWR0aCwkaGVpZ2h0KTsKLy8oIlNhbml0eSBjaGVjayBmb3IgYXV0b21hdGljIEdhbnR0IGNoYXJ0IHNpemUgZmFpbGVkLiBFaXRoZXIgdGhlIHdpZHRoICg9JHdpZHRoKSBvciBoZWlnaHQgKD0kaGVpZ2h0KSBpcyBsYXJnZXIgdGhhbiBNQVhfR0FOVFRJTUdfU0laRS4gVGhpcyBjb3VsZCBwb3RlbnRpYWxseSBiZSBjYXVzZWQgYnkgYSB3cm9uZyBkYXRlIGluIG9uZSBvZiB0aGUgYWN0aXZpdGllcy4iKTsKCSAgICB9CgkJCQkJCQoJICAgICR0aGlzLT5pbWctPkNyZWF0ZUltZ0NhbnZhcygkd2lkdGgsJGhlaWdodCk7CQkJCgkgICAgJHRoaXMtPmltZy0+U2V0TWFyZ2luKCRsbSwkcm0sJHRtLCRibSk7Cgl9CiAgICB9CgogICAgLy8gUmV0dXJuIGFuIGFycmF5IHdpZHRoIHRoZSBtYXhpbXVtIHdpZHRoIGZvciBlYWNoIGFjdGl2aXR5CiAgICAvLyBjb2x1bW4uIFRoaXMgaXMgdXNlZCB3aGVuIHdlIGF1dG9zaXplIHRoZSBjb2x1bW5zIHdoZXJlIHdlIG5lZWQKICAgIC8vIHRvIGZpbmQgb3V0IHRoZSBtYXhpbXVtIHdpZHRoIG9mIGVhY2ggY29sdW1uLiBJbiBvcmRlciB0byBkbyB0aGF0IHdlCiAgICAvLyBtdXN0IHdhbGsgdGhyb3VnaCBhbGwgdGhlIG9iamVjdHMsIHNpZ2guLi4KICAgIGZ1bmN0aW9uIEdldE1heEFjdEluZm9Db2xXaWR0aCgpIHsKCSRuID0gY291bnQoJHRoaXMtPmlPYmopOwoJaWYoICRuID09IDAgKSByZXR1cm47CgkkdyA9IGFycmF5KCk7CgkkbSA9ICR0aGlzLT5zY2FsZS0+YWN0aW5mby0+aUxlZnRDb2xNYXJnaW4gKyAkdGhpcy0+c2NhbGUtPmFjdGluZm8tPmlSaWdodENvbE1hcmdpbjsKCQoJZm9yKCAkaT0wOyAkaSA8ICRuOyArKyRpICkgewoJICAgICR0bXAgPSAkdGhpcy0+aU9ialskaV0tPnRpdGxlLT5HZXRDb2xXaWR0aCgkdGhpcy0+aW1nLCRtKTsKCSAgICAkbm4gPSBjb3VudCgkdG1wKTsKCSAgICBmb3IoICRqPTA7ICRqIDwgJG5uOyArKyRqICkgewoJCWlmKCBlbXB0eSgkd1skal0pICkgCgkJICAgICR3WyRqXSA9ICR0bXBbJGpdOwoJCWVsc2UgCgkJICAgICR3WyRqXSA9IG1heCgkd1skal0sJHRtcFskal0pOwoJICAgIH0KCX0KCXJldHVybiAkdzsKICAgIH0KCiAgICAvLyBTdHJva2UgdGhlIGdhbnR0IGNoYXJ0CiAgICBmdW5jdGlvbiBTdHJva2UoJGFTdHJva2VGaWxlTmFtZT0iIikgewkKCgoJLy8gSWYgdGhlIGZpbGVuYW1lIGlzIHRoZSBwcmVkZWZpbmVkIHZhbHVlID0gJ19jc2ltX3NwZWNpYWxfJwoJLy8gd2UgYXNzdW1lIHRoYXQgdGhlIGNhbGwgdG8gc3Ryb2tlIG9ubHkgbmVlZHMgdG8gZG8gZW5vdWdoCgkvLyB0byBjb3JyZWN0bHkgZ2VuZXJhdGUgdGhlIENTSU0gbWFwcy4KCS8vIFdlIHVzZSB0aGlzIHZhcmlhYmxlIHRvIHNraXAgdGhpbmdzIHdlIGRvbid0IHN0cmljdGx5IG5lZWQKCS8vIHRvIGRvIHRvIGdlbmVyYXRlIHRoZSBpbWFnZSBtYXAgdG8gaW1wcm92ZSBwZXJmb3JtYW5jZQoJLy8gYSBiZXN0IHdlIGNhbi4gVGhlcmVmb3IgeW91IHdpbGwgc2VlIGEgbG90IG9mIHRlc3RzICEkX2NzaW0gaW4gdGhlCgkvLyBjb2RlIGJlbG93LgoJJF9jc2ltID0gKCRhU3Ryb2tlRmlsZU5hbWU9PT1fQ1NJTV9TUEVDSUFMRklMRSk7CgoJLy8gU2hvdWxkIHdlIGF1dG9zY2FsZSBkYXRlcz8KCWlmKCAhJHRoaXMtPnNjYWxlLT5Jc1JhbmdlU2V0KCkgKSB7CgkgICAgbGlzdCgkbWluLCRtYXgpID0gJHRoaXMtPkdldEJhck1pbk1heCgpOwoJICAgICR0aGlzLT5zY2FsZS0+U2V0UmFuZ2UoJG1pbiwkbWF4KTsKCX0KCgkkdGhpcy0+c2NhbGUtPkFkanVzdFN0YXJ0RW5kRGF5KCk7CgoJLy8gQ2hlY2sgaWYgd2Ugc2hvdWxkIGF1dG9zY2FsZSB0aGUgaW1hZ2UKCSR0aGlzLT5BdXRvU2l6ZSgpOwoJCQoJLy8gU2hvdWxkIHdlIHN0YXJ0IGZyb20gdGhlIHRvcCBvciBqdXN0IHNwcmVhZCB0aGUgYmFycyBvdXQgZXZlbiBvdmVyIHRoZQoJLy8gYXZhaWxhYmxlIGhlaWdodAoJJHRoaXMtPnNjYWxlLT5TZXRWZXJ0TGF5b3V0KCR0aGlzLT5pTGF5b3V0KTsJCQkKCWlmKCAkdGhpcy0+aUxheW91dCA9PSBHQU5UVF9GUk9NVE9QICkgewoJICAgICRtYXhoZWlnaHQ9bWF4KCR0aGlzLT5HZXRNYXhMYWJlbEhlaWdodCgpLCR0aGlzLT5HZXRNYXhCYXJBYnNIZWlnaHQoKSk7CgkgICAgJHRoaXMtPnNjYWxlLT5TZXRWZXJ0U3BhY2luZygkbWF4aGVpZ2h0KigxKyR0aGlzLT5pTGFiZWxWTWFyZ2luRmFjdG9yKSk7Cgl9CgkvLyBJZiBpdCBoYXNuJ3QgYmVlbiBzZXQgZmluZCBvdXQgdGhlIG1heGltdW0gbGluZSBudW1iZXIKCWlmKCAkdGhpcy0+c2NhbGUtPmlWZXJ0TGluZXMgPT0gLTEgKSAKCSAgICAkdGhpcy0+c2NhbGUtPmlWZXJ0TGluZXMgPSAkdGhpcy0+R2V0QmFyTWF4TGluZU51bWJlcigpKzE7IAkKCQkKCSRtYXh3aWR0aD1tYXgoJHRoaXMtPnNjYWxlLT5hY3RpbmZvLT5HZXRXaWR0aCgkdGhpcy0+aW1nKSwKCQkgICAgICBtYXgoJHRoaXMtPkdldE1heExhYmVsV2lkdGgoKSwKCQkgICAgICAkdGhpcy0+c2NhbGUtPnRhYmxlVGl0bGUtPkdldFdpZHRoKCR0aGlzLT5pbWcpKSk7CgoJJHRoaXMtPnNjYWxlLT5TZXRMYWJlbFdpZHRoKCRtYXh3aWR0aCskdGhpcy0+c2NhbGUtPmRpdmlkZXItPmlXZWlnaHQpOy8vKigxKyR0aGlzLT5pTGFiZWxITWFyZ2luRmFjdG9yKSk7CgoJaWYoICEkX2NzaW0gKSB7CgkgICAgJHRoaXMtPlN0cm9rZVBsb3RBcmVhKCk7CgkgICAgaWYoICR0aGlzLT5pSWNvbkRlcHRoID09IERFUFRIX0JBQ0sgKSB7CgkJJHRoaXMtPlN0cm9rZUljb25zKCk7CgkgICAgfQoJfQoKCSR0aGlzLT5zY2FsZS0+U3Ryb2tlKCk7CgoJaWYoICEkX2NzaW0gKSB7CgkgICAgLy8gRHVlIHRvIGEgbWlub3Igb2ZmIGJ5IDEgYnVnIHdlIG5lZWQgdG8gdGVtcG9yYXJpbHkgYWRqdXN0IHRoZSBtYXJnaW4KCSAgICAkdGhpcy0+aW1nLT5yaWdodF9tYXJnaW4tLTsKCSAgICAkdGhpcy0+U3Ryb2tlUGxvdEJveCgpOwoJICAgICR0aGlzLT5pbWctPnJpZ2h0X21hcmdpbisrOwoJfQoKCS8vIFN0cm9rZSBHcmlkIGxpbmUKCSR0aGlzLT5oZ3JpZC0+U3Ryb2tlKCR0aGlzLT5pbWcsJHRoaXMtPnNjYWxlKTsKCgkkbiA9IGNvdW50KCR0aGlzLT5pT2JqKTsKCWZvcigkaT0wOyAkaSA8ICRuOyArKyRpKSB7CgkgICAgLy8kdGhpcy0+aU9ialskaV0tPlNldExhYmVsTGVmdE1hcmdpbihyb3VuZCgkbWF4d2lkdGgqJHRoaXMtPmlMYWJlbEhNYXJnaW5GYWN0b3IvMikpOwoJICAgICR0aGlzLT5pT2JqWyRpXS0+U3Ryb2tlKCR0aGlzLT5pbWcsJHRoaXMtPnNjYWxlKTsKCX0KCgkkdGhpcy0+U3Ryb2tlVGl0bGVzKCk7CgoJaWYoICEkX2NzaW0gKSB7CgkgICAgJHRoaXMtPlN0cm9rZUNvbnN0cmFpbnMoKTsKCSAgICAkdGhpcy0+Zm9vdGVyLT5TdHJva2UoJHRoaXMtPmltZyk7CgoJICAgIGlmKCAkdGhpcy0+aUljb25EZXB0aCA9PSBERVBUSF9GUk9OVCkgewoJCSR0aGlzLT5TdHJva2VJY29ucygpOwoJICAgIH0KCgkgICAgLy8gU2hvdWxkIHdlIGRvIGFueSBmaW5hbCBpbWFnZSB0cmFuc2Zvcm1hdGlvbgoJICAgIGlmKCAkdGhpcy0+aUltZ1RyYW5zICkgewoJCWlmKCAhY2xhc3NfZXhpc3RzKCdJbWdUcmFucycpICkgewoJCSAgICByZXF1aXJlX29uY2UoJ2pwZ3JhcGhfaW1ndHJhbnMucGhwJyk7CgkJfQoJICAgIAoJCSR0Zm9ybSA9IG5ldyBJbWdUcmFucygkdGhpcy0+aW1nLT5pbWcpOwoJCSR0aGlzLT5pbWctPmltZyA9ICR0Zm9ybS0+U2tldzNEKCR0aGlzLT5pSW1nVHJhbnNIb3Jpem9uLCR0aGlzLT5pSW1nVHJhbnNTa2V3RGlzdCwKCQkJCQkJICR0aGlzLT5pSW1nVHJhbnNEaXJlY3Rpb24sJHRoaXMtPmlJbWdUcmFuc0hpZ2hRLAoJCQkJCQkgJHRoaXMtPmlJbWdUcmFuc01pblNpemUsJHRoaXMtPmlJbWdUcmFuc0ZpbGxDb2xvciwKCQkJCQkJICR0aGlzLT5pSW1nVHJhbnNCb3JkZXIpOwoJICAgIH0KCSAgICAKCSAgICAKCSAgICAvLyBJZiB0aGUgZmlsZW5hbWUgaXMgZ2l2ZW4gYXMgdGhlIHNwZWNpYWwgIl9faGFuZGxlIgoJICAgIC8vIHRoZW4gdGhlIGltYWdlIGhhbmRsZXIgaXMgcmV0dXJuZWQgYW5kIHRoZSBpbWFnZSBpcyBOT1QKCSAgICAvLyBzdHJlYW1lZCBiYWNrCgkgICAgaWYoICRhU3Ryb2tlRmlsZU5hbWUgPT0gX0lNR19IQU5ETEVSICkgewoJCXJldHVybiAkdGhpcy0+aW1nLT5pbWc7CgkgICAgfQoJICAgIGVsc2UgewoJCS8vIEZpbmFsbHkgc3RyZWFtIHRoZSBnZW5lcmF0ZWQgcGljdHVyZQkJCQkJCgkJJHRoaXMtPmNhY2hlLT5QdXRBbmRTdHJlYW0oJHRoaXMtPmltZywkdGhpcy0+Y2FjaGVfbmFtZSwkdGhpcy0+aW5saW5lLAoJCQkJCSAgICRhU3Ryb2tlRmlsZU5hbWUpOwkJCgkgICAgfQoJfQogICAgfQoKICAgIGZ1bmN0aW9uIFN0cm9rZUNvbnN0cmFpbnMoKSB7CgkkbiA9IGNvdW50KCR0aGlzLT5pT2JqKTsKCgkvLyBTdHJva2UgYWxsIGNvbnN0cmFpbnMKCWZvcigkaT0wOyAkaSA8ICRuOyArKyRpKSB7CgoJICAgIC8vIFNvbWUgZ2FudHQgb2JqZWN0cyBtYXkgbm90IGhhdmUgY29uc3RyYWludHMgYXNzb2NpYXRlZCB3aXRoIHRoZW0KCSAgICAvLyBmb3IgZXhhbXBsZSB3ZSBjYW4gYWRkIEljb25QbG90cyB3aGljaCBkb2Vzbid0IGhhdmUgdGhpcyBwcm9wZXJ0eS4KCSAgICBpZiggZW1wdHkoJHRoaXMtPmlPYmpbJGldLT5jb25zdHJhaW50cykgKSBjb250aW51ZTsKCgkgICAgJG51bUNvbnN0cmFpbnMgPSBjb3VudCgkdGhpcy0+aU9ialskaV0tPmNvbnN0cmFpbnRzKTsKCgkgICAgZm9yKCAkayA9IDA7ICRrIDwgJG51bUNvbnN0cmFpbnM7ICRrKysgKSB7CgkJJHZwb3MgPSAkdGhpcy0+aU9ialskaV0tPmNvbnN0cmFpbnRzWyRrXS0+aUNvbnN0cmFpblJvdzsKCQlpZiggJHZwb3MgPj0gMCApIHsKCQkgICAgJGMxID0gJHRoaXMtPmlPYmpbJGldLT5pQ29uc3RyYWluUG9zOwoKCQkgICAgLy8gRmluZCBvdXQgd2hpY2ggb2JqZWN0IGlzIG9uIHRoZSB0YXJnZXQgcm93CgkJICAgICR0YXJnZXRvYmogPSAtMTsKCQkgICAgZm9yKCAkaj0wOyAkaiA8ICRuICYmICR0YXJnZXRvYmogPT0gLTE7ICsrJGogKSB7CgkJCWlmKCAkdGhpcy0+aU9ialskal0tPmlWUG9zID09ICR2cG9zICkgewoJCQkgICAgJHRhcmdldG9iaiA9ICRqOwoJCQl9CgkJICAgIH0KCQkgICAgaWYoICR0YXJnZXRvYmogPT0gLTEgKSB7CgkJCUpwR3JhcGhFcnJvcjo6UmFpc2VMKDYwMDgsJHRoaXMtPmlPYmpbJGldLT5pVlBvcywkdnBvcyk7Ci8vKCdZb3UgaGF2ZSBzcGVjaWZlZCBhIGNvbnN0cmFpbiBmcm9tIHJvdz0nLiR0aGlzLT5pT2JqWyRpXS0+aVZQb3MuJyB0byByb3c9Jy4kdnBvcy4nIHdoaWNoIGRvZXMgbm90IGhhdmUgYW55IGFjdGl2aXR5LicpOwoJCSAgICB9CgkJICAgICRjMiA9ICR0aGlzLT5pT2JqWyR0YXJnZXRvYmpdLT5pQ29uc3RyYWluUG9zOwoJCSAgICBpZiggY291bnQoJGMxKSA9PSA0ICYmIGNvdW50KCRjMiApID09IDQpIHsKCQkJc3dpdGNoKCAkdGhpcy0+aU9ialskaV0tPmNvbnN0cmFpbnRzWyRrXS0+aUNvbnN0cmFpblR5cGUgKSB7CgkJCSAgICBjYXNlIENPTlNUUkFJTl9FTkRTVEFSVDoKCQkJCWlmKCAkYzFbMV0gPCAkYzJbMV0gKSB7CgkJCQkgICAgJGxpbmsgPSBuZXcgR2FudHRMaW5rKCRjMVsyXSwkYzFbM10sJGMyWzBdLCRjMlsxXSk7CgkJCQl9CgkJCQllbHNlIHsKCQkJCSAgICAkbGluayA9IG5ldyBHYW50dExpbmsoJGMxWzJdLCRjMVsxXSwkYzJbMF0sJGMyWzNdKTsKCQkJCX0KCQkJCSRsaW5rLT5TZXRQYXRoKDMpOwoJCQkJYnJlYWs7CgkJCSAgICBjYXNlIENPTlNUUkFJTl9TVEFSVEVORDoKCQkJCWlmKCAkYzFbMV0gPCAkYzJbMV0gKSB7CgkJCQkgICAgJGxpbmsgPSBuZXcgR2FudHRMaW5rKCRjMVswXSwkYzFbM10sJGMyWzJdLCRjMlsxXSk7CgkJCQl9CgkJCQllbHNlIHsKCQkJCSAgICAkbGluayA9IG5ldyBHYW50dExpbmsoJGMxWzBdLCRjMVsxXSwkYzJbMl0sJGMyWzNdKTsKCQkJCX0KCQkJCSRsaW5rLT5TZXRQYXRoKDApOwoJCQkJYnJlYWs7CgkJCSAgICBjYXNlIENPTlNUUkFJTl9FTkRFTkQ6CgkJCQlpZiggJGMxWzFdIDwgJGMyWzFdICkgewoJCQkJICAgICRsaW5rID0gbmV3IEdhbnR0TGluaygkYzFbMl0sJGMxWzNdLCRjMlsyXSwkYzJbMV0pOwoJCQkJfQoJCQkJZWxzZSB7CgkJCQkgICAgJGxpbmsgPSBuZXcgR2FudHRMaW5rKCRjMVsyXSwkYzFbMV0sJGMyWzJdLCRjMlszXSk7CgkJCQl9CgkJCQkkbGluay0+U2V0UGF0aCgxKTsKCQkJCWJyZWFrOwoJCQkgICAgY2FzZSBDT05TVFJBSU5fU1RBUlRTVEFSVDoKCQkJCWlmKCAkYzFbMV0gPCAkYzJbMV0gKSB7CgkJCQkgICAgJGxpbmsgPSBuZXcgR2FudHRMaW5rKCRjMVswXSwkYzFbM10sJGMyWzBdLCRjMlsxXSk7CgkJCQl9CgkJCQllbHNlIHsKCQkJCSAgICAkbGluayA9IG5ldyBHYW50dExpbmsoJGMxWzBdLCRjMVsxXSwkYzJbMF0sJGMyWzNdKTsKCQkJCX0KCQkJCSRsaW5rLT5TZXRQYXRoKDMpOwoJCQkJYnJlYWs7CgkJCSAgICBkZWZhdWx0OgoJCQkJSnBHcmFwaEVycm9yOjpSYWlzZUwoNjAwOSwkdGhpcy0+aU9ialskaV0tPmlWUG9zLCR2cG9zKTsKLy8oJ1Vua25vd24gY29uc3RyYWluIHR5cGUgc3BlY2lmaWVkIGZyb20gcm93PScuJHRoaXMtPmlPYmpbJGldLT5pVlBvcy4nIHRvIHJvdz0nLiR2cG9zKTsKCQkJCWJyZWFrOwoJCQl9CgoJCQkkbGluay0+U2V0Q29sb3IoJHRoaXMtPmlPYmpbJGldLT5jb25zdHJhaW50c1ska10tPmlDb25zdHJhaW5Db2xvcik7CgkJCSRsaW5rLT5TZXRBcnJvdygkdGhpcy0+aU9ialskaV0tPmNvbnN0cmFpbnRzWyRrXS0+aUNvbnN0cmFpbkFycm93U2l6ZSwKCQkJCQkkdGhpcy0+aU9ialskaV0tPmNvbnN0cmFpbnRzWyRrXS0+aUNvbnN0cmFpbkFycm93VHlwZSk7CiAKCQkJJGxpbmstPlN0cm9rZSgkdGhpcy0+aW1nKTsKCQkgICAgfQoJCX0KCSAgICB9Cgl9CiAgICB9CgogICAgZnVuY3Rpb24gR2V0Q1NJTUFyZWFzKCkgewoJaWYoICEkdGhpcy0+aUhhc1N0cm9rZWQgKQoJICAgICR0aGlzLT5TdHJva2UoX0NTSU1fU1BFQ0lBTEZJTEUpOwoKCSRjc2ltID0gJHRoaXMtPnRpdGxlLT5HZXRDU0lNQXJlYXMoKTsKCSRjc2ltIC49ICR0aGlzLT5zdWJ0aXRsZS0+R2V0Q1NJTUFyZWFzKCk7CgkkY3NpbSAuPSAkdGhpcy0+c3Vic3VidGl0bGUtPkdldENTSU1BcmVhcygpOwoKCSRuID0gY291bnQoJHRoaXMtPmlPYmopOwoJZm9yKCAkaT0kbi0xOyAkaSA+PSAwOyAtLSRpICkgCgkgICAgJGNzaW0gLj0gJHRoaXMtPmlPYmpbJGldLT5HZXRDU0lNQXJlYSgpOwoJcmV0dXJuICRjc2ltOwogICAgfQp9CgovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLyBDTEFTUyBQcmVkZWZJY29ucwovLyBEZXNjcmlwdGlvbjogUHJlZGVmaW5lZCBpY29ucyBmb3IgdXNlIHdpdGggR2FudHQgY2hhcnRzCi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CkRFRklORSgnR0lDT05fV0FSTklOR1JFRCcsMCk7CkRFRklORSgnR0lDT05fVEVYVCcsMSk7CkRFRklORSgnR0lDT05fRU5EQ09OUycsMik7CkRFRklORSgnR0lDT05fTUFJTCcsMyk7CkRFRklORSgnR0lDT05fU1RBUlRDT05TJyw0KTsKREVGSU5FKCdHSUNPTl9DQUxDJyw1KTsKREVGSU5FKCdHSUNPTl9NQUdOSUZJRVInLDYpOwpERUZJTkUoJ0dJQ09OX0xPQ0snLDcpOwpERUZJTkUoJ0dJQ09OX1NUT1AnLDgpOwpERUZJTkUoJ0dJQ09OX1dBUk5JTkdZRUxMT1cnLDkpOwpERUZJTkUoJ0dJQ09OX0ZPTERFUk9QRU4nLDEwKTsKREVGSU5FKCdHSUNPTl9GT0xERVInLDExKTsKREVGSU5FKCdHSUNPTl9URVhUSU1QT1JUQU5UJywxMik7CgpjbGFzcyBQcmVkZWZJY29ucyB7CiAgICB2YXIgJGlCdWlsdGluSWNvbiA9IG51bGw7CiAgICB2YXIgJGlMZW4gPSAtMSA7CgogICAgZnVuY3Rpb24gR2V0TGVuKCkgewoJcmV0dXJuICR0aGlzLT5pTGVuIDsgCiAgICB9CgogICAgZnVuY3Rpb24gR2V0SW1nKCRhSWR4KSB7CglpZiggJGFJZHggPCAwIHx8ICRhSWR4ID49ICR0aGlzLT5pTGVuICkgewoJICAgIEpwR3JhcGhFcnJvcjo6UmFpc2VMKDYwMTAsJGFJZHgpOwovLygnSWxsZWdhbCBpY29uIGluZGV4IGZvciBHYW50dCBidWlsdGluIGljb24gWycuJGFJZHguJ10nKTsKCX0KCXJldHVybiBJbWFnZTo6Q3JlYXRlRnJvbVN0cmluZyhiYXNlNjRfZGVjb2RlKCR0aGlzLT5pQnVpbHRpbkljb25bJGFJZHhdWzFdKSk7ICAgCiAgICB9CgogICAgZnVuY3Rpb24gUHJlZGVmSWNvbnMoKSB7CgkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCS8vIHdhcm5pbmcucG5nCgkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCSR0aGlzLT5pQnVpbHRpbkljb25bMF1bMF09IDEwNDMgOwoJJHRoaXMtPmlCdWlsdGluSWNvblswXVsxXT0gCgkgICAgJ2lWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFDQUFBQUFnQ0FZQUFBQnplbnIwQUFBQUJtSkxSMFFBL3dEL0FQK2d2YWVUQUFBQUNYQklXWE1BQUFzU0FBQUxFZ0hTM1g3OEFBQUEnLgoJICAgICdCM1JKVFVVSDB3Z0tGU2dpbFdQaFVRQUFBNkJKUkVGVWVOcnRsOTFySEZVWWg1LzN6TXgrWjVKTlVvT2FtQ1pOYXFUWjZJV0lrcVJpUVdtaTFJRGV0SGZlaUNpbHRnWEJQOEFMJy4KCSAgICAnMFNJVXhmL0F2ZlJTQlM5RUtJTEZGcXlJSDlDRW1GWnRQcXJCSkxzN2MrYjFZbmVUM1dUVGJOc1VGUExDY0FibXpQdDczbzl6emd6czJaNzkzMjMxVU9kdjN3OWs5WjJ1ek9kQScuCgkgICAgJzUrMis3OXlOZUw3SGw3aHc3b2VpeFJNWjZQSk0yNlcxOEROQW0vVmg3bFI4ZnFoOTdObU1GMTFlczFpRnBNQVRxZGlyd01OQS9KNERwSXprcjVZc0FGMVBPNmdJTVlIUmRQd2wnLgoJICAgICdvTzJlbG1CK3FIM3NtN1hvemJrZ1l2eThTelluWlB0Y2JseU02SSs1ejNqUSswdkpmZ3BFdTU2QmZJOXZVa2J5aTJIWmQxUUpvZVdSaUFqQmQ0U0RDVzhTU0FPeTZ3QkhNekY3Jy4KCSAgICAnWWRWMkErUk91dlJQTGZIb2lTVTBFTVkvY0RBSWh4SmVHbmdLYU4xVmdIeVBMN05CeEkxSzlQNFF4Qnp3M0sxekovemtHOEI5dXdhUTcvSE5zUlp2OWtvaEJHRDBvN0pxTVlTLycuCgkgICAgJy95blBpZFF3L0xyQmlQQmNTL3lGQ1Q5NUR2QjJCV0F5NDU3NVBhUWJRS1crdFBkM0dDSXR1Mm9kS0krK1l4aUt1MGQyNm9XbUFEN3BhWlUvckx6MzdWcUlpakQyWWJuek5CQkUnLgoJICAgICdJQkhmOEs4cWpMN3ZZaENHRXJFVThDVGczeFhBZU1wOTZHckpFcWt5WGttOUJodWkxeGZzdW5qZEdoY1lMcStJempzR21CdDVZSC9jbUprRnE2Z0lxbG9uM3U0THhkS0d1Q0lvJy4KCSAgICAnUXU0MWcwRTQxcG8rMlIzM1h0NXV6OWtSSUIyVVRsZTdQbmZLclJPUDFIRDRzUmpabHEwbHpod29aNnJETmVUaTNuRWcxc2kvN0ZUN2tZUWJYUzZFNUU2NXRBNXVSRjl0dXRxMCcuCgkgICAgJ0svVndBRisvRmJJWVd0Nit0alFNL0FxVW1zN0E0V3k2ZDdZU2ZTTnhnTW16aTB5Y1dXd29yaW80UUp2ajRMcHVMNUJxdWdUblh6enFKc0p3dXJybE5oSlhGYWF2VzY3TlJ3M0YnLgoJICAgICdxK2FKY0NRVmU5Znp2SkdtQVk3L2RQSDBnaTBmNjRPdmVHeGErdXNDdVFNZVowK2t0OEJWclgrcVBPOUJ6eDBNZ3FCdnMrYTJQZkRkWUlmK1dBalhVMXViNHRxTmFQUHpSczhBJy4KCSAgICAnYmxybGkrV1ZuNzljWG4wY1dLbCt0R3g3SExjN3B1M0NTbW5maXRMK2wxVWloQWh3akZrUFFldjRLL2ZTQUJqQk04SkNhRnV1ckpVK3JnVzQxU3JvQThhTk1WTkFGdGdISkNzbicuCgkgICAgJ1hHeS81OFFWeEFDOU1jY0p0WjVrSXpObFc0NDBXckoyZWE0WVBBOWNBb29BN2kwQS9nUytpcUxvT3BCMUhPZWdxcllCM1VCbUpyQXRRQUp3cHdQcjFSeTkyd1ZsZ1pzaVlsVzEnLgoJICAgICd1WDFnVTM2ZHltZ3FZeEpJSkpOSlQxVzlRcUhnTndGUUJHWXFvOTRPd0haUVV1UEQ3QUNnbFN2Yys1bjVUOW0vd2ZKSlg0VTlxekVBQUFBQVNVVk9SSzVDWUlJPScgOyAKCgkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCS8vIGVkaXQucG5nCgkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCSR0aGlzLT5pQnVpbHRpbkljb25bMV1bMF09IDk1OSA7CgkkdGhpcy0+aUJ1aWx0aW5JY29uWzFdWzFdPSAKCSAgICAnaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJZQUFBQVdDQVlBQUFERXRHdzdBQUFBQkdkQlRVRUFBTEdQQy94aEJRQUFBQVppUzBkRUFGZ0FXQUJZOWorWnV3QUFBQWx3U0ZseicuCgkgICAgJ0FBQUxFQUFBQ3hBQnJTTzlkUUFBQUFkMFNVMUZCOUFLREF3YklFWE9BNkFBQUFNOFNVUkJWSGljcGRSUGFCeGxITWJ4NzZadnNtT1RtbTFkc0VxUVNJSXNFbUdWQkFRaml2RVEnLgoJICAgICdQQVVKbmdwV3NBV2xCdzhlZ3BRZXBLd3BsTjRVTEVHOUNqa0V5VUZLbFNKcldURzBJVTUxcENzZFlXMm5jVVBqZHRwOVorZjN2dU5odThuS2JtaGFmNWNaZUdjK1BPOHpmMUxjJy4KCSAgICAnbTBLaGtBQ0lDQ0tDTWVhQmppTEMwdExTbmpOdlBtdU9IUnBIMFRaVFUxTTh6Qmk5d2Frem43T0ZUczVzdzhZWUFDWW1KcnJlN0hrZXVWeXU2OXFQRjc3aGxUMVhtWjBlUTAzTycuCgkgICAgJ3dPTEpUdmhCeDFyTHoxOFZtSjBlWStqVmQyRnhEa0tYbnZZTEhnYjk3T2dMekU0T045SHpjMUIxUWFRenNlZDVPMEx0YTNFYzg5T25SNWg1TWNmUStNdzJxZ1FVbmZCT1BiWjMnLgoJICAgICdiSzNsK3hPdk1UMCszRVJMcDVGTkY2VUVqY0wzMitEZFZtR3Q1V0xoRFlZUFpyYlJxcmVGdW1Yd3FsMFMzdzl0bkR2TFdENVBaaWdQcGRPd3VZcFNDbzNDOHdVM1VIeFFkSGJmJy4KCSAgICAnY1pJa05NNmR4Y25sVU00azFlVUZNbFVQcFVBRGJwa3R0RmFySGU2b1lxZU9yNnl0NFJ6TVFIWVVjVXNRVnRHaWNIRHdLcHJWaXVMRGtrT3RWbnNIQ0haVlJWeS96Y2oxaTVBZicuCgkgICAgJ2g4QWpkSXRzK2hVY0djWVBLM2lCdEtNM2dEL3VBemYvQWRZMm1tbVZneTZYOFlOTkttR0l2eWxvUGNCOFNVaW4wN1JRNEVaSEZkc2RHMHdrSkVuRWFIQUp4dktFcFNMZWFva1YnLgoJICAgICdyNHpXbWhVWllMbFk0YjFEMDN5NWVJRVdDdFM3dnNjaUFnaUl4a1FSYWJXT3JsUW9yNjZ5NHBVcGhvSmIxamlPNHVPNW8wUzNxNlJTcVZiaU9tQzdWQ0VnQWhMU2FEUTQ4ZEg3Jy4KCSAgICAndkQ0NlJFWTBpeXNlZ1NqS1FjaVJ0OTlpYjdxWHdYME8rcEc0dGVNNllLSExCOUpNcTRtVG1GOS8rQUtBNHd2TFpCeUg3T2dZTDcrVVkycXZ3LzdCZmc1a0hpWGpKRnl2M0NHTycuCgkgICAgJ1kxcm9mK0JXNHQvWExpUEcwRENHcjc5ZDRYelJ4Um5JTW45OGh1WFNUWXlKNmV0MVVOWVFoUnZjaW5wSnE4Nkgzd0dQUFBNMGlCRGQrUWZmRDFnNGVaakx2dUc3UzFXZWYyNkUnLgoJICAgICdKN0w3ZVN4N2dBSFZnN1YzTVNiaTZtL3I5M2JhQmQ2cVFqZXJBSmcvOVFsL1hydkcwT04xK3Z2N0dIM3FTZlk1ZmFoVW5TVHB3WmdJRVFlc2FWWFJQYkhSRy94eUpTQXhNWWxwJy4KCSAgICAnRU9tNzFIVUlOaVk3bUdiOTVsLzhqWkN5UW1Kak1ER0pqVW1zZENST3RaMG4vUC9aOHY0RnMyTVRVVWY3dllvQUFBQUFTVVZPUks1Q1lJST0nIDsgCgoJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgkvLyBlbmRjb25zdHJhaW4ucG5nCgkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCSR0aGlzLT5pQnVpbHRpbkljb25bMl1bMF09IDY2NiA7CgkkdGhpcy0+aUJ1aWx0aW5JY29uWzJdWzFdPSAKCSAgICAnaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJZQUFBQVdDQVlBQUFERXRHdzdBQUFBQkdkQlRVRUFBTEdQQy94aEJRQUFBQVppUzBkRUFQOEEvd0Qvb0wybmt3QUFBQWx3U0ZseicuCgkgICAgJ0FBQUxEd0FBQ3c4Qmt2a0RwUUFBQUFkMFNVMUZCOUFMRVJFSUxraDArZVFBQUFJWFNVUkJWSGljdFpVOWFGTlJGTWQvTjgxSFg3N2FwdEpVV21wMUxIUnBJY1doZzVzSURsVVEnLgoJICAgICdMQVhCNHQ3UlJVcHdFaHk3aVE0NkNDSW9TSGNsMENGYW9WQVJVMk1GTVlrdGFkTFhKTm9rN3gySHRDRXh2dVlGbW5PNHcvM2d4K0djL3oxSEtSVGRNRWRYcUhiQi9zZ2Mvc2ljJy4KCSAgICAnbkRvWUFJOFh3RGE4bzFSTUxUKzJoQXNpZ3RUdmJJR1ZxaFg0NnN6VWlmQkdzd1VlQ1BnQUdCN1FlTGswWDRPcmsrSE94bzFWZ1NxR0FTak1xa244VzRyNHZWdEVnSS9SUlFFTCcuCgkgICAgJ3Zhb0dEODVjbDVWM255U1IvUzFteFd4YWI3ZjM1UG5udE55TUplUnI5a0NNcWlIVHkwOUVvZVRvTHdnZ3g2eW1pTU9EL1Z3Y0Q3T2EvTUhrY0lpUXgwMjZXR1l0bzVQL1UrWlonLgoJICAgICc3Z0QwUXdEdVQ1ejlOM0xyVlBpMFhzNTQzZVFQS2tSemFTNTRldmlKSXA0dE1GUUZNbGxBV04ycWNSWkhCbml4Tk04TllEMTYyeHE4dTdlUFNRK0dYMlBqd3hjMmRCMmNMdEI4Jy4KCSAgICAnN0dnYW1DYjBhbkJZQmVDaE10bDg4NTVDYXJjbHhVMWd2VmlpVUs0dzJPTWtORG5HZUo4YnQ5Zkg5MHlPbk9rQ3dMRlR3aHp5a2h2dFl6T1dvQkJiWS8vUjNkYmFOVFloZjJSTycuCgkgICAgJ1FwZXVVTXp2MTg4TWx3dUh5MEgxM0huRTQ4VXpNY0wwV0F0VUhYOE94WkhvRzFVUmlGdzdybkxMQ3N3dVNQRDF1bHplL2lXalQyUFNmK2RCWFJGdFZWR0l2enFwaDBwUUw3VkUnLgoJICAgICdhdlhZYVhYeFB3c250MGltZHR0Q29jTW1aQmRLN1lVOUQ4d3VOT1cwblhjNlFXelBzU2E1bmFaMWJlYjlCYkdCNmR4R3RNblhBQUFBQUVsRlRrU3VRbUNDJyA7IAoKCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoJLy8gbWFpbC5wbmcKCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoJJHRoaXMtPmlCdWlsdGluSWNvblszXVswXT0gMTEyMiA7CgkkdGhpcy0+aUJ1aWx0aW5JY29uWzNdWzFdPSAKCSAgICAnaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJZQUFBQVdDQVlBQUFERXRHdzdBQUFBQkdkQlRVRUFBTEdQQy94aEJRQUFBQVppUzBkRUFQOEEvd0Qvb0wybmt3QUFBQWx3U0ZseicuCgkgICAgJ0FBQUxFQUFBQ3hBQnJTTzlkUUFBQUFkMFNVMUZCOUFKSEFNZkZ2TDlPVThBQUFQZlNVUkJWSGljdFpSZGFCUlhGTWQvOTg3SDd0Yk54OGFZdEdDckVleERzT0JEYUtIRnhpcmInLgoJICAgICdoMHFoc2lZMHlrcHBLcTFvc0k5OUM0SDJXU2lGRk1IV1VoWEJyalJpMHVDbXRTRVVHZ1AxUVdxaFdqR2tvVzdNMWtUWDNXUm41cDQrVEpKTkdvbFE2SVhEbkR0eitOMHovM1BQJy4KCSAgICAnVVdCSXBkcFlhMjNiOWcwOVBaMmtVck9ydm1VeUdWS3AxQW8vbVV5aTU2WW5WZ1dmTy9QMUNpaEFkL2RKTXBtYU5ST0lScThCa00xbTBiSDZUYXNDM2o2UVhnRmRYSStEUjZQUicuCgkgICAgJ0pYL1BubzhCK0tMbk1LcWxwVVU4ejhNWXMyUkJFRHpXZjlKKzBSY1JiTWR4R0JzYncvZm1DWHdQTVVFWUlENGlBVnA4d0lSbURJSE1vNHlIU0lCU0FTS0MrQ1dFMEMvUEY5alUnLgoJICAgICczQjZDcCs0TTA3QzVGVXRLR052R3dRSmN0UGdJc2dEMndSaEVJcUFNR0IrVVFZa0hKZ1lZWkQ3UDFId1ZsbVdoSGNmaHlrODNLZVJHVVc0dDZDZ29HNVNOVVM0S0JXZ1FEVW92Jy4KCSAgICAnN0FHbHdZQVNCVnFIMEJrNDlkWHBDdmlWVjNkdy90STFCdnI3a01JSWxoME5ZVXBqbEYwQkFZdmN4U1htRVZMS2NlSFNDSm0rUG5idWVCSGJ0a053VFhVTkJ6bzZhR3BxNHNTWicuCgkgICAgJ0d3VDVIN0JzRjZXZGYxR1dIUUFvTTB1cGVJOVBUMXlpb1M3Qjd0ZGFTZFN1dzdLc1VHTUF5N0hZc21VenRUVzFuTXdNMHR4c3NYMXJsSGpqUzVqeS9VcTJZa0svZUp1TGw2L3onLgoJICAgICd4KzF4a3NsVzZtcml4R0lPRHg4RUZTbEVCQzArdG1YVDBOaEEyNzYzaUVVam5MdjRDOFhwVWJTYkFCMW1La0dKM0o4M09kNzdIVzVFc3p2WlNxSzJpbGpNSWVKYVJHTnVKZVBGJy4KCSAgICAnNm1zcFk3QkoxRFh3UW5DZDJmeEdScTVPVUN6OHh0NzJkeWhNWmNuKytDdTN4dTlTS2hkcDJiNFpIV25BdFRTeG1JV2xoY0lqbGtzUjNsTkJZemx4WnNiNytmN25lK3h0U3pPZCcuCgkgICAgJ3U4M3N6SDFPblRoT1BwL24rYTBiZWVQMWw0bXZxK1BVMlF5ZCs1UFkxUnV3bEFxTFlGYUJmYlRieVBTZGZnYUg3N0EvL1FGNGYxTy92cHI2Ukp5cStDNUtjL004RmJGeFhJdFknLgoJICAgICd4T0hEcnZmby9meExEbmJzSkJwNUJvd0JSZVZXWUF6YWJlVGg1QUJEdzdjV29OTkwzWVlZTnRTdjU3bG5uNlorUXgwMVZldUl1QmEyRFYxSEQzSDYzQkFQWnU0dTFXR3BlTEhxJy4KCSAgICAnUmg3K05jakEwTyswcDQrQ053WGlnd25iV2xRUWRwdUVwbGkrbitQSWtjT2MvL1lLdWNrSkpGaDJLMmFucmpGdytRWnQ2UzZrUEltSUYvYitjcUFKRDFMaWhXQXhDNjF0d0JUbycuCgkgICAgJ2ZQY1FGL29Hc1ZXNW92SFFsYXZzMi84K3VZblJWU09VZ0hBbW1BQ2xCSU9Cd0tDMGdQamhJUmdFSVgyd2c3Tm53cFpXM2QzZDR2cyt2dThUQk1HSzUxcnZQTTliOGhkdGVaeGQnLgoJICAgICdMQmJWUjhmZUpEczBSbHY2R0ZLZVhKMjFyTlJYRVN4TVBSK0NCVWwwbk43UGp0TytkeWU3VXAvOHYxSTg4YmYvaXhUL0FPMS9oWnNxVytDNkFBQUFBRWxGVGtTdVFtQ0MnIDsgCgoJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgkvLyBzdGFydGNvbnN0cmFpbi5wbmcKCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoJJHRoaXMtPmlCdWlsdGluSWNvbls0XVswXT0gNzI1IDsKCSR0aGlzLT5pQnVpbHRpbkljb25bNF1bMV09IAoJICAgICdpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQllBQUFBV0NBWUFBQURFdEd3N0FBQUFCR2RCVFVFQUFMR1BDL3hoQlFBQUFBWmlTMGRFQVA4QS93RC9vTDJua3dBQUFBbHdTRmx6Jy4KCSAgICAnQUFBTERnQUFDdzRCUUw3aFFRQUFBQWQwU1UxRkI5QUxFUkVJQ0pwNWZCa0FBQUpTU1VSQlZIaWMzZFM5YTFOUkdNZng3N2t4dFMreHFTOUZHNnAxRVIzcVZKcEJRVVVjM0NSVScuCgkgICAgJ0J3VVJWTEIxRUF1S0lQMFRISlFpaU5SSkJLM2lKbDE4QXllbHRSWmEwYmJhSk1iVU5tbE5TbTVlN3MyNWowTnFwU1NteWFnL09NTTlQT2R6RHVmbHduOGRqejhnQ2xWUnJWRVYnLgoJICAgICd1cjRCbDFGVE5TekxyU1M2dmJtbDBqVVV3U1hqOFFmazNQa0x0TFcyQWVCSXlibXJnejMrZ0Z6cHVjamxFNGY0YnR1RlR1V3VDRjVYRHIzYTNVUGY2Y004R1F2eHpic1JBSmRoJy4KCSAgICAnU2NmeFN5d21sNWo3bVZ5cE4wZUdFSjB0ZWJJcmUrenhCNlR2N2pQUmVTMmhSRXBPdnBtVVhVK0g1ZUM5MTNKbk5DU1JWRTYwcFVWYldvWmpwclIzOVlxNzBiZHFqNHBXN1BFSCcuCgkgICAgJzVGcHZMOWU3OWpPVFRITTdzc0RMNkNKWjA4TGJ2QUducnBaZzJtSTJaL01sWmZOOElreHVTd3U0VjkrV0lyajd6RmxPSGZYektyTElpMlNHaDVFQ0tqbk5WTnhrUUVjNTV2T3cnLgoJICAgICdyYjZPOEpMRmRIeUorYXlGRWxVZUh2andrZnRlTC9WN2ZLVFNrRnZJUUU0RG9MSTJNei9tdVRrVEFwY0JLSXdhTjhwd0lVckt3K2FqV3dEa25BTzBkL3I0ekZhTXVSUzYzc1dtJy4KCSAgICAnUm9PZG0rdlJJcmlVWWpLZXhyUVYrdDFvMFlFVndmWlNWSm1EL2RJQUJKdU8wTEczbFJGeDBHT2ZpQUVMRTlPZ0NyZlUwWG5JcDVGd0dMRXk1V0VBT3hsUjV1TitBUmhQN0dOMycuCgkgICAgJzV3N0d2NGJRSTIreHB0NGpqdjJuV0JtSWxjRXhFMnZEQUhZaW9zekJaWHc2Q1BFNEFEb1dWSG1kL3R1d2xaUjllWFl5b3N6QmZwaU5RcWFBT1U1K1RYUk4rRGVlZW5BRFBUOWInLgoJICAgICdFVmdLVnN1dEtQbDBUR1dHaHdvZm9xdWFvS0s0YXBzcS90SC9lL2tGd0JNWExnQUVLSzRBQUFBQVNVVk9SSzVDWUlJPScgOyAKCgkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCS8vIGNhbGMucG5nCgkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCSR0aGlzLT5pQnVpbHRpbkljb25bNV1bMF09IDU4OSA7CgkkdGhpcy0+aUJ1aWx0aW5JY29uWzVdWzFdPSAKCSAgICAnaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJZQUFBQVdDQVlBQUFERXRHdzdBQUFBQkdkQlRVRUFBTEdQQy94aEJRQUFBQVppUzBkRUFBNEFJd0JiZ01GMTJ3QUFBQWx3U0ZseicuCgkgICAgJ0FBQUxFUUFBQ3hFQmYyUmZrUUFBQUFkMFNVMUZCOUFIQnhRZUZzcW4wd1FBQUFIS1NVUkJWSGljblpXZmYrUkFHSWVmM1UvZ2NPRWdVQWdVQ2djTGhZWEN3c0hCUWVHZ1VEZ3MnLgoJICAgICdGZ01IQjRWQS80Qmc0WENoV0ZnSUZJcUJ3a0poc1JBWWVPR0YrVFFIbVdTVFRiS2Q5cFUzNy94NDVqdmZURElUWEV5bkFiZFdLVlFCME5hemNWbTBhbGNMNHJKYVJWem0rdy9lJy4KCSAgICAnM2l3QWt6YllSY25uWWdJMDRHQ3ZzeHhTUGFiWWFFZHQyUmE2RDBhdGN2dnZEbXlyTVdCWDF6UHEyaXJjUC9Uazk4RGlKdGpWL2ZpbTZ6aU9DTDZkREhaTmh4UTNhcklNc294NCcuCgkgICAgJ3ZlamxlTDJBeTkramF3NkErNE9TSUNHMmNhY0dLaHNHeGcrQ3hlcUFRUzBZN0JZSnZvd3E3aUdNT2hYSEVmenB2cFFrQTliTEtnT2dXS3QrNExvMW1NOWhzOW0xN1FOc0o3MFAnLgoJICAgICdGamMvTzUyam9vZ29YOE1aS2lCaUFGeGQ5WjF2Y2o5d2ZTcFVsRFJOTWNZUXh6RnBtbkowRlBIOG5EZTFNUWFXU3o5d29RcFdTWktFb2pEa2VhV29LQXlyMXRsdStzNDh3ZlZ4Jy4KCSAgICAndTduNWk3anRobUdJaUVHY1QrMzZQUCtnRmVKcnhXTGhiMFVBL2xiNGdnR3MxVDByWnMwendNL1pqTmZpbGNJWTV0dXRQeGdPVzNGNmRVWDQ2NExyS0lMTGl3K0E3V0VycmwrMicuCgkgICAgJ3JBQkcxRUwvQmlsWlA4RGpVMnVSNFUrMkU0OVAxWjhRSm1OWFV6bDI0QTlHQlQwSXJ1Q2ZpODZkOXgrRDEyUkd6dCtwTkFBQUFBQkpSVTVFcmtKZ2dnPT0nIDsgCgoJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgkvLyBtYWcucG5nCgkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCSR0aGlzLT5pQnVpbHRpbkljb25bNl1bMF09IDE0MTUgOwoJJHRoaXMtPmlCdWlsdGluSWNvbls2XVsxXT0gCgkgICAgJ2lWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFCWUFBQUFXQ0FZQUFBREV0R3c3QUFBQUJHZEJUVUVBQUxHUEMveGhCUUFBQUFaaVMwZEVBUDhBL3dEL29MMm5rd0FBQUFsd1NGbHonLgoJICAgICdBQUFMREFBQUN3d0JQMEFpeUFBQUFBZDBTVTFGQjlBTER4RVdEWTZVbCtVQUFBVUVTVVJCVkhpY2RaVnJiRlJGR0lhZnN5eUYwbmFsVjFSNldpZ2dhQXB0bHpzcjFPZ0VvZ21DJy4KCSAgICAnMElnb0JBc0Jna0lyQkFQRWhCai9BUDZ4UlRDVUZFd1JJNGpjZ3NpdFhNckZDSnB0Sld2Qk5wWFliYlh0YnR0dHQ2ZTdlODZlYy95eGFkbENmWlBKWkRJejczenp6amZ2UjJWTCcuCgkgICAgJ0Y3VStoZjBIRDJKZHVJelRGeTZTbEpSa1B0a2NEZ2RDQ0U2NU94RkM4TlBWNndnaHlNN09wdGFua0oyZHpiU0M1UWdoRUVJZ0NTSG9nOVBwTkFGMjdkbE42bWladVBnRWxCNC8nLgoJICAgICdubVkzTzdadEJ5QTFOVlVDa0dXWndlRDFla2xKU2NFU1RicXh1SWpyZCsveDZ1SWw1TTE5aFN5N25mR09lVXhmK2c3VmpVMXNLaTdDNC9HWXNpeXo3dEFKQUQ0L2NSYUExdFpXJy4KCSAgICAnQUhJUG5FQ1VWR0QxKy8zVTE5ZWJHNHVMZUhmMWFrYW1qc0l3b1ZuVkNPdlFFZExvVklMWVltTW8zUEl4U0JKZmxwU2FEWDVGQW1qdTFRQVl2LzhrL3M4K3dMVnhPVTBqUjJMWicuCgkgICAgJzhzTUZBQXBXckNBcGJSUkRyUlppckJZU0xCS2FvUlBRdzNTRmVybmYyc2F2N1QwVWJ0NEt3TDRGTXdGNFZ1OEZvSEJDS2dDekRod0h3TEloWjd5NWE4OXU0bTJKaEEwd1RkREMnLgoJICAgICdPcnBoRWpKTU5FbENIeEtERWphb2Jtdmxmby9LcmoyN0NRUUNKc0NHSlc4QzBLWHFBTXhNaW9zUUE4aFpXY1RGeDlPc2FuaURLaDFxbUc3Vm9Gc0wweDBLMDZrYmVBTWhXcFJlJy4KCSAgICAnL0twRytnd0hBS1VuejdEejNCVU13NkRLMThudXc5OXd0ME5oNlZkSEk4UkppY21FVFFnRmc3U0Z3alNyR3Yrb0twNmdobGRWNmRaMHVnSkJsRjZGbUNFU1EydzJBSXFYTHNhbicuCgkgICAgJ0JyRllMSlRuVENCcmRCcXZlZW9wV1ppUEZhQkhVZWdKaGVnTXFHZ3hFa0hEd0IvVWFROXJkSVYwNnYwK1REMkVFUWpRRnRBWTBkc05nTnZ0NXNpYWxRQUlJWGg3d1FLdVZmNkonLgoJICAgICdnVHNTY2NQRFdsUXN0Q2xCR2pyOWVIcFZXdlVRbmNFd2RZRWVkRjhub1E0dm1ZbXBaTVRIMG5UdkRuMjV2TGJyTm11N2J2Zm5zWUViQU1uaGNQRGd3UVB6VW8yTEp1c3cvbWhwJy4KCSAgICAnUXdsSE5PMEtCQW5vSWZ4dHJjUU1UMkRlMU1tODkxd3lVek5sVWxKU3BJeU1EQm9iR3psenI1ckZNL0tvcTZ2clA4QVNHeHNMd1BtS2N2SVNoalBHWmlQT2FrRTNWRkI4aEh3ZCcuCgkgICAgJ3ZKQXhocms1TDdMeStSUXVIL3NXZ1BkWHJ3RmcvNkhERkJVc0lqMDluZWhmYkFXd1BXT1Q5bjVSWWhxR3dhck5XeGtSTTVUUkNmRjRVMVBRc0RESkZrOXVZaHdYdnp2S2ptM2InLgoJICAgICdLU3NybzNESkluTlc1UlhwN3UyYkFLU2xwZUgxZXNuUHo2ZXFxZ3FMcG1tY3IzRmh0OXVsZmFWN21aazFCcytsTTZUMWRqTTlmaGc1ZWdEUHBUTk15NVRac1cwN2t5ZFBZZFdNJy4KCSAgICAnYVh4OTZpeE9wOU84Y2ZVYTgwc3JtRHBqT2dBdWx5dGlRcVpwTW52T2JMYnQvSlR0SHhYajkvdFJWZFUwREdPQXVmUnBldlBEVGVhYzBoSnljM054T09hd2Z2MTYxbFZXUzZlWCcuCgkgICAgJ3orOS9VT0N4dTFWV1Z2YVRSR3YxNk5GZmpCMmJOZUFRcDlOcFRwbVNNNERjYnJkTDBXc0dES0xSUis1MnV3ZTF5UDhqYjJscFlmaWt5WTl0ODBuMDNVQ1daZWFYVmp3MWYrenMnLgoJICAgICdPZW4rL2QrcHFhbmh6cDJmS1NzcncrbDBtaTZYaXlQbDVaR0lUZE44ZkFWSndqUk5KRW1pMXFmdzFrdzdzaXlUbkp4TWUzczcxZFhWM0dwb1pPNjRERzQxTlBKeWx2eFU1RC9lJy4KCSAgICAncUpLc2ZXUUQ5SWthWjJSbVV2cjlhVjRhR1ljUWdqZk8zYVdvWUJGNWVYbTRld0lzdS9DYmRQejFhV2IwL3AxYk5vT3JReGxVaXVpYUZvM2MzRnlFRU94OStDOUNDRDZwYWFUVycuCgkgICAgJ3AvVFh5WWtUSjBYZTU5amY3UU95QUtEV3AvUVh4Y0ZRNjFQNHBUM1NoQkJjdm5VSElRVGp4bVgxOS84QkNlVmcrL0dQcHNrQUFBQUFTVVZPUks1Q1lJST0nIDsgCgoJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgkvLyBsb2NrLnBuZwoJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgkkdGhpcy0+aUJ1aWx0aW5JY29uWzddWzBdPSA5NjMgOwoJJHRoaXMtPmlCdWlsdGluSWNvbls3XVsxXT0gCgkgICAgJ2lWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFCWUFBQUFXQ0FZQUFBREV0R3c3QUFBQUJHZEJUVUVBQUxHUEMveGhCUUFBQUFaaVMwZEVBQUFBQUFBQStVTzdmd0FBQUFsd1NGbHonLgoJICAgICdBQUFMQ3dBQUN3c0JiUVNFdHdBQUFBZDBTVTFGQjlBS0F3MFhEbXdNT3dJQUFBTkFTVVJCVkhpYzdaWGZTMXQzR01ZLzMrUHBySTdhaXN2bzJZVTZoNkFUQThKVzRycmxzRjRVJy4KCSAgICAncWlBc0Y5bWhsME4yY1lUUnk5Ry93cHRBWVdQRDlpSnRSeTVhc0RlN2NZRm15amFYT0xhTUltT3Jta1Jyakw5eVRtSVMzMTIwSnliV1FnZmIzUjc0d3VjOEx6dzg1OHZMT1VwRScuCgkgICAgJ09LNnBxU20ydHJiWTM5K251N3RiUEhZY2g3bTVPY0xoTUlBNjdrV2owYU1RRVdrNnRtMTdyTm0yTFNJaWUzdDdrc3ZsSkoxT1N5cVZrbHMzWjhTeUxNbmxjcVRUYVZLcEZMZHUnLgoJICAgICd6bUJaVmoxSGVZMlZVdGkyVFNRU1FTbWwyYlpkaTBRaXJLMnRNVDA5emVycUt0bHNscUdoSVNZbko0bkh2Mk4rZm9Gc05xdU9lOUZvdExseE9Cd21rOGxnV1JiaGNGZ3ltWXhZJy4KCSAgICAnbGlVaTBtcWFKb0F1SWkybWFjcmRPN2ZGc2l6eDN0bzBUZTdldVYxdnJYdFhFZ3FGbUptWllXVmxoWEs1TEI0L1U5a3dETDc4NGtZVjBBM0RZSGQzbTRzWFJ5bVh5d0tvUmk4VScuCgkgICAgJ0NoMDFEZ1FDSkJJSkxNc2lFQWhJSXBIdzJ1THorZXF0WXJFWUlxS1pwaW14V0V5Q3dhQ01qWTAxellQQklKcFhxVlFxc2J5OFRMVmFiV0tBL3Y1K1JrWkdNQXlEcnE0dWxGS0gnLgoJICAgICdIc2ZqY1dablorbnM3S1RScXdjbmswbUt4U0tGUXFHSmxWS3RydXVTVENZQjZPM3RyVzlVSS92OS9pWlBCL2o4czJIT25YMEZnSGZlWHBlZmZueksrZldmK2ZpanZoTHMwUHRHJy4KCSAgICAnRC9uMU9KOStNc3JsU3diMzczM0R3TUNBdDFFeVBqNnVBQ1ltSnA1NjE2OE5VNm5VcUZTRTluWmRQRTcrV3FDL3I0TktUYWdjQ0pWcURhVVVCNVZEQUE0UGE5eDdzTUxsU3dhbicuCgkgICAgJ1dqUm12MTNENy9lcnBhV2xvNjA0cU9wODhPRjdMQzQ4clBOb3NNcTVUaCtEZ3hkNC9YeUExcmJ6QURpN2o4am5mMlArK3dkY3ZTcjhNSi9pOGVvbUFLbFVxbjQxT3NEQVFEZUQnLgoJICAgICdnKyt5dVBDd3ptLzJ2VTgrbjJhN3NNRmZqNzltcDdCQnVWemlvRlNpWEhKeDNTS3VXMlJ6eTBVcDlkeG5RVnZPREFMUWVycU5SbjRaS2UwTXZ0YzZUcHpwbXFieGFsY1k5QXRvJy4KCSAgICAnMnYwNnQ1MTVDNzNZUWZ0WkI5R0xuRHJ0NExvdWp1UGdPQTRVaStDNnlPcFhKd1pySjdyL2d2NFAvdStEOVc3Zkx4VHorMVNjUXhyWjNhdFJMYVZ4ZGpiWTJkMTg0UjYvc0xIZScuCgkgICAgJ29wSFA3L0RvOTBVYStXV1V5ZXp6WkhPYlAvN2NmWDU0L2Rvd0UxZDY2czhUVjNvRStNZm4rTC96YjRYbUhQalJHOVlqQUFBQUFFbEZUa1N1UW1DQycgOyAKCgkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCS8vIHN0b3AucG5nCgkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCSR0aGlzLT5pQnVpbHRpbkljb25bOF1bMF09IDg4OSA7CgkkdGhpcy0+aUJ1aWx0aW5JY29uWzhdWzFdPSAKCSAgICAnaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJZQUFBQVdDQVlBQUFERXRHdzdBQUFBQkdkQlRVRUFBTEdQQy94aEJRQUFBQVppUzBkRUFBQUFBQUFBK1VPN2Z3QUFBQWx3U0ZseicuCgkgICAgJ0FBQUxEd0FBQ3c4Qmt2a0RwUUFBQUFkMFNVMUZCOUFKRHdFdk55RDZNLzBBQUFMMlNVUkJWSGljMVpUTGF4Vm5HSWVmYjJiTzVPU2NISk40b1dyRk5xY1VKWW9VRWdVMy9RZjYnLgoJICAgICdGN2d3Q2tJcnZkQkxVdHFxaUxoU2c5YmdCZHVGU0haZGlHNWN0a0ozeFJEYlVGd1VtZ2hOekJEYW5QR01rek9YNzlMRkpHUE1PU2QyMDRVLytCYnp2ZC83OEY0SC9pZUpkb2FkJy4KCSAgICAncFpLeFJGc3pBSS9EY1AwSGF6WFkyMnYrSEIwMWtlZTFQQS92M3pmbmp4NHhnR25IY05aZTdPdnVOaitjT0VGMVpBVHY1blVBNGpoQlNnbUFEQ1ZXbzhHZTJPZjl3YjE4UC9HNycuCgkgICAgJ29VWG1ZaTMwenFsVFZFZEdXTGgxZzJENk1ZbEtrWEdFMFZsOGFhMkdFQjE0OSs0eFhTenlvT0l3L21pbWlaVi9EUGIyNXBGT2oxM0E5Z09NRUNoaFVFcWhWWXFXS1VrOVFBVXAnLgoJICAgICdzVC9QNHM4UG1LbFVtTmhRYUlKYmtEVnFCYnB3NndaMnpVYzRObStlUGt1NXA0ZU9yZ3B1ZVFPRlVvVkNWeGNENCtOMDdkcEY5KzV0VkplV0dQQmpodnI3V0YxekM4QVNndGNQJy4KCSAgICAnSDhhN2VaMW9kaDRzaDUwbnp3Q3c5Wk5oM000U3R1dGl1MFgybkIvTHlqWjZsY0liVlRwZFFVL2pXVlB6TEFETTgrWkdCUmR0Qzd3ckYvTzdiUjk5aXUyNlZMODZpVTRTQUg0YicuCgkgICAgJ1BvNWQ2QVFoc3RNU3ZHeUk0d1M1RkpCS1NSd256RjhieXgvdStQanp6TUYxbWZyeVExSy9qbkNhaHFwMXhFb3BqRkxvTkVGSlNSSkh6Rjc5OWdXSHFhKy9RS2NTVVhCSTYwOWYnLgoJICAgICdBbDVXNHRlUVNpSERPaXBOVUtuTUkxM1J2bk9YQUlFS1FpeHZHV3lhOThTQzU2ME1Gd1BpcUVHODZKTThxNzlRMDZsdmhuT25keTUvQjZHUENVT01VdTNCUWdnOHowTTNHbUJaJy4KCSAgICAnaUdKbjN2MlZtc3FuZnpOeDdGRHVlT0R1ajhST0NGcGp0RzVUQ21PWXYzMmJKMDltc1AwSVN5ZE1mbkFVZ0Y4L080NVJBQTZXVFBqbHZYY0IrR243RnVSZi96QW5OWDZ4M0FSZScuCgkgICAgJ1BTZG1xTCtQL1lIa3dNR0RPR1dEWlRsUWNOQlJoUEVDb21nQi9ZZUhmcTJJbkYxa0xsWFVPa3BNYmlvMWJkN2FBVFJEL1gwTTFsUGVTbE0ydnQyWDFYQlpqWm5wTEcydG1aTzYnLgoJICAgICdMYlFWT0ljUCtIRzJVYXVIM3hnd0JxT3o5Q2MzbDF0QzI0RnorTXZVRHJvZUdOYjVpZjlILzFkTS93TFBDWU13OWZyeUtnQUFBQUJKUlU1RXJrSmdnZz09JyA7IAoKCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoJLy8gZXJyb3IucG5nCgkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCSR0aGlzLT5pQnVpbHRpbkljb25bOV1bMF09IDU0MSA7CgkkdGhpcy0+aUJ1aWx0aW5JY29uWzldWzFdPSAKCSAgICAnaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUNnQUFBQW9DQU1BQUFDN0lFaGZBQUFBYVZCTVZFWC8vLy8vLzJYeThtTGw1Vi9aMlZ2TXpGaS92MVd5c2xLbHBVK1ptVXlNakVoLycuCgkgICAgJ2YwVnlja0psWlQ5WVdEeE1URGpBd01EeThzTGw1Ym5ZMksvTXpLVy92NXl5c3BLbHBZaVltSCtNakhZL1B6Vi9mMnh5Y21KbFpWbFpXVTlNVEVYWTJNcy9Qend5TWpMRlRqZWEnLgoJICAgICdBQUFBQVhSU1RsTUFRT2JZWmdBQUFBRmlTMGRFQUlnRkhVZ0FBQUFKY0VoWmN3QUFDeElBQUFzU0FkTGRmdndBQUFBSGRFbE5SUWZUQ0FrVU1Tajl3V1NPQUFBQkxVbEVRVlI0Jy4KCSAgICAnMnMyVTNaS0NNQXhHamZ6SmFuRkFYRmtVbGUvOUg5SlVLQTFnS1RON1l5NllNamwra05QSzVybFpWU3V4ZjFaUm5sWnhGWUFtOTNObklLdlIrTUVIVWdxQlh4OTN3WkdJVXJTZScuCgkgICAgJ2grY3RFZ2JwaU1vM2lRNGtpb0hDR3hpci9aWVVicjdBZ1BYczliWDBCQ1lNOHZOL2NQZThvUVl6b20zdFZzU0JNVkhFb09KNWRtNUYxUnNJZTlDdHFHZ1JhY0NBa1V2UnRldlQnLgoJICAgICdlMnBkNnZPV0YrZ0N1Yy9icmN1aHlBUmFrQlU5RmdLNWJVQldkSEVIOHRIcERzWm5SVFpRR3pkTFZ2UTNDenlZWmlUQW1TSU9ERXd6RkNBZEpvcHV2YnBlWkRpc0o0cEtFY2pEJy4KCSAgICAnaWpXUEpoVTFNakNvOWRrWWZpVVZqUU5UREtZNkNWYlI2QTBuaVVTWmpSd0ZhblIwbDlpL1R5dkduRmRxd1N0cTVheE1mRGJ5QmtzbGQvRlV1bXZ4Uy9CZDlWeUp2UURXaWlNeCcuCgkgICAgJ2lPc0NIZ0FBQUFCSlJVNUVya0pnZ2c9PScgOyAKCgkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCS8vIG9wZW5mb2xkZXIucG5nCgkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCSR0aGlzLT5pQnVpbHRpbkljb25bMTBdWzBdPSAyMDQwIDsKCSR0aGlzLT5pQnVpbHRpbkljb25bMTBdWzFdPQoJICAgICdpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQ0FBQUFBZ0NBWUFBQUJ6ZW5yMEFBQUFCR2RCVFVFQUFMR1BDL3hoQlFBQUFBWmlTMGRFQU5BQXR3Q2xGaHQ3MUFBQUFBbHdTRmx6Jy4KCSAgICAnQUFBTEVBQUFDeEFCclNPOWRRQUFBQWQwU1UxRkI5QUtEUTRSSVhNZWFMY0FBQWQxU1VSQlZIaWN4WmQ3akJYVkhjYy81OHpjdlROekg4dnVzcXc4RnNUc0tpQ1VVaDVXQlpYRycuCgkgICAgJ0drT3B0bXF3TldzV0xLWEZHbEVwelpJMEFXTktTeTBXaERTMjJnSkt0V2xUc1NScXpZSXVMR0IyV1Z2REl3UU1aUU1zeTJPRmZkemRlKy9PbkhQNng5MDd2SmFGcGpiOUpaTTUnLgoJICAgICdjODVNZnAvZjkvczdKeG40UDRlNDFndFN5cDc4V0d2dGZkRUFjcURGWVVPSDlIUzBOaEdrOXRQYi9pbFN5cDc4OVVVQjJBTXVxaFF5M1V6bTdIR2tFNlczZFROWk1SSTNFY1dPJy4KCSAgICAnamY5Q2xMbVdCVDNkelc4alVzZXZXSENHM1VwV2wrSWtIU3huYkRoL01jejEyTmV2QmN1V1hUbWY2VGpuWHZKODhnRG1WQjNwdzMrbnQzVXpIYTFOcU16QlMyenFQTEdGanRNTicuCgkgICAgJ1pOcjNYZFcrcXlxd1pjRms3NkhYL3RIV2Z1UXZ5TzRXN3FoYUh3TDhlZmtNUmxSVXBQdjdycUQwUnJKK0ZnQWpMeTFhMjBPSXhaSkVFdU5DUmZJQXBqK29tNGJHTTN1Mi9zWVUnLgoJICAgICc5SjQxZDg5NzNmM0RoZzFwSVNUVjFkWFhCUk5KeFBHRkN6aG91K0RDUXJTY1pPa2t0TmFlRFpqYW1nZVo5TWdpWW1WRGNjdkhoakF6SncwTlRoOC9hbHlaTWFWSmljcDBpVEhqJy4KCSAgICAnSnBnTnYzOHRqV1VoaEdST2RiVUw5VzUvTUg1WENramxjaWJpK0tJb3A1TFZITEtFdThBL2Y0cjI4NmRvYTlwR3JHd1lBQXNmcWJiSDNiOE1nTy9OcWd5Nld2ZGJiWEhNa0VGSicuCgkgICAgJzR4VU9NVkV2YVRadTNCZ212RjRZazRoejlyTy9VbHI1Y0U5b3dhZS9yY0d4b2hTT3VpV2tDMklqY0lxS3lQWm0rT21DSDdHaG9aRUYwNzdFRXpWVndlQWJKK3JpRWVPMEV5OHknLgoJICAgICdVdWJxT0huMEFPZ013dmY1OXR4bkJyU3A5ZGd4S21mLytrSVAxTlk4U0ZrMGpoNWFqbU5IQVdnNWIyRTVFZXhvakdIamJpVlJNb1JNTnMwTEMrWXo0NnZUdUgzZW5ON0JJOGZyJy4KCSAgICAncUZkbzBCb1ZaTkM5YVZTUTRmTmpCekVtUUppQVJ4YisvQXFZUE1BVkI1RnNQVTV2MzdnOU94Z0xoZTE0Wk01L2p1MDUyRTZNTlp2ZjVwbUhIdUxtbVdPa0V5c3hVdHBHQXRtZScuCgkgICAgJ2R0SFRmbEprZXpxUXRvM2pGUm5Mc3N5ZjFqeWR4aWlNN3pObnllL2MzWnNxTHUyQk41ZmNNZnpydi9oYnkxdFB6bVJVb2loY1RKODdDd1FJMnlMdERjSXFzSWpZVWY1MXFCbGYnLgoJICAgICdPblNjT1NyZFFVT01VUmtpWHNMVXpKbnZiR2hvQkdESEg1Y0d5WkxoT3BZb05sNWhxWW5ZRVhPdTVmRGw5ZVlBSG50eDk4bjhoRkhaY1BIVXVUU3hTQVNBZUsvQ0dJT3hKSjBmJy4KCSAgICAnYk9HTlBVMjgwZGdrcTZZMnl1OHZmakNJbHd3enIrL1pRL1BITzBnT0x1TzVxc2Z0RFEyTmJOKzRPQ2dxRzZXVHhXVmFxNnpwRitEaVNIV25pY2R5bHAzcjZhWlRXdGhJT3JOcCcuCgkgICAgJ2t0SGN2QnUwc0hYMVNtNm96QjNCNDJkOTB6WkE5YlFwN1B2Z1BTelhaZm5xWC9IUzRES0tLMit4NjlZL0hVUnMyNmlCQU41Y2NzZnc3Nzc0VWN1bUYzN0M2ZjA3S1N0Mk9IamknLgoJICAgICdERVVKRDB0SVNqeVByclNQbEFLdk4wSlAvVTRPMU5manVoRzJydmtsTjFTT3BmWHdmdHBiVHFBeUtScmZmNWZiN3JzOVYxUjdtNHdsejJpaEEzSHBtWGZsVVd5T0gydW1wTGlZJy4KCSAgICAndWkzdjhNKzZiV3pmc1JOYlNncWt4YUNraXkwc2ltTXVFV0VocGNSekloUVdPSUFoNnRpQXdTNG93SW5GaVRvdTVkT25NbmwyTlIrK3VqQndYRWM5dGVyRDZNNDNucmo2TGdBQicuCgkgICAgJ1FuRFBBOS9pcnRrUDhKUlM3SHIvM1Q2WWVrRFExcEVpRVhPd3BVVkp6Q1ZsWlpGUzRtWnRrcEVvOUNoQWtEcC9qdExNQkFDeTZTNFJpUWdoTHl2NWNnQlJQbktVT1g2c21VR0YnLgoJICAgICdoU2lsME1ZdzlkNzdtUHkxZTVtbkZFM2JhdG0zY3p2YjZuWWdFSnp0U0ZHVTlMQ1JsTVJkVWpJSDArbG5FTUl3UE5YRDNOdW1vVkpuck1DSmFpY2lNVVpmdlFuejRRY0JTdlYxJy4KCSAgICAndmpFNUdLMzU4dDB6bVhEbkRCNzlzYUxwbzIwYythU1JEK3QyNUpUcDdHWlF3c0VXRmlWeGw2aGxVZi9XTzl6MzJDeG1MMXJPZTZ1L0kyS3V3R2h6TFFDQjcvc1lZOUJhaDNlbCcuCgkgICAgJ0ZLYnZyclZtNHZTN0dILzduY3grY2hFSEd6N215Q2VOYlB0b08wSkkyanE3OFdJUkxHa3pzcXM3VjVTZkZWNUVvdlhBQ29pcXFzZk5wazJ2bzVWQ1d0WUZCZm9VMFZvVEJBRmEnLgoJICAgICdhN1RSYUsycCtNb1VSaytjeE16cStSemJ2NDlERGJ1bzI3VVRXOWgwZGVkc3NQeHVLK2tJZk44WHhoZ0RZUFZYZjJGaDRYS3RGSWw0QWlrbEFsQktBWVJLS0szNndISXdlVEN0Jy4KCSAgICAnTmZIaUVrYU9uOGowKzcvQm1ERmphVDMwR2JIeXdTeGN1WmtwRmZGZyttMWpqWi9ObW5Wdk5mUnZ3ZDY5ZThXQkEvdU5GQUloNEpWWFhtSHNtREhFNHZFUVFnalEybHhRSW05TicuCgkgICAgJ256MzVxM0JFT1pPSHphRzJ0aGFBNG1SVStMMjlJdCtJVjIxQ3BiUlFmZU1GQzM1Z1JCL00yclZydWJueVptTHhXSmhFQ0JFbXovZUh5by83bE1sSDNMRkZ1anN0aE5GQ0NHT3UnLgoJICAgICcrV055ZVVncGpTVnpNS3RXcmFLeXNoTFBkY1BFZVlXQ0lFQmRwSXhTaXZyNmV0YTh2STdkNitjR25oZFYwNnBlMVFQK0YvUVhXbXVSTCtqWlo1OExsVm14WWdVVkZSVjRyaHR1Jy4KCSAgICAnNFR6TXhYQUE2WFJhUkF0c1lVa3g4SS9KdFNKUU9sU3dwbVpwQ0xOOCtmUGNkTk5vSE1mQjkvMFFKZ1JvUDI5NVRsUjdVVnY4eHhaY0hNdVdJWjkvSG4zNXZHM0pFR1pwelZKRycuCgkgICAgJ2p4NU4xSWxpdEthaHNaRTFMNjlqNjlxSGd4K3VyRlgvbFFMOUpZZExsZm5aaWhVaHpPTEZpOE4zTWwxZHRoT3hWSC9mLzgvQ3RxU0oySmFKMkpaNTlKN1JQc0MvQVZpSnNRUy8nLgoJICAgICdkQm50QUFBQUFFbEZUa1N1UW1DQycgOwoKCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoJLy8gZm9sZGVyLnBuZwoJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAgICAgJHRoaXMtPmlCdWlsdGluSWNvblsxMV1bMF09IDE4MjQgOwoJJHRoaXMtPmlCdWlsdGluSWNvblsxMV1bMV09CgkgICAgJ2lWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFDSUFBQUFpQ0FZQUFBQTZSd3ZDQUFBQUJHZEJUVUVBQUxHUEMveGhCUUFBQUFaaVMwZEVBQUFBQUFBQStVTzdmd0FBQUFsd1NGbHonLgoJICAgICdBQUFMRUFBQUN4QUJyU085ZFFBQUFBZDBTVTFGQjlFQ0FRZ0ZGeWQ5Y1JVQUFBYWRTVVJCVkhpY3pkaHZiQlAzSGNmeDkvMnhmZWZFT0E1Sm9DTk5uSVQ4QWR0Wm1ZQkVUSnNJJy4KCSAgICAnNitqUU9sUWloVDFBWWd5dHF6WnBEMWF0ZnlZcWxUMWgwbFJwVDdhUko0TlFwUnZaR0VMVnVvNVVhOWpFSkRJRVRRc05ReVBCc1VKTVdHUG5qLy9lK2U3MndOZzR4RWxNUjZlZCcuCgkgICAgJ1pObG4zOTMzZFovZjkzZjZ5ZkIvc2dtckhkRFYxV1hsUGc4TkRaVURTY0Q4TEZGRkVaWmxXWVpoV01GZzBPcnE2c3EvZ0RKQWZGeTFpaVp5OU9qclZuajRKelExck1XcWZ4bS8nLgoJICAgICczMDlqWXlOdGJXMGtFZ251M2J2SDRjT0g4OGMvanFTS1FsNC9YR2tkK2VWdEFONDZ1cDFMSDkya3RxWVMrK1pYOFB2OU5EUTBzR25USmxLcEZPRndtTzd1N3Z5NUl5TWplVlJkJy4KCSAgICAnWFYxK1dFT2gwSXJZNHBEbnE2d1hYL3NUaUNKYU1rRlpkUk5xeGVmb2U3VnRDU3FYVkRxZFpuWjJsdHJhV2t6VHBLcXFpanQzSnBGbEc3ZHZqN056WjFmKytxRlF5QTNFQ2xITCcuCgkgICAgJ1FsNzQzbkZraHhQRHRKQWQ1ZVRhWVNWVWZYMDlsWldWbEpXVklVblNnN3NWUU1CQ1VjdTRjZU1HZS9ic0lSUUsxUUF6T2N5eWtJTTlQMEt5dWRBeUNXeXFHOG5od3FhNFNrTHQnLgoJICAgICczcjBiVlZWeHU5MjRYQzQwVFVPV1pVUXhlOTdDd2dJZEhSMkxNSEl4U0NhVkluVnZGRWx4RTB2TVkxUGQyTlVLSk1XTlRYSGxVZkYvLzR2RVRKQ2Vsd2JwRm0zTWpQMmR0Mzd4Jy4KCSAgICAnQWxOK1B6VTFOVmlXUlN3VzQrN2R1M2c4SGp3ZUQ0cWk1RUZBSnpBRXhJcENBTmJvb3hocGxmQjBGSnZUZzZ4V0lxc1ZSVkY2TW9wa1UzRlhQY25rSnhHVTBWRUFkRjJub3FLQycuCgkgICAgJ1czLzhEcG5xTGp6ZXAybHVic2JsY2pFOFBFeEhSOGZib1ZESUQ5eFlGcExCRHBKRjBqRFFJbmNRcFdsa20zMUZsRkx0cDlQZnl1Vy92WVFqMWtQU3VSVy8zOCtsajI3UzJRN3YnLgoJICAgICcvYVdYVUJWVWZmVk50bTNibGl2VkNFd3NDNUV5YzVpaUFwRXBERUFYTXFRZGxkaFNpV1ZRSGpKYWd1ZCs4RnVleGNrL3p2K0s4MmRmb1NiU0NzRGU3NS9rbSs0R1ZQZDYrbDV0Jy4KCSAgICAnNHpKSGNxVlVZTjJ5RUV0WlFEQ1NKQ3VlUkFZc1BZNDlIc0ZJWlZHNnAyNUpVdW1GYWZUNERLSk40YW10VDdOejM4c2s1KzVBNzBITXRFWXlNa0ZpWmh4empRL3BvWHJMUXJSVScuCgkgICAgJ0RGR0VlRnBBbGtRa200cFJpQ3BJS29kS3prMFQvMlFNaCtwaVBqeEtaUHdpU2tVdHUvYjltTm5KRVdTN0U4bmhBbXZwTTYwb0pEa1hKeHFOb3p4UlJVeFBJZXNpc3BCQmxzWFYnLgoJICAgICdVYUtFRm84Z3pvYUpoejhzMmxPbXJwVUcrV0JoSjkvNjBnK1orZkRYVEFYZnhsbFJqbDFWa08wT0ZBVHNZaFlsaWlLMjFaS0toaEhuRnZlVXFTZEtnd0FFT3A3RjJ2NTF2dnc4Jy4KCSAgICAnWEg3L04xd2QvQmxUd2V1VVY2NUJkdGdmb0xUU2tpcHNkRDN0UmkwVllwb21tVXdHd3pEd2RUNUhZRWMzZ2lBd2N2SDNqTHozQmxQQjY3aldlWkJFS1lzU0JXd3BIWnROS280cScuCgkgICAgJ2FIVERzSmVlaUdFWVdKYUZaVm1ZcG9tbWFSaUdRZFBudjBiYjFtOGdTUkwvdlBJT1Y5NzlhUjRsbUFKMnA0cUNnQ3hrc051S0o2Vk5weDROWWhnR3Bta3VRaG1HUVRxZHhqQU0nLgoJICAgICdxcjJkN0h0eEVFRVF1SDF0a0t2dnZrRjQ0dHFEbnJJY0tKS0FQZjFnK0xBVUVscThkSWl1NjBzQXBtbm05M1BmemM3T1loZ0dyaWUrd0ZlKyt6dGNMaGNUMXdmNTRQelBDVTljJy4KCSAgICAndzdYV2pXUzNJZHNkT0FVQldaQXhyUkpuVFE2U0c1YmNlMkZDcG1rdWdobUdRU3FWWW01dUR0bmo0NHNIMzhUdGRoUDYrRHdmLy9WNHR0SFhya0dVUlpKYWljOFJnSFE2aldtYScuCgkgICAgJ1NKS1VMNVJMS05mSU9jekRLRjNYU1NhVFJDSVJoTEpXbnRwM25HZldyU014YzVPTGYzaU5QNCs2OFQ5VWI5bkY3NmxUcHhnZkh5Y2FqWkpLcGRBMExaOUdiallWN2hjRFdaYUYnLgoJICAgICdwbW5Nejg4VGk4VVl1blNMbXUxSEZpMmFWa3hrYUdqSU5UWTJ0dERiMjR2WDYrWFFvVU5zM3J5Wjh2SnlJRHUxQlVGWWtreGhneGVpV2xwYU9IUG1ERTFOVGRUWDF4ZTk4ZVdHJy4KCSAgICAnSm5GLzlkUVpDb1hVWURBNEFPRDFlamx3NEFDdHJhMlVsNWZuaXdtQ2tFY1VKaVVJQW9GQWdMNitQbncrSDIxdGJmVDM5ejhTeENTN2hIc2ZXSDkvOGRMNE1LcW5wNGVXbGhhYycuCgkgICAgJ1RtY2VrRXZNTkUyYW01czVjZUlFZ1VDQTl2WjJUcDQ4aWMvblkzajRVc21RSENZT2pKSHRwZUJLcUwxNzk5TGMzSXpUNlVUWGRSb2JHeGtZR0tDOXZaM1cxdFo4S284Nk5KOGEnLgoJICAgICd0WEhqUm80ZE84YnAwNmZac21VTEd6WnNvTCsvbjBBZ2dOZnI1ZXpacy84VnBHVFU1T1NrYy8vKy9hY0JmRDRmMWRYVjdOcTFpNGFHQnM2ZE80ZlA1K1BxMVN1UEJiSWl5alROJy4KCSAgICAnUlVuVjFkVU5YTGh3QWEvWHk0NGRPNGpGWWdCRW85RkZGMXIxMzRCUHVZbGsxNkxyQVlYc0FsbXRxNnNiS0R3b0ZBcDltK3lrdVA1WlFWWkYzZjh0Q2R3Q292OEx5SElvQUFOSScuCgkgICAgJ0FYZi9BMVRJMFhDRGg3T1dBQUFBQUVsRlRrU3VRbUNDJyA7CgoJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgkvLyBmaWxlX2ltcG9ydGFudC5wbmcKCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoJJHRoaXMtPmlCdWlsdGluSWNvblsxMl1bMF09IDE3ODUgOwoJJHRoaXMtPmlCdWlsdGluSWNvblsxMl1bMV09CgkgICAgJ2lWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFDSUFBQUFpQ0FZQUFBQTZSd3ZDQUFBQUJHZEJUVUVBQUxHUEMveGhCUUFBQUFaaVMwZEVBQUFBQUFBQStVTzdmd0FBQUFsd1NGbHonLgoJICAgICdBQUFMRHdBQUN3OEJrdmtEcFFBQUFBZDBTVTFGQjlFQ0RBY2pEZUQzbEtzQUFBWjJTVVJCVkhpY3JaaFBhRnpISGNjLzg5N3M3bHV0SkNzcjJWSHNPSFdNazBNUGJzQlVyY25GJy4KCSAgICAnT0ZSZFNvNkZOaGRCNlNHSGxwRG1ZdEpDRHlveHlLZTZFQnhLUWt0N0tLTDBUNkFCbzBOYmNpcWlndEM2UGhXS0kyTkZxcXhkU2Q3VjIvZG1mdFBEdlBkMjEydDU1ZENCWWZiTicuCgkgICAgJ3pwdmZaNzd6Ky8xbWRoVWp5dFdyVjkzSGYvMjRlRDV6OWd3aU1sRGpPS2JiN2RMdGRoRVIydTAydTd1NzNMcDFDeEVaQnc0QWVad2ROUXFrTWQ5d2J6aUZHSU5KVXQ2clJiejUnLgoJICAgICcxcHRVcTFYSzVUSkJFQUFVTUh0N2UrenU3Z0t3dkx6TXlzb0t3QW5nL3VOZzlDZ1FnRktsZ2cxRFVKNjdWcXR4NnRRcFptZG5pYUlJcFJUT09aUlNkRG9kZG5aMmFMZmJMQzh2Jy4KCSAgICAnczdTMHhKVXJWN1pHd1FTajFQaGhmUm9kVmREbE1ycGM1dnVwNVoyZnZNUGR1M2ZaMjl2RFdqdnd6dGpZR1BWNm5WcXRScVZTNGRLbFN5d3RMUUZzQWRPSDJYd3NDRUFwZzNqbCcuCgkgICAgJ3c5OFJhazJndllqTlpwTm1zMG1TSkRqbkhna0RNRGMzZHlTWVEwRWE4dzEzOVlVWDBPVUt1bHp5ZzdVbUNFTytsMWh1dkh1RHJhMHQ5dmYzaDFUSllTcVZ5cEZoSHF1SXJsUUknLgoJICAgICdTNXF2L3VJREFDNy80YmNFUVlBS3ZLKzBXcTFEVlFHSW9vZzdkKzRjQ2VhUklJMzVocnQrOFNzRU9rUmxVYUV5UjBVcEZJclhIeHlNVktWVUtuSHYzcjBqd1J3YU5lbEJqQmpMJy4KCSAgICAnU3ovN0tZdUxpd0FzTGk3eTR6LzlrWTllK1Rwa0N1U3FqSStQbzdYdUFXZUtYTHQyRFdOTVVaTWt3UmpEaFFzWFdGdGJLNkpwQ0NUM2pmUWd4b21QdFBYMTlZSFdpY001eDNjMicuCgkgICAgJzczUGozUnU4L2FPM21acWFvbEtwb0hWdnl1dlhyL1BwbmYvUTd1enozODBOUHR1NHkvcW5HK3p0ZDFoZlgyZHRiUTNnSXZEblJ5cVN4bDFVb1BqeXo5OEQ0UFRwMHdQdHEzOVonLgoJICAgICc0ZmR6THhlZ3JWYUxWcXZGNU9Ra1lSZ1dxcFJLSlo3N3d2TnNiVzFSRzV0Z2ZLTE9USDJHN1oxdHdxQlFyZ3JNRHZoSW5qZlNPQ1k1aUl2K2hZV0ZnUlpBckVXc1pXRjk0MUJmJy4KCSAgICAnU2RNVWdNbkpDV3BqVlU0Y24rSFV5ZVBNMUdjNCtmUlVQa3pCSTV3MWpidWtjY3pMdi81bDBYZm16Sm1CRnVDYmEzOHIvQ1JYcFQrQ3JEVW9aMGpqQjRSWW9uSkFPWVJvYkpLVCcuCgkgICAgJ3o1emdxZnF4QWJzRlNINm1wSEZNMnFkR1hoNFZub1ZpRDZtU0pGMmNUUWVxRHFCYUtWSFdtb25KQ1dwWmpoa0M2YW5SNVdzZmZUZ3dhSFYxRmFVVXE2dXJBLzJ2M2Y1azRMblYnLgoJICAgICdhckc5dFVuM29JMllCQ2NXSFlBeE1WWXMxcVpFWlkyU0ZCMmFZWkRHZk1OOWQ3dUppV1BTZUZpTm81UmNsYzNOVFhaYk82UnBGN0VKVml4WUE5YWd3d0RuVWlxbEVQZFEzaW1pJy4KCSAgICAnSm8yN0JHSEl0Lzd4OXlFamMzTnpoMjdOYTdjLzRUZGZmS2w0YmphM2FlNU1VSXUwVC9IT0VJYU9wSnQ0Z3dvU3NWVEs0U0JJWTc3aEZ0WTNBQkJqQmlaOTByS3d2c0g3Ny8rSycuCgkgICAgJ3QzN3dPaE8xaVBwVGs0U0J3MW1Mc3o2Q25LUTRsM3FWK2tFK3Q5WEhsTlpPaytiVUpMVklFMVZDY0lKV1FtSjZxamozME5iY1hMa1pNdDhZUGlnK1ozbjFHNWZaMzkvai92WTInLgoJICAgICc5Y2txWlQyT2NoYm4wcDRxTmtVL2REZlVBRGRYYmg0SFhnUk80ek5kRVUwWEwxNzg0UExseTV3OWU3WjRTYXpGT2ZHckVvdERjT0tyY29KUG1yWUlYZi9ab3AzUU5kMXNrdUd0Jy4KCSAgICAnY1VBYjJNZ0F4dkhaVGdGVXExV21wNmVablowRjhKbFRqRGR1RFRoQm5EZUVDRW9KdGJHSXA2ZW5xRWJsekNjRVoxUEVDVTR5VlJpT0dnZDBnYytBQjBDWnZrdjFzV1BIT0hmdScuCgkgICAgJ0hPZlBuOGRhNDFjcGtrbHRFQkVQSmhZbkJrVFFKY2RZVktHa2dSeENmQnNxNXhYTmdBYTJCbitoalRPZ0hFS0JQOHB6UlV4eWtJSDRpZkxKUlRKQWwrVU1CSnpQSFE2YmZlL2YnLgoJICAgICdjV0l6UHhsVXBEK3p1Z3pJWnRWazFkOHpuQkFxUnhnb1F1VlFnU0pRM2g5QzVRaERSWWdqVUlMQ0F6bG5FZHNIWVRLZk1URUJjUDdGNTRZVUdWbWMyR0xsSW42dmU2djBhaFN0Jy4KCSAgICAnOFgyNVR6akorckl4MWdyS3BRUFdSNExrR1ZWc01nZ2h2UzBxalBkdm01T2VjZU9UV0E1RXZvMm1GemtqUWZMN2haUFV5NXl2dkYvdVBGUUwzK25iRG1zTENFbVQzc1RtQ1ROcicuCgkgICAgJ3JvZ1Q2eUZzT2l4M2Z0dzdPd1Foa3ZTVTZDdWluaENrMCtrQWtGb0JhekVFSUNIYUhIaVBWbVUwZ25VcDRFQWMxbVlyRjBFQlZwd1BpMzRWckJrd1B4S2szVzVqdS9lNS9jK2QnLgoJICAgICdiR1VISUFJdXlkVElFNXpmYzVXcjRsSmNhaEhuSFRQM0NWR203OERyZ1kzOE4rREVpYnA3ZG1ZS2RBUW1CaDFoakVGamlzKzlDVFdZR0syMUg2UHhQeU9JMERvYll3elpGL3o3Jy4KCSAgICAnN2phZFR2SnRZRzBrQ0Q3bGZ3bDQ5aWpnVDFnYzBBSCtkWlNKQS94QitNei9HU0l2Rm9qL0I3SDFtQWQ4Q08vekFBQUFBRWxGVGtTdVFtQ0MnIDsKCgkkdGhpcy0+aUxlbiA9IGNvdW50KCR0aGlzLT5pQnVpbHRpbkljb24pOwogICAgfQp9CgovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLyBHbG9iYWwgY2FjaGUgZm9yIGJ1aWx0aW4gaW1hZ2VzCi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiRfZ1ByZWRlZkljb25zID0gbmV3IFByZWRlZkljb25zKCk7CgovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLyBDTEFTUyBJY29uSW1hZ2UKLy8gRGVzY3JpcHRpb246IEhvbGRzIHByb3BlcnRpZXMgZm9yIGFuIGljb24gaW1hZ2UgCi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CmNsYXNzIEljb25JbWFnZSB7CiAgICB2YXIgJGlHREltYWdlPW51bGw7CiAgICB2YXIgJGlXaWR0aCwkaUhlaWdodDsKICAgIHZhciAkaXhhbGlnbj0nbGVmdCcsJGl5YWxpZ249J2NlbnRlcic7CiAgICB2YXIgJGlTY2FsZT0xLjA7CgogICAgZnVuY3Rpb24gSWNvbkltYWdlKCRhSWNvbiwkYVNjYWxlPTEpIHsKCUdMT0JBTCAkX2dQcmVkZWZJY29ucyA7IAoJaWYoIGlzX3N0cmluZygkYUljb24pICkgewoJICAgICR0aGlzLT5pR0RJbWFnZSA9IEdyYXBoOjpMb2FkQmtnSW1hZ2UoJycsJGFJY29uKTsKCX0KCWVsc2VpZiggaXNfaW50ZWdlcigkYUljb24pICkgewoJICAgIC8vIEJ1aWx0aW4gaW1hZ2UKCSAgICAkdGhpcy0+aUdESW1hZ2UgPSAkX2dQcmVkZWZJY29ucy0+R2V0SW1nKCRhSWNvbik7Cgl9CgllbHNlIHsKCSAgICBKcEdyYXBoRXJyb3I6OlJhaXNlTCg2MDExKTsKLy8oJ0FyZ3VtZW50IHRvIEljb25JbWFnZSBtdXN0IGJlIHN0cmluZyBvciBpbnRlZ2VyJyk7Cgl9CgkkdGhpcy0+aVNjYWxlID0gJGFTY2FsZTsKCSR0aGlzLT5pV2lkdGggPSBJbWFnZTo6R2V0V2lkdGgoJHRoaXMtPmlHREltYWdlKTsKCSR0aGlzLT5pSGVpZ2h0ID0gSW1hZ2U6OkdldEhlaWdodCgkdGhpcy0+aUdESW1hZ2UpOwogICAgfQoKICAgIGZ1bmN0aW9uIEdldFdpZHRoKCkgewoJcmV0dXJuIHJvdW5kKCR0aGlzLT5pU2NhbGUqJHRoaXMtPmlXaWR0aCk7CiAgICB9CgogICAgZnVuY3Rpb24gR2V0SGVpZ2h0KCkgewoJcmV0dXJuIHJvdW5kKCR0aGlzLT5pU2NhbGUqJHRoaXMtPmlIZWlnaHQpOwogICAgfQoKICAgIGZ1bmN0aW9uIFNldEFsaWduKCRhWD0nbGVmdCcsJGFZPSdjZW50ZXInKSB7CgoJJHRoaXMtPml4YWxpZ24gPSAkYVg7CgkkdGhpcy0+aXlhbGlnbiA9ICRhWTsKCiAgICB9CgogICAgZnVuY3Rpb24gU3Ryb2tlKCYkYUltZywkeCwkeSkgewoKCWlmKCAkdGhpcy0+aXhhbGlnbiA9PSAncmlnaHQnICkgewoJICAgICR4IC09ICR0aGlzLT5pV2lkdGg7Cgl9CgllbHNlaWYoICR0aGlzLT5peGFsaWduID09ICdjZW50ZXInICkgewoJICAgICR4IC09IHJvdW5kKCR0aGlzLT5pV2lkdGgvMiokdGhpcy0+aVNjYWxlKTsKCX0KCglpZiggJHRoaXMtPml5YWxpZ24gPT0gJ2JvdHRvbScgKSB7CgkgICAgJHkgLT0gJHRoaXMtPmlIZWlnaHQ7Cgl9CgllbHNlaWYoICR0aGlzLT5peWFsaWduID09ICdjZW50ZXInICkgewoJICAgICR5IC09IHJvdW5kKCR0aGlzLT5pSGVpZ2h0LzIqJHRoaXMtPmlTY2FsZSk7Cgl9CgoJJGFJbWctPkNvcHkoJHRoaXMtPmlHREltYWdlLAoJCSAgICAkeCwkeSwwLDAsCgkJICAgIHJvdW5kKCR0aGlzLT5pV2lkdGgqJHRoaXMtPmlTY2FsZSkscm91bmQoJHRoaXMtPmlIZWlnaHQqJHRoaXMtPmlTY2FsZSksCgkJICAgICR0aGlzLT5pV2lkdGgsJHRoaXMtPmlIZWlnaHQpOwogICAgfQp9CgoKLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8gQ0xBU1MgVGV4dFByb3BlcnR5Ci8vIERlc2NyaXB0aW9uOiBIb2xkcyBwcm9wZXJ0aWVzIGZvciBhIHRleHQKLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KY2xhc3MgVGV4dFByb3BlcnR5IHsKICAgIHZhciAkaUZGYW1pbHk9RkZfRk9OVDEsJGlGU3R5bGU9RlNfTk9STUFMLCRpRlNpemU9MTA7CiAgICB2YXIgJGlDb2xvcj0iYmxhY2siOwogICAgdmFyICRpU2hvdz10cnVlOwogICAgdmFyICRpVGV4dD0iIjsKICAgIHZhciAkaUhBbGlnbj0ibGVmdCIsJGlWQWxpZ249ImJvdHRvbSI7CiAgICB2YXIgJGNzaW10YXJnZXQ9JycsJGNzaW1hbHQ9Jyc7CgkKLy8tLS0tLS0tLS0tLS0tLS0KLy8gQ09OU1RSVUNUT1IJCiAgICBmdW5jdGlvbiBUZXh0UHJvcGVydHkoJGFUeHQ9JycpIHsKCSR0aGlzLT5pVGV4dCA9ICRhVHh0OwogICAgfQkJCgkKLy8tLS0tLS0tLS0tLS0tLS0KLy8gUFVCTElDIE1FVEhPRFMJCiAgICBmdW5jdGlvbiBTZXQoJGFUeHQpIHsKCSR0aGlzLT5pVGV4dCA9ICRhVHh0OwogICAgfQoKICAgIGZ1bmN0aW9uIFNldENTSU1UYXJnZXQoJGFUYXJnZXQsJGFBbHRUZXh0PScnKSB7CglpZiggaXNfc3RyaW5nKCRhVGFyZ2V0KSApCgkgICAgJGFUYXJnZXQgPSBhcnJheSgkYVRhcmdldCk7CgkkdGhpcy0+Y3NpbXRhcmdldD0kYVRhcmdldDsKCWlmKCBpc19zdHJpbmcoJGFBbHRUZXh0KSApCgkgICAgJGFBbHRUZXh0ID0gYXJyYXkoJGFBbHRUZXh0KTsKICAgICAgICAkdGhpcy0+Y3NpbWFsdD0kYUFsdFRleHQ7CiAgICB9CiAgICAKICAgIGZ1bmN0aW9uIFNldENTSU1BbHQoJGFBbHRUZXh0KSB7CglpZiggaXNfc3RyaW5nKCRhQWx0VGV4dCkgKQoJICAgICRhQWx0VGV4dCA9IGFycmF5KCRhQWx0VGV4dCk7CiAgICAgICAgJHRoaXMtPmNzaW1hbHQ9JGFBbHRUZXh0OwogICAgfQoKICAgIC8vIFNldCB0ZXh0IGNvbG9yCiAgICBmdW5jdGlvbiBTZXRDb2xvcigkYUNvbG9yKSB7CgkkdGhpcy0+aUNvbG9yID0gJGFDb2xvcjsKICAgIH0KCQogICAgZnVuY3Rpb24gSGFzVGFicygpIHsKCWlmKCBpc19zdHJpbmcoJHRoaXMtPmlUZXh0KSApIHsKCSAgICByZXR1cm4gc3Vic3RyX2NvdW50KCR0aGlzLT5pVGV4dCwiXHQiKSA+IDA7Cgl9CgllbHNlaWYoIGlzX2FycmF5KCR0aGlzLT5pVGV4dCkgKSB7CgkgICAgcmV0dXJuIGZhbHNlOwoJfQogICAgfQoJCiAgICAvLyBHZXQgbnVtYmVyIG9mIHRhYnMgaW4gc3RyaW5nCiAgICBmdW5jdGlvbiBHZXROYnJUYWJzKCkgewoJaWYoIGlzX3N0cmluZygkdGhpcy0+aVRleHQpICkgewoJICAgIHJldHVybiBzdWJzdHJfY291bnQoJHRoaXMtPmlUZXh0LCJcdCIpIDsKCX0KCWVsc2V7CgkgICAgcmV0dXJuIDA7Cgl9CiAgICB9CgkKICAgIC8vIFNldCBhbGlnbm1lbnQKICAgIGZ1bmN0aW9uIEFsaWduKCRhSEFsaWduLCRhVkFsaWduPSJib3R0b20iKSB7CgkkdGhpcy0+aUhBbGlnbj0kYUhBbGlnbjsKCSR0aGlzLT5pVkFsaWduPSRhVkFsaWduOwogICAgfQoJCiAgICAvLyBTeW5vbnltCiAgICBmdW5jdGlvbiBTZXRBbGlnbigkYUhBbGlnbiwkYVZBbGlnbj0iYm90dG9tIikgewoJJHRoaXMtPmlIQWxpZ249JGFIQWxpZ247CgkkdGhpcy0+aVZBbGlnbj0kYVZBbGlnbjsKICAgIH0KCQogICAgLy8gU3BlY2lmeSBmb250CiAgICBmdW5jdGlvbiBTZXRGb250KCRhRkZhbWlseSwkYUZTdHlsZT1GU19OT1JNQUwsJGFGU2l6ZT0xMCkgewoJJHRoaXMtPmlGRmFtaWx5ID0gJGFGRmFtaWx5OwoJJHRoaXMtPmlGU3R5bGUJID0gJGFGU3R5bGU7CgkkdGhpcy0+aUZTaXplCSA9ICRhRlNpemU7CiAgICB9CgogICAgZnVuY3Rpb24gSXNDb2x1bW5zKCkgewoJcmV0dXJuIGlzX2FycmF5KCR0aGlzLT5pVGV4dCkgOyAKICAgIH0KCQogICAgLy8gR2V0IHdpZHRoIG9mIHRleHQuIElmIHRleHQgY29udGFpbnMgc2V2ZXJhbCBjb2x1bW5zIHNlcGFyYXRlZCBieQogICAgLy8gdGFicyB0aGVuIHJldHVybiBib3RoIHRoZSB0b3RhbCB3aWR0aCBhcyB3ZWxsIGFzIGFuIGFycmF5IHdpdGggYSAKICAgIC8vIHdpZHRoIGZvciBlYWNoIGNvbHVtbi4KICAgIGZ1bmN0aW9uIEdldFdpZHRoKCYkYUltZywkYVVzZVRhYnM9ZmFsc2UsJGFUYWJFeHRyYU1hcmdpbj0xLjEpIHsKCSRleHRyYV9tYXJnaW49NDsKCSRhSW1nLT5TZXRGb250KCR0aGlzLT5pRkZhbWlseSwkdGhpcy0+aUZTdHlsZSwkdGhpcy0+aUZTaXplKTsKCWlmKCBpc19zdHJpbmcoJHRoaXMtPmlUZXh0KSApIHsKCSAgICBpZiggc3RybGVuKCR0aGlzLT5pVGV4dCkgPT0gMCApIHJldHVybiAwOwoJICAgICR0bXAgPSBzcGxpdCgiXHQiLCR0aGlzLT5pVGV4dCk7CgkgICAgaWYoIGNvdW50KCR0bXApIDw9IDEgfHwgISRhVXNlVGFicyApIHsKCQkkdyA9ICRhSW1nLT5HZXRUZXh0V2lkdGgoJHRoaXMtPmlUZXh0KTsKCQlyZXR1cm4gJHcgKyAyKiRleHRyYV9tYXJnaW47CgkgICAgfQoJICAgIGVsc2UgewoJCSR0b3Q9MDsKCQkkbiA9IGNvdW50KCR0bXApOwoJCWZvcigkaT0wOyAkaSA8ICRuOyArKyRpKSB7CgkJICAgICRyZXNbJGldID0gJGFJbWctPkdldFRleHRXaWR0aCgkdG1wWyRpXSk7CgkJICAgICR0b3QgKz0gJHJlc1skaV0qJGFUYWJFeHRyYU1hcmdpbjsKCQl9CgkJcmV0dXJuIGFycmF5KHJvdW5kKCR0b3QpLCRyZXMpOwoJICAgIH0KCX0KCWVsc2VpZiggaXNfb2JqZWN0KCR0aGlzLT5pVGV4dCkgKSB7CgkgICAgLy8gQSBzaW5nbGUgaWNvbgoJICAgIHJldHVybiAkdGhpcy0+aVRleHQtPkdldFdpZHRoKCkrMiokZXh0cmFfbWFyZ2luOwoJfQoJZWxzZWlmKCBpc19hcnJheSgkdGhpcy0+aVRleHQpICkgewoJICAgIC8vIE11c3QgYmUgYW4gYXJyYXkgb2YgdGV4dHMuIEluIHRoaXMgY2FzZSB3ZSByZXR1cm4gdGhlIHN1bSBvZiB0aGUKCSAgICAvLyBsZW5ndGggKyBhIGZpeGVkIG1hcmdpbiBvZiA0IHBpeGVscyBvbiBlYWNoIHRleHQgc3RyaW5nCgkgICAgJG4gPSBjb3VudCgkdGhpcy0+aVRleHQpOwoJICAgIGZvciggJGk9MCwgJHc9MDsgJGkgPCAkbjsgKyskaSApIHsKCQkkdG1wID0gJHRoaXMtPmlUZXh0WyRpXTsKCQlpZiggaXNfc3RyaW5nKCR0bXApICkgewoJCSAgICAkdyArPSAkYUltZy0+R2V0VGV4dFdpZHRoKCR0bXApKyRleHRyYV9tYXJnaW47CgkJfQoJCWVsc2UgewoJCSAgICBpZiggaXNfb2JqZWN0KCR0bXApID09PSBmYWxzZSApIHsKCQkJSnBHcmFwaEVycm9yOjpSYWlzZUwoNjAxMik7CgkJICAgIH0KCQkgICAgJHcgKz0gJHRtcC0+R2V0V2lkdGgoKSskZXh0cmFfbWFyZ2luOwoJCX0KCSAgICB9CgkgICAgcmV0dXJuICR3OwoJfQoJZWxzZSB7CgkgICAgSnBHcmFwaEVycm9yOjpSYWlzZUwoNjAxMik7Cgl9CiAgICB9CgogICAgLy8gZm9yIHRoZSBjYXNlIHdoZXJlIHdlIGhhdmUgbXVsdGlwbGUgY29sdW1ucyB0aGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHdpZHRoIG9mIGVhY2gKICAgIC8vIGNvbHVtbiBpbmRpdmlkdWFsbHkuIElmIHRoZXJlIGlzIG5vIGNvbHVtbnMganVzdCByZXR1cm4gdGhlIHdpZHRoIG9mIHRoZSBzaW5nbGUKICAgIC8vIGNvbHVtbiBhcyBhbiBhcnJheSBvZiBvbmUKICAgIGZ1bmN0aW9uIEdldENvbFdpZHRoKCYkYUltZywkYU1hcmdpbj0wKSB7CgkkYUltZy0+U2V0Rm9udCgkdGhpcy0+aUZGYW1pbHksJHRoaXMtPmlGU3R5bGUsJHRoaXMtPmlGU2l6ZSk7CglpZiggaXNfYXJyYXkoJHRoaXMtPmlUZXh0KSApIHsKCSAgICAkbiA9IGNvdW50KCR0aGlzLT5pVGV4dCk7CgkgICAgZm9yKCAkaT0wLCAkdz1hcnJheSgpOyAkaSA8ICRuOyArKyRpICkgewoJCSR0bXAgPSAkdGhpcy0+aVRleHRbJGldOwoJCWlmKCBpc19zdHJpbmcoJHRtcCkgKSB7CgkJICAgICR3WyRpXSA9ICRhSW1nLT5HZXRUZXh0V2lkdGgoJHRoaXMtPmlUZXh0WyRpXSkrJGFNYXJnaW47CgkJfQoJCWVsc2UgewoJCSAgICBpZiggaXNfb2JqZWN0KCR0bXApID09PSBmYWxzZSApIHsKCQkJSnBHcmFwaEVycm9yOjpSYWlzZUwoNjAxMik7CgkJICAgIH0KCQkgICAgJHdbJGldID0gJHRtcC0+R2V0V2lkdGgoKSskYU1hcmdpbjsKCQl9CgkgICAgfQoJICAgIHJldHVybiAkdzsJCgl9CgllbHNlIHsKCSAgICByZXR1cm4gYXJyYXkoJHRoaXMtPkdldFdpZHRoKCRhSW1nKSk7Cgl9CiAgICB9CgkKICAgIC8vIEdldCB0b3RhbCBoZWlnaHQgb2YgdGV4dAogICAgZnVuY3Rpb24gR2V0SGVpZ2h0KCYkYUltZykgewoJJGFJbWctPlNldEZvbnQoJHRoaXMtPmlGRmFtaWx5LCR0aGlzLT5pRlN0eWxlLCR0aGlzLT5pRlNpemUpOwoJcmV0dXJuICRhSW1nLT5HZXRGb250SGVpZ2h0KCk7CiAgICB9CgkKICAgIC8vIFVuaGlkZS9oaWRlIHRoZSB0ZXh0CQogICAgZnVuY3Rpb24gU2hvdygkYVNob3c9dHJ1ZSkgewoJJHRoaXMtPmlTaG93PSRhU2hvdzsKICAgIH0KCQogICAgLy8gU3Ryb2tlIHRleHQgYXQgKHgseSkgY29vcmRpbmF0ZXMuIElmIHRoZSB0ZXh0IGNvbnRhaW5zIHRhYnMgdGhlbiB0aGUKICAgIC8vIHggcGFyYW1ldGVyIHNob3VsZCBiZSBhbiBhcnJheSBvZiBwb3NpdGlvbnMgdG8gYmUgdXNlZCBmb3IgZWFjaCBzdWNjZXNzaXZlCiAgICAvLyB0YWIgbWFyay4gSWYgbm8gYXJyYXkgaXMgc3VwcGxpZWQgdGhlbiB0aGUgdGFicyB3aWxsIGJlIGlnbm9yZWQuCiAgICBmdW5jdGlvbiBTdHJva2UoJiRhSW1nLCRhWCwkYVkpIHsKCWlmKCAkdGhpcy0+aVNob3cgKSB7CgkgICAgJGFJbWctPlNldENvbG9yKCR0aGlzLT5pQ29sb3IpOwoJICAgICRhSW1nLT5TZXRGb250KCR0aGlzLT5pRkZhbWlseSwkdGhpcy0+aUZTdHlsZSwkdGhpcy0+aUZTaXplKTsKCSAgICAkYUltZy0+U2V0VGV4dEFsaWduKCR0aGlzLT5pSEFsaWduLCR0aGlzLT5pVkFsaWduKTsJCQkKCSAgICBpZiggJHRoaXMtPkdldE5iclRhYnMoKSA8PSAxICkgewoJCWlmKCBpc19zdHJpbmcoJHRoaXMtPmlUZXh0KSApIHsKCQkgICAgLy8gR2V0IHJpZCBvZiBhbnkgIlx0IiBjaGFyYWN0ZXJzIGFuZCBzdHJva2Ugc3RyaW5nCgkJICAgIGlmKCBpc19hcnJheSgkYVgpICkgJGFYPSRhWFswXTsKCQkgICAgaWYoIGlzX2FycmF5KCRhWSkgKSAkYVk9JGFZWzBdOwoJCSAgICAkYUltZy0+U3Ryb2tlVGV4dCgkYVgsJGFZLHN0cl9yZXBsYWNlKCJcdCIsIiAiLCR0aGlzLT5pVGV4dCkpOwoJCX0KCQllbHNlIHsKCQkgICAgJG4gPSBjb3VudCgkdGhpcy0+aVRleHQpOwoJCSAgICAkYXggPSBpc19hcnJheSgkYVgpIDsKCQkgICAgJGF5ID0gaXNfYXJyYXkoJGFZKSA7CgkJICAgIGlmKCAkYXggJiYgJGF5ICkgewoJCQkvLyBOb3RoaW5nOyBib3RoIGFyZSBhbHJlYWR5IGFycmF5cwoJCSAgICB9CgkJICAgIGVsc2VpZiggJGF4ICkgewoJCQkkYVkgPSBhcnJheV9maWxsKDAsJG4sJGFZKTsKCQkgICAgfQoJCSAgICBlbHNlaWYoICRheSApIHsKCQkJJGFYID0gYXJyYXlfZmlsbCgwLCRuLCRhWCk7CgkJICAgIH0KCQkgICAgZWxzZSB7CgkJCSRhWCA9IGFycmF5X2ZpbGwoMCwkbiwkYVgpOwoJCQkkYVkgPSBhcnJheV9maWxsKDAsJG4sJGFZKTsKCQkgICAgfQoJCSAgICAkbiA9IG1pbigkbiwgY291bnQoJGFYKSApIDsKCQkgICAgJG4gPSBtaW4oJG4sIGNvdW50KCRhWSkgKSA7CgkJICAgIGZvcigkaT0wOyAkaSA8ICRuOyArKyRpICkgewoJCQkkdG1wID0gJHRoaXMtPmlUZXh0WyRpXTsKCQkJaWYoIGlzX29iamVjdCgkdG1wKSApIHsKCQkJICAgICR0bXAtPlN0cm9rZSgkYUltZywkYVhbJGldLCRhWVskaV0pOwoJCQl9CgkJCWVsc2UKCQkJICAgICRhSW1nLT5TdHJva2VUZXh0KCRhWFskaV0sJGFZWyRpXSxzdHJfcmVwbGFjZSgiXHQiLCIgIiwkdG1wKSk7CgkJICAgIH0KCQl9CgkgICAgfQoJICAgIGVsc2UgewoJCSR0bXAgPSBzcGxpdCgiXHQiLCR0aGlzLT5pVGV4dCk7CgkJJG4gPSBtaW4oY291bnQoJHRtcCksY291bnQoJGFYKSk7CgkJZm9yKCRpPTA7ICRpIDwgJG47ICsrJGkpIHsKCQkgICAgJGFJbWctPlN0cm9rZVRleHQoJGFYWyRpXSwkYVksJHRtcFskaV0pOwoJCX0JCgkgICAgfQoJfQogICAgfQp9CgovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLyBDTEFTUyBIZWFkZXJQcm9wZXJ0eQovLyBEZXNjcmlwdGlvbjogRGF0YSBlbmNhcHN1bGF0aW5nIGNsYXNzIHRvIGhvbGQgcHJvcGVydHkgCi8vIGZvciBlYWNoIHR5cGUgb2YgdGhlIHNjYWxlIGhlYWRlcnMKLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KY2xhc3MgSGVhZGVyUHJvcGVydHkgewogICAgdmFyICRpVGl0bGVWZXJ0TWFyZ2luPTMsJGlGRmFtaWx5PUZGX0ZPTlQwLCRpRlN0eWxlPUZTX05PUk1BTCwkaUZTaXplPTg7CiAgICB2YXIgJGlGcmFtZUNvbG9yPSJibGFjayIsJGlGcmFtZVdlaWdodD0xOwogICAgdmFyICRpU2hvd0xhYmVscz10cnVlLCRpU2hvd0dyaWQ9dHJ1ZTsKICAgIHZhciAkaUJhY2tncm91bmRDb2xvcj0id2hpdGUiOwogICAgdmFyICRpV2Vla2VuZEJhY2tncm91bmRDb2xvcj0ibGlnaHRncmF5IiwkaVN1bmRheVRleHRDb2xvcj0icmVkIjsgLy8gdGhlc2UgYXJlIG9ubHkgdXNlZCB3aXRoIGRheSBzY2FsZQogICAgdmFyICRpVGV4dENvbG9yPSJibGFjayI7CiAgICB2YXIgJGlMYWJlbEZvcm1TdHI9IiVkIjsKICAgIHZhciAkZ3JpZCwkaVN0eWxlPTA7CiAgICB2YXIgJGlJbnRlcnZhbGwgPSAxOwoKLy8tLS0tLS0tLS0tLS0tLS0KLy8gQ09OU1RSVUNUT1IJCiAgICBmdW5jdGlvbiBIZWFkZXJQcm9wZXJ0eSgpIHsKCSR0aGlzLT5ncmlkID0gbmV3IExpbmVQcm9wZXJ0eSgpOwogICAgfQoKLy8tLS0tLS0tLS0tLS0tLS0KLy8gUFVCTElDIE1FVEhPRFMJCQogICAgZnVuY3Rpb24gU2hvdygkYVNob3c9dHJ1ZSkgewoJJHRoaXMtPmlTaG93TGFiZWxzID0gJGFTaG93OwogICAgfQoKICAgIGZ1bmN0aW9uIFNldEludGVydmFsbCgkYUludCkgewoJJHRoaXMtPmlJbnRlcnZhbGwgPSAkYUludDsKICAgIH0KCiAgICBmdW5jdGlvbiBHZXRJbnRlcnZhbGwoKSB7CglyZXR1cm4gJHRoaXMtPmlJbnRlcnZhbGwgOwogICAgfQoJCiAgICBmdW5jdGlvbiBTZXRGb250KCRhRkZhbWlseSwkYUZTdHlsZT1GU19OT1JNQUwsJGFGU2l6ZT0xMCkgewoJJHRoaXMtPmlGRmFtaWx5ID0gJGFGRmFtaWx5OwoJJHRoaXMtPmlGU3R5bGUJID0gJGFGU3R5bGU7CgkkdGhpcy0+aUZTaXplCSA9ICRhRlNpemU7CiAgICB9CgogICAgZnVuY3Rpb24gU2V0Rm9udENvbG9yKCRhQ29sb3IpIHsKCSR0aGlzLT5pVGV4dENvbG9yID0gJGFDb2xvcjsKICAgIH0KCQogICAgZnVuY3Rpb24gR2V0Rm9udEhlaWdodCgmJGFJbWcpIHsKCSRhSW1nLT5TZXRGb250KCR0aGlzLT5pRkZhbWlseSwkdGhpcy0+aUZTdHlsZSwkdGhpcy0+aUZTaXplKTsKCXJldHVybiAkYUltZy0+R2V0Rm9udEhlaWdodCgpOwogICAgfQoKICAgIGZ1bmN0aW9uIEdldEZvbnRXaWR0aCgmJGFJbWcpIHsKCSRhSW1nLT5TZXRGb250KCR0aGlzLT5pRkZhbWlseSwkdGhpcy0+aUZTdHlsZSwkdGhpcy0+aUZTaXplKTsKCXJldHVybiAkYUltZy0+R2V0Rm9udFdpZHRoKCk7CiAgICB9CgogICAgZnVuY3Rpb24gR2V0U3RyV2lkdGgoJiRhSW1nLCRhU3RyKSB7CgkkYUltZy0+U2V0Rm9udCgkdGhpcy0+aUZGYW1pbHksJHRoaXMtPmlGU3R5bGUsJHRoaXMtPmlGU2l6ZSk7CglyZXR1cm4gJGFJbWctPkdldFRleHRXaWR0aCgkYVN0cik7CiAgICB9CgkKICAgIGZ1bmN0aW9uIFNldFN0eWxlKCRhU3R5bGUpIHsKCSR0aGlzLT5pU3R5bGUgPSAkYVN0eWxlOwogICAgfQoJCiAgICBmdW5jdGlvbiBTZXRCYWNrZ3JvdW5kQ29sb3IoJGFDb2xvcikgewoJJHRoaXMtPmlCYWNrZ3JvdW5kQ29sb3I9JGFDb2xvcjsKICAgIH0KCiAgICBmdW5jdGlvbiBTZXRGcmFtZVdlaWdodCgkYVdlaWdodCkgewoJJHRoaXMtPmlGcmFtZVdlaWdodD0kYVdlaWdodDsKICAgIH0KCiAgICBmdW5jdGlvbiBTZXRGcmFtZUNvbG9yKCRhQ29sb3IpIHsKCSR0aGlzLT5pRnJhbWVDb2xvcj0kYUNvbG9yOwogICAgfQoJCiAgICAvLyBPbmx5IHVzZWQgYnkgZGF5IHNjYWxlCiAgICBmdW5jdGlvbiBTZXRXZWVrZW5kQ29sb3IoJGFDb2xvcikgewoJJHRoaXMtPmlXZWVrZW5kQmFja2dyb3VuZENvbG9yPSRhQ29sb3I7CiAgICB9CgkKICAgIC8vIE9ubHkgdXNlZCBieSBkYXkgc2NhbGUKICAgIGZ1bmN0aW9uIFNldFN1bmRheUZvbnRDb2xvcigkYUNvbG9yKSB7CgkkdGhpcy0+aVN1bmRheVRleHRDb2xvcj0kYUNvbG9yOwogICAgfQoJCiAgICBmdW5jdGlvbiBTZXRUaXRsZVZlcnRNYXJnaW4oJGFNYXJnaW4pIHsKCSR0aGlzLT5pVGl0bGVWZXJ0TWFyZ2luPSRhTWFyZ2luOwogICAgfQoJCiAgICBmdW5jdGlvbiBTZXRMYWJlbEZvcm1hdFN0cmluZygkYVN0cikgewoJJHRoaXMtPmlMYWJlbEZvcm1TdHI9JGFTdHI7CiAgICB9CgogICAgZnVuY3Rpb24gU2V0Rm9ybWF0U3RyaW5nKCRhU3RyKSB7CgkkdGhpcy0+U2V0TGFiZWxGb3JtYXRTdHJpbmcoJGFTdHIpOwogICAgfQoKCn0KCi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci8vIENMQVNTIEdhbnR0U2NhbGUKLy8gRGVzY3JpcHRpb246IFJlc3BvbnNpYmxlIGZvciBjYWxjdWxhdGluZyBhbmQgc2hvd2luZwovLyB0aGUgc2NhbGUgaW4gYSBnYW50dCBjaGFydC4gVGhpcyBpbmNsdWRlcyBwcm92aWRpbmcgbWV0aG9kcyBmb3IKLy8gY29udmVydGluZyBkYXRlcyB0byBwb3NpdGlvbiBpbiB0aGUgY2hhcnQgYXMgd2VsbCBhcyBzdHJva2luZyB0aGUKLy8gZGF0ZSBoZWFkZXJzIChkYXlzLCB3ZWVrLCBldGMpLgovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpjbGFzcyBHYW50dFNjYWxlIHsKICAgIHZhciAkbWludXRlLCRob3VyLCRkYXksJHdlZWssJG1vbnRoLCR5ZWFyOwogICAgdmFyICRkaXZpZGVyLCRkaXZpZGVyaCwkdGFibGVUaXRsZTsKICAgIHZhciAkaVN0YXJ0RGF0ZT0tMSwkaUVuZERhdGU9LTE7CiAgICAvLyBOdW1iZXIgb2YgZ2FudHQgYmFyIHBvc2l0aW9uIChuLmIgbm90IG5lY2Vzc2FyaWxpeSB0aGUgc2FtZSBhcyB0aGUgbnVtYmVyIG9mIGJhcnMpCiAgICAvLyB3ZSBjb3VsZCBoYXZlIG9uIGJhciBpbiBwb3NpdGlvbiAxLCBhbmQgb25lIGJhciBpbiBwb3NpdGlvbiA1IHRoZW4gdGhlcmUgYXJlIHR3bwogICAgLy8gYmFycyBidXQgdGhlIG51bWJlciBvZiBiYXIgcG9zaXRpb25zIGlzIDUKICAgIHZhciAkaVZlcnRMaW5lcz0tMTsJCiAgICAvLyBUaGUgd2lkdGggb2YgdGhlIGxhYmVscyAoZGVmYXVsdHMgdG8gdGhlIHdpZGVzdCBvZiBhbGwgbGFiZWxzKQogICAgdmFyICRpTGFiZWxXaWR0aDsJCiAgICAvLyBPdXQgaW1hZ2UgdG8gc3Ryb2tlIHRoZSBzY2FsZSB0bwogICAgdmFyICRpSW1nOwkKICAgIHZhciAkaVRhYmxlSGVhZGVyQmFja2dyb3VuZENvbG9yPSJ3aGl0ZSIsJGlUYWJsZUhlYWRlckZyYW1lQ29sb3I9ImJsYWNrIjsKICAgIHZhciAkaVRhYmxlSGVhZGVyRnJhbWVXZWlnaHQ9MTsKICAgIHZhciAkaUF2YWlsYWJsZUhlaWdodD0tMSwkaVZlcnRTcGFjaW5nPS0xLCRpVmVydEhlYWRlclNpemU9LTE7CiAgICB2YXIgJGlEYXRlTG9jYWxlOwogICAgdmFyICRpVmVydExheW91dD1HQU5UVF9FVkVOOwogICAgdmFyICRpVG9wUGxvdE1hcmdpbj0xMCwkaUJvdHRvbVBsb3RNYXJnaW49MTU7CiAgICB2YXIgJGlVc2VQbG90V2Vla2VuZEJhY2tncm91bmQ9dHJ1ZTsKICAgIHZhciAkaVdlZWtTdGFydCA9IDE7CS8vIERlZmF1bHQgdG8gaGF2ZSB3ZWVrZW5kcyBzdGFydCBvbiBNb25kYXkKICAgIHZhciAkYWN0aW5mbzsKCQovLy0tLS0tLS0tLS0tLS0tLQovLyBDT05TVFJVQ1RPUgkKICAgIGZ1bmN0aW9uIEdhbnR0U2NhbGUoJiRhSW1nKSB7CgkkdGhpcy0+aUltZyA9ICYkYUltZzsJCQoJJHRoaXMtPmlEYXRlTG9jYWxlID0gbmV3IERhdGVMb2NhbGUoKTsKCgkkdGhpcy0+bWludXRlID0gbmV3IEhlYWRlclByb3BlcnR5KCk7CgkkdGhpcy0+bWludXRlLT5TZXRJbnRlcnZhbGwoMTUpOwoJJHRoaXMtPm1pbnV0ZS0+U2V0TGFiZWxGb3JtYXRTdHJpbmcoJ2knKTsKCSR0aGlzLT5taW51dGUtPlNldEZvbnQoRkZfRk9OVDApOwoJJHRoaXMtPm1pbnV0ZS0+Z3JpZC0+U2V0Q29sb3IoImdyYXkiKTsKCgkkdGhpcy0+aG91ciA9IG5ldyBIZWFkZXJQcm9wZXJ0eSgpOwoJJHRoaXMtPmhvdXItPlNldEZvbnQoRkZfRk9OVDApOwoJJHRoaXMtPmhvdXItPlNldEludGVydmFsbCg2KTsKCSR0aGlzLT5ob3VyLT5TZXRTdHlsZShIT1VSU1RZTEVfSE0yNCk7CgkkdGhpcy0+aG91ci0+U2V0TGFiZWxGb3JtYXRTdHJpbmcoJ0g6aScpOwoJJHRoaXMtPmhvdXItPmdyaWQtPlNldENvbG9yKCJncmF5Iik7CgoJJHRoaXMtPmRheSA9IG5ldyBIZWFkZXJQcm9wZXJ0eSgpOwoJJHRoaXMtPmRheS0+Z3JpZC0+U2V0Q29sb3IoImdyYXkiKTsKCSR0aGlzLT5kYXktPlNldExhYmVsRm9ybWF0U3RyaW5nKCdsJyk7CgoJJHRoaXMtPndlZWsgPSBuZXcgSGVhZGVyUHJvcGVydHkoKTsKCSR0aGlzLT53ZWVrLT5TZXRMYWJlbEZvcm1hdFN0cmluZygidyVkIik7CgkkdGhpcy0+d2Vlay0+U2V0Rm9udChGRl9GT05UMSk7CgoJJHRoaXMtPm1vbnRoID0gbmV3IEhlYWRlclByb3BlcnR5KCk7CgkkdGhpcy0+bW9udGgtPlNldEZvbnQoRkZfRk9OVDEsRlNfQk9MRCk7CgoJJHRoaXMtPnllYXIgPSBuZXcgSGVhZGVyUHJvcGVydHkoKTsKCSR0aGlzLT55ZWFyLT5TZXRGb250KEZGX0ZPTlQxLEZTX0JPTEQpOwkJCgkJCgkkdGhpcy0+ZGl2aWRlcj1uZXcgTGluZVByb3BlcnR5KCk7CgkkdGhpcy0+ZGl2aWRlcmg9bmV3IExpbmVQcm9wZXJ0eSgpOwkJCgkkdGhpcy0+ZGl2aWRlcmgtPlNldFdlaWdodCgyKTsKCSR0aGlzLT5kaXZpZGVyLT5TZXRXZWlnaHQoNik7CgkkdGhpcy0+ZGl2aWRlci0+U2V0Q29sb3IoJ2dyYXknKTsKCSR0aGlzLT5kaXZpZGVyLT5TZXRTdHlsZSgnZmFuY3knKTsKCgkkdGhpcy0+dGFibGVUaXRsZT1uZXcgVGV4dFByb3BlcnR5KCk7CgkkdGhpcy0+dGFibGVUaXRsZS0+U2hvdyhmYWxzZSk7CgkkdGhpcy0+YWN0aW5mbyA9IG5ldyBHYW50dEFjdGl2aXR5SW5mbygpOwogICAgfQoJCi8vLS0tLS0tLS0tLS0tLS0tCi8vIFBVQkxJQyBNRVRIT0RTCQogICAgLy8gU3BlY2lmeSB3aGF0IGhlYWRlcnMgc2hvdWxkIGJlIHZpc2libGUKICAgIGZ1bmN0aW9uIFNob3dIZWFkZXJzKCRhRmxnKSB7CgkkdGhpcy0+ZGF5LT5TaG93KCRhRmxnICYgR0FOVFRfSERBWSk7CgkkdGhpcy0+d2Vlay0+U2hvdygkYUZsZyAmIEdBTlRUX0hXRUVLKTsKCSR0aGlzLT5tb250aC0+U2hvdygkYUZsZyAmIEdBTlRUX0hNT05USCk7CgkkdGhpcy0+eWVhci0+U2hvdygkYUZsZyAmIEdBTlRUX0hZRUFSKTsKCSR0aGlzLT5ob3VyLT5TaG93KCRhRmxnICYgR0FOVFRfSEhPVVIpOwoJJHRoaXMtPm1pbnV0ZS0+U2hvdygkYUZsZyAmIEdBTlRUX0hNSU4pOwoKCS8vIE1ha2Ugc29tZSBkZWZhdWx0IHNldHRpbmdzIG9mIGdyaWRsaW5lcyB3aGloYyBtYWtlcyBzZW5zZQoJaWYoICRhRmxnICYgR0FOVFRfSFdFRUsgKSB7CgkgICAgJHRoaXMtPm1vbnRoLT5ncmlkLT5TaG93KGZhbHNlKTsKCSAgICAkdGhpcy0+eWVhci0+Z3JpZC0+U2hvdyhmYWxzZSk7Cgl9CglpZiggJGFGbGcgJiBHQU5UVF9ISE9VUiApIHsKCSAgICAkdGhpcy0+ZGF5LT5ncmlkLT5TZXRDb2xvcigiYmxhY2siKTsKCX0KICAgIH0KCQogICAgLy8gU2hvdWxkIHRoZSB3ZWVrZW5kIGJhY2tncm91bmQgc3RyZXRjaCBhbGwgdGhlIHdheSBkb3duIGluIHRoZSBwbG90YXJlYQogICAgZnVuY3Rpb24gVXNlV2Vla2VuZEJhY2tncm91bmQoJGFTaG93KSB7CgkkdGhpcy0+aVVzZVBsb3RXZWVrZW5kQmFja2dyb3VuZCA9ICRhU2hvdzsKICAgIH0KCQogICAgLy8gSGF2ZSBhIHJhbmdlIGJlZW4gc3BlY2lmaWVkPwogICAgZnVuY3Rpb24gSXNSYW5nZVNldCgpIHsKCXJldHVybiAkdGhpcy0+aVN0YXJ0RGF0ZSE9LTEgJiYgJHRoaXMtPmlFbmREYXRlIT0tMTsKICAgIH0KCQogICAgLy8gU2hvdWxkIHRoZSBsYXlvdXQgYmUgZnJvbSB0b3Agb3IgZXZlbj8KICAgIGZ1bmN0aW9uIFNldFZlcnRMYXlvdXQoJGFMYXlvdXQpIHsKCSR0aGlzLT5pVmVydExheW91dCA9ICRhTGF5b3V0OwogICAgfQoJCiAgICAvLyBXaGljaCBsb2NhbGUgc2hvdWxkIGJlIHVzZWQ/CiAgICBmdW5jdGlvbiBTZXREYXRlTG9jYWxlKCRhTG9jYWxlKSB7CgkkdGhpcy0+aURhdGVMb2NhbGUtPlNldCgkYUxvY2FsZSk7CiAgICB9CgkKICAgIC8vIE51bWJlciBvZiBkYXlzIHdlIGFyZSBzaG93aW5nCiAgICBmdW5jdGlvbiBHZXROdW1iZXJPZkRheXMoKSB7CglyZXR1cm4gcm91bmQoKCR0aGlzLT5pRW5kRGF0ZS0kdGhpcy0+aVN0YXJ0RGF0ZSkvU0VDUEVSREFZKTsKICAgIH0KCQogICAgLy8gVGhlIHdpZHRoIG9mIHRoZSBhY3R1YWwgcGxvdCBhcmVhCiAgICBmdW5jdGlvbiBHZXRQbG90V2lkdGgoKSB7CgkkaW1nPSR0aGlzLT5pSW1nOwoJcmV0dXJuICRpbWctPndpZHRoIC0gJGltZy0+bGVmdF9tYXJnaW4gLSAkaW1nLT5yaWdodF9tYXJnaW47CiAgICB9CgogICAgLy8gU3BlY2lmeSB0aGUgd2lkdGggb2YgdGhlIHRpdGxlcyhsYWJlbHMpIGZvciB0aGUgYWN0aXZpdGllcwogICAgLy8gKFRoaXMgaXMgYnkgZGVmYXVsdCBzZXQgdG8gdGhlIG1pbmltdW0gd2lkdGggZW5vdWdodCBmb3IgdGhlCiAgICAvLyB3aWRlc3QgdGl0bGUpCiAgICBmdW5jdGlvbiBTZXRMYWJlbFdpZHRoKCRhTGFiZWxXaWR0aCkgewoJJHRoaXMtPmlMYWJlbFdpZHRoPSRhTGFiZWxXaWR0aDsKICAgIH0KCgkvLyBXaGljaCBkYXkgc2hvdWxkIHRoZSB3ZWVrIHN0YXJ0PwoJLy8gMD09U3VuLCAxPT1Nb25kYXksIDI9PVR1ZXNkYXkgZXRjCiAgICBmdW5jdGlvbiBTZXRXZWVrU3RhcnQoJGFTdGFydERheSkgewoJJHRoaXMtPmlXZWVrU3RhcnQgPSAkYVN0YXJ0RGF5ICUgNzsKCQoJLy9SZWNhbGN1bGF0ZSB0aGUgc3RhcnRkYXkgc2luY2UgdGhpcyB3aWxsIGNoYW5nZSB0aGUgd2VlayBzdGFydAoJJHRoaXMtPlNldFJhbmdlKCR0aGlzLT5pU3RhcnREYXRlLCR0aGlzLT5pRW5kRGF0ZSk7CiAgICB9CgogICAgLy8gRG8gd2Ugc2hvdyBtaW4gc2NhbGU/CiAgICBmdW5jdGlvbiBJc0Rpc3BsYXlNaW51dGUoKSB7CglyZXR1cm4gJHRoaXMtPm1pbnV0ZS0+aVNob3dMYWJlbHM7CiAgICB9CgogICAgLy8gRG8gd2Ugc2hvdyBkYXkgc2NhbGU/CiAgICBmdW5jdGlvbiBJc0Rpc3BsYXlIb3VyKCkgewoJcmV0dXJuICR0aGlzLT5ob3VyLT5pU2hvd0xhYmVsczsKICAgIH0KCgkKICAgIC8vIERvIHdlIHNob3cgZGF5IHNjYWxlPwogICAgZnVuY3Rpb24gSXNEaXNwbGF5RGF5KCkgewoJcmV0dXJuICR0aGlzLT5kYXktPmlTaG93TGFiZWxzOwogICAgfQoJCiAgICAvLyBEbyB3ZSBzaG93IHdlZWsgc2NhbGU/CiAgICBmdW5jdGlvbiBJc0Rpc3BsYXlXZWVrKCkgewoJcmV0dXJuICR0aGlzLT53ZWVrLT5pU2hvd0xhYmVsczsKICAgIH0KCQogICAgLy8gRG8gd2Ugc2hvdyBtb250aCBzY2FsZT8KICAgIGZ1bmN0aW9uIElzRGlzcGxheU1vbnRoKCkgewoJcmV0dXJuICR0aGlzLT5tb250aC0+aVNob3dMYWJlbHM7CiAgICB9CgkKICAgIC8vIERvIHdlIHNob3cgeWVhciBzY2FsZT8KICAgIGZ1bmN0aW9uIElzRGlzcGxheVllYXIoKSB7CglyZXR1cm4gJHRoaXMtPnllYXItPmlTaG93TGFiZWxzOwogICAgfQoKICAgIC8vIFNwZWNpZnkgc3BhY2luZyAoaW4gcGVyY2VudCBvZiBiYXIgaGVpZ2h0KSBiZXR3ZWVuIGFjdGl2aXR5IGJhcnMKICAgIGZ1bmN0aW9uIFNldFZlcnRTcGFjaW5nKCRhU3BhY2luZykgewoJJHRoaXMtPmlWZXJ0U3BhY2luZyA9ICRhU3BhY2luZzsKICAgIH0KCiAgICAvLyBTcGVjaWZ5IHNjYWxlIG1pbiBhbmQgbWF4IGRhdGUgZWl0aGVyIGFzIHRpbWVzdGFtcCBvciBhcyBkYXRlIHN0cmluZ3MKICAgIC8vIEFsd2F5cyByb3VuZCB0byB0aGUgbmVhcmVzdCB3ZWVrIGJvdW5kYXJ5CiAgICBmdW5jdGlvbiBTZXRSYW5nZSgkYU1pbiwkYU1heCkgewoJJHRoaXMtPmlTdGFydERhdGUgPSAkdGhpcy0+Tm9ybWFsaXplRGF0ZSgkYU1pbik7CgkkdGhpcy0+aUVuZERhdGUgPSAkdGhpcy0+Tm9ybWFsaXplRGF0ZSgkYU1heCk7CQogICAgfQoKCiAgICAvLyBBZGp1c3QgdGhlIHN0YXJ0IGFuZCBlbmQgZGF0ZSBzbyB0aGV5IGZpdCB0byBiZWdpbm5pbmcvZW5kaW5nCiAgICAvLyBvZiB0aGUgd2VlayB0YWtpbmcgdGhlIHNwZWNpZmllZCB3ZWVrIHN0YXJ0IGRheSBpbnRvIGFjY291bnQuCiAgICBmdW5jdGlvbiBBZGp1c3RTdGFydEVuZERheSgpIHsKCglpZiggISgkdGhpcy0+SXNEaXNwbGF5WWVhcigpIHx8JHRoaXMtPklzRGlzcGxheU1vbnRoKCkgfHwgJHRoaXMtPklzRGlzcGxheVdlZWsoKSkgKSB7CgkgICAgLy8gRG9uJ3QgYWRqdXN0CgkgICAgcmV0dXJuOwoJfQoKCS8vIEdldCBkYXkgaW4gd2VlayBmb3Igc3RhcnQgYW5kIGVuZGluZyBkYXRlIChTdW49PTApCgkkZHM9c3RyZnRpbWUoIiV3IiwkdGhpcy0+aVN0YXJ0RGF0ZSk7CgkkZGU9c3RyZnRpbWUoIiV3IiwkdGhpcy0+aUVuZERhdGUpOwkKCQoJLy8gV2Ugd2FudCB0byBzdGFydCBvbiBpV2Vla1N0YXJ0IGRheS4gQnV0IGZpcnN0IHdlIHN1YnRyYWN0IGEgd2VlawoJLy8gaWYgdGhlIHN0YXJ0ZGF0ZSBpcyAiYmVoaW5kIiB0aGUgZGF5IHRoZSB3ZWVrIHN0YXJ0IGF0LiAKCS8vIFRoaXMgd2F5IHdlIGVuc3VyZSB0aGF0IHRoZSBnaXZlbiBzdGFydCBkYXRlIGlzIGFsd2F5cyBpbmNsdWRlZCAKCS8vIGluIHRoZSByYW5nZS4gSWYgd2UgZG9uJ3QgZG8gdGhpcyB0aGUgbmVhcmVzdCBjb3JyZWN0IHdlZWtkYXkgaW4gdGhlIHdlZWsgCgkvLyB0byBzdGFydCBhdCBtaWdodCBiZSBsYXRlciB0aGFuIHRoZSBzdGFydCBkYXRlLgoJaWYoICRkcyA8ICR0aGlzLT5pV2Vla1N0YXJ0ICkKCSAgICAkZCA9IHN0cnRvdGltZSgnLTcgZGF5JywkdGhpcy0+aVN0YXJ0RGF0ZSk7CgllbHNlCgkgICAgJGQgPSAkdGhpcy0+aVN0YXJ0RGF0ZTsKCSRhZGpkYXRlID0gc3RydG90aW1lKCgkdGhpcy0+aVdlZWtTdGFydC0kZHMpLicgZGF5JywkZCAvKiR0aGlzLT5pU3RhcnREYXRlKi8gKTsKCSR0aGlzLT5pU3RhcnREYXRlID0gJGFkamRhdGU7CgkKCS8vIFdlIHdhbnQgdG8gZW5kIG9uIHRoZSBsYXN0IGRheSBvZiB0aGUgd2VlawoJJHByZWZlcnJlZEVuZERheSA9ICgkdGhpcy0+aVdlZWtTdGFydCs2KSU3OwoJaWYoICRwcmVmZXJyZWRFbmREYXkgIT0gJGRlICkgeyAKCSAgICAvLyBTb2x2ZSBlcXVpdmFsZW5jZSBlcTogICAgJGRlICsgeCB+ICRwcmVmZXJyZWREYXkgKG1vZCA3KQoJICAgICRhZGogPSAoNysoJHByZWZlcnJlZEVuZERheSAtICRkZSkpICUgNzsKCSAgICAkYWRqZGF0ZSA9IHN0cnRvdGltZSgiKyRhZGogZGF5IiwkdGhpcy0+aUVuZERhdGUpOwoJICAgICR0aGlzLT5pRW5kRGF0ZSA9ICRhZGpkYXRlOwkKCX0JCiAgICB9CgogICAgLy8gU3BlY2lmeSBiYWNrZ3JvdW5kIGZvciB0aGUgdGFibGUgdGl0bGUgYXJlYSAodXBwZXIgbGVmdCBjb3JuZXIgb2YgdGhlIHRhYmxlKQkKICAgIGZ1bmN0aW9uIFNldFRhYmxlVGl0bGVCYWNrZ3JvdW5kKCRhQ29sb3IpIHsKCSR0aGlzLT5pVGFibGVIZWFkZXJCYWNrZ3JvdW5kQ29sb3IgPSAkYUNvbG9yOwogICAgfQoKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi8vIFBSSVZBVEUgTWV0aG9kcwoJCiAgICAvLyBEZXRlcm1pbmUgdGhlIGhlaWdodCBvZiBhbGwgdGhlIHNjYWxlIGhlYWRlcnMgY29tYmluZWQKICAgIGZ1bmN0aW9uIEdldEhlYWRlckhlaWdodCgpIHsKCSRpbWc9JHRoaXMtPmlJbWc7CgkkaGVpZ2h0PTE7CglpZiggJHRoaXMtPm1pbnV0ZS0+aVNob3dMYWJlbHMgKSB7CgkgICAgJGhlaWdodCArPSAkdGhpcy0+bWludXRlLT5HZXRGb250SGVpZ2h0KCRpbWcpOwoJICAgICRoZWlnaHQgKz0gJHRoaXMtPm1pbnV0ZS0+aVRpdGxlVmVydE1hcmdpbjsKCX0KCWlmKCAkdGhpcy0+aG91ci0+aVNob3dMYWJlbHMgKSB7CgkgICAgJGhlaWdodCArPSAkdGhpcy0+aG91ci0+R2V0Rm9udEhlaWdodCgkaW1nKTsKCSAgICAkaGVpZ2h0ICs9ICR0aGlzLT5ob3VyLT5pVGl0bGVWZXJ0TWFyZ2luOwoJfQoJaWYoICR0aGlzLT5kYXktPmlTaG93TGFiZWxzICkgewoJICAgICRoZWlnaHQgKz0gJHRoaXMtPmRheS0+R2V0Rm9udEhlaWdodCgkaW1nKTsKCSAgICAkaGVpZ2h0ICs9ICR0aGlzLT5kYXktPmlUaXRsZVZlcnRNYXJnaW47Cgl9CglpZiggJHRoaXMtPndlZWstPmlTaG93TGFiZWxzICkgewoJICAgICRoZWlnaHQgKz0gJHRoaXMtPndlZWstPkdldEZvbnRIZWlnaHQoJGltZyk7CgkgICAgJGhlaWdodCArPSAkdGhpcy0+d2Vlay0+aVRpdGxlVmVydE1hcmdpbjsKCX0KCWlmKCAkdGhpcy0+bW9udGgtPmlTaG93TGFiZWxzICkgewoJICAgICRoZWlnaHQgKz0gJHRoaXMtPm1vbnRoLT5HZXRGb250SGVpZ2h0KCRpbWcpOwoJICAgICRoZWlnaHQgKz0gJHRoaXMtPm1vbnRoLT5pVGl0bGVWZXJ0TWFyZ2luOwoJfQoJaWYoICR0aGlzLT55ZWFyLT5pU2hvd0xhYmVscyApIHsKCSAgICAkaGVpZ2h0ICs9ICR0aGlzLT55ZWFyLT5HZXRGb250SGVpZ2h0KCRpbWcpOwoJICAgICRoZWlnaHQgKz0gJHRoaXMtPnllYXItPmlUaXRsZVZlcnRNYXJnaW47Cgl9CglyZXR1cm4gJGhlaWdodDsKICAgIH0KCQogICAgLy8gR2V0IHdpZHRoIChpbiBwaXhlbHMpIGZvciBhIHNpbmdsZSBkYXkKICAgIGZ1bmN0aW9uIEdldERheVdpZHRoKCkgewoJcmV0dXJuICgkdGhpcy0+R2V0UGxvdFdpZHRoKCktJHRoaXMtPmlMYWJlbFdpZHRoKzEpLyR0aGlzLT5HZXROdW1iZXJPZkRheXMoKTsJCiAgICB9CgogICAgLy8gR2V0IHdpZHRoIChpbiBwaXhlbHMpIGZvciBhIHNpbmdsZSBob3VyCiAgICBmdW5jdGlvbiBHZXRIb3VyV2lkdGgoKSB7CglyZXR1cm4gJHRoaXMtPkdldERheVdpZHRoKCkgLyAyNCA7CiAgICB9CgogICAgZnVuY3Rpb24gR2V0TWludXRlV2lkdGgoKSB7CglyZXR1cm4gJHRoaXMtPkdldEhvdXJXaWR0aCgpIC8gNjAgOwogICAgfQoKICAgIC8vIE51YmVyIG9mIGRheXMgaW4gYSB5ZWFyCiAgICBmdW5jdGlvbiBHZXROdW1EYXlzSW5ZZWFyKCRhWWVhcikgewoJaWYoICR0aGlzLT5Jc0xlYXAoJGFZZWFyKSApCgkgICAgcmV0dXJuIDM2NjsKCWVsc2UKCSAgICByZXR1cm4gMzY1OwogICAgfQoJCiAgICAvLyBHZXQgd2VlayBudW1iZXIgCiAgICBmdW5jdGlvbiBHZXRXZWVrTmJyKCRhRGF0ZSwkYVN1blN0YXJ0PXRydWUpIHsKCS8vIFdlIGNhbid0IHVzZSB0aGUgaW50ZXJuYWwgc3RyZnRpbWUoKSBzaW5jZSBpdCBnZXRzIHRoZSB3ZWVrbnVtYmVyCgkvLyB3cm9uZyBzaW5jZSBpdCBkb2Vzbid0IGZvbGxvdyBJU08gb24gYWxsIHN5c3RlbXMgc2luY2UgdGhpcyBpcwoJLy8gc3lzdGVtIGxpbnJhcnkgZGVwZW5kZW50LgoJLy8gRXZlbiB3b3JzZSBpcyB0aGF0IHRoaXMgd29ya3MgZGlmZmVyZW50bHkgaWYgd2UgYXJlIG9uIGEgV2luZG93cwoJLy8gb3IgVU5JWCBib3ggKGl0IGV2ZW4gZGlmZmVycyBiZXR3ZWVuIFVOSVggYm94ZXMgaG93IHN0cmZ0aW1lKCkKCS8vIGlzIG5hdGl2ZWx5IGltcGxlbWVudGVkKQoJLy8KCS8vIENyZWRpdCB0byBOaWNvbGFzIEhvaXpleSA8bmhvaXpleUBwaHBoZWF2ZW4ubmV0PiBmb3IgdGhpcyBlbGVnYW50CgkvLyB2ZXJzaW9uIG9mIFdlZWsgTmJyIGNhbGN1bGF0aW9uLiAKCgkkZGF5ID0gJHRoaXMtPk5vcm1hbGl6ZURhdGUoJGFEYXRlKSA7CglpZiggJGFTdW5TdGFydCApCgkgICAgJGRheSArPSA2MCo2MCoyNDsKCQkKCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJICBBY2NvcmRpbmcgdG8gSVNPLTg2MDEgOgoJICAiV2VlayAwMSBvZiBhIHllYXIgaXMgcGVyIGRlZmluaXRpb24gdGhlIGZpcnN0IHdlZWsgdGhhdCBoYXMgdGhlIFRodXJzZGF5IGluIHRoaXMgeWVhciwKCSAgd2hpY2ggaXMgZXF1aXZhbGVudCB0byB0aGUgd2VlayB0aGF0IGNvbnRhaW5zIHRoZSBmb3VydGggZGF5IG9mIEphbnVhcnkuCgkgIEluIG90aGVyIHdvcmRzLCB0aGUgZmlyc3Qgd2VlayBvZiBhIG5ldyB5ZWFyIGlzIHRoZSB3ZWVrIHRoYXQgaGFzIHRoZSBtYWpvcml0eSBvZiBpdHMKCSAgZGF5cyBpbiB0aGUgbmV3IHllYXIuIgoJCSAgCgkgIEJlIGNhcmVmdWxsLCB3aXRoIFBIUCwgLTMgJSA3ID0gLTMsIGluc3RlYWQgb2YgNCAhISEKCQkgIAoJICBkYXkgb2YgeWVhciAgICAgICAgICAgICA9IGRhdGUoInoiLCAkZGF5KSArIDEKCSAgb2Zmc2V0IHRvIHRodXJzZGF5ICAgICAgPSAzIC0gKGRhdGUoInciLCAkZGF5KSArIDYpICUgNwoJICBmaXJzdCB0aHVyc2RheSBvZiB5ZWFyICA9IDEgKyAoMTEgLSBkYXRlKCJ3IiwgbWt0aW1lKDAsIDAsIDAsIDEsIDEsIGRhdGUoIlkiLCAkZGF5KSkpKSAlIDcKCSAgd2VlayBudW1iZXIgICAgICAgICAgICAgPSAodGh1cnNkYXkncyBkYXkgb2YgeWVhciAtIGZpcnN0IHRodXJzZGF5J3MgZGF5IG9mIHllYXIpIC8gNyArIDEKCSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCQkgCgkkdGh1cnNkYXkgPSAkZGF5ICsgNjAgKiA2MCAqIDI0ICogKDMgLSAoZGF0ZSgidyIsICRkYXkpICsgNikgJSA3KTsgICAgICAgICAgICAgIC8vIHRha2Ugd2VlaydzIHRodXJzZGF5Cgkkd2VlayA9IDEgKyAoZGF0ZSgieiIsICR0aHVyc2RheSkgLSAoMTEgLSBkYXRlKCJ3IiwgbWt0aW1lKDAsIDAsIDAsIDEsIDEsIGRhdGUoIlkiLCAkdGh1cnNkYXkpKSkpICUgNykgLyA3OwoJCSAgCglyZXR1cm4gJHdlZWs7CiAgICB9CgkKICAgIC8vIElzIHllYXIgYSBsZWFwIHllYXI/CiAgICBmdW5jdGlvbiBJc0xlYXAoJGFZZWFyKSB7CgkvLyBJcyB0aGUgeWVhciBhIGxlYXAgeWVhcj8KCS8vJHllYXIgPSAwK2RhdGUoIlkiLCRhRGF0ZSk7CglpZiggJGFZZWFyICUgNCA9PSAwKQoJICAgIGlmKCAhKCRhWWVhciAlIDEwMCA9PSAwKSB8fCAoJGFZZWFyICUgNDAwID09IDApICkKCQlyZXR1cm4gdHJ1ZTsKCXJldHVybiBmYWxzZTsKICAgIH0KCiAgICAvLyBHZXQgY3VycmVudCB5ZWFyCiAgICBmdW5jdGlvbiBHZXRZZWFyKCRhRGF0ZSkgewoJcmV0dXJuIDArRGF0ZSgiWSIsJGFEYXRlKTsKICAgIH0KCQogICAgLy8gUmV0dXJuIG51bWJlciBvZiBkYXlzIGluIGEgeWVhcgogICAgZnVuY3Rpb24gR2V0TnVtRGF5c0luTW9udGgoJGFNb250aCwkYVllYXIpIHsKCSRkYXlzPWFycmF5KDMxLDI4LDMxLDMwLDMxLDMwLDMxLDMxLDMwLDMxLDMwLDMxKTsKCSRkYXlzbD1hcnJheSgzMSwyOSwzMSwzMCwzMSwzMCwzMSwzMSwzMCwzMSwzMCwzMSk7CglpZiggJHRoaXMtPklzTGVhcCgkYVllYXIpKQoJICAgIHJldHVybiAkZGF5c2xbJGFNb250aF07CgllbHNlCgkgICAgcmV0dXJuICRkYXlzWyRhTW9udGhdOwogICAgfQoJCiAgICAvLyBHZXQgZGF5IGluIG1vbnRoCiAgICBmdW5jdGlvbiBHZXRNb250aERheU5icigkYURhdGUpIHsKCXJldHVybiAwK3N0cmZ0aW1lKCIlZCIsJGFEYXRlKTsKICAgIH0KCiAgICAvLyBHZXQgZGF5IGluIHllYXIKICAgIGZ1bmN0aW9uIEdldFllYXJEYXlOYnIoJGFEYXRlKSB7CglyZXR1cm4gMCtzdHJmdGltZSgiJWoiLCRhRGF0ZSk7CiAgICB9CgkKICAgIC8vIEdldCBtb250aCBudW1iZXIKICAgIGZ1bmN0aW9uIEdldE1vbnRoTmJyKCRhRGF0ZSkgewoJcmV0dXJuIDArc3RyZnRpbWUoIiVtIiwkYURhdGUpOwogICAgfQoJCiAgICAvLyBUcmFuc2xhdGUgYSBkYXRlIHRvIHNjcmVlbiBjb29yZGluYXRlcwkoaG9yaXpvbnRhbCBzY2FsZSkKICAgIGZ1bmN0aW9uIFRyYW5zbGF0ZURhdGUoJGFEYXRlKSB7CgkvLwoJLy8gSW4gb3JkZXIgdG8gaGFuZGxlIHRoZSBwcm9ibGVtIHdpdGggRGF5bGlnaHQgc2F2aW5ncyB0aW1lCgkvLyB0aGUgc2NhbGUgd3JpdHRlbiB3aXRoIGVxdWFsIG51bWJlciBvZiBzZWNvbmRzIHBlciBkYXkgYmVnaW5uaW5nCgkvLyB3aXRoIHRoZSBzdGFydCBkYXRlLiBUaGlzIG1lYW5zIHRoYXQgd2UgImNlbWVudCIgdGhlIHN0YXRlIG9mCgkvLyBEU1QgYXMgaXQgaXMgaW4gdGhlIHN0YXJ0IGRhdGUuIElmIGxhdGVyIHRoZSBzY2FsZSBpbmNsdWRlcyB0aGUKCS8vIHN3aXRjaG92ZXIgZGF0ZSAoZGVwZW5kcyBvbiB0aGUgbG9jYWxlKSB3ZSBuZWVkIHRvIGFkanVzdCBiYWNrCgkvLyBpZiB0aGUgZGF0ZSB3ZSB0cnkgdG8gdHJhbnNsYXRlIGhhcyBhIGRpZmZlcmVudCBEU1Qgc3RhdHVzIHNpbmNlCgkvLyB3ZSB3b3VsZCBvdGhlcndpc2UgYmUgb2ZmIGJ5IG9uZSBob3VyLgoJJGFEYXRlID0gJHRoaXMtPk5vcm1hbGl6ZURhdGUoJGFEYXRlKTsKCSR0bXAgPSBsb2NhbHRpbWUoJGFEYXRlKTsKCSRjbG9jID0gJHRtcFs4XTsKCSR0bXAgPSBsb2NhbHRpbWUoJHRoaXMtPmlTdGFydERhdGUpOwoJJHNsb2MgPSAkdG1wWzhdOwoJJG9mZnNldCA9IDA7CglpZiggJHNsb2MgIT0gJGNsb2MpIHsKCSAgICBpZiggJHNsb2MgKSAKCQkkb2Zmc2V0ID0gMzYwMDsKCSAgICBlbHNlCgkJJG9mZnNldCA9IC0zNjAwOwoJfQoJJGltZz0kdGhpcy0+aUltZzsJCQoJcmV0dXJuICgkYURhdGUtJHRoaXMtPmlTdGFydERhdGUtJG9mZnNldCkvU0VDUEVSREFZKiR0aGlzLT5HZXREYXlXaWR0aCgpKyRpbWctPmxlZnRfbWFyZ2luKyR0aGlzLT5pTGFiZWxXaWR0aDs7CiAgICB9CgogICAgLy8gR2V0IHNjcmVlbiBjb29yZGluYXRlc3ogZm9yIHRoZSB2ZXJ0aWNhbCBwb3NpdGlvbiBmb3IgYSBiYXIJCQogICAgZnVuY3Rpb24gVHJhbnNsYXRlVmVydFBvcygkYVBvcykgewoJJGltZz0kdGhpcy0+aUltZzsKCSRwaD0kdGhpcy0+aUF2YWlsYWJsZUhlaWdodDsKCWlmKCAkYVBvcyA+ICR0aGlzLT5pVmVydExpbmVzICkgCgkgICAgSnBHcmFwaEVycm9yOjpSYWlzZUwoNjAxNSwkYVBvcyk7Ci8vICdJbGxlZ2FsIHZlcnRpY2FsIHBvc2l0aW9uICVkJwoJaWYoICR0aGlzLT5pVmVydExheW91dCA9PSBHQU5UVF9FVkVOICkgewoJICAgIC8vIFBvc2l0aW9uIHRoZSB0b3AgYmFyIGF0IDEgdmVydCBzcGFjaW5nIGZyb20gdGhlIHNjYWxlCgkgICAgcmV0dXJuIHJvdW5kKCRpbWctPnRvcF9tYXJnaW4gKyAkdGhpcy0+aVZlcnRIZWFkZXJTaXplICsgICgkYVBvcysxKSokdGhpcy0+aVZlcnRTcGFjaW5nKTsKCX0KCWVsc2UgewoJICAgIC8vIHBvc2l0aW9uIHRoZSB0b3AgYmFyIGF0IDEvMiBhIHZlcnQgc3BhY2luZyBmcm9tIHRoZSBzY2FsZQoJICAgIHJldHVybiByb3VuZCgkaW1nLT50b3BfbWFyZ2luICsgJHRoaXMtPmlWZXJ0SGVhZGVyU2l6ZSAgKyAkdGhpcy0+aVRvcFBsb3RNYXJnaW4gKyAoJGFQb3MrMSkqJHRoaXMtPmlWZXJ0U3BhY2luZyk7CQkKCX0KICAgIH0KCQogICAgLy8gV2hhdCBpcyB0aGUgdmVydGljYWwgc3BhY2luZz8KICAgIGZ1bmN0aW9uIEdldFZlcnRTcGFjaW5nKCkgewoJcmV0dXJuICR0aGlzLT5pVmVydFNwYWNpbmc7CiAgICB9CgkJCQkJCiAgICAvLyBDb252ZXJ0IGEgZGF0ZSB0byB0aW1lc3RhbXAKICAgIGZ1bmN0aW9uIE5vcm1hbGl6ZURhdGUoJGFEYXRlKSB7CglpZiggJGFEYXRlID09PSBmYWxzZSApIHJldHVybiBmYWxzZTsgCglpZiggaXNfc3RyaW5nKCRhRGF0ZSkgKSB7CgkgICAgJHQgPSBzdHJ0b3RpbWUoJGFEYXRlKTsKCSAgICBpZiggJHQgPT09IEZBTFNFIHx8ICR0ID09PSAtMSApIHsJICAgIAoJCUpwR3JhcGhFcnJvcjo6UmFpc2VMKDYwMTYsJGFEYXRlKTsKLy8oIkRhdGUgc3RyaW5nICgkYURhdGUpIHNwZWNpZmllZCBmb3IgR2FudHQgYWN0aXZpdHkgY2FuIG5vdCBiZSBpbnRlcnByZXRhdGVkLiBQbGVhc2UgbWFrZSBzdXJlIGl0IGlzIGEgdmFsaWQgdGltZSBzdHJpbmcsIGUuZy4gMjAwNS0wNC0yMyAxMzozMCIpOwoJICAgIH0KCSAgICByZXR1cm4gJHQ7Cgl9CgllbHNlaWYoIGlzX2ludCgkYURhdGUpIHx8IGlzX2Zsb2F0KCRhRGF0ZSkgKQoJICAgIHJldHVybiAkYURhdGU7CgllbHNlCgkgICAgSnBHcmFwaEVycm9yOjpSYWlzZUwoNjAxNywkYURhdGUpOwovL1Vua25vd24gZGF0ZSBmb3JtYXQgaW4gR2FudHRTY2FsZSAoJGFEYXRlKS4iKTsKICAgIH0KCiAgICAKICAgIC8vIENvbnZlcnQgYSB0aW1lIHN0cmluZyB0byBtaW51dGVzCgogICAgZnVuY3Rpb24gVGltZVRvTWludXRlcygkYVRpbWVTdHJpbmcpIHsKCS8vIFNwbGl0IGluIGhvdXJzIGFuZCBtaW51dGVzCgkkcG9zPXN0cnBvcygkYVRpbWVTdHJpbmcsJzonKTsKCSRtaW5pbnQ9NjA7CglpZiggJHBvcyA9PT0gZmFsc2UgKSB7CgkgICAgJGhvdXJpbnQgPSAkYVRpbWVTdHJpbmc7CgkgICAgJG1pbmludCA9IDA7Cgl9CgllbHNlIHsKCSAgICAkaG91cmludCA9IGZsb29yKHN1YnN0cigkYVRpbWVTdHJpbmcsMCwkcG9zKSk7CgkgICAgJG1pbmludCA9IGZsb29yKHN1YnN0cigkYVRpbWVTdHJpbmcsJHBvcysxKSk7Cgl9CgkkbWluaW50ICs9IDYwICogJGhvdXJpbnQ7CglyZXR1cm4gJG1pbmludDsKICAgIH0KCiAgICAvLyBTdHJva2UgdGhlIGRheSBzY2FsZSAoaW5jbHVkaW5nIGdyaWRsaW5lcykJCQkKICAgIGZ1bmN0aW9uIFN0cm9rZU1pbnV0ZXMoJGFZQ29vcmQsJGdldEhlaWdodD1mYWxzZSkgewoJJGltZz0kdGhpcy0+aUltZzsJCgkkeHQ9JGltZy0+bGVmdF9tYXJnaW4rJHRoaXMtPmlMYWJlbFdpZHRoOwoJJHl0PSRhWUNvb3JkKyRpbWctPnRvcF9tYXJnaW47CQkKCWlmKCAkdGhpcy0+bWludXRlLT5pU2hvd0xhYmVscyApIHsKCSAgICAkaW1nLT5TZXRGb250KCR0aGlzLT5taW51dGUtPmlGRmFtaWx5LCR0aGlzLT5taW51dGUtPmlGU3R5bGUsJHRoaXMtPm1pbnV0ZS0+aUZTaXplKTsKCSAgICAkeWIgPSAkeXQgKyAkaW1nLT5HZXRGb250SGVpZ2h0KCkgKyAKCQkgICR0aGlzLT5taW51dGUtPmlUaXRsZVZlcnRNYXJnaW4gKyAkdGhpcy0+bWludXRlLT5pRnJhbWVXZWlnaHQ7CgkgICAgaWYoICRnZXRIZWlnaHQgKSB7CgkJcmV0dXJuICR5YiAtICRpbWctPnRvcF9tYXJnaW47CgkgICAgfQoJICAgICR4YiA9ICRpbWctPndpZHRoLSRpbWctPnJpZ2h0X21hcmdpbisxOwoJICAgICRpbWctPlNldENvbG9yKCR0aGlzLT5taW51dGUtPmlCYWNrZ3JvdW5kQ29sb3IpOwoJICAgICRpbWctPkZpbGxlZFJlY3RhbmdsZSgkeHQsJHl0LCR4YiwkeWIpOwoKCSAgICAkeCA9ICR4dDsgICAKCSAgICAkaW1nLT5TZXRUZXh0QWxpZ24oImNlbnRlciIpOwoJICAgICRkYXkgPSBkYXRlKCd3JywkdGhpcy0+aVN0YXJ0RGF0ZSk7CgkgICAgJG1pbmludCA9ICR0aGlzLT5taW51dGUtPkdldEludGVydmFsbCgpIDsKCSAgICAKCSAgICBpZiggNjAgJSAkbWluaW50ICE9PSAwICkgeyAKICAgICAgICAgICAgICAgIEpwR3JhcGhFcnJvcjo6UmFpc2VMKDYwMTgsJG1pbmludCk7Ci8vJ0ludGVydmFsbCBmb3IgbWludXRlcyBtdXN0IGRpdmlkZSB0aGUgaG91ciBldmVubHksIGUuZy4gMSw1LDEwLDEyLDE1LDIwLDMwIGV0YyBZb3UgaGF2ZSBzcGVjaWZpZWQgYW4gaW50ZXJ2YWxsIG9mICcuJG1pbmludC4nIG1pbnV0ZXMuJyk7CiAgICAgICAgICAgIH0gCgoKCSAgICAkbiA9IDYwIC8gJG1pbmludDsKCSAgICAkZGF0ZXN0YW1wID0gJHRoaXMtPmlTdGFydERhdGU7CgkgICAgJHdpZHRoID0gJHRoaXMtPkdldEhvdXJXaWR0aCgpIC8gJG4gOwoJICAgIGlmKCAkd2lkdGggPCA4ICkgewoJCS8vIFRPIHNtYWxsIHdpZHRoIHRvIGRyYXcgbWludXRlIHNjYWxlCgkJSnBHcmFwaEVycm9yOjpSYWlzZUwoNjAxOSwkd2lkdGgpOwovLygnVGhlIGF2YWlsYWJsZSB3aWR0aCAoJy4kd2lkdGguJykgZm9yIG1pbnV0ZXMgYXJlIHRvIHNtYWxsIGZvciB0aGlzIHNjYWxlIHRvIGJlIGRpc3BsYXllZC4gUGxlYXNlIHVzZSBhdXRvLXNpemluZyBvciBpbmNyZWFzZSB0aGUgd2lkdGggb2YgdGhlIGdyYXBoLicpOwoJICAgIH0KCgkgICAgJG5oID0gY2VpbCgyNCo2MCAvICR0aGlzLT5UaW1lVG9NaW51dGVzKCR0aGlzLT5ob3VyLT5HZXRJbnRlcnZhbGwoKSkgKTsKCSAgICAkbmQgPSAkdGhpcy0+R2V0TnVtYmVyT2ZEYXlzKCk7CgkgICAgLy8gQ29udmVydCB0byBpbnRlcnZhbGwgdG8gc2Vjb25kcwoJICAgICRtaW5pbnQgKj0gNjA7CgkgICAgZm9yKCRqPTA7ICRqIDwgJG5kOyArKyRqLCAkZGF5ICs9IDEsICRkYXkgJT0gNykgewoJCWZvciggJGs9MDsgJGsgPCAkbmg7ICsrJGsgKSB7CgkJICAgIGZvcigkaT0wOyAkaSA8ICRuIDsrKyRpLCAkeCs9JHdpZHRoLCAkZGF0ZXN0YW1wICs9ICRtaW5pbnQgKSB7ICAgCgkJCWlmKCAkZGF5PT02IHx8ICRkYXk9PTAgKSB7CgkJCQoJCQkgICAgJGltZy0+UHVzaENvbG9yKCR0aGlzLT5kYXktPmlXZWVrZW5kQmFja2dyb3VuZENvbG9yKTsKCQkJICAgIGlmKCAkdGhpcy0+aVVzZVBsb3RXZWVrZW5kQmFja2dyb3VuZCApCgkJCQkkaW1nLT5GaWxsZWRSZWN0YW5nbGUoJHgsJHl0KyR0aGlzLT5kYXktPmlGcmFtZVdlaWdodCwkeCskd2lkdGgsJGltZy0+aGVpZ2h0LSRpbWctPmJvdHRvbV9tYXJnaW4pOwkJCQkJCQoJCQkgICAgZWxzZQoJCQkJJGltZy0+RmlsbGVkUmVjdGFuZ2xlKCR4LCR5dCskdGhpcy0+ZGF5LT5pRnJhbWVXZWlnaHQsJHgrJHdpZHRoLCR5Yi0kdGhpcy0+ZGF5LT5pRnJhbWVXZWlnaHQpOwoJCQkgICAgJGltZy0+UG9wQ29sb3IoKTsKCgkJCX0KCgkJCWlmKCAkZGF5PT0wICkgCgkJCSAgICAkaW1nLT5TZXRDb2xvcigkdGhpcy0+ZGF5LT5pU3VuZGF5VGV4dENvbG9yKTsKCQkJZWxzZQoJCQkgICAgJGltZy0+U2V0Q29sb3IoJHRoaXMtPmRheS0+aVRleHRDb2xvcik7CgoJCQlzd2l0Y2goICR0aGlzLT5taW51dGUtPmlTdHlsZSApIHsKCQkJICAgIGNhc2UgTUlOVVRFU1RZTEVfQ1VTVE9NOgoJCQkJJHR4dCA9IGRhdGUoJHRoaXMtPm1pbnV0ZS0+aUxhYmVsRm9ybVN0ciwkZGF0ZXN0YW1wKTsKCQkJCWJyZWFrOwoJCQkgICAgY2FzZSBNSU5VVEVTVFlMRV9NTToKCQkJICAgIGRlZmF1bHQ6CgkJCQkvLyAxNQoJCQkJJHR4dCA9IGRhdGUoJ2knLCRkYXRlc3RhbXApOwoJCQkJYnJlYWs7CgkJCX0KCQkJJGltZy0+U3Ryb2tlVGV4dChyb3VuZCgkeCskd2lkdGgvMikscm91bmQoJHliLSR0aGlzLT5taW51dGUtPmlUaXRsZVZlcnRNYXJnaW4pLCR0eHQpOwoKCQkJLy8gRklYTUU6IFRoZSByb3VuZGluZyBwcm9ibGVtIG5lZWRzIHRvIGJlIHNvbHZlZCBwcm9wZXJseSAuLi4KCQkJLy8KCQkJLy8gRml4IGEgcm91bmRpbmcgcHJvYmxlbSB0aGUgd3Jvbmcgd2F5IC4uCgkJCS8vIElmIHdlIGFsc28gaGF2ZSBob3VyIHNjYWxlIHRoZW4gZG9uJ3QgZHJhdyB0aGUgZmlyc3RhIG9yIGxhc3QKCQkJLy8gZ3JpZGxpbmUgc2luY2UgdGhhdCB3aWxsIGJlIG92ZXJ3cml0dGVuIGJ5IHRoZSBob3VyIHNjYWxlIGdyaWRsaW5lIGlmIHN1Y2ggZXhpc3RzLgoJCQkvLyBIb3dldmVyLCBkdWUgdG8gdGhlIHByb3BhZ2F0aW9uIG9mIHJvdW5kaW5nIG9mIHRoZSAneCs9d2lkdGgnIHRlcm0gaW4gdGhlIGxvb3AKCQkJLy8gdGhpcyBtaWdodCBzb21ldGltZXMgYmUgb25lIHBpeGVsIG9mIHNvIHdlIGZpeCB0aGlzIGJ5IG5vdCBkcmF3aW5nIGl0LgoJCQkvLyBUaGUgcHJvcGVyIHdheSB0byBmaXggaXQgd291bGQgYmUgdG8gcmUtY2FsY3VsYXRlIHRoZSBzY2FsZSBmb3IgZWFjaCBzdGVwIGFuZAoJCQkvLyBub3QgdXNpbmcgdGhlIGFkZGl0aXZlIHRlcm0uCgkJCWlmKCAhKCgkaSA9PSAkbiB8fCAkaT09MCkgJiYgJHRoaXMtPmhvdXItPmlTaG93TGFiZWxzICYmICR0aGlzLT5ob3VyLT5ncmlkLT5pU2hvdykgKSB7CgkJCSAgICAkaW1nLT5TZXRDb2xvcigkdGhpcy0+bWludXRlLT5ncmlkLT5pQ29sb3IpOwoJCQkgICAgJGltZy0+U2V0TGluZVdlaWdodCgkdGhpcy0+bWludXRlLT5ncmlkLT5pV2VpZ2h0KTsKCQkJICAgICRpbWctPkxpbmUoJHgsJHl0LCR4LCR5Yik7CgkJCSAgICAkdGhpcy0+bWludXRlLT5ncmlkLT5TdHJva2UoJGltZywkeCwkeWIsJHgsJGltZy0+aGVpZ2h0LSRpbWctPmJvdHRvbV9tYXJnaW4pOwoJCQl9CgkJICAgIH0JCQoJCX0JCgkgICAgfQoJICAgICRpbWctPlNldENvbG9yKCR0aGlzLT5taW51dGUtPmlGcmFtZUNvbG9yKTsKCSAgICAkaW1nLT5TZXRMaW5lV2VpZ2h0KCR0aGlzLT5taW51dGUtPmlGcmFtZVdlaWdodCk7CgkgICAgJGltZy0+UmVjdGFuZ2xlKCR4dCwkeXQsJHhiLCR5Yik7CgkgICAgcmV0dXJuICR5YiAtICRpbWctPnRvcF9tYXJnaW47Cgl9CglyZXR1cm4gJGFZQ29vcmQ7CiAgICB9CgogICAgLy8gU3Ryb2tlIHRoZSBkYXkgc2NhbGUgKGluY2x1ZGluZyBncmlkbGluZXMpCQkJCiAgICBmdW5jdGlvbiBTdHJva2VIb3VycygkYVlDb29yZCwkZ2V0SGVpZ2h0PWZhbHNlKSB7CgkkaW1nPSR0aGlzLT5pSW1nOwkKCSR4dD0kaW1nLT5sZWZ0X21hcmdpbiskdGhpcy0+aUxhYmVsV2lkdGg7CgkkeXQ9JGFZQ29vcmQrJGltZy0+dG9wX21hcmdpbjsJCQoJaWYoICR0aGlzLT5ob3VyLT5pU2hvd0xhYmVscyApIHsKCSAgICAkaW1nLT5TZXRGb250KCR0aGlzLT5ob3VyLT5pRkZhbWlseSwkdGhpcy0+aG91ci0+aUZTdHlsZSwkdGhpcy0+aG91ci0+aUZTaXplKTsKCSAgICAkeWIgPSAkeXQgKyAkaW1nLT5HZXRGb250SGVpZ2h0KCkgKyAKCQkgICR0aGlzLT5ob3VyLT5pVGl0bGVWZXJ0TWFyZ2luICsgJHRoaXMtPmhvdXItPmlGcmFtZVdlaWdodDsKCSAgICBpZiggJGdldEhlaWdodCApIHsKCQlyZXR1cm4gJHliIC0gJGltZy0+dG9wX21hcmdpbjsKCSAgICB9CgkgICAgJHhiID0gJGltZy0+d2lkdGgtJGltZy0+cmlnaHRfbWFyZ2luKzE7CgkgICAgJGltZy0+U2V0Q29sb3IoJHRoaXMtPmhvdXItPmlCYWNrZ3JvdW5kQ29sb3IpOwoJICAgICRpbWctPkZpbGxlZFJlY3RhbmdsZSgkeHQsJHl0LCR4YiwkeWIpOwoKCSAgICAkeCA9ICR4dDsgICAKCSAgICAkaW1nLT5TZXRUZXh0QWxpZ24oImNlbnRlciIpOwoJICAgICR0bXAgPSAkdGhpcy0+aG91ci0+R2V0SW50ZXJ2YWxsKCkgOwoJICAgICRtaW5pbnQgPSAkdGhpcy0+VGltZVRvTWludXRlcygkdG1wKTsKCSAgICBpZiggMTQ0MCAlICRtaW5pbnQgIT09IDAgKSB7IAogICAgICAgICAgICAgICAgSnBHcmFwaEVycm9yOjpSYWlzZUwoNjAyMCwkdG1wKTsKLy8oJ0ludGVydmFsbCBmb3IgaG91cnMgbXVzdCBkaXZpZGUgdGhlIGRheSBldmVubHksIGUuZy4gMDozMCwgMTowMCwgMTozMCwgNDowMCBldGMuIFlvdSBoYXZlIHNwZWNpZmllZCBhbiBpbnRlcnZhbGwgb2YgJy4kdG1wKTsKICAgICAgICAgICAgfSAKCgkgICAgJG4gPSBjZWlsKDI0KjYwIC8gJG1pbmludCApOwoJICAgICRkYXRlc3RhbXAgPSAkdGhpcy0+aVN0YXJ0RGF0ZTsKCSAgICAkZGF5ID0gZGF0ZSgndycsJHRoaXMtPmlTdGFydERhdGUpOwoJICAgICRkb2JhY2sgPSAhJHRoaXMtPm1pbnV0ZS0+aVNob3dMYWJlbHM7CgkgICAgJHdpZHRoID0gJHRoaXMtPkdldERheVdpZHRoKCkgLyAkbiA7CgkgICAgZm9yKCRqPTA7ICRqIDwgJHRoaXMtPkdldE51bWJlck9mRGF5cygpOyArKyRqLCAkZGF5ICs9IDEsJGRheSAlPSA3KSB7CgkJZm9yKCRpPTA7ICRpIDwgJG4gOysrJGksICR4Kz0kd2lkdGgpIHsgICAKCQkgICAgaWYoICRkYXk9PTYgfHwgJGRheT09MCApIHsKCQkJCgkJCSRpbWctPlB1c2hDb2xvcigkdGhpcy0+ZGF5LT5pV2Vla2VuZEJhY2tncm91bmRDb2xvcik7CgkJCWlmKCAkdGhpcy0+aVVzZVBsb3RXZWVrZW5kQmFja2dyb3VuZCAmJiAkZG9iYWNrICkKCQkJICAgICRpbWctPkZpbGxlZFJlY3RhbmdsZSgkeCwkeXQrJHRoaXMtPmRheS0+aUZyYW1lV2VpZ2h0LCR4KyR3aWR0aCwkaW1nLT5oZWlnaHQtJGltZy0+Ym90dG9tX21hcmdpbik7CQkJCQkJCgkJCWVsc2UKCQkJICAgICRpbWctPkZpbGxlZFJlY3RhbmdsZSgkeCwkeXQrJHRoaXMtPmRheS0+aUZyYW1lV2VpZ2h0LCR4KyR3aWR0aCwkeWItJHRoaXMtPmRheS0+aUZyYW1lV2VpZ2h0KTsKCQkJJGltZy0+UG9wQ29sb3IoKTsKCgkJICAgIH0KCgkJICAgIGlmKCAkZGF5PT0wICkgCgkJCSRpbWctPlNldENvbG9yKCR0aGlzLT5kYXktPmlTdW5kYXlUZXh0Q29sb3IpOwoJCSAgICBlbHNlCgkJCSRpbWctPlNldENvbG9yKCR0aGlzLT5kYXktPmlUZXh0Q29sb3IpOwoKCQkgICAgc3dpdGNoKCAkdGhpcy0+aG91ci0+aVN0eWxlICkgewoJCQljYXNlIEhPVVJTVFlMRV9ITUFNUE06CgkJCSAgICAvLyAxOjM1cG0KCQkJICAgICR0eHQgPSBkYXRlKCdnOmlhJywkZGF0ZXN0YW1wKTsKCQkJICAgIGJyZWFrOwoJCQljYXNlIEhPVVJTVFlMRV9IMjQ6CgkJCSAgICAvLyAxMwoJCQkgICAgJHR4dCA9IGRhdGUoJ0gnLCRkYXRlc3RhbXApOwoJCQkgICAgYnJlYWs7CgkJCWNhc2UgSE9VUlNUWUxFX0hBTVBNOgoJCQkgICAgJHR4dCA9IGRhdGUoJ2dhJywkZGF0ZXN0YW1wKTsKCQkJICAgIGJyZWFrOwoJCQljYXNlIEhPVVJTVFlMRV9DVVNUT006CgkJCSAgICAkdHh0ID0gZGF0ZSgkdGhpcy0+aG91ci0+aUxhYmVsRm9ybVN0ciwkZGF0ZXN0YW1wKTsKCQkJICAgIGJyZWFrOwoJCQljYXNlIEhPVVJTVFlMRV9ITTI0OgoJCQlkZWZhdWx0OgoJCQkgICAgJHR4dCA9IGRhdGUoJ0g6aScsJGRhdGVzdGFtcCk7CgkJCSAgICBicmVhazsKCQkgICAgfQoJCSAgICAkaW1nLT5TdHJva2VUZXh0KHJvdW5kKCR4KyR3aWR0aC8yKSxyb3VuZCgkeWItJHRoaXMtPmhvdXItPmlUaXRsZVZlcnRNYXJnaW4pLCR0eHQpOwoJCSAgICAkaW1nLT5TZXRDb2xvcigkdGhpcy0+aG91ci0+Z3JpZC0+aUNvbG9yKTsKCQkgICAgJGltZy0+U2V0TGluZVdlaWdodCgkdGhpcy0+aG91ci0+Z3JpZC0+aVdlaWdodCk7CgkJICAgICRpbWctPkxpbmUoJHgsJHl0LCR4LCR5Yik7CgkJICAgICR0aGlzLT5ob3VyLT5ncmlkLT5TdHJva2UoJGltZywkeCwkeWIsJHgsJGltZy0+aGVpZ2h0LSRpbWctPmJvdHRvbV9tYXJnaW4pOwoJCSAgICAvLyRkYXRlc3RhbXAgKz0gJG1pbmludCo2MAoJCSAgICAkZGF0ZXN0YW1wID0gbWt0aW1lKGRhdGUoJ0gnLCRkYXRlc3RhbXApLGRhdGUoJ2knLCRkYXRlc3RhbXApKyRtaW5pbnQsMCwKCQkJCQlkYXRlKCJtIiwkZGF0ZXN0YW1wKSxkYXRlKCJkIiwkZGF0ZXN0YW1wKSsxLGRhdGUoIlkiLCRkYXRlc3RhbXApKTsKCQkgICAgCgkJfQkJCQoJICAgIH0KCSAgICAkaW1nLT5TZXRDb2xvcigkdGhpcy0+aG91ci0+aUZyYW1lQ29sb3IpOwoJICAgICRpbWctPlNldExpbmVXZWlnaHQoJHRoaXMtPmhvdXItPmlGcmFtZVdlaWdodCk7CgkgICAgJGltZy0+UmVjdGFuZ2xlKCR4dCwkeXQsJHhiLCR5Yik7CgkgICAgcmV0dXJuICR5YiAtICRpbWctPnRvcF9tYXJnaW47Cgl9CglyZXR1cm4gJGFZQ29vcmQ7CiAgICB9CgoKICAgIC8vIFN0cm9rZSB0aGUgZGF5IHNjYWxlIChpbmNsdWRpbmcgZ3JpZGxpbmVzKQkJCQogICAgZnVuY3Rpb24gU3Ryb2tlRGF5cygkYVlDb29yZCwkZ2V0SGVpZ2h0PWZhbHNlKSB7CgkkaW1nPSR0aGlzLT5pSW1nOwkKCSRkYXl3aWR0aD0kdGhpcy0+R2V0RGF5V2lkdGgoKTsKCSR4dD0kaW1nLT5sZWZ0X21hcmdpbiskdGhpcy0+aUxhYmVsV2lkdGg7CgkkeXQ9JGFZQ29vcmQrJGltZy0+dG9wX21hcmdpbjsJCQoJaWYoICR0aGlzLT5kYXktPmlTaG93TGFiZWxzICkgewoJICAgICRpbWctPlNldEZvbnQoJHRoaXMtPmRheS0+aUZGYW1pbHksJHRoaXMtPmRheS0+aUZTdHlsZSwkdGhpcy0+ZGF5LT5pRlNpemUpOwoJICAgICR5Yj0keXQgKyAkaW1nLT5HZXRGb250SGVpZ2h0KCkgKyAkdGhpcy0+ZGF5LT5pVGl0bGVWZXJ0TWFyZ2luICsgJHRoaXMtPmRheS0+aUZyYW1lV2VpZ2h0OwoJICAgIGlmKCAkZ2V0SGVpZ2h0ICkgewoJCXJldHVybiAkeWIgLSAkaW1nLT50b3BfbWFyZ2luOwoJICAgIH0KCSAgICAkeGI9JGltZy0+d2lkdGgtJGltZy0+cmlnaHRfbWFyZ2luKzE7CgkgICAgJGltZy0+U2V0Q29sb3IoJHRoaXMtPmRheS0+aUJhY2tncm91bmRDb2xvcik7CgkgICAgJGltZy0+RmlsbGVkUmVjdGFuZ2xlKCR4dCwkeXQsJHhiLCR5Yik7CgoJICAgICR4ID0gJHh0OyAgIAoJICAgICRpbWctPlNldFRleHRBbGlnbigiY2VudGVyIik7CgkgICAgJGRheSA9IGRhdGUoJ3cnLCR0aGlzLT5pU3RhcnREYXRlKTsKCSAgICAkZGF0ZXN0YW1wID0gJHRoaXMtPmlTdGFydERhdGU7CgkgICAgCgkgICAgJGRvYmFjayA9ICEoJHRoaXMtPmhvdXItPmlTaG93TGFiZWxzIHx8ICR0aGlzLT5taW51dGUtPmlTaG93TGFiZWxzKTsKCgkgICAgc2V0bG9jYWxlKExDX1RJTUUsJHRoaXMtPmlEYXRlTG9jYWxlLT5pTG9jYWxlKTsKCSAgICAKCSAgICBmb3IoJGk9MDsgJGkgPCAkdGhpcy0+R2V0TnVtYmVyT2ZEYXlzKCk7ICsrJGksICR4Kz0kZGF5d2lkdGgsICRkYXkgKz0gMSwkZGF5ICU9IDcpIHsKCQlpZiggJGRheT09NiB8fCAkZGF5PT0wICkgewoJCSAgICAkaW1nLT5TZXRDb2xvcigkdGhpcy0+ZGF5LT5pV2Vla2VuZEJhY2tncm91bmRDb2xvcik7CgkJICAgIGlmKCAkdGhpcy0+aVVzZVBsb3RXZWVrZW5kQmFja2dyb3VuZCAmJiAkZG9iYWNrKQoJCQkkaW1nLT5GaWxsZWRSZWN0YW5nbGUoJHgsJHl0KyR0aGlzLT5kYXktPmlGcmFtZVdlaWdodCwKCQkJCQkgICAgICAkeCskZGF5d2lkdGgsJGltZy0+aGVpZ2h0LSRpbWctPmJvdHRvbV9tYXJnaW4pOwkKCQkgICAgZWxzZQoJCQkkaW1nLT5GaWxsZWRSZWN0YW5nbGUoJHgsJHl0KyR0aGlzLT5kYXktPmlGcmFtZVdlaWdodCwKCQkJCQkgICAgICAkeCskZGF5d2lkdGgsJHliLSR0aGlzLT5kYXktPmlGcmFtZVdlaWdodCk7CgkJfQoKCQkkbW4gPSBzdHJmdGltZSgnJW0nLCRkYXRlc3RhbXApOwoJCWlmKCAkbW5bMF09PScwJyApIAoJCSAgICAkbW4gPSAkbW5bMV07CgoJCXN3aXRjaCggJHRoaXMtPmRheS0+aVN0eWxlICkgewoJCSAgICBjYXNlIERBWVNUWUxFX0xPTkc6CgkJCS8vICJNb25kYXkiCgkJCSR0eHQgPSBzdHJmdGltZSgnJUEnLCRkYXRlc3RhbXApOwoJCQlicmVhazsKCQkgICAgY2FzZSBEQVlTVFlMRV9TSE9SVDoKCQkJLy8gIk1vbiIKCQkJJHR4dCA9IHN0cmZ0aW1lKCclYScsJGRhdGVzdGFtcCk7CgkJCWJyZWFrOwoJCSAgICBjYXNlIERBWVNUWUxFX1NIT1JUREFZREFURTE6CgkJCS8vICJNb24gMjMvNiIKCQkJJHR4dCA9IHN0cmZ0aW1lKCclYSAlZC8nLiRtbiwkZGF0ZXN0YW1wKTsKCQkJYnJlYWs7CgkJICAgIGNhc2UgREFZU1RZTEVfU0hPUlREQVlEQVRFMjoKCQkJLy8gIk1vbiAyMyBKdW4iCgkJCSR0eHQgPSBzdHJmdGltZSgnJWEgJWQgJWInLCRkYXRlc3RhbXApOwoJCQlicmVhazsKCQkgICAgY2FzZSBEQVlTVFlMRV9TSE9SVERBWURBVEUzOgoJCQkvLyAiTW9uIDIzIEp1biAyMDAzIgoJCQkkdHh0ID0gc3RyZnRpbWUoJyVhICVkICViICVZJywkZGF0ZXN0YW1wKTsKCQkJYnJlYWs7CgkJICAgIGNhc2UgREFZU1RZTEVfTE9OR0RBWURBVEUxOgoJCQkvLyAiTW9uZGF5IDIzIEp1biIKCQkJJHR4dCA9IHN0cmZ0aW1lKCclQSAlZCAlYicsJGRhdGVzdGFtcCk7CgkJCWJyZWFrOwoJCSAgICBjYXNlIERBWVNUWUxFX0xPTkdEQVlEQVRFMjoKCQkJLy8gIk1vbmRheSAyMyBKdW4gMjAwMyIKCQkJJHR4dCA9IHN0cmZ0aW1lKCclQSAlZCAlYiAlWScsJGRhdGVzdGFtcCk7CgkJCWJyZWFrOwoJCSAgICBjYXNlIERBWVNUWUxFX1NIT1JUREFURTE6CgkJCS8vICIyMy82IgoJCQkkdHh0ID0gc3RyZnRpbWUoJyVkLycuJG1uLCRkYXRlc3RhbXApOwoJCQlicmVhazsJCQkKCQkgICAgY2FzZSBEQVlTVFlMRV9TSE9SVERBVEUyOgoJCQkvLyAiMjMgSnVuIgoJCQkkdHh0ID0gc3RyZnRpbWUoJyVkICViJywkZGF0ZXN0YW1wKTsKCQkJYnJlYWs7CQkJCgkJICAgIGNhc2UgREFZU1RZTEVfU0hPUlREQVRFMzoKCQkJLy8gIk1vbiAyMyIKCQkJJHR4dCA9IHN0cmZ0aW1lKCclYSAlZCcsJGRhdGVzdGFtcCk7CgkJCWJyZWFrOwkKCQkgICAgY2FzZSBEQVlTVFlMRV9TSE9SVERBVEU0OgoJCQkvLyAiMjMiCgkJCSR0eHQgPSBzdHJmdGltZSgnJWQnLCRkYXRlc3RhbXApOwoJCQlicmVhazsJCgkJICAgIGNhc2UgREFZU1RZTEVfQ1VTVE9NOgoJCQkvLyBDdXN0b20gZm9ybWF0CgkJCSR0eHQgPSBzdHJmdGltZSgkdGhpcy0+ZGF5LT5pTGFiZWxGb3JtU3RyLCRkYXRlc3RhbXApOwoJCQlicmVhazsJCgkJICAgIGNhc2UgREFZU1RZTEVfT05FTEVUVEVSOgoJCSAgICBkZWZhdWx0OgoJCQkvLyAiTSIKCQkJJHR4dCA9IHN0cmZ0aW1lKCclQScsJGRhdGVzdGFtcCk7CgkJCSR0eHQgPSBzdHJ0b3VwcGVyKCR0eHRbMF0pOwoJCQlicmVhazsKCQl9CgoJCWlmKCAkZGF5PT0wICkgCgkJICAgICRpbWctPlNldENvbG9yKCR0aGlzLT5kYXktPmlTdW5kYXlUZXh0Q29sb3IpOwoJCWVsc2UKCQkgICAgJGltZy0+U2V0Q29sb3IoJHRoaXMtPmRheS0+aVRleHRDb2xvcik7CgkJJGltZy0+U3Ryb2tlVGV4dChyb3VuZCgkeCskZGF5d2lkdGgvMisxKSwKCQkJCSByb3VuZCgkeWItJHRoaXMtPmRheS0+aVRpdGxlVmVydE1hcmdpbiksJHR4dCk7CgkJJGltZy0+U2V0Q29sb3IoJHRoaXMtPmRheS0+Z3JpZC0+aUNvbG9yKTsKCQkkaW1nLT5TZXRMaW5lV2VpZ2h0KCR0aGlzLT5kYXktPmdyaWQtPmlXZWlnaHQpOwoJCSRpbWctPkxpbmUoJHgsJHl0LCR4LCR5Yik7CgkJJHRoaXMtPmRheS0+Z3JpZC0+U3Ryb2tlKCRpbWcsJHgsJHliLCR4LCRpbWctPmhlaWdodC0kaW1nLT5ib3R0b21fbWFyZ2luKTsKCQkkZGF0ZXN0YW1wID0gbWt0aW1lKDAsMCwwLGRhdGUoIm0iLCRkYXRlc3RhbXApLGRhdGUoImQiLCRkYXRlc3RhbXApKzEsZGF0ZSgiWSIsJGRhdGVzdGFtcCkpOwoJCS8vJGRhdGVzdGFtcCArPSBTRUNQRVJEQVk7CgkJCgkgICAgfQkJCQoJICAgICRpbWctPlNldENvbG9yKCR0aGlzLT5kYXktPmlGcmFtZUNvbG9yKTsKCSAgICAkaW1nLT5TZXRMaW5lV2VpZ2h0KCR0aGlzLT5kYXktPmlGcmFtZVdlaWdodCk7CgkgICAgJGltZy0+UmVjdGFuZ2xlKCR4dCwkeXQsJHhiLCR5Yik7CgkgICAgcmV0dXJuICR5YiAtICRpbWctPnRvcF9tYXJnaW47Cgl9CglyZXR1cm4gJGFZQ29vcmQ7CiAgICB9CgkKICAgIC8vIFN0cm9rZSB3ZWVrIGhlYWRlciBhbmQgZ3JpZAogICAgZnVuY3Rpb24gU3Ryb2tlV2Vla3MoJGFZQ29vcmQsJGdldEhlaWdodD1mYWxzZSkgewoJaWYoICR0aGlzLT53ZWVrLT5pU2hvd0xhYmVscyApIHsKCSAgICAkaW1nPSR0aGlzLT5pSW1nOwkKCSAgICAkeXQ9JGFZQ29vcmQrJGltZy0+dG9wX21hcmdpbjsJCQoJICAgICRpbWctPlNldEZvbnQoJHRoaXMtPndlZWstPmlGRmFtaWx5LCR0aGlzLT53ZWVrLT5pRlN0eWxlLCR0aGlzLT53ZWVrLT5pRlNpemUpOwoJICAgICR5Yj0keXQgKyAkaW1nLT5HZXRGb250SGVpZ2h0KCkgKyAkdGhpcy0+d2Vlay0+aVRpdGxlVmVydE1hcmdpbiArICR0aGlzLT53ZWVrLT5pRnJhbWVXZWlnaHQ7CgoJICAgIGlmKCAkZ2V0SGVpZ2h0ICkgewoJCXJldHVybiAkeWIgLSAkaW1nLT50b3BfbWFyZ2luOyAgCgkgICAgfQoKCSAgICAkeHQ9JGltZy0+bGVmdF9tYXJnaW4rJHRoaXMtPmlMYWJlbFdpZHRoOwoJICAgICR3ZWVrd2lkdGg9JHRoaXMtPkdldERheVdpZHRoKCkqNzsKCSAgICAkd2RheXM9JHRoaXMtPmlEYXRlTG9jYWxlLT5HZXREYXlBYmIoKTsJCgkgICAgJHhiPSRpbWctPndpZHRoLSRpbWctPnJpZ2h0X21hcmdpbisxOwoJICAgICR3ZWVrID0gJHRoaXMtPmlTdGFydERhdGU7CgkgICAgJHdlZWtuYnI9JHRoaXMtPkdldFdlZWtOYnIoJHdlZWspOwoJICAgICRpbWctPlNldENvbG9yKCR0aGlzLT53ZWVrLT5pQmFja2dyb3VuZENvbG9yKTsKCSAgICAkaW1nLT5GaWxsZWRSZWN0YW5nbGUoJHh0LCR5dCwkeGIsJHliKTsKCSAgICAkaW1nLT5TZXRDb2xvcigkdGhpcy0+d2Vlay0+Z3JpZC0+aUNvbG9yKTsKCSAgICAkeCA9ICR4dDsKCSAgICBpZiggJHRoaXMtPndlZWstPmlTdHlsZT09V0VFS1NUWUxFX1dOQlIgKSB7CgkJJGltZy0+U2V0VGV4dEFsaWduKCJjZW50ZXIiKTsKCQkkdHh0T2Zmc2V0ID0gJHdlZWt3aWR0aC8yKzE7CgkgICAgfQoJICAgIGVsc2VpZiggJHRoaXMtPndlZWstPmlTdHlsZT09V0VFS1NUWUxFX0ZJUlNUREFZICB8fCAKCQkgICAgJHRoaXMtPndlZWstPmlTdHlsZT09V0VFS1NUWUxFX0ZJUlNUREFZMiB8fAoJCSAgICAkdGhpcy0+d2Vlay0+aVN0eWxlPT1XRUVLU1RZTEVfRklSU1REQVlXTkJSIHx8CgkJICAgICR0aGlzLT53ZWVrLT5pU3R5bGU9PVdFRUtTVFlMRV9GSVJTVERBWTJXTkJSICkgewoJCSRpbWctPlNldFRleHRBbGlnbigibGVmdCIpOwoJCSR0eHRPZmZzZXQgPSAzOwoJICAgIH0KCSAgICBlbHNlCgkJSnBHcmFwaEVycm9yOjpSYWlzZUwoNjAyMSk7Ci8vKCJVbmtub3duIGZvcm1hdHRpbmcgc3R5bGUgZm9yIHdlZWsuIik7CgkJCQkKCSAgICBmb3IoJGk9MDsgJGk8JHRoaXMtPkdldE51bWJlck9mRGF5cygpLzc7ICsrJGksICR4Kz0kd2Vla3dpZHRoKSB7CgkJJGltZy0+UHVzaENvbG9yKCR0aGlzLT53ZWVrLT5pVGV4dENvbG9yKTsKCQkJCQoJCWlmKCAkdGhpcy0+d2Vlay0+aVN0eWxlPT1XRUVLU1RZTEVfV05CUiApCgkJICAgICR0eHQgPSBzcHJpbnRmKCR0aGlzLT53ZWVrLT5pTGFiZWxGb3JtU3RyLCR3ZWVrbmJyKTsKCQllbHNlaWYoICR0aGlzLT53ZWVrLT5pU3R5bGU9PVdFRUtTVFlMRV9GSVJTVERBWSB8fCAKCQkJJHRoaXMtPndlZWstPmlTdHlsZT09V0VFS1NUWUxFX0ZJUlNUREFZV05CUiApIAoJCSAgICAkdHh0ID0gZGF0ZSgiai9uIiwkd2Vlayk7CgkJZWxzZWlmKCAkdGhpcy0+d2Vlay0+aVN0eWxlPT1XRUVLU1RZTEVfRklSU1REQVkyIHx8IAoJCQkkdGhpcy0+d2Vlay0+aVN0eWxlPT1XRUVLU1RZTEVfRklSU1REQVkyV05CUiApIHsKCQkgICAgJG1vbnRobmJyID0gZGF0ZSgibiIsJHdlZWspLTE7CgkJICAgICRzaG9ydG1vbnRoID0gJHRoaXMtPmlEYXRlTG9jYWxlLT5HZXRTaG9ydE1vbnRoTmFtZSgkbW9udGhuYnIpOwoJCSAgICAkdHh0ID0gRGF0ZSgiaiIsJHdlZWspLiIgIi4kc2hvcnRtb250aDsKCQl9CgoJCWlmKCAkdGhpcy0+d2Vlay0+aVN0eWxlPT1XRUVLU1RZTEVfRklSU1REQVlXTkJSIHx8CgkJICAgICR0aGlzLT53ZWVrLT5pU3R5bGU9PVdFRUtTVFlMRV9GSVJTVERBWTJXTkJSICkgewoJCSAgICAkdyA9IHNwcmludGYoJHRoaXMtPndlZWstPmlMYWJlbEZvcm1TdHIsJHdlZWtuYnIpOwoJCSAgICAkdHh0IC49ICcgJy4kdzsKCQl9CgkJCQkKCQkkaW1nLT5TdHJva2VUZXh0KHJvdW5kKCR4KyR0eHRPZmZzZXQpLAoJCQkJIHJvdW5kKCR5Yi0kdGhpcy0+d2Vlay0+aVRpdGxlVmVydE1hcmdpbiksJHR4dCk7CgkJCQkKCQkkd2VlayA9IHN0cnRvdGltZSgnKzcgZGF5Jywkd2Vlayk7IAoJCSR3ZWVrbmJyID0gJHRoaXMtPkdldFdlZWtOYnIoJHdlZWspOwoJCSRpbWctPlBvcENvbG9yKCk7CQoJCSRpbWctPlNldExpbmVXZWlnaHQoJHRoaXMtPndlZWstPmdyaWQtPmlXZWlnaHQpOwoJCSRpbWctPkxpbmUoJHgsJHl0LCR4LCR5Yik7CgkJJHRoaXMtPndlZWstPmdyaWQtPlN0cm9rZSgkaW1nLCR4LCR5YiwkeCwkaW1nLT5oZWlnaHQtJGltZy0+Ym90dG9tX21hcmdpbik7CgkgICAgfQkJCQoJICAgICRpbWctPlNldENvbG9yKCR0aGlzLT53ZWVrLT5pRnJhbWVDb2xvcik7CgkgICAgJGltZy0+U2V0TGluZVdlaWdodCgkdGhpcy0+d2Vlay0+aUZyYW1lV2VpZ2h0KTsKCSAgICAkaW1nLT5SZWN0YW5nbGUoJHh0LCR5dCwkeGIsJHliKTsKCSAgICByZXR1cm4gJHliLSRpbWctPnRvcF9tYXJnaW47Cgl9CglyZXR1cm4gJGFZQ29vcmQ7CiAgICB9CQoJCiAgICAvLyBGb3JtYXQgdGhlIG1vbnQgc2NhbGUgaGVhZGVyIHN0cmluZwogICAgZnVuY3Rpb24gR2V0TW9udGhMYWJlbCgkYU1vbnRoTmJyLCR5ZWFyKSB7Cgkkc24gPSAkdGhpcy0+aURhdGVMb2NhbGUtPkdldFNob3J0TW9udGhOYW1lKCRhTW9udGhOYnIpOwoJJGxuID0gJHRoaXMtPmlEYXRlTG9jYWxlLT5HZXRMb25nTW9udGhOYW1lKCRhTW9udGhOYnIpOwoJc3dpdGNoKCR0aGlzLT5tb250aC0+aVN0eWxlKSB7CgkgICAgY2FzZSBNT05USFNUWUxFX1NIT1JUTkFNRToKCQkkbT0kc247CgkJYnJlYWs7CgkgICAgY2FzZSBNT05USFNUWUxFX0xPTkdOQU1FOgoJCSRtPSRsbjsKCQlicmVhazsKCSAgICBjYXNlIE1PTlRIU1RZTEVfU0hPUlROQU1FWUVBUjI6CgkJJG09JHNuLiIgJyIuc3Vic3RyKCIiLiR5ZWFyLDIpOwoJCWJyZWFrOwoJICAgIGNhc2UgTU9OVEhTVFlMRV9TSE9SVE5BTUVZRUFSNDoKCQkkbT0kc24uIiAiLiR5ZWFyOwoJCWJyZWFrOwoJICAgIGNhc2UgTU9OVEhTVFlMRV9MT05HTkFNRVlFQVIyOgoJCSRtPSRsbi4iICciLnN1YnN0cigiIi4keWVhciwyKTsKCQlicmVhazsKCSAgICBjYXNlIE1PTlRIU1RZTEVfTE9OR05BTUVZRUFSNDoKCQkkbT0kbG4uIiAiLiR5ZWFyOwoJCWJyZWFrOwoJICAgIGNhc2UgTU9OVEhTVFlMRV9GSVJTVExFVFRFUjoKCQkkbT0kc25bMF07CgkJYnJlYWs7Cgl9CglyZXR1cm4gJG07CiAgICB9CgkKICAgIC8vIFN0cm9rZSBtb250aCBzY2FsZSBhbmQgZ3JpZGxpbmVzCiAgICBmdW5jdGlvbiBTdHJva2VNb250aHMoJGFZQ29vcmQsJGdldEhlaWdodD1mYWxzZSkgewoJaWYoICR0aGlzLT5tb250aC0+aVNob3dMYWJlbHMgKSB7CgkgICAgJGltZz0kdGhpcy0+aUltZzsJCQoJICAgICRpbWctPlNldEZvbnQoJHRoaXMtPm1vbnRoLT5pRkZhbWlseSwkdGhpcy0+bW9udGgtPmlGU3R5bGUsJHRoaXMtPm1vbnRoLT5pRlNpemUpOwoJICAgICR5dD0kYVlDb29yZCskaW1nLT50b3BfbWFyZ2luOwkJCgkgICAgJHliPSR5dCArICRpbWctPkdldEZvbnRIZWlnaHQoKSArICR0aGlzLT5tb250aC0+aVRpdGxlVmVydE1hcmdpbiArICR0aGlzLT5tb250aC0+aUZyYW1lV2VpZ2h0OwoJICAgIGlmKCAkZ2V0SGVpZ2h0ICkgewoJCXJldHVybiAkeWIgLSAkaW1nLT50b3BfbWFyZ2luOyAgCgkgICAgfQoJICAgICRtb250aG5iciA9ICR0aGlzLT5HZXRNb250aE5icigkdGhpcy0+aVN0YXJ0RGF0ZSktMTsgCgkgICAgJHh0PSRpbWctPmxlZnRfbWFyZ2luKyR0aGlzLT5pTGFiZWxXaWR0aDsKCSAgICAkeGI9JGltZy0+d2lkdGgtJGltZy0+cmlnaHRfbWFyZ2luKzE7CgkJCQoJICAgICRpbWctPlNldENvbG9yKCR0aGlzLT5tb250aC0+aUJhY2tncm91bmRDb2xvcik7CgkgICAgJGltZy0+RmlsbGVkUmVjdGFuZ2xlKCR4dCwkeXQsJHhiLCR5Yik7CgoJICAgICRpbWctPlNldExpbmVXZWlnaHQoJHRoaXMtPm1vbnRoLT5ncmlkLT5pV2VpZ2h0KTsKCSAgICAkaW1nLT5TZXRDb2xvcigkdGhpcy0+bW9udGgtPmlUZXh0Q29sb3IpOwoJICAgICR5ZWFyID0gMCtzdHJmdGltZSgiJVkiLCR0aGlzLT5pU3RhcnREYXRlKTsKCSAgICAkaW1nLT5TZXRUZXh0QWxpZ24oImNlbnRlciIpOwoJICAgIGlmKCAkdGhpcy0+R2V0TW9udGhOYnIoJHRoaXMtPmlTdGFydERhdGUpID09ICR0aGlzLT5HZXRNb250aE5icigkdGhpcy0+aUVuZERhdGUpICAKCQkmJiAkdGhpcy0+R2V0WWVhcigkdGhpcy0+aVN0YXJ0RGF0ZSk9PSR0aGlzLT5HZXRZZWFyKCR0aGlzLT5pRW5kRGF0ZSkgKSB7CgkgICAgCSRtb250aHdpZHRoPSR0aGlzLT5HZXREYXlXaWR0aCgpKigkdGhpcy0+R2V0TW9udGhEYXlOYnIoJHRoaXMtPmlFbmREYXRlKSAtICR0aGlzLT5HZXRNb250aERheU5icigkdGhpcy0+aVN0YXJ0RGF0ZSkgKyAxKTsKCSAgICB9IAoJICAgIGVsc2UgewoJICAgIAkkbW9udGh3aWR0aD0kdGhpcy0+R2V0RGF5V2lkdGgoKSooJHRoaXMtPkdldE51bURheXNJbk1vbnRoKCRtb250aG5iciwkeWVhciktJHRoaXMtPkdldE1vbnRoRGF5TmJyKCR0aGlzLT5pU3RhcnREYXRlKSsxKTsKCSAgICB9CgkgICAgLy8gSXMgaXQgZW5vdWdoIHNwYWNlIHRvIHN0cm9rZSB0aGUgZmlyc3QgbW9udGg/CgkgICAgJG1vbnRoTmFtZSA9ICR0aGlzLT5HZXRNb250aExhYmVsKCRtb250aG5iciwkeWVhcik7CgkgICAgaWYoICRtb250aHdpZHRoID49IDEuMiokaW1nLT5HZXRUZXh0V2lkdGgoJG1vbnRoTmFtZSkgKSB7CgkJJGltZy0+U2V0Q29sb3IoJHRoaXMtPm1vbnRoLT5pVGV4dENvbG9yKTsJCQkJCgkJJGltZy0+U3Ryb2tlVGV4dChyb3VuZCgkeHQrJG1vbnRod2lkdGgvMisxKSwKCQkJCSByb3VuZCgkeWItJHRoaXMtPm1vbnRoLT5pVGl0bGVWZXJ0TWFyZ2luKSwKCQkJCSAkbW9udGhOYW1lKTsKCSAgICB9CgkgICAgJHggPSAkeHQgKyAkbW9udGh3aWR0aDsKCSAgICB3aGlsZSggJHggPCAkeGIgKSB7CgkJJGltZy0+U2V0Q29sb3IoJHRoaXMtPm1vbnRoLT5ncmlkLT5pQ29sb3IpOwkJCQkKCQkkaW1nLT5MaW5lKCR4LCR5dCwkeCwkeWIpOwoJCSR0aGlzLT5tb250aC0+Z3JpZC0+U3Ryb2tlKCRpbWcsJHgsJHliLCR4LCRpbWctPmhlaWdodC0kaW1nLT5ib3R0b21fbWFyZ2luKTsKCQkkbW9udGhuYnIrKzsKCQlpZiggJG1vbnRobmJyPT0xMiApIHsKCQkgICAgJG1vbnRobmJyPTA7CgkJICAgICR5ZWFyKys7CgkJfQoJCSRtb250aE5hbWUgPSAkdGhpcy0+R2V0TW9udGhMYWJlbCgkbW9udGhuYnIsJHllYXIpOwoJCSRtb250aHdpZHRoPSR0aGlzLT5HZXREYXlXaWR0aCgpKiR0aGlzLT5HZXROdW1EYXlzSW5Nb250aCgkbW9udGhuYnIsJHllYXIpOwkJCQkKCQlpZiggJHggKyAkbW9udGh3aWR0aCA8ICR4YiApCgkJICAgICR3ID0gJG1vbnRod2lkdGg7CgkJZWxzZQoJCSAgICAkdyA9ICR4Yi0keDsKCQlpZiggJHcgPj0gMS4yKiRpbWctPkdldFRleHRXaWR0aCgkbW9udGhOYW1lKSApIHsKCQkgICAgJGltZy0+U2V0Q29sb3IoJHRoaXMtPm1vbnRoLT5pVGV4dENvbG9yKTsJCQkJCgkJICAgICRpbWctPlN0cm9rZVRleHQocm91bmQoJHgrJHcvMisxKSwKCQkJCSAgICAgcm91bmQoJHliLSR0aGlzLT5tb250aC0+aVRpdGxlVmVydE1hcmdpbiksJG1vbnRoTmFtZSk7CgkJfQoJCSR4ICs9ICRtb250aHdpZHRoOwoJICAgIH0JCgkgICAgJGltZy0+U2V0Q29sb3IoJHRoaXMtPm1vbnRoLT5pRnJhbWVDb2xvcik7CgkgICAgJGltZy0+U2V0TGluZVdlaWdodCgkdGhpcy0+bW9udGgtPmlGcmFtZVdlaWdodCk7CgkgICAgJGltZy0+UmVjdGFuZ2xlKCR4dCwkeXQsJHhiLCR5Yik7CQkJCgkgICAgcmV0dXJuICR5Yi0kaW1nLT50b3BfbWFyZ2luOwoJfQoJcmV0dXJuICRhWUNvb3JkOwogICAgfQoKICAgIC8vIFN0cm9rZSB5ZWFyIHNjYWxlIGFuZCBncmlkbGluZXMKICAgIGZ1bmN0aW9uIFN0cm9rZVllYXJzKCRhWUNvb3JkLCRnZXRIZWlnaHQ9ZmFsc2UpIHsKCWlmKCAkdGhpcy0+eWVhci0+aVNob3dMYWJlbHMgKSB7CgkgICAgJGltZz0kdGhpcy0+aUltZzsJCgkgICAgJHl0PSRhWUNvb3JkKyRpbWctPnRvcF9tYXJnaW47CQkKCSAgICAkaW1nLT5TZXRGb250KCR0aGlzLT55ZWFyLT5pRkZhbWlseSwkdGhpcy0+eWVhci0+aUZTdHlsZSwkdGhpcy0+eWVhci0+aUZTaXplKTsKCSAgICAkeWI9JHl0ICsgJGltZy0+R2V0Rm9udEhlaWdodCgpICsgJHRoaXMtPnllYXItPmlUaXRsZVZlcnRNYXJnaW4gKyAkdGhpcy0+eWVhci0+aUZyYW1lV2VpZ2h0OwoKCSAgICBpZiggJGdldEhlaWdodCApIHsKCQlyZXR1cm4gJHliIC0gJGltZy0+dG9wX21hcmdpbjsgIAoJICAgIH0KCgkgICAgJHhiPSRpbWctPndpZHRoLSRpbWctPnJpZ2h0X21hcmdpbisxOwoJICAgICR4dD0kaW1nLT5sZWZ0X21hcmdpbiskdGhpcy0+aUxhYmVsV2lkdGg7CgkgICAgJHllYXIgPSAkdGhpcy0+R2V0WWVhcigkdGhpcy0+aVN0YXJ0RGF0ZSk7IAkJCQoJICAgICRpbWctPlNldENvbG9yKCR0aGlzLT55ZWFyLT5pQmFja2dyb3VuZENvbG9yKTsKCSAgICAkaW1nLT5GaWxsZWRSZWN0YW5nbGUoJHh0LCR5dCwkeGIsJHliKTsKCSAgICAkaW1nLT5TZXRMaW5lV2VpZ2h0KCR0aGlzLT55ZWFyLT5ncmlkLT5pV2VpZ2h0KTsKCSAgICAkaW1nLT5TZXRUZXh0QWxpZ24oImNlbnRlciIpOwoJICAgIGlmKCAkeWVhciA9PSAkdGhpcy0+R2V0WWVhcigkdGhpcy0+aUVuZERhdGUpICkKCQkkeWVhcndpZHRoPSR0aGlzLT5HZXREYXlXaWR0aCgpKigkdGhpcy0+R2V0WWVhckRheU5icigkdGhpcy0+aUVuZERhdGUpLSR0aGlzLT5HZXRZZWFyRGF5TmJyKCR0aGlzLT5pU3RhcnREYXRlKSsxKTsKCSAgICBlbHNlCgkJJHllYXJ3aWR0aD0kdGhpcy0+R2V0RGF5V2lkdGgoKSooJHRoaXMtPkdldE51bURheXNJblllYXIoJHllYXIpLSR0aGlzLT5HZXRZZWFyRGF5TmJyKCR0aGlzLT5pU3RhcnREYXRlKSsxKTsKCQkJCgkgICAgLy8gVGhlIHNwYWNlIGZvciBhIHllYXIgbXVzdCBiZSBhdCBsZWFzdCAyMCUgYmlnZ2VyIHRoYW4gdGhlIGFjdHVhbCB0ZXh0IAoJICAgIC8vIHNvIHdlIGFsbG93IDEwJSBtYXJnaW4gb24gZWFjaCBzaWRlCgkgICAgaWYoICR5ZWFyd2lkdGggPj0gMS4yMCokaW1nLT5HZXRUZXh0V2lkdGgoIiIuJHllYXIpICkgewoJCSRpbWctPlNldENvbG9yKCR0aGlzLT55ZWFyLT5pVGV4dENvbG9yKTsJCQkJCgkJJGltZy0+U3Ryb2tlVGV4dChyb3VuZCgkeHQrJHllYXJ3aWR0aC8yKzEpLAoJCQkJIHJvdW5kKCR5Yi0kdGhpcy0+eWVhci0+aVRpdGxlVmVydE1hcmdpbiksCgkJCQkgJHllYXIpOwoJICAgIH0KCSAgICAkeCA9ICR4dCArICR5ZWFyd2lkdGg7CgkgICAgd2hpbGUoICR4IDwgJHhiICkgewoJCSRpbWctPlNldENvbG9yKCR0aGlzLT55ZWFyLT5ncmlkLT5pQ29sb3IpOwkJCQkKCQkkaW1nLT5MaW5lKCR4LCR5dCwkeCwkeWIpOwoJCSR0aGlzLT55ZWFyLT5ncmlkLT5TdHJva2UoJGltZywkeCwkeWIsJHgsJGltZy0+aGVpZ2h0LSRpbWctPmJvdHRvbV9tYXJnaW4pOwoJCSR5ZWFyICs9IDE7CgkJJHllYXJ3aWR0aD0kdGhpcy0+R2V0RGF5V2lkdGgoKSokdGhpcy0+R2V0TnVtRGF5c0luWWVhcigkeWVhcik7CQkJCQoJCWlmKCAkeCArICR5ZWFyd2lkdGggPCAkeGIgKQoJCSAgICAkdyA9ICR5ZWFyd2lkdGg7CgkJZWxzZQoJCSAgICAkdyA9ICR4Yi0keDsKCQlpZiggJHcgPj0gMS4yKiRpbWctPkdldFRleHRXaWR0aCgiIi4keWVhcikgKSB7CgkJICAgICRpbWctPlNldENvbG9yKCR0aGlzLT55ZWFyLT5pVGV4dENvbG9yKTsKCQkgICAgJGltZy0+U3Ryb2tlVGV4dChyb3VuZCgkeCskdy8yKzEpLAoJCQkJICAgICByb3VuZCgkeWItJHRoaXMtPnllYXItPmlUaXRsZVZlcnRNYXJnaW4pLAoJCQkJICAgICAkeWVhcik7CgkJfQoJCSR4ICs9ICR5ZWFyd2lkdGg7CgkgICAgfQoJICAgICRpbWctPlNldENvbG9yKCR0aGlzLT55ZWFyLT5pRnJhbWVDb2xvcik7CgkgICAgJGltZy0+U2V0TGluZVdlaWdodCgkdGhpcy0+eWVhci0+aUZyYW1lV2VpZ2h0KTsKCSAgICAkaW1nLT5SZWN0YW5nbGUoJHh0LCR5dCwkeGIsJHliKTsJCQkKCSAgICByZXR1cm4gJHliLSRpbWctPnRvcF9tYXJnaW47Cgl9CglyZXR1cm4gJGFZQ29vcmQ7CiAgICB9CgkKICAgIC8vIFN0cm9rZSB0YWJsZSB0aXRsZSAodXBwZXIgbGVmdCBjb3JuZXIpCiAgICBmdW5jdGlvbiBTdHJva2VUYWJsZUhlYWRlcnMoJGFZQm90dG9tKSB7CgkkaW1nPSR0aGlzLT5pSW1nOwoJJHh0PSRpbWctPmxlZnRfbWFyZ2luOwoJJHl0PSRpbWctPnRvcF9tYXJnaW47CgkkeGI9JHh0KyR0aGlzLT5pTGFiZWxXaWR0aDsKCSR5Yj0kYVlCb3R0b20rJGltZy0+dG9wX21hcmdpbjsKCglpZiggJHRoaXMtPnRhYmxlVGl0bGUtPmlTaG93ICkgewoJICAgICRpbWctPlNldENvbG9yKCR0aGlzLT5pVGFibGVIZWFkZXJCYWNrZ3JvdW5kQ29sb3IpOwoJICAgICRpbWctPkZpbGxlZFJlY3RhbmdsZSgkeHQsJHl0LCR4YiwkeWIpOwoJICAgICR0aGlzLT50YWJsZVRpdGxlLT5BbGlnbigiY2VudGVyIiwidG9wIik7CgkgICAgJHRoaXMtPnRhYmxlVGl0bGUtPlN0cm9rZSgkaW1nLCR4dCsoJHhiLSR4dCkvMisxLCR5dCsyKTsJCQoJICAgICRpbWctPlNldENvbG9yKCR0aGlzLT5pVGFibGVIZWFkZXJGcmFtZUNvbG9yKTsKCSAgICAkaW1nLT5TZXRMaW5lV2VpZ2h0KCR0aGlzLT5pVGFibGVIZWFkZXJGcmFtZVdlaWdodCk7CgkgICAgJGltZy0+UmVjdGFuZ2xlKCR4dCwkeXQsJHhiLCR5Yik7Cgl9CgoJJHRoaXMtPmFjdGluZm8tPlN0cm9rZSgkaW1nLCR4dCwkeXQsJHhiLCR5YiwkdGhpcy0+dGFibGVUaXRsZS0+aVNob3cpOwoKCgkvLyBEcmF3IHRoZSBob3Jpem9udGFsIGRpdmlkaW5nIGxpbmUJCQoJJHRoaXMtPmRpdmlkZXJoLT5TdHJva2UoJGltZywkeHQsJHliLCRpbWctPndpZHRoLSRpbWctPnJpZ2h0X21hcmdpbiwkeWIpOwkJCgkJCgkvLyBEcmF3IHRoZSB2ZXJ0aWNhbCBkaXZpZGluZyBsaW5lCgkvLyBXZSBkbyB0aGUgd2lkdGggIm1hbnVhbGx5IiBzaW5jZSB3ZSB3YW50IHRoZSBsaW5lIG9ubHkgdG8gZ3JvdwoJLy8gdG8gdGhlIGxlZnQKCSRmYW5jeSA9ICR0aGlzLT5kaXZpZGVyLT5pU3R5bGUgPT0gJ2ZhbmN5JyA7CglpZiggJGZhbmN5ICkgewoJICAgICR0aGlzLT5kaXZpZGVyLT5pU3R5bGUgPSAnc29saWQnOwoJfQoKCSR0bXAgPSAkdGhpcy0+ZGl2aWRlci0+aVdlaWdodDsJCgkkdGhpcy0+ZGl2aWRlci0+aVdlaWdodD0xOwoJJHkgPSAkaW1nLT5oZWlnaHQtJGltZy0+Ym90dG9tX21hcmdpbjsKCWZvcigkaT0wOyAkaSA8ICR0bXA7ICsrJGkgKSB7CgkgICAgJHRoaXMtPmRpdmlkZXItPlN0cm9rZSgkaW1nLCR4Yi0kaSwkeXQsJHhiLSRpLCR5KTsKCX0KCgkvLyBTaG91bGQgd2UgZHJhdyAiZmFuY3kiIGRpdmlkZXIKCWlmKCAkZmFuY3kgKSB7CgkgICAgJGltZy0+U2V0TGluZVdlaWdodCgxKTsKCSAgICAkaW1nLT5TZXRDb2xvcigkdGhpcy0+aVRhYmxlSGVhZGVyRnJhbWVDb2xvcik7CgkgICAgJGltZy0+TGluZSgkeGIsJHl0LCR4YiwkeSk7CgkgICAgJGltZy0+TGluZSgkeGItJHRtcCsxLCR5dCwkeGItJHRtcCsxLCR5KTsKCSAgICAkaW1nLT5TZXRDb2xvcignd2hpdGUnKTsKCSAgICAkaW1nLT5MaW5lKCR4Yi0kdG1wKzIsJHl0LCR4Yi0kdG1wKzIsJHkpOwoJfQogICAgfQoKICAgIC8vIE1haW4gZW50cnkgcG9pbnQgdG8gc3Ryb2tlIHNjYWxlCiAgICBmdW5jdGlvbiBTdHJva2UoKSB7CglpZiggISR0aGlzLT5Jc1JhbmdlU2V0KCkgKQoJICAgIEpwR3JhcGhFcnJvcjo6UmFpc2VMKDYwMjIpOwovLygiR2FudHQgc2NhbGUgaGFzIG5vdCBiZWVuIHNwZWNpZmllZC4iKTsKCSRpbWc9JHRoaXMtPmlJbWc7CgoJLy8gSWYgbWludXRlcyBhcmUgZGlzcGxheWVkIHRoZW4gaG91ciBpbnRlcnZhbCBtdXN0IGJlIDEKCWlmKCAkdGhpcy0+SXNEaXNwbGF5TWludXRlKCkgJiYgJHRoaXMtPmhvdXItPkdldEludGVydmFsbCgpID4gMSApIHsKCSAgICBKcEdyYXBoRXJyb3I6OlJhaXNlTCg2MDIzKTsKLy8oJ0lmIHlvdSBkaXNwbGF5IGJvdGggaG91ciBhbmQgbWludXRlcyB0aGUgaG91ciBpbnRlcnZhbGwgbXVzdCBiZSAxIChPdGhlcndpc2UgaXQgZG9lc25cJyBtYWtlIHNlbnNlIHRvIGRpc3BsYXkgbWludXRlcykuJyk7Cgl9CgkJCgkvLyBTdHJva2UgYWxsIGhlYWRlcnMuIEFzIGFyZ3VtZW50IHdlIHN1cHBseSB0aGUgb2Zmc2V0IGZyb20gdGhlCgkvLyB0b3Agd2hpY2ggZGVwZW5kcyBvbiBhbnkgcHJldmlvdXMgaGVhZGVycwoJCgkvLyBGaXJzdCBmaW5kIG91dCB0aGUgaGVpZ2h0IG9mIGVhY2ggaGVhZGVyCgkkb2ZmeT0kdGhpcy0+U3Ryb2tlWWVhcnMoMCx0cnVlKTsKCSRvZmZtPSR0aGlzLT5TdHJva2VNb250aHMoJG9mZnksdHJ1ZSk7Cgkkb2Zmdz0kdGhpcy0+U3Ryb2tlV2Vla3MoJG9mZm0sdHJ1ZSk7Cgkkb2ZmZD0kdGhpcy0+U3Ryb2tlRGF5cygkb2Zmdyx0cnVlKTsKCSRvZmZoPSR0aGlzLT5TdHJva2VIb3Vycygkb2ZmZCx0cnVlKTsKCSRvZmZtaW49JHRoaXMtPlN0cm9rZU1pbnV0ZXMoJG9mZmgsdHJ1ZSk7CgoKCS8vIC4uLiB0aGVuIHdlIGNhbiBzdHJva2UgdGhlbSBpbiB0aGUgImJhY2t3YXJkcyBvcmRlciB0byBlbnN1cmUgdGhhdAoJLy8gdGhlIGxhcmdlciBzY2FsZSBncmlkbGluZXMgaXMgc3Ryb2tlZCBvdmVyIHRoZSBzbWFsbGVyIHNjYWxlIGdyaWRsaW5lCgkkdGhpcy0+U3Ryb2tlTWludXRlcygkb2ZmaCk7CgkkdGhpcy0+U3Ryb2tlSG91cnMoJG9mZmQpOwoJJHRoaXMtPlN0cm9rZURheXMoJG9mZncpOwoJJHRoaXMtPlN0cm9rZVdlZWtzKCRvZmZtKTsJCQoJJHRoaXMtPlN0cm9rZU1vbnRocygkb2ZmeSk7CQkKCSR0aGlzLT5TdHJva2VZZWFycygwKTsKCgkvLyBOb3cgd2hlbiB3ZSBub3cgdGhlIG9hdmVyYWxsIHNpemUgb2YgdGhlIHNjYWxlIGhlYWRlcnMKCS8vIHdlIGNhbiBzdHJva2UgdGhlIG92ZXJhbGwgdGFibGUgaGVhZGVycwoJJHRoaXMtPlN0cm9rZVRhYmxlSGVhZGVycygkb2ZmbWluKTsKCQkKCS8vIE5vdyB3ZSBjYW4gY2FsY3VsYXRlIHRoZSBjb3JyZWN0IHNjYWxpbmcgZmFjdG9yIGZvciBlYWNoIHZlcnRpY2FsIHBvc2l0aW9uCgkkdGhpcy0+aUF2YWlsYWJsZUhlaWdodCA9ICRpbWctPmhlaWdodCAtICRpbWctPnRvcF9tYXJnaW4gLSAkaW1nLT5ib3R0b21fbWFyZ2luIC0gJG9mZmQ7CQkKCSR0aGlzLT5pVmVydEhlYWRlclNpemUgPSAkb2ZmbWluOwoJaWYoICR0aGlzLT5pVmVydFNwYWNpbmcgPT0gLTEgKQoJICAgICR0aGlzLT5pVmVydFNwYWNpbmcgPSAkdGhpcy0+aUF2YWlsYWJsZUhlaWdodCAvICR0aGlzLT5pVmVydExpbmVzOwogICAgfQkKfQoKCi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci8vIENMQVNTIEdhbnR0Q29uc3RyYWludAovLyBKdXN0IGEgc3RydWN0dXJlIHRvIHN0b3JlIGFsbCB0aGUgdmFsdWVzIGZvciBhIGNvbnN0cmFpbnQKLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KY2xhc3MgR2FudHRDb25zdHJhaW50IHsKICAgIHZhciAkaUNvbnN0cmFpblR5cGU7CiAgICB2YXIgJGlDb25zdHJhaW5Sb3c7CiAgICB2YXIgJGlDb25zdHJhaW5Db2xvcjsKICAgIHZhciAkaUNvbnN0cmFpbkFycm93U2l6ZTsKICAgIHZhciAkaUNvbnN0cmFpbkFycm93VHlwZTsKCi8vLS0tLS0tLS0tLS0tLS0tCi8vIENPTlNUUlVDVE9SCiAgICBmdW5jdGlvbiBHYW50dENvbnN0cmFpbnQoJGFSb3csJGFUeXBlLCRhQ29sb3IsJGFBcnJvd1NpemUsJGFBcnJvd1R5cGUpewoJJHRoaXMtPmlDb25zdHJhaW5UeXBlID0gJGFUeXBlOwoJJHRoaXMtPmlDb25zdHJhaW5Sb3cgPSAkYVJvdzsKCSR0aGlzLT5pQ29uc3RyYWluQ29sb3I9JGFDb2xvcjsKCSR0aGlzLT5pQ29uc3RyYWluQXJyb3dTaXplPSRhQXJyb3dTaXplOwoJJHRoaXMtPmlDb25zdHJhaW5BcnJvd1R5cGU9JGFBcnJvd1R5cGU7CiAgICB9Cn0KCgovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLyBDTEFTUyBHYW50dFBsb3RPYmplY3QKLy8gVGhlIGNvbW1vbiBzaWduYXR1cmUgZm9yIGEgR2FudHQgb2JqZWN0Ci8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CmNsYXNzIEdhbnR0UGxvdE9iamVjdCB7CiAgICB2YXIgJGlWUG9zPTA7CQkJCQkvLyBWZXJ0aWNhbCBwb3NpdGlvbgogICAgdmFyICRpTGFiZWxMZWZ0TWFyZ2luPTI7CS8vIFRpdGxlIG1hcmdpbgogICAgdmFyICRpU3RhcnQ9IiI7CQkJCS8vIFN0YXJ0IGRhdGUKICAgIHZhciAkdGl0bGUsJGNhcHRpb247CiAgICB2YXIgJGlDYXB0aW9uTWFyZ2luPTU7CiAgICB2YXIgJGNzaW1hcmVhPScnLCRjc2ltdGFyZ2V0PScnLCRjc2ltYWx0PScnOwoKICAgIHZhciAkY29uc3RyYWludHMgPSBhcnJheSgpOyAgICAKICAgIHZhciAkaUNvbnN0cmFpblBvcz1hcnJheSgpOwoJCQogICAgZnVuY3Rpb24gR2FudHRQbG90T2JqZWN0KCkgewogCSR0aGlzLT50aXRsZSA9IG5ldyBUZXh0UHJvcGVydHkoKTsKCSR0aGlzLT50aXRsZS0+QWxpZ24oImxlZnQiLCJjZW50ZXIiKTsKCSR0aGlzLT5jYXB0aW9uID0gbmV3IFRleHRQcm9wZXJ0eSgpOwogICAgfQoKICAgIGZ1bmN0aW9uIEdldENTSU1BcmVhKCkgewoJcmV0dXJuICR0aGlzLT5jc2ltYXJlYTsKICAgIH0KCiAgICBmdW5jdGlvbiBTZXRDU0lNVGFyZ2V0KCRhVGFyZ2V0LCRhQWx0PScnKSB7CglpZiggIWlzX3N0cmluZygkYVRhcmdldCkgKSB7CgkgICAgJHR2ID0gc3Vic3RyKHZhcl9leHBvcnQoJGFUYXJnZXQsdHJ1ZSksMCw0MCk7CgkgICAgSnBHcmFwaEVycm9yOjpSYWlzZUwoNjAyNCwkdHYpOwovLygnQ1NJTSBUYXJnZXQgbXVzdCBiZSBzcGVjaWZpZWQgYXMgYSBzdHJpbmcuJy4iXG5TdGFydCBvZiB0YXJnZXQgaXM6XG4kdHYiKTsKCX0KCWlmKCAhaXNfc3RyaW5nKCRhQWx0KSApIHsKCSAgICAkdHYgPSBzdWJzdHIodmFyX2V4cG9ydCgkYUFsdCx0cnVlKSwwLDQwKTsKCSAgICBKcEdyYXBoRXJyb3I6OlJhaXNlTCg2MDI1LCR0dik7Ci8vKCdDU0lNIEFsdCB0ZXh0IG11c3QgYmUgc3BlY2lmaWVkIGFzIGEgc3RyaW5nLicuIlxuU3RhcnQgb2YgYWx0IHRleHQgaXM6XG4kdHYiKTsKCX0KCiAgICAgICAgJHRoaXMtPmNzaW10YXJnZXQ9JGFUYXJnZXQ7CiAgICAgICAgJHRoaXMtPmNzaW1hbHQ9JGFBbHQ7CiAgICB9CiAgICAKICAgIGZ1bmN0aW9uIFNldENTSU1BbHQoJGFBbHQpIHsKCWlmKCAhaXNfc3RyaW5nKCRhQWx0KSApIHsKCSAgICAkdHYgPSBzdWJzdHIodmFyX2V4cG9ydCgkYUFsdCx0cnVlKSwwLDQwKTsKCSAgICBKcEdyYXBoRXJyb3I6OlJhaXNlTCg2MDI1LCR0dik7Ci8vKCdDU0lNIEFsdCB0ZXh0IG11c3QgYmUgc3BlY2lmaWVkIGFzIGEgc3RyaW5nLicuIlxuU3RhcnQgb2YgYWx0IHRleHQgaXM6XG4kdHYiKTsKCX0KICAgICAgICAkdGhpcy0+Y3NpbWFsdD0kYUFsdDsKICAgIH0KCiAgICBmdW5jdGlvbiBTZXRDb25zdHJhaW4oJGFSb3csJGFUeXBlLCRhQ29sb3I9J2JsYWNrJywkYUFycm93U2l6ZT1BUlJPV19TMiwkYUFycm93VHlwZT1BUlJPV1RfU09MSUQpIHsKCSR0aGlzLT5jb25zdHJhaW50c1tdID0gbmV3IEdhbnR0Q29uc3RyYWludCgkYVJvdywgJGFUeXBlLCAkYUNvbG9yLCAkYUFycm93U2l6ZSwgJGFBcnJvd1R5cGUpOwogICAgfQoKICAgIGZ1bmN0aW9uIFNldENvbnN0cmFpblBvcygkeHQsJHl0LCR4YiwkeWIpIHsKCSR0aGlzLT5pQ29uc3RyYWluUG9zID0gYXJyYXkoJHh0LCR5dCwkeGIsJHliKTsKICAgIH0KCiAgICAvKgogICAgZnVuY3Rpb24gR2V0Q29uc3RyYWluKCkgewoJcmV0dXJuIGFycmF5KCR0aGlzLT5pQ29uc3RyYWluUm93LCR0aGlzLT5pQ29uc3RyYWluVHlwZSk7CiAgICB9CiAgICAqLwoJCiAgICBmdW5jdGlvbiBHZXRNaW5EYXRlKCkgewoJcmV0dXJuICR0aGlzLT5pU3RhcnQ7CiAgICB9CgogICAgZnVuY3Rpb24gR2V0TWF4RGF0ZSgpIHsKCXJldHVybiAkdGhpcy0+aVN0YXJ0OwogICAgfQoJCiAgICBmdW5jdGlvbiBTZXRDYXB0aW9uTWFyZ2luKCRhTWFyZykgewoJJHRoaXMtPmlDYXB0aW9uTWFyZ2luPSRhTWFyZzsKICAgIH0KCiAgICBmdW5jdGlvbiBHZXRBYnNIZWlnaHQoJiRhSW1nKSB7CglyZXR1cm4gMDsgCiAgICB9CgkKICAgIGZ1bmN0aW9uIEdldExpbmVOYnIoKSB7CglyZXR1cm4gJHRoaXMtPmlWUG9zOwogICAgfQoKICAgIGZ1bmN0aW9uIFNldExhYmVsTGVmdE1hcmdpbigkYU9mZikgewoJJHRoaXMtPmlMYWJlbExlZnRNYXJnaW49JGFPZmY7CiAgICB9CQkKCiAgICBmdW5jdGlvbiBTdHJva2VBY3RJbmZvKCYkYUltZywkYVNjYWxlLCRhWVBvcykgewoJJGNvbHM9YXJyYXkoKTsKCSRhU2NhbGUtPmFjdGluZm8tPkdldENvbFN0YXJ0KCRhSW1nLCRjb2xzLHRydWUpOwoJJHRoaXMtPnRpdGxlLT5TdHJva2UoJGFJbWcsJGNvbHMsJGFZUG9zKTsJCQogICAgfQp9CgovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLyBDTEFTUyBQcm9ncmVzcwovLyBIb2xkcyBwYXJhbWV0ZXJzIGZvciB0aGUgcHJvZ3Jlc3MgaW5kaWNhdG9yIAovLyBkaXNwbHllZCB3aXRoaW4gYSBiYXIKLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KY2xhc3MgUHJvZ3Jlc3MgewogICAgdmFyICRpUHJvZ3Jlc3M9LTEsICRpQ29sb3I9ImJsYWNrIiwgJGlGaWxsQ29sb3I9J2JsYWNrJzsKICAgIHZhciAkaVBhdHRlcm49R0FOVFRfU09MSUQ7CiAgICB2YXIgJGlEZW5zaXR5PTk4LCAkaUhlaWdodD0wLjY1OyAKCQogICAgZnVuY3Rpb24gU2V0KCRhUHJvZykgewoJaWYoICRhUHJvZyA8IDAuMCB8fCAkYVByb2cgPiAxLjAgKQoJICAgIEpwR3JhcGhFcnJvcjo6UmFpc2VMKDYwMjcpOwovLygiUHJvZ3Jlc3MgdmFsdWUgbXVzdCBpbiByYW5nZSBbMCwgMV0iKTsKCSR0aGlzLT5pUHJvZ3Jlc3MgPSAkYVByb2c7CiAgICB9CgogICAgZnVuY3Rpb24gU2V0UGF0dGVybigkYVBhdHRlcm4sJGFDb2xvcj0iYmx1ZSIsJGFEZW5zaXR5PTk4KSB7CQkKCSR0aGlzLT5pUGF0dGVybiA9ICRhUGF0dGVybjsKCSR0aGlzLT5pQ29sb3IgPSAkYUNvbG9yOwoJJHRoaXMtPmlEZW5zaXR5ID0gJGFEZW5zaXR5OwogICAgfQoKICAgIGZ1bmN0aW9uIFNldEZpbGxDb2xvcigkYUNvbG9yKSB7CgkkdGhpcy0+aUZpbGxDb2xvciA9ICRhQ29sb3I7CiAgICB9CgkKICAgIGZ1bmN0aW9uIFNldEhlaWdodCgkYUhlaWdodCkgewoJJHRoaXMtPmlIZWlnaHQgPSAkYUhlaWdodDsKICAgIH0KfQoKREVGSU5FKCdHQU5UVF9IR1JJRDEnLDApOwpERUZJTkUoJ0dBTlRUX0hHUklEMicsMSk7CgovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLyBDTEFTUyBIb3Jpem9udGFsR3JpZExpbmUKLy8gUmVzcG9uc2libGUgZm9yIGRyYXdpbmYgaG9yaXpvbnRhbCBncmlkbGluZXMgYW5kIGZpbGxlZCBhbHRlcm5hdGliZyByb3dzCi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CmNsYXNzIEhvcml6b250YWxHcmlkTGluZSB7CiAgICB2YXIgJGlHcmFwaD1OVUxMOwogICAgdmFyICRpUm93Q29sb3IxID0gJycsICRpUm93Q29sb3IyID0gJyc7CiAgICB2YXIgJGlTaG93PWZhbHNlOwogICAgdmFyICRsaW5lPW51bGw7CiAgICB2YXIgJGlTdGFydD0wOyAvLyAwPWZyb20gbGVmdCBtYXJnaW4sIDE9anVzdCBhbG9uZyBoZWFkZXIKCiAgICBmdW5jdGlvbiBIb3Jpem9udGFsR3JpZExpbmUoKSB7CgkkdGhpcy0+bGluZSA9IG5ldyBMaW5lUHJvcGVydHkoKTsKCSR0aGlzLT5saW5lLT5TZXRDb2xvcignZ3JheUAwLjQnKTsKCSR0aGlzLT5saW5lLT5TZXRTdHlsZSgnZGFzaGVkJyk7CiAgICB9CiAgICAKICAgIGZ1bmN0aW9uIFNob3coJGFTaG93PXRydWUpIHsKCSR0aGlzLT5pU2hvdyA9ICRhU2hvdzsKICAgIH0KCiAgICBmdW5jdGlvbiBTZXRSb3dGaWxsQ29sb3IoJGFDb2xvcjEsJGFDb2xvcjI9JycpIHsKCSR0aGlzLT5pUm93Q29sb3IxID0gJGFDb2xvcjE7CgkkdGhpcy0+aVJvd0NvbG9yMiA9ICRhQ29sb3IyOwogICAgfQoKICAgIGZ1bmN0aW9uIFNldFN0YXJ0KCRhU3RhcnQpIHsKCSR0aGlzLT5pU3RhcnQgPSAkYVN0YXJ0OwogICAgfQoKICAgIGZ1bmN0aW9uIFN0cm9rZSgmJGFJbWcsJGFTY2FsZSkgewoJCglpZiggISAkdGhpcy0+aVNob3cgKSByZXR1cm47CgoJLy8gR2V0IGhvcml6b250YWwgd2lkdGggb2YgbGluZQoJLyoKCSRsaW1zdCA9ICRhU2NhbGUtPmlTdGFydERhdGU7CgkkbGltZW4gPSAkYVNjYWxlLT5pRW5kRGF0ZTsKCSR4dCA9IHJvdW5kKCRhU2NhbGUtPlRyYW5zbGF0ZURhdGUoJGFTY2FsZS0+aVN0YXJ0RGF0ZSkpOwoJJHhiID0gcm91bmQoJGFTY2FsZS0+VHJhbnNsYXRlRGF0ZSgkbGltZW4pKTsgCgkqLwoKCWlmKCAkdGhpcy0+aVN0YXJ0ID09PSAwICkgewoJICAgICR4dCA9ICRhSW1nLT5sZWZ0X21hcmdpbi0xOwoJfQoJZWxzZSB7CgkgICAgJHh0ID0gcm91bmQoJGFTY2FsZS0+VHJhbnNsYXRlRGF0ZSgkYVNjYWxlLT5pU3RhcnREYXRlKSkrMTsKCX0KCgkkeGIgPSAkYUltZy0+d2lkdGgtJGFJbWctPnJpZ2h0X21hcmdpbjsKCgkkeXQgPSByb3VuZCgkYVNjYWxlLT5UcmFuc2xhdGVWZXJ0UG9zKDApKTsKCSR5YiA9IHJvdW5kKCRhU2NhbGUtPlRyYW5zbGF0ZVZlcnRQb3MoMSkpOwkgICAgCgkkaGVpZ2h0ID0gJHliIC0gJHl0OwoKCS8vIExvb3AgYXJvdW5kIGZvciBhbGwgbGluZXMgaW4gdGhlIGNoYXJ0Cglmb3IoJGk9MDsgJGkgPCAkYVNjYWxlLT5pVmVydExpbmVzOyArKyRpICkgewoJICAgICR5YiA9ICR5dCAtICRoZWlnaHQ7CgkgICAgJHRoaXMtPmxpbmUtPlN0cm9rZSgkYUltZywkeHQsJHliLCR4YiwkeWIpOwoJICAgIGlmKCAkdGhpcy0+aVJvd0NvbG9yMSAhPT0gJycgKSB7CgkJaWYoICRpICUgMiA9PSAwICkgewoJCSAgICAkYUltZy0+UHVzaENvbG9yKCR0aGlzLT5pUm93Q29sb3IxKTsKCQkgICAgJGFJbWctPkZpbGxlZFJlY3RhbmdsZSgkeHQsJHl0LCR4YiwkeWIpOwoJCSAgICAkYUltZy0+UG9wQ29sb3IoKTsKCQl9CgkJZWxzZWlmKCAkdGhpcy0+aVJvd0NvbG9yMiAhPT0gJycgKSB7CgkJICAgICRhSW1nLT5QdXNoQ29sb3IoJHRoaXMtPmlSb3dDb2xvcjIpOwoJCSAgICAkYUltZy0+RmlsbGVkUmVjdGFuZ2xlKCR4dCwkeXQsJHhiLCR5Yik7CgkJICAgICRhSW1nLT5Qb3BDb2xvcigpOwoJCX0KCSAgICB9CgkgICAgJHl0ID0gcm91bmQoJGFTY2FsZS0+VHJhbnNsYXRlVmVydFBvcygkaSsxKSk7Cgl9CgkkeWIgPSAkeXQgLSAkaGVpZ2h0OwoJJHRoaXMtPmxpbmUtPlN0cm9rZSgkYUltZywkeHQsJHliLCR4YiwkeWIpOwogICAgfQp9CgoKLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8gQ0xBU1MgR2FudHRCYXIKLy8gUmVzcG9uc2libGUgZm9yIGZvcm1hdHRpbmcgaW5kaXZpZHVhbCBnYW50dCBiYXJzCi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CmNsYXNzIEdhbnR0QmFyIGV4dGVuZHMgR2FudHRQbG90T2JqZWN0IHsKICAgIHZhciAkaUVuZDsKICAgIHZhciAkaUhlaWdodEZhY3Rvcj0wLjU7CiAgICB2YXIgJGlGaWxsQ29sb3I9IndoaXRlIiwkaUZyYW1lQ29sb3I9ImJsYWNrIjsKICAgIHZhciAkaVNoYWRvdz1mYWxzZSwkaVNoYWRvd0NvbG9yPSJkYXJrZ3JheSIsJGlTaGFkb3dXaWR0aD0xLCRpU2hhZG93RnJhbWU9ImJsYWNrIjsKICAgIHZhciAkaVBhdHRlcm49R0FOVFRfUkRJQUcsJGlQYXR0ZXJuQ29sb3I9ImJsdWUiLCRpUGF0dGVybkRlbnNpdHk9OTU7CiAgICB2YXIgJGxlZnRNYXJrLCRyaWdodE1hcms7CiAgICB2YXIgJHByb2dyZXNzOwovLy0tLS0tLS0tLS0tLS0tLQovLyBDT05TVFJVQ1RPUgkKICAgIGZ1bmN0aW9uIEdhbnR0QmFyKCRhUG9zLCRhTGFiZWwsJGFTdGFydCwkYUVuZCwkYUNhcHRpb249IiIsJGFIZWlnaHRGYWN0b3I9MC42KSB7CglwYXJlbnQ6OkdhbnR0UGxvdE9iamVjdCgpOwkKCSR0aGlzLT5pU3RhcnQgPSAkYVN0YXJ0OwkKCS8vIElzIHRoZSBlbmQgZGF0ZSBnaXZlbiBhcyBhIGRhdGUgb3IgYXMgbnVtYmVyIG9mIGRheXMgYWRkZWQgdG8gc3RhcnQgZGF0ZT8KCWlmKCBpc19zdHJpbmcoJGFFbmQpICkgewoJICAgIC8vIElmIGVuZCBkYXRlIGhhcyBiZWVuIHNwZWNpZmllZCB3aXRob3V0IGEgdGltZSB3ZSB3aWxsIGFzc3N1bWUKCSAgICAvLyBlbmQgZGF0ZSBpcyBhdCB0aGUgZW5kIG9mIHRoYXQgZGF0ZQoJICAgIGlmKCBzdHJwb3MoJGFFbmQsJzonKSA9PT0gZmFsc2UgKQoJCSR0aGlzLT5pRW5kID0gc3RydG90aW1lKCRhRW5kKStTRUNQRVJEQVktMTsKCSAgICBlbHNlIAoJCSR0aGlzLT5pRW5kID0gJGFFbmQ7Cgl9CgllbHNlaWYoaXNfaW50KCRhRW5kKSB8fCBpc19mbG9hdCgkYUVuZCkgKSAKCSAgICAkdGhpcy0+aUVuZCA9IHN0cnRvdGltZSgkYVN0YXJ0KStyb3VuZCgkYUVuZCpTRUNQRVJEQVkpOwoJJHRoaXMtPmlWUG9zID0gJGFQb3M7CgkkdGhpcy0+aUhlaWdodEZhY3RvciA9ICRhSGVpZ2h0RmFjdG9yOwoJJHRoaXMtPnRpdGxlLT5TZXQoJGFMYWJlbCk7CgkkdGhpcy0+Y2FwdGlvbiA9IG5ldyBUZXh0UHJvcGVydHkoJGFDYXB0aW9uKTsKCSR0aGlzLT5jYXB0aW9uLT5BbGlnbigibGVmdCIsImNlbnRlciIpOwoJJHRoaXMtPmxlZnRNYXJrID1uZXcgUGxvdE1hcmsoKTsKCSR0aGlzLT5sZWZ0TWFyay0+SGlkZSgpOwoJJHRoaXMtPnJpZ2h0TWFyaz1uZXcgUGxvdE1hcmsoKTsKCSR0aGlzLT5yaWdodE1hcmstPkhpZGUoKTsKCSR0aGlzLT5wcm9ncmVzcyA9IG5ldyBQcm9ncmVzcygpOwogICAgfQoJCi8vLS0tLS0tLS0tLS0tLS0tCi8vIFBVQkxJQyBNRVRIT0RTCQogICAgZnVuY3Rpb24gU2V0U2hhZG93KCRhU2hhZG93PXRydWUsJGFDb2xvcj0iZ3JheSIpIHsKCSR0aGlzLT5pU2hhZG93PSRhU2hhZG93OwoJJHRoaXMtPmlTaGFkb3dDb2xvcj0kYUNvbG9yOwogICAgfQogICAgCiAgICBmdW5jdGlvbiBHZXRNYXhEYXRlKCkgewoJcmV0dXJuICR0aGlzLT5pRW5kOwogICAgfQoJCiAgICBmdW5jdGlvbiBTZXRIZWlnaHQoJGFIZWlnaHQpIHsKCSR0aGlzLT5pSGVpZ2h0RmFjdG9yID0gJGFIZWlnaHQ7CiAgICB9CgogICAgZnVuY3Rpb24gU2V0Q29sb3IoJGFDb2xvcikgewoJJHRoaXMtPmlGcmFtZUNvbG9yID0gJGFDb2xvcjsKICAgIH0KCiAgICBmdW5jdGlvbiBTZXRGaWxsQ29sb3IoJGFDb2xvcikgewoJJHRoaXMtPmlGaWxsQ29sb3IgPSAkYUNvbG9yOwogICAgfQoKICAgIGZ1bmN0aW9uIEdldEFic0hlaWdodCgmJGFJbWcpIHsKCWlmKCBpc19pbnQoJHRoaXMtPmlIZWlnaHRGYWN0b3IpIHx8ICR0aGlzLT5sZWZ0TWFyay0+c2hvdyB8fCAkdGhpcy0+cmlnaHRNYXJrLT5zaG93ICkgewoJICAgICRtPS0xOwoJICAgIGlmKCBpc19pbnQoJHRoaXMtPmlIZWlnaHRGYWN0b3IpICkKCQkkbSA9ICR0aGlzLT5pSGVpZ2h0RmFjdG9yOwoJICAgIGlmKCAkdGhpcy0+bGVmdE1hcmstPnNob3cgKSAKCQkkbSA9IG1heCgkbSwkdGhpcy0+bGVmdE1hcmstPndpZHRoKjIpOwoJICAgIGlmKCAkdGhpcy0+cmlnaHRNYXJrLT5zaG93ICkgCgkJJG0gPSBtYXgoJG0sJHRoaXMtPnJpZ2h0TWFyay0+d2lkdGgqMik7CgkgICAgcmV0dXJuICRtOwoJfQoJZWxzZQoJICAgIHJldHVybiAtMTsKICAgIH0KCQogICAgZnVuY3Rpb24gU2V0UGF0dGVybigkYVBhdHRlcm4sJGFDb2xvcj0iYmx1ZSIsJGFEZW5zaXR5PTk1KSB7CQkKCSR0aGlzLT5pUGF0dGVybiA9ICRhUGF0dGVybjsKCSR0aGlzLT5pUGF0dGVybkNvbG9yID0gJGFDb2xvcjsKCSR0aGlzLT5pUGF0dGVybkRlbnNpdHkgPSAkYURlbnNpdHk7CiAgICB9CgogICAgZnVuY3Rpb24gU3Ryb2tlKCYkYUltZywkYVNjYWxlKSB7CgkkZmFjdG9yeSA9IG5ldyBSZWN0UGF0dGVybkZhY3RvcnkoKTsKCSRwcmVjdCA9ICRmYWN0b3J5LT5DcmVhdGUoJHRoaXMtPmlQYXR0ZXJuLCR0aGlzLT5pUGF0dGVybkNvbG9yKTsKCSRwcmVjdC0+U2V0RGVuc2l0eSgkdGhpcy0+aVBhdHRlcm5EZW5zaXR5KTsKCgkvLyBJZiBoZWlnaHQgZmFjdG9yIGlzIHNwZWNpZmllZCBhcyBhIGZsb2F0IGJldHdlZW4gMCwxIHRoZW4gd2UgdGFrZSBpdCBhcyBtZWFuaW5nCgkvLyBwZXJjZXRhZ2Ugb2YgdGhlIHNjYWxlIHdpZHRoIGJldHdlZW4gaG9yaXpvbnRhbCBsaW5lLgoJLy8gSWYgaXQgaXMgYW4gaW50ZWdlciA+IDEgd2UgdGFrZSBpdCB0byBtZWFuIHRoZSBhYnNvbHV0ZSBoZWlnaHQgaW4gcGl4ZWxzCglpZiggJHRoaXMtPmlIZWlnaHRGYWN0b3IgPiAtMC4wICYmICR0aGlzLT5pSGVpZ2h0RmFjdG9yIDw9IDEuMSkKCSAgICAkdnMgPSAkYVNjYWxlLT5HZXRWZXJ0U3BhY2luZygpKiR0aGlzLT5pSGVpZ2h0RmFjdG9yOwoJZWxzZWlmKGlzX2ludCgkdGhpcy0+aUhlaWdodEZhY3RvcikgJiYgJHRoaXMtPmlIZWlnaHRGYWN0b3I+MiAmJiAkdGhpcy0+aUhlaWdodEZhY3RvciA8IDIwMCApCgkgICAgJHZzID0gJHRoaXMtPmlIZWlnaHRGYWN0b3I7CgllbHNlCgkgICAgSnBHcmFwaEVycm9yOjpSYWlzZUwoNjAyOCwkdGhpcy0+aUhlaWdodEZhY3Rvcik7Ci8vKCJTcGVjaWZpZWQgaGVpZ2h0ICgiLiR0aGlzLT5pSGVpZ2h0RmFjdG9yLiIpIGZvciBnYW50dCBiYXIgaXMgb3V0IG9mIHJhbmdlLiIpOwoJCgkvLyBDbGlwIGRhdGUgdG8gbWluIG1heCBkYXRlcyB0byBzaG93Cgkkc3QgPSAkYVNjYWxlLT5Ob3JtYWxpemVEYXRlKCR0aGlzLT5pU3RhcnQpOwoJJGVuID0gJGFTY2FsZS0+Tm9ybWFsaXplRGF0ZSgkdGhpcy0+aUVuZCk7CgkKCgkkbGltc3QgPSBtYXgoJHN0LCRhU2NhbGUtPmlTdGFydERhdGUpOwoJJGxpbWVuID0gbWluKCRlbiwkYVNjYWxlLT5pRW5kRGF0ZSk7CgkJCQoJJHh0ID0gcm91bmQoJGFTY2FsZS0+VHJhbnNsYXRlRGF0ZSgkbGltc3QpKTsKCSR4YiA9IHJvdW5kKCRhU2NhbGUtPlRyYW5zbGF0ZURhdGUoJGxpbWVuKSk7IAoJJHl0ID0gcm91bmQoJGFTY2FsZS0+VHJhbnNsYXRlVmVydFBvcygkdGhpcy0+aVZQb3MpLSR2cy0oJGFTY2FsZS0+R2V0VmVydFNwYWNpbmcoKS8yLSR2cy8yKSk7CgkkeWIgPSByb3VuZCgkYVNjYWxlLT5UcmFuc2xhdGVWZXJ0UG9zKCR0aGlzLT5pVlBvcyktKCRhU2NhbGUtPkdldFZlcnRTcGFjaW5nKCkvMi0kdnMvMikpOwoJJG1pZGRsZSA9IHJvdW5kKCR5dCsoJHliLSR5dCkvMik7CgkkdGhpcy0+U3Ryb2tlQWN0SW5mbygkYUltZywkYVNjYWxlLCRtaWRkbGUpOwoKCS8vIENTSU0gZm9yIHRpdGxlCglpZiggISBlbXB0eSgkdGhpcy0+dGl0bGUtPmNzaW10YXJnZXQpICkgewoJICAgICRjb2x3aWR0aCA9ICR0aGlzLT50aXRsZS0+R2V0Q29sV2lkdGgoJGFJbWcpOwoJICAgICRjb2xzdGFydHM9YXJyYXkoKTsKCSAgICAkYVNjYWxlLT5hY3RpbmZvLT5HZXRDb2xTdGFydCgkYUltZywkY29sc3RhcnRzLHRydWUpOwoJICAgICRuID0gbWluKGNvdW50KCRjb2x3aWR0aCksY291bnQoJHRoaXMtPnRpdGxlLT5jc2ltdGFyZ2V0KSk7CgkgICAgZm9yKCAkaT0wOyAkaSA8ICRuOyArKyRpICkgewoJCSR0aXRsZV94dCA9ICRjb2xzdGFydHNbJGldOwoJCSR0aXRsZV94YiA9ICR0aXRsZV94dCArICRjb2x3aWR0aFskaV07CgkJJGNvb3JkcyA9ICIkdGl0bGVfeHQsJHl0LCR0aXRsZV94YiwkeXQsJHRpdGxlX3hiLCR5YiwkdGl0bGVfeHQsJHliIjsKCQkkdGhpcy0+Y3NpbWFyZWEgLj0gIjxhcmVhIHNoYXBlPVwicG9seVwiIGNvb3Jkcz1cIiRjb29yZHNcIiBocmVmPVwiIi4kdGhpcy0+dGl0bGUtPmNzaW10YXJnZXRbJGldLiJcIiI7CgkJaWYoICEgZW1wdHkoJHRoaXMtPnRpdGxlLT5jc2ltYWx0WyRpXSkgKSB7CgkJICAgICR0bXAgPSAkdGhpcy0+dGl0bGUtPmNzaW1hbHRbJGldOwoJCSAgICAkdGhpcy0+Y3NpbWFyZWEgLj0gIiB0aXRsZT1cIiR0bXBcIiI7CgkJfQoJCSR0aGlzLT5jc2ltYXJlYSAuPSAiIGFsdD1cIiR0bXBcIiAvPlxuIjsKCSAgICB9Cgl9CgoJLy8gQ2hlY2sgaWYgdGhlIGJhciBpcyB0b3RhbGx5IG91dHNpZGUgdGhlIGN1cnJlbnQgc2NhbGUgcmFuZ2UKCWlmKCAkZW4gPCAgJGFTY2FsZS0+aVN0YXJ0RGF0ZSB8fCAkc3QgPiAkYVNjYWxlLT5pRW5kRGF0ZSApCgkJcmV0dXJuOwoJCQkKCgkvLyBSZW1lbWJlciB0aGUgcG9zaXRpb25zIGZvciB0aGUgYmFyCgkkdGhpcy0+U2V0Q29uc3RyYWluUG9zKCR4dCwkeXQsJHhiLCR5Yik7CgkJCgkkcHJlY3QtPlNob3dGcmFtZShmYWxzZSk7CgkkcHJlY3QtPlNldEJhY2tncm91bmQoJHRoaXMtPmlGaWxsQ29sb3IpOwoJaWYoICR0aGlzLT5pU2hhZG93ICkgewoJICAgICRhSW1nLT5TZXRDb2xvcigkdGhpcy0+aUZyYW1lQ29sb3IpOwoJICAgICRhSW1nLT5TaGFkb3dSZWN0YW5nbGUoJHh0LCR5dCwkeGIsJHliLCR0aGlzLT5pRmlsbENvbG9yLCR0aGlzLT5pU2hhZG93V2lkdGgsJHRoaXMtPmlTaGFkb3dDb2xvcik7CQkJCQoJICAgICRwcmVjdC0+U2V0UG9zKG5ldyBSZWN0YW5nbGUoJHh0KzEsJHl0KzEsJHhiLSR4dC0kdGhpcy0+aVNoYWRvd1dpZHRoLTIsJHliLSR5dC0kdGhpcy0+aVNoYWRvd1dpZHRoLTIpKTsJCQkJCgkgICAgJHByZWN0LT5TdHJva2UoJGFJbWcpOwoJfQoJZWxzZSB7CQoJICAgICRwcmVjdC0+U2V0UG9zKG5ldyBSZWN0YW5nbGUoJHh0LCR5dCwkeGItJHh0KzEsJHliLSR5dCsxKSk7CQkJCQoJICAgICRwcmVjdC0+U3Ryb2tlKCRhSW1nKTsKCSAgICAkYUltZy0+U2V0Q29sb3IoJHRoaXMtPmlGcmFtZUNvbG9yKTsKCSAgICAkYUltZy0+UmVjdGFuZ2xlKCR4dCwkeXQsJHhiLCR5Yik7Cgl9CgoJLy8gQ1NJTSBmb3IgYmFyCglpZiggJHRoaXMtPmNzaW10YXJnZXQgIT0gJycgKSB7CgoJICAgICRjb29yZHMgPSAiJHh0LCR5dCwkeGIsJHl0LCR4YiwkeWIsJHh0LCR5YiI7CgkgICAgJHRoaXMtPmNzaW1hcmVhIC49ICI8YXJlYSBzaGFwZT1cInBvbHlcIiBjb29yZHM9XCIkY29vcmRzXCIgaHJlZj1cIiIuCgkJICAgICAgICAgICAgICAkdGhpcy0+Y3NpbXRhcmdldC4iXCIiOwoJICAgIGlmKCAkdGhpcy0+Y3NpbWFsdCAhPSAnJyApIHsKCQkkdG1wID0gJHRoaXMtPmNzaW1hbHQ7CgkJJHRoaXMtPmNzaW1hcmVhIC49ICIgdGl0bGU9XCIkdG1wXCIiOwoJICAgIH0KCSAgICAkdGhpcy0+Y3NpbWFyZWEgLj0gIiBhbHQ9XCIkdG1wXCIgLz5cbiI7Cgl9CgoJLy8gRHJhdyBwcm9ncmVzcyBiYXIgaW5zaWRlIGFjdGl2aXR5IGJhcgoJaWYoICR0aGlzLT5wcm9ncmVzcy0+aVByb2dyZXNzID4gMCApIHsKCQkKCSAgICAkeHRwID0gJGFTY2FsZS0+VHJhbnNsYXRlRGF0ZSgkc3QpOwoJICAgICR4YnAgPSAkYVNjYWxlLT5UcmFuc2xhdGVEYXRlKCRlbik7CgkgICAgJGxlbiA9ICgkeGJwLSR4dHApKiR0aGlzLT5wcm9ncmVzcy0+aVByb2dyZXNzOwoKCSAgICAkZW5kcG9zID0gJHh0cCskbGVuOwoJICAgIGlmKCAkZW5kcG9zID4gJHh0ICkgewoJCSRsZW4gLT0gKCR4dC0keHRwKTsgCgoJCS8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBwcm9nZXNzIGJhciBkb2Vzbid0IGV4dGVuZCBvdmVyIHRoZSBlbmQgZGF0ZQoJCWlmKCAkeHRwKyRsZW4tMSA+ICR4YiApCgkJICAgICRsZW4gPSAkeGIgLSAkeHRwICsgMTsKCQkKCQlpZiggJHh0cCA8ICR4dCApIAoJCSAgICAkeHRwID0gJHh0OwoJCQoJCSRwcm9nID0gJGZhY3RvcnktPkNyZWF0ZSgkdGhpcy0+cHJvZ3Jlc3MtPmlQYXR0ZXJuLCR0aGlzLT5wcm9ncmVzcy0+aUNvbG9yKTsKCQkkcHJvZy0+U2V0RGVuc2l0eSgkdGhpcy0+cHJvZ3Jlc3MtPmlEZW5zaXR5KTsKCQkkcHJvZy0+U2V0QmFja2dyb3VuZCgkdGhpcy0+cHJvZ3Jlc3MtPmlGaWxsQ29sb3IpOwoJICAgIAkkYmFyaGVpZ2h0ID0gKCR5Yi0keXQrMSk7CgkJaWYoICR0aGlzLT5pU2hhZG93ICkgCgkJICAgICRiYXJoZWlnaHQgLT0gJHRoaXMtPmlTaGFkb3dXaWR0aDsKCQkkcHJvZ3Jlc3NoZWlnaHQgPSBmbG9vcigkYmFyaGVpZ2h0KiR0aGlzLT5wcm9ncmVzcy0+aUhlaWdodCk7CgkJJG1hcmcgPSBjZWlsKCgkYmFyaGVpZ2h0LSRwcm9ncmVzc2hlaWdodCkvMik7CgkgICAgCSRwb3MgPSBuZXcgUmVjdGFuZ2xlKCR4dHAsJHl0ICsgJG1hcmcsICRsZW4sJGJhcmhlaWdodC0yKiRtYXJnKTsKCQkkcHJvZy0+U2V0UG9zKCRwb3MpOwoJCSRwcm9nLT5TdHJva2UoJGFJbWcpOwoJICAgIH0KCX0KCQoJLy8gV2UgZG9uJ3QgcGxvdCB0aGUgZW5kIG1hcmsgaWYgdGhlIGJhciBoYXMgYmVlbiBjYXBwZWQKCWlmKCAkbGltc3QgPT0gJHN0ICkgewoJICAgICR5ID0gJG1pZGRsZTsKCSAgICAvLyBXZSB0cmVhdCB0aGUgUklHSFQgYW5kIExFRlQgdHJpYW5nbGUgbWFyayBhIGxpdHRsZSBiaQoJICAgIC8vIHNwZWNpYWwgc28gdGhhdCB0aGVzZSBtYXJrcyBhcmUgcGxhY2VkIHJpZ2h0IHVuZGVyIHRoZQoJICAgIC8vIGJhci4KCSAgICBpZiggJHRoaXMtPmxlZnRNYXJrLT5HZXRUeXBlKCkgPT0gTUFSS19MRUZUVFJJQU5HTEUgKSB7CgkJJHkgPSAkeWIgOyAKCSAgICB9CgkgICAgJHRoaXMtPmxlZnRNYXJrLT5TdHJva2UoJGFJbWcsJHh0LCR5KTsKCX0KCWlmKCAkbGltZW4gPT0gJGVuICkgewoJICAgICR5ID0gJG1pZGRsZTsKCSAgICAvLyBXZSB0cmVhdCB0aGUgUklHSFQgYW5kIExFRlQgdHJpYW5nbGUgbWFyayBhIGxpdHRsZSBiaQoJICAgIC8vIHNwZWNpYWwgc28gdGhhdCB0aGVzZSBtYXJrcyBhcmUgcGxhY2VkIHJpZ2h0IHVuZGVyIHRoZQoJICAgIC8vIGJhci4KCSAgICBpZiggJHRoaXMtPnJpZ2h0TWFyay0+R2V0VHlwZSgpID09IE1BUktfUklHSFRUUklBTkdMRSApIHsKCQkkeSA9ICR5YiA7IAoJICAgIH0KCSAgICAkdGhpcy0+cmlnaHRNYXJrLT5TdHJva2UoJGFJbWcsJHhiLCR5KTsKCSAgICAKCSAgICAkbWFyZ2luID0gJHRoaXMtPmlDYXB0aW9uTWFyZ2luOwoJICAgIGlmKCAkdGhpcy0+cmlnaHRNYXJrLT5zaG93ICkgCgkgICAgCSRtYXJnaW4gKz0gJHRoaXMtPnJpZ2h0TWFyay0+R2V0V2lkdGgoKTsKCSAgICAkdGhpcy0+Y2FwdGlvbi0+U3Ryb2tlKCRhSW1nLCR4YiskbWFyZ2luLCRtaWRkbGUpOwkJCgl9CiAgICB9Cn0KCi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci8vIENMQVNTIE1pbGVTdG9uZQovLyBSZXNwb25zaWJsZSBmb3IgZm9ybWF0dGluZyBpbmRpdmlkdWFsIG1pbGVzdG9uZXMKLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KY2xhc3MgTWlsZVN0b25lIGV4dGVuZHMgR2FudHRQbG90T2JqZWN0IHsKICAgIHZhciAkbWFyazsKCQovLy0tLS0tLS0tLS0tLS0tLQovLyBDT05TVFJVQ1RPUgkKICAgIGZ1bmN0aW9uIE1pbGVTdG9uZSgkYVZQb3MsJGFMYWJlbCwkYURhdGUsJGFDYXB0aW9uPSIiKSB7CglHYW50dFBsb3RPYmplY3Q6OkdhbnR0UGxvdE9iamVjdCgpOwoJJHRoaXMtPmNhcHRpb24tPlNldCgkYUNhcHRpb24pOwoJJHRoaXMtPmNhcHRpb24tPkFsaWduKCJsZWZ0IiwiY2VudGVyIik7CgkkdGhpcy0+Y2FwdGlvbi0+U2V0Rm9udChGRl9GT05UMSxGU19CT0xEKTsKCSR0aGlzLT50aXRsZS0+U2V0KCRhTGFiZWwpOwoJJHRoaXMtPnRpdGxlLT5TZXRDb2xvcigiZGFya3JlZCIpOwoJJHRoaXMtPm1hcmsgPSBuZXcgUGxvdE1hcmsoKTsKCSR0aGlzLT5tYXJrLT5TZXRXaWR0aCgxMCk7CgkkdGhpcy0+bWFyay0+U2V0VHlwZShNQVJLX0RJQU1PTkQpOwoJJHRoaXMtPm1hcmstPlNldENvbG9yKCJkYXJrcmVkIik7CgkkdGhpcy0+bWFyay0+U2V0RmlsbENvbG9yKCJkYXJrcmVkIik7CgkkdGhpcy0+aVZQb3MgPSAkYVZQb3M7CgkkdGhpcy0+aVN0YXJ0ID0gJGFEYXRlOwogICAgfQoJCi8vLS0tLS0tLS0tLS0tLS0tCi8vIFBVQkxJQyBNRVRIT0RTCQoJCiAgICBmdW5jdGlvbiBHZXRBYnNIZWlnaHQoJiRhSW1nKSB7CglyZXR1cm4gbWF4KCR0aGlzLT50aXRsZS0+R2V0SGVpZ2h0KCRhSW1nKSwkdGhpcy0+bWFyay0+R2V0V2lkdGgoKSk7CiAgICB9CgkJCiAgICBmdW5jdGlvbiBTdHJva2UoJiRhSW1nLCRhU2NhbGUpIHsKCS8vIFB1dCB0aGUgbWFyayBpbiB0aGUgbWlkZGxlIGF0IHRoZSBtaWRkbGUgb2YgdGhlIGRheQoJJGQgPSAkYVNjYWxlLT5Ob3JtYWxpemVEYXRlKCR0aGlzLT5pU3RhcnQpK1NFQ1BFUkRBWS8yOwoJJHggPSAkYVNjYWxlLT5UcmFuc2xhdGVEYXRlKCRkKTsKCSR5ID0gJGFTY2FsZS0+VHJhbnNsYXRlVmVydFBvcygkdGhpcy0+aVZQb3MpLSgkYVNjYWxlLT5HZXRWZXJ0U3BhY2luZygpLzIpOwoKCSR0aGlzLT5TdHJva2VBY3RJbmZvKCRhSW1nLCRhU2NhbGUsJHkpOwoKCS8vIENTSU0gZm9yIHRpdGxlCglpZiggISBlbXB0eSgkdGhpcy0+dGl0bGUtPmNzaW10YXJnZXQpICkgewoJICAgIAoJICAgICR5dCA9IHJvdW5kKCR5IC0gJHRoaXMtPnRpdGxlLT5HZXRIZWlnaHQoJGFJbWcpLzIpOwoJICAgICR5YiA9IHJvdW5kKCR5ICsgJHRoaXMtPnRpdGxlLT5HZXRIZWlnaHQoJGFJbWcpLzIpOwoKCSAgICAkY29sd2lkdGggPSAkdGhpcy0+dGl0bGUtPkdldENvbFdpZHRoKCRhSW1nKTsKCSAgICAkY29sc3RhcnRzPWFycmF5KCk7CgkgICAgJGFTY2FsZS0+YWN0aW5mby0+R2V0Q29sU3RhcnQoJGFJbWcsJGNvbHN0YXJ0cyx0cnVlKTsKCSAgICAkbiA9IG1pbihjb3VudCgkY29sd2lkdGgpLGNvdW50KCR0aGlzLT50aXRsZS0+Y3NpbXRhcmdldCkpOwoJICAgIGZvciggJGk9MDsgJGkgPCAkbjsgKyskaSApIHsKCQkkdGl0bGVfeHQgPSAkY29sc3RhcnRzWyRpXTsKCQkkdGl0bGVfeGIgPSAkdGl0bGVfeHQgKyAkY29sd2lkdGhbJGldOwoJCSRjb29yZHMgPSAiJHRpdGxlX3h0LCR5dCwkdGl0bGVfeGIsJHl0LCR0aXRsZV94YiwkeWIsJHRpdGxlX3h0LCR5YiI7CgkJJHRoaXMtPmNzaW1hcmVhIC49ICI8YXJlYSBzaGFwZT1cInBvbHlcIiBjb29yZHM9XCIkY29vcmRzXCIgaHJlZj1cIiIuJHRoaXMtPnRpdGxlLT5jc2ltdGFyZ2V0WyRpXS4iXCIiOwoJCWlmKCAhIGVtcHR5KCR0aGlzLT50aXRsZS0+Y3NpbWFsdFskaV0pICkgewoJCSAgICAkdG1wID0gJHRoaXMtPnRpdGxlLT5jc2ltYWx0WyRpXTsKCQkgICAgJHRoaXMtPmNzaW1hcmVhIC49ICIgdGl0bGU9XCIkdG1wXCIiOwoJCX0KCQkkdGhpcy0+Y3NpbWFyZWEgLj0gIiBhbHQ9XCIkdG1wXCIgLz5cbiI7CgkgICAgfQoJfQoKCWlmKCAkZCA8ICAkYVNjYWxlLT5pU3RhcnREYXRlIHx8ICRkID4gJGFTY2FsZS0+aUVuZERhdGUgKQoJCXJldHVybjsKCgkvLyBSZW1lbWJlciB0aGUgY29vcmRpbmF0ZXMgZm9yIGFueSBjb25zdHJhaW5zIGxpbmtpbmcgdG8KCS8vIHRoaXMgbWlsZXN0b25lCgkkdyA9ICR0aGlzLT5tYXJrLT5HZXRXaWR0aCgpLzI7CgkkdGhpcy0+U2V0Q29uc3RyYWluUG9zKCR4LHJvdW5kKCR5LSR3KSwkeCxyb3VuZCgkeSskdykpOwoJCgkvLyBTZXR1cCBDU0lNCglpZiggJHRoaXMtPmNzaW10YXJnZXQgIT0gJycgKSB7CgkgICAgJHRoaXMtPm1hcmstPlNldENTSU1UYXJnZXQoICR0aGlzLT5jc2ltdGFyZ2V0ICk7CgkgICAgJHRoaXMtPm1hcmstPlNldENTSU1BbHQoICR0aGlzLT5jc2ltYWx0ICk7Cgl9CgkJCgkkdGhpcy0+bWFyay0+U3Ryb2tlKCRhSW1nLCR4LCR5KTsJCQoJJHRoaXMtPmNhcHRpb24tPlN0cm9rZSgkYUltZywkeCskdGhpcy0+bWFyay0+d2lkdGgvMiskdGhpcy0+aUNhcHRpb25NYXJnaW4sJHkpOwoKCSR0aGlzLT5jc2ltYXJlYSAuPSAkdGhpcy0+bWFyay0+R2V0Q1NJTUFyZWFzKCk7CiAgICB9Cn0KCgovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLyBDTEFTUyBHYW50dFZMaW5lCi8vIFJlc3BvbnNpYmxlIGZvciBmb3JtYXR0aW5nIGluZGl2aWR1YWwgbWlsZXN0b25lcwovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKY2xhc3MgVGV4dFByb3BlcnR5QmVsb3cgZXh0ZW5kcyBUZXh0UHJvcGVydHkgewogICAgZnVuY3Rpb24gVGV4dFByb3BlcnR5QmVsb3coJGFUeHQ9JycpIHsKCXBhcmVudDo6VGV4dFByb3BlcnR5KCRhVHh0KTsKICAgIH0KCiAgICBmdW5jdGlvbiBHZXRDb2xXaWR0aCgmJGFJbWcsJG1hcmdpbikgewoJLy8gU2luY2Ugd2UgYXJlIG5vdCBzdHJva2luZyB0aGUgdGl0bGUgaW4gdGhlIGNvbHVtbnMKCS8vIGJ1dCByYXRoZXIgdW5kZXIgdGhlIGdyYXBoIHdlIHdhbnQgdGhpcyB0byByZXR1cm4gMC4KCXJldHVybiBhcnJheSgwKTsKICAgIH0KfQoKY2xhc3MgR2FudHRWTGluZSBleHRlbmRzIEdhbnR0UGxvdE9iamVjdCB7CgogICAgdmFyICRpTGluZSwkdGl0bGVfbWFyZ2luPTM7CiAgICB2YXIgJGlEYXlPZmZzZXQ9MTsJLy8gRGVmdWx0IHRvIHJpZ2h0IGVkZ2Ugb2YgZGF5CgkKLy8tLS0tLS0tLS0tLS0tLS0KLy8gQ09OU1RSVUNUT1IJCiAgICBmdW5jdGlvbiBHYW50dFZMaW5lKCRhRGF0ZSwkYVRpdGxlPSIiLCRhQ29sb3I9ImJsYWNrIiwkYVdlaWdodD0zLCRhU3R5bGU9ImRhc2hlZCIpIHsKCUdhbnR0UGxvdE9iamVjdDo6R2FudHRQbG90T2JqZWN0KCk7CgkkdGhpcy0+aUxpbmUgPSBuZXcgTGluZVByb3BlcnR5KCk7CgkkdGhpcy0+aUxpbmUtPlNldENvbG9yKCRhQ29sb3IpOwoJJHRoaXMtPmlMaW5lLT5TZXRXZWlnaHQoJGFXZWlnaHQpOwoJJHRoaXMtPmlMaW5lLT5TZXRTdHlsZSgkYVN0eWxlKTsKCSR0aGlzLT5pU3RhcnQgPSAkYURhdGU7CgkkdGhpcy0+dGl0bGUgPSBuZXcgVGV4dFByb3BlcnR5QmVsb3coKTsKCSR0aGlzLT50aXRsZS0+U2V0KCRhVGl0bGUpOwogICAgfQoKLy8tLS0tLS0tLS0tLS0tLS0KLy8gUFVCTElDIE1FVEhPRFMJCgogICAgZnVuY3Rpb24gU2V0RGF5T2Zmc2V0KCRhT2ZmPTAuNSkgewoJaWYoICRhT2ZmIDwgMC4wIHx8ICRhT2ZmID4gMS4wICkKCSAgICBKcEdyYXBoRXJyb3I6OlJhaXNlTCg2MDI5KTsKLy8oIk9mZnNldCBmb3IgdmVydGljYWwgbGluZSBtdXN0IGJlIGluIHJhbmdlIFswLDFdIik7CgkkdGhpcy0+aURheU9mZnNldCA9ICRhT2ZmOwogICAgfQoJCiAgICBmdW5jdGlvbiBTZXRUaXRsZU1hcmdpbigkYU1hcmcpIHsKCSR0aGlzLT50aXRsZV9tYXJnaW4gPSAkYU1hcmc7CiAgICB9CgkKICAgIGZ1bmN0aW9uIFN0cm9rZSgmJGFJbWcsJGFTY2FsZSkgewoJJGQgPSAkYVNjYWxlLT5Ob3JtYWxpemVEYXRlKCR0aGlzLT5pU3RhcnQpOwoJaWYoICRkIDwgICRhU2NhbGUtPmlTdGFydERhdGUgfHwgJGQgPiAkYVNjYWxlLT5pRW5kRGF0ZSApCgkgICAgcmV0dXJuOwkKCWlmKCR0aGlzLT5pRGF5T2Zmc2V0ICE9IDAuMCkKCSAgICAkZCArPSAyNCo2MCo2MCokdGhpcy0+aURheU9mZnNldDsJCgkkeCA9ICRhU2NhbGUtPlRyYW5zbGF0ZURhdGUoJGQpOwkKCSR5MSA9ICRhU2NhbGUtPmlWZXJ0SGVhZGVyU2l6ZSskYUltZy0+dG9wX21hcmdpbjsKCSR5MiA9ICRhSW1nLT5oZWlnaHQgLSAkYUltZy0+Ym90dG9tX21hcmdpbjsJCgkkdGhpcy0+aUxpbmUtPlN0cm9rZSgkYUltZywkeCwkeTEsJHgsJHkyKTsKCSR0aGlzLT50aXRsZS0+QWxpZ24oImNlbnRlciIsInRvcCIpOwoJJHRoaXMtPnRpdGxlLT5TdHJva2UoJGFJbWcsJHgsJHkyKyR0aGlzLT50aXRsZV9tYXJnaW4pOwogICAgfQkKfQoKLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8gQ0xBU1MgTGlua0Fycm93Ci8vIEhhbmRsZXMgdGhlIGRyYXdpbmcgb2YgYSBhbiBhcnJvdyAKLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KY2xhc3MgTGlua0Fycm93IHsKICAgIHZhciAkaXgsJGl5OwogICAgdmFyICRpc2l6ZXNwZWMgPSBhcnJheSgKCWFycmF5KDIsMyksYXJyYXkoMyw1KSxhcnJheSgzLDgpLGFycmF5KDYsMTUpLGFycmF5KDgsMjIpKTsKICAgIHZhciAkaURpcmVjdGlvbj1BUlJPV19ET1dOLCRpVHlwZT1BUlJPV1RfU09MSUQsJGlTaXplPUFSUk9XX1MyOwogICAgdmFyICRpQ29sb3I9J2JsYWNrJzsKCiAgICBmdW5jdGlvbiBMaW5rQXJyb3coJHgsJHksJGFEaXJlY3Rpb24sJGFUeXBlPUFSUk9XVF9TT0xJRCwkYVNpemU9QVJST1dfUzIpIHsKCSR0aGlzLT5pRGlyZWN0aW9uID0gJGFEaXJlY3Rpb247CgkkdGhpcy0+aVR5cGUgPSAkYVR5cGU7CgkkdGhpcy0+aVNpemUgPSAkYVNpemU7CgkkdGhpcy0+aXggPSAkeDsKCSR0aGlzLT5peSA9ICR5OwogICAgfQogICAgCiAgICBmdW5jdGlvbiBTZXRDb2xvcigkYUNvbG9yKSB7CgkkdGhpcy0+aUNvbG9yID0gJGFDb2xvcjsKICAgIH0KCiAgICBmdW5jdGlvbiBTZXRTaXplKCRhU2l6ZSkgewoJJHRoaXMtPmlTaXplID0gJGFTaXplOwogICAgfQoKICAgIGZ1bmN0aW9uIFNldFR5cGUoJGFUeXBlKSB7CgkkdGhpcy0+aVR5cGUgPSAkYVR5cGU7CiAgICB9CgogICAgZnVuY3Rpb24gU3Ryb2tlKCYkYUltZykgewoJbGlzdCgkZHgsJGR5KSA9ICR0aGlzLT5pc2l6ZXNwZWNbJHRoaXMtPmlTaXplXTsKCSR4ID0gJHRoaXMtPml4OwoJJHkgPSAkdGhpcy0+aXk7Cglzd2l0Y2ggKCAkdGhpcy0+aURpcmVjdGlvbiApIHsKCSAgICBjYXNlIEFSUk9XX0RPV046CgkJJGMgPSBhcnJheSgkeCwkeSwkeC0kZHgsJHktJGR5LCR4KyRkeCwkeS0kZHksJHgsJHkpOwoJCWJyZWFrOwoJICAgIGNhc2UgQVJST1dfVVA6CgkJJGMgPSBhcnJheSgkeCwkeSwkeC0kZHgsJHkrJGR5LCR4KyRkeCwkeSskZHksJHgsJHkpOwoJCWJyZWFrOwoJICAgIGNhc2UgQVJST1dfTEVGVDoKCQkkYyA9IGFycmF5KCR4LCR5LCR4KyRkeSwkeS0kZHgsJHgrJGR5LCR5KyRkeCwkeCwkeSk7CgkJYnJlYWs7CgkgICAgY2FzZSBBUlJPV19SSUdIVDoKCQkkYyA9IGFycmF5KCR4LCR5LCR4LSRkeSwkeS0kZHgsJHgtJGR5LCR5KyRkeCwkeCwkeSk7CgkJYnJlYWs7CgkgICAgZGVmYXVsdDoKCQlKcEdyYXBoRXJyb3I6OlJhaXNlTCg2MDMwKTsKLy8oJ1Vua25vd24gYXJyb3cgZGlyZWN0aW9uIGZvciBsaW5rLicpOwoJCWRpZSgpOwoJCWJyZWFrOwoJfQoJJGFJbWctPlNldENvbG9yKCR0aGlzLT5pQ29sb3IpOwoJc3dpdGNoKCAkdGhpcy0+aVR5cGUgKSB7CgkgICAgY2FzZSBBUlJPV1RfU09MSUQ6CgkJJGFJbWctPkZpbGxlZFBvbHlnb24oJGMpOwoJCWJyZWFrOwoJICAgIGNhc2UgQVJST1dUX09QRU46CgkJJGFJbWctPlBvbHlnb24oJGMpOwoJCWJyZWFrOwoJICAgIGRlZmF1bHQ6CgkJSnBHcmFwaEVycm9yOjpSYWlzZUwoNjAzMSk7Ci8vKCdVbmtub3duIGFycm93IHR5cGUgZm9yIGxpbmsuJyk7CgkJZGllKCk7CgkJYnJlYWs7CQkKCX0KICAgIH0KfQoKLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8gQ0xBU1MgR2FudHRMaW5rCi8vIEhhbmRsZXMgdGhlIGRyYXdpbmcgb2YgYSBsaW5rIGxpbmUgYmV0d2VlbiAyIHBvaW50cwovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKY2xhc3MgR2FudHRMaW5rIHsKICAgIHZhciAkaXgxLCRpeDIsJGl5MSwkaXkyOwogICAgdmFyICRpUGF0aFR5cGU9MiwkaVBhdGhFeHRlbmQ9MTU7CiAgICB2YXIgJGlDb2xvcj0nYmxhY2snLCRpV2VpZ2h0PTE7CiAgICB2YXIgJGlBcnJvd1NpemU9QVJST1dfUzIsJGlBcnJvd1R5cGU9QVJST1dUX1NPTElEOwoKICAgIGZ1bmN0aW9uIEdhbnR0TGluaygkeDE9MCwkeTE9MCwkeDI9MCwkeTI9MCkgewoJJHRoaXMtPml4MSA9ICR4MTsKCSR0aGlzLT5peDIgPSAkeDI7CgkkdGhpcy0+aXkxID0gJHkxOwoJJHRoaXMtPml5MiA9ICR5MjsKICAgIH0KCiAgICBmdW5jdGlvbiBTZXRQb3MoJHgxLCR5MSwkeDIsJHkyKSB7CgkkdGhpcy0+aXgxID0gJHgxOwoJJHRoaXMtPml4MiA9ICR4MjsKCSR0aGlzLT5peTEgPSAkeTE7CgkkdGhpcy0+aXkyID0gJHkyOwogICAgfQoKICAgIGZ1bmN0aW9uIFNldFBhdGgoJGFQYXRoKSB7CgkkdGhpcy0+aVBhdGhUeXBlID0gJGFQYXRoOwogICAgfQoKICAgIGZ1bmN0aW9uIFNldENvbG9yKCRhQ29sb3IpIHsKCSR0aGlzLT5pQ29sb3IgPSAkYUNvbG9yOwogICAgfQoKICAgIGZ1bmN0aW9uIFNldEFycm93KCRhU2l6ZSwkYVR5cGU9QVJST1dUX1NPTElEKSB7CgkkdGhpcy0+aUFycm93U2l6ZSA9ICRhU2l6ZTsKCSR0aGlzLT5pQXJyb3dUeXBlID0gJGFUeXBlOwogICAgfQogICAgCiAgICBmdW5jdGlvbiBTZXRXZWlnaHQoJGFXZWlnaHQpIHsKCSR0aGlzLT5pV2VpZ2h0ID0gJGFXZWlnaHQ7CiAgICB9CgogICAgZnVuY3Rpb24gU3Ryb2tlKCYkYUltZykgewoJLy8gVGhlIHdheSB0aGUgcGF0aCBmb3IgdGhlIGFycm93IGlzIGNvbnN0cnVjdGVkIGlzIHBhcnRseSBiYXNlZAoJLy8gb24gc29tZSBoZXVyaXN0aWNzLiBUaGlzIGlzIG5vdCBhbiBleGFjdCBzY2llbmNlIGJ1dCBkcmF3cyB0aGUKCS8vIHBhdGggaW4gYSB3YXkgdGhhdCwgZm9yIG1lLCBtYWtlcyBlc3RoZXRpYyBzZW5jZS4gRm9yIGV4YW1wbGUKCS8vIGlmIHRoZSBzdGFydCBhbmQgZW5kIGFjdGl2aXRpZXMgYXJlIHZlcnkgY2xvc2Ugd2UgbWFrZSBhIHNtYWxsCgkvLyBkZXRvdXIgdG8gZW5kdGVyIHRoZSB0YXJnZXQgaG9yaXhvbnRhbGx5LiBJZiB0aGVyZSBhcmUgbW9yZQoJLy8gc3BhY2UgYmV0d2VlbiBheGN0aXZpdGllcyB0aGVuIG5vIHN1aCBkZXRvdXIgaXMgbWFkZSBhbmQgdGhlIAoJLy8gdGFyZ2V0IGlzICJoaXQiIGRpcmVjdGx5IHZlcnRpY2FsLiBJIGhhdmUgdHJpZWQgdG8ga2VlcCB0aGlzCgkvLyBzaW1wbGUuIG5vIGRvdWJ0IHRoaXMgY291bGQgYmVjb21lIGFsbW9zdCBpbmZpbml0aXZlIGNvbXBsZXgKCS8vIGFuZCBoYXZlIHNvbWUgcmVhbCBBSS4gRmVlbCBmcmVlIHRvIG1vZGlmeSB0aGlzLgoJLy8gVGhpcyB3aWxsIG5vLWRvdWJ0IGJlIHR3ZWFrZWQgYXMgdGltZXMgZ28gYnkuIE9uZSBkZXNpZ24gYWltCgkvLyBpcyB0byBhdm9pZCBoYXZpbmcgdGhlIHVzZXIgY2hvb3NlIHdoYXQgdHlwZXMgb2YgYXJyb3cKCS8vIGhlIHdhbnRzLgoKCS8vIFRoZSBhcnJvdyBpcyBkcmF3biBiZXR3ZWVuICh4MSx5MSkgdG8gKHgyLHkyKQoJJHgxID0gJHRoaXMtPml4MSA7CgkkeDIgPSAkdGhpcy0+aXgyIDsKCSR5MSA9ICR0aGlzLT5peTEgOwoJJHkyID0gJHRoaXMtPml5MiA7CgoJLy8gRGVwZW5kaW5nIG9uIGlmIHRoZSB0YXJnZXQgaXMgYmVsb3cgb3IgYWJvdmUgd2UgaGF2ZSB0bwoJLy8gaGFuZGxlIHRoaSBkaWZmZXJlbnQuCglpZiggJHkyID4gJHkxICkgewoJICAgICRhcnJvd3R5cGUgPSBBUlJPV19ET1dOOwoJICAgICRtaWR5ID0gcm91bmQoKCR5Mi0keTEpLzIrJHkxKTsKCSAgICBpZiggJHgyID4gJHgxICkgewoJCXN3aXRjaCAoICR0aGlzLT5pUGF0aFR5cGUgICkgewoJCSAgICBjYXNlIDA6CgkJCSRjID0gYXJyYXkoJHgxLCR5MSwkeDEsJG1pZHksJHgyLCRtaWR5LCR4MiwkeTIpOwoJCQlicmVhazsKCQkgICAgY2FzZSAxOgoJCSAgICBjYXNlIDI6CgkJICAgIGNhc2UgMzoKCQkJJGMgPSBhcnJheSgkeDEsJHkxLCR4MiwkeTEsJHgyLCR5Mik7CgkJCWJyZWFrOwoJCSAgICBkZWZhdWx0OgoJCQlKcEdyYXBoRXJyb3I6OlJhaXNlTCg2MDMyLCR0aGlzLT5pUGF0aFR5cGUpOwovLygnSW50ZXJuYWwgZXJyb3I6IFVua25vd24gcGF0aCB0eXBlICg9Jy4kdGhpcy0+aVBhdGhUeXBlIC4nKSBzcGVjaWZpZWQgZm9yIGxpbmsuJyk7CgkJCWV4aXQoMSk7CgkJCWJyZWFrOwoJCX0KCSAgICB9CgkgICAgZWxzZSB7CgkJc3dpdGNoICggJHRoaXMtPmlQYXRoVHlwZSAgKSB7CgkJICAgIGNhc2UgMDoKCQkgICAgY2FzZSAxOgoJCQkkYyA9IGFycmF5KCR4MSwkeTEsJHgxLCRtaWR5LCR4MiwkbWlkeSwkeDIsJHkyKTsKCQkJYnJlYWs7CgkJICAgIGNhc2UgMjoKCQkJLy8gQWx3YXlzIGV4dGVuZCBvdXQgaG9yaXpvbnRhbGx5IGEgYml0IGZyb20gdGhlIGZpcnN0IHBvaW50CgkJCS8vIElmIHdlIGRyYXcgYSBsaW5rIGJhY2sgaW4gdGltZSAoZW5kIHRvIHN0YXJ0KSBhbmQgdGhlIGJhcnMgCgkJCS8vIGFyZSB2ZXJ5IGNsb3NlIHdlIGFsc28gY2hhbmdlIHRoZSBwYXRoIHNvIGl0IGNvbWVzIGluIGZyb20gCgkJCS8vIHRoZSBsZWZ0IG9uIHRoZSBhY3Rpdml0eQoJCQkkYyA9IGFycmF5KCR4MSwkeTEsJHgxKyR0aGlzLT5pUGF0aEV4dGVuZCwkeTEsCgkJCQkgICAkeDErJHRoaXMtPmlQYXRoRXh0ZW5kLCRtaWR5LAoJCQkJICAgJHgyLCRtaWR5LCR4MiwkeTIpOwoJCQlicmVhazsKCQkgICAgY2FzZSAzOgoJCQlpZiggJHkyLSRtaWR5IDwgNiApIHsKCQkJICAgICRjID0gYXJyYXkoJHgxLCR5MSwkeDEsJG1pZHksCgkJCQkgICAgICAgJHgyLSR0aGlzLT5pUGF0aEV4dGVuZCwkbWlkeSwKCQkJCSAgICAgICAkeDItJHRoaXMtPmlQYXRoRXh0ZW5kLCR5MiwKCQkJCSAgICAgICAkeDIsJHkyKTsKCQkJICAgICRhcnJvd3R5cGUgPSBBUlJPV19SSUdIVDsKCQkJfQoJCQllbHNlIHsKCQkJICAgICRjID0gYXJyYXkoJHgxLCR5MSwkeDEsJG1pZHksJHgyLCRtaWR5LCR4MiwkeTIpOwoJCQl9CgkJCWJyZWFrOwoJCSAgICBkZWZhdWx0OgoJCQlKcEdyYXBoRXJyb3I6OlJhaXNlTCg2MDMyLCR0aGlzLT5pUGF0aFR5cGUpOwovLygnSW50ZXJuYWwgZXJyb3I6IFVua25vd24gcGF0aCB0eXBlIHNwZWNpZmllZCBmb3IgbGluay4nKTsKCQkJZXhpdCgxKTsKCQkJYnJlYWs7CgkJfQoJICAgIH0KCSAgICAkYXJyb3cgPSBuZXcgTGlua0Fycm93KCR4MiwkeTIsJGFycm93dHlwZSk7Cgl9CgllbHNlIHsKCSAgICAvLyBZMiA8IFkxCgkgICAgJGFycm93dHlwZSA9IEFSUk9XX1VQOwoJICAgICRtaWR5ID0gcm91bmQoKCR5MS0keTIpLzIrJHkyKTsKCSAgICBpZiggJHgyID4gJHgxICkgewoJCXN3aXRjaCAoICR0aGlzLT5pUGF0aFR5cGUgICkgewoJCSAgICBjYXNlIDA6CgkJICAgIGNhc2UgMToKCQkJJGMgPSBhcnJheSgkeDEsJHkxLCR4MSwkbWlkeSwkeDIsJG1pZHksJHgyLCR5Mik7CgkJCWJyZWFrOwoJCSAgICBjYXNlIDM6CgkJCWlmKCAkbWlkeS0keTIgPCA4ICkgewoJCQkgICAgJGFycm93dHlwZSA9IEFSUk9XX1JJR0hUOwoJCQkgICAgJGMgPSBhcnJheSgkeDEsJHkxLCR4MSwkeTIsJHgyLCR5Mik7CgkJCX0KCQkJZWxzZSB7CgkJCSAgICAkYyA9IGFycmF5KCR4MSwkeTEsJHgxLCRtaWR5LCR4MiwkbWlkeSwkeDIsJHkyKTsKCQkJfQoJCQlicmVhazsKCQkgICAgZGVmYXVsdDoKCQkJSnBHcmFwaEVycm9yOjpSYWlzZUwoNjAzMiwkdGhpcy0+aVBhdGhUeXBlKTsKLy8oJ0ludGVybmFsIGVycm9yOiBVbmtub3duIHBhdGggdHlwZSBzcGVjaWZpZWQgZm9yIGxpbmsuJyk7CgkJCWJyZWFrOwoJCX0KCSAgICB9CgkgICAgZWxzZSB7CgkJc3dpdGNoICggJHRoaXMtPmlQYXRoVHlwZSAgKSB7CgkJICAgIGNhc2UgMDoKCQkgICAgY2FzZSAxOgoJCQkkYyA9IGFycmF5KCR4MSwkeTEsJHgxLCRtaWR5LCR4MiwkbWlkeSwkeDIsJHkyKTsKCQkJYnJlYWs7CgkJICAgIGNhc2UgMjoKCQkJLy8gQWx3YXlzIGV4dGVuZCBvdXQgaG9yaXpvbnRhbGx5IGEgYml0IGZyb20gdGhlIGZpcnN0IHBvaW50CgkJCSRjID0gYXJyYXkoJHgxLCR5MSwkeDErJHRoaXMtPmlQYXRoRXh0ZW5kLCR5MSwKCQkJCSAgICR4MSskdGhpcy0+aVBhdGhFeHRlbmQsJG1pZHksCgkJCQkgICAkeDIsJG1pZHksJHgyLCR5Mik7CgkJCWJyZWFrOwoJCSAgICBjYXNlIDM6CgkJCWlmKCAkbWlkeS0keTIgPCAxNiApIHsKCQkJICAgICRhcnJvd3R5cGUgPSBBUlJPV19SSUdIVDsKCQkJICAgICRjID0gYXJyYXkoJHgxLCR5MSwkeDEsJG1pZHksJHgyLSR0aGlzLT5pUGF0aEV4dGVuZCwkbWlkeSwKCQkJCSAgICAgICAkeDItJHRoaXMtPmlQYXRoRXh0ZW5kLCR5MiwKCQkJCSAgICAgICAkeDIsJHkyKTsKCQkJfQoJCQllbHNlIHsKCQkJICAgICRjID0gYXJyYXkoJHgxLCR5MSwkeDEsJG1pZHksJHgyLCRtaWR5LCR4MiwkeTIpOwoJCQl9CgkJCWJyZWFrOwoJCSAgICBkZWZhdWx0OgoJCQlKcEdyYXBoRXJyb3I6OlJhaXNlTCg2MDMyLCR0aGlzLT5pUGF0aFR5cGUpOwovLygnSW50ZXJuYWwgZXJyb3I6IFVua25vd24gcGF0aCB0eXBlIHNwZWNpZmllZCBmb3IgbGluay4nKTsKCQkJYnJlYWs7CgkJfQoJICAgIH0KCSAgICAkYXJyb3cgPSBuZXcgTGlua0Fycm93KCR4MiwkeTIsJGFycm93dHlwZSk7Cgl9CgkkYUltZy0+U2V0Q29sb3IoJHRoaXMtPmlDb2xvcik7CgkkYUltZy0+U2V0TGluZVdlaWdodCgkdGhpcy0+aVdlaWdodCk7CgkkYUltZy0+UG9seWdvbigkYyk7CgkkYUltZy0+U2V0TGluZVdlaWdodCgxKTsKCSRhcnJvdy0+U2V0Q29sb3IoJHRoaXMtPmlDb2xvcik7CgkkYXJyb3ctPlNldFNpemUoJHRoaXMtPmlBcnJvd1NpemUpOwoJJGFycm93LT5TZXRUeXBlKCR0aGlzLT5pQXJyb3dUeXBlKTsKCSRhcnJvdy0+U3Ryb2tlKCRhSW1nKTsKICAgIH0KfQoKLy8gPEVPRj4KPz4K