LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfICAgXyBfX19fICBfCiAqICBQcm9qZWN0ICAgICAgICAgICAgICAgICAgICAgX19ffCB8IHwgfCAgXyBcfCB8CiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIF9ffCB8IHwgfCB8XykgfCB8CiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKF9ffCB8X3wgfCAgXyA8fCB8X19fCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcX19ffFxfX18vfF98IFxfXF9fX19ffAogKgogKiBDb3B5cmlnaHQgKEMpIDE5OTggLSAyMDExLCBEYW5pZWwgU3RlbmJlcmcsIDxkYW5pZWxAaGF4eC5zZT4sIGV0IGFsLgogKgogKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIGFzIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBDT1BZSU5HLCB3aGljaAogKiB5b3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYXMgcGFydCBvZiB0aGlzIGRpc3RyaWJ1dGlvbi4gVGhlIHRlcm1zCiAqIGFyZSBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vY3VybC5oYXh4LnNlL2RvY3MvY29weXJpZ2h0Lmh0bWwuCiAqCiAqIFlvdSBtYXkgb3B0IHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSBhbmQvb3Igc2VsbAogKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKICogZnVybmlzaGVkIHRvIGRvIHNvLCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENPUFlJTkcgZmlsZS4KICoKICogVGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWQogKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwojaW5jbHVkZSAic2V0dXAuaCIKCiNpbmNsdWRlIDxjdXJsL2N1cmwuaD4KCiNpbmNsdWRlICJyYXdzdHIuaCIKCiNkZWZpbmUgRU5BQkxFX0NVUkxYX1BSSU5URgovKiB1c2Ugb3VyIG93biBwcmludGYoKSBmdW5jdGlvbnMgKi8KI2luY2x1ZGUgImN1cmx4LmgiCgojaWZkZWYgVVNFX01BTlVBTAojICBpbmNsdWRlICJodWdlaGVscC5oIgojZW5kaWYKCiNpbmNsdWRlICJ0b29sX2Jpbm1vZGUuaCIKI2luY2x1ZGUgInRvb2xfY2ZnYWJsZS5oIgojaW5jbHVkZSAidG9vbF9jYl9wcmcuaCIKI2luY2x1ZGUgInRvb2xfZm9ybXBhcnNlLmgiCiNpbmNsdWRlICJ0b29sX2dldHBhcmFtLmgiCiNpbmNsdWRlICJ0b29sX2hlbHAuaCIKI2luY2x1ZGUgInRvb2xfaGVscGVycy5oIgojaW5jbHVkZSAidG9vbF9saWJpbmZvLmgiCiNpbmNsdWRlICJ0b29sX21zZ3MuaCIKI2luY2x1ZGUgInRvb2xfcGFyYW1obHAuaCIKI2luY2x1ZGUgInRvb2xfcGFyc2VjZmcuaCIKI2luY2x1ZGUgInRvb2xfdmVyc2lvbi5oIgoKI2luY2x1ZGUgIm1lbWRlYnVnLmgiIC8qIGtlZXAgdGhpcyBhcyBMQVNUIGluY2x1ZGUgKi8KCiNpZmRlZiBNU0RPUwojICBkZWZpbmUgVVNFX1dBVFQzMgojZW5kaWYKCiNkZWZpbmUgR2V0U3RyKHN0cix2YWwpIGRvIHsgXAogIGlmKCooc3RyKSkgeyBcCiAgICBmcmVlKCooc3RyKSk7IFwKICAgICooc3RyKSA9IE5VTEw7IFwKICB9IFwKICBpZigodmFsKSkgXAogICAgKihzdHIpID0gc3RyZHVwKCh2YWwpKTsgXAogIGlmKCEodmFsKSkgXAogICAgcmV0dXJuIFBBUkFNX05PX01FTTsgXAp9IFdISUxFX0ZBTFNFCgpzdHJ1Y3QgTG9uZ1Nob3J0IHsKICBjb25zdCBjaGFyICpsZXR0ZXI7IC8qIHNob3J0IG5hbWUgb3B0aW9uICovCiAgY29uc3QgY2hhciAqbG5hbWU7ICAvKiBsb25nIG5hbWUgb3B0aW9uICovCiAgYm9vbCBleHRyYXBhcmFtOyAgICAvKiB3aGV0aGVyIGl0IHRha2VzIGFuIGFkZGl0aW9uYWwgYXJndW1lbnQgKi8KfTsKCnN0YXRpYyBjb25zdCBzdHJ1Y3QgTG9uZ1Nob3J0IGFsaWFzZXNbXT0gewogIC8qIGFsbCB0aGVzZSBvbmVzLCBzdGFydGluZyB3aXRoICIqIiBvciAiJCIgYXMgYSBzaG9ydC1vcHRpb24gaGF2ZSAqbm8qCiAgICAgc2hvcnQgb3B0aW9uIHRvIG1lbnRpb24uICovCiAgeyIqIiwgICJ1cmwiLCAgICAgICAgICAgICAgICAgICAgICBUUlVFfSwKICB7IiphIiwgInJhbmRvbS1maWxlIiwgICAgICAgICAgICAgIFRSVUV9LAogIHsiKmIiLCAiZWdkLWZpbGUiLCAgICAgICAgICAgICAgICAgVFJVRX0sCiAgeyIqYyIsICJjb25uZWN0LXRpbWVvdXQiLCAgICAgICAgICBUUlVFfSwKICB7IipkIiwgImNpcGhlcnMiLCAgICAgICAgICAgICAgICAgIFRSVUV9LAogIHsiKmUiLCAiZGlzYWJsZS1lcHN2IiwgICAgICAgICAgICAgRkFMU0V9LAogIHsiKkUiLCAiZXBzdiIsICAgICAgICAgICAgICAgICAgICAgRkFMU0V9LAogICAgICAgICAvKiAnZXBzdicgbWFkZSBsaWtlIHRoaXMgdG8gbWFrZSAtLW5vLWVwc3YgYW5kIC0tZXBzdiB0byB3b3JrCiAgICAgICAgICAgICBhbHRob3VnaCAtLWRpc2FibGUtZXBzdiBpcyB0aGUgZG9jdW1lbnRlZCBvcHRpb24gKi8KI2lmZGVmIFVTRV9FTlZJUk9OTUVOVAogIHsiKmYiLCAiZW52aXJvbm1lbnQiLCAgICAgICAgICAgICAgRkFMU0V9LAojZW5kaWYKICB7IipnIiwgInRyYWNlIiwgICAgICAgICAgICAgICAgICAgIFRSVUV9LAogIHsiKmgiLCAidHJhY2UtYXNjaWkiLCAgICAgICAgICAgICAgVFJVRX0sCiAgeyIqaSIsICJsaW1pdC1yYXRlIiwgICAgICAgICAgICAgICBUUlVFfSwKICB7IipqIiwgImNvbXByZXNzZWQiLCAgICAgICAgICAgICAgIEZBTFNFfSwKICB7IipKIiwgInRyLWVuY29kaW5nIiwgICAgICAgICAgICAgIEZBTFNFfSwKICB7IiprIiwgImRpZ2VzdCIsICAgICAgICAgICAgICAgICAgIEZBTFNFfSwKICB7IipsIiwgIm5lZ290aWF0ZSIsICAgICAgICAgICAgICAgIEZBTFNFfSwKICB7IiptIiwgIm50bG0iLCAgICAgICAgICAgICAgICAgICAgIEZBTFNFfSwKICB7IipNIiwgIm50bG0td2IiLCAgICAgICAgICAgICAgICAgIEZBTFNFfSwKICB7IipuIiwgImJhc2ljIiwgICAgICAgICAgICAgICAgICAgIEZBTFNFfSwKICB7IipvIiwgImFueWF1dGgiLCAgICAgICAgICAgICAgICAgIEZBTFNFfSwKI2lmZGVmIFVTRV9XQVRUMzIKICB7IipwIiwgIndkZWJ1ZyIsICAgICAgICAgICAgICAgICAgIEZBTFNFfSwKI2VuZGlmCiAgeyIqcSIsICJmdHAtY3JlYXRlLWRpcnMiLCAgICAgICAgICBGQUxTRX0sCiAgeyIqciIsICJjcmVhdGUtZGlycyIsICAgICAgICAgICAgICBGQUxTRX0sCiAgeyIqcyIsICJtYXgtcmVkaXJzIiwgICAgICAgICAgICAgICBUUlVFfSwKICB7Iip0IiwgInByb3h5LW50bG0iLCAgICAgICAgICAgICAgIEZBTFNFfSwKICB7Iip1IiwgImNybGYiLCAgICAgICAgICAgICAgICAgICAgIEZBTFNFfSwKICB7Iip2IiwgInN0ZGVyciIsICAgICAgICAgICAgICAgICAgIFRSVUV9LAogIHsiKnciLCAiaW50ZXJmYWNlIiwgICAgICAgICAgICAgICAgVFJVRX0sCiAgeyIqeCIsICJrcmIiICwgICAgICAgICAgICAgICAgICAgICBUUlVFfSwKICB7Iip4IiwgImtyYjQiICwgICAgICAgICAgICAgICAgICAgIFRSVUV9LAogICAgICAgICAvKiAna3JiNCcgaXMgdGhlIHByZXZpb3VzIG5hbWUgKi8KICB7Iip5IiwgIm1heC1maWxlc2l6ZSIsICAgICAgICAgICAgIFRSVUV9LAogIHsiKnoiLCAiZGlzYWJsZS1lcHJ0IiwgICAgICAgICAgICAgRkFMU0V9LAogIHsiKloiLCAiZXBydCIsICAgICAgICAgICAgICAgICAgICAgRkFMU0V9LAogICAgICAgICAvKiAnZXBydCcgbWFkZSBsaWtlIHRoaXMgdG8gbWFrZSAtLW5vLWVwcnQgYW5kIC0tZXBydCB0byB3b3JrCiAgICAgICAgICAgICBhbHRob3VnaCAtLWRpc2FibGUtZXBydCBpcyB0aGUgZG9jdW1lbnRlZCBvcHRpb24gKi8KICB7IiRhIiwgImZ0cC1zc2wiLCAgICAgICAgICAgICAgICAgIEZBTFNFfSwKICAgICAgICAgLyogJ2Z0cC1zc2wnIGRlcHJlY2F0ZWQgbmFtZSBzaW5jZSA3LjIwLjAgKi8KICB7IiRhIiwgInNzbCIsICAgICAgICAgICAgICAgICAgICAgIEZBTFNFfSwKICAgICAgICAgLyogJ3NzbCcgbmV3IG9wdGlvbiBuYW1lIGluIDcuMjAuMCwgcHJldmlvdXNseSB0aGlzIHdhcyBmdHAtc3NsICovCiAgeyIkYiIsICJmdHAtcGFzdiIsICAgICAgICAgICAgICAgICBGQUxTRX0sCiAgeyIkYyIsICJzb2NrczUiLCAgICAgICAgICAgICAgICAgICBUUlVFfSwKICB7IiRjIiwgInNvY2tzIiwgICAgICAgICAgICAgICAgICAgIFRSVUV9LAogICAgICAgICAvKiAnc29ja3MnIGlzIGhvdyB0aGUgb3B0aW9uIG9uY2Ugd2FzIGRvY3VtZW50ZWQgYnV0IHdlIHByZWZlcgogICAgICAgICAgICB0aGUgLS1zb2NrczUgdmVyc2lvbiBmb3IgZXhwbGljaXQgdmVyc2lvbiAqLwogIHsiJGQiLCAidGNwLW5vZGVsYXkiLCAgICAgICAgICAgICAgRkFMU0V9LAogIHsiJGUiLCAicHJveHktZGlnZXN0IiwgICAgICAgICAgICAgRkFMU0V9LAogIHsiJGYiLCAicHJveHktYmFzaWMiLCAgICAgICAgICAgICAgRkFMU0V9LAogIHsiJGciLCAicmV0cnkiLCAgICAgICAgICAgICAgICAgICAgVFJVRX0sCiAgeyIkaCIsICJyZXRyeS1kZWxheSIsICAgICAgICAgICAgICBUUlVFfSwKICB7IiRpIiwgInJldHJ5LW1heC10aW1lIiwgICAgICAgICAgIFRSVUV9LAogIHsiJGsiLCAicHJveHktbmVnb3RpYXRlIiwgICAgICAgICAgRkFMU0V9LAogIHsiJG0iLCAiZnRwLWFjY291bnQiLCAgICAgICAgICAgICAgVFJVRX0sCiAgeyIkbiIsICJwcm94eS1hbnlhdXRoIiwgICAgICAgICAgICBGQUxTRX0sCiAgeyIkbyIsICJ0cmFjZS10aW1lIiwgICAgICAgICAgICAgICBGQUxTRX0sCiAgeyIkcCIsICJpZ25vcmUtY29udGVudC1sZW5ndGgiLCAgICBGQUxTRX0sCiAgeyIkcSIsICJmdHAtc2tpcC1wYXN2LWlwIiwgICAgICAgICBGQUxTRX0sCiAgeyIkciIsICJmdHAtbWV0aG9kIiwgICAgICAgICAgICAgICBUUlVFfSwKICB7IiRzIiwgImxvY2FsLXBvcnQiLCAgICAgICAgICAgICAgIFRSVUV9LAogIHsiJHQiLCAic29ja3M0IiwgICAgICAgICAgICAgICAgICAgVFJVRX0sCiAgeyIkVCIsICJzb2NrczRhIiwgICAgICAgICAgICAgICAgICBUUlVFfSwKICB7IiR1IiwgImZ0cC1hbHRlcm5hdGl2ZS10by11c2VyIiwgIFRSVUV9LAogIHsiJHYiLCAiZnRwLXNzbC1yZXFkIiwgICAgICAgICAgICAgRkFMU0V9LAogICAgICAgICAvKiAnZnRwLXNzbC1yZXFkJyBkZXByZWNhdGVkIG5hbWUgc2luY2UgNy4yMC4wICovCiAgeyIkdiIsICJzc2wtcmVxZCIsICAgICAgICAgICAgICAgICBGQUxTRX0sCiAgICAgICAgIC8qICdzc2wtcmVxZCcgbmV3IGluIDcuMjAuMCwgcHJldmlvdXNseSB0aGlzIHdhcyBmdHAtc3NsLXJlcWQgKi8KICB7IiR3IiwgInNlc3Npb25pZCIsICAgICAgICAgICAgICAgIEZBTFNFfSwKICAgICAgICAgLyogoXNlc3Npb25pZCcgbGlzdGVkIGFzIC0tbm8tc2Vzc2lvbmlkIGluIHRoZSBoZWxwICovCiAgeyIkeCIsICJmdHAtc3NsLWNvbnRyb2wiLCAgICAgICAgICBGQUxTRX0sCiAgeyIkeSIsICJmdHAtc3NsLWNjYyIsICAgICAgICAgICAgICBGQUxTRX0sCiAgeyIkaiIsICJmdHAtc3NsLWNjYy1tb2RlIiwgICAgICAgICBUUlVFfSwKICB7IiR6IiwgImxpYmN1cmwiLCAgICAgICAgICAgICAgICAgIFRSVUV9LAogIHsiJCMiLCAicmF3IiwgICAgICAgICAgICAgICAgICAgICAgRkFMU0V9LAogIHsiJDAiLCAicG9zdDMwMSIsICAgICAgICAgICAgICAgICAgRkFMU0V9LAogIHsiJDEiLCAia2VlcGFsaXZlIiwgICAgICAgICAgICAgICAgRkFMU0V9LAogICAgICAgICAvKiAna2VlcGFsaXZlJyBsaXN0ZWQgYXMgLS1uby1rZWVwYWxpdmUgaW4gdGhlIGhlbHAgKi8KICB7IiQyIiwgInNvY2tzNS1ob3N0bmFtZSIsICAgICAgICAgIFRSVUV9LAogIHsiJDMiLCAia2VlcGFsaXZlLXRpbWUiLCAgICAgICAgICAgVFJVRX0sCiAgeyIkNCIsICJwb3N0MzAyIiwgICAgICAgICAgICAgICAgICBGQUxTRX0sCiAgeyIkNSIsICJub3Byb3h5IiwgICAgICAgICAgICAgICAgICBUUlVFfSwKI2lmIGRlZmluZWQoSEFWRV9HU1NBUEkpIHx8IGRlZmluZWQoVVNFX1dJTkRPV1NfU1NQSSkKICB7IiQ2IiwgInNvY2tzNS1nc3NhcGktc2VydmljZSIsICAgIFRSVUV9LAogIHsiJDciLCAic29ja3M1LWdzc2FwaS1uZWMiLCAgICAgICAgRkFMU0V9LAojZW5kaWYKICB7IiQ4IiwgInByb3h5MS4wIiwgICAgICAgICAgICAgICAgIFRSVUV9LAogIHsiJDkiLCAidGZ0cC1ibGtzaXplIiwgICAgICAgICAgICAgVFJVRX0sCiAgeyIkQSIsICJtYWlsLWZyb20iLCAgICAgICAgICAgICAgICBUUlVFfSwKICB7IiRCIiwgIm1haWwtcmNwdCIsICAgICAgICAgICAgICAgIFRSVUV9LAogIHsiJEMiLCAiZnRwLXByZXQiLCAgICAgICAgICAgICAgICAgRkFMU0V9LAogIHsiJEQiLCAicHJvdG8iLCAgICAgICAgICAgICAgICAgICAgVFJVRX0sCiAgeyIkRSIsICJwcm90by1yZWRpciIsICAgICAgICAgICAgICBUUlVFfSwKICB7IiRGIiwgInJlc29sdmUiLCAgICAgICAgICAgICAgICAgIFRSVUV9LAogIHsiJEciLCAiZGVsZWdhdGlvbiIsICAgICAgICAgICAgICAgVFJVRX0sCiAgeyIwIiwgICJodHRwMS4wIiwgICAgICAgICAgICAgICAgICBGQUxTRX0sCiAgeyIxIiwgICJ0bHN2MSIsICAgICAgICAgICAgICAgICAgICBGQUxTRX0sCiAgeyIyIiwgICJzc2x2MiIsICAgICAgICAgICAgICAgICAgICBGQUxTRX0sCiAgeyIzIiwgICJzc2x2MyIsICAgICAgICAgICAgICAgICAgICBGQUxTRX0sCiAgeyI0IiwgICJpcHY0IiwgICAgICAgICAgICAgICAgICAgICBGQUxTRX0sCiAgeyI2IiwgICJpcHY2IiwgICAgICAgICAgICAgICAgICAgICBGQUxTRX0sCiAgeyJhIiwgICJhcHBlbmQiLCAgICAgICAgICAgICAgICAgICBGQUxTRX0sCiAgeyJBIiwgICJ1c2VyLWFnZW50IiwgICAgICAgICAgICAgICBUUlVFfSwKICB7ImIiLCAgImNvb2tpZSIsICAgICAgICAgICAgICAgICAgIFRSVUV9LAogIHsiQiIsICAidXNlLWFzY2lpIiwgICAgICAgICAgICAgICAgRkFMU0V9LAogIHsiYyIsICAiY29va2llLWphciIsICAgICAgICAgICAgICAgVFJVRX0sCiAgeyJDIiwgICJjb250aW51ZS1hdCIsICAgICAgICAgICAgICBUUlVFfSwKICB7ImQiLCAgImRhdGEiLCAgICAgICAgICAgICAgICAgICAgIFRSVUV9LAogIHsiZGEiLCAiZGF0YS1hc2NpaSIsICAgICAgICAgICAgICAgVFJVRX0sCiAgeyJkYiIsICJkYXRhLWJpbmFyeSIsICAgICAgICAgICAgICBUUlVFfSwKICB7ImRlIiwgImRhdGEtdXJsZW5jb2RlIiwgICAgICAgICAgIFRSVUV9LAogIHsiRCIsICAiZHVtcC1oZWFkZXIiLCAgICAgICAgICAgICAgVFJVRX0sCiAgeyJlIiwgICJyZWZlcmVyIiwgICAgICAgICAgICAgICAgICBUUlVFfSwKICB7IkUiLCAgImNlcnQiLCAgICAgICAgICAgICAgICAgICAgIFRSVUV9LAogIHsiRWEiLCAiY2FjZXJ0IiwgICAgICAgICAgICAgICAgICAgVFJVRX0sCiAgeyJFYiIsICJjZXJ0LXR5cGUiLCAgICAgICAgICAgICAgICBUUlVFfSwKICB7IkVjIiwgImtleSIsICAgICAgICAgICAgICAgICAgICAgIFRSVUV9LAogIHsiRWQiLCAia2V5LXR5cGUiLCAgICAgICAgICAgICAgICAgVFJVRX0sCiAgeyJFZSIsICJwYXNzIiwgICAgICAgICAgICAgICAgICAgICBUUlVFfSwKICB7IkVmIiwgImVuZ2luZSIsICAgICAgICAgICAgICAgICAgIFRSVUV9LAogIHsiRWciLCAiY2FwYXRoICIsICAgICAgICAgICAgICAgICAgVFJVRX0sCiAgeyJFaCIsICJwdWJrZXkiLCAgICAgICAgICAgICAgICAgICBUUlVFfSwKICB7IkVpIiwgImhvc3RwdWJtZDUiLCAgICAgICAgICAgICAgIFRSVUV9LAogIHsiRWoiLCAiY3JsZmlsZSIsICAgICAgICAgICAgICAgICAgVFJVRX0sCiAgeyJFayIsICJ0bHN1c2VyIiwgICAgICAgICAgICAgICAgICBUUlVFfSwKICB7IkVsIiwgInRsc3Bhc3N3b3JkIiwgICAgICAgICAgICAgIFRSVUV9LAogIHsiRW0iLCAidGxzYXV0aHR5cGUiLCAgICAgICAgICAgICAgVFJVRX0sCiAgeyJmIiwgICJmYWlsIiwgICAgICAgICAgICAgICAgICAgICBGQUxTRX0sCiAgeyJGIiwgICJmb3JtIiwgICAgICAgICAgICAgICAgICAgICBUUlVFfSwKICB7IkZzIiwgImZvcm0tc3RyaW5nIiwgICAgICAgICAgICAgIFRSVUV9LAogIHsiZyIsICAiZ2xvYm9mZiIsICAgICAgICAgICAgICAgICAgRkFMU0V9LAogIHsiRyIsICAiZ2V0IiwgICAgICAgICAgICAgICAgICAgICAgRkFMU0V9LAogIHsiaCIsICAiaGVscCIsICAgICAgICAgICAgICAgICAgICAgRkFMU0V9LAogIHsiSCIsICAiaGVhZGVyIiwgICAgICAgICAgICAgICAgICAgVFJVRX0sCiAgeyJpIiwgICJpbmNsdWRlIiwgICAgICAgICAgICAgICAgICBGQUxTRX0sCiAgeyJJIiwgICJoZWFkIiwgICAgICAgICAgICAgICAgICAgICBGQUxTRX0sCiAgeyJqIiwgICJqdW5rLXNlc3Npb24tY29va2llcyIsICAgICBGQUxTRX0sCiAgeyJKIiwgICJyZW1vdGUtaGVhZGVyLW5hbWUiLCAgICAgICBGQUxTRX0sCiAgeyJrIiwgICJpbnNlY3VyZSIsICAgICAgICAgICAgICAgICBGQUxTRX0sCiAgeyJLIiwgICJjb25maWciLCAgICAgICAgICAgICAgICAgICBUUlVFfSwKICB7ImwiLCAgImxpc3Qtb25seSIsICAgICAgICAgICAgICAgIEZBTFNFfSwKICB7IkwiLCAgImxvY2F0aW9uIiwgICAgICAgICAgICAgICAgIEZBTFNFfSwKICB7Ikx0IiwgImxvY2F0aW9uLXRydXN0ZWQiLCAgICAgICAgIEZBTFNFfSwKICB7Im0iLCAgIm1heC10aW1lIiwgICAgICAgICAgICAgICAgIFRSVUV9LAogIHsiTSIsICAibWFudWFsIiwgICAgICAgICAgICAgICAgICAgRkFMU0V9LAogIHsibiIsICAibmV0cmMiLCAgICAgICAgICAgICAgICAgICAgRkFMU0V9LAogIHsibm8iLCAibmV0cmMtb3B0aW9uYWwiLCAgICAgICAgICAgRkFMU0V9LAogIHsibmUiLCAibmV0cmMtZmlsZSIsICAgICAgICAgICAgICAgVFJVRX0sCiAgeyJOIiwgICJidWZmZXIiLCAgICAgICAgICAgICAgICAgICBGQUxTRX0sCiAgICAgICAgIC8qICdidWZmZXInIGxpc3RlZCBhcyAtLW5vLWJ1ZmZlciBpbiB0aGUgaGVscCAqLwogIHsibyIsICAib3V0cHV0IiwgICAgICAgICAgICAgICAgICAgVFJVRX0sCiAgeyJPIiwgICJyZW1vdGUtbmFtZSIsICAgICAgICAgICAgICBGQUxTRX0sCiAgeyJPYSIsICJyZW1vdGUtbmFtZS1hbGwiLCAgICAgICAgICBGQUxTRX0sCiAgeyJwIiwgICJwcm94eXR1bm5lbCIsICAgICAgICAgICAgICBGQUxTRX0sCiAgeyJQIiwgICJmdHBwb3J0IiwgICAgICAgICAgICAgICAgICBUUlVFfSwKICAgICAgICAgLyogJ2Z0cHBvcnQnIG9sZCB2ZXJzaW9uICovCiAgeyJQIiwgICJmdHAtcG9ydCIsICAgICAgICAgICAgICAgICBUUlVFfSwKICB7InEiLCAgImRpc2FibGUiLCAgICAgICAgICAgICAgICAgIEZBTFNFfSwKICB7IlEiLCAgInF1b3RlIiwgICAgICAgICAgICAgICAgICAgIFRSVUV9LAogIHsiciIsICAicmFuZ2UiLCAgICAgICAgICAgICAgICAgICAgVFJVRX0sCiAgeyJSIiwgICJyZW1vdGUtdGltZSIsICAgICAgICAgICAgICBGQUxTRX0sCiAgeyJzIiwgICJzaWxlbnQiLCAgICAgICAgICAgICAgICAgICBGQUxTRX0sCiAgeyJTIiwgICJzaG93LWVycm9yIiwgICAgICAgICAgICAgICBGQUxTRX0sCiAgeyJ0IiwgICJ0ZWxuZXQtb3B0aW9ucyIsICAgICAgICAgICBUUlVFfSwKICAgICAgICAgLyogJ3RlbG5ldC1vcHRpb25zJyBkb2N1bWVudGVkIGFzIHRlbG5ldC1vcHRpb24gKi8KICB7IlQiLCAgInVwbG9hZC1maWxlIiwgICAgICAgICAgICAgIFRSVUV9LAogIHsidSIsICAidXNlciIsICAgICAgICAgICAgICAgICAgICAgVFJVRX0sCiAgeyJVIiwgICJwcm94eS11c2VyIiwgICAgICAgICAgICAgICBUUlVFfSwKICB7InYiLCAgInZlcmJvc2UiLCAgICAgICAgICAgICAgICAgIEZBTFNFfSwKICB7IlYiLCAgInZlcnNpb24iLCAgICAgICAgICAgICAgICAgIEZBTFNFfSwKICB7InciLCAgIndyaXRlLW91dCIsICAgICAgICAgICAgICAgIFRSVUV9LAogIHsieCIsICAicHJveHkiLCAgICAgICAgICAgICAgICAgICAgVFJVRX0sCiAgeyJYIiwgICJyZXF1ZXN0IiwgICAgICAgICAgICAgICAgICBUUlVFfSwKICB7IlgiLCAgImh0dHAtcmVxdWVzdCIsICAgICAgICAgICAgIFRSVUV9LAogICAgICAgICAvKiAnaHR0cC1yZXF1ZXN0JyBPQlNPTEVURSBWRVJTSU9OICovCiAgeyJZIiwgICJzcGVlZC1saW1pdCIsICAgICAgICAgICAgICBUUlVFfSwKICB7InkiLCAgInNwZWVkLXRpbWUiLCAgICAgICAgICAgICAgIFRSVUV9LAogIHsieiIsICAidGltZS1jb25kIiwgICAgICAgICAgICAgICAgVFJVRX0sCiAgeyIjIiwgICJwcm9ncmVzcy1iYXIiLCAgICAgICAgICAgICBGQUxTRX0sCiAgeyJ+IiwgICJ4YXR0ciIsICAgICAgICAgICAgICAgICAgICBGQUxTRX0sCn07CgpzdHJ1Y3QgZmVhdCB7CiAgY29uc3QgY2hhciAqbmFtZTsKICBpbnQgYml0bWFzazsKfTsKCnN0YXRpYyBjb25zdCBzdHJ1Y3QgZmVhdCBmZWF0c1tdID0gewogIHsiQXN5bmNoRE5TIiwgICAgICBDVVJMX1ZFUlNJT05fQVNZTkNIRE5TfSwKICB7IkRlYnVnIiwgICAgICAgICAgQ1VSTF9WRVJTSU9OX0RFQlVHfSwKICB7IlRyYWNrTWVtb3J5IiwgICAgQ1VSTF9WRVJTSU9OX0NVUkxERUJVR30sCiAgeyJHU1MtTmVnb3RpYXRlIiwgIENVUkxfVkVSU0lPTl9HU1NORUdPVElBVEV9LAogIHsiSUROIiwgICAgICAgICAgICBDVVJMX1ZFUlNJT05fSUROfSwKICB7IklQdjYiLCAgICAgICAgICAgQ1VSTF9WRVJTSU9OX0lQVjZ9LAogIHsiTGFyZ2VmaWxlIiwgICAgICBDVVJMX1ZFUlNJT05fTEFSR0VGSUxFfSwKICB7Ik5UTE0iLCAgICAgICAgICAgQ1VSTF9WRVJTSU9OX05UTE19LAogIHsiTlRMTV9XQiIsICAgICAgICBDVVJMX1ZFUlNJT05fTlRMTV9XQn0sCiAgeyJTUE5FR08iLCAgICAgICAgIENVUkxfVkVSU0lPTl9TUE5FR099LAogIHsiU1NMIiwgICAgICAgICAgICBDVVJMX1ZFUlNJT05fU1NMfSwKICB7IlNTUEkiLCAgICAgICAgICAgQ1VSTF9WRVJTSU9OX1NTUEl9LAogIHsia3JiNCIsICAgICAgICAgICBDVVJMX1ZFUlNJT05fS0VSQkVST1M0fSwKICB7ImxpYnoiLCAgICAgICAgICAgQ1VSTF9WRVJTSU9OX0xJQlp9LAogIHsiQ2hhckNvbnYiLCAgICAgICBDVVJMX1ZFUlNJT05fQ09OVn0sCiAgeyJUTFMtU1JQIiwgICAgICAgIENVUkxfVkVSU0lPTl9UTFNBVVRIX1NSUH0KfTsKClBhcmFtZXRlckVycm9yIGdldHBhcmFtZXRlcihjaGFyICpmbGFnLCAgICAvKiBmIG9yIC1sb25nLWZsYWcgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKm5leHRhcmcsIC8qIE5VTEwgaWYgdW5zZXQgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKnVzZWRhcmcsIC8qIHNldCB0byBUUlVFIGlmIHRoZSBhcmcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhcyBiZWVuIHVzZWQgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBDb25maWd1cmFibGUgKmNvbmZpZykKewogIGNoYXIgbGV0dGVyOwogIGNoYXIgc3VibGV0dGVyID0gJ1wwJzsgLyogc3VibGV0dGVycyBjYW4gb25seSBvY2N1ciBvbiBsb25nIG9wdGlvbnMgKi8KICBpbnQgcmM7CiAgY29uc3QgY2hhciAqcGFyc2UgPSBOVUxMOwogIHVuc2lnbmVkIGludCBqOwogIHRpbWVfdCBub3c7CiAgaW50IGhpdCA9IC0xOwogIGJvb2wgbG9uZ29wdCA9IEZBTFNFOwogIGJvb2wgc2luZ2xlb3B0ID0gRkFMU0U7IC8qIHdoZW4gdHJ1ZSBtZWFucyAnLW8gZm9vJyB1c2VkICctb2ZvbycgKi8KICBQYXJhbWV0ZXJFcnJvciBlcnI7CiAgYm9vbCB0b2dnbGUgPSBUUlVFOyAvKiBob3cgdG8gc3dpdGNoIGJvb2xlYW4gb3B0aW9ucywgb24gb3Igb2ZmLiBDb250cm9sbGVkCiAgICAgICAgICAgICAgICAgICAgICAgICBieSB1c2luZyAtLU9QVElPTiBvciAtLW5vLU9QVElPTiAqLwoKCiAgaWYoKCctJyAhPSBmbGFnWzBdKSB8fAogICAgICgoJy0nID09IGZsYWdbMF0pICYmICgnLScgPT0gZmxhZ1sxXSkpKSB7CiAgICAvKiB0aGlzIHNob3VsZCBiZSBhIGxvbmcgbmFtZSAqLwogICAgY2hhciAqd29yZCA9ICgnLScgPT0gZmxhZ1swXSkgPyBmbGFnKzIgOiBmbGFnOwogICAgc2l6ZV90IGZuYW0gPSBzdHJsZW4od29yZCk7CiAgICBpbnQgbnVtaGl0cyA9IDA7CgogICAgaWYoIXN0cm5jbXAod29yZCwgIm5vLSIsIDMpKSB7CiAgICAgIC8qIGRpc2FibGUgdGhpcyBvcHRpb24gYnV0IGlnbm9yZSB0aGUgIm5vLSIgcGFydCB3aGVuIGxvb2tpbmcgZm9yIGl0ICovCiAgICAgIHdvcmQgKz0gMzsKICAgICAgdG9nZ2xlID0gRkFMU0U7CiAgICB9CgogICAgZm9yKGogPSAwOyBqIDwgc2l6ZW9mKGFsaWFzZXMpL3NpemVvZihhbGlhc2VzWzBdKTsgaisrKSB7CiAgICAgIGlmKGN1cmx4X3N0cm5lcXVhbChhbGlhc2VzW2pdLmxuYW1lLCB3b3JkLCBmbmFtKSkgewogICAgICAgIGxvbmdvcHQgPSBUUlVFOwogICAgICAgIG51bWhpdHMrKzsKICAgICAgICBpZihjdXJseF9yYXdfZXF1YWwoYWxpYXNlc1tqXS5sbmFtZSwgd29yZCkpIHsKICAgICAgICAgIHBhcnNlID0gYWxpYXNlc1tqXS5sZXR0ZXI7CiAgICAgICAgICBoaXQgPSBqOwogICAgICAgICAgbnVtaGl0cyA9IDE7IC8qIGEgc2luZ2xlIHVuaXF1ZSBoaXQgKi8KICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBwYXJzZSA9IGFsaWFzZXNbal0ubGV0dGVyOwogICAgICAgIGhpdCA9IGo7CiAgICAgIH0KICAgIH0KICAgIGlmKG51bWhpdHMgPiAxKSB7CiAgICAgIC8qIHRoaXMgaXMgYXQgbGVhc3QgdGhlIHNlY29uZCBtYXRjaCEgKi8KICAgICAgcmV0dXJuIFBBUkFNX09QVElPTl9BTUJJR1VPVVM7CiAgICB9CiAgICBpZihoaXQgPCAwKSB7CiAgICAgIHJldHVybiBQQVJBTV9PUFRJT05fVU5LTk9XTjsKICAgIH0KICB9CiAgZWxzZSB7CiAgICBmbGFnKys7IC8qIHByZWZpeGVkIHdpdGggb25lIGRhc2gsIHBhc3MgaXQgKi8KICAgIGhpdCA9IC0xOwogICAgcGFyc2UgPSBmbGFnOwogIH0KCiAgZG8gewogICAgLyogd2UgY2FuIGxvb3AgaGVyZSBpZiB3ZSBoYXZlIG11bHRpcGxlIHNpbmdsZS1sZXR0ZXJzICovCgogICAgaWYoIWxvbmdvcHQpIHsKICAgICAgaWYoTlVMTCAhPSBwYXJzZSkgewogICAgICAgIGxldHRlciA9IChjaGFyKSpwYXJzZTsKICAgICAgfQogICAgICBlbHNlIHsKICAgICAgICBsZXR0ZXIgPSAnXDAnOwogICAgICB9CiAgICAgIHN1YmxldHRlcj0nXDAnOwogICAgfQogICAgZWxzZSB7CiAgICAgIGxldHRlciA9IHBhcnNlWzBdOwogICAgICBzdWJsZXR0ZXIgPSBwYXJzZVsxXTsKICAgIH0KICAgICp1c2VkYXJnID0gRkFMU0U7IC8qIGRlZmF1bHQgaXMgdGhhdCB3ZSBkb24ndCB1c2UgdGhlIGFyZyAqLwoKICAgIGlmKGhpdCA8IDApIHsKICAgICAgZm9yKGogPSAwOyBqIDwgc2l6ZW9mKGFsaWFzZXMpL3NpemVvZihhbGlhc2VzWzBdKTsgaisrKSB7CiAgICAgICAgaWYobGV0dGVyID09IGFsaWFzZXNbal0ubGV0dGVyWzBdKSB7CiAgICAgICAgICBoaXQgPSBqOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmKGhpdCA8IDApIHsKICAgICAgICByZXR1cm4gUEFSQU1fT1BUSU9OX1VOS05PV047CiAgICAgIH0KICAgIH0KCiAgICBpZihhbGlhc2VzW2hpdF0uZXh0cmFwYXJhbSkgewogICAgICAvKiB0aGlzIG9wdGlvbiByZXF1aXJlcyBhbiBleHRyYSBwYXJhbWV0ZXIgKi8KICAgICAgaWYoIWxvbmdvcHQgJiYgcGFyc2VbMV0pIHsKICAgICAgICBuZXh0YXJnID0gKGNoYXIgKikmcGFyc2VbMV07IC8qIHRoaXMgaXMgdGhlIGFjdHVhbCBleHRyYSBwYXJhbWV0ZXIgKi8KICAgICAgICBzaW5nbGVvcHQgPSBUUlVFOyAgIC8qIGRvbid0IGxvb3AgYW55bW9yZSBhZnRlciB0aGlzICovCiAgICAgIH0KICAgICAgZWxzZSBpZighbmV4dGFyZykKICAgICAgICByZXR1cm4gUEFSQU1fUkVRVUlSRVNfUEFSQU1FVEVSOwogICAgICBlbHNlCiAgICAgICAgKnVzZWRhcmcgPSBUUlVFOyAvKiBtYXJrIGl0IGFzIHVzZWQgKi8KICAgIH0KCiAgICBzd2l0Y2gobGV0dGVyKSB7CiAgICBjYXNlICcqJzogLyogb3B0aW9ucyB3aXRob3V0IGEgc2hvcnQgb3B0aW9uICovCiAgICAgIHN3aXRjaChzdWJsZXR0ZXIpIHsKICAgICAgY2FzZSAnYSc6IC8qIHJhbmRvbS1maWxlICovCiAgICAgICAgR2V0U3RyKCZjb25maWctPnJhbmRvbV9maWxlLCBuZXh0YXJnKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAnYic6IC8qIGVnZC1maWxlICovCiAgICAgICAgR2V0U3RyKCZjb25maWctPmVnZF9maWxlLCBuZXh0YXJnKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAnYyc6IC8qIGNvbm5lY3QtdGltZW91dCAqLwogICAgICAgIGlmKHN0cjJudW0oJmNvbmZpZy0+Y29ubmVjdHRpbWVvdXQsIG5leHRhcmcpKQogICAgICAgICAgcmV0dXJuIFBBUkFNX0JBRF9OVU1FUklDOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICdkJzogLyogY2lwaGVycyAqLwogICAgICAgIEdldFN0cigmY29uZmlnLT5jaXBoZXJfbGlzdCwgbmV4dGFyZyk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgJ2UnOiAvKiAtLWRpc2FibGUtZXBzdiAqLwogICAgICAgIGNvbmZpZy0+ZGlzYWJsZV9lcHN2ID0gdG9nZ2xlOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICdFJzogLyogLS1lcHN2ICovCiAgICAgICAgY29uZmlnLT5kaXNhYmxlX2Vwc3YgPSAoIXRvZ2dsZSk/VFJVRTpGQUxTRTsKICAgICAgICBicmVhazsKI2lmZGVmIFVTRV9FTlZJUk9OTUVOVAogICAgICBjYXNlICdmJzoKICAgICAgICBjb25maWctPndyaXRlZW52ID0gdG9nZ2xlOwogICAgICAgIGJyZWFrOwojZW5kaWYKICAgICAgY2FzZSAnZyc6IC8qIC0tdHJhY2UgKi8KICAgICAgICBHZXRTdHIoJmNvbmZpZy0+dHJhY2VfZHVtcCwgbmV4dGFyZyk7CiAgICAgICAgaWYoY29uZmlnLT50cmFjZXR5cGUgJiYgKGNvbmZpZy0+dHJhY2V0eXBlICE9IFRSQUNFX0JJTikpCiAgICAgICAgICB3YXJuZihjb25maWcsICItLXRyYWNlIG92ZXJyaWRlcyBhbiBlYXJsaWVyIHRyYWNlL3ZlcmJvc2Ugb3B0aW9uXG4iKTsKICAgICAgICBjb25maWctPnRyYWNldHlwZSA9IFRSQUNFX0JJTjsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAnaCc6IC8qIC0tdHJhY2UtYXNjaWkgKi8KICAgICAgICBHZXRTdHIoJmNvbmZpZy0+dHJhY2VfZHVtcCwgbmV4dGFyZyk7CiAgICAgICAgaWYoY29uZmlnLT50cmFjZXR5cGUgJiYgKGNvbmZpZy0+dHJhY2V0eXBlICE9IFRSQUNFX0FTQ0lJKSkKICAgICAgICAgIHdhcm5mKGNvbmZpZywKICAgICAgICAgICAgICAgICItLXRyYWNlLWFzY2lpIG92ZXJyaWRlcyBhbiBlYXJsaWVyIHRyYWNlL3ZlcmJvc2Ugb3B0aW9uXG4iKTsKICAgICAgICBjb25maWctPnRyYWNldHlwZSA9IFRSQUNFX0FTQ0lJOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICdpJzogLyogLS1saW1pdC1yYXRlICovCiAgICAgIHsKICAgICAgICAvKiBXZSBzdXBwb3J0IEcsIE0sIEsgdG9vICovCiAgICAgICAgY2hhciAqdW5pdDsKICAgICAgICBjdXJsX29mZl90IHZhbHVlID0gY3VybHhfc3RydG9vZmZ0KG5leHRhcmcsICZ1bml0LCAwKTsKCiAgICAgICAgaWYoISp1bml0KQogICAgICAgICAgdW5pdCA9IChjaGFyICopImIiOwogICAgICAgIGVsc2UgaWYoc3RybGVuKHVuaXQpID4gMSkKICAgICAgICAgIHVuaXQgPSAoY2hhciAqKSJ3IjsgLyogdW5zdXBwb3J0ZWQgKi8KCiAgICAgICAgc3dpdGNoKCp1bml0KSB7CiAgICAgICAgY2FzZSAnRyc6CiAgICAgICAgY2FzZSAnZyc6CiAgICAgICAgICB2YWx1ZSAqPSAxMDI0KjEwMjQqMTAyNDsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ00nOgogICAgICAgIGNhc2UgJ20nOgogICAgICAgICAgdmFsdWUgKj0gMTAyNCoxMDI0OwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnSyc6CiAgICAgICAgY2FzZSAnayc6CiAgICAgICAgICB2YWx1ZSAqPSAxMDI0OwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnYic6CiAgICAgICAgY2FzZSAnQic6CiAgICAgICAgICAvKiBmb3IgcGxhaW4gYnl0ZXMsIGxlYXZlIGFzLWlzICovCiAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgd2FybmYoY29uZmlnLCAidW5zdXBwb3J0ZWQgcmF0ZSB1bml0LiBVc2UgRywgTSwgSyBvciBCIVxuIik7CiAgICAgICAgICByZXR1cm4gUEFSQU1fQkFEX1VTRTsKICAgICAgICB9CiAgICAgICAgY29uZmlnLT5yZWN2cGVyc2Vjb25kID0gdmFsdWU7CiAgICAgICAgY29uZmlnLT5zZW5kcGVyc2Vjb25kID0gdmFsdWU7CiAgICAgIH0KICAgICAgYnJlYWs7CgogICAgICBjYXNlICdqJzogLyogLS1jb21wcmVzc2VkICovCiAgICAgICAgaWYodG9nZ2xlICYmICEoY3VybGluZm8tPmZlYXR1cmVzICYgQ1VSTF9WRVJTSU9OX0xJQlopKQogICAgICAgICAgcmV0dXJuIFBBUkFNX0xJQkNVUkxfRE9FU05UX1NVUFBPUlQ7CiAgICAgICAgY29uZmlnLT5lbmNvZGluZyA9IHRvZ2dsZTsKICAgICAgICBicmVhazsKCiAgICAgIGNhc2UgJ0onOiAvKiAtLXRyLWVuY29kaW5nICovCiAgICAgICAgY29uZmlnLT50cl9lbmNvZGluZyA9IHRvZ2dsZTsKICAgICAgICBicmVhazsKCiAgICAgIGNhc2UgJ2snOiAvKiAtLWRpZ2VzdCAqLwogICAgICAgIGlmKHRvZ2dsZSkKICAgICAgICAgIGNvbmZpZy0+YXV0aHR5cGUgfD0gQ1VSTEFVVEhfRElHRVNUOwogICAgICAgIGVsc2UKICAgICAgICAgIGNvbmZpZy0+YXV0aHR5cGUgJj0gfkNVUkxBVVRIX0RJR0VTVDsKICAgICAgICBicmVhazsKCiAgICAgIGNhc2UgJ2wnOiAvKiAtLW5lZ290aWF0ZSAqLwogICAgICAgIGlmKHRvZ2dsZSkgewogICAgICAgICAgaWYoY3VybGluZm8tPmZlYXR1cmVzICYgQ1VSTF9WRVJTSU9OX0dTU05FR09USUFURSkKICAgICAgICAgICAgY29uZmlnLT5hdXRodHlwZSB8PSBDVVJMQVVUSF9HU1NORUdPVElBVEU7CiAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHJldHVybiBQQVJBTV9MSUJDVVJMX0RPRVNOVF9TVVBQT1JUOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgICBjb25maWctPmF1dGh0eXBlICY9IH5DVVJMQVVUSF9HU1NORUdPVElBVEU7CiAgICAgICAgYnJlYWs7CgogICAgICBjYXNlICdtJzogLyogLS1udGxtICovCiAgICAgICAgaWYodG9nZ2xlKSB7CiAgICAgICAgICBpZihjdXJsaW5mby0+ZmVhdHVyZXMgJiBDVVJMX1ZFUlNJT05fTlRMTSkKICAgICAgICAgICAgY29uZmlnLT5hdXRodHlwZSB8PSBDVVJMQVVUSF9OVExNOwogICAgICAgICAgZWxzZQogICAgICAgICAgICByZXR1cm4gUEFSQU1fTElCQ1VSTF9ET0VTTlRfU1VQUE9SVDsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgICAgY29uZmlnLT5hdXRodHlwZSAmPSB+Q1VSTEFVVEhfTlRMTTsKICAgICAgICBicmVhazsKCiAgICAgIGNhc2UgJ00nOiAvKiAtLW50bG0td2IgKi8KICAgICAgICBpZih0b2dnbGUpIHsKICAgICAgICAgIGlmKGN1cmxpbmZvLT5mZWF0dXJlcyAmIENVUkxfVkVSU0lPTl9OVExNX1dCKQogICAgICAgICAgICBjb25maWctPmF1dGh0eXBlIHw9IENVUkxBVVRIX05UTE1fV0I7CiAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHJldHVybiBQQVJBTV9MSUJDVVJMX0RPRVNOVF9TVVBQT1JUOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgICBjb25maWctPmF1dGh0eXBlICY9IH5DVVJMQVVUSF9OVExNX1dCOwogICAgICAgIGJyZWFrOwoKICAgICAgY2FzZSAnbic6IC8qIC0tYmFzaWMgZm9yIGNvbXBsZXRlbmVzcyAqLwogICAgICAgIGlmKHRvZ2dsZSkKICAgICAgICAgIGNvbmZpZy0+YXV0aHR5cGUgfD0gQ1VSTEFVVEhfQkFTSUM7CiAgICAgICAgZWxzZQogICAgICAgICAgY29uZmlnLT5hdXRodHlwZSAmPSB+Q1VSTEFVVEhfQkFTSUM7CiAgICAgICAgYnJlYWs7CgogICAgICBjYXNlICdvJzogLyogLS1hbnlhdXRoLCBsZXQgbGliY3VybCBwaWNrIGl0ICovCiAgICAgICAgaWYodG9nZ2xlKQogICAgICAgICAgY29uZmlnLT5hdXRodHlwZSA9IENVUkxBVVRIX0FOWTsKICAgICAgICAvKiAtLW5vLWFueWF1dGggc2ltcGx5IGRvZXNuJ3QgdG91Y2ggaXQgKi8KICAgICAgICBicmVhazsKCiNpZmRlZiBVU0VfV0FUVDMyCiAgICAgIGNhc2UgJ3AnOiAvKiAtLXdkZWJ1ZyAqLwogICAgICAgIGRidWdfaW5pdCgpOwogICAgICAgIGJyZWFrOwojZW5kaWYKICAgICAgY2FzZSAncSc6IC8qIC0tZnRwLWNyZWF0ZS1kaXJzICovCiAgICAgICAgY29uZmlnLT5mdHBfY3JlYXRlX2RpcnMgPSB0b2dnbGU7CiAgICAgICAgYnJlYWs7CgogICAgICBjYXNlICdyJzogLyogLS1jcmVhdGUtZGlycyAqLwogICAgICAgIGNvbmZpZy0+Y3JlYXRlX2RpcnMgPSBUUlVFOwogICAgICAgIGJyZWFrOwoKICAgICAgY2FzZSAncyc6IC8qIC0tbWF4LXJlZGlycyAqLwogICAgICAgIC8qIHNwZWNpZmllZCBtYXggbm8gb2YgcmVkaXJlY3RzIChodHRwKHMpKSAqLwogICAgICAgIGlmKHN0cjJudW0oJmNvbmZpZy0+bWF4cmVkaXJzLCBuZXh0YXJnKSkKICAgICAgICAgIHJldHVybiBQQVJBTV9CQURfTlVNRVJJQzsKICAgICAgICBicmVhazsKCiAgICAgIGNhc2UgJ3QnOiAvKiAtLXByb3h5LW50bG0gKi8KICAgICAgICBpZihjdXJsaW5mby0+ZmVhdHVyZXMgJiBDVVJMX1ZFUlNJT05fTlRMTSkKICAgICAgICAgIGNvbmZpZy0+cHJveHludGxtID0gdG9nZ2xlOwogICAgICAgIGVsc2UKICAgICAgICAgIHJldHVybiBQQVJBTV9MSUJDVVJMX0RPRVNOVF9TVVBQT1JUOwogICAgICAgIGJyZWFrOwoKICAgICAgY2FzZSAndSc6IC8qIC0tY3JsZiAqLwogICAgICAgIC8qIExGIC0+IENSTEYgY29udmVyc2lvbj8gKi8KICAgICAgICBjb25maWctPmNybGYgPSBUUlVFOwogICAgICAgIGJyZWFrOwoKICAgICAgY2FzZSAndic6IC8qIC0tc3RkZXJyICovCiAgICAgICAgaWYoc3RyY21wKG5leHRhcmcsICItIikpIHsKICAgICAgICAgIEZJTEUgKm5ld2ZpbGUgPSBmb3BlbihuZXh0YXJnLCAid3QiKTsKICAgICAgICAgIGlmKCFuZXdmaWxlKQogICAgICAgICAgICB3YXJuZihjb25maWcsICJGYWlsZWQgdG8gb3BlbiAlcyFcbiIsIG5leHRhcmcpOwogICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGlmKGNvbmZpZy0+ZXJyb3JzX2ZvcGVuZWQpCiAgICAgICAgICAgICAgZmNsb3NlKGNvbmZpZy0+ZXJyb3JzKTsKICAgICAgICAgICAgY29uZmlnLT5lcnJvcnMgPSBuZXdmaWxlOwogICAgICAgICAgICBjb25maWctPmVycm9yc19mb3BlbmVkID0gVFJVRTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgICAgY29uZmlnLT5lcnJvcnMgPSBzdGRvdXQ7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgJ3cnOiAvKiAtLWludGVyZmFjZSAqLwogICAgICAgIC8qIGludGVyZmFjZSAqLwogICAgICAgIEdldFN0cigmY29uZmlnLT5pZmFjZSwgbmV4dGFyZyk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgJ3gnOiAvKiAtLWtyYiAqLwogICAgICAgIC8qIGtlcmJlcm9zIGxldmVsIHN0cmluZyAqLwogICAgICAgIGlmKGN1cmxpbmZvLT5mZWF0dXJlcyAmIChDVVJMX1ZFUlNJT05fS0VSQkVST1M0IHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1VSTF9WRVJTSU9OX0dTU05FR09USUFURSkpCiAgICAgICAgICBHZXRTdHIoJmNvbmZpZy0+a3JibGV2ZWwsIG5leHRhcmcpOwogICAgICAgIGVsc2UKICAgICAgICAgIHJldHVybiBQQVJBTV9MSUJDVVJMX0RPRVNOVF9TVVBQT1JUOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICd5JzogLyogLS1tYXgtZmlsZXNpemUgKi8KICAgICAgICBpZihzdHIyb2Zmc2V0KCZjb25maWctPm1heF9maWxlc2l6ZSwgbmV4dGFyZykpCiAgICAgICAgICByZXR1cm4gUEFSQU1fQkFEX05VTUVSSUM7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgJ3onOiAvKiAtLWRpc2FibGUtZXBydCAqLwogICAgICAgIGNvbmZpZy0+ZGlzYWJsZV9lcHJ0ID0gdG9nZ2xlOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICdaJzogLyogLS1lcHJ0ICovCiAgICAgICAgY29uZmlnLT5kaXNhYmxlX2VwcnQgPSAoIXRvZ2dsZSk/VFJVRTpGQUxTRTsKICAgICAgICBicmVhazsKCiAgICAgIGRlZmF1bHQ6IC8qIHRoZSBVUkwhICovCiAgICAgIHsKICAgICAgICBzdHJ1Y3QgZ2V0b3V0ICp1cmw7CiAgICAgICAgaWYoY29uZmlnLT51cmxfZ2V0IHx8ICgoY29uZmlnLT51cmxfZ2V0ID0gY29uZmlnLT51cmxfbGlzdCkgIT0gTlVMTCkpIHsKICAgICAgICAgIC8qIHRoZXJlJ3MgYSBub2RlIGhlcmUsIGlmIGl0IGFscmVhZHkgaXMgZmlsbGVkLWluIGNvbnRpbnVlIHRvIGZpbmQKICAgICAgICAgICAgIGFuICJlbXB0eSIgbm9kZSAqLwogICAgICAgICAgd2hpbGUoY29uZmlnLT51cmxfZ2V0ICYmIChjb25maWctPnVybF9nZXQtPmZsYWdzICYgR0VUT1VUX1VSTCkpCiAgICAgICAgICAgIGNvbmZpZy0+dXJsX2dldCA9IGNvbmZpZy0+dXJsX2dldC0+bmV4dDsKICAgICAgICB9CgogICAgICAgIC8qIG5vdyB0aGVyZSBtaWdodCBvciBtaWdodCBub3QgYmUgYW4gYXZhaWxhYmxlIG5vZGUgdG8gZmlsbCBpbiEgKi8KCiAgICAgICAgaWYoY29uZmlnLT51cmxfZ2V0KQogICAgICAgICAgLyogZXhpc3Rpbmcgbm9kZSAqLwogICAgICAgICAgdXJsID0gY29uZmlnLT51cmxfZ2V0OwogICAgICAgIGVsc2UKICAgICAgICAgIC8qIHRoZXJlIHdhcyBubyBmcmVlIG5vZGUsIGNyZWF0ZSBvbmUhICovCiAgICAgICAgICB1cmwgPSBuZXdfZ2V0b3V0KGNvbmZpZyk7CgogICAgICAgIGlmKCF1cmwpCiAgICAgICAgICByZXR1cm4gUEFSQU1fTk9fTUVNOwogICAgICAgIGVsc2UgewogICAgICAgICAgLyogZmlsbCBpbiB0aGUgVVJMICovCiAgICAgICAgICBHZXRTdHIoJnVybC0+dXJsLCBuZXh0YXJnKTsKICAgICAgICAgIHVybC0+ZmxhZ3MgfD0gR0VUT1VUX1VSTDsKICAgICAgICB9CiAgICAgIH0KICAgICAgfQogICAgICBicmVhazsKICAgIGNhc2UgJyQnOiAvKiBtb3JlIG9wdGlvbnMgd2l0aG91dCBhIHNob3J0IG9wdGlvbiAqLwogICAgICBzd2l0Y2goc3VibGV0dGVyKSB7CiAgICAgIGNhc2UgJ2EnOiAvKiAtLWZ0cC1zc2wgKi8KICAgICAgICBpZih0b2dnbGUgJiYgIShjdXJsaW5mby0+ZmVhdHVyZXMgJiBDVVJMX1ZFUlNJT05fU1NMKSkKICAgICAgICAgIHJldHVybiBQQVJBTV9MSUJDVVJMX0RPRVNOVF9TVVBQT1JUOwogICAgICAgIGNvbmZpZy0+ZnRwX3NzbCA9IHRvZ2dsZTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAnYic6IC8qIC0tZnRwLXBhc3YgKi8KICAgICAgICBDdXJsX3NhZmVmcmVlKGNvbmZpZy0+ZnRwcG9ydCk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgJ2MnOiAvKiAtLXNvY2tzNSBzcGVjaWZpZXMgYSBzb2NrczUgcHJveHkgdG8gdXNlLCBhbmQgcmVzb2x2ZXMKICAgICAgICAgICAgICAgICAgIHRoZSBuYW1lIGxvY2FsbHkgYW5kIHBhc3NlcyBvbiB0aGUgcmVzb2x2ZWQgYWRkcmVzcyAqLwogICAgICAgIEdldFN0cigmY29uZmlnLT5zb2Nrc3Byb3h5LCBuZXh0YXJnKTsKICAgICAgICBjb25maWctPnNvY2tzdmVyID0gQ1VSTFBST1hZX1NPQ0tTNTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAndCc6IC8qIC0tc29ja3M0IHNwZWNpZmllcyBhIHNvY2tzNCBwcm94eSB0byB1c2UgKi8KICAgICAgICBHZXRTdHIoJmNvbmZpZy0+c29ja3Nwcm94eSwgbmV4dGFyZyk7CiAgICAgICAgY29uZmlnLT5zb2Nrc3ZlciA9IENVUkxQUk9YWV9TT0NLUzQ7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgJ1QnOiAvKiAtLXNvY2tzNGEgc3BlY2lmaWVzIGEgc29ja3M0YSBwcm94eSB0byB1c2UgKi8KICAgICAgICBHZXRTdHIoJmNvbmZpZy0+c29ja3Nwcm94eSwgbmV4dGFyZyk7CiAgICAgICAgY29uZmlnLT5zb2Nrc3ZlciA9IENVUkxQUk9YWV9TT0NLUzRBOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICcyJzogLyogLS1zb2NrczUtaG9zdG5hbWUgc3BlY2lmaWVzIGEgc29ja3M1IHByb3h5IGFuZCBlbmFibGVzIG5hbWUKICAgICAgICAgICAgICAgICAgIHJlc29sdmluZyB3aXRoIHRoZSBwcm94eSAqLwogICAgICAgIEdldFN0cigmY29uZmlnLT5zb2Nrc3Byb3h5LCBuZXh0YXJnKTsKICAgICAgICBjb25maWctPnNvY2tzdmVyID0gQ1VSTFBST1hZX1NPQ0tTNV9IT1NUTkFNRTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAnZCc6IC8qIC0tdGNwLW5vZGVsYXkgb3B0aW9uICovCiAgICAgICAgY29uZmlnLT50Y3Bfbm9kZWxheSA9IHRvZ2dsZTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAnZSc6IC8qIC0tcHJveHktZGlnZXN0ICovCiAgICAgICAgY29uZmlnLT5wcm94eWRpZ2VzdCA9IHRvZ2dsZTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAnZic6IC8qIC0tcHJveHktYmFzaWMgKi8KICAgICAgICBjb25maWctPnByb3h5YmFzaWMgPSB0b2dnbGU7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgJ2cnOiAvKiAtLXJldHJ5ICovCiAgICAgICAgaWYoc3RyMm51bSgmY29uZmlnLT5yZXFfcmV0cnksIG5leHRhcmcpKQogICAgICAgICAgcmV0dXJuIFBBUkFNX0JBRF9OVU1FUklDOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICdoJzogLyogLS1yZXRyeS1kZWxheSAqLwogICAgICAgIGlmKHN0cjJudW0oJmNvbmZpZy0+cmV0cnlfZGVsYXksIG5leHRhcmcpKQogICAgICAgICAgcmV0dXJuIFBBUkFNX0JBRF9OVU1FUklDOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICdpJzogLyogLS1yZXRyeS1tYXgtdGltZSAqLwogICAgICAgIGlmKHN0cjJudW0oJmNvbmZpZy0+cmV0cnlfbWF4dGltZSwgbmV4dGFyZykpCiAgICAgICAgICByZXR1cm4gUEFSQU1fQkFEX05VTUVSSUM7CiAgICAgICAgYnJlYWs7CgogICAgICBjYXNlICdrJzogLyogLS1wcm94eS1uZWdvdGlhdGUgKi8KICAgICAgICBpZihjdXJsaW5mby0+ZmVhdHVyZXMgJiBDVVJMX1ZFUlNJT05fR1NTTkVHT1RJQVRFKQogICAgICAgICAgY29uZmlnLT5wcm94eW5lZ290aWF0ZSA9IHRvZ2dsZTsKICAgICAgICBlbHNlCiAgICAgICAgICByZXR1cm4gUEFSQU1fTElCQ1VSTF9ET0VTTlRfU1VQUE9SVDsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAnbSc6IC8qIC0tZnRwLWFjY291bnQgKi8KICAgICAgICBHZXRTdHIoJmNvbmZpZy0+ZnRwX2FjY291bnQsIG5leHRhcmcpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICduJzogLyogLS1wcm94eS1hbnlhdXRoICovCiAgICAgICAgY29uZmlnLT5wcm94eWFueWF1dGggPSB0b2dnbGU7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgJ28nOiAvKiAtLXRyYWNlLXRpbWUgKi8KICAgICAgICBjb25maWctPnRyYWNldGltZSA9IHRvZ2dsZTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAncCc6IC8qIC0taWdub3JlLWNvbnRlbnQtbGVuZ3RoICovCiAgICAgICAgY29uZmlnLT5pZ25vcmVjbCA9IHRvZ2dsZTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAncSc6IC8qIC0tZnRwLXNraXAtcGFzdi1pcCAqLwogICAgICAgIGNvbmZpZy0+ZnRwX3NraXBfaXAgPSB0b2dnbGU7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgJ3InOiAvKiAtLWZ0cC1tZXRob2QgKHVuZG9jdW1lbnRlZCBhdCB0aGlzIHBvaW50KSAqLwogICAgICAgIGNvbmZpZy0+ZnRwX2ZpbGVtZXRob2QgPSBmdHBmaWxlbWV0aG9kKGNvbmZpZywgbmV4dGFyZyk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgJ3MnOiAvKiAtLWxvY2FsLXBvcnQgKi8KICAgICAgICByYyA9IHNzY2FuZihuZXh0YXJnLCAiJWQgLSAlZCIsCiAgICAgICAgICAgICAgICAgICAgJmNvbmZpZy0+bG9jYWxwb3J0LAogICAgICAgICAgICAgICAgICAgICZjb25maWctPmxvY2FscG9ydHJhbmdlKTsKICAgICAgICBpZighcmMpCiAgICAgICAgICByZXR1cm4gUEFSQU1fQkFEX1VTRTsKICAgICAgICBlbHNlIGlmKHJjID09IDEpCiAgICAgICAgICBjb25maWctPmxvY2FscG9ydHJhbmdlID0gMTsgLyogZGVmYXVsdCBudW1iZXIgb2YgcG9ydHMgdG8gdHJ5ICovCiAgICAgICAgZWxzZSB7CiAgICAgICAgICBjb25maWctPmxvY2FscG9ydHJhbmdlIC09IGNvbmZpZy0+bG9jYWxwb3J0OwogICAgICAgICAgaWYoY29uZmlnLT5sb2NhbHBvcnRyYW5nZSA8IDEpIHsKICAgICAgICAgICAgd2FybmYoY29uZmlnLCAiYmFkIHJhbmdlIGlucHV0XG4iKTsKICAgICAgICAgICAgcmV0dXJuIFBBUkFNX0JBRF9VU0U7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgICBjYXNlICd1JzogLyogLS1mdHAtYWx0ZXJuYXRpdmUtdG8tdXNlciAqLwogICAgICAgIEdldFN0cigmY29uZmlnLT5mdHBfYWx0ZXJuYXRpdmVfdG9fdXNlciwgbmV4dGFyZyk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgJ3YnOiAvKiAtLWZ0cC1zc2wtcmVxZCAqLwogICAgICAgIGlmKHRvZ2dsZSAmJiAhKGN1cmxpbmZvLT5mZWF0dXJlcyAmIENVUkxfVkVSU0lPTl9TU0wpKQogICAgICAgICAgcmV0dXJuIFBBUkFNX0xJQkNVUkxfRE9FU05UX1NVUFBPUlQ7CiAgICAgICAgY29uZmlnLT5mdHBfc3NsX3JlcWQgPSB0b2dnbGU7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgJ3cnOiAvKiAtLW5vLXNlc3Npb25pZCAqLwogICAgICAgIGNvbmZpZy0+ZGlzYWJsZV9zZXNzaW9uaWQgPSAoIXRvZ2dsZSk/VFJVRTpGQUxTRTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAneCc6IC8qIC0tZnRwLXNzbC1jb250cm9sICovCiAgICAgICAgaWYodG9nZ2xlICYmICEoY3VybGluZm8tPmZlYXR1cmVzICYgQ1VSTF9WRVJTSU9OX1NTTCkpCiAgICAgICAgICByZXR1cm4gUEFSQU1fTElCQ1VSTF9ET0VTTlRfU1VQUE9SVDsKICAgICAgICBjb25maWctPmZ0cF9zc2xfY29udHJvbCA9IHRvZ2dsZTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAneSc6IC8qIC0tZnRwLXNzbC1jY2MgKi8KICAgICAgICBjb25maWctPmZ0cF9zc2xfY2NjID0gdG9nZ2xlOwogICAgICAgIGlmKCFjb25maWctPmZ0cF9zc2xfY2NjX21vZGUpCiAgICAgICAgICBjb25maWctPmZ0cF9zc2xfY2NjX21vZGUgPSBDVVJMRlRQU1NMX0NDQ19QQVNTSVZFOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICdqJzogLyogLS1mdHAtc3NsLWNjYy1tb2RlICovCiAgICAgICAgY29uZmlnLT5mdHBfc3NsX2NjYyA9IFRSVUU7CiAgICAgICAgY29uZmlnLT5mdHBfc3NsX2NjY19tb2RlID0gZnRwY2NjbWV0aG9kKGNvbmZpZywgbmV4dGFyZyk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgJ3onOiAvKiAtLWxpYmN1cmwgKi8KICAgICAgICBHZXRTdHIoJmNvbmZpZy0+bGliY3VybCwgbmV4dGFyZyk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgJyMnOiAvKiAtLXJhdyAqLwogICAgICAgIGNvbmZpZy0+cmF3ID0gdG9nZ2xlOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICcwJzogLyogLS1wb3N0MzAxICovCiAgICAgICAgY29uZmlnLT5wb3N0MzAxID0gdG9nZ2xlOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICcxJzogLyogLS1uby1rZWVwYWxpdmUgKi8KICAgICAgICBjb25maWctPm5va2VlcGFsaXZlID0gKCF0b2dnbGUpP1RSVUU6RkFMU0U7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgJzMnOiAvKiAtLWtlZXBhbGl2ZS10aW1lICovCiAgICAgICAgaWYoc3RyMm51bSgmY29uZmlnLT5hbGl2ZXRpbWUsIG5leHRhcmcpKQogICAgICAgICAgcmV0dXJuIFBBUkFNX0JBRF9OVU1FUklDOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICc0JzogLyogLS1wb3N0MzAyICovCiAgICAgICAgY29uZmlnLT5wb3N0MzAyID0gdG9nZ2xlOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICc1JzogLyogLS1ub3Byb3h5ICovCiAgICAgICAgLyogVGhpcyBzcGVjaWZpZXMgdGhlIG5vcHJveHkgbGlzdCAqLwogICAgICAgIEdldFN0cigmY29uZmlnLT5ub3Byb3h5LCBuZXh0YXJnKTsKICAgICAgICBicmVhazsKI2lmIGRlZmluZWQoSEFWRV9HU1NBUEkpIHx8IGRlZmluZWQoVVNFX1dJTkRPV1NfU1NQSSkKICAgICAgY2FzZSAnNic6IC8qIC0tc29ja3M1LWdzc2FwaS1zZXJ2aWNlICovCiAgICAgICAgR2V0U3RyKCZjb25maWctPnNvY2tzNV9nc3NhcGlfc2VydmljZSwgbmV4dGFyZyk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgJzcnOiAvKiAtLXNvY2tzNS1nc3NhcGktbmVjKi8KICAgICAgICBjb25maWctPnNvY2tzNV9nc3NhcGlfbmVjID0gVFJVRTsKICAgICAgICBicmVhazsKI2VuZGlmCiAgICAgIGNhc2UgJzgnOiAvKiAtLXByb3h5MS4wICovCiAgICAgICAgLyogaHR0cCAxLjAgcHJveHkgKi8KICAgICAgICBHZXRTdHIoJmNvbmZpZy0+cHJveHksIG5leHRhcmcpOwogICAgICAgIGNvbmZpZy0+cHJveHl2ZXIgPSBDVVJMUFJPWFlfSFRUUF8xXzA7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgJzknOiAvKiAtLXRmdHAtYmxrc2l6ZSAqLwogICAgICAgIHN0cjJudW0oJmNvbmZpZy0+dGZ0cF9ibGtzaXplLCBuZXh0YXJnKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAnQSc6IC8qIC0tbWFpbC1mcm9tICovCiAgICAgICAgR2V0U3RyKCZjb25maWctPm1haWxfZnJvbSwgbmV4dGFyZyk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgJ0InOiAvKiAtLW1haWwtcmNwdCAqLwogICAgICAgIC8qIGFwcGVuZCByZWNlaXZlciB0byBhIGxpc3QgKi8KICAgICAgICBlcnIgPSBhZGQybGlzdCgmY29uZmlnLT5tYWlsX3JjcHQsIG5leHRhcmcpOwogICAgICAgIGlmKGVycikKICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgJ0MnOiAvKiAtLWZ0cC1wcmV0ICovCiAgICAgICAgY29uZmlnLT5mdHBfcHJldCA9IHRvZ2dsZTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAnRCc6IC8qIC0tcHJvdG8gKi8KICAgICAgICBjb25maWctPnByb3RvX3ByZXNlbnQgPSBUUlVFOwogICAgICAgIGlmKHByb3RvMm51bShjb25maWcsICZjb25maWctPnByb3RvLCBuZXh0YXJnKSkKICAgICAgICAgIHJldHVybiBQQVJBTV9CQURfVVNFOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICdFJzogLyogLS1wcm90by1yZWRpciAqLwogICAgICAgIGNvbmZpZy0+cHJvdG9fcmVkaXJfcHJlc2VudCA9IFRSVUU7CiAgICAgICAgaWYocHJvdG8ybnVtKGNvbmZpZywgJmNvbmZpZy0+cHJvdG9fcmVkaXIsIG5leHRhcmcpKQogICAgICAgICAgcmV0dXJuIFBBUkFNX0JBRF9VU0U7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgJ0YnOiAvKiAtLXJlc29sdmUgKi8KICAgICAgICBlcnIgPSBhZGQybGlzdCgmY29uZmlnLT5yZXNvbHZlLCBuZXh0YXJnKTsKICAgICAgICBpZihlcnIpCiAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICdHJzogLyogLS1kZWxlZ2F0aW9uIExFVkVMICovCiAgICAgICAgY29uZmlnLT5nc3NhcGlfZGVsZWdhdGlvbiA9IGRlbGVnYXRpb24oY29uZmlnLCBuZXh0YXJnKTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBicmVhazsKICAgIGNhc2UgJyMnOiAvKiAtLXByb2dyZXNzLWJhciAqLwogICAgICBpZih0b2dnbGUpCiAgICAgICAgY29uZmlnLT5wcm9ncmVzc21vZGUgPSBDVVJMX1BST0dSRVNTX0JBUjsKICAgICAgZWxzZQogICAgICAgIGNvbmZpZy0+cHJvZ3Jlc3Ntb2RlID0gQ1VSTF9QUk9HUkVTU19TVEFUUzsKICAgICAgYnJlYWs7CiAgICBjYXNlICd+JzogLyogLS14YXR0ciAqLwogICAgICBjb25maWctPnhhdHRyID0gdG9nZ2xlOwogICAgICBicmVhazsKICAgIGNhc2UgJzAnOgogICAgICAvKiBIVFRQIHZlcnNpb24gMS4wICovCiAgICAgIGNvbmZpZy0+aHR0cHZlcnNpb24gPSBDVVJMX0hUVFBfVkVSU0lPTl8xXzA7CiAgICAgIGJyZWFrOwogICAgY2FzZSAnMSc6CiAgICAgIC8qIFRMUyB2ZXJzaW9uIDEgKi8KICAgICAgY29uZmlnLT5zc2xfdmVyc2lvbiA9IENVUkxfU1NMVkVSU0lPTl9UTFN2MTsKICAgICAgYnJlYWs7CiAgICBjYXNlICcyJzoKICAgICAgLyogU1NMIHZlcnNpb24gMiAqLwogICAgICBjb25maWctPnNzbF92ZXJzaW9uID0gQ1VSTF9TU0xWRVJTSU9OX1NTTHYyOwogICAgICBicmVhazsKICAgIGNhc2UgJzMnOgogICAgICAvKiBTU0wgdmVyc2lvbiAzICovCiAgICAgIGNvbmZpZy0+c3NsX3ZlcnNpb24gPSBDVVJMX1NTTFZFUlNJT05fU1NMdjM7CiAgICAgIGJyZWFrOwogICAgY2FzZSAnNCc6CiAgICAgIC8qIElQdjQgKi8KICAgICAgY29uZmlnLT5pcF92ZXJzaW9uID0gNDsKICAgICAgYnJlYWs7CiAgICBjYXNlICc2JzoKICAgICAgLyogSVB2NiAqLwogICAgICBjb25maWctPmlwX3ZlcnNpb24gPSA2OwogICAgICBicmVhazsKICAgIGNhc2UgJ2EnOgogICAgICAvKiBUaGlzIG1ha2VzIHRoZSBGVFAgc2Vzc2lvbnMgdXNlIEFQUEUgaW5zdGVhZCBvZiBTVE9SICovCiAgICAgIGNvbmZpZy0+ZnRwX2FwcGVuZCA9IHRvZ2dsZTsKICAgICAgYnJlYWs7CiAgICBjYXNlICdBJzoKICAgICAgLyogVGhpcyBzcGVjaWZpZXMgdGhlIFVzZXItQWdlbnQgbmFtZSAqLwogICAgICBHZXRTdHIoJmNvbmZpZy0+dXNlcmFnZW50LCBuZXh0YXJnKTsKICAgICAgYnJlYWs7CiAgICBjYXNlICdiJzogLyogY29va2llIHN0cmluZyBjb21pbmcgdXA6ICovCiAgICAgIGlmKG5leHRhcmdbMF0gPT0gJ0AnKSB7CiAgICAgICAgbmV4dGFyZysrOwogICAgICB9CiAgICAgIGVsc2UgaWYoc3RyY2hyKG5leHRhcmcsICc9JykpIHsKICAgICAgICAvKiBBIGNvb2tpZSBzdHJpbmcgbXVzdCBoYXZlIGEgPS1sZXR0ZXIgKi8KICAgICAgICBHZXRTdHIoJmNvbmZpZy0+Y29va2llLCBuZXh0YXJnKTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICAvKiBXZSBoYXZlIGEgY29va2llIGZpbGUgdG8gcmVhZCBmcm9tISAqLwogICAgICBHZXRTdHIoJmNvbmZpZy0+Y29va2llZmlsZSwgbmV4dGFyZyk7CiAgICAgIGJyZWFrOwogICAgY2FzZSAnQic6CiAgICAgIC8qIHVzZSBBU0NJSS90ZXh0IHdoZW4gdHJhbnNmZXJyaW5nICovCiAgICAgIGNvbmZpZy0+dXNlX2FzY2lpID0gdG9nZ2xlOwogICAgICBicmVhazsKICAgIGNhc2UgJ2MnOgogICAgICAvKiBnZXQgdGhlIGZpbGUgbmFtZSB0byBkdW1wIGFsbCBjb29raWVzIGluICovCiAgICAgIEdldFN0cigmY29uZmlnLT5jb29raWVqYXIsIG5leHRhcmcpOwogICAgICBicmVhazsKICAgIGNhc2UgJ0MnOgogICAgICAvKiBUaGlzIG1ha2VzIHVzIGNvbnRpbnVlIGFuIGZ0cCB0cmFuc2ZlciBhdCBnaXZlbiBwb3NpdGlvbiAqLwogICAgICBpZighY3VybHhfc3RyZXF1YWwobmV4dGFyZywgIi0iKSkgewogICAgICAgIGlmKHN0cjJvZmZzZXQoJmNvbmZpZy0+cmVzdW1lX2Zyb20sIG5leHRhcmcpKQogICAgICAgICAgcmV0dXJuIFBBUkFNX0JBRF9OVU1FUklDOwogICAgICAgIGNvbmZpZy0+cmVzdW1lX2Zyb21fY3VycmVudCA9IEZBTFNFOwogICAgICB9CiAgICAgIGVsc2UgewogICAgICAgIGNvbmZpZy0+cmVzdW1lX2Zyb21fY3VycmVudCA9IFRSVUU7CiAgICAgICAgY29uZmlnLT5yZXN1bWVfZnJvbSA9IDA7CiAgICAgIH0KICAgICAgY29uZmlnLT51c2VfcmVzdW1lPVRSVUU7CiAgICAgIGJyZWFrOwogICAgY2FzZSAnZCc6CiAgICAgIC8qIHBvc3RmaWVsZCBkYXRhICovCiAgICB7CiAgICAgIGNoYXIgKnBvc3RkYXRhID0gTlVMTDsKICAgICAgRklMRSAqZmlsZTsKICAgICAgc2l6ZV90IHNpemUgPSAwOwoKICAgICAgaWYoc3VibGV0dGVyID09ICdlJykgeyAvKiAtLWRhdGEtdXJsZW5jb2RlKi8KICAgICAgICAvKiBbbmFtZV09W2NvbnRlbnRdLCB3ZSBlbmNvZGUgdGhlIGNvbnRlbnQgcGFydCBvbmx5CiAgICAgICAgICogW25hbWVdQFtmaWxlIG5hbWVdCiAgICAgICAgICoKICAgICAgICAgKiBDYXNlIDI6IHdlIGZpcnN0IGxvYWQgdGhlIGZpbGUgdXNpbmcgdGhhdCBuYW1lIGFuZCB0aGVuIGVuY29kZQogICAgICAgICAqIHRoZSBjb250ZW50LgogICAgICAgICAqLwogICAgICAgIGNvbnN0IGNoYXIgKnAgPSBzdHJjaHIobmV4dGFyZywgJz0nKTsKICAgICAgICBzaXplX3QgbmxlbjsKICAgICAgICBjaGFyIGlzX2ZpbGU7CiAgICAgICAgaWYoIXApCiAgICAgICAgICAvKiB0aGVyZSB3YXMgbm8gJz0nIGxldHRlciwgY2hlY2sgZm9yIGEgJ0AnIGluc3RlYWQgKi8KICAgICAgICAgIHAgPSBzdHJjaHIobmV4dGFyZywgJ0AnKTsKICAgICAgICBpZihwKSB7CiAgICAgICAgICBubGVuID0gcCAtIG5leHRhcmc7IC8qIGxlbmd0aCBvZiB0aGUgbmFtZSBwYXJ0ICovCiAgICAgICAgICBpc19maWxlID0gKnArKzsgLyogcGFzcyB0aGUgc2VwYXJhdG9yICovCiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgLyogbmVpdGhlciBAIG5vciA9LCBzbyBubyBuYW1lIGFuZCBpdCBpc24ndCBhIGZpbGUgKi8KICAgICAgICAgIG5sZW4gPSBpc19maWxlID0gMDsKICAgICAgICAgIHAgPSBuZXh0YXJnOwogICAgICAgIH0KICAgICAgICBpZignQCcgPT0gaXNfZmlsZSkgewogICAgICAgICAgLyogYSAnQCcgbGV0dGVyLCBpdCBtZWFucyB0aGF0IGEgZmlsZSBuYW1lIG9yIC0gKHN0ZGluKSBmb2xsb3dzICovCgogICAgICAgICAgaWYoY3VybHhfc3RyZXF1YWwoIi0iLCBwKSkgewogICAgICAgICAgICBmaWxlID0gc3RkaW47CiAgICAgICAgICAgIHNldF9iaW5tb2RlKHN0ZGluKTsKICAgICAgICAgIH0KICAgICAgICAgIGVsc2UgewogICAgICAgICAgICBmaWxlID0gZm9wZW4ocCwgInJiIik7CiAgICAgICAgICAgIGlmKCFmaWxlKQogICAgICAgICAgICAgIHdhcm5mKGNvbmZpZywKICAgICAgICAgICAgICAgICAgICAiQ291bGRuJ3QgcmVhZCBkYXRhIGZyb20gZmlsZSBcIiVzXCIsIHRoaXMgbWFrZXMgIgogICAgICAgICAgICAgICAgICAgICJhbiBlbXB0eSBQT1NULlxuIiwgbmV4dGFyZyk7CiAgICAgICAgICB9CgogICAgICAgICAgZXJyID0gZmlsZTJtZW1vcnkoJnBvc3RkYXRhLCAmc2l6ZSwgZmlsZSk7CgogICAgICAgICAgaWYoZmlsZSAmJiAoZmlsZSAhPSBzdGRpbikpCiAgICAgICAgICAgIGZjbG9zZShmaWxlKTsKICAgICAgICAgIGlmKGVycikKICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICBHZXRTdHIoJnBvc3RkYXRhLCBwKTsKICAgICAgICAgIGlmKHBvc3RkYXRhKQogICAgICAgICAgICBzaXplID0gc3RybGVuKHBvc3RkYXRhKTsKICAgICAgICB9CgogICAgICAgIGlmKCFwb3N0ZGF0YSkgewogICAgICAgICAgLyogbm8gZGF0YSBmcm9tIHRoZSBmaWxlLCBwb2ludCB0byBhIHplcm8gYnl0ZSBzdHJpbmcgdG8gbWFrZSB0aGlzCiAgICAgICAgICAgICBnZXQgc2VudCBhcyBhIFBPU1QgYW55d2F5ICovCiAgICAgICAgICBwb3N0ZGF0YSA9IHN0cmR1cCgiIik7CiAgICAgICAgICBpZighcG9zdGRhdGEpCiAgICAgICAgICAgIHJldHVybiBQQVJBTV9OT19NRU07CiAgICAgICAgICBzaXplID0gMDsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICBjaGFyICplbmMgPSBjdXJsX2Vhc3lfZXNjYXBlKGNvbmZpZy0+ZWFzeSwgcG9zdGRhdGEsIChpbnQpc2l6ZSk7CiAgICAgICAgICBDdXJsX3NhZmVmcmVlKHBvc3RkYXRhKTsgLyogbm8gbWF0dGVyIGlmIGl0IHdvcmtlZCBvciBub3QgKi8KICAgICAgICAgIGlmKGVuYykgewogICAgICAgICAgICAvKiBub3cgbWFrZSBhIHN0cmluZyB3aXRoIHRoZSBuYW1lIGZyb20gYWJvdmUgYW5kIGFwcGVuZCB0aGUKICAgICAgICAgICAgICAgZW5jb2RlZCBzdHJpbmcgKi8KICAgICAgICAgICAgc2l6ZV90IG91dGxlbiA9IG5sZW4gKyBzdHJsZW4oZW5jKSArIDI7CiAgICAgICAgICAgIGNoYXIgKm4gPSBtYWxsb2Mob3V0bGVuKTsKICAgICAgICAgICAgaWYoIW4pIHsKICAgICAgICAgICAgICBjdXJsX2ZyZWUoZW5jKTsKICAgICAgICAgICAgICByZXR1cm4gUEFSQU1fTk9fTUVNOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmKG5sZW4gPiAwKSB7IC8qIG9ubHkgYXBwZW5kICc9JyBpZiB3ZSBoYXZlIGEgbmFtZSAqLwogICAgICAgICAgICAgIHNucHJpbnRmKG4sIG91dGxlbiwgIiUuKnM9JXMiLCBubGVuLCBuZXh0YXJnLCBlbmMpOwogICAgICAgICAgICAgIHNpemUgPSBvdXRsZW4tMTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICBzdHJjcHkobiwgZW5jKTsKICAgICAgICAgICAgICBzaXplID0gb3V0bGVuLTI7IC8qIHNpbmNlIG5vICc9JyB3YXMgaW5zZXJ0ZWQgKi8KICAgICAgICAgICAgfQogICAgICAgICAgICBjdXJsX2ZyZWUoZW5jKTsKICAgICAgICAgICAgcG9zdGRhdGEgPSBuOwogICAgICAgICAgfQogICAgICAgICAgZWxzZQogICAgICAgICAgICByZXR1cm4gUEFSQU1fTk9fTUVNOwogICAgICAgIH0KICAgICAgfQogICAgICBlbHNlIGlmKCdAJyA9PSAqbmV4dGFyZykgewogICAgICAgIC8qIHRoZSBkYXRhIGJlZ2lucyB3aXRoIGEgJ0AnIGxldHRlciwgaXQgbWVhbnMgdGhhdCBhIGZpbGUgbmFtZQogICAgICAgICAgIG9yIC0gKHN0ZGluKSBmb2xsb3dzICovCiAgICAgICAgbmV4dGFyZysrOyAvKiBwYXNzIHRoZSBAICovCgogICAgICAgIGlmKGN1cmx4X3N0cmVxdWFsKCItIiwgbmV4dGFyZykpIHsKICAgICAgICAgIGZpbGUgPSBzdGRpbjsKICAgICAgICAgIGlmKHN1YmxldHRlciA9PSAnYicpIC8qIGZvcmNlZCBkYXRhLWJpbmFyeSAqLwogICAgICAgICAgICBzZXRfYmlubW9kZShzdGRpbik7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgZmlsZSA9IGZvcGVuKG5leHRhcmcsICJyYiIpOwogICAgICAgICAgaWYoIWZpbGUpCiAgICAgICAgICAgIHdhcm5mKGNvbmZpZywgIkNvdWxkbid0IHJlYWQgZGF0YSBmcm9tIGZpbGUgXCIlc1wiLCB0aGlzIG1ha2VzICIKICAgICAgICAgICAgICAgICAgImFuIGVtcHR5IFBPU1QuXG4iLCBuZXh0YXJnKTsKICAgICAgICB9CgogICAgICAgIGlmKHN1YmxldHRlciA9PSAnYicpCiAgICAgICAgICAvKiBmb3JjZWQgYmluYXJ5ICovCiAgICAgICAgICBlcnIgPSBmaWxlMm1lbW9yeSgmcG9zdGRhdGEsICZzaXplLCBmaWxlKTsKICAgICAgICBlbHNlIHsKICAgICAgICAgIGVyciA9IGZpbGUyc3RyaW5nKCZwb3N0ZGF0YSwgZmlsZSk7CiAgICAgICAgICBpZihwb3N0ZGF0YSkKICAgICAgICAgICAgc2l6ZSA9IHN0cmxlbihwb3N0ZGF0YSk7CiAgICAgICAgfQoKICAgICAgICBpZihmaWxlICYmIChmaWxlICE9IHN0ZGluKSkKICAgICAgICAgIGZjbG9zZShmaWxlKTsKICAgICAgICBpZihlcnIpCiAgICAgICAgICByZXR1cm4gZXJyOwoKICAgICAgICBpZighcG9zdGRhdGEpIHsKICAgICAgICAgIC8qIG5vIGRhdGEgZnJvbSB0aGUgZmlsZSwgcG9pbnQgdG8gYSB6ZXJvIGJ5dGUgc3RyaW5nIHRvIG1ha2UgdGhpcwogICAgICAgICAgICAgZ2V0IHNlbnQgYXMgYSBQT1NUIGFueXdheSAqLwogICAgICAgICAgcG9zdGRhdGEgPSBzdHJkdXAoIiIpOwogICAgICAgICAgaWYoIXBvc3RkYXRhKQogICAgICAgICAgICByZXR1cm4gUEFSQU1fTk9fTUVNOwogICAgICAgIH0KICAgICAgfQogICAgICBlbHNlIHsKICAgICAgICBHZXRTdHIoJnBvc3RkYXRhLCBuZXh0YXJnKTsKICAgICAgICBpZihwb3N0ZGF0YSkKICAgICAgICAgIHNpemUgPSBzdHJsZW4ocG9zdGRhdGEpOwogICAgICB9CgojaWZkZWYgQ1VSTF9ET0VTX0NPTlZFUlNJT05TCiAgICAgIGlmKHN1YmxldHRlciAhPSAnYicpIHsKICAgICAgICAvKiBOT1QgZm9yY2VkIGJpbmFyeSwgY29udmVydCB0byBBU0NJSSAqLwogICAgICAgIGlmKGNvbnZlcnRfdG9fbmV0d29yayhwb3N0ZGF0YSwgc3RybGVuKHBvc3RkYXRhKSkpIHsKICAgICAgICAgIEN1cmxfc2FmZWZyZWUocG9zdGRhdGEpOwogICAgICAgICAgcmV0dXJuIFBBUkFNX05PX01FTTsKICAgICAgICB9CiAgICAgIH0KI2VuZGlmCgogICAgICBpZihjb25maWctPnBvc3RmaWVsZHMpIHsKICAgICAgICAvKiB3ZSBhbHJlYWR5IGhhdmUgYSBzdHJpbmcsIHdlIGFwcGVuZCB0aGlzIG9uZSB3aXRoIGEgc2VwYXJhdGluZwogICAgICAgICAgICYtbGV0dGVyICovCiAgICAgICAgY2hhciAqb2xkcG9zdCA9IGNvbmZpZy0+cG9zdGZpZWxkczsKICAgICAgICBjdXJsX29mZl90IG9sZGxlbiA9IGNvbmZpZy0+cG9zdGZpZWxkc2l6ZTsKICAgICAgICBjdXJsX29mZl90IG5ld2xlbiA9IG9sZGxlbiArIHNpemUgKyAyOwogICAgICAgIGNvbmZpZy0+cG9zdGZpZWxkcyA9IG1hbGxvYygoc2l6ZV90KW5ld2xlbik7CiAgICAgICAgaWYoIWNvbmZpZy0+cG9zdGZpZWxkcykgewogICAgICAgICAgQ3VybF9zYWZlZnJlZShvbGRwb3N0KTsKICAgICAgICAgIEN1cmxfc2FmZWZyZWUocG9zdGRhdGEpOwogICAgICAgICAgcmV0dXJuIFBBUkFNX05PX01FTTsKICAgICAgICB9CiAgICAgICAgbWVtY3B5KGNvbmZpZy0+cG9zdGZpZWxkcywgb2xkcG9zdCwgKHNpemVfdClvbGRsZW4pOwogICAgICAgIC8qIHVzZSBieXRlIHZhbHVlIDB4MjYgZm9yICcmJyB0byBhY2NvbW1vZGF0ZSBub24tQVNDSUkgcGxhdGZvcm1zICovCiAgICAgICAgY29uZmlnLT5wb3N0ZmllbGRzW29sZGxlbl0gPSAnXHgyNic7CiAgICAgICAgbWVtY3B5KCZjb25maWctPnBvc3RmaWVsZHNbb2xkbGVuKzFdLCBwb3N0ZGF0YSwgc2l6ZSk7CiAgICAgICAgY29uZmlnLT5wb3N0ZmllbGRzW29sZGxlbisxK3NpemVdID0gJ1wwJzsKICAgICAgICBDdXJsX3NhZmVmcmVlKG9sZHBvc3QpOwogICAgICAgIEN1cmxfc2FmZWZyZWUocG9zdGRhdGEpOwogICAgICAgIGNvbmZpZy0+cG9zdGZpZWxkc2l6ZSArPSBzaXplKzE7CiAgICAgIH0KICAgICAgZWxzZSB7CiAgICAgICAgY29uZmlnLT5wb3N0ZmllbGRzID0gcG9zdGRhdGE7CiAgICAgICAgY29uZmlnLT5wb3N0ZmllbGRzaXplID0gc2l6ZTsKICAgICAgfQogICAgfQogICAgLyoKICAgICAgV2UgY2FuJ3Qgc2V0IHRoZSByZXF1ZXN0IHR5cGUgaGVyZSwgYXMgdGhpcyBkYXRhIG1pZ2h0IGJlIHVzZWQgaW4KICAgICAgYSBzaW1wbGUgR0VUIGlmIC1HIGlzIHVzZWQuIEFscmVhZHkgb3Igc29vbi4KCiAgICAgIGlmKFNldEhUVFByZXF1ZXN0KEhUVFBSRVFfU0lNUExFUE9TVCwgJmNvbmZpZy0+aHR0cHJlcSkpIHsKICAgICAgICBDdXJsX3NhZmVmcmVlKHBvc3RkYXRhKTsKICAgICAgICByZXR1cm4gUEFSQU1fQkFEX1VTRTsKICAgICAgfQogICAgKi8KICAgIGJyZWFrOwogICAgY2FzZSAnRCc6CiAgICAgIC8qIGR1bXAtaGVhZGVyIHRvIGdpdmVuIGZpbGUgbmFtZSAqLwogICAgICBHZXRTdHIoJmNvbmZpZy0+aGVhZGVyZmlsZSwgbmV4dGFyZyk7CiAgICAgIGJyZWFrOwogICAgY2FzZSAnZSc6CiAgICB7CiAgICAgIGNoYXIgKnB0ciA9IHN0cnN0cihuZXh0YXJnLCAiO2F1dG8iKTsKICAgICAgaWYocHRyKSB7CiAgICAgICAgLyogQXV0b21hdGljIHJlZmVyZXIgcmVxdWVzdGVkLCB0aGlzIG1heSBiZSBjb21iaW5lZCB3aXRoIGEKICAgICAgICAgICBzZXQgaW5pdGlhbCBvbmUgKi8KICAgICAgICBjb25maWctPmF1dG9yZWZlcmVyID0gVFJVRTsKICAgICAgICAqcHRyID0gMDsgLyogemVybyB0ZXJtaW5hdGUgaGVyZSAqLwogICAgICB9CiAgICAgIGVsc2UKICAgICAgICBjb25maWctPmF1dG9yZWZlcmVyID0gRkFMU0U7CiAgICAgIEdldFN0cigmY29uZmlnLT5yZWZlcmVyLCBuZXh0YXJnKTsKICAgIH0KICAgIGJyZWFrOwogICAgY2FzZSAnRSc6CiAgICAgIHN3aXRjaChzdWJsZXR0ZXIpIHsKICAgICAgY2FzZSAnYSc6IC8qIENBIGluZm8gUEVNIGZpbGUgKi8KICAgICAgICAvKiBDQSBpbmZvIFBFTSBmaWxlICovCiAgICAgICAgR2V0U3RyKCZjb25maWctPmNhY2VydCwgbmV4dGFyZyk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgJ2InOiAvKiBjZXJ0IGZpbGUgdHlwZSAqLwogICAgICAgIEdldFN0cigmY29uZmlnLT5jZXJ0X3R5cGUsIG5leHRhcmcpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICdjJzogLyogcHJpdmF0ZSBrZXkgZmlsZSAqLwogICAgICAgIEdldFN0cigmY29uZmlnLT5rZXksIG5leHRhcmcpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICdkJzogLyogcHJpdmF0ZSBrZXkgZmlsZSB0eXBlICovCiAgICAgICAgR2V0U3RyKCZjb25maWctPmtleV90eXBlLCBuZXh0YXJnKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAnZSc6IC8qIHByaXZhdGUga2V5IHBhc3NwaHJhc2UgKi8KICAgICAgICBHZXRTdHIoJmNvbmZpZy0+a2V5X3Bhc3N3ZCwgbmV4dGFyZyk7CiAgICAgICAgY2xlYW5hcmcobmV4dGFyZyk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgJ2YnOiAvKiBjcnlwdG8gZW5naW5lICovCiAgICAgICAgR2V0U3RyKCZjb25maWctPmVuZ2luZSwgbmV4dGFyZyk7CiAgICAgICAgaWYoY29uZmlnLT5lbmdpbmUgJiYgY3VybHhfcmF3X2VxdWFsKGNvbmZpZy0+ZW5naW5lLCJsaXN0IikpCiAgICAgICAgICBjb25maWctPmxpc3RfZW5naW5lcyA9IFRSVUU7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgJ2cnOiAvKiBDQSBpbmZvIFBFTSBmaWxlICovCiAgICAgICAgLyogQ0EgY2VydCBkaXJlY3RvcnkgKi8KICAgICAgICBHZXRTdHIoJmNvbmZpZy0+Y2FwYXRoLCBuZXh0YXJnKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAnaCc6IC8qIC0tcHVia2V5IHB1YmxpYyBrZXkgZmlsZSAqLwogICAgICAgIEdldFN0cigmY29uZmlnLT5wdWJrZXksIG5leHRhcmcpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICdpJzogLyogLS1ob3N0cHVibWQ1IG1kNSBvZiB0aGUgaG9zdCBwdWJsaWMga2V5ICovCiAgICAgICAgR2V0U3RyKCZjb25maWctPmhvc3RwdWJtZDUsIG5leHRhcmcpOwogICAgICAgIGlmKCFjb25maWctPmhvc3RwdWJtZDUgfHwgc3RybGVuKGNvbmZpZy0+aG9zdHB1Ym1kNSkgIT0gMzIpCiAgICAgICAgICByZXR1cm4gUEFSQU1fQkFEX1VTRTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAnaic6IC8qIENSTCBpbmZvIFBFTSBmaWxlICovCiAgICAgICAgLyogQ1JMIGZpbGUgKi8KICAgICAgICBHZXRTdHIoJmNvbmZpZy0+Y3JsZmlsZSwgbmV4dGFyZyk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgJ2snOiAvKiBUTFMgdXNlcm5hbWUgKi8KICAgICAgICBpZihjdXJsaW5mby0+ZmVhdHVyZXMgJiBDVVJMX1ZFUlNJT05fVExTQVVUSF9TUlApCiAgICAgICAgICBHZXRTdHIoJmNvbmZpZy0+dGxzX3VzZXJuYW1lLCBuZXh0YXJnKTsKICAgICAgICBlbHNlCiAgICAgICAgICByZXR1cm4gUEFSQU1fTElCQ1VSTF9ET0VTTlRfU1VQUE9SVDsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAnbCc6IC8qIFRMUyBwYXNzd29yZCAqLwogICAgICAgIGlmKGN1cmxpbmZvLT5mZWF0dXJlcyAmIENVUkxfVkVSU0lPTl9UTFNBVVRIX1NSUCkKICAgICAgICAgIEdldFN0cigmY29uZmlnLT50bHNfcGFzc3dvcmQsIG5leHRhcmcpOwogICAgICAgIGVsc2UKICAgICAgICAgIHJldHVybiBQQVJBTV9MSUJDVVJMX0RPRVNOVF9TVVBQT1JUOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICdtJzogLyogVExTIGF1dGhlbnRpY2F0aW9uIHR5cGUgKi8KICAgICAgICBpZihjdXJsaW5mby0+ZmVhdHVyZXMgJiBDVVJMX1ZFUlNJT05fVExTQVVUSF9TUlApIHsKICAgICAgICAgIEdldFN0cigmY29uZmlnLT50bHNfYXV0aHR5cGUsIG5leHRhcmcpOwogICAgICAgICAgaWYoIXN0cmVxdWFsKGNvbmZpZy0+dGxzX2F1dGh0eXBlLCAiU1JQIikpCiAgICAgICAgICAgIHJldHVybiBQQVJBTV9MSUJDVVJMX0RPRVNOVF9TVVBQT1JUOyAvKiBvbmx5IHN1cHBvcnQgVExTLVNSUCAqLwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgICByZXR1cm4gUEFSQU1fTElCQ1VSTF9ET0VTTlRfU1VQUE9SVDsKICAgICAgICBicmVhazsKICAgICAgZGVmYXVsdDogLyogY2VydGlmaWNhdGUgZmlsZSAqLwogICAgICB7CiAgICAgICAgY2hhciAqcHRyID0gc3RyY2hyKG5leHRhcmcsICc6Jyk7CiAgICAgICAgLyogU2luY2Ugd2UgbGl2ZSBpbiBhIHdvcmxkIG9mIHdlaXJkbmVzcyBhbmQgY29uZnVzaW9uLCB0aGUgd2luMzIKICAgICAgICAgICBkdWRlcyBjYW4gdXNlIDogd2hlbiB1c2luZyBkcml2ZSBsZXR0ZXJzIGFuZCB0aHVzCiAgICAgICAgICAgYzpcZmlsZTpwYXNzd29yZCBuZWVkcyB0byB3b3JrLiBJbiBvcmRlciBub3QgdG8gYnJlYWsKICAgICAgICAgICBjb21wYXRpYmlsaXR5LCB3ZSBzdGlsbCB1c2UgOiBhcyBzZXBhcmF0b3IsIGJ1dCB3ZSB0cnkgdG8gZGV0ZWN0CiAgICAgICAgICAgd2hlbiBpdCBpcyB1c2VkIGZvciBhIGZpbGUgbmFtZSEgT24gd2luZG93cy4gKi8KI2lmZGVmIFdJTjMyCiAgICAgICAgaWYocHRyICYmCiAgICAgICAgICAgKHB0ciA9PSAmbmV4dGFyZ1sxXSkgJiYKICAgICAgICAgICAobmV4dGFyZ1syXSA9PSAnXFwnIHx8IG5leHRhcmdbMl0gPT0gJy8nKSAmJgogICAgICAgICAgIChJU0FMUEhBKG5leHRhcmdbMF0pKSApCiAgICAgICAgICAvKiBjb2xvbiBpbiB0aGUgc2Vjb25kIGNvbHVtbiwgZm9sbG93ZWQgYnkgYSBiYWNrc2xhc2gsIGFuZCB0aGUKICAgICAgICAgICAgIGZpcnN0IGNoYXJhY3RlciBpcyBhbiBhbHBoYWJldGljIGxldHRlcjoKCiAgICAgICAgICAgICB0aGlzIGlzIGEgZHJpdmUgbGV0dGVyIGNvbG9uICovCiAgICAgICAgICBwdHIgPSBzdHJjaHIoJm5leHRhcmdbM10sICc6Jyk7IC8qIGZpbmQgdGhlIG5leHQgb25lIGluc3RlYWQgKi8KI2VuZGlmCiAgICAgICAgaWYocHRyKSB7CiAgICAgICAgICAvKiB3ZSBoYXZlIGEgcGFzc3dvcmQgdG9vICovCiAgICAgICAgICAqcHRyID0gJ1wwJzsKICAgICAgICAgIHB0cisrOwogICAgICAgICAgR2V0U3RyKCZjb25maWctPmtleV9wYXNzd2QsIHB0cik7CiAgICAgICAgfQogICAgICAgIEdldFN0cigmY29uZmlnLT5jZXJ0LCBuZXh0YXJnKTsKICAgICAgICBjbGVhbmFyZyhuZXh0YXJnKTsKICAgICAgfQogICAgICB9CiAgICAgIGJyZWFrOwogICAgY2FzZSAnZic6CiAgICAgIC8qIGZhaWwgaGFyZCBvbiBlcnJvcnMgICovCiAgICAgIGNvbmZpZy0+ZmFpbG9uZXJyb3IgPSB0b2dnbGU7CiAgICAgIGJyZWFrOwogICAgY2FzZSAnRic6CiAgICAgIC8qICJmb3JtIGRhdGEiIHNpbXVsYXRpb24sIHRoaXMgaXMgYSBsaXR0bGUgYWR2YW5jZWQgc28gbGV0cyBkbyBvdXIgYmVzdAogICAgICAgICB0byBzb3J0IHRoaXMgb3V0IHNsb3dseSBhbmQgY2FyZWZ1bGx5ICovCiAgICAgIGlmKGZvcm1wYXJzZShjb25maWcsCiAgICAgICAgICAgICAgICAgICBuZXh0YXJnLAogICAgICAgICAgICAgICAgICAgJmNvbmZpZy0+aHR0cHBvc3QsCiAgICAgICAgICAgICAgICAgICAmY29uZmlnLT5sYXN0X3Bvc3QsCiAgICAgICAgICAgICAgICAgICAoc3VibGV0dGVyPT0ncycpP1RSVUU6RkFMU0UpKSAvKiAncycgbWVhbnMgbGl0ZXJhbCBzdHJpbmcgKi8KICAgICAgICByZXR1cm4gUEFSQU1fQkFEX1VTRTsKICAgICAgaWYoU2V0SFRUUHJlcXVlc3QoY29uZmlnLCBIVFRQUkVRX1BPU1QsICZjb25maWctPmh0dHByZXEpKQogICAgICAgIHJldHVybiBQQVJBTV9CQURfVVNFOwogICAgICBicmVhazsKCiAgICBjYXNlICdnJzogLyogZyBkaXNhYmxlcyBVUkxnbG9iYmluZyAqLwogICAgICBjb25maWctPmdsb2JvZmYgPSB0b2dnbGU7CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgJ0cnOiAvKiBIVFRQIEdFVCAqLwogICAgICBjb25maWctPnVzZV9odHRwZ2V0ID0gVFJVRTsKICAgICAgYnJlYWs7CgogICAgY2FzZSAnaCc6IC8qIGggZm9yIGhlbHAgKi8KICAgICAgaWYodG9nZ2xlKSB7CiAgICAgICAgdG9vbF9oZWxwKCk7CiAgICAgICAgcmV0dXJuIFBBUkFNX0hFTFBfUkVRVUVTVEVEOwogICAgICB9CiAgICAgIC8qIHdlIG5vdyBhY3R1YWxseSBzdXBwb3J0IC0tbm8taGVscCB0b28hICovCiAgICAgIGJyZWFrOwogICAgY2FzZSAnSCc6CiAgICAgIC8qIEEgY3VzdG9tIGhlYWRlciB0byBhcHBlbmQgdG8gYSBsaXN0ICovCiAgICAgIGVyciA9IGFkZDJsaXN0KCZjb25maWctPmhlYWRlcnMsIG5leHRhcmcpOwogICAgICBpZihlcnIpCiAgICAgICAgcmV0dXJuIGVycjsKICAgICAgYnJlYWs7CiAgICBjYXNlICdpJzoKICAgICAgY29uZmlnLT5pbmNsdWRlX2hlYWRlcnMgPSB0b2dnbGU7IC8qIGluY2x1ZGUgdGhlIGhlYWRlcnMgYXMgd2VsbCBpbiB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYWwgb3V0cHV0IHN0cmVhbSAqLwogICAgICBicmVhazsKICAgIGNhc2UgJ2onOgogICAgICBjb25maWctPmNvb2tpZXNlc3Npb24gPSB0b2dnbGU7CiAgICAgIGJyZWFrOwogICAgY2FzZSAnSSc6CiAgICAgIC8qCiAgICAgICAqIG5vX2JvZHkgd2lsbCBpbXBseSBpbmNsdWRlX2hlYWRlcnMgbGF0ZXIgb24KICAgICAgICovCiAgICAgIGNvbmZpZy0+bm9fYm9keSA9IHRvZ2dsZTsKICAgICAgaWYoU2V0SFRUUHJlcXVlc3QoY29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAoY29uZmlnLT5ub19ib2R5KT9IVFRQUkVRX0hFQUQ6SFRUUFJFUV9HRVQsCiAgICAgICAgICAgICAgICAgICAgICAgICZjb25maWctPmh0dHByZXEpKQogICAgICAgIHJldHVybiBQQVJBTV9CQURfVVNFOwogICAgICBicmVhazsKICAgIGNhc2UgJ0onOiAvKiAtLXJlbW90ZS1oZWFkZXItbmFtZSAqLwogICAgICBpZihjb25maWctPmluY2x1ZGVfaGVhZGVycykgewogICAgICAgIHdhcm5mKGNvbmZpZywKICAgICAgICAgICAgICAiLS1pbmNsdWRlIGFuZCAtLXJlbW90ZS1oZWFkZXItbmFtZSBjYW5ub3QgYmUgY29tYmluZWQuXG4iKTsKICAgICAgICByZXR1cm4gUEFSQU1fQkFEX1VTRTsKICAgICAgfQogICAgICBjb25maWctPmNvbnRlbnRfZGlzcG9zaXRpb24gPSB0b2dnbGU7CiAgICAgIGJyZWFrOwogICAgY2FzZSAnayc6IC8qIGFsbG93IGluc2VjdXJlIFNTTCBjb25uZWN0cyAqLwogICAgICBjb25maWctPmluc2VjdXJlX29rID0gdG9nZ2xlOwogICAgICBicmVhazsKICAgIGNhc2UgJ0snOiAvKiBwYXJzZSBjb25maWcgZmlsZSAqLwogICAgICBpZihwYXJzZWNvbmZpZyhuZXh0YXJnLCBjb25maWcpKQogICAgICAgIHdhcm5mKGNvbmZpZywgImVycm9yIHRyeWluZyByZWFkIGNvbmZpZyBmcm9tIHRoZSAnJXMnIGZpbGVcbiIsCiAgICAgICAgICAgICAgbmV4dGFyZyk7CiAgICAgIGJyZWFrOwogICAgY2FzZSAnbCc6CiAgICAgIGNvbmZpZy0+ZGlybGlzdG9ubHkgPSB0b2dnbGU7IC8qIG9ubHkgbGlzdCB0aGUgbmFtZXMgb2YgdGhlIEZUUCBkaXIgKi8KICAgICAgYnJlYWs7CiAgICBjYXNlICdMJzoKICAgICAgY29uZmlnLT5mb2xsb3dsb2NhdGlvbiA9IHRvZ2dsZTsgLyogRm9sbG93IExvY2F0aW9uOiBIVFRQIGhlYWRlcnMgKi8KICAgICAgc3dpdGNoIChzdWJsZXR0ZXIpIHsKICAgICAgY2FzZSAndCc6CiAgICAgICAgLyogQ29udGludWUgdG8gc2VuZCBhdXRoZW50aWNhdGlvbiAodXNlcitwYXNzd29yZCkgd2hlbiBmb2xsb3dpbmcKICAgICAgICAgKiBsb2NhdGlvbnMsIGV2ZW4gd2hlbiBob3N0bmFtZSBjaGFuZ2VkICovCiAgICAgICAgY29uZmlnLT51bnJlc3RyaWN0ZWRfYXV0aCA9IHRvZ2dsZTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBicmVhazsKICAgIGNhc2UgJ20nOgogICAgICAvKiBzcGVjaWZpZWQgbWF4IHRpbWUgKi8KICAgICAgaWYoc3RyMm51bSgmY29uZmlnLT50aW1lb3V0LCBuZXh0YXJnKSkKICAgICAgICByZXR1cm4gUEFSQU1fQkFEX05VTUVSSUM7CiAgICAgIGJyZWFrOwogICAgY2FzZSAnTSc6IC8qIE0gZm9yIG1hbnVhbCwgaHVnZSBoZWxwICovCiAgICAgIGlmKHRvZ2dsZSkgeyAvKiAtLW5vLW1hbnVhbCBzaG93cyBubyBtYW51YWwuLi4gKi8KI2lmZGVmIFVTRV9NQU5VQUwKICAgICAgICBodWdlaGVscCgpOwogICAgICAgIHJldHVybiBQQVJBTV9IRUxQX1JFUVVFU1RFRDsKI2Vsc2UKICAgICAgICB3YXJuZihjb25maWcsCiAgICAgICAgICAgICAgImJ1aWx0LWluIG1hbnVhbCB3YXMgZGlzYWJsZWQgYXQgYnVpbGQtdGltZSFcbiIpOwogICAgICAgIHJldHVybiBQQVJBTV9PUFRJT05fVU5LTk9XTjsKI2VuZGlmCiAgICAgIH0KICAgICAgYnJlYWs7CiAgICBjYXNlICduJzoKICAgICAgc3dpdGNoKHN1YmxldHRlcikgewogICAgICBjYXNlICdvJzogLyogQ0EgaW5mbyBQRU0gZmlsZSAqLwogICAgICAgIC8qIHVzZSAubmV0cmMgb3IgVVJMICovCiAgICAgICAgY29uZmlnLT5uZXRyY19vcHQgPSB0b2dnbGU7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgJ2UnOiAvKiBuZXRyYy1maWxlICovCiAgICAgICAgR2V0U3RyKCZjb25maWctPm5ldHJjX2ZpbGUsIG5leHRhcmcpOwogICAgICAgIGJyZWFrOwogICAgICBkZWZhdWx0OgogICAgICAgIC8qIHBpY2sgaW5mbyBmcm9tIC5uZXRyYywgaWYgdGhpcyBpcyB1c2VkIGZvciBodHRwLCBjdXJsIHdpbGwKICAgICAgICAgICBhdXRvbWF0aWNhbGx5IGVuZm9yZSB1c2VyK3Bhc3N3b3JkIHdpdGggdGhlIHJlcXVlc3QgKi8KICAgICAgICBjb25maWctPm5ldHJjID0gdG9nZ2xlOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGJyZWFrOwogICAgY2FzZSAnTic6CiAgICAgIC8qIGRpc2FibGUgdGhlIG91dHB1dCBJL08gYnVmZmVyaW5nLiBub3RlIHRoYXQgdGhlIG9wdGlvbiBpcyBjYWxsZWQKICAgICAgICAgLS1idWZmZXIgYnV0IGlzIG1vc3RseSB1c2VkIGluIHRoZSBuZWdhdGl2ZSBmb3JtOiAtLW5vLWJ1ZmZlciAqLwogICAgICBpZihsb25nb3B0KQogICAgICAgIGNvbmZpZy0+bm9idWZmZXIgPSAoIXRvZ2dsZSk/VFJVRTpGQUxTRTsKICAgICAgZWxzZQogICAgICAgIGNvbmZpZy0+bm9idWZmZXIgPSB0b2dnbGU7CiAgICAgIGJyZWFrOwogICAgY2FzZSAnTyc6IC8qIC0tcmVtb3RlLW5hbWUgKi8KICAgICAgaWYoc3VibGV0dGVyID09ICdhJykgeyAvKiAtLXJlbW90ZS1uYW1lLWFsbCAqLwogICAgICAgIGNvbmZpZy0+ZGVmYXVsdF9ub2RlX2ZsYWdzID0gdG9nZ2xlP0dFVE9VVF9VU0VSRU1PVEU6MDsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICAvKiBmYWxsLXRocm91Z2ghICovCiAgICBjYXNlICdvJzogLyogLS1vdXRwdXQgKi8KICAgICAgLyogb3V0cHV0IGZpbGUgKi8KICAgIHsKICAgICAgc3RydWN0IGdldG91dCAqdXJsOwogICAgICBpZihjb25maWctPnVybF9vdXQgfHwgKChjb25maWctPnVybF9vdXQgPSBjb25maWctPnVybF9saXN0KSAhPSBOVUxMKSkgewogICAgICAgIC8qIHRoZXJlJ3MgYSBub2RlIGhlcmUsIGlmIGl0IGFscmVhZHkgaXMgZmlsbGVkLWluIGNvbnRpbnVlIHRvIGZpbmQKICAgICAgICAgICBhbiAiZW1wdHkiIG5vZGUgKi8KICAgICAgICB3aGlsZShjb25maWctPnVybF9vdXQgJiYgKGNvbmZpZy0+dXJsX291dC0+ZmxhZ3MgJiBHRVRPVVRfT1VURklMRSkpCiAgICAgICAgICBjb25maWctPnVybF9vdXQgPSBjb25maWctPnVybF9vdXQtPm5leHQ7CiAgICAgIH0KCiAgICAgIC8qIG5vdyB0aGVyZSBtaWdodCBvciBtaWdodCBub3QgYmUgYW4gYXZhaWxhYmxlIG5vZGUgdG8gZmlsbCBpbiEgKi8KCiAgICAgIGlmKGNvbmZpZy0+dXJsX291dCkKICAgICAgICAvKiBleGlzdGluZyBub2RlICovCiAgICAgICAgdXJsID0gY29uZmlnLT51cmxfb3V0OwogICAgICBlbHNlCiAgICAgICAgLyogdGhlcmUgd2FzIG5vIGZyZWUgbm9kZSwgY3JlYXRlIG9uZSEgKi8KICAgICAgICB1cmwgPSBuZXdfZ2V0b3V0KGNvbmZpZyk7CgogICAgICBpZighdXJsKQogICAgICAgIHJldHVybiBQQVJBTV9OT19NRU07CiAgICAgIGVsc2UgewogICAgICAgIC8qIGZpbGwgaW4gdGhlIG91dGZpbGUgKi8KICAgICAgICBpZignbycgPT0gbGV0dGVyKSB7CiAgICAgICAgICBHZXRTdHIoJnVybC0+b3V0ZmlsZSwgbmV4dGFyZyk7CiAgICAgICAgICB1cmwtPmZsYWdzICY9IH5HRVRPVVRfVVNFUkVNT1RFOyAvKiBzd2l0Y2ggb2ZmICovCiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgdXJsLT5vdXRmaWxlID0gTlVMTDsgLyogbGVhdmUgaXQgKi8KICAgICAgICAgIGlmKHRvZ2dsZSkKICAgICAgICAgICAgdXJsLT5mbGFncyB8PSBHRVRPVVRfVVNFUkVNT1RFOyAgLyogc3dpdGNoIG9uICovCiAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHVybC0+ZmxhZ3MgJj0gfkdFVE9VVF9VU0VSRU1PVEU7IC8qIHN3aXRjaCBvZmYgKi8KICAgICAgICB9CiAgICAgICAgdXJsLT5mbGFncyB8PSBHRVRPVVRfT1VURklMRTsKICAgICAgfQogICAgfQogICAgYnJlYWs7CiAgICBjYXNlICdQJzoKICAgICAgLyogVGhpcyBtYWtlcyB0aGUgRlRQIHNlc3Npb25zIHVzZSBQT1JUIGluc3RlYWQgb2YgUEFTViAqLwogICAgICAvKiB1c2UgPGV0aDA+IG9yIDwxOTIuMTY4LjEwLjEwPiBzdHlsZSBhZGRyZXNzZXMuIEFueXRoaW5nIGV4Y2VwdAogICAgICAgICB0aGlzIHdpbGwgbWFrZSB1cyB0cnkgdG8gZ2V0IHRoZSAiZGVmYXVsdCIgYWRkcmVzcy4KICAgICAgICAgTk9URTogdGhpcyBpcyBhIGNoYW5nZWQgYmVoYXZpb3VyIHNpbmNlIHRoZSByZWxlYXNlZCA0LjEhCiAgICAgICovCiAgICAgIEdldFN0cigmY29uZmlnLT5mdHBwb3J0LCBuZXh0YXJnKTsKICAgICAgYnJlYWs7CiAgICBjYXNlICdwJzoKICAgICAgLyogcHJveHkgdHVubmVsIGZvciBub24taHR0cCBwcm90b2NvbHMgKi8KICAgICAgY29uZmlnLT5wcm94eXR1bm5lbCA9IHRvZ2dsZTsKICAgICAgYnJlYWs7CgogICAgY2FzZSAncSc6IC8qIGlmIHVzZWQgZmlyc3QsIGFscmVhZHkgdGFrZW4gY2FyZSBvZiwgd2UgZG8gaXQgbGlrZQogICAgICAgICAgICAgICAgIHRoaXMgc28gd2UgZG9uJ3QgY2F1c2UgYW4gZXJyb3IhICovCiAgICAgIGJyZWFrOwogICAgY2FzZSAnUSc6CiAgICAgIC8qIFFVT1RFIGNvbW1hbmQgdG8gc2VuZCB0byBGVFAgc2VydmVyICovCiAgICAgIHN3aXRjaChuZXh0YXJnWzBdKSB7CiAgICAgIGNhc2UgJy0nOgogICAgICAgIC8qIHByZWZpeGVkIHdpdGggYSBkYXNoIG1ha2VzIGl0IGEgUE9TVCBUUkFOU0ZFUiBvbmUgKi8KICAgICAgICBuZXh0YXJnKys7CiAgICAgICAgZXJyID0gYWRkMmxpc3QoJmNvbmZpZy0+cG9zdHF1b3RlLCBuZXh0YXJnKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAnKyc6CiAgICAgICAgLyogcHJlZml4ZWQgd2l0aCBhIHBsdXMgbWFrZXMgaXQgYSBqdXN0LWJlZm9yZS10cmFuc2ZlciBvbmUgKi8KICAgICAgICBuZXh0YXJnKys7CiAgICAgICAgZXJyID0gYWRkMmxpc3QoJmNvbmZpZy0+cHJlcXVvdGUsIG5leHRhcmcpOwogICAgICAgIGJyZWFrOwogICAgICBkZWZhdWx0OgogICAgICAgIGVyciA9IGFkZDJsaXN0KCZjb25maWctPnF1b3RlLCBuZXh0YXJnKTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBpZihlcnIpCiAgICAgICAgcmV0dXJuIGVycjsKICAgICAgYnJlYWs7CiAgICBjYXNlICdyJzoKICAgICAgLyogU3BlY2lmeWluZyBhIHJhbmdlIFdJVEhPVVQgQSBEQVNIIHdpbGwgY3JlYXRlIGFuIGlsbGVnYWwgSFRUUCByYW5nZQogICAgICAgICAoYW5kIHdvbid0IGFjdHVhbGx5IGJlIHJhbmdlIGJ5IGRlZmluaXRpb24pLiBUaGUgbWFuIHBhZ2UgcHJldmlvdXNseQogICAgICAgICBjbGFpbWVkIHRoYXQgdG8gYmUgYSBnb29kIHdheSwgd2h5IHRoaXMgY29kZSBpcyBhZGRlZCB0byB3b3JrLWFyb3VuZAogICAgICAgICBpdC4gKi8KICAgICAgaWYoSVNESUdJVCgqbmV4dGFyZykgJiYgIXN0cmNocihuZXh0YXJnLCAnLScpKSB7CiAgICAgICAgY2hhciBidWZmZXJbMzJdOwogICAgICAgIGN1cmxfb2ZmX3Qgb2ZmOwogICAgICAgIHdhcm5mKGNvbmZpZywKICAgICAgICAgICAgICAiQSBzcGVjaWZpZWQgcmFuZ2UgTVVTVCBpbmNsdWRlIGF0IGxlYXN0IG9uZSBkYXNoICgtKS4gIgogICAgICAgICAgICAgICJBcHBlbmRpbmcgb25lIGZvciB5b3UhXG4iKTsKICAgICAgICBvZmYgPSBjdXJseF9zdHJ0b29mZnQobmV4dGFyZywgTlVMTCwgMTApOwogICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksICIlIiBDVVJMX0ZPUk1BVF9DVVJMX09GRl9UICItIiwgb2ZmKTsKICAgICAgICBDdXJsX3NhZmVmcmVlKGNvbmZpZy0+cmFuZ2UpOwogICAgICAgIGNvbmZpZy0+cmFuZ2UgPSBzdHJkdXAoYnVmZmVyKTsKICAgICAgICBpZighY29uZmlnLT5yYW5nZSkKICAgICAgICAgIHJldHVybiBQQVJBTV9OT19NRU07CiAgICAgIH0KICAgICAgewogICAgICAgIC8qIGJ5dGUgcmFuZ2UgcmVxdWVzdGVkICovCiAgICAgICAgY2hhciAqdG1wX3JhbmdlOwogICAgICAgIHRtcF9yYW5nZSA9IG5leHRhcmc7CiAgICAgICAgd2hpbGUoKnRtcF9yYW5nZSAhPSAnXDAnKSB7CiAgICAgICAgICBpZighSVNESUdJVCgqdG1wX3JhbmdlKSAmJiAqdG1wX3JhbmdlICE9ICctJyAmJiAqdG1wX3JhbmdlICE9ICcsJykgewogICAgICAgICAgICB3YXJuZihjb25maWcsIkludmFsaWQgY2hhcmFjdGVyIGlzIGZvdW5kIGluIGdpdmVuIHJhbmdlLiAiCiAgICAgICAgICAgICAgICAgICJBIHNwZWNpZmllZCByYW5nZSBNVVNUIGhhdmUgb25seSBkaWdpdHMgaW4gIgogICAgICAgICAgICAgICAgICAiXCdzdGFydFwnLVwnc3RvcFwnLiBUaGUgc2VydmVyJ3MgcmVzcG9uc2UgdG8gdGhpcyAiCiAgICAgICAgICAgICAgICAgICJyZXF1ZXN0IGlzIHVuY2VydGFpbi5cbiIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIHRtcF9yYW5nZSsrOwogICAgICAgIH0KICAgICAgICAvKiBieXRlIHJhbmdlIHJlcXVlc3RlZCAqLwogICAgICAgIEdldFN0cigmY29uZmlnLT5yYW5nZSwgbmV4dGFyZyk7CiAgICAgIH0KICAgICAgYnJlYWs7CiAgICBjYXNlICdSJzoKICAgICAgLyogdXNlIHJlbW90ZSBmaWxlJ3MgdGltZSAqLwogICAgICBjb25maWctPnJlbW90ZV90aW1lID0gdG9nZ2xlOwogICAgICBicmVhazsKICAgIGNhc2UgJ3MnOgogICAgICAvKiBkb24ndCBzaG93IHByb2dyZXNzIG1ldGVyLCBkb24ndCBzaG93IGVycm9ycyA6ICovCiAgICAgIGlmKHRvZ2dsZSkKICAgICAgICBjb25maWctPm11dGUgPSBjb25maWctPm5vcHJvZ3Jlc3MgPSBUUlVFOwogICAgICBlbHNlCiAgICAgICAgY29uZmlnLT5tdXRlID0gY29uZmlnLT5ub3Byb2dyZXNzID0gRkFMU0U7CiAgICAgIGlmKGNvbmZpZy0+c2hvd2Vycm9yIDwgMCkKICAgICAgICAvKiBpZiBzdGlsbCBvbiB0aGUgZGVmYXVsdCB2YWx1ZSwgc2V0IHNob3dlcnJvciB0byB0aGUgcmV2ZXJzZSBvZgogICAgICAgICAgIHRvZ2dsZS4gVGhpcyBpcyB0byBhbGxvdyAtUyBhbmQgLXMgdG8gYmUgdXNlZCBpbiBhbiBpbmRlcGVuZGVudAogICAgICAgICAgIG9yZGVyIGJ1dCBzdGlsbCBoYXZlIHRoZSBzYW1lIGVmZmVjdC4gKi8KICAgICAgICBjb25maWctPnNob3dlcnJvciA9ICghdG9nZ2xlKT9UUlVFOkZBTFNFOyAvKiB0b2dnbGUgb2ZmICovCiAgICAgIGJyZWFrOwogICAgY2FzZSAnUyc6CiAgICAgIC8qIHNob3cgZXJyb3JzICovCiAgICAgIGNvbmZpZy0+c2hvd2Vycm9yID0gdG9nZ2xlPzE6MDsgLyogdG9nZ2xlIG9uIGlmIHVzZWQgd2l0aCAtcyAqLwogICAgICBicmVhazsKICAgIGNhc2UgJ3QnOgogICAgICAvKiBUZWxuZXQgb3B0aW9ucyAqLwogICAgICBlcnIgPSBhZGQybGlzdCgmY29uZmlnLT50ZWxuZXRfb3B0aW9ucywgbmV4dGFyZyk7CiAgICAgIGlmKGVycikKICAgICAgICByZXR1cm4gZXJyOwogICAgICBicmVhazsKICAgIGNhc2UgJ1QnOgogICAgICAvKiB3ZSBhcmUgdXBsb2FkaW5nICovCiAgICB7CiAgICAgIHN0cnVjdCBnZXRvdXQgKnVybDsKICAgICAgaWYoY29uZmlnLT51cmxfb3V0IHx8ICgoY29uZmlnLT51cmxfb3V0ID0gY29uZmlnLT51cmxfbGlzdCkgIT0gTlVMTCkpIHsKICAgICAgICAvKiB0aGVyZSdzIGEgbm9kZSBoZXJlLCBpZiBpdCBhbHJlYWR5IGlzIGZpbGxlZC1pbiBjb250aW51ZSB0byBmaW5kCiAgICAgICAgICAgYW4gImVtcHR5IiBub2RlICovCiAgICAgICAgd2hpbGUoY29uZmlnLT51cmxfb3V0ICYmIChjb25maWctPnVybF9vdXQtPmZsYWdzICYgR0VUT1VUX1VQTE9BRCkpCiAgICAgICAgICBjb25maWctPnVybF9vdXQgPSBjb25maWctPnVybF9vdXQtPm5leHQ7CiAgICAgIH0KCiAgICAgIC8qIG5vdyB0aGVyZSBtaWdodCBvciBtaWdodCBub3QgYmUgYW4gYXZhaWxhYmxlIG5vZGUgdG8gZmlsbCBpbiEgKi8KCiAgICAgIGlmKGNvbmZpZy0+dXJsX291dCkKICAgICAgICAvKiBleGlzdGluZyBub2RlICovCiAgICAgICAgdXJsID0gY29uZmlnLT51cmxfb3V0OwogICAgICBlbHNlCiAgICAgICAgLyogdGhlcmUgd2FzIG5vIGZyZWUgbm9kZSwgY3JlYXRlIG9uZSEgKi8KICAgICAgICB1cmwgPSBuZXdfZ2V0b3V0KGNvbmZpZyk7CgogICAgICBpZighdXJsKQogICAgICAgIHJldHVybiBQQVJBTV9OT19NRU07CiAgICAgIGVsc2UgewogICAgICAgIHVybC0+ZmxhZ3MgfD0gR0VUT1VUX1VQTE9BRDsgLyogbWFyayAtVCB1c2VkICovCiAgICAgICAgaWYoISpuZXh0YXJnKQogICAgICAgICAgdXJsLT5mbGFncyB8PSBHRVRPVVRfTk9VUExPQUQ7CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAvKiAiLSIgZXF1YWxzIHN0ZGluLCBidXQga2VlcCB0aGUgc3RyaW5nIGFyb3VuZCBmb3Igbm93ICovCiAgICAgICAgICBHZXRTdHIoJnVybC0+aW5maWxlLCBuZXh0YXJnKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGJyZWFrOwogICAgY2FzZSAndSc6CiAgICAgIC8qIHVzZXI6cGFzc3dvcmQgICovCiAgICAgIEdldFN0cigmY29uZmlnLT51c2VycHdkLCBuZXh0YXJnKTsKICAgICAgY2xlYW5hcmcobmV4dGFyZyk7CiAgICAgIGVyciA9IGNoZWNrcGFzc3dkKCJob3N0IiwgJmNvbmZpZy0+dXNlcnB3ZCk7CiAgICAgIGlmKGVycikKICAgICAgICByZXR1cm4gZXJyOwogICAgICBicmVhazsKICAgIGNhc2UgJ1UnOgogICAgICAvKiBQcm94eSB1c2VyOnBhc3N3b3JkICAqLwogICAgICBHZXRTdHIoJmNvbmZpZy0+cHJveHl1c2VycHdkLCBuZXh0YXJnKTsKICAgICAgY2xlYW5hcmcobmV4dGFyZyk7CiAgICAgIGVyciA9IGNoZWNrcGFzc3dkKCJwcm94eSIsICZjb25maWctPnByb3h5dXNlcnB3ZCk7CiAgICAgIGlmKGVycikKICAgICAgICByZXR1cm4gZXJyOwogICAgICBicmVhazsKICAgIGNhc2UgJ3YnOgogICAgICBpZih0b2dnbGUpIHsKICAgICAgICAvKiB0aGUgJyUnIHRoaW5nIGhlcmUgd2lsbCBjYXVzZSB0aGUgdHJhY2UgZ2V0IHNlbnQgdG8gc3RkZXJyICovCiAgICAgICAgQ3VybF9zYWZlZnJlZShjb25maWctPnRyYWNlX2R1bXApOwogICAgICAgIGNvbmZpZy0+dHJhY2VfZHVtcCA9IHN0cmR1cCgiJSIpOwogICAgICAgIGlmKCFjb25maWctPnRyYWNlX2R1bXApCiAgICAgICAgICByZXR1cm4gUEFSQU1fTk9fTUVNOwogICAgICAgIGlmKGNvbmZpZy0+dHJhY2V0eXBlICYmIChjb25maWctPnRyYWNldHlwZSAhPSBUUkFDRV9QTEFJTikpCiAgICAgICAgICB3YXJuZihjb25maWcsCiAgICAgICAgICAgICAgICAiLXYsIC0tdmVyYm9zZSBvdmVycmlkZXMgYW4gZWFybGllciB0cmFjZS92ZXJib3NlIG9wdGlvblxuIik7CiAgICAgICAgY29uZmlnLT50cmFjZXR5cGUgPSBUUkFDRV9QTEFJTjsKICAgICAgfQogICAgICBlbHNlCiAgICAgICAgLyogdmVyYm9zZSBpcyBkaXNhYmxlZCBoZXJlICovCiAgICAgICAgY29uZmlnLT50cmFjZXR5cGUgPSBUUkFDRV9OT05FOwogICAgICBicmVhazsKICAgIGNhc2UgJ1YnOgogICAgewogICAgICBjb25zdCBjaGFyICpjb25zdCAqcHJvdG87CgogICAgICBpZighdG9nZ2xlKQogICAgICAgIC8qIC0tbm8tdmVyc2lvbiB5aWVsZHMgbm8gb3V0cHV0ISAqLwogICAgICAgIGJyZWFrOwoKICAgICAgcHJpbnRmKENVUkxfSUQgIiVzXG4iLCBjdXJsX3ZlcnNpb24oKSk7CiAgICAgIGlmKGN1cmxpbmZvLT5wcm90b2NvbHMpIHsKICAgICAgICBwcmludGYoIlByb3RvY29sczogIik7CiAgICAgICAgZm9yKHByb3RvID0gY3VybGluZm8tPnByb3RvY29sczsgKnByb3RvOyArK3Byb3RvKSB7CiAgICAgICAgICBwcmludGYoIiVzICIsICpwcm90byk7CiAgICAgICAgfQogICAgICAgIHB1dHMoIiIpOyAvKiBuZXdsaW5lICovCiAgICAgIH0KICAgICAgaWYoY3VybGluZm8tPmZlYXR1cmVzKSB7CiAgICAgICAgdW5zaWduZWQgaW50IGk7CiAgICAgICAgcHJpbnRmKCJGZWF0dXJlczogIik7CiAgICAgICAgZm9yKGkgPSAwOyBpIDwgc2l6ZW9mKGZlYXRzKS9zaXplb2YoZmVhdHNbMF0pOyBpKyspIHsKICAgICAgICAgIGlmKGN1cmxpbmZvLT5mZWF0dXJlcyAmIGZlYXRzW2ldLmJpdG1hc2spCiAgICAgICAgICAgIHByaW50ZigiJXMgIiwgZmVhdHNbaV0ubmFtZSk7CiAgICAgICAgfQogICAgICAgIHB1dHMoIiIpOyAvKiBuZXdsaW5lICovCiAgICAgIH0KICAgIH0KICAgIHJldHVybiBQQVJBTV9IRUxQX1JFUVVFU1RFRDsKICAgIGNhc2UgJ3cnOgogICAgICAvKiBnZXQgdGhlIG91dHB1dCBzdHJpbmcgKi8KICAgICAgaWYoJ0AnID09ICpuZXh0YXJnKSB7CiAgICAgICAgLyogdGhlIGRhdGEgYmVnaW5zIHdpdGggYSAnQCcgbGV0dGVyLCBpdCBtZWFucyB0aGF0IGEgZmlsZSBuYW1lCiAgICAgICAgICAgb3IgLSAoc3RkaW4pIGZvbGxvd3MgKi8KICAgICAgICBGSUxFICpmaWxlOwogICAgICAgIGNvbnN0IGNoYXIgKmZuYW1lOwogICAgICAgIG5leHRhcmcrKzsgLyogcGFzcyB0aGUgQCAqLwogICAgICAgIGlmKGN1cmx4X3N0cmVxdWFsKCItIiwgbmV4dGFyZykpIHsKICAgICAgICAgIGZuYW1lID0gIjxzdGRpbj4iOwogICAgICAgICAgZmlsZSA9IHN0ZGluOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgIGZuYW1lID0gbmV4dGFyZzsKICAgICAgICAgIGZpbGUgPSBmb3BlbihuZXh0YXJnLCAiciIpOwogICAgICAgIH0KICAgICAgICBlcnIgPSBmaWxlMnN0cmluZygmY29uZmlnLT53cml0ZW91dCwgZmlsZSk7CiAgICAgICAgaWYoZmlsZSAmJiAoZmlsZSAhPSBzdGRpbikpCiAgICAgICAgICBmY2xvc2UoZmlsZSk7CiAgICAgICAgaWYoZXJyKQogICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICBpZighY29uZmlnLT53cml0ZW91dCkKICAgICAgICAgIHdhcm5mKGNvbmZpZywgIkZhaWxlZCB0byByZWFkICVzIiwgZm5hbWUpOwogICAgICB9CiAgICAgIGVsc2UKICAgICAgICBHZXRTdHIoJmNvbmZpZy0+d3JpdGVvdXQsIG5leHRhcmcpOwogICAgICBicmVhazsKICAgIGNhc2UgJ3gnOgogICAgICAvKiBwcm94eSAqLwogICAgICBHZXRTdHIoJmNvbmZpZy0+cHJveHksIG5leHRhcmcpOwogICAgICBjb25maWctPnByb3h5dmVyID0gQ1VSTFBST1hZX0hUVFA7CiAgICAgIGJyZWFrOwogICAgY2FzZSAnWCc6CiAgICAgIC8qIHNldCBjdXN0b20gcmVxdWVzdCAqLwogICAgICBHZXRTdHIoJmNvbmZpZy0+Y3VzdG9tcmVxdWVzdCwgbmV4dGFyZyk7CiAgICAgIGJyZWFrOwogICAgY2FzZSAneSc6CiAgICAgIC8qIGxvdyBzcGVlZCB0aW1lICovCiAgICAgIGlmKHN0cjJudW0oJmNvbmZpZy0+bG93X3NwZWVkX3RpbWUsIG5leHRhcmcpKQogICAgICAgIHJldHVybiBQQVJBTV9CQURfTlVNRVJJQzsKICAgICAgaWYoIWNvbmZpZy0+bG93X3NwZWVkX2xpbWl0KQogICAgICAgIGNvbmZpZy0+bG93X3NwZWVkX2xpbWl0ID0gMTsKICAgICAgYnJlYWs7CiAgICBjYXNlICdZJzoKICAgICAgLyogbG93IHNwZWVkIGxpbWl0ICovCiAgICAgIGlmKHN0cjJudW0oJmNvbmZpZy0+bG93X3NwZWVkX2xpbWl0LCBuZXh0YXJnKSkKICAgICAgICByZXR1cm4gUEFSQU1fQkFEX05VTUVSSUM7CiAgICAgIGlmKCFjb25maWctPmxvd19zcGVlZF90aW1lKQogICAgICAgIGNvbmZpZy0+bG93X3NwZWVkX3RpbWUgPSAzMDsKICAgICAgYnJlYWs7CiAgICBjYXNlICd6JzogLyogdGltZSBjb25kaXRpb24gY29taW5nIHVwICovCiAgICAgIHN3aXRjaCgqbmV4dGFyZykgewogICAgICBjYXNlICcrJzoKICAgICAgICBuZXh0YXJnKys7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgLyogSWYtTW9kaWZpZWQtU2luY2U6IChzZWN0aW9uIDE0LjI4IGluIFJGQzIwNjgpICovCiAgICAgICAgY29uZmlnLT50aW1lY29uZCA9IENVUkxfVElNRUNPTkRfSUZNT0RTSU5DRTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAnLSc6CiAgICAgICAgLyogSWYtVW5tb2RpZmllZC1TaW5jZTogIChzZWN0aW9uIDE0LjI0IGluIFJGQzIwNjgpICovCiAgICAgICAgY29uZmlnLT50aW1lY29uZCA9IENVUkxfVElNRUNPTkRfSUZVTk1PRFNJTkNFOwogICAgICAgIG5leHRhcmcrKzsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAnPSc6CiAgICAgICAgLyogTGFzdC1Nb2RpZmllZDogIChzZWN0aW9uIDE0LjI5IGluIFJGQzIwNjgpICovCiAgICAgICAgY29uZmlnLT50aW1lY29uZCA9IENVUkxfVElNRUNPTkRfTEFTVE1PRDsKICAgICAgICBuZXh0YXJnKys7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgbm93ID0gdGltZShOVUxMKTsKICAgICAgY29uZmlnLT5jb25kdGltZT1jdXJsX2dldGRhdGUobmV4dGFyZywgJm5vdyk7CiAgICAgIGlmKC0xID09IChpbnQpY29uZmlnLT5jb25kdGltZSkgewogICAgICAgIC8qIG5vdyBsZXQncyBzZWUgaWYgaXQgaXMgYSBmaWxlIG5hbWUgdG8gZ2V0IHRoZSB0aW1lIGZyb20gaW5zdGVhZCEgKi8KICAgICAgICBzdHJ1Y3Rfc3RhdCBzdGF0YnVmOwogICAgICAgIGlmKC0xID09IHN0YXQobmV4dGFyZywgJnN0YXRidWYpKSB7CiAgICAgICAgICAvKiBmYWlsZWQsIHJlbW92ZSB0aW1lIGNvbmRpdGlvbiAqLwogICAgICAgICAgY29uZmlnLT50aW1lY29uZCA9IENVUkxfVElNRUNPTkRfTk9ORTsKICAgICAgICAgIHdhcm5mKGNvbmZpZywKICAgICAgICAgICAgICAgICJJbGxlZ2FsIGRhdGUgZm9ybWF0IGZvciAteiwgLS10aW1lY29uZCAoYW5kIG5vdCAiCiAgICAgICAgICAgICAgICAiYSBmaWxlIG5hbWUpLiBEaXNhYmxpbmcgdGltZSBjb25kaXRpb24uICIKICAgICAgICAgICAgICAgICJTZWUgY3VybF9nZXRkYXRlKDMpIGZvciB2YWxpZCBkYXRlIHN5bnRheC5cbiIpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgIC8qIHB1bGwgdGhlIHRpbWUgb3V0IGZyb20gdGhlIGZpbGUgKi8KICAgICAgICAgIGNvbmZpZy0+Y29uZHRpbWUgPSBzdGF0YnVmLnN0X210aW1lOwogICAgICAgIH0KICAgICAgfQogICAgICBicmVhazsKICAgIGRlZmF1bHQ6IC8qIHVua25vd24gZmxhZyAqLwogICAgICByZXR1cm4gUEFSQU1fT1BUSU9OX1VOS05PV047CiAgICB9CiAgICBoaXQgPSAtMTsKCiAgfSB3aGlsZSghbG9uZ29wdCAmJiAhc2luZ2xlb3B0ICYmICorK3BhcnNlICYmICEqdXNlZGFyZyk7CgogIHJldHVybiBQQVJBTV9PSzsKfQoK