JCEKJCEgVGhpcyBmaWxlIGNvbmZpZ3VyZXMgdGhlIGJmZCBsaWJyYXJ5IGZvciB1c2Ugd2l0aCBvcGVuVk1TLgokIQokISBXZSBkbyBub3QgdXNlIHRoZSBjb25maWd1cmUgc2NyaXB0LCBzaW5jZSB3ZSBkbyBub3QgaGF2ZSAvYmluL3NoCiQhIHRvIGV4ZWN1dGUgaXQuCiQhCiQhIFdyaXR0ZW4gYnkgS2xhdXMgSyJhbXBmIChra2FlbXBmQHJtaS5kZSkKJCEgUmV3cml0dGVuIGJ5IFRyaXN0YW4gR2luZ29sZCAoZ2luZ29sZEBhZGFjb3JlLmNvbSkKJCEKJCEgICBDb3B5cmlnaHQgMjAxMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KJCEKJCEgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKJCEgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKJCEgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKJCEgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KJCEgCiQhIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAokISBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgokISBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiQhIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiQhIAokISBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQokISBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkczLiAgSWYgbm90IHNlZQokISA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCiQhCiQgYXJjaD1GJEdFVFNZSSgiQVJDSF9OQU1FIikKJCBhcmNoPUYkRURJVChhcmNoLCJMT1dFUkNBU0UiKQokaWYgYXJjaCAuZXFzLiAiYWxwaGEiIHRoZW4gdGFyZ2V0ID0gImFscGhhIgokaWYgYXJjaCAuZXFzLiAiaWE2NCIgdGhlbiB0YXJnZXQgPSAiaWE2NCIKJCEKJGlmIChhcmNoIC5lcXMuICJhbHBoYSIpIC5vci4gKGFyY2ggLmVxcy4gImlhNjQiKQokdGhlbgokIQokIHdyaXRlIHN5cyRvdXRwdXQgIkNvbmZpZ3VyaW5nIEJGRCBmb3IgJyd0YXJnZXQnIHRhcmdldCIKJCEKJCEKJCEgY29weSBiZmQtaW4yLmggdG8gYmZkLmgsIHJlcGxhY2luZyBAIG1hY3JvcwokIQokIGVkaXQvdHB1L25vam91cm5hbC9ub3NlY3Rpb24vbm9kaXNwbGF5L2NvbW1hbmQ9c3lzJGlucHV0IC0KICAgICAgICBbXWJmZC1pbjIuaCAvb3V0cHV0PVtdYmZkLmgKJERFQ0sKIQohICBDb3B5IGZpbGUsIGNoYW5naW5nIGxpbmVzIHdpdGggbWFjcm9zIChAQCkKIQohCiAgIHNldCAoc3VjY2VzcyxvZmYpOwoKICAgZmlsZSA6PSBDUkVBVEVfQlVGRkVSKCJmaWxlIiwgR0VUX0lORk8oQ09NTUFORF9MSU5FLCAiZmlsZV9uYW1lIikpOwogICByYW5nIDo9IENSRUFURV9SQU5HRShCRUdJTk5JTkdfT0YoZmlsZSksIEVORF9PRihmaWxlKSk7CgogICBtYXRjaF9wb3MgOj0gU0VBUkNIX1FVSUVUTFkoJ0B3b3Jkc2l6ZUAnLCBGT1JXQVJELCBFWEFDVCwgcmFuZyk7CiAgIElGIG1hdGNoX3BvcyA8PiAwIFRIRU47CiAgICAgIFBPU0lUSU9OKEJFR0lOTklOR19PRihtYXRjaF9wb3MpKTsKICAgICAgRVJBU0UobWF0Y2hfcG9zKTsKICAgICAgQ09QWV9URVhUKCc2NCcpOwogICBFTkRJRjsKICAgbWF0Y2hfcG9zIDo9IFNFQVJDSF9RVUlFVExZKCdAYmZkX2RlZmF1bHRfdGFyZ2V0X3NpemVAJywgRk9SV0FSRCwgRVhBQ1QsIHJhbmcpOwogICBJRiBtYXRjaF9wb3MgPD4gMCBUSEVOOwogICAgICBQT1NJVElPTihCRUdJTk5JTkdfT0YobWF0Y2hfcG9zKSk7CiAgICAgIEVSQVNFKG1hdGNoX3Bvcyk7CiAgICAgIENPUFlfVEVYVCgnNjQnKTsKICAgRU5ESUY7CiAgIG1hdGNoX3BvcyA6PSBTRUFSQ0hfUVVJRVRMWSgnQEJGRF9IT1NUXzY0QklUX0xPTkdAJywgRk9SV0FSRCwgRVhBQ1QsIHJhbmcpOwogICBJRiBtYXRjaF9wb3MgPD4gMCBUSEVOOwogICAgICBQT1NJVElPTihCRUdJTk5JTkdfT0YobWF0Y2hfcG9zKSk7CiAgICAgIEVSQVNFKG1hdGNoX3Bvcyk7CiAgICAgIENPUFlfVEVYVCgnMCcpOwogICBFTkRJRjsKICAgbWF0Y2hfcG9zIDo9IFNFQVJDSF9RVUlFVExZKCdAQkZEX0hPU1RfTE9OR19MT05HQCcsIEZPUldBUkQsIEVYQUNULCByYW5nKTsKICAgSUYgbWF0Y2hfcG9zIDw+IDAgVEhFTjsKICAgICAgUE9TSVRJT04oQkVHSU5OSU5HX09GKG1hdGNoX3BvcykpOwogICAgICBFUkFTRShtYXRjaF9wb3MpOwogICAgICBDT1BZX1RFWFQoJzEnKTsKICAgRU5ESUY7CiAgIG1hdGNoX3BvcyA6PSBTRUFSQ0hfUVVJRVRMWSgnQEJGRF9IT1NUXzY0QklUX0xPTkdfTE9OR0AnLCBGT1JXQVJELCBFWEFDVCwgcmFuZyk7CiAgIElGIG1hdGNoX3BvcyA8PiAwIFRIRU47CiAgICAgIFBPU0lUSU9OKEJFR0lOTklOR19PRihtYXRjaF9wb3MpKTsKICAgICAgRVJBU0UobWF0Y2hfcG9zKTsKICAgICAgQ09QWV9URVhUKCcxJyk7CiAgIEVORElGOwogICBtYXRjaF9wb3MgOj0gU0VBUkNIX1FVSUVUTFkoJ0BCRkRfSE9TVF82NF9CSVRfREVGSU5FREAnLCBGT1JXQVJELCBFWEFDVCwgcmFuZyk7CiAgIElGIG1hdGNoX3BvcyA8PiAwIFRIRU47CiAgICAgIFBPU0lUSU9OKEJFR0lOTklOR19PRihtYXRjaF9wb3MpKTsKICAgICAgRVJBU0UobWF0Y2hfcG9zKTsKICAgICAgQ09QWV9URVhUKCcxJyk7CiAgIEVORElGOwogICBtYXRjaF9wb3MgOj0gU0VBUkNIX1FVSUVUTFkoJ0BCRkRfSE9TVF82NF9CSVRAJywgRk9SV0FSRCwgRVhBQ1QsIHJhbmcpOwogICBJRiBtYXRjaF9wb3MgPD4gMCBUSEVOOwogICAgICBQT1NJVElPTihCRUdJTk5JTkdfT0YobWF0Y2hfcG9zKSk7CiAgICAgIEVSQVNFKG1hdGNoX3Bvcyk7CiAgICAgIENPUFlfVEVYVCgnX19pbnQ2NCcpOwogICBFTkRJRjsKICAgbWF0Y2hfcG9zIDo9IFNFQVJDSF9RVUlFVExZKCdAQkZEX0hPU1RfVV82NF9CSVRAJywgRk9SV0FSRCwgRVhBQ1QsIHJhbmcpOwogICBJRiBtYXRjaF9wb3MgPD4gMCBUSEVOOwogICAgICBQT1NJVElPTihCRUdJTk5JTkdfT0YobWF0Y2hfcG9zKSk7CiAgICAgIEVSQVNFKG1hdGNoX3Bvcyk7CiAgICAgIENPUFlfVEVYVCgndW5zaWduZWQgX19pbnQ2NCcpOwogICBFTkRJRjsKICAgbWF0Y2hfcG9zIDo9IFNFQVJDSF9RVUlFVExZKCdAQkZEX0hPU1RQVFJfVEAnLCBGT1JXQVJELCBFWEFDVCwgcmFuZyk7CiAgIElGIG1hdGNoX3BvcyA8PiAwIFRIRU47CiAgICAgIFBPU0lUSU9OKEJFR0lOTklOR19PRihtYXRjaF9wb3MpKTsKICAgICAgRVJBU0UobWF0Y2hfcG9zKTsKICAgICAgQ09QWV9URVhUKCd1bnNpZ25lZCBfX2ludDY0Jyk7CiAgIEVORElGOwogICBtYXRjaF9wb3MgOj0gU0VBUkNIX1FVSUVUTFkoJ0BiZmRfZmlsZV9wdHJAJywgRk9SV0FSRCwgRVhBQ1QsIHJhbmcpOwogICBJRiBtYXRjaF9wb3MgPD4gMCBUSEVOOwogICAgICBQT1NJVElPTihCRUdJTk5JTkdfT0YobWF0Y2hfcG9zKSk7CiAgICAgIEVSQVNFKG1hdGNoX3Bvcyk7CiAgICAgIENPUFlfVEVYVCgnYmZkX3NpZ25lZF92bWEnKTsKICAgRU5ESUY7CiAgIG1hdGNoX3BvcyA6PSBTRUFSQ0hfUVVJRVRMWSgndW5zaWduZWQgQGJmZF9maWxlX3B0ckAgdWZpbGVfcHRyJywgRk9SV0FSRCwgRVhBQ1QsIHJhbmcpOwogICBJRiBtYXRjaF9wb3MgPD4gMCBUSEVOOwogICAgICBQT1NJVElPTihCRUdJTk5JTkdfT0YobWF0Y2hfcG9zKSk7CiAgICAgIEVSQVNFKG1hdGNoX3Bvcyk7CiAgICAgIENPUFlfVEVYVCgnYmZkX3ZtYSB1ZmlsZV9wdHInKTsKICAgRU5ESUY7CiAgIG1hdGNoX3BvcyA6PSBTRUFSQ0hfUVVJRVRMWSgnQHN1cHBvcnRzX3BsdWdpbnNAJywgRk9SV0FSRCwgRVhBQ1QsIHJhbmcpOwogICBJRiBtYXRjaF9wb3MgPD4gMCBUSEVOOwogICAgICBQT1NJVElPTihCRUdJTk5JTkdfT0YobWF0Y2hfcG9zKSk7CiAgICAgIEVSQVNFKG1hdGNoX3Bvcyk7CiAgICAgIENPUFlfVEVYVCgnMCcpOwogICBFTkRJRjsKICAgV1JJVEVfRklMRShmaWxlLCBHRVRfSU5GTyhDT01NQU5EX0xJTkUsICJvdXRwdXRfZmlsZSIpKTsKICAgUVVJVAokICBFT0QKJAokZWxzZQokCiQgd3JpdGUgc3lzJG91dHB1dCAiQ29uZmlndXJpbmcgZm9yIFZheCB0YXJnZXQiCiQgdGFyZ2V0ID0gInZheCIKJCEKJCEgY29weSBiZmQtaW4yLmggdG8gYmZkLmgsIHJlcGxhY2luZyBAIG1hY3JvcwokIQokIHdyaXRlIHN5cyRvdXRwdXQgIkdlbmVyYXRlZCBgYmZkLmgnIGZyb20gYGJmZC1pbjIuaCcuIgokIGVkaXQvdHB1L25vam91cm5hbC9ub3NlY3Rpb24vbm9kaXNwbGF5L2NvbW1hbmQ9c3lzJGlucHV0IC0KICAgICAgICBbXWJmZC1pbjIuaCAvb3V0cHV0PVtdYmZkLmgKJERFQ0sKIQohICBDb3B5IGZpbGUsIGNoYW5naW5nIGxpbmVzIHdpdGggbWFjcm9zIChAQCkKIQohCiAgIHNldCAoc3VjY2VzcyxvZmYpOwoKICAgZmlsZSA6PSBDUkVBVEVfQlVGRkVSKCJmaWxlIiwgR0VUX0lORk8oQ09NTUFORF9MSU5FLCAiZmlsZV9uYW1lIikpOwogICByYW5nIDo9IENSRUFURV9SQU5HRShCRUdJTk5JTkdfT0YoZmlsZSksIEVORF9PRihmaWxlKSk7CgogICBtYXRjaF9wb3MgOj0gU0VBUkNIX1FVSUVUTFkoJ0B3b3Jkc2l6ZUAnLCBGT1JXQVJELCBFWEFDVCwgcmFuZyk7CiAgIElGIG1hdGNoX3BvcyA8PiAwIFRIRU47CiAgICAgIFBPU0lUSU9OKEJFR0lOTklOR19PRihtYXRjaF9wb3MpKTsKICAgICAgRVJBU0UobWF0Y2hfcG9zKTsKICAgICAgQ09QWV9URVhUKCczMicpOwogICBFTkRJRjsKICAgbWF0Y2hfcG9zIDo9IFNFQVJDSF9RVUlFVExZKCdAQkZEX0hPU1RfNjRCSVRfTE9OR0AnLCBGT1JXQVJELCBFWEFDVCwgcmFuZyk7CiAgIElGIG1hdGNoX3BvcyA8PiAwIFRIRU47CiAgICAgIFBPU0lUSU9OKEJFR0lOTklOR19PRihtYXRjaF9wb3MpKTsKICAgICAgRVJBU0UobWF0Y2hfcG9zKTsKICAgICAgQ09QWV9URVhUKCcwJyk7CiAgIEVORElGOwogICBtYXRjaF9wb3MgOj0gU0VBUkNIX1FVSUVUTFkoJ0BCRkRfSE9TVF82NF9CSVRfREVGSU5FREAnLCBGT1JXQVJELCBFWEFDVCwgcmFuZyk7CiAgIElGIG1hdGNoX3BvcyA8PiAwIFRIRU47CiAgICAgIFBPU0lUSU9OKEJFR0lOTklOR19PRihtYXRjaF9wb3MpKTsKICAgICAgRVJBU0UobWF0Y2hfcG9zKTsKICAgICAgQ09QWV9URVhUKCdfX0RFQ0MnKTsKICAgICAgU1BMSVRfTElORTsKICAgICAgQ09QWV9URVhUKCcjaW5jbHVkZSA8aW50cy5oPicpOwogICBFTkRJRjsKICAgbWF0Y2hfcG9zIDo9IFNFQVJDSF9RVUlFVExZKCdAQkZEX0hPU1RfNjRfQklUQCcsIEZPUldBUkQsIEVYQUNULCByYW5nKTsKICAgSUYgbWF0Y2hfcG9zIDw+IDAgVEhFTjsKICAgICAgUE9TSVRJT04oQkVHSU5OSU5HX09GKG1hdGNoX3BvcykpOwogICAgICBFUkFTRShtYXRjaF9wb3MpOwogICAgICBDT1BZX1RFWFQoJ2ludDY0Jyk7CiAgIEVORElGOwogICBtYXRjaF9wb3MgOj0gU0VBUkNIX1FVSUVUTFkoJ0BCRkRfSE9TVF9VXzY0X0JJVEAnLCBGT1JXQVJELCBFWEFDVCwgcmFuZyk7CiAgIElGIG1hdGNoX3BvcyA8PiAwIFRIRU47CiAgICAgIFBPU0lUSU9OKEJFR0lOTklOR19PRihtYXRjaF9wb3MpKTsKICAgICAgRVJBU0UobWF0Y2hfcG9zKTsKICAgICAgQ09QWV9URVhUKCd1aW50NjQnKTsKICAgRU5ESUY7CiAgIFdSSVRFX0ZJTEUoZmlsZSwgR0VUX0lORk8oQ09NTUFORF9MSU5FLCAib3V0cHV0X2ZpbGUiKSk7CiAgIFFVSVQKJCAgRU9ECiRlbmRpZgokCiQhCiQhIGNyZWF0ZSBiZmR2ZXIuaAokIQokIHdyaXRlIHN5cyRvdXRwdXQgIkdlbmVyYXRlIGBiZmR2ZXIuaCcgZnJvbSAndmVyc2lvbi5oJyBhbmQgYGNvbmZpZ3VyZS5pbicuIgokIGVkaXQvdHB1L25vam91cm5hbC9ub3NlY3Rpb24vbm9kaXNwbGF5L2NvbW1hbmQ9c3lzJGlucHV0IC0KICAgICAgICBbXXZlcnNpb24uaCAvb3V0cHV0PVtdYmZkdmVyLmgKJERFQ0sKIQohICBDb3B5IGZpbGUsIGNoYW5naW5nIGxpbmVzIHdpdGggbWFjcm9zIChAQCkKIQohCiAgIHNldCAoc3VjY2VzcyxvZmYpOwogICB2ZmlsZSA6PSBDUkVBVEVfQlVGRkVSKCJ2ZmlsZSIsICJjb25maWd1cmUuaW4iKTsKICAgcmFuZyA6PSBDUkVBVEVfUkFOR0UoQkVHSU5OSU5HX09GKHZmaWxlKSwgRU5EX09GKHZmaWxlKSk7CiAgIG1hdGNoX3BvcyA6PSBTRUFSQ0hfUVVJRVRMWSgnQUNfSU5JVChbYmZkXSwgWycsIEZPUldBUkQsIEVYQUNULCByYW5nKTsKICAgSUYgbWF0Y2hfcG9zIDw+IDAgVEhFTjsKICAgICBQT1NJVElPTihCRUdJTk5JTkdfT0YobWF0Y2hfcG9zKSk7CiAgICAgRVJBU0UobWF0Y2hfcG9zKTsKICAgICB2ZXJzIDo9IENVUlJFTlRfTElORS0iXSkiOwogICBFTFNFOwogICAgIHZlcnMgOj0gInVua25vd24iOwogICBFTkRJRjsKICAgdmVyc251bSA6PSB2ZXJzIC0gIi4iIC0gIi4iOwoKICAgZmlsZSA6PSBDUkVBVEVfQlVGRkVSKCJmaWxlIiwgR0VUX0lORk8oQ09NTUFORF9MSU5FLCAiZmlsZV9uYW1lIikpOwogICByYW5nIDo9IENSRUFURV9SQU5HRShCRUdJTk5JTkdfT0YoZmlsZSksIEVORF9PRihmaWxlKSk7CgogICBtYXRjaF9wb3MgOj0gU0VBUkNIX1FVSUVUTFkoJ0BiZmRfdmVyc2lvbkAnLCBGT1JXQVJELCBFWEFDVCwgcmFuZyk7CiAgIElGIG1hdGNoX3BvcyA8PiAwIFRIRU47CiAgICAgIFBPU0lUSU9OKEJFR0lOTklOR19PRihtYXRjaF9wb3MpKTsKICAgICAgRVJBU0UobWF0Y2hfcG9zKTsKICAgICAgQ09QWV9URVhUKHZlcnNudW0pOwogICBFTkRJRjsKICAgbWF0Y2hfcG9zIDo9IFNFQVJDSF9RVUlFVExZKCdAYmZkX3ZlcnNpb25fc3RyaW5nQCcsIEZPUldBUkQsIEVYQUNULCByYW5nKTsKICAgSUYgbWF0Y2hfcG9zIDw+IDAgVEhFTjsKICAgICAgUE9TSVRJT04oQkVHSU5OSU5HX09GKG1hdGNoX3BvcykpOwogICAgICBFUkFTRShtYXRjaF9wb3MpOwogICAgICBDT1BZX1RFWFQoJyInKTsKICAgICAgQ09QWV9URVhUKHZlcnMpOwogICAgICBDT1BZX1RFWFQoJyInKTsKICAgRU5ESUY7CiAgIG1hdGNoX3BvcyA6PSBTRUFSQ0hfUVVJRVRMWSgnQGJmZF92ZXJzaW9uX3BhY2thZ2VAJywgRk9SV0FSRCwgRVhBQ1QsIHJhbmcpOwogICBJRiBtYXRjaF9wb3MgPD4gMCBUSEVOOwogICAgICBQT1NJVElPTihCRUdJTk5JTkdfT0YobWF0Y2hfcG9zKSk7CiAgICAgIEVSQVNFKG1hdGNoX3Bvcyk7CiAgICAgIENPUFlfVEVYVCgnIihHTlUgQmludXRpbHMpICInKTsKICAgRU5ESUY7CiAgIG1hdGNoX3BvcyA6PSBTRUFSQ0hfUVVJRVRMWSgnQHJlcG9ydF9idWdzX3RvQCcsIEZPUldBUkQsIEVYQUNULCByYW5nKTsKICAgSUYgbWF0Y2hfcG9zIDw+IDAgVEhFTjsKICAgICAgUE9TSVRJT04oQkVHSU5OSU5HX09GKG1hdGNoX3BvcykpOwogICAgICBFUkFTRShtYXRjaF9wb3MpOwogICAgICBDT1BZX1RFWFQoJyI8aHR0cDovL3d3dy5zb3VyY2V3YXJlLm9yZy9idWd6aWxsYS8+IicpOwogICBFTkRJRjsKICAgV1JJVEVfRklMRShmaWxlLCBHRVRfSU5GTyhDT01NQU5EX0xJTkUsICJvdXRwdXRfZmlsZSIpKTsKICAgUVVJVAokICBFT0QKJCEKJCEKJCEgY3JlYXRlIGJmZF9zdGRpbnQuaAokIQokIHdyaXRlIHN5cyRvdXRwdXQgIkdlbmVyYXRlIGBiZmRfc3RkaW50LmgnIgokIGNyZWF0ZSBbXWJmZF9zdGRpbnQuaAojaW5jbHVkZSA8aW50dHlwZXMuaD4KJCEKJCEKJCEgY3JlYXRlIHRhcmdtYXRjaC5oCiQhCiQgd3JpdGUgc3lzJG91dHB1dCAiR2VuZXJhdGUgYHRhcmdtYXRjaC5oJyIKJCBvcGVuL3dyaXRlIHRmaWxlIFtddGFyZ21hdGNoLmgKJCB3cml0ZSB0ZmlsZSAieyAiIiIgKyB0YXJnZXQgKyAiLSotKnZtcyoiIiIgKyAiLCIKJCB3cml0ZSB0ZmlsZSAiI2lmIGRlZmluZWQgKFNFTEVDVF9WRUNTKSIKJCB3cml0ZSB0ZmlsZSAiU0VMRUNUX1ZFQ1MiCiQgd3JpdGUgdGZpbGUgIiNlbHNlIgokIHdyaXRlIHRmaWxlICJVTlNVUFBPUlRFRF9UQVJHRVQiCiQgd3JpdGUgdGZpbGUgIiNlbmRpZiIKJCB3cml0ZSB0ZmlsZSAifSwiCiQgY2xvc2UgdGZpbGUKJCEKJCEKJCEgY3JlYXRlIGNvbmZpZy5oCiQhCiQgd3JpdGUgc3lzJG91dHB1dCAiR2VuZXJhdGUgYGNvbmZpZy5oJyIKJCBjcmVhdGUgW11jb25maWcuaAovKiBjb25maWcuaC12bXMuICBHZW5lcmF0ZWQgYnkgaGFuZCBieSBLbGF1cyBL5G1wZiwga2thZW1wZkBkaWR5bXVzLnJtaS5kZS4gICovCi8qIGNvbmZpZy5pbi4gIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gY29uZmlndXJlLmluIGJ5IGF1dG9oZWFkZXIuICAqLwovKiBXaGV0aGVyIG1hbGxvYyBtdXN0IGJlIGRlY2xhcmVkIGV2ZW4gaWYgPHN0ZGxpYi5oPiBpcyBpbmNsdWRlZC4gICovCi8qICN1bmRlZiBORUVEX0RFQ0xBUkFUSU9OX01BTExPQyAqLwovKiBXaGV0aGVyIGZyZWUgbXVzdCBiZSBkZWNsYXJlZCBldmVuIGlmIDxzdGRsaWIuaD4gaXMgaW5jbHVkZWQuICAqLwovKiAjdW5kZWYgTkVFRF9ERUNMQVJBVElPTl9GUkVFICovCi8qIERlZmluZSBpZiB5b3UgaGF2ZSBhIHdvcmtpbmcgYG1tYXAnIHN5c3RlbSBjYWxsLiAgKi8KLyogI2RlZmluZSBIQVZFX01NQVAgMSAqLwovKiBEbyB3ZSBuZWVkIHRvIHVzZSB0aGUgYiBtb2RpZmllciB3aGVuIG9wZW5pbmcgYmluYXJ5IGZpbGVzPyAgKi8KLyogI3VuZGVmIFVTRV9CSU5BUllfRk9QRU4gKi8KLyogTmFtZSBvZiBob3N0IHNwZWNpZmljIGhlYWRlciBmaWxlIHRvIGluY2x1ZGUgaW4gdHJhZC1jb3JlLmMuICAqLwovKiAjdW5kZWYgVFJBRF9IRUFERVIgKi8KLyogRGVmaW5lIG9ubHkgaWYgPHN5cy9wcm9jZnMuaD4gaXMgYXZhaWxhYmxlICphbmQqIGl0IGRlZmluZXMgcHJzdGF0dXNfdC4gICovCi8qICN1bmRlZiBIQVZFX1NZU19QUk9DRlNfSCAqLwovKiBEbyB3ZSByZWFsbHkgd2FudCB0byB1c2UgbW1hcCBpZiBpdCdzIGF2YWlsYWJsZT8gICovCi8qICN1bmRlZiBVU0VfTU1BUCAqLwovKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGZjbnRsIGZ1bmN0aW9uLiAgKi8KI2RlZmluZSBIQVZFX0ZDTlRMIDEKLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBnZXRwYWdlc2l6ZSBmdW5jdGlvbi4gICovCiNkZWZpbmUgSEFWRV9HRVRQQUdFU0laRSAxCi8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgbWFkdmlzZSBmdW5jdGlvbi4gICovCiNkZWZpbmUgSEFWRV9NQURWSVNFIDEKLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBtcHJvdGVjdCBmdW5jdGlvbi4gICovCiNkZWZpbmUgSEFWRV9NUFJPVEVDVCAxCi8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGZjbnRsLmg+IGhlYWRlciBmaWxlLiAgKi8KI2RlZmluZSBIQVZFX0ZDTlRMX0ggMQovKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdGRkZWYuaD4gaGVhZGVyIGZpbGUuICAqLwojZGVmaW5lIEhBVkVfU1REREVGX0ggMQovKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdGRsaWIuaD4gaGVhZGVyIGZpbGUuICAqLwojZGVmaW5lIEhBVkVfU1RETElCX0ggMQovKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmcuaD4gaGVhZGVyIGZpbGUuICAqLwojZGVmaW5lIEhBVkVfU1RSSU5HX0ggMQovKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmdzLmg+IGhlYWRlciBmaWxlLiAgKi8KI2RlZmluZSBIQVZFX1NUUklOR1NfSCAxCi8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9maWxlLmg+IGhlYWRlciBmaWxlLiAgKi8KI2RlZmluZSBIQVZFX1NZU19GSUxFX0ggMQovKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDx0aW1lLmg+IGhlYWRlciBmaWxlLiAgKi8KI2RlZmluZSBIQVZFX1RJTUVfSCAxCi8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHVuaXN0ZC5oPiBoZWFkZXIgZmlsZS4gICovCiNkZWZpbmUgSEFWRV9VTklTVERfSCAxCi8qIERpc2FibGUgTkxTICAqLwojdW5kZWYgRU5BQkxFX05MUwovKiBOYW1lIG9mIHBhY2thZ2UgKi8KI2RlZmluZSBQQUNLQUdFICJiZmQiCi8qIERlZmluZSB0byB0aGUgYWRkcmVzcyB3aGVyZSBidWcgcmVwb3J0cyBmb3IgdGhpcyBwYWNrYWdlIHNob3VsZCBiZSBzZW50LiAqLwojZGVmaW5lIFBBQ0tBR0VfQlVHUkVQT1JUICIiCi8qIERlZmluZSB0byB0aGUgZnVsbCBuYW1lIG9mIHRoaXMgcGFja2FnZS4gKi8KI2RlZmluZSBQQUNLQUdFX05BTUUgImJmZCIKLyogRGVmaW5lIHRvIHRoZSBmdWxsIG5hbWUgYW5kIHZlcnNpb24gb2YgdGhpcyBwYWNrYWdlLiAqLwojZGVmaW5lIFBBQ0tBR0VfU1RSSU5HICJiZmQiCi8qIERlZmluZSB0byB0aGUgb25lIHN5bWJvbCBzaG9ydCBuYW1lIG9mIHRoaXMgcGFja2FnZS4gKi8KI2RlZmluZSBQQUNLQUdFX1RBUk5BTUUgImJmZCIKLyogRGVmaW5lIHRvIHRoZSBob21lIHBhZ2UgZm9yIHRoaXMgcGFja2FnZS4gKi8KI2RlZmluZSBQQUNLQUdFX1VSTCAiIgovKiBEZWZpbmUgdG8gdGhlIHZlcnNpb24gb2YgdGhpcyBwYWNrYWdlLiAqLwojZGVmaW5lIFBBQ0tBR0VfVkVSU0lPTiAiKHBhY2thZ2UgdmVyc2lvbikiCiQhCiQgd3JpdGUgc3lzJG91dHB1dCAiQ29weSBzeXNkZXAuaCIKJCBjb3B5IFsuaG9zdHNdYWxwaGF2bXMuaCBzeXNkZXAuaAokCiQgd3JpdGUgc3lzJG91dHB1dCAiR2VuZXJhdGUgYnVpbGQuY29tIgokIQokIGlmIEFSQ0guZXFzLiJhbHBoYSIKJCB0aGVuCiQgICBjcmVhdGUgYnVpbGQuY29tCiRERUNLCiQgREVGUz0iIiJTRUxFQ1RfVkVDUz0mdm1zX2FscGhhX3ZlYyIiLCIrLQogICIiIlNFTEVDVF9BUkNISVRFQ1RVUkVTPSZiZmRfYWxwaGFfYXJjaCIiIgokIEZJTEVTPSJjcHUtYWxwaGEsdm1zLHZtcy1oZHIsdm1zLWdzZCx2bXMtdGlyLHZtcy1taXNjLCIKJEVPRAokIGVuZGlmCiQgaWYgQVJDSC5lcXMuImlhNjQiCiQgdGhlbgokICAgY3JlYXRlIGJ1aWxkLmNvbQokREVDSwokIERFRlM9IiIiU0VMRUNUX1ZFQ1M9JmJmZF9lbGY2NF9pYTY0X3Ztc192ZWMiIiwiKy0KICAiIiJTRUxFQ1RfQVJDSElURUNUVVJFUz0mYmZkX2lhNjRfYXJjaCIiIgokIEZJTEVTPSJjcHUtaWE2NCxlbGY2NC1pYTY0LGVsZi1zdHJ0YWIsY29yZWZpbGUsc3RhYnMsbWVyZ2UsZWxmLWVoLWZyYW1lLCIrLQogICJlbGZsaW5rLGVsZi1hdHRycyxkd2FyZjEsZWxmNjQsIgokRU9ECiQgY3JlYXRlIHN1YnN0eHgudHB1CiRERUNLCiAgIHNldCAoc3VjY2VzcyxvZmYpOwogICBmaWxlIDo9IENSRUFURV9CVUZGRVIoImZpbGUiLCBHRVRfSU5GTyhDT01NQU5EX0xJTkUsICJmaWxlX25hbWUiKSk7CiAgIGZvdW5kX3JhbmdlIDo9IENSRUFURV9SQU5HRShCRUdJTk5JTkdfT0YoZmlsZSksIEJFR0lOTklOR19PRihmaWxlKSk7CgogICBMT09QCiAgICAgcmFuZyA6PSBDUkVBVEVfUkFOR0UgKEVORF9PRihmb3VuZF9yYW5nZSksRU5EX09GKGZpbGUpKTsKICAgICBtYXRjaF9wb3MgOj0gU0VBUkNIX1FVSUVUTFkoJ05OJywgRk9SV0FSRCwgRVhBQ1QsIHJhbmcpOwogICAgIEVYSVRJRiBtYXRjaF9wb3MgPSAwOwogICAgIFBPU0lUSU9OKEJFR0lOTklOR19PRihtYXRjaF9wb3MpKTsKICAgICBFUkFTRShtYXRjaF9wb3MpOwogICAgIENPUFlfVEVYVCgnNjQnKTsKICAgRU5ETE9PUDsKICAgV1JJVEVfRklMRShmaWxlLCBHRVRfSU5GTyhDT01NQU5EX0xJTkUsICJvdXRwdXRfZmlsZSIpKTsKICAgUVVJVAokICBFT0QKJCB3cml0ZSBzeXMkb3V0cHV0ICJHZW5lcmF0ZSBlbGY2NC10YXJnZXQuaCBmcm9tIGVsZnh4LXRhcmdldC5oIgokIGVkaXQvdHB1L25vam91cm5hbC9ub3NlY3Rpb24vbm9kaXNwbGF5L2NvbW1hbmQ9c3Vic3R4eC50cHUgLQogICAgICAgIFtdZWxmWFgtdGFyZ2V0LmggL291dHB1dD1bXWVsZjY0LXRhcmdldC5oCiQgZGVsIHN1YnN0eHgudHB1OyoKJCBlbmRpZgokIGFwcGVuZCBzeXMkaW5wdXQgYnVpbGQuY29tCiRERUNLCiQgREVGUz1ERUZTICsgIiwiInVubGluaz1yZW1vdmUiIiwiIkRFQlVHRElSPSIiIiJHTlUkREVCVUdESVI6IiIiIiIiIgokIE9QVD0iL25vb3B0L2RlYnVnIgokIENGTEFHUz0iL25hbWU9KGFzX2lzLHNob3J0ZW5lZCkiICsgLQogICIvaW5jbHVkZT0oW10sIiIuLi8iIiwiIi4uL2luY2x1ZGUiIikiICsgLQogICIvZGVmaW5lPSgiICsgREVGUyArICIpIiArIE9QVAokIEZJTEVTPUZJTEVTICsgImFyY2hpdmUsYXJjaGl2ZTY0LGFyY2h1cmVzLGJmZCxiZmRpbyxiaW5hcnksY2FjaGUsY29mZmdlbiwiKy0KICAiY29tcHJlc3MsY29yZWZpbGUsZHdhcmYyLGVsZixmb3JtYXQsaGFzaCxpaGV4LGluaXQsbGliYmZkLGxpbmtlciwiKy0KICAib3BuY2xzLHJlbG9jLHNlY3Rpb24sc2ltcGxlLHNyZWMsc3RhYi1zeW1zLHN5bXMsdGFyZ2V0cyx0ZWtoZXgsdmVyaWxvZyIKJCB3cml0ZSBzeXMkb3V0cHV0ICJDRkxBR1M9IixDRkxBR1MKJCBjZmxhZ3NfbGliYmZkPSIvd2FybmluZz0oZGlzYWJsZT1taXNzaW5ncmV0dXJuKSIKJCBjZmxhZ3NfbmlsPSIiCiQgTlVNID0gMAokIE9CSlM9IiIKJCBMT09QOgokICAgRiA9IEYkRUxFTUVOVChOVU0sIiwiLEZJTEVTKQokICAgSUYgRi5FUVMuIiwiIFRIRU4gR09UTyBFTkQKJCAgIGVmbGFnc19uYW1lPSJjZmxhZ3NfJydmJyIKJCAgIG5hbWVfbGVuPWYkbGVuZ3RoKGVmbGFnc19uYW1lKQokICAgZGFzaF9wb3M9ZiRsb2NhdGUoIi0iLGVmbGFnc19uYW1lKQokICAgaWYgZGFzaF9wb3MubmUubmFtZV9sZW4KJCAgIHRoZW4KJCAgICAgZWZsYWdzX25hbWVbJ2Rhc2hfcG9zLDFdOj0iXyIKJCAgICAgZGFzaF9wb3M9ZiRsb2NhdGUoIi0iLGVmbGFnc19uYW1lKQokICAgICBpZiBkYXNoX3Bvcy5uZS5uYW1lX2xlbiB0aGVuIGVmbGFnc19uYW1lWydkYXNoX3BvcywxXTo9Il8iCiQgICBlbmRpZgokICAgaWYgZiR0eXBlKCdlZmxhZ3NfbmFtZSkuZXFzLiIiIHRoZW4gZWZsYWdzX25hbWU9ImNmbGFnc19uaWwiCiQgICBlZmxhZ3M9J2VmbGFnc19uYW1lCiQgICB3cml0ZSBzeXMkb3V0cHV0ICJDb21waWxpbmcgIiwgRiwgIi5jIiwgZWZsYWdzCiQgICBjYyAnQ0ZMQUdTICdlZmxhZ3MgJ0YuYwokICAgSUYgT0JKUy5ORVMuIiIgVEhFTiBPQkpTPU9CSlMgKyAiLCIKJCAgIE9CSlM9T0JKUyArIEYgKyAiLm9iaiIKJCAgIE5VTSA9IE5VTSArIDEKJCAgIEdPVE8gTE9PUAokIEVORDoKJCBwdXJnZQokIGxpYi9jcmVhdGUgbGliYmZkICdPQkpTCiRFT0QK