diff --git "a/app.py" "b/app.py" --- "a/app.py" +++ "b/app.py" @@ -1 +1 @@ -IiIiClJob2Rhd2sgQUkg4oCUIEF1dG9ub21vdXMgRGV2U2VjT3BzIENvbnRyb2wgUGxhbmUgdjQuMAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpGdWxsIGxvb3A6CiAgMS4gQ2xvbmUgcmVwbyDihpIgZGlzY292ZXIgdGVzdHMg4oaSIHJ1biBweXRlc3QKICAyLiBGQUlMIOKGkiByZXRyaWV2ZSBzaW1pbGFyIGZpeGVzIGZyb20gbWVtb3J5IChkYXRhIGZseXdoZWVsKQogIDMuIERpc3BhdGNoIEFpZGVyIHdpdGggZmFpbHVyZSArIG1lbW9yeSBjb250ZXh0IHZpYSBNQ1AgdG9vbHMKICA0LiBSZS1ydW4gdGVzdHMgb24gdGhlIHBhdGNoZWQgY29kZSAodmVyaWZpY2F0aW9uIOKAlCBDTE9TRVMgVEhFIExPT1ApCiAgNS4gSWYgc3RpbGwgZmFpbGluZyDihpIgcmV0cnkgd2l0aCBuZXcgZmFpbHVyZSBjb250ZXh0ICh1cCB0byBNQVhfUkVUUklFUykKICA2LiBTQVNUIGdhdGU6IGJhbmRpdCArIDE2LXBhdHRlcm4gc2VjcmV0IHNjYW5uZXIKICA3LiBTdXBwbHkgY2hhaW4gZ2F0ZTogcGlwLWF1ZGl0ICsgdHlwb3NxdWF0dGluZyBkZXRlY3Rpb24KICA4LiBBZHZlcnNhcmlhbCBMTE0gcmV2aWV3OiAzLW1vZGVsIGNvbmN1cnJlbnQgY29uc2Vuc3VzIChRd2Vu4oilR2VtbWHiiKVNaXN0cmFsKQogIDkuIFozIGZvcm1hbCB2ZXJpZmljYXRpb24gZ2F0ZSAoYm91bmRlZCBpbnRlZ2VyL2JvdW5kcyBjaGVja2luZykKICAxMC4gSWYgYWR2ZXJzYXJ5IFJFSkVDVHMg4oaSIGxvb3AgYmFjayB3aXRoIGNyaXRpcXVlIGFzIGNvbnRleHQKICAxMS4gQ29udmljdGlvbiBlbmdpbmU6IGF1dG8tbWVyZ2UgaWYgYWxsIHRydXN0IGNyaXRlcmlhIG1ldAogIDEyLiBBbGwgY2xlYXIg4oaSIG9wZW4gUFIsIHJlY29yZCB0byB0cmFpbmluZyBzdG9yZSwgdXBkYXRlIG1lbW9yeQogIDEzLiBMb1JBIHNjaGVkdWxlcjogZXhwb3J0IHRyYWluaW5nIGRhdGEgd2hlbiB0aHJlc2hvbGQgcmVhY2hlZAogIDE0LiBSZXBvIGhhcnZlc3RlcjogYXV0b25vbW91cyB0YXJnZXQgc2VsZWN0aW9uIChhbnRhZ29uaXN0IG1vZGUpCiAgMTUuIFdlYmhvb2sgc2VydmVyIHJ1bnMgaW4gcGFyYWxsZWwgZm9yIGV2ZW50LWRyaXZlbiB0cmlnZ2VycwoiIiIKCmltcG9ydCBoYXNobGliCmltcG9ydCBqc29uCmltcG9ydCBvcwppbXBvcnQgc2lnbmFsCmltcG9ydCBzdWJwcm9jZXNzCmltcG9ydCB0ZW1wZmlsZQppbXBvcnQgdGhyZWFkaW5nCmltcG9ydCB0aW1lCmZyb20gdHlwaW5nIGltcG9ydCBPcHRpb25hbAoKaW1wb3J0IGdyYWRpbyBhcyBncgppbXBvcnQgcmVxdWVzdHMKZnJvbSBnaXQgaW1wb3J0IFJlcG8KZnJvbSB0ZW5hY2l0eSBpbXBvcnQgcmV0cnksIHN0b3BfYWZ0ZXJfYXR0ZW1wdCwgd2FpdF9leHBvbmVudGlhbAoKZnJvbSBhZHZlcnNhcmlhbF9yZXZpZXdlciBpbXBvcnQgcnVuX2FkdmVyc2FyaWFsX3Jldmlldwpmcm9tIGhlcm1lc19vcmNoZXN0cmF0b3IgaW1wb3J0ICgKICAgIHJ1bl9oZXJtZXNfcmVzZWFyY2gsIGdldF9oZXJtZXNfbG9ncywgZ2V0X3Nlc3Npb25fc3VtbWFyeSwKICAgIGNvbXB1dGVfdmVzLCBidWlsZF90dmcsCikKZnJvbSBib3VudHlfZ2F0ZXdheSBpbXBvcnQgKAogICAgZ2V0X3BpcGVsaW5lLCBnZXRfcGlwZWxpbmVfc3VtbWFyeSwgaHVtYW5fYXBwcm92ZSwgaHVtYW5fcmVqZWN0LAogICAgc3VibWl0X3RvX2hhY2tlcm9uZSwgc3VibWl0X2dpdGh1Yl9hZHZpc29yeSwgYWRkX3RvX3BpcGVsaW5lLAopCmZyb20gdnVsbl9jbGFzc2lmaWVyIGltcG9ydCBjbGFzc2lmeV92dWxuZXJhYmlsaXR5LCBnZXRfYWxsX2N3ZXMKZnJvbSBhdWRpdF9sb2dnZXIgaW1wb3J0IGV4cG9ydF9jb21wbGlhbmNlX3JlcG9ydCwgbG9nX2F1ZGl0X2V2ZW50LCByZWFkX2F1ZGl0X3RyYWlsLCB2ZXJpZnlfY2hhaW5faW50ZWdyaXR5CmZyb20gY29udmljdGlvbl9lbmdpbmUgaW1wb3J0IGV2YWx1YXRlX2NvbnZpY3Rpb24sIGF1dG9fbWVyZ2VfcHIKZnJvbSBmb3JtYWxfdmVyaWZpZXIgaW1wb3J0IHJ1bl9mb3JtYWxfdmVyaWZpY2F0aW9uCmZyb20gZ2l0aHViX2FwcCBpbXBvcnQgZ2V0X2dpdGh1Yl90b2tlbgpmcm9tIGpvYl9xdWV1ZSBpbXBvcnQgSm9iU3RhdHVzLCBnZXRfam9iX3N0YXR1c19lbnVtLCBnZXRfbWV0cmljcywgbGlzdF9hbGxfam9icywgdXBzZXJ0X2pvYgpmcm9tIGxvcmFfc2NoZWR1bGVyIGltcG9ydCBtYXliZV90cmlnZ2VyX3RyYWluaW5nLCBnZXRfc2NoZWR1bGVyX3N0YXR1cwpmcm9tIG1lbW9yeV9lbmdpbmUgaW1wb3J0IGdldF9tZW1vcnlfc3RhdHMsIHJlY29yZF9maXhfb3V0Y29tZSwgcmV0cmlldmVfc2ltaWxhcl9maXhlcwpmcm9tIGVtYmVkZGluZ19tZW1vcnkgaW1wb3J0IHJldHJpZXZlX3NpbWlsYXJfZml4ZXNfdjIKZnJvbSBub3RpZmllciBpbXBvcnQgKAogICAgbm90aWZ5LAogICAgbm90aWZ5X2F1ZGl0X2NvbXBsZXRlLAogICAgbm90aWZ5X2F1ZGl0X3N0YXJ0LAogICAgbm90aWZ5X2NoYWluX2ludGVncml0eSwKICAgIG5vdGlmeV9wYXRjaF9mYWlsZWQsCiAgICBub3RpZnlfcHJfY3JlYXRlZCwKICAgIG5vdGlmeV9zYXN0X2Jsb2NrZWQsCiAgICBub3RpZnlfdGVzdF9mYWlsZWQsCikKZnJvbSBzYXN0X2dhdGUgaW1wb3J0IHJ1bl9zYXN0X2dhdGUKZnJvbSByZWRfdGVhbV9mdXp6ZXIgaW1wb3J0IGdldF9yZWRfdGVhbV9sb2dzLCBnZXRfcmVkX3RlYW1fc3RhdHMsIHJ1bl9yZWRfdGVhbV9jZWdpcwpmcm9tIHN1cHBseV9jaGFpbiBpbXBvcnQgcnVuX3N1cHBseV9jaGFpbl9nYXRlCmZyb20gdHJhaW5pbmdfc3RvcmUgaW1wb3J0IGV4cG9ydF90cmFpbmluZ19kYXRhLCBnZXRfc3RhdGlzdGljcywgaW5pdGlhbGl6ZV9zdG9yZSwgcmVjb3JkX2F0dGVtcHQsIHVwZGF0ZV90ZXN0X3Jlc3VsdApmcm9tIHZlcmlmaWNhdGlvbl9sb29wIGltcG9ydCAoCiAgICBNQVhfUkVUUklFUywKICAgIEFEVkVSU0FSSUFMX1JFSkVDVElPTl9NVUxUSVBMSUVSLAogICAgVmVyaWZpY2F0aW9uQXR0ZW1wdCwKICAgIFZlcmlmaWNhdGlvblJlc3VsdCwKICAgIGJ1aWxkX2luaXRpYWxfcHJvbXB0LAogICAgYnVpbGRfcmV0cnlfcHJvbXB0LAopCmZyb20gd2ViaG9va19zZXJ2ZXIgaW1wb3J0IHNldF9qb2JfZGlzcGF0Y2hlciwgc3RhcnRfd2ViaG9va19zZXJ2ZXIKZnJvbSB3b3JrZXJfcG9vbCBpbXBvcnQgTUFYX1dPUktFUlMsIHJ1bl9wYXJhbGxlbF9hdWRpdApmcm9tIGxhbmd1YWdlX3J1bnRpbWUgaW1wb3J0IFJ1bnRpbWVGYWN0b3J5LCBMYW5ndWFnZVJ1bnRpbWUsIEVudkNvbmZpZwoKIyBNb2R1bGUtbGV2ZWwgcnVudGltZSBoYW5kbGUg4oCUIHNldCBvbmNlIHBlciBhdWRpdCBydW4uCiMgQlVHLTAwNyBGSVg6IFByb3RlY3RlZCBieSBhIGxvY2sgc28gY29uY3VycmVudCB3ZWJob29rLXRyaWdnZXJlZCBhdWRpdHMgZG8gbm90CiMgb3ZlcndyaXRlIF9hY3RpdmVfcnVudGltZSB3aGlsZSB3b3JrZXJzIGFyZSBtaWQtZmxpZ2h0IHJlYWRpbmcgaXQuCl9hY3RpdmVfcnVudGltZTogTGFuZ3VhZ2VSdW50aW1lIHwgTm9uZSA9IE5vbmUKX2FjdGl2ZV9ydW50aW1lX2xvY2sgPSB0aHJlYWRpbmcuTG9jaygpCgojIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAojIFNFQ1JFVFMg4oCUIGVudiBvbmx5LCBuZXZlciBoYXJkY29kZWQKIyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKR0lUSFVCX1RPS0VOID0gb3MuZ2V0ZW52KCJHSVRIVUJfVE9LRU4iKQpHSVRIVUJfUkVQTyA9IG9zLmdldGVudigiR0lUSFVCX1JFUE8iLCAiIikgICAgICAgICAgIyBPcHRpb25hbCDigJQgY2FuIGJlIHNldCB2aWEgY2hhdCBpbmJveApPUEVOUk9VVEVSX0FQSV9LRVkgPSBvcy5nZXRlbnYoIk9QRU5ST1VURVJfQVBJX0tFWSIpClRFTkFOVF9JRCA9IG9zLmdldGVudigiUkhPREFXS19URU5BTlRfSUQiLCAiZGVmYXVsdCIpCk1PREVMID0gb3MuZ2V0ZW52KCJSSE9EQVdLX01PREVMIiwgIm9wZW5yb3V0ZXIvcXdlbi9xd2VuLTIuNS1jb2Rlci0zMmItaW5zdHJ1Y3Q6ZnJlZSIpClJFRF9URUFNX0VOQUJMRUQgPSBvcy5nZXRlbnYoIlJIT0RBV0tfUkVEX1RFQU1fRU5BQkxFRCIsICJ0cnVlIikubG93ZXIoKSAhPSAiZmFsc2UiCgojIE9ubHkgR0lUSFVCX1RPS0VOIGFuZCBPUEVOUk9VVEVSX0FQSV9LRVkgYXJlIHRydWx5IHJlcXVpcmVkIGF0IHN0YXJ0dXAuCiMgR0lUSFVCX1JFUE8gaXMgbm93IG9wdGlvbmFsIOKAlCBpdCBjYW4gYmUgc3VwcGxpZWQgdmlhIHRoZSBjaGF0IGluYm94IGF0IHJ1bnRpbWUuCmZvciBfa2V5LCBfdmFsIGluIFsoIkdJVEhVQl9UT0tFTiIsIEdJVEhVQl9UT0tFTiksICgiT1BFTlJPVVRFUl9BUElfS0VZIiwgT1BFTlJPVVRFUl9BUElfS0VZKV06CiAgICBpZiBub3QgX3ZhbDoKICAgICAgICByYWlzZSBFbnZpcm9ubWVudEVycm9yKAogICAgICAgICAgICBmIlJlcXVpcmVkIHNlY3JldCAne19rZXl9JyBpcyBub3Qgc2V0LiAiCiAgICAgICAgICAgICJBZGQgaXQgaW4gSHVnZ2luZ0ZhY2UgU3BhY2UgU2V0dGluZ3Mg4oaSIFNlY3JldHMuIgogICAgICAgICkKCiMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiMgUEFUSFMgJiBDT05TVEFOVFMKIyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKUEVSU0lTVEVOVF9ESVIgPSAiL2RhdGEiClJFUE9fRElSID0gZiJ7UEVSU0lTVEVOVF9ESVJ9L3JlcG8iICAgICAgICAgICMgZGVmYXVsdDsgb3ZlcnJpZGRlbiBwZXItYXVkaXQgYmVsb3cKVkVOVl9ESVIgPSBmIntQRVJTSVNURU5UX0RJUn0vdGFyZ2V0X3ZlbnYiCk1DUF9SVU5USU1FX0NPTkZJRyA9ICIvdG1wL21jcF9ydW50aW1lLmpzb24iCgojIOKUgOKUgCBQZXItYXVkaXQgcmVwbyBkaXIg4oCUIHVwZGF0ZWQgYXRvbWljYWxseSBhdCBhdWRpdCBzdGFydCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKIyBCZWNhdXNlIF9hdWRpdF9ldmVudCBlbnN1cmVzIG9ubHkgb25lIGF1ZGl0IHJ1bnMgYXQgYSB0aW1lLCB1cGRhdGluZyB0aGlzCiMgZ2xvYmFsIGF0IGF1ZGl0IHN0YXJ0IGlzIHNhZmUgd2l0aG91dCBhbiBhZGRpdGlvbmFsIGxvY2suCl9jdXJyZW50X3RhcmdldF9yZXBvOiBzdHIgPSAiIgoKIyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKIyBCVUctMDA1IEZJWDogRXhwbGljaXQgc3RhcnR1cCBpbml0aWFsaXphdGlvbiDigJQgZW5zdXJlcyBTUUxpdGUgdGFibGVzIGV4aXN0CiMgZXZlbiBpZiB0aGUgbW9kdWxlLWxldmVsIGNhbGwgaW4gdHJhaW5pbmdfc3RvcmUucHkgaXMgb3B0aW1pemVkIGF3YXkgb3IKIyB0aGUgaW1wb3J0IG9yZGVyIGNoYW5nZXMgaW4gdGhlIGZ1dHVyZS4KIyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKaW5pdGlhbGl6ZV9zdG9yZSgpCgojIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAojIEdMT0JBTCBTVEFURQojIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgApkYXNoYm9hcmRfbG9nczogbGlzdFtzdHJdID0gW10KX2xvZ19sb2NrID0gdGhyZWFkaW5nLkxvY2soKQpfYXVkaXRfZXZlbnQgPSB0aHJlYWRpbmcuRXZlbnQoKQoKIyBDaGF0IGluYm94IHN0YXRlIOKAlCBsaXN0IG9mIHsicm9sZSI6IC4uLiwgImNvbnRlbnQiOiAuLi59IGRpY3RzCl9pbmJveF9oaXN0b3J5OiBsaXN0W2RpY3RdID0gW10KX2luYm94X2xvY2sgPSB0aHJlYWRpbmcuTG9jaygpCgoKZGVmIHVpX2xvZyhtZXNzYWdlOiBzdHIsIGxldmVsOiBzdHIgPSAiSU5GTyIpOgogICAgdHMgPSB0aW1lLnN0cmZ0aW1lKCIlSDolTTolUyIpCiAgICBpY29ucyA9IHsiT0siOiAi4pyFIiwgIkZBSUwiOiAi4p2MIiwgIldBUk4iOiAi4pqgIiwgIlNBU1QiOiAi8J+boSIsICJBRFYiOiAi8J+UtCIsICJQUiI6ICLwn5SBIiwKICAgICAgICAgICAgICJTS0lQIjogIuKPrSIsICJNRU0iOiAi8J+noCIsICJDSEFJTiI6ICLim5MiLCAiU1VQUExZIjogIvCfk6YiLCAiUkVUUlkiOiAi8J+UhCIsICJJTkZPIjogIiAgIiwKICAgICAgICAgICAgICJSRUQiOiAi4pqU77iPIiwgIkFUVEFDSyI6ICLwn5ehIiwgIkNSQVNIIjogIvCfkqUiLCAiQkVOQ0giOiAi8J+nqiIsICJQT09MIjogIuKaoSJ9CiAgICBsaW5lID0gZiJbe3RzfV0ge2ljb25zLmdldChsZXZlbCwgJyAgJyl9IHttZXNzYWdlfSIKICAgIHByaW50KGxpbmUpCiAgICB3aXRoIF9sb2dfbG9jazoKICAgICAgICBkYXNoYm9hcmRfbG9ncy5hcHBlbmQobGluZSkKICAgICAgICBpZiBsZW4oZGFzaGJvYXJkX2xvZ3MpID4gMzAwOgogICAgICAgICAgICBkYXNoYm9hcmRfbG9ncy5wb3AoMCkKCgojIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAojIFNVQlBST0NFU1MgUlVOTkVSIOKAlCBzaGVsbD1GYWxzZSBlbmZvcmNlZCwgc2VjcmV0cyBzdHJpcHBlZAojIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgApkZWYgcnVuX3N1YnByb2Nlc3Nfc2FmZShjbWQ6IGxpc3QsIGN3ZDogc3RyID0gUkVQT19ESVIsIHRpbWVvdXQ6IGludCA9IDMwMCwKICAgICAgICAgICAgICAgICAgICAgICAgZW52X292ZXJyaWRlczogZGljdCA9IE5vbmUsIHJhaXNlX29uX2Vycm9yOiBib29sID0gVHJ1ZSkgLT4gdHVwbGVbc3RyLCBpbnRdOgogICAgaWYgaXNpbnN0YW5jZShjbWQsIHN0cik6CiAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJTRUNVUklUWTogU3RyaW5nIGNvbW1hbmRzIGZvcmJpZGRlbi4gVXNlIGxpc3QuIikKICAgIGVudiA9IG9zLmVudmlyb24uY29weSgpCiAgICBmb3IgayBpbiBbIk9QRU5ST1VURVJfQVBJX0tFWSIsICJHSVRIVUJfVE9LRU4iLCAiR0lUSFVCX1BFUlNPTkFMX0FDQ0VTU19UT0tFTiIsCiAgICAgICAgICAgICAgICJURUxFR1JBTV9CT1RfVE9LRU4iLCAiU0xBQ0tfV0VCSE9PS19VUkwiLCAiUkhPREFXS19XRUJIT09LX1NFQ1JFVCJdOgogICAgICAgIGVudi5wb3AoaywgTm9uZSkKICAgIGlmIGVudl9vdmVycmlkZXM6CiAgICAgICAgZW52LnVwZGF0ZShlbnZfb3ZlcnJpZGVzKQogICAgcHJvYyA9IE5vbmUKICAgIHRyeToKICAgICAgICBwcm9jID0gc3VicHJvY2Vzcy5Qb3BlbihjbWQsIHNoZWxsPUZhbHNlLCBjd2Q9Y3dkLCBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZGVycj1zdWJwcm9jZXNzLlBJUEUsIHRleHQ9VHJ1ZSwgZW52PWVudiwgc3RhcnRfbmV3X3Nlc3Npb249VHJ1ZSkKICAgICAgICBzdGRvdXQsIHN0ZGVyciA9IHByb2MuY29tbXVuaWNhdGUodGltZW91dD10aW1lb3V0KQogICAgICAgIG91dHB1dCA9IChzdGRvdXQgb3IgIiIpICsgIlxuIiArIChzdGRlcnIgb3IgIiIpCiAgICAgICAgaWYgcmFpc2Vfb25fZXJyb3IgYW5kIHByb2MucmV0dXJuY29kZSAhPSAwOgogICAgICAgICAgICByYWlzZSBzdWJwcm9jZXNzLkNhbGxlZFByb2Nlc3NFcnJvcihwcm9jLnJldHVybmNvZGUsIGNtZCwgc3Rkb3V0LCBzdGRlcnIpCiAgICAgICAgcmV0dXJuIG91dHB1dCwgcHJvYy5yZXR1cm5jb2RlCiAgICBleGNlcHQgc3VicHJvY2Vzcy5UaW1lb3V0RXhwaXJlZDoKICAgICAgICBpZiBwcm9jOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBvcy5raWxscGcob3MuZ2V0cGdpZChwcm9jLnBpZCksIHNpZ25hbC5TSUdLSUxMKQogICAgICAgICAgICBleGNlcHQgUHJvY2Vzc0xvb2t1cEVycm9yOgogICAgICAgICAgICAgICAgcGFzcwogICAgICAgICAgICBwcm9jLmNvbW11bmljYXRlKCkKICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoZiJDb21tYW5kIHRpbWVkIG91dCBhZnRlciB7dGltZW91dH1zOiB7Y21kWzBdfSIpCgoKIyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKIyBHSVQgSEVMUEVSUwojIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgApkZWYgY29uZmlndXJlX2dpdF9jcmVkZW50aWFscygpOgogICAgIiIiCiAgICBTZXQgdXAgZ2l0IGNyZWRlbnRpYWwgc3RvcmFnZS4KCiAgICBST09UIENBVVNFIEZJWDogdGhlIHByZXZpb3VzIGltcGxlbWVudGF0aW9uIGNhbGxlZAogICAgICAgIGdpdCBjb25maWcgLS1nbG9iYWwgY3JlZGVudGlhbC5oZWxwZXIgJ3N0b3JlIC0tZmlsZSAvdG1wLy5naXQtY3JlZGVudGlhbHMnCiAgICB3aGljaCB3cml0ZXMgdG8gJEhPTUUvLmdpdGNvbmZpZy4gSW4gSHVnZ2luZ0ZhY2UgU3BhY2VzICRIT01FPS9ob21lL3Job2Rhd2sKICAgIGlzIG9mdGVuIG5vdCB3cml0YWJsZSBhdCBjb250YWluZXIgcnVudGltZSwgY2F1c2luZyBleGl0LTI1NSAoZmF0YWwpLgoKICAgIEZpeDogd3JpdGUgdGhlIGdpdGNvbmZpZyBmaWxlIGRpcmVjdGx5IOKAlCBubyBnaXQgc3VicHJvY2VzcyBuZWVkZWQg4oCUCiAgICB0aGVuIGV4cG9ydCBHSVRfQ09ORklHX0dMT0JBTCBzbyBldmVyeSBzdWJzZXF1ZW50IGdpdCBjYWxsIGluIHRoaXMKICAgIHByb2Nlc3MgcGlja3MgaXQgdXAgYXV0b21hdGljYWxseSAob3MuZW52aXJvbiBpcyBjb3BpZWQgYnkgcnVuX3N1YnByb2Nlc3Nfc2FmZSkuCiAgICAiIiIKICAgIGNyZWRfcGF0aCA9ICIvdG1wLy5naXQtY3JlZGVudGlhbHMiCiAgICB3aXRoIG9wZW4oY3JlZF9wYXRoLCAidyIpIGFzIGY6CiAgICAgICAgZi53cml0ZShmImh0dHBzOi8veC10b2tlbjp7R0lUSFVCX1RPS0VOfUBnaXRodWIuY29tXG4iKQogICAgb3MuY2htb2QoY3JlZF9wYXRoLCAwbzYwMCkKCiAgICBnaXRjb25maWdfcGF0aCA9ICIvdG1wLy5naXRjb25maWciCiAgICB3aXRoIG9wZW4oZ2l0Y29uZmlnX3BhdGgsICJ3IikgYXMgZjoKICAgICAgICBmLndyaXRlKAogICAgICAgICAgICBmIltjcmVkZW50aWFsXVxuXHRoZWxwZXIgPSBzdG9yZSAtLWZpbGUge2NyZWRfcGF0aH1cbiIKICAgICAgICAgICAgZiJbdXNlcl1cblx0bmFtZSA9IFJob2Rhd2sgQUlcblx0ZW1haWwgPSBhZ2VudEByaG9kYXdrLmFpXG4iCiAgICAgICAgICAgIGYiW3NhZmVdXG5cdGRpcmVjdG9yeSA9ICpcbiIKICAgICAgICApCiAgICBvcy5jaG1vZChnaXRjb25maWdfcGF0aCwgMG82MDApCgogICAgIyBFeHBvcnQgdG8gcGFyZW50IHByb2Nlc3MgZW52IOKAlCBhbGwgY2hpbGQgc3VicHJvY2Vzc2VzIGluaGVyaXQgdGhpcwogICAgb3MuZW52aXJvblsiR0lUX0NPTkZJR19HTE9CQUwiXSA9IGdpdGNvbmZpZ19wYXRoCiAgICB1aV9sb2coZiJHaXQgY3JlZGVudGlhbHMgY29uZmlndXJlZCDihpIge2dpdGNvbmZpZ19wYXRofSIsICJJTkZPIikKCgpkZWYgd3JpdGVfbWNwX2NvbmZpZygpIC0+IHN0cjoKICAgICIiIgogICAgV3JpdGUgdGhlIGZ1bGwgMjUtc2VydmVyIGN5YmVyc2VjdXJpdHkgTUNQIGNvbmZpZyB0byAvdG1wL21jcF9ydW50aW1lLmpzb24uCiAgICBTZWNyZXRzIGFyZSBpbmplY3RlZCBmcm9tIGVudmlyb25tZW50IGF0IHJ1bnRpbWUg4oCUIG5ldmVyIHN0b3JlZCBpbiBzb3VyY2UuCiAgICBSaG9kYXdrIEFJIHY1LjAg4oCUIE9wZW5DbGF3IEhlcm1lcyBhZ2VudCBNQ1Agc3VpdGUuCiAgICAiIiIKICAgIF9mZXRjaF9kb21haW5zID0gIiwiLmpvaW4oX2FjdGl2ZV9ydW50aW1lLmdldF9tY3BfZG9tYWlucygpKSBpZiBfYWN0aXZlX3J1bnRpbWUgZWxzZSAoCiAgICAgICAgImRvY3MucHl0aG9uLm9yZyxweXBpLm9yZyxkb2NzLmdpdGh1Yi5jb20scGFja2FnaW5nLnB5dGhvbi5vcmcscGVwcy5weXRob24ub3JnLCIKICAgICAgICAiY3dlLm1pdHJlLm9yZyxudmQubmlzdC5nb3Ysb3dhc3Aub3JnLHBvcnRzd2lnZ2VyLm5ldCxoYWNrZXJvbmUuY29tLGJ1Z2Nyb3dkLmNvbSwiCiAgICAgICAgImN2ZS5vcmcsZXhwbG9pdC1kYi5jb20sZG9jcy5ycyxnby5kZXYsbm9kZWpzLm9yZyxkZXZlbG9wZXIubW96aWxsYS5vcmcsc2hvZGFuLmlvLCIKICAgICAgICAidmlydXN0b3RhbC5jb20sb3N2LmRldixzbnlrLmlvLHZ1bG5lcnMuY29tLHNlY2xpc3RzLm9yZyxwYWNrZXRzdG9ybXNlY3VyaXR5LmNvbSwiCiAgICAgICAgInNlY3VyaXR5Zm9jdXMuY29tLGNpc2EuZ292LHplcm9kYXlpbml0aWF0aXZlLmNvbSxodW50ci5jb20saW50aWdyaXRpLmNvbSwiCiAgICAgICAgInllc3dlaGFjay5jb20sdmRwLmhhY2tlcm9uZS5jb20sYXBpLmdpdGh1Yi5jb20scmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSwiCiAgICAgICAgImFyY2hpdmUub3JnLHdlYi5hcmNoaXZlLm9yZyxzZW1ncmVwLmRldixydWxlcy5zZW1ncmVwLmRldixnaXRodWIuY29tLCIKICAgICAgICAic2VjdXJpdHkuc255ay5pbyxvcGVuY3ZlLmlvLHZ1bGRiLmNvbSxyYXBpZDcuY29tLG1ldGFzcGxvaXQuY29tLHd3dy5yYXBpZDcuY29tIgogICAgKQoKICAgIF9icmF2ZV9rZXkgPSBvcy5nZXRlbnYoIkJSQVZFX0FQSV9LRVkiLCAiIikKICAgIF9oYWNrZXJvbmVfdG9rZW4gPSBvcy5nZXRlbnYoIkhBQ0tFUk9ORV9BUElfVE9LRU4iLCAiIikKICAgIF9oYWNrZXJvbmVfa2V5ID0gb3MuZ2V0ZW52KCJIQUNLRVJPTkVfQVBJX0tFWSIsICIiKQogICAgX252ZF9rZXkgPSBvcy5nZXRlbnYoIk5WRF9BUElfS0VZIiwgIiIpCiAgICBfc2VtZ3JlcF90b2tlbiA9IG9zLmdldGVudigiU0VNR1JFUF9BUFBfVE9LRU4iLCAiIikKICAgIF9udWNsZWlfa2V5ID0gb3MuZ2V0ZW52KCJOVUNMRUlfQVBJX0tFWSIsICIiKQogICAgX2RiX3VybCA9IG9zLmdldGVudigiREFUQUJBU0VfVVJMIiwgIiIpCiAgICBfb3BlbnJvdXRlcl9rZXkgPSBvcy5nZXRlbnYoIk9QRU5ST1VURVJfQVBJX0tFWSIsICIiKQoKICAgIGNvbmZpZyA9IHsKICAgICAgICAibWNwU2VydmVycyI6IHsKICAgICAgICAgICAgImZldGNoLWRvY3MiOiB7CiAgICAgICAgICAgICAgICAiY29tbWFuZCI6ICJ1dngiLAogICAgICAgICAgICAgICAgImFyZ3MiOiBbIm1jcC1zZXJ2ZXItZmV0Y2giXSwKICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJGZXRjaCBzZWN1cml0eSBkb2NzLCBDVkUgYWR2aXNvcmllcywgZXhwbG9pdCBQb0NzLCBhbmQgdmVuZG9yIGJ1bGxldGlucyIsCiAgICAgICAgICAgICAgICAiZW52IjogeyJGRVRDSF9BTExPV0VEX0RPTUFJTlMiOiBfZmV0Y2hfZG9tYWluc30KICAgICAgICAgICAgfSwKICAgICAgICAgICAgImdpdGh1Yi1tYW5hZ2VyIjogewogICAgICAgICAgICAgICAgImNvbW1hbmQiOiAibnB4IiwKICAgICAgICAgICAgICAgICJhcmdzIjogWyIteSIsICJAbW9kZWxjb250ZXh0cHJvdG9jb2wvc2VydmVyLWdpdGh1YiJdLAogICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkdpdEh1YiBBUEk6IGNyZWF0ZSBQUnMsIG9wZW4gc2VjdXJpdHkgYWR2aXNvcmllcywgbWFuYWdlIGlzc3VlcywgcXVlcnkgY29tbWl0IGhpc3RvcnkiLAogICAgICAgICAgICAgICAgImVudiI6IHsiR0lUSFVCX1BFUlNPTkFMX0FDQ0VTU19UT0tFTiI6IEdJVEhVQl9UT0tFTn0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgImZpbGVzeXN0ZW0tcmVzZWFyY2giOiB7CiAgICAgICAgICAgICAgICAiY29tbWFuZCI6ICJucHgiLAogICAgICAgICAgICAgICAgImFyZ3MiOiBbIi15IiwgIkBtb2RlbGNvbnRleHRwcm90b2NvbC9zZXJ2ZXItZmlsZXN5c3RlbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiL2RhdGEvcmVwbyIsICIvdG1wL3Jlc2VhcmNoIiwgIi90bXAvZmluZGluZ3MiXSwKICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJSZWFkLW9ubHkgYWNjZXNzIHRvIGNsb25lZCByZXBvcywgcmVzZWFyY2ggc2NyYXRjaCBzcGFjZSwgYW5kIGZpbmRpbmdzIG91dHB1dCIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgIm1lbW9yeS1zdG9yZSI6IHsKICAgICAgICAgICAgICAgICJjb21tYW5kIjogIm5weCIsCiAgICAgICAgICAgICAgICAiYXJncyI6IFsiLXkiLCAiQG1vZGVsY29udGV4dHByb3RvY29sL3NlcnZlci1tZW1vcnkiXSwKICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJQZXJzaXN0ZW50IGtub3dsZWRnZSBncmFwaCDigJQgZXhwbG9pdCBjaGFpbnMsIENXRSBwYXR0ZXJucywgY3Jvc3Mtc2Vzc2lvbiB2dWxuZXJhYmlsaXR5IG1lbW9yeSIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInNlcXVlbnRpYWwtdGhpbmtpbmciOiB7CiAgICAgICAgICAgICAgICAiY29tbWFuZCI6ICJucHgiLAogICAgICAgICAgICAgICAgImFyZ3MiOiBbIi15IiwgIkBtb2RlbGNvbnRleHRwcm90b2NvbC9zZXJ2ZXItc2VxdWVudGlhbC10aGlua2luZyJdLAogICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlN0cnVjdHVyZWQgY2hhaW4tb2YtdGhvdWdodCBmb3IgY29tcGxleCBtdWx0aS1zdGVwIHZ1bG5lcmFiaWxpdHkgYW5hbHlzaXMiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJ3ZWItc2VhcmNoIjogewogICAgICAgICAgICAgICAgImNvbW1hbmQiOiAibnB4IiwKICAgICAgICAgICAgICAgICJhcmdzIjogWyIteSIsICJAbW9kZWxjb250ZXh0cHJvdG9jb2wvc2VydmVyLWJyYXZlLXNlYXJjaCJdLAogICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlNlYXJjaCBDVkVzLCBleHBsb2l0IFBvQ3MsIHZlbmRvciBhZHZpc29yaWVzLCBidWcgYm91bnR5IHdyaXRldXBzLCBzZWN1cml0eSByZXNlYXJjaCIsCiAgICAgICAgICAgICAgICAiZW52IjogeyJCUkFWRV9BUElfS0VZIjogX2JyYXZlX2tleX0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgImdpdC1mb3JlbnNpY3MiOiB7CiAgICAgICAgICAgICAgICAiY29tbWFuZCI6ICJucHgiLAogICAgICAgICAgICAgICAgImFyZ3MiOiBbIi15IiwgIkBtb2RlbGNvbnRleHRwcm90b2NvbC9zZXJ2ZXItZ2l0IiwgIi0tcmVwb3NpdG9yeSIsICIvZGF0YS9yZXBvIl0sCiAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRGVlcCBnaXQgaGlzdG9yeTogc2lsZW50IHNlY3VyaXR5IHBhdGNoZXMgKENBRCksIGJsYW1lIHRyYWNraW5nLCBjb21taXQgYW5vbWFseSBkZXRlY3Rpb24iCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJzcWxpdGUtZmluZGluZ3MiOiB7CiAgICAgICAgICAgICAgICAiY29tbWFuZCI6ICJucHgiLAogICAgICAgICAgICAgICAgImFyZ3MiOiBbIi15IiwgIkBtb2RlbGNvbnRleHRwcm90b2NvbC9zZXJ2ZXItc3FsaXRlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICItLWRiLXBhdGgiLCAiL2RhdGEvcmhvZGF3a19maW5kaW5ncy5kYiJdLAogICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkxvY2FsIGZpbmRpbmdzIHN0b3JlIOKAlCBmYXN0IHF1ZXJpZXMgb24gdnVsbmVyYWJpbGl0eSBtZXRhZGF0YSwgQ1ZTUyBzY29yZXMsIGJvdW50eSBlc3RpbWF0ZXMiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJudWNsZWktc2Nhbm5lciI6IHsKICAgICAgICAgICAgICAgICJjb21tYW5kIjogInV2eCIsCiAgICAgICAgICAgICAgICAiYXJncyI6IFsibWNwLXNlcnZlci1zaGVsbCIsICItLWFsbG93LWNvbW1hbmRzIiwgIm51Y2xlaSJdLAogICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk51Y2xlaSB0ZW1wbGF0ZS1iYXNlZCBEQVNUIOKAlCBDVkUgZGV0ZWN0aW9uLCBtaXNjb25maWcgc2Nhbm5pbmcsIHdlYiB2dWxuZXJhYmlsaXR5IGRpc2NvdmVyeSIsCiAgICAgICAgICAgICAgICAiZW52IjogewogICAgICAgICAgICAgICAgICAgICJOVUNMRUlfVEVNUExBVEVTX1BBVEgiOiAiL2RhdGEvbnVjbGVpLXRlbXBsYXRlcyIsCiAgICAgICAgICAgICAgICAgICAgIk5VQ0xFSV9BUElfS0VZIjogX251Y2xlaV9rZXkKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgInNlbWdyZXAtc2FzdCI6IHsKICAgICAgICAgICAgICAgICJjb21tYW5kIjogInV2eCIsCiAgICAgICAgICAgICAgICAiYXJncyI6IFsibWNwLXNlcnZlci1zaGVsbCIsICItLWFsbG93LWNvbW1hbmRzIiwgInNlbWdyZXAiXSwKICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJTZW1ncmVwIFNBU1Qg4oCUIHRhaW50IGFuYWx5c2lzLCBDV0UgcGF0dGVybnMsIHNlY3JldHMgZGV0ZWN0aW9uIGFjcm9zcyAzMCsgbGFuZ3VhZ2VzIiwKICAgICAgICAgICAgICAgICJlbnYiOiB7IlNFTUdSRVBfQVBQX1RPS0VOIjogX3NlbWdyZXBfdG9rZW59CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJ0cnVmZmxlaG9nLXNlY3JldHMiOiB7CiAgICAgICAgICAgICAgICAiY29tbWFuZCI6ICJ1dngiLAogICAgICAgICAgICAgICAgImFyZ3MiOiBbIm1jcC1zZXJ2ZXItc2hlbGwiLCAiLS1hbGxvdy1jb21tYW5kcyIsICJ0cnVmZmxlaG9nIl0sCiAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVHJ1ZmZsZUhvZyB2MyDigJQgaGlnaC1zaWduYWwgc2VjcmV0IHNjYW5uaW5nIHdpdGggNzAwKyBkZXRlY3RvcnMgYWNyb3NzIGdpdCBoaXN0b3J5IgogICAgICAgICAgICB9LAogICAgICAgICAgICAiYmFuZGl0LXNhc3QiOiB7CiAgICAgICAgICAgICAgICAiY29tbWFuZCI6ICJ1dngiLAogICAgICAgICAgICAgICAgImFyZ3MiOiBbIm1jcC1zZXJ2ZXItc2hlbGwiLCAiLS1hbGxvdy1jb21tYW5kcyIsICJiYW5kaXQiXSwKICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJCYW5kaXQgUHl0aG9uIFNBU1Qg4oCUIEFTVC1sZXZlbCBkZXRlY3Rpb24gb2YgZGFuZ2Vyb3VzIHBhdHRlcm5zIGFuZCBpbmplY3Rpb24gc2lua3MiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJwaXAtYXVkaXQtc2NhIjogewogICAgICAgICAgICAgICAgImNvbW1hbmQiOiAidXZ4IiwKICAgICAgICAgICAgICAgICJhcmdzIjogWyJtY3Atc2VydmVyLXNoZWxsIiwgIi0tYWxsb3ctY29tbWFuZHMiLCAicGlwLWF1ZGl0Il0sCiAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAicGlwLWF1ZGl0IFNDQSDigJQga25vd24gdnVsbmVyYWJpbGl0aWVzIGluIFB5dGhvbiBkZXBlbmRlbmNpZXMgdmlhIE9TViBhbmQgUHlQSSBBZHZpc29yeSBEQiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgIm9zdi1zY2FubmVyIjogewogICAgICAgICAgICAgICAgImNvbW1hbmQiOiAidXZ4IiwKICAgICAgICAgICAgICAgICJhcmdzIjogWyJtY3Atc2VydmVyLXNoZWxsIiwgIi0tYWxsb3ctY29tbWFuZHMiLCAib3N2LXNjYW5uZXIiXSwKICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJPU1YgU2Nhbm5lciDigJQgbXVsdGktZWNvc3lzdGVtIFNDQSB1c2luZyB0aGUgT3BlbiBTb3VyY2UgVnVsbmVyYWJpbGl0eSBkYXRhYmFzZSAoR29vZ2xlKSIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInozLWZvcm1hbC12ZXJpZmllciI6IHsKICAgICAgICAgICAgICAgICJjb21tYW5kIjogInV2eCIsCiAgICAgICAgICAgICAgICAiYXJncyI6IFsibWNwLXNlcnZlci1zaGVsbCIsICItLWFsbG93LWNvbW1hbmRzIiwgInB5dGhvbjMiXSwKICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJaMyBTTVQgc29sdmVyIOKAlCBmb3JtYWwgdmVyaWZpY2F0aW9uIG9mIGludGVnZXIgYm91bmRzLCBvdmVyZmxvdyBpbnZhcmlhbnRzLCBwcm90b2NvbCBwcm9wZXJ0aWVzIgogICAgICAgICAgICB9LAogICAgICAgICAgICAiaHlwb3RoZXNpcy1mdXp6ZXIiOiB7CiAgICAgICAgICAgICAgICAiY29tbWFuZCI6ICJ1dngiLAogICAgICAgICAgICAgICAgImFyZ3MiOiBbIm1jcC1zZXJ2ZXItc2hlbGwiLCAiLS1hbGxvdy1jb21tYW5kcyIsICJweXRob24zLHB5dGVzdCJdLAogICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkh5cG90aGVzaXMgUEJUIGZ1enplciDigJQgcHJvcGVydHktYmFzZWQgdGVzdGluZyBmb3Igb3ZlcmZsb3csIGVuY29kaW5nLCBhbGlhc2luZyBidWdzIgogICAgICAgICAgICB9LAogICAgICAgICAgICAiYXRoZXJpcy1mdXp6ZXIiOiB7CiAgICAgICAgICAgICAgICAiY29tbWFuZCI6ICJ1dngiLAogICAgICAgICAgICAgICAgImFyZ3MiOiBbIm1jcC1zZXJ2ZXItc2hlbGwiLCAiLS1hbGxvdy1jb21tYW5kcyIsICJweXRob24zIl0sCiAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQXRoZXJpcyBjb3ZlcmFnZS1ndWlkZWQgZnV6emVyIOKAlCBsaWJGdXp6ZXItYmFja2VkIFB5dGhvbiBmdXp6aW5nIGZvciBwYXJzZXIgYW5kIHByb3RvY29sIGJ1Z3MiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJhbmdyLXN5bWJvbGljIjogewogICAgICAgICAgICAgICAgImNvbW1hbmQiOiAidXZ4IiwKICAgICAgICAgICAgICAgICJhcmdzIjogWyJtY3Atc2VydmVyLXNoZWxsIiwgIi0tYWxsb3ctY29tbWFuZHMiLCAicHl0aG9uMyJdLAogICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogImFuZ3Igc3ltYm9saWMgZXhlY3V0aW9uIOKAlCBiaW5hcnkgYW5hbHlzaXMsIHBhdGggZXhwbG9yYXRpb24sIGNvbnN0cmFpbnQgc29sdmluZyIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInJhZG9uLWNvbXBsZXhpdHkiOiB7CiAgICAgICAgICAgICAgICAiY29tbWFuZCI6ICJ1dngiLAogICAgICAgICAgICAgICAgImFyZ3MiOiBbIm1jcC1zZXJ2ZXItc2hlbGwiLCAiLS1hbGxvdy1jb21tYW5kcyIsICJyYWRvbiJdLAogICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlJhZG9uIEFTVCBjb21wbGV4aXR5IGFuYWx5c2lzIOKAlCBjeWNsb21hdGljIGNvbXBsZXhpdHksIGF0dGFjayBzdXJmYWNlIHJhbmtpbmciCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJydWZmLWxpbnRlciI6IHsKICAgICAgICAgICAgICAgICJjb21tYW5kIjogInV2eCIsCiAgICAgICAgICAgICAgICAiYXJncyI6IFsibWNwLXNlcnZlci1zaGVsbCIsICItLWFsbG93LWNvbW1hbmRzIiwgInJ1ZmYiXSwKICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJSdWZmIHVsdHJhLWZhc3QgUHl0aG9uIGxpbnRlciDigJQgYW50aS1wYXR0ZXJucyBjb3JyZWxhdGluZyB3aXRoIHNlY3VyaXR5IGJ1Z3MiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJhaWRlci1wYXRjaGVyIjogewogICAgICAgICAgICAgICAgImNvbW1hbmQiOiAidXZ4IiwKICAgICAgICAgICAgICAgICJhcmdzIjogWyJtY3Atc2VydmVyLXNoZWxsIiwgIi0tYWxsb3ctY29tbWFuZHMiLCAiYWlkZXIiXSwKICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBaWRlciBBSSBjb2RlIGVkaXRvciDigJQgYXBwbGllcyBMTE0tZ2VuZXJhdGVkIHBhdGNoZXMgd2l0aCBkaWZmIHZlcmlmaWNhdGlvbiBhbmQgdGVzdCByZS1ydW4iLAogICAgICAgICAgICAgICAgImVudiI6IHsiT1BFTlJPVVRFUl9BUElfS0VZIjogX29wZW5yb3V0ZXJfa2V5fQogICAgICAgICAgICB9LAogICAgICAgICAgICAiY3ZlLWludGVsbGlnZW5jZSI6IHsKICAgICAgICAgICAgICAgICJjb21tYW5kIjogInV2eCIsCiAgICAgICAgICAgICAgICAiYXJncyI6IFsibWNwLXNlcnZlci1mZXRjaCJdLAogICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk5WRC9OSVNUIENWRSBBUEkg4oCUIGZ1bGwgQ1ZFIGRldGFpbHMsIENWU1MgdmVjdG9ycywgQ1dFIG1hcHBpbmdzLCBhZmZlY3RlZCB2ZXJzaW9ucyIsCiAgICAgICAgICAgICAgICAiZW52IjogewogICAgICAgICAgICAgICAgICAgICJGRVRDSF9BTExPV0VEX0RPTUFJTlMiOiAoCiAgICAgICAgICAgICAgICAgICAgICAgICJudmQubmlzdC5nb3YsY3ZlLm9yZyxjdmUubWl0cmUub3JnLHd3dy5jdmVkZXRhaWxzLmNvbSwiCiAgICAgICAgICAgICAgICAgICAgICAgICJ2dWxuZXJzLmNvbSxvc3YuZGV2LG9wZW5jdmUuaW8iCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICAiTlZEX0FQSV9LRVkiOiBfbnZkX2tleQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICAiYm91bnR5LXBsYXRmb3JtIjogewogICAgICAgICAgICAgICAgImNvbW1hbmQiOiAidXZ4IiwKICAgICAgICAgICAgICAgICJhcmdzIjogWyJtY3Atc2VydmVyLWZldGNoIl0sCiAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQnVnIGJvdW50eSBBUElzIOKAlCBIYWNrZXJPbmUgcmVwb3J0IHN1Ym1pc3Npb24sIEdpdEh1YiBTZWN1cml0eSBBZHZpc29yaWVzLCBCdWdjcm93ZCIsCiAgICAgICAgICAgICAgICAiZW52IjogewogICAgICAgICAgICAgICAgICAgICJGRVRDSF9BTExPV0VEX0RPTUFJTlMiOiAoCiAgICAgICAgICAgICAgICAgICAgICAgICJhcGkuaGFja2Vyb25lLmNvbSxhcGkuYnVnY3Jvd2QuY29tLGFwaS5pbnRpZ3JpdGkuY29tLCIKICAgICAgICAgICAgICAgICAgICAgICAgImFwaS55ZXN3ZWhhY2suY29tLGFwaS5naXRodWIuY29tIgogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgIkhBQ0tFUk9ORV9BUElfVE9LRU4iOiBfaGFja2Vyb25lX3Rva2VuLAogICAgICAgICAgICAgICAgICAgICJIQUNLRVJPTkVfQVBJX0tFWSI6IF9oYWNrZXJvbmVfa2V5CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJzdXBwbHktY2hhaW4tbW9uaXRvciI6IHsKICAgICAgICAgICAgICAgICJjb21tYW5kIjogInV2eCIsCiAgICAgICAgICAgICAgICAiYXJncyI6IFsibWNwLXNlcnZlci1mZXRjaCJdLAogICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlN1cHBseSBjaGFpbiBzZWN1cml0eSDigJQgUHlQSSB0eXBvc3F1YXR0aW5nLCBkZXBlbmRlbmN5IGNvbmZ1c2lvbiwgbWFsaWNpb3VzIHBhY2thZ2VzIiwKICAgICAgICAgICAgICAgICJlbnYiOiB7CiAgICAgICAgICAgICAgICAgICAgIkZFVENIX0FMTE9XRURfRE9NQUlOUyI6ICgKICAgICAgICAgICAgICAgICAgICAgICAgInB5cGkub3JnLGFwaS5weXBpLm9yZyxyZWdpc3RyeS5ucG1qcy5vcmcsY3JhdGVzLmlvLCIKICAgICAgICAgICAgICAgICAgICAgICAgImRlcHMuZGV2LHNvY2tldC5kZXYsYXBpLnNvY2tldC5kZXYiCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgIH0KICAgIH0KICAgIG9zLm1ha2VkaXJzKG9zLnBhdGguZGlybmFtZShNQ1BfUlVOVElNRV9DT05GSUcpLCBleGlzdF9vaz1UcnVlKQogICAgd2l0aCBvcGVuKE1DUF9SVU5USU1FX0NPTkZJRywgInciKSBhcyBmOgogICAgICAgIGpzb24uZHVtcChjb25maWcsIGYsIGluZGVudD0yKQogICAgb3MuY2htb2QoTUNQX1JVTlRJTUVfQ09ORklHLCAwbzYwMCkKICAgIHVpX2xvZyhmIk1DUCBjb25maWcgd3JpdHRlbjoge2xlbihjb25maWdbJ21jcFNlcnZlcnMnXSl9IHNlcnZlcnMg4oaSIHtNQ1BfUlVOVElNRV9DT05GSUd9IiwgIklORk8iKQogICAgcmV0dXJuIE1DUF9SVU5USU1FX0NPTkZJRwoKCmRlZiBzYWZlX2dpdF9wdWxsKCk6CiAgICBfLCBjb2RlID0gcnVuX3N1YnByb2Nlc3Nfc2FmZShbImdpdCIsICJwdWxsIiwgIi0tZmYtb25seSIsICJvcmlnaW4iLCAibWFpbiJdLCBjd2Q9UkVQT19ESVIsIHJhaXNlX29uX2Vycm9yPUZhbHNlKQogICAgaWYgY29kZSAhPSAwOgogICAgICAgIHJ1bl9zdWJwcm9jZXNzX3NhZmUoWyJnaXQiLCAiZmV0Y2giLCAib3JpZ2luIl0sIGN3ZD1SRVBPX0RJUikKICAgICAgICBydW5fc3VicHJvY2Vzc19zYWZlKFsiZ2l0IiwgInJlc2V0IiwgIi0taGFyZCIsICJvcmlnaW4vbWFpbiJdLCBjd2Q9UkVQT19ESVIpCiAgICAgICAgcnVuX3N1YnByb2Nlc3Nfc2FmZShbImdpdCIsICJjbGVhbiIsICItZmQiXSwgY3dkPVJFUE9fRElSKQoKCmRlZiBjbGVhbnVwX3N0YWxlX2JyYW5jaChicmFuY2hfbmFtZTogc3RyKToKICAgIHJ1bl9zdWJwcm9jZXNzX3NhZmUoWyJnaXQiLCAiYnJhbmNoIiwgIi1EIiwgYnJhbmNoX25hbWVdLCBjd2Q9UkVQT19ESVIsIHJhaXNlX29uX2Vycm9yPUZhbHNlKQogICAgcnVuX3N1YnByb2Nlc3Nfc2FmZShbImdpdCIsICJwdXNoIiwgIm9yaWdpbiIsICItLWRlbGV0ZSIsIGJyYW5jaF9uYW1lXSwgY3dkPVJFUE9fRElSLCByYWlzZV9vbl9lcnJvcj1GYWxzZSkKCgpkZWYgY3JlYXRlX2ZpeF9icmFuY2goYnJhbmNoX25hbWU6IHN0cikgLT4gYm9vbDoKICAgIHJ1bl9zdWJwcm9jZXNzX3NhZmUoWyJnaXQiLCAiY2hlY2tvdXQiLCAibWFpbiJdLCBjd2Q9UkVQT19ESVIsIHJhaXNlX29uX2Vycm9yPUZhbHNlKQogICAgcnVuX3N1YnByb2Nlc3Nfc2FmZShbImdpdCIsICJwdWxsIiwgIi0tZmYtb25seSIsICJvcmlnaW4iLCAibWFpbiJdLCBjd2Q9UkVQT19ESVIsIHJhaXNlX29uX2Vycm9yPUZhbHNlKQogICAgcnVuX3N1YnByb2Nlc3Nfc2FmZShbImdpdCIsICJicmFuY2giLCAiLUQiLCBicmFuY2hfbmFtZV0sIGN3ZD1SRVBPX0RJUiwgcmFpc2Vfb25fZXJyb3I9RmFsc2UpCiAgICBfLCBjb2RlID0gcnVuX3N1YnByb2Nlc3Nfc2FmZShbImdpdCIsICJjaGVja291dCIsICItYiIsIGJyYW5jaF9uYW1lXSwgY3dkPVJFUE9fRElSLCByYWlzZV9vbl9lcnJvcj1GYWxzZSkKICAgIHJldHVybiBjb2RlID09IDAKCgpkZWYgZW5zdXJlX2ZpeF9jb21taXR0ZWQodGVzdF9wYXRoOiBzdHIpIC0+IE5vbmU6CiAgICBzdGF0dXMsIF8gPSBydW5fc3VicHJvY2Vzc19zYWZlKFsiZ2l0IiwgInN0YXR1cyIsICItLXBvcmNlbGFpbiJdLCBjd2Q9UkVQT19ESVIsIHJhaXNlX29uX2Vycm9yPUZhbHNlKQogICAgaWYgbm90IHN0YXR1cy5zdHJpcCgpOgogICAgICAgIHJldHVybgogICAgcnVuX3N1YnByb2Nlc3Nfc2FmZShbImdpdCIsICJhZGQiLCAiLiJdLCBjd2Q9UkVQT19ESVIsIHJhaXNlX29uX2Vycm9yPUZhbHNlKQogICAgbWVzc2FnZSA9IGYiW1Job2Rhd2tdIEF1dG8taGVhbCB7b3MucGF0aC5iYXNlbmFtZSh0ZXN0X3BhdGgpfSIKICAgIHJ1bl9zdWJwcm9jZXNzX3NhZmUoWyJnaXQiLCAiY29tbWl0IiwgIi1tIiwgbWVzc2FnZV0sIGN3ZD1SRVBPX0RJUiwgcmFpc2Vfb25fZXJyb3I9RmFsc2UpCgoKZGVmIHB1c2hfZml4X2JyYW5jaChicmFuY2hfbmFtZTogc3RyKSAtPiBib29sOgogICAgXywgY29kZSA9IHJ1bl9zdWJwcm9jZXNzX3NhZmUoWyJnaXQiLCAicHVzaCIsICItdSIsICJvcmlnaW4iLCBicmFuY2hfbmFtZV0sIGN3ZD1SRVBPX0RJUiwgcmFpc2Vfb25fZXJyb3I9RmFsc2UpCiAgICByZXR1cm4gY29kZSA9PSAwCgoKZGVmIGNyZWF0ZV9naXRodWJfcHIocmVwbzogc3RyLCBicmFuY2g6IHN0ciwgdGVzdF9wYXRoOiBzdHIsIHRva2VuOiBzdHIpIC0+IHN0cjoKICAgIGhlYWRlcnMgPSB7CiAgICAgICAgIkF1dGhvcml6YXRpb24iOiBmIkJlYXJlciB7dG9rZW59IiwKICAgICAgICAiQWNjZXB0IjogImFwcGxpY2F0aW9uL3ZuZC5naXRodWIranNvbiIsCiAgICAgICAgIlgtR2l0SHViLUFQSS1WZXJzaW9uIjogIjIwMjItMTEtMjgiLAogICAgfQogICAgcGF5bG9hZCA9IHsKICAgICAgICAidGl0bGUiOiBmIltSaG9kYXdrXSBBdXRvLWhlYWw6IHtvcy5wYXRoLmJhc2VuYW1lKHRlc3RfcGF0aCl9IiwKICAgICAgICAiaGVhZCI6IGJyYW5jaCwKICAgICAgICAiYmFzZSI6ICJtYWluIiwKICAgICAgICAiYm9keSI6ICgKICAgICAgICAgICAgIiMjIFJob2Rhd2sgQUkgQXV0b25vbW91cyBGaXhcblxuIgogICAgICAgICAgICAiVGhpcyBQUiB3YXMgZ2VuZXJhdGVkIGF1dG9ub21vdXNseSBieSBSaG9kYXdrIEFJIHYzLjAuXG4iCiAgICAgICAgICAgICItIFRlc3RzIHZlcmlmaWVkIGdyZWVuIGFmdGVyIGZpeFxuIgogICAgICAgICAgICAiLSBTQVNUIGdhdGUgcGFzc2VkXG4iCiAgICAgICAgICAgICItIFN1cHBseSBjaGFpbiBnYXRlIHBhc3NlZFxuIgogICAgICAgICAgICAiLSBBZHZlcnNhcmlhbCBMTE0gcmV2aWV3IGNvbXBsZXRlZFxuXG4iCiAgICAgICAgICAgIGYiKipUZXN0IGZpeGVkOioqIGB7dGVzdF9wYXRofWBcbiIKICAgICAgICApLAogICAgICAgICJkcmFmdCI6IEZhbHNlLAogICAgfQogICAgcmVzcCA9IHJlcXVlc3RzLnBvc3QoCiAgICAgICAgZiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL3tyZXBvfS9wdWxscyIsCiAgICAgICAgaGVhZGVycz1oZWFkZXJzLAogICAgICAgIGpzb249cGF5bG9hZCwKICAgICAgICB0aW1lb3V0PTMwLAogICAgKQogICAgcmVzcC5yYWlzZV9mb3Jfc3RhdHVzKCkKICAgIHJldHVybiByZXNwLmpzb24oKVsiaHRtbF91cmwiXQoKCmRlZiBnZXRfY3VycmVudF9kaWZmKCkgLT4gc3RyOgogICAgdHJ5OgogICAgICAgIGRpZmYsIF8gPSBydW5fc3VicHJvY2Vzc19zYWZlKFsiZ2l0IiwgImRpZmYiLCAiSEVBRH4xIiwgIkhFQUQiLCAiLS11bmlmaWVkPTMiXSwgY3dkPVJFUE9fRElSLCByYWlzZV9vbl9lcnJvcj1GYWxzZSkKICAgICAgICByZXR1cm4gZGlmZgogICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICB0cnk6CiAgICAgICAgICAgIGRpZmYsIF8gPSBydW5fc3VicHJvY2Vzc19zYWZlKFsiZ2l0IiwgImRpZmYiLCAiLS11bmlmaWVkPTMiXSwgY3dkPVJFUE9fRElSLCByYWlzZV9vbl9lcnJvcj1GYWxzZSkKICAgICAgICAgICAgcmV0dXJuIGRpZmYKICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICByZXR1cm4gIiIKCgpkZWYgZ2V0X2NoYW5nZWRfZmlsZXMoKSAtPiBsaXN0W3N0cl06CiAgICB0cnk6CiAgICAgICAgb3V0LCBfID0gcnVuX3N1YnByb2Nlc3Nfc2FmZShbImdpdCIsICJkaWZmIiwgIi0tbmFtZS1vbmx5IiwgIkhFQUR+MSIsICJIRUFEIl0sIGN3ZD1SRVBPX0RJUiwgcmFpc2Vfb25fZXJyb3I9RmFsc2UpCiAgICAgICAgcmV0dXJuIFtmLnN0cmlwKCkgZm9yIGYgaW4gb3V0LnNwbGl0bGluZXMoKSBpZiBmLnN0cmlwKCldCiAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgIHJldHVybiBbXQoKCmRlZiBzZXR1cF90YXJnZXRfdmVudigpIC0+IHN0cjoKICAgIGltcG9ydCBzeXMgYXMgX3N5cwoKICAgICMgRklYOiBlbnN1cmUgL2RhdGEgKFBFUlNJU1RFTlRfRElSKSBleGlzdHMgYmVmb3JlIHdyaXRpbmcgaW50byBpdC4KICAgIG9zLm1ha2VkaXJzKFBFUlNJU1RFTlRfRElSLCBleGlzdF9vaz1UcnVlKQoKICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhWRU5WX0RJUik6CiAgICAgICAgdWlfbG9nKCJDcmVhdGluZyBpc29sYXRlZCB2aXJ0dWFsZW52IHZpYSB1di4uLiIpCiAgICAgICAgIyBGSVg6IHBhc3MgLS1weXRob24gZXhwbGljaXRseTsgd2l0aG91dCBpdCB1diBleGl0cyAyIG9uIFNwYWNlIHJlc3RhcnRzCiAgICAgICAgIyB3aGVuIGl0cyBtYW5hZ2VkLVB5dGhvbiBjYWNoZSBpcyBjb2xkIG9yIFVWX1BZVEhPTiBpcyB1bnJlc29sdmFibGUuCiAgICAgICAgXywgY29kZSA9IHJ1bl9zdWJwcm9jZXNzX3NhZmUoCiAgICAgICAgICAgIFsidXYiLCAidmVudiIsICItLXB5dGhvbiIsIF9zeXMuZXhlY3V0YWJsZSwgVkVOVl9ESVJdLAogICAgICAgICAgICBjd2Q9Ii90bXAiLCByYWlzZV9vbl9lcnJvcj1GYWxzZSwKICAgICAgICApCiAgICAgICAgaWYgY29kZSAhPSAwOgogICAgICAgICAgICAjIEZJWDogZmFsbGJhY2sgdG8gc3RkbGliIHZlbnYgc28gdGhlIGF1ZGl0IGNhbiBjb250aW51ZSBldmVuIHdoZW4KICAgICAgICAgICAgIyB1didzIFB5dGhvbiByZXNvbHV0aW9uIGZhaWxzIGluc2lkZSB0aGUgY29udGFpbmVyLgogICAgICAgICAgICB1aV9sb2coZiLimqDvuI8gIHV2IHZlbnYgZmFpbGVkIChleGl0IHtjb2RlfSkg4oCUIGZhbGxpbmcgYmFjayB0byBweXRob24gLW0gdmVudi4uLiIpCiAgICAgICAgICAgIHJ1bl9zdWJwcm9jZXNzX3NhZmUoCiAgICAgICAgICAgICAgICBbX3N5cy5leGVjdXRhYmxlLCAiLW0iLCAidmVudiIsIFZFTlZfRElSXSwKICAgICAgICAgICAgICAgIGN3ZD0iL3RtcCIsIHJhaXNlX29uX2Vycm9yPVRydWUsCiAgICAgICAgICAgICkKCiAgICBweXRlc3RfYmluID0gb3MucGF0aC5qb2luKFZFTlZfRElSLCAiYmluIiwgInB5dGVzdCIpCiAgICByZXFfcGF0aCA9IG9zLnBhdGguam9pbihSRVBPX0RJUiwgInJlcXVpcmVtZW50cy50eHQiKQogICAgaWYgb3MucGF0aC5leGlzdHMocmVxX3BhdGgpOgogICAgICAgIHVpX2xvZygiSW5zdGFsbGluZyB0YXJnZXQgcmVwbyBkZXBzIHZpYSB1di4uLiIpCiAgICAgICAgcnVuX3N1YnByb2Nlc3Nfc2FmZSgKICAgICAgICAgICAgWyJ1diIsICJwaXAiLCAiaW5zdGFsbCIsICItLXB5dGhvbiIsIFZFTlZfRElSLCAiLS1xdWlldCIsICItciIsIHJlcV9wYXRoXSwKICAgICAgICAgICAgY3dkPVJFUE9fRElSLCB0aW1lb3V0PTYwMCwgcmFpc2Vfb25fZXJyb3I9RmFsc2UsCiAgICAgICAgKQogICAgcmV0dXJuIHB5dGVzdF9iaW4KCgojIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAojIEFJREVSIFJVTk5FUgojIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgApkZWYgcnVuX2FpZGVyKG1jcF9jb25maWdfcGF0aDogc3RyLCBwcm9tcHQ6IHN0ciwgY29udGV4dF9maWxlczogbGlzdFtzdHJdKSAtPiB0dXBsZVtzdHIsIGludF06CiAgICBmZCwgcHJvbXB0X3BhdGggPSB0ZW1wZmlsZS5ta3N0ZW1wKHByZWZpeD0iYWlkZXJfcHJvbXB0XyIsIHN1ZmZpeD0iLnR4dCIpCiAgICB0cnk6CiAgICAgICAgd2l0aCBvcy5mZG9wZW4oZmQsICJ3IikgYXMgZjoKICAgICAgICAgICAgZi53cml0ZShwcm9tcHQpCiAgICAgICAgdmFsaWQgPSBbZiBmb3IgZiBpbiBjb250ZXh0X2ZpbGVzIGlmIG9zLnBhdGguZXhpc3RzKG9zLnBhdGguam9pbihSRVBPX0RJUiwgZikpXQogICAgICAgIGNtZCA9IFsiYWlkZXIiLCAiLS1tb2RlbCIsIE1PREVMLCAiLS15ZXMiLCAiLS1uby1zdHJlYW0iLAogICAgICAgICAgICAgICAiLS1tZXNzYWdlLWZpbGUiLCBwcm9tcHRfcGF0aF0KICAgICAgICBpZiBtY3BfY29uZmlnX3BhdGggYW5kIG9zLnBhdGguZXhpc3RzKG1jcF9jb25maWdfcGF0aCk6CiAgICAgICAgICAgIGNtZCArPSBbIi0tbWNwLWNvbmZpZyIsIG1jcF9jb25maWdfcGF0aF0KICAgICAgICBjbWQgKz0gdmFsaWQKICAgICAgICByZXR1cm4gcnVuX3N1YnByb2Nlc3Nfc2FmZShjbWQsIGN3ZD1SRVBPX0RJUiwgdGltZW91dD02MDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52X292ZXJyaWRlcz17Ik9QRU5ST1VURVJfQVBJX0tFWSI6IE9QRU5ST1VURVJfQVBJX0tFWX0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2Vfb25fZXJyb3I9RmFsc2UpCiAgICBmaW5hbGx5OgogICAgICAgIHRyeToKICAgICAgICAgICAgb3MudW5saW5rKHByb21wdF9wYXRoKQogICAgICAgIGV4Y2VwdCBPU0Vycm9yOgogICAgICAgICAgICBwYXNzCgoKIyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKIyBUSEUgRlVMTCBMT09QCiMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACmRlZiBwcm9jZXNzX2ZhaWxpbmdfdGVzdCgKICAgIHRlc3RfcGF0aDogc3RyLAogICAgaW5pdGlhbF9mYWlsdXJlOiBzdHIsCiAgICBlbnZfY29uZmlnOiBFbnZDb25maWcsCiAgICBtY3BfY29uZmlnX3BhdGg6IHN0ciwKICAgIGpvYl9pZDogc3RyLAogICAgYnJhbmNoX25hbWU6IHN0ciwKICAgIHRhcmdldF9yZXBvOiBzdHIgPSAiIiwgICAgICAgICAgIyDihpAgYWRkZWQ6IHBhc3NlZCBmcm9tIGF1ZGl0IGxvb3AKKSAtPiBWZXJpZmljYXRpb25SZXN1bHQ6CiAgICAiIiIKICAgIENvcmUgYXV0b25vbW91cyBoZWFsaW5nIGxvb3A6CiAgICAgIG1lbW9yeSByZXRyaWV2YWwg4oaSIGFpZGVyIGZpeCDihpIgdGVzdCB2ZXJpZmljYXRpb24g4oaSIGFkdmVyc2FyaWFsIHJldmlldwogICAgICDihpIgU0FTVCBnYXRlIOKGkiBzdXBwbHkgY2hhaW4gZ2F0ZSDihpIgUFIgb3BlbgogICAgUmV0cmllcyB1cCB0byBNQVhfUkVUUklFUyB3aXRoIGFjY3VtdWxhdGluZyBjb250ZXh0LgogICAgIiIiCiAgICByZXBvX3JlZiA9IHRhcmdldF9yZXBvIG9yIEdJVEhVQl9SRVBPICAgIyBmYWxsIGJhY2sgdG8gZW52IHZhciBpZiBub3Qgc3VwcGxpZWQKICAgIGZpbGVuYW1lID0gb3MucGF0aC5iYXNlbmFtZSh0ZXN0X3BhdGgpCiAgICBzcmNfZmlsZSA9IHRlc3RfcGF0aC5yZXBsYWNlKCJ0ZXN0XyIsICIiKQogICAgY29udGV4dF9maWxlcyA9IFt0ZXN0X3BhdGhdCgogICAgaWYgb3MucGF0aC5leGlzdHMob3MucGF0aC5qb2luKFJFUE9fRElSLCBzcmNfZmlsZSkpOgogICAgICAgIGNvbnRleHRfZmlsZXMuYXBwZW5kKHNyY19maWxlKQogICAgZWxzZToKICAgICAgICBmYWxsYmFja19zcmMgPSBmInNyYy97ZmlsZW5hbWUucmVwbGFjZSgndGVzdF8nLCAnJyl9IgogICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKG9zLnBhdGguam9pbihSRVBPX0RJUiwgZmFsbGJhY2tfc3JjKSk6CiAgICAgICAgICAgIHNyY19maWxlID0gZmFsbGJhY2tfc3JjCiAgICAgICAgICAgIGNvbnRleHRfZmlsZXMuYXBwZW5kKHNyY19maWxlKQoKICAgIGlmIG9zLnBhdGguZXhpc3RzKG9zLnBhdGguam9pbihSRVBPX0RJUiwgInJlcXVpcmVtZW50cy50eHQiKSk6CiAgICAgICAgY29udGV4dF9maWxlcy5hcHBlbmQoInJlcXVpcmVtZW50cy50eHQiKQoKICAgIGF0dGVtcHRfaGlzdG9yeTogbGlzdFtWZXJpZmljYXRpb25BdHRlbXB0XSA9IFtdCiAgICBjdXJyZW50X2ZhaWx1cmUgPSBpbml0aWFsX2ZhaWx1cmUKCiAgICBjbGVhbnVwX3N0YWxlX2JyYW5jaChicmFuY2hfbmFtZSkKICAgIGlmIG5vdCBjcmVhdGVfZml4X2JyYW5jaChicmFuY2hfbmFtZSk6CiAgICAgICAgcmV0dXJuIFZlcmlmaWNhdGlvblJlc3VsdCgKICAgICAgICAgICAgc3VjY2Vzcz1GYWxzZSwKICAgICAgICAgICAgYXR0ZW1wdHM9YXR0ZW1wdF9oaXN0b3J5LAogICAgICAgICAgICBmYWlsdXJlX3JlYXNvbj1mIlVuYWJsZSB0byBjcmVhdGUgZml4IGJyYW5jaCB7YnJhbmNoX25hbWV9IiwKICAgICAgICApCgogICAgbWF4X3RvdGFsX2F0dGVtcHRzID0gTUFYX1JFVFJJRVMgKyBtYXgoMCwgQURWRVJTQVJJQUxfUkVKRUNUSU9OX01VTFRJUExJRVIpCiAgICBmb3IgYXR0ZW1wdF9udW0gaW4gcmFuZ2UoMSwgbWF4X3RvdGFsX2F0dGVtcHRzICsgMSk6CiAgICAgICAgdWlfbG9nKGYiQXR0ZW1wdCB7YXR0ZW1wdF9udW19L3ttYXhfdG90YWxfYXR0ZW1wdHN9OiB7dGVzdF9wYXRofSIsICJSRVRSWSIgaWYgYXR0ZW1wdF9udW0gPiAxIGVsc2UgIklORk8iKQoKICAgICAgICAjIOKUgOKUgCBTdGVwIDE6IFJldHJpZXZlIHNpbWlsYXIgZml4ZXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICAgICAgdHJ5OgogICAgICAgICAgICBzaW1pbGFyX2ZpeGVzID0gcmV0cmlldmVfc2ltaWxhcl9maXhlc192MihjdXJyZW50X2ZhaWx1cmUsIHRvcF9rPTMpCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgc2ltaWxhcl9maXhlcyA9IHJldHJpZXZlX3NpbWlsYXJfZml4ZXMoY3VycmVudF9mYWlsdXJlLCB0b3Bfaz0zKQogICAgICAgIGlmIHNpbWlsYXJfZml4ZXM6CiAgICAgICAgICAgIHVpX2xvZyhmIk1lbW9yeTogZm91bmQge2xlbihzaW1pbGFyX2ZpeGVzKX0gc2ltaWxhciBwYXN0IGZpeChlcykgKGJlc3Qgc2ltaWxhcml0eToge3NpbWlsYXJfZml4ZXNbMF1bJ3NpbWlsYXJpdHknXX0pIiwgIk1FTSIpCgogICAgICAgICMg4pSA4pSAIFN0ZXAgMjogQnVpbGQgcHJvbXB0IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgICAgIGlmIGF0dGVtcHRfbnVtID09IDE6CiAgICAgICAgICAgIHByb21wdCA9IGJ1aWxkX2luaXRpYWxfcHJvbXB0KHRlc3RfcGF0aCwgc3JjX2ZpbGUsIGJyYW5jaF9uYW1lLCBjdXJyZW50X2ZhaWx1cmUsIHNpbWlsYXJfZml4ZXMsIHJlcG9fZGlyPVJFUE9fRElSKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHByb21wdCA9IGJ1aWxkX3JldHJ5X3Byb21wdCh0ZXN0X3BhdGgsIHNyY19maWxlLCBicmFuY2hfbmFtZSwgaW5pdGlhbF9mYWlsdXJlLCBhdHRlbXB0X2hpc3RvcnksIHNpbWlsYXJfZml4ZXMsIHJlcG9fZGlyPVJFUE9fRElSKQoKICAgICAgICBwcm9tcHRfaGFzaCA9IGhhc2hsaWIuc2hhMjU2KHByb21wdC5lbmNvZGUoKSkuaGV4ZGlnZXN0KClbOjE2XQoKICAgICAgICBsb2dfYXVkaXRfZXZlbnQoIkFJREVSX0RJU1BBVENIIiwgam9iX2lkLCByZXBvX3JlZiwgTU9ERUwsIHsKICAgICAgICAgICAgInRlc3QiOiB0ZXN0X3BhdGgsICJhdHRlbXB0IjogYXR0ZW1wdF9udW0sICJwcm9tcHRfaGFzaCI6IHByb21wdF9oYXNoLAogICAgICAgICAgICAibWVtb3J5X2hpdHMiOiBsZW4oc2ltaWxhcl9maXhlcyksCiAgICAgICAgfSwgIkRJU1BBVENIRUQiKQoKICAgICAgICAjIOKUgOKUgCBTdGVwIDM6IFJ1biBBaWRlciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgICAgICBhaWRlcl9vdXRwdXQsIGFpZGVyX2NvZGUgPSBydW5fYWlkZXIobWNwX2NvbmZpZ19wYXRoLCBwcm9tcHQsIGNvbnRleHRfZmlsZXMpCgogICAgICAgIGlmIGFpZGVyX2NvZGUgIT0gMDoKICAgICAgICAgICAgdWlfbG9nKGYiQWlkZXIgbm9uLXplcm8gZXhpdCBvbiBhdHRlbXB0IHthdHRlbXB0X251bX0iLCAiV0FSTiIpCiAgICAgICAgICAgIHVpX2xvZyhmIkFJREVSIENSQVNIIFJFQVNPTjoge2FpZGVyX291dHB1dC5zdHJpcCgpWzo4MDBdfSIsICJGQUlMIikKICAgICAgICAgICAgYXR0ZW1wdF9oaXN0b3J5LmFwcGVuZChWZXJpZmljYXRpb25BdHRlbXB0KAogICAgICAgICAgICAgICAgYXR0ZW1wdF9udW1iZXI9YXR0ZW1wdF9udW0sIHByb21wdF9oYXNoPXByb21wdF9oYXNoLAogICAgICAgICAgICAgICAgYWlkZXJfZXhpdF9jb2RlPWFpZGVyX2NvZGUsIHRlc3RfZXhpdF9jb2RlPS0xLAogICAgICAgICAgICAgICAgdGVzdF9vdXRwdXQ9IkFpZGVyIGZhaWxlZCB0byBwcm9kdWNlIG91dHB1dCIsIGRpZmZfcHJvZHVjZWQ9IiIsCiAgICAgICAgICAgICkpCiAgICAgICAgICAgIHJlY29yZF9maXhfb3V0Y29tZShjdXJyZW50X2ZhaWx1cmUsIHRlc3RfcGF0aCwgIiIsIHN1Y2Nlc3M9RmFsc2UpCiAgICAgICAgICAgIGlmIGF0dGVtcHRfbnVtIDwgbWF4X3RvdGFsX2F0dGVtcHRzOgogICAgICAgICAgICAgICAgdGltZS5zbGVlcCg1KQogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgcmV0dXJuIFZlcmlmaWNhdGlvblJlc3VsdChzdWNjZXNzPUZhbHNlLCBhdHRlbXB0cz1hdHRlbXB0X2hpc3RvcnksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFpbHVyZV9yZWFzb249ZiJBaWRlciBmYWlsZWQgb24gYWxsIHtNQVhfUkVUUklFU30gYXR0ZW1wdHMiKQoKICAgICAgICAjIOKUgOKUgCBTdGVwIDQ6IEdldCBkaWZmIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgICAgIGRpZmZfdGV4dCA9IGdldF9jdXJyZW50X2RpZmYoKQogICAgICAgIGNoYW5nZWRfZmlsZXMgPSBnZXRfY2hhbmdlZF9maWxlcygpCgogICAgICAgICMg4pSA4pSAIFN0ZXAgNTogUkUtUlVOIFRFU1RTIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgICAgIHVpX2xvZyhmIlZlcmlmeWluZyBmaXgg4oCUIHJlLXJ1bm5pbmcgdGVzdHMgKGF0dGVtcHQge2F0dGVtcHRfbnVtfSkuLi4iLCAiSU5GTyIpCiAgICAgICAgdGVzdF9vdXRwdXQsIHRlc3RfY29kZSA9IF9hY3RpdmVfcnVudGltZS5ydW5fdGVzdHMoCiAgICAgICAgICAgIHRlc3RfcGF0aCwgUkVQT19ESVIsIGVudl9jb25maWcsIHRpbWVvdXQ9MTIwCiAgICAgICAgKQoKICAgICAgICBhdHRlbXB0ID0gVmVyaWZpY2F0aW9uQXR0ZW1wdCgKICAgICAgICAgICAgYXR0ZW1wdF9udW1iZXI9YXR0ZW1wdF9udW0sIHByb21wdF9oYXNoPXByb21wdF9oYXNoLAogICAgICAgICAgICBhaWRlcl9leGl0X2NvZGU9YWlkZXJfY29kZSwgdGVzdF9leGl0X2NvZGU9dGVzdF9jb2RlLAogICAgICAgICAgICB0ZXN0X291dHB1dD10ZXN0X291dHB1dCwgZGlmZl9wcm9kdWNlZD1kaWZmX3RleHQsCiAgICAgICAgKQogICAgICAgIGF0dGVtcHRfaGlzdG9yeS5hcHBlbmQoYXR0ZW1wdCkKCiAgICAgICAgIyDilIDilIAgU3RlcCA2OiBTQVNUIGdhdGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICAgICAgdWlfbG9nKCJSdW5uaW5nIFNBU1QgZ2F0ZSBvbiBBSSBkaWZmLi4uIiwgIlNBU1QiKQogICAgICAgIHNhc3RfcmVwb3J0ID0gX2FjdGl2ZV9ydW50aW1lLnJ1bl9zYXN0KGRpZmZfdGV4dCwgY2hhbmdlZF9maWxlcywgUkVQT19ESVIpCiAgICAgICAgbG9nX2F1ZGl0X2V2ZW50KCJTQVNUX1NDQU4iLCBqb2JfaWQsIHJlcG9fcmVmLCBNT0RFTCwgewogICAgICAgICAgICAiYXR0ZW1wdCI6IGF0dGVtcHRfbnVtLCAicGFzc2VkIjogc2FzdF9yZXBvcnQucGFzc2VkLAogICAgICAgICAgICAiZmluZGluZ3MiOiBsZW4oc2FzdF9yZXBvcnQuZmluZGluZ3MpLCAiYmxvY2tlZF9yZWFzb24iOiBzYXN0X3JlcG9ydC5ibG9ja2VkX3JlYXNvbiwKICAgICAgICB9LCAiUEFTU0VEIiBpZiBzYXN0X3JlcG9ydC5wYXNzZWQgZWxzZSAiQkxPQ0tFRCIpCgogICAgICAgIGlmIG5vdCBzYXN0X3JlcG9ydC5wYXNzZWQ6CiAgICAgICAgICAgIHVpX2xvZyhmIlNBU1QgQkxPQ0tFRDoge3Nhc3RfcmVwb3J0LmJsb2NrZWRfcmVhc29ufSIsICJTQVNUIikKICAgICAgICAgICAgbm90aWZ5X3Nhc3RfYmxvY2tlZCh0ZXN0X3BhdGgsIHNhc3RfcmVwb3J0LmJsb2NrZWRfcmVhc29uKQogICAgICAgICAgICByZWNvcmRfZml4X291dGNvbWUoY3VycmVudF9mYWlsdXJlLCB0ZXN0X3BhdGgsIGRpZmZfdGV4dCwgc3VjY2Vzcz1GYWxzZSkKICAgICAgICAgICAgcnVuX3N1YnByb2Nlc3Nfc2FmZShbImdpdCIsICJjaGVja291dCIsICIuIl0sIGN3ZD1SRVBPX0RJUiwgcmFpc2Vfb25fZXJyb3I9RmFsc2UpCiAgICAgICAgICAgIGN1cnJlbnRfZmFpbHVyZSA9IGYiUHJldmlvdXMgZml4IHdhcyBTQVNULWJsb2NrZWQ6IHtzYXN0X3JlcG9ydC5ibG9ja2VkX3JlYXNvbn1cblxuT3JpZ2luYWwgZmFpbHVyZTpcbntpbml0aWFsX2ZhaWx1cmV9IgogICAgICAgICAgICBpZiBhdHRlbXB0X251bSA8IG1heF90b3RhbF9hdHRlbXB0czoKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIHJldHVybiBWZXJpZmljYXRpb25SZXN1bHQoc3VjY2Vzcz1GYWxzZSwgYXR0ZW1wdHM9YXR0ZW1wdF9oaXN0b3J5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhaWx1cmVfcmVhc29uPSJTQVNUIGdhdGUgYmxvY2tlZCBhbGwgYXR0ZW1wdHMiKQoKICAgICAgICAjIOKUgOKUgCBTdGVwIDc6IFN1cHBseSBjaGFpbiBnYXRlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgICAgIHVpX2xvZygiUnVubmluZyBzdXBwbHkgY2hhaW4gZ2F0ZS4uLiIsICJTVVBQTFkiKQogICAgICAgIHNjX3JlcG9ydCA9IF9hY3RpdmVfcnVudGltZS5ydW5fc3VwcGx5X2NoYWluKGRpZmZfdGV4dCwgUkVQT19ESVIpCiAgICAgICAgbG9nX2F1ZGl0X2V2ZW50KCJTVVBQTFlfQ0hBSU5fU0NBTiIsIGpvYl9pZCwgcmVwb19yZWYsIE1PREVMLCB7CiAgICAgICAgICAgICJhdHRlbXB0IjogYXR0ZW1wdF9udW0sICJwYXNzZWQiOiBzY19yZXBvcnQucGFzc2VkLAogICAgICAgICAgICAibmV3X3BhY2thZ2VzIjogc2NfcmVwb3J0Lm5ld19wYWNrYWdlcywgImJsb2NrZWRfcmVhc29uIjogc2NfcmVwb3J0LmJsb2NrZWRfcmVhc29uLAogICAgICAgIH0sICJQQVNTRUQiIGlmIHNjX3JlcG9ydC5wYXNzZWQgZWxzZSAiQkxPQ0tFRCIpCgogICAgICAgIGlmIG5vdCBzY19yZXBvcnQucGFzc2VkOgogICAgICAgICAgICB1aV9sb2coZiJTVVBQTFkgQ0hBSU4gQkxPQ0tFRDoge3NjX3JlcG9ydC5ibG9ja2VkX3JlYXNvbn0iLCAiU1VQUExZIikKICAgICAgICAgICAgcnVuX3N1YnByb2Nlc3Nfc2FmZShbImdpdCIsICJjaGVja291dCIsICIuIl0sIGN3ZD1SRVBPX0RJUiwgcmFpc2Vfb25fZXJyb3I9RmFsc2UpCiAgICAgICAgICAgIGN1cnJlbnRfZmFpbHVyZSA9IGYiUHJldmlvdXMgZml4IGludHJvZHVjZWQgc3VwcGx5IGNoYWluIHJpc2s6IHtzY19yZXBvcnQuYmxvY2tlZF9yZWFzb259XG5cbk9yaWdpbmFsOlxue2luaXRpYWxfZmFpbHVyZX0iCiAgICAgICAgICAgIGlmIGF0dGVtcHRfbnVtIDwgbWF4X3RvdGFsX2F0dGVtcHRzOgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgcmV0dXJuIFZlcmlmaWNhdGlvblJlc3VsdChzdWNjZXNzPUZhbHNlLCBhdHRlbXB0cz1hdHRlbXB0X2hpc3RvcnksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFpbHVyZV9yZWFzb249IlN1cHBseSBjaGFpbiBnYXRlIGJsb2NrZWQgYWxsIGF0dGVtcHRzIikKCiAgICAgICAgIyDilIDilIAgU3RlcCA3YjogWjMgRk9STUFMIFZFUklGSUNBVElPTiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgICAgICB6M19yZXN1bHQgPSBydW5fZm9ybWFsX3ZlcmlmaWNhdGlvbihkaWZmX3RleHQpCiAgICAgICAgaWYgejNfcmVzdWx0WyJ2ZXJkaWN0Il0gPT0gIlVOU0FGRSI6CiAgICAgICAgICAgIHVpX2xvZyhmIlozIGZvcm1hbCB2ZXJpZmljYXRpb24gVU5TQUZFOiB7ejNfcmVzdWx0WydzdW1tYXJ5J119IiwgIlNBU1QiKQogICAgICAgICAgICBsb2dfYXVkaXRfZXZlbnQoIlozX1VOU0FGRSIsIGpvYl9pZCwgcmVwb19yZWYsIE1PREVMLCB7CiAgICAgICAgICAgICAgICAiYXR0ZW1wdCI6IGF0dGVtcHRfbnVtLCAiaXNzdWVzIjogejNfcmVzdWx0WyJpc3N1ZXMiXSwKICAgICAgICAgICAgICAgICJzdW1tYXJ5IjogejNfcmVzdWx0WyJzdW1tYXJ5Il0sCiAgICAgICAgICAgIH0sICJCTE9DS0VEIikKICAgICAgICAgICAgcmVjb3JkX2ZpeF9vdXRjb21lKGN1cnJlbnRfZmFpbHVyZSwgdGVzdF9wYXRoLCBkaWZmX3RleHQsIHN1Y2Nlc3M9RmFsc2UpCiAgICAgICAgICAgIHJ1bl9zdWJwcm9jZXNzX3NhZmUoWyJnaXQiLCAiY2hlY2tvdXQiLCAiLiJdLCBjd2Q9UkVQT19ESVIsIHJhaXNlX29uX2Vycm9yPUZhbHNlKQogICAgICAgICAgICBpc3N1ZXNfdGV4dCA9ICJcbiIuam9pbih6M19yZXN1bHRbImlzc3VlcyJdKQogICAgICAgICAgICBjdXJyZW50X2ZhaWx1cmUgPSAoCiAgICAgICAgICAgICAgICBmIllvdXIgcHJldmlvdXMgZml4IHdhcyBSRUpFQ1RFRCBieSBaMyBmb3JtYWwgdmVyaWZpY2F0aW9uLlxuIgogICAgICAgICAgICAgICAgZiJJc3N1ZXM6XG57aXNzdWVzX3RleHR9XG5cbiIKICAgICAgICAgICAgICAgIGYiT3JpZ2luYWw6XG57aW5pdGlhbF9mYWlsdXJlfSIKICAgICAgICAgICAgKQogICAgICAgICAgICBpZiBhdHRlbXB0X251bSA8IG1heF90b3RhbF9hdHRlbXB0czoKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIHJldHVybiBWZXJpZmljYXRpb25SZXN1bHQoc3VjY2Vzcz1GYWxzZSwgYXR0ZW1wdHM9YXR0ZW1wdF9oaXN0b3J5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhaWx1cmVfcmVhc29uPSJaMyBmb3JtYWwgdmVyaWZpY2F0aW9uIHJlamVjdGVkIGFsbCBhdHRlbXB0cyIpCiAgICAgICAgZWxpZiB6M19yZXN1bHRbInZlcmRpY3QiXSA9PSAiU0FGRSI6CiAgICAgICAgICAgIHVpX2xvZyhmIlozOiB7ejNfcmVzdWx0WydzdW1tYXJ5J119IiwgIklORk8iKQoKICAgICAgICAjIOKUgOKUgCBTdGVwIDg6IEFEVkVSU0FSSUFMIExMTSBSRVZJRVcg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICAgICAgdWlfbG9nKCJEaXNwYXRjaGluZyBhZHZlcnNhcmlhbCByZXZpZXdlciAocmVkIHRlYW0pLi4uIiwgIkFEViIpCiAgICAgICAgYWR2X3JldmlldyA9IHJ1bl9hZHZlcnNhcmlhbF9yZXZpZXcoZGlmZl90ZXh0LCB0ZXN0X3BhdGgsIGluaXRpYWxfZmFpbHVyZSwgcmVwb19yZWYpCiAgICAgICAgdmVyZGljdCA9IGFkdl9yZXZpZXcuZ2V0KCJ2ZXJkaWN0IiwgIkNPTkRJVElPTkFMIikKCiAgICAgICAgbG9nX2F1ZGl0X2V2ZW50KCJBRFZFUlNBUklBTF9SRVZJRVciLCBqb2JfaWQsIHJlcG9fcmVmLCBNT0RFTCwgewogICAgICAgICAgICAiYXR0ZW1wdCI6IGF0dGVtcHRfbnVtLCAidmVyZGljdCI6IHZlcmRpY3QsCiAgICAgICAgICAgICJtb2RlbCI6IGFkdl9yZXZpZXcuZ2V0KCJtb2RlbF91c2VkIiksICJyZXZpZXdfaGFzaCI6IGFkdl9yZXZpZXcuZ2V0KCJyZXZpZXdfaGFzaCIpLAogICAgICAgICAgICAiY3JpdGljYWxfaXNzdWVzIjogYWR2X3Jldmlldy5nZXQoImNyaXRpY2FsX2lzc3VlcyIsIFtdKSwKICAgICAgICAgICAgInN1bW1hcnkiOiBhZHZfcmV2aWV3LmdldCgic3VtbWFyeSIsICIiKSwKICAgICAgICB9LCB2ZXJkaWN0KQoKICAgICAgICBpZiBhZHZfcmV2aWV3LmdldCgid2FybmluZ3MiKToKICAgICAgICAgICAgZm9yIHcgaW4gYWR2X3Jldmlld1sid2FybmluZ3MiXToKICAgICAgICAgICAgICAgIHVpX2xvZyhmIkFkdmVyc2FyeSB3YXJuaW5nOiB7d30iLCAiQURWIikKCiAgICAgICAgaWYgdmVyZGljdCA9PSAiUkVKRUNUIjoKICAgICAgICAgICAgdWlfbG9nKGYiQURWRVJTQVJJQUwgUkVKRUNURUQ6IHthZHZfcmV2aWV3LmdldCgnc3VtbWFyeScsICcnKX0iLCAiQURWIikKICAgICAgICAgICAgZm9yIGlzc3VlIGluIGFkdl9yZXZpZXcuZ2V0KCJjcml0aWNhbF9pc3N1ZXMiLCBbXSk6CiAgICAgICAgICAgICAgICB1aV9sb2coZiIgIENyaXRpY2FsOiB7aXNzdWV9IiwgIkFEViIpCiAgICAgICAgICAgIHJlY29yZF9maXhfb3V0Y29tZShjdXJyZW50X2ZhaWx1cmUsIHRlc3RfcGF0aCwgZGlmZl90ZXh0LCBzdWNjZXNzPUZhbHNlKQogICAgICAgICAgICBydW5fc3VicHJvY2Vzc19zYWZlKFsiZ2l0IiwgImNoZWNrb3V0IiwgIi4iXSwgY3dkPVJFUE9fRElSLCByYWlzZV9vbl9lcnJvcj1GYWxzZSkKICAgICAgICAgICAgY3JpdGlxdWUgPSBhZHZfcmV2aWV3LmdldCgicmV0cnlfZ3VpZGFuY2UiLCAiIikKICAgICAgICAgICAgaXNzdWVzID0gIlxuIi5qb2luKGFkdl9yZXZpZXcuZ2V0KCJjcml0aWNhbF9pc3N1ZXMiLCBbXSkpCiAgICAgICAgICAgIGN1cnJlbnRfZmFpbHVyZSA9ICgKICAgICAgICAgICAgICAgIGYiWW91ciBwcmV2aW91cyBmaXggd2FzIFJFSkVDVEVEIGJ5IGFkdmVyc2FyaWFsIHJldmlldy5cbiIKICAgICAgICAgICAgICAgIGYiQ3JpdGljYWwgaXNzdWVzIGZvdW5kOlxue2lzc3Vlc31cbiIKICAgICAgICAgICAgICAgIGYiR3VpZGFuY2U6IHtjcml0aXF1ZX1cblxuIgogICAgICAgICAgICAgICAgZiJPcmlnaW5hbCBmYWlsdXJlOlxue2luaXRpYWxfZmFpbHVyZX0iCiAgICAgICAgICAgICkKICAgICAgICAgICAgaWYgYXR0ZW1wdF9udW0gPCBtYXhfdG90YWxfYXR0ZW1wdHM6CiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICByZXR1cm4gVmVyaWZpY2F0aW9uUmVzdWx0KHN1Y2Nlc3M9RmFsc2UsIGF0dGVtcHRzPWF0dGVtcHRfaGlzdG9yeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWlsdXJlX3JlYXNvbj0iQWR2ZXJzYXJpYWwgcmV2aWV3ZXIgcmVqZWN0ZWQgYWxsIGF0dGVtcHRzIikKCiAgICAgICAgIyDilIDilIAgU3RlcCA5OiBDaGVjayBpZiB0ZXN0cyBwYXNzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgICAgIGlmIHRlc3RfY29kZSAhPSAwOgogICAgICAgICAgICB1aV9sb2coZiJUZXN0cyBzdGlsbCBmYWlsaW5nIGFmdGVyIGF0dGVtcHQge2F0dGVtcHRfbnVtfS4gUmV0cnlpbmcuLi4iLCAiUkVUUlkiKQogICAgICAgICAgICByZWNvcmRfZml4X291dGNvbWUoY3VycmVudF9mYWlsdXJlLCB0ZXN0X3BhdGgsIGRpZmZfdGV4dCwgc3VjY2Vzcz1GYWxzZSkKICAgICAgICAgICAgY3VycmVudF9mYWlsdXJlID0gKAogICAgICAgICAgICAgICAgZiJBdHRlbXB0IHthdHRlbXB0X251bX0gZml4IGRpZCBub3Qgc29sdmUgdGhlIHByb2JsZW0uXG4iCiAgICAgICAgICAgICAgICBmIk5ldyBmYWlsdXJlOlxue3Rlc3Rfb3V0cHV0WzoxNTAwXX1cblxuIgogICAgICAgICAgICAgICAgZiJPcmlnaW5hbCBmYWlsdXJlOlxue2luaXRpYWxfZmFpbHVyZX0iCiAgICAgICAgICAgICkKICAgICAgICAgICAgcnVuX3N1YnByb2Nlc3Nfc2FmZShbImdpdCIsICJjaGVja291dCIsICIuIl0sIGN3ZD1SRVBPX0RJUiwgcmFpc2Vfb25fZXJyb3I9RmFsc2UpCiAgICAgICAgICAgIGlmIGF0dGVtcHRfbnVtIDwgbWF4X3RvdGFsX2F0dGVtcHRzOgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgcmV0dXJuIFZlcmlmaWNhdGlvblJlc3VsdChzdWNjZXNzPUZhbHNlLCBhdHRlbXB0cz1hdHRlbXB0X2hpc3RvcnksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFpbHVyZV9yZWFzb249ZiJUZXN0cyBzdGlsbCBmYWlsaW5nIGFmdGVyIHtNQVhfUkVUUklFU30gYXR0ZW1wdHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsX3Rlc3Rfb3V0cHV0PXRlc3Rfb3V0cHV0KQoKICAgICAgICAjIOKUgOKUgCBFVkVSWVRISU5HIFBBU1NFRCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgICAgICB1aV9sb2coZiJWRVJJRklFRCBHUkVFTiBvbiBhdHRlbXB0IHthdHRlbXB0X251bX06IHt0ZXN0X3BhdGh9IiwgIk9LIikKICAgICAgICBlbnN1cmVfZml4X2NvbW1pdHRlZCh0ZXN0X3BhdGgpCiAgICAgICAgZGlmZl90ZXh0ID0gZ2V0X2N1cnJlbnRfZGlmZigpCiAgICAgICAgcmVjb3JkX2ZpeF9vdXRjb21lKGN1cnJlbnRfZmFpbHVyZSwgdGVzdF9wYXRoLCBkaWZmX3RleHQsIHN1Y2Nlc3M9VHJ1ZSkKICAgICAgICByZXR1cm4gVmVyaWZpY2F0aW9uUmVzdWx0KAogICAgICAgICAgICBzdWNjZXNzPVRydWUsIGF0dGVtcHRzPWF0dGVtcHRfaGlzdG9yeSwKICAgICAgICAgICAgZmluYWxfZGlmZj1kaWZmX3RleHQsIGZpbmFsX3Rlc3Rfb3V0cHV0PXRlc3Rfb3V0cHV0LAogICAgICAgICAgICB0b3RhbF9hdHRlbXB0cz1hdHRlbXB0X251bSwKICAgICAgICApCgogICAgcmV0dXJuIFZlcmlmaWNhdGlvblJlc3VsdChzdWNjZXNzPUZhbHNlLCBhdHRlbXB0cz1hdHRlbXB0X2hpc3RvcnksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhaWx1cmVfcmVhc29uPSJNYXggcmV0cmllcyBleGNlZWRlZCIpCgoKIyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKIyBNQUlOIEFVRElUIE9SQ0hFU1RSQVRPUgojIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgApkZWYgcHJvY2Vzc19hdWRpdF90ZXN0KAogICAgdGVzdF9wYXRoOiBzdHIsCiAgICBlbnZfY29uZmlnOiBFbnZDb25maWcsICAgICAgICAgICMg4oaQIHJlcGxhY2VzIHB5dGVzdF9iaW4KICAgIG1jcF9jb25maWdfcGF0aDogc3RyLAogICAgdGVuYW50X2lkOiBzdHIsCiAgICB0YXJnZXRfcmVwbzogc3RyLAopIC0+IGRpY3Q6CiAgICBmaWxlbmFtZSA9IG9zLnBhdGguYmFzZW5hbWUodGVzdF9wYXRoKQogICAgYnJhbmNoX25hbWUgPSBmInJob2Rhd2svYXV0by1wYXRjaC97ZmlsZW5hbWUucmVwbGFjZSgnLnB5JywnJykucmVwbGFjZSgnXycsJy0nKX0iCgogICAgY3VycmVudF9zdGF0dXMgPSBnZXRfam9iX3N0YXR1c19lbnVtKHRlbmFudF9pZCwgdGFyZ2V0X3JlcG8sIHRlc3RfcGF0aCkKICAgIGlmIGN1cnJlbnRfc3RhdHVzID09IEpvYlN0YXR1cy5ET05FOgogICAgICAgIHVpX2xvZyhmIlNraXBwaW5nIChET05FKToge3Rlc3RfcGF0aH0iLCAiU0tJUCIpCiAgICAgICAgcmV0dXJuIHsic2tpcHBlZCI6IFRydWV9CiAgICBpZiBjdXJyZW50X3N0YXR1cyA9PSBKb2JTdGF0dXMuUlVOTklORzoKICAgICAgICB1aV9sb2coZiJDbGVhbmluZyBpbnRlcnJ1cHRlZCBqb2I6IHt0ZXN0X3BhdGh9IiwgIldBUk4iKQogICAgICAgIGNsZWFudXBfc3RhbGVfYnJhbmNoKGJyYW5jaF9uYW1lKQogICAgICAgIHNhZmVfZ2l0X3B1bGwoKQoKICAgIGpvYl9pZCA9IHVwc2VydF9qb2IodGVuYW50X2lkLCB0YXJnZXRfcmVwbywgdGVzdF9wYXRoLCBKb2JTdGF0dXMuUlVOTklORykKICAgIHVpX2xvZyhmIlRlc3Rpbmc6IHt0ZXN0X3BhdGh9IFtqb2I6e2pvYl9pZH1dIikKCiAgICBpbml0aWFsX291dHB1dCwgcHl0ZXN0X2NvZGUgPSBfYWN0aXZlX3J1bnRpbWUucnVuX3Rlc3RzKAogICAgICAgIHRlc3RfcGF0aCwgUkVQT19ESVIsIGVudl9jb25maWcsIHRpbWVvdXQ9MTIwCiAgICApCgogICAgaWYgcHl0ZXN0X2NvZGUgPT0gMDoKICAgICAgICB1aV9sb2coZiJQQVNTRUQ6IHt0ZXN0X3BhdGh9IiwgIk9LIikKICAgICAgICB1cHNlcnRfam9iKHRlbmFudF9pZCwgdGFyZ2V0X3JlcG8sIHRlc3RfcGF0aCwgSm9iU3RhdHVzLkRPTkUsICJ0ZXN0cyBwYXNzZWQiKQogICAgICAgIGxvZ19hdWRpdF9ldmVudCgiVEVTVF9QQVNTIiwgam9iX2lkLCB0YXJnZXRfcmVwbywgTU9ERUwsCiAgICAgICAgICAgICAgICAgICAgICAgIHsidGVzdCI6IHRlc3RfcGF0aCwgImF0dGVtcHQiOiAwfSwgIlBBU1NFRCIpCiAgICAgICAgcmVjb3JkX2F0dGVtcHQodGVuYW50X2lkLCB0YXJnZXRfcmVwbywgdGVzdF9wYXRoLCBpbml0aWFsX291dHB1dCwgTU9ERUwsCiAgICAgICAgICAgICAgICAgICAgICAgImJhc2VsaW5lIiwgMCwgdGVzdF9wYXNzZWRfYWZ0ZXI9VHJ1ZSkKICAgICAgICByZXR1cm4geyJzdWNjZXNzIjogVHJ1ZSwgImFscmVhZHlfZ3JlZW4iOiBUcnVlfQoKICAgIHVpX2xvZyhmIkZBSUxFRDoge3Rlc3RfcGF0aH0g4oCUIGVudGVyaW5nIGhlYWxpbmcgbG9vcC4uLiIsICJGQUlMIikKICAgIG5vdGlmeV90ZXN0X2ZhaWxlZCh0ZXN0X3BhdGgpCiAgICBsb2dfYXVkaXRfZXZlbnQoIlRFU1RfRkFJTCIsIGpvYl9pZCwgdGFyZ2V0X3JlcG8sIE1PREVMLCB7InRlc3QiOiB0ZXN0X3BhdGh9LCAiRkFJTEVEIikKCiAgICByZXN1bHQgPSBwcm9jZXNzX2ZhaWxpbmdfdGVzdCgKICAgICAgICB0ZXN0X3BhdGgsIGluaXRpYWxfb3V0cHV0LCBlbnZfY29uZmlnLCBtY3BfY29uZmlnX3BhdGgsCiAgICAgICAgam9iX2lkLCBicmFuY2hfbmFtZSwgdGFyZ2V0X3JlcG89dGFyZ2V0X3JlcG8sCiAgICApCgogICAgYXR0ZW1wdF9pZCA9IHJlY29yZF9hdHRlbXB0KAogICAgICAgIHRlbmFudF9pZCwgdGFyZ2V0X3JlcG8sIHRlc3RfcGF0aCwgaW5pdGlhbF9vdXRwdXQsIE1PREVMLAogICAgICAgIGhhc2hsaWIuc2hhMjU2KGluaXRpYWxfb3V0cHV0LmVuY29kZSgpKS5oZXhkaWdlc3QoKVs6MTZdLAogICAgICAgIGF0dGVtcHRfbnVtYmVyPXJlc3VsdC50b3RhbF9hdHRlbXB0cyBvciBsZW4ocmVzdWx0LmF0dGVtcHRzKSwKICAgICAgICBkaWZmX3Byb2R1Y2VkPXJlc3VsdC5maW5hbF9kaWZmLAogICAgICAgIHRlc3RfcGFzc2VkX2FmdGVyPXJlc3VsdC5zdWNjZXNzLAogICAgKQoKICAgIGlmIHJlc3VsdC5zdWNjZXNzOgogICAgICAgIHByX3VybCA9ICIiCiAgICAgICAgZm9ya19tb2RlID0gb3MuZ2V0ZW52KCJSSE9EQVdLX0ZPUktfTU9ERSIsICJmYWxzZSIpLmxvd2VyKCkgPT0gInRydWUiCiAgICAgICAgdHJ5OgogICAgICAgICAgICBpZiBwdXNoX2ZpeF9icmFuY2goYnJhbmNoX25hbWUpOgogICAgICAgICAgICAgICAgZnJvbSBnaXRodWJfYXBwIGltcG9ydCBvcGVuX3ByX2Zvcl9yZXBvCiAgICAgICAgICAgICAgICBwcl91cmwgPSBvcGVuX3ByX2Zvcl9yZXBvKAogICAgICAgICAgICAgICAgICAgIHRhcmdldF9yZXBvLCBicmFuY2hfbmFtZSwgdGVzdF9wYXRoLAogICAgICAgICAgICAgICAgICAgIGdldF9naXRodWJfdG9rZW4odGFyZ2V0X3JlcG8pLCBmb3JrX21vZGU9Zm9ya19tb2RlLAogICAgICAgICAgICAgICAgKQogICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICAgICAgdWlfbG9nKGYiUFIgY3JlYXRpb24gZmFpbGVkIGZvciB7dGVzdF9wYXRofToge2V9IiwgIldBUk4iKQoKICAgICAgICB1cGRhdGVfdGVzdF9yZXN1bHQoYXR0ZW1wdF9pZCwgVHJ1ZSwgcHJfdXJsKQogICAgICAgIHVwc2VydF9qb2IodGVuYW50X2lkLCB0YXJnZXRfcmVwbywgdGVzdF9wYXRoLCBKb2JTdGF0dXMuRE9ORSwKICAgICAgICAgICAgICAgICAgIGYiaGVhbGVkIGluIHtyZXN1bHQudG90YWxfYXR0ZW1wdHN9IGF0dGVtcHQocykg4oCUIFBSIHN1Ym1pdHRlZCIsCiAgICAgICAgICAgICAgICAgICBwcl91cmw9cHJfdXJsLCBtb2RlbF92ZXJzaW9uPU1PREVMKQogICAgICAgIGlmIHByX3VybDoKICAgICAgICAgICAgbm90aWZ5X3ByX2NyZWF0ZWQodGVzdF9wYXRoLCBwcl91cmwpCiAgICAgICAgdWlfbG9nKGYiUFIgc3VibWl0dGVkIGZvciB7dGVzdF9wYXRofSAoaGVhbGVkIGluIHtyZXN1bHQudG90YWxfYXR0ZW1wdHN9IGF0dGVtcHQocykpIiwgIlBSIikKICAgICAgICBsb2dfYXVkaXRfZXZlbnQoIlBSX1NVQk1JVFRFRCIsIGpvYl9pZCwgdGFyZ2V0X3JlcG8sIE1PREVMLAogICAgICAgICAgICAgICAgICAgICAgICB7InRlc3QiOiB0ZXN0X3BhdGgsICJhdHRlbXB0cyI6IHJlc3VsdC50b3RhbF9hdHRlbXB0cywKICAgICAgICAgICAgICAgICAgICAgICAgICJicmFuY2giOiBicmFuY2hfbmFtZSwgInByX3VybCI6IHByX3VybCwKICAgICAgICAgICAgICAgICAgICAgICAgICJmb3JrX21vZGUiOiBmb3JrX21vZGV9LCAiU1VDQ0VTUyIpCgogICAgICAgICMg4pSA4pSAIENvbnZpY3Rpb24gYXV0by1tZXJnZSBjaGVjayDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgICAgICBpZiBwcl91cmw6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGxhc3RfYWR2ID0ge30KICAgICAgICAgICAgICAgIGZvciBhdHRlbXB0IGluIHJldmVyc2VkKHJlc3VsdC5hdHRlbXB0cyBvciBbXSk6CiAgICAgICAgICAgICAgICAgICAgaWYgaGFzYXR0cihhdHRlbXB0LCAiYWR2X3JldmlldyIpIGFuZCBhdHRlbXB0LmFkdl9yZXZpZXc6CiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RfYWR2ID0gYXR0ZW1wdC5hZHZfcmV2aWV3CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCgogICAgICAgICAgICAgICAgc2ltaWxhciA9IHJldHJpZXZlX3NpbWlsYXJfZml4ZXNfdjIocmVzdWx0LmZpbmFsX3Rlc3Rfb3V0cHV0IG9yICIiLCB0b3Bfaz01KQogICAgICAgICAgICAgICAgc2FzdF9jb3VudCA9IHN1bSgKICAgICAgICAgICAgICAgICAgICBsZW4oYS5zYXN0X2ZpbmRpbmdzKSBpZiBoYXNhdHRyKGEsICJzYXN0X2ZpbmRpbmdzIikgZWxzZSAwCiAgICAgICAgICAgICAgICAgICAgZm9yIGEgaW4gKHJlc3VsdC5hdHRlbXB0cyBvciBbXSkKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHNjX25ld19wa2dzOiBsaXN0ID0gW10KICAgICAgICAgICAgICAgIHNob3VsZF9tZXJnZSwgY29udmljdGlvbl9yZWFzb24gPSBldmFsdWF0ZV9jb252aWN0aW9uKAogICAgICAgICAgICAgICAgICAgIGFkdmVyc2FyaWFsX3Jldmlldz1sYXN0X2FkdiwKICAgICAgICAgICAgICAgICAgICBzaW1pbGFyX2ZpeGVzPXNpbWlsYXIsCiAgICAgICAgICAgICAgICAgICAgdGVzdF9hdHRlbXB0cz1yZXN1bHQudG90YWxfYXR0ZW1wdHMgb3IgMSwKICAgICAgICAgICAgICAgICAgICBzYXN0X2ZpbmRpbmdzX2NvdW50PXNhc3RfY291bnQsCiAgICAgICAgICAgICAgICAgICAgbmV3X3BhY2thZ2VzPXNjX25ld19wa2dzLAogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgaWYgc2hvdWxkX21lcmdlOgogICAgICAgICAgICAgICAgICAgIHRva2VuID0gZ2V0X2dpdGh1Yl90b2tlbih0YXJnZXRfcmVwbykKICAgICAgICAgICAgICAgICAgICBvaywgbWVyZ2VfbXNnID0gYXV0b19tZXJnZV9wcih0YXJnZXRfcmVwbywgcHJfdXJsLCB0b2tlbikKICAgICAgICAgICAgICAgICAgICBpZiBvazoKICAgICAgICAgICAgICAgICAgICAgICAgdWlfbG9nKGYiQVVUTy1NRVJHRUQ6IHtwcl91cmx9ICh7Y29udmljdGlvbl9yZWFzb259KSIsICJQUiIpCiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ19hdWRpdF9ldmVudCgiQVVUT19NRVJHRSIsIGpvYl9pZCwgdGFyZ2V0X3JlcG8sIE1PREVMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJwcl91cmwiOiBwcl91cmwsICJyZWFzb24iOiBjb252aWN0aW9uX3JlYXNvbn0sICJNRVJHRUQiKQogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIHVpX2xvZyhmIkF1dG8tbWVyZ2UgYXR0ZW1wdGVkIGJ1dCBmYWlsZWQ6IHttZXJnZV9tc2d9IiwgIldBUk4iKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICB1aV9sb2coZiJDb252aWN0aW9uIG5vdCBtZXQgKHtjb252aWN0aW9uX3JlYXNvbn0pIOKAlCBQUiByZXF1aXJlcyBodW1hbiByZXZpZXciLCAiSU5GTyIpCiAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICAgICAgICAgIHVpX2xvZyhmIkNvbnZpY3Rpb24gY2hlY2sgZXJyb3IgKG5vbi1ibG9ja2luZyk6IHtlfSIsICJXQVJOIikKCiAgICAgICAgcnVuX3N1YnByb2Nlc3Nfc2FmZShbImdpdCIsICJjaGVja291dCIsICJtYWluIl0sIGN3ZD1SRVBPX0RJUiwgcmFpc2Vfb25fZXJyb3I9RmFsc2UpCiAgICAgICAgc2FmZV9naXRfcHVsbCgpCiAgICAgICAgcmV0dXJuIHsic3VjY2VzcyI6IFRydWUsICJwcl91cmwiOiBwcl91cmx9CgogICAgdXBkYXRlX3Rlc3RfcmVzdWx0KGF0dGVtcHRfaWQsIEZhbHNlKQogICAgdXBzZXJ0X2pvYih0ZW5hbnRfaWQsIHRhcmdldF9yZXBvLCB0ZXN0X3BhdGgsIEpvYlN0YXR1cy5GQUlMRUQsIHJlc3VsdC5mYWlsdXJlX3JlYXNvbikKICAgIG5vdGlmeV9wYXRjaF9mYWlsZWQodGVzdF9wYXRoKQogICAgdWlfbG9nKGYiVU5SRVNPTFZFRCBhZnRlciB7TUFYX1JFVFJJRVN9IGF0dGVtcHRzOiB7cmVzdWx0LmZhaWx1cmVfcmVhc29ufSIsICJGQUlMIikKICAgIGxvZ19hdWRpdF9ldmVudCgiSEVBTElOR19FWEhBVVNURUQiLCBqb2JfaWQsIHRhcmdldF9yZXBvLCBNT0RFTCwKICAgICAgICAgICAgICAgICAgICB7InRlc3QiOiB0ZXN0X3BhdGgsICJyZWFzb24iOiByZXN1bHQuZmFpbHVyZV9yZWFzb259LCAiRkFJTEVEIikKICAgIHJ1bl9zdWJwcm9jZXNzX3NhZmUoWyJnaXQiLCAiY2hlY2tvdXQiLCAibWFpbiJdLCBjd2Q9UkVQT19ESVIsIHJhaXNlX29uX2Vycm9yPUZhbHNlKQogICAgc2FmZV9naXRfcHVsbCgpCiAgICByZXR1cm4geyJzdWNjZXNzIjogRmFsc2UsICJlcnJvciI6IHJlc3VsdC5mYWlsdXJlX3JlYXNvbn0KCgpkZWYgZW50ZXJwcmlzZV9hdWRpdF9sb29wKHJlcG9fb3ZlcnJpZGU6IHN0ciA9IE5vbmUsIGJyYW5jaDogc3RyID0gIm1haW4iLCBzcGVjaWZpY190ZXN0OiBzdHIgPSBOb25lKToKICAgIGdsb2JhbCBSRVBPX0RJUiwgX2N1cnJlbnRfdGFyZ2V0X3JlcG8KCiAgICB0YXJnZXRfcmVwbyA9IF9ub3JtYWxpemVfcmVwbyhyZXBvX292ZXJyaWRlIG9yICIiKSBvciBfbm9ybWFsaXplX3JlcG8oR0lUSFVCX1JFUE8pIG9yIChyZXBvX292ZXJyaWRlIG9yIEdJVEhVQl9SRVBPIG9yICIiKS5zdHJpcCgpCiAgICBpZiBub3QgdGFyZ2V0X3JlcG86CiAgICAgICAgdWlfbG9nKCJObyB0YXJnZXQgcmVwbyBjb25maWd1cmVkLiBFbnRlciBvbmUgaW4gdGhlIGNoYXQgaW5ib3ggb3Igc2V0IEdJVEhVQl9SRVBPLiIsICJGQUlMIikKICAgICAgICBfYXVkaXRfZXZlbnQuY2xlYXIoKQogICAgICAgIHJldHVybgoKICAgICMg4pSA4pSAIEtFWSBGSVg6IGdpdmUgZXZlcnkgcmVwbyBpdHMgb3duIGRpcmVjdG9yeSBzbyBzd2l0Y2hpbmcgcmVwb3MKICAgICMgbmV2ZXIgcmUtdXNlcyBhIHN0YWxlIGNsb25lIGZyb20gYSBwcmV2aW91cyBhdWRpdC4g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICBzYWZlX25hbWUgPSB0YXJnZXRfcmVwby5yZXBsYWNlKCIvIiwgIl8iKS5yZXBsYWNlKCIuIiwgIl8iKQogICAgUkVQT19ESVIgPSBmIntQRVJTSVNURU5UX0RJUn0vcmVwb197c2FmZV9uYW1lfSIKICAgIF9jdXJyZW50X3RhcmdldF9yZXBvID0gdGFyZ2V0X3JlcG8KCiAgICB1aV9sb2coIuKVkCIgKiA3MCkKICAgIHVpX2xvZyhmIkFVRElUIFNUQVJUIOKAlCBUZW5hbnQ6IHtURU5BTlRfSUR9IHwgUmVwbzoge3RhcmdldF9yZXBvfSB8IERpcjoge1JFUE9fRElSfSB8IE1vZGVsOiB7TU9ERUx9IikKICAgIG5vdGlmeV9hdWRpdF9zdGFydCh0YXJnZXRfcmVwbykKICAgIGxvZ19hdWRpdF9ldmVudCgiQVVESVRfU1RBUlQiLCAib3JjaGVzdHJhdG9yIiwgdGFyZ2V0X3JlcG8sIE1PREVMLAogICAgICAgICAgICAgICAgICAgIHsidGVuYW50IjogVEVOQU5UX0lELCAiYnJhbmNoIjogYnJhbmNoLCAicmVwb19kaXIiOiBSRVBPX0RJUn0sICJTVEFSVEVEIikKCiAgICAjIFBydW5lIHN0YWxlIGNvbXBsZXRlZCBqb2JzIGF0IHRoZSBzdGFydCBvZiBlYWNoIGF1ZGl0IHJ1biAoVFRMIGZpeCkKICAgIGZyb20gam9iX3F1ZXVlIGltcG9ydCBwcnVuZV9kb25lX2pvYnMKICAgIHBydW5lZCA9IHBydW5lX2RvbmVfam9icyhtYXhfYWdlX2hvdXJzPTcyKQogICAgaWYgcHJ1bmVkOgogICAgICAgIHVpX2xvZyhmIlBydW5lZCB7cHJ1bmVkfSBjb21wbGV0ZWQgam9iKHMpIG9sZGVyIHRoYW4gNzJoIGZyb20gcXVldWUuIiwgIklORk8iKQoKICAgIGNyZWRfcGF0aCA9ICIvdG1wLy5naXQtY3JlZGVudGlhbHMiCiAgICB0cnk6CiAgICAgICAgY29uZmlndXJlX2dpdF9jcmVkZW50aWFscygpCiAgICAgICAgbWNwX2NvbmZpZ19wYXRoID0gd3JpdGVfbWNwX2NvbmZpZygpCgogICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhSRVBPX0RJUik6CiAgICAgICAgICAgIHVpX2xvZyhmIkNsb25pbmcge3RhcmdldF9yZXBvfSDihpIge1JFUE9fRElSfSAuLi4iKQogICAgICAgICAgICAjIEZJWC0wMDk6IFVzZSBydW5fc3VicHJvY2Vzc19zYWZlIGluc3RlYWQgb2YgUmVwby5jbG9uZV9mcm9tIHNvIHRoYXQKICAgICAgICAgICAgIyBHSVRfQ09ORklHX0dMT0JBTCAoc2V0IGJ5IGNvbmZpZ3VyZV9naXRfY3JlZGVudGlhbHMpIGlzIHByb3BhZ2F0ZWQgdG8KICAgICAgICAgICAgIyB0aGUgZ2l0IHN1YnByb2Nlc3MgdmlhIG9zLmVudmlyb24uY29weSgpLiAgZ2l0cHl0aG9uJ3MgUmVwby5jbG9uZV9mcm9tCiAgICAgICAgICAgICMgc3Bhd25zIGl0cyBvd24gc3VicHJvY2VzcyB3aGljaCBpbmhlcml0cyBvcy5lbnZpcm9uLCBidXQgb25seSB3aGVuIHRoZQogICAgICAgICAgICAjIGVudiBwYXJhbWV0ZXIgaXMgbm90IG92ZXJyaWRkZW4g4oCUIHVzaW5nIHJ1bl9zdWJwcm9jZXNzX3NhZmUgaXMgc2FmZXIKICAgICAgICAgICAgIyBiZWNhdXNlIGl0IGV4cGxpY2l0bHkgY29waWVzIG9zLmVudmlyb24gKGluY2x1ZGluZyBHSVRfQ09ORklHX0dMT0JBTCkuCiAgICAgICAgICAgIHJ1bl9zdWJwcm9jZXNzX3NhZmUoCiAgICAgICAgICAgICAgICBbImdpdCIsICJjbG9uZSIsICItdiIsIGYiaHR0cHM6Ly9naXRodWIuY29tL3t0YXJnZXRfcmVwb30uZ2l0IiwgUkVQT19ESVJdLAogICAgICAgICAgICAgICAgY3dkPSIvdG1wIiwgcmFpc2Vfb25fZXJyb3I9VHJ1ZSwKICAgICAgICAgICAgKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHVpX2xvZyhmIlJlcG8gZGlyIGV4aXN0cyDigJQgc3luY2luZyB7dGFyZ2V0X3JlcG99IHRvIGxhdGVzdCBvcmlnaW4vbWFpbiAuLi4iKQogICAgICAgICAgICBzYWZlX2dpdF9wdWxsKCkKCiAgICAgICAgIyDilIDilIAgTGFuZ3VhZ2UgZGV0ZWN0aW9uIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgICAgICMgQlVHLTAwNyBGSVg6IGFjcXVpcmUgbG9jayBiZWZvcmUgb3ZlcndyaXRpbmcgX2FjdGl2ZV9ydW50aW1lIHNvIGEKICAgICAgICAjIGNvbmN1cnJlbnQgd2ViaG9vay10cmlnZ2VyZWQgYXVkaXQgY2Fubm90IHN3YXAgdGhlIHJ1bnRpbWUgdW5kZXIKICAgICAgICAjIGluLWZsaWdodCB3b3JrZXJzIGZyb20gYSBwcmV2aW91cyBhdWRpdC4KICAgICAgICBnbG9iYWwgX2FjdGl2ZV9ydW50aW1lCiAgICAgICAgd2l0aCBfYWN0aXZlX3J1bnRpbWVfbG9jazoKICAgICAgICAgICAgX2FjdGl2ZV9ydW50aW1lID0gUnVudGltZUZhY3RvcnkuZm9yX3JlcG8oUkVQT19ESVIpCiAgICAgICAgdWlfbG9nKGYiRGV0ZWN0ZWQgbGFuZ3VhZ2U6IHtfYWN0aXZlX3J1bnRpbWUubGFuZ3VhZ2UudXBwZXIoKX0iLCAiSU5GTyIpCgogICAgICAgIGVudl9jb25maWcgPSBfYWN0aXZlX3J1bnRpbWUuc2V0dXBfZW52KFJFUE9fRElSLCBQRVJTSVNURU5UX0RJUikKCiAgICAgICAgIyDilIDilIAgVGVzdCBkaXNjb3Zlcnkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICAgICAgaWYgc3BlY2lmaWNfdGVzdDoKICAgICAgICAgICAgcmVsYXRpdmVfdGVzdHMgPSAoCiAgICAgICAgICAgICAgICBbc3BlY2lmaWNfdGVzdF0KICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKG9zLnBhdGguam9pbihSRVBPX0RJUiwgc3BlY2lmaWNfdGVzdCkpCiAgICAgICAgICAgICAgICBlbHNlIFtdCiAgICAgICAgICAgICkKICAgICAgICBlbHNlOgogICAgICAgICAgICByZWxhdGl2ZV90ZXN0cyA9IF9hY3RpdmVfcnVudGltZS5kaXNjb3Zlcl90ZXN0cyhSRVBPX0RJUikKCiAgICAgICAgdWlfbG9nKGYiRGlzY292ZXJlZCB7bGVuKHJlbGF0aXZlX3Rlc3RzKX0gdGVzdCBmaWxlKHMpIFt7X2FjdGl2ZV9ydW50aW1lLmxhbmd1YWdlfV0uIikKCiAgICAgICAgcG9vbF9yZXN1bHQgPSBydW5fcGFyYWxsZWxfYXVkaXQoCiAgICAgICAgICAgIHJlbGF0aXZlX3Rlc3RzLCBwcm9jZXNzX2F1ZGl0X3Rlc3QsCiAgICAgICAgICAgIGVudl9jb25maWc9ZW52X2NvbmZpZywgbWNwX2NvbmZpZ19wYXRoPW1jcF9jb25maWdfcGF0aCwKICAgICAgICAgICAgdGVuYW50X2lkPVRFTkFOVF9JRCwgdGFyZ2V0X3JlcG89dGFyZ2V0X3JlcG8sCiAgICAgICAgKQogICAgICAgIHVpX2xvZygKICAgICAgICAgICAgZiJXb3JrZXIgcG9vbCBjb21wbGV0ZSDigJQgd29ya2Vycz17TUFYX1dPUktFUlN9LCBoZWFsZWQ9e3Bvb2xfcmVzdWx0WydoZWFsZWQnXX0sICIKICAgICAgICAgICAgZiJhbHJlYWR5X2dyZWVuPXtwb29sX3Jlc3VsdFsnYWxyZWFkeV9ncmVlbiddfSwgIgogICAgICAgICAgICBmImZhaWxlZD17cG9vbF9yZXN1bHRbJ2ZhaWxlZCddfSwgc2tpcHBlZD17cG9vbF9yZXN1bHRbJ3NraXBwZWQnXX0iLAogICAgICAgICAgICAiUE9PTCIsCiAgICAgICAgKQoKICAgICAgICBhbGxfZ3JlZW4gPSBhbGwoCiAgICAgICAgICAgIGdldF9qb2Jfc3RhdHVzX2VudW0oVEVOQU5UX0lELCB0YXJnZXRfcmVwbywgdCkgPT0gSm9iU3RhdHVzLkRPTkUKICAgICAgICAgICAgZm9yIHQgaW4gcmVsYXRpdmVfdGVzdHMKICAgICAgICApCgogICAgICAgIGlmIGFsbF9ncmVlbiBhbmQgUkVEX1RFQU1fRU5BQkxFRCBhbmQgcmVsYXRpdmVfdGVzdHM6CiAgICAgICAgICAgIHVpX2xvZygiQWxsIHRlc3RzIEdSRUVOIOKAlCBhY3RpdmF0aW5nIFJlZCBUZWFtIENFR0lTLiIsICJSRUQiKQogICAgICAgICAgICBydW5fcmVkX3RlYW1fY2VnaXMoCiAgICAgICAgICAgICAgICByZXBvX2Rpcj1SRVBPX0RJUiwKICAgICAgICAgICAgICAgIGVudl9jb25maWc9ZW52X2NvbmZpZywKICAgICAgICAgICAgICAgIG1jcF9jb25maWdfcGF0aD1tY3BfY29uZmlnX3BhdGgsCiAgICAgICAgICAgICAgICBibHVlX3RlYW1fZm49cHJvY2Vzc19mYWlsaW5nX3Rlc3QsCiAgICAgICAgICAgICAgICB0ZW5hbnRfaWQ9VEVOQU5UX0lELAogICAgICAgICAgICAgICAgbG9nX2F1ZGl0X2ZuPWxvZ19hdWRpdF9ldmVudCwKICAgICAgICAgICAgICAgIG5vdGlmeV9mbj1ub3RpZnksCiAgICAgICAgICAgICkKCiAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgdWlfbG9nKGYiRkFUQUw6IHtlfSIsICJGQUlMIikKICAgICAgICBub3RpZnkoZiLwn5S0ICpGQVRBTCpcbmB7ZX1gIiwgIkVSUk9SIikKICAgICAgICBsb2dfYXVkaXRfZXZlbnQoIkFVRElUX0NSQVNIIiwgIm9yY2hlc3RyYXRvciIsIHRhcmdldF9yZXBvLCBNT0RFTCwgeyJlcnJvciI6IHN0cihlKX0sICJDUkFTSEVEIikKICAgICAgICByZXR1cm4KICAgIGZpbmFsbHk6CiAgICAgICAgIyBCVUctMDA4IEZJWDogQWx3YXlzIHNjcnViIHBsYWludGV4dCBjcmVkZW50aWFscyBmcm9tIC90bXAgYWZ0ZXIgYXVkaXQKICAgICAgICB0cnk6CiAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGNyZWRfcGF0aCk6CiAgICAgICAgICAgICAgICBvcy51bmxpbmsoY3JlZF9wYXRoKQogICAgICAgICAgICAgICAgdWlfbG9nKCJHaXQgY3JlZGVudGlhbHMgZmlsZSBzY3J1YmJlZCBmcm9tIC90bXAuIiwgIklORk8iKQogICAgICAgIGV4Y2VwdCBPU0Vycm9yOgogICAgICAgICAgICBwYXNzCiAgICAgICAgX2F1ZGl0X2V2ZW50LmNsZWFyKCkKCiAgICBmaW5hbF9tZXRyaWNzID0gZ2V0X21ldHJpY3MoKQogICAgdHJhaW5pbmdfc3RhdHMgPSBnZXRfc3RhdGlzdGljcygpCiAgICBub3RpZnlfYXVkaXRfY29tcGxldGUoZmluYWxfbWV0cmljcykKCiAgICBpc192YWxpZCwgaW50ZWdyaXR5X21zZyA9IHZlcmlmeV9jaGFpbl9pbnRlZ3JpdHkoKQogICAgbm90aWZ5X2NoYWluX2ludGVncml0eShpc192YWxpZCwgaW50ZWdyaXR5X21zZykKCiAgICB1aV9sb2coIuKVkCIgKiA3MCkKICAgIHVpX2xvZygKICAgICAgICBmIkFVRElUIENPTVBMRVRFIOKAlCBGaXggc3VjY2VzcyByYXRlOiB7dHJhaW5pbmdfc3RhdHNbJ2ZpeF9zdWNjZXNzX3JhdGUnXX0gfCAiCiAgICAgICAgZiJTQVNUIGJsb2Nrczoge3RyYWluaW5nX3N0YXRzWydzYXN0X2Jsb2NrZWQnXX0gfCAiCiAgICAgICAgZiJBZHZlcnNhcmlhbCByZWplY3RzOiB7dHJhaW5pbmdfc3RhdHNbJ2FkdmVyc2FyaWFsbHlfcmVqZWN0ZWQnXX0gfCAiCiAgICAgICAgZiJQYXR0ZXJucyBsZWFybmVkOiB7dHJhaW5pbmdfc3RhdHNbJ3BhdHRlcm5zX2xlYXJuZWQnXX0iCiAgICApCiAgICBsb2dfYXVkaXRfZXZlbnQoIkFVRElUX0NPTVBMRVRFIiwgIm9yY2hlc3RyYXRvciIsIHRhcmdldF9yZXBvLCBNT0RFTCwKICAgICAgICAgICAgICAgICAgICB7KipmaW5hbF9tZXRyaWNzLCAqKnRyYWluaW5nX3N0YXRzfSwgIkNPTVBMRVRFIikKCiAgICAjIOKUgOKUgCBMb1JBIGZpbmUtdHVuZSBzY2hlZHVsZXIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICB0cnk6CiAgICAgICAgbG9yYV9zdGF0dXMgPSBtYXliZV90cmlnZ2VyX3RyYWluaW5nKCkKICAgICAgICB1aV9sb2cobG9yYV9zdGF0dXMsICJJTkZPIikKICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICB1aV9sb2coZiJMb1JBIHNjaGVkdWxlciBjaGVjayBmYWlsZWQgKG5vbi1ibG9ja2luZyk6IHtlfSIsICJXQVJOIikKCiAgICAjIFVwZGF0ZSBjaGF0IGluYm94IHdpdGggY29tcGxldGlvbiBub3RpY2UKICAgIHdpdGggX2luYm94X2xvY2s6CiAgICAgICAgbSA9IGZpbmFsX21ldHJpY3MKICAgICAgICBfaW5ib3hfaGlzdG9yeS5hcHBlbmQoeyJyb2xlIjogInVzZXIiLCAiY29udGVudCI6IGYi4pyFIEF1ZGl0IGNvbXBsZXRlOiBge3RhcmdldF9yZXBvfWAifSkKICAgICAgICBfaW5ib3hfaGlzdG9yeS5hcHBlbmQoewogICAgICAgICAgICAicm9sZSI6ICJhc3Npc3RhbnQiLAogICAgICAgICAgICAiY29udGVudCI6ICgKICAgICAgICAgICAgICAgIGYiKipBdWRpdCBmaW5pc2hlZC4qKlxuIgogICAgICAgICAgICAgICAgZiItIFRlc3RzIHNjYW5uZWQ6IHttWyd0b3RhbCddfVxuIgogICAgICAgICAgICAgICAgZiItIFZlcmlmaWVkIGdyZWVuOiB7bVsnZG9uZSddfVxuIgogICAgICAgICAgICAgICAgZiItIFBScyBnZW5lcmF0ZWQ6IHttWydwcnNfY3JlYXRlZCddfVxuIgogICAgICAgICAgICAgICAgZiItIFNBU1QgYmxvY2tlZDoge21bJ3Nhc3RfYmxvY2tlZCddfVxuIgogICAgICAgICAgICAgICAgZiItIEZpeCByYXRlOiB7dHJhaW5pbmdfc3RhdHNbJ2ZpeF9zdWNjZXNzX3JhdGUnXX0iCiAgICAgICAgICAgICkKICAgICAgICB9KQoKCiMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiMgUkVQTyBJTlBVVCBOT1JNQUxJU0VSCiMgQWNjZXB0cyBhbnkgb2Y6CiMgICBvd25lci9yZXBvCiMgICBodHRwczovL2dpdGh1Yi5jb20vb3duZXIvcmVwbwojICAgaHR0cHM6Ly9naXRodWIuY29tL293bmVyL3JlcG8uZ2l0CiMgICBnaXRodWIuY29tL293bmVyL3JlcG8KIyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKZGVmIF9ub3JtYWxpemVfcmVwbyhyYXc6IHN0cikgLT4gc3RyOgogICAgIiIiUmV0dXJuICdvd25lci9yZXBvJyBmcm9tIGFueSBjb21tb24gR2l0SHViIFVSTCBmb3JtYXQsIG9yICcnIGlmIGludmFsaWQuIiIiCiAgICBzID0gcmF3LnN0cmlwKCkucnN0cmlwKCIvIikucmVtb3Zlc3VmZml4KCIuZ2l0IikKICAgICMgU3RyaXAgY29tbW9uIHByZWZpeGVzCiAgICBmb3IgcHJlZml4IGluICgiaHR0cHM6Ly9naXRodWIuY29tLyIsICJodHRwOi8vZ2l0aHViLmNvbS8iLCAiZ2l0aHViLmNvbS8iKToKICAgICAgICBpZiBzLnN0YXJ0c3dpdGgocHJlZml4KToKICAgICAgICAgICAgcyA9IHNbbGVuKHByZWZpeCk6XQogICAgICAgICAgICBicmVhawogICAgcGFydHMgPSBbcCBmb3IgcCBpbiBzLnNwbGl0KCIvIikgaWYgcF0KICAgIGlmIGxlbihwYXJ0cykgPT0gMjoKICAgICAgICByZXR1cm4gZiJ7cGFydHNbMF19L3twYXJ0c1sxXX0iCiAgICByZXR1cm4gIiIKCgojIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAojIFRFUk1JTkFURSAvIFNUT1AgQVVESVQKIyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKZGVmIHRlcm1pbmF0ZV9hdWRpdCgpIC0+IHN0cjoKICAgICIiIgogICAgRm9yY2Utc3RvcCBhIHJ1bm5pbmcgYXVkaXQuCiAgICBDbGVhcnMgX2F1ZGl0X2V2ZW50IHNvIHRoZSBuZXh0IHN1Ym1pc3Npb24gaXMgYWNjZXB0ZWQgaW1tZWRpYXRlbHkuCiAgICBUaGUgYmFja2dyb3VuZCB0aHJlYWQgd2lsbCBmaW5pc2ggaXRzIGN1cnJlbnQgc3VicHJvY2VzcyBuYXR1cmFsbHkg4oCUCiAgICB3ZSBjYW5ub3Qga2lsbCBkYWVtb24gdGhyZWFkcyBpbiBQeXRob24sIGJ1dCBjbGVhcmluZyB0aGUgZXZlbnQgbWVhbnM6CiAgICAgIDEuIE5vIG5ldyB0ZXN0IGpvYnMgYXJlIGRpc3BhdGNoZWQgYWZ0ZXIgdGhlIGN1cnJlbnQgb25lIGZpbmlzaGVzCiAgICAgIDIuIFRoZSBpbmJveCBpbW1lZGlhdGVseSBhY2NlcHRzIG5ldyByZXBvIHN1Ym1pc3Npb25zCiAgICAiIiIKICAgIGlmIG5vdCBfYXVkaXRfZXZlbnQuaXNfc2V0KCk6CiAgICAgICAgcmV0dXJuICLihLnvuI8gTm8gYXVkaXQgaXMgY3VycmVudGx5IHJ1bm5pbmcuIgogICAgX2F1ZGl0X2V2ZW50LmNsZWFyKCkKICAgIHVpX2xvZygi4puUIEF1ZGl0IHRlcm1pbmF0ZWQgYnkgb3BlcmF0b3IuIiwgIldBUk4iKQogICAgcmV0dXJuICLim5QgQXVkaXQgc3RvcHBlZC4gWW91IGNhbiBub3cgc3VibWl0IGEgbmV3IHJlcG9zaXRvcnkuIgoKCiMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiMgQ0hBVCBJTkJPWCDigJQgdGFyZ2V0IHJlcG8gaW5wdXQKIyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKZGVmIHN1Ym1pdF9yZXBvX2F1ZGl0KHJlcG9faW5wdXQ6IHN0ciwgY2hhdF9oaXN0b3J5OiBsaXN0KSAtPiB0dXBsZVtsaXN0LCBzdHJdOgogICAgIiIiCiAgICBDYWxsZWQgd2hlbiB1c2VyIHN1Ym1pdHMgYSByZXBvIHZpYSB0aGUgY2hhdCBpbmJveC4KICAgIFZhbGlkYXRlcywga2lja3Mgb2ZmIHRoZSBhdWRpdCBpbiBhIGJhY2tncm91bmQgdGhyZWFkLCBhbmQKICAgIHJldHVybnMgYW4gdXBkYXRlZCBjaGF0IGhpc3RvcnkgdXNpbmcgdGhlIG1lc3NhZ2VzIGZvcm1hdC4KICAgIEFjY2VwdHMgb3duZXIvcmVwbywgZnVsbCBHaXRIdWIgVVJMcywgYW5kIC5naXQgc3VmZml4ZXMuCiAgICAiIiIKICAgIHJhdyA9IChyZXBvX2lucHV0IG9yICIiKS5zdHJpcCgpCgogICAgaWYgbm90IHJhdzoKICAgICAgICByZXR1cm4gY2hhdF9oaXN0b3J5ICsgWwogICAgICAgICAgICB7InJvbGUiOiAidXNlciIsICJjb250ZW50IjogIihlbXB0eSkifSwKICAgICAgICAgICAgeyJyb2xlIjogImFzc2lzdGFudCIsICJjb250ZW50IjogIuKaoO+4jyBQbGVhc2UgZW50ZXIgYSByZXBvc2l0b3J5IOKAlCBlLmcuIGBPV0FTUC9weWdvYXRgIG9yIGBodHRwczovL2dpdGh1Yi5jb20vT1dBU1AvcHlnb2F0YC4ifSwKICAgICAgICBdLCAiIgoKICAgIHJlcG8gPSBfbm9ybWFsaXplX3JlcG8ocmF3KQogICAgaWYgbm90IHJlcG86CiAgICAgICAgcmV0dXJuIGNoYXRfaGlzdG9yeSArIFsKICAgICAgICAgICAgeyJyb2xlIjogInVzZXIiLCAiY29udGVudCI6IHJhd30sCiAgICAgICAgICAgIHsicm9sZSI6ICJhc3Npc3RhbnQiLCAiY29udGVudCI6ICgKICAgICAgICAgICAgICAgIGYn4p2MIENvdWxkIG5vdCBwYXJzZSBge3Jhd31gIGFzIGEgR2l0SHViIHJlcG8uXG4nCiAgICAgICAgICAgICAgICAnQWNjZXB0ZWQgZm9ybWF0czpcbicKICAgICAgICAgICAgICAgICctIGBvd25lci9yZXBvYFxuJwogICAgICAgICAgICAgICAgJy0gYGh0dHBzOi8vZ2l0aHViLmNvbS9vd25lci9yZXBvYFxuJwogICAgICAgICAgICAgICAgJy0gYGh0dHBzOi8vZ2l0aHViLmNvbS9vd25lci9yZXBvLmdpdGAnCiAgICAgICAgICAgICl9LAogICAgICAgIF0sIHJhdwoKICAgIGlmIF9hdWRpdF9ldmVudC5pc19zZXQoKToKICAgICAgICByZXR1cm4gY2hhdF9oaXN0b3J5ICsgWwogICAgICAgICAgICB7InJvbGUiOiAidXNlciIsICJjb250ZW50IjogcmVwb30sCiAgICAgICAgICAgIHsicm9sZSI6ICJhc3Npc3RhbnQiLCAiY29udGVudCI6ICgKICAgICAgICAgICAgICAgICLimqDvuI8gQW4gYXVkaXQgaXMgYWxyZWFkeSBydW5uaW5nLlxuIgogICAgICAgICAgICAgICAgIkNsaWNrICoq4puUIFRlcm1pbmF0ZSBBdWRpdCoqIHRvIHN0b3AgaXQsIHRoZW4gc3VibWl0IGEgbmV3IHJlcG8uIgogICAgICAgICAgICApfSwKICAgICAgICBdLCAiIgoKICAgIF9hdWRpdF9ldmVudC5zZXQoKQogICAgdGhyZWFkaW5nLlRocmVhZCgKICAgICAgICB0YXJnZXQ9ZW50ZXJwcmlzZV9hdWRpdF9sb29wLAogICAgICAgIGt3YXJncz17InJlcG9fb3ZlcnJpZGUiOiByZXBvfSwKICAgICAgICBkYWVtb249VHJ1ZSwKICAgICkuc3RhcnQoKQoKICAgIHJldHVybiBjaGF0X2hpc3RvcnkgKyBbCiAgICAgICAgeyJyb2xlIjogInVzZXIiLCAiY29udGVudCI6IGYi8J+OryBBdWRpdDogYHtyZXBvfWAifSwKICAgICAgICB7CiAgICAgICAgICAgICJyb2xlIjogImFzc2lzdGFudCIsCiAgICAgICAgICAgICJjb250ZW50IjogKAogICAgICAgICAgICAgICAgZiLwn5qAICoqQXVkaXQgc3RhcnRlZCBmb3IgYHtyZXBvfWAqKlxuXG4iCiAgICAgICAgICAgICAgICBmIldhdGNoIHRoZSAqKkxpdmUgQWdlbnQgTG9nKiogYmVsb3cgZm9yIHJlYWwtdGltZSBwcm9ncmVzcy5cbiIKICAgICAgICAgICAgICAgIGYiSSdsbCBwb3N0IHJlc3VsdHMgaGVyZSB3aGVuIHRoZSBhdWRpdCBjb21wbGV0ZXMuXG5cbiIKICAgICAgICAgICAgICAgIGYiX01vZGVsOiBge01PREVMfWAgwrcgVGVuYW50OiBge1RFTkFOVF9JRH1gXyIKICAgICAgICAgICAgKSwKICAgICAgICB9LAogICAgXSwgIiIKCgpkZWYgZ2V0X2luYm94X2hpc3RvcnkoKSAtPiBsaXN0OgogICAgIiIiUHVsbCBhbnkgYmFja2dyb3VuZC1wb3N0ZWQgbWVzc2FnZXMgKGUuZy4gYXVkaXQtY29tcGxldGUpIGludG8gdGhlIGNoYXQuIiIiCiAgICB3aXRoIF9pbmJveF9sb2NrOgogICAgICAgIG1zZ3MgPSBsaXN0KF9pbmJveF9oaXN0b3J5KQogICAgICAgIF9pbmJveF9oaXN0b3J5LmNsZWFyKCkKICAgIHJldHVybiBtc2dzIG9yIFtdCgoKZGVmIHRyaWdnZXJfYXVkaXRfZm4oKToKICAgICIiIkxlZ2FjeSBidXR0b24gaGFuZGxlciDigJQgdXNlcyBHSVRIVUJfUkVQTyBlbnYgdmFyIGlmIHNldC4iIiIKICAgIGlmIG5vdCBHSVRIVUJfUkVQTzoKICAgICAgICByZXR1cm4gIuKaoO+4jyBObyBHSVRIVUJfUkVQTyBlbnYgdmFyIHNldC4gVXNlIHRoZSBjaGF0IGluYm94IGFib3ZlIHRvIGVudGVyIGEgcmVwby4iCiAgICBpZiBfYXVkaXRfZXZlbnQuaXNfc2V0KCk6CiAgICAgICAgcmV0dXJuICLimqDvuI8gQXVkaXQgYWxyZWFkeSBydW5uaW5nLiIKICAgIF9hdWRpdF9ldmVudC5zZXQoKQogICAgdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9ZW50ZXJwcmlzZV9hdWRpdF9sb29wLCBkYWVtb249VHJ1ZSkuc3RhcnQoKQogICAgcmV0dXJuIGYi8J+agCBBdWRpdCB0cmlnZ2VyZWQgZm9yIGB7R0lUSFVCX1JFUE99YCDigJQgZnVsbCBoZWFsaW5nIGxvb3AgZGVwbG95ZWQuIgoKCiMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiMgV0VCSE9PSyBESVNQQVRDSEVSCiMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACmRlZiBfd2ViaG9va19kaXNwYXRjaCgqKmt3YXJncyk6CiAgICBpZiBub3QgX2F1ZGl0X2V2ZW50LmlzX3NldCgpOgogICAgICAgIF9hdWRpdF9ldmVudC5zZXQoKQogICAgICAgIHRocmVhZGluZy5UaHJlYWQodGFyZ2V0PWVudGVycHJpc2VfYXVkaXRfbG9vcCwga3dhcmdzPWt3YXJncywgZGFlbW9uPVRydWUpLnN0YXJ0KCkKCnNldF9qb2JfZGlzcGF0Y2hlcihfd2ViaG9va19kaXNwYXRjaCkKCiMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiMgQVVUT05PTU9VUyBIQVJWRVNURVIgKGFudGFnb25pc3QgbW9kZSkKIyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKdHJ5OgogICAgZnJvbSByZXBvX2hhcnZlc3RlciBpbXBvcnQgc3RhcnRfaGFydmVzdGVyCiAgICBzdGFydF9oYXJ2ZXN0ZXIoZGlzcGF0Y2hfZm49X3dlYmhvb2tfZGlzcGF0Y2gpCmV4Y2VwdCBFeGNlcHRpb24gYXMgX2U6CiAgICBwYXNzICAjIGhhcnZlc3RlciBpcyBvcHRpb25hbCDigJQgZGlzYWJsZWQgYnkgZGVmYXVsdAoKCiMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiMgREFTSEJPQVJEIERBVEEgR0VUVEVSUwojIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgApkZWYgZ2V0X2xpdmVfbG9ncygpIC0+IHN0cjoKICAgIHdpdGggX2xvZ19sb2NrOgogICAgICAgIHJldHVybiAiXG4iLmpvaW4oZGFzaGJvYXJkX2xvZ3NbLTEwMDpdKQoKCmRlZiBnZXRfbWV0cmljc19yb3coKToKICAgIG0gPSBnZXRfbWV0cmljcygpCiAgICBzdGF0dXMgPSAi8J+foSBSdW5uaW5nLi4uIiBpZiBfYXVkaXRfZXZlbnQuaXNfc2V0KCkgZWxzZSAi8J+foiBJZGxlIC8gU2VjdXJlIgogICAgcmV0dXJuIChzdGF0dXMsIG1bInRvdGFsIl0sIG1bImRvbmUiXSwgbVsicHJzX2NyZWF0ZWQiXSwgbVsiZmFpbGVkIl0sIG1bInNhc3RfYmxvY2tlZCJdKQoKCmRlZiBnZXRfam9iX3RhYmxlKCkgLT4gbGlzdFtsaXN0XToKICAgIGpvYnMgPSBsaXN0X2FsbF9qb2JzKClbOjMwXQogICAgcm93cyA9IFtdCiAgICBmb3IgaiBpbiBqb2JzOgogICAgICAgIGljb25zID0geyJET05FIjogIuKchSIsICJGQUlMRUQiOiAi4p2MIiwgIlNBU1RfQkxPQ0tFRCI6ICLwn5uhIEJsb2NrZWQiLAogICAgICAgICAgICAgICAgICJSVU5OSU5HIjogIvCflIQiLCAiUEVORElORyI6ICLij7MifQogICAgICAgIHJvd3MuYXBwZW5kKFtqLmdldCgidGVzdF9wYXRoIiwgIiIpLCBpY29ucy5nZXQoalsic3RhdHVzIl0sIGpbInN0YXR1cyJdKSwKICAgICAgICAgICAgICAgICAgICAgai5nZXQoInByX3VybCIsICLigJQiKSwgai5nZXQoIm1vZGVsX3ZlcnNpb24iLCAi4oCUIiksIGouZ2V0KCJ1cGRhdGVkX2F0IiwgIiIpXSkKICAgIHJldHVybiByb3dzIG9yIFtbIk5vIGpvYnMgeWV0IiwgIiIsICIiLCAiIiwgIiJdXQoKCmRlZiBnZXRfYXVkaXRfZGlzcGxheSgpIC0+IHN0cjoKICAgIGV2ZW50cyA9IHJlYWRfYXVkaXRfdHJhaWwoNDApCiAgICBpZiBub3QgZXZlbnRzOgogICAgICAgIHJldHVybiAiTm8gYXVkaXQgZXZlbnRzIHlldC4iCiAgICBsaW5lcyA9IFtdCiAgICBmb3IgZSBpbiByZXZlcnNlZChldmVudHMpOgogICAgICAgIGxpbmVzLmFwcGVuZCgKICAgICAgICAgICAgZiJbe2VbJ3RpbWVzdGFtcF91dGMnXX1dIHtlWydldmVudF90eXBlJ106MjVzfSB8IHtlWydvdXRjb21lJ106MTBzfSB8ICIKICAgICAgICAgICAgZiJoYXNoOntlWydlbnRyeV9oYXNoJ11bOjEyXX0uLi4iCiAgICAgICAgKQogICAgcmV0dXJuICJcbiIuam9pbihsaW5lcykKCgpkZWYgZ2V0X2NoYWluX2ludGVncml0eV9kaXNwbGF5KCkgLT4gc3RyOgogICAgdmFsaWQsIG1zZyA9IHZlcmlmeV9jaGFpbl9pbnRlZ3JpdHkoKQogICAgcmV0dXJuIGYieyfwn5SSIFZFUklGSUVEJyBpZiB2YWxpZCBlbHNlICfwn5qoIENPTVBST01JU0VEJ30g4oCUIHttc2d9IgoKCmRlZiBnZXRfdHJhaW5pbmdfc3RhdHNfZGlzcGxheSgpIC0+IHN0cjoKICAgIHRyeToKICAgICAgICBzdGF0cyA9IGdldF9zdGF0aXN0aWNzKCkKICAgICAgICBtZW0gPSBnZXRfbWVtb3J5X3N0YXRzKCkKICAgICAgICByZXR1cm4gKAogICAgICAgICAgICBmIlRvdGFsIGZpeCBhdHRlbXB0czogICAgICAgIHtzdGF0c1sndG90YWxfYXR0ZW1wdHMnXX1cbiIKICAgICAgICAgICAgZiJTdWNjZXNzZnVsIGZpeGVzOiAgICAgICAgICB7c3RhdHNbJ3N1Y2Nlc3NmdWxfZml4ZXMnXX0gKHtzdGF0c1snZml4X3N1Y2Nlc3NfcmF0ZSddfSlcbiIKICAgICAgICAgICAgZiJTQVNUIGJsb2NrZWQ6ICAgICAgICAgICAgICB7c3RhdHNbJ3Nhc3RfYmxvY2tlZCddfVxuIgogICAgICAgICAgICBmIkFkdmVyc2FyaWFsbHkgcmVqZWN0ZWQ6ICAgIHtzdGF0c1snYWR2ZXJzYXJpYWxseV9yZWplY3RlZCddfVxuIgogICAgICAgICAgICBmIkh1bWFuLW1lcmdlZCBQUnM6ICAgICAgICAgIHtzdGF0c1snaHVtYW5fbWVyZ2VkJ119XG4iCiAgICAgICAgICAgIGYiTWVtb3J5IHBhdHRlcm5zIHN0b3JlZDogICAge21lbVsncGF0dGVybnNfc3RvcmVkJ119ICh7bWVtWydzdWNjZXNzZnVsX3BhdHRlcm5zJ119IHdpdGggc3VjY2VzcyBzaWduYWwpXG5cbiIKICAgICAgICAgICAgZiJUb3AgcmVjdXJyaW5nIGZhaWx1cmVzOlxuIiArCiAgICAgICAgICAgICJcbiIuam9pbihmIiAge3RbJ2F0dGVtcHRzJ119eCAge3RbJ3BhdGgnXX0iIGZvciB0IGluIHN0YXRzLmdldCgidG9wX2ZhaWxpbmdfdGVzdHMiLCBbXSkpCiAgICAgICAgKQogICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgIHJldHVybiBmIlN0YXRzIHVuYXZhaWxhYmxlOiB7ZX0iCgoKZGVmIGdldF90cmFpbmluZ19leHBvcnQoKSAtPiBzdHI6CiAgICB0cnk6CiAgICAgICAgZGF0YSA9IGV4cG9ydF90cmFpbmluZ19kYXRhKGxpbWl0PTEwMCkKICAgICAgICBpZiBub3QgZGF0YToKICAgICAgICAgICAgcmV0dXJuICJObyB0cmFpbmluZyBkYXRhIHlldC4gUnVuIGF1ZGl0cyB0byBhY2N1bXVsYXRlIChmYWlsdXJlLCBmaXgpIHBhaXJzLiIKICAgICAgICBsaW5lcyA9IGRhdGEuc3BsaXQoIlxuIikKICAgICAgICByZXR1cm4gZiIjIHtsZW4obGluZXMpfSB0cmFpbmluZyBleGFtcGxlcyAoSlNPTkwgZm9ybWF0KVxuIyBDb3B5IGFuZCB1c2UgZm9yIGZpbmUtdHVuaW5nXG5cbiIgKyBkYXRhWzo4MDAwXQogICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgIHJldHVybiBmIkV4cG9ydCBmYWlsZWQ6IHtlfSIKCgpkZWYgZ2V0X3dlYmhvb2tfbG9nX2Rpc3BsYXkoKSAtPiBzdHI6CiAgICBmcm9tIHdlYmhvb2tfc2VydmVyIGltcG9ydCBnZXRfd2ViaG9va19sb2cKICAgIGV2ZW50cyA9IGdldF93ZWJob29rX2xvZygzMCkKICAgIGlmIG5vdCBldmVudHM6CiAgICAgICAgcmV0dXJuICgKICAgICAgICAgICAgIk5vIHdlYmhvb2sgZXZlbnRzIHlldC5cblxuIgogICAgICAgICAgICAiV2ViaG9vayBlbmRwb2ludDogUE9TVCBodHRwOi8vdGhpcy1zcGFjZTo3ODYxL3dlYmhvb2svZ2l0aHViXG4iCiAgICAgICAgICAgICJIZWFsdGggY2hlY2s6ICAgICBHRVQgIGh0dHA6Ly90aGlzLXNwYWNlOjc4NjEvd2ViaG9vay9oZWFsdGgiCiAgICAgICAgKQogICAgbGluZXMgPSBbCiAgICAgICAgZiJbe2VbJ3RpbWVzdGFtcCddfV0ge2VbJ2V2ZW50X3R5cGUnXToyMHN9IHwge2VbJ3N0YXR1cyddOjhzfSB8ICIKICAgICAgICBmIntlLmdldCgncmVwbycsJycpfSB8IHtlLmdldCgnZGV0YWlsJywnJyl9IgogICAgICAgIGZvciBlIGluIGV2ZW50cwogICAgXQogICAgcmV0dXJuICJcbiIuam9pbihsaW5lcykKCgpkZWYgZ2V0X3JlZF90ZWFtX2Rpc3BsYXkoKSAtPiBzdHI6CiAgICBzdGF0cyA9IGdldF9yZWRfdGVhbV9zdGF0cygpCiAgICByZXR1cm4gKAogICAgICAgIGYiWmVyby1kYXlzIGRpc2NvdmVyZWQ6IHtzdGF0c1snemVyb19kYXlzX2Rpc2NvdmVyZWQnXX1cbiIKICAgICAgICBmIlByb3BlcnR5LWJhc2VkIHRlc3RzIGdlbmVyYXRlZDoge3N0YXRzWydwYnRzX2dlbmVyYXRlZCddfVxuIgogICAgICAgIGYiQXJ0aWZhY3RzIGRpcmVjdG9yeToge3N0YXRzWydyZWRfdGVhbV9kaXInXX1cblxuIgogICAgICAgIGYiUmVjZW50IFJlZCBUZWFtIGxvZ3M6XG57c3RhdHNbJ3JlY2VudF9sb2dzJ119IgogICAgKQoKCmRlZiB0cmlnZ2VyX3N3ZWJlbmNoX2V2YWwobWF4X2luc3RhbmNlczogaW50ID0gMjUpIC0+IHN0cjoKICAgIGRlZiBfcnVuKCk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBmcm9tIHN3ZWJlbmNoX2hhcm5lc3MgaW1wb3J0IHJ1bl9zd2ViZW5jaF9ldmFsCiAgICAgICAgICAgICMgQlVHLTAwOSAvIEdBUC1GIEZJWDogUm91dGUgdGhyb3VnaCBSaG9kYXdrJ3Mgb3duIGhlYWxpbmcgbG9vcCBzbwogICAgICAgICAgICAjIHBhc3NAMSBtZXRyaWNzIGFyZSBwcm9kdWNlZCBieSB0aGUgc2FtZSBwaXBlbGluZSB1c2VkIGluIHByb2R1Y3Rpb24sCiAgICAgICAgICAgICMgbm90IGJ5IGFuIGV4dGVybmFsIHN0dWIgY29tbWFuZC4KICAgICAgICAgICAgd2l0aCBfYWN0aXZlX3J1bnRpbWVfbG9jazoKICAgICAgICAgICAgICAgIHJ1bnRpbWUgPSBfYWN0aXZlX3J1bnRpbWUKICAgICAgICAgICAgZW52X2NmZyA9IHJ1bnRpbWUuc2V0dXBfZW52KFJFUE9fRElSLCBQRVJTSVNURU5UX0RJUikgaWYgcnVudGltZSBlbHNlIE5vbmUKICAgICAgICAgICAgbWNwX2NmZyA9IHdyaXRlX21jcF9jb25maWcoKQogICAgICAgICAgICByZXN1bHQgPSBydW5fc3dlYmVuY2hfZXZhbCgKICAgICAgICAgICAgICAgIG1heF9pbnN0YW5jZXM9aW50KG1heF9pbnN0YW5jZXMpLAogICAgICAgICAgICAgICAgcHJvY2Vzc19mbj1wcm9jZXNzX2ZhaWxpbmdfdGVzdCBpZiBydW50aW1lIGVsc2UgTm9uZSwKICAgICAgICAgICAgICAgIGVudl9jb25maWc9ZW52X2NmZywKICAgICAgICAgICAgICAgIG1jcF9jb25maWdfcGF0aD1tY3BfY2ZnLAogICAgICAgICAgICAgICAgcmVwb19kaXI9UkVQT19ESVIsCiAgICAgICAgICAgICkKICAgICAgICAgICAgdWlfbG9nKAogICAgICAgICAgICAgICAgZiJTV0UtYmVuY2ggY29tcGxldGUg4oCUIHBhc3NAMT17cmVzdWx0WydwYXNzX2F0XzEnXTouMiV9LCAiCiAgICAgICAgICAgICAgICBmInJlc29sdmVkPXtyZXN1bHRbJ3Jlc29sdmVkJ119L3tyZXN1bHRbJ3RvdGFsJ119ICIKICAgICAgICAgICAgICAgIGYiKG1vZGU9e3Jlc3VsdC5nZXQoJ21vZGUnLCAndW5rbm93bicpfSkiLAogICAgICAgICAgICAgICAgIkJFTkNIIiwKICAgICAgICAgICAgKQogICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICAgICAgdWlfbG9nKGYiU1dFLWJlbmNoIGV2YWwgZmFpbGVkOiB7ZX0iLCAiQkVOQ0giKQogICAgdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9X3J1biwgZGFlbW9uPVRydWUpLnN0YXJ0KCkKICAgIHJldHVybiBmIlNXRS1iZW5jaCBWZXJpZmllZCBldmFsdWF0aW9uIHN0YXJ0ZWQgZm9yIHtpbnQobWF4X2luc3RhbmNlcyl9IGluc3RhbmNlKHMpIHZpYSBSaG9kYXdrIGxvb3AuIgoKCmRlZiBnZXRfc3dlYmVuY2hfZGlzcGxheSgpIC0+IHN0cjoKICAgIHBhdGggPSAiL2RhdGEvc3dlYmVuY2hfcmVwb3J0Lm1kIgogICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHBhdGgpOgogICAgICAgIHJldHVybiAiTm8gU1dFLWJlbmNoIHJlcG9ydCB5ZXQuIFN0YXJ0IGFuIGV2YWx1YXRpb24gdG8gZ2VuZXJhdGUgcGFzc0AxIHJlc3VsdHMuIgogICAgd2l0aCBvcGVuKHBhdGgsICJyIiwgZW5jb2Rpbmc9InV0Zi04IikgYXMgZjoKICAgICAgICByZXR1cm4gZi5yZWFkKClbOjEyMDAwXQoKCmRlZiBleHBvcnRfY29tcGxpYW5jZV9kaXNwbGF5KCkgLT4gc3RyOgogICAgdHJ5OgogICAgICAgIHJldHVybiBmIkNvbXBsaWFuY2UgcmVwb3J0IGV4cG9ydGVkOiB7ZXhwb3J0X2NvbXBsaWFuY2VfcmVwb3J0KCl9IgogICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgIHJldHVybiBmIkNvbXBsaWFuY2UgZXhwb3J0IGZhaWxlZDoge2V9IgoKCmRlZiByZXNldF9xdWV1ZSgpOgogICAgaW1wb3J0IHNodXRpbAogICAgc2h1dGlsLnJtdHJlZSgiL2RhdGEvam9icyIsIGlnbm9yZV9lcnJvcnM9VHJ1ZSkKICAgICMgQWxzbyB1bmJsb2NrIHRoZSBhdWRpdCBldmVudCBzbyBhIG5ldyByZXBvIGNhbiBiZSBzdWJtaXR0ZWQgaW1tZWRpYXRlbHkKICAgIF9hdWRpdF9ldmVudC5jbGVhcigpCiAgICB1aV9sb2coIvCfl5EgUXVldWUgY2xlYXJlZCBhbmQgYXVkaXQgbG9jayByZWxlYXNlZCBieSBvcGVyYXRvci4iLCAiV0FSTiIpCiAgICByZXR1cm4gIuKchSBRdWV1ZSBjbGVhcmVkIGFuZCBhdWRpdCBzdG9wcGVkLiBZb3UgY2FuIG5vdyBzdWJtaXQgYSBuZXcgcmVwb3NpdG9yeS4iCgoKIyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKIyBFVEhJQ0FMIFNFQ1VSSVRZIFJFU0VBUkNIIFBJUEVMSU5FCiMgSHVtYW4gYXBwcm92YWwgZ2F0ZSBhdCBldmVyeSBzdGFnZSDigJQgbm90aGluZyBkaXNjbG9zZWQgYXV0b21hdGljYWxseQojIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAoKZGVmIF9yZXNlYXJjaF9jbG9uZShyZXBvOiBzdHIpIC0+IHN0cjoKICAgICIiIkNsb25lIHJlcG8gdG8gYSBsb2NhbCByZXNlYXJjaCBkaXJlY3RvcnkgKHJlYWQtb25seSBhbmFseXNpcykuIiIiCiAgICByZXBvX2RpciA9IGYiL3RtcC9yZXNlYXJjaF97cmVwby5yZXBsYWNlKCcvJywgJ18nKX0iCiAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMocmVwb19kaXIpOgogICAgICAgIHVpX2xvZyhmIkNsb25pbmcge3JlcG99IGZvciBzdGF0aWMgYW5hbHlzaXMuLi4iLCAiSU5GTyIpCiAgICAgICAgIyBGSVgtMDA5OiBVc2UgcnVuX3N1YnByb2Nlc3Nfc2FmZSBzbyBHSVRfQ09ORklHX0dMT0JBTCBjcmVkZW50aWFscyBhcmUgaW5oZXJpdGVkLgogICAgICAgIHJ1bl9zdWJwcm9jZXNzX3NhZmUoCiAgICAgICAgICAgIFsiZ2l0IiwgImNsb25lIiwgIi12IiwgZiJodHRwczovL2dpdGh1Yi5jb20ve3JlcG99LmdpdCIsIHJlcG9fZGlyXSwKICAgICAgICAgICAgY3dkPSIvdG1wIiwgcmFpc2Vfb25fZXJyb3I9VHJ1ZSwKICAgICAgICApCiAgICByZXR1cm4gcmVwb19kaXIKCgpkZWYgcnVuX3NlbWFudGljX2FuYWx5c2lzKHJlcG9faW5wdXQ6IHN0cikgLT4gdHVwbGVbc3RyLCBzdHJdOgogICAgIiIiUHVyZSBzdGF0aWMgYW5hbHlzaXMg4oCUIG5vIGNvZGUgZXhlY3V0ZWQuIiIiCiAgICByZXBvID0gKHJlcG9faW5wdXQgb3IgIiIpLnN0cmlwKCkKICAgIGlmIG5vdCByZXBvIG9yICIvIiBub3QgaW4gcmVwbyBvciBsZW4ocmVwby5zcGxpdCgiLyIpKSAhPSAyOgogICAgICAgIHJldHVybiAi4p2MIFVzZSBmb3JtYXQ6IG93bmVyL3JlcG8iLCAiIgogICAgdHJ5OgogICAgICAgIGZyb20gc2VtYW50aWNfZXh0cmFjdG9yIGltcG9ydCBydW5fc2VtYW50aWNfZXh0cmFjdGlvbgogICAgICAgIGZyb20gbGFuZ3VhZ2VfcnVudGltZSBpbXBvcnQgUnVudGltZUZhY3RvcnkKICAgICAgICByZXBvX2RpciA9IF9yZXNlYXJjaF9jbG9uZShyZXBvKQogICAgICAgIHJ1bnRpbWUgPSBSdW50aW1lRmFjdG9yeS5mb3JfcmVwbyhyZXBvX2RpcikKICAgICAgICByZXN1bHQgPSBydW5fc2VtYW50aWNfZXh0cmFjdGlvbihyZXBvX2RpciwgcnVudGltZS5sYW5ndWFnZSkKICAgICAgICBnYXBzID0gcmVzdWx0LmdldCgiYXNzdW1wdGlvbl9nYXBzIiwgW10pCiAgICAgICAgc3VtbWFyeSA9ICgKICAgICAgICAgICAgZiJTdGF0aWMgYW5hbHlzaXMgY29tcGxldGUuXG4iCiAgICAgICAgICAgIGYiTGFuZ3VhZ2U6IHtyZXN1bHQuZ2V0KCdsYW5ndWFnZScsICd1bmtub3duJyl9XG4iCiAgICAgICAgICAgIGYiRmlsZXMgYW5hbHlzZWQ6IHtsZW4ocmVzdWx0LmdldCgnYW5hbHl6ZWRfZmlsZXMnLCBbXSkpfVxuIgogICAgICAgICAgICBmIkFzc3VtcHRpb24gZ2FwcyBmb3VuZDoge2xlbihnYXBzKX1cblxuIgogICAgICAgICAgICBmIkFsbCBmaW5kaW5ncyB0YWdnZWQgcmVxdWlyZXNfaHVtYW5fdmVyaWZpY2F0aW9uPXRydWUuIgogICAgICAgICkKICAgICAgICB1aV9sb2coZiJTZW1hbnRpYyBhbmFseXNpczoge3JlcG99IOKGkiB7bGVuKGdhcHMpfSBnYXAocykiLCAiSU5GTyIpCiAgICAgICAgcmV0dXJuIHN1bW1hcnksIGpzb24uZHVtcHMocmVzdWx0LCBpbmRlbnQ9MilbOjEwMDAwXQogICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgIHJldHVybiBmIkFuYWx5c2lzIGZhaWxlZDoge2V9IiwgIiIKCgpkZWYgZ2VuZXJhdGVfaGFybmVzc19mb3JfcmV2aWV3KGdhcF9qc29uOiBzdHIsIHJlcG9faW5wdXQ6IHN0cikgLT4gc3RyOgogICAgIiIiR2VuZXJhdGUgUG9DIGhhcm5lc3MgZm9yIG9wZXJhdG9yIHJldmlldyDigJQgTk9UIGV4ZWN1dGVkIGhlcmUuIiIiCiAgICB0cnk6CiAgICAgICAgZnJvbSBoYXJuZXNzX2ZhY3RvcnkgaW1wb3J0IGdlbmVyYXRlX3BvY19oYXJuZXNzCiAgICAgICAgZ2FwID0ganNvbi5sb2FkcyhnYXBfanNvbikKICAgICAgICByZXBvX2RpciA9IGYiL3RtcC9yZXNlYXJjaF97cmVwb19pbnB1dC5zdHJpcCgpLnJlcGxhY2UoJy8nLCAnXycpfSIKICAgICAgICByZXN1bHQgPSBnZW5lcmF0ZV9wb2NfaGFybmVzcyhnYXAsIHJlcG9fZGlyKQogICAgICAgIGlmICJlcnJvciIgaW4gcmVzdWx0OgogICAgICAgICAgICByZXR1cm4gZiJHZW5lcmF0aW9uIGZhaWxlZDoge3Jlc3VsdFsnZXJyb3InXX0iCiAgICAgICAgcmV0dXJuICgKICAgICAgICAgICAgZiJTdGF0dXM6IHtyZXN1bHRbJ3N0YXR1cyddfVxuIgogICAgICAgICAgICBmIkdhcCBJRDoge3Jlc3VsdFsnZ2FwX2lkJ119XG5cbiIKICAgICAgICAgICAgZiItLS0gUkVWSUVXIFRISVMgQ09ERSBCRUZPUkUgQVBQUk9WSU5HIEVYRUNVVElPTiAtLS1cblxuIgogICAgICAgICAgICBmIntyZXN1bHRbJ2hhcm5lc3NfY29kZSddfSIKICAgICAgICApCiAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgcmV0dXJuIGYiRXJyb3I6IHtlfSIKCgpkZWYgZXhlY3V0ZV9hcHByb3ZlZF9oYXJuZXNzKGhhcm5lc3NfY29kZTogc3RyLCByZXBvX2lucHV0OiBzdHIsIHZlbnZfcGF0aDogc3RyKSAtPiBzdHI6CiAgICAiIiIKICAgIFNhbmRib3ggZXhlY3V0aW9uIOKAlCBvbmx5IGFmdGVyIG9wZXJhdG9yIHJlYWRzIGFuZCBhcHByb3ZlcyBoYXJuZXNzLgogICAgTm8gbmV0d29yayBhY2Nlc3MsIHNlY3JldHMgc3RyaXBwZWQsIDMwIHMgdGltZW91dC4KICAgICIiIgogICAgaWYgbm90IGhhcm5lc3NfY29kZS5zdHJpcCgpOgogICAgICAgIHJldHVybiAi4p2MIE5vIGhhcm5lc3MgY29kZSBwcm92aWRlZC4iCiAgICB0cnk6CiAgICAgICAgZnJvbSBoYXJuZXNzX2ZhY3RvcnkgaW1wb3J0IHJ1bl9oYXJuZXNzX2luX3NhbmRib3gKICAgICAgICByZXBvX2RpciA9IGYiL3RtcC9yZXNlYXJjaF97cmVwb19pbnB1dC5zdHJpcCgpLnJlcGxhY2UoJy8nLCAnXycpfSIKICAgICAgICByID0gcnVuX2hhcm5lc3NfaW5fc2FuZGJveChoYXJuZXNzX2NvZGUsIHJlcG9fZGlyLCB2ZW52X3BhdGguc3RyaXAoKSBvciAiL2RhdGEvdGFyZ2V0X3ZlbnYiKQogICAgICAgIHN0YXR1cyA9ICLimqDvuI8gIEdBUCBUUklHR0VSRUQgaW4gc2FuZGJveCIgaWYgci5nZXQoInRyaWdnZXJlZCIpIGVsc2UgIuKchSBOb3QgdHJpZ2dlcmVkIgogICAgICAgIHJldHVybiAoCiAgICAgICAgICAgIGYie3N0YXR1c31cblxuIgogICAgICAgICAgICBmIkV4aXQgY29kZSA6IHtyLmdldCgnZXhpdF9jb2RlJywgJ04vQScpfVxuIgogICAgICAgICAgICBmIlRpbWVkIG91dCA6IHtyLmdldCgndGltZWRfb3V0JywgRmFsc2UpfVxuXG4iCiAgICAgICAgICAgIGYiU3Rkb3V0Olxue3IuZ2V0KCdzdGRvdXQnLCAnJyl9XG5cbiIKICAgICAgICAgICAgZiJTdGRlcnI6XG57ci5nZXQoJ3N0ZGVycicsICcnKX0iCiAgICAgICAgKQogICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgIHJldHVybiBmIlNhbmRib3ggZXJyb3I6IHtlfSIKCgpkZWYgc3RvcmVfcHJpbWl0aXZlX2ZpbmRpbmcoCiAgICByZXBvX2lucHV0OiBzdHIsIGdhcF9pZDogc3RyLCBzZXZlcml0eTogc3RyLAogICAgZGVzY3JpcHRpb246IHN0ciwgdHJpZ2dlcmVkX3N0cjogc3RyLCBzYW5kYm94X291dHB1dDogc3RyLAopIC0+IHN0cjoKICAgIHRyeToKICAgICAgICBmcm9tIGNoYWluX2FuYWx5emVyIGltcG9ydCBzdG9yZV9wcmltaXRpdmUKICAgICAgICB0cmlnZ2VyZWQgPSAiVFJJR0dFUkVEOiBUcnVlIiBpbiAoc2FuZGJveF9vdXRwdXQgb3IgIiIpCiAgICAgICAgZmlkID0gc3RvcmVfcHJpbWl0aXZlKAogICAgICAgICAgICByZXBvPXJlcG9faW5wdXQuc3RyaXAoKSwgZ2FwX2lkPWdhcF9pZC5zdHJpcCgpLAogICAgICAgICAgICBzZXZlcml0eT1zZXZlcml0eS5zdHJpcCgpLCBkZXNjcmlwdGlvbj1kZXNjcmlwdGlvbi5zdHJpcCgpLAogICAgICAgICAgICB0cmlnZ2VyZWQ9dHJpZ2dlcmVkLCBjb25maWRlbmNlPSJNRURJVU0iLAogICAgICAgICAgICBoYXJuZXNzX3Jlc3VsdD17InN0ZG91dCI6IHNhbmRib3hfb3V0cHV0fSwKICAgICAgICApCiAgICAgICAgcmV0dXJuIGYi4pyFIFByaW1pdGl2ZSBzdG9yZWQgd2l0aCBJRDoge2ZpZH0iCiAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgcmV0dXJuIGYiRXJyb3I6IHtlfSIKCgpkZWYgcnVuX2NoYWluX2FuYWx5c2lzKHJlcG9faW5wdXQ6IHN0cikgLT4gc3RyOgogICAgdHJ5OgogICAgICAgIGZyb20gY2hhaW5fYW5hbHl6ZXIgaW1wb3J0IGFuYWx5emVfY2hhaW5zLCBnZXRfcGVuZGluZ19jaGFpbnMKICAgICAgICByZXBvID0gcmVwb19pbnB1dC5zdHJpcCgpCiAgICAgICAgY2hhaW5zID0gYW5hbHl6ZV9jaGFpbnMocmVwbykgaWYgcmVwbyBlbHNlIFtdCiAgICAgICAgcGVuZGluZyA9IGdldF9wZW5kaW5nX2NoYWlucyhyZXBvIGlmIHJlcG8gZWxzZSBOb25lKQogICAgICAgIGlmIG5vdCBwZW5kaW5nOgogICAgICAgICAgICByZXR1cm4gIk5vIGNoYWlucyBpZGVudGlmaWVkIHlldC4gU3RvcmUgcHJpbWl0aXZlIGZpbmRpbmdzIGZpcnN0LiIKICAgICAgICBsaW5lcyA9IFtdCiAgICAgICAgZm9yIGMgaW4gcGVuZGluZzoKICAgICAgICAgICAgbGluZXMuYXBwZW5kKAogICAgICAgICAgICAgICAgZiJbe2NbJ2lkJ119XSB7Y1snc2V2ZXJpdHknXX0gfCBDb25maWRlbmNlOiB7Y1snY29uZmlkZW5jZSddfVxuIgogICAgICAgICAgICAgICAgZiIgIFJlcG86IHtjWydyZXBvJ119XG4iCiAgICAgICAgICAgICAgICBmIiAge2NbJ2Rlc2NyaXB0aW9uJ11bOjIwMF19XG4iCiAgICAgICAgICAgICAgICBmIiAgU3RhdHVzOiB7Y1snc3RhdHVzJ119IgogICAgICAgICAgICApCiAgICAgICAgcmV0dXJuIGYiUHJvcG9zZWQgY2hhaW5zIChQRU5ESU5HIEhVTUFOIFJFVklFVyk6XG5cbiIgKyAiXG5cbiIuam9pbihsaW5lcykKICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICByZXR1cm4gZiJFcnJvcjoge2V9IgoKCmRlZiBnZXRfdmF1bHRfZGlzcGxheSgpIC0+IHN0cjoKICAgIHRyeToKICAgICAgICBmcm9tIGRpc2Nsb3N1cmVfdmF1bHQgaW1wb3J0IGdldF9hbGxfZGlzY2xvc3VyZXMKICAgICAgICBpdGVtcyA9IGdldF9hbGxfZGlzY2xvc3VyZXMoKQogICAgICAgIGlmIG5vdCBpdGVtczoKICAgICAgICAgICAgcmV0dXJuICJObyBkaXNjbG9zdXJlcyB5ZXQuIgogICAgICAgIGxpbmVzID0gW10KICAgICAgICBmb3IgZCBpbiBpdGVtczoKICAgICAgICAgICAgbGluZXMuYXBwZW5kKAogICAgICAgICAgICAgICAgZiJbe2RbJ2lkJ119XSB7ZFsnc2V2ZXJpdHknXX0g4oCUIHtkWydyZXBvJ119XG4iCiAgICAgICAgICAgICAgICBmIiAgVGl0bGUgOiB7ZFsndGl0bGUnXVs6NzBdfVxuIgogICAgICAgICAgICAgICAgZiIgIFN0YXR1czoge2RbJ3N0YXR1cyddfSB8IERheXMgcmVtYWluaW5nOiB7ZFsnZGF5c19yZW1haW5pbmcnXX1cbiIKICAgICAgICAgICAgICAgIGYiICBCdWcgQm91bnR5OiB7ZC5nZXQoJ2J1Z19ib3VudHlfcHJvZ3JhbScsJ04vQScpfSIKICAgICAgICAgICAgKQogICAgICAgIHJldHVybiAiXG5cbiIuam9pbihsaW5lcykKICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICByZXR1cm4gZiJFcnJvcjoge2V9IgoKCmRlZiByZWFkX2Rvc3NpZXJfZm4oZGlzY2xvc3VyZV9pZDogc3RyKSAtPiBzdHI6CiAgICB0cnk6CiAgICAgICAgZnJvbSBkaXNjbG9zdXJlX3ZhdWx0IGltcG9ydCByZWFkX2Rvc3NpZXIKICAgICAgICByZXR1cm4gcmVhZF9kb3NzaWVyKGRpc2Nsb3N1cmVfaWQuc3RyaXAoKSkKICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICByZXR1cm4gZiJFcnJvcjoge2V9IgoKCmRlZiBjb21waWxlX2Rvc3NpZXJfZm4oCiAgICByZXBvX2lucHV0OiBzdHIsIGdhcF9qc29uOiBzdHIsIGhhcm5lc3NfcmVzdWx0OiBzdHIsIGJ1Z19ib3VudHk6IHN0ciwKKSAtPiBzdHI6CiAgICB0cnk6CiAgICAgICAgZnJvbSBkaXNjbG9zdXJlX3ZhdWx0IGltcG9ydCBjb21waWxlX2Rvc3NpZXIKICAgICAgICBnYXAgPSBqc29uLmxvYWRzKGdhcF9qc29uKSBpZiBnYXBfanNvbi5zdHJpcCgpIGVsc2Uge30KICAgICAgICBkaWQgPSBjb21waWxlX2Rvc3NpZXIoCiAgICAgICAgICAgIHJlcG89cmVwb19pbnB1dC5zdHJpcCgpLAogICAgICAgICAgICBzZW1hbnRpY19ncmFwaD17fSwKICAgICAgICAgICAgYXNzdW1wdGlvbl9nYXA9Z2FwLAogICAgICAgICAgICBoYXJuZXNzX3Jlc3VsdD17InN0ZG91dCI6IGhhcm5lc3NfcmVzdWx0LCAidHJpZ2dlcmVkIjogIlRSSUdHRVJFRDogVHJ1ZSIgaW4gaGFybmVzc19yZXN1bHR9LAogICAgICAgICAgICBidWdfYm91bnR5X3Byb2dyYW09YnVnX2JvdW50eS5zdHJpcCgpLAogICAgICAgICkKICAgICAgICByZXR1cm4gZiLinIUgRG9zc2llciBjb21waWxlZC4gRGlzY2xvc3VyZSBJRDoge2RpZH1cblN0YXR1czogRFJBRlQg4oCUIGF3YWl0aW5nIGh1bWFuIGFwcHJvdmFsLiIKICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICByZXR1cm4gZiJFcnJvcjoge2V9IgoKCmRlZiBhcHByb3ZlX2FuZF9wcmVwYXJlX21zZyhkaXNjbG9zdXJlX2lkOiBzdHIsIGFwcHJvdmVyOiBzdHIpIC0+IHN0cjoKICAgIHRyeToKICAgICAgICBmcm9tIGRpc2Nsb3N1cmVfdmF1bHQgaW1wb3J0IGFwcHJvdmVfZGlzY2xvc3VyZSwgcHJlcGFyZV9kaXNjbG9zdXJlX21lc3NhZ2UKICAgICAgICBhcHByb3ZlX2Rpc2Nsb3N1cmUoZGlzY2xvc3VyZV9pZC5zdHJpcCgpLCBhcHByb3Zlci5zdHJpcCgpIG9yICJvcGVyYXRvciIpCiAgICAgICAgbXNnID0gcHJlcGFyZV9kaXNjbG9zdXJlX21lc3NhZ2UoZGlzY2xvc3VyZV9pZC5zdHJpcCgpKQogICAgICAgIHJldHVybiBmIuKchSBBcHByb3ZlZCBieToge2FwcHJvdmVyfVxuXG4tLS0gRElTQ0xPU1VSRSBNRVNTQUdFIChzZW5kIG1hbnVhbGx5KSAtLS1cblxue21zZ30iCiAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgcmV0dXJuIGYiRXJyb3I6IHtlfSIKCgpkZWYgcmVqZWN0X2Rpc2Nsb3N1cmVfZm4oZGlzY2xvc3VyZV9pZDogc3RyKSAtPiBzdHI6CiAgICB0cnk6CiAgICAgICAgZnJvbSBkaXNjbG9zdXJlX3ZhdWx0IGltcG9ydCByZWplY3RfZGlzY2xvc3VyZQogICAgICAgIHJlamVjdF9kaXNjbG9zdXJlKGRpc2Nsb3N1cmVfaWQuc3RyaXAoKSkKICAgICAgICByZXR1cm4gZiLinIUgRGlzY2xvc3VyZSB7ZGlzY2xvc3VyZV9pZC5zdHJpcCgpfSByZWplY3RlZCBhbmQgYXJjaGl2ZWQuIgogICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgIHJldHVybiBmIkVycm9yOiB7ZX0iCgoKIyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKIyBIRVJNRVMgT1JDSEVTVFJBVE9SIEhFTFBFUlMKIyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKCl9oZXJtZXNfc2Vzc2lvbnM6IGRpY3QgPSB7fQpfaGVybWVzX2FjdGl2ZV9zZXNzaW9uX2lkOiBzdHIgPSAiIgpfaGVybWVzX3J1bm5pbmcgPSB0aHJlYWRpbmcuRXZlbnQoKQoKCmRlZiBfaGVybWVzX3J1bl9iYWNrZ3JvdW5kKAogICAgdGFyZ2V0X3JlcG86IHN0ciwKICAgIHJlcG9fZGlyOiBzdHIsCiAgICBmb2N1c19hcmVhOiBzdHIsCiAgICBtYXhfaXRlcmF0aW9uczogaW50LAopIC0+IE5vbmU6CiAgICBnbG9iYWwgX2hlcm1lc19hY3RpdmVfc2Vzc2lvbl9pZAogICAgX2hlcm1lc19ydW5uaW5nLnNldCgpCiAgICB0cnk6CiAgICAgICAgc2Vzc2lvbiA9IHJ1bl9oZXJtZXNfcmVzZWFyY2goCiAgICAgICAgICAgIHRhcmdldF9yZXBvPXRhcmdldF9yZXBvLAogICAgICAgICAgICByZXBvX2Rpcj1yZXBvX2RpciwKICAgICAgICAgICAgZm9jdXNfYXJlYT1mb2N1c19hcmVhLAogICAgICAgICAgICBtYXhfaXRlcmF0aW9ucz1pbnQobWF4X2l0ZXJhdGlvbnMpLAogICAgICAgICkKICAgICAgICBfaGVybWVzX3Nlc3Npb25zW3Nlc3Npb24uc2Vzc2lvbl9pZF0gPSBzZXNzaW9uCiAgICAgICAgX2hlcm1lc19hY3RpdmVfc2Vzc2lvbl9pZCA9IHNlc3Npb24uc2Vzc2lvbl9pZAoKICAgICAgICBmb3IgZmluZGluZyBpbiBzZXNzaW9uLmZpbmRpbmdzOgogICAgICAgICAgICBhZGRfdG9fcGlwZWxpbmUoCiAgICAgICAgICAgICAgICBmaW5kaW5nX2lkPWZpbmRpbmcuZmluZGluZ19pZCwKICAgICAgICAgICAgICAgIHRpdGxlPWZpbmRpbmcudGl0bGUsCiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj1maW5kaW5nLmRlc2NyaXB0aW9uLAogICAgICAgICAgICAgICAgcHJvb2Zfb2ZfY29uY2VwdD1maW5kaW5nLnByb29mX29mX2NvbmNlcHQsCiAgICAgICAgICAgICAgICB0YXJnZXRfcmVwbz10YXJnZXRfcmVwbywKICAgICAgICAgICAgICAgIGN3ZV9pZD1maW5kaW5nLmN3ZV9pZCwKICAgICAgICAgICAgICAgIHNldmVyaXR5PWZpbmRpbmcuc2V2ZXJpdHksCiAgICAgICAgICAgICAgICBlc3RpbWF0ZWRfY3Zzcz1yb3VuZChmaW5kaW5nLnZlc19zY29yZSwgMSksCiAgICAgICAgICAgICAgICBib3VudHlfdGllcj0iUDEiIGlmIGZpbmRpbmcudmVzX3Njb3JlID49IDggZWxzZSAiUDIiIGlmIGZpbmRpbmcudmVzX3Njb3JlID49IDUgZWxzZSAiUDMiLAogICAgICAgICAgICAgICAgZXhwbG9pdF9jbGFzcz1maW5kaW5nLmV4cGxvaXRfcHJpbWl0aXZlLAogICAgICAgICAgICApCiAgICBmaW5hbGx5OgogICAgICAgIF9oZXJtZXNfcnVubmluZy5jbGVhcigpCgoKZGVmIGhlcm1lc19zdGFydF9yZXNlYXJjaCgKICAgIHRhcmdldF9yZXBvOiBzdHIsIGxvY2FsX3BhdGg6IHN0ciwgZm9jdXNfYXJlYTogc3RyLCBtYXhfaXRlcjogc3RyCikgLT4gc3RyOgogICAgaWYgX2hlcm1lc19ydW5uaW5nLmlzX3NldCgpOgogICAgICAgIHJldHVybiAi4pqg77iPIEhlcm1lcyBpcyBhbHJlYWR5IHJ1bm5pbmcgYSByZXNlYXJjaCBzZXNzaW9uLiBXYWl0IGZvciBpdCB0byBjb21wbGV0ZS4iCiAgICBpZiBub3QgdGFyZ2V0X3JlcG8uc3RyaXAoKToKICAgICAgICByZXR1cm4gIuKdjCBUYXJnZXQgcmVwb3NpdG9yeSBpcyByZXF1aXJlZCAoZS5nLiBvd25lci9yZXBvKSIKCiAgICByZXBvX2RpciA9IGxvY2FsX3BhdGguc3RyaXAoKSBvciBmIi9kYXRhL3JlcG8ve3RhcmdldF9yZXBvLnNwbGl0KCcvJylbLTFdfSIKICAgIGlmIG5vdCBvcy5wYXRoLmlzZGlyKHJlcG9fZGlyKToKICAgICAgICByZXR1cm4gZiLinYwgTG9jYWwgcGF0aCBub3QgZm91bmQ6IHtyZXBvX2Rpcn1cbkNsb25lIHRoZSByZXBvIGZpcnN0IHVzaW5nIHRoZSBtYWluIEF1ZGl0IHRhYi4iCgogICAgdCA9IHRocmVhZGluZy5UaHJlYWQoCiAgICAgICAgdGFyZ2V0PV9oZXJtZXNfcnVuX2JhY2tncm91bmQsCiAgICAgICAgYXJncz0odGFyZ2V0X3JlcG8uc3RyaXAoKSwgcmVwb19kaXIsIGZvY3VzX2FyZWEuc3RyaXAoKSwgbWF4X2l0ZXIgb3IgMTUpLAogICAgICAgIGRhZW1vbj1UcnVlLCBuYW1lPSJoZXJtZXMtcmVzZWFyY2giLAogICAgKQogICAgdC5zdGFydCgpCiAgICByZXR1cm4gKAogICAgICAgIGYi8J+noCBIZXJtZXMgc3RhcnRlZCBvbiB7dGFyZ2V0X3JlcG99XG4iCiAgICAgICAgZiJGb2N1czoge2ZvY3VzX2FyZWEgb3IgJ0Z1bGwgYXV0b25vbW91cyBzY2FuJ31cbiIKICAgICAgICBmIk1heCBpdGVyYXRpb25zOiB7bWF4X2l0ZXJ9XG5cbiIKICAgICAgICAiV2F0Y2ggdGhlIGxpdmUgbG9ncyBiZWxvdy4gRmluZGluZ3Mgd2lsbCBhcHBlYXIgaW4gdGhlIERpc2Nsb3N1cmUgUGlwZWxpbmUgdGFiLiIKICAgICkKCgpkZWYgaGVybWVzX2dldF9saXZlX2xvZ3MoKSAtPiBzdHI6CiAgICBsb2dzID0gZ2V0X2hlcm1lc19sb2dzKCkKICAgIHN0YXR1cyA9ICLwn5SEIFJVTk5JTkciIGlmIF9oZXJtZXNfcnVubmluZy5pc19zZXQoKSBlbHNlICLij7ggSURMRSIKICAgIGhlYWRlciA9IGYiW0hFUk1FUyBTVEFUVVM6IHtzdGF0dXN9XVxueyfilIAnICogNTB9XG4iCiAgICByZXR1cm4gaGVhZGVyICsgIlxuIi5qb2luKGxvZ3NbLTgwOl0pIGlmIGxvZ3MgZWxzZSBoZWFkZXIgKyAiTm8gbG9ncyB5ZXQuIgoKCmRlZiBoZXJtZXNfZ2V0X3Nlc3Npb25fc3VtbWFyeSgpIC0+IHN0cjoKICAgIGlmIG5vdCBfaGVybWVzX2FjdGl2ZV9zZXNzaW9uX2lkOgogICAgICAgIHJldHVybiAiTm8gc2Vzc2lvbiBjb21wbGV0ZWQgeWV0LiIKICAgIHNlc3Npb24gPSBfaGVybWVzX3Nlc3Npb25zLmdldChfaGVybWVzX2FjdGl2ZV9zZXNzaW9uX2lkKQogICAgaWYgbm90IHNlc3Npb246CiAgICAgICAgcmV0dXJuICJTZXNzaW9uIG5vdCBmb3VuZC4iCiAgICBzdW1tYXJ5ID0gZ2V0X3Nlc3Npb25fc3VtbWFyeShzZXNzaW9uKQogICAgbGluZXMgPSBbCiAgICAgICAgZiJTZXNzaW9uOiB7c3VtbWFyeVsnc2Vzc2lvbl9pZCddfSIsCiAgICAgICAgZiJUYXJnZXQ6IHtzdW1tYXJ5Wyd0YXJnZXQnXX0iLAogICAgICAgIGYiUGhhc2U6IHtzdW1tYXJ5WydwaGFzZSddfSIsCiAgICAgICAgZiJTdGFydGVkOiB7c3VtbWFyeVsnc3RhcnRlZF9hdCddfSIsCiAgICAgICAgZiJDb21wbGV0ZWQ6IHtzdW1tYXJ5LmdldCgnY29tcGxldGVkX2F0JywgJ2luIHByb2dyZXNzJyl9IiwKICAgICAgICBmIlRvdGFsIGZpbmRpbmdzOiB7c3VtbWFyeVsndG90YWxfZmluZGluZ3MnXX0iLAogICAgICAgIGYiQnkgc2V2ZXJpdHk6IHtzdW1tYXJ5WydieV9zZXZlcml0eSddfSIsCiAgICAgICAgZiJUb29sIGNhbGxzOiB7c3VtbWFyeVsndG9vbF9jYWxscyddfSIsCiAgICAgICAgZiJBdHRhY2sgc3VyZmFjZSBzaW5rczoge3N1bW1hcnlbJ2F0dGFja19zdXJmYWNlX3NpemUnXX0iLAogICAgICAgICIiLAogICAgICAgICJUT1AgRklORElOR1MgKGJ5IFZFUyBzY29yZSk6IiwKICAgIF0KICAgIGZvciBmIGluIHN1bW1hcnlbInRvcF9maW5kaW5ncyJdOgogICAgICAgIGxpbmVzLmFwcGVuZCgKICAgICAgICAgICAgZiIgIFt7Zlsnc2V2ZXJpdHknXX1dIHtmWyd0aXRsZSddWzo2MF19XG4iCiAgICAgICAgICAgIGYiICAgIENXRToge2ZbJ2N3ZSddfSB8IFZFUzoge2ZbJ3ZlcyddfSB8IEFDVFM6IHtmWydhY3RzJ119XG4iCiAgICAgICAgICAgIGYiICAgIEZpbGU6IHtmWydmaWxlJ119IHwgU3RhdHVzOiB7Zlsnc3RhdHVzJ119IgogICAgICAgICkKICAgIHJldHVybiAiXG4iLmpvaW4obGluZXMpCgoKZGVmIGhlcm1lc19nZXRfcGlwZWxpbmVfZGlzcGxheSgpIC0+IHN0cjoKICAgIHJldHVybiBnZXRfcGlwZWxpbmVfc3VtbWFyeSgpCgoKZGVmIGhlcm1lc19hcHByb3ZlX2ZpbmRpbmcocmVjb3JkX2lkOiBzdHIsIG5vdGVzOiBzdHIpIC0+IHN0cjoKICAgIGlmIG5vdCByZWNvcmRfaWQuc3RyaXAoKToKICAgICAgICByZXR1cm4gIuKdjCBSZWNvcmQgSUQgcmVxdWlyZWQiCiAgICByZXN1bHQgPSBodW1hbl9hcHByb3ZlKHJlY29yZF9pZC5zdHJpcCgpLCBub3Rlcy5zdHJpcCgpKQogICAgcmV0dXJuIGYi4pyFIEZpbmRpbmcge3JlY29yZF9pZH0gYXBwcm92ZWQuXG57cmVzdWx0fSIKCgpkZWYgaGVybWVzX3JlamVjdF9maW5kaW5nKHJlY29yZF9pZDogc3RyLCBub3Rlczogc3RyKSAtPiBzdHI6CiAgICBpZiBub3QgcmVjb3JkX2lkLnN0cmlwKCk6CiAgICAgICAgcmV0dXJuICLinYwgUmVjb3JkIElEIHJlcXVpcmVkIgogICAgcmVzdWx0ID0gaHVtYW5fcmVqZWN0KHJlY29yZF9pZC5zdHJpcCgpLCBub3Rlcy5zdHJpcCgpKQogICAgcmV0dXJuIGYi4p2MIEZpbmRpbmcge3JlY29yZF9pZH0gcmVqZWN0ZWQuXG57cmVzdWx0fSIKCgpkZWYgaGVybWVzX3N1Ym1pdF9oYWNrZXJvbmUocmVjb3JkX2lkOiBzdHIpIC0+IHN0cjoKICAgIGlmIG5vdCByZWNvcmRfaWQuc3RyaXAoKToKICAgICAgICByZXR1cm4gIuKdjCBSZWNvcmQgSUQgcmVxdWlyZWQiCiAgICByZXN1bHQgPSBzdWJtaXRfdG9faGFja2Vyb25lKHJlY29yZF9pZC5zdHJpcCgpKQogICAgaWYgcmVzdWx0LmdldCgic3VjY2VzcyIpOgogICAgICAgIHJldHVybiBmIuKchSBTdWJtaXR0ZWQgdG8gSGFja2VyT25lOiB7cmVzdWx0LmdldCgndXJsJyl9IgogICAgcmV0dXJuIGYi4p2MIFN1Ym1pc3Npb24gZmFpbGVkOiB7cmVzdWx0LmdldCgnZXJyb3InKX0iCgoKZGVmIGhlcm1lc19zdWJtaXRfZ2l0aHViKHJlY29yZF9pZDogc3RyLCBvd25lcl9yZXBvOiBzdHIpIC0+IHN0cjoKICAgIGlmIG5vdCByZWNvcmRfaWQuc3RyaXAoKSBvciBub3Qgb3duZXJfcmVwby5zdHJpcCgpOgogICAgICAgIHJldHVybiAi4p2MIFJlY29yZCBJRCBhbmQgb3duZXIvcmVwbyByZXF1aXJlZCIKICAgIHBhcnRzID0gb3duZXJfcmVwby5zdHJpcCgpLnNwbGl0KCIvIikKICAgIGlmIGxlbihwYXJ0cykgIT0gMjoKICAgICAgICByZXR1cm4gIuKdjCBGb3JtYXQgbXVzdCBiZSBvd25lci9yZXBvIgogICAgcmVzdWx0ID0gc3VibWl0X2dpdGh1Yl9hZHZpc29yeShyZWNvcmRfaWQuc3RyaXAoKSwgcGFydHNbMF0sIHBhcnRzWzFdKQogICAgaWYgcmVzdWx0LmdldCgic3VjY2VzcyIpOgogICAgICAgIHJldHVybiBmIuKchSBHaXRIdWIgQWR2aXNvcnkgY3JlYXRlZDoge3Jlc3VsdC5nZXQoJ3VybCcpfSIKICAgIHJldHVybiBmIuKdjCBTdWJtaXNzaW9uIGZhaWxlZDoge3Jlc3VsdC5nZXQoJ2Vycm9yJyl9IgoKCiMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiMgR1JBRElPIEVOVEVSUFJJU0UgREFTSEJPQVJECiMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAClRIRU1FID0gZ3IudGhlbWVzLkJhc2UoCiAgICBwcmltYXJ5X2h1ZT0idmlvbGV0Iiwgc2Vjb25kYXJ5X2h1ZT0ic2xhdGUiLCBuZXV0cmFsX2h1ZT0ic2xhdGUiLAogICAgZm9udD1bZ3IudGhlbWVzLkdvb2dsZUZvbnQoIkludGVyIiksICJ1aS1zYW5zLXNlcmlmIiwgInN5c3RlbS11aSJdLAopLnNldCgKICAgIGJvZHlfYmFja2dyb3VuZF9maWxsPSIjMGEwYTBmIiwKICAgIGJvZHlfdGV4dF9jb2xvcj0iI2UyZThmMCIsCiAgICBibG9ja19iYWNrZ3JvdW5kX2ZpbGw9IiMxMjEyMWMiLAogICAgYmxvY2tfYm9yZGVyX2NvbG9yPSIjMWUxZTJlIiwKICAgIGJsb2NrX2xhYmVsX3RleHRfY29sb3I9IiM2NDc0OGIiLAogICAgaW5wdXRfYmFja2dyb3VuZF9maWxsPSIjMGEwYTBmIiwKICAgIGJ1dHRvbl9wcmltYXJ5X2JhY2tncm91bmRfZmlsbD0iIzViMjFiNiIsCiAgICBidXR0b25fcHJpbWFyeV9iYWNrZ3JvdW5kX2ZpbGxfaG92ZXI9IiM2ZDI4ZDkiLAogICAgYnV0dG9uX3ByaW1hcnlfdGV4dF9jb2xvcj0iI2ZmZmZmZiIsCikKCndpdGggZ3IuQmxvY2tzKHRpdGxlPSJSaG9kYXdrIEFJIOKAlCBDb2RlIFJldmlldyBNb25zdGVyIikgYXMgZGVtbzoKCiAgICBnci5IVE1MKCIiIgogICAgPGRpdiBzdHlsZT0icGFkZGluZzoyMHB4IDAgNHB4IDA7IGJvcmRlci1ib3R0b206MXB4IHNvbGlkICMxZTFlMmU7IG1hcmdpbi1ib3R0b206MTZweDsiPgogICAgICA8ZGl2IHN0eWxlPSJkaXNwbGF5OmZsZXg7IGFsaWduLWl0ZW1zOmNlbnRlcjsgZ2FwOjE0cHg7Ij4KICAgICAgICA8c3BhbiBzdHlsZT0iZm9udC1zaXplOjIuMnJlbTsiPvCfpoU8L3NwYW4+CiAgICAgICAgPGRpdj4KICAgICAgICAgIDxoMSBzdHlsZT0ibWFyZ2luOjA7IGZvbnQtc2l6ZToxLjVyZW07IGZvbnQtd2VpZ2h0OjgwMDsgY29sb3I6I2YxZjVmOTsgbGV0dGVyLXNwYWNpbmc6LTAuMDNlbTsiPgogICAgICAgICAgICBSaG9kYXdrIEFJIDxzcGFuIHN0eWxlPSJjb2xvcjojN2MzYWVkOyBmb250LXNpemU6MC45cmVtOyBmb250LXdlaWdodDo2MDA7IG1hcmdpbi1sZWZ0OjhweDsiPnYzLjA8L3NwYW4+CiAgICAgICAgICA8L2gxPgogICAgICAgICAgPHAgc3R5bGU9Im1hcmdpbjoycHggMCAwOyBmb250LXNpemU6MC44cmVtOyBjb2xvcjojNDc1NTY5OyBsZXR0ZXItc3BhY2luZzowLjAyZW07Ij4KICAgICAgICAgICAgQVVUT05PTU9VUyBERVZTRUNPUFMgQ09OVFJPTCBQTEFORSAmbmJzcDvCtyZuYnNwOwogICAgICAgICAgICBDTE9TRUQgVkVSSUZJQ0FUSU9OIExPT1AgJm5ic3A7wrcmbmJzcDsKICAgICAgICAgICAgQURWRVJTQVJJQUwgTExNIFJFVklFVyAmbmJzcDvCtyZuYnNwOwogICAgICAgICAgICBEQVRBIEZMWVdIRUVMICZuYnNwO8K3Jm5ic3A7CiAgICAgICAgICAgIFNVUFBMWSBDSEFJTiBHQVRFCiAgICAgICAgICA8L3A+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICAiIiIpCgogICAgd2l0aCBnci5UYWJzKCk6CgogICAgICAgICMg4pSA4pSAIFRBQiAxOiBMSVZFIE9QRVJBVElPTlMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICAgICAgd2l0aCBnci5UYWIoIuKaoSBMaXZlIE9wZXJhdGlvbnMiKToKCiAgICAgICAgICAgICMg4pSA4pSAIFNUQVRVUyBCQVIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICAgICAgICAgIHdpdGggZ3IuUm93KCk6CiAgICAgICAgICAgICAgICBzdGF0X3N0YXR1cyA9IGdyLlRleHRib3gobGFiZWw9IlN5c3RlbSBTdGF0dXMiLCBpbnRlcmFjdGl2ZT1GYWxzZSwgc2NhbGU9MykKICAgICAgICAgICAgICAgIHN0YXRfdG90YWwgID0gZ3IuTnVtYmVyKGxhYmVsPSJUZXN0cyBTY2FubmVkIiwgIGludGVyYWN0aXZlPUZhbHNlKQogICAgICAgICAgICAgICAgc3RhdF9kb25lICAgPSBnci5OdW1iZXIobGFiZWw9IlZlcmlmaWVkIEdyZWVuIiwgaW50ZXJhY3RpdmU9RmFsc2UpCiAgICAgICAgICAgICAgICBzdGF0X3BycyAgICA9IGdyLk51bWJlcihsYWJlbD0iUFJzIEdlbmVyYXRlZCIsICBpbnRlcmFjdGl2ZT1GYWxzZSkKICAgICAgICAgICAgICAgIHN0YXRfZmFpbGVkID0gZ3IuTnVtYmVyKGxhYmVsPSJGYWlsZWQiLCAgICAgICAgIGludGVyYWN0aXZlPUZhbHNlKQogICAgICAgICAgICAgICAgc3RhdF9zYXN0ICAgPSBnci5OdW1iZXIobGFiZWw9IlNBU1QgQmxvY2tlZCIsICAgaW50ZXJhY3RpdmU9RmFsc2UpCgogICAgICAgICAgICAjIOKUgOKUgCBDSEFUIElOQk9YIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgICAgICAgICBnci5IVE1MKCIiIgogICAgICAgICAgICA8ZGl2IHN0eWxlPSJtYXJnaW46MjBweCAwIDhweCAwOyBwYWRkaW5nOjEycHggMTZweDsKICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZDojMGYwZjFhOyBib3JkZXI6MXB4IHNvbGlkICMyZDJkNDQ7CiAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6MTBweDsiPgogICAgICAgICAgICAgIDxzcGFuIHN0eWxlPSJmb250LXNpemU6MC44NXJlbTsgZm9udC13ZWlnaHQ6NzAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjojN2MzYWVkOyBsZXR0ZXItc3BhY2luZzowLjA2ZW07CiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQtdHJhbnNmb3JtOnVwcGVyY2FzZTsiPgogICAgICAgICAgICAgICAg8J+OryBBdWRpdCBJbmJveAogICAgICAgICAgICAgIDwvc3Bhbj4KICAgICAgICAgICAgICA8c3BhbiBzdHlsZT0iZm9udC1zaXplOjAuNzhyZW07IGNvbG9yOiM0NzU1Njk7IG1hcmdpbi1sZWZ0OjEwcHg7Ij4KICAgICAgICAgICAgICAgIEVudGVyIGEgR2l0SHViIHJlcG8gYmVsb3cgdG8gbGF1bmNoIGEgZnVsbCBhdXRvbm9tb3VzIGhlYWxpbmcgYXVkaXQKICAgICAgICAgICAgICA8L3NwYW4+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAiIiIpCgogICAgICAgICAgICBpbmJveF9jaGF0Ym90ID0gZ3IuQ2hhdGJvdCgKICAgICAgICAgICAgICAgIGxhYmVsPSIiLAogICAgICAgICAgICAgICAgaGVpZ2h0PTI0MCwKICAgICAgICAgICAgICAgIHNob3dfbGFiZWw9RmFsc2UsCiAgICAgICAgICAgICkKCiAgICAgICAgICAgIHdpdGggZ3IuUm93KCk6CiAgICAgICAgICAgICAgICByZXBvX3RleHRib3ggPSBnci5UZXh0Ym94KAogICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPSJvd25lci9yZXBvICAoZS5nLiBNb2dhc2FsYUhlbWFnaXJpL011bHRpLUFnZW50LUNvZGUtU3RhYmlsaXplcikiLAogICAgICAgICAgICAgICAgICAgIHNob3dfbGFiZWw9RmFsc2UsCiAgICAgICAgICAgICAgICAgICAgc2NhbGU9NSwKICAgICAgICAgICAgICAgICAgICBsaW5lcz0xLAogICAgICAgICAgICAgICAgICAgIG1heF9saW5lcz0xLAogICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcj1GYWxzZSwKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHJ1bl9idG4gPSBnci5CdXR0b24oIvCfmoAgUnVuIEF1ZGl0IiwgdmFyaWFudD0icHJpbWFyeSIsIHNjYWxlPTEsIG1pbl93aWR0aD0xMjApCgogICAgICAgICAgICBydW5fYnRuLmNsaWNrKAogICAgICAgICAgICAgICAgc3VibWl0X3JlcG9fYXVkaXQsCiAgICAgICAgICAgICAgICBpbnB1dHM9W3JlcG9fdGV4dGJveCwgaW5ib3hfY2hhdGJvdF0sCiAgICAgICAgICAgICAgICBvdXRwdXRzPVtpbmJveF9jaGF0Ym90LCByZXBvX3RleHRib3hdLAogICAgICAgICAgICApCiAgICAgICAgICAgIHJlcG9fdGV4dGJveC5zdWJtaXQoCiAgICAgICAgICAgICAgICBzdWJtaXRfcmVwb19hdWRpdCwKICAgICAgICAgICAgICAgIGlucHV0cz1bcmVwb190ZXh0Ym94LCBpbmJveF9jaGF0Ym90XSwKICAgICAgICAgICAgICAgIG91dHB1dHM9W2luYm94X2NoYXRib3QsIHJlcG9fdGV4dGJveF0sCiAgICAgICAgICAgICkKCiAgICAgICAgICAgIGdyLkhUTUwoIjxkaXYgc3R5bGU9J2hlaWdodDo0cHg7Jz48L2Rpdj4iKQoKICAgICAgICAgICAgIyDilIDilIAgQ09OVFJPTFMgUk9XIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgICAgICAgICB3aXRoIGdyLlJvdygpOgogICAgICAgICAgICAgICAgYnRuX2F1ZGl0ICAgICA9IGdyLkJ1dHRvbigi8J+agCBUcmlnZ2VyIEF1ZGl0IChlbnYgR0lUSFVCX1JFUE8pIiwgdmFyaWFudD0ic2Vjb25kYXJ5Iiwgc2NhbGU9MykKICAgICAgICAgICAgICAgIGJ0bl90ZXJtaW5hdGUgPSBnci5CdXR0b24oIuKblCBUZXJtaW5hdGUgQXVkaXQiLCB2YXJpYW50PSJzdG9wIiwgc2NhbGU9MikKICAgICAgICAgICAgICAgIGJ0bl9yZXNldCAgICAgPSBnci5CdXR0b24oIvCfl5EgUmVzZXQgUXVldWUiLCB2YXJpYW50PSJzZWNvbmRhcnkiLCBzY2FsZT0xKQoKICAgICAgICAgICAgdHJpZ2dlcl9vdXQgPSBnci5UZXh0Ym94KGxhYmVsPSIiLCBpbnRlcmFjdGl2ZT1GYWxzZSwgc2hvd19sYWJlbD1GYWxzZSkKICAgICAgICAgICAgYnRuX2F1ZGl0LmNsaWNrKHRyaWdnZXJfYXVkaXRfZm4sICBvdXRwdXRzPXRyaWdnZXJfb3V0KQogICAgICAgICAgICBidG5fdGVybWluYXRlLmNsaWNrKHRlcm1pbmF0ZV9hdWRpdCwgb3V0cHV0cz10cmlnZ2VyX291dCkKICAgICAgICAgICAgYnRuX3Jlc2V0LmNsaWNrKHJlc2V0X3F1ZXVlLCAgICAgICAgb3V0cHV0cz10cmlnZ2VyX291dCkKCiAgICAgICAgICAgICMg4pSA4pSAIExJVkUgTE9HIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgICAgICAgICBsaXZlX2xvZ3MgPSBnci5UZXh0QXJlYShsYWJlbD0iTGl2ZSBBZ2VudCBFeGVjdXRpb24gTG9nIiwgbGluZXM9MjYsIGludGVyYWN0aXZlPUZhbHNlKQoKICAgICAgICAjIOKUgOKUgCBUQUIgMjogSk9CIFFVRVVFIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgICAgIHdpdGggZ3IuVGFiKCLwn5OLIEpvYiBRdWV1ZSIpOgogICAgICAgICAgICBnci5NYXJrZG93bigiIyMjIE5hbWVzcGFjZWQgam9iIHN0b3JlIOKAlCBwZXIgKHRlbmFudCwgcmVwbywgdGVzdCkiKQogICAgICAgICAgICBqb2JfdGFibGUgPSBnci5EYXRhZnJhbWUoCiAgICAgICAgICAgICAgICBoZWFkZXJzPVsiVGVzdCBQYXRoIiwgIlN0YXR1cyIsICJQUiBVUkwiLCAiTW9kZWwiLCAiVXBkYXRlZCBBdCJdLAogICAgICAgICAgICAgICAgZGF0YXR5cGU9WyJzdHIiLCAic3RyIiwgInN0ciIsICJzdHIiLCAic3RyIl0sIGludGVyYWN0aXZlPUZhbHNlLCB3cmFwPVRydWUsCiAgICAgICAgICAgICkKICAgICAgICAgICAgZ3IuQnV0dG9uKCLwn5SEIFJlZnJlc2giLCB2YXJpYW50PSJzZWNvbmRhcnkiKS5jbGljayhnZXRfam9iX3RhYmxlLCBvdXRwdXRzPWpvYl90YWJsZSkKCiAgICAgICAgIyDilIDilIAgVEFCIDM6IEFVRElUIFRSQUlMIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgICAgIHdpdGggZ3IuVGFiKCLwn5SSIEF1ZGl0IFRyYWlsIik6CiAgICAgICAgICAgIGdyLk1hcmtkb3duKAogICAgICAgICAgICAgICAgIiMjIyBTSEEtMjU2IGNoYWluZWQgYXVkaXQgbG9nIOKAlCBldmVyeSBBSSBhY3Rpb24gaXMgY3J5cHRvZ3JhcGhpY2FsbHkgbGlua2VkXG4iCiAgICAgICAgICAgICAgICAiQ292ZXJzOiBkaXNwYXRjaCDihpIgU0FTVCBzY2FuIOKGkiBzdXBwbHkgY2hhaW4g4oaSIGFkdmVyc2FyaWFsIHJldmlldyDihpIgUFIgc3VibWlzc2lvbiIKICAgICAgICAgICAgKQogICAgICAgICAgICBjaGFpbl9zdGF0dXMgPSBnci5UZXh0Ym94KGxhYmVsPSJDaGFpbiBJbnRlZ3JpdHkgU3RhdHVzIiwgaW50ZXJhY3RpdmU9RmFsc2UpCiAgICAgICAgICAgIGF1ZGl0X2xvZyA9IGdyLlRleHRBcmVhKGxhYmVsPSJFdmVudHMgKGxhdGVzdCBmaXJzdCkiLCBsaW5lcz0yMCwgaW50ZXJhY3RpdmU9RmFsc2UpCiAgICAgICAgICAgIGdyLkJ1dHRvbigi8J+UjSBWZXJpZnkgQ2hhaW4iLCB2YXJpYW50PSJzZWNvbmRhcnkiKS5jbGljaygKICAgICAgICAgICAgICAgIGZuPWxhbWJkYTogKGdldF9jaGFpbl9pbnRlZ3JpdHlfZGlzcGxheSgpLCBnZXRfYXVkaXRfZGlzcGxheSgpKSwKICAgICAgICAgICAgICAgIG91dHB1dHM9W2NoYWluX3N0YXR1cywgYXVkaXRfbG9nXQogICAgICAgICAgICApCgogICAgICAgICMg4pSA4pSAIFRBQiA0OiBEQVRBIEZMWVdIRUVMIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgICAgIHdpdGggZ3IuVGFiKCLwn6egIERhdGEgRmx5d2hlZWwiKToKICAgICAgICAgICAgZ3IuTWFya2Rvd24oCiAgICAgICAgICAgICAgICAiIyMjIFByb3ByaWV0YXJ5IHRyYWluaW5nIGRhdGEgcGlwZWxpbmVcbiIKICAgICAgICAgICAgICAgICJFdmVyeSBgKGZhaWx1cmUsIGZpeCwgYWR2ZXJzYXJpYWxfdmVyZGljdCwgdGVzdF9yZXN1bHQpYCB0dXBsZSBpcyBzdG9yZWQuICIKICAgICAgICAgICAgICAgICJFeHBvcnQgYXMgSHVnZ2luZ0ZhY2UtY29tcGF0aWJsZSBKU09OTCBmb3IgbW9kZWwgZmluZS10dW5pbmcuIgogICAgICAgICAgICApCiAgICAgICAgICAgIHN0YXRzX2Rpc3BsYXkgICA9IGdyLlRleHRBcmVhKGxhYmVsPSJGbHl3aGVlbCBTdGF0aXN0aWNzIiwgICAgICAgIGxpbmVzPTEyLCBpbnRlcmFjdGl2ZT1GYWxzZSkKICAgICAgICAgICAgdHJhaW5pbmdfZXhwb3J0ID0gZ3IuVGV4dEFyZWEobGFiZWw9IlRyYWluaW5nIERhdGEgRXhwb3J0IChKU09OTCkiLCBsaW5lcz0xNCwgaW50ZXJhY3RpdmU9RmFsc2UpCiAgICAgICAgICAgIHdpdGggZ3IuUm93KCk6CiAgICAgICAgICAgICAgICBnci5CdXR0b24oIvCfk4ogUmVmcmVzaCBTdGF0cyIsICB2YXJpYW50PSJzZWNvbmRhcnkiKS5jbGljayhnZXRfdHJhaW5pbmdfc3RhdHNfZGlzcGxheSwgb3V0cHV0cz1zdGF0c19kaXNwbGF5KQogICAgICAgICAgICAgICAgZ3IuQnV0dG9uKCLirIcgRXhwb3J0IEpTT05MIiwgICAgdmFyaWFudD0ic2Vjb25kYXJ5IikuY2xpY2soZ2V0X3RyYWluaW5nX2V4cG9ydCwgICAgICAgIG91dHB1dHM9dHJhaW5pbmdfZXhwb3J0KQoKICAgICAgICAjIOKUgOKUgCBUQUIgNTogV0VCSE9PS1Mg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICAgICAgd2l0aCBnci5UYWIoIvCflJcgV2ViaG9va3MiKToKICAgICAgICAgICAgZ3IuTWFya2Rvd24oZiIiIgojIyMgRXZlbnQtRHJpdmVuIFRyaWdnZXIgU2VydmVyIChQb3J0IDc4NjEpCgpgYGAKUE9TVCAvd2ViaG9vay9naXRodWIgICAg4oCUIEdpdEh1YiBwdXNoL2NoZWNrX3J1biBldmVudHMgKEhNQUMtU0hBMjU2IHZhbGlkYXRlZCkKUE9TVCAvd2ViaG9vay9jaSAgICAgICAg4oCUIEdlbmVyaWMgQ0kgZmFpbHVyZToge3sicmVwbyI6ICJvd25lci9yZXBvIiwgInRlc3RfcGF0aCI6ICJ0ZXN0cy8uLi4ifX0KUE9TVCAvd2ViaG9vay90cmlnZ2VyICAg4oCUIE1hbnVhbCB0cmlnZ2VyCkdFVCAgL3dlYmhvb2svaGVhbHRoICAgIOKAlCBMaXZlbmVzcyBwcm9iZQpHRVQgIC93ZWJob29rL3F1ZXVlICAgICDigJQgQ3VycmVudCBqb2Igc3RhdHVzIChKU09OKQpgYGAKICAgICAgICAgICAgIiIiKQogICAgICAgICAgICB3ZWJob29rX2xvZyA9IGdyLlRleHRBcmVhKGxhYmVsPSJXZWJob29rIEV2ZW50IExvZyIsIGxpbmVzPTE1LCBpbnRlcmFjdGl2ZT1GYWxzZSkKICAgICAgICAgICAgZ3IuQnV0dG9uKCLwn5SEIFJlZnJlc2giLCB2YXJpYW50PSJzZWNvbmRhcnkiKS5jbGljayhnZXRfd2ViaG9va19sb2dfZGlzcGxheSwgb3V0cHV0cz13ZWJob29rX2xvZykKCiAgICAgICAgIyDilIDilIAgVEFCIDY6IFJFRCBURUFNIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgICAgIHdpdGggZ3IuVGFiKCLimpTvuI8gUmVkIFRlYW0iKToKICAgICAgICAgICAgZ3IuTWFya2Rvd24oCiAgICAgICAgICAgICAgICAiIyMjIEF1dG9ub21vdXMgUmVkIFRlYW0gQ0VHSVNcbiIKICAgICAgICAgICAgICAgICJXaGVuIGFsbCB0ZXN0cyBhcmUgZ3JlZW4sIFJob2Rhd2sgYXR0YWNrcyB0aGUgcmVwbyB3aXRoIGdlbmVyYXRlZCBwcm9wZXJ0eS1iYXNlZCB0ZXN0cyAiCiAgICAgICAgICAgICAgICAiYW5kIGhhbmRzIHJlcHJvZHVjaWJsZSB6ZXJvLWRheXMgYmFjayB0byBCbHVlIFRlYW0gZm9yIHBhdGNoaW5nLiIKICAgICAgICAgICAgKQogICAgICAgICAgICByZWRfdGVhbV9ib3ggPSBnci5UZXh0QXJlYShsYWJlbD0iUmVkIFRlYW0gU3RhdHMgJiBMb2dzIiwgbGluZXM9MjIsIGludGVyYWN0aXZlPUZhbHNlKQogICAgICAgICAgICBnci5CdXR0b24oIvCflIQgUmVmcmVzaCBSZWQgVGVhbSBTdGF0cyIsIHZhcmlhbnQ9InNlY29uZGFyeSIpLmNsaWNrKGdldF9yZWRfdGVhbV9kaXNwbGF5LCBvdXRwdXRzPXJlZF90ZWFtX2JveCkKCiAgICAgICAgIyDilIDilIAgVEFCIDc6IFNXRS1CRU5DSCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgICAgICB3aXRoIGdyLlRhYigi8J+nqiBTV0UtYmVuY2giKToKICAgICAgICAgICAgZ3IuTWFya2Rvd24oIiMjIyBTV0UtYmVuY2ggVmVyaWZpZWQgRXZhbHVhdGlvbiIpCiAgICAgICAgICAgIHdpdGggZ3IuUm93KCk6CiAgICAgICAgICAgICAgICBzd2ViZW5jaF9jb3VudCAgID0gZ3IuTnVtYmVyKGxhYmVsPSJNYXggaW5zdGFuY2VzIiwgdmFsdWU9MjUsIHByZWNpc2lvbj0wKQogICAgICAgICAgICAgICAgc3dlYmVuY2hfc3RhcnQgICA9IGdyLkJ1dHRvbigiU3RhcnQgRXZhbHVhdGlvbiIsICB2YXJpYW50PSJwcmltYXJ5IikKICAgICAgICAgICAgICAgIHN3ZWJlbmNoX3JlZnJlc2ggPSBnci5CdXR0b24oIlJlZnJlc2ggUmVwb3J0IiwgICAgIHZhcmlhbnQ9InNlY29uZGFyeSIpCiAgICAgICAgICAgIHN3ZWJlbmNoX3N0YXR1cyA9IGdyLlRleHRib3gobGFiZWw9IlN0YXR1cyIsIGludGVyYWN0aXZlPUZhbHNlKQogICAgICAgICAgICBzd2ViZW5jaF9yZXBvcnQgPSBnci5UZXh0QXJlYShsYWJlbD0iU1dFLWJlbmNoIFJlcG9ydCIsIGxpbmVzPTI0LCBpbnRlcmFjdGl2ZT1GYWxzZSkKICAgICAgICAgICAgc3dlYmVuY2hfc3RhcnQuY2xpY2sodHJpZ2dlcl9zd2ViZW5jaF9ldmFsLCBpbnB1dHM9c3dlYmVuY2hfY291bnQsIG91dHB1dHM9c3dlYmVuY2hfc3RhdHVzKQogICAgICAgICAgICBzd2ViZW5jaF9yZWZyZXNoLmNsaWNrKGdldF9zd2ViZW5jaF9kaXNwbGF5LCBvdXRwdXRzPXN3ZWJlbmNoX3JlcG9ydCkKCiAgICAgICAgIyDilIDilIAgVEFCIDg6IEhBUlZFU1RFUiAoQW50YWdvbmlzdCBNb2RlKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgICAgICB3aXRoIGdyLlRhYigi8J+MkCBIYXJ2ZXN0ZXIiKToKICAgICAgICAgICAgZ3IuTWFya2Rvd24oCiAgICAgICAgICAgICAgICAiIyMjIEF1dG9ub21vdXMgUmVwb3NpdG9yeSBIYXJ2ZXN0ZXJcbiIKICAgICAgICAgICAgICAgICJTY2FucyBwdWJsaWMgR2l0SHViIGZvciByZXBvcyB3aXRoIGZhaWxpbmcgQ0kgYW5kIHF1ZXVlcyB0aGVtIGZvciBhdXRvbm9tb3VzIGhlYWxpbmcuXG5cbiIKICAgICAgICAgICAgICAgICIqKkVuYWJsZToqKiBzZXQgYFJIT0RBV0tfSEFSVkVTVEVSX0VOQUJMRUQ9dHJ1ZWAgaW4gU3BhY2UgU2VjcmV0cy5cbiIKICAgICAgICAgICAgICAgICIqKlBvbGwgaW50ZXJ2YWw6KiogYFJIT0RBV0tfSEFSVkVTVEVSX1BPTExfU0VDT05EU2AgKGRlZmF1bHQgMjE2MDAgPSA2aClcbiIKICAgICAgICAgICAgICAgICIqKkZvcmsgbW9kZToqKiBzZXQgYFJIT0RBV0tfRk9SS19NT0RFPXRydWVgIHRvIGZpeCByZXBvcyB3aXRob3V0IHB1c2ggYWNjZXNzLiIKICAgICAgICAgICAgKQogICAgICAgICAgICBoYXJ2ZXN0ZXJfYm94ID0gZ3IuVGV4dEFyZWEobGFiZWw9IkhhcnZlc3QgRmVlZCIsIGxpbmVzPTIwLCBpbnRlcmFjdGl2ZT1GYWxzZSkKICAgICAgICAgICAgZ3IuQnV0dG9uKCLwn5SEIFJlZnJlc2ggRmVlZCIsIHZhcmlhbnQ9InNlY29uZGFyeSIpLmNsaWNrKAogICAgICAgICAgICAgICAgZm49bGFtYmRhOiBfX2ltcG9ydF9fKCJyZXBvX2hhcnZlc3RlciIpLmdldF9mZWVkX3N1bW1hcnkoKSwKICAgICAgICAgICAgICAgIG91dHB1dHM9aGFydmVzdGVyX2JveCwKICAgICAgICAgICAgKQoKICAgICAgICAjIOKUgOKUgCBUQUIgOTogTE9SQSBTQ0hFRFVMRVIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICAgICAgd2l0aCBnci5UYWIoIvCfp6wgTG9SQSBTY2hlZHVsZXIiKToKICAgICAgICAgICAgZ3IuTWFya2Rvd24oCiAgICAgICAgICAgICAgICAiIyMjIExvUkEgRmluZS1UdW5lIFNjaGVkdWxlclxuIgogICAgICAgICAgICAgICAgIkV4cG9ydHMgYWNjdW11bGF0ZWQgKGZhaWx1cmUg4oaSIGZpeCkgcGFpcnMgaW4gaW5zdHJ1Y3Rpb24tdHVuaW5nIEpTT05MIGZvcm1hdCAiCiAgICAgICAgICAgICAgICAid2hlbiB0aGUgZGF0YSB0aHJlc2hvbGQgaXMgcmVhY2hlZC5cblxuIgogICAgICAgICAgICAgICAgIioqRW5hYmxlOioqIHNldCBgUkhPREFXS19MT1JBX0VOQUJMRUQ9dHJ1ZWBcbiIKICAgICAgICAgICAgICAgICIqKk1pbiBzYW1wbGVzOioqIGBSSE9EQVdLX0xPUkFfTUlOX1NBTVBMRVNgIChkZWZhdWx0IDUwKVxuIgogICAgICAgICAgICAgICAgIioqTWF4IGFnZToqKiBgUkhPREFXS19MT1JBX01BWF9BR0VfSE9VUlNgIChkZWZhdWx0IDE2OGggPSAxIHdlZWspXG4iCiAgICAgICAgICAgICAgICAiKipPdXRwdXQ6KiogYC9kYXRhL2xvcmFfZXhwb3J0cy9sb3JhX3RyYWluaW5nX2RhdGFfKi5qc29ubGAiCiAgICAgICAgICAgICkKICAgICAgICAgICAgbG9yYV9zdGF0dXNfYm94ID0gZ3IuVGV4dEFyZWEobGFiZWw9IlNjaGVkdWxlciBTdGF0dXMiLCBsaW5lcz0xMCwgaW50ZXJhY3RpdmU9RmFsc2UpCiAgICAgICAgICAgIGxvcmFfZXhwb3J0X2J0biA9IGdyLkJ1dHRvbigi4qyHIEZvcmNlIEV4cG9ydCBOb3ciLCB2YXJpYW50PSJzZWNvbmRhcnkiKQogICAgICAgICAgICBsb3JhX3Jlc3VsdF9ib3ggPSBnci5UZXh0QXJlYShsYWJlbD0iRXhwb3J0IFJlc3VsdCIsIGxpbmVzPTUsIGludGVyYWN0aXZlPUZhbHNlKQoKICAgICAgICAgICAgZGVmIF9mb3JjZV9sb3JhX2V4cG9ydCgpOgogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIGZyb20gbG9yYV9zY2hlZHVsZXIgaW1wb3J0IHJ1bl90cmFpbmluZ19leHBvcnQKICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBydW5fdHJhaW5pbmdfZXhwb3J0KCkKICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RyKHJlc3VsdCkKICAgICAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZiJFeHBvcnQgZXJyb3I6IHtlfSIKCiAgICAgICAgICAgIGdyLkJ1dHRvbigi8J+UhCBSZWZyZXNoIFN0YXR1cyIsIHZhcmlhbnQ9InNlY29uZGFyeSIpLmNsaWNrKAogICAgICAgICAgICAgICAgZ2V0X3NjaGVkdWxlcl9zdGF0dXMsIG91dHB1dHM9bG9yYV9zdGF0dXNfYm94CiAgICAgICAgICAgICkKICAgICAgICAgICAgbG9yYV9leHBvcnRfYnRuLmNsaWNrKF9mb3JjZV9sb3JhX2V4cG9ydCwgb3V0cHV0cz1sb3JhX3Jlc3VsdF9ib3gpCgogICAgICAgICMg4pSA4pSAIFRBQiAxMDogQVJDSElURUNUVVJFIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgICAgIHdpdGggZ3IuVGFiKCLihLnvuI8gQXJjaGl0ZWN0dXJlIik6CiAgICAgICAgICAgIGNvbXBsaWFuY2Vfb3V0ID0gZ3IuVGV4dGJveChsYWJlbD0iQ29tcGxpYW5jZSBFeHBvcnQiLCBpbnRlcmFjdGl2ZT1GYWxzZSkKICAgICAgICAgICAgZ3IuQnV0dG9uKCJFeHBvcnQgU09DIDIgRXZpZGVuY2UgU3VtbWFyeSIsIHZhcmlhbnQ9InNlY29uZGFyeSIpLmNsaWNrKAogICAgICAgICAgICAgICAgZXhwb3J0X2NvbXBsaWFuY2VfZGlzcGxheSwgb3V0cHV0cz1jb21wbGlhbmNlX291dAogICAgICAgICAgICApCiAgICAgICAgICAgIGdyLk1hcmtkb3duKGYiIiIKIyMjIFJob2Rhd2sgQUkgdjQuMCDigJQgQ2FwYWJpbGl0eSBTdGFjawoKKipUZW5hbnQ6KiogYHtURU5BTlRfSUR9YCB8ICoqTW9kZWw6KiogYHtNT0RFTH1gCj4gVGFyZ2V0IHJlcG8gaXMgc3VwcGxpZWQgYXQgcnVudGltZSB2aWEgdGhlICoqQXVkaXQgSW5ib3gqKiBjaGF0IGlucHV0IChubyByZXN0YXJ0IHJlcXVpcmVkKS4KCi0tLQoKfCBMYXllciB8IFRlY2hub2xvZ3kgfCBXaGF0IGl0IGRvZXMgfAp8LS0tfC0tLXwtLS18CnwgQUkgQWdlbnQgfCBBaWRlciArIE9wZW5Sb3V0ZXIvUXdlbiB8IEF1dG9ub21vdXMgcGF0Y2ggZ2VuZXJhdGlvbiB8CnwgTUNQIFRvb2xzIHwgZmV0Y2gtZG9jcywgZ2l0aHViLW1hbmFnZXIgfCBEb2N1bWVudGF0aW9uICsgUFIgY3JlYXRpb24gfAp8ICoqVmVyaWZpY2F0aW9uIExvb3AqKiB8IEFueS1sYW5ndWFnZSB0ZXN0IHJlLXJ1biBwZXIgYXR0ZW1wdCB8ICoqQ2xvc2VzIHRoZSBsb29wIOKAlCB0ZXN0cyB0aGUgZml4IGJlZm9yZSBQUioqIHwKfCAqKkFkdmVyc2FyaWFsIFJldmlldyoqIHwgMy1tb2RlbCBjb25jdXJyZW50IGNvbnNlbnN1cyAoUXdlbuKIpUdlbW1h4oilTWlzdHJhbCkgfCAqKk1ham9yaXR5IHZvdGUsIDIvMyB0aHJlc2hvbGQqKiB8CnwgKipGb3JtYWwgVmVyaWZpY2F0aW9uKiogfCBaMyBTTVQgc29sdmVyIChib3VuZHMgKyBkaXYtYnktemVybykgfCAqKk1hdGgtdmVyaWZpZWQgaW50ZWdlciBzYWZldHkqKiB8CnwgKipDb252aWN0aW9uIEVuZ2luZSoqIHwgTXVsdGktY3JpdGVyaWEgdHJ1c3QgZ2F0ZSB8ICoqQXV0by1tZXJnZXMgUFJzIG1lZXRpbmcgYWxsIHNhZmV0eSBjcml0ZXJpYSoqIHwKfCAqKk1lbW9yeSBFbmdpbmUqKiB8IFNRTGl0ZSArIG9wdGlvbmFsIFFkcmFudC9Db2RlQkVSVCB8ICoqQ3Jvc3MtcmVwbyBzZW1hbnRpYyByZXRyaWV2YWwgb2Ygc2ltaWxhciBmaXhlcyoqIHwKfCAqKlN1cHBseSBDaGFpbiBHYXRlKiogfCBwaXAtYXVkaXQgKyB0eXBvc3F1YXR0aW5nICsgUHlQSSBtZXRhZGF0YSB8ICoqQ2F0Y2hlcyBtYWxpY2lvdXMgZGVwZW5kZW5jaWVzIGluIEFJIGRpZmZzKiogfAp8ICoqTG9SQSBTY2hlZHVsZXIqKiB8IFNGVCBKU09OTCBleHBvcnRlciB8ICoqRXhwb3J0cyBwcm9wcmlldGFyeSB0cmFpbmluZyBkYXRhIG9uIHNjaGVkdWxlKiogfAp8ICoqUmVwbyBIYXJ2ZXN0ZXIqKiB8IEdpdEh1YiBzZWFyY2ggKyBmYWlsaW5nIENJIGRldGVjdG9yIHwgKipBdXRvbm9tb3VzIHRhcmdldCBzZWxlY3Rpb24gKGFudGFnb25pc3QgbW9kZSkqKiB8CnwgKipGb3JrLWFuZC1QUiBNb2RlKiogfCBDcm9zcy1yZXBvIFBSIGNyZWF0aW9uIHZpYSBmb3JrIHwgKipGaXggYW55IHB1YmxpYyByZXBvIHdpdGhvdXQgcHVzaCBhY2Nlc3MqKiB8CnwgKipQcm9jZXNzIElzb2xhdGlvbioqIHwgbXVsdGlwcm9jZXNzaW5nLlByb2Nlc3MgcGVyIGpvYiB8ICoqQ3Jhc2gtc2FmZSBwZXItdGVzdCBzdWJwcm9jZXNzIGlzb2xhdGlvbioqIHwKfCBTQVNUIEdhdGUgfCBiYW5kaXQgKyBzZW1ncmVwICsgc2VjcmV0L2luamVjdGlvbiBwYXR0ZXJucyB8IFByZS1QUiBzZWN1cml0eSBzY2FubmluZyB8CnwgQXVkaXQgVHJhaWwgfCBTSEEtMjU2IEpTT05MIGNoYWluIHwgU09DIDIgLyBJU08gMjcwMDEgZXZpZGVuY2UgfAp8IFRyYWluaW5nIFN0b3JlIHwgU1FMaXRlIChmYWlsdXJl4oaSZml44oaSb3V0Y29tZSkgfCBGaW5lLXR1bmluZyBkYXRhc2V0IGFjY3VtdWxhdGlvbiB8CnwgV2ViaG9vayBTZXJ2ZXIgfCBIVFRQIG9uIDo3ODYxICsgSE1BQyArIHJhdGUgbGltaXQgfCBFdmVudC1kcml2ZW4gR2l0SHViL0NJIHRyaWdnZXJzIHwKfCBXb3JrZXIgUG9vbCB8IFRocmVhZFBvb2xFeGVjdXRvciB8IFBhcmFsbGVsIGF1ZGl0IGV4ZWN1dGlvbiB8CnwgTGFuZ3VhZ2UgU3VwcG9ydCB8IFB5dGhvbiAvIEpTIC8gVFMgLyBKYXZhIC8gR28gLyBSdXN0IC8gUnVieSB8IEFueS1sYW5ndWFnZSB0ZXN0IGhlYWxpbmcgfAp8IFNXRS1iZW5jaCBIYXJuZXNzIHwgU1dFLWJlbmNoIFZlcmlmaWVkIHwgcGFzc0AxIGJlbmNobWFya2luZyByZXBvcnRzIHwKfCBOb3RpZmljYXRpb25zIHwgVGVsZWdyYW0gKyBTbGFjayB8IE11bHRpLWNoYW5uZWwgYWxlcnRpbmcgfAp8IFZpcnR1YWxlbnYgfCB1diB8IEJsYXppbmctZmFzdCBpc29sYXRlZCBQeXRob24gZW52IHwKCi0tLQoKIyMjIE5ldyBpbiB2NC4wCgoqKlBlYWsgZW5oYW5jZW1lbnRzOioqCi0gQ29uY3VycmVudCAzLW1vZGVsIGFkdmVyc2FyaWFsIGNvbnNlbnN1cyAoUXdlbuKIpUdlbW1h4oilTWlzdHJhbCwgMi8zIG1ham9yaXR5IHRocmVzaG9sZCkKLSBaMyBTTVQgc29sdmVyIGZvciBib3VuZGVkIGZvcm1hbCB2ZXJpZmljYXRpb24gb2YgaW50ZWdlciBhcml0aG1ldGljIGFuZCBib3VuZHMgaW4gZGlmZnMKLSBRZHJhbnQgKyBDb2RlQkVSVCBlbWJlZGRpbmcgYmFja2VuZCAoc2V0IGBSSE9EQVdLX0VNQkVERElOR19CQUNLRU5EPXFkcmFudGApCi0gQ29udmljdGlvbiBlbmdpbmUg4oCUIGF1dG9ub21vdXMgbWVyZ2Ugd2hlbiBhbGwgdHJ1c3QgY3JpdGVyaWEgYXJlIHNpbXVsdGFuZW91c2x5IHNhdGlzZmllZAotIExvUkEgZmluZS10dW5lIHNjaGVkdWxlciDigJQgYXV0b21hdGljIHRyYWluaW5nIGRhdGEgZXhwb3J0IHdoZW4gdGhyZXNob2xkIHJlYWNoZWQKLSBQcm9jZXNzIGlzb2xhdGlvbiBwZXIgdGVzdCBqb2IgKGBSSE9EQVdLX1BST0NFU1NfSVNPTEFURT10cnVlYCkKCioqQW50YWdvbmlzdCBhZGRpdGlvbnM6KioKLSBSZXBvc2l0b3J5IGhhcnZlc3RlciDigJQgc2NhbnMgR2l0SHViIGZvciBmYWlsaW5nIENJLCBxdWV1ZXMgdGFyZ2V0cyBhdXRvbm9tb3VzbHkKLSBGb3JrLWFuZC1QUiBtb2RlIOKAlCBmaXggYW55IHB1YmxpYyByZXBvLCBubyBwdXNoIGFjY2VzcyByZXF1aXJlZCAoYFJIT0RBV0tfRk9SS19NT0RFPXRydWVgKQotIDI0LzcgY29udGludW91cyBsb29wIHZpYSBoYXJ2ZXN0ZXIgZGlzcGF0Y2gg4oaSIGF1ZGl0IOKGkiBoZWFsIOKGkiBQUiBjeWNsZQotIFB1YmxpYyBsZWFkZXJib2FyZCAoYHB1YmxpY19sZWFkZXJib2FyZC5weWApIOKAlCByZWFsIG51bWJlcnMsIHJlYWwgUFJzLCBubyBmYWtlIG1ldHJpY3MKICAgICAgICAgICAgIiIiKQoKICAgICAgICAjIOKUgOKUgCBUQUIgMTE6IEVUSElDQUwgU0VDVVJJVFkgUkVTRUFSQ0gg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICAgICAgd2l0aCBnci5UYWIoIvCflKwgU2VjdXJpdHkgUmVzZWFyY2giKToKICAgICAgICAgICAgZ3IuTWFya2Rvd24oIiIiCiMjIyBFdGhpY2FsIFNlY3VyaXR5IFJlc2VhcmNoIFBpcGVsaW5lCgpTdGF0aWMgYW5hbHlzaXMg4oaSIEh1bWFuIHJldmlldyDihpIgUmVzcG9uc2libGUgZGlzY2xvc3VyZQoKKipFdmVyeSBzdGFnZSByZXF1aXJlcyBleHBsaWNpdCBvcGVyYXRvciBhcHByb3ZhbC4gTm90aGluZyBpcyBkaXNjbG9zZWQgYXV0b21hdGljYWxseS4qKiAgCkFsbCBQb0MgdGVzdGluZyBpcyBsb2NhbCBhbmQgc2FuZGJveGVkLiBObyBsaXZlIHN5c3RlbXMgYXJlIGF0dGFja2VkLgogICAgICAgICAgICAiIiIpCgogICAgICAgICAgICB3aXRoIGdyLlRhYnMoKToKCiAgICAgICAgICAgICAgICAjIFN0ZXAgMSDigJQgU2VtYW50aWMgQW5hbHlzaXMKICAgICAgICAgICAgICAgIHdpdGggZ3IuVGFiKCIxLiBTZW1hbnRpYyBBbmFseXNpcyIpOgogICAgICAgICAgICAgICAgICAgIGdyLk1hcmtkb3duKAogICAgICAgICAgICAgICAgICAgICAgICAiKipTdGF0aWMgYW5hbHlzaXMgb25seSDigJQgbm8gY29kZSBleGVjdXRlZC4qKiAiCiAgICAgICAgICAgICAgICAgICAgICAgICJIZXJtZXMgbWFwcyB0aGUgcmVwbydzIHRydXN0IHN0YXRlIG1hY2hpbmUgYW5kIGlkZW50aWZpZXMgYXNzdW1wdGlvbiBnYXBzLiIKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgc3JfcmVwbyA9IGdyLlRleHRib3goCiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsPSJPcGVuLXNvdXJjZSByZXBvc2l0b3J5IChvd25lci9yZXBvKSIsCiAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPSJlLmcuIHBzZi9yZXF1ZXN0cyAgb3IgIHBhbGxldHMvZmxhc2siLAogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICBzcl9hbmFseXplX2J0biA9IGdyLkJ1dHRvbigi8J+UjSBSdW4gU2VtYW50aWMgQW5hbHlzaXMiLCB2YXJpYW50PSJwcmltYXJ5IikKICAgICAgICAgICAgICAgICAgICBzcl9zdW1tYXJ5ID0gZ3IuVGV4dGJveChsYWJlbD0iU3VtbWFyeSIsIGludGVyYWN0aXZlPUZhbHNlLCBsaW5lcz02KQogICAgICAgICAgICAgICAgICAgIHNyX2dyYXBoICAgPSBnci5UZXh0QXJlYShsYWJlbD0iU3RhdGUgTWFjaGluZSBHcmFwaCArIEFzc3VtcHRpb24gR2FwcyAoSlNPTikiLCBsaW5lcz0yMiwgaW50ZXJhY3RpdmU9RmFsc2UpCiAgICAgICAgICAgICAgICAgICAgc3JfYW5hbHl6ZV9idG4uY2xpY2soCiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bl9zZW1hbnRpY19hbmFseXNpcywKICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRzPXNyX3JlcG8sCiAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dHM9W3NyX3N1bW1hcnksIHNyX2dyYXBoXSwKICAgICAgICAgICAgICAgICAgICApCgogICAgICAgICAgICAgICAgIyBTdGVwIDIg4oCUIEhhcm5lc3MgR2VuZXJhdGlvbgogICAgICAgICAgICAgICAgd2l0aCBnci5UYWIoIjIuIEdlbmVyYXRlIFBvQyAoUmV2aWV3IE9ubHkpIik6CiAgICAgICAgICAgICAgICAgICAgZ3IuTWFya2Rvd24oCiAgICAgICAgICAgICAgICAgICAgICAgICJQYXN0ZSBhIHNpbmdsZSBhc3N1bXB0aW9uIGdhcCBKU09OIGZyb20gU3RlcCAxLiAiCiAgICAgICAgICAgICAgICAgICAgICAgICJIZXJtZXMgZ2VuZXJhdGVzIGEgbWluaW1hbCBQb0MgaGFybmVzcyAqKmZvciB5b3VyIHJldmlldyoqLiAiCiAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgaGFybmVzcyBpcyBOT1QgZXhlY3V0ZWQgaGVyZS4iCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIHNyX2dhcF9pbnB1dCAgPSBnci5UZXh0QXJlYShsYWJlbD0iQXNzdW1wdGlvbiBHYXAgSlNPTiIsIGxpbmVzPTEwKQogICAgICAgICAgICAgICAgICAgIHNyX3JlcG8yICAgICAgPSBnci5UZXh0Ym94KGxhYmVsPSJSZXBvc2l0b3J5IChvd25lci9yZXBvKSIpCiAgICAgICAgICAgICAgICAgICAgc3JfZ2VuX2J0biAgICA9IGdyLkJ1dHRvbigi4pqZ77iPIEdlbmVyYXRlIEhhcm5lc3MgZm9yIFJldmlldyIsIHZhcmlhbnQ9InNlY29uZGFyeSIpCiAgICAgICAgICAgICAgICAgICAgc3JfaGFybmVzcyAgICA9IGdyLlRleHRBcmVhKAogICAgICAgICAgICAgICAgICAgICAgICBsYWJlbD0iR2VuZXJhdGVkIEhhcm5lc3Mg4oCUIFJFQUQgQ0FSRUZVTExZIEJFRk9SRSBQUk9DRUVESU5HIiwKICAgICAgICAgICAgICAgICAgICAgICAgbGluZXM9MjIsIGludGVyYWN0aXZlPVRydWUsCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIHNyX2dlbl9idG4uY2xpY2soCiAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlX2hhcm5lc3NfZm9yX3JldmlldywKICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRzPVtzcl9nYXBfaW5wdXQsIHNyX3JlcG8yXSwKICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0cz1zcl9oYXJuZXNzLAogICAgICAgICAgICAgICAgICAgICkKCiAgICAgICAgICAgICAgICAjIFN0ZXAgMyDigJQgU2FuZGJveCBFeGVjdXRpb24KICAgICAgICAgICAgICAgIHdpdGggZ3IuVGFiKCIzLiBTYW5kYm94IEV4ZWN1dGlvbiAoT3BlcmF0b3IgQXBwcm92ZWQpIik6CiAgICAgICAgICAgICAgICAgICAgZ3IuTWFya2Rvd24oIiIiCioqQnkgY2xpY2tpbmcgRXhlY3V0ZSB5b3UgY29uZmlybToqKgotIFlvdSBoYXZlIHJlYWQgZXZlcnkgbGluZSBvZiB0aGUgaGFybmVzcyBhYm92ZQotIFlvdSBhdXRob3Jpc2UgbG9jYWwgc2FuZGJveCBleGVjdXRpb24gb25seQotIE5vIG5ldHdvcmsgY29ubmVjdGlvbnMgd2lsbCBiZSBtYWRlCi0gRXhlY3V0aW9uIGlzIHRpbWUtbGltaXRlZCB0byAzMCBzZWNvbmRzCiAgICAgICAgICAgICAgICAgICAgIiIiKQogICAgICAgICAgICAgICAgICAgIHNyX2V4ZWNfY29kZSA9IGdyLlRleHRBcmVhKGxhYmVsPSJIYXJuZXNzIENvZGUgKHJldmlld2VkIGJ5IG9wZXJhdG9yKSIsIGxpbmVzPTE1KQogICAgICAgICAgICAgICAgICAgIHdpdGggZ3IuUm93KCk6CiAgICAgICAgICAgICAgICAgICAgICAgIHNyX2V4ZWNfcmVwbyA9IGdyLlRleHRib3gobGFiZWw9IlJlcG9zaXRvcnkgKG93bmVyL3JlcG8pIiwgc2NhbGU9MykKICAgICAgICAgICAgICAgICAgICAgICAgc3JfZXhlY192ZW52ID0gZ3IuVGV4dGJveChsYWJlbD0iVmVudiBwYXRoIiwgdmFsdWU9Ii9kYXRhL3RhcmdldF92ZW52Iiwgc2NhbGU9MikKICAgICAgICAgICAgICAgICAgICBzcl9leGVjX2J0biAgPSBnci5CdXR0b24oIvCfmoAgRXhlY3V0ZSBpbiBTYW5kYm94IChJIGhhdmUgcmV2aWV3ZWQgdGhpcyBjb2RlKSIsIHZhcmlhbnQ9InByaW1hcnkiKQogICAgICAgICAgICAgICAgICAgIHNyX2V4ZWNfb3V0ICA9IGdyLlRleHRBcmVhKGxhYmVsPSJTYW5kYm94IFJlc3VsdCIsIGxpbmVzPTEyLCBpbnRlcmFjdGl2ZT1GYWxzZSkKICAgICAgICAgICAgICAgICAgICBzcl9leGVjX2J0bi5jbGljaygKICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZV9hcHByb3ZlZF9oYXJuZXNzLAogICAgICAgICAgICAgICAgICAgICAgICBpbnB1dHM9W3NyX2V4ZWNfY29kZSwgc3JfZXhlY19yZXBvLCBzcl9leGVjX3ZlbnZdLAogICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRzPXNyX2V4ZWNfb3V0LAogICAgICAgICAgICAgICAgICAgICkKCiAgICAgICAgICAgICAgICAjIFN0ZXAgNCDigJQgU3RvcmUgJiBDaGFpbiBBbmFseXNpcwogICAgICAgICAgICAgICAgd2l0aCBnci5UYWIoIjQuIENoYWluIEFuYWx5c2lzIik6CiAgICAgICAgICAgICAgICAgICAgZ3IuTWFya2Rvd24oCiAgICAgICAgICAgICAgICAgICAgICAgICJTdG9yZSBwcmltaXRpdmUgZmluZGluZ3MsIHRoZW4gYXNrIEhlcm1lcyB0byBwcm9wb3NlIHRoZW9yZXRpY2FsIGNoYWlucy4gIgogICAgICAgICAgICAgICAgICAgICAgICAiQWxsIGNoYWluIHByb3Bvc2FscyBhcmUgdGFnZ2VkIFBFTkRJTkdfSFVNQU5fUkVWSUVXLiIKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgd2l0aCBnci5Sb3coKToKICAgICAgICAgICAgICAgICAgICAgICAgc3JfcHJpbV9yZXBvICA9IGdyLlRleHRib3gobGFiZWw9IlJlcG9zaXRvcnkiLCBzY2FsZT0yKQogICAgICAgICAgICAgICAgICAgICAgICBzcl9wcmltX2dhcGlkID0gZ3IuVGV4dGJveChsYWJlbD0iR2FwIElEIiwgc2NhbGU9MSkKICAgICAgICAgICAgICAgICAgICAgICAgc3JfcHJpbV9zZXYgICA9IGdyLlRleHRib3gobGFiZWw9IlNldmVyaXR5IiwgdmFsdWU9IlAyIiwgc2NhbGU9MSkKICAgICAgICAgICAgICAgICAgICBzcl9wcmltX2Rlc2MgICAgPSBnci5UZXh0Ym94KGxhYmVsPSJEZXNjcmlwdGlvbiIsIGxpbmVzPTIpCiAgICAgICAgICAgICAgICAgICAgc3JfcHJpbV9zYW5kYm94ID0gZ3IuVGV4dEFyZWEobGFiZWw9IlNhbmRib3ggT3V0cHV0IChmcm9tIFN0ZXAgMykiLCBsaW5lcz01KQogICAgICAgICAgICAgICAgICAgIHNyX3N0b3JlX2J0biAgICA9IGdyLkJ1dHRvbigi8J+SviBTdG9yZSBQcmltaXRpdmUgRmluZGluZyIsIHZhcmlhbnQ9InNlY29uZGFyeSIpCiAgICAgICAgICAgICAgICAgICAgc3Jfc3RvcmVfb3V0ICAgID0gZ3IuVGV4dGJveChsYWJlbD0iIiwgaW50ZXJhY3RpdmU9RmFsc2UpCiAgICAgICAgICAgICAgICAgICAgc3Jfc3RvcmVfYnRuLmNsaWNrKAogICAgICAgICAgICAgICAgICAgICAgICBzdG9yZV9wcmltaXRpdmVfZmluZGluZywKICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRzPVtzcl9wcmltX3JlcG8sIHNyX3ByaW1fZ2FwaWQsIHNyX3ByaW1fc2V2LCBzcl9wcmltX2Rlc2MsIHNyX3ByaW1fZ2FwaWQsIHNyX3ByaW1fc2FuZGJveF0sCiAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dHM9c3Jfc3RvcmVfb3V0LAogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICBnci5IVE1MKCI8aHIvPiIpCiAgICAgICAgICAgICAgICAgICAgc3JfY2hhaW5fcmVwbyA9IGdyLlRleHRib3gobGFiZWw9IlJlcG9zaXRvcnkgZm9yIGNoYWluIGFuYWx5c2lzIChsZWF2ZSBibGFuayBmb3IgYWxsKSIpCiAgICAgICAgICAgICAgICAgICAgc3JfY2hhaW5fYnRuICA9IGdyLkJ1dHRvbigi8J+UlyBBbmFseXNlIENoYWlucyIsIHZhcmlhbnQ9InNlY29uZGFyeSIpCiAgICAgICAgICAgICAgICAgICAgc3JfY2hhaW5fb3V0ICA9IGdyLlRleHRBcmVhKGxhYmVsPSJQcm9wb3NlZCBDaGFpbnMgKFBFTkRJTkcgSFVNQU4gUkVWSUVXKSIsIGxpbmVzPTE0LCBpbnRlcmFjdGl2ZT1GYWxzZSkKICAgICAgICAgICAgICAgICAgICBzcl9jaGFpbl9idG4uY2xpY2socnVuX2NoYWluX2FuYWx5c2lzLCBpbnB1dHM9c3JfY2hhaW5fcmVwbywgb3V0cHV0cz1zcl9jaGFpbl9vdXQpCgogICAgICAgICAgICAgICAgIyBTdGVwIDUg4oCUIERpc2Nsb3N1cmUgVmF1bHQKICAgICAgICAgICAgICAgIHdpdGggZ3IuVGFiKCI1LiBEaXNjbG9zdXJlIFZhdWx0Iik6CiAgICAgICAgICAgICAgICAgICAgZ3IuTWFya2Rvd24oIiIiCioqSHVtYW4gYXBwcm92YWwgaXMgbWFuZGF0b3J5IGJlZm9yZSBhbnkgZGlzY2xvc3VyZSBpcyBzZW50LioqICAKQXBwcm92ZWQgZGlzY2xvc3VyZXMgZ2VuZXJhdGUgYSBtZXNzYWdlIHlvdSBzZW5kIG1hbnVhbGx5IHZpYSB0aGUgbWFpbnRhaW5lcidzIHNlY3VyaXR5IHBvbGljeS4KICAgICAgICAgICAgICAgICAgICAiIiIpCiAgICAgICAgICAgICAgICAgICAgd2l0aCBnci5Sb3coKToKICAgICAgICAgICAgICAgICAgICAgICAgc3JfdmF1bHRfcmVwbyAgID0gZ3IuVGV4dGJveChsYWJlbD0iUmVwb3NpdG9yeSAob3duZXIvcmVwbykiLCBzY2FsZT0zKQogICAgICAgICAgICAgICAgICAgICAgICBzcl92YXVsdF9ib3VudHkgPSBnci5UZXh0Ym94KGxhYmVsPSJCdWcgYm91bnR5IHByb2dyYW1tZSBVUkwiLCBzY2FsZT0yKQogICAgICAgICAgICAgICAgICAgIHNyX3ZhdWx0X2dhcCAgPSBnci5UZXh0QXJlYShsYWJlbD0iQXNzdW1wdGlvbiBHYXAgSlNPTiIsIGxpbmVzPTYpCiAgICAgICAgICAgICAgICAgICAgc3JfdmF1bHRfcG9jICA9IGdyLlRleHRBcmVhKGxhYmVsPSJTYW5kYm94IG91dHB1dCBmcm9tIFN0ZXAgMyIsIGxpbmVzPTQpCiAgICAgICAgICAgICAgICAgICAgc3JfY29tcGlsZV9idG4gPSBnci5CdXR0b24oIvCfk4sgQ29tcGlsZSBEaXNjbG9zdXJlIERvc3NpZXIiLCB2YXJpYW50PSJzZWNvbmRhcnkiKQogICAgICAgICAgICAgICAgICAgIHNyX2NvbXBpbGVfb3V0ID0gZ3IuVGV4dGJveChsYWJlbD0iIiwgaW50ZXJhY3RpdmU9RmFsc2UpCiAgICAgICAgICAgICAgICAgICAgc3JfY29tcGlsZV9idG4uY2xpY2soCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBpbGVfZG9zc2llcl9mbiwKICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRzPVtzcl92YXVsdF9yZXBvLCBzcl92YXVsdF9nYXAsIHNyX3ZhdWx0X3BvYywgc3JfdmF1bHRfYm91bnR5XSwKICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0cz1zcl9jb21waWxlX291dCwKICAgICAgICAgICAgICAgICAgICApCgogICAgICAgICAgICAgICAgICAgIGdyLkhUTUwoIjxoci8+IikKICAgICAgICAgICAgICAgICAgICBnci5CdXR0b24oIvCflIQgUmVmcmVzaCBWYXVsdCIsIHZhcmlhbnQ9InNlY29uZGFyeSIpLmNsaWNrKAogICAgICAgICAgICAgICAgICAgICAgICBnZXRfdmF1bHRfZGlzcGxheSwgb3V0cHV0cz1nci5UZXh0QXJlYShsYWJlbD0iQWxsIERpc2Nsb3N1cmVzIiwgbGluZXM9MTAsIGludGVyYWN0aXZlPUZhbHNlKQogICAgICAgICAgICAgICAgICAgICkKCiAgICAgICAgICAgICAgICAgICAgZ3IuSFRNTCgiPGhyLz4iKQogICAgICAgICAgICAgICAgICAgIHNyX2RpZCAgICAgICA9IGdyLlRleHRib3gobGFiZWw9IkRpc2Nsb3N1cmUgSUQiKQogICAgICAgICAgICAgICAgICAgIHNyX3JlYWRfYnRuICA9IGdyLkJ1dHRvbigi8J+ThCBSZWFkIEZ1bGwgRG9zc2llciIsIHZhcmlhbnQ9InNlY29uZGFyeSIpCiAgICAgICAgICAgICAgICAgICAgc3JfZG9zc2llciAgID0gZ3IuVGV4dEFyZWEobGFiZWw9IkRvc3NpZXIgKHJlYWQgYmVmb3JlIGFwcHJvdmluZykiLCBsaW5lcz0yNCwgaW50ZXJhY3RpdmU9RmFsc2UpCiAgICAgICAgICAgICAgICAgICAgc3JfcmVhZF9idG4uY2xpY2socmVhZF9kb3NzaWVyX2ZuLCBpbnB1dHM9c3JfZGlkLCBvdXRwdXRzPXNyX2Rvc3NpZXIpCgogICAgICAgICAgICAgICAgICAgIGdyLkhUTUwoIjxoci8+IikKICAgICAgICAgICAgICAgICAgICBzcl9hcHByb3ZlciAgPSBnci5UZXh0Ym94KGxhYmVsPSJZb3VyIG5hbWUgKGFwcHJvdmFsIHJlY29yZCkiKQogICAgICAgICAgICAgICAgICAgIHdpdGggZ3IuUm93KCk6CiAgICAgICAgICAgICAgICAgICAgICAgIHNyX2FwcHJvdmVfYnRuID0gZ3IuQnV0dG9uKCLinIUgQXBwcm92ZSAmIFByZXBhcmUgRGlzY2xvc3VyZSBNZXNzYWdlIiwgdmFyaWFudD0icHJpbWFyeSIpCiAgICAgICAgICAgICAgICAgICAgICAgIHNyX3JlamVjdF9idG4gID0gZ3IuQnV0dG9uKCLinYwgUmVqZWN0ICYgQXJjaGl2ZSIsIHZhcmlhbnQ9InNlY29uZGFyeSIpCiAgICAgICAgICAgICAgICAgICAgc3JfYXBwcm92YWxfb3V0ID0gZ3IuVGV4dEFyZWEobGFiZWw9IlJlc3VsdCAvIERpc2Nsb3N1cmUgTWVzc2FnZSAoc2VuZCBtYW51YWxseSkiLCBsaW5lcz0xNCwgaW50ZXJhY3RpdmU9RmFsc2UpCiAgICAgICAgICAgICAgICAgICAgc3JfYXBwcm92ZV9idG4uY2xpY2soCiAgICAgICAgICAgICAgICAgICAgICAgIGFwcHJvdmVfYW5kX3ByZXBhcmVfbXNnLAogICAgICAgICAgICAgICAgICAgICAgICBpbnB1dHM9W3NyX2RpZCwgc3JfYXBwcm92ZXJdLAogICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRzPXNyX2FwcHJvdmFsX291dCwKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgc3JfcmVqZWN0X2J0bi5jbGljayhyZWplY3RfZGlzY2xvc3VyZV9mbiwgaW5wdXRzPXNyX2RpZCwgb3V0cHV0cz1zcl9hcHByb3ZhbF9vdXQpCgogICAgICAgICMg4pSA4pSAIEhFUk1FUyBBSSBTRUNVUklUWSBSRVNFQVJDSEVSIFRBQiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgICAgICB3aXRoIGdyLlRhYigi8J+noCBIZXJtZXMgWmVyby1EYXkiKToKICAgICAgICAgICAgZ3IuTWFya2Rvd24oIiIiCiMgSGVybWVzIOKAlCBBdXRvbm9tb3VzIFplcm8tRGF5IFJlc2VhcmNoIEVuZ2luZQoKSGVybWVzIGlzIHlvdXIgQUkgc2VjdXJpdHkgcmVzZWFyY2hlci4gUG9pbnQgaXQgYXQgYW55IG9wZW4gc291cmNlIHByb2plY3QgYW5kIGl0IHdpbGw6Ci0gKipNYXAgdGhlIGF0dGFjayBzdXJmYWNlKiogKGVudHJ5IHBvaW50cywgZGFuZ2Vyb3VzIHNpbmtzLCBzZWN1cml0eS1jcml0aWNhbCBmaWxlcykKLSAqKlJ1biB0YWludCBhbmFseXNpcyoqIHRvIHRyYWNlIHVudHJ1c3RlZCBpbnB1dCB0byBkYW5nZXJvdXMgc2lua3MKLSAqKlBlcmZvcm0gc3ltYm9saWMgZXhlY3V0aW9uKiogdG8gZmluZCB1bmNoZWNrZWQgY29kZSBwYXRocwotICoqR2VuZXJhdGUgYW5kIHJ1biBmdXp6IGNhbXBhaWducyoqIHRvIGZpbmQgY3Jhc2hlcwotICoqUmVhc29uIGFib3V0IGV4cGxvaXRhYmlsaXR5KiogKENWU1MsIFBvQyBnZW5lcmF0aW9uKQotICoqU2NvcmUgZmluZGluZ3MqKiB3aXRoIFZFUyAoVnVsbmVyYWJpbGl0eSBFbnRyb3B5IFNjb3JlKSArIEFDVFMgKEFkdmVyc2FyaWFsIENvbnNlbnN1cykKCioqQUxMIGZpbmRpbmdzIHJlcXVpcmUgaHVtYW4gYXBwcm92YWwgYmVmb3JlIGFueSBkaXNjbG9zdXJlIGlzIHNlbnQuKioKIiIiKQogICAgICAgICAgICB3aXRoIGdyLlRhYnMoKToKICAgICAgICAgICAgICAgIHdpdGggZ3IuVGFiKCLwn5qAIExhdW5jaCBSZXNlYXJjaCIpOgogICAgICAgICAgICAgICAgICAgIGdyLk1hcmtkb3duKCIjIyMgU3RhcnQgYW4gYXV0b25vbW91cyBzZWN1cml0eSByZXNlYXJjaCBzZXNzaW9uIikKICAgICAgICAgICAgICAgICAgICB3aXRoIGdyLlJvdygpOgogICAgICAgICAgICAgICAgICAgICAgICBoZXJtZXNfcmVwbyAgICAgPSBnci5UZXh0Ym94KGxhYmVsPSJUYXJnZXQgUmVwb3NpdG9yeSAob3duZXIvcmVwbykiLCBwbGFjZWhvbGRlcj0idG9ydmFsZHMvbGludXgiLCBzY2FsZT0yKQogICAgICAgICAgICAgICAgICAgICAgICBoZXJtZXNfcGF0aCAgICAgPSBnci5UZXh0Ym94KGxhYmVsPSJMb2NhbCBDbG9uZSBQYXRoIiwgcGxhY2Vob2xkZXI9Ii9kYXRhL3JlcG8vbGludXgiLCBzY2FsZT0yKQogICAgICAgICAgICAgICAgICAgIGhlcm1lc19mb2N1cyAgICA9IGdyLlRleHRib3goCiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsPSJGb2N1cyBBcmVhIChvcHRpb25hbCkiLAogICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj0ibWVtb3J5IG1hbmFnZW1lbnQgc3Vic3lzdGVtLCBhdXRoZW50aWNhdGlvbiBtaWRkbGV3YXJlLCBjcnlwdG8gcHJpbWl0aXZlcy4uLiIsCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIHdpdGggZ3IuUm93KCk6CiAgICAgICAgICAgICAgICAgICAgICAgIGhlcm1lc19tYXhfaXRlciA9IGdyLlNsaWRlcihtaW5pbXVtPTUsIG1heGltdW09MzAsIHZhbHVlPTE1LCBzdGVwPTEsIGxhYmVsPSJNYXggUmVzZWFyY2ggSXRlcmF0aW9ucyIpCiAgICAgICAgICAgICAgICAgICAgICAgIGhlcm1lc19sYXVuY2ggICA9IGdyLkJ1dHRvbigi8J+noCBMYXVuY2ggSGVybWVzIiwgdmFyaWFudD0icHJpbWFyeSIsIHNjYWxlPTEpCiAgICAgICAgICAgICAgICAgICAgaGVybWVzX2xhdW5jaF9vdXQgPSBnci5UZXh0Ym94KGxhYmVsPSJTdGF0dXMiLCBpbnRlcmFjdGl2ZT1GYWxzZSwgbGluZXM9NSkKICAgICAgICAgICAgICAgICAgICBoZXJtZXNfbGF1bmNoLmNsaWNrKAogICAgICAgICAgICAgICAgICAgICAgICBoZXJtZXNfc3RhcnRfcmVzZWFyY2gsCiAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0cz1baGVybWVzX3JlcG8sIGhlcm1lc19wYXRoLCBoZXJtZXNfZm9jdXMsIGhlcm1lc19tYXhfaXRlcl0sCiAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dHM9aGVybWVzX2xhdW5jaF9vdXQsCiAgICAgICAgICAgICAgICAgICAgKQoKICAgICAgICAgICAgICAgIHdpdGggZ3IuVGFiKCLwn5OhIExpdmUgUmVzZWFyY2ggTG9ncyIpOgogICAgICAgICAgICAgICAgICAgIGhlcm1lc19saXZlX2xvZ3MgPSBnci5UZXh0QXJlYSgKICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw9Ikhlcm1lcyBSZXNlYXJjaCBMb2cgKGF1dG8tcmVmcmVzaGVzKSIsCiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVzPTMwLCBpbnRlcmFjdGl2ZT1GYWxzZSwKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgZ3IuQnV0dG9uKCLwn5SEIFJlZnJlc2ggTG9ncyIsIHZhcmlhbnQ9InNlY29uZGFyeSIpLmNsaWNrKAogICAgICAgICAgICAgICAgICAgICAgICBoZXJtZXNfZ2V0X2xpdmVfbG9ncywgb3V0cHV0cz1oZXJtZXNfbGl2ZV9sb2dzCiAgICAgICAgICAgICAgICAgICAgKQoKICAgICAgICAgICAgICAgIHdpdGggZ3IuVGFiKCLwn5OKIFNlc3Npb24gU3VtbWFyeSIpOgogICAgICAgICAgICAgICAgICAgIGhlcm1lc19zdW1tYXJ5X291dCA9IGdyLlRleHRBcmVhKGxhYmVsPSJMYXN0IFNlc3Npb24gU3VtbWFyeSIsIGxpbmVzPTI1LCBpbnRlcmFjdGl2ZT1GYWxzZSkKICAgICAgICAgICAgICAgICAgICBnci5CdXR0b24oIvCfk4ogR2V0IFN1bW1hcnkiLCB2YXJpYW50PSJzZWNvbmRhcnkiKS5jbGljaygKICAgICAgICAgICAgICAgICAgICAgICAgaGVybWVzX2dldF9zZXNzaW9uX3N1bW1hcnksIG91dHB1dHM9aGVybWVzX3N1bW1hcnlfb3V0CiAgICAgICAgICAgICAgICAgICAgKQoKICAgICAgICAgICAgICAgIHdpdGggZ3IuVGFiKCLwn5SSIERpc2Nsb3N1cmUgUGlwZWxpbmUiKToKICAgICAgICAgICAgICAgICAgICBnci5NYXJrZG93bigiIiIKIyMjIEh1bWFuLUFwcHJvdmFsIEdhdGUKCkFsbCBmaW5kaW5ncyBzaXQgaGVyZSBhcyAqKlBFTkRJTkdfSFVNQU5fQVBQUk9WQUwqKiB1bnRpbCB5b3UgZXhwbGljaXRseSBhcHByb3ZlIHRoZW0uCkhlcm1lcyBuZXZlciBhdXRvLXN1Ym1pdHMuIFlvdSByZXZpZXcsIHRoZW4gYXBwcm92ZSBvciByZWplY3QgZWFjaCBmaW5kaW5nIGluZGl2aWR1YWxseS4KQWZ0ZXIgYXBwcm92YWwsIHlvdSBjYW4gc3VibWl0IHRvIEhhY2tlck9uZSBvciBjcmVhdGUgYSBHaXRIdWIgU2VjdXJpdHkgQWR2aXNvcnkuCgoqKjkwLWRheSBkaXNjbG9zdXJlIGNvdW50ZG93biBzdGFydHMgb24gYXBwcm92YWwuKioKIiIiKQogICAgICAgICAgICAgICAgICAgIGhlcm1lc19waXBlbGluZV9vdXQgPSBnci5UZXh0QXJlYShsYWJlbD0iUGlwZWxpbmUgU3RhdHVzIiwgbGluZXM9MTIsIGludGVyYWN0aXZlPUZhbHNlKQogICAgICAgICAgICAgICAgICAgIGdyLkJ1dHRvbigi8J+UhCBSZWZyZXNoIFBpcGVsaW5lIiwgdmFyaWFudD0ic2Vjb25kYXJ5IikuY2xpY2soCiAgICAgICAgICAgICAgICAgICAgICAgIGhlcm1lc19nZXRfcGlwZWxpbmVfZGlzcGxheSwgb3V0cHV0cz1oZXJtZXNfcGlwZWxpbmVfb3V0CiAgICAgICAgICAgICAgICAgICAgKQoKICAgICAgICAgICAgICAgICAgICBnci5IVE1MKCI8aHIvPiIpCiAgICAgICAgICAgICAgICAgICAgZ3IuTWFya2Rvd24oIiMjIyMgUmV2aWV3ICYgQXBwcm92ZS9SZWplY3QgYSBGaW5kaW5nIikKICAgICAgICAgICAgICAgICAgICB3aXRoIGdyLlJvdygpOgogICAgICAgICAgICAgICAgICAgICAgICBoZXJtZXNfcmVjb3JkX2lkID0gZ3IuVGV4dGJveChsYWJlbD0iUmVjb3JkIElEIiwgc2NhbGU9MikKICAgICAgICAgICAgICAgICAgICAgICAgaGVybWVzX25vdGVzICAgICA9IGdyLlRleHRib3gobGFiZWw9IkFuYWx5c3QgTm90ZXMiLCBzY2FsZT0zKQogICAgICAgICAgICAgICAgICAgIHdpdGggZ3IuUm93KCk6CiAgICAgICAgICAgICAgICAgICAgICAgIGhlcm1lc19hcHByb3ZlX2J0biA9IGdyLkJ1dHRvbigi4pyFIEFwcHJvdmUgRmluZGluZyIsIHZhcmlhbnQ9InByaW1hcnkiKQogICAgICAgICAgICAgICAgICAgICAgICBoZXJtZXNfcmVqZWN0X2J0biAgPSBnci5CdXR0b24oIuKdjCBSZWplY3QgRmluZGluZyIsIHZhcmlhbnQ9InNlY29uZGFyeSIpCiAgICAgICAgICAgICAgICAgICAgaGVybWVzX2FwcHJvdmFsX291dCA9IGdyLlRleHRib3gobGFiZWw9IlJlc3VsdCIsIGludGVyYWN0aXZlPUZhbHNlKQogICAgICAgICAgICAgICAgICAgIGhlcm1lc19hcHByb3ZlX2J0bi5jbGljaygKICAgICAgICAgICAgICAgICAgICAgICAgaGVybWVzX2FwcHJvdmVfZmluZGluZywKICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRzPVtoZXJtZXNfcmVjb3JkX2lkLCBoZXJtZXNfbm90ZXNdLAogICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRzPWhlcm1lc19hcHByb3ZhbF9vdXQsCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIGhlcm1lc19yZWplY3RfYnRuLmNsaWNrKAogICAgICAgICAgICAgICAgICAgICAgICBoZXJtZXNfcmVqZWN0X2ZpbmRpbmcsCiAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0cz1baGVybWVzX3JlY29yZF9pZCwgaGVybWVzX25vdGVzXSwKICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0cz1oZXJtZXNfYXBwcm92YWxfb3V0LAogICAgICAgICAgICAgICAgICAgICkKCiAgICAgICAgICAgICAgICAgICAgZ3IuSFRNTCgiPGhyLz4iKQogICAgICAgICAgICAgICAgICAgIGdyLk1hcmtkb3duKCIjIyMjIFN1Ym1pdCBBcHByb3ZlZCBGaW5kaW5nIChyZXF1aXJlcyBjcmVkZW50aWFscyBpbiBlbnYgdmFycykiKQogICAgICAgICAgICAgICAgICAgIHdpdGggZ3IuUm93KCk6CiAgICAgICAgICAgICAgICAgICAgICAgIGhlcm1lc19zdWJtaXRfcmVjb3JkID0gZ3IuVGV4dGJveChsYWJlbD0iQXBwcm92ZWQgUmVjb3JkIElEIiwgc2NhbGU9MikKICAgICAgICAgICAgICAgICAgICAgICAgaGVybWVzX2doX3JlcG8gICAgICAgPSBnci5UZXh0Ym94KGxhYmVsPSJHaXRIdWIgb3duZXIvcmVwbyAoZm9yIEdIU0EpIiwgcGxhY2Vob2xkZXI9InRvcnZhbGRzL2xpbnV4Iiwgc2NhbGU9MikKICAgICAgICAgICAgICAgICAgICB3aXRoIGdyLlJvdygpOgogICAgICAgICAgICAgICAgICAgICAgICBoZXJtZXNfaDFfYnRuICA9IGdyLkJ1dHRvbigi8J+OryBTdWJtaXQgdG8gSGFja2VyT25lIiwgdmFyaWFudD0icHJpbWFyeSIpCiAgICAgICAgICAgICAgICAgICAgICAgIGhlcm1lc19naF9idG4gID0gZ3IuQnV0dG9uKCLwn5CZIENyZWF0ZSBHaXRIdWIgQWR2aXNvcnkiLCB2YXJpYW50PSJzZWNvbmRhcnkiKQogICAgICAgICAgICAgICAgICAgIGhlcm1lc19zdWJtaXRfb3V0ID0gZ3IuVGV4dGJveChsYWJlbD0iU3VibWlzc2lvbiBSZXN1bHQiLCBpbnRlcmFjdGl2ZT1GYWxzZSkKICAgICAgICAgICAgICAgICAgICBoZXJtZXNfaDFfYnRuLmNsaWNrKAogICAgICAgICAgICAgICAgICAgICAgICBoZXJtZXNfc3VibWl0X2hhY2tlcm9uZSwKICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRzPVtoZXJtZXNfc3VibWl0X3JlY29yZF0sCiAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dHM9aGVybWVzX3N1Ym1pdF9vdXQsCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIGhlcm1lc19naF9idG4uY2xpY2soCiAgICAgICAgICAgICAgICAgICAgICAgIGhlcm1lc19zdWJtaXRfZ2l0aHViLAogICAgICAgICAgICAgICAgICAgICAgICBpbnB1dHM9W2hlcm1lc19zdWJtaXRfcmVjb3JkLCBoZXJtZXNfZ2hfcmVwb10sCiAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dHM9aGVybWVzX3N1Ym1pdF9vdXQsCiAgICAgICAgICAgICAgICAgICAgKQoKICAgICAgICAgICAgICAgIHdpdGggZ3IuVGFiKCLwn5OaIENXRSBSZWZlcmVuY2UiKToKICAgICAgICAgICAgICAgICAgICBnci5NYXJrZG93bigiIyMjIENXRSBUYXhvbm9teSDigJQgQ292ZXJhZ2UgTWFwIikKICAgICAgICAgICAgICAgICAgICBjd2VfdGFibGVfZGF0YSA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgW2NbImN3ZV9pZCJdLCBjWyJuYW1lIl0sIGNbImNhdGVnb3J5Il0sIGNbInNldmVyaXR5Il0sCiAgICAgICAgICAgICAgICAgICAgICAgICBzdHIoY1siY3Zzc19iYXNlIl0pLCBjLmdldCgib3dhc3AiLCAiIildCiAgICAgICAgICAgICAgICAgICAgICAgIGZvciBjIGluIGdldF9hbGxfY3dlcygpCiAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgIGdyLkRhdGFmcmFtZSgKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9Y3dlX3RhYmxlX2RhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM9WyJDV0UgSUQiLCAiTmFtZSIsICJDYXRlZ29yeSIsICJTZXZlcml0eSIsICJDVlNTIiwgIk9XQVNQIl0sCiAgICAgICAgICAgICAgICAgICAgICAgIGludGVyYWN0aXZlPUZhbHNlLAogICAgICAgICAgICAgICAgICAgICkKCiAgICAjIOKUgOKUgCBBVVRPLVJFRlJFU0gg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICB0aW1lciA9IGdyLlRpbWVyKDMpCiAgICB0aW1lci50aWNrKGdldF9saXZlX2xvZ3MsICAgICAgIG91dHB1dHM9bGl2ZV9sb2dzKQogICAgdGltZXIudGljayhnZXRfbWV0cmljc19yb3csICAgICBvdXRwdXRzPVtzdGF0X3N0YXR1cywgc3RhdF90b3RhbCwgc3RhdF9kb25lLCBzdGF0X3Bycywgc3RhdF9mYWlsZWQsIHN0YXRfc2FzdF0pCiAgICB0aW1lci50aWNrKGhlcm1lc19nZXRfbGl2ZV9sb2dzLCBvdXRwdXRzPWhlcm1lc19saXZlX2xvZ3MpCgogICAgZGVtby5sb2FkKGdldF9saXZlX2xvZ3MsICAgICAgICAgICAgb3V0cHV0cz1saXZlX2xvZ3MpCiAgICBkZW1vLmxvYWQoZ2V0X21ldHJpY3Nfcm93LCAgICAgICAgICBvdXRwdXRzPVtzdGF0X3N0YXR1cywgc3RhdF90b3RhbCwgc3RhdF9kb25lLCBzdGF0X3Bycywgc3RhdF9mYWlsZWQsIHN0YXRfc2FzdF0pCiAgICBkZW1vLmxvYWQoaGVybWVzX2dldF9saXZlX2xvZ3MsICAgICBvdXRwdXRzPWhlcm1lc19saXZlX2xvZ3MpCiAgICBkZW1vLmxvYWQoaGVybWVzX2dldF9waXBlbGluZV9kaXNwbGF5LCBvdXRwdXRzPWhlcm1lc19waXBlbGluZV9vdXQpCiAgICBkZW1vLmxvYWQoZ2V0X2pvYl90YWJsZSwgICAgICAgICAgICBvdXRwdXRzPWpvYl90YWJsZSkKICAgIGRlbW8ubG9hZChnZXRfYXVkaXRfZGlzcGxheSwgICAgICAgIG91dHB1dHM9YXVkaXRfbG9nKQogICAgZGVtby5sb2FkKGdldF9jaGFpbl9pbnRlZ3JpdHlfZGlzcGxheSwgb3V0cHV0cz1jaGFpbl9zdGF0dXMpCiAgICBkZW1vLmxvYWQoZ2V0X3RyYWluaW5nX3N0YXRzX2Rpc3BsYXksICBvdXRwdXRzPXN0YXRzX2Rpc3BsYXkpCiAgICBkZW1vLmxvYWQoZ2V0X3dlYmhvb2tfbG9nX2Rpc3BsYXksICBvdXRwdXRzPXdlYmhvb2tfbG9nKQogICAgZGVtby5sb2FkKGdldF9yZWRfdGVhbV9kaXNwbGF5LCAgICAgb3V0cHV0cz1yZWRfdGVhbV9ib3gpCiAgICBkZW1vLmxvYWQoZ2V0X3N3ZWJlbmNoX2Rpc3BsYXksICAgICBvdXRwdXRzPXN3ZWJlbmNoX3JlcG9ydCkKCgppZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgdWlfbG9nKGYiUmhvZGF3ayBBSSB2My4wIHN0YXJ0aW5nIOKAlCBUZW5hbnQ6IHtURU5BTlRfSUR9IHwgTW9kZWw6IHtNT0RFTH0iKQoKICAgICMgTUlOT1IgQlVHIEZJWDogUHJlLXdhcm0gdGhlIGVtYmVkZGluZyBtb2RlbCBpbiBhIGJhY2tncm91bmQgdGhyZWFkIHNvIHRoZQogICAgIyBmaXJzdCByZWFsIHJldHJpZXZhbCBjYWxsIGRvZXMgbm90IGJsb2NrIG9uIGEgbXVsdGktc2Vjb25kIG1vZGVsIGRvd25sb2FkLgogICAgZGVmIF9wcmV3YXJtKCk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBmcm9tIGVtYmVkZGluZ19tZW1vcnkgaW1wb3J0IHByZV93YXJtX21vZGVsCiAgICAgICAgICAgIG9rID0gcHJlX3dhcm1fbW9kZWwoKQogICAgICAgICAgICB1aV9sb2coCiAgICAgICAgICAgICAgICAiRW1iZWRkaW5nIG1vZGVsIHByZS13YXJtZWQgc3VjY2Vzc2Z1bGx5LiIgaWYgb2sKICAgICAgICAgICAgICAgIGVsc2UgIkVtYmVkZGluZyBtb2RlbCBwcmUtd2FybSBmYWlsZWQg4oCUIHdpbGwgcmV0cnkgb24gZmlyc3QgdXNlLiIsCiAgICAgICAgICAgICAgICAiTUVNIgogICAgICAgICAgICApCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBfZToKICAgICAgICAgICAgdWlfbG9nKGYiRW1iZWRkaW5nIG1vZGVsIHByZS13YXJtIGVycm9yIChub24tZmF0YWwpOiB7X2V9IiwgIk1FTSIpCgogICAgdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9X3ByZXdhcm0sIGRhZW1vbj1UcnVlKS5zdGFydCgpCgogICAgdWlfbG9nKCJTdGFydGluZyB3ZWJob29rIHNlcnZlciBvbiBwb3J0IDc4NjEuLi4iKQogICAgc3RhcnRfd2ViaG9va19zZXJ2ZXIoKQogICAgdWlfbG9nKCJXZWJob29rIHNlcnZlciBydW5uaW5nLiBMYXVuY2hpbmcgZGFzaGJvYXJkLi4uIikKICAgIHBvcnQgPSBpbnQob3MuZW52aXJvbi5nZXQoIlBPUlQiLCA3ODYwKSkKICAgIGRlbW8ubGF1bmNoKHNlcnZlcl9uYW1lPSIwLjAuMC4wIiwgc2VydmVyX3BvcnQ9cG9ydCwgc2hhcmU9RmFsc2UsIHNob3dfZXJyb3I9VHJ1ZSwgdGhlbWU9VEhFTUUpCg== \ No newline at end of file +IiIiClJob2Rhd2sgQUkg4oCUIEF1dG9ub21vdXMgRGV2U2VjT3BzIENvbnRyb2wgUGxhbmUgdjQuMAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpGdWxsIGxvb3A6CiAgMS4gQ2xvbmUgcmVwbyDihpIgZGlzY292ZXIgdGVzdHMg4oaSIHJ1biBweXRlc3QKICAyLiBGQUlMIOKGkiByZXRyaWV2ZSBzaW1pbGFyIGZpeGVzIGZyb20gbWVtb3J5IChkYXRhIGZseXdoZWVsKQogIDMuIERpc3BhdGNoIEFpZGVyIHdpdGggZmFpbHVyZSArIG1lbW9yeSBjb250ZXh0IHZpYSBNQ1AgdG9vbHMKICA0LiBSZS1ydW4gdGVzdHMgb24gdGhlIHBhdGNoZWQgY29kZSAodmVyaWZpY2F0aW9uIOKAlCBDTE9TRVMgVEhFIExPT1ApCiAgNS4gSWYgc3RpbGwgZmFpbGluZyDihpIgcmV0cnkgd2l0aCBuZXcgZmFpbHVyZSBjb250ZXh0ICh1cCB0byBNQVhfUkVUUklFUykKICA2LiBTQVNUIGdhdGU6IGJhbmRpdCArIDE2LXBhdHRlcm4gc2VjcmV0IHNjYW5uZXIKICA3LiBTdXBwbHkgY2hhaW4gZ2F0ZTogcGlwLWF1ZGl0ICsgdHlwb3NxdWF0dGluZyBkZXRlY3Rpb24KICA4LiBBZHZlcnNhcmlhbCBMTE0gcmV2aWV3OiAzLW1vZGVsIGNvbmN1cnJlbnQgY29uc2Vuc3VzIChRd2Vu4oilR2VtbWHiiKVNaXN0cmFsKQogIDkuIFozIGZvcm1hbCB2ZXJpZmljYXRpb24gZ2F0ZSAoYm91bmRlZCBpbnRlZ2VyL2JvdW5kcyBjaGVja2luZykKICAxMC4gSWYgYWR2ZXJzYXJ5IFJFSkVDVHMg4oaSIGxvb3AgYmFjayB3aXRoIGNyaXRpcXVlIGFzIGNvbnRleHQKICAxMS4gQ29udmljdGlvbiBlbmdpbmU6IGF1dG8tbWVyZ2UgaWYgYWxsIHRydXN0IGNyaXRlcmlhIG1ldAogIDEyLiBBbGwgY2xlYXIg4oaSIG9wZW4gUFIsIHJlY29yZCB0byB0cmFpbmluZyBzdG9yZSwgdXBkYXRlIG1lbW9yeQogIDEzLiBMb1JBIHNjaGVkdWxlcjogZXhwb3J0IHRyYWluaW5nIGRhdGEgd2hlbiB0aHJlc2hvbGQgcmVhY2hlZAogIDE0LiBSZXBvIGhhcnZlc3RlcjogYXV0b25vbW91cyB0YXJnZXQgc2VsZWN0aW9uIChhbnRhZ29uaXN0IG1vZGUpCiAgMTUuIFdlYmhvb2sgc2VydmVyIHJ1bnMgaW4gcGFyYWxsZWwgZm9yIGV2ZW50LWRyaXZlbiB0cmlnZ2VycwoiIiIKCmltcG9ydCBoYXNobGliCmltcG9ydCBqc29uCmltcG9ydCBvcwppbXBvcnQgc2lnbmFsCmltcG9ydCBzdWJwcm9jZXNzCmltcG9ydCB0ZW1wZmlsZQppbXBvcnQgdGhyZWFkaW5nCmltcG9ydCB0aW1lCmZyb20gdHlwaW5nIGltcG9ydCBPcHRpb25hbAoKaW1wb3J0IGdyYWRpbyBhcyBncgppbXBvcnQgcmVxdWVzdHMKZnJvbSBnaXQgaW1wb3J0IFJlcG8KZnJvbSB0ZW5hY2l0eSBpbXBvcnQgcmV0cnksIHN0b3BfYWZ0ZXJfYXR0ZW1wdCwgd2FpdF9leHBvbmVudGlhbAoKZnJvbSBhZHZlcnNhcmlhbF9yZXZpZXdlciBpbXBvcnQgcnVuX2FkdmVyc2FyaWFsX3Jldmlldwpmcm9tIGhlcm1lc19vcmNoZXN0cmF0b3IgaW1wb3J0ICgKICAgIHJ1bl9oZXJtZXNfcmVzZWFyY2gsIGdldF9oZXJtZXNfbG9ncywgZ2V0X3Nlc3Npb25fc3VtbWFyeSwKICAgIGNvbXB1dGVfdmVzLCBidWlsZF90dmcsCikKZnJvbSBib3VudHlfZ2F0ZXdheSBpbXBvcnQgKAogICAgZ2V0X3BpcGVsaW5lLCBnZXRfcGlwZWxpbmVfc3VtbWFyeSwgaHVtYW5fYXBwcm92ZSwgaHVtYW5fcmVqZWN0LAogICAgc3VibWl0X3RvX2hhY2tlcm9uZSwgc3VibWl0X2dpdGh1Yl9hZHZpc29yeSwgYWRkX3RvX3BpcGVsaW5lLAopCmZyb20gdnVsbl9jbGFzc2lmaWVyIGltcG9ydCBjbGFzc2lmeV92dWxuZXJhYmlsaXR5LCBnZXRfYWxsX2N3ZXMKZnJvbSBhdWRpdF9sb2dnZXIgaW1wb3J0IGV4cG9ydF9jb21wbGlhbmNlX3JlcG9ydCwgbG9nX2F1ZGl0X2V2ZW50LCByZWFkX2F1ZGl0X3RyYWlsLCB2ZXJpZnlfY2hhaW5faW50ZWdyaXR5CmZyb20gY29udmljdGlvbl9lbmdpbmUgaW1wb3J0IGV2YWx1YXRlX2NvbnZpY3Rpb24sIGF1dG9fbWVyZ2VfcHIKZnJvbSBmb3JtYWxfdmVyaWZpZXIgaW1wb3J0IHJ1bl9mb3JtYWxfdmVyaWZpY2F0aW9uCmZyb20gZ2l0aHViX2FwcCBpbXBvcnQgZ2V0X2dpdGh1Yl90b2tlbgpmcm9tIGpvYl9xdWV1ZSBpbXBvcnQgSm9iU3RhdHVzLCBnZXRfam9iX3N0YXR1c19lbnVtLCBnZXRfbWV0cmljcywgbGlzdF9hbGxfam9icywgdXBzZXJ0X2pvYgpmcm9tIGxvcmFfc2NoZWR1bGVyIGltcG9ydCBtYXliZV90cmlnZ2VyX3RyYWluaW5nLCBnZXRfc2NoZWR1bGVyX3N0YXR1cwpmcm9tIG1lbW9yeV9lbmdpbmUgaW1wb3J0IGdldF9tZW1vcnlfc3RhdHMsIHJlY29yZF9maXhfb3V0Y29tZSwgcmV0cmlldmVfc2ltaWxhcl9maXhlcwpmcm9tIGVtYmVkZGluZ19tZW1vcnkgaW1wb3J0IHJldHJpZXZlX3NpbWlsYXJfZml4ZXNfdjIKZnJvbSBub3RpZmllciBpbXBvcnQgKAogICAgbm90aWZ5LAogICAgbm90aWZ5X2F1ZGl0X2NvbXBsZXRlLAogICAgbm90aWZ5X2F1ZGl0X3N0YXJ0LAogICAgbm90aWZ5X2NoYWluX2ludGVncml0eSwKICAgIG5vdGlmeV9wYXRjaF9mYWlsZWQsCiAgICBub3RpZnlfcHJfY3JlYXRlZCwKICAgIG5vdGlmeV9zYXN0X2Jsb2NrZWQsCiAgICBub3RpZnlfdGVzdF9mYWlsZWQsCikKZnJvbSBzYXN0X2dhdGUgaW1wb3J0IHJ1bl9zYXN0X2dhdGUKZnJvbSByZWRfdGVhbV9mdXp6ZXIgaW1wb3J0IGdldF9yZWRfdGVhbV9sb2dzLCBnZXRfcmVkX3RlYW1fc3RhdHMsIHJ1bl9yZWRfdGVhbV9jZWdpcwpmcm9tIHN1cHBseV9jaGFpbiBpbXBvcnQgcnVuX3N1cHBseV9jaGFpbl9nYXRlCmZyb20gdHJhaW5pbmdfc3RvcmUgaW1wb3J0IGV4cG9ydF90cmFpbmluZ19kYXRhLCBnZXRfc3RhdGlzdGljcywgaW5pdGlhbGl6ZV9zdG9yZSwgcmVjb3JkX2F0dGVtcHQsIHVwZGF0ZV90ZXN0X3Jlc3VsdApmcm9tIHZlcmlmaWNhdGlvbl9sb29wIGltcG9ydCAoCiAgICBNQVhfUkVUUklFUywKICAgIEFEVkVSU0FSSUFMX1JFSkVDVElPTl9NVUxUSVBMSUVSLAogICAgVmVyaWZpY2F0aW9uQXR0ZW1wdCwKICAgIFZlcmlmaWNhdGlvblJlc3VsdCwKICAgIGJ1aWxkX2luaXRpYWxfcHJvbXB0LAogICAgYnVpbGRfcmV0cnlfcHJvbXB0LAopCmZyb20gd2ViaG9va19zZXJ2ZXIgaW1wb3J0IHNldF9qb2JfZGlzcGF0Y2hlciwgc3RhcnRfd2ViaG9va19zZXJ2ZXIKZnJvbSB3b3JrZXJfcG9vbCBpbXBvcnQgTUFYX1dPUktFUlMsIHJ1bl9wYXJhbGxlbF9hdWRpdApmcm9tIGxhbmd1YWdlX3J1bnRpbWUgaW1wb3J0IFJ1bnRpbWVGYWN0b3J5LCBMYW5ndWFnZVJ1bnRpbWUsIEVudkNvbmZpZwoKIyBNb2R1bGUtbGV2ZWwgcnVudGltZSBoYW5kbGUg4oCUIHNldCBvbmNlIHBlciBhdWRpdCBydW4uCiMgQlVHLTAwNyBGSVg6IFByb3RlY3RlZCBieSBhIGxvY2sgc28gY29uY3VycmVudCB3ZWJob29rLXRyaWdnZXJlZCBhdWRpdHMgZG8gbm90CiMgb3ZlcndyaXRlIF9hY3RpdmVfcnVudGltZSB3aGlsZSB3b3JrZXJzIGFyZSBtaWQtZmxpZ2h0IHJlYWRpbmcgaXQuCl9hY3RpdmVfcnVudGltZTogTGFuZ3VhZ2VSdW50aW1lIHwgTm9uZSA9IE5vbmUKX2FjdGl2ZV9ydW50aW1lX2xvY2sgPSB0aHJlYWRpbmcuTG9jaygpCgojIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAojIFNFQ1JFVFMg4oCUIGVudiBvbmx5LCBuZXZlciBoYXJkY29kZWQKIyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKR0lUSFVCX1RPS0VOID0gb3MuZ2V0ZW52KCJHSVRIVUJfVE9LRU4iKQpHSVRIVUJfUkVQTyA9IG9zLmdldGVudigiR0lUSFVCX1JFUE8iLCAiIikgICAgICAgICAgIyBPcHRpb25hbCDigJQgY2FuIGJlIHNldCB2aWEgY2hhdCBpbmJveApPUEVOUk9VVEVSX0FQSV9LRVkgPSBvcy5nZXRlbnYoIk9QRU5ST1VURVJfQVBJX0tFWSIpClRFTkFOVF9JRCA9IG9zLmdldGVudigiUkhPREFXS19URU5BTlRfSUQiLCAiZGVmYXVsdCIpCk1PREVMID0gb3MuZ2V0ZW52KCJSSE9EQVdLX01PREVMIiwgIm9wZW5yb3V0ZXIvcXdlbi9xd2VuLTIuNS1jb2Rlci0zMmItaW5zdHJ1Y3Q6ZnJlZSIpClJFRF9URUFNX0VOQUJMRUQgPSBvcy5nZXRlbnYoIlJIT0RBV0tfUkVEX1RFQU1fRU5BQkxFRCIsICJ0cnVlIikubG93ZXIoKSAhPSAiZmFsc2UiCgojIE9ubHkgR0lUSFVCX1RPS0VOIGFuZCBPUEVOUk9VVEVSX0FQSV9LRVkgYXJlIHRydWx5IHJlcXVpcmVkIGF0IHN0YXJ0dXAuCiMgR0lUSFVCX1JFUE8gaXMgbm93IG9wdGlvbmFsIOKAlCBpdCBjYW4gYmUgc3VwcGxpZWQgdmlhIHRoZSBjaGF0IGluYm94IGF0IHJ1bnRpbWUuCmZvciBfa2V5LCBfdmFsIGluIFsoIkdJVEhVQl9UT0tFTiIsIEdJVEhVQl9UT0tFTiksICgiT1BFTlJPVVRFUl9BUElfS0VZIiwgT1BFTlJPVVRFUl9BUElfS0VZKV06CiAgICBpZiBub3QgX3ZhbDoKICAgICAgICByYWlzZSBFbnZpcm9ubWVudEVycm9yKAogICAgICAgICAgICBmIlJlcXVpcmVkIHNlY3JldCAne19rZXl9JyBpcyBub3Qgc2V0LiAiCiAgICAgICAgICAgICJBZGQgaXQgaW4gSHVnZ2luZ0ZhY2UgU3BhY2UgU2V0dGluZ3Mg4oaSIFNlY3JldHMuIgogICAgICAgICkKCiMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiMgUEFUSFMgJiBDT05TVEFOVFMKIyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKUEVSU0lTVEVOVF9ESVIgPSAiL2RhdGEiClJFUE9fRElSID0gZiJ7UEVSU0lTVEVOVF9ESVJ9L3JlcG8iICAgICAgICAgICMgZGVmYXVsdDsgb3ZlcnJpZGRlbiBwZXItYXVkaXQgYmVsb3cKVkVOVl9ESVIgPSBmIntQRVJTSVNURU5UX0RJUn0vdGFyZ2V0X3ZlbnYiCk1DUF9SVU5USU1FX0NPTkZJRyA9ICIvdG1wL21jcF9ydW50aW1lLmpzb24iCgojIOKUgOKUgCBQZXItYXVkaXQgcmVwbyBkaXIg4oCUIHVwZGF0ZWQgYXRvbWljYWxseSBhdCBhdWRpdCBzdGFydCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKIyBCZWNhdXNlIF9hdWRpdF9ldmVudCBlbnN1cmVzIG9ubHkgb25lIGF1ZGl0IHJ1bnMgYXQgYSB0aW1lLCB1cGRhdGluZyB0aGlzCiMgZ2xvYmFsIGF0IGF1ZGl0IHN0YXJ0IGlzIHNhZmUgd2l0aG91dCBhbiBhZGRpdGlvbmFsIGxvY2suCl9jdXJyZW50X3RhcmdldF9yZXBvOiBzdHIgPSAiIgoKIyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKIyBCVUctMDA1IEZJWDogRXhwbGljaXQgc3RhcnR1cCBpbml0aWFsaXphdGlvbiDigJQgZW5zdXJlcyBTUUxpdGUgdGFibGVzIGV4aXN0CiMgZXZlbiBpZiB0aGUgbW9kdWxlLWxldmVsIGNhbGwgaW4gdHJhaW5pbmdfc3RvcmUucHkgaXMgb3B0aW1pemVkIGF3YXkgb3IKIyB0aGUgaW1wb3J0IG9yZGVyIGNoYW5nZXMgaW4gdGhlIGZ1dHVyZS4KIyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKaW5pdGlhbGl6ZV9zdG9yZSgpCgojIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAojIEdMT0JBTCBTVEFURQojIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgApkYXNoYm9hcmRfbG9nczogbGlzdFtzdHJdID0gW10KX2xvZ19sb2NrID0gdGhyZWFkaW5nLkxvY2soKQpfYXVkaXRfZXZlbnQgPSB0aHJlYWRpbmcuRXZlbnQoKQoKIyBDaGF0IGluYm94IHN0YXRlIOKAlCBsaXN0IG9mIHsicm9sZSI6IC4uLiwgImNvbnRlbnQiOiAuLi59IGRpY3RzCl9pbmJveF9oaXN0b3J5OiBsaXN0W2RpY3RdID0gW10KX2luYm94X2xvY2sgPSB0aHJlYWRpbmcuTG9jaygpCgoKZGVmIHVpX2xvZyhtZXNzYWdlOiBzdHIsIGxldmVsOiBzdHIgPSAiSU5GTyIpOgogICAgdHMgPSB0aW1lLnN0cmZ0aW1lKCIlSDolTTolUyIpCiAgICBpY29ucyA9IHsiT0siOiAi4pyFIiwgIkZBSUwiOiAi4p2MIiwgIldBUk4iOiAi4pqgIiwgIlNBU1QiOiAi8J+boSIsICJBRFYiOiAi8J+UtCIsICJQUiI6ICLwn5SBIiwKICAgICAgICAgICAgICJTS0lQIjogIuKPrSIsICJNRU0iOiAi8J+noCIsICJDSEFJTiI6ICLim5MiLCAiU1VQUExZIjogIvCfk6YiLCAiUkVUUlkiOiAi8J+UhCIsICJJTkZPIjogIiAgIiwKICAgICAgICAgICAgICJSRUQiOiAi4pqU77iPIiwgIkFUVEFDSyI6ICLwn5ehIiwgIkNSQVNIIjogIvCfkqUiLCAiQkVOQ0giOiAi8J+nqiIsICJQT09MIjogIuKaoSJ9CiAgICBsaW5lID0gZiJbe3RzfV0ge2ljb25zLmdldChsZXZlbCwgJyAgJyl9IHttZXNzYWdlfSIKICAgIHByaW50KGxpbmUpCiAgICB3aXRoIF9sb2dfbG9jazoKICAgICAgICBkYXNoYm9hcmRfbG9ncy5hcHBlbmQobGluZSkKICAgICAgICBpZiBsZW4oZGFzaGJvYXJkX2xvZ3MpID4gMzAwOgogICAgICAgICAgICBkYXNoYm9hcmRfbG9ncy5wb3AoMCkKCgojIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAojIFNVQlBST0NFU1MgUlVOTkVSIOKAlCBzaGVsbD1GYWxzZSBlbmZvcmNlZCwgc2VjcmV0cyBzdHJpcHBlZAojIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgApkZWYgcnVuX3N1YnByb2Nlc3Nfc2FmZShjbWQ6IGxpc3QsIGN3ZDogc3RyID0gUkVQT19ESVIsIHRpbWVvdXQ6IGludCA9IDMwMCwKICAgICAgICAgICAgICAgICAgICAgICAgZW52X292ZXJyaWRlczogZGljdCA9IE5vbmUsIHJhaXNlX29uX2Vycm9yOiBib29sID0gVHJ1ZSkgLT4gdHVwbGVbc3RyLCBpbnRdOgogICAgaWYgaXNpbnN0YW5jZShjbWQsIHN0cik6CiAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJTRUNVUklUWTogU3RyaW5nIGNvbW1hbmRzIGZvcmJpZGRlbi4gVXNlIGxpc3QuIikKICAgIGVudiA9IG9zLmVudmlyb24uY29weSgpCiAgICBmb3IgayBpbiBbIk9QRU5ST1VURVJfQVBJX0tFWSIsICJHSVRIVUJfVE9LRU4iLCAiR0lUSFVCX1BFUlNPTkFMX0FDQ0VTU19UT0tFTiIsCiAgICAgICAgICAgICAgICJURUxFR1JBTV9CT1RfVE9LRU4iLCAiU0xBQ0tfV0VCSE9PS19VUkwiLCAiUkhPREFXS19XRUJIT09LX1NFQ1JFVCJdOgogICAgICAgIGVudi5wb3AoaywgTm9uZSkKICAgIGlmIGVudl9vdmVycmlkZXM6CiAgICAgICAgZW52LnVwZGF0ZShlbnZfb3ZlcnJpZGVzKQogICAgcHJvYyA9IE5vbmUKICAgIHRyeToKICAgICAgICBwcm9jID0gc3VicHJvY2Vzcy5Qb3BlbihjbWQsIHNoZWxsPUZhbHNlLCBjd2Q9Y3dkLCBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZGVycj1zdWJwcm9jZXNzLlBJUEUsIHRleHQ9VHJ1ZSwgZW52PWVudiwgc3RhcnRfbmV3X3Nlc3Npb249VHJ1ZSkKICAgICAgICBzdGRvdXQsIHN0ZGVyciA9IHByb2MuY29tbXVuaWNhdGUodGltZW91dD10aW1lb3V0KQogICAgICAgIG91dHB1dCA9IChzdGRvdXQgb3IgIiIpICsgIlxuIiArIChzdGRlcnIgb3IgIiIpCiAgICAgICAgaWYgcmFpc2Vfb25fZXJyb3IgYW5kIHByb2MucmV0dXJuY29kZSAhPSAwOgogICAgICAgICAgICByYWlzZSBzdWJwcm9jZXNzLkNhbGxlZFByb2Nlc3NFcnJvcihwcm9jLnJldHVybmNvZGUsIGNtZCwgc3Rkb3V0LCBzdGRlcnIpCiAgICAgICAgcmV0dXJuIG91dHB1dCwgcHJvYy5yZXR1cm5jb2RlCiAgICBleGNlcHQgc3VicHJvY2Vzcy5UaW1lb3V0RXhwaXJlZDoKICAgICAgICBpZiBwcm9jOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBvcy5raWxscGcob3MuZ2V0cGdpZChwcm9jLnBpZCksIHNpZ25hbC5TSUdLSUxMKQogICAgICAgICAgICBleGNlcHQgUHJvY2Vzc0xvb2t1cEVycm9yOgogICAgICAgICAgICAgICAgcGFzcwogICAgICAgICAgICBwcm9jLmNvbW11bmljYXRlKCkKICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoZiJDb21tYW5kIHRpbWVkIG91dCBhZnRlciB7dGltZW91dH1zOiB7Y21kWzBdfSIpCgoKIyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKIyBHSVQgSEVMUEVSUwojIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgApkZWYgY29uZmlndXJlX2dpdF9jcmVkZW50aWFscygpOgogICAgIiIiCiAgICBTZXQgdXAgZ2l0IGNyZWRlbnRpYWwgc3RvcmFnZS4KCiAgICBST09UIENBVVNFIEZJWDogdGhlIHByZXZpb3VzIGltcGxlbWVudGF0aW9uIGNhbGxlZAogICAgICAgIGdpdCBjb25maWcgLS1nbG9iYWwgY3JlZGVudGlhbC5oZWxwZXIgJ3N0b3JlIC0tZmlsZSAvdG1wLy5naXQtY3JlZGVudGlhbHMnCiAgICB3aGljaCB3cml0ZXMgdG8gJEhPTUUvLmdpdGNvbmZpZy4gSW4gSHVnZ2luZ0ZhY2UgU3BhY2VzICRIT01FPS9ob21lL3Job2Rhd2sKICAgIGlzIG9mdGVuIG5vdCB3cml0YWJsZSBhdCBjb250YWluZXIgcnVudGltZSwgY2F1c2luZyBleGl0LTI1NSAoZmF0YWwpLgoKICAgIEZpeDogd3JpdGUgdGhlIGdpdGNvbmZpZyBmaWxlIGRpcmVjdGx5IOKAlCBubyBnaXQgc3VicHJvY2VzcyBuZWVkZWQg4oCUCiAgICB0aGVuIGV4cG9ydCBHSVRfQ09ORklHX0dMT0JBTCBzbyBldmVyeSBzdWJzZXF1ZW50IGdpdCBjYWxsIGluIHRoaXMKICAgIHByb2Nlc3MgcGlja3MgaXQgdXAgYXV0b21hdGljYWxseSAob3MuZW52aXJvbiBpcyBjb3BpZWQgYnkgcnVuX3N1YnByb2Nlc3Nfc2FmZSkuCiAgICAiIiIKICAgIGNyZWRfcGF0aCA9ICIvdG1wLy5naXQtY3JlZGVudGlhbHMiCiAgICB3aXRoIG9wZW4oY3JlZF9wYXRoLCAidyIpIGFzIGY6CiAgICAgICAgZi53cml0ZShmImh0dHBzOi8veC10b2tlbjp7R0lUSFVCX1RPS0VOfUBnaXRodWIuY29tXG4iKQogICAgb3MuY2htb2QoY3JlZF9wYXRoLCAwbzYwMCkKCiAgICBnaXRjb25maWdfcGF0aCA9ICIvdG1wLy5naXRjb25maWciCiAgICB3aXRoIG9wZW4oZ2l0Y29uZmlnX3BhdGgsICJ3IikgYXMgZjoKICAgICAgICBmLndyaXRlKAogICAgICAgICAgICBmIltjcmVkZW50aWFsXVxuXHRoZWxwZXIgPSBzdG9yZSAtLWZpbGUge2NyZWRfcGF0aH1cbiIKICAgICAgICAgICAgZiJbdXNlcl1cblx0bmFtZSA9IFJob2Rhd2sgQUlcblx0ZW1haWwgPSBhZ2VudEByaG9kYXdrLmFpXG4iCiAgICAgICAgICAgIGYiW3NhZmVdXG5cdGRpcmVjdG9yeSA9ICpcbiIKICAgICAgICApCiAgICBvcy5jaG1vZChnaXRjb25maWdfcGF0aCwgMG82MDApCgogICAgIyBFeHBvcnQgdG8gcGFyZW50IHByb2Nlc3MgZW52IOKAlCBhbGwgY2hpbGQgc3VicHJvY2Vzc2VzIGluaGVyaXQgdGhpcwogICAgb3MuZW52aXJvblsiR0lUX0NPTkZJR19HTE9CQUwiXSA9IGdpdGNvbmZpZ19wYXRoCiAgICB1aV9sb2coZiJHaXQgY3JlZGVudGlhbHMgY29uZmlndXJlZCDihpIge2dpdGNvbmZpZ19wYXRofSIsICJJTkZPIikKCgpkZWYgd3JpdGVfbWNwX2NvbmZpZygpIC0+IHN0cjoKICAgICIiIgogICAgV3JpdGUgdGhlIGZ1bGwgMjUtc2VydmVyIGN5YmVyc2VjdXJpdHkgTUNQIGNvbmZpZyB0byAvdG1wL21jcF9ydW50aW1lLmpzb24uCiAgICBTZWNyZXRzIGFyZSBpbmplY3RlZCBmcm9tIGVudmlyb25tZW50IGF0IHJ1bnRpbWUg4oCUIG5ldmVyIHN0b3JlZCBpbiBzb3VyY2UuCiAgICBSaG9kYXdrIEFJIHY1LjAg4oCUIE9wZW5DbGF3IEhlcm1lcyBhZ2VudCBNQ1Agc3VpdGUuCiAgICAiIiIKICAgIF9mZXRjaF9kb21haW5zID0gIiwiLmpvaW4oX2FjdGl2ZV9ydW50aW1lLmdldF9tY3BfZG9tYWlucygpKSBpZiBfYWN0aXZlX3J1bnRpbWUgZWxzZSAoCiAgICAgICAgImRvY3MucHl0aG9uLm9yZyxweXBpLm9yZyxkb2NzLmdpdGh1Yi5jb20scGFja2FnaW5nLnB5dGhvbi5vcmcscGVwcy5weXRob24ub3JnLCIKICAgICAgICAiY3dlLm1pdHJlLm9yZyxudmQubmlzdC5nb3Ysb3dhc3Aub3JnLHBvcnRzd2lnZ2VyLm5ldCxoYWNrZXJvbmUuY29tLGJ1Z2Nyb3dkLmNvbSwiCiAgICAgICAgImN2ZS5vcmcsZXhwbG9pdC1kYi5jb20sZG9jcy5ycyxnby5kZXYsbm9kZWpzLm9yZyxkZXZlbG9wZXIubW96aWxsYS5vcmcsc2hvZGFuLmlvLCIKICAgICAgICAidmlydXN0b3RhbC5jb20sb3N2LmRldixzbnlrLmlvLHZ1bG5lcnMuY29tLHNlY2xpc3RzLm9yZyxwYWNrZXRzdG9ybXNlY3VyaXR5LmNvbSwiCiAgICAgICAgInNlY3VyaXR5Zm9jdXMuY29tLGNpc2EuZ292LHplcm9kYXlpbml0aWF0aXZlLmNvbSxodW50ci5jb20saW50aWdyaXRpLmNvbSwiCiAgICAgICAgInllc3dlaGFjay5jb20sdmRwLmhhY2tlcm9uZS5jb20sYXBpLmdpdGh1Yi5jb20scmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSwiCiAgICAgICAgImFyY2hpdmUub3JnLHdlYi5hcmNoaXZlLm9yZyxzZW1ncmVwLmRldixydWxlcy5zZW1ncmVwLmRldixnaXRodWIuY29tLCIKICAgICAgICAic2VjdXJpdHkuc255ay5pbyxvcGVuY3ZlLmlvLHZ1bGRiLmNvbSxyYXBpZDcuY29tLG1ldGFzcGxvaXQuY29tLHd3dy5yYXBpZDcuY29tIgogICAgKQoKICAgIF9icmF2ZV9rZXkgPSBvcy5nZXRlbnYoIkJSQVZFX0FQSV9LRVkiLCAiIikKICAgIF9oYWNrZXJvbmVfdG9rZW4gPSBvcy5nZXRlbnYoIkhBQ0tFUk9ORV9BUElfVE9LRU4iLCAiIikKICAgIF9oYWNrZXJvbmVfa2V5ID0gb3MuZ2V0ZW52KCJIQUNLRVJPTkVfQVBJX0tFWSIsICIiKQogICAgX252ZF9rZXkgPSBvcy5nZXRlbnYoIk5WRF9BUElfS0VZIiwgIiIpCiAgICBfc2VtZ3JlcF90b2tlbiA9IG9zLmdldGVudigiU0VNR1JFUF9BUFBfVE9LRU4iLCAiIikKICAgIF9udWNsZWlfa2V5ID0gb3MuZ2V0ZW52KCJOVUNMRUlfQVBJX0tFWSIsICIiKQogICAgX2RiX3VybCA9IG9zLmdldGVudigiREFUQUJBU0VfVVJMIiwgIiIpCiAgICBfb3BlbnJvdXRlcl9rZXkgPSBvcy5nZXRlbnYoIk9QRU5ST1VURVJfQVBJX0tFWSIsICIiKQoKICAgIGNvbmZpZyA9IHsKICAgICAgICAibWNwU2VydmVycyI6IHsKICAgICAgICAgICAgImZldGNoLWRvY3MiOiB7CiAgICAgICAgICAgICAgICAiY29tbWFuZCI6ICJ1dngiLAogICAgICAgICAgICAgICAgImFyZ3MiOiBbIm1jcC1zZXJ2ZXItZmV0Y2giXSwKICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJGZXRjaCBzZWN1cml0eSBkb2NzLCBDVkUgYWR2aXNvcmllcywgZXhwbG9pdCBQb0NzLCBhbmQgdmVuZG9yIGJ1bGxldGlucyIsCiAgICAgICAgICAgICAgICAiZW52IjogeyJGRVRDSF9BTExPV0VEX0RPTUFJTlMiOiBfZmV0Y2hfZG9tYWluc30KICAgICAgICAgICAgfSwKICAgICAgICAgICAgImdpdGh1Yi1tYW5hZ2VyIjogewogICAgICAgICAgICAgICAgImNvbW1hbmQiOiAibnB4IiwKICAgICAgICAgICAgICAgICJhcmdzIjogWyIteSIsICJAbW9kZWxjb250ZXh0cHJvdG9jb2wvc2VydmVyLWdpdGh1YiJdLAogICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkdpdEh1YiBBUEk6IGNyZWF0ZSBQUnMsIG9wZW4gc2VjdXJpdHkgYWR2aXNvcmllcywgbWFuYWdlIGlzc3VlcywgcXVlcnkgY29tbWl0IGhpc3RvcnkiLAogICAgICAgICAgICAgICAgImVudiI6IHsiR0lUSFVCX1BFUlNPTkFMX0FDQ0VTU19UT0tFTiI6IEdJVEhVQl9UT0tFTn0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgImZpbGVzeXN0ZW0tcmVzZWFyY2giOiB7CiAgICAgICAgICAgICAgICAiY29tbWFuZCI6ICJucHgiLAogICAgICAgICAgICAgICAgImFyZ3MiOiBbIi15IiwgIkBtb2RlbGNvbnRleHRwcm90b2NvbC9zZXJ2ZXItZmlsZXN5c3RlbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiL2RhdGEvcmVwbyIsICIvdG1wL3Jlc2VhcmNoIiwgIi90bXAvZmluZGluZ3MiXSwKICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJSZWFkLW9ubHkgYWNjZXNzIHRvIGNsb25lZCByZXBvcywgcmVzZWFyY2ggc2NyYXRjaCBzcGFjZSwgYW5kIGZpbmRpbmdzIG91dHB1dCIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgIm1lbW9yeS1zdG9yZSI6IHsKICAgICAgICAgICAgICAgICJjb21tYW5kIjogIm5weCIsCiAgICAgICAgICAgICAgICAiYXJncyI6IFsiLXkiLCAiQG1vZGVsY29udGV4dHByb3RvY29sL3NlcnZlci1tZW1vcnkiXSwKICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJQZXJzaXN0ZW50IGtub3dsZWRnZSBncmFwaCDigJQgZXhwbG9pdCBjaGFpbnMsIENXRSBwYXR0ZXJucywgY3Jvc3Mtc2Vzc2lvbiB2dWxuZXJhYmlsaXR5IG1lbW9yeSIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInNlcXVlbnRpYWwtdGhpbmtpbmciOiB7CiAgICAgICAgICAgICAgICAiY29tbWFuZCI6ICJucHgiLAogICAgICAgICAgICAgICAgImFyZ3MiOiBbIi15IiwgIkBtb2RlbGNvbnRleHRwcm90b2NvbC9zZXJ2ZXItc2VxdWVudGlhbC10aGlua2luZyJdLAogICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlN0cnVjdHVyZWQgY2hhaW4tb2YtdGhvdWdodCBmb3IgY29tcGxleCBtdWx0aS1zdGVwIHZ1bG5lcmFiaWxpdHkgYW5hbHlzaXMiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJ3ZWItc2VhcmNoIjogewogICAgICAgICAgICAgICAgImNvbW1hbmQiOiAibnB4IiwKICAgICAgICAgICAgICAgICJhcmdzIjogWyIteSIsICJAbW9kZWxjb250ZXh0cHJvdG9jb2wvc2VydmVyLWJyYXZlLXNlYXJjaCJdLAogICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlNlYXJjaCBDVkVzLCBleHBsb2l0IFBvQ3MsIHZlbmRvciBhZHZpc29yaWVzLCBidWcgYm91bnR5IHdyaXRldXBzLCBzZWN1cml0eSByZXNlYXJjaCIsCiAgICAgICAgICAgICAgICAiZW52IjogeyJCUkFWRV9BUElfS0VZIjogX2JyYXZlX2tleX0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgImdpdC1mb3JlbnNpY3MiOiB7CiAgICAgICAgICAgICAgICAiY29tbWFuZCI6ICJucHgiLAogICAgICAgICAgICAgICAgImFyZ3MiOiBbIi15IiwgIkBtb2RlbGNvbnRleHRwcm90b2NvbC9zZXJ2ZXItZ2l0IiwgIi0tcmVwb3NpdG9yeSIsICIvZGF0YS9yZXBvIl0sCiAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRGVlcCBnaXQgaGlzdG9yeTogc2lsZW50IHNlY3VyaXR5IHBhdGNoZXMgKENBRCksIGJsYW1lIHRyYWNraW5nLCBjb21taXQgYW5vbWFseSBkZXRlY3Rpb24iCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJzcWxpdGUtZmluZGluZ3MiOiB7CiAgICAgICAgICAgICAgICAiY29tbWFuZCI6ICJucHgiLAogICAgICAgICAgICAgICAgImFyZ3MiOiBbIi15IiwgIkBtb2RlbGNvbnRleHRwcm90b2NvbC9zZXJ2ZXItc3FsaXRlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICItLWRiLXBhdGgiLCAiL2RhdGEvcmhvZGF3a19maW5kaW5ncy5kYiJdLAogICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkxvY2FsIGZpbmRpbmdzIHN0b3JlIOKAlCBmYXN0IHF1ZXJpZXMgb24gdnVsbmVyYWJpbGl0eSBtZXRhZGF0YSwgQ1ZTUyBzY29yZXMsIGJvdW50eSBlc3RpbWF0ZXMiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJudWNsZWktc2Nhbm5lciI6IHsKICAgICAgICAgICAgICAgICJjb21tYW5kIjogInV2eCIsCiAgICAgICAgICAgICAgICAiYXJncyI6IFsibWNwLXNlcnZlci1zaGVsbCIsICItLWFsbG93LWNvbW1hbmRzIiwgIm51Y2xlaSJdLAogICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk51Y2xlaSB0ZW1wbGF0ZS1iYXNlZCBEQVNUIOKAlCBDVkUgZGV0ZWN0aW9uLCBtaXNjb25maWcgc2Nhbm5pbmcsIHdlYiB2dWxuZXJhYmlsaXR5IGRpc2NvdmVyeSIsCiAgICAgICAgICAgICAgICAiZW52IjogewogICAgICAgICAgICAgICAgICAgICJOVUNMRUlfVEVNUExBVEVTX1BBVEgiOiAiL2RhdGEvbnVjbGVpLXRlbXBsYXRlcyIsCiAgICAgICAgICAgICAgICAgICAgIk5VQ0xFSV9BUElfS0VZIjogX251Y2xlaV9rZXkKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgInNlbWdyZXAtc2FzdCI6IHsKICAgICAgICAgICAgICAgICJjb21tYW5kIjogInV2eCIsCiAgICAgICAgICAgICAgICAiYXJncyI6IFsibWNwLXNlcnZlci1zaGVsbCIsICItLWFsbG93LWNvbW1hbmRzIiwgInNlbWdyZXAiXSwKICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJTZW1ncmVwIFNBU1Qg4oCUIHRhaW50IGFuYWx5c2lzLCBDV0UgcGF0dGVybnMsIHNlY3JldHMgZGV0ZWN0aW9uIGFjcm9zcyAzMCsgbGFuZ3VhZ2VzIiwKICAgICAgICAgICAgICAgICJlbnYiOiB7IlNFTUdSRVBfQVBQX1RPS0VOIjogX3NlbWdyZXBfdG9rZW59CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJ0cnVmZmxlaG9nLXNlY3JldHMiOiB7CiAgICAgICAgICAgICAgICAiY29tbWFuZCI6ICJ1dngiLAogICAgICAgICAgICAgICAgImFyZ3MiOiBbIm1jcC1zZXJ2ZXItc2hlbGwiLCAiLS1hbGxvdy1jb21tYW5kcyIsICJ0cnVmZmxlaG9nIl0sCiAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVHJ1ZmZsZUhvZyB2MyDigJQgaGlnaC1zaWduYWwgc2VjcmV0IHNjYW5uaW5nIHdpdGggNzAwKyBkZXRlY3RvcnMgYWNyb3NzIGdpdCBoaXN0b3J5IgogICAgICAgICAgICB9LAogICAgICAgICAgICAiYmFuZGl0LXNhc3QiOiB7CiAgICAgICAgICAgICAgICAiY29tbWFuZCI6ICJ1dngiLAogICAgICAgICAgICAgICAgImFyZ3MiOiBbIm1jcC1zZXJ2ZXItc2hlbGwiLCAiLS1hbGxvdy1jb21tYW5kcyIsICJiYW5kaXQiXSwKICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJCYW5kaXQgUHl0aG9uIFNBU1Qg4oCUIEFTVC1sZXZlbCBkZXRlY3Rpb24gb2YgZGFuZ2Vyb3VzIHBhdHRlcm5zIGFuZCBpbmplY3Rpb24gc2lua3MiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJwaXAtYXVkaXQtc2NhIjogewogICAgICAgICAgICAgICAgImNvbW1hbmQiOiAidXZ4IiwKICAgICAgICAgICAgICAgICJhcmdzIjogWyJtY3Atc2VydmVyLXNoZWxsIiwgIi0tYWxsb3ctY29tbWFuZHMiLCAicGlwLWF1ZGl0Il0sCiAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAicGlwLWF1ZGl0IFNDQSDigJQga25vd24gdnVsbmVyYWJpbGl0aWVzIGluIFB5dGhvbiBkZXBlbmRlbmNpZXMgdmlhIE9TViBhbmQgUHlQSSBBZHZpc29yeSBEQiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgIm9zdi1zY2FubmVyIjogewogICAgICAgICAgICAgICAgImNvbW1hbmQiOiAidXZ4IiwKICAgICAgICAgICAgICAgICJhcmdzIjogWyJtY3Atc2VydmVyLXNoZWxsIiwgIi0tYWxsb3ctY29tbWFuZHMiLCAib3N2LXNjYW5uZXIiXSwKICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJPU1YgU2Nhbm5lciDigJQgbXVsdGktZWNvc3lzdGVtIFNDQSB1c2luZyB0aGUgT3BlbiBTb3VyY2UgVnVsbmVyYWJpbGl0eSBkYXRhYmFzZSAoR29vZ2xlKSIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInozLWZvcm1hbC12ZXJpZmllciI6IHsKICAgICAgICAgICAgICAgICJjb21tYW5kIjogInV2eCIsCiAgICAgICAgICAgICAgICAiYXJncyI6IFsibWNwLXNlcnZlci1zaGVsbCIsICItLWFsbG93LWNvbW1hbmRzIiwgInB5dGhvbjMiXSwKICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJaMyBTTVQgc29sdmVyIOKAlCBmb3JtYWwgdmVyaWZpY2F0aW9uIG9mIGludGVnZXIgYm91bmRzLCBvdmVyZmxvdyBpbnZhcmlhbnRzLCBwcm90b2NvbCBwcm9wZXJ0aWVzIgogICAgICAgICAgICB9LAogICAgICAgICAgICAiaHlwb3RoZXNpcy1mdXp6ZXIiOiB7CiAgICAgICAgICAgICAgICAiY29tbWFuZCI6ICJ1dngiLAogICAgICAgICAgICAgICAgImFyZ3MiOiBbIm1jcC1zZXJ2ZXItc2hlbGwiLCAiLS1hbGxvdy1jb21tYW5kcyIsICJweXRob24zLHB5dGVzdCJdLAogICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkh5cG90aGVzaXMgUEJUIGZ1enplciDigJQgcHJvcGVydHktYmFzZWQgdGVzdGluZyBmb3Igb3ZlcmZsb3csIGVuY29kaW5nLCBhbGlhc2luZyBidWdzIgogICAgICAgICAgICB9LAogICAgICAgICAgICAiYXRoZXJpcy1mdXp6ZXIiOiB7CiAgICAgICAgICAgICAgICAiY29tbWFuZCI6ICJ1dngiLAogICAgICAgICAgICAgICAgImFyZ3MiOiBbIm1jcC1zZXJ2ZXItc2hlbGwiLCAiLS1hbGxvdy1jb21tYW5kcyIsICJweXRob24zIl0sCiAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQXRoZXJpcyBjb3ZlcmFnZS1ndWlkZWQgZnV6emVyIOKAlCBsaWJGdXp6ZXItYmFja2VkIFB5dGhvbiBmdXp6aW5nIGZvciBwYXJzZXIgYW5kIHByb3RvY29sIGJ1Z3MiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJhbmdyLXN5bWJvbGljIjogewogICAgICAgICAgICAgICAgImNvbW1hbmQiOiAidXZ4IiwKICAgICAgICAgICAgICAgICJhcmdzIjogWyJtY3Atc2VydmVyLXNoZWxsIiwgIi0tYWxsb3ctY29tbWFuZHMiLCAicHl0aG9uMyJdLAogICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogImFuZ3Igc3ltYm9saWMgZXhlY3V0aW9uIOKAlCBiaW5hcnkgYW5hbHlzaXMsIHBhdGggZXhwbG9yYXRpb24sIGNvbnN0cmFpbnQgc29sdmluZyIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInJhZG9uLWNvbXBsZXhpdHkiOiB7CiAgICAgICAgICAgICAgICAiY29tbWFuZCI6ICJ1dngiLAogICAgICAgICAgICAgICAgImFyZ3MiOiBbIm1jcC1zZXJ2ZXItc2hlbGwiLCAiLS1hbGxvdy1jb21tYW5kcyIsICJyYWRvbiJdLAogICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlJhZG9uIEFTVCBjb21wbGV4aXR5IGFuYWx5c2lzIOKAlCBjeWNsb21hdGljIGNvbXBsZXhpdHksIGF0dGFjayBzdXJmYWNlIHJhbmtpbmciCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJydWZmLWxpbnRlciI6IHsKICAgICAgICAgICAgICAgICJjb21tYW5kIjogInV2eCIsCiAgICAgICAgICAgICAgICAiYXJncyI6IFsibWNwLXNlcnZlci1zaGVsbCIsICItLWFsbG93LWNvbW1hbmRzIiwgInJ1ZmYiXSwKICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJSdWZmIHVsdHJhLWZhc3QgUHl0aG9uIGxpbnRlciDigJQgYW50aS1wYXR0ZXJucyBjb3JyZWxhdGluZyB3aXRoIHNlY3VyaXR5IGJ1Z3MiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJhaWRlci1wYXRjaGVyIjogewogICAgICAgICAgICAgICAgImNvbW1hbmQiOiAidXZ4IiwKICAgICAgICAgICAgICAgICJhcmdzIjogWyJtY3Atc2VydmVyLXNoZWxsIiwgIi0tYWxsb3ctY29tbWFuZHMiLCAiYWlkZXIiXSwKICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBaWRlciBBSSBjb2RlIGVkaXRvciDigJQgYXBwbGllcyBMTE0tZ2VuZXJhdGVkIHBhdGNoZXMgd2l0aCBkaWZmIHZlcmlmaWNhdGlvbiBhbmQgdGVzdCByZS1ydW4iLAogICAgICAgICAgICAgICAgImVudiI6IHsiT1BFTlJPVVRFUl9BUElfS0VZIjogX29wZW5yb3V0ZXJfa2V5fQogICAgICAgICAgICB9LAogICAgICAgICAgICAiY3ZlLWludGVsbGlnZW5jZSI6IHsKICAgICAgICAgICAgICAgICJjb21tYW5kIjogInV2eCIsCiAgICAgICAgICAgICAgICAiYXJncyI6IFsibWNwLXNlcnZlci1mZXRjaCJdLAogICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk5WRC9OSVNUIENWRSBBUEkg4oCUIGZ1bGwgQ1ZFIGRldGFpbHMsIENWU1MgdmVjdG9ycywgQ1dFIG1hcHBpbmdzLCBhZmZlY3RlZCB2ZXJzaW9ucyIsCiAgICAgICAgICAgICAgICAiZW52IjogewogICAgICAgICAgICAgICAgICAgICJGRVRDSF9BTExPV0VEX0RPTUFJTlMiOiAoCiAgICAgICAgICAgICAgICAgICAgICAgICJudmQubmlzdC5nb3YsY3ZlLm9yZyxjdmUubWl0cmUub3JnLHd3dy5jdmVkZXRhaWxzLmNvbSwiCiAgICAgICAgICAgICAgICAgICAgICAgICJ2dWxuZXJzLmNvbSxvc3YuZGV2LG9wZW5jdmUuaW8iCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICAiTlZEX0FQSV9LRVkiOiBfbnZkX2tleQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICAiYm91bnR5LXBsYXRmb3JtIjogewogICAgICAgICAgICAgICAgImNvbW1hbmQiOiAidXZ4IiwKICAgICAgICAgICAgICAgICJhcmdzIjogWyJtY3Atc2VydmVyLWZldGNoIl0sCiAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQnVnIGJvdW50eSBBUElzIOKAlCBIYWNrZXJPbmUgcmVwb3J0IHN1Ym1pc3Npb24sIEdpdEh1YiBTZWN1cml0eSBBZHZpc29yaWVzLCBCdWdjcm93ZCIsCiAgICAgICAgICAgICAgICAiZW52IjogewogICAgICAgICAgICAgICAgICAgICJGRVRDSF9BTExPV0VEX0RPTUFJTlMiOiAoCiAgICAgICAgICAgICAgICAgICAgICAgICJhcGkuaGFja2Vyb25lLmNvbSxhcGkuYnVnY3Jvd2QuY29tLGFwaS5pbnRpZ3JpdGkuY29tLCIKICAgICAgICAgICAgICAgICAgICAgICAgImFwaS55ZXN3ZWhhY2suY29tLGFwaS5naXRodWIuY29tIgogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgIkhBQ0tFUk9ORV9BUElfVE9LRU4iOiBfaGFja2Vyb25lX3Rva2VuLAogICAgICAgICAgICAgICAgICAgICJIQUNLRVJPTkVfQVBJX0tFWSI6IF9oYWNrZXJvbmVfa2V5CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJzdXBwbHktY2hhaW4tbW9uaXRvciI6IHsKICAgICAgICAgICAgICAgICJjb21tYW5kIjogInV2eCIsCiAgICAgICAgICAgICAgICAiYXJncyI6IFsibWNwLXNlcnZlci1mZXRjaCJdLAogICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlN1cHBseSBjaGFpbiBzZWN1cml0eSDigJQgUHlQSSB0eXBvc3F1YXR0aW5nLCBkZXBlbmRlbmN5IGNvbmZ1c2lvbiwgbWFsaWNpb3VzIHBhY2thZ2VzIiwKICAgICAgICAgICAgICAgICJlbnYiOiB7CiAgICAgICAgICAgICAgICAgICAgIkZFVENIX0FMTE9XRURfRE9NQUlOUyI6ICgKICAgICAgICAgICAgICAgICAgICAgICAgInB5cGkub3JnLGFwaS5weXBpLm9yZyxyZWdpc3RyeS5ucG1qcy5vcmcsY3JhdGVzLmlvLCIKICAgICAgICAgICAgICAgICAgICAgICAgImRlcHMuZGV2LHNvY2tldC5kZXYsYXBpLnNvY2tldC5kZXYiCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgIH0KICAgIH0KICAgIG9zLm1ha2VkaXJzKG9zLnBhdGguZGlybmFtZShNQ1BfUlVOVElNRV9DT05GSUcpLCBleGlzdF9vaz1UcnVlKQogICAgd2l0aCBvcGVuKE1DUF9SVU5USU1FX0NPTkZJRywgInciKSBhcyBmOgogICAgICAgIGpzb24uZHVtcChjb25maWcsIGYsIGluZGVudD0yKQogICAgb3MuY2htb2QoTUNQX1JVTlRJTUVfQ09ORklHLCAwbzYwMCkKICAgIHVpX2xvZyhmIk1DUCBjb25maWcgd3JpdHRlbjoge2xlbihjb25maWdbJ21jcFNlcnZlcnMnXSl9IHNlcnZlcnMg4oaSIHtNQ1BfUlVOVElNRV9DT05GSUd9IiwgIklORk8iKQogICAgcmV0dXJuIE1DUF9SVU5USU1FX0NPTkZJRwoKCmRlZiBzYWZlX2dpdF9wdWxsKCk6CiAgICBfLCBjb2RlID0gcnVuX3N1YnByb2Nlc3Nfc2FmZShbImdpdCIsICJwdWxsIiwgIi0tZmYtb25seSIsICJvcmlnaW4iLCAibWFpbiJdLCBjd2Q9UkVQT19ESVIsIHJhaXNlX29uX2Vycm9yPUZhbHNlKQogICAgaWYgY29kZSAhPSAwOgogICAgICAgIHJ1bl9zdWJwcm9jZXNzX3NhZmUoWyJnaXQiLCAiZmV0Y2giLCAib3JpZ2luIl0sIGN3ZD1SRVBPX0RJUikKICAgICAgICBydW5fc3VicHJvY2Vzc19zYWZlKFsiZ2l0IiwgInJlc2V0IiwgIi0taGFyZCIsICJvcmlnaW4vbWFpbiJdLCBjd2Q9UkVQT19ESVIpCiAgICAgICAgcnVuX3N1YnByb2Nlc3Nfc2FmZShbImdpdCIsICJjbGVhbiIsICItZmQiXSwgY3dkPVJFUE9fRElSKQoKCmRlZiBjbGVhbnVwX3N0YWxlX2JyYW5jaChicmFuY2hfbmFtZTogc3RyKToKICAgIHJ1bl9zdWJwcm9jZXNzX3NhZmUoWyJnaXQiLCAiYnJhbmNoIiwgIi1EIiwgYnJhbmNoX25hbWVdLCBjd2Q9UkVQT19ESVIsIHJhaXNlX29uX2Vycm9yPUZhbHNlKQogICAgcnVuX3N1YnByb2Nlc3Nfc2FmZShbImdpdCIsICJwdXNoIiwgIm9yaWdpbiIsICItLWRlbGV0ZSIsIGJyYW5jaF9uYW1lXSwgY3dkPVJFUE9fRElSLCByYWlzZV9vbl9lcnJvcj1GYWxzZSkKCgpkZWYgY3JlYXRlX2ZpeF9icmFuY2goYnJhbmNoX25hbWU6IHN0cikgLT4gYm9vbDoKICAgIHJ1bl9zdWJwcm9jZXNzX3NhZmUoWyJnaXQiLCAiY2hlY2tvdXQiLCAibWFpbiJdLCBjd2Q9UkVQT19ESVIsIHJhaXNlX29uX2Vycm9yPUZhbHNlKQogICAgcnVuX3N1YnByb2Nlc3Nfc2FmZShbImdpdCIsICJwdWxsIiwgIi0tZmYtb25seSIsICJvcmlnaW4iLCAibWFpbiJdLCBjd2Q9UkVQT19ESVIsIHJhaXNlX29uX2Vycm9yPUZhbHNlKQogICAgcnVuX3N1YnByb2Nlc3Nfc2FmZShbImdpdCIsICJicmFuY2giLCAiLUQiLCBicmFuY2hfbmFtZV0sIGN3ZD1SRVBPX0RJUiwgcmFpc2Vfb25fZXJyb3I9RmFsc2UpCiAgICBfLCBjb2RlID0gcnVuX3N1YnByb2Nlc3Nfc2FmZShbImdpdCIsICJjaGVja291dCIsICItYiIsIGJyYW5jaF9uYW1lXSwgY3dkPVJFUE9fRElSLCByYWlzZV9vbl9lcnJvcj1GYWxzZSkKICAgIHJldHVybiBjb2RlID09IDAKCgpkZWYgZW5zdXJlX2ZpeF9jb21taXR0ZWQodGVzdF9wYXRoOiBzdHIpIC0+IE5vbmU6CiAgICBzdGF0dXMsIF8gPSBydW5fc3VicHJvY2Vzc19zYWZlKFsiZ2l0IiwgInN0YXR1cyIsICItLXBvcmNlbGFpbiJdLCBjd2Q9UkVQT19ESVIsIHJhaXNlX29uX2Vycm9yPUZhbHNlKQogICAgaWYgbm90IHN0YXR1cy5zdHJpcCgpOgogICAgICAgIHJldHVybgogICAgcnVuX3N1YnByb2Nlc3Nfc2FmZShbImdpdCIsICJhZGQiLCAiLiJdLCBjd2Q9UkVQT19ESVIsIHJhaXNlX29uX2Vycm9yPUZhbHNlKQogICAgbWVzc2FnZSA9IGYiW1Job2Rhd2tdIEF1dG8taGVhbCB7b3MucGF0aC5iYXNlbmFtZSh0ZXN0X3BhdGgpfSIKICAgIHJ1bl9zdWJwcm9jZXNzX3NhZmUoWyJnaXQiLCAiY29tbWl0IiwgIi1tIiwgbWVzc2FnZV0sIGN3ZD1SRVBPX0RJUiwgcmFpc2Vfb25fZXJyb3I9RmFsc2UpCgoKZGVmIHB1c2hfZml4X2JyYW5jaChicmFuY2hfbmFtZTogc3RyKSAtPiBib29sOgogICAgXywgY29kZSA9IHJ1bl9zdWJwcm9jZXNzX3NhZmUoWyJnaXQiLCAicHVzaCIsICItdSIsICJvcmlnaW4iLCBicmFuY2hfbmFtZV0sIGN3ZD1SRVBPX0RJUiwgcmFpc2Vfb25fZXJyb3I9RmFsc2UpCiAgICByZXR1cm4gY29kZSA9PSAwCgoKZGVmIGNyZWF0ZV9naXRodWJfcHIocmVwbzogc3RyLCBicmFuY2g6IHN0ciwgdGVzdF9wYXRoOiBzdHIsIHRva2VuOiBzdHIpIC0+IHN0cjoKICAgIGhlYWRlcnMgPSB7CiAgICAgICAgIkF1dGhvcml6YXRpb24iOiBmIkJlYXJlciB7dG9rZW59IiwKICAgICAgICAiQWNjZXB0IjogImFwcGxpY2F0aW9uL3ZuZC5naXRodWIranNvbiIsCiAgICAgICAgIlgtR2l0SHViLUFQSS1WZXJzaW9uIjogIjIwMjItMTEtMjgiLAogICAgfQogICAgcGF5bG9hZCA9IHsKICAgICAgICAidGl0bGUiOiBmIltSaG9kYXdrXSBBdXRvLWhlYWw6IHtvcy5wYXRoLmJhc2VuYW1lKHRlc3RfcGF0aCl9IiwKICAgICAgICAiaGVhZCI6IGJyYW5jaCwKICAgICAgICAiYmFzZSI6ICJtYWluIiwKICAgICAgICAiYm9keSI6ICgKICAgICAgICAgICAgIiMjIFJob2Rhd2sgQUkgQXV0b25vbW91cyBGaXhcblxuIgogICAgICAgICAgICAiVGhpcyBQUiB3YXMgZ2VuZXJhdGVkIGF1dG9ub21vdXNseSBieSBSaG9kYXdrIEFJIHYzLjAuXG4iCiAgICAgICAgICAgICItIFRlc3RzIHZlcmlmaWVkIGdyZWVuIGFmdGVyIGZpeFxuIgogICAgICAgICAgICAiLSBTQVNUIGdhdGUgcGFzc2VkXG4iCiAgICAgICAgICAgICItIFN1cHBseSBjaGFpbiBnYXRlIHBhc3NlZFxuIgogICAgICAgICAgICAiLSBBZHZlcnNhcmlhbCBMTE0gcmV2aWV3IGNvbXBsZXRlZFxuXG4iCiAgICAgICAgICAgIGYiKipUZXN0IGZpeGVkOioqIGB7dGVzdF9wYXRofWBcbiIKICAgICAgICApLAogICAgICAgICJkcmFmdCI6IEZhbHNlLAogICAgfQogICAgcmVzcCA9IHJlcXVlc3RzLnBvc3QoCiAgICAgICAgZiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL3tyZXBvfS9wdWxscyIsCiAgICAgICAgaGVhZGVycz1oZWFkZXJzLAogICAgICAgIGpzb249cGF5bG9hZCwKICAgICAgICB0aW1lb3V0PTMwLAogICAgKQogICAgcmVzcC5yYWlzZV9mb3Jfc3RhdHVzKCkKICAgIHJldHVybiByZXNwLmpzb24oKVsiaHRtbF91cmwiXQoKCmRlZiBnZXRfY3VycmVudF9kaWZmKCkgLT4gc3RyOgogICAgdHJ5OgogICAgICAgIGRpZmYsIF8gPSBydW5fc3VicHJvY2Vzc19zYWZlKFsiZ2l0IiwgImRpZmYiLCAiSEVBRH4xIiwgIkhFQUQiLCAiLS11bmlmaWVkPTMiXSwgY3dkPVJFUE9fRElSLCByYWlzZV9vbl9lcnJvcj1GYWxzZSkKICAgICAgICByZXR1cm4gZGlmZgogICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICB0cnk6CiAgICAgICAgICAgIGRpZmYsIF8gPSBydW5fc3VicHJvY2Vzc19zYWZlKFsiZ2l0IiwgImRpZmYiLCAiLS11bmlmaWVkPTMiXSwgY3dkPVJFUE9fRElSLCByYWlzZV9vbl9lcnJvcj1GYWxzZSkKICAgICAgICAgICAgcmV0dXJuIGRpZmYKICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICByZXR1cm4gIiIKCgpkZWYgZ2V0X2NoYW5nZWRfZmlsZXMoKSAtPiBsaXN0W3N0cl06CiAgICB0cnk6CiAgICAgICAgb3V0LCBfID0gcnVuX3N1YnByb2Nlc3Nfc2FmZShbImdpdCIsICJkaWZmIiwgIi0tbmFtZS1vbmx5IiwgIkhFQUR+MSIsICJIRUFEIl0sIGN3ZD1SRVBPX0RJUiwgcmFpc2Vfb25fZXJyb3I9RmFsc2UpCiAgICAgICAgcmV0dXJuIFtmLnN0cmlwKCkgZm9yIGYgaW4gb3V0LnNwbGl0bGluZXMoKSBpZiBmLnN0cmlwKCldCiAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgIHJldHVybiBbXQoKCmRlZiBzZXR1cF90YXJnZXRfdmVudigpIC0+IHN0cjoKICAgIGltcG9ydCBzeXMgYXMgX3N5cwoKICAgICMgRklYOiBlbnN1cmUgL2RhdGEgKFBFUlNJU1RFTlRfRElSKSBleGlzdHMgYmVmb3JlIHdyaXRpbmcgaW50byBpdC4KICAgIG9zLm1ha2VkaXJzKFBFUlNJU1RFTlRfRElSLCBleGlzdF9vaz1UcnVlKQoKICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhWRU5WX0RJUik6CiAgICAgICAgdWlfbG9nKCJDcmVhdGluZyBpc29sYXRlZCB2aXJ0dWFsZW52IHZpYSB1di4uLiIpCiAgICAgICAgIyBGSVg6IHBhc3MgLS1weXRob24gZXhwbGljaXRseTsgd2l0aG91dCBpdCB1diBleGl0cyAyIG9uIFNwYWNlIHJlc3RhcnRzCiAgICAgICAgIyB3aGVuIGl0cyBtYW5hZ2VkLVB5dGhvbiBjYWNoZSBpcyBjb2xkIG9yIFVWX1BZVEhPTiBpcyB1bnJlc29sdmFibGUuCiAgICAgICAgXywgY29kZSA9IHJ1bl9zdWJwcm9jZXNzX3NhZmUoCiAgICAgICAgICAgIFsidXYiLCAidmVudiIsICItLXB5dGhvbiIsIF9zeXMuZXhlY3V0YWJsZSwgVkVOVl9ESVJdLAogICAgICAgICAgICBjd2Q9Ii90bXAiLCByYWlzZV9vbl9lcnJvcj1GYWxzZSwKICAgICAgICApCiAgICAgICAgaWYgY29kZSAhPSAwOgogICAgICAgICAgICAjIEZJWDogZmFsbGJhY2sgdG8gc3RkbGliIHZlbnYgc28gdGhlIGF1ZGl0IGNhbiBjb250aW51ZSBldmVuIHdoZW4KICAgICAgICAgICAgIyB1didzIFB5dGhvbiByZXNvbHV0aW9uIGZhaWxzIGluc2lkZSB0aGUgY29udGFpbmVyLgogICAgICAgICAgICB1aV9sb2coZiLimqDvuI8gIHV2IHZlbnYgZmFpbGVkIChleGl0IHtjb2RlfSkg4oCUIGZhbGxpbmcgYmFjayB0byBweXRob24gLW0gdmVudi4uLiIpCiAgICAgICAgICAgIHJ1bl9zdWJwcm9jZXNzX3NhZmUoCiAgICAgICAgICAgICAgICBbX3N5cy5leGVjdXRhYmxlLCAiLW0iLCAidmVudiIsIFZFTlZfRElSXSwKICAgICAgICAgICAgICAgIGN3ZD0iL3RtcCIsIHJhaXNlX29uX2Vycm9yPVRydWUsCiAgICAgICAgICAgICkKCiAgICBweXRlc3RfYmluID0gb3MucGF0aC5qb2luKFZFTlZfRElSLCAiYmluIiwgInB5dGVzdCIpCiAgICByZXFfcGF0aCA9IG9zLnBhdGguam9pbihSRVBPX0RJUiwgInJlcXVpcmVtZW50cy50eHQiKQogICAgaWYgb3MucGF0aC5leGlzdHMocmVxX3BhdGgpOgogICAgICAgIHVpX2xvZygiSW5zdGFsbGluZyB0YXJnZXQgcmVwbyBkZXBzIHZpYSB1di4uLiIpCiAgICAgICAgcnVuX3N1YnByb2Nlc3Nfc2FmZSgKICAgICAgICAgICAgWyJ1diIsICJwaXAiLCAiaW5zdGFsbCIsICItLXB5dGhvbiIsIFZFTlZfRElSLCAiLS1xdWlldCIsICItciIsIHJlcV9wYXRoXSwKICAgICAgICAgICAgY3dkPVJFUE9fRElSLCB0aW1lb3V0PTYwMCwgcmFpc2Vfb25fZXJyb3I9RmFsc2UsCiAgICAgICAgKQogICAgcmV0dXJuIHB5dGVzdF9iaW4KCgojIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAojIEFJREVSIFJVTk5FUgojIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgApkZWYgcnVuX2FpZGVyKG1jcF9jb25maWdfcGF0aDogc3RyLCBwcm9tcHQ6IHN0ciwgY29udGV4dF9maWxlczogbGlzdFtzdHJdKSAtPiB0dXBsZVtzdHIsIGludF06CiAgICBmZCwgcHJvbXB0X3BhdGggPSB0ZW1wZmlsZS5ta3N0ZW1wKHByZWZpeD0iYWlkZXJfcHJvbXB0XyIsIHN1ZmZpeD0iLnR4dCIpCiAgICB0cnk6CiAgICAgICAgd2l0aCBvcy5mZG9wZW4oZmQsICJ3IikgYXMgZjoKICAgICAgICAgICAgZi53cml0ZShwcm9tcHQpCiAgICAgICAgdmFsaWQgPSBbZiBmb3IgZiBpbiBjb250ZXh0X2ZpbGVzIGlmIG9zLnBhdGguZXhpc3RzKG9zLnBhdGguam9pbihSRVBPX0RJUiwgZikpXQogICAgICAgIGNtZCA9IFsiYWlkZXIiLCAiLS1tb2RlbCIsIE1PREVMLCAiLS15ZXMiLCAiLS1uby1zdHJlYW0iLAogICAgICAgICAgICAgICAiLS1tZXNzYWdlLWZpbGUiLCBwcm9tcHRfcGF0aF0KICAgICAgICBpZiBtY3BfY29uZmlnX3BhdGggYW5kIG9zLnBhdGguZXhpc3RzKG1jcF9jb25maWdfcGF0aCk6CiAgICAgICAgICAgIGNtZCArPSBbIi0tbWNwLWNvbmZpZyIsIG1jcF9jb25maWdfcGF0aF0KICAgICAgICBjbWQgKz0gdmFsaWQKICAgICAgICByZXR1cm4gcnVuX3N1YnByb2Nlc3Nfc2FmZShjbWQsIGN3ZD1SRVBPX0RJUiwgdGltZW91dD02MDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52X292ZXJyaWRlcz17Ik9QRU5ST1VURVJfQVBJX0tFWSI6IE9QRU5ST1VURVJfQVBJX0tFWX0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2Vfb25fZXJyb3I9RmFsc2UpCiAgICBmaW5hbGx5OgogICAgICAgIHRyeToKICAgICAgICAgICAgb3MudW5saW5rKHByb21wdF9wYXRoKQogICAgICAgIGV4Y2VwdCBPU0Vycm9yOgogICAgICAgICAgICBwYXNzCgoKIyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKIyBUSEUgRlVMTCBMT09QCiMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACmRlZiBwcm9jZXNzX2ZhaWxpbmdfdGVzdCgKICAgIHRlc3RfcGF0aDogc3RyLAogICAgaW5pdGlhbF9mYWlsdXJlOiBzdHIsCiAgICBlbnZfY29uZmlnOiBFbnZDb25maWcsCiAgICBtY3BfY29uZmlnX3BhdGg6IHN0ciwKICAgIGpvYl9pZDogc3RyLAogICAgYnJhbmNoX25hbWU6IHN0ciwKICAgIHRhcmdldF9yZXBvOiBzdHIgPSAiIiwgICAgICAgICAgIyDihpAgYWRkZWQ6IHBhc3NlZCBmcm9tIGF1ZGl0IGxvb3AKKSAtPiBWZXJpZmljYXRpb25SZXN1bHQ6CiAgICAiIiIKICAgIENvcmUgYXV0b25vbW91cyBoZWFsaW5nIGxvb3A6CiAgICAgIG1lbW9yeSByZXRyaWV2YWwg4oaSIGFpZGVyIGZpeCDihpIgdGVzdCB2ZXJpZmljYXRpb24g4oaSIGFkdmVyc2FyaWFsIHJldmlldwogICAgICDihpIgU0FTVCBnYXRlIOKGkiBzdXBwbHkgY2hhaW4gZ2F0ZSDihpIgUFIgb3BlbgogICAgUmV0cmllcyB1cCB0byBNQVhfUkVUUklFUyB3aXRoIGFjY3VtdWxhdGluZyBjb250ZXh0LgogICAgIiIiCiAgICByZXBvX3JlZiA9IHRhcmdldF9yZXBvIG9yIEdJVEhVQl9SRVBPICAgIyBmYWxsIGJhY2sgdG8gZW52IHZhciBpZiBub3Qgc3VwcGxpZWQKICAgIGZpbGVuYW1lID0gb3MucGF0aC5iYXNlbmFtZSh0ZXN0X3BhdGgpCiAgICBzcmNfZmlsZSA9IHRlc3RfcGF0aC5yZXBsYWNlKCJ0ZXN0XyIsICIiKQogICAgY29udGV4dF9maWxlcyA9IFt0ZXN0X3BhdGhdCgogICAgaWYgb3MucGF0aC5leGlzdHMob3MucGF0aC5qb2luKFJFUE9fRElSLCBzcmNfZmlsZSkpOgogICAgICAgIGNvbnRleHRfZmlsZXMuYXBwZW5kKHNyY19maWxlKQogICAgZWxzZToKICAgICAgICBmYWxsYmFja19zcmMgPSBmInNyYy97ZmlsZW5hbWUucmVwbGFjZSgndGVzdF8nLCAnJyl9IgogICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKG9zLnBhdGguam9pbihSRVBPX0RJUiwgZmFsbGJhY2tfc3JjKSk6CiAgICAgICAgICAgIHNyY19maWxlID0gZmFsbGJhY2tfc3JjCiAgICAgICAgICAgIGNvbnRleHRfZmlsZXMuYXBwZW5kKHNyY19maWxlKQoKICAgIGlmIG9zLnBhdGguZXhpc3RzKG9zLnBhdGguam9pbihSRVBPX0RJUiwgInJlcXVpcmVtZW50cy50eHQiKSk6CiAgICAgICAgY29udGV4dF9maWxlcy5hcHBlbmQoInJlcXVpcmVtZW50cy50eHQiKQoKICAgIGF0dGVtcHRfaGlzdG9yeTogbGlzdFtWZXJpZmljYXRpb25BdHRlbXB0XSA9IFtdCiAgICBjdXJyZW50X2ZhaWx1cmUgPSBpbml0aWFsX2ZhaWx1cmUKCiAgICBjbGVhbnVwX3N0YWxlX2JyYW5jaChicmFuY2hfbmFtZSkKICAgIGlmIG5vdCBjcmVhdGVfZml4X2JyYW5jaChicmFuY2hfbmFtZSk6CiAgICAgICAgcmV0dXJuIFZlcmlmaWNhdGlvblJlc3VsdCgKICAgICAgICAgICAgc3VjY2Vzcz1GYWxzZSwKICAgICAgICAgICAgYXR0ZW1wdHM9YXR0ZW1wdF9oaXN0b3J5LAogICAgICAgICAgICBmYWlsdXJlX3JlYXNvbj1mIlVuYWJsZSB0byBjcmVhdGUgZml4IGJyYW5jaCB7YnJhbmNoX25hbWV9IiwKICAgICAgICApCgogICAgbWF4X3RvdGFsX2F0dGVtcHRzID0gTUFYX1JFVFJJRVMgKyBtYXgoMCwgQURWRVJTQVJJQUxfUkVKRUNUSU9OX01VTFRJUExJRVIpCiAgICBmb3IgYXR0ZW1wdF9udW0gaW4gcmFuZ2UoMSwgbWF4X3RvdGFsX2F0dGVtcHRzICsgMSk6CiAgICAgICAgdWlfbG9nKGYiQXR0ZW1wdCB7YXR0ZW1wdF9udW19L3ttYXhfdG90YWxfYXR0ZW1wdHN9OiB7dGVzdF9wYXRofSIsICJSRVRSWSIgaWYgYXR0ZW1wdF9udW0gPiAxIGVsc2UgIklORk8iKQoKICAgICAgICAjIOKUgOKUgCBTdGVwIDE6IFJldHJpZXZlIHNpbWlsYXIgZml4ZXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICAgICAgdHJ5OgogICAgICAgICAgICBzaW1pbGFyX2ZpeGVzID0gcmV0cmlldmVfc2ltaWxhcl9maXhlc192MihjdXJyZW50X2ZhaWx1cmUsIHRvcF9rPTMpCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgc2ltaWxhcl9maXhlcyA9IHJldHJpZXZlX3NpbWlsYXJfZml4ZXMoY3VycmVudF9mYWlsdXJlLCB0b3Bfaz0zKQogICAgICAgIGlmIHNpbWlsYXJfZml4ZXM6CiAgICAgICAgICAgIHVpX2xvZyhmIk1lbW9yeTogZm91bmQge2xlbihzaW1pbGFyX2ZpeGVzKX0gc2ltaWxhciBwYXN0IGZpeChlcykgKGJlc3Qgc2ltaWxhcml0eToge3NpbWlsYXJfZml4ZXNbMF1bJ3NpbWlsYXJpdHknXX0pIiwgIk1FTSIpCgogICAgICAgICMg4pSA4pSAIFN0ZXAgMjogQnVpbGQgcHJvbXB0IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgICAgIGlmIGF0dGVtcHRfbnVtID09IDE6CiAgICAgICAgICAgIHByb21wdCA9IGJ1aWxkX2luaXRpYWxfcHJvbXB0KHRlc3RfcGF0aCwgc3JjX2ZpbGUsIGJyYW5jaF9uYW1lLCBjdXJyZW50X2ZhaWx1cmUsIHNpbWlsYXJfZml4ZXMsIHJlcG9fZGlyPVJFUE9fRElSKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHByb21wdCA9IGJ1aWxkX3JldHJ5X3Byb21wdCh0ZXN0X3BhdGgsIHNyY19maWxlLCBicmFuY2hfbmFtZSwgaW5pdGlhbF9mYWlsdXJlLCBhdHRlbXB0X2hpc3RvcnksIHNpbWlsYXJfZml4ZXMsIHJlcG9fZGlyPVJFUE9fRElSKQoKICAgICAgICBwcm9tcHRfaGFzaCA9IGhhc2hsaWIuc2hhMjU2KHByb21wdC5lbmNvZGUoKSkuaGV4ZGlnZXN0KClbOjE2XQoKICAgICAgICBsb2dfYXVkaXRfZXZlbnQoIkFJREVSX0RJU1BBVENIIiwgam9iX2lkLCByZXBvX3JlZiwgTU9ERUwsIHsKICAgICAgICAgICAgInRlc3QiOiB0ZXN0X3BhdGgsICJhdHRlbXB0IjogYXR0ZW1wdF9udW0sICJwcm9tcHRfaGFzaCI6IHByb21wdF9oYXNoLAogICAgICAgICAgICAibWVtb3J5X2hpdHMiOiBsZW4oc2ltaWxhcl9maXhlcyksCiAgICAgICAgfSwgIkRJU1BBVENIRUQiKQoKICAgICAgICAjIOKUgOKUgCBTdGVwIDM6IFJ1biBBaWRlciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgICAgICBhaWRlcl9vdXRwdXQsIGFpZGVyX2NvZGUgPSBydW5fYWlkZXIobWNwX2NvbmZpZ19wYXRoLCBwcm9tcHQsIGNvbnRleHRfZmlsZXMpCgogICAgICAgIGlmIGFpZGVyX2NvZGUgIT0gMDoKICAgICAgICAgICAgdWlfbG9nKGYiQWlkZXIgbm9uLXplcm8gZXhpdCBvbiBhdHRlbXB0IHthdHRlbXB0X251bX0iLCAiV0FSTiIpCiAgICAgICAgICAgIHVpX2xvZyhmIkFJREVSIENSQVNIIFJFQVNPTjoge2FpZGVyX291dHB1dC5zdHJpcCgpWzo4MDBdfSIsICJGQUlMIikKICAgICAgICAgICAgYXR0ZW1wdF9oaXN0b3J5LmFwcGVuZChWZXJpZmljYXRpb25BdHRlbXB0KAogICAgICAgICAgICAgICAgYXR0ZW1wdF9udW1iZXI9YXR0ZW1wdF9udW0sIHByb21wdF9oYXNoPXByb21wdF9oYXNoLAogICAgICAgICAgICAgICAgYWlkZXJfZXhpdF9jb2RlPWFpZGVyX2NvZGUsIHRlc3RfZXhpdF9jb2RlPS0xLAogICAgICAgICAgICAgICAgdGVzdF9vdXRwdXQ9IkFpZGVyIGZhaWxlZCB0byBwcm9kdWNlIG91dHB1dCIsIGRpZmZfcHJvZHVjZWQ9IiIsCiAgICAgICAgICAgICkpCiAgICAgICAgICAgIHJlY29yZF9maXhfb3V0Y29tZShjdXJyZW50X2ZhaWx1cmUsIHRlc3RfcGF0aCwgIiIsIHN1Y2Nlc3M9RmFsc2UpCiAgICAgICAgICAgIGlmIGF0dGVtcHRfbnVtIDwgbWF4X3RvdGFsX2F0dGVtcHRzOgogICAgICAgICAgICAgICAgdGltZS5zbGVlcCg1KQogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgcmV0dXJuIFZlcmlmaWNhdGlvblJlc3VsdChzdWNjZXNzPUZhbHNlLCBhdHRlbXB0cz1hdHRlbXB0X2hpc3RvcnksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFpbHVyZV9yZWFzb249ZiJBaWRlciBmYWlsZWQgb24gYWxsIHtNQVhfUkVUUklFU30gYXR0ZW1wdHMiKQoKICAgICAgICAjIOKUgOKUgCBTdGVwIDQ6IEdldCBkaWZmIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgICAgIGRpZmZfdGV4dCA9IGdldF9jdXJyZW50X2RpZmYoKQogICAgICAgIGNoYW5nZWRfZmlsZXMgPSBnZXRfY2hhbmdlZF9maWxlcygpCgogICAgICAgICMg4pSA4pSAIFN0ZXAgNTogUkUtUlVOIFRFU1RTIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgICAgIHVpX2xvZyhmIlZlcmlmeWluZyBmaXgg4oCUIHJlLXJ1bm5pbmcgdGVzdHMgKGF0dGVtcHQge2F0dGVtcHRfbnVtfSkuLi4iLCAiSU5GTyIpCiAgICAgICAgdGVzdF9vdXRwdXQsIHRlc3RfY29kZSA9IF9hY3RpdmVfcnVudGltZS5ydW5fdGVzdHMoCiAgICAgICAgICAgIHRlc3RfcGF0aCwgUkVQT19ESVIsIGVudl9jb25maWcsIHRpbWVvdXQ9MTIwCiAgICAgICAgKQoKICAgICAgICBhdHRlbXB0ID0gVmVyaWZpY2F0aW9uQXR0ZW1wdCgKICAgICAgICAgICAgYXR0ZW1wdF9udW1iZXI9YXR0ZW1wdF9udW0sIHByb21wdF9oYXNoPXByb21wdF9oYXNoLAogICAgICAgICAgICBhaWRlcl9leGl0X2NvZGU9YWlkZXJfY29kZSwgdGVzdF9leGl0X2NvZGU9dGVzdF9jb2RlLAogICAgICAgICAgICB0ZXN0X291dHB1dD10ZXN0X291dHB1dCwgZGlmZl9wcm9kdWNlZD1kaWZmX3RleHQsCiAgICAgICAgKQogICAgICAgIGF0dGVtcHRfaGlzdG9yeS5hcHBlbmQoYXR0ZW1wdCkKCiAgICAgICAgIyDilIDilIAgU3RlcCA2OiBTQVNUIGdhdGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICAgICAgdWlfbG9nKCJSdW5uaW5nIFNBU1QgZ2F0ZSBvbiBBSSBkaWZmLi4uIiwgIlNBU1QiKQogICAgICAgIHNhc3RfcmVwb3J0ID0gX2FjdGl2ZV9ydW50aW1lLnJ1bl9zYXN0KGRpZmZfdGV4dCwgY2hhbmdlZF9maWxlcywgUkVQT19ESVIpCiAgICAgICAgbG9nX2F1ZGl0X2V2ZW50KCJTQVNUX1NDQU4iLCBqb2JfaWQsIHJlcG9fcmVmLCBNT0RFTCwgewogICAgICAgICAgICAiYXR0ZW1wdCI6IGF0dGVtcHRfbnVtLCAicGFzc2VkIjogc2FzdF9yZXBvcnQucGFzc2VkLAogICAgICAgICAgICAiZmluZGluZ3MiOiBsZW4oc2FzdF9yZXBvcnQuZmluZGluZ3MpLCAiYmxvY2tlZF9yZWFzb24iOiBzYXN0X3JlcG9ydC5ibG9ja2VkX3JlYXNvbiwKICAgICAgICB9LCAiUEFTU0VEIiBpZiBzYXN0X3JlcG9ydC5wYXNzZWQgZWxzZSAiQkxPQ0tFRCIpCgogICAgICAgIGlmIG5vdCBzYXN0X3JlcG9ydC5wYXNzZWQ6CiAgICAgICAgICAgIHVpX2xvZyhmIlNBU1QgQkxPQ0tFRDoge3Nhc3RfcmVwb3J0LmJsb2NrZWRfcmVhc29ufSIsICJTQVNUIikKICAgICAgICAgICAgbm90aWZ5X3Nhc3RfYmxvY2tlZCh0ZXN0X3BhdGgsIHNhc3RfcmVwb3J0LmJsb2NrZWRfcmVhc29uKQogICAgICAgICAgICByZWNvcmRfZml4X291dGNvbWUoY3VycmVudF9mYWlsdXJlLCB0ZXN0X3BhdGgsIGRpZmZfdGV4dCwgc3VjY2Vzcz1GYWxzZSkKICAgICAgICAgICAgcnVuX3N1YnByb2Nlc3Nfc2FmZShbImdpdCIsICJjaGVja291dCIsICIuIl0sIGN3ZD1SRVBPX0RJUiwgcmFpc2Vfb25fZXJyb3I9RmFsc2UpCiAgICAgICAgICAgIGN1cnJlbnRfZmFpbHVyZSA9IGYiUHJldmlvdXMgZml4IHdhcyBTQVNULWJsb2NrZWQ6IHtzYXN0X3JlcG9ydC5ibG9ja2VkX3JlYXNvbn1cblxuT3JpZ2luYWwgZmFpbHVyZTpcbntpbml0aWFsX2ZhaWx1cmV9IgogICAgICAgICAgICBpZiBhdHRlbXB0X251bSA8IG1heF90b3RhbF9hdHRlbXB0czoKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIHJldHVybiBWZXJpZmljYXRpb25SZXN1bHQoc3VjY2Vzcz1GYWxzZSwgYXR0ZW1wdHM9YXR0ZW1wdF9oaXN0b3J5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhaWx1cmVfcmVhc29uPSJTQVNUIGdhdGUgYmxvY2tlZCBhbGwgYXR0ZW1wdHMiKQoKICAgICAgICAjIOKUgOKUgCBTdGVwIDc6IFN1cHBseSBjaGFpbiBnYXRlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgICAgIHVpX2xvZygiUnVubmluZyBzdXBwbHkgY2hhaW4gZ2F0ZS4uLiIsICJTVVBQTFkiKQogICAgICAgIHNjX3JlcG9ydCA9IF9hY3RpdmVfcnVudGltZS5ydW5fc3VwcGx5X2NoYWluKGRpZmZfdGV4dCwgUkVQT19ESVIpCiAgICAgICAgbG9nX2F1ZGl0X2V2ZW50KCJTVVBQTFlfQ0hBSU5fU0NBTiIsIGpvYl9pZCwgcmVwb19yZWYsIE1PREVMLCB7CiAgICAgICAgICAgICJhdHRlbXB0IjogYXR0ZW1wdF9udW0sICJwYXNzZWQiOiBzY19yZXBvcnQucGFzc2VkLAogICAgICAgICAgICAibmV3X3BhY2thZ2VzIjogc2NfcmVwb3J0Lm5ld19wYWNrYWdlcywgImJsb2NrZWRfcmVhc29uIjogc2NfcmVwb3J0LmJsb2NrZWRfcmVhc29uLAogICAgICAgIH0sICJQQVNTRUQiIGlmIHNjX3JlcG9ydC5wYXNzZWQgZWxzZSAiQkxPQ0tFRCIpCgogICAgICAgIGlmIG5vdCBzY19yZXBvcnQucGFzc2VkOgogICAgICAgICAgICB1aV9sb2coZiJTVVBQTFkgQ0hBSU4gQkxPQ0tFRDoge3NjX3JlcG9ydC5ibG9ja2VkX3JlYXNvbn0iLCAiU1VQUExZIikKICAgICAgICAgICAgcnVuX3N1YnByb2Nlc3Nfc2FmZShbImdpdCIsICJjaGVja291dCIsICIuIl0sIGN3ZD1SRVBPX0RJUiwgcmFpc2Vfb25fZXJyb3I9RmFsc2UpCiAgICAgICAgICAgIGN1cnJlbnRfZmFpbHVyZSA9IGYiUHJldmlvdXMgZml4IGludHJvZHVjZWQgc3VwcGx5IGNoYWluIHJpc2s6IHtzY19yZXBvcnQuYmxvY2tlZF9yZWFzb259XG5cbk9yaWdpbmFsOlxue2luaXRpYWxfZmFpbHVyZX0iCiAgICAgICAgICAgIGlmIGF0dGVtcHRfbnVtIDwgbWF4X3RvdGFsX2F0dGVtcHRzOgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgcmV0dXJuIFZlcmlmaWNhdGlvblJlc3VsdChzdWNjZXNzPUZhbHNlLCBhdHRlbXB0cz1hdHRlbXB0X2hpc3RvcnksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFpbHVyZV9yZWFzb249IlN1cHBseSBjaGFpbiBnYXRlIGJsb2NrZWQgYWxsIGF0dGVtcHRzIikKCiAgICAgICAgIyDilIDilIAgU3RlcCA3YjogWjMgRk9STUFMIFZFUklGSUNBVElPTiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgICAgICB6M19yZXN1bHQgPSBydW5fZm9ybWFsX3ZlcmlmaWNhdGlvbihkaWZmX3RleHQpCiAgICAgICAgaWYgejNfcmVzdWx0WyJ2ZXJkaWN0Il0gPT0gIlVOU0FGRSI6CiAgICAgICAgICAgIHVpX2xvZyhmIlozIGZvcm1hbCB2ZXJpZmljYXRpb24gVU5TQUZFOiB7ejNfcmVzdWx0WydzdW1tYXJ5J119IiwgIlNBU1QiKQogICAgICAgICAgICBsb2dfYXVkaXRfZXZlbnQoIlozX1VOU0FGRSIsIGpvYl9pZCwgcmVwb19yZWYsIE1PREVMLCB7CiAgICAgICAgICAgICAgICAiYXR0ZW1wdCI6IGF0dGVtcHRfbnVtLCAiaXNzdWVzIjogejNfcmVzdWx0WyJpc3N1ZXMiXSwKICAgICAgICAgICAgICAgICJzdW1tYXJ5IjogejNfcmVzdWx0WyJzdW1tYXJ5Il0sCiAgICAgICAgICAgIH0sICJCTE9DS0VEIikKICAgICAgICAgICAgcmVjb3JkX2ZpeF9vdXRjb21lKGN1cnJlbnRfZmFpbHVyZSwgdGVzdF9wYXRoLCBkaWZmX3RleHQsIHN1Y2Nlc3M9RmFsc2UpCiAgICAgICAgICAgIHJ1bl9zdWJwcm9jZXNzX3NhZmUoWyJnaXQiLCAiY2hlY2tvdXQiLCAiLiJdLCBjd2Q9UkVQT19ESVIsIHJhaXNlX29uX2Vycm9yPUZhbHNlKQogICAgICAgICAgICBpc3N1ZXNfdGV4dCA9ICJcbiIuam9pbih6M19yZXN1bHRbImlzc3VlcyJdKQogICAgICAgICAgICBjdXJyZW50X2ZhaWx1cmUgPSAoCiAgICAgICAgICAgICAgICBmIllvdXIgcHJldmlvdXMgZml4IHdhcyBSRUpFQ1RFRCBieSBaMyBmb3JtYWwgdmVyaWZpY2F0aW9uLlxuIgogICAgICAgICAgICAgICAgZiJJc3N1ZXM6XG57aXNzdWVzX3RleHR9XG5cbiIKICAgICAgICAgICAgICAgIGYiT3JpZ2luYWw6XG57aW5pdGlhbF9mYWlsdXJlfSIKICAgICAgICAgICAgKQogICAgICAgICAgICBpZiBhdHRlbXB0X251bSA8IG1heF90b3RhbF9hdHRlbXB0czoKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIHJldHVybiBWZXJpZmljYXRpb25SZXN1bHQoc3VjY2Vzcz1GYWxzZSwgYXR0ZW1wdHM9YXR0ZW1wdF9oaXN0b3J5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhaWx1cmVfcmVhc29uPSJaMyBmb3JtYWwgdmVyaWZpY2F0aW9uIHJlamVjdGVkIGFsbCBhdHRlbXB0cyIpCiAgICAgICAgZWxpZiB6M19yZXN1bHRbInZlcmRpY3QiXSA9PSAiU0FGRSI6CiAgICAgICAgICAgIHVpX2xvZyhmIlozOiB7ejNfcmVzdWx0WydzdW1tYXJ5J119IiwgIklORk8iKQoKICAgICAgICAjIOKUgOKUgCBTdGVwIDg6IEFEVkVSU0FSSUFMIExMTSBSRVZJRVcg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICAgICAgdWlfbG9nKCJEaXNwYXRjaGluZyBhZHZlcnNhcmlhbCByZXZpZXdlciAocmVkIHRlYW0pLi4uIiwgIkFEViIpCiAgICAgICAgYWR2X3JldmlldyA9IHJ1bl9hZHZlcnNhcmlhbF9yZXZpZXcoZGlmZl90ZXh0LCB0ZXN0X3BhdGgsIGluaXRpYWxfZmFpbHVyZSwgcmVwb19yZWYpCiAgICAgICAgdmVyZGljdCA9IGFkdl9yZXZpZXcuZ2V0KCJ2ZXJkaWN0IiwgIkNPTkRJVElPTkFMIikKCiAgICAgICAgbG9nX2F1ZGl0X2V2ZW50KCJBRFZFUlNBUklBTF9SRVZJRVciLCBqb2JfaWQsIHJlcG9fcmVmLCBNT0RFTCwgewogICAgICAgICAgICAiYXR0ZW1wdCI6IGF0dGVtcHRfbnVtLCAidmVyZGljdCI6IHZlcmRpY3QsCiAgICAgICAgICAgICJtb2RlbCI6IGFkdl9yZXZpZXcuZ2V0KCJtb2RlbF91c2VkIiksICJyZXZpZXdfaGFzaCI6IGFkdl9yZXZpZXcuZ2V0KCJyZXZpZXdfaGFzaCIpLAogICAgICAgICAgICAiY3JpdGljYWxfaXNzdWVzIjogYWR2X3Jldmlldy5nZXQoImNyaXRpY2FsX2lzc3VlcyIsIFtdKSwKICAgICAgICAgICAgInN1bW1hcnkiOiBhZHZfcmV2aWV3LmdldCgic3VtbWFyeSIsICIiKSwKICAgICAgICB9LCB2ZXJkaWN0KQoKICAgICAgICBpZiBhZHZfcmV2aWV3LmdldCgid2FybmluZ3MiKToKICAgICAgICAgICAgZm9yIHcgaW4gYWR2X3Jldmlld1sid2FybmluZ3MiXToKICAgICAgICAgICAgICAgIHVpX2xvZyhmIkFkdmVyc2FyeSB3YXJuaW5nOiB7d30iLCAiQURWIikKCiAgICAgICAgaWYgdmVyZGljdCA9PSAiUkVKRUNUIjoKICAgICAgICAgICAgdWlfbG9nKGYiQURWRVJTQVJJQUwgUkVKRUNURUQ6IHthZHZfcmV2aWV3LmdldCgnc3VtbWFyeScsICcnKX0iLCAiQURWIikKICAgICAgICAgICAgZm9yIGlzc3VlIGluIGFkdl9yZXZpZXcuZ2V0KCJjcml0aWNhbF9pc3N1ZXMiLCBbXSk6CiAgICAgICAgICAgICAgICB1aV9sb2coZiIgIENyaXRpY2FsOiB7aXNzdWV9IiwgIkFEViIpCiAgICAgICAgICAgIHJlY29yZF9maXhfb3V0Y29tZShjdXJyZW50X2ZhaWx1cmUsIHRlc3RfcGF0aCwgZGlmZl90ZXh0LCBzdWNjZXNzPUZhbHNlKQogICAgICAgICAgICBydW5fc3VicHJvY2Vzc19zYWZlKFsiZ2l0IiwgImNoZWNrb3V0IiwgIi4iXSwgY3dkPVJFUE9fRElSLCByYWlzZV9vbl9lcnJvcj1GYWxzZSkKICAgICAgICAgICAgY3JpdGlxdWUgPSBhZHZfcmV2aWV3LmdldCgicmV0cnlfZ3VpZGFuY2UiLCAiIikKICAgICAgICAgICAgaXNzdWVzID0gIlxuIi5qb2luKGFkdl9yZXZpZXcuZ2V0KCJjcml0aWNhbF9pc3N1ZXMiLCBbXSkpCiAgICAgICAgICAgIGN1cnJlbnRfZmFpbHVyZSA9ICgKICAgICAgICAgICAgICAgIGYiWW91ciBwcmV2aW91cyBmaXggd2FzIFJFSkVDVEVEIGJ5IGFkdmVyc2FyaWFsIHJldmlldy5cbiIKICAgICAgICAgICAgICAgIGYiQ3JpdGljYWwgaXNzdWVzIGZvdW5kOlxue2lzc3Vlc31cbiIKICAgICAgICAgICAgICAgIGYiR3VpZGFuY2U6IHtjcml0aXF1ZX1cblxuIgogICAgICAgICAgICAgICAgZiJPcmlnaW5hbCBmYWlsdXJlOlxue2luaXRpYWxfZmFpbHVyZX0iCiAgICAgICAgICAgICkKICAgICAgICAgICAgaWYgYXR0ZW1wdF9udW0gPCBtYXhfdG90YWxfYXR0ZW1wdHM6CiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICByZXR1cm4gVmVyaWZpY2F0aW9uUmVzdWx0KHN1Y2Nlc3M9RmFsc2UsIGF0dGVtcHRzPWF0dGVtcHRfaGlzdG9yeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWlsdXJlX3JlYXNvbj0iQWR2ZXJzYXJpYWwgcmV2aWV3ZXIgcmVqZWN0ZWQgYWxsIGF0dGVtcHRzIikKCiAgICAgICAgIyDilIDilIAgU3RlcCA5OiBDaGVjayBpZiB0ZXN0cyBwYXNzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgICAgIGlmIHRlc3RfY29kZSAhPSAwOgogICAgICAgICAgICB1aV9sb2coZiJUZXN0cyBzdGlsbCBmYWlsaW5nIGFmdGVyIGF0dGVtcHQge2F0dGVtcHRfbnVtfS4gUmV0cnlpbmcuLi4iLCAiUkVUUlkiKQogICAgICAgICAgICByZWNvcmRfZml4X291dGNvbWUoY3VycmVudF9mYWlsdXJlLCB0ZXN0X3BhdGgsIGRpZmZfdGV4dCwgc3VjY2Vzcz1GYWxzZSkKICAgICAgICAgICAgY3VycmVudF9mYWlsdXJlID0gKAogICAgICAgICAgICAgICAgZiJBdHRlbXB0IHthdHRlbXB0X251bX0gZml4IGRpZCBub3Qgc29sdmUgdGhlIHByb2JsZW0uXG4iCiAgICAgICAgICAgICAgICBmIk5ldyBmYWlsdXJlOlxue3Rlc3Rfb3V0cHV0WzoxNTAwXX1cblxuIgogICAgICAgICAgICAgICAgZiJPcmlnaW5hbCBmYWlsdXJlOlxue2luaXRpYWxfZmFpbHVyZX0iCiAgICAgICAgICAgICkKICAgICAgICAgICAgcnVuX3N1YnByb2Nlc3Nfc2FmZShbImdpdCIsICJjaGVja291dCIsICIuIl0sIGN3ZD1SRVBPX0RJUiwgcmFpc2Vfb25fZXJyb3I9RmFsc2UpCiAgICAgICAgICAgIGlmIGF0dGVtcHRfbnVtIDwgbWF4X3RvdGFsX2F0dGVtcHRzOgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgcmV0dXJuIFZlcmlmaWNhdGlvblJlc3VsdChzdWNjZXNzPUZhbHNlLCBhdHRlbXB0cz1hdHRlbXB0X2hpc3RvcnksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFpbHVyZV9yZWFzb249ZiJUZXN0cyBzdGlsbCBmYWlsaW5nIGFmdGVyIHtNQVhfUkVUUklFU30gYXR0ZW1wdHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsX3Rlc3Rfb3V0cHV0PXRlc3Rfb3V0cHV0KQoKICAgICAgICAjIOKUgOKUgCBFVkVSWVRISU5HIFBBU1NFRCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgICAgICB1aV9sb2coZiJWRVJJRklFRCBHUkVFTiBvbiBhdHRlbXB0IHthdHRlbXB0X251bX06IHt0ZXN0X3BhdGh9IiwgIk9LIikKICAgICAgICBlbnN1cmVfZml4X2NvbW1pdHRlZCh0ZXN0X3BhdGgpCiAgICAgICAgZGlmZl90ZXh0ID0gZ2V0X2N1cnJlbnRfZGlmZigpCiAgICAgICAgcmVjb3JkX2ZpeF9vdXRjb21lKGN1cnJlbnRfZmFpbHVyZSwgdGVzdF9wYXRoLCBkaWZmX3RleHQsIHN1Y2Nlc3M9VHJ1ZSkKICAgICAgICByZXR1cm4gVmVyaWZpY2F0aW9uUmVzdWx0KAogICAgICAgICAgICBzdWNjZXNzPVRydWUsIGF0dGVtcHRzPWF0dGVtcHRfaGlzdG9yeSwKICAgICAgICAgICAgZmluYWxfZGlmZj1kaWZmX3RleHQsIGZpbmFsX3Rlc3Rfb3V0cHV0PXRlc3Rfb3V0cHV0LAogICAgICAgICAgICB0b3RhbF9hdHRlbXB0cz1hdHRlbXB0X251bSwKICAgICAgICApCgogICAgcmV0dXJuIFZlcmlmaWNhdGlvblJlc3VsdChzdWNjZXNzPUZhbHNlLCBhdHRlbXB0cz1hdHRlbXB0X2hpc3RvcnksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhaWx1cmVfcmVhc29uPSJNYXggcmV0cmllcyBleGNlZWRlZCIpCgoKIyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKIyBNQUlOIEFVRElUIE9SQ0hFU1RSQVRPUgojIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgApkZWYgcHJvY2Vzc19hdWRpdF90ZXN0KAogICAgdGVzdF9wYXRoOiBzdHIsCiAgICBlbnZfY29uZmlnOiBFbnZDb25maWcsICAgICAgICAgICMg4oaQIHJlcGxhY2VzIHB5dGVzdF9iaW4KICAgIG1jcF9jb25maWdfcGF0aDogc3RyLAogICAgdGVuYW50X2lkOiBzdHIsCiAgICB0YXJnZXRfcmVwbzogc3RyLAopIC0+IGRpY3Q6CiAgICBmaWxlbmFtZSA9IG9zLnBhdGguYmFzZW5hbWUodGVzdF9wYXRoKQogICAgYnJhbmNoX25hbWUgPSBmInJob2Rhd2svYXV0by1wYXRjaC97ZmlsZW5hbWUucmVwbGFjZSgnLnB5JywnJykucmVwbGFjZSgnXycsJy0nKX0iCgogICAgY3VycmVudF9zdGF0dXMgPSBnZXRfam9iX3N0YXR1c19lbnVtKHRlbmFudF9pZCwgdGFyZ2V0X3JlcG8sIHRlc3RfcGF0aCkKICAgIGlmIGN1cnJlbnRfc3RhdHVzID09IEpvYlN0YXR1cy5ET05FOgogICAgICAgIHVpX2xvZyhmIlNraXBwaW5nIChET05FKToge3Rlc3RfcGF0aH0iLCAiU0tJUCIpCiAgICAgICAgcmV0dXJuIHsic2tpcHBlZCI6IFRydWV9CiAgICBpZiBjdXJyZW50X3N0YXR1cyA9PSBKb2JTdGF0dXMuUlVOTklORzoKICAgICAgICB1aV9sb2coZiJDbGVhbmluZyBpbnRlcnJ1cHRlZCBqb2I6IHt0ZXN0X3BhdGh9IiwgIldBUk4iKQogICAgICAgIGNsZWFudXBfc3RhbGVfYnJhbmNoKGJyYW5jaF9uYW1lKQogICAgICAgIHNhZmVfZ2l0X3B1bGwoKQoKICAgIGpvYl9pZCA9IHVwc2VydF9qb2IodGVuYW50X2lkLCB0YXJnZXRfcmVwbywgdGVzdF9wYXRoLCBKb2JTdGF0dXMuUlVOTklORykKICAgIHVpX2xvZyhmIlRlc3Rpbmc6IHt0ZXN0X3BhdGh9IFtqb2I6e2pvYl9pZH1dIikKCiAgICBpbml0aWFsX291dHB1dCwgcHl0ZXN0X2NvZGUgPSBfYWN0aXZlX3J1bnRpbWUucnVuX3Rlc3RzKAogICAgICAgIHRlc3RfcGF0aCwgUkVQT19ESVIsIGVudl9jb25maWcsIHRpbWVvdXQ9MTIwCiAgICApCgogICAgaWYgcHl0ZXN0X2NvZGUgPT0gMDoKICAgICAgICB1aV9sb2coZiJQQVNTRUQ6IHt0ZXN0X3BhdGh9IiwgIk9LIikKICAgICAgICB1cHNlcnRfam9iKHRlbmFudF9pZCwgdGFyZ2V0X3JlcG8sIHRlc3RfcGF0aCwgSm9iU3RhdHVzLkRPTkUsICJ0ZXN0cyBwYXNzZWQiKQogICAgICAgIGxvZ19hdWRpdF9ldmVudCgiVEVTVF9QQVNTIiwgam9iX2lkLCB0YXJnZXRfcmVwbywgTU9ERUwsCiAgICAgICAgICAgICAgICAgICAgICAgIHsidGVzdCI6IHRlc3RfcGF0aCwgImF0dGVtcHQiOiAwfSwgIlBBU1NFRCIpCiAgICAgICAgcmVjb3JkX2F0dGVtcHQodGVuYW50X2lkLCB0YXJnZXRfcmVwbywgdGVzdF9wYXRoLCBpbml0aWFsX291dHB1dCwgTU9ERUwsCiAgICAgICAgICAgICAgICAgICAgICAgImJhc2VsaW5lIiwgMCwgdGVzdF9wYXNzZWRfYWZ0ZXI9VHJ1ZSkKICAgICAgICByZXR1cm4geyJzdWNjZXNzIjogVHJ1ZSwgImFscmVhZHlfZ3JlZW4iOiBUcnVlfQoKICAgIHVpX2xvZyhmIkZBSUxFRDoge3Rlc3RfcGF0aH0g4oCUIGVudGVyaW5nIGhlYWxpbmcgbG9vcC4uLiIsICJGQUlMIikKICAgIG5vdGlmeV90ZXN0X2ZhaWxlZCh0ZXN0X3BhdGgpCiAgICBsb2dfYXVkaXRfZXZlbnQoIlRFU1RfRkFJTCIsIGpvYl9pZCwgdGFyZ2V0X3JlcG8sIE1PREVMLCB7InRlc3QiOiB0ZXN0X3BhdGh9LCAiRkFJTEVEIikKCiAgICByZXN1bHQgPSBwcm9jZXNzX2ZhaWxpbmdfdGVzdCgKICAgICAgICB0ZXN0X3BhdGgsIGluaXRpYWxfb3V0cHV0LCBlbnZfY29uZmlnLCBtY3BfY29uZmlnX3BhdGgsCiAgICAgICAgam9iX2lkLCBicmFuY2hfbmFtZSwgdGFyZ2V0X3JlcG89dGFyZ2V0X3JlcG8sCiAgICApCgogICAgYXR0ZW1wdF9pZCA9IHJlY29yZF9hdHRlbXB0KAogICAgICAgIHRlbmFudF9pZCwgdGFyZ2V0X3JlcG8sIHRlc3RfcGF0aCwgaW5pdGlhbF9vdXRwdXQsIE1PREVMLAogICAgICAgIGhhc2hsaWIuc2hhMjU2KGluaXRpYWxfb3V0cHV0LmVuY29kZSgpKS5oZXhkaWdlc3QoKVs6MTZdLAogICAgICAgIGF0dGVtcHRfbnVtYmVyPXJlc3VsdC50b3RhbF9hdHRlbXB0cyBvciBsZW4ocmVzdWx0LmF0dGVtcHRzKSwKICAgICAgICBkaWZmX3Byb2R1Y2VkPXJlc3VsdC5maW5hbF9kaWZmLAogICAgICAgIHRlc3RfcGFzc2VkX2FmdGVyPXJlc3VsdC5zdWNjZXNzLAogICAgKQoKICAgIGlmIHJlc3VsdC5zdWNjZXNzOgogICAgICAgIHByX3VybCA9ICIiCiAgICAgICAgZm9ya19tb2RlID0gb3MuZ2V0ZW52KCJSSE9EQVdLX0ZPUktfTU9ERSIsICJmYWxzZSIpLmxvd2VyKCkgPT0gInRydWUiCiAgICAgICAgdHJ5OgogICAgICAgICAgICBpZiBwdXNoX2ZpeF9icmFuY2goYnJhbmNoX25hbWUpOgogICAgICAgICAgICAgICAgZnJvbSBnaXRodWJfYXBwIGltcG9ydCBvcGVuX3ByX2Zvcl9yZXBvCiAgICAgICAgICAgICAgICBwcl91cmwgPSBvcGVuX3ByX2Zvcl9yZXBvKAogICAgICAgICAgICAgICAgICAgIHRhcmdldF9yZXBvLCBicmFuY2hfbmFtZSwgdGVzdF9wYXRoLAogICAgICAgICAgICAgICAgICAgIGdldF9naXRodWJfdG9rZW4odGFyZ2V0X3JlcG8pLCBmb3JrX21vZGU9Zm9ya19tb2RlLAogICAgICAgICAgICAgICAgKQogICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICAgICAgdWlfbG9nKGYiUFIgY3JlYXRpb24gZmFpbGVkIGZvciB7dGVzdF9wYXRofToge2V9IiwgIldBUk4iKQoKICAgICAgICB1cGRhdGVfdGVzdF9yZXN1bHQoYXR0ZW1wdF9pZCwgVHJ1ZSwgcHJfdXJsKQogICAgICAgIHVwc2VydF9qb2IodGVuYW50X2lkLCB0YXJnZXRfcmVwbywgdGVzdF9wYXRoLCBKb2JTdGF0dXMuRE9ORSwKICAgICAgICAgICAgICAgICAgIGYiaGVhbGVkIGluIHtyZXN1bHQudG90YWxfYXR0ZW1wdHN9IGF0dGVtcHQocykg4oCUIFBSIHN1Ym1pdHRlZCIsCiAgICAgICAgICAgICAgICAgICBwcl91cmw9cHJfdXJsLCBtb2RlbF92ZXJzaW9uPU1PREVMKQogICAgICAgIGlmIHByX3VybDoKICAgICAgICAgICAgbm90aWZ5X3ByX2NyZWF0ZWQodGVzdF9wYXRoLCBwcl91cmwpCiAgICAgICAgdWlfbG9nKGYiUFIgc3VibWl0dGVkIGZvciB7dGVzdF9wYXRofSAoaGVhbGVkIGluIHtyZXN1bHQudG90YWxfYXR0ZW1wdHN9IGF0dGVtcHQocykpIiwgIlBSIikKICAgICAgICBsb2dfYXVkaXRfZXZlbnQoIlBSX1NVQk1JVFRFRCIsIGpvYl9pZCwgdGFyZ2V0X3JlcG8sIE1PREVMLAogICAgICAgICAgICAgICAgICAgICAgICB7InRlc3QiOiB0ZXN0X3BhdGgsICJhdHRlbXB0cyI6IHJlc3VsdC50b3RhbF9hdHRlbXB0cywKICAgICAgICAgICAgICAgICAgICAgICAgICJicmFuY2giOiBicmFuY2hfbmFtZSwgInByX3VybCI6IHByX3VybCwKICAgICAgICAgICAgICAgICAgICAgICAgICJmb3JrX21vZGUiOiBmb3JrX21vZGV9LCAiU1VDQ0VTUyIpCgogICAgICAgICMg4pSA4pSAIENvbnZpY3Rpb24gYXV0by1tZXJnZSBjaGVjayDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgICAgICBpZiBwcl91cmw6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGxhc3RfYWR2ID0ge30KICAgICAgICAgICAgICAgIGZvciBhdHRlbXB0IGluIHJldmVyc2VkKHJlc3VsdC5hdHRlbXB0cyBvciBbXSk6CiAgICAgICAgICAgICAgICAgICAgaWYgaGFzYXR0cihhdHRlbXB0LCAiYWR2X3JldmlldyIpIGFuZCBhdHRlbXB0LmFkdl9yZXZpZXc6CiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RfYWR2ID0gYXR0ZW1wdC5hZHZfcmV2aWV3CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCgogICAgICAgICAgICAgICAgc2ltaWxhciA9IHJldHJpZXZlX3NpbWlsYXJfZml4ZXNfdjIocmVzdWx0LmZpbmFsX3Rlc3Rfb3V0cHV0IG9yICIiLCB0b3Bfaz01KQogICAgICAgICAgICAgICAgc2FzdF9jb3VudCA9IHN1bSgKICAgICAgICAgICAgICAgICAgICBsZW4oYS5zYXN0X2ZpbmRpbmdzKSBpZiBoYXNhdHRyKGEsICJzYXN0X2ZpbmRpbmdzIikgZWxzZSAwCiAgICAgICAgICAgICAgICAgICAgZm9yIGEgaW4gKHJlc3VsdC5hdHRlbXB0cyBvciBbXSkKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHNjX25ld19wa2dzOiBsaXN0ID0gW10KICAgICAgICAgICAgICAgIHNob3VsZF9tZXJnZSwgY29udmljdGlvbl9yZWFzb24gPSBldmFsdWF0ZV9jb252aWN0aW9uKAogICAgICAgICAgICAgICAgICAgIGFkdmVyc2FyaWFsX3Jldmlldz1sYXN0X2FkdiwKICAgICAgICAgICAgICAgICAgICBzaW1pbGFyX2ZpeGVzPXNpbWlsYXIsCiAgICAgICAgICAgICAgICAgICAgdGVzdF9hdHRlbXB0cz1yZXN1bHQudG90YWxfYXR0ZW1wdHMgb3IgMSwKICAgICAgICAgICAgICAgICAgICBzYXN0X2ZpbmRpbmdzX2NvdW50PXNhc3RfY291bnQsCiAgICAgICAgICAgICAgICAgICAgbmV3X3BhY2thZ2VzPXNjX25ld19wa2dzLAogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgaWYgc2hvdWxkX21lcmdlOgogICAgICAgICAgICAgICAgICAgIHRva2VuID0gZ2V0X2dpdGh1Yl90b2tlbih0YXJnZXRfcmVwbykKICAgICAgICAgICAgICAgICAgICBvaywgbWVyZ2VfbXNnID0gYXV0b19tZXJnZV9wcih0YXJnZXRfcmVwbywgcHJfdXJsLCB0b2tlbikKICAgICAgICAgICAgICAgICAgICBpZiBvazoKICAgICAgICAgICAgICAgICAgICAgICAgdWlfbG9nKGYiQVVUTy1NRVJHRUQ6IHtwcl91cmx9ICh7Y29udmljdGlvbl9yZWFzb259KSIsICJQUiIpCiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ19hdWRpdF9ldmVudCgiQVVUT19NRVJHRSIsIGpvYl9pZCwgdGFyZ2V0X3JlcG8sIE1PREVMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJwcl91cmwiOiBwcl91cmwsICJyZWFzb24iOiBjb252aWN0aW9uX3JlYXNvbn0sICJNRVJHRUQiKQogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIHVpX2xvZyhmIkF1dG8tbWVyZ2UgYXR0ZW1wdGVkIGJ1dCBmYWlsZWQ6IHttZXJnZV9tc2d9IiwgIldBUk4iKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICB1aV9sb2coZiJDb252aWN0aW9uIG5vdCBtZXQgKHtjb252aWN0aW9uX3JlYXNvbn0pIOKAlCBQUiByZXF1aXJlcyBodW1hbiByZXZpZXciLCAiSU5GTyIpCiAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICAgICAgICAgIHVpX2xvZyhmIkNvbnZpY3Rpb24gY2hlY2sgZXJyb3IgKG5vbi1ibG9ja2luZyk6IHtlfSIsICJXQVJOIikKCiAgICAgICAgcnVuX3N1YnByb2Nlc3Nfc2FmZShbImdpdCIsICJjaGVja291dCIsICJtYWluIl0sIGN3ZD1SRVBPX0RJUiwgcmFpc2Vfb25fZXJyb3I9RmFsc2UpCiAgICAgICAgc2FmZV9naXRfcHVsbCgpCiAgICAgICAgcmV0dXJuIHsic3VjY2VzcyI6IFRydWUsICJwcl91cmwiOiBwcl91cmx9CgogICAgdXBkYXRlX3Rlc3RfcmVzdWx0KGF0dGVtcHRfaWQsIEZhbHNlKQogICAgdXBzZXJ0X2pvYih0ZW5hbnRfaWQsIHRhcmdldF9yZXBvLCB0ZXN0X3BhdGgsIEpvYlN0YXR1cy5GQUlMRUQsIHJlc3VsdC5mYWlsdXJlX3JlYXNvbikKICAgIG5vdGlmeV9wYXRjaF9mYWlsZWQodGVzdF9wYXRoKQogICAgdWlfbG9nKGYiVU5SRVNPTFZFRCBhZnRlciB7TUFYX1JFVFJJRVN9IGF0dGVtcHRzOiB7cmVzdWx0LmZhaWx1cmVfcmVhc29ufSIsICJGQUlMIikKICAgIGxvZ19hdWRpdF9ldmVudCgiSEVBTElOR19FWEhBVVNURUQiLCBqb2JfaWQsIHRhcmdldF9yZXBvLCBNT0RFTCwKICAgICAgICAgICAgICAgICAgICB7InRlc3QiOiB0ZXN0X3BhdGgsICJyZWFzb24iOiByZXN1bHQuZmFpbHVyZV9yZWFzb259LCAiRkFJTEVEIikKICAgIHJ1bl9zdWJwcm9jZXNzX3NhZmUoWyJnaXQiLCAiY2hlY2tvdXQiLCAibWFpbiJdLCBjd2Q9UkVQT19ESVIsIHJhaXNlX29uX2Vycm9yPUZhbHNlKQogICAgc2FmZV9naXRfcHVsbCgpCiAgICByZXR1cm4geyJzdWNjZXNzIjogRmFsc2UsICJlcnJvciI6IHJlc3VsdC5mYWlsdXJlX3JlYXNvbn0KCgpkZWYgZW50ZXJwcmlzZV9hdWRpdF9sb29wKHJlcG9fb3ZlcnJpZGU6IHN0ciA9IE5vbmUsIGJyYW5jaDogc3RyID0gIm1haW4iLCBzcGVjaWZpY190ZXN0OiBzdHIgPSBOb25lKToKICAgIGdsb2JhbCBSRVBPX0RJUiwgX2N1cnJlbnRfdGFyZ2V0X3JlcG8KCiAgICB0YXJnZXRfcmVwbyA9IF9ub3JtYWxpemVfcmVwbyhyZXBvX292ZXJyaWRlIG9yICIiKSBvciBfbm9ybWFsaXplX3JlcG8oR0lUSFVCX1JFUE8pIG9yIChyZXBvX292ZXJyaWRlIG9yIEdJVEhVQl9SRVBPIG9yICIiKS5zdHJpcCgpCiAgICBpZiBub3QgdGFyZ2V0X3JlcG86CiAgICAgICAgdWlfbG9nKCJObyB0YXJnZXQgcmVwbyBjb25maWd1cmVkLiBFbnRlciBvbmUgaW4gdGhlIGNoYXQgaW5ib3ggb3Igc2V0IEdJVEhVQl9SRVBPLiIsICJGQUlMIikKICAgICAgICBfYXVkaXRfZXZlbnQuY2xlYXIoKQogICAgICAgIHJldHVybgoKICAgICMg4pSA4pSAIEtFWSBGSVg6IGdpdmUgZXZlcnkgcmVwbyBpdHMgb3duIGRpcmVjdG9yeSBzbyBzd2l0Y2hpbmcgcmVwb3MKICAgICMgbmV2ZXIgcmUtdXNlcyBhIHN0YWxlIGNsb25lIGZyb20gYSBwcmV2aW91cyBhdWRpdC4g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICBzYWZlX25hbWUgPSB0YXJnZXRfcmVwby5yZXBsYWNlKCIvIiwgIl8iKS5yZXBsYWNlKCIuIiwgIl8iKQogICAgUkVQT19ESVIgPSBmIntQRVJTSVNURU5UX0RJUn0vcmVwb197c2FmZV9uYW1lfSIKICAgIF9jdXJyZW50X3RhcmdldF9yZXBvID0gdGFyZ2V0X3JlcG8KCiAgICB1aV9sb2coIuKVkCIgKiA3MCkKICAgIHVpX2xvZyhmIkFVRElUIFNUQVJUIOKAlCBUZW5hbnQ6IHtURU5BTlRfSUR9IHwgUmVwbzoge3RhcmdldF9yZXBvfSB8IERpcjoge1JFUE9fRElSfSB8IE1vZGVsOiB7TU9ERUx9IikKICAgIG5vdGlmeV9hdWRpdF9zdGFydCh0YXJnZXRfcmVwbykKICAgIGxvZ19hdWRpdF9ldmVudCgiQVVESVRfU1RBUlQiLCAib3JjaGVzdHJhdG9yIiwgdGFyZ2V0X3JlcG8sIE1PREVMLAogICAgICAgICAgICAgICAgICAgIHsidGVuYW50IjogVEVOQU5UX0lELCAiYnJhbmNoIjogYnJhbmNoLCAicmVwb19kaXIiOiBSRVBPX0RJUn0sICJTVEFSVEVEIikKCiAgICAjIFBydW5lIHN0YWxlIGNvbXBsZXRlZCBqb2JzIGF0IHRoZSBzdGFydCBvZiBlYWNoIGF1ZGl0IHJ1biAoVFRMIGZpeCkKICAgIGZyb20gam9iX3F1ZXVlIGltcG9ydCBwcnVuZV9kb25lX2pvYnMKICAgIHBydW5lZCA9IHBydW5lX2RvbmVfam9icyhtYXhfYWdlX2hvdXJzPTcyKQogICAgaWYgcHJ1bmVkOgogICAgICAgIHVpX2xvZyhmIlBydW5lZCB7cHJ1bmVkfSBjb21wbGV0ZWQgam9iKHMpIG9sZGVyIHRoYW4gNzJoIGZyb20gcXVldWUuIiwgIklORk8iKQoKICAgIGNyZWRfcGF0aCA9ICIvdG1wLy5naXQtY3JlZGVudGlhbHMiCiAgICB0cnk6CiAgICAgICAgY29uZmlndXJlX2dpdF9jcmVkZW50aWFscygpCiAgICAgICAgbWNwX2NvbmZpZ19wYXRoID0gd3JpdGVfbWNwX2NvbmZpZygpCgogICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhSRVBPX0RJUik6CiAgICAgICAgICAgIHVpX2xvZyhmIkNsb25pbmcge3RhcmdldF9yZXBvfSDihpIge1JFUE9fRElSfSAuLi4iKQogICAgICAgICAgICAjIEZJWC0wMDk6IFVzZSBydW5fc3VicHJvY2Vzc19zYWZlIGluc3RlYWQgb2YgUmVwby5jbG9uZV9mcm9tIHNvIHRoYXQKICAgICAgICAgICAgIyBHSVRfQ09ORklHX0dMT0JBTCAoc2V0IGJ5IGNvbmZpZ3VyZV9naXRfY3JlZGVudGlhbHMpIGlzIHByb3BhZ2F0ZWQgdG8KICAgICAgICAgICAgIyB0aGUgZ2l0IHN1YnByb2Nlc3MgdmlhIG9zLmVudmlyb24uY29weSgpLiAgZ2l0cHl0aG9uJ3MgUmVwby5jbG9uZV9mcm9tCiAgICAgICAgICAgICMgc3Bhd25zIGl0cyBvd24gc3VicHJvY2VzcyB3aGljaCBpbmhlcml0cyBvcy5lbnZpcm9uLCBidXQgb25seSB3aGVuIHRoZQogICAgICAgICAgICAjIGVudiBwYXJhbWV0ZXIgaXMgbm90IG92ZXJyaWRkZW4g4oCUIHVzaW5nIHJ1bl9zdWJwcm9jZXNzX3NhZmUgaXMgc2FmZXIKICAgICAgICAgICAgIyBiZWNhdXNlIGl0IGV4cGxpY2l0bHkgY29waWVzIG9zLmVudmlyb24gKGluY2x1ZGluZyBHSVRfQ09ORklHX0dMT0JBTCkuCiAgICAgICAgICAgIHJ1bl9zdWJwcm9jZXNzX3NhZmUoCiAgICAgICAgICAgICAgICBbImdpdCIsICJjbG9uZSIsICItdiIsIGYiaHR0cHM6Ly9naXRodWIuY29tL3t0YXJnZXRfcmVwb30uZ2l0IiwgUkVQT19ESVJdLAogICAgICAgICAgICAgICAgY3dkPSIvdG1wIiwgcmFpc2Vfb25fZXJyb3I9VHJ1ZSwKICAgICAgICAgICAgKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHVpX2xvZyhmIlJlcG8gZGlyIGV4aXN0cyDigJQgc3luY2luZyB7dGFyZ2V0X3JlcG99IHRvIGxhdGVzdCBvcmlnaW4vbWFpbiAuLi4iKQogICAgICAgICAgICBzYWZlX2dpdF9wdWxsKCkKCiAgICAgICAgIyDilIDilIAgTGFuZ3VhZ2UgZGV0ZWN0aW9uIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgICAgICMgQlVHLTAwNyBGSVg6IGFjcXVpcmUgbG9jayBiZWZvcmUgb3ZlcndyaXRpbmcgX2FjdGl2ZV9ydW50aW1lIHNvIGEKICAgICAgICAjIGNvbmN1cnJlbnQgd2ViaG9vay10cmlnZ2VyZWQgYXVkaXQgY2Fubm90IHN3YXAgdGhlIHJ1bnRpbWUgdW5kZXIKICAgICAgICAjIGluLWZsaWdodCB3b3JrZXJzIGZyb20gYSBwcmV2aW91cyBhdWRpdC4KICAgICAgICBnbG9iYWwgX2FjdGl2ZV9ydW50aW1lCiAgICAgICAgd2l0aCBfYWN0aXZlX3J1bnRpbWVfbG9jazoKICAgICAgICAgICAgX2FjdGl2ZV9ydW50aW1lID0gUnVudGltZUZhY3RvcnkuZm9yX3JlcG8oUkVQT19ESVIpCiAgICAgICAgdWlfbG9nKGYiRGV0ZWN0ZWQgbGFuZ3VhZ2U6IHtfYWN0aXZlX3J1bnRpbWUubGFuZ3VhZ2UudXBwZXIoKX0iLCAiSU5GTyIpCgogICAgICAgIGVudl9jb25maWcgPSBfYWN0aXZlX3J1bnRpbWUuc2V0dXBfZW52KFJFUE9fRElSLCBQRVJTSVNURU5UX0RJUikKCiAgICAgICAgIyDilIDilIAgVGVzdCBkaXNjb3Zlcnkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICAgICAgaWYgc3BlY2lmaWNfdGVzdDoKICAgICAgICAgICAgcmVsYXRpdmVfdGVzdHMgPSAoCiAgICAgICAgICAgICAgICBbc3BlY2lmaWNfdGVzdF0KICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKG9zLnBhdGguam9pbihSRVBPX0RJUiwgc3BlY2lmaWNfdGVzdCkpCiAgICAgICAgICAgICAgICBlbHNlIFtdCiAgICAgICAgICAgICkKICAgICAgICBlbHNlOgogICAgICAgICAgICByZWxhdGl2ZV90ZXN0cyA9IF9hY3RpdmVfcnVudGltZS5kaXNjb3Zlcl90ZXN0cyhSRVBPX0RJUikKCiAgICAgICAgdWlfbG9nKGYiRGlzY292ZXJlZCB7bGVuKHJlbGF0aXZlX3Rlc3RzKX0gdGVzdCBmaWxlKHMpIFt7X2FjdGl2ZV9ydW50aW1lLmxhbmd1YWdlfV0uIikKCiAgICAgICAgcG9vbF9yZXN1bHQgPSBydW5fcGFyYWxsZWxfYXVkaXQoCiAgICAgICAgICAgIHJlbGF0aXZlX3Rlc3RzLCBwcm9jZXNzX2F1ZGl0X3Rlc3QsCiAgICAgICAgICAgIGVudl9jb25maWc9ZW52X2NvbmZpZywgbWNwX2NvbmZpZ19wYXRoPW1jcF9jb25maWdfcGF0aCwKICAgICAgICAgICAgdGVuYW50X2lkPVRFTkFOVF9JRCwgdGFyZ2V0X3JlcG89dGFyZ2V0X3JlcG8sCiAgICAgICAgKQogICAgICAgIHVpX2xvZygKICAgICAgICAgICAgZiJXb3JrZXIgcG9vbCBjb21wbGV0ZSDigJQgd29ya2Vycz17TUFYX1dPUktFUlN9LCBoZWFsZWQ9e3Bvb2xfcmVzdWx0WydoZWFsZWQnXX0sICIKICAgICAgICAgICAgZiJhbHJlYWR5X2dyZWVuPXtwb29sX3Jlc3VsdFsnYWxyZWFkeV9ncmVlbiddfSwgIgogICAgICAgICAgICBmImZhaWxlZD17cG9vbF9yZXN1bHRbJ2ZhaWxlZCddfSwgc2tpcHBlZD17cG9vbF9yZXN1bHRbJ3NraXBwZWQnXX0iLAogICAgICAgICAgICAiUE9PTCIsCiAgICAgICAgKQoKICAgICAgICBhbGxfZ3JlZW4gPSBhbGwoCiAgICAgICAgICAgIGdldF9qb2Jfc3RhdHVzX2VudW0oVEVOQU5UX0lELCB0YXJnZXRfcmVwbywgdCkgPT0gSm9iU3RhdHVzLkRPTkUKICAgICAgICAgICAgZm9yIHQgaW4gcmVsYXRpdmVfdGVzdHMKICAgICAgICApCgogICAgICAgIGlmIGFsbF9ncmVlbiBhbmQgUkVEX1RFQU1fRU5BQkxFRCBhbmQgcmVsYXRpdmVfdGVzdHM6CiAgICAgICAgICAgIHVpX2xvZygiQWxsIHRlc3RzIEdSRUVOIOKAlCBhY3RpdmF0aW5nIFJlZCBUZWFtIENFR0lTLiIsICJSRUQiKQogICAgICAgICAgICBydW5fcmVkX3RlYW1fY2VnaXMoCiAgICAgICAgICAgICAgICByZXBvX2Rpcj1SRVBPX0RJUiwKICAgICAgICAgICAgICAgIGVudl9jb25maWc9ZW52X2NvbmZpZywKICAgICAgICAgICAgICAgIG1jcF9jb25maWdfcGF0aD1tY3BfY29uZmlnX3BhdGgsCiAgICAgICAgICAgICAgICBibHVlX3RlYW1fZm49cHJvY2Vzc19mYWlsaW5nX3Rlc3QsCiAgICAgICAgICAgICAgICB0ZW5hbnRfaWQ9VEVOQU5UX0lELAogICAgICAgICAgICAgICAgbG9nX2F1ZGl0X2ZuPWxvZ19hdWRpdF9ldmVudCwKICAgICAgICAgICAgICAgIG5vdGlmeV9mbj1ub3RpZnksCiAgICAgICAgICAgICkKCiAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgdWlfbG9nKGYiRkFUQUw6IHtlfSIsICJGQUlMIikKICAgICAgICBub3RpZnkoZiLwn5S0ICpGQVRBTCpcbmB7ZX1gIiwgIkVSUk9SIikKICAgICAgICBsb2dfYXVkaXRfZXZlbnQoIkFVRElUX0NSQVNIIiwgIm9yY2hlc3RyYXRvciIsIHRhcmdldF9yZXBvLCBNT0RFTCwgeyJlcnJvciI6IHN0cihlKX0sICJDUkFTSEVEIikKICAgICAgICByZXR1cm4KICAgIGZpbmFsbHk6CiAgICAgICAgIyBCVUctMDA4IEZJWDogQWx3YXlzIHNjcnViIHBsYWludGV4dCBjcmVkZW50aWFscyBmcm9tIC90bXAgYWZ0ZXIgYXVkaXQKICAgICAgICB0cnk6CiAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGNyZWRfcGF0aCk6CiAgICAgICAgICAgICAgICBvcy51bmxpbmsoY3JlZF9wYXRoKQogICAgICAgICAgICAgICAgdWlfbG9nKCJHaXQgY3JlZGVudGlhbHMgZmlsZSBzY3J1YmJlZCBmcm9tIC90bXAuIiwgIklORk8iKQogICAgICAgIGV4Y2VwdCBPU0Vycm9yOgogICAgICAgICAgICBwYXNzCiAgICAgICAgX2F1ZGl0X2V2ZW50LmNsZWFyKCkKCiAgICBmaW5hbF9tZXRyaWNzID0gZ2V0X21ldHJpY3MoKQogICAgdHJhaW5pbmdfc3RhdHMgPSBnZXRfc3RhdGlzdGljcygpCiAgICBub3RpZnlfYXVkaXRfY29tcGxldGUoZmluYWxfbWV0cmljcykKCiAgICBpc192YWxpZCwgaW50ZWdyaXR5X21zZyA9IHZlcmlmeV9jaGFpbl9pbnRlZ3JpdHkoKQogICAgbm90aWZ5X2NoYWluX2ludGVncml0eShpc192YWxpZCwgaW50ZWdyaXR5X21zZykKCiAgICB1aV9sb2coIuKVkCIgKiA3MCkKICAgIHVpX2xvZygKICAgICAgICBmIkFVRElUIENPTVBMRVRFIOKAlCBGaXggc3VjY2VzcyByYXRlOiB7dHJhaW5pbmdfc3RhdHNbJ2ZpeF9zdWNjZXNzX3JhdGUnXX0gfCAiCiAgICAgICAgZiJTQVNUIGJsb2Nrczoge3RyYWluaW5nX3N0YXRzWydzYXN0X2Jsb2NrZWQnXX0gfCAiCiAgICAgICAgZiJBZHZlcnNhcmlhbCByZWplY3RzOiB7dHJhaW5pbmdfc3RhdHNbJ2FkdmVyc2FyaWFsbHlfcmVqZWN0ZWQnXX0gfCAiCiAgICAgICAgZiJQYXR0ZXJucyBsZWFybmVkOiB7dHJhaW5pbmdfc3RhdHNbJ3BhdHRlcm5zX2xlYXJuZWQnXX0iCiAgICApCiAgICBsb2dfYXVkaXRfZXZlbnQoIkFVRElUX0NPTVBMRVRFIiwgIm9yY2hlc3RyYXRvciIsIHRhcmdldF9yZXBvLCBNT0RFTCwKICAgICAgICAgICAgICAgICAgICB7KipmaW5hbF9tZXRyaWNzLCAqKnRyYWluaW5nX3N0YXRzfSwgIkNPTVBMRVRFIikKCiAgICAjIOKUgOKUgCBMb1JBIGZpbmUtdHVuZSBzY2hlZHVsZXIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICB0cnk6CiAgICAgICAgbG9yYV9zdGF0dXMgPSBtYXliZV90cmlnZ2VyX3RyYWluaW5nKCkKICAgICAgICB1aV9sb2cobG9yYV9zdGF0dXMsICJJTkZPIikKICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICB1aV9sb2coZiJMb1JBIHNjaGVkdWxlciBjaGVjayBmYWlsZWQgKG5vbi1ibG9ja2luZyk6IHtlfSIsICJXQVJOIikKCiAgICAjIFVwZGF0ZSBjaGF0IGluYm94IHdpdGggY29tcGxldGlvbiBub3RpY2UKICAgIHdpdGggX2luYm94X2xvY2s6CiAgICAgICAgbSA9IGZpbmFsX21ldHJpY3MKICAgICAgICBfaW5ib3hfaGlzdG9yeS5hcHBlbmQoeyJyb2xlIjogInVzZXIiLCAiY29udGVudCI6IGYi4pyFIEF1ZGl0IGNvbXBsZXRlOiBge3RhcmdldF9yZXBvfWAifSkKICAgICAgICBfaW5ib3hfaGlzdG9yeS5hcHBlbmQoewogICAgICAgICAgICAicm9sZSI6ICJhc3Npc3RhbnQiLAogICAgICAgICAgICAiY29udGVudCI6ICgKICAgICAgICAgICAgICAgIGYiKipBdWRpdCBmaW5pc2hlZC4qKlxuIgogICAgICAgICAgICAgICAgZiItIFRlc3RzIHNjYW5uZWQ6IHttWyd0b3RhbCddfVxuIgogICAgICAgICAgICAgICAgZiItIFZlcmlmaWVkIGdyZWVuOiB7bVsnZG9uZSddfVxuIgogICAgICAgICAgICAgICAgZiItIFBScyBnZW5lcmF0ZWQ6IHttWydwcnNfY3JlYXRlZCddfVxuIgogICAgICAgICAgICAgICAgZiItIFNBU1QgYmxvY2tlZDoge21bJ3Nhc3RfYmxvY2tlZCddfVxuIgogICAgICAgICAgICAgICAgZiItIEZpeCByYXRlOiB7dHJhaW5pbmdfc3RhdHNbJ2ZpeF9zdWNjZXNzX3JhdGUnXX0iCiAgICAgICAgICAgICkKICAgICAgICB9KQoKCiMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiMgUkVQTyBJTlBVVCBOT1JNQUxJU0VSCiMgQWNjZXB0cyBhbnkgb2Y6CiMgICBvd25lci9yZXBvCiMgICBodHRwczovL2dpdGh1Yi5jb20vb3duZXIvcmVwbwojICAgaHR0cHM6Ly9naXRodWIuY29tL293bmVyL3JlcG8uZ2l0CiMgICBnaXRodWIuY29tL293bmVyL3JlcG8KIyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKZGVmIF9ub3JtYWxpemVfcmVwbyhyYXc6IHN0cikgLT4gc3RyOgogICAgIiIiUmV0dXJuICdvd25lci9yZXBvJyBmcm9tIGFueSBjb21tb24gR2l0SHViIFVSTCBmb3JtYXQsIG9yICcnIGlmIGludmFsaWQuIiIiCiAgICBzID0gcmF3LnN0cmlwKCkucnN0cmlwKCIvIikucmVtb3Zlc3VmZml4KCIuZ2l0IikKICAgICMgU3RyaXAgY29tbW9uIHByZWZpeGVzCiAgICBmb3IgcHJlZml4IGluICgiaHR0cHM6Ly9naXRodWIuY29tLyIsICJodHRwOi8vZ2l0aHViLmNvbS8iLCAiZ2l0aHViLmNvbS8iKToKICAgICAgICBpZiBzLnN0YXJ0c3dpdGgocHJlZml4KToKICAgICAgICAgICAgcyA9IHNbbGVuKHByZWZpeCk6XQogICAgICAgICAgICBicmVhawogICAgcGFydHMgPSBbcCBmb3IgcCBpbiBzLnNwbGl0KCIvIikgaWYgcF0KICAgIGlmIGxlbihwYXJ0cykgPT0gMjoKICAgICAgICByZXR1cm4gZiJ7cGFydHNbMF19L3twYXJ0c1sxXX0iCiAgICByZXR1cm4gIiIKCgojIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAojIFRFUk1JTkFURSAvIFNUT1AgQVVESVQKIyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKZGVmIHRlcm1pbmF0ZV9hdWRpdCgpIC0+IHN0cjoKICAgICIiIgogICAgRm9yY2Utc3RvcCBhIHJ1bm5pbmcgYXVkaXQuCiAgICBDbGVhcnMgX2F1ZGl0X2V2ZW50IHNvIHRoZSBuZXh0IHN1Ym1pc3Npb24gaXMgYWNjZXB0ZWQgaW1tZWRpYXRlbHkuCiAgICBUaGUgYmFja2dyb3VuZCB0aHJlYWQgd2lsbCBmaW5pc2ggaXRzIGN1cnJlbnQgc3VicHJvY2VzcyBuYXR1cmFsbHkg4oCUCiAgICB3ZSBjYW5ub3Qga2lsbCBkYWVtb24gdGhyZWFkcyBpbiBQeXRob24sIGJ1dCBjbGVhcmluZyB0aGUgZXZlbnQgbWVhbnM6CiAgICAgIDEuIE5vIG5ldyB0ZXN0IGpvYnMgYXJlIGRpc3BhdGNoZWQgYWZ0ZXIgdGhlIGN1cnJlbnQgb25lIGZpbmlzaGVzCiAgICAgIDIuIFRoZSBpbmJveCBpbW1lZGlhdGVseSBhY2NlcHRzIG5ldyByZXBvIHN1Ym1pc3Npb25zCiAgICAiIiIKICAgIGlmIG5vdCBfYXVkaXRfZXZlbnQuaXNfc2V0KCk6CiAgICAgICAgcmV0dXJuICLihLnvuI8gTm8gYXVkaXQgaXMgY3VycmVudGx5IHJ1bm5pbmcuIgogICAgX2F1ZGl0X2V2ZW50LmNsZWFyKCkKICAgIHVpX2xvZygi4puUIEF1ZGl0IHRlcm1pbmF0ZWQgYnkgb3BlcmF0b3IuIiwgIldBUk4iKQogICAgcmV0dXJuICLim5QgQXVkaXQgc3RvcHBlZC4gWW91IGNhbiBub3cgc3VibWl0IGEgbmV3IHJlcG9zaXRvcnkuIgoKCiMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiMgQ0hBVCBJTkJPWCDigJQgdGFyZ2V0IHJlcG8gaW5wdXQKIyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKZGVmIHN1Ym1pdF9yZXBvX2F1ZGl0KHJlcG9faW5wdXQ6IHN0ciwgY2hhdF9oaXN0b3J5OiBsaXN0KSAtPiB0dXBsZVtsaXN0LCBzdHJdOgogICAgIiIiCiAgICBDYWxsZWQgd2hlbiB1c2VyIHN1Ym1pdHMgYSByZXBvIHZpYSB0aGUgY2hhdCBpbmJveC4KICAgIFZhbGlkYXRlcywga2lja3Mgb2ZmIHRoZSBhdWRpdCBpbiBhIGJhY2tncm91bmQgdGhyZWFkLCBhbmQKICAgIHJldHVybnMgYW4gdXBkYXRlZCBjaGF0IGhpc3RvcnkgdXNpbmcgdGhlIG1lc3NhZ2VzIGZvcm1hdC4KICAgIEFjY2VwdHMgb3duZXIvcmVwbywgZnVsbCBHaXRIdWIgVVJMcywgYW5kIC5naXQgc3VmZml4ZXMuCiAgICAiIiIKICAgIHJhdyA9IChyZXBvX2lucHV0IG9yICIiKS5zdHJpcCgpCgogICAgaWYgbm90IHJhdzoKICAgICAgICByZXR1cm4gY2hhdF9oaXN0b3J5ICsgWwogICAgICAgICAgICB7InJvbGUiOiAidXNlciIsICJjb250ZW50IjogIihlbXB0eSkifSwKICAgICAgICAgICAgeyJyb2xlIjogImFzc2lzdGFudCIsICJjb250ZW50IjogIuKaoO+4jyBQbGVhc2UgZW50ZXIgYSByZXBvc2l0b3J5IOKAlCBlLmcuIGBPV0FTUC9weWdvYXRgIG9yIGBodHRwczovL2dpdGh1Yi5jb20vT1dBU1AvcHlnb2F0YC4ifSwKICAgICAgICBdLCAiIgoKICAgIHJlcG8gPSBfbm9ybWFsaXplX3JlcG8ocmF3KQogICAgaWYgbm90IHJlcG86CiAgICAgICAgcmV0dXJuIGNoYXRfaGlzdG9yeSArIFsKICAgICAgICAgICAgeyJyb2xlIjogInVzZXIiLCAiY29udGVudCI6IHJhd30sCiAgICAgICAgICAgIHsicm9sZSI6ICJhc3Npc3RhbnQiLCAiY29udGVudCI6ICgKICAgICAgICAgICAgICAgIGYn4p2MIENvdWxkIG5vdCBwYXJzZSBge3Jhd31gIGFzIGEgR2l0SHViIHJlcG8uXG4nCiAgICAgICAgICAgICAgICAnQWNjZXB0ZWQgZm9ybWF0czpcbicKICAgICAgICAgICAgICAgICctIGBvd25lci9yZXBvYFxuJwogICAgICAgICAgICAgICAgJy0gYGh0dHBzOi8vZ2l0aHViLmNvbS9vd25lci9yZXBvYFxuJwogICAgICAgICAgICAgICAgJy0gYGh0dHBzOi8vZ2l0aHViLmNvbS9vd25lci9yZXBvLmdpdGAnCiAgICAgICAgICAgICl9LAogICAgICAgIF0sIHJhdwoKICAgIGlmIF9hdWRpdF9ldmVudC5pc19zZXQoKToKICAgICAgICByZXR1cm4gY2hhdF9oaXN0b3J5ICsgWwogICAgICAgICAgICB7InJvbGUiOiAidXNlciIsICJjb250ZW50IjogcmVwb30sCiAgICAgICAgICAgIHsicm9sZSI6ICJhc3Npc3RhbnQiLCAiY29udGVudCI6ICgKICAgICAgICAgICAgICAgICLimqDvuI8gQW4gYXVkaXQgaXMgYWxyZWFkeSBydW5uaW5nLlxuIgogICAgICAgICAgICAgICAgIkNsaWNrICoq4puUIFRlcm1pbmF0ZSBBdWRpdCoqIHRvIHN0b3AgaXQsIHRoZW4gc3VibWl0IGEgbmV3IHJlcG8uIgogICAgICAgICAgICApfSwKICAgICAgICBdLCAiIgoKICAgIF9hdWRpdF9ldmVudC5zZXQoKQogICAgdGhyZWFkaW5nLlRocmVhZCgKICAgICAgICB0YXJnZXQ9ZW50ZXJwcmlzZV9hdWRpdF9sb29wLAogICAgICAgIGt3YXJncz17InJlcG9fb3ZlcnJpZGUiOiByZXBvfSwKICAgICAgICBkYWVtb249VHJ1ZSwKICAgICkuc3RhcnQoKQoKICAgIHJldHVybiBjaGF0X2hpc3RvcnkgKyBbCiAgICAgICAgeyJyb2xlIjogInVzZXIiLCAiY29udGVudCI6IGYi8J+OryBBdWRpdDogYHtyZXBvfWAifSwKICAgICAgICB7CiAgICAgICAgICAgICJyb2xlIjogImFzc2lzdGFudCIsCiAgICAgICAgICAgICJjb250ZW50IjogKAogICAgICAgICAgICAgICAgZiLwn5qAICoqQXVkaXQgc3RhcnRlZCBmb3IgYHtyZXBvfWAqKlxuXG4iCiAgICAgICAgICAgICAgICBmIldhdGNoIHRoZSAqKkxpdmUgQWdlbnQgTG9nKiogYmVsb3cgZm9yIHJlYWwtdGltZSBwcm9ncmVzcy5cbiIKICAgICAgICAgICAgICAgIGYiSSdsbCBwb3N0IHJlc3VsdHMgaGVyZSB3aGVuIHRoZSBhdWRpdCBjb21wbGV0ZXMuXG5cbiIKICAgICAgICAgICAgICAgIGYiX01vZGVsOiBge01PREVMfWAgwrcgVGVuYW50OiBge1RFTkFOVF9JRH1gXyIKICAgICAgICAgICAgKSwKICAgICAgICB9LAogICAgXSwgIiIKCgpkZWYgZ2V0X2luYm94X2hpc3RvcnkoKSAtPiBsaXN0OgogICAgIiIiUHVsbCBhbnkgYmFja2dyb3VuZC1wb3N0ZWQgbWVzc2FnZXMgKGUuZy4gYXVkaXQtY29tcGxldGUpIGludG8gdGhlIGNoYXQuIiIiCiAgICB3aXRoIF9pbmJveF9sb2NrOgogICAgICAgIG1zZ3MgPSBsaXN0KF9pbmJveF9oaXN0b3J5KQogICAgICAgIF9pbmJveF9oaXN0b3J5LmNsZWFyKCkKICAgIHJldHVybiBtc2dzIG9yIFtdCgoKZGVmIHRyaWdnZXJfYXVkaXRfZm4oKToKICAgICIiIkxlZ2FjeSBidXR0b24gaGFuZGxlciDigJQgdXNlcyBHSVRIVUJfUkVQTyBlbnYgdmFyIGlmIHNldC4iIiIKICAgIGlmIG5vdCBHSVRIVUJfUkVQTzoKICAgICAgICByZXR1cm4gIuKaoO+4jyBObyBHSVRIVUJfUkVQTyBlbnYgdmFyIHNldC4gVXNlIHRoZSBjaGF0IGluYm94IGFib3ZlIHRvIGVudGVyIGEgcmVwby4iCiAgICBpZiBfYXVkaXRfZXZlbnQuaXNfc2V0KCk6CiAgICAgICAgcmV0dXJuICLimqDvuI8gQXVkaXQgYWxyZWFkeSBydW5uaW5nLiIKICAgIF9hdWRpdF9ldmVudC5zZXQoKQogICAgdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9ZW50ZXJwcmlzZV9hdWRpdF9sb29wLCBkYWVtb249VHJ1ZSkuc3RhcnQoKQogICAgcmV0dXJuIGYi8J+agCBBdWRpdCB0cmlnZ2VyZWQgZm9yIGB7R0lUSFVCX1JFUE99YCDigJQgZnVsbCBoZWFsaW5nIGxvb3AgZGVwbG95ZWQuIgoKCiMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiMgV0VCSE9PSyBESVNQQVRDSEVSCiMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACmRlZiBfd2ViaG9va19kaXNwYXRjaCgqKmt3YXJncyk6CiAgICBpZiBub3QgX2F1ZGl0X2V2ZW50LmlzX3NldCgpOgogICAgICAgIF9hdWRpdF9ldmVudC5zZXQoKQogICAgICAgIHRocmVhZGluZy5UaHJlYWQodGFyZ2V0PWVudGVycHJpc2VfYXVkaXRfbG9vcCwga3dhcmdzPWt3YXJncywgZGFlbW9uPVRydWUpLnN0YXJ0KCkKCnNldF9qb2JfZGlzcGF0Y2hlcihfd2ViaG9va19kaXNwYXRjaCkKCiMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiMgQVVUT05PTU9VUyBIQVJWRVNURVIgKGFudGFnb25pc3QgbW9kZSkKIyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKdHJ5OgogICAgZnJvbSByZXBvX2hhcnZlc3RlciBpbXBvcnQgc3RhcnRfaGFydmVzdGVyCiAgICBzdGFydF9oYXJ2ZXN0ZXIoZGlzcGF0Y2hfZm49X3dlYmhvb2tfZGlzcGF0Y2gpCmV4Y2VwdCBFeGNlcHRpb24gYXMgX2U6CiAgICBwYXNzICAjIGhhcnZlc3RlciBpcyBvcHRpb25hbCDigJQgZGlzYWJsZWQgYnkgZGVmYXVsdAoKCiMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiMgREFTSEJPQVJEIERBVEEgR0VUVEVSUwojIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgApkZWYgZ2V0X2xpdmVfbG9ncygpIC0+IHN0cjoKICAgIHdpdGggX2xvZ19sb2NrOgogICAgICAgIHJldHVybiAiXG4iLmpvaW4oZGFzaGJvYXJkX2xvZ3NbLTEwMDpdKQoKCmRlZiBnZXRfbWV0cmljc19yb3coKToKICAgIG0gPSBnZXRfbWV0cmljcygpCiAgICBzdGF0dXMgPSAi8J+foSBSdW5uaW5nLi4uIiBpZiBfYXVkaXRfZXZlbnQuaXNfc2V0KCkgZWxzZSAi8J+foiBJZGxlIC8gU2VjdXJlIgogICAgcmV0dXJuIChzdGF0dXMsIG1bInRvdGFsIl0sIG1bImRvbmUiXSwgbVsicHJzX2NyZWF0ZWQiXSwgbVsiZmFpbGVkIl0sIG1bInNhc3RfYmxvY2tlZCJdKQoKCmRlZiBnZXRfY29tYmluZWRfcmVmcmVzaCgpOgogICAgIiIiCiAgICBGSVggKFRpbWVyIEJ1Zyk6IENvbGxhcHNlIDMgY29uY3VycmVudCBTU0Ugc3RyZWFtcyBpbnRvIGEgc2luZ2xlIHRpY2suCiAgICBQcmV2aW91c2x5IGdyLlRpbWVyIGZpcmVkIDMgc2VwYXJhdGUgc2VydmVyLXNlbnQtZXZlbnQgc3RyZWFtcyBldmVyeSAzIHMKICAgIHBlciBicm93c2VyIHNlc3Npb24g4oCUIHVuZGVyIGNvbmN1cnJlbnQgdXNlcnMgdGhpcyBjb3VsZCBleGhhdXN0IEh1Z2dpbmdGYWNlCiAgICBTcGFjZSBjb25uZWN0aW9uIGxpbWl0cyBhbmQgZnJlZXplIHRoZSBVSS4gIEEgc2luZ2xlIHRpY2sgdGhhdCByZXR1cm5zIGFsbAogICAgZGF0YSBhdCBvbmNlIGlzIGVxdWl2YWxlbnQgYnV0IHVzZXMgb25seSBvbmUgY29ubmVjdGlvbi4KICAgICIiIgogICAgbG9ncyA9IGdldF9saXZlX2xvZ3MoKQogICAgbWV0cmljcyA9IGdldF9tZXRyaWNzX3JvdygpCiAgICBoZXJtZXNfbG9ncyA9IGhlcm1lc19nZXRfbGl2ZV9sb2dzKCkKICAgIHJldHVybiAobG9ncywpICsgbWV0cmljcyArIChoZXJtZXNfbG9ncywpCgoKZGVmIGdldF9qb2JfdGFibGUoKSAtPiBsaXN0W2xpc3RdOgogICAgam9icyA9IGxpc3RfYWxsX2pvYnMoKVs6MzBdCiAgICByb3dzID0gW10KICAgIGZvciBqIGluIGpvYnM6CiAgICAgICAgaWNvbnMgPSB7IkRPTkUiOiAi4pyFIiwgIkZBSUxFRCI6ICLinYwiLCAiU0FTVF9CTE9DS0VEIjogIvCfm6EgQmxvY2tlZCIsCiAgICAgICAgICAgICAgICAgIlJVTk5JTkciOiAi8J+UhCIsICJQRU5ESU5HIjogIuKPsyJ9CiAgICAgICAgcm93cy5hcHBlbmQoW2ouZ2V0KCJ0ZXN0X3BhdGgiLCAiIiksIGljb25zLmdldChqWyJzdGF0dXMiXSwgalsic3RhdHVzIl0pLAogICAgICAgICAgICAgICAgICAgICBqLmdldCgicHJfdXJsIiwgIuKAlCIpLCBqLmdldCgibW9kZWxfdmVyc2lvbiIsICLigJQiKSwgai5nZXQoInVwZGF0ZWRfYXQiLCAiIildKQogICAgcmV0dXJuIHJvd3Mgb3IgW1siTm8gam9icyB5ZXQiLCAiIiwgIiIsICIiLCAiIl1dCgoKZGVmIGdldF9hdWRpdF9kaXNwbGF5KCkgLT4gc3RyOgogICAgZXZlbnRzID0gcmVhZF9hdWRpdF90cmFpbCg0MCkKICAgIGlmIG5vdCBldmVudHM6CiAgICAgICAgcmV0dXJuICJObyBhdWRpdCBldmVudHMgeWV0LiIKICAgIGxpbmVzID0gW10KICAgIGZvciBlIGluIHJldmVyc2VkKGV2ZW50cyk6CiAgICAgICAgbGluZXMuYXBwZW5kKAogICAgICAgICAgICBmIlt7ZVsndGltZXN0YW1wX3V0YyddfV0ge2VbJ2V2ZW50X3R5cGUnXToyNXN9IHwge2VbJ291dGNvbWUnXToxMHN9IHwgIgogICAgICAgICAgICBmImhhc2g6e2VbJ2VudHJ5X2hhc2gnXVs6MTJdfS4uLiIKICAgICAgICApCiAgICByZXR1cm4gIlxuIi5qb2luKGxpbmVzKQoKCmRlZiBnZXRfY2hhaW5faW50ZWdyaXR5X2Rpc3BsYXkoKSAtPiBzdHI6CiAgICB2YWxpZCwgbXNnID0gdmVyaWZ5X2NoYWluX2ludGVncml0eSgpCiAgICByZXR1cm4gZiJ7J/CflJIgVkVSSUZJRUQnIGlmIHZhbGlkIGVsc2UgJ/CfmqggQ09NUFJPTUlTRUQnfSDigJQge21zZ30iCgoKZGVmIGdldF90cmFpbmluZ19zdGF0c19kaXNwbGF5KCkgLT4gc3RyOgogICAgdHJ5OgogICAgICAgIHN0YXRzID0gZ2V0X3N0YXRpc3RpY3MoKQogICAgICAgIG1lbSA9IGdldF9tZW1vcnlfc3RhdHMoKQogICAgICAgIHJldHVybiAoCiAgICAgICAgICAgIGYiVG90YWwgZml4IGF0dGVtcHRzOiAgICAgICAge3N0YXRzWyd0b3RhbF9hdHRlbXB0cyddfVxuIgogICAgICAgICAgICBmIlN1Y2Nlc3NmdWwgZml4ZXM6ICAgICAgICAgIHtzdGF0c1snc3VjY2Vzc2Z1bF9maXhlcyddfSAoe3N0YXRzWydmaXhfc3VjY2Vzc19yYXRlJ119KVxuIgogICAgICAgICAgICBmIlNBU1QgYmxvY2tlZDogICAgICAgICAgICAgIHtzdGF0c1snc2FzdF9ibG9ja2VkJ119XG4iCiAgICAgICAgICAgIGYiQWR2ZXJzYXJpYWxseSByZWplY3RlZDogICAge3N0YXRzWydhZHZlcnNhcmlhbGx5X3JlamVjdGVkJ119XG4iCiAgICAgICAgICAgIGYiSHVtYW4tbWVyZ2VkIFBSczogICAgICAgICAge3N0YXRzWydodW1hbl9tZXJnZWQnXX1cbiIKICAgICAgICAgICAgZiJNZW1vcnkgcGF0dGVybnMgc3RvcmVkOiAgICB7bWVtWydwYXR0ZXJuc19zdG9yZWQnXX0gKHttZW1bJ3N1Y2Nlc3NmdWxfcGF0dGVybnMnXX0gd2l0aCBzdWNjZXNzIHNpZ25hbClcblxuIgogICAgICAgICAgICBmIlRvcCByZWN1cnJpbmcgZmFpbHVyZXM6XG4iICsKICAgICAgICAgICAgIlxuIi5qb2luKGYiICB7dFsnYXR0ZW1wdHMnXX14ICB7dFsncGF0aCddfSIgZm9yIHQgaW4gc3RhdHMuZ2V0KCJ0b3BfZmFpbGluZ190ZXN0cyIsIFtdKSkKICAgICAgICApCiAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgcmV0dXJuIGYiU3RhdHMgdW5hdmFpbGFibGU6IHtlfSIKCgpkZWYgZ2V0X3RyYWluaW5nX2V4cG9ydCgpIC0+IHN0cjoKICAgIHRyeToKICAgICAgICBkYXRhID0gZXhwb3J0X3RyYWluaW5nX2RhdGEobGltaXQ9MTAwKQogICAgICAgIGlmIG5vdCBkYXRhOgogICAgICAgICAgICByZXR1cm4gIk5vIHRyYWluaW5nIGRhdGEgeWV0LiBSdW4gYXVkaXRzIHRvIGFjY3VtdWxhdGUgKGZhaWx1cmUsIGZpeCkgcGFpcnMuIgogICAgICAgIGxpbmVzID0gZGF0YS5zcGxpdCgiXG4iKQogICAgICAgIHJldHVybiBmIiMge2xlbihsaW5lcyl9IHRyYWluaW5nIGV4YW1wbGVzIChKU09OTCBmb3JtYXQpXG4jIENvcHkgYW5kIHVzZSBmb3IgZmluZS10dW5pbmdcblxuIiArIGRhdGFbOjgwMDBdCiAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgcmV0dXJuIGYiRXhwb3J0IGZhaWxlZDoge2V9IgoKCmRlZiBnZXRfd2ViaG9va19sb2dfZGlzcGxheSgpIC0+IHN0cjoKICAgIGZyb20gd2ViaG9va19zZXJ2ZXIgaW1wb3J0IGdldF93ZWJob29rX2xvZwogICAgZXZlbnRzID0gZ2V0X3dlYmhvb2tfbG9nKDMwKQogICAgaWYgbm90IGV2ZW50czoKICAgICAgICByZXR1cm4gKAogICAgICAgICAgICAiTm8gd2ViaG9vayBldmVudHMgeWV0LlxuXG4iCiAgICAgICAgICAgICJXZWJob29rIGVuZHBvaW50OiBQT1NUIGh0dHA6Ly90aGlzLXNwYWNlOjc4NjEvd2ViaG9vay9naXRodWJcbiIKICAgICAgICAgICAgIkhlYWx0aCBjaGVjazogICAgIEdFVCAgaHR0cDovL3RoaXMtc3BhY2U6Nzg2MS93ZWJob29rL2hlYWx0aCIKICAgICAgICApCiAgICBsaW5lcyA9IFsKICAgICAgICBmIlt7ZVsndGltZXN0YW1wJ119XSB7ZVsnZXZlbnRfdHlwZSddOjIwc30gfCB7ZVsnc3RhdHVzJ106OHN9IHwgIgogICAgICAgIGYie2UuZ2V0KCdyZXBvJywnJyl9IHwge2UuZ2V0KCdkZXRhaWwnLCcnKX0iCiAgICAgICAgZm9yIGUgaW4gZXZlbnRzCiAgICBdCiAgICByZXR1cm4gIlxuIi5qb2luKGxpbmVzKQoKCmRlZiBnZXRfcmVkX3RlYW1fZGlzcGxheSgpIC0+IHN0cjoKICAgIHN0YXRzID0gZ2V0X3JlZF90ZWFtX3N0YXRzKCkKICAgIHJldHVybiAoCiAgICAgICAgZiJaZXJvLWRheXMgZGlzY292ZXJlZDoge3N0YXRzWyd6ZXJvX2RheXNfZGlzY292ZXJlZCddfVxuIgogICAgICAgIGYiUHJvcGVydHktYmFzZWQgdGVzdHMgZ2VuZXJhdGVkOiB7c3RhdHNbJ3BidHNfZ2VuZXJhdGVkJ119XG4iCiAgICAgICAgZiJBcnRpZmFjdHMgZGlyZWN0b3J5OiB7c3RhdHNbJ3JlZF90ZWFtX2RpciddfVxuXG4iCiAgICAgICAgZiJSZWNlbnQgUmVkIFRlYW0gbG9nczpcbntzdGF0c1sncmVjZW50X2xvZ3MnXX0iCiAgICApCgoKZGVmIHRyaWdnZXJfc3dlYmVuY2hfZXZhbChtYXhfaW5zdGFuY2VzOiBpbnQgPSAyNSkgLT4gc3RyOgogICAgZGVmIF9ydW4oKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIGZyb20gc3dlYmVuY2hfaGFybmVzcyBpbXBvcnQgcnVuX3N3ZWJlbmNoX2V2YWwKICAgICAgICAgICAgIyBCVUctMDA5IC8gR0FQLUYgRklYOiBSb3V0ZSB0aHJvdWdoIFJob2Rhd2sncyBvd24gaGVhbGluZyBsb29wIHNvCiAgICAgICAgICAgICMgcGFzc0AxIG1ldHJpY3MgYXJlIHByb2R1Y2VkIGJ5IHRoZSBzYW1lIHBpcGVsaW5lIHVzZWQgaW4gcHJvZHVjdGlvbiwKICAgICAgICAgICAgIyBub3QgYnkgYW4gZXh0ZXJuYWwgc3R1YiBjb21tYW5kLgogICAgICAgICAgICB3aXRoIF9hY3RpdmVfcnVudGltZV9sb2NrOgogICAgICAgICAgICAgICAgcnVudGltZSA9IF9hY3RpdmVfcnVudGltZQogICAgICAgICAgICBlbnZfY2ZnID0gcnVudGltZS5zZXR1cF9lbnYoUkVQT19ESVIsIFBFUlNJU1RFTlRfRElSKSBpZiBydW50aW1lIGVsc2UgTm9uZQogICAgICAgICAgICBtY3BfY2ZnID0gd3JpdGVfbWNwX2NvbmZpZygpCiAgICAgICAgICAgIHJlc3VsdCA9IHJ1bl9zd2ViZW5jaF9ldmFsKAogICAgICAgICAgICAgICAgbWF4X2luc3RhbmNlcz1pbnQobWF4X2luc3RhbmNlcyksCiAgICAgICAgICAgICAgICBwcm9jZXNzX2ZuPXByb2Nlc3NfZmFpbGluZ190ZXN0IGlmIHJ1bnRpbWUgZWxzZSBOb25lLAogICAgICAgICAgICAgICAgZW52X2NvbmZpZz1lbnZfY2ZnLAogICAgICAgICAgICAgICAgbWNwX2NvbmZpZ19wYXRoPW1jcF9jZmcsCiAgICAgICAgICAgICAgICByZXBvX2Rpcj1SRVBPX0RJUiwKICAgICAgICAgICAgKQogICAgICAgICAgICB1aV9sb2coCiAgICAgICAgICAgICAgICBmIlNXRS1iZW5jaCBjb21wbGV0ZSDigJQgcGFzc0AxPXtyZXN1bHRbJ3Bhc3NfYXRfMSddOi4yJX0sICIKICAgICAgICAgICAgICAgIGYicmVzb2x2ZWQ9e3Jlc3VsdFsncmVzb2x2ZWQnXX0ve3Jlc3VsdFsndG90YWwnXX0gIgogICAgICAgICAgICAgICAgZiIobW9kZT17cmVzdWx0LmdldCgnbW9kZScsICd1bmtub3duJyl9KSIsCiAgICAgICAgICAgICAgICAiQkVOQ0giLAogICAgICAgICAgICApCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgICAgICB1aV9sb2coZiJTV0UtYmVuY2ggZXZhbCBmYWlsZWQ6IHtlfSIsICJCRU5DSCIpCiAgICB0aHJlYWRpbmcuVGhyZWFkKHRhcmdldD1fcnVuLCBkYWVtb249VHJ1ZSkuc3RhcnQoKQogICAgcmV0dXJuIGYiU1dFLWJlbmNoIFZlcmlmaWVkIGV2YWx1YXRpb24gc3RhcnRlZCBmb3Ige2ludChtYXhfaW5zdGFuY2VzKX0gaW5zdGFuY2UocykgdmlhIFJob2Rhd2sgbG9vcC4iCgoKZGVmIGdldF9zd2ViZW5jaF9kaXNwbGF5KCkgLT4gc3RyOgogICAgcGF0aCA9ICIvZGF0YS9zd2ViZW5jaF9yZXBvcnQubWQiCiAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMocGF0aCk6CiAgICAgICAgcmV0dXJuICJObyBTV0UtYmVuY2ggcmVwb3J0IHlldC4gU3RhcnQgYW4gZXZhbHVhdGlvbiB0byBnZW5lcmF0ZSBwYXNzQDEgcmVzdWx0cy4iCiAgICB3aXRoIG9wZW4ocGF0aCwgInIiLCBlbmNvZGluZz0idXRmLTgiKSBhcyBmOgogICAgICAgIHJldHVybiBmLnJlYWQoKVs6MTIwMDBdCgoKZGVmIGV4cG9ydF9jb21wbGlhbmNlX2Rpc3BsYXkoKSAtPiBzdHI6CiAgICB0cnk6CiAgICAgICAgcmV0dXJuIGYiQ29tcGxpYW5jZSByZXBvcnQgZXhwb3J0ZWQ6IHtleHBvcnRfY29tcGxpYW5jZV9yZXBvcnQoKX0iCiAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgcmV0dXJuIGYiQ29tcGxpYW5jZSBleHBvcnQgZmFpbGVkOiB7ZX0iCgoKZGVmIHJlc2V0X3F1ZXVlKCk6CiAgICBpbXBvcnQgc2h1dGlsCiAgICBzaHV0aWwucm10cmVlKCIvZGF0YS9qb2JzIiwgaWdub3JlX2Vycm9ycz1UcnVlKQogICAgIyBBbHNvIHVuYmxvY2sgdGhlIGF1ZGl0IGV2ZW50IHNvIGEgbmV3IHJlcG8gY2FuIGJlIHN1Ym1pdHRlZCBpbW1lZGlhdGVseQogICAgX2F1ZGl0X2V2ZW50LmNsZWFyKCkKICAgIHVpX2xvZygi8J+XkSBRdWV1ZSBjbGVhcmVkIGFuZCBhdWRpdCBsb2NrIHJlbGVhc2VkIGJ5IG9wZXJhdG9yLiIsICJXQVJOIikKICAgIHJldHVybiAi4pyFIFF1ZXVlIGNsZWFyZWQgYW5kIGF1ZGl0IHN0b3BwZWQuIFlvdSBjYW4gbm93IHN1Ym1pdCBhIG5ldyByZXBvc2l0b3J5LiIKCgojIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAojIEVUSElDQUwgU0VDVVJJVFkgUkVTRUFSQ0ggUElQRUxJTkUKIyBIdW1hbiBhcHByb3ZhbCBnYXRlIGF0IGV2ZXJ5IHN0YWdlIOKAlCBub3RoaW5nIGRpc2Nsb3NlZCBhdXRvbWF0aWNhbGx5CiMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACgpkZWYgX3Jlc2VhcmNoX2Nsb25lKHJlcG86IHN0cikgLT4gc3RyOgogICAgIiIiQ2xvbmUgcmVwbyB0byBhIGxvY2FsIHJlc2VhcmNoIGRpcmVjdG9yeSAocmVhZC1vbmx5IGFuYWx5c2lzKS4iIiIKICAgIHJlcG9fZGlyID0gZiIvdG1wL3Jlc2VhcmNoX3tyZXBvLnJlcGxhY2UoJy8nLCAnXycpfSIKICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhyZXBvX2Rpcik6CiAgICAgICAgdWlfbG9nKGYiQ2xvbmluZyB7cmVwb30gZm9yIHN0YXRpYyBhbmFseXNpcy4uLiIsICJJTkZPIikKICAgICAgICAjIEZJWC0wMDk6IFVzZSBydW5fc3VicHJvY2Vzc19zYWZlIHNvIEdJVF9DT05GSUdfR0xPQkFMIGNyZWRlbnRpYWxzIGFyZSBpbmhlcml0ZWQuCiAgICAgICAgcnVuX3N1YnByb2Nlc3Nfc2FmZSgKICAgICAgICAgICAgWyJnaXQiLCAiY2xvbmUiLCAiLXYiLCBmImh0dHBzOi8vZ2l0aHViLmNvbS97cmVwb30uZ2l0IiwgcmVwb19kaXJdLAogICAgICAgICAgICBjd2Q9Ii90bXAiLCByYWlzZV9vbl9lcnJvcj1UcnVlLAogICAgICAgICkKICAgIHJldHVybiByZXBvX2RpcgoKCmRlZiBydW5fc2VtYW50aWNfYW5hbHlzaXMocmVwb19pbnB1dDogc3RyKSAtPiB0dXBsZVtzdHIsIHN0cl06CiAgICAiIiJQdXJlIHN0YXRpYyBhbmFseXNpcyDigJQgbm8gY29kZSBleGVjdXRlZC4iIiIKICAgIHJlcG8gPSAocmVwb19pbnB1dCBvciAiIikuc3RyaXAoKQogICAgaWYgbm90IHJlcG8gb3IgIi8iIG5vdCBpbiByZXBvIG9yIGxlbihyZXBvLnNwbGl0KCIvIikpICE9IDI6CiAgICAgICAgcmV0dXJuICLinYwgVXNlIGZvcm1hdDogb3duZXIvcmVwbyIsICIiCiAgICB0cnk6CiAgICAgICAgZnJvbSBzZW1hbnRpY19leHRyYWN0b3IgaW1wb3J0IHJ1bl9zZW1hbnRpY19leHRyYWN0aW9uCiAgICAgICAgZnJvbSBsYW5ndWFnZV9ydW50aW1lIGltcG9ydCBSdW50aW1lRmFjdG9yeQogICAgICAgIHJlcG9fZGlyID0gX3Jlc2VhcmNoX2Nsb25lKHJlcG8pCiAgICAgICAgcnVudGltZSA9IFJ1bnRpbWVGYWN0b3J5LmZvcl9yZXBvKHJlcG9fZGlyKQogICAgICAgIHJlc3VsdCA9IHJ1bl9zZW1hbnRpY19leHRyYWN0aW9uKHJlcG9fZGlyLCBydW50aW1lLmxhbmd1YWdlKQogICAgICAgIGdhcHMgPSByZXN1bHQuZ2V0KCJhc3N1bXB0aW9uX2dhcHMiLCBbXSkKICAgICAgICBzdW1tYXJ5ID0gKAogICAgICAgICAgICBmIlN0YXRpYyBhbmFseXNpcyBjb21wbGV0ZS5cbiIKICAgICAgICAgICAgZiJMYW5ndWFnZToge3Jlc3VsdC5nZXQoJ2xhbmd1YWdlJywgJ3Vua25vd24nKX1cbiIKICAgICAgICAgICAgZiJGaWxlcyBhbmFseXNlZDoge2xlbihyZXN1bHQuZ2V0KCdhbmFseXplZF9maWxlcycsIFtdKSl9XG4iCiAgICAgICAgICAgIGYiQXNzdW1wdGlvbiBnYXBzIGZvdW5kOiB7bGVuKGdhcHMpfVxuXG4iCiAgICAgICAgICAgIGYiQWxsIGZpbmRpbmdzIHRhZ2dlZCByZXF1aXJlc19odW1hbl92ZXJpZmljYXRpb249dHJ1ZS4iCiAgICAgICAgKQogICAgICAgIHVpX2xvZyhmIlNlbWFudGljIGFuYWx5c2lzOiB7cmVwb30g4oaSIHtsZW4oZ2Fwcyl9IGdhcChzKSIsICJJTkZPIikKICAgICAgICByZXR1cm4gc3VtbWFyeSwganNvbi5kdW1wcyhyZXN1bHQsIGluZGVudD0yKVs6MTAwMDBdCiAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgcmV0dXJuIGYiQW5hbHlzaXMgZmFpbGVkOiB7ZX0iLCAiIgoKCmRlZiBnZW5lcmF0ZV9oYXJuZXNzX2Zvcl9yZXZpZXcoZ2FwX2pzb246IHN0ciwgcmVwb19pbnB1dDogc3RyKSAtPiBzdHI6CiAgICAiIiJHZW5lcmF0ZSBQb0MgaGFybmVzcyBmb3Igb3BlcmF0b3IgcmV2aWV3IOKAlCBOT1QgZXhlY3V0ZWQgaGVyZS4iIiIKICAgIHRyeToKICAgICAgICBmcm9tIGhhcm5lc3NfZmFjdG9yeSBpbXBvcnQgZ2VuZXJhdGVfcG9jX2hhcm5lc3MKICAgICAgICBnYXAgPSBqc29uLmxvYWRzKGdhcF9qc29uKQogICAgICAgIHJlcG9fZGlyID0gZiIvdG1wL3Jlc2VhcmNoX3tyZXBvX2lucHV0LnN0cmlwKCkucmVwbGFjZSgnLycsICdfJyl9IgogICAgICAgIHJlc3VsdCA9IGdlbmVyYXRlX3BvY19oYXJuZXNzKGdhcCwgcmVwb19kaXIpCiAgICAgICAgaWYgImVycm9yIiBpbiByZXN1bHQ6CiAgICAgICAgICAgIHJldHVybiBmIkdlbmVyYXRpb24gZmFpbGVkOiB7cmVzdWx0WydlcnJvciddfSIKICAgICAgICByZXR1cm4gKAogICAgICAgICAgICBmIlN0YXR1czoge3Jlc3VsdFsnc3RhdHVzJ119XG4iCiAgICAgICAgICAgIGYiR2FwIElEOiB7cmVzdWx0WydnYXBfaWQnXX1cblxuIgogICAgICAgICAgICBmIi0tLSBSRVZJRVcgVEhJUyBDT0RFIEJFRk9SRSBBUFBST1ZJTkcgRVhFQ1VUSU9OIC0tLVxuXG4iCiAgICAgICAgICAgIGYie3Jlc3VsdFsnaGFybmVzc19jb2RlJ119IgogICAgICAgICkKICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICByZXR1cm4gZiJFcnJvcjoge2V9IgoKCmRlZiBleGVjdXRlX2FwcHJvdmVkX2hhcm5lc3MoaGFybmVzc19jb2RlOiBzdHIsIHJlcG9faW5wdXQ6IHN0ciwgdmVudl9wYXRoOiBzdHIpIC0+IHN0cjoKICAgICIiIgogICAgU2FuZGJveCBleGVjdXRpb24g4oCUIG9ubHkgYWZ0ZXIgb3BlcmF0b3IgcmVhZHMgYW5kIGFwcHJvdmVzIGhhcm5lc3MuCiAgICBObyBuZXR3b3JrIGFjY2Vzcywgc2VjcmV0cyBzdHJpcHBlZCwgMzAgcyB0aW1lb3V0LgogICAgIiIiCiAgICBpZiBub3QgaGFybmVzc19jb2RlLnN0cmlwKCk6CiAgICAgICAgcmV0dXJuICLinYwgTm8gaGFybmVzcyBjb2RlIHByb3ZpZGVkLiIKICAgIHRyeToKICAgICAgICBmcm9tIGhhcm5lc3NfZmFjdG9yeSBpbXBvcnQgcnVuX2hhcm5lc3NfaW5fc2FuZGJveAogICAgICAgIHJlcG9fZGlyID0gZiIvdG1wL3Jlc2VhcmNoX3tyZXBvX2lucHV0LnN0cmlwKCkucmVwbGFjZSgnLycsICdfJyl9IgogICAgICAgIGVmZmVjdGl2ZV92ZW52ID0gdmVudl9wYXRoLnN0cmlwKCkgb3IgVkVOVl9ESVIKICAgICAgICAjIEZJWCAoVmVudiBQYXRoIEJ1Zyk6IElmIG5vIGF1ZGl0IGhhcyBydW4geWV0IHRoZSB2ZW52IG1heSBub3QgZXhpc3Q7CiAgICAgICAgIyBjcmVhdGUgaXQgb24tZGVtYW5kIHNvIHN0YW5kYWxvbmUgU2VjdXJpdHkgUmVzZWFyY2ggdGFiIGV4ZWN1dGlvbiBzdWNjZWVkcy4KICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoZWZmZWN0aXZlX3ZlbnYpOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBzZXR1cF90YXJnZXRfdmVudigpCiAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgX3ZlOgogICAgICAgICAgICAgICAgcmV0dXJuIGYi4pqg77iPICBDb3VsZCBub3Qgc2V0IHVwIHZlbnYgYXQge2VmZmVjdGl2ZV92ZW52fToge192ZX1cblBsZWFzZSBydW4gYW4gYXVkaXQgZmlyc3Qgb3Igc3BlY2lmeSBhbiBleGlzdGluZyB2ZW52IHBhdGguIgogICAgICAgIHIgPSBydW5faGFybmVzc19pbl9zYW5kYm94KGhhcm5lc3NfY29kZSwgcmVwb19kaXIsIGVmZmVjdGl2ZV92ZW52KQogICAgICAgIHN0YXR1cyA9ICLimqDvuI8gIEdBUCBUUklHR0VSRUQgaW4gc2FuZGJveCIgaWYgci5nZXQoInRyaWdnZXJlZCIpIGVsc2UgIuKchSBOb3QgdHJpZ2dlcmVkIgogICAgICAgIHJldHVybiAoCiAgICAgICAgICAgIGYie3N0YXR1c31cblxuIgogICAgICAgICAgICBmIkV4aXQgY29kZSA6IHtyLmdldCgnZXhpdF9jb2RlJywgJ04vQScpfVxuIgogICAgICAgICAgICBmIlRpbWVkIG91dCA6IHtyLmdldCgndGltZWRfb3V0JywgRmFsc2UpfVxuXG4iCiAgICAgICAgICAgIGYiU3Rkb3V0Olxue3IuZ2V0KCdzdGRvdXQnLCAnJyl9XG5cbiIKICAgICAgICAgICAgZiJTdGRlcnI6XG57ci5nZXQoJ3N0ZGVycicsICcnKX0iCiAgICAgICAgKQogICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgIHJldHVybiBmIlNhbmRib3ggZXJyb3I6IHtlfSIKCgpkZWYgc3RvcmVfcHJpbWl0aXZlX2ZpbmRpbmcoCiAgICByZXBvX2lucHV0OiBzdHIsIGdhcF9pZDogc3RyLCBzZXZlcml0eTogc3RyLAogICAgZGVzY3JpcHRpb246IHN0ciwgdHJpZ2dlcmVkX3N0cjogc3RyLCBzYW5kYm94X291dHB1dDogc3RyLAopIC0+IHN0cjoKICAgIHRyeToKICAgICAgICBmcm9tIGNoYWluX2FuYWx5emVyIGltcG9ydCBzdG9yZV9wcmltaXRpdmUKICAgICAgICB0cmlnZ2VyZWQgPSAiVFJJR0dFUkVEOiBUcnVlIiBpbiAoc2FuZGJveF9vdXRwdXQgb3IgIiIpCiAgICAgICAgZmlkID0gc3RvcmVfcHJpbWl0aXZlKAogICAgICAgICAgICByZXBvPXJlcG9faW5wdXQuc3RyaXAoKSwgZ2FwX2lkPWdhcF9pZC5zdHJpcCgpLAogICAgICAgICAgICBzZXZlcml0eT1zZXZlcml0eS5zdHJpcCgpLCBkZXNjcmlwdGlvbj1kZXNjcmlwdGlvbi5zdHJpcCgpLAogICAgICAgICAgICB0cmlnZ2VyZWQ9dHJpZ2dlcmVkLCBjb25maWRlbmNlPSJNRURJVU0iLAogICAgICAgICAgICBoYXJuZXNzX3Jlc3VsdD17InN0ZG91dCI6IHNhbmRib3hfb3V0cHV0fSwKICAgICAgICApCiAgICAgICAgcmV0dXJuIGYi4pyFIFByaW1pdGl2ZSBzdG9yZWQgd2l0aCBJRDoge2ZpZH0iCiAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgcmV0dXJuIGYiRXJyb3I6IHtlfSIKCgpkZWYgcnVuX2NoYWluX2FuYWx5c2lzKHJlcG9faW5wdXQ6IHN0cikgLT4gc3RyOgogICAgdHJ5OgogICAgICAgIGZyb20gY2hhaW5fYW5hbHl6ZXIgaW1wb3J0IGFuYWx5emVfY2hhaW5zLCBnZXRfcGVuZGluZ19jaGFpbnMKICAgICAgICByZXBvID0gcmVwb19pbnB1dC5zdHJpcCgpCiAgICAgICAgY2hhaW5zID0gYW5hbHl6ZV9jaGFpbnMocmVwbykgaWYgcmVwbyBlbHNlIFtdCiAgICAgICAgcGVuZGluZyA9IGdldF9wZW5kaW5nX2NoYWlucyhyZXBvIGlmIHJlcG8gZWxzZSBOb25lKQogICAgICAgIGlmIG5vdCBwZW5kaW5nOgogICAgICAgICAgICByZXR1cm4gIk5vIGNoYWlucyBpZGVudGlmaWVkIHlldC4gU3RvcmUgcHJpbWl0aXZlIGZpbmRpbmdzIGZpcnN0LiIKICAgICAgICBsaW5lcyA9IFtdCiAgICAgICAgZm9yIGMgaW4gcGVuZGluZzoKICAgICAgICAgICAgbGluZXMuYXBwZW5kKAogICAgICAgICAgICAgICAgZiJbe2NbJ2lkJ119XSB7Y1snc2V2ZXJpdHknXX0gfCBDb25maWRlbmNlOiB7Y1snY29uZmlkZW5jZSddfVxuIgogICAgICAgICAgICAgICAgZiIgIFJlcG86IHtjWydyZXBvJ119XG4iCiAgICAgICAgICAgICAgICBmIiAge2NbJ2Rlc2NyaXB0aW9uJ11bOjIwMF19XG4iCiAgICAgICAgICAgICAgICBmIiAgU3RhdHVzOiB7Y1snc3RhdHVzJ119IgogICAgICAgICAgICApCiAgICAgICAgcmV0dXJuIGYiUHJvcG9zZWQgY2hhaW5zIChQRU5ESU5HIEhVTUFOIFJFVklFVyk6XG5cbiIgKyAiXG5cbiIuam9pbihsaW5lcykKICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICByZXR1cm4gZiJFcnJvcjoge2V9IgoKCmRlZiBnZXRfdmF1bHRfZGlzcGxheSgpIC0+IHN0cjoKICAgIHRyeToKICAgICAgICBmcm9tIGRpc2Nsb3N1cmVfdmF1bHQgaW1wb3J0IGdldF9hbGxfZGlzY2xvc3VyZXMKICAgICAgICBpdGVtcyA9IGdldF9hbGxfZGlzY2xvc3VyZXMoKQogICAgICAgIGlmIG5vdCBpdGVtczoKICAgICAgICAgICAgcmV0dXJuICJObyBkaXNjbG9zdXJlcyB5ZXQuIgogICAgICAgIGxpbmVzID0gW10KICAgICAgICBmb3IgZCBpbiBpdGVtczoKICAgICAgICAgICAgbGluZXMuYXBwZW5kKAogICAgICAgICAgICAgICAgZiJbe2RbJ2lkJ119XSB7ZFsnc2V2ZXJpdHknXX0g4oCUIHtkWydyZXBvJ119XG4iCiAgICAgICAgICAgICAgICBmIiAgVGl0bGUgOiB7ZFsndGl0bGUnXVs6NzBdfVxuIgogICAgICAgICAgICAgICAgZiIgIFN0YXR1czoge2RbJ3N0YXR1cyddfSB8IERheXMgcmVtYWluaW5nOiB7ZFsnZGF5c19yZW1haW5pbmcnXX1cbiIKICAgICAgICAgICAgICAgIGYiICBCdWcgQm91bnR5OiB7ZC5nZXQoJ2J1Z19ib3VudHlfcHJvZ3JhbScsJ04vQScpfSIKICAgICAgICAgICAgKQogICAgICAgIHJldHVybiAiXG5cbiIuam9pbihsaW5lcykKICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICByZXR1cm4gZiJFcnJvcjoge2V9IgoKCmRlZiByZWFkX2Rvc3NpZXJfZm4oZGlzY2xvc3VyZV9pZDogc3RyKSAtPiBzdHI6CiAgICB0cnk6CiAgICAgICAgZnJvbSBkaXNjbG9zdXJlX3ZhdWx0IGltcG9ydCByZWFkX2Rvc3NpZXIKICAgICAgICByZXR1cm4gcmVhZF9kb3NzaWVyKGRpc2Nsb3N1cmVfaWQuc3RyaXAoKSkKICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICByZXR1cm4gZiJFcnJvcjoge2V9IgoKCmRlZiBjb21waWxlX2Rvc3NpZXJfZm4oCiAgICByZXBvX2lucHV0OiBzdHIsIGdhcF9qc29uOiBzdHIsIGhhcm5lc3NfcmVzdWx0OiBzdHIsIGJ1Z19ib3VudHk6IHN0ciwKKSAtPiBzdHI6CiAgICB0cnk6CiAgICAgICAgZnJvbSBkaXNjbG9zdXJlX3ZhdWx0IGltcG9ydCBjb21waWxlX2Rvc3NpZXIKICAgICAgICBnYXAgPSBqc29uLmxvYWRzKGdhcF9qc29uKSBpZiBnYXBfanNvbi5zdHJpcCgpIGVsc2Uge30KICAgICAgICBkaWQgPSBjb21waWxlX2Rvc3NpZXIoCiAgICAgICAgICAgIHJlcG89cmVwb19pbnB1dC5zdHJpcCgpLAogICAgICAgICAgICBzZW1hbnRpY19ncmFwaD17fSwKICAgICAgICAgICAgYXNzdW1wdGlvbl9nYXA9Z2FwLAogICAgICAgICAgICBoYXJuZXNzX3Jlc3VsdD17InN0ZG91dCI6IGhhcm5lc3NfcmVzdWx0LCAidHJpZ2dlcmVkIjogIlRSSUdHRVJFRDogVHJ1ZSIgaW4gaGFybmVzc19yZXN1bHR9LAogICAgICAgICAgICBidWdfYm91bnR5X3Byb2dyYW09YnVnX2JvdW50eS5zdHJpcCgpLAogICAgICAgICkKICAgICAgICByZXR1cm4gZiLinIUgRG9zc2llciBjb21waWxlZC4gRGlzY2xvc3VyZSBJRDoge2RpZH1cblN0YXR1czogRFJBRlQg4oCUIGF3YWl0aW5nIGh1bWFuIGFwcHJvdmFsLiIKICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICByZXR1cm4gZiJFcnJvcjoge2V9IgoKCmRlZiBhcHByb3ZlX2FuZF9wcmVwYXJlX21zZyhkaXNjbG9zdXJlX2lkOiBzdHIsIGFwcHJvdmVyOiBzdHIpIC0+IHN0cjoKICAgIHRyeToKICAgICAgICBmcm9tIGRpc2Nsb3N1cmVfdmF1bHQgaW1wb3J0IGFwcHJvdmVfZGlzY2xvc3VyZSwgcHJlcGFyZV9kaXNjbG9zdXJlX21lc3NhZ2UKICAgICAgICBhcHByb3ZlX2Rpc2Nsb3N1cmUoZGlzY2xvc3VyZV9pZC5zdHJpcCgpLCBhcHByb3Zlci5zdHJpcCgpIG9yICJvcGVyYXRvciIpCiAgICAgICAgbXNnID0gcHJlcGFyZV9kaXNjbG9zdXJlX21lc3NhZ2UoZGlzY2xvc3VyZV9pZC5zdHJpcCgpKQogICAgICAgIHJldHVybiBmIuKchSBBcHByb3ZlZCBieToge2FwcHJvdmVyfVxuXG4tLS0gRElTQ0xPU1VSRSBNRVNTQUdFIChzZW5kIG1hbnVhbGx5KSAtLS1cblxue21zZ30iCiAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgcmV0dXJuIGYiRXJyb3I6IHtlfSIKCgpkZWYgcmVqZWN0X2Rpc2Nsb3N1cmVfZm4oZGlzY2xvc3VyZV9pZDogc3RyKSAtPiBzdHI6CiAgICB0cnk6CiAgICAgICAgZnJvbSBkaXNjbG9zdXJlX3ZhdWx0IGltcG9ydCByZWplY3RfZGlzY2xvc3VyZQogICAgICAgIHJlamVjdF9kaXNjbG9zdXJlKGRpc2Nsb3N1cmVfaWQuc3RyaXAoKSkKICAgICAgICByZXR1cm4gZiLinIUgRGlzY2xvc3VyZSB7ZGlzY2xvc3VyZV9pZC5zdHJpcCgpfSByZWplY3RlZCBhbmQgYXJjaGl2ZWQuIgogICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgIHJldHVybiBmIkVycm9yOiB7ZX0iCgoKIyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKIyBIRVJNRVMgT1JDSEVTVFJBVE9SIEhFTFBFUlMKIyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKCl9oZXJtZXNfc2Vzc2lvbnM6IGRpY3QgPSB7fQpfaGVybWVzX2FjdGl2ZV9zZXNzaW9uX2lkOiBzdHIgPSAiIgpfaGVybWVzX3J1bm5pbmcgPSB0aHJlYWRpbmcuRXZlbnQoKQoKCmRlZiBfaGVybWVzX3J1bl9iYWNrZ3JvdW5kKAogICAgdGFyZ2V0X3JlcG86IHN0ciwKICAgIHJlcG9fZGlyOiBzdHIsCiAgICBmb2N1c19hcmVhOiBzdHIsCiAgICBtYXhfaXRlcmF0aW9uczogaW50LAopIC0+IE5vbmU6CiAgICBnbG9iYWwgX2hlcm1lc19hY3RpdmVfc2Vzc2lvbl9pZAogICAgX2hlcm1lc19ydW5uaW5nLnNldCgpCiAgICB0cnk6CiAgICAgICAgc2Vzc2lvbiA9IHJ1bl9oZXJtZXNfcmVzZWFyY2goCiAgICAgICAgICAgIHRhcmdldF9yZXBvPXRhcmdldF9yZXBvLAogICAgICAgICAgICByZXBvX2Rpcj1yZXBvX2RpciwKICAgICAgICAgICAgZm9jdXNfYXJlYT1mb2N1c19hcmVhLAogICAgICAgICAgICBtYXhfaXRlcmF0aW9ucz1pbnQobWF4X2l0ZXJhdGlvbnMpLAogICAgICAgICkKICAgICAgICBfaGVybWVzX3Nlc3Npb25zW3Nlc3Npb24uc2Vzc2lvbl9pZF0gPSBzZXNzaW9uCiAgICAgICAgX2hlcm1lc19hY3RpdmVfc2Vzc2lvbl9pZCA9IHNlc3Npb24uc2Vzc2lvbl9pZAoKICAgICAgICBmb3IgZmluZGluZyBpbiBzZXNzaW9uLmZpbmRpbmdzOgogICAgICAgICAgICBhZGRfdG9fcGlwZWxpbmUoCiAgICAgICAgICAgICAgICBmaW5kaW5nX2lkPWZpbmRpbmcuZmluZGluZ19pZCwKICAgICAgICAgICAgICAgIHRpdGxlPWZpbmRpbmcudGl0bGUsCiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj1maW5kaW5nLmRlc2NyaXB0aW9uLAogICAgICAgICAgICAgICAgcHJvb2Zfb2ZfY29uY2VwdD1maW5kaW5nLnByb29mX29mX2NvbmNlcHQsCiAgICAgICAgICAgICAgICB0YXJnZXRfcmVwbz10YXJnZXRfcmVwbywKICAgICAgICAgICAgICAgIGN3ZV9pZD1maW5kaW5nLmN3ZV9pZCwKICAgICAgICAgICAgICAgIHNldmVyaXR5PWZpbmRpbmcuc2V2ZXJpdHksCiAgICAgICAgICAgICAgICBlc3RpbWF0ZWRfY3Zzcz1yb3VuZChmaW5kaW5nLnZlc19zY29yZSwgMSksCiAgICAgICAgICAgICAgICBib3VudHlfdGllcj0iUDEiIGlmIGZpbmRpbmcudmVzX3Njb3JlID49IDggZWxzZSAiUDIiIGlmIGZpbmRpbmcudmVzX3Njb3JlID49IDUgZWxzZSAiUDMiLAogICAgICAgICAgICAgICAgZXhwbG9pdF9jbGFzcz1maW5kaW5nLmV4cGxvaXRfcHJpbWl0aXZlLAogICAgICAgICAgICApCiAgICBmaW5hbGx5OgogICAgICAgIF9oZXJtZXNfcnVubmluZy5jbGVhcigpCgoKZGVmIGhlcm1lc19zdGFydF9yZXNlYXJjaCgKICAgIHRhcmdldF9yZXBvOiBzdHIsIGxvY2FsX3BhdGg6IHN0ciwgZm9jdXNfYXJlYTogc3RyLCBtYXhfaXRlcjogc3RyCikgLT4gc3RyOgogICAgaWYgX2hlcm1lc19ydW5uaW5nLmlzX3NldCgpOgogICAgICAgIHJldHVybiAi4pqg77iPIEhlcm1lcyBpcyBhbHJlYWR5IHJ1bm5pbmcgYSByZXNlYXJjaCBzZXNzaW9uLiBXYWl0IGZvciBpdCB0byBjb21wbGV0ZS4iCiAgICBpZiBub3QgdGFyZ2V0X3JlcG8uc3RyaXAoKToKICAgICAgICByZXR1cm4gIuKdjCBUYXJnZXQgcmVwb3NpdG9yeSBpcyByZXF1aXJlZCAoZS5nLiBvd25lci9yZXBvKSIKCiAgICByZXBvX2RpciA9IGxvY2FsX3BhdGguc3RyaXAoKSBvciBmIi9kYXRhL3JlcG8ve3RhcmdldF9yZXBvLnNwbGl0KCcvJylbLTFdfSIKICAgIGlmIG5vdCBvcy5wYXRoLmlzZGlyKHJlcG9fZGlyKToKICAgICAgICByZXR1cm4gZiLinYwgTG9jYWwgcGF0aCBub3QgZm91bmQ6IHtyZXBvX2Rpcn1cbkNsb25lIHRoZSByZXBvIGZpcnN0IHVzaW5nIHRoZSBtYWluIEF1ZGl0IHRhYi4iCgogICAgdCA9IHRocmVhZGluZy5UaHJlYWQoCiAgICAgICAgdGFyZ2V0PV9oZXJtZXNfcnVuX2JhY2tncm91bmQsCiAgICAgICAgYXJncz0odGFyZ2V0X3JlcG8uc3RyaXAoKSwgcmVwb19kaXIsIGZvY3VzX2FyZWEuc3RyaXAoKSwgbWF4X2l0ZXIgb3IgMTUpLAogICAgICAgIGRhZW1vbj1UcnVlLCBuYW1lPSJoZXJtZXMtcmVzZWFyY2giLAogICAgKQogICAgdC5zdGFydCgpCiAgICByZXR1cm4gKAogICAgICAgIGYi8J+noCBIZXJtZXMgc3RhcnRlZCBvbiB7dGFyZ2V0X3JlcG99XG4iCiAgICAgICAgZiJGb2N1czoge2ZvY3VzX2FyZWEgb3IgJ0Z1bGwgYXV0b25vbW91cyBzY2FuJ31cbiIKICAgICAgICBmIk1heCBpdGVyYXRpb25zOiB7bWF4X2l0ZXJ9XG5cbiIKICAgICAgICAiV2F0Y2ggdGhlIGxpdmUgbG9ncyBiZWxvdy4gRmluZGluZ3Mgd2lsbCBhcHBlYXIgaW4gdGhlIERpc2Nsb3N1cmUgUGlwZWxpbmUgdGFiLiIKICAgICkKCgpkZWYgaGVybWVzX2dldF9saXZlX2xvZ3MoKSAtPiBzdHI6CiAgICBsb2dzID0gZ2V0X2hlcm1lc19sb2dzKCkKICAgIHN0YXR1cyA9ICLwn5SEIFJVTk5JTkciIGlmIF9oZXJtZXNfcnVubmluZy5pc19zZXQoKSBlbHNlICLij7ggSURMRSIKICAgIGhlYWRlciA9IGYiW0hFUk1FUyBTVEFUVVM6IHtzdGF0dXN9XVxueyfilIAnICogNTB9XG4iCiAgICByZXR1cm4gaGVhZGVyICsgIlxuIi5qb2luKGxvZ3NbLTgwOl0pIGlmIGxvZ3MgZWxzZSBoZWFkZXIgKyAiTm8gbG9ncyB5ZXQuIgoKCmRlZiBoZXJtZXNfZ2V0X3Nlc3Npb25fc3VtbWFyeSgpIC0+IHN0cjoKICAgIGlmIG5vdCBfaGVybWVzX2FjdGl2ZV9zZXNzaW9uX2lkOgogICAgICAgIHJldHVybiAiTm8gc2Vzc2lvbiBjb21wbGV0ZWQgeWV0LiIKICAgIHNlc3Npb24gPSBfaGVybWVzX3Nlc3Npb25zLmdldChfaGVybWVzX2FjdGl2ZV9zZXNzaW9uX2lkKQogICAgaWYgbm90IHNlc3Npb246CiAgICAgICAgcmV0dXJuICJTZXNzaW9uIG5vdCBmb3VuZC4iCiAgICBzdW1tYXJ5ID0gZ2V0X3Nlc3Npb25fc3VtbWFyeShzZXNzaW9uKQogICAgbGluZXMgPSBbCiAgICAgICAgZiJTZXNzaW9uOiB7c3VtbWFyeVsnc2Vzc2lvbl9pZCddfSIsCiAgICAgICAgZiJUYXJnZXQ6IHtzdW1tYXJ5Wyd0YXJnZXQnXX0iLAogICAgICAgIGYiUGhhc2U6IHtzdW1tYXJ5WydwaGFzZSddfSIsCiAgICAgICAgZiJTdGFydGVkOiB7c3VtbWFyeVsnc3RhcnRlZF9hdCddfSIsCiAgICAgICAgZiJDb21wbGV0ZWQ6IHtzdW1tYXJ5LmdldCgnY29tcGxldGVkX2F0JywgJ2luIHByb2dyZXNzJyl9IiwKICAgICAgICBmIlRvdGFsIGZpbmRpbmdzOiB7c3VtbWFyeVsndG90YWxfZmluZGluZ3MnXX0iLAogICAgICAgIGYiQnkgc2V2ZXJpdHk6IHtzdW1tYXJ5WydieV9zZXZlcml0eSddfSIsCiAgICAgICAgZiJUb29sIGNhbGxzOiB7c3VtbWFyeVsndG9vbF9jYWxscyddfSIsCiAgICAgICAgZiJBdHRhY2sgc3VyZmFjZSBzaW5rczoge3N1bW1hcnlbJ2F0dGFja19zdXJmYWNlX3NpemUnXX0iLAogICAgICAgICIiLAogICAgICAgICJUT1AgRklORElOR1MgKGJ5IFZFUyBzY29yZSk6IiwKICAgIF0KICAgIGZvciBmIGluIHN1bW1hcnlbInRvcF9maW5kaW5ncyJdOgogICAgICAgIGxpbmVzLmFwcGVuZCgKICAgICAgICAgICAgZiIgIFt7Zlsnc2V2ZXJpdHknXX1dIHtmWyd0aXRsZSddWzo2MF19XG4iCiAgICAgICAgICAgIGYiICAgIENXRToge2ZbJ2N3ZSddfSB8IFZFUzoge2ZbJ3ZlcyddfSB8IEFDVFM6IHtmWydhY3RzJ119XG4iCiAgICAgICAgICAgIGYiICAgIEZpbGU6IHtmWydmaWxlJ119IHwgU3RhdHVzOiB7Zlsnc3RhdHVzJ119IgogICAgICAgICkKICAgIHJldHVybiAiXG4iLmpvaW4obGluZXMpCgoKZGVmIGhlcm1lc19nZXRfcGlwZWxpbmVfZGlzcGxheSgpIC0+IHN0cjoKICAgIHJldHVybiBnZXRfcGlwZWxpbmVfc3VtbWFyeSgpCgoKZGVmIGhlcm1lc19hcHByb3ZlX2ZpbmRpbmcocmVjb3JkX2lkOiBzdHIsIG5vdGVzOiBzdHIpIC0+IHN0cjoKICAgIGlmIG5vdCByZWNvcmRfaWQuc3RyaXAoKToKICAgICAgICByZXR1cm4gIuKdjCBSZWNvcmQgSUQgcmVxdWlyZWQiCiAgICByZXN1bHQgPSBodW1hbl9hcHByb3ZlKHJlY29yZF9pZC5zdHJpcCgpLCBub3Rlcy5zdHJpcCgpKQogICAgcmV0dXJuIGYi4pyFIEZpbmRpbmcge3JlY29yZF9pZH0gYXBwcm92ZWQuXG57cmVzdWx0fSIKCgpkZWYgaGVybWVzX3JlamVjdF9maW5kaW5nKHJlY29yZF9pZDogc3RyLCBub3Rlczogc3RyKSAtPiBzdHI6CiAgICBpZiBub3QgcmVjb3JkX2lkLnN0cmlwKCk6CiAgICAgICAgcmV0dXJuICLinYwgUmVjb3JkIElEIHJlcXVpcmVkIgogICAgcmVzdWx0ID0gaHVtYW5fcmVqZWN0KHJlY29yZF9pZC5zdHJpcCgpLCBub3Rlcy5zdHJpcCgpKQogICAgcmV0dXJuIGYi4p2MIEZpbmRpbmcge3JlY29yZF9pZH0gcmVqZWN0ZWQuXG57cmVzdWx0fSIKCgpkZWYgaGVybWVzX3N1Ym1pdF9oYWNrZXJvbmUocmVjb3JkX2lkOiBzdHIpIC0+IHN0cjoKICAgIGlmIG5vdCByZWNvcmRfaWQuc3RyaXAoKToKICAgICAgICByZXR1cm4gIuKdjCBSZWNvcmQgSUQgcmVxdWlyZWQiCiAgICByZXN1bHQgPSBzdWJtaXRfdG9faGFja2Vyb25lKHJlY29yZF9pZC5zdHJpcCgpKQogICAgaWYgcmVzdWx0LmdldCgic3VjY2VzcyIpOgogICAgICAgIHJldHVybiBmIuKchSBTdWJtaXR0ZWQgdG8gSGFja2VyT25lOiB7cmVzdWx0LmdldCgndXJsJyl9IgogICAgcmV0dXJuIGYi4p2MIFN1Ym1pc3Npb24gZmFpbGVkOiB7cmVzdWx0LmdldCgnZXJyb3InKX0iCgoKZGVmIGhlcm1lc19zdWJtaXRfZ2l0aHViKHJlY29yZF9pZDogc3RyLCBvd25lcl9yZXBvOiBzdHIpIC0+IHN0cjoKICAgIGlmIG5vdCByZWNvcmRfaWQuc3RyaXAoKSBvciBub3Qgb3duZXJfcmVwby5zdHJpcCgpOgogICAgICAgIHJldHVybiAi4p2MIFJlY29yZCBJRCBhbmQgb3duZXIvcmVwbyByZXF1aXJlZCIKICAgIHBhcnRzID0gb3duZXJfcmVwby5zdHJpcCgpLnNwbGl0KCIvIikKICAgIGlmIGxlbihwYXJ0cykgIT0gMjoKICAgICAgICByZXR1cm4gIuKdjCBGb3JtYXQgbXVzdCBiZSBvd25lci9yZXBvIgogICAgcmVzdWx0ID0gc3VibWl0X2dpdGh1Yl9hZHZpc29yeShyZWNvcmRfaWQuc3RyaXAoKSwgcGFydHNbMF0sIHBhcnRzWzFdKQogICAgaWYgcmVzdWx0LmdldCgic3VjY2VzcyIpOgogICAgICAgIHJldHVybiBmIuKchSBHaXRIdWIgQWR2aXNvcnkgY3JlYXRlZDoge3Jlc3VsdC5nZXQoJ3VybCcpfSIKICAgIHJldHVybiBmIuKdjCBTdWJtaXNzaW9uIGZhaWxlZDoge3Jlc3VsdC5nZXQoJ2Vycm9yJyl9IgoKCiMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiMgR1JBRElPIEVOVEVSUFJJU0UgREFTSEJPQVJECiMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAClRIRU1FID0gZ3IudGhlbWVzLkJhc2UoCiAgICBwcmltYXJ5X2h1ZT0idmlvbGV0Iiwgc2Vjb25kYXJ5X2h1ZT0ic2xhdGUiLCBuZXV0cmFsX2h1ZT0ic2xhdGUiLAogICAgZm9udD1bZ3IudGhlbWVzLkdvb2dsZUZvbnQoIkludGVyIiksICJ1aS1zYW5zLXNlcmlmIiwgInN5c3RlbS11aSJdLAopLnNldCgKICAgIGJvZHlfYmFja2dyb3VuZF9maWxsPSIjMGEwYTBmIiwKICAgIGJvZHlfdGV4dF9jb2xvcj0iI2UyZThmMCIsCiAgICBibG9ja19iYWNrZ3JvdW5kX2ZpbGw9IiMxMjEyMWMiLAogICAgYmxvY2tfYm9yZGVyX2NvbG9yPSIjMWUxZTJlIiwKICAgIGJsb2NrX2xhYmVsX3RleHRfY29sb3I9IiM2NDc0OGIiLAogICAgaW5wdXRfYmFja2dyb3VuZF9maWxsPSIjMGEwYTBmIiwKICAgIGJ1dHRvbl9wcmltYXJ5X2JhY2tncm91bmRfZmlsbD0iIzViMjFiNiIsCiAgICBidXR0b25fcHJpbWFyeV9iYWNrZ3JvdW5kX2ZpbGxfaG92ZXI9IiM2ZDI4ZDkiLAogICAgYnV0dG9uX3ByaW1hcnlfdGV4dF9jb2xvcj0iI2ZmZmZmZiIsCikKCndpdGggZ3IuQmxvY2tzKHRpdGxlPSJSaG9kYXdrIEFJIOKAlCBDb2RlIFJldmlldyBNb25zdGVyIikgYXMgZGVtbzoKCiAgICBnci5IVE1MKCIiIgogICAgPGRpdiBzdHlsZT0icGFkZGluZzoyMHB4IDAgNHB4IDA7IGJvcmRlci1ib3R0b206MXB4IHNvbGlkICMxZTFlMmU7IG1hcmdpbi1ib3R0b206MTZweDsiPgogICAgICA8ZGl2IHN0eWxlPSJkaXNwbGF5OmZsZXg7IGFsaWduLWl0ZW1zOmNlbnRlcjsgZ2FwOjE0cHg7Ij4KICAgICAgICA8c3BhbiBzdHlsZT0iZm9udC1zaXplOjIuMnJlbTsiPvCfpoU8L3NwYW4+CiAgICAgICAgPGRpdj4KICAgICAgICAgIDxoMSBzdHlsZT0ibWFyZ2luOjA7IGZvbnQtc2l6ZToxLjVyZW07IGZvbnQtd2VpZ2h0OjgwMDsgY29sb3I6I2YxZjVmOTsgbGV0dGVyLXNwYWNpbmc6LTAuMDNlbTsiPgogICAgICAgICAgICBSaG9kYXdrIEFJIDxzcGFuIHN0eWxlPSJjb2xvcjojN2MzYWVkOyBmb250LXNpemU6MC45cmVtOyBmb250LXdlaWdodDo2MDA7IG1hcmdpbi1sZWZ0OjhweDsiPnYzLjA8L3NwYW4+CiAgICAgICAgICA8L2gxPgogICAgICAgICAgPHAgc3R5bGU9Im1hcmdpbjoycHggMCAwOyBmb250LXNpemU6MC44cmVtOyBjb2xvcjojNDc1NTY5OyBsZXR0ZXItc3BhY2luZzowLjAyZW07Ij4KICAgICAgICAgICAgQVVUT05PTU9VUyBERVZTRUNPUFMgQ09OVFJPTCBQTEFORSAmbmJzcDvCtyZuYnNwOwogICAgICAgICAgICBDTE9TRUQgVkVSSUZJQ0FUSU9OIExPT1AgJm5ic3A7wrcmbmJzcDsKICAgICAgICAgICAgQURWRVJTQVJJQUwgTExNIFJFVklFVyAmbmJzcDvCtyZuYnNwOwogICAgICAgICAgICBEQVRBIEZMWVdIRUVMICZuYnNwO8K3Jm5ic3A7CiAgICAgICAgICAgIFNVUFBMWSBDSEFJTiBHQVRFCiAgICAgICAgICA8L3A+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICAiIiIpCgogICAgd2l0aCBnci5UYWJzKCk6CgogICAgICAgICMg4pSA4pSAIFRBQiAxOiBMSVZFIE9QRVJBVElPTlMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICAgICAgd2l0aCBnci5UYWIoIuKaoSBMaXZlIE9wZXJhdGlvbnMiKToKCiAgICAgICAgICAgICMg4pSA4pSAIFNUQVRVUyBCQVIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICAgICAgICAgIHdpdGggZ3IuUm93KCk6CiAgICAgICAgICAgICAgICBzdGF0X3N0YXR1cyA9IGdyLlRleHRib3gobGFiZWw9IlN5c3RlbSBTdGF0dXMiLCBpbnRlcmFjdGl2ZT1GYWxzZSwgc2NhbGU9MykKICAgICAgICAgICAgICAgIHN0YXRfdG90YWwgID0gZ3IuTnVtYmVyKGxhYmVsPSJUZXN0cyBTY2FubmVkIiwgIGludGVyYWN0aXZlPUZhbHNlKQogICAgICAgICAgICAgICAgc3RhdF9kb25lICAgPSBnci5OdW1iZXIobGFiZWw9IlZlcmlmaWVkIEdyZWVuIiwgaW50ZXJhY3RpdmU9RmFsc2UpCiAgICAgICAgICAgICAgICBzdGF0X3BycyAgICA9IGdyLk51bWJlcihsYWJlbD0iUFJzIEdlbmVyYXRlZCIsICBpbnRlcmFjdGl2ZT1GYWxzZSkKICAgICAgICAgICAgICAgIHN0YXRfZmFpbGVkID0gZ3IuTnVtYmVyKGxhYmVsPSJGYWlsZWQiLCAgICAgICAgIGludGVyYWN0aXZlPUZhbHNlKQogICAgICAgICAgICAgICAgc3RhdF9zYXN0ICAgPSBnci5OdW1iZXIobGFiZWw9IlNBU1QgQmxvY2tlZCIsICAgaW50ZXJhY3RpdmU9RmFsc2UpCgogICAgICAgICAgICAjIOKUgOKUgCBDSEFUIElOQk9YIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgICAgICAgICBnci5IVE1MKCIiIgogICAgICAgICAgICA8ZGl2IHN0eWxlPSJtYXJnaW46MjBweCAwIDhweCAwOyBwYWRkaW5nOjEycHggMTZweDsKICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZDojMGYwZjFhOyBib3JkZXI6MXB4IHNvbGlkICMyZDJkNDQ7CiAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6MTBweDsiPgogICAgICAgICAgICAgIDxzcGFuIHN0eWxlPSJmb250LXNpemU6MC44NXJlbTsgZm9udC13ZWlnaHQ6NzAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjojN2MzYWVkOyBsZXR0ZXItc3BhY2luZzowLjA2ZW07CiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQtdHJhbnNmb3JtOnVwcGVyY2FzZTsiPgogICAgICAgICAgICAgICAg8J+OryBBdWRpdCBJbmJveAogICAgICAgICAgICAgIDwvc3Bhbj4KICAgICAgICAgICAgICA8c3BhbiBzdHlsZT0iZm9udC1zaXplOjAuNzhyZW07IGNvbG9yOiM0NzU1Njk7IG1hcmdpbi1sZWZ0OjEwcHg7Ij4KICAgICAgICAgICAgICAgIEVudGVyIGEgR2l0SHViIHJlcG8gYmVsb3cgdG8gbGF1bmNoIGEgZnVsbCBhdXRvbm9tb3VzIGhlYWxpbmcgYXVkaXQKICAgICAgICAgICAgICA8L3NwYW4+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAiIiIpCgogICAgICAgICAgICBpbmJveF9jaGF0Ym90ID0gZ3IuQ2hhdGJvdCgKICAgICAgICAgICAgICAgIGxhYmVsPSIiLAogICAgICAgICAgICAgICAgaGVpZ2h0PTI0MCwKICAgICAgICAgICAgICAgIHNob3dfbGFiZWw9RmFsc2UsCiAgICAgICAgICAgICkKCiAgICAgICAgICAgIHdpdGggZ3IuUm93KCk6CiAgICAgICAgICAgICAgICByZXBvX3RleHRib3ggPSBnci5UZXh0Ym94KAogICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPSJvd25lci9yZXBvICAoZS5nLiBNb2dhc2FsYUhlbWFnaXJpL011bHRpLUFnZW50LUNvZGUtU3RhYmlsaXplcikiLAogICAgICAgICAgICAgICAgICAgIHNob3dfbGFiZWw9RmFsc2UsCiAgICAgICAgICAgICAgICAgICAgc2NhbGU9NSwKICAgICAgICAgICAgICAgICAgICBsaW5lcz0xLAogICAgICAgICAgICAgICAgICAgIG1heF9saW5lcz0xLAogICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcj1GYWxzZSwKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHJ1bl9idG4gPSBnci5CdXR0b24oIvCfmoAgUnVuIEF1ZGl0IiwgdmFyaWFudD0icHJpbWFyeSIsIHNjYWxlPTEsIG1pbl93aWR0aD0xMjApCgogICAgICAgICAgICBydW5fYnRuLmNsaWNrKAogICAgICAgICAgICAgICAgc3VibWl0X3JlcG9fYXVkaXQsCiAgICAgICAgICAgICAgICBpbnB1dHM9W3JlcG9fdGV4dGJveCwgaW5ib3hfY2hhdGJvdF0sCiAgICAgICAgICAgICAgICBvdXRwdXRzPVtpbmJveF9jaGF0Ym90LCByZXBvX3RleHRib3hdLAogICAgICAgICAgICApCiAgICAgICAgICAgIHJlcG9fdGV4dGJveC5zdWJtaXQoCiAgICAgICAgICAgICAgICBzdWJtaXRfcmVwb19hdWRpdCwKICAgICAgICAgICAgICAgIGlucHV0cz1bcmVwb190ZXh0Ym94LCBpbmJveF9jaGF0Ym90XSwKICAgICAgICAgICAgICAgIG91dHB1dHM9W2luYm94X2NoYXRib3QsIHJlcG9fdGV4dGJveF0sCiAgICAgICAgICAgICkKCiAgICAgICAgICAgIGdyLkhUTUwoIjxkaXYgc3R5bGU9J2hlaWdodDo0cHg7Jz48L2Rpdj4iKQoKICAgICAgICAgICAgIyDilIDilIAgQ09OVFJPTFMgUk9XIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgICAgICAgICB3aXRoIGdyLlJvdygpOgogICAgICAgICAgICAgICAgYnRuX2F1ZGl0ICAgICA9IGdyLkJ1dHRvbigi8J+agCBUcmlnZ2VyIEF1ZGl0IChlbnYgR0lUSFVCX1JFUE8pIiwgdmFyaWFudD0ic2Vjb25kYXJ5Iiwgc2NhbGU9MykKICAgICAgICAgICAgICAgIGJ0bl90ZXJtaW5hdGUgPSBnci5CdXR0b24oIuKblCBUZXJtaW5hdGUgQXVkaXQiLCB2YXJpYW50PSJzdG9wIiwgc2NhbGU9MikKICAgICAgICAgICAgICAgIGJ0bl9yZXNldCAgICAgPSBnci5CdXR0b24oIvCfl5EgUmVzZXQgUXVldWUiLCB2YXJpYW50PSJzZWNvbmRhcnkiLCBzY2FsZT0xKQoKICAgICAgICAgICAgdHJpZ2dlcl9vdXQgPSBnci5UZXh0Ym94KGxhYmVsPSIiLCBpbnRlcmFjdGl2ZT1GYWxzZSwgc2hvd19sYWJlbD1GYWxzZSkKICAgICAgICAgICAgYnRuX2F1ZGl0LmNsaWNrKHRyaWdnZXJfYXVkaXRfZm4sICBvdXRwdXRzPXRyaWdnZXJfb3V0KQogICAgICAgICAgICBidG5fdGVybWluYXRlLmNsaWNrKHRlcm1pbmF0ZV9hdWRpdCwgb3V0cHV0cz10cmlnZ2VyX291dCkKICAgICAgICAgICAgYnRuX3Jlc2V0LmNsaWNrKHJlc2V0X3F1ZXVlLCAgICAgICAgb3V0cHV0cz10cmlnZ2VyX291dCkKCiAgICAgICAgICAgICMg4pSA4pSAIExJVkUgTE9HIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgICAgICAgICBsaXZlX2xvZ3MgPSBnci5UZXh0QXJlYShsYWJlbD0iTGl2ZSBBZ2VudCBFeGVjdXRpb24gTG9nIiwgbGluZXM9MjYsIGludGVyYWN0aXZlPUZhbHNlKQoKICAgICAgICAjIOKUgOKUgCBUQUIgMjogSk9CIFFVRVVFIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgICAgIHdpdGggZ3IuVGFiKCLwn5OLIEpvYiBRdWV1ZSIpOgogICAgICAgICAgICBnci5NYXJrZG93bigiIyMjIE5hbWVzcGFjZWQgam9iIHN0b3JlIOKAlCBwZXIgKHRlbmFudCwgcmVwbywgdGVzdCkiKQogICAgICAgICAgICBqb2JfdGFibGUgPSBnci5EYXRhZnJhbWUoCiAgICAgICAgICAgICAgICBoZWFkZXJzPVsiVGVzdCBQYXRoIiwgIlN0YXR1cyIsICJQUiBVUkwiLCAiTW9kZWwiLCAiVXBkYXRlZCBBdCJdLAogICAgICAgICAgICAgICAgZGF0YXR5cGU9WyJzdHIiLCAic3RyIiwgInN0ciIsICJzdHIiLCAic3RyIl0sIGludGVyYWN0aXZlPUZhbHNlLCB3cmFwPVRydWUsCiAgICAgICAgICAgICkKICAgICAgICAgICAgZ3IuQnV0dG9uKCLwn5SEIFJlZnJlc2giLCB2YXJpYW50PSJzZWNvbmRhcnkiKS5jbGljayhnZXRfam9iX3RhYmxlLCBvdXRwdXRzPWpvYl90YWJsZSkKCiAgICAgICAgIyDilIDilIAgVEFCIDM6IEFVRElUIFRSQUlMIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgICAgIHdpdGggZ3IuVGFiKCLwn5SSIEF1ZGl0IFRyYWlsIik6CiAgICAgICAgICAgIGdyLk1hcmtkb3duKAogICAgICAgICAgICAgICAgIiMjIyBTSEEtMjU2IGNoYWluZWQgYXVkaXQgbG9nIOKAlCBldmVyeSBBSSBhY3Rpb24gaXMgY3J5cHRvZ3JhcGhpY2FsbHkgbGlua2VkXG4iCiAgICAgICAgICAgICAgICAiQ292ZXJzOiBkaXNwYXRjaCDihpIgU0FTVCBzY2FuIOKGkiBzdXBwbHkgY2hhaW4g4oaSIGFkdmVyc2FyaWFsIHJldmlldyDihpIgUFIgc3VibWlzc2lvbiIKICAgICAgICAgICAgKQogICAgICAgICAgICBjaGFpbl9zdGF0dXMgPSBnci5UZXh0Ym94KGxhYmVsPSJDaGFpbiBJbnRlZ3JpdHkgU3RhdHVzIiwgaW50ZXJhY3RpdmU9RmFsc2UpCiAgICAgICAgICAgIGF1ZGl0X2xvZyA9IGdyLlRleHRBcmVhKGxhYmVsPSJFdmVudHMgKGxhdGVzdCBmaXJzdCkiLCBsaW5lcz0yMCwgaW50ZXJhY3RpdmU9RmFsc2UpCiAgICAgICAgICAgIGdyLkJ1dHRvbigi8J+UjSBWZXJpZnkgQ2hhaW4iLCB2YXJpYW50PSJzZWNvbmRhcnkiKS5jbGljaygKICAgICAgICAgICAgICAgIGZuPWxhbWJkYTogKGdldF9jaGFpbl9pbnRlZ3JpdHlfZGlzcGxheSgpLCBnZXRfYXVkaXRfZGlzcGxheSgpKSwKICAgICAgICAgICAgICAgIG91dHB1dHM9W2NoYWluX3N0YXR1cywgYXVkaXRfbG9nXQogICAgICAgICAgICApCgogICAgICAgICMg4pSA4pSAIFRBQiA0OiBEQVRBIEZMWVdIRUVMIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgICAgIHdpdGggZ3IuVGFiKCLwn6egIERhdGEgRmx5d2hlZWwiKToKICAgICAgICAgICAgZ3IuTWFya2Rvd24oCiAgICAgICAgICAgICAgICAiIyMjIFByb3ByaWV0YXJ5IHRyYWluaW5nIGRhdGEgcGlwZWxpbmVcbiIKICAgICAgICAgICAgICAgICJFdmVyeSBgKGZhaWx1cmUsIGZpeCwgYWR2ZXJzYXJpYWxfdmVyZGljdCwgdGVzdF9yZXN1bHQpYCB0dXBsZSBpcyBzdG9yZWQuICIKICAgICAgICAgICAgICAgICJFeHBvcnQgYXMgSHVnZ2luZ0ZhY2UtY29tcGF0aWJsZSBKU09OTCBmb3IgbW9kZWwgZmluZS10dW5pbmcuIgogICAgICAgICAgICApCiAgICAgICAgICAgIHN0YXRzX2Rpc3BsYXkgICA9IGdyLlRleHRBcmVhKGxhYmVsPSJGbHl3aGVlbCBTdGF0aXN0aWNzIiwgICAgICAgIGxpbmVzPTEyLCBpbnRlcmFjdGl2ZT1GYWxzZSkKICAgICAgICAgICAgdHJhaW5pbmdfZXhwb3J0ID0gZ3IuVGV4dEFyZWEobGFiZWw9IlRyYWluaW5nIERhdGEgRXhwb3J0IChKU09OTCkiLCBsaW5lcz0xNCwgaW50ZXJhY3RpdmU9RmFsc2UpCiAgICAgICAgICAgIHdpdGggZ3IuUm93KCk6CiAgICAgICAgICAgICAgICBnci5CdXR0b24oIvCfk4ogUmVmcmVzaCBTdGF0cyIsICB2YXJpYW50PSJzZWNvbmRhcnkiKS5jbGljayhnZXRfdHJhaW5pbmdfc3RhdHNfZGlzcGxheSwgb3V0cHV0cz1zdGF0c19kaXNwbGF5KQogICAgICAgICAgICAgICAgZ3IuQnV0dG9uKCLirIcgRXhwb3J0IEpTT05MIiwgICAgdmFyaWFudD0ic2Vjb25kYXJ5IikuY2xpY2soZ2V0X3RyYWluaW5nX2V4cG9ydCwgICAgICAgIG91dHB1dHM9dHJhaW5pbmdfZXhwb3J0KQoKICAgICAgICAjIOKUgOKUgCBUQUIgNTogV0VCSE9PS1Mg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICAgICAgd2l0aCBnci5UYWIoIvCflJcgV2ViaG9va3MiKToKICAgICAgICAgICAgZ3IuTWFya2Rvd24oZiIiIgojIyMgRXZlbnQtRHJpdmVuIFRyaWdnZXIgU2VydmVyIChQb3J0IDc4NjEpCgpgYGAKUE9TVCAvd2ViaG9vay9naXRodWIgICAg4oCUIEdpdEh1YiBwdXNoL2NoZWNrX3J1biBldmVudHMgKEhNQUMtU0hBMjU2IHZhbGlkYXRlZCkKUE9TVCAvd2ViaG9vay9jaSAgICAgICAg4oCUIEdlbmVyaWMgQ0kgZmFpbHVyZToge3sicmVwbyI6ICJvd25lci9yZXBvIiwgInRlc3RfcGF0aCI6ICJ0ZXN0cy8uLi4ifX0KUE9TVCAvd2ViaG9vay90cmlnZ2VyICAg4oCUIE1hbnVhbCB0cmlnZ2VyCkdFVCAgL3dlYmhvb2svaGVhbHRoICAgIOKAlCBMaXZlbmVzcyBwcm9iZQpHRVQgIC93ZWJob29rL3F1ZXVlICAgICDigJQgQ3VycmVudCBqb2Igc3RhdHVzIChKU09OKQpgYGAKICAgICAgICAgICAgIiIiKQogICAgICAgICAgICB3ZWJob29rX2xvZyA9IGdyLlRleHRBcmVhKGxhYmVsPSJXZWJob29rIEV2ZW50IExvZyIsIGxpbmVzPTE1LCBpbnRlcmFjdGl2ZT1GYWxzZSkKICAgICAgICAgICAgZ3IuQnV0dG9uKCLwn5SEIFJlZnJlc2giLCB2YXJpYW50PSJzZWNvbmRhcnkiKS5jbGljayhnZXRfd2ViaG9va19sb2dfZGlzcGxheSwgb3V0cHV0cz13ZWJob29rX2xvZykKCiAgICAgICAgIyDilIDilIAgVEFCIDY6IFJFRCBURUFNIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgICAgIHdpdGggZ3IuVGFiKCLimpTvuI8gUmVkIFRlYW0iKToKICAgICAgICAgICAgZ3IuTWFya2Rvd24oCiAgICAgICAgICAgICAgICAiIyMjIEF1dG9ub21vdXMgUmVkIFRlYW0gQ0VHSVNcbiIKICAgICAgICAgICAgICAgICJXaGVuIGFsbCB0ZXN0cyBhcmUgZ3JlZW4sIFJob2Rhd2sgYXR0YWNrcyB0aGUgcmVwbyB3aXRoIGdlbmVyYXRlZCBwcm9wZXJ0eS1iYXNlZCB0ZXN0cyAiCiAgICAgICAgICAgICAgICAiYW5kIGhhbmRzIHJlcHJvZHVjaWJsZSB6ZXJvLWRheXMgYmFjayB0byBCbHVlIFRlYW0gZm9yIHBhdGNoaW5nLiIKICAgICAgICAgICAgKQogICAgICAgICAgICByZWRfdGVhbV9ib3ggPSBnci5UZXh0QXJlYShsYWJlbD0iUmVkIFRlYW0gU3RhdHMgJiBMb2dzIiwgbGluZXM9MjIsIGludGVyYWN0aXZlPUZhbHNlKQogICAgICAgICAgICBnci5CdXR0b24oIvCflIQgUmVmcmVzaCBSZWQgVGVhbSBTdGF0cyIsIHZhcmlhbnQ9InNlY29uZGFyeSIpLmNsaWNrKGdldF9yZWRfdGVhbV9kaXNwbGF5LCBvdXRwdXRzPXJlZF90ZWFtX2JveCkKCiAgICAgICAgIyDilIDilIAgVEFCIDc6IFNXRS1CRU5DSCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgICAgICB3aXRoIGdyLlRhYigi8J+nqiBTV0UtYmVuY2giKToKICAgICAgICAgICAgZ3IuTWFya2Rvd24oIiMjIyBTV0UtYmVuY2ggVmVyaWZpZWQgRXZhbHVhdGlvbiIpCiAgICAgICAgICAgIHdpdGggZ3IuUm93KCk6CiAgICAgICAgICAgICAgICBzd2ViZW5jaF9jb3VudCAgID0gZ3IuTnVtYmVyKGxhYmVsPSJNYXggaW5zdGFuY2VzIiwgdmFsdWU9MjUsIHByZWNpc2lvbj0wKQogICAgICAgICAgICAgICAgc3dlYmVuY2hfc3RhcnQgICA9IGdyLkJ1dHRvbigiU3RhcnQgRXZhbHVhdGlvbiIsICB2YXJpYW50PSJwcmltYXJ5IikKICAgICAgICAgICAgICAgIHN3ZWJlbmNoX3JlZnJlc2ggPSBnci5CdXR0b24oIlJlZnJlc2ggUmVwb3J0IiwgICAgIHZhcmlhbnQ9InNlY29uZGFyeSIpCiAgICAgICAgICAgIHN3ZWJlbmNoX3N0YXR1cyA9IGdyLlRleHRib3gobGFiZWw9IlN0YXR1cyIsIGludGVyYWN0aXZlPUZhbHNlKQogICAgICAgICAgICBzd2ViZW5jaF9yZXBvcnQgPSBnci5UZXh0QXJlYShsYWJlbD0iU1dFLWJlbmNoIFJlcG9ydCIsIGxpbmVzPTI0LCBpbnRlcmFjdGl2ZT1GYWxzZSkKICAgICAgICAgICAgc3dlYmVuY2hfc3RhcnQuY2xpY2sodHJpZ2dlcl9zd2ViZW5jaF9ldmFsLCBpbnB1dHM9c3dlYmVuY2hfY291bnQsIG91dHB1dHM9c3dlYmVuY2hfc3RhdHVzKQogICAgICAgICAgICBzd2ViZW5jaF9yZWZyZXNoLmNsaWNrKGdldF9zd2ViZW5jaF9kaXNwbGF5LCBvdXRwdXRzPXN3ZWJlbmNoX3JlcG9ydCkKCiAgICAgICAgIyDilIDilIAgVEFCIDg6IEhBUlZFU1RFUiAoQW50YWdvbmlzdCBNb2RlKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgICAgICB3aXRoIGdyLlRhYigi8J+MkCBIYXJ2ZXN0ZXIiKToKICAgICAgICAgICAgZ3IuTWFya2Rvd24oCiAgICAgICAgICAgICAgICAiIyMjIEF1dG9ub21vdXMgUmVwb3NpdG9yeSBIYXJ2ZXN0ZXJcbiIKICAgICAgICAgICAgICAgICJTY2FucyBwdWJsaWMgR2l0SHViIGZvciByZXBvcyB3aXRoIGZhaWxpbmcgQ0kgYW5kIHF1ZXVlcyB0aGVtIGZvciBhdXRvbm9tb3VzIGhlYWxpbmcuXG5cbiIKICAgICAgICAgICAgICAgICIqKkVuYWJsZToqKiBzZXQgYFJIT0RBV0tfSEFSVkVTVEVSX0VOQUJMRUQ9dHJ1ZWAgaW4gU3BhY2UgU2VjcmV0cy5cbiIKICAgICAgICAgICAgICAgICIqKlBvbGwgaW50ZXJ2YWw6KiogYFJIT0RBV0tfSEFSVkVTVEVSX1BPTExfU0VDT05EU2AgKGRlZmF1bHQgMjE2MDAgPSA2aClcbiIKICAgICAgICAgICAgICAgICIqKkZvcmsgbW9kZToqKiBzZXQgYFJIT0RBV0tfRk9SS19NT0RFPXRydWVgIHRvIGZpeCByZXBvcyB3aXRob3V0IHB1c2ggYWNjZXNzLiIKICAgICAgICAgICAgKQogICAgICAgICAgICBoYXJ2ZXN0ZXJfYm94ID0gZ3IuVGV4dEFyZWEobGFiZWw9IkhhcnZlc3QgRmVlZCIsIGxpbmVzPTIwLCBpbnRlcmFjdGl2ZT1GYWxzZSkKICAgICAgICAgICAgZ3IuQnV0dG9uKCLwn5SEIFJlZnJlc2ggRmVlZCIsIHZhcmlhbnQ9InNlY29uZGFyeSIpLmNsaWNrKAogICAgICAgICAgICAgICAgZm49bGFtYmRhOiBfX2ltcG9ydF9fKCJyZXBvX2hhcnZlc3RlciIpLmdldF9mZWVkX3N1bW1hcnkoKSwKICAgICAgICAgICAgICAgIG91dHB1dHM9aGFydmVzdGVyX2JveCwKICAgICAgICAgICAgKQoKICAgICAgICAjIOKUgOKUgCBUQUIgOTogTE9SQSBTQ0hFRFVMRVIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICAgICAgd2l0aCBnci5UYWIoIvCfp6wgTG9SQSBTY2hlZHVsZXIiKToKICAgICAgICAgICAgZ3IuTWFya2Rvd24oCiAgICAgICAgICAgICAgICAiIyMjIExvUkEgRmluZS1UdW5lIFNjaGVkdWxlclxuIgogICAgICAgICAgICAgICAgIkV4cG9ydHMgYWNjdW11bGF0ZWQgKGZhaWx1cmUg4oaSIGZpeCkgcGFpcnMgaW4gaW5zdHJ1Y3Rpb24tdHVuaW5nIEpTT05MIGZvcm1hdCAiCiAgICAgICAgICAgICAgICAid2hlbiB0aGUgZGF0YSB0aHJlc2hvbGQgaXMgcmVhY2hlZC5cblxuIgogICAgICAgICAgICAgICAgIioqRW5hYmxlOioqIHNldCBgUkhPREFXS19MT1JBX0VOQUJMRUQ9dHJ1ZWBcbiIKICAgICAgICAgICAgICAgICIqKk1pbiBzYW1wbGVzOioqIGBSSE9EQVdLX0xPUkFfTUlOX1NBTVBMRVNgIChkZWZhdWx0IDUwKVxuIgogICAgICAgICAgICAgICAgIioqTWF4IGFnZToqKiBgUkhPREFXS19MT1JBX01BWF9BR0VfSE9VUlNgIChkZWZhdWx0IDE2OGggPSAxIHdlZWspXG4iCiAgICAgICAgICAgICAgICAiKipPdXRwdXQ6KiogYC9kYXRhL2xvcmFfZXhwb3J0cy9sb3JhX3RyYWluaW5nX2RhdGFfKi5qc29ubGAiCiAgICAgICAgICAgICkKICAgICAgICAgICAgbG9yYV9zdGF0dXNfYm94ID0gZ3IuVGV4dEFyZWEobGFiZWw9IlNjaGVkdWxlciBTdGF0dXMiLCBsaW5lcz0xMCwgaW50ZXJhY3RpdmU9RmFsc2UpCiAgICAgICAgICAgIGxvcmFfZXhwb3J0X2J0biA9IGdyLkJ1dHRvbigi4qyHIEZvcmNlIEV4cG9ydCBOb3ciLCB2YXJpYW50PSJzZWNvbmRhcnkiKQogICAgICAgICAgICBsb3JhX3Jlc3VsdF9ib3ggPSBnci5UZXh0QXJlYShsYWJlbD0iRXhwb3J0IFJlc3VsdCIsIGxpbmVzPTUsIGludGVyYWN0aXZlPUZhbHNlKQoKICAgICAgICAgICAgZGVmIF9mb3JjZV9sb3JhX2V4cG9ydCgpOgogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIGZyb20gbG9yYV9zY2hlZHVsZXIgaW1wb3J0IHJ1bl90cmFpbmluZ19leHBvcnQKICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBydW5fdHJhaW5pbmdfZXhwb3J0KCkKICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RyKHJlc3VsdCkKICAgICAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZiJFeHBvcnQgZXJyb3I6IHtlfSIKCiAgICAgICAgICAgIGdyLkJ1dHRvbigi8J+UhCBSZWZyZXNoIFN0YXR1cyIsIHZhcmlhbnQ9InNlY29uZGFyeSIpLmNsaWNrKAogICAgICAgICAgICAgICAgZ2V0X3NjaGVkdWxlcl9zdGF0dXMsIG91dHB1dHM9bG9yYV9zdGF0dXNfYm94CiAgICAgICAgICAgICkKICAgICAgICAgICAgbG9yYV9leHBvcnRfYnRuLmNsaWNrKF9mb3JjZV9sb3JhX2V4cG9ydCwgb3V0cHV0cz1sb3JhX3Jlc3VsdF9ib3gpCgogICAgICAgICMg4pSA4pSAIFRBQiAxMDogQVJDSElURUNUVVJFIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgICAgIHdpdGggZ3IuVGFiKCLihLnvuI8gQXJjaGl0ZWN0dXJlIik6CiAgICAgICAgICAgIGNvbXBsaWFuY2Vfb3V0ID0gZ3IuVGV4dGJveChsYWJlbD0iQ29tcGxpYW5jZSBFeHBvcnQiLCBpbnRlcmFjdGl2ZT1GYWxzZSkKICAgICAgICAgICAgZ3IuQnV0dG9uKCJFeHBvcnQgU09DIDIgRXZpZGVuY2UgU3VtbWFyeSIsIHZhcmlhbnQ9InNlY29uZGFyeSIpLmNsaWNrKAogICAgICAgICAgICAgICAgZXhwb3J0X2NvbXBsaWFuY2VfZGlzcGxheSwgb3V0cHV0cz1jb21wbGlhbmNlX291dAogICAgICAgICAgICApCiAgICAgICAgICAgIGdyLk1hcmtkb3duKGYiIiIKIyMjIFJob2Rhd2sgQUkgdjQuMCDigJQgQ2FwYWJpbGl0eSBTdGFjawoKKipUZW5hbnQ6KiogYHtURU5BTlRfSUR9YCB8ICoqTW9kZWw6KiogYHtNT0RFTH1gCj4gVGFyZ2V0IHJlcG8gaXMgc3VwcGxpZWQgYXQgcnVudGltZSB2aWEgdGhlICoqQXVkaXQgSW5ib3gqKiBjaGF0IGlucHV0IChubyByZXN0YXJ0IHJlcXVpcmVkKS4KCi0tLQoKfCBMYXllciB8IFRlY2hub2xvZ3kgfCBXaGF0IGl0IGRvZXMgfAp8LS0tfC0tLXwtLS18CnwgQUkgQWdlbnQgfCBBaWRlciArIE9wZW5Sb3V0ZXIvUXdlbiB8IEF1dG9ub21vdXMgcGF0Y2ggZ2VuZXJhdGlvbiB8CnwgTUNQIFRvb2xzIHwgZmV0Y2gtZG9jcywgZ2l0aHViLW1hbmFnZXIgfCBEb2N1bWVudGF0aW9uICsgUFIgY3JlYXRpb24gfAp8ICoqVmVyaWZpY2F0aW9uIExvb3AqKiB8IEFueS1sYW5ndWFnZSB0ZXN0IHJlLXJ1biBwZXIgYXR0ZW1wdCB8ICoqQ2xvc2VzIHRoZSBsb29wIOKAlCB0ZXN0cyB0aGUgZml4IGJlZm9yZSBQUioqIHwKfCAqKkFkdmVyc2FyaWFsIFJldmlldyoqIHwgMy1tb2RlbCBjb25jdXJyZW50IGNvbnNlbnN1cyAoUXdlbuKIpUdlbW1h4oilTWlzdHJhbCkgfCAqKk1ham9yaXR5IHZvdGUsIDIvMyB0aHJlc2hvbGQqKiB8CnwgKipGb3JtYWwgVmVyaWZpY2F0aW9uKiogfCBaMyBTTVQgc29sdmVyIChib3VuZHMgKyBkaXYtYnktemVybykgfCAqKk1hdGgtdmVyaWZpZWQgaW50ZWdlciBzYWZldHkqKiB8CnwgKipDb252aWN0aW9uIEVuZ2luZSoqIHwgTXVsdGktY3JpdGVyaWEgdHJ1c3QgZ2F0ZSB8ICoqQXV0by1tZXJnZXMgUFJzIG1lZXRpbmcgYWxsIHNhZmV0eSBjcml0ZXJpYSoqIHwKfCAqKk1lbW9yeSBFbmdpbmUqKiB8IFNRTGl0ZSArIG9wdGlvbmFsIFFkcmFudC9Db2RlQkVSVCB8ICoqQ3Jvc3MtcmVwbyBzZW1hbnRpYyByZXRyaWV2YWwgb2Ygc2ltaWxhciBmaXhlcyoqIHwKfCAqKlN1cHBseSBDaGFpbiBHYXRlKiogfCBwaXAtYXVkaXQgKyB0eXBvc3F1YXR0aW5nICsgUHlQSSBtZXRhZGF0YSB8ICoqQ2F0Y2hlcyBtYWxpY2lvdXMgZGVwZW5kZW5jaWVzIGluIEFJIGRpZmZzKiogfAp8ICoqTG9SQSBTY2hlZHVsZXIqKiB8IFNGVCBKU09OTCBleHBvcnRlciB8ICoqRXhwb3J0cyBwcm9wcmlldGFyeSB0cmFpbmluZyBkYXRhIG9uIHNjaGVkdWxlKiogfAp8ICoqUmVwbyBIYXJ2ZXN0ZXIqKiB8IEdpdEh1YiBzZWFyY2ggKyBmYWlsaW5nIENJIGRldGVjdG9yIHwgKipBdXRvbm9tb3VzIHRhcmdldCBzZWxlY3Rpb24gKGFudGFnb25pc3QgbW9kZSkqKiB8CnwgKipGb3JrLWFuZC1QUiBNb2RlKiogfCBDcm9zcy1yZXBvIFBSIGNyZWF0aW9uIHZpYSBmb3JrIHwgKipGaXggYW55IHB1YmxpYyByZXBvIHdpdGhvdXQgcHVzaCBhY2Nlc3MqKiB8CnwgKipQcm9jZXNzIElzb2xhdGlvbioqIHwgbXVsdGlwcm9jZXNzaW5nLlByb2Nlc3MgcGVyIGpvYiB8ICoqQ3Jhc2gtc2FmZSBwZXItdGVzdCBzdWJwcm9jZXNzIGlzb2xhdGlvbioqIHwKfCBTQVNUIEdhdGUgfCBiYW5kaXQgKyBzZW1ncmVwICsgc2VjcmV0L2luamVjdGlvbiBwYXR0ZXJucyB8IFByZS1QUiBzZWN1cml0eSBzY2FubmluZyB8CnwgQXVkaXQgVHJhaWwgfCBTSEEtMjU2IEpTT05MIGNoYWluIHwgU09DIDIgLyBJU08gMjcwMDEgZXZpZGVuY2UgfAp8IFRyYWluaW5nIFN0b3JlIHwgU1FMaXRlIChmYWlsdXJl4oaSZml44oaSb3V0Y29tZSkgfCBGaW5lLXR1bmluZyBkYXRhc2V0IGFjY3VtdWxhdGlvbiB8CnwgV2ViaG9vayBTZXJ2ZXIgfCBIVFRQIG9uIDo3ODYxICsgSE1BQyArIHJhdGUgbGltaXQgfCBFdmVudC1kcml2ZW4gR2l0SHViL0NJIHRyaWdnZXJzIHwKfCBXb3JrZXIgUG9vbCB8IFRocmVhZFBvb2xFeGVjdXRvciB8IFBhcmFsbGVsIGF1ZGl0IGV4ZWN1dGlvbiB8CnwgTGFuZ3VhZ2UgU3VwcG9ydCB8IFB5dGhvbiAvIEpTIC8gVFMgLyBKYXZhIC8gR28gLyBSdXN0IC8gUnVieSB8IEFueS1sYW5ndWFnZSB0ZXN0IGhlYWxpbmcgfAp8IFNXRS1iZW5jaCBIYXJuZXNzIHwgU1dFLWJlbmNoIFZlcmlmaWVkIHwgcGFzc0AxIGJlbmNobWFya2luZyByZXBvcnRzIHwKfCBOb3RpZmljYXRpb25zIHwgVGVsZWdyYW0gKyBTbGFjayB8IE11bHRpLWNoYW5uZWwgYWxlcnRpbmcgfAp8IFZpcnR1YWxlbnYgfCB1diB8IEJsYXppbmctZmFzdCBpc29sYXRlZCBQeXRob24gZW52IHwKCi0tLQoKIyMjIE5ldyBpbiB2NC4wCgoqKlBlYWsgZW5oYW5jZW1lbnRzOioqCi0gQ29uY3VycmVudCAzLW1vZGVsIGFkdmVyc2FyaWFsIGNvbnNlbnN1cyAoUXdlbuKIpUdlbW1h4oilTWlzdHJhbCwgMi8zIG1ham9yaXR5IHRocmVzaG9sZCkKLSBaMyBTTVQgc29sdmVyIGZvciBib3VuZGVkIGZvcm1hbCB2ZXJpZmljYXRpb24gb2YgaW50ZWdlciBhcml0aG1ldGljIGFuZCBib3VuZHMgaW4gZGlmZnMKLSBRZHJhbnQgKyBDb2RlQkVSVCBlbWJlZGRpbmcgYmFja2VuZCAoc2V0IGBSSE9EQVdLX0VNQkVERElOR19CQUNLRU5EPXFkcmFudGApCi0gQ29udmljdGlvbiBlbmdpbmUg4oCUIGF1dG9ub21vdXMgbWVyZ2Ugd2hlbiBhbGwgdHJ1c3QgY3JpdGVyaWEgYXJlIHNpbXVsdGFuZW91c2x5IHNhdGlzZmllZAotIExvUkEgZmluZS10dW5lIHNjaGVkdWxlciDigJQgYXV0b21hdGljIHRyYWluaW5nIGRhdGEgZXhwb3J0IHdoZW4gdGhyZXNob2xkIHJlYWNoZWQKLSBQcm9jZXNzIGlzb2xhdGlvbiBwZXIgdGVzdCBqb2IgKGBSSE9EQVdLX1BST0NFU1NfSVNPTEFURT10cnVlYCkKCioqQW50YWdvbmlzdCBhZGRpdGlvbnM6KioKLSBSZXBvc2l0b3J5IGhhcnZlc3RlciDigJQgc2NhbnMgR2l0SHViIGZvciBmYWlsaW5nIENJLCBxdWV1ZXMgdGFyZ2V0cyBhdXRvbm9tb3VzbHkKLSBGb3JrLWFuZC1QUiBtb2RlIOKAlCBmaXggYW55IHB1YmxpYyByZXBvLCBubyBwdXNoIGFjY2VzcyByZXF1aXJlZCAoYFJIT0RBV0tfRk9SS19NT0RFPXRydWVgKQotIDI0LzcgY29udGludW91cyBsb29wIHZpYSBoYXJ2ZXN0ZXIgZGlzcGF0Y2gg4oaSIGF1ZGl0IOKGkiBoZWFsIOKGkiBQUiBjeWNsZQotIFB1YmxpYyBsZWFkZXJib2FyZCAoYHB1YmxpY19sZWFkZXJib2FyZC5weWApIOKAlCByZWFsIG51bWJlcnMsIHJlYWwgUFJzLCBubyBmYWtlIG1ldHJpY3MKICAgICAgICAgICAgIiIiKQoKICAgICAgICAjIOKUgOKUgCBUQUIgMTE6IEVUSElDQUwgU0VDVVJJVFkgUkVTRUFSQ0gg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICAgICAgd2l0aCBnci5UYWIoIvCflKwgU2VjdXJpdHkgUmVzZWFyY2giKToKICAgICAgICAgICAgZ3IuTWFya2Rvd24oIiIiCiMjIyBFdGhpY2FsIFNlY3VyaXR5IFJlc2VhcmNoIFBpcGVsaW5lCgpTdGF0aWMgYW5hbHlzaXMg4oaSIEh1bWFuIHJldmlldyDihpIgUmVzcG9uc2libGUgZGlzY2xvc3VyZQoKKipFdmVyeSBzdGFnZSByZXF1aXJlcyBleHBsaWNpdCBvcGVyYXRvciBhcHByb3ZhbC4gTm90aGluZyBpcyBkaXNjbG9zZWQgYXV0b21hdGljYWxseS4qKiAgCkFsbCBQb0MgdGVzdGluZyBpcyBsb2NhbCBhbmQgc2FuZGJveGVkLiBObyBsaXZlIHN5c3RlbXMgYXJlIGF0dGFja2VkLgogICAgICAgICAgICAiIiIpCgogICAgICAgICAgICB3aXRoIGdyLlRhYnMoKToKCiAgICAgICAgICAgICAgICAjIFN0ZXAgMSDigJQgU2VtYW50aWMgQW5hbHlzaXMKICAgICAgICAgICAgICAgIHdpdGggZ3IuVGFiKCIxLiBTZW1hbnRpYyBBbmFseXNpcyIpOgogICAgICAgICAgICAgICAgICAgIGdyLk1hcmtkb3duKAogICAgICAgICAgICAgICAgICAgICAgICAiKipTdGF0aWMgYW5hbHlzaXMgb25seSDigJQgbm8gY29kZSBleGVjdXRlZC4qKiAiCiAgICAgICAgICAgICAgICAgICAgICAgICJIZXJtZXMgbWFwcyB0aGUgcmVwbydzIHRydXN0IHN0YXRlIG1hY2hpbmUgYW5kIGlkZW50aWZpZXMgYXNzdW1wdGlvbiBnYXBzLiIKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgc3JfcmVwbyA9IGdyLlRleHRib3goCiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsPSJPcGVuLXNvdXJjZSByZXBvc2l0b3J5IChvd25lci9yZXBvKSIsCiAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPSJlLmcuIHBzZi9yZXF1ZXN0cyAgb3IgIHBhbGxldHMvZmxhc2siLAogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICBzcl9hbmFseXplX2J0biA9IGdyLkJ1dHRvbigi8J+UjSBSdW4gU2VtYW50aWMgQW5hbHlzaXMiLCB2YXJpYW50PSJwcmltYXJ5IikKICAgICAgICAgICAgICAgICAgICBzcl9zdW1tYXJ5ID0gZ3IuVGV4dGJveChsYWJlbD0iU3VtbWFyeSIsIGludGVyYWN0aXZlPUZhbHNlLCBsaW5lcz02KQogICAgICAgICAgICAgICAgICAgIHNyX2dyYXBoICAgPSBnci5UZXh0QXJlYShsYWJlbD0iU3RhdGUgTWFjaGluZSBHcmFwaCArIEFzc3VtcHRpb24gR2FwcyAoSlNPTikiLCBsaW5lcz0yMiwgaW50ZXJhY3RpdmU9RmFsc2UpCiAgICAgICAgICAgICAgICAgICAgc3JfYW5hbHl6ZV9idG4uY2xpY2soCiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bl9zZW1hbnRpY19hbmFseXNpcywKICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRzPXNyX3JlcG8sCiAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dHM9W3NyX3N1bW1hcnksIHNyX2dyYXBoXSwKICAgICAgICAgICAgICAgICAgICApCgogICAgICAgICAgICAgICAgIyBTdGVwIDIg4oCUIEhhcm5lc3MgR2VuZXJhdGlvbgogICAgICAgICAgICAgICAgd2l0aCBnci5UYWIoIjIuIEdlbmVyYXRlIFBvQyAoUmV2aWV3IE9ubHkpIik6CiAgICAgICAgICAgICAgICAgICAgZ3IuTWFya2Rvd24oCiAgICAgICAgICAgICAgICAgICAgICAgICJQYXN0ZSBhIHNpbmdsZSBhc3N1bXB0aW9uIGdhcCBKU09OIGZyb20gU3RlcCAxLiAiCiAgICAgICAgICAgICAgICAgICAgICAgICJIZXJtZXMgZ2VuZXJhdGVzIGEgbWluaW1hbCBQb0MgaGFybmVzcyAqKmZvciB5b3VyIHJldmlldyoqLiAiCiAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgaGFybmVzcyBpcyBOT1QgZXhlY3V0ZWQgaGVyZS4iCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIHNyX2dhcF9pbnB1dCAgPSBnci5UZXh0QXJlYShsYWJlbD0iQXNzdW1wdGlvbiBHYXAgSlNPTiIsIGxpbmVzPTEwKQogICAgICAgICAgICAgICAgICAgIHNyX3JlcG8yICAgICAgPSBnci5UZXh0Ym94KGxhYmVsPSJSZXBvc2l0b3J5IChvd25lci9yZXBvKSIpCiAgICAgICAgICAgICAgICAgICAgc3JfZ2VuX2J0biAgICA9IGdyLkJ1dHRvbigi4pqZ77iPIEdlbmVyYXRlIEhhcm5lc3MgZm9yIFJldmlldyIsIHZhcmlhbnQ9InNlY29uZGFyeSIpCiAgICAgICAgICAgICAgICAgICAgc3JfaGFybmVzcyAgICA9IGdyLlRleHRBcmVhKAogICAgICAgICAgICAgICAgICAgICAgICBsYWJlbD0iR2VuZXJhdGVkIEhhcm5lc3Mg4oCUIFJFQUQgQ0FSRUZVTExZIEJFRk9SRSBQUk9DRUVESU5HIiwKICAgICAgICAgICAgICAgICAgICAgICAgbGluZXM9MjIsIGludGVyYWN0aXZlPVRydWUsCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIHNyX2dlbl9idG4uY2xpY2soCiAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlX2hhcm5lc3NfZm9yX3JldmlldywKICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRzPVtzcl9nYXBfaW5wdXQsIHNyX3JlcG8yXSwKICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0cz1zcl9oYXJuZXNzLAogICAgICAgICAgICAgICAgICAgICkKCiAgICAgICAgICAgICAgICAjIFN0ZXAgMyDigJQgU2FuZGJveCBFeGVjdXRpb24KICAgICAgICAgICAgICAgIHdpdGggZ3IuVGFiKCIzLiBTYW5kYm94IEV4ZWN1dGlvbiAoT3BlcmF0b3IgQXBwcm92ZWQpIik6CiAgICAgICAgICAgICAgICAgICAgZ3IuTWFya2Rvd24oIiIiCioqQnkgY2xpY2tpbmcgRXhlY3V0ZSB5b3UgY29uZmlybToqKgotIFlvdSBoYXZlIHJlYWQgZXZlcnkgbGluZSBvZiB0aGUgaGFybmVzcyBhYm92ZQotIFlvdSBhdXRob3Jpc2UgbG9jYWwgc2FuZGJveCBleGVjdXRpb24gb25seQotIE5vIG5ldHdvcmsgY29ubmVjdGlvbnMgd2lsbCBiZSBtYWRlCi0gRXhlY3V0aW9uIGlzIHRpbWUtbGltaXRlZCB0byAzMCBzZWNvbmRzCiAgICAgICAgICAgICAgICAgICAgIiIiKQogICAgICAgICAgICAgICAgICAgIHNyX2V4ZWNfY29kZSA9IGdyLlRleHRBcmVhKGxhYmVsPSJIYXJuZXNzIENvZGUgKHJldmlld2VkIGJ5IG9wZXJhdG9yKSIsIGxpbmVzPTE1KQogICAgICAgICAgICAgICAgICAgIHdpdGggZ3IuUm93KCk6CiAgICAgICAgICAgICAgICAgICAgICAgIHNyX2V4ZWNfcmVwbyA9IGdyLlRleHRib3gobGFiZWw9IlJlcG9zaXRvcnkgKG93bmVyL3JlcG8pIiwgc2NhbGU9MykKICAgICAgICAgICAgICAgICAgICAgICAgc3JfZXhlY192ZW52ID0gZ3IuVGV4dGJveChsYWJlbD0iVmVudiBwYXRoIiwgdmFsdWU9Ii9kYXRhL3RhcmdldF92ZW52Iiwgc2NhbGU9MikKICAgICAgICAgICAgICAgICAgICBzcl9leGVjX2J0biAgPSBnci5CdXR0b24oIvCfmoAgRXhlY3V0ZSBpbiBTYW5kYm94IChJIGhhdmUgcmV2aWV3ZWQgdGhpcyBjb2RlKSIsIHZhcmlhbnQ9InByaW1hcnkiKQogICAgICAgICAgICAgICAgICAgIHNyX2V4ZWNfb3V0ICA9IGdyLlRleHRBcmVhKGxhYmVsPSJTYW5kYm94IFJlc3VsdCIsIGxpbmVzPTEyLCBpbnRlcmFjdGl2ZT1GYWxzZSkKICAgICAgICAgICAgICAgICAgICBzcl9leGVjX2J0bi5jbGljaygKICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZV9hcHByb3ZlZF9oYXJuZXNzLAogICAgICAgICAgICAgICAgICAgICAgICBpbnB1dHM9W3NyX2V4ZWNfY29kZSwgc3JfZXhlY19yZXBvLCBzcl9leGVjX3ZlbnZdLAogICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRzPXNyX2V4ZWNfb3V0LAogICAgICAgICAgICAgICAgICAgICkKCiAgICAgICAgICAgICAgICAjIFN0ZXAgNCDigJQgU3RvcmUgJiBDaGFpbiBBbmFseXNpcwogICAgICAgICAgICAgICAgd2l0aCBnci5UYWIoIjQuIENoYWluIEFuYWx5c2lzIik6CiAgICAgICAgICAgICAgICAgICAgZ3IuTWFya2Rvd24oCiAgICAgICAgICAgICAgICAgICAgICAgICJTdG9yZSBwcmltaXRpdmUgZmluZGluZ3MsIHRoZW4gYXNrIEhlcm1lcyB0byBwcm9wb3NlIHRoZW9yZXRpY2FsIGNoYWlucy4gIgogICAgICAgICAgICAgICAgICAgICAgICAiQWxsIGNoYWluIHByb3Bvc2FscyBhcmUgdGFnZ2VkIFBFTkRJTkdfSFVNQU5fUkVWSUVXLiIKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgd2l0aCBnci5Sb3coKToKICAgICAgICAgICAgICAgICAgICAgICAgc3JfcHJpbV9yZXBvICA9IGdyLlRleHRib3gobGFiZWw9IlJlcG9zaXRvcnkiLCBzY2FsZT0yKQogICAgICAgICAgICAgICAgICAgICAgICBzcl9wcmltX2dhcGlkID0gZ3IuVGV4dGJveChsYWJlbD0iR2FwIElEIiwgc2NhbGU9MSkKICAgICAgICAgICAgICAgICAgICAgICAgc3JfcHJpbV9zZXYgICA9IGdyLlRleHRib3gobGFiZWw9IlNldmVyaXR5IiwgdmFsdWU9IlAyIiwgc2NhbGU9MSkKICAgICAgICAgICAgICAgICAgICBzcl9wcmltX2Rlc2MgICAgPSBnci5UZXh0Ym94KGxhYmVsPSJEZXNjcmlwdGlvbiIsIGxpbmVzPTIpCiAgICAgICAgICAgICAgICAgICAgc3JfcHJpbV9zYW5kYm94ID0gZ3IuVGV4dEFyZWEobGFiZWw9IlNhbmRib3ggT3V0cHV0IChmcm9tIFN0ZXAgMykiLCBsaW5lcz01KQogICAgICAgICAgICAgICAgICAgIHNyX3N0b3JlX2J0biAgICA9IGdyLkJ1dHRvbigi8J+SviBTdG9yZSBQcmltaXRpdmUgRmluZGluZyIsIHZhcmlhbnQ9InNlY29uZGFyeSIpCiAgICAgICAgICAgICAgICAgICAgc3Jfc3RvcmVfb3V0ICAgID0gZ3IuVGV4dGJveChsYWJlbD0iIiwgaW50ZXJhY3RpdmU9RmFsc2UpCiAgICAgICAgICAgICAgICAgICAgc3Jfc3RvcmVfYnRuLmNsaWNrKAogICAgICAgICAgICAgICAgICAgICAgICBzdG9yZV9wcmltaXRpdmVfZmluZGluZywKICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRzPVtzcl9wcmltX3JlcG8sIHNyX3ByaW1fZ2FwaWQsIHNyX3ByaW1fc2V2LCBzcl9wcmltX2Rlc2MsIHNyX3ByaW1fZ2FwaWQsIHNyX3ByaW1fc2FuZGJveF0sCiAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dHM9c3Jfc3RvcmVfb3V0LAogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICBnci5IVE1MKCI8aHIvPiIpCiAgICAgICAgICAgICAgICAgICAgc3JfY2hhaW5fcmVwbyA9IGdyLlRleHRib3gobGFiZWw9IlJlcG9zaXRvcnkgZm9yIGNoYWluIGFuYWx5c2lzIChsZWF2ZSBibGFuayBmb3IgYWxsKSIpCiAgICAgICAgICAgICAgICAgICAgc3JfY2hhaW5fYnRuICA9IGdyLkJ1dHRvbigi8J+UlyBBbmFseXNlIENoYWlucyIsIHZhcmlhbnQ9InNlY29uZGFyeSIpCiAgICAgICAgICAgICAgICAgICAgc3JfY2hhaW5fb3V0ICA9IGdyLlRleHRBcmVhKGxhYmVsPSJQcm9wb3NlZCBDaGFpbnMgKFBFTkRJTkcgSFVNQU4gUkVWSUVXKSIsIGxpbmVzPTE0LCBpbnRlcmFjdGl2ZT1GYWxzZSkKICAgICAgICAgICAgICAgICAgICBzcl9jaGFpbl9idG4uY2xpY2socnVuX2NoYWluX2FuYWx5c2lzLCBpbnB1dHM9c3JfY2hhaW5fcmVwbywgb3V0cHV0cz1zcl9jaGFpbl9vdXQpCgogICAgICAgICAgICAgICAgIyBTdGVwIDUg4oCUIERpc2Nsb3N1cmUgVmF1bHQKICAgICAgICAgICAgICAgIHdpdGggZ3IuVGFiKCI1LiBEaXNjbG9zdXJlIFZhdWx0Iik6CiAgICAgICAgICAgICAgICAgICAgZ3IuTWFya2Rvd24oIiIiCioqSHVtYW4gYXBwcm92YWwgaXMgbWFuZGF0b3J5IGJlZm9yZSBhbnkgZGlzY2xvc3VyZSBpcyBzZW50LioqICAKQXBwcm92ZWQgZGlzY2xvc3VyZXMgZ2VuZXJhdGUgYSBtZXNzYWdlIHlvdSBzZW5kIG1hbnVhbGx5IHZpYSB0aGUgbWFpbnRhaW5lcidzIHNlY3VyaXR5IHBvbGljeS4KICAgICAgICAgICAgICAgICAgICAiIiIpCiAgICAgICAgICAgICAgICAgICAgd2l0aCBnci5Sb3coKToKICAgICAgICAgICAgICAgICAgICAgICAgc3JfdmF1bHRfcmVwbyAgID0gZ3IuVGV4dGJveChsYWJlbD0iUmVwb3NpdG9yeSAob3duZXIvcmVwbykiLCBzY2FsZT0zKQogICAgICAgICAgICAgICAgICAgICAgICBzcl92YXVsdF9ib3VudHkgPSBnci5UZXh0Ym94KGxhYmVsPSJCdWcgYm91bnR5IHByb2dyYW1tZSBVUkwiLCBzY2FsZT0yKQogICAgICAgICAgICAgICAgICAgIHNyX3ZhdWx0X2dhcCAgPSBnci5UZXh0QXJlYShsYWJlbD0iQXNzdW1wdGlvbiBHYXAgSlNPTiIsIGxpbmVzPTYpCiAgICAgICAgICAgICAgICAgICAgc3JfdmF1bHRfcG9jICA9IGdyLlRleHRBcmVhKGxhYmVsPSJTYW5kYm94IG91dHB1dCBmcm9tIFN0ZXAgMyIsIGxpbmVzPTQpCiAgICAgICAgICAgICAgICAgICAgc3JfY29tcGlsZV9idG4gPSBnci5CdXR0b24oIvCfk4sgQ29tcGlsZSBEaXNjbG9zdXJlIERvc3NpZXIiLCB2YXJpYW50PSJzZWNvbmRhcnkiKQogICAgICAgICAgICAgICAgICAgIHNyX2NvbXBpbGVfb3V0ID0gZ3IuVGV4dGJveChsYWJlbD0iIiwgaW50ZXJhY3RpdmU9RmFsc2UpCiAgICAgICAgICAgICAgICAgICAgc3JfY29tcGlsZV9idG4uY2xpY2soCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBpbGVfZG9zc2llcl9mbiwKICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRzPVtzcl92YXVsdF9yZXBvLCBzcl92YXVsdF9nYXAsIHNyX3ZhdWx0X3BvYywgc3JfdmF1bHRfYm91bnR5XSwKICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0cz1zcl9jb21waWxlX291dCwKICAgICAgICAgICAgICAgICAgICApCgogICAgICAgICAgICAgICAgICAgIGdyLkhUTUwoIjxoci8+IikKICAgICAgICAgICAgICAgICAgICBnci5CdXR0b24oIvCflIQgUmVmcmVzaCBWYXVsdCIsIHZhcmlhbnQ9InNlY29uZGFyeSIpLmNsaWNrKAogICAgICAgICAgICAgICAgICAgICAgICBnZXRfdmF1bHRfZGlzcGxheSwgb3V0cHV0cz1nci5UZXh0QXJlYShsYWJlbD0iQWxsIERpc2Nsb3N1cmVzIiwgbGluZXM9MTAsIGludGVyYWN0aXZlPUZhbHNlKQogICAgICAgICAgICAgICAgICAgICkKCiAgICAgICAgICAgICAgICAgICAgZ3IuSFRNTCgiPGhyLz4iKQogICAgICAgICAgICAgICAgICAgIHNyX2RpZCAgICAgICA9IGdyLlRleHRib3gobGFiZWw9IkRpc2Nsb3N1cmUgSUQiKQogICAgICAgICAgICAgICAgICAgIHNyX3JlYWRfYnRuICA9IGdyLkJ1dHRvbigi8J+ThCBSZWFkIEZ1bGwgRG9zc2llciIsIHZhcmlhbnQ9InNlY29uZGFyeSIpCiAgICAgICAgICAgICAgICAgICAgc3JfZG9zc2llciAgID0gZ3IuVGV4dEFyZWEobGFiZWw9IkRvc3NpZXIgKHJlYWQgYmVmb3JlIGFwcHJvdmluZykiLCBsaW5lcz0yNCwgaW50ZXJhY3RpdmU9RmFsc2UpCiAgICAgICAgICAgICAgICAgICAgc3JfcmVhZF9idG4uY2xpY2socmVhZF9kb3NzaWVyX2ZuLCBpbnB1dHM9c3JfZGlkLCBvdXRwdXRzPXNyX2Rvc3NpZXIpCgogICAgICAgICAgICAgICAgICAgIGdyLkhUTUwoIjxoci8+IikKICAgICAgICAgICAgICAgICAgICBzcl9hcHByb3ZlciAgPSBnci5UZXh0Ym94KGxhYmVsPSJZb3VyIG5hbWUgKGFwcHJvdmFsIHJlY29yZCkiKQogICAgICAgICAgICAgICAgICAgIHdpdGggZ3IuUm93KCk6CiAgICAgICAgICAgICAgICAgICAgICAgIHNyX2FwcHJvdmVfYnRuID0gZ3IuQnV0dG9uKCLinIUgQXBwcm92ZSAmIFByZXBhcmUgRGlzY2xvc3VyZSBNZXNzYWdlIiwgdmFyaWFudD0icHJpbWFyeSIpCiAgICAgICAgICAgICAgICAgICAgICAgIHNyX3JlamVjdF9idG4gID0gZ3IuQnV0dG9uKCLinYwgUmVqZWN0ICYgQXJjaGl2ZSIsIHZhcmlhbnQ9InNlY29uZGFyeSIpCiAgICAgICAgICAgICAgICAgICAgc3JfYXBwcm92YWxfb3V0ID0gZ3IuVGV4dEFyZWEobGFiZWw9IlJlc3VsdCAvIERpc2Nsb3N1cmUgTWVzc2FnZSAoc2VuZCBtYW51YWxseSkiLCBsaW5lcz0xNCwgaW50ZXJhY3RpdmU9RmFsc2UpCiAgICAgICAgICAgICAgICAgICAgc3JfYXBwcm92ZV9idG4uY2xpY2soCiAgICAgICAgICAgICAgICAgICAgICAgIGFwcHJvdmVfYW5kX3ByZXBhcmVfbXNnLAogICAgICAgICAgICAgICAgICAgICAgICBpbnB1dHM9W3NyX2RpZCwgc3JfYXBwcm92ZXJdLAogICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRzPXNyX2FwcHJvdmFsX291dCwKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgc3JfcmVqZWN0X2J0bi5jbGljayhyZWplY3RfZGlzY2xvc3VyZV9mbiwgaW5wdXRzPXNyX2RpZCwgb3V0cHV0cz1zcl9hcHByb3ZhbF9vdXQpCgogICAgICAgICMg4pSA4pSAIEhFUk1FUyBBSSBTRUNVUklUWSBSRVNFQVJDSEVSIFRBQiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgICAgICB3aXRoIGdyLlRhYigi8J+noCBIZXJtZXMgWmVyby1EYXkiKToKICAgICAgICAgICAgZ3IuTWFya2Rvd24oIiIiCiMgSGVybWVzIOKAlCBBdXRvbm9tb3VzIFplcm8tRGF5IFJlc2VhcmNoIEVuZ2luZQoKSGVybWVzIGlzIHlvdXIgQUkgc2VjdXJpdHkgcmVzZWFyY2hlci4gUG9pbnQgaXQgYXQgYW55IG9wZW4gc291cmNlIHByb2plY3QgYW5kIGl0IHdpbGw6Ci0gKipNYXAgdGhlIGF0dGFjayBzdXJmYWNlKiogKGVudHJ5IHBvaW50cywgZGFuZ2Vyb3VzIHNpbmtzLCBzZWN1cml0eS1jcml0aWNhbCBmaWxlcykKLSAqKlJ1biB0YWludCBhbmFseXNpcyoqIHRvIHRyYWNlIHVudHJ1c3RlZCBpbnB1dCB0byBkYW5nZXJvdXMgc2lua3MKLSAqKlBlcmZvcm0gc3ltYm9saWMgZXhlY3V0aW9uKiogdG8gZmluZCB1bmNoZWNrZWQgY29kZSBwYXRocwotICoqR2VuZXJhdGUgYW5kIHJ1biBmdXp6IGNhbXBhaWducyoqIHRvIGZpbmQgY3Jhc2hlcwotICoqUmVhc29uIGFib3V0IGV4cGxvaXRhYmlsaXR5KiogKENWU1MsIFBvQyBnZW5lcmF0aW9uKQotICoqU2NvcmUgZmluZGluZ3MqKiB3aXRoIFZFUyAoVnVsbmVyYWJpbGl0eSBFbnRyb3B5IFNjb3JlKSArIEFDVFMgKEFkdmVyc2FyaWFsIENvbnNlbnN1cykKCioqQUxMIGZpbmRpbmdzIHJlcXVpcmUgaHVtYW4gYXBwcm92YWwgYmVmb3JlIGFueSBkaXNjbG9zdXJlIGlzIHNlbnQuKioKIiIiKQogICAgICAgICAgICB3aXRoIGdyLlRhYnMoKToKICAgICAgICAgICAgICAgIHdpdGggZ3IuVGFiKCLwn5qAIExhdW5jaCBSZXNlYXJjaCIpOgogICAgICAgICAgICAgICAgICAgIGdyLk1hcmtkb3duKCIjIyMgU3RhcnQgYW4gYXV0b25vbW91cyBzZWN1cml0eSByZXNlYXJjaCBzZXNzaW9uIikKICAgICAgICAgICAgICAgICAgICB3aXRoIGdyLlJvdygpOgogICAgICAgICAgICAgICAgICAgICAgICBoZXJtZXNfcmVwbyAgICAgPSBnci5UZXh0Ym94KGxhYmVsPSJUYXJnZXQgUmVwb3NpdG9yeSAob3duZXIvcmVwbykiLCBwbGFjZWhvbGRlcj0idG9ydmFsZHMvbGludXgiLCBzY2FsZT0yKQogICAgICAgICAgICAgICAgICAgICAgICBoZXJtZXNfcGF0aCAgICAgPSBnci5UZXh0Ym94KGxhYmVsPSJMb2NhbCBDbG9uZSBQYXRoIiwgcGxhY2Vob2xkZXI9Ii9kYXRhL3JlcG8vbGludXgiLCBzY2FsZT0yKQogICAgICAgICAgICAgICAgICAgIGhlcm1lc19mb2N1cyAgICA9IGdyLlRleHRib3goCiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsPSJGb2N1cyBBcmVhIChvcHRpb25hbCkiLAogICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj0ibWVtb3J5IG1hbmFnZW1lbnQgc3Vic3lzdGVtLCBhdXRoZW50aWNhdGlvbiBtaWRkbGV3YXJlLCBjcnlwdG8gcHJpbWl0aXZlcy4uLiIsCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIHdpdGggZ3IuUm93KCk6CiAgICAgICAgICAgICAgICAgICAgICAgIGhlcm1lc19tYXhfaXRlciA9IGdyLlNsaWRlcihtaW5pbXVtPTUsIG1heGltdW09MzAsIHZhbHVlPTE1LCBzdGVwPTEsIGxhYmVsPSJNYXggUmVzZWFyY2ggSXRlcmF0aW9ucyIpCiAgICAgICAgICAgICAgICAgICAgICAgIGhlcm1lc19sYXVuY2ggICA9IGdyLkJ1dHRvbigi8J+noCBMYXVuY2ggSGVybWVzIiwgdmFyaWFudD0icHJpbWFyeSIsIHNjYWxlPTEpCiAgICAgICAgICAgICAgICAgICAgaGVybWVzX2xhdW5jaF9vdXQgPSBnci5UZXh0Ym94KGxhYmVsPSJTdGF0dXMiLCBpbnRlcmFjdGl2ZT1GYWxzZSwgbGluZXM9NSkKICAgICAgICAgICAgICAgICAgICBoZXJtZXNfbGF1bmNoLmNsaWNrKAogICAgICAgICAgICAgICAgICAgICAgICBoZXJtZXNfc3RhcnRfcmVzZWFyY2gsCiAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0cz1baGVybWVzX3JlcG8sIGhlcm1lc19wYXRoLCBoZXJtZXNfZm9jdXMsIGhlcm1lc19tYXhfaXRlcl0sCiAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dHM9aGVybWVzX2xhdW5jaF9vdXQsCiAgICAgICAgICAgICAgICAgICAgKQoKICAgICAgICAgICAgICAgIHdpdGggZ3IuVGFiKCLwn5OhIExpdmUgUmVzZWFyY2ggTG9ncyIpOgogICAgICAgICAgICAgICAgICAgIGhlcm1lc19saXZlX2xvZ3MgPSBnci5UZXh0QXJlYSgKICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw9Ikhlcm1lcyBSZXNlYXJjaCBMb2cgKGF1dG8tcmVmcmVzaGVzKSIsCiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVzPTMwLCBpbnRlcmFjdGl2ZT1GYWxzZSwKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgZ3IuQnV0dG9uKCLwn5SEIFJlZnJlc2ggTG9ncyIsIHZhcmlhbnQ9InNlY29uZGFyeSIpLmNsaWNrKAogICAgICAgICAgICAgICAgICAgICAgICBoZXJtZXNfZ2V0X2xpdmVfbG9ncywgb3V0cHV0cz1oZXJtZXNfbGl2ZV9sb2dzCiAgICAgICAgICAgICAgICAgICAgKQoKICAgICAgICAgICAgICAgIHdpdGggZ3IuVGFiKCLwn5OKIFNlc3Npb24gU3VtbWFyeSIpOgogICAgICAgICAgICAgICAgICAgIGhlcm1lc19zdW1tYXJ5X291dCA9IGdyLlRleHRBcmVhKGxhYmVsPSJMYXN0IFNlc3Npb24gU3VtbWFyeSIsIGxpbmVzPTI1LCBpbnRlcmFjdGl2ZT1GYWxzZSkKICAgICAgICAgICAgICAgICAgICBnci5CdXR0b24oIvCfk4ogR2V0IFN1bW1hcnkiLCB2YXJpYW50PSJzZWNvbmRhcnkiKS5jbGljaygKICAgICAgICAgICAgICAgICAgICAgICAgaGVybWVzX2dldF9zZXNzaW9uX3N1bW1hcnksIG91dHB1dHM9aGVybWVzX3N1bW1hcnlfb3V0CiAgICAgICAgICAgICAgICAgICAgKQoKICAgICAgICAgICAgICAgIHdpdGggZ3IuVGFiKCLwn5SSIERpc2Nsb3N1cmUgUGlwZWxpbmUiKToKICAgICAgICAgICAgICAgICAgICBnci5NYXJrZG93bigiIiIKIyMjIEh1bWFuLUFwcHJvdmFsIEdhdGUKCkFsbCBmaW5kaW5ncyBzaXQgaGVyZSBhcyAqKlBFTkRJTkdfSFVNQU5fQVBQUk9WQUwqKiB1bnRpbCB5b3UgZXhwbGljaXRseSBhcHByb3ZlIHRoZW0uCkhlcm1lcyBuZXZlciBhdXRvLXN1Ym1pdHMuIFlvdSByZXZpZXcsIHRoZW4gYXBwcm92ZSBvciByZWplY3QgZWFjaCBmaW5kaW5nIGluZGl2aWR1YWxseS4KQWZ0ZXIgYXBwcm92YWwsIHlvdSBjYW4gc3VibWl0IHRvIEhhY2tlck9uZSBvciBjcmVhdGUgYSBHaXRIdWIgU2VjdXJpdHkgQWR2aXNvcnkuCgoqKjkwLWRheSBkaXNjbG9zdXJlIGNvdW50ZG93biBzdGFydHMgb24gYXBwcm92YWwuKioKIiIiKQogICAgICAgICAgICAgICAgICAgIGhlcm1lc19waXBlbGluZV9vdXQgPSBnci5UZXh0QXJlYShsYWJlbD0iUGlwZWxpbmUgU3RhdHVzIiwgbGluZXM9MTIsIGludGVyYWN0aXZlPUZhbHNlKQogICAgICAgICAgICAgICAgICAgIGdyLkJ1dHRvbigi8J+UhCBSZWZyZXNoIFBpcGVsaW5lIiwgdmFyaWFudD0ic2Vjb25kYXJ5IikuY2xpY2soCiAgICAgICAgICAgICAgICAgICAgICAgIGhlcm1lc19nZXRfcGlwZWxpbmVfZGlzcGxheSwgb3V0cHV0cz1oZXJtZXNfcGlwZWxpbmVfb3V0CiAgICAgICAgICAgICAgICAgICAgKQoKICAgICAgICAgICAgICAgICAgICBnci5IVE1MKCI8aHIvPiIpCiAgICAgICAgICAgICAgICAgICAgZ3IuTWFya2Rvd24oIiMjIyMgUmV2aWV3ICYgQXBwcm92ZS9SZWplY3QgYSBGaW5kaW5nIikKICAgICAgICAgICAgICAgICAgICB3aXRoIGdyLlJvdygpOgogICAgICAgICAgICAgICAgICAgICAgICBoZXJtZXNfcmVjb3JkX2lkID0gZ3IuVGV4dGJveChsYWJlbD0iUmVjb3JkIElEIiwgc2NhbGU9MikKICAgICAgICAgICAgICAgICAgICAgICAgaGVybWVzX25vdGVzICAgICA9IGdyLlRleHRib3gobGFiZWw9IkFuYWx5c3QgTm90ZXMiLCBzY2FsZT0zKQogICAgICAgICAgICAgICAgICAgIHdpdGggZ3IuUm93KCk6CiAgICAgICAgICAgICAgICAgICAgICAgIGhlcm1lc19hcHByb3ZlX2J0biA9IGdyLkJ1dHRvbigi4pyFIEFwcHJvdmUgRmluZGluZyIsIHZhcmlhbnQ9InByaW1hcnkiKQogICAgICAgICAgICAgICAgICAgICAgICBoZXJtZXNfcmVqZWN0X2J0biAgPSBnci5CdXR0b24oIuKdjCBSZWplY3QgRmluZGluZyIsIHZhcmlhbnQ9InNlY29uZGFyeSIpCiAgICAgICAgICAgICAgICAgICAgaGVybWVzX2FwcHJvdmFsX291dCA9IGdyLlRleHRib3gobGFiZWw9IlJlc3VsdCIsIGludGVyYWN0aXZlPUZhbHNlKQogICAgICAgICAgICAgICAgICAgIGhlcm1lc19hcHByb3ZlX2J0bi5jbGljaygKICAgICAgICAgICAgICAgICAgICAgICAgaGVybWVzX2FwcHJvdmVfZmluZGluZywKICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRzPVtoZXJtZXNfcmVjb3JkX2lkLCBoZXJtZXNfbm90ZXNdLAogICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRzPWhlcm1lc19hcHByb3ZhbF9vdXQsCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIGhlcm1lc19yZWplY3RfYnRuLmNsaWNrKAogICAgICAgICAgICAgICAgICAgICAgICBoZXJtZXNfcmVqZWN0X2ZpbmRpbmcsCiAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0cz1baGVybWVzX3JlY29yZF9pZCwgaGVybWVzX25vdGVzXSwKICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0cz1oZXJtZXNfYXBwcm92YWxfb3V0LAogICAgICAgICAgICAgICAgICAgICkKCiAgICAgICAgICAgICAgICAgICAgZ3IuSFRNTCgiPGhyLz4iKQogICAgICAgICAgICAgICAgICAgIGdyLk1hcmtkb3duKCIjIyMjIFN1Ym1pdCBBcHByb3ZlZCBGaW5kaW5nIChyZXF1aXJlcyBjcmVkZW50aWFscyBpbiBlbnYgdmFycykiKQogICAgICAgICAgICAgICAgICAgIHdpdGggZ3IuUm93KCk6CiAgICAgICAgICAgICAgICAgICAgICAgIGhlcm1lc19zdWJtaXRfcmVjb3JkID0gZ3IuVGV4dGJveChsYWJlbD0iQXBwcm92ZWQgUmVjb3JkIElEIiwgc2NhbGU9MikKICAgICAgICAgICAgICAgICAgICAgICAgaGVybWVzX2doX3JlcG8gICAgICAgPSBnci5UZXh0Ym94KGxhYmVsPSJHaXRIdWIgb3duZXIvcmVwbyAoZm9yIEdIU0EpIiwgcGxhY2Vob2xkZXI9InRvcnZhbGRzL2xpbnV4Iiwgc2NhbGU9MikKICAgICAgICAgICAgICAgICAgICB3aXRoIGdyLlJvdygpOgogICAgICAgICAgICAgICAgICAgICAgICBoZXJtZXNfaDFfYnRuICA9IGdyLkJ1dHRvbigi8J+OryBTdWJtaXQgdG8gSGFja2VyT25lIiwgdmFyaWFudD0icHJpbWFyeSIpCiAgICAgICAgICAgICAgICAgICAgICAgIGhlcm1lc19naF9idG4gID0gZ3IuQnV0dG9uKCLwn5CZIENyZWF0ZSBHaXRIdWIgQWR2aXNvcnkiLCB2YXJpYW50PSJzZWNvbmRhcnkiKQogICAgICAgICAgICAgICAgICAgIGhlcm1lc19zdWJtaXRfb3V0ID0gZ3IuVGV4dGJveChsYWJlbD0iU3VibWlzc2lvbiBSZXN1bHQiLCBpbnRlcmFjdGl2ZT1GYWxzZSkKICAgICAgICAgICAgICAgICAgICBoZXJtZXNfaDFfYnRuLmNsaWNrKAogICAgICAgICAgICAgICAgICAgICAgICBoZXJtZXNfc3VibWl0X2hhY2tlcm9uZSwKICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRzPVtoZXJtZXNfc3VibWl0X3JlY29yZF0sCiAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dHM9aGVybWVzX3N1Ym1pdF9vdXQsCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIGhlcm1lc19naF9idG4uY2xpY2soCiAgICAgICAgICAgICAgICAgICAgICAgIGhlcm1lc19zdWJtaXRfZ2l0aHViLAogICAgICAgICAgICAgICAgICAgICAgICBpbnB1dHM9W2hlcm1lc19zdWJtaXRfcmVjb3JkLCBoZXJtZXNfZ2hfcmVwb10sCiAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dHM9aGVybWVzX3N1Ym1pdF9vdXQsCiAgICAgICAgICAgICAgICAgICAgKQoKICAgICAgICAgICAgICAgIHdpdGggZ3IuVGFiKCLwn5OaIENXRSBSZWZlcmVuY2UiKToKICAgICAgICAgICAgICAgICAgICBnci5NYXJrZG93bigiIyMjIENXRSBUYXhvbm9teSDigJQgQ292ZXJhZ2UgTWFwIikKICAgICAgICAgICAgICAgICAgICBjd2VfdGFibGVfZGF0YSA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgW2NbImN3ZV9pZCJdLCBjWyJuYW1lIl0sIGNbImNhdGVnb3J5Il0sIGNbInNldmVyaXR5Il0sCiAgICAgICAgICAgICAgICAgICAgICAgICBzdHIoY1siY3Zzc19iYXNlIl0pLCBjLmdldCgib3dhc3AiLCAiIildCiAgICAgICAgICAgICAgICAgICAgICAgIGZvciBjIGluIGdldF9hbGxfY3dlcygpCiAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgIGdyLkRhdGFmcmFtZSgKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9Y3dlX3RhYmxlX2RhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM9WyJDV0UgSUQiLCAiTmFtZSIsICJDYXRlZ29yeSIsICJTZXZlcml0eSIsICJDVlNTIiwgIk9XQVNQIl0sCiAgICAgICAgICAgICAgICAgICAgICAgIGludGVyYWN0aXZlPUZhbHNlLAogICAgICAgICAgICAgICAgICAgICkKCiAgICAjIOKUgOKUgCBBVVRPLVJFRlJFU0gg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICAjIEZJWCAoVGltZXIgQnVnKTogU2luZ2xlIHRpY2sgcmVwbGFjZXMgMyBjb25jdXJyZW50IFNTRSBzdHJlYW1zLgogICAgIyBnZXRfY29tYmluZWRfcmVmcmVzaCgpIHJldHVybnMgYWxsIDggb3V0cHV0cyBhdCBvbmNlLCB1c2luZyBvbmUgY29ubmVjdGlvbgogICAgIyBpbnN0ZWFkIG9mIHRocmVlIOKAlCBwcmV2ZW50cyBjb25uZWN0aW9uLWxpbWl0IGZyZWV6ZXMgdW5kZXIgbXVsdGlwbGUgdXNlcnMuCiAgICB0aW1lciA9IGdyLlRpbWVyKDMpCiAgICB0aW1lci50aWNrKAogICAgICAgIGdldF9jb21iaW5lZF9yZWZyZXNoLAogICAgICAgIG91dHB1dHM9W2xpdmVfbG9ncywgc3RhdF9zdGF0dXMsIHN0YXRfdG90YWwsIHN0YXRfZG9uZSwgc3RhdF9wcnMsIHN0YXRfZmFpbGVkLCBzdGF0X3Nhc3QsIGhlcm1lc19saXZlX2xvZ3NdLAogICAgKQoKICAgIGRlbW8ubG9hZChnZXRfbGl2ZV9sb2dzLCAgICAgICAgICAgIG91dHB1dHM9bGl2ZV9sb2dzKQogICAgZGVtby5sb2FkKGdldF9tZXRyaWNzX3JvdywgICAgICAgICAgb3V0cHV0cz1bc3RhdF9zdGF0dXMsIHN0YXRfdG90YWwsIHN0YXRfZG9uZSwgc3RhdF9wcnMsIHN0YXRfZmFpbGVkLCBzdGF0X3Nhc3RdKQogICAgZGVtby5sb2FkKGhlcm1lc19nZXRfbGl2ZV9sb2dzLCAgICAgb3V0cHV0cz1oZXJtZXNfbGl2ZV9sb2dzKQogICAgZGVtby5sb2FkKGhlcm1lc19nZXRfcGlwZWxpbmVfZGlzcGxheSwgb3V0cHV0cz1oZXJtZXNfcGlwZWxpbmVfb3V0KQogICAgZGVtby5sb2FkKGdldF9qb2JfdGFibGUsICAgICAgICAgICAgb3V0cHV0cz1qb2JfdGFibGUpCiAgICBkZW1vLmxvYWQoZ2V0X2F1ZGl0X2Rpc3BsYXksICAgICAgICBvdXRwdXRzPWF1ZGl0X2xvZykKICAgIGRlbW8ubG9hZChnZXRfY2hhaW5faW50ZWdyaXR5X2Rpc3BsYXksIG91dHB1dHM9Y2hhaW5fc3RhdHVzKQogICAgZGVtby5sb2FkKGdldF90cmFpbmluZ19zdGF0c19kaXNwbGF5LCAgb3V0cHV0cz1zdGF0c19kaXNwbGF5KQogICAgZGVtby5sb2FkKGdldF93ZWJob29rX2xvZ19kaXNwbGF5LCAgb3V0cHV0cz13ZWJob29rX2xvZykKICAgIGRlbW8ubG9hZChnZXRfcmVkX3RlYW1fZGlzcGxheSwgICAgIG91dHB1dHM9cmVkX3RlYW1fYm94KQogICAgZGVtby5sb2FkKGdldF9zd2ViZW5jaF9kaXNwbGF5LCAgICAgb3V0cHV0cz1zd2ViZW5jaF9yZXBvcnQpCgoKaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgIHVpX2xvZyhmIlJob2Rhd2sgQUkgdjMuMCBzdGFydGluZyDigJQgVGVuYW50OiB7VEVOQU5UX0lEfSB8IE1vZGVsOiB7TU9ERUx9IikKCiAgICAjIE1JTk9SIEJVRyBGSVg6IFByZS13YXJtIHRoZSBlbWJlZGRpbmcgbW9kZWwgaW4gYSBiYWNrZ3JvdW5kIHRocmVhZCBzbyB0aGUKICAgICMgZmlyc3QgcmVhbCByZXRyaWV2YWwgY2FsbCBkb2VzIG5vdCBibG9jayBvbiBhIG11bHRpLXNlY29uZCBtb2RlbCBkb3dubG9hZC4KICAgIGRlZiBfcHJld2FybSgpOgogICAgICAgIHRyeToKICAgICAgICAgICAgZnJvbSBlbWJlZGRpbmdfbWVtb3J5IGltcG9ydCBwcmVfd2FybV9tb2RlbAogICAgICAgICAgICBvayA9IHByZV93YXJtX21vZGVsKCkKICAgICAgICAgICAgdWlfbG9nKAogICAgICAgICAgICAgICAgIkVtYmVkZGluZyBtb2RlbCBwcmUtd2FybWVkIHN1Y2Nlc3NmdWxseS4iIGlmIG9rCiAgICAgICAgICAgICAgICBlbHNlICJFbWJlZGRpbmcgbW9kZWwgcHJlLXdhcm0gZmFpbGVkIOKAlCB3aWxsIHJldHJ5IG9uIGZpcnN0IHVzZS4iLAogICAgICAgICAgICAgICAgIk1FTSIKICAgICAgICAgICAgKQogICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgX2U6CiAgICAgICAgICAgIHVpX2xvZyhmIkVtYmVkZGluZyBtb2RlbCBwcmUtd2FybSBlcnJvciAobm9uLWZhdGFsKToge19lfSIsICJNRU0iKQoKICAgIHRocmVhZGluZy5UaHJlYWQodGFyZ2V0PV9wcmV3YXJtLCBkYWVtb249VHJ1ZSkuc3RhcnQoKQoKICAgIHVpX2xvZygiU3RhcnRpbmcgd2ViaG9vayBzZXJ2ZXIgb24gcG9ydCA3ODYxLi4uIikKICAgIHN0YXJ0X3dlYmhvb2tfc2VydmVyKCkKICAgIHVpX2xvZygiV2ViaG9vayBzZXJ2ZXIgcnVubmluZy4gTGF1bmNoaW5nIGRhc2hib2FyZC4uLiIpCiAgICBwb3J0ID0gaW50KG9zLmVudmlyb24uZ2V0KCJQT1JUIiwgNzg2MCkpCiAgICBkZW1vLmxhdW5jaChzZXJ2ZXJfbmFtZT0iMC4wLjAuMCIsIHNlcnZlcl9wb3J0PXBvcnQsIHNoYXJlPUZhbHNlLCBzaG93X2Vycm9yPVRydWUsIHRoZW1lPVRIRU1FKQo= \ No newline at end of file