TG9hZCB0ZXN0aW5nIHJldmVhbHMgcGVyZm9ybWFuY2UgcHJvYmxlbXMgYmVmb3JlIHlvdXIgdXNlcnMgZGlzY292ZXIgdGhlbS4gVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBhIGxvYWQgdGVzdCB0aGF0IGZpbmRzIHJlYWwgaXNzdWVzIGFuZCBvbmUgdGhhdCBnaXZlcyBmYWxzZSBjb25maWRlbmNlIGNvbWVzIGRvd24gdG8gdGhlIHF1YWxpdHkgb2YgdGhlIHRlc3Qgc2NyaXB0cy4gQSBwb29ybHkgZGVzaWduZWQgdGVzdCB1c2VzIHVucmVhbGlzdGljIGRhdGEsIGlnbm9yZXMgdGhpbmsgdGltZXMsIGFuZCBzZW5kcyBhbGwgcmVxdWVzdHMgc2ltdWx0YW5lb3VzbHkuIFRoaXMgdGVsbHMgeW91IHRoYXQgeW91ciBzeXN0ZW0gaGFuZGxlcyAxMCwwMDAgcmVxdWVzdHMgcGVyIHNlY29uZCB3aGVuIGluIHByYWN0aWNlIGl0IGZhbGxzIG92ZXIgYXQgMTAwIGNvbmN1cnJlbnQgdXNlcnMuIGs2IGlzIGEgbW9kZXJuIGxvYWQgdGVzdGluZyB0b29sIHRoYXQgbWFrZXMgd3JpdGluZyByZWFsaXN0aWMgc2NyaXB0cyBzdHJhaWdodGZvcndhcmQsIHdpdGggbmF0aXZlIHN1cHBvcnQgZm9yIEphdmFTY3JpcHQgc2NyaXB0aW5nIGFuZCBhIGNvbW1hbmQtbGluZSBpbnRlcmZhY2UgdGhhdCBmaXRzIG5hdHVyYWxseSBpbnRvIGRldmVsb3BtZW50IHdvcmtmbG93cy4KClRoaXMgYXJ0aWNsZSBjb3ZlcnMgaG93IHRvIHdyaXRlIGs2IGxvYWQgdGVzdCBzY3JpcHRzIHRoYXQgcHJvZHVjZSBhY2N1cmF0ZSByZXN1bHRzLCBob3cgdG8gaW50ZXJwcmV0IHRoZSBvdXRwdXQsIGFuZCBob3cgdG8gZGVzaWduIHRlc3RzIHRoYXQgdGFyZ2V0IHRoZSBzcGVjaWZpYyBwZXJmb3JtYW5jZSBxdWVzdGlvbnMgeW91IG5lZWQgdG8gYW5zd2VyLiBXaGV0aGVyIHlvdSBhcmUgc2V0dGluZyB1cCBsb2FkIHRlc3RpbmcgZm9yIHRoZSBmaXJzdCB0aW1lIG9yIGltcHJvdmluZyBleGlzdGluZyBzY3JpcHRzIHRoYXQgaGF2ZSBub3QgYmVlbiBnaXZpbmcgeW91IHJlbGlhYmxlIHJlc3VsdHMsIHRoZSBwcmluY2lwbGVzIGhlcmUgd2lsbCBoZWxwIHlvdSBnZXQgbW9yZSB2YWx1ZSBmcm9tIHlvdXIgdGVzdGluZyBlZmZvcnQuCgo8aDI+V2h5IE1vc3QgTG9hZCBUZXN0cyBNaXNzIFJlYWwgUHJvYmxlbXM8L2gyPgoKQSBsb2FkIHRlc3QgdGhhdCBkb2VzIG5vdCByZWZsZWN0IHJlYWwgdXNlciBiZWhhdmlvdXIgd2lsbCBub3QgZmluZCB0aGUgcHJvYmxlbXMgdGhhdCByZWFsIHVzZXJzIGVuY291bnRlci4gVGhlIG1vc3QgY29tbW9uIG1pc3Rha2VzIG1hZGUgd2hlbiB3cml0aW5nIGxvYWQgdGVzdCBzY3JpcHRzIGFyZToKCjx1bD4KICA8bGk+PHN0cm9uZz5JZ25vcmluZyB0aGluayB0aW1lczo8L3N0cm9uZz4gVXNlcnMgZG8gbm90IHNlbmQgcmVxdWVzdHMgY29udGludW91c2x5LiBUaGV5IHJlYWQgY29udGVudCwgbWFrZSBkZWNpc2lvbnMsIGFuZCByZXNwb25kLiBTZW5kaW5nIHJlcXVlc3RzIGJhY2stdG8tYmFjayB3aXRob3V0IHJlYWxpc3RpYyBwYXVzZXMgZHJhbWF0aWNhbGx5IG92ZXJlc3RpbWF0ZXMgc3lzdGVtIGNhcGFjaXR5LjwvbGk+CiAgPGxpPjxzdHJvbmc+VW5yZWFsaXN0aWMgZGF0YSBkaXN0cmlidXRpb25zOjwvc3Ryb25nPiBBIHF1ZXJ5IGFnYWluc3QgYSB3YXJtIGNhY2hlIGJlaGF2ZXMgdmVyeSBkaWZmZXJlbnRseSBmcm9tIGEgcXVlcnkgYWdhaW5zdCBhIGNvbGQgZGF0YWJhc2UuIElmIHlvdXIgdGVzdCBkYXRhIGRvZXMgbm90IHJlZmxlY3QgdGhlIHJlYWwgbWl4IG9mIGNhY2hlZCBhbmQgdW5jYWNoZWQgcmVxdWVzdHMsIHlvdXIgcmVzdWx0cyB3aWxsIGJlIG1pc2xlYWRpbmcuPC9saT4KICA8bGk+PHN0cm9uZz5ObyBzZXNzaW9uIGhhbmRsaW5nOjwvc3Ryb25nPiBSZWFsIHVzZXJzIGxvZyBpbiwgbWFpbnRhaW4gc2Vzc2lvbnMgYWNyb3NzIHJlcXVlc3RzLCBhbmQgbWFrZSBhdXRoZW50aWNhdGVkIGNhbGxzLiBUZXN0cyB0aGF0IGJ5cGFzcyBhdXRoZW50aWNhdGlvbiBtaXNzIHRoZSBwZXJmb3JtYW5jZSBpbXBhY3Qgb2Ygc2Vzc2lvbiBtYW5hZ2VtZW50IGVudGlyZWx5LjwvbGk+CiAgPGxpPjxzdHJvbmc+VGVzdGluZyBvbmx5IHRoZSBoYXBweSBwYXRoOjwvc3Ryb25nPiBGb2N1c2luZyBleGNsdXNpdmVseSBvbiBpZGVhbCByZXF1ZXN0IHBhdHRlcm5zIGlnbm9yZXMgdGhlIHNsb3cgcXVlcmllcywgZWRnZSBjYXNlcywgYW5kIGVycm9yIGNvbmRpdGlvbnMgdGhhdCBjYXVzZSBtb3N0IHByb2R1Y3Rpb24gaW5jaWRlbnRzLjwvbGk+CiAgPGxpPjxzdHJvbmc+U3luY2hyb25vdXMgcmVxdWVzdCBwYXR0ZXJuczo8L3N0cm9uZz4gU2VuZGluZyBhbGwgdmlydHVhbCB1c2VycyB0aHJvdWdoIHRoZSBleGFjdCBzYW1lIGZsb3cgYXQgdGhlIGV4YWN0IHNhbWUgdGltZSBjcmVhdGVzIGFydGlmaWNpYWwgbG9hZCBwYXR0ZXJucyB0aGF0IG5ldmVyIG9jY3VyIGluIHByb2R1Y3Rpb24uPC9saT4KPC91bD4KCms2J3Mgc2NyaXB0aW5nIG1vZGVsIG1ha2VzIGl0IGVhc2llciB0byB3cml0ZSByZWFsaXN0aWMgdGVzdHMgYmVjYXVzZSBpdCBydW5zIGFjdHVhbCBKYXZhU2NyaXB0IHRoYXQgZGVzY3JpYmVzIHVzZXIgYmVoYXZpb3VyIHJhdGhlciB0aGFuIGEgY29uZmlndXJhdGlvbiBmaWxlIHRoYXQgZGVzY3JpYmVzIHJlcXVlc3QgcGF0dGVybnMuIFRoaXMgbWVhbnMgeW91IGNhbiBtb2RlbCBjb21wbGV4IHVzZXIgZmxvd3Mgd2l0aCBzZXNzaW9uIHN0YXRlLCBjb25kaXRpb25hbCBsb2dpYywgYW5kIHJlYWxpc3RpYyB0aGluayB0aW1lcy4gVGhlIHNjcmlwdHMgeW91IHdyaXRlIGZvciBrNiBhcmUgdGhlIHNhbWUgSmF2YVNjcmlwdCBza2lsbHMgeW91ciBkZXZlbG9wbWVudCB0ZWFtIGFscmVhZHkgdXNlcywgd2hpY2ggbG93ZXJzIHRoZSBiYXJyaWVyIHRvIG1haW50YWluaW5nIGFuZCBpbXByb3ZpbmcgdGVzdHMgb3ZlciB0aW1lLgoKRm9yIHRlYW1zIHdvcmtpbmcgb24gZGVwbG95bWVudCBhdXRvbWF0aW9uLCBjb21iaW5pbmcgbG9hZCB0ZXN0aW5nIHdpdGggcHJvcGVyIGRlcGxveW1lbnQgc2NyaXB0cyBoZWxwcyBlbnN1cmUgcGVyZm9ybWFuY2UgaXMgdmFsaWRhdGVkIGFzIHBhcnQgb2YgeW91ciByZWxlYXNlIHByb2Nlc3MuIFdyaXRpbmcgYmFzaCBzY3JpcHRzIHRoYXQgZGVwbG95IGFuZCB0aGVuIGltbWVkaWF0ZWx5IHJ1biBsb2FkIHRlc3RzIGNyZWF0ZXMgYSByZXBlYXRhYmxlIHBlcmZvcm1hbmNlIHZhbGlkYXRpb24gc3RlcCBpbiB5b3VyIHBpcGVsaW5lLgoKPGgyPlNldHRpbmcgVXAgazY8L2gyPgoKazYgaXMgaW5zdGFsbGVkIGFzIGEgc2luZ2xlIGJpbmFyeSBhbmQgcnVucyBmcm9tIHRoZSBjb21tYW5kIGxpbmUuIFRoZXJlIGlzIG5vIEphdmEgcnVudGltZSwgbm8gR1VJLCBhbmQgbm8gc2VwYXJhdGUgY29udHJvbGxlciBvciBhZ2VudCBhcmNoaXRlY3R1cmUuIFlvdSB3cml0ZSB0ZXN0IHNjcmlwdHMgaW4gSmF2YVNjcmlwdCwgcnVuIHRoZW0gZnJvbSB0aGUgdGVybWluYWwsIGFuZCBnZXQgc3RydWN0dXJlZCBvdXRwdXQgdGhhdCB5b3UgY2FuIHBpcGUgdG8gb3RoZXIgdG9vbHMgb3IgcmV2aWV3IGRpcmVjdGx5LgoKPHByZT48Y29kZT4jIEluc3RhbGwgazYgb24gbWFjT1MKYnJldyBpbnN0YWxsIGs2CgojIEluc3RhbGwgb24gTGludXggKERlYmlhbi9VYnVudHUpCnN1ZG8gZ3BnIC1rCnN1ZG8gZ3BnIC0tbm8tZGVmYXVsdC1rZXlyaW5nIC0ta2V5cmluZyAvdXNyL3NoYXJlL2tleXJpbmdzL2s2LWFyY2hpdmUta2V5cmluZy5ncGcgLS1rZXlzZXJ2ZXIgaGtwOi8va2V5c2VydmVyLnVidW50dS5jb206ODAgLS1yZWN2LWtleXMgQzVBRDE3Qzc0N0UzNDE1QTM2NDJENTdENzdDNkM0OTFENkFDMUQ2OQplY2hvICJkZWIgW3NpZ25lZC1ieT0vdXNyL3NoYXJlL2tleXJpbmdzL2s2LWFyY2hpdmUta2V5cmluZy5ncGddIGh0dHBzOi8vZGwuazYuaW8vZGViIHN0YWJsZSBtYWluIiB8IHN1ZG8gdGVlIC9ldGMvYXB0L3NvdXJjZXMubGlzdC5kL2s2Lmxpc3QKc3VkbyBhcHQgdXBkYXRlCnN1ZG8gYXB0IGluc3RhbGwgazYKCiMgUnVuIGEgYmFzaWMgdGVzdAprNiBydW4gLS12dXMgMTAgLS1kdXJhdGlvbiAzMHMgc2NyaXB0LmpzPC9jb2RlPjwvcHJlPgoKRm9yIHJlc3VsdHMgYWdncmVnYXRpb24gYW5kIHZpc3VhbGlzYXRpb24sIGs2IGludGVncmF0ZXMgd2l0aCBHcmFmYW5hLCBJbmZsdXhEQiwgYW5kIGs2IENsb3VkLiBUaGUgb3Blbi1zb3VyY2UgY29tYmluYXRpb24gb2YgazYgd2l0aCBHcmFmYW5hIGFuZCBJbmZsdXhEQiBwcm92aWRlcyBhIGNhcGFibGUgc3RhY2sgZm9yIG1vc3QgdGVhbXMgd2l0aG91dCByZXF1aXJpbmcgZXh0ZXJuYWwgc2VydmljZXMuIFRoZSBHcmFmYW5hIGs2IHBsdWdpbiBpbmNsdWRlcyBwcmUtYnVpbHQgZGFzaGJvYXJkcyBkZXNpZ25lZCBzcGVjaWZpY2FsbHkgZm9yIGs2IG91dHB1dCwgZ2l2aW5nIHlvdSBpbW1lZGlhdGUgdmlzaWJpbGl0eSBpbnRvIHlvdXIgdGVzdCByZXN1bHRzLgoKSWYgeW91IGFyZSBhbHJlYWR5IHVzaW5nIGJhc2ggc2NyaXB0cyBmb3IgYXBwbGljYXRpb24gZGVwbG95bWVudCwgYWRkaW5nIGEgazYgbG9hZCB0ZXN0IHRvIHRoZSBlbmQgb2YgeW91ciBkZXBsb3ltZW50IHBpcGVsaW5lIGlzIHN0cmFpZ2h0Zm9yd2FyZC4gWW91ciBleGlzdGluZyBzY3JpcHRpbmcga25vd2xlZGdlIHRyYW5zbGF0ZXMgZGlyZWN0bHkgdG8gd3JpdGluZyBlZmZlY3RpdmUgbG9hZCB0ZXN0cy4KCjxoMj5Xcml0aW5nIGEgUmVhbGlzdGljIGs2IFNjcmlwdDwvaDI+CgpBIHJlYWxpc3RpYyBrNiBzY3JpcHQgbW9kZWxzIGFuIGFjdHVhbCB1c2VyIHNlc3Npb246IHRoZSByZXF1ZXN0cyB0aGV5IG1ha2UsIHRoZSB0aW1lIGJldHdlZW4gcmVxdWVzdHMsIGFuZCB0aGUgZGF0YSB0aGV5IHN1Ym1pdC4gVGhlIGdvYWwgaXMgdG8gc2ltdWxhdGUgdGhlIHBhdHRlcm5zIHlvdXIgcmVhbCB1c2VycyBmb2xsb3csIG5vdCB0byBtYXhpbWlzaW5nIHJlcXVlc3QgdGhyb3VnaHB1dCBhcnRpZmljaWFsbHkuCgo8cHJlPjxjb2RlPmltcG9ydCBodHRwIGZyb20gJ2s2L2h0dHAnOwppbXBvcnQgeyBjaGVjaywgc2xlZXAgfSBmcm9tICdrNic7CgpleHBvcnQgY29uc3Qgb3B0aW9ucyA9IHsKICB2dXM6IDUwLAogIGR1cmF0aW9uOiAnNW0nLAogIHRocmVzaG9sZHM6IHsKICAgIGh0dHBfcmVxX2R1cmF0aW9uOiBbJ3AoOTUpPDUwMCddLAogICAgaHR0cF9yZXFfZmFpbGVkOiBbJ3JhdGU8MC4wMSddLAogIH0sCn07CgpleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiAoKSB7CiAgLy8gSG9tZXBhZ2UgdmlzaXQKICBsZXQgcmVzID0gaHR0cC5nZXQoJ2h0dHBzOi8veW91cmFwcC5jb20vJyk7CiAgY2hlY2socmVzLCB7CiAgICAnaG9tZXBhZ2UgcmV0dXJucyAyMDAnOiAocikgPT4gci5zdGF0dXMgPT09IDIwMCwKICAgICdob21lcGFnZSBsb2FkcyB1bmRlciAxcyc6IChyKSA9PiByLnRpbWluZ3MuZHVyYXRpb24gPCAxMDAwLAogIH0pOwoKICAvLyBCcm93c2UgcHJvZHVjdHMgd2l0aCByZWFsaXN0aWMgdGhpbmsgdGltZQogIGxldCBwcm9kdWN0c1JlcyA9IGh0dHAuZ2V0KCdodHRwczovL3lvdXJhcHAuY29tL3Byb2R1Y3RzJyk7CiAgY2hlY2socHJvZHVjdHNSZXMsIHsKICAgICdwcm9kdWN0cyBwYWdlIGxvYWRlZCc6IChyKSA9PiByLnN0YXR1cyA9PT0gMjAwLAogIH0pOwogIHNsZWVwKE1hdGgucmFuZG9tKCkgKiAzICsgMSk7IC8vIFJhbmRvbSB0aGluayB0aW1lIGJldHdlZW4gMS00IHNlY29uZHMKCiAgLy8gVmlldyBzcGVjaWZpYyBwcm9kdWN0IGRldGFpbAogIGxldCBwcm9kdWN0SWQgPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAxMDAwKSArIDE7CiAgbGV0IGRldGFpbFJlcyA9IGh0dHAuZ2V0KGBodHRwczovL3lvdXJhcHAuY29tL3Byb2R1Y3RzLyR7cHJvZHVjdElkfWApOwogIGNoZWNrKGRldGFpbFJlcywgewogICAgJ3Byb2R1Y3QgZGV0YWlsIGxvYWRlZCc6IChyKSA9PiByLnN0YXR1cyA9PT0gMjAwLAogIH0pOwogIHNsZWVwKE1hdGgucmFuZG9tKCkgKiAyICsgMSk7IC8vIEFub3RoZXIgdGhpbmsgdGltZSBwYXVzZQoKICAvLyBBZGQgdG8gY2FydCB3aXRoIFBPU1QgcmVxdWVzdAogIGxldCBjYXJ0UmVzID0gaHR0cC5wb3N0KAogICAgJ2h0dHBzOi8veW91cmFwcC5jb20vY2FydC9hZGQnLAogICAgSlNPTi5zdHJpbmdpZnkoeyBwcm9kdWN0X2lkOiBwcm9kdWN0SWQsIHF1YW50aXR5OiAxIH0pLAogICAgewogICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSwKICAgIH0KICApOwogIGNoZWNrKGNhcnRSZXMsIHsKICAgICdhZGRlZCB0byBjYXJ0IHN1Y2Nlc3NmdWxseSc6IChyKSA9PiByLnN0YXR1cyA9PT0gMjAwLAogIH0pOwp9PC9jb2RlPjwvcHJlPgoKVGhlIHNjcmlwdCBtb2RlbHMgYSByZWFsIHVzZXIgam91cm5leTogdmlzaXRpbmcgdGhlIGhvbWVwYWdlLCBicm93c2luZyBwcm9kdWN0IGxpc3RpbmdzLCB2aWV3aW5nIGEgc3BlY2lmaWMgcHJvZHVjdCwgYW5kIGFkZGluZyBpdCB0byB0aGUgY2FydC4gVGhlIHJhbmRvbSBzbGVlcCB0aW1lcyBiZXR3ZWVuIHJlcXVlc3RzIHJlZmxlY3QgYWN0dWFsIHVzZXIgYmVoYXZpb3VyLiBWYXJ5aW5nIHRoZSBwcm9kdWN0IElEIGFjcm9zcyByZXF1ZXN0cyBlbnN1cmVzIHlvdXIgZGF0YWJhc2UgcXVlcmllcyBoaXQgZGlmZmVyZW50IHJlY29yZHMgcmF0aGVyIHRoYW4gYmVpbmcgYXJ0aWZpY2lhbGx5IG9wdGltaXNlZCBieSBjYWNoaW5nIGEgc2luZ2xlIHF1ZXJ5LgoKVGhlIDxjb2RlPmNoZWNrPC9jb2RlPiBmdW5jdGlvbiB2YWxpZGF0ZXMgcmVzcG9uc2UgY29uZGl0aW9ucyBhbmQgcmVjb3JkcyBwYXNzIG9yIGZhaWwgY291bnRzIGZvciBlYWNoIGNoZWNrLiBUaGUgPGNvZGU+dGhyZXNob2xkczwvY29kZT4gY29uZmlndXJhdGlvbiBpbiB0aGUgb3B0aW9ucyBkZWZpbmVzIHlvdXIgcGVyZm9ybWFuY2UgZXhwZWN0YXRpb25zLiBJbiB0aGlzIGV4YW1wbGUsIHlvdSBhcmUgc2F5aW5nIHRoYXQgOTUgcGVyY2VudCBvZiByZXF1ZXN0cyBtdXN0IGNvbXBsZXRlIHdpdGhpbiA1MDAgbWlsbGlzZWNvbmRzIGFuZCB0aGF0IHRoZSBmYWlsdXJlIHJhdGUgbXVzdCBzdGF5IGJlbG93IDEgcGVyY2VudC4KCjxoMj5IYW5kbGluZyBBdXRoZW50aWNhdGlvbiBpbiBMb2FkIFRlc3RzPC9oMj4KCkF1dGhlbnRpY2F0ZWQgZW5kcG9pbnRzIHJlcXVpcmUgc2Vzc2lvbiBoYW5kbGluZyBpbiBsb2FkIHRlc3RzLiBJZiB5b3Ugb25seSB0ZXN0IHB1YmxpYyBwYWdlcywgeW91IG1pc3MgdGhlIHBlcmZvcm1hbmNlIGNoYXJhY3RlcmlzdGljcyBvZiB5b3VyIGF1dGhlbnRpY2F0aW9uIHN5c3RlbSBhbmQgYW55IGVuZHBvaW50cyB0aGF0IHJlcXVpcmUgbG9nZ2VkLWluIGNvbnRleHQuCgpVc2UgazYncyBjb29raWVzIG9iamVjdCBvciBhIHBlci1WVSBzZXNzaW9uIHRva2VuIHRvIG1haW50YWluIGF1dGhlbnRpY2F0aW9uIGFjcm9zcyByZXF1ZXN0cy4gRWFjaCB2aXJ0dWFsIHVzZXIgc2hvdWxkIGVzdGFibGlzaCBpdHMgb3duIHNlc3Npb24gcmF0aGVyIHRoYW4gc2hhcmluZyBjcmVkZW50aWFscywgYmVjYXVzZSBzaGFyZWQgYXV0aGVudGljYXRpb24gY2FuIG1hc2sgc2Vzc2lvbiBjb250ZW50aW9uIGlzc3VlcyB0aGF0IGFwcGVhciBpbiBwcm9kdWN0aW9uLgoKPHByZT48Y29kZT5pbXBvcnQgaHR0cCBmcm9tICdrNi9odHRwJzsKaW1wb3J0IHsgY2hlY2sgfSBmcm9tICdrNic7CgpleHBvcnQgY29uc3Qgb3B0aW9ucyA9IHsKICB2dXM6IDIwLAogIGR1cmF0aW9uOiAnM20nLAp9OwoKZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKCkgewogIC8vIExvZ2luIG9uY2UgcGVyIHZpcnR1YWwgdXNlciBhdCB0aGUgc3RhcnQgb2YgdGhlaXIgc2Vzc2lvbgogIGxldCBsb2dpblJlcyA9IGh0dHAucG9zdCgKICAgICdodHRwczovL3lvdXJhcHAuY29tL2xvZ2luJywKICAgIEpTT04uc3RyaW5naWZ5KHsKICAgICAgdXNlcm5hbWU6IGB0ZXN0dXNlcl8ke19fVlV9QGV4YW1wbGUuY29tYCwKICAgICAgcGFzc3dvcmQ6ICd0ZXN0cGFzc3dvcmQxMjMnLAogICAgfSksCiAgICB7CiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LAogICAgfQogICk7CgogIGNoZWNrKGxvZ2luUmVzLCB7CiAgICAnbG9naW4gc3VjY2Vzc2Z1bCc6IChyKSA9PiByLnN0YXR1cyA9PT0gMjAwLAogIH0pOwoKICAvLyBFeHRyYWN0IHNlc3Npb24gY29va2llIGZyb20gbG9naW4gcmVzcG9uc2UKICBsZXQgc2Vzc2lvbkNvb2tpZSA9IGxvZ2luUmVzLmNvb2tpZXNbJ3Nlc3Npb25faWQnXT8uWzBdPy52YWx1ZTsKCiAgaWYgKHNlc3Npb25Db29raWUpIHsKICAgIC8vIFVzZSBzZXNzaW9uIGZvciBhdXRoZW50aWNhdGVkIHJlcXVlc3RzCiAgICBsZXQgZGFzaGJvYXJkUmVzID0gaHR0cC5nZXQoJ2h0dHBzOi8veW91cmFwcC5jb20vZGFzaGJvYXJkJywgewogICAgICBjb29raWVzOiB7CiAgICAgICAgc2Vzc2lvbl9pZDogc2Vzc2lvbkNvb2tpZSwKICAgICAgfSwKICAgIH0pOwoKICAgIGNoZWNrKGRhc2hib2FyZFJlcywgewogICAgICAnZGFzaGJvYXJkIGFjY2Vzc2libGUnOiAocikgPT4gci5zdGF0dXMgPT09IDIwMCwKICAgICAgJ2Rhc2hib2FyZCBsb2FkcyBjb250ZW50JzogKHIpID0+IHIuYm9keS5sZW5ndGggPiAxMDAsCiAgICB9KTsKCiAgICAvLyBNYWtlIGFkZGl0aW9uYWwgYXV0aGVudGljYXRlZCBBUEkgY2FsbHMKICAgIGxldCBwcm9maWxlUmVzID0gaHR0cC5nZXQoJ2h0dHBzOi8veW91cmFwcC5jb20vYXBpL3Byb2ZpbGUnLCB7CiAgICAgIGNvb2tpZXM6IHsKICAgICAgICBzZXNzaW9uX2lkOiBzZXNzaW9uQ29va2llLAogICAgICB9LAogICAgfSk7CiAgICBjaGVjayhwcm9maWxlUmVzLCB7ICdwcm9maWxlIGxvYWRzJzogKHIpID0+IHIuc3RhdHVzID09PSAyMDAgfSk7CiAgfQp9PC9jb2RlPjwvcHJlPgoKRm9yIG1vcmUgcmVhbGlzdGljIGxvYWQgdGVzdGluZyB3aXRoIGF1dGhlbnRpY2F0aW9uLCB1c2UgYSByYW5nZSBvZiB0ZXN0IGNyZWRlbnRpYWxzIHJhdGhlciB0aGFuIGEgc2luZ2xlIHNoYXJlZCBjcmVkZW50aWFsLiBUaGUgPGNvZGU+X19WVTwvY29kZT4gYnVpbHQtaW4gdmFyaWFibGUgZ2l2ZXMgZWFjaCB2aXJ0dWFsIHVzZXIgYSB1bmlxdWUgbnVtYmVyLCBzbyB5b3UgY2FuIGNyZWF0ZSBkaXN0aW5jdCB1c2VyIHNlc3Npb25zIGFjcm9zcyB5b3VyIHRlc3QuIFRoaXMgcmVmbGVjdHMgdGhlIHJlYWwgZGlzdHJpYnV0aW9uIG9mIHVzZXJzIGFjcm9zcyB5b3VyIHN5c3RlbSBhbmQgY2FuIGV4cG9zZSBzZXNzaW9uIHN0b3JlIGNvbnRlbnRpb24gdGhhdCBzaW5nbGUtdXNlciB0ZXN0aW5nIG1pc3Nlcy4KCkZvciBBUElzIHRoYXQgdXNlIEJlYXJlciB0b2tlbnMgb3IgQVBJIGtleXMsIGluY2x1ZGUgdGhlIGF1dGhlbnRpY2F0aW9uIGhlYWRlciB3aXRoIGVhY2ggcmVxdWVzdCByYXRoZXIgdGhhbiBtYW5hZ2luZyBjb29raWVzLiBGb3IgSldULWJhc2VkIGF1dGhlbnRpY2F0aW9uLCB5b3UgY2FuIGdlbmVyYXRlIHNpZ25lZCB0b2tlbnMgYXQgcnVudGltZSB3aXRoaW4geW91ciBrNiBzY3JpcHQgdXNpbmcgYSBsaWJyYXJ5IGxpa2UgPGNvZGU+am9zZTwvY29kZT4sIHdoaWNoIGlzIHVzZWZ1bCBmb3IgdGVzdGluZyBtaWNyb3NlcnZpY2VzIHRoYXQgdXNlIEpXVCBmb3Igc2VydmljZS10by1zZXJ2aWNlIGF1dGhlbnRpY2F0aW9uLgoKPGgyPlJlYWRpbmcgazYgT3V0cHV0OiBVbmRlcnN0YW5kaW5nIHRoZSBNZXRyaWNzPC9oMj4KCms2IG91dHB1dHMgc2V2ZXJhbCBrZXkgbWV0cmljcyB0aGF0IHRlbGwgeW91IGFib3V0IHN5c3RlbSBwZXJmb3JtYW5jZSB1bmRlciBsb2FkLiBVbmRlcnN0YW5kaW5nIHdoYXQgZWFjaCBtZXRyaWMgcmVwcmVzZW50cyBoZWxwcyB5b3UgaW50ZXJwcmV0IHJlc3VsdHMgY29ycmVjdGx5IGFuZCBpZGVudGlmeSByZWFsIHByb2JsZW1zLgoKPHA+PHN0cm9uZz5odHRwX3JlcV9kdXJhdGlvbjwvc3Ryb25nPiBtZWFzdXJlcyB0aGUgZW5kLXRvLWVuZCBkdXJhdGlvbiBvZiBIVFRQIHJlcXVlc3RzIGZyb20gdGhlIGNsaWVudCBwZXJzcGVjdGl2ZS4gVGhpcyBpbmNsdWRlcyBETlMgbG9va3VwLCBjb25uZWN0aW9uIHRpbWUsIFRMUyBoYW5kc2hha2UsIHRpbWUgdG8gZmlyc3QgYnl0ZSwgYW5kIGNvbnRlbnQgZG93bmxvYWQuIFRoZSBwOTUgYW5kIHA5OSBwZXJjZW50aWxlcyBhcmUgbW9yZSB1c2VmdWwgdGhhbiB0aGUgYXZlcmFnZS4gSWYgeW91ciBwOTkgcmVzcG9uc2UgdGltZSBpcyAyIHNlY29uZHMgd2hpbGUgeW91ciBhdmVyYWdlIGlzIDIwMCBtaWxsaXNlY29uZHMsIG1vc3QgdXNlcnMgaGF2ZSBhIGdvb2QgZXhwZXJpZW5jZSBidXQgYSBzaWduaWZpY2FudCB0YWlsIGlzIHN1ZmZlcmluZyBzbG93IHJlc3BvbnNlcy48L3A+Cgo8cD48c3Ryb25nPmh0dHBfcmVxX2ZhaWxlZDwvc3Ryb25nPiByZXBvcnRzIHRoZSBwZXJjZW50YWdlIG9mIHJlcXVlc3RzIHRoYXQgcmV0dXJuZWQgbm9uLTJ4eCByZXNwb25zZXMuIEEgZmFpbGVkIHJlcXVlc3QgcmF0ZSBhYm92ZSAxIHBlcmNlbnQgZHVyaW5nIGEgbG9hZCB0ZXN0IHdhcnJhbnRzIGludmVzdGlnYXRpb24gYmVmb3JlIHlvdSBwcm9jZWVkLiBEaXN0aW5ndWlzaCBiZXR3ZWVuIGNvbm5lY3Rpb24gZmFpbHVyZXMgKG5ldHdvcmsgb3Igc2VydmVyIGRvd24pLCB0aW1lb3V0IGZhaWx1cmVzIChzZXJ2ZXIgdG9vIHNsb3cpLCBhbmQgYXBwbGljYXRpb24gZXJyb3JzICg1eHggcmVzcG9uc2VzIGZyb20geW91ciBjb2RlKS48L3A+Cgo8cD48c3Ryb25nPnZ1PC9zdHJvbmc+IHJlcG9ydHMgdGhlIG51bWJlciBvZiBjb25jdXJyZW50IHNpbXVsYXRlZCB1c2Vycy4gSW5jcmVhc2luZyB2dSB3aGlsZSBrZWVwaW5nIHJlc3BvbnNlIHRpbWVzIGFjY2VwdGFibGUgdGVsbHMgeW91IHlvdXIgc3lzdGVtJ3MgY29uY3VycmVuY3kgY2FwYWNpdHkuIFRyYWNrIGhvdyByZXNwb25zZSB0aW1lcyBjaGFuZ2UgYXMgeW91IGluY3JlYXNlIHZ1IHRvIGZpbmQgdGhlIHBvaW50IHdoZXJlIHBlcmZvcm1hbmNlIGRlZ3JhZGVzLjwvcD4KCjxwPjxzdHJvbmc+aXRlcmF0aW9uczwvc3Ryb25nPiBjb3VudHMgY29tcGxldGUgdXNlciBzZXNzaW9ucyBleGVjdXRlZC4gVGhlIGl0ZXJhdGlvbiByYXRlIChpdGVyYXRpb25zIHBlciBzZWNvbmQpIG11bHRpcGxpZWQgYnkgdGhlIGF2ZXJhZ2Ugc2Vzc2lvbiB2YWx1ZSB0ZWxscyB5b3UgeW91ciBzeXN0ZW0ncyBlZmZlY3RpdmUgdGhyb3VnaHB1dCB1bmRlciBsb2FkLiBGb3IgYW4gZS1jb21tZXJjZSBzaXRlLCB0aGlzIG1pZ2h0IGJlIG9yZGVycyBwZXIgaG91ci4gRm9yIGFuIEFQSSwgaXQgbWlnaHQgYmUgcmVxdWVzdHMgcGVyIHNlY29uZC48L3A+Cgo8cD48c3Ryb25nPmh0dHBfcmVxczwvc3Ryb25nPiBjb3VudHMgaW5kaXZpZHVhbCBIVFRQIHJlcXVlc3RzIG1hZGUsIHdoaWNoIGlzIGRpZmZlcmVudCBmcm9tIGl0ZXJhdGlvbnMgYmVjYXVzZSBhIHNpbmdsZSB1c2VyIHNlc3Npb24gY29udGFpbnMgbXVsdGlwbGUgcmVxdWVzdHMuIFRoaXMgbWV0cmljIGhlbHBzIHlvdSB1bmRlcnN0YW5kIHRvdGFsIHJlcXVlc3Qgdm9sdW1lIGluZGVwZW5kZW50IG9mIHNlc3Npb24gc3RydWN0dXJlLjwvcD4KCjxwPjxzdHJvbmc+Y2hlY2tzPC9zdHJvbmc+IHJlcG9ydHMgdGhlIHBhc3MgYW5kIGZhaWwgY291bnRzIGZvciB5b3VyIHZhbGlkYXRpb24gY2hlY2tzLiBIaWdoIGNoZWNrIGZhaWx1cmUgcmF0ZXMgYWxvbmdzaWRlIGxvdyBodHRwX3JlcV9mYWlsZWQgcmF0ZXMgaW5kaWNhdGUgdmFsaWQgcmVzcG9uc2VzIHRoYXQgZG8gbm90IGNvbnRhaW4gZXhwZWN0ZWQgY29udGVudCwgd2hpY2ggbWlnaHQgcG9pbnQgdG8gcmVuZGVyaW5nIGlzc3VlcyBvciBBUEkgY29udHJhY3QgY2hhbmdlcy48L3A+CgpBIHdlbGwtY29uZmlndXJlZCBrNiBydW4gcHJvZHVjZXMgb3V0cHV0IGxpa2UgdGhpczoKCjxwcmU+PGNvZGU+cnVubmluZyAoMm0zMHMpLCAwLzUwIFZVcywgMTI0NyBjb21wbGV0ZSBhbmQgMCBpbnRlcnJ1cHRlZCBpdGVyYXRpb25zCmRlZmF1bHQgICDinJMgaG9tZXBhZ2UgcmV0dXJucyAyMDAKZGVmYXVsdCAgIOKckyBob21lcGFnZSBsb2FkcyB1bmRlciAxcwpkZWZhdWx0ICAg4pyTIHByb2R1Y3RzIHBhZ2UgbG9hZGVkCmRlZmF1bHQgICDinJMgcHJvZHVjdCBkZXRhaWwgbG9hZGVkCmRlZmF1bHQgICDinJMgYWRkZWQgdG8gY2FydCBzdWNjZXNzZnVsbHkKCiAgICAg4paI4paI4paI4paI4paI4paI4paI4paI4paI4paI4paI4paI4paI4paI4paI4paI4paI4paI4paI4paI4paI4paI4paI4paI4paI4paI4paI4paI4paI4paI4paI4paI4paI4paI4paI4paI4paI4paI4paI4paIIDEwMCUKCiAgZGF0YV9yZWNlaXZlZC4uLi4uLi4uLi4uLi4uLi4uLi4uLi46IDQ1IE1CICAzMDIga0IvcwogIGRhdGFfc2VudC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uOiAzLjIgTUIgMjEga0IvcwogIGh0dHBfcmVxX2Jsb2NrZWQuLi4uLi4uLi4uLi4uLi4uLi4uLjogYXZnPTEuMjNtcyAgbWluPTBzICAgIG1lZD0xbXMgICAgbWF4PTg5bXMgIHAoOTApPTJtcyAgICBwKDk1KT0zbXMKICBodHRwX3JlcV9jb25uZWN0aW5nLi4uLi4uLi4uLi4uLi4uLjogYXZnPTBzICAgICAgbWluPTBzICAgIG1lZD0wcyAgICBtYXg9MHMgICAgcCg5MCk9MHMgICAgcCg5NSk9MHMKICBodHRwX3JlcV9kdXJhdGlvbi4uLi4uLi4uLi4uLi4uLi4uLjogYXZnPTE0Mm1zICAgbWluPTg5bXMgIG1lZD0xMzRtcyBtYXg9ODkybXMgcCg5MCk9MTk4bXMgcCg5NSk9MjQ1bXMKICBodHRwX3JlcV9mYWlsZWQuLi4uLi4uLi4uLi4uLi4uLi4uLjogMC4wMCUKICBodHRwX3JlcV9yZWNlaXZpbmcuLi4uLi4uLi4uLi4uLi4uLi46IGF2Zz0xMm1zICAgIG1pbj0ybXMgICBtZWQ9MTBtcyAgbWF4PTg5bXMgIHAoOTApPTE4bXMgIHAoOTUpPTI0bXMKICBodHRwX3JlcV9zZW5kaW5nLi4uLi4uLi4uLi4uLi4uLi4uLjogYXZnPTFtcyAgICAgbWluPTBzICAgIG1lZD0wcyAgICBtYXg9OG1zICAgcCg5MCk9MW1zICAgcCg5NSk9Mm1zCiAgaHR0cF9yZXFfdGxzX2hhbmRzaGFraW5nLi4uLi4uLi4uLi46IGF2Zz0wcyAgICAgIG1pbj0wcyAgICBtZWQ9MHMgICAgbWF4PTBzICAgIHAoOTApPTBzICAgIHAoOTUpPTBzCiAgaHR0cF9yZXFfd2FpdGluZy4uLi4uLi4uLi4uLi4uLi4uLi46IGF2Zz0xMjltcyAgIG1pbj03N21zICBtZWQ9MTIxbXMgbWF4PTgyM21zIHAoOTUpPTIyMW1zCiAgaXRlcmF0aW9ucy4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uOiAxMjQ3ICA4LjMxNjA5NS9zPC9jb2RlPjwvcHJlPgoKVGhpcyBvdXRwdXQgc2hvd3MgYSBoZWFsdGh5IHRlc3QgcnVuOiBwOTUgcmVzcG9uc2UgdGltZSBvZiAyNDUgbWlsbGlzZWNvbmRzLCB6ZXJvIGZhaWxlZCByZXF1ZXN0cywgYW5kIGNvbnNpc3RlbnQgaXRlcmF0aW9uIHJhdGUuIFRoZSBodHRwX3JlcV9kdXJhdGlvbiBicmVha2Rvd24gc2hvd3Mgd2hlcmUgdGltZSBpcyBzcGVudDogbW9zdCB0aW1lIGlzIGluIHRoZSB3YWl0aW5nIHBoYXNlIChzZXJ2ZXIgcHJvY2Vzc2luZyksIHdpdGggbWluaW1hbCB0aW1lIGluIHNlbmRpbmcgYW5kIHJlY2VpdmluZyBwaGFzZXMuCgo8aDI+RGVzaWduaW5nIFRlc3RzIFRoYXQgQW5zd2VyIFNwZWNpZmljIFF1ZXN0aW9uczwvaDI+CgpCZWZvcmUgd3JpdGluZyBhIGxvYWQgdGVzdCwgY2xhcmlmeSB3aGF0IHF1ZXN0aW9uIHlvdSBhcmUgdHJ5aW5nIHRvIGFuc3dlci4gRGlmZmVyZW50IHF1ZXN0aW9ucyByZXF1aXJlIGRpZmZlcmVudCB0ZXN0IGRlc2lnbnMuICJXaGF0IGlzIG91ciBtYXhpbXVtIHRocm91Z2hwdXQ/IiByZXF1aXJlcyBhIGRpZmZlcmVudCBhcHByb2FjaCBmcm9tICJXaGF0IGlzIG91ciByZXNwb25zZSB0aW1lIGF0IDEsMDAwIGNvbmN1cnJlbnQgdXNlcnM/IiBvciAiRG9lcyBkYXRhYmFzZSBxdWVyeSBwZXJmb3JtYW5jZSBkZWdyYWRlIHVuZGVyIHN1c3RhaW5lZCBsb2FkPyIKCjxwPkZvciBjYXBhY2l0eSBwbGFubmluZywgcnVuIGEgdGVzdCB0aGF0IHJhbXBzIHZ1IGdyYWR1YWxseSBhbmQgdHJhY2tzIHdoZW4gcmVzcG9uc2UgdGltZXMgZXhjZWVkIHlvdXIgU0xBIHRocmVzaG9sZC4gVGhlIHZ1IGNvdW50IGF0IHdoaWNoIHJlc3BvbnNlIHRpbWVzIGJlY29tZSB1bmFjY2VwdGFibGUgaXMgeW91ciBlZmZlY3RpdmUgY2FwYWNpdHkuIFJ1biB0aGlzIHRlc3QgcmVndWxhcmx5IHRvIHRyYWNrIGhvdyBjYXBhY2l0eSBjaGFuZ2VzIGFzIHlvdXIgZGF0YSBncm93cyBvciBhcyB5b3UgZGVwbG95IG5ldyBjb2RlLjwvcD4KCjxwcmU+PGNvZGU+ZXhwb3J0IGNvbnN0IG9wdGlvbnMgPSB7CiAgc3RhZ2VzOiBbCiAgICB7IGR1cmF0aW9uOiAnMm0nLCB0YXJnZXQ6IDEwMCB9LCAgIC8vIFJhbXAgdG8gMTAwIHVzZXJzCiAgICB7IGR1cmF0aW9uOiAnNW0nLCB0YXJnZXQ6IDEwMCB9LCAgIC8vIEhvbGQgYXQgMTAwIHVzZXJzCiAgICB7IGR1cmF0aW9uOiAnMm0nLCB0YXJnZXQ6IDIwMCB9LCAgIC8vIFJhbXAgdG8gMjAwIHVzZXJzCiAgICB7IGR1cmF0aW9uOiAnNW0nLCB0YXJnZXQ6IDIwMCB9LCAgIC8vIEhvbGQgYXQgMjAwIHVzZXJzCiAgICB7IGR1cmF0aW9uOiAnMm0nLCB0YXJnZXQ6IDAgfSwgICAgLy8gUmFtcCBkb3duCiAgXSwKICB0aHJlc2hvbGRzOiB7CiAgICBodHRwX3JlcV9kdXJhdGlvbjogWydwKDk1KTwxMDAwJ10sIC8vIFNMQTogcDk1IG11c3QgYmUgdW5kZXIgMSBzZWNvbmQKICB9LAp9OzwvY29kZT48L3ByZT4KCjxwPkZvciByZWdyZXNzaW9uIHRlc3RpbmcsIHNhdmUgeW91ciB0ZXN0IHJlc3VsdHMgYW5kIGNvbXBhcmUgdGhlbSBhZ2FpbnN0IGEgYmFzZWxpbmUuIElmIHRoZSBzYW1lIHRlc3Qgc2NyaXB0IHJ1bm5pbmcgYWdhaW5zdCB0aGUgc2FtZSBpbmZyYXN0cnVjdHVyZSBwcm9kdWNlcyBzaWduaWZpY2FudGx5IHdvcnNlIHJlc3VsdHMgYWZ0ZXIgYSBjb2RlIGRlcGxveW1lbnQsIHRoYXQgY2hhbmdlIGhhcyBpbnRyb2R1Y2VkIGEgcGVyZm9ybWFuY2UgcmVncmVzc2lvbiB0aGF0IG5lZWRzIGludmVzdGlnYXRpb24uIGs2J3MgSlNPTiBvdXRwdXQgbWFrZXMgYXV0b21hdGVkIHJlZ3Jlc3Npb24gY29tcGFyaXNvbiBzdHJhaWdodGZvcndhcmQuPC9wPgoKPHA+Rm9yIENETiBhbmQgY2FjaGluZyB2YWxpZGF0aW9uLCBkZXNpZ24gdGVzdHMgdGhhdCBzcGVjaWZpY2FsbHkgZXhlcmNpc2UgeW91ciBjYWNoaW5nIGxheWVyLiBJZiB5b3UgdXNlIENsb3VkZmxhcmUgb3IgYSBzaW1pbGFyIENETiwgeW91ciBsb2FkIHRlc3Qgc2hvdWxkIG1lYXN1cmUgY2FjaGUgaGl0IHJhdGVzIGFuZCBjb21wYXJlIHJlc3BvbnNlIHRpbWVzIGZvciBjYWNoZWQgdmVyc3VzIG9yaWdpbiByZXF1ZXN0cy4gQSBDRE4gdGhhdCBpcyBub3QgcHJvcGVybHkgY29uZmlndXJlZCBtYXkgc2VydmUgYWxsIHJlcXVlc3RzIGZyb20gb3JpZ2luLCBlbGltaW5hdGluZyB0aGUgcGVyZm9ybWFuY2UgYmVuZWZpdCB5b3UgYXJlIHBheWluZyBmb3IuPC9wPgoKPGgyPkVudmlyb25tZW50IElzb2xhdGlvbiBhbmQgVGVzdCBEYXRhPC9oMj4KCkxvYWQgdGVzdHMgbXVzdCBydW4gYWdhaW5zdCBhbiBpc29sYXRlZCBlbnZpcm9ubWVudCBzZXBhcmF0ZSBmcm9tIHByb2R1Y3Rpb24uIEEgbG9hZCB0ZXN0IGFnYWluc3QgeW91ciBwcm9kdWN0aW9uIGRhdGFiYXNlIHdpbGwgY29ycnVwdCBwcm9kdWN0aW9uIGRhdGEgb3IgdHJpZ2dlciByZWFsIGFsZXJ0cywgcG90ZW50aWFsbHkgYWZmZWN0aW5nIHJlYWwgdXNlcnMuIFVzZSBhIGRlZGljYXRlZCB0ZXN0aW5nIGVudmlyb25tZW50IHRoYXQgbWlycm9ycyBwcm9kdWN0aW9uIGNvbmZpZ3VyYXRpb24sIG9yIHVzZSBhIGRhdGFiYXNlIHNuYXBzaG90IHRoYXQgeW91IHJlZnJlc2ggYmVmb3JlIGVhY2ggdGVzdCBydW4uCgo8cD5UZXN0IGRhdGEgbXVzdCBiZSByZWFsaXN0aWMgaW4gYm90aCB2b2x1bWUgYW5kIGRpc3RyaWJ1dGlvbi4gSWYgeW91ciBwcm9kdWN0aW9uIGRhdGFiYXNlIGhhcyAxMCBtaWxsaW9uIHJlY29yZHMgYW5kIHlvdXIgdGVzdCBkYXRhYmFzZSBoYXMgMTAsMDAwLCBxdWVyeSBwZXJmb3JtYW5jZSB3aWxsIGJlIHNpZ25pZmljYW50bHkgZGlmZmVyZW50LiBDYWNoZSBiZWhhdmlvdXIgYWxzbyBjaGFuZ2VzIHdpdGggZGF0YSB2b2x1bWUuIFVzZSBzYW5pdGlzZWQgcHJvZHVjdGlvbiBkYXRhIHNhbXBsZXMgZm9yIGxvYWQgdGVzdGluZyByYXRoZXIgdGhhbiBzeW50aGV0aWMgZGF0YSB0aGF0IGRvZXMgbm90IHJlZmxlY3QgcmVhbCBkYXRhIGRpc3RyaWJ1dGlvbnMuPC9wPgoKPHA+Q29uc2lkZXIgdGhlIGZ1bGwgc3RhY2sgaW4geW91ciB0ZXN0IGVudmlyb25tZW50LiBBIGxvYWQgdGVzdCBhZ2FpbnN0IGEgc2NhbGVkLWRvd24gdGVzdCBlbnZpcm9ubWVudCB0aGF0IHVzZXMgYSBmcmFjdGlvbiBvZiB0aGUgcHJvZHVjdGlvbiBpbmZyYXN0cnVjdHVyZSB3aWxsIG5vdCBnaXZlIHlvdSBhY2N1cmF0ZSByZXN1bHRzLiBZb3VyIHRlc3QgZW52aXJvbm1lbnQgc2hvdWxkIG1pcnJvciBwcm9kdWN0aW9uIGFzIGNsb3NlbHkgYXMgcG9zc2libGUsIGluY2x1ZGluZyBsb2FkIGJhbGFuY2VyIGNvbmZpZ3VyYXRpb24sIGF1dG8tc2NhbGluZyBzZXR0aW5ncywgYW5kIGRhdGFiYXNlIHNpemluZy48L3A+Cgo8cD5Gb3IgQVBJIHRlc3RpbmcsIGVuc3VyZSB5b3VyIHRlc3QgZW52aXJvbm1lbnQgdXNlcyByZWFsaXN0aWMgdGhpcmQtcGFydHkgc2VydmljZSBzdHVicy4gSWYgeW91ciBhcHBsaWNhdGlvbiBjYWxscyBleHRlcm5hbCBwYXltZW50IHByb3ZpZGVycywgZW1haWwgc2VydmljZXMsIG9yIG90aGVyIEFQSXMsIHlvdXIgdGVzdCBlbnZpcm9ubWVudCBzaG91bGQgZWl0aGVyIHVzZSBtb2NrIHNlcnZpY2VzIG9yIHNhbmRib3ggZW5kcG9pbnRzIHRoYXQgY2FuIGhhbmRsZSB5b3VyIHRlc3QgbG9hZCB3aXRob3V0IHJhdGUgbGltaXRpbmcgb3IgY2hhcmdlcy48L3A+Cgo8aDI+UnVubmluZyBMb2FkIFRlc3RzIGFzIFBhcnQgb2YgUmVndWxhciBNYWludGVuYW5jZTwvaDI+CgpMb2FkIHRlc3RpbmcgaXMgbW9zdCB2YWx1YWJsZSB3aGVuIHJ1biByZWd1bGFybHkgcmF0aGVyIHRoYW4gb25seSBiZWZvcmUgbWFqb3IgcmVsZWFzZXMuIFBlcmZvcm1hbmNlIGNhbiBkZWdyYWRlIGdyYWR1YWxseSBhcyBkYXRhIGdyb3dzLCBhcyBkZXBlbmRlbmNpZXMgY2hhbmdlLCBvciBhcyB1c2FnZSBwYXR0ZXJucyBzaGlmdC4gQSBiYXNlbGluZSB0ZXN0IHJ1biBkdXJpbmcgZGV2ZWxvcG1lbnQgaGVscHMgeW91IGNhdGNoIHJlZ3Jlc3Npb25zIGJlZm9yZSB0aGV5IHJlYWNoIHByb2R1Y3Rpb24uCgo8cD5BdXRvbWF0aW5nIGxvYWQgdGVzdHMgaW4geW91ciBkZXBsb3ltZW50IHBpcGVsaW5lIHByb3ZpZGVzIGNvbnNpc3RlbnQgcGVyZm9ybWFuY2UgdmFsaWRhdGlvbi4gSWYgYSBkZXBsb3ltZW50IGNhdXNlcyBhIG1lYXN1cmFibGUgcGVyZm9ybWFuY2UgcmVncmVzc2lvbiwgYXV0b21hdGVkIHRlc3RzIGNhbiBibG9jayB0aGUgZGVwbG95bWVudCBvciBhbGVydCB5b3VyIHRlYW0gYmVmb3JlIHRoZSBjaGFuZ2UgYWZmZWN0cyB1c2Vycy4gVGhpcyBhcHByb2FjaCB3b3JrcyB3ZWxsIGFsb25nc2lkZSBpbmZyYXN0cnVjdHVyZSBtb25pdG9yaW5nIGFuZCByZWd1bGFyIHNlcnZlciBtYWludGVuYW5jZS48L3A+Cgo8cD5Db25zaWRlciBzY2hlZHVsaW5nIGJhc2VsaW5lIGxvYWQgdGVzdHMgdG8gcnVuIG9uIGEgcmVndWxhciBjYWRlbmNlOiB3ZWVrbHkgZm9yIGhpZ2gtdHJhZmZpYyBhcHBsaWNhdGlvbnMsIG1vbnRobHkgZm9yIHN0YWJsZSBhcHBsaWNhdGlvbnMuIENvbXBhcmUgcmVzdWx0cyBvdmVyIHRpbWUgdG8gaWRlbnRpZnkgZ3JhZHVhbCBkZWdyYWRhdGlvbiBiZWZvcmUgaXQgYmVjb21lcyBhIHByb2JsZW0uIFN0b3JlIHRlc3QgcmVzdWx0cyBpbiBhIHZlcnNpb24gY29udHJvbCBzeXN0ZW0gb3IgcmVzdWx0cyBkYXRhYmFzZSBzbyB5b3UgaGF2ZSBoaXN0b3JpY2FsIGRhdGEgdG8gcmVmZXJlbmNlIHdoZW4gaW52ZXN0aWdhdGluZyBpbmNpZGVudHMuPC9wPgoKPGgyPldoZW4gdG8gR2V0IEhlbHAgV2l0aCBMb2FkIFRlc3Rpbmc8L2gyPgoKSWYgeW91IGFyZSBzZXR0aW5nIHVwIGxvYWQgdGVzdGluZyBmb3IgdGhlIGZpcnN0IHRpbWUgYW5kIHdhbnQgdmFsaWRhdGlvbiB0aGF0IHlvdXIgc2NyaXB0cyBhcmUgcmVhbGlzdGljLCBhbiBleHBlcmllbmNlZCBJVCBzcGVjaWFsaXN0IGNhbiByZXZpZXcgeW91ciB0ZXN0IGRlc2lnbiBhbmQgc3VnZ2VzdCBpbXByb3ZlbWVudHMuIElmIHlvdXIgbG9hZCB0ZXN0cyBjb25zaXN0ZW50bHkgc2hvdyBwcm9ibGVtcyB5b3UgY2Fubm90IHJlcHJvZHVjZSBpbiBkZXZlbG9wbWVudCwgb3IgaWYgcGVyZm9ybWFuY2UgaXNzdWVzIG9ubHkgYXBwZWFyIHVuZGVyIGxvYWQsIHByb2Zlc3Npb25hbCBkZWJ1Z2dpbmcgaGVscCBjYW4gaWRlbnRpZnkgcm9vdCBjYXVzZXMgZmFzdGVyIHRoYW4gdHJpYWwgYW5kIGVycm9yLgoKPHA+Rm9yIGJ1c2luZXNzZXMgcnVubmluZyBjcml0aWNhbCB3ZWIgYXBwbGljYXRpb25zLCBpbnRlZ3JhdGluZyBsb2FkIHRlc3RpbmcgaW50byByZWd1bGFyIHRlY2huaWNhbCBzdXBwb3J0IGFuZCBtYWludGVuYW5jZSByb3V0aW5lcyBoZWxwcyBjYXRjaCBwZXJmb3JtYW5jZSBpc3N1ZXMgYmVmb3JlIHRoZXkgYmVjb21lIHVzZXItZmFjaW5nIHByb2JsZW1zLiBXaGV0aGVyIHlvdSBoYW5kbGUgdGhpcyBpbnRlcm5hbGx5IG9yIHdvcmsgd2l0aCBhbiBleHRlcm5hbCBzcGVjaWFsaXN0IGRlcGVuZHMgb24geW91ciB0ZWFtJ3MgZXhpc3RpbmcgZXhwZXJ0aXNlIGFuZCB0aGUgY29tcGxleGl0eSBvZiB5b3VyIGluZnJhc3RydWN0dXJlLjwvcD4KCjxwPklmIHlvdSB3YW50IGEgcHJhY3RpY2FsIHJldmlldyBvZiB5b3VyIGN1cnJlbnQgdGVzdGluZyBzZXR1cCwgeW91IGNhbiA8YSBocmVmPSIvI2NvbnRhY3QiPmdldCBpbiB0b3VjaDwvYT4gd2l0aCBkZXRhaWxzIG9mIHlvdXIgYXBwbGljYXRpb24gYXJjaGl0ZWN0dXJlLCBjdXJyZW50IHBlcmZvcm1hbmNlIGNvbmNlcm5zLCBhbmQgd2hhdCB5b3Ugd2FudCB5b3VyIGxvYWQgdGVzdHMgdG8gdmFsaWRhdGUuPC9wPgoKPGgyPkZyZXF1ZW50bHkgQXNrZWQgUXVlc3Rpb25zPC9oMj4KCjxoMz5Ib3cgbWFueSB2aXJ0dWFsIHVzZXJzIGRvIEkgbmVlZCBpbiBteSBsb2FkIHRlc3Q/PC9oMz4KPHA+U3RhcnQgd2l0aCBhIHNtYWxsIG51bWJlciBhbmQgaW5jcmVhc2UgdW50aWwgeW91IGZpbmQgdGhlIGxpbWl0IG9yIHJ1biBsb25nIGVub3VnaCB0byBiZSBjb25maWRlbnQgaW4geW91ciByZXN1bHRzLiBUaGVyZSBpcyBubyB1bml2ZXJzYWwgZm9ybXVsYS4gVGhlIHJpZ2h0IG51bWJlciBkZXBlbmRzIG9uIHlvdXIgZXhwZWN0ZWQgcGVhayBjb25jdXJyZW50IHVzZXJzLCB5b3VyIFNMQXMgZm9yIHJlc3BvbnNlIHRpbWUgYXQgcGVhayBsb2FkLCBhbmQgaG93IG11Y2ggaGVhZHJvb20geW91IHdhbnQgYmV0d2VlbiBleHBlY3RlZCBwZWFrIGFuZCB0ZXN0ZWQgbWF4aW11bS4gQSBwcmFjdGljYWwgYXBwcm9hY2ggaXMgdG8gdGVzdCBhdCA1MCBwZXJjZW50LCAxMDAgcGVyY2VudCwgYW5kIDE1MCBwZXJjZW50IG9mIHlvdXIgZXhwZWN0ZWQgcGVhayBjb25jdXJyZW50IHVzZXJzIGFuZCBtZWFzdXJlIHJlc3BvbnNlIHRpbWVzIGF0IGVhY2ggbGV2ZWwuPC9wPgoKPGgzPkNhbiBrNiB0ZXN0IEFQSXMgd2l0aCBjb21wbGV4IGF1dGhlbnRpY2F0aW9uPzwvaDM+CjxwPlllcy4gazYgc3VwcG9ydHMgQmVhcmVyIHRva2VucywgQVBJIGtleXMsIE9BdXRoIDIuMCBjbGllbnQgY3JlZGVudGlhbHMsIGFuZCBKV1QgYXV0aGVudGljYXRpb24uIEZvciBPQXV0aCwgdXNlIGs2J3MgdG9rZW4gZXhjaGFuZ2UgZW5kcG9pbnQgdG8gb2J0YWluIGFuIGFjY2VzcyB0b2tlbiBiZWZvcmUgcnVubmluZyB0aGUgdGVzdCBhbmQgaW5jbHVkZSBpdCBpbiBzdWJzZXF1ZW50IHJlcXVlc3RzIHZpYSB0aGUgQXV0aG9yaXphdGlvbiBoZWFkZXIuIEZvciBKV1QgYXV0aGVudGljYXRpb24sIHVzZSBhIGxpYnJhcnkgbGlrZSA8Y29kZT5qb3NlPC9jb2RlPiB3aXRoaW4geW91ciBrNiBzY3JpcHQgdG8gZ2VuZXJhdGUgc2lnbmVkIHRva2VucyBhdCBydW50aW1lLCB3aGljaCBpcyB1c2VmdWwgZm9yIHRlc3RpbmcgbWljcm9zZXJ2aWNlcyB0aGF0IHVzZSBKV1QgZm9yIHNlcnZpY2UtdG8tc2VydmljZSBhdXRoZW50aWNhdGlvbi48L3A+Cgo8aDM+SG93IGxvbmcgc2hvdWxkIGEgbG9hZCB0ZXN0IHJ1bj88L2gzPgo8cD5TaG9ydCB0ZXN0cyBvZiAzMCBzZWNvbmRzIHRvIDEgbWludXRlIGFyZSB1c2VmdWwgZm9yIHF1aWNrIHZhbGlkYXRpb24gZHVyaW5nIGRldmVsb3BtZW50LiBMb25nZXIgdGVzdHMgb2YgNSB0byAzMCBtaW51dGVzIHJldmVhbCBpc3N1ZXMgdGhhdCBvbmx5IGFwcGVhciB1bmRlciBzdXN0YWluZWQgbG9hZCwgc3VjaCBhcyBtZW1vcnkgbGVha3MsIGNvbm5lY3Rpb24gcG9vbCBleGhhdXN0aW9uLCBhbmQgY2FjaGUgZGVncmFkYXRpb24uIEZvciBjYXBhY2l0eSBwbGFubmluZywgcnVuIHRlc3RzIGxvbmcgZW5vdWdoIHRvIHJlYWNoIGEgc3RlYWR5IHN0YXRlIHdoZXJlIHBlcmZvcm1hbmNlIG1ldHJpY3MgYXJlIGNvbnNpc3RlbnQuIEZpZnRlZW4gdG8gdGhpcnR5IG1pbnV0ZXMgYXQgcGVhayBsb2FkIGlzIHVzdWFsbHkgc3VmZmljaWVudCB0byBpZGVudGlmeSBzdGVhZHktc3RhdGUgYmVoYXZpb3VyLjwvcD4KCjxoMz5TaG91bGQgSSB0ZXN0IHdpdGggcmFuZG9tIGRhdGEgb3IgZml4ZWQgcGF0dGVybnM/PC9oMz4KPHA+VXNlIGEgbWl4IG9mIGJvdGguIEZpeGVkIHBhdHRlcm5zIGVuc3VyZSByZXBlYXRhYmlsaXR5IHNvIHlvdSBjYW4gY29tcGFyZSByZXN1bHRzIGJldHdlZW4gdGVzdCBydW5zLiBSYW5kb20gZGF0YSBlbnN1cmVzIHlvdXIgdGVzdHMgZXhlcmNpc2UgYSByYW5nZSBvZiB5b3VyIHN5c3RlbSByYXRoZXIgdGhhbiBvcHRpbWlzaW5nIGZvciBhIHNpbmdsZSBxdWVyeSBwYXRoLiBGb3IgbW9zdCB0ZXN0cywgZ2VuZXJhdGluZyByYW5kb20gSURzLCB1c2VybmFtZXMsIG9yIHNlYXJjaCB0ZXJtcyB3aXRoaW4gcmVhbGlzdGljIHJhbmdlcyBwcm9kdWNlcyBiZXR0ZXIgcmVzdWx0cyB0aGFuIGFsd2F5cyB1c2luZyB0aGUgc2FtZSB0ZXN0IGRhdGEuPC9wPgoKPGgzPkhvdyBkbyBJIGtub3cgaWYgbXkgdGVzdCBlbnZpcm9ubWVudCBpcyByZWFsaXN0aWMgZW5vdWdoPzwvaDM+CjxwPkNvbXBhcmUgeW91ciB0ZXN0IHJlc3VsdHMgYWdhaW5zdCBwcm9kdWN0aW9uIG1vbml0b3JpbmcgZHVyaW5nIG5vcm1hbCB0cmFmZmljLiBJZiB5b3VyIGxvYWQgdGVzdCBzaG93cyB2ZXJ5IGRpZmZlcmVudCBjaGFyYWN0ZXJpc3RpY3MgdGhhbiBwcm9kdWN0aW9uIGF0IHRoZSBzYW1lIGNvbmN1cnJlbmN5IGxldmVsLCB5b3VyIHRlc3QgZW52aXJvbm1lbnQgaXMgbm90IHJlcHJlc2VudGF0aXZlLiBDb21tb24gc291cmNlcyBvZiBkaWZmZXJlbmNlIGluY2x1ZGUgZGF0YWJhc2Ugc2l6ZSBhbmQgaW5kZXhpbmcsIGNhY2hlIGNvbmZpZ3VyYXRpb24sIHRoaXJkLXBhcnR5IHNlcnZpY2UgYXZhaWxhYmlsaXR5LCBhbmQgaW5mcmFzdHJ1Y3R1cmUgc2l6aW5nLiBZb3VyIHRlc3QgZW52aXJvbm1lbnQgc2hvdWxkIGJlIHByb2R1Y3Rpb24tZXF1aXZhbGVudCBpbiBhbGwgZGltZW5zaW9ucyB0aGF0IGFmZmVjdCBwZXJmb3JtYW5jZS48L3A+
INITIATE_COLLABORATION
Ready to deploy these insights into your own infrastructure? Our labs are open for partnerships.