Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwovLy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy8vCi8vLy8gIHlpZml2ZSBXaXNoYm9uZSBpbnRlcmZhY2UgZm9yIEluc3RydWN0aW9uIG1lbW9yeSAgICAgICAgICAgIC8vLy8KLy8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vLwovLy8vICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgeWlmaXZlIGNvcmVzIHByb2plY3QgICAgICAgICAgICAgICAvLy8vCi8vLy8gIGh0dHA6Ly93d3cub3BlbmNvcmVzLm9yZy9jb3Jlcy95aWZpdmUvICAgICAgICAgICAgICAgICAgICAgIC8vLy8KLy8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vLwovLy8vICBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy8vCi8vLy8gICAgIGludGVncmF0ZWQgd2lzaGJvbmUgaS9mIHRvIGluc3RydWN0aW9uIG1lbW9yeSAgICAgICAgICAgIC8vLy8KLy8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vLwovLy8vICBUbyBEbzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy8vCi8vLy8gICAgbm90aGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLy8KLy8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vLwovLy8vICBBdXRob3Iocyk6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy8vCi8vLy8gICAgICAtIERpbmVzaCBBbm5heXlhLCBkaW5lc2hhQG9wZW5jb3Jlcy5vcmcgICAgICAgICAgICAgICAgIC8vLy8KLy8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vLwovLy8vICBSZXZpc2lvbiA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy8vCi8vLy8gICAgIHYwOiAgICBKdW5lIDcsIDIwMjEsIERpbmVzaCBBICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLy8KLy8vLyAgICAgICAgICAgICB3aXNoYm9uZSBpbnRlZ3JhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vLwovLy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy8vCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLy8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vLwovLy8vIENvcHlyaWdodCAoQykgMjAwMCBBdXRob3JzIGFuZCBPUEVOQ09SRVMuT1JHICAgICAgICAgICAgICAgICAvLy8vCi8vLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLy8KLy8vLyBUaGlzIHNvdXJjZSBmaWxlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCB3aXRob3V0ICAgICAgICAgLy8vLwovLy8vIHJlc3RyaWN0aW9uIHByb3ZpZGVkIHRoYXQgdGhpcyBjb3B5cmlnaHQgc3RhdGVtZW50IGlzIG5vdCAgICAvLy8vCi8vLy8gcmVtb3ZlZCBmcm9tIHRoZSBmaWxlIGFuZCB0aGF0IGFueSBkZXJpdmF0aXZlIHdvcmsgY29udGFpbnMgIC8vLy8KLy8vLyB0aGUgb3JpZ2luYWwgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhlIGFzc29jaWF0ZWQgZGlzY2xhaW1lci4gLy8vLwovLy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy8vCi8vLy8gVGhpcyBzb3VyY2UgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCAgIC8vLy8KLy8vLyBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsICAgLy8vLwovLy8vIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAvLy8vCi8vLy8gZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSAgIC8vLy8KLy8vLyBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vLwovLy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy8vCi8vLy8gVGhpcyBzb3VyY2UgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlICAgICAgIC8vLy8KLy8vLyB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkICAgLy8vLwovLy8vIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgICAgICAvLy8vCi8vLy8gUFVSUE9TRS4gIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIC8vLy8KLy8vLyBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vLwovLy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy8vCi8vLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsICAgIC8vLy8KLy8vLyBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgc291cmNlOyBpZiBub3QsIGRvd25sb2FkIGl0ICAgLy8vLwovLy8vIGZyb20gaHR0cDovL3d3dy5vcGVuY29yZXMub3JnL2xncGwuc2h0bWwgICAgICAgICAgICAgICAgICAgICAvLy8vCi8vLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLy8KLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwovLyAgICAgT3JnaW5hbCBvd25lciBEZXRhaWxzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy8vCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLy8vIENvcHlyaWdodCBieSBTeW50YWNvcmUgTExDIKkgMjAxNi0yMDIxLiBTZWUgTElDRU5TRSBmb3IgZGV0YWlscy8vLwovLy8gQGZpbGUgICAgICAgPHNjcjFfaW1lbV93Yi5zdj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vCi8vLyBAYnJpZWYgICAgICBJbnN0cnVjdGlvbiBtZW1vcnkgQUhCIGJyaWRnZSAgICAgICAgICAgICAgICAgICAgICAvLy8KLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKYGluY2x1ZGUgInNjcjFfd2Iuc3ZoIgpgaW5jbHVkZSAic2NyMV9tZW1pZi5zdmgiCgptb2R1bGUgc2NyMV9pbWVtX3diICgKICAgIC8vIENvbnRyb2wgU2lnbmFscwogICAgaW5wdXQgICBsb2dpYyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJzdF9uLAogICAgaW5wdXQgICBsb2dpYyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaywKCiAgICAvLyBDb3JlIEludGVyZmFjZQogICAgb3V0cHV0ICBsb2dpYyAgICAgICAgICAgICAgICAgICAgICAgICAgIGltZW1fcmVxX2FjaywKICAgIGlucHV0ICAgbG9naWMgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWVtX3JlcSwKICAgIGlucHV0ICAgbG9naWMgICBbU0NSMV9XQl9XSURUSC0xOjBdICAgICBpbWVtX2FkZHIsCiAgICBvdXRwdXQgIGxvZ2ljICAgW1NDUjFfV0JfV0lEVEgtMTowXSAgICAgaW1lbV9yZGF0YSwKICAgIG91dHB1dCAgdHlwZV9zY3IxX21lbV9yZXNwX2UgICAgICAgICAgICBpbWVtX3Jlc3AsCgogICAgLy8gV0IgSW50ZXJmYWNlCiAgICBvdXRwdXQgIGxvZ2ljICAgICAgICAgICAgICAgICAgICAgICAgICAgd2JkX3N0Yl9vLCAvLyBzdHJvYmUvcmVxdWVzdAogICAgb3V0cHV0ICBsb2dpYyAgIFtTQ1IxX1dCX1dJRFRILTE6MF0gICAgIHdiZF9hZHJfbywgLy8gYWRkcmVzcwogICAgb3V0cHV0ICBsb2dpYyAgICAgICAgICAgICAgICAgICAgICAgICAgIHdiZF93ZV9vLCAgLy8gd3JpdGUKICAgIG91dHB1dCAgbG9naWMgICBbU0NSMV9XQl9XSURUSC0xOjBdICAgICB3YmRfZGF0X28sIC8vIGRhdGEgb3V0cHV0CiAgICBvdXRwdXQgIGxvZ2ljICAgWzM6MF0gICAgICAgICAgICAgICAgICAgd2JkX3NlbF9vLCAvLyBieXRlIGVuYWJsZQogICAgaW5wdXQgICBsb2dpYyAgIFtTQ1IxX1dCX1dJRFRILTE6MF0gICAgIHdiZF9kYXRfaSwgLy8gZGF0YSBpbnB1dAogICAgaW5wdXQgICBsb2dpYyAgICAgICAgICAgICAgICAgICAgICAgICAgIHdiZF9hY2tfaSwgLy8gYWNrbm93bGVnZW1lbnQKICAgIGlucHV0ICAgbG9naWMgICAgICAgICAgICAgICAgICAgICAgICAgICB3YmRfZXJyX2kgIC8vIGVycm9yCgopOwoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIExvY2FsIHBhcmFtZXRlcnMgZGVjbGFyYXRpb24KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmBpZm5kZWYgU0NSMV9JTUVNX1dCX09VVF9CUApsb2NhbHBhcmFtICBTQ1IxX0ZJRk9fV0lEVEggPSAyOwpsb2NhbHBhcmFtICBTQ1IxX0ZJRk9fQ05UX1dJRFRIID0gJGNsb2cyKFNDUjFfRklGT19XSURUSCsxKTsKYGVuZGlmIC8vIFNDUjFfSU1FTV9XQl9PVVRfQlAKCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBMb2NhbCB0eXBlcyBkZWNsYXJhdGlvbgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KdHlwZWRlZiBlbnVtIGxvZ2ljIHsKICAgIFNDUjFfRlNNX0FERFIgPSAxJ2IwLAogICAgU0NSMV9GU01fREFUQSA9IDEnYjEsCiAgICBTQ1IxX0ZTTV9FUlIgID0gMSdieAp9IHR5cGVfc2NyMV9mc21fZTsKCnR5cGVkZWYgc3RydWN0IHBhY2tlZCB7CiAgICBsb2dpYyAgIFtTQ1IxX1dCX1dJRFRILTE6MF0gICAgaGFkZHI7Cn0gdHlwZV9zY3IxX3JlcV9maWZvX3M7Cgp0eXBlZGVmIHN0cnVjdCBwYWNrZWQgewogICAgbG9naWMgICAgICAgICAgICAgICAgICAgICAgICAgICBocmVzcDsKICAgIGxvZ2ljICAgW1NDUjFfV0JfV0lEVEgtMTowXSAgICBocmRhdGE7Cn0gdHlwZV9zY3IxX3Jlc3BfZmlmb19zOwoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIExvY2FsIHNpZ25hbCBkZWNsYXJhdGlvbgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KdHlwZV9zY3IxX2ZzbV9lICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmc207CmxvZ2ljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxX2ZpZm9fcmQ7CmxvZ2ljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxX2ZpZm9fd3I7CmxvZ2ljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxX2ZpZm9fdXA7CmBpZmRlZiBTQ1IxX0lNRU1fV0JfT1VUX0JQCnR5cGVfc2NyMV9yZXFfZmlmb19zICAgICAgICAgICAgICAgICAgICAgICAgcmVxX2ZpZm9fcjsKdHlwZV9zY3IxX3JlcV9maWZvX3MgWzA6MF0gICAgICAgICAgICAgICAgICByZXFfZmlmbzsKYGVsc2UgLy8gU0NSMV9JTUVNX1dCX09VVF9CUApsb2dpYyBbU0NSMV9XQl9XSURUSC0xOjBdICAgICAgICAgICAgICAgICAgIHJlcV9maWZvX2RvdXQ7CmBlbmRpZiAvLyBTQ1IxX0lNRU1fV0JfT1VUX0JQCgpsb2dpYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcV9maWZvX2VtcHR5Owpsb2dpYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcV9maWZvX2Z1bGw7Cgp0eXBlX3NjcjFfcmVzcF9maWZvX3MgICAgICAgICAgICAgICAgICAgICAgIHJlc3BfZmlmbzsKbG9naWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwX2ZpZm9faHJlYWR5OwoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIEludGVyZmFjZSB0byBDb3JlCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQphc3NpZ24gaW1lbV9yZXFfYWNrID0gfnJlcV9maWZvX2Z1bGw7CmFzc2lnbiByZXFfZmlmb193ciAgPSB+cmVxX2ZpZm9fZnVsbCAmIGltZW1fcmVxOwoKYXNzaWduIGltZW1fcmRhdGEgPSByZXNwX2ZpZm8uaHJkYXRhOwoKYXNzaWduIGltZW1fcmVzcCA9IChyZXNwX2ZpZm9faHJlYWR5KQogICAgICAgICAgICAgICAgICAgID8gKHJlc3BfZmlmby5ocmVzcCA9PSAxJ2IxKQogICAgICAgICAgICAgICAgICAgICAgICA/IFNDUjFfTUVNX1JFU1BfUkRZX09LCiAgICAgICAgICAgICAgICAgICAgICAgIDogU0NSMV9NRU1fUkVTUF9SRFlfRVIKICAgICAgICAgICAgICAgICAgICA6IFNDUjFfTUVNX1JFU1BfTk9UUkRZOwoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIFJFUV9GSUZPCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpgaWZkZWYgU0NSMV9JTUVNX1dCX09VVF9CUAphbHdheXNfZmYgQChuZWdlZGdlIHJzdF9uLCBwb3NlZGdlIGNsaykgYmVnaW4KICAgIGlmICh+cnN0X24pIGJlZ2luCiAgICAgICAgcmVxX2ZpZm9fZnVsbCA8PSAxJ2IwOwogICAgZW5kIGVsc2UgYmVnaW4KICAgICAgICBpZiAofnJlcV9maWZvX2Z1bGwpIGJlZ2luCiAgICAgICAgICAgIHJlcV9maWZvX2Z1bGwgPD0gaW1lbV9yZXEgJiB+cmVxX2ZpZm9fcmQ7CiAgICAgICAgZW5kIGVsc2UgYmVnaW4KICAgICAgICAgICAgcmVxX2ZpZm9fZnVsbCA8PSB+cmVxX2ZpZm9fcmQ7CiAgICAgICAgZW5kCiAgICBlbmQKZW5kCmFzc2lnbiByZXFfZmlmb19lbXB0eSA9IH4ocmVxX2ZpZm9fZnVsbCB8IGltZW1fcmVxKTsKCmFzc2lnbiByZXFfZmlmb191cCAgICA9IH5yZXFfZmlmb19yZCAmIHJlcV9maWZvX3dyOwphbHdheXNfZmYgQChwb3NlZGdlIGNsaykgYmVnaW4KICAgIGlmIChyZXFfZmlmb191cCkgYmVnaW4KICAgICAgICByZXFfZmlmb19yLmhhZGRyIDw9IGltZW1fYWRkcjsKICAgIGVuZAplbmQKCmFzc2lnbiByZXFfZmlmb1swXSA9IChyZXFfZmlmb19mdWxsKSA/IHJlcV9maWZvX3IgOiBpbWVtX2FkZHI7CgpgZWxzZSAvLyBTQ1IxX0lNRU1fV0JfT1VUX0JQCgoKIHN5bmNfZmlmbyAjKAogICAgICAuREFUQV9XSURUSChTQ1IxX1dCX1dJRFRIKSwgLy8gRGF0YSBXaWR0aAogICAgICAuQUREUl9XSURUSCgxKSwgICAvLyBBZGRyZXNzIFdpZHRoCiAgICAgIC5GSUZPX0RFUFRIKDIpICAgIC8vIEZJRk8gREVQVEgKICAgICApICAgdV9yZXFfZmlmbygKCiAgICAgICAuZG91dCAgICAgIChyZXFfZmlmb19kb3V0ICApLAoKICAgICAgIC5yc3RuICAgICAgKHJzdF9uICAgICAgICAgICksCiAgICAgICAuY2xrICAgICAgIChjbGsgICAgICAgICAgICApLAogICAgICAgLndyX2VuICAgICAocmVxX2ZpZm9fd3IgICAgKSwgLy8gV3JpdGUKICAgICAgIC5yZF9lbiAgICAgKHJlcV9maWZvX3JkICAgICksIC8vIFJlYWQKICAgICAgIC5kaW4gICAgICAgKGltZW1fYWRkciAgICAgICksCiAgICAgICAuZnVsbCAgICAgIChyZXFfZmlmb19mdWxsICApLAogICAgICAgLmVtcHR5ICAgICAocmVxX2ZpZm9fZW1wdHkgKQopOwoKCgoKYGVuZGlmIC8vIFNDUjFfSU1FTV9XQl9PVVRfQlAKCgphbHdheXNfY29tYiBiZWdpbgogICAgcmVxX2ZpZm9fcmQgPSAxJ2IwOwogICAgaWYgKHdiZF9hY2tfaSkgYmVnaW4KICAgICAgICAgcmVxX2ZpZm9fcmQgPSB+cmVxX2ZpZm9fZW1wdHk7CiAgICBlbmQKZW5kCgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gRklGTyByZXNwb25zZQovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KYGlmZGVmIFNDUjFfSU1FTV9XQl9JTl9CUAphc3NpZ24gcmVzcF9maWZvX2hyZWFkeSA9IHdiZF9hY2tfaTsKYXNzaWduIHJlc3BfZmlmby5ocmVzcCAgPSAod2JkX2Vycl9pKSA/IDEnYjAgOiAxJ2IxOwphc3NpZ24gcmVzcF9maWZvLmhyZGF0YSA9IHdiZF9kYXRfaTsKYXNzaWduIHdiZF9zdGJfbyAgICAgICAgPSB+cmVxX2ZpZm9fZW1wdHk7CmFzc2lnbiB3YmRfYWRyX28gICAgICAgID0gcmVxX2ZpZm9bMF07CmFzc2lnbiB3YmRfd2VfbyAgICAgICAgID0gMDsgLy8gT25seSBSZWFkIHN1cHBvcnRlZAphc3NpZ24gd2JkX2RhdF9vICAgICAgICA9IDMyJ2gwOyAvLyBObyBXcml0ZQphc3NpZ24gd2JkX3NlbF9vICAgICAgICA9IDQnYjExMTE7IC8vIE9ubHkgUmVhZCBhbGxvd2VkIGluIGltZW0gaS9mCgoKYGVsc2UgLy8gU0NSMV9JTUVNX1dCX0lOX0JQCmFsd2F5c19mZiBAKG5lZ2VkZ2UgcnN0X24sIHBvc2VkZ2UgY2xrKSBiZWdpbgogICAgaWYgKH5yc3RfbikgYmVnaW4KICAgICAgICByZXNwX2ZpZm9faHJlYWR5IDw9IDEnYjA7CiAgICBlbmQgZWxzZSBiZWdpbgogICAgICAgIHJlc3BfZmlmb19ocmVhZHkgPD0gd2JkX2Fja19pIDsKICAgIGVuZAplbmQKCmFsd2F5c19mZiBAKHBvc2VkZ2UgY2xrKSBiZWdpbgogICAgaWYgKHdiZF9hY2tfaSkgYmVnaW4KICAgICAgICByZXNwX2ZpZm8uaHJlc3AgIDw9ICh3YmRfZXJyX2kpID8gMSdiMCA6IDEnYjE7CiAgICAgICAgcmVzcF9maWZvLmhyZGF0YSA8PSB3YmRfZGF0X2k7CiAgICBlbmQKZW5kCgphc3NpZ24gd2JkX3N0Yl9vICAgID0gfnJlcV9maWZvX2VtcHR5Owphc3NpZ24gd2JkX2Fkcl9vICAgID0gcmVxX2ZpZm9fZG91dDsKYXNzaWduIHdiZF93ZV9vICAgICA9IDA7IC8vIE9ubHkgUmVhZCBzdXBwb3J0ZWQKYXNzaWduIHdiZF9kYXRfbyAgICA9IDMyJ2gwOyAvLyBObyBXcml0ZQphc3NpZ24gd2JkX3NlbF9vICAgID0gNCdiMTExMTsgLy8gT25seSBSZWFkIGFsbG93ZWQgaW4gaW1lbSBpL2YKYGVuZGlmIC8vIFNDUjFfSU1FTV9XQl9JTl9CUAoKCgpgaWZkZWYgU0NSMV9UUkdUX1NJTVVMQVRJT04KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIEFzc2VydGlvbgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCi8vIENoZWNrIENvcmUgaW50ZXJmYWNlClNDUjFfU1ZBX0lNRU1fV0JfQlJJREdFX1JFUV9YQ0hFQ0sgOiBhc3NlcnQgcHJvcGVydHkgKAogICAgQChuZWdlZGdlIGNsaykgZGlzYWJsZSBpZmYgKH5yc3RfbikKICAgICEkaXN1bmtub3duKGltZW1fcmVxKQogICAgKSBlbHNlICRlcnJvcigiSU1FTSBXQiBicmlkZ2UgRXJyb3I6IGltZW1fcmVxIGhhcyB1bmtub3duIHZhbHVlcyIpOwoKU0NSMV9JTUVNX1dCX0JSSURHRV9BRERSX1hDSEVDSyA6IGFzc2VydCBwcm9wZXJ0eSAoCiAgICBAKG5lZ2VkZ2UgY2xrKSBkaXNhYmxlIGlmZiAofnJzdF9uKQogICAgaW1lbV9yZXEgfC0+ICEkaXN1bmtub3duKGltZW1fYWRkcikKICAgICkgZWxzZSAkZXJyb3IoIklNRU0gV0IgYnJpZGdlIEVycm9yOiBpbWVtX2FkZHIgaGFzIHVua25vd24gdmFsdWVzIik7CgpTQ1IxX0lNRU1fV0JfQlJJREdFX0FERFJfQUxMSUdOIDogYXNzZXJ0IHByb3BlcnR5ICgKICAgIEAobmVnZWRnZSBjbGspIGRpc2FibGUgaWZmICh+cnN0X24pCiAgICBpbWVtX3JlcSB8LT4gKGltZW1fYWRkclsxOjBdID09ICcwKQogICAgKSBlbHNlICRlcnJvcigiSU1FTSBXQiBicmlkZ2UgRXJyb3I6IGltZW1fYWRkciBoYXMgdW5hbGlnbiB2YWx1ZXMiKTsKCi8vIENoZWNrIFdCIGludGVyZmFjZQpTQ1IxX0lNRU1fV0JfQlJJREdFX0hSRUFEWV9YQ0hFQ0sgOiBhc3NlcnQgcHJvcGVydHkgKAogICAgQChuZWdlZGdlIGNsaykgZGlzYWJsZSBpZmYgKH5yc3RfbikKICAgICEkaXN1bmtub3duKGhyZWFkeSkKICAgICkgZWxzZSAkZXJyb3IoIklNRU0gV0IgYnJpZGdlIEVycm9yOiBocmVhZHkgaGFzIHVua25vd24gdmFsdWVzIik7CgpTQ1IxX0lNRU1fV0JfQlJJREdFX0hSRVNQX1hDSEVDSyA6IGFzc2VydCBwcm9wZXJ0eSAoCiAgICBAKG5lZ2VkZ2UgY2xrKSBkaXNhYmxlIGlmZiAofnJzdF9uKQogICAgISRpc3Vua25vd24oaHJlc3ApCiAgICApIGVsc2UgJGVycm9yKCJJTUVNIFdCIGJyaWRnZSBFcnJvcjogaHJlc3AgaGFzIHVua25vd24gdmFsdWVzIik7CgpgZW5kaWYgLy8gU0NSMV9UUkdUX1NJTVVMQVRJT04KCmVuZG1vZHVsZSA6IHNjcjFfaW1lbV93Ygo=