Ly8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCgojaW5jbHVkZSAiUHVibGljTWV0aG9kcy5oIgoKI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvZnNka19tZ3IuaCIgIC8vIEZvciBDUERGRG9jX0Vudmlyb25tZW50LgojaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9qYXZhc2NyaXB0L0lKYXZhU2NyaXB0LmgiCiNpbmNsdWRlICJGaWVsZC5oIgojaW5jbHVkZSAiSlNfQ29udGV4dC5oIgojaW5jbHVkZSAiSlNfRGVmaW5lLmgiCiNpbmNsdWRlICJKU19FdmVudEhhbmRsZXIuaCIKI2luY2x1ZGUgIkpTX09iamVjdC5oIgojaW5jbHVkZSAiSlNfUnVudGltZS5oIgojaW5jbHVkZSAiSlNfVmFsdWUuaCIKI2luY2x1ZGUgImNvbG9yLmgiCiNpbmNsdWRlICJyZXNvdXJjZS5oIgojaW5jbHVkZSAidXRpbC5oIgoKc3RhdGljIHY4OjpJc29sYXRlKiBHZXRJc29sYXRlKElKU19Db250ZXh0KiBjYykgewogIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7CiAgQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwoKICBDSlNfUnVudGltZSogcFJ1bnRpbWUgPSBwQ29udGV4dC0+R2V0SlNSdW50aW1lKCk7CiAgQVNTRVJUKHBSdW50aW1lICE9IE5VTEwpOwoKICByZXR1cm4gcFJ1bnRpbWUtPkdldElzb2xhdGUoKTsKfQoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ0pTX1B1YmxpY01ldGhvZHMKICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCiNkZWZpbmUgRE9VQkxFX0NPUlJFQ1QgMC4wMDAwMDAwMDAwMDAwMDEKCkJFR0lOX0pTX1NUQVRJQ19HTE9CQUxfRlVOKENKU19QdWJsaWNNZXRob2RzKQpKU19TVEFUSUNfR0xPQkFMX0ZVTl9FTlRSWShBRk51bWJlcl9Gb3JtYXQpCkpTX1NUQVRJQ19HTE9CQUxfRlVOX0VOVFJZKEFGTnVtYmVyX0tleXN0cm9rZSkKSlNfU1RBVElDX0dMT0JBTF9GVU5fRU5UUlkoQUZQZXJjZW50X0Zvcm1hdCkKSlNfU1RBVElDX0dMT0JBTF9GVU5fRU5UUlkoQUZQZXJjZW50X0tleXN0cm9rZSkKSlNfU1RBVElDX0dMT0JBTF9GVU5fRU5UUlkoQUZEYXRlX0Zvcm1hdEV4KQpKU19TVEFUSUNfR0xPQkFMX0ZVTl9FTlRSWShBRkRhdGVfS2V5c3Ryb2tlRXgpCkpTX1NUQVRJQ19HTE9CQUxfRlVOX0VOVFJZKEFGRGF0ZV9Gb3JtYXQpCkpTX1NUQVRJQ19HTE9CQUxfRlVOX0VOVFJZKEFGRGF0ZV9LZXlzdHJva2UpCkpTX1NUQVRJQ19HTE9CQUxfRlVOX0VOVFJZKEFGVGltZV9Gb3JtYXRFeCkKSlNfU1RBVElDX0dMT0JBTF9GVU5fRU5UUlkoQUZUaW1lX0tleXN0cm9rZUV4KQpKU19TVEFUSUNfR0xPQkFMX0ZVTl9FTlRSWShBRlRpbWVfRm9ybWF0KQpKU19TVEFUSUNfR0xPQkFMX0ZVTl9FTlRSWShBRlRpbWVfS2V5c3Ryb2tlKQpKU19TVEFUSUNfR0xPQkFMX0ZVTl9FTlRSWShBRlNwZWNpYWxfRm9ybWF0KQpKU19TVEFUSUNfR0xPQkFMX0ZVTl9FTlRSWShBRlNwZWNpYWxfS2V5c3Ryb2tlKQpKU19TVEFUSUNfR0xPQkFMX0ZVTl9FTlRSWShBRlNwZWNpYWxfS2V5c3Ryb2tlRXgpCkpTX1NUQVRJQ19HTE9CQUxfRlVOX0VOVFJZKEFGU2ltcGxlKQpKU19TVEFUSUNfR0xPQkFMX0ZVTl9FTlRSWShBRk1ha2VOdW1iZXIpCkpTX1NUQVRJQ19HTE9CQUxfRlVOX0VOVFJZKEFGU2ltcGxlX0NhbGN1bGF0ZSkKSlNfU1RBVElDX0dMT0JBTF9GVU5fRU5UUlkoQUZSYW5nZV9WYWxpZGF0ZSkKSlNfU1RBVElDX0dMT0JBTF9GVU5fRU5UUlkoQUZNZXJnZUNoYW5nZSkKSlNfU1RBVElDX0dMT0JBTF9GVU5fRU5UUlkoQUZQYXJzZURhdGVFeCkKSlNfU1RBVElDX0dMT0JBTF9GVU5fRU5UUlkoQUZFeHRyYWN0TnVtcykKRU5EX0pTX1NUQVRJQ19HTE9CQUxfRlVOKCkKCklNUExFTUVOVF9KU19TVEFUSUNfR0xPQkFMX0ZVTihDSlNfUHVibGljTWV0aG9kcykKCnN0YXRpYyBjb25zdCBGWF9XQ0hBUiogbW9udGhzW10gPSB7TCJKYW4iLCBMIkZlYiIsIEwiTWFyIiwgTCJBcHIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwiTWF5IiwgTCJKdW4iLCBMIkp1bCIsIEwiQXVnIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMIlNlcCIsIEwiT2N0IiwgTCJOb3YiLCBMIkRlYyJ9OwoKc3RhdGljIGNvbnN0IEZYX1dDSEFSKiBmdWxsbW9udGhzW10gPSB7TCJKYW51YXJ5IiwgTCJGZWJydWFyeSIsIEwiTWFyY2giLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMIkFwcmlsIiwgICBMIk1heSIsICAgICAgTCJKdW5lIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJKdWx5IiwgICAgTCJBdWd1c3QiLCAgIEwiU2VwdGVtYmVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJPY3RvYmVyIiwgTCJOb3ZlbWJlciIsIEwiRGVjZW1iZXIifTsKCkZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OklzTnVtYmVyKGNvbnN0IEZYX1dDSEFSKiBzdHJpbmcpIHsKICBDRlhfV2lkZVN0cmluZyBzVHJpbSA9IFN0clRyaW0oc3RyaW5nKTsKICBjb25zdCBGWF9XQ0hBUiogcFRyaW0gPSBzVHJpbS5jX3N0cigpOwogIGNvbnN0IEZYX1dDSEFSKiBwID0gcFRyaW07CgogIEZYX0JPT0wgYkRvdCA9IEZBTFNFOwogIEZYX0JPT0wgYktYSlMgPSBGQUxTRTsKCiAgd2NoYXJfdCBjOwogIHdoaWxlICgoYyA9ICpwKSkgewogICAgaWYgKGMgPT0gJy4nIHx8IGMgPT0gJywnKSB7CiAgICAgIGlmIChiRG90KQogICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgYkRvdCA9IFRSVUU7CiAgICB9IGVsc2UgaWYgKGMgPT0gJy0nIHx8IGMgPT0gJysnKSB7CiAgICAgIGlmIChwICE9IHBUcmltKQogICAgICAgIHJldHVybiBGQUxTRTsKICAgIH0gZWxzZSBpZiAoYyA9PSAnZScgfHwgYyA9PSAnRScpIHsKICAgICAgaWYgKGJLWEpTKQogICAgICAgIHJldHVybiBGQUxTRTsKCiAgICAgIHArKzsKICAgICAgYyA9ICpwOwogICAgICBpZiAoYyA9PSAnKycgfHwgYyA9PSAnLScpIHsKICAgICAgICBiS1hKUyA9IFRSVUU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICB9CiAgICB9IGVsc2UgaWYgKCFJc0RpZ2l0KGMpKSB7CiAgICAgIHJldHVybiBGQUxTRTsKICAgIH0KICAgIHArKzsKICB9CgogIHJldHVybiBUUlVFOwp9CgpGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpJc0RpZ2l0KHdjaGFyX3QgY2gpIHsKICByZXR1cm4gKGNoID49IEwnMCcgJiYgY2ggPD0gTCc5Jyk7Cn0KCkZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OklzRGlnaXQoY2hhciBjaCkgewogIHJldHVybiAoY2ggPj0gJzAnICYmIGNoIDw9ICc5Jyk7Cn0KCkZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OklzQWxwaGFiZXRpYyh3Y2hhcl90IGNoKSB7CiAgcmV0dXJuICgoY2ggPj0gTCdhJyAmJiBjaCA8PSBMJ3onKSB8fCAoY2ggPj0gTCdBJyAmJiBjaCA8PSBMJ1onKSk7Cn0KCkZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OklzQWxwaGFOdW1lcmljKHdjaGFyX3QgY2gpIHsKICByZXR1cm4gKElzRGlnaXQoY2gpIHx8IElzQWxwaGFiZXRpYyhjaCkpOwp9CgpGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjptYXNrU2F0aXNmaWVkKHdjaGFyX3QgY19DaGFuZ2UsIHdjaGFyX3QgY19NYXNrKSB7CiAgc3dpdGNoIChjX01hc2spIHsKICAgIGNhc2UgTCc5JzoKICAgICAgcmV0dXJuIElzRGlnaXQoY19DaGFuZ2UpOwogICAgY2FzZSBMJ0EnOgogICAgICByZXR1cm4gSXNBbHBoYWJldGljKGNfQ2hhbmdlKTsKICAgIGNhc2UgTCdPJzoKICAgICAgcmV0dXJuIElzQWxwaGFOdW1lcmljKGNfQ2hhbmdlKTsKICAgIGNhc2UgTCdYJzoKICAgICAgcmV0dXJuIFRSVUU7CiAgICBkZWZhdWx0OgogICAgICByZXR1cm4gKGNfQ2hhbmdlID09IGNfTWFzayk7CiAgfQp9CgpGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjppc1Jlc2VydmVkTWFza0NoYXIod2NoYXJfdCBjaCkgewogIHJldHVybiBjaCA9PSBMJzknIHx8IGNoID09IEwnQScgfHwgY2ggPT0gTCdPJyB8fCBjaCA9PSBMJ1gnOwp9Cgpkb3VibGUgQ0pTX1B1YmxpY01ldGhvZHM6OkFGX1NpbXBsZShjb25zdCBGWF9XQ0hBUiogc0Z1Y3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBkVmFsdWUxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgZFZhbHVlMikgewogIGlmIChGWFNZU193Y3NpY21wKHNGdWN0aW9uLCBMIkFWRyIpID09IDAgfHwKICAgICAgRlhTWVNfd2NzaWNtcChzRnVjdGlvbiwgTCJTVU0iKSA9PSAwKSB7CiAgICByZXR1cm4gZFZhbHVlMSArIGRWYWx1ZTI7CiAgfQogIGlmIChGWFNZU193Y3NpY21wKHNGdWN0aW9uLCBMIlBSRCIpID09IDApIHsKICAgIHJldHVybiBkVmFsdWUxICogZFZhbHVlMjsKICB9CiAgaWYgKEZYU1lTX3djc2ljbXAoc0Z1Y3Rpb24sIEwiTUlOIikgPT0gMCkgewogICAgcmV0dXJuIEZYX01JTihkVmFsdWUxLCBkVmFsdWUyKTsKICB9CiAgaWYgKEZYU1lTX3djc2ljbXAoc0Z1Y3Rpb24sIEwiTUFYIikgPT0gMCkgewogICAgcmV0dXJuIEZYX01BWChkVmFsdWUxLCBkVmFsdWUyKTsKICB9CiAgcmV0dXJuIGRWYWx1ZTE7Cn0KCkNGWF9XaWRlU3RyaW5nIENKU19QdWJsaWNNZXRob2RzOjpTdHJMVHJpbShjb25zdCBGWF9XQ0hBUiogcFN0cikgewogIHdoaWxlICgqcFN0ciAmJiAqcFN0ciA9PSBMJyAnKQogICAgcFN0cisrOwoKICByZXR1cm4gcFN0cjsKfQoKQ0ZYX1dpZGVTdHJpbmcgQ0pTX1B1YmxpY01ldGhvZHM6OlN0clJUcmltKGNvbnN0IEZYX1dDSEFSKiBwU3RyKSB7CiAgY29uc3QgRlhfV0NIQVIqIHAgPSBwU3RyOwogIHdoaWxlICgqcCkKICAgIHArKzsKICB3aGlsZSAocCA+IHBTdHIgJiYgKihwIC0gMSkgPT0gTCcgJykKICAgIHAtLTsKCiAgcmV0dXJuIENGWF9XaWRlU3RyaW5nKHBTdHIsIHAgLSBwU3RyKTsKfQoKQ0ZYX1dpZGVTdHJpbmcgQ0pTX1B1YmxpY01ldGhvZHM6OlN0clRyaW0oY29uc3QgRlhfV0NIQVIqIHBTdHIpIHsKICByZXR1cm4gU3RyUlRyaW0oU3RyTFRyaW0ocFN0cikuY19zdHIoKSk7Cn0KCkNGWF9CeXRlU3RyaW5nIENKU19QdWJsaWNNZXRob2RzOjpTdHJMVHJpbShjb25zdCBGWF9DSEFSKiBwU3RyKSB7CiAgd2hpbGUgKCpwU3RyICYmICpwU3RyID09ICcgJykKICAgIHBTdHIrKzsKCiAgcmV0dXJuIHBTdHI7Cn0KCkNGWF9CeXRlU3RyaW5nIENKU19QdWJsaWNNZXRob2RzOjpTdHJSVHJpbShjb25zdCBGWF9DSEFSKiBwU3RyKSB7CiAgY29uc3QgRlhfQ0hBUiogcCA9IHBTdHI7CiAgd2hpbGUgKCpwKQogICAgcCsrOwogIHdoaWxlIChwID4gcFN0ciAmJiAqKHAgLSAxKSA9PSBMJyAnKQogICAgcC0tOwoKICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmcocFN0ciwgcCAtIHBTdHIpOwp9CgpDRlhfQnl0ZVN0cmluZyBDSlNfUHVibGljTWV0aG9kczo6U3RyVHJpbShjb25zdCBGWF9DSEFSKiBwU3RyKSB7CiAgcmV0dXJuIFN0clJUcmltKFN0ckxUcmltKHBTdHIpKTsKfQoKZG91YmxlIENKU19QdWJsaWNNZXRob2RzOjpQYXJzZU51bWJlcihjb25zdCBGWF9XQ0hBUiogc3dTb3VyY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCYgYkFsbERpZ2l0cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MJiBiRG90LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wmIGJTaWduLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wmIGJLWEpTKSB7CiAgYkRvdCA9IEZBTFNFOwogIGJTaWduID0gRkFMU0U7CiAgYktYSlMgPSBGQUxTRTsKCiAgRlhfQk9PTCBiRGlnaXRFeGlzdCA9IEZBTFNFOwoKICBjb25zdCBGWF9XQ0hBUiogcCA9IHN3U291cmNlOwogIHdjaGFyX3QgYzsKCiAgY29uc3QgRlhfV0NIQVIqIHBTdGFydCA9IE5VTEw7CiAgY29uc3QgRlhfV0NIQVIqIHBFbmQgPSBOVUxMOwoKICB3aGlsZSAoKGMgPSAqcCkpIHsKICAgIGlmICghcFN0YXJ0ICYmIGMgIT0gTCcgJykgewogICAgICBwU3RhcnQgPSBwOwogICAgfQoKICAgIHBFbmQgPSBwOwogICAgcCsrOwogIH0KCiAgaWYgKCFwU3RhcnQpIHsKICAgIGJBbGxEaWdpdHMgPSBGQUxTRTsKICAgIHJldHVybiAwOwogIH0KCiAgd2hpbGUgKHBFbmQgIT0gcFN0YXJ0KSB7CiAgICBpZiAoKnBFbmQgPT0gTCcgJykKICAgICAgcEVuZC0tOwogICAgZWxzZQogICAgICBicmVhazsKICB9CgogIGRvdWJsZSBkUmV0ID0gMDsKICBwID0gcFN0YXJ0OwogIGJBbGxEaWdpdHMgPSBUUlVFOwogIENGWF9XaWRlU3RyaW5nIHN3RGlnaXRzOwoKICB3aGlsZSAocCA8PSBwRW5kKSB7CiAgICBjID0gKnA7CgogICAgaWYgKElzRGlnaXQoYykpIHsKICAgICAgc3dEaWdpdHMgKz0gYzsKICAgICAgYkRpZ2l0RXhpc3QgPSBUUlVFOwogICAgfSBlbHNlIHsKICAgICAgc3dpdGNoIChjKSB7CiAgICAgICAgY2FzZSBMJyAnOgogICAgICAgICAgYkFsbERpZ2l0cyA9IEZBTFNFOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBMJy4nOgogICAgICAgIGNhc2UgTCcsJzoKICAgICAgICAgIGlmICghYkRvdCkgewogICAgICAgICAgICBpZiAoYkRpZ2l0RXhpc3QpIHsKICAgICAgICAgICAgICBzd0RpZ2l0cyArPSBMJy4nOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHN3RGlnaXRzICs9IEwnMCc7CiAgICAgICAgICAgICAgc3dEaWdpdHMgKz0gTCcuJzsKICAgICAgICAgICAgICBiRGlnaXRFeGlzdCA9IFRSVUU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGJEb3QgPSBUUlVFOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICBjYXNlICdlJzoKICAgICAgICBjYXNlICdFJzoKICAgICAgICAgIGlmICghYktYSlMpIHsKICAgICAgICAgICAgcCsrOwogICAgICAgICAgICBjID0gKnA7CiAgICAgICAgICAgIGlmIChjID09ICcrJyB8fCBjID09ICctJykgewogICAgICAgICAgICAgIGJLWEpTID0gVFJVRTsKICAgICAgICAgICAgICBzd0RpZ2l0cyArPSAnZSc7CiAgICAgICAgICAgICAgc3dEaWdpdHMgKz0gYzsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICBjYXNlIEwnLSc6CiAgICAgICAgICBpZiAoIWJEaWdpdEV4aXN0ICYmICFiU2lnbikgewogICAgICAgICAgICBzd0RpZ2l0cyArPSBjOwogICAgICAgICAgICBiU2lnbiA9IFRSVUU7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICBiQWxsRGlnaXRzID0gRkFMU0U7CgogICAgICAgICAgaWYgKHAgIT0gcFN0YXJ0ICYmICFiRG90ICYmIGJEaWdpdEV4aXN0KSB7CiAgICAgICAgICAgIHN3RGlnaXRzICs9IEwnLic7CiAgICAgICAgICAgIGJEb3QgPSBUUlVFOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgYkRvdCA9IEZBTFNFOwogICAgICAgICAgICBiRGlnaXRFeGlzdCA9IEZBTFNFOwogICAgICAgICAgICBzd0RpZ2l0cyA9IEwiIjsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CgogICAgcCsrOwogIH0KCiAgaWYgKHN3RGlnaXRzLkdldExlbmd0aCgpID4gMCAmJiBzd0RpZ2l0cy5HZXRMZW5ndGgoKSA8IDE3KSB7CiAgICBDRlhfQnl0ZVN0cmluZyBzRGlnaXRzID0gc3dEaWdpdHMuVVRGOEVuY29kZSgpOwoKICAgIGlmIChiS1hKUykgewogICAgICBkUmV0ID0gYXRvZihzRGlnaXRzKTsKICAgIH0gZWxzZSB7CiAgICAgIGlmIChiRG90KSB7CiAgICAgICAgY2hhciogcFN0b3BTdHJpbmc7CiAgICAgICAgZFJldCA9IDo6c3RydG9kKHNEaWdpdHMsICZwU3RvcFN0cmluZyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZFJldCA9IGF0b2woc0RpZ2l0cyk7CiAgICAgIH0KICAgIH0KICB9CgogIHJldHVybiBkUmV0Owp9Cgpkb3VibGUgQ0pTX1B1YmxpY01ldGhvZHM6OlBhcnNlU3RyaW5nVG9OdW1iZXIoY29uc3QgRlhfV0NIQVIqIHN3U291cmNlKSB7CiAgRlhfQk9PTCBiQWxsRGlnaXRzID0gRkFMU0U7CiAgRlhfQk9PTCBiRG90ID0gRkFMU0U7CiAgRlhfQk9PTCBiU2lnbiA9IEZBTFNFOwogIEZYX0JPT0wgYktYSlMgPSBGQUxTRTsKCiAgcmV0dXJuIFBhcnNlTnVtYmVyKHN3U291cmNlLCBiQWxsRGlnaXRzLCBiRG90LCBiU2lnbiwgYktYSlMpOwp9CgpGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpDb252ZXJ0U3RyaW5nVG9OdW1iZXIoY29uc3QgRlhfV0NIQVIqIHN3U291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlJiBkUmV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCYgYkRvdCkgewogIEZYX0JPT0wgYkFsbERpZ2l0cyA9IEZBTFNFOwogIEZYX0JPT0wgYlNpZ24gPSBGQUxTRTsKICBGWF9CT09MIGJLWEpTID0gRkFMU0U7CgogIGRSZXQgPSBQYXJzZU51bWJlcihzd1NvdXJjZSwgYkFsbERpZ2l0cywgYkRvdCwgYlNpZ24sIGJLWEpTKTsKCiAgcmV0dXJuIGJBbGxEaWdpdHM7Cn0KCkNKU19BcnJheSBDSlNfUHVibGljTWV0aG9kczo6QUZfTWFrZUFycmF5RnJvbUxpc3Qodjg6Oklzb2xhdGUqIGlzb2xhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlIHZhbCkgewogIENKU19BcnJheSBTdHJBcnJheShpc29sYXRlKTsKICBpZiAodmFsLklzQXJyYXlPYmplY3QoKSkgewogICAgdmFsLkNvbnZlcnRUb0FycmF5KFN0ckFycmF5KTsKICAgIHJldHVybiBTdHJBcnJheTsKICB9CiAgQ0ZYX1dpZGVTdHJpbmcgd3NTdHIgPSB2YWwuVG9DRlhXaWRlU3RyaW5nKCk7CiAgQ0ZYX0J5dGVTdHJpbmcgdCA9IENGWF9CeXRlU3RyaW5nOjpGcm9tVW5pY29kZSh3c1N0cik7CiAgY29uc3QgY2hhciogcCA9IChjb25zdCBjaGFyKil0OwoKICBpbnQgY2ggPSAnLCc7CiAgaW50IG5JbmRleCA9IDA7CgogIHdoaWxlICgqcCkgewogICAgY29uc3QgY2hhciogcFRlbXAgPSBzdHJjaHIocCwgY2gpOwogICAgaWYgKHBUZW1wID09IE5VTEwpIHsKICAgICAgU3RyQXJyYXkuU2V0RWxlbWVudChuSW5kZXgsIENKU19WYWx1ZShpc29sYXRlLCBTdHJUcmltKHApLmNfc3RyKCkpKTsKICAgICAgYnJlYWs7CiAgICB9IGVsc2UgewogICAgICBjaGFyKiBwU3ViID0gbmV3IGNoYXJbcFRlbXAgLSBwICsgMV07CiAgICAgIHN0cm5jcHkocFN1YiwgcCwgcFRlbXAgLSBwKTsKICAgICAgKihwU3ViICsgKHBUZW1wIC0gcCkpID0gJ1wwJzsKCiAgICAgIFN0ckFycmF5LlNldEVsZW1lbnQobkluZGV4LCBDSlNfVmFsdWUoaXNvbGF0ZSwgU3RyVHJpbShwU3ViKS5jX3N0cigpKSk7CiAgICAgIGRlbGV0ZVtdIHBTdWI7CgogICAgICBuSW5kZXgrKzsKICAgICAgcCA9ICsrcFRlbXA7CiAgICB9CiAgfQogIHJldHVybiBTdHJBcnJheTsKfQoKaW50IENKU19QdWJsaWNNZXRob2RzOjpQYXJzZVN0cmluZ0ludGVnZXIoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0cmluZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5TdGFydCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50JiBuU2tpcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5NYXhTdGVwKSB7CiAgaW50IG5SZXQgPSAwOwogIG5Ta2lwID0gMDsKICBmb3IgKGludCBpID0gblN0YXJ0LCBzeiA9IHN0cmluZy5HZXRMZW5ndGgoKTsgaSA8IHN6OyBpKyspIHsKICAgIGlmIChpIC0gblN0YXJ0ID4gMTApCiAgICAgIGJyZWFrOwoKICAgIEZYX1dDSEFSIGMgPSBzdHJpbmcuR2V0QXQoaSk7CiAgICBpZiAoSXNEaWdpdCgod2NoYXJfdCljKSkgewogICAgICBuUmV0ID0gblJldCAqIDEwICsgKGMgLSAnMCcpOwogICAgICBuU2tpcCA9IGkgLSBuU3RhcnQgKyAxOwogICAgICBpZiAoblNraXAgPj0gbk1heFN0ZXApCiAgICAgICAgYnJlYWs7CiAgICB9IGVsc2UKICAgICAgYnJlYWs7CiAgfQoKICByZXR1cm4gblJldDsKfQoKQ0ZYX1dpZGVTdHJpbmcgQ0pTX1B1YmxpY01ldGhvZHM6OlBhcnNlU3RyaW5nU3RyaW5nKAogICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0cmluZywKICAgIGludCBuU3RhcnQsCiAgICBpbnQmIG5Ta2lwKSB7CiAgQ0ZYX1dpZGVTdHJpbmcgc3dSZXQ7CiAgblNraXAgPSAwOwogIGZvciAoaW50IGkgPSBuU3RhcnQsIHN6ID0gc3RyaW5nLkdldExlbmd0aCgpOyBpIDwgc3o7IGkrKykgewogICAgRlhfV0NIQVIgYyA9IHN0cmluZy5HZXRBdChpKTsKICAgIGlmICgoYyA+PSBMJ2EnICYmIGMgPD0gTCd6JykgfHwgKGMgPj0gTCdBJyAmJiBjIDw9IEwnWicpKSB7CiAgICAgIHN3UmV0ICs9IGM7CiAgICAgIG5Ta2lwID0gaSAtIG5TdGFydCArIDE7CiAgICB9IGVsc2UKICAgICAgYnJlYWs7CiAgfQoKICByZXR1cm4gc3dSZXQ7Cn0KCmRvdWJsZSBDSlNfUHVibGljTWV0aG9kczo6UGFyc2VOb3JtYWxEYXRlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB2YWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCYgYldyb25nRm9ybWF0KSB7CiAgZG91YmxlIGR0ID0gSlNfR2V0RGF0ZVRpbWUoKTsKCiAgaW50IG5ZZWFyID0gSlNfR2V0WWVhckZyb21UaW1lKGR0KTsKICBpbnQgbk1vbnRoID0gSlNfR2V0TW9udGhGcm9tVGltZShkdCkgKyAxOwogIGludCBuRGF5ID0gSlNfR2V0RGF5RnJvbVRpbWUoZHQpOwogIGludCBuSG91ciA9IEpTX0dldEhvdXJGcm9tVGltZShkdCk7CiAgaW50IG5NaW4gPSBKU19HZXRNaW5Gcm9tVGltZShkdCk7CiAgaW50IG5TZWMgPSBKU19HZXRTZWNGcm9tVGltZShkdCk7CgogIGludCBudW1iZXJbM107CgogIGludCBuU2tpcCA9IDA7CiAgaW50IG5MZW4gPSB2YWx1ZS5HZXRMZW5ndGgoKTsKICBpbnQgbkluZGV4ID0gMDsKICBpbnQgaSA9IDA7CiAgd2hpbGUgKGkgPCBuTGVuKSB7CiAgICBpZiAobkluZGV4ID4gMikKICAgICAgYnJlYWs7CgogICAgRlhfV0NIQVIgYyA9IHZhbHVlLkdldEF0KGkpOwogICAgaWYgKElzRGlnaXQoKHdjaGFyX3QpYykpIHsKICAgICAgbnVtYmVyW25JbmRleCsrXSA9IFBhcnNlU3RyaW5nSW50ZWdlcih2YWx1ZSwgaSwgblNraXAsIDQpOwogICAgICBpICs9IG5Ta2lwOwogICAgfSBlbHNlIHsKICAgICAgaSsrOwogICAgfQogIH0KCiAgaWYgKG5JbmRleCA9PSAyKSB7CiAgICAvLyBjYXNlMjogbW9udGgvZGF5CiAgICAvLyBjYXNlMzogZGF5L21vbnRoCiAgICBpZiAoKG51bWJlclswXSA+PSAxICYmIG51bWJlclswXSA8PSAxMikgJiYKICAgICAgICAobnVtYmVyWzFdID49IDEgJiYgbnVtYmVyWzFdIDw9IDMxKSkgewogICAgICBuTW9udGggPSBudW1iZXJbMF07CiAgICAgIG5EYXkgPSBudW1iZXJbMV07CiAgICB9IGVsc2UgaWYgKChudW1iZXJbMF0gPj0gMSAmJiBudW1iZXJbMF0gPD0gMzEpICYmCiAgICAgICAgICAgICAgIChudW1iZXJbMV0gPj0gMSAmJiBudW1iZXJbMV0gPD0gMTIpKSB7CiAgICAgIG5EYXkgPSBudW1iZXJbMF07CiAgICAgIG5Nb250aCA9IG51bWJlclsxXTsKICAgIH0KCiAgICBiV3JvbmdGb3JtYXQgPSBGQUxTRTsKICB9IGVsc2UgaWYgKG5JbmRleCA9PSAzKSB7CiAgICAvLyBjYXNlMTogeWVhci9tb250aC9kYXkKICAgIC8vIGNhc2UyOiBtb250aC9kYXkveWVhcgogICAgLy8gY2FzZTM6IGRheS9tb250aC95ZWFyCgogICAgaWYgKG51bWJlclswXSA+IDEyICYmIChudW1iZXJbMV0gPj0gMSAmJiBudW1iZXJbMV0gPD0gMTIpICYmCiAgICAgICAgKG51bWJlclsyXSA+PSAxICYmIG51bWJlclsyXSA8PSAzMSkpIHsKICAgICAgblllYXIgPSBudW1iZXJbMF07CiAgICAgIG5Nb250aCA9IG51bWJlclsxXTsKICAgICAgbkRheSA9IG51bWJlclsyXTsKICAgIH0gZWxzZSBpZiAoKG51bWJlclswXSA+PSAxICYmIG51bWJlclswXSA8PSAxMikgJiYKICAgICAgICAgICAgICAgKG51bWJlclsxXSA+PSAxICYmIG51bWJlclsxXSA8PSAzMSkgJiYgbnVtYmVyWzJdID4gMzEpIHsKICAgICAgbk1vbnRoID0gbnVtYmVyWzBdOwogICAgICBuRGF5ID0gbnVtYmVyWzFdOwogICAgICBuWWVhciA9IG51bWJlclsyXTsKICAgIH0gZWxzZSBpZiAoKG51bWJlclswXSA+PSAxICYmIG51bWJlclswXSA8PSAzMSkgJiYKICAgICAgICAgICAgICAgKG51bWJlclsxXSA+PSAxICYmIG51bWJlclsxXSA8PSAxMikgJiYgbnVtYmVyWzJdID4gMzEpIHsKICAgICAgbkRheSA9IG51bWJlclswXTsKICAgICAgbk1vbnRoID0gbnVtYmVyWzFdOwogICAgICBuWWVhciA9IG51bWJlclsyXTsKICAgIH0KCiAgICBiV3JvbmdGb3JtYXQgPSBGQUxTRTsKICB9IGVsc2UgewogICAgYldyb25nRm9ybWF0ID0gVFJVRTsKICAgIHJldHVybiBkdDsKICB9CgogIENGWF9XaWRlU3RyaW5nIHN3VGVtcDsKICBzd1RlbXAuRm9ybWF0KEwiJWQvJWQvJWQgJWQ6JWQ6JWQiLCBuTW9udGgsIG5EYXksIG5ZZWFyLCBuSG91ciwgbk1pbiwgblNlYyk7CiAgcmV0dXJuIEpTX0RhdGVQYXJzZShzd1RlbXAuY19zdHIoKSk7Cn0KCmRvdWJsZSBDSlNfUHVibGljTWV0aG9kczo6TWFrZVJlZ3VsYXJEYXRlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB2YWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCYgYldyb25nRm9ybWF0KSB7CiAgZG91YmxlIGR0ID0gSlNfR2V0RGF0ZVRpbWUoKTsKCiAgaWYgKGZvcm1hdC5Jc0VtcHR5KCkgfHwgdmFsdWUuSXNFbXB0eSgpKQogICAgcmV0dXJuIGR0OwoKICBpbnQgblllYXIgPSBKU19HZXRZZWFyRnJvbVRpbWUoZHQpOwogIGludCBuTW9udGggPSBKU19HZXRNb250aEZyb21UaW1lKGR0KSArIDE7CiAgaW50IG5EYXkgPSBKU19HZXREYXlGcm9tVGltZShkdCk7CiAgaW50IG5Ib3VyID0gSlNfR2V0SG91ckZyb21UaW1lKGR0KTsKICBpbnQgbk1pbiA9IEpTX0dldE1pbkZyb21UaW1lKGR0KTsKICBpbnQgblNlYyA9IEpTX0dldFNlY0Zyb21UaW1lKGR0KTsKCiAgaW50IG5ZZWFyU3ViID0gOTk7ICAvLyBuWWVhciAtIDIwMDA7CgogIEZYX0JPT0wgYlBtID0gRkFMU0U7CiAgRlhfQk9PTCBiRXhpdCA9IEZBTFNFOwogIGJXcm9uZ0Zvcm1hdCA9IEZBTFNFOwoKICBpbnQgaSA9IDA7CiAgaW50IGogPSAwOwoKICB3aGlsZSAoaSA8IGZvcm1hdC5HZXRMZW5ndGgoKSkgewogICAgaWYgKGJFeGl0KQogICAgICBicmVhazsKCiAgICBGWF9XQ0hBUiBjID0gZm9ybWF0LkdldEF0KGkpOwogICAgc3dpdGNoIChjKSB7CiAgICAgIGNhc2UgJzonOgogICAgICBjYXNlICcuJzoKICAgICAgY2FzZSAnLSc6CiAgICAgIGNhc2UgJ1xcJzoKICAgICAgY2FzZSAnLyc6CiAgICAgICAgaSsrOwogICAgICAgIGorKzsKICAgICAgICBicmVhazsKCiAgICAgIGNhc2UgJ3knOgogICAgICBjYXNlICdtJzoKICAgICAgY2FzZSAnZCc6CiAgICAgIGNhc2UgJ0gnOgogICAgICBjYXNlICdoJzoKICAgICAgY2FzZSAnTSc6CiAgICAgIGNhc2UgJ3MnOgogICAgICBjYXNlICd0JzogewogICAgICAgIGludCBvbGRqID0gajsKICAgICAgICBpbnQgblNraXAgPSAwOwogICAgICAgIGludCByZW1haW5pbmcgPSBmb3JtYXQuR2V0TGVuZ3RoKCkgLSBpIC0gMTsKCiAgICAgICAgaWYgKHJlbWFpbmluZyA9PSAwIHx8IGZvcm1hdC5HZXRBdChpICsgMSkgIT0gYykgewogICAgICAgICAgc3dpdGNoIChjKSB7CiAgICAgICAgICAgIGNhc2UgJ3knOgogICAgICAgICAgICAgIGkrKzsKICAgICAgICAgICAgICBqKys7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ20nOgogICAgICAgICAgICAgIG5Nb250aCA9IFBhcnNlU3RyaW5nSW50ZWdlcih2YWx1ZSwgaiwgblNraXAsIDIpOwogICAgICAgICAgICAgIGkrKzsKICAgICAgICAgICAgICBqICs9IG5Ta2lwOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdkJzoKICAgICAgICAgICAgICBuRGF5ID0gUGFyc2VTdHJpbmdJbnRlZ2VyKHZhbHVlLCBqLCBuU2tpcCwgMik7CiAgICAgICAgICAgICAgaSsrOwogICAgICAgICAgICAgIGogKz0gblNraXA7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ0gnOgogICAgICAgICAgICAgIG5Ib3VyID0gUGFyc2VTdHJpbmdJbnRlZ2VyKHZhbHVlLCBqLCBuU2tpcCwgMik7CiAgICAgICAgICAgICAgaSsrOwogICAgICAgICAgICAgIGogKz0gblNraXA7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ2gnOgogICAgICAgICAgICAgIG5Ib3VyID0gUGFyc2VTdHJpbmdJbnRlZ2VyKHZhbHVlLCBqLCBuU2tpcCwgMik7CiAgICAgICAgICAgICAgaSsrOwogICAgICAgICAgICAgIGogKz0gblNraXA7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ00nOgogICAgICAgICAgICAgIG5NaW4gPSBQYXJzZVN0cmluZ0ludGVnZXIodmFsdWUsIGosIG5Ta2lwLCAyKTsKICAgICAgICAgICAgICBpKys7CiAgICAgICAgICAgICAgaiArPSBuU2tpcDsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAncyc6CiAgICAgICAgICAgICAgblNlYyA9IFBhcnNlU3RyaW5nSW50ZWdlcih2YWx1ZSwgaiwgblNraXAsIDIpOwogICAgICAgICAgICAgIGkrKzsKICAgICAgICAgICAgICBqICs9IG5Ta2lwOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICd0JzoKICAgICAgICAgICAgICBiUG0gPSAoaiA8IHZhbHVlLkdldExlbmd0aCgpICYmIHZhbHVlLkdldEF0KGopID09ICdwJyk7CiAgICAgICAgICAgICAgaSsrOwogICAgICAgICAgICAgIGorKzsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKHJlbWFpbmluZyA9PSAxIHx8IGZvcm1hdC5HZXRBdChpICsgMikgIT0gYykgewogICAgICAgICAgc3dpdGNoIChjKSB7CiAgICAgICAgICAgIGNhc2UgJ3knOgogICAgICAgICAgICAgIG5ZZWFyID0gUGFyc2VTdHJpbmdJbnRlZ2VyKHZhbHVlLCBqLCBuU2tpcCwgNCk7CiAgICAgICAgICAgICAgaSArPSAyOwogICAgICAgICAgICAgIGogKz0gblNraXA7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ20nOgogICAgICAgICAgICAgIG5Nb250aCA9IFBhcnNlU3RyaW5nSW50ZWdlcih2YWx1ZSwgaiwgblNraXAsIDIpOwogICAgICAgICAgICAgIGkgKz0gMjsKICAgICAgICAgICAgICBqICs9IG5Ta2lwOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdkJzoKICAgICAgICAgICAgICBuRGF5ID0gUGFyc2VTdHJpbmdJbnRlZ2VyKHZhbHVlLCBqLCBuU2tpcCwgMik7CiAgICAgICAgICAgICAgaSArPSAyOwogICAgICAgICAgICAgIGogKz0gblNraXA7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ0gnOgogICAgICAgICAgICAgIG5Ib3VyID0gUGFyc2VTdHJpbmdJbnRlZ2VyKHZhbHVlLCBqLCBuU2tpcCwgMik7CiAgICAgICAgICAgICAgaSArPSAyOwogICAgICAgICAgICAgIGogKz0gblNraXA7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ2gnOgogICAgICAgICAgICAgIG5Ib3VyID0gUGFyc2VTdHJpbmdJbnRlZ2VyKHZhbHVlLCBqLCBuU2tpcCwgMik7CiAgICAgICAgICAgICAgaSArPSAyOwogICAgICAgICAgICAgIGogKz0gblNraXA7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ00nOgogICAgICAgICAgICAgIG5NaW4gPSBQYXJzZVN0cmluZ0ludGVnZXIodmFsdWUsIGosIG5Ta2lwLCAyKTsKICAgICAgICAgICAgICBpICs9IDI7CiAgICAgICAgICAgICAgaiArPSBuU2tpcDsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAncyc6CiAgICAgICAgICAgICAgblNlYyA9IFBhcnNlU3RyaW5nSW50ZWdlcih2YWx1ZSwgaiwgblNraXAsIDIpOwogICAgICAgICAgICAgIGkgKz0gMjsKICAgICAgICAgICAgICBqICs9IG5Ta2lwOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICd0JzoKICAgICAgICAgICAgICBiUG0gPSAoaiArIDEgPCB2YWx1ZS5HZXRMZW5ndGgoKSAmJiB2YWx1ZS5HZXRBdChqKSA9PSAncCcgJiYKICAgICAgICAgICAgICAgICAgICAgdmFsdWUuR2V0QXQoaiArIDEpID09ICdtJyk7CiAgICAgICAgICAgICAgaSArPSAyOwogICAgICAgICAgICAgIGogKz0gMjsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKHJlbWFpbmluZyA9PSAyIHx8IGZvcm1hdC5HZXRBdChpICsgMykgIT0gYykgewogICAgICAgICAgc3dpdGNoIChjKSB7CiAgICAgICAgICAgIGNhc2UgJ20nOiB7CiAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgc01vbnRoID0gUGFyc2VTdHJpbmdTdHJpbmcodmFsdWUsIGosIG5Ta2lwKTsKICAgICAgICAgICAgICBGWF9CT09MIGJGaW5kID0gRkFMU0U7CiAgICAgICAgICAgICAgZm9yIChpbnQgbSA9IDA7IG0gPCAxMjsgbSsrKSB7CiAgICAgICAgICAgICAgICBpZiAoc01vbnRoLkNvbXBhcmVOb0Nhc2UobW9udGhzW21dKSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgIG5Nb250aCA9IG0gKyAxOwogICAgICAgICAgICAgICAgICBpICs9IDM7CiAgICAgICAgICAgICAgICAgIGogKz0gblNraXA7CiAgICAgICAgICAgICAgICAgIGJGaW5kID0gVFJVRTsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICBpZiAoIWJGaW5kKSB7CiAgICAgICAgICAgICAgICBuTW9udGggPSBQYXJzZVN0cmluZ0ludGVnZXIodmFsdWUsIGosIG5Ta2lwLCAzKTsKICAgICAgICAgICAgICAgIGkgKz0gMzsKICAgICAgICAgICAgICAgIGogKz0gblNraXA7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGJyZWFrOwogICAgICAgICAgICBjYXNlICd5JzoKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICBpICs9IDM7CiAgICAgICAgICAgICAgaiArPSAzOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAocmVtYWluaW5nID09IDMgfHwgZm9ybWF0LkdldEF0KGkgKyA0KSAhPSBjKSB7CiAgICAgICAgICBzd2l0Y2ggKGMpIHsKICAgICAgICAgICAgY2FzZSAneSc6CiAgICAgICAgICAgICAgblllYXIgPSBQYXJzZVN0cmluZ0ludGVnZXIodmFsdWUsIGosIG5Ta2lwLCA0KTsKICAgICAgICAgICAgICBqICs9IG5Ta2lwOwogICAgICAgICAgICAgIGkgKz0gNDsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnbSc6IHsKICAgICAgICAgICAgICBGWF9CT09MIGJGaW5kID0gRkFMU0U7CgogICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHNNb250aCA9IFBhcnNlU3RyaW5nU3RyaW5nKHZhbHVlLCBqLCBuU2tpcCk7CiAgICAgICAgICAgICAgc01vbnRoLk1ha2VMb3dlcigpOwoKICAgICAgICAgICAgICBmb3IgKGludCBtID0gMDsgbSA8IDEyOyBtKyspIHsKICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHNGdWxsTW9udGhzID0gZnVsbG1vbnRoc1ttXTsKICAgICAgICAgICAgICAgIHNGdWxsTW9udGhzLk1ha2VMb3dlcigpOwoKICAgICAgICAgICAgICAgIGlmIChzRnVsbE1vbnRocy5GaW5kKHNNb250aC5jX3N0cigpLCAwKSAhPSAtMSkgewogICAgICAgICAgICAgICAgICBuTW9udGggPSBtICsgMTsKICAgICAgICAgICAgICAgICAgaSArPSA0OwogICAgICAgICAgICAgICAgICBqICs9IG5Ta2lwOwogICAgICAgICAgICAgICAgICBiRmluZCA9IFRSVUU7CiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgaWYgKCFiRmluZCkgewogICAgICAgICAgICAgICAgbk1vbnRoID0gUGFyc2VTdHJpbmdJbnRlZ2VyKHZhbHVlLCBqLCBuU2tpcCwgNCk7CiAgICAgICAgICAgICAgICBpICs9IDQ7CiAgICAgICAgICAgICAgICBqICs9IG5Ta2lwOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBicmVhazsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICBpICs9IDQ7CiAgICAgICAgICAgICAgaiArPSA0OwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpZiAoaiA+PSB2YWx1ZS5HZXRMZW5ndGgoKSB8fCBmb3JtYXQuR2V0QXQoaSkgIT0gdmFsdWUuR2V0QXQoaikpIHsKICAgICAgICAgICAgYldyb25nRm9ybWF0ID0gVFJVRTsKICAgICAgICAgICAgYkV4aXQgPSBUUlVFOwogICAgICAgICAgfQogICAgICAgICAgaSsrOwogICAgICAgICAgaisrOwogICAgICAgIH0KCiAgICAgICAgaWYgKG9sZGogPT0gaikgewogICAgICAgICAgYldyb25nRm9ybWF0ID0gVFJVRTsKICAgICAgICAgIGJFeGl0ID0gVFJVRTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGJyZWFrOwogICAgICBkZWZhdWx0OgogICAgICAgIGlmICh2YWx1ZS5HZXRMZW5ndGgoKSA8PSBqKSB7CiAgICAgICAgICBiRXhpdCA9IFRSVUU7CiAgICAgICAgfSBlbHNlIGlmIChmb3JtYXQuR2V0QXQoaSkgIT0gdmFsdWUuR2V0QXQoaikpIHsKICAgICAgICAgIGJXcm9uZ0Zvcm1hdCA9IFRSVUU7CiAgICAgICAgICBiRXhpdCA9IFRSVUU7CiAgICAgICAgfQoKICAgICAgICBpKys7CiAgICAgICAgaisrOwogICAgICAgIGJyZWFrOwogICAgfQogIH0KCiAgaWYgKGJQbSkKICAgIG5Ib3VyICs9IDEyOwoKICBpZiAoblllYXIgPj0gMCAmJiBuWWVhciA8PSBuWWVhclN1YikKICAgIG5ZZWFyICs9IDIwMDA7CgogIGlmIChuTW9udGggPCAxIHx8IG5Nb250aCA+IDEyKQogICAgYldyb25nRm9ybWF0ID0gVFJVRTsKCiAgaWYgKG5EYXkgPCAxIHx8IG5EYXkgPiAzMSkKICAgIGJXcm9uZ0Zvcm1hdCA9IFRSVUU7CgogIGlmIChuSG91ciA8IDAgfHwgbkhvdXIgPiAyNCkKICAgIGJXcm9uZ0Zvcm1hdCA9IFRSVUU7CgogIGlmIChuTWluIDwgMCB8fCBuTWluID4gNjApCiAgICBiV3JvbmdGb3JtYXQgPSBUUlVFOwoKICBpZiAoblNlYyA8IDAgfHwgblNlYyA+IDYwKQogICAgYldyb25nRm9ybWF0ID0gVFJVRTsKCiAgZG91YmxlIGRSZXQgPSAwOwoKICBpZiAoYldyb25nRm9ybWF0KSB7CiAgICBkUmV0ID0gUGFyc2VOb3JtYWxEYXRlKHZhbHVlLCBiV3JvbmdGb3JtYXQpOwogIH0gZWxzZSB7CiAgICBkUmV0ID0gSlNfTWFrZURhdGUoSlNfTWFrZURheShuWWVhciwgbk1vbnRoIC0gMSwgbkRheSksCiAgICAgICAgICAgICAgICAgICAgICAgSlNfTWFrZVRpbWUobkhvdXIsIG5NaW4sIG5TZWMsIDApKTsKCiAgICBpZiAoSlNfUG9ydElzTmFuKGRSZXQpKSB7CiAgICAgIGRSZXQgPSBKU19EYXRlUGFyc2UodmFsdWUuY19zdHIoKSk7CiAgICB9CiAgfQoKICBpZiAoSlNfUG9ydElzTmFuKGRSZXQpKSB7CiAgICBkUmV0ID0gUGFyc2VOb3JtYWxEYXRlKHZhbHVlLCBiV3JvbmdGb3JtYXQpOwogIH0KCiAgcmV0dXJuIGRSZXQ7Cn0KCkNGWF9XaWRlU3RyaW5nIENKU19QdWJsaWNNZXRob2RzOjpNYWtlRm9ybWF0RGF0ZShkb3VibGUgZERhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgZm9ybWF0KSB7CiAgQ0ZYX1dpZGVTdHJpbmcgc1JldCA9IEwiIiwgc1BhcnQgPSBMIiI7CgogIGludCBuWWVhciA9IEpTX0dldFllYXJGcm9tVGltZShkRGF0ZSk7CiAgaW50IG5Nb250aCA9IEpTX0dldE1vbnRoRnJvbVRpbWUoZERhdGUpICsgMTsKICBpbnQgbkRheSA9IEpTX0dldERheUZyb21UaW1lKGREYXRlKTsKICBpbnQgbkhvdXIgPSBKU19HZXRIb3VyRnJvbVRpbWUoZERhdGUpOwogIGludCBuTWluID0gSlNfR2V0TWluRnJvbVRpbWUoZERhdGUpOwogIGludCBuU2VjID0gSlNfR2V0U2VjRnJvbVRpbWUoZERhdGUpOwoKICBpbnQgaSA9IDA7CiAgd2hpbGUgKGkgPCBmb3JtYXQuR2V0TGVuZ3RoKCkpIHsKICAgIEZYX1dDSEFSIGMgPSBmb3JtYXQuR2V0QXQoaSk7CiAgICBpbnQgcmVtYWluaW5nID0gZm9ybWF0LkdldExlbmd0aCgpIC0gaSAtIDE7CiAgICBzUGFydCA9IEwiIjsKICAgIHN3aXRjaCAoYykgewogICAgICBjYXNlICd5JzoKICAgICAgY2FzZSAnbSc6CiAgICAgIGNhc2UgJ2QnOgogICAgICBjYXNlICdIJzoKICAgICAgY2FzZSAnaCc6CiAgICAgIGNhc2UgJ00nOgogICAgICBjYXNlICdzJzoKICAgICAgY2FzZSAndCc6CiAgICAgICAgaWYgKHJlbWFpbmluZyA9PSAwIHx8IGZvcm1hdC5HZXRBdChpICsgMSkgIT0gYykgewogICAgICAgICAgc3dpdGNoIChjKSB7CiAgICAgICAgICAgIGNhc2UgJ3knOgogICAgICAgICAgICAgIHNQYXJ0ICs9IGM7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ20nOgogICAgICAgICAgICAgIHNQYXJ0LkZvcm1hdChMIiVkIiwgbk1vbnRoKTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnZCc6CiAgICAgICAgICAgICAgc1BhcnQuRm9ybWF0KEwiJWQiLCBuRGF5KTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnSCc6CiAgICAgICAgICAgICAgc1BhcnQuRm9ybWF0KEwiJWQiLCBuSG91cik7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ2gnOgogICAgICAgICAgICAgIHNQYXJ0LkZvcm1hdChMIiVkIiwgbkhvdXIgPiAxMiA/IG5Ib3VyIC0gMTIgOiBuSG91cik7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ00nOgogICAgICAgICAgICAgIHNQYXJ0LkZvcm1hdChMIiVkIiwgbk1pbik7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ3MnOgogICAgICAgICAgICAgIHNQYXJ0LkZvcm1hdChMIiVkIiwgblNlYyk7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ3QnOgogICAgICAgICAgICAgIHNQYXJ0ICs9IG5Ib3VyID4gMTIgPyAncCcgOiAnYSc7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBpKys7CiAgICAgICAgfSBlbHNlIGlmIChyZW1haW5pbmcgPT0gMSB8fCBmb3JtYXQuR2V0QXQoaSArIDIpICE9IGMpIHsKICAgICAgICAgIHN3aXRjaCAoYykgewogICAgICAgICAgICBjYXNlICd5JzoKICAgICAgICAgICAgICBzUGFydC5Gb3JtYXQoTCIlMDJkIiwgblllYXIgLSAoblllYXIgLyAxMDApICogMTAwKTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnbSc6CiAgICAgICAgICAgICAgc1BhcnQuRm9ybWF0KEwiJTAyZCIsIG5Nb250aCk7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ2QnOgogICAgICAgICAgICAgIHNQYXJ0LkZvcm1hdChMIiUwMmQiLCBuRGF5KTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnSCc6CiAgICAgICAgICAgICAgc1BhcnQuRm9ybWF0KEwiJTAyZCIsIG5Ib3VyKTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnaCc6CiAgICAgICAgICAgICAgc1BhcnQuRm9ybWF0KEwiJTAyZCIsIG5Ib3VyID4gMTIgPyBuSG91ciAtIDEyIDogbkhvdXIpOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdNJzoKICAgICAgICAgICAgICBzUGFydC5Gb3JtYXQoTCIlMDJkIiwgbk1pbik7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ3MnOgogICAgICAgICAgICAgIHNQYXJ0LkZvcm1hdChMIiUwMmQiLCBuU2VjKTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAndCc6CiAgICAgICAgICAgICAgc1BhcnQgPSBuSG91ciA+IDEyID8gTCJwbSIgOiBMImFtIjsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIGkgKz0gMjsKICAgICAgICB9IGVsc2UgaWYgKHJlbWFpbmluZyA9PSAyIHx8IGZvcm1hdC5HZXRBdChpICsgMykgIT0gYykgewogICAgICAgICAgc3dpdGNoIChjKSB7CiAgICAgICAgICAgIGNhc2UgJ20nOgogICAgICAgICAgICAgIGkgKz0gMzsKICAgICAgICAgICAgICBpZiAobk1vbnRoID4gMCAmJiBuTW9udGggPD0gMTIpCiAgICAgICAgICAgICAgICBzUGFydCArPSBtb250aHNbbk1vbnRoIC0gMV07CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgaSArPSAzOwogICAgICAgICAgICAgIHNQYXJ0ICs9IGM7CiAgICAgICAgICAgICAgc1BhcnQgKz0gYzsKICAgICAgICAgICAgICBzUGFydCArPSBjOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAocmVtYWluaW5nID09IDMgfHwgZm9ybWF0LkdldEF0KGkgKyA0KSAhPSBjKSB7CiAgICAgICAgICBzd2l0Y2ggKGMpIHsKICAgICAgICAgICAgY2FzZSAneSc6CiAgICAgICAgICAgICAgc1BhcnQuRm9ybWF0KEwiJTA0ZCIsIG5ZZWFyKTsKICAgICAgICAgICAgICBpICs9IDQ7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ20nOgogICAgICAgICAgICAgIGkgKz0gNDsKICAgICAgICAgICAgICBpZiAobk1vbnRoID4gMCAmJiBuTW9udGggPD0gMTIpCiAgICAgICAgICAgICAgICBzUGFydCArPSBmdWxsbW9udGhzW25Nb250aCAtIDFdOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgIGkgKz0gNDsKICAgICAgICAgICAgICBzUGFydCArPSBjOwogICAgICAgICAgICAgIHNQYXJ0ICs9IGM7CiAgICAgICAgICAgICAgc1BhcnQgKz0gYzsKICAgICAgICAgICAgICBzUGFydCArPSBjOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpKys7CiAgICAgICAgICBzUGFydCArPSBjOwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgICAgZGVmYXVsdDoKICAgICAgICBpKys7CiAgICAgICAgc1BhcnQgKz0gYzsKICAgICAgICBicmVhazsKICAgIH0KCiAgICBzUmV0ICs9IHNQYXJ0OwogIH0KCiAgcmV0dXJuIHNSZXQ7Cn0KCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovLyBmdW5jdGlvbiBBRk51bWJlcl9Gb3JtYXQobkRlYywgc2VwU3R5bGUsIG5lZ1N0eWxlLCBjdXJyU3R5bGUsIHN0ckN1cnJlbmN5LAovLyBiQ3VycmVuY3lQcmVwZW5kKQpGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpBRk51bWJlcl9Gb3JtYXQoSUpTX0NvbnRleHQqIGNjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKI2lmIF9GWF9PU18gIT0gX0ZYX0FORFJPSURfCiAgdjg6Oklzb2xhdGUqIGlzb2xhdGUgPSA6OkdldElzb2xhdGUoY2MpOwogIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7CiAgQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwogIENKU19FdmVudEhhbmRsZXIqIHBFdmVudCA9IHBDb250ZXh0LT5HZXRFdmVudEhhbmRsZXIoKTsKICBBU1NFUlQocEV2ZW50ICE9IE5VTEwpOwoKICBpZiAocGFyYW1zLnNpemUoKSAhPSA2KSB7CiAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNRVJST1IpOwogICAgcmV0dXJuIEZBTFNFOwogIH0KICBpZiAoIXBFdmVudC0+bV9wVmFsdWUpCiAgICByZXR1cm4gRkFMU0U7CiAgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlID0gcEV2ZW50LT5WYWx1ZSgpOwogIENGWF9CeXRlU3RyaW5nIHN0clZhbHVlID0gU3RyVHJpbShDRlhfQnl0ZVN0cmluZzo6RnJvbVVuaWNvZGUoVmFsdWUpKTsKCiAgaWYgKHN0clZhbHVlLklzRW1wdHkoKSkKICAgIHJldHVybiBUUlVFOwoKICBpbnQgaURlYyA9IHBhcmFtc1swXS5Ub0ludCgpOwogIGludCBpU2VwU3R5bGUgPSBwYXJhbXNbMV0uVG9JbnQoKTsKICBpbnQgaU5lZ1N0eWxlID0gcGFyYW1zWzJdLlRvSW50KCk7CiAgLy8gcGFyYW1zWzNdIGlzIGlDdXJyU3R5bGUsIGl0J3Mgbm90IHVzZWQuCiAgc3RkOjp3c3RyaW5nIHdzdHJDdXJyZW5jeShwYXJhbXNbNF0uVG9DRlhXaWRlU3RyaW5nKCkuY19zdHIoKSk7CiAgRlhfQk9PTCBiQ3VycmVuY3lQcmVwZW5kID0gcGFyYW1zWzVdLlRvQm9vbCgpOwoKICBpZiAoaURlYyA8IDApCiAgICBpRGVjID0gLWlEZWM7CgogIGlmIChpU2VwU3R5bGUgPCAwIHx8IGlTZXBTdHlsZSA+IDMpCiAgICBpU2VwU3R5bGUgPSAwOwoKICBpZiAoaU5lZ1N0eWxlIDwgMCB8fCBpTmVnU3R5bGUgPiAzKQogICAgaU5lZ1N0eWxlID0gMDsKCiAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgLy8gZm9yIHByb2Nlc3NpbmcgZGVjaW1hbCBwbGFjZXMKICBzdHJWYWx1ZS5SZXBsYWNlKCIsIiwgIi4iKTsKICBkb3VibGUgZFZhbHVlID0gYXRvZihzdHJWYWx1ZSk7CiAgaWYgKGlEZWMgPiAwKQogICAgZFZhbHVlICs9IERPVUJMRV9DT1JSRUNUOwoKICBpbnQgaURlYzI7CiAgaW50IGlOZWdhdGl2ZSA9IDA7CgogIHN0clZhbHVlID0gZmN2dChkVmFsdWUsIGlEZWMsICZpRGVjMiwgJmlOZWdhdGl2ZSk7CiAgaWYgKHN0clZhbHVlLklzRW1wdHkoKSkgewogICAgZFZhbHVlID0gMDsKICAgIHN0clZhbHVlID0gZmN2dChkVmFsdWUsIGlEZWMsICZpRGVjMiwgJmlOZWdhdGl2ZSk7CiAgICBpZiAoc3RyVmFsdWUuSXNFbXB0eSgpKSB7CiAgICAgIHN0clZhbHVlID0gIjAiOwogICAgICBpRGVjMiA9IDE7CiAgICB9CiAgfQoKICBpZiAoaURlYzIgPCAwKSB7CiAgICBmb3IgKGludCBpTnVtID0gMDsgaU51bSA8IGFicyhpRGVjMik7IGlOdW0rKykgewogICAgICBzdHJWYWx1ZSA9ICIwIiArIHN0clZhbHVlOwogICAgfQogICAgaURlYzIgPSAwOwogIH0KICBpbnQgaU1heCA9IHN0clZhbHVlLkdldExlbmd0aCgpOwogIGlmIChpRGVjMiA+IGlNYXgpIHsKICAgIGZvciAoaW50IGlOdW0gPSAwOyBpTnVtIDw9IGlEZWMyIC0gaU1heDsgaU51bSsrKSB7CiAgICAgIHN0clZhbHVlICs9ICIwIjsKICAgIH0KICAgIGlNYXggPSBpRGVjMiArIDE7CiAgfQogIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAvLyBmb3IgcHJvY2Vzc2luZyBzZXBlcmF0b3Igc3R5bGUKICBpZiAoaURlYzIgPCBpTWF4KSB7CiAgICBpZiAoaVNlcFN0eWxlID09IDAgfHwgaVNlcFN0eWxlID09IDEpIHsKICAgICAgc3RyVmFsdWUuSW5zZXJ0KGlEZWMyLCAnLicpOwogICAgICBpTWF4Kys7CiAgICB9IGVsc2UgaWYgKGlTZXBTdHlsZSA9PSAyIHx8IGlTZXBTdHlsZSA9PSAzKSB7CiAgICAgIHN0clZhbHVlLkluc2VydChpRGVjMiwgJywnKTsKICAgICAgaU1heCsrOwogICAgfQoKICAgIGlmIChpRGVjMiA9PSAwKQogICAgICBzdHJWYWx1ZS5JbnNlcnQoaURlYzIsICcwJyk7CiAgfQogIGlmIChpU2VwU3R5bGUgPT0gMCB8fCBpU2VwU3R5bGUgPT0gMikgewogICAgY2hhciBjU2VwZXJhdG9yOwogICAgaWYgKGlTZXBTdHlsZSA9PSAwKQogICAgICBjU2VwZXJhdG9yID0gJywnOwogICAgZWxzZQogICAgICBjU2VwZXJhdG9yID0gJy4nOwoKICAgIGludCBpRGVjUG9zaXRpdmU7CiAgICBpRGVjUG9zaXRpdmUgPSBpRGVjMjsKCiAgICBmb3IgKGlEZWNQb3NpdGl2ZSA9IGlEZWMyIC0gMzsgaURlY1Bvc2l0aXZlID4gMDsgaURlY1Bvc2l0aXZlIC09IDMpIHsKICAgICAgc3RyVmFsdWUuSW5zZXJ0KGlEZWNQb3NpdGl2ZSwgY1NlcGVyYXRvcik7CiAgICAgIGlNYXgrKzsKICAgIH0KICB9CgogIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAvLyBmb3IgcHJvY2Vzc2luZyBjdXJyZW5jeSBzdHJpbmcKCiAgVmFsdWUgPSBDRlhfV2lkZVN0cmluZzo6RnJvbUxvY2FsKHN0clZhbHVlKTsKICBzdGQ6OndzdHJpbmcgc3RyVmFsdWUyID0gVmFsdWUuY19zdHIoKTsKCiAgaWYgKGJDdXJyZW5jeVByZXBlbmQpCiAgICBzdHJWYWx1ZTIgPSB3c3RyQ3VycmVuY3kgKyBzdHJWYWx1ZTI7CiAgZWxzZQogICAgc3RyVmFsdWUyID0gc3RyVmFsdWUyICsgd3N0ckN1cnJlbmN5OwoKICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgLy8gZm9yIHByb2Nlc3NpbmcgbmVnYXRpdmUgc3R5bGUKICBpZiAoaU5lZ2F0aXZlKSB7CiAgICBpZiAoaU5lZ1N0eWxlID09IDApIHsKICAgICAgc3RyVmFsdWUyLmluc2VydCgwLCBMIi0iKTsKICAgIH0KICAgIGlmIChpTmVnU3R5bGUgPT0gMiB8fCBpTmVnU3R5bGUgPT0gMykgewogICAgICBzdHJWYWx1ZTIuaW5zZXJ0KDAsIEwiKCIpOwogICAgICBzdHJWYWx1ZTIuaW5zZXJ0KHN0clZhbHVlMi5sZW5ndGgoKSwgTCIpIik7CiAgICB9CiAgICBpZiAoaU5lZ1N0eWxlID09IDEgfHwgaU5lZ1N0eWxlID09IDMpIHsKICAgICAgaWYgKEZpZWxkKiBmVGFyZ2V0ID0gcEV2ZW50LT5UYXJnZXRfRmllbGQoKSkgewogICAgICAgIENKU19BcnJheSBhckNvbG9yKGlzb2xhdGUpOwogICAgICAgIENKU19WYWx1ZSB2Q29sRWxtKGlzb2xhdGUpOwogICAgICAgIHZDb2xFbG0gPSBMIlJHQiI7CiAgICAgICAgYXJDb2xvci5TZXRFbGVtZW50KDAsIHZDb2xFbG0pOwogICAgICAgIHZDb2xFbG0gPSAxOwogICAgICAgIGFyQ29sb3IuU2V0RWxlbWVudCgxLCB2Q29sRWxtKTsKICAgICAgICB2Q29sRWxtID0gMDsKICAgICAgICBhckNvbG9yLlNldEVsZW1lbnQoMiwgdkNvbEVsbSk7CgogICAgICAgIGFyQ29sb3IuU2V0RWxlbWVudCgzLCB2Q29sRWxtKTsKCiAgICAgICAgQ0pTX1Byb3BWYWx1ZSB2UHJvcChpc29sYXRlKTsKICAgICAgICB2UHJvcC5TdGFydEdldHRpbmcoKTsKICAgICAgICB2UHJvcCA8PCBhckNvbG9yOwogICAgICAgIHZQcm9wLlN0YXJ0U2V0dGluZygpOwogICAgICAgIGZUYXJnZXQtPnRleHRDb2xvcihjYywgdlByb3AsIHNFcnJvcik7ICAvLyByZWQKICAgICAgfQogICAgfQogIH0gZWxzZSB7CiAgICBpZiAoaU5lZ1N0eWxlID09IDEgfHwgaU5lZ1N0eWxlID09IDMpIHsKICAgICAgaWYgKEZpZWxkKiBmVGFyZ2V0ID0gcEV2ZW50LT5UYXJnZXRfRmllbGQoKSkgewogICAgICAgIENKU19BcnJheSBhckNvbG9yKGlzb2xhdGUpOwogICAgICAgIENKU19WYWx1ZSB2Q29sRWxtKGlzb2xhdGUpOwogICAgICAgIHZDb2xFbG0gPSBMIlJHQiI7CiAgICAgICAgYXJDb2xvci5TZXRFbGVtZW50KDAsIHZDb2xFbG0pOwogICAgICAgIHZDb2xFbG0gPSAwOwogICAgICAgIGFyQ29sb3IuU2V0RWxlbWVudCgxLCB2Q29sRWxtKTsKICAgICAgICBhckNvbG9yLlNldEVsZW1lbnQoMiwgdkNvbEVsbSk7CiAgICAgICAgYXJDb2xvci5TZXRFbGVtZW50KDMsIHZDb2xFbG0pOwoKICAgICAgICBDSlNfUHJvcFZhbHVlIHZQcm9wKGlzb2xhdGUpOwogICAgICAgIHZQcm9wLlN0YXJ0R2V0dGluZygpOwogICAgICAgIGZUYXJnZXQtPnRleHRDb2xvcihjYywgdlByb3AsIHNFcnJvcik7CgogICAgICAgIENKU19BcnJheSBhUHJvcChpc29sYXRlKTsKICAgICAgICB2UHJvcC5Db252ZXJ0VG9BcnJheShhUHJvcCk7CgogICAgICAgIENQV0xfQ29sb3IgY3JQcm9wOwogICAgICAgIENQV0xfQ29sb3IgY3JDb2xvcjsKICAgICAgICBjb2xvcjo6Q29udmVydEFycmF5VG9QV0xDb2xvcihhUHJvcCwgY3JQcm9wKTsKICAgICAgICBjb2xvcjo6Q29udmVydEFycmF5VG9QV0xDb2xvcihhckNvbG9yLCBjckNvbG9yKTsKCiAgICAgICAgaWYgKGNyQ29sb3IgIT0gY3JQcm9wKSB7CiAgICAgICAgICBDSlNfUHJvcFZhbHVlIHZQcm9wMihpc29sYXRlKTsKICAgICAgICAgIHZQcm9wMi5TdGFydEdldHRpbmcoKTsKICAgICAgICAgIHZQcm9wMiA8PCBhckNvbG9yOwogICAgICAgICAgdlByb3AyLlN0YXJ0U2V0dGluZygpOwogICAgICAgICAgZlRhcmdldC0+dGV4dENvbG9yKGNjLCB2UHJvcDIsIHNFcnJvcik7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQogIFZhbHVlID0gc3RyVmFsdWUyLmNfc3RyKCk7CiNlbmRpZgogIHJldHVybiBUUlVFOwp9CgovLyBmdW5jdGlvbiBBRk51bWJlcl9LZXlzdHJva2UobkRlYywgc2VwU3R5bGUsIG5lZ1N0eWxlLCBjdXJyU3R5bGUsIHN0ckN1cnJlbmN5LAovLyBiQ3VycmVuY3lQcmVwZW5kKQpGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpBRk51bWJlcl9LZXlzdHJva2UoSUpTX0NvbnRleHQqIGNjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKICBDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOwogIEFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKICBDSlNfRXZlbnRIYW5kbGVyKiBwRXZlbnQgPSBwQ29udGV4dC0+R2V0RXZlbnRIYW5kbGVyKCk7CiAgQVNTRVJUKHBFdmVudCAhPSBOVUxMKTsKCiAgaWYgKHBhcmFtcy5zaXplKCkgPCAyKQogICAgcmV0dXJuIEZBTFNFOwogIGludCBpU2VwU3R5bGUgPSBwYXJhbXNbMV0uVG9JbnQoKTsKCiAgaWYgKGlTZXBTdHlsZSA8IDAgfHwgaVNlcFN0eWxlID4gMykKICAgIGlTZXBTdHlsZSA9IDA7CiAgaWYgKCFwRXZlbnQtPm1fcFZhbHVlKQogICAgcmV0dXJuIEZBTFNFOwogIENGWF9XaWRlU3RyaW5nJiB2YWwgPSBwRXZlbnQtPlZhbHVlKCk7CiAgQ0ZYX1dpZGVTdHJpbmcmIHdfc3RyQ2hhbmdlID0gcEV2ZW50LT5DaGFuZ2UoKTsKICBDRlhfV2lkZVN0cmluZyB3X3N0clZhbHVlID0gdmFsOwoKICBpZiAocEV2ZW50LT5XaWxsQ29tbWl0KCkpIHsKICAgIENGWF9XaWRlU3RyaW5nIHdzdHJDaGFuZ2UgPSB3X3N0ckNoYW5nZTsKICAgIENGWF9XaWRlU3RyaW5nIHdzdHJWYWx1ZSA9IFN0ckxUcmltKHdfc3RyVmFsdWUuY19zdHIoKSk7CiAgICBpZiAod3N0clZhbHVlLklzRW1wdHkoKSkKICAgICAgcmV0dXJuIFRSVUU7CgogICAgQ0ZYX1dpZGVTdHJpbmcgc3dUZW1wID0gd3N0clZhbHVlOwogICAgc3dUZW1wLlJlcGxhY2UoTCIsIiwgTCIuIik7CiAgICBpZiAoIUlzTnVtYmVyKHN3VGVtcC5jX3N0cigpKSkgewogICAgICBwRXZlbnQtPlJjKCkgPSBGQUxTRTsKICAgICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNBRk5VTUJFUl9LRVlTVFJPS0UpOwogICAgICBBbGVydChwQ29udGV4dCwgc0Vycm9yLmNfc3RyKCkpOwogICAgICByZXR1cm4gVFJVRTsKICAgIH0KICAgIHJldHVybiBUUlVFOyAgLy8gaXQgaGFwcGVucyBhZnRlciB0aGUgbGFzdCBrZXlzdHJva2UgYW5kIGJlZm9yZSB2YWxpZGF0aW5nLAogIH0KCiAgc3RkOjp3c3RyaW5nIHdfc3RyVmFsdWUyID0gd19zdHJWYWx1ZS5jX3N0cigpOwogIHN0ZDo6d3N0cmluZyB3X3N0ckNoYW5nZTIgPSB3X3N0ckNoYW5nZS5jX3N0cigpOwogIHN0ZDo6d3N0cmluZyB3X3N0clNlbGVjdGVkOwogIGlmICgtMSAhPSBwRXZlbnQtPlNlbFN0YXJ0KCkpCiAgICB3X3N0clNlbGVjdGVkID0gd19zdHJWYWx1ZTIuc3Vic3RyKHBFdmVudC0+U2VsU3RhcnQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBFdmVudC0+U2VsRW5kKCkgLSBwRXZlbnQtPlNlbFN0YXJ0KCkpKTsKICBib29sIGJIYXNTaWduID0gKHdfc3RyVmFsdWUyLmZpbmQoJy0nKSAhPSBzdGQ6OndzdHJpbmc6Om5wb3MpICYmCiAgICAgICAgICAgICAgICAgICh3X3N0clNlbGVjdGVkLmZpbmQoJy0nKSA9PSBzdGQ6OndzdHJpbmc6Om5wb3MpOwogIGlmIChiSGFzU2lnbikgewogICAgLy8gY2FuJ3QgaW5zZXJ0ICJjaGFuZ2UiIGluIGZyb250IHRvIHNpZ24gcG9zdGlvbi4KICAgIGlmIChwRXZlbnQtPlNlbFN0YXJ0KCkgPT0gMCkgewogICAgICBGWF9CT09MJiBiUmMgPSBwRXZlbnQtPlJjKCk7CiAgICAgIGJSYyA9IEZBTFNFOwogICAgICByZXR1cm4gVFJVRTsKICAgIH0KICB9CgogIGNoYXIgY1NlcCA9IEwnLic7CgogIHN3aXRjaCAoaVNlcFN0eWxlKSB7CiAgICBjYXNlIDA6CiAgICBjYXNlIDE6CiAgICAgIGNTZXAgPSBMJy4nOwogICAgICBicmVhazsKICAgIGNhc2UgMjoKICAgIGNhc2UgMzoKICAgICAgY1NlcCA9IEwnLCc7CiAgICAgIGJyZWFrOwogIH0KCiAgYm9vbCBiSGFzU2VwID0gKHdfc3RyVmFsdWUyLmZpbmQoY1NlcCkgIT0gc3RkOjp3c3RyaW5nOjpucG9zKTsKICBmb3IgKHN0ZDo6d3N0cmluZzo6aXRlcmF0b3IgaXQgPSB3X3N0ckNoYW5nZTIuYmVnaW4oKTsKICAgICAgIGl0ICE9IHdfc3RyQ2hhbmdlMi5lbmQoKTsgaXQrKykgewogICAgaWYgKCppdCA9PSBjU2VwKSB7CiAgICAgIGlmIChiSGFzU2VwKSB7CiAgICAgICAgRlhfQk9PTCYgYlJjID0gcEV2ZW50LT5SYygpOwogICAgICAgIGJSYyA9IEZBTFNFOwogICAgICAgIHJldHVybiBUUlVFOwogICAgICB9CiAgICAgIGJIYXNTZXAgPSBUUlVFOwogICAgICBjb250aW51ZTsKICAgIH0KICAgIGlmICgqaXQgPT0gTCctJykgewogICAgICBpZiAoYkhhc1NpZ24pIHsKICAgICAgICBGWF9CT09MJiBiUmMgPSBwRXZlbnQtPlJjKCk7CiAgICAgICAgYlJjID0gRkFMU0U7CiAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgIH0KICAgICAgaWYgKGl0ICE9IHdfc3RyQ2hhbmdlMi5iZWdpbigpKSAgLy8gc2lnbidzIHBvc2l0aW9uIGlzIG5vdCBjb3JyZWN0CiAgICAgIHsKICAgICAgICBGWF9CT09MJiBiUmMgPSBwRXZlbnQtPlJjKCk7CiAgICAgICAgYlJjID0gRkFMU0U7CiAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgIH0KICAgICAgaWYgKHBFdmVudC0+U2VsU3RhcnQoKSAhPSAwKSB7CiAgICAgICAgRlhfQk9PTCYgYlJjID0gcEV2ZW50LT5SYygpOwogICAgICAgIGJSYyA9IEZBTFNFOwogICAgICAgIHJldHVybiBUUlVFOwogICAgICB9CiAgICAgIGJIYXNTaWduID0gVFJVRTsKICAgICAgY29udGludWU7CiAgICB9CgogICAgaWYgKCFJc0RpZ2l0KCppdCkpIHsKICAgICAgRlhfQk9PTCYgYlJjID0gcEV2ZW50LT5SYygpOwogICAgICBiUmMgPSBGQUxTRTsKICAgICAgcmV0dXJuIFRSVUU7CiAgICB9CiAgfQoKICBzdGQ6OndzdHJpbmcgd19wcmVmaXggPSB3X3N0clZhbHVlMi5zdWJzdHIoMCwgcEV2ZW50LT5TZWxTdGFydCgpKTsKICBzdGQ6OndzdHJpbmcgd19wb3N0Zml4OwogIGlmIChwRXZlbnQtPlNlbEVuZCgpIDwgKGludCl3X3N0clZhbHVlMi5sZW5ndGgoKSkKICAgIHdfcG9zdGZpeCA9IHdfc3RyVmFsdWUyLnN1YnN0cihwRXZlbnQtPlNlbEVuZCgpKTsKICB3X3N0clZhbHVlMiA9IHdfcHJlZml4ICsgd19zdHJDaGFuZ2UyICsgd19wb3N0Zml4OwogIHdfc3RyVmFsdWUgPSB3X3N0clZhbHVlMi5jX3N0cigpOwogIHZhbCA9IHdfc3RyVmFsdWU7CiAgcmV0dXJuIFRSVUU7Cn0KCi8vIGZ1bmN0aW9uIEFGUGVyY2VudF9Gb3JtYXQobkRlYywgc2VwU3R5bGUpCkZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGUGVyY2VudF9Gb3JtYXQoSUpTX0NvbnRleHQqIGNjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKI2lmIF9GWF9PU18gIT0gX0ZYX0FORFJPSURfCiAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKICBBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CiAgQ0pTX0V2ZW50SGFuZGxlciogcEV2ZW50ID0gcENvbnRleHQtPkdldEV2ZW50SGFuZGxlcigpOwogIEFTU0VSVChwRXZlbnQgIT0gTlVMTCk7CgogIGlmIChwYXJhbXMuc2l6ZSgpICE9IDIpIHsKICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7CiAgICByZXR1cm4gRkFMU0U7CiAgfQogIGlmICghcEV2ZW50LT5tX3BWYWx1ZSkKICAgIHJldHVybiBGQUxTRTsKCiAgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlID0gcEV2ZW50LT5WYWx1ZSgpOwogIENGWF9CeXRlU3RyaW5nIHN0clZhbHVlID0gU3RyVHJpbShDRlhfQnl0ZVN0cmluZzo6RnJvbVVuaWNvZGUoVmFsdWUpKTsKICBpZiAoc3RyVmFsdWUuSXNFbXB0eSgpKQogICAgcmV0dXJuIFRSVUU7CgogIGludCBpRGVjID0gcGFyYW1zWzBdLlRvSW50KCk7CiAgaWYgKGlEZWMgPCAwKQogICAgaURlYyA9IC1pRGVjOwoKICBpbnQgaVNlcFN0eWxlID0gcGFyYW1zWzFdLlRvSW50KCk7CiAgaWYgKGlTZXBTdHlsZSA8IDAgfHwgaVNlcFN0eWxlID4gMykKICAgIGlTZXBTdHlsZSA9IDA7CgogIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogIC8vIGZvciBwcm9jZXNzaW5nIGRlY2ltYWwgcGxhY2VzCiAgZG91YmxlIGRWYWx1ZSA9IGF0b2Yoc3RyVmFsdWUpOwogIGRWYWx1ZSAqPSAxMDA7CiAgaWYgKGlEZWMgPiAwKQogICAgZFZhbHVlICs9IERPVUJMRV9DT1JSRUNUOyAgLy/Qo9X9CgogIGludCBpRGVjMjsKICBpbnQgaU5lZ2F0aXZlID0gMDsKICBzdHJWYWx1ZSA9IGZjdnQoZFZhbHVlLCBpRGVjLCAmaURlYzIsICZpTmVnYXRpdmUpOwogIGlmIChzdHJWYWx1ZS5Jc0VtcHR5KCkpIHsKICAgIGRWYWx1ZSA9IDA7CiAgICBzdHJWYWx1ZSA9IGZjdnQoZFZhbHVlLCBpRGVjLCAmaURlYzIsICZpTmVnYXRpdmUpOwogIH0KCiAgaWYgKGlEZWMyIDwgMCkgewogICAgZm9yIChpbnQgaU51bSA9IDA7IGlOdW0gPCBhYnMoaURlYzIpOyBpTnVtKyspIHsKICAgICAgc3RyVmFsdWUgPSAiMCIgKyBzdHJWYWx1ZTsKICAgIH0KICAgIGlEZWMyID0gMDsKICB9CiAgaW50IGlNYXggPSBzdHJWYWx1ZS5HZXRMZW5ndGgoKTsKICBpZiAoaURlYzIgPiBpTWF4KSB7CiAgICBmb3IgKGludCBpTnVtID0gMDsgaU51bSA8PSBpRGVjMiAtIGlNYXg7IGlOdW0rKykgewogICAgICBzdHJWYWx1ZSArPSAiMCI7CiAgICB9CiAgICBpTWF4ID0gaURlYzIgKyAxOwogIH0KICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgLy8gZm9yIHByb2Nlc3Npbmcgc2VwZXJhdG9yIHN0eWxlCiAgaWYgKGlEZWMyIDwgaU1heCkgewogICAgaWYgKGlTZXBTdHlsZSA9PSAwIHx8IGlTZXBTdHlsZSA9PSAxKSB7CiAgICAgIHN0clZhbHVlLkluc2VydChpRGVjMiwgJy4nKTsKICAgICAgaU1heCsrOwogICAgfSBlbHNlIGlmIChpU2VwU3R5bGUgPT0gMiB8fCBpU2VwU3R5bGUgPT0gMykgewogICAgICBzdHJWYWx1ZS5JbnNlcnQoaURlYzIsICcsJyk7CiAgICAgIGlNYXgrKzsKICAgIH0KCiAgICBpZiAoaURlYzIgPT0gMCkKICAgICAgc3RyVmFsdWUuSW5zZXJ0KGlEZWMyLCAnMCcpOwogIH0KICBpZiAoaVNlcFN0eWxlID09IDAgfHwgaVNlcFN0eWxlID09IDIpIHsKICAgIGNoYXIgY1NlcGVyYXRvcjsKICAgIGlmIChpU2VwU3R5bGUgPT0gMCkKICAgICAgY1NlcGVyYXRvciA9ICcsJzsKICAgIGVsc2UKICAgICAgY1NlcGVyYXRvciA9ICcuJzsKCiAgICBpbnQgaURlY1Bvc2l0aXZlOwogICAgaURlY1Bvc2l0aXZlID0gaURlYzI7CgogICAgZm9yIChpRGVjUG9zaXRpdmUgPSBpRGVjMiAtIDM7IGlEZWNQb3NpdGl2ZSA+IDA7IGlEZWNQb3NpdGl2ZSAtPSAzKSB7CiAgICAgIHN0clZhbHVlLkluc2VydChpRGVjUG9zaXRpdmUsIGNTZXBlcmF0b3IpOwogICAgICBpTWF4Kys7CiAgICB9CiAgfQogIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgLy8gbmVnYXRpdmUgbWFyawogIGlmIChpTmVnYXRpdmUpCiAgICBzdHJWYWx1ZSA9ICItIiArIHN0clZhbHVlOwogIHN0clZhbHVlICs9ICIlIjsKICBWYWx1ZSA9IENGWF9XaWRlU3RyaW5nOjpGcm9tTG9jYWwoc3RyVmFsdWUpOwojZW5kaWYKICByZXR1cm4gVFJVRTsKfQovLyBBRlBlcmNlbnRfS2V5c3Ryb2tlKG5EZWMsIHNlcFN0eWxlKQpGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpBRlBlcmNlbnRfS2V5c3Ryb2tlKElKU19Db250ZXh0KiBjYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CiAgcmV0dXJuIEFGTnVtYmVyX0tleXN0cm9rZShjYywgcGFyYW1zLCB2UmV0LCBzRXJyb3IpOwp9CgovLyBmdW5jdGlvbiBBRkRhdGVfRm9ybWF0RXgoY0Zvcm1hdCkKRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZEYXRlX0Zvcm1hdEV4KElKU19Db250ZXh0KiBjYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CiAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKICBBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CiAgQ0pTX0V2ZW50SGFuZGxlciogcEV2ZW50ID0gcENvbnRleHQtPkdldEV2ZW50SGFuZGxlcigpOwogIEFTU0VSVChwRXZlbnQgIT0gTlVMTCk7CgogIGlmIChwYXJhbXMuc2l6ZSgpICE9IDEpIHsKICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7CiAgICByZXR1cm4gRkFMU0U7CiAgfQogIGlmICghcEV2ZW50LT5tX3BWYWx1ZSkKICAgIHJldHVybiBGQUxTRTsKCiAgQ0ZYX1dpZGVTdHJpbmcmIHZhbCA9IHBFdmVudC0+VmFsdWUoKTsKICBDRlhfV2lkZVN0cmluZyBzdHJWYWx1ZSA9IHZhbDsKICBpZiAoc3RyVmFsdWUuSXNFbXB0eSgpKQogICAgcmV0dXJuIFRSVUU7CgogIENGWF9XaWRlU3RyaW5nIHNGb3JtYXQgPSBwYXJhbXNbMF0uVG9DRlhXaWRlU3RyaW5nKCk7CiAgRlhfQk9PTCBiV3JvbmdGb3JtYXQgPSBGQUxTRTsKICBkb3VibGUgZERhdGUgPSAwLjBmOwoKICBpZiAoc3RyVmFsdWUuRmluZChMIkdNVCIpICE9IC0xKSB7CiAgICAvLyBmb3IgR01UIGZvcm1hdCB0aW1lCiAgICAvLyBzdWNoIGFzICJUdWUgQXVnIDExIDE0OjI0OjE2IEdNVCswODAwMjAwOSIKICAgIGREYXRlID0gTWFrZUludGVyRGF0ZShzdHJWYWx1ZSk7CiAgfSBlbHNlIHsKICAgIGREYXRlID0gTWFrZVJlZ3VsYXJEYXRlKHN0clZhbHVlLCBzRm9ybWF0LCBiV3JvbmdGb3JtYXQpOwogIH0KCiAgaWYgKEpTX1BvcnRJc05hbihkRGF0ZSkpIHsKICAgIENGWF9XaWRlU3RyaW5nIHN3TXNnOwogICAgc3dNc2cuRm9ybWF0KEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSU0VEQVRFKS5jX3N0cigpLAogICAgICAgICAgICAgICAgIHNGb3JtYXQuY19zdHIoKSk7CiAgICBBbGVydChwQ29udGV4dCwgc3dNc2cuY19zdHIoKSk7CiAgICByZXR1cm4gRkFMU0U7CiAgfQoKICB2YWwgPSBNYWtlRm9ybWF0RGF0ZShkRGF0ZSwgc0Zvcm1hdCk7CiAgcmV0dXJuIFRSVUU7Cn0KCmRvdWJsZSBDSlNfUHVibGljTWV0aG9kczo6TWFrZUludGVyRGF0ZShDRlhfV2lkZVN0cmluZyBzdHJWYWx1ZSkgewogIGludCBuSG91cjsKICBpbnQgbk1pbjsKICBpbnQgblNlYzsKICBpbnQgblllYXI7CiAgaW50IG5Nb250aDsKICBpbnQgbkRheTsKCiAgQ0ZYX1dpZGVTdHJpbmdBcnJheSB3c0FycmF5OwogIENGWF9XaWRlU3RyaW5nIHNNb250aCA9IEwiIjsKICBDRlhfV2lkZVN0cmluZyBzVGVtcCA9IEwiIjsKICBpbnQgblNpemUgPSBzdHJWYWx1ZS5HZXRMZW5ndGgoKTsKCiAgZm9yIChpbnQgaSA9IDA7IGkgPCBuU2l6ZTsgaSsrKSB7CiAgICBGWF9XQ0hBUiBjID0gc3RyVmFsdWUuR2V0QXQoaSk7CiAgICBpZiAoYyA9PSBMJyAnIHx8IGMgPT0gTCc6JykgewogICAgICB3c0FycmF5LkFkZChzVGVtcCk7CiAgICAgIHNUZW1wID0gTCIiOwogICAgICBjb250aW51ZTsKICAgIH0KCiAgICBzVGVtcCArPSBjOwogIH0KCiAgd3NBcnJheS5BZGQoc1RlbXApOwogIGlmICh3c0FycmF5LkdldFNpemUoKSAhPSA4KQogICAgcmV0dXJuIDA7CgogIHNUZW1wID0gd3NBcnJheVsxXTsKICBpZiAoc1RlbXAuQ29tcGFyZShMIkphbiIpID09IDApCiAgICBuTW9udGggPSAxOwogIGlmIChzVGVtcC5Db21wYXJlKEwiRmViIikgPT0gMCkKICAgIG5Nb250aCA9IDI7CiAgaWYgKHNUZW1wLkNvbXBhcmUoTCJNYXIiKSA9PSAwKQogICAgbk1vbnRoID0gMzsKICBpZiAoc1RlbXAuQ29tcGFyZShMIkFwciIpID09IDApCiAgICBuTW9udGggPSA0OwogIGlmIChzVGVtcC5Db21wYXJlKEwiTWF5IikgPT0gMCkKICAgIG5Nb250aCA9IDU7CiAgaWYgKHNUZW1wLkNvbXBhcmUoTCJKdW4iKSA9PSAwKQogICAgbk1vbnRoID0gNjsKICBpZiAoc1RlbXAuQ29tcGFyZShMIkp1bCIpID09IDApCiAgICBuTW9udGggPSA3OwogIGlmIChzVGVtcC5Db21wYXJlKEwiQXVnIikgPT0gMCkKICAgIG5Nb250aCA9IDg7CiAgaWYgKHNUZW1wLkNvbXBhcmUoTCJTZXAiKSA9PSAwKQogICAgbk1vbnRoID0gOTsKICBpZiAoc1RlbXAuQ29tcGFyZShMIk9jdCIpID09IDApCiAgICBuTW9udGggPSAxMDsKICBpZiAoc1RlbXAuQ29tcGFyZShMIk5vdiIpID09IDApCiAgICBuTW9udGggPSAxMTsKICBpZiAoc1RlbXAuQ29tcGFyZShMIkRlYyIpID09IDApCiAgICBuTW9udGggPSAxMjsKCiAgbkRheSA9IChpbnQpUGFyc2VTdHJpbmdUb051bWJlcih3c0FycmF5WzJdLmNfc3RyKCkpOwogIG5Ib3VyID0gKGludClQYXJzZVN0cmluZ1RvTnVtYmVyKHdzQXJyYXlbM10uY19zdHIoKSk7CiAgbk1pbiA9IChpbnQpUGFyc2VTdHJpbmdUb051bWJlcih3c0FycmF5WzRdLmNfc3RyKCkpOwogIG5TZWMgPSAoaW50KVBhcnNlU3RyaW5nVG9OdW1iZXIod3NBcnJheVs1XS5jX3N0cigpKTsKICBuWWVhciA9IChpbnQpUGFyc2VTdHJpbmdUb051bWJlcih3c0FycmF5WzddLmNfc3RyKCkpOwoKICBkb3VibGUgZFJldCA9IEpTX01ha2VEYXRlKEpTX01ha2VEYXkoblllYXIsIG5Nb250aCAtIDEsIG5EYXkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgSlNfTWFrZVRpbWUobkhvdXIsIG5NaW4sIG5TZWMsIDApKTsKCiAgaWYgKEpTX1BvcnRJc05hbihkUmV0KSkgewogICAgZFJldCA9IEpTX0RhdGVQYXJzZShzdHJWYWx1ZS5jX3N0cigpKTsKICB9CgogIHJldHVybiBkUmV0Owp9CgovLyBBRkRhdGVfS2V5c3Ryb2tlRXgoY0Zvcm1hdCkKRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZEYXRlX0tleXN0cm9rZUV4KElKU19Db250ZXh0KiBjYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CiAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKICBBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CiAgQ0pTX0V2ZW50SGFuZGxlciogcEV2ZW50ID0gcENvbnRleHQtPkdldEV2ZW50SGFuZGxlcigpOwogIEFTU0VSVChwRXZlbnQgIT0gTlVMTCk7CgogIGlmIChwYXJhbXMuc2l6ZSgpICE9IDEpIHsKICAgIHNFcnJvciA9IEwiQUZEYXRlX0tleXN0cm9rZUV4J3MgcGFyYW1ldGVycycgc2l6ZSByIG5vdCBjb3JyZWN0IjsKICAgIHJldHVybiBGQUxTRTsKICB9CgogIGlmIChwRXZlbnQtPldpbGxDb21taXQoKSkgewogICAgaWYgKCFwRXZlbnQtPm1fcFZhbHVlKQogICAgICByZXR1cm4gRkFMU0U7CiAgICBDRlhfV2lkZVN0cmluZyBzdHJWYWx1ZSA9IHBFdmVudC0+VmFsdWUoKTsKICAgIGlmIChzdHJWYWx1ZS5Jc0VtcHR5KCkpCiAgICAgIHJldHVybiBUUlVFOwoKICAgIENGWF9XaWRlU3RyaW5nIHNGb3JtYXQgPSBwYXJhbXNbMF0uVG9DRlhXaWRlU3RyaW5nKCk7CiAgICBGWF9CT09MIGJXcm9uZ0Zvcm1hdCA9IEZBTFNFOwogICAgZG91YmxlIGRSZXQgPSBNYWtlUmVndWxhckRhdGUoc3RyVmFsdWUsIHNGb3JtYXQsIGJXcm9uZ0Zvcm1hdCk7CiAgICBpZiAoYldyb25nRm9ybWF0IHx8IEpTX1BvcnRJc05hbihkUmV0KSkgewogICAgICBDRlhfV2lkZVN0cmluZyBzd01zZzsKICAgICAgc3dNc2cuRm9ybWF0KEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSU0VEQVRFKS5jX3N0cigpLAogICAgICAgICAgICAgICAgICAgc0Zvcm1hdC5jX3N0cigpKTsKICAgICAgQWxlcnQocENvbnRleHQsIHN3TXNnLmNfc3RyKCkpOwogICAgICBwRXZlbnQtPlJjKCkgPSBGQUxTRTsKICAgICAgcmV0dXJuIFRSVUU7CiAgICB9CiAgfQogIHJldHVybiBUUlVFOwp9CgpGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpBRkRhdGVfRm9ybWF0KElKU19Db250ZXh0KiBjYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CiAgdjg6Oklzb2xhdGUqIGlzb2xhdGUgPSA6OkdldElzb2xhdGUoY2MpOwoKICBpZiAocGFyYW1zLnNpemUoKSAhPSAxKSB7CiAgICBDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOwogICAgQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwoKICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7CiAgICByZXR1cm4gRkFMU0U7CiAgfQoKICBpbnQgaUluZGV4ID0gcGFyYW1zWzBdLlRvSW50KCk7CiAgY29uc3QgRlhfV0NIQVIqIGNGb3JtYXRzW10gPSB7TCJtL2QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwibS9kL3l5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMIm1tL2RkL3l5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMIm1tL3l5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMImQtbW1tIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMImQtbW1tLXl5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMImRkLW1tbS15eSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJ5eS1tbS1kZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJtbW0teXkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwibW1tbS15eSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJtbW0gZCwgeXl5eSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJtbW1tIGQsIHl5eXkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwibS9kL3l5IGg6TU0gdHQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwibS9kL3l5IEhIOk1NIn07CgogIGlmIChpSW5kZXggPCAwIHx8IChzdGF0aWNfY2FzdDxzaXplX3Q+KGlJbmRleCkgPj0gRlhfQXJyYXlTaXplKGNGb3JtYXRzKSkpCiAgICBpSW5kZXggPSAwOwoKICBDSlNfUGFyYW1ldGVycyBuZXdQYXJhbXM7CiAgQ0pTX1ZhbHVlIHZhbChpc29sYXRlLCBjRm9ybWF0c1tpSW5kZXhdKTsKICBuZXdQYXJhbXMucHVzaF9iYWNrKHZhbCk7CiAgcmV0dXJuIEFGRGF0ZV9Gb3JtYXRFeChjYywgbmV3UGFyYW1zLCB2UmV0LCBzRXJyb3IpOwp9CgovLyBBRkRhdGVfS2V5c3Ryb2tlRXgoY0Zvcm1hdCkKRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZEYXRlX0tleXN0cm9rZShJSlNfQ29udGV4dCogY2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgewogIHY4OjpJc29sYXRlKiBpc29sYXRlID0gOjpHZXRJc29sYXRlKGNjKTsKCiAgaWYgKHBhcmFtcy5zaXplKCkgIT0gMSkgewogICAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKICAgIEFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKCiAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNRVJST1IpOwogICAgcmV0dXJuIEZBTFNFOwogIH0KCiAgaW50IGlJbmRleCA9IHBhcmFtc1swXS5Ub0ludCgpOwogIGNvbnN0IEZYX1dDSEFSKiBjRm9ybWF0c1tdID0ge0wibS9kIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMIm0vZC95eSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJtbS9kZC95eSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJtbS95eSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJkLW1tbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJkLW1tbS15eSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJkZC1tbW0teXkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwieXktbW0tZGQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwibW1tLXl5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMIm1tbW0teXkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwibW1tIGQsIHl5eXkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwibW1tbSBkLCB5eXl5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMIm0vZC95eSBoOk1NIHR0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMIm0vZC95eSBISDpNTSJ9OwoKICBpZiAoaUluZGV4IDwgMCB8fCAoc3RhdGljX2Nhc3Q8c2l6ZV90PihpSW5kZXgpID49IEZYX0FycmF5U2l6ZShjRm9ybWF0cykpKQogICAgaUluZGV4ID0gMDsKCiAgQ0pTX1BhcmFtZXRlcnMgbmV3UGFyYW1zOwogIENKU19WYWx1ZSB2YWwoaXNvbGF0ZSwgY0Zvcm1hdHNbaUluZGV4XSk7CiAgbmV3UGFyYW1zLnB1c2hfYmFjayh2YWwpOwogIHJldHVybiBBRkRhdGVfS2V5c3Ryb2tlRXgoY2MsIG5ld1BhcmFtcywgdlJldCwgc0Vycm9yKTsKfQoKLy8gZnVuY3Rpb24gQUZUaW1lX0Zvcm1hdChwdGYpCkZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGVGltZV9Gb3JtYXQoSUpTX0NvbnRleHQqIGNjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKICB2ODo6SXNvbGF0ZSogaXNvbGF0ZSA9IDo6R2V0SXNvbGF0ZShjYyk7CgogIGlmIChwYXJhbXMuc2l6ZSgpICE9IDEpIHsKICAgIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7CiAgICBBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CiAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNRVJST1IpOwogICAgcmV0dXJuIEZBTFNFOwogIH0KCiAgaW50IGlJbmRleCA9IHBhcmFtc1swXS5Ub0ludCgpOwogIGNvbnN0IEZYX1dDSEFSKiBjRm9ybWF0c1tdID0ge0wiSEg6TU0iLCBMImg6TU0gdHQiLCBMIkhIOk1NOnNzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMImg6TU06c3MgdHQifTsKCiAgaWYgKGlJbmRleCA8IDAgfHwgKHN0YXRpY19jYXN0PHNpemVfdD4oaUluZGV4KSA+PSBGWF9BcnJheVNpemUoY0Zvcm1hdHMpKSkKICAgIGlJbmRleCA9IDA7CgogIENKU19QYXJhbWV0ZXJzIG5ld1BhcmFtczsKICBDSlNfVmFsdWUgdmFsKGlzb2xhdGUsIGNGb3JtYXRzW2lJbmRleF0pOwogIG5ld1BhcmFtcy5wdXNoX2JhY2sodmFsKTsKICByZXR1cm4gQUZEYXRlX0Zvcm1hdEV4KGNjLCBuZXdQYXJhbXMsIHZSZXQsIHNFcnJvcik7Cn0KCkZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGVGltZV9LZXlzdHJva2UoSUpTX0NvbnRleHQqIGNjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKICB2ODo6SXNvbGF0ZSogaXNvbGF0ZSA9IDo6R2V0SXNvbGF0ZShjYyk7CiAgaWYgKHBhcmFtcy5zaXplKCkgIT0gMSkgewogICAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKICAgIEFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7CiAgICByZXR1cm4gRkFMU0U7CiAgfQoKICBpbnQgaUluZGV4ID0gcGFyYW1zWzBdLlRvSW50KCk7CiAgY29uc3QgRlhfV0NIQVIqIGNGb3JtYXRzW10gPSB7TCJISDpNTSIsIEwiaDpNTSB0dCIsIEwiSEg6TU06c3MiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwiaDpNTTpzcyB0dCJ9OwoKICBpZiAoaUluZGV4IDwgMCB8fCAoc3RhdGljX2Nhc3Q8c2l6ZV90PihpSW5kZXgpID49IEZYX0FycmF5U2l6ZShjRm9ybWF0cykpKQogICAgaUluZGV4ID0gMDsKCiAgQ0pTX1BhcmFtZXRlcnMgbmV3UGFyYW1zOwogIENKU19WYWx1ZSB2YWwoaXNvbGF0ZSwgY0Zvcm1hdHNbaUluZGV4XSk7CiAgbmV3UGFyYW1zLnB1c2hfYmFjayh2YWwpOwogIHJldHVybiBBRkRhdGVfS2V5c3Ryb2tlRXgoY2MsIG5ld1BhcmFtcywgdlJldCwgc0Vycm9yKTsKfQoKRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZUaW1lX0Zvcm1hdEV4KElKU19Db250ZXh0KiBjYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CiAgcmV0dXJuIEFGRGF0ZV9Gb3JtYXRFeChjYywgcGFyYW1zLCB2UmV0LCBzRXJyb3IpOwp9CgpGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpBRlRpbWVfS2V5c3Ryb2tlRXgoSUpTX0NvbnRleHQqIGNjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKICByZXR1cm4gQUZEYXRlX0tleXN0cm9rZUV4KGNjLCBwYXJhbXMsIHZSZXQsIHNFcnJvcik7Cn0KCi8vIGZ1bmN0aW9uIEFGU3BlY2lhbF9Gb3JtYXQocHNmKQpGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpBRlNwZWNpYWxfRm9ybWF0KElKU19Db250ZXh0KiBjYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CiAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKICBBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CgogIGlmIChwYXJhbXMuc2l6ZSgpICE9IDEpIHsKICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7CiAgICByZXR1cm4gRkFMU0U7CiAgfQoKICBzdGQ6OnN0cmluZyBjRm9ybWF0OwogIGludCBpSW5kZXggPSBwYXJhbXNbMF0uVG9JbnQoKTsKCiAgQ0pTX0V2ZW50SGFuZGxlciogcEV2ZW50ID0gcENvbnRleHQtPkdldEV2ZW50SGFuZGxlcigpOwogIEFTU0VSVChwRXZlbnQgIT0gTlVMTCk7CgogIGlmICghcEV2ZW50LT5tX3BWYWx1ZSkKICAgIHJldHVybiBGQUxTRTsKICBDRlhfV2lkZVN0cmluZyYgVmFsdWUgPSBwRXZlbnQtPlZhbHVlKCk7CiAgc3RkOjpzdHJpbmcgc3RyU3JjID0gQ0ZYX0J5dGVTdHJpbmc6OkZyb21Vbmljb2RlKFZhbHVlKS5jX3N0cigpOwoKICBzd2l0Y2ggKGlJbmRleCkgewogICAgY2FzZSAwOgogICAgICBjRm9ybWF0ID0gIjk5OTk5IjsKICAgICAgYnJlYWs7CiAgICBjYXNlIDE6CiAgICAgIGNGb3JtYXQgPSAiOTk5OTktOTk5OSI7CiAgICAgIGJyZWFrOwogICAgY2FzZSAyOiB7CiAgICAgIHN0ZDo6c3RyaW5nIE51bWJlclN0cjsKICAgICAgdXRpbDo6cHJpbnR4KCI5OTk5OTk5OTk5Iiwgc3RyU3JjLCBOdW1iZXJTdHIpOwogICAgICBpZiAoTnVtYmVyU3RyLmxlbmd0aCgpID49IDEwKQogICAgICAgIGNGb3JtYXQgPSAiKDk5OSkgOTk5LTk5OTkiOwogICAgICBlbHNlCiAgICAgICAgY0Zvcm1hdCA9ICI5OTktOTk5OSI7CiAgICAgIGJyZWFrOwogICAgfQogICAgY2FzZSAzOgogICAgICBjRm9ybWF0ID0gIjk5OS05OS05OTk5IjsKICAgICAgYnJlYWs7CiAgfQoKICBzdGQ6OnN0cmluZyBzdHJEZXM7CiAgdXRpbDo6cHJpbnR4KGNGb3JtYXQsIHN0clNyYywgc3RyRGVzKTsKICBWYWx1ZSA9IENGWF9XaWRlU3RyaW5nOjpGcm9tTG9jYWwoc3RyRGVzLmNfc3RyKCkpOwogIHJldHVybiBUUlVFOwp9CgovLyBmdW5jdGlvbiBBRlNwZWNpYWxfS2V5c3Ryb2tlRXgobWFzaykKRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZTcGVjaWFsX0tleXN0cm9rZUV4KElKU19Db250ZXh0KiBjYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CiAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKICBBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CiAgQ0pTX0V2ZW50SGFuZGxlciogcEV2ZW50ID0gcENvbnRleHQtPkdldEV2ZW50SGFuZGxlcigpOwoKICBBU1NFUlQocEV2ZW50ICE9IE5VTEwpOwoKICBpZiAocGFyYW1zLnNpemUoKSA8IDEpIHsKICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7CiAgICByZXR1cm4gRkFMU0U7CiAgfQoKICBpZiAoIXBFdmVudC0+bV9wVmFsdWUpCiAgICByZXR1cm4gRkFMU0U7CiAgQ0ZYX1dpZGVTdHJpbmcmIHZhbEV2ZW50ID0gcEV2ZW50LT5WYWx1ZSgpOwoKICBDRlhfV2lkZVN0cmluZyB3c3RyTWFzayA9IHBhcmFtc1swXS5Ub0NGWFdpZGVTdHJpbmcoKTsKICBpZiAod3N0ck1hc2suSXNFbXB0eSgpKQogICAgcmV0dXJuIFRSVUU7CgogIGNvbnN0IHNpemVfdCB3c3RyTWFza0xlbiA9IHdzdHJNYXNrLkdldExlbmd0aCgpOwogIGNvbnN0IHN0ZDo6d3N0cmluZyB3c3RyVmFsdWUgPSB2YWxFdmVudC5jX3N0cigpOwoKICBpZiAocEV2ZW50LT5XaWxsQ29tbWl0KCkpIHsKICAgIGlmICh3c3RyVmFsdWUuZW1wdHkoKSkKICAgICAgcmV0dXJuIFRSVUU7CiAgICBzaXplX3QgaUluZGV4TWFzayA9IDA7CiAgICBmb3IgKGNvbnN0IGF1dG8mIHdfVmFsdWUgOiB3c3RyVmFsdWUpIHsKICAgICAgaWYgKCFtYXNrU2F0aXNmaWVkKHdfVmFsdWUsIHdzdHJNYXNrW2lJbmRleE1hc2tdKSkKICAgICAgICBicmVhazsKICAgICAgaUluZGV4TWFzaysrOwogICAgfQoKICAgIGlmIChpSW5kZXhNYXNrICE9IHdzdHJNYXNrTGVuIHx8CiAgICAgICAgKGlJbmRleE1hc2sgIT0gd3N0clZhbHVlLnNpemUoKSAmJiB3c3RyTWFza0xlbiAhPSAwKSkgewogICAgICBBbGVydCgKICAgICAgICAgIHBDb250ZXh0LAogICAgICAgICAgSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNBRk5VTUJFUl9LRVlTVFJPS0UpLmNfc3RyKCkpOwogICAgICBwRXZlbnQtPlJjKCkgPSBGQUxTRTsKICAgIH0KICAgIHJldHVybiBUUlVFOwogIH0KCiAgQ0ZYX1dpZGVTdHJpbmcmIHdpZGVDaGFuZ2UgPSBwRXZlbnQtPkNoYW5nZSgpOwogIHN0ZDo6d3N0cmluZyB3Q2hhbmdlID0gd2lkZUNoYW5nZS5jX3N0cigpOwogIGlmICh3Q2hhbmdlLmVtcHR5KCkpCiAgICByZXR1cm4gVFJVRTsKCiAgaW50IGlJbmRleE1hc2sgPSBwRXZlbnQtPlNlbFN0YXJ0KCk7CgogIHNpemVfdCBjb21iaW5lZF9sZW4gPSB3c3RyVmFsdWUubGVuZ3RoKCkgKyB3Q2hhbmdlLmxlbmd0aCgpIC0KICAgICAgICAgICAgICAgICAgICAgICAgKHBFdmVudC0+U2VsRW5kKCkgLSBwRXZlbnQtPlNlbFN0YXJ0KCkpOwogIGlmIChjb21iaW5lZF9sZW4gPiB3c3RyTWFza0xlbikgewogICAgQWxlcnQocENvbnRleHQsCiAgICAgICAgICBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNX1RPT0xPTkcpLmNfc3RyKCkpOwogICAgcEV2ZW50LT5SYygpID0gRkFMU0U7CiAgICByZXR1cm4gVFJVRTsKICB9CgogIGlmIChpSW5kZXhNYXNrID49IHdzdHJNYXNrTGVuICYmICghd0NoYW5nZS5lbXB0eSgpKSkgewogICAgQWxlcnQocENvbnRleHQsCiAgICAgICAgICBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNX1RPT0xPTkcpLmNfc3RyKCkpOwogICAgcEV2ZW50LT5SYygpID0gRkFMU0U7CiAgICByZXR1cm4gVFJVRTsKICB9CgogIGZvciAoc3RkOjp3c3RyaW5nOjppdGVyYXRvciBpdCA9IHdDaGFuZ2UuYmVnaW4oKTsgaXQgIT0gd0NoYW5nZS5lbmQoKTsgaXQrKykgewogICAgaWYgKGlJbmRleE1hc2sgPj0gd3N0ck1hc2tMZW4pIHsKICAgICAgQWxlcnQocENvbnRleHQsCiAgICAgICAgICAgIEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1fVE9PTE9ORykuY19zdHIoKSk7CiAgICAgIHBFdmVudC0+UmMoKSA9IEZBTFNFOwogICAgICByZXR1cm4gVFJVRTsKICAgIH0KICAgIHdjaGFyX3Qgd19NYXNrID0gd3N0ck1hc2tbaUluZGV4TWFza107CiAgICBpZiAoIWlzUmVzZXJ2ZWRNYXNrQ2hhcih3X01hc2spKSB7CiAgICAgICppdCA9IHdfTWFzazsKICAgIH0KICAgIHdjaGFyX3Qgd19DaGFuZ2UgPSAqaXQ7CiAgICBpZiAoIW1hc2tTYXRpc2ZpZWQod19DaGFuZ2UsIHdfTWFzaykpIHsKICAgICAgcEV2ZW50LT5SYygpID0gRkFMU0U7CiAgICAgIHJldHVybiBUUlVFOwogICAgfQogICAgaUluZGV4TWFzaysrOwogIH0KCiAgd2lkZUNoYW5nZSA9IHdDaGFuZ2UuY19zdHIoKTsKICByZXR1cm4gVFJVRTsKfQoKLy8gZnVuY3Rpb24gQUZTcGVjaWFsX0tleXN0cm9rZShwc2YpCkZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGU3BlY2lhbF9LZXlzdHJva2UoSUpTX0NvbnRleHQqIGNjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKICB2ODo6SXNvbGF0ZSogaXNvbGF0ZSA9IDo6R2V0SXNvbGF0ZShjYyk7CgogIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7CiAgQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwogIENKU19FdmVudEhhbmRsZXIqIHBFdmVudCA9IHBDb250ZXh0LT5HZXRFdmVudEhhbmRsZXIoKTsKICBBU1NFUlQocEV2ZW50ICE9IE5VTEwpOwoKICBpZiAocGFyYW1zLnNpemUoKSAhPSAxKSB7CiAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNRVJST1IpOwogICAgcmV0dXJuIEZBTFNFOwogIH0KCiAgc3RkOjpzdHJpbmcgY0Zvcm1hdDsKICBpbnQgaUluZGV4ID0gcGFyYW1zWzBdLlRvSW50KCk7CgogIGlmICghcEV2ZW50LT5tX3BWYWx1ZSkKICAgIHJldHVybiBGQUxTRTsKICAvLyBDSlNfVmFsdWUgdmFsID0gcEV2ZW50LT5WYWx1ZSgpOwogIENGWF9XaWRlU3RyaW5nJiB2YWwgPSBwRXZlbnQtPlZhbHVlKCk7CiAgc3RkOjpzdHJpbmcgc3RyU3JjID0gQ0ZYX0J5dGVTdHJpbmc6OkZyb21Vbmljb2RlKHZhbCkuY19zdHIoKTsKICBzdGQ6OndzdHJpbmcgd3N0ckNoYW5nZSA9IHBFdmVudC0+Q2hhbmdlKCkuY19zdHIoKTsKCiAgc3dpdGNoIChpSW5kZXgpIHsKICAgIGNhc2UgMDoKICAgICAgY0Zvcm1hdCA9ICI5OTk5OSI7CiAgICAgIGJyZWFrOwogICAgY2FzZSAxOgogICAgICAvLyBjRm9ybWF0ID0gIjk5OTk5LTk5OTkiOwogICAgICBjRm9ybWF0ID0gIjk5OTk5OTk5OSI7CiAgICAgIGJyZWFrOwogICAgY2FzZSAyOiB7CiAgICAgIHN0ZDo6c3RyaW5nIE51bWJlclN0cjsKICAgICAgdXRpbDo6cHJpbnR4KCI5OTk5OTk5OTk5Iiwgc3RyU3JjLCBOdW1iZXJTdHIpOwogICAgICBpZiAoc3RyU3JjLmxlbmd0aCgpICsgd3N0ckNoYW5nZS5sZW5ndGgoKSA+IDcpCiAgICAgICAgLy8gY0Zvcm1hdCA9ICIoOTk5KSA5OTktOTk5OSI7CiAgICAgICAgY0Zvcm1hdCA9ICI5OTk5OTk5OTk5IjsKICAgICAgZWxzZQogICAgICAgIC8vIGNGb3JtYXQgPSAiOTk5LTk5OTkiOwogICAgICAgIGNGb3JtYXQgPSAiOTk5OTk5OSI7CiAgICAgIGJyZWFrOwogICAgfQogICAgY2FzZSAzOgogICAgICAvLyBjRm9ybWF0ID0gIjk5OS05OS05OTk5IjsKICAgICAgY0Zvcm1hdCA9ICI5OTk5OTk5OTkiOwogICAgICBicmVhazsKICB9CgogIENKU19QYXJhbWV0ZXJzIHBhcmFtczI7CiAgQ0pTX1ZhbHVlIHZNYXNrKGlzb2xhdGUsIGNGb3JtYXQuY19zdHIoKSk7CiAgcGFyYW1zMi5wdXNoX2JhY2sodk1hc2spOwoKICByZXR1cm4gQUZTcGVjaWFsX0tleXN0cm9rZUV4KGNjLCBwYXJhbXMyLCB2UmV0LCBzRXJyb3IpOwp9CgpGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpBRk1lcmdlQ2hhbmdlKElKU19Db250ZXh0KiBjYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CiAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKICBBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CiAgQ0pTX0V2ZW50SGFuZGxlciogcEV2ZW50SGFuZGxlciA9IHBDb250ZXh0LT5HZXRFdmVudEhhbmRsZXIoKTsKICBBU1NFUlQocEV2ZW50SGFuZGxlciAhPSBOVUxMKTsKCiAgaWYgKHBhcmFtcy5zaXplKCkgIT0gMSkgewogICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKICAgIHJldHVybiBGQUxTRTsKICB9CgogIENGWF9XaWRlU3RyaW5nIHN3VmFsdWU7CiAgaWYgKHBFdmVudEhhbmRsZXItPm1fcFZhbHVlICE9IE5VTEwpCiAgICBzd1ZhbHVlID0gcEV2ZW50SGFuZGxlci0+VmFsdWUoKTsKCiAgaWYgKHBFdmVudEhhbmRsZXItPldpbGxDb21taXQoKSkgewogICAgdlJldCA9IHN3VmFsdWUuY19zdHIoKTsKICAgIHJldHVybiBUUlVFOwogIH0KCiAgQ0ZYX1dpZGVTdHJpbmcgcHJlZml4LCBwb3N0Zml4OwoKICBpZiAocEV2ZW50SGFuZGxlci0+U2VsU3RhcnQoKSA+PSAwKQogICAgcHJlZml4ID0gc3dWYWx1ZS5NaWQoMCwgcEV2ZW50SGFuZGxlci0+U2VsU3RhcnQoKSk7CiAgZWxzZQogICAgcHJlZml4ID0gTCIiOwoKICBpZiAocEV2ZW50SGFuZGxlci0+U2VsRW5kKCkgPj0gMCAmJgogICAgICBwRXZlbnRIYW5kbGVyLT5TZWxFbmQoKSA8PSBzd1ZhbHVlLkdldExlbmd0aCgpKQogICAgcG9zdGZpeCA9IHN3VmFsdWUuTWlkKHBFdmVudEhhbmRsZXItPlNlbEVuZCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgIHN3VmFsdWUuR2V0TGVuZ3RoKCkgLSBwRXZlbnRIYW5kbGVyLT5TZWxFbmQoKSk7CiAgZWxzZQogICAgcG9zdGZpeCA9IEwiIjsKCiAgdlJldCA9IChwcmVmaXggKyBwRXZlbnRIYW5kbGVyLT5DaGFuZ2UoKSArIHBvc3RmaXgpLmNfc3RyKCk7CgogIHJldHVybiBUUlVFOwp9CgpGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpBRlBhcnNlRGF0ZUV4KElKU19Db250ZXh0KiBjYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CiAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKICBBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CgogIGlmIChwYXJhbXMuc2l6ZSgpICE9IDIpIHsKICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7CiAgICByZXR1cm4gRkFMU0U7CiAgfQoKICBDRlhfV2lkZVN0cmluZyBzVmFsdWUgPSBwYXJhbXNbMF0uVG9DRlhXaWRlU3RyaW5nKCk7CiAgQ0ZYX1dpZGVTdHJpbmcgc0Zvcm1hdCA9IHBhcmFtc1sxXS5Ub0NGWFdpZGVTdHJpbmcoKTsKCiAgRlhfQk9PTCBiV3JvbmdGb3JtYXQgPSBGQUxTRTsKICBkb3VibGUgZERhdGUgPSBNYWtlUmVndWxhckRhdGUoc1ZhbHVlLCBzRm9ybWF0LCBiV3JvbmdGb3JtYXQpOwoKICBpZiAoSlNfUG9ydElzTmFuKGREYXRlKSkgewogICAgQ0ZYX1dpZGVTdHJpbmcgc3dNc2c7CiAgICBzd01zZy5Gb3JtYXQoSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJTRURBVEUpLmNfc3RyKCksCiAgICAgICAgICAgICAgICAgc0Zvcm1hdC5jX3N0cigpKTsKICAgIEFsZXJ0KChDSlNfQ29udGV4dCopY2MsIHN3TXNnLmNfc3RyKCkpOwogICAgcmV0dXJuIEZBTFNFOwogIH0KCiAgdlJldCA9IGREYXRlOwogIHJldHVybiBUUlVFOwp9CgpGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpBRlNpbXBsZShJSlNfQ29udGV4dCogY2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgewogIGlmIChwYXJhbXMuc2l6ZSgpICE9IDMpIHsKICAgIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7CiAgICBBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CgogICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKICAgIHJldHVybiBGQUxTRTsKICB9CgogIHZSZXQgPSAoZG91YmxlKUFGX1NpbXBsZShwYXJhbXNbMF0uVG9DRlhXaWRlU3RyaW5nKCkuY19zdHIoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zWzFdLlRvRG91YmxlKCksIHBhcmFtc1syXS5Ub0RvdWJsZSgpKTsKICByZXR1cm4gVFJVRTsKfQoKRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZNYWtlTnVtYmVyKElKU19Db250ZXh0KiBjYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CiAgaWYgKHBhcmFtcy5zaXplKCkgIT0gMSkgewogICAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKICAgIEFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKCiAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNRVJST1IpOwogICAgcmV0dXJuIEZBTFNFOwogIH0KICB2UmV0ID0gUGFyc2VTdHJpbmdUb051bWJlcihwYXJhbXNbMF0uVG9DRlhXaWRlU3RyaW5nKCkuY19zdHIoKSk7CiAgcmV0dXJuIFRSVUU7Cn0KCkZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGU2ltcGxlX0NhbGN1bGF0ZShJSlNfQ29udGV4dCogY2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgewogIHY4OjpJc29sYXRlKiBpc29sYXRlID0gOjpHZXRJc29sYXRlKGNjKTsKCiAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKICBBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CgogIGlmIChwYXJhbXMuc2l6ZSgpICE9IDIpIHsKICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7CiAgICByZXR1cm4gRkFMU0U7CiAgfQoKICBDSlNfVmFsdWUgcGFyYW1zMSA9IHBhcmFtc1sxXTsKCiAgaWYgKCFwYXJhbXMxLklzQXJyYXlPYmplY3QoKSAmJiBwYXJhbXMxLkdldFR5cGUoKSAhPSBDSlNfVmFsdWU6OlZUX3N0cmluZykgewogICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKICAgIHJldHVybiBGQUxTRTsKICB9CgogIENQREZTREtfRG9jdW1lbnQqIHBSZWFkZXJEb2MgPSBwQ29udGV4dC0+R2V0UmVhZGVyRG9jdW1lbnQoKTsKICBBU1NFUlQocFJlYWRlckRvYyAhPSBOVUxMKTsKCiAgQ1BERlNES19JbnRlckZvcm0qIHBSZWFkZXJJbnRlckZvcm0gPSBwUmVhZGVyRG9jLT5HZXRJbnRlckZvcm0oKTsKICBBU1NFUlQocFJlYWRlckludGVyRm9ybSAhPSBOVUxMKTsKCiAgQ1BERl9JbnRlckZvcm0qIHBJbnRlckZvcm0gPSBwUmVhZGVySW50ZXJGb3JtLT5HZXRJbnRlckZvcm0oKTsKICBBU1NFUlQocEludGVyRm9ybSAhPSBOVUxMKTsKCiAgZG91YmxlIGRWYWx1ZTsKICBDRlhfV2lkZVN0cmluZyBzRnVuY3Rpb24gPSBwYXJhbXNbMF0uVG9DRlhXaWRlU3RyaW5nKCk7CiAgaWYgKHdjc2NtcChzRnVuY3Rpb24uY19zdHIoKSwgTCJQUkQiKSA9PSAwKQogICAgZFZhbHVlID0gMS4wOwogIGVsc2UKICAgIGRWYWx1ZSA9IDAuMDsKCiAgQ0pTX0FycmF5IEZpZWxkTmFtZUFycmF5ID0gQUZfTWFrZUFycmF5RnJvbUxpc3QoaXNvbGF0ZSwgcGFyYW1zMSk7CgogIGludCBuRmllbGRzQ291bnQgPSAwOwoKICBmb3IgKGludCBpID0gMCwgaXN6ID0gRmllbGROYW1lQXJyYXkuR2V0TGVuZ3RoKCk7IGkgPCBpc3o7IGkrKykgewogICAgQ0pTX1ZhbHVlIGpzVmFsdWUoaXNvbGF0ZSk7CiAgICBGaWVsZE5hbWVBcnJheS5HZXRFbGVtZW50KGksIGpzVmFsdWUpOwogICAgQ0ZYX1dpZGVTdHJpbmcgd3NGaWVsZE5hbWUgPSBqc1ZhbHVlLlRvQ0ZYV2lkZVN0cmluZygpOwoKICAgIGZvciAoaW50IGogPSAwLCBqc3ogPSBwSW50ZXJGb3JtLT5Db3VudEZpZWxkcyh3c0ZpZWxkTmFtZSk7IGogPCBqc3o7IGorKykgewogICAgICBpZiAoQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSBwSW50ZXJGb3JtLT5HZXRGaWVsZChqLCB3c0ZpZWxkTmFtZSkpIHsKICAgICAgICBkb3VibGUgZFRlbXAgPSAwLjA7CgogICAgICAgIHN3aXRjaCAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkpIHsKICAgICAgICAgIGNhc2UgRklFTERUWVBFX1RFWFRGSUVMRDoKICAgICAgICAgIGNhc2UgRklFTERUWVBFX0NPTUJPQk9YOiB7CiAgICAgICAgICAgIGRUZW1wID0gUGFyc2VTdHJpbmdUb051bWJlcihwRm9ybUZpZWxkLT5HZXRWYWx1ZSgpLmNfc3RyKCkpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIGNhc2UgRklFTERUWVBFX1BVU0hCVVRUT046IHsKICAgICAgICAgICAgZFRlbXAgPSAwLjA7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgY2FzZSBGSUVMRFRZUEVfQ0hFQ0tCT1g6CiAgICAgICAgICBjYXNlIEZJRUxEVFlQRV9SQURJT0JVVFRPTjogewogICAgICAgICAgICBkVGVtcCA9IDAuMDsKICAgICAgICAgICAgZm9yIChpbnQgYyA9IDAsIGNzeiA9IHBGb3JtRmllbGQtPkNvdW50Q29udHJvbHMoKTsgYyA8IGNzejsgYysrKSB7CiAgICAgICAgICAgICAgaWYgKENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ3RybCA9IHBGb3JtRmllbGQtPkdldENvbnRyb2woYykpIHsKICAgICAgICAgICAgICAgIGlmIChwRm9ybUN0cmwtPklzQ2hlY2tlZCgpKSB7CiAgICAgICAgICAgICAgICAgIGRUZW1wICs9CiAgICAgICAgICAgICAgICAgICAgICBQYXJzZVN0cmluZ1RvTnVtYmVyKHBGb3JtQ3RybC0+R2V0RXhwb3J0VmFsdWUoKS5jX3N0cigpKTsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgY2FzZSBGSUVMRFRZUEVfTElTVEJPWDogewogICAgICAgICAgICBkVGVtcCA9IDAuMDsKICAgICAgICAgICAgaWYgKHBGb3JtRmllbGQtPkNvdW50U2VsZWN0ZWRJdGVtcygpID4gMSkKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgZFRlbXAgPSBQYXJzZVN0cmluZ1RvTnVtYmVyKHBGb3JtRmllbGQtPkdldFZhbHVlKCkuY19zdHIoKSk7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KCiAgICAgICAgaWYgKGkgPT0gMCAmJiBqID09IDAgJiYgKHdjc2NtcChzRnVuY3Rpb24uY19zdHIoKSwgTCJNSU4iKSA9PSAwIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdjc2NtcChzRnVuY3Rpb24uY19zdHIoKSwgTCJNQVgiKSA9PSAwKSkKICAgICAgICAgIGRWYWx1ZSA9IGRUZW1wOwoKICAgICAgICBkVmFsdWUgPSBBRl9TaW1wbGUoc0Z1bmN0aW9uLmNfc3RyKCksIGRWYWx1ZSwgZFRlbXApOwoKICAgICAgICBuRmllbGRzQ291bnQrKzsKICAgICAgfQogICAgfQogIH0KCiAgaWYgKHdjc2NtcChzRnVuY3Rpb24uY19zdHIoKSwgTCJBVkciKSA9PSAwICYmIG5GaWVsZHNDb3VudCA+IDApCiAgICBkVmFsdWUgLz0gbkZpZWxkc0NvdW50OwoKICBkVmFsdWUgPSAoZG91YmxlKWZsb29yKGRWYWx1ZSAqIEZYU1lTX3BvdygoZG91YmxlKTEwLCAoZG91YmxlKTYpICsgMC40OSkgLwogICAgICAgICAgIEZYU1lTX3BvdygoZG91YmxlKTEwLCAoZG91YmxlKTYpOwogIENKU19WYWx1ZSBqc1ZhbHVlKGlzb2xhdGUsIGRWYWx1ZSk7CiAgaWYgKHBDb250ZXh0LT5HZXRFdmVudEhhbmRsZXIoKS0+bV9wVmFsdWUpCiAgICBwQ29udGV4dC0+R2V0RXZlbnRIYW5kbGVyKCktPlZhbHVlKCkgPSBqc1ZhbHVlLlRvQ0ZYV2lkZVN0cmluZygpOwoKICByZXR1cm4gVFJVRTsKfQoKLyogVGhpcyBmdW5jdGlvbiB2YWxpZGF0ZXMgdGhlIGN1cnJlbnQgZXZlbnQgdG8gZW5zdXJlIHRoYXQgaXRzIHZhbHVlIGlzCioqIHdpdGhpbiB0aGUgc3BlY2lmaWVkIHJhbmdlLiAqLwoKRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZSYW5nZV9WYWxpZGF0ZShJSlNfQ29udGV4dCogY2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgewogIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7CiAgQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwogIENKU19FdmVudEhhbmRsZXIqIHBFdmVudCA9IHBDb250ZXh0LT5HZXRFdmVudEhhbmRsZXIoKTsKICBBU1NFUlQocEV2ZW50ICE9IE5VTEwpOwoKICBpZiAocGFyYW1zLnNpemUoKSAhPSA0KSB7CiAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNRVJST1IpOwogICAgcmV0dXJuIEZBTFNFOwogIH0KCiAgaWYgKCFwRXZlbnQtPm1fcFZhbHVlKQogICAgcmV0dXJuIEZBTFNFOwogIGlmIChwRXZlbnQtPlZhbHVlKCkuSXNFbXB0eSgpKQogICAgcmV0dXJuIFRSVUU7CiAgZG91YmxlIGRFZW50VmFsdWUgPSBhdG9mKENGWF9CeXRlU3RyaW5nOjpGcm9tVW5pY29kZShwRXZlbnQtPlZhbHVlKCkpKTsKICBGWF9CT09MIGJHcmVhdGVyVGhhbiA9IHBhcmFtc1swXS5Ub0Jvb2woKTsKICBkb3VibGUgZEdyZWF0ZXJUaGFuID0gcGFyYW1zWzFdLlRvRG91YmxlKCk7CiAgRlhfQk9PTCBiTGVzc1RoYW4gPSBwYXJhbXNbMl0uVG9Cb29sKCk7CiAgZG91YmxlIGRMZXNzVGhhbiA9IHBhcmFtc1szXS5Ub0RvdWJsZSgpOwogIENGWF9XaWRlU3RyaW5nIHN3TXNnOwoKICBpZiAoYkdyZWF0ZXJUaGFuICYmIGJMZXNzVGhhbikgewogICAgaWYgKGRFZW50VmFsdWUgPCBkR3JlYXRlclRoYW4gfHwgZEVlbnRWYWx1ZSA+IGRMZXNzVGhhbikKICAgICAgc3dNc2cuRm9ybWF0KEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUkFOR0UxKS5jX3N0cigpLAogICAgICAgICAgICAgICAgICAgcGFyYW1zWzFdLlRvQ0ZYV2lkZVN0cmluZygpLmNfc3RyKCksCiAgICAgICAgICAgICAgICAgICBwYXJhbXNbM10uVG9DRlhXaWRlU3RyaW5nKCkuY19zdHIoKSk7CiAgfSBlbHNlIGlmIChiR3JlYXRlclRoYW4pIHsKICAgIGlmIChkRWVudFZhbHVlIDwgZEdyZWF0ZXJUaGFuKQogICAgICBzd01zZy5Gb3JtYXQoSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNSQU5HRTIpLmNfc3RyKCksCiAgICAgICAgICAgICAgICAgICBwYXJhbXNbMV0uVG9DRlhXaWRlU3RyaW5nKCkuY19zdHIoKSk7CiAgfSBlbHNlIGlmIChiTGVzc1RoYW4pIHsKICAgIGlmIChkRWVudFZhbHVlID4gZExlc3NUaGFuKQogICAgICBzd01zZy5Gb3JtYXQoSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNSQU5HRTMpLmNfc3RyKCksCiAgICAgICAgICAgICAgICAgICBwYXJhbXNbM10uVG9DRlhXaWRlU3RyaW5nKCkuY19zdHIoKSk7CiAgfQoKICBpZiAoIXN3TXNnLklzRW1wdHkoKSkgewogICAgQWxlcnQocENvbnRleHQsIHN3TXNnLmNfc3RyKCkpOwogICAgcEV2ZW50LT5SYygpID0gRkFMU0U7CiAgfQogIHJldHVybiBUUlVFOwp9CgpGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpBRkV4dHJhY3ROdW1zKElKU19Db250ZXh0KiBjYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CiAgdjg6Oklzb2xhdGUqIGlzb2xhdGUgPSA6OkdldElzb2xhdGUoY2MpOwogIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7CiAgQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwoKICBpZiAocGFyYW1zLnNpemUoKSAhPSAxKSB7CiAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNRVJST1IpOwogICAgcmV0dXJuIEZBTFNFOwogIH0KCiAgQ0pTX0FycmF5IG51bXMoaXNvbGF0ZSk7CgogIENGWF9XaWRlU3RyaW5nIHN0ciA9IHBhcmFtc1swXS5Ub0NGWFdpZGVTdHJpbmcoKTsKICBDRlhfV2lkZVN0cmluZyBzUGFydDsKCiAgaWYgKHN0ci5HZXRBdCgwKSA9PSBMJy4nIHx8IHN0ci5HZXRBdCgwKSA9PSBMJywnKQogICAgc3RyID0gTCIwIiArIHN0cjsKCiAgaW50IG5JbmRleCA9IDA7CiAgZm9yIChpbnQgaSA9IDAsIHN6ID0gc3RyLkdldExlbmd0aCgpOyBpIDwgc3o7IGkrKykgewogICAgRlhfV0NIQVIgd2MgPSBzdHIuR2V0QXQoaSk7CiAgICBpZiAoSXNEaWdpdCgod2NoYXJfdCl3YykpIHsKICAgICAgc1BhcnQgKz0gd2M7CiAgICB9IGVsc2UgewogICAgICBpZiAoc1BhcnQuR2V0TGVuZ3RoKCkgPiAwKSB7CiAgICAgICAgbnVtcy5TZXRFbGVtZW50KG5JbmRleCwgQ0pTX1ZhbHVlKGlzb2xhdGUsIHNQYXJ0LmNfc3RyKCkpKTsKICAgICAgICBzUGFydCA9IEwiIjsKICAgICAgICBuSW5kZXgrKzsKICAgICAgfQogICAgfQogIH0KCiAgaWYgKHNQYXJ0LkdldExlbmd0aCgpID4gMCkgewogICAgbnVtcy5TZXRFbGVtZW50KG5JbmRleCwgQ0pTX1ZhbHVlKGlzb2xhdGUsIHNQYXJ0LmNfc3RyKCkpKTsKICB9CgogIGlmIChudW1zLkdldExlbmd0aCgpID4gMCkKICAgIHZSZXQgPSBudW1zOwogIGVsc2UKICAgIHZSZXQuU2V0TnVsbCgpOwoKICByZXR1cm4gVFJVRTsKfQo=