IyEgL2Jpbi9zaAouICIke3NyY2Rpcj0ufS9pbml0LnNoIjsgcGF0aF9wcmVwZW5kXyAuIC4uL3NyYwoKIyBUZXN0IG9mIGdldHRleHQgZmFjaWxpdGllcyBpbiB0aGUgUGVybCBsYW5ndWFnZSwKIyB1c2luZyBwcmludGYgZm9ybWF0IHN0cmluZ3MuCiMgQXNzdW1lcyBhbiBmcl9GUiBsb2NhbGUgaXMgaW5zdGFsbGVkLgojIEFzc3VtZXMgdGhlIGZvbGxvd2luZyBwYWNrYWdlcyBhcmUgaW5zdGFsbGVkOiBwZXJsLgoKY2F0IDw8XEVPRiA+IHByb2dyYW0xLnBsCnVzZSBzdHJpY3Q7Cgp1c2UgTG9jYWxlOjpNZXNzYWdlcyBxdyAodGV4dGRvbWFpbiBiaW5kdGV4dGRvbWFpbiBnZXR0ZXh0IG5nZXR0ZXh0KTsKdGV4dGRvbWFpbiAicHJvZyI7CmJpbmR0ZXh0ZG9tYWluICJwcm9nIiwgIi4vIjsKbXkgJG4gPSAyOwpwcmludCBnZXR0ZXh0ICInWW91ciBjb21tYW5kLCBwbGVhc2U/JywgYXNrZWQgdGhlIHdhaXRlci4iOwpwcmludCAiXG4iOwpwcmludGYgbmdldHRleHQgKCJhIHBpZWNlIG9mIGNha2UiLCAiJWQgcGllY2VzIG9mIGNha2UiLCAkbiksICRuOwpwcmludCAiXG4iOwpwcmludGYgZ2V0dGV4dCAiJXMgaXMgcmVwbGFjZWQgYnkgJXMuIiwgIkZGIiwgIkVVUiI7CnByaW50ICJcbiI7CkVPRgoKOiAke1hHRVRURVhUPXhnZXR0ZXh0fQoke1hHRVRURVhUfSBcCiAgLWtfXyAtLWZsYWc9X186MTpwYXNzLXBlcmwtZm9ybWF0IC0tZmxhZz1fXzoxOnBhc3MtcGVybC1icmFjZS1mb3JtYXQgXAogIC1vIHByb2cudG1wIC0tb21pdC1oZWFkZXIgLS1uby1sb2NhdGlvbiBwcm9ncmFtMS5wbCB8fCBFeGl0IDEKTENfQUxMPUMgdHIgLWQgJ1xyJyA8IHByb2cudG1wID4gcHJvZy5wb3QgfHwgRXhpdCAxCgpjYXQgPDxFT0YgPiBwcm9nLm9rCm1zZ2lkICInWW91ciBjb21tYW5kLCBwbGVhc2U/JywgYXNrZWQgdGhlIHdhaXRlci4iCm1zZ3N0ciAiIgoKIywgcGVybC1mb3JtYXQKbXNnaWQgImEgcGllY2Ugb2YgY2FrZSIKbXNnaWRfcGx1cmFsICIlZCBwaWVjZXMgb2YgY2FrZSIKbXNnc3RyWzBdICIiCm1zZ3N0clsxXSAiIgoKIywgcGVybC1mb3JtYXQKbXNnaWQgIiVzIGlzIHJlcGxhY2VkIGJ5ICVzLiIKbXNnc3RyICIiCkVPRgoKOiAke0RJRkY9ZGlmZn0KJHtESUZGfSBwcm9nLm9rIHByb2cucG90IHx8IEV4aXQgMQoKY2F0IDw8XEVPRiA+IGZyLnBvCm1zZ2lkICIiCm1zZ3N0ciAiIgoiQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PUlTTy04ODU5LTFcbiIKIlBsdXJhbC1Gb3JtczogbnBsdXJhbHM9MjsgcGx1cmFsPShuID4gMSk7XG4iCgptc2dpZCAiJ1lvdXIgY29tbWFuZCwgcGxlYXNlPycsIGFza2VkIHRoZSB3YWl0ZXIuIgptc2dzdHIgIqtWb3RyZSBjb21tYW5kZSwgcydpbCB2b3VzIHBsYWl0uywgZGl0IGxlIGdhcudvbi4iCgojIExlcyBnYXRlYXV4IGFsbGVtYW5kcyBzb250IGxlcyBtZWlsbGV1cnMgZHUgbW9uZGUuCiMsIHBlcmwtZm9ybWF0Cm1zZ2lkICJhIHBpZWNlIG9mIGNha2UiCm1zZ2lkX3BsdXJhbCAiJWQgcGllY2VzIG9mIGNha2UiCm1zZ3N0clswXSAidW4gbW9yY2VhdSBkZSBnYXRlYXUiCm1zZ3N0clsxXSAiJWQgbW9yY2VhdXggZGUgZ2F0ZWF1IgoKIyBSZXZlcnNlIHRoZSBhcmd1bWVudHMuCiMsIHBlcmwtZm9ybWF0Cm1zZ2lkICIlcyBpcyByZXBsYWNlZCBieSAlcy4iCm1zZ3N0ciAiJTIkcyByZW1wbGFjZSAlMSRzLiIKRU9GCgo6ICR7TVNHTUVSR0U9bXNnbWVyZ2V9CiR7TVNHTUVSR0V9IC1xIC1vIGZyLnBvLnRtcCBmci5wbyBwcm9nLnBvdCB8fCBFeGl0IDEKTENfQUxMPUMgdHIgLWQgJ1xyJyA8IGZyLnBvLnRtcCA+IGZyLnBvLm5ldyB8fCBFeGl0IDEKCjogJHtESUZGPWRpZmZ9CiR7RElGRn0gZnIucG8gZnIucG8ubmV3IHx8IEV4aXQgMQoKdGVzdCAtZCBmciB8fCBta2RpciBmcgp0ZXN0IC1kIGZyL0xDX01FU1NBR0VTIHx8IG1rZGlyIGZyL0xDX01FU1NBR0VTCgo6ICR7TVNHRk1UPW1zZ2ZtdH0KJHtNU0dGTVR9IC1vIGZyL0xDX01FU1NBR0VTL3Byb2cubW8gZnIucG8KCjogJHtESUZGPWRpZmZ9CmNhdCA8PFxFT0YgPiBwcm9nLm9rCqtWb3RyZSBjb21tYW5kZSwgcydpbCB2b3VzIHBsYWl0uywgZGl0IGxlIGdhcudvbi4KMiBtb3JjZWF1eCBkZSBnYXRlYXUKRVVSIHJlbXBsYWNlIEZGLgpFT0YKY2F0IDw8XEVPRiA+IHByb2cub2t1CsKrVm90cmUgY29tbWFuZGUsIHMnaWwgdm91cyBwbGFpdMK7LCBkaXQgbGUgZ2Fyw6dvbi4KMiBtb3JjZWF1eCBkZSBnYXRlYXUKRVVSIHJlbXBsYWNlIEZGLgpFT0YKCiMgVGVzdCBmb3IgcGVybCB3aXRoIExvY2FsZTo6TWVzc2FnZXMgcGFja2FnZS4KcGVybCAtZSAndXNlIExvY2FsZTo6TWVzc2FnZXM7JyAyPi9kZXYvbnVsbCBcCiAgfHwgeyBlY2hvICJTa2lwcGluZyB0ZXN0OiBwZXJsIHBhY2thZ2UgTG9jYWxlOjpNZXNzYWdlcyBpcyBub3QgaW5zdGFsbGVkIgogICAgICAgRXhpdCA3NwogICAgIH0KCjogJHtMT0NBTEVfRlI9ZnJfRlJ9CjogJHtMT0NBTEVfRlJfVVRGOD1mcl9GUi5VVEYtOH0KaWYgdGVzdCAkTE9DQUxFX0ZSICE9IG5vbmU7IHRoZW4KICBwcmVwYXJlX2xvY2FsZV8gZnIgJExPQ0FMRV9GUgogIExBTkdVQUdFPSBMQU5HPSRMT0NBTEVfRlIgTENfTUVTU0FHRVM9IExDX0NUWVBFPSBMQ19BTEw9IHBlcmwgcHJvZ3JhbTEucGwgPiBwcm9nLm91dCB8fCBFeGl0IDEKICAke0RJRkZ9IHByb2cub2sgcHJvZy5vdXQgfHwgRXhpdCAxCmZpCmlmIHRlc3QgJExPQ0FMRV9GUl9VVEY4ICE9IG5vbmU7IHRoZW4KICBwcmVwYXJlX2xvY2FsZV8gZnIgJExPQ0FMRV9GUl9VVEY4CiAgTEFOR1VBR0U9IExBTkc9JExPQ0FMRV9GUl9VVEY4IExDX01FU1NBR0VTPSBMQ19DVFlQRT0gTENfQUxMPSBwZXJsIHByb2dyYW0xLnBsID4gcHJvZy5vdXQgfHwgRXhpdCAxCiAgJHtESUZGfSBwcm9nLm9rdSBwcm9nLm91dCB8fCBFeGl0IDEKZmkKaWYgdGVzdCAkTE9DQUxFX0ZSID0gbm9uZSAmJiB0ZXN0ICRMT0NBTEVfRlJfVVRGOCA9IG5vbmU7IHRoZW4KICBpZiB0ZXN0IC1mIC91c3IvYmluL2xvY2FsZWRlZjsgdGhlbgogICAgZWNobyAiU2tpcHBpbmcgdGVzdDogbm8gZnJlbmNoIGxvY2FsZSBpcyBpbnN0YWxsZWQiCiAgZWxzZQogICAgZWNobyAiU2tpcHBpbmcgdGVzdDogbm8gZnJlbmNoIGxvY2FsZSBpcyBzdXBwb3J0ZWQiCiAgZmkKICBFeGl0IDc3CmZpCgpFeGl0IDAK