Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi8vIFNQRFgtRmlsZUNvcHlyaWdodFRleHQ6IFN5bnRhY29yZSBMTEMgqSAyMDE2LTIwMjEKLy8gCi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwovLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAovLwovLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAovLwovLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgovLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgovLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMAovLyBTUERYLUZpbGVDb250cmlidXRvcjogU3ludGFjb3JlIExMQwovLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwovLy8gQGZpbGUgICAgICAgPHNjcjFfc2N1LnN2aD4KLy8vIEBicmllZiAgICAgIFNDVSBoZWFkZXIgZmlsZQovLy8KCmBpZm5kZWYgU0NSMV9JTkNMVURFX1NDVV9ERUZTCmBkZWZpbmUgU0NSMV9JTkNMVURFX1NDVV9ERUZTCgovL2BpbmNsdWRlICJzY3IxX2FyY2hfZGVzY3JpcHRpb24uc3ZoIgoKYGlmZGVmIFNDUjFfREJHX0VOCgovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLyBQYXJhbWV0ZXJzCi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CmxvY2FscGFyYW0gaW50IHVuc2lnbmVkICAgICAgICAgU0NSMV9TQ1VfRFJfU1lTQ1RSTF9PUF9XSURUSCAgICAgICAgPSAyOwpsb2NhbHBhcmFtIGludCB1bnNpZ25lZCAgICAgICAgIFNDUjFfU0NVX0RSX1NZU0NUUkxfQUREUl9XSURUSCAgICAgID0gMjsKbG9jYWxwYXJhbSBpbnQgdW5zaWduZWQgICAgICAgICBTQ1IxX1NDVV9EUl9TWVNDVFJMX0RBVEFfV0lEVEggICAgICA9IDQ7CmxvY2FscGFyYW0gaW50IHVuc2lnbmVkICAgICAgICAgU0NSMV9TQ1VfRFJfU1lTQ1RSTF9XSURUSCAgICAgID0gU0NSMV9TQ1VfRFJfU1lTQ1RSTF9PUF9XSURUSCtTQ1IxX1NDVV9EUl9TWVNDVFJMX0FERFJfV0lEVEgrU0NSMV9TQ1VfRFJfU1lTQ1RSTF9EQVRBX1dJRFRIOyAvLyBjcC4zCgovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLyBUeXBlcwovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQp0eXBlZGVmIGVudW0gbG9naWMgW1NDUjFfU0NVX0RSX1NZU0NUUkxfT1BfV0lEVEgtMTowXSB7CiAgICBTQ1IxX1NDVV9TWVNDVFJMX09QX1dSSVRFICAgICAgID0gMidoMCwKICAgIFNDUjFfU0NVX1NZU0NUUkxfT1BfUkVBRCAgICAgICAgPSAyJ2gxLAogICAgU0NSMV9TQ1VfU1lTQ1RSTF9PUF9TRVRCSVRTICAgICA9IDInaDIsCiAgICBTQ1IxX1NDVV9TWVNDVFJMX09QX0NMUkJJVFMgICAgID0gMidoMwpgaWZkZWYgU0NSMV9YUFJPUF9FTgogICAgLAogICAgU0NSMV9TQ1VfU1lTQ1RSTF9PUF9YWFggICAgICAgICA9ICdYCmBlbmRpZiAvLyBTQ1IxX1hQUk9QX0VOCn0gdHlwZV9zY3IxX3NjdV9zeXNjdHJsX29wX2U7Cgp0eXBlZGVmIGVudW0gbG9naWMgW1NDUjFfU0NVX0RSX1NZU0NUUkxfQUREUl9XSURUSC0xOjBdIHsKICAgIFNDUjFfU0NVX1NZU0NUUkxfQUREUl9DT05UUk9MICAgPSAyJ2gwLAogICAgU0NSMV9TQ1VfU1lTQ1RSTF9BRERSX01PREUgICAgICA9IDInaDEsCiAgICBTQ1IxX1NDVV9TWVNDVFJMX0FERFJfU1RBVFVTICAgID0gMidoMiwKICAgIFNDUjFfU0NVX1NZU0NUUkxfQUREUl9TVElDS1kgICAgPSAyJ2gzCmBpZmRlZiBTQ1IxX1hQUk9QX0VOCiAgICAsCiAgICBTQ1IxX1NDVV9TWVNDVFJMX0FERFJfWFhYICAgICAgID0gJ1gKYGVuZGlmIC8vIFNDUjFfWFBST1BfRU4KfSB0eXBlX3NjcjFfc2N1X3N5c2N0cmxfYWRkcl9lOwoKdHlwZWRlZiBzdHJ1Y3QgcGFja2VkIHsKICAgIGxvZ2ljIFtTQ1IxX1NDVV9EUl9TWVNDVFJMX0RBVEFfV0lEVEgtMTowXSAgZGF0YTsKICAgIGxvZ2ljIFtTQ1IxX1NDVV9EUl9TWVNDVFJMX0FERFJfV0lEVEgtMTowXSAgYWRkcjsKICAgIGxvZ2ljIFtTQ1IxX1NDVV9EUl9TWVNDVFJMX09QX1dJRFRILTE6MF0gICAgb3A7Cn0gdHlwZV9zY3IxX3NjdV9zeXNjdHJsX2RyX3M7Cgp0eXBlZGVmIGVudW0gaW50IHVuc2lnbmVkIHsKICAgIFNDUjFfU0NVX0RSX1NZU0NUUkxfT1BfQklUX1IgICAgICAgICAgICAgICAgICA9ICdoMCwKICAgIFNDUjFfU0NVX0RSX1NZU0NUUkxfT1BfQklUX0wgICAgICAgICAgICAgICAgICA9IFNDUjFfU0NVX0RSX1NZU0NUUkxfT1BfV0lEVEgtMSwKICAgIFNDUjFfU0NVX0RSX1NZU0NUUkxfQUREUl9CSVRfUiAgICAgICAgICAgICAgICA9IFNDUjFfU0NVX0RSX1NZU0NUUkxfT1BfV0lEVEgsCiAgICBTQ1IxX1NDVV9EUl9TWVNDVFJMX0FERFJfQklUX0wgICAgICAgICAgICAgICAgPSBTQ1IxX1NDVV9EUl9TWVNDVFJMX09QX1dJRFRIICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDUjFfU0NVX0RSX1NZU0NUUkxfQUREUl9XSURUSCAtIDEsCiAgICBTQ1IxX1NDVV9EUl9TWVNDVFJMX0RBVEFfQklUX1IgICAgICAgICAgICAgICAgPSBTQ1IxX1NDVV9EUl9TWVNDVFJMX09QX1dJRFRIICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDUjFfU0NVX0RSX1NZU0NUUkxfQUREUl9XSURUSCwKICAgIFNDUjFfU0NVX0RSX1NZU0NUUkxfREFUQV9CSVRfTCAgICAgICAgICAgICAgICA9IFNDUjFfU0NVX0RSX1NZU0NUUkxfT1BfV0lEVEggKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NSMV9TQ1VfRFJfU1lTQ1RSTF9BRERSX1dJRFRIICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDUjFfU0NVX0RSX1NZU0NUUkxfREFUQV9XSURUSCAtIDEKfSB0eXBlX3NjcjFfc2N1X3N5c2N0cmxfZHJfYml0c19lOwoKdHlwZWRlZiBzdHJ1Y3QgcGFja2VkIHsKICAgIGxvZ2ljIFsxOjBdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJzcnY7CiAgICBsb2dpYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JlX3Jlc2V0OwogICAgbG9naWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzX3Jlc2V0Owp9IHR5cGVfc2NyMV9zY3Vfc3lzY3RybF9jb250cm9sX3JlZ19zOwoKdHlwZWRlZiBzdHJ1Y3QgcGFja2VkIHsKICAgIGxvZ2ljIFsxOjBdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJzcnY7CiAgICBsb2dpYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZHVfcnN0X2JodjsKICAgIGxvZ2ljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRtX3JzdF9iaHY7Cn0gdHlwZV9zY3IxX3NjdV9zeXNjdHJsX21vZGVfcmVnX3M7Cgpsb2NhbHBhcmFtIGJpdCBbMzE6MF0gICAgU0NSMV9TQ1VfU1lTQ1RSTF9TVEFUVVNfUkVHX1dJRFRIICAgICAgICA9IDQ7IC8vIGNwLjMKdHlwZWRlZiBzdHJ1Y3QgcGFja2VkIHsKICAgIGxvZ2ljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhkdV9yZXNldDsKICAgIGxvZ2ljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRtX3Jlc2V0OwogICAgbG9naWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29yZV9yZXNldDsKICAgIGxvZ2ljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5c19yZXNldDsKfSB0eXBlX3NjcjFfc2N1X3N5c2N0cmxfc3RhdHVzX3JlZ19zOwoKYGVuZGlmIC8vIFNDUjFfREJHX0VOCmBlbmRpZiAvLyBTQ1IxX0lOQ0xVREVfU0NVX0RFRlMK