Iy0qLSBjb2Rpbmc6IElTTy04ODU5LTEgLSotCiMgcHlzcWxpdGUyL3Rlc3QvaG9va3MucHk6IHRlc3RzIGZvciB2YXJpb3VzIFNRTGl0ZS1zcGVjaWZpYyBob29rcwojCiMgQ29weXJpZ2h0IChDKSAyMDA2LTIwMDcgR2VyaGFyZCBI5HJpbmcgPGdoQGdoYWVyaW5nLmRlPgojCiMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgcHlzcWxpdGUuCiMKIyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAojIHdhcnJhbnR5LiAgSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMKIyBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgojCiMgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCiMgaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdAojIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKIwojIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90CiMgICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUKIyAgICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmUKIyAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgojIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlCiMgICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgojIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCgppbXBvcnQgdW5pdHRlc3QKaW1wb3J0IHNxbGl0ZTMgYXMgc3FsaXRlCgpjbGFzcyBDb2xsYXRpb25UZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICBkZWYgc2V0VXAoc2VsZik6CiAgICAgICAgcGFzcwoKICAgIGRlZiB0ZWFyRG93bihzZWxmKToKICAgICAgICBwYXNzCgogICAgZGVmIENoZWNrQ3JlYXRlQ29sbGF0aW9uTm90Q2FsbGFibGUoc2VsZik6CiAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKICAgICAgICB0cnk6CiAgICAgICAgICAgIGNvbi5jcmVhdGVfY29sbGF0aW9uKCJYIiwgNDIpCiAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgcmFpc2VkIGEgVHlwZUVycm9yIikKICAgICAgICBleGNlcHQgVHlwZUVycm9yIGFzIGU6CiAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZS5hcmdzWzBdLCAicGFyYW1ldGVyIG11c3QgYmUgY2FsbGFibGUiKQoKICAgIGRlZiBDaGVja0NyZWF0ZUNvbGxhdGlvbk5vdEFzY2lpKHNlbGYpOgogICAgICAgIGNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBjb24uY3JlYXRlX2NvbGxhdGlvbigiY29sbOQiLCBsYW1iZGEgeCwgeTogKHggPiB5KSAtICh4IDwgeSkpCiAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgcmFpc2VkIGEgUHJvZ3JhbW1pbmdFcnJvciIpCiAgICAgICAgZXhjZXB0IHNxbGl0ZS5Qcm9ncmFtbWluZ0Vycm9yIGFzIGU6CiAgICAgICAgICAgIHBhc3MKCiAgICBkZWYgQ2hlY2tDb2xsYXRpb25Jc1VzZWQoc2VsZik6CiAgICAgICAgaWYgc3FsaXRlLnZlcnNpb25faW5mbyA8ICgzLCAyLCAxKTogICMgb2xkIFNRTGl0ZSB2ZXJzaW9ucyBjcmFzaCBvbiB0aGlzIHRlc3QKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgZGVmIG15Y29sbCh4LCB5KToKICAgICAgICAgICAgIyByZXZlcnNlIG9yZGVyCiAgICAgICAgICAgIHJldHVybiAtKCh4ID4geSkgLSAoeCA8IHkpKQoKICAgICAgICBjb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQogICAgICAgIGNvbi5jcmVhdGVfY29sbGF0aW9uKCJteWNvbGwiLCBteWNvbGwpCiAgICAgICAgc3FsID0gIiIiCiAgICAgICAgICAgIHNlbGVjdCB4IGZyb20gKAogICAgICAgICAgICBzZWxlY3QgJ2EnIGFzIHgKICAgICAgICAgICAgdW5pb24KICAgICAgICAgICAgc2VsZWN0ICdiJyBhcyB4CiAgICAgICAgICAgIHVuaW9uCiAgICAgICAgICAgIHNlbGVjdCAnYycgYXMgeAogICAgICAgICAgICApIG9yZGVyIGJ5IHggY29sbGF0ZSBteWNvbGwKICAgICAgICAgICAgIiIiCiAgICAgICAgcmVzdWx0ID0gY29uLmV4ZWN1dGUoc3FsKS5mZXRjaGFsbCgpCiAgICAgICAgaWYgcmVzdWx0WzBdWzBdICE9ICJjIiBvciByZXN1bHRbMV1bMF0gIT0gImIiIG9yIHJlc3VsdFsyXVswXSAhPSAiYSI6CiAgICAgICAgICAgIHNlbGYuZmFpbCgidGhlIGV4cGVjdGVkIG9yZGVyIHdhcyBub3QgcmV0dXJuZWQiKQoKICAgICAgICBjb24uY3JlYXRlX2NvbGxhdGlvbigibXljb2xsIiwgTm9uZSkKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJlc3VsdCA9IGNvbi5leGVjdXRlKHNxbCkuZmV0Y2hhbGwoKQogICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHJhaXNlZCBhbiBPcGVyYXRpb25hbEVycm9yIikKICAgICAgICBleGNlcHQgc3FsaXRlLk9wZXJhdGlvbmFsRXJyb3IgYXMgZToKICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlLmFyZ3NbMF0ubG93ZXIoKSwgIm5vIHN1Y2ggY29sbGF0aW9uIHNlcXVlbmNlOiBteWNvbGwiKQoKICAgIGRlZiBDaGVja0NvbGxhdGlvblJlZ2lzdGVyVHdpY2Uoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgUmVnaXN0ZXIgdHdvIGRpZmZlcmVudCBjb2xsYXRpb24gZnVuY3Rpb25zIHVuZGVyIHRoZSBzYW1lIG5hbWUuCiAgICAgICAgVmVyaWZ5IHRoYXQgdGhlIGxhc3Qgb25lIGlzIGFjdHVhbGx5IHVzZWQuCiAgICAgICAgIiIiCiAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKICAgICAgICBjb24uY3JlYXRlX2NvbGxhdGlvbigibXljb2xsIiwgbGFtYmRhIHgsIHk6ICh4ID4geSkgLSAoeCA8IHkpKQogICAgICAgIGNvbi5jcmVhdGVfY29sbGF0aW9uKCJteWNvbGwiLCBsYW1iZGEgeCwgeTogLSgoeCA+IHkpIC0gKHggPCB5KSkpCiAgICAgICAgcmVzdWx0ID0gY29uLmV4ZWN1dGUoIiIiCiAgICAgICAgICAgIHNlbGVjdCB4IGZyb20gKHNlbGVjdCAnYScgYXMgeCB1bmlvbiBzZWxlY3QgJ2InIGFzIHgpIG9yZGVyIGJ5IHggY29sbGF0ZSBteWNvbGwKICAgICAgICAgICAgIiIiKS5mZXRjaGFsbCgpCiAgICAgICAgaWYgcmVzdWx0WzBdWzBdICE9ICdiJyBvciByZXN1bHRbMV1bMF0gIT0gJ2EnOgogICAgICAgICAgICBzZWxmLmZhaWwoIndyb25nIGNvbGxhdGlvbiBmdW5jdGlvbiBpcyB1c2VkIikKCiAgICBkZWYgQ2hlY2tEZXJlZ2lzdGVyQ29sbGF0aW9uKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFJlZ2lzdGVyIGEgY29sbGF0aW9uLCB0aGVuIGRlcmVnaXN0ZXIgaXQuIE1ha2Ugc3VyZSBhbiBlcnJvciBpcyByYWlzZWQgaWYgd2UgdHJ5CiAgICAgICAgdG8gdXNlIGl0LgogICAgICAgICIiIgogICAgICAgIGNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCiAgICAgICAgY29uLmNyZWF0ZV9jb2xsYXRpb24oIm15Y29sbCIsIGxhbWJkYSB4LCB5OiAoeCA+IHkpIC0gKHggPCB5KSkKICAgICAgICBjb24uY3JlYXRlX2NvbGxhdGlvbigibXljb2xsIiwgTm9uZSkKICAgICAgICB0cnk6CiAgICAgICAgICAgIGNvbi5leGVjdXRlKCJzZWxlY3QgJ2EnIGFzIHggdW5pb24gc2VsZWN0ICdiJyBhcyB4IG9yZGVyIGJ5IHggY29sbGF0ZSBteWNvbGwiKQogICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHJhaXNlZCBhbiBPcGVyYXRpb25hbEVycm9yIikKICAgICAgICBleGNlcHQgc3FsaXRlLk9wZXJhdGlvbmFsRXJyb3IgYXMgZToKICAgICAgICAgICAgaWYgbm90IGUuYXJnc1swXS5zdGFydHN3aXRoKCJubyBzdWNoIGNvbGxhdGlvbiBzZXF1ZW5jZSIpOgogICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJ3cm9uZyBPcGVyYXRpb25hbEVycm9yIHJhaXNlZCIpCgpjbGFzcyBQcm9ncmVzc1Rlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgIGRlZiBDaGVja1Byb2dyZXNzSGFuZGxlclVzZWQoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgVGVzdCB0aGF0IHRoZSBwcm9ncmVzcyBoYW5kbGVyIGlzIGludm9rZWQgb25jZSBpdCBpcyBzZXQuCiAgICAgICAgIiIiCiAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKICAgICAgICBwcm9ncmVzc19jYWxscyA9IFtdCiAgICAgICAgZGVmIHByb2dyZXNzKCk6CiAgICAgICAgICAgIHByb2dyZXNzX2NhbGxzLmFwcGVuZChOb25lKQogICAgICAgICAgICByZXR1cm4gMAogICAgICAgIGNvbi5zZXRfcHJvZ3Jlc3NfaGFuZGxlcihwcm9ncmVzcywgMSkKICAgICAgICBjb24uZXhlY3V0ZSgiIiIKICAgICAgICAgICAgY3JlYXRlIHRhYmxlIGZvbyhhLCBiKQogICAgICAgICAgICAiIiIpCiAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHByb2dyZXNzX2NhbGxzKQoKCiAgICBkZWYgQ2hlY2tPcGNvZGVDb3VudChzZWxmKToKICAgICAgICAiIiIKICAgICAgICBUZXN0IHRoYXQgdGhlIG9wY29kZSBhcmd1bWVudCBpcyByZXNwZWN0ZWQuCiAgICAgICAgIiIiCiAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKICAgICAgICBwcm9ncmVzc19jYWxscyA9IFtdCiAgICAgICAgZGVmIHByb2dyZXNzKCk6CiAgICAgICAgICAgIHByb2dyZXNzX2NhbGxzLmFwcGVuZChOb25lKQogICAgICAgICAgICByZXR1cm4gMAogICAgICAgIGNvbi5zZXRfcHJvZ3Jlc3NfaGFuZGxlcihwcm9ncmVzcywgMSkKICAgICAgICBjdXJzID0gY29uLmN1cnNvcigpCiAgICAgICAgY3Vycy5leGVjdXRlKCIiIgogICAgICAgICAgICBjcmVhdGUgdGFibGUgZm9vIChhLCBiKQogICAgICAgICAgICAiIiIpCiAgICAgICAgZmlyc3RfY291bnQgPSBsZW4ocHJvZ3Jlc3NfY2FsbHMpCiAgICAgICAgcHJvZ3Jlc3NfY2FsbHMgPSBbXQogICAgICAgIGNvbi5zZXRfcHJvZ3Jlc3NfaGFuZGxlcihwcm9ncmVzcywgMikKICAgICAgICBjdXJzLmV4ZWN1dGUoIiIiCiAgICAgICAgICAgIGNyZWF0ZSB0YWJsZSBiYXIgKGEsIGIpCiAgICAgICAgICAgICIiIikKICAgICAgICBzZWNvbmRfY291bnQgPSBsZW4ocHJvZ3Jlc3NfY2FsbHMpCiAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGZpcnN0X2NvdW50ID4gc2Vjb25kX2NvdW50KQoKICAgIGRlZiBDaGVja0NhbmNlbE9wZXJhdGlvbihzZWxmKToKICAgICAgICAiIiIKICAgICAgICBUZXN0IHRoYXQgcmV0dXJuaW5nIGEgbm9uLXplcm8gdmFsdWUgc3RvcHMgdGhlIG9wZXJhdGlvbiBpbiBwcm9ncmVzcy4KICAgICAgICAiIiIKICAgICAgICBjb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQogICAgICAgIHByb2dyZXNzX2NhbGxzID0gW10KICAgICAgICBkZWYgcHJvZ3Jlc3MoKToKICAgICAgICAgICAgcHJvZ3Jlc3NfY2FsbHMuYXBwZW5kKE5vbmUpCiAgICAgICAgICAgIHJldHVybiAxCiAgICAgICAgY29uLnNldF9wcm9ncmVzc19oYW5kbGVyKHByb2dyZXNzLCAxKQogICAgICAgIGN1cnMgPSBjb24uY3Vyc29yKCkKICAgICAgICBzZWxmLmFzc2VydFJhaXNlcygKICAgICAgICAgICAgc3FsaXRlLk9wZXJhdGlvbmFsRXJyb3IsCiAgICAgICAgICAgIGN1cnMuZXhlY3V0ZSwKICAgICAgICAgICAgImNyZWF0ZSB0YWJsZSBiYXIgKGEsIGIpIikKCiAgICBkZWYgQ2hlY2tDbGVhckhhbmRsZXIoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgVGVzdCB0aGF0IHNldHRpbmcgdGhlIHByb2dyZXNzIGhhbmRsZXIgdG8gTm9uZSBjbGVhcnMgdGhlIHByZXZpb3VzbHkgc2V0IGhhbmRsZXIuCiAgICAgICAgIiIiCiAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKICAgICAgICBhY3Rpb24gPSAwCiAgICAgICAgZGVmIHByb2dyZXNzKCk6CiAgICAgICAgICAgIGFjdGlvbiA9IDEKICAgICAgICAgICAgcmV0dXJuIDAKICAgICAgICBjb24uc2V0X3Byb2dyZXNzX2hhbmRsZXIocHJvZ3Jlc3MsIDEpCiAgICAgICAgY29uLnNldF9wcm9ncmVzc19oYW5kbGVyKE5vbmUsIDEpCiAgICAgICAgY29uLmV4ZWN1dGUoInNlbGVjdCAxIHVuaW9uIHNlbGVjdCAyIHVuaW9uIHNlbGVjdCAzIikuZmV0Y2hhbGwoKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYWN0aW9uLCAwLCAicHJvZ3Jlc3MgaGFuZGxlciB3YXMgbm90IGNsZWFyZWQiKQoKY2xhc3MgVHJhY2VDYWxsYmFja1Rlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgIGRlZiBDaGVja1RyYWNlQ2FsbGJhY2tVc2VkKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFRlc3QgdGhhdCB0aGUgdHJhY2UgY2FsbGJhY2sgaXMgaW52b2tlZCBvbmNlIGl0IGlzIHNldC4KICAgICAgICAiIiIKICAgICAgICBjb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQogICAgICAgIHRyYWNlZF9zdGF0ZW1lbnRzID0gW10KICAgICAgICBkZWYgdHJhY2Uoc3RhdGVtZW50KToKICAgICAgICAgICAgdHJhY2VkX3N0YXRlbWVudHMuYXBwZW5kKHN0YXRlbWVudCkKICAgICAgICBjb24uc2V0X3RyYWNlX2NhbGxiYWNrKHRyYWNlKQogICAgICAgIGNvbi5leGVjdXRlKCJjcmVhdGUgdGFibGUgZm9vKGEsIGIpIikKICAgICAgICBzZWxmLmFzc2VydFRydWUodHJhY2VkX3N0YXRlbWVudHMpCiAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGFueSgiY3JlYXRlIHRhYmxlIGZvbyIgaW4gc3RtdCBmb3Igc3RtdCBpbiB0cmFjZWRfc3RhdGVtZW50cykpCgogICAgZGVmIENoZWNrQ2xlYXJUcmFjZUNhbGxiYWNrKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFRlc3QgdGhhdCBzZXR0aW5nIHRoZSB0cmFjZSBjYWxsYmFjayB0byBOb25lIGNsZWFycyB0aGUgcHJldmlvdXNseSBzZXQgY2FsbGJhY2suCiAgICAgICAgIiIiCiAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKICAgICAgICB0cmFjZWRfc3RhdGVtZW50cyA9IFtdCiAgICAgICAgZGVmIHRyYWNlKHN0YXRlbWVudCk6CiAgICAgICAgICAgIHRyYWNlZF9zdGF0ZW1lbnRzLmFwcGVuZChzdGF0ZW1lbnQpCiAgICAgICAgY29uLnNldF90cmFjZV9jYWxsYmFjayh0cmFjZSkKICAgICAgICBjb24uc2V0X3RyYWNlX2NhbGxiYWNrKE5vbmUpCiAgICAgICAgY29uLmV4ZWN1dGUoImNyZWF0ZSB0YWJsZSBmb28oYSwgYikiKQogICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UodHJhY2VkX3N0YXRlbWVudHMsICJ0cmFjZSBjYWxsYmFjayB3YXMgbm90IGNsZWFyZWQiKQoKICAgIGRlZiBDaGVja1VuaWNvZGVDb250ZW50KHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFRlc3QgdGhhdCB0aGUgc3RhdGVtZW50IGNhbiBjb250YWluIHVuaWNvZGUgbGl0ZXJhbHMuCiAgICAgICAgIiIiCiAgICAgICAgdW5pY29kZV92YWx1ZSA9ICdceGY2XHhlNFx4ZmNceGQ2XHhjNFx4ZGNceGRmXHUyMGFjJwogICAgICAgIGNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCiAgICAgICAgdHJhY2VkX3N0YXRlbWVudHMgPSBbXQogICAgICAgIGRlZiB0cmFjZShzdGF0ZW1lbnQpOgogICAgICAgICAgICB0cmFjZWRfc3RhdGVtZW50cy5hcHBlbmQoc3RhdGVtZW50KQogICAgICAgIGNvbi5zZXRfdHJhY2VfY2FsbGJhY2sodHJhY2UpCiAgICAgICAgY29uLmV4ZWN1dGUoImNyZWF0ZSB0YWJsZSBmb28oeCkiKQogICAgICAgICMgQ2FuJ3QgZXhlY3V0ZSBib3VuZCBwYXJhbWV0ZXJzIGFzIHRoZWlyIHZhbHVlcyBkb24ndCBhcHBlYXIKICAgICAgICAjIGluIHRyYWNlZCBzdGF0ZW1lbnRzIGJlZm9yZSBTUUxpdGUgMy42LjIxCiAgICAgICAgIyAoY2YuIGh0dHA6Ly93d3cuc3FsaXRlLm9yZy9kcmFmdC9yZWxlYXNlbG9nLzNfNl8yMS5odG1sKQogICAgICAgIGNvbi5leGVjdXRlKCdpbnNlcnQgaW50byBmb28oeCkgdmFsdWVzICgiJXMiKScgJSB1bmljb2RlX3ZhbHVlKQogICAgICAgIGNvbi5jb21taXQoKQogICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhbnkodW5pY29kZV92YWx1ZSBpbiBzdG10IGZvciBzdG10IGluIHRyYWNlZF9zdGF0ZW1lbnRzKSwKICAgICAgICAgICAgICAgICAgICAgICAgIlVuaWNvZGUgZGF0YSAlcyBnYXJibGVkIGluIHRyYWNlIGNhbGxiYWNrOiAlcyIKICAgICAgICAgICAgICAgICAgICAgICAgJSAoYXNjaWkodW5pY29kZV92YWx1ZSksICcsICcuam9pbihtYXAoYXNjaWksIHRyYWNlZF9zdGF0ZW1lbnRzKSkpKQoKCgpkZWYgc3VpdGUoKToKICAgIGNvbGxhdGlvbl9zdWl0ZSA9IHVuaXR0ZXN0Lm1ha2VTdWl0ZShDb2xsYXRpb25UZXN0cywgIkNoZWNrIikKICAgIHByb2dyZXNzX3N1aXRlID0gdW5pdHRlc3QubWFrZVN1aXRlKFByb2dyZXNzVGVzdHMsICJDaGVjayIpCiAgICB0cmFjZV9zdWl0ZSA9IHVuaXR0ZXN0Lm1ha2VTdWl0ZShUcmFjZUNhbGxiYWNrVGVzdHMsICJDaGVjayIpCiAgICByZXR1cm4gdW5pdHRlc3QuVGVzdFN1aXRlKChjb2xsYXRpb25fc3VpdGUsIHByb2dyZXNzX3N1aXRlLCB0cmFjZV9zdWl0ZSkpCgpkZWYgdGVzdCgpOgogICAgcnVubmVyID0gdW5pdHRlc3QuVGV4dFRlc3RSdW5uZXIoKQogICAgcnVubmVyLnJ1bihzdWl0ZSgpKQoKaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgIHRlc3QoKQo=