ZGlmZiAtLWdpdCBhL0FuZHJvaWQubWsgYi9BbmRyb2lkLm1rCmluZGV4IGExNDU1ZDQuLjUwNTNlN2QgMTAwNjQ0Ci0tLSBhL0FuZHJvaWQubWsKKysrIGIvQW5kcm9pZC5tawpAQCAtMSw4ICsxIEBACi1MT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCi0KLSMgV2UncmUgcmVsb2NhdGluZyB0aGUgYnVpbGQgcHJvamVjdCB0byBhIHN1YmRpcmVjdG9yeSwgdGhlbiB1c2luZyBzeW1saW5rcwotIyB0byBleHBvc2UgdGhlIHN1YmRpcmVjdG9yaWVzIHdoZXJlIHRoZXkgdXNlZCB0byBiZS4gSWYgdGhlIG1hbmlmZXN0IGhhc24ndAotIyBiZWVuIHVwZGF0ZWQsIHdlIG5lZWQgdG8gaW5jbHVkZSBhbGwgdGhlIHN1YmRpcmVjdG9yaWVzLgotaWZlcSAoJChMT0NBTF9QQVRIKSxidWlsZCkKLWluY2x1ZGUgJChjYWxsIGZpcnN0LW1ha2VmaWxlcy11bmRlciwkKExPQ0FMX1BBVEgpKQotZW5kaWYKK2luY2x1ZGUgJChjYWxsIGFsbC1zdWJkaXItbWFrZWZpbGVzKQpkaWZmIC0tZ2l0IGEvQ2hhbmdlcy5tZCBiL0NoYW5nZXMubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzdiYmFkMAotLS0gL2Rldi9udWxsCisrKyBiL0NoYW5nZXMubWQKQEAgLTAsMCArMSwxMTYgQEAKKyMgQnVpbGQgU3lzdGVtIENoYW5nZXMgZm9yIEFuZHJvaWQubWsgV3JpdGVycworCisjIyBEZXByZWNhdGluZyAvIG9ic29sZXRpbmcgZW52c2V0dXAuc2ggdmFyaWFibGVzIGluIE1ha2VmaWxlcworCitJdCBpcyBub3QgcmVxdWlyZWQgdG8gc291cmNlIGVudnNldHVwLnNoIGJlZm9yZSBydW5uaW5nIGEgYnVpbGQuIE1hbnkgc2NyaXB0cywKK2luY2x1ZGluZyBhIG1ham9yaXR5IG9mIG91ciBhdXRvbWF0ZWQgYnVpbGQgc3lzdGVtcywgZG8gbm90IGRvIHNvLiBNYWtlIHdpbGwKK3RyYW5zcGFyZW50bHkgbWFrZSBldmVyeSBlbnZpcm9ubWVudCB2YXJpYWJsZSBhdmFpbGFibGUgYXMgYSBtYWtlIHZhcmlhYmxlLgorVGhpcyBtZWFucyB0aGF0IHJlbHlpbmcgb24gZW52aXJvbm1lbnQgdmFyaWFibGVzIG9ubHkgc2V0IHVwIGluIGVudnNldHVwLnNoIHdpbGwKK3Byb2R1Y2UgZGlmZmVyZW50IG91dHB1dCBmb3IgbG9jYWwgdXNlcnMgYW5kIHNjcmlwdGVkIHVzZXJzLgorCitNYW55IG9mIHRoZXNlIHZhcmlhYmxlcyBhbHNvIGluY2x1ZGUgYWJzb2x1dGUgcGF0aCBuYW1lcywgd2hpY2ggd2UnZCBsaWtlIHRvCitrZWVwIG91dCBvZiB0aGUgZ2VuZXJhdGVkIGZpbGVzLCBzbyB0aGF0IHlvdSBkb24ndCBuZWVkIHRvIGRvIGEgZnVsbCByZWJ1aWxkIGlmCit5b3UgbW92ZSB0aGUgc291cmNlIHRyZWUuCisKK1RvIGZpeCB0aGlzLCB3ZSdyZSBtYXJraW5nIHRoZSB2YXJpYWJsZXMgdGhhdCBhcmUgc2V0IGluIGVudnNldHVwLnNoIGFzCitkZXByZWNhdGVkIGluIHRoZSBtYWtlZmlsZXMuIFRoaXMgd2lsbCB0cmlnZ2VyIGEgd2FybmluZyBldmVyeSB0aW1lIG9uZSBpcyByZWFkCisob3Igd3JpdHRlbikgaW5zaWRlIEthdGkuIE9uY2UgYWxsIHRoZSB3YXJuaW5ncyBoYXZlIGJlZW4gcmVtb3ZlZCBmb3IgYQorcGFydGljdWxhciB2YXJpYWJsZSwgd2UnbGwgc3dpdGNoIGl0IHRvIG9ic29sZXRlLCBhbmQgYW55IHJlZmVyZW5jZXMgd2lsbCBiZWNvbWUKK2Vycm9ycy4KKworIyMjIGVudnNldHVwLnNoIHZhcmlhYmxlcyB3aXRoIG1ha2UgZXF1aXZhbGVudHMKKworfCBpbnN0ZWFkIG9mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB1c2UgICAgICAgICAgICAgICAgICB8Cit8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKK3wgT1VUIHsjT1VUfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgT1VUX0RJUiAgICAgICAgICAgICAgfAorfCBBTkRST0lEX0hPU1RfT1VUIHsjQU5EUk9JRF9IT1NUX09VVH0gICAgICAgICAgICAgICAgICAgICAgICAgfCBIT1NUX09VVCAgICAgICAgICAgICB8Cit8IEFORFJPSURfUFJPRFVDVF9PVVQgeyNBTkRST0lEX1BST0RVQ1RfT1VUfSAgICAgICAgICAgICAgICAgICB8IFBST0RVQ1RfT1VUICAgICAgICAgIHwKK3wgQU5EUk9JRF9IT1NUX09VVF9URVNUQ0FTRVMgeyNBTkRST0lEX0hPU1RfT1VUX1RFU1RDQVNFU30gICAgIHwgSE9TVF9PVVRfVEVTVENBU0VTICAgfAorfCBBTkRST0lEX1RBUkdFVF9PVVRfVEVTVENBU0VTIHsjQU5EUk9JRF9UQVJHRVRfT1VUX1RFU1RDQVNFU30gfCBUQVJHRVRfT1VUX1RFU1RDQVNFUyB8CisKK0FsbCBvZiB0aGUgbWFrZSB2YXJpYWJsZXMgbWF5IGJlIHJlbGF0aXZlIHBhdGhzIGZyb20gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LCBvcgorYWJzb2x1dGUgcGF0aHMgaWYgdGhlIG91dHB1dCBkaXJlY3Rvcnkgd2FzIHNwZWNpZmllZCBhcyBhbiBhYnNvbHV0ZSBwYXRoLiBJZiB5b3UKK25lZWQgYW4gYWJzb2x1dGUgdmFyaWFibGUsIGNvbnZlcnQgaXQgdG8gYWJzb2x1dGUgZHVyaW5nIGEgcnVsZSwgc28gdGhhdCBpdCdzCitub3QgZXhwYW5kZWQgaW50byB0aGUgZ2VuZXJhdGVkIG5pbmphIGZpbGU6CisKK2BgYCBtYWtlCiskKFBST0RVQ1RfT1VUKS9nZW4uaW1nOiBteS9zcmMvcGF0aC9nZW4uc2gKKwlleHBvcnQgUFJPRFVDVF9PVVQ9JCQoY2QgJChQUk9EVUNUX09VVCk7IHB3ZCk7IGNkIG15L3NyYy9wYXRoOyAuL2dlbi5zaCAtbyAkJHtQUk9EVUNUX09VVH0vZ2VuLmltZworYGBgCisKKyMjIyBBTkRST0lEX0JVSUxEX1RPUCAgeyNBTkRST0lEX0JVSUxEX1RPUH0KKworSW4gQW5kcm9pZC5tayBmaWxlcywgeW91IGNhbiBhbHdheXMgYXNzdW1lIHRoYXQgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGlzIHRoZQorcm9vdCBvZiB0aGUgc291cmNlIHRyZWUsIHNvIHRoaXMgY2FuIGp1c3QgYmUgcmVwbGFjZWQgd2l0aCAnLicgKHdoaWNoIGlzIHdoYXQKKyRUT1AgaXMgaGFyZGNvZGVkIHRvKSwgb3IgcmVtb3ZlZCBlbnRpcmVseS4gSWYgeW91IG5lZWQgYW4gYWJzb2x1dGUgcGF0aCwgc2VlCit0aGUgaW5zdHJ1Y3Rpb25zIGFib3ZlLgorCisjIyMgU3RvcCB1c2luZyBQQVRIIGRpcmVjdGx5ICB7I1BBVEh9CisKK1RoaXMgaXNuJ3Qgb25seSBzZXQgYnkgZW52c2V0dXAuc2gsIGJ1dCBpdCBpcyBtb2RpZmllZCBieSBpdC4gRHVlIHRvIHRoYXQgaXQncworcmF0aGVyIGVhc3kgZm9yIHRoaXMgdG8gY2hhbmdlIGJldHdlZW4gZGlmZmVyZW50IHNoZWxscywgYW5kIGl0J3Mgbm90IGlkZWFsIHRvCityZXJlYWQgdGhlIG1ha2VmaWxlcyBldmVyeSB0aW1lIHRoaXMgY2hhbmdlcy4KKworSW4gbW9zdCBjYXNlcywgeW91IHNob3VsZG4ndCBuZWVkIHRvIHRvdWNoIFBBVEggYXQgYWxsLiBXaGVuIHlvdSBuZWVkIHRvIGhhdmUgYQorcnVsZSByZWZlcmVuY2UgYSBwYXJ0aWN1bGFyIGJpbmFyeSB0aGF0J3MgcGFydCBvZiB0aGUgc291cmNlIHRyZWUgb3Igb3V0cHV0cywKK2l0J3MgcHJlZmVycmFibGUgdG8ganVzdCB1c2UgdGhlIHBhdGggdG8gdGhlIGZpbGUgaXRzZWxmIChzaW5jZSB5b3Ugc2hvdWxkCithbHJlYWR5IGJlIGFkZGluZyB0aGF0IGFzIGEgZGVwZW5kZW5jeSkuCisKK0RlcGVuZGluZyBvbiB0aGUgcnVsZSwgcGFzc2luZyB0aGUgZmlsZSBwYXRoIGl0c2VsZiBtYXkgbm90IGJlIGZlYXNpYmxlIGR1ZSB0bworbGF5ZXJzIG9mIHVuY2hhbmdhYmxlIHNjcmlwdHMvYmluYXJpZXMuIEluIHRoYXQgY2FzZSwgYmUgc3VyZSB0byBhZGQgdGhlCitkZXBlbmRlbmN5LCBidXQgbW9kaWZ5IHRoZSBQQVRIIHdpdGhpbiB0aGUgcnVsZSBpdHNlbGY6CisKK2BgYCBtYWtlCiskKFRBUkdFVCk6IG15c2NyaXB0IG15L3BhdGgvYmluYXJ5CisJUEFUSD1teS9wYXRoOiQkUEFUSCBteXNjcmlwdCAtbyAkQAorYGBgCisKKyMjIyBTdG9wIHVzaW5nIFBZVEhPTlBBVEggZGlyZWN0bHkgIHsjUFlUSE9OUEFUSH0KKworTGlrZSBQQVRILCB0aGlzIGlzbid0IG9ubHkgc2V0IGJ5IGVudnNldHVwLnNoLCBidXQgaXQgaXMgbW9kaWZpZWQgYnkgaXQuIER1ZSB0bwordGhhdCBpdCdzIHJhdGhlciBlYXN5IGZvciB0aGlzIHRvIGNoYW5nZSBiZXR3ZWVuIGRpZmZlcmVudCBzaGVsbHMsIGFuZCBpdCdzIG5vdAoraWRlYWwgdG8gcmVyZWFkIHRoZSBtYWtlZmlsZXMgZXZlcnkgdGltZS4KKworVGhlIGJlc3Qgc29sdXRpb24gaGVyZSBpcyB0byBzdGFydCBzd2l0Y2hpbmcgdG8gU29vbmcncyBweXRob24gYnVpbGRpbmcgc3VwcG9ydCwKK3doaWNoIHBhY2thZ2VzIHRoZSBweXRob24gaW50ZXJwcmV0ZXIsIGxpYnJhcmllcywgYW5kIHNjcmlwdCBhbGwgaW50byBvbmUgZmlsZQordGhhdCBubyBsb25nZXIgbmVlZHMgUFlUSE9OUEFUSC4gU2VlIGZvbnRjaGFpbl9saW50IGZvciBleGFtcGxlcyBvZiB0aGlzOgorCisqIFtleHRlcm5hbC9mb250dG9vbHMvTGliL2ZvbnRUb29scy9BbmRyb2lkLmJwXSBmb3IgcHl0aG9uX2xpYnJhcnlfaG9zdAorKiBbZnJhbWV3b3Jrcy9iYXNlL0FuZHJvaWQuYnBdIGZvciBweXRob25fYmluYXJ5X2hvc3QKKyogW2ZyYW1ld29ya3MvYmFzZS9kYXRhL2ZvbnRzL0FuZHJvaWQubWtdIHRvIGV4ZWN1dGUgdGhlIHB5dGhvbiBiaW5hcnkKKworSWYgeW91IHN0aWxsIG5lZWQgdG8gdXNlIFBZVEhPTlBBVEgsIGRvIHNvIHdpdGhpbiB0aGUgcnVsZSBpdHNlbGYsIGp1c3QgbGlrZQorcGF0aDoKKworYGBgIG1ha2UKKyQoVEFSR0VUKTogbXlzY3JpcHQucHkgJChzb3J0ICQoc2hlbGwgZmluZCBteS9weXRob24vbGliIC1uYW1lICcqLnB5JykpCisJUFlUSE9OUEFUSD1teS9weXRob24vbGliOiQkUFlUSE9OUEFUSCBteXNjcmlwdC5weSAtbyAkQAorYGBgCisjIyMgU3RvcCB1c2luZyBQUk9EVUNUX0NPTVBBVElCSUxJVFlfTUFUUklYX0xFVkVMX09WRVJSSURFIGRpcmVjdGx5IHsjUFJPRFVDVF9DT01QQVRJQklMSVRZX01BVFJJWF9MRVZFTF9PVkVSUklERX0KKworU3BlY2lmeSBGcmFtZXdvcmsgQ29tcGF0aWJpbGl0eSBNYXRyaXggVmVyc2lvbiBpbiBkZXZpY2UgbWFuaWZlc3QgYnkgYWRkaW5nIGEgYHRhcmdldC1sZXZlbGAKK2F0dHJpYnV0ZSB0byB0aGUgcm9vdCBlbGVtZW50IGA8bWFuaWZlc3Q+YC4gSWYgYFBST0RVQ1RfQ09NUEFUSUJJTElUWV9NQVRSSVhfTEVWRUxfT1ZFUlJJREVgCitpcyAyNiBvciAyNywgeW91IGNhbiBhZGQgYCJ0YXJnZXQtbGV2ZWwiPSIxImAgdG8geW91ciBkZXZpY2UgbWFuaWZlc3QgaW5zdGVhZC4KKworIyMjIFN0b3AgdXNpbmcgVVNFX0NMQU5HX1BMQVRGT1JNX0JVSUxEIHsjVVNFX0NMQU5HX1BMQVRGT1JNX0JVSUxEfQorCitDbGFuZyBpcyB0aGUgZGVmYXVsdCBhbmQgb25seSBzdXBwb3J0ZWQgQW5kcm9pZCBjb21waWxlciwgc28gdGhlcmUgaXMgbm8gcmVhc29uCitmb3IgdGhpcyBvcHRpb24gdG8gZXhpc3QuCisKKyMjIyBPdGhlciBlbnZzZXR1cC5zaCB2YXJpYWJsZXMgIHsjb3RoZXJfZW52c2V0dXBfdmFyaWFibGVzfQorCisqIEFORFJPSURfVE9PTENIQUlOCisqIEFORFJPSURfVE9PTENIQUlOXzJORF9BUkNICisqIEFORFJPSURfREVWX1NDUklQVFMKKyogQU5EUk9JRF9FTVVMQVRPUl9QUkVCVUlMVFMKKyogQU5EUk9JRF9QUkVfQlVJTERfUEFUSFMKKworVGhlc2UgYXJlIGFsbCBleHBvcnRlZCBmcm9tIGVudnNldHVwLnNoLCBidXQgZG9uJ3QgaGF2ZSBjbGVhciBlcXVpdmFsZW50cyB3aXRoaW4KK3RoZSBtYWtlZmlsZSBzeXN0ZW0uIElmIHlvdSBuZWVkIG9uZSBvZiB0aGVtLCB5b3UnbGwgaGF2ZSB0byBzZXQgdXAgeW91ciBvd24KK3ZlcnNpb24uCisKKworW2J1aWxkL3Nvb25nL0NoYW5nZXMubWRdOiBodHRwczovL2FuZHJvaWQuZ29vZ2xlc291cmNlLmNvbS9wbGF0Zm9ybS9idWlsZC9zb29uZy8rL21hc3Rlci9DaGFuZ2VzLm1kCitbZXh0ZXJuYWwvZm9udHRvb2xzL0xpYi9mb250VG9vbHMvQW5kcm9pZC5icF06IGh0dHBzOi8vYW5kcm9pZC5nb29nbGVzb3VyY2UuY29tL3BsYXRmb3JtL2V4dGVybmFsL2ZvbnR0b29scy8rL21hc3Rlci9MaWIvZm9udFRvb2xzL0FuZHJvaWQuYnAKK1tmcmFtZXdvcmtzL2Jhc2UvQW5kcm9pZC5icF06IGh0dHBzOi8vYW5kcm9pZC5nb29nbGVzb3VyY2UuY29tL3BsYXRmb3JtL2ZyYW1ld29ya3MvYmFzZS8rL21hc3Rlci9BbmRyb2lkLmJwCitbZnJhbWV3b3Jrcy9iYXNlL2RhdGEvZm9udHMvQW5kcm9pZC5ta106IGh0dHBzOi8vYW5kcm9pZC5nb29nbGVzb3VyY2UuY29tL3BsYXRmb3JtL2ZyYW1ld29ya3MvYmFzZS8rL21hc3Rlci9kYXRhL2ZvbnRzL0FuZHJvaWQubWsKZGlmZiAtLWdpdCBhL0NsZWFuU3BlYy5tayBiL0NsZWFuU3BlYy5tawppbmRleCBmZmY2MjJmLi43Njc3MjYxIDEwMDY0NAotLS0gYS9DbGVhblNwZWMubWsKKysrIGIvQ2xlYW5TcGVjLm1rCkBAIC00MjQsMTAgKzQyNCw3MCBAQAogJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChQUk9EVUNUX09VVCkvc3lzdGVtL3ZlbmRvci9uYXRpdmV0ZXN0KikKICQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoUFJPRFVDVF9PVVQpL3ZlbmRvci9uYXRpdmV0ZXN0KikKIAorIyBKYWNrIGlzIG5vIGxvbmdlciB0aGUgZGVmYXVsdCBjb21waWxlciwgcmVtb3ZlIHRoZSBpbnRlcm1lZGlhdGVzCiskKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKE9VVF9ESVIpL3RhcmdldC9jb21tb24vb2JqLyovKi9jbGFzc2VzKi5qYWNrKQorJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChPVVRfRElSKS90YXJnZXQvY29tbW9uL29iai8qLyovamFjayopCisKICMgTW92ZSBhZGJkIGZyb20gJChQUk9EVUNUX09VVCkvcm9vdC9zYmluIHRvICQoUFJPRFVDVF9PVVQpL3N5c3RlbS9iaW4KICQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoUFJPRFVDVF9PVVQpL3Jvb3Qvc2Jpbi9hZGJkKQogJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChQUk9EVUNUX09VVCkvc3ltYm9scy9zYmluL2FkYmQpCiAKKyMgU29vbmcgbGludXggLT4gbGludXhfZ2xpYmMgcmVuYW1lCiskKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIGZpbmQgJChTT09OR19PVVRfRElSKS8uaW50ZXJtZWRpYXRlcyAtbmFtZSAnbGludXhfeDg2KicgfCB4YXJncyBybSAtcmYpCiskKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIGZpbmQgJChTT09OR19PVVRfRElSKS8uaW50ZXJtZWRpYXRlcyAtbmFtZSAnbGludXhfY29tbW9uKicgfCB4YXJncyBybSAtcmYpCisKKyMgUmVtb3ZlIG9sZCBhaWRsL2xvZ3RhZ3MgZmlsZXMgdGhhdCBtYXkgYmUgaW4gdGhlIGdlbmVyYXRlZCBzb3VyY2UgZGlyZWN0b3J5CiskKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKE9VVF9ESVIpL3RhcmdldC9jb21tb24vb2JqLyovKl9pbnRlcm1lZGlhdGVzL3NyYykKKyQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLWYgJChPVVRfRElSKS90YXJnZXQvY29tbW9uL29iai8qLypfaW50ZXJtZWRpYXRlcy9qYXZhLXNvdXJjZS1saXN0KQorJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChPVVRfRElSKS9ob3N0L2NvbW1vbi9vYmovKi8qX2ludGVybWVkaWF0ZXMvc3JjKQorJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtZiAkKE9VVF9ESVIpL2hvc3QvY29tbW9uL29iai8qLypfaW50ZXJtZWRpYXRlcy9qYXZhLXNvdXJjZS1saXN0KQorCiskKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKFBST0RVQ1RfT1VUKS9vYmovQVBQUy8qL2ZsYXQtcmVzKQorCisjIFJlbW92ZSBvbGQgVk5ESyBkaXJlY3RvcmllcyB3aXRob3V0IHZlcnNpb24KKyQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoUFJPRFVDVF9PVVQpL3N5c3RlbS9saWIvdm5kaykKKyQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoUFJPRFVDVF9PVVQpL3N5c3RlbS9saWIvdm5kay1zcCkKKyQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoUFJPRFVDVF9PVVQpL3N5c3RlbS9saWI2NC92bmRrKQorJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChQUk9EVUNUX09VVCkvc3lzdGVtL2xpYjY0L3ZuZGstc3ApCisKKyMgUmVtb3ZlIG9sZCBkZXggb3V0cHV0IGRpcmVjdG9yaWVzCiskKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKFRBUkdFVF9PVVRfQ09NTU9OX0lOVEVSTUVESUFURVMpLyovKl9pbnRlcm1lZGlhdGVzL3dpdGgtbG9jYWwvKQorJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChUQVJHRVRfT1VUX0NPTU1PTl9JTlRFUk1FRElBVEVTKS8qLypfaW50ZXJtZWRpYXRlcy9uby1sb2NhbC8pCiskKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKEhPU1RfT1VUX0NPTU1PTl9JTlRFUk1FRElBVEVTKS8qLypfaW50ZXJtZWRpYXRlcy93aXRoLWxvY2FsLykKKyQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoSE9TVF9PVVRfQ09NTU9OX0lOVEVSTUVESUFURVMpLyovKl9pbnRlcm1lZGlhdGVzL25vLWxvY2FsLykKKworIyBSZW1vdmUgbGVnYWN5IFZJTlRGIG1ldGFkYXRhIGZpbGVzCiskKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKFBST0RVQ1RfT1VUKS9zeXN0ZW0vbWFuaWZlc3QueG1sKQorJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChQUk9EVUNUX09VVCkvc3lzdGVtL3ZlbmRvci9tYW5pZmVzdC54bWwpCiskKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKFBST0RVQ1RfT1VUKS92ZW5kb3IvbWFuaWZlc3QueG1sKQorJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChQUk9EVUNUX09VVCkvc3lzdGVtL3ZlbmRvci9jb21wYXRpYmlsaXR5X21hdHJpeC54bWwpCiskKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKFBST0RVQ1RfT1VUKS92ZW5kb3IvY29tcGF0aWJpbGl0eV9tYXRyaXgueG1sKQorCisjIFJlbW92ZSBEaXNwbGF5Q3V0b3V0RW11bGF0aW9uIG92ZXJsYXlzCiskKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKFBST0RVQ1RfT1VUKS92ZW5kb3Ivb3ZlcmxheS9EaXNwbGF5Q3V0b3V0RW11bGF0aW9uV2lkZSkKKyQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoUFJPRFVDVF9PVVQpL3ZlbmRvci9vdmVybGF5L0Rpc3BsYXlDdXRvdXRFbXVsYXRpb25OYXJyb3cpCisKKyMgUmVtb3ZlIG9ic29sZXRlIGludGVybWVkYXRlcyBzcmMgZmlsZXMKKyQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoVEFSR0VUX09VVF9DT01NT05fSU5URVJNRURJQVRFUykvKi8qX2ludGVybWVkaWF0ZXMvc3JjL1JlbmRlclNjcmlwdC5zdGFtcCopCiskKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKFRBUkdFVF9PVVRfQ09NTU9OX0lOVEVSTUVESUFURVMpL0FQUFMvKl9pbnRlcm1lZGlhdGVzL3NyYykKKyQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoVEFSR0VUX09VVF9DT01NT05fSU5URVJNRURJQVRFUykvSkFWQV9MSUJSQVJJRVMvKl9pbnRlcm1lZGlhdGVzL3NyYykKKyQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoVEFSR0VUX09VVF9DT01NT05fSU5URVJNRURJQVRFUykvQVBQUy8qX2ludGVybWVkaWF0ZXMvamF2YS1zb3VyY2UtbGlzdCkKKyQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoVEFSR0VUX09VVF9DT01NT05fSU5URVJNRURJQVRFUykvSkFWQV9MSUJSQVJJRVMvKl9pbnRlcm1lZGlhdGVzL2phdmEtc291cmNlLWxpc3QpCiskKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKE9VVF9ET0NTKS8qLXRpbWVzdGFtcCkKKworJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChUQVJHRVRfQ09NTU9OX09VVF9ST09UKS9vYmpfYXNhbi9BUFBTLypfaW50ZXJtZWRpYXRlcy9zcmMpCiskKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKFRBUkdFVF9DT01NT05fT1VUX1JPT1QpL29ial9hc2FuL0pBVkFfTElCUkFSSUVTLypfaW50ZXJtZWRpYXRlcy9zcmMpCiskKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKFRBUkdFVF9DT01NT05fT1VUX1JPT1QpL29ial9hc2FuL0FQUFMvKl9pbnRlcm1lZGlhdGVzL2phdmEtc291cmNlLWxpc3QpCiskKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKFRBUkdFVF9DT01NT05fT1VUX1JPT1QpL29ial9hc2FuL0pBVkFfTElCUkFSSUVTLypfaW50ZXJtZWRpYXRlcy9qYXZhLXNvdXJjZS1saXN0KQorCisjIFJlbW92ZSBzdGFsZSBpbml0Lm5vZW5mb3JjZS5yYworJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChQUk9EVUNUX09VVCkvc3lzdGVtL2V0Yy9pbml0L2dzaS9pbml0Lm5vZW5mb3JjZS5yYykKKworIyBDbGVhbiB1cCBMYXVuY2hlcjMgd2hpY2ggaGFzIGJlZW4gcmVwbGFjZWQgd2l0aCBMYXVuY2hlcjNRdWlja1N0ZXAKKyQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoUFJPRFVDVF9PVVQpL3N5c3RlbS9hcHAvTGF1bmNoZXIzKQorJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChQUk9EVUNUX09VVCkvc3lzdGVtL3ByaXYtYXBwL0xhdW5jaGVyMykKKyQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoT1VUX0RJUikvdGFyZ2V0L2NvbW1vbi9vYmovQVBQUy9MYXVuY2hlcjNfaW50ZXJtZWRpYXRlcykKKwogIyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICMgTkVXRVIgQ0xFQU4gU1RFUFMgTVVTVCBCRSBBVCBUSEUgRU5EIE9GIFRIRSBMSVNUCiAjICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpkaWZmIC0tZ2l0IGEvT1dORVJTIGIvT1dORVJTCmluZGV4IDdjYTA5NDUuLmM2MzBmZTEgMTAwNjQ0Ci0tLSBhL09XTkVSUworKysgYi9PV05FUlMKQEAgLTEsNSArMSwxMCBAQAogY2Nyb3NzQGFuZHJvaWQuY29tCiBkd2lsbGVtc2VuQGdvb2dsZS5jb20KK25hbnpoYW5nQGdvb2dsZS5jb20KKworcGVyLWZpbGUgKiA9IGNjcm9zc0BhbmRyb2lkLmNvbQorcGVyLWZpbGUgKiA9IGR3aWxsZW1zZW5AZ29vZ2xlLmNvbQorcGVyLWZpbGUgKiA9IG5hbnpoYW5nQGdvb2dsZS5jb20KIAogIyBmb3IgdmVyc2lvbiB1cGRhdGVzCiBwZXItZmlsZSB2ZXJzaW9uX2RlZmF1bHRzLm1rID0gYXNlYXRvbkBnb29nbGUuY29tCmRpZmYgLS1naXQgYS9SRUFETUUubWQgYi9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDc4MDlhOQotLS0gL2Rldi9udWxsCisrKyBiL1JFQURNRS5tZApAQCAtMCwwICsxLDIzIEBACisjIEFuZHJvaWQgTWFrZSBCdWlsZCBTeXN0ZW0KKworVGhpcyBpcyB0aGUgTWFrZWZpbGUtYmFzZWQgcG9ydGlvbiBvZiB0aGUgQW5kcm9pZCBCdWlsZCBTeXN0ZW0uCisKK0ZvciBkb2N1bWVudGF0aW9uIG9uIGhvdyB0byBydW4gYSBidWlsZCwgc2VlIFtVc2FnZS50eHRdKFVzYWdlLnR4dCkKKworRm9yIGEgbGlzdCBvZiBiZWhhdmlvcmFsIGNoYW5nZXMgdXNlZnVsIGZvciBBbmRyb2lkLm1rIHdyaXRlcnMgc2VlCitbQ2hhbmdlcy5tZF0oQ2hhbmdlcy5tZCkKKworRm9yIGFuIG91dGRhdGVkIHJlZmVyZW5jZSBvbiBBbmRyb2lkLm1rIGZpbGVzLCBzZWUKK1tidWlsZC1zeXN0ZW0uaHRtbF0oL2NvcmUvYnVpbGQtc3lzdGVtLmh0bWwpLiBPdXIgQW5kcm9pZC5tayBmaWxlcyBsb29rIHNpbWlsYXIsCitidXQgYXJlIGVudGlyZWx5IGRpZmZlcmVudCBmcm9tIHRoZSBBbmRyb2lkLm1rIGZpbGVzIHVzZWQgYnkgdGhlIE5ESyBidWlsZAorc3lzdGVtLiBXaGVuIHNlYXJjaGluZyBmb3IgZG9jdW1lbnRhdGlvbiBlbHNld2hlcmUsIGVuc3VyZSB0aGF0IGl0IGlzIGZvciB0aGUKK3BsYXRmb3JtIGJ1aWxkIHN5c3RlbSAtLSBtb3N0IGFyZSBub3QuCisKK1RoaXMgTWFrZWZpbGUtYmFzZWQgc3lzdGVtIGlzIGluIHRoZSBwcm9jZXNzIG9mIGJlaW5nIHJlcGxhY2VkIHdpdGggW1Nvb25nXSwgYQorbmV3IGJ1aWxkIHN5c3RlbSB3cml0dGVuIGluIEdvLiBEdXJpbmcgdGhlIHRyYW5zaXRpb24sIGFsbCBvZiB0aGVzZSBtYWtlZmlsZXMKK2FyZSByZWFkIGJ5IFtLYXRpXSwgYW5kIGdlbmVyYXRlIGEgbmluamEgZmlsZSBpbnN0ZWFkIG9mIGJlaW5nIGV4ZWN1dGVkCitkaXJlY3RseS4gVGhhdCdzIGNvbWJpbmVkIHdpdGggYSBuaW5qYSBmaWxlIHJlYWQgYnkgU29vbmcgc28gdGhhdCB0aGUgYnVpbGQKK2dyYXBoIG9mIHRoZSB0d28gc3lzdGVtcyBjYW4gYmUgY29tYmluZWQgYW5kIHJ1biBhcyBvbmUuCisKK1tLYXRpXTogaHR0cHM6Ly9naXRodWIuY29tL2dvb2dsZS9rYXRpCitbU29vbmddOiBodHRwczovL2FuZHJvaWQuZ29vZ2xlc291cmNlLmNvbS9wbGF0Zm9ybS9idWlsZC9zb29uZy8rL21hc3RlcgpkaWZmIC0tZ2l0IGEvVXNhZ2UudHh0IGIvVXNhZ2UudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwNDIxMGIKLS0tIC9kZXYvbnVsbAorKysgYi9Vc2FnZS50eHQKQEAgLTAsMCArMSw4NSBAQAorQW5kcm9pZCBidWlsZCBzeXN0ZW0gdXNhZ2U6CisKK20gWy1qXSBbPHRhcmdldHM+XSBbPHZhcmlhYmxlPj08dmFsdWU+Li4uXQorCisKK1dheXMgdG8gc3BlY2lmeSB3aGF0IHRvIGJ1aWxkOgorICBUaGUgY29tbW9uIHdheSB0byBzcGVjaWZ5IHdoYXQgdG8gYnVpbGQgaXMgdG8gc2V0IHRoYXQgaW5mb3JtYXRpb24gaW4gdGhlCisgIGVudmlyb25tZW50IHZpYToKKworICAgICMgU2V0IHVwIHRoZSBzaGVsbCBlbnZpcm9ubWVudC4KKyAgICBzb3VyY2UgYnVpbGQvZW52c2V0dXAuc2ggIyBSdW4gImhtbSIgYWZ0ZXIgc291cmNpbmcgZm9yIG1vcmUgaW5mbworICAgICMgU2VsZWN0IHRoZSBkZXZpY2UgYW5kIHZhcmlhbnQgdG8gdGFyZ2V0LiBJZiBubyBhcmd1bWVudCBpcyBnaXZlbiwgaXQKKyAgICAjIHdpbGwgbGlzdCBjaG9pY2VzIGFuZCBwcm9tcHQuCisgICAgbHVuY2ggWzxwcm9kdWN0Pi08dmFyaWFudD5dICMgU2VsZWN0cyB0aGUgZGV2aWNlIGFuZCB2YXJpYW50IHRvIHRhcmdldC4KKyAgICAjIEludm9rZSB0aGUgY29uZmlndXJlZCBidWlsZC4KKyAgICBtIFs8b3B0aW9ucz5dIFs8dGFyZ2V0cz5dIFs8dmFyaWFibGU+PTx2YWx1ZT4uLi5dCisKKyAgICAgIDxwcm9kdWN0PiBpcyB0aGUgZGV2aWNlIHRoYXQgdGhlIGNyZWF0ZWQgaW1hZ2UgaXMgaW50ZW5kZWQgdG8gYmUgcnVuIG9uLgorICAgICAgICBUaGlzIGlzIHNhdmVkIGluIHRoZSBzaGVsbCBlbnZpcm9ubWVudCBhcyAkVEFSR0VUX1BST0RVQ1QgYnkgYGx1bmNoYC4KKyAgICAgIDx2YXJpYW50PiBpcyBvbmUgb2YgInVzZXIiLCAidXNlcmRlYnVnIiwgb3IgImVuZyIsIGFuZCBjb250cm9scyB0aGUKKyAgICAgICAgYW1vdW50IG9mIGRlYnVnZ2luZyB0byBiZSBhZGRlZCBpbnRvIHRoZSBnZW5lcmF0ZWQgaW1hZ2UuCisgICAgICAgIFRoaXMgZ2V0cyBzYXZlZCBpbiB0aGUgc2hlbGwgZW52aXJvbm1lbnQgYXMgJFRBUkdFVF9CVUlMRF9WQVJJQU5UIGJ5CisgICAgICAgICAgYGx1bmNoYC4KKworICAgIEVhY2ggb2YgPG9wdGlvbnM+LCA8dGFyZ2V0cz4sIGFuZCA8dmFyaWFibGU+PTx2YWx1ZT4gaXMgb3B0aW9uYWwuCisgICAgICBJZiBubyB0YXJnZXRzIGFyZSBzcGVjaWZpZWQsIHRoZSBidWlsZCBzeXN0ZW0gd2lsbCBidWlsZCB0aGUgaW1hZ2VzCisgICAgICBmb3IgdGhlIGNvbmZpZ3VyZWQgcHJvZHVjdCBhbmQgdmFyaWFudC4KKworICBBbiBhbHRlcm5hdGl2ZSB0byBzZXR0aW5nICRUQVJHRVRfUFJPRFVDVCBhbmQgJFRBUkdFVF9CVUlMRF9WQVJJQU5ULAorICB3aGljaCB5b3UgbWF5IHNlZSBpbiBidWlsZCBzZXJ2ZXJzLCBpcyB0byBleGVjdXRlOgorCisgICAgbWFrZSBQUk9EVUNULTxwcm9kdWN0Pi08dmFyaWFudD4KKworCisgIEEgdGFyZ2V0IG1heSBiZSBhIGZpbGUgcGF0aC4gRm9yIGV4YW1wbGUsIG91dC9ob3N0L2xpbnV4LXg4Ni9iaW4vYWRiIC4KKyAgICBOb3RlIHRoYXQgd2hlbiBnaXZpbmcgYSByZWxhdGl2ZSBmaWxlIHBhdGggYXMgYSB0YXJnZXQsIHRoYXQgcGF0aCBpcworICAgIGludGVycHJldGVkIHJlbGF0aXZlIHRvIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZSAocmF0aGVyIHRoYW4gcmVsYXRpdmUKKyAgICB0byB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSkuCisKKyAgQSB0YXJnZXQgbWF5IGFsc28gYmUgYW55IG90aGVyIHRhcmdldCBkZWZpbmVkIHdpdGhpbiBhIE1ha2VmaWxlLiBSdW4KKyAgICBgbSBoZWxwYCB0byB2aWV3IHRoZSBuYW1lcyBvZiBzb21lIGNvbW1vbiB0YXJnZXRzLgorCisgIFRvIHZpZXcgdGhlIG1vZHVsZXMgYW5kIHRhcmdldHMgZGVmaW5lZCBpbiBhIHBhcnRpY3VsYXIgZGlyZWN0b3J5LCBsb29rIGZvcjoKKyAgICBmaWxlcyBuYW1lZCAqLm1rIChtb3N0IGNvbW1vbmx5IEFuZHJvaWQubWspCisgICAgICB0aGVzZSBmaWxlcyBhcmUgZGVmaW5lZCBpbiBNYWtlIHN5bnRheAorICAgIGZpbGVzIG5hbWVkIEFuZHJvaWQuYnAKKyAgICAgIHRoZXNlIGZpbGVzIGFyZSBkZWZpbmVkIGluIEJsdWVwcmludCBzeW50YXgKKworICBGb3Igbm93LCB0aGUgZnVsbCAoZXh0cmVtZWx5IGxhcmdlKSBjb21waWxlZCBsaXN0IG9mIHRhcmdldHMgY2FuIGJlIGZvdW5kCisgICAgKGFmdGVyIHJ1bm5pbmcgdGhlIGJ1aWxkIG9uY2UpLCBzcGxpdCBhbW9uZyB0aGVzZSB0d28gZmlsZXM6CisKKyAgICAke09VVH0vYnVpbGQtPHByb2R1Y3Q+Ki5uaW5qYQorICAgICR7T1VUfS9zb29uZy9idWlsZC5uaW5qYQorCisgICAgSWYgeW91IGZpbmQgeW91cnNlbGYgaW50ZXJhY3Rpbmcgd2l0aCB0aGVzZSBmaWxlcywgeW91IGFyZSBlbmNvdXJhZ2VkIHRvCisgICAgcHJvdmlkZSBhIG1vcmUgY29udmVuaWVudCB0b29sIGZvciBicm93c2luZyB0YXJnZXRzLCBhbmQgdG8gbWVudGlvbiB0aGUKKyAgICB0b29sIGhlcmUuCisKK1RhcmdldHMgdGhhdCBhZGp1c3QgYW4gZXhpc3RpbmcgYnVpbGQ6CisgIHNob3djb21tYW5kcyAgICAgICAgICAgICAgRGlzcGxheSB0aGUgaW5kaXZpZHVhbCBjb21tYW5kcyBydW4gdG8gaW1wbGVtZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGJ1aWxkCisgIGRpc3QgICAgICAgICAgICAgICAgICAgICAgQ29weSBpbnRvICR7RElTVF9ESVJ9IHRoZSBwb3J0aW9uIG9mIHRoZSBidWlsZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgbXVzdCBiZSBkaXN0cmlidXRlZAorCitGbGFncworICAtaiA8Tj4gICAgICAgICAgICAgICAgICAgIFJ1biA8Tj4gcHJvY2Vzc2VzIGF0IG9uY2UKKyAgLWogICAgICAgICAgICAgICAgICAgICAgICBBdXRvZGV0ZWN0IHRoZSBudW1iZXIgb2YgcHJvY2Vzc2VzIHRvIHJ1biBhdCBvbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBydW4gdGhhdCBtYW55CisKK1ZhcmlhYmxlcworICBWYXJpYWJsZXMgY2FuIGVpdGhlciBiZSBzZXQgaW4gdGhlIHN1cnJvdW5kaW5nIHNoZWxsIGVudmlyb25tZW50IG9yIGNhbiBiZQorICAgIHBhc3NlZCBhcyBjb21tYW5kLWxpbmUgYXJndW1lbnRzLiBGb3IgZXhhbXBsZToKKyAgICAgIGV4cG9ydCBJX0FNX0FfU0hFTExfVkFSPTEKKyAgICAgIElfQU1fQU5PVEhFUl9TSEVMTF9WQVI9MiBtYWtlIGRyb2lkIElfQU1fQV9NQUtFX1ZBUj0zCisgIEhlcmUgYXJlIHNvbWUgY29tbW9uIHZhcmlhYmxlcyBhbmQgdGhlaXIgbWVhbmluZ3M6CisgICAgVEFSR0VUX1BST0RVQ1QgICAgICAgICAgVGhlIDxwcm9kdWN0PiB0byBidWlsZCAjIGFzIGRlc2NyaWJlZCBhYm92ZQorICAgIFRBUkdFVF9CVUlMRF9WQVJJQU5UICAgIFRoZSA8dmFyaWFudD4gdG8gYnVpbGQgIyBhcyBkZXNjcmliZWQgYWJvdmUKKyAgICBESVNUX0RJUiAgICAgICAgICAgICAgICBUaGUgZGlyZWN0b3J5IGluIHdoaWNoIHRvIHBsYWNlIHRoZSBkaXN0cmlidXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnRpZmFjdHMuCisgICAgT1VUX0RJUiAgICAgICAgICAgICAgICAgVGhlIGRpcmVjdG9yeSBpbiB3aGljaCB0byBwbGFjZSBub24tZGlzdHJpYnV0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJ0aWZhY3RzLgorCisgIFRoZXJlIGlzIG5vdCB5ZXQga25vd24gYSBjb252ZW5pZW50IG1ldGhvZCBieSB3aGljaCB0byBkaXNjb3ZlciB0aGUgZnVsbAorICBsaXN0IG9mIHN1cHBvcnRlZCB2YXJpYWJsZXMuIFBsZWFzZSBtZW50aW9uIGl0IGhlcmUgd2hlbiB0aGVyZSBpcy4KKwpkaWZmIC0tZ2l0IGEvY29yZS9NYWtlZmlsZSBiL2NvcmUvTWFrZWZpbGUKaW5kZXggNjE4ZTk4My4uMGEyZjZlMyAxMDA2NDQKLS0tIGEvY29yZS9NYWtlZmlsZQorKysgYi9jb3JlL01ha2VmaWxlCkBAIC00LDE1ICs0LDYgQEAKICMgaW50ZXJtZWRpdGVzLWRpci1mb3IKIExPQ0FMX1BBVEggOj0gJChCVUlMRF9TWVNURU0pCiAKLSMgUGljayBhIHJlYXNvbmFibGUgc3RyaW5nIHRvIHVzZSB0byBpZGVudGlmeSBmaWxlcy4KLWlmbmVxICgsJChmaWx0ZXIgZW5nLiUsJChCVUlMRF9OVU1CRVIpKSkKLSAgIyBCVUlMRF9OVU1CRVIgaGFzIGEgdGltZXN0YW1wIGluIGl0LCB3aGljaCBtZWFucyB0aGF0Ci0gICMgaXQgd2lsbCBjaGFuZ2UgZXZlcnkgdGltZS4gIFBpY2sgYSBzdGFibGUgdmFsdWUuCi0gIEZJTEVfTkFNRV9UQUcgOj0gZW5nLiQoVVNFUikKLWVsc2UKLSAgRklMRV9OQU1FX1RBRyA6PSAkKEJVSUxEX05VTUJFUikKLWVuZGlmCi0KICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICMgRGVmaW5lIHJ1bGVzIHRvIGNvcHkgUFJPRFVDVF9DT1BZX0ZJTEVTIGRlZmluZWQgYnkgdGhlIHByb2R1Y3QuCiAjIFBST0RVQ1RfQ09QWV9GSUxFUyBjb250YWlucyB3b3JkcyBsaWtlIDxzb3VyY2UgZmlsZT46PGRlc3QgZmlsZT5bOjxvd25lcj5dLgpAQCAtMjEsOSArMTIsMTEgQEAKICMgVGhlIGZpbHRlciBwYXJ0IG1lYW5zICJvbmx5IGV2YWwgdGhlIGNvcHktb25lLWZpbGUgcnVsZSBpZiB0aGlzCiAjIHNyYzpkZXN0IHBhaXIgaXMgdGhlIGZpcnN0IG9uZSB0byBtYXRjaCB0aGUgc2FtZSBkZXN0IgogIyQoMSk6IHRoZSBzcmM6ZGVzdCBwYWlyCisjJCgyKTogdGhlIGRlc3QKIGRlZmluZSBjaGVjay1wcm9kdWN0LWNvcHktZmlsZXMKLSQoaWYgJChmaWx0ZXIgJS5hcGssICQoY2FsbCB3b3JkLWNvbG9uLCAyLCAkKDEpKSksJChlcnJvciBcCi0gICAgUHJlYnVpbHQgYXBrIGZvdW5kIGluIFBST0RVQ1RfQ09QWV9GSUxFUzogJCgxKSwgdXNlIEJVSUxEX1BSRUJVSUxUIGluc3RlYWQhKSkKKyQoaWYgJChmaWx0ZXItb3V0ICQoVEFSR0VUX0NPUFlfT1VUX1NZU1RFTV9PVEhFUikvJSwkKDIpKSwgXAorICAkKGlmICQoZmlsdGVyICUuYXBrLCAkKDIpKSwkKGVycm9yIFwKKyAgICAgUHJlYnVpbHQgYXBrIGZvdW5kIGluIFBST0RVQ1RfQ09QWV9GSUxFUzogJCgxKSwgdXNlIEJVSUxEX1BSRUJVSUxUIGluc3RlYWQhKSkpCiBlbmRlZgogIyBmaWx0ZXIgb3V0IHRoZSBkdXBsaWNhdGUgPHNvdXJjZSBmaWxlPjo8ZGVzdCBmaWxlPiBwYWlycy4KIHVuaXF1ZV9wcm9kdWN0X2NvcHlfZmlsZXNfcGFpcnMgOj0KQEAgLTMxLDIyICsyNCw0NiBAQAogICAgICQoaWYgJChmaWx0ZXIgJCh1bmlxdWVfcHJvZHVjdF9jb3B5X2ZpbGVzX3BhaXJzKSwkKGNmKSksLFwKICAgICAgICAgJChldmFsIHVuaXF1ZV9wcm9kdWN0X2NvcHlfZmlsZXNfcGFpcnMgKz0gJChjZikpKSkKIHVuaXF1ZV9wcm9kdWN0X2NvcHlfZmlsZXNfZGVzdGluYXRpb25zIDo9Citwcm9kdWN0X2NvcHlfZmlsZXNfaWdub3JlZCA6PQogJChmb3JlYWNoIGNmLCQodW5pcXVlX3Byb2R1Y3RfY29weV9maWxlc19wYWlycyksIFwKICAgICAkKGV2YWwgX3NyYyA6PSAkKGNhbGwgd29yZC1jb2xvbiwxLCQoY2YpKSkgXAogICAgICQoZXZhbCBfZGVzdCA6PSAkKGNhbGwgd29yZC1jb2xvbiwyLCQoY2YpKSkgXAotICAgICQoY2FsbCBjaGVjay1wcm9kdWN0LWNvcHktZmlsZXMsJChjZikpIFwKKyAgICAkKGNhbGwgY2hlY2stcHJvZHVjdC1jb3B5LWZpbGVzLCQoY2YpLCQoX2Rlc3QpKSBcCiAgICAgJChpZiAkKGZpbHRlciAkKHVuaXF1ZV9wcm9kdWN0X2NvcHlfZmlsZXNfZGVzdGluYXRpb25zKSwkKF9kZXN0KSksIFwKLSAgICAgICAgJChpbmZvIFBST0RVQ1RfQ09QWV9GSUxFUyAkKGNmKSBpZ25vcmVkLiksIFwKKyAgICAgICAgJChldmFsIHByb2R1Y3RfY29weV9maWxlc19pZ25vcmVkICs9ICQoY2YpKSwgXAogICAgICAgICAkKGV2YWwgX2Z1bGxkZXN0IDo9ICQoY2FsbCBhcHBlbmQtcGF0aCwkKFBST0RVQ1RfT1VUKSwkKF9kZXN0KSkpIFwKICAgICAgICAgJChpZiAkKGZpbHRlciAlLnhtbCwkKF9kZXN0KSksXAogICAgICAgICAgICAgJChldmFsICQoY2FsbCBjb3B5LXhtbC1maWxlLWNoZWNrZWQsJChfc3JjKSwkKF9mdWxsZGVzdCkpKSxcCi0gICAgICAgICAgICAkKGV2YWwgJChjYWxsIGNvcHktb25lLWZpbGUsJChfc3JjKSwkKF9mdWxsZGVzdCkpKSkgXAorICAgICAgICAgICAgJChpZiAkKGFuZCAkKGZpbHRlciAlLmphciwkKF9kZXN0KSksJChmaWx0ZXIgJChiYXNlbmFtZSAkKG5vdGRpciAkKF9kZXN0KSkpLCQoUFJPRFVDVF9MT0FERURfQllfUFJJVklMRUdFRF9NT0RVTEVTKSkpLFwKKyAgICAgICAgICAgICAgICAkKGV2YWwgJChjYWxsIGNvcHktYW5kLXVuY29tcHJlc3MtZGV4cywkKF9zcmMpLCQoX2Z1bGxkZXN0KSkpLCBcCisgICAgICAgICAgICAgICAgJChldmFsICQoY2FsbCBjb3B5LW9uZS1maWxlLCQoX3NyYyksJChfZnVsbGRlc3QpKSkpKSBcCiAgICAgICAgICQoZXZhbCBBTExfREVGQVVMVF9JTlNUQUxMRURfTU9EVUxFUyArPSAkKF9mdWxsZGVzdCkpIFwKICAgICAgICAgJChldmFsIHVuaXF1ZV9wcm9kdWN0X2NvcHlfZmlsZXNfZGVzdGluYXRpb25zICs9ICQoX2Rlc3QpKSkpCisKKyMgRHVtcCBhIGxpc3Qgb2Ygb3ZlcnJpZGVuIChhbmQgaWdub3JlZCBQUk9EVUNUX0NPUFlfRklMRVMgZW50cmllcykKKyQoZmlsZSA+JChQUk9EVUNUX09VVCkvcHJvZHVjdF9jb3B5X2ZpbGVzX2lnbm9yZWQudHh0LCQoc3Vic3QgJChzcGFjZSksJChuZXdsaW5lKSwkKHN0cmlwICQocHJvZHVjdF9jb3B5X2ZpbGVzX2lnbm9yZWQpKSkpCitpZmRlZiBkaXN0X2dvYWwKKyQoZmlsZSA+JChESVNUX0RJUikvbG9ncy9wcm9kdWN0X2NvcHlfZmlsZXNfaWdub3JlZC50eHQsJChzdWJzdCAkKHNwYWNlKSwkKG5ld2xpbmUpLCQoc3RyaXAgJChwcm9kdWN0X2NvcHlfZmlsZXNfaWdub3JlZCkpKSkKK2VuZGlmCisKK3Byb2R1Y3RfY29weV9maWxlc19pZ25vcmVkIDo9CiB1bmlxdWVfcHJvZHVjdF9jb3B5X2ZpbGVzX3BhaXJzIDo9CiB1bmlxdWVfcHJvZHVjdF9jb3B5X2ZpbGVzX2Rlc3RpbmF0aW9ucyA6PQogCiAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFJldHVybnMgdGhlIG1heCBhbGxvd2VkIHNpemUgZm9yIGFuIGltYWdlIHN1aXRhYmxlIGZvciBoYXNoIHZlcmlmaWNhdGlvbgorIyAoZS5nLiwgYm9vdC5pbWcsIHJlY292ZXJ5LmltZywgZXRjKS4KKyMgVGhlIHZhbHVlIDY5NjMyIGRlcml2ZXMgZnJvbSBNQVhfVkJNRVRBX1NJWkUgKyBNQVhfRk9PVEVSX1NJWkUgaW4gJChBVkJUT09MKS4KKyMgJCgxKTogcGFydGl0aW9uIHNpemUgdG8gZmxhc2ggdGhlIGltYWdlCitkZWZpbmUgZ2V0LWhhc2gtaW1hZ2UtbWF4LXNpemUKKyQoaWYgJCgxKSwgXAorICAkKGlmICQoZmlsdGVyIHRydWUsJChCT0FSRF9BVkJfRU5BQkxFKSksIFwKKyAgICAkKGV2YWwgX2hhc2hfbWV0YV9zaXplIDo9IDY5NjMyKSwgXAorICAgICQoZXZhbCBfaGFzaF9tZXRhX3NpemUgOj0gMCkpIFwKKyAgJCgxKS0kKF9oYXNoX21ldGFfc2l6ZSkpCitlbmRlZgorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAjIERlZmluZSBydWxlcyB0byBjb3B5IGhlYWRlcnMgZGVmaW5lZCBpbiBjb3B5X2hlYWRlcnMubWsKICMgSWYgbW9yZSB0aGFuIG9uZSBtYWtlZmlsZSBkZWNsYXJlZCBhIGhlYWRlciwgcHJpbnQgYSB3YXJuaW5nLAogIyB0aGVuIGNvcHkgdGhlIGxhc3Qgb25lIGRlZmluZWQuIFRoaXMgbWF0Y2hlcyB0aGUgcHJldmlvdXMgbWFrZQpAQCAtNzAsNiArODcsMjcgQEAKIAlAY3AgLWYgJDwgJEAKIGVuZGlmCiAKK25ka19kb3h5Z2VuX291dCA6PSAkKE9VVF9OREtfRE9DUykKK25ka19oZWFkZXJzIDo9ICQoU09PTkdfT1VUX0RJUikvbmRrL3N5c3Jvb3QvdXNyL2luY2x1ZGUKK25ka19kb2NzX3NyY19kaXIgOj0gZnJhbWV3b3Jrcy9uYXRpdmUvZG9jcworbmRrX2RveHlmaWxlIDo9ICQobmRrX2RvY3Nfc3JjX2RpcikvRG94eWZpbGUKK2lmbmVxICgkKHdpbGRjYXJkICQobmRrX2RvY3Nfc3JjX2RpcikpLCkKK25ka19kb2NzX3NyY3MgOj0gJChhZGRwcmVmaXggJChuZGtfZG9jc19zcmNfZGlyKS8sXAorICAgICQoY2FsbCBmaW5kLWZpbGVzLWluLXN1YmRpcnMsJChuZGtfZG9jc19zcmNfZGlyKSwiKiIsLikpCiskKG5ka19kb3h5Z2VuX291dCkvaW5kZXguaHRtbDogJChuZGtfZG9jc19zcmNzKSAkKFNPT05HX09VVF9ESVIpL25kay50aW1lc3RhbXAKKwlAbWtkaXIgLXAgJChuZGtfZG94eWdlbl9vdXQpCisJQGVjaG8gIkdlbmVyYXRpbmcgTkRLIGRvY3MgdG8gJChuZGtfZG94eWdlbl9vdXQpIgorCUAoIGNhdCAkKG5ka19kb3h5ZmlsZSk7IFwKKwkgICAgZWNobyAiSU5QVVQ9JChuZGtfaGVhZGVycykiOyBcCisJICAgIGVjaG8gIkhUTUxfT1VUUFVUPSQobmRrX2RveHlnZW5fb3V0KSIgXAorCSkgfCBkb3h5Z2VuIC0KKworIyBOb3RlOiBOb3QgYSBwYXJ0IG9mIHRoZSBkb2NzIHRhcmdldCBiZWNhdXNlIHdlIGRvbid0IGhhdmUgZG94eWdlbiBhdmFpbGFibGUuCisjIFlvdSBjYW4gcnVuIHRoaXMgdGFyZ2V0IGxvY2FsbHkgaWYgeW91IGhhdmUgZG94eWdlbiBpbnN0YWxsZWQuCituZGstZG9jczogJChuZGtfZG94eWdlbl9vdXQpL2luZGV4Lmh0bWwKKy5QSE9OWTogbmRrLWRvY3MKK2VuZGlmCisKICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICMgcHJvcGVydHlfb3ZlcnJpZGVzX3NwbGl0X2VuYWJsZWQKIHByb3BlcnR5X292ZXJyaWRlc19zcGxpdF9lbmFibGVkIDo9CkBAIC03OCw2ICsxMTYsMjggQEAKIGVuZGlmCiAKICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRklOQUxfVkVORE9SX0RFRkFVTFRfUFJPUEVSVElFUyB3aWxsIGJlIGluc3RhbGxlZCBpbiB2ZW5kb3IvZGVmYXVsdC5wcm9wIGlmCisjIHByb3BlcnR5X292ZXJyaWRlc19zcGxpdF9lbmFibGVkIGlzIHRydWUuIE90aGVyd2lzZSBpdCB3aWxsIGJlIGluc3RhbGxlZCBpbgorIyBST09UL2RlZmF1bHQucHJvcC4KK2lmZGVmIEJPQVJEX1ZOREtfVkVSU0lPTgorICBpZmVxICgkKEJPQVJEX1ZOREtfVkVSU0lPTiksY3VycmVudCkKKyAgICBGSU5BTF9WRU5ET1JfREVGQVVMVF9QUk9QRVJUSUVTIDo9IHJvLnZuZGsudmVyc2lvbj0kKFBMQVRGT1JNX1ZOREtfVkVSU0lPTikKKyAgZWxzZQorICAgIEZJTkFMX1ZFTkRPUl9ERUZBVUxUX1BST1BFUlRJRVMgOj0gcm8udm5kay52ZXJzaW9uPSQoQk9BUkRfVk5ES19WRVJTSU9OKQorICBlbmRpZgorICBpZmRlZiBCT0FSRF9WTkRLX1JVTlRJTUVfRElTQUJMRQorICAgIEZJTkFMX1ZFTkRPUl9ERUZBVUxUX1BST1BFUlRJRVMgKz0gcm8udm5kay5saXRlPXRydWUKKyAgZW5kaWYKK2Vsc2UKKyAgRklOQUxfVkVORE9SX0RFRkFVTFRfUFJPUEVSVElFUyA6PSByby52bmRrLnZlcnNpb249JChQTEFURk9STV9WTkRLX1ZFUlNJT04pCisgIEZJTkFMX1ZFTkRPUl9ERUZBVUxUX1BST1BFUlRJRVMgKz0gcm8udm5kay5saXRlPXRydWUKK2VuZGlmCitGSU5BTF9WRU5ET1JfREVGQVVMVF9QUk9QRVJUSUVTICs9IFwKKyAgICAkKGNhbGwgY29sbGFwc2UtcGFpcnMsICQoUFJPRFVDVF9ERUZBVUxUX1BST1BFUlRZX09WRVJSSURFUykpCitGSU5BTF9WRU5ET1JfREVGQVVMVF9QUk9QRVJUSUVTIDo9ICQoY2FsbCB1bmlxLXBhaXJzLWJ5LWZpcnN0LWNvbXBvbmVudCwgXAorICAgICQoRklOQUxfVkVORE9SX0RFRkFVTFRfUFJPUEVSVElFUyksPSkKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIyBwcm9wLmRlZmF1bHQKIGlmZGVmIHByb3BlcnR5X292ZXJyaWRlc19zcGxpdF9lbmFibGVkCiBJTlNUQUxMRURfREVGQVVMVF9QUk9QX1RBUkdFVCA6PSAkKFRBUkdFVF9PVVQpL2V0Yy9wcm9wLmRlZmF1bHQKQEAgLTkwLDEwICsxNTAsMTEgQEAKIGVuZGlmCiBBTExfREVGQVVMVF9JTlNUQUxMRURfTU9EVUxFUyArPSAkKElOU1RBTExFRF9ERUZBVUxUX1BST1BfVEFSR0VUKQogRklOQUxfREVGQVVMVF9QUk9QRVJUSUVTIDo9IFwKLSAgICAkKGNhbGwgY29sbGFwc2UtcGFpcnMsICQoQURESVRJT05BTF9ERUZBVUxUX1BST1BFUlRJRVMpKQorICAgICQoY2FsbCBjb2xsYXBzZS1wYWlycywgJChBRERJVElPTkFMX0RFRkFVTFRfUFJPUEVSVElFUykpIFwKKyAgICAkKGNhbGwgY29sbGFwc2UtcGFpcnMsICQoUFJPRFVDVF9TWVNURU1fREVGQVVMVF9QUk9QRVJUSUVTKSkKIGlmbmRlZiBwcm9wZXJ0eV9vdmVycmlkZXNfc3BsaXRfZW5hYmxlZAogICBGSU5BTF9ERUZBVUxUX1BST1BFUlRJRVMgKz0gXAotICAgICAgJChjYWxsIGNvbGxhcHNlLXBhaXJzLCAkKFBST0RVQ1RfREVGQVVMVF9QUk9QRVJUWV9PVkVSUklERVMpKQorICAgICAgJChjYWxsIGNvbGxhcHNlLXBhaXJzLCAkKEZJTkFMX1ZFTkRPUl9ERUZBVUxUX1BST1BFUlRJRVMpKQogZW5kaWYKIEZJTkFMX0RFRkFVTFRfUFJPUEVSVElFUyA6PSAkKGNhbGwgdW5pcS1wYWlycy1ieS1maXJzdC1jb21wb25lbnQsIFwKICAgICAkKEZJTkFMX0RFRkFVTFRfUFJPUEVSVElFUyksPSkKQEAgLTExNSw3ICsxNzYsNyBAQAogCSQoaGlkZSkgZWNobyByby5ib290aW1hZ2UuYnVpbGQuZGF0ZT1gJChEQVRFX0ZST01fRklMRSlgPj4kQAogCSQoaGlkZSkgZWNobyByby5ib290aW1hZ2UuYnVpbGQuZGF0ZS51dGM9YCQoREFURV9GUk9NX0ZJTEUpICslc2A+PiRACiAJJChoaWRlKSBlY2hvIHJvLmJvb3RpbWFnZS5idWlsZC5maW5nZXJwcmludD0iJChCVUlMRF9GSU5HRVJQUklOVF9GUk9NX0ZJTEUpIj4+JEAKLQkkKGhpZGUpIGJ1aWxkL3Rvb2xzL3Bvc3RfcHJvY2Vzc19wcm9wcy5weSAkQAorCSQoaGlkZSkgYnVpbGQvbWFrZS90b29scy9wb3N0X3Byb2Nlc3NfcHJvcHMucHkgJEAKIGlmZGVmIHByb3BlcnR5X292ZXJyaWRlc19zcGxpdF9lbmFibGVkCiAJJChoaWRlKSBta2RpciAtcCAkKFRBUkdFVF9ST09UX09VVCkKIAkkKGhpZGUpIGxuIC1zZiBzeXN0ZW0vZXRjL3Byb3AuZGVmYXVsdCAkKElOU1RBTExFRF9ERUZBVUxUX1BST1BfT0xEX1RBUkdFVCkKQEAgLTEyOCwxMSArMTg5LDYgQEAKIElOU1RBTExFRF9WRU5ET1JfREVGQVVMVF9QUk9QX1RBUkdFVCA6PSAkKFRBUkdFVF9PVVRfVkVORE9SKS9kZWZhdWx0LnByb3AKIEFMTF9ERUZBVUxUX0lOU1RBTExFRF9NT0RVTEVTICs9ICQoSU5TVEFMTEVEX1ZFTkRPUl9ERUZBVUxUX1BST1BfVEFSR0VUKQogCi1GSU5BTF9WRU5ET1JfREVGQVVMVF9QUk9QRVJUSUVTICs9IFwKLSAgICAkKGNhbGwgY29sbGFwc2UtcGFpcnMsICQoUFJPRFVDVF9ERUZBVUxUX1BST1BFUlRZX09WRVJSSURFUykpCi1GSU5BTF9WRU5ET1JfREVGQVVMVF9QUk9QRVJUSUVTIDo9ICQoY2FsbCB1bmlxLXBhaXJzLWJ5LWZpcnN0LWNvbXBvbmVudCwgXAotICAgICQoRklOQUxfVkVORE9SX0RFRkFVTFRfUFJPUEVSVElFUyksPSkKLQogJChJTlNUQUxMRURfVkVORE9SX0RFRkFVTFRfUFJPUF9UQVJHRVQpOiAkKElOU1RBTExFRF9ERUZBVUxUX1BST1BfVEFSR0VUKQogCUBlY2hvIFRhcmdldCBidWlsZGluZm86ICRACiAJQG1rZGlyIC1wICQoZGlyICRAKQpAQCAtMTQxLDcgKzE5Nyw3IEBACiAJICAgICAgICBlY2hvICIjIiA+PiAkQDsKIAkkKGhpZGUpICQoZm9yZWFjaCBsaW5lLCQoRklOQUxfVkVORE9SX0RFRkFVTFRfUFJPUEVSVElFUyksIFwKIAkJZWNobyAiJChsaW5lKSIgPj4gJEA7KQotCSQoaGlkZSkgYnVpbGQvdG9vbHMvcG9zdF9wcm9jZXNzX3Byb3BzLnB5ICRACisJJChoaWRlKSBidWlsZC9tYWtlL3Rvb2xzL3Bvc3RfcHJvY2Vzc19wcm9wcy5weSAkQAogCiBlbmRpZiAgIyBwcm9wZXJ0eV9vdmVycmlkZXNfc3BsaXRfZW5hYmxlZAogCkBAIC0xNzksMzAgKzIzNSwzNyBAQAogCiAjIFRoZSBzdHJpbmcgdXNlZCB0byB1bmlxdWVseSBpZGVudGlmeSB0aGUgY29tYmluZWQgYnVpbGQgYW5kIHByb2R1Y3Q7IHVzZWQgYnkgdGhlIE9UQSBzZXJ2ZXIuCiBpZmVxICgsJChzdHJpcCAkKEJVSUxEX0ZJTkdFUlBSSU5UKSkpCi0gIGlmbmVxICgkKGZpbHRlciBlbmcuJSwkKEJVSUxEX05VTUJFUikpLCkKLSAgICAjIFRyaW0gZG93biBCVUlMRF9GSU5HRVJQUklOVDogdGhlIGRlZmF1bHQgQlVJTERfTlVNQkVSIG1ha2VzIGl0IGVhc2lseSBleGNlZWQKLSAgICAjIHRoZSBBbmRyb2lkIHN5c3RlbSBwcm9wZXJ0eSBsZW5ndGggbGltaXQgKFBST1BFUlRZX1ZBTFVFX01BWD05MikuCi0gICAgQkZfQlVJTERfTlVNQkVSIDo9ICQoc2hlbGwgZWNobyAkJHtVU0VSOjA6Nn0pJChzaGVsbCAkKERBVEUpICslbSVkJUglTSkKKyAgaWZlcSAoJChzdHJpcCAkKEhBU19CVUlMRF9OVU1CRVIpKSxmYWxzZSkKKyAgICBCRl9CVUlMRF9OVU1CRVIgOj0gJChVU0VSKSQkKCQoREFURV9GUk9NX0ZJTEUpICslbSVkJUglTSkKICAgZWxzZQotICAgIEJGX0JVSUxEX05VTUJFUiA6PSAkKEJVSUxEX05VTUJFUikKKyAgICBCRl9CVUlMRF9OVU1CRVIgOj0gJChmaWxlIDwkKEJVSUxEX05VTUJFUl9GSUxFKSkKICAgZW5kaWYKICAgQlVJTERfRklOR0VSUFJJTlQgOj0gJChQUk9EVUNUX0JSQU5EKS8kKFRBUkdFVF9QUk9EVUNUKS8kKFRBUkdFVF9ERVZJQ0UpOiQoUExBVEZPUk1fVkVSU0lPTikvJChCVUlMRF9JRCkvJChCRl9CVUlMRF9OVU1CRVIpOiQoVEFSR0VUX0JVSUxEX1ZBUklBTlQpLyQoQlVJTERfVkVSU0lPTl9UQUdTKQogZW5kaWYKLWlmbmVxICgkKHdvcmRzICQoQlVJTERfRklOR0VSUFJJTlQpKSwxKQotICAkKGVycm9yIEJVSUxEX0ZJTkdFUlBSSU5UIGNhbm5vdCBjb250YWluIHNwYWNlczogIiQoQlVJTERfRklOR0VSUFJJTlQpIikKLWVuZGlmCisjIHVuc2V0IGl0IGZvciBzYWZldHkuCitCRl9CVUlMRF9OVU1CRVIgOj0KIAotJChzaGVsbCBta2RpciAtcCAkKFBST0RVQ1RfT1VUKSAmJiBlY2hvICQoQlVJTERfRklOR0VSUFJJTlQpID4gJChQUk9EVUNUX09VVCkvYnVpbGRfZmluZ2VycHJpbnQudHh0KQotQlVJTERfRklOR0VSUFJJTlRfRlJPTV9GSUxFIDo9ICQkKGNhdCAkKFBST0RVQ1RfT1VUKS9idWlsZF9maW5nZXJwcmludC50eHQpCitCVUlMRF9GSU5HRVJQUklOVF9GSUxFIDo9ICQoUFJPRFVDVF9PVVQpL2J1aWxkX2ZpbmdlcnByaW50LnR4dAoraWZuZXEgKCwkKHNoZWxsIG1rZGlyIC1wICQoUFJPRFVDVF9PVVQpICYmIGVjaG8gJChCVUlMRF9GSU5HRVJQUklOVCkgPiQoQlVJTERfRklOR0VSUFJJTlRfRklMRSkgJiYgZ3JlcCAiICIgJChCVUlMRF9GSU5HRVJQUklOVF9GSUxFKSkpCisgICQoZXJyb3IgQlVJTERfRklOR0VSUFJJTlQgY2Fubm90IGNvbnRhaW4gc3BhY2VzOiAiJChmaWxlIDwkKEJVSUxEX0ZJTkdFUlBSSU5UX0ZJTEUpKSIpCitlbmRpZgorQlVJTERfRklOR0VSUFJJTlRfRlJPTV9GSUxFIDo9ICQkKGNhdCAkKEJVSUxEX0ZJTkdFUlBSSU5UX0ZJTEUpKQorIyB1bnNldCBpdCBmb3Igc2FmZXR5LgorQlVJTERfRklOR0VSUFJJTlQgOj0KIAogIyBUaGUgc3RyaW5nIHVzZWQgdG8gdW5pcXVlbHkgaWRlbnRpZnkgdGhlIHN5c3RlbSBidWlsZDsgdXNlZCBieSB0aGUgT1RBIHNlcnZlci4KICMgVGhpcyBwdXJwb3NlZnVsbHkgZXhjbHVkZXMgYW55IHByb2R1Y3Qtc3BlY2lmaWMgdmFyaWFibGVzLgogaWZlcSAoLCQoc3RyaXAgJChCVUlMRF9USFVNQlBSSU5UKSkpCi0gIEJVSUxEX1RIVU1CUFJJTlQgOj0gJChQTEFURk9STV9WRVJTSU9OKS8kKEJVSUxEX0lEKS8kKEJVSUxEX05VTUJFUik6JChUQVJHRVRfQlVJTERfVkFSSUFOVCkvJChCVUlMRF9WRVJTSU9OX1RBR1MpCisgIEJVSUxEX1RIVU1CUFJJTlQgOj0gJChQTEFURk9STV9WRVJTSU9OKS8kKEJVSUxEX0lEKS8kKEJVSUxEX05VTUJFUl9GUk9NX0ZJTEUpOiQoVEFSR0VUX0JVSUxEX1ZBUklBTlQpLyQoQlVJTERfVkVSU0lPTl9UQUdTKQogZW5kaWYKLWlmbmVxICgkKHdvcmRzICQoQlVJTERfVEhVTUJQUklOVCkpLDEpCi0gICQoZXJyb3IgQlVJTERfVEhVTUJQUklOVCBjYW5ub3QgY29udGFpbiBzcGFjZXM6ICIkKEJVSUxEX1RIVU1CUFJJTlQpIikKKworQlVJTERfVEhVTUJQUklOVF9GSUxFIDo9ICQoUFJPRFVDVF9PVVQpL2J1aWxkX3RodW1icHJpbnQudHh0CitpZm5lcSAoLCQoc2hlbGwgbWtkaXIgLXAgJChQUk9EVUNUX09VVCkgJiYgZWNobyAkKEJVSUxEX1RIVU1CUFJJTlQpID4kKEJVSUxEX1RIVU1CUFJJTlRfRklMRSkgJiYgZ3JlcCAiICIgJChCVUlMRF9USFVNQlBSSU5UX0ZJTEUpKSkKKyAgJChlcnJvciBCVUlMRF9USFVNQlBSSU5UIGNhbm5vdCBjb250YWluIHNwYWNlczogIiQoZmlsZSA8JChCVUlMRF9USFVNQlBSSU5UX0ZJTEUpKSIpCiBlbmRpZgorQlVJTERfVEhVTUJQUklOVF9GUk9NX0ZJTEUgOj0gJCQoY2F0ICQoQlVJTERfVEhVTUJQUklOVF9GSUxFKSkKKyMgdW5zZXQgaXQgZm9yIHNhZmV0eS4KK0JVSUxEX1RIVU1CUFJJTlQgOj0KIAogS05PV05fT0VNX1RIVU1CUFJJTlRfUFJPUEVSVElFUyA6PSBcCiAgICAgcm8ucHJvZHVjdC5icmFuZCBcCkBAIC0yMzUsMTUgKzI5OCwxNSBAQAogJChzdHJpcCAkKHN1YnN0IF8sLSwgJChmaXJzdHdvcmQgJCgxKSkpKQogZW5kZWYKIAotQlVJTERJTkZPX1NIIDo9IGJ1aWxkL3Rvb2xzL2J1aWxkaW5mby5zaAotVkVORE9SX0JVSUxESU5GT19TSCA6PSBidWlsZC90b29scy92ZW5kb3JfYnVpbGRpbmZvLnNoCitCVUlMRElORk9fU0ggOj0gYnVpbGQvbWFrZS90b29scy9idWlsZGluZm8uc2gKK1ZFTkRPUl9CVUlMRElORk9fU0ggOj0gYnVpbGQvbWFrZS90b29scy92ZW5kb3JfYnVpbGRpbmZvLnNoCiAKICMgVEFSR0VUX0JVSUxEX0ZMQVZPUiBhbmQgcm8uYnVpbGQuZmxhdm9yIGFyZSB1c2VkIG9ubHkgYnkgdGhlIHRlc3QKICMgaGFybmVzcyB0byBkaXN0aW5ndWlzaCBidWlsZHMuIE9ubHkgYWRkIF9hc2FuIGZvciBhIHNhbml0aXplZCBidWlsZAogIyBpZiBpdCBpc24ndCBhbHJlYWR5IGEgcGFydCBvZiB0aGUgZmxhdm9yICh2aWEgYSBkZWRpY2F0ZWQgbHVuY2gKICMgY29uZmlnIGZvciBleGFtcGxlKS4KIFRBUkdFVF9CVUlMRF9GTEFWT1IgOj0gJChUQVJHRVRfUFJPRFVDVCktJChUQVJHRVRfQlVJTERfVkFSSUFOVCkKLWlmZGVmIFNBTklUSVpFX1RBUkdFVAoraWZuZXEgKCwgJChmaWx0ZXIgYWRkcmVzcywgJChTQU5JVElaRV9UQVJHRVQpKSkKIGlmZXEgKCwkKGZpbmRzdHJpbmcgX2FzYW4sJChUQVJHRVRfQlVJTERfRkxBVk9SKSkpCiBUQVJHRVRfQlVJTERfRkxBVk9SIDo9ICQoVEFSR0VUX0JVSUxEX0ZMQVZPUilfYXNhbgogZW5kaWYKQEAgLTI1NCw3ICszMTcsNyBAQAogZWxzZQogc3lzdGVtX3Byb3BfZmlsZSA6PSAkKHdpbGRjYXJkICQoVEFSR0VUX0RFVklDRV9ESVIpL3N5c3RlbS5wcm9wKQogZW5kaWYKLSQoaW50ZXJtZWRpYXRlX3N5c3RlbV9idWlsZF9wcm9wKTogJChWRU5ET1JfQlVJTERJTkZPX1NIKSAkKEJVSUxESU5GT19TSCkgJChJTlRFUk5BTF9CVUlMRF9JRF9NQUtFRklMRSkgJChCVUlMRF9TWVNURU0pL3ZlcnNpb25fZGVmYXVsdHMubWsgJChzeXN0ZW1fcHJvcF9maWxlKSAkKElOU1RBTExFRF9BTkRST0lEX0lORk9fVFhUX1RBUkdFVCkKKyQoaW50ZXJtZWRpYXRlX3N5c3RlbV9idWlsZF9wcm9wKTogJChCVUlMRElORk9fU0gpICQoSU5URVJOQUxfQlVJTERfSURfTUFLRUZJTEUpICQoQlVJTERfU1lTVEVNKS92ZXJzaW9uX2RlZmF1bHRzLm1rICQoc3lzdGVtX3Byb3BfZmlsZSkgJChJTlNUQUxMRURfQU5EUk9JRF9JTkZPX1RYVF9UQVJHRVQpCiAJQGVjaG8gVGFyZ2V0IGJ1aWxkaW5mbzogJEAKIAlAbWtkaXIgLXAgJChkaXIgJEApCiAJJChoaWRlKSBlY2hvID4gJEAKQEAgLTI4OCw5ICszNTEsMTAgQEAKIAkJCVBMQVRGT1JNX1BSRVZJRVdfU0RLX1ZFUlNJT049IiQoUExBVEZPUk1fUFJFVklFV19TREtfVkVSU0lPTikiIFwKIAkJCVBMQVRGT1JNX1ZFUlNJT05fQ09ERU5BTUU9IiQoUExBVEZPUk1fVkVSU0lPTl9DT0RFTkFNRSkiIFwKIAkJCVBMQVRGT1JNX1ZFUlNJT05fQUxMX0NPREVOQU1FUz0iJChQTEFURk9STV9WRVJTSU9OX0FMTF9DT0RFTkFNRVMpIiBcCisJCQlQTEFURk9STV9NSU5fU1VQUE9SVEVEX1RBUkdFVF9TREtfVkVSU0lPTj0iJChQTEFURk9STV9NSU5fU1VQUE9SVEVEX1RBUkdFVF9TREtfVkVSU0lPTikiIFwKIAkJCUJVSUxEX1ZFUlNJT05fVEFHUz0iJChCVUlMRF9WRVJTSU9OX1RBR1MpIiBcCiAJCQlCVUlMRF9GSU5HRVJQUklOVD0iJChCVUlMRF9GSU5HRVJQUklOVF9GUk9NX0ZJTEUpIiBcCi0JCQkkKGlmICQoT0VNX1RIVU1CUFJJTlRfUFJPUEVSVElFUyksQlVJTERfVEhVTUJQUklOVD0iJChCVUlMRF9USFVNQlBSSU5UKSIpIFwKKwkJCSQoaWYgJChPRU1fVEhVTUJQUklOVF9QUk9QRVJUSUVTKSxCVUlMRF9USFVNQlBSSU5UPSIkKEJVSUxEX1RIVU1CUFJJTlRfRlJPTV9GSUxFKSIpIFwKIAkJCVRBUkdFVF9DUFVfQUJJX0xJU1Q9IiQoVEFSR0VUX0NQVV9BQklfTElTVCkiIFwKIAkJCVRBUkdFVF9DUFVfQUJJX0xJU1RfMzJfQklUPSIkKFRBUkdFVF9DUFVfQUJJX0xJU1RfMzJfQklUKSIgXAogCQkJVEFSR0VUX0NQVV9BQklfTElTVF82NF9CSVQ9IiQoVEFSR0VUX0NQVV9BQklfTElTVF82NF9CSVQpIiBcCkBAIC0yOTgsMTYgKzM2Miw2IEBACiAJCQlUQVJHRVRfQ1BVX0FCSTI9IiQoVEFSR0VUX0NQVV9BQkkyKSIgXAogCQkJVEFSR0VUX0FBUFRfQ0hBUkFDVEVSSVNUSUNTPSIkKFRBUkdFVF9BQVBUX0NIQVJBQ1RFUklTVElDUykiIFwKIAkgICAgICAgIGJhc2ggJChCVUlMRElORk9fU0gpID4+ICRACi1pZm5kZWYgcHJvcGVydHlfb3ZlcnJpZGVzX3NwbGl0X2VuYWJsZWQKLQkkKGhpZGUpIFRBUkdFVF9ERVZJQ0U9IiQoVEFSR0VUX0RFVklDRSkiIFwKLQkJCVBST0RVQ1RfTkFNRT0iJChUQVJHRVRfUFJPRFVDVCkiIFwKLQkJCVBST0RVQ1RfQlJBTkQ9IiQoUFJPRFVDVF9CUkFORCkiIFwKLQkJCVBST0RVQ1RfTU9ERUw9IiQoUFJPRFVDVF9NT0RFTCkiIFwKLQkJCVBST0RVQ1RfTUFOVUZBQ1RVUkVSPSIkKFBST0RVQ1RfTUFOVUZBQ1RVUkVSKSIgXAotCQkJVEFSR0VUX0JPT1RMT0FERVJfQk9BUkRfTkFNRT0iJChUQVJHRVRfQk9PVExPQURFUl9CT0FSRF9OQU1FKSIgXAotCQkJVEFSR0VUX0JPQVJEX1BMQVRGT1JNPSIkKFRBUkdFVF9CT0FSRF9QTEFURk9STSkiIFwKLQkgICAgICAgIGJhc2ggJChWRU5ET1JfQlVJTERJTkZPX1NIKSA+PiAkQAotZW5kaWYKIAkkKGhpZGUpICQoZm9yZWFjaCBmaWxlLCQoc3lzdGVtX3Byb3BfZmlsZSksIFwKIAkJaWYgWyAtZiAiJChmaWxlKSIgXTsgdGhlbiBcCiAJCQllY2hvICIjIiA+PiAkQDsgXApAQCAtMzI0LDcgKzM3OCw3IEBACiAJJChoaWRlKSAkKGZvcmVhY2ggbGluZSwkKEZJTkFMX0JVSUxEX1BST1BFUlRJRVMpLCBcCiAJCWVjaG8gIiQobGluZSkiID4+ICRAOykKIAkkKGhpZGUpIGNhdCAkKElOU1RBTExFRF9BTkRST0lEX0lORk9fVFhUX1RBUkdFVCkgfCBncmVwICdyZXF1aXJlIHZlcnNpb24tJyB8IHNlZCAtZSAncy9yZXF1aXJlIHZlcnNpb24tL3JvLmJ1aWxkLmV4cGVjdC4vZycgPj4gJEAKLQkkKGhpZGUpIGJ1aWxkL3Rvb2xzL3Bvc3RfcHJvY2Vzc19wcm9wcy5weSAkQCAkKFBST0RVQ1RTLiQoSU5URVJOQUxfUFJPRFVDVCkuUFJPRFVDVF9TWVNURU1fUFJPUEVSVFlfQkxBQ0tMSVNUKQorCSQoaGlkZSkgYnVpbGQvbWFrZS90b29scy9wb3N0X3Byb2Nlc3NfcHJvcHMucHkgJEAgJChQUk9EVUNUUy4kKElOVEVSTkFMX1BST0RVQ1QpLlBST0RVQ1RfU1lTVEVNX1BST1BFUlRZX0JMQUNLTElTVCkKIAogYnVpbGRfZGVzYyA6PQogCkBAIC0zMzYsMTEgKzM5MCw3IEBACiAKICQoSU5TVEFMTEVEX0JVSUxEX1BST1BfVEFSR0VUKTogJChpbnRlcm1lZGlhdGVfc3lzdGVtX2J1aWxkX3Byb3ApICQoSU5TVEFMTEVEX1JFQ09WRVJZSU1BR0VfVEFSR0VUKQogCUBlY2hvICJUYXJnZXQgYnVpbGQgaW5mbzogJEAiCi1pZmRlZiBCT0FSRF9WRU5ET1JJTUFHRV9GSUxFX1NZU1RFTV9UWVBFCiAJJChoaWRlKSBncmVwIC12ICdyby5wcm9kdWN0LmZpcnN0X2FwaV9sZXZlbCcgJChpbnRlcm1lZGlhdGVfc3lzdGVtX2J1aWxkX3Byb3ApID4gJEAKLWVsc2UKLQkkKGhpZGUpIGNhdCAkKGludGVybWVkaWF0ZV9zeXN0ZW1fYnVpbGRfcHJvcCkgPiAkQAotZW5kaWYKIGlmZGVmIElOU1RBTExFRF9SRUNPVkVSWUlNQUdFX1RBUkdFVAogCSQoaGlkZSkgZWNobyByby5leHBlY3QucmVjb3ZlcnlfaWQ9YGNhdCAkKFJFQ09WRVJZSU1BR0VfSURfRklMRSlgID4+ICRACiBlbmRpZgpAQCAtMzQ5LDcgKzM5OSw2IEBACiAjIHZlbmRvciBidWlsZC5wcm9wCiAjCiAjIEZvciB2ZXJpZnlpbmcgdGhhdCB0aGUgdmVuZG9yIGJ1aWxkIGlzIHdoYXQgd2UgdGhpbmsgaXQgaXMKLWlmZGVmIEJPQVJEX1ZFTkRPUklNQUdFX0ZJTEVfU1lTVEVNX1RZUEUKIElOU1RBTExFRF9WRU5ET1JfQlVJTERfUFJPUF9UQVJHRVQgOj0gJChUQVJHRVRfT1VUX1ZFTkRPUikvYnVpbGQucHJvcAogQUxMX0RFRkFVTFRfSU5TVEFMTEVEX01PRFVMRVMgKz0gJChJTlNUQUxMRURfVkVORE9SX0JVSUxEX1BST1BfVEFSR0VUKQogCkBAIC0zNjgsNyArNDE3LDEwIEBACiAJJChoaWRlKSBlY2hvIHJvLnZlbmRvci5idWlsZC5kYXRlPWAkKERBVEVfRlJPTV9GSUxFKWA+PiRACiAJJChoaWRlKSBlY2hvIHJvLnZlbmRvci5idWlsZC5kYXRlLnV0Yz1gJChEQVRFX0ZST01fRklMRSkgKyVzYD4+JEAKIAkkKGhpZGUpIGVjaG8gcm8udmVuZG9yLmJ1aWxkLmZpbmdlcnByaW50PSIkKEJVSUxEX0ZJTkdFUlBSSU5UX0ZST01fRklMRSkiPj4kQAotaWZkZWYgcHJvcGVydHlfb3ZlcnJpZGVzX3NwbGl0X2VuYWJsZWQKKwkkKGhpZGUpIGVjaG8gcm8udmVuZG9yLmJ1aWxkLnNlY3VyaXR5X3BhdGNoPSIkKFZFTkRPUl9TRUNVUklUWV9QQVRDSCkiPj4kQAorCSQoaGlkZSkgZWNobyByby52ZW5kb3IucHJvZHVjdC5jcHUuYWJpbGlzdD0iJChUQVJHRVRfQ1BVX0FCSV9MSVNUKSI+PiRACisJJChoaWRlKSBlY2hvIHJvLnZlbmRvci5wcm9kdWN0LmNwdS5hYmlsaXN0MzI9IiQoVEFSR0VUX0NQVV9BQklfTElTVF8zMl9CSVQpIj4+JEAKKwkkKGhpZGUpIGVjaG8gcm8udmVuZG9yLnByb2R1Y3QuY3B1LmFiaWxpc3Q2ND0iJChUQVJHRVRfQ1BVX0FCSV9MSVNUXzY0X0JJVCkiPj4kQAogCSQoaGlkZSkgVEFSR0VUX0RFVklDRT0iJChUQVJHRVRfREVWSUNFKSIgXAogCQkJUFJPRFVDVF9OQU1FPSIkKFRBUkdFVF9QUk9EVUNUKSIgXAogCQkJUFJPRFVDVF9CUkFORD0iJChQUk9EVUNUX0JSQU5EKSIgXApAQCAtMzc3LDE0ICs0MjksNDAgQEAKIAkJCVRBUkdFVF9CT09UTE9BREVSX0JPQVJEX05BTUU9IiQoVEFSR0VUX0JPT1RMT0FERVJfQk9BUkRfTkFNRSkiIFwKIAkJCVRBUkdFVF9CT0FSRF9QTEFURk9STT0iJChUQVJHRVRfQk9BUkRfUExBVEZPUk0pIiBcCiAJICAgICAgICBiYXNoICQoVkVORE9SX0JVSUxESU5GT19TSCkgPj4gJEAKK2lmZGVmIHByb3BlcnR5X292ZXJyaWRlc19zcGxpdF9lbmFibGVkCiAJJChoaWRlKSBlY2hvICIjIiA+PiAkQDsgXAogCSAgICAgICAgZWNobyAiIyBBRERJVElPTkFMIFZFTkRPUiBCVUlMRCBQUk9QRVJUSUVTIiA+PiAkQDsgXAogCSAgICAgICAgZWNobyAiIyIgPj4gJEA7CiAJJChoaWRlKSAkKGZvcmVhY2ggbGluZSwkKEZJTkFMX1ZFTkRPUl9CVUlMRF9QUk9QRVJUSUVTKSwgXAogCQllY2hvICIkKGxpbmUpIiA+PiAkQDspCi0JJChoaWRlKSBidWlsZC90b29scy9wb3N0X3Byb2Nlc3NfcHJvcHMucHkgJEAKIGVuZGlmICAjIHByb3BlcnR5X292ZXJyaWRlc19zcGxpdF9lbmFibGVkCi1lbmRpZiAgIyBCT0FSRF9WRU5ET1JJTUFHRV9GSUxFX1NZU1RFTV9UWVBFCisJJChoaWRlKSBidWlsZC9tYWtlL3Rvb2xzL3Bvc3RfcHJvY2Vzc19wcm9wcy5weSAkQCAkKFBST0RVQ1RTLiQoSU5URVJOQUxfUFJPRFVDVCkuUFJPRFVDVF9WRU5ET1JfUFJPUEVSVFlfQkxBQ0tMSVNUKQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIHByb2R1Y3QgYnVpbGQucHJvcAorSU5TVEFMTEVEX1BST0RVQ1RfQlVJTERfUFJPUF9UQVJHRVQgOj0gJChUQVJHRVRfT1VUX1BST0RVQ1QpL2J1aWxkLnByb3AKK0FMTF9ERUZBVUxUX0lOU1RBTExFRF9NT0RVTEVTICs9ICQoSU5TVEFMTEVEX1BST0RVQ1RfQlVJTERfUFJPUF9UQVJHRVQpCisKK0ZJTkFMX1BST0RVQ1RfUFJPUEVSVElFUyArPSBcCisgICAgJChjYWxsIGNvbGxhcHNlLXBhaXJzLCAkKFBST0RVQ1RfUFJPRFVDVF9QUk9QRVJUSUVTKSkKK0ZJTkFMX1BST0RVQ1RfUFJPUEVSVElFUyA6PSAkKGNhbGwgdW5pcS1wYWlycy1ieS1maXJzdC1jb21wb25lbnQsIFwKKyAgICAkKEZJTkFMX1BST0RVQ1RfUFJPUEVSVElFUyksPSkKKworJChJTlNUQUxMRURfUFJPRFVDVF9CVUlMRF9QUk9QX1RBUkdFVCk6CisJQGVjaG8gVGFyZ2V0IHByb2R1Y3QgYnVpbGRpbmZvOiAkQAorCUBta2RpciAtcCAkKGRpciAkQCkKKwkkKGhpZGUpIGVjaG8gPiAkQAoraWZkZWYgQk9BUkRfVVNFU19QUk9EVUNUSU1BR0UKKwkkKGhpZGUpIGVjaG8gcm8ucHJvZHVjdC5idWlsZC5kYXRlPWAkKERBVEVfRlJPTV9GSUxFKWA+PiRACisJJChoaWRlKSBlY2hvIHJvLnByb2R1Y3QuYnVpbGQuZGF0ZS51dGM9YCQoREFURV9GUk9NX0ZJTEUpICslc2A+PiRACisJJChoaWRlKSBlY2hvIHJvLnByb2R1Y3QuYnVpbGQuZmluZ2VycHJpbnQ9IiQoQlVJTERfRklOR0VSUFJJTlRfRlJPTV9GSUxFKSI+PiRACitlbmRpZiAgIyBCT0FSRF9VU0VTX1BST0RVQ1RJTUFHRQorCSQoaGlkZSkgZWNobyAiIyIgPj4gJEA7IFwKKwkgICAgICAgIGVjaG8gIiMgQURESVRJT05BTCBQUk9EVUNUIFBST1BFUlRJRVMiID4+ICRAOyBcCisJICAgICAgICBlY2hvICIjIiA+PiAkQDsKKwkkKGhpZGUpICQoZm9yZWFjaCBsaW5lLCQoRklOQUxfUFJPRFVDVF9QUk9QRVJUSUVTKSwgXAorCQllY2hvICIkKGxpbmUpIiA+PiAkQDspCisJJChoaWRlKSBidWlsZC9tYWtlL3Rvb2xzL3Bvc3RfcHJvY2Vzc19wcm9wcy5weSAkQAogCiAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIApAQCAtNDI4LDcgKzUwNiw3IEBACiAjIENyZWF0ZSBlbXB0eSBwYWNrYWdlIHN0YXRzIGZpbGUgaWYgdGFyZ2V0IGJ1aWxkcyBubyBqYXIocykgb3IgYXBrKHMpLgogCSQoaGlkZSkgdG91Y2ggJEAKIGVsc2UKLQkkKGhpZGUpIGJ1aWxkL3Rvb2xzL2R1bXAtcGFja2FnZS1zdGF0cyAkXiA+ICRACisJJChoaWRlKSBidWlsZC9tYWtlL3Rvb2xzL2R1bXAtcGFja2FnZS1zdGF0cyAkXiA+ICRACiBlbmRpZgogCiAuUEhPTlk6IHBhY2thZ2Utc3RhdHMKQEAgLTQ4OCw5ICs1NjYsOSBAQAogU09PTkdfQ09OVl9EQVRBIDo9ICQoY2FsbCBpbnRlcm1lZGlhdGVzLWRpci1mb3IsUEFDS0FHSU5HLHNvb25nX2NvbnZlcnNpb24pL3Nvb25nX2NvbnZfZGF0YQogJChTT09OR19DT05WX0RBVEEpOgogCUBybSAtZiAkQAotCUAkKGZvcmVhY2ggcywkKFNPT05HX0NPTlYpLGVjaG8gIiQocyksJChzb3J0ICQoU09PTkdfQ09OVi4kKHMpLlBST0JMRU1TKSksJChzb3J0ICQoZmlsdGVyLW91dCAkKFNPT05HX0FMUkVBRFlfQ09OViksJChTT09OR19DT05WLiQocykuREVQUykpKSIgPj4kQDspCisJQCQoZm9yZWFjaCBzLCQoU09PTkdfQ09OViksZWNobyAiJChzKSwkKFNPT05HX0NPTlYuJChzKS5UWVBFKSwkKHNvcnQgJChTT09OR19DT05WLiQocykuUFJPQkxFTVMpKSwkKHNvcnQgJChmaWx0ZXItb3V0ICQoU09PTkdfQUxSRUFEWV9DT05WKSwkKFNPT05HX0NPTlYuJChzKS5ERVBTKSkpIiA+PiRAOykKIAotU09PTkdfVE9fQ09OVkVSVF9TQ1JJUFQgOj0gYnVpbGQvdG9vbHMvc29vbmdfdG9fY29udmVydC5weQorU09PTkdfVE9fQ09OVkVSVF9TQ1JJUFQgOj0gYnVpbGQvbWFrZS90b29scy9zb29uZ190b19jb252ZXJ0LnB5CiBTT09OR19UT19DT05WRVJUIDo9ICQoUFJPRFVDVF9PVVQpL3Nvb25nX3RvX2NvbnZlcnQudHh0CiAkKFNPT05HX1RPX0NPTlZFUlQpOiAkKFNPT05HX0NPTlZfREFUQSkgJChTT09OR19UT19DT05WRVJUX1NDUklQVCkKIAlAcm0gLWYgJEAKQEAgLTQ5OCw2ICs1NzYsMjggQEAKICQoY2FsbCBkaXN0LWZvci1nb2Fscyxkcm9pZGNvcmUsJChTT09OR19UT19DT05WRVJUKSkKIAogIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBNb2R1bGVzIHVzZSAtV25vLWVycm9yLCBvciBhZGRlZCBkZWZhdWx0IC1XYWxsIC1XZXJyb3IKK1dBTExfV0VSUk9SIDo9ICQoUFJPRFVDVF9PVVQpL3dhbGxfd2Vycm9yLnR4dAorJChXQUxMX1dFUlJPUik6CisJQHJtIC1mICRACisJZWNobyAiIyBNb2R1bGVzIHVzaW5nIC1Xbm8tZXJyb3IiID4+ICRACisJZm9yIG0gaW4gJChzb3J0ICQoU09PTkdfTU9EVUxFU19VU0lOR19XTk9fRVJST1IpICQoTU9EVUxFU19VU0lOR19XTk9fRVJST1IpKTsgZG8gZWNobyAkJG0gPj4gJEA7IGRvbmUKKwllY2hvICIjIE1vZHVsZXMgYWRkZWQgZGVmYXVsdCAtV2FsbCIgPj4gJEAKKwlmb3IgbSBpbiAkKHNvcnQgJChTT09OR19NT0RVTEVTX0FEREVEX1dBTEwpICQoTU9EVUxFU19BRERFRF9XQUxMKSk7IGRvIGVjaG8gJCRtID4+ICRAOyBkb25lCisKKyQoY2FsbCBkaXN0LWZvci1nb2Fscyxkcm9pZGNvcmUsJChXQUxMX1dFUlJPUikpCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTW9kdWxlcyBtaXNzaW5nIHByb2ZpbGUgZmlsZXMKK1BHT19QUk9GSUxFX01JU1NJTkcgOj0gJChQUk9EVUNUX09VVCkvcGdvX3Byb2ZpbGVfZmlsZV9taXNzaW5nLnR4dAorJChQR09fUFJPRklMRV9NSVNTSU5HKToKKwlAcm0gLWYgJEAKKwllY2hvICIjIE1vZHVsZXMgbWlzc2luZyBQR08gcHJvZmlsZSBmaWxlcyIgPj4gJEAKKwlmb3IgbSBpbiAkKFNPT05HX01PRFVMRVNfTUlTU0lOR19QR09fUFJPRklMRV9GSUxFKTsgZG8gZWNobyAkJG0gPj4gJEA7IGRvbmUKKworJChjYWxsIGRpc3QtZm9yLWdvYWxzLGRyb2lkY29yZSwkKFBHT19QUk9GSUxFX01JU1NJTkcpKQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAjIFRoZSBkZXYga2V5IGlzIHVzZWQgdG8gc2lnbiB0aGlzIHBhY2thZ2UsIGFuZCBhcyB0aGUga2V5IHJlcXVpcmVkCiAjIGZvciBmdXR1cmUgT1RBIHBhY2thZ2VzIGluc3RhbGxlZCBieSB0aGlzIHN5c3RlbS4gIEFjdHVhbCBwcm9kdWN0CiAjIGRlbGl2ZXJhYmxlcyB3aWxsIGJlIHJlLXNpZ25lZCBieSBoYW5kLiAgV2UgZXhwZWN0IHRoaXMgZmlsZSB0bwpAQCAtNTMxLDcgKzYzMSw3IEBACiBwZGtfZnVzaW9uX2xvZ190YWdzX2ZpbGUgOj0gJChwYXRzdWJzdCAkKFBST0RVQ1RfT1VUKS8lLCQoX3Bka19mdXNpb25faW50ZXJtZWRpYXRlcykvJSwkKGZpbHRlciAkKGV2ZW50X2xvZ190YWdzX2ZpbGUpLCQoQUxMX1BES19GVVNJT05fRklMRVMpKSkKIAogJChhbGxfZXZlbnRfbG9nX3RhZ3NfZmlsZSk6IFBSSVZBVEVfU1JDX0ZJTEVTIDo9ICQoYWxsX2V2ZW50X2xvZ190YWdzX3NyYykgJChwZGtfZnVzaW9uX2xvZ190YWdzX2ZpbGUpCi0kKGFsbF9ldmVudF9sb2dfdGFnc19maWxlKTogJChhbGxfZXZlbnRfbG9nX3RhZ3Nfc3JjKSAkKHBka19mdXNpb25fbG9nX3RhZ3NfZmlsZSkgJChNRVJHRVRBR1MpIGJ1aWxkL3Rvb2xzL2V2ZW50X2xvZ190YWdzLnB5CiskKGFsbF9ldmVudF9sb2dfdGFnc19maWxlKTogJChhbGxfZXZlbnRfbG9nX3RhZ3Nfc3JjKSAkKHBka19mdXNpb25fbG9nX3RhZ3NfZmlsZSkgJChNRVJHRVRBR1MpIGJ1aWxkL21ha2UvdG9vbHMvZXZlbnRfbG9nX3RhZ3MucHkKIAkkKGhpZGUpIG1rZGlyIC1wICQoZGlyICRAKQogCSQoaGlkZSkgJChNRVJHRVRBR1MpIC1vICRAICQoUFJJVkFURV9TUkNfRklMRVMpCiAKQEAgLTU0Nyw3ICs2NDcsNyBAQAogCiAkKGV2ZW50X2xvZ190YWdzX2ZpbGUpOiBQUklWQVRFX1NSQ19GSUxFUyA6PSAkKGV2ZW50X2xvZ190YWdzX3NyYykgJChwZGtfZnVzaW9uX2xvZ190YWdzX2ZpbGUpCiAkKGV2ZW50X2xvZ190YWdzX2ZpbGUpOiBQUklWQVRFX01FUkdFRF9GSUxFIDo9ICQoYWxsX2V2ZW50X2xvZ190YWdzX2ZpbGUpCi0kKGV2ZW50X2xvZ190YWdzX2ZpbGUpOiAkKGV2ZW50X2xvZ190YWdzX3NyYykgJChhbGxfZXZlbnRfbG9nX3RhZ3NfZmlsZSkgJChwZGtfZnVzaW9uX2xvZ190YWdzX2ZpbGUpICQoTUVSR0VUQUdTKSBidWlsZC90b29scy9ldmVudF9sb2dfdGFncy5weQorJChldmVudF9sb2dfdGFnc19maWxlKTogJChldmVudF9sb2dfdGFnc19zcmMpICQoYWxsX2V2ZW50X2xvZ190YWdzX2ZpbGUpICQocGRrX2Z1c2lvbl9sb2dfdGFnc19maWxlKSAkKE1FUkdFVEFHUykgYnVpbGQvbWFrZS90b29scy9ldmVudF9sb2dfdGFncy5weQogCSQoaGlkZSkgbWtkaXIgLXAgJChkaXIgJEApCiAJJChoaWRlKSAkKE1FUkdFVEFHUykgLW8gJEAgLW0gJChQUklWQVRFX01FUkdFRF9GSUxFKSAkKFBSSVZBVEVfU1JDX0ZJTEVTKQogCkBAIC01OTUsNiArNjk1LDggQEAKIAlAZWNobyAibWFrZSAkQDogaWdub3JpbmcgZGVwZW5kZW5jaWVzIgogCSQoaGlkZSkgJChNS0JPT1RGUykgLWQgJChUQVJHRVRfT1VUKSAkKFRBUkdFVF9ST09UX09VVCkgfCAkKE1JTklHWklQKSA+ICQoSU5TVEFMTEVEX1JBTURJU0tfVEFSR0VUKQogCitJTlNUQUxMRURfQk9PVElNQUdFX1RBUkdFVCA6PSAkKFBST0RVQ1RfT1VUKS9ib290LmltZworCiBpZm5lcSAoJChzdHJpcCAkKFRBUkdFVF9OT19LRVJORUwpKSx0cnVlKQogCiAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC02MzMsOCArNzM1LDYgQEAKICAgICAtLW9zX3ZlcnNpb24gJChQTEFURk9STV9WRVJTSU9OKSBcCiAgICAgLS1vc19wYXRjaF9sZXZlbCAkKFBMQVRGT1JNX1NFQ1VSSVRZX1BBVENIKQogCi1JTlNUQUxMRURfQk9PVElNQUdFX1RBUkdFVCA6PSAkKFBST0RVQ1RfT1VUKS9ib290LmltZwotCiAjIEJPQVJEX1VTRVNfUkVDT1ZFUllfQVNfQk9PVCA9IHRydWUgbXVzdCBoYXZlIEJPQVJEX0JVSUxEX1NZU1RFTV9ST09UX0lNQUdFID0gdHJ1ZS4KIGlmZXEgKCQoQk9BUkRfVVNFU19SRUNPVkVSWV9BU19CT09UKSx0cnVlKQogaWZuZXEgKCQoQk9BUkRfQlVJTERfU1lTVEVNX1JPT1RfSU1BR0UpLHRydWUpCkBAIC02NTIsNyArNzUyLDcgQEAKICQoSU5TVEFMTEVEX0JPT1RJTUFHRV9UQVJHRVQpOiAkKE1LQk9PVElNRykgJChBVkJUT09MKSAkKElOVEVSTkFMX0JPT1RJTUFHRV9GSUxFUykgJChCT0FSRF9BVkJfQk9PVF9LRVlfUEFUSCkKIAkkKGNhbGwgcHJldHR5LCJUYXJnZXQgYm9vdCBpbWFnZTogJEAiKQogCSQoaGlkZSkgJChNS0JPT1RJTUcpICQoSU5URVJOQUxfQk9PVElNQUdFX0FSR1MpICQoSU5URVJOQUxfTUtCT09USU1HX1ZFUlNJT05fQVJHUykgJChCT0FSRF9NS0JPT1RJTUdfQVJHUykgLS1vdXRwdXQgJEAKLQkkKGhpZGUpICQoY2FsbCBhc3NlcnQtbWF4LWltYWdlLXNpemUsJEAsJChCT0FSRF9CT09USU1BR0VfUEFSVElUSU9OX1NJWkUpKQorCSQoaGlkZSkgJChjYWxsIGFzc2VydC1tYXgtaW1hZ2Utc2l6ZSwkQCwkKGNhbGwgZ2V0LWhhc2gtaW1hZ2UtbWF4LXNpemUsJChCT0FSRF9CT09USU1BR0VfUEFSVElUSU9OX1NJWkUpKSkKIAkkKGhpZGUpICQoQVZCVE9PTCkgYWRkX2hhc2hfZm9vdGVyIFwKIAkgIC0taW1hZ2UgJEAgXAogCSAgLS1wYXJ0aXRpb25fc2l6ZSAkKEJPQVJEX0JPT1RJTUFHRV9QQVJUSVRJT05fU0laRSkgXApAQCAtNjYzLDkgKzc2Myw5IEBACiBib290aW1hZ2Utbm9kZXBzOiAkKE1LQk9PVElNRykgJChBVkJUT09MKSAkKEJPQVJEX0FWQl9CT09UX0tFWV9QQVRIKQogCUBlY2hvICJtYWtlICRAOiBpZ25vcmluZyBkZXBlbmRlbmNpZXMiCiAJJChoaWRlKSAkKE1LQk9PVElNRykgJChJTlRFUk5BTF9CT09USU1BR0VfQVJHUykgJChJTlRFUk5BTF9NS0JPT1RJTUdfVkVSU0lPTl9BUkdTKSAkKEJPQVJEX01LQk9PVElNR19BUkdTKSAtLW91dHB1dCAkKElOU1RBTExFRF9CT09USU1BR0VfVEFSR0VUKQotCSQoaGlkZSkgJChjYWxsIGFzc2VydC1tYXgtaW1hZ2Utc2l6ZSwkKElOU1RBTExFRF9CT09USU1BR0VfVEFSR0VUKSwkKEJPQVJEX0JPT1RJTUFHRV9QQVJUSVRJT05fU0laRSkpCisJJChoaWRlKSAkKGNhbGwgYXNzZXJ0LW1heC1pbWFnZS1zaXplLCQoSU5TVEFMTEVEX0JPT1RJTUFHRV9UQVJHRVQpLCQoY2FsbCBnZXQtaGFzaC1pbWFnZS1tYXgtc2l6ZSwkKEJPQVJEX0JPT1RJTUFHRV9QQVJUSVRJT05fU0laRSkpKQogCSQoaGlkZSkgJChBVkJUT09MKSBhZGRfaGFzaF9mb290ZXIgXAotCSAgLS1pbWFnZSAkQCBcCisJICAtLWltYWdlICQoSU5TVEFMTEVEX0JPT1RJTUFHRV9UQVJHRVQpIFwKIAkgIC0tcGFydGl0aW9uX3NpemUgJChCT0FSRF9CT09USU1BR0VfUEFSVElUSU9OX1NJWkUpIFwKIAkgIC0tcGFydGl0aW9uX25hbWUgYm9vdCAkKElOVEVSTkFMX0FWQl9CT09UX1NJR05JTkdfQVJHUykgXAogCSAgJChCT0FSRF9BVkJfQk9PVF9BRERfSEFTSF9GT09URVJfQVJHUykKQEAgLTcxNyw2ICs4MTcsMTMgQEAKIGVuZGlmICMgQk9BUkRfVVNFU19SRUNPVkVSWV9BU19CT09UCiAKIGVsc2UJIyBUQVJHRVRfTk9fS0VSTkVMCitpZmRlZiBCT0FSRF9QUkVCVUlMVF9CT09USU1BR0UKK2lmbmVxICgkKEJPQVJEX0JVSUxEX1NZU1RFTV9ST09UX0lNQUdFKSx0cnVlKQorIyBSZW1vdmUgd2hlbiBiLzYzNjc2Mjk2IGlzIHJlc29sdmVkLgorJChlcnJvciBQcmVidWlsdCBib290aW1hZ2UgaXMgb25seSBzdXBwb3J0ZWQgZm9yIEFCIHRhcmdldHMpCitlbmRpZgorJChldmFsICQoY2FsbCBjb3B5LW9uZS1maWxlLCQoQk9BUkRfUFJFQlVJTFRfQk9PVElNQUdFKSwkKElOU1RBTExFRF9CT09USU1BR0VfVEFSR0VUKSkpCitlbHNlCiBJTlRFUk5BTF9LRVJORUxfQ01ETElORSA6PSAkKHN0cmlwICQoQk9BUkRfS0VSTkVMX0NNRExJTkUpKQogIyBIQUNLOiBUaGUgdG9wLWxldmVsIHRhcmdldHMgZGVwZW5kIG9uIHRoZSBib290aW1hZ2UuICBOb3QgYWxsIHRhcmdldHMKICMgY2FuIHByb2R1Y2UgYSBib290aW1hZ2UsIHRob3VnaCwgYW5kIGVtdWxhdG9yIHRhcmdldHMgbmVlZCB0aGUgcmFtZGlzawpAQCAtNzI1LDYgKzgzMiw3IEBACiAjICAgICAgIGtlcm5lbC1sZXNzIGlucHV0cy4KIElOU1RBTExFRF9CT09USU1BR0VfVEFSR0VUIDo9ICQoSU5TVEFMTEVEX1JBTURJU0tfVEFSR0VUKQogZW5kaWYKK2VuZGlmCiAKICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICMgTk9USUNFIGZpbGVzCkBAIC03NjQsOCArODcyLDggQEAKICQoMikgJCgzKTogUFJJVkFURV9NRVNTQUdFIDo9ICQoNCkKICQoMikgJCgzKTogUFJJVkFURV9ESVIgOj0gJCg1KQogJCgyKSA6ICQoMykKLSQoMykgOiAkKDYpICQoQlVJTERfU1lTVEVNKS9NYWtlZmlsZSBidWlsZC90b29scy9nZW5lcmF0ZS1ub3RpY2UtZmlsZXMucHkKLQlidWlsZC90b29scy9nZW5lcmF0ZS1ub3RpY2UtZmlsZXMucHkgLS10ZXh0LW91dHB1dCAkKDIpIFwKKyQoMykgOiAkKDYpICQoQlVJTERfU1lTVEVNKS9NYWtlZmlsZSBidWlsZC9tYWtlL3Rvb2xzL2dlbmVyYXRlLW5vdGljZS1maWxlcy5weQorCWJ1aWxkL21ha2UvdG9vbHMvZ2VuZXJhdGUtbm90aWNlLWZpbGVzLnB5IC0tdGV4dC1vdXRwdXQgJCgyKSBcCiAJCSQoaWYgJChmaWx0ZXIgJCgxKSx4bWxfZXhjbHVkZWRfdmVuZG9yKSwtZSB2ZW5kb3IgLS14bWwtb3V0cHV0LCBcCiAJCSAgJChpZiAkKGZpbHRlciAkKDEpLHhtbF92ZW5kb3IpLC1pIHZlbmRvciAtLXhtbC1vdXRwdXQsIFwKIAkJICAgIC0taHRtbC1vdXRwdXQpKSAkKDMpIFwKQEAgLTc4NCw3ICs4OTIsOCBAQAogdG9vbHNfbm90aWNlX2ZpbGVfdHh0IDo9ICQoSE9TVF9PVVRfSU5URVJNRURJQVRFUykvTk9USUNFLnR4dAogdG9vbHNfbm90aWNlX2ZpbGVfaHRtbCA6PSAkKEhPU1RfT1VUX0lOVEVSTUVESUFURVMpL05PVElDRS5odG1sCiAKLWlmZXEgKCQoUFJPRFVDVF9GVUxMX1RSRUJMRSksdHJ1ZSkKKyMgVE9ETyhiLzY5ODY1MDMyKTogTWFrZSBQUk9EVUNUX05PVElDRV9TUExJVCB0aGUgZGVmYXVsdCBiZWhhdmlvci4KK2lmZXEgKCQoUFJPRFVDVF9OT1RJQ0VfU1BMSVQpLHRydWUpCiB0YXJnZXRfbm90aWNlX2ZpbGVfaHRtbF9vcl94bWwgOj0gJChUQVJHRVRfT1VUX0lOVEVSTUVESUFURVMpL05PVElDRS54bWwKIHRhcmdldF9ub3RpY2VfZmlsZV9odG1sX29yX3htbF9neiA6PSAkKFRBUkdFVF9PVVRfSU5URVJNRURJQVRFUykvTk9USUNFLnhtbC5negogaW5zdGFsbGVkX25vdGljZV9odG1sX29yX3htbF9neiA6PSAkKFRBUkdFVF9PVVQpL2V0Yy9OT1RJQ0UueG1sLmd6CkBAIC05NTUsNyArMTA2NCw3IEBACiBpZm5lcSAodHJ1ZSwkKFRBUkdFVF9VU0VSSU1BR0VTX1NQQVJTRV9TUVVBU0hGU19ESVNBQkxFRCkpCiAgIElOVEVSTkFMX1VTRVJJTUFHRVNfU1BBUlNFX1NRVUFTSEZTX0ZMQUcgOj0gLXMKIGVuZGlmCi1pZm5lcSAoJChmaWx0ZXIgJChCT0FSRF9WRU5ET1JJTUFHRV9GSUxFX1NZU1RFTV9UWVBFKSAkKEJPQVJEX1NZU1RFTUlNQUdFX0ZJTEVfU1lTVEVNX1RZUEUpLHNxdWFzaGZzKSwpCitpZm5lcSAoJChmaWx0ZXIgJChCT0FSRF9QUk9EVUNUSU1BR0VfRklMRV9TWVNURU1fVFlQRSkgJChCT0FSRF9WRU5ET1JJTUFHRV9GSUxFX1NZU1RFTV9UWVBFKSAkKEJPQVJEX1NZU1RFTUlNQUdFX0ZJTEVfU1lTVEVNX1RZUEUpLHNxdWFzaGZzKSwpCiBJTlRFUk5BTF9VU0VSSU1BR0VTX0RFUFMgKz0gJChNQUtFX1NRVUFTSEZTKSAkKE1LU1FVQVNIRlNVU0VSSU1HKSAkKElNRzJTSU1HKQogZW5kaWYKIApAQCAtOTg1LDggKzEwOTQsOSBAQAogJChpZiAkKEJPQVJEX1NZU1RFTUlNQUdFX1BBUlRJVElPTl9TSVpFKSwkKGhpZGUpIGVjaG8gInN5c3RlbV9zaXplPSQoQk9BUkRfU1lTVEVNSU1BR0VfUEFSVElUSU9OX1NJWkUpIiA+PiAkKDEpKQogJChpZiAkKEJPQVJEX1NZU1RFTUlNQUdFX0ZJTEVfU1lTVEVNX1RZUEUpLCQoaGlkZSkgZWNobyAic3lzdGVtX2ZzX3R5cGU9JChCT0FSRF9TWVNURU1JTUFHRV9GSUxFX1NZU1RFTV9UWVBFKSIgPj4gJCgxKSkKICQoaWYgJChCT0FSRF9TWVNURU1JTUFHRV9FWFRGU19JTk9ERV9DT1VOVCksJChoaWRlKSBlY2hvICJzeXN0ZW1fZXh0ZnNfaW5vZGVfY291bnQ9JChCT0FSRF9TWVNURU1JTUFHRV9FWFRGU19JTk9ERV9DT1VOVCkiID4+ICQoMSkpCiskKGlmICQoQk9BUkRfU1lTVEVNSU1BR0VfRVhURlNfUlNWX1BDVCksJChoaWRlKSBlY2hvICJzeXN0ZW1fZXh0ZnNfcnN2X3BjdD0kKEJPQVJEX1NZU1RFTUlNQUdFX0VYVEZTX1JTVl9QQ1QpIiA+PiAkKDEpKQogJChpZiAkKEJPQVJEX1NZU1RFTUlNQUdFX0pPVVJOQUxfU0laRSksJChoaWRlKSBlY2hvICJzeXN0ZW1fam91cm5hbF9zaXplPSQoQk9BUkRfU1lTVEVNSU1BR0VfSk9VUk5BTF9TSVpFKSIgPj4gJCgxKSkKLSQoaWYgJChCT0FSRF9IQVNfRVhUNF9SRVNFUlZFRF9CTE9DS1MpLCQoaGlkZSkgZWNobyAiaGFzX2V4dDRfcmVzZXJ2ZWRfYmxvY2tzPSQoQk9BUkRfSEFTX0VYVDRfUkVTRVJWRURfQkxPQ0tTKSIgPj4gJCgxKSkKKyQoaWYgJChCT0FSRF9FWFQ0X1NIQVJFX0RVUF9CTE9DS1MpLCQoaGlkZSkgZWNobyAiZXh0NF9zaGFyZV9kdXBfYmxvY2tzPSQoQk9BUkRfRVhUNF9TSEFSRV9EVVBfQkxPQ0tTKSIgPj4gJCgxKSkKICQoaWYgJChCT0FSRF9TWVNURU1JTUFHRV9TUVVBU0hGU19DT01QUkVTU09SKSwkKGhpZGUpIGVjaG8gInN5c3RlbV9zcXVhc2hmc19jb21wcmVzc29yPSQoQk9BUkRfU1lTVEVNSU1BR0VfU1FVQVNIRlNfQ09NUFJFU1NPUikiID4+ICQoMSkpCiAkKGlmICQoQk9BUkRfU1lTVEVNSU1BR0VfU1FVQVNIRlNfQ09NUFJFU1NPUl9PUFQpLCQoaGlkZSkgZWNobyAic3lzdGVtX3NxdWFzaGZzX2NvbXByZXNzb3Jfb3B0PSQoQk9BUkRfU1lTVEVNSU1BR0VfU1FVQVNIRlNfQ09NUFJFU1NPUl9PUFQpIiA+PiAkKDEpKQogJChpZiAkKEJPQVJEX1NZU1RFTUlNQUdFX1NRVUFTSEZTX0JMT0NLX1NJWkUpLCQoaGlkZSkgZWNobyAic3lzdGVtX3NxdWFzaGZzX2Jsb2NrX3NpemU9JChCT0FSRF9TWVNURU1JTUFHRV9TUVVBU0hGU19CTE9DS19TSVpFKSIgPj4gJCgxKSkKQEAgLTEwMDEsNiArMTExMSw3IEBACiAkKGlmICQoQk9BUkRfQ0FDSEVJTUFHRV9QQVJUSVRJT05fU0laRSksJChoaWRlKSBlY2hvICJjYWNoZV9zaXplPSQoQk9BUkRfQ0FDSEVJTUFHRV9QQVJUSVRJT05fU0laRSkiID4+ICQoMSkpCiAkKGlmICQoQk9BUkRfVkVORE9SSU1BR0VfRklMRV9TWVNURU1fVFlQRSksJChoaWRlKSBlY2hvICJ2ZW5kb3JfZnNfdHlwZT0kKEJPQVJEX1ZFTkRPUklNQUdFX0ZJTEVfU1lTVEVNX1RZUEUpIiA+PiAkKDEpKQogJChpZiAkKEJPQVJEX1ZFTkRPUklNQUdFX0VYVEZTX0lOT0RFX0NPVU5UKSwkKGhpZGUpIGVjaG8gInZlbmRvcl9leHRmc19pbm9kZV9jb3VudD0kKEJPQVJEX1ZFTkRPUklNQUdFX0VYVEZTX0lOT0RFX0NPVU5UKSIgPj4gJCgxKSkKKyQoaWYgJChCT0FSRF9WRU5ET1JJTUFHRV9FWFRGU19SU1ZfUENUKSwkKGhpZGUpIGVjaG8gInZlbmRvcl9leHRmc19yc3ZfcGN0PSQoQk9BUkRfVkVORE9SSU1BR0VfRVhURlNfUlNWX1BDVCkiID4+ICQoMSkpCiAkKGlmICQoQk9BUkRfVkVORE9SSU1BR0VfUEFSVElUSU9OX1NJWkUpLCQoaGlkZSkgZWNobyAidmVuZG9yX3NpemU9JChCT0FSRF9WRU5ET1JJTUFHRV9QQVJUSVRJT05fU0laRSkiID4+ICQoMSkpCiAkKGlmICQoQk9BUkRfVkVORE9SSU1BR0VfSk9VUk5BTF9TSVpFKSwkKGhpZGUpIGVjaG8gInZlbmRvcl9qb3VybmFsX3NpemU9JChCT0FSRF9WRU5ET1JJTUFHRV9KT1VSTkFMX1NJWkUpIiA+PiAkKDEpKQogJChpZiAkKEJPQVJEX1ZFTkRPUklNQUdFX1NRVUFTSEZTX0NPTVBSRVNTT1IpLCQoaGlkZSkgZWNobyAidmVuZG9yX3NxdWFzaGZzX2NvbXByZXNzb3I9JChCT0FSRF9WRU5ET1JJTUFHRV9TUVVBU0hGU19DT01QUkVTU09SKSIgPj4gJCgxKSkKQEAgLTEwMDgsOSArMTExOSwyMCBAQAogJChpZiAkKEJPQVJEX1ZFTkRPUklNQUdFX1NRVUFTSEZTX0JMT0NLX1NJWkUpLCQoaGlkZSkgZWNobyAidmVuZG9yX3NxdWFzaGZzX2Jsb2NrX3NpemU9JChCT0FSRF9WRU5ET1JJTUFHRV9TUVVBU0hGU19CTE9DS19TSVpFKSIgPj4gJCgxKSkKICQoaWYgJChCT0FSRF9WRU5ET1JJTUFHRV9TUVVBU0hGU19ESVNBQkxFXzRLX0FMSUdOKSwkKGhpZGUpIGVjaG8gInZlbmRvcl9zcXVhc2hmc19kaXNhYmxlXzRrX2FsaWduPSQoQk9BUkRfVkVORE9SSU1BR0VfU1FVQVNIRlNfRElTQUJMRV80S19BTElHTikiID4+ICQoMSkpCiAkKGlmICQoUFJPRFVDVFMuJChJTlRFUk5BTF9QUk9EVUNUKS5QUk9EVUNUX1ZFTkRPUl9CQVNFX0ZTX1BBVEgpLCQoaGlkZSkgZWNobyAidmVuZG9yX2Jhc2VfZnNfZmlsZT0kKFBST0RVQ1RTLiQoSU5URVJOQUxfUFJPRFVDVCkuUFJPRFVDVF9WRU5ET1JfQkFTRV9GU19QQVRIKSIgPj4gJCgxKSkKKyQoaWYgJChCT0FSRF9QUk9EVUNUSU1BR0VfRklMRV9TWVNURU1fVFlQRSksJChoaWRlKSBlY2hvICJwcm9kdWN0X2ZzX3R5cGU9JChCT0FSRF9QUk9EVUNUSU1BR0VfRklMRV9TWVNURU1fVFlQRSkiID4+ICQoMSkpCiskKGlmICQoQk9BUkRfUFJPRFVDVElNQUdFX0VYVEZTX0lOT0RFX0NPVU5UKSwkKGhpZGUpIGVjaG8gInByb2R1Y3RfZXh0ZnNfaW5vZGVfY291bnQ9JChCT0FSRF9QUk9EVUNUSU1BR0VfRVhURlNfSU5PREVfQ09VTlQpIiA+PiAkKDEpKQorJChpZiAkKEJPQVJEX1BST0RVQ1RJTUFHRV9FWFRGU19SU1ZfUENUKSwkKGhpZGUpIGVjaG8gInByb2R1Y3RfZXh0ZnNfcnN2X3BjdD0kKEJPQVJEX1BST0RVQ1RJTUFHRV9FWFRGU19SU1ZfUENUKSIgPj4gJCgxKSkKKyQoaWYgJChCT0FSRF9QUk9EVUNUSU1BR0VfUEFSVElUSU9OX1NJWkUpLCQoaGlkZSkgZWNobyAicHJvZHVjdF9zaXplPSQoQk9BUkRfUFJPRFVDVElNQUdFX1BBUlRJVElPTl9TSVpFKSIgPj4gJCgxKSkKKyQoaWYgJChCT0FSRF9QUk9EVUNUSU1BR0VfSk9VUk5BTF9TSVpFKSwkKGhpZGUpIGVjaG8gInByb2R1Y3Rfam91cm5hbF9zaXplPSQoQk9BUkRfUFJPRFVDVElNQUdFX0pPVVJOQUxfU0laRSkiID4+ICQoMSkpCiskKGlmICQoQk9BUkRfUFJPRFVDVElNQUdFX1NRVUFTSEZTX0NPTVBSRVNTT1IpLCQoaGlkZSkgZWNobyAicHJvZHVjdF9zcXVhc2hmc19jb21wcmVzc29yPSQoQk9BUkRfUFJPRFVDVElNQUdFX1NRVUFTSEZTX0NPTVBSRVNTT1IpIiA+PiAkKDEpKQorJChpZiAkKEJPQVJEX1BST0RVQ1RJTUFHRV9TUVVBU0hGU19DT01QUkVTU09SX09QVCksJChoaWRlKSBlY2hvICJwcm9kdWN0X3NxdWFzaGZzX2NvbXByZXNzb3Jfb3B0PSQoQk9BUkRfUFJPRFVDVElNQUdFX1NRVUFTSEZTX0NPTVBSRVNTT1JfT1BUKSIgPj4gJCgxKSkKKyQoaWYgJChCT0FSRF9QUk9EVUNUSU1BR0VfU1FVQVNIRlNfQkxPQ0tfU0laRSksJChoaWRlKSBlY2hvICJwcm9kdWN0X3NxdWFzaGZzX2Jsb2NrX3NpemU9JChCT0FSRF9QUk9EVUNUSU1BR0VfU1FVQVNIRlNfQkxPQ0tfU0laRSkiID4+ICQoMSkpCiskKGlmICQoQk9BUkRfUFJPRFVDVElNQUdFX1NRVUFTSEZTX0RJU0FCTEVfNEtfQUxJR04pLCQoaGlkZSkgZWNobyAicHJvZHVjdF9zcXVhc2hmc19kaXNhYmxlXzRrX2FsaWduPSQoQk9BUkRfUFJPRFVDVElNQUdFX1NRVUFTSEZTX0RJU0FCTEVfNEtfQUxJR04pIiA+PiAkKDEpKQorJChpZiAkKFBST0RVQ1RTLiQoSU5URVJOQUxfUFJPRFVDVCkuUFJPRFVDVF9QUk9EVUNUX0JBU0VfRlNfUEFUSCksJChoaWRlKSBlY2hvICJwcm9kdWN0X2Jhc2VfZnNfZmlsZT0kKFBST0RVQ1RTLiQoSU5URVJOQUxfUFJPRFVDVCkuUFJPRFVDVF9QUk9EVUNUX0JBU0VfRlNfUEFUSCkiID4+ICQoMSkpCiAkKGlmICQoQk9BUkRfT0VNSU1BR0VfUEFSVElUSU9OX1NJWkUpLCQoaGlkZSkgZWNobyAib2VtX3NpemU9JChCT0FSRF9PRU1JTUFHRV9QQVJUSVRJT05fU0laRSkiID4+ICQoMSkpCiAkKGlmICQoQk9BUkRfT0VNSU1BR0VfSk9VUk5BTF9TSVpFKSwkKGhpZGUpIGVjaG8gIm9lbV9qb3VybmFsX3NpemU9JChCT0FSRF9PRU1JTUFHRV9KT1VSTkFMX1NJWkUpIiA+PiAkKDEpKQogJChpZiAkKEJPQVJEX09FTUlNQUdFX0VYVEZTX0lOT0RFX0NPVU5UKSwkKGhpZGUpIGVjaG8gIm9lbV9leHRmc19pbm9kZV9jb3VudD0kKEJPQVJEX09FTUlNQUdFX0VYVEZTX0lOT0RFX0NPVU5UKSIgPj4gJCgxKSkKKyQoaWYgJChCT0FSRF9PRU1JTUFHRV9FWFRGU19SU1ZfUENUKSwkKGhpZGUpIGVjaG8gIm9lbV9leHRmc19yc3ZfcGN0PSQoQk9BUkRfT0VNSU1BR0VfRVhURlNfUlNWX1BDVCkiID4+ICQoMSkpCiAkKGlmICQoSU5URVJOQUxfVVNFUklNQUdFU19TUEFSU0VfRVhUX0ZMQUcpLCQoaGlkZSkgZWNobyAiZXh0ZnNfc3BhcnNlX2ZsYWc9JChJTlRFUk5BTF9VU0VSSU1BR0VTX1NQQVJTRV9FWFRfRkxBRykiID4+ICQoMSkpCiAkKGlmICQoSU5URVJOQUxfVVNFUklNQUdFU19TUEFSU0VfU1FVQVNIRlNfRkxBRyksJChoaWRlKSBlY2hvICJzcXVhc2hmc19zcGFyc2VfZmxhZz0kKElOVEVSTkFMX1VTRVJJTUFHRVNfU1BBUlNFX1NRVUFTSEZTX0ZMQUcpIiA+PiAkKDEpKQogJChoaWRlKSBlY2hvICJzZWxpbnV4X2ZjPSQoU0VMSU5VWF9GQykiID4+ICQoMSkKQEAgLTEwMTksOCArMTE0MSwxMCBAQAogJChpZiAkKFBST0RVQ1RTLiQoSU5URVJOQUxfUFJPRFVDVCkuUFJPRFVDVF9TVVBQT1JUU19WRVJJVFkpLCQoaGlkZSkgZWNobyAidmVyaXR5X2tleT0kKFBST0RVQ1RTLiQoSU5URVJOQUxfUFJPRFVDVCkuUFJPRFVDVF9WRVJJVFlfU0lHTklOR19LRVkpIiA+PiAkKDEpKQogJChpZiAkKFBST0RVQ1RTLiQoSU5URVJOQUxfUFJPRFVDVCkuUFJPRFVDVF9TVVBQT1JUU19WRVJJVFkpLCQoaGlkZSkgZWNobyAidmVyaXR5X3NpZ25lcl9jbWQ9JChub3RkaXIgJChWRVJJVFlfU0lHTkVSKSkiID4+ICQoMSkpCiAkKGlmICQoUFJPRFVDVFMuJChJTlRFUk5BTF9QUk9EVUNUKS5QUk9EVUNUX1NVUFBPUlRTX1ZFUklUWV9GRUMpLCQoaGlkZSkgZWNobyAidmVyaXR5X2ZlYz0kKFBST0RVQ1RTLiQoSU5URVJOQUxfUFJPRFVDVCkuUFJPRFVDVF9TVVBQT1JUU19WRVJJVFlfRkVDKSIgPj4gJCgxKSkKKyQoaWYgJChmaWx0ZXIgZW5nLCAkKFRBUkdFVF9CVUlMRF9WQVJJQU5UKSksJChoaWRlKSBlY2hvICJ2ZXJpdHlfZGlzYWJsZT10cnVlIiA+PiAkKDEpKQogJChpZiAkKFBST0RVQ1RTLiQoSU5URVJOQUxfUFJPRFVDVCkuUFJPRFVDVF9TWVNURU1fVkVSSVRZX1BBUlRJVElPTiksJChoaWRlKSBlY2hvICJzeXN0ZW1fdmVyaXR5X2Jsb2NrX2RldmljZT0kKFBST0RVQ1RTLiQoSU5URVJOQUxfUFJPRFVDVCkuUFJPRFVDVF9TWVNURU1fVkVSSVRZX1BBUlRJVElPTikiID4+ICQoMSkpCiAkKGlmICQoUFJPRFVDVFMuJChJTlRFUk5BTF9QUk9EVUNUKS5QUk9EVUNUX1ZFTkRPUl9WRVJJVFlfUEFSVElUSU9OKSwkKGhpZGUpIGVjaG8gInZlbmRvcl92ZXJpdHlfYmxvY2tfZGV2aWNlPSQoUFJPRFVDVFMuJChJTlRFUk5BTF9QUk9EVUNUKS5QUk9EVUNUX1ZFTkRPUl9WRVJJVFlfUEFSVElUSU9OKSIgPj4gJCgxKSkKKyQoaWYgJChQUk9EVUNUUy4kKElOVEVSTkFMX1BST0RVQ1QpLlBST0RVQ1RfUFJPRFVDVF9WRVJJVFlfUEFSVElUSU9OKSwkKGhpZGUpIGVjaG8gInByb2R1Y3RfdmVyaXR5X2Jsb2NrX2RldmljZT0kKFBST0RVQ1RTLiQoSU5URVJOQUxfUFJPRFVDVCkuUFJPRFVDVF9QUk9EVUNUX1ZFUklUWV9QQVJUSVRJT04pIiA+PiAkKDEpKQogJChpZiAkKFBST0RVQ1RTLiQoSU5URVJOQUxfUFJPRFVDVCkuUFJPRFVDVF9TVVBQT1JUU19WQk9PVCksJChoaWRlKSBlY2hvICJ2Ym9vdD0kKFBST0RVQ1RTLiQoSU5URVJOQUxfUFJPRFVDVCkuUFJPRFVDVF9TVVBQT1JUU19WQk9PVCkiID4+ICQoMSkpCiAkKGlmICQoUFJPRFVDVFMuJChJTlRFUk5BTF9QUk9EVUNUKS5QUk9EVUNUX1NVUFBPUlRTX1ZCT09UKSwkKGhpZGUpIGVjaG8gInZib290X2tleT0kKFBST0RVQ1RTLiQoSU5URVJOQUxfUFJPRFVDVCkuUFJPRFVDVF9WQk9PVF9TSUdOSU5HX0tFWSkiID4+ICQoMSkpCiAkKGlmICQoUFJPRFVDVFMuJChJTlRFUk5BTF9QUk9EVUNUKS5QUk9EVUNUX1NVUFBPUlRTX1ZCT09UKSwkKGhpZGUpIGVjaG8gInZib290X3N1YmtleT0kKFBST0RVQ1RTLiQoSU5URVJOQUxfUFJPRFVDVCkuUFJPRFVDVF9WQk9PVF9TSUdOSU5HX1NVQktFWSkiID4+ICQoMSkpCkBAIC0xMDQxLDYgKzExNjUsMTMgQEAKICAgICAgICAgJChoaWRlKSBlY2hvICJhdmJfdmVuZG9yX2tleV9wYXRoPSQoQk9BUkRfQVZCX1ZFTkRPUl9LRVlfUEFUSCkiID4+ICQoMSkKICAgICAgICAgJChoaWRlKSBlY2hvICJhdmJfdmVuZG9yX2FsZ29yaXRobT0kKEJPQVJEX0FWQl9WRU5ET1JfQUxHT1JJVEhNKSIgPj4gJCgxKQogICAgICAgICAkKGhpZGUpIGVjaG8gImF2Yl92ZW5kb3Jfcm9sbGJhY2tfaW5kZXhfbG9jYXRpb249JChCT0FSRF9BVkJfVkVORE9SX1JPTExCQUNLX0lOREVYX0xPQ0FUSU9OKSIgPj4gJCgxKSkpCiskKGlmICQoQk9BUkRfQVZCX0VOQUJMRSksJChoaWRlKSBlY2hvICJhdmJfcHJvZHVjdF9oYXNodHJlZV9lbmFibGU9JChCT0FSRF9BVkJfRU5BQkxFKSIgPj4gJCgxKSkKKyQoaWYgJChCT0FSRF9BVkJfRU5BQkxFKSwkKGhpZGUpIGVjaG8gImF2Yl9wcm9kdWN0X2FkZF9oYXNodHJlZV9mb290ZXJfYXJncz0kKEJPQVJEX0FWQl9QUk9EVUNUX0FERF9IQVNIVFJFRV9GT09URVJfQVJHUykiID4+ICQoMSkpCiskKGlmICQoQk9BUkRfQVZCX0VOQUJMRSksXAorICAgICQoaWYgJChCT0FSRF9BVkJfUFJPRFVDVF9LRVlfUEFUSCksXAorICAgICAgICAkKGhpZGUpIGVjaG8gImF2Yl9wcm9kdWN0X2tleV9wYXRoPSQoQk9BUkRfQVZCX1BST0RVQ1RfS0VZX1BBVEgpIiA+PiAkKDEpCisgICAgICAgICQoaGlkZSkgZWNobyAiYXZiX3Byb2R1Y3RfYWxnb3JpdGhtPSQoQk9BUkRfQVZCX1BST0RVQ1RfQUxHT1JJVEhNKSIgPj4gJCgxKQorICAgICAgICAkKGhpZGUpIGVjaG8gImF2Yl9wcm9kdWN0X3JvbGxiYWNrX2luZGV4X2xvY2F0aW9uPSQoQk9BUkRfQVZCX1BST0RVQ1RfUk9MTEJBQ0tfSU5ERVhfTE9DQVRJT04pIiA+PiAkKDEpKSkKICQoaWYgJChmaWx0ZXIgdHJ1ZSwkKEJPQVJEX1VTRVNfUkVDT1ZFUllfQVNfQk9PVCkpLFwKICAgICAkKGhpZGUpIGVjaG8gInJlY292ZXJ5X2FzX2Jvb3Q9dHJ1ZSIgPj4gJCgxKSkKICQoaWYgJChmaWx0ZXIgdHJ1ZSwkKEJPQVJEX0JVSUxEX1NZU1RFTV9ST09UX0lNQUdFKSksXApAQCAtMTA0OSw2ICsxMTgwLDIzIEBACiAkKGlmICQoMiksJChoaWRlKSAkKGZvcmVhY2gga3YsJCgyKSxlY2hvICIkKGt2KSIgPj4gJCgxKTspKQogZW5kZWYKIAorIyAkKDEpOiBtb2R1bGVzIGxpc3QKKyMgJCgyKTogb3V0cHV0IGRpcgorIyAkKDMpOiBtb3VudCBwb2ludAorIyAkKDQpOiBzdGFnaW5nIGRpcgorIyBEZXBtb2QgcmVxdWlyZXMgYSB3ZWxsLWZvcm1lZCBrZXJuZWwgdmVyc2lvbiBzbyAwLjAgaXMgdXNlZCBhcyBhIHBsYWNlaG9sZGVyLgorZGVmaW5lIGJ1aWxkLWltYWdlLWtlcm5lbC1tb2R1bGVzCisgICAgJChoaWRlKSBybSAtcmYgJCgyKS9saWIvbW9kdWxlcworICAgICQoaGlkZSkgbWtkaXIgLXAgJCgyKS9saWIvbW9kdWxlcworICAgICQoaGlkZSkgY3AgJCgxKSAkKDIpL2xpYi9tb2R1bGVzLworICAgICQoaGlkZSkgcm0gLXJmICQoNCkKKyAgICAkKGhpZGUpIG1rZGlyIC1wICQoNCkvbGliL21vZHVsZXMvMC4wLyQoMylsaWIvbW9kdWxlcworICAgICQoaGlkZSkgY3AgJCgxKSAkKDQpL2xpYi9tb2R1bGVzLzAuMC8kKDMpbGliL21vZHVsZXMKKyAgICAkKGhpZGUpICQoREVQTU9EKSAtYiAkKDQpIDAuMAorICAgICQoaGlkZSkgc2VkIC1lICdzL1woLiptb2R1bGVzLipcKTovXC9cMTovZycgLWUgJ3MvIFwoW14gXSptb2R1bGVzW14gXSpcKS8gXC9cMS9nJyAkKDQpL2xpYi9tb2R1bGVzLzAuMC9tb2R1bGVzLmRlcCA+ICQoMikvbGliL21vZHVsZXMvbW9kdWxlcy5kZXAKKyAgICAkKGhpZGUpIGNwICQoNCkvbGliL21vZHVsZXMvMC4wL21vZHVsZXMuYWxpYXMgJCgyKS9saWIvbW9kdWxlcworZW5kZWYKKwogIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIyBSZWNvdmVyeSBpbWFnZQogCkBAIC0xMDYyLDkgKzEyMTAsMTYgQEAKIHJlY292ZXJ5X3NlcG9saWN5IDo9IFwKICAgICAkKFRBUkdFVF9SRUNPVkVSWV9ST09UX09VVCkvc2Vwb2xpY3kgXAogICAgICQoVEFSR0VUX1JFQ09WRVJZX1JPT1RfT1VUKS9wbGF0X2ZpbGVfY29udGV4dHMgXAotICAgICQoVEFSR0VUX1JFQ09WRVJZX1JPT1RfT1VUKS9ub25wbGF0X2ZpbGVfY29udGV4dHMgXAorICAgICQoVEFSR0VUX1JFQ09WRVJZX1JPT1RfT1VUKS92ZW5kb3JfZmlsZV9jb250ZXh0cyBcCiAgICAgJChUQVJHRVRfUkVDT1ZFUllfUk9PVF9PVVQpL3BsYXRfcHJvcGVydHlfY29udGV4dHMgXAotICAgICQoVEFSR0VUX1JFQ09WRVJZX1JPT1RfT1VUKS9ub25wbGF0X3Byb3BlcnR5X2NvbnRleHRzCisgICAgJChUQVJHRVRfUkVDT1ZFUllfUk9PVF9PVVQpL3ZlbmRvcl9wcm9wZXJ0eV9jb250ZXh0cworCitpZmRlZiBCT0FSRF9PRE1fU0VQT0xJQ1lfRElSUworcmVjb3Zlcnlfc2Vwb2xpY3kgKz0gXAorICAgICQoVEFSR0VUX1JFQ09WRVJZX1JPT1RfT1VUKS9vZG1fZmlsZV9jb250ZXh0cyBcCisgICAgJChUQVJHRVRfUkVDT1ZFUllfUk9PVF9PVVQpL29kbV9wcm9wZXJ0eV9jb250ZXh0cworZW5kaWYKKwogIyBQYXNzZWQgaW50byByc3luYyBmcm9tIG5vbi1yZWNvdmVyeSByb290IHRvIHJlY292ZXJ5IHJvb3QsIHRvIGF2b2lkIG92ZXJ3cml0aW5nIHJlY292ZXJ5LXNwZWNpZmljCiAjIFNFTGludXggZmlsZXMKIElHTk9SRV9SRUNPVkVSWV9TRVBPTElDWSA6PSAkKHBhdHN1YnN0ICQoVEFSR0VUX1JFQ09WRVJZX09VVCkvJSwtLWV4Y2x1ZGU9LyUsJChyZWNvdmVyeV9zZXBvbGljeSkpCkBAIC0xMDc1LDYgKzEyMzAsOSBAQAogaWZkZWYgcHJvcGVydHlfb3ZlcnJpZGVzX3NwbGl0X2VuYWJsZWQKIHJlY292ZXJ5X2J1aWxkX3Byb3BzICs9ICQoSU5TVEFMTEVEX1ZFTkRPUl9CVUlMRF9QUk9QX1RBUkdFVCkKIGVuZGlmCitpZmRlZiBCT0FSRF9VU0VTX1BST0RVQ1RJTUFHRQorcmVjb3ZlcnlfYnVpbGRfcHJvcHMgKz0gJChJTlNUQUxMRURfUFJPRFVDVF9CVUlMRF9QUk9QX1RBUkdFVCkKK2VuZGlmCiByZWNvdmVyeV9yZXNvdXJjZXNfY29tbW9uIDo9ICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCByZWNvdmVyeSkvcmVzCiAKICMgU2V0IHJlY292ZXJ5X2RlbnNpdHkgdG8gdGhlIGRlbnNpdHkgYnVja2V0IG9mIHRoZSBkZXZpY2UuCkBAIC0xMTIwLDMzICsxMjc4LDMzIEBACiByZWNvdmVyeV93aXBlIDo9CiBlbmRpZgogCi0jIFByaW9yIHRvIEEvQiB1cGRhdGUsIHdlIHVzZWQgdG8gaGF2ZToKKyMgVHJhZGl0aW9uYWxseSB3aXRoIG5vbi1BL0IgT1RBIHdlIGhhdmU6CiAjICAgYm9vdC5pbWcgKyByZWNvdmVyeS1mcm9tLWJvb3QucCArIHJlY292ZXJ5LXJlc291cmNlLmRhdCA9IHJlY292ZXJ5LmltZy4KLSMgcmVjb3ZlcnktcmVzb3VyY2UuZGF0IGlzIG5lZWRlZCBvbmx5IGlmIHdlIGNhcnJ5IGEgcGF0Y2ggb2YgdGhlIGJvb3QgYW5kCi0jIHJlY292ZXJ5IGltYWdlcyBhbmQgaW52b2tlIGluc3RhbGwtcmVjb3Zlcnkuc2ggb24gdGhlIGZpcnN0IGJvb3QgcG9zdCBhbgotIyBPVEEgdXBkYXRlLgorIyByZWNvdmVyeS1yZXNvdXJjZS5kYXQgaXMgbmVlZGVkIG9ubHkgaWYgd2UgY2FycnkgYW4gaW1nZGlmZiBwYXRjaCBvZiB0aGUgYm9vdCBhbmQgcmVjb3ZlcnkgaW1hZ2VzCisjIGFuZCBpbnZva2UgaW5zdGFsbC1yZWNvdmVyeS5zaCBvbiB0aGUgZmlyc3QgYm9vdCBwb3N0IGFuIE9UQSB1cGRhdGUuCiAjCiAjIFdlIG5vIGxvbmdlciBuZWVkIHRoYXQgaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBob2xkczoKLSMgICBhKSBXZSBjYXJyeSBhIGZ1bGwgY29weSBvZiB0aGUgcmVjb3ZlcnkgaW1hZ2UKKyMgICBhKSBXZSBjYXJyeSBhIGZ1bGwgY29weSBvZiB0aGUgcmVjb3ZlcnkgaW1hZ2UgLSBubyBwYXRjaGluZyBuZWVkZWQKICMgICAgICAoQk9BUkRfVVNFU19GVUxMX1JFQ09WRVJZX0lNQUdFID0gdHJ1ZSk7Ci0jICAgYikgV2UgYnVpbGQgYSBzaW5nbGUgaW1hZ2UgdGhhdCBjb250YWlucyBib290IGFuZCByZWNvdmVyeSBib3RoCi0jICAgICAgKEJPQVJEX1VTRVNfUkVDT1ZFUllfQVNfQk9PVCA9IHRydWUpLgorIyAgIGIpIFdlIGJ1aWxkIGEgc2luZ2xlIGltYWdlIHRoYXQgY29udGFpbnMgYm9vdCBhbmQgcmVjb3ZlcnkgYm90aCAtIG5vIHJlY292ZXJ5IGltYWdlIHRvIGluc3RhbGwKKyMgICAgICAoQk9BUkRfVVNFU19SRUNPVkVSWV9BU19CT09UID0gdHJ1ZSk7CisjICAgYykgV2UgYnVpbGQgdGhlIHJvb3QgaW50byBzeXN0ZW0gaW1hZ2UgLSBub3QgbmVlZGluZyB0aGUgcmVzb3VyY2UgZmlsZSBhcyB3ZSBkbyBic2RpZmYKKyMgICAgICAoQk9BUkRfQlVJTERfU1lTVEVNX1JPT1RfSU1BR0UgPSB0cnVlKS4KKyMgICBkKSBXZSBpbmNsdWRlIHRoZSByZWNvdmVyeSBEVEJPIGltYWdlIHdpdGhpbiByZWNvdmVyeSAtIG5vdCBuZWVkaW5nIHRoZSByZXNvdXJjZSBmaWxlIGFzIHdlCisjICAgICAgZG8gYnNkaWZmIGJlY2F1c2UgYm9vdCBhbmQgcmVjb3Zlcnkgd2lsbCBjb250YWluIGRpZmZlcmVudCBudW1iZXIgb2YgZW50cmllcworIyAgICAgIChCT0FSRF9JTkNMVURFX1JFQ09WRVJZX0RUQk8gPSB0cnVlKS4KKyMgTm90ZSB0aGF0IGNvbmRpdGlvbiBiKSBpbXBsaWVzIGNvbmRpdGlvbiBjKSwgYmVjYXVzZSBvZiB0aGUgZWFybGllciBjaGVjayBpbiB0aGlzIGZpbGU6CisjICJCT0FSRF9VU0VTX1JFQ09WRVJZX0FTX0JPT1QgPSB0cnVlIG11c3QgaGF2ZSBCT0FSRF9CVUlMRF9TWVNURU1fUk9PVF9JTUFHRSA9IHRydWUiIChub3QgdmljZQorIyB2ZXJzYSB0aG91Z2gpLgogCi1pZmVxICgsJChmaWx0ZXIgdHJ1ZSwgJChCT0FSRF9VU0VTX0ZVTExfUkVDT1ZFUllfSU1BR0UpICQoQk9BUkRfVVNFU19SRUNPVkVSWV9BU19CT09UKSkpCitpZmVxICgsJChmaWx0ZXIgdHJ1ZSwgJChCT0FSRF9VU0VTX0ZVTExfUkVDT1ZFUllfSU1BR0UpICQoQk9BUkRfQlVJTERfU1lTVEVNX1JPT1RfSU1BR0UpIFwKKyAgJChCT0FSRF9JTkNMVURFX1JFQ09WRVJZX0RUQk8pKSkKICMgTmFtZWQgJy5kYXQnIHNvIHdlIGRvbid0IGF0dGVtcHQgdG8gdXNlIGltZ2RpZmYgZm9yIHBhdGNoaW5nIGl0LgogUkVDT1ZFUllfUkVTT1VSQ0VfWklQIDo9ICQoVEFSR0VUX09VVCkvZXRjL3JlY292ZXJ5LXJlc291cmNlLmRhdAogZWxzZQogUkVDT1ZFUllfUkVTT1VSQ0VfWklQIDo9CiBlbmRpZgogCi1pZmVxICgkKFRBUkdFVF9QUklWQVRFX1JFU19ESVJTKSwpCi0gICQoaW5mbyBObyBwcml2YXRlIHJlY292ZXJ5IHJlc291cmNlcyBmb3IgVEFSR0VUX0RFVklDRSAkKFRBUkdFVF9ERVZJQ0UpKQotZW5kaWYKLQotaWZlcSAoJChyZWNvdmVyeV9mc3RhYiksKQotICAkKGluZm8gTm8gcmVjb3ZlcnkuZnN0YWIgZm9yIFRBUkdFVF9ERVZJQ0UgJChUQVJHRVRfREVWSUNFKSkKLWVuZGlmCi0KIElOVEVSTkFMX1JFQ09WRVJZSU1BR0VfQVJHUyA6PSBcCiAJJChhZGRwcmVmaXggLS1zZWNvbmQgLCQoSU5TVEFMTEVEXzJOREJPT1RMT0FERVJfVEFSR0VUKSkgXAogCS0ta2VybmVsICQocmVjb3Zlcnlfa2VybmVsKSBcCkBAIC0xMTYyLDYgKzEzMjAsOSBAQAogaWZkZWYgQk9BUkRfS0VSTkVMX1BBR0VTSVpFCiAgIElOVEVSTkFMX1JFQ09WRVJZSU1BR0VfQVJHUyArPSAtLXBhZ2VzaXplICQoQk9BUkRfS0VSTkVMX1BBR0VTSVpFKQogZW5kaWYKK2lmZGVmIEJPQVJEX0lOQ0xVREVfUkVDT1ZFUllfRFRCTworICBJTlRFUk5BTF9SRUNPVkVSWUlNQUdFX0FSR1MgKz0gLS1yZWNvdmVyeV9kdGJvICQoQk9BUkRfUFJFQlVJTFRfRFRCT0lNQUdFKQorZW5kaWYKIAogIyBLZXlzIGF1dGhvcml6ZWQgdG8gc2lnbiBPVEEgcGFja2FnZXMgdGhpcyBidWlsZCB3aWxsIGFjY2VwdC4gIFRoZQogIyBidWlsZCBhbHdheXMgdXNlcyBkZXYta2V5cyBmb3IgdGhpczsgcmVsZWFzZSBwYWNrYWdpbmcgdG9vbHMgd2lsbApAQCAtMTE4MywzNyArMTM0NCwyMSBAQAogCiBSRUNPVkVSWUlNQUdFX0lEX0ZJTEUgOj0gJChQUk9EVUNUX09VVCkvcmVjb3ZlcnkuaWQKIAotIyAkKDEpOiBtb2R1bGVzIGxpc3QKLSMgJCgyKTogb3V0cHV0IGRpcgotIyAkKDMpOiBtb3VudCBwb2ludAotIyAkKDQpOiBzdGFnaW5nIGRpcgotIyBEZXBtb2QgcmVxdWlyZXMgYSB3ZWxsLWZvcm1lZCBrZXJuZWwgdmVyc2lvbiBzbyAwLjAgaXMgdXNlZCBhcyBhIHBsYWNlaG9sZGVyLgotZGVmaW5lIGJ1aWxkLWltYWdlLWtlcm5lbC1tb2R1bGVzCi0gICAgJChoaWRlKSBybSAtcmYgJCgyKS9saWIvbW9kdWxlcwotICAgICQoaGlkZSkgbWtkaXIgLXAgJCgyKS9saWIvbW9kdWxlcwotICAgICQoaGlkZSkgY3AgJCgxKSAkKDIpL2xpYi9tb2R1bGVzLwotICAgICQoaGlkZSkgcm0gLXJmICQoNCkKLSAgICAkKGhpZGUpIG1rZGlyIC1wICQoNCkvbGliL21vZHVsZXMvMC4wLyQoMylsaWIvbW9kdWxlcwotICAgICQoaGlkZSkgY3AgJCgxKSAkKDQpL2xpYi9tb2R1bGVzLzAuMC8kKDMpbGliL21vZHVsZXMKLSAgICAkKGhpZGUpICQoREVQTU9EKSAtYiAkKDQpIDAuMAotICAgICQoaGlkZSkgc2VkIC1lICdzL1woLiptb2R1bGVzLipcKTovXC9cMTovZycgLWUgJ3MvIFwoW14gXSptb2R1bGVzW14gXSpcKS8gXC9cMS9nJyAkKDQpL2xpYi9tb2R1bGVzLzAuMC9tb2R1bGVzLmRlcCA+ICQoMikvbGliL21vZHVsZXMvbW9kdWxlcy5kZXAKLSAgICAkKGhpZGUpIGNwICQoNCkvbGliL21vZHVsZXMvMC4wL21vZHVsZXMuYWxpYXMgJCgyKS9saWIvbW9kdWxlcwotZW5kZWYKLQogIyAkKDEpOiBvdXRwdXQgZmlsZQogZGVmaW5lIGJ1aWxkLXJlY292ZXJ5aW1hZ2UtdGFyZ2V0Ci0gIEBlY2hvIC0tLS0tIE1ha2luZyByZWNvdmVyeSBpbWFnZSAtLS0tLS0KKyAgIyBNYWtpbmcgcmVjb3ZlcnkgaW1hZ2UKICAgJChoaWRlKSBta2RpciAtcCAkKFRBUkdFVF9SRUNPVkVSWV9PVVQpCiAgICQoaGlkZSkgbWtkaXIgLXAgJChUQVJHRVRfUkVDT1ZFUllfUk9PVF9PVVQpL2V0YyAkKFRBUkdFVF9SRUNPVkVSWV9ST09UX09VVCkvc2RjYXJkICQoVEFSR0VUX1JFQ09WRVJZX1JPT1RfT1VUKS90bXAKLSAgQGVjaG8gQ29weWluZyBiYXNlbGluZSByYW1kaXNrLi4uCisgICMgQ29weWluZyBiYXNlbGluZSByYW1kaXNrLi4uCiAgICMgVXNlIHJzeW5jIGJlY2F1c2UgImNwIC1SZiIgZmFpbHMgdG8gb3ZlcndyaXRlIGJyb2tlbiBzeW1saW5rcyBvbiBNYWMuCiAgICQoaGlkZSkgcnN5bmMgLWEgLS1leGNsdWRlPWV0YyAtLWV4Y2x1ZGU9c2RjYXJkICQoSUdOT1JFX1JFQ09WRVJZX1NFUE9MSUNZKSAkKElHTk9SRV9DQUNIRV9MSU5LKSAkKFRBUkdFVF9ST09UX09VVCkgJChUQVJHRVRfUkVDT1ZFUllfT1VUKQogICAjIENvcHkgYWRiZCBmcm9tIHN5c3RlbS9iaW4gdG8gcmVjb3Zlcnkvcm9vdC9zYmluCiAgICQoaGlkZSkgY3AgLWYgJChUQVJHRVRfT1VUX0VYRUNVVEFCTEVTKS9hZGJkICQoVEFSR0VUX1JFQ09WRVJZX1JPT1RfT1VUKS9zYmluL2FkYmQKLSAgQGVjaG8gTW9kaWZ5aW5nIHJhbWRpc2sgY29udGVudHMuLi4KKyAgIyBNb2RpZnlpbmcgcmFtZGlzayBjb250ZW50cy4uLgogICAkKGlmICQoQk9BUkRfUkVDT1ZFUllfS0VSTkVMX01PRFVMRVMpLCBcCiAgICAgJChjYWxsIGJ1aWxkLWltYWdlLWtlcm5lbC1tb2R1bGVzLCQoQk9BUkRfUkVDT1ZFUllfS0VSTkVMX01PRFVMRVMpLCQoVEFSR0VUX1JFQ09WRVJZX1JPT1RfT1VUKSwsJChjYWxsIGludGVybWVkaWF0ZXMtZGlyLWZvcixQQUNLQUdJTkcsZGVwbW9kX3JlY292ZXJ5KSkpCi0gICQoaGlkZSkgcm0gLWYgJChUQVJHRVRfUkVDT1ZFUllfUk9PVF9PVVQpL2luaXQqLnJjCisgICMgUmVtb3ZlcyAkKFRBUkdFVF9SRUNPVkVSWV9ST09UX09VVCkvaW5pdCoucmMgRVhDRVBUIGluaXQucmVjb3ZlcnkqLnJjLgorICAkKGhpZGUpIGZpbmQgJChUQVJHRVRfUkVDT1ZFUllfUk9PVF9PVVQpIC1tYXhkZXB0aCAxIC1uYW1lICdpbml0Ki5yYycgLXR5cGUgZiAtbm90IC1uYW1lICJpbml0LnJlY292ZXJ5LioucmMiIHwgeGFyZ3Mgcm0gLWYKICAgJChoaWRlKSBjcCAtZiAkKHJlY292ZXJ5X2luaXRyYykgJChUQVJHRVRfUkVDT1ZFUllfUk9PVF9PVVQpLwogICAkKGhpZGUpIGNwICQoVEFSR0VUX1JPT1RfT1VUKS9pbml0LnJlY292ZXJ5LioucmMgJChUQVJHRVRfUkVDT1ZFUllfUk9PVF9PVVQpLyB8fCB0cnVlICMgSWdub3JlIGVycm9yIHdoZW4gdGhlIHNyYyBmaWxlIGRvZXNuJ3QgZXhpc3QuCiAgICQoaGlkZSkgbWtkaXIgLXAgJChUQVJHRVRfUkVDT1ZFUllfUk9PVF9PVVQpL3JlcwpAQCAtMTI1MiwxNiArMTM5NywxMyBAQAogICApCiAgICQoaWYgJChmaWx0ZXIgdHJ1ZSwkKFBST0RVQ1RTLiQoSU5URVJOQUxfUFJPRFVDVCkuUFJPRFVDVF9TVVBQT1JUU19WQk9PVCkpLCBcCiAgICAgJChWQk9PVF9TSUdORVIpICQoRlVUSUxJVFkpICQoMSkudW5zaWduZWQgJChQUk9EVUNUUy4kKElOVEVSTkFMX1BST0RVQ1QpLlBST0RVQ1RfVkJPT1RfU0lHTklOR19LRVkpLnZicHViayAkKFBST0RVQ1RTLiQoSU5URVJOQUxfUFJPRFVDVCkuUFJPRFVDVF9WQk9PVF9TSUdOSU5HX0tFWSkudmJwcml2ayAkKFBST0RVQ1RTLiQoSU5URVJOQUxfUFJPRFVDVCkuUFJPRFVDVF9WQk9PVF9TSUdOSU5HX1NVQktFWSkudmJwcml2ayAkKDEpLmtleWJsb2NrICQoMSkpCi0gICQoaWYgJChhbmQgJChmaWx0ZXIgdHJ1ZSwkKEJPQVJEX1VTRVNfUkVDT1ZFUllfQVNfQk9PVCkpLCQoZmlsdGVyIHRydWUsJChCT0FSRF9BVkJfRU5BQkxFKSkpLCBcCi0gICAgICAkKGhpZGUpICQoQVZCVE9PTCkgYWRkX2hhc2hfZm9vdGVyIFwKLSAgICAgICAgLS1pbWFnZSAkKDEpIFwKLSAgICAgICAgLS1wYXJ0aXRpb25fc2l6ZSAkKEJPQVJEX0JPT1RJTUFHRV9QQVJUSVRJT05fU0laRSkgXAotICAgICAgICAtLXBhcnRpdGlvbl9uYW1lIGJvb3QgJChJTlRFUk5BTF9BVkJfQk9PVF9TSUdOSU5HX0FSR1MpIFwKLSAgICAgICAgJChCT0FSRF9BVkJfQk9PVF9BRERfSEFTSF9GT09URVJfQVJHUykpCiAgICQoaWYgJChmaWx0ZXIgdHJ1ZSwkKEJPQVJEX1VTRVNfUkVDT1ZFUllfQVNfQk9PVCkpLCBcCi0gICAgJChoaWRlKSAkKGNhbGwgYXNzZXJ0LW1heC1pbWFnZS1zaXplLCQoMSksJChCT0FSRF9CT09USU1BR0VfUEFSVElUSU9OX1NJWkUpKSwgXAotICAgICQoaGlkZSkgJChjYWxsIGFzc2VydC1tYXgtaW1hZ2Utc2l6ZSwkKDEpLCQoQk9BUkRfUkVDT1ZFUllJTUFHRV9QQVJUSVRJT05fU0laRSkpKQotICBAZWNobyAtLS0tLSBNYWRlIHJlY292ZXJ5IGltYWdlOiAkKDEpIC0tLS0tLS0tCisgICAgJChoaWRlKSAkKGNhbGwgYXNzZXJ0LW1heC1pbWFnZS1zaXplLCQoMSksJChjYWxsIGdldC1oYXNoLWltYWdlLW1heC1zaXplLCQoQk9BUkRfQk9PVElNQUdFX1BBUlRJVElPTl9TSVpFKSkpLCBcCisgICAgJChoaWRlKSAkKGNhbGwgYXNzZXJ0LW1heC1pbWFnZS1zaXplLCQoMSksJChjYWxsIGdldC1oYXNoLWltYWdlLW1heC1zaXplLCQoQk9BUkRfUkVDT1ZFUllJTUFHRV9QQVJUSVRJT05fU0laRSkpKSkKKyAgJChpZiAkKGZpbHRlciB0cnVlLCQoQk9BUkRfQVZCX0VOQUJMRSkpLCBcCisgICAgJChpZiAkKGZpbHRlciB0cnVlLCQoQk9BUkRfVVNFU19SRUNPVkVSWV9BU19CT09UKSksIFwKKyAgICAgICQoaGlkZSkgJChBVkJUT09MKSBhZGRfaGFzaF9mb290ZXIgLS1pbWFnZSAkKDEpIC0tcGFydGl0aW9uX3NpemUgJChCT0FSRF9CT09USU1BR0VfUEFSVElUSU9OX1NJWkUpIC0tcGFydGl0aW9uX25hbWUgYm9vdCAkKElOVEVSTkFMX0FWQl9CT09UX1NJR05JTkdfQVJHUykgJChCT0FSRF9BVkJfQk9PVF9BRERfSEFTSF9GT09URVJfQVJHUyksXAorICAgICAgJChoaWRlKSAkKEFWQlRPT0wpIGFkZF9oYXNoX2Zvb3RlciAtLWltYWdlICQoMSkgLS1wYXJ0aXRpb25fc2l6ZSAkKEJPQVJEX1JFQ09WRVJZSU1BR0VfUEFSVElUSU9OX1NJWkUpIC0tcGFydGl0aW9uX25hbWUgcmVjb3ZlcnkgJChJTlRFUk5BTF9BVkJfUkVDT1ZFUllfU0lHTklOR19BUkdTKSAkKEJPQVJEX0FWQl9SRUNPVkVSWV9BRERfSEFTSF9GT09URVJfQVJHUykpKQogZW5kZWYKIAogQURCRCA6PSAkKFRBUkdFVF9PVVRfRVhFQ1VUQUJMRVMpL2FkYmQKQEAgLTEzMjQsMTIgKzE0NjYsMTIgQEAKIC5QSE9OWTogcmVjb3ZlcnlpbWFnZQogcmVjb3ZlcnlpbWFnZTogJChJTlNUQUxMRURfUkVDT1ZFUllJTUFHRV9UQVJHRVQpICQoUkVDT1ZFUllfUkVTT1VSQ0VfWklQKQogCi1pZmVxICgkKEJPQVJEX05BTkRfUEFHRV9TSVpFKSwpCi1CT0FSRF9OQU5EX1BBR0VfU0laRSA6PSAyMDQ4CitpZm5lcSAoJChCT0FSRF9OQU5EX1BBR0VfU0laRSksKQorJChlcnJvciBNVEQgZGV2aWNlIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQgYW5kIHRodXMgQk9BUkRfTkFORF9QQUdFX1NJWkUgaXMgZGVwcmVjYXRlZC4pCiBlbmRpZgogCi1pZmVxICgkKEJPQVJEX05BTkRfU1BBUkVfU0laRSksKQotQk9BUkRfTkFORF9TUEFSRV9TSVpFIDo9IDY0CitpZm5lcSAoJChCT0FSRF9OQU5EX1NQQVJFX1NJWkUpLCkKKyQoZXJyb3IgTVREIGRldmljZSBpcyBubyBsb25nZXIgc3VwcG9ydGVkIGFuZCB0aHVzIEJPQVJEX05BTkRfU1BBUkVfU0laRSBpcyBkZXByZWNhdGVkLikKIGVuZGlmCiAKICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTEzNDQsNyArMTQ4Niw4IEBACiAgICAgJChBTExfR0VORVJBVEVEX1NPVVJDRVMpIFwKICAgICAkKEFMTF9ERUZBVUxUX0lOU1RBTExFRF9NT0RVTEVTKSBcCiAgICAgJChQREtfRlVTSU9OX1NZU0lNR19GSUxFUykgXAotICAgICQoUkVDT1ZFUllfUkVTT1VSQ0VfWklQKSkKKyAgICAkKFJFQ09WRVJZX1JFU09VUkNFX1pJUCkpIFwKKyAgICAkKFBES19GVVNJT05fU1lNTElOS19TVEFNUCkKIAogRlVMTF9TWVNURU1JTUFHRV9ERVBTIDo9ICQoSU5URVJOQUxfU1lTVEVNSU1BR0VfRklMRVMpICQoSU5URVJOQUxfVVNFUklNQUdFU19ERVBTKQogCkBAIC0xMzY4LDcgKzE1MTEsNyBAQAogCUBta2RpciAtcCAkKGRpciAkQCkKIAlAcm0gLWYgJEAKIAkkKGhpZGUpICQoRklMRVNMSVNUKSAkKFRBUkdFVF9PVVQpID4gJChAOi50eHQ9Lmpzb24pCi0JJChoaWRlKSBidWlsZC90b29scy9maWxlc2xpc3RfdXRpbC5weSAtYyAkKEA6LnR4dD0uanNvbikgPiAkQAorCSQoaGlkZSkgYnVpbGQvbWFrZS90b29scy9maWxlc2xpc3RfdXRpbC5weSAtYyAkKEA6LnR4dD0uanNvbikgPiAkQAogCiAuUEhPTlk6IGluc3RhbGxlZC1maWxlLWxpc3QKIGluc3RhbGxlZC1maWxlLWxpc3Q6ICQoSU5TVEFMTEVEX0ZJTEVTX0ZJTEUpCkBAIC0xMzk0LDIzICsxNTM3LDM2IEBACiBlbmRlZgogZW5kaWYKIAorIyBDcmVhdGUgc3ltbGluayAvc3lzdGVtL3Byb2R1Y3QgdG8gL3Byb2R1Y3QgaWYgbmVjZXNzYXJ5LgoraWZkZWYgQk9BUkRfVVNFU19QUk9EVUNUSU1BR0UKK2RlZmluZSBjcmVhdGUtc3lzdGVtLXByb2R1Y3Qtc3ltbGluaworJChoaWRlKSBpZiBbIC1kICQoVEFSR0VUX09VVCkvcHJvZHVjdCBdICYmIFsgISAtaCAkKFRBUkdFVF9PVVQpL3Byb2R1Y3QgXTsgdGhlbiBcCisgIGVjaG8gJ05vbi1zeW1saW5rICQoVEFSR0VUX09VVCkvcHJvZHVjdCBkZXRlY3RlZCEnIDE+JjI7IFwKKyAgZWNobyAnWW91IGNhbm5vdCBpbnN0YWxsIGZpbGVzIHRvICQoVEFSR0VUX09VVCkvcHJvZHVjdCB3aGlsZSBidWlsZGluZyBhIHNlcGFyYXRlIHByb2R1Y3QuaW1nIScgMT4mMjsgXAorICBleGl0IDE7IFwKK2ZpCiskKGhpZGUpIGxuIC1zZiAvcHJvZHVjdCAkKFRBUkdFVF9PVVQpL3Byb2R1Y3QKK2VuZGVmCitlbHNlCitkZWZpbmUgY3JlYXRlLXN5c3RlbS1wcm9kdWN0LXN5bWxpbmsKK2VuZGVmCitlbmRpZgorCiAjICQoMSk6IG91dHB1dCBmaWxlCiBkZWZpbmUgYnVpbGQtc3lzdGVtaW1hZ2UtdGFyZ2V0CiAgIEBlY2hvICJUYXJnZXQgc3lzdGVtIGZzIGltYWdlOiAkKDEpIgogICAkKGNhbGwgY3JlYXRlLXN5c3RlbS12ZW5kb3Itc3ltbGluaykKKyAgJChjYWxsIGNyZWF0ZS1zeXN0ZW0tcHJvZHVjdC1zeW1saW5rKQogICBAbWtkaXIgLXAgJChkaXIgJCgxKSkgJChzeXN0ZW1pbWFnZV9pbnRlcm1lZGlhdGVzKSAmJiBybSAtcmYgJChzeXN0ZW1pbWFnZV9pbnRlcm1lZGlhdGVzKS9zeXN0ZW1faW1hZ2VfaW5mby50eHQKICAgJChjYWxsIGdlbmVyYXRlLXVzZXJpbWFnZS1wcm9wLWRpY3Rpb25hcnksICQoc3lzdGVtaW1hZ2VfaW50ZXJtZWRpYXRlcykvc3lzdGVtX2ltYWdlX2luZm8udHh0LCBcCiAgICAgICBza2lwX2ZzY2s9dHJ1ZSkKICAgJChoaWRlKSBQQVRIPSQoZm9yZWFjaCBwLCQoSU5URVJOQUxfVVNFUklNQUdFU19CSU5BUllfUEFUSFMpLCQocCk6KSQkUEFUSCBcCi0gICAgICAuL2J1aWxkL3Rvb2xzL3JlbGVhc2V0b29scy9idWlsZF9pbWFnZS5weSBcCisgICAgICBidWlsZC9tYWtlL3Rvb2xzL3JlbGVhc2V0b29scy9idWlsZF9pbWFnZS5weSBcCiAgICAgICAkKFRBUkdFVF9PVVQpICQoc3lzdGVtaW1hZ2VfaW50ZXJtZWRpYXRlcykvc3lzdGVtX2ltYWdlX2luZm8udHh0ICQoMSkgJChUQVJHRVRfT1VUKSBcCiAgICAgICB8fCAoIGVjaG8gIk91dCBvZiBzcGFjZT8gdGhlIHRyZWUgc2l6ZSBvZiAkKFRBUkdFVF9PVVQpIGlzIChNQik6ICIgMT4mMiA7XAogICAgICAgICAgICBkdSAtc20gJChUQVJHRVRfT1VUKSAxPiYyO1wKICAgICAgICAgICAgaWYgWyAiJChJTlRFUk5BTF9VU0VSSU1BR0VTX0VYVF9WQVJJQU5UKSIgPT0gImV4dDQiIF07IHRoZW4gXAogICAgICAgICAgICAgICAgbWF4c2l6ZT0kKEJPQVJEX1NZU1RFTUlNQUdFX1BBUlRJVElPTl9TSVpFKTsgXAotICAgICAgICAgICAgICAgaWYgWyAiJChCT0FSRF9IQVNfRVhUNF9SRVNFUlZFRF9CTE9DS1MpIiA9PSAidHJ1ZSIgXTsgdGhlbiBcCi0gICAgICAgICAgICAgICAgICAgbWF4c2l6ZT0kJCgobWF4c2l6ZSAtIDQwOTYgKiA0MDk2KSk7IFwKLSAgICAgICAgICAgICAgIGZpOyBcCiAgICAgICAgICAgICAgICBlY2hvICJUaGUgbWF4IGlzICQkKCggbWF4c2l6ZSAvIDEwNDg1NzYgKSkgTUIuIiAxPiYyIDtcCiAgICAgICAgICAgIGVsc2UgXAogICAgICAgICAgICAgICAgZWNobyAiVGhlIG1heCBpcyAkJCgoICQoQk9BUkRfU1lTVEVNSU1BR0VfUEFSVElUSU9OX1NJWkUpIC8gMTA0ODU3NiApKSBNQi4iIDE+JjIgO1wKQEAgLTE0MzIsMTUgKzE1ODgsMjEgQEAKICMgaW1hZ2Ugc2l6ZSBjaGVjayBjYWxjdWxhdGlvbi4KIGlmbmVxICgkKElOU1RBTExFRF9SRUNPVkVSWUlNQUdFX1RBUkdFVCksKQogaWZuZXEgKCQoQk9BUkRfVVNFU19GVUxMX1JFQ09WRVJZX0lNQUdFKSx0cnVlKQoraWZuZXEgKCwkKGZpbHRlciB0cnVlLCAkKEJPQVJEX0JVSUxEX1NZU1RFTV9ST09UX0lNQUdFKSAkKEJPQVJEX0lOQ0xVREVfUkVDT1ZFUllfRFRCTykpKQorZGlmZl90b29sIDo9ICQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL2JzZGlmZgorZWxzZQorZGlmZl90b29sIDo9ICQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL2ltZ2RpZmYKK2VuZGlmCiBpbnRlcm1lZGlhdGVzIDo9ICQoY2FsbCBpbnRlcm1lZGlhdGVzLWRpci1mb3IsUEFDS0FHSU5HLHJlY292ZXJ5X3BhdGNoKQogUkVDT1ZFUllfRlJPTV9CT09UX1BBVENIIDo9ICQoaW50ZXJtZWRpYXRlcykvcmVjb3ZlcnlfZnJvbV9ib290LnAKLSQoUkVDT1ZFUllfRlJPTV9CT09UX1BBVENIKTogJChJTlNUQUxMRURfUkVDT1ZFUllJTUFHRV9UQVJHRVQpIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChJTlNUQUxMRURfQk9PVElNQUdFX1RBUkdFVCkgXAotCQkJICAgICAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9pbWdkaWZmIFwKLQkgICAgICAgICAgICAgICAgICAgICAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9ic2RpZmYKKyQoUkVDT1ZFUllfRlJPTV9CT09UX1BBVENIKTogUFJJVkFURV9ESUZGX1RPT0wgOj0gJChkaWZmX3Rvb2wpCiskKFJFQ09WRVJZX0ZST01fQk9PVF9QQVRDSCk6IFwKKwkJJChJTlNUQUxMRURfUkVDT1ZFUllJTUFHRV9UQVJHRVQpIFwKKwkJJChJTlNUQUxMRURfQk9PVElNQUdFX1RBUkdFVCkgXAorCQkkKGRpZmZfdG9vbCkKIAlAZWNobyAiQ29uc3RydWN0IHJlY292ZXJ5IGZyb20gYm9vdCIKIAlta2RpciAtcCAkKGRpciAkQCkKLQlQQVRIPSQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpOiQkUEFUSCAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9pbWdkaWZmICQoSU5TVEFMTEVEX0JPT1RJTUFHRV9UQVJHRVQpICQoSU5TVEFMTEVEX1JFQ09WRVJZSU1BR0VfVEFSR0VUKSAkQAorCSQoUFJJVkFURV9ESUZGX1RPT0wpICQoSU5TVEFMTEVEX0JPT1RJTUFHRV9UQVJHRVQpICQoSU5TVEFMTEVEX1JFQ09WRVJZSU1BR0VfVEFSR0VUKSAkQAogZWxzZSAjICQoQk9BUkRfVVNFU19GVUxMX1JFQ09WRVJZX0lNQUdFKSA9PSB0cnVlCiBSRUNPVkVSWV9GUk9NX0JPT1RfUEFUQ0ggOj0gJChJTlNUQUxMRURfUkVDT1ZFUllJTUFHRV9UQVJHRVQpCiBlbmRpZgpAQCAtMTQ3NSw2ICsxNjM3LDcgQEAKIGRlZmluZSBidWlsZC1zeXN0ZW10YXJiYWxsLXRhcmdldAogICAkKGNhbGwgcHJldHR5LCJUYXJnZXQgc3lzdGVtIGZzIHRhcmJhbGw6ICQoSU5TVEFMTEVEX1NZU1RFTVRBUkJBTExfVEFSR0VUKSIpCiAgICQoY2FsbCBjcmVhdGUtc3lzdGVtLXZlbmRvci1zeW1saW5rKQorICAkKGNhbGwgY3JlYXRlLXN5c3RlbS1wcm9kdWN0LXN5bWxpbmspCiAgICQoTUtUQVJCQUxMKSAkKEZTX0dFVF9TVEFUUykgXAogICAgICQoUFJPRFVDVF9PVVQpIHN5c3RlbSAkKFBSSVZBVEVfU1lTVEVNX1RBUikgXAogICAgICQoSU5TVEFMTEVEX1NZU1RFTVRBUkJBTExfVEFSR0VUKSAkKFRBUkdFVF9PVVQpCkBAIC0xNTU1LDYgKzE3MTgsMTAgQEAKIAkkKGhpZGUpIGNkICQoZGlyICRAKSAmJiB6aXAgLXFyeVggJChub3RkaXIgJEApIFwKIAkJJChUQVJHRVRfQ09QWV9PVVRfVkVORE9SKQogZW5kaWYKK2lmZGVmIEJPQVJEX1BST0RVQ1RJTUFHRV9GSUxFX1NZU1RFTV9UWVBFCisJJChoaWRlKSBjZCAkKGRpciAkQCkgJiYgemlwIC1xcnlYICQobm90ZGlyICRAKSBcCisJCSQoVEFSR0VUX0NPUFlfT1VUX1BST0RVQ1QpCitlbmRpZgogaWZuZXEgKCQoUERLX1BMQVRGT1JNX0pBVkFfWklQX0NPTlRFTlRTKSwpCiAJJChoaWRlKSBjZCAkKE9VVF9ESVIpICYmIHppcCAtcXJ5WCAkKHBhdHN1YnN0ICQoT1VUX0RJUikvJSwlLCRAKSAkKFBES19QTEFURk9STV9KQVZBX1pJUF9DT05URU5UUykKIGVuZGlmCkBAIC0xNTYzLDcgKzE3MzAsOCBAQAogZW5kaWYKIAlAIyBBZGQgZGV4LXByZW9wdCBmaWxlcyBhbmQgY29uZmlnLgogCSQoaWYgJChQUklWQVRFX0RFWF9GSUxFUyksJChoaWRlKSBjZCAkKE9VVF9ESVIpICYmIHppcCAtcXJ5WCAkKHBhdHN1YnN0ICQoT1VUX0RJUikvJSwlLCRAICQoUFJJVkFURV9ERVhfRklMRVMpKSkKLQkkKGhpZGUpIHppcCAtcXJ5WGogJEAgJChQUklWQVRFX09ERVhfQ09ORklHKQorCSQoaGlkZSkgdG91Y2ggJChQUk9EVUNUX09VVCkvcGRrLm1rCisJJChoaWRlKSB6aXAgLXFyeVhqICRAICQoUFJJVkFURV9PREVYX0NPTkZJRykgJChQUk9EVUNUX09VVCkvcGRrLm1rCiAKIC5QSE9OWTogcGxhdGZvcm0KIHBsYXRmb3JtOiAkKElOU1RBTExFRF9QTEFURk9STV9aSVApCkBAIC0xNjI4LDcgKzE3OTYsNyBAQAogICBAbWtkaXIgLXAgJCh1c2VyZGF0YWltYWdlX2ludGVybWVkaWF0ZXMpICYmIHJtIC1yZiAkKHVzZXJkYXRhaW1hZ2VfaW50ZXJtZWRpYXRlcykvdXNlcmRhdGFfaW1hZ2VfaW5mby50eHQKICAgJChjYWxsIGdlbmVyYXRlLXVzZXJpbWFnZS1wcm9wLWRpY3Rpb25hcnksICQodXNlcmRhdGFpbWFnZV9pbnRlcm1lZGlhdGVzKS91c2VyZGF0YV9pbWFnZV9pbmZvLnR4dCwgc2tpcF9mc2NrPXRydWUpCiAgICQoaGlkZSkgUEFUSD0kKGZvcmVhY2ggcCwkKElOVEVSTkFMX1VTRVJJTUFHRVNfQklOQVJZX1BBVEhTKSwkKHApOikkJFBBVEggXAotICAgICAgLi9idWlsZC90b29scy9yZWxlYXNldG9vbHMvYnVpbGRfaW1hZ2UucHkgXAorICAgICAgYnVpbGQvbWFrZS90b29scy9yZWxlYXNldG9vbHMvYnVpbGRfaW1hZ2UucHkgXAogICAgICAgJChUQVJHRVRfT1VUX0RBVEEpICQodXNlcmRhdGFpbWFnZV9pbnRlcm1lZGlhdGVzKS91c2VyZGF0YV9pbWFnZV9pbmZvLnR4dCAkKElOU1RBTExFRF9VU0VSREFUQUlNQUdFX1RBUkdFVCkgJChUQVJHRVRfT1VUKQogICAkKGhpZGUpICQoY2FsbCBhc3NlcnQtbWF4LWltYWdlLXNpemUsJChJTlNUQUxMRURfVVNFUkRBVEFJTUFHRV9UQVJHRVQpLCQoQk9BUkRfVVNFUkRBVEFJTUFHRV9QQVJUSVRJT05fU0laRSkpCiBlbmRlZgpAQCAtMTczNSw3ICsxOTAzLDcgQEAKICAgQG1rZGlyIC1wICQoY2FjaGVpbWFnZV9pbnRlcm1lZGlhdGVzKSAmJiBybSAtcmYgJChjYWNoZWltYWdlX2ludGVybWVkaWF0ZXMpL2NhY2hlX2ltYWdlX2luZm8udHh0CiAgICQoY2FsbCBnZW5lcmF0ZS11c2VyaW1hZ2UtcHJvcC1kaWN0aW9uYXJ5LCAkKGNhY2hlaW1hZ2VfaW50ZXJtZWRpYXRlcykvY2FjaGVfaW1hZ2VfaW5mby50eHQsIHNraXBfZnNjaz10cnVlKQogICAkKGhpZGUpIFBBVEg9JChmb3JlYWNoIHAsJChJTlRFUk5BTF9VU0VSSU1BR0VTX0JJTkFSWV9QQVRIUyksJChwKTopJCRQQVRIIFwKLSAgICAgIC4vYnVpbGQvdG9vbHMvcmVsZWFzZXRvb2xzL2J1aWxkX2ltYWdlLnB5IFwKKyAgICAgIGJ1aWxkL21ha2UvdG9vbHMvcmVsZWFzZXRvb2xzL2J1aWxkX2ltYWdlLnB5IFwKICAgICAgICQoVEFSR0VUX09VVF9DQUNIRSkgJChjYWNoZWltYWdlX2ludGVybWVkaWF0ZXMpL2NhY2hlX2ltYWdlX2luZm8udHh0ICQoSU5TVEFMTEVEX0NBQ0hFSU1BR0VfVEFSR0VUKSAkKFRBUkdFVF9PVVQpCiAgICQoaGlkZSkgJChjYWxsIGFzc2VydC1tYXgtaW1hZ2Utc2l6ZSwkKElOU1RBTExFRF9DQUNIRUlNQUdFX1RBUkdFVCksJChCT0FSRF9DQUNIRUlNQUdFX1BBUlRJVElPTl9TSVpFKSkKIGVuZGVmCkBAIC0xNzcwLDcgKzE5MzgsOCBAQAogSU5URVJOQUxfU1lTVEVNT1RIRVJJTUFHRV9GSUxFUyA6PSBcCiAgICAgJChmaWx0ZXIgJChUQVJHRVRfT1VUX1NZU1RFTV9PVEhFUikvJSxcCiAgICAgICAkKEFMTF9ERUZBVUxUX0lOU1RBTExFRF9NT0RVTEVTKVwKLSAgICAgICQoQUxMX1BES19GVVNJT05fRklMRVMpKQorICAgICAgJChBTExfUERLX0ZVU0lPTl9GSUxFUykpIFwKKyAgICAkKFBES19GVVNJT05fU1lNTElOS19TVEFNUCkKIAogSU5TVEFMTEVEX0ZJTEVTX0ZJTEVfU1lTVEVNT1RIRVIgOj0gJChQUk9EVUNUX09VVCkvaW5zdGFsbGVkLWZpbGVzLXN5c3RlbS1vdGhlci50eHQKICQoSU5TVEFMTEVEX0ZJTEVTX0ZJTEVfU1lTVEVNT1RIRVIpIDogJChJTlRFUk5BTF9TWVNURU1PVEhFUklNQUdFX0ZJTEVTKSAkKEZJTEVTTElTVCkKQEAgLTE3NzgsNyArMTk0Nyw3IEBACiAJQG1rZGlyIC1wICQoZGlyICRAKQogCUBybSAtZiAkQAogCSQoaGlkZSkgJChGSUxFU0xJU1QpICQoVEFSR0VUX09VVF9TWVNURU1fT1RIRVIpID4gJChAOi50eHQ9Lmpzb24pCi0JJChoaWRlKSBidWlsZC90b29scy9maWxlc2xpc3RfdXRpbC5weSAtYyAkKEA6LnR4dD0uanNvbikgPiAkQAorCSQoaGlkZSkgYnVpbGQvbWFrZS90b29scy9maWxlc2xpc3RfdXRpbC5weSAtYyAkKEA6LnR4dD0uanNvbikgPiAkQAogCiBzeXN0ZW1vdGhlcmltYWdlX2ludGVybWVkaWF0ZXMgOj0gXAogICAgICQoY2FsbCBpbnRlcm1lZGlhdGVzLWRpci1mb3IsUEFDS0FHSU5HLHN5c3RlbV9vdGhlcikKQEAgLTE3OTEsMTUgKzE5NjAsMTggQEAKICAgQG1rZGlyIC1wICQoc3lzdGVtb3RoZXJpbWFnZV9pbnRlcm1lZGlhdGVzKSAmJiBybSAtcmYgJChzeXN0ZW1vdGhlcmltYWdlX2ludGVybWVkaWF0ZXMpL3N5c3RlbV9vdGhlcl9pbWFnZV9pbmZvLnR4dAogICAkKGNhbGwgZ2VuZXJhdGUtdXNlcmltYWdlLXByb3AtZGljdGlvbmFyeSwgJChzeXN0ZW1vdGhlcmltYWdlX2ludGVybWVkaWF0ZXMpL3N5c3RlbV9vdGhlcl9pbWFnZV9pbmZvLnR4dCwgc2tpcF9mc2NrPXRydWUpCiAgICQoaGlkZSkgUEFUSD0kKGZvcmVhY2ggcCwkKElOVEVSTkFMX1VTRVJJTUFHRVNfQklOQVJZX1BBVEhTKSwkKHApOikkJFBBVEggXAotICAgICAgLi9idWlsZC90b29scy9yZWxlYXNldG9vbHMvYnVpbGRfaW1hZ2UucHkgXAorICAgICAgYnVpbGQvbWFrZS90b29scy9yZWxlYXNldG9vbHMvYnVpbGRfaW1hZ2UucHkgXAogICAgICAgJChUQVJHRVRfT1VUX1NZU1RFTV9PVEhFUikgJChzeXN0ZW1vdGhlcmltYWdlX2ludGVybWVkaWF0ZXMpL3N5c3RlbV9vdGhlcl9pbWFnZV9pbmZvLnR4dCAkKElOU1RBTExFRF9TWVNURU1PVEhFUklNQUdFX1RBUkdFVCkgJChUQVJHRVRfT1VUKQogICAkKGhpZGUpICQoY2FsbCBhc3NlcnQtbWF4LWltYWdlLXNpemUsJChJTlNUQUxMRURfU1lTVEVNT1RIRVJJTUFHRV9UQVJHRVQpLCQoQk9BUkRfU1lTVEVNSU1BR0VfUEFSVElUSU9OX1NJWkUpKQogZW5kZWYKIAogIyBXZSBqdXN0IGJ1aWxkIHRoaXMgZGlyZWN0bHkgdG8gdGhlIGluc3RhbGwgbG9jYXRpb24uCiBJTlNUQUxMRURfU1lTVEVNT1RIRVJJTUFHRV9UQVJHRVQgOj0gJChCVUlMVF9TWVNURU1PVEhFUklNQUdFX1RBUkdFVCkKK2lmbmVxICh0cnVlLCQoU0FOSVRJWkVfTElURSkpCisjIE9ubHkgY3JlYXRlIHN5c3RlbV9vdGhlciB3aGVuIG5vdCBidWlsZGluZyB0aGUgc2Vjb25kIHN0YWdlIG9mIGEgU0FOSVRJWkVfTElURSBidWlsZC4KICQoSU5TVEFMTEVEX1NZU1RFTU9USEVSSU1BR0VfVEFSR0VUKTogJChJTlRFUk5BTF9VU0VSSU1BR0VTX0RFUFMpICQoSU5URVJOQUxfU1lTVEVNT1RIRVJJTUFHRV9GSUxFUykgJChJTlNUQUxMRURfRklMRVNfRklMRV9TWVNURU1PVEhFUikKIAkkKGJ1aWxkLXN5c3RlbW90aGVyaW1hZ2UtdGFyZ2V0KQorZW5kaWYKIAogLlBIT05ZOiBzeXN0ZW1vdGhlcmltYWdlLW5vZGVwcwogc3lzdGVtb3RoZXJpbWFnZS1ub2RlcHM6IHwgJChJTlRFUk5BTF9VU0VSSU1BR0VTX0RFUFMpCkBAIC0xODE0LDcgKzE5ODYsOCBAQAogSU5URVJOQUxfVkVORE9SSU1BR0VfRklMRVMgOj0gXAogICAgICQoZmlsdGVyICQoVEFSR0VUX09VVF9WRU5ET1IpLyUsXAogICAgICAgJChBTExfREVGQVVMVF9JTlNUQUxMRURfTU9EVUxFUylcCi0gICAgICAkKEFMTF9QREtfRlVTSU9OX0ZJTEVTKSkKKyAgICAgICQoQUxMX1BES19GVVNJT05fRklMRVMpKSBcCisgICAgJChQREtfRlVTSU9OX1NZTUxJTktfU1RBTVApCiAKICMgcGxhdGZvcm0uemlwIGRlcGVuZHMgb24gJChJTlRFUk5BTF9WRU5ET1JJTUFHRV9GSUxFUykuCiAkKElOU1RBTExFRF9QTEFURk9STV9aSVApIDogJChJTlRFUk5BTF9WRU5ET1JJTUFHRV9GSUxFUykKQEAgLTE4MjUsNyArMTk5OCw3IEBACiAJQG1rZGlyIC1wICQoZGlyICRAKQogCUBybSAtZiAkQAogCSQoaGlkZSkgJChGSUxFU0xJU1QpICQoVEFSR0VUX09VVF9WRU5ET1IpID4gJChAOi50eHQ9Lmpzb24pCi0JJChoaWRlKSBidWlsZC90b29scy9maWxlc2xpc3RfdXRpbC5weSAtYyAkKEA6LnR4dD0uanNvbikgPiAkQAorCSQoaGlkZSkgYnVpbGQvbWFrZS90b29scy9maWxlc2xpc3RfdXRpbC5weSAtYyAkKEA6LnR4dD0uanNvbikgPiAkQAogCiB2ZW5kb3JpbWFnZV9pbnRlcm1lZGlhdGVzIDo9IFwKICAgICAkKGNhbGwgaW50ZXJtZWRpYXRlcy1kaXItZm9yLFBBQ0tBR0lORyx2ZW5kb3IpCkBAIC0xODM4LDcgKzIwMTEsNyBAQAogICAkKGlmICQoQk9BUkRfVkVORE9SX0tFUk5FTF9NT0RVTEVTKSwgXAogICAgICQoY2FsbCBidWlsZC1pbWFnZS1rZXJuZWwtbW9kdWxlcywkKEJPQVJEX1ZFTkRPUl9LRVJORUxfTU9EVUxFUyksJChUQVJHRVRfT1VUX1ZFTkRPUiksdmVuZG9yLywkKGNhbGwgaW50ZXJtZWRpYXRlcy1kaXItZm9yLFBBQ0tBR0lORyxkZXBtb2RfdmVuZG9yKSkpCiAgICQoaGlkZSkgUEFUSD0kKGZvcmVhY2ggcCwkKElOVEVSTkFMX1VTRVJJTUFHRVNfQklOQVJZX1BBVEhTKSwkKHApOikkJFBBVEggXAotICAgICAgLi9idWlsZC90b29scy9yZWxlYXNldG9vbHMvYnVpbGRfaW1hZ2UucHkgXAorICAgICAgYnVpbGQvbWFrZS90b29scy9yZWxlYXNldG9vbHMvYnVpbGRfaW1hZ2UucHkgXAogICAgICAgJChUQVJHRVRfT1VUX1ZFTkRPUikgJCh2ZW5kb3JpbWFnZV9pbnRlcm1lZGlhdGVzKS92ZW5kb3JfaW1hZ2VfaW5mby50eHQgJChJTlNUQUxMRURfVkVORE9SSU1BR0VfVEFSR0VUKSAkKFRBUkdFVF9PVVQpCiAgICQoaGlkZSkgJChjYWxsIGFzc2VydC1tYXgtaW1hZ2Utc2l6ZSwkKElOU1RBTExFRF9WRU5ET1JJTUFHRV9UQVJHRVQpLCQoQk9BUkRfVkVORE9SSU1BR0VfUEFSVElUSU9OX1NJWkUpKQogZW5kZWYKQEAgLTE4NjAsNiArMjAzMyw1NiBAQAogZW5kaWYKIAogIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBwcm9kdWN0IHBhcnRpdGlvbiBpbWFnZQoraWZkZWYgQk9BUkRfUFJPRFVDVElNQUdFX0ZJTEVfU1lTVEVNX1RZUEUKK0lOVEVSTkFMX1BST0RVQ1RJTUFHRV9GSUxFUyA6PSBcCisgICAgJChmaWx0ZXIgJChUQVJHRVRfT1VUX1BST0RVQ1QpLyUsXAorICAgICAgJChBTExfREVGQVVMVF9JTlNUQUxMRURfTU9EVUxFUylcCisgICAgICAkKEFMTF9QREtfRlVTSU9OX0ZJTEVTKSkgXAorICAgICQoUERLX0ZVU0lPTl9TWU1MSU5LX1NUQU1QKQorCisjIHBsYXRmb3JtLnppcCBkZXBlbmRzIG9uICQoSU5URVJOQUxfUFJPRFVDVElNQUdFX0ZJTEVTKS4KKyQoSU5TVEFMTEVEX1BMQVRGT1JNX1pJUCkgOiAkKElOVEVSTkFMX1BST0RVQ1RJTUFHRV9GSUxFUykKKworSU5TVEFMTEVEX0ZJTEVTX0ZJTEVfUFJPRFVDVCA6PSAkKFBST0RVQ1RfT1VUKS9pbnN0YWxsZWQtZmlsZXMtcHJvZHVjdC50eHQKKyQoSU5TVEFMTEVEX0ZJTEVTX0ZJTEVfUFJPRFVDVCkgOiAkKElOVEVSTkFMX1BST0RVQ1RJTUFHRV9GSUxFUykgJChGSUxFU0xJU1QpCisJQGVjaG8gSW5zdGFsbGVkIGZpbGUgbGlzdDogJEAKKwlAbWtkaXIgLXAgJChkaXIgJEApCisJQHJtIC1mICRACisJJChoaWRlKSAkKEZJTEVTTElTVCkgJChUQVJHRVRfT1VUX1BST0RVQ1QpID4gJChAOi50eHQ9Lmpzb24pCisJJChoaWRlKSBidWlsZC90b29scy9maWxlc2xpc3RfdXRpbC5weSAtYyAkKEA6LnR4dD0uanNvbikgPiAkQAorCitwcm9kdWN0aW1hZ2VfaW50ZXJtZWRpYXRlcyA6PSBcCisgICAgJChjYWxsIGludGVybWVkaWF0ZXMtZGlyLWZvcixQQUNLQUdJTkcscHJvZHVjdCkKK0JVSUxUX1BST0RVQ1RJTUFHRV9UQVJHRVQgOj0gJChQUk9EVUNUX09VVCkvcHJvZHVjdC5pbWcKK2RlZmluZSBidWlsZC1wcm9kdWN0aW1hZ2UtdGFyZ2V0CisgICQoY2FsbCBwcmV0dHksIlRhcmdldCBwcm9kdWN0IGZzIGltYWdlOiAkKElOU1RBTExFRF9QUk9EVUNUSU1BR0VfVEFSR0VUKSIpCisgIEBta2RpciAtcCAkKFRBUkdFVF9PVVRfUFJPRFVDVCkKKyAgQG1rZGlyIC1wICQocHJvZHVjdGltYWdlX2ludGVybWVkaWF0ZXMpICYmIHJtIC1yZiAkKHByb2R1Y3RpbWFnZV9pbnRlcm1lZGlhdGVzKS9wcm9kdWN0X2ltYWdlX2luZm8udHh0CisgICQoY2FsbCBnZW5lcmF0ZS11c2VyaW1hZ2UtcHJvcC1kaWN0aW9uYXJ5LCAkKHByb2R1Y3RpbWFnZV9pbnRlcm1lZGlhdGVzKS9wcm9kdWN0X2ltYWdlX2luZm8udHh0LCBza2lwX2ZzY2s9dHJ1ZSkKKyAgJChoaWRlKSBQQVRIPSQoZm9yZWFjaCBwLCQoSU5URVJOQUxfVVNFUklNQUdFU19CSU5BUllfUEFUSFMpLCQocCk6KSQkUEFUSCBcCisgICAgICAuL2J1aWxkL3Rvb2xzL3JlbGVhc2V0b29scy9idWlsZF9pbWFnZS5weSBcCisgICAgICAkKFRBUkdFVF9PVVRfUFJPRFVDVCkgJChwcm9kdWN0aW1hZ2VfaW50ZXJtZWRpYXRlcykvcHJvZHVjdF9pbWFnZV9pbmZvLnR4dCAkKElOU1RBTExFRF9QUk9EVUNUSU1BR0VfVEFSR0VUKSAkKFRBUkdFVF9PVVQpCisgICQoaGlkZSkgJChjYWxsIGFzc2VydC1tYXgtaW1hZ2Utc2l6ZSwkKElOU1RBTExFRF9QUk9EVUNUSU1BR0VfVEFSR0VUKSwkKEJPQVJEX1BST0RVQ1RJTUFHRV9QQVJUSVRJT05fU0laRSkpCitlbmRlZgorCisjIFdlIGp1c3QgYnVpbGQgdGhpcyBkaXJlY3RseSB0byB0aGUgaW5zdGFsbCBsb2NhdGlvbi4KK0lOU1RBTExFRF9QUk9EVUNUSU1BR0VfVEFSR0VUIDo9ICQoQlVJTFRfUFJPRFVDVElNQUdFX1RBUkdFVCkKKyQoSU5TVEFMTEVEX1BST0RVQ1RJTUFHRV9UQVJHRVQpOiAkKElOVEVSTkFMX1VTRVJJTUFHRVNfREVQUykgJChJTlRFUk5BTF9QUk9EVUNUSU1BR0VfRklMRVMpICQoSU5TVEFMTEVEX0ZJTEVTX0ZJTEVfUFJPRFVDVCkgJChCVUlMRF9JTUFHRV9TUkNTKQorCSQoYnVpbGQtcHJvZHVjdGltYWdlLXRhcmdldCkKKworLlBIT05ZOiBwcm9kdWN0aW1hZ2Utbm9kZXBzIHBub2QKK3Byb2R1Y3RpbWFnZS1ub2RlcHMgcG5vZDogfCAkKElOVEVSTkFMX1VTRVJJTUFHRVNfREVQUykKKwkkKGJ1aWxkLXByb2R1Y3RpbWFnZS10YXJnZXQpCisKK3N5bmM6ICQoSU5URVJOQUxfUFJPRFVDVElNQUdFX0ZJTEVTKQorCitlbHNlIGlmZGVmIEJPQVJEX1BSRUJVSUxUX1BST0RVQ1RJTUFHRQorSU5TVEFMTEVEX1BST0RVQ1RJTUFHRV9UQVJHRVQgOj0gJChQUk9EVUNUX09VVCkvcHJvZHVjdC5pbWcKKyQoZXZhbCAkKGNhbGwgY29weS1vbmUtZmlsZSwkKEJPQVJEX1BSRUJVSUxUX1BST0RVQ1RJTUFHRSksJChJTlNUQUxMRURfUFJPRFVDVElNQUdFX1RBUkdFVCkpKQorZW5kaWYKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIyBkdGJvIGltYWdlCiBpZmRlZiBCT0FSRF9QUkVCVUlMVF9EVEJPSU1BR0UKIElOU1RBTExFRF9EVEJPSU1BR0VfVEFSR0VUIDo9ICQoUFJPRFVDVF9PVVQpL2R0Ym8uaW1nCkBAIC0xODc5LDE3ICsyMTAyLDYgQEAKIAogZW5kaWYKIAotIyBDb252ZXJ0IHRvIGxvd2VyIGNhc2Ugd2l0aG91dCByZXF1aXJpbmcgYSBzaGVsbCwgd2hpY2ggaXNuJ3QgY2FjaGVhYmxlLgotdG8tbG93ZXIgPSAkKHN1YnN0IEEsYSwkKHN1YnN0IEIsYiwkKHN1YnN0IEMsYywkKHN1YnN0IEQsZCwkKHN1YnN0IEUsZSwkKHN1YnN0IEYsZiwkKHN1YnN0IEcsZyxcCi0kKHN1YnN0IEgsaCwkKHN1YnN0IEksaSwkKHN1YnN0IEosaiwkKHN1YnN0IEssaywkKHN1YnN0IEwsbCwkKHN1YnN0IE0sbSwkKHN1YnN0IE4sbiwkKHN1YnN0IE8sbyxcCi0kKHN1YnN0IFAscCwkKHN1YnN0IFEscSwkKHN1YnN0IFIsciwkKHN1YnN0IFMscywkKHN1YnN0IFQsdCwkKHN1YnN0IFUsdSwkKHN1YnN0IFYsdiwkKHN1YnN0IFcsdyxcCi0kKHN1YnN0IFgseCwkKHN1YnN0IFkseSwkKHN1YnN0IFoseiwkMSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpCi0jIENvbnZlcnQgdG8gdXBwZXIgY2FzZSB3aXRob3V0IHJlcXVpcmluZyBhIHNoZWxsLCB3aGljaCBpc24ndCBjYWNoZWFibGUuCi10by11cHBlcj0kKHN1YnN0IGEsQSwkKHN1YnN0IGIsQiwkKHN1YnN0IGMsQywkKHN1YnN0IGQsRCwkKHN1YnN0IGUsRSwkKHN1YnN0IGYsRiwkKHN1YnN0IGcsRyxcCi0kKHN1YnN0IGgsSCwkKHN1YnN0IGksSSwkKHN1YnN0IGosSiwkKHN1YnN0IGssSywkKHN1YnN0IGwsTCwkKHN1YnN0IG0sTSwkKHN1YnN0IG4sTiwkKHN1YnN0IG8sTyxcCi0kKHN1YnN0IHAsUCwkKHN1YnN0IHEsUSwkKHN1YnN0IHIsUiwkKHN1YnN0IHMsUywkKHN1YnN0IHQsVCwkKHN1YnN0IHUsVSwkKHN1YnN0IHYsViwkKHN1YnN0IHcsVyxcCi0kKHN1YnN0IHgsWCwkKHN1YnN0IHksWSwkKHN1YnN0IHosWiwkMSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpCi0KICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICMgdmJtZXRhIGltYWdlCiBpZmVxICgkKEJPQVJEX0FWQl9FTkFCTEUpLHRydWUpCkBAIC0xOTEyLDYgKzIxMjQsOCBAQAogRFRCT19GT09URVJfQVJHUyA6PSBCT0FSRF9BVkJfRFRCT19BRERfSEFTSF9GT09URVJfQVJHUwogU1lTVEVNX0ZPT1RFUl9BUkdTIDo9IEJPQVJEX0FWQl9TWVNURU1fQUREX0hBU0hUUkVFX0ZPT1RFUl9BUkdTCiBWRU5ET1JfRk9PVEVSX0FSR1MgOj0gQk9BUkRfQVZCX1ZFTkRPUl9BRERfSEFTSFRSRUVfRk9PVEVSX0FSR1MKK1JFQ09WRVJZX0ZPT1RFUl9BUkdTIDo9IEJPQVJEX0FWQl9SRUNPVkVSWV9BRERfSEFTSF9GT09URVJfQVJHUworUFJPRFVDVF9GT09URVJfQVJHUyA6PSBCT0FSRF9BVkJfUFJPRFVDVF9BRERfSEFTSFRSRUVfRk9PVEVSX0FSR1MKIAogIyBDaGVjayBhbmQgc2V0IHJlcXVpcmVkIGJ1aWxkIHZhcmlhYmxlcyBmb3IgYSBjaGFpbiBwYXJ0aXRpb24uCiAjICQoMSk6IHRoZSBwYXJ0aXRpb24gdG8gZW5hYmxlIEFWQiBjaGFpbiwgZS5nLiwgQk9PVCBvciBTWVNURU0uCkBAIC0xOTY0LDYgKzIxNzgsMTUgQEAKIGVuZGlmCiBlbmRpZgogCitpZmRlZiBJTlNUQUxMRURfUFJPRFVDVElNQUdFX1RBUkdFVAoraWZkZWYgQk9BUkRfQVZCX1BST0RVQ1RfS0VZX1BBVEgKKyQoZXZhbCAkKGNhbGwgY2hlY2stYW5kLXNldC1hdmItY2hhaW4tYXJncyxQUk9EVUNUKSkKK2Vsc2UKK0lOVEVSTkFMX0FWQl9NQUtFX1ZCTUVUQV9JTUFHRV9BUkdTICs9IFwKKyAgICAtLWluY2x1ZGVfZGVzY3JpcHRvcnNfZnJvbV9pbWFnZSAkKElOU1RBTExFRF9QUk9EVUNUSU1BR0VfVEFSR0VUKQorZW5kaWYKK2VuZGlmCisKIGlmZGVmIElOU1RBTExFRF9EVEJPSU1BR0VfVEFSR0VUCiBpZmRlZiBCT0FSRF9BVkJfRFRCT19LRVlfUEFUSAogJChldmFsICQoY2FsbCBjaGVjay1hbmQtc2V0LWF2Yi1jaGFpbi1hcmdzLERUQk8pKQpAQCAtMTk3Myw2ICsyMTk2LDE1IEBACiBlbmRpZgogZW5kaWYKIAoraWZkZWYgSU5TVEFMTEVEX1JFQ09WRVJZSU1BR0VfVEFSR0VUCitpZmRlZiBCT0FSRF9BVkJfUkVDT1ZFUllfS0VZX1BBVEgKKyQoZXZhbCAkKGNhbGwgY2hlY2stYW5kLXNldC1hdmItY2hhaW4tYXJncyxSRUNPVkVSWSkpCitlbHNlCitJTlRFUk5BTF9BVkJfTUFLRV9WQk1FVEFfSU1BR0VfQVJHUyArPSBcCisgICAgLS1pbmNsdWRlX2Rlc2NyaXB0b3JzX2Zyb21faW1hZ2UgJChJTlNUQUxMRURfUkVDT1ZFUllJTUFHRV9UQVJHRVQpCitlbmRpZgorZW5kaWYKKwogQk9BUkRfQVZCX01BS0VfVkJNRVRBX0lNQUdFX0FSR1MgKz0gLS1wYWRkaW5nX3NpemUgNDA5NgogCiAjIEFkZCBrZXJuZWwgY21kbGluZSBkZXNjcmlwdG9yIGZvciBrZXJuZWwgdG8gbW91bnQgc3lzdGVtLmltZyBhcyByb290IHdpdGgKQEAgLTIwMDgsOSArMjI0MCwxNSBAQAogICAkKGlmICQoQk9BUkRfQVZCX1ZFTkRPUl9LRVlfUEFUSCksXAogICAgICQoaGlkZSkgJChBVkJUT09MKSBleHRyYWN0X3B1YmxpY19rZXkgLS1rZXkgJChCT0FSRF9BVkJfVkVORE9SX0tFWV9QQVRIKSBcCiAgICAgICAtLW91dHB1dCAkKDEpL3ZlbmRvci5hdmJwdWJrZXkpCisgICQoaWYgJChCT0FSRF9BVkJfUFJPRFVDVF9LRVlfUEFUSCksXAorICAgICQoaGlkZSkgJChBVkJUT09MKSBleHRyYWN0X3B1YmxpY19rZXkgLS1rZXkgJChCT0FSRF9BVkJfUFJPRFVDVF9LRVlfUEFUSCkgXAorICAgICAgLS1vdXRwdXQgJCgxKS9wcm9kdWN0LmF2YnB1YmtleSkKICAgJChpZiAkKEJPQVJEX0FWQl9EVEJPX0tFWV9QQVRIKSxcCiAgICAgJChoaWRlKSAkKEFWQlRPT0wpIGV4dHJhY3RfcHVibGljX2tleSAtLWtleSAkKEJPQVJEX0FWQl9EVEJPX0tFWV9QQVRIKSBcCiAgICAgICAtLW91dHB1dCAkKDEpL2R0Ym8uYXZicHVia2V5KQorICAkKGlmICQoQk9BUkRfQVZCX1JFQ09WRVJZX0tFWV9QQVRIKSxcCisgICAgJChoaWRlKSAkKEFWQlRPT0wpIGV4dHJhY3RfcHVibGljX2tleSAtLWtleSAkKEJPQVJEX0FWQl9SRUNPVkVSWV9LRVlfUEFUSCkgXAorICAgICAgLS1vdXRwdXQgJCgxKS9yZWNvdmVyeS5hdmJwdWJrZXkpCiBlbmRlZgogCiBkZWZpbmUgYnVpbGQtdmJtZXRhaW1hZ2UtdGFyZ2V0CkBAIC0yMDI2LDcgKzIyNjQsMTUgQEAKIGVuZGVmCiAKIElOU1RBTExFRF9WQk1FVEFJTUFHRV9UQVJHRVQgOj0gJChCVUlMVF9WQk1FVEFJTUFHRV9UQVJHRVQpCi0kKElOU1RBTExFRF9WQk1FVEFJTUFHRV9UQVJHRVQpOiAkKEFWQlRPT0wpICQoSU5TVEFMTEVEX0JPT1RJTUFHRV9UQVJHRVQpICQoSU5TVEFMTEVEX1NZU1RFTUlNQUdFKSAkKElOU1RBTExFRF9WRU5ET1JJTUFHRV9UQVJHRVQpICQoSU5TVEFMTEVEX0RUQk9JTUFHRV9UQVJHRVQpICQoQk9BUkRfQVZCX0tFWV9QQVRIKQorJChJTlNUQUxMRURfVkJNRVRBSU1BR0VfVEFSR0VUKTogXAorCQkkKEFWQlRPT0wpIFwKKwkJJChJTlNUQUxMRURfQk9PVElNQUdFX1RBUkdFVCkgXAorCQkkKElOU1RBTExFRF9TWVNURU1JTUFHRSkgXAorCQkkKElOU1RBTExFRF9WRU5ET1JJTUFHRV9UQVJHRVQpIFwKKwkJJChJTlNUQUxMRURfUFJPRFVDVElNQUdFX1RBUkdFVCkgXAorCQkkKElOU1RBTExFRF9EVEJPSU1BR0VfVEFSR0VUKSBcCisJCSQoSU5TVEFMTEVEX1JFQ09WRVJZSU1BR0VfVEFSR0VUKSBcCisJCSQoQk9BUkRfQVZCX0tFWV9QQVRIKQogCSQoYnVpbGQtdmJtZXRhaW1hZ2UtdGFyZ2V0KQogCiAuUEhPTlk6IHZibWV0YWltYWdlLW5vZGVwcwpAQCAtMjA4MSw2ICsyMzI3LDcgQEAKIGlmZXEgKCQoYnVpbGRfb3RhX3BhY2thZ2UpLHRydWUpCiBPVEFUT09MUyA6PSAgJChIT1NUX09VVF9FWEVDVVRBQkxFUykvbWluaWd6aXAgXAogICAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9hYXB0IFwKKyAgJChIT1NUX09VVF9FWEVDVVRBQkxFUykvY2hlY2t2aW50ZiBcCiAgICQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL21rYm9vdGZzIFwKICAgJChIT1NUX09VVF9FWEVDVVRBQkxFUykvbWtib290aW1nIFwKICAgJChIT1NUX09VVF9FWEVDVVRBQkxFUykvZnNfY29uZmlnIFwKQEAgLTIwOTEsOCArMjMzOCw2IEBACiAgICQoSE9TVF9PVVRfSkFWQV9MSUJSQVJJRVMpL3NpZ25hcGsuamFyIFwKICAgJChIT1NUX09VVF9KQVZBX0xJQlJBUklFUykvQm9vdFNpZ25hdHVyZS5qYXIgXAogICAkKEhPU1RfT1VUX0pBVkFfTElCUkFSSUVTKS9WZXJpdHlTaWduZXIuamFyIFwKLSAgJChIT1NUX09VVF9FWEVDVVRBQkxFUykvbWFrZV9leHQ0ZnMgXAotICAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9ta3VzZXJpbWcuc2ggXAogICAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9ta2UyZnMgXAogICAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9ta3VzZXJpbWdfbWtlMmZzLnNoIFwKICAgJChIT1NUX09VVF9FWEVDVVRBQkxFUykvZTJmc2Ryb2lkIFwKQEAgLTIxMDAsOSArMjM0NSwxMSBAQAogICAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9ta3NxdWFzaGZzIFwKICAgJChIT1NUX09VVF9FWEVDVVRBQkxFUykvbWtmMmZzdXNlcmltZy5zaCBcCiAgICQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL21ha2VfZjJmcyBcCisgICQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL3Nsb2FkX2YyZnMgXAogICAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9zaW1nMmltZyBcCiAgICQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL2UyZnNjayBcCiAgICQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL2J1aWxkX3Zlcml0eV90cmVlIFwKKyAgJChIT1NUX09VVF9FWEVDVVRBQkxFUykvZ2VuZXJhdGVfdmVyaXR5X2tleSBcCiAgICQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL3Zlcml0eV9zaWduZXIgXAogICAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS92ZXJpdHlfdmVyaWZpZXIgXAogICAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9hcHBlbmQyc2ltZyBcCkBAIC0yMTE0LDcgKzIzNjEsNyBAQAogICAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9kZWx0YV9nZW5lcmF0b3IgXAogICAkKEFWQlRPT0wpIFwKICAgJChCTEtfQUxMT0NfVE9fQkFTRV9GUykgXAotICAkKEJSTykKKyAgJChCUk9UTEkpCiAKIGlmZXEgKHRydWUsJChQUk9EVUNUUy4kKElOVEVSTkFMX1BST0RVQ1QpLlBST0RVQ1RfU1VQUE9SVFNfVkJPT1QpKQogT1RBVE9PTFMgKz0gXApAQCAtMjEyOCw2ICsyMzc1LDcgQEAKICAgJChIT1NUX0xJQlJBUllfUEFUSCkvbGlibG9nJChIT1NUX1NITElCX1NVRkZJWCkgXAogICAkKEhPU1RfTElCUkFSWV9QQVRIKS9saWJjdXRpbHMkKEhPU1RfU0hMSUJfU1VGRklYKSBcCiAgICQoSE9TVF9MSUJSQVJZX1BBVEgpL2xpYnNlbGludXgkKEhPU1RfU0hMSUJfU1VGRklYKSBcCisgICQoSE9TVF9MSUJSQVJZX1BBVEgpL2xpYmNyeXB0b191dGlscyQoSE9TVF9TSExJQl9TVUZGSVgpIFwKICAgJChIT1NUX0xJQlJBUllfUEFUSCkvbGliY3J5cHRvLWhvc3QkKEhPU1RfU0hMSUJfU1VGRklYKSBcCiAgICQoSE9TVF9MSUJSQVJZX1BBVEgpL2xpYmV4dDJmcy1ob3N0JChIT1NUX1NITElCX1NVRkZJWCkgXAogICAkKEhPU1RfTElCUkFSWV9QQVRIKS9saWJleHQyX2Jsa2lkLWhvc3QkKEhPU1RfU0hMSUJfU1VGRklYKSBcCkBAIC0yMTYxLDE4ICsyNDA5LDIwIEBACiBPVEFUT09MU19ERVBTIDo9IFwKICAgc3lzdGVtL2V4dHJhcy92ZXJpdHkvYnVpbGRfdmVyaXR5X21ldGFkYXRhLnB5IFwKICAgc3lzdGVtL2V4dHJhcy9leHQ0X3V0aWxzL21rZTJmcy5jb25mIFwKLSAgZXh0ZXJuYWwvYXZiL3Rlc3QvZGF0YS90ZXN0a2V5X3JzYTQwOTYucGVtIFwKLSAgJChzaGVsbCBmaW5kIGJ1aWxkL3RhcmdldC9wcm9kdWN0L3NlY3VyaXR5IC10eXBlIGYgLW5hbWUgXCoueDUwOS5wZW0gLW8gLW5hbWUgXCoucGs4IC1vIFwKLSAgICAgIC1uYW1lIHZlcml0eV9rZXkgfCBzb3J0KSBcCi0gICQoc2hlbGwgZmluZCBkZXZpY2UgdmVuZG9yIC10eXBlIGYgLW5hbWUgXCoucGs4IC1vIC1uYW1lIHZlcmlmaWVkYm9vdFwqIC1vIFwKLSAgICAgIC1uYW1lIFwqLng1MDkucGVtIC1vIC1uYW1lIG9lbVwqLnByb3AgfCBzb3J0KQorICAkKHNvcnQgJChzaGVsbCBmaW5kIGV4dGVybmFsL2F2Yi90ZXN0L2RhdGEgLXR5cGUgZiAtbmFtZSAidGVzdGtleV8qLnBlbSIgLW8gXAorICAgICAgLW5hbWUgImF0eF9tZXRhZGF0YS5iaW4iKSkgXAorICAkKHNvcnQgJChzaGVsbCBmaW5kIHN5c3RlbS91cGRhdGVfZW5naW5lL3NjcmlwdHMgLW5hbWUgXCoucHljIC1wcnVuZSAtbyAtdHlwZSBmIC1wcmludCkpIFwKKyAgJChzb3J0ICQoc2hlbGwgZmluZCBidWlsZC90YXJnZXQvcHJvZHVjdC9zZWN1cml0eSAtdHlwZSBmIC1uYW1lIFwqLng1MDkucGVtIC1vIC1uYW1lIFwqLnBrOCAtbyBcCisgICAgICAtbmFtZSB2ZXJpdHlfa2V5KSkgXAorICAkKHNvcnQgJChzaGVsbCBmaW5kIGRldmljZSAkKHdpbGRjYXJkIHZlbmRvcikgLXR5cGUgZiAtbmFtZSBcKi5wazggLW8gLW5hbWUgdmVyaWZpZWRib290XCogLW8gXAorICAgICAgLW5hbWUgXCoueDUwOS5wZW0gLW8gLW5hbWUgb2VtXCoucHJvcCkpCiAKIE9UQVRPT0xTX1JFTEVBU0VUT09MUyA6PSBcCi0gICQoc2hlbGwgZmluZCBidWlsZC90b29scy9yZWxlYXNldG9vbHMgLW5hbWUgXCoucHljIC1wcnVuZSAtbyAtdHlwZSBmIHwgc29ydCkKKyAgJChzb3J0ICQoc2hlbGwgZmluZCBidWlsZC9tYWtlL3Rvb2xzL3JlbGVhc2V0b29scyAtbmFtZSBcKi5weWMgLXBydW5lIC1vIC10eXBlIGYpKQogCiBpZmVxICh0cnVlLCQoUFJPRFVDVFMuJChJTlRFUk5BTF9QUk9EVUNUKS5QUk9EVUNUX1NVUFBPUlRTX1ZCT09UKSkKIE9UQVRPT0xTX0RFUFMgKz0gXAotICAkKHNoZWxsIGZpbmQgZXh0ZXJuYWwvdmJvb3RfcmVmZXJlbmNlL3Rlc3RzL2RldmtleXMgLXR5cGUgZiB8IHNvcnQpCisgICQoc29ydCAkKHNoZWxsIGZpbmQgZXh0ZXJuYWwvdmJvb3RfcmVmZXJlbmNlL3Rlc3RzL2RldmtleXMgLXR5cGUgZikpCiBlbmRpZgogCiAkKEJVSUxUX09UQVRPT0xTX1BBQ0tBR0UpOiAkKE9UQVRPT0xTKSAkKE9UQVRPT0xTX0RFUFMpICQoT1RBVE9PTFNfUkVMRUFTRVRPT0xTKSB8ICQoQUNQKQpAQCAtMjE4MCw3ICsyNDMwLDcgQEAKIAkkKGhpZGUpIHJtIC1yZiAkQCAkKHppcF9yb290KQogCSQoaGlkZSkgbWtkaXIgLXAgJChkaXIgJEApICQoemlwX3Jvb3QpL2JpbiAkKHppcF9yb290KS9mcmFtZXdvcmsgJCh6aXBfcm9vdCkvcmVsZWFzZXRvb2xzCiAJJChjYWxsIGNvcHktZmlsZXMtd2l0aC1zdHJ1Y3R1cmUsJChPVEFUT09MUyksJChIT1NUX09VVCkvLCQoemlwX3Jvb3QpKQotCSQoaGlkZSkgJChBQ1ApIC1yIC1kIC1wIGJ1aWxkL3Rvb2xzL3JlbGVhc2V0b29scy8qICQoemlwX3Jvb3QpL3JlbGVhc2V0b29scworCSQoaGlkZSkgJChBQ1ApIC1yIC1kIC1wIGJ1aWxkL21ha2UvdG9vbHMvcmVsZWFzZXRvb2xzLyogJCh6aXBfcm9vdCkvcmVsZWFzZXRvb2xzCiAJJChoaWRlKSBybSAtcmYgJEAgJCh6aXBfcm9vdCkvcmVsZWFzZXRvb2xzLyoucHljCiAJJChoaWRlKSAoY2QgJCh6aXBfcm9vdCkgJiYgemlwIC1xcnlYICQoYWJzcGF0aCAkQCkgKikKIAkkKGhpZGUpIGVjaG8gJChPVEFUT09MU19ERVBTKSB8IHhhcmdzIHppcCAtcXJ5WCAkKGFic3BhdGggJEApPi9kZXYvbnVsbCB8fCB0cnVlCkBAIC0yMjQxLDkgKzI0OTEsNyBAQAogJChCVUlMVF9UQVJHRVRfRklMRVNfUEFDS0FHRSk6IFBSSVZBVEVfVE9PTF9FWFRFTlNJT04gOj0gJCh0b29sX2V4dGVuc2lvbikKIAogaWZlcSAoJChBQl9PVEFfVVBEQVRFUiksdHJ1ZSkKLSMgQnVpbGQgemxpYiBmaW5nZXJwcmludCBpZiB1c2luZyB0aGUgQUIgVXBkYXRlci4KLXVwZGF0ZXJfZGVwIDo9ICQoVEFSR0VUX09VVF9DT01NT05fR0VOKS96bGliX2ZpbmdlcnByaW50Ci11cGRhdGVyX2RlcCArPSBzeXN0ZW0vdXBkYXRlX2VuZ2luZS91cGRhdGVfZW5naW5lLmNvbmYKK3VwZGF0ZXJfZGVwIDo9IHN5c3RlbS91cGRhdGVfZW5naW5lL3VwZGF0ZV9lbmdpbmUuY29uZgogZWxzZQogIyBCdWlsZCBPVEEgdG9vbHMgaWYgbm90IHVzaW5nIHRoZSBBQiBVcGRhdGVyLgogdXBkYXRlcl9kZXAgOj0gJChidWlsdF9vdGFfdG9vbHMpCkBAIC0yMjczLDcgKzI1MjEsNyBAQAogIyAkMTogcm9vdCBkaXJlY3RvcnkKICMgJDI6IGFkZCBwcmVmaXgKIGRlZmluZSBmc19jb25maWcKLShjZCAkKDEpOyBmaW5kIC4gLXR5cGUgZCB8IHNlZCAncywkJCwvLCc7IGZpbmQgLiBcISAtdHlwZSBkKSB8IGN1dCAtYyAzLSB8IHNvcnQgfCBzZWQgJ3MsXiwkKDIpLCcgfCAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9mc19jb25maWcgLUMgLUQgJChUQVJHRVRfT1VUKSAtUyAkKFNFTElOVVhfRkMpCisoY2QgJCgxKTsgZmluZCAuIC10eXBlIGQgfCBzZWQgJ3MsJCQsLywnOyBmaW5kIC4gXCEgLXR5cGUgZCkgfCBjdXQgLWMgMy0gfCBzb3J0IHwgc2VkICdzLF4sJCgyKSwnIHwgJChIT1NUX09VVF9FWEVDVVRBQkxFUykvZnNfY29uZmlnIC1DIC1EICQoVEFSR0VUX09VVCkgLVMgJChTRUxJTlVYX0ZDKSAtUiAiJCgyKSIKIGVuZGVmCiAKICMgRGVwZW5kaW5nIG9uIHRoZSB2YXJpb3VzIGltYWdlcyBndWFyYW50ZWVzIHRoYXQgdGhlIHVuZGVybHlpbmcKQEAgLTIyODYsNiArMjUzNCw3IEBACiAJCSQoSU5TVEFMTEVEX1VTRVJEQVRBSU1BR0VfVEFSR0VUKSBcCiAJCSQoSU5TVEFMTEVEX0NBQ0hFSU1BR0VfVEFSR0VUKSBcCiAJCSQoSU5TVEFMTEVEX1ZFTkRPUklNQUdFX1RBUkdFVCkgXAorCQkkKElOU1RBTExFRF9QUk9EVUNUSU1BR0VfVEFSR0VUKSBcCiAJCSQoSU5TVEFMTEVEX1ZCTUVUQUlNQUdFX1RBUkdFVCkgXAogCQkkKElOU1RBTExFRF9EVEJPSU1BR0VfVEFSR0VUKSBcCiAJCSQoSU5URVJOQUxfU1lTVEVNT1RIRVJJTUFHRV9GSUxFUykgXApAQCAtMjI5NCw2ICsyNTQzLDcgQEAKIAkJJChJTlNUQUxMRURfMk5EQk9PVExPQURFUl9UQVJHRVQpIFwKIAkJJChQUk9EVUNUUy4kKElOVEVSTkFMX1BST0RVQ1QpLlBST0RVQ1RfU1lTVEVNX0JBU0VfRlNfUEFUSCkgXAogCQkkKFBST0RVQ1RTLiQoSU5URVJOQUxfUFJPRFVDVCkuUFJPRFVDVF9WRU5ET1JfQkFTRV9GU19QQVRIKSBcCisJCSQoUFJPRFVDVFMuJChJTlRFUk5BTF9QUk9EVUNUKS5QUk9EVUNUX1BST0RVQ1RfQkFTRV9GU19QQVRIKSBcCiAJCSQoU0VMSU5VWF9GQykgXAogCQkkKEFQS0NFUlRTX0ZJTEUpIFwKIAkJJChTT09OR19aSVApIFwKQEAgLTIzMDEsMTEgKzI1NTEsMTIgQEAKIAkJJChIT1NUX09VVF9FWEVDVVRBQkxFUykvaW1nZGlmZiBcCiAJCSQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL2JzZGlmZiBcCiAJCSQoQlVJTERfSU1BR0VfU1JDUykgXAotCQkkKElOU1RBTExFRF9WRU5ET1JfTUFOSUZFU1QpIFwKLQkJJChJTlNUQUxMRURfVkVORE9SX01BVFJJWCkgXAorCQkkKEJVSUxUX1ZFTkRPUl9NQU5JRkVTVCkgXAorCQkkKEJVSUxUX1ZFTkRPUl9NQVRSSVgpIFwKIAkJfCAkKEFDUCkKIAlAZWNobyAiUGFja2FnZSB0YXJnZXQgZmlsZXM6ICRAIgogCSQoY2FsbCBjcmVhdGUtc3lzdGVtLXZlbmRvci1zeW1saW5rKQorCSQoY2FsbCBjcmVhdGUtc3lzdGVtLXByb2R1Y3Qtc3ltbGluaykKIAkkKGhpZGUpIHJtIC1yZiAkQCAkQC5saXN0ICQoemlwX3Jvb3QpCiAJJChoaWRlKSBta2RpciAtcCAkKGRpciAkQCkgJCh6aXBfcm9vdCkKIGlmbmVxICgsJChJTlNUQUxMRURfUkVDT1ZFUllJTUFHRV9UQVJHRVQpJChmaWx0ZXIgdHJ1ZSwkKEJPQVJEX1VTRVNfUkVDT1ZFUllfQVNfQk9PVCkpKQpAQCAtMjMxOSw2ICsyNTcwLDkgQEAKIGlmZGVmIElOU1RBTExFRF8yTkRCT09UTE9BREVSX1RBUkdFVAogCSQoaGlkZSkgY3AgJChJTlNUQUxMRURfMk5EQk9PVExPQURFUl9UQVJHRVQpICQoemlwX3Jvb3QpLyQoUFJJVkFURV9SRUNPVkVSWV9PVVQpL3NlY29uZAogZW5kaWYKK2lmZGVmIEJPQVJEX0lOQ0xVREVfUkVDT1ZFUllfRFRCTworCSQoaGlkZSkgY3AgJChJTlNUQUxMRURfRFRCT0lNQUdFX1RBUkdFVCkgJCh6aXBfcm9vdCkvJChQUklWQVRFX1JFQ09WRVJZX09VVCkvcmVjb3ZlcnlfZHRibworZW5kaWYKIGlmZGVmIElOVEVSTkFMX0tFUk5FTF9DTURMSU5FCiAJJChoaWRlKSBlY2hvICIkKElOVEVSTkFMX0tFUk5FTF9DTURMSU5FKSIgPiAkKHppcF9yb290KS8kKFBSSVZBVEVfUkVDT1ZFUllfT1VUKS9jbWRsaW5lCiBlbmRpZgpAQCAtMjM3MSw2ICsyNjI1LDExIEBACiAJJChoaWRlKSAkKGNhbGwgcGFja2FnZV9maWxlcy1jb3B5LXJvb3QsIFwKIAkJJChUQVJHRVRfT1VUX1ZFTkRPUiksJCh6aXBfcm9vdCkvVkVORE9SKQogZW5kaWYKK2lmZGVmIEJPQVJEX1BST0RVQ1RJTUFHRV9GSUxFX1NZU1RFTV9UWVBFCisJQCMgQ29udGVudHMgb2YgdGhlIHByb2R1Y3QgaW1hZ2UKKwkkKGhpZGUpICQoY2FsbCBwYWNrYWdlX2ZpbGVzLWNvcHktcm9vdCwgXAorCQkkKFRBUkdFVF9PVVRfUFJPRFVDVCksJCh6aXBfcm9vdCkvUFJPRFVDVCkKK2VuZGlmCiBpZmRlZiBJTlNUQUxMRURfU1lTVEVNT1RIRVJJTUFHRV9UQVJHRVQKIAlAIyBDb250ZW50cyBvZiB0aGUgc3lzdGVtX290aGVyIGltYWdlCiAJJChoaWRlKSAkKGNhbGwgcGFja2FnZV9maWxlcy1jb3B5LXJvb3QsIFwKQEAgLTI0MDIsMTggKzI2NjEsMTUgQEAKIGlmZGVmIEJPQVJEX0JPT1RJTUFHRV9QQVJUSVRJT05fU0laRQogCSQoaGlkZSkgZWNobyAiYm9vdF9zaXplPSQoQk9BUkRfQk9PVElNQUdFX1BBUlRJVElPTl9TSVpFKSIgPj4gJCh6aXBfcm9vdCkvTUVUQS9taXNjX2luZm8udHh0CiBlbmRpZgotaWZlcSAoJChCT0FSRF9VU0VTX1JFQ09WRVJZX0FTX0JPT1QpLCkKLQkkKGhpZGUpIGVjaG8gInJlY292ZXJ5X2FzX2Jvb3Q9JChCT0FSRF9VU0VTX1JFQ09WRVJZX0FTX0JPT1QpIiA+PiAkKHppcF9yb290KS9NRVRBL21pc2NfaW5mby50eHQKLWVuZGlmCiBpZmVxICgkKElOU1RBTExFRF9SRUNPVkVSWUlNQUdFX1RBUkdFVCksKQogCSQoaGlkZSkgZWNobyAibm9fcmVjb3Zlcnk9dHJ1ZSIgPj4gJCh6aXBfcm9vdCkvTUVUQS9taXNjX2luZm8udHh0CiBlbmRpZgoraWZkZWYgQk9BUkRfSU5DTFVERV9SRUNPVkVSWV9EVEJPCisJJChoaWRlKSBlY2hvICJpbmNsdWRlX3JlY292ZXJ5X2R0Ym89dHJ1ZSIgPj4gJCh6aXBfcm9vdCkvTUVUQS9taXNjX2luZm8udHh0CitlbmRpZgogaWZkZWYgQk9BUkRfUkVDT1ZFUllJTUFHRV9QQVJUSVRJT05fU0laRQogCSQoaGlkZSkgZWNobyAicmVjb3Zlcnlfc2l6ZT0kKEJPQVJEX1JFQ09WRVJZSU1BR0VfUEFSVElUSU9OX1NJWkUpIiA+PiAkKHppcF9yb290KS9NRVRBL21pc2NfaW5mby50eHQKIGVuZGlmCi1pZmRlZiBCT0FSRF9IQVNfRVhUNF9SRVNFUlZFRF9CTE9DS1MKLQkkKGhpZGUpIGVjaG8gImhhc19leHQ0X3Jlc2VydmVkX2Jsb2Nrcz0kKEJPQVJEX0hBU19FWFQ0X1JFU0VSVkVEX0JMT0NLUykiID4+ICQoemlwX3Jvb3QpL01FVEEvbWlzY19pbmZvLnR4dAotZW5kaWYKIGlmZGVmIFRBUkdFVF9SRUNPVkVSWV9GU1RZUEVfTU9VTlRfT1BUSU9OUwogCUAjIFRBUkdFVF9SRUNPVkVSWV9GU1RZUEVfTU9VTlRfT1BUSU9OUyBjYW4gYmUgZW1wdHkgdG8gaW5kaWNhdGUgdGhhdCBub3RoaW5nIGJ1dCBkZWZhdWx0cyBzaG91bGQgYmUgdXNlZC4KIAkkKGhpZGUpIGVjaG8gInJlY292ZXJ5X21vdW50X29wdGlvbnM9JChUQVJHRVRfUkVDT1ZFUllfRlNUWVBFX01PVU5UX09QVElPTlMpIiA+PiAkKHppcF9yb290KS9NRVRBL21pc2NfaW5mby50eHQKQEAgLTI0NDEsNiArMjY5NywxMCBAQAogCSQoaGlkZSkgY3AgJChQUk9EVUNUUy4kKElOVEVSTkFMX1BST0RVQ1QpLlBST0RVQ1RfVkVORE9SX0JBU0VfRlNfUEFUSCkgXAogCSAgJCh6aXBfcm9vdCkvTUVUQS8kKG5vdGRpciAkKFBST0RVQ1RTLiQoSU5URVJOQUxfUFJPRFVDVCkuUFJPRFVDVF9WRU5ET1JfQkFTRV9GU19QQVRIKSkKIGVuZGlmCitpZm5lcSAoJChQUk9EVUNUUy4kKElOVEVSTkFMX1BST0RVQ1QpLlBST0RVQ1RfUFJPRFVDVF9CQVNFX0ZTX1BBVEgpLCkKKwkkKGhpZGUpIGNwICQoUFJPRFVDVFMuJChJTlRFUk5BTF9QUk9EVUNUKS5QUk9EVUNUX1BST0RVQ1RfQkFTRV9GU19QQVRIKSBcCisJICAkKHppcF9yb290KS9NRVRBLyQobm90ZGlyICQoUFJPRFVDVFMuJChJTlRFUk5BTF9QUk9EVUNUKS5QUk9EVUNUX1BST0RVQ1RfQkFTRV9GU19QQVRIKSkKK2VuZGlmCiBpZm5lcSAoJChzdHJpcCAkKFNBTklUSVpFX1RBUkdFVCkpLCkKIAkjIFdlIG5lZWQgdG8gY3JlYXRlIHVzZXJkYXRhLmltZyB3aXRoIHJlYWwgZGF0YSBiZWNhdXNlIHRoZSBpbnN0cnVtZW50ZWQgbGlicmFyaWVzIGFyZSBpbiB1c2VyZGF0YS5pbWcuCiAJJChoaWRlKSBlY2hvICJ1c2VyZGF0YV9pbWdfd2l0aF9kYXRhPXRydWUiID4+ICQoemlwX3Jvb3QpL01FVEEvbWlzY19pbmZvLnR4dApAQCAtMjQ1OSw2ICsyNzE5LDEyIEBACiAJJChoaWRlKSBlY2hvICJhdmJfYm9vdF9hbGdvcml0aG09JChCT0FSRF9BVkJfQk9PVF9BTEdPUklUSE0pIiA+PiAkKHppcF9yb290KS9NRVRBL21pc2NfaW5mby50eHQKIAkkKGhpZGUpIGVjaG8gImF2Yl9ib290X3JvbGxiYWNrX2luZGV4X2xvY2F0aW9uPSQoQk9BUkRfQVZCX0JPT1RfUk9MTEJBQ0tfSU5ERVhfTE9DQVRJT04pIiA+PiAkKHppcF9yb290KS9NRVRBL21pc2NfaW5mby50eHQKIGVuZGlmICMgQk9BUkRfQVZCX0JPT1RfS0VZX1BBVEgKKwkkKGhpZGUpIGVjaG8gImF2Yl9yZWNvdmVyeV9hZGRfaGFzaF9mb290ZXJfYXJncz0kKEJPQVJEX0FWQl9SRUNPVkVSWV9BRERfSEFTSF9GT09URVJfQVJHUykiID4+ICQoemlwX3Jvb3QpL01FVEEvbWlzY19pbmZvLnR4dAoraWZkZWYgQk9BUkRfQVZCX1JFQ09WRVJZX0tFWV9QQVRICisJJChoaWRlKSBlY2hvICJhdmJfcmVjb3Zlcnlfa2V5X3BhdGg9JChCT0FSRF9BVkJfUkVDT1ZFUllfS0VZX1BBVEgpIiA+PiAkKHppcF9yb290KS9NRVRBL21pc2NfaW5mby50eHQKKwkkKGhpZGUpIGVjaG8gImF2Yl9yZWNvdmVyeV9hbGdvcml0aG09JChCT0FSRF9BVkJfUkVDT1ZFUllfQUxHT1JJVEhNKSIgPj4gJCh6aXBfcm9vdCkvTUVUQS9taXNjX2luZm8udHh0CisJJChoaWRlKSBlY2hvICJhdmJfcmVjb3Zlcnlfcm9sbGJhY2tfaW5kZXhfbG9jYXRpb249JChCT0FSRF9BVkJfUkVDT1ZFUllfUk9MTEJBQ0tfSU5ERVhfTE9DQVRJT04pIiA+PiAkKHppcF9yb290KS9NRVRBL21pc2NfaW5mby50eHQKK2VuZGlmICMgQk9BUkRfQVZCX1JFQ09WRVJZX0tFWV9QQVRICiBlbmRpZiAjIEJPQVJEX0FWQl9FTkFCTEUKIGlmZGVmIEJPQVJEX0JQVF9JTlBVVF9GSUxFUwogCSQoaGlkZSkgZWNobyAiYm9hcmRfYnB0X2VuYWJsZT10cnVlIiA+PiAkKHppcF9yb290KS9NRVRBL21pc2NfaW5mby50eHQKQEAgLTI0NzEsMTIgKzI3MzcsMTEgQEAKIAkkKGNhbGwgZ2VuZXJhdGUtdXNlcmltYWdlLXByb3AtZGljdGlvbmFyeSwgJCh6aXBfcm9vdCkvTUVUQS9taXNjX2luZm8udHh0KQogaWZuZXEgKCQoSU5TVEFMTEVEX1JFQ09WRVJZSU1BR0VfVEFSR0VUKSwpCiAJJChoaWRlKSBQQVRIPSQoZm9yZWFjaCBwLCQoSU5URVJOQUxfVVNFUklNQUdFU19CSU5BUllfUEFUSFMpLCQocCk6KSQkUEFUSCBNS0JPT1RJTUc9JChNS0JPT1RJTUcpIFwKLQkgICAgLi9idWlsZC90b29scy9yZWxlYXNldG9vbHMvbWFrZV9yZWNvdmVyeV9wYXRjaCAkKHppcF9yb290KSAkKHppcF9yb290KQorCSAgICBidWlsZC9tYWtlL3Rvb2xzL3JlbGVhc2V0b29scy9tYWtlX3JlY292ZXJ5X3BhdGNoICQoemlwX3Jvb3QpICQoemlwX3Jvb3QpCiBlbmRpZgogaWZlcSAoJChBQl9PVEFfVVBEQVRFUiksdHJ1ZSkKIAlAIyBXaGVuIHVzaW5nIHRoZSBBL0IgdXBkYXRlciwgaW5jbHVkZSB0aGUgdXBkYXRlciBjb25maWcgZmlsZXMgaW4gdGhlIHppcC4KIAkkKGhpZGUpIGNwICQoVE9QRElSKXN5c3RlbS91cGRhdGVfZW5naW5lL3VwZGF0ZV9lbmdpbmUuY29uZiAkKHppcF9yb290KS9NRVRBL3VwZGF0ZV9lbmdpbmVfY29uZmlnLnR4dAotCSQoaGlkZSkgY3AgJChUQVJHRVRfT1VUX0NPTU1PTl9HRU4pL3psaWJfZmluZ2VycHJpbnQgJCh6aXBfcm9vdCkvTUVUQS96bGliX2ZpbmdlcnByaW50LnR4dAogCSQoaGlkZSkgZm9yIHBhcnQgaW4gJChBQl9PVEFfUEFSVElUSU9OUyk7IGRvIFwKIAkgIGVjaG8gIiQke3BhcnR9IiA+PiAkKHppcF9yb290KS9NRVRBL2FiX3BhcnRpdGlvbnMudHh0OyBcCiAJZG9uZQpAQCAtMjUxOSw2ICsyNzg0LDE0IEBACiAJJChoaWRlKSBta2RpciAtcCAkKHppcF9yb290KS9JTUFHRVMKIAkkKGhpZGUpIGNwICQoSU5TVEFMTEVEX1ZFTkRPUklNQUdFX1RBUkdFVCkgJCh6aXBfcm9vdCkvSU1BR0VTLwogZW5kaWYKK2lmZGVmIEJPQVJEX1BSRUJVSUxUX1BST0RVQ1RJTUFHRQorCSQoaGlkZSkgbWtkaXIgLXAgJCh6aXBfcm9vdCkvSU1BR0VTCisJJChoaWRlKSBjcCAkKElOU1RBTExFRF9QUk9EVUNUSU1BR0VfVEFSR0VUKSAkKHppcF9yb290KS9JTUFHRVMvCitlbmRpZgoraWZkZWYgQk9BUkRfUFJFQlVJTFRfQk9PVElNQUdFCisJJChoaWRlKSBta2RpciAtcCAkKHppcF9yb290KS9JTUFHRVMKKwkkKGhpZGUpIGNwICQoSU5TVEFMTEVEX0JPT1RJTUFHRV9UQVJHRVQpICQoemlwX3Jvb3QpL0lNQUdFUy8KK2VuZGlmCiBpZmRlZiBCT0FSRF9QUkVCVUlMVF9EVEJPSU1BR0UKIAkkKGhpZGUpIG1rZGlyIC1wICQoemlwX3Jvb3QpL1BSRUJVSUxUX0lNQUdFUwogCSQoaGlkZSkgY3AgJChJTlNUQUxMRURfRFRCT0lNQUdFX1RBUkdFVCkgJCh6aXBfcm9vdCkvUFJFQlVJTFRfSU1BR0VTLwpAQCAtMjU0NSwxOCArMjgxOCwyNSBAQAogaWZkZWYgQk9BUkRfVkVORE9SSU1BR0VfRklMRV9TWVNURU1fVFlQRQogCSQoaGlkZSkgJChjYWxsIGZzX2NvbmZpZywkKHppcF9yb290KS9WRU5ET1IsdmVuZG9yLykgPiAkKHppcF9yb290KS9NRVRBL3ZlbmRvcl9maWxlc3lzdGVtX2NvbmZpZy50eHQKIGVuZGlmCi1pZmVxICgkKEJPQVJEX0JVSUxEX1NZU1RFTV9ST09UX0lNQUdFKSx0cnVlKQotCSQoaGlkZSkgJChjYWxsIGZzX2NvbmZpZywkKHppcF9yb290KS9ST09ULCkgPiAkKHppcF9yb290KS9NRVRBL3Jvb3RfZmlsZXN5c3RlbV9jb25maWcudHh0CitpZmRlZiBCT0FSRF9QUk9EVUNUSU1BR0VfRklMRV9TWVNURU1fVFlQRQorCSQoaGlkZSkgJChjYWxsIGZzX2NvbmZpZywkKHppcF9yb290KS9QUk9EVUNULHByb2R1Y3QvKSA+ICQoemlwX3Jvb3QpL01FVEEvcHJvZHVjdF9maWxlc3lzdGVtX2NvbmZpZy50eHQKIGVuZGlmCitpZmVxICgkKEJPQVJEX0JVSUxEX1NZU1RFTV9ST09UX0lNQUdFKSx0cnVlKQorCUAjIFdoZW4gdXNpbmcgQk9BUkRfQlVJTERfU1lTVEVNX1JPT1RfSU1BR0UsIFJPT1QgYWx3YXlzIGNvbnRhaW5zIHRoZSBmaWxlcyBmb3IgdGhlIHJvb3QgdW5kZXIKKwlAIyBub3JtYWwgYm9vdC4gQk9PVC9SQU1ESVNLIGV4aXN0cyBvbmx5IGlmIGFkZGl0aW9uYWxseSB1c2luZyBCT0FSRF9VU0VTX1JFQ09WRVJZX0FTX0JPT1QuCisJJChoaWRlKSAkKGNhbGwgZnNfY29uZmlnLCQoemlwX3Jvb3QpL1JPT1QsKSA+ICQoemlwX3Jvb3QpL01FVEEvcm9vdF9maWxlc3lzdGVtX2NvbmZpZy50eHQKK2lmZXEgKCQoQk9BUkRfVVNFU19SRUNPVkVSWV9BU19CT09UKSx0cnVlKQogCSQoaGlkZSkgJChjYWxsIGZzX2NvbmZpZywkKHppcF9yb290KS9CT09UL1JBTURJU0ssKSA+ICQoemlwX3Jvb3QpL01FVEEvYm9vdF9maWxlc3lzdGVtX2NvbmZpZy50eHQKK2VuZGlmCitlbHNlICMgQk9BUkRfQlVJTERfU1lTVEVNX1JPT1RfSU1BR0UgIT0gdHJ1ZQorCSQoaGlkZSkgJChjYWxsIGZzX2NvbmZpZywkKHppcF9yb290KS9CT09UL1JBTURJU0ssKSA+ICQoemlwX3Jvb3QpL01FVEEvYm9vdF9maWxlc3lzdGVtX2NvbmZpZy50eHQKK2VuZGlmCiBpZm5lcSAoJChJTlNUQUxMRURfUkVDT1ZFUllJTUFHRV9UQVJHRVQpLCkKIAkkKGhpZGUpICQoY2FsbCBmc19jb25maWcsJCh6aXBfcm9vdCkvUkVDT1ZFUlkvUkFNRElTSywpID4gJCh6aXBfcm9vdCkvTUVUQS9yZWNvdmVyeV9maWxlc3lzdGVtX2NvbmZpZy50eHQKIGVuZGlmCiBpZmRlZiBJTlNUQUxMRURfU1lTVEVNT1RIRVJJTUFHRV9UQVJHRVQKIAkkKGhpZGUpICQoY2FsbCBmc19jb25maWcsJCh6aXBfcm9vdCkvU1lTVEVNX09USEVSLHN5c3RlbS8pID4gJCh6aXBfcm9vdCkvTUVUQS9zeXN0ZW1fb3RoZXJfZmlsZXN5c3RlbV9jb25maWcudHh0CiBlbmRpZgotCi1pZmVxICgkKFBST0RVQ1RfRlVMTF9UUkVCTEUpLHRydWUpCiAJQCMgTWV0YWRhdGEgZm9yIGNvbXBhdGliaWxpdHkgdmVyaWZpY2F0aW9uLgogCSQoaGlkZSkgY3AgJChCVUlMVF9TWVNURU1fTUFOSUZFU1QpICQoemlwX3Jvb3QpL01FVEEvc3lzdGVtX21hbmlmZXN0LnhtbAogCSQoaGlkZSkgY3AgJChCVUlMVF9TWVNURU1fQ09NUEFUSUJJTElUWV9NQVRSSVgpICQoemlwX3Jvb3QpL01FVEEvc3lzdGVtX21hdHJpeC54bWwKQEAgLTI1NjYsMTAgKzI4NDYsOSBAQAogaWZkZWYgQlVJTFRfVkVORE9SX01BVFJJWAogCSQoaGlkZSkgY3AgJChCVUlMVF9WRU5ET1JfTUFUUklYKSAkKHppcF9yb290KS9NRVRBL3ZlbmRvcl9tYXRyaXgueG1sCiBlbmRpZgotZW5kaWYKIAogCSQoaGlkZSkgUEFUSD0kKGZvcmVhY2ggcCwkKElOVEVSTkFMX1VTRVJJTUFHRVNfQklOQVJZX1BBVEhTKSwkKHApOikkJFBBVEggTUtCT09USU1HPSQoTUtCT09USU1HKSBcCi0JICAgIC4vYnVpbGQvdG9vbHMvcmVsZWFzZXRvb2xzL2FkZF9pbWdfdG9fdGFyZ2V0X2ZpbGVzIC1hIC12IC1wICQoSE9TVF9PVVQpICQoemlwX3Jvb3QpCisJICAgIGJ1aWxkL21ha2UvdG9vbHMvcmVsZWFzZXRvb2xzL2FkZF9pbWdfdG9fdGFyZ2V0X2ZpbGVzIC1hIC12IC1wICQoSE9TVF9PVVQpICQoemlwX3Jvb3QpCiAJQCMgWmlwIGV2ZXJ5dGhpbmcgdXAsIHByZXNlcnZpbmcgc3ltbGlua3MgYW5kIHBsYWNpbmcgTUVUQS8gZmlsZXMgZmlyc3QgdG8KIAlAIyBoZWxwIGVhcmx5IHZhbGlkYXRpb24gb2YgdGhlIC56aXAgZmlsZSB3aGlsZSB1cGxvYWRpbmcgaXQuCiAJJChoaWRlKSBmaW5kICQoemlwX3Jvb3QpL01FVEEgfCBzb3J0ID4kQC5saXN0CkBAIC0yNjA5LDE0ICsyODg4LDE0IEBACiBpZmVxICgkKEFCX09UQV9VUERBVEVSKSx0cnVlKQogJChJTlRFUk5BTF9PVEFfUEFDS0FHRV9UQVJHRVQpOiAkKEJSSUxMT19VUERBVEVfUEFZTE9BRCkKIGVsc2UKLSQoSU5URVJOQUxfT1RBX1BBQ0tBR0VfVEFSR0VUKTogJChCUk8pCiskKElOVEVSTkFMX09UQV9QQUNLQUdFX1RBUkdFVCk6ICQoQlJPVExJKQogZW5kaWYKIAogJChJTlRFUk5BTF9PVEFfUEFDS0FHRV9UQVJHRVQpOiAkKEJVSUxUX1RBUkdFVF9GSUxFU19QQUNLQUdFKSBcCi0JCWJ1aWxkL3Rvb2xzL3JlbGVhc2V0b29scy9vdGFfZnJvbV90YXJnZXRfZmlsZXMKKwkJYnVpbGQvbWFrZS90b29scy9yZWxlYXNldG9vbHMvb3RhX2Zyb21fdGFyZ2V0X2ZpbGVzCiAJQGVjaG8gIlBhY2thZ2UgT1RBOiAkQCIKIAkkKGhpZGUpIFBBVEg9JChmb3JlYWNoIHAsJChJTlRFUk5BTF9VU0VSSU1BR0VTX0JJTkFSWV9QQVRIUyksJChwKTopJCRQQVRIIE1LQk9PVElNRz0kKE1LQk9PVElNRykgXAotCSAgIC4vYnVpbGQvdG9vbHMvcmVsZWFzZXRvb2xzL290YV9mcm9tX3RhcmdldF9maWxlcyAtdiBcCisJICAgYnVpbGQvbWFrZS90b29scy9yZWxlYXNldG9vbHMvb3RhX2Zyb21fdGFyZ2V0X2ZpbGVzIC12IFwKIAkgICAtLWJsb2NrIFwKIAkgICAtLWV4dHJhY3RlZF9pbnB1dF90YXJnZXRfZmlsZXMgJChwYXRzdWJzdCAlLnppcCwlLCQoQlVJTFRfVEFSR0VUX0ZJTEVTX1BBQ0tBR0UpKSBcCiAJICAgLXAgJChIT1NUX09VVCkgXApAQCAtMjY1OSwxMiArMjkzOCwxMyBAQAogbmFtZSA6PSAkKG5hbWUpLXN5bWJvbHMtJChGSUxFX05BTUVfVEFHKQogCiBTWU1CT0xTX1pJUCA6PSAkKFBST0RVQ1RfT1VUKS8kKG5hbWUpLnppcAotIyBGb3IgYXBwc19vbmx5IGJ1aWxkIHdlJ2xsIGVzdGFibGlzaCB0aGUgZGVwZW5kZW5jeSBsYXRlciBpbiBidWlsZC9jb3JlL21haW4ubWsuCisjIEZvciBhcHBzX29ubHkgYnVpbGQgd2UnbGwgZXN0YWJsaXNoIHRoZSBkZXBlbmRlbmN5IGxhdGVyIGluIGJ1aWxkL21ha2UvY29yZS9tYWluLm1rLgogaWZuZGVmIFRBUkdFVF9CVUlMRF9BUFBTCiAkKFNZTUJPTFNfWklQKTogJChJTlNUQUxMRURfU1lTVEVNSU1BR0UpIFwKIAkJJChJTlNUQUxMRURfQk9PVElNQUdFX1RBUkdFVCkgXAogCQkkKElOU1RBTExFRF9VU0VSREFUQUlNQUdFX1RBUkdFVCkgXAogCQkkKElOU1RBTExFRF9WRU5ET1JJTUFHRV9UQVJHRVQpIFwKKwkJJChJTlNUQUxMRURfUFJPRFVDVElNQUdFX1RBUkdFVCkgXAogCQkkKHVwZGF0ZXJfZGVwKQogZW5kaWYKICQoU1lNQk9MU19aSVApOiBQUklWQVRFX0xJU1RfRklMRSA6PSAkKGNhbGwgaW50ZXJtZWRpYXRlcy1kaXItZm9yLFBBQ0tBR0lORyxzeW1ib2xzKS9maWxlbGlzdApAQCAtMjY4Nyw3ICsyOTY3LDggQEAKICQoQ09WRVJBR0VfWklQKTogJChJTlNUQUxMRURfU1lTVEVNSU1BR0UpIFwKIAkJJChJTlNUQUxMRURfQk9PVElNQUdFX1RBUkdFVCkgXAogCQkkKElOU1RBTExFRF9VU0VSREFUQUlNQUdFX1RBUkdFVCkgXAotCQkkKElOU1RBTExFRF9WRU5ET1JJTUFHRV9UQVJHRVQpCisJCSQoSU5TVEFMTEVEX1ZFTkRPUklNQUdFX1RBUkdFVCkgXAorCQkkKElOU1RBTExFRF9QUk9EVUNUSU1BR0VfVEFSR0VUKQogZW5kaWYKICQoQ09WRVJBR0VfWklQKTogUFJJVkFURV9MSVNUX0ZJTEUgOj0gJChjYWxsIGludGVybWVkaWF0ZXMtZGlyLWZvcixQQUNLQUdJTkcsY292ZXJhZ2UpL2ZpbGVsaXN0CiAkKENPVkVSQUdFX1pJUCk6ICQoU09PTkdfWklQKQpAQCAtMjcyMSwxNCArMzAwMiwxMyBAQAogCWZpCiAKIGlmZXEgKHRydWUsJChFTU1BX0lOU1RSVU1FTlQpKQotICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICMgQW4gYXJjaGl2ZSBvZiBjbGFzc2VzIGZvciB1c2UgaW4gZ2VuZXJhdGluZyBjb2RlLWNvdmVyYWdlIHJlcG9ydHMKLSAgIyBUaGVzZSBhcmUgdGhlIHVuaW5zdHJ1bWVudGVkIHZlcnNpb25zIG9mIGFueSBjbGFzc2VzIHRoYXQgd2VyZQotICAjIHRvIGJlIGluc3RydW1lbnRlZC4KLSAgIyBBbnkgZGVwZW5kZW5jaWVzIGFyZSBzZXQgdXAgbGF0ZXIgaW4gYnVpbGQvY29yZS9tYWluLm1rLgorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBBbiBhcmNoaXZlIG9mIGNsYXNzZXMgZm9yIHVzZSBpbiBnZW5lcmF0aW5nIGNvZGUtY292ZXJhZ2UgcmVwb3J0cworIyBUaGVzZSBhcmUgdGhlIHVuaW5zdHJ1bWVudGVkIHZlcnNpb25zIG9mIGFueSBjbGFzc2VzIHRoYXQgd2VyZQorIyB0byBiZSBpbnN0cnVtZW50ZWQuCisjIEFueSBkZXBlbmRlbmNpZXMgYXJlIHNldCB1cCBsYXRlciBpbiBidWlsZC9tYWtlL2NvcmUvbWFpbi5tay4KIAotICBpZmVxICgkKEFORFJPSURfQ09NUElMRV9XSVRIX0pBQ0spLGZhbHNlKQotICAgIEpBQ09DT19SRVBPUlRfQ0xBU1NFU19BTEwgOj0gJChQUk9EVUNUX09VVCkvamFjb2NvLXJlcG9ydC1jbGFzc2VzLWFsbC5qYXIKK0pBQ09DT19SRVBPUlRfQ0xBU1NFU19BTEwgOj0gJChQUk9EVUNUX09VVCkvamFjb2NvLXJlcG9ydC1jbGFzc2VzLWFsbC5qYXIKICQoSkFDT0NPX1JFUE9SVF9DTEFTU0VTX0FMTCkgOgogCUBlY2hvICJDb2xsZWN0aW5nIHVuaW5zdHJ1bWVudGVkIGNsYXNzZXMiCiAJJChoaWRlKSBmaW5kICQoVEFSR0VUX0NPTU1PTl9PVVRfUk9PVCkgJChIT1NUX0NPTU1PTl9PVVRfUk9PVCkgLW5hbWUgImphY29jby1yZXBvcnQtY2xhc3Nlcy5qYXIiIHwgXApAQCAtMjczOSwxNCArMzAxOSw2IEBACiAjIC1xIHN1cHJlc3MgbW9zdCBvdXRwdXQKICMgLVggc2tpcCBzdG9yaW5nIGV4dGVuZGVkIGZpbGUgYXR0cmlidXRlcwogCi0gIGVsc2UKLSAgICBFTU1BX01FVEFfWklQIDo9ICQoUFJPRFVDVF9PVVQpL2VtbWFfbWV0YS56aXAKLSQoRU1NQV9NRVRBX1pJUCkgOgotCUBlY2hvICJDb2xsZWN0aW5nIEVtbWEgY292ZXJhZ2UgbWV0YSBmaWxlcy4iCi0JJChoaWRlKSBmaW5kICQoVEFSR0VUX0NPTU1PTl9PVVRfUk9PVCkgJChIT1NUX0NPTU1PTl9PVVRfUk9PVCkgLW5hbWUgImNvdmVyYWdlLmVtIiB8IFwKLQkJemlwIC1AIC1xWCAkQAotZW5kaWYKLQogZW5kaWYgIyBFTU1BX0lOU1RSVU1FTlQ9dHJ1ZQogCiAKQEAgLTI3NTYsMTAgKzMwMjgsMTAgQEAKICMKIGlmZGVmIFRBUkdFVF9CVUlMRF9BUFBTCiBQUk9HVUFSRF9ESUNUX1pJUCA6PSAkKFBST0RVQ1RfT1VUKS8kKFRBUkdFVF9QUk9EVUNUKS1wcm9ndWFyZC1kaWN0LSQoRklMRV9OQU1FX1RBRykuemlwCi0jIHRoZSBkZXBlbmRlbmN5IHdpbGwgYmUgc2V0IHVwIGxhdGVyIGluIGJ1aWxkL2NvcmUvbWFpbi5tay4KKyMgdGhlIGRlcGVuZGVuY3kgd2lsbCBiZSBzZXQgdXAgbGF0ZXIgaW4gYnVpbGQvbWFrZS9jb3JlL21haW4ubWsuCiAkKFBST0dVQVJEX0RJQ1RfWklQKSA6CiAJQGVjaG8gIlBhY2thZ2luZyBQcm9ndWFyZCBvYmZ1c2NhdGlvbiBkaWN0aW9uYXJ5IGZpbGVzLiIKLQkkKGhpZGUpIGRpY3RfZmlsZXM9YGZpbmQgJChUQVJHRVRfT1VUX0NPTU1PTl9JTlRFUk1FRElBVEVTKS9BUFBTIC1uYW1lIHByb2d1YXJkX2RpY3Rpb25hcnkgLW8gLW5hbWUgamFja19kaWN0aW9uYXJ5YDsgXAorCSQoaGlkZSkgZGljdF9maWxlcz1gZmluZCAkKFRBUkdFVF9PVVRfQ09NTU9OX0lOVEVSTUVESUFURVMpL0FQUFMgLW5hbWUgcHJvZ3VhcmRfZGljdGlvbmFyeWA7IFwKIAkJaWYgWyAtbiAiJCRkaWN0X2ZpbGVzIiBdOyB0aGVuIFwKIAkJICB1bm9iZnVzY2F0ZWRfamFycz0kJHtkaWN0X2ZpbGVzLy9wcm9ndWFyZF9kaWN0aW9uYXJ5L2NsYXNzZXMuamFyfTsgXAogCQkgIHppcCAtcVggJEAgJCRkaWN0X2ZpbGVzICQkdW5vYmZ1c2NhdGVkX2phcnM7IFwKQEAgLTI3OTYsNiArMzA2OCwxNSBAQAogdmVuZG9yaW1hZ2U6ICQoSU5TVEFMTEVEX1FFTVVfVkVORE9SSU1BR0UpCiBkcm9pZGNvcmU6ICQoSU5TVEFMTEVEX1FFTVVfVkVORE9SSU1BR0UpCiBlbmRpZgoraWZlcSAoJChCT0FSRF9VU0VTX1BST0RVQ1RJTUFHRSksdHJ1ZSkKK0lOU1RBTExFRF9RRU1VX1BST0RVQ1RJTUFHRSA6PSAkKFBST0RVQ1RfT1VUKS9wcm9kdWN0LXFlbXUuaW1nCiskKElOU1RBTExFRF9RRU1VX1BST0RVQ1RJTUFHRSk6ICQoSU5TVEFMTEVEX1BST0RVQ1RJTUFHRV9UQVJHRVQpICQoTUtfUUVNVV9JTUFHRV9TSCkgJChTR0RJU0tfSE9TVCkKKwlAZWNobyBDcmVhdGUgcHJvZHVjdC1xZW11LmltZworCShleHBvcnQgU0dESVNLPSQoU0dESVNLX0hPU1QpOyAkKE1LX1FFTVVfSU1BR0VfU0gpICR7UFJPRFVDVF9PVVR9L3Byb2R1Y3QuaW1nKQorCitwcm9kdWN0aW1hZ2U6ICQoSU5TVEFMTEVEX1FFTVVfUFJPRFVDVElNQUdFKQorZHJvaWRjb3JlOiAkKElOU1RBTExFRF9RRU1VX1BST0RVQ1RJTUFHRSkKK2VuZGlmCiBlbmRpZgogIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIyBUaGUgZW11bGF0b3IgcGFja2FnZQpAQCAtMjk0Miw3ICszMjIzLDYgQEAKIAkJCS12ICJUQVJHRVRfQ1BVX0FCST0kKFRBUkdFVF9DUFVfQUJJKSIgXAogCQkJLXYgIkRMTF9FWFRFTlNJT049JChIT1NUX1NITElCX1NVRkZJWCkiIFwKIAkJCS12ICJGT05UX09VVD0kKFNES19GT05UX1RFTVApIiBcCi0JCQktdiAiSkFDS19TREtUT09MX1ZFUlNJT049JChKQUNLX1NES1RPT0xfVkVSU0lPTikiIFwKIAkJCS1vICQoUFJJVkFURV9ESVIpICYmIFwKIAkJY3AgLWYgJCh0YXJnZXRfbm90aWNlX2ZpbGVfdHh0KSBcCiAJCQkJJChQUklWQVRFX0RJUikvc3lzdGVtLWltYWdlcy9hbmRyb2lkLSQoUExBVEZPUk1fVkVSU0lPTikvJChUQVJHRVRfQ1BVX0FCSSkvTk9USUNFLnR4dCAmJiBcCkBAIC0zMDAzLDMgKzMyODMsOSBAQAogaWZuZXEgKCQoc2RrX3JlcG9fZ29hbCksKQogaW5jbHVkZSAkKFRPUERJUilkZXZlbG9wbWVudC9idWlsZC90b29scy9zZGtfcmVwby5tawogZW5kaWYKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBGaW5kIGxzZHVtcCBwYXRocworRklORF9MU0RVTVBTX0ZJTEUgOj0gJChQUk9EVUNUX09VVCkvbHNkdW1wX3BhdGhzLnR4dAorJChGSU5EX0xTRFVNUFNfRklMRSkgOiAkKExTRFVNUF9QQVRIUykKKwkkKGhpZGUpIHJtIC1yZiAkQCAmJiBlY2hvICIkXiIgPiAkQApkaWZmIC0tZ2l0IGEvY29yZS9hYXB0Mi5tayBiL2NvcmUvYWFwdDIubWsKaW5kZXggMjg3ZjkzMy4uYjNhN2M5MyAxMDA2NDQKLS0tIGEvY29yZS9hYXB0Mi5taworKysgYi9jb3JlL2FhcHQyLm1rCkBAIC0xMiw2ICsxMiw3IEBACiAjIC0gcHJvZ3VhcmRfb3B0aW9uc19maWxlCiAjIC0gbXlfZ2VuZXJhdGVkX3Jlc19kaXJzOiBSZXNvdXJjZXMgZ2VuZXJhdGVkIGR1cmluZyB0aGUgYnVpbGQgcHJvY2VzcyBhbmQgd2UgaGF2ZSB0byBjb21waWxlIHRoZW0gaW4gYSBzaW5nbGUgcnVuIG9mIGFhcHQyLgogIyAtIG15X2dlbmVyYXRlZF9yZXNfZGlyc19kZXBzOiB0aGUgZGVwZW5kZW5jeSB0byB1c2UgZm9yIG15X2dlbmVyYXRlZF9yZXNfZGlycy4KKyMgLSBteV9nZW5lcmF0ZWRfcmVzX3ppcHM6IFppcCBmaWxlcyBjb250YWluaW5nIHJlc291cmNlcwogIyAtIG15X2Fwa19zcGxpdF9jb25maWdzOiBUaGUgY29uZmlndXJhdGlvbnMgZm9yIHdoaWNoIHRvIGdlbmVyYXRlIHNwbGl0cy4KICMgLSBidWlsdF9hcGtfc3BsaXRzOiBUaGUgcGF0aHMgd2hlcmUgQUFQVCBzaG91bGQgZ2VuZXJhdGUgdGhlIHNwbGl0cy4KICMKQEAgLTM1LDcgKzM2LDcgQEAKICAgICAkKGV2YWwgJChjYWxsIGFhcHQyLWNvbXBpbGUtb25lLXJlc291cmNlLWZpbGUtcnVsZSwkKHIpLCQobykpKVwKICAgICAkKG8pKQogCi1teV9nZW5lcmF0ZWRfcmVzb3VyY2VzX2ZsYXRhIDo9CitteV9yZXNvdXJjZXNfZmxhdGEgOj0KICMgQ29tcGlsZSBnZW5lcmF0ZWQgcmVzb3VyY2VzCiBpZm5lcSAoJChteV9nZW5lcmF0ZWRfcmVzX2RpcnMpLCkKIG15X2dlbmVyYXRlZF9yZXNvdXJjZXNfZmxhdGEgOj0gJChteV9jb21waWxlZF9yZXNfYmFzZV9kaXIpL2dlbl9yZXMuZmxhdGEKQEAgLTQ0LDE0ICs0NSwyOSBAQAogCUBlY2hvICJBQVBUMiBjb21waWxlICRAIDwtICQoUFJJVkFURV9TT1VSQ0VfUkVTX0RJUlMpIgogCSQoY2FsbCBhYXB0Mi1jb21waWxlLXJlc291cmNlLWRpcnMpCiAKLW15X2dlbmVyYXRlZF9yZXNvdXJjZXNfZmxhdGEgKz0gJChteV9nZW5lcmF0ZWRfcmVzb3VyY2VzX2ZsYXRhKQorbXlfcmVzb3VyY2VzX2ZsYXRhICs9ICQobXlfZ2VuZXJhdGVkX3Jlc291cmNlc19mbGF0YSkKIGVuZGlmCiAKLSQobXlfcmVzX3Jlc291cmNlc19mbGF0KSAkKG15X292ZXJsYXlfcmVzb3VyY2VzX2ZsYXQpICQobXlfZ2VuZXJhdGVkX3Jlc291cmNlc19mbGF0YSk6IFwKLSAgUFJJVkFURV9BQVBUMl9DRkxBR1MgOj0gJChQUk9EVUNUX0FBUFQyX0NGTEFHUykKKyMgQ29tcGlsZSB6aXBwZWQgcmVzb3VyY2VzCitpZm5lcSAoJChteV9nZW5lcmF0ZWRfcmVzX3ppcHMpLCkKK215X3ppcHBlZF9yZXNvdXJjZXNfZmxhdGEgOj0gJChteV9jb21waWxlZF9yZXNfYmFzZV9kaXIpL3ppcF9yZXMuZmxhdGEKKyQobXlfemlwcGVkX3Jlc291cmNlc19mbGF0YSk6IFBSSVZBVEVfU09VUkNFX1JFU19aSVBTIDo9ICQobXlfZ2VuZXJhdGVkX3Jlc196aXBzKQorJChteV96aXBwZWRfcmVzb3VyY2VzX2ZsYXRhKSA6ICQobXlfZ2VuZXJhdGVkX3Jlc196aXBzKSAkKEFBUFQyKSAkKFpJUFNZTkMpCisJQGVjaG8gIkFBUFQyIGNvbXBpbGUgJEAgPC0gJChQUklWQVRFX1NPVVJDRV9SRVNfWklQUykiCisJJChjYWxsIGFhcHQyLWNvbXBpbGUtcmVzb3VyY2UtemlwcykKKworbXlfcmVzb3VyY2VzX2ZsYXRhICs9ICQobXlfemlwcGVkX3Jlc291cmNlc19mbGF0YSkKK2VuZGlmCisKKyMgQWx3YXlzIHNldCAtLXBzZXVkby1sb2NhbGl6ZSwgaXQgd2lsbCBiZSBzdHJpcHBlZCBvdXQgbGF0ZXIgZm9yIHJlbGVhc2UKKyMgYnVpbGRzIHRoYXQgZG9uJ3Qgd2FudCBpdC4KKyQobXlfcmVzX3Jlc291cmNlc19mbGF0KSAkKG15X292ZXJsYXlfcmVzb3VyY2VzX2ZsYXQpICQobXlfcmVzb3VyY2VzX2ZsYXRhKTogXAorICBQUklWQVRFX0FBUFQyX0NGTEFHUyA6PSAtLXBzZXVkby1sb2NhbGl6ZQogCiBteV9zdGF0aWNfbGlicmFyeV9yZXNvdXJjZXMgOj0gJChmb3JlYWNoIGwsICQoY2FsbCByZXZlcnNlLWxpc3QsJChMT0NBTF9TVEFUSUNfQU5EUk9JRF9MSUJSQVJJRVMpKSxcCiAgICQoY2FsbCBpbnRlcm1lZGlhdGVzLWRpci1mb3IsSkFWQV9MSUJSQVJJRVMsJChsKSwsQ09NTU9OKS9wYWNrYWdlLXJlcy5hcGspCitteV9zdGF0aWNfbGlicmFyeV9leHRyYV9wYWNrYWdlcyA6PSAkKGZvcmVhY2ggbCwgJChjYWxsIHJldmVyc2UtbGlzdCwkKExPQ0FMX1NUQVRJQ19BTkRST0lEX0xJQlJBUklFUykpLFwKKyAgJChjYWxsIGludGVybWVkaWF0ZXMtZGlyLWZvcixKQVZBX0xJQlJBUklFUywkKGwpLCxDT01NT04pL2V4dHJhX3BhY2thZ2VzKQogbXlfc2hhcmVkX2xpYnJhcnlfcmVzb3VyY2VzIDo9ICQoZm9yZWFjaCBsLCAkKExPQ0FMX1NIQVJFRF9BTkRST0lEX0xJQlJBUklFUyksXAogICAkKGNhbGwgaW50ZXJtZWRpYXRlcy1kaXItZm9yLEpBVkFfTElCUkFSSUVTLCQobCksLENPTU1PTikvcGFja2FnZS1yZXMuYXBrKQogCkBAIC02NCwyOCArODAsMjUgQEAKICQobXlfcmVzX3BhY2thZ2UpOiBQUklWQVRFX0FBUFRfRkxBR1MgKz0gJChhZGRwcmVmaXggLS1zcGxpdCAsJChqb2luICQoYnVpbHRfYXBrX3NwbGl0cyksJChhZGRwcmVmaXggOiwkKG15X2Fwa19zcGxpdF9jb25maWdzKSkpKQogZW5kaWYKIAorbXlfc3JjamFyIDo9ICQoaW50ZXJtZWRpYXRlcy5DT01NT04pL2FhcHQyLnNyY2phcgorTE9DQUxfU1JDSkFSUyArPSAkKG15X3NyY2phcikKKworYWFwdF9leHRyYV9wYWNrYWdlcyA6PSAkKGludGVybWVkaWF0ZXMuQ09NTU9OKS9leHRyYV9wYWNrYWdlcworCiAkKG15X3Jlc19wYWNrYWdlKTogUFJJVkFURV9SRVNfRkxBVCA6PSAkKG15X3Jlc19yZXNvdXJjZXNfZmxhdCkKLSQobXlfcmVzX3BhY2thZ2UpOiBQUklWQVRFX09WRVJMQVlfRkxBVCA6PSAkKG15X3N0YXRpY19saWJyYXJ5X3Jlc291cmNlcykgJChteV9nZW5lcmF0ZWRfcmVzb3VyY2VzX2ZsYXRhKSAkKG15X292ZXJsYXlfcmVzb3VyY2VzX2ZsYXQpCiskKG15X3Jlc19wYWNrYWdlKTogUFJJVkFURV9PVkVSTEFZX0ZMQVQgOj0gJChteV9zdGF0aWNfbGlicmFyeV9yZXNvdXJjZXMpICQobXlfcmVzb3VyY2VzX2ZsYXRhKSAkKG15X292ZXJsYXlfcmVzb3VyY2VzX2ZsYXQpCiAkKG15X3Jlc19wYWNrYWdlKTogUFJJVkFURV9TSEFSRURfQU5EUk9JRF9MSUJSQVJJRVMgOj0gJChteV9zaGFyZWRfbGlicmFyeV9yZXNvdXJjZXMpCiAkKG15X3Jlc19wYWNrYWdlKTogUFJJVkFURV9QUk9HVUFSRF9PUFRJT05TX0ZJTEUgOj0gJChwcm9ndWFyZF9vcHRpb25zX2ZpbGUpCiAkKG15X3Jlc19wYWNrYWdlKTogUFJJVkFURV9BU1NFVF9ESVJTIDo9ICQobXlfYXNzZXRfZGlycykKLSQobXlfcmVzX3BhY2thZ2UpOiAkKGZ1bGxfYW5kcm9pZF9tYW5pZmVzdCkgJChteV9zdGF0aWNfbGlicmFyeV9yZXNvdXJjZXMpICQobXlfc2hhcmVkX2xpYnJhcnlfcmVzb3VyY2VzKQotJChteV9yZXNfcGFja2FnZSk6ICQobXlfZnVsbF9hc3NldF9wYXRocykKLSQobXlfcmVzX3BhY2thZ2UpOiAkKG15X3Jlc19yZXNvdXJjZXNfZmxhdCkgJChteV9vdmVybGF5X3Jlc291cmNlc19mbGF0KSBcCi0gICQobXlfZ2VuZXJhdGVkX3Jlc291cmNlc19mbGF0YSkgJChteV9zdGF0aWNfbGlicmFyeV9yZXNvdXJjZXMpIFwKLSAgJChBQVBUMikKLQlAZWNobyAiQUFQVDIgbGluayAkQCIKLQkkKGNhbGwgYWFwdDItbGluaykKKyQobXlfcmVzX3BhY2thZ2UpOiBQUklWQVRFX0pBVkFfR0VOX0RJUiA6PSAkKGludGVybWVkaWF0ZXMuQ09NTU9OKS9hYXB0MgorJChteV9yZXNfcGFja2FnZSk6IFBSSVZBVEVfU1JDSkFSIDo9ICQobXlfc3JjamFyKQorJChteV9yZXNfcGFja2FnZSk6IFBSSVZBVEVfU1RBVElDX0xJQlJBUllfRVhUUkFfUEFDS0FHRVMgOj0gJChteV9zdGF0aWNfbGlicmFyeV9leHRyYV9wYWNrYWdlcykKKyQobXlfcmVzX3BhY2thZ2UpOiBQUklWQVRFX0FBUFRfRVhUUkFfUEFDS0FHRVMgOj0gJChhYXB0X2V4dHJhX3BhY2thZ2VzKQorJChteV9yZXNfcGFja2FnZSk6IC5LQVRJX0lNUExJQ0lUX09VVFBVVFMgOj0gJChteV9zcmNqYXIpICQoYWFwdF9leHRyYV9wYWNrYWdlcykKIAogaWZkZWYgUl9maWxlX3N0YW1wCi0kKFJfZmlsZV9zdGFtcCkgOiAkKG15X3Jlc19wYWNrYWdlKSB8ICQoQUNQKQotCUBlY2hvICJ0YXJnZXQgUi5qYXZhL01hbmlmZXN0LmphdmE6ICQoUFJJVkFURV9NT0RVTEUpICgkQCkiCi0JQHJtIC1yZiAkQCAmJiBta2RpciAtcCAkKGRpciAkQCkKLQkkKGNhbGwgZmluZC1nZW5lcmF0ZWQtUi5qYXZhKQotZW5kaWYKLQotaWZkZWYgcHJvZ3VhcmRfb3B0aW9uc19maWxlCi0kKHByb2d1YXJkX29wdGlvbnNfZmlsZSkgOiAkKG15X3Jlc19wYWNrYWdlKQorJChteV9yZXNfcGFja2FnZSk6IFBSSVZBVEVfUl9GSUxFX1NUQU1QIDo9ICQoUl9maWxlX3N0YW1wKQorJChteV9yZXNfcGFja2FnZSk6IC5LQVRJX0lNUExJQ0lUX09VVFBVVFMgKz0gJChSX2ZpbGVfc3RhbXApCiBlbmRpZgogCiByZXNvdXJjZV9leHBvcnRfcGFja2FnZSA6PQpAQCAtOTQsMTAgKzEwNywzOCBAQAogIyBvdGhlciBwYWNrYWdlcyBjYW4gdXNlIHRvIGJ1aWxkIHRoZWlyIG93biBQUk9EVUNULWFnbm9zdGljIFIuamF2YSAoZXRjLikKICMgZmlsZXMuCiByZXNvdXJjZV9leHBvcnRfcGFja2FnZSA6PSAkKGludGVybWVkaWF0ZXMuQ09NTU9OKS9wYWNrYWdlLWV4cG9ydC5hcGsKLSQoUl9maWxlX3N0YW1wKSA6ICQocmVzb3VyY2VfZXhwb3J0X3BhY2thZ2UpCi0KLSQocmVzb3VyY2VfZXhwb3J0X3BhY2thZ2UpIDogJChteV9yZXNfcGFja2FnZSkgfCAkKEFDUCkKLQlAZWNobyAidGFyZ2V0IEV4cG9ydCBSZXNvdXJjZXM6ICQoUFJJVkFURV9NT0RVTEUpICQoQCkiCi0JJChjb3B5LWZpbGUtdG8tbmV3LXRhcmdldCkKLQorJChteV9yZXNfcGFja2FnZSk6IFBSSVZBVEVfUkVTT1VSQ0VfRVhQT1JUX1BBQ0tBR0UgOj0gJChyZXNvdXJjZV9leHBvcnRfcGFja2FnZSkKKyQobXlfcmVzX3BhY2thZ2UpOiAuS0FUSV9JTVBMSUNJVF9PVVRQVVRTICs9ICQocmVzb3VyY2VfZXhwb3J0X3BhY2thZ2UpCiBlbmRpZgorCitpZmRlZiBwcm9ndWFyZF9vcHRpb25zX2ZpbGUKKyQobXlfcmVzX3BhY2thZ2UpOiAuS0FUSV9JTVBMSUNJVF9PVVRQVVRTICs9ICQocHJvZ3VhcmRfb3B0aW9uc19maWxlKQorZW5kaWYKKworJChteV9yZXNfcGFja2FnZSk6ICQoZnVsbF9hbmRyb2lkX21hbmlmZXN0KSAkKG15X3N0YXRpY19saWJyYXJ5X3Jlc291cmNlcykgJChteV9zaGFyZWRfbGlicmFyeV9yZXNvdXJjZXMpCiskKG15X3Jlc19wYWNrYWdlKTogJChteV9mdWxsX2Fzc2V0X3BhdGhzKQorJChteV9yZXNfcGFja2FnZSk6ICQobXlfcmVzX3Jlc291cmNlc19mbGF0KSAkKG15X292ZXJsYXlfcmVzb3VyY2VzX2ZsYXQpIFwKKyAgJChteV9yZXNvdXJjZXNfZmxhdGEpICQobXlfc3RhdGljX2xpYnJhcnlfcmVzb3VyY2VzKSAkKG15X3N0YXRpY19saWJyYXJ5X2V4dHJhX3BhY2thZ2VzKSBcCisgICQoQUFQVDIpICQoU09PTkdfWklQKSAkKEVYVFJBQ1RfSkFSX1BBQ0tBR0VTKQorCUBlY2hvICJBQVBUMiBsaW5rICRAIgorCSQoY2FsbCBhYXB0Mi1saW5rKQoraWZkZWYgUl9maWxlX3N0YW1wCisJQHJtIC1mICQoUFJJVkFURV9SX0ZJTEVfU1RBTVApCisJJChjYWxsIGZpbmQtZ2VuZXJhdGVkLVIuamF2YSwkKFBSSVZBVEVfSkFWQV9HRU5fRElSKSwkKFBSSVZBVEVfUl9GSUxFX1NUQU1QKSkKK2VuZGlmCitpZmRlZiBMT0NBTF9FWFBPUlRfUEFDS0FHRV9SRVNPVVJDRVMKKwlAcm0gLWYgJChQUklWQVRFX1JFU09VUkNFX0VYUE9SVF9QQUNLQUdFKQorCisJY3AgJEAgJChQUklWQVRFX1JFU09VUkNFX0VYUE9SVF9QQUNLQUdFKQorZW5kaWYKKworIyBDbGVhciBpbnB1dHMgb25seSB1c2VkIGluIHRoaXMgZmlsZSwgc28gdGhhdCB0aGV5J3JlIG5vdCByZS11c2VkIGR1cmluZyB0aGUgbmV4dCBidWlsZAorbXlfcmVzX3Jlc291cmNlcyA6PQorbXlfb3ZlcmxheV9yZXNvdXJjZXMgOj0KK215X2NvbXBpbGVkX3Jlc19iYXNlX2RpciA6PQorbXlfYXNzZXRfZGlycyA6PQorbXlfZnVsbF9hc3NldF9wYXRocyA6PQorbXlfYXBrX3NwbGl0X2NvbmZpZ3MgOj0KK215X2dlbmVyYXRlZF9yZXNfZGlycyA6PQorbXlfZ2VuZXJhdGVkX3Jlc19kaXJzX2RlcHMgOj0KK215X2dlbmVyYXRlZF9yZXNfemlwcyA6PQpkaWZmIC0tZ2l0IGEvY29yZS9hYXB0X2ZsYWdzLm1rIGIvY29yZS9hYXB0X2ZsYWdzLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzZDQ4MTcKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2FhcHRfZmxhZ3MubWsKQEAgLTAsMCArMSwxNSBAQAorIyMgQUFQVCBGbGFncworIyBhYXB0IGRvZXNuJ3QgYWNjZXB0IG11bHRpcGxlIC0tZXh0cmEtcGFja2FnZXMgZmxhZ3MuCisjIFdlIGhhdmUgdG8gY29sbGFwc2UgdGhlbSBpbnRvIGEgc2luZ2xlIC0tZXh0cmEtcGFja2FnZXMgZmxhZyBoZXJlLgorTE9DQUxfQUFQVF9GTEFHUyA6PSAkKHN0cmlwICQoTE9DQUxfQUFQVF9GTEFHUykpCitpZmRlZiBMT0NBTF9BQVBUX0ZMQUdTCisgIGlmZXEgKCQoZmlsdGVyIDAgMSwkKHdvcmRzICQoZmlsdGVyIC0tZXh0cmEtcGFja2FnZXMsJChMT0NBTF9BQVBUX0ZMQUdTKSkpKSwpCisgICAgYWFwdF9mbGFncyA6PSAkKHN1YnN0IC0tZXh0cmEtcGFja2FnZXMkKHNwYWNlKSwtLWV4dHJhLXBhY2thZ2VzQCwkKExPQ0FMX0FBUFRfRkxBR1MpKQorICAgIGFhcHRfZmxhZ3NfZXh0cmFfcGFja2FnZXMgOj0gJChwYXRzdWJzdCAtLWV4dHJhLXBhY2thZ2VzQCUsJSwkKGZpbHRlciAtLWV4dHJhLXBhY2thZ2VzQCUsJChhYXB0X2ZsYWdzKSkpCisgICAgYWFwdF9mbGFnc19leHRyYV9wYWNrYWdlcyA6PSAkKHNvcnQgJChzdWJzdCA6LCQoc3BhY2UpLCQoYWFwdF9mbGFnc19leHRyYV9wYWNrYWdlcykpKQorICAgIExPQ0FMX0FBUFRfRkxBR1MgOj0gJChmaWx0ZXItb3V0IC0tZXh0cmEtcGFja2FnZXNAJSwkKGFhcHRfZmxhZ3MpKSBcCisgICAgICAgIC0tZXh0cmEtcGFja2FnZXMgJChzdWJzdCAkKHNwYWNlKSw6LCQoYWFwdF9mbGFnc19leHRyYV9wYWNrYWdlcykpCisgICAgYWFwdF9mbGFnc19leHRyYV9wYWNrYWdlcyA6PQorICAgIGFhcHRfZmxhZ3MgOj0KKyAgZW5kaWYKK2VuZGlmCmRpZmYgLS1naXQgYS9jb3JlL2FsbG93ZWRfbmRrX3R5cGVzLm1rIGIvY29yZS9hbGxvd2VkX25ka190eXBlcy5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODhiOWU4Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9hbGxvd2VkX25ka190eXBlcy5tawpAQCAtMCwwICsxLDg0IEBACisjIERldGVybWluZXMgdGhlIHR5cGVzIG9mIE5ESyBtb2R1bGVzIHRoZSBjdXJyZW50IG1vZHVsZSBpcyBhbGxvd2VkIHRvIGxpbmsgdG8uCisjIElucHV0IHZhcmlhYmxlczoKKyMgICBMT0NBTF9NT0RVTEUKKyMgICBMT0NBTF9NT0RVTEVfQ0xBU1MKKyMgICBMT0NBTF9OREtfU1RMX1ZBUklBTlQKKyMgICBMT0NBTF9TREtfVkVSU0lPTgorIyBPdXRwdXQgdmFyaWFibGVzOgorIyAgIG15X25ka19zdGxfZmFtaWx5OiBGYW1pbHkgb2YgdGhlIE5ESyBTVEwuCisjICAgbXlfbmRrX3N0bF9saW5rX3R5cGU6IFNUTCBsaW5rIHR5cGUsIHN0YXRpYyBvciBzaGFyZWQuCisjICAgbXlfYWxsb3dlZF9uZGtfdHlwZXM6IFR5cGVzIG9mIE5ESyBtb2R1bGVzIHRoYXQgbWF5IGJlIGxpbmtlZC4KKyMgICBteV93YXJuX25ka190eXBlczogVHlwZXMgb2YgTkRLIG1vZHVsZXMgdGhhdCBzaG91bGRuJ3QgYmUgbGlua2VkLCBidXQgYXJlLgorCitteV9hbGxvd2VkX25ka190eXBlcyA6PQorbXlfd2Fybl9uZGtfdHlwZXMgOj0KK215X25ka19zdGxfZmFtaWx5IDo9CitteV9uZGtfc3RsX2xpbmtfdHlwZSA6PQorCitpZmRlZiBMT0NBTF9TREtfVkVSU0lPTgorICAgIGlmZXEgKCQoTE9DQUxfTkRLX1NUTF9WQVJJQU5UKSwpCisgICAgICAgIG15X25ka19zdGxfZmFtaWx5IDo9IHN5c3RlbQorICAgICAgICBteV9uZGtfc3RsX2xpbmtfdHlwZSA6PSBzaGFyZWQKKyAgICBlbHNlIGlmZXEgKCQoTE9DQUxfTkRLX1NUTF9WQVJJQU5UKSxzeXN0ZW0pCisgICAgICAgIG15X25ka19zdGxfZmFtaWx5IDo9IHN5c3RlbQorICAgICAgICBteV9uZGtfc3RsX2xpbmtfdHlwZSA6PSBzaGFyZWQKKyAgICBlbHNlIGlmZXEgKCQoTE9DQUxfTkRLX1NUTF9WQVJJQU5UKSxjKytfc2hhcmVkKQorICAgICAgICBteV9uZGtfc3RsX2ZhbWlseSA6PSBsaWJjKysKKyAgICAgICAgbXlfbmRrX3N0bF9saW5rX3R5cGUgOj0gc2hhcmVkCisgICAgZWxzZSBpZmVxICgkKExPQ0FMX05ES19TVExfVkFSSUFOVCksYysrX3N0YXRpYykKKyAgICAgICAgbXlfbmRrX3N0bF9mYW1pbHkgOj0gbGliYysrCisgICAgICAgIG15X25ka19zdGxfbGlua190eXBlIDo9IHN0YXRpYworICAgIGVsc2UgaWZlcSAoJChMT0NBTF9OREtfU1RMX1ZBUklBTlQpLG5vbmUpCisgICAgICAgIG15X25ka19zdGxfZmFtaWx5IDo9IG5vbmUKKyAgICAgICAgbXlfbmRrX3N0bF9saW5rX3R5cGUgOj0gbm9uZQorICAgIGVsc2UKKyAgICAgICAgJChjYWxsIHByZXR0eS1lcnJvcixpbnZhbGlkIExPQ0FMX05ES19TVExfVkFSSUFOVDogJChMT0NBTF9OREtfU1RMX1ZBUklBTlQpKQorICAgIGVuZGlmCisKKyAgICBpZmVxICgkKExPQ0FMX01PRFVMRV9DTEFTUyksU1RBVElDX0xJQlJBUklFUykKKyAgICAgICAgIyBUaGUgIm5vbmUiIGxpbmsgdHlwZSBpbmRpY2F0ZXMgdGhhdCBub3RoaW5nIGlzIGFjdHVhbGx5IGxpbmtlZC4gU2luY2UKKyAgICAgICAgIyB0aGlzIGlzIGEgc3RhdGljIGxpYnJhcnksIGl0J3Mgc3RpbGwgdXAgdG8gdGhlIGZpbmFsIHVzZSBvZiB0aGUKKyAgICAgICAgIyBsaWJyYXJ5IHdoZXRoZXIgYSBzdGF0aWMgb3Igc2hhcmVkIFNUTCBzaG91bGQgYmUgdXNlZC4KKyAgICAgICAgbXlfbmRrX3N0bF9saW5rX3R5cGUgOj0gbm9uZQorICAgIGVuZGlmCisKKyAgICAjIFRoZSBzeXN0ZW0gU1RMIGlzIG9ubHkgdGhlIEMrKyBBQkkgbGF5ZXIsIHNvIGl0J3MgY29tcGF0aWJsZSB3aXRoIGFueSBTVEwuCisgICAgbXlfYWxsb3dlZF9uZGtfdHlwZXMgKz0gbmF0aXZlOm5kazpzeXN0ZW06c2hhcmVkCisgICAgbXlfYWxsb3dlZF9uZGtfdHlwZXMgKz0gbmF0aXZlOm5kazpzeXN0ZW06bm9uZQorCisgICAgIyBMaWJhcmllcyB0aGF0IGRvbid0IHVzZSB0aGUgU1RMIGNhbiBiZSBsaW5rZWQgdG8gYW55dGhpbmcuCisgICAgbXlfYWxsb3dlZF9uZGtfdHlwZXMgKz0gbmF0aXZlOm5kazpub25lOm5vbmUKKworICAgICMgQW5kIGl0J3MgYWx3YXlzIG9rYXkgdG8gbGluayBhIHN0YXRpYyBsaWJyYXJ5IHRoYXQgdXNlcyB5b3VyIG93biBTVEwgdHlwZS4KKyAgICAjIFNpbmNlIG5vdGhpbmcgd2FzIGFjdHVhbGx5IGxpbmtlZCBmb3IgdGhlIHN0YXRpYyBsaWJyYXJ5LCBpdCBpcyB1cCB0byB0aGUKKyAgICAjIGZpcnN0IGxpbmtlZCBsaWJyYXJ5IGluIHRoZSBkZXBlbmRlbmN5IGNoYWluIHdoaWNoIGdldHMgdXNlZC4KKyAgICBteV9hbGxvd2VkX25ka190eXBlcyArPSBuYXRpdmU6bmRrOiQobXlfbmRrX3N0bF9mYW1pbHkpOm5vbmUKKworICAgIGlmZXEgKCQoTE9DQUxfTU9EVUxFX0NMQVNTKSxBUFBTKQorICAgICAgICAjIEZvciBhbiBhcHAgcGFja2FnZSwgaXQncyBhY3R1YWxseSBva2F5IHRvIGRlcGVuZCBvbiBhbnkgc2V0IG9mIFNUTHMuCisgICAgICAgICMgSWYgYW55IG9mIHRoZSBpbmRpdmlkdWFsIGxpYnJhcmllcyBkZXBlbmQgb24gZWFjaCBvdGhlciB0aGV5J3ZlCisgICAgICAgICMgYWxyZWFkeSBiZWVuIGNoZWNrZWQgZm9yIGNvbnNpc3RlbmN5LCBhbmQgaWYgdGhleSBkb24ndCB0aGV5J2xsIGJlCisgICAgICAgICMga2VwdCBpc29sYXRlZCBieSBSVExEX0xPQ0FMIGFueXdheS4KKyAgICAgICAgbXlfYWxsb3dlZF9uZGtfdHlwZXMgKz0gXAorICAgICAgICAgICAgbmF0aXZlOm5kazpsaWJjKys6c2hhcmVkIG5hdGl2ZTpuZGs6bGliYysrOnN0YXRpYworCisgICAgICAgICMgVGhlICJub25lIiBsaW5rIHR5cGUgdGhhdCB1c2VkIGJ5IHN0YXRpYyBsaWJyYXJpZXMgaXMgaW50ZW50aW9uYWxseQorICAgICAgICAjIG9taXR0ZWQgaGVyZS4gV2Ugc2hvdWxkIG9ubHkgYmUgZGVhbGluZyB3aXRoIHNoYXJlZCBsaWJyYXJpZXMgaW4KKyAgICAgICAgIyBMT0NBTF9KTklfU0hBUkVEX0xJQlJBUklFUy4KKyAgICBlbHNlIGlmZXEgKCQobXlfbmRrX3N0bF9saW5rX3R5cGUpLHNoYXJlZCkKKyAgICAgICAgIyBNb2R1bGVzIGxpbmtlZCB0byBhIHNoYXJlZCBTVEwgY2FuIG9ubHkgdXNlIGFub3RoZXIgc2hhcmVkIFNUTC4KKyAgICAgICAgbXlfYWxsb3dlZF9uZGtfdHlwZXMgKz0gbmF0aXZlOm5kazokKG15X25ka19zdGxfZmFtaWx5KTpzaGFyZWQKKyAgICBlbmRpZgorICAgICMgRWxzZSB3ZSBhcmUgYSBub24tc3RhdGljIGxpYnJhcnkgdGhhdCB1c2VzIGEgc3RhdGljIFNUTCwgYW5kIGFyZQorICAgICMgaW5jb21wYXRpYmxlIHdpdGggYWxsIG90aGVyIHNoYXJlZCBsaWJyYXJpZXMgdGhhdCB1c2UgYW4gU1RMLgorZWxzZQorICAgIG15X2FsbG93ZWRfbmRrX3R5cGVzIDo9IFwKKyAgICAgICAgbmF0aXZlOm5kazpub25lOm5vbmUgXAorICAgICAgICBuYXRpdmU6bmRrOnN5c3RlbTpub25lIFwKKyAgICAgICAgbmF0aXZlOm5kazpzeXN0ZW06c2hhcmVkIFwKKworICAgIGlmZXEgKCQoTE9DQUxfTU9EVUxFX0NMQVNTKSxBUFBTKQorICAgICAgICAjIENUUyBpcyBiYWQgYW5kIGl0IHNob3VsZCBmZWVsIGJhZDogaHR0cDovL2IvMTMyNDk3MzcKKyAgICAgICAgbXlfd2Fybl9uZGtfdHlwZXMgKz0gbmF0aXZlOm5kazpsaWJjKys6c3RhdGljCisgICAgZW5kaWYKK2VuZGlmCmRpZmYgLS1naXQgYS9jb3JlL2FuZHJvaWRfbWFuaWZlc3QubWsgYi9jb3JlL2FuZHJvaWRfbWFuaWZlc3QubWsKaW5kZXggMDA5M2UwMi4uN2Q1NzNkMyAxMDA2NDQKLS0tIGEvY29yZS9hbmRyb2lkX21hbmlmZXN0Lm1rCisrKyBiL2NvcmUvYW5kcm9pZF9tYW5pZmVzdC5tawpAQCAtMzQsMTAgKzM0LDEyIEBACiBtYWluX2FuZHJvaWRfbWFuaWZlc3QgOj0gJChmdWxsX2FuZHJvaWRfbWFuaWZlc3QpCiBmdWxsX2FuZHJvaWRfbWFuaWZlc3QgOj0gJChpbnRlcm1lZGlhdGVzLkNPTU1PTikvQW5kcm9pZE1hbmlmZXN0LnhtbAogJChmdWxsX2FuZHJvaWRfbWFuaWZlc3QpOiBQUklWQVRFX0xJQlNfTUFOSUZFU1RTIDo9ICQobXlfZnVsbF9saWJzX21hbmlmZXN0X2ZpbGVzKQorJChmdWxsX2FuZHJvaWRfbWFuaWZlc3QpOiAkKEFORFJPSURfTUFOSUZFU1RfTUVSR0VSX0NMQVNTUEFUSCkKICQoZnVsbF9hbmRyb2lkX21hbmlmZXN0KSA6ICQobWFpbl9hbmRyb2lkX21hbmlmZXN0KSAkKG15X2Z1bGxfbGlic19tYW5pZmVzdF9kZXBzKQogCUBlY2hvICJNZXJnZSBhbmRyb2lkIG1hbmlmZXN0IGZpbGVzOiAkQCA8LS0gJDwgJChQUklWQVRFX0xJQlNfTUFOSUZFU1RTKSIKIAlAbWtkaXIgLXAgJChkaXIgJEApCi0JJChoaWRlKSAkKEFORFJPSURfTUFOSUZFU1RfTUVSR0VSKSAtLW1haW4gJDwgLS1saWJzICQoUFJJVkFURV9MSUJTX01BTklGRVNUUykgXAorCSQoaGlkZSkgJChBTkRST0lEX01BTklGRVNUX01FUkdFUikgLS1tYWluICQ8IFwKKwkgICAgLS1saWJzICQoY2FsbCBub3JtYWxpemUtcGF0aC1saXN0LCQoUFJJVkFURV9MSUJTX01BTklGRVNUUykpIFwKIAkgICAgLS1vdXQgJEAKIAogZW5kaWYKZGlmZiAtLWdpdCBhL2NvcmUvYXBpZGlmZi5tayBiL2NvcmUvYXBpZGlmZi5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmQ3NWZlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9hcGlkaWZmLm1rCkBAIC0wLDAgKzEsMTgxIEBACisjCisjIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisjIworIyMKKyMjIENvbW1vbiB0byBib3RoIGpkaWZmIGFuZCBqYXZhZG9jCisjIworIyMKKworTE9DQUxfSVNfSE9TVF9NT0RVTEUgOj0gJChjYWxsIHRydWUtb3ItZW1wdHksJChMT0NBTF9JU19IT1NUX01PRFVMRSkpCitpZmVxICgkKExPQ0FMX0lTX0hPU1RfTU9EVUxFKSx0cnVlKQorbXlfcHJlZml4IDo9IEhPU1RfCitMT0NBTF9IT1NUX1BSRUZJWCA6PQorZWxzZQorbXlfcHJlZml4IDo9IFRBUkdFVF8KK2VuZGlmCisKK0xPQ0FMX01PRFVMRV9DTEFTUyA6PSAkKHN0cmlwICQoTE9DQUxfTU9EVUxFX0NMQVNTKSkKK2lmbmRlZiBMT0NBTF9NT0RVTEVfQ0xBU1MKKyQoZXJyb3IgJChMT0NBTF9QQVRIKTogTE9DQUxfTU9EVUxFX0NMQVNTIG5vdCBkZWZpbmVkKQorZW5kaWYKKworZnVsbF9zcmNfZmlsZXMgOj0gJChwYXRzdWJzdCAlLCQoTE9DQUxfUEFUSCkvJSwkKExPQ0FMX1NSQ19GSUxFUykpCitvdXRfZGlyIDo9ICQoT1VUX0RPQ1MpLyQoTE9DQUxfTU9EVUxFKS9hcGlfZGlmZi9jdXJyZW50CitmdWxsX3RhcmdldCA6PSAkKGNhbGwgZG9jLXRpbWVzdGFtcC1mb3IsJChMT0NBTF9NT0RVTEUpLWRpZmYpCisKK2lmZXEgKCQoTE9DQUxfSVNfSE9TVF9NT0RVTEUpLHRydWUpCiskKGZ1bGxfdGFyZ2V0KTogUFJJVkFURV9CT09UQ0xBU1NQQVRIIDo9CitmdWxsX2phdmFfbGlicyA6PSAkKGFkZHByZWZpeCAkKEhPU1RfT1VUX0pBVkFfTElCUkFSSUVTKS8sXAorICAkKGFkZHN1ZmZpeCAkKENPTU1PTl9KQVZBX1BBQ0tBR0VfU1VGRklYKSwkKExPQ0FMX0pBVkFfTElCUkFSSUVTKSkpCitmdWxsX2phdmFfbGliX2RlcHMgOj0gJChmdWxsX2phdmFfbGlicykKKworZWxzZQorCitpZm5lcSAoJChMT0NBTF9TREtfVkVSU0lPTiksKQorICBpZmVxICgkKExPQ0FMX1NES19WRVJTSU9OKSQoVEFSR0VUX0JVSUxEX0FQUFMpLGN1cnJlbnQpCisgICAgIyBVc2UgYW5kcm9pZF9zdHVic19jdXJyZW50IGlmIExPQ0FMX1NES19WRVJTSU9OIGlzIGN1cnJlbnQgYW5kIG5vIFRBUkdFVF9CVUlMRF9BUFBTLgorICAgIExPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWRfc3R1YnNfY3VycmVudCAkKExPQ0FMX0pBVkFfTElCUkFSSUVTKQorICAgICQoZnVsbF90YXJnZXQpOiBQUklWQVRFX0JPT1RDTEFTU1BBVEggOj0gJChjYWxsIGphdmEtbGliLWZpbGVzLCBhbmRyb2lkX3N0dWJzX2N1cnJlbnQpCisgIGVsc2UgaWZlcSAoJChMT0NBTF9TREtfVkVSU0lPTikkKFRBUkdFVF9CVUlMRF9BUFBTKSxzeXN0ZW1fY3VycmVudCkKKyAgICBMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkX3N5c3RlbV9zdHVic19jdXJyZW50ICQoTE9DQUxfSkFWQV9MSUJSQVJJRVMpCisgICAgJChmdWxsX3RhcmdldCk6IFBSSVZBVEVfQk9PVENMQVNTUEFUSCA6PSAkKGNhbGwgamF2YS1saWItZmlsZXMsIGFuZHJvaWRfc3lzdGVtX3N0dWJzX2N1cnJlbnQpCisgIGVsc2UgaWZlcSAoJChMT0NBTF9TREtfVkVSU0lPTikkKFRBUkdFVF9CVUlMRF9BUFBTKSx0ZXN0X2N1cnJlbnQpCisgICAgTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZF90ZXN0X3N0dWJzX2N1cnJlbnQgJChMT0NBTF9KQVZBX0xJQlJBUklFUykKKyAgICAkKGZ1bGxfdGFyZ2V0KTogUFJJVkFURV9CT09UQ0xBU1NQQVRIIDo9ICQoY2FsbCBqYXZhLWxpYi1maWxlcywgYW5kcm9pZF90ZXN0X3N0dWJzX2N1cnJlbnQpCisgIGVsc2UKKyAgICAjIGNvcmVfPHZlcj4gaXMgc3Vic2V0IG9mIDx2ZXI+LiBJbnN0ZWFkIG9mIGRlZmluaW5nIGEgcHJlYnVpbHQgbGliIGZvciBjb3JlXzx2ZXI+LAorICAgICMgdXNlIHRoZSBzdHViIGZvciA8dmVyPiB3aGVuIGJ1aWxkaW5nIGZvciBhcHBzLgorICAgIF92ZXJzaW9uIDo9ICQocGF0c3Vic3QgY29yZV8lLCUsJChMT0NBTF9TREtfVkVSU0lPTikpCisgICAgTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gc2RrX3YkKF92ZXJzaW9uKSAkKExPQ0FMX0pBVkFfTElCUkFSSUVTKQorICAgICQoZnVsbF90YXJnZXQpOiBQUklWQVRFX0JPT1RDTEFTU1BBVEggOj0gJChjYWxsIGphdmEtbGliLWZpbGVzLCBzZGtfdiQoX3ZlcnNpb24pKQorICAgIF92ZXJzaW9uIDo9CisgIGVuZGlmCitlbHNlCisgIExPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IGNvcmUtb2ogY29yZS1saWJhcnQgZXh0IGZyYW1ld29yayAkKExPQ0FMX0pBVkFfTElCUkFSSUVTKQorICAkKGZ1bGxfdGFyZ2V0KTogUFJJVkFURV9CT09UQ0xBU1NQQVRIIDo9ICQoY2FsbCBqYXZhLWxpYi1maWxlcywgY29yZS1vaik6JChjYWxsIGphdmEtbGliLWZpbGVzLCBjb3JlLWxpYmFydCkKK2VuZGlmICAjIExPQ0FMX1NES19WRVJTSU9OCitMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSAkKHNvcnQgJChMT0NBTF9KQVZBX0xJQlJBUklFUykpCisKK2Z1bGxfamF2YV9saWJzIDo9ICQoY2FsbCBqYXZhLWxpYi1maWxlcywkKExPQ0FMX0pBVkFfTElCUkFSSUVTKSkgJChMT0NBTF9DTEFTU1BBVEgpCitmdWxsX2phdmFfbGliX2RlcHMgOj0gJChjYWxsIGphdmEtbGliLWRlcHMsJChMT0NBTF9KQVZBX0xJQlJBUklFUykpICQoTE9DQUxfQ0xBU1NQQVRIKQorZW5kaWYgIyAhTE9DQUxfSVNfSE9TVF9NT0RVTEUKKworJChmdWxsX3RhcmdldCk6IFBSSVZBVEVfQ0xBU1NQQVRIIDo9ICQoc3Vic3QgJChzcGFjZSksOiwkKGZ1bGxfamF2YV9saWJzKSkKKyQoZnVsbF90YXJnZXQpOiBQUklWQVRFX0RPQ0xBVkFfQ0xBU1NQQVRIIDo9ICQoSE9TVF9PVVRfSkFWQV9MSUJSQVJJRVMpL2pzaWx2ZXIkKENPTU1PTl9KQVZBX1BBQ0tBR0VfU1VGRklYKTokKEhPU1RfT1VUX0pBVkFfTElCUkFSSUVTKS9kb2NsYXZhJChDT01NT05fSkFWQV9QQUNLQUdFX1NVRkZJWCkKKworaW50ZXJtZWRpYXRlcy5DT01NT04gOj0gJChjYWxsIGxvY2FsLWludGVybWVkaWF0ZXMtZGlyLENPTU1PTikKKworJChmdWxsX3RhcmdldCk6IFBSSVZBVEVfU09VUkNFX1BBVEggOj0gJChjYWxsIG5vcm1hbGl6ZS1wYXRoLWxpc3QsJChMT0NBTF9EUk9JRERPQ19TT1VSQ0VfUEFUSCkpCiskKGZ1bGxfdGFyZ2V0KTogUFJJVkFURV9KQVZBX0ZJTEVTIDo9ICQoZmlsdGVyICUuamF2YSwkKGZ1bGxfc3JjX2ZpbGVzKSkKKyQoZnVsbF90YXJnZXQpOiBQUklWQVRFX0pBVkFfRklMRVMgKz0gJChhZGRwcmVmaXggJCgkKG15X3ByZWZpeClPVVRfQ09NTU9OX0lOVEVSTUVESUFURVMpLywgJChmaWx0ZXIgJS5qYXZhLCQoTE9DQUxfSU5URVJNRURJQVRFX1NPVVJDRVMpKSkKKyQoZnVsbF90YXJnZXQpOiBQUklWQVRFX1NPVVJDRV9JTlRFUk1FRElBVEVTX0RJUiA6PSAkKGludGVybWVkaWF0ZXMuQ09NTU9OKS9zcmMKKyQoZnVsbF90YXJnZXQpOiBQUklWQVRFX1NSQ19MSVNUX0ZJTEUgOj0gJChpbnRlcm1lZGlhdGVzLkNPTU1PTikvZHJvaWRkb2Mtc3JjLWxpc3QKKworaWZuZXEgKCQoc3RyaXAgJChMT0NBTF9BRERJVElPTkFMX0pBVkFfRElSKSksKQorJChmdWxsX3RhcmdldCk6IFBSSVZBVEVfQURESVRJT05BTF9KQVZBX0RJUiA6PSAkKExPQ0FMX0FERElUSU9OQUxfSkFWQV9ESVIpCitlbmRpZgorCisjIExpc3RzIHRoZSBpbnB1dCBmaWxlcyBmb3IgdGhlIGRvYyBidWlsZCBpbnRvIGEgdGV4dCBmaWxlCisjIHN1aXRhYmxlIGZvciB0aGUgQCBzeW50YXggb2YgamF2YWRvYy4KKyMgJCgxKTogdGhlIGZpbGUgdG8gY3JlYXRlCisjICQoMik6IGZpbGVzIHRvIGluY2x1ZGUKKyMgJCgzKTogbGlzdCBvZiBkaXJlY3RvcmllcyB0byBzZWFyY2ggZm9yIGphdmEgZmlsZXMgaW4KK2RlZmluZSBwcmVwYXJlLWRvYy1zb3VyY2UtbGlzdAorJChoaWRlKSBta2RpciAtcCAkKGRpciAkKDEpKQorJChjYWxsIGR1bXAtd29yZHMtdG8tZmlsZSwgJCgyKSwgJCgxKSkKKyQoaGlkZSkgZm9yIGQgaW4gJCgzKSA7IGRvIGZpbmQgJCRkIC1uYW1lICcqLmphdmEnIC1hbmQgLW5vdCAtbmFtZSAnLionID4+ICQoMSkgMj4gL2Rldi9udWxsIDsgZG9uZSA7IHRydWUKK2VuZGVmCisKKyMjCisjIworIyMgamRpZmYgb25seQorIyMKKyMjCisKK2pkaWZmIDo9IFwKKwkkKEhPU1RfSkRLX1RPT0xTX0pBUikgXAorCSQoSE9TVF9PVVRfSkFWQV9MSUJSQVJJRVMpL2pkaWZmJChDT01NT05fSkFWQV9QQUNLQUdFX1NVRkZJWCkKKworZG9jbGF2YSA6PSBcCisJJChIT1NUX0pES19UT09MU19KQVIpIFwKKwkkKEhPU1RfT1VUX0pBVkFfTElCUkFSSUVTKS9kb2NsYXZhJChDT01NT05fSkFWQV9QQUNLQUdFX1NVRkZJWCkKKworJChmdWxsX3RhcmdldCk6IFBSSVZBVEVfTkVXQVBJIDo9ICQoTE9DQUxfQVBJRElGRl9ORVdBUEkpCiskKGZ1bGxfdGFyZ2V0KTogUFJJVkFURV9PTERBUEkgOj0gJChMT0NBTF9BUElESUZGX09MREFQSSkKKyQoZnVsbF90YXJnZXQpOiBQUklWQVRFX09VVF9ESVIgOj0gJChvdXRfZGlyKQorJChmdWxsX3RhcmdldCk6IFBSSVZBVEVfT1VUX05FV0FQSSA6PSAkKG91dF9kaXIpL2N1cnJlbnQueG1sCiskKGZ1bGxfdGFyZ2V0KTogUFJJVkFURV9PVVRfT0xEQVBJIDo9ICQob3V0X2RpcikvJChub3RkaXIgJChiYXNlbmFtZSAkKExPQ0FMX0FQSURJRkZfT0xEQVBJKSkpLnhtbAorJChmdWxsX3RhcmdldCk6IFBSSVZBVEVfRE9DTEVUUEFUSCA6PSAkKEhPU1RfT1VUX0pBVkFfTElCUkFSSUVTKS9qZGlmZiQoQ09NTU9OX0pBVkFfUEFDS0FHRV9TVUZGSVgpCiskKGZ1bGxfdGFyZ2V0KTogXAorCQkkKGZ1bGxfc3JjX2ZpbGVzKSBcCisJCSQoZnVsbF9qYXZhX2xpYl9kZXBzKSBcCisJCSQoamRpZmYpIFwKKwkJJChkb2NsYXZhKSBcCisJCSQoTE9DQUxfTU9EVUxFKS1kb2NzIFwKKwkJJChMT0NBTF9BRERJVElPTkFMX0RFUEVOREVOQ0lFUykKKwlAZWNobyBHZW5lcmF0aW5nIEFQSSBkaWZmOiAkKFBSSVZBVEVfT1VUX0RJUikKKwlAZWNobyAgIE9sZCBBUEk6ICQoUFJJVkFURV9PTERBUEkpCisJQGVjaG8gICBOZXcgQVBJOiAkKFBSSVZBVEVfTkVXQVBJKQorCUBlY2hvICAgT2xkIFhNTDogJChQUklWQVRFX09VVF9PTERBUEkpCisJQGVjaG8gICBOZXcgWE1MOiAkKFBSSVZBVEVfT1VUX05FV0FQSSkKKwkkKGhpZGUpIG1rZGlyIC1wICQoZGlyICRAKQorCUBlY2hvIENvbnZlcnRpbmcgQVBJIGZpbGVzIHRvIFhNTC4uLgorCSQoaGlkZSkgbWtkaXIgLXAgJChQUklWQVRFX09VVF9ESVIpCisJJChoaWRlKSAoIFwKKwkJJChKQVZBKSBcCisJCQkJJChhZGRwcmVmaXggLWNsYXNzcGF0aCAsJChQUklWQVRFX0NMQVNTUEFUSCk6JChQUklWQVRFX0RPQ0xBVkFfQ0xBU1NQQVRIKTokKFBSSVZBVEVfQk9PVENMQVNTUEFUSCk6JChIT1NUX0pES19UT09MU19KQVIpKSBcCisJCQkJY29tLmdvb2dsZS5kb2NsYXZhLmFwaWNoZWNrLkFwaUNoZWNrIFwKKwkJCQktY29udmVydDJ4bWwgXAorCQkJCQkkKGJhc2VuYW1lICQoUFJJVkFURV9ORVdBUEkpKS50eHQgXAorCQkJCQkkKGJhc2VuYW1lICQoUFJJVkFURV9PVVRfTkVXQVBJKSkueG1sIFwKKwkpIHx8IChybSAtcmYgJChQUklWQVRFX09VVF9ESVIpICQoUFJJVkFURV9TUkNfTElTVF9GSUxFKTsgZXhpdCA0NSkKKwkkKGhpZGUpICggXAorCQkkKEpBVkEpIFwKKwkJCQkkKGFkZHByZWZpeCAtY2xhc3NwYXRoICwkKFBSSVZBVEVfQ0xBU1NQQVRIKTokKFBSSVZBVEVfRE9DTEFWQV9DTEFTU1BBVEgpOiQoUFJJVkFURV9CT09UQ0xBU1NQQVRIKTokKEhPU1RfSkRLX1RPT0xTX0pBUikpIFwKKwkJCQljb20uZ29vZ2xlLmRvY2xhdmEuYXBpY2hlY2suQXBpQ2hlY2sgXAorCQkJCS1jb252ZXJ0MnhtbCBcCisJCQkJCSQoYmFzZW5hbWUgJChQUklWQVRFX09MREFQSSkpLnR4dCBcCisJCQkJCSQoYmFzZW5hbWUgJChQUklWQVRFX09VVF9PTERBUEkpKS54bWwgXAorCSkgfHwgKHJtIC1yZiAkKFBSSVZBVEVfT1VUX0RJUikgJChQUklWQVRFX1NSQ19MSVNUX0ZJTEUpOyBleGl0IDQ1KQorCUBlY2hvIFJ1bm5pbmcgSkRpZmYuLi4KKwkkKGNhbGwgcHJlcGFyZS1kb2Mtc291cmNlLWxpc3QsJChQUklWQVRFX1NSQ19MSVNUX0ZJTEUpLCQoUFJJVkFURV9KQVZBX0ZJTEVTKSwgXAorCQkJJChQUklWQVRFX1NPVVJDRV9JTlRFUk1FRElBVEVTX0RJUikgJChQUklWQVRFX0FERElUSU9OQUxfSkFWQV9ESVIpKQorCSQoaGlkZSkgKCBcCisJCSQoSkFWQURPQykgXAorCQkJCS1lbmNvZGluZyBVVEYtOCBcCisJCQkJXEAkKFBSSVZBVEVfU1JDX0xJU1RfRklMRSkgXAorCQkJCS1KLVhteDE2MDBtIFwKKwkJCQktWERpZ25vcmUuc3ltYm9sLmZpbGUgXAorCQkJCS1xdWlldCBcCisJCQkJLWRvY2xldCBqZGlmZi5KRGlmZiBcCisJCQkJLWRvY2xldHBhdGggJChQUklWQVRFX0RPQ0xFVFBBVEgpIFwKKwkJCQkkKGFkZHByZWZpeCAtYm9vdGNsYXNzcGF0aCAsJChQUklWQVRFX0JPT1RDTEFTU1BBVEgpKSBcCisJCQkJJChhZGRwcmVmaXggLWNsYXNzcGF0aCAsJChQUklWQVRFX0NMQVNTUEFUSCkpIFwKKwkJCQktc291cmNlcGF0aCAkKFBSSVZBVEVfU09VUkNFX1BBVEgpJChhZGRwcmVmaXggOiwkKFBSSVZBVEVfQ0xBU1NQQVRIKSkgXAorCQkJCS1kICQoUFJJVkFURV9PVVRfRElSKSBcCisJCQkJLW5ld2FwaSAkKG5vdGRpciAkKGJhc2VuYW1lICQoUFJJVkFURV9PVVRfTkVXQVBJKSkpIFwKKwkJCQktbmV3YXBpZGlyICQoZGlyICQoUFJJVkFURV9PVVRfTkVXQVBJKSkgXAorCQkJCS1vbGRhcGkgJChub3RkaXIgJChiYXNlbmFtZSAkKFBSSVZBVEVfT1VUX09MREFQSSkpKSBcCisJCQkJLW9sZGFwaWRpciAkKGRpciAkKFBSSVZBVEVfT1VUX09MREFQSSkpIFwKKwkJCQktamF2YWRvY25ldyAuLi8uLi8uLi9yZWZlcmVuY2UvIFwKKwkJJiYgdG91Y2ggLWYgJEAgXAorCSkgfHwgKHJtIC1yZiAkKFBSSVZBVEVfT1VUX0RJUikgJChQUklWQVRFX1NSQ19MSVNUX0ZJTEUpOyBleGl0IDQ1KQorCitBTExfRE9DUyArPSAkKGZ1bGxfdGFyZ2V0KQorCisuUEhPTlk6ICQoTE9DQUxfTU9EVUxFKS1kaWZmCiskKExPQ0FMX01PRFVMRSktZGlmZiA6ICQoZnVsbF90YXJnZXQpCmRpZmYgLS1naXQgYS9jb3JlL2F1dG9nZW5fdGVzdF9jb25maWcubWsgYi9jb3JlL2F1dG9nZW5fdGVzdF9jb25maWcubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzM1OWJhYwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvYXV0b2dlbl90ZXN0X2NvbmZpZy5tawpAQCAtMCwwICsxLDY0IEBACisjCisjIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisjIFRoaXMgYnVpbGQgcnVsZSBhbGxvd3MgVHJhZGVGZWQgdGVzdCBjb25maWcgZmlsZSB0byBiZSBjcmVhdGVkIGJhc2VkIG9uCisjIGZvbGxvd2luZyBpbnB1dHM6CisjICAgaXNfbmF0aXZlOiBJZiB0aGUgdGVzdCBpcyBhIG5hdGl2ZSB0ZXN0LgorIyAgIExPQ0FMX01BTklGRVNUX0ZJTEU6IE5hbWUgb2YgdGhlIEFuZHJvaWRNYW5pZmVzdCBmaWxlIGZvciB0aGUgdGVzdC4gSWYgaXQncworIyAgICAgICBub3Qgc2V0LCBkZWZhdWx0IHZhbHVlIGBBbmRyb2lkTWFuaWZlc3QueG1sYCB3aWxsIGJlIHVzZWQuCisjIE91dHB1dDoKKyMgICBhdXRvZ2VuX3Rlc3RfY29uZmlnX2ZpbGU6IFBhdGggdG8gdGhlIHRlc3QgY29uZmlnIGZpbGUgZ2VuZXJhdGVkLgorCithdXRvZ2VuX3Rlc3RfY29uZmlnX2ZpbGUgOj0gJChkaXIgJChMT0NBTF9CVUlMVF9NT0RVTEUpKSQoTE9DQUxfTU9EVUxFKS5jb25maWcKK2lmZXEgKHRydWUsJChpc19uYXRpdmUpKQorIyBBdXRvIGdlbmVyYXRpbmcgdGVzdCBjb25maWcgZmlsZSBmb3IgbmF0aXZlIHRlc3QKKyQoYXV0b2dlbl90ZXN0X2NvbmZpZ19maWxlKSA6ICQoTkFUSVZFX1RFU1RfQ09ORklHX1RFTVBMQVRFKQorCUBlY2hvICJBdXRvIGdlbmVyYXRpbmcgdGVzdCBjb25maWcgJChub3RkaXIgJEApIgorCSQoaGlkZSkgc2VkICdzJntNT0RVTEV9JiQoUFJJVkFURV9NT0RVTEUpJmcnICReID4gJEAKK215X2F1dG9fZ2VuZXJhdGVfY29uZmlnIDo9IHRydWUKK2Vsc2UKKyMgQXV0byBnZW5lcmF0aW5nIHRlc3QgY29uZmlnIGZpbGUgZm9yIGluc3RydW1lbnRhdGlvbiB0ZXN0CitpZmVxICgkKHN0cmlwICQoTE9DQUxfTUFOSUZFU1RfRklMRSkpLCkKKyAgTE9DQUxfTUFOSUZFU1RfRklMRSA6PSBBbmRyb2lkTWFuaWZlc3QueG1sCitlbmRpZgoraWZkZWYgTE9DQUxfRlVMTF9NQU5JRkVTVF9GSUxFCisgIG15X2FuZHJvaWRfbWFuaWZlc3QgOj0gJChMT0NBTF9GVUxMX01BTklGRVNUX0ZJTEUpCitlbHNlCisgIG15X2FuZHJvaWRfbWFuaWZlc3QgOj0gJChMT0NBTF9QQVRIKS8kKExPQ0FMX01BTklGRVNUX0ZJTEUpCitlbmRpZgoraWZuZXEgKCwkKHdpbGRjYXJkICQobXlfYW5kcm9pZF9tYW5pZmVzdCkpKQorJChhdXRvZ2VuX3Rlc3RfY29uZmlnX2ZpbGUpOiBQUklWQVRFX0FVVE9HRU5fVEVTVF9DT05GSUdfU0NSSVBUIDo9ICQoQVVUT0dFTl9URVNUX0NPTkZJR19TQ1JJUFQpCiskKGF1dG9nZW5fdGVzdF9jb25maWdfZmlsZSk6IFBSSVZBVEVfVEVTVF9DT05GSUdfQU5EUk9JRF9NQU5JRkVTVCA6PSAkKG15X2FuZHJvaWRfbWFuaWZlc3QpCiskKGF1dG9nZW5fdGVzdF9jb25maWdfZmlsZSk6IFBSSVZBVEVfRU1QVFlfVEVTVF9DT05GSUcgOj0gJChFTVBUWV9URVNUX0NPTkZJRykKKyQoYXV0b2dlbl90ZXN0X2NvbmZpZ19maWxlKTogUFJJVkFURV9URU1QTEFURSA6PSAkKElOU1RSVU1FTlRBVElPTl9URVNUX0NPTkZJR19URU1QTEFURSkKKyQoYXV0b2dlbl90ZXN0X2NvbmZpZ19maWxlKSA6ICQobXlfYW5kcm9pZF9tYW5pZmVzdCkgJChFTVBUWV9URVNUX0NPTkZJRykgJChJTlNUUlVNRU5UQVRJT05fVEVTVF9DT05GSUdfVEVNUExBVEUpICQoQVVUT0dFTl9URVNUX0NPTkZJR19TQ1JJUFQpCisJQGVjaG8gIkF1dG8gZ2VuZXJhdGluZyB0ZXN0IGNvbmZpZyAkKG5vdGRpciAkQCkiCisJQHJtIC1mICRACisJJChoaWRlKSAkKFBSSVZBVEVfQVVUT0dFTl9URVNUX0NPTkZJR19TQ1JJUFQpICRAICQoUFJJVkFURV9URVNUX0NPTkZJR19BTkRST0lEX01BTklGRVNUKSAkKFBSSVZBVEVfRU1QVFlfVEVTVF9DT05GSUcpICQoUFJJVkFURV9URU1QTEFURSkKK215X2F1dG9fZ2VuZXJhdGVfY29uZmlnIDo9IHRydWUKK2VuZGlmICMgaWZlcSAoLCQod2lsZGNhcmQgJChteV9hbmRyb2lkX21hbmlmZXN0KSkpCitlbmRpZiAjIGlmbmVxICh0cnVlLCQoaXNfbmF0aXZlKSkKKworaWZlcSAodHJ1ZSwkKG15X2F1dG9fZ2VuZXJhdGVfY29uZmlnKSkKKyAgTE9DQUxfSU5URVJNRURJQVRFX1RBUkdFVFMgKz0gJChhdXRvZ2VuX3Rlc3RfY29uZmlnX2ZpbGUpCisgICQoTE9DQUxfQlVJTFRfTU9EVUxFKTogJChhdXRvZ2VuX3Rlc3RfY29uZmlnX2ZpbGUpCisgIEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuYXV0b190ZXN0X2NvbmZpZyA6PSB0cnVlCitlbHNlCisgIGF1dG9nZW5fdGVzdF9jb25maWdfZmlsZSA6PQorZW5kaWYKKworbXlfYW5kcm9pZF9tYW5pZmVzdCA6PQorbXlfYXV0b19nZW5lcmF0ZV9jb25maWcgOj0KZGlmZiAtLWdpdCBhL2NvcmUvYXV4X2NvbmZpZy5tayBiL2NvcmUvYXV4X2NvbmZpZy5tawppbmRleCBjNDBiOGNjLi42YTVjZDYzIDEwMDY0NAotLS0gYS9jb3JlL2F1eF9jb25maWcubWsKKysrIGIvY29yZS9hdXhfY29uZmlnLm1rCkBAIC0zMiw3ICszMiw3IEBACiAKICMgc2V0dXAgQVVYIGdsb2JhbHMKIEFVWF9TSExJQl9TVUZGSVggOj0gLnNvCi1BVVhfR0xPQkFMX0FSRkxBR1MgOj0gY3JzUEQKK0FVWF9HTE9CQUxfQVJGTEFHUyA6PSBjcXNECiBBVVhfU1RBVElDX0xJQl9TVUZGSVggOj0gLmEKIAogIyBMb2FkIGV2ZXItbGFzdGluZyAiaW5kZXhlZCIgdmVyc2lvbiBvZiBBVVggdmFyaWFudCBlbnZpcm9ubWVudDsgaXQgaXMgdHJlYXRlZCBhcyBSRUFELU9OTFkgZnJvbSB0aGlzCkBAIC0xMDIsMTAgKzEwMiwxMCBAQAogJChldmFsIEFVWF9PU19WQVJJQU5UX0xJU1RfJChBVVhfT1NfJCgxKSk6PSkgXAogJChjYWxsIGF1eC12YXJpYW50LXNldHVwLXBhdGhzLCQoX25hbWUpKSBcCiAkKGV2YWwgQVVYX0FMTF9WQVJJQU5UUyArPSAkKF9uYW1lKSkgXAotJChldmFsIEFVWF9BTExfT1NFUyA6PSAkKGZpbHRlcm91dCAkKEFVWF9PU18kKF9uYW1lKSksJChBVVhfQUxMX09TRVMpKSAkKEFVWF9PU18kKF9uYW1lKSkpIFwKLSQoZXZhbCBBVVhfQUxMX0NQVVMgOj0gJChmaWx0ZXJvdXQgJChBVVhfQ1BVXyQoX25hbWUpKSwkKEFVWF9BTExfQ1BVUykpICQoQVVYX0NQVV8kKF9uYW1lKSkpIFwKLSQoZXZhbCBBVVhfQUxMX0FSQ0hTIDo9ICQoZmlsdGVyb3V0ICQoQVVYX0FSQ0hfJChfbmFtZSkpLCQoQVVYX0FMTF9BUkNIUykpICQoQVVYX0FSQ0hfJChfbmFtZSkpKSBcCi0kKGV2YWwgQVVYX0FMTF9TVUJBUkNIUyA6PSAkKGZpbHRlcm91dCAkKEFVWF9TVUJBUkNIXyQoX25hbWUpKSwkKEFVWF9BTExfU1VCQVJDSFMpKSAkKEFVWF9TVUJBUkNIXyQoX25hbWUpKSkKKyQoZXZhbCBBVVhfQUxMX09TRVMgOj0gJChmaWx0ZXItb3V0ICQoQVVYX09TXyQoX25hbWUpKSwkKEFVWF9BTExfT1NFUykpICQoQVVYX09TXyQoX25hbWUpKSkgXAorJChldmFsIEFVWF9BTExfQ1BVUyA6PSAkKGZpbHRlci1vdXQgJChBVVhfQ1BVXyQoX25hbWUpKSwkKEFVWF9BTExfQ1BVUykpICQoQVVYX0NQVV8kKF9uYW1lKSkpIFwKKyQoZXZhbCBBVVhfQUxMX0FSQ0hTIDo9ICQoZmlsdGVyLW91dCAkKEFVWF9BUkNIXyQoX25hbWUpKSwkKEFVWF9BTExfQVJDSFMpKSAkKEFVWF9BUkNIXyQoX25hbWUpKSkgXAorJChldmFsIEFVWF9BTExfU1VCQVJDSFMgOj0gJChmaWx0ZXItb3V0ICQoQVVYX1NVQkFSQ0hfJChfbmFtZSkpLCQoQVVYX0FMTF9TVUJBUkNIUykpICQoQVVYX1NVQkFSQ0hfJChfbmFtZSkpKQogZW5kZWYKIAogIyBMb2FkIHN5c3RlbSBjb25maWd1cmF0aW9uIHJlZmVyZW5jZWQgYnkgQVVYIHZhcmlhbnQgY29uZmlnOwpAQCAtMTM4LDcgKzEzOCw3IEBACiAkKGV2YWwgX2FsbDo9KSBcCiAkKGV2YWwgX3JlcTo9JChhZGRzdWZmaXggXyQoMSksJChhdXhfZW52KSkpIFwKICQoZm9yZWFjaCB2YXIsJChfcmVxKSwkKGV2YWwgX2FsbCArPSAkKHZhcikpKSBcCi0kKGV2YWwgX21pc3NpbmcgOj0gJChmaWx0ZXJvdXQgJChfYWxsKSwkKF9yZXEpKSkgXAorJChldmFsIF9taXNzaW5nIDo9ICQoZmlsdGVyLW91dCAkKF9hbGwpLCQoX3JlcSkpKSBcCiAkKGlmICQoX21pc3NpbmcpLCQoZXJyb3IgQVVYIHZhcmlhbnQgJCgxKSBtdXN0IGRlZmluZSB2YXJzOiAkKF9taXNzaW5nKSkpCiBlbmRlZgogCkBAIC0xNTQsNyArMTU0LDcgQEAKIGNvbmZpZ19yb290cyA6PSAkKHdpbGRjYXJkIGRldmljZSB2ZW5kb3IpCiBhbGxfY29uZmlncyA6PQogaWZkZWYgY29uZmlnX3Jvb3RzCi1hbGxfY29uZmlncyA6PSAkKHNoZWxsIGZpbmQgJChjb25maWdfcm9vdHMpIC1tYXhkZXB0aCA0IC1uYW1lICcqJCh2YXJpYW50X3NmeCknIC1vIC1uYW1lICcqJChvc19zZngpJyB8IHNvcnQpCithbGxfY29uZmlncyA6PSAkKHNvcnQgJChzaGVsbCBmaW5kICQoY29uZmlnX3Jvb3RzKSAtbWF4ZGVwdGggNCAtbmFtZSAnKiQodmFyaWFudF9zZngpJyAtbyAtbmFtZSAnKiQob3Nfc2Z4KScpKQogZW5kaWYKIGFsbF9vc19jb25maWdzIDo9ICQoZmlsdGVyICUkKG9zX3NmeCksJChhbGxfY29uZmlncykpCiBhbGxfdmFyaWFudF9jb25maWdzIDo9ICQoZmlsdGVyICUkKHZhcmlhbnRfc2Z4KSwkKGFsbF9jb25maWdzKSkKZGlmZiAtLWdpdCBhL2NvcmUvYmFzZV9ydWxlcy5tayBiL2NvcmUvYmFzZV9ydWxlcy5tawppbmRleCAwN2QxY2Q5Li4yMmU3YWVmIDEwMDY0NAotLS0gYS9jb3JlL2Jhc2VfcnVsZXMubWsKKysrIGIvY29yZS9iYXNlX3J1bGVzLm1rCkBAIC02NSw2ICs2NSwxOCBAQAogICBteV9ob3N0X2Nyb3NzIDo9CiBlbmRpZgogCitfcGF0aCA6PSAkKExPQ0FMX01PRFVMRV9QQVRIKSAkKExPQ0FMX01PRFVMRV9QQVRIXzMyKSAkKExPQ0FMX01PRFVMRV9QQVRIXzY0KQoraWZuZXEgKCQoZmlsdGVyICQoVEFSR0VUX09VVF9WRU5ET1IpJSwkKF9wYXRoKSksKQorTE9DQUxfVkVORE9SX01PRFVMRSA6PSB0cnVlCitlbHNlIGlmbmVxICgkKGZpbHRlciAkKFRBUkdFVF9PVVRfT0VNKS8lLCQoX3BhdGgpKSwpCitMT0NBTF9PRU1fTU9EVUxFIDo9IHRydWUKK2Vsc2UgaWZuZXEgKCQoZmlsdGVyICQoVEFSR0VUX09VVF9PRE0pLyUsJChfcGF0aCkpLCkKK0xPQ0FMX09ETV9NT0RVTEUgOj0gdHJ1ZQorZWxzZSBpZm5lcSAoJChmaWx0ZXIgJChUQVJHRVRfT1VUX1BST0RVQ1QpLyUsJChfcGF0aCkpLCkKK0xPQ0FMX1BST0RVQ1RfTU9EVUxFIDo9IHRydWUKK2VuZGlmCitfcGF0aCA6PQorCiBpZm5kZWYgTE9DQUxfUFJPUFJJRVRBUllfTU9EVUxFCiAgIExPQ0FMX1BST1BSSUVUQVJZX01PRFVMRSA6PSAkKExPQ0FMX1ZFTkRPUl9NT0RVTEUpCiBlbmRpZgpAQCAtNzYsNiArODgsNyBAQAogZW5kaWYKIAogaW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvbG9jYWxfdm5kay5taworaW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvbG9jYWxfc3lzdGVtc2RrLm1rCiAKIG15X21vZHVsZV90YWdzIDo9ICQoTE9DQUxfTU9EVUxFX1RBR1MpCiBpZmVxICgkKG15X2hvc3RfY3Jvc3MpLHRydWUpCkBAIC05Niw2ICsxMDksMTMgQEAKICMgYmFzZV9ydWxlcy5taywgYnV0IGl0IHdpbGwgZml4IHRoZSBtb3N0IGNvbW1vbiBvbmVzLgogTE9DQUxfQURESVRJT05BTF9ERVBFTkRFTkNJRVMgOj0gJChmaWx0ZXItb3V0ICUubWssJChMT0NBTF9BRERJVElPTkFMX0RFUEVOREVOQ0lFUykpCiAKK215X2JhZF9kZXBzIDo9ICQoc3RyaXAgJChmb3JlYWNoIGRlcCwkKGZpbHRlci1vdXQgfCB8fCwkKExPQ0FMX0FERElUSU9OQUxfREVQRU5ERU5DSUVTKSksXAorICAgICAgICAgICAgICAgICAkKGlmICQoZmluZHN0cmluZyAvLCQoZGVwKSksLCQoZGVwKSkpKQoraWZuZXEgKCQobXlfYmFkX2RlcHMpLCkKKyQoY2FsbCBwcmV0dHktd2FybmluZywiQmFkIExPQ0FMX0FERElUSU9OQUxfREVQRU5ERU5DSUVTOiAkKG15X2JhZF9kZXBzKSIpCiskKGNhbGwgcHJldHR5LWVycm9yLCJMT0NBTF9BRERJVElPTkFMX0RFUEVOREVOQ0lFUyBtdXN0IG9ubHkgY29udGFpbiBwYXRocyAobm90IG1vZHVsZSBuYW1lcykiKQorZW5kaWYKKwogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICMjIFZhbGlkYXRlIGFuZCBkZWZpbmUgZmFsbGJhY2tzIGZvciBpbnB1dCBMT0NBTF8qIHZhcmlhYmxlcy4KICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCkBAIC0xMzEsNyArMTUxLDcgQEAKICMgbWFrZWZpbGVzLiBBbnl0aGluZyBlbHNlIGlzIGVpdGhlciBhIHR5cG8gb3IgYSBzb3VyY2Ugb2YgdW5leHBlY3RlZAogIyBiZWhhdmlvcnMuCiBpZm5lcSAoJChmaWx0ZXItb3V0IGRlYnVnIGVuZyB0ZXN0cyBvcHRpb25hbCBzYW1wbGVzLCQobXlfbW9kdWxlX3RhZ3MpKSwpCi0kKGNhbGwgcHJldHR5LXdhcm5pbmcsdW51c3VhbCB0YWdzICQobXlfbW9kdWxlX3RhZ3MpKQorJChjYWxsIHByZXR0eS1lcnJvcix1bnVzdWFsIHRhZ3M6ICQoZmlsdGVyLW91dCBkZWJ1ZyBlbmcgdGVzdHMgb3B0aW9uYWwgc2FtcGxlcywkKG15X21vZHVsZV90YWdzKSkpCiBlbmRpZgogCiAjIEFkZCBpbXBsaWNpdCB0YWdzLgpAQCAtMTgyLDYgKzIwMiw4IEBACiAgIHBhcnRpdGlvbl90YWcgOj0gX09FTQogZWxzZSBpZmVxICh0cnVlLCQoTE9DQUxfT0RNX01PRFVMRSkpCiAgIHBhcnRpdGlvbl90YWcgOj0gX09ETQorZWxzZSBpZmVxICh0cnVlLCQoTE9DQUxfUFJPRFVDVF9NT0RVTEUpKQorICBwYXJ0aXRpb25fdGFnIDo9IF9QUk9EVUNUCiBlbHNlIGlmZXEgKE5BVElWRV9URVNUUywkKExPQ0FMX01PRFVMRV9DTEFTUykpCiAgIHBhcnRpdGlvbl90YWcgOj0gX0RBVEEKIGVsc2UKQEAgLTQ0Myw2ICs0NjUsNTAgQEAKIGVuZGlmCiAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyBUZXN0IERhdGEKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitteV90ZXN0X2RhdGFfcGFpcnMgOj0KK215X2luc3RhbGxlZF90ZXN0X2RhdGEgOj0KKyMgU291cmNlIHRvIHJlbGF0aXZlIGRzdCBmaWxlIHBhdGhzIGZvciByZXVzZSBpbiBMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFLgorbXlfdGVzdF9kYXRhX2ZpbGVfcGFpcnMgOj0KKworaWZuZXEgKCQoZmlsdGVyIE5BVElWRV9URVNUUywkKExPQ0FMX01PRFVMRV9DTEFTUykpLCkKK2lmbmVxICgkKHN0cmlwICQoTE9DQUxfVEVTVF9EQVRBKSksKQoraWZuZXEgKHRydWUsJChMT0NBTF9VTklOU1RBTExBQkxFX01PRFVMRSkpCisKK215X3Rlc3RfZGF0YV9wYWlycyA6PSAkKHN0cmlwICQoZm9yZWFjaCB0ZCwkKExPQ0FMX1RFU1RfREFUQSksIFwKKyAgICAkKGV2YWwgX2ZpbGUgOj0gJChjYWxsIHdvcmQtY29sb24sMiwkKHRkKSkpIFwKKyAgICAkKGlmICQoX2ZpbGUpLCBcCisgICAgICAkKGV2YWwgX3NyY19iYXNlIDo9ICQoY2FsbCB3b3JkLWNvbG9uLDEsJCh0ZCkpKSwgXAorICAgICAgJChldmFsIF9zcmNfYmFzZSA6PSAkKExPQ0FMX1BBVEgpKSBcCisgICAgICAgICQoZXZhbCBfZmlsZSA6PSAkKGNhbGwgd29yZC1jb2xvbiwxLCQodGQpKSkpIFwKKyAgICAkKGlmICQoZmluZHN0cmluZyAuLiwkKF9maWxlKSksJChlcnJvciAkKExPQ0FMX01PRFVMRV9NQUtFRklMRSk6IExPQ0FMX1RFU1RfREFUQSBtYXkgbm90IGluY2x1ZGUgJy4uJzogJChfZmlsZSkpKSBcCisgICAgJChpZiAkKGZpbHRlciAvJSwkKF9zcmNfYmFzZSkgJChfZmlsZSkpLCQoZXJyb3IgJChMT0NBTF9NT0RVTEVfTUFLRUZJTEUpOiBMT0NBTF9URVNUX0RBVEEgbWF5IG5vdCBpbmNsdWRlIGFic29sdXRlIHBhdGhzOiAkKF9zcmNfYmFzZSkgJChfZmlsZSkpKSBcCisgICAgJChldmFsIG15X3Rlc3RfZGF0YV9maWxlX3BhaXJzIDo9ICQobXlfdGVzdF9kYXRhX2ZpbGVfcGFpcnMpICQoY2FsbCBhcHBlbmQtcGF0aCwkKF9zcmNfYmFzZSksJChfZmlsZSkpOiQoX2ZpbGUpKSBcCisgICAgJChjYWxsIGFwcGVuZC1wYXRoLCQoX3NyY19iYXNlKSwkKF9maWxlKSk6JChjYWxsIGFwcGVuZC1wYXRoLCQobXlfbW9kdWxlX3BhdGgpLCQoX2ZpbGUpKSkpCisKK215X2luc3RhbGxlZF90ZXN0X2RhdGEgOj0gJChjYWxsIGNvcHktbWFueS1maWxlcywkKG15X3Rlc3RfZGF0YV9wYWlycykpCiskKExPQ0FMX0lOU1RBTExFRF9NT0RVTEUpOiAkKG15X2luc3RhbGxlZF90ZXN0X2RhdGEpCisKK2VuZGlmCitlbmRpZgorZW5kaWYKKworIyBGb3IgdGVzdCBtb2R1bGVzIHRoYXQgbGFjayBhIHN1aXRlIHRhZywgc2V0IG51bGwtc3VpdGUgYXMgdGhlIGRlZmF1bHQuCisjIFdlIG9ubHkgc3VwcG9ydCBhZGRpbmcgYSBkZWZhdWx0IHN1aXRlIHRvIG5hdGl2ZSB0ZXN0cywgbmF0aXZlIGJlbmNobWFya3MsIGFuZCBpbnN0cnVtZW50YXRpb24gdGVzdHMuCisjIFRoaXMgaXMgYmVjYXVzZSB0aGV5IGFyZSB0aGUgb25seSB0ZXN0cyB3ZSBjdXJyZW50bHkgYXV0by1nZW5lcmF0ZSB0ZXN0IGNvbmZpZ3MgZm9yLgoraWZuZGVmIExPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUKK2lmbmVxICgkKGZpbHRlciBOQVRJVkVfVEVTVFMgTkFUSVZFX0JFTkNITUFSSywgJChMT0NBTF9NT0RVTEVfQ0xBU1MpKSwpCitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IG51bGwtc3VpdGUKK2VuZGlmCitpZm5lcSAoJChmaWx0ZXIgQVBQUywgJChMT0NBTF9NT0RVTEVfQ0xBU1MpKSwpCitpZm5lcSAoJChmaWx0ZXIgJChteV9tb2R1bGVfdGFncyksdGVzdHMpLCkKK0xPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gbnVsbC1zdWl0ZQorZW5kaWYKK2VuZGlmCitlbmRpZgorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIyMgQ29tcGF0aWJpbGl0eSBzdWl0ZSBmaWxlcy4KICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiBpZmRlZiBMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFCkBAIC00NTEsMTkgKzUxNywyMiBAQAogIyBzZXBhcmF0ZSB0aGUgbXVsdGlwbGUgYXJjaGl0ZWN0dXJlcyBpbnRvIHN1YmRpcmVjdG9yaWVzIG9mIHRoZSB0ZXN0Y2FzZSBmb2xkZXIuCiBhcmNoX2RpciA6PQogaXNfbmF0aXZlIDo9CittdWx0aV9hcmNoIDo9CiBpZmVxICgkKExPQ0FMX01PRFVMRV9DTEFTUyksTkFUSVZFX1RFU1RTKQogICBpc19uYXRpdmUgOj0gdHJ1ZQorICBtdWx0aV9hcmNoIDo9IHRydWUKIGVuZGlmCiBpZmVxICgkKExPQ0FMX01PRFVMRV9DTEFTUyksTkFUSVZFX0JFTkNITUFSSykKICAgaXNfbmF0aXZlIDo9IHRydWUKKyAgbXVsdGlfYXJjaCA6PSB0cnVlCiBlbmRpZgogaWZkZWYgTE9DQUxfTVVMVElMSUIKLSAgaXNfbmF0aXZlIDo9IHRydWUKKyAgbXVsdGlfYXJjaCA6PSB0cnVlCiBlbmRpZgotaWZkZWYgaXNfbmF0aXZlCitpZmRlZiBtdWx0aV9hcmNoCiAgIGFyY2hfZGlyIDo9IC8kKCQobXlfcHJlZml4KSQoTE9DQUxfMk5EX0FSQ0hfVkFSX1BSRUZJWClBUkNIKQotICBpc19uYXRpdmUgOj0KIGVuZGlmCittdWx0aV9hcmNoIDo9CiAKICMgVGhlIG1vZHVsZSBpdHNlbGYuCiAkKGZvcmVhY2ggc3VpdGUsICQoTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSksIFwKQEAgLTQ4MywxMyArNTUyLDQ0IEBACiAgICAgJChmb3JlYWNoIGRpciwgJChjYWxsIGNvbXBhdGliaWxpdHlfc3VpdGVfZGlycywkKHN1aXRlKSksIFwKICAgICAgICQocyk6JChkaXIpLyQobikpKSkpCiAKK3Rlc3RfY29uZmlnIDo9ICQod2lsZGNhcmQgJChMT0NBTF9QQVRIKS9BbmRyb2lkVGVzdC54bWwpCitpZmVxICgsJCh0ZXN0X2NvbmZpZykpCisgIGlmbmVxICh0cnVlLCQoaXNfbmF0aXZlKSkKKyAgICBpc19pbnN0cnVtZW50YXRpb25fdGVzdCA6PSB0cnVlCisgICAgaWZlcSAodHJ1ZSwgJChMT0NBTF9JU19IT1NUX01PRFVMRSkpCisgICAgICBpc19pbnN0cnVtZW50YXRpb25fdGVzdCA6PSBmYWxzZQorICAgIGVuZGlmCisgICAgIyBJZiBMT0NBTF9NT0RVTEVfQ0xBU1MgaXMgbm90IEFQUFMsIGl0J3MgY2VydGFpbmx5IG5vdCBhbiBpbnN0cnVtZW50YXRpb24KKyAgICAjIHRlc3QuIEhvd2V2ZXIsIHNvbWUgcGFja2FnZXMgZm9yIHRlc3QgZGF0YSBhbHNvIGhhdmUgTE9DQUxfTU9EVUxFX0NMQVNTCisgICAgIyBzZXQgdG8gQVBQUy4gVGhlc2Ugd2lsbCByZXF1aXJlIGZsYWcgTE9DQUxfRElTQUJMRV9BVVRPX0dFTkVSQVRFX1RFU1RfQ09ORklHCisgICAgIyB0byBkaXNhYmxlIGF1dG8tZ2VuZXJhdGluZyB0ZXN0IGNvbmZpZyBmaWxlLgorICAgIGlmbmVxIChBUFBTLCAkKExPQ0FMX01PRFVMRV9DTEFTUykpCisgICAgICBpc19pbnN0cnVtZW50YXRpb25fdGVzdCA6PSBmYWxzZQorICAgIGVuZGlmCisgIGVuZGlmCisgICMgQ1RTIG1vZHVsZXMgY2FuIGJlIHVzZWQgZm9yIHRlc3QgZGF0YSwgc28gdGVzdCBjb25maWcgZmlsZXMgbXVzdCBiZQorICAjIGV4cGxpY2l0bHkgY3JlYXRlZCB1c2luZyBBbmRyb2lkVGVzdC54bWwKKyAgaWZlcSAoLCQoZmlsdGVyIGN0cywgJChMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFKSkpCisgICAgaWZuZXEgKHRydWUsICQoTE9DQUxfRElTQUJMRV9BVVRPX0dFTkVSQVRFX1RFU1RfQ09ORklHKSkKKyAgICAgIGlmZXEgKHRydWUsICQoZmlsdGVyIHRydWUsJChpc19uYXRpdmUpICQoaXNfaW5zdHJ1bWVudGF0aW9uX3Rlc3QpKSkKKyAgICAgICAgaW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvYXV0b2dlbl90ZXN0X2NvbmZpZy5taworICAgICAgICB0ZXN0X2NvbmZpZyA6PSAkKGF1dG9nZW5fdGVzdF9jb25maWdfZmlsZSkKKyAgICAgICAgYXV0b2dlbl90ZXN0X2NvbmZpZ19maWxlIDo9CisgICAgICBlbmRpZgorICAgIGVuZGlmCisgIGVuZGlmCitlbmRpZgogCi1pZm5lcSAoLCQod2lsZGNhcmQgJChMT0NBTF9QQVRIKS9BbmRyb2lkVGVzdC54bWwpKQoraXNfaW5zdHJ1bWVudGF0aW9uX3Rlc3QgOj0KKworaWZuZXEgKCwkKHRlc3RfY29uZmlnKSkKICQoZm9yZWFjaCBzdWl0ZSwgJChMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFKSwgXAogICAkKGV2YWwgbXlfY29tcGF0X2Rpc3RfJChzdWl0ZSkgKz0gJChmb3JlYWNoIGRpciwgJChjYWxsIGNvbXBhdGliaWxpdHlfc3VpdGVfZGlycywkKHN1aXRlKSksIFwKLSAgICAkKExPQ0FMX1BBVEgpL0FuZHJvaWRUZXN0LnhtbDokKGRpcikvJChMT0NBTF9NT0RVTEUpLmNvbmZpZykpKQorICAgICQodGVzdF9jb25maWcpOiQoZGlyKS8kKExPQ0FMX01PRFVMRSkuY29uZmlnKSkpCiBlbmRpZgogCit0ZXN0X2NvbmZpZyA6PQorCiBpZm5lcSAoLCQod2lsZGNhcmQgJChMT0NBTF9QQVRIKS9EeW5hbWljQ29uZmlnLnhtbCkpCiAkKGZvcmVhY2ggc3VpdGUsICQoTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSksIFwKICAgJChldmFsIG15X2NvbXBhdF9kaXN0XyQoc3VpdGUpICs9ICQoZm9yZWFjaCBkaXIsICQoY2FsbCBjb21wYXRpYmlsaXR5X3N1aXRlX2RpcnMsJChzdWl0ZSkpLCBcCkBAIC01MDQsMzggKzYwNCwyNCBAQAogZW5kaWYKIGVuZGlmICMgJChteV9wcmVmaXgpJChMT0NBTF9NT0RVTEVfQ0xBU1MpXyQoTE9DQUxfTU9EVUxFKV9jb21wYXRfZmlsZXMKIAoraWZuZXEgKCQobXlfdGVzdF9kYXRhX2ZpbGVfcGFpcnMpLCkKKyQoZm9yZWFjaCBwYWlyLCAkKG15X3Rlc3RfZGF0YV9maWxlX3BhaXJzKSwgXAorICAkKGV2YWwgcGFydHMgOj0gJChzdWJzdCA6LCQoc3BhY2UpLCQocGFpcikpKSBcCisgICQoZXZhbCBzcmNfcGF0aCA6PSAkKHdvcmQgMSwkKHBhcnRzKSkpIFwKKyAgJChldmFsIGZpbGUgOj0gJCh3b3JkIDIsJChwYXJ0cykpKSBcCisgICQoZm9yZWFjaCBzdWl0ZSwgJChMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFKSwgXAorICAgICQoZXZhbCBteV9jb21wYXRfZGlzdF8kKHN1aXRlKSArPSAkKGZvcmVhY2ggZGlyLCAkKGNhbGwgY29tcGF0aWJpbGl0eV9zdWl0ZV9kaXJzLCQoc3VpdGUpLCQoYXJjaF9kaXIpKSwgXAorICAgICAgJChzcmNfcGF0aCk6JChjYWxsIGFwcGVuZC1wYXRoLCQoZGlyKSwkKGZpbGUpKSkpKSkKK2VuZGlmCisKK2FyY2hfZGlyIDo9Citpc19uYXRpdmUgOj0KKwogJChjYWxsIGNyZWF0ZS1zdWl0ZS1kZXBlbmRlbmNpZXMpCiAKIGVuZGlmICAjIExPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUKIAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMjIFRlc3QgRGF0YQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLW15X3Rlc3RfZGF0YV9wYWlycyA6PQotbXlfaW5zdGFsbGVkX3Rlc3RfZGF0YSA6PQotCi1pZm5lcSAoJChmaWx0ZXIgTkFUSVZFX1RFU1RTLCQoTE9DQUxfTU9EVUxFX0NMQVNTKSksKQotaWZuZXEgKCQoc3RyaXAgJChMT0NBTF9URVNUX0RBVEEpKSwpCi1pZm5lcSAodHJ1ZSwkKExPQ0FMX1VOSU5TVEFMTEFCTEVfTU9EVUxFKSkKLQotbXlfdGVzdF9kYXRhX3BhaXJzIDo9ICQoc3RyaXAgJChmb3JlYWNoIHRkLCQoTE9DQUxfVEVTVF9EQVRBKSwgXAotICAgICQoZXZhbCBfZmlsZSA6PSAkKGNhbGwgd29yZC1jb2xvbiwyLCQodGQpKSkgXAotICAgICQoaWYgJChfZmlsZSksIFwKLSAgICAgICQoZXZhbCBfYmFzZSA6PSAkKGNhbGwgd29yZC1jb2xvbiwxLCQodGQpKSksIFwKLSAgICAgICQoZXZhbCBfYmFzZSA6PSAkKExPQ0FMX1BBVEgpKSBcCi0gICAgICAgICQoZXZhbCBfZmlsZSA6PSAkKGNhbGwgd29yZC1jb2xvbiwxLCQodGQpKSkpIFwKLSAgICAkKGlmICQoZmluZHN0cmluZyAuLiwkKF9maWxlKSksJChlcnJvciAkKExPQ0FMX01PRFVMRV9NQUtFRklMRSk6IExPQ0FMX1RFU1RfREFUQSBtYXkgbm90IGluY2x1ZGUgJy4uJzogJChfZmlsZSkpKSBcCi0gICAgJChpZiAkKGZpbHRlciAvJSwkKF9iYXNlKSAkKF9maWxlKSksJChlcnJvciAkKExPQ0FMX01PRFVMRV9NQUtFRklMRSk6IExPQ0FMX1RFU1RfREFUQSBtYXkgbm90IGluY2x1ZGUgYWJzb2x1dGUgcGF0aHM6ICQoX2Jhc2UpICQoX2ZpbGUpKSkgXAotICAgICQoY2FsbCBhcHBlbmQtcGF0aCwkKF9iYXNlKSwkKF9maWxlKSk6JChjYWxsIGFwcGVuZC1wYXRoLCQobXlfbW9kdWxlX3BhdGgpLCQoX2ZpbGUpKSkpCi0KLW15X2luc3RhbGxlZF90ZXN0X2RhdGEgOj0gJChjYWxsIGNvcHktbWFueS1maWxlcywkKG15X3Rlc3RfZGF0YV9wYWlycykpCi0kKExPQ0FMX0lOU1RBTExFRF9NT0RVTEUpOiAkKG15X2luc3RhbGxlZF90ZXN0X2RhdGEpCi0KLWVuZGlmCi1lbmRpZgotZW5kaWYKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICMjIFJlZ2lzdGVyIHdpdGggQUxMX01PRFVMRVMKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAKQEAgLTU3OSw2ICs2NjUsMTIgQEAKIEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuRVhQTElDSVRMWV9SRVFVSVJFRCA6PSBcCiAgICAgJChzdHJpcCAkKEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuRVhQTElDSVRMWV9SRVFVSVJFRClcCiAgICAgICAgICQobXlfcmVxdWlyZWRfbW9kdWxlcykpCitBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLlRBUkdFVF9SRVFVSVJFRCA6PSBcCisgICAgJChzdHJpcCAkKEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuVEFSR0VUX1JFUVVJUkVEKVwKKyAgICAgICAgJChMT0NBTF9UQVJHRVRfUkVRVUlSRURfTU9EVUxFUykpCitBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLkhPU1RfUkVRVUlSRUQgOj0gXAorICAgICQoc3RyaXAgJChBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLkhPU1RfUkVRVUlSRUQpXAorICAgICAgICAkKExPQ0FMX0hPU1RfUkVRVUlSRURfTU9EVUxFUykpCiBBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLkVWRU5UX0xPR19UQUdTIDo9IFwKICAgICAkKEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuRVZFTlRfTE9HX1RBR1MpICQoZXZlbnRfbG9nX3RhZ3MpCiBBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLk1BS0VGSUxFIDo9IFwKQEAgLTU5MSw2ICs2ODMsNyBAQAogQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5GT1JfMk5EX0FSQ0ggOj0gdHJ1ZQogZW5kaWYKIEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuRk9SX0hPU1RfQ1JPU1MgOj0gJChteV9ob3N0X2Nyb3NzKQorQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5DT01QQVRJQklMSVRZX1NVSVRFUyA6PSAkKExPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUpCiAKIElOU1RBTExBQkxFX0ZJTEVTLiQoTE9DQUxfSU5TVEFMTEVEX01PRFVMRSkuTU9EVUxFIDo9ICQobXlfcmVnaXN0ZXJfbmFtZSkKIApAQCAtNjE5LDcgKzcxMiw3IEBACiAKICMgQWRkIHRoaXMgbW9kdWxlIG5hbWUgdG8gdGhlIHRhZyBsaXN0IG9mIGVhY2ggc3BlY2lmaWVkIHRhZy4KICQoZm9yZWFjaCB0YWcsJChteV9tb2R1bGVfdGFncyksXAotICAgICQoZXZhbCBBTExfTU9EVUxFX05BTUVfVEFHUy4kKHRhZykgKz0gJChteV9yZWdpc3Rlcl9uYW1lKSkpCisgICAgJChldmFsIEFMTF9NT0RVTEVfTkFNRV9UQUdTLiQodGFnKSA6PSAkJChBTExfTU9EVUxFX05BTUVfVEFHUy4kKHRhZykpICQobXlfcmVnaXN0ZXJfbmFtZSkpKQogCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIyMgdW1icmVsbGEgdGFyZ2V0cyB1c2VkIHRvIHZlcmlmeSBidWlsZHMKQEAgLTY0Niw3ICs3MzksNyBAQAogCiAKIGlmZGVmIGpfb3JfbgotJChqX29yX24pICQoaF9vcl90KSAkKGpfb3JfbiktJChoX29yX3QpIDogJChteV9jaGVja2VkX21vZHVsZSkKKyQoal9vcl9uKSAkKGhfb3JfdCkgJChqX29yX24pLSQoaF9vcl9oY19vcl90KSA6ICQobXlfY2hlY2tlZF9tb2R1bGUpCiBpZm5lcSAoLCQoZmlsdGVyICQobXlfbW9kdWxlX3RhZ3MpLHRlc3RzKSkKICQoal9vcl9uKS0kKGhfb3JfdCktdGVzdHMgJChqX29yX24pLXRlc3RzICQoaF9vcl90KS10ZXN0cyA6ICQobXlfY2hlY2tlZF9tb2R1bGUpCiBlbmRpZgpAQCAtNjU3LDYgKzc1MCwxNSBAQAogZW5kaWYKIAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgRW5zdXJlIHByaXZpbGVnZWQgYXBwbGljYXRpb25zIGFsd2F5cyBoYXZlIExPQ0FMX1BSSVZJTEVHRURfTU9EVUxFCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworaWZuZGVmIExPQ0FMX1BSSVZJTEVHRURfTU9EVUxFCisgIGlmbmVxICgsJChmaWx0ZXIgJChUQVJHRVRfT1VUX0FQUFNfUFJJVklMRUdFRCkvJSAkKFRBUkdFVF9PVVRfVkVORE9SX0FQUFNfUFJJVklMRUdFRCkvJSwkKG15X21vZHVsZV9wYXRoKSkpCisgICAgTE9DQUxfUFJJVklMRUdFRF9NT0RVTEUgOj0gdHJ1ZQorICBlbmRpZgorZW5kaWYKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICMjIE5PVElDRSBmaWxlcwogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIApkaWZmIC0tZ2l0IGEvY29yZS9iaW5hcnkubWsgYi9jb3JlL2JpbmFyeS5tawppbmRleCA3ZGQ5YTEzLi42MWNkNWNmIDEwMDY0NAotLS0gYS9jb3JlL2JpbmFyeS5taworKysgYi9jb3JlL2JpbmFyeS5tawpAQCAtNjIsOCArNjIsOCBAQAogbXlfZXhwb3J0X2NfaW5jbHVkZV9kZXBzIDo9ICQoTE9DQUxfRVhQT1JUX0NfSU5DTFVERV9ERVBTKQogbXlfYXJmbGFncyA6PQogCi1pZm5lcSAoLCQoc3RyaXAgJChmb3JlYWNoIGRpciwkKHN1YnN0ICQoY29tbWEpLCQoc3BhY2UpLCQoQ09WRVJBR0VfUEFUSFMpKSwkKGZpbHRlciAkKGRpciklLCQoTE9DQUxfUEFUSCkpKSkpCi1pZmVxICgsJChzdHJpcCAkKGZvcmVhY2ggZGlyLCQoc3Vic3QgJChjb21tYSksJChzcGFjZSksJChDT1ZFUkFHRV9FWENMVURFX1BBVEhTKSksJChmaWx0ZXIgJChkaXIpJSwkKExPQ0FMX1BBVEgpKSkpKQoraWZuZXEgKCwkKHN0cmlwICQoZm9yZWFjaCBkaXIsJChDT1ZFUkFHRV9QQVRIUyksJChmaWx0ZXIgJChkaXIpJSwkKExPQ0FMX1BBVEgpKSkpKQoraWZlcSAoLCQoc3RyaXAgJChmb3JlYWNoIGRpciwkKENPVkVSQUdFX0VYQ0xVREVfUEFUSFMpLCQoZmlsdGVyICQoZGlyKSUsJChMT0NBTF9QQVRIKSkpKSkKICAgbXlfbmF0aXZlX2NvdmVyYWdlIDo9IHRydWUKIGVsc2UKICAgbXlfbmF0aXZlX2NvdmVyYWdlIDo9IGZhbHNlCkBAIC04OCw3ICs4OCw3IEBACiAgIGVuZGlmCiAKICAgIyBNYWtlIHN1cmUgd2UndmUgYnVpbHQgdGhlIE5ESy4KLSAgbXlfYWRkaXRpb25hbF9kZXBlbmRlbmNpZXMgKz0gJChTT09OR19PVVRfRElSKS9uZGsudGltZXN0YW1wCisgIG15X2FkZGl0aW9uYWxfZGVwZW5kZW5jaWVzICs9ICQoU09PTkdfT1VUX0RJUikvbmRrX2Jhc2UudGltZXN0YW1wCiAKICAgIyBtaXBzMzJyNiBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBOREsuIE5vIHJlbGVhc2VkIE5ESyBjb250YWlucyB0aGVzZQogICAjIGxpYnJhcmllcywgYnV0IHRoZSByMTAgaW4gcHJlYnVpbHRzL25kayBoYWQgYSBsb2NhbCBoYWNrIHRvIGFkZCB0aGVtIDooCkBAIC0xMDUsNyArMTA1LDcgQEAKICAgaWZuZXEgKCwkKGZpbHRlciBhcm02NCBtaXBzNjQgeDg2XzY0LCQobXlfYXJjaCkpKQogICAgIG15X21pbl9zZGtfdmVyc2lvbiA6PSAyMQogICBlbHNlCi0gICAgbXlfbWluX3Nka192ZXJzaW9uIDo9IDkKKyAgICBteV9taW5fc2RrX3ZlcnNpb24gOj0gJChNSU5fU1VQUE9SVEVEX1NES19WRVJTSU9OKQogICBlbmRpZgogCiAgICMgSGlzdG9yaWNhbGx5IHdlJ3ZlIGp1c3Qgc2V0IHVwIGEgYnVuY2ggb2Ygc3ltbGlua3MgaW4gcHJlYnVpbHRzL25kayB0byBtYXAKQEAgLTE4MCw3ICsxODAsNiBAQAogICBteV9uZGtfc3RsX2luY2x1ZGVfcGF0aCA6PQogICBteV9uZGtfc3RsX3NoYXJlZF9saWJfZnVsbHBhdGggOj0KICAgbXlfbmRrX3N0bF9zdGF0aWNfbGliIDo9Ci0gIG15X25ka19jcHBfc3RkX3ZlcnNpb24gOj0KICAgbXlfY3B1X3ZhcmlhbnQgOj0gJChUQVJHRVRfJChMT0NBTF8yTkRfQVJDSF9WQVJfUFJFRklYKUNQVV9BQkkpCiAgIGlmZXEgKG1pcHMzMnI2LCQoVEFSR0VUXyQoTE9DQUxfMk5EX0FSQ0hfVkFSX1BSRUZJWClBUkNIX1ZBUklBTlQpKQogICAgIG15X2NwdV92YXJpYW50IDo9IG1pcHMzMnI2CkBAIC0xODksODkgKzE4OCw1MiBAQAogICBpZmVxICgsJChMT0NBTF9OREtfU1RMX1ZBUklBTlQpKQogICAgIExPQ0FMX05ES19TVExfVkFSSUFOVCA6PSBzeXN0ZW0KICAgZW5kaWYKLSAgaWZuZXEgKDEsJCh3b3JkcyAkKGZpbHRlciBub25lIHN5c3RlbSBzdGxwb3J0X3N0YXRpYyBzdGxwb3J0X3NoYXJlZCBjKytfc3RhdGljIGMrK19zaGFyZWQgZ251c3RsX3N0YXRpYywgJChMT0NBTF9OREtfU1RMX1ZBUklBTlQpKSkpCisgIGlmbmVxICgxLCQod29yZHMgJChmaWx0ZXIgbm9uZSBzeXN0ZW0gYysrX3N0YXRpYyBjKytfc2hhcmVkLCAkKExPQ0FMX05ES19TVExfVkFSSUFOVCkpKSkKICAgICAkKGVycm9yICQoTE9DQUxfUEFUSCk6IFVua25vd24gTE9DQUxfTkRLX1NUTF9WQVJJQU5UICQoTE9DQUxfTkRLX1NUTF9WQVJJQU5UKSkKICAgZW5kaWYKKwogICBpZmVxIChzeXN0ZW0sJChMT0NBTF9OREtfU1RMX1ZBUklBTlQpKQogICAgIG15X25ka19zdGxfaW5jbHVkZV9wYXRoIDo9ICQobXlfbmRrX3NvdXJjZV9yb290KS9jeHgtc3RsL3N5c3RlbS9pbmNsdWRlCiAgICAgbXlfc3lzdGVtX3NoYXJlZF9saWJyYXJpZXMgKz0gbGlic3RkYysrCi0gIGVsc2UgIyBMT0NBTF9OREtfU1RMX1ZBUklBTlQgaXMgbm90IHN5c3RlbQotICBpZm5lcSAoLCQoZmlsdGVyIHN0bHBvcnRfJSwgJChMT0NBTF9OREtfU1RMX1ZBUklBTlQpKSkKLSAgICBteV9uZGtfc3RsX2luY2x1ZGVfcGF0aCA6PSAkKG15X25ka19zb3VyY2Vfcm9vdCkvY3h4LXN0bC9zdGxwb3J0L3N0bHBvcnQKLSAgICBteV9zeXN0ZW1fc2hhcmVkX2xpYnJhcmllcyArPSBsaWJzdGRjKysKLSAgICBpZmVxIChzdGxwb3J0X3N0YXRpYywkKExPQ0FMX05ES19TVExfVkFSSUFOVCkpCi0gICAgICBteV9uZGtfc3RsX3N0YXRpY19saWIgOj0gJChteV9uZGtfc291cmNlX3Jvb3QpL2N4eC1zdGwvc3RscG9ydC9saWJzLyQobXlfY3B1X3ZhcmlhbnQpL2xpYnN0bHBvcnRfc3RhdGljLmEKLSAgICAgIG15X2xkbGlicyArPSAtbGRsCi0gICAgZWxzZQotICAgICAgbXlfbmRrX3N0bF9zaGFyZWRfbGliX2Z1bGxwYXRoIDo9ICQobXlfbmRrX3NvdXJjZV9yb290KS9jeHgtc3RsL3N0bHBvcnQvbGlicy8kKG15X2NwdV92YXJpYW50KS9saWJzdGxwb3J0X3NoYXJlZC5zbwotICAgIGVuZGlmCi0gIGVsc2UgIyBMT0NBTF9OREtfU1RMX1ZBUklBTlQgaXMgbm90IHN0bHBvcnRfKiBlaXRoZXIKLSAgaWZuZXEgKCwkKGZpbHRlciBjKytfJSwgJChMT0NBTF9OREtfU1RMX1ZBUklBTlQpKSkKLSAgICAjIFByZS1yMTEgTkRLcyB1c2VkIGxpYmdhYmkrKyBmb3IgbGliYysrJ3MgQysrIEFCSSwgYnV0IHIxMSBhbmQgbGF0ZXIgdXNlCi0gICAgIyBsaWJjKythYmkuCi0gICAgIwotICAgICMgcjEzIG5vIGxvbmdlciBoYXMgdGhlIGlubmVyIGRpcmVjdG9yeSBhcyBhIHNpZGUgZWZmZWN0IG9mIGp1c3QgdXNpbmcKLSAgICAjIGV4dGVybmFsL2xpYmN4eC4KLSAgICBpZmVxIChyMTAsJChMT0NBTF9OREtfVkVSU0lPTikpCi0gICAgICBteV9uZGtfc3RsX2luY2x1ZGVfcGF0aCA6PSBcCi0gICAgICAgICQobXlfbmRrX3NvdXJjZV9yb290KS9jeHgtc3RsL2xsdm0tbGliYysrL2xpYmN4eC9pbmNsdWRlCi0gICAgICBteV9uZGtfc3RsX2luY2x1ZGVfcGF0aCArPSBcCi0gICAgICAgICQobXlfbmRrX3NvdXJjZV9yb290KS9jeHgtc3RsL2xsdm0tbGliYysrL2dhYmkrKy9pbmNsdWRlCi0gICAgZWxzZSBpZmVxIChyMTEsJChMT0NBTF9OREtfVkVSU0lPTikpCi0gICAgICBteV9uZGtfc3RsX2luY2x1ZGVfcGF0aCA6PSBcCi0gICAgICAgICQobXlfbmRrX3NvdXJjZV9yb290KS9jeHgtc3RsL2xsdm0tbGliYysrL2xpYmN4eC9pbmNsdWRlCi0gICAgICBteV9uZGtfc3RsX2luY2x1ZGVfcGF0aCArPSBcCi0gICAgICAgICQobXlfbmRrX3NvdXJjZV9yb290KS9jeHgtc3RsL2xsdm0tbGliYysrYWJpL2xpYmN4eGFiaS9pbmNsdWRlCi0gICAgZWxzZQotICAgICAgbXlfbmRrX3N0bF9pbmNsdWRlX3BhdGggOj0gXAotICAgICAgICAkKG15X25ka19zb3VyY2Vfcm9vdCkvY3h4LXN0bC9sbHZtLWxpYmMrKy9pbmNsdWRlCi0gICAgICBteV9uZGtfc3RsX2luY2x1ZGVfcGF0aCArPSBcCi0gICAgICAgICQobXlfbmRrX3NvdXJjZV9yb290KS9jeHgtc3RsL2xsdm0tbGliYysrYWJpL2luY2x1ZGUKLSAgICBlbmRpZgorICBlbHNlIGlmbmVxICgsJChmaWx0ZXIgYysrXyUsICQoTE9DQUxfTkRLX1NUTF9WQVJJQU5UKSkpCisgICAgbXlfbmRrX3N0bF9pbmNsdWRlX3BhdGggOj0gXAorICAgICAgJChteV9uZGtfc291cmNlX3Jvb3QpL2N4eC1zdGwvbGx2bS1saWJjKysvaW5jbHVkZQorICAgIG15X25ka19zdGxfaW5jbHVkZV9wYXRoICs9IFwKKyAgICAgICQobXlfbmRrX3NvdXJjZV9yb290KS9jeHgtc3RsL2xsdm0tbGliYysrYWJpL2luY2x1ZGUKICAgICBteV9uZGtfc3RsX2luY2x1ZGVfcGF0aCArPSAkKG15X25ka19zb3VyY2Vfcm9vdCkvYW5kcm9pZC9zdXBwb3J0L2luY2x1ZGUKIAogICAgIG15X2xpYmN4eF9saWJkaXIgOj0gXAogICAgICAgJChteV9uZGtfc291cmNlX3Jvb3QpL2N4eC1zdGwvbGx2bS1saWJjKysvbGlicy8kKG15X2NwdV92YXJpYW50KQogCi0gICAgaWZuZXEgKCwkKGZpbHRlciByMTAgcjExLCQoTE9DQUxfTkRLX1ZFUlNJT04pKSkKLSAgICAgIGlmZXEgKGMrK19zdGF0aWMsJChMT0NBTF9OREtfU1RMX1ZBUklBTlQpKQotICAgICAgICBteV9uZGtfc3RsX3N0YXRpY19saWIgOj0gJChteV9saWJjeHhfbGliZGlyKS9saWJjKytfc3RhdGljLmEKLSAgICAgIGVsc2UKLSAgICAgICAgbXlfbmRrX3N0bF9zaGFyZWRfbGliX2Z1bGxwYXRoIDo9ICQobXlfbGliY3h4X2xpYmRpcikvbGliYysrX3NoYXJlZC5zbwotICAgICAgZW5kaWYKKyAgICBpZmVxIChjKytfc3RhdGljLCQoTE9DQUxfTkRLX1NUTF9WQVJJQU5UKSkKKyAgICAgIG15X25ka19zdGxfc3RhdGljX2xpYiA6PSBcCisgICAgICAgICQobXlfbGliY3h4X2xpYmRpcikvbGliYysrX3N0YXRpYy5hIFwKKyAgICAgICAgJChteV9saWJjeHhfbGliZGlyKS9saWJjKythYmkuYQogICAgIGVsc2UKLSAgICAgIGlmZXEgKGMrK19zdGF0aWMsJChMT0NBTF9OREtfU1RMX1ZBUklBTlQpKQotICAgICAgICBteV9uZGtfc3RsX3N0YXRpY19saWIgOj0gXAotICAgICAgICAgICQobXlfbGliY3h4X2xpYmRpcikvbGliYysrX3N0YXRpYy5hIFwKLSAgICAgICAgICAkKG15X2xpYmN4eF9saWJkaXIpL2xpYmMrK2FiaS5hCi0gICAgICBlbHNlCi0gICAgICAgIG15X25ka19zdGxfc2hhcmVkX2xpYl9mdWxscGF0aCA6PSAkKG15X2xpYmN4eF9saWJkaXIpL2xpYmMrK19zaGFyZWQuc28KLSAgICAgIGVuZGlmCisgICAgICBteV9uZGtfc3RsX3NoYXJlZF9saWJfZnVsbHBhdGggOj0gJChteV9saWJjeHhfbGliZGlyKS9saWJjKytfc2hhcmVkLnNvCisgICAgZW5kaWYKIAotICAgICAgbXlfbmRrX3N0bF9zdGF0aWNfbGliICs9ICQobXlfbGliY3h4X2xpYmRpcikvbGliYW5kcm9pZF9zdXBwb3J0LmEKLSAgICAgIGlmbmVxICgsJChmaWx0ZXIgYXJtZWFiaSBhcm1lYWJpLXY3YSwkKG15X2NwdV92YXJpYW50KSkpCi0gICAgICAgIG15X25ka19zdGxfc3RhdGljX2xpYiArPSAkKG15X2xpYmN4eF9saWJkaXIpL2xpYnVud2luZC5hCi0gICAgICBlbmRpZgorICAgIG15X25ka19zdGxfc3RhdGljX2xpYiArPSAkKG15X2xpYmN4eF9saWJkaXIpL2xpYmFuZHJvaWRfc3VwcG9ydC5hCisgICAgaWZuZXEgKCwkKGZpbHRlciBhcm1lYWJpIGFybWVhYmktdjdhLCQobXlfY3B1X3ZhcmlhbnQpKSkKKyAgICAgIG15X25ka19zdGxfc3RhdGljX2xpYiArPSAkKG15X2xpYmN4eF9saWJkaXIpL2xpYnVud2luZC5hCiAgICAgZW5kaWYKIAogICAgIG15X2xkbGlicyArPSAtbGRsCi0KLSAgICBteV9uZGtfY3BwX3N0ZF92ZXJzaW9uIDo9IGMrKzExCi0gIGVsc2UgIyBMT0NBTF9OREtfU1RMX1ZBUklBTlQgaXMgbm90IGMrK18qIGVpdGhlcgotICBpZm5lcSAoLCQoZmlsdGVyIGdudXN0bF8lLCAkKExPQ0FMX05ES19TVExfVkFSSUFOVCkpKQotICAgIG15X25ka19zdGxfaW5jbHVkZV9wYXRoIDo9ICQobXlfbmRrX3NvdXJjZV9yb290KS9jeHgtc3RsL2dudS1saWJzdGRjKysvJCgkKExPQ0FMXzJORF9BUkNIX1ZBUl9QUkVGSVgpVEFSR0VUX05ES19HQ0NfVkVSU0lPTikvbGlicy8kKG15X2NwdV92YXJpYW50KS9pbmNsdWRlIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKG15X25ka19zb3VyY2Vfcm9vdCkvY3h4LXN0bC9nbnUtbGlic3RkYysrLyQoJChMT0NBTF8yTkRfQVJDSF9WQVJfUFJFRklYKVRBUkdFVF9OREtfR0NDX1ZFUlNJT04pL2luY2x1ZGUKLSAgICBteV9uZGtfc3RsX3N0YXRpY19saWIgOj0gJChteV9uZGtfc291cmNlX3Jvb3QpL2N4eC1zdGwvZ251LWxpYnN0ZGMrKy8kKCQoTE9DQUxfMk5EX0FSQ0hfVkFSX1BSRUZJWClUQVJHRVRfTkRLX0dDQ19WRVJTSU9OKS9saWJzLyQobXlfY3B1X3ZhcmlhbnQpL2xpYmdudXN0bF9zdGF0aWMuYQogICBlbHNlICMgTE9DQUxfTkRLX1NUTF9WQVJJQU5UIG11c3QgYmUgbm9uZQogICAgICMgRG8gbm90aGluZy4KICAgZW5kaWYKLSAgZW5kaWYKLSAgZW5kaWYKLSAgZW5kaWYKIGVuZGlmCiAKIGlmbmVxICgkKExPQ0FMX1VTRV9WTkRLKSwpCi0gIG15X2NmbGFncyArPSAtRF9fQU5EUk9JRF9BUElfXz1fX0FORFJPSURfQVBJX0ZVVFVSRV9fIC1EX19BTkRST0lEX1ZOREtfXworICAjIFJlcXVpcmVkIFZOREsgdmVyc2lvbiBmb3IgdmVuZG9yIG1vZHVsZXMgaXMgQk9BUkRfVk5ES19WRVJTSU9OLgorICBteV92bmRrX3ZlcnNpb24gOj0gJChCT0FSRF9WTkRLX1ZFUlNJT04pCisgIGlmZXEgKCQobXlfdm5ka192ZXJzaW9uKSxjdXJyZW50KQorICAgICMgQnVpbGQgd2l0aCBjdXJyZW50IFBMQVRGT1JNX1ZOREtfVkVSU0lPTi4KKyAgICAjIElmIFBMQVRGT1JNX1ZOREtfVkVSU0lPTiBoYXMgYSBDT0RFTkFNRSwgaXQgd2lsbCByZXR1cm4KKyAgICAjIF9fQU5EUk9JRF9BUElfRlVUVVJFX18uCisgICAgbXlfdm5ka192ZXJzaW9uIDo9ICQoY2FsbCBjb2RlbmFtZS1vci1zZGstdG8tc2RrLCQoUExBVEZPUk1fVk5ES19WRVJTSU9OKSkKKyAgZW5kaWYKKyAgbXlfY2ZsYWdzICs9IC1EX19BTkRST0lEX0FQSV9fPSQobXlfdm5ka192ZXJzaW9uKSAtRF9fQU5EUk9JRF9WTkRLX18KIGVuZGlmCiAKIGlmbmRlZiBMT0NBTF9JU19IT1NUX01PRFVMRQpAQCAtMjkwLDYgKzI1MiwxNSBAQAogIyBNb3ZlIG90aGVyIGxkbGlicyBiYWNrIHRvIHNoYXJlZCBsaWJyYXJpZXMKIG15X3NoYXJlZF9saWJyYXJpZXMgKz0gJChwYXRzdWJzdCAtbCUsbGliJSwkKGZpbHRlci1vdXQgJChteV9hbGxvd2VkX2xkbGlicyksJChteV9sZGxpYnMpKSkKIG15X2xkbGlicyA6PSAkKGZpbHRlciAkKG15X2FsbG93ZWRfbGRsaWJzKSwkKG15X2xkbGlicykpCitlbHNlICMgTE9DQUxfSVNfSE9TVF9NT0RVTEUKKyAgIyBBZGQgLWxkbCwgLWxwdGhyZWFkLCAtbG0gYW5kIC1scnQgdG8gaG9zdCBidWlsZHMgdG8gbWF0Y2ggdGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YKKyAgIyBkZXZpY2UgYnVpbGRzCisgIGlmbmVxICgkKCQobXlfcHJlZml4KU9TKSx3aW5kb3dzKQorICAgIG15X2xkbGlicyArPSAtbGRsIC1scHRocmVhZCAtbG0KKyAgICBpZm5lcSAoJChIT1NUX09TKSxkYXJ3aW4pCisgICAgICBteV9sZGxpYnMgKz0gLWxydAorICAgIGVuZGlmCisgIGVuZGlmCiBlbmRpZgogCiBpZm5lcSAoJChMT0NBTF9TREtfVkVSU0lPTiksKQpAQCAtMzc4LDkgKzM0OSw5IEBACiAjIGNsYW5nIGlzIGVuYWJsZWQgYnkgZGVmYXVsdCBmb3IgaG9zdCBidWlsZHMKICMgZW5hYmxlIGl0IHVubGVzcyB3ZSd2ZSBzcGVjaWZpY2FsbHkgZGlzYWJsZWQgY2xhbmcgYWJvdmUKIGlmZGVmIExPQ0FMX0lTX0hPU1RfTU9EVUxFCi0gICAgaWZlcSAoJCgkKG15X3ByZWZpeClPUyksd2luZG93cykKKyAgICBpZm5lcSAoJCgkKG15X3ByZWZpeClDTEFOR19TVVBQT1JURUQpLHRydWUpCiAgICAgICAgIGlmZXEgKCQobXlfY2xhbmcpLHRydWUpCi0gICAgICAgICAgICAkKGVycm9yICQoTE9DQUxfTU9EVUxFX01BS0VGSUxFKTogJChMT0NBTF9NT0RVTEUpOiBDbGFuZyBpcyBub3QgeWV0IHN1cHBvcnRlZCBmb3Igd2luZG93cyBiaW5hcmllcykKKyAgICAgICAgICAgICQoY2FsbCBwcmV0dHktZXJyb3IsQ2xhbmcgaXMgbm90IHlldCBzdXBwb3J0ZWQgZm9yICQoJChteV9wcmVmaXgpT1MpIGJpbmFyaWVzKQogICAgICAgICBlbmRpZgogICAgICAgICBteV9jbGFuZyA6PSBmYWxzZQogICAgIGVsc2UKQEAgLTM4OCwxMSArMzU5LDYgQEAKICAgICAgICAgICAgIG15X2NsYW5nIDo9IHRydWUKICAgICAgICAgZW5kaWYKICAgICBlbmRpZgotIyBBZGQgb3B0aW9uIHRvIG1ha2UgZ2NjIHRoZSBkZWZhdWx0IGZvciBkZXZpY2UgYnVpbGQKLWVsc2UgaWZlcSAoJChVU0VfQ0xBTkdfUExBVEZPUk1fQlVJTEQpLGZhbHNlKQotICAgIGlmZXEgKCQobXlfY2xhbmcpLCkKLSAgICAgICAgbXlfY2xhbmcgOj0gZmFsc2UKLSAgICBlbmRpZgogZWxzZSBpZmVxICgkKG15X2NsYW5nKSwpCiAgICAgbXlfY2xhbmcgOj0gdHJ1ZQogZW5kaWYKQEAgLTQyMCwxMSArMzg2LDYgQEAKICAgICBteV9jcHBfc3RkX3ZlcnNpb24gOj0gJChERUZBVUxUX0dDQ19DUFBfU1REX1ZFUlNJT04pCiBlbmRpZgogCi1pZmRlZiBMT0NBTF9TREtfVkVSU0lPTgotICAgICMgVGhlIE5ESyBoYW5kbGVzIHRoaXMgaXRzZWxmLgotICAgIG15X2NwcF9zdGRfdmVyc2lvbiA6PSAkKG15X25ka19jcHBfc3RkX3ZlcnNpb24pCi1lbmRpZgotCiBpZmRlZiBMT0NBTF9JU19IT1NUX01PRFVMRQogICAgIGlmbmVxICgkKG15X2NsYW5nKSx0cnVlKQogICAgICAgICAjIFRoZSBob3N0IEdDQyBkb2Vzbid0IHN1cHBvcnQgQysrMTQgKGFuZCBpcyBkZXByZWNhdGVkLCBzbyBsaWtlbHkKQEAgLTY1Niw2ICs2MTcsOSBAQAogICBteV9jYyA6PSAkKG15X2NjX3dyYXBwZXIpICQobXlfY2MpCiBlbmRpZgogCitTWU5UQVhfVE9PTFNfUFJFRklYIDo9IFwKKyAgICAkKExMVk1fUFJFQlVJTFRTX0JBU0UpLyQoQlVJTERfT1MpLXg4Ni8kKExMVk1fUFJFQlVJTFRTX1ZFUlNJT04pL2xpYmV4ZWMKKwogaWZuZXEgKCQoTE9DQUxfTk9fU1RBVElDX0FOQUxZWkVSKSx0cnVlKQogICBteV9jYyA6PSBDQ0NfQ0M9JChDTEFORykgQ0xBTkc9JChDTEFORykgXAogICAgICAgICAgICAkKFNZTlRBWF9UT09MU19QUkVGSVgpL2NjYy1hbmFseXplcgpAQCAtNzk3LDcgKzc2MSw3IEBACiBpZm5lcSAoLCQoTE9DQUxfU0RLX1ZFUlNJT04pKQogIyBTZXQgdGFyZ2V0LWFwaSBmb3IgTE9DQUxfU0RLX1ZFUlNJT05zIG90aGVyIHRoYW4gY3VycmVudC4KIGlmbmVxICgsJChmaWx0ZXItb3V0IGN1cnJlbnQgc3lzdGVtX2N1cnJlbnQgdGVzdF9jdXJyZW50LCAkKExPQ0FMX1NES19WRVJTSU9OKSkpCi1yZW5kZXJzY3JpcHRfdGFyZ2V0X2FwaSA6PSAkKExPQ0FMX1NES19WRVJTSU9OKQorcmVuZGVyc2NyaXB0X3RhcmdldF9hcGkgOj0gJChjYWxsIGdldC1udW1lcmljLXNkay12ZXJzaW9uLCQoTE9DQUxfU0RLX1ZFUlNJT04pKQogZW5kaWYKIGVuZGlmICAjIExPQ0FMX1NES19WRVJTSU9OIGlzIHNldAogZW5kaWYgICMgTE9DQUxfUkVOREVSU0NSSVBUX1RBUkdFVF9BUEkgaXMgc2V0CkBAIC04NjEsNiArODI1LDkgQEAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAjIyBDb21waWxlIHRoZSAucHJvdG8gZmlsZXMgdG8gLmNjIChvciAuYykgYW5kIHRoZW4gdG8gLm8KICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitpZmVxICgkKHN0cmlwICQoTE9DQUxfUFJPVE9DX09QVElNSVpFX1RZUEUpKSwpCisgIExPQ0FMX1BST1RPQ19PUFRJTUlaRV9UWVBFIDo9IGxpdGUKK2VuZGlmCiBwcm90b19zb3VyY2VzIDo9ICQoZmlsdGVyICUucHJvdG8sJChteV9zcmNfZmlsZXMpKQogaWZuZXEgKCQocHJvdG9fc291cmNlcyksKQogcHJvdG9fZ2VuX2RpciA6PSAkKGdlbmVyYXRlZF9zb3VyY2VzX2RpcikvcHJvdG8KQEAgLTg4Miw3ICs4NDksNyBAQAogZW5kaWYKIG15X3Byb3RvX2NfaW5jbHVkZXMgOj0gZXh0ZXJuYWwvcHJvdG9idWYvc3JjCiBteV9jZmxhZ3MgKz0gLURHT09HTEVfUFJPVE9CVUZfTk9fUlRUSQotbXlfcHJvdG9jX2ZsYWdzIDo9IC0tY3BwX291dD0kKHByb3RvX2dlbl9kaXIpCitteV9wcm90b2NfZmxhZ3MgOj0gLS1jcHBfb3V0PSQoaWYgJChmaWx0ZXIgbGl0ZSBsaXRlLXN0YXRpYywkKExPQ0FMX1BST1RPQ19PUFRJTUlaRV9UWVBFKSksbGl0ZTosKSQocHJvdG9fZ2VuX2RpcikKIG15X3Byb3RvY19kZXBzIDo9CiBlbmRpZgogbXlfcHJvdG9fY19pbmNsdWRlcyArPSAkKHByb3RvX2dlbl9kaXIpCkBAIC0xMzIxLDYgKzEyODgsMjIgQEAKIGFzbV9vYmplY3RzICs9ICQoYXNtX29iamVjdHNfYXNtKQogZW5kaWYKIAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMgV2hlbiBjb21waWxpbmcgYSBDRkkgZW5hYmxlZCB0YXJnZXQsIHVzZSB0aGUgLmNmaSB2YXJpYW50IG9mIGFueQorIyMgc3RhdGljIGRlcGVuZGVuY2llcyAod2hlcmUgdGhleSBleGlzdCkuCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2RlZmluZSB1c2Vfc29vbmdfY2ZpX3N0YXRpY19saWJyYXJpZXMKKyAgJChmb3JlYWNoIGwsJCgxKSwkKGlmICQoZmlsdGVyICQobCksJChTT09OR19DRklfU1RBVElDX0xJQlJBUklFUykpLFwKKyAgICAgICQobCkuY2ZpLCQobCkpKQorZW5kZWYKKworaWZuZXEgKCQoZmlsdGVyIGNmaSwkKG15X3Nhbml0aXplKSksKQorICBteV93aG9sZV9zdGF0aWNfbGlicmFyaWVzIDo9ICQoY2FsbCB1c2Vfc29vbmdfY2ZpX3N0YXRpY19saWJyYXJpZXMsXAorICAgICQobXlfd2hvbGVfc3RhdGljX2xpYnJhcmllcykpCisgIG15X3N0YXRpY19saWJyYXJpZXMgOj0gJChjYWxsIHVzZV9zb29uZ19jZmlfc3RhdGljX2xpYnJhcmllcyxcCisgICAgJChteV9zdGF0aWNfbGlicmFyaWVzKSkKK2VuZGlmCisKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAjIyBXaGVuIGNvbXBpbGluZyBhZ2FpbnN0IHRoZSBWTkRLLCB1c2UgTEwtTkRLIGxpYnJhcmllcwogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKQEAgLTEzNDcsNiArMTMzMCwxNSBAQAogICBlbmRpZgogZW5kaWYKIAorIyBQbGF0Zm9ybSBjYW4gdXNlIHZlbmRvciBwdWJsaWMgbGlicmFyaWVzLiBJZiBhIHJlcXVpcmVkIHNoYXJlZCBsaWIgaXMgb25lIG9mCisjIHRoZSB2ZW5kb3IgcHVibGljIGxpYnJhcmllcywgdGhlIGxpYiBpcyBzd2l0Y2hlZCB0byB0aGUgc3R1YiB2ZXJzaW9uIG9mIHRoZSBsaWIuCitpZmVxICgkKExPQ0FMX1VTRV9WTkRLKSwpCisgIGlmbmVxICgkKExPQ0FMX01PRFVMRV9NQUtFRklMRSksJChTT09OR19BTkRST0lEX01LKSkKKyAgICBteV9zaGFyZWRfbGlicmFyaWVzIDo9ICQoZm9yZWFjaCBsLCQobXlfc2hhcmVkX2xpYnJhcmllcyksXAorICAgICAgJChpZiAkKGZpbHRlciAkKGwpLCQoVkVORE9SX1BVQkxJQ19MSUJSQVJJRVMpKSwkKGwpLnZlbmRvcnB1YmxpYywkKGwpKSkKKyAgZW5kaWYKK2VuZGlmCisKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICMjIFNldCB1cCBpbnN0YWxsZWQgbW9kdWxlIGRlcGVuZGVuY3kKICMjIFdlIGNhbm5vdCBjb21wdXRlIHRoZSBmdWxsIHBhdGggb2YgdGhlIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgZm9yCkBAIC0xNDAxLDE4ICsxMzkzLDMzIEBACiAjIyBvdGhlciBOREstYnVpbHQgbGlicmFyaWVzCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAKK2luY2x1ZGUgJChCVUlMRF9TWVNURU0pL2FsbG93ZWRfbmRrX3R5cGVzLm1rCisKIGlmZGVmIExPQ0FMX1NES19WRVJTSU9OCi1teV9saW5rX3R5cGUgOj0gbmF0aXZlOm5kawotbXlfd2Fybl90eXBlcyA6PQotbXlfYWxsb3dlZF90eXBlcyA6PSBuYXRpdmU6bmRrCitteV9saW5rX3R5cGUgOj0gbmF0aXZlOm5kazokKG15X25ka19zdGxfZmFtaWx5KTokKG15X25ka19zdGxfbGlua190eXBlKQorbXlfd2Fybl90eXBlcyA6PSAkKG15X3dhcm5fbmRrX3R5cGVzKQorbXlfYWxsb3dlZF90eXBlcyA6PSAkKG15X2FsbG93ZWRfbmRrX3R5cGVzKQogZWxzZSBpZmRlZiBMT0NBTF9VU0VfVk5ESwotbXlfbGlua190eXBlIDo9IG5hdGl2ZTp2ZW5kb3IKLW15X3dhcm5fdHlwZXMgOj0KLW15X2FsbG93ZWRfdHlwZXMgOj0gbmF0aXZlOnZlbmRvcgorICAgIF9uYW1lIDo9ICQocGF0c3Vic3QgJS52ZW5kb3IsJSwkKExPQ0FMX01PRFVMRSkpCisgICAgaWZuZXEgKCQoZmlsdGVyICQoX25hbWUpLCQoVk5ES19DT1JFX0xJQlJBUklFUykgJChWTkRLX1NBTUVQUk9DRVNTX0xJQlJBUklFUykgJChMTE5ES19MSUJSQVJJRVMpKSwpCisgICAgICAgIGlmZXEgKCQoZmlsdGVyICQoX25hbWUpLCQoVk5ES19QUklWQVRFX0xJQlJBUklFUykpLCkKKyAgICAgICAgICAgIG15X2xpbmtfdHlwZSA6PSBuYXRpdmU6dm5kaworICAgICAgICBlbHNlCisgICAgICAgICAgICBteV9saW5rX3R5cGUgOj0gbmF0aXZlOnZuZGtfcHJpdmF0ZQorICAgICAgICBlbmRpZgorICAgICAgICBteV93YXJuX3R5cGVzIDo9CisgICAgICAgIG15X2FsbG93ZWRfdHlwZXMgOj0gbmF0aXZlOnZuZGsgbmF0aXZlOnZuZGtfcHJpdmF0ZQorICAgIGVsc2UKKyAgICAgICAgIyBNb2R1bGVzIGluc3RhbGxlZCB0byAvdmVuZG9yIGNhbm5vdCBkaXJlY3RseSBkZXBlbmQgb24gbW9kdWxlcyBtYXJrZWQKKyAgICAgICAgIyB3aXRoIHZlbmRvcl9hdmFpbGFibGU6IGZhbHNlCisgICAgICAgIG15X2xpbmtfdHlwZSA6PSBuYXRpdmU6dmVuZG9yCisgICAgICAgIG15X3dhcm5fdHlwZXMgOj0KKyAgICAgICAgbXlfYWxsb3dlZF90eXBlcyA6PSBuYXRpdmU6dmVuZG9yIG5hdGl2ZTp2bmRrCisgICAgZW5kaWYKIGVsc2UKIG15X2xpbmtfdHlwZSA6PSBuYXRpdmU6cGxhdGZvcm0KLW15X3dhcm5fdHlwZXMgOj0KLW15X2FsbG93ZWRfdHlwZXMgOj0gbmF0aXZlOm5kayBuYXRpdmU6cGxhdGZvcm0KK215X3dhcm5fdHlwZXMgOj0gJChteV93YXJuX25ka190eXBlcykKK215X2FsbG93ZWRfdHlwZXMgOj0gJChteV9hbGxvd2VkX25ka190eXBlcykgbmF0aXZlOnBsYXRmb3JtCiBlbmRpZgogCiBteV9saW5rX2RlcHMgOj0gJChhZGRwcmVmaXggU1RBVElDX0xJQlJBUklFUzosJChteV93aG9sZV9zdGF0aWNfbGlicmFyaWVzKSAkKG15X3N0YXRpY19saWJyYXJpZXMpKQpAQCAtMTU4MCw2ICsxNTg3LDkgQEAKICAgICAkKGZvcmVhY2ggbGliLCQobXlfc3RhdGljX2xpYnJhcmllcykgJChteV93aG9sZV9zdGF0aWNfbGlicmFyaWVzKSwgXAogICAgICAgTk9USUNFLSQoaWYgJChMT0NBTF9JU19IT1NUX01PRFVMRSksSE9TVCxUQVJHRVQpLVNUQVRJQ19MSUJSQVJJRVMtJChsaWIpKQogCiskKG5vdGljZV90YXJnZXQpOiB8ICQoaW5zdGFsbGVkX3N0YXRpY19saWJyYXJ5X25vdGljZV9maWxlX3RhcmdldHMpCiskKExPQ0FMX0lOU1RBTExFRF9NT0RVTEUpOiB8ICQobm90aWNlX3RhcmdldCkKKwogIyBEZWZhdWx0IGlzIC1mbm8tcnR0aS4KIGlmZXEgKCQoc3RyaXAgJChMT0NBTF9SVFRJX0ZMQUcpKSwpCiBMT0NBTF9SVFRJX0ZMQUcgOj0gLWZuby1ydHRpCkBAIC0xNjQyLDEzICsxNjUyLDMwIEBACiAgICAgbXlfY2ZsYWdzICs9IC1EQU5EUk9JRF9TVFJJQ1QKIGVuZGlmCiAKLSMgQWRkIC1XZXJyb3IgaWYgTE9DQUxfUEFUSCBpcyBpbiB0aGUgV0FSTklOR19ESVNBTExPV0VEIHByb2plY3QgbGlzdCwKLSMgb3Igbm90IGluIHRoZSBXQVJOSU5HX0FMTE9XRUQgcHJvamVjdCBsaXN0LgotaWZuZXEgKCwkKHN0cmlwICQoY2FsbCBmaW5kX3dhcm5pbmdfZGlzYWxsb3dlZF9wcm9qZWN0cywkKExPQ0FMX1BBVEgpKSkpCi0gIG15X2NmbGFnc19ub19vdmVycmlkZSArPSAtV2Vycm9yCi1lbHNlCi0gIGlmZXEgKCwkKHN0cmlwICQoY2FsbCBmaW5kX3dhcm5pbmdfYWxsb3dlZF9wcm9qZWN0cywkKExPQ0FMX1BBVEgpKSkpCi0gICAgbXlfY2ZsYWdzX25vX292ZXJyaWRlICs9IC1XZXJyb3IKKyMgQ2hlY2sgaWYgLVdlcnJvciBvciAtV25vLWVycm9yIGlzIHVzZWQgaW4gQyBjb21waWxlciBmbGFncy4KKyMgTW9kdWxlcyBkZWZpbmVkIGluICQoU09PTkdfQU5EUk9JRF9NSykgYXJlIGNoZWNrZWQgaW4gc29vbmcncyBjYy5nby4KK2lmbmVxICgkKExPQ0FMX01PRFVMRV9NQUtFRklMRSksJChTT09OR19BTkRST0lEX01LKSkKKyAgIyBIZWFkZXIgbGlicmFyaWVzIGRvIG5vdCBuZWVkIGNmbGFncy4KKyAgaWZuZXEgKEhFQURFUl9MSUJSQVJJRVMsJChMT0NBTF9NT0RVTEVfQ0xBU1MpKQorICAgICMgUHJlYnVpbHQgbW9kdWxlcyBkbyBub3QgbmVlZCBjZmxhZ3MuCisgICAgaWZlcSAoLCQoTE9DQUxfUFJFQlVJTFRfTU9EVUxFX0ZJTEUpKQorICAgICAgbXlfYWxsX2NmbGFncyA6PSAkKG15X2NmbGFncykgJChteV9jcHBmbGFncykgJChteV9jZmxhZ3Nfbm9fb3ZlcnJpZGUpCisgICAgICAjIElzc3VlIHdhcm5pbmcgaWYgLVduby1lcnJvciBpcyB1c2VkLgorICAgICAgaWZuZXEgKCwkKGZpbHRlciAtV25vLWVycm9yLCQobXlfYWxsX2NmbGFncykpKQorICAgICAgICAkKGV2YWwgTU9EVUxFU19VU0lOR19XTk9fRVJST1IgOj0gJChNT0RVTEVTX1VTSU5HX1dOT19FUlJPUikgJChMT0NBTF9NT0RVTEVfTUFLRUZJTEUpOiQoTE9DQUxfTU9EVUxFKSkKKyAgICAgIGVsc2UKKyAgICAgICAgIyBJc3N1ZSB3YXJuaW5nIGlmIC1XZXJyb3IgaXMgbm90IHVzZWQuIEFkZCBpdC4KKyAgICAgICAgaWZlcSAoLCQoZmlsdGVyIC1XZXJyb3IsJChteV9hbGxfY2ZsYWdzKSkpCisgICAgICAgICAgIyBBZGQgLVdhbGwgLVdlcnJvciB1bmxlc3MgdGhlIHByb2plY3QgaXMgaW4gdGhlIFdBUk5JTkdfQUxMT1dFRCBwcm9qZWN0IGxpc3QuCisgICAgICAgICAgaWZlcSAoLCQoc3RyaXAgJChjYWxsIGZpbmRfd2FybmluZ19hbGxvd2VkX3Byb2plY3RzLCQoTE9DQUxfUEFUSCkpKSkKKyAgICAgICAgICAgIG15X2NmbGFncyA6PSAtV2FsbCAtV2Vycm9yICQobXlfY2ZsYWdzKQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICQoZXZhbCBNT0RVTEVTX0FEREVEX1dBTEwgOj0gJChNT0RVTEVTX0FEREVEX1dBTEwpICQoTE9DQUxfTU9EVUxFX01BS0VGSUxFKTokKExPQ0FMX01PRFVMRSkpCisgICAgICAgICAgICBteV9jZmxhZ3MgOj0gLVdhbGwgJChteV9jZmxhZ3MpCisgICAgICAgICAgZW5kaWYKKyAgICAgICAgZW5kaWYKKyAgICAgIGVuZGlmCisgICAgZW5kaWYKICAgZW5kaWYKIGVuZGlmCiAKQEAgLTE2ODEsMjEgKzE3MDgsMjAgQEAKICAgICBpZm5lcSAoJChMT0NBTF9USURZX0NIRUNLUyksKQogICAgICAgbXlfdGlkeV9jaGVja3MgOj0gJChteV90aWR5X2NoZWNrcyksJChMT0NBTF9USURZX0NIRUNLUykKICAgICBlbmRpZgotICAgICMgU2V0IHVwIGdsb2JhbCBkZWZhdWx0IGNsYW5nLXRpZHkgZmxhZ3MsIHdoaWNoIGlzIG5vbmUuCi0gICAgbXlfdGlkeV9mbGFncyA6PSAkKFdJVEhfVElEWV9GTEFHUykKLSAgICAjIFVzZSBsb2NhbCBjbGFuZy10aWR5IGZsYWdzIGlmIHNwZWNpZmllZC4KLSAgICBpZm5lcSAoJChMT0NBTF9USURZX0ZMQUdTKSwpCi0gICAgICBteV90aWR5X2ZsYWdzIDo9ICQoTE9DQUxfVElEWV9GTEFHUykKLSAgICBlbmRpZgorICAgIG15X3RpZHlfZmxhZ3MgKz0gJChXSVRIX1RJRFlfRkxBR1MpICQoTE9DQUxfVElEWV9GTEFHUykKICAgICAjIElmIHRpZHkgZmxhZ3MgYXJlIG5vdCBzcGVjaWZpZWQsIGRlZmF1bHQgdG8gY2hlY2sgYWxsIGhlYWRlciBmaWxlcy4KICAgICBpZmVxICgkKG15X3RpZHlfZmxhZ3MpLCkKICAgICAgIG15X3RpZHlfZmxhZ3MgOj0gJChjYWxsIGRlZmF1bHRfdGlkeV9oZWFkZXJfZmlsdGVyLCQoTE9DQUxfUEFUSCkpCiAgICAgZW5kaWYKKyAgICAjIElmIGNsYW5nLXRpZHkgaXMgbm90IGVuYWJsZWQgZ2xvYmFsbHksIGFkZCB0aGUgLXF1aWV0IGZsYWcuCisgICAgaWZlcSAoLCQoZmlsdGVyIDEgdHJ1ZSwkKFdJVEhfVElEWSkpKQorICAgICAgbXlfdGlkeV9mbGFncyArPSAtcXVpZXQgLWV4dHJhLWFyZy1iZWZvcmU9LWZuby1jYXJldC1kaWFnbm9zdGljcworICAgIGVuZGlmCiAKICAgICAjIFdlIG1pZ2h0IGJlIHVzaW5nIHRoZSBzdGF0aWMgYW5hbHl6ZXIgdGhyb3VnaCBjbGFuZy10aWR5LgogICAgICMgaHR0cHM6Ly9idWdzLmxsdm0ub3JnL3Nob3dfYnVnLmNnaT9pZD0zMjkxNAogICAgIGlmbmVxICgkKG15X3RpZHlfY2hlY2tzKSwpCi0gICAgICBteV90aWR5X2ZsYWdzICs9ICItZXh0cmEtYXJnLWJlZm9yZT0tRF9fY2xhbmdfYW5hbHl6ZXJfXyIKKyAgICAgIG15X3RpZHlfZmxhZ3MgKz0gLWV4dHJhLWFyZy1iZWZvcmU9LURfX2NsYW5nX2FuYWx5emVyX18KICAgICBlbmRpZgogICBlbmRpZgogZW5kaWYKQEAgLTE3MDgsMTcgKzE3MzQsMTkgQEAKIG15X2xkZmxhZ3MgOj0gJChmaWx0ZXItb3V0IC1sJSwkKG15X2xkbGliX2ZsYWdzKSkKIAogIyBPbmUgbGFzdCB2ZXJpZmljYXRpb24gY2hlY2sgZm9yIGxkbGlicwotaWZuZGVmIExPQ0FMX0lTX0hPU1RfTU9EVUxFCiBteV9hbGxvd2VkX2xkbGlicyA6PQotaWZuZXEgKCQoTE9DQUxfU0RLX1ZFUlNJT04pLCkKLSAgbXlfYWxsb3dlZF9sZGxpYnMgOj0gJChhZGRwcmVmaXggLWwsJChOREtfUFJFQlVJTFRfU0hBUkVEX0xJQlJBUklFUykpCitpZm5kZWYgTE9DQUxfSVNfSE9TVF9NT0RVTEUKKyAgaWZuZXEgKCQoTE9DQUxfU0RLX1ZFUlNJT04pLCkKKyAgICBteV9hbGxvd2VkX2xkbGlicyA6PSAkKGFkZHByZWZpeCAtbCwkKE5ES19QUkVCVUlMVF9TSEFSRURfTElCUkFSSUVTKSkKKyAgZW5kaWYKK2Vsc2UKKyAgbXlfYWxsb3dlZF9sZGxpYnMgOj0gJCgkKG15X3ByZWZpeClBVkFJTEFCTEVfTElCUkFSSUVTKQogZW5kaWYKIAogbXlfYmFkX2xkbGlicyA6PSAkKGZpbHRlci1vdXQgJChteV9hbGxvd2VkX2xkbGlicyksJChteV9sZGxpYnMpKQogaWZuZXEgKCQobXlfYmFkX2xkbGlicyksKQogICAkKGVycm9yICQoTE9DQUxfTU9EVUxFX01BS0VGSUxFKTogJChMT0NBTF9NT0RVTEUpOiBCYWQgTE9DQUxfTERMSUJTIGVudHJpZXM6ICQobXlfYmFkX2xkbGlicykpCiBlbmRpZgotZW5kaWYKIAogIyBteV9jeHhfbGRsaWJzIG1heSBjb250YWluIGxpbmtlciBmbGFncyBuZWVkIHRvIHdyYXAgY2VydGFpbiBsaWJyYXJpZXMKICMgKHN0YXJ0LWdyb3VwL2VuZC1ncm91cCksIHNvIGFwcGVuZCBhZnRlciB0aGUgY2hlY2sgYWJvdmUuCkBAIC0xNzU4LDExICsxNzg2LDYgQEAKICAgICAkKGJ1aWx0X3N0YXRpY19saWJyYXJpZXMpIFwKICAgICAkKGJ1aWx0X3dob2xlX2xpYnJhcmllcykKIAotIyBBbHNvIGRlcGVuZCBvbiB0aGUgbm90aWNlIGZpbGVzIGZvciBhbnkgc3RhdGljIGxpYnJhcmllcyB0aGF0Ci0jIGFyZSBsaW5rZWQgaW50byB0aGlzIG1vZHVsZS4gIFRoaXMgd2lsbCBmb3JjZSB0aGVtIHRvIGJlIGluc3RhbGxlZAotIyB3aGVuIHRoaXMgbW9kdWxlIGlzLgotJChMT0NBTF9JTlNUQUxMRURfTU9EVUxFKTogfCAkKGluc3RhbGxlZF9zdGF0aWNfbGlicmFyeV9ub3RpY2VfZmlsZV90YXJnZXRzKQotCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIyBFeHBvcnQgaW5jbHVkZXMKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCkBAIC0xODMyLDYgKzE4NTUsNyBAQAogICAgICAgICAkKG15X3dob2xlX3N0YXRpY19saWJyYXJpZXMpIFwKICAgICAgICAgJChteV9zaGFyZWRfbGlicmFyaWVzKSBcCiAgICAgICAgICQobXlfc3lzdGVtX3NoYXJlZF9saWJyYXJpZXMpKQorU09PTkdfQ09OVi4kKExPQ0FMX01PRFVMRSkuVFlQRSA6PSBuYXRpdmUKIFNPT05HX0NPTlYgOj0gJChTT09OR19DT05WKSAkKExPQ0FMX01PRFVMRSkKIGVuZGlmCiAKZGlmZiAtLWdpdCBhL2NvcmUvYnVpbGQtc3lzdGVtLmh0bWwgYi9jb3JlL2J1aWxkLXN5c3RlbS5odG1sCmluZGV4IGM3OTM4Y2MuLjNkODZlMjQgMTAwNjQ0Ci0tLSBhL2NvcmUvYnVpbGQtc3lzdGVtLmh0bWwKKysrIGIvY29yZS9idWlsZC1zeXN0ZW0uaHRtbApAQCAtNzYyLDYgKzc2MiwxOSBAQAogRGlhbGVyLCBDb250YWN0cywgZXRjLiAgVGhpcyB3aWxsIHByb2JhYmx5IGNoYW5nZSBvciBnbyBhd2F5IHdoZW4gd2Ugc3dpdGNoCiB0byBhbiBhbnQtYmFzZWQgYnVpbGQgc3lzdGVtIGZvciB0aGUgYXBwcy48L3A+CiAKKzxoND5MT0NBTF9QQVRDSF9NT0RVTEUgKGV4cGVyaW1lbnRhbCBvcHRpb24pPC9oND4KKzxwPkFzIG9mIEphbnVhcnkgMjAxOCwgeW91IGFsbW9zdCBjZXJ0YWlubHkgZG9uJ3QgbmVlZCB0aGlzIG9wdGlvbiwgc28gcGxlYXNlCithc2sgYW5kIG9ubHkgdXNlIGl0IGlmIHlvdSB1bmRlcnN0YW5kIHdoYXQgeW91J3JlIGRvaW5nLiBUaGlzIGZlYXR1cmUgaXMKK2V4cGVyaW1lbnRhbCBhbmQgbWF5IGdvIGF3YXkgaW4gZnV0dXJlLjwvcD4KKzxwPgorV2hlbiBjb21waWxpbmcgbGFuZ3VhZ2UgbGV2ZWwgOSsgLmphdmEgY29kZSBpbiBwYWNrYWdlcyB0aGF0IGFyZSBwYXJ0IG9mIGEKK2Egc3lzdGVtIG1vZHVsZSwgPGNvZGU+TE9DQUxfUEFUQ0hfTU9EVUxFPC9jb2RlPiBuYW1lcyB0aGUgbW9kdWxlIHRoYXQgeW91cgorc291cmNlcyBhbmQgZGVwZW5kZW5jaWVzIHNob3VsZCBiZSBwYXRjaGVkIGludG8uIFRoZSBBbmRyb2lkIHJ1bnRpbWUgY3VycmVudGx5CisoSmFuIDIwMTgpIGRvZXNuJ3QgaW1wbGVtZW50IHRoZSBKRVAgMjYxIG1vZHVsZSBzeXN0ZW0gc28gdGhpcyBvcHRpb24gaXMgb25seQorc3VwcG9ydGVkIGF0IGNvbXBpbGUgdGltZS4gSXQgc2hvdWxkIG9ubHkgYmUgbmVlZGVkIHRvIGNvbXBpbGUgdGVzdHMgaW4gcGFja2FnZXMKK3RoYXQgZXhpc3QgaW4gbGliY29yZSBhbmQgd2hpY2ggYXJlIGluY29udmVuaWVudCB0byBtb3ZlIGVsc2V3aGVyZS4KKzwvcD4KKwogPGg0PkxPQ0FMX1BBVEg8L2g0PgogPHA+VGhlIGRpcmVjdG9yeSB5b3VyIEFuZHJvaWQubWsgZmlsZSBpcyBpbi4gWW91IGNhbiBzZXQgaXQgYnkgcHV0dGluZyB0aGUKIGZvbGxvd2luZyBhcyB0aGUgZmlyc3QgbGluZSBpbiB5b3VyIEFuZHJvaWQubWs6PC9wPgpkaWZmIC0tZ2l0IGEvY29yZS9idWlsZF9pZC5tayBiL2NvcmUvYnVpbGRfaWQubWsKaW5kZXggZmY0ZDAxMy4uOTMyZTIxNCAxMDA2NDQKLS0tIGEvY29yZS9idWlsZF9pZC5taworKysgYi9jb3JlL2J1aWxkX2lkLm1rCkBAIC0xOCw0ICsxOCw0IEBACiAjIChsaWtlICJDUkIwMSIpLiAgSXQgbXVzdCBiZSBhIHNpbmdsZSB3b3JkLCBhbmQgaXMKICMgY2FwaXRhbGl6ZWQgYnkgY29udmVudGlvbi4KIAotZXhwb3J0IEJVSUxEX0lEPU9DLU1SMQorZXhwb3J0IEJVSUxEX0lEPVBJCmRpZmYgLS1naXQgYS9jb3JlL2NsYW5nL0hPU1RfQ1JPU1NfeDg2Lm1rIGIvY29yZS9jbGFuZy9IT1NUX0NST1NTX3g4Ni5tawppbmRleCBiZjQ4Zjk1Li5mZmQ3ODExIDEwMDY0NAotLS0gYS9jb3JlL2NsYW5nL0hPU1RfQ1JPU1NfeDg2Lm1rCisrKyBiL2NvcmUvY2xhbmcvSE9TVF9DUk9TU194ODYubWsKQEAgLTEgKzEgQEAKLSQoY2xhbmdfMm5kX2FyY2hfcHJlZml4KUhPU1RfQ1JPU1NfTElCUFJPRklMRV9SVCA6PSAkKExMVk1fUlRMSUJfUEFUSCkvbGliY2xhbmdfcnQucHJvZmlsZS1pNjg2LmEKKyQoY2xhbmdfMm5kX2FyY2hfcHJlZml4KUhPU1RfQ1JPU1NfTElCUFJPRklMRV9SVCA6PSAkKExMVk1fUlRMSUJfUEFUSCkvbGliY2xhbmdfcnQucHJvZmlsZS1pMzg2LmEKZGlmZiAtLWdpdCBhL2NvcmUvY2xhbmcvSE9TVF94ODYubWsgYi9jb3JlL2NsYW5nL0hPU1RfeDg2Lm1rCmluZGV4IDA3MjJiMmEuLjI4MDM1MTcgMTAwNjQ0Ci0tLSBhL2NvcmUvY2xhbmcvSE9TVF94ODYubWsKKysrIGIvY29yZS9jbGFuZy9IT1NUX3g4Ni5tawpAQCAtMSArMSBAQAotJChjbGFuZ18ybmRfYXJjaF9wcmVmaXgpSE9TVF9MSUJQUk9GSUxFX1JUIDo9ICQoTExWTV9SVExJQl9QQVRIKS9saWJjbGFuZ19ydC5wcm9maWxlLWk2ODYuYQorJChjbGFuZ18ybmRfYXJjaF9wcmVmaXgpSE9TVF9MSUJQUk9GSUxFX1JUIDo9ICQoTExWTV9SVExJQl9QQVRIKS9saWJjbGFuZ19ydC5wcm9maWxlLWkzODYuYQpkaWZmIC0tZ2l0IGEvY29yZS9jbGFuZy9jb25maWcubWsgYi9jb3JlL2NsYW5nL2NvbmZpZy5tawppbmRleCAwZTU5OTMwLi40MDhmNjg4IDEwMDY0NAotLS0gYS9jb3JlL2NsYW5nL2NvbmZpZy5taworKysgYi9jb3JlL2NsYW5nL2NvbmZpZy5tawpAQCAtNzIsNiArNzIsNyBAQAogIyBJTlRFUk5BTF9MT0NBTF9DTEFOR19FWENFUFRJT05fUFJPSkVDVFMgaXMgZGVmaW5lZCBsYXRlciBpbiBvdGhlciBjb25maWcubWsuCiBMT0NBTF9DTEFOR19FWENFUFRJT05fUFJPSkVDVFMgPSBcCiAgIGJpb25pYy90ZXN0cy8gXAorICBkZXZpY2UvZ29vZ2xlL2NvbnRleHRodWIvIFwKICAgZGV2aWNlL2h1YXdlaS9hbmdsZXIvIFwKICAgZGV2aWNlL2xnZS9idWxsaGVhZC8gXAogICBleHRlcm5hbC9nZW50b28vaW50ZWdyYXRpb24vIFwKZGlmZiAtLWdpdCBhL2NvcmUvY2xhbmcvdmVyc2lvbnMubWsgYi9jb3JlL2NsYW5nL3ZlcnNpb25zLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjQ3M2NkLi4wMDAwMDAwCi0tLSBhL2NvcmUvY2xhbmcvdmVyc2lvbnMubWsKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSMjIENsYW5nL0xMVk0gcmVsZWFzZSB2ZXJzaW9ucy4KLQotTExWTV9QUkVCVUlMVFNfVkVSU0lPTiA/PSBjbGFuZy00MDUzNTg2Ci1MTFZNX1BSRUJVSUxUU19CQVNFID89IHByZWJ1aWx0cy9jbGFuZy9ob3N0CmRpZmYgLS1naXQgYS9jb3JlL2NsZWFuYnVpbGQubWsgYi9jb3JlL2NsZWFuYnVpbGQubWsKaW5kZXggMGUxYzg4ZC4uNTU3Njc4NSAxMDA2NDQKLS0tIGEvY29yZS9jbGVhbmJ1aWxkLm1rCisrKyBiL2NvcmUvY2xlYW5idWlsZC5tawpAQCAtMTMsOCArMTMsMzIgQEAKICMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLSMgRG9uJ3QgYm90aGVyIHdpdGggdGhlIGNsZWFuc3BlY3MgaWYgeW91IGFyZSBydW5uaW5nIG1tL21tbQotaWZlcSAoJChPTkVfU0hPVF9NQUtFRklMRSkkKGRvbnRfYm90aGVyKSQoTk9fQU5EUk9JRF9DTEVBTlNQRUMpLCkKKyMgQWJzb2x1dGUgcGF0aCBvZiB0aGUgcHJlc2VudCB3b3JraW5nIGRpcmVjb3RyeS4KKyMgVGhpcyBvdmVycmlkZXMgdGhlIHNoZWxsIHZhcmlhYmxlICRQV0QsIHdoaWNoIGRvZXMgbm90IG5lY2Vzc2FyaWx5IHBvaW50cyB0bworIyB0aGUgdG9wIG9mIHRoZSBzb3VyY2UgdHJlZSwgZm9yIGV4YW1wbGUgd2hlbiAibWFrZSAtQyIgaXMgdXNlZCBpbiBtL21tL21tbS4KK1BXRCA6PSAkKHNoZWxsIHB3ZCkKKworVE9QIDo9IC4KK1RPUERJUiA6PQorCitCVUlMRF9TWVNURU0gOj0gJChUT1BESVIpYnVpbGQvbWFrZS9jb3JlCisKKyMgU2V0IHVwIHZhcmlvdXMgc3RhbmRhcmQgdmFyaWFibGVzIGJhc2VkIG9uIGNvbmZpZ3VyYXRpb24KKyMgYW5kIGhvc3QgaW5mb3JtYXRpb24uCitpbmNsdWRlICQoQlVJTERfU1lTVEVNKS9jb25maWcubWsKKworaW5jbHVkZSAkKFNPT05HX01BS0VWQVJTX01LKQorCitpbmNsdWRlICQoQlVJTERfU1lTVEVNKS9jbGFuZy9jb25maWcubWsKKworIyBDVFMtc3BlY2lmaWMgY29uZmlnLgorLWluY2x1ZGUgY3RzL2J1aWxkL2NvbmZpZy5taworIyBWVFMtc3BlY2lmaWMgY29uZmlnLgorLWluY2x1ZGUgdGVzdC92dHMvdG9vbHMvdnRzLXRyYWRlZmVkL2J1aWxkL2NvbmZpZy5taworIyBkZXZpY2UtdGVzdHMtc3BlY2lmaWMtY29uZmlnLgorLWluY2x1ZGUgdG9vbHMvdHJhZGVmZWRlcmF0aW9uL2J1aWxkL3N1aXRlcy9kZXZpY2UtdGVzdHMvY29uZmlnLm1rCisjIGdlbmVyYWwtdGVzdHMtc3BlY2lmaWMtY29uZmlnLgorLWluY2x1ZGUgdG9vbHMvdHJhZGVmZWRlcmF0aW9uL2J1aWxkL3N1aXRlcy9nZW5lcmFsLXRlc3RzL2NvbmZpZy5tawogCiBJTlRFUk5BTF9DTEVBTl9TVEVQUyA6PQogCkBAIC0yNCw3ICs0OCw3IEBACiAjCiAjICQoMSk6IHNoZWxsIGNvbW1hbmQgdG8gcnVuCiAjICQoMik6IGluZGljYXRlIHRvIG5vdCB1c2UgbWFrZWZpbGUgcGF0aCBhcyBwYXJ0IG9mIHN0ZXAgaWQgaWYgbm90IGVtcHR5LgotIyAgICAgICAkKDIpIHNob3VsZCBvbmx5IGJlIHVzZWQgaW4gYnVpbGQvY29yZS9jbGVhbnNwZWMubWs6IGp1c3QgZm9yIGNvbXBhdGliaWxpdHkuCisjICAgICAgICQoMikgc2hvdWxkIG9ubHkgYmUgdXNlZCBpbiBidWlsZC9tYWtlL2NvcmUvY2xlYW5zcGVjLm1rOiBqdXN0IGZvciBjb21wYXRpYmlsaXR5LgogZGVmaW5lIF9hZGQtY2xlYW4tc3RlcAogICAkKGlmICQoc3RyaXAgJChJTlRFUk5BTF9DTEVBTl9CVUlMRF9WRVJTSU9OKSksLCBcCiAgICAgICAkKGVycm9yIElOVEVSTkFMX0NMRUFOX0JVSUxEX1ZFUlNJT04gbm90IHNldCkpCkBAIC00Myw3ICs2Nyw3IEBACiAgICQoZXZhbCBfYWNzX21ha2VmaWxlX3ByZWZpeCA6PSkKIGVuZGVmCiBkZWZpbmUgYWRkLWNsZWFuLXN0ZXAKLSQoZXZhbCAjIGZvciBidWlsZC9jb3JlL2NsZWFuc3BlYy5taywgZG9udCB1c2UgbWFrZWZpbGUgcGF0aCBhcyBwYXJ0IG9mIHN0ZXAgaWQpIFwKKyQoZXZhbCAjIGZvciBidWlsZC9tYWtlL2NvcmUvY2xlYW5zcGVjLm1rLCBkb250IHVzZSBtYWtlZmlsZSBwYXRoIGFzIHBhcnQgb2Ygc3RlcCBpZCkgXAogJChpZiAkKGZpbHRlciAlL2NsZWFuc3BlYy5taywkKGxhc3R3b3JkICQoTUFLRUZJTEVfTElTVCkpKSxcCiAgICAgJChldmFsICQoY2FsbCBfYWRkLWNsZWFuLXN0ZXAsJCgxKSx0cnVlKSksXAogICAgICQoZXZhbCAkKGNhbGwgX2FkZC1jbGVhbi1zdGVwLCQoMSkpKSkKQEAgLTU4LDcgKzgyLDcgQEAKIAogIyBJZiB0aGUgY2xlYW5fc3RlcHMubWsgZmlsZSBpcyBtaXNzaW5nICh1c3VhbGx5IGFmdGVyIGEgY2xlYW4gYnVpbGQpCiAjIHRoZW4gd2Ugd29uJ3QgZG8gYW55dGhpbmcuCi1DVVJSRU5UX0NMRUFOX0JVSUxEX1ZFUlNJT04gOj0gJChJTlRFUk5BTF9DTEVBTl9CVUlMRF9WRVJTSU9OKQorQ1VSUkVOVF9DTEVBTl9CVUlMRF9WRVJTSU9OIDo9IE1JU1NJTkcKIENVUlJFTlRfQ0xFQU5fU1RFUFMgOj0gJChJTlRFUk5BTF9DTEVBTl9TVEVQUykKIAogIyBSZWFkIHRoZSBjdXJyZW50IHN0YXRlIGZyb20gdGhlIGZpbGUsIGlmIHByZXNlbnQuCkBAIC02Nyw3ICs5MSw5IEBACiBjbGVhbl9zdGVwc19maWxlIDo9ICQoUFJPRFVDVF9PVVQpL2NsZWFuX3N0ZXBzLm1rCiAtaW5jbHVkZSAkKGNsZWFuX3N0ZXBzX2ZpbGUpCiAKLWlmbmVxICgkKENVUlJFTlRfQ0xFQU5fQlVJTERfVkVSU0lPTiksJChJTlRFUk5BTF9DTEVBTl9CVUlMRF9WRVJTSU9OKSkKK2lmZXEgKCQoQ1VSUkVOVF9DTEVBTl9CVUlMRF9WRVJTSU9OKSxNSVNTSU5HKQorICAjIERvIG5vdGhpbmcKK2Vsc2UgaWZuZXEgKCQoQ1VSUkVOVF9DTEVBTl9CVUlMRF9WRVJTSU9OKSwkKElOVEVSTkFMX0NMRUFOX0JVSUxEX1ZFUlNJT04pKQogICAjIFRoZSBtYWpvciBjbGVhbiB2ZXJzaW9uIGlzIG91dC1vZi1kYXRlLiAgRG8gYSBmdWxsIGNsZWFuLCBhbmQKICAgIyBkb24ndCBldmVuIGJvdGhlciB3aXRoIHRoZSBjbGVhbiBzdGVwcy4KICAgJChpbmZvICoqKiBBIGNsZWFuIGJ1aWxkIGlzIHJlcXVpcmVkIGJlY2F1c2Ugb2YgYSByZWNlbnQgY2hhbmdlLikKQEAgLTEwOSw1NyArMTM1LDE4IEBACiAKICMgV3JpdGUgdGhlIG5ldyBzdGF0ZSB0byB0aGUgZmlsZS4KICMKLXJld3JpdGVfY2xlYW5fc3RlcHNfZmlsZSA6PQogaWZuZXEgKCQoQ1VSUkVOVF9DTEVBTl9CVUlMRF9WRVJTSU9OKS0kKENVUlJFTlRfQ0xFQU5fU1RFUFMpLCQoSU5URVJOQUxfQ0xFQU5fQlVJTERfVkVSU0lPTiktJChJTlRFUk5BTF9DTEVBTl9TVEVQUykpCi1yZXdyaXRlX2NsZWFuX3N0ZXBzX2ZpbGUgOj0gdHJ1ZQotZW5kaWYKLWlmZXEgKCQod2lsZGNhcmQgJChjbGVhbl9zdGVwc19maWxlKSksKQotIyBUaGlzIGlzIHRoZSBmaXJzdCBidWlsZC4KLXJld3JpdGVfY2xlYW5fc3RlcHNfZmlsZSA6PSB0cnVlCi1lbmRpZgotaWZlcSAoJChyZXdyaXRlX2NsZWFuX3N0ZXBzX2ZpbGUpLHRydWUpCi0kKHNoZWxsIFwKLSAgbWtkaXIgLXAgJChkaXIgJChjbGVhbl9zdGVwc19maWxlKSkgJiYgXAotICBlY2hvICJDVVJSRU5UX0NMRUFOX0JVSUxEX1ZFUlNJT04gOj0gJChJTlRFUk5BTF9DTEVBTl9CVUlMRF9WRVJTSU9OKSIgPiBcCi0gICAgICAkKGNsZWFuX3N0ZXBzX2ZpbGUpIDtcCi0gIGVjaG8gIkNVUlJFTlRfQ0xFQU5fU1RFUFMgOj0gJCh3b3JkbGlzdCAxLDUwMCwkKElOVEVSTkFMX0NMRUFOX1NURVBTKSkiID4+ICQoY2xlYW5fc3RlcHNfZmlsZSkgXAotICkKLWRlZmluZSAtY3Mtd3JpdGUtY2xlYW4tc3RlcHMtaWYtYXJnMS1ub3QtZW1wdHkKLSQoaWYgJCgxKSwkKHNoZWxsIGVjaG8gIkNVUlJFTlRfQ0xFQU5fU1RFUFMgKz0gJCgxKSIgPj4gJChjbGVhbl9zdGVwc19maWxlKSkpCi1lbmRlZgotJChjYWxsIC1jcy13cml0ZS1jbGVhbi1zdGVwcy1pZi1hcmcxLW5vdC1lbXB0eSwkKHdvcmRsaXN0IDUwMSwxMDAwLCQoSU5URVJOQUxfQ0xFQU5fU1RFUFMpKSkKLSQoY2FsbCAtY3Mtd3JpdGUtY2xlYW4tc3RlcHMtaWYtYXJnMS1ub3QtZW1wdHksJCh3b3JkbGlzdCAxMDAxLDE1MDAsJChJTlRFUk5BTF9DTEVBTl9TVEVQUykpKQotJChjYWxsIC1jcy13cml0ZS1jbGVhbi1zdGVwcy1pZi1hcmcxLW5vdC1lbXB0eSwkKHdvcmRsaXN0IDE1MDEsMjAwMCwkKElOVEVSTkFMX0NMRUFOX1NURVBTKSkpCi0kKGNhbGwgLWNzLXdyaXRlLWNsZWFuLXN0ZXBzLWlmLWFyZzEtbm90LWVtcHR5LCQod29yZGxpc3QgMjAwMSwyNTAwLCQoSU5URVJOQUxfQ0xFQU5fU1RFUFMpKSkKLSQoY2FsbCAtY3Mtd3JpdGUtY2xlYW4tc3RlcHMtaWYtYXJnMS1ub3QtZW1wdHksJCh3b3JkbGlzdCAyNTAxLDMwMDAsJChJTlRFUk5BTF9DTEVBTl9TVEVQUykpKQotJChjYWxsIC1jcy13cml0ZS1jbGVhbi1zdGVwcy1pZi1hcmcxLW5vdC1lbXB0eSwkKHdvcmRsaXN0IDMwMDEsOTk5OTksJChJTlRFUk5BTF9DTEVBTl9TVEVQUykpKQorJChzaGVsbCBta2RpciAtcCAkKGRpciAkKGNsZWFuX3N0ZXBzX2ZpbGUpKSkKKyQoZmlsZSA+JChjbGVhbl9zdGVwc19maWxlKS50bXAsQ1VSUkVOVF9DTEVBTl9CVUlMRF9WRVJTSU9OIDo9ICQoSU5URVJOQUxfQ0xFQU5fQlVJTERfVkVSU0lPTikkKG5ld2xpbmUpQ1VSUkVOVF9DTEVBTl9TVEVQUyA6PSAkKElOVEVSTkFMX0NMRUFOX1NURVBTKSQobmV3bGluZSkpCiskKHNoZWxsIGlmICEgY21wIC1zICQoY2xlYW5fc3RlcHNfZmlsZSkudG1wICQoY2xlYW5fc3RlcHNfZmlsZSk7IHRoZW4gXAorICAgICAgICAgIG12ICQoY2xlYW5fc3RlcHNfZmlsZSkudG1wICQoY2xlYW5fc3RlcHNfZmlsZSk7IFwKKyAgICAgICAgZWxzZSBcCisgICAgICAgICAgcm0gJChjbGVhbl9zdGVwc19maWxlKS50bXA7IFwKKyAgICAgICAgZmkpCiBlbmRpZgogCiBDVVJSRU5UX0NMRUFOX0JVSUxEX1ZFUlNJT04gOj0KIENVUlJFTlRfQ0xFQU5fU1RFUFMgOj0KIGNsZWFuX3N0ZXBzX2ZpbGUgOj0KLXJld3JpdGVfY2xlYW5fc3RlcHNfZmlsZSA6PQogSU5URVJOQUxfQ0xFQU5fU1RFUFMgOj0KIElOVEVSTkFMX0NMRUFOX0JVSUxEX1ZFUlNJT04gOj0KLQotZW5kaWYgICMgaWYgbm90IE9ORV9TSE9UX01BS0VGSUxFIGRvbnRfYm90aGVyIE5PX0FORFJPSURfQ0xFQU5TUEVDCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLS5QSE9OWTogY2xlYW4tamFjay1maWxlcwotY2xlYW4tamFjay1maWxlczogY2xlYW4tZGV4LWZpbGVzCi0JJChoaWRlKSBmaW5kICQoT1VUX0RJUikgLW5hbWUgIiouamFjayIgfCB4YXJncyBybSAtZgotCSQoaGlkZSkgZmluZCAkKE9VVF9ESVIpIC10eXBlIGQgLW5hbWUgImphY2siIHwgeGFyZ3Mgcm0gLXJmCi0JQGVjaG8gIkFsbCBqYWNrIGZpbGVzIGhhdmUgYmVlbiByZW1vdmVkLiIKLQotLlBIT05ZOiBjbGVhbi1kZXgtZmlsZXMKLWNsZWFuLWRleC1maWxlczoKLQkkKGhpZGUpIGZpbmQgJChPVVRfRElSKSAtbmFtZSAiKi5kZXgiICEgLXBhdGggIiovamFjay1pbmNyZW1lbnRhbC8qIiB8IHhhcmdzIHJtIC1mCi0JJChoaWRlKSBmb3IgaSBpbiBgZmluZCAkKE9VVF9ESVIpIC1uYW1lICIqLmphciIgLW8gLW5hbWUgIiouYXBrImAgOyBkbyAoKHVuemlwIC1sICQkaSAyPiAvZGV2L251bGwgfCBcCi0JCQkJZ3JlcCAtcSAiXC5kZXgkJCIgJiYgcm0gLWYgJCRpKSB8fCBjb250aW51ZSApIDsgZG9uZQotCUBlY2hvICJBbGwgZGV4IGZpbGVzIGFuZCBhcmNoaXZlcyBjb250YWluaW5nIGRleCBmaWxlcyBoYXZlIGJlZW4gcmVtb3ZlZC4iCi0KLS5QSE9OWTogY2xlYW4tamFjay1pbmNyZW1lbnRhbAotY2xlYW4tamFjay1pbmNyZW1lbnRhbDoKLQkkKGhpZGUpIGZpbmQgJChPVVRfRElSKSAtbmFtZSAiamFjay1pbmNyZW1lbnRhbCIgLXR5cGUgZCB8IHhhcmdzIHJtIC1yZgotCUBlY2hvICJBbGwgamFjayBpbmNyZW1lbnRhbCBkaXJzIGhhdmUgYmVlbiByZW1vdmVkLiIKZGlmZiAtLWdpdCBhL2NvcmUvY2xlYW5zcGVjLm1rIGIvY29yZS9jbGVhbnNwZWMubWsKaW5kZXggNDQ0MWUyYS4uYWYyODk1NCAxMDA2NDQKLS0tIGEvY29yZS9jbGVhbnNwZWMubWsKKysrIGIvY29yZS9jbGVhbnNwZWMubWsKQEAgLTY0LDYgKzY0LDYgQEAKICMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKIHN1YmRpcl9jbGVhbnNwZWNzIDo9IFwKLSAgICAkKHNoZWxsIGJ1aWxkL3Rvb2xzL2ZpbmRsZWF2ZXMucHkgJChGSU5EX0xFQVZFU19FWENMVURFUykgLiBDbGVhblNwZWMubWspCisgICAgJChmaWxlIDwkKE9VVF9ESVIpLy5tb2R1bGVfcGF0aHMvQ2xlYW5TcGVjLm1rLmxpc3QpCiBpbmNsdWRlICQoc3ViZGlyX2NsZWFuc3BlY3MpCiBzdWJkaXJfY2xlYW5zcGVjcyA6PQpkaWZmIC0tZ2l0IGEvY29yZS9jbGVhcl92YXJzLm1rIGIvY29yZS9jbGVhcl92YXJzLm1rCmluZGV4IGE2ODc4NjYuLmJkODZjZmIgMTAwNjQ0Ci0tLSBhL2NvcmUvY2xlYXJfdmFycy5taworKysgYi9jb3JlL2NsZWFyX3ZhcnMubWsKQEAgLTQsOCArNCwxMCBAQAogCiAjICcnLHRydWUKIExPQ0FMXzMyX0JJVF9PTkxZOj0KK0xPQ0FMX0FBUFQyX09OTFk6PQogTE9DQUxfQUFQVF9GTEFHUzo9CiBMT0NBTF9BQVBUX0lOQ0xVREVfQUxMX1JFU09VUkNFUzo9CitMT0NBTF9BQVBUX05BTUVTUEFDRVM6PQogTE9DQUxfQURESVRJT05BTF9DRVJUSUZJQ0FURVM6PQogTE9DQUxfQURESVRJT05BTF9ERVBFTkRFTkNJRVM6PQogTE9DQUxfQURESVRJT05BTF9IVE1MX0RJUjo9CkBAIC0xNCw2ICsxNiw4IEBACiBMT0NBTF9BTExPV19VTkRFRklORURfU1lNQk9MUzo9CiBMT0NBTF9BTk5PVEFUSU9OX1BST0NFU1NPUlM6PQogTE9DQUxfQU5OT1RBVElPTl9QUk9DRVNTT1JfQ0xBU1NFUzo9CitMT0NBTF9BUElESUZGX05FV0FQSTo9CitMT0NBTF9BUElESUZGX09MREFQSTo9CiBMT0NBTF9BUEtfTElCUkFSSUVTOj0KIExPQ0FMX0FSTV9NT0RFOj0KIExPQ0FMX0FTRkxBR1M6PQpAQCAtNTQsNiArNTgsOCBAQAogTE9DQUxfREVYX1BSRU9QVF9JTUFHRV9MT0NBVElPTjo9CiBMT0NBTF9ERVhfUFJFT1BUX1BST0ZJTEVfQ0xBU1NfTElTVElORzo9CiBMT0NBTF9ERVhfUFJFT1BUOj0gIyAnJyx0cnVlLGZhbHNlLG5vc3RyaXBwaW5nCitMT0NBTF9ESVNBQkxFX0FVVE9fR0VORVJBVEVfVEVTVF9DT05GSUc6PQorTE9DQUxfRElTQUJMRV9SRVNPTFZFX1NVUFBPUlRfTElCUkFSSUVTOj0KIExPQ0FMX0RPTlRfQ0hFQ0tfTU9EVUxFOj0KICMgRG9uJ3QgZGVsZXRlIHRoZSBNRVRBX0lORiBkaXIgd2hlbiBtZXJnaW5nIHN0YXRpYyBKYXZhIGxpYnJhcmllcy4KIExPQ0FMX0RPTlRfREVMRVRFX0pBUl9NRVRBX0lORjo9CkBAIC02OCwxNSArNzQsMjIgQEAKIExPQ0FMX0RST0lERE9DX1NUVUJfT1VUX0RJUjo9CiBMT0NBTF9EUk9JRERPQ19URU1QTEFURV9ESVI6PQogTE9DQUxfRFJPSURET0NfVVNFX1NUQU5EQVJEX0RPQ0xFVDo9CitMT0NBTF9EUk9JRERPQ19VU0VfTUVUQUxBVkE6PQorTE9DQUxfRFJPSURET0NfTUVUQUxBVkFfUFJFVklPVVNfQVBJOj0KK0xPQ0FMX0RST0lERE9DX01FVEFMQVZBX0FOTk9UQVRJT05TX0VOQUJMRUQ6PQorTE9DQUxfRFJPSURET0NfTUVUQUxBVkFfTUVSR0VfQU5OT1RBVElPTlNfRElSOj0KK0xPQ0FMX0RST0lERE9DX01FVEFMQVZBX0RPQ1NfU1RVQl9PVVRfRElSOj0KIExPQ0FMX0RYX0ZMQUdTOj0KIExPQ0FMX0VNTUFfQ09WRVJBR0VfRklMVEVSOj0KIExPQ0FMX0VNTUFfSU5TVFJVTUVOVDo9CitMT0NBTF9FTkZPUkNFX1VTRVNfTElCUkFSSUVTOj0KIExPQ0FMX0VSUk9SX1BST05FX0ZMQUdTOj0KIExPQ0FMX0VYUE9SVF9DRkxBR1M6PQogTE9DQUxfRVhQT1JUX0NfSU5DTFVERV9ERVBTOj0KIExPQ0FMX0VYUE9SVF9DX0lOQ0xVREVfRElSUzo9CiBMT0NBTF9FWFBPUlRfSEVBREVSX0xJQlJBUllfSEVBREVSUzo9CiBMT0NBTF9FWFBPUlRfUEFDS0FHRV9SRVNPVVJDRVM6PQorTE9DQUxfRVhQT1JUX1BST0dVQVJEX0ZMQUdfRklMRVM6PQogTE9DQUxfRVhQT1JUX1NIQVJFRF9MSUJSQVJZX0hFQURFUlM6PQogTE9DQUxfRVhQT1JUX1NUQVRJQ19MSUJSQVJZX0hFQURFUlM6PQogTE9DQUxfRVhUUkFDVF9BUEs6PQpAQCAtODgsNiArMTAxLDcgQEAKIExPQ0FMX0ZVTExfTUFOSUZFU1RfRklMRTo9CiBMT0NBTF9GVUxMX0NMQVNTRVNfSkFDT0NPX0pBUjo9CiBMT0NBTF9GVUxMX0NMQVNTRVNfUFJFX0pBQ09DT19KQVI6PQorTE9DQUxfRlVaWl9FTkdJTkU6PQogTE9DQUxfR0NOT19GSUxFUzo9CiBMT0NBTF9HRU5FUkFURURfU09VUkNFUzo9CiAjIEdyb3VwIHN0YXRpYyBsaWJyYXJpZXMgd2l0aCAiLVdsLC0tc3RhcnQtZ3JvdXAiIGFuZCAiLVdsLC0tZW5kLWdyb3VwIiB3aGVuIGxpbmtpbmcuCkBAIC05NSw2ICsxMDksNyBAQAogTE9DQUxfR1RFU1Q6PXRydWUKIExPQ0FMX0hBTF9TVEFUSUNfTElCUkFSSUVTOj0KIExPQ0FMX0hFQURFUl9MSUJSQVJJRVM6PQorTE9DQUxfSE9TVF9SRVFVSVJFRF9NT0RVTEVTOj0KIExPQ0FMX0lOSVRfUkM6PQogTE9DQUxfSU5TVEFMTEVEX01PRFVMRTo9CiBMT0NBTF9JTlNUQUxMRURfTU9EVUxFX1NURU06PQpAQCAtMTI2LDYgKzE0MSw3IEBACiBMT0NBTF9KQVZBX0xJQlJBUklFUzo9CiBMT0NBTF9KQVZBX1JFU09VUkNFX0RJUlM6PQogTE9DQUxfSkFWQV9SRVNPVVJDRV9GSUxFUzo9CitMT0NBTF9KRVRJRklFUl9FTkFCTEVEOj0KIExPQ0FMX0pOSV9TSEFSRURfTElCUkFSSUVTOj0KIExPQ0FMX0pOSV9TSEFSRURfTElCUkFSSUVTX0FCSTo9CiBMT0NBTF9MREZMQUdTOj0KQEAgLTE3MywxMSArMTg5LDEzIEBACiBMT0NBTF9OT1RJQ0VfRklMRTo9CiBMT0NBTF9PRE1fTU9EVUxFOj0KIExPQ0FMX09FTV9NT0RVTEU6PQorTE9DQUxfT1BUSU9OQUxfVVNFU19MSUJSQVJJRVM6PQogTE9DQUxfT1ZFUlJJREVTX1BBQ0tBR0VTOj0KIExPQ0FMX09WRVJSSURFU19NT0RVTEVTOj0KIExPQ0FMX1BBQ0tBR0VfTkFNRTo9CiBMT0NBTF9QQUNLQUdFX1NQTElUUzo9CiBMT0NBTF9QQUNLX01PRFVMRV9SRUxPQ0FUSU9OUzo9CitMT0NBTF9QQVRDSF9NT0RVTEU6PQogTE9DQUxfUElDS1VQX0ZJTEVTOj0KIExPQ0FMX1BPU1RfSU5TVEFMTF9DTUQ6PQogTE9DQUxfUE9TVF9MSU5LX0NNRDo9CkBAIC0xOTAsOCArMjA4LDEwIEBACiBMT0NBTF9QUkVCVUlMVF9PQkpfRklMRVM6PQogTE9DQUxfUFJFQlVJTFRfU1RBVElDX0pBVkFfTElCUkFSSUVTOj0KIExPQ0FMX1BSRUJVSUxUX1NUUklQX0NPTU1FTlRTOj0KK0xPQ0FMX1BSSVZBVEVfUExBVEZPUk1fQVBJUzo9CiBMT0NBTF9QUklWSUxFR0VEX01PRFVMRTo9Ci0jICcnLGZ1bGwsY3VzdG9tLG5vc3lzdGVtLGRpc2FibGVkLG9iZnVzY2F0aW9uLG9wdGltaXphdGlvbgorIyAnJyxmdWxsLGN1c3RvbSxkaXNhYmxlZCxvYmZ1c2NhdGlvbixvcHRpbWl6YXRpb24KK0xPQ0FMX1BST0RVQ1RfTU9EVUxFOj0KIExPQ0FMX1BST0dVQVJEX0VOQUJMRUQ6PQogTE9DQUxfUFJPR1VBUkRfRkxBR19GSUxFUzo9CiBMT0NBTF9QUk9HVUFSRF9GTEFHUzo9CkBAIC0yMDAsNiArMjIwLDcgQEAKICMgbGl0ZShkZWZhdWx0KSxtaWNybyxuYW5vLHN0cmVhbSxmdWxsLG5hbm9wYi1jLG5hbm9wYi1jLWVuYWJsZV9tYWxsb2MKIExPQ0FMX1BST1RPQ19PUFRJTUlaRV9UWVBFOj0KIExPQ0FMX1BST1RPX0pBVkFfT1VUUFVUX1BBUkFNUzo9CitMT0NBTF9SOF9GTEFHX0ZJTEVTOj0KIExPQ0FMX1JFQ09SREVEX01PRFVMRV9UWVBFOj0KIExPQ0FMX1JFTkRFUlNDUklQVF9DQzo9CiBMT0NBTF9SRU5ERVJTQ1JJUFRfQ09NUEFUSUJJTElUWTo9CkBAIC0yMjQsMTYgKzI0NSwzMCBAQAogTE9DQUxfU0RLX1ZFUlNJT046PQogTE9DQUxfU0hBUkVEX0FORFJPSURfTElCUkFSSUVTOj0KIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVM6PQorTE9DQUxfU09PTkdfQ0xBU1NFU19KQVIgOj0KK0xPQ0FMX1NPT05HX0RFWF9KQVIgOj0KK0xPQ0FMX1NPT05HX0VYUE9SVF9QUk9HVUFSRF9GTEFHUyA6PQorTE9DQUxfU09PTkdfSEVBREVSX0pBUiA6PQorTE9DQUxfU09PTkdfSkFDT0NPX1JFUE9SVF9DTEFTU0VTX0pBUiA6PQorTE9DQUxfU09PTkdfUFJPR1VBUkRfRElDVCA6PQorTE9DQUxfU09PTkdfUkVTT1VSQ0VfRVhQT1JUX1BBQ0tBR0UgOj0KK0xPQ0FMX1NPT05HX1JST19ESVJTIDo9CitMT0NBTF9TT09OR19TVEFUSUNfTElCUkFSWV9FWFRSQV9QQUNLQUdFUyA6PQorTE9DQUxfRFJPSURET0NfU1RVQlNfSkFSIDo9CitMT0NBTF9EUk9JRERPQ19ET0NfWklQIDo9CiAjICcnLHRydWUKIExPQ0FMX1NPVVJDRV9GSUxFU19BTExfR0VORVJBVEVEOj0KIExPQ0FMX1NSQ19GSUxFUzo9CiBMT0NBTF9TUkNfRklMRVNfRVhDTFVERTo9CitMT0NBTF9TUkNKQVJTOj0KIExPQ0FMX1NUQVRJQ19BTkRST0lEX0xJQlJBUklFUzo9CiBMT0NBTF9TVEFUSUNfSkFWQV9BQVJfTElCUkFSSUVTOj0KIExPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUzo9CiBMT0NBTF9TVEFUSUNfTElCUkFSSUVTOj0KIExPQ0FMX1NUUklQX01PRFVMRTo9CiBMT0NBTF9TWVNURU1fU0hBUkVEX0xJQlJBUklFUzo9bm9uZQorTE9DQUxfVEFSR0VUX1JFUVVJUkVEX01PRFVMRVM6PQorTE9DQUxfVEVTVF9DT05GSUdfT1BUSU9OUzo9CiBMT0NBTF9URVNUX0RBVEE6PQogTE9DQUxfVEVTVF9NT0RVTEVfVE9fUFJPR1VBUkRfV0lUSDo9CiBMT0NBTF9USURZOj0KQEAgLTI0Myw2ICsyNzgsNyBAQAogTE9DQUxfVU5TVFJJUFBFRF9QQVRIOj0KIExPQ0FMX1VTRV9BQVBUMjo9JChVU0VfQUFQVDIpCiBMT0NBTF9VU0VfVk5ESzo9CitMT0NBTF9VU0VTX0xJQlJBUklFUzo9CiBMT0NBTF9WRU5ET1JfTU9EVUxFOj0KIExPQ0FMX1ZUU0NfRkxBR1M6PQogTE9DQUxfVlRTX0lOQ0xVREVTOj0KQEAgLTQxOCw2ICs0NTQsMTMgQEAKIExPQ0FMX1dIT0xFX1NUQVRJQ19MSUJSQVJJRVNfMzI6PQogTE9DQUxfV0hPTEVfU1RBVElDX0xJQlJBUklFU182NDo9CiAKKyMgUm9ib2xlY3RyaWMgdmFyaWFibGVzCitMT0NBTF9JTlNUUlVNRU5UX1NPVVJDRV9ESVJTIDo9CitMT0NBTF9ST0JPVEVTVF9GQUlMVVJFX0ZBVEFMIDo9CitMT0NBTF9ST0JPVEVTVF9GSUxFUyA6PQorTE9DQUxfUk9CT1RFU1RfVElNRU9VVCA6PQorTE9DQUxfVEVTVF9QQUNLQUdFIDo9CisKICMgQXV4IHNwZWNpZmljIHZhcmlhYmxlcwogTE9DQUxfQVVYX0FSQ0ggOj0KIExPQ0FMX0FVWF9DUFUgOj0KZGlmZiAtLWdpdCBhL2NvcmUvY29tYm8vVEFSR0VUX2xpbnV4LWFybS5tayBiL2NvcmUvY29tYm8vVEFSR0VUX2xpbnV4LWFybS5tawppbmRleCAyZTE3OWY2Li4zY2U2NGY5IDEwMDY0NAotLS0gYS9jb3JlL2NvbWJvL1RBUkdFVF9saW51eC1hcm0ubWsKKysrIGIvY29yZS9jb21iby9UQVJHRVRfbGludXgtYXJtLm1rCkBAIC0yOSw4ICsyOSwyOCBAQAogIyBpbmNsdWRlIGRlZmluZXMsIGFuZCBjb21waWxlciBzZXR0aW5ncyBmb3IgdGhlIGdpdmVuIGFyY2hpdGVjdHVyZQogIyB2ZXJzaW9uLgogIworaWZlcSAoJChzdHJpcCAkKFRBUkdFVF8kKGNvbWJvXzJuZF9hcmNoX3ByZWZpeClDUFVfVkFSSUFOVCkpLCkKK1RBUkdFVF8kKGNvbWJvXzJuZF9hcmNoX3ByZWZpeClDUFVfVkFSSUFOVCA6PSBnZW5lcmljCitlbmRpZgorCitLTk9XTl9BUk12OF9DT1JFUyA6PSBjb3J0ZXgtYTUzIGNvcnRleC1hNTMuYTU3IGNvcnRleC1hNTUgY29ydGV4LWE3MyBjb3J0ZXgtYTc1CitLTk9XTl9BUk12OF9DT1JFUyArPSBrcnlvIGRlbnZlcjY0IGV4eW5vcy1tMSBleHlub3MtbTIKKworIyBNYW55IGRldmljZXMgKGluY29ycmVjdGx5KSB1c2UgYXJtdjctYS1uZW9uIGFzIHRoZSAybmQgYXJjaGl0ZWN0dXJlIHZhcmlhbnQKKyMgZm9yIGNvcmVzIHRoYXQgaW1wbGVtZW50IGFybXY4LWEgSVNBcy4gVGhlIGZvbGxvd2luZyBzZXRzIGl0IHRvIGFybXY4LWEuCitpZm5lcSAoLCQoZmlsdGVyICQoVEFSR0VUXyQoY29tYm9fMm5kX2FyY2hfcHJlZml4KUNQVV9WQVJJQU5UKSwgJChLTk9XTl9BUk12OF9DT1JFUykpKQorICBpZm5lcSAoJChUQVJHRVRfJChjb21ib18ybmRfYXJjaF9wcmVmaXgpQVJDSF9WQVJJQU5UKSxhcm12OC1hKQorICAgICQod2FybmluZyAkKFRBUkdFVF8kKGNvbWJvXzJuZF9hcmNoX3ByZWZpeClDUFVfVkFSSUFOVCkgaXMgYXJtdjgtYS4pCisgICAgaWZuZXEgKCwkKFRBUkdFVF8kKGNvbWJvXzJuZF9hcmNoX3ByZWZpeClBUkNIX1ZBUklBTlQpKQorICAgICAgJCh3YXJuaW5nIFRBUkdFVF8kKGNvbWJvXzJuZF9hcmNoX3ByZWZpeClBUkNIX1ZBUklBTlQsICQoVEFSR0VUXyQoY29tYm9fMm5kX2FyY2hfcHJlZml4KUFSQ0hfVkFSSUFOVCksIGlnbm9yZWQhIFVzZSBhcm12OC1hIGluc3RlYWQuKQorICAgIGVuZGlmCisgICAgIyBPdmVyd3JpdGUgVEFSR0VUXyQoY29tYm9fMm5kX2FyY2hfcHJlZml4KUFSQ0hfVkFSSUFOVAorICAgIFRBUkdFVF8kKGNvbWJvXzJuZF9hcmNoX3ByZWZpeClBUkNIX1ZBUklBTlQgOj0gYXJtdjgtYQorICBlbmRpZgorZW5kaWYKKwogaWZlcSAoJChzdHJpcCAkKFRBUkdFVF8kKGNvbWJvXzJuZF9hcmNoX3ByZWZpeClBUkNIX1ZBUklBTlQpKSwpCi1UQVJHRVRfJChjb21ib18ybmRfYXJjaF9wcmVmaXgpQVJDSF9WQVJJQU5UIDo9IGFybXY1dGUKKyQoZXJyb3IgVEFSR0VUXyQoY29tYm9fMm5kX2FyY2hfcHJlZml4KUFSQ0hfVkFSSUFOVCBtdXN0IGJlIHNldCkKIGVuZGlmCiAKIFRBUkdFVF9BUkNIX1NQRUNJRklDX01BS0VGSUxFIDo9ICQoQlVJTERfQ09NQk9TKS9hcmNoLyQoVEFSR0VUXyQoY29tYm9fMm5kX2FyY2hfcHJlZml4KUFSQ0gpLyQoVEFSR0VUXyQoY29tYm9fMm5kX2FyY2hfcHJlZml4KUFSQ0hfVkFSSUFOVCkubWsKZGlmZiAtLWdpdCBhL2NvcmUvY29tYm8vYXJjaC9hcm0vYXJtdjV0ZS12ZnAubWsgYi9jb3JlL2NvbWJvL2FyY2gvYXJtL2FybXY1dGUtdmZwLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTI5OWFjLi4wMDAwMDAwCi0tLSBhL2NvcmUvY29tYm8vYXJjaC9hcm0vYXJtdjV0ZS12ZnAubWsKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSMgQXQgdGhlIG1vbWVudCwgdXNlIHRoZSBzYW1lIHNldHRpbmdzIHRoYW4gdGhlIG9uZQotIyBmb3IgYXJtdjV0ZSwgc2luY2UgVEFSR0VUX0FSQ0hfVkFSSUFOVCA6PSBhcm12NXRlLXZmcAotIyB3aWxsIG9ubHkgYmUgdXNlZCB0byBzZWxlY3QgYW4gb3B0aW1pemVkIFZGUC1jYXBhYmxlIGFzc2VtYmx5Ci0jIGludGVycHJldGVyIGxvb3AgZm9yIERhbHZpay4KLSMKLWluY2x1ZGUgJChCVUlMRF9DT01CT1MpL2FyY2gvYXJtL2FybXY1dGUubWsKLQpkaWZmIC0tZ2l0IGEvY29yZS9jb21iby9hcmNoL2FybS9hcm12NXRlLm1rIGIvY29yZS9jb21iby9hcmNoL2FybS9hcm12NXRlLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDc1Njk1Li4wMDAwMDAwCi0tLSBhL2NvcmUvY29tYm8vYXJjaC9hcm0vYXJtdjV0ZS5taworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotIyBDb25maWd1cmF0aW9uIGZvciBMaW51eCBvbiBBUk0uCi0jIEdlbmVyYXRpbmcgYmluYXJpZXMgZm9yIHRoZSBBUk12NVRFIGFyY2hpdGVjdHVyZSBhbmQgaGlnaGVyCi0jCi0KZGlmZiAtLWdpdCBhL2NvcmUvY29tYm8vYXJjaC9hcm0vYXJtdjgtYS5tayBiL2NvcmUvY29tYm8vYXJjaC9hcm0vYXJtdjgtYS5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWY1YzQ5Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9jb21iby9hcmNoL2FybS9hcm12OC1hLm1rCkBAIC0wLDAgKzEsOSBAQAorIyBDb25maWd1cmF0aW9uIGZvciBMaW51eCBvbiBBUk0uCisjIEdlbmVyYXRpbmcgYmluYXJpZXMgZm9yIHRoZSBBUk12OC1hIGFyY2hpdGVjdHVyZQorIworIyBNYW55IGxpYnJhcmllcyBhcmUgbm90IGF3YXJlIG9mIGFybXY4LWEsIGFuZCBBQXJjaDMyIGlzIChhbG1vc3QpIGEgc3VwZXJzZXQKKyMgb2YgYXJtdjctYS1uZW9uLiBTbyBqdXN0IGxldCB0aGVtIHRoaW5rIHdlIGFyZSBqdXN0IGxpa2UgdjcuCitBUkNIX0FSTV9IQVZFX0FSTVY3QSAgICAgICAgICAgIDo9IHRydWUKK0FSQ0hfQVJNX0hBVkVfVkZQICAgICAgICAgICAgICAgOj0gdHJ1ZQorQVJDSF9BUk1fSEFWRV9WRlBfRDMyICAgICAgICAgICA6PSB0cnVlCitBUkNIX0FSTV9IQVZFX05FT04gICAgICAgICAgICAgIDo9IHRydWUKZGlmZiAtLWdpdCBhL2NvcmUvY29tYm8vYXJjaC9hcm02NC9hcm12OC0yYS5tayBiL2NvcmUvY29tYm8vYXJjaC9hcm02NC9hcm12OC0yYS5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9jb21iby9hcmNoL2FybTY0L2FybXY4LTJhLm1rCmRpZmYgLS1naXQgYS9jb3JlL2NvbWJvL2FyY2gveDg2L2F0b20ubWsgYi9jb3JlL2NvbWJvL2FyY2gveDg2L2F0b20ubWsKaW5kZXggZDMxM2E5YS4uNDNhMTcwYyAxMDA2NDQKLS0tIGEvY29yZS9jb21iby9hcmNoL3g4Ni9hdG9tLm1rCisrKyBiL2NvcmUvY29tYm8vYXJjaC94ODYvYXRvbS5tawpAQCAtMiw3ICsyLDcgQEAKICMgJ3g4Ni1hdG9tJyBhcmNoIHZhcmlhbnQuIFRoaXMgaXMgYW4gZXh0ZW5zaW9uIG9mIHRoZSAneDg2JyBiYXNlIHZhcmlhbnQKICMgdGhhdCBhZGRzIEF0b20tc3BlY2lmaWMgZmVhdHVyZXMuCiAjCi0jIFNlZSBidWlsZC9jb3JlL2NvbWJvL2FyY2gveDg2L3g4Ni5tayBmb3IgZGlmZmVyZW5jZXMuCisjIFNlZSBidWlsZC9tYWtlL2NvcmUvY29tYm8vYXJjaC94ODYveDg2Lm1rIGZvciBkaWZmZXJlbmNlcy4KICMKIEFSQ0hfWDg2X0hBVkVfU1NTRTMgOj0gdHJ1ZQogQVJDSF9YODZfSEFWRV9NT1ZCRSA6PSB0cnVlCmRpZmYgLS1naXQgYS9jb3JlL2NvbWJvL2FyY2gveDg2L3NpbHZlcm1vbnQubWsgYi9jb3JlL2NvbWJvL2FyY2gveDg2L3NpbHZlcm1vbnQubWsKaW5kZXggNzBiNzE4Yy4uY2JhMTA3OSAxMDA2NDQKLS0tIGEvY29yZS9jb21iby9hcmNoL3g4Ni9zaWx2ZXJtb250Lm1rCisrKyBiL2NvcmUvY29tYm8vYXJjaC94ODYvc2lsdmVybW9udC5tawpAQCAtMSw3ICsxLDcgQEAKICMgVGhpcyBmaWxlIGNvbnRhaW5zIGZlYXR1cmUgbWFjcm8gZGVmaW5pdGlvbnMgc3BlY2lmaWMgdG8gdGhlCiAjIHNpbHZlcm1vbnQgYXJjaCB2YXJpYW50LgogIwotIyBTZWUgYnVpbGQvY29yZS9jb21iby9hcmNoL3g4Ni94ODYtYXRvbS5tayBmb3IgZGlmZmVyZW5jZXMuCisjIFNlZSBidWlsZC9tYWtlL2NvcmUvY29tYm8vYXJjaC94ODYveDg2LWF0b20ubWsgZm9yIGRpZmZlcmVuY2VzLgogIwogCiBBUkNIX1g4Nl9IQVZFX1NTU0UzICA6PSB0cnVlCmRpZmYgLS1naXQgYS9jb3JlL2NvbWJvL2FyY2gveDg2XzY0L3NpbHZlcm1vbnQubWsgYi9jb3JlL2NvbWJvL2FyY2gveDg2XzY0L3NpbHZlcm1vbnQubWsKaW5kZXggNzBiNzE4Yy4uY2JhMTA3OSAxMDA2NDQKLS0tIGEvY29yZS9jb21iby9hcmNoL3g4Nl82NC9zaWx2ZXJtb250Lm1rCisrKyBiL2NvcmUvY29tYm8vYXJjaC94ODZfNjQvc2lsdmVybW9udC5tawpAQCAtMSw3ICsxLDcgQEAKICMgVGhpcyBmaWxlIGNvbnRhaW5zIGZlYXR1cmUgbWFjcm8gZGVmaW5pdGlvbnMgc3BlY2lmaWMgdG8gdGhlCiAjIHNpbHZlcm1vbnQgYXJjaCB2YXJpYW50LgogIwotIyBTZWUgYnVpbGQvY29yZS9jb21iby9hcmNoL3g4Ni94ODYtYXRvbS5tayBmb3IgZGlmZmVyZW5jZXMuCisjIFNlZSBidWlsZC9tYWtlL2NvcmUvY29tYm8vYXJjaC94ODYveDg2LWF0b20ubWsgZm9yIGRpZmZlcmVuY2VzLgogIwogCiBBUkNIX1g4Nl9IQVZFX1NTU0UzICA6PSB0cnVlCmRpZmYgLS1naXQgYS9jb3JlL2NvbWJvL2phdmFjLm1rIGIvY29yZS9jb21iby9qYXZhYy5tawppbmRleCA1YzI2NjhjLi5kYWMyNjI4IDEwMDY0NAotLS0gYS9jb3JlL2NvbWJvL2phdmFjLm1rCisrKyBiL2NvcmUvY29tYm8vamF2YWMubWsKQEAgLTEsNTMgKzEsMTkgQEAKICMgU2VsZWN0cyBhIEphdmEgY29tcGlsZXIuCiAjCi0jIElucHV0czoKLSMJQ1VTVE9NX0pBVkFfQ09NUElMRVIgLS0gImVjbGlwc2UiLCAib3BlbmpkayIuIG9yIG5vdGhpbmcgZm9yIHRoZSBzeXN0ZW0KLSMgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0Ci0jCUFMVEVSTkFURV9KQVZBQyAtLSB0aGUgYWx0ZXJuYXRlIGphdmEgY29tcGlsZXIgdG8gdXNlCi0jCiAjIE91dHB1dHM6Ci0jICAgQ09NTU9OX0pBVkFDIC0tIEphdmEgY29tcGlsZXIgY29tbWFuZCB3aXRoIGNvbW1vbiBhcmd1bWVudHMKKyMgICBBTkRST0lEX0pBVkFfVE9PTENIQUlOIC0tIERpcmVjdG9yeSB0aGF0IGNvbnRhaW5zIGphdmFjIGFuZCBvdGhlciBqYXZhIHRvb2xzCiAjCiAKLWlmbmRlZiBBTkRST0lEX0NPTVBJTEVfV0lUSF9KQUNLCi0jIERlZmluZXMgaWYgY29tcGlsYXRpb24gd2l0aCBqYWNrIGlzIGVuYWJsZWQgYnkgZGVmYXVsdC4KLUFORFJPSURfQ09NUElMRV9XSVRIX0pBQ0sgOj0gdHJ1ZQorQU5EUk9JRF9DT01QSUxFX1dJVEhfSkFDSyA6PSBmYWxzZQorCitpZmRlZiBUQVJHRVRfQlVJTERfQVBQUworICBpZm5kZWYgVFVSQklORV9FTkFCTEVECisgICAgVFVSQklORV9FTkFCTEVEIDo9IGZhbHNlCisgIGVuZGlmCiBlbmRpZgogCi1jb21tb25famRrX2ZsYWdzIDo9IC1YbWF4ZXJycyA5OTk5OTk5CitBTkRST0lEX0pBVkFfVE9PTENIQUlOIDo9ICQoQU5EUk9JRF9KQVZBX0hPTUUpL2JpbgogCi0jIFVzZSB0aGUgaW5kZXhlciB3cmFwcGVyIHRvIGluZGV4IHRoZSBjb2RlYmFzZSBpbnN0ZWFkIG9mIHRoZSBqYXZhYyBjb21waWxlcgotaWZlcSAoJChBTFRFUk5BVEVfSkFWQUMpLCkKLUpBVkFDQyA6PSBqYXZhYwotZWxzZQotSkFWQUNDIDo9ICQoQUxURVJOQVRFX0pBVkFDKQotZW5kaWYKLQotSkFWQSA6PSBqYXZhCi1KQVZBRE9DIDo9IGphdmFkb2MKLUpBUiA6PSBqYXIKLQotIyBUaGUgYWN0dWFsIGNvbXBpbGVyIGNhbiBiZSB3cmFwcGVkIGJ5IHNldHRpbmcgdGhlIEpBVkFDX1dSQVBQRVIgdmFyLgotaWZkZWYgSkFWQUNfV1JBUFBFUgotICAgIGlmbmVxICgkKEpBVkFDX1dSQVBQRVIpLCQoZmlyc3R3b3JkICQoSkFWQUNDKSkpCi0gICAgICAgIEpBVkFDQyA6PSAkKEpBVkFDX1dSQVBQRVIpICQoSkFWQUNDKQotICAgIGVuZGlmCi1lbmRpZgotCi0jIFdoYXRldmVyIGNvbXBpbGVyIGlzIG9uIHRoaXMgc3lzdGVtLgotQ09NTU9OX0pBVkFDIDo9ICQoSkFWQUNDKSAtSi1YbXgyMDQ4TSAkKGNvbW1vbl9qZGtfZmxhZ3MpCi0KLSMgRWNsaXBzZS4KLWlmZXEgKCQoQ1VTVE9NX0pBVkFfQ09NUElMRVIpLCBlY2xpcHNlKQotICAgIENPTU1PTl9KQVZBQyA6PSBqYXZhIC1YbXgyNTZtIC1qYXIgcHJlYnVpbHQvY29tbW9uL2Vjai9lY2ouamFyIC01IFwKLSAgICAgICAgLW1heFByb2JsZW1zIDk5OTk5OTkgLW5vd2FybgotICAgICQoaW5mbyBDVVNUT01fSkFWQV9DT01QSUxFUj1lY2xpcHNlKQotZW5kaWYKLQotR0xPQkFMX0pBVkFDX0RFQlVHX0ZMQUdTIDo9IC1nCi0KLUhPU1RfSkFWQUMgPz0gJChDT01NT05fSkFWQUMpCi1UQVJHRVRfSkFWQUMgPz0gJChDT01NT05fSkFWQUMpCi0KLSMkKGluZm8gSE9TVF9KQVZBQz0kKEhPU1RfSkFWQUMpKQotIyQoaW5mbyBUQVJHRVRfSkFWQUM9JChUQVJHRVRfSkFWQUMpKQorIyBUT0RPKGNjcm9zcyk6IHJlbW92ZSB0aGlzLCBpdCBpcyBuZWVkZWQgZm9yIG5vdyBiZWNhdXNlIGl0IGlzIHVzZWQgYnkKKyMgY29uZmlnLm1rIGJlZm9yZSBtYWtldmFycyBmcm9tIHNvb25nIGFyZSBsb2FkZWQKK0pBVkEgOj0gJChBTkRST0lEX0pBVkFfVE9PTENIQUlOKS9qYXZhCmRpZmYgLS1naXQgYS9jb3JlL2NvbWJvL3NlbGVjdC5tayBiL2NvcmUvY29tYm8vc2VsZWN0Lm1rCmluZGV4IDVlMTgxYjkuLmVhYjRjNzIgMTAwNjQ0Ci0tLSBhL2NvcmUvY29tYm8vc2VsZWN0Lm1rCisrKyBiL2NvcmUvY29tYm8vc2VsZWN0Lm1rCkBAIC0yOCw3ICsyOCw3IEBACiAKICMgU2V0IHJlYXNvbmFibGUgZGVmYXVsdHMgZm9yIHRoZSB2YXJpb3VzIHZhcmlhYmxlcwogCi0kKGNvbWJvX3Zhcl9wcmVmaXgpR0xPQkFMX0FSRkxBR1MgOj0gY3JzUEQKKyQoY29tYm9fdmFyX3ByZWZpeClHTE9CQUxfQVJGTEFHUyA6PSBjcXNEIC1mb3JtYXQ9Z251CiAKICQoY29tYm9fdmFyX3ByZWZpeClTVEFUSUNfTElCX1NVRkZJWCA6PSAuYQogCmRpZmYgLS1naXQgYS9jb3JlL2NvbmZpZy5tayBiL2NvcmUvY29uZmlnLm1rCmluZGV4IGNjMmIyYWYuLmQyMTg0MDggMTAwNjQ0Ci0tLSBhL2NvcmUvY29uZmlnLm1rCisrKyBiL2NvcmUvY29uZmlnLm1rCkBAIC0zLDYgKzMsMjAgQEAKICMgY3VycmVudCBjb25maWd1cmF0aW9uIGFuZCBwbGF0Zm9ybSwgd2hpY2gKICMgYXJlIG5vdCBzcGVjaWZpYyB0byB3aGF0IGlzIGJlaW5nIGJ1aWx0LgogCitpZm5kZWYgS0FUSQorJCh3YXJuaW5nIERpcmVjdGx5IHVzaW5nIGNvbmZpZy5tayBmcm9tIG1ha2UgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZC4pCiskKHdhcm5pbmcgKQorJCh3YXJuaW5nIElmIHlvdSBhcmUganVzdCBhdHRlbXB0aW5nIHRvIGJ1aWxkLCB5b3UgcHJvYmFibHkgbmVlZCB0byByZS1zb3VyY2UgZW52c2V0dXAuc2g6KQorJCh3YXJuaW5nICkKKyQod2FybmluZyAkJCBzb3VyY2UgYnVpbGQvZW52c2V0dXAuc2gpCiskKHdhcm5pbmcgKQorJCh3YXJuaW5nIElmIHlvdSBhcmUgYXR0ZW1wdGluZyB0byBlbXVsYXRlIGdldF9idWlsZF92YXIsIHVzZSBvbmUgb2YgdGhlIGZvbGxvd2luZzopCiskKHdhcm5pbmcgJCQgYnVpbGQvc29vbmcvc29vbmdfdWkuYmFzaCAtLWR1bXB2YXItbW9kZSkKKyQod2FybmluZyAkJCBidWlsZC9zb29uZy9zb29uZ191aS5iYXNoIC0tZHVtcHZhcnMtbW9kZSkKKyQod2FybmluZyApCiskKGVycm9yIGRvbmUpCitlbmRpZgorCiAjIE9ubHkgdXNlIEFORFJPSURfQlVJTERfU0hFTEwgdG8gd3JhcCBhcm91bmQgYmFzaC4KICMgRE8gTk9UIHVzZSBvdGhlciBzaGVsbHMgc3VjaCBhcyB6c2guCiBpZmRlZiBBTkRST0lEX0JVSUxEX1NIRUxMCkBAIC00NCwxNyArNTgsMjcgQEAKICMgSWYgYSBydWxlIGZhaWxzLCBkZWxldGUgJEAuCiAuREVMRVRFX09OX0VSUk9SOgogCi0jIENoZWNrIGZvciBicm9rZW4gdmVyc2lvbnMgb2YgbWFrZS4KLWlmbmRlZiBLQVRJCi1pZm5lcSAoMSwkKHN0cmlwICQoc2hlbGwgZXhwciAkKE1BS0VfVkVSU0lPTikgXD49IDMuODEpKSkKLSQod2FybmluZyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKikKLSQod2FybmluZyAqICBZb3UgYXJlIHVzaW5nIHZlcnNpb24gJChNQUtFX1ZFUlNJT04pIG9mIG1ha2UuKQotJCh3YXJuaW5nICogIEFuZHJvaWQgY2FuIG9ubHkgYmUgYnVpbHQgYnkgdmVyc2lvbnMgMy44MSBhbmQgaGlnaGVyLikKLSQod2FybmluZyAqICBzZWUgaHR0cHM6Ly9zb3VyY2UuYW5kcm9pZC5jb20vc291cmNlL2Rvd25sb2FkLmh0bWwpCi0kKHdhcm5pbmcgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopCi0kKGVycm9yIHN0b3BwaW5nKQotZW5kaWYKLWVuZGlmCisjIE1hcmsgdmFyaWFibGVzIGRlcHJlY2F0ZWQvb2Jzb2xldGUKK0NIQU5HRVNfVVJMIDo9IGh0dHBzOi8vYW5kcm9pZC5nb29nbGVzb3VyY2UuY29tL3BsYXRmb3JtL2J1aWxkLysvbWFzdGVyL0NoYW5nZXMubWQKKyQoS0FUSV9vYnNvbGV0ZV92YXIgUEFUSCxEbyBub3QgdXNlIFBBVEggZGlyZWN0bHkuIFNlZSAkKENIQU5HRVNfVVJMKSNQQVRIKQorJChLQVRJX29ic29sZXRlX3ZhciBQWVRIT05QQVRILERvIG5vdCB1c2UgUFlUSE9OUEFUSCBkaXJlY3RseS4gU2VlICQoQ0hBTkdFU19VUkwpI1BZVEhPTlBBVEgpCiskKEtBVElfb2Jzb2xldGVfdmFyIE9VVCxVc2UgT1VUX0RJUiBpbnN0ZWFkLiBTZWUgJChDSEFOR0VTX1VSTCkjT1VUKQorJChLQVRJX29ic29sZXRlX3ZhciBBTkRST0lEX0hPU1RfT1VULFVzZSBIT1NUX09VVCBpbnN0ZWFkLiBTZWUgJChDSEFOR0VTX1VSTCkjQU5EUk9JRF9IT1NUX09VVCkKKyQoS0FUSV9vYnNvbGV0ZV92YXIgQU5EUk9JRF9QUk9EVUNUX09VVCxVc2UgUFJPRFVDVF9PVVQgaW5zdGVhZC4gU2VlICQoQ0hBTkdFU19VUkwpI0FORFJPSURfUFJPRFVDVF9PVVQpCiskKEtBVElfb2Jzb2xldGVfdmFyIEFORFJPSURfSE9TVF9PVVRfVEVTVENBU0VTLFVzZSBIT1NUX09VVF9URVNUQ0FTRVMgaW5zdGVhZC4gU2VlICQoQ0hBTkdFU19VUkwpI0FORFJPSURfSE9TVF9PVVRfVEVTVENBU0VTKQorJChLQVRJX29ic29sZXRlX3ZhciBBTkRST0lEX1RBUkdFVF9PVVRfVEVTVENBU0VTLFVzZSBUQVJHRVRfT1VUX1RFU1RDQVNFUyBpbnN0ZWFkLiBTZWUgJChDSEFOR0VTX1VSTCkjQU5EUk9JRF9UQVJHRVRfT1VUX1RFU1RDQVNFUykKKyQoS0FUSV9vYnNvbGV0ZV92YXIgQU5EUk9JRF9CVUlMRF9UT1AsVXNlICcuJyBpbnN0ZWFkLiBTZWUgJChDSEFOR0VTX1VSTCkjQU5EUk9JRF9CVUlMRF9UT1ApCiskKEtBVElfb2Jzb2xldGVfdmFyIFwKKyAgQU5EUk9JRF9UT09MQ0hBSU4gXAorICBBTkRST0lEX1RPT0xDSEFJTl8yTkRfQVJDSCBcCisgIEFORFJPSURfREVWX1NDUklQVFMgXAorICBBTkRST0lEX0VNVUxBVE9SX1BSRUJVSUxUUyBcCisgIEFORFJPSURfUFJFX0JVSUxEX1BBVEhTIFwKKyAgLFNlZSAkKENIQU5HRVNfVVJMKSNvdGhlcl9lbnZzZXR1cF92YXJpYWJsZXMpCiskKEtBVElfb2Jzb2xldGVfdmFyIFBST0RVQ1RfQ09NUEFUSUJJTElUWV9NQVRSSVhfTEVWRUxfT1ZFUlJJREUsU2V0IEZDTSBWZXJzaW9uIGluIGRldmljZSBtYW5pZmVzdCBpbnN0ZWFkLiBTZWUgJChDSEFOR0VTX1VSTCkjUFJPRFVDVF9DT01QQVRJQklMSVRZX01BVFJJWF9MRVZFTF9PVkVSUklERSkKKyQoS0FUSV9vYnNvbGV0ZV92YXIgVVNFX0NMQU5HX1BMQVRGT1JNX0JVSUxELENsYW5nIGlzIHRoZSBvbmx5IHN1cHBvcnRlZCBBbmRyb2lkIGNvbXBpbGVyLiBTZWUgJChDSEFOR0VTX1VSTCkjVVNFX0NMQU5HX1BMQVRGT1JNX0JVSUxEKQorCitDSEFOR0VTX1VSTCA6PQogCiAjIFVzZWQgdG8gZm9yY2UgZ29hbHMgdG8gYnVpbGQuICBPbmx5IHVzZSBmb3IgY29uZGl0aW9uYWxseSBkZWZpbmVkIGdvYWxzLgogLlBIT05ZOiBGT1JDRQpAQCAtNjIsMTQgKzg2LDEwIEBACiAKIE9SSUdJTkFMX01BS0VDTURHT0FMUyA6PSAkKE1BS0VDTURHT0FMUykKIAotIyBUZWxsIHB5dGhvbiBub3QgdG8gc3BhbSB0aGUgc291cmNlIHRyZWUgd2l0aCAucHljIGZpbGVzLiAgVGhpcwotIyBvbmx5IGhhcyBhbiBlZmZlY3Qgb24gcHl0aG9uIDIuNiBhbmQgYWJvdmUuCi1leHBvcnQgUFlUSE9ORE9OVFdSSVRFQllURUNPREUgOj0gMQorZGlzdF9nb2FsIDo9ICQoc3RyaXAgJChmaWx0ZXIgZGlzdCwkKE1BS0VDTURHT0FMUykpKQorTUFLRUNNREdPQUxTIDo9ICQoc3RyaXAgJChmaWx0ZXItb3V0IGRpc3QsJChNQUtFQ01ER09BTFMpKSkKIAotaWZuZXEgKCQoZmlsdGVyIC0tY29sb3I9YWx3YXlzLCAkKEdSRVBfT1BUSU9OUykpLCkKLSQod2FybmluZyBUaGUgYnVpbGQgc3lzdGVtIG5lZWRzIHVubW9kaWZpZWQgb3V0cHV0IG9mIGdyZXAuKQotJChlcnJvciBQbGVhc2UgcmVtb3ZlIC0tY29sb3I9YWx3YXlzIGZyb20geW91ciAgJCRHUkVQX09QVElPTlMpCi1lbmRpZgorVU5BTUUgOj0gJChzaGVsbCB1bmFtZSAtc20pCiAKIFNSQ19UQVJHRVRfRElSIDo9ICQoVE9QRElSKWJ1aWxkL3RhcmdldAogU1JDX0FQSV9ESVIgOj0gJChUT1BESVIpcHJlYnVpbHRzL3Nkay9hcGkKQEAgLTc3LDcgKzk3LDcgQEAKIFNSQ19URVNUX0FQSV9ESVIgOj0gJChUT1BESVIpcHJlYnVpbHRzL3Nkay90ZXN0LWFwaQogCiAjIFNvbWUgc3BlY2lmaWMgcGF0aHMgdG8gdG9vbHMKLVNSQ19EUk9JRERPQ19ESVIgOj0gJChUT1BESVIpYnVpbGQvdG9vbHMvZHJvaWRkb2MKK1NSQ19EUk9JRERPQ19ESVIgOj0gJChUT1BESVIpYnVpbGQvbWFrZS90b29scy9kcm9pZGRvYwogCiAjIFNldCB1cCBlZmZpY2llbnQgbWF0aCBmdW5jdGlvbnMgd2hpY2ggYXJlIHVzZWQgaW4gbWFrZS4KICMgSGVyZSBzaW5jZSB0aGlzIGZpbGUgaXMgaW5jbHVkZWQgYnkgZW52c2V0dXAgYXMgd2VsbCBhcyBkdXJpbmcgYnVpbGQuCkBAIC04Niw2ICsxMDYsOSBAQAogIyBWYXJpb3VzIG1hcHBpbmdzIHRvIGF2b2lkIGhhcmQtY29kaW5nIHBhdGhzIGFsbCBvdmVyIHRoZSBwbGFjZQogaW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvcGF0aG1hcC5tawogCisjIEFsbG93IHByb2plY3RzIHRvIGRlZmluZSB0aGVpciBvd24gZ2xvYmFsbHktYXZhaWxhYmxlIHZhcmlhYmxlcworaW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvcHJvamVjdF9kZWZpbml0aW9ucy5taworCiAjICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIyBCdWlsZCBzeXN0ZW0gaW50ZXJuYWwgZmlsZXMKICMgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCkBAIC0xMTIsNiArMTM1LDcgQEAKIEJVSUxEX1NUQVRJQ19KQVZBX0xJQlJBUlk6PSAkKEJVSUxEX1NZU1RFTSkvc3RhdGljX2phdmFfbGlicmFyeS5tawogQlVJTERfSE9TVF9KQVZBX0xJQlJBUlk6PSAkKEJVSUxEX1NZU1RFTSkvaG9zdF9qYXZhX2xpYnJhcnkubWsKIEJVSUxEX0RST0lERE9DOj0gJChCVUlMRF9TWVNURU0pL2Ryb2lkZG9jLm1rCitCVUlMRF9BUElESUZGOj0gJChCVUlMRF9TWVNURU0pL2FwaWRpZmYubWsKIEJVSUxEX0NPUFlfSEVBREVSUyA6PSAkKEJVSUxEX1NZU1RFTSkvY29weV9oZWFkZXJzLm1rCiBCVUlMRF9OQVRJVkVfVEVTVCA6PSAkKEJVSUxEX1NZU1RFTSkvbmF0aXZlX3Rlc3QubWsKIEJVSUxEX05BVElWRV9CRU5DSE1BUksgOj0gJChCVUlMRF9TWVNURU0pL25hdGl2ZV9iZW5jaG1hcmsubWsKQEAgLTEyOCw2ICsxNTIsMTUgQEAKIEJVSUxEX0hPU1RfREFMVklLX0pBVkFfTElCUkFSWSA6PSAkKEJVSUxEX1NZU1RFTSkvaG9zdF9kYWx2aWtfamF2YV9saWJyYXJ5Lm1rCiBCVUlMRF9IT1NUX0RBTFZJS19TVEFUSUNfSkFWQV9MSUJSQVJZIDo9ICQoQlVJTERfU1lTVEVNKS9ob3N0X2RhbHZpa19zdGF0aWNfamF2YV9saWJyYXJ5Lm1rCiAKK0JVSUxEX0hPU1RfVEVTVF9DT05GSUcgOj0gJChCVUlMRF9TWVNURU0pL2hvc3RfdGVzdF9jb25maWcubWsKK0JVSUxEX1RBUkdFVF9URVNUX0NPTkZJRyA6PSAkKEJVSUxEX1NZU1RFTSkvdGFyZ2V0X3Rlc3RfY29uZmlnLm1rCisKK0lOU1RSVU1FTlRBVElPTl9URVNUX0NPTkZJR19URU1QTEFURSA6PSAkKEJVSUxEX1NZU1RFTSkvaW5zdHJ1bWVudGF0aW9uX3Rlc3RfY29uZmlnX3RlbXBsYXRlLnhtbAorTkFUSVZFX1RFU1RfQ09ORklHX1RFTVBMQVRFIDo9ICQoQlVJTERfU1lTVEVNKS9uYXRpdmVfdGVzdF9jb25maWdfdGVtcGxhdGUueG1sCitFTVBUWV9URVNUX0NPTkZJRyA6PSAkKEJVSUxEX1NZU1RFTSkvZW1wdHlfdGVzdF9jb25maWcueG1sCisKKyMgVG9vbCB0byBnZW5lcmF0ZSBUcmFkZUZlZCB0ZXN0IGNvbmZpZyBmaWxlIGF1dG9tYXRpY2FsbHkuCitBVVRPR0VOX1RFU1RfQ09ORklHX1NDUklQVCA6PSBidWlsZC9tYWtlL3Rvb2xzL2F1dG9fZ2VuX3Rlc3RfY29uZmlnLnB5CiAKICMgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAjIFBhcnNlIG91dCBhbnkgbW9kaWZpZXIgdGFyZ2V0cy4KQEAgLTEzOCw3ICsxNzEsNyBAQAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIyBUb29scyBuZWVkZWQgaW4gcHJvZHVjdCBjb25maWd1cmF0aW9uIG1ha2VmaWxlcy4KICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLU5PUk1BTElaRV9QQVRIIDo9IGJ1aWxkL3Rvb2xzL25vcm1hbGl6ZV9wYXRoLnB5CitOT1JNQUxJWkVfUEFUSCA6PSBidWlsZC9tYWtlL3Rvb2xzL25vcm1hbGl6ZV9wYXRoLnB5CiAKICMgJCgxKTogdGhlIHBhdGhzIHRvIGJlIG5vcm1hbGl6ZWQKIGRlZmluZSBub3JtYWxpemUtcGF0aHMKQEAgLTE0OSw2ICsxODIsOSBAQAogIyBTZXQgY29tbW9uIHZhbHVlcwogIyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIAorIyBJbml0aWFsaXplIFNPT05HX0NPTkZJR19OQU1FU1BBQ0VTIHNvIHRoYXQgaXQgaXNuJ3QgcmVjdXJzaXZlLgorU09PTkdfQ09ORklHX05BTUVTUEFDRVMgOj0KKwogIyBTZXQgdGhlIGV4dGVuc2lvbnMgdXNlZCBmb3IgdmFyaW91cyBwYWNrYWdlcwogQ09NTU9OX1BBQ0tBR0VfU1VGRklYIDo9IC56aXAKIENPTU1PTl9KQVZBX1BBQ0tBR0VfU1VGRklYIDo9IC5qYXIKQEAgLTE2MCw2ICsxOTYsMTEgQEAKIEpBVkFfVE1QRElSX0FSRyA6PQogZW5kaWYKIAorIyBEZWZhdWx0IHRvIHJlbW92ZSB0aGUgb3JnLmFwYWNoZS5odHRwLmxlZ2FjeSBmcm9tIGJvb3RjbGFzc3BhdGgKK2lmZXEgKCQoUkVNT1ZFX09BSExfRlJPTV9CQ1ApLCkKK1JFTU9WRV9PQUhMX0ZST01fQkNQIDo9IHRydWUKK2VuZGlmCisKICMgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAjIEluY2x1ZGUgc3ViLWNvbmZpZ3VyYXRpb24gZmlsZXMKICMgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCkBAIC0zMDIsNyArMzQzLDcgQEAKIGluY2x1ZGUgJChCVUlMRF9TWVNURU0pL2NvbWJvL3NlbGVjdC5tawogZW5kaWYKIAotaWZuZGVmIEtBVEkKK2lmZXEgKCQoQ0FMTEVEX0ZST01fU0VUVVApLHRydWUpCiBpbmNsdWRlICQoQlVJTERfU1lTVEVNKS9jY2FjaGUubWsKIGluY2x1ZGUgJChCVUlMRF9TWVNURU0pL2dvbWEubWsKIApAQCAtMzc1LDMzICs0MTYsMTEgQEAKICAgV0lUSF9TVEFUSUNfQU5BTFlaRVIgOj0KIGVuZGlmCiAKLSMgZGVmaW5lIGNsYW5nL2xsdm0gdmVyc2lvbnMgYW5kIGJhc2UgZGlyZWN0b3J5LgotaW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvY2xhbmcvdmVyc2lvbnMubWsKLQogIyBVbnNldCBXSVRIX1RJRFlfT05MWSBpZiBnbG9iYWwgV0lUSF9USURZX09OTFkgaXMgbm90IHRydWUgbm9yIDEuCiBpZmVxICgsJChmaWx0ZXIgMSB0cnVlLCQoV0lUSF9USURZX09OTFkpKSkKICAgV0lUSF9USURZX09OTFkgOj0KIGVuZGlmCiAKLVBBVEhfVE9fQ0xBTkdfVElEWSA6PSBcCi0gICAgJChMTFZNX1BSRUJVSUxUU19CQVNFKS8kKEJVSUxEX09TKS14ODYvJChMTFZNX1BSRUJVSUxUU19WRVJTSU9OKS9iaW4vY2xhbmctdGlkeQotaWZlcSAoJCh3aWxkY2FyZCAkKFBBVEhfVE9fQ0xBTkdfVElEWSkpLCkKLSAgaWZuZXEgKCwkKGZpbHRlciAxIHRydWUsJChXSVRIX1RJRFkpKSkKLSAgICAkKHdhcm5pbmcgKioqIERpc2FibGUgV0lUSF9USURZIGJlY2F1c2UgJChQQVRIX1RPX0NMQU5HX1RJRFkpIGRvZXMgbm90IGV4aXN0KQotICBlbmRpZgotICBQQVRIX1RPX0NMQU5HX1RJRFkgOj0KLWVuZGlmCi0KLSMgRGlzYWJsZSBXSVRIX1NUQVRJQ19BTkFMWVpFUiBpZiB0b29sIGNhbid0IGJlIGZvdW5kCi1TWU5UQVhfVE9PTFNfUFJFRklYIDo9IFwKLSAgICAkKExMVk1fUFJFQlVJTFRTX0JBU0UpLyQoQlVJTERfT1MpLXg4Ni8kKExMVk1fUFJFQlVJTFRTX1ZFUlNJT04pL3Rvb2xzL3NjYW4tYnVpbGQvbGliZXhlYwotaWZuZXEgKCQoc3RyaXAgJChXSVRIX1NUQVRJQ19BTkFMWVpFUikpLCkKLSAgaWZlcSAoJCh3aWxkY2FyZCAkKFNZTlRBWF9UT09MU19QUkVGSVgpL2NjYy1hbmFseXplciksKQotICAgICQod2FybmluZyAqKiogRGlzYWJsZSBXSVRIX1NUQVRJQ19BTkFMWVpFUiBiZWNhdXNlICQoU1lOVEFYX1RPT0xTX1BSRUZJWCkvY2NjLWFuYWx5emVyIGRvZXMgbm90IGV4aXN0KQotICAgIFdJVEhfU1RBVElDX0FOQUxZWkVSIDo9Ci0gIGVuZGlmCi1lbmRpZgotCiAjIFBpY2sgYSBKYXZhIGNvbXBpbGVyLgogaW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvY29tYm8vamF2YWMubWsKIApAQCAtNDMyLDkgKzQ1MSw5IEBACiAKICMgV2hhdCB0byBidWlsZDoKICMgcGRrIGZ1c2lvbiBpZjoKLSMgMSkgUERLX0ZVU0lPTl9QTEFURk9STV9aSVAgaXMgcGFzc2VkIGluIGZyb20gdGhlIGVudmlyb25tZW50CisjIDEpIFBES19GVVNJT05fUExBVEZPUk1fWklQIC8gUERLX0ZVU0lPTl9QTEFURk9STV9ESVIgaXMgcGFzc2VkIGluIGZyb20gdGhlIGVudmlyb25tZW50CiAjIG9yCi0jIDIpIHRoZSBwbGF0Zm9ybS56aXAgZXhpc3RzIGluIHRoZSBkZWZhdWx0IGxvY2F0aW9uCisjIDIpIHRoZSBwbGF0Zm9ybS56aXAgLyBwZGsubWsgZXhpc3RzIGluIHRoZSBkZWZhdWx0IGxvY2F0aW9uCiAjIG9yCiAjIDMpIGZ1c2lvbiBpcyBhIGNvbW1hbmQgbGluZSBidWlsZCBnb2FsLAogIyAgICBQREtfRlVTSU9OX1BMQVRGT1JNX1pJUCBpcyBuZWVkZWQgYW55d2F5LCB0aGVuIGRvIHdlIG5lZWQgdGhlICdmdXNpb24nIGdvYWw/CkBAIC00NDMsMjcgKzQ2Miw0NCBAQAogIyBvcgogIyAyKSBUQVJHRVRfQlVJTERfUERLIGlzIHBhc3NlZCBpbiBmcm9tIHRoZSBlbnZpcm9ubWVudAogCi0jIGlmIFBES19GVVNJT05fUExBVEZPUk1fWklQIGlzIHNwZWNpZmllZCwgZG8gbm90IG92ZXJyaWRlLgotaWZuZGVmIFBES19GVVNJT05fUExBVEZPUk1fWklQCi0jIE1vc3QgUERLIHByb2plY3QgcGF0aHMgc2hvdWxkIGJlIHVzaW5nIHZlbmRvci9wZGsvVEFSR0VUX0RFVklDRQotIyBidXQgc29tZSBsZWdhY3kgb25lcyAoZS5nLiBtaW5pX2FybXY3YV9uZW9uIGdlbmVyaWMgUERLKSB3ZXJlIHNldHVwCi0jIHdpdGggdmVuZG9yL3Bkay9UQVJHRVRfUFJPRFVDVC4KLV9wZGtfZnVzaW9uX2RlZmF1bHRfcGxhdGZvcm1femlwID0gJChzdHJpcCBcCi0gICQod2lsZGNhcmQgdmVuZG9yL3Bkay8kKFRBUkdFVF9ERVZJQ0UpLyQoVEFSR0VUX1BST0RVQ1QpLSQoVEFSR0VUX0JVSUxEX1ZBUklBTlQpL3BsYXRmb3JtL3BsYXRmb3JtLnppcCkgXAotICAkKHdpbGRjYXJkIHZlbmRvci9wZGsvJChUQVJHRVRfREVWSUNFKS8kKHBhdHN1YnN0IGFvc3BfJSxmdWxsXyUsJChUQVJHRVRfUFJPRFVDVCkpLSQoVEFSR0VUX0JVSUxEX1ZBUklBTlQpL3BsYXRmb3JtL3BsYXRmb3JtLnppcCkgXAotICAkKHdpbGRjYXJkIHZlbmRvci9wZGsvJChUQVJHRVRfUFJPRFVDVCkvJChUQVJHRVRfUFJPRFVDVCktJChUQVJHRVRfQlVJTERfVkFSSUFOVCkvcGxhdGZvcm0vcGxhdGZvcm0uemlwKSBcCi0gICQod2lsZGNhcmQgdmVuZG9yL3Bkay8kKFRBUkdFVF9QUk9EVUNUKS8kKHBhdHN1YnN0IGFvc3BfJSxmdWxsXyUsJChUQVJHRVRfUFJPRFVDVCkpLSQoVEFSR0VUX0JVSUxEX1ZBUklBTlQpL3BsYXRmb3JtL3BsYXRmb3JtLnppcCkpCi1pZm5lcSAoLCQoX3Bka19mdXNpb25fZGVmYXVsdF9wbGF0Zm9ybV96aXApKQotUERLX0ZVU0lPTl9QTEFURk9STV9aSVAgOj0gJCh3b3JkIDEsICQoX3Bka19mdXNpb25fZGVmYXVsdF9wbGF0Zm9ybV96aXApKQotVEFSR0VUX0JVSUxEX1BESyA6PSB0cnVlCi1lbmRpZiAjIF9wZGtfZnVzaW9uX2RlZmF1bHRfcGxhdGZvcm1femlwCi1lbmRpZiAjICFQREtfRlVTSU9OX1BMQVRGT1JNX1pJUAorIyBpZiBQREtfRlVTSU9OX1BMQVRGT1JNX1pJUCBvciBQREtfRlVTSU9OX1BMQVRGT1JNX0RJUiBpcyBzcGVjaWZpZWQsIGRvIG5vdCBvdmVycmlkZS4KK2lmZXEgKCwkKHN0cmlwICQoUERLX0ZVU0lPTl9QTEFURk9STV9aSVApJChQREtfRlVTSU9OX1BMQVRGT1JNX0RJUikpKQorICAjIE1vc3QgUERLIHByb2plY3QgcGF0aHMgc2hvdWxkIGJlIHVzaW5nIHZlbmRvci9wZGsvVEFSR0VUX0RFVklDRQorICAjIGJ1dCBzb21lIGxlZ2FjeSBvbmVzIChlLmcuIG1pbmlfYXJtdjdhX25lb24gZ2VuZXJpYyBQREspIHdlcmUgc2V0dXAKKyAgIyB3aXRoIHZlbmRvci9wZGsvVEFSR0VUX1BST0RVQ1QuCisgICMgT3RoZXJzIGFyZSBzZXQgdXAgd2l0aCB2ZW5kb3IvcGRrL1RBUkdFVF9ERVZJQ0UvVEFSR0VUX0RFVklDRS11c2VyZGVidWcKKyAgX3Bka19mdXNpb25fc2VhcmNoX3BhdGhzIDo9IFwKKyAgICB2ZW5kb3IvcGRrLyQoVEFSR0VUX0RFVklDRSkvJChUQVJHRVRfREVWSUNFKS0kKFRBUkdFVF9CVUlMRF9WQVJJQU5UKS9wbGF0Zm9ybSBcCisgICAgdmVuZG9yL3Bkay8kKFRBUkdFVF9ERVZJQ0UpLyQoVEFSR0VUX1BST0RVQ1QpLSQoVEFSR0VUX0JVSUxEX1ZBUklBTlQpL3BsYXRmb3JtIFwKKyAgICB2ZW5kb3IvcGRrLyQoVEFSR0VUX0RFVklDRSkvJChwYXRzdWJzdCBhb3NwXyUsZnVsbF8lLCQoVEFSR0VUX1BST0RVQ1QpKS0kKFRBUkdFVF9CVUlMRF9WQVJJQU5UKS9wbGF0Zm9ybSBcCisgICAgdmVuZG9yL3Bkay8kKFRBUkdFVF9QUk9EVUNUKS8kKFRBUkdFVF9QUk9EVUNUKS0kKFRBUkdFVF9CVUlMRF9WQVJJQU5UKS9wbGF0Zm9ybSBcCisgICAgdmVuZG9yL3Bkay8kKFRBUkdFVF9QUk9EVUNUKS8kKHBhdHN1YnN0IGFvc3BfJSxmdWxsXyUsJChUQVJHRVRfUFJPRFVDVCkpLSQoVEFSR0VUX0JVSUxEX1ZBUklBTlQpL3BsYXRmb3JtCisKKyAgX3Bka19mdXNpb25fZGVmYXVsdF9wbGF0Zm9ybV96aXAgOj0gJChzdHJpcCAkKGZvcmVhY2ggcCwkKF9wZGtfZnVzaW9uX3NlYXJjaF9wYXRocyksJCh3aWxkY2FyZCAkKHApL3BsYXRmb3JtLnppcCkpKQorICBpZm5lcSAoLCQoX3Bka19mdXNpb25fZGVmYXVsdF9wbGF0Zm9ybV96aXApKQorICAgIFBES19GVVNJT05fUExBVEZPUk1fWklQIDo9ICQod29yZCAxLCAkKF9wZGtfZnVzaW9uX2RlZmF1bHRfcGxhdGZvcm1femlwKSkKKyAgICBfcGRrX2Z1c2lvbl9kZWZhdWx0X3BsYXRmb3JtX3ppcCA6PQorICBlbHNlCisgICAgX3Bka19mdXNpb25fZGVmYXVsdF9wbGF0Zm9ybV9tayA6PSAkKHN0cmlwICQoZm9yZWFjaCBwLCQoX3Bka19mdXNpb25fc2VhcmNoX3BhdGhzKSwkKHdpbGRjYXJkICQocCkvcGRrLm1rKSkpCisgICAgaWZuZXEgKCwkKF9wZGtfZnVzaW9uX2RlZmF1bHRfcGxhdGZvcm1fbWspKQorICAgICAgUERLX0ZVU0lPTl9QTEFURk9STV9ESVIgOj0gJChkaXIgJCh3b3JkIDEsJChfcGRrX2Z1c2lvbl9kZWZhdWx0X3BsYXRmb3JtX21rKSkpCisgICAgICBfcGRrX2Z1c2lvbl9kZWZhdWx0X3BsYXRmb3JtX21rIDo9CisgICAgZW5kaWYKKyAgZW5kaWYgIyBfcGRrX2Z1c2lvbl9kZWZhdWx0X3BsYXRmb3JtX3ppcAorICBfcGRrX2Z1c2lvbl9zZWFyY2hfcGF0aHMgOj0KK2VuZGlmICMgIVBES19GVVNJT05fUExBVEZPUk1fWklQICYmICFQREtfRlVTSU9OX1BMQVRGT1JNX0RJUgorCitpZm5lcSAoLCQoUERLX0ZVU0lPTl9QTEFURk9STV9aSVApKQorICBpZm5lcSAoLCQoUERLX0ZVU0lPTl9QTEFURk9STV9ESVIpKQorICAgICQoZXJyb3IgT25seSBvbmUgb2YgUERLX0ZVU0lPTl9QTEFURk9STV9aSVAgb3IgUERLX0ZVU0lPTl9QTEFURk9STV9ESVIgbWF5IGJlIHNwZWNpZmllZCkKKyAgZW5kaWYKK2VuZGlmCiAKIGlmbmVxICgsJChmaWx0ZXIgcGRrIGZ1c2lvbiwgJChNQUtFQ01ER09BTFMpKSkKIFRBUkdFVF9CVUlMRF9QREsgOj0gdHJ1ZQogaWZuZXEgKCwkKGZpbHRlciBmdXNpb24sICQoTUFLRUNNREdPQUxTKSkpCi1pZm5kZWYgUERLX0ZVU0lPTl9QTEFURk9STV9aSVAKLSAgJChlcnJvciBTcGVjaWZ5IFBES19GVVNJT05fUExBVEZPUk1fWklQIHRvIGRvIGEgUERLIGZ1c2lvbi4pCitpZmVxICgsJChzdHJpcCAkKFBES19GVVNJT05fUExBVEZPUk1fWklQKSQoUERLX0ZVU0lPTl9QTEFURk9STV9ESVIpKSkKKyAgJChlcnJvciBTcGVjaWZ5IFBES19GVVNJT05fUExBVEZPUk1fWklQIG9yIFBES19GVVNJT05fUExBVEZPUk1fRElSIHRvIGRvIGEgUERLIGZ1c2lvbi4pCiBlbmRpZgogZW5kaWYgICMgZnVzaW9uCiBlbmRpZiAgIyBwZGsgb3IgZnVzaW9uCkBAIC00NzEsNyArNTA3LDE5IEBACiBpZmRlZiBQREtfRlVTSU9OX1BMQVRGT1JNX1pJUAogVEFSR0VUX0JVSUxEX1BESyA6PSB0cnVlCiBpZmVxICgsJCh3aWxkY2FyZCAkKFBES19GVVNJT05fUExBVEZPUk1fWklQKSkpCi0gICQoZXJyb3IgQ2Fubm90IGZpbmQgZmlsZSAkKFBES19GVVNJT05fUExBVEZPUk1fWklQKS4pCisgIGlmbmVxICgsJCh3aWxkY2FyZCAkKGRpciAkKFBES19GVVNJT05fUExBVEZPUk1fWklQKSkvcGRrLm1rKSkKKyAgICBQREtfRlVTSU9OX1BMQVRGT1JNX0RJUiA6PSAkKGRpciAkKFBES19GVVNJT05fUExBVEZPUk1fWklQKSkKKyAgICBQREtfRlVTSU9OX1BMQVRGT1JNX1pJUCA6PQorICBlbHNlCisgICAgJChlcnJvciBDYW5ub3QgZmluZCBmaWxlICQoUERLX0ZVU0lPTl9QTEFURk9STV9aSVApLikKKyAgZW5kaWYKK2VuZGlmCitlbmRpZgorCitpZmRlZiBQREtfRlVTSU9OX1BMQVRGT1JNX0RJUgorVEFSR0VUX0JVSUxEX1BESyA6PSB0cnVlCitpZmVxICgsJCh3aWxkY2FyZCAkKFBES19GVVNJT05fUExBVEZPUk1fRElSKS9wZGsubWspKQorICAkKGVycm9yIENhbm5vdCBmaW5kIGZpbGUgJChQREtfRlVTSU9OX1BMQVRGT1JNX0RJUikvcGRrLm1rLikKIGVuZGlmCiBlbmRpZgogCkBAIC00OTcsOCArNTQ1LDI5IEBACiBwcmVidWlsdF9zZGtfdG9vbHMgOj0gcHJlYnVpbHRzL3Nkay90b29scwogcHJlYnVpbHRfc2RrX3Rvb2xzX2JpbiA6PSAkKHByZWJ1aWx0X3Nka190b29scykvJChIT1NUX09TKS9iaW4KIAorIyBBbHdheXMgdXNlIHByZWJ1aWx0cyBmb3IgY2thdGkgYW5kIG1ha2VwYXJhbGxlbAorcHJlYnVpbHRfYnVpbGRfdG9vbHMgOj0gcHJlYnVpbHRzL2J1aWxkLXRvb2xzCitwcmVidWlsdF9idWlsZF90b29sc193cmFwcGVycyA6PSBwcmVidWlsdHMvYnVpbGQtdG9vbHMvY29tbW9uL2JpbgorcHJlYnVpbHRfYnVpbGRfdG9vbHNfamFycyA6PSBwcmVidWlsdHMvYnVpbGQtdG9vbHMvY29tbW9uL2ZyYW1ld29yaworaWZlcSAoJChmaWx0ZXIgYWRkcmVzcywkKFNBTklUSVpFX0hPU1QpKSwpCitwcmVidWlsdF9idWlsZF90b29sc19iaW4gOj0gJChwcmVidWlsdF9idWlsZF90b29scykvJChIT1NUX1BSRUJVSUxUX1RBRykvYmluCitlbHNlCitwcmVidWlsdF9idWlsZF90b29sc19iaW4gOj0gJChwcmVidWlsdF9idWlsZF90b29scykvJChIT1NUX1BSRUJVSUxUX1RBRykvYXNhbi9iaW4KK2VuZGlmCisKIFVTRV9QUkVCVUlMVF9TREtfVE9PTFNfSU5fUExBQ0UgOj0gdHJ1ZQogCisjIFdvcmsgYXJvdW5kIGZvciBiLzY4NDA2MjIwCisjIFRoaXMgc2hvdWxkIG1hdGNoIHRoZSBzb29uZyB2ZXJzaW9uLgoraWZuZGVmIFVTRV9EOAorICBVU0VfRDggOj0gdHJ1ZQorZW5kaWYKKworIyBEZWZhdWx0IFI4IGJlaGF2aW9yIHdoZW4gVVNFX1I4IGlzIG5vdCBzcGVjaWZpZWQuCitpZm5kZWYgVVNFX1I4CisgIFVTRV9SOCA6PSBmYWxzZQorZW5kaWYKKwogIwogIyBUb29scyB0aGF0IGFyZSBwcmVidWlsdHMgZm9yIFRBUkdFVF9CVUlMRF9BUFBTCiAjCkBAIC01MDYsMjggKzU3NSwyMSBAQAogICBBSURMIDo9ICQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL2FpZGwKICAgQUFQVCA6PSAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9hYXB0CiAgIEFBUFQyIDo9ICQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL2FhcHQyCisgIERFU1VHQVIgOj0gJChIT1NUX09VVF9KQVZBX0xJQlJBUklFUykvZGVzdWdhci5qYXIKICAgTUFJTkRFWENMQVNTRVMgOj0gJChIT1NUX09VVF9FWEVDVVRBQkxFUykvbWFpbkRleENsYXNzZXMKICAgU0lHTkFQS19KQVIgOj0gJChIT1NUX09VVF9KQVZBX0xJQlJBUklFUykvc2lnbmFwayQoQ09NTU9OX0pBVkFfUEFDS0FHRV9TVUZGSVgpCiAgIFNJR05BUEtfSk5JX0xJQlJBUllfUEFUSCA6PSAkKEhPU1RfT1VUX1NIQVJFRF9MSUJSQVJJRVMpCiAgIFpJUEFMSUdOIDo9ICQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL3ppcGFsaWduCiAKLSAgaWZuZGVmIERYX0FMVF9KQVIKLSAgICBEWCA6PSAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9keAotICAgIERYX0NPTU1BTkQgOj0gJChEWCkgLUpYbXMxNk0gLUpYbXgyMDQ4TQotICBlbHNlCi0gICAgRFggOj0gJChEWF9BTFRfSkFSKQotICAgIERYX0NPTU1BTkQgOj0gJChKQVZBKSAtWG1zMTZNIC1YbXgyMDQ4TSAtamFyICQoRFgpCi0gIGVuZGlmCiBlbHNlICMgVEFSR0VUX0JVSUxEX0FQUFMgfHwgVEFSR0VUX0JVSUxEX1BESwotICBBSURMIDo9ICQocHJlYnVpbHRfc2RrX3Rvb2xzX2JpbikvYWlkbAorICBBSURMIDo9ICQocHJlYnVpbHRfYnVpbGRfdG9vbHNfYmluKS9haWRsCiAgIEFBUFQgOj0gJChwcmVidWlsdF9zZGtfdG9vbHNfYmluKS9hYXB0CiAgIEFBUFQyIDo9ICQocHJlYnVpbHRfc2RrX3Rvb2xzX2JpbikvYWFwdDIKLSAgRFggOj0gJChwcmVidWlsdF9zZGtfdG9vbHMpL2R4Ci0gIERYX0NPTU1BTkQgOj0gJChEWCkgLUpYbXMxNk0gLUpYbXgyMDQ4TQorICBERVNVR0FSIDo9ICQocHJlYnVpbHRfYnVpbGRfdG9vbHNfamFycykvZGVzdWdhci5qYXIKICAgTUFJTkRFWENMQVNTRVMgOj0gJChwcmVidWlsdF9zZGtfdG9vbHMpL21haW5EZXhDbGFzc2VzCi0gIFpJUEFMSUdOIDo9ICQocHJlYnVpbHRfc2RrX3Rvb2xzX2JpbikvemlwYWxpZ24KICAgU0lHTkFQS19KQVIgOj0gJChwcmVidWlsdF9zZGtfdG9vbHMpL2xpYi9zaWduYXBrJChDT01NT05fSkFWQV9QQUNLQUdFX1NVRkZJWCkKICAgU0lHTkFQS19KTklfTElCUkFSWV9QQVRIIDo9ICQocHJlYnVpbHRfc2RrX3Rvb2xzKS8kKEhPU1RfT1MpL2xpYjY0CisgIFpJUEFMSUdOIDo9ICQocHJlYnVpbHRfYnVpbGRfdG9vbHNfYmluKS96aXBhbGlnbgogZW5kaWYgIyBUQVJHRVRfQlVJTERfQVBQUyB8fCBUQVJHRVRfQlVJTERfUERLCiAKIGlmZXEgKCwkKFRBUkdFVF9CVUlMRF9BUFBTKSkKQEAgLTU0MiwzOCArNjA0LDMwIEBACiBwcmVidWlsdF9zZGtfdG9vbHMgOj0KIHByZWJ1aWx0X3Nka190b29sc19iaW4gOj0KIAotIyBBbHdheXMgdXNlIHByZWJ1aWx0cyBmb3IgY2thdGkgYW5kIG1ha2VwYXJhbGxlbAotcHJlYnVpbHRfYnVpbGRfdG9vbHMgOj0gcHJlYnVpbHRzL2J1aWxkLXRvb2xzCi1pZmVxICgkKGZpbHRlciBhZGRyZXNzLCQoU0FOSVRJWkVfSE9TVCkpLCkKLXByZWJ1aWx0X2J1aWxkX3Rvb2xzX2JpbiA6PSAkKHByZWJ1aWx0X2J1aWxkX3Rvb2xzKS8kKEhPU1RfUFJFQlVJTFRfVEFHKS9iaW4KLWVsc2UKLXByZWJ1aWx0X2J1aWxkX3Rvb2xzX2JpbiA6PSAkKHByZWJ1aWx0X2J1aWxkX3Rvb2xzKS8kKEhPU1RfUFJFQlVJTFRfVEFHKS9hc2FuL2JpbgotZW5kaWYKLQogQUNQIDo9ICQocHJlYnVpbHRfYnVpbGRfdG9vbHNfYmluKS9hY3AKIENLQVRJIDo9ICQocHJlYnVpbHRfYnVpbGRfdG9vbHNfYmluKS9ja2F0aQogREVQTU9EIDo9ICQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL2RlcG1vZAogRklMRVNMSVNUIDo9ICQoU09PTkdfSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL2ZpbGVzbGlzdAotSUpBUiA6PSAkKHByZWJ1aWx0X2J1aWxkX3Rvb2xzX2JpbikvaWphcgogTUFLRVBBUkFMTEVMIDo9ICQocHJlYnVpbHRfYnVpbGRfdG9vbHNfYmluKS9tYWtlcGFyYWxsZWwKIFNPT05HX0pBVkFDX1dSQVBQRVIgOj0gJChTT09OR19IT1NUX09VVF9FWEVDVVRBQkxFUykvc29vbmdfamF2YWNfd3JhcHBlcgogU09PTkdfWklQIDo9ICQoU09PTkdfSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL3Nvb25nX3ppcAorTUVSR0VfWklQUyA6PSAkKFNPT05HX0hPU1RfT1VUX0VYRUNVVEFCTEVTKS9tZXJnZV96aXBzCitYTUxMSU5UIDo9ICQoU09PTkdfSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL3htbGxpbnQKIFpJUDJaSVAgOj0gJChTT09OR19IT1NUX09VVF9FWEVDVVRBQkxFUykvemlwMnppcAogWklQVElNRSA6PSAkKHByZWJ1aWx0X2J1aWxkX3Rvb2xzX2JpbikvemlwdGltZQogCiAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIyBHZW5lcmljIHRvb2xzLgotSkFDSyA6PSAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9qYWNrCiAKIExFWCA6PSBwcmVidWlsdHMvbWlzYy8kKEJVSUxEX09TKS0kKEhPU1RfUFJFQlVJTFRfQVJDSCkvZmxleC9mbGV4LTIuNS4zOQogIyBUaGUgZGVmYXVsdCBQS0dEQVRBRElSIGJ1aWx0IGluIHRoZSBwcmVidWlsdCBiaXNvbiBpcyBhIHJlbGF0aXZlIHBhdGgKLSMgZXh0ZXJuYWwvYmlzb24vZGF0YS4KKyMgcHJlYnVpbHRzL2J1aWxkLXRvb2xzL2NvbW1vbi9iaXNvbi4KICMgVG8gcnVuIGJpc29uIGZyb20gZWxzZXdoZXJlIHlvdSBuZWVkIHRvIHNldCB1cCBlbnZpcm9tZW50YWwgdmFyaWFibGUKICMgQklTT05fUEtHREFUQURJUi4KLUJJU09OX1BLR0RBVEFESVIgOj0gJChQV0QpL2V4dGVybmFsL2Jpc29uL2RhdGEKLUJJU09OIDo9IHByZWJ1aWx0cy9taXNjLyQoQlVJTERfT1MpLSQoSE9TVF9QUkVCVUlMVF9BUkNIKS9iaXNvbi9iaXNvbgorQklTT05fUEtHREFUQURJUiA6PSAkKFBXRCkvcHJlYnVpbHRzL2J1aWxkLXRvb2xzL2NvbW1vbi9iaXNvbgorQklTT04gOj0gcHJlYnVpbHRzL2J1aWxkLXRvb2xzLyQoQlVJTERfT1MpLSQoSE9TVF9QUkVCVUlMVF9BUkNIKS9iaW4vYmlzb24KIFlBQ0MgOj0gJChCSVNPTikgLWQKLUJJU09OX0RBVEEgOj0gJCh3aWxkY2FyZCBleHRlcm5hbC9iaXNvbi9kYXRhLyogZXh0ZXJuYWwvYmlzb24vZGF0YS8qLyopCitCSVNPTl9EQVRBIDo9ICQod2lsZGNhcmQgJChCSVNPTl9QS0dEQVRBRElSKS8qICQoQklTT05fUEtHREFUQURJUikvKi8qKQogCiBZQVNNIDo9IHByZWJ1aWx0cy9taXNjLyQoQlVJTERfT1MpLSQoSE9TVF9QUkVCVUlMVF9BUkNIKS95YXNtL3lhc20KIApAQCAtNTkyLDcgKzY0Niw3IEBACiBWVFNDIDo9ICQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL3Z0c2MkKEhPU1RfRVhFQ1VUQUJMRV9TVUZGSVgpCiBNS0JPT1RGUyA6PSAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9ta2Jvb3RmcyQoSE9TVF9FWEVDVVRBQkxFX1NVRkZJWCkKIE1JTklHWklQIDo9ICQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL21pbmlnemlwJChIT1NUX0VYRUNVVEFCTEVfU1VGRklYKQotQlJPIDo9ICQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL2JybyQoSE9TVF9FWEVDVVRBQkxFX1NVRkZJWCkKK0JST1RMSSA6PSAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9icm90bGkkKEhPU1RfRVhFQ1VUQUJMRV9TVUZGSVgpCiBpZmVxICgsJChzdHJpcCAkKEJPQVJEX0NVU1RPTV9NS0JPT1RJTUcpKSkKIE1LQk9PVElNRyA6PSAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9ta2Jvb3RpbWckKEhPU1RfRVhFQ1VUQUJMRV9TVUZGSVgpCiBlbHNlCkBAIC02MTAsMTUgKzY2NCw5IEBACiBlbmRpZgogQVBJQ0hFQ0sgOj0gJChIT1NUX09VVF9FWEVDVVRBQkxFUykvYXBpY2hlY2skKEhPU1RfRVhFQ1VUQUJMRV9TVUZGSVgpCiBGU19HRVRfU1RBVFMgOj0gJChIT1NUX09VVF9FWEVDVVRBQkxFUykvZnNfZ2V0X3N0YXRzJChIT1NUX0VYRUNVVEFCTEVfU1VGRklYKQotaWZlcSAoJChUQVJHRVRfVVNFU19NS0UyRlMpLHRydWUpCiBNQUtFX0VYVDRGUyA6PSAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9ta2UyZnMkKEhPU1RfRVhFQ1VUQUJMRV9TVUZGSVgpCiBNS0VYVFVTRVJJTUcgOj0gJChIT1NUX09VVF9FWEVDVVRBQkxFUykvbWt1c2VyaW1nX21rZTJmcy5zaAogTUtFMkZTX0NPTkYgOj0gc3lzdGVtL2V4dHJhcy9leHQ0X3V0aWxzL21rZTJmcy5jb25mCi1lbHNlCi1NQUtFX0VYVDRGUyA6PSAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9tYWtlX2V4dDRmcyQoSE9TVF9FWEVDVVRBQkxFX1NVRkZJWCkKLU1LRVhUVVNFUklNRyA6PSAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9ta3VzZXJpbWcuc2gKLU1LRTJGU19DT05GIDo9Ci1lbmRpZgogQkxLX0FMTE9DX1RPX0JBU0VfRlMgOj0gJChIT1NUX09VVF9FWEVDVVRBQkxFUykvYmxrX2FsbG9jX3RvX2Jhc2VfZnMkKEhPU1RfRVhFQ1VUQUJMRV9TVUZGSVgpCiBNQUtFX1NRVUFTSEZTIDo9ICQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL21rc3F1YXNoZnMkKEhPU1RfRVhFQ1VUQUJMRV9TVUZGSVgpCiBNS1NRVUFTSEZTVVNFUklNRyA6PSAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9ta3NxdWFzaGZzaW1hZ2Uuc2gKQEAgLTYyNywzMSArNjc1LDE3IEBACiBTSU1HMklNRyA6PSAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9zaW1nMmltZyQoSE9TVF9FWEVDVVRBQkxFX1NVRkZJWCkKIElNRzJTSU1HIDo9ICQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL2ltZzJzaW1nJChIT1NUX0VYRUNVVEFCTEVfU1VGRklYKQogRTJGU0NLIDo9ICQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL2UyZnNjayQoSE9TVF9FWEVDVVRBQkxFX1NVRkZJWCkKLU1LVEFSQkFMTCA6PSBidWlsZC90b29scy9ta3RhcmJhbGwuc2gKK01LVEFSQkFMTCA6PSBidWlsZC9tYWtlL3Rvb2xzL21rdGFyYmFsbC5zaAogVFVORTJGUyA6PSAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS90dW5lMmZzJChIT1NUX0VYRUNVVEFCTEVfU1VGRklYKQogSkFSSkFSIDo9ICQoSE9TVF9PVVRfSkFWQV9MSUJSQVJJRVMpL2phcmphci5qYXIKLURFU1VHQVIgOj0gJChIT1NUX09VVF9KQVZBX0xJQlJBUklFUykvZGVzdWdhci5qYXIKIERBVEFfQklORElOR19DT01QSUxFUiA6PSAkKEhPU1RfT1VUX0pBVkFfTElCUkFSSUVTKS9kYXRhYmluZGluZy1jb21waWxlci5qYXIKLUZBVDE2Q09QWSA6PSBidWlsZC90b29scy9mYXQxNmNvcHkucHkKLUNIRUNLX0xJTktfVFlQRSA6PSBidWlsZC90b29scy9jaGVja19saW5rX3R5cGUucHkKLQotaWZlcSAoJChBTkRST0lEX0NPTVBJTEVfV0lUSF9KQUNLKSx0cnVlKQotREVGQVVMVF9KQUNLX0VOQUJMRUQ6PWZ1bGwKLWVsc2UKLURFRkFVTFRfSkFDS19FTkFCTEVEOj0KLWVuZGlmCi1pZm5lcSAoJChBTkRST0lEX0pBQ0tfRVhUUkFfQVJHUyksKQotSkFDS19ERUZBVUxUX0FSR1MgOj0KLURFRkFVTFRfSkFDS19FWFRSQV9BUkdTIDo9ICQoQU5EUk9JRF9KQUNLX0VYVFJBX0FSR1MpCi1lbHNlCi1KQUNLX0RFRkFVTFRfQVJHUyA6PSAkKEJVSUxEX1NZU1RFTSkvamFjay1kZWZhdWx0LmFyZ3MKLURFRkFVTFRfSkFDS19FWFRSQV9BUkdTIDo9IEAkKEpBQ0tfREVGQVVMVF9BUkdTKQotZW5kaWYKK0ZBVDE2Q09QWSA6PSBidWlsZC9tYWtlL3Rvb2xzL2ZhdDE2Y29weS5weQorQ0hFQ0tfTElOS19UWVBFIDo9IGJ1aWxkL21ha2UvdG9vbHMvY2hlY2tfbGlua190eXBlLnB5CiAKIFBST0dVQVJEIDo9IGV4dGVybmFsL3Byb2d1YXJkL2Jpbi9wcm9ndWFyZC5zaAotSkFWQVRBR1MgOj0gYnVpbGQvdG9vbHMvamF2YS1ldmVudC1sb2ctdGFncy5weQotTUVSR0VUQUdTIDo9IGJ1aWxkL3Rvb2xzL21lcmdlLWV2ZW50LWxvZy10YWdzLnB5Ci1CVUlMRF9JTUFHRV9TUkNTIDo9ICQod2lsZGNhcmQgYnVpbGQvdG9vbHMvcmVsZWFzZXRvb2xzLyoucHkpCitKQVZBVEFHUyA6PSBidWlsZC9tYWtlL3Rvb2xzL2phdmEtZXZlbnQtbG9nLXRhZ3MucHkKK01FUkdFVEFHUyA6PSBidWlsZC9tYWtlL3Rvb2xzL21lcmdlLWV2ZW50LWxvZy10YWdzLnB5CitCVUlMRF9JTUFHRV9TUkNTIDo9ICQod2lsZGNhcmQgYnVpbGQvbWFrZS90b29scy9yZWxlYXNldG9vbHMvKi5weSkKIEFQUEVORDJTSU1HIDo9ICQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL2FwcGVuZDJzaW1nCiBWRVJJVFlfU0lHTkVSIDo9ICQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL3Zlcml0eV9zaWduZXIKIEJVSUxEX1ZFUklUWV9UUkVFIDo9ICQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL2J1aWxkX3Zlcml0eV90cmVlCkBAIC02NjMsNDMgKzY5Nyw0OCBAQAogCiBERVhEVU1QIDo9ICQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL2RleGR1bXAyJChCVUlMRF9FWEVDVVRBQkxFX1NVRkZJWCkKIFBST0ZNQU4gOj0gJChIT1NUX09VVF9FWEVDVVRBQkxFUykvcHJvZm1hbgorSElEREVOQVBJIDo9ICQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL2hpZGRlbmFwaQogCiAjIHJlbG9jYXRpb24gcGFja2VyCiBSRUxPQ0FUSU9OX1BBQ0tFUiA6PSBwcmVidWlsdHMvbWlzYy8kKEJVSUxEX09TKS0kKEhPU1RfUFJFQlVJTFRfQVJDSCkvcmVsb2NhdGlvbl9wYWNrZXIvcmVsb2NhdGlvbl9wYWNrZXIKIAogRklOREJVR1NfRElSIDo9IGV4dGVybmFsL293YXNwL3Nhbml0aXplci90b29scy9maW5kYnVncy9iaW4KIEZJTkRCVUdTIDo9ICQoRklOREJVR1NfRElSKS9maW5kYnVncwotSkFDT0NPX0NMSV9KQVIgOj0gJChIT1NUX09VVF9KQVZBX0xJQlJBUklFUykvamFjb2NvLWNsaSQoQ09NTU9OX0pBVkFfUEFDS0FHRV9TVUZGSVgpCisKK0pFVElGSUVSIDo9IHByZWJ1aWx0cy9zZGsvdG9vbHMvamV0aWZpZXIvamV0aWZpZXItc3RhbmRhbG9uZS9iaW4vamV0aWZpZXItc3RhbmRhbG9uZQogCiAjIFRvb2wgdG8gbWVyZ2UgQW5kcm9pZE1hbmlmZXN0LnhtbHMKLUFORFJPSURfTUFOSUZFU1RfTUVSR0VSIDo9ICQoSkFWQSkgLWNsYXNzcGF0aCBwcmVidWlsdHMvZGV2dG9vbHMvdG9vbHMvbGliL21hbmlmZXN0LW1lcmdlci5qYXIgY29tLmFuZHJvaWQubWFuaWZtZXJnZXIuTWFpbiBtZXJnZQorQU5EUk9JRF9NQU5JRkVTVF9NRVJHRVJfQ0xBU1NQQVRIIDo9IFwKKyAgICBwcmVidWlsdHMvZ3JhZGxlLXBsdWdpbi9jb20vYW5kcm9pZC90b29scy9idWlsZC9tYW5pZmVzdC1tZXJnZXIvMjYuMC4wLWJldGEyL21hbmlmZXN0LW1lcmdlci0yNi4wLjAtYmV0YTIuamFyIFwKKyAgICBwcmVidWlsdHMvZ3JhZGxlLXBsdWdpbi9jb20vYW5kcm9pZC90b29scy9zZGstY29tbW9uLzI2LjAuMC1iZXRhMi9zZGstY29tbW9uLTI2LjAuMC1iZXRhMi5qYXIgXAorICAgIHByZWJ1aWx0cy9ncmFkbGUtcGx1Z2luL2NvbS9hbmRyb2lkL3Rvb2xzL2NvbW1vbi8yNi4wLjAtYmV0YTIvY29tbW9uLTI2LjAuMC1iZXRhMi5qYXIgXAorICAgIHByZWJ1aWx0cy9taXNjL2NvbW1vbi9ndWF2YS9ndWF2YS0yMS4wLmphcgorQU5EUk9JRF9NQU5JRkVTVF9NRVJHRVIgOj0gJChKQVZBKSBcCisgICAgLWNsYXNzcGF0aCAkKHN1YnN0ICQoc3BhY2UpLDosJChzdHJpcCAkKEFORFJPSURfTUFOSUZFU1RfTUVSR0VSX0NMQVNTUEFUSCkpKSBcCisgICAgY29tLmFuZHJvaWQubWFuaWZtZXJnZXIuTWVyZ2VyCiAKIENPTFVNTjo9IGNvbHVtbgogCi0jIFdlIG1heSBub3QgaGF2ZSB0aGUgcmlnaHQgSkFWQV9IT01FL1BBVEggc2V0IHVwIHlldCB3aGVuIHRoaXMgaXMgcnVuIGZyb20gZW52c2V0dXAuc2guCi1pZm5lcSAoJChDQUxMRURfRlJPTV9TRVRVUCksdHJ1ZSkKLQotIyBQYXRoIHRvIHRvb2xzLmphciwgb3IgZW1wdHkgaWYgRVhQRVJJTUVOVEFMX1VTRV9PUEVOSkRLOSBpcyBzZXQKLUhPU1RfSkRLX1RPT0xTX0pBUiA6PQotIyBUT0RPOiBSZW1vdmUgSE9TVF9KREtfVE9PTFNfSkFSIGFuZCBhbGwgcmVmZXJlbmNlcyB0byBpdCBvbmNlIE9wZW5KREsgOAotIyB0b29sY2hhaW5zIGFyZSBubyBsb25nZXIgc3VwcG9ydGVkIChpLmUuIHdoZW4gd2hhdCBpcyBub3cKLSMgRVhQRVJJTUVOVEFMX1VTRV9PUEVOSkRLOSBiZWNvbWVzIHRoZSBzdGFuZGFyZCkuIGh0dHA6Ly9iLzM4NDE4MjIwCiBpZmVxICgkKEVYUEVSSU1FTlRBTF9VU0VfT1BFTkpESzkpLCkKLUhPU1RfSkRLX1RPT0xTX0pBUiA6PSAkKHNoZWxsICQoQlVJTERfU1lTVEVNKS9maW5kLWpkay10b29scy1qYXIuc2gpCitpZmVxICgkKFJVTl9FUlJPUl9QUk9ORSksdHJ1ZSkKK1VTRV9PUEVOSkRLOSA6PQorZWxzZQorVVNFX09QRU5KREs5IDo9IHRydWUKK2VuZGlmCitUQVJHRVRfT1BFTkpESzkgOj0KK2Vsc2UgaWZlcSAoJChFWFBFUklNRU5UQUxfVVNFX09QRU5KREs5KSxmYWxzZSkKK1VTRV9PUEVOSkRLOSA6PQorVEFSR0VUX09QRU5KREs5IDo9CitlbHNlIGlmZXEgKCQoRVhQRVJJTUVOVEFMX1VTRV9PUEVOSkRLOSksMS44KQorVVNFX09QRU5KREs5IDo9IHRydWUKK1RBUkdFVF9PUEVOSkRLOSA6PQorZWxzZSBpZmVxICgkKEVYUEVSSU1FTlRBTF9VU0VfT1BFTkpESzkpLHRydWUpCitVU0VfT1BFTkpESzkgOj0gdHJ1ZQorVEFSR0VUX09QRU5KREs5IDo9IHRydWUKK2VuZGlmCiAKLWlmbmVxICgkKEhPU1RfSkRLX1RPT0xTX0pBUiksKQotaWZlcSAoJCh3aWxkY2FyZCAkKEhPU1RfSkRLX1RPT0xTX0pBUikpLCkKLSQoZXJyb3IgRXJyb3I6IGNvdWxkIG5vdCBmaW5kIGpkayB0b29scy5qYXIgYXQgJChIT1NUX0pES19UT09MU19KQVIpLCBwbGVhc2UgY2hlY2sgaWYgeW91ciBKREsgd2FzIGluc3RhbGxlZCBjb3JyZWN0bHkpCi1lbmRpZgotZW5kaWYKLWVuZGlmICMgaWZlcSAoJChFWFBFUklNRU5UQUxfVVNFX09QRU5KREs5KSwpCi0KLSMgSXMgdGhlIGhvc3QgSkRLIDY0LWJpdCB2ZXJzaW9uPwotSE9TVF9KREtfSVNfNjRCSVRfVkVSU0lPTiA6PQotaWZuZXEgKCQoZmlsdGVyIDY0LUJpdCwgJChzaGVsbCAkKEpBVkEpIC12ZXJzaW9uIDI+JjEpKSwpCi1IT1NUX0pES19JU182NEJJVF9WRVJTSU9OIDo9IHRydWUKLWVuZGlmCi1lbmRpZiAgIyBDQUxMRURfRlJPTV9TRVRVUCBub3QgdHJ1ZQorIyBQYXRoIHRvIHRvb2xzLmphcgorSE9TVF9KREtfVE9PTFNfSkFSIDo9ICQoQU5EUk9JRF9KQVZBOF9IT01FKS9saWIvdG9vbHMuamFyCiAKICMgSXQncyBjYWxsZWQgbWQ1IG9uIE1hYyBPUyBhbmQgbWQ1c3VtIG9uIExpbnV4CiBpZmVxICgkKEhPU1RfT1MpLGRhcndpbikKQEAgLTcxNyw2ICs3NTYsMTkgQEAKIAogQVBJQ0hFQ0tfQ09NTUFORCA6PSAkKEFQSUNIRUNLKSAtSlhteDEwMjRtIC1KImNsYXNzcGF0aCAkKEFQSUNIRUNLX0NMQVNTUEFUSCkiCiAKKyMgQm9vbGVhbiB2YXJpYWJsZSBkZXRlcm1pbmluZyBpZiB0aGUgd2hpdGVsaXN0IGZvciBjb21wYXRpYmxlIHByb3BlcnRpZXMgaXMgZW5hYmxlZAorUFJPRFVDVF9DT01QQVRJQkxFX1BST1BFUlRZIDo9IGZhbHNlCitpZm5lcSAoJChQUk9EVUNUX0NPTVBBVElCTEVfUFJPUEVSVFlfT1ZFUlJJREUpLCkKKyAgUFJPRFVDVF9DT01QQVRJQkxFX1BST1BFUlRZIDo9ICQoUFJPRFVDVF9DT01QQVRJQkxFX1BST1BFUlRZX09WRVJSSURFKQorZWxzZSBpZmVxICgkKFBST0RVQ1RfU0hJUFBJTkdfQVBJX0xFVkVMKSwpCisgICMkKHdhcm5pbmcgbm8gcHJvZHVjdCBzaGlwcGluZyBsZXZlbCBkZWZpbmVkKQorZWxzZSBpZm5lcSAoJChjYWxsIG1hdGhfbHQsMjcsJChQUk9EVUNUX1NISVBQSU5HX0FQSV9MRVZFTCkpLCkKKyAgUFJPRFVDVF9DT01QQVRJQkxFX1BST1BFUlRZIDo9IHRydWUKK2VuZGlmCisKKy5LQVRJX1JFQURPTkxZIDo9IFwKKyAgICBQUk9EVUNUX0NPTVBBVElCTEVfUFJPUEVSVFkKKwogIyBCb29sZWFuIHZhcmlhYmxlIGRldGVybWluaW5nIGlmIFRyZWJsZSBpcyBmdWxseSBlbmFibGVkCiBQUk9EVUNUX0ZVTExfVFJFQkxFIDo9IGZhbHNlCiBpZm5lcSAoJChQUk9EVUNUX0ZVTExfVFJFQkxFX09WRVJSSURFKSwpCkBAIC03MjcsMTIgKzc3OSwxMDMgQEAKICAgUFJPRFVDVF9GVUxMX1RSRUJMRSA6PSB0cnVlCiBlbmRpZgogCisjIFRPRE8oYi82OTg2NTAzMik6IE1ha2UgUFJPRFVDVF9OT1RJQ0VfU1BMSVQgdGhlIGRlZmF1bHQgYmVoYXZpb3IgYW5kIHJlbW92ZQorIyAgICByZWZlcmVuY2VzIHRvIGl0IGhlcmUgYW5kIGJlbG93LgoraWZkZWYgUFJPRFVDVF9OT1RJQ0VfU1BMSVRfT1ZFUlJJREUKKyAgICQoZXJyb3IgUFJPRFVDVF9OT1RJQ0VfU1BMSVRfT1ZFUlJJREUgY2Fubm90IGJlIHNldC4pCitlbmRpZgorCityZXF1aXJlbWVudHMgOj0gXAorICAgIFBST0RVQ1RfVFJFQkxFX0xJTktFUl9OQU1FU1BBQ0VTIFwKKyAgICBQUk9EVUNUX1NFUE9MSUNZX1NQTElUIFwKKyAgICBQUk9EVUNUX0VORk9SQ0VfVklOVEZfTUFOSUZFU1QgXAorICAgIFBST0RVQ1RfTk9USUNFX1NQTElUCisKKyMgSWYgaXQgaXMgb3ZlcnJpZGVuLCB0aGVuIHRoZSByZXF1aXJlbWVudCBvdmVycmlkZSBpcyB0YWtlbiwgb3RoZXJ3aXNlIGl0J3MKKyMgUFJPRFVDVF9GVUxMX1RSRUJMRQorJChmb3JlYWNoIHJlcSwkKHJlcXVpcmVtZW50cyksJChldmFsIFwKKyAgICAkKHJlcSkgOj0gJChpZiAkKCQocmVxKV9PVkVSUklERSksJCgkKHJlcSlfT1ZFUlJJREUpLCQoUFJPRFVDVF9GVUxMX1RSRUJMRSkpKSkKKyMgSWYgdGhlIHJlcXVpcmVtZW50IGlzIGZhbHNlIGZvciBhbnkgcmVhc29uLCB0aGVuIGl0J3Mgbm90IFBST0RVQ1RfRlVMTF9UUkVCTEUKKyQoZm9yZWFjaCByZXEsJChyZXF1aXJlbWVudHMpLCQoZXZhbCBcCisgICAgUFJPRFVDVF9GVUxMX1RSRUJMRSA6PSAkKGlmICQoZmlsdGVyIGZhbHNlLCQoJChyZXEpKSksZmFsc2UsJChQUk9EVUNUX0ZVTExfVFJFQkxFKSkpKQorCitQUk9EVUNUX0ZVTExfVFJFQkxFX09WRVJSSURFID89CiskKGZvcmVhY2ggcmVxLCQocmVxdWlyZW1lbnRzKSwkKGV2YWwgJChyZXEpX09WRVJSSURFID89KSkKKworLktBVElfUkVBRE9OTFkgOj0gXAorICAgIFBST0RVQ1RfRlVMTF9UUkVCTEVfT1ZFUlJJREUgXAorICAgICQoZm9yZWFjaCByZXEsJChyZXF1aXJlbWVudHMpLCQocmVxKV9PVkVSUklERSkgXAorICAgICQocmVxdWlyZW1lbnRzKSBcCisgICAgUFJPRFVDVF9GVUxMX1RSRUJMRSBcCisKK3JlcXVpcmVtZW50cyA6PQorCisjIEJPQVJEX1BST1BFUlRZX09WRVJSSURFU19TUExJVF9FTkFCTEVEIGNhbiBiZSB0cnVlIG9ubHkgaWYgZWFybHktbW91bnQgb2YKKyMgcGFydGl0aW9ucyBpcyBzdXBwb3J0ZWQuIEJ1dCB0aGUgZWFybHktbW91bnQgbXVzdCBiZSBzdXBwb3J0ZWQgZm9yIGZ1bGwKKyMgdHJlYmxlIHByb2R1Y3RzLCBhbmQgc28gQk9BUkRfUFJPUEVSVFlfT1ZFUlJJREVTX1NQTElUX0VOQUJMRUQgc2hvdWxkIGJlIHNldAorIyBieSBkZWZhdWx0IGZvciBmdWxsIHRyZWJsZSBwcm9kdWN0cy4KK2lmZXEgKCQoUFJPRFVDVF9GVUxMX1RSRUJMRSksdHJ1ZSkKKyAgQk9BUkRfUFJPUEVSVFlfT1ZFUlJJREVTX1NQTElUX0VOQUJMRUQgPz0gdHJ1ZQorZW5kaWYKKworIyBJZiBQUk9EVUNUX1VTRV9WTkRLIGlzIHRydWUgYW5kIEJPQVJEX1ZOREtfVkVSU0lPTiBpcyBub3QgZGVmaW5lZCB5ZXQsCisjIEJPQVJEX1ZOREtfVkVSU0lPTiB3aWxsIGJlIHNldCB0byAiY3VycmVudCIgYXMgZGVmYXVsdC4KKyMgUFJPRFVDVF9VU0VfVk5ESyB3aWxsIGJlIHRydWUgaW4gQW5kcm9pZC1QIG9yIGxhdGVyIGxhdW5jaGluZyBkZXZpY2VzLgorUFJPRFVDVF9VU0VfVk5ESyA6PSBmYWxzZQoraWZuZXEgKCQoUFJPRFVDVF9VU0VfVk5ES19PVkVSUklERSksKQorICBQUk9EVUNUX1VTRV9WTkRLIDo9ICQoUFJPRFVDVF9VU0VfVk5ES19PVkVSUklERSkKK2Vsc2UgaWZlcSAoJChQUk9EVUNUX1NISVBQSU5HX0FQSV9MRVZFTCksKQorICAjIE5vIHNoaXBwaW5nIGxldmVsIGRlZmluZWQKK2Vsc2UgaWZlcSAoJChjYWxsIG1hdGhfZ3Rfb3JfZXEsMjcsJChQUk9EVUNUX1NISVBQSU5HX0FQSV9MRVZFTCkpLCkKKyAgUFJPRFVDVF9VU0VfVk5ESyA6PSAkKFBST0RVQ1RfRlVMTF9UUkVCTEUpCitlbmRpZgorCitpZmVxICgkKFBST0RVQ1RfVVNFX1ZOREspLHRydWUpCisgIGlmbmRlZiBCT0FSRF9WTkRLX1ZFUlNJT04KKyAgICBCT0FSRF9WTkRLX1ZFUlNJT04gOj0gY3VycmVudAorICBlbmRpZgorZW5kaWYKKworJChLQVRJX29ic29sZXRlX3ZhciBQUk9EVUNUX1VTRV9WTkRLX09WRVJSSURFLFVzZSBQUk9EVUNUX1VTRV9WTkRLIGluc3RlYWQpCisuS0FUSV9SRUFET05MWSA6PSBcCisgICAgUFJPRFVDVF9VU0VfVk5ESworCisjIFNldCBCT0FSRF9TWVNURU1TREtfVkVSU0lPTlMgdG8gdGhlIGxhdGVzdCBTeXN0ZW1TREsgdmVyc2lvbiBzdGFydGluZyBmcm9tIFAtbGF1bmNoaW5nCisjIGRldmljZXMgaWYgdW5zZXQuCitpZm5kZWYgQk9BUkRfU1lTVEVNU0RLX1ZFUlNJT05TCisgIGlmZGVmIFBST0RVQ1RfU0hJUFBJTkdfQVBJX0xFVkVMCisgIGlmbmVxICgkKGNhbGwgbWF0aF9ndF9vcl9lcSwkKFBST0RVQ1RfU0hJUFBJTkdfQVBJX0xFVkVMKSwyOCksKQorICAgIGlmZXEgKFJFTCwkKFBMQVRGT1JNX1ZFUlNJT05fQ09ERU5BTUUpKQorICAgICAgQk9BUkRfU1lTVEVNU0RLX1ZFUlNJT05TIDo9ICQoUExBVEZPUk1fU0RLX1ZFUlNJT04pCisgICAgZWxzZQorICAgICAgQk9BUkRfU1lTVEVNU0RLX1ZFUlNJT05TIDo9ICQoUExBVEZPUk1fVkVSU0lPTl9DT0RFTkFNRSkKKyAgICBlbmRpZgorICBlbmRpZgorICBlbmRpZgorZW5kaWYKKworCiBpZmRlZiBQUk9EVUNUX1NISVBQSU5HX0FQSV9MRVZFTAogICBpZm5lcSAoJChjYWxsIG1hdGhfZ3Rfb3JfZXEsJChQUk9EVUNUX1NISVBQSU5HX0FQSV9MRVZFTCksMjcpLCkKICAgICBpZm5lcSAoJChUQVJHRVRfVVNFU19NS0UyRlMpLHRydWUpCiAgICAgICAkKGVycm9yIFdoZW4gUFJPRFVDVF9TSElQUElOR19BUElfTEVWRUwgPj0gMjcsIFRBUkdFVF9VU0VTX01LRTJGUyBtdXN0IGJlIHRydWUpCiAgICAgZW5kaWYKICAgZW5kaWYKKyAgaWZuZXEgKCQoY2FsbCBudW1iZXJzX2xlc3NfdGhhbiwkKFBST0RVQ1RfU0hJUFBJTkdfQVBJX0xFVkVMKSwkKEJPQVJEX1NZU1RFTVNES19WRVJTSU9OUykpLCkKKyAgICAkKGVycm9yIEJPQVJEX1NZU1RFTVNES19WRVJTSU9OUyAoJChCT0FSRF9TWVNURU1TREtfVkVSU0lPTlMpKSBtdXN0IGFsbCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gUFJPRFVDVF9TSElQUElOR19BUElfTEVWRUwgKCQoUFJPRFVDVF9TSElQUElOR19BUElfTEVWRUwpKSkKKyAgZW5kaWYKKyAgaWZuZXEgKCQoY2FsbCBtYXRoX2d0X29yX2VxLCQoUFJPRFVDVF9TSElQUElOR19BUElfTEVWRUwpLDI4KSwpCisgICAgaWZuZXEgKCQoVEFSR0VUX0lTXzY0X0JJVCksIHRydWUpCisgICAgICBpZm5lcSAoJChUQVJHRVRfVVNFU182NF9CSVRfQklOREVSKSwgdHJ1ZSkKKyAgICAgICAgJChlcnJvciBXaGVuIFBST0RVQ1RfU0hJUFBJTkdfQVBJX0xFVkVMID49IDI4LCBUQVJHRVRfVVNFU182NF9CSVRfQklOREVSIG11c3QgYmUgdHJ1ZSkKKyAgICAgIGVuZGlmCisgICAgZW5kaWYKKyAgICBpZmVxICgkKFBST0RVQ1RfRlVMTF9UUkVCTEUpLHRydWUpCisgICAgICBpZm5lcSAoJChCT0FSRF9CVUlMRF9TWVNURU1fUk9PVF9JTUFHRSksIHRydWUpCisgICAgICAgICQoZXJyb3IgV2hlbiBQUk9EVUNUX1NISVBQSU5HX0FQSV9MRVZFTCA+PSAyOCwgQk9BUkRfQlVJTERfU1lTVEVNX1JPT1RfSU1BR0UgbXVzdCBiZSB0cnVlKQorICAgICAgZW5kaWYKKyAgICBlbmRpZgorICBlbmRpZgogZW5kaWYKIAogIyBUaGUgZGVmYXVsdCBrZXkgaWYgbm90IHNldCBhcyBMT0NBTF9DRVJUSUZJQ0FURQpAQCAtNzQyLDQ1ICs4ODUsNDYgQEAKICAgREVGQVVMVF9TWVNURU1fREVWX0NFUlRJRklDQVRFIDo9IGJ1aWxkL3RhcmdldC9wcm9kdWN0L3NlY3VyaXR5L3Rlc3RrZXkKIGVuZGlmCiAKLUZSQU1FV09SS19NQU5JRkVTVF9GSUxFIDo9IHN5c3RlbS9saWJoaWRsL21hbmlmZXN0LnhtbAorQlVJTERfTlVNQkVSX0ZST01fRklMRSA6PSAkJChjYXQgJChPVVRfRElSKS9idWlsZF9udW1iZXIudHh0KQorQlVJTERfREFURVRJTUVfRlJPTV9GSUxFIDo9ICQkKGNhdCAkKEJVSUxEX0RBVEVUSU1FX0ZJTEUpKQogCi0jIENvbXBhdGliaWxpdHkgbWF0cml4IHZlcnNpb25pbmc6Ci0jIE1BVFJJWF9MRVZFTF9PVkVSUklERSBkZWZpbmVkOiBNQVRSSVhfTEVWRUwgPSBNQVRSSVhfTEVWRUxfT1ZFUlJJREUKLSMgTUFUUklYX0xFVkVMX09WRVJSSURFIHVuZGVmaW5lZDoKLSMgICBGVUxMX1RSRUJMRSAhPSB0cnVlOiBNQVRSSVhfTEVWRUwgPSBsZWdhY3kKLSMgICBGVUxMX1RSRUJMRSA9PSB0cnVlOgotIyAgICAgU0hJUFBJTkdfQVBJX0xFVkVMIGRlZmluZWQ6IE1BVFJJWF9MRVZFTCA9IFNISVBQSU5HX0FQSV9MRVZFTAotIyAgICAgU0hJUFBJTkdfQVBJX0xFVkVMIHVuZGVmaW5lZDogTUFUUklYX0xFVkVMID0gUExBVEZPUk1fU0RLX1ZFUlNJT04KLSMgTUFUUklYX0xFVkVMID09IGxlZ2FjeSA9PiBsZWdhY3kueG1sCi0jIE1BVFJJWF9MRVZFTCA8PSAyNiA9PiAyNi54bWwKLSMgTUFUUklYX0xFVkVMID09IDI3ID0+IDI3LnhtbCAjIGRlZmluZSB3aGVuIDI3IHJlbGVhc2VzCi0jIE1BVFJJWF9MRVZFTCA9PSAyOCA9PiAyOC54bWwgIyBkZWZpbmUgd2hlbiAyOCByZWxlYXNlcwotIyAuLi4KLSMgb3RoZXJ3aXNlID0+IGN1cnJlbnQueG1sCisjIFNFUG9saWN5IHZlcnNpb25zCiAKLWlmbmVxICgkKFBST0RVQ1RfQ09NUEFUSUJJTElUWV9NQVRSSVhfTEVWRUxfT1ZFUlJJREUpLCkKLSAgUFJPRFVDVF9DT01QQVRJQklMSVRZX01BVFJJWF9MRVZFTCA6PSAkKFBST0RVQ1RfQ09NUEFUSUJJTElUWV9NQVRSSVhfTEVWRUxfT1ZFUlJJREUpCi1lbHNlIGlmbmVxICgkKFBST0RVQ1RfRlVMTF9UUkVCTEUpLHRydWUpCi0gIFBST0RVQ1RfQ09NUEFUSUJJTElUWV9NQVRSSVhfTEVWRUwgOj0gbGVnYWN5Ci1lbHNlIGlmbmVxICgkKFBST0RVQ1RfU0hJUFBJTkdfQVBJX0xFVkVMKSwpCi0gIFBST0RVQ1RfQ09NUEFUSUJJTElUWV9NQVRSSVhfTEVWRUwgOj0gJChQUk9EVUNUX1NISVBQSU5HX0FQSV9MRVZFTCkKLWVsc2UKLSAgUFJPRFVDVF9DT01QQVRJQklMSVRZX01BVFJJWF9MRVZFTCA6PSAkKFBMQVRGT1JNX1NES19WRVJTSU9OKQorIyBQTEFURk9STV9TRVBPTElDWV9WRVJTSU9OIGlzIGEgbnVtYmVyIG9mIHRoZSBmb3JtICJOTi5tIiB3aXRoICJOTiIgbWFwcGluZyB0bworIyBQTEFURk9STV9TREtfVkVSU0lPTiBhbmQgIm0iIGFzIGEgbWlub3IgbnVtYmVyIHdoaWNoIGFsbG93cyBmb3IgU0VMaW51eAorIyBjaGFuZ2VzIGluZGVwZW5kZW50IG9mIFBMQVRGT1JNX1NES19WRVJTSU9OLiAgVGhpcyB2YWx1ZSB3aWxsIGJlIHNldCB0bworIyAxMDAwMC4wIHRvIHJlcHJlc2VudCB0aXAtb2YtdHJlZSBkZXZlbG9wbWVudCB0aGF0IGlzIGluaGVyZW50bHkgdW5zdGFibGUgYW5kCisjIHRodXMgZGVzaWduZWQgbm90IHRvIHdvcmsgd2l0aCBhbnkgc2hpcHBpbmcgdmVuZG9yIHBvbGljeS4gIFRoaXMgaXMgc2ltaWxhciBpbgorIyBzcGlyaXQgdG8gaG93IERFRkFVTFRfQVBQX1RBUkdFVF9TREsgaXMgc2V0LgorIyBUaGUgbWlub3IgdmVyc2lvbiAoJ20nIGNvbXBvbmVudCkgbXVzdCBiZSB1cGRhdGVkIGV2ZXJ5IHRpbWUgYSBwbGF0Zm9ybSByZWxlYXNlCisjIGlzIG1hZGUgd2hpY2ggYnJlYWtzIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgcHJldmlvdXMgcGxhdGZvcm0gc2Vwb2xpY3kgdmVyc2lvbiwKKyMgbm90IGp1c3Qgb24gZXZlcnkgaW5jcmVhc2UgaW4gUExBVEZPUk1fU0RLX1ZFUlNJT04uICBUaGUgbWlub3IgdmVyc2lvbiBzaG91bGQKKyMgYmUgcmVzZXQgdG8gMCBvbiBldmVyeSBidW1wIG9mIHRoZSBQTEFURk9STV9TREtfVkVSU0lPTi4KK3NlcG9saWN5X21ham9yX3ZlcnMgOj0gMjgKK3NlcG9saWN5X21pbm9yX3ZlcnMgOj0gMAorCitpZm5lcSAoJChzZXBvbGljeV9tYWpvcl92ZXJzKSwgJChQTEFURk9STV9TREtfVkVSU0lPTikpCiskKGVycm9yIHNlcG9saWN5X21ham9yX3ZlcnNpb24gZG9lcyBub3QgbWF0Y2ggUExBVEZPUk1fU0RLX1ZFUlNJT04sIHBsZWFzZSB1cGRhdGUuKQogZW5kaWYKIAotaWZlcSAoJChzdHJpcCAkKFBST0RVQ1RfQ09NUEFUSUJJTElUWV9NQVRSSVhfTEVWRUwpKSxsZWdhY3kpCi0gIEZSQU1FV09SS19DT01QQVRJQklMSVRZX01BVFJJWF9GSUxFIDo9IGhhcmR3YXJlL2ludGVyZmFjZXMvY29tcGF0aWJpbGl0eV9tYXRyaXgubGVnYWN5LnhtbAotZWxzZSBpZmVxICgkKGNhbGwgbWF0aF9ndF9vcl9lcSwkKFBST0RVQ1RfQ09NUEFUSUJJTElUWV9NQVRSSVhfTEVWRUwpLDI2KSwpCi0gICMgQWxsIFBST0RVQ1RfRlVMTF9UUkVCTEUgZGV2aWNlcyB3aXRoIHNoaXBwaW5nIEFQSSBsZXZlbHMgPCAyNiBnZXQgdGhlIGxldmVsIDI2IG1hbmlmZXN0Ci0gICMgYXMgdGhhdCBpcyB0aGUgZmlyc3QuCi0gIEZSQU1FV09SS19DT01QQVRJQklMSVRZX01BVFJJWF9GSUxFIDo9IGhhcmR3YXJlL2ludGVyZmFjZXMvY29tcGF0aWJpbGl0eV9tYXRyaXguMjYueG1sCi1lbHNlIGlmZXEgKCQoY2FsbCBtYXRoX2d0X29yX2VxLCQoUFJPRFVDVF9DT01QQVRJQklMSVRZX01BVFJJWF9MRVZFTCksMjgpLCkKLSAgIyBBbGwgc2hpcHBpbmcgQVBJIGxldmVscyB3aXRoIHJlbGVhc2VkIGNvbXBhdGliaWxpdHkgbWF0cmljZXMgZ2V0IHRoZSBjb3JyZXNwb25kaW5nIG1hdHJpeC4KLSAgRlJBTUVXT1JLX0NPTVBBVElCSUxJVFlfTUFUUklYX0ZJTEUgOj0gXAotICAgICAgaGFyZHdhcmUvaW50ZXJmYWNlcy9jb21wYXRpYmlsaXR5X21hdHJpeC4kKFBST0RVQ1RfQ09NUEFUSUJJTElUWV9NQVRSSVhfTEVWRUwpLnhtbAorVE9UX1NFUE9MSUNZX1ZFUlNJT04gOj0gMTAwMDAuMAoraWZuZXEgKFJFTCwkKFBMQVRGT1JNX1ZFUlNJT05fQ09ERU5BTUUpKQorICAgIFBMQVRGT1JNX1NFUE9MSUNZX1ZFUlNJT04gOj0gJChUT1RfU0VQT0xJQ1lfVkVSU0lPTikKIGVsc2UKLSAgRlJBTUVXT1JLX0NPTVBBVElCSUxJVFlfTUFUUklYX0ZJTEUgOj0gaGFyZHdhcmUvaW50ZXJmYWNlcy9jb21wYXRpYmlsaXR5X21hdHJpeC5jdXJyZW50LnhtbAorICAgIFBMQVRGT1JNX1NFUE9MSUNZX1ZFUlNJT04gOj0gJChqb2luICQoYWRkc3VmZml4IC4sJChzZXBvbGljeV9tYWpvcl92ZXJzKSksICQoc2Vwb2xpY3lfbWlub3JfdmVycykpCiBlbmRpZgorc2Vwb2xpY3lfbWFqb3JfdmVycyA6PQorc2Vwb2xpY3lfbWlub3JfdmVycyA6PQorCisjIEEgbGlzdCBvZiBTRVBvbGljeSB2ZXJzaW9ucywgYmVzaWRlcyBQTEFURk9STV9TRVBPTElDWV9WRVJTSU9OLCB0aGF0IHRoZSBmcmFtZXdvcmsgc3VwcG9ydHMuCitQTEFURk9STV9TRVBPTElDWV9DT01QQVRfVkVSU0lPTlMgOj0gXAorICAgIDI2LjAgXAorICAgIDI3LjAKKworLktBVElfUkVBRE9OTFkgOj0gXAorICAgIFBMQVRGT1JNX1NFUE9MSUNZX0NPTVBBVF9WRVJTSU9OUyBcCisgICAgUExBVEZPUk1fU0VQT0xJQ1lfVkVSU0lPTiBcCisgICAgVE9UX1NFUE9MSUNZX1ZFUlNJT04gXAogCiAjICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIyBTZXQgdXAgZmluYWwgb3B0aW9ucy4KQEAgLTgxOCwxMiArOTYyLDYgQEAKICQoVEFSR0VUXzJORF9BUkNIX1ZBUl9QUkVGSVgpREVYMk9BVF9UQVJHRVRfSU5TVFJVQ1RJT05fU0VUX0ZFQVRVUkVTIDo9IGRlZmF1bHQKIGVuZGlmCiAKLSMgVGhlc2Ugd2lsbCBjb21lIGZyb20gU29vbmcsIGRyb3AgdGhlIGVudmlyb25tZW50IHZlcnNpb25zCi11bmV4cG9ydCBDTEFORwotdW5leHBvcnQgQ0xBTkdfQ1hYCi11bmV4cG9ydCBDQ0NfQ0MKLXVuZXhwb3J0IENDQ19DWFgKLQogIyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICMgQ29sbGVjdCBhIGxpc3Qgb2YgdGhlIFNESyB2ZXJzaW9ucyB0aGF0IHdlIGNvdWxkIGNvbXBpbGUgYWdhaW5zdAogIyBGb3IgdXNlIHdpdGggdGhlIExPQ0FMX1NES19WRVJTSU9OIHZhcmlhYmxlIGZvciBpbmNsdWRlICQoQlVJTERfUEFDS0FHRSkKQEAgLTg1OSwxOCArOTk3LDQwIEBACiAgICAgJChwYXRzdWJzdCAkKEhJU1RPUklDQUxfU0RLX1ZFUlNJT05TX1JPT1QpLyUvYW5kcm9pZC5qYXIsJSwgXAogICAgICQod2lsZGNhcmQgJChISVNUT1JJQ0FMX1NES19WRVJTSU9OU19ST09UKS8qL2FuZHJvaWQuamFyKSkpCiAKLSMgV2UgZG9uJ3QgaGF2ZSBwcmVidWlsdCB0ZXN0X2N1cnJlbnQgU0RLIHlldC4KLVRBUkdFVF9BVkFJTEFCTEVfU0RLX1ZFUlNJT05TIDo9IHRlc3RfY3VycmVudCAkKFRBUkdFVF9BVkFJTEFCTEVfU0RLX1ZFUlNJT05TKQorVEFSR0VUX0FWQUlMQUJMRV9TREtfVkVSU0lPTlMgOj0gJChhZGRwcmVmaXggc3lzdGVtXywkKGNhbGwgbnVtZXJpY2FsbHlfc29ydCxcCisgICAgJChwYXRzdWJzdCAkKEhJU1RPUklDQUxfU0RLX1ZFUlNJT05TX1JPT1QpLyUvYW5kcm9pZF9zeXN0ZW0uamFyLCUsIFwKKyAgICAkKHdpbGRjYXJkICQoSElTVE9SSUNBTF9TREtfVkVSU0lPTlNfUk9PVCkvKi9hbmRyb2lkX3N5c3RlbS5qYXIpKSkpIFwKKyAgICAkKFRBUkdFVF9BVkFJTEFCTEVfU0RLX1ZFUlNJT05TKQorCisjIFdlIGRvbid0IGhhdmUgcHJlYnVpbHQgdGVzdF9jdXJyZW50IGFuZCBjb3JlX2N1cnJlbnQgU0RLIHlldC4KK1RBUkdFVF9BVkFJTEFCTEVfU0RLX1ZFUlNJT05TIDo9IHRlc3RfY3VycmVudCBjb3JlX2N1cnJlbnQgJChUQVJHRVRfQVZBSUxBQkxFX1NES19WRVJTSU9OUykKKworVEFSR0VUX1NES19WRVJTSU9OU19XSVRIT1VUX0pBVkFfMThfU1VQUE9SVCA6PSAkKGNhbGwgbnVtYmVyc19sZXNzX3RoYW4sMjQsJChUQVJHRVRfQVZBSUxBQkxFX1NES19WRVJTSU9OUykpCitUQVJHRVRfU0RLX1ZFUlNJT05TX1dJVEhPVVRfSkFWQV8xOV9TVVBQT1JUIDo9ICQoY2FsbCBudW1iZXJzX2xlc3NfdGhhbiwyNywkKFRBUkdFVF9BVkFJTEFCTEVfU0RLX1ZFUlNJT05TKSkKIAogSU5URVJOQUxfUExBVEZPUk1fQVBJX0ZJTEUgOj0gJChUQVJHRVRfT1VUX0NPTU1PTl9JTlRFUk1FRElBVEVTKS9QQUNLQUdJTkcvcHVibGljX2FwaS50eHQKK0lOVEVSTkFMX1BMQVRGT1JNX0RFWF9BUElfRklMRSA6PSAkKFRBUkdFVF9PVVRfQ09NTU9OX0lOVEVSTUVESUFURVMpL1BBQ0tBR0lORy9wdWJsaWMtZGV4LnR4dAorSU5URVJOQUxfUExBVEZPUk1fUFJJVkFURV9BUElfRklMRSA6PSAkKFRBUkdFVF9PVVRfQ09NTU9OX0lOVEVSTUVESUFURVMpL1BBQ0tBR0lORy9wcml2YXRlLnR4dAorSU5URVJOQUxfUExBVEZPUk1fUFJJVkFURV9ERVhfQVBJX0ZJTEUgOj0gJChUQVJHRVRfT1VUX0NPTU1PTl9JTlRFUk1FRElBVEVTKS9QQUNLQUdJTkcvcHJpdmF0ZS1kZXgudHh0CiBJTlRFUk5BTF9QTEFURk9STV9SRU1PVkVEX0FQSV9GSUxFIDo9ICQoVEFSR0VUX09VVF9DT01NT05fSU5URVJNRURJQVRFUykvUEFDS0FHSU5HL3JlbW92ZWQudHh0CitJTlRFUk5BTF9QTEFURk9STV9SRU1PVkVEX0RFWF9BUElfRklMRSA6PSAkKFRBUkdFVF9PVVRfQ09NTU9OX0lOVEVSTUVESUFURVMpL1BBQ0tBR0lORy9yZW1vdmVkLWRleC50eHQKIElOVEVSTkFMX1BMQVRGT1JNX1NZU1RFTV9BUElfRklMRSA6PSAkKFRBUkdFVF9PVVRfQ09NTU9OX0lOVEVSTUVESUFURVMpL1BBQ0tBR0lORy9zeXN0ZW0tYXBpLnR4dAorSU5URVJOQUxfUExBVEZPUk1fU1lTVEVNX1BSSVZBVEVfQVBJX0ZJTEUgOj0gJChUQVJHRVRfT1VUX0NPTU1PTl9JTlRFUk1FRElBVEVTKS9QQUNLQUdJTkcvc3lzdGVtLXByaXZhdGUudHh0CitJTlRFUk5BTF9QTEFURk9STV9TWVNURU1fUFJJVkFURV9ERVhfQVBJX0ZJTEUgOj0gJChUQVJHRVRfT1VUX0NPTU1PTl9JTlRFUk1FRElBVEVTKS9QQUNLQUdJTkcvc3lzdGVtLXByaXZhdGUtZGV4LnR4dAogSU5URVJOQUxfUExBVEZPUk1fU1lTVEVNX1JFTU9WRURfQVBJX0ZJTEUgOj0gJChUQVJHRVRfT1VUX0NPTU1PTl9JTlRFUk1FRElBVEVTKS9QQUNLQUdJTkcvc3lzdGVtLXJlbW92ZWQudHh0CiBJTlRFUk5BTF9QTEFURk9STV9TWVNURU1fRVhBQ1RfQVBJX0ZJTEUgOj0gJChUQVJHRVRfT1VUX0NPTU1PTl9JTlRFUk1FRElBVEVTKS9QQUNLQUdJTkcvc3lzdGVtLWV4YWN0LnR4dAogSU5URVJOQUxfUExBVEZPUk1fVEVTVF9BUElfRklMRSA6PSAkKFRBUkdFVF9PVVRfQ09NTU9OX0lOVEVSTUVESUFURVMpL1BBQ0tBR0lORy90ZXN0LWFwaS50eHQKIElOVEVSTkFMX1BMQVRGT1JNX1RFU1RfUkVNT1ZFRF9BUElfRklMRSA6PSAkKFRBUkdFVF9PVVRfQ09NTU9OX0lOVEVSTUVESUFURVMpL1BBQ0tBR0lORy90ZXN0LXJlbW92ZWQudHh0CiBJTlRFUk5BTF9QTEFURk9STV9URVNUX0VYQUNUX0FQSV9GSUxFIDo9ICQoVEFSR0VUX09VVF9DT01NT05fSU5URVJNRURJQVRFUykvUEFDS0FHSU5HL3Rlc3QtZXhhY3QudHh0CiAKK0lOVEVSTkFMX1BMQVRGT1JNX0hJRERFTkFQSV9MSUdIVF9HUkVZTElTVCA6PSAkKFRBUkdFVF9PVVRfQ09NTU9OX0lOVEVSTUVESUFURVMpL1BBQ0tBR0lORy9oaWRkZW5hcGktbGlnaHQtZ3JleWxpc3QudHh0CitJTlRFUk5BTF9QTEFURk9STV9ISURERU5BUElfREFSS19HUkVZTElTVCA6PSAkKFRBUkdFVF9PVVRfQ09NTU9OX0lOVEVSTUVESUFURVMpL1BBQ0tBR0lORy9oaWRkZW5hcGktZGFyay1ncmV5bGlzdC50eHQKK0lOVEVSTkFMX1BMQVRGT1JNX0hJRERFTkFQSV9CTEFDS0xJU1QgOj0gJChUQVJHRVRfT1VUX0NPTU1PTl9JTlRFUk1FRElBVEVTKS9QQUNLQUdJTkcvaGlkZGVuYXBpLWJsYWNrbGlzdC50eHQKKworIyBNaXNzaW5nIG9wdGlvbmFsIHVzZXMtbGlicmFyaWVzIHNvIHRoYXQgdGhlIHBsYXRmb3JtIGRvZXNuJ3QgY3JlYXRlIGJ1aWxkIHJ1bGVzIHRoYXQgZGVwZW5kIG9uCisjIHRoZW0uIFNlZSBzZXR1cF9vbmVfb2RleC5tay4KK0lOVEVSTkFMX1BMQVRGT1JNX01JU1NJTkdfVVNFU19MSUJSQVJJRVMgOj0gY29tLmdvb2dsZS5hbmRyb2lkLmJsZSBjb20uZ29vZ2xlLmFuZHJvaWQud2VhcmFibGUKKwogIyBUaGlzIGlzIHRoZSBzdGFuZGFyZCB3YXkgdG8gbmFtZSBhIGRpcmVjdG9yeSBjb250YWluaW5nIHByZWJ1aWx0IHRhcmdldAogIyBvYmplY3RzLiBFLmcuLCBwcmVidWlsdC8kKFRBUkdFVF9QUkVCVUlMVF9UQUcpL2xpYmMuc28KIFRBUkdFVF9QUkVCVUlMVF9UQUcgOj0gYW5kcm9pZC0kKFRBUkdFVF9BUkNIKQpAQCAtODgyLDU3ICsxMDQyLDIzIEBACiAKIFJTX1BSRUJVSUxUX0NMQ09SRSA6PSBwcmVidWlsdHMvc2RrL3JlbmRlcnNjcmlwdC9saWIvJChUQVJHRVRfQVJDSCkvbGlicnNydF8kKFRBUkdFVF9BUkNIKS5iYwogUlNfUFJFQlVJTFRfQ09NUElMRVJfUlQgOj0gcHJlYnVpbHRzL3Nkay9yZW5kZXJzY3JpcHQvbGliLyQoVEFSR0VUX0FSQ0gpL2xpYmNvbXBpbGVyX3J0LmEKLWlmZXEgKHRydWUsJChUQVJHRVRfSVNfNjRfQklUKSkKLVJTX1BSRUJVSUxUX0xJQlBBVEggOj0gLUwgcHJlYnVpbHRzL25kay9yMTAvcGxhdGZvcm1zL2FuZHJvaWQtMjEvYXJjaC0kKFRBUkdFVF9BUkNIKS91c3IvbGliNjQgXAotICAgICAgICAgICAgICAgICAgICAgICAtTCBwcmVidWlsdHMvbmRrL3IxMC9wbGF0Zm9ybXMvYW5kcm9pZC0yMS9hcmNoLSQoVEFSR0VUX0FSQ0gpL3Vzci9saWIKLWVsc2UKLVJTX1BSRUJVSUxUX0xJQlBBVEggOj0gLUwgcHJlYnVpbHRzL25kay9yMTAvcGxhdGZvcm1zL2FuZHJvaWQtOS9hcmNoLSQoVEFSR0VUX0FSQ0gpL3Vzci9saWIKLWVuZGlmCiAKICMgQVBJIExldmVsIGxpc3RzIGZvciBSZW5kZXJzY3JpcHQgQ29tcGF0IGxpYi4KIFJTQ09NUEFUXzMyQklUX09OTFlfQVBJX0xFVkVMUyA6PSA4IDkgMTAgMTEgMTIgMTMgMTQgMTUgMTYgMTcgMTggMTkgMjAKIFJTQ09NUEFUX05PX1VTQUdFSU9fQVBJX0xFVkVMUyA6PSA4IDkgMTAgMTEgMTIgMTMKIAotaWZlcSAoJChKQVZBX05PVF9SRVFVSVJFRCksdHJ1ZSkKLSMgUmVtb3ZlIGphdmEgYW5kIHRvb2xzIGZyb20gb3VyIHBhdGggc28gdGhhdCB3ZSBtYWtlIHN1cmUgbm9ib2R5IHVzZXMgdGhlbS4KLXVuZXhwb3J0IEFORFJPSURfSkFWQV9IT01FCi11bmV4cG9ydCBKQVZBX0hPTUUKLWV4cG9ydCBBTkRST0lEX0JVSUxEX1BBVEhTOj0kKGFic3BhdGggJChCVUlMRF9TWVNURU0pL25vX2phdmFfcGF0aCk6JChBTkRST0lEX0JVSUxEX1BBVEhTKQotZXhwb3J0IFBBVEg6PSQoYWJzcGF0aCAkKEJVSUxEX1NZU1RFTSkvbm9famF2YV9wYXRoKTokKFBBVEgpCisjIEFkZCBCVUlMRF9OVU1CRVIgdG8gYXBwcyBkZWZhdWx0IHZlcnNpb24gbmFtZSBpZiBpdCdzIHVuYnVuZGxlZCBidWlsZC4KK2lmZGVmIFRBUkdFVF9CVUlMRF9BUFBTCitUQVJHRVRfQlVJTERfV0lUSF9BUFBTX1ZFUlNJT05fTkFNRSA6PSB0cnVlCiBlbmRpZgogCi0jIFByb2plY3RzIGNsZWFuIG9mIGNvbXBpbGVyIHdhcm5pbmdzIHNob3VsZCBiZSBjb21waWxlZCB3aXRoIC1XZXJyb3IuCi0jIElmIG1vc3QgbW9kdWxlcyBpbiBhIGRpcmVjdG9yeSBzdWNoIGFzIGV4dGVybmFsLyBoYXZlIHdhcm5pbmdzLAotIyB0aGUgZGlyZWN0b3J5IHNob3VsZCBiZSBpbiBBTkRST0lEX1dBUk5JTkdfQUxMT1dFRF9QUk9KRUNUUyBsaXN0LgotIyBXaGVuIHNvbWUgb2YgaXRzIHN1YmRpcmVjdG9yaWVzIGFyZSBjbGVhbmVkIHVwLCB0aGUgc3ViZGlyZWN0b3JpZXMKLSMgY2FuIGJlIGFkZGVkIGludG8gQU5EUk9JRF9XQVJOSU5HX0RJU0FMTE9XRURfUFJPSkVDVFMgbGlzdCwgZS5nLgotIyBleHRlcm5hbC9maW8vLgotQU5EUk9JRF9XQVJOSU5HX0RJU0FMTE9XRURfUFJPSkVDVFMgOj0gXAotICAgIGFydC8lIFwKLSAgICBiaW9uaWMvJSBcCi0gICAgZXh0ZXJuYWwvZmlvLyUgXAotICAgIGhhcmR3YXJlL2ludGVyZmFjZXMvJSBcCitpZmRlZiBUQVJHRVRfQlVJTERfV0lUSF9BUFBTX1ZFUlNJT05fTkFNRQorQVBQU19ERUZBVUxUX1ZFUlNJT05fTkFNRSA6PSAkKFBMQVRGT1JNX1ZFUlNJT04pLSQoQlVJTERfTlVNQkVSX0ZST01fRklMRSkKK2Vsc2UKK0FQUFNfREVGQVVMVF9WRVJTSU9OX05BTUUgOj0gJChQTEFURk9STV9WRVJTSU9OKQorZW5kaWYKIAotZGVmaW5lIGZpbmRfd2FybmluZ19kaXNhbGxvd2VkX3Byb2plY3RzCi0gICAgJChmaWx0ZXIgJChBTkRST0lEX1dBUk5JTkdfRElTQUxMT1dFRF9QUk9KRUNUUyksJCgxKS8pCi1lbmRlZgotCi0jIFByb2plY3RzIHdpdGggY29tcGlsZXIgd2FybmluZ3MgYXJlIGNvbXBpbGVkIHdpdGhvdXQgLVdlcnJvci4KLUFORFJPSURfV0FSTklOR19BTExPV0VEX1BST0pFQ1RTIDo9IFwKLSAgICBib290YWJsZS8lIFwKLSAgICBjdHMvJSBcCi0gICAgZGFsdmlrLyUgXAotICAgIGRldmVsb3BtZW50LyUgXAotICAgIGRldmljZS8lIFwKLSAgICBleHRlcm5hbC8lIFwKLSAgICBmcmFtZXdvcmtzLyUgXAotICAgIGhhcmR3YXJlLyUgXAotICAgIHBhY2thZ2VzLyUgXAotICAgIHN5c3RlbS8lIFwKLSAgICB0ZXN0L3Z0cy8lIFwKLSAgICB0b29scy9hZHQvaWRlYS9hbmRyb2lkL3VsdGltYXRlL2dldF9tb2RpZmljYXRpb25fdGltZS9qbmkvJSBcCi0gICAgdmVuZG9yLyUgXAotCisjIEFORFJPSURfV0FSTklOR19BTExPV0VEX1BST0pFQ1RTIGlzIGdlbmVyYXRlZCBieSBidWlsZC9zb29uZy4KIGRlZmluZSBmaW5kX3dhcm5pbmdfYWxsb3dlZF9wcm9qZWN0cwogICAgICQoZmlsdGVyICQoQU5EUk9JRF9XQVJOSU5HX0FMTE9XRURfUFJPSkVDVFMpLCQoMSkvKQogZW5kZWYKQEAgLTk0Niw2ICsxMDcyLDcgQEAKICAgICBjYWNoZWltYWdlLW5vZGVwcyBcCiAgICAgYnB0aW1hZ2Utbm9kZXBzIFwKICAgICB2bm9kIHZlbmRvcmltYWdlLW5vZGVwcyBcCisgICAgcG5vZCBwcm9kdWN0aW1hZ2Utbm9kZXBzIFwKICAgICBzeXN0ZW1vdGhlcmltYWdlLW5vZGVwcyBcCiAgICAgcmFtZGlzay1ub2RlcHMgXAogICAgIGJvb3RpbWFnZS1ub2RlcHMgXApAQCAtOTUzLDcgKzEwODAsNyBAQAogICAgIHZibWV0YWltYWdlLW5vZGVwcyBcCiAgICAgcHJvZHVjdC1ncmFwaCBkdW1wLXByb2R1Y3RzCiAKLWlmbmRlZiBLQVRJCitpZmVxICgkKENBTExFRF9GUk9NX1NFVFVQKSx0cnVlKQogaW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvbmluamFfY29uZmlnLm1rCiBpbmNsdWRlICQoQlVJTERfU1lTVEVNKS9zb29uZ19jb25maWcubWsKIGVuZGlmCmRpZmYgLS1naXQgYS9jb3JlL2NvbmZpZ19zYW5pdGl6ZXJzLm1rIGIvY29yZS9jb25maWdfc2FuaXRpemVycy5tawppbmRleCAwZDE4MmU5Li5kNTcwY2NkIDEwMDY0NAotLS0gYS9jb3JlL2NvbmZpZ19zYW5pdGl6ZXJzLm1rCisrKyBiL2NvcmUvY29uZmlnX3Nhbml0aXplcnMubWsKQEAgLTIyLDYgKzIyLDMwIEBACiAgIGVuZGlmCiBlbmRpZgogCisjIERpc2FibGUgZ2xvYmFsIGludGVnZXJfb3ZlcmZsb3cgaW4gZXhjbHVkZWQgcGF0aHMuCitpZm5lcSAoJChmaWx0ZXIgaW50ZWdlcl9vdmVyZmxvdywgJChteV9nbG9iYWxfc2FuaXRpemUpKSwpCisgIGNvbWJpbmVkX2V4Y2x1ZGVfcGF0aHMgOj0gJChJTlRFR0VSX09WRVJGTE9XX0VYQ0xVREVfUEFUSFMpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKFBST0RVQ1RfSU5URUdFUl9PVkVSRkxPV19FWENMVURFX1BBVEhTKQorCisgIGlmbmVxICgkKHN0cmlwICQoZm9yZWFjaCBkaXIsJChzdWJzdCAkKGNvbW1hKSwkKHNwYWNlKSwkKGNvbWJpbmVkX2V4Y2x1ZGVfcGF0aHMpKSxcCisgICAgICAgICAkKGZpbHRlciAkKGRpciklLCQoTE9DQUxfUEFUSCkpKSksKQorICAgIG15X2dsb2JhbF9zYW5pdGl6ZSA6PSAkKGZpbHRlci1vdXQgaW50ZWdlcl9vdmVyZmxvdywkKG15X2dsb2JhbF9zYW5pdGl6ZSkpCisgICAgbXlfZ2xvYmFsX3Nhbml0aXplX2RpYWcgOj0gJChmaWx0ZXItb3V0IGludGVnZXJfb3ZlcmZsb3csJChteV9nbG9iYWxfc2FuaXRpemVfZGlhZykpCisgIGVuZGlmCitlbmRpZgorCisjIERpc2FibGUgZ2xvYmFsIENGSSBpbiBleGNsdWRlZCBwYXRocworaWZuZXEgKCQoZmlsdGVyIGNmaSwgJChteV9nbG9iYWxfc2FuaXRpemUpKSwpCisgIGNvbWJpbmVkX2V4Y2x1ZGVfcGF0aHMgOj0gJChDRklfRVhDTFVERV9QQVRIUykgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoUFJPRFVDVF9DRklfRVhDTFVERV9QQVRIUykKKworICBpZm5lcSAoJChzdHJpcCAkKGZvcmVhY2ggZGlyLCQoc3Vic3QgJChjb21tYSksJChzcGFjZSksJChjb21iaW5lZF9leGNsdWRlX3BhdGhzKSksXAorICAgICAgICAgJChmaWx0ZXIgJChkaXIpJSwkKExPQ0FMX1BBVEgpKSkpLCkKKyAgICBteV9nbG9iYWxfc2FuaXRpemUgOj0gJChmaWx0ZXItb3V0IGNmaSwkKG15X2dsb2JhbF9zYW5pdGl6ZSkpCisgICAgbXlfZ2xvYmFsX3Nhbml0aXplX2RpYWcgOj0gJChmaWx0ZXItb3V0IGNmaSwkKG15X2dsb2JhbF9zYW5pdGl6ZV9kaWFnKSkKKyAgZW5kaWYKK2VuZGlmCisKIGlmbmVxICgkKG15X2dsb2JhbF9zYW5pdGl6ZSksKQogICBteV9zYW5pdGl6ZSA6PSAkKG15X2dsb2JhbF9zYW5pdGl6ZSkgJChteV9zYW5pdGl6ZSkKIGVuZGlmCkBAIC03Miw2ICs5NiwyMCBAQAogICBteV9zYW5pdGl6ZV9kaWFnIDo9CiBlbmRpZgogCisjIEVuYWJsZSBDRkkgaW4gaW5jbHVkZWQgcGF0aHMgKGZvciBBcm02NCBvbmx5KS4KK2lmZXEgKCQoZmlsdGVyIGNmaSwgJChteV9zYW5pdGl6ZSkpLCkKKyAgaWZuZXEgKCQoZmlsdGVyIGFybTY0LCQoVEFSR0VUXyQoTE9DQUxfMk5EX0FSQ0hfVkFSX1BSRUZJWClBUkNIKSksKQorICAgIGNvbWJpbmVkX2luY2x1ZGVfcGF0aHMgOj0gJChDRklfSU5DTFVERV9QQVRIUykgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChQUk9EVUNUX0NGSV9JTkNMVURFX1BBVEhTKQorCisgICAgaWZuZXEgKCQoc3RyaXAgJChmb3JlYWNoIGRpciwkKHN1YnN0ICQoY29tbWEpLCQoc3BhY2UpLCQoY29tYmluZWRfaW5jbHVkZV9wYXRocykpLFwKKyAgICAgICAgICAgJChmaWx0ZXIgJChkaXIpJSwkKExPQ0FMX1BBVEgpKSkpLCkKKyAgICAgIG15X3Nhbml0aXplIDo9IGNmaSAkKG15X3Nhbml0aXplKQorICAgICAgbXlfc2FuaXRpemVfZGlhZyA6PSBjZmkgJChteV9zYW5pdGl6ZV9kaWFnKQorICAgIGVuZGlmCisgIGVuZGlmCitlbmRpZgorCiAjIElmIENGSSBpcyBkaXNhYmxlZCBnbG9iYWxseSwgcmVtb3ZlIGl0IGZyb20gbXlfc2FuaXRpemUuCiBpZmVxICgkKHN0cmlwICQoRU5BQkxFX0NGSSkpLGZhbHNlKQogICBteV9zYW5pdGl6ZSA6PSAkKGZpbHRlci1vdXQgY2ZpLCQobXlfc2FuaXRpemUpKQpAQCAtOTYsNiArMTM0LDEyIEBACiAgIG15X3Nhbml0aXplX2RpYWcgOj0gJChmaWx0ZXItb3V0IGNmaSwkKG15X3Nhbml0aXplX2RpYWcpKQogZW5kaWYKIAorIyBEaXNhYmxlIENGSSBmb3IgaG9zdCB0YXJnZXRzCitpZmRlZiBMT0NBTF9JU19IT1NUX01PRFVMRQorICBteV9zYW5pdGl6ZSA6PSAkKGZpbHRlci1vdXQgY2ZpLCQobXlfc2FuaXRpemUpKQorICBteV9zYW5pdGl6ZV9kaWFnIDo9ICQoZmlsdGVyLW91dCBjZmksJChteV9zYW5pdGl6ZV9kaWFnKSkKK2VuZGlmCisKICMgU3VwcG9ydCBmb3IgbG9jYWwgc2FuaXRpemUgYmxhY2tsaXN0IHBhdGhzLgogaWZuZXEgKCQobXlfc2FuaXRpemUpJChteV9nbG9iYWxfc2FuaXRpemUpLCkKICAgaWZuZXEgKCQoTE9DQUxfU0FOSVRJWkVfQkxBQ0tMSVNUKSwpCkBAIC0xMDMsMTcgKzE0Nyw4IEBACiAgIGVuZGlmCiBlbmRpZgogCisjIERpc2FibGUgaW50ZWdlcl9vdmVyZmxvdyBpZiBMT0NBTF9OT1NBTklUSVpFPWludGVnZXIuCiBpZm5lcSAoJChmaWx0ZXIgaW50ZWdlcl9vdmVyZmxvdywgJChteV9nbG9iYWxfc2FuaXRpemUpICQobXlfc2FuaXRpemUpKSwpCi0gICMgRGlzYWJsZSBpbnRlZ2VyX292ZXJmbG93IGluIGV4Y2x1ZGVkIHBhdGhzLgotICBjb21iaW5lZF9leGNsdWRlX3BhdGhzIDo9ICQoSU5URUdFUl9PVkVSRkxPV19FWENMVURFX1BBVEhTKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJChQUk9EVUNUX0lOVEVHRVJfT1ZFUkZMT1dfRVhDTFVERV9QQVRIUykKLQotICBpZm5lcSAoJChzdHJpcCAkKGZvcmVhY2ggZGlyLCQoc3Vic3QgJChjb21tYSksJChzcGFjZSksJChjb21iaW5lZF9leGNsdWRlX3BhdGhzKSksXAotICAgICAgICAgJChmaWx0ZXIgJChkaXIpJSwkKExPQ0FMX1BBVEgpKSkpLCkKLSAgICBteV9zYW5pdGl6ZSA6PSAkKGZpbHRlci1vdXQgaW50ZWdlcl9vdmVyZmxvdywkKG15X3Nhbml0aXplKSkKLSAgICBteV9zYW5pdGl6ZV9kaWFnIDo9ICQoZmlsdGVyLW91dCBpbnRlZ2VyX292ZXJmbG93LCQobXlfc2FuaXRpemVfZGlhZykpCi0gIGVuZGlmCi0gICMgRGlzYWJsZSBpbnRlZ2VyX292ZXJmbG93IGlmIExPQ0FMX05PU0FOSVRJWkU9aW50ZWdlci4KICAgaWZuZXEgKCQoZmlsdGVyIGludGVnZXIsICQoc3RyaXAgJChMT0NBTF9OT1NBTklUSVpFKSkpLCkKICAgICBteV9zYW5pdGl6ZSA6PSAkKGZpbHRlci1vdXQgaW50ZWdlcl9vdmVyZmxvdywkKG15X3Nhbml0aXplKSkKICAgICBteV9zYW5pdGl6ZV9kaWFnIDo9ICQoZmlsdGVyLW91dCBpbnRlZ2VyX292ZXJmbG93LCQobXlfc2FuaXRpemVfZGlhZykpCkBAIC0xMzQsNiArMTY5LDggQEAKICAgICBlbHNlCiAgICAgICAgICQoZXJyb3IgJChMT0NBTF9QQVRIKTogJChMT0NBTF9NT0RVTEUpOiBUU0FOIGNhbm5vdCBiZSB1c2VkIGZvciAzMi1iaXQgbW9kdWxlcy4pCiAgICAgZW5kaWYKKyAgZWxzZQorICAgIG15X3NoYXJlZF9saWJyYXJpZXMgKz0gJChUU0FOX1JVTlRJTUVfTElCUkFSWSkKICAgZW5kaWYKIGVuZGlmCiAKQEAgLTE3Miw3ICsyMDksNyBAQAogICBpZmVxICgkKGZpbHRlciBhZGRyZXNzLCQobXlfc2FuaXRpemUpKSwpCiAgICAgJChlcnJvciAkKExPQ0FMX1BBVEgpOiAkKExPQ0FMX01PRFVMRSk6IFVzZSBvZiAnY292ZXJhZ2UnIGFsc28gcmVxdWlyZXMgJ2FkZHJlc3MnKQogICBlbmRpZgotICBteV9jZmxhZ3MgKz0gLWZzYW5pdGl6ZS1jb3ZlcmFnZT10cmFjZS1wYy1ndWFyZAorICBteV9jZmxhZ3MgKz0gLWZzYW5pdGl6ZS1jb3ZlcmFnZT10cmFjZS1wYy1ndWFyZCxpbmRpcmVjdC1jYWxscyx0cmFjZS1jbXAKICAgbXlfc2FuaXRpemUgOj0gJChmaWx0ZXItb3V0IGNvdmVyYWdlLCQobXlfc2FuaXRpemUpKQogZW5kaWYKIApAQCAtMTgyLDE5ICsyMTksMTcgQEAKIAogICAgICAgIyBSZXNwZWN0IExPQ0FMX05PU0FOSVRJWkUgZm9yIGludGVnZXItb3ZlcmZsb3cgZmxhZ3MuCiAgICAgICBpZmVxICgkKGZpbHRlciBzaWduZWQtaW50ZWdlci1vdmVyZmxvdywgJChzdHJpcCAkKExPQ0FMX05PU0FOSVRJWkUpKSksKQotICAgICAgICBteV9jZmxhZ3MgKz0gLWZzYW5pdGl6ZT1zaWduZWQtaW50ZWdlci1vdmVyZmxvdworICAgICAgICBteV9zYW5pdGl6ZSArPSBzaWduZWQtaW50ZWdlci1vdmVyZmxvdwogICAgICAgZW5kaWYKICAgICAgIGlmZXEgKCQoZmlsdGVyIHVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3csICQoc3RyaXAgJChMT0NBTF9OT1NBTklUSVpFKSkpLCkKLSAgICAgICAgbXlfY2ZsYWdzICs9IC1mc2FuaXRpemU9dW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdworICAgICAgICBteV9zYW5pdGl6ZSArPSB1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93CiAgICAgICBlbmRpZgotICAgICAgbXlfY2ZsYWdzICs9IC1mc2FuaXRpemUtdHJhcD1hbGwKLSAgICAgIG15X2NmbGFncyArPSAtZnRyYXAtZnVuY3Rpb249YWJvcnQKICAgICAgIG15X2NmbGFncyArPSAkKElOVEVHRVJfT1ZFUkZMT1dfRVhUUkFfQ0ZMQUdTKQogCiAgICAgICAjIENoZWNrIGZvciBkaWFnbm9zdGljcyBtb2RlIChvbiBieSBkZWZhdWx0KS4KICAgICAgIGlmbmVxICgkKGZpbHRlciBpbnRlZ2VyX292ZXJmbG93LCQobXlfc2FuaXRpemVfZGlhZykpLCkKLSAgICAgICAgbXlfY2ZsYWdzICs9IC1mbm8tc2FuaXRpemUtdHJhcD1zaWduZWQtaW50ZWdlci1vdmVyZmxvdyx1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93Ci0gICAgICAgIG15X3NoYXJlZF9saWJyYXJpZXMgOj0gJCgkKExPQ0FMXzJORF9BUkNIX1ZBUl9QUkVGSVgpVUJTQU5fUlVOVElNRV9MSUJSQVJZKSAkKG15X3NoYXJlZF9saWJyYXJpZXMpCisgICAgICAgIG15X3Nhbml0aXplX2RpYWcgKz0gc2lnbmVkLWludGVnZXItb3ZlcmZsb3cKKyAgICAgICAgbXlfc2FuaXRpemVfZGlhZyArPSB1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93CiAgICAgICBlbmRpZgogICAgIGVuZGlmCiAgIGVuZGlmCkBAIC0yMTQsNyArMjQ5LDYgQEAKICAgaWZkZWYgTE9DQUxfSVNfSE9TVF9NT0RVTEUKICAgICBteV9jZmxhZ3MgKz0gLWZuby1zYW5pdGl6ZS1yZWNvdmVyPWFsbAogICAgIG15X2xkZmxhZ3MgKz0gLWZzYW5pdGl6ZT0kKGZzYW5pdGl6ZV9hcmcpCi0gICAgbXlfbGRsaWJzICs9IC1scnQgLWxkbAogICBlbHNlCiAgICAgbXlfY2ZsYWdzICs9IC1mc2FuaXRpemUtdHJhcD1hbGwKICAgICBteV9jZmxhZ3MgKz0gLWZ0cmFwLWZ1bmN0aW9uPWFib3J0CkBAIC0yMzEsMTIgKzI2NSwyMSBAQAogICAjIGVudGlyZSBtb2R1bGUuCiAgIExPQ0FMX0FSTV9NT0RFIDo9IHRodW1iCiAgIG15X2NmbGFncyArPSAkKENGSV9FWFRSQV9DRkxBR1MpCisgICMgT25seSBhcHBlbmQgdGhlIGRlZmF1bHQgdmlzaWJpbGl0eSBmbGFnIGlmIC1mdmlzaWJpbGl0eSBoYXMgbm90IGFscmVhZHkgYmVlbgorICAjIHNldCB0byBoaWRkZW4uCisgIGlmZXEgKCQoZmlsdGVyIC1mdmlzaWJpbGl0eT1oaWRkZW4sJChMT0NBTF9DRkxBR1MpKSwpCisgICAgbXlfY2ZsYWdzICs9IC1mdmlzaWJpbGl0eT1kZWZhdWx0CisgIGVuZGlmCiAgIG15X2xkZmxhZ3MgKz0gJChDRklfRVhUUkFfTERGTEFHUykKICAgbXlfYXJmbGFncyArPSAtLXBsdWdpbiAkKExMVk1fUFJFQlVJTFRTX1BBVEgpLy4uL2xpYjY0L0xMVk1nb2xkLnNvCi0gICMgV29ya2Fyb3VuZCBmb3IgYi8zMzY3ODE5Mi4gQ0ZJIGp1bXB0YWJsZXMgbmVlZCBUaHVtYjIgY29kZWdlbi4gIFJldmVydCB3aGVuCi0gICMgQ2xhbmcgaXMgdXBkYXRlZCBwYXN0IHIyOTAzODQuCi0gIGlmbmVxICgkKGZpbHRlciBhcm0sJChUQVJHRVRfJChMT0NBTF8yTkRfQVJDSF9WQVJfUFJFRklYKUFSQ0gpKSwpCi0gICAgbXlfbGRmbGFncyArPSAtbWFyY2g9YXJtdjctYQorCisgIGlmZXEgKCQoTE9DQUxfRk9SQ0VfU1RBVElDX0VYRUNVVEFCTEUpLHRydWUpCisgICAgICAgIG15X2xkZmxhZ3MgOj0gJChmaWx0ZXItb3V0IC1mc2FuaXRpemUtY2ZpLWNyb3NzLWRzbywkKG15X2xkZmxhZ3MpKQorICAgICAgICBteV9jZmxhZ3MgOj0gJChmaWx0ZXItb3V0IC1mc2FuaXRpemUtY2ZpLWNyb3NzLWRzbywkKG15X2NmbGFncykpCisgIGVsc2UKKyAgICAgICAgIyBBcHBseSB0aGUgdmVyc2lvbiBzY3JpcHQgdG8gbm9uLXN0YXRpYyBleGVjdXRhYmxlcworICAgICAgICBteV9sZGZsYWdzICs9IC1XbCwtLXZlcnNpb24tc2NyaXB0LGJ1aWxkL3Nvb25nL2NjL2NvbmZpZy9jZmlfZXhwb3J0cy5tYXAKKyAgICAgICAgTE9DQUxfQURESVRJT05BTF9ERVBFTkRFTkNJRVMgKz0gYnVpbGQvc29vbmcvY2MvY29uZmlnL2NmaV9leHBvcnRzLm1hcAogICBlbmRpZgogZW5kaWYKIApAQCAtMjQ2LDcgKzI4OSw2IEBACiAgIGlmZGVmIExPQ0FMX0lTX0hPU1RfTU9EVUxFCiAgICAgIyAtbm9kZWZhdWx0bGlicyAocHJvdmlkZWQgd2l0aCBsaWJjKyspIHByZXZlbnRzIHRoZSBkcml2ZXIgZnJvbSBsaW5raW5nCiAgICAgIyBsaWJyYXJpZXMgbmVlZGVkIHdpdGggLWZzYW5pdGl6ZT1hZGRyZXNzLiBodHRwOi8vYi8xODY1MDI3NSAoV0FJKQotICAgIG15X2xkbGlicyArPSAtbG0gLWxwdGhyZWFkCiAgICAgbXlfbGRmbGFncyArPSAtV2wsLS1uby1hcy1uZWVkZWQKICAgZWxzZQogICAgICMgQWRkIGFzYW4gbGlicmFyaWVzIHVubGVzcyBMT0NBTF9NT0RVTEUgaXMgdGhlIGFzYW4gbGlicmFyeS4KQEAgLTI4NCw5ICszMjYsMjUgQEAKICAgZW5kaWYKIGVuZGlmCiAKLWlmbmVxICgkKGZpbHRlciB1bmRlZmluZWQsJChteV9zYW5pdGl6ZSkpLCkKLSAgaWZuZGVmIExPQ0FMX0lTX0hPU1RfTU9EVUxFCi0gICAgJChlcnJvciB1YnNhbiBpcyBub3QgeWV0IHN1cHBvcnRlZCBvbiB0aGUgdGFyZ2V0KQorIyBVc2UgbWluaW1hbCBkaWFnbm9zdGljcyB3aGVuIGludGVnZXIgb3ZlcmZsb3cgaXMgZW5hYmxlZDsgbmV2ZXIgZG8gaXQgZm9yIEhPU1Qgb3IgQVVYIG1vZHVsZXMKK2lmZXEgKCQoTE9DQUxfSVNfSE9TVF9NT0RVTEUpJChMT0NBTF9JU19BVVhfTU9EVUxFKSwpCisgICMgUHJlLWVtcHRpdmVseSBhZGQgVUJTQU4gbWluaW1hbCBydW50aW1lIGluY2FzZSBhIHN0YXRpYyBsaWJyYXJ5IGRlcGVuZGVuY3kgcmVxdWlyZXMgaXQKKyAgaWZlcSAoJChmaWx0ZXIgU1RBVElDX0xJQlJBUklFUywkKExPQ0FMX01PRFVMRV9DTEFTUykpLCkKKyAgICBpZm5kZWYgTE9DQUxfU0RLX1ZFUlNJT04KKyAgICAgIG15X3N0YXRpY19saWJyYXJpZXMgKz0gJCgkKExPQ0FMXzJORF9BUkNIX1ZBUl9QUkVGSVgpVUJTQU5fTUlOSU1BTF9SVU5USU1FX0xJQlJBUlkpCisgICAgICBteV9sZGZsYWdzICs9IC1XbCwtLWV4Y2x1ZGUtbGlicywkKCQoTE9DQUxfMk5EX0FSQ0hfVkFSX1BSRUZJWClVQlNBTl9NSU5JTUFMX1JVTlRJTUVfTElCUkFSWSkuYQorICAgIGVuZGlmCisgIGVuZGlmCisgIGlmbmVxICgkKGZpbHRlciB1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IHNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IGludGVnZXIsJChteV9zYW5pdGl6ZSkpLCkKKyAgICBpZmVxICgkKGZpbHRlciB1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IHNpZ25lZC1pbnRlZ2VyIG92ZXJmbG93IGludGVnZXIsJChteV9zYW5pdGl6ZV9kaWFnKSksKQorICAgICAgaWZlcSAoJChmaWx0ZXIgY2ZpLCQobXlfc2FuaXRpemVfZGlhZykpLCkKKyAgICAgICAgaWZlcSAoJChmaWx0ZXIgYWRkcmVzcywkKG15X3Nhbml0aXplKSksKQorICAgICAgICAgIG15X2NmbGFncyArPSAtZnNhbml0aXplLW1pbmltYWwtcnVudGltZQorICAgICAgICAgIG15X2NmbGFncyArPSAtZm5vLXNhbml0aXplLXRyYXA9aW50ZWdlcgorICAgICAgICAgIG15X2NmbGFncyArPSAtZm5vLXNhbml0aXplLXJlY292ZXI9aW50ZWdlcgorICAgICAgICBlbmRpZgorICAgICAgZW5kaWYKKyAgICBlbmRpZgogICBlbmRpZgogZW5kaWYKIApAQCAtMjk2LDExICszNTQsMTYgQEAKIGVuZGlmCiAKIGlmbmVxICgkKG15X3Nhbml0aXplX2RpYWcpLCkKLSAgbm90cmFwX2FyZyA6PSAkKHN1YnN0ICQoc3BhY2UpLCQoY29tbWEpLCQobXlfc2FuaXRpemVfZGlhZykpLAotICBteV9jZmxhZ3MgKz0gLWZuby1zYW5pdGl6ZS10cmFwPSQobm90cmFwX2FyZykKLSAgIyBEaWFnbm9zdGljIHJlcXVpcmVzIGEgcnVudGltZSBsaWJyYXJ5LCB1bmxlc3MgQVNhbiBvciBUU2FuIGFyZSBhbHNvIGVuYWJsZWQuCi0gIGlmZXEgKCQoZmlsdGVyIGFkZHJlc3MgdGhyZWFkLCQobXlfc2FuaXRpemUpKSwpCi0gICAgIyBEb2VzIG5vdCBoYXZlIHRvIGJlIHRoZSBmaXJzdCBEVF9ORUVERUQgdW5saWtlIEFTYW4uCi0gICAgbXlfc2hhcmVkX2xpYnJhcmllcyArPSAkKCQoTE9DQUxfMk5EX0FSQ0hfVkFSX1BSRUZJWClVQlNBTl9SVU5USU1FX0xJQlJBUlkpCisgICMgVE9ETyh2aXNod2F0aCk6IEFkZCBkaWFnbm9zdGljIHN1cHBvcnQgZm9yIHN0YXRpYyBleGVjdXRhYmxlcyBvbmNlCisgICMgd2Ugc3dpdGNoIHRvIGNsYW5nLTQzOTMxMjIgKHdoaWNoIGFkZHMgdGhlIHN0YXRpYyB1YnNhbiBydW50aW1lCisgICMgdGhhdCB0aGlzIGRlcGVuZHMgb24pCisgIGlmbmVxICgkKExPQ0FMX0ZPUkNFX1NUQVRJQ19FWEVDVVRBQkxFKSx0cnVlKQorICAgIG5vdHJhcF9hcmcgOj0gJChzdWJzdCAkKHNwYWNlKSwkKGNvbW1hKSwkKG15X3Nhbml0aXplX2RpYWcpKSwKKyAgICBteV9jZmxhZ3MgKz0gLWZuby1zYW5pdGl6ZS10cmFwPSQobm90cmFwX2FyZykKKyAgICAjIERpYWdub3N0aWMgcmVxdWlyZXMgYSBydW50aW1lIGxpYnJhcnksIHVubGVzcyBBU2FuIG9yIFRTYW4gYXJlIGFsc28gZW5hYmxlZC4KKyAgICBpZmVxICgkKGZpbHRlciBhZGRyZXNzIHRocmVhZCwkKG15X3Nhbml0aXplKSksKQorICAgICAgIyBEb2VzIG5vdCBoYXZlIHRvIGJlIHRoZSBmaXJzdCBEVF9ORUVERUQgdW5saWtlIEFTYW4uCisgICAgICBteV9zaGFyZWRfbGlicmFyaWVzICs9ICQoJChMT0NBTF8yTkRfQVJDSF9WQVJfUFJFRklYKVVCU0FOX1JVTlRJTUVfTElCUkFSWSkKKyAgICBlbmRpZgogICBlbmRpZgogZW5kaWYKZGlmZiAtLWdpdCBhL2NvcmUvY29uZmlndXJlX2xvY2FsX2phY2subWsgYi9jb3JlL2NvbmZpZ3VyZV9sb2NhbF9qYWNrLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODA0OWEzLi4wMDAwMDAwCi0tLSBhL2NvcmUvY29uZmlndXJlX2xvY2FsX2phY2subWsKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0jCi0jIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi1pZmRlZiBBTkRST0lEX0ZPUkNFX0pBQ0tfRU5BQkxFRAotTE9DQUxfSkFDS19FTkFCTEVEIDo9ICQoQU5EUk9JRF9GT1JDRV9KQUNLX0VOQUJMRUQpCi1lbmRpZgotCi1pZm5lcSAoJChBTkRST0lEX0NPTVBJTEVfV0lUSF9KQUNLKSx0cnVlKQotTE9DQUxfSkFDS19FTkFCTEVEIDo9Ci1lbmRpZgotCi1MT0NBTF9KQUNLX0VOQUJMRUQgOj0gJChzdHJpcCAkKExPQ0FMX0pBQ0tfRU5BQkxFRCkpCi1MT0NBTF9NT0RVTEUgOj0gJChzdHJpcCAkKExPQ0FMX01PRFVMRSkpCi0KLXZhbGlkX2phY2tfZW5hYmxlZF92YWx1ZXMgOj0gZnVsbCBpbmNyZW1lbnRhbCBqYXZhY19mcm9udGVuZCBkaXNhYmxlZAotCi1pZmRlZiBMT0NBTF9KQUNLX0VOQUJMRUQKLSAgaWZuZXEgKCQoTE9DQUxfSkFDS19FTkFCTEVEKSwkKGZpbHRlciAkKGZpcnN0d29yZCAkKExPQ0FMX0pBQ0tfRU5BQkxFRCkpLCQodmFsaWRfamFja19lbmFibGVkX3ZhbHVlcykpKQotICAgICQoZXJyb3IgJChMT0NBTF9QQVRIKTogaW52YWxpZCBMT0NBTF9KQUNLX0VOQUJMRUQgIiQoTE9DQUxfSkFDS19FTkFCTEVEKSIgZm9yICQoTE9DQUxfTU9EVUxFKSkKLSAgZW5kaWYKLQotICBpZmVxICgkKExPQ0FMX0pBQ0tfRU5BQkxFRCksZGlzYWJsZWQpCi0gICAgTE9DQUxfSkFDS19FTkFCTEVEIDo9Ci0gIGVuZGlmCi1lbmRpZgotCi1pZmRlZiAkKExPQ0FMX01PRFVMRSkuSkFDS19WRVJTSU9OCi1MT0NBTF9KQUNLX1ZFUlNJT04gOj0gJCgkKExPQ0FMX01PRFVMRSkuSkFDS19WRVJTSU9OKQotZWxzZQotTE9DQUxfSkFDS19WRVJTSU9OIDo9ICQoSkFDS19ERUZBVUxUX1ZFUlNJT04pCi1lbmRpZgpkaWZmIC0tZ2l0IGEvY29yZS9jb25zdHJ1Y3RfY29udGV4dC5zaCBiL2NvcmUvY29uc3RydWN0X2NvbnRleHQuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYjRhZTUxOQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvY29uc3RydWN0X2NvbnRleHQuc2gKQEAgLTAsMCArMSw1NCBAQAorIyEvYmluL2Jhc2gKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3NldCAtZQorCisjIGlucHV0czoKKyMgJDEgaXMgUFJJVkFURV9DT05ESVRJT05BTF9VU0VTX0xJQlJBUklFU19IT1NUCisjICQyIGlzIFBSSVZBVEVfQ09ORElUSU9OQUxfVVNFU19MSUJSQVJJRVNfVEFSR0VUCisKKyMgY2xhc3NfbG9hZGVyX2NvbnRleHQ6IGxpYnJhcnkgcGF0aHMgb24gdGhlIGhvc3QKKyMgc3RvcmVkX2NsYXNzX2xvYWRlcl9jb250ZXh0X2xpYnM6IGxpYnJhcnkgcGF0aHMgb24gZGV2aWNlCisjIHRoZXNlIGFyZSBib3RoIGNvbW1hIHNlcGFyYXRlZCBwYXRocywgZXhhbXBsZTogbGliMS5qYXI6bGliMi5qYXIgb3IgL3N5c3RlbS9mcmFtZXdvcmsvbGliMS5qYXI6L3N5c3RlbS9mcmFtZXdvcmsvbGliMi5qYXIKKworIyB0YXJnZXRfc2RrX3ZlcnNpb246IHBhcnNlZCBmcm9tIG1hbmlmZXN0CisjIG15X2NvbmRpdGlvbmFsX2hvc3RfbGliczogbGlicmFyaWVzIGNvbmRpdGlvbmFsbHkgYWRkZWQgZm9yIG5vbiBQCisjIG15X2NvbmRpdGlvbmFsX3RhcmdldF9saWJzOiB0YXJnZXQgbGlicmFyaWVzIGNvbmRpdGlvbmFsbHkgYWRkZWQgZm9yIG5vbiBQCisjCisjIG91dHB1dHMKKyMgY2xhc3NfbG9hZGVyX2NvbnRleHRfYXJnOiBmaW5hbCBjbGFzcyBsb2FkZXIgY29uZXh0IGFyZworIyBzdG9yZWRfY2xhc3NfbG9hZGVyX2NvbnRleHRfYXJnOiBmaW5hbCBzdG9yZWQgY2xhc3MgbG9hZGVyIGNvbnRleHQgYXJnCisKK215X2NvbmRpdGlvbmFsX2hvc3RfbGlicz0kMQorbXlfY29uZGl0aW9uYWxfdGFyZ2V0X2xpYnM9JDIKKworIyBOb3RlIHRoYXQgU0RLIDI4IGlzIFAuCitpZiBbWyAiJHt0YXJnZXRfc2RrX3ZlcnNpb259IiAtbHQgIjI4IiBdXTsgdGhlbgorICBpZiBbWyAteiAiJHtjbGFzc19sb2FkZXJfY29udGV4dH0iIF1dOyB0aGVuCisgICAgZXhwb3J0IGNsYXNzX2xvYWRlcl9jb250ZXh0PSIke215X2NvbmRpdGlvbmFsX2hvc3RfbGlic30iCisgIGVsc2UKKyAgICBleHBvcnQgY2xhc3NfbG9hZGVyX2NvbnRleHQ9IiR7bXlfY29uZGl0aW9uYWxfaG9zdF9saWJzfToke2NsYXNzX2xvYWRlcl9jb250ZXh0fSIKKyAgZmkKKyAgaWYgW1sgLXogIiR7c3RvcmVkX2NsYXNzX2xvYWRlcl9jb250ZXh0X2xpYnN9IiBdXTsgdGhlbgorICAgIGV4cG9ydCBzdG9yZWRfY2xhc3NfbG9hZGVyX2NvbnRleHRfbGlicz0iJHtteV9jb25kaXRpb25hbF90YXJnZXRfbGlic30iOworICBlbHNlCisgICAgZXhwb3J0IHN0b3JlZF9jbGFzc19sb2FkZXJfY29udGV4dF9saWJzPSIke215X2NvbmRpdGlvbmFsX3RhcmdldF9saWJzfToke3N0b3JlZF9jbGFzc19sb2FkZXJfY29udGV4dF9saWJzfSI7CisgIGZpCitmaQorCisjIEdlbmVyYXRlIHRoZSBhY3R1YWwgY29udGV4dCBzdHJpbmcuCitleHBvcnQgY2xhc3NfbG9hZGVyX2NvbnRleHRfYXJnPSItLWNsYXNzLWxvYWRlci1jb250ZXh0PVBDTFske2NsYXNzX2xvYWRlcl9jb250ZXh0fV0iCitleHBvcnQgc3RvcmVkX2NsYXNzX2xvYWRlcl9jb250ZXh0X2FyZz0iLS1zdG9yZWQtY2xhc3MtbG9hZGVyLWNvbnRleHQ9UENMWyR7c3RvcmVkX2NsYXNzX2xvYWRlcl9jb250ZXh0X2xpYnN9XSIKZGlmZiAtLWdpdCBhL2NvcmUvY3h4X3N0bF9zZXR1cC5tayBiL2NvcmUvY3h4X3N0bF9zZXR1cC5tawppbmRleCAwYmFlYzI2Li41MTcxYjhhIDEwMDY0NAotLS0gYS9jb3JlL2N4eF9zdGxfc2V0dXAubWsKKysrIGIvY29yZS9jeHhfc3RsX3NldHVwLm1rCkBAIC03NCw2ICs3NCwxNiBAQAogaWZuZXEgKCQoZmlsdGVyICQobXlfY3h4X3N0bCksbGliYysrIGxpYmMrK19zdGF0aWMpLCkKICAgICBteV9jZmxhZ3MgKz0gLURfVVNJTkdfTElCQ1hYCiAKKyAgICBpZmVxICgkKCQobXlfcHJlZml4KU9TKSxkYXJ3aW4pCisgICAgICAgICMgbGliYysrJ3MgaGVhZGVycyBhcmUgYW5ub3RhdGVkIHdpdGggYXZhaWxhYmlsaXR5IG1hY3JvcyB0aGF0IGluZGljYXRlCisgICAgICAgICMgd2hpY2ggdmVyc2lvbiBvZiBNYWMgT1Mgd2FzIHRoZSBmaXJzdCB0byBzaGlwIHdpdGggYSBsaWJjKysgZmVhdHVyZQorICAgICAgICAjIGF2YWlsYWJsZSBpbiBpdHMgKnN5c3RlbSdzKiBsaWJjKysuZHlsaWIuIFdlIGRvIG5vdCB1c2UgdGhlIHN5c3RlbSdzCisgICAgICAgICMgbGlicmFyeSwgYnV0IHJhdGhlciBzaGlwIG91ciBvd24uIEFzIHN1Y2gsIHRoZXNlIGF2YWlsYWJpbGl0eQorICAgICAgICAjIGF0dHJpYnV0ZXMgYXJlIG1lYW5pbmdsZXNzIGZvciB1cyBidXQgY2F1c2UgYnVpbGQgYnJlYWtzIHdoZW4gd2UgdHJ5CisgICAgICAgICMgdG8gdXNlIGNvZGUgdGhhdCB3b3VsZCBub3QgYmUgYXZhaWxhYmxlIGluIHRoZSBzeXN0ZW0ncyBkeWxpYi4KKyAgICAgICAgbXlfY3BwZmxhZ3MgKz0gLURfTElCQ1BQX0RJU0FCTEVfQVZBSUxBQklMSVRZCisgICAgZW5kaWYKKwogICAgICMgTm90ZSB0aGF0IHRoZSBzdHJ1Y3R1cmUgb2YgdGhpcyBtZWFucyB0aGF0IExPQ0FMX0NYWF9TVEwgOj0gbGliYysrIHdpbGwKICAgICAjIHVzZSB0aGUgc3RhdGljIGxpYmMrKyBmb3Igc3RhdGljIGV4ZWN1dGFibGVzLgogICAgIGlmZXEgKCQobXlfbGlua190eXBlKSxkeW5hbWljKQpAQCAtODksNyArOTksNiBAQAogICAgIGlmZGVmIExPQ0FMX0lTX0hPU1RfTU9EVUxFCiAgICAgICAgIG15X2NwcGZsYWdzICs9IC1ub3N0ZGluYysrCiAgICAgICAgIG15X2xkZmxhZ3MgKz0gLW5vZGVmYXVsdGxpYnMKLSAgICAgICAgbXlfbGRsaWJzICs9IC1scHRocmVhZCAtbG0KICAgICAgICAgbXlfY3h4X2xkbGlicyArPSAkKCQoJChteV9wcmVmaXgpT1MpXyQobXlfbGlua190eXBlKV9nY2NsaWJzKQogICAgIGVsc2UKICAgICAgICAgaWZlcSAoYXJtLCQoJChteV9wcmVmaXgpJChMT0NBTF8yTkRfQVJDSF9WQVJfUFJFRklYKUFSQ0gpKQpkaWZmIC0tZ2l0IGEvY29yZS9kZWZpbml0aW9ucy5tayBiL2NvcmUvZGVmaW5pdGlvbnMubWsKaW5kZXggOTVlOWEwMi4uNTk5YWI0OSAxMDA2NDQKLS0tIGEvY29yZS9kZWZpbml0aW9ucy5taworKysgYi9jb3JlL2RlZmluaXRpb25zLm1rCkBAIC0xNjcsNyArMTY3LDcgQEAKICMgJCgxKTogZGlyZWN0b3J5IHRvIHNlYXJjaCB1bmRlcgogIyBJZ25vcmVzICQoMSkvQW5kcm9pZC5tawogZGVmaW5lIGZpcnN0LW1ha2VmaWxlcy11bmRlcgotJChzaGVsbCBidWlsZC90b29scy9maW5kbGVhdmVzLnB5ICQoRklORF9MRUFWRVNfRVhDTFVERVMpIFwKKyQoc2hlbGwgYnVpbGQvbWFrZS90b29scy9maW5kbGVhdmVzLnB5ICQoRklORF9MRUFWRVNfRVhDTFVERVMpIFwKICAgICAgICAgLS1taW5kZXB0aD0yICQoYWRkcHJlZml4IC0tZGlyPSwkKDEpKSBBbmRyb2lkLm1rKQogZW5kZWYKIApAQCAtNjcxLDI3ICs2NzEsMjggQEAKICMjICQoMik6IE5vbi1lbXB0eSBpZiBJU19IT1NUX01PRFVMRQogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIAotIyAkKDEpOiBsaWJyYXJ5IG5hbWUKLSMgJCgyKTogTm9uLWVtcHR5IGlmIElTX0hPU1RfTU9EVUxFCi1kZWZpbmUgX2phdmEtbGliLWRpcgotJChjYWxsIGludGVybWVkaWF0ZXMtZGlyLWZvciwgXAotCUpBVkFfTElCUkFSSUVTLCQoMSksJCgyKSxDT01NT04pCi1lbmRlZgotCi0jICQoMSk6IGxpYnJhcnkgbmFtZQotIyAkKDIpOiBOb24tZW1wdHkgaWYgSVNfSE9TVF9NT0RVTEUKLWRlZmluZSBfamF2YS1saWItZnVsbC1jbGFzc2VzLmphcgotJChjYWxsIF9qYXZhLWxpYi1kaXIsJCgxKSwkKDIpKS9jbGFzc2VzLmphcgotZW5kZWYKLQogIyBHZXQgdGhlIGphciBmaWxlcyAoeW91IGNhbiBwYXNzIHRvICJqYXZhYyAtY2xhc3NwYXRoIikgb2Ygc3RhdGljIG9yIHNoYXJlZAogIyBKYXZhIGxpYnJhcmllcyB0aGF0IHlvdSB3YW50IHRvIGxpbmsgYWdhaW5zdC4KICMgJCgxKTogbGlicmFyeSBuYW1lIGxpc3QKICMgJCgyKTogTm9uLWVtcHR5IGlmIElTX0hPU1RfTU9EVUxFCiBkZWZpbmUgamF2YS1saWItZmlsZXMKLSQoZm9yZWFjaCBsaWIsJCgxKSwkKGNhbGwgX2phdmEtbGliLWZ1bGwtY2xhc3Nlcy5qYXIsJChsaWIpLCQoMikpKQorJChmb3JlYWNoIGxpYiwkKDEpLCQoY2FsbCBpbnRlcm1lZGlhdGVzLWRpci1mb3IsSkFWQV9MSUJSQVJJRVMsJChsaWIpLCQoMiksQ09NTU9OKS9jbGFzc2VzLmphcikKIGVuZGVmCiAKKyMgR2V0IHRoZSBoZWFkZXIgamFyIGZpbGVzICh5b3UgY2FuIHBhc3MgdG8gImphdmFjIC1jbGFzc3BhdGgiKSBvZiBzdGF0aWMgb3Igc2hhcmVkCisjIEphdmEgbGlicmFyaWVzIHRoYXQgeW91IHdhbnQgdG8gbGluayBhZ2FpbnN0LgorIyAkKDEpOiBsaWJyYXJ5IG5hbWUgbGlzdAorIyAkKDIpOiBOb24tZW1wdHkgaWYgSVNfSE9TVF9NT0RVTEUKK2lmbmVxICgkKFRVUkJJTkVfRU5BQkxFRCksZmFsc2UpCitkZWZpbmUgamF2YS1saWItaGVhZGVyLWZpbGVzCiskKGZvcmVhY2ggbGliLCQoMSksJChjYWxsIGludGVybWVkaWF0ZXMtZGlyLWZvcixKQVZBX0xJQlJBUklFUywkKGxpYiksJCgyKSxDT01NT04pL2NsYXNzZXMtaGVhZGVyLmphcikKK2VuZGVmCitlbHNlCitkZWZpbmUgamF2YS1saWItaGVhZGVyLWZpbGVzCiskKGNhbGwgamF2YS1saWItZmlsZXMsJCgxKSwkKDIpKQorZW5kZWYKK2VuZGlmCisKICMgR2V0IHRoZSBkZXBlbmRlbmN5IGZpbGVzICh5b3UgY2FuIHB1dCBvbiB0aGUgcmlnaHQgc2lkZSBvZiAifCIgb2YgYSBidWlsZCBydWxlKQogIyBvZiB0aGUgSmF2YSBsaWJyYXJpZXMuCiAjICQoMSk6IGxpYnJhcnkgbmFtZSBsaXN0CkBAIC03MDQsMjUgKzcwNSwyNiBAQAogJChjYWxsIGphdmEtbGliLWZpbGVzLCQoMSksJCgyKSkKIGVuZGVmCiAKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMjIENvbnZlcnQgImNvcmUgZXh0IGZyYW1ld29yayIgdG8gIm91dC8uLi4vY2xhc3Nlcy5qYWNrIC4uLiIKLSMjICQoMSk6IGxpYnJhcnkgbGlzdAotIyMgJCgyKTogTm9uLWVtcHR5IGlmIElTX0hPU1RfTU9EVUxFCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICQoMSk6IGxpYnJhcnkgbmFtZQotIyAkKDIpOiBOb24tZW1wdHkgaWYgSVNfSE9TVF9NT0RVTEUKLWRlZmluZSBfamFjay1saWItZnVsbC1jbGFzc2VzCi0kKGNhbGwgX2phdmEtbGliLWRpciwkKDEpLCQoMikpL2NsYXNzZXMuamFjawotZW5kZWYKLQorIyBHZXQgdGhlIGphciBmaWxlcyAoeW91IGNhbiBwYXNzIHRvICJqYXZhYyAtY2xhc3NwYXRoIikgb2Ygc3RhdGljIG9yIHNoYXJlZAorIyBBUEsgbGlicmFyaWVzIHRoYXQgeW91IHdhbnQgdG8gbGluayBhZ2FpbnN0LgogIyAkKDEpOiBsaWJyYXJ5IG5hbWUgbGlzdAotIyAkKDIpOiBOb24tZW1wdHkgaWYgSVNfSE9TVF9NT0RVTEUKLWRlZmluZSBqYWNrLWxpYi1maWxlcwotJChmb3JlYWNoIGxpYiwkKDEpLCQoY2FsbCBfamFjay1saWItZnVsbC1jbGFzc2VzLCQobGliKSwkKDIpKSkKK2RlZmluZSBhcHAtbGliLWZpbGVzCiskKGZvcmVhY2ggbGliLCQoMSksJChjYWxsIGludGVybWVkaWF0ZXMtZGlyLWZvcixBUFBTLCQobGliKSwsQ09NTU9OKS9jbGFzc2VzLmphcikKIGVuZGVmCiAKKyMgR2V0IHRoZSBoZWFkZXIgamFyIGZpbGVzICh5b3UgY2FuIHBhc3MgdG8gImphdmFjIC1jbGFzc3BhdGgiKSBvZiBzdGF0aWMgb3Igc2hhcmVkCisjIEFQSyBsaWJyYXJpZXMgdGhhdCB5b3Ugd2FudCB0byBsaW5rIGFnYWluc3QuCisjICQoMSk6IGxpYnJhcnkgbmFtZSBsaXN0CitpZm5lcSAoJChUVVJCSU5FX0VOQUJMRUQpLGZhbHNlKQorZGVmaW5lIGFwcC1saWItaGVhZGVyLWZpbGVzCiskKGZvcmVhY2ggbGliLCQoMSksJChjYWxsIGludGVybWVkaWF0ZXMtZGlyLWZvcixBUFBTLCQobGliKSwsQ09NTU9OKS9jbGFzc2VzLWhlYWRlci5qYXIpCitlbmRlZgorZWxzZQorZGVmaW5lIGFwcC1saWItaGVhZGVyLWZpbGVzCiskKGNhbGwgYXBwLWxpYi1maWxlcywkKDEpKQorZW5kZWYKK2VuZGlmCisKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAjIyBSZXR1cm5zIHRydWUgaWYgJCgxKSBhbmQgJCgyKSBhcmUgZXF1YWwuICBSZXR1cm5zCiAjIyB0aGUgZW1wdHkgc3RyaW5nIGlmIHRoZXkgYXJlIG5vdCBlcXVhbC4KQEAgLTEwMzQsOSArMTAzNiw5IEBACiAgICQoUFJJVkFURV9SU19GTEFHUykgXAogICAkKGZvcmVhY2ggaW5jLCQoUFJJVkFURV9SU19JTkNMVURFUyksJChhZGRwcmVmaXggLUkgLCAkKGluYykpKSBcCiAgICQoUFJJVkFURV9SU19TT1VSQ0VfRklMRVMpCiskKFNPT05HX1pJUCkgLW8gJEAgLUMgJChQUklWQVRFX1JTX09VVFBVVF9ESVIpL3NyYyAtRCAkKFBSSVZBVEVfUlNfT1VUUFVUX0RJUikvc3JjCiskKFNPT05HX1pJUCkgLW8gJChQUklWQVRFX1JTX09VVFBVVF9SRVNfWklQKSAtQyAkKFBSSVZBVEVfUlNfT1VUUFVUX0RJUikvcmVzIC1EICQoUFJJVkFURV9SU19PVVRQVVRfRElSKS9yZXMKICQoY2FsbCBfbWVyZ2UtcmVuZGVyc2NyaXB0LWQsJChQUklWQVRFX0RFUF9GSUxFUyksJEAuZCkKLSQoaGlkZSkgbWtkaXIgLXAgJChkaXIgJEApCi0kKGhpZGUpIHRvdWNoICRACiBlbmRlZgogCiBkZWZpbmUgdHJhbnNmb3JtLWJjLXRvLXNvCkBAIC0xMDQ4LDggKzEwNTAsOSBAQAogCS1XbCwtcnBhdGgsXCQkT1JJR0lOLy4uL2xpYiBcCiAJJChkaXIgJEApLyQobm90ZGlyICQoPDouYmM9Lm8pKSBcCiAJJChSU19QUkVCVUlMVF9DT01QSUxFUl9SVCkgXAotCS1vICRAICQoVEFSR0VUX0dMT0JBTF9MREZMQUdTKSAtV2wsLS1oYXNoLXN0eWxlPXN5c3YgLUwgcHJlYnVpbHRzL2djYy8gXAotCSQoUlNfUFJFQlVJTFRfTElCUEFUSCkgXAorCS1vICRAICQoVEFSR0VUX0dMT0JBTF9MREZMQUdTKSAtV2wsLS1oYXNoLXN0eWxlPXN5c3YgXAorCS1MICQoU09PTkdfT1VUX0RJUikvbmRrL3BsYXRmb3Jtcy9hbmRyb2lkLSQoUFJJVkFURV9TREtfVkVSU0lPTikvYXJjaC0kKFRBUkdFVF9BUkNIKS91c3IvbGliNjQgXAorCS1MICQoU09PTkdfT1VUX0RJUikvbmRrL3BsYXRmb3Jtcy9hbmRyb2lkLSQoUFJJVkFURV9TREtfVkVSU0lPTikvYXJjaC0kKFRBUkdFVF9BUkNIKS91c3IvbGliIFwKIAkkKGNhbGwgaW50ZXJtZWRpYXRlcy1kaXItZm9yLFNIQVJFRF9MSUJSQVJJRVMsbGliUlNTdXBwb3J0KS9saWJSU1N1cHBvcnQuc28gXAogCS1sbSAtbGMKIGVuZGVmCkBAIC0xNTUzLDcgKzE1NTYsNyBAQAogICAgICAgICBmaWxlbGlzdD0iJCRmaWxlbGlzdCAkJGxkaXIvJCRleHQkJGYiOyBcCiAgICAgZG9uZSA7IFwKICAgICAkKCQoUFJJVkFURV8yTkRfQVJDSF9WQVJfUFJFRklYKVRBUkdFVF9BUikgJCgkKFBSSVZBVEVfMk5EX0FSQ0hfVkFSX1BSRUZJWClUQVJHRVRfR0xPQkFMX0FSRkxBR1MpIFwKLSAgICAgICAgJCgyKSAkJGZpbGVsaXN0CisgICAgICAgICQoUFJJVkFURV9BUkZMQUdTKSAkKDIpICQkZmlsZWxpc3QKIAogZW5kZWYKIApAQCAtMTcyMCw2ICsxNzIzLDEwIEBACiAkKGlmICQoUFJJVkFURV9BTExfT0JKRUNUUyksLCQoaGlkZSkgJCgkKFBSSVZBVEVfMk5EX0FSQ0hfVkFSX1BSRUZJWCkkKFBSSVZBVEVfUFJFRklYKUFSKSBkICQoMSkgJChkaXIgJCgxKSlkdW1teS5vIFwKICAgJiYgcm0gLWYgJChkaXIgJCgxKSlkdW1teS5vKQogZW5kZWYKK2Vsc2UKK2NyZWF0ZS1kdW1teS5vLWlmLW5vLW9ianMgPQorZ2V0LWR1bW15Lm8taWYtbm8tb2JqcyA9CitkZWxldGUtZHVtbXkuby1pZi1uby1vYmpzID0KIGVuZGlmICAjIEhPU1RfT1MgaXMgZGFyd2luCiAKICMgRXhwbGljaXRseSBkZWxldGUgdGhlIGFyY2hpdmUgZmlyc3Qgc28gdGhhdCBhciBkb2Vzbid0CkBAIC0xODQyLDYgKzE4NDksNyBAQAogICAkKFBSSVZBVEVfTk0pIC1EICQ8IC0tZm9ybWF0PXBvc2l4IC0tZGVmaW5lZC1vbmx5IHwgYXdrICd7IHByaW50ICQkMSB9JyB8IHNvcnQgPiRALmR5bnN5bXMgJiYgXAogICAkKFBSSVZBVEVfTk0pICQ8IC0tZm9ybWF0PXBvc2l4IC0tZGVmaW5lZC1vbmx5IHwgYXdrICd7IGlmICgkJDIgPT0gIlQiIHx8ICQkMiA9PSAidCIgfHwgJCQyID09ICJEIikgcHJpbnQgJCQxIH0nIHwgc29ydCA+JEAuZnVuY3N5bXMgJiYgXAogICBjb21tIC0xMyAkQC5keW5zeW1zICRALmZ1bmNzeW1zID4kQC5rZWVwX3N5bWJvbHMgJiYgXAorICBlY2hvID4+JEAua2VlcF9zeW1ib2xzICYmIFwKICAgJChQUklWQVRFX09CSkNPUFkpIC0tcmVuYW1lLXNlY3Rpb24gLmRlYnVnX2ZyYW1lPXNhdmVkX2RlYnVnX2ZyYW1lICRALmRlYnVnICRALm1pbmlfZGVidWdpbmZvICYmIFwKICAgJChQUklWQVRFX09CSkNPUFkpIC1TIC0tcmVtb3ZlLXNlY3Rpb24gLmdkYl9pbmRleCAtLXJlbW92ZS1zZWN0aW9uIC5jb21tZW50IC0ta2VlcC1zeW1ib2xzPSRALmtlZXBfc3ltYm9scyAkQC5taW5pX2RlYnVnaW5mbyAmJiBcCiAgICQoUFJJVkFURV9PQkpDT1BZKSAtLXJlbmFtZS1zZWN0aW9uIHNhdmVkX2RlYnVnX2ZyYW1lPS5kZWJ1Z19mcmFtZSAkQC5taW5pX2RlYnVnaW5mbyAmJiBcCkBAIC0xOTk5LDE3ICsyMDA3LDYgQEAKICMjIENvbW1hbmRzIGZvciBydW5uaW5nIGphdmFjIHRvIG1ha2UgLmNsYXNzIGZpbGVzCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogCi0jIEFkZCBCVUlMRF9OVU1CRVIgdG8gYXBwcyBkZWZhdWx0IHZlcnNpb24gbmFtZSBpZiBpdCdzIHVuYnVuZGxlZCBidWlsZC4KLWlmZGVmIFRBUkdFVF9CVUlMRF9BUFBTCi1UQVJHRVRfQlVJTERfV0lUSF9BUFBTX1ZFUlNJT05fTkFNRSA6PSB0cnVlCi1lbmRpZgotCi1pZmRlZiBUQVJHRVRfQlVJTERfV0lUSF9BUFBTX1ZFUlNJT05fTkFNRQotQVBQU19ERUZBVUxUX1ZFUlNJT05fTkFNRSA6PSAkKFBMQVRGT1JNX1ZFUlNJT04pLSQoQlVJTERfTlVNQkVSX0ZST01fRklMRSkKLWVsc2UKLUFQUFNfREVGQVVMVF9WRVJTSU9OX05BTUUgOj0gJChQTEFURk9STV9WRVJTSU9OKQotZW5kaWYKLQogIyBiLzM3NzUwMjI0CiBBQVBUX0FTQU5fT1BUSU9OUyA6PSBBU0FOX09QVElPTlM9ZGV0ZWN0X2xlYWtzPTAKIApAQCAtMjAyNSwxMSArMjAyMiwxMiBAQAogIyBUaGlzIHJ1bGUgY3JlYXRlcyB0aGUgUi5qYXZhIGFuZCBNYW5pZmVzdC5qYXZhIGZpbGVzLCBib3RoIG9mIHdoaWNoCiAjIGFyZSBQUk9EVUNULW5ldXRyYWwuICBEb24ndCBwYXNzIFBSSVZBVEVfUFJPRFVDVF9BQVBUX0NPTkZJRyB0byB0aGlzIGludm9jYXRpb24uCiBkZWZpbmUgY3JlYXRlLXJlc291cmNlLWphdmEtZmlsZXMKLUBta2RpciAtcCAkKFBSSVZBVEVfU09VUkNFX0lOVEVSTUVESUFURVNfRElSKQogQG1rZGlyIC1wICQoZGlyICQoUFJJVkFURV9SRVNPVVJDRV9QVUJMSUNTX09VVFBVVCkpCitybSAtcmYgJChQUklWQVRFX0pBVkFfR0VOX0RJUikKK21rZGlyIC1wICQoUFJJVkFURV9KQVZBX0dFTl9ESVIpCiAkKGhpZGUpICQoQUFQVF9BU0FOX09QVElPTlMpICQoQUFQVCkgcGFja2FnZSAkKFBSSVZBVEVfQUFQVF9GTEFHUykgLW0gXAogICAgICQoZXZhbCAjIFBSSVZBVEVfUFJPRFVDVF9BQVBUX0NPTkZJRyBpcyBpbnRlbnRpb25hbGx5IG1pc3NpbmctLSBzZWUgY29tbWVudC4pIFwKLSAgICAkKGFkZHByZWZpeCAtSiAsICQoUFJJVkFURV9TT1VSQ0VfSU5URVJNRURJQVRFU19ESVIpKSBcCisgICAgJChhZGRwcmVmaXggLUogLCAkKFBSSVZBVEVfSkFWQV9HRU5fRElSKSkgXAogICAgICQoYWRkcHJlZml4IC1NICwgJChQUklWQVRFX0FORFJPSURfTUFOSUZFU1QpKSBcCiAgICAgJChhZGRwcmVmaXggLVAgLCAkKFBSSVZBVEVfUkVTT1VSQ0VfUFVCTElDU19PVVRQVVQpKSBcCiAgICAgJChhZGRwcmVmaXggLVMgLCAkKFBSSVZBVEVfUkVTT1VSQ0VfRElSKSkgXApAQCAtMjA0MywyOCArMjA0MSwzMSBAQAogICAgICQoYWRkcHJlZml4IC0tcmVuYW1lLW1hbmlmZXN0LXBhY2thZ2UgLCAkKFBSSVZBVEVfTUFOSUZFU1RfUEFDS0FHRV9OQU1FKSkgXAogICAgICQoYWRkcHJlZml4IC0tcmVuYW1lLWluc3RydW1lbnRhdGlvbi10YXJnZXQtcGFja2FnZSAsICQoUFJJVkFURV9NQU5JRkVTVF9JTlNUUlVNRU5UQVRJT05fRk9SKSkgXAogICAgIC0tc2tpcC1zeW1ib2xzLXdpdGhvdXQtZGVmYXVsdC1sb2NhbGl6YXRpb24KKyQoU09PTkdfWklQKSAtbyAkKFBSSVZBVEVfU1JDSkFSKSAtQyAkKFBSSVZBVEVfSkFWQV9HRU5fRElSKSAtRCAkKFBSSVZBVEVfSkFWQV9HRU5fRElSKQorIyBTbyB0aGF0IHdlIHJlLXJ1biBhYXB0IHdoZW4gdGhlIGxpc3Qgb2YgaW5wdXQgZmlsZXMgY2hhbmdlCiskKGhpZGUpIGVjaG8gJChQUklWQVRFX1JFU09VUkNFX0xJU1QpID4vZGV2L251bGwKIGVuZGVmCiAKLSMgU2VhcmNoIGZvciBnZW5lcmF0ZWQgUi5qYXZhL01hbmlmZXN0LmphdmEsIGNvcHkgdGhlIGZvdW5kIFIuamF2YSBhcyAkQC4KKyMgU2VhcmNoIGZvciBnZW5lcmF0ZWQgUi5qYXZhL01hbmlmZXN0LmphdmEgaW4gJDEsIGNvcHkgdGhlIGZvdW5kIFIuamF2YSBhcyAkMi4KICMgQWxzbyBjb3B5IHRoZW0gdG8gYSBjZW50cmFsICdSJyBkaXJlY3RvcnkgdG8gbWFrZSBpdCBlYXNpZXIgdG8gYWRkIHRoZSBmaWxlcyB0byBhbiBJREUuCiBkZWZpbmUgZmluZC1nZW5lcmF0ZWQtUi5qYXZhCi0kKGhpZGUpIGZvciBHRU5FUkFURURfTUFOSUZFU1RfRklMRSBpbiBgZmluZCAkKFBSSVZBVEVfU09VUkNFX0lOVEVSTUVESUFURVNfRElSKSBcCiskKGhpZGUpIGZvciBHRU5FUkFURURfTUFOSUZFU1RfRklMRSBpbiBgZmluZCAkKDEpIFwKICAgLW5hbWUgTWFuaWZlc3QuamF2YSAyPiAvZGV2L251bGxgOyBkbyBcCiAgICAgZGlyPWBhd2sgJy9wYWNrYWdlL3tnc3ViKC9cLi8sIi8iLCQkMik7Z3N1YigvOy8sIiIsJCQyKTtwcmludCAkJDI7ZXhpdH0nICQkR0VORVJBVEVEX01BTklGRVNUX0ZJTEVgOyBcCiAgICAgbWtkaXIgLXAgJChUQVJHRVRfQ09NTU9OX09VVF9ST09UKS9SLyQkZGlyOyBcCiAgICAgJChBQ1ApIC1mcCAkJEdFTkVSQVRFRF9NQU5JRkVTVF9GSUxFICQoVEFSR0VUX0NPTU1PTl9PVVRfUk9PVCkvUi8kJGRpcjsgXAogICBkb25lOwotJChoaWRlKSBmb3IgR0VORVJBVEVEX1JfRklMRSBpbiBgZmluZCAkKFBSSVZBVEVfU09VUkNFX0lOVEVSTUVESUFURVNfRElSKSBcCiskKGhpZGUpIGZvciBHRU5FUkFURURfUl9GSUxFIGluIGBmaW5kICQoMSkgXAogICAtbmFtZSBSLmphdmEgMj4gL2Rldi9udWxsYDsgZG8gXAogICAgIGRpcj1gYXdrICcvcGFja2FnZS97Z3N1YigvXC4vLCIvIiwkJDIpO2dzdWIoLzsvLCIiLCQkMik7cHJpbnQgJCQyO2V4aXR9JyAkJEdFTkVSQVRFRF9SX0ZJTEVgOyBcCiAgICAgbWtkaXIgLXAgJChUQVJHRVRfQ09NTU9OX09VVF9ST09UKS9SLyQkZGlyOyBcCiAgICAgJChBQ1ApIC1mcCAkJEdFTkVSQVRFRF9SX0ZJTEUgJChUQVJHRVRfQ09NTU9OX09VVF9ST09UKS9SLyQkZGlyIFwKICAgICAgIHx8IGV4aXQgMzE7IFwKLSAgICAkKEFDUCkgLWZwICQkR0VORVJBVEVEX1JfRklMRSAkQCB8fCBleGl0IDMyOyBcCisgICAgJChBQ1ApIC1mcCAkJEdFTkVSQVRFRF9SX0ZJTEUgJCgyKSB8fCBleGl0IDMyOyBcCiAgIGRvbmU7CiBAIyBFbnN1cmUgdGhhdCB0aGUgdGFyZ2V0IGZpbGUgaXMgYWx3YXlzIGNyZWF0ZWQsIGkuZS4gYWxzbyBpbiBjYXNlIHdlIGRpZCBub3QKIEAjIGVudGVyIHRoZSBHRU5FUkFURURfUl9GSUxFLWxvb3AgYWJvdmUuIFRoaXMgYXZvaWRzIHVubmVjZXNzYXJ5IHJlYnVpbGRpbmcuCi0kKGhpZGUpIHRvdWNoICRACiskKGhpZGUpIHRvdWNoICQoMikKIGVuZGVmCiAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCkBAIC0yMDgxLDYgKzIwODIsMTMgQEAKICAgJChQUklWQVRFX0FBUFQyX0NGTEFHUykgLS1sZWdhY3kKIGVuZGVmCiAKKyMgVE9ETyhiLzc0NTc0NTU3KTogdXNlIGFhcHQyIGNvbXBpbGUgLS16aXAgaWYgaXQgZ2V0cyBpbXBsZW1lbnRlZAorZGVmaW5lIGFhcHQyLWNvbXBpbGUtcmVzb3VyY2UtemlwcworQG1rZGlyIC1wICQoZGlyICRAKQorJChaSVBTWU5DKSAtZCAkQC5jb250ZW50cyAtbCAkQC5saXN0ICQoUFJJVkFURV9TT1VSQ0VfUkVTX1pJUFMpCiskKGhpZGUpICQoQUFQVDIpIGNvbXBpbGUgLW8gJEAgLS1kaXIgJEAuY29udGVudHMgJChQUklWQVRFX0FBUFQyX0NGTEFHUykgLS1sZWdhY3kKK2VuZGVmCisKICMgU2V0IHVwIHJ1bGUgdG8gY29tcGlsZSBvbmUgcmVzb3VyY2UgZmlsZSB3aXRoIGFhcHQyLgogIyBNdXN0IGJlIGNhbGxlZCB3aXRoICQoZXZhbCkuCiAjICQoMSk6IHRoZSBzb3VyY2UgZmlsZQpAQCAtMjEwNSwxNSArMjExMywxOCBAQAogCiBkZWZpbmUgYWFwdDItbGluawogQG1rZGlyIC1wICQoZGlyICRAKQorcm0gLXJmICQoUFJJVkFURV9KQVZBX0dFTl9ESVIpCitta2RpciAtcCAkKFBSSVZBVEVfSkFWQV9HRU5fRElSKQogJChjYWxsIGR1bXAtd29yZHMtdG8tZmlsZSwkKFBSSVZBVEVfUkVTX0ZMQVQpLCQoZGlyICRAKWFhcHQyLWZsYXQtbGlzdCkKICQoY2FsbCBkdW1wLXdvcmRzLXRvLWZpbGUsJChQUklWQVRFX09WRVJMQVlfRkxBVCksJChkaXIgJEApYWFwdDItZmxhdC1vdmVybGF5LWxpc3QpCiAkKGhpZGUpICQoQUFQVDIpIGxpbmsgLW8gJEAgXAogICAkKFBSSVZBVEVfQUFQVF9GTEFHUykgXAorICAkKGlmICQoUFJJVkFURV9TVEFUSUNfTElCUkFSWV9FWFRSQV9QQUNLQUdFUyksJCQoY2F0ICQoUFJJVkFURV9TVEFUSUNfTElCUkFSWV9FWFRSQV9QQUNLQUdFUykpKSBcCiAgICQoYWRkcHJlZml4IC0tbWFuaWZlc3QgLCQoUFJJVkFURV9BTkRST0lEX01BTklGRVNUKSkgXAogICAkKGFkZHByZWZpeCAtSSAsJChQUklWQVRFX0FBUFRfSU5DTFVERVMpKSBcCiAgICQoYWRkcHJlZml4IC1JICwkKFBSSVZBVEVfU0hBUkVEX0FORFJPSURfTElCUkFSSUVTKSkgXAogICAkKGFkZHByZWZpeCAtQSAsJChQUklWQVRFX0FTU0VUX0RJUikpIFwKLSAgJChhZGRwcmVmaXggLS1qYXZhICwkKFBSSVZBVEVfU09VUkNFX0lOVEVSTUVESUFURVNfRElSKSkgXAorICAkKGFkZHByZWZpeCAtLWphdmEgLCQoUFJJVkFURV9KQVZBX0dFTl9ESVIpKSBcCiAgICQoYWRkcHJlZml4IC0tcHJvZ3VhcmQgLCQoUFJJVkFURV9QUk9HVUFSRF9PUFRJT05TX0ZJTEUpKSBcCiAgICQoYWRkcHJlZml4IC0tbWluLXNkay12ZXJzaW9uICwkKFBSSVZBVEVfREVGQVVMVF9BUFBfVEFSR0VUX1NESykpIFwKICAgJChhZGRwcmVmaXggLS10YXJnZXQtc2RrLXZlcnNpb24gLCQoUFJJVkFURV9ERUZBVUxUX0FQUF9UQVJHRVRfU0RLKSkgXApAQCAtMjEyNiw2ICsyMTM3LDggQEAKICAgJChhZGRwcmVmaXggLS1yZW5hbWUtaW5zdHJ1bWVudGF0aW9uLXRhcmdldC1wYWNrYWdlICwkKFBSSVZBVEVfTUFOSUZFU1RfSU5TVFJVTUVOVEFUSU9OX0ZPUikpIFwKICAgLVIgXEAkKGRpciAkQClhYXB0Mi1mbGF0LW92ZXJsYXktbGlzdCBcCiAgIFxAJChkaXIgJEApYWFwdDItZmxhdC1saXN0CiskKFNPT05HX1pJUCkgLW8gJChQUklWQVRFX1NSQ0pBUikgLUMgJChQUklWQVRFX0pBVkFfR0VOX0RJUikgLUQgJChQUklWQVRFX0pBVkFfR0VOX0RJUikKKyQoRVhUUkFDVF9KQVJfUEFDS0FHRVMpIC1pICQoUFJJVkFURV9TUkNKQVIpIC1vICQoUFJJVkFURV9BQVBUX0VYVFJBX1BBQ0tBR0VTKSAtLXByZWZpeCAnLS1leHRyYS1wYWNrYWdlcyAnCiBlbmRlZgogCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpAQCAtMjE4NCw1OCArMjE5Nyw3OSBAQAogICAgICAgZXhpdCAxOyBcCiAgICAgZmk7IFwKICAgICB1bnppcCAtcW8gJCRmIC1kICQoMik7IFwKKyAgICBybSAtZiAkKDIpL21vZHVsZS1pbmZvLmNsYXNzOyBcCiAgIGRvbmUKICAgJChpZiAkKFBSSVZBVEVfRE9OVF9ERUxFVEVfSkFSX01FVEFfSU5GKSwsJChoaWRlKSBybSAtcmYgJCgyKS9NRVRBLUlORikKIGVuZGVmCiAKLSMgQ2FsbCBqYWNrCisjIFJldHVybiBqYXIgYXJndW1lbnRzIHRvIGNvbXByZXNzIGZpbGVzIGluIGEgZ2l2ZW4gZGlyZWN0b3J5CisjICQoMSk6IGRpcmVjdG9yeQogIwotZGVmaW5lIGNhbGwtamFjawotIEpBQ0tfVkVSU0lPTj0kKFBSSVZBVEVfSkFDS19WRVJTSU9OKSAkKEpBQ0spICQoREVGQVVMVF9KQUNLX0VYVFJBX0FSR1MpCisjIFJldHVybnMgYW4gQC1maWxlIGFyZ3VtZW50IHRoYXQgY29udGFpbnMgdGhlIG91dHB1dCBvZiBhIHN1YnNoZWxsCisjIHRoYXQgbG9va3MgbGlrZSAtQyAkKDEpIHBhdGgvdG8vZmlsZTEgLUMgJCgxKSBwYXRoL3RvL2ZpbGUyCisjIEFsc28gYWRkcyAiLUMgb3V0L2VtcHR5IC4iIHdoaWNoIGF2b2lkcyBlcnJvcnMgaW4gamFyIHdoZW4KKyMgdGhlcmUgYXJlIG5vIGZpbGVzIGluIHRoZSBkaXJlY3RvcnkuCitkZWZpbmUgamFyLWFyZ3Mtc29ydGVkLWZpbGVzLWluLWRpcmVjdG9yeQorICAgIEA8KGZpbmQgJCgxKSAtdHlwZSBmIHwgc29ydCB8ICQoSkFSX0FSR1MpICQoMSk7IGVjaG8gIi1DICQoRU1QVFlfRElSRUNUT1JZKSAuIikKIGVuZGVmCiAKLSMgQ29tbW9uIGRlZmluaXRpb24gdG8gaW52b2tlIGphdmFjIG9uIHRoZSBob3N0IGFuZCB0YXJnZXQuCi0jCisjIGFwcGVuZCBhZGRpdGlvbmFsIEphdmEgc291cmNlcyhyZXNvdXJjZXMvUHJvdG8gc291cmNlcywgYW5kIGV0YykgdG8gJCgxKS4KK2RlZmluZSBmZXRjaC1hZGRpdGlvbmFsLWphdmEtc291cmNlCiskKGhpZGUpIGlmIFsgLWQgIiQoUFJJVkFURV9TT1VSQ0VfSU5URVJNRURJQVRFU19ESVIpIiBdOyB0aGVuIFwKKyAgICBmaW5kICQoUFJJVkFURV9TT1VSQ0VfSU5URVJNRURJQVRFU19ESVIpIC1uYW1lICcqLmphdmEnIC1hbmQgLW5vdCAtbmFtZSAnLionID4+ICQoMSk7IFwKK2ZpCiskKGlmICQoUFJJVkFURV9IQVNfUFJPVE9fU09VUkNFUyksIFwKKyAgICAkKGhpZGUpIGZpbmQgJChQUklWQVRFX1BST1RPX1NPVVJDRV9JTlRFUk1FRElBVEVTX0RJUikgLW5hbWUgJyouamF2YScgLWFuZCAtbm90IC1uYW1lICcuKicgPj4gJCgxKSkKK2VuZGVmCisKICMgU29tZSBoaXN0b3JpY2FsIG5vdGVzOgogIyAtIGJlbG93IHdlIHdyaXRlIHRoZSBsaXN0IG9mIGphdmEgZmlsZXMgdG8gamF2YS1zb3VyY2UtbGlzdCB0byBhdm9pZCBhcmd1bWVudAogIyAgIGxpc3QgbGVuZ3RoIHByb2JsZW1zIHdpdGggQ3lnd2luCiAjIC0gd2UgZmlsdGVyIG91dCBkdXBsaWNhdGUgamF2YSBmaWxlIG5hbWVzIGJlY2F1c2UgZWNsaXBzZSdzIGNvbXBpbGVyCiAjICAgZG9lc24ndCBsaWtlIHRoZW0uCitkZWZpbmUgd3JpdGUtamF2YS1zb3VyY2UtbGlzdAorQGVjaG8gIiQoJChQUklWQVRFX1BSRUZJWClESVNQTEFZKSBKYXZhIHNvdXJjZSBsaXN0OiAkKFBSSVZBVEVfTU9EVUxFKSIKKyQoaGlkZSkgcm0gLWYgJEAKKyQoY2FsbCBkdW1wLXdvcmRzLXRvLWZpbGUsJChzb3J0ICQoUFJJVkFURV9KQVZBX1NPVVJDRVMpKSwkQC50bXApCiskKGNhbGwgZmV0Y2gtYWRkaXRpb25hbC1qYXZhLXNvdXJjZSwkQC50bXApCiskKGhpZGUpIHRyICcgJyAnXG4nIDwgJEAudG1wIHwgJChOT1JNQUxJWkVfUEFUSCkgfCBzb3J0IC11ID4gJEAKK2VuZGVmCisKKyMgQ29tbW9uIGRlZmluaXRpb24gdG8gaW52b2tlIGphdmFjIG9uIHRoZSBob3N0IGFuZCB0YXJnZXQuCiAjCiAjICQoMSk6IGphdmFjCi0jICQoMik6IGJvb3RjbGFzc3BhdGgKKyMgJCgyKTogY2xhc3NwYXRoX2xpYnMKIGRlZmluZSBjb21waWxlLWphdmEKICQoaGlkZSkgcm0gLWYgJEAKICQoaGlkZSkgcm0gLXJmICQoUFJJVkFURV9DTEFTU19JTlRFUk1FRElBVEVTX0RJUikgJChQUklWQVRFX0FOTk9fSU5URVJNRURJQVRFU19ESVIpCiAkKGhpZGUpIG1rZGlyIC1wICQoZGlyICRAKQogJChoaWRlKSBta2RpciAtcCAkKFBSSVZBVEVfQ0xBU1NfSU5URVJNRURJQVRFU19ESVIpICQoUFJJVkFURV9BTk5PX0lOVEVSTUVESUFURVNfRElSKQotJChjYWxsIHVuemlwLWphci1maWxlcywkKFBSSVZBVEVfU1RBVElDX0pBVkFfTElCUkFSSUVTKSwkKFBSSVZBVEVfQ0xBU1NfSU5URVJNRURJQVRFU19ESVIpKQotJChjYWxsIGR1bXAtd29yZHMtdG8tZmlsZSwkKFBSSVZBVEVfSkFWQV9TT1VSQ0VTKSwkKFBSSVZBVEVfQ0xBU1NfSU5URVJNRURJQVRFU19ESVIpL2phdmEtc291cmNlLWxpc3QpCi0kKGhpZGUpIGlmIFsgLWQgIiQoUFJJVkFURV9TT1VSQ0VfSU5URVJNRURJQVRFU19ESVIpIiBdOyB0aGVuIFwKLSAgICAgICAgICBmaW5kICQoUFJJVkFURV9TT1VSQ0VfSU5URVJNRURJQVRFU19ESVIpIC1uYW1lICcqLmphdmEnIC1hbmQgLW5vdCAtbmFtZSAnLionID4+ICQoUFJJVkFURV9DTEFTU19JTlRFUk1FRElBVEVTX0RJUikvamF2YS1zb3VyY2UtbGlzdDsgXAotZmkKLSQoaWYgJChQUklWQVRFX0hBU19QUk9UT19TT1VSQ0VTKSwgXAotICAgICQoaGlkZSkgZmluZCAkKFBSSVZBVEVfUFJPVE9fU09VUkNFX0lOVEVSTUVESUFURVNfRElSKSAtbmFtZSAnKi5qYXZhJyAtYW5kIC1ub3QgLW5hbWUgJy4qJyA+PiAkKFBSSVZBVEVfQ0xBU1NfSU5URVJNRURJQVRFU19ESVIpL2phdmEtc291cmNlLWxpc3QgKQotJChpZiAkKFBSSVZBVEVfSEFTX1JTX1NPVVJDRVMpLCBcCi0gICAgJChoaWRlKSBmaW5kICQoUFJJVkFURV9SU19TT1VSQ0VfSU5URVJNRURJQVRFU19ESVIpIC1uYW1lICcqLmphdmEnIC1hbmQgLW5vdCAtbmFtZSAnLionID4+ICQoUFJJVkFURV9DTEFTU19JTlRFUk1FRElBVEVTX0RJUikvamF2YS1zb3VyY2UtbGlzdCApCi0kKGhpZGUpIHRyICcgJyAnXG4nIDwgJChQUklWQVRFX0NMQVNTX0lOVEVSTUVESUFURVNfRElSKS9qYXZhLXNvdXJjZS1saXN0IFwKLSAgICB8ICQoTk9STUFMSVpFX1BBVEgpIHwgc29ydCAtdSA+ICQoUFJJVkFURV9DTEFTU19JTlRFUk1FRElBVEVTX0RJUikvamF2YS1zb3VyY2UtbGlzdC11bmlxCi0kKGhpZGUpIGlmIFsgLXMgJChQUklWQVRFX0NMQVNTX0lOVEVSTUVESUFURVNfRElSKS9qYXZhLXNvdXJjZS1saXN0LXVuaXEgXSA7IHRoZW4gXAotICAgICQoU09PTkdfSkFWQUNfV1JBUFBFUikgJCgxKSAtZW5jb2RpbmcgVVRGLTggXAorJChpZiAkKFBSSVZBVEVfU1JDSkFSUyksXAorICAgICQoWklQU1lOQykgLWQgJChQUklWQVRFX1NSQ0pBUl9JTlRFUk1FRElBVEVTX0RJUikgLWwgJChQUklWQVRFX1NSQ0pBUl9MSVNUX0ZJTEUpIC1mICIqLmphdmEiICQoUFJJVkFURV9TUkNKQVJTKSkKKyQoaGlkZSkgaWYgWyAtcyAkKFBSSVZBVEVfSkFWQV9TT1VSQ0VfTElTVCkgJChpZiAkKFBSSVZBVEVfU1JDSkFSUyksLW8gLXMgJChQUklWQVRFX1NSQ0pBUl9MSVNUX0ZJTEUpICldIDsgdGhlbiBcCisgICAgJChTT09OR19KQVZBQ19XUkFQUEVSKSAkKEpBVkFDX1dSQVBQRVIpICQoMSkgLWVuY29kaW5nIFVURi04IFwKICAgICAkKGlmICQoZmluZHN0cmluZyB0cnVlLCQoUFJJVkFURV9XQVJOSU5HU19FTkFCTEUpKSwkKHhsaW50X3VuY2hlY2tlZCksKSBcCi0gICAgJCgyKSBcCi0gICAgJChhZGRwcmVmaXggLWNsYXNzcGF0aCAsJChzdHJpcCBcCi0gICAgICAgICQoY2FsbCBub3JtYWxpemUtcGF0aC1saXN0LCQoUFJJVkFURV9BTExfSkFWQV9MSUJSQVJJRVMpKSkpIFwKKyAgICAkKGlmICQoUFJJVkFURV9VU0VfU1lTVEVNX01PRFVMRVMpLCBcCisgICAgICAkKGFkZHByZWZpeCAtLXN5c3RlbT0sJChQUklWQVRFX1NZU1RFTV9NT0RVTEVTX0RJUikpLCBcCisgICAgICAkKGFkZHByZWZpeCAtYm9vdGNsYXNzcGF0aCAsJChzdHJpcCBcCisgICAgICAgICAgJChjYWxsIG5vcm1hbGl6ZS1wYXRoLWxpc3QsJChQUklWQVRFX0JPT1RDTEFTU1BBVEgpKSBcCisgICAgICAgICAgJChQUklWQVRFX0VNUFRZX0JPT1RDTEFTU1BBVEgpKSkpIFwKKyAgICAkKGlmICQoUFJJVkFURV9VU0VfU1lTVEVNX01PRFVMRVMpLCBcCisgICAgICAkKGlmICQoUFJJVkFURV9QQVRDSF9NT0RVTEUpLCBcCisgICAgICAgIC0tcGF0Y2gtbW9kdWxlPSQoUFJJVkFURV9QQVRDSF9NT0RVTEUpPSQoY2FsbCBub3JtYWxpemUtcGF0aC1saXN0LC4gJCgyKSkpKSBcCisgICAgJChhZGRwcmVmaXggLWNsYXNzcGF0aCAsJChjYWxsIG5vcm1hbGl6ZS1wYXRoLWxpc3QsJChzdHJpcCBcCisgICAgICAkKGlmICQoUFJJVkFURV9VU0VfU1lTVEVNX01PRFVMRVMpLCBcCisgICAgICAgICQoZmlsdGVyLW91dCAkKFBSSVZBVEVfU1lTVEVNX01PRFVMRVNfTElCUyksJChQUklWQVRFX0JPT1RDTEFTU1BBVEgpKSkgXAorICAgICAgJCgyKSkpKSBcCiAgICAgJChpZiAkKGZpbmRzdHJpbmcgdHJ1ZSwkKFBSSVZBVEVfV0FSTklOR1NfRU5BQkxFKSksJCh4bGludF91bmNoZWNrZWQpLCkgXAotICAgIC1leHRkaXJzICIiIC1kICQoUFJJVkFURV9DTEFTU19JTlRFUk1FRElBVEVTX0RJUikgLXMgJChQUklWQVRFX0FOTk9fSU5URVJNRURJQVRFU19ESVIpIFwKKyAgICAtZCAkKFBSSVZBVEVfQ0xBU1NfSU5URVJNRURJQVRFU19ESVIpIC1zICQoUFJJVkFURV9BTk5PX0lOVEVSTUVESUFURVNfRElSKSBcCiAgICAgJChQUklWQVRFX0pBVkFDRkxBR1MpIFwKLSAgICBcQCQoUFJJVkFURV9DTEFTU19JTlRFUk1FRElBVEVTX0RJUikvamF2YS1zb3VyY2UtbGlzdC11bmlxIFwKKyAgICBcQCQoUFJJVkFURV9KQVZBX1NPVVJDRV9MSVNUKSBcCisgICAgJChpZiAkKFBSSVZBVEVfU1JDSkFSUyksXEAkKFBSSVZBVEVfU1JDSkFSX0xJU1RfRklMRSkpIFwKICAgICB8fCAoIHJtIC1yZiAkKFBSSVZBVEVfQ0xBU1NfSU5URVJNRURJQVRFU19ESVIpIDsgZXhpdCA0MSApIFwKIGZpCi0kKGlmICQoUFJJVkFURV9KQVZBX0xBWUVSU19GSUxFKSwgJChoaWRlKSBidWlsZC90b29scy9qYXZhLWxheWVycy5weSBcCi0gICAgJChQUklWQVRFX0pBVkFfTEFZRVJTX0ZJTEUpIFxAJChQUklWQVRFX0NMQVNTX0lOVEVSTUVESUFURVNfRElSKS9qYXZhLXNvdXJjZS1saXN0LXVuaXEsKQotJChoaWRlKSBybSAtZiAkKFBSSVZBVEVfQ0xBU1NfSU5URVJNRURJQVRFU19ESVIpL2phdmEtc291cmNlLWxpc3QKLSQoaGlkZSkgcm0gLWYgJChQUklWQVRFX0NMQVNTX0lOVEVSTUVESUFURVNfRElSKS9qYXZhLXNvdXJjZS1saXN0LXVuaXEKKyQoaWYgJChQUklWQVRFX0pBVkFfTEFZRVJTX0ZJTEUpLCAkKGhpZGUpIGJ1aWxkL21ha2UvdG9vbHMvamF2YS1sYXllcnMucHkgXAorICAgICQoUFJJVkFURV9KQVZBX0xBWUVSU19GSUxFKSBAJChQUklWQVRFX0pBVkFfU09VUkNFX0xJU1QpLCkKICQoaWYgJChQUklWQVRFX0pBUl9FWENMVURFX0ZJTEVTKSwgJChoaWRlKSBmaW5kICQoUFJJVkFURV9DTEFTU19JTlRFUk1FRElBVEVTX0RJUikgXAogICAgIC1uYW1lICQod29yZCAxLCAkKFBSSVZBVEVfSkFSX0VYQ0xVREVfRklMRVMpKSBcCiAgICAgJChhZGRwcmVmaXggLW8gLW5hbWUgLCAkKHdvcmRsaXN0IDIsIDk5OSwgJChQUklWQVRFX0pBUl9FWENMVURFX0ZJTEVTKSkpIFwKQEAgLTIyNDgsMTUzICsyMjgyLDMyIEBACiAkKGlmICQoUFJJVkFURV9KQVJfRVhDTFVERV9QQUNLQUdFUyksICQoaGlkZSkgcm0gLXJmIFwKICAgICAkKGZvcmVhY2ggcGtnLCAkKFBSSVZBVEVfSkFSX0VYQ0xVREVfUEFDS0FHRVMpLCBcCiAgICAgICAgICQoUFJJVkFURV9DTEFTU19JTlRFUk1FRElBVEVTX0RJUikvJChzdWJzdCAuLC8sJChwa2cpKSkpCi0kKGlmICQoUFJJVkFURV9KQVJfTUFOSUZFU1QpLCBcCi0gICAgJChoaWRlKSBzZWQgLWUgInMvJUJVSUxEX05VTUJFUiUvJChCVUlMRF9OVU1CRVJfRlJPTV9GSUxFKS8iIFwKLSAgICAgICAgICAgICQoUFJJVkFURV9KQVJfTUFOSUZFU1QpID4gJChkaXIgJEApL21hbmlmZXN0Lm1mICYmIFwKLSAgICAgICAgJChKQVIpIC1jZm0gJEAgJChkaXIgJEApL21hbmlmZXN0Lm1mIFwKLSAgICAgICAgICAgIC1DICQoUFJJVkFURV9DTEFTU19JTlRFUk1FRElBVEVTX0RJUikgLiwgXAotICAgICQoaGlkZSkgJChKQVIpIC1jZiAkQCAtQyAkKFBSSVZBVEVfQ0xBU1NfSU5URVJNRURJQVRFU19ESVIpIC4pCiskKGhpZGUpICQoSkFSKSAtY2YgJEAgJChjYWxsIGphci1hcmdzLXNvcnRlZC1maWxlcy1pbi1kaXJlY3RvcnksJChQUklWQVRFX0NMQVNTX0lOVEVSTUVESUFURVNfRElSKSkKICQoaWYgJChQUklWQVRFX0VYVFJBX0pBUl9BUkdTKSwkKGNhbGwgYWRkLWphdmEtcmVzb3VyY2VzLXRvLCRAKSkKIGVuZGVmCiAKLWRlZmluZSB0cmFuc2Zvcm0tamF2YS10by1jbGFzc2VzLmphcgotQGVjaG8gIiQoJChQUklWQVRFX1BSRUZJWClESVNQTEFZKSBKYXZhOiAkKFBSSVZBVEVfTU9EVUxFKSAoJChQUklWQVRFX0NMQVNTX0lOVEVSTUVESUFURVNfRElSKSkiCi0kKGNhbGwgY29tcGlsZS1qYXZhLCQoVEFSR0VUX0pBVkFDKSwkKFBSSVZBVEVfQk9PVENMQVNTUEFUSCkpCi1lbmRlZgotCi0jIEludm9rZSBKYWNrIHRvIGNvbXBpbGUgamF2YSBmcm9tIHNvdXJjZSB0byBkZXggYW5kIGphY2sgZmlsZXMuCi0jCi0jIFNvbWUgaGlzdG9yaWNhbCBub3RlczoKLSMgLSBiZWxvdyB3ZSB3cml0ZSB0aGUgbGlzdCBvZiBqYXZhIGZpbGVzIHRvIGphdmEtc291cmNlLWxpc3QgdG8gYXZvaWQgYXJndW1lbnQKLSMgICBsaXN0IGxlbmd0aCBwcm9ibGVtcyB3aXRoIEN5Z3dpbgotIyAtIHdlIGZpbHRlciBvdXQgZHVwbGljYXRlIGphdmEgZmlsZSBuYW1lcyBiZWNhdXNlIEphY2sgZG9lc24ndCBsaWtlIHRoZW0uCi1kZWZpbmUgamFjay1qYXZhLXRvLWRleAotJChoaWRlKSBybSAtZiAkQAotJChoaWRlKSBybSAtZiAkKFBSSVZBVEVfQ0xBU1NFU19KQUNLKQotJChoaWRlKSBybSAtcmYgJChQUklWQVRFX0pBQ0tfSU5URVJNRURJQVRFU19ESVIpCi0kKGhpZGUpIG1rZGlyIC1wICQoZGlyICRAKQotJChoaWRlKSBta2RpciAtcCAkKGRpciAkKFBSSVZBVEVfQ0xBU1NFU19KQUNLKSkKLSQoaGlkZSkgbWtkaXIgLXAgJChQUklWQVRFX0pBQ0tfSU5URVJNRURJQVRFU19ESVIpCi0kKGlmICQoUFJJVkFURV9KQUNLX0lOQ1JFTUVOVEFMX0RJUiksJChoaWRlKSBta2RpciAtcCAkKFBSSVZBVEVfSkFDS19JTkNSRU1FTlRBTF9ESVIpKQotJChjYWxsIGR1bXAtd29yZHMtdG8tZmlsZSwkKFBSSVZBVEVfSkFWQV9TT1VSQ0VTKSwkKFBSSVZBVEVfSkFDS19JTlRFUk1FRElBVEVTX0RJUikvamF2YS1zb3VyY2UtbGlzdCkKLSQoaWYgJChQUklWQVRFX1NPVVJDRV9JTlRFUk1FRElBVEVTX0RJUiksIFwKLSAgICAkKGhpZGUpIGlmIFsgLWQgIiQoUFJJVkFURV9TT1VSQ0VfSU5URVJNRURJQVRFU19ESVIpIiBdOyB0aGVuIFwKLSAgICAgICAgICAgIGZpbmQgJChQUklWQVRFX1NPVVJDRV9JTlRFUk1FRElBVEVTX0RJUikgLW5hbWUgJyouamF2YScgPj4gJChQUklWQVRFX0pBQ0tfSU5URVJNRURJQVRFU19ESVIpL2phdmEtc291cmNlLWxpc3Q7IFwKLSAgICBmaSkKLSQoaWYgJChQUklWQVRFX0hBU19QUk9UT19TT1VSQ0VTKSwgXAotICAgICQoaGlkZSkgZmluZCAkKFBSSVZBVEVfUFJPVE9fU09VUkNFX0lOVEVSTUVESUFURVNfRElSKSAtbmFtZSAnKi5qYXZhJyA+PiAkKFBSSVZBVEVfSkFDS19JTlRFUk1FRElBVEVTX0RJUikvamF2YS1zb3VyY2UtbGlzdCApCi0kKGlmICQoUFJJVkFURV9IQVNfUlNfU09VUkNFUyksIFwKLSAgICAkKGhpZGUpIGZpbmQgJChQUklWQVRFX1JTX1NPVVJDRV9JTlRFUk1FRElBVEVTX0RJUikgLW5hbWUgJyouamF2YScgPj4gJChQUklWQVRFX0pBQ0tfSU5URVJNRURJQVRFU19ESVIpL2phdmEtc291cmNlLWxpc3QgKQotJChoaWRlKSB0ciAnICcgJ1xuJyA8ICQoUFJJVkFURV9KQUNLX0lOVEVSTUVESUFURVNfRElSKS9qYXZhLXNvdXJjZS1saXN0IFwKLSAgICB8ICQoTk9STUFMSVpFX1BBVEgpIHwgc29ydCAtdSA+ICQoUFJJVkFURV9KQUNLX0lOVEVSTUVESUFURVNfRElSKS9qYXZhLXNvdXJjZS1saXN0LXVuaXEKLSQoaWYgJChQUklWQVRFX0pBQ0tfUFJPR1VBUkRfRkxBR1MpLCBcCi0gICAgJChoaWRlKSBlY2hvIC1iYXNlZGlyZWN0b3J5ICQoQ1VSRElSKSA+ICRALmZsYWdzOyBcCi0gICAgZWNobyAkKFBSSVZBVEVfSkFDS19QUk9HVUFSRF9GTEFHUykgPj4gJEAuZmxhZ3M7IFwKLSkKLSQoaWYgJChQUklWQVRFX0VYVFJBX0pBUl9BUkdTKSwKLSAgICAkKGhpZGUpIG1rZGlyIC1wICRALnJlcy50bXAKLSAgICAkKGhpZGUpICQoY2FsbCBjcmVhdGUtZW1wdHktcGFja2FnZS1hdCwkQC5yZXMudG1wLnppcCkKLSAgICAkKGhpZGUpICQoY2FsbCBhZGQtamF2YS1yZXNvdXJjZXMtdG8sJEAucmVzLnRtcC56aXApCi0gICAgJChoaWRlKSB1bnppcCAtcW8gJEAucmVzLnRtcC56aXAgLWQgJEAucmVzLnRtcAotICAgICQoaGlkZSkgcm0gJEAucmVzLnRtcC56aXApCi0kKGlmICQoUFJJVkFURV9KQUNLX0lNUE9SVF9KQVIpLAotICAgICQoaGlkZSkgbWtkaXIgLXAgJEAudG1wamlsbC5yZXMKLSAgICAkKGhpZGUpIHVuemlwIC1xbyAkKFBSSVZBVEVfSkFDS19JTVBPUlRfSkFSKSAtZCAkQC50bXBqaWxsLnJlcwotICAgICQoaGlkZSkgZmluZCAkQC50bXBqaWxsLnJlcyAtaW5hbWUgIiouY2xhc3MiIC1kZWxldGUpCi0kKGhpZGUpIGlmIFsgLXMgJChQUklWQVRFX0pBQ0tfSU5URVJNRURJQVRFU19ESVIpL2phdmEtc291cmNlLWxpc3QtdW5pcSBdIDsgdGhlbiBcCi0gICAgZXhwb3J0IHRtcEVjakFyZz0iQCQoUFJJVkFURV9KQUNLX0lOVEVSTUVESUFURVNfRElSKS9qYXZhLXNvdXJjZS1saXN0LXVuaXEiOyBcCi1lbHNlIFwKLSAgICBleHBvcnQgdG1wRWNqQXJnPSIiOyBcCi1maTsgXAotJChjYWxsIGNhbGwtamFjaykgXAotICAgICQoc3RyaXAgJChQUklWQVRFX0pBQ0tfRkxBR1MpKSBcCi0gICAgJChzdHJpcCAkKFBSSVZBVEVfSkFDS19DT1ZFUkFHRV9PUFRJT05TKSkgXAotICAgICQoaWYgJChOT19PUFRJTUlaRV9EWCksIFwKLSAgICAgICAgLUQgamFjay5kZXgub3B0aW1pemU9ImZhbHNlIikgXAotICAgICQoaWYgJChQUklWQVRFX1JNVFlQRURFRlMpLCBcCi0gICAgICAgIC1EIGphY2suYW5kcm9pZC5yZW1vdmUtdHlwZWRlZj0idHJ1ZSIpIFwKLSAgICAkKGlmICQoUFJJVkFURV9KQUNLX0lNUE9SVF9KQVIpLCBcCi0gICAgICAgIC0taW1wb3J0ICQoUFJJVkFURV9KQUNLX0lNUE9SVF9KQVIpIC0taW1wb3J0LXJlc291cmNlICRALnRtcGppbGwucmVzKSBcCitkZWZpbmUgdHJhbnNmb3JtLWphdmEtdG8taGVhZGVyLmphcgorQGVjaG8gIiQoJChQUklWQVRFX1BSRUZJWClESVNQTEFZKSBUdXJiaW5lOiAkKFBSSVZBVEVfTU9EVUxFKSIKK0Bta2RpciAtcCAkKGRpciAkQCkKK0BybSAtcmYgJChkaXIgJEApL2NsYXNzZXMtdHVyYmluZQorQG1rZGlyICQoZGlyICRAKS9jbGFzc2VzLXR1cmJpbmUKKyQoaGlkZSkgaWYgWyAtcyAkKFBSSVZBVEVfSkFWQV9TT1VSQ0VfTElTVCkgLW8gLW4gIiQoUFJJVkFURV9TUkNKQVJTKSIgXSA7IHRoZW4gXAorICAgICQoSkFWQSkgLWphciAkKFRVUkJJTkUpIFwKKyAgICAtLW91dHB1dCAkQC5wcmVtZXJnZWQgLS10ZW1wX2RpciAkKGRpciAkQCkvY2xhc3Nlcy10dXJiaW5lIFwKKyAgICAtLXNvdXJjZXMgXEAkKFBSSVZBVEVfSkFWQV9TT1VSQ0VfTElTVCkgLS1zb3VyY2VfamFycyAkKFBSSVZBVEVfU1JDSkFSUykgXAorICAgIC0tamF2YWNvcHRzICQoUFJJVkFURV9KQVZBQ0ZMQUdTKSAkKENPTU1PTl9KREtfRkxBR1MpIFwKKyAgICAkKGFkZHByZWZpeCAtLWJvb3RjbGFzc3BhdGggLCQoc3RyaXAgXAorICAgICAgICAgJChjYWxsIG5vcm1hbGl6ZS1wYXRoLWxpc3QsJChQUklWQVRFX0JPT1RDTEFTU1BBVEgpKSBcCisgICAgICAgICAkKFBSSVZBVEVfRU1QVFlfQk9PVENMQVNTUEFUSCkpKSBcCiAgICAgJChhZGRwcmVmaXggLS1jbGFzc3BhdGggLCQoc3RyaXAgXAotICAgICAgICAkKGNhbGwgbm9ybWFsaXplLXBhdGgtbGlzdCwkKFBSSVZBVEVfSkFDS19TSEFSRURfTElCUkFSSUVTKSkpKSBcCi0gICAgJChhZGRwcmVmaXggLS1pbXBvcnQgLCQoY2FsbCByZXZlcnNlLWxpc3QsJChQUklWQVRFX1NUQVRJQ19KQUNLX0xJQlJBUklFUykpKSBcCi0gICAgJChhZGRwcmVmaXggLS1wbHVnaW5wYXRoICwkKHN0cmlwIFwKLSAgICAgICAgICQoY2FsbCBub3JtYWxpemUtcGF0aC1saXN0LCQoUFJJVkFURV9KQUNLX1BMVUdJTl9QQVRIKSkpKSBcCi0gICAgJChpZiAkKFBSSVZBVEVfSkFDS19QTFVHSU4pLC0tcGx1Z2luICQoY2FsbCBub3JtYWxpemUtY29tbWEtbGlzdCwkKFBSSVZBVEVfSkFDS19QTFVHSU4pKSkgXAotICAgICQoaWYgJChQUklWQVRFX0VYVFJBX0pBUl9BUkdTKSwtLWltcG9ydC1yZXNvdXJjZSAkQC5yZXMudG1wKSBcCi0gICAgLUQgamFjay5hbmRyb2lkLm1pbi1hcGktbGV2ZWw9JChQUklWQVRFX0pBQ0tfTUlOX1NES19WRVJTSU9OKSBcCi0gICAgLUQgamFjay5pbXBvcnQucmVzb3VyY2UucG9saWN5PWtlZXAtZmlyc3QgXAotICAgIC1EIGphY2suaW1wb3J0LnR5cGUucG9saWN5PWtlZXAtZmlyc3QgXAotICAgIC0tb3V0cHV0LWphY2sgJChQUklWQVRFX0NMQVNTRVNfSkFDSykgXAotICAgICQoaWYgJChQUklWQVRFX0pBQ0tfSU5DUkVNRU5UQUxfRElSKSwtLWluY3JlbWVudGFsLWZvbGRlciAkKFBSSVZBVEVfSkFDS19JTkNSRU1FTlRBTF9ESVIpKSBcCi0gICAgLS1vdXRwdXQtZGV4ICQoUFJJVkFURV9KQUNLX0lOVEVSTUVESUFURVNfRElSKSBcCi0gICAgJChhZGRwcmVmaXggLS1jb25maWctamFyamFyICwkKHN0cmlwICQoUFJJVkFURV9KQVJKQVJfUlVMRVMpKSkgXAotICAgICQoaWYgJChQUklWQVRFX0pBQ0tfUFJPR1VBUkRfRkxBR1MpLC0tY29uZmlnLXByb2d1YXJkICRALmZsYWdzKSBcCi0gICAgJCR0bXBFY2pBcmcgXAotICAgIHx8ICggcm0gLXJmICQoUFJJVkFURV9DTEFTU0VTX0pBQ0spOyBleGl0IDQxICkKLSQoaGlkZSkgbXYgJChQUklWQVRFX0pBQ0tfSU5URVJNRURJQVRFU19ESVIpL2NsYXNzZXMqLmRleCAkKGRpciAkQCkKLSQoaGlkZSkgcm0gLWYgJChQUklWQVRFX0pBQ0tfSU5URVJNRURJQVRFU19ESVIpL2phdmEtc291cmNlLWxpc3QKLSQoaWYgJChQUklWQVRFX0VYVFJBX0pBUl9BUkdTKSwkKGhpZGUpIHJtIC1yZiAkQC5yZXMudG1wKQotJChoaWRlKSBtdiAkKFBSSVZBVEVfSkFDS19JTlRFUk1FRElBVEVTX0RJUikvamF2YS1zb3VyY2UtbGlzdC11bmlxICQoUFJJVkFURV9KQUNLX0lOVEVSTUVESUFURVNfRElSKS5qYXZhLXNvdXJjZS1saXN0Ci0kKGlmICQoUFJJVkFURV9KQVJfUEFDS0FHRVMpLCAkKGhpZGUpIGVjaG8gdW5zdXBwb3J0ZWQgb3B0aW9ucyBQUklWQVRFX0pBUl9QQUNLQUdFUyBpbiAkQDsgZXhpdCA1MykKLSQoaWYgJChQUklWQVRFX0pBUl9FWENMVURFX1BBQ0tBR0VTKSwgJChoaWRlKSBlY2hvIHVuc3VwcG9ydGVkIG9wdGlvbnMgSkFSX0VYQ0xVREVfUEFDS0FHRVMgaW4gJEA7IGV4aXQgNTMpCi0kKGlmICQoUFJJVkFURV9KQVJfTUFOSUZFU1QpLCAkKGhpZGUpIGVjaG8gdW5zdXBwb3J0ZWQgb3B0aW9ucyBKQVJfTUFOSUZFU1QgaW4gJEA7IGV4aXQgNTMpCi1lbmRlZgotCi0jIEludm9rZSBKYWNrIHRvIGNvbXBpbGUgamF2YSBzb3VyY2UganVzdCB0byBjaGVjayBpdCBjb21waWxlcyBjb3JyZWN0bHkuCi0jCi0jIFNvbWUgaGlzdG9yaWNhbCBub3RlczoKLSMgLSBiZWxvdyB3ZSB3cml0ZSB0aGUgbGlzdCBvZiBqYXZhIGZpbGVzIHRvIGphdmEtc291cmNlLWxpc3QgdG8gYXZvaWQgYXJndW1lbnQKLSMgICBsaXN0IGxlbmd0aCBwcm9ibGVtcyB3aXRoIEN5Z3dpbgotIyAtIHdlIGZpbHRlciBvdXQgZHVwbGljYXRlIGphdmEgZmlsZSBuYW1lcyBiZWNhdXNlIEphY2sgZG9lc24ndCBsaWtlIHRoZW0uCi1kZWZpbmUgamFjay1jaGVjay1qYXZhCi0kKGhpZGUpIHJtIC1mICRACi0kKGhpZGUpIHJtIC1mICRALmphdmEtc291cmNlLWxpc3QKLSQoaGlkZSkgcm0gLWYgJEAuamF2YS1zb3VyY2UtbGlzdC11bmlxCi0kKGhpZGUpIG1rZGlyIC1wICQoZGlyICRAKQotJChpZiAkKFBSSVZBVEVfSkFDS19JTkNSRU1FTlRBTF9ESVIpLCQoaGlkZSkgbWtkaXIgLXAgJChQUklWQVRFX0pBQ0tfSU5DUkVNRU5UQUxfRElSKSkKLSQoY2FsbCBkdW1wLXdvcmRzLXRvLWZpbGUsJChQUklWQVRFX0pBVkFfU09VUkNFUyksJEAuamF2YS1zb3VyY2UtbGlzdCkKLSQoaGlkZSkgaWYgWyAtZCAiJChQUklWQVRFX1NPVVJDRV9JTlRFUk1FRElBVEVTX0RJUikiIF07IHRoZW4gXAotICAgICAgICAgIGZpbmQgJChQUklWQVRFX1NPVVJDRV9JTlRFUk1FRElBVEVTX0RJUikgLW5hbWUgJyouamF2YScgPj4gJEAuamF2YS1zb3VyY2UtbGlzdDsgXAorICAgICAgICAkKGNhbGwgbm9ybWFsaXplLXBhdGgtbGlzdCwkKFBSSVZBVEVfQUxMX0pBVkFfSEVBREVSX0xJQlJBUklFUykpKSkgXAorICAgIHx8ICggcm0gLXJmICQoZGlyICRAKS9jbGFzc2VzLXR1cmJpbmUgOyBleGl0IDQxICkgJiYgXAorICAgICQoTUVSR0VfWklQUykgLWogLS1pZ25vcmUtZHVwbGljYXRlcyAtc3RyaXBEaXIgTUVUQS1JTkYgJEAudG1wICRALnByZW1lcmdlZCAkKGNhbGwgcmV2ZXJzZS1saXN0LCQoUFJJVkFURV9TVEFUSUNfSkFWQV9IRUFERVJfTElCUkFSSUVTKSkgOyBcCitlbHNlIFwKKyAgICAkKE1FUkdFX1pJUFMpIC1qIC0taWdub3JlLWR1cGxpY2F0ZXMgLXN0cmlwRGlyIE1FVEEtSU5GICRALnRtcCAkKGNhbGwgcmV2ZXJzZS1saXN0LCQoUFJJVkFURV9TVEFUSUNfSkFWQV9IRUFERVJfTElCUkFSSUVTKSkgOyBcCiBmaQotJChpZiAkKFBSSVZBVEVfSEFTX1BST1RPX1NPVVJDRVMpLCBcCi0gICAgJChoaWRlKSBmaW5kICQoUFJJVkFURV9QUk9UT19TT1VSQ0VfSU5URVJNRURJQVRFU19ESVIpIC1uYW1lICcqLmphdmEnID4+ICRALmphdmEtc291cmNlLWxpc3QgKQotJChpZiAkKFBSSVZBVEVfSEFTX1JTX1NPVVJDRVMpLCBcCi0gICAgJChoaWRlKSBmaW5kICQoUFJJVkFURV9SU19TT1VSQ0VfSU5URVJNRURJQVRFU19ESVIpIC1uYW1lICcqLmphdmEnID4+ICRALmphdmEtc291cmNlLWxpc3QgKQotJChoaWRlKSB0ciAnICcgJ1xuJyA8ICRALmphdmEtc291cmNlLWxpc3QgXAotICAgIHwgc29ydCAtdSA+ICRALmphdmEtc291cmNlLWxpc3QtdW5pcQotJChoaWRlKSBpZiBbIC1zICRALmphdmEtc291cmNlLWxpc3QtdW5pcSBdIDsgdGhlbiBcCi0JJChjYWxsIGNhbGwtamFjaywkKFBSSVZBVEVfSkFDS19FWFRSQV9BUkdTKSkgXAotCSAgICAkKHN0cmlwICQoUFJJVkFURV9KQUNLX0ZMQUdTKSkgXAotCSAgICAkKHN0cmlwICQoUFJJVkFURV9KQUNLX0RFQlVHX0ZMQUdTKSkgXAotCSAgICAkKGFkZHByZWZpeCAtLWNsYXNzcGF0aCAsJChzdHJpcCBcCi0JICAgICAgICAkKGNhbGwgbm9ybWFsaXplLXBhdGgtbGlzdCwkKGNhbGwgcmV2ZXJzZS1saXN0LCQoUFJJVkFURV9TVEFUSUNfSkFDS19MSUJSQVJJRVMpKSAkKFBSSVZBVEVfSkFDS19TSEFSRURfTElCUkFSSUVTKSkpKSBcCi0JICAgIC1EIGphY2suaW1wb3J0LnJlc291cmNlLnBvbGljeT1rZWVwLWZpcnN0IFwKLQkgICAgLUQgamFjay5hbmRyb2lkLm1pbi1hcGktbGV2ZWw9JChQUklWQVRFX0pBQ0tfTUlOX1NES19WRVJTSU9OKSBcCi0JICAgIC1EIGphY2suaW1wb3J0LnR5cGUucG9saWN5PWtlZXAtZmlyc3QgXAotCSAgICAkKGlmICQoUFJJVkFURV9KQUNLX0lOQ1JFTUVOVEFMX0RJUiksLS1pbmNyZW1lbnRhbC1mb2xkZXIgJChQUklWQVRFX0pBQ0tfSU5DUkVNRU5UQUxfRElSKSkgXAotCSAgICBAJEAuamF2YS1zb3VyY2UtbGlzdC11bmlxOyBcCi1maQotdG91Y2ggJEAKLWVuZGVmCi0KLWRlZmluZSB0cmFuc2Zvcm0tamFyLXRvLWphY2sKLQkkKGhpZGUpIG1rZGlyIC1wICQoZGlyICRAKQotCSQoaGlkZSkgbWtkaXIgLXAgJEAudG1wamlsbC5yZXMKLQkkKGhpZGUpIHVuemlwIC1xbyAkPCAtZCAkQC50bXBqaWxsLnJlcwotCSQoaGlkZSkgZmluZCAkQC50bXBqaWxsLnJlcyAtaW5hbWUgIiouY2xhc3MiIC1kZWxldGUKLQkkKGhpZGUpICQoY2FsbCBjYWxsLWphY2spIFwKLQkgICAgJChQUklWQVRFX0pBQ0tfRkxBR1MpIFwKLQkgICAgJChhZGRwcmVmaXggLS1wbHVnaW5wYXRoICwkKHN0cmlwIFwKLSAgICAgICAgICAgICAgICAkKGNhbGwgbm9ybWFsaXplLXBhdGgtbGlzdCwkKFBSSVZBVEVfSkFDS19QTFVHSU5fUEFUSCkpKSkgXAotCSAgICAkKGlmICQoUFJJVkFURV9KQUNLX1BMVUdJTiksLS1wbHVnaW4gJChjYWxsIG5vcm1hbGl6ZS1jb21tYS1saXN0LCQoUFJJVkFURV9KQUNLX1BMVUdJTikpKSBcCi0gICAgICAgIC1EIGphY2suaW1wb3J0LnJlc291cmNlLnBvbGljeT1rZWVwLWZpcnN0IFwKLSAgICAgICAgLUQgamFjay5pbXBvcnQudHlwZS5wb2xpY3k9a2VlcC1maXJzdCBcCi0gICAgICAgIC1EIGphY2suYW5kcm9pZC5taW4tYXBpLWxldmVsPSQoUFJJVkFURV9KQUNLX01JTl9TREtfVkVSU0lPTikgXAotCSAgICAtLWltcG9ydCAkPCBcCi0JICAgIC0taW1wb3J0LXJlc291cmNlICRALnRtcGppbGwucmVzIFwKLQkgICAgLS1vdXRwdXQtamFjayAkQAotCSQoaGlkZSkgcm0gLXJmICRALnRtcGppbGwucmVzCiskKGhpZGUpICQoWklQVElNRSkgJEAudG1wCiskKGhpZGUpICQoY2FsbCBjb21taXQtY2hhbmdlLWZvci10b2MsJEApCiBlbmRlZgogCiAjIE1vdmVzICQxLnRtcCB0byAkMSBpZiBuZWNlc3NhcnkuIFRoaXMgaXMgZGVzaWduZWQgdG8gYmUgdXNlZCB3aXRoCkBAIC0yNDA5LDI2ICsyMzIyLDYgQEAKIGZpCiBlbmRlZgogCi0jIGIvMzc3NTY0OTUKLUlKQVJfQVNBTl9PUFRJT05TIDo9IEFTQU5fT1BUSU9OUz1kZXRlY3RfbGVha3M9MAotCi0jIyBSdWxlIHRvIGNyZWF0ZSBhIHRhYmxlIG9mIGNvbnRlbnRzIGZyb20gYSAuamFyIGZpbGUuCi0jIyBNdXN0IGJlIGNhbGxlZCB3aXRoICQoZXZhbCkuCi0jICQoMSk6IEEgLmphciBmaWxlCi1kZWZpbmUgX3RyYW5zZm9ybS1qYXItdG8tdG9jCi0kMS50b2M6ICQxIHwgJChJSkFSKQotCUBlY2hvIEdlbmVyYXRpbmcgVE9DOiAkJEAKLQkkKGhpZGUpICQoSUpBUl9BU0FOX09QVElPTlMpICQoSUpBUikgJCQ8ICQkQC50bXAKLQkkJChjYWxsIGNvbW1pdC1jaGFuZ2UtZm9yLXRvYywkJEApCi1lbmRlZgotCi0jIyBEZWZpbmUgYSBydWxlIHdoaWNoIGdlbmVyYXRlcyAuamFyLnRvYyBhbmQgbWFyayBpdCBhcyAuS0FUSV9SRVNUQVQuCi0jICQoMSk6IEEgLmphciBmaWxlCi1kZWZpbmUgZGVmaW5lLWphci10by10b2MtcnVsZQotJChldmFsICQoY2FsbCBfdHJhbnNmb3JtLWphci10by10b2MsJDEpKVwKLSQoZXZhbCAuS0FUSV9SRVNUQVQ6ICQxLnRvYykKLWVuZGVmCi0KIGlmZXEgKCwkKFRBUkdFVF9CVUlMRF9BUFBTKSkKIAogIyMgUnVsZSB0byBjcmVhdGUgYSB0YWJsZSBvZiBjb250ZW50cyBmcm9tIGEgLmRleCBmaWxlLgpAQCAtMjQ1OCw3NSArMjM1MSw2IEBACiBlbmRpZiAgIyBUQVJHRVRfQlVJTERfQVBQUwogCiAKLSMgSW52b2tlIEphY2sgdG8gY29tcGlsZSBqYXZhIGZyb20gc291cmNlIHRvIGphY2sgZmlsZXMgd2l0aG91dCBzaHJpbmsgb3Igb2JmdXNjYXRpb24uCi0jCi0jIFNvbWUgaGlzdG9yaWNhbCBub3RlczoKLSMgLSBiZWxvdyB3ZSB3cml0ZSB0aGUgbGlzdCBvZiBqYXZhIGZpbGVzIHRvIGphdmEtc291cmNlLWxpc3QgdG8gYXZvaWQgYXJndW1lbnQKLSMgICBsaXN0IGxlbmd0aCBwcm9ibGVtcyB3aXRoIEN5Z3dpbgotIyAtIHdlIGZpbHRlciBvdXQgZHVwbGljYXRlIGphdmEgZmlsZSBuYW1lcyBiZWNhdXNlIEphY2sgZG9lc24ndCBsaWtlIHRoZW0uCi1kZWZpbmUgamF2YS10by1qYWNrCi0kKGhpZGUpIHJtIC1mICRACi0kKGhpZGUpIHJtIC1yZiAkKFBSSVZBVEVfSkFDS19JTlRFUk1FRElBVEVTX0RJUikKLSQoaGlkZSkgbWtkaXIgLXAgJChkaXIgJEApCi0kKGhpZGUpIG1rZGlyIC1wICQoUFJJVkFURV9KQUNLX0lOVEVSTUVESUFURVNfRElSKQotJChpZiAkKFBSSVZBVEVfSkFDS19JTkNSRU1FTlRBTF9ESVIpLCQoaGlkZSkgbWtkaXIgLXAgJChQUklWQVRFX0pBQ0tfSU5DUkVNRU5UQUxfRElSKSkKLSQoY2FsbCBkdW1wLXdvcmRzLXRvLWZpbGUsJChQUklWQVRFX0pBVkFfU09VUkNFUyksJChQUklWQVRFX0pBQ0tfSU5URVJNRURJQVRFU19ESVIpL2phdmEtc291cmNlLWxpc3QpCi0kKGhpZGUpIGlmIFsgLWQgIiQoUFJJVkFURV9TT1VSQ0VfSU5URVJNRURJQVRFU19ESVIpIiBdOyB0aGVuIFwKLSAgICAgICAgICBmaW5kICQoUFJJVkFURV9TT1VSQ0VfSU5URVJNRURJQVRFU19ESVIpIC1uYW1lICcqLmphdmEnID4+ICQoUFJJVkFURV9KQUNLX0lOVEVSTUVESUFURVNfRElSKS9qYXZhLXNvdXJjZS1saXN0OyBcCi1maQotJChpZiAkKFBSSVZBVEVfSEFTX1BST1RPX1NPVVJDRVMpLCBcCi0gICAgJChoaWRlKSBmaW5kICQoUFJJVkFURV9QUk9UT19TT1VSQ0VfSU5URVJNRURJQVRFU19ESVIpIC1uYW1lICcqLmphdmEnID4+ICQoUFJJVkFURV9KQUNLX0lOVEVSTUVESUFURVNfRElSKS9qYXZhLXNvdXJjZS1saXN0ICkKLSQoaWYgJChQUklWQVRFX0hBU19SU19TT1VSQ0VTKSwgXAotICAgICQoaGlkZSkgZmluZCAkKFBSSVZBVEVfUlNfU09VUkNFX0lOVEVSTUVESUFURVNfRElSKSAtbmFtZSAnKi5qYXZhJyA+PiAkKFBSSVZBVEVfSkFDS19JTlRFUk1FRElBVEVTX0RJUikvamF2YS1zb3VyY2UtbGlzdCApCi0kKGhpZGUpIHRyICcgJyAnXG4nIDwgJChQUklWQVRFX0pBQ0tfSU5URVJNRURJQVRFU19ESVIpL2phdmEtc291cmNlLWxpc3QgXAotICAgIHwgJChOT1JNQUxJWkVfUEFUSCkgfCBzb3J0IC11ID4gJChQUklWQVRFX0pBQ0tfSU5URVJNRURJQVRFU19ESVIpL2phdmEtc291cmNlLWxpc3QtdW5pcQotJChpZiAkKFBSSVZBVEVfSkFDS19QUk9HVUFSRF9GTEFHUyksIFwKLSAgICAkKGhpZGUpIGVjaG8gLWJhc2VkaXJlY3RvcnkgJChDVVJESVIpID4gJEAuZmxhZ3M7IFwKLSAgICBlY2hvICQoUFJJVkFURV9KQUNLX1BST0dVQVJEX0ZMQUdTKSA+PiAkQC5mbGFnczsgXAotKQotJChpZiAkKFBSSVZBVEVfRVhUUkFfSkFSX0FSR1MpLAotCSQoaGlkZSkgbWtkaXIgLXAgJEAucmVzLnRtcAotCSQoaGlkZSkgJChjYWxsIGNyZWF0ZS1lbXB0eS1wYWNrYWdlLWF0LCRALnJlcy50bXAuemlwKQotCSQoaGlkZSkgJChjYWxsIGFkZC1qYXZhLXJlc291cmNlcy10bywkQC5yZXMudG1wLnppcCkKLQkkKGhpZGUpIHVuemlwIC1xbyAkQC5yZXMudG1wLnppcCAtZCAkQC5yZXMudG1wCi0JJChoaWRlKSBybSAkQC5yZXMudG1wLnppcCkKLSQoaGlkZSkgaWYgWyAtcyAkKFBSSVZBVEVfSkFDS19JTlRFUk1FRElBVEVTX0RJUikvamF2YS1zb3VyY2UtbGlzdC11bmlxIF0gOyB0aGVuIFwKLSAgICBleHBvcnQgdG1wRWNqQXJnPSJAJChQUklWQVRFX0pBQ0tfSU5URVJNRURJQVRFU19ESVIpL2phdmEtc291cmNlLWxpc3QtdW5pcSI7IFwKLWVsc2UgXAotICAgIGV4cG9ydCB0bXBFY2pBcmc9IiI7IFwKLWZpOyBcCi0kKGNhbGwgY2FsbC1qYWNrKSBcCi0gICAgJChzdHJpcCAkKFBSSVZBVEVfSkFDS19GTEFHUykpIFwKLSAgICAkKGlmICQoTk9fT1BUSU1JWkVfRFgpLCBcCi0gICAgICAgIC1EIGphY2suZGV4Lm9wdGltaXplPSJmYWxzZSIpIFwKLSAgICAkKGFkZHByZWZpeCAtLWNsYXNzcGF0aCAsJChzdHJpcCBcCi0gICAgICAgICQoY2FsbCBub3JtYWxpemUtcGF0aC1saXN0LCQoUFJJVkFURV9KQUNLX1NIQVJFRF9MSUJSQVJJRVMpKSkpIFwKLSAgICAkKGFkZHByZWZpeCAtLWltcG9ydCAsJChjYWxsIHJldmVyc2UtbGlzdCwkKFBSSVZBVEVfU1RBVElDX0pBQ0tfTElCUkFSSUVTKSkpIFwKLSAgICAkKGFkZHByZWZpeCAtLXBsdWdpbnBhdGggLCQoc3RyaXAgXAotICAgICAgICAkKGNhbGwgbm9ybWFsaXplLXBhdGgtbGlzdCwkKFBSSVZBVEVfSkFDS19QTFVHSU5fUEFUSCkpKSkgXAotICAgICQoaWYgJChQUklWQVRFX0pBQ0tfUExVR0lOKSwtLXBsdWdpbiAkKGNhbGwgbm9ybWFsaXplLWNvbW1hLWxpc3QsJChQUklWQVRFX0pBQ0tfUExVR0lOKSkpIFwKLSAgICAkKGlmICQoUFJJVkFURV9FWFRSQV9KQVJfQVJHUyksLS1pbXBvcnQtcmVzb3VyY2UgJEAucmVzLnRtcCkgXAotICAgIC1EIGphY2suaW1wb3J0LnJlc291cmNlLnBvbGljeT1rZWVwLWZpcnN0IFwKLSAgICAtRCBqYWNrLmltcG9ydC50eXBlLnBvbGljeT1rZWVwLWZpcnN0IFwKLSAgICAtRCBqYWNrLmFuZHJvaWQubWluLWFwaS1sZXZlbD0kKFBSSVZBVEVfSkFDS19NSU5fU0RLX1ZFUlNJT04pIFwKLSAgICAkKGlmICQoUFJJVkFURV9KQUNLX0lOQ1JFTUVOVEFMX0RJUiksLS1pbmNyZW1lbnRhbC1mb2xkZXIgJChQUklWQVRFX0pBQ0tfSU5DUkVNRU5UQUxfRElSKSkgXAotICAgIC0tb3V0cHV0LWphY2sgJEAgXAotICAgICQoYWRkcHJlZml4IC0tY29uZmlnLWphcmphciAsJChzdHJpcCAkKFBSSVZBVEVfSkFSSkFSX1JVTEVTKSkpIFwKLSAgICAkKGlmICQoUFJJVkFURV9KQUNLX1BST0dVQVJEX0ZMQUdTKSwtLWNvbmZpZy1wcm9ndWFyZCAkQC5mbGFncykgXAotICAgICQkdG1wRWNqQXJnIFwKLSAgICB8fCAoIHJtIC1mICRAIDsgZXhpdCA0MSApCi0kKGhpZGUpIHJtIC1mICQoUFJJVkFURV9KQUNLX0lOVEVSTUVESUFURVNfRElSKS9qYXZhLXNvdXJjZS1saXN0Ci0kKGlmICQoUFJJVkFURV9FWFRSQV9KQVJfQVJHUyksJChoaWRlKSBybSAtcmYgJEAucmVzLnRtcCkKLSQoaGlkZSkgbXYgJChQUklWQVRFX0pBQ0tfSU5URVJNRURJQVRFU19ESVIpL2phdmEtc291cmNlLWxpc3QtdW5pcSAkKFBSSVZBVEVfSkFDS19JTlRFUk1FRElBVEVTX0RJUikuamF2YS1zb3VyY2UtbGlzdAotJChpZiAkKFBSSVZBVEVfSkFSX1BBQ0tBR0VTKSwgJChoaWRlKSBlY2hvIHVuc3VwcG9ydGVkIG9wdGlvbnMgUFJJVkFURV9KQVJfUEFDS0FHRVMgaW4gJEA7IGV4aXQgNTMpCi0kKGlmICQoUFJJVkFURV9KQVJfRVhDTFVERV9QQUNLQUdFUyksICQoaGlkZSkgZWNobyB1bnN1cHBvcnRlZCBvcHRpb25zIEpBUl9FWENMVURFX1BBQ0tBR0VTIGluICRAOyBleGl0IDUzKQotJChpZiAkKFBSSVZBVEVfSkFSX01BTklGRVNUKSwgJChoaWRlKSBlY2hvIHVuc3VwcG9ydGVkIG9wdGlvbnMgSkFSX01BTklGRVNUIGluICRAOyBleGl0IDUzKQotZW5kZWYKLQotZGVmaW5lIGRlc3VnYXItY2xhc3NwYXRoCi0kKGZpbHRlci1vdXQgLWNsYXNzcGF0aCAtYm9vdGNsYXNzcGF0aCAiIiwkKHN1YnN0IDosJChzcGFjZSksJCgxKSkpCi1lbmRlZgotCiAjIFRha2VzIGFuIHNkayB2ZXJzaW9uIHRoYXQgbWlnaHQgYmUgUExBVEZPUk1fVkVSU0lPTl9DT0RFTkFNRSAoZm9yIGV4YW1wbGUgUCksCiAjIHJldHVybnMgYSBudW1iZXIgZ3JlYXRlciB0aGFuIHRoZSBoaWdoZXN0IGV4aXN0aW5nIHNkayB2ZXJzaW9uIGlmIGl0IGlzLCBvcgogIyB0aGUgaW5wdXQgaWYgaXQgaXMgbm90LgpAQCAtMjU0MiwxMiArMjM2NiwxMiBAQAogQHJtIC1yZiAkKGRpciAkQCkvZGVzdWdhcl9kdW1wZWRfY2xhc3NlcwogQG1rZGlyICQoZGlyICRAKS9kZXN1Z2FyX2R1bXBlZF9jbGFzc2VzCiAkKGhpZGUpICQoSkFWQSkgXAotICAgICQoaWYgJChFWFBFUklNRU5UQUxfVVNFX09QRU5KREs5KSwtLWFkZC1vcGVucyBqYXZhLmJhc2UvamF2YS5sYW5nLmludm9rZT1BTEwtVU5OQU1FRCwpIFwKKyAgICAkKGlmICQoVVNFX09QRU5KREs5KSwtLWFkZC1vcGVucyBqYXZhLmJhc2UvamF2YS5sYW5nLmludm9rZT1BTEwtVU5OQU1FRCwpIFwKICAgICAtRGpkay5pbnRlcm5hbC5sYW1iZGEuZHVtcFByb3h5Q2xhc3Nlcz0kKGFic3BhdGggJChkaXIgJEApKS9kZXN1Z2FyX2R1bXBlZF9jbGFzc2VzIFwKICAgICAtamFyICQoREVTVUdBUikgXAotICAgICQoYWRkcHJlZml4IC0tYm9vdGNsYXNzcGF0aF9lbnRyeSAsJChjYWxsIGRlc3VnYXItYm9vdGNsYXNzcGF0aCwkKFBSSVZBVEVfQk9PVENMQVNTUEFUSCkpKSBcCi0gICAgJChhZGRwcmVmaXggLS1jbGFzc3BhdGhfZW50cnkgLCQoUFJJVkFURV9BTExfSkFWQV9MSUJSQVJJRVMpKSBcCi0gICAgLS1taW5fc2RrX3ZlcnNpb24gJChjYWxsIGNvZGVuYW1lLW9yLXNkay10by1zZGssJChQUklWQVRFX0RFRkFVTFRfQVBQX1RBUkdFVF9TREspKSBcCisgICAgJChhZGRwcmVmaXggLS1ib290Y2xhc3NwYXRoX2VudHJ5ICwkKFBSSVZBVEVfQk9PVENMQVNTUEFUSCkpIFwKKyAgICAkKGFkZHByZWZpeCAtLWNsYXNzcGF0aF9lbnRyeSAsJChQUklWQVRFX1NIQVJFRF9KQVZBX0hFQURFUl9MSUJSQVJJRVMpKSBcCisgICAgLS1taW5fc2RrX3ZlcnNpb24gJChjYWxsIGNvZGVuYW1lLW9yLXNkay10by1zZGssJChQUklWQVRFX01JTl9TREtfVkVSU0lPTikpIFwKICAgICAtLWFsbG93X2VtcHR5X2Jvb3RjbGFzc3BhdGggXAogICAgICQoaWYgJChmaWx0ZXIgLS1jb3JlLWxpYnJhcnksJChQUklWQVRFX0RYX0ZMQUdTKSksLS1jb3JlX2xpYnJhcnkpIFwKICAgICAtaSAkPCAtbyAkQC50bXAKQEAgLTI1NjEsNyArMjM4NSw3IEBACiAkKGhpZGUpIHJtIC1mICQoZGlyICRAKWNsYXNzZXMqLmRleAogJChoaWRlKSAkKERYX0NPTU1BTkQpIFwKICAgICAtLWRleCAtLW91dHB1dD0kKGRpciAkQCkgXAotICAgIC0tbWluLXNkay12ZXJzaW9uPSQoY2FsbCBjb2RlbmFtZS1vci1zZGstdG8tc2RrLCQoUFJJVkFURV9ERUZBVUxUX0FQUF9UQVJHRVRfU0RLKSkgXAorICAgIC0tbWluLXNkay12ZXJzaW9uPSQoUFJJVkFURV9NSU5fU0RLX1ZFUlNJT04pIFwKICAgICAkKGlmICQoTk9fT1BUSU1JWkVfRFgpLCBcCiAgICAgICAgIC0tbm8tb3B0aW1pemUpIFwKICAgICAkKGlmICQoR0VORVJBVEVfREVYX0RFQlVHKSwgXApAQCAtMjU3Miw2ICsyMzk2LDIxIEBACiAgICAgJDwKIGVuZGVmCiAKKworZGVmaW5lIHRyYW5zZm9ybS1jbGFzc2VzLWQ4Lmphci10by1kZXgKK0BlY2hvICJ0YXJnZXQgRGV4OiAkKFBSSVZBVEVfTU9EVUxFKSIKK0Bta2RpciAtcCAkKGRpciAkQCkKKyQoaGlkZSkgcm0gLWYgJChkaXIgJEApY2xhc3NlcyouZGV4ICQoZGlyICRAKWQ4X2lucHV0LmphcgorJChoaWRlKSAkKFpJUDJaSVApIC1qIC1pICQ8IC1vICQoZGlyICRAKWQ4X2lucHV0LmphciAiKiovKi5jbGFzcyIKKyQoaGlkZSkgJChEWF9DT01NQU5EKSBcCisgICAgLS1vdXRwdXQgJChkaXIgJEApIFwKKyAgICAtLW1pbi1hcGkgJChQUklWQVRFX01JTl9TREtfVkVSU0lPTikgXAorICAgICQoc3Vic3QgLS1tYWluLWRleC1saXN0PSwgLS1tYWluLWRleC1saXN0ICwgXAorICAgICAgICAkKGZpbHRlci1vdXQgLS1jb3JlLWxpYnJhcnkgLS1tdWx0aS1kZXggLS1taW5pbWFsLW1haW4tZGV4LCQoUFJJVkFURV9EWF9GTEFHUykpKSBcCisgICAgJChkaXIgJEApZDhfaW5wdXQuamFyCiskKGhpZGUpIHJtIC1mICQoZGlyICRAKWQ4X2lucHV0LmphcgorZW5kZWYKKwogIyBDcmVhdGUgYSBtb3N0bHktZW1wdHkgLmphciBmaWxlIHRoYXQgd2UnbGwgYWRkIHRvIGxhdGVyLgogIyBUaGUgTWFjT1MgamFyIHRvb2wgZG9lc24ndCBsaWtlIGNyZWF0aW5nIGVtcHR5IGphciBmaWxlcywKICMgc28gd2UgbmVlZCB0byBnaXZlIGl0IHNvbWV0aGluZy4KQEAgLTI2MjgsNiArMjQ2Nyw4IEBACiAgICAgJChhZGRwcmVmaXggLS1yZW5hbWUtaW5zdHJ1bWVudGF0aW9uLXRhcmdldC1wYWNrYWdlICwgJChQUklWQVRFX01BTklGRVNUX0lOU1RSVU1FTlRBVElPTl9GT1IpKSBcCiAgICAgLS1za2lwLXN5bWJvbHMtd2l0aG91dC1kZWZhdWx0LWxvY2FsaXphdGlvbiBcCiAgICAgLUYgJEAKKyMgU28gdGhhdCB3ZSByZS1ydW4gYWFwdCB3aGVuIHRoZSBsaXN0IG9mIGlucHV0IGZpbGVzIGNoYW5nZQorJChoaWRlKSBlY2hvICQoUFJJVkFURV9SRVNPVVJDRV9MSVNUKSA+L2Rldi9udWxsCiBlbmRlZgogCiAjIFdlIG5lZWQgdGhlIGV4dHJhIGJsYW5rIGxpbmUsIHNvIHRoYXQgdGhlIGNvbW1hbmQgd2lsbCBiZSBvbiBhIHNlcGFyYXRlIGxpbmUuCkBAIC0yNjc3LDE3ICsyNTE4LDE1IEBACiBAcm0gLWYgJCgxKS5qYXItYXJnLWxpc3QKIGVuZGVmCiAKLSMgQWRkIHJlc291cmNlcyBjYXJyaWVkIGJ5IHN0YXRpYyBKYWNrIGxpYnJhcmllcy4KLSMKLWRlZmluZSBhZGQtY2FycmllZC1qYWNrLXJlc291cmNlcwotICQoaGlkZSkgaWYgWyAtZCAkKFBSSVZBVEVfSkFDS19JTlRFUk1FRElBVEVTX0RJUikgXSA7IHRoZW4gXAotICAgIGZpbmQgJChQUklWQVRFX0pBQ0tfSU5URVJNRURJQVRFU19ESVIpIC10eXBlIGYgfCBzb3J0IFwKLSAgICAgICAgfCBzZWQgLWUgInM/XiQoUFJJVkFURV9KQUNLX0lOVEVSTUVESUFURVNfRElSKS8/IC1DIFwiJChQUklWQVRFX0pBQ0tfSU5URVJNRURJQVRFU19ESVIpXCIgXCI/IiAtZSAicy8kJC9cIi8iIFwKLSAgICAgICAgPiAkKGRpciAkQClqYWNrX3Jlc19qYXJfZmxhZ3M7IFwKLSAgICBpZiBbIC1zICQoZGlyICRAKWphY2tfcmVzX2phcl9mbGFncyBdIDsgdGhlbiBcCi0gICAgICAgICQoSkFSKSB1ZiAkQCBAJChkaXIgJEApamFja19yZXNfamFyX2ZsYWdzOyBcCi0gICAgZmk7IFwKLWZpCisjIEFkZCByZXNvdXJjZXMgKG5vbiAuY2xhc3MgZmlsZXMpIGZyb20gYSBqYXIgdG8gYSBwYWNrYWdlCisjICQoMSk6IHRoZSBwYWNrYWdlIGZpbGUKKyMgJCgyKTogdGhlIGphciBmaWxlCisjICQoMyk6IHRlbXBvcmFyeSBkaXJlY3RvcnkKK2RlZmluZSBhZGQtamFyLXJlc291cmNlcy10by1wYWNrYWdlCisgIHJtIC1yZiAkKDMpCisgIG1rZGlyIC1wICQoMykKKyAgdW56aXAgLXFvICQoMikgLWQgJCgzKSAkJCh6aXBpbmZvIC0xICQoMikgfCBncmVwIC12IC1FICJcLmNsYXNzJCQiKQorICAkKEpBUikgdWYgJCgxKSAkKGNhbGwgamFyLWFyZ3Mtc29ydGVkLWZpbGVzLWluLWRpcmVjdG9yeSwkKDMpKQogZW5kZWYKIAogIyBTaWduIGEgcGFja2FnZSB1c2luZyB0aGUgc3BlY2lmaWVkIGtleS9jZXJ0LgpAQCAtMjY5NiwxNCArMjUzNSwxMCBAQAogJChjYWxsIHNpZ24tcGFja2FnZS1hcmcsJEApCiBlbmRlZgogCi0jIHNpZ25hcGsgdXNlcyBpbnRlcm5hbCBBUElzIGZyb20gc3VuLnNlY3VyaXR5Lntwa2NzLHg1MDl9OyBzZWUgaHR0cDovL2IvMzcxMzc4NjkKICMgJCgxKTogdGhlIHBhY2thZ2UgZmlsZSB3ZSBhcmUgc2lnbmluZy4KIGRlZmluZSBzaWduLXBhY2thZ2UtYXJnCiAkKGhpZGUpIG12ICQoMSkgJCgxKS51bnNpZ25lZAotJChoaWRlKSAkKEpBVkEpIC1EamF2YS5saWJyYXJ5LnBhdGg9JChTSUdOQVBLX0pOSV9MSUJSQVJZX1BBVEgpIFwKLSAgICAkKGlmICQoRVhQRVJJTUVOVEFMX1VTRV9PUEVOSkRLOSksLS1hZGQtZXhwb3J0cyBqYXZhLmJhc2Uvc3VuLnNlY3VyaXR5LnBrY3M9QUxMLVVOTkFNRUQsKSBcCi0gICAgJChpZiAkKEVYUEVSSU1FTlRBTF9VU0VfT1BFTkpESzkpLC0tYWRkLWV4cG9ydHMgamF2YS5iYXNlL3N1bi5zZWN1cml0eS54NTA5PUFMTC1VTk5BTUVELCkgXAotICAgIC1qYXIgJChTSUdOQVBLX0pBUikgXAorJChoaWRlKSAkKEpBVkEpIC1EamF2YS5saWJyYXJ5LnBhdGg9JChTSUdOQVBLX0pOSV9MSUJSQVJZX1BBVEgpIC1qYXIgJChTSUdOQVBLX0pBUikgXAogICAgICQoUFJJVkFURV9DRVJUSUZJQ0FURSkgJChQUklWQVRFX1BSSVZBVEVfS0VZKSBcCiAgICAgJChQUklWQVRFX0FERElUSU9OQUxfQ0VSVElGSUNBVEVTKSAkKDEpLnVuc2lnbmVkICQoMSkuc2lnbmVkCiAkKGhpZGUpIG12ICQoMSkuc2lnbmVkICQoMSkKQEAgLTI3MzgsMTQgKzI1NzMsMjcgQEAKICQoaGlkZSkgJChaSVBUSU1FKSAkQAogZW5kZWYKIAorIyBVbmNvbXByZXNzIGRleCBmaWxlcyBlbWJlZGRlZCBpbiBhbiBhcGsuCisjCitkZWZpbmUgdW5jb21wcmVzcy1kZXhzCiskKGhpZGUpIGlmICh6aXBpbmZvICRAICcqLmRleCcgMj4vZGV2L251bGwgfCBncmVwIC12ICcgc3RvciAnID4vZGV2L251bGwpIDsgdGhlbiBcCisgIHRtcGRpcj0kQC50bXBkaXI7IFwKKyAgcm0gLXJmICQkdG1wZGlyICYmIG1rZGlyICQkdG1wZGlyOyBcCisgIHVuemlwIC1xICRAICcqLmRleCcgLWQgJCR0bXBkaXIgJiYgXAorICB6aXAgLXFkICRAICcqLmRleCcgJiYgXAorICAoIGNkICQkdG1wZGlyICYmIGZpbmQgLiAtdHlwZSBmIHwgc29ydCB8IHppcCAtcUQgLVggLTAgLi4vJChub3RkaXIgJEApIC1AICkgJiYgXAorICBybSAtcmYgJCR0bXBkaXI7IFwKKyAgZmkKK2VuZGVmCisKICMgVW5jb21wcmVzcyBzaGFyZWQgbGlicmFyaWVzIGVtYmVkZGVkIGluIGFuIGFway4KICMKIGRlZmluZSB1bmNvbXByZXNzLXNoYXJlZC1saWJzCiAkKGhpZGUpIGlmICh6aXBpbmZvICRAICQoUFJJVkFURV9FTUJFRERFRF9KTklfTElCUykgMj4vZGV2L251bGwgfCBncmVwIC12ICcgc3RvciAnID4vZGV2L251bGwpIDsgdGhlbiBcCiAgIHJtIC1yZiAkKGRpciAkQCl1bmNvbXByZXNzZWRsaWJzICYmIG1rZGlyICQoZGlyICRAKXVuY29tcHJlc3NlZGxpYnM7IFwKLSAgdW56aXAgJEAgJChQUklWQVRFX0VNQkVEREVEX0pOSV9MSUJTKSAtZCAkKGRpciAkQCl1bmNvbXByZXNzZWRsaWJzICYmIFwKLSAgemlwIC1kICRAICdsaWIvKi5zbycgJiYgXAotICAoIGNkICQoZGlyICRAKXVuY29tcHJlc3NlZGxpYnMgJiYgZmluZCBsaWIgLXR5cGUgZiB8IHNvcnQgfCB6aXAgLUQgLVggLTAgLi4vJChub3RkaXIgJEApIC1AICkgJiYgXAorICB1bnppcCAtcSAkQCAkKFBSSVZBVEVfRU1CRURERURfSk5JX0xJQlMpIC1kICQoZGlyICRAKXVuY29tcHJlc3NlZGxpYnMgJiYgXAorICB6aXAgLXFkICRAICdsaWIvKi5zbycgJiYgXAorICAoIGNkICQoZGlyICRAKXVuY29tcHJlc3NlZGxpYnMgJiYgZmluZCBsaWIgLXR5cGUgZiB8IHNvcnQgfCB6aXAgLXFEIC1YIC0wIC4uLyQobm90ZGlyICRAKSAtQCApICYmIFwKICAgcm0gLXJmICQoZGlyICRAKXVuY29tcHJlc3NlZGxpYnM7IFwKICAgZmkKIGVuZGVmCkBAIC0yNzU3LDggKzI2MDUsMTUgQEAKICMgTm90ZTogd2UgaW50ZW50aW9uYWxseSBkb24ndCBjbGVhbiBQUklWQVRFX0NMQVNTX0lOVEVSTUVESUFURVNfRElSCiAjIGluIHRyYW5zZm9ybS1qYXZhLXRvLWNsYXNzZXMgZm9yIHRoZSBzYWtlIG9mIHZtLXRlc3RzLgogZGVmaW5lIHRyYW5zZm9ybS1ob3N0LWphdmEtdG8tcGFja2FnZQotQGVjaG8gIiQoJChQUklWQVRFX1BSRUZJWClESVNQTEFZKSBKYXZhOiAkKFBSSVZBVEVfTU9EVUxFKSAoJChQUklWQVRFX0NMQVNTX0lOVEVSTUVESUFURVNfRElSKSkiCi0kKGNhbGwgY29tcGlsZS1qYXZhLCQoSE9TVF9KQVZBQyksJChQUklWQVRFX0JPT1RDTEFTU1BBVEgpKQorQGVjaG8gIkhvc3QgSmF2YTogJChQUklWQVRFX01PRFVMRSkgKCQoUFJJVkFURV9DTEFTU19JTlRFUk1FRElBVEVTX0RJUikpIgorJChjYWxsIGNvbXBpbGUtamF2YSwkKEhPU1RfSkFWQUMpLCQoUFJJVkFURV9BTExfSkFWQV9MSUJSQVJJRVMpKQorZW5kZWYKKworIyBOb3RlOiB3ZSBpbnRlbnRpb25hbGx5IGRvbid0IGNsZWFuIFBSSVZBVEVfQ0xBU1NfSU5URVJNRURJQVRFU19ESVIKKyMgaW4gdHJhbnNmb3JtLWphdmEtdG8tY2xhc3NlcyBmb3IgdGhlIHNha2Ugb2Ygdm0tdGVzdHMuCitkZWZpbmUgdHJhbnNmb3JtLWhvc3QtamF2YS10by1kYWx2aWstcGFja2FnZQorQGVjaG8gIkRhbHZpayBKYXZhOiAkKFBSSVZBVEVfTU9EVUxFKSAoJChQUklWQVRFX0NMQVNTX0lOVEVSTUVESUFURVNfRElSKSkiCiskKGNhbGwgY29tcGlsZS1qYXZhLCQoSE9TVF9KQVZBQyksJChQUklWQVRFX0FMTF9KQVZBX0hFQURFUl9MSUJSQVJJRVMpKQogZW5kZWYKIAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKQEAgLTI3ODMsNiArMjYzOCwxNCBAQAogCSQkKGNvcHktZmlsZS10by10YXJnZXQpCiBlbmRlZgogCitkZWZpbmUgY29weS1hbmQtdW5jb21wcmVzcy1kZXhzCiskKDIpOiAkKDEpICQoWklQQUxJR04pCisJQGVjaG8gIlVuY29tcHJlc3MgZGV4cyBpbjogJCRAIgorCSQkKGNvcHktZmlsZS10by10YXJnZXQpCisJJCQodW5jb21wcmVzcy1kZXhzKQorCSQkKGFsaWduLXBhY2thZ2UpCitlbmRlZgorCiAjIENvcGllcyBtYW55IGZpbGVzLgogIyAkKDEpOiBUaGUgZmlsZXMgdG8gY29weS4gIEVhY2ggZW50cnkgaXMgYSAnOicgc2VwYXJhdGVkIHNyYzpkc3QgcGFpcgogIyBFdmFsdWF0ZXMgdG8gdGhlIGxpc3Qgb2YgdGhlIGRzdCBmaWxlcyAoaWUgc3VpdGFibGUgZm9yIGEgZGVwZW5kZW5jeSBsaXN0KQpAQCAtMjc5OSw5ICsyNjYyLDkgQEAKICMgJCgxKTogc291cmNlIGZpbGUKICMgJCgyKTogZGVzdGluYXRpb24gZmlsZSwgbXVzdCBlbmQgd2l0aCAueG1sLgogZGVmaW5lIGNvcHkteG1sLWZpbGUtY2hlY2tlZAotJCgyKTogJCgxKQorJCgyKTogJCgxKSAkKFhNTExJTlQpCiAJQGVjaG8gIkNvcHkgeG1sOiAkJEAiCi0JJChoaWRlKSB4bWxsaW50ICQkPCA+L2Rldi9udWxsICAjIERvbid0IHByaW50IHRoZSB4bWwgZmlsZSB0byBzdGRvdXQuCisJJChoaWRlKSAkKFhNTExJTlQpICQkPCA+L2Rldi9udWxsICAjIERvbid0IHByaW50IHRoZSB4bWwgZmlsZSB0byBzdGRvdXQuCiAJJCQoY29weS1maWxlLXRvLXRhcmdldCkKIGVuZGVmCiAKQEAgLTI4MjIsNyArMjY4NSw3IEBACiBkZWZpbmUgY29weS1maWxlLXRvLXRhcmdldAogQG1rZGlyIC1wICQoZGlyICRAKQogJChoaWRlKSBybSAtZiAkQAotJChoaWRlKSBjcCAkPCAkQAorJChoaWRlKSBjcCAiJDwiICIkQCIKIGVuZGVmCiAKICMgVGhlIHNhbWUgYXMgY29weS1maWxlLXRvLXRhcmdldCwgYnV0IHVzZSB0aGUgbG9jYWwKQEAgLTI4MzAsNyArMjY5Myw3IEBACiBkZWZpbmUgY29weS1maWxlLXRvLXRhcmdldC13aXRoLWNwCiBAbWtkaXIgLXAgJChkaXIgJEApCiAkKGhpZGUpIHJtIC1mICRACi0kKGhpZGUpIGNwIC1wICQ8ICRACiskKGhpZGUpIGNwIC1wICIkPCIgIiRAIgogZW5kZWYKIAogIyBUaGUgc2FtZSBhcyBjb3B5LWZpbGUtdG8tdGFyZ2V0LCBidXQgc3RyaXAgb3V0ICIjIGNvbW1lbnQiLXN0eWxlCkBAIC0yODk4LDE1ICsyNzYxLDkwIEBACiAJJChoaWRlKSBsbiAtc2YgJCgyKSAkJEAKIGVuZGVmCiAKKyMgQ29weSBhbiBhcGsgdG8gYSB0YXJnZXQgbG9jYXRpb24gd2hpbGUgcmVtb3ZpbmcgY2xhc3NlcyouZGV4CisjICQoMSk6IHNvdXJjZSBmaWxlCisjICQoMik6IGRlc3RpbmF0aW9uIGZpbGUKKyMgJCgzKTogTE9DQUxfREVYX1BSRU9QVCwgaWYgbm9zdHJpcHBpbmcgdGhlbiBsZWF2ZSBjbGFzc2VzKi5kZXgKK2RlZmluZSBkZXhwcmVvcHQtY29weS1qYXIKKyQoMik6ICQoMSkKKwlAZWNobyAiQ29weTogJCRAIgorCSQkKGNvcHktZmlsZS10by10YXJnZXQpCisJJChpZiAkKGZpbHRlciBub3N0cmlwcGluZywkKDMpKSwsJCQoY2FsbCBkZXhwcmVvcHQtcmVtb3ZlLWNsYXNzZXMuZGV4LCQkQCkpCitlbmRlZgorCisjICQoMSk6IHRoZSAuamFyIG9yIC5hcGsgdG8gcmVtb3ZlIGNsYXNzZXMuZGV4LiBOb3RlIHRoYXQgaWYgYWxsIGRleCBmaWxlcworIyBhcmUgdW5jb21wcmVzc2VkIGluIHRoZSBhcmNoaXZlLCB0aGVuIGRleG9wdCB3aWxsIG5vdCBkbyBhIGNvcHkgb2YgdGhlIGRleAorIyBmaWxlcyBhbmQgd2Ugc2hvdWxkIG5vdCBzdHJpcC4KK2RlZmluZSBkZXhwcmVvcHQtcmVtb3ZlLWNsYXNzZXMuZGV4CiskKGhpZGUpIGlmICh6aXBpbmZvICQxICcqLmRleCcgMj4vZGV2L251bGwgfCBncmVwIC12ICcgc3RvciAnID4vZGV2L251bGwpIDsgdGhlbiBcCit6aXAgLS1xdWlldCAtLWRlbGV0ZSAkKDEpIGNsYXNzZXMuZGV4OyBcCitkZXhfaW5kZXg9MjsgXAord2hpbGUgemlwIC0tcXVpZXQgLS1kZWxldGUgJCgxKSBjbGFzc2VzJCR7ZGV4X2luZGV4fS5kZXggPiAvZGV2L251bGw7IGRvIFwKKyAgbGV0IGRleF9pbmRleD1kZXhfaW5kZXgrMTsgXAorZG9uZSBcCitmaQorZW5kZWYKKworZGVmaW5lIGhpZGRlbmFwaS1jb3B5LWRleC1maWxlcworJCgyKTogJCgxKSAkKEhJRERFTkFQSSkgJChJTlRFUk5BTF9QTEFURk9STV9ISURERU5BUElfTElHSFRfR1JFWUxJU1QpIFwKKyAgICAgICQoSU5URVJOQUxfUExBVEZPUk1fSElEREVOQVBJX0RBUktfR1JFWUxJU1QpICQoSU5URVJOQUxfUExBVEZPUk1fSElEREVOQVBJX0JMQUNLTElTVCkKKwlAcm0gLXJmICQoZGlyICQoMikpCisJQG1rZGlyIC1wICQoZGlyICQoMikpCisJZmluZCAkKGRpciAkKDEpKSAtbWF4ZGVwdGggMSAtbmFtZSAiY2xhc3NlcyouZGV4IiB8IHNvcnQgfCBcCisJCXhhcmdzIC1Je30gY3AgLWYge30gJChkaXIgJCgyKSkKKwlmaW5kICQoZGlyICQoMikpIC1uYW1lICJjbGFzc2VzKi5kZXgiIHwgc29ydCB8IHNlZCAncy9eLy0tZGV4PS8nIHwgXAorCQl4YXJncyAkKEhJRERFTkFQSSkgLS1saWdodC1ncmV5bGlzdD0kKElOVEVSTkFMX1BMQVRGT1JNX0hJRERFTkFQSV9MSUdIVF9HUkVZTElTVCkgXAorCQkgICAgICAgICAgICAgICAgICAgLS1kYXJrLWdyZXlsaXN0PSQoSU5URVJOQUxfUExBVEZPUk1fSElEREVOQVBJX0RBUktfR1JFWUxJU1QpIFwKKwkJICAgICAgICAgICAgICAgICAgIC0tYmxhY2tsaXN0PSQoSU5URVJOQUxfUExBVEZPUk1fSElEREVOQVBJX0JMQUNLTElTVCkKK2VuZGVmCisKK2RlZmluZSBoaWRkZW5hcGktY29weS1zb29uZy1qYXIKKyQoMik6IFBSSVZBVEVfRk9MREVSIDo9ICQoZGlyICQoMikpZGV4LWhpZGRlbmFwaQorJCgyKTogJCgxKSAkKEhJRERFTkFQSSkgJChTT09OR19aSVApICQoTUVSR0VfWklQUykgJChJTlRFUk5BTF9QTEFURk9STV9ISURERU5BUElfTElHSFRfR1JFWUxJU1QpIFwKKyAgICAgICQoSU5URVJOQUxfUExBVEZPUk1fSElEREVOQVBJX0RBUktfR1JFWUxJU1QpICQoSU5URVJOQUxfUExBVEZPUk1fSElEREVOQVBJX0JMQUNLTElTVCkKKwlAZWNobyAiSGlkZGVuIEFQSTogJCRAIgorCSQkKGNvcHktZmlsZS10by10YXJnZXQpCisJQHJtIC1yZiAkJHtQUklWQVRFX0ZPTERFUn0KKwlAbWtkaXIgLXAgJCR7UFJJVkFURV9GT0xERVJ9CisJdW56aXAgLXEgJCgyKSAnY2xhc3NlcyouZGV4JyAtZCAkJHtQUklWQVRFX0ZPTERFUn0KKwlmaW5kICQke1BSSVZBVEVfRk9MREVSfSAtbmFtZSAiY2xhc3NlcyouZGV4IiB8IHNvcnQgfCBzZWQgJ3MvXi8tLWRleD0vJyB8IFwKKwkJeGFyZ3MgJChISURERU5BUEkpIC0tbGlnaHQtZ3JleWxpc3Q9JChJTlRFUk5BTF9QTEFURk9STV9ISURERU5BUElfTElHSFRfR1JFWUxJU1QpIFwKKwkJICAgICAgICAgICAgICAgICAgIC0tZGFyay1ncmV5bGlzdD0kKElOVEVSTkFMX1BMQVRGT1JNX0hJRERFTkFQSV9EQVJLX0dSRVlMSVNUKSBcCisJCSAgICAgICAgICAgICAgICAgICAtLWJsYWNrbGlzdD0kKElOVEVSTkFMX1BMQVRGT1JNX0hJRERFTkFQSV9CTEFDS0xJU1QpCisJJChTT09OR19aSVApIC1vICQke1BSSVZBVEVfRk9MREVSfS9jbGFzc2VzLmRleC5qYXIgLUMgJCR7UFJJVkFURV9GT0xERVJ9IC1EICQke1BSSVZBVEVfRk9MREVSfQorCSQoTUVSR0VfWklQUykgLUQgLXppcFRvTm90U3RyaXAgJCR7UFJJVkFURV9GT0xERVJ9L2NsYXNzZXMuZGV4LmphciAtc3RyaXBGaWxlICJjbGFzc2VzKi5kZXgiIFwKKwkJJCgyKSAkJHtQUklWQVRFX0ZPTERFUn0vY2xhc3Nlcy5kZXguamFyICQoMSkKK2VuZGVmCisKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAjIyBDb21tYW5kcyB0byBjYWxsIFByb2d1YXJkCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworaWZkZWYgVEFSR0VUX09QRU5KREs5CitkZWZpbmUgdHJhbnNmb3JtLWphci10by1wcm9ndWFyZAorQGVjaG8gU2tpcHBpbmcgUHJvZ3VhcmQ6ICQ8ICRACiskKGhpZGUpIGNwICckPCcgJEAKK2VuZGVmCitlbHNlCiBkZWZpbmUgdHJhbnNmb3JtLWphci10by1wcm9ndWFyZAogQGVjaG8gUHJvZ3VhcmQ6ICRACi0kKGhpZGUpICQoUFJPR1VBUkQpIC1pbmphcnMgJyQ8JChQUklWQVRFX1BST0dVQVJEX0lOSkFSX0ZJTFRFUlMpJyBcCi0gICAgLW91dGphcnMgJEAgJChQUklWQVRFX1BST0dVQVJEX0ZMQUdTKSBcCiskKGhpZGUpICQoUFJPR1VBUkQpIC1pbmphcnMgJDwgLW91dGphcnMgJEAgJChQUklWQVRFX1BST0dVQVJEX0ZMQUdTKSBcCiAgICAgJChhZGRwcmVmaXggLWluamFycyAsICQoUFJJVkFURV9FWFRSQV9JTlBVVF9KQVIpKQogZW5kZWYKK2VuZGlmCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIENvbW1hbmRzIHRvIGNhbGwgUjgKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitkZWZpbmUgdHJhbnNmb3JtLWphci10by1kZXgtcjgKK0BlY2hvIFI4OiAkQAorJChoaWRlKSAkKFI4X0NPTVBBVF9QUk9HVUFSRCkgLWluamFycyAnJDwnIFwKKyAgICAtLW1pbi1hcGkgJChQUklWQVRFX01JTl9TREtfVkVSU0lPTikgXAorICAgIC0tZm9yY2UtcHJvZ3VhcmQtY29tcGF0aWJpbGl0eSAtLW91dHB1dCAkKHN1YnN0IGNsYXNzZXMuZGV4LCwkQCkgXAorICAgICQoUFJJVkFURV9QUk9HVUFSRF9GTEFHUykgXAorICAgICQoYWRkcHJlZml4IC1pbmphcnMgLCAkKFBSSVZBVEVfRVhUUkFfSU5QVVRfSkFSKSkgXAorICAgICQoUFJJVkFURV9EWF9GTEFHUykKK2VuZGVmCiAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAjIyBTdHVmZiBzb3VyY2UgZ2VuZXJhdGVkIGZyb20gb25lLW9mZiB0b29scwpAQCAtMjkyOCwzOSArMjg2NiwxNiBAQAogJChlcnJvciBIT1NUX09TIG11c3QgZGVmaW5lIGdldC1maWxlLXNpemUpCiBlbmRpZgogCi0jIENvbnZlcnQgYSBwYXJ0aXRpb24gZGF0YSBzaXplIChlZywgYXMgcmVwb3J0ZWQgaW4gL3Byb2MvbXRkKSB0byB0aGUKLSMgc2l6ZSBvZiB0aGUgaW1hZ2UgdXNlZCB0byBmbGFzaCB0aGF0IHBhcnRpdGlvbiAod2hpY2ggaW5jbHVkZXMgYQotIyBzcGFyZSBhcmVhIGZvciBlYWNoIHBhZ2UpLgotIyAkKDEpOiB0aGUgcGFydGl0aW9uIGRhdGEgc2l6ZQotZGVmaW5lIGltYWdlLXNpemUtZnJvbS1kYXRhLXNpemUKLSQoc3RyaXAgJChldmFsIF9pc2Zkc192YWx1ZSA6PSAkJChzaGVsbCBlY2hvICQkJCQoKCQoMSkgLyAkKEJPQVJEX05BTkRfUEFHRV9TSVpFKSAqIFwKLSAgKCQoQk9BUkRfTkFORF9QQUdFX1NJWkUpKyQoQk9BUkRfTkFORF9TUEFSRV9TSVpFKSkpKSkpXAotJChpZiAkKGZpbHRlciAwLCAkKF9pc2Zkc192YWx1ZSkpLCQoc2hlbGwgZWNobyAkJCgoJChCT0FSRF9OQU5EX1BBR0VfU0laRSkrJChCT0FSRF9OQU5EX1NQQVJFX1NJWkUpKSkpLCQoX2lzZmRzX3ZhbHVlKSlcCi0kKGV2YWwgX2lzZmRzX3ZhbHVlIDo9KSkKLWVuZGVmCi0KICMgJCgxKTogVGhlIGZpbGUocykgdG8gY2hlY2sgKG9mdGVuICRAKQotIyAkKDIpOiBUaGUgbWF4aW11bSB0b3RhbCBpbWFnZSBzaXplLCBpbiBkZWNpbWFsIGJ5dGVzLgotIyAgICBNYWtlIHN1cmUgdG8gdGFrZSBpbnRvIGFjY291bnQgYW55IHJlc2VydmVkIHNwYWNlIG5lZWRlZCBmb3IgdGhlIEZTLgotIwotIyBJZiAkKDIpIGlzIGVtcHR5LCBldmFsdWF0ZXMgdG8gInRydWUiCi0jCi0jIFJlc2VydmUgYmFkIGJsb2Nrcy4gIE1ha2Ugc3VyZSB0aGF0IE1BWCgxJSBvZiBwYXJ0aXRpb24gc2l6ZSwgMiBibG9ja3MpCi0jIGlzIGxlZnQgb3ZlciBhZnRlciB0aGUgaW1hZ2UgaGFzIGJlZW4gZmxhc2hlZC4gIFJvdW5kIHRoZSAxJSB1cCB0byB0aGUKLSMgbmV4dCB3aG9sZSBmbGFzaCBibG9jayBzaXplLgotZGVmaW5lIGFzc2VydC1tYXgtZmlsZS1zaXplCisjICQoMik6IFRoZSBwYXJ0aXRpb24gc2l6ZS4KK2RlZmluZSBhc3NlcnQtbWF4LWltYWdlLXNpemUKICQoaWYgJCgyKSwgXAogICBzaXplPSQkKGZvciBpIGluICQoMSk7IGRvICQoY2FsbCBnZXQtZmlsZS1zaXplLCQkaSk7IGVjaG8gKzsgZG9uZTsgZWNobyAwKTsgXAogICB0b3RhbD0kJCgoICQkKCBlY2hvICIkJHNpemUiICkgKSk7IFwKICAgcHJpbnRuYW1lPSQkKGVjaG8gLW4gIiQoMSkiIHwgdHIgIiAiICspOyBcCi0gIGltZ19ibG9ja3NpemU9JChjYWxsIGltYWdlLXNpemUtZnJvbS1kYXRhLXNpemUsJChCT0FSRF9GTEFTSF9CTE9DS19TSVpFKSk7IFwKLSAgdHdvYmxvY2tzPSQkKChpbWdfYmxvY2tzaXplICogMikpOyBcCi0gIG9uZXBjdD0kJCgoKCgoJCgyKSAvIDEwMCkgLSAxKSAvIGltZ19ibG9ja3NpemUgKyAxKSAqIGltZ19ibG9ja3NpemUpKTsgXAotICByZXNlcnZlPSQkKCh0d29ibG9ja3MgPiBvbmVwY3QgPyB0d29ibG9ja3MgOiBvbmVwY3QpKTsgXAotICBtYXhzaXplPSQkKCgkKDIpIC0gcmVzZXJ2ZSkpOyBcCi0gIGVjaG8gIiQkcHJpbnRuYW1lIG1heHNpemU9JCRtYXhzaXplIGJsb2Nrc2l6ZT0kJGltZ19ibG9ja3NpemUgdG90YWw9JCR0b3RhbCByZXNlcnZlPSQkcmVzZXJ2ZSI7IFwKKyAgbWF4c2l6ZT0kJCgoJCgyKSkpOyBcCiAgIGlmIFsgIiQkdG90YWwiIC1ndCAiJCRtYXhzaXplIiBdOyB0aGVuIFwKLSAgICBlY2hvICJlcnJvcjogJCRwcmludG5hbWUgdG9vIGxhcmdlICgkJHRvdGFsID4gWyQoMikgLSAkJHJlc2VydmVdKSI7IFwKKyAgICBlY2hvICJlcnJvcjogJCRwcmludG5hbWUgdG9vIGxhcmdlICgkJHRvdGFsID4gJCRtYXhzaXplKSI7IFwKICAgICBmYWxzZTsgXAogICBlbGlmIFsgIiQkdG90YWwiIC1ndCAkJCgobWF4c2l6ZSAtIDMyNzY4KSkgXTsgdGhlbiBcCiAgICAgZWNobyAiV0FSTklORzogJCRwcmludG5hbWUgYXBwcm9hY2hpbmcgc2l6ZSBsaW1pdCAoJCR0b3RhbCBub3c7IGxpbWl0ICQkbWF4c2l6ZSkiOyBcCkBAIC0yOTcwLDE3ICsyODg1LDYgQEAKICApCiBlbmRlZgogCi0jIExpa2UgYXNzZXJ0LW1heC1maWxlLXNpemUsIGJ1dCB0aGUgc2Vjb25kIGFyZ3VtZW50IGlzIGEgcGFydGl0aW9uCi0jIHNpemUsIHdoaWNoIHdlJ2xsIGNvbnZlcnQgdG8gYSBtYXggaW1hZ2Ugc2l6ZSBiZWZvcmUgY2hlY2tpbmcgaXQKLSMgYWdhaW5zdCB0aGUgZmlsZXMuCi0jCi0jICQoMSk6IFRoZSBmaWxlKHMpIHRvIGNoZWNrIChvZnRlbiAkQCkKLSMgJCgyKTogVGhlIHBhcnRpdGlvbiBzaXplLgotZGVmaW5lIGFzc2VydC1tYXgtaW1hZ2Utc2l6ZQotJChpZiAkKDIpLCBcCi0gICQoY2FsbCBhc3NlcnQtbWF4LWZpbGUtc2l6ZSwkKDEpLCQoY2FsbCBpbWFnZS1zaXplLWZyb20tZGF0YS1zaXplLCQoMikpKSkKLWVuZGVmCi0KIAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICMjIERlZmluZSBkZXZpY2Utc3BlY2lmaWMgcmFkaW8gZmlsZXMKQEAgLTMxNTcsOSArMzA2MSwxMSBAQAogICBIT1NUX0RBTFZJS19KQVZBX0xJQlJBUlkgXAogICBIT1NUX0RBTFZJS19TVEFUSUNfSkFWQV9MSUJSQVJZIFwKICAgYmFzZV9ydWxlcyBcCi0gIEhFQURFUl9MSUJSQVJZCisgIEhFQURFUl9MSUJSQVJZIFwKKyAgSE9TVF9URVNUX0NPTkZJRyBcCisgIFRBUkdFVF9URVNUX0NPTkZJRwogCi0kKGZvcmVhY2ggJChzKSwkKFNUQVRTLk1PRFVMRV9UWVBFKSwkKGV2YWwgU1RBVFMuTU9EVUxFX1RZUEUuJChzKSA6PSkpCiskKGZvcmVhY2ggcywkKFNUQVRTLk1PRFVMRV9UWVBFKSwkKGV2YWwgU1RBVFMuTU9EVUxFX1RZUEUuJChzKSA6PSkpCiBkZWZpbmUgcmVjb3JkLW1vZHVsZS10eXBlCiAkKHN0cmlwICQoaWYgJChMT0NBTF9SRUNPUkRFRF9NT0RVTEVfVFlQRSksLAogICAkKGlmICQoZmlsdGVyLW91dCAkKFNPT05HX0FORFJPSURfTUspLCQoTE9DQUxfTU9EVUxFX01BS0VGSUxFKSksCkBAIC0zMTg5LDcgKzMwOTUsNyBAQAogZGVmaW5lIGNyZWF0ZS1zdWl0ZS1kZXBlbmRlbmNpZXMKICQoZm9yZWFjaCBzdWl0ZSwgJChMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFKSwgXAogICAkKGV2YWwgQ09NUEFUSUJJTElUWS4kKHN1aXRlKS5GSUxFUyA6PSBcCi0gICAgJChDT01QQVRJQklMSVRZLiQoc3VpdGUpLkZJTEVTKSAkKGZvcmVhY2ggZiwkKG15X2NvbXBhdF9kaXN0XyQoc3VpdGUpKSwkKGNhbGwgd29yZC1jb2xvbiwyLCQoZikpKSkpIFwKKyAgICAkJChDT01QQVRJQklMSVRZLiQoc3VpdGUpLkZJTEVTKSAkJChmb3JlYWNoIGYsJCQobXlfY29tcGF0X2Rpc3RfJChzdWl0ZSkpLCQkKGNhbGwgd29yZC1jb2xvbiwyLCQkKGYpKSkpKSBcCiAkKGV2YWwgJChteV9hbGxfdGFyZ2V0cykgOiAkKGNhbGwgY29weS1tYW55LWZpbGVzLCBcCiAgICQoc29ydCAkKGZvcmVhY2ggc3VpdGUsJChMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFKSwkKG15X2NvbXBhdF9kaXN0XyQoc3VpdGUpKSkpKSkKIGVuZGVmCkBAIC0zMzMwLDYgKzMyMzYsMTIyIEBACiBlbmRpZgogCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMgR2l2ZW4gYSBmaWxlcGF0aCwgcmV0dXJucyBub25lbXB0eSBpZiB0aGUgcGF0aCBjYW5ub3QgYmUKKyMjIHZhbGlkYXRlZCB0byBiZSBjb250YWluZWQgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5CisjIyBUaGlzIGlzLCB0aGlzIGZ1bmN0aW9uIGNoZWNrcyBmb3IgJy8nIGFuZCAnLi4nCisjIworIyMgJCgxKTogcGF0aCB0byB2YWxpZGF0ZQorZGVmaW5lIHRyeS12YWxpZGF0ZS1wYXRoLWlzLXN1YmRpcgorJChzdHJpcCAKKyAgICAkKGlmICQoZmlsdGVyIC8lLCQoMSkpLAorICAgICAgICAkKDEpIHN0YXJ0cyB3aXRoIGEgc2xhc2gKKyAgICApCisgICAgJChpZiAkKGZpbHRlciAuLi8lLCQoY2FsbCBjbGVhbi1wYXRoLCQoMSkpKSwKKyAgICAgICAgJCgxKSBlc2NhcGVzIGl0cyBwYXJlbnQgdXNpbmcgJy4uJworICAgICkKKyAgICAkKGlmICQoc3RyaXAgJCgxKSksCisgICAgLAorICAgICAgICAnJCgxKScgaXMgZW1wdHkKKyAgICApCispCitlbmRlZgorCitkZWZpbmUgdmFsaWRhdGUtcGF0aC1pcy1zdWJkaXIKKyQoaWYgJChjYWxsIHRyeS12YWxpZGF0ZS1wYXRoLWlzLXN1YmRpciwkKDEpKSwKKyAgJChjYWxsIHByZXR0eS1lcnJvciwgSWxsZWdhbCBwYXRoOiAkKGNhbGwgdHJ5LXZhbGlkYXRlLXBhdGgtaXMtc3ViZGlyLCQoMSkpKQorKQorZW5kZWYKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIEdpdmVuIGEgc3BhY2UtZGVsaW1pdGVkIGxpc3Qgb2YgZmlsZXBhdGhzLCByZXR1cm5zCisjIyBub25lbXB0eSBpZiBhbnkgY2Fubm90IGJlIHZhbGlkYXRlZCB0byBiZSBjb250YWluZWQgaW4KKyMjIHRoZSBjdXJyZW50IGRpcmVjdG9yeQorIyMKKyMjICQoMSk6IHBhdGggbGlzdCB0byB2YWxpZGF0ZQorZGVmaW5lIHRyeS12YWxpZGF0ZS1wYXRocy1hcmUtc3ViZGlycworJChzdHJpcCBcCisgICQoZm9yZWFjaCBteV9wYXRoLCQoMSksXAorICAgICQoY2FsbCB0cnktdmFsaWRhdGUtcGF0aC1pcy1zdWJkaXIsJChteV9wYXRoKSlcCisgICkKKykKK2VuZGVmCisKK2RlZmluZSB2YWxpZGF0ZS1wYXRocy1hcmUtc3ViZGlycworJChpZiAkKGNhbGwgdHJ5LXZhbGlkYXRlLXBhdGhzLWFyZS1zdWJkaXJzLCQoMSkpLAorICAgICQoY2FsbCBwcmV0dHktZXJyb3IsSWxsZWdhbCBwYXRoczpcJyQoY2FsbCB0cnktdmFsaWRhdGUtcGF0aHMtYXJlLXN1YmRpcnMsJCgxKSlcJykKKykKK2VuZGVmCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyBUZXN0cyBvZiB0cnktdmFsaWRhdGUtcGF0aC1pcy1zdWJkaXIKKyMjICAgICBhbmQgIHRyeS12YWxpZGF0ZS1wYXRocy1hcmUtc3ViZGlycworZGVmaW5lIHRlc3QtdmFsaWRhdGUtcGF0aHMtYXJlLXN1YmRpcnMKKyQoZXZhbCBteV9lcnJvciA6PSAkKGNhbGwgdHJ5LXZhbGlkYXRlLXBhdGgtaXMtc3ViZGlyLC90bXApKSBcCiskKGlmICQoY2FsbCBzdHJlcSwkKG15X2Vycm9yKSwvdG1wIHN0YXJ0cyB3aXRoIGEgc2xhc2gpLAorLAorICAkKGVycm9yIGluY29ycmVjdCBlcnJvciBtZXNzYWdlIGZvciBwYXRoIC90bXAuIEdvdCAnJChteV9lcnJvciknKQorKSBcCiskKGV2YWwgbXlfZXJyb3IgOj0gJChjYWxsIHRyeS12YWxpZGF0ZS1wYXRoLWlzLXN1YmRpciwuLi9zaWJsaW5nKSkgXAorJChpZiAkKGNhbGwgc3RyZXEsJChteV9lcnJvciksLi4vc2libGluZyBlc2NhcGVzIGl0cyBwYXJlbnQgdXNpbmcgJy4uJyksCissCisgICQoZXJyb3IgaW5jb3JyZWN0IGVycm9yIG1lc3NhZ2UgZm9yIHBhdGggLi4vc2libGluZy4gR290ICckKG15X2Vycm9yKScpCispIFwKKyQoZXZhbCBteV9lcnJvciA6PSAkKGNhbGwgdHJ5LXZhbGlkYXRlLXBhdGgtaXMtc3ViZGlyLGNoaWxkLy4uLy4uL3NpYmxpbmcpKSBcCiskKGlmICQoY2FsbCBzdHJlcSwkKG15X2Vycm9yKSxjaGlsZC8uLi8uLi9zaWJsaW5nIGVzY2FwZXMgaXRzIHBhcmVudCB1c2luZyAnLi4nKSwKKywKKyAgJChlcnJvciBpbmNvcnJlY3QgZXJyb3IgbWVzc2FnZSBmb3IgcGF0aCBjaGlsZC8uLi8uLi9zaWJsaW5nLiBHb3QgJyQobXlfZXJyb3IpJykKKykgXAorJChldmFsIG15X2Vycm9yIDo9ICQoY2FsbCB0cnktdmFsaWRhdGUtcGF0aC1pcy1zdWJkaXIsKSkgXAorJChpZiAkKGNhbGwgc3RyZXEsJChteV9lcnJvciksJycgaXMgZW1wdHkpLAorLAorICAkKGVycm9yIGluY29ycmVjdCBlcnJvciBtZXNzYWdlIGZvciBlbXB0eSBwYXRoICcnLiBHb3QgJyQobXlfZXJyb3IpJykKKykgXAorJChldmFsIG15X2Vycm9yIDo9ICQoY2FsbCB0cnktdmFsaWRhdGUtcGF0aC1pcy1zdWJkaXIsc3ViZGlyL3N1YnN1YmRpcikpIFwKKyQoaWYgJChjYWxsIHN0cmVxLCQobXlfZXJyb3IpLCksCissCisgICQoZXJyb3IgcmVqZWN0ZWQgdmFsaWQgcGF0aCAnc3ViZGlyL3N1YnN1YmRpcicuIEdvdCAnJChteV9lcnJvciknKQorKQorCiskKGV2YWwgbXlfZXJyb3IgOj0gJChjYWxsIHRyeS12YWxpZGF0ZS1wYXRocy1hcmUtc3ViZGlycyxhL2IgL2MvZCBlL2YpKQorJChpZiAkKGNhbGwgc3RyZXEsJChteV9lcnJvciksL2MvZCBzdGFydHMgd2l0aCBhIHNsYXNoKSwKKywKKyAgJChlcnJvciBpbmNvcnJlY3QgZXJyb3IgbWVzc2FnZSBmb3IgcGF0aCBsaXN0ICdhL2IgL2MvZCBlL2YnLiBHb3QgJyQobXlfZXJyb3IpJykKKykKKyQoZXZhbCBteV9lcnJvciA6PSAkKGNhbGwgdHJ5LXZhbGlkYXRlLXBhdGhzLWFyZS1zdWJkaXJzLGEvYiBjL2QpKQorJChpZiAkKGNhbGwgc3RyZXEsJChteV9lcnJvciksKSwKKywKKyAgJChlcnJvciByZWplY3RlZCB2YWxpZCBwYXRoIGxpc3QgJ2EvYiBjL2QnLiBHb3QgJyQobXlfZXJyb3IpJykKKykKK2VuZGVmCisjIHJ1biB0ZXN0CiskKHN0cmlwICQoY2FsbCB0ZXN0LXZhbGlkYXRlLXBhdGhzLWFyZS1zdWJkaXJzKSkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIFZhbGlkYXRlIGphY29jbyBjbGFzcyBmaWx0ZXJzIGFuZCBjb252ZXJ0IHRoZW0gdG8KKyMjIGZpbGUgYXJndW1lbnRzCisjIyBKYWNvY28gY2xhc3MgZmlsdGVycyBhcmUgY29tbWEtc2VwYXJhdGVkIGxpc3RzIG9mIGNsYXNzCisjIyBmaWxlcyAoYW5kcm9pZC5hcHAuQXBwbGljYXRpb24pLCBhbmQgbWF5IGhhdmUgJyonIGFzIHRoZQorIyMgbGFzdCBjaGFyYWN0ZXIgdG8gbWF0Y2ggYWxsIGNsYXNzZXMgaW4gYSBwYWNrYWdlCisjIyBpbmNsdWRpbmcgc3VicGFja2FnZXMuCitkZWZpbmUgamFjb2NvLWNsYXNzLWZpbHRlci10by1maWxlLWFyZ3MKKyQoc3RyaXAgJChjYWxsIGphY29jby12YWxpZGF0ZS1maWxlLWFyZ3MsXAorICAkKHN1YnN0ICQoY29tbWEpLCQoc3BhY2UpLFwKKyAgICAkKHN1YnN0IC4sLyxcCisgICAgICAkKHN0cmlwICQoMSkpKSkpKQorZW5kZWYKKworZGVmaW5lIGphY29jby12YWxpZGF0ZS1maWxlLWFyZ3MKKyQoc3RyaXAgJCgxKVwKKyAgJChjYWxsIHZhbGlkYXRlLXBhdGhzLWFyZS1zdWJkaXJzLCQoMSkpCisgICQoZm9yZWFjaCBhcmcsJCgxKSxcCisgICAgJChpZiAkKGZpbmRzdHJpbmcgPywkKGFyZykpLCQoY2FsbCBwcmV0dHktZXJyb3IsXAorICAgICAgJz8nIGZpbHRlcnMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gTE9DQUxfSkFDS19DT1ZFUkFHRV9JTkNMVURFX0ZJTFRFUiBvciBMT0NBTF9KQUNLX0NPVkVSQUdFX0VYQ0xVREVfRklMVEVSKSlcCisgICAgJChpZiAkKGZpbmRzdHJpbmcgKiwkKHBhdHN1YnN0ICUqLCUsJChhcmcpKSksJChjYWxsIHByZXR0eS1lcnJvcixcCisgICAgICAnKicgaXMgb25seSBzdXBwb3J0ZWQgYXQgdGhlIGVuZCBvZiBhIGZpbHRlciBpbiBMT0NBTF9KQUNLX0NPVkVSQUdFX0lOQ0xVREVfRklMVEVSIG9yIExPQ0FMX0pBQ0tfQ09WRVJBR0VfRVhDTFVERV9GSUxURVIpKVwKKyAgKSkKK2VuZGVmCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAjIyBPdGhlciBpbmNsdWRlcwogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIApAQCAtMzQwOSwzICszNDMxLDQzIEBACiAgICQoZXZhbCBBTExfTU9EVUxFUy4kKGVuZm9yY2VfcnJvX3NvdXJjZV9tb2R1bGUpLlJFUVVJUkVEICs9ICQoZW5mb3JjZV9ycm9fbW9kdWxlKSkgXAogKQogZW5kZWYKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIEZpbmQgc3lzdGVtXyQoVkVSKSBpbiBMT0NBTF9TREtfVkVSU0lPTgorIyMKKyMjICQoMSk6IExPQ0FMX1NES19WRVJTSU9OCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworZGVmaW5lIGhhcy1zeXN0ZW0tc2RrLXZlcnNpb24KKyQoZmlsdGVyIHN5c3RlbV8lLCQoMSkpCitlbmRlZgorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMgR2V0IG51bWVyaWNhbCB2ZXJzaW9uIGluIExPQ0FMX1NES19WRVJTSU9OCisjIworIyMgJCgxKTogTE9DQUxfU0RLX1ZFUlNJT04KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitkZWZpbmUgZ2V0LW51bWVyaWMtc2RrLXZlcnNpb24KKyQoZmlsdGVyLW91dCBjdXJyZW50LFwKKyAgJChpZiAkKGNhbGwgaGFzLXN5c3RlbS1zZGstdmVyc2lvbiwkKDEpKSwkKHBhdHN1YnN0IHN5c3RlbV8lLCUsJCgxKSksJCgxKSkpCitlbmRlZgorCisjIENvbnZlcnQgdG8gbG93ZXIgY2FzZSB3aXRob3V0IHJlcXVpcmluZyBhIHNoZWxsLCB3aGljaCBpc24ndCBjYWNoZWFibGUuCit0by1sb3dlcj0kKHN1YnN0IEEsYSwkKHN1YnN0IEIsYiwkKHN1YnN0IEMsYywkKHN1YnN0IEQsZCwkKHN1YnN0IEUsZSwkKHN1YnN0IEYsZiwkKHN1YnN0IEcsZywkKHN1YnN0IEgsaCwkKHN1YnN0IEksaSwkKHN1YnN0IEosaiwkKHN1YnN0IEssaywkKHN1YnN0IEwsbCwkKHN1YnN0IE0sbSwkKHN1YnN0IE4sbiwkKHN1YnN0IE8sbywkKHN1YnN0IFAscCwkKHN1YnN0IFEscSwkKHN1YnN0IFIsciwkKHN1YnN0IFMscywkKHN1YnN0IFQsdCwkKHN1YnN0IFUsdSwkKHN1YnN0IFYsdiwkKHN1YnN0IFcsdywkKHN1YnN0IFgseCwkKHN1YnN0IFkseSwkKHN1YnN0IFoseiwkMSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpCisKKyMgQ29udmVydCB0byB1cHBlciBjYXNlIHdpdGhvdXQgcmVxdWlyaW5nIGEgc2hlbGwsIHdoaWNoIGlzbid0IGNhY2hlYWJsZS4KK3RvLXVwcGVyPSQoc3Vic3QgYSxBLCQoc3Vic3QgYixCLCQoc3Vic3QgYyxDLCQoc3Vic3QgZCxELCQoc3Vic3QgZSxFLCQoc3Vic3QgZixGLCQoc3Vic3QgZyxHLCQoc3Vic3QgaCxILCQoc3Vic3QgaSxJLCQoc3Vic3QgaixKLCQoc3Vic3QgayxLLCQoc3Vic3QgbCxMLCQoc3Vic3QgbSxNLCQoc3Vic3QgbixOLCQoc3Vic3QgbyxPLCQoc3Vic3QgcCxQLCQoc3Vic3QgcSxRLCQoc3Vic3QgcixSLCQoc3Vic3QgcyxTLCQoc3Vic3QgdCxULCQoc3Vic3QgdSxVLCQoc3Vic3QgdixWLCQoc3Vic3QgdyxXLCQoc3Vic3QgeCxYLCQoc3Vic3QgeSxZLCQoc3Vic3QgeixaLCQxKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkKKworIyBTYW5pdHktY2hlY2sgdG8tbG93ZXIgYW5kIHRvLXVwcGVyCitsb3dlciA6PSBhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei1fCit1cHBlciA6PSBBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWi1fCisKK2lmbmVxICgkKGxvd2VyKSwkKGNhbGwgdG8tbG93ZXIsJCh1cHBlcikpKQorICAkKGVycm9yIHRvLWxvd2VyIHNhbml0eSBjaGVjayBmYWlsdXJlKQorZW5kaWYKKworaWZuZXEgKCQodXBwZXIpLCQoY2FsbCB0by11cHBlciwkKGxvd2VyKSkpCisgICQoZXJyb3IgdG8tdXBwZXIgc2FuaXR5IGNoZWNrIGZhaWx1cmUpCitlbmRpZgorCitsb3dlciA6PQordXBwZXIgOj0KZGlmZiAtLWdpdCBhL2NvcmUvZGV4X3ByZW9wdC5tayBiL2NvcmUvZGV4X3ByZW9wdC5tawppbmRleCA4ZTQ5NmE3Li43Mjk4YmRlIDEwMDY0NAotLS0gYS9jb3JlL2RleF9wcmVvcHQubWsKKysrIGIvY29yZS9kZXhfcHJlb3B0Lm1rCkBAIC0yNCwzNCArMjQsNDIgQEAKIFNZU1RFTV9PVEhFUl9PREVYX0ZJTFRFUiA/PSBhcHAvJSBwcml2LWFwcC8lCiAKICMgTWV0aG9kIHJldHVybmluZyB3aGV0aGVyIHRoZSBpbnN0YWxsIHBhdGggJCgxKSBzaG91bGQgYmUgZm9yIHN5c3RlbV9vdGhlci4KKyMgVW5kZXIgU0FOSVRJWkVfTElURSwgd2UgZG8gbm90IHdhbnQgc3lzdGVtX290aGVyLiBKdXN0IHB1dCB0aGluZ3MgdW5kZXIgL2RhdGEvYXNhbi4KK2lmZXEgKCQoU0FOSVRJWkVfTElURSksdHJ1ZSkKK2luc3RhbGwtb24tc3lzdGVtLW90aGVyID0KK2Vsc2UKIGluc3RhbGwtb24tc3lzdGVtLW90aGVyID0gJChmaWx0ZXItb3V0ICQoUFJPRFVDVF9ERVhQUkVPUFRfU1BFRURfQVBQUykgJChQUk9EVUNUX1NZU1RFTV9TRVJWRVJfQVBQUyksJChiYXNlbmFtZSAkKG5vdGRpciAkKGZpbHRlciAkKGZvcmVhY2ggZiwkKFNZU1RFTV9PVEhFUl9PREVYX0ZJTFRFUiksJChUQVJHRVRfT1VUKS8kKGYpKSwkKDEpKSkpKQorZW5kaWYKIAogIyBUaGUgZGVmYXVsdCB2YWx1ZXMgZm9yIHByZS1vcHRpbmc6IGFsd2F5cyBwcmVvcHQgUElDLgogIyBDb25kaXRpb25hbCB0byBidWlsZGluZyBvbiBsaW51eCwgYXMgZGV4Mm9hdCBjdXJyZW50bHkgZG9lcyBub3Qgd29yayBvbiBkYXJ3aW4uCiBpZmVxICgkKEhPU1RfT1MpLGxpbnV4KQogICBXSVRIX0RFWFBSRU9QVCA/PSB0cnVlCi0jIEZvciBhbiBlbmcgYnVpbGQgb25seSBwcmUtb3B0IHRoZSBib290IGltYWdlIGFuZCBzeXN0ZW0gc2VydmVyLiBUaGlzIGdpdmVzIHJlYXNvbmFibGUgcGVyZm9ybWFuY2UKLSMgYW5kIHN0aWxsIGFsbG93cyBhIHNpbXBsZSB3b3JrZmxvdzogYnVpbGRpbmcgaW4gZnJhbWV3b3Jrcy9iYXNlIGFuZCBzeW5jaW5nLgogICBpZmVxIChlbmcsJChUQVJHRVRfQlVJTERfVkFSSUFOVCkpCisgICAgIyBEb24ndCBzdHJpcCBmb3IgcXVpY2sgZGV2ZWxvcG1lbnQgdHVybmFyb3VuZHMuCisgICAgREVYX1BSRU9QVF9ERUZBVUxUIDo9IG5vc3RyaXBwaW5nCisgICAgIyBGb3IgYW4gZW5nIGJ1aWxkIG9ubHkgcHJlLW9wdCB0aGUgYm9vdCBpbWFnZSBhbmQgc3lzdGVtIHNlcnZlci4gVGhpcyBnaXZlcyByZWFzb25hYmxlIHBlcmZvcm1hbmNlCisgICAgIyBhbmQgc3RpbGwgYWxsb3dzIGEgc2ltcGxlIHdvcmtmbG93OiBidWlsZGluZyBpbiBmcmFtZXdvcmtzL2Jhc2UgYW5kIHN5bmNpbmcuCiAgICAgV0lUSF9ERVhQUkVPUFRfQk9PVF9JTUdfQU5EX1NZU1RFTV9TRVJWRVJfT05MWSA/PSB0cnVlCiAgIGVuZGlmCi0jIEFkZCBtaW5pLWRlYnVnLWluZm8gdG8gdGhlIGJvb3QgY2xhc3NwYXRoIHVubGVzcyBleHBsaWNpdGx5IGFza2VkIG5vdCB0by4KKyAgIyBBZGQgbWluaS1kZWJ1Zy1pbmZvIHRvIHRoZSBib290IGNsYXNzcGF0aCB1bmxlc3MgZXhwbGljaXRseSBhc2tlZCBub3QgdG8uCiAgIGlmbmVxIChmYWxzZSwkKFdJVEhfREVYUFJFT1BUX0RFQlVHX0lORk8pKQogICAgIFBST0RVQ1RfREVYX1BSRU9QVF9CT09UX0ZMQUdTICs9IC0tZ2VuZXJhdGUtbWluaS1kZWJ1Zy1pbmZvCiAgIGVuZGlmCisKKyAgIyBOb24gZW5nIGxpbnV4IGJ1aWxkcyBtdXN0IGhhdmUgcHJlb3B0IGVuYWJsZWQgc28gdGhhdCBzeXN0ZW0gc2VydmVyIGRvZXNuJ3QgcnVuIGFzIGludGVycHJldGVyCisgICMgb25seS4gYi83NDIwOTMyOQorICBpZmVxICgsJChmaWx0ZXIgZW5nLCAkKFRBUkdFVF9CVUlMRF9WQVJJQU5UKSkpCisgICAgaWZuZXEgKHRydWUsJChXSVRIX0RFWFBSRU9QVCkpCisgICAgICBpZm5lcSAodHJ1ZSwkKFdJVEhfREVYUFJFT1BUX0JPT1RfSU1HX0FORF9TWVNURU1fU0VSVkVSX09OTFkpKQorICAgICAgICAkKGNhbGwgcHJldHR5LWVycm9yLCBERVhQUkVPUFQgbXVzdCBiZSBlbmFibGVkIGZvciB1c2VyIGFuZCB1c2VyZGVidWcgYnVpbGRzKQorICAgICAgZW5kaWYKKyAgICBlbmRpZgorICBlbmRpZgogZW5kaWYKIAogR0xPQkFMX0RFWFBSRU9QVF9GTEFHUyA6PQogCi0jICQoMSk6IHRoZSAuamFyIG9yIC5hcGsgdG8gcmVtb3ZlIGNsYXNzZXMuZGV4Ci1kZWZpbmUgZGV4cHJlb3B0LXJlbW92ZS1jbGFzc2VzLmRleAotJChoaWRlKSB6aXAgLS1xdWlldCAtLWRlbGV0ZSAkKDEpIGNsYXNzZXMuZGV4OyBcCi1kZXhfaW5kZXg9MjsgXAotd2hpbGUgemlwIC0tcXVpZXQgLS1kZWxldGUgJCgxKSBjbGFzc2VzJCR7ZGV4X2luZGV4fS5kZXggPiAvZGV2L251bGw7IGRvIFwKLSAgbGV0IGRleF9pbmRleD1kZXhfaW5kZXgrMTsgXAotZG9uZQotZW5kZWYKLQogIyBTcGVjaWFsIHJ1bGVzIGZvciBidWlsZGluZyBzdHJpcHBlZCBib290IGphcnMgdGhhdCBvdmVycmlkZSBqYXZhX2xpYnJhcnkubWsgcnVsZXMKIAogIyAkKDEpOiBib290IGphciBtb2R1bGUgbmFtZQpAQCAtNTksMTEgKzY3LDcgQEAKIF9kYmpfamFyX25vX2RleCA6PSAkKERFWFBSRU9QVF9CT09UX0pBUl9ESVJfRlVMTF9QQVRIKS8kKDEpX25vZGV4LmphcgogX2Rial9zcmNfamFyIDo9ICQoY2FsbCBpbnRlcm1lZGlhdGVzLWRpci1mb3IsSkFWQV9MSUJSQVJJRVMsJCgxKSwsQ09NTU9OKS9qYXZhbGliLmphcgogCi0kJChfZGJqX2phcl9ub19kZXgpIDogJCQoX2Rial9zcmNfamFyKQotCSQkKGNhbGwgY29weS1maWxlLXRvLXRhcmdldCkKLWlmbmVxICgkKERFWF9QUkVPUFRfREVGQVVMVCksbm9zdHJpcHBpbmcpCi0JJCQoY2FsbCBkZXhwcmVvcHQtcmVtb3ZlLWNsYXNzZXMuZGV4LCQkQCkKLWVuZGlmCiskKGNhbGwgZGV4cHJlb3B0LWNvcHktamFyLCQkKF9kYmpfc3JjX2phciksJCQoX2Rial9qYXJfbm9fZGV4KSwkKERFWF9QUkVPUFRfREVGQVVMVCkpCiAKIF9kYmpfamFyX25vX2RleCA6PQogX2Rial9zcmNfamFyIDo9CkBAIC04NSwzICs4OSwyMCBAQAogaWZkZWYgVEFSR0VUXzJORF9BUkNICiAkKFRBUkdFVF8yTkRfQVJDSF9WQVJfUFJFRklYKURFWFBSRU9QVF9PTkVfRklMRV9ERVBFTkRFTkNZX0JVSUxUX0JPT1RfUFJFT1BUIDo9ICQoJChUQVJHRVRfMk5EX0FSQ0hfVkFSX1BSRUZJWClERUZBVUxUX0RFWF9QUkVPUFRfQlVJTFRfSU1BR0VfRklMRU5BTUUpCiBlbmRpZiAgIyBUQVJHRVRfMk5EX0FSQ0gKKworaWZlcSAoJChQUk9EVUNUX0RJU1RfQk9PVF9BTkRfU1lTVEVNX0pBUlMpLHRydWUpCitib290X3Byb2ZpbGVfamFyc196aXAgOj0gJChQUk9EVUNUX09VVCkvYm9vdF9wcm9maWxlX2phcnMuemlwCithbGxfYm9vdF9qYXJzIDo9IFwKKyAgJChmb3JlYWNoIG0sJChERVhQUkVPUFRfQk9PVF9KQVJTX01PRFVMRVMpLCQoUFJPRFVDVF9PVVQpL3N5c3RlbS9mcmFtZXdvcmsvJChtKS5qYXIpIFwKKyAgJChmb3JlYWNoIG0sJChQUk9EVUNUX1NZU1RFTV9TRVJWRVJfSkFSUyksJChQUk9EVUNUX09VVCkvc3lzdGVtL2ZyYW1ld29yay8kKG0pLmphcikKKworJChib290X3Byb2ZpbGVfamFyc196aXApOiBQUklWQVRFX0pBUlMgOj0gJChhbGxfYm9vdF9qYXJzKQorJChib290X3Byb2ZpbGVfamFyc196aXApOiAkKGFsbF9ib290X2phcnMpICQoU09PTkdfWklQKQorCWVjaG8gIkNyZWF0ZSBib290IHByb2ZpbGVzIHBhY2thZ2U6ICRAIgorCXJtIC1mICRACisJJChTT09OR19aSVApIC1vICRAIC1DICQoUFJPRFVDVF9PVVQpICQoUFJJVkFURV9KQVJTKQorCitkcm9pZGNvcmU6ICQoYm9vdF9wcm9maWxlX2phcnNfemlwKQorCiskKGNhbGwgZGlzdC1mb3ItZ29hbHMsIGRyb2lkY29yZSwgJChib290X3Byb2ZpbGVfamFyc196aXApKQorZW5kaWYKZGlmZiAtLWdpdCBhL2NvcmUvZGV4X3ByZW9wdF9saWJhcnQubWsgYi9jb3JlL2RleF9wcmVvcHRfbGliYXJ0Lm1rCmluZGV4IDk2MTYwMzYuLjljNGQ1NWQgMTAwNjQ0Ci0tLSBhL2NvcmUvZGV4X3ByZW9wdF9saWJhcnQubWsKKysrIGIvY29yZS9kZXhfcHJlb3B0X2xpYmFydC5tawpAQCAtNywxNSArNywxNCBAQAogIyBTZXQgVVNFX0RFWDJPQVRfREVCVUcgdG8gZmFsc2UgZm9yIG9ubHkgYnVpbGRpbmcgbm9uLWRlYnVnIHZlcnNpb25zLgogaWZlcSAoJChVU0VfREVYMk9BVF9ERUJVRyksZmFsc2UpCiBERVgyT0FUIDo9ICQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL2RleDJvYXQkKEhPU1RfRVhFQ1VUQUJMRV9TVUZGSVgpCitQQVRDSE9BVCA6PSAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9wYXRjaG9hdCQoSE9TVF9FWEVDVVRBQkxFX1NVRkZJWCkKIGVsc2UKIERFWDJPQVQgOj0gJChIT1NUX09VVF9FWEVDVVRBQkxFUykvZGV4Mm9hdGQkKEhPU1RfRVhFQ1VUQUJMRV9TVUZGSVgpCitQQVRDSE9BVCA6PSAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9wYXRjaG9hdGQkKEhPU1RfRVhFQ1VUQUJMRV9TVUZGSVgpCiBlbmRpZgogCi0jIFBhc3Mgc3BlY2lhbCBjbGFzcyBsb2FkZXIgY29udGV4dCB0byBza2lwIHRoZSBjbGFzc3BhdGggYW5kIGNvbGxpc2lvbiBjaGVjay4KLSMgU2hvdWxkIG1vZGlmeSBidWlsZCBzeXN0ZW0gdG8gcGFzcyB1c2VkIGxpYnJhcmllcyBwcm9wZXJseSBsYXRlci4KLURFWDJPQVRfQ0xBU1NfTE9BREVSX0NPTlRFWFQgOj0gIiYiCi0KIERFWDJPQVRfREVQRU5ERU5DWSArPSAkKERFWDJPQVQpCitQQVRDSE9BVF9ERVBFTkRFTkNZICs9ICQoUEFUQ0hPQVQpCiAKICMgVXNlIHRoZSBmaXJzdCBwcmVsb2FkZWQtY2xhc3NlcyBmaWxlIGluIFBST0RVQ1RfQ09QWV9GSUxFUy4KIFBSRUxPQURFRF9DTEFTU0VTIDo9ICQoY2FsbCB3b3JkLWNvbG9uLDEsJChmaXJzdHdvcmQgXApAQCAtMzAsNyArMjksOSBAQAogICAgICQoZmlsdGVyICVzeXN0ZW0vZXRjL2RpcnR5LWltYWdlLW9iamVjdHMsJChQUk9EVUNUX0NPUFlfRklMRVMpKSkpCiAKIGRlZmluZSBnZXQtcHJvZHVjdC1kZWZhdWx0LXByb3BlcnR5Ci0kKHN0cmlwICQocGF0c3Vic3QgJCgxKT0lLCUsJChmaWx0ZXIgJCgxKT0lLCQoUFJPRFVDVF9ERUZBVUxUX1BST1BFUlRZX09WRVJSSURFUykpKSkKKyQoc3RyaXAgXAorICAkKGV2YWwgX3Byb3AgOj0gJChwYXRzdWJzdCAkKDEpPSUsJSwkKGZpbHRlciAkKDEpPSUsJChQUk9EVUNUX0RFRkFVTFRfUFJPUEVSVFlfT1ZFUlJJREVTKSkpKVwKKyAgJChpZiAkKF9wcm9wKSwkKF9wcm9wKSwkKHBhdHN1YnN0ICQoMSk9JSwlLCQoZmlsdGVyICQoMSk9JSwkKFBST0RVQ1RfU1lTVEVNX0RFRkFVTFRfUFJPUEVSVElFUykpKSkpCiBlbmRlZgogCiBERVgyT0FUX0lNQUdFX1hNUyA6PSAkKGNhbGwgZ2V0LXByb2R1Y3QtZGVmYXVsdC1wcm9wZXJ0eSxkYWx2aWsudm0uaW1hZ2UtZGV4Mm9hdC1YbXMpCkBAIC04OSwxNCArOTAsMTkgQEAKICMgaXMgY29udmVydGVkIGludG8gdG8gYm9vdC5hcnQgKHRvIG1hdGNoIHRoZSBsZWdhY3kgYXNzdW1wdGlvbiB0aGF0IGJvb3QuYXJ0CiAjIGV4aXN0cyksIGFuZCB0aGUgcmVzdCBhcmUgY29udmVydGVkIHRvIGJvb3QtPG5hbWU+LmFydC4KICMgSW4gYWRkaXRpb24sIGVhY2ggLmFydCBmaWxlIGhhcyBhbiBhc3NvY2lhdGVkIC5vYXQgZmlsZS4KLUxJQkFSVF9UQVJHRVRfQk9PVF9BUlRfRVhUUkFfRklMRVMgOj0gJChmb3JlYWNoIGphciwkKHdvcmRsaXN0IDIsOTk5LCQoTElCQVJUX1RBUkdFVF9CT09UX0pBUlMpKSxib290LSQoamFyKS5hcnQgYm9vdC0kKGphcikub2F0IGJvb3QtJChqYXIpLnZkZXgpCi1MSUJBUlRfVEFSR0VUX0JPT1RfQVJUX0VYVFJBX0ZJTEVTICs9IGJvb3Qub2F0IGJvb3QudmRleAorTElCQVJUX1RBUkdFVF9CT09UX0FSVF9FWFRSQV9GSUxFUyA6PSAkKGZvcmVhY2ggamFyLCQod29yZGxpc3QgMiw5OTksJChMSUJBUlRfVEFSR0VUX0JPT1RfSkFSUykpLGJvb3QtJChqYXIpLmFydCBib290LSQoamFyKS5hcnQucmVsIGJvb3QtJChqYXIpLm9hdCkKK0xJQkFSVF9UQVJHRVRfQk9PVF9BUlRfRVhUUkFfRklMRVMgKz0gYm9vdC5hcnQucmVsIGJvb3Qub2F0CitMSUJBUlRfVEFSR0VUX0JPT1RfQVJUX1ZERVhfRklMRVMgOj0gJChmb3JlYWNoIGphciwkKHdvcmRsaXN0IDIsOTk5LCQoTElCQVJUX1RBUkdFVF9CT09UX0pBUlMpKSxib290LSQoamFyKS52ZGV4KQorTElCQVJUX1RBUkdFVF9CT09UX0FSVF9WREVYX0ZJTEVTICs9IGJvb3QudmRleAogCiAjIElmIHdlIHVzZSBhIGJvb3QgaW1hZ2UgcHJvZmlsZS4KIG15X3VzZV9wcm9maWxlX2Zvcl9ib290X2ltYWdlIDo9ICQoUFJPRFVDVF9VU0VfUFJPRklMRV9GT1JfQk9PVF9JTUFHRSkKIGlmZXEgKCwkKG15X3VzZV9wcm9maWxlX2Zvcl9ib290X2ltYWdlKSkKLSMgSWYgbm90IHNldCwgdXNlIHRoZSBkZWZhdWx0LgotbXlfdXNlX3Byb2ZpbGVfZm9yX2Jvb3RfaW1hZ2UgOj0gZmFsc2UKKyMgSWYgbm90IHNldCwgc2V0IHRoZSBkZWZhdWx0IHRvIHRydWUgaWYgd2UgYXJlIG5vdCBhIFBESyBidWlsZC4gUERLIGJ1aWxkcworIyBjYW4ndCBidWlsZCB0aGUgcHJvZmlsZSBzaW5jZSB0aGV5IGRvbid0IGhhdmUgZnJhbWV3b3Jrcy9iYXNlLgoraWZuZXEgKHRydWUsJChUQVJHRVRfQlVJTERfUERLKSkKK215X3VzZV9wcm9maWxlX2Zvcl9ib290X2ltYWdlIDo9IHRydWUKK2VuZGlmCiBlbmRpZgogCiBpZmVxICh0cnVlLCQobXlfdXNlX3Byb2ZpbGVfZm9yX2Jvb3RfaW1hZ2UpKQpAQCAtMTI4LDYgKzEzNCw4IEBACiAKIGVuZGlmCiAKK0xJQkFSVF9UQVJHRVRfQk9PVF9BUlRfVkRFWF9JTlNUQUxMRURfU0hBUkVEX0ZJTEVTIDo9ICQoYWRkcHJlZml4ICQoUFJPRFVDVF9PVVQpLyQoREVYUFJFT1BUX0JPT1RfSkFSX0RJUikvLCQoTElCQVJUX1RBUkdFVF9CT09UX0FSVF9WREVYX0ZJTEVTKSkKKwogbXlfMm5kX2FyY2hfcHJlZml4IDo9CiBpbmNsdWRlICQoQlVJTERfU1lTVEVNKS9kZXhfcHJlb3B0X2xpYmFydF9ib290Lm1rCiAKQEAgLTEzNSwyMiArMTQzLDUwIEBACiBpZmRlZiBUQVJHRVRfMk5EX0FSQ0gKIG15XzJuZF9hcmNoX3ByZWZpeCA6PSAkKFRBUkdFVF8yTkRfQVJDSF9WQVJfUFJFRklYKQogaW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvZGV4X3ByZW9wdF9saWJhcnRfYm9vdC5tawotbXlfMm5kX2FyY2hfcHJlZml4IDo9CiBlbmRpZgogZW5kaWYKIAorIyBDb3B5IHNoYXJlZCB2ZGV4IHRvIHRoZSBkaXJlY3RvcnkgYW5kIGNyZWF0ZSBjb3JyZXNwb25kaW5nIHN5bWxpbmtzIGluIHByaW1hcnkgYW5kIHNlY29uZGFyeSBhcmNoLgorJChMSUJBUlRfVEFSR0VUX0JPT1RfQVJUX1ZERVhfSU5TVEFMTEVEX1NIQVJFRF9GSUxFUykgOiBQUklNQVJZX0FSQ0hfRElSIDo9ICQoZGlyICQoREVGQVVMVF9ERVhfUFJFT1BUX0lOU1RBTExFRF9JTUFHRSkpCiskKExJQkFSVF9UQVJHRVRfQk9PVF9BUlRfVkRFWF9JTlNUQUxMRURfU0hBUkVEX0ZJTEVTKSA6IFNFQ09ORF9BUkNIX0RJUiA6PSAkKGRpciAkKCQobXlfMm5kX2FyY2hfcHJlZml4KURFRkFVTFRfREVYX1BSRU9QVF9JTlNUQUxMRURfSU1BR0UpKQorJChMSUJBUlRfVEFSR0VUX0JPT1RfQVJUX1ZERVhfSU5TVEFMTEVEX1NIQVJFRF9GSUxFUykgOiAkKERFRkFVTFRfREVYX1BSRU9QVF9CVUlMVF9JTUFHRV9GSUxFTkFNRSkKKwlAZWNobyAiSW5zdGFsbDogJEAiCisJQG1rZGlyIC1wICQoZGlyICRAKQorCUBybSAtZiAkQAorCSQoaGlkZSkgY3AgIiQoZGlyICQ8KSQobm90ZGlyICRAKSIgIiRAIgorCSMgTWFrZSBzeW1saW5rIGZvciBib3RoIHRoZSBhcmNocy4gSW4gdGhlIGNhc2UgaXRzIHNpbmdsZSBhcmNoIHRoZSBzeW1saW5rIHdpbGwganVzdCBnZXQgb3ZlcnJpZGRlbi4KKwlAbWtkaXIgLXAgJChQUklNQVJZX0FSQ0hfRElSKQorCSQoaGlkZSkgbG4gLXNmIC8kKERFWFBSRU9QVF9CT09UX0pBUl9ESVIpLyQobm90ZGlyICRAKSAkKFBSSU1BUllfQVJDSF9ESVIpJChub3RkaXIgJEApCisJQG1rZGlyIC1wICQoU0VDT05EX0FSQ0hfRElSKQorCSQoaGlkZSkgbG4gLXNmIC8kKERFWFBSRU9QVF9CT09UX0pBUl9ESVIpLyQobm90ZGlyICRAKSAkKFNFQ09ORF9BUkNIX0RJUikkKG5vdGRpciAkQCkKKworbXlfMm5kX2FyY2hfcHJlZml4IDo9CiAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIyBGb3IgYSBzaW5nbGUgamFyIG9yIEFQSwogCiAjICQoMSk6IHRoZSBpbnB1dCAuamFyIG9yIC5hcGsgZmlsZQogIyAkKDIpOiB0aGUgb3V0cHV0IC5vZGV4IGZpbGUKKyMgSW4gdGhlIGNhc2Ugd2hlcmUgTE9DQUxfRU5GT1JDRV9VU0VTX0xJQlJBUklFUyBpcyB0cnVlLCBQUklWQVRFX0RFWDJPQVRfQ0xBU1NfTE9BREVSX0NPTlRFWFQKKyMgY29udGFpbnMgdGhlIG5vcm1hbGl6ZWQgcGF0aCBsaXN0IG9mIHRoZSBsaWJyYXJpZXMuIFRoaXMgbWFrZXMgaXQgZWFzaWVyIHRvIGNvbmRpdGlvbmFsbHkgcHJlcGVuZAorIyBvcmcuYXBhY2hlLmh0dHAubGVnYWN5LmJvb3QgYmFzZWQgb24gdGhlIFNESyBsZXZlbCBpZiByZXF1aXJlZC4KIGRlZmluZSBkZXgyb2F0LW9uZS1maWxlCiAkKGhpZGUpIHJtIC1mICQoMikKICQoaGlkZSkgbWtkaXIgLXAgJChkaXIgJCgyKSkKLSQoaGlkZSkgQU5EUk9JRF9MT0dfVEFHUz0iKjplIiAkKERFWDJPQVQpIFwKK3N0b3JlZF9jbGFzc19sb2FkZXJfY29udGV4dF9saWJzPSQoUFJJVkFURV9ERVgyT0FUX1NUT1JFRF9DTEFTU19MT0FERVJfQ09OVEVYVF9MSUJTKSAmJiBcCitjbGFzc19sb2FkZXJfY29udGV4dF9hcmc9LS1jbGFzcy1sb2FkZXItY29udGV4dD0kKFBSSVZBVEVfREVYMk9BVF9DTEFTU19MT0FERVJfQ09OVEVYVCkgJiYgXAorY2xhc3NfbG9hZGVyX2NvbnRleHQ9JChQUklWQVRFX0RFWDJPQVRfQ0xBU1NfTE9BREVSX0NPTlRFWFQpICYmIFwKK3N0b3JlZF9jbGFzc19sb2FkZXJfY29udGV4dF9hcmc9IiIgJiYgXAordXNlc19saWJyYXJ5X25hbWVzPSIkKFBSSVZBVEVfVVNFU19MSUJSQVJZX05BTUVTKSIgJiYgXAorb3B0aW9uYWxfdXNlc19saWJyYXJ5X25hbWVzPSIkKFBSSVZBVEVfT1BUSU9OQUxfVVNFU19MSUJSQVJZX05BTUVTKSIgJiYgXAorJChpZiAkKFBSSVZBVEVfRU5GT1JDRV9VU0VTX0xJQlJBUklFUyksIFwKK3NvdXJjZSBidWlsZC9tYWtlL2NvcmUvdmVyaWZ5X3VzZXNfbGlicmFyaWVzLnNoICIkKDEpIiAmJiBcCitzb3VyY2UgYnVpbGQvbWFrZS9jb3JlL2NvbnN0cnVjdF9jb250ZXh0LnNoICIkKFBSSVZBVEVfQ09ORElUSU9OQUxfVVNFU19MSUJSQVJJRVNfSE9TVCkiICIkKFBSSVZBVEVfQ09ORElUSU9OQUxfVVNFU19MSUJSQVJJRVNfVEFSR0VUKSIgJiYgXAorLCkgXAorQU5EUk9JRF9MT0dfVEFHUz0iKjplIiAkKERFWDJPQVQpIFwKIAktLXJ1bnRpbWUtYXJnIC1YbXMkKERFWDJPQVRfWE1TKSAtLXJ1bnRpbWUtYXJnIC1YbXgkKERFWDJPQVRfWE1YKSBcCi0JLS1jbGFzcy1sb2FkZXItY29udGV4dD0kKERFWDJPQVRfQ0xBU1NfTE9BREVSX0NPTlRFWFQpIFwKKwkkJHtjbGFzc19sb2FkZXJfY29udGV4dF9hcmd9IFwKKwkkJHtzdG9yZWRfY2xhc3NfbG9hZGVyX2NvbnRleHRfYXJnfSBcCiAJLS1ib290LWltYWdlPSQoUFJJVkFURV9ERVhfUFJFT1BUX0lNQUdFX0xPQ0FUSU9OKSBcCiAJLS1kZXgtZmlsZT0kKDEpIFwKIAktLWRleC1sb2NhdGlvbj0kKFBSSVZBVEVfREVYX0xPQ0FUSU9OKSBcCmRpZmYgLS1naXQgYS9jb3JlL2RleF9wcmVvcHRfbGliYXJ0X2Jvb3QubWsgYi9jb3JlL2RleF9wcmVvcHRfbGliYXJ0X2Jvb3QubWsKaW5kZXggZTNlYjllZi4uYTVlN2U4OCAxMDA2NDQKLS0tIGEvY29yZS9kZXhfcHJlb3B0X2xpYmFydF9ib290Lm1rCisrKyBiL2NvcmUvZGV4X3ByZW9wdF9saWJhcnRfYm9vdC5tawpAQCAtMzAsNiArMzAsOCBAQAogJChteV8ybmRfYXJjaF9wcmVmaXgpREVGQVVMVF9ERVhfUFJFT1BUX0lOU1RBTExFRF9JTUFHRSA6PSAkKFBST0RVQ1RfT1VUKSQoJChteV8ybmRfYXJjaF9wcmVmaXgpTElCQVJUX0JPT1RfSU1BR0VfRklMRU5BTUUpCiAkKG15XzJuZF9hcmNoX3ByZWZpeClMSUJBUlRfVEFSR0VUX0JPT1RfQVJUX0VYVFJBX0lOU1RBTExFRF9GSUxFUyA6PSAkKGFkZHByZWZpeCAkKGRpciAkKCQobXlfMm5kX2FyY2hfcHJlZml4KURFRkFVTFRfREVYX1BSRU9QVF9JTlNUQUxMRURfSU1BR0UpKSxcCiAgICAgJChMSUJBUlRfVEFSR0VUX0JPT1RfQVJUX0VYVFJBX0ZJTEVTKSkKKyQobXlfMm5kX2FyY2hfcHJlZml4KUxJQkFSVF9UQVJHRVRfQk9PVF9BUlRfVkRFWF9JTlNUQUxMRURfRklMRVMgOj0gJChhZGRwcmVmaXggJChkaXIgJCgkKG15XzJuZF9hcmNoX3ByZWZpeClERUZBVUxUX0RFWF9QUkVPUFRfSU5TVEFMTEVEX0lNQUdFKSksXAorICAgICQoTElCQVJUX1RBUkdFVF9CT09UX0FSVF9WREVYX0ZJTEVTKSkKIAogIyBJZiB3ZSBoYXZlIGEgY29tcGlsZWQtY2xhc3NlcyBmaWxlLCBjcmVhdGUgYSBwYXJhbWV0ZXIuCiBDT01QSUxFRF9DTEFTU0VTX0ZMQUdTIDo9CkBAIC00NSw3ICs0Nyw3IEBACiAKICMgVGhlIHJ1bGUgdG8gaW5zdGFsbCBib290LmFydAogIyBEZXBlbmRzIG9uIGluc3RhbGxlZCBib290Lm9hdCwgYm9vdC0qLmFydCwgYm9vdC0qLm9hdAotJCgkKG15XzJuZF9hcmNoX3ByZWZpeClERUZBVUxUX0RFWF9QUkVPUFRfSU5TVEFMTEVEX0lNQUdFKSA6ICQoJChteV8ybmRfYXJjaF9wcmVmaXgpREVGQVVMVF9ERVhfUFJFT1BUX0JVSUxUX0lNQUdFX0ZJTEVOQU1FKSB8ICQoQUNQKSAkKCQobXlfMm5kX2FyY2hfcHJlZml4KUxJQkFSVF9UQVJHRVRfQk9PVF9BUlRfRVhUUkFfSU5TVEFMTEVEX0ZJTEVTKQorJCgkKG15XzJuZF9hcmNoX3ByZWZpeClERUZBVUxUX0RFWF9QUkVPUFRfSU5TVEFMTEVEX0lNQUdFKSA6ICQoJChteV8ybmRfYXJjaF9wcmVmaXgpREVGQVVMVF9ERVhfUFJFT1BUX0JVSUxUX0lNQUdFX0ZJTEVOQU1FKSB8ICQoQUNQKSAkKCQobXlfMm5kX2FyY2hfcHJlZml4KUxJQkFSVF9UQVJHRVRfQk9PVF9BUlRfRVhUUkFfSU5TVEFMTEVEX0ZJTEVTKSAkKCQobXlfMm5kX2FyY2hfcHJlZml4KUxJQkFSVF9UQVJHRVRfQk9PVF9BUlRfVkRFWF9JTlNUQUxMRURfU0hBUkVEX0ZJTEVTKQogCUBlY2hvICJJbnN0YWxsOiAkQCIKIAkkKGNvcHktZmlsZS10by10YXJnZXQpCiAKQEAgLTY1LDE3ICs2Nyw0MiBAQAogbXlfYm9vdF9pbWFnZV9mbGFncyArPSAtLXByb2ZpbGUtZmlsZT0kKG15X291dF9ib290X2ltYWdlX3Byb2ZpbGVfbG9jYXRpb24pCiBlbmRpZgogCitpZm5lcSAoYWRkcmVzc3RydWUsJChTQU5JVElaRV9UQVJHRVQpJChTQU5JVElaRV9MSVRFKSkKKyMgU2tpcCByZWNvbXBpbGluZyB0aGUgYm9vdCBpbWFnZSBmb3IgdGhlIHNlY29uZCBzYW5pdGl6YXRpb24gcGhhc2UuIFdlJ2xsIGdldCBzZXBhcmF0ZSBwYXRocworIyBhbmQgaW52YWxpZGF0ZSBmaXJzdC1zdGFnZSBhcnRpZmFjdHMgd2hpY2ggYXJlIGNydWNpYWwgdG8gU0FOSVRJWkVfTElURSBidWlsZHMuCisjIE5vdGU6IHRoaXMgaXMgdGVjaG5pY2FsbHkgaW5jb3JyZWN0LiBDb21waWxlZCBjb2RlIGNvbnRhaW5zIHN0YWNrIGNoZWNrcyB3aGljaCBtYXkgZGVwZW5kCisjICAgICAgIG9uIEFTQU4gc2V0dGluZ3MuCisKKyMgVXNlIEFORFJPSURfTE9HX1RBR1MgdG8gc3VwcHJlc3MgbW9zdCBsb2dnaW5nIGJ5IGRlZmF1bHQuLi4KK2lmZXEgKCwkKEFSVF9CT09UX0lNQUdFX0VYVFJBX0FSR1MpKQorREVYMk9BVF9CT09UX0lNQUdFX0xPR19UQUdTIDo9IEFORFJPSURfTE9HX1RBR1M9Iio6ZSIKK2Vsc2UKKyMgLi4udW5sZXNzIHRoZSBib290IGltYWdlIGlzIGdlbmVyYXRlZCBzcGVjaWZpY2FsbHkgZm9yIHRlc3RpbmcsIHRoZW4gYWxsb3cgYWxsIGxvZ2dpbmcuCitERVgyT0FUX0JPT1RfSU1BR0VfTE9HX1RBR1MgOj0gQU5EUk9JRF9MT0dfVEFHUz0iKjp2IgorZW5kaWYKKworIyBBbiBhZGRpdGlvbmFsIG1lc3NhZ2UgdG8gcHJpbnQgb24gZGV4Mm9hdCBmYWlsdXJlLgorREVYMk9BVF9GQUlMVVJFX01FU1NBR0UgOj0gRVJST1I6IERleDJvYXQgZmFpbGVkIHRvIGNvbXBpbGUgYSBib290IGltYWdlLgorREVYMk9BVF9GQUlMVVJFX01FU1NBR0UgKz0gSXQgaXMgbGlrZWx5IHRoYXQgdGhlIGJvb3QgY2xhc3NwYXRoIGlzIGluY29uc2lzdGVudC4KK2lmZXEgKCQoT05FX1NIT1RfTUFLRUZJTEUpLCkKKyAgREVYMk9BVF9GQUlMVVJFX01FU1NBR0UgKz0gUmVidWlsZCB3aXRoIEFSVF9CT09UX0lNQUdFX0VYVFJBX0FSR1M9Ii0tcnVudGltZS1hcmcgLXZlcmJvc2U6dmVyaWZpZXIiIHRvIHNlZSB2ZXJpZmljYXRpb24gZXJyb3JzLgorZWxzZQorICBERVgyT0FUX0ZBSUxVUkVfTUVTU0FHRSArPSBCdWlsZCB3aXRoIG0sIG1tYSwgb3IgbW1tYSBpbnN0ZWFkIG9mIG1tIG9yIG1tbSB0byByZW1lZHkgdGhlIHNpdHVhdGlvbi4KK2VuZGlmCisKICQoJChteV8ybmRfYXJjaF9wcmVmaXgpREVGQVVMVF9ERVhfUFJFT1BUX0JVSUxUX0lNQUdFX0ZJTEVOQU1FKTogUFJJVkFURV9CT09UX0lNQUdFX0ZMQUdTIDo9ICQobXlfYm9vdF9pbWFnZV9mbGFncykKICQoJChteV8ybmRfYXJjaF9wcmVmaXgpREVGQVVMVF9ERVhfUFJFT1BUX0JVSUxUX0lNQUdFX0ZJTEVOQU1FKTogUFJJVkFURV8yTkRfQVJDSF9WQVJfUFJFRklYIDo9ICQobXlfMm5kX2FyY2hfcHJlZml4KQorJCgkKG15XzJuZF9hcmNoX3ByZWZpeClERUZBVUxUX0RFWF9QUkVPUFRfQlVJTFRfSU1BR0VfRklMRU5BTUUpOiBQUklWQVRFX0lNQUdFX0xPQ0FUSU9OIDo9ICQoJChteV8ybmRfYXJjaF9wcmVmaXgpREVGQVVMVF9ERVhfUFJFT1BUX0JVSUxUX0lNQUdFX0xPQ0FUSU9OKQogIyBVc2UgZGV4Mm9hdCBkZWJ1ZyB2ZXJzaW9uIGZvciBiZXR0ZXIgZXJyb3IgcmVwb3J0aW5nCi0kKCQobXlfMm5kX2FyY2hfcHJlZml4KURFRkFVTFRfREVYX1BSRU9QVF9CVUlMVF9JTUFHRV9GSUxFTkFNRSkgOiAkKExJQkFSVF9UQVJHRVRfQk9PVF9ERVhfRklMRVMpICQoUFJFTE9BREVEX0NMQVNTRVMpICQoQ09NUElMRURfQ0xBU1NFUykgJChESVJUWV9JTUFHRV9PQkpFQ1RTKSAkKERFWDJPQVRfREVQRU5ERU5DWSkgJChteV9vdXRfYm9vdF9pbWFnZV9wcm9maWxlX2xvY2F0aW9uKQorJCgkKG15XzJuZF9hcmNoX3ByZWZpeClERUZBVUxUX0RFWF9QUkVPUFRfQlVJTFRfSU1BR0VfRklMRU5BTUUpIDogJChMSUJBUlRfVEFSR0VUX0JPT1RfREVYX0ZJTEVTKSAkKFBSRUxPQURFRF9DTEFTU0VTKSAkKENPTVBJTEVEX0NMQVNTRVMpICQoRElSVFlfSU1BR0VfT0JKRUNUUykgJChERVgyT0FUX0RFUEVOREVOQ1kpICQoUEFUQ0hPQVRfREVQRU5ERU5DWSkgJChteV9vdXRfYm9vdF9pbWFnZV9wcm9maWxlX2xvY2F0aW9uKQogCUBlY2hvICJ0YXJnZXQgZGV4Mm9hdDogJEAiCiAJQG1rZGlyIC1wICQoZGlyICRAKQogCUBta2RpciAtcCAkKGRpciAkKCQoUFJJVkFURV8yTkRfQVJDSF9WQVJfUFJFRklYKUxJQkFSVF9UQVJHRVRfQk9PVF9PQVRfVU5TVFJJUFBFRCkpCi0JQHJtIC1mICQoZGlyICRAKS8qLmFydCAkKGRpciAkQCkvKi5vYXQKKwlAcm0gLWYgJChkaXIgJEApLyouYXJ0ICQoZGlyICRAKS8qLm9hdCAkKGRpciAkQCkvKi5hcnQucmVsCiAJQHJtIC1mICQoZGlyICQoJChQUklWQVRFXzJORF9BUkNIX1ZBUl9QUkVGSVgpTElCQVJUX1RBUkdFVF9CT09UX09BVF9VTlNUUklQUEVEKSkvKi5hcnQKIAlAcm0gLWYgJChkaXIgJCgkKFBSSVZBVEVfMk5EX0FSQ0hfVkFSX1BSRUZJWClMSUJBUlRfVEFSR0VUX0JPT1RfT0FUX1VOU1RSSVBQRUQpKS8qLm9hdAotCSQoREVYMk9BVCkgLS1ydW50aW1lLWFyZyAtWG1zJChERVgyT0FUX0lNQUdFX1hNUykgXAorCUBybSAtZiAkKGRpciAkKCQoUFJJVkFURV8yTkRfQVJDSF9WQVJfUFJFRklYKUxJQkFSVF9UQVJHRVRfQk9PVF9PQVRfVU5TVFJJUFBFRCkpLyouYXJ0LnJlbAorCSQoaGlkZSkgJChERVgyT0FUX0JPT1RfSU1BR0VfTE9HX1RBR1MpICQoREVYMk9BVCkgLS1ydW50aW1lLWFyZyAtWG1zJChERVgyT0FUX0lNQUdFX1hNUykgXAogCQktLXJ1bnRpbWUtYXJnIC1YbXgkKERFWDJPQVRfSU1BR0VfWE1YKSBcCiAJCSQoUFJJVkFURV9CT09UX0lNQUdFX0ZMQUdTKSBcCiAJCSQoYWRkcHJlZml4IC0tZGV4LWZpbGU9LCQoTElCQVJUX1RBUkdFVF9CT09UX0RFWF9GSUxFUykpIFwKQEAgLTkxLDQgKzExOCwxNCBAQAogCQktLXJ1bnRpbWUtYXJnIC1Ybm9yZWxvY2F0ZSAtLWNvbXBpbGUtcGljIFwKIAkJLS1uby1nZW5lcmF0ZS1kZWJ1Zy1pbmZvIC0tZ2VuZXJhdGUtYnVpbGQtaWQgXAogCQktLW11bHRpLWltYWdlIC0tbm8taW5saW5lLWZyb209Y29yZS1vai5qYXIgXAotCQkkKFBST0RVQ1RfREVYX1BSRU9QVF9CT09UX0ZMQUdTKSAkKEdMT0JBTF9ERVhQUkVPUFRfRkxBR1MpICQoQVJUX0JPT1RfSU1BR0VfRVhUUkFfQVJHUykKKwkJLS1hYm9ydC1vbi1oYXJkLXZlcmlmaWVyLWVycm9yIFwKKwkJLS1hYm9ydC1vbi1zb2Z0LXZlcmlmaWVyLWVycm9yIFwKKwkJJChQUk9EVUNUX0RFWF9QUkVPUFRfQk9PVF9GTEFHUykgJChHTE9CQUxfREVYUFJFT1BUX0ZMQUdTKSAkKEFSVF9CT09UX0lNQUdFX0VYVFJBX0FSR1MpIFwKKwkJfHwgKCBlY2hvICIkKERFWDJPQVRfRkFJTFVSRV9NRVNTQUdFKSIgOyBmYWxzZSApICYmIFwKKwkkKERFWDJPQVRfQk9PVF9JTUFHRV9MT0dfVEFHUykgQU5EUk9JRF9ST09UPSQoUFJPRFVDVF9PVVQpL3N5c3RlbSBBTkRST0lEX0RBVEE9JChkaXIgJEApICQoUEFUQ0hPQVQpIFwKKwkJLS1pbnB1dC1pbWFnZS1sb2NhdGlvbj0kKFBSSVZBVEVfSU1BR0VfTE9DQVRJT04pIFwKKwkJLS1vdXRwdXQtaW1hZ2UtcmVsb2NhdGlvbi1kaXJlY3Rvcnk9JChkaXIgJEApIFwKKwkJLS1pbnN0cnVjdGlvbi1zZXQ9JCgkKFBSSVZBVEVfMk5EX0FSQ0hfVkFSX1BSRUZJWClERVgyT0FUX1RBUkdFVF9BUkNIKSBcCisJCS0tYmFzZS1vZmZzZXQtZGVsdGE9MHgxMDAwMDAwMAorCitlbmRpZgpkaWZmIC0tZ2l0IGEvY29yZS9kZXhfcHJlb3B0X29kZXhfaW5zdGFsbC5tayBiL2NvcmUvZGV4X3ByZW9wdF9vZGV4X2luc3RhbGwubWsKaW5kZXggMjM1ZjRiYy4uY2U5MTc1OSAxMDA2NDQKLS0tIGEvY29yZS9kZXhfcHJlb3B0X29kZXhfaW5zdGFsbC5taworKysgYi9jb3JlL2RleF9wcmVvcHRfb2RleF9pbnN0YWxsLm1rCkBAIC0xLDYgKzEsMjAgQEAKICMgZGV4cHJlb3B0X29kZXhfaW5zdGFsbC5tayBpcyB1c2VkIHRvIGRlZmluZSBvZGV4IGNyZWF0aW9uIHJ1bGVzIGZvciBKQVJzIGFuZCBBUEtzCiAjIFRoaXMgZmlsZSBkZXBlbmRzIG9uIHZhcmlhYmxlcyBzZXQgaW4gYmFzZV9ydWxlcy5tawotIyBPdXRwdXQgdmFyaWFibGVzOiBMT0NBTF9ERVhfUFJFT1BULCBidWlsdF9vZGV4LCBkZXhwcmVvcHRfYm9vdF9qYXJfbW9kdWxlCisjIE91dHB1dCB2YXJpYWJsZXM6IExPQ0FMX0RFWF9QUkVPUFQsIExPQ0FMX1VOQ09NUFJFU1NfREVYLCBidWlsdF9vZGV4LAorIyAgICAgICAgICAgICAgICAgICBkZXhwcmVvcHRfYm9vdF9qYXJfbW9kdWxlCisKKyMgV2UgZXhwbGljaXRseSB1bmNvbXByZXNzIEFQS3Mgb2YgcHJpdmlsZWdlZCBhcHBzLCBhbmQgdXNlZCBieQorIyBwcml2aWxlZ2VkIGFwcHMKK0xPQ0FMX1VOQ09NUFJFU1NfREVYIDo9IGZhbHNlCitpZm5lcSAodHJ1ZSwkKERPTlRfVU5DT01QUkVTU19QUklWX0FQUFNfREVYUykpCitpZmVxICh0cnVlLCQoTE9DQUxfUFJJVklMRUdFRF9NT0RVTEUpKQorICBMT0NBTF9VTkNPTVBSRVNTX0RFWCA6PSB0cnVlCitlbHNlCisgIGlmbmVxICgsJChmaWx0ZXIgJChQUk9EVUNUX0xPQURFRF9CWV9QUklWSUxFR0VEX01PRFVMRVMpLCAkKExPQ0FMX01PRFVMRSkpKQorICAgIExPQ0FMX1VOQ09NUFJFU1NfREVYIDo9IHRydWUKKyAgZW5kaWYgICMgUFJPRFVDVF9MT0FERURfQllfUFJJVklMRUdFRF9NT0RVTEVTCitlbmRpZiAgIyBMT0NBTF9QUklWSUxFR0VEX01PRFVMRQorZW5kaWYgICMgRE9OVF9VTkNPTVBSRVNTX1BSSVZfQVBQU19ERVhTCiAKICMgU2V0dGluZyBMT0NBTF9ERVhfUFJFT1BUIGJhc2VkIG9uIFdJVEhfREVYUFJFT1BULCBMT0NBTF9ERVhfUFJFT1BULCBldGMKIExPQ0FMX0RFWF9QUkVPUFQgOj0gJChzdHJpcCAkKExPQ0FMX0RFWF9QUkVPUFQpKQpAQCAtMzAsNyArNDQsNyBAQAogaWZkZWYgTE9DQUxfVU5JTlNUQUxMQUJMRV9NT0RVTEUKIExPQ0FMX0RFWF9QUkVPUFQgOj0KIGVuZGlmCi1pZmVxICgsJChzdHJpcCAkKGJ1aWx0X2RleCkkKG15X3ByZWJ1aWx0X3NyY19maWxlKSkpICMgY29udGFpbnMgbm8gamF2YSBjb2RlCitpZmVxICgsJChzdHJpcCAkKGJ1aWx0X2RleCkkKG15X3ByZWJ1aWx0X3NyY19maWxlKSQoTE9DQUxfU09PTkdfREVYX0pBUikpKSAjIGNvbnRhaW5zIG5vIGphdmEgY29kZQogTE9DQUxfREVYX1BSRU9QVCA6PQogZW5kaWYKICMgaWYgV0lUSF9ERVhQUkVPUFRfQk9PVF9JTUdfQU5EX1NZU1RFTV9TRVJWRVJfT05MWT10cnVlIGFuZCBtb2R1bGUgaXMgbm90IGluIGJvb3QgY2xhc3MgcGF0aCBza2lwCkBAIC00NiwxNCArNjAsMjcgQEAKIGVuZGlmCiBlbmRpZgogCi0jIGlmIGluc3RhbGxpbmcgaW50byBzeXN0ZW0sIGFuZCBvZGV4IGFyZSBiZWluZyBpbnN0YWxsZWQgaW50byBzeXN0ZW1fb3RoZXIsIGRvbid0IHN0cmlwCi1pZmVxICgkKEJPQVJEX1VTRVNfU1lTVEVNX09USEVSX09ERVgpLHRydWUpCiBpZmVxICgkKExPQ0FMX0RFWF9QUkVPUFQpLHRydWUpCisKKyMgRG9uJ3Qgc3RyaXAgd2l0aCBkZXhlcyB3ZSBleHBsaWNpdGx5IHVuY29tcHJlc3MgKGRleG9wdCB3aWxsIG5vdCBzdG9yZSB0aGUgZGV4IGNvZGUpLgoraWZlcSAoJChMT0NBTF9VTkNPTVBSRVNTX0RFWCksdHJ1ZSkKK0xPQ0FMX0RFWF9QUkVPUFQgOj0gbm9zdHJpcHBpbmcKK2VuZGlmICAjIExPQ0FMX1VOQ09NUFJFU1NfREVYCisKKyMgc3lzdGVtX290aGVyIGlzbid0IHRoZXJlIGZvciBhbiBPVEEsIHNvIGRvbid0IHN0cmlwCisjIGlmIG1vZHVsZSBpcyBvbiBzeXN0ZW0sIGFuZCBvZGV4IGlzIG9uIHN5c3RlbV9vdGhlci4KK2lmZXEgKCQoQk9BUkRfVVNFU19TWVNURU1fT1RIRVJfT0RFWCksdHJ1ZSkKIGlmbmVxICgkKGNhbGwgaW5zdGFsbC1vbi1zeXN0ZW0tb3RoZXIsICQobXlfbW9kdWxlX3BhdGgpKSwpCiBMT0NBTF9ERVhfUFJFT1BUIDo9IG5vc3RyaXBwaW5nCi1lbmRpZgotZW5kaWYKLWVuZGlmCitlbmRpZiAgIyBpbnN0YWxsLW9uLXN5c3RlbS1vdGhlcgorZW5kaWYgICMgQk9BUkRfVVNFU19TWVNURU1fT1RIRVJfT0RFWAorCisjIFdlIGFsc28gZG9uJ3Qgc3RyaXAgaWYgYWxsIGRleHMgYXJlIHVuY29tcHJlc3NlZCAoZGV4b3B0IHdpbGwgbm90IHN0b3JlIHRoZSBkZXggY29kZSksCisjIGJ1dCB0aGF0IHJlcXVpcmVzIHRvIGluc3BlY3QgdGhlIHNvdXJjZSBmaWxlLCB3aGljaCBpcyB0b28gZWFybHkgYXQgdGhpcyBwb2ludCAoYXMgd2UKKyMgZG9uJ3Qga25vdyBpZiB0aGUgc291cmNlIGZpbGUgd2lsbCBhY3R1YWxseSBiZSB1c2VkKS4KKyMgU2VlIGRleHByZW9wdC1yZW1vdmUtY2xhc3Nlcy5kZXguCisKK2VuZGlmICAjIExPQ0FMX0RFWF9QUkVPUFQKIAogYnVpbHRfb2RleCA6PQogYnVpbHRfdmRleCA6PQpAQCAtNjQsMzIgKzkxLDM5IEBACiBidWlsdF9pbnN0YWxsZWRfb2RleCA6PQogYnVpbHRfaW5zdGFsbGVkX3ZkZXggOj0KIGJ1aWx0X2luc3RhbGxlZF9hcnQgOj0KK215X3Byb2Nlc3NfcHJvZmlsZSA6PQorbXlfcHJvZmlsZV9pc190ZXh0X2xpc3RpbmcgOj0KIAogaWZlcSAoZmFsc2UsJChXSVRIX0RFWF9QUkVPUFRfR0VORVJBVEVfUFJPRklMRSkpCiBMT0NBTF9ERVhfUFJFT1BUX0dFTkVSQVRFX1BST0ZJTEUgOj0gZmFsc2UKIGVuZGlmCiAKIGlmbmRlZiBMT0NBTF9ERVhfUFJFT1BUX0dFTkVSQVRFX1BST0ZJTEUKKworCiAjIElmIExPQ0FMX0RFWF9QUkVPUFRfR0VORVJBVEVfUFJPRklMRSBpcyBub3QgZGVmaW5lZCwgZGVmYXVsdCBpdCBiYXNlZCBvbiB0aGUgZXhpc3RlbmNlIG9mIHRoZQogIyBwcm9maWxlIGNsYXNzIGxpc3RpbmcuIFRPRE86IFVzZSBwcm9kdWN0IHNwZWNpZmljIGRpcmVjdG9yeSBoZXJlLgogbXlfY2xhc3Nlc19kaXJlY3RvcnkgOj0gJChQUk9EVUNUX0RFWF9QUkVPUFRfUFJPRklMRV9ESVIpCi1MT0NBTF9ERVhfUFJFT1BUX1BST0ZJTEVfQ0xBU1NfTElTVElORyA6PSAkKG15X2NsYXNzZXNfZGlyZWN0b3J5KS8kKExPQ0FMX01PRFVMRSkucHJvZi50eHQKLWlmbmVxICgsJCh3aWxkY2FyZCAkKExPQ0FMX0RFWF9QUkVPUFRfUFJPRklMRV9DTEFTU19MSVNUSU5HKSkpCi0jIFByb2ZpbGUgbGlzdGluZyBleGlzdHMsIHVzZSBpdCB0byBnZW5lcmF0ZSB0aGUgcHJvZmlsZS4KLUxPQ0FMX0RFWF9QUkVPUFRfR0VORVJBVEVfUFJPRklMRSA6PSB0cnVlCi1lbmRpZgotZW5kaWYKK0xPQ0FMX0RFWF9QUkVPUFRfUFJPRklMRSA6PSAkKG15X2NsYXNzZXNfZGlyZWN0b3J5KS8kKExPQ0FMX01PRFVMRSkucHJvZgogCi1pZmVxICh0cnVlLCQoTE9DQUxfREVYX1BSRU9QVF9HRU5FUkFURV9QUk9GSUxFKSkKLQotaWZkZWYgTE9DQUxfVkVORE9SX01PRFVMRQotJChjYWxsIHByZXR0eS1lcnJvciwgSW50ZXJuYWwgZXJyb3I6IHByb2ZpbGVzIGFyZSBub3Qgc3VwcG9ydGVkIGZvciB2ZW5kb3IgbW9kdWxlcykKK2lmbmVxICgsJCh3aWxkY2FyZCAkKExPQ0FMX0RFWF9QUkVPUFRfUFJPRklMRSkpKQorbXlfcHJvY2Vzc19wcm9maWxlIDo9IHRydWUKK215X3Byb2ZpbGVfaXNfdGV4dF9saXN0aW5nIDo9IGZhbHNlCitlbmRpZgogZWxzZQorbXlfcHJvY2Vzc19wcm9maWxlIDo9ICQoTE9DQUxfREVYX1BSRU9QVF9HRU5FUkFURV9QUk9GSUxFKQorbXlfcHJvZmlsZV9pc190ZXh0X2xpc3RpbmcgOj0gdHJ1ZQorTE9DQUxfREVYX1BSRU9QVF9QUk9GSUxFIDo9ICQoTE9DQUxfREVYX1BSRU9QVF9QUk9GSUxFX0NMQVNTX0xJU1RJTkcpCitlbmRpZgorCitpZmVxICh0cnVlLCQobXlfcHJvY2Vzc19wcm9maWxlKSkKKworaWZlcSAoLCQoTE9DQUxfREVYX1BSRU9QVF9BUFBfSU1BR0UpKQogTE9DQUxfREVYX1BSRU9QVF9BUFBfSU1BR0UgOj0gdHJ1ZQogZW5kaWYKIAotaWZuZGVmIExPQ0FMX0RFWF9QUkVPUFRfUFJPRklMRV9DTEFTU19MSVNUSU5HCi0kKGNhbGwgcHJldHR5LWVycm9yLE11c3QgaGF2ZSBzcGVjaWZpZWQgY2xhc3MgbGlzdGluZyAoTE9DQUxfREVYX1BSRU9QVF9QUk9GSUxFX0NMQVNTX0xJU1RJTkcpKQoraWZuZGVmIExPQ0FMX0RFWF9QUkVPUFRfUFJPRklMRQorJChjYWxsIHByZXR0eS1lcnJvcixNdXN0IGhhdmUgc3BlY2lmaWVkIGNsYXNzIGxpc3RpbmcgKExPQ0FMX0RFWF9QUkVPUFRfUFJPRklMRSkpCiBlbmRpZgogaWZlcSAoLCQoZGV4X3ByZW9wdF9wcm9maWxlX3NyY19maWxlKSkKICQoY2FsbCBwcmV0dHktZXJyb3IsIEludGVybmFsIGVycm9yOiBkZXhfcHJlb3B0X3Byb2ZpbGVfc3JjX2ZpbGUgbXVzdCBiZSBzZXQpCkBAIC0xMDAsMjAgKzEzNCw0MCBAQAogbXlfZGV4X2xvY2F0aW9uIDo9ICQocGF0c3Vic3QgJS5neiwlLCQobXlfZGV4X2xvY2F0aW9uKSkKICQobXlfYnVpbHRfcHJvZmlsZSk6IFBSSVZBVEVfQlVJTFRfTU9EVUxFIDo9ICQoZGV4X3ByZW9wdF9wcm9maWxlX3NyY19maWxlKQogJChteV9idWlsdF9wcm9maWxlKTogUFJJVkFURV9ERVhfTE9DQVRJT04gOj0gJChteV9kZXhfbG9jYXRpb24pCi0kKG15X2J1aWx0X3Byb2ZpbGUpOiBQUklWQVRFX1NPVVJDRV9DTEFTU0VTIDo9ICQoTE9DQUxfREVYX1BSRU9QVF9QUk9GSUxFX0NMQVNTX0xJU1RJTkcpCi0kKG15X2J1aWx0X3Byb2ZpbGUpOiAkKExPQ0FMX0RFWF9QUkVPUFRfUFJPRklMRV9DTEFTU19MSVNUSU5HKQorJChteV9idWlsdF9wcm9maWxlKTogUFJJVkFURV9TT1VSQ0VfQ0xBU1NFUyA6PSAkKExPQ0FMX0RFWF9QUkVPUFRfUFJPRklMRSkKKyQobXlfYnVpbHRfcHJvZmlsZSk6ICQoTE9DQUxfREVYX1BSRU9QVF9QUk9GSUxFKQogJChteV9idWlsdF9wcm9maWxlKTogJChQUk9GTUFOKQogJChteV9idWlsdF9wcm9maWxlKTogJChkZXhfcHJlb3B0X3Byb2ZpbGVfc3JjX2ZpbGUpCi0kKG15X2J1aWx0X3Byb2ZpbGUpOgoraWZlcSAodHJ1ZSwkKG15X3Byb2ZpbGVfaXNfdGV4dF9saXN0aW5nKSkKKyMgVGhlIHByb2ZpbGUgaXMgYSB0ZXN0IGxpc3Rpbmcgb2YgY2xhc3NlcyAodXNlZCBmb3IgZnJhbWV3b3JrIGphcnMpLgorIyBXZSBuZWVkIHRvIGdlbmVyYXRlIHRoZSBhY3R1YWwgYmluYXJ5IHByb2ZpbGUgYmVmb3JlIGJlaW5nIGFibGUgdG8gY29tcGlsZS4KIAkkKGhpZGUpIG1rZGlyIC1wICQoZGlyICRAKQogCUFORFJPSURfTE9HX1RBR1M9Iio6ZSIgJChQUk9GTUFOKSBcCiAJCS0tY3JlYXRlLXByb2ZpbGUtZnJvbT0kKFBSSVZBVEVfU09VUkNFX0NMQVNTRVMpIFwKIAkJLS1hcGs9JChQUklWQVRFX0JVSUxUX01PRFVMRSkgXAogCQktLWRleC1sb2NhdGlvbj0kKFBSSVZBVEVfREVYX0xPQ0FUSU9OKSBcCiAJCS0tcmVmZXJlbmNlLXByb2ZpbGUtZmlsZT0kQAotZGV4X3ByZW9wdF9wcm9maWxlX3NyY19maWxlOj0KLSMgUmVtb3ZlIGNvbXByZXNzZWQgQVBLICBleHRlbnNpb24uCitlbHNlCisjIFRoZSBwcm9maWxlIGlzIGJpbmFyeSBwcm9maWxlICh1c2VkIGZvciBhcHBzKS4gUnVuIGl0IHRocm91Z2ggcHJvZm1hbiB0bworIyBlbnN1cmUgdGhlIHByb2ZpbGUga2V5cyBtYXRjaCB0aGUgYXBrLgorJChteV9idWlsdF9wcm9maWxlKToKKwkkKGhpZGUpIG1rZGlyIC1wICQoZGlyICRAKQorCXRvdWNoICRACisJQU5EUk9JRF9MT0dfVEFHUz0iKjppIiAkKFBST0ZNQU4pIFwKKwkgIC0tY29weS1hbmQtdXBkYXRlLXByb2ZpbGUta2V5IFwKKwkJLS1wcm9maWxlLWZpbGU9JChQUklWQVRFX1NPVVJDRV9DTEFTU0VTKSBcCisJCS0tYXBrPSQoUFJJVkFURV9CVUlMVF9NT0RVTEUpIFwKKwkJLS1kZXgtbG9jYXRpb249JChQUklWQVRFX0RFWF9MT0NBVElPTikgXAorCQktLXJlZmVyZW5jZS1wcm9maWxlLWZpbGU9JEAgXAorCXx8IGVjaG8gIlByb2ZpbGUgb3V0IG9mIGRhdGUgZm9yICQoUFJJVkFURV9CVUlMVF9NT0RVTEUpIgorZW5kaWYKKworbXlfcHJvZmlsZV9pc190ZXh0X2xpc3RpbmcgOj0KK2RleF9wcmVvcHRfcHJvZmlsZV9zcmNfZmlsZSA6PQorCisjIFJlbW92ZSBjb21wcmVzc2VkIEFQSyBleHRlbnNpb24uCiBteV9pbnN0YWxsZWRfcHJvZmlsZSA6PSAkKHBhdHN1YnN0ICUuZ3osJSwkKExPQ0FMX0lOU1RBTExFRF9NT0RVTEUpKS5wcm9mCisKICMgbXlfaW5zdGFsbGVkX3Byb2ZpbGUgOj0gJChMT0NBTF9JTlNUQUxMRURfTU9EVUxFKS5wcm9mCiAkKGV2YWwgJChjYWxsIGNvcHktb25lLWZpbGUsJChteV9idWlsdF9wcm9maWxlKSwkKG15X2luc3RhbGxlZF9wcm9maWxlKSkpCiBidWlsZF9pbnN0YWxsZWRfcHJvZmlsZTo9JChteV9idWlsdF9wcm9maWxlKTokKG15X2luc3RhbGxlZF9wcm9maWxlKQpAQCAtMTI1LDYgKzE3OSwxMiBAQAogaWZkZWYgTE9DQUxfREVYX1BSRU9QVAogCiBkZXhwcmVvcHRfYm9vdF9qYXJfbW9kdWxlIDo9ICQoZmlsdGVyICQoREVYUFJFT1BUX0JPT1RfSkFSU19NT0RVTEVTKSwkKExPQ0FMX01PRFVMRSkpCisKKyMgRmlsdGVyIG9yZy5hcGFjaGUuaHR0cC5sZWdhY3kuYm9vdC4KK2lmZXEgKCQoZGV4cHJlb3B0X2Jvb3RfamFyX21vZHVsZSksb3JnLmFwYWNoZS5odHRwLmxlZ2FjeS5ib290KQorZGV4cHJlb3B0X2Jvb3RfamFyX21vZHVsZSA6PQorZW5kaWYKKwogaWZkZWYgZGV4cHJlb3B0X2Jvb3RfamFyX21vZHVsZQogIyBGb3IgbGliYXJ0LCB0aGUgYm9vdCBqYXJzJyBvZGV4IGZpbGVzIGFyZSByZXBsYWNlZCBieSAkKERFRkFVTFRfREVYX1BSRU9QVF9JTlNUQUxMRURfSU1BR0UpLgogIyBXZSB1c2UgdGhpcyBpbnN0YWxsZWRfb2RleCB0cmljayB0byBnZXQgYm9vdC5hcnQgaW5zdGFsbGVkLgpAQCAtMTc4LDcgKzIzOCw3IEBACiBpbnN0YWxsZWRfYXJ0IDo9ICQoc3RyaXAgJChpbnN0YWxsZWRfYXJ0KSkKIAogaWZkZWYgYnVpbHRfb2RleAotaWZlcSAodHJ1ZSwkKExPQ0FMX0RFWF9QUkVPUFRfR0VORVJBVEVfUFJPRklMRSkpCitpZmVxICh0cnVlLCQobXlfcHJvY2Vzc19wcm9maWxlKSkKICQoYnVpbHRfb2RleCk6ICQobXlfYnVpbHRfcHJvZmlsZSkKICQoYnVpbHRfb2RleCk6IFBSSVZBVEVfUFJPRklMRV9QUkVPUFRfRkxBR1MgOj0gLS1wcm9maWxlLWZpbGU9JChteV9idWlsdF9wcm9maWxlKQogZWxzZQpAQCAtMTk3LDYgKzI1NywxMiBAQAogbXlfc3lzdGVtX3NlcnZlcl9jb21waWxlcl9maWx0ZXIgOj0gc3BlZWQKIGVuZGlmCiAKK215X2RlZmF1bHRfY29tcGlsZXJfZmlsdGVyIDo9ICQoUFJPRFVDVF9ERVhfUFJFT1BUX0RFRkFVTFRfQ09NUElMRVJfRklMVEVSKQoraWZlcSAoLCQobXlfZGVmYXVsdF9jb21waWxlcl9maWx0ZXIpKQorIyBJZiBubyBkZWZhdWx0IGNvbXBpbGVyIGZpbHRlciBpcyBzcGVjaWZpZWQsIGRlZmF1bHQgdG8gJ3F1aWNrZW4nIHRvIHNhdmUgb24gc3RvcmFnZS4KK215X2RlZmF1bHRfY29tcGlsZXJfZmlsdGVyIDo9IHF1aWNrZW4KK2VuZGlmCisKIGlmZXEgKCwkKGZpbHRlciAtLWNvbXBpbGVyLWZpbHRlcj0lLCAkKExPQ0FMX0RFWF9QUkVPUFRfRkxBR1MpKSkKICAgaWZuZXEgKCwkKGZpbHRlciAkKFBST0RVQ1RfU1lTVEVNX1NFUlZFUl9KQVJTKSwkKExPQ0FMX01PRFVMRSkpKQogICAgICMgSmFycyBvZiBzeXN0ZW0gc2VydmVyLCB1c2UgdGhlIHByb2R1Y3Qgb3B0aW9uIGlmIGl0IGlzIHNldCwgc3BlZWQgb3RoZXJ3aXNlLgpAQCAtMjA3LDQ1ICsyNzMsMTA3IEBACiAgICAgICAjICdzcGVlZCcgY29tcGlsZXIgZmlsdGVyLgogICAgICAgTE9DQUxfREVYX1BSRU9QVF9GTEFHUyArPSAtLWNvbXBpbGVyLWZpbHRlcj1zcGVlZAogICAgIGVsc2UKLSAgICAgIGlmZXEgKHRydWUsJChMT0NBTF9ERVhfUFJFT1BUX0dFTkVSQVRFX1BST0ZJTEUpKQorICAgICAgaWZlcSAodHJ1ZSwkKG15X3Byb2Nlc3NfcHJvZmlsZSkpCiAgICAgICAgICMgRm9yIG5vbiBzeXN0ZW0gc2VydmVyIGphcnMsIHVzZSBzcGVlZC1wcm9maWxlIHdoZW4gd2UgaGF2ZSBhIHByb2ZpbGUuCiAgICAgICAgIExPQ0FMX0RFWF9QUkVPUFRfRkxBR1MgKz0gLS1jb21waWxlci1maWx0ZXI9c3BlZWQtcHJvZmlsZQogICAgICAgZWxzZQotICAgICAgICAjIElmIG5vIGNvbXBpbGVyIGZpbHRlciBpcyBzcGVjaWZpZWQsIGRlZmF1bHQgdG8gJ3F1aWNrZW4nIHRvIHNhdmUgb24gc3RvcmFnZS4KLSAgICAgICAgTE9DQUxfREVYX1BSRU9QVF9GTEFHUyArPSAtLWNvbXBpbGVyLWZpbHRlcj1xdWlja2VuCisgICAgICAgIExPQ0FMX0RFWF9QUkVPUFRfRkxBR1MgKz0gLS1jb21waWxlci1maWx0ZXI9JChteV9kZWZhdWx0X2NvbXBpbGVyX2ZpbHRlcikKICAgICAgIGVuZGlmCiAgICAgZW5kaWYKICAgZW5kaWYKIGVuZGlmCiAKLSMgUFJPRFVDVF9TWVNURU1fU0VSVkVSX0RFQlVHX0lORk8gb3ZlcnJpZGVzIFdJVEhfREVYUFJFT1BUX0RFQlVHX0lORk8uCi1teV9zeXN0ZW1fc2VydmVyX2RlYnVnX2luZm8gOj0gJChQUk9EVUNUX1NZU1RFTV9TRVJWRVJfREVCVUdfSU5GTykKLWlmZXEgKCwkKGZpbHRlciBlbmcsICQoVEFSR0VUX0JVSUxEX1ZBUklBTlQpKSkKLSMgT25seSBlbmFibGUgZm9yIG5vbi1lbmcgYnVpbGRzLgotaWZlcSAoLCQobXlfc3lzdGVtX3NlcnZlcl9kZWJ1Z19pbmZvKSkKLW15X3N5c3RlbV9zZXJ2ZXJfZGVidWdfaW5mbyA6PSB0cnVlCi1lbmRpZgorbXlfZ2VuZXJhdGVfZG0gOj0gJChQUk9EVUNUX0RFWF9QUkVPUFRfR0VORVJBVEVfRE1fRklMRVMpCitpZmVxICgsJChmaWx0ZXIgJChMT0NBTF9ERVhfUFJFT1BUX0ZMQUdTKSwtLWNvbXBpbGVyLWZpbHRlcj12ZXJpZnkpKQorIyBHZW5lcmF0aW5nIERNIGZpbGVzIG9ubHkgbWFrZXMgc2Vuc2UgZm9yIHZlcmlmeSwgYXZvaWQgZG9pbmcgZm9yIG5vbiB2ZXJpZnkgY29tcGlsZXIgZmlsdGVyIEFQS3MuCitteV9nZW5lcmF0ZV9kbSA6PSBmYWxzZQogZW5kaWYKIAotaWZlcSAodHJ1ZSwgJChteV9zeXN0ZW1fc2VydmVyX2RlYnVnX2luZm8pKQotICBpZm5lcSAoLCQoZmlsdGVyICQoUFJPRFVDVF9TWVNURU1fU0VSVkVSX0pBUlMpLCQoTE9DQUxfTU9EVUxFKSkpCi0gICAgTE9DQUxfREVYX1BSRU9QVF9GTEFHUyArPSAtLWdlbmVyYXRlLW1pbmktZGVidWctaW5mbworIyBObyByZWFzb24gdG8gdXNlIGEgZG0gZmlsZSBpZiB0aGUgZGV4IGlzIGFscmVhZHkgdW5jb21wcmVzc2VkLgoraWZlcSAoJChMT0NBTF9VTkNPTVBSRVNTX0RFWCksdHJ1ZSkKK215X2dlbmVyYXRlX2RtIDo9IGZhbHNlCitlbmRpZgorCitpZmVxICh0cnVlLCQobXlfZ2VuZXJhdGVfZG0pKQorTE9DQUxfREVYX1BSRU9QVF9GTEFHUyArPSAtLWNvcHktZGV4LWZpbGVzPWZhbHNlCitMT0NBTF9ERVhfUFJFT1BUIDo9IG5vc3RyaXBwaW5nCitteV9idWlsdF9kbSA6PSAkKGRpciAkKExPQ0FMX0JVSUxUX01PRFVMRSkpZ2VuZXJhdGVkLmRtCitteV9pbnN0YWxsZWRfZG0gOj0gJChwYXRzdWJzdCAlLmFwaywlLCQoTE9DQUxfSU5TVEFMTEVEX01PRFVMRSkpLmRtCitteV9jb3BpZWRfdmRleCA6PSAkKGRpciAkKExPQ0FMX0JVSUxUX01PRFVMRSkpcHJpbWFyeS52ZGV4CiskKGV2YWwgJChjYWxsIGNvcHktb25lLWZpbGUsJChidWlsdF92ZGV4KSwkKG15X2NvcGllZF92ZGV4KSkpCiskKG15X2J1aWx0X2RtKTogUFJJVkFURV9JTlBVVF9WREVYIDo9ICQobXlfY29waWVkX3ZkZXgpCiskKG15X2J1aWx0X2RtKTogJChteV9jb3BpZWRfdmRleCkgJChaSVBUSU1FKQorCSQoaGlkZSkgbWtkaXIgLXAgJChkaXIgJEApCisJJChoaWRlKSBybSAtZiAkQAorCSQoaGlkZSkgemlwIC1xRCAtaiAtWCAtOSAkQCAkKFBSSVZBVEVfSU5QVVRfVkRFWCkKKwkkKFpJUFRJTUUpICRACiskKGV2YWwgJChjYWxsIGNvcHktb25lLWZpbGUsJChteV9idWlsdF9kbSksJChteV9pbnN0YWxsZWRfZG0pKSkKK2VuZGlmCisKKyMgQnkgZGVmYXVsdCwgZW1pdCBkZWJ1ZyBpbmZvLgorbXlfZGV4cHJlb3B0X2RlYnVnX2luZm8gOj0gdHJ1ZQorIyBJZiB0aGUgZ2xvYmFsIHNldHRpbmcgc3VwcHJlc3NlcyBtaW5pLWRlYnVnLWluZm8sIGRpc2FibGUgaXQuCitpZmVxIChmYWxzZSwkKFdJVEhfREVYUFJFT1BUX0RFQlVHX0lORk8pKQorICBteV9kZXhwcmVvcHRfZGVidWdfaW5mbyA6PSBmYWxzZQorZW5kaWYKKworIyBQUk9EVUNUX1NZU1RFTV9TRVJWRVJfREVCVUdfSU5GTyBvdmVycmlkZXMgV0lUSF9ERVhQUkVPUFRfREVCVUdfSU5GTy4KKyMgUFJPRFVDVF9PVEhFUl9KQVZBX0RFQlVHX0lORk8gb3ZlcnJpZGVzIFdJVEhfREVYUFJFT1BUX0RFQlVHX0lORk8uCitpZm5lcSAoLCQoZmlsdGVyICQoUFJPRFVDVF9TWVNURU1fU0VSVkVSX0pBUlMpLCQoTE9DQUxfTU9EVUxFKSkpCisgIGlmZXEgKHRydWUsJChQUk9EVUNUX1NZU1RFTV9TRVJWRVJfREVCVUdfSU5GTykpCisgICAgbXlfZGV4cHJlb3B0X2RlYnVnX2luZm8gOj0gdHJ1ZQorICBlbHNlIGlmZXEgKGZhbHNlLCQoUFJPRFVDVF9TWVNURU1fU0VSVkVSX0RFQlVHX0lORk8pKQorICAgIG15X2RleHByZW9wdF9kZWJ1Z19pbmZvIDo9IGZhbHNlCisgIGVuZGlmCitlbHNlCisgIGlmZXEgKHRydWUsJChQUk9EVUNUX09USEVSX0pBVkFfREVCVUdfSU5GTykpCisgICAgbXlfZGV4cHJlb3B0X2RlYnVnX2luZm8gOj0gdHJ1ZQorICBlbHNlIGlmZXEgKGZhbHNlLCQoUFJPRFVDVF9PVEhFUl9KQVZBX0RFQlVHX0lORk8pKQorICAgIG15X2RleHByZW9wdF9kZWJ1Z19pbmZvIDo9IGZhbHNlCiAgIGVuZGlmCiBlbmRpZgogCisjIE5ldmVyIGVuYWJsZSBvbiBlbmcuCitpZmVxIChlbmcsJChmaWx0ZXIgZW5nLCAkKFRBUkdFVF9CVUlMRF9WQVJJQU5UKSkpCitteV9kZXhwcmVvcHRfZGVidWdfaW5mbyA6PSBmYWxzZQorZW5kaWYKKworIyBBZGQgZGV4Mm9hdCBmbGFnIGZvciBkZWJ1Zy1pbmZvL25vLWRlYnVnLWluZm8uCitpZmVxICh0cnVlLCQobXlfZGV4cHJlb3B0X2RlYnVnX2luZm8pKQorICBMT0NBTF9ERVhfUFJFT1BUX0ZMQUdTICs9IC0tZ2VuZXJhdGUtbWluaS1kZWJ1Zy1pbmZvCitlbHNlIGlmZXEgKGZhbHNlLCQobXlfZGV4cHJlb3B0X2RlYnVnX2luZm8pKQorICBMT0NBTF9ERVhfUFJFT1BUX0ZMQUdTICs9IC0tbm8tZ2VuZXJhdGUtbWluaS1kZWJ1Zy1pbmZvCitlbmRpZgorCisjIFNldCB0aGUgY29tcGlsZXIgcmVhc29uIHRvICdwcmVidWlsdCcgdG8gaWRlbnRpZnkgdGhlIG9hdCBmaWxlcyBwcm9kdWNlZAorIyBkdXJpbmcgdGhlIGJ1aWxkLCBhcyBvcHBvc2VkIHRvIGNvbXBpbGVkIG9uIHRoZSBkZXZpY2UuCitMT0NBTF9ERVhfUFJFT1BUX0ZMQUdTICs9IC0tY29tcGlsYXRpb24tcmVhc29uPXByZWJ1aWx0CisKICQoYnVpbHRfb2RleCk6IFBSSVZBVEVfREVYX1BSRU9QVF9GTEFHUyA6PSAkKExPQ0FMX0RFWF9QUkVPUFRfRkxBR1MpCiAkKGJ1aWx0X3ZkZXgpOiAkKGJ1aWx0X29kZXgpCiAkKGJ1aWx0X2FydCk6ICQoYnVpbHRfb2RleCkKIGVuZGlmCiAKLSMgQWRkIHRoZSBpbnN0YWxsZWRfb2RleCB0byB0aGUgbGlzdCBvZiBpbnN0YWxsZWQgZmlsZXMgZm9yIHRoaXMgbW9kdWxlLgotQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5JTlNUQUxMRUQgKz0gJChpbnN0YWxsZWRfb2RleCkKLUFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuSU5TVEFMTEVEICs9ICQoaW5zdGFsbGVkX3ZkZXgpCi1BTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLklOU1RBTExFRCArPSAkKGluc3RhbGxlZF9hcnQpCitpZm5lcSAodHJ1ZSwkKG15X2dlbmVyYXRlX2RtKSkKKyAgIyBBZGQgdGhlIGluc3RhbGxlZF9vZGV4IHRvIHRoZSBsaXN0IG9mIGluc3RhbGxlZCBmaWxlcyBmb3IgdGhpcyBtb2R1bGUgaWYgd2UgYXJlbid0IGdlbmVyYXRpbmcgYQorICAjIGRtIGZpbGUuCisgIEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuSU5TVEFMTEVEICs9ICQoaW5zdGFsbGVkX29kZXgpCisgIEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuSU5TVEFMTEVEICs9ICQoaW5zdGFsbGVkX3ZkZXgpCisgIEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuSU5TVEFMTEVEICs9ICQoaW5zdGFsbGVkX2FydCkKIAotQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5CVUlMVF9JTlNUQUxMRUQgKz0gJChidWlsdF9pbnN0YWxsZWRfb2RleCkKLUFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuQlVJTFRfSU5TVEFMTEVEICs9ICQoYnVpbHRfaW5zdGFsbGVkX3ZkZXgpCi1BTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLkJVSUxUX0lOU1RBTExFRCArPSAkKGJ1aWx0X2luc3RhbGxlZF9hcnQpCisgIEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuQlVJTFRfSU5TVEFMTEVEICs9ICQoYnVpbHRfaW5zdGFsbGVkX29kZXgpCisgIEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuQlVJTFRfSU5TVEFMTEVEICs9ICQoYnVpbHRfaW5zdGFsbGVkX3ZkZXgpCisgIEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuQlVJTFRfSU5TVEFMTEVEICs9ICQoYnVpbHRfaW5zdGFsbGVkX2FydCkKKworICAjIE1ha2Ugc3VyZSB0byBpbnN0YWxsIHRoZSAub2RleCBhbmQgLnZkZXggd2hlbiB5b3UgcnVuICJtYWtlIDxtb2R1bGVfbmFtZT4iCisgICQobXlfYWxsX3RhcmdldHMpOiAkKGluc3RhbGxlZF9vZGV4KSAkKGluc3RhbGxlZF92ZGV4KSAkKGluc3RhbGxlZF9hcnQpCitlbHNlCisgIEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuSU5TVEFMTEVEICs9ICQobXlfaW5zdGFsbGVkX2RtKQorICBBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLkJVSUxUX0lOU1RBTExFRCArPSAkKG15X2J1aWx0X2RtKSAkKG15X2luc3RhbGxlZF9kbSkKKworICAjIE1ha2Ugc3VyZSB0byBpbnN0YWxsIHRoZSAuZG0gd2hlbiB5b3UgcnVuICJtYWtlIDxtb2R1bGVfbmFtZT4iCisgICQobXlfYWxsX3RhcmdldHMpOiAkKGluc3RhbGxlZF9kbSkKK2VuZGlmCiAKICMgUmVjb3JkIGRleC1wcmVvcHQgY29uZmlnLgogREVYUFJFT1BULiQoTE9DQUxfTU9EVUxFKS5ERVhfUFJFT1BUIDo9ICQoTE9DQUxfREVYX1BSRU9QVCkKQEAgLTI1OSwxNCArMzg3LDEyIEBACiBERVhQUkVPUFQuTU9EVUxFUy4kKExPQ0FMX01PRFVMRV9DTEFTUykgOj0gJChzb3J0IFwKICAgJChERVhQUkVPUFQuTU9EVUxFUy4kKExPQ0FMX01PRFVMRV9DTEFTUykpICQoTE9DQUxfTU9EVUxFKSkKIAotCi0jIE1ha2Ugc3VyZSB0byBpbnN0YWxsIHRoZSAub2RleCBhbmQgLnZkZXggd2hlbiB5b3UgcnVuICJtYWtlIDxtb2R1bGVfbmFtZT4iCi0kKG15X2FsbF90YXJnZXRzKTogJChpbnN0YWxsZWRfb2RleCkgJChpbnN0YWxsZWRfdmRleCkgJChpbnN0YWxsZWRfYXJ0KQotCiBlbmRpZiAjIExPQ0FMX0RFWF9QUkVPUFQKIAogIyBQcm9maWxlIGRvZXNuJ3QgZGVwZW5kIG9uIExPQ0FMX0RFWF9QUkVPUFQuCiBBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLklOU1RBTExFRCArPSAkKG15X2luc3RhbGxlZF9wcm9maWxlKQogQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5CVUlMVF9JTlNUQUxMRUQgKz0gJChidWlsZF9pbnN0YWxsZWRfcHJvZmlsZSkKIAorbXlfcHJvY2Vzc19wcm9maWxlIDo9CisKICQobXlfYWxsX3RhcmdldHMpOiAkKG15X2luc3RhbGxlZF9wcm9maWxlKQpkaWZmIC0tZ2l0IGEvY29yZS9kaXN0ZGlyLm1rIGIvY29yZS9kaXN0ZGlyLm1rCmluZGV4IDg5YzU5NjYuLmMwNzQxODYgMTAwNjQ0Ci0tLSBhL2NvcmUvZGlzdGRpci5taworKysgYi9jb3JlL2Rpc3RkaXIubWsKQEAgLTE3LDkgKzE3LDYgQEAKICMgV2hlbiBzcGVjaWZ5aW5nICJkaXN0IiwgdGhlIHVzZXIgaGFzIGFza2VkIHRoYXQgd2UgY29weSB0aGUgaW1wb3J0YW50CiAjIGZpbGVzIGZyb20gdGhpcyBidWlsZCBpbnRvIERJU1RfRElSLgogCi1kaXN0X2dvYWwgOj0gJChzdHJpcCAkKGZpbHRlciBkaXN0LCQoTUFLRUNNREdPQUxTKSkpCi1NQUtFQ01ER09BTFMgOj0gJChzdHJpcCAkKGZpbHRlci1vdXQgZGlzdCwkKE1BS0VDTURHT0FMUykpKQotCiBpZmRlZiBkaXN0X2dvYWwKIAogIyAkKDEpOiBzb3VyY2UgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9kcGlfc3BlY2lmaWNfYXBrLm1rIGIvY29yZS9kcGlfc3BlY2lmaWNfYXBrLm1rCmluZGV4IDFiMGJlMDcuLmYzMmRhZjUgMTAwNjQ0Ci0tLSBhL2NvcmUvZHBpX3NwZWNpZmljX2Fway5taworKysgYi9jb3JlL2RwaV9zcGVjaWZpY19hcGsubWsKQEAgLTksNyArOSw3IEBACiAKICMgU2V0IHVwIGFsbCB0aGUgdGFyZ2V0LXNwZWNpZmljIHZhcmlhYmxlcy4KICQoYnVpbHRfZHBpX2Fwayk6IFBSSVZBVEVfTU9EVUxFIDo9ICQoZHBpX2Fwa19uYW1lKQotJChidWlsdF9kcGlfYXBrKTogUFJJVkFURV9BQVBUX0ZMQUdTIDo9ICQoTE9DQUxfQUFQVF9GTEFHUykgJChQUk9EVUNUX0FBUFRfRkxBR1MpICQoJChMT0NBTF9QQUNLQUdFX05BTUUpX2FhcHRfZmxhZ3NfJChteV9kcGkpKQorJChidWlsdF9kcGlfYXBrKTogUFJJVkFURV9BQVBUX0ZMQUdTIDo9ICQoTE9DQUxfQUFQVF9GTEFHUykgLS1wc2V1ZG8tbG9jYWxpemUgJCgkKExPQ0FMX1BBQ0tBR0VfTkFNRSlfYWFwdF9mbGFnc18kKG15X2RwaSkpCiAjIENsZWFyIFBSSVZBVEVfUFJPRFVDVF9BQVBUX0NPTkZJRyB0byBpbmNsdWRlIGV2ZXJ5dGhpbmcgYnkgZGVmYXVsdC4KICQoYnVpbHRfZHBpX2Fwayk6IFBSSVZBVEVfUFJPRFVDVF9BQVBUX0NPTkZJRyA6PQogJChidWlsdF9kcGlfYXBrKTogUFJJVkFURV9QUk9EVUNUX0FBUFRfUFJFRl9DT05GSUcgOj0gJChteV9kcGkpCkBAIC0xNyw4ICsxNyw5IEBACiAkKGJ1aWx0X2RwaV9hcGspOiBQUklWQVRFX1JFU09VUkNFX0RJUiA6PSAkKExPQ0FMX1JFU09VUkNFX0RJUikKICQoYnVpbHRfZHBpX2Fwayk6IFBSSVZBVEVfQVNTRVRfRElSIDo9ICQoTE9DQUxfQVNTRVRfRElSKQogJChidWlsdF9kcGlfYXBrKTogUFJJVkFURV9BQVBUX0lOQ0xVREVTIDo9ICQoYWxsX2xpYnJhcnlfcmVzX3BhY2thZ2VfZXhwb3J0cykKLWlmbmVxICgsJChmaWx0ZXItb3V0IGN1cnJlbnQgc3lzdGVtX2N1cnJlbnQgdGVzdF9jdXJyZW50LCAkKExPQ0FMX1NES19WRVJTSU9OKSkpCi0kKGJ1aWx0X2RwaV9hcGspOiBQUklWQVRFX0RFRkFVTFRfQVBQX1RBUkdFVF9TREsgOj0gJChMT0NBTF9TREtfVkVSU0lPTikKKyQoYnVpbHRfZHBpX2Fwayk6IFBSSVZBVEVfUkVTT1VSQ0VfTElTVCA6PSAkKGFsbF9yZXNfYXNzZXRzKQoraWZuZXEgKCwkKGZpbHRlci1vdXQgY3VycmVudCBzeXN0ZW1fY3VycmVudCB0ZXN0X2N1cnJlbnQgY29yZV9jdXJyZW50LCAkKExPQ0FMX1NES19WRVJTSU9OKSkpCiskKGJ1aWx0X2RwaV9hcGspOiBQUklWQVRFX0RFRkFVTFRfQVBQX1RBUkdFVF9TREsgOj0gJChjYWxsIGdldC1udW1lcmljLXNkay12ZXJzaW9uLCQoTE9DQUxfU0RLX1ZFUlNJT04pKQogZWxzZQogJChidWlsdF9kcGlfYXBrKTogUFJJVkFURV9ERUZBVUxUX0FQUF9UQVJHRVRfU0RLIDo9ICQoREVGQVVMVF9BUFBfVEFSR0VUX1NESykKIGVuZGlmCkBAIC0zNCwxMiArMzUsOCBAQAogJChidWlsdF9kcGlfYXBrKTogUFJJVkFURV9TT1VSQ0VfQVJDSElWRSA6PQogaWZuZXEgKCQoZnVsbF9jbGFzc2VzX2phciksKQogJChidWlsdF9kcGlfYXBrKTogUFJJVkFURV9ERVhfRklMRSA6PSAkKGJ1aWx0X2RleCkKLWlmbmRlZiBMT0NBTF9KQUNLX0VOQUJMRUQKICMgVXNlIHRoZSBqYXJqYXIgcHJvY2Vzc2VkIGFyaGl2ZSBhcyB0aGUgaW5pdGlhbCBwYWNrYWdlIGZpbGUuCiAkKGJ1aWx0X2RwaV9hcGspOiBQUklWQVRFX1NPVVJDRV9BUkNISVZFIDo9ICQoZnVsbF9jbGFzc2VzX3ByZV9wcm9ndWFyZF9qYXIpCi1lbHNlCi0kKGJ1aWx0X2RwaV9hcGspOiBQUklWQVRFX0pBQ0tfSU5URVJNRURJQVRFU19ESVIgOj0gJChpbnRlcm1lZGlhdGVzLkNPTU1PTikvamFjay1yc2MKLWVuZGlmICMgTE9DQUxfSkFDS19FTkFCTEVECiAkKGJ1aWx0X2RwaV9hcGspOiAkKGJ1aWx0X2RleCkKIGVsc2UKICQoYnVpbHRfZHBpX2Fwayk6IFBSSVZBVEVfREVYX0ZJTEUgOj0KQEAgLTY0LDkgKzYxLDYgQEAKIAkkKGlmICQoUFJJVkFURV9FWFRSQV9KQVJfQVJHUyksJChjYWxsIGFkZC1qYXZhLXJlc291cmNlcy10bywkQCkpCiBlbHNlCiAJJChhZGQtZGV4LXRvLXBhY2thZ2UpCi1pZmRlZiBMT0NBTF9KQUNLX0VOQUJMRUQKLQkkKGFkZC1jYXJyaWVkLWphY2stcmVzb3VyY2VzKQotZW5kaWYKIGVuZGlmCiAJJChzaWduLXBhY2thZ2UpCiAKZGlmZiAtLWdpdCBhL2NvcmUvZHJvaWRkb2MubWsgYi9jb3JlL2Ryb2lkZG9jLm1rCmluZGV4IDk0ZTI4MmQuLmJjZDIwMDIgMTAwNjQ0Ci0tLSBhL2NvcmUvZHJvaWRkb2MubWsKKysrIGIvY29yZS9kcm9pZGRvYy5tawpAQCAtMTUsMTIgKzE1LDkgQEAKICMKIAogJChjYWxsIHJlY29yZC1tb2R1bGUtdHlwZSxEUk9JRERPQykKLSMjCi0jIwotIyMgQ29tbW9uIHRvIGJvdGggZHJvaWRkb2MgYW5kIGphdmFkb2MKLSMjCi0jIwotCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMgQ29tbW9uIGxvZ2ljIHRvIGJvdGggZHJvaWRkb2MgYW5kIGphdmFkb2MKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiBMT0NBTF9JU19IT1NUX01PRFVMRSA6PSAkKGNhbGwgdHJ1ZS1vci1lbXB0eSwkKExPQ0FMX0lTX0hPU1RfTU9EVUxFKSkKIGlmZXEgKCQoTE9DQUxfSVNfSE9TVF9NT0RVTEUpLHRydWUpCiBteV9wcmVmaXggOj0gSE9TVF8KQEAgLTU0LDEwICs1MSwxMCBAQAogZW5kaWYKIAogaWZlcSAoJChMT0NBTF9JU19IT1NUX01PRFVMRSksdHJ1ZSkKKwogJChmdWxsX3RhcmdldCk6IFBSSVZBVEVfQk9PVENMQVNTUEFUSCA6PQogZnVsbF9qYXZhX2xpYnMgOj0gJChhZGRwcmVmaXggJChIT1NUX09VVF9KQVZBX0xJQlJBUklFUykvLFwKICAgJChhZGRzdWZmaXggJChDT01NT05fSkFWQV9QQUNLQUdFX1NVRkZJWCksJChMT0NBTF9KQVZBX0xJQlJBUklFUykpKQotZnVsbF9qYXZhX2xpYl9kZXBzIDo9ICQoZnVsbF9qYXZhX2xpYnMpCiAKIGVsc2UKIApAQCAtNzIsMzAgKzY5LDQzIEBACiAgIGVsc2UgaWZlcSAoJChMT0NBTF9TREtfVkVSU0lPTikkKFRBUkdFVF9CVUlMRF9BUFBTKSx0ZXN0X2N1cnJlbnQpCiAgICAgTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZF90ZXN0X3N0dWJzX2N1cnJlbnQgJChMT0NBTF9KQVZBX0xJQlJBUklFUykKICAgICAkKGZ1bGxfdGFyZ2V0KTogUFJJVkFURV9CT09UQ0xBU1NQQVRIIDo9ICQoY2FsbCBqYXZhLWxpYi1maWxlcywgYW5kcm9pZF90ZXN0X3N0dWJzX2N1cnJlbnQpCisgIGVsc2UgaWZlcSAoJChMT0NBTF9TREtfVkVSU0lPTikkKFRBUkdFVF9CVUlMRF9BUFBTKSxjb3JlX2N1cnJlbnQpCisgICAgTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gY29yZS5jdXJyZW50LnN0dWJzICQoTE9DQUxfSkFWQV9MSUJSQVJJRVMpCisgICAgJChmdWxsX3RhcmdldCk6IFBSSVZBVEVfQk9PVENMQVNTUEFUSCA6PSAkKGNhbGwgamF2YS1saWItZmlsZXMsIGNvcmUuY3VycmVudC5zdHVicykKICAgZWxzZQotICAgIExPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IHNka192JChMT0NBTF9TREtfVkVSU0lPTikgJChMT0NBTF9KQVZBX0xJQlJBUklFUykKLSAgICAkKGZ1bGxfdGFyZ2V0KTogUFJJVkFURV9CT09UQ0xBU1NQQVRIIDo9ICQoY2FsbCBqYXZhLWxpYi1maWxlcywgc2RrX3YkKExPQ0FMX1NES19WRVJTSU9OKSkKKyAgICAjIGNvcmVfPHZlcj4gaXMgc3Vic2V0IG9mIDx2ZXI+LiBJbnN0ZWFkIG9mIGRlZmluaW5nIGEgcHJlYnVpbHQgbGliIGZvciBjb3JlXzx2ZXI+LAorICAgICMgdXNlIHRoZSBzdHViIGZvciA8dmVyPiB3aGVuIGJ1aWxkaW5nIGZvciBhcHBzLgorICAgIF92ZXJzaW9uIDo9ICQocGF0c3Vic3QgY29yZV8lLCUsJChMT0NBTF9TREtfVkVSU0lPTikpCisgICAgTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gc2RrX3YkKF92ZXJzaW9uKSAkKExPQ0FMX0pBVkFfTElCUkFSSUVTKQorICAgICQoZnVsbF90YXJnZXQpOiBQUklWQVRFX0JPT1RDTEFTU1BBVEggOj0gJChjYWxsIGphdmEtbGliLWZpbGVzLCBzZGtfdiQoX3ZlcnNpb24pKQorICAgIF92ZXJzaW9uIDo9CiAgIGVuZGlmCiBlbHNlCi0gIExPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IGNvcmUtb2ogY29yZS1saWJhcnQgZXh0IGZyYW1ld29yayAkKExPQ0FMX0pBVkFfTElCUkFSSUVTKQorICBpZmVxICgkKExPQ0FMX05PX1NUQU5EQVJEX0xJQlJBUklFUyksdHJ1ZSkKKyAgICBMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBjb3JlLW9qIGNvcmUtbGliYXJ0CisgIGVsc2UKKyAgICBMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBjb3JlLW9qIGNvcmUtbGliYXJ0IGV4dCBmcmFtZXdvcmsgJChMT0NBTF9KQVZBX0xJQlJBUklFUykKKyAgZW5kaWYKICAgJChmdWxsX3RhcmdldCk6IFBSSVZBVEVfQk9PVENMQVNTUEFUSCA6PSAkKGNhbGwgamF2YS1saWItZmlsZXMsIGNvcmUtb2opOiQoY2FsbCBqYXZhLWxpYi1maWxlcywgY29yZS1saWJhcnQpCiBlbmRpZiAgIyBMT0NBTF9TREtfVkVSU0lPTgogTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gJChzb3J0ICQoTE9DQUxfSkFWQV9MSUJSQVJJRVMpKQogCiBmdWxsX2phdmFfbGlicyA6PSAkKGNhbGwgamF2YS1saWItZmlsZXMsJChMT0NBTF9KQVZBX0xJQlJBUklFUykpICQoTE9DQUxfQ0xBU1NQQVRIKQotZnVsbF9qYXZhX2xpYl9kZXBzIDo9ICQoY2FsbCBqYXZhLWxpYi1kZXBzLCQoTE9DQUxfSkFWQV9MSUJSQVJJRVMpKSAkKExPQ0FMX0NMQVNTUEFUSCkKIGVuZGlmICMgIUxPQ0FMX0lTX0hPU1RfTU9EVUxFCiAKLSQoZnVsbF90YXJnZXQpOiBQUklWQVRFX0NMQVNTUEFUSCA6PSAkKHN1YnN0ICQoc3BhY2UpLDosJChmdWxsX2phdmFfbGlicykpCi0KKyQoZnVsbF90YXJnZXQpOiBQUklWQVRFX0NMQVNTUEFUSCA6PSAkKGNhbGwgbm9ybWFsaXplLXBhdGgtbGlzdCwkKGZ1bGxfamF2YV9saWJzKSkKIAogaW50ZXJtZWRpYXRlcy5DT01NT04gOj0gJChjYWxsIGxvY2FsLWludGVybWVkaWF0ZXMtZGlyLENPTU1PTikKIAogJChmdWxsX3RhcmdldCk6IFBSSVZBVEVfU09VUkNFX1BBVEggOj0gJChjYWxsIG5vcm1hbGl6ZS1wYXRoLWxpc3QsJChMT0NBTF9EUk9JRERPQ19TT1VSQ0VfUEFUSCkpCiAkKGZ1bGxfdGFyZ2V0KTogUFJJVkFURV9KQVZBX0ZJTEVTIDo9ICQoZmlsdGVyICUuamF2YSwkKGZ1bGxfc3JjX2ZpbGVzKSkKICQoZnVsbF90YXJnZXQpOiBQUklWQVRFX0pBVkFfRklMRVMgKz0gJChhZGRwcmVmaXggJCgkKG15X3ByZWZpeClPVVRfQ09NTU9OX0lOVEVSTUVESUFURVMpLywgJChmaWx0ZXIgJS5qYXZhLCQoTE9DQUxfSU5URVJNRURJQVRFX1NPVVJDRVMpKSkKKyQoZnVsbF90YXJnZXQpOiBQUklWQVRFX0pBVkFfRklMRVMgKz0gJChmaWx0ZXIgJS5qYXZhLCQoTE9DQUxfR0VORVJBVEVEX1NPVVJDRVMpKQorJChmdWxsX3RhcmdldCk6IFBSSVZBVEVfU1JDSkFSUyA6PSAkKExPQ0FMX1NSQ0pBUlMpCiAkKGZ1bGxfdGFyZ2V0KTogUFJJVkFURV9TT1VSQ0VfSU5URVJNRURJQVRFU19ESVIgOj0gJChpbnRlcm1lZGlhdGVzLkNPTU1PTikvc3JjCiskKGZ1bGxfdGFyZ2V0KTogUFJJVkFURV9TUkNKQVJfSU5URVJNRURJQVRFU19ESVIgOj0gJChpbnRlcm1lZGlhdGVzLkNPTU1PTikvc3JjamFycwogJChmdWxsX3RhcmdldCk6IFBSSVZBVEVfU1JDX0xJU1RfRklMRSA6PSAkKGludGVybWVkaWF0ZXMuQ09NTU9OKS9kcm9pZGRvYy1zcmMtbGlzdAorJChmdWxsX3RhcmdldCk6IFBSSVZBVEVfU1JDSkFSX0xJU1RfRklMRSA6PSAkKGludGVybWVkaWF0ZXMuQ09NTU9OKS9kcm9pZGRvYy1zcmNqYXItbGlzdAogCiBpZm5lcSAoJChzdHJpcCAkKExPQ0FMX0FERElUSU9OQUxfSkFWQV9ESVIpKSwpCiAkKGZ1bGxfdGFyZ2V0KTogUFJJVkFURV9BRERJVElPTkFMX0pBVkFfRElSIDo9ICQoTE9DQUxfQURESVRJT05BTF9KQVZBX0RJUikKQEAgLTEwNCw2ICsxMTQsNyBAQAogJChmdWxsX3RhcmdldCk6IFBSSVZBVEVfT1VUX0RJUiA6PSAkKG91dF9kaXIpCiAkKGZ1bGxfdGFyZ2V0KTogUFJJVkFURV9EUk9JRERPQ19PUFRJT05TIDo9ICQoTE9DQUxfRFJPSURET0NfT1BUSU9OUykKICQoZnVsbF90YXJnZXQpOiBQUklWQVRFX1NUVUJfT1VUX0RJUiA6PSAkKExPQ0FMX0RST0lERE9DX1NUVUJfT1VUX0RJUikKKyQoZnVsbF90YXJnZXQpOiBQUklWQVRFX01FVEFMQVZBX0RPQ1NfU1RVQl9PVVRfRElSIDo9ICQoTE9DQUxfRFJPSURET0NfTUVUQUxBVkFfRE9DU19TVFVCX09VVF9ESVIpCiAKICMgTGlzdHMgdGhlIGlucHV0IGZpbGVzIGZvciB0aGUgZG9jIGJ1aWxkIGludG8gYSB0ZXh0IGZpbGUKICMgc3VpdGFibGUgZm9yIHRoZSBAIHN5bnRheCBvZiBqYXZhZG9jLgpAQCAtMTE2LDE4ICsxMjcsMTAgQEAKICQoaGlkZSkgZm9yIGQgaW4gJCgzKSA7IGRvIGZpbmQgJCRkIC1uYW1lICcqLmphdmEnIC1hbmQgLW5vdCAtbmFtZSAnLionID4+ICQoMSkgMj4gL2Rldi9udWxsIDsgZG9uZSA7IHRydWUKIGVuZGVmCiAKLWlmZXEgKGEsYikKLSQoZnVsbF90YXJnZXQpOiBQUklWQVRFX1BST0ZJTElOR19PUFRJT05TIDo9IFwKLSAgICAtSi1hZ2VudGxpYjpqcHJvZmlsZXJ0aT1wb3J0PTg4NDkgLUotWGJvb3RjbGFzc3BhdGgvYTovQXBwbGljYXRpb25zL2pwcm9maWxlcjUvYmluL2FnZW50LmphcgotZW5kaWYKLQotCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMgTG9naWMgZm9yIGRyb2lkZG9jIG9ubHkKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiBpZm5lcSAoJChzdHJpcCAkKExPQ0FMX0RST0lERE9DX1VTRV9TVEFOREFSRF9ET0NMRVQpKSx0cnVlKQotIyMKLSMjCi0jIyBkcm9pZGRvYyBvbmx5Ci0jIwotIyMKIAogZHJvaWRkb2NfdGVtcGxhdGVzIDo9IFwKICAgICAkKHNvcnQgJChzaGVsbCBmaW5kICQoTE9DQUxfRFJPSURET0NfQ1VTVE9NX1RFTVBMQVRFX0RJUikgLXR5cGUgZiAkKGlmICQoQUxMT1dfTUlTU0lOR19ERVBFTkRFTkNJRVMpLDI+L2Rldi9udWxsKSkpCkBAIC0xMzgsMTAgKzE0MSw2IEBACiAgIGVuZGlmCiBlbmRpZgogCi1kcm9pZGRvYyA6PSBcCi0JJChIT1NUX0pES19UT09MU19KQVIpIFwKLQkkKEhPU1RfT1VUX0pBVkFfTElCUkFSSUVTKS9kb2NsYXZhJChDT01NT05fSkFWQV9QQUNLQUdFX1NVRkZJWCkKLQogJChmdWxsX3RhcmdldCk6IFBSSVZBVEVfRE9DTEVUUEFUSCA6PSAkKEhPU1RfT1VUX0pBVkFfTElCUkFSSUVTKS9qc2lsdmVyJChDT01NT05fSkFWQV9QQUNLQUdFX1NVRkZJWCk6JChIT1NUX09VVF9KQVZBX0xJQlJBUklFUykvZG9jbGF2YSQoQ09NTU9OX0pBVkFfUEFDS0FHRV9TVUZGSVgpCiAkKGZ1bGxfdGFyZ2V0KTogUFJJVkFURV9DVVJSRU5UX0JVSUxEIDo9IC1oZGYgcGFnZS5idWlsZCAkKEJVSUxEX0lEKS0kKEJVSUxEX05VTUJFUl9GUk9NX0ZJTEUpCiAkKGZ1bGxfdGFyZ2V0KTogUFJJVkFURV9DVVJSRU5UX1RJTUUgOj0gIC1oZGYgcGFnZS5ub3cgIiQkKCQoREFURV9GUk9NX0ZJTEUpICIrJWQgJWIgJVkgJWs6JU0iKSIKQEAgLTE2Myw2MCArMTYyLDE2MiBAQAogJChmdWxsX3RhcmdldCk6IFBSSVZBVEVfQURESVRJT05BTF9IVE1MX0RJUiA6PQogZW5kaWYKIAotIyBUT0RPOiBub3QgY2xlYXIgaWYgdGhpcyBpcyB1c2VkIGFueSBtb3JlCisjIFRPRE8obmFuemhhbmcpOiBSZW1vdmUgaXQgaWYgdGhpcyBpcyBub3QgdXNlZCBhbnkgbW9yZQogJChmdWxsX3RhcmdldCk6IFBSSVZBVEVfTE9DQUxfUEFUSCA6PSAkKExPQ0FMX1BBVEgpCiAKK2lmZXEgKCQoc3RyaXAgJChMT0NBTF9EUk9JRERPQ19VU0VfTUVUQUxBVkEpKSx0cnVlKQoraWZuZXEgKCQoTE9DQUxfRFJPSURET0NfTUVUQUxBVkFfUFJFVklPVVNfQVBJKSwpCiskKGZ1bGxfdGFyZ2V0KTogUFJJVkFURV9EUk9JRERPQ19NRVRBTEFWQV9QUkVWSU9VU19BUEkgOj0gLS1wcmV2aW91cy1hcGkgJChMT0NBTF9EUk9JRERPQ19NRVRBTEFWQV9QUkVWSU9VU19BUEkpCitlbHNlCiskKGZ1bGxfdGFyZ2V0KTogUFJJVkFURV9EUk9JRERPQ19NRVRBTEFWQV9QUkVWSU9VU19BUEkgOj0KK2VuZGlmICMhTE9DQUxfRFJPSURET0NfTUVUQUxBVkFfUFJFVklPVVNfQVBJCisKK21ldGFsYXZhX2Fubm90YXRpb25zX2RlcHMgOj0KK2lmZXEgKCQoc3RyaXAgJChMT0NBTF9EUk9JRERPQ19NRVRBTEFWQV9BTk5PVEFUSU9OU19FTkFCTEVEKSksdHJ1ZSkKK2lmZXEgKCQoTE9DQUxfRFJPSURET0NfTUVUQUxBVkFfUFJFVklPVVNfQVBJKSwpCiskKGVycm9yICQoTE9DQUxfUEFUSCk6IExPQ0FMX0RST0lERE9DX01FVEFMQVZBX1BSRVZJT1VTX0FQSSBoYXMgdG8gYmUgbm9uLWVtcHR5IGlmIG1ldGFsYXZhIGFubm90YXRpb25zIHdhcyBlbmFibGVkISkKK2VuZGlmCitpZmVxICgkKExPQ0FMX0RST0lERE9DX01FVEFMQVZBX01FUkdFX0FOTk9UQVRJT05TX0RJUiksKQorJChlcnJvciAkKExPQ0FMX1BBVEgpOiBMT0NBTF9EUk9JRERPQ19NRVRBTEFWQV9NRVJHRV9BTk5PVEFUSU9OU19ESVIgaGFzIHRvIGJlIG5vbi1lbXB0eSBpZiBtZXRhbGF2YSBhbm5vdGF0aW9ucyB3YXMgZW5hYmxlZCEpCitlbmRpZgorCiskKGZ1bGxfdGFyZ2V0KTogUFJJVkFURV9EUk9JRERPQ19NRVRBTEFWQV9BTk5PVEFUSU9OUyA6PSAtLWluY2x1ZGUtYW5ub3RhdGlvbnMgLS1taWdyYXRlLW51bGxuZXNzIFwKKyAgICAtLWV4dHJhY3QtYW5ub3RhdGlvbnMgJChUQVJHRVRfT1VUX0NPTU1PTl9JTlRFUk1FRElBVEVTKS9QQUNLQUdJTkcvJChMT0NBTF9NT0RVTEUpX2Fubm90YXRpb25zLnppcCBcCisgICAgLS1tZXJnZS1hbm5vdGF0aW9ucyAkKExPQ0FMX0RST0lERE9DX01FVEFMQVZBX01FUkdFX0FOTk9UQVRJT05TX0RJUikgXAorICAgIC0taGlkZSBIaWRkZW5UeXBlZGVmQ29uc3RhbnQgLS1oaWRlIFN1cGVyZmx1b3VzUHJlZml4IC0taGlkZSBBbm5vdGF0aW9uRXh0cmFjdGlvbgorbWV0YWxhdmFfYW5ub3RhdGlvbnNfZGVwcyA6PSAkKHNvcnQgJChzaGVsbCBmaW5kICQoTE9DQUxfRFJPSURET0NfTUVUQUxBVkFfTUVSR0VfQU5OT1RBVElPTlNfRElSKSAtdHlwZSBmKSkKK2Vsc2UKKyQoZnVsbF90YXJnZXQpOiBQUklWQVRFX0RST0lERE9DX01FVEFMQVZBX0FOTk9UQVRJT05TIDo9CitlbmRpZiAjTE9DQUxfRFJPSURET0NfTUVUQUxBVkFfQU5OT1RBVElPTlNfRU5BQkxFRD10cnVlCisKK2lmbmVxICgsJChmaWx0ZXIgLS1nZW5lcmF0ZS1kb2N1bWVudGF0aW9uLCQoTE9DQUxfRFJPSURET0NfT1BUSU9OUykpKQorCitwb3MgPSAkKGlmICQoZmluZHN0cmluZyAkMSwkMiksJChjYWxsIHBvcywkMSwkKHdvcmRsaXN0IDIsJCh3b3JkcyAkMiksJDIpLHggJDMpLCQzKQorbWV0YWxhdmFfYXJncyA6PSAkKHdvcmRsaXN0IDEsICQod29yZHMgJChjYWxsIHBvcywtLWdlbmVyYXRlLWRvY3VtZW50YXRpb24sJChMT0NBTF9EUk9JRERPQ19PUFRJT05TKSkpLCBcCisgICAgJChMT0NBTF9EUk9JRERPQ19PUFRJT05TKSkKK3JlbWFpbmluZ19hcmdzIDo9ICAkKHdvcmRsaXN0ICQod29yZHMgJChjYWxsIHBvcywtLWdlbmVyYXRlLWRvY3VtZW50YXRpb24sJChMT0NBTF9EUk9JRERPQ19PUFRJT05TKSkpLCBcCisgICAgJCh3b3JkcyAkKExPQ0FMX0RST0lERE9DX09QVElPTlMpKSwgJChMT0NBTF9EUk9JRERPQ19PUFRJT05TKSkKK2RvY2xhdmFfYXJncyA6PSAkKHdvcmRsaXN0IDIsICQod29yZHMgJChyZW1haW5pbmdfYXJncykpLCAkKHJlbWFpbmluZ19hcmdzKSkKKworJChmdWxsX3RhcmdldCk6IFwKKyAgICAgICAgJChmdWxsX3NyY19maWxlcykgJChMT0NBTF9HRU5FUkFURURfU09VUkNFUykgXAorICAgICAgICAkKGRyb2lkZG9jX3RlbXBsYXRlcykgXAorICAgICAgICAkKEhPU1RfSkRLX1RPT0xTX0pBUikgXAorICAgICAgICAkKEhPU1RfT1VUX0pBVkFfTElCUkFSSUVTKS9qc2lsdmVyJChDT01NT05fSkFWQV9QQUNLQUdFX1NVRkZJWCkgXAorICAgICAgICAkKEhPU1RfT1VUX0pBVkFfTElCUkFSSUVTKS9kb2NsYXZhJChDT01NT05fSkFWQV9QQUNLQUdFX1NVRkZJWCkgXAorICAgICAgICAkKEhPU1RfT1VUX0pBVkFfTElCUkFSSUVTKS9tZXRhbGF2YSQoQ09NTU9OX0pBVkFfUEFDS0FHRV9TVUZGSVgpIFwKKyAgICAgICAgJChodG1sX2Rpcl9maWxlcykgXAorICAgICAgICAkKGZ1bGxfamF2YV9saWJzKSBcCisgICAgICAgICQoWklQU1lOQykgXAorICAgICAgICAkKExPQ0FMX1NSQ0pBUlMpIFwKKyAgICAgICAgJChMT0NBTF9BRERJVElPTkFMX0RFUEVOREVOQ0lFUykgXAorICAgICAgICAkKExPQ0FMX0RST0lERE9DX01FVEFMQVZBX1BSRVZJT1VTX0FQSSkgXAorICAgICAgICAkKG1ldGFsYXZhX2Fubm90YXRpb25zX2RlcHMpCisJQGVjaG8gbWV0YWxhdmEgYmFzZWQgZG9jczogJChQUklWQVRFX09VVF9ESVIpCisJJChoaWRlKSBta2RpciAtcCAkKGRpciAkQCkKKwkkKGhpZGUpIHJtIC1yZiAkKFBSSVZBVEVfU1RVQl9PVVRfRElSKQorCSQoaGlkZSkgcm0gLXJmICQoUFJJVkFURV9NRVRBTEFWQV9ET0NTX1NUVUJfT1VUX0RJUikKKwkkKGNhbGwgcHJlcGFyZS1kb2Mtc291cmNlLWxpc3QsJChQUklWQVRFX1NSQ19MSVNUX0ZJTEUpLCQoUFJJVkFURV9KQVZBX0ZJTEVTKSwgXAorCQkJJChQUklWQVRFX1NPVVJDRV9JTlRFUk1FRElBVEVTX0RJUikgJChQUklWQVRFX0FERElUSU9OQUxfSkFWQV9ESVIpKQorCSQoWklQU1lOQykgLWQgJChQUklWQVRFX1NSQ0pBUl9JTlRFUk1FRElBVEVTX0RJUikgLWwgJChQUklWQVRFX1NSQ0pBUl9MSVNUX0ZJTEUpIC1mICIqLmphdmEiICQoUFJJVkFURV9TUkNKQVJTKQorCSQoaGlkZSkgKCBcCisJCSQoSkFWQSkgLWphciAkKEhPU1RfT1VUX0pBVkFfTElCUkFSSUVTKS9tZXRhbGF2YSQoQ09NTU9OX0pBVkFfUEFDS0FHRV9TVUZGSVgpIFwKKyAgICAgICAgICAgICAgICAtZW5jb2RpbmcgVVRGLTggLXNvdXJjZSAxLjggXEAkKFBSSVZBVEVfU1JDX0xJU1RfRklMRSkgXEAkKFBSSVZBVEVfU1JDSkFSX0xJU1RfRklMRSkgXAorICAgICAgICAgICAgICAgICQoYWRkcHJlZml4IC1ib290Y2xhc3NwYXRoICwkKFBSSVZBVEVfQk9PVENMQVNTUEFUSCkpIFwKKyAgICAgICAgICAgICAgICAkKGFkZHByZWZpeCAtY2xhc3NwYXRoICwkKFBSSVZBVEVfQ0xBU1NQQVRIKSkgXAorICAgICAgICAgICAgICAgIC0tc291cmNlcGF0aCAkKFBSSVZBVEVfU09VUkNFX1BBVEgpIFwKKyAgICAgICAgICAgICAgICAtLW5vLWJhbm5lciAtLWNvbG9yIC0tcXVpZXQgXAorICAgICAgICAgICAgICAgICQoYWRkcHJlZml4IC0tc3R1YnMgLCQoUFJJVkFURV9TVFVCX09VVF9ESVIpKSBcCisgICAgICAgICAgICAgICAgJChhZGRwcmVmaXggLS1kb2Mtc3R1YnMgLCQoUFJJVkFURV9NRVRBTEFWQV9ET0NTX1NUVUJfT1VUX0RJUikpIFwKKyAgICAgICAgICAgICAgICAtLXdyaXRlLXN0dWJzLXNvdXJjZS1saXN0ICQoaW50ZXJtZWRpYXRlcy5DT01NT04pL3N0dWJzLXNyYy1saXN0IFwKKyAgICAgICAgICAgICAgICAkKG1ldGFsYXZhX2FyZ3MpICQoUFJJVkFURV9EUk9JRERPQ19NRVRBTEFWQV9QUkVWSU9VU19BUEkpICQoUFJJVkFURV9EUk9JRERPQ19NRVRBTEFWQV9BTk5PVEFUSU9OUykgXAorICAgICAgICAgICAgICAgICQoSkFWQURPQykgLWVuY29kaW5nIFVURi04IC1zb3VyY2UgMS44IFNUVUJTX1NPVVJDRV9MSVNUIFwKKyAgICAgICAgICAgICAgICAtSi1YbXgxNjAwbSAtSi1YWDotT21pdFN0YWNrVHJhY2VJbkZhc3RUaHJvdyAtWERpZ25vcmUuc3ltYm9sLmZpbGUgXAorICAgICAgICAgICAgICAgIC1xdWlldCAtZG9jbGV0IGNvbS5nb29nbGUuZG9jbGF2YS5Eb2NsYXZhIC1kb2NsZXRwYXRoICQoUFJJVkFURV9ET0NMRVRQQVRIKSBcCisgICAgICAgICAgICAgICAgLXRlbXBsYXRlZGlyICQoUFJJVkFURV9DVVNUT01fVEVNUExBVEVfRElSKSBcCisgICAgICAgICAgICAgICAgJChQUklWQVRFX0RST0lERE9DX0hUTUxfRElSKSAkKFBSSVZBVEVfQURESVRJT05BTF9IVE1MX0RJUikgXAorICAgICAgICAgICAgICAgICQoYWRkcHJlZml4IC1ib290Y2xhc3NwYXRoICwkKFBSSVZBVEVfQk9PVENMQVNTUEFUSCkpIFwKKyAgICAgICAgICAgICAgICAkKGFkZHByZWZpeCAtY2xhc3NwYXRoICwkKFBSSVZBVEVfQ0xBU1NQQVRIKSkgXAorICAgICAgICAgICAgICAgIC1zb3VyY2VwYXRoICQoUFJJVkFURV9TT1VSQ0VfUEFUSCkgXAorICAgICAgICAgICAgICAgIC1kICQoUFJJVkFURV9PVVRfRElSKSBcCisgICAgICAgICAgICAgICAgJChQUklWQVRFX0NVUlJFTlRfQlVJTEQpICQoUFJJVkFURV9DVVJSRU5UX1RJTUUpICQoZG9jbGF2YV9hcmdzKSBcCisgICAgICAgICYmIHRvdWNoIC1mICRAICkgfHwgKHJtIC1yZiAkKFBSSVZBVEVfT1VUX0RJUikgJChQUklWQVRFX1NSQ19MSVNUX0ZJTEUpOyBleGl0IDQ1KQorZWxzZQorIyBubyBkb2NzIGdlbmVyYXRpb24KKyQoZnVsbF90YXJnZXQpOiBcCisgICAgICAgICQoZnVsbF9zcmNfZmlsZXMpICQoTE9DQUxfR0VORVJBVEVEX1NPVVJDRVMpIFwKKyAgICAgICAgJChmdWxsX2phdmFfbGlicykgXAorICAgICAgICAkKEhPU1RfT1VUX0pBVkFfTElCUkFSSUVTKS9tZXRhbGF2YSQoQ09NTU9OX0pBVkFfUEFDS0FHRV9TVUZGSVgpIFwKKyAgICAgICAgJChaSVBTWU5DKSBcCisgICAgICAgICQoTE9DQUxfU1JDSkFSUykgXAorICAgICAgICAkKExPQ0FMX0FERElUSU9OQUxfREVQRU5ERU5DSUVTKQorCUBlY2hvIG1ldGFsYXZhIGJhc2VkIHN0dWJzOiAkQAorCSQoaGlkZSkgbWtkaXIgLXAgJChkaXIgJEApCisJJChoaWRlKSBybSAtcmYgJChQUklWQVRFX1NUVUJfT1VUX0RJUikKKwkkKGNhbGwgcHJlcGFyZS1kb2Mtc291cmNlLWxpc3QsJChQUklWQVRFX1NSQ19MSVNUX0ZJTEUpLCQoUFJJVkFURV9KQVZBX0ZJTEVTKSwgXAorCQkJJChQUklWQVRFX1NPVVJDRV9JTlRFUk1FRElBVEVTX0RJUikgJChQUklWQVRFX0FERElUSU9OQUxfSkFWQV9ESVIpKQorCSQoWklQU1lOQykgLWQgJChQUklWQVRFX1NSQ0pBUl9JTlRFUk1FRElBVEVTX0RJUikgLWwgJChQUklWQVRFX1NSQ0pBUl9MSVNUX0ZJTEUpIC1mICIqLmphdmEiICQoUFJJVkFURV9TUkNKQVJTKQorCSQoaGlkZSkgKCBcCisJCSQoSkFWQSkgLWphciAkKEhPU1RfT1VUX0pBVkFfTElCUkFSSUVTKS9tZXRhbGF2YSQoQ09NTU9OX0pBVkFfUEFDS0FHRV9TVUZGSVgpIFwKKyAgICAgICAgICAgICAgICAtZW5jb2RpbmcgVVRGLTggLXNvdXJjZSAxLjggXEAkKFBSSVZBVEVfU1JDX0xJU1RfRklMRSkgXEAkKFBSSVZBVEVfU1JDSkFSX0xJU1RfRklMRSkgXAorICAgICAgICAgICAgICAgICQoYWRkcHJlZml4IC1ib290Y2xhc3NwYXRoICwkKFBSSVZBVEVfQk9PVENMQVNTUEFUSCkpIFwKKyAgICAgICAgICAgICAgICAkKGFkZHByZWZpeCAtY2xhc3NwYXRoICwkKFBSSVZBVEVfQ0xBU1NQQVRIKSkgXAorICAgICAgICAgICAgICAgIC0tc291cmNlcGF0aCAkKFBSSVZBVEVfU09VUkNFX1BBVEgpIFwKKyAgICAgICAgICAgICAgICAkKFBSSVZBVEVfRFJPSURET0NfT1BUSU9OUykgJChQUklWQVRFX0RST0lERE9DX01FVEFMQVZBX1BSRVZJT1VTX0FQSSkgJChQUklWQVRFX0RST0lERE9DX01FVEFMQVZBX0FOTk9UQVRJT05TKSBcCisgICAgICAgICAgICAgICAgLS1uby1iYW5uZXIgLS1jb2xvciAtLXF1aWV0IFwKKyAgICAgICAgICAgICAgICAkKGFkZHByZWZpeCAtLXN0dWJzICwkKFBSSVZBVEVfU1RVQl9PVVRfRElSKSkgXAorICAgICAgICAmJiB0b3VjaCAtZiAkQCApIHx8IChybSAtcmYgJChQUklWQVRFX1NSQ19MSVNUX0ZJTEUpOyBleGl0IDQ1KQorCitlbmRpZiAjIHN0dWJzICsgZG9jcyBnZW5lcmF0aW9uCitpZmVxICgkKHN0cmlwICQoTE9DQUxfRFJPSURET0NfTUVUQUxBVkFfQU5OT1RBVElPTlNfRU5BQkxFRCkpLHRydWUpCiskKFRBUkdFVF9PVVRfQ09NTU9OX0lOVEVSTUVESUFURVMpL1BBQ0tBR0lORy8kKExPQ0FMX01PRFVMRSlfYW5ub3RhdGlvbnMuemlwOiAkKGZ1bGxfdGFyZ2V0KQorZW5kaWYKKworZWxzZSAjIGRvY2xhdmEgYmFzZWQgZHJvaWRkb2MgZ2VuZXJhdGlvbgorCiAjIFRPRE8odG9iaWFzdCk6IENsZWFuIHRoaXMgdXAgb25jZSB3ZSBtb3ZlIHRvIC1zb3VyY2UgMS45LgogIyBPcGVuSkRLIDkgZG9lcyBub3QgaGF2ZSB0aGUgY29uY2VwdCBvZiBhICJib290IGNsYXNzcGF0aCIgc28gd2Ugc2hvdWxkCiAjIHRoZW4gcmVuYW1lIFBSSVZBVEVfQk9PVENMQVNTUEFUSCB0byBQUklWQVRFX01PRFVMRSBvciBzaW1pbGFyLiBGb3Igbm93LAogIyBrZWVwIC1ib290Y2xhc3NwYXRoIGhlcmUgc2luY2UgaXQgd29ya3MgaW4gY29tYmluYXRpb24gd2l0aCAtc291cmNlIDEuOC4KICQoZnVsbF90YXJnZXQpOiBcCi0gICAgICAgICQoZnVsbF9zcmNfZmlsZXMpIFwKKyAgICAgICAgJChmdWxsX3NyY19maWxlcykgJChMT0NBTF9HRU5FUkFURURfU09VUkNFUykgXAogICAgICAgICAkKGRyb2lkZG9jX3RlbXBsYXRlcykgXAotICAgICAgICAkKGRyb2lkZG9jKSBcCisgICAgICAgICQoSE9TVF9KREtfVE9PTFNfSkFSKSBcCisgICAgICAgICQoSE9TVF9PVVRfSkFWQV9MSUJSQVJJRVMpL2pzaWx2ZXIkKENPTU1PTl9KQVZBX1BBQ0tBR0VfU1VGRklYKSBcCisgICAgICAgICQoSE9TVF9PVVRfSkFWQV9MSUJSQVJJRVMpL2RvY2xhdmEkKENPTU1PTl9KQVZBX1BBQ0tBR0VfU1VGRklYKSBcCiAgICAgICAgICQoaHRtbF9kaXJfZmlsZXMpIFwKLSAgICAgICAgJChmdWxsX2phdmFfbGliX2RlcHMpIFwKKyAgICAgICAgJChmdWxsX2phdmFfbGlicykgXAorICAgICAgICAkKFpJUFNZTkMpIFwKKyAgICAgICAgJChMT0NBTF9TUkNKQVJTKSBcCiAgICAgICAgICQoTE9DQUxfQURESVRJT05BTF9ERVBFTkRFTkNJRVMpCiAJQGVjaG8gRG9jcyBkcm9pZGRvYzogJChQUklWQVRFX09VVF9ESVIpCiAJJChoaWRlKSBta2RpciAtcCAkKGRpciAkQCkKLQkkKGFkZHByZWZpeCAkKGhpZGUpIHJtIC1yZiAsJChQUklWQVRFX1NUVUJfT1VUX0RJUikpCisJJChoaWRlKSBybSAtcmYgJChQUklWQVRFX1NUVUJfT1VUX0RJUikKIAkkKGNhbGwgcHJlcGFyZS1kb2Mtc291cmNlLWxpc3QsJChQUklWQVRFX1NSQ19MSVNUX0ZJTEUpLCQoUFJJVkFURV9KQVZBX0ZJTEVTKSwgXAogCQkJJChQUklWQVRFX1NPVVJDRV9JTlRFUk1FRElBVEVTX0RJUikgJChQUklWQVRFX0FERElUSU9OQUxfSkFWQV9ESVIpKQorCSQoWklQU1lOQykgLWQgJChQUklWQVRFX1NSQ0pBUl9JTlRFUk1FRElBVEVTX0RJUikgLWwgJChQUklWQVRFX1NSQ0pBUl9MSVNUX0ZJTEUpIC1mICIqLmphdmEiICQoUFJJVkFURV9TUkNKQVJTKQogCSQoaGlkZSkgKCBcCiAJCSQoSkFWQURPQykgXAotICAgICAgICAgICAgICAgIC1lbmNvZGluZyBVVEYtOCBcCi0gICAgICAgICAgICAgICAgLXNvdXJjZSAxLjggXAotICAgICAgICAgICAgICAgIFxAJChQUklWQVRFX1NSQ19MSVNUX0ZJTEUpIFwKLSAgICAgICAgICAgICAgICAtSi1YbXgxNjAwbSBcCi0gICAgICAgICAgICAgICAgLUotWFg6LU9taXRTdGFja1RyYWNlSW5GYXN0VGhyb3cgXAotICAgICAgICAgICAgICAgIC1YRGlnbm9yZS5zeW1ib2wuZmlsZSBcCi0gICAgICAgICAgICAgICAgJChQUklWQVRFX1BST0ZJTElOR19PUFRJT05TKSBcCi0gICAgICAgICAgICAgICAgLXF1aWV0IFwKLSAgICAgICAgICAgICAgICAtZG9jbGV0IGNvbS5nb29nbGUuZG9jbGF2YS5Eb2NsYXZhIFwKLSAgICAgICAgICAgICAgICAtZG9jbGV0cGF0aCAkKFBSSVZBVEVfRE9DTEVUUEFUSCkgXAorICAgICAgICAgICAgICAgIC1lbmNvZGluZyBVVEYtOCAtc291cmNlIDEuOCBcQCQoUFJJVkFURV9TUkNfTElTVF9GSUxFKSBcQCQoUFJJVkFURV9TUkNKQVJfTElTVF9GSUxFKSBcCisgICAgICAgICAgICAgICAgLUotWG14MTYwMG0gLUotWFg6LU9taXRTdGFja1RyYWNlSW5GYXN0VGhyb3cgLVhEaWdub3JlLnN5bWJvbC5maWxlIFwKKyAgICAgICAgICAgICAgICAtcXVpZXQgLWRvY2xldCBjb20uZ29vZ2xlLmRvY2xhdmEuRG9jbGF2YSAtZG9jbGV0cGF0aCAkKFBSSVZBVEVfRE9DTEVUUEFUSCkgXAogICAgICAgICAgICAgICAgIC10ZW1wbGF0ZWRpciAkKFBSSVZBVEVfQ1VTVE9NX1RFTVBMQVRFX0RJUikgXAotICAgICAgICAgICAgICAgICQoUFJJVkFURV9EUk9JRERPQ19IVE1MX0RJUikgXAotICAgICAgICAgICAgICAgICQoUFJJVkFURV9BRERJVElPTkFMX0hUTUxfRElSKSBcCisgICAgICAgICAgICAgICAgJChQUklWQVRFX0RST0lERE9DX0hUTUxfRElSKSAkKFBSSVZBVEVfQURESVRJT05BTF9IVE1MX0RJUikgXAogICAgICAgICAgICAgICAgICQoYWRkcHJlZml4IC1ib290Y2xhc3NwYXRoICwkKFBSSVZBVEVfQk9PVENMQVNTUEFUSCkpIFwKICAgICAgICAgICAgICAgICAkKGFkZHByZWZpeCAtY2xhc3NwYXRoICwkKFBSSVZBVEVfQ0xBU1NQQVRIKSkgXAogICAgICAgICAgICAgICAgIC1zb3VyY2VwYXRoICQoUFJJVkFURV9TT1VSQ0VfUEFUSCkkKGFkZHByZWZpeCA6LCQoUFJJVkFURV9DTEFTU1BBVEgpKSBcCiAgICAgICAgICAgICAgICAgLWQgJChQUklWQVRFX09VVF9ESVIpIFwKLSAgICAgICAgICAgICAgICAkKFBSSVZBVEVfQ1VSUkVOVF9CVUlMRCkgJChQUklWQVRFX0NVUlJFTlRfVElNRSkgXAotICAgICAgICAgICAgICAgICQoUFJJVkFURV9EUk9JRERPQ19PUFRJT05TKSBcCisgICAgICAgICAgICAgICAgJChQUklWQVRFX0NVUlJFTlRfQlVJTEQpICQoUFJJVkFURV9DVVJSRU5UX1RJTUUpICQoUFJJVkFURV9EUk9JRERPQ19PUFRJT05TKSBcCiAgICAgICAgICAgICAgICAgJChhZGRwcmVmaXggLXN0dWJzICwkKFBSSVZBVEVfU1RVQl9PVVRfRElSKSkgXAotICAgICAgICAmJiB0b3VjaCAtZiAkQCBcCi0gICAgKSB8fCAocm0gLXJmICQoUFJJVkFURV9PVVRfRElSKSAkKFBSSVZBVEVfU1JDX0xJU1RfRklMRSk7IGV4aXQgNDUpCi0KLQorICAgICAgICAmJiB0b3VjaCAtZiAkQCApIHx8IChybSAtcmYgJChQUklWQVRFX09VVF9ESVIpICQoUFJJVkFURV9TUkNfTElTVF9GSUxFKTsgZXhpdCA0NSkKK2VuZGlmICNMT0NBTF9EUk9JRERPQ19VU0VfTUVUQUxBVkEKIAogZWxzZQotIyMKLSMjCi0jIyBzdGFuZGFyZCBkb2NsZXQgb25seQotIyMKLSMjCiAKLWlmbmVxICgkKEVYUEVSSU1FTlRBTF9VU0VfT1BFTkpESzkpLCkKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyBMb2dpYyBmb3IgamF2YWRvYyBvbmx5CisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworaWZkZWYgVVNFX09QRU5KREs5CiAjIEZvciBPcGVuSkRLIDkgd2UgdXNlIC0tcGF0Y2gtbW9kdWxlIHRvIGRlZmluZSB0aGUgY29yZSBsaWJyYXJpZXMgY29kZS4KICMgVE9ETyh0b2JpYXN0KTogUmVvcmdhbml6ZSB0aGlzIHdoZW4gYWRkaW5nIHByb3BlciBzdXBwb3J0IGZvciBPcGVuSkRLIDkKICMgbW9kdWxlcy4gSGVyZSB3ZSB0cmVhdCBhbGwgY29kZSBpbiBjb3JlIGxpYnJhcmllcyBhcyBiZWluZyBpbiBqYXZhLmJhc2UKQEAgLTIyNiwzNyArMzI3LDIyIEBACiAjIEZvciBPcGVuSkRLIDggd2UgY2FuIHVzZSAtYm9vdGNsYXNzcGF0aCB0byBkZWZpbmUgdGhlIGNvcmUgbGlicmFyaWVzIGNvZGUuCiAkKGZ1bGxfdGFyZ2V0KTogUFJJVkFURV9CT09UQ0xBU1NQQVRIX0FSRyA6PSAkKGFkZHByZWZpeCAtYm9vdGNsYXNzcGF0aCAsJChQUklWQVRFX0JPT1RDTEFTU1BBVEgpKQogZW5kaWYKLQotJChmdWxsX3RhcmdldCk6ICQoZnVsbF9zcmNfZmlsZXMpICQoZnVsbF9qYXZhX2xpYl9kZXBzKQorJChmdWxsX3RhcmdldCk6ICQoZnVsbF9zcmNfZmlsZXMpICQoTE9DQUxfR0VORVJBVEVEX1NPVVJDRVMpICQoZnVsbF9qYXZhX2xpYnMpICQoWklQU1lOQykgJChMT0NBTF9TUkNKQVJTKSAkKExPQ0FMX0FERElUSU9OQUxfREVQRU5ERU5DSUVTKQogCUBlY2hvIERvY3MgamF2YWRvYzogJChQUklWQVRFX09VVF9ESVIpCiAJQG1rZGlyIC1wICQoZGlyICRAKQogCSQoY2FsbCBwcmVwYXJlLWRvYy1zb3VyY2UtbGlzdCwkKFBSSVZBVEVfU1JDX0xJU1RfRklMRSksJChQUklWQVRFX0pBVkFfRklMRVMpLCBcCiAJCQkkKFBSSVZBVEVfU09VUkNFX0lOVEVSTUVESUFURVNfRElSKSAkKFBSSVZBVEVfQURESVRJT05BTF9KQVZBX0RJUikpCisJJChaSVBTWU5DKSAtZCAkKFBSSVZBVEVfU1JDSkFSX0lOVEVSTUVESUFURVNfRElSKSAtbCAkKFBSSVZBVEVfU1JDSkFSX0xJU1RfRklMRSkgLWYgIiouamF2YSIgJChQUklWQVRFX1NSQ0pBUlMpCiAJJChoaWRlKSAoIFwKLQkJJChKQVZBRE9DKSBcCi0gICAgICAgICAgICAgICAgLWVuY29kaW5nIFVURi04IFwKLSAgICAgICAgICAgICAgICAkKFBSSVZBVEVfRFJPSURET0NfT1BUSU9OUykgXAotICAgICAgICAgICAgICAgIFxAJChQUklWQVRFX1NSQ19MSVNUX0ZJTEUpIFwKLSAgICAgICAgICAgICAgICAtSi1YbXgxMDI0bSBcCi0gICAgICAgICAgICAgICAgLVhEaWdub3JlLnN5bWJvbC5maWxlIFwKLSAgICAgICAgICAgICAgICAtWGRvY2xpbnQ6bm9uZSBcCi0gICAgICAgICAgICAgICAgJChQUklWQVRFX1BST0ZJTElOR19PUFRJT05TKSBcCi0gICAgICAgICAgICAgICAgJChhZGRwcmVmaXggLWNsYXNzcGF0aCAsJChQUklWQVRFX0NMQVNTUEFUSCkpIFwKLSAgICAgICAgICAgICAgICAkKFBSSVZBVEVfQk9PVENMQVNTUEFUSF9BUkcpIFwKLSAgICAgICAgICAgICAgICAtc291cmNlcGF0aCAkKFBSSVZBVEVfU09VUkNFX1BBVEgpJChhZGRwcmVmaXggOiwkKFBSSVZBVEVfQ0xBU1NQQVRIKSkgXAorCQkkKEpBVkFET0MpIC1lbmNvZGluZyBVVEYtOCBcQCQoUFJJVkFURV9TUkNfTElTVF9GSUxFKSBcQCQoUFJJVkFURV9TUkNKQVJfTElTVF9GSUxFKSBcCisgICAgICAgICAgICAgICAgJChQUklWQVRFX0RST0lERE9DX09QVElPTlMpIC1KLVhteDEwMjRtIC1YRGlnbm9yZS5zeW1ib2wuZmlsZSAtWGRvY2xpbnQ6bm9uZSAtcXVpZXQgXAorICAgICAgICAgICAgICAgICQoYWRkcHJlZml4IC1jbGFzc3BhdGggLCQoUFJJVkFURV9DTEFTU1BBVEgpKSAkKFBSSVZBVEVfQk9PVENMQVNTUEFUSF9BUkcpIFwKKyAgICAgICAgICAgICAgICAtc291cmNlcGF0aCAkKFBSSVZBVEVfU09VUkNFX1BBVEgpIFwKICAgICAgICAgICAgICAgICAtZCAkKFBSSVZBVEVfT1VUX0RJUikgXAotICAgICAgICAgICAgICAgIC1xdWlldCBcCiAgICAgICAgICYmIHRvdWNoIC1mICRAIFwKICAgICApIHx8IChybSAtcmYgJChQUklWQVRFX09VVF9ESVIpICQoUFJJVkFURV9TUkNfTElTVF9GSUxFKTsgZXhpdCA0NSkKIAotCi1lbmRpZgotIyMKLSMjCi0jIyBDb21tb24gdG8gYm90aCBkcm9pZGRvYyBhbmQgamF2YWRvYwotIyMKLSMjCi0KK2VuZGlmICMgIUxPQ0FMX0RST0lERE9DX1VTRV9TVEFOREFSRF9ET0NMRVQKIAogQUxMX0RPQ1MgKz0gJChmdWxsX3RhcmdldCkKIApAQCAtMjc4LDQgKzM2NCw0IEBACiAKICQoY2FsbCBkaXN0LWZvci1nb2Fscyxkb2NzLCQob3V0X3ppcCkpCiAKLWVuZGlmCitlbmRpZiAjIUxPQ0FMX1VOSU5TVEFMTEFCTEVfTU9EVUxFCmRpZmYgLS1naXQgYS9jb3JlL2R1bXB2YXIubWsgYi9jb3JlL2R1bXB2YXIubWsKaW5kZXggYWNhZTQ4ZS4uNTllZmIwNCAxMDA2NDQKLS0tIGEvY29yZS9kdW1wdmFyLm1rCisrKyBiL2NvcmUvZHVtcHZhci5tawpAQCAtMSwzNyArMSwzIEBACi0KLSMgTGlzdCBvZiB2YXJpYWJsZXMgd2Ugd2FudCB0byBwcmludCBpbiB0aGUgYnVpbGQgYmFubmVyLgotcHJpbnRfYnVpbGRfY29uZmlnX3ZhcnMgOj0gXAotICBQTEFURk9STV9WRVJTSU9OX0NPREVOQU1FIFwKLSAgUExBVEZPUk1fVkVSU0lPTiBcCi0gIFRBUkdFVF9QUk9EVUNUIFwKLSAgVEFSR0VUX0JVSUxEX1ZBUklBTlQgXAotICBUQVJHRVRfQlVJTERfVFlQRSBcCi0gIFRBUkdFVF9QTEFURk9STV9WRVJTSU9OIFwKLSAgVEFSR0VUX0JVSUxEX0FQUFMgXAotICBUQVJHRVRfQVJDSCBcCi0gIFRBUkdFVF9BUkNIX1ZBUklBTlQgXAotICBUQVJHRVRfQ1BVX1ZBUklBTlQgXAotICBUQVJHRVRfMk5EX0FSQ0ggXAotICBUQVJHRVRfMk5EX0FSQ0hfVkFSSUFOVCBcCi0gIFRBUkdFVF8yTkRfQ1BVX1ZBUklBTlQgXAotICBIT1NUX0FSQ0ggXAotICBIT1NUXzJORF9BUkNIIFwKLSAgSE9TVF9PUyBcCi0gIEhPU1RfT1NfRVhUUkEgXAotICBIT1NUX0NST1NTX09TIFwKLSAgSE9TVF9DUk9TU19BUkNIIFwKLSAgSE9TVF9DUk9TU18yTkRfQVJDSCBcCi0gIEhPU1RfQlVJTERfVFlQRSBcCi0gIEJVSUxEX0lEIFwKLSAgT1VUX0RJUiBcCi0gIEFVWF9PU19WQVJJQU5UX0xJU1QKLQotaWZlcSAoJChUQVJHRVRfQlVJTERfUERLKSx0cnVlKQotcHJpbnRfYnVpbGRfY29uZmlnX3ZhcnMgKz0gXAotICBUQVJHRVRfQlVJTERfUERLIFwKLSAgUERLX0ZVU0lPTl9QTEFURk9STV9aSVAKLWVuZGlmCi0KICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAjIHRoZSBzZXRwYXRoIHNoZWxsIGZ1bmN0aW9uIGluIGVudnNldHVwLnNoIHVzZXMgdGhpcyB0byBmaWd1cmUgb3V0CiAjIHdoYXQgdG8gYWRkIHRvIHRoZSBwYXRoIGdpdmVuIHRoZSBjb25maWcgd2UgaGF2ZSBjaG9zZW4uCkBAIC01Miw3OSArMTgsMTQgQEAKIEFORFJPSURfUFJFQlVJTFRTIDo9IHByZWJ1aWx0LyQoSE9TVF9QUkVCVUlMVF9UQUcpCiBBTkRST0lEX0dDQ19QUkVCVUlMVFMgOj0gcHJlYnVpbHRzL2djYy8kKEhPU1RfUFJFQlVJTFRfVEFHKQogCi0jIFRoZSAiZHVtcHZhciIgc3R1ZmYgbGV0cyB5b3Ugc2F5IHNvbWV0aGluZyBsaWtlCi0jCi0jICAgICBDQUxMRURfRlJPTV9TRVRVUD10cnVlIFwKLSMgICAgICAgbWFrZSAtZiBjb25maWcvZW52c2V0dXAubWFrZSBkdW1wdmFyLVRBUkdFVF9PVVQKLSMgb3IKLSMgICAgIENBTExFRF9GUk9NX1NFVFVQPXRydWUgXAotIyAgICAgICBtYWtlIC1mIGNvbmZpZy9lbnZzZXR1cC5tYWtlIGR1bXB2YXItYWJzLUhPU1RfT1VUX0VYRUNVVEFCTEVTCi0jCi0jIFRoZSBwbGFpbiAobm9uLWFicykgdmVyc2lvbiBqdXN0IGR1bXBzIHRoZSB2YWx1ZSBvZiB0aGUgbmFtZWQgdmFyaWFibGUuCi0jIFRoZSAiYWJzIiB2ZXJzaW9uIHdpbGwgdHJlYXQgdGhlIHZhcmlhYmxlIGFzIGEgcGF0aCwgYW5kIGR1bXBzIGFuCi0jIGFic29sdXRlIHBhdGggdG8gaXQuCi0jCi1kdW1wdmFyX2dvYWxzIDo9IFwKLQkkKHN0cmlwICQocGF0c3Vic3QgZHVtcHZhci0lLCUsJChmaWx0ZXIgZHVtcHZhci0lLCQoTUFLRUNNREdPQUxTKSkpKQotaWZkZWYgZHVtcHZhcl9nb2FscwotCi0gIGlmbmVxICgkKHdvcmRzICQoZHVtcHZhcl9nb2FscykpLDEpCi0gICAgJChlcnJvciBPbmx5IG9uZSAiZHVtcHZhci0iIGdvYWwgYWxsb3dlZC4gU2F3ICIkKE1BS0VDTURHT0FMUykiKQotICBlbmRpZgotCi0gICMgSWYgdGhlIGdvYWwgaXMgb2YgdGhlIGZvcm0gImR1bXB2YXItYWJzLVZBUk5BTUUiLCB0aGVuCi0gICMgdHJlYXQgVkFSTkFNRSBhcyBhIHBhdGggYW5kIHJldHVybiB0aGUgYWJzb2x1dGUgcGF0aCB0byBpdC4KLSAgYWJzb2x1dGVfZHVtcHZhciA6PSAkKHN0cmlwICQoZmlsdGVyIGFicy0lLCQoZHVtcHZhcl9nb2FscykpKQotICBpZmRlZiBhYnNvbHV0ZV9kdW1wdmFyCi0gICAgZHVtcHZhcl9nb2FscyA6PSAkKHBhdHN1YnN0IGFicy0lLCUsJChkdW1wdmFyX2dvYWxzKSkKLSAgICBEVU1QVkFSX1ZBTFVFIDo9ICQoYWJzcGF0aCAkKCQoZHVtcHZhcl9nb2FscykpKQotICAgIGR1bXB2YXJfdGFyZ2V0IDo9IGR1bXB2YXItYWJzLSQoZHVtcHZhcl9nb2FscykKLSAgZWxzZQotICAgIERVTVBWQVJfVkFMVUUgOj0gJCgkKGR1bXB2YXJfZ29hbHMpKQotICAgIGR1bXB2YXJfdGFyZ2V0IDo9IGR1bXB2YXItJChkdW1wdmFyX2dvYWxzKQotICBlbmRpZgotCi0uUEhPTlk6ICQoZHVtcHZhcl90YXJnZXQpCi0kKGR1bXB2YXJfdGFyZ2V0KToKLQlAZWNobyAkKERVTVBWQVJfVkFMVUUpCi0KLWVuZGlmICMgZHVtcHZhcl9nb2FscwotCi1pZm5lcSAoJChkdW1wdmFyX2dvYWxzKSxyZXBvcnRfY29uZmlnKQotUFJJTlRfQlVJTERfQ09ORklHOj0KLWVuZGlmCi0KLWlmbmVxICgkKGZpbHRlciByZXBvcnRfY29uZmlnLCQoRFVNUF9NQU5ZX1ZBUlMpKSwpCi0jIENvbnN0cnVjdCB0aGUgc2hlbGwgY29tbWFuZHMgdGhhdCBwcmludCB0aGUgY29uZmlnIGJhbm5lci4KLXJlcG9ydF9jb25maWdfc2ggOj0gZWNobyAnPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0nOwotcmVwb3J0X2NvbmZpZ19zaCArPSAkKGZvcmVhY2ggdiwkKHByaW50X2J1aWxkX2NvbmZpZ192YXJzKSxlY2hvICckdj0kKCQodikpJzspCi1yZXBvcnRfY29uZmlnX3NoICs9IGVjaG8gJz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09JzsKLWVuZGlmCi0KICMgRHVtcCBtdWxpdHBsZSB2YXJpYWJsZXMgdG8gIjx2YXI+PTx2YWx1ZT4iIHBhaXJzLCBvbmUgcGVyIGxpbmUuCiAjIFRoZSBvdXRwdXQgbWF5IGJlIGV4ZWN1dGVkIGFzIGJhc2ggc2NyaXB0LgogIyBJbnB1dCB2YXJpYWJsZXM6CiAjICAgRFVNUF9NQU5ZX1ZBUlM6IHRoZSBsaXN0IG9mIHZhcmlhYmxlIG5hbWVzLgogIyAgIERVTVBfVkFSX1BSRUZJWDogYW4gb3B0aW9uYWwgcHJlZml4IG9mIHRoZSB2YXJpYWJsZSBuYW1lIGFkZGVkIHRvIHRoZSBvdXRwdXQuCi0jICAgRFVNUF9NQU5ZX0FCU19WQVJTOiB0aGUgbGlzdCBvZiBhYnMgdmFyaWFibGUgbmFtZXMuCi0jICAgRFVNUF9BQlNfVkFSX1BSRUZJWDogYW4gb3B0aW9uYWwgcHJlZml4IG9mIHRoZSBhYnMgdmFyaWFibGUgbmFtZSBhZGRlZCB0byB0aGUgb3V0cHV0LgogLlBIT05ZOiBkdW1wLW1hbnktdmFycwogZHVtcC1tYW55LXZhcnMgOgotCUAkKGZvcmVhY2ggdiwgJChmaWx0ZXItb3V0IHJlcG9ydF9jb25maWcsICQoRFVNUF9NQU5ZX1ZBUlMpKSxcCisJQCQoZm9yZWFjaCB2LCAkKERVTVBfTUFOWV9WQVJTKSxcCiAJICBlY2hvICIkKERVTVBfVkFSX1BSRUZJWCkkKHYpPSckKCQodikpJyI7KQotaWZuZXEgKCQoZmlsdGVyIHJlcG9ydF9jb25maWcsICQoRFVNUF9NQU5ZX1ZBUlMpKSwpCi0JQCMgQ29uc3RydWN0IGEgc3BlY2lhbCB2YXJpYWJsZSBmb3IgcmVwb3J0X2NvbmZpZy4KLQlAIyBFc2NhcGUgXGAgdG8gZGVmZXIgdGhlIGV4ZWN1dGlvbiBvZiByZXBvcnRfY29uZmlnX3NoIHRvIHByZXNlcnZlIHRoZSBsaW5lIGJyZWFrcy4KLQlAZWNobyAiJChEVU1QX1ZBUl9QUkVGSVgpcmVwb3J0X2NvbmZpZz1cYCQocmVwb3J0X2NvbmZpZ19zaClcYCIKLWVuZGlmCi0JQCQoZm9yZWFjaCB2LCAkKHNvcnQgJChEVU1QX01BTllfQUJTX1ZBUlMpKSxcCi0JICBlY2hvICIkKERVTVBfQUJTX1ZBUl9QUkVGSVgpJCh2KT0nJChhYnNwYXRoICQoJCh2KSkpJyI7KQogCiBlbmRpZiAjIENBTExFRF9GUk9NX1NFVFVQCi0KLWlmbmVxICgkKFBSSU5UX0JVSUxEX0NPTkZJRyksKQotJChpbmZvID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09KQotJChmb3JlYWNoIHYsICQocHJpbnRfYnVpbGRfY29uZmlnX3ZhcnMpLFwKLSAgJChpbmZvICR2PSQoJCh2KSkpKQotJChpbmZvID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09KQotZW5kaWYKZGlmZiAtLWdpdCBhL2NvcmUvZHluYW1pY19iaW5hcnkubWsgYi9jb3JlL2R5bmFtaWNfYmluYXJ5Lm1rCmluZGV4IDk0OTc5M2IuLmY0NGI4YTggMTAwNjQ0Ci0tLSBhL2NvcmUvZHluYW1pY19iaW5hcnkubWsKKysrIGIvY29yZS9keW5hbWljX2JpbmFyeS5tawpAQCAtOTksMTAgKzk5LDE1IEBACiBteV9icmVha3BhZF9wYXRoIDo9ICQoVEFSR0VUX09VVF9CUkVBS1BBRCkvJChwYXRzdWJzdCAkKFBST0RVQ1RfT1VUKS8lLCUsJChteV9tb2R1bGVfcGF0aCkpCiBicmVha3BhZF9pbnB1dCA6PSAkKHJlbG9jYXRpb25fcGFja2VyX291dHB1dCkKIGJyZWFrcGFkX291dHB1dCA6PSAkKG15X2JyZWFrcGFkX3BhdGgpLyQobXlfaW5zdGFsbGVkX21vZHVsZV9zdGVtKS5zeW0KLSQoYnJlYWtwYWRfb3V0cHV0KSA6ICQoYnJlYWtwYWRfaW5wdXQpIHwgJChCUkVBS1BBRF9EVU1QX1NZTVMpCiskKGJyZWFrcGFkX291dHB1dCkgOiAkKGJyZWFrcGFkX2lucHV0KSB8ICQoQlJFQUtQQURfRFVNUF9TWU1TKSAkKFBSSVZBVEVfUkVBREVMRikKIAlAZWNobyAidGFyZ2V0IGJyZWFrcGFkOiAkKFBSSVZBVEVfTU9EVUxFKSAoJEApIgogCUBta2RpciAtcCAkKGRpciAkQCkKLQkkKGhpZGUpICQoQlJFQUtQQURfRFVNUF9TWU1TKSAtYyAkPCA+ICRACisJJChoaWRlKSBpZiAkKFBSSVZBVEVfUkVBREVMRikgLVMgJDwgPiAvZGV2L251bGwgMj4mMSA7IHRoZW4gXAorCSAgJChCUkVBS1BBRF9EVU1QX1NZTVMpIC1jICQ8ID4gJEAgOyBcCisJZWxzZSBcCisJICBlY2hvICJza2lwcGVkIGZvciBub24tZWxmIGZpbGUuIjsgXAorCSAgdG91Y2ggJEA7IFwKKwlmaQogJChMT0NBTF9CVUlMVF9NT0RVTEUpIDogJChicmVha3BhZF9vdXRwdXQpCiBlbmRpZgogCmRpZmYgLS1naXQgYS9jb3JlL2VtcHR5X3Rlc3RfY29uZmlnLnhtbCBiL2NvcmUvZW1wdHlfdGVzdF9jb25maWcueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjOWRhZmYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2VtcHR5X3Rlc3RfY29uZmlnLnhtbApAQCAtMCwwICsxLDE5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPCEtLSBObyBBbmRyb2lkVGVzdC54bWwgd2FzIHByb3ZpZGVkIGFuZCB0aGUgbWFuaWZlc3QgZG9lcyBub3QgaW5jbHVkZQorICAgICBpbnN0cnVtZW50YXRpb24sIGhlbmNlIHRoaXMgYXBrIGlzIG5vdCBpbnN0cnVtZW50YWJsZS4KKy0tPgorPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IkVtcHR5IENvbmZpZ3VyYXRpb24iIC8+CmRpZmYgLS1naXQgYS9jb3JlL2VudnNldHVwLm1rIGIvY29yZS9lbnZzZXR1cC5tawppbmRleCA0NjA2NmUzLi43MDAxODllIDEwMDY0NAotLS0gYS9jb3JlL2VudnNldHVwLm1rCisrKyBiL2NvcmUvZW52c2V0dXAubWsKQEAgLTk3LDggKzk3LDYgQEAKICMgY29tcGlsZXMgZXhjZXB0IGZvciBhcm0vbWlwcywgc28gdGhlIEhPU1QgaXMgd2hhdGV2ZXIgd2UgYXJlCiAjIHJ1bm5pbmcgb24KIAotVU5BTUUgOj0gJChzaGVsbCB1bmFtZSAtc20pCi0KICMgSE9TVF9PUwogaWZuZXEgKCwkKGZpbmRzdHJpbmcgTGludXgsJChVTkFNRSkpKQogICBIT1NUX09TIDo9IGxpbnV4CkBAIC0xMTAsNyArMTA4LDE1IEBACiAgIEhPU1RfT1MgOj0gZGFyd2luCiBlbmRpZgogCi1IT1NUX09TX0VYVFJBOj0kKHNoZWxsIHB5dGhvbiAtYyAiaW1wb3J0IHBsYXRmb3JtOyBwcmludChwbGF0Zm9ybS5wbGF0Zm9ybSgpKSIpCitIT1NUX09TX0VYVFJBIDo9ICQoc2hlbGwgdW5hbWUgLXJzbSkKK2lmZXEgKCQoSE9TVF9PUyksbGludXgpCisgIGlmbmVxICgkKHdpbGRjYXJkIC9ldGMvb3MtcmVsZWFzZSksKQorICAgIEhPU1RfT1NfRVhUUkEgKz0gJChzaGVsbCBzb3VyY2UgL2V0Yy9vcy1yZWxlYXNlOyBlY2hvICQkUFJFVFRZX05BTUUpCisgIGVuZGlmCitlbHNlIGlmZXEgKCQoSE9TVF9PUyksZGFyd2luKQorICBIT1NUX09TX0VYVFJBICs9ICQoc2hlbGwgc3dfdmVycyAtcHJvZHVjdFZlcnNpb24pCitlbmRpZgorSE9TVF9PU19FWFRSQSA6PSAkKHN1YnN0ICQoc3BhY2UpLC0sJChIT1NUX09TX0VYVFJBKSkKIAogIyBCVUlMRF9PUyBpcyB0aGUgcmVhbCBob3N0IGRvaW5nIHRoZSBidWlsZC4KIEJVSUxEX09TIDo9ICQoSE9TVF9PUykKQEAgLTExOCwxMSArMTI0LDEzIEBACiBIT1NUX0NST1NTX09TIDo9CiAjIFdlIGNhbiBjcm9zcy1idWlsZCBXaW5kb3dzIGJpbmFyaWVzIG9uIExpbnV4CiBpZmVxICgkKEhPU1RfT1MpLGxpbnV4KQoraWZlcSAoJChCVUlMRF9IT1NUX3N0YXRpYyksKQogSE9TVF9DUk9TU19PUyA6PSB3aW5kb3dzCiBIT1NUX0NST1NTX0FSQ0ggOj0geDg2CiBIT1NUX0NST1NTXzJORF9BUkNIIDo9IHg4Nl82NAogMk5EX0hPU1RfQ1JPU1NfSVNfNjRfQklUIDo9IHRydWUKIGVuZGlmCitlbmRpZgogCiBpZmVxICgkKEhPU1RfT1MpLCkKICQoZXJyb3IgVW5hYmxlIHRvIGRldGVybWluZSBIT1NUX09TIGZyb20gdW5hbWUgLXNtOiAkKFVOQU1FKSEpCkBAIC0xNzEsNiArMTc5LDcgQEAKIFRBUkdFVF9DT1BZX09VVF9BU0FOIDo9ICQoVEFSR0VUX0NPUFlfT1VUX0RBVEEpL2FzYW4KIFRBUkdFVF9DT1BZX09VVF9PRU0gOj0gb2VtCiBUQVJHRVRfQ09QWV9PVVRfT0RNIDo9IG9kbQorVEFSR0VUX0NPUFlfT1VUX1BST0RVQ1QgOj0gcHJvZHVjdAogVEFSR0VUX0NPUFlfT1VUX1JPT1QgOj0gcm9vdAogVEFSR0VUX0NPUFlfT1VUX1JFQ09WRVJZIDo9IHJlY292ZXJ5CiAKQEAgLTE5MCwxMCArMTk5LDI5IEBACiBUQVJHRVRfQ09QWV9PVVRfVkVORE9SIDo9ICQoX3ZlbmRvcl9wYXRoX3BsYWNlaG9sZGVyKQogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIERlZmluZSBUQVJHRVRfQ09QWV9PVVRfUFJPRFVDVCB0byBhIHBsYWNlaG9sZGVyLCBmb3IgYXQgdGhpcyBwb2ludAorIyB3ZSBkb24ndCBrbm93IGlmIHRoZSBkZXZpY2Ugd2FudHMgdG8gYnVpbGQgYSBzZXBhcmF0ZSBwcm9kdWN0LmltZworIyBvciBqdXN0IGJ1aWxkIHByb2R1Y3Qgc3R1ZmYgaW50byBzeXN0ZW0uaW1nLgorIyBBIGRldmljZSBjYW4gc2V0IHVwIFRBUkdFVF9DT1BZX09VVF9QUk9EVUNUIHRvICJwcm9kdWN0IiBpbiBpdHMKKyMgQm9hcmRDb25maWcubWsuCisjIFdlJ2xsIHN1YnN0aXR1dGUgd2l0aCB0aGUgcmVhbCB2YWx1ZSBhZnRlciBsb2FkaW5nIEJvYXJkQ29uZmlnLm1rLgorX3Byb2R1Y3RfcGF0aF9wbGFjZWhvbGRlciA6PSB8fFBST0RVQ1QtUEFUSC1QSHx8CitUQVJHRVRfQ09QWV9PVVRfUFJPRFVDVCA6PSAkKF9wcm9kdWN0X3BhdGhfcGxhY2Vob2xkZXIpCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAjIFNldCB1cCBtaW5pbWFsIEJPT1RDTEFTU1BBVEggbGlzdCBvZiBqYXJzIHRvIGJ1aWxkL2V4ZWN1dGUKICMgamF2YSBjb2RlIHdpdGggZGFsdmlrdm0vYXJ0LgogVEFSR0VUX0NPUkVfSkFSUyA6PSBjb3JlLW9qIGNvcmUtbGliYXJ0IGNvbnNjcnlwdCBva2h0dHAgYm91bmN5Y2FzdGxlIGFwYWNoZS14bWwKK2lmZXEgKCQoRU1NQV9JTlNUUlVNRU5UKSx0cnVlKQorICBpZm5lcSAoJChFTU1BX0lOU1RSVU1FTlRfU1RBVElDKSx0cnVlKQorICAgICMgRm9yIGluc3RydW1lbnRlZCBidWlsZCwgaWYgSmFjb2NvIGlzIG5vdCBiZWluZyBpbmNsdWRlZCBzdGF0aWNhbGx5CisgICAgIyBpbiBpbnN0cnVtZW50ZWQgcGFja2FnZXMgdGhlbiBpbmNsdWRlIEphY29jbyBjbGFzc2VzIGludG8gdGhlCisgICAgIyBib290Y2xhc3NwYXRoLgorICAgIFRBUkdFVF9DT1JFX0pBUlMgKz0gamFjb2NvYWdlbnQKKyAgZW5kaWYgIyBFTU1BX0lOU1RSVU1FTlRfU1RBVElDCitlbmRpZiAjIEVNTUFfSU5TVFJVTUVOVAogSE9TVF9DT1JFX0pBUlMgOj0gJChhZGRzdWZmaXggLWhvc3RkZXgsJChUQVJHRVRfQ09SRV9KQVJTKSkKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAKQEAgLTI1Nyw2ICsyODUsMjkgQEAKIGVsc2UgaWZkZWYgQk9BUkRfVVNFU19WRU5ET1JJTUFHRQogJChlcnJvciBUQVJHRVRfQ09QWV9PVVRfVkVORE9SIG11c3QgYmUgc2V0IHRvICd2ZW5kb3InIHRvIHVzZSBhIHZlbmRvciBpbWFnZSkKIGVuZGlmCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgTm93IHdlIGNhbiBzdWJzdGl0dXRlIHdpdGggdGhlIHJlYWwgdmFsdWUgb2YgVEFSR0VUX0NPUFlfT1VUX1BST0RVQ1QKK2lmZXEgKCQoVEFSR0VUX0NPUFlfT1VUX1BST0RVQ1QpLCQoX3Byb2R1Y3RfcGF0aF9wbGFjZWhvbGRlcikpCitUQVJHRVRfQ09QWV9PVVRfUFJPRFVDVCA6PSBzeXN0ZW0vcHJvZHVjdAorZWxzZSBpZmVxICgkKGZpbHRlciBwcm9kdWN0IHN5c3RlbS9wcm9kdWN0LCQoVEFSR0VUX0NPUFlfT1VUX1BST0RVQ1QpKSwpCiskKGVycm9yIFRBUkdFVF9DT1BZX09VVF9QUk9EVUNUIG11c3QgYmUgZWl0aGVyICdwcm9kdWN0JyBvciAnc3lzdGVtL3Byb2R1Y3QnLCBzZWVpbmcgJyQoVEFSR0VUX0NPUFlfT1VUX1BST0RVQ1QpJy4pCitlbmRpZgorUFJPRFVDVF9DT1BZX0ZJTEVTIDo9ICQoc3Vic3QgJChfcHJvZHVjdF9wYXRoX3BsYWNlaG9sZGVyKSwkKFRBUkdFVF9DT1BZX09VVF9QUk9EVUNUKSwkKFBST0RVQ1RfQ09QWV9GSUxFUykpCisKK0JPQVJEX1VTRVNfUFJPRFVDVElNQUdFIDo9CitpZmRlZiBCT0FSRF9QUkVCVUlMVF9QUk9EVUNUSU1BR0UKK0JPQVJEX1VTRVNfUFJPRFVDVElNQUdFIDo9IHRydWUKK2VuZGlmCitpZmRlZiBCT0FSRF9QUk9EVUNUSU1BR0VfRklMRV9TWVNURU1fVFlQRQorQk9BUkRfVVNFU19QUk9EVUNUSU1BR0UgOj0gdHJ1ZQorZW5kaWYKK2lmZXEgKCQoVEFSR0VUX0NPUFlfT1VUX1BST0RVQ1QpLHByb2R1Y3QpCitCT0FSRF9VU0VTX1BST0RVQ1RJTUFHRSA6PSB0cnVlCitlbHNlIGlmZGVmIEJPQVJEX1VTRVNfUFJPRFVDVElNQUdFCiskKGVycm9yIFRBUkdFVF9DT1BZX09VVF9QUk9EVUNUIG11c3QgYmUgc2V0IHRvICdwcm9kdWN0JyB0byB1c2UgYSBwcm9kdWN0IGltYWdlKQorZW5kaWYKKwogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIyBFbnN1cmUgdGhhdCBvbmx5IFRBUkdFVF9SRUNPVkVSWV9VUERBVEVSX0xJQlMgKm9yKiBBQl9PVEFfVVBEQVRFUiBpcyBzZXQuCiBUQVJHRVRfUkVDT1ZFUllfVVBEQVRFUl9MSUJTID89CkBAIC0yNjksNiArMzIwLDExIEBACiBlbmRpZgogCiAjIENoZWNrIEJPQVJEX1ZOREtfVkVSU0lPTgorZGVmaW5lIGNoZWNrX3ZuZGtfdmVyc2lvbgorICAkKGV2YWwgdm5ka19wYXRoIDo9IHByZWJ1aWx0cy92bmRrL3YkKDEpKSBcCisgICQoaWYgJCh3aWxkY2FyZCAkKHZuZGtfcGF0aCkvKi9BbmRyb2lkLmJwKSwsJChlcnJvciBWTkRLIHZlcnNpb24gJCgxKSBub3QgZm91bmQpKQorZW5kZWYKKwogaWZkZWYgQk9BUkRfVk5ES19WRVJTSU9OCiAgIGlmbmVxICgkKEJPQVJEX1ZOREtfVkVSU0lPTiksY3VycmVudCkKICAgICAkKGVycm9yIEJPQVJEX1ZOREtfVkVSU0lPTjogT25seSAiY3VycmVudCIgaXMgaW1wbGVtZW50ZWQpCkBAIC0yNzksNiArMzM1LDE3IEBACiAgIFRBUkdFVF9WRU5ET1JfVEVTVF9TVUZGSVggOj0KIGVuZGlmCiAKK2lmZGVmIFBST0RVQ1RfRVhUUkFfVk5ES19WRVJTSU9OUworICAkKGZvcmVhY2ggdiwkKFBST0RVQ1RfRVhUUkFfVk5ES19WRVJTSU9OUyksJChjYWxsIGNoZWNrX3ZuZGtfdmVyc2lvbiwkKHYpKSkKK2VuZGlmCisKKyMgRW5zdXJlIHRoYXQgQk9BUkRfU1lTVEVNU0RLX1ZFUlNJT05TIGFyZSBhbGwgd2l0aGluIFBMQVRGT1JNX1NZU1RFTVNES19WRVJTSU9OUworX3Vuc3VwcG9ydGVkX3N5c3RlbXNka192ZXJzaW9ucyA6PSAkKGZpbHRlci1vdXQgJChQTEFURk9STV9TWVNURU1TREtfVkVSU0lPTlMpLCQoQk9BUkRfU1lTVEVNU0RLX1ZFUlNJT05TKSkKK2lmbmVxICgsJChfdW5zdXBwb3J0ZWRfc3lzdGVtc2RrX3ZlcnNpb25zKSkKKyAgJChlcnJvciBTeXN0ZW0gU0RLIHZlcnNpb25zICckKF91bnN1cHBvcnRlZF9zeXN0ZW1zZGtfdmVyc2lvbnMpJyBpbiBCT0FSRF9TWVNURU1TREtfVkVSU0lPTlMgYXJlIG5vdCBzdXBwb3J0ZWQuXAorICAgICAgICAgIFN1cHBvcnRlZCB2ZXJzaW9ucyBhcmUgJChQTEFURk9STV9TWVNURU1TREtfVkVSU0lPTlMpKQorZW5kaWYKKwogIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICMgU2V0IHVwIGNvbmZpZ3VyYXRpb24gZm9yIHRhcmdldCBtYWNoaW5lLgogIyBUaGUgZm9sbG93aW5nIG11c3QgYmUgc2V0OgpAQCAtMzA5LDI5ICszNzYsMTcgQEAKIAogU09PTkdfT1VUX0RJUiA6PSAkKE9VVF9ESVIpL3Nvb25nCiAKLURFQlVHX09VVF9ESVIgOj0gJChPVVRfRElSKS9kZWJ1ZworVEFSR0VUX09VVF9ST09UIDo9ICQoT1VUX0RJUikvdGFyZ2V0CiAKLSMgTW92ZSB0aGUgaG9zdCBvciB0YXJnZXQgdW5kZXIgdGhlIGRlYnVnLyBkaXJlY3RvcnkKLSMgaWYgbmVjZXNzYXJ5LgotVEFSR0VUX09VVF9ST09UX3JlbGVhc2UgOj0gJChPVVRfRElSKS90YXJnZXQKLVRBUkdFVF9PVVRfUk9PVF9kZWJ1ZyA6PSAkKERFQlVHX09VVF9ESVIpL3RhcmdldAotVEFSR0VUX09VVF9ST09UIDo9ICQoVEFSR0VUX09VVF9ST09UXyQoVEFSR0VUX0JVSUxEX1RZUEUpKQotCi1IT1NUX09VVF9ST09UX3JlbGVhc2UgOj0gJChPVVRfRElSKS9ob3N0Ci1IT1NUX09VVF9ST09UX2RlYnVnIDo9ICQoREVCVUdfT1VUX0RJUikvaG9zdAotSE9TVF9PVVRfUk9PVCA6PSAkKEhPU1RfT1VUX1JPT1RfJChIT1NUX0JVSUxEX1RZUEUpKQorSE9TVF9PVVRfUk9PVCA6PSAkKE9VVF9ESVIpL2hvc3QKIAogIyBXZSB3YW50IHRvIGF2b2lkIHR3byBob3N0IGJpbiBkaXJlY3RvcmllcyBpbiBtdWx0aWxpYiBidWlsZC4KLUhPU1RfT1VUX3JlbGVhc2UgOj0gJChIT1NUX09VVF9ST09UX3JlbGVhc2UpLyQoSE9TVF9PUyktJChIT1NUX1BSRUJVSUxUX0FSQ0gpCi1IT1NUX09VVF9kZWJ1ZyA6PSAkKEhPU1RfT1VUX1JPT1RfZGVidWcpLyQoSE9TVF9PUyktJChIT1NUX1BSRUJVSUxUX0FSQ0gpCi1IT1NUX09VVCA6PSAkKEhPU1RfT1VUXyQoSE9TVF9CVUlMRF9UWVBFKSkKK0hPU1RfT1VUIDo9ICQoSE9TVF9PVVRfUk9PVCkvJChIT1NUX09TKS0kKEhPU1RfUFJFQlVJTFRfQVJDSCkKIFNPT05HX0hPU1RfT1VUIDo9ICQoU09PTkdfT1VUX0RJUikvaG9zdC8kKEhPU1RfT1MpLSQoSE9TVF9QUkVCVUlMVF9BUkNIKQogIyBUT0RPOiByZW1vdmUKIEJVSUxEX09VVCA6PSAkKEhPU1RfT1VUKQogCi1IT1NUX0NST1NTX09VVF9yZWxlYXNlIDo9ICQoSE9TVF9PVVRfUk9PVF9yZWxlYXNlKS93aW5kb3dzLSQoSE9TVF9QUkVCVUlMVF9BUkNIKQotSE9TVF9DUk9TU19PVVRfZGVidWcgOj0gJChIT1NUX09VVF9ST09UX2RlYnVnKS93aW5kb3dzLSQoSE9TVF9QUkVCVUlMVF9BUkNIKQotSE9TVF9DUk9TU19PVVQgOj0gJChIT1NUX0NST1NTX09VVF8kKEhPU1RfQlVJTERfVFlQRSkpCitIT1NUX0NST1NTX09VVCA6PSAkKEhPU1RfT1VUX1JPT1QpL3dpbmRvd3MtJChIT1NUX1BSRUJVSUxUX0FSQ0gpCiAKIFRBUkdFVF9QUk9EVUNUX09VVF9ST09UIDo9ICQoVEFSR0VUX09VVF9ST09UKS9wcm9kdWN0CiAKQEAgLTM0MSw2ICszOTYsNyBAQAogUFJPRFVDVF9PVVQgOj0gJChUQVJHRVRfUFJPRFVDVF9PVVRfUk9PVCkvJChUQVJHRVRfREVWSUNFKQogCiBPVVRfRE9DUyA6PSAkKFRBUkdFVF9DT01NT05fT1VUX1JPT1QpL2RvY3MKK09VVF9OREtfRE9DUyA6PSAkKFRBUkdFVF9DT01NT05fT1VUX1JPT1QpL25kay1kb2NzCiAKIEJVSUxEX09VVF9FWEVDVVRBQkxFUyA6PSAkKEJVSUxEX09VVCkvYmluCiBTT09OR19IT1NUX09VVF9FWEVDVVRBQkxFUyA6PSAkKFNPT05HX0hPU1RfT1VUKS9iaW4KQEAgLTM1MiwxMiArNDA4LDEzIEBACiBIT1NUX09VVF9TREtfQURET04gOj0gJChIT1NUX09VVCkvc2RrX2FkZG9uCiBIT1NUX09VVF9OQVRJVkVfVEVTVFMgOj0gJChIT1NUX09VVCkvbmF0aXZldGVzdDY0CiBIT1NUX09VVF9DT1ZFUkFHRSA6PSAkKEhPU1RfT1VUKS9jb3ZlcmFnZQorSE9TVF9PVVRfVEVTVENBU0VTIDo9ICQoSE9TVF9PVVQpL3Rlc3RjYXNlcwogCiBIT1NUX0NST1NTX09VVF9FWEVDVVRBQkxFUyA6PSAkKEhPU1RfQ1JPU1NfT1VUKS9iaW4KIEhPU1RfQ1JPU1NfT1VUX1NIQVJFRF9MSUJSQVJJRVMgOj0gJChIT1NUX0NST1NTX09VVCkvbGliCiBIT1NUX0NST1NTX09VVF9OQVRJVkVfVEVTVFMgOj0gJChIT1NUX0NST1NTX09VVCkvbmF0aXZldGVzdAogSE9TVF9DUk9TU19PVVRfQ09WRVJBR0UgOj0gJChIT1NUX0NST1NTX09VVCkvY292ZXJhZ2UKLUhPU1RfT1VUX1RFU1RDQVNFUyA6PSAkKEhPU1RfT1VUKS90ZXN0Y2FzZXMKK0hPU1RfQ1JPU1NfT1VUX1RFU1RDQVNFUyA6PSAkKEhPU1RfQ1JPU1NfT1VUKS90ZXN0Y2FzZXMKIAogSE9TVF9PVVRfSU5URVJNRURJQVRFUyA6PSAkKEhPU1RfT1VUKS9vYmoKIEhPU1RfT1VUX0lOVEVSTUVESUFURV9MSUJSQVJJRVMgOj0gJChIT1NUX09VVF9JTlRFUk1FRElBVEVTKS9saWIKQEAgLTM3Nyw2ICs0MzQsOCBAQAogCiBIT1NUX0NST1NTX09VVF9HRU4gOj0gJChIT1NUX0NST1NTX09VVCkvZ2VuCiAKK0hPU1RfT1VUX1RFU1RfQ09ORklHIDo9ICQoSE9TVF9PVVQpL3Rlc3RfY29uZmlnCisKICMgT3V0IGZvciBIT1NUXzJORF9BUkNICiBIT1NUXzJORF9BUkNIX1ZBUl9QUkVGSVggOj0gMk5EXwogSE9TVF8yTkRfQVJDSF9NT0RVTEVfU1VGRklYIDo9IF8zMgpAQCAtNDIxLDggKzQ4MCwxNiBAQAogVEFSR0VUX09VVCA6PSAkKFBST0RVQ1RfT1VUKS8kKFRBUkdFVF9DT1BZX09VVF9TWVNURU0pCiBpZm5lcSAoJChmaWx0ZXIgYWRkcmVzcywkKFNBTklUSVpFX1RBUkdFVCkpLCkKIHRhcmdldF9vdXRfc2hhcmVkX2xpYnJhcmllc19iYXNlIDo9ICQoUFJPRFVDVF9PVVQpLyQoVEFSR0VUX0NPUFlfT1VUX0FTQU4pL3N5c3RlbQoraWZlcSAoJChTQU5JVElaRV9MSVRFKSx0cnVlKQorIyBXaGVuIHVzaW5nIFNBTklUSVpFX0xJVEUsIEFQS3MgbXVzdCBub3QgYmUgcGFja2FnZWQgd2l0aCBzYW5pdGl6ZWQgbGlicmFyaWVzLCBhcyB0aGV5IHdpbGwgbm90CisjIHdvcmsgd2l0aCB1bnNhbml0aXplZCBhcHBfcHJvY2Vzcy4gRm9yIHNpbXBsaWNpdHksIGdlbmVyYXRlIEFQS3MgaW50byAvZGF0YS9hc2FuLy4KK3RhcmdldF9vdXRfYXBwX2Jhc2UgOj0gJChQUk9EVUNUX09VVCkvJChUQVJHRVRfQ09QWV9PVVRfQVNBTikvc3lzdGVtCitlbHNlCit0YXJnZXRfb3V0X2FwcF9iYXNlIDo9ICQoVEFSR0VUX09VVCkKK2VuZGlmCiBlbHNlCiB0YXJnZXRfb3V0X3NoYXJlZF9saWJyYXJpZXNfYmFzZSA6PSAkKFRBUkdFVF9PVVQpCit0YXJnZXRfb3V0X2FwcF9iYXNlIDo9ICQoVEFSR0VUX09VVCkKIGVuZGlmCiAKIFRBUkdFVF9PVVRfRVhFQ1VUQUJMRVMgOj0gJChUQVJHRVRfT1VUKS9iaW4KQEAgLTQzNiwxNiArNTAzLDIzIEBACiBlbmRpZgogVEFSR0VUX09VVF9SRU5ERVJTQ1JJUFRfQklUQ09ERSA6PSAkKFRBUkdFVF9PVVRfU0hBUkVEX0xJQlJBUklFUykKIFRBUkdFVF9PVVRfSkFWQV9MSUJSQVJJRVMgOj0gJChUQVJHRVRfT1VUKS9mcmFtZXdvcmsKLVRBUkdFVF9PVVRfQVBQUyA6PSAkKFRBUkdFVF9PVVQpL2FwcAotVEFSR0VUX09VVF9BUFBTX1BSSVZJTEVHRUQgOj0gJChUQVJHRVRfT1VUKS9wcml2LWFwcAorVEFSR0VUX09VVF9BUFBTIDo9ICQodGFyZ2V0X291dF9hcHBfYmFzZSkvYXBwCitUQVJHRVRfT1VUX0FQUFNfUFJJVklMRUdFRCA6PSAkKHRhcmdldF9vdXRfYXBwX2Jhc2UpL3ByaXYtYXBwCiBUQVJHRVRfT1VUX0tFWUxBWU9VVCA6PSAkKFRBUkdFVF9PVVQpL3Vzci9rZXlsYXlvdXQKIFRBUkdFVF9PVVRfS0VZQ0hBUlMgOj0gJChUQVJHRVRfT1VUKS91c3Iva2V5Y2hhcnMKIFRBUkdFVF9PVVRfRVRDIDo9ICQoVEFSR0VUX09VVCkvZXRjCiBUQVJHRVRfT1VUX05PVElDRV9GSUxFUyA6PSAkKFRBUkdFVF9PVVRfSU5URVJNRURJQVRFUykvTk9USUNFX0ZJTEVTCiBUQVJHRVRfT1VUX0ZBS0UgOj0gJChQUk9EVUNUX09VVCkvZmFrZV9wYWNrYWdlcwogVEFSR0VUX09VVF9URVNUQ0FTRVMgOj0gJChQUk9EVUNUX09VVCkvdGVzdGNhc2VzCitUQVJHRVRfT1VUX1RFU1RfQ09ORklHIDo9ICQoUFJPRFVDVF9PVVQpL3Rlc3RfY29uZmlnCiAKK2lmZXEgKCQoU0FOSVRJWkVfTElURSksdHJ1ZSkKKyMgV2hlbiB1c2luZyBTQU5JVElaRV9MSVRFLCBBUEtzIG11c3Qgbm90IGJlIHBhY2thZ2VkIHdpdGggc2FuaXRpemVkIGxpYnJhcmllcywgYXMgdGhleSB3aWxsIG5vdAorIyB3b3JrIHdpdGggdW5zYW5pdGl6ZWQgYXBwX3Byb2Nlc3MuIEZvciBzaW1wbGljaXR5LCBnZW5lcmF0ZSBBUEtzIGludG8gL2RhdGEvYXNhbi8uCitUQVJHRVRfT1VUX1NZU1RFTV9PVEhFUiA6PSAkKFBST0RVQ1RfT1VUKS8kKFRBUkdFVF9DT1BZX09VVF9BU0FOKS8kKFRBUkdFVF9DT1BZX09VVF9TWVNURU1fT1RIRVIpCitlbHNlCiBUQVJHRVRfT1VUX1NZU1RFTV9PVEhFUiA6PSAkKFBST0RVQ1RfT1VUKS8kKFRBUkdFVF9DT1BZX09VVF9TWVNURU1fT1RIRVIpCitlbmRpZgogCiAjIE91dCBmb3IgVEFSR0VUXzJORF9BUkNICiBUQVJHRVRfMk5EX0FSQ0hfVkFSX1BSRUZJWCA6PSAkKEhPU1RfMk5EX0FSQ0hfVkFSX1BSRUZJWCkKQEAgLTUxNCw4ICs1ODgsMTYgQEAKIFRBUkdFVF9PVVRfVkVORE9SIDo9ICQoUFJPRFVDVF9PVVQpLyQoVEFSR0VUX0NPUFlfT1VUX1ZFTkRPUikKIGlmbmVxICgkKGZpbHRlciBhZGRyZXNzLCQoU0FOSVRJWkVfVEFSR0VUKSksKQogdGFyZ2V0X291dF92ZW5kb3Jfc2hhcmVkX2xpYnJhcmllc19iYXNlIDo9ICQoUFJPRFVDVF9PVVQpLyQoVEFSR0VUX0NPUFlfT1VUX0FTQU4pL3ZlbmRvcgoraWZlcSAoJChTQU5JVElaRV9MSVRFKSx0cnVlKQorIyBXaGVuIHVzaW5nIFNBTklUSVpFX0xJVEUsIEFQS3MgbXVzdCBub3QgYmUgcGFja2FnZWQgd2l0aCBzYW5pdGl6ZWQgbGlicmFyaWVzLCBhcyB0aGV5IHdpbGwgbm90CisjIHdvcmsgd2l0aCB1bnNhbml0aXplZCBhcHBfcHJvY2Vzcy4gRm9yIHNpbXBsaWNpdHksIGdlbmVyYXRlIEFQS3MgaW50byAvZGF0YS9hc2FuLy4KK3RhcmdldF9vdXRfdmVuZG9yX2FwcF9iYXNlIDo9ICQoUFJPRFVDVF9PVVQpLyQoVEFSR0VUX0NPUFlfT1VUX0FTQU4pL3ZlbmRvcgorZWxzZQordGFyZ2V0X291dF92ZW5kb3JfYXBwX2Jhc2UgOj0gJChUQVJHRVRfT1VUX1ZFTkRPUikKK2VuZGlmCiBlbHNlCiB0YXJnZXRfb3V0X3ZlbmRvcl9zaGFyZWRfbGlicmFyaWVzX2Jhc2UgOj0gJChUQVJHRVRfT1VUX1ZFTkRPUikKK3RhcmdldF9vdXRfdmVuZG9yX2FwcF9iYXNlIDo9ICQoVEFSR0VUX09VVF9WRU5ET1IpCiBlbmRpZgogCiBUQVJHRVRfT1VUX1ZFTkRPUl9FWEVDVVRBQkxFUyA6PSAkKFRBUkdFVF9PVVRfVkVORE9SKS9iaW4KQEAgLTUyNyw4ICs2MDksOCBAQAogZW5kaWYKIFRBUkdFVF9PVVRfVkVORE9SX1JFTkRFUlNDUklQVF9CSVRDT0RFIDo9ICQoVEFSR0VUX09VVF9WRU5ET1JfU0hBUkVEX0xJQlJBUklFUykKIFRBUkdFVF9PVVRfVkVORE9SX0pBVkFfTElCUkFSSUVTIDo9ICQoVEFSR0VUX09VVF9WRU5ET1IpL2ZyYW1ld29yawotVEFSR0VUX09VVF9WRU5ET1JfQVBQUyA6PSAkKFRBUkdFVF9PVVRfVkVORE9SKS9hcHAKLVRBUkdFVF9PVVRfVkVORE9SX0FQUFNfUFJJVklMRUdFRCA6PSAkKFRBUkdFVF9PVVRfVkVORE9SKS9wcml2LWFwcAorVEFSR0VUX09VVF9WRU5ET1JfQVBQUyA6PSAkKHRhcmdldF9vdXRfdmVuZG9yX2FwcF9iYXNlKS9hcHAKK1RBUkdFVF9PVVRfVkVORE9SX0FQUFNfUFJJVklMRUdFRCA6PSAkKHRhcmdldF9vdXRfdmVuZG9yX2FwcF9iYXNlKS9wcml2LWFwcAogVEFSR0VUX09VVF9WRU5ET1JfRVRDIDo9ICQoVEFSR0VUX09VVF9WRU5ET1IpL2V0YwogCiAkKFRBUkdFVF8yTkRfQVJDSF9WQVJfUFJFRklYKVRBUkdFVF9PVVRfVkVORE9SX0VYRUNVVEFCTEVTIDo9ICQoVEFSR0VUX09VVF9WRU5ET1JfRVhFQ1VUQUJMRVMpCkBAIC01NzksNiArNjYxLDM5IEBACiBlbmRpZgogJChUQVJHRVRfMk5EX0FSQ0hfVkFSX1BSRUZJWClUQVJHRVRfT1VUX09ETV9BUFBTIDo9ICQoVEFSR0VUX09VVF9PRE1fQVBQUykKIAorVEFSR0VUX09VVF9QUk9EVUNUIDo9ICQoUFJPRFVDVF9PVVQpLyQoVEFSR0VUX0NPUFlfT1VUX1BST0RVQ1QpCitpZm5lcSAoJChmaWx0ZXIgYWRkcmVzcywkKFNBTklUSVpFX1RBUkdFVCkpLCkKK3RhcmdldF9vdXRfcHJvZHVjdF9zaGFyZWRfbGlicmFyaWVzX2Jhc2UgOj0gJChQUk9EVUNUX09VVCkvJChUQVJHRVRfQ09QWV9PVVRfQVNBTikvcHJvZHVjdAoraWZlcSAoJChTQU5JVElaRV9MSVRFKSx0cnVlKQorIyBXaGVuIHVzaW5nIFNBTklUSVpFX0xJVEUsIEFQS3MgbXVzdCBub3QgYmUgcGFja2FnZWQgd2l0aCBzYW5pdGl6ZWQgbGlicmFyaWVzLCBhcyB0aGV5IHdpbGwgbm90CisjIHdvcmsgd2l0aCB1bnNhbml0aXplZCBhcHBfcHJvY2Vzcy4gRm9yIHNpbXBsaWNpdHksIGdlbmVyYXRlIEFQS3MgaW50byAvZGF0YS9hc2FuLy4KK3RhcmdldF9vdXRfcHJvZHVjdF9hcHBfYmFzZSA6PSAkKFBST0RVQ1RfT1VUKS8kKFRBUkdFVF9DT1BZX09VVF9BU0FOKS9wcm9kdWN0CitlbHNlCit0YXJnZXRfb3V0X3Byb2R1Y3RfYXBwX2Jhc2UgOj0gJChUQVJHRVRfT1VUX1BST0RVQ1QpCitlbmRpZgorZWxzZQordGFyZ2V0X291dF9wcm9kdWN0X3NoYXJlZF9saWJyYXJpZXNfYmFzZSA6PSAkKFRBUkdFVF9PVVRfUFJPRFVDVCkKK3RhcmdldF9vdXRfcHJvZHVjdF9hcHBfYmFzZSA6PSAkKFRBUkdFVF9PVVRfUFJPRFVDVCkKK2VuZGlmCisKK2lmZXEgKCQoVEFSR0VUX0lTXzY0X0JJVCksdHJ1ZSkKK1RBUkdFVF9PVVRfUFJPRFVDVF9TSEFSRURfTElCUkFSSUVTIDo9ICQodGFyZ2V0X291dF9wcm9kdWN0X3NoYXJlZF9saWJyYXJpZXNfYmFzZSkvbGliNjQKK2Vsc2UKK1RBUkdFVF9PVVRfUFJPRFVDVF9TSEFSRURfTElCUkFSSUVTIDo9ICQodGFyZ2V0X291dF9wcm9kdWN0X3NoYXJlZF9saWJyYXJpZXNfYmFzZSkvbGliCitlbmRpZgorVEFSR0VUX09VVF9QUk9EVUNUX0pBVkFfTElCUkFSSUVTOj0gJChUQVJHRVRfT1VUX1BST0RVQ1QpL2ZyYW1ld29yaworVEFSR0VUX09VVF9QUk9EVUNUX0FQUFMgOj0gJCh0YXJnZXRfb3V0X3Byb2R1Y3RfYXBwX2Jhc2UpL2FwcAorVEFSR0VUX09VVF9QUk9EVUNUX0FQUFNfUFJJVklMRUdFRCA6PSAkKHRhcmdldF9vdXRfcHJvZHVjdF9hcHBfYmFzZSkvcHJpdi1hcHAKK1RBUkdFVF9PVVRfUFJPRFVDVF9FVEMgOj0gJChUQVJHRVRfT1VUX1BST0RVQ1QpL2V0YworCitpZmVxICgkKFRBUkdFVF9UUkFOU0xBVEVfMk5EX0FSQ0gpLHRydWUpCiskKFRBUkdFVF8yTkRfQVJDSF9WQVJfUFJFRklYKVRBUkdFVF9PVVRfUFJPRFVDVF9TSEFSRURfTElCUkFSSUVTIDo9ICQodGFyZ2V0X291dF9wcm9kdWN0X3NoYXJlZF9saWJyYXJpZXNfYmFzZSkvbGliLyQoVEFSR0VUXzJORF9BUkNIKQorZWxzZQorJChUQVJHRVRfMk5EX0FSQ0hfVkFSX1BSRUZJWClUQVJHRVRfT1VUX1BST0RVQ1RfU0hBUkVEX0xJQlJBUklFUyA6PSAkKHRhcmdldF9vdXRfcHJvZHVjdF9zaGFyZWRfbGlicmFyaWVzX2Jhc2UpL2xpYgorZW5kaWYKKyQoVEFSR0VUXzJORF9BUkNIX1ZBUl9QUkVGSVgpVEFSR0VUX09VVF9QUk9EVUNUX0FQUFMgOj0gJChUQVJHRVRfT1VUX1BST0RVQ1RfQVBQUykKKyQoVEFSR0VUXzJORF9BUkNIX1ZBUl9QUkVGSVgpVEFSR0VUX09VVF9QUk9EVUNUX0FQUFNfUFJJVklMRUdFRCA6PSAkKFRBUkdFVF9PVVRfUFJPRFVDVF9BUFBTX1BSSVZJTEVHRUQpCisKIFRBUkdFVF9PVVRfQlJFQUtQQUQgOj0gJChQUk9EVUNUX09VVCkvYnJlYWtwYWQKIAogVEFSR0VUX09VVF9VTlNUUklQUEVEIDo9ICQoUFJPRFVDVF9PVVQpL3N5bWJvbHMKQEAgLTYxNSwxNiArNzMwLDYgQEAKICAgRElTVF9ESVIgOj0gJChPVVRfRElSKS9kaXN0CiBlbmRpZgogCi1pZm5kZWYgS0FUSQoraWZlcSAoJChDQUxMRURfRlJPTV9TRVRVUCksdHJ1ZSkKIFBSSU5UX0JVSUxEX0NPTkZJRyA/PSB0cnVlCiBlbmRpZgotCi1pZmVxICgkKFVTRV9DTEFOR19QTEFURk9STV9CVUlMRCksKQotVVNFX0NMQU5HX1BMQVRGT1JNX0JVSUxEIDo9IHRydWUKLWVuZGlmCi0KLWlmbmVxICgkKFVTRV9DTEFOR19QTEFURk9STV9CVUlMRCksdHJ1ZSkKLWlmbmVxICgkKFVTRV9DTEFOR19QTEFURk9STV9CVUlMRCksZmFsc2UpCi0kKGVycm9yIFVTRV9DTEFOR19QTEFURk9STV9CVUlMRCBtdXN0IGJlIHRydWUgb3IgZmFsc2UpCi1lbmRpZgotZW5kaWYKZGlmZiAtLWdpdCBhL2NvcmUvZXhlY3V0YWJsZV9pbnRlcm5hbC5tayBiL2NvcmUvZXhlY3V0YWJsZV9pbnRlcm5hbC5tawppbmRleCAzNTA5YmQyLi40YTYyZmJmIDEwMDY0NAotLS0gYS9jb3JlL2V4ZWN1dGFibGVfaW50ZXJuYWwubWsKKysrIGIvY29yZS9leGVjdXRhYmxlX2ludGVybmFsLm1rCkBAIC0xMiw3ICsxMiw5IEBACiBMT0NBTF9NT0RVTEVfU1VGRklYIDo9ICQoVEFSR0VUX0VYRUNVVEFCTEVfU1VGRklYKQogZW5kaWYKIAoraWZkZWYgdGFyZ2V0LWV4ZWN1dGFibGUtaG9vawogJChjYWxsIHRhcmdldC1leGVjdXRhYmxlLWhvb2spCitlbmRpZgogCiBza2lwX2J1aWxkX2Zyb21fc291cmNlIDo9CiBpZmRlZiBMT0NBTF9QUkVCVUlMVF9NT0RVTEVfRklMRQpAQCAtNzYsNCArNzgsMzkgQEAKIAkkKFBSSVZBVEVfUE9TVF9MSU5LX0NNRCkKIGVuZGlmCiAKK2lmZXEgKCQobXlfbmF0aXZlX2NvdmVyYWdlKSx0cnVlKQorZ2Nub19zdWZmaXggOj0gLmdjbm9kaXIKKworYnVpbHRfd2hvbGVfZ2Nub19saWJyYXJpZXMgOj0gXAorICAgICQoZm9yZWFjaCBsaWIsJChteV93aG9sZV9zdGF0aWNfbGlicmFyaWVzKSwgXAorICAgICAgJChjYWxsIGludGVybWVkaWF0ZXMtZGlyLWZvciwgXAorICAgICAgICBTVEFUSUNfTElCUkFSSUVTLCQobGliKSwkKG15X2tpbmQpLCwkKExPQ0FMXzJORF9BUkNIX1ZBUl9QUkVGSVgpLCBcCisgICAgICAgICQobXlfaG9zdF9jcm9zcykpLyQobGliKSQoZ2Nub19zdWZmaXgpKQorCitidWlsdF9zdGF0aWNfZ2Nub19saWJyYXJpZXMgOj0gXAorICAgICQoZm9yZWFjaCBsaWIsJChteV9zdGF0aWNfbGlicmFyaWVzKSwgXAorICAgICAgJChjYWxsIGludGVybWVkaWF0ZXMtZGlyLWZvciwgXAorICAgICAgICBTVEFUSUNfTElCUkFSSUVTLCQobGliKSwkKG15X2tpbmQpLCwkKExPQ0FMXzJORF9BUkNIX1ZBUl9QUkVGSVgpLCBcCisgICAgICAgICQobXlfaG9zdF9jcm9zcykpLyQobGliKSQoZ2Nub19zdWZmaXgpKQorCitpZmRlZiBMT0NBTF9JU19IT1NUX01PRFVMRQorbXlfY292ZXJhZ2VfcGF0aCA6PSAkKCQobXlfcHJlZml4KU9VVF9DT1ZFUkFHRSkvJChwYXRzdWJzdCAkKCQobXlfcHJlZml4KU9VVCkvJSwlLCQobXlfbW9kdWxlX3BhdGgpKQorZWxzZQorbXlfY292ZXJhZ2VfcGF0aCA6PSAkKFRBUkdFVF9PVVRfQ09WRVJBR0UpLyQocGF0c3Vic3QgJChQUk9EVUNUX09VVCkvJSwlLCQobXlfbW9kdWxlX3BhdGgpKQorZW5kaWYKKworR0NOT19BUkNISVZFIDo9ICQobXlfaW5zdGFsbGVkX21vZHVsZV9zdGVtKSQoZ2Nub19zdWZmaXgpCisKKyQoaW50ZXJtZWRpYXRlcykvJChHQ05PX0FSQ0hJVkUpIDogUFJJVkFURV9BTExfT0JKRUNUUyA6PSAkKHN0cmlwICQoTE9DQUxfR0NOT19GSUxFUykpCiskKGludGVybWVkaWF0ZXMpLyQoR0NOT19BUkNISVZFKSA6IFBSSVZBVEVfQUxMX1dIT0xFX1NUQVRJQ19MSUJSQVJJRVMgOj0gJChzdHJpcCAkKGJ1aWx0X3dob2xlX2djbm9fbGlicmFyaWVzKSkgJChzdHJpcCAkKGJ1aWx0X3N0YXRpY19nY25vX2xpYnJhcmllcykpCiskKGludGVybWVkaWF0ZXMpLyQoR0NOT19BUkNISVZFKSA6IFBSSVZBVEVfSU5URVJNRURJQVRFU19ESVIgOj0gJChpbnRlcm1lZGlhdGVzKQorJChpbnRlcm1lZGlhdGVzKS8kKEdDTk9fQVJDSElWRSkgOiAkKExPQ0FMX0dDTk9fRklMRVMpICQoYnVpbHRfd2hvbGVfZ2Nub19saWJyYXJpZXMpICQoYnVpbHRfc3RhdGljX2djbm9fbGlicmFyaWVzKQorCSQodHJhbnNmb3JtLW8tdG8tc3RhdGljLWxpYikKKworJChteV9jb3ZlcmFnZV9wYXRoKS8kKEdDTk9fQVJDSElWRSkgOiAkKGludGVybWVkaWF0ZXMpLyQoR0NOT19BUkNISVZFKQorCSQoY29weS1maWxlLXRvLXRhcmdldCkKKworJChMT0NBTF9CVUlMVF9NT0RVTEUpOiAkKG15X2NvdmVyYWdlX3BhdGgpLyQoR0NOT19BUkNISVZFKQorZW5kaWYKKwogZW5kaWYgICMgc2tpcF9idWlsZF9mcm9tX3NvdXJjZQpkaWZmIC0tZ2l0IGEvY29yZS9maW5kLWpkay10b29scy1qYXIuc2ggYi9jb3JlL2ZpbmQtamRrLXRvb2xzLWphci5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWMwYjNiNi4uMDAwMDAwMAotLS0gYS9jb3JlL2ZpbmQtamRrLXRvb2xzLWphci5zaAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSMhL2Jpbi9zaAotaWYgWyAieCRBTkRST0lEX0pBVkFfSE9NRSIgIT0geCBdICYmIFsgLWUgIiRBTkRST0lEX0pBVkFfSE9NRS9saWIvdG9vbHMuamFyIiBdIDsgdGhlbgotICAgIGVjaG8gJEFORFJPSURfSkFWQV9IT01FL2xpYi90b29scy5qYXIKLWVsc2UKLSAgICBKQVZBQz0kKHJlYWxwYXRoICQod2hpY2ggamF2YWMpIDI+L2Rldi9udWxsKQotICAgIGlmIFsgLXogIiRKQVZBQyIgXTsgdGhlbgotICAgICAgICBKQVZBQz0kKHJlYWRsaW5rIC1mICQod2hpY2ggamF2YWMpIDI+L2Rldi9udWxsKQotICAgIGZpCi0gICAgaWYgWyAteiAiJEpBVkFDIiBdOyB0aGVuCi0gICAgICAgIEpBVkFDPSQod2hpY2ggamF2YWMpCi0gICAgZmkKLSAgICBpZiBbIC16ICIkSkFWQUMiIF0gOyB0aGVuCi0gICAgICAgIGV4aXQgMQotICAgIGZpCi0gICAgd2hpbGUgWyAtTCAiJEpBVkFDIiBdIDsgZG8KLSAgICAgICAgTFNMSU5FPSQobHMgLWwgIiRKQVZBQyIpCi0gICAgICAgIEpBVkFDPSQoZWNobyAtbiAiJExTTElORSIgfCBzZWQgLWUgInMvLiogLT4gLy8iKQotICAgIGRvbmUKLSAgICBlY2hvICRKQVZBQyB8IHNlZCAtZSAnczpcKC4qXCkvamF2YWMkOlwxLy4uL2xpYi90b29scy5qYXI6JwotZmkKZGlmZiAtLWdpdCBhL2NvcmUvZnV6el90ZXN0Lm1rIGIvY29yZS9mdXp6X3Rlc3QubWsKaW5kZXggNGQ0MTg3MS4uMmNjMmUyYyAxMDA2NDQKLS0tIGEvY29yZS9mdXp6X3Rlc3QubWsKKysrIGIvY29yZS9mdXp6X3Rlc3QubWsKQEAgLTgsOCArOCw1MCBAQAogICAgICQoZXJyb3IgJChMT0NBTF9QQVRIKTogJChMT0NBTF9NT0RVTEUpOiBOREsgZnV6eiB0ZXN0cyBhcmUgbm90IHN1cHBvcnRlZC4pCiBlbmRpZgogCi1MT0NBTF9DRkxBR1MgKz0gLWZzYW5pdGl6ZS1jb3ZlcmFnZT10cmFjZS1wYy1ndWFyZAorbXlfZnV6emVyOj1saWJGdXp6ZXIKK2lmZGVmIExPQ0FMX0ZVWlpfRU5HSU5FCisgICAgbXlfZnV6emVyOj0kKExPQ0FMX0ZVWlpfRU5HSU5FKQorZWxzZSBpZmRlZiBUQVJHRVRfRlVaWl9FTkdJTkUKKyAgICBteV9mdXp6ZXI6PSQoVEFSR0VUX0ZVWlpfRU5HSU5FKQorZW5kaWYKKworCitMT0NBTF9DRkxBR1MgKz0gLWZzYW5pdGl6ZS1jb3ZlcmFnZT10cmFjZS1wYy1ndWFyZCxpbmRpcmVjdC1jYWxscyx0cmFjZS1jbXAKKworaWZlcSAoJChteV9mdXp6ZXIpLGxpYkZ1enplcikKIExPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgKz0gbGliRnV6emVyCitlbHNlIGlmZXEgKCQobXlfZnV6emVyKSxob25nZ2Z1enopCitMT0NBTF9TVEFUSUNfTElCUkFSSUVTICs9IGhvbmdnZnV6el9saWJoZnV6egorTE9DQUxfUkVRVUlSRURfTU9EVUxFUyArPSBob25nZ2Z1enoKK0xPQ0FMX0xERkxBR1MgKz0gXAorICAgICAgICAiLVdsLC0td3JhcD1zdHJjbXAiIFwKKyAgICAgICAgIi1XbCwtLXdyYXA9c3RyY2FzZWNtcCIgXAorICAgICAgICAiLVdsLC0td3JhcD1zdHJuY21wIiBcCisgICAgICAgICItV2wsLS13cmFwPXN0cm5jYXNlY21wIiBcCisgICAgICAgICItV2wsLS13cmFwPXN0cnN0ciIgXAorICAgICAgICAiLVdsLC0td3JhcD1zdHJjYXNlc3RyIiBcCisgICAgICAgICItV2wsLS13cmFwPW1lbWNtcCIgXAorICAgICAgICAiLVdsLC0td3JhcD1iY21wIiBcCisgICAgICAgICItV2wsLS13cmFwPW1lbW1lbSIgXAorICAgICAgICAiLVdsLC0td3JhcD1hcF9jc3RyX2Nhc2VjbXAiIFwKKyAgICAgICAgIi1XbCwtLXdyYXA9YXBfY3N0cl9jYXNlY21wbiIgXAorICAgICAgICAiLVdsLC0td3JhcD1hcF9zdHJjYXNlc3RyIiBcCisgICAgICAgICItV2wsLS13cmFwPWFwcl9jc3RyX2Nhc2VjbXAiIFwKKyAgICAgICAgIi1XbCwtLXdyYXA9YXByX2NzdHJfY2FzZWNtcG4iIFwKKyAgICAgICAgIi1XbCwtLXdyYXA9Q1JZUFRPX21lbWNtcCIgXAorICAgICAgICAiLVdsLC0td3JhcD1PUEVOU1NMX21lbWNtcCIgXAorICAgICAgICAiLVdsLC0td3JhcD1PUEVOU1NMX3N0cmNhc2VjbXAiIFwKKyAgICAgICAgIi1XbCwtLXdyYXA9T1BFTlNTTF9zdHJuY2FzZWNtcCIgXAorICAgICAgICAiLVdsLC0td3JhcD14bWxTdHJuY21wIiBcCisgICAgICAgICItV2wsLS13cmFwPXhtbFN0cmNtcCIgXAorICAgICAgICAiLVdsLC0td3JhcD14bWxTdHJFcXVhbCIgXAorICAgICAgICAiLVdsLC0td3JhcD14bWxTdHJjYXNlY21wIiBcCisgICAgICAgICItV2wsLS13cmFwPXhtbFN0cm5jYXNlY21wIiBcCisgICAgICAgICItV2wsLS13cmFwPXhtbFN0cnN0ciIgXAorICAgICAgICAiLVdsLC0td3JhcD14bWxTdHJjYXNlc3RyIgorZWxzZQorJChjYWxsIHByZXR0eS1lcnJvciwgVW5rbm93biBmdXp6IGVuZ2luZSAkKG15X2Z1enplcikpCitlbmRpZgogCiBpZmRlZiBMT0NBTF9NT0RVTEVfUEFUSAogJChlcnJvciAkKExPQ0FMX1BBVEgpOiBEbyBub3Qgc2V0IExPQ0FMX01PRFVMRV9QQVRIIHdoZW4gYnVpbGRpbmcgdGVzdCAkKExPQ0FMX01PRFVMRSkpCkBAIC0zMiw0ICs3NCw4IEBACiBlbmRpZgogZW5kaWYKIAoraWZuZGVmIExPQ0FMX1NUUklQX01PRFVMRQorTE9DQUxfU1RSSVBfTU9EVUxFIDo9IGtlZXBfc3ltYm9scworZW5kaWYKKwogaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCmRpZmYgLS1naXQgYS9jb3JlL2dlbmVyYXRlX2VuZm9yY2VfcnJvLm1rIGIvY29yZS9nZW5lcmF0ZV9lbmZvcmNlX3Jyby5tawppbmRleCA1NzkwODljLi42MmE4YzhkIDEwMDY0NAotLS0gYS9jb3JlL2dlbmVyYXRlX2VuZm9yY2VfcnJvLm1rCisrKyBiL2NvcmUvZ2VuZXJhdGVfZW5mb3JjZV9ycm8ubWsKQEAgLTcsMTIgKzcsMTIgQEAKIAogaWZlcSAodHJ1ZSwkKGVuZm9yY2VfcnJvX3NvdXJjZV9pc19tYW5pZmVzdF9wYWNrYWdlX25hbWUpKQogJChycm9fYW5kcm9pZF9tYW5pZmVzdF9maWxlKTogUFJJVkFURV9QQUNLQUdFX05BTUUgOj0gJChlbmZvcmNlX3Jyb19zb3VyY2VfbWFuaWZlc3RfcGFja2FnZV9pbmZvKQotJChycm9fYW5kcm9pZF9tYW5pZmVzdF9maWxlKTogYnVpbGQvdG9vbHMvZ2VuZXJhdGUtZW5mb3JjZS1ycm8tYW5kcm9pZC1tYW5pZmVzdC5weQotCSQoaGlkZSkgYnVpbGQvdG9vbHMvZ2VuZXJhdGUtZW5mb3JjZS1ycm8tYW5kcm9pZC1tYW5pZmVzdC5weSAtdSAtcCAkKFBSSVZBVEVfUEFDS0FHRV9OQU1FKSAtbyAkQAorJChycm9fYW5kcm9pZF9tYW5pZmVzdF9maWxlKTogYnVpbGQvbWFrZS90b29scy9nZW5lcmF0ZS1lbmZvcmNlLXJyby1hbmRyb2lkLW1hbmlmZXN0LnB5CisJJChoaWRlKSBidWlsZC9tYWtlL3Rvb2xzL2dlbmVyYXRlLWVuZm9yY2UtcnJvLWFuZHJvaWQtbWFuaWZlc3QucHkgLXUgLXAgJChQUklWQVRFX1BBQ0tBR0VfTkFNRSkgLW8gJEAKIGVsc2UKICQocnJvX2FuZHJvaWRfbWFuaWZlc3RfZmlsZSk6IFBSSVZBVEVfU09VUkNFX01BTklGRVNUX0ZJTEUgOj0gJChlbmZvcmNlX3Jyb19zb3VyY2VfbWFuaWZlc3RfcGFja2FnZV9pbmZvKQotJChycm9fYW5kcm9pZF9tYW5pZmVzdF9maWxlKTogJChlbmZvcmNlX3Jyb19zb3VyY2VfbWFuaWZlc3RfcGFja2FnZV9pbmZvKSBidWlsZC90b29scy9nZW5lcmF0ZS1lbmZvcmNlLXJyby1hbmRyb2lkLW1hbmlmZXN0LnB5Ci0JJChoaWRlKSBidWlsZC90b29scy9nZW5lcmF0ZS1lbmZvcmNlLXJyby1hbmRyb2lkLW1hbmlmZXN0LnB5IC1wICQoUFJJVkFURV9TT1VSQ0VfTUFOSUZFU1RfRklMRSkgLW8gJEAKKyQocnJvX2FuZHJvaWRfbWFuaWZlc3RfZmlsZSk6ICQoZW5mb3JjZV9ycm9fc291cmNlX21hbmlmZXN0X3BhY2thZ2VfaW5mbykgYnVpbGQvbWFrZS90b29scy9nZW5lcmF0ZS1lbmZvcmNlLXJyby1hbmRyb2lkLW1hbmlmZXN0LnB5CisJJChoaWRlKSBidWlsZC9tYWtlL3Rvb2xzL2dlbmVyYXRlLWVuZm9yY2UtcnJvLWFuZHJvaWQtbWFuaWZlc3QucHkgLXAgJChQUklWQVRFX1NPVVJDRV9NQU5JRkVTVF9GSUxFKSAtbyAkQAogZW5kaWYKIAogTE9DQUxfUEFUSDo9ICQoaW50ZXJtZWRpYXRlcykKZGlmZiAtLWdpdCBhL2NvcmUvaGVscC5tayBiL2NvcmUvaGVscC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzAzNGU3OS4uMDAwMDAwMAotLS0gYS9jb3JlL2hlbHAubWsKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0jCi0jIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi0uUEhPTlk6IGhlbHAKLWhlbHA6Ci0JQGVjaG8KLQlAZWNobyAiQ29tbW9uIG1ha2UgdGFyZ2V0czoiCi0JQGVjaG8gIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCi0JQGVjaG8gImRyb2lkICAgICAgICAgICAgICAgICAgIERlZmF1bHQgdGFyZ2V0IgotCUBlY2hvICJjbGVhbiAgICAgICAgICAgICAgICAgICAoYWthIGNsb2JiZXIpIGVxdWl2YWxlbnQgdG8gcm0gLXJmIG91dC8iCi0JQGVjaG8gInNub2QgICAgICAgICAgICAgICAgICAgIFF1aWNrbHkgcmVidWlsZCB0aGUgc3lzdGVtIGltYWdlIGZyb20gYnVpbHQgcGFja2FnZXMiCi0JQGVjaG8gInZub2QgICAgICAgICAgICAgICAgICAgIFF1aWNrbHkgcmVidWlsZCB0aGUgdmVuZG9yIGltYWdlIGZyb20gYnVpbHQgcGFja2FnZXMiCi0JQGVjaG8gIm9mZmxpbmUtc2RrLWRvY3MgICAgICAgIEdlbmVyYXRlIHRoZSBIVE1MIGZvciB0aGUgZGV2ZWxvcGVyIFNESyBkb2NzIgotCUBlY2hvICJkb2MtY29tbWVudC1jaGVjay1kb2NzICBDaGVjayBIVE1MIGRvYyBsaW5rcyAmIHZhbGlkaXR5LCB3aXRob3V0IGdlbmVyYXRpbmcgSFRNTCIKLQlAZWNobyAibGliYW5kcm9pZF9ydW50aW1lICAgICAgQWxsIHRoZSBKTkkgZnJhbWV3b3JrIHN0dWZmIgotCUBlY2hvICJmcmFtZXdvcmsgICAgICAgICAgICAgICBBbGwgdGhlIGphdmEgZnJhbWV3b3JrIHN0dWZmIgotCUBlY2hvICJzZXJ2aWNlcyAgICAgICAgICAgICAgICBUaGUgc3lzdGVtIHNlcnZlciAoSmF2YSkgYW5kIGZyaWVuZHMiCi0JQGVjaG8gImhlbHAgICAgICAgICAgICAgICAgICAgIFlvdSdyZSByZWFkaW5nIGl0IHJpZ2h0IG5vdyIKLQotLlBIT05ZOiBvdXQKLW91dDoKLQlAZWNobyAiSSdtIHN1cmUgeW91J3JlIG5pY2UgYW5kIGFsbCwgYnV0IG5vIHRoYW5rcy4iCmRpZmYgLS1naXQgYS9jb3JlL2hvc3RfZGFsdmlrX2phdmFfbGlicmFyeS5tayBiL2NvcmUvaG9zdF9kYWx2aWtfamF2YV9saWJyYXJ5Lm1rCmluZGV4IDRmMzA2OWYuLjFlZjBjY2IgMTAwNjQ0Ci0tLSBhL2NvcmUvaG9zdF9kYWx2aWtfamF2YV9saWJyYXJ5Lm1rCisrKyBiL2NvcmUvaG9zdF9kYWx2aWtfamF2YV9saWJyYXJ5Lm1rCkBAIC0yNCw1MyArMjQsMzkgQEAKIGlmZXEgKCQoSE9TVF9PUyksbGludXgpCiBVU0VfQ09SRV9MSUJfQk9PVENMQVNTUEFUSCA6PSB0cnVlCiAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotaW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvY29uZmlndXJlX2xvY2FsX2phY2subWsKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIGluY2x1ZGUgJChCVUlMRF9TWVNURU0pL2hvc3RfamF2YV9saWJyYXJ5X2NvbW1vbi5tawogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1pZmRlZiBMT0NBTF9KQUNLX0VOQUJMRUQKLWlmZXEgKCQoTE9DQUxfSVNfU1RBVElDX0pBVkFfTElCUkFSWSksdHJ1ZSkKLSAgIyBGb3Igc3RhdGljIGxpYnJhcnksICQoTE9DQUxfQlVJTFRfTU9EVUxFKSBpcyAkKGZ1bGxfY2xhc3Nlc19qYWNrKS4KLSAgTE9DQUxfQlVJTFRfTU9EVUxFX1NURU0gOj0gY2xhc3Nlcy5qYWNrCi1lbmRpZgotZW5kaWYKIAotaWZuZXEgKCQoTE9DQUxfTk9fU1RBTkRBUkRfTElCUkFSSUVTKSx0cnVlKQotICBMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSAgY29yZS1vai1ob3N0ZGV4IGNvcmUtbGliYXJ0LWhvc3RkZXggJChMT0NBTF9KQVZBX0xJQlJBUklFUykKLWVuZGlmCi0KK2Z1bGxfY2xhc3Nlc190dXJiaW5lX2phciA6PSAkKGludGVybWVkaWF0ZXMuQ09NTU9OKS9jbGFzc2VzLXR1cmJpbmUuamFyCitmdWxsX2NsYXNzZXNfaGVhZGVyX2phcmphciA6PSAkKGludGVybWVkaWF0ZXMuQ09NTU9OKS9jbGFzc2VzLWhlYWRlci1qYXJqYXIuamFyCitmdWxsX2NsYXNzZXNfaGVhZGVyX2phciA6PSAkKGludGVybWVkaWF0ZXMuQ09NTU9OKS9jbGFzc2VzLWhlYWRlci5qYXIKIGZ1bGxfY2xhc3Nlc19jb21waWxlZF9qYXIgOj0gJChpbnRlcm1lZGlhdGVzLkNPTU1PTikvY2xhc3Nlcy1mdWxsLWRlYnVnLmphcgorZnVsbF9jbGFzc2VzX2NvbWJpbmVkX2phciA6PSAkKGludGVybWVkaWF0ZXMuQ09NTU9OKS9jbGFzc2VzLWNvbWJpbmVkLmphcgogZnVsbF9jbGFzc2VzX2Rlc3VnYXJfamFyIDo9ICQoaW50ZXJtZWRpYXRlcy5DT01NT04pL2Rlc3VnYXIuY2xhc3Nlcy5qYXIKIGZ1bGxfY2xhc3Nlc19qYXJqYXJfamFyIDo9ICQoaW50ZXJtZWRpYXRlcy5DT01NT04pL2NsYXNzZXMtamFyamFyLmphcgogZnVsbF9jbGFzc2VzX2phciA6PSAkKGludGVybWVkaWF0ZXMuQ09NTU9OKS9jbGFzc2VzLmphcgotZnVsbF9jbGFzc2VzX2phY2sgOj0gJChpbnRlcm1lZGlhdGVzLkNPTU1PTikvY2xhc3Nlcy5qYWNrCi1qYWNrX2NoZWNrX3RpbWVzdGFtcCA6PSAkKGludGVybWVkaWF0ZXMuQ09NTU9OKS9qYWNrLmNoZWNrLnRpbWVzdGFtcAogYnVpbHRfZGV4IDo9ICQoaW50ZXJtZWRpYXRlcy5DT01NT04pL2NsYXNzZXMuZGV4CitqYXZhX3NvdXJjZV9saXN0X2ZpbGUgOj0gJChpbnRlcm1lZGlhdGVzLkNPTU1PTikvamF2YS1zb3VyY2UtbGlzdAogCiBMT0NBTF9JTlRFUk1FRElBVEVfVEFSR0VUUyArPSBcCisgICAgJChmdWxsX2NsYXNzZXNfdHVyYmluZV9qYXIpIFwKICAgICAkKGZ1bGxfY2xhc3Nlc19jb21waWxlZF9qYXIpIFwKKyAgICAkKGZ1bGxfY2xhc3Nlc19jb21iaW5lZF9qYXIpIFwKICAgICAkKGZ1bGxfY2xhc3Nlc19kZXN1Z2FyX2phcikgXAogICAgICQoZnVsbF9jbGFzc2VzX2phcmphcl9qYXIpIFwKLSAgICAkKGZ1bGxfY2xhc3Nlc19qYWNrKSBcCiAgICAgJChmdWxsX2NsYXNzZXNfamFyKSBcCi0gICAgJChqYWNrX2NoZWNrX3RpbWVzdGFtcCkgXAotICAgICQoYnVpbHRfZGV4KQorICAgICQoYnVpbHRfZGV4KSBcCisgICAgJChqYXZhX3NvdXJjZV9saXN0X2ZpbGUpCiAKICMgU2VlIGNvbW1lbnQgaW4gamF2YS5tawogaWZuZGVmIExPQ0FMX0NIRUNLRURfTU9EVUxFCi1pZmRlZiBMT0NBTF9KQUNLX0VOQUJMRUQKLUxPQ0FMX0NIRUNLRURfTU9EVUxFIDo9ICQoamFja19jaGVja190aW1lc3RhbXApCi1lbHNlCiBpZmVxICgkKExPQ0FMX0lTX1NUQVRJQ19KQVZBX0xJQlJBUlkpLHRydWUpCiBMT0NBTF9DSEVDS0VEX01PRFVMRSA6PSAkKGZ1bGxfY2xhc3Nlc19jb21waWxlZF9qYXIpCiBlbHNlCiBMT0NBTF9DSEVDS0VEX01PRFVMRSA6PSAkKGJ1aWx0X2RleCkKIGVuZGlmCiBlbmRpZgotZW5kaWYKIAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiBpbmNsdWRlICQoQlVJTERfU1lTVEVNKS9iYXNlX3J1bGVzLm1rCkBAIC04MSw1MSArNjcsMTEzIEBACiAKIGluY2x1ZGUgJChCVUlMRF9TWVNURU0pL2phdmFfY29tbW9uLm1rCiAKK2luY2x1ZGUgJChCVUlMRF9TWVNURU0pL3Nka19jaGVjay5taworCiAkKGNsZWFudGFyZ2V0KTogUFJJVkFURV9DTEVBTl9GSUxFUyArPSAkKGludGVybWVkaWF0ZXMuQ09NTU9OKQogCi1pZm5kZWYgTE9DQUxfSkFDS19FTkFCTEVECisjIExpc3Qgb2YgZGVwZW5kZW5jaWVzIGZvciBhbnl0aGluZyB0aGF0IG5lZWRzIGFsbCBqYXZhIHNvdXJjZXMgaW4gcGxhY2UKK2phdmFfc291cmNlc19kZXBzIDo9IFwKKyAgICAkKGphdmFfc291cmNlcykgXAorICAgICQoamF2YV9yZXNvdXJjZV9zb3VyY2VzKSBcCisgICAgJChwcm90b19qYXZhX3NvdXJjZXNfZmlsZV9zdGFtcCkgXAorICAgICQoTE9DQUxfU1JDSkFSUykgXAorICAgICQoTE9DQUxfQURESVRJT05BTF9ERVBFTkRFTkNJRVMpCisKKyQoamF2YV9zb3VyY2VfbGlzdF9maWxlKTogJChqYXZhX3NvdXJjZXNfZGVwcykKKwkkKHdyaXRlLWphdmEtc291cmNlLWxpc3QpCiAKICQoZnVsbF9jbGFzc2VzX2NvbXBpbGVkX2phcik6IFBSSVZBVEVfSkFWQV9MQVlFUlNfRklMRSA6PSAkKGxheWVyc19maWxlKQotJChmdWxsX2NsYXNzZXNfY29tcGlsZWRfamFyKTogUFJJVkFURV9KQVZBQ0ZMQUdTIDo9ICQoR0xPQkFMX0pBVkFDX0RFQlVHX0ZMQUdTKSAkKExPQ0FMX0pBVkFDRkxBR1MpICQoYW5ub3RhdGlvbl9wcm9jZXNzb3JfZmxhZ3MpCiskKGZ1bGxfY2xhc3Nlc19jb21waWxlZF9qYXIpOiBQUklWQVRFX0pBVkFDRkxBR1MgOj0gJChMT0NBTF9KQVZBQ0ZMQUdTKSAkKGFubm90YXRpb25fcHJvY2Vzc29yX2ZsYWdzKQogJChmdWxsX2NsYXNzZXNfY29tcGlsZWRfamFyKTogUFJJVkFURV9KQVJfRVhDTFVERV9GSUxFUyA6PQogJChmdWxsX2NsYXNzZXNfY29tcGlsZWRfamFyKTogUFJJVkFURV9KQVJfUEFDS0FHRVMgOj0KICQoZnVsbF9jbGFzc2VzX2NvbXBpbGVkX2phcik6IFBSSVZBVEVfSkFSX0VYQ0xVREVfUEFDS0FHRVMgOj0KKyQoZnVsbF9jbGFzc2VzX2NvbXBpbGVkX2phcik6IFBSSVZBVEVfU1JDSkFSUyA6PSAkKExPQ0FMX1NSQ0pBUlMpCiskKGZ1bGxfY2xhc3Nlc19jb21waWxlZF9qYXIpOiBQUklWQVRFX1NSQ0pBUl9MSVNUX0ZJTEUgOj0gJChpbnRlcm1lZGlhdGVzLkNPTU1PTikvc3JjamFyLWxpc3QKKyQoZnVsbF9jbGFzc2VzX2NvbXBpbGVkX2phcik6IFBSSVZBVEVfU1JDSkFSX0lOVEVSTUVESUFURVNfRElSIDo9ICQoaW50ZXJtZWRpYXRlcy5DT01NT04pL3NyY2phcnMKICQoZnVsbF9jbGFzc2VzX2NvbXBpbGVkX2phcik6IFwKLSAgICAgICAgJChqYXZhX3NvdXJjZXMpIFwKLSAgICAgICAgJChqYXZhX3Jlc291cmNlX3NvdXJjZXMpIFwKLSAgICAgICAgJChmdWxsX2phdmFfbGliX2RlcHMpIFwKLSAgICAgICAgJChqYXJfbWFuaWZlc3RfZmlsZSkgXAotICAgICAgICAkKHByb3RvX2phdmFfc291cmNlc19maWxlX3N0YW1wKSBcCi0gICAgICAgICQoYW5ub3RhdGlvbl9wcm9jZXNzb3JfZGVwcykgXAotICAgICAgICAkKE5PUk1BTElaRV9QQVRIKSBcCi0gICAgICAgICQoTE9DQUxfQURESVRJT05BTF9ERVBFTkRFTkNJRVMpIFwKLSAgICAgICAgfCAkKFNPT05HX0pBVkFDX1dSQVBQRVIpCi0JJCh0cmFuc2Zvcm0taG9zdC1qYXZhLXRvLXBhY2thZ2UpCisgICAgJChqYXZhX3NvdXJjZV9saXN0X2ZpbGUpIFwKKyAgICAkKGphdmFfc291cmNlc19kZXBzKSBcCisgICAgJChmdWxsX2phdmFfaGVhZGVyX2xpYnMpIFwKKyAgICAkKGZ1bGxfamF2YV9ib290Y2xhc3NwYXRoX2xpYnMpIFwKKyAgICAkKGZ1bGxfamF2YV9zeXN0ZW1fbW9kdWxlc19kZXBzKSBcCisgICAgJChhbm5vdGF0aW9uX3Byb2Nlc3Nvcl9kZXBzKSBcCisgICAgJChOT1JNQUxJWkVfUEFUSCkgXAorICAgICQoSkFSX0FSR1MpIFwKKyAgICAkKFpJUFNZTkMpIFwKKyAgICB8ICQoU09PTkdfSkFWQUNfV1JBUFBFUikKKwkkKHRyYW5zZm9ybS1ob3N0LWphdmEtdG8tZGFsdmlrLXBhY2thZ2UpCiAKLW15X2Rlc3VnYXJpbmcgOj0KLWlmZXEgKCQoTE9DQUxfSkFWQV9MQU5HVUFHRV9WRVJTSU9OKSwxLjgpCi1teV9kZXN1Z2FyaW5nIDo9IHRydWUKLSQoZnVsbF9jbGFzc2VzX2Rlc3VnYXJfamFyKTogUFJJVkFURV9EWF9GTEFHUyA6PSAkKExPQ0FMX0RYX0ZMQUdTKQotJChmdWxsX2NsYXNzZXNfZGVzdWdhcl9qYXIpOiAkKGZ1bGxfY2xhc3Nlc19jb21waWxlZF9qYXIpICQoREVTVUdBUikKLQkkKGRlc3VnYXItY2xhc3Nlcy1qYXIpCitpZm5lcSAoJChUVVJCSU5FX0VOQUJMRUQpLGZhbHNlKQorCiskKGZ1bGxfY2xhc3Nlc190dXJiaW5lX2phcik6IFBSSVZBVEVfSkFWQUNGTEFHUyA6PSAkKExPQ0FMX0pBVkFDRkxBR1MpICQoYW5ub3RhdGlvbl9wcm9jZXNzb3JfZmxhZ3MpCiskKGZ1bGxfY2xhc3Nlc190dXJiaW5lX2phcik6IFBSSVZBVEVfRE9OVF9ERUxFVEVfSkFSX01FVEFfSU5GIDo9ICQoTE9DQUxfRE9OVF9ERUxFVEVfSkFSX01FVEFfSU5GKQorJChmdWxsX2NsYXNzZXNfdHVyYmluZV9qYXIpOiBQUklWQVRFX1NSQ0pBUlMgOj0gJChMT0NBTF9TUkNKQVJTKQorJChmdWxsX2NsYXNzZXNfdHVyYmluZV9qYXIpOiBcCisgICAgJChqYXZhX3NvdXJjZV9saXN0X2ZpbGUpIFwKKyAgICAkKGphdmFfc291cmNlc19kZXBzKSBcCisgICAgJChmdWxsX2phdmFfaGVhZGVyX2xpYnMpIFwKKyAgICAkKGZ1bGxfamF2YV9ib290Y2xhc3NwYXRoX2xpYnMpIFwKKyAgICAkKE5PUk1BTElaRV9QQVRIKSBcCisgICAgJChKQVJfQVJHUykgXAorICAgICQoWklQVElNRSkgXAorICAgIHwgJChUVVJCSU5FKSBcCisgICAgJChNRVJHRV9aSVBTKQorCSQodHJhbnNmb3JtLWphdmEtdG8taGVhZGVyLmphcikKKworLktBVElfUkVTVEFUOiAkKGZ1bGxfY2xhc3Nlc190dXJiaW5lX2phcikKKworIyBSdW4gamFyamFyIGJlZm9yZSBnZW5lcmF0ZSBjbGFzc2VzLWhlYWRlci5qYXIgaWYgbmVjZXNzYXJ5LgoraWZuZXEgKCQoc3RyaXAgJChMT0NBTF9KQVJKQVJfUlVMRVMpKSwpCiskKGZ1bGxfY2xhc3Nlc19oZWFkZXJfamFyamFyKTogUFJJVkFURV9KQVJKQVJfUlVMRVMgOj0gJChMT0NBTF9KQVJKQVJfUlVMRVMpCiskKGZ1bGxfY2xhc3Nlc19oZWFkZXJfamFyamFyKTogJChmdWxsX2NsYXNzZXNfdHVyYmluZV9qYXIpICQoTE9DQUxfSkFSSkFSX1JVTEVTKSB8ICQoSkFSSkFSKQorCUBlY2hvIEhlYWRlciBKYXJKYXI6ICRACisJJChoaWRlKSAkKEpBVkEpIC1qYXIgJChKQVJKQVIpIHByb2Nlc3MgJChQUklWQVRFX0pBUkpBUl9SVUxFUykgJDwgJEAKK2Vsc2UKK2Z1bGxfY2xhc3Nlc19oZWFkZXJfamFyamFyIDo9ICQoZnVsbF9jbGFzc2VzX3R1cmJpbmVfamFyKQogZW5kaWYKIAotaWZuZGVmIG15X2Rlc3VnYXJpbmcKLWZ1bGxfY2xhc3Nlc19kZXN1Z2FyX2phciA6PSAkKGZ1bGxfY2xhc3Nlc19jb21waWxlZF9qYXIpCi1lbmRpZgorJChldmFsICQoY2FsbCBjb3B5LW9uZS1maWxlLCQoZnVsbF9jbGFzc2VzX2hlYWRlcl9qYXJqYXIpLCQoZnVsbF9jbGFzc2VzX2hlYWRlcl9qYXIpKSkKKworZW5kaWYgIyBUVVJCSU5FX0VOQUJMRUQgIT0gZmFsc2UKKworJChmdWxsX2NsYXNzZXNfY29tYmluZWRfamFyKTogUFJJVkFURV9ET05UX0RFTEVURV9KQVJfTUVUQV9JTkYgOj0gJChMT0NBTF9ET05UX0RFTEVURV9KQVJfTUVUQV9JTkYpCiskKGZ1bGxfY2xhc3Nlc19jb21iaW5lZF9qYXIpOiAkKGZ1bGxfY2xhc3Nlc19jb21waWxlZF9qYXIpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoamFyX21hbmlmZXN0X2ZpbGUpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoZnVsbF9zdGF0aWNfamF2YV9saWJzKSAgfCAkKE1FUkdFX1pJUFMpCisJJChpZiAkKFBSSVZBVEVfSkFSX01BTklGRVNUKSwgJChoaWRlKSBzZWQgLWUgInMvJUJVSUxEX05VTUJFUiUvJChCVUlMRF9OVU1CRVJfRlJPTV9GSUxFKS8iIFwKKyAgICAgICAgICAgICQoUFJJVkFURV9KQVJfTUFOSUZFU1QpID4gJChkaXIgJEApL21hbmlmZXN0Lm1mKQorCSQoTUVSR0VfWklQUykgLWogLS1pZ25vcmUtZHVwbGljYXRlcyAkKGlmICQoUFJJVkFURV9KQVJfTUFOSUZFU1QpLC1tICQoZGlyICRAKS9tYW5pZmVzdC5tZikgXAorICAgICAgICAgICAgJChpZiAkKFBSSVZBVEVfRE9OVF9ERUxFVEVfSkFSX01FVEFfSU5GKSwsLXN0cmlwRGlyIE1FVEEtSU5GIC16aXBUb05vdFN0cmlwICQ8KSBcCisgICAgICAgICAgICAkQCAkPCAkKGNhbGwgcmV2ZXJzZS1saXN0LCQoUFJJVkFURV9TVEFUSUNfSkFWQV9MSUJSQVJJRVMpKQogCiAjIFJ1biBqYXJqYXIgaWYgbmVjZXNzYXJ5LCBvdGhlcndpc2UganVzdCBjb3B5IHRoZSBmaWxlLgogaWZuZXEgKCQoc3RyaXAgJChMT0NBTF9KQVJKQVJfUlVMRVMpKSwpCiAkKGZ1bGxfY2xhc3Nlc19qYXJqYXJfamFyKTogUFJJVkFURV9KQVJKQVJfUlVMRVMgOj0gJChMT0NBTF9KQVJKQVJfUlVMRVMpCi0kKGZ1bGxfY2xhc3Nlc19qYXJqYXJfamFyKTogJChmdWxsX2NsYXNzZXNfZGVzdWdhcl9qYXIpICQoTE9DQUxfSkFSSkFSX1JVTEVTKSB8ICQoSkFSSkFSKQorJChmdWxsX2NsYXNzZXNfamFyamFyX2phcik6ICQoZnVsbF9jbGFzc2VzX2NvbWJpbmVkX2phcikgJChMT0NBTF9KQVJKQVJfUlVMRVMpIHwgJChKQVJKQVIpCiAJQGVjaG8gSmFySmFyOiAkQAogCSQoaGlkZSkgJChKQVZBKSAtamFyICQoSkFSSkFSKSBwcm9jZXNzICQoUFJJVkFURV9KQVJKQVJfUlVMRVMpICQ8ICRACiBlbHNlCi1mdWxsX2NsYXNzZXNfamFyamFyX2phciA6PSAkKGZ1bGxfY2xhc3Nlc19kZXN1Z2FyX2phcikKK2Z1bGxfY2xhc3Nlc19qYXJqYXJfamFyIDo9ICQoZnVsbF9jbGFzc2VzX2NvbWJpbmVkX2phcikKIGVuZGlmCiAKICQoZXZhbCAkKGNhbGwgY29weS1vbmUtZmlsZSwkKGZ1bGxfY2xhc3Nlc19qYXJqYXJfamFyKSwkKGZ1bGxfY2xhc3Nlc19qYXIpKSkKIAoraWZuZXEgKCQoVVNFX0Q4X0RFU1VHQVIpLHRydWUpCitteV9kZXN1Z2FyaW5nIDo9CitpZmVxICgkKExPQ0FMX0pBVkFfTEFOR1VBR0VfVkVSU0lPTiksMS44KQorbXlfZGVzdWdhcmluZyA6PSB0cnVlCiskKGZ1bGxfY2xhc3Nlc19kZXN1Z2FyX2phcik6IFBSSVZBVEVfRFhfRkxBR1MgOj0gJChMT0NBTF9EWF9GTEFHUykKKyQoZnVsbF9jbGFzc2VzX2Rlc3VnYXJfamFyKTogJChmdWxsX2NsYXNzZXNfamFyKSAkKGZ1bGxfamF2YV9oZWFkZXJfbGlicykgJChERVNVR0FSKQorCSQoZGVzdWdhci1jbGFzc2VzLWphcikKK2VuZGlmCitlbHNlCitteV9kZXN1Z2FyaW5nIDo9CitlbmRpZgorCitpZm5kZWYgbXlfZGVzdWdhcmluZworZnVsbF9jbGFzc2VzX2Rlc3VnYXJfamFyIDo9ICQoZnVsbF9jbGFzc2VzX2phcikKK2VuZGlmCisKIGlmZXEgKCQoTE9DQUxfSVNfU1RBVElDX0pBVkFfTElCUkFSWSksdHJ1ZSkKICMgTm8gZGV4OyBhbGwgd2Ugd2FudCBhcmUgdGhlIC5jbGFzcyBmaWxlcyB3aXRoIHJlc291cmNlcy4KICQoTE9DQUxfQlVJTFRfTU9EVUxFKSA6ICQoamF2YV9yZXNvdXJjZV9zb3VyY2VzKQpAQCAtMTM2LDggKzE4NCwxMiBAQAogZWxzZSAjICFMT0NBTF9JU19TVEFUSUNfSkFWQV9MSUJSQVJZCiAkKGJ1aWx0X2RleCk6IFBSSVZBVEVfSU5URVJNRURJQVRFU19ESVIgOj0gJChpbnRlcm1lZGlhdGVzLkNPTU1PTikKICQoYnVpbHRfZGV4KTogUFJJVkFURV9EWF9GTEFHUyA6PSAkKExPQ0FMX0RYX0ZMQUdTKQotJChidWlsdF9kZXgpOiAkKGZ1bGxfY2xhc3Nlc19qYXIpICQoRFgpCiskKGJ1aWx0X2RleCk6ICQoZnVsbF9jbGFzc2VzX2Rlc3VnYXJfamFyKSAkKERYKSAkKFpJUDJaSVApCitpZm5lcSAoJChVU0VfRDhfREVTVUdBUiksdHJ1ZSkKIAkkKHRyYW5zZm9ybS1jbGFzc2VzLmphci10by1kZXgpCitlbHNlCisJJCh0cmFuc2Zvcm0tY2xhc3Nlcy1kOC5qYXItdG8tZGV4KQorZW5kaWYKIAogJChMT0NBTF9CVUlMVF9NT0RVTEUpOiBQUklWQVRFX0RFWF9GSUxFIDo9ICQoYnVpbHRfZGV4KQogJChMT0NBTF9CVUlMVF9NT0RVTEUpOiBQUklWQVRFX1NPVVJDRV9BUkNISVZFIDo9ICQoZnVsbF9jbGFzc2VzX2phcmphcl9qYXIpCkBAIC0xNDksNjcgKzIwMSwyMyBAQAogCiBlbmRpZiAjICFMT0NBTF9JU19TVEFUSUNfSkFWQV9MSUJSQVJZCiAKLWlmbmVxICgsJChmaWx0ZXItb3V0IGN1cnJlbnQgc3lzdGVtX2N1cnJlbnQgdGVzdF9jdXJyZW50LCAkKExPQ0FMX1NES19WRVJTSU9OKSkpCi0kKExPQ0FMX0lOVEVSTUVESUFURV9UQVJHRVRTKTogUFJJVkFURV9ERUZBVUxUX0FQUF9UQVJHRVRfU0RLIDo9ICQoTE9DQUxfU0RLX1ZFUlNJT04pCi0kKExPQ0FMX0lOVEVSTUVESUFURV9UQVJHRVRTKTogUFJJVkFURV9TREtfVkVSU0lPTiA6PSAkKExPQ0FMX1NES19WRVJTSU9OKQoraWZuZXEgKCwkKGZpbHRlci1vdXQgY3VycmVudCBzeXN0ZW1fY3VycmVudCB0ZXN0X2N1cnJlbnQgY29yZV9jdXJyZW50LCAkKExPQ0FMX1NES19WRVJTSU9OKSkpCisgIG15X2RlZmF1bHRfYXBwX3RhcmdldF9zZGsgOj0gJChjYWxsIGdldC1udW1lcmljLXNkay12ZXJzaW9uLCQoTE9DQUxfU0RLX1ZFUlNJT04pKQorICBteV9zZGtfdmVyc2lvbiA6PSAkKGNhbGwgZ2V0LW51bWVyaWMtc2RrLXZlcnNpb24sJChMT0NBTF9TREtfVkVSU0lPTikpCiBlbHNlCi0kKExPQ0FMX0lOVEVSTUVESUFURV9UQVJHRVRTKTogUFJJVkFURV9ERUZBVUxUX0FQUF9UQVJHRVRfU0RLIDo9ICQoREVGQVVMVF9BUFBfVEFSR0VUX1NESykKLSQoTE9DQUxfSU5URVJNRURJQVRFX1RBUkdFVFMpOiBQUklWQVRFX1NES19WRVJTSU9OIDo9ICQoUExBVEZPUk1fU0RLX1ZFUlNJT04pCisgIG15X2RlZmF1bHRfYXBwX3RhcmdldF9zZGsgOj0gJChERUZBVUxUX0FQUF9UQVJHRVRfU0RLKQorICBteV9zZGtfdmVyc2lvbiA6PSAkKFBMQVRGT1JNX1NES19WRVJTSU9OKQogZW5kaWYKIAotZWxzZSAjIExPQ0FMX0pBQ0tfRU5BQkxFRAotJChMT0NBTF9JTlRFUk1FRElBVEVfVEFSR0VUUyk6IFwKLSAgUFJJVkFURV9KQUNLX0lOVEVSTUVESUFURVNfRElSIDo9ICQoaW50ZXJtZWRpYXRlcy5DT01NT04pL2phY2stcnNjCi0KLWlmZXEgKCQoTE9DQUxfSkFDS19FTkFCTEVEKSxpbmNyZW1lbnRhbCkKLSQoTE9DQUxfSU5URVJNRURJQVRFX1RBUkdFVFMpOiBcCi0gIFBSSVZBVEVfSkFDS19JTkNSRU1FTlRBTF9ESVIgOj0gJChpbnRlcm1lZGlhdGVzLkNPTU1PTikvamFjay1pbmNyZW1lbnRhbAoraWZkZWYgTE9DQUxfTUlOX1NES19WRVJTSU9OCisgIG15X21pbl9zZGtfdmVyc2lvbiA6PSAkKExPQ0FMX01JTl9TREtfVkVSU0lPTikKIGVsc2UKLSQoTE9DQUxfSU5URVJNRURJQVRFX1RBUkdFVFMpOiBcCi0gIFBSSVZBVEVfSkFDS19JTkNSRU1FTlRBTF9ESVIgOj0KKyAgbXlfbWluX3Nka192ZXJzaW9uIDo9ICQoY2FsbCBjb2RlbmFtZS1vci1zZGstdG8tc2RrLCQobXlfZGVmYXVsdF9hcHBfdGFyZ2V0X3NkaykpCiBlbmRpZgotJChMT0NBTF9JTlRFUk1FRElBVEVfVEFSR0VUUyk6IFBSSVZBVEVfSkFDS19GTEFHUyA6PSAkKEdMT0JBTF9KQVZBQ19ERUJVR19GTEFHUykgJChMT0NBTF9KQUNLX0ZMQUdTKQotJChMT0NBTF9JTlRFUk1FRElBVEVfVEFSR0VUUyk6IFBSSVZBVEVfSkFDS19WRVJTSU9OIDo9ICQoTE9DQUxfSkFDS19WRVJTSU9OKQotJChMT0NBTF9JTlRFUk1FRElBVEVfVEFSR0VUUyk6IFBSSVZBVEVfSkFDS19NSU5fU0RLX1ZFUlNJT04gOj0gJChQTEFURk9STV9KQUNLX01JTl9TREtfVkVSU0lPTikKIAotamFja19hbGxfZGVwcyA6PSAkKGphdmFfc291cmNlcykgJChqYXZhX3Jlc291cmNlX3NvdXJjZXMpICQoZnVsbF9qYWNrX2RlcHMpIFwKLSAgICAgICAgJChqYXJfbWFuaWZlc3RfZmlsZSkgJChwcm90b19qYXZhX3NvdXJjZXNfZmlsZV9zdGFtcCkgXAotICAgICAgICAkKExPQ0FMX0FERElUSU9OQUxfREVQRU5ERU5DSUVTKSAkKE5PUk1BTElaRV9QQVRIKSAkKEpBQ0tfREVGQVVMVF9BUkdTKSAkKEpBQ0spCi0KLWlmbmVxICgkKExPQ0FMX0lTX1NUQVRJQ19KQVZBX0xJQlJBUlkpLHRydWUpCi0kKGJ1aWx0X2RleCk6IFBSSVZBVEVfQ0xBU1NFU19KQUNLIDo9ICQoZnVsbF9jbGFzc2VzX2phY2spCi0kKGJ1aWx0X2RleCk6IFBSSVZBVEVfSkFDS19QTFVHSU5fUEFUSCA6PSAkKExPQ0FMX0pBQ0tfUExVR0lOX1BBVEgpCi0kKGJ1aWx0X2RleCk6IFBSSVZBVEVfSkFDS19QTFVHSU4gOj0gJChMT0NBTF9KQUNLX1BMVUdJTikKLSQoYnVpbHRfZGV4KTogJChqYWNrX2FsbF9kZXBzKSAkKExPQ0FMX0pBQ0tfUExVR0lOX1BBVEgpIHwgc2V0dXAtamFjay1zZXJ2ZXIKLQlAZWNobyBCdWlsZGluZyB3aXRoIEphY2s6ICRACi0JJChqYWNrLWphdmEtdG8tZGV4KQotCi0jICQoZnVsbF9jbGFzc2VzX2phY2spIGlzIGp1c3QgYnktcHJvZHVjdCBvZiAkKGJ1aWx0X2RleCkuCi0jIFRoZSBkdW1teSBjb21tYW5kIHdhcyBhZGRlZCBiZWNhdXNlLCB3aXRob3V0IGl0LCBtYWtlIG1pc3NlcyB0aGUgZmFjdCB0aGUgJChidWlsdF9kZXgpIGFsc28KLSMgY2hhbmdlICQoZnVsbF9jbGFzc2VzX2phY2spLgotJChmdWxsX2NsYXNzZXNfamFjayk6ICQoYnVpbHRfZGV4KQotCSQoaGlkZSkgdG91Y2ggJEAKLQotJChMT0NBTF9CVUlMVF9NT0RVTEUpOiBQUklWQVRFX0RFWF9GSUxFIDo9ICQoYnVpbHRfZGV4KQotJChMT0NBTF9CVUlMVF9NT0RVTEUpOiAkKGJ1aWx0X2RleCkgJChqYXZhX3Jlc291cmNlX3NvdXJjZXMpCi0JQGVjaG8gIkhvc3QgSmFyOiAkKFBSSVZBVEVfTU9EVUxFKSAoJEApIgotCSQoY3JlYXRlLWVtcHR5LXBhY2thZ2UpCi0JJChhZGQtZGV4LXRvLXBhY2thZ2UpCi0JJChhZGQtY2FycmllZC1qYWNrLXJlc291cmNlcykKLQotZWxzZSAgIyBMT0NBTF9JU19TVEFUSUNfSkFWQV9MSUJSQVJZCi0kKGZ1bGxfY2xhc3Nlc19qYWNrKTogUFJJVkFURV9KQUNLX1BMVUdJTl9QQVRIIDo9ICQoTE9DQUxfSkFDS19QTFVHSU5fUEFUSCkKLSQoZnVsbF9jbGFzc2VzX2phY2spOiBQUklWQVRFX0pBQ0tfUExVR0lOIDo9ICQoTE9DQUxfSkFDS19QTFVHSU4pCi0kKGZ1bGxfY2xhc3Nlc19qYWNrKTogJChqYWNrX2FsbF9kZXBzKSAkKExPQ0FMX0pBQ0tfUExVR0lOX1BBVEgpIHwgc2V0dXAtamFjay1zZXJ2ZXIKLQlAZWNobyBCdWlsZGluZyB3aXRoIEphY2s6ICRACi0JJChqYXZhLXRvLWphY2spCi0KLWVuZGlmICAjIExPQ0FMX0lTX1NUQVRJQ19KQVZBX0xJQlJBUlkKLQotJChqYWNrX2NoZWNrX3RpbWVzdGFtcCk6ICQoamFja19hbGxfZGVwcykgfCBzZXR1cC1qYWNrLXNlcnZlcgotCUBlY2hvIENoZWNraW5nIGJ1aWxkIHdpdGggSmFjazogJEAKLQkkKGphY2stY2hlY2stamF2YSkKLWVuZGlmICMgTE9DQUxfSkFDS19FTkFCTEVECiskKExPQ0FMX0lOVEVSTUVESUFURV9UQVJHRVRTKTogUFJJVkFURV9ERUZBVUxUX0FQUF9UQVJHRVRfU0RLIDo9ICQobXlfZGVmYXVsdF9hcHBfdGFyZ2V0X3NkaykKKyQoTE9DQUxfSU5URVJNRURJQVRFX1RBUkdFVFMpOiBQUklWQVRFX1NES19WRVJTSU9OIDo9ICQobXlfc2RrX3ZlcnNpb24pCiskKExPQ0FMX0lOVEVSTUVESUFURV9UQVJHRVRTKTogUFJJVkFURV9NSU5fU0RLX1ZFUlNJT04gOj0gJChteV9taW5fc2RrX3ZlcnNpb24pCiAKIFVTRV9DT1JFX0xJQl9CT09UQ0xBU1NQQVRIIDo9CiAKZGlmZiAtLWdpdCBhL2NvcmUvaG9zdF9leGVjdXRhYmxlX2ludGVybmFsLm1rIGIvY29yZS9ob3N0X2V4ZWN1dGFibGVfaW50ZXJuYWwubWsKaW5kZXggMTkyMDBmZC4uYzRmOWY2NiAxMDA2NDQKLS0tIGEvY29yZS9ob3N0X2V4ZWN1dGFibGVfaW50ZXJuYWwubWsKKysrIGIvY29yZS9ob3N0X2V4ZWN1dGFibGVfaW50ZXJuYWwubWsKQEAgLTEyLDcgKzEyLDkgQEAKIExPQ0FMX01PRFVMRV9TVUZGSVggOj0gJCgkKG15X3ByZWZpeClFWEVDVVRBQkxFX1NVRkZJWCkKIGVuZGlmCiAKK2lmZGVmIGhvc3QtZXhlY3V0YWJsZS1ob29rCiAkKGNhbGwgaG9zdC1leGVjdXRhYmxlLWhvb2spCitlbmRpZgogCiBza2lwX2J1aWxkX2Zyb21fc291cmNlIDo9CiBpZmRlZiBMT0NBTF9QUkVCVUlMVF9NT0RVTEVfRklMRQpkaWZmIC0tZ2l0IGEvY29yZS9ob3N0X2Z1enpfdGVzdC5tayBiL2NvcmUvaG9zdF9mdXp6X3Rlc3QubWsKaW5kZXggODYyMjkxMS4uNTU2ZTAyZiAxMDA2NDQKLS0tIGEvY29yZS9ob3N0X2Z1enpfdGVzdC5taworKysgYi9jb3JlL2hvc3RfZnV6el90ZXN0Lm1rCkBAIC00LDcgKzQsNyBAQAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAkKGNhbGwgcmVjb3JkLW1vZHVsZS10eXBlLEhPU1RfRlVaWl9URVNUKQogCi1MT0NBTF9DRkxBR1MgKz0gLWZzYW5pdGl6ZS1jb3ZlcmFnZT10cmFjZS1wYy1ndWFyZAorTE9DQUxfQ0ZMQUdTICs9IC1mc2FuaXRpemUtY292ZXJhZ2U9dHJhY2UtcGMtZ3VhcmQsaW5kaXJlY3QtY2FsbHMsdHJhY2UtY21wCiBMT0NBTF9TVEFUSUNfTElCUkFSSUVTICs9IGxpYkxMVk1GdXp6ZXIKIAogaW5jbHVkZSAkKEJVSUxEX0hPU1RfRVhFQ1VUQUJMRSkKZGlmZiAtLWdpdCBhL2NvcmUvaG9zdF9qYXZhX2xpYnJhcnkubWsgYi9jb3JlL2hvc3RfamF2YV9saWJyYXJ5Lm1rCmluZGV4IGE2OGJlNmEuLjc1MDI1NGYgMTAwNjQ0Ci0tLSBhL2NvcmUvaG9zdF9qYXZhX2xpYnJhcnkubWsKKysrIGIvY29yZS9ob3N0X2phdmFfbGlicmFyeS5tawpAQCAtMzQsMTAgKzM0LDE1IEBACiBmdWxsX2NsYXNzZXNfY29tcGlsZWRfamFyIDo9ICQoaW50ZXJtZWRpYXRlcy5DT01NT04pL2NsYXNzZXMtZnVsbC1kZWJ1Zy5qYXIKIGZ1bGxfY2xhc3Nlc19qYXJqYXJfamFyIDo9ICQoaW50ZXJtZWRpYXRlcy5DT01NT04pL2NsYXNzZXMtamFyamFyLmphcgogZnVsbF9jbGFzc2VzX2phciA6PSAkKGludGVybWVkaWF0ZXMuQ09NTU9OKS9jbGFzc2VzLmphcgoramF2YV9zb3VyY2VfbGlzdF9maWxlIDo9ICQoaW50ZXJtZWRpYXRlcy5DT01NT04pL2phdmEtc291cmNlLWxpc3QKK2Z1bGxfY2xhc3Nlc19oZWFkZXJfamFyIDo9ICQoaW50ZXJtZWRpYXRlcy5DT01NT04pL2NsYXNzZXMtaGVhZGVyLmphcgorZnVsbF9jbGFzc2VzX2NvbWJpbmVkX2phciA6PSAkKGludGVybWVkaWF0ZXMuQ09NTU9OKS9jbGFzc2VzLWNvbWJpbmVkLmphcgogCiBMT0NBTF9JTlRFUk1FRElBVEVfVEFSR0VUUyArPSBcCiAgICAgJChmdWxsX2NsYXNzZXNfY29tcGlsZWRfamFyKSBcCiAgICAgJChmdWxsX2NsYXNzZXNfamFyamFyX2phcikgXAorICAgICQoamF2YV9zb3VyY2VfbGlzdF9maWxlKSBcCisgICAgJChmdWxsX2NsYXNzZXNfY29tYmluZWRfamFyKQogCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIGluY2x1ZGUgJChCVUlMRF9TWVNURU0pL2Jhc2VfcnVsZXMubWsKQEAgLTUwLDUzICs1NSw3MyBAQAogaW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvamF2YV9jb21tb24ubWsKIAogIyBUaGUgbGF5ZXJzIGZpbGUgYWxsb3dzIHlvdSB0byBlbmZvcmNlIGEgbGF5ZXJpbmcgYmV0d2VlbiBqYXZhIHBhY2thZ2VzLgotIyBSdW4gYnVpbGQvdG9vbHMvamF2YS1sYXllcnMucHkgZm9yIG1vcmUgZGV0YWlscy4KKyMgUnVuIGJ1aWxkL21ha2UvdG9vbHMvamF2YS1sYXllcnMucHkgZm9yIG1vcmUgZGV0YWlscy4KIGxheWVyc19maWxlIDo9ICQoYWRkcHJlZml4ICQoTE9DQUxfUEFUSCkvLCAkKExPQ0FMX0pBVkFfTEFZRVJTX0ZJTEUpKQogCi0jIElmIGVycm9yIHByb25lIGlzIGVuYWJsZWQgdGhlbiBhZGQgTE9DQUxfRVJST1JfUFJPTkVfRkxBR1MgdG8gTE9DQUxfSkFWQUNGTEFHUwotaWZlcSAoJChSVU5fRVJST1JfUFJPTkUpLHRydWUpCi1MT0NBTF9KQVZBQ0ZMQUdTICs9ICQoTE9DQUxfRVJST1JfUFJPTkVfRkxBR1MpCi1lbmRpZgorIyBMaXN0IG9mIGRlcGVuZGVuY2llcyBmb3IgYW55dGhpbmcgdGhhdCBuZWVkcyBhbGwgamF2YSBzb3VyY2VzIGluIHBsYWNlCitqYXZhX3NvdXJjZXNfZGVwcyA6PSBcCisgICAgJChqYXZhX3NvdXJjZXMpIFwKKyAgICAkKGphdmFfcmVzb3VyY2Vfc291cmNlcykgXAorICAgICQocHJvdG9famF2YV9zb3VyY2VzX2ZpbGVfc3RhbXApIFwKKyAgICAkKExPQ0FMX1NSQ0pBUlMpIFwKKyAgICAkKExPQ0FMX0FERElUSU9OQUxfREVQRU5ERU5DSUVTKQorCiskKGphdmFfc291cmNlX2xpc3RfZmlsZSk6ICQoamF2YV9zb3VyY2VzX2RlcHMpCisJJCh3cml0ZS1qYXZhLXNvdXJjZS1saXN0KQogCiAkKGZ1bGxfY2xhc3Nlc19jb21waWxlZF9qYXIpOiBQUklWQVRFX0pBVkFfTEFZRVJTX0ZJTEUgOj0gJChsYXllcnNfZmlsZSkKLSQoZnVsbF9jbGFzc2VzX2NvbXBpbGVkX2phcik6IFBSSVZBVEVfSkFWQUNGTEFHUyA6PSAkKEdMT0JBTF9KQVZBQ19ERUJVR19GTEFHUykgJChMT0NBTF9KQVZBQ0ZMQUdTKSAkKGFubm90YXRpb25fcHJvY2Vzc29yX2ZsYWdzKQorJChmdWxsX2NsYXNzZXNfY29tcGlsZWRfamFyKTogUFJJVkFURV9KQVZBQ0ZMQUdTIDo9ICQoTE9DQUxfSkFWQUNGTEFHUykgJChhbm5vdGF0aW9uX3Byb2Nlc3Nvcl9mbGFncykKICQoZnVsbF9jbGFzc2VzX2NvbXBpbGVkX2phcik6IFBSSVZBVEVfSkFSX0VYQ0xVREVfRklMRVMgOj0KICQoZnVsbF9jbGFzc2VzX2NvbXBpbGVkX2phcik6IFBSSVZBVEVfSkFSX1BBQ0tBR0VTIDo9CiAkKGZ1bGxfY2xhc3Nlc19jb21waWxlZF9qYXIpOiBQUklWQVRFX0pBUl9FWENMVURFX1BBQ0tBR0VTIDo9CiskKGZ1bGxfY2xhc3Nlc19jb21waWxlZF9qYXIpOiBQUklWQVRFX1NSQ0pBUlMgOj0gJChMT0NBTF9TUkNKQVJTKQorJChmdWxsX2NsYXNzZXNfY29tcGlsZWRfamFyKTogUFJJVkFURV9TUkNKQVJfTElTVF9GSUxFIDo9ICQoaW50ZXJtZWRpYXRlcy5DT01NT04pL3NyY2phci1saXN0CiskKGZ1bGxfY2xhc3Nlc19jb21waWxlZF9qYXIpOiBQUklWQVRFX1NSQ0pBUl9JTlRFUk1FRElBVEVTX0RJUiA6PSAkKGludGVybWVkaWF0ZXMuQ09NTU9OKS9zcmNqYXJzCiAkKGZ1bGxfY2xhc3Nlc19jb21waWxlZF9qYXIpOiBcCi0gICAgICAgICQoamF2YV9zb3VyY2VzKSBcCi0gICAgICAgICQoamF2YV9yZXNvdXJjZV9zb3VyY2VzKSBcCi0gICAgICAgICQoZnVsbF9qYXZhX2xpYl9kZXBzKSBcCi0gICAgICAgICQoamFyX21hbmlmZXN0X2ZpbGUpIFwKLSAgICAgICAgJChwcm90b19qYXZhX3NvdXJjZXNfZmlsZV9zdGFtcCkgXAotICAgICAgICAkKGFubm90YXRpb25fcHJvY2Vzc29yX2RlcHMpIFwKLSAgICAgICAgJChOT1JNQUxJWkVfUEFUSCkgXAotICAgICAgICAkKFpJUFRJTUUpIFwKLSAgICAgICAgJChMT0NBTF9BRERJVElPTkFMX0RFUEVOREVOQ0lFUykgXAotICAgICAgICB8ICQoU09PTkdfSkFWQUNfV1JBUFBFUikKKyAgICAkKGphdmFfc291cmNlX2xpc3RfZmlsZSkgXAorICAgICQoamF2YV9zb3VyY2VzX2RlcHMpIFwKKyAgICAkKGZ1bGxfamF2YV9saWJzKSBcCisgICAgJChmdWxsX2phdmFfYm9vdGNsYXNzcGF0aF9saWJzKSBcCisgICAgJChhbm5vdGF0aW9uX3Byb2Nlc3Nvcl9kZXBzKSBcCisgICAgJChOT1JNQUxJWkVfUEFUSCkgXAorICAgICQoWklQVElNRSkgXAorICAgICQoSkFSX0FSR1MpIFwKKyAgICAkKFpJUFNZTkMpIFwKKyAgICB8ICQoU09PTkdfSkFWQUNfV1JBUFBFUikKIAkkKHRyYW5zZm9ybS1ob3N0LWphdmEtdG8tcGFja2FnZSkKIAkkKHJlbW92ZS10aW1lc3RhbXBzLWZyb20tcGFja2FnZSkKIAogamF2YWMtY2hlY2sgOiAkKGZ1bGxfY2xhc3Nlc19jb21waWxlZF9qYXIpCiBqYXZhYy1jaGVjay0kKExPQ0FMX01PRFVMRSkgOiAkKGZ1bGxfY2xhc3Nlc19jb21waWxlZF9qYXIpCiAKKyQoZnVsbF9jbGFzc2VzX2NvbWJpbmVkX2phcik6ICQoZnVsbF9jbGFzc2VzX2NvbXBpbGVkX2phcikgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChqYXJfbWFuaWZlc3RfZmlsZSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChmdWxsX3N0YXRpY19qYXZhX2xpYnMpIHwgJChNRVJHRV9aSVBTKQorCSQoaWYgJChQUklWQVRFX0pBUl9NQU5JRkVTVCksICQoaGlkZSkgc2VkIC1lICJzLyVCVUlMRF9OVU1CRVIlLyQoQlVJTERfTlVNQkVSX0ZST01fRklMRSkvIiBcCisgICAgICAgICAgICAkKFBSSVZBVEVfSkFSX01BTklGRVNUKSA+ICQoZGlyICRAKS9tYW5pZmVzdC5tZikKKwkkKE1FUkdFX1pJUFMpIC1qIC0taWdub3JlLWR1cGxpY2F0ZXMgJChpZiAkKFBSSVZBVEVfSkFSX01BTklGRVNUKSwtbSAkKGRpciAkQCkvbWFuaWZlc3QubWYpIFwKKyAgICAgICAgICAgIC1zdHJpcERpciBNRVRBLUlORiAtemlwVG9Ob3RTdHJpcCAkPCAkQCAkPCAkKGNhbGwgcmV2ZXJzZS1saXN0LCQoUFJJVkFURV9TVEFUSUNfSkFWQV9MSUJSQVJJRVMpKQorCiAjIFJ1biBqYXJqYXIgaWYgbmVjZXNzYXJ5LCBvdGhlcndpc2UganVzdCBjb3B5IHRoZSBmaWxlLgogaWZuZXEgKCQoc3RyaXAgJChMT0NBTF9KQVJKQVJfUlVMRVMpKSwpCiAkKGZ1bGxfY2xhc3Nlc19qYXJqYXJfamFyKTogUFJJVkFURV9KQVJKQVJfUlVMRVMgOj0gJChMT0NBTF9KQVJKQVJfUlVMRVMpCi0kKGZ1bGxfY2xhc3Nlc19qYXJqYXJfamFyKTogJChmdWxsX2NsYXNzZXNfY29tcGlsZWRfamFyKSAkKExPQ0FMX0pBUkpBUl9SVUxFUykgfCAkKEpBUkpBUikKKyQoZnVsbF9jbGFzc2VzX2phcmphcl9qYXIpOiAkKGZ1bGxfY2xhc3Nlc19jb21iaW5lZF9qYXIpICQoTE9DQUxfSkFSSkFSX1JVTEVTKSB8ICQoSkFSSkFSKQogCUBlY2hvIEphckphcjogJEAKIAkkKGhpZGUpICQoSkFWQSkgLWphciAkKEpBUkpBUikgcHJvY2VzcyAkKFBSSVZBVEVfSkFSSkFSX1JVTEVTKSAkPCAkQAogZWxzZQotZnVsbF9jbGFzc2VzX2phcmphcl9qYXIgOj0gJChmdWxsX2NsYXNzZXNfY29tcGlsZWRfamFyKQorZnVsbF9jbGFzc2VzX2phcmphcl9qYXIgOj0gJChmdWxsX2NsYXNzZXNfY29tYmluZWRfamFyKQogZW5kaWYKIAogCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIExPQ0FMX0ZVTExfQ0xBU1NFU19QUkVfSkFDT0NPX0pBUiA6PSAkKGZ1bGxfY2xhc3Nlc19qYXJqYXJfamFyKQogCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIGluY2x1ZGUgJChCVUlMRF9TWVNURU0pL2phY29jby5tawogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAKICQoZXZhbCAkKGNhbGwgY29weS1vbmUtZmlsZSwkKExPQ0FMX0ZVTExfQ0xBU1NFU19KQUNPQ09fSkFSKSwkKExPQ0FMX0JVSUxUX01PRFVMRSkpKQogJChldmFsICQoY2FsbCBjb3B5LW9uZS1maWxlLCQoTE9DQUxfRlVMTF9DTEFTU0VTX0pBQ09DT19KQVIpLCQoZnVsbF9jbGFzc2VzX2phcikpKQogCitpZmVxICgkKFRVUkJJTkVfRU5BQkxFRCksZmFsc2UpCiskKGV2YWwgJChjYWxsIGNvcHktb25lLWZpbGUsJChMT0NBTF9GVUxMX0NMQVNTRVNfSkFDT0NPX0pBUiksJChmdWxsX2NsYXNzZXNfaGVhZGVyX2phcikpKQorZW5kaWYKZGlmZiAtLWdpdCBhL2NvcmUvaG9zdF9qYXZhX2xpYnJhcnlfY29tbW9uLm1rIGIvY29yZS9ob3N0X2phdmFfbGlicmFyeV9jb21tb24ubWsKaW5kZXggOGRmNGIzNy4uNTFlMmQ5NCAxMDA2NDQKLS0tIGEvY29yZS9ob3N0X2phdmFfbGlicmFyeV9jb21tb24ubWsKKysrIGIvY29yZS9ob3N0X2phdmFfbGlicmFyeV9jb21tb24ubWsKQEAgLTQ4LDMgKzQ4LDggQEAKIAogTE9DQUxfSU5URVJNRURJQVRFX1NPVVJDRV9ESVIgOj0gJChpbnRlcm1lZGlhdGVzLkNPTU1PTikvc3JjCiBMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSAkKHNvcnQgJChMT0NBTF9KQVZBX0xJQlJBUklFUykpCisKKyMgSWYgZXJyb3IgcHJvbmUgaXMgZW5hYmxlZCB0aGVuIGFkZCBMT0NBTF9FUlJPUl9QUk9ORV9GTEFHUyB0byBMT0NBTF9KQVZBQ0ZMQUdTCitpZmVxICgkKFJVTl9FUlJPUl9QUk9ORSksdHJ1ZSkKK0xPQ0FMX0pBVkFDRkxBR1MgKz0gJChMT0NBTF9FUlJPUl9QUk9ORV9GTEFHUykKK2VuZGlmCmRpZmYgLS1naXQgYS9jb3JlL2hvc3Rfc2hhcmVkX2xpYnJhcnlfaW50ZXJuYWwubWsgYi9jb3JlL2hvc3Rfc2hhcmVkX2xpYnJhcnlfaW50ZXJuYWwubWsKaW5kZXggYmZiZGUyMS4uMGEzYjMxNyAxMDA2NDQKLS0tIGEvY29yZS9ob3N0X3NoYXJlZF9saWJyYXJ5X2ludGVybmFsLm1rCisrKyBiL2NvcmUvaG9zdF9zaGFyZWRfbGlicmFyeV9pbnRlcm5hbC5tawpAQCAtMjAsNyArMjAsOSBAQAogJChlcnJvciAkKExPQ0FMX1BBVEgpOiBDYW5ub3Qgc2V0IG1vZHVsZSBzdGVtIGZvciBhIGxpYnJhcnkpCiBlbmRpZgogCitpZmRlZiBob3N0LXNoYXJlZC1saWJyYXJ5LWhvb2sKICQoY2FsbCBob3N0LXNoYXJlZC1saWJyYXJ5LWhvb2spCitlbmRpZgogCiBza2lwX2J1aWxkX2Zyb21fc291cmNlIDo9CiBpZmRlZiBMT0NBTF9QUkVCVUlMVF9NT0RVTEVfRklMRQpAQCAtMzksNyArNDEsNyBAQAogaW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvYmluYXJ5Lm1rCiAKIG15X2hvc3RfbGlicHJvZmlsZV9ydCA6PSAkKCQoTE9DQUxfMk5EX0FSQ0hfVkFSX1BSRUZJWCkkKG15X3ByZWZpeClMSUJQUk9GSUxFX1JUKQotJChMT0NBTF9CVUlMRF9NT0RVTEUpOiBQUklWQVRFX0hPU1RfTElCUFJPRklMRV9SVCA6PSAkKG15X2hvc3RfbGlicHJvZmlsZV9ydCkKKyQoTE9DQUxfQlVJTFRfTU9EVUxFKTogUFJJVkFURV9IT1NUX0xJQlBST0ZJTEVfUlQgOj0gJChteV9ob3N0X2xpYnByb2ZpbGVfcnQpCiAKICQoTE9DQUxfQlVJTFRfTU9EVUxFKTogXAogICAgICAgICAkKGFsbF9vYmplY3RzKSBcCmRpZmYgLS1naXQgYS90YXJnZXQvYm9hcmQvZ2VuZXJpY19hcm12NS9Cb2FyZENvbmZpZy5tayBiL2NvcmUvaG9zdF90ZXN0X2NvbmZpZy5tawpzaW1pbGFyaXR5IGluZGV4IDY4JQpjb3B5IGZyb20gdGFyZ2V0L2JvYXJkL2dlbmVyaWNfYXJtdjUvQm9hcmRDb25maWcubWsKY29weSB0byBjb3JlL2hvc3RfdGVzdF9jb25maWcubWsKaW5kZXggMDE2OTM3YS4uYjk5NzVlNSAxMDA2NDQKLS0tIGEvdGFyZ2V0L2JvYXJkL2dlbmVyaWNfYXJtdjUvQm9hcmRDb25maWcubWsKKysrIGIvY29yZS9ob3N0X3Rlc3RfY29uZmlnLm1rCkBAIC0xLDUgKzEsNSBAQAogIwotIyBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIyBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogIwogIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMTQsMTAgKzE0LDEyIEBACiAjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1pbmNsdWRlIGJ1aWxkL3RhcmdldC9ib2FyZC9nZW5lcmljL0JvYXJkQ29uZmlnLm1rCisjCisjIENvbW1vbiBydWxlcyBmb3IgYnVpbGRpbmcgYSBUcmFkZUZlZCB0ZXN0IFhNTCBmaWxlIGZvciBob3N0IHNpZGUgdGVzdHMuCisjCiAKLVRBUkdFVF9BUkNIX1ZBUklBTlQgOj0gYXJtdjV0ZQotVEFSR0VUX0NQVV9BQkkgOj0gYXJtZWFiaQotVEFSR0VUX0NQVV9BQkkyIDo9CiskKGNhbGwgcmVjb3JkLW1vZHVsZS10eXBlLEhPU1RfVEVTVF9DT05GSUcpCiAKLVdJVEhfREVYUFJFT1BUIDo9IGZhbHNlCitMT0NBTF9JU19IT1NUX01PRFVMRSA6PSB0cnVlCisKK2luY2x1ZGUgJChCVUlMRF9TWVNURU0pL3Rlc3RfY29uZmlnX2NvbW1vbi5tawpkaWZmIC0tZ2l0IGEvY29yZS9ob3N0X3Rlc3RfaW50ZXJuYWwubWsgYi9jb3JlL2hvc3RfdGVzdF9pbnRlcm5hbC5tawppbmRleCBmZmIyMmM3Li40MmUwMWUxIDEwMDY0NAotLS0gYS9jb3JlL2hvc3RfdGVzdF9pbnRlcm5hbC5taworKysgYi9jb3JlL2hvc3RfdGVzdF9pbnRlcm5hbC5tawpAQCAtNSw5ICs1LDcgQEAKIGlmZXEgKCQoTE9DQUxfR1RFU1QpLHRydWUpCiAgIExPQ0FMX0NGTEFHU193aW5kb3dzICs9IC1ER1RFU1RfT1NfV0lORE9XUwogICBMT0NBTF9DRkxBR1NfbGludXggKz0gLURHVEVTVF9PU19MSU5VWAotICBMT0NBTF9MRExJQlNfbGludXggKz0gLWxwdGhyZWFkCiAgIExPQ0FMX0NGTEFHU19kYXJ3aW4gKz0gLURHVEVTVF9PU19NQUMKLSAgTE9DQUxfTERMSUJTX2RhcndpbiArPSAtbHB0aHJlYWQKIAogICBMT0NBTF9DRkxBR1MgKz0gLURHVEVTVF9IQVNfU1REX1NUUklORyAtTzAgLWcKIApkaWZmIC0tZ2l0IGEvY29yZS9pbnN0YWxsX2puaV9saWJzLm1rIGIvY29yZS9pbnN0YWxsX2puaV9saWJzLm1rCmluZGV4IGU4OGRiNDAuLmI3ZDgzZGMgMTAwNjQ0Ci0tLSBhL2NvcmUvaW5zdGFsbF9qbmlfbGlicy5taworKysgYi9jb3JlL2luc3RhbGxfam5pX2xpYnMubWsKQEAgLTE4LDE5ICsxOCw5IEBACiBpZm5lcSAoJChmaWx0ZXIgdGVzdHMgc2FtcGxlcywgJChMT0NBTF9NT0RVTEVfVEFHUykpLCkKIG15X2VtYmVkX2puaSA6PSB0cnVlCiBlbmRpZgotaWZlcSAoJChQUk9EVUNUX0ZVTExfVFJFQkxFKSx0cnVlKQotICBpZmVxICgkKGZpbHRlciAkKFRBUkdFVF9PVVQpLyUsICQobXlfbW9kdWxlX3BhdGgpKSwpCi0gICAgIyBJZiB0aGlzIGFwcCBpc24ndCB0byBiZSBpbnN0YWxsZWQgdG8gdGhlIHN5c3RlbSBwYXJ0aXRpb24sIGFuZCB0aGUgZGV2aWNlCi0gICAgIyBpcyBmdWxseSB0cmVibGUtaXplZCB0aGVuIGpuaSBsaWJzIGFyZSBlbWJlZGRlZCwgT3RoZXJ3aXNlLCBhY2Nlc3MgdG8gdGhlCi0gICAgIyBkaXJlY3Rvcnkgd2hlcmUgdGhlIGxpYiBpcyBpbnN0YWxsZWQgdG8gKHVzdWFsbHkgL3ZlbmRvci9saWIpIG5lZWRzIHRvIGJlCi0gICAgIyBhbGxvd2VkIGZvciBzeXN0ZW0gcHJvY2Vzc2VzLCB3aGljaCBpcyBhIFRyZWJsZSB2aW9sYXRpb24uCi0gICAgbXlfZW1iZWRfam5pIDo9IHRydWUKLSAgZW5kaWYKLWVsc2UKLSAgaWZlcSAoJChmaWx0ZXIgJChUQVJHRVRfT1VUKS8lICQoVEFSR0VUX09VVF9WRU5ET1IpLyUgJChUQVJHRVRfT1VUX09FTSkvJSwgJChteV9tb2R1bGVfcGF0aCkpLCkKLSAgICAjIElmIHRoaXMgYXBwIGlzbid0IHRvIGJlIGluc3RhbGxlZCB0byBzeXN0ZW0sIHZlbmRvciwgb3Igb2VtIHBhcnRpdGlvbnMuCi0gICAgbXlfZW1iZWRfam5pIDo9IHRydWUKLSAgZW5kaWYKK2lmZXEgKCQoZmlsdGVyICQoVEFSR0VUX09VVCkvJSAkKFRBUkdFVF9PVVRfVkVORE9SKS8lICQoVEFSR0VUX09VVF9PRU0pLyUsICQobXlfbW9kdWxlX3BhdGgpKSwpCisjIElmIHRoaXMgYXBwIGlzbid0IHRvIGJlIGluc3RhbGxlZCB0byBzeXN0ZW0gcGFydGl0aW9ucy4KK215X2VtYmVkX2puaSA6PSB0cnVlCiBlbmRpZgogIyBJZiB3ZSdyZSBpbnN0YWxsaW5nIHRoaXMgQVBQIGFzIGEgY29tcHJlc3NlZCBtb2R1bGUsIHdlIGluY2x1ZGUgYWxsIEpOSSBsaWJyYXJpZXMKICMgaW4gdGhlIGNvbXByZXNzZWQgYXJ0aWZhY3QsIHJhdGhlciB0aGFuIGFzIHNlcGFyYXRlIGZpbGVzIG9uIHRoZSBwYXJ0aXRpb24gaW4gcXVlc3Rpb24uCmRpZmYgLS1naXQgYS9jb3JlL2luc3RhbGxfam5pX2xpYnNfaW50ZXJuYWwubWsgYi9jb3JlL2luc3RhbGxfam5pX2xpYnNfaW50ZXJuYWwubWsKaW5kZXggYjVmMTBjZi4uYTk5ZDg4YSAxMDA2NDQKLS0tIGEvY29yZS9pbnN0YWxsX2puaV9saWJzX2ludGVybmFsLm1rCisrKyBiL2NvcmUvaW5zdGFsbF9qbmlfbGlic19pbnRlcm5hbC5tawpAQCAtMjQsMTYgKzI0LDExIEBACiBpZmRlZiBteV9lbWJlZF9qbmkKICMgQXBwIGV4cGxpY2l0bHkgcmVxdWlyZXMgdGhlIHByZWJ1aWx0IE5ESyBzdGwgc2hhcmVkIGxpYnJhaWVzLgogIyBUaGUgTkRLIHN0bCBzaGFyZWQgbGlicmFyaWVzIHNob3VsZCBuZXZlciBnbyB0byB0aGUgc3lzdGVtIGltYWdlLgotaWZuZXEgKCQoZmlsdGVyICQoTE9DQUxfTkRLX1NUTF9WQVJJQU5UKSwgc3RscG9ydF9zaGFyZWQgYysrX3NoYXJlZCksKQoraWZlcSAoJChMT0NBTF9OREtfU1RMX1ZBUklBTlQpLGMrK19zaGFyZWQpCiBpZm5kZWYgTE9DQUxfU0RLX1ZFUlNJT04KICQoZXJyb3IgTE9DQUxfU0RLX1ZFUlNJT04gbXVzdCBiZSBkZWZpbmVkIHdpdGggTE9DQUxfTkRLX1NUTF9WQVJJQU5ULCBcCiAgICAgTE9DQUxfUEFDS0FHRV9OQU1FPSQoTE9DQUxfUEFDS0FHRV9OQU1FKSkKIGVuZGlmCi1lbmRpZgotaWZlcSAoc3RscG9ydF9zaGFyZWQsJChMT0NBTF9OREtfU1RMX1ZBUklBTlQpKQotbXlfam5pX3NoYXJlZF9saWJyYXJpZXMgKz0gXAotICAgICQoSElTVE9SSUNBTF9OREtfVkVSU0lPTlNfUk9PVCkvJChMT0NBTF9OREtfVkVSU0lPTikvc291cmNlcy9jeHgtc3RsL3N0bHBvcnQvbGlicy8kKFRBUkdFVF8kKG15XzJuZF9hcmNoX3ByZWZpeClDUFVfQUJJKS9saWJzdGxwb3J0X3NoYXJlZC5zbwotZWxzZSBpZmVxIChjKytfc2hhcmVkLCQoTE9DQUxfTkRLX1NUTF9WQVJJQU5UKSkKIG15X2puaV9zaGFyZWRfbGlicmFyaWVzICs9IFwKICAgICAkKEhJU1RPUklDQUxfTkRLX1ZFUlNJT05TX1JPT1QpLyQoTE9DQUxfTkRLX1ZFUlNJT04pL3NvdXJjZXMvY3h4LXN0bC9sbHZtLWxpYmMrKy9saWJzLyQoVEFSR0VUXyQobXlfMm5kX2FyY2hfcHJlZml4KUNQVV9BQkkpL2xpYmMrK19zaGFyZWQuc28KIGVuZGlmCkBAIC0xMDgsMTUgKzEwMywxOSBAQAogZW5kaWYgICMgb3V0ZXIgbXlfcHJlYnVpbHRfam5pX2xpYnMKIAogIyBWZXJpZnkgdGhhdCBhbGwgaW5jbHVkZWQgbGlicmFyaWVzIGFyZSBidWlsdCBhZ2FpbnN0IHRoZSBOREsKK2luY2x1ZGUgJChCVUlMRF9TWVNURU0pL2FsbG93ZWRfbmRrX3R5cGVzLm1rCiBpZm5lcSAoJChzdHJpcCAkKExPQ0FMX0pOSV9TSEFSRURfTElCUkFSSUVTKSksKQogaWZuZXEgKCQoTE9DQUxfU0RLX1ZFUlNJT04pLCkKIG15X2xpbmtfdHlwZSA6PSBhcHA6c2RrCi1teV93YXJuX3R5cGVzIDo9IG5hdGl2ZTpwbGF0Zm9ybQotbXlfYWxsb3dlZF90eXBlcyA6PSBuYXRpdmU6bmRrCitteV93YXJuX3R5cGVzIDo9IG5hdGl2ZTpwbGF0Zm9ybSAkKG15X3dhcm5fbmRrX3R5cGVzKQorbXlfYWxsb3dlZF90eXBlcyA6PSAkKG15X2FsbG93ZWRfbmRrX3R5cGVzKQorICAgIGlmbmVxICgsJChmaWx0ZXIgdHJ1ZSwkKExPQ0FMX1ZFTkRPUl9NT0RVTEUpICQoTE9DQUxfT0RNX01PRFVMRSkgJChMT0NBTF9QUk9QUklFVEFSWV9NT0RVTEUpKSkKKyAgICAgICAgbXlfYWxsb3dlZF90eXBlcyArPSBuYXRpdmU6dmVuZG9yIG5hdGl2ZTp2bmRrCisgICAgZW5kaWYKIGVsc2UKIG15X2xpbmtfdHlwZSA6PSBhcHA6cGxhdGZvcm0KLW15X3dhcm5fdHlwZXMgOj0KLW15X2FsbG93ZWRfdHlwZXMgOj0gbmF0aXZlOm5kayBuYXRpdmU6cGxhdGZvcm0gbmF0aXZlOnZlbmRvcgorbXlfd2Fybl90eXBlcyA6PSAkKG15X3dhcm5fbmRrX3R5cGVzKQorbXlfYWxsb3dlZF90eXBlcyA6PSAkKG15X2FsbG93ZWRfbmRrX3R5cGVzKSBuYXRpdmU6cGxhdGZvcm0gbmF0aXZlOnZlbmRvciBuYXRpdmU6dm5kayBuYXRpdmU6dm5ka19wcml2YXRlCiBlbmRpZgogCiBteV9saW5rX2RlcHMgOj0gJChhZGRwcmVmaXggU0hBUkVEX0xJQlJBUklFUzosJChMT0NBTF9KTklfU0hBUkVEX0xJQlJBUklFUykpCmRpZmYgLS1naXQgYS9jb3JlL2luc3RydW1lbnRhdGlvbl90ZXN0X2NvbmZpZ190ZW1wbGF0ZS54bWwgYi9jb3JlL2luc3RydW1lbnRhdGlvbl90ZXN0X2NvbmZpZ190ZW1wbGF0ZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThlYTY3NgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvaW5zdHJ1bWVudGF0aW9uX3Rlc3RfY29uZmlnX3RlbXBsYXRlLnhtbApAQCAtMCwwICsxLDI5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPCEtLSBUaGlzIHRlc3QgY29uZmlnIGZpbGUgaXMgYXV0by1nZW5lcmF0ZWQuIC0tPgorPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IlJ1bnMge0xBQkVMfS4iPgorICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJhcGN0IiAvPgorICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJhcGN0LWluc3RydW1lbnRhdGlvbiIgLz4KKyAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLnN1aXRlLlN1aXRlQXBrSW5zdGFsbGVyIj4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGVhbnVwLWFwa3MiIHZhbHVlPSJ0cnVlIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InRlc3QtZmlsZS1uYW1lIiB2YWx1ZT0ie01PRFVMRX0uYXBrIiAvPgorICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgorCisgICAgPHRlc3QgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLntURVNUX1RZUEV9IiA+CisgICAgICAgIDxvcHRpb24gbmFtZT0icGFja2FnZSIgdmFsdWU9IntQQUNLQUdFfSIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJydW5uZXIiIHZhbHVlPSJ7UlVOTkVSfSIgLz4KKyAgICA8L3Rlc3Q+Cis8L2NvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9jb3JlL2phY2stZGVmYXVsdC5hcmdzIGIvY29yZS9qYWNrLWRlZmF1bHQuYXJncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDMzYmM1My4uMDAwMDAwMAotLS0gYS9jb3JlL2phY2stZGVmYXVsdC5hcmdzCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi0tRCBzY2hlZC5ydW5uZXI9bXVsdGktdGhyZWFkZWQKLS1EIHNjaGVkLnJ1bm5lci50aHJlYWQua2luZD1maXhlZAotLUQgc2NoZWQucnVubmVyLnRocmVhZC5maXhlZC5jb3VudD00Ci0tLXNhbml0eS1jaGVja3Mgb2ZmCi0tRCBqYWNrLnJlcG9ydGVyLmxldmVsLmZpbGU9ZXJyb3I9LS0sd2FybmluZz0tCi0tLXZlcmJvc2UgZXJyb3IKLS1EIGphY2suamF5Y2UuY2FjaGU9ZmFsc2UKLS1EIGphY2subGFtYmRhLmdyb3VwaW5nLXNjb3BlPXBhY2thZ2UKLS1EIGphY2subGFtYmRhLnNpbXBsaWZ5LXN0YXRlbGVzcz10cnVlCmRpZmYgLS1naXQgYS9jb3JlL2phY29jby5tayBiL2NvcmUvamFjb2NvLm1rCmluZGV4IGEwNGQyNWUuLjY0MDZkZjQgMTAwNjQ0Ci0tLSBhL2NvcmUvamFjb2NvLm1rCisrKyBiL2NvcmUvamFjb2NvLm1rCkBAIC0xOSw0NCArMTksMjAgQEAKICMgKGF0IHRoZSB0aW1lIG9mIGF1dGhvcnNoaXAsIGl0IGlzIGluY2x1ZGVkIGJ5IGphdmEubWsgYW5kCiAjIGphdmFfaG9zdF9saWJyYXJ5Lm1rKQogCi1teV9pbmNsdWRlX2ZpbHRlciA6PQotbXlfZXhjbHVkZV9maWx0ZXIgOj0KKyMgZGV0ZXJtaW5lIEphY29jbyBpbmNsdWRlL2V4Y2x1ZGUgZmlsdGVycyBldmVuIHdoZW4gY292ZXJhZ2UgaXMgbm90IGVuYWJsZWQKKyMgdG8gZ2V0IHN5bnRheCBjaGVja2luZyBvbiBMT0NBTF9KQUNLX0NPVkVSQUdFXyhJTkNMVURFfEVYQ0xVREUpX0ZJTFRFUgorIyBjb3B5IGZpbHRlcnMgZnJvbSBKYWNrIGJ1dCBhbHNvIHNraXAgc29tZSBrbm93biBqYXZhIHBhY2thZ2VzCitteV9pbmNsdWRlX2ZpbHRlciA6PSAkKHN0cmlwICQoTE9DQUxfSkFDS19DT1ZFUkFHRV9JTkNMVURFX0ZJTFRFUikpCitteV9leGNsdWRlX2ZpbHRlciA6PSAkKHN0cmlwICQoREVGQVVMVF9KQUNPQ09fRVhDTFVERV9GSUxURVIpLCQoTE9DQUxfSkFDS19DT1ZFUkFHRV9FWENMVURFX0ZJTFRFUikpCisKK215X2luY2x1ZGVfYXJncyA6PSAkKGNhbGwgamFjb2NvLWNsYXNzLWZpbHRlci10by1maWxlLWFyZ3MsICQobXlfaW5jbHVkZV9maWx0ZXIpKQorbXlfZXhjbHVkZV9hcmdzIDo9ICQoY2FsbCBqYWNvY28tY2xhc3MtZmlsdGVyLXRvLWZpbGUtYXJncywgJChteV9leGNsdWRlX2ZpbHRlcikpCisKKyMgc2luZ2xlLXF1b3RlIGVhY2ggYXJnIG9mIHRoZSBpbmNsdWRlIGFyZ3Mgc28gdGhlICcqJyBnZXRzIGV2YWx1YXRlZCBieSB6aXAKKyMgZG9uJ3QgcXVvdGUgdGhlIGV4Y2x1ZGUgYXJncyB0aGV5IG5lZWQgdG8gYmUgZXZhbHVhdGVkIGJ5IGJhc2ggZm9yIHJtIC1yZgorbXlfaW5jbHVkZV9hcmdzIDo9ICQoZm9yZWFjaCBhcmcsJChteV9pbmNsdWRlX2FyZ3MpLCckKGFyZyknKQogCiBpZmVxICgkKExPQ0FMX0VNTUFfSU5TVFJVTUVOVCksdHJ1ZSkKLSAgaWZlcSAoJChBTkRST0lEX0NPTVBJTEVfV0lUSF9KQUNLKSxmYWxzZSkKLSAgICAjIGRldGVybWluZSBKYWNvY28gaW5jbHVkZS9leGNsdWRlIGZpbHRlcnMKLSAgICBERUZBVUxUX0pBQ09DT19FWENMVURFX0ZJTFRFUiA6PSBvcmcvanVuaXQvKixvcmcvamFjb2NvLyosb3JnL21vY2tpdG8vKgotICAgICMgY29weSBmaWx0ZXJzIGZyb20gSmFjayBidXQgYWxzbyBza2lwIHNvbWUga25vd24gamF2YSBwYWNrYWdlcwotICAgIG15X2luY2x1ZGVfZmlsdGVyIDo9ICQoc3RyaXAgJChMT0NBTF9KQUNLX0NPVkVSQUdFX0lOQ0xVREVfRklMVEVSKSkKLSAgICBteV9leGNsdWRlX2ZpbHRlciA6PSAkKHN0cmlwICQoREVGQVVMVF9KQUNPQ09fRVhDTFVERV9GSUxURVIpLCQoTE9DQUxfSkFDS19DT1ZFUkFHRV9FWENMVURFX0ZJTFRFUikpCi0KLSAgICAjIHJlcGxhY2UgJy4nIHdpdGggJy8nIGFuZCAnLCcgd2l0aCAnICcsIGFuZCBxdW90ZSBlYWNoIGFyZwotICAgIGlmbmVxICgkKHN0cmlwICQobXlfaW5jbHVkZV9maWx0ZXIpKSwpCi0gICAgICBteV9pbmNsdWRlX2FyZ3MgOj0gJChzdHJpcCAkKG15X2luY2x1ZGVfZmlsdGVyKSkKLQotICAgICAgbXlfaW5jbHVkZV9hcmdzIDo9ICQoc3Vic3QgLiwvLCQobXlfaW5jbHVkZV9hcmdzKSkKLSAgICAgIG15X2luY2x1ZGVfYXJncyA6PSAnJChzdWJzdCAkKGNvbW1hKSwnICcsJChteV9pbmNsdWRlX2FyZ3MpKScKLSAgICBlbHNlCi0gICAgICBteV9pbmNsdWRlX2FyZ3MgOj0KLSAgICBlbmRpZgotCi0gICAgIyByZXBsYWNlICcuJyB3aXRoICcvJyBhbmQgJywnIHdpdGggJyAnLCBhbmQgcXVvdGUgZWFjaCBhcmcKLSAgICBpZm5lcSAoJChzdHJpcCAkKG15X2V4Y2x1ZGVfZmlsdGVyKSksKQotICAgICAgbXlfZXhjbHVkZV9hcmdzIDo9ICQobXlfZXhjbHVkZV9maWx0ZXIpCi0KLSAgICAgIG15X2V4Y2x1ZGVfYXJncyA6PSAkKHN1YnN0IC4sLywkKG15X2V4Y2x1ZGVfYXJncykpCi0gICAgICBteV9leGNsdWRlX2FyZ3MgOj0gJChzdWJzdCAkKGNvbW1hKSQoY29tbWEpLCQoY29tbWEpLCQobXlfZXhjbHVkZV9hcmdzKSkKLSAgICAgIG15X2V4Y2x1ZGVfYXJncyA6PSAnJChzdWJzdCAkKGNvbW1hKSwnICcsICQobXlfZXhjbHVkZV9hcmdzKSknCi0gICAgZWxzZQotICAgICAgbXlfZXhjbHVkZV9hcmdzIDo9Ci0gICAgZW5kaWYKLSAgZW5kaWYgIyBBTkRST0lEX0NPTVBJTEVfV0lUSF9KQUNLPT1mYWxzZQotZW5kaWYgIyBMT0NBTF9FTU1BX0lOU1RSVU1FTlQgPT0gdHJ1ZQotCi0jIGRldGVybWluZSB3aGV0aGVyIHRvIHJ1biB0aGUgaW5zdHJ1bWVudGVyIGJhc2VkIG9uIHdoZXRoZXIgdGhlcmUgaXMgYW55IHdvcmsKLSMgZm9yIGl0IHRvIGRvCi1pZm5lcSAoJChteV9pbmNsdWRlX2ZpbHRlciksKQotCiAgIG15X2ZpbGVzIDo9ICQoaW50ZXJtZWRpYXRlcy5DT01NT04pL2phY29jbwogCiAgICMgbWFrZSBhIHRhc2sgdGhhdCB1bnppcHMgdGhlIGNsYXNzZXMgdGhhdCB3ZSB3YW50IHRvIGluc3RydW1lbnQgZnJvbSB0aGUKQEAgLTc0LDcgKzUwLDggQEAKIAl1bnppcCAtcSAkKFBSSVZBVEVfRlVMTF9DTEFTU0VTX1BSRV9KQUNPQ09fSkFSKSBcCiAJICAtZCAkKFBSSVZBVEVfVU5aSVBQRURfUEFUSCkgXAogCSAgJChQUklWQVRFX0lOQ0xVREVfQVJHUykKLQlybSAtcmYgJChQUklWQVRFX0VYQ0xVREVfQVJHUykKKwkoY2QgJChQUklWQVRFX1VOWklQUEVEX1BBVEgpICYmIHJtIC1yZiAkKFBSSVZBVEVfRVhDTFVERV9BUkdTKSkKKwkoY2QgJChQUklWQVRFX1VOWklQUEVEX1BBVEgpICYmIGZpbmQgLW5vdCAtbmFtZSAiKi5jbGFzcyIgLXR5cGUgZiB8IHhhcmdzIC0tbm8tcnVuLWlmLWVtcHR5IHJtKQogCXRvdWNoICQoUFJJVkFURV9VTlpJUFBFRF9USU1FU1RBTVBfUEFUSCkKICMgVW5mb3J0dW5hdGVseSBpbiB0aGUgcHJldmlvdXMgdGFzayBhYm92ZSwKICMgJ3JtIC1yZiAkKFBSSVZBVEVfRVhDTFVERV9BUkdTKScgbmVlZHMgdG8gYmUgYSBzZXBhcmF0ZQpAQCAtMTA3LDggKzg0LDggQEAKIAlta2RpciAtcCAkKFBSSVZBVEVfSU5TVFJVTUVOVEVEX1BBVEgpCiAJamF2YSAtamFyICQoSkFDT0NPX0NMSV9KQVIpIFwKIAkgIGluc3RydW1lbnQgXAotCSAgLXF1aWV0IFwKLQkgIC1kZXN0ICckKFBSSVZBVEVfSU5TVFJVTUVOVEVEX1BBVEgpJyBcCisJICAtLXF1aWV0IFwKKwkgIC0tZGVzdCAnJChQUklWQVRFX0lOU1RSVU1FTlRFRF9QQVRIKScgXAogCSAgJChQUklWQVRFX1VOWklQUEVEX1BBVEgpCiAJdG91Y2ggJChQUklWQVRFX0lOU1RSVU1FTlRFRF9USU1FU1RBTVBfUEFUSCkKIApAQCAtMTIwLDEyICs5NywxMyBAQAogJChMT0NBTF9GVUxMX0NMQVNTRVNfSkFDT0NPX0pBUik6IFBSSVZBVEVfVEVNUF9KQVJfUEFUSCA6PSAkKG15X3RlbXBfamFyX3BhdGgpCiAkKExPQ0FMX0ZVTExfQ0xBU1NFU19KQUNPQ09fSkFSKTogUFJJVkFURV9JTlNUUlVNRU5URURfUEFUSCA6PSAkKG15X2luc3RydW1lbnRlZF9wYXRoKQogJChMT0NBTF9GVUxMX0NMQVNTRVNfSkFDT0NPX0pBUik6IFBSSVZBVEVfRlVMTF9DTEFTU0VTX1BSRV9KQUNPQ09fSkFSIDo9ICQoTE9DQUxfRlVMTF9DTEFTU0VTX1BSRV9KQUNPQ09fSkFSKQorJChMT0NBTF9GVUxMX0NMQVNTRVNfSkFDT0NPX0pBUik6ICQoSkFSX0FSR1MpCiAkKExPQ0FMX0ZVTExfQ0xBU1NFU19KQUNPQ09fSkFSKTogJChteV9pbnN0cnVtZW50ZWRfdGltZXN0YW1wX3BhdGgpICQoTE9DQUxfRlVMTF9DTEFTU0VTX1BSRV9KQUNPQ09fSkFSKQogCXJtIC1mICRAICQoUFJJVkFURV9URU1QX0pBUl9QQVRIKQogCSMgY29weSB0aGUgcHJlLWphY29jbyBqYXIgKGNvbnRhaW5pbmcgZmlsZXMgZXhjbHVkZWQgZnJvbSBpbnN0cnVtZW50YXRpb24pCiAJY3AgJChQUklWQVRFX0ZVTExfQ0xBU1NFU19QUkVfSkFDT0NPX0pBUikgJChQUklWQVRFX1RFTVBfSkFSX1BBVEgpCiAJIyBjb3B5IGluc3RydW1lbnRlZCBmaWxlcyBiYWNrIGludG8gdGhlIHJlc3VsdGFudCBqYXIKLQkkKEpBUikgLXVmICQoUFJJVkFURV9URU1QX0pBUl9QQVRIKSAtQyAkKFBSSVZBVEVfSU5TVFJVTUVOVEVEX1BBVEgpIC4KKwkkKEpBUikgLXVmICQoUFJJVkFURV9URU1QX0pBUl9QQVRIKSAkKGNhbGwgamFyLWFyZ3Mtc29ydGVkLWZpbGVzLWluLWRpcmVjdG9yeSwkKFBSSVZBVEVfSU5TVFJVTUVOVEVEX1BBVEgpKQogCW12ICQoUFJJVkFURV9URU1QX0pBUl9QQVRIKSAkQAogCiAgICMgdGhpcyBpcyB1c2VkIHRvIHRyaWdnZXIgJChteV9jbGFzc2VzX3RvX3JlcG9ydF9vbl9wYXRoKSB0byBidWlsZApAQCAtMTMzLDggKzExMSw4IEBACiAgICMgZGVwZW5kZW5jeS4KICQoTE9DQUxfRlVMTF9DTEFTU0VTX0pBQ09DT19KQVIpOiAkKG15X2NsYXNzZXNfdG9fcmVwb3J0X29uX3BhdGgpCiAKLWVsc2UgIyBteV9pbmNsdWRlX2ZpbHRlciA9PSAnJworZWxzZSAjIExPQ0FMX0VNTUFfSU5TVFJVTUVOVCAhPSB0cnVlCiAgIExPQ0FMX0ZVTExfQ0xBU1NFU19KQUNPQ09fSkFSIDo9ICQoTE9DQUxfRlVMTF9DTEFTU0VTX1BSRV9KQUNPQ09fSkFSKQotZW5kaWYgIyBteV9pbmNsdWRlX2ZpbHRlciAhPSAnJworZW5kaWYgIyBMT0NBTF9FTU1BX0lOU1RSVU1FTlQgPT0gdHJ1ZQogCiBMT0NBTF9JTlRFUk1FRElBVEVfVEFSR0VUUyArPSAkKExPQ0FMX0ZVTExfQ0xBU1NFU19KQUNPQ09fSkFSKQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhLm1rIGIvY29yZS9qYXZhLm1rCmluZGV4IDM2MDEyOTIuLjkxNDc4NDkgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS5taworKysgYi9jb3JlL2phdmEubWsKQEAgLTE4LDQ3ICsxOCw2IEBACiBMT0NBTF9OT19TVEFOREFSRF9MSUJSQVJJRVM6PSQoc3RyaXAgJChMT0NBTF9OT19TVEFOREFSRF9MSUJSQVJJRVMpKQogTE9DQUxfU0RLX1ZFUlNJT046PSQoc3RyaXAgJChMT0NBTF9TREtfVkVSU0lPTikpCiAKLWlmbmVxICgkKExPQ0FMX1NES19WRVJTSU9OKSwpCi0gIGlmZXEgKCQoTE9DQUxfTk9fU1RBTkRBUkRfTElCUkFSSUVTKSx0cnVlKQotICAgICQoZXJyb3IgJChMT0NBTF9QQVRIKTogTXVzdCBub3QgZGVmaW5lIGJvdGggTE9DQUxfTk9fU1RBTkRBUkRfTElCUkFSSUVTIGFuZCBMT0NBTF9TREtfVkVSU0lPTikKLSAgZWxzZQotICAgIGlmZXEgKCQoc3RyaXAgJChmaWx0ZXIgJChMT0NBTF9TREtfVkVSU0lPTiksJChUQVJHRVRfQVZBSUxBQkxFX1NES19WRVJTSU9OUykpKSwpCi0gICAgICAkKGVycm9yICQoTE9DQUxfUEFUSCk6IEludmFsaWQgTE9DQUxfU0RLX1ZFUlNJT04gJyQoTE9DQUxfU0RLX1ZFUlNJT04pJyBcCi0gICAgICAgICAgICAgQ2hvaWNlcyBhcmU6ICQoVEFSR0VUX0FWQUlMQUJMRV9TREtfVkVSU0lPTlMpKQotICAgIGVsc2UKLSAgICAgIGlmZXEgKCQoTE9DQUxfU0RLX1ZFUlNJT04pJChUQVJHRVRfQlVJTERfQVBQUyksY3VycmVudCkKLSAgICAgICAgIyBVc2UgYW5kcm9pZF9zdHVic19jdXJyZW50IGlmIExPQ0FMX1NES19WRVJTSU9OIGlzIGN1cnJlbnQgYW5kIG5vIFRBUkdFVF9CVUlMRF9BUFBTLgotICAgICAgICBMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkX3N0dWJzX2N1cnJlbnQgJChMT0NBTF9KQVZBX0xJQlJBUklFUykKLSAgICAgIGVsc2UgaWZlcSAoJChMT0NBTF9TREtfVkVSU0lPTikkKFRBUkdFVF9CVUlMRF9BUFBTKSxzeXN0ZW1fY3VycmVudCkKLSAgICAgICAgTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZF9zeXN0ZW1fc3R1YnNfY3VycmVudCAkKExPQ0FMX0pBVkFfTElCUkFSSUVTKQotICAgICAgZWxzZSBpZmVxICgkKExPQ0FMX1NES19WRVJTSU9OKSQoVEFSR0VUX0JVSUxEX0FQUFMpLHRlc3RfY3VycmVudCkKLSAgICAgICAgTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZF90ZXN0X3N0dWJzX2N1cnJlbnQgJChMT0NBTF9KQVZBX0xJQlJBUklFUykKLSAgICAgIGVsc2UKLSAgICAgICAgTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gc2RrX3YkKExPQ0FMX1NES19WRVJTSU9OKSAkKExPQ0FMX0pBVkFfTElCUkFSSUVTKQotICAgICAgZW5kaWYKLQotICAgICAgaWZlcSAoJChMT0NBTF9TREtfVkVSU0lPTiksY3VycmVudCkKLSAgICAgICAgbXlfamFja19taW5fc2RrX3ZlcnNpb24gOj0gJChQTEFURk9STV9KQUNLX01JTl9TREtfVkVSU0lPTikKLSAgICAgIGVsc2UgaWZlcSAoJChMT0NBTF9TREtfVkVSU0lPTiksc3lzdGVtX2N1cnJlbnQpCi0gICAgICAgIG15X2phY2tfbWluX3Nka192ZXJzaW9uIDo9ICQoUExBVEZPUk1fSkFDS19NSU5fU0RLX1ZFUlNJT04pCi0gICAgICBlbHNlIGlmZXEgKCQoTE9DQUxfU0RLX1ZFUlNJT04pLHRlc3RfY3VycmVudCkKLSAgICAgICAgbXlfamFja19taW5fc2RrX3ZlcnNpb24gOj0gJChQTEFURk9STV9KQUNLX01JTl9TREtfVkVSU0lPTikKLSAgICAgIGVsc2UKLSAgICAgICAgbXlfamFja19taW5fc2RrX3ZlcnNpb24gOj0gJChMT0NBTF9TREtfVkVSU0lPTikKLSAgICAgIGVuZGlmCi0gICAgZW5kaWYKLSAgZW5kaWYKLWVsc2UKLSAgbXlfamFja19taW5fc2RrX3ZlcnNpb24gOj0gJChQTEFURk9STV9KQUNLX01JTl9TREtfVkVSU0lPTikKLSAgaWZuZXEgKCQoTE9DQUxfTk9fU1RBTkRBUkRfTElCUkFSSUVTKSx0cnVlKQotICAgIExPQ0FMX0pBVkFfTElCUkFSSUVTIDo9ICQoVEFSR0VUX0RFRkFVTFRfSkFWQV9MSUJSQVJJRVMpICQoTE9DQUxfSkFWQV9MSUJSQVJJRVMpCi0gIGVuZGlmCi1lbmRpZgotCi1pZm5lcSAoLCQoc3RyaXAgJChMT0NBTF9NSU5fU0RLX1ZFUlNJT04pKSkKLSAgbXlfamFja19taW5fc2RrX3ZlcnNpb24gOj0gJChMT0NBTF9NSU5fU0RLX1ZFUlNJT04pCi1lbmRpZgotCiBwcm90b19zb3VyY2VzIDo9ICQoZmlsdGVyICUucHJvdG8sJChMT0NBTF9TUkNfRklMRVMpKQogaWZuZXEgKCQocHJvdG9fc291cmNlcyksKQogaWZlcSAoJChMT0NBTF9QUk9UT0NfT1BUSU1JWkVfVFlQRSksbWljcm8pCkBAIC0xMDAsMjcgKzU5LDI0IEBACiBpbnRlcm1lZGlhdGVzIDo9ICQoY2FsbCBsb2NhbC1pbnRlcm1lZGlhdGVzLWRpcikKIGludGVybWVkaWF0ZXMuQ09NTU9OIDo9ICQoY2FsbCBsb2NhbC1pbnRlcm1lZGlhdGVzLWRpcixDT01NT04pCiAKLSMgQ2hvb3NlIGxlYWYgbmFtZSBmb3IgdGhlIGNvbXBpbGVkIGphciBmaWxlLgotaWZlcSAoJChMT0NBTF9FTU1BX0lOU1RSVU1FTlQpLHRydWUpCi1mdWxsX2NsYXNzZXNfY29tcGlsZWRfamFyX2xlYWYgOj0gY2xhc3Nlcy1uby1kZWJ1Zy12YXIuamFyCi1idWlsdF9kZXhfaW50ZXJtZWRpYXRlX2xlYWYgOj0gbm8tbG9jYWwKLWVsc2UKLWZ1bGxfY2xhc3Nlc19jb21waWxlZF9qYXJfbGVhZiA6PSBjbGFzc2VzLWZ1bGwtZGVidWcuamFyCi1idWlsdF9kZXhfaW50ZXJtZWRpYXRlX2xlYWYgOj0gd2l0aC1sb2NhbAotZW5kaWYKLQogaWZlcSAoJChMT0NBTF9QUk9HVUFSRF9FTkFCTEVEKSxkaXNhYmxlZCkKIExPQ0FMX1BST0dVQVJEX0VOQUJMRUQgOj0KIGVuZGlmCiAKLWZ1bGxfY2xhc3Nlc19jb21waWxlZF9qYXIgOj0gJChpbnRlcm1lZGlhdGVzLkNPTU1PTikvJChmdWxsX2NsYXNzZXNfY29tcGlsZWRfamFyX2xlYWYpCitmdWxsX2NsYXNzZXNfdHVyYmluZV9qYXIgOj0gJChpbnRlcm1lZGlhdGVzLkNPTU1PTikvY2xhc3Nlcy10dXJiaW5lLmphcgorZnVsbF9jbGFzc2VzX2hlYWRlcl9qYXJqYXIgOj0gJChpbnRlcm1lZGlhdGVzLkNPTU1PTikvY2xhc3Nlcy1oZWFkZXItamFyamFyLmphcgorZnVsbF9jbGFzc2VzX2hlYWRlcl9qYXIgOj0gJChpbnRlcm1lZGlhdGVzLkNPTU1PTikvY2xhc3Nlcy1oZWFkZXIuamFyCitmdWxsX2NsYXNzZXNfY29tcGlsZWRfamFyIDo9ICQoaW50ZXJtZWRpYXRlcy5DT01NT04pL2NsYXNzZXMtZnVsbC1kZWJ1Zy5qYXIKIGZ1bGxfY2xhc3Nlc19wcm9jZXNzZWRfamFyIDo9ICQoaW50ZXJtZWRpYXRlcy5DT01NT04pL2NsYXNzZXMtcHJvY2Vzc2VkLmphcgogZnVsbF9jbGFzc2VzX2Rlc3VnYXJfamFyIDo9ICQoaW50ZXJtZWRpYXRlcy5DT01NT04pL2NsYXNzZXMtZGVzdWdhci5qYXIKLWphcmphcl9sZWFmIDo9IGNsYXNzZXMtamFyamFyLmphcgotZnVsbF9jbGFzc2VzX2phcmphcl9qYXIgOj0gJChpbnRlcm1lZGlhdGVzLkNPTU1PTikvJChqYXJqYXJfbGVhZikKK2Z1bGxfY2xhc3Nlc19qYXJqYXJfamFyIDo9ICQoaW50ZXJtZWRpYXRlcy5DT01NT04pL2NsYXNzZXMtamFyamFyLmphcgogZnVsbF9jbGFzc2VzX3Byb2d1YXJkX2phciA6PSAkKGludGVybWVkaWF0ZXMuQ09NTU9OKS9jbGFzc2VzLXByb2d1YXJkLmphcgotYnVpbHRfZGV4X2ludGVybWVkaWF0ZSA6PSAkKGludGVybWVkaWF0ZXMuQ09NTU9OKS8kKGJ1aWx0X2RleF9pbnRlcm1lZGlhdGVfbGVhZikvY2xhc3Nlcy5kZXgKK2Z1bGxfY2xhc3Nlc19jb21iaW5lZF9qYXIgOj0gJChpbnRlcm1lZGlhdGVzLkNPTU1PTikvY2xhc3Nlcy1jb21iaW5lZC5qYXIKK2J1aWx0X2RleF9pbnRlcm1lZGlhdGUgOj0gJChpbnRlcm1lZGlhdGVzLkNPTU1PTikvZGV4L2NsYXNzZXMuZGV4CitidWlsdF9kZXhfaGlkZGVuYXBpIDo9ICQoaW50ZXJtZWRpYXRlcy5DT01NT04pL2RleC1oaWRkZW5hcGkvY2xhc3Nlcy5kZXgKIGZ1bGxfY2xhc3Nlc19zdHVic19qYXIgOj0gJChpbnRlcm1lZGlhdGVzLkNPTU1PTikvc3R1YnMuamFyCitqYXZhX3NvdXJjZV9saXN0X2ZpbGUgOj0gJChpbnRlcm1lZGlhdGVzLkNPTU1PTikvamF2YS1zb3VyY2UtbGlzdAorCiAKIGlmZXEgKCQoTE9DQUxfTU9EVUxFX0NMQVNTKSQoTE9DQUxfU1JDX0ZJTEVTKSQoTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTKSQoTE9DQUxfU09VUkNFX0ZJTEVTX0FMTF9HRU5FUkFURUQpLEFQUFMpCiAjIElmIHRoaXMgaXMgYW4gYXBrIHdpdGhvdXQgYW55IEphdmEgY29kZSAoZS5nLiBmcmFtZXdvcmstcmVzKSwgd2Ugc2hvdWxkIHNraXAgY29tcGlsaW5nIEphdmEuCkBAIC0xMzAsMTc0ICs4NiwyMiBAQAogZnVsbF9jbGFzc2VzX2phciA6PSAkKGludGVybWVkaWF0ZXMuQ09NTU9OKS9jbGFzc2VzLmphcgogYnVpbHRfZGV4IDo9ICQoaW50ZXJtZWRpYXRlcy5DT01NT04pL2NsYXNzZXMuZGV4CiBlbmRpZgotIyBmaW5hbCBKYWNrIGxpYnJhcnksIHNocmlua2VkIGFuZCBvYmZ1c2NhdGVkIGlmIGl0IG11c3QgYmUKLWZ1bGxfY2xhc3Nlc19qYWNrIDo9ICQoaW50ZXJtZWRpYXRlcy5DT01NT04pL2NsYXNzZXMuamFjawotIyBpbnRlcm1lZGlhdGUgSmFjayBsaWJyYXJ5IHdpdGhvdXQgc2hyaW5rIGFuZCBvYmZ1c2NhdGlvbgotbm9zaHJvYl9jbGFzc2VzX2phY2sgOj0gJChpbnRlcm1lZGlhdGVzLkNPTU1PTikvY2xhc3Nlcy5ub3Nocm9iLmphY2sKLWphY2tfY2hlY2tfdGltZXN0YW1wIDo9ICQoaW50ZXJtZWRpYXRlcy5DT01NT04pL2phY2suY2hlY2sudGltZXN0YW1wCiAKIExPQ0FMX0lOVEVSTUVESUFURV9UQVJHRVRTICs9IFwKKyAgICAkKGZ1bGxfY2xhc3Nlc190dXJiaW5lX2phcikgXAogICAgICQoZnVsbF9jbGFzc2VzX2NvbXBpbGVkX2phcikgXAogICAgICQoZnVsbF9jbGFzc2VzX2Rlc3VnYXJfamFyKSBcCiAgICAgJChmdWxsX2NsYXNzZXNfamFyamFyX2phcikgXAogICAgICQoZnVsbF9jbGFzc2VzX2phcikgXAorICAgICQoZnVsbF9jbGFzc2VzX2NvbWJpbmVkX2phcikgXAogICAgICQoZnVsbF9jbGFzc2VzX3Byb2d1YXJkX2phcikgXAogICAgICQoYnVpbHRfZGV4X2ludGVybWVkaWF0ZSkgXAotICAgICQoZnVsbF9jbGFzc2VzX2phY2spIFwKLSAgICAkKG5vc2hyb2JfY2xhc3Nlc19qYWNrKSBcCi0gICAgJChqYWNrX2NoZWNrX3RpbWVzdGFtcCkgXAogICAgICQoYnVpbHRfZGV4KSBcCi0gICAgJChmdWxsX2NsYXNzZXNfc3R1YnNfamFyKQotCisgICAgJChmdWxsX2NsYXNzZXNfc3R1YnNfamFyKSBcCisgICAgJChqYXZhX3NvdXJjZV9saXN0X2ZpbGUpCiAKIExPQ0FMX0lOVEVSTUVESUFURV9TT1VSQ0VfRElSIDo9ICQoaW50ZXJtZWRpYXRlcy5DT01NT04pL3NyYwogCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMjIC5ycyBmaWxlczogUmVuZGVyU2NyaXB0IHNvdXJjZXMgdG8gLmphdmEgZmlsZXMgYW5kIC5iYyBmaWxlcwotIyMgLmZzIGZpbGVzOiBGaWx0ZXJzY3JpcHQgc291cmNlcyB0byAuamF2YSBmaWxlcyBhbmQgLmJjIGZpbGVzCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXJlbmRlcnNjcmlwdF9zb3VyY2VzIDo9ICQoZmlsdGVyICUucnMgJS5mcywkKExPQ0FMX1NSQ19GSUxFUykpCi0jIEJlY2F1c2UgbmFtZXMgb2YgdGhlIGphdmEgZmlsZXMgZnJvbSBSZW5kZXJTY3JpcHQgYXJlIHVua25vd24gdW50aWwgdGhlCi0jIC5ycyBmaWxlKHMpIGFyZSBjb21waWxlZCwgd2UgaGF2ZSB0byBkZXBlbmQgb24gYSB0aW1lc3RhbXAgZmlsZS4KLVJlbmRlclNjcmlwdF9maWxlX3N0YW1wIDo9Ci1yc19nZW5lcmF0ZWRfcmVzX2RpciA6PQotcnNfY29tcGF0aWJpbGl0eV9qbmlfbGlicyA6PQotaWZuZXEgKCQocmVuZGVyc2NyaXB0X3NvdXJjZXMpLCkKLXJlbmRlcnNjcmlwdF9zb3VyY2VzX2Z1bGxwYXRoIDo9ICQoYWRkcHJlZml4ICQoTE9DQUxfUEFUSCkvLCAkKHJlbmRlcnNjcmlwdF9zb3VyY2VzKSkKLVJlbmRlclNjcmlwdF9maWxlX3N0YW1wIDo9ICQoTE9DQUxfSU5URVJNRURJQVRFX1NPVVJDRV9ESVIpL1JlbmRlclNjcmlwdC5zdGFtcAotcmVuZGVyc2NyaXB0X2ludGVybWVkaWF0ZS5DT01NT04gOj0gJChpbnRlcm1lZGlhdGVzLkNPTU1PTikvcmVuZGVyc2NyaXB0Ci0KLSMgRGVmYXVsdGluZyB0byBhbiBlbXB0eSBzdHJpbmcgdXNlcyB0aGUgbGF0ZXN0IGF2YWlsYWJsZSBwbGF0Zm9ybSBTREsuCi1yZW5kZXJzY3JpcHRfdGFyZ2V0X2FwaSA6PQotCi1pZm5lcSAoLCQoTE9DQUxfUkVOREVSU0NSSVBUX1RBUkdFVF9BUEkpKQotICByZW5kZXJzY3JpcHRfdGFyZ2V0X2FwaSA6PSAkKExPQ0FMX1JFTkRFUlNDUklQVF9UQVJHRVRfQVBJKQotZWxzZQotICBpZm5lcSAoLCQoTE9DQUxfU0RLX1ZFUlNJT04pKQotICAgICMgU2V0IHRhcmdldC1hcGkgZm9yIExPQ0FMX1NES19WRVJTSU9OcyBvdGhlciB0aGFuIGN1cnJlbnQuCi0gICAgaWZuZXEgKCwkKGZpbHRlci1vdXQgY3VycmVudCBzeXN0ZW1fY3VycmVudCB0ZXN0X2N1cnJlbnQsICQoTE9DQUxfU0RLX1ZFUlNJT04pKSkKLSAgICAgIHJlbmRlcnNjcmlwdF90YXJnZXRfYXBpIDo9ICQoTE9DQUxfU0RLX1ZFUlNJT04pCi0gICAgZW5kaWYKLSAgZW5kaWYgICMgTE9DQUxfU0RLX1ZFUlNJT04gaXMgc2V0Ci1lbmRpZiAgIyBMT0NBTF9SRU5ERVJTQ1JJUFRfVEFSR0VUX0FQSSBpcyBzZXQKLQotIyBGb3IgNjQtYml0LCB3ZSBhbHdheXMgaGF2ZSB0byB1cGdyYWRlIHRvIGF0IGxlYXN0IDIxIGZvciBjb21wYXQgYnVpbGQuCi1pZm5lcSAoJChMT0NBTF9SRU5ERVJTQ1JJUFRfQ09NUEFUSUJJTElUWSksKQotICBpZmVxICgkKFRBUkdFVF9JU182NF9CSVQpLHRydWUpCi0gICAgaWZuZXEgKCQoZmlsdGVyICQoUlNDT01QQVRfMzJCSVRfT05MWV9BUElfTEVWRUxTKSwkKHJlbmRlcnNjcmlwdF90YXJnZXRfYXBpKSksKQotICAgICAgcmVuZGVyc2NyaXB0X3RhcmdldF9hcGkgOj0gMjEKLSAgICBlbmRpZgotICBlbmRpZgotZW5kaWYKLQotaWZlcSAoJChMT0NBTF9SRU5ERVJTQ1JJUFRfQ0MpLCkKLUxPQ0FMX1JFTkRFUlNDUklQVF9DQyA6PSAkKExMVk1fUlNfQ0MpCi1lbmRpZgotCi0jIFR1cm4gb24gYWxsIHdhcm5pbmdzIGFuZCB3YXJuaW5ncyBhcyBlcnJvcnMgZm9yIFJTIGNvbXBpbGVzLgotIyBUaGlzIGNhbiBiZSBkaXNhYmxlZCB3aXRoIExPQ0FMX1JFTkRFUlNDUklQVF9GTEFHUyA6PSAtV25vLWVycm9yCi1yZW5kZXJzY3JpcHRfZmxhZ3MgOj0gLVdhbGwgLVdlcnJvcgotcmVuZGVyc2NyaXB0X2ZsYWdzICs9ICQoTE9DQUxfUkVOREVSU0NSSVBUX0ZMQUdTKQotCi0jIHByZXBlbmQgdGhlIFJlbmRlclNjcmlwdCBzeXN0ZW0gaW5jbHVkZSBwYXRoCi1pZm5lcSAoJChmaWx0ZXItb3V0IGN1cnJlbnQgc3lzdGVtX2N1cnJlbnQgdGVzdF9jdXJyZW50LCQoTE9DQUxfU0RLX1ZFUlNJT04pKSQoaWYgJChUQVJHRVRfQlVJTERfQVBQUyksJChmaWx0ZXIgY3VycmVudCBzeXN0ZW1fY3VycmVudCB0ZXN0X2N1cnJlbnQsJChMT0NBTF9TREtfVkVSU0lPTikpKSwpCi0jIGlmIGEgbnVtZXJpYyBMT0NBTF9TREtfVkVSU0lPTiwgb3IgY3VycmVudCBMT0NBTF9TREtfVkVSU0lPTiB3aXRoIFRBUkdFVF9CVUlMRF9BUFBTCi1MT0NBTF9SRU5ERVJTQ1JJUFRfSU5DTFVERVMgOj0gXAotICAgICQoSElTVE9SSUNBTF9TREtfVkVSU0lPTlNfUk9PVCkvcmVuZGVyc2NyaXB0L2NsYW5nLWluY2x1ZGUgXAotICAgICQoSElTVE9SSUNBTF9TREtfVkVSU0lPTlNfUk9PVCkvcmVuZGVyc2NyaXB0L2luY2x1ZGUgXAotICAgICQoTE9DQUxfUkVOREVSU0NSSVBUX0lOQ0xVREVTKQotZWxzZQotTE9DQUxfUkVOREVSU0NSSVBUX0lOQ0xVREVTIDo9IFwKLSAgICAkKFRPUERJUilleHRlcm5hbC9jbGFuZy9saWIvSGVhZGVycyBcCi0gICAgJChUT1BESVIpZnJhbWV3b3Jrcy9ycy9zY3JpcHRfYXBpL2luY2x1ZGUgXAotICAgICQoTE9DQUxfUkVOREVSU0NSSVBUX0lOQ0xVREVTKQotZW5kaWYKLQotaWZuZXEgKCQoTE9DQUxfUkVOREVSU0NSSVBUX0lOQ0xVREVTX09WRVJSSURFKSwpCi1MT0NBTF9SRU5ERVJTQ1JJUFRfSU5DTFVERVMgOj0gJChMT0NBTF9SRU5ERVJTQ1JJUFRfSU5DTFVERVNfT1ZFUlJJREUpCi1lbmRpZgotCi1iY19maWxlcyA6PSAkKHBhdHN1YnN0ICUuZnMsJS5iYywgJChwYXRzdWJzdCAlLnJzLCUuYmMsICQobm90ZGlyICQocmVuZGVyc2NyaXB0X3NvdXJjZXMpKSkpCi1iY19kZXBfZmlsZXMgOj0gJChhZGRwcmVmaXggJChyZW5kZXJzY3JpcHRfaW50ZXJtZWRpYXRlLkNPTU1PTikvLCQocGF0c3Vic3QgJS5iYywlLmQsJChiY19maWxlcykpKQotCi0kKFJlbmRlclNjcmlwdF9maWxlX3N0YW1wKTogUFJJVkFURV9SU19JTkNMVURFUyA6PSAkKExPQ0FMX1JFTkRFUlNDUklQVF9JTkNMVURFUykKLSQoUmVuZGVyU2NyaXB0X2ZpbGVfc3RhbXApOiBQUklWQVRFX1JTX0NDIDo9ICQoTE9DQUxfUkVOREVSU0NSSVBUX0NDKQotJChSZW5kZXJTY3JpcHRfZmlsZV9zdGFtcCk6IFBSSVZBVEVfUlNfRkxBR1MgOj0gJChyZW5kZXJzY3JpcHRfZmxhZ3MpCi0kKFJlbmRlclNjcmlwdF9maWxlX3N0YW1wKTogUFJJVkFURV9SU19TT1VSQ0VfRklMRVMgOj0gJChyZW5kZXJzY3JpcHRfc291cmNlc19mdWxscGF0aCkKLSMgQnkgcHV0dGluZyB0aGUgZ2VuZXJhdGVkIGphdmEgZmlsZXMgaW50byAkKExPQ0FMX0lOVEVSTUVESUFURV9TT1VSQ0VfRElSKSwgdGhleSB3aWxsIGJlCi0jIGF1dG9tYXRpY2FsbHkgZm91bmQgYnkgdGhlIGphdmEgY29tcGlsaW5nIGZ1bmN0aW9uIHRyYW5zZm9ybS1qYXZhLXRvLWNsYXNzZXMuamFyLgotJChSZW5kZXJTY3JpcHRfZmlsZV9zdGFtcCk6IFBSSVZBVEVfUlNfT1VUUFVUX0RJUiA6PSAkKHJlbmRlcnNjcmlwdF9pbnRlcm1lZGlhdGUuQ09NTU9OKQotJChSZW5kZXJTY3JpcHRfZmlsZV9zdGFtcCk6IFBSSVZBVEVfUlNfVEFSR0VUX0FQSSA6PSAkKHJlbmRlcnNjcmlwdF90YXJnZXRfYXBpKQotJChSZW5kZXJTY3JpcHRfZmlsZV9zdGFtcCk6IFBSSVZBVEVfREVQX0ZJTEVTIDo9ICQoYmNfZGVwX2ZpbGVzKQotJChSZW5kZXJTY3JpcHRfZmlsZV9zdGFtcCk6ICQocmVuZGVyc2NyaXB0X3NvdXJjZXNfZnVsbHBhdGgpICQoTE9DQUxfUkVOREVSU0NSSVBUX0NDKQotCSQodHJhbnNmb3JtLXJlbmRlcnNjcmlwdHMtdG8tamF2YS1hbmQtYmMpCi0KLSMgaW5jbHVkZSB0aGUgZGVwZW5kZW5jeSBmaWxlcyAoLmQvLlApIGdlbmVyYXRlZCBieSBsbHZtLXJzLWNjLgotJChjYWxsIGluY2x1ZGUtZGVwZmlsZSwkKFJlbmRlclNjcmlwdF9maWxlX3N0YW1wKS5QLCQoUmVuZGVyU2NyaXB0X2ZpbGVfc3RhbXApKQotCi1pZm5lcSAoJChMT0NBTF9SRU5ERVJTQ1JJUFRfQ09NUEFUSUJJTElUWSksKQotCi0KLWlmZXEgKCQoZmlsdGVyICQoUlNDT01QQVRfMzJCSVRfT05MWV9BUElfTEVWRUxTKSwkKHJlbmRlcnNjcmlwdF90YXJnZXRfYXBpKSksKQotaWZlcSAoJChUQVJHRVRfSVNfNjRfQklUKSx0cnVlKQotcmVuZGVyc2NyaXB0X2ludGVybWVkaWF0ZS5iY19mb2xkZXIgOj0gJChyZW5kZXJzY3JpcHRfaW50ZXJtZWRpYXRlLkNPTU1PTikvcmVzL3Jhdy9iYzY0LwotZWxzZQotcmVuZGVyc2NyaXB0X2ludGVybWVkaWF0ZS5iY19mb2xkZXIgOj0gJChyZW5kZXJzY3JpcHRfaW50ZXJtZWRpYXRlLkNPTU1PTikvcmVzL3Jhdy9iYzMyLwotZW5kaWYKLWVsc2UKLXJlbmRlcnNjcmlwdF9pbnRlcm1lZGlhdGUuYmNfZm9sZGVyIDo9ICQocmVuZGVyc2NyaXB0X2ludGVybWVkaWF0ZS5DT01NT04pL3Jlcy9yYXcvCi1lbmRpZgotCi1yc19nZW5lcmF0ZWRfYmMgOj0gJChhZGRwcmVmaXggXAotICAgICQocmVuZGVyc2NyaXB0X2ludGVybWVkaWF0ZS5iY19mb2xkZXIpLCAkKGJjX2ZpbGVzKSkKLQotcmVuZGVyc2NyaXB0X2ludGVybWVkaWF0ZSA6PSAkKGludGVybWVkaWF0ZXMpL3JlbmRlcnNjcmlwdAotCi0jIFdlIGRvbid0IG5lZWQgdGhlIC5zbyBmaWxlcyBpbiBidW5kbGVkIGJyYW5jaGVzCi0jIFByZXZlbnQgdGhlc2UgZnJvbSBzaG93aW5nIHVwIG9uIHRoZSBkZXZpY2UKLSMgT25lIGV4Y2VwdGlvbiBpcyBsaWJyc2puaS5zbywgd2hpY2ggaXMgbmVlZGVkIGZvcgotIyBib3RoIG5hdGl2ZSBwYXRoIGFuZCBjb21wYXQgcGF0aC4KLXJzX2puaV9saWIgOj0gJChUQVJHRVRfT1VUX0lOVEVSTUVESUFURV9MSUJSQVJJRVMpL2xpYnJzam5pLnNvCi1MT0NBTF9KTklfU0hBUkVEX0xJQlJBUklFUyArPSBsaWJyc2puaQotCi1pZm5lcSAoLCQoVEFSR0VUX0JVSUxEX0FQUFMpJChGT1JDRV9CVUlMRF9SU19DT01QQVQpKQotCi1yc19jb21wYXRpYmlsaXR5X2puaV9saWJzIDo9ICQoYWRkcHJlZml4IFwKLSAgICAkKHJlbmRlcnNjcmlwdF9pbnRlcm1lZGlhdGUpL2xpYnJzLiwgXAotICAgICQocGF0c3Vic3QgJS5iYywlLnNvLCAkKGJjX2ZpbGVzKSkpCi0KLSQocnNfZ2VuZXJhdGVkX2JjKSA6ICQoUmVuZGVyU2NyaXB0X2ZpbGVfc3RhbXApCi0KLXJzX3N1cHBvcnRfbGliIDo9ICQoVEFSR0VUX09VVF9JTlRFUk1FRElBVEVfTElCUkFSSUVTKS9saWJSU1N1cHBvcnQuc28KLUxPQ0FMX0pOSV9TSEFSRURfTElCUkFSSUVTICs9IGxpYlJTU3VwcG9ydAotCi1yc19zdXBwb3J0X2lvX2xpYiA6PQotIyBjaGVjayBpZiB0aGUgdGFyZ2V0IGFwaSBsZXZlbCBzdXBwb3J0IFVTQUdFX0lPCi1pZmVxICgkKGZpbHRlciAkKFJTQ09NUEFUX05PX1VTQUdFSU9fQVBJX0xFVkVMUyksJChyZW5kZXJzY3JpcHRfdGFyZ2V0X2FwaSkpLCkKLXJzX3N1cHBvcnRfaW9fbGliIDo9ICQoVEFSR0VUX09VVF9JTlRFUk1FRElBVEVfTElCUkFSSUVTKS9saWJSU1N1cHBvcnRJTy5zbwotTE9DQUxfSk5JX1NIQVJFRF9MSUJSQVJJRVMgKz0gbGliUlNTdXBwb3J0SU8KLWVuZGlmCi0KLQotJChyc19jb21wYXRpYmlsaXR5X2puaV9saWJzKTogJChSZW5kZXJTY3JpcHRfZmlsZV9zdGFtcCkgJChSU19QUkVCVUlMVF9DTENPUkUpIFwKLSAgICAkKHJzX3N1cHBvcnRfbGliKSAkKHJzX3N1cHBvcnRfaW9fbGliKSAkKHJzX2puaV9saWIpICQocnNfY29tcGlsZXJfcnQpCi0kKHJzX2NvbXBhdGliaWxpdHlfam5pX2xpYnMpOiAkKEJDQ19DT01QQVQpCi0kKHJzX2NvbXBhdGliaWxpdHlfam5pX2xpYnMpOiBQUklWQVRFX0NYWCA6PSAkKENYWF9XUkFQUEVSKSAkKFRBUkdFVF9DWFgpCi0kKHJzX2NvbXBhdGliaWxpdHlfam5pX2xpYnMpOiAkKHJlbmRlcnNjcmlwdF9pbnRlcm1lZGlhdGUpL2xpYnJzLiUuc286IFwKLSAgICAkKHJlbmRlcnNjcmlwdF9pbnRlcm1lZGlhdGUuYmNfZm9sZGVyKSUuYmMKLQkkKHRyYW5zZm9ybS1iYy10by1zbykKLQotZW5kaWYKLQotZW5kaWYKLQotTE9DQUxfSU5URVJNRURJQVRFX1RBUkdFVFMgKz0gJChSZW5kZXJTY3JpcHRfZmlsZV9zdGFtcCkKLSMgTWFrZSBzdXJlIHRoZSBnZW5lcmF0ZWQgcmVzb3VyY2Ugd2lsbCBiZSBhZGRlZCB0byB0aGUgYXBrLgotcnNfZ2VuZXJhdGVkX3Jlc19kaXIgOj0gJChyZW5kZXJzY3JpcHRfaW50ZXJtZWRpYXRlLkNPTU1PTikvcmVzCi1MT0NBTF9SRVNPVVJDRV9ESVIgOj0gJChyc19nZW5lcmF0ZWRfcmVzX2RpcikgJChMT0NBTF9SRVNPVVJDRV9ESVIpCi1lbmRpZgotCi0KICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAjIyBBSURMOiBDb21waWxlIC5haWRsIGZpbGVzIHRvIC5qYXZhCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpAQCAtMzA4LDcgKzExMiw3IEBACiAKIGFpZGxfcHJlcHJvY2Vzc19pbXBvcnQgOj0KIGlmZGVmIExPQ0FMX1NES19WRVJTSU9OCi1pZm5lcSAoJChmaWx0ZXIgY3VycmVudCBzeXN0ZW1fY3VycmVudCB0ZXN0X2N1cnJlbnQsICQoTE9DQUxfU0RLX1ZFUlNJT04pJChUQVJHRVRfQlVJTERfQVBQUykpLCkKK2lmbmVxICgkKGZpbHRlciBjdXJyZW50IHN5c3RlbV9jdXJyZW50IHRlc3RfY3VycmVudCBjb3JlX2N1cnJlbnQsICQoTE9DQUxfU0RLX1ZFUlNJT04pJChUQVJHRVRfQlVJTERfQVBQUykpLCkKICAgIyBMT0NBTF9TREtfVkVSU0lPTiBpcyBjdXJyZW50IGFuZCBubyBUQVJHRVRfQlVJTERfQVBQUwogICBhaWRsX3ByZXByb2Nlc3NfaW1wb3J0IDo9ICQoVEFSR0VUX09VVF9DT01NT05fSU5URVJNRURJQVRFUykvZnJhbWV3b3JrLmFpZGwKIGVsc2UKQEAgLTMyMCw3ICsxMjQsNyBAQAogZW5kaWYgIyBMT0NBTF9TREtfVkVSU0lPTgogCiAkKGZvcmVhY2ggcywkKGFpZGxfc291cmNlcyksXAotICAgICQoZXZhbCAkKGNhbGwgZGVmaW5lLWFpZGwtamF2YS1ydWxlLCQocyksJChpbnRlcm1lZGlhdGVzLkNPTU1PTiksYWlkbF9qYXZhX3NvdXJjZXMpKSkKKyAgICAkKGV2YWwgJChjYWxsIGRlZmluZS1haWRsLWphdmEtcnVsZSwkKHMpLCQoaW50ZXJtZWRpYXRlcy5DT01NT04pL2FpZGwsYWlkbF9qYXZhX3NvdXJjZXMpKSkKICQoZm9yZWFjaCBqYXZhLCQoYWlkbF9qYXZhX3NvdXJjZXMpLCBcCiAgICAgJChjYWxsIGluY2x1ZGUtZGVwZmlsZSwkKGphdmE6JS5qYXZhPSUuUCksJChqYXZhKSkpCiAKQEAgLTMzOSwxNSArMTQzLDcgQEAKICMgY29tbWFuZCBsaW5lLgogaWZuZGVmIExPQ0FMX0NIRUNLRURfTU9EVUxFCiBpZmRlZiBmdWxsX2NsYXNzZXNfamFyCi1pZmRlZiBMT0NBTF9KQUNLX0VOQUJMRUQKLWlmZXEgKCQoTE9DQUxfSkFDS19FTkFCTEVEKSxqYXZhY19mcm9udGVuZCkKIExPQ0FMX0NIRUNLRURfTU9EVUxFIDo9ICQoZnVsbF9jbGFzc2VzX2NvbXBpbGVkX2phcikKLWVsc2UKLUxPQ0FMX0NIRUNLRURfTU9EVUxFIDo9ICQoamFja19jaGVja190aW1lc3RhbXApCi1lbmRpZgotZWxzZQotTE9DQUxfQ0hFQ0tFRF9NT0RVTEUgOj0gJChmdWxsX2NsYXNzZXNfY29tcGlsZWRfamFyKQotZW5kaWYKIGVuZGlmCiBlbmRpZgogCkBAIC0zNjAsMTEgKzE1NiwxMSBAQAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIGlmbmVxICgkKHN0cmlwICQobG9ndGFnc19zb3VyY2VzKSksKQogCi1sb2d0YWdzX2phdmFfc291cmNlcyA6PSAkKHBhdHN1YnN0ICUubG9ndGFncywlLmphdmEsJChhZGRwcmVmaXggJChpbnRlcm1lZGlhdGVzLkNPTU1PTikvc3JjLywgJChsb2d0YWdzX3NvdXJjZXMpKSkKK2xvZ3RhZ3NfamF2YV9zb3VyY2VzIDo9ICQocGF0c3Vic3QgJS5sb2d0YWdzLCUuamF2YSwkKGFkZHByZWZpeCAkKGludGVybWVkaWF0ZXMuQ09NTU9OKS9sb2d0YWdzLywgJChsb2d0YWdzX3NvdXJjZXMpKSkKIGxvZ3RhZ3Nfc291cmNlcyA6PSAkKGFkZHByZWZpeCAkKExPQ0FMX1BBVEgpLywgJChsb2d0YWdzX3NvdXJjZXMpKQogCiAkKGxvZ3RhZ3NfamF2YV9zb3VyY2VzKTogUFJJVkFURV9NRVJHRURfVEFHIDo9ICQoVEFSR0VUX09VVF9DT01NT05fSU5URVJNRURJQVRFUykvYWxsLWV2ZW50LWxvZy10YWdzLnR4dAotJChsb2d0YWdzX2phdmFfc291cmNlcyk6ICQoaW50ZXJtZWRpYXRlcy5DT01NT04pL3NyYy8lLmphdmE6ICQoTE9DQUxfUEFUSCkvJS5sb2d0YWdzICQoVEFSR0VUX09VVF9DT01NT05fSU5URVJNRURJQVRFUykvYWxsLWV2ZW50LWxvZy10YWdzLnR4dCAkKEpBVkFUQUdTKSBidWlsZC90b29scy9ldmVudF9sb2dfdGFncy5weQorJChsb2d0YWdzX2phdmFfc291cmNlcyk6ICQoaW50ZXJtZWRpYXRlcy5DT01NT04pL2xvZ3RhZ3MvJS5qYXZhOiAkKExPQ0FMX1BBVEgpLyUubG9ndGFncyAkKFRBUkdFVF9PVVRfQ09NTU9OX0lOVEVSTUVESUFURVMpL2FsbC1ldmVudC1sb2ctdGFncy50eHQgJChKQVZBVEFHUykgYnVpbGQvbWFrZS90b29scy9ldmVudF9sb2dfdGFncy5weQogCSQodHJhbnNmb3JtLWxvZ3RhZ3MtdG8tamF2YSkKIAogZWxzZQpAQCAtMzc0LDEyICsxNzAsMTIgQEAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogamF2YV9zb3VyY2VzIDo9ICQoYWRkcHJlZml4ICQoTE9DQUxfUEFUSCkvLCAkKGZpbHRlciAlLmphdmEsJChMT0NBTF9TUkNfRklMRVMpKSkgJChhaWRsX2phdmFfc291cmNlcykgJChsb2d0YWdzX2phdmFfc291cmNlcykgXAogICAgICAgICAgICAgICAgICQoZmlsdGVyICUuamF2YSwkKExPQ0FMX0dFTkVSQVRFRF9TT1VSQ0VTKSkKLWFsbF9qYXZhX3NvdXJjZXMgOj0gJChqYXZhX3NvdXJjZXMpICQoYWRkcHJlZml4ICQoVEFSR0VUX09VVF9DT01NT05fSU5URVJNRURJQVRFUykvLCAkKGZpbHRlciAlLmphdmEsJChMT0NBTF9JTlRFUk1FRElBVEVfU09VUkNFUykpKQoramF2YV9pbnRlcm1lZGlhdGVfc291cmNlcyA6PSAkKGFkZHByZWZpeCAkKFRBUkdFVF9PVVRfQ09NTU9OX0lOVEVSTUVESUFURVMpLywgJChmaWx0ZXIgJS5qYXZhLCQoTE9DQUxfSU5URVJNRURJQVRFX1NPVVJDRVMpKSkKK2FsbF9qYXZhX3NvdXJjZXMgOj0gJChqYXZhX3NvdXJjZXMpICQoamF2YV9pbnRlcm1lZGlhdGVfc291cmNlcykKIAogaW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvamF2YV9jb21tb24ubWsKIAotJChMT0NBTF9JTlRFUk1FRElBVEVfVEFSR0VUUyk6IFBSSVZBVEVfSEFTX1JTX1NPVVJDRVMgOj0gJChpZiAkKHJlbmRlcnNjcmlwdF9zb3VyY2VzKSx0cnVlKQotJChMT0NBTF9JTlRFUk1FRElBVEVfVEFSR0VUUyk6IFBSSVZBVEVfUlNfU09VUkNFX0lOVEVSTUVESUFURVNfRElSIDo9ICQoaW50ZXJtZWRpYXRlcy5DT01NT04pL3JlbmRlcnNjcmlwdAoraW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvc2RrX2NoZWNrLm1rCiAKICMgU2V0IHRoZSBwcm9maWxlIHNvdXJjZSBzbyB0aGF0IHRoZSBvZGV4IC8gcHJvZmlsZSBjb2RlIGluY2x1ZGVkIGZyb20gamF2YS5tawogIyBjYW4gZmluZCBpdC4KQEAgLTQwMiwxMyArMTk4LDEwIEBACiAjIE1ha2Ugc3VyZSB0aGVyZSdzIHNvbWV0aGluZyB0byBidWlsZC4KIGlmZGVmIGZ1bGxfY2xhc3Nlc19qYXIKIGlmbmRlZiBuZWVkX2NvbXBpbGVfamF2YQotJChlcnJvciAkKExPQ0FMX1BBVEgpOiBUYXJnZXQgamF2YSBtb2R1bGUgZG9lcyBub3QgZGVmaW5lIGFueSBzb3VyY2Ugb3IgcmVzb3VyY2UgZmlsZXMpCiskKGNhbGwgcHJldHR5LWVycm9yLFRhcmdldCBqYXZhIG1vZHVsZSBkb2VzIG5vdCBkZWZpbmUgYW55IHNvdXJjZSBvciByZXNvdXJjZSBmaWxlcykKIGVuZGlmCiBlbmRpZgogCi0kKExPQ0FMX0lOVEVSTUVESUFURV9UQVJHRVRTKTogUFJJVkFURV9KQUNLX01JTl9TREtfVkVSU0lPTiA6PSAkKG15X2phY2tfbWluX3Nka192ZXJzaW9uKQotbXlfamFja19taW5fc2RrX3ZlcnNpb24gOj0KLQogIyBTaW5jZSB3ZSdyZSB1c2luZyBpbnRlcm1lZGlhdGVzLkNPTU1PTiwgbWFrZSBzdXJlIHRoYXQgaXQgZ2V0cyBjbGVhbmVkCiAjIHByb3Blcmx5LgogJChjbGVhbnRhcmdldCk6IFBSSVZBVEVfQ0xFQU5fRklMRVMgKz0gJChpbnRlcm1lZGlhdGVzLkNPTU1PTikKQEAgLTQyMiw3ICsyMTUsNyBAQAogQUxMX01PRFVMRVMuJChMT0NBTF9NT0RVTEUpLlNUVUJTIDo9ICQoZnVsbF9jbGFzc2VzX3N0dWJzX2phcikKIAogIyBUaGUgbGF5ZXJzIGZpbGUgYWxsb3dzIHlvdSB0byBlbmZvcmNlIGEgbGF5ZXJpbmcgYmV0d2VlbiBqYXZhIHBhY2thZ2VzLgotIyBSdW4gYnVpbGQvdG9vbHMvamF2YS1sYXllcnMucHkgZm9yIG1vcmUgZGV0YWlscy4KKyMgUnVuIGJ1aWxkL21ha2UvdG9vbHMvamF2YS1sYXllcnMucHkgZm9yIG1vcmUgZGV0YWlscy4KIGxheWVyc19maWxlIDo9ICQoYWRkcHJlZml4ICQoTE9DQUxfUEFUSCkvLCAkKExPQ0FMX0pBVkFfTEFZRVJTX0ZJTEUpKQogJChmdWxsX2NsYXNzZXNfY29tcGlsZWRfamFyKTogUFJJVkFURV9KQVZBX0xBWUVSU19GSUxFIDo9ICQobGF5ZXJzX2ZpbGUpCiAkKGZ1bGxfY2xhc3Nlc19jb21waWxlZF9qYXIpOiBQUklWQVRFX1dBUk5JTkdTX0VOQUJMRSA6PSAkKExPQ0FMX1dBUk5JTkdTX0VOQUJMRSkKQEAgLTQ0MywzOCArMjM2LDk4IEBACiBpZm5lcSAoLCQoUFJPRFVDVF9NSU5JTUlaRV9KQVZBX0RFQlVHX0lORk8pKQogaWZuZXEgKCwkKGZpbHRlciB1c2VyZGVidWcgdXNlciwkKFRBUkdFVF9CVUlMRF9WQVJJQU5UKSkpCiBMT0NBTF9KQVZBQ0ZMQUdTKz0gLWc6c291cmNlLGxpbmVzCi1MT0NBTF9KQUNLX0ZMQUdTKz0gLUQgamFjay5kZXguZGVidWcudmFycz1mYWxzZSAtRCBqYWNrLmRleC5kZWJ1Zy52YXJzLnN5bnRoZXRpYz1mYWxzZQogZW5kaWYKIGVuZGlmCiAKLSQoZnVsbF9jbGFzc2VzX2NvbXBpbGVkX2phcik6IFBSSVZBVEVfSkFWQUNGTEFHUyA6PSAkKEdMT0JBTF9KQVZBQ19ERUJVR19GTEFHUykgJChMT0NBTF9KQVZBQ0ZMQUdTKSAkKGFubm90YXRpb25fcHJvY2Vzc29yX2ZsYWdzKQorIyBMaXN0IG9mIGRlcGVuZGVuY2llcyBmb3IgYW55dGhpbmcgdGhhdCBuZWVkcyBhbGwgamF2YSBzb3VyY2VzIGluIHBsYWNlCitqYXZhX3NvdXJjZXNfZGVwcyA6PSBcCisgICAgJChqYXZhX3NvdXJjZXMpIFwKKyAgICAkKGphdmFfcmVzb3VyY2Vfc291cmNlcykgXAorICAgICQocHJvdG9famF2YV9zb3VyY2VzX2ZpbGVfc3RhbXApIFwKKyAgICAkKExPQ0FMX1NSQ0pBUlMpIFwKKyAgICAkKExPQ0FMX0FERElUSU9OQUxfREVQRU5ERU5DSUVTKQorCiskKGphdmFfc291cmNlX2xpc3RfZmlsZSk6ICQoamF2YV9zb3VyY2VzX2RlcHMpCisJJCh3cml0ZS1qYXZhLXNvdXJjZS1saXN0KQorCitpZm5lcSAoJChUVVJCSU5FX0VOQUJMRUQpLGZhbHNlKQorCiskKGZ1bGxfY2xhc3Nlc190dXJiaW5lX2phcik6IFBSSVZBVEVfSkFWQUNGTEFHUyA6PSAkKExPQ0FMX0pBVkFDRkxBR1MpICQoYW5ub3RhdGlvbl9wcm9jZXNzb3JfZmxhZ3MpCiskKGZ1bGxfY2xhc3Nlc190dXJiaW5lX2phcik6IFBSSVZBVEVfU1JDSkFSUyA6PSAkKExPQ0FMX1NSQ0pBUlMpCiskKGZ1bGxfY2xhc3Nlc190dXJiaW5lX2phcik6IFBSSVZBVEVfRE9OVF9ERUxFVEVfSkFSX01FVEFfSU5GIDo9ICQoTE9DQUxfRE9OVF9ERUxFVEVfSkFSX01FVEFfSU5GKQorJChmdWxsX2NsYXNzZXNfdHVyYmluZV9qYXIpOiBcCisgICAgJChqYXZhX3NvdXJjZV9saXN0X2ZpbGUpIFwKKyAgICAkKGphdmFfc291cmNlc19kZXBzKSBcCisgICAgJChmdWxsX2phdmFfaGVhZGVyX2xpYnMpIFwKKyAgICAkKGZ1bGxfamF2YV9ib290Y2xhc3NwYXRoX2xpYnMpIFwKKyAgICAkKGZ1bGxfamF2YV9zeXN0ZW1fbW9kdWxlc19kZXBzKSBcCisgICAgJChOT1JNQUxJWkVfUEFUSCkgXAorICAgICQoSkFSX0FSR1MpIFwKKyAgICAkKFpJUFRJTUUpIFwKKyAgICB8ICQoVFVSQklORSkgXAorICAgICQoTUVSR0VfWklQUykKKwkkKHRyYW5zZm9ybS1qYXZhLXRvLWhlYWRlci5qYXIpCisKKy5LQVRJX1JFU1RBVDogJChmdWxsX2NsYXNzZXNfdHVyYmluZV9qYXIpCisKKyMgUnVuIGphcmphciBiZWZvcmUgZ2VuZXJhdGUgY2xhc3Nlcy1oZWFkZXIuamFyIGlmIG5lY2Vzc2FyeS4KK2lmbmVxICgkKHN0cmlwICQoTE9DQUxfSkFSSkFSX1JVTEVTKSksKQorJChmdWxsX2NsYXNzZXNfaGVhZGVyX2phcmphcik6IFBSSVZBVEVfSkFSSkFSX1JVTEVTIDo9ICQoTE9DQUxfSkFSSkFSX1JVTEVTKQorJChmdWxsX2NsYXNzZXNfaGVhZGVyX2phcmphcik6ICQoZnVsbF9jbGFzc2VzX3R1cmJpbmVfamFyKSAkKExPQ0FMX0pBUkpBUl9SVUxFUykgfCAkKEpBUkpBUikKKwlAZWNobyBIZWFkZXIgSmFySmFyOiAkQAorCSQoaGlkZSkgJChKQVZBKSAtamFyICQoSkFSSkFSKSBwcm9jZXNzICQoUFJJVkFURV9KQVJKQVJfUlVMRVMpICQ8ICRACitlbHNlCitmdWxsX2NsYXNzZXNfaGVhZGVyX2phcmphciA6PSAkKGZ1bGxfY2xhc3Nlc190dXJiaW5lX2phcikKK2VuZGlmCisKKyQoZXZhbCAkKGNhbGwgY29weS1vbmUtZmlsZSwkKGZ1bGxfY2xhc3Nlc19oZWFkZXJfamFyamFyKSwkKGZ1bGxfY2xhc3Nlc19oZWFkZXJfamFyKSkpCisKK2VuZGlmICMgVFVSQklORV9FTkFCTEVEICE9IGZhbHNlCisKKyQoZnVsbF9jbGFzc2VzX2NvbXBpbGVkX2phcik6IFBSSVZBVEVfSkFWQUNGTEFHUyA6PSAkKExPQ0FMX0pBVkFDRkxBR1MpICQoYW5ub3RhdGlvbl9wcm9jZXNzb3JfZmxhZ3MpCiAkKGZ1bGxfY2xhc3Nlc19jb21waWxlZF9qYXIpOiBQUklWQVRFX0pBUl9FWENMVURFX0ZJTEVTIDo9ICQoTE9DQUxfSkFSX0VYQ0xVREVfRklMRVMpCiAkKGZ1bGxfY2xhc3Nlc19jb21waWxlZF9qYXIpOiBQUklWQVRFX0pBUl9QQUNLQUdFUyA6PSAkKExPQ0FMX0pBUl9QQUNLQUdFUykKICQoZnVsbF9jbGFzc2VzX2NvbXBpbGVkX2phcik6IFBSSVZBVEVfSkFSX0VYQ0xVREVfUEFDS0FHRVMgOj0gJChMT0NBTF9KQVJfRVhDTFVERV9QQUNLQUdFUykKICQoZnVsbF9jbGFzc2VzX2NvbXBpbGVkX2phcik6IFBSSVZBVEVfRE9OVF9ERUxFVEVfSkFSX01FVEFfSU5GIDo9ICQoTE9DQUxfRE9OVF9ERUxFVEVfSkFSX01FVEFfSU5GKQorJChmdWxsX2NsYXNzZXNfY29tcGlsZWRfamFyKTogUFJJVkFURV9KQVZBX1NPVVJDRV9MSVNUIDo9ICQoamF2YV9zb3VyY2VfbGlzdF9maWxlKQorJChmdWxsX2NsYXNzZXNfY29tcGlsZWRfamFyKTogUFJJVkFURV9BTExfSkFWQV9IRUFERVJfTElCUkFSSUVTIDo9ICQoZnVsbF9qYXZhX2hlYWRlcl9saWJzKQorJChmdWxsX2NsYXNzZXNfY29tcGlsZWRfamFyKTogUFJJVkFURV9TUkNKQVJTIDo9ICQoTE9DQUxfU1JDSkFSUykKKyQoZnVsbF9jbGFzc2VzX2NvbXBpbGVkX2phcik6IFBSSVZBVEVfU1JDSkFSX0xJU1RfRklMRSA6PSAkKGludGVybWVkaWF0ZXMuQ09NTU9OKS9zcmNqYXItbGlzdAorJChmdWxsX2NsYXNzZXNfY29tcGlsZWRfamFyKTogUFJJVkFURV9TUkNKQVJfSU5URVJNRURJQVRFU19ESVIgOj0gJChpbnRlcm1lZGlhdGVzLkNPTU1PTikvc3JjamFycwogJChmdWxsX2NsYXNzZXNfY29tcGlsZWRfamFyKTogXAotICAgICAgICAkKGphdmFfc291cmNlcykgXAotICAgICAgICAkKGphdmFfcmVzb3VyY2Vfc291cmNlcykgXAotICAgICAgICAkKGZ1bGxfamF2YV9saWJfZGVwcykgXAotICAgICAgICAkKGphcl9tYW5pZmVzdF9maWxlKSBcCi0gICAgICAgICQobGF5ZXJzX2ZpbGUpIFwKLSAgICAgICAgJChSZW5kZXJTY3JpcHRfZmlsZV9zdGFtcCkgXAotICAgICAgICAkKHByb3RvX2phdmFfc291cmNlc19maWxlX3N0YW1wKSBcCi0gICAgICAgICQoYW5ub3RhdGlvbl9wcm9jZXNzb3JfZGVwcykgXAotICAgICAgICAkKE5PUk1BTElaRV9QQVRIKSBcCi0gICAgICAgICQoTE9DQUxfQURESVRJT05BTF9ERVBFTkRFTkNJRVMpIFwKLSAgICAgICAgfCAkKFNPT05HX0pBVkFDX1dSQVBQRVIpCi0JJCh0cmFuc2Zvcm0tamF2YS10by1jbGFzc2VzLmphcikKKyAgICAkKGphdmFfc291cmNlX2xpc3RfZmlsZSkgXAorICAgICQoZnVsbF9qYXZhX2hlYWRlcl9saWJzKSBcCisgICAgJChqYXZhX3NvdXJjZXNfZGVwcykgXAorICAgICQoZnVsbF9qYXZhX2Jvb3RjbGFzc3BhdGhfbGlicykgXAorICAgICQoZnVsbF9qYXZhX3N5c3RlbV9tb2R1bGVzX2RlcHMpIFwKKyAgICAkKGxheWVyc19maWxlKSBcCisgICAgJChhbm5vdGF0aW9uX3Byb2Nlc3Nvcl9kZXBzKSBcCisgICAgJChOT1JNQUxJWkVfUEFUSCkgXAorICAgICQoSkFSX0FSR1MpIFwKKyAgICAkKFpJUFNZTkMpIFwKKyAgICB8ICQoU09PTkdfSkFWQUNfV1JBUFBFUikKKwlAZWNobyAiVGFyZ2V0IEphdmE6ICRACisJJChjYWxsIGNvbXBpbGUtamF2YSwkKFRBUkdFVF9KQVZBQyksJChQUklWQVRFX0FMTF9KQVZBX0hFQURFUl9MSUJSQVJJRVMpKQogCiBqYXZhYy1jaGVjayA6ICQoZnVsbF9jbGFzc2VzX2NvbXBpbGVkX2phcikKIGphdmFjLWNoZWNrLSQoTE9DQUxfTU9EVUxFKSA6ICQoZnVsbF9jbGFzc2VzX2NvbXBpbGVkX2phcikKIAorJChmdWxsX2NsYXNzZXNfY29tYmluZWRfamFyKTogUFJJVkFURV9ET05UX0RFTEVURV9KQVJfTUVUQV9JTkYgOj0gJChMT0NBTF9ET05UX0RFTEVURV9KQVJfTUVUQV9JTkYpCiskKGZ1bGxfY2xhc3Nlc19jb21iaW5lZF9qYXIpOiAkKGZ1bGxfY2xhc3Nlc19jb21waWxlZF9qYXIpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoamFyX21hbmlmZXN0X2ZpbGUpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoZnVsbF9zdGF0aWNfamF2YV9saWJzKSB8ICQoTUVSR0VfWklQUykKKwkkKGlmICQoUFJJVkFURV9KQVJfTUFOSUZFU1QpLCAkKGhpZGUpIHNlZCAtZSAicy8lQlVJTERfTlVNQkVSJS8kKEJVSUxEX05VTUJFUl9GUk9NX0ZJTEUpLyIgXAorICAgICAgICAgICAgJChQUklWQVRFX0pBUl9NQU5JRkVTVCkgPiAkKGRpciAkQCkvbWFuaWZlc3QubWYpCisJJChNRVJHRV9aSVBTKSAtaiAtLWlnbm9yZS1kdXBsaWNhdGVzICQoaWYgJChQUklWQVRFX0pBUl9NQU5JRkVTVCksLW0gJChkaXIgJEApL21hbmlmZXN0Lm1mKSBcCisgICAgICAgICAgICAkKGlmICQoUFJJVkFURV9ET05UX0RFTEVURV9KQVJfTUVUQV9JTkYpLCwtc3RyaXBEaXIgTUVUQS1JTkYgLXppcFRvTm90U3RyaXAgJDwpIFwKKyAgICAgICAgICAgICRAICQ8ICQoY2FsbCByZXZlcnNlLWxpc3QsJChQUklWQVRFX1NUQVRJQ19KQVZBX0xJQlJBUklFUykpCisKIGlmZGVmIExPQ0FMX0pBUl9QUk9DRVNTT1IKICMgTE9DQUxfSkFSX1BST0NFU1NPUl9BUkdTIG11c3QgYmUgZXZhbHVhdGVkIGhlcmUgdG8gc2V0IHVwIHRoZSBydWxlLWxvY2FsCiAjIFBSSVZBVEVfSkFSX1BST0NFU1NPUl9BUkdTIHZhcmlhYmxlLCBidXQgJDwgYW5kICRAIGFyZSBub3QgYXZhaWxhYmxlIHlldC4KICMgU2V0ICR7aW59IGFuZCAke291dH0gc28gdGhleSBjYW4gYmUgcmVmZXJlbmNlZCBieSBMT0NBTF9KQVJfUFJPQ0VTU09SX0FSR1MKICMgdXNpbmcgZGVmZXJyZWQgZXZhbHVhdGlvbiAoTE9DQUxfSkFSX1BST0NFU1NPUl9BUkdTID0gaW5zdGVhZCBvZiA6PSkuCi1pbiA6PSAkKGZ1bGxfY2xhc3Nlc19jb21waWxlZF9qYXIpCitpbiA6PSAkKGZ1bGxfY2xhc3Nlc19jb21iaW5lZF9qYXIpCiBvdXQgOj0gJChmdWxsX2NsYXNzZXNfcHJvY2Vzc2VkX2phcikudG1wCiBteV9qYXJfcHJvY2Vzc29yIDo9ICQoSE9TVF9PVVRfSkFWQV9MSUJSQVJJRVMpLyQoTE9DQUxfSkFSX1BST0NFU1NPUikuamFyCiAKQEAgLTQ4NCw3ICszMzcsNyBAQAogaW4gOj0KIG91dCA6PQogCi0kKGZ1bGxfY2xhc3Nlc19wcm9jZXNzZWRfamFyKTogJChmdWxsX2NsYXNzZXNfY29tcGlsZWRfamFyKSAkKG15X2phcl9wcm9jZXNzb3IpCiskKGZ1bGxfY2xhc3Nlc19wcm9jZXNzZWRfamFyKTogJChmdWxsX2NsYXNzZXNfY29tYmluZWRfamFyKSAkKG15X2phcl9wcm9jZXNzb3IpCiAJQGVjaG8gUHJvY2Vzc2luZyAkQCB3aXRoICQoUFJJVkFURV9KQVJfUFJPQ0VTU09SKQogCSQoaGlkZSkgcm0gLWYgJEAgJChQUklWQVRFX1RNUF9PVVQpCiAJJChoaWRlKSAkKEpBVkEpIC1qYXIgJChQUklWQVRFX0pBUl9QUk9DRVNTT1IpICQoUFJJVkFURV9KQVJfUFJPQ0VTU09SX0FSR1MpCkBAIC00OTIsOTkgKzM0NSwxMDkgQEAKIAogbXlfamFyX3Byb2Nlc3NvciA6PQogZWxzZQotZnVsbF9jbGFzc2VzX3Byb2Nlc3NlZF9qYXIgOj0gJChmdWxsX2NsYXNzZXNfY29tcGlsZWRfamFyKQotZW5kaWYKLQotbXlfZGVzdWdhcmluZyA6PQotaWZuZGVmIExPQ0FMX0pBQ0tfRU5BQkxFRAotaWZuZGVmIExPQ0FMX0lTX1NUQVRJQ19KQVZBX0xJQlJBUlkKLW15X2Rlc3VnYXJpbmcgOj0gdHJ1ZQotJChmdWxsX2NsYXNzZXNfZGVzdWdhcl9qYXIpOiBQUklWQVRFX0RYX0ZMQUdTIDo9ICQoTE9DQUxfRFhfRkxBR1MpCi0kKGZ1bGxfY2xhc3Nlc19kZXN1Z2FyX2phcik6ICQoZnVsbF9jbGFzc2VzX3Byb2Nlc3NlZF9qYXIpICQoREVTVUdBUikKLQkkKGRlc3VnYXItY2xhc3Nlcy1qYXIpCi1lbmRpZgotZW5kaWYKLQotaWZuZGVmIG15X2Rlc3VnYXJpbmcKLWZ1bGxfY2xhc3Nlc19kZXN1Z2FyX2phciA6PSAkKGZ1bGxfY2xhc3Nlc19wcm9jZXNzZWRfamFyKQorZnVsbF9jbGFzc2VzX3Byb2Nlc3NlZF9qYXIgOj0gJChmdWxsX2NsYXNzZXNfY29tYmluZWRfamFyKQogZW5kaWYKIAogIyBSdW4gamFyamFyIGlmIG5lY2Vzc2FyeQogaWZuZXEgKCQoc3RyaXAgJChMT0NBTF9KQVJKQVJfUlVMRVMpKSwpCiAkKGZ1bGxfY2xhc3Nlc19qYXJqYXJfamFyKTogUFJJVkFURV9KQVJKQVJfUlVMRVMgOj0gJChMT0NBTF9KQVJKQVJfUlVMRVMpCi0kKGZ1bGxfY2xhc3Nlc19qYXJqYXJfamFyKTogJChmdWxsX2NsYXNzZXNfZGVzdWdhcl9qYXIpICQoTE9DQUxfSkFSSkFSX1JVTEVTKSB8ICQoSkFSSkFSKQorJChmdWxsX2NsYXNzZXNfamFyamFyX2phcik6ICQoZnVsbF9jbGFzc2VzX3Byb2Nlc3NlZF9qYXIpICQoTE9DQUxfSkFSSkFSX1JVTEVTKSB8ICQoSkFSSkFSKQogCUBlY2hvIEphckphcjogJEAKIAkkKGhpZGUpICQoSkFWQSkgLWphciAkKEpBUkpBUikgcHJvY2VzcyAkKFBSSVZBVEVfSkFSSkFSX1JVTEVTKSAkPCAkQAogZWxzZQotZnVsbF9jbGFzc2VzX2phcmphcl9qYXIgOj0gJChmdWxsX2NsYXNzZXNfZGVzdWdhcl9qYXIpCitmdWxsX2NsYXNzZXNfamFyamFyX2phciA6PSAkKGZ1bGxfY2xhc3Nlc19wcm9jZXNzZWRfamFyKQogZW5kaWYKIAotTE9DQUxfRlVMTF9DTEFTU0VTX1BSRV9KQUNPQ09fSkFSIDo9ICQoZnVsbF9jbGFzc2VzX2phcmphcl9qYXIpCiskKGV2YWwgJChjYWxsIGNvcHktb25lLWZpbGUsJChmdWxsX2NsYXNzZXNfamFyamFyX2phciksJChmdWxsX2NsYXNzZXNfamFyKSkpCiAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworTE9DQUxfRlVMTF9DTEFTU0VTX1BSRV9KQUNPQ09fSkFSIDo9ICQoZnVsbF9jbGFzc2VzX2phcikKKwogaW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvamFjb2NvLm1rCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIAotZnVsbF9jbGFzc2VzX3ByZV9wcm9ndWFyZF9qYXIgOj0gJChMT0NBTF9GVUxMX0NMQVNTRVNfSkFDT0NPX0pBUikKKyMgVGVtcG9yYXJpbHkgZW5hYmxlIC0tbXVsdGktZGV4IHVudGlsIHByb2d1YXJkIHN1cHBvcnRzIHY1MyBjbGFzcyBmaWxlcworIyAoIGh0dHA6Ly9iLzY3NjczODYwICkgb3Igd2UgbW92ZSBhd2F5IGZyb20gcHJvZ3VhcmQgYWx0b2dldGhlci4KK2lmZGVmIFRBUkdFVF9PUEVOSkRLOQorTE9DQUxfRFhfRkxBR1MgOj0gJChmaWx0ZXItb3V0IC0tbXVsdGktZGV4LCQoTE9DQUxfRFhfRkxBR1MpKSAtLW11bHRpLWRleAorZW5kaWYKKworaWZuZXEgKCQoVVNFX0Q4X0RFU1VHQVIpLHRydWUpCitteV9kZXN1Z2FyaW5nIDo9CitpZm5kZWYgTE9DQUxfSVNfU1RBVElDX0pBVkFfTElCUkFSWQorbXlfZGVzdWdhcmluZyA6PSB0cnVlCiskKGZ1bGxfY2xhc3Nlc19kZXN1Z2FyX2phcik6IFBSSVZBVEVfRFhfRkxBR1MgOj0gJChMT0NBTF9EWF9GTEFHUykKKyQoZnVsbF9jbGFzc2VzX2Rlc3VnYXJfamFyKTogJChMT0NBTF9GVUxMX0NMQVNTRVNfSkFDT0NPX0pBUikgJChmdWxsX2phdmFfaGVhZGVyX2xpYnMpICQoREVTVUdBUikKKwkkKGRlc3VnYXItY2xhc3Nlcy1qYXIpCitlbmRpZgorZWxzZQorbXlfZGVzdWdhcmluZyA6PQorZW5kaWYKKworaWZuZGVmIG15X2Rlc3VnYXJpbmcKK2Z1bGxfY2xhc3Nlc19kZXN1Z2FyX2phciA6PSAkKExPQ0FMX0ZVTExfQ0xBU1NFU19KQUNPQ09fSkFSKQorZW5kaWYKKworZnVsbF9jbGFzc2VzX3ByZV9wcm9ndWFyZF9qYXIgOj0gJChmdWxsX2NsYXNzZXNfZGVzdWdhcl9qYXIpCiAKICMgS2VlcCBhIGNvcHkgb2YgdGhlIGphciBqdXN0IGJlZm9yZSBwcm9ndWFyZCBwcm9jZXNzaW5nLgogJChldmFsICQoY2FsbCBjb3B5LW9uZS1maWxlLCQoZnVsbF9jbGFzc2VzX3ByZV9wcm9ndWFyZF9qYXIpLCQoaW50ZXJtZWRpYXRlcy5DT01NT04pL2NsYXNzZXMtcHJlLXByb2d1YXJkLmphcikpCiAKICMgUnVuIHByb2d1YXJkIGlmIG5lY2Vzc2FyeQogaWZkZWYgTE9DQUxfUFJPR1VBUkRfRU5BQkxFRAotaWZuZXEgKCQoZmlsdGVyLW91dCBmdWxsIGN1c3RvbSBub3N5c3RlbSBvYmZ1c2NhdGlvbiBvcHRpbWl6YXRpb24gc2hyaW5rdGVzdHMsJChMT0NBTF9QUk9HVUFSRF9FTkFCTEVEKSksKQoraWZuZXEgKCQoZmlsdGVyLW91dCBmdWxsIGN1c3RvbSBvYmZ1c2NhdGlvbiBvcHRpbWl6YXRpb24sJChMT0NBTF9QUk9HVUFSRF9FTkFCTEVEKSksKQogICAgICQod2FybmluZyB3aGlsZSBwcm9jZXNzaW5nOiAkKExPQ0FMX01PRFVMRSkpCiAgICAgJChlcnJvciBpbnZhbGlkIHZhbHVlIGZvciBMT0NBTF9QUk9HVUFSRF9FTkFCTEVEOiAkKExPQ0FMX1BST0dVQVJEX0VOQUJMRUQpKQogZW5kaWYKIHByb2d1YXJkX2RpY3Rpb25hcnkgOj0gJChpbnRlcm1lZGlhdGVzLkNPTU1PTikvcHJvZ3VhcmRfZGljdGlvbmFyeQotamFja19kaWN0aW9uYXJ5IDo9ICQoaW50ZXJtZWRpYXRlcy5DT01NT04pL2phY2tfZGljdGlvbmFyeQogCi0jIEhhY2s6IHNlZSBiLzIwNjY3Mzk2Ci0jIFdoZW4gYW4gYXBwJ3MgTE9DQUxfU0RLX1ZFUlNJT04gaXMgbG93ZXIgdGhhbiB0aGUgc3VwcG9ydCBsaWJyYXJ5J3MgTE9DQUxfU0RLX1ZFUlNJT04sCi0jIHdlIGFydGlmaWNhbGx5IHJhaXNlcyB0aGUgIlNESyB2ZXJzaW9uIiAibGlua2VkIiBieSBQcm9HdWFyZCwgdG8KKyMgV2hlbiBhbiBhcHAgY29udGFpbnMgcmVmZXJlbmNlcyB0byBBUElzIHRoYXQgYXJlIG5vdCBpbiB0aGUgU0RLIHNwZWNpZmllZCBieQorIyBpdHMgTE9DQUxfU0RLX1ZFUlNJT04gZm9yIGV4YW1wbGUgYWRkZWQgYnkgc3VwcG9ydCBsaWJyYXJ5IG9yIGJ5IHJ1bnRpbWUgCisjIGNsYXNzZXMgYWRkZWQgYnkgZGVzdWdhciwgd2UgYXJ0aWZpY2FsbHkgcmFpc2UgdGhlICJTREsgdmVyc2lvbiIgImxpbmtlZCIgYnkKKyMgUHJvR3VhcmQsIHRvCiAjIC0gc3VwcHJlc3MgUHJvR3VhcmQgd2FybmluZ3Mgb2YgcmVmZXJlbmNpbmcgc3ltYm9scyB1bmtub3duIHRvIHRoZSBsb3dlciBTREsgdmVyc2lvbi4KICMgLSBwcmV2ZW50IFByb0d1YXJkIHN0cmlwcGluZyBzdWJjbGFzcyBpbiB0aGUgc3VwcG9ydCBsaWJyYXJ5IHRoYXQgZXh0ZW5kcyBjbGFzcyBhZGRlZCBpbiB0aGUgaGlnaGVyIFNESyB2ZXJzaW9uLgotbXlfc3VwcG9ydF9saWJyYXJ5X3Nka19yYWlzZSA6PQotaWZuZXEgKCwkKGZpbHRlciBhbmRyb2lkLXN1cHBvcnQtJSwkKExPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUykpKQorIyBTZWUgYi8yMDY2NzM5NgorbXlfcHJvZ3VhcmRfc2RrX3JhaXNlIDo9CiBpZmRlZiBMT0NBTF9TREtfVkVSU0lPTgogaWZkZWYgVEFSR0VUX0JVSUxEX0FQUFMKLWlmZXEgKCwkKGZpbHRlciBjdXJyZW50IHN5c3RlbV9jdXJyZW50IHRlc3RfY3VycmVudCwgJChMT0NBTF9TREtfVkVSU0lPTikpKQotICBteV9zdXBwb3J0X2xpYnJhcnlfc2RrX3JhaXNlIDo9ICQoY2FsbCBqYXZhLWxpYi1maWxlcywgc2RrX3ZjdXJyZW50KQoraWZlcSAoLCQoZmlsdGVyIGN1cnJlbnQgc3lzdGVtX2N1cnJlbnQgdGVzdF9jdXJyZW50IGNvcmVfY3VycmVudCwgJChMT0NBTF9TREtfVkVSU0lPTikpKQorICBteV9wcm9ndWFyZF9zZGtfcmFpc2UgOj0gJChjYWxsIGphdmEtbGliLWhlYWRlci1maWxlcywgc2RrX3ZjdXJyZW50KQogZW5kaWYKIGVsc2UKICAgIyBGb3IgcGxhdGZvcm0gYnVpbGQsIHdlIGNhbid0IGp1c3QgcmFpc2UgdG8gdGhlICJjdXJyZW50IiBTREssCiAgICMgdGhhdCB3b3VsZCBicmVhayBhcHBzIHRoYXQgdXNlIEFQSXMgcmVtb3ZlZCBmcm9tIHRoZSBjdXJyZW50IFNESy4KLSAgbXlfc3VwcG9ydF9saWJyYXJ5X3Nka19yYWlzZSA6PSAkKGNhbGwgamF2YS1saWItZmlsZXMsJChUQVJHRVRfREVGQVVMVF9KQVZBX0xJQlJBUklFUykpCi1lbmRpZgorICBteV9wcm9ndWFyZF9zZGtfcmFpc2UgOj0gJChjYWxsIGphdmEtbGliLWhlYWRlci1maWxlcywkKFRBUkdFVF9ERUZBVUxUX0JPT1RDTEFTU1BBVEhfTElCUkFSSUVTKSAkKFRBUkdFVF9ERUZBVUxUX0pBVkFfTElCUkFSSUVTKSkKIGVuZGlmCiBlbmRpZgogCi0jIGphY2sgYWxyZWFkeSBoYXMgdGhlIGxpYnJhcmllcyBpbiBpdHMgY2xhc3NwYXRoIGFuZCBkb2Vzbid0IHN1cHBvcnQgamFycwotbGVnYWN5X3Byb2d1YXJkX2ZsYWdzIDo9ICQoYWRkcHJlZml4IC1saWJyYXJ5amFycyAsJChteV9zdXBwb3J0X2xpYnJhcnlfc2RrX3JhaXNlKSBcCi0gICQoZmlsdGVyLW91dCAkKG15X3N1cHBvcnRfbGlicmFyeV9zZGtfcmFpc2UpLCQoZnVsbF9zaGFyZWRfamF2YV9saWJzKSkpCitpZmVxICgkKFVTRV9SOCksdHJ1ZSkKK3Byb2d1YXJkX2phcnNfcHJlZml4IDo9IC1saWJyYXJ5amFycworZWxzZQorcHJvZ3VhcmRfamFyc19wcmVmaXggOj0gLXN5c3RlbWphcnMKK2VuZGlmCitsZWdhY3lfcHJvZ3VhcmRfZmxhZ3MgOj0gJChhZGRwcmVmaXggJChwcm9ndWFyZF9qYXJzX3ByZWZpeCkgLCQobXlfcHJvZ3VhcmRfc2RrX3JhaXNlKSBcCisgICQoZmlsdGVyLW91dCAkKG15X3Byb2d1YXJkX3Nka19yYWlzZSksIFwKKyAgICAkKGZ1bGxfamF2YV9ib290Y2xhc3NwYXRoX2xpYnMpIFwKKyAgICAkKGZ1bGxfc2hhcmVkX2phdmFfaGVhZGVyX2xpYnMpKSkKKworbGVnYWN5X3Byb2d1YXJkX2xpYl9kZXBzIDo9ICQobXlfcHJvZ3VhcmRfc2RrX3JhaXNlKSBcCisgICQoZmlsdGVyLW91dCAkKG15X3Byb2d1YXJkX3Nka19yYWlzZSksJChmdWxsX3NoYXJlZF9qYXZhX2hlYWRlcl9saWJzKSkKIAogbGVnYWN5X3Byb2d1YXJkX2ZsYWdzICs9IC1wcmludG1hcHBpbmcgJChwcm9ndWFyZF9kaWN0aW9uYXJ5KQotamFja19wcm9ndWFyZF9mbGFncyA6PSAtcHJpbnRtYXBwaW5nICQoamFja19kaWN0aW9uYXJ5KQogCiBjb21tb25fcHJvZ3VhcmRfZmxhZ3MgOj0gLWZvcmNlcHJvY2Vzc2luZwogCi1jb21tb25fcHJvZ3VhcmRfZmxhZ19maWxlcyA6PQotaWZlcSAoJChmaWx0ZXIgbm9zeXN0ZW0sJChMT0NBTF9QUk9HVUFSRF9FTkFCTEVEKSksKQotY29tbW9uX3Byb2d1YXJkX2ZsYWdfZmlsZXMgKz0gJChCVUlMRF9TWVNURU0pL3Byb2d1YXJkLmZsYWdzCi1pZmVxICgkKExPQ0FMX0VNTUFfSU5TVFJVTUVOVCksdHJ1ZSkKLWlmZGVmIExPQ0FMX0pBQ0tfRU5BQkxFRAotY29tbW9uX3Byb2d1YXJkX2ZsYWdfZmlsZXMgKz0gJChCVUlMRF9TWVNURU0pL3Byb2d1YXJkLmphY29jby5mbGFncwotZWxzZQotY29tbW9uX3Byb2d1YXJkX2ZsYWdzICs9IC1pbmNsdWRlICQoQlVJTERfU1lTVEVNKS9wcm9ndWFyZC5lbW1hLmZsYWdzCi1lbmRpZiAjIExPQ0FMX0pBQ0tfRU5BQkxFRAotZW5kaWYKLSMgSWYgdGhpcyBpcyBhIHRlc3QgcGFja2FnZSwgYWRkIHByb2d1YXJkIGtlZXAgZmxhZ3MgZm9yIHRlc3RzLgorY29tbW9uX3Byb2d1YXJkX2ZsYWdfZmlsZXMgOj0gJChCVUlMRF9TWVNURU0pL3Byb2d1YXJkLmZsYWdzCiBpZm5lcSAoJChMT0NBTF9JTlNUUlVNRU5UQVRJT05fRk9SKSQoZmlsdGVyIHRlc3RzLCQoTE9DQUxfTU9EVUxFX1RBR1MpKSwpCi1jb21tb25fcHJvZ3VhcmRfZmxhZ19maWxlcyArPSAkKEJVSUxEX1NZU1RFTSkvcHJvZ3VhcmRfdGVzdHMuZmxhZ3MKLWlmZXEgKCQoZmlsdGVyIHNocmlua3Rlc3RzLCQoTE9DQUxfUFJPR1VBUkRfRU5BQkxFRCkpLCkKIGNvbW1vbl9wcm9ndWFyZF9mbGFncyArPSAtZG9udHNocmluayAjIGRvbid0IHNocmluayB0ZXN0cyBieSBkZWZhdWx0Ci1lbmRpZiAjIHNocmlua3Rlc3RzCiBlbmRpZiAjIHRlc3QgcGFja2FnZQoraWZuZXEgKCQoTE9DQUxfUFJPR1VBUkRfRU5BQkxFRCksY3VzdG9tKQorICBpZmRlZiBMT0NBTF9VU0VfQUFQVDIKKyAgICBjb21tb25fcHJvZ3VhcmRfZmxhZ19maWxlcyArPSAkKGZvcmVhY2ggbCwkKExPQ0FMX1NUQVRJQ19BTkRST0lEX0xJQlJBUklFUyksXAorICAgICAgICAkKGNhbGwgaW50ZXJtZWRpYXRlcy1kaXItZm9yLEpBVkFfTElCUkFSSUVTLCQobCksLENPTU1PTikvZXhwb3J0X3Byb2d1YXJkX2ZsYWdzKQorICBlbmRpZgorZW5kaWYKIGlmbmVxICgkKGNvbW1vbl9wcm9ndWFyZF9mbGFnX2ZpbGVzKSwpCiBjb21tb25fcHJvZ3VhcmRfZmxhZ3MgKz0gJChhZGRwcmVmaXggLWluY2x1ZGUgLCAkKGNvbW1vbl9wcm9ndWFyZF9mbGFnX2ZpbGVzKSkKICMgVGhpcyBpcyBpbmNsdWRlZCBmcm9tICQoQlVJTERfU1lTVEVNKS9wcm9ndWFyZC5mbGFncwpAQCAtNjA0LDggKzQ2Nyw4IEBACiBpZmVxICgkKGZpbHRlciBvYmZ1c2NhdGlvbiwkKExPQ0FMX1BST0dVQVJEX0VOQUJMRUQpKSwpCiAjIElmIG5vIG9iZnVzY2F0aW9uLCBsaW5rIGluIHRoZSBpbnN0cm1lbnRlZCBwYWNrYWdlJ3MgY2xhc3Nlcy5qYXIgYXMgYSBsaWJyYXJ5LgogIyBsaW5rX2luc3RyX2NsYXNzZXNfamFyIGlzIGRlZmluZWQgaW4gYmFzZV9ydWxlLm1rCi0jIGphY2sgYWxyZWFkeSBoYXMgdGhpcyBsaWJyYXJ5IGluIGl0cyBjbGFzc3BhdGggYW5kIGRvZXNuJ3Qgc3VwcG9ydCBqYXJzCiBsZWdhY3lfcHJvZ3VhcmRfZmxhZ3MgKz0gLWxpYnJhcnlqYXJzICQobGlua19pbnN0cl9jbGFzc2VzX2phcikKK2xlZ2FjeV9wcm9ndWFyZF9saWJfZGVwcyArPSAkKGxpbmtfaW5zdHJfY2xhc3Nlc19qYXIpCiBlbHNlICMgb2JmdXNjYXRpb24KICMgSWYgb2JmdXNjYXRpb24gaXMgZW5hYmxlZCwgdGhlIG1haW4gYXBwIG11c3QgYmUgb2JmdXNjYXRlZCB0b28uCiAjIFdlIG5lZWQgdG8gcnVuIG9iZnVzY2F0aW9uIHVzaW5nIHRoZSBtYWluIGFwcCdzIGRpY3Rpb25hcnksCkBAIC02MTYsMTAgKzQ3OSw2IEBACiAgICAgLWFwcGx5bWFwcGluZyAkKGxpbmtfaW5zdHJfaW50ZXJtZWRpYXRlc19kaXIuQ09NTU9OKS9wcm9ndWFyZF9kaWN0aW9uYXJ5IFwKICAgICAtdmVyYm9zZSBcCiAgICAgJChsZWdhY3lfcHJvZ3VhcmRfZmxhZ3MpCi1pZmRlZiBMT0NBTF9KQUNLX0VOQUJMRUQKLWphY2tfcHJvZ3VhcmRfZmxhZ3MgKz0gLWFwcGx5bWFwcGluZyAkKGxpbmtfaW5zdHJfaW50ZXJtZWRpYXRlc19kaXIuQ09NTU9OKS9qYWNrX2RpY3Rpb25hcnkKLWZ1bGxfamFja19kZXBzICs9ICQobGlua19pbnN0cl9pbnRlcm1lZGlhdGVzX2Rpci5DT01NT04pL2phY2tfZGljdGlvbmFyeQotZW5kaWYKIAogIyBTb21ldGltZXMgKHRlc3QgKyBtYWluIGFwcCkgdXNlcyBkaWZmZXJlbnQga2VlcCBydWxlcyBmcm9tIHRoZSBtYWluIGFwcCAtCiAjIGFwcGx5IHRoZSBtYWluIGFwcCdzIGRpY3Rpb25hcnkgYW55d2F5LgpAQCAtNjMwLDkgKzQ4OSwxMSBAQAogCiBlbmRpZiAjIG5vIG9iZnVzY2F0aW9uCiBlbmRpZiAjIExPQ0FMX0lOU1RSVU1FTlRBVElPTl9GT1IKLWVuZGlmICAjIExPQ0FMX1BST0dVQVJEX0VOQUJMRUQgaXMgbm90IG5vc3lzdGVtCiAKIHByb2d1YXJkX2ZsYWdfZmlsZXMgOj0gJChhZGRwcmVmaXggJChMT0NBTF9QQVRIKS8sICQoTE9DQUxfUFJPR1VBUkRfRkxBR19GSUxFUykpCitpZmVxICgkKFVTRV9SOCksdHJ1ZSkKK3Byb2d1YXJkX2ZsYWdfZmlsZXMgKz0gJChhZGRwcmVmaXggJChMT0NBTF9QQVRIKS8sICQoTE9DQUxfUjhfRkxBR19GSUxFUykpCitlbmRpZiAjIFVTRV9SOAogTE9DQUxfUFJPR1VBUkRfRkxBR1MgKz0gJChhZGRwcmVmaXggLWluY2x1ZGUgLCAkKHByb2d1YXJkX2ZsYWdfZmlsZXMpKQogCiBpZmRlZiBMT0NBTF9URVNUX01PRFVMRV9UT19QUk9HVUFSRF9XSVRICkBAIC02NDEsNTIgKzUwMiw2NiBAQAogZXh0cmFfaW5wdXRfamFyIDo9CiBlbmRpZgogCi0jIElmIG5vdCB1c2luZyBqYWNrIGFuZCBidWlsZGluZyBhZ2FpbnN0IHRoZSBjdXJyZW50IFNESyB2ZXJzaW9uIHRoZW4gZmlsdGVyCi0jIG91dCB0aGUganVuaXQsIGFuZHJvaWQudGVzdCBhbmQgYy5hLmkudS5QcmVkaWNhdGUgY2xhc3NlcyB0aGF0IGFyZSB0byBiZQotIyByZW1vdmVkIGZyb20gdGhlIEFuZHJvaWQgQVBJIGFzIHBhcnQgb2YgYi8zMDE4ODA3NiBidXQgd2hpY2ggYXJlIHN0aWxsCi0jIHByZXNlbnQgaW4gdGhlIEFuZHJvaWQgQVBJLiBUaGlzIGlzIHRvIGFsbG93IGNoYW5nZXMgdG8gYmUgbWFkZSB0byB0aGUKLSMgYnVpbGQgdG8gc3RhdGljYWxseSBpbmNsdWRlIHRob3NlIGNsYXNzZXMgaW50byB0aGUgYXBwbGljYXRpb24gd2l0aG91dAotIyBzaW11bHRhbmVvdXNseSByZW1vdmluZyB0aG9zZSBjbGFzc2VzIGZyb20gdGhlIEFQSS4KLXByb2d1YXJkX2luamFyX2ZpbHRlcnMgOj0KLWlmbmRlZiBMT0NBTF9KQUNLX0VOQUJMRUQKLWlmZGVmIExPQ0FMX1NES19WRVJTSU9OCi1pZmVxICgsJChmaWx0ZXItb3V0IGN1cnJlbnQgc3lzdGVtX2N1cnJlbnQgdGVzdF9jdXJyZW50LCAkKExPQ0FMX1NES19WRVJTSU9OKSkpCi1wcm9ndWFyZF9pbmphcl9maWx0ZXJzIDo9ICghanVuaXQvZnJhbWV3b3JrLyoqLCFqdW5pdC9ydW5uZXIvKiosIWp1bml0L3RleHR1aS8qKiwhYW5kcm9pZC90ZXN0LyoqLCFjb20vYW5kcm9pZC9pbnRlcm5hbC91dGlsLyopCi1lbmRpZgoraWZuZXEgKCQoZmlsdGVyIG9iZnVzY2F0aW9uLCQoTE9DQUxfUFJPR1VBUkRfRU5BQkxFRCkpLCkKK2lmbmVxICgkKFVTRV9SOCksdHJ1ZSkKKyAgJChmdWxsX2NsYXNzZXNfcHJvZ3VhcmRfamFyKTogLktBVElfSU1QTElDSVRfT1VUUFVUUyA6PSAkKHByb2d1YXJkX2RpY3Rpb25hcnkpCitlbHNlCisgICQoYnVpbHRfZGV4X2ludGVybWVkaWF0ZSk6IC5LQVRJX0lNUExJQ0lUX09VVFBVVFMgOj0gJChwcm9ndWFyZF9kaWN0aW9uYXJ5KQogZW5kaWYKIGVuZGlmCiAKLSQoZnVsbF9jbGFzc2VzX3Byb2d1YXJkX2phcik6IFBSSVZBVEVfUFJPR1VBUkRfSU5KQVJfRklMVEVSUyA6PSAkKHByb2d1YXJkX2luamFyX2ZpbHRlcnMpCisjIElmIFI4IGlzIG5vdCBlbmFibGVkIHJ1biBQcm9ndWFyZC4KK2lmbmVxICgkKFVTRV9SOCksdHJ1ZSkKKyMgQ2hhbmdlcyB0byB0aGVzZSBkZXBlbmRlbmNpZXMgbmVlZCB0byBiZSByZXBsaWNhdGVkIGJlbG93IHdoZW4gdXNpbmcgUjgKKyMgaW5zdGVhZCBvZiBQcm9ndWFyZCArIGR4LgogJChmdWxsX2NsYXNzZXNfcHJvZ3VhcmRfamFyKTogUFJJVkFURV9FWFRSQV9JTlBVVF9KQVIgOj0gJChleHRyYV9pbnB1dF9qYXIpCiAkKGZ1bGxfY2xhc3Nlc19wcm9ndWFyZF9qYXIpOiBQUklWQVRFX1BST0dVQVJEX0ZMQUdTIDo9ICQobGVnYWN5X3Byb2d1YXJkX2ZsYWdzKSAkKGNvbW1vbl9wcm9ndWFyZF9mbGFncykgJChMT0NBTF9QUk9HVUFSRF9GTEFHUykKLSQoZnVsbF9jbGFzc2VzX3Byb2d1YXJkX2phcikgOiAkKGZ1bGxfY2xhc3Nlc19wcmVfcHJvZ3VhcmRfamFyKSAkKGV4dHJhX2lucHV0X2phcikgJChteV9zdXBwb3J0X2xpYnJhcnlfc2RrX3JhaXNlKSAkKGNvbW1vbl9wcm9ndWFyZF9mbGFnX2ZpbGVzKSAkKHByb2d1YXJkX2ZsYWdfZmlsZXMpIHwgJChQUk9HVUFSRCkKKyQoZnVsbF9jbGFzc2VzX3Byb2d1YXJkX2phcikgOiAkKGZ1bGxfY2xhc3Nlc19wcmVfcHJvZ3VhcmRfamFyKSAkKGV4dHJhX2lucHV0X2phcikgJChteV9wcm9ndWFyZF9zZGtfcmFpc2UpICQoY29tbW9uX3Byb2d1YXJkX2ZsYWdfZmlsZXMpICQocHJvZ3VhcmRfZmxhZ19maWxlcykgJChsZWdhY3lfcHJvZ3VhcmRfbGliX2RlcHMpIHwgJChQUk9HVUFSRCkKIAkkKGNhbGwgdHJhbnNmb3JtLWphci10by1wcm9ndWFyZCkKK2Vsc2UgIyAhVVNFX1I4CisjIFJ1bm5pbmcgUjggaW5zdGVhZCBvZiBQcm9ndWFyZCwgcHJvZ3VhcmRlZCBqYXIgaXMgYWN0dWFsbHkgdGhlIHByZS1Qcm9ndWFyZGVkIGphci4KK2Z1bGxfY2xhc3Nlc19wcm9ndWFyZF9qYXIgOj0gJChmdWxsX2NsYXNzZXNfcHJlX3Byb2d1YXJkX2phcikKK2VuZGlmICMgIVVTRV9SOAogCiBlbHNlICAjIExPQ0FMX1BST0dVQVJEX0VOQUJMRUQgbm90IGRlZmluZWQKK3Byb2d1YXJkX2ZsYWdfZmlsZXMgOj0KIGZ1bGxfY2xhc3Nlc19wcm9ndWFyZF9qYXIgOj0gJChmdWxsX2NsYXNzZXNfcHJlX3Byb2d1YXJkX2phcikKIGVuZGlmICMgTE9DQUxfUFJPR1VBUkRfRU5BQkxFRCBkZWZpbmVkCiAKLSQoZXZhbCAkKGNhbGwgY29weS1vbmUtZmlsZSwkKGZ1bGxfY2xhc3Nlc19wcm9ndWFyZF9qYXIpLCQoZnVsbF9jbGFzc2VzX2phcikpKQotCi0kKGNhbGwgZGVmaW5lLWphci10by10b2MtcnVsZSwgJChmdWxsX2NsYXNzZXNfamFyKSkKLQogaWZuZXEgKCQoTE9DQUxfSVNfU1RBVElDX0pBVkFfTElCUkFSWSksdHJ1ZSkKLWlmbmRlZiBMT0NBTF9KQUNLX0VOQUJMRUQKICQoYnVpbHRfZGV4X2ludGVybWVkaWF0ZSk6IFBSSVZBVEVfRFhfRkxBR1MgOj0gJChMT0NBTF9EWF9GTEFHUykKLSMgSWYgeW91IGluc3RydW1lbnQgY2xhc3MgZmlsZXMgdGhhdCBoYXZlIGxvY2FsIHZhcmlhYmxlIGRlYnVnIGluZm9ybWF0aW9uIGluCi0jIHRoZW0gZW1tYSBkb2VzIG5vdCBjb3JyZWN0bHkgbWFpbnRhaW4gdGhlIGxvY2FsIHZhcmlhYmxlIHRhYmxlLgotIyBUaGlzIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiB5b3UgdHJ5IHRvIGNvbnZlcnQgdGhlIGNsYXNzIGZpbGVzIGZvciBBbmRyb2lkLgotIyBUaGUgd29ya2Fyb3VuZCBoZXJlIGlzIHRvIGJ1aWxkIGRpZmZlcmVudCBkZXggZmlsZSBoZXJlIGJhc2VkIG9uIGVtbWEgc3dpdGNoCi0jIHRoZW4gbGF0ZXIgY29weSBpbnRvIGNsYXNzZXMuZGV4LiBXaGVuIGVtbWEgaXMgb24sIGR4IGlzIHJ1biB3aXRoIC0tbm8tbG9jYWxzCi0jIG9wdGlvbiB0byByZW1vdmUgbG9jYWwgdmFyaWFibGUgaW5mb3JtYXRpb24KLWlmZXEgKCQoTE9DQUxfRU1NQV9JTlNUUlVNRU5UKSx0cnVlKQotJChidWlsdF9kZXhfaW50ZXJtZWRpYXRlKTogUFJJVkFURV9EWF9GTEFHUyArPSAtLW5vLWxvY2FscwotZW5kaWYKLSQoYnVpbHRfZGV4X2ludGVybWVkaWF0ZSk6ICQoZnVsbF9jbGFzc2VzX2phcikgJChEWCkKLQkkKHRyYW5zZm9ybS1jbGFzc2VzLmphci10by1kZXgpCi1lbmRpZiAjIExPQ0FMX0pBQ0tfRU5BQkxFRCBpcyBkaXNhYmxlZAogCi0kKGJ1aWx0X2RleCk6ICQoYnVpbHRfZGV4X2ludGVybWVkaWF0ZSkKK215X3I4IDo9CitpZmRlZiBMT0NBTF9QUk9HVUFSRF9FTkFCTEVECitpZmVxICgkKFVTRV9SOCksdHJ1ZSkKKyMgVGhlc2UgYXJlIHRoZSBkZXBlbmRlbmNpZXMgZm9yIHRoZSBwcm9ndWFyZGVkIGphciB3aGVuIHJ1bm5pbmcKKyMgUHJvZ3VhcmQgKyBkeC4gVGhleSBhcmUgdXNlZCBmb3IgdGhlIGdlbmVyYXRlZCBkZXggd2hlbiB1c2luZyBSOCwgYXMKKyMgUjggZG9lcyBQcm9ndWFyZCArIGR4CitteV9yOCA6PSB0cnVlCiskKGJ1aWx0X2RleF9pbnRlcm1lZGlhdGUpOiBQUklWQVRFX0VYVFJBX0lOUFVUX0pBUiA6PSAkKGV4dHJhX2lucHV0X2phcikKKyQoYnVpbHRfZGV4X2ludGVybWVkaWF0ZSk6IFBSSVZBVEVfUFJPR1VBUkRfRkxBR1MgOj0gJChsZWdhY3lfcHJvZ3VhcmRfZmxhZ3MpICQoY29tbW9uX3Byb2d1YXJkX2ZsYWdzKSAkKExPQ0FMX1BST0dVQVJEX0ZMQUdTKQorJChidWlsdF9kZXhfaW50ZXJtZWRpYXRlKSA6ICQoZnVsbF9jbGFzc2VzX3Byb2d1YXJkX2phcikgJChleHRyYV9pbnB1dF9qYXIpICQobXlfc3VwcG9ydF9saWJyYXJ5X3Nka19yYWlzZSkgJChjb21tb25fcHJvZ3VhcmRfZmxhZ19maWxlcykgJChwcm9ndWFyZF9mbGFnX2ZpbGVzKSAkKGxlZ2FjeV9wcm9ndWFyZF9saWJfZGVwcykgJChSOF9DT01QQVRfUFJPR1VBUkQpCisJJCh0cmFuc2Zvcm0tamFyLXRvLWRleC1yOCkKK2VuZGlmICMgVVNFX1I4CitlbmRpZiAjIExPQ0FMX1BST0dVQVJEX0VOQUJMRUQKKworaWZuZGVmIG15X3I4CiskKGJ1aWx0X2RleF9pbnRlcm1lZGlhdGUpOiAkKGZ1bGxfY2xhc3Nlc19wcm9ndWFyZF9qYXIpICQoRFgpICQoWklQMlpJUCkKK2lmbmVxICgkKFVTRV9EOF9ERVNVR0FSKSx0cnVlKQorCSQodHJhbnNmb3JtLWNsYXNzZXMuamFyLXRvLWRleCkKK2Vsc2UKKwkkKHRyYW5zZm9ybS1jbGFzc2VzLWQ4Lmphci10by1kZXgpCitlbmRpZgorZW5kaWYKKworaWZuZXEgKCQoZmlsdGVyICQoTE9DQUxfTU9EVUxFKSwkKFBST0RVQ1RfQk9PVF9KQVJTKSksKSAjIGlzX2Jvb3RfamFyCisgICQoZXZhbCAkKGNhbGwgaGlkZGVuYXBpLWNvcHktZGV4LWZpbGVzLCQoYnVpbHRfZGV4X2ludGVybWVkaWF0ZSksJChidWlsdF9kZXhfaGlkZGVuYXBpKSkpCisgIGJ1aWx0X2RleF9jb3B5X2Zyb20gOj0gJChidWlsdF9kZXhfaGlkZGVuYXBpKQorZWxzZSAjICFpc19ib290X2phcgorICBidWlsdF9kZXhfY29weV9mcm9tIDo9ICQoYnVpbHRfZGV4X2ludGVybWVkaWF0ZSkKK2VuZGlmICMgaXNfYm9vdF9qYXIKKworJChidWlsdF9kZXgpOiAkKGJ1aWx0X2RleF9jb3B5X2Zyb20pCiAJQGVjaG8gQ29weWluZzogJEAKIAkkKGhpZGUpIG1rZGlyIC1wICQoZGlyICRAKQogCSQoaGlkZSkgcm0gLWYgJChkaXIgJEApL2NsYXNzZXMqLmRleApAQCAtNzIyLDEzNSArNTk3LDIwIEBACiAKIGVuZGlmICAjIGZ1bGxfY2xhc3Nlc19qYXIgaXMgZGVmaW5lZAogCi1pZm5lcSAoLCQoZmlsdGVyLW91dCBjdXJyZW50IHN5c3RlbV9jdXJyZW50IHRlc3RfY3VycmVudCwgJChMT0NBTF9TREtfVkVSU0lPTikpKQotJChMT0NBTF9JTlRFUk1FRElBVEVfVEFSR0VUUyk6IFBSSVZBVEVfREVGQVVMVF9BUFBfVEFSR0VUX1NESyA6PSAkKExPQ0FMX1NES19WRVJTSU9OKQotJChMT0NBTF9JTlRFUk1FRElBVEVfVEFSR0VUUyk6IFBSSVZBVEVfU0RLX1ZFUlNJT04gOj0gJChMT0NBTF9TREtfVkVSU0lPTikKK2lmbmVxICgsJChmaWx0ZXItb3V0IGN1cnJlbnQgc3lzdGVtX2N1cnJlbnQgdGVzdF9jdXJyZW50IGNvcmVfY3VycmVudCwgJChMT0NBTF9TREtfVkVSU0lPTikpKQorICBteV9kZWZhdWx0X2FwcF90YXJnZXRfc2RrIDo9ICQoY2FsbCBnZXQtbnVtZXJpYy1zZGstdmVyc2lvbiwkKExPQ0FMX1NES19WRVJTSU9OKSkKKyAgbXlfc2RrX3ZlcnNpb24gOj0gJChjYWxsIGdldC1udW1lcmljLXNkay12ZXJzaW9uLCQoTE9DQUxfU0RLX1ZFUlNJT04pKQogZWxzZQotJChMT0NBTF9JTlRFUk1FRElBVEVfVEFSR0VUUyk6IFBSSVZBVEVfREVGQVVMVF9BUFBfVEFSR0VUX1NESyA6PSAkKERFRkFVTFRfQVBQX1RBUkdFVF9TREspCi0kKExPQ0FMX0lOVEVSTUVESUFURV9UQVJHRVRTKTogUFJJVkFURV9TREtfVkVSU0lPTiA6PSAkKFBMQVRGT1JNX1NES19WRVJTSU9OKQorICBteV9kZWZhdWx0X2FwcF90YXJnZXRfc2RrIDo9ICQoREVGQVVMVF9BUFBfVEFSR0VUX1NESykKKyAgbXlfc2RrX3ZlcnNpb24gOj0gJChQTEFURk9STV9TREtfVkVSU0lPTikKIGVuZGlmCiAKLWlmZGVmIExPQ0FMX0pBQ0tfRU5BQkxFRAotJChMT0NBTF9JTlRFUk1FRElBVEVfVEFSR0VUUyk6IFwKLQlQUklWQVRFX0pBQ0tfSU5URVJNRURJQVRFU19ESVIgOj0gJChpbnRlcm1lZGlhdGVzLkNPTU1PTikvamFjay1yc2MKLWlmZXEgKCQoTE9DQUxfSkFDS19FTkFCTEVEKSxpbmNyZW1lbnRhbCkKLSQoTE9DQUxfSU5URVJNRURJQVRFX1RBUkdFVFMpOiBcCi0JUFJJVkFURV9KQUNLX0lOQ1JFTUVOVEFMX0RJUiA6PSAkKGludGVybWVkaWF0ZXMuQ09NTU9OKS9qYWNrLWluY3JlbWVudGFsCi0kKG5vc2hyb2JfY2xhc3Nlc19qYWNrKTogUFJJVkFURV9KQUNLX0lOQ1JFTUVOVEFMX0RJUiA6PSAkKGludGVybWVkaWF0ZXMuQ09NTU9OKS9qYWNrLW5vc2hyb2ItaW5jcmVtZW50YWwKLSQoamFja19jaGVja190aW1lc3RhbXApOiBQUklWQVRFX0pBQ0tfSU5DUkVNRU5UQUxfRElSIDo9ICQoaW50ZXJtZWRpYXRlcy5DT01NT04pL2phY2stY2hlY2staW5jcmVtZW50YWwKK2lmZGVmIExPQ0FMX01JTl9TREtfVkVSU0lPTgorICBteV9taW5fc2RrX3ZlcnNpb24gOj0gJChMT0NBTF9NSU5fU0RLX1ZFUlNJT04pCiBlbHNlCi0kKExPQ0FMX0lOVEVSTUVESUFURV9UQVJHRVRTKTogXAotCVBSSVZBVEVfSkFDS19JTkNSRU1FTlRBTF9ESVIgOj0KLSQobm9zaHJvYl9jbGFzc2VzX2phY2spOiBQUklWQVRFX0pBQ0tfSU5DUkVNRU5UQUxfRElSIDo9Ci0kKGphY2tfY2hlY2tfdGltZXN0YW1wKTogUFJJVkFURV9KQUNLX0lOQ1JFTUVOVEFMX0RJUiA6PQorICBteV9taW5fc2RrX3ZlcnNpb24gOj0gJChjYWxsIGNvZGVuYW1lLW9yLXNkay10by1zZGssJChteV9kZWZhdWx0X2FwcF90YXJnZXRfc2RrKSkKIGVuZGlmCiAKLWlmZGVmIGZ1bGxfY2xhc3Nlc19qYXIKLWlmZGVmIExPQ0FMX1BST0dVQVJEX0VOQUJMRUQKLQotaWZuZGVmIExPQ0FMX0pBQ0tfUFJPR1VBUkRfRkxBR1MKLSAgICBMT0NBTF9KQUNLX1BST0dVQVJEX0ZMQUdTIDo9ICQoTE9DQUxfUFJPR1VBUkRfRkxBR1MpCi1lbmRpZgotTE9DQUxfSkFDS19QUk9HVUFSRF9GTEFHUyArPSAkKGFkZHByZWZpeCAtaW5jbHVkZSAsICQocHJvZ3VhcmRfZmxhZ19maWxlcykpCi1pZmRlZiBMT0NBTF9URVNUX01PRFVMRV9UT19QUk9HVUFSRF9XSVRICi0gICAgJChlcnJvciAkKExPQ0FMX01PRFVMRSk6IEJ1aWxkIHdpdGggamFjayB3aGVuIExPQ0FMX1RFU1RfTU9EVUxFX1RPX1BST0dVQVJEX1dJVEggaXMgZGVmaW5lZCBpcyBub3QgeWV0IGltcGxlbWVudGVkKQotZW5kaWYKLQotIyAkKGphY2tfZGljdGlvbmFyeSkgaXMganVzdCBieS1wcm9kdWN0IG9mICQoYnVpbHRfZGV4X2ludGVybWVkaWF0ZSkuCi0jIFRoZSBkdW1teSBjb21tYW5kIHdhcyBhZGRlZCBiZWNhdXNlLCB3aXRob3V0IGl0LCBtYWtlIG1pc3NlcyB0aGUgZmFjdCB0aGUgJChidWlsdF9kZXgpIGFsc28KLSMgY2hhbmdlICQoamFja19kaWN0aW9uYXJ5KS4KLSQoamFja19kaWN0aW9uYXJ5KTogJChmdWxsX2NsYXNzZXNfamFjaykKLQkkKGhpZGUpIHRvdWNoICRACi0KLSQoTE9DQUxfSU5URVJNRURJQVRFX1RBUkdFVFMpOiBQUklWQVRFX0pBQ0tfUFJPR1VBUkRfRkxBR1MgOj0gJChjb21tb25fcHJvZ3VhcmRfZmxhZ3MpICQoamFja19wcm9ndWFyZF9mbGFncykgJChMT0NBTF9KQUNLX1BST0dVQVJEX0ZMQUdTKQotZWxzZSAgIyBMT0NBTF9QUk9HVUFSRF9FTkFCTEVEIG5vdCBkZWZpbmVkCi0kKExPQ0FMX0lOVEVSTUVESUFURV9UQVJHRVRTKTogUFJJVkFURV9KQUNLX1BST0dVQVJEX0ZMQUdTIDo9Ci1lbmRpZiAjIExPQ0FMX1BST0dVQVJEX0VOQUJMRUQgZGVmaW5lZAotCi0kKExPQ0FMX0lOVEVSTUVESUFURV9UQVJHRVRTKTogUFJJVkFURV9KQUNLX0ZMQUdTIDo9ICQoR0xPQkFMX0pBVkFDX0RFQlVHX0ZMQUdTKSAkKExPQ0FMX0pBQ0tfRkxBR1MpICQoYW5ub3RhdGlvbl9wcm9jZXNzb3JfZmxhZ3MpCi0kKExPQ0FMX0lOVEVSTUVESUFURV9UQVJHRVRTKTogUFJJVkFURV9KQUNLX1ZFUlNJT04gOj0gJChMT0NBTF9KQUNLX1ZFUlNJT04pCi0KLWphY2tfYWxsX2RlcHMgOj0gJChqYXZhX3NvdXJjZXMpICQoamF2YV9yZXNvdXJjZV9zb3VyY2VzKSAkKGZ1bGxfamFja19kZXBzKSBcCi0gICAgICAgICQoamFyX21hbmlmZXN0X2ZpbGUpICQobGF5ZXJzX2ZpbGUpICQoUmVuZGVyU2NyaXB0X2ZpbGVfc3RhbXApIFwKLSAgICAgICAgJChjb21tb25fcHJvZ3VhcmRfZmxhZ19maWxlcykgJChwcm9ndWFyZF9mbGFnX2ZpbGVzKSBcCi0gICAgICAgICQocHJvdG9famF2YV9zb3VyY2VzX2ZpbGVfc3RhbXApICQoYW5ub3RhdGlvbl9wcm9jZXNzb3JfZGVwcykgXAotICAgICAgICAkKExPQ0FMX0FERElUSU9OQUxfREVQRU5ERU5DSUVTKSAkKExPQ0FMX0pBUkpBUl9SVUxFUykgXAotICAgICAgICAkKE5PUk1BTElaRV9QQVRIKSAkKEpBQ0tfREVGQVVMVF9BUkdTKSAkKEpBQ0spCi0KLSQoamFja19jaGVja190aW1lc3RhbXApOiAkKGphY2tfYWxsX2RlcHMpIHwgc2V0dXAtamFjay1zZXJ2ZXIKLQlAZWNobyBDaGVja2luZyBidWlsZCB3aXRoIEphY2s6ICRACi0JJChqYWNrLWNoZWNrLWphdmEpCi0KLWlmZXEgKCQoTE9DQUxfSVNfU1RBVElDX0pBVkFfTElCUkFSWSksdHJ1ZSkKLSQoZnVsbF9jbGFzc2VzX2phY2spOiBQUklWQVRFX0pBQ0tfUExVR0lOX1BBVEggOj0gJChMT0NBTF9KQUNLX1BMVUdJTl9QQVRIKQotJChmdWxsX2NsYXNzZXNfamFjayk6IFBSSVZBVEVfSkFDS19QTFVHSU4gOj0gJChMT0NBTF9KQUNLX1BMVUdJTikKLSQoZnVsbF9jbGFzc2VzX2phY2spOiAkKGphY2tfYWxsX2RlcHMpICQoTE9DQUxfSkFDS19QTFVHSU5fUEFUSCkgfCBzZXR1cC1qYWNrLXNlcnZlcgotCUBlY2hvIEJ1aWxkaW5nIHdpdGggSmFjazogJEAKLQkkKGphdmEtdG8tamFjaykKLQotIyBVcGRhdGUgdGltZXN0YW1wcyBvZiAudG9jIGZpbGVzIGZvciBzdGF0aWMgamF2YSBsaWJyYXJpZXMgc28KLSMgZGVwZW5kZW50cyB3aWxsIGJlIGFsd2F5cyByZWJ1aWx0LgotJChidWlsdF9kZXgpLnRvYzogJChmdWxsX2NsYXNzZXNfamFjaykKLQl0b3VjaCAkQAotCi1lbHNlICNMT0NBTF9JU19TVEFUSUNfSkFWQV9MSUJSQVJZCi0kKGJ1aWx0X2RleF9pbnRlcm1lZGlhdGUpOiBQUklWQVRFX0NMQVNTRVNfSkFDSyA6PSAkKGZ1bGxfY2xhc3Nlc19qYWNrKQotCi1pZmVxICgkKExPQ0FMX0VNTUFfSU5TVFJVTUVOVCksdHJ1ZSkKLUxPQ0FMX0pBQ0tfUExVR0lOX1BBVEggKz0gJChIT1NUX09VVF9KQVZBX0xJQlJBUklFUykvamFjay1jb3ZlcmFnZS1wbHVnaW4uamFyCi1MT0NBTF9KQUNLX1BMVUdJTiArPSBjb20uYW5kcm9pZC5qYWNrLmNvdmVyYWdlLkNvZGVDb3ZlcmFnZQotJChidWlsdF9kZXhfaW50ZXJtZWRpYXRlKTogUFJJVkFURV9KQUNLX0NPVkVSQUdFX09QVElPTlMgOj0gXAotICAgIC1EIGphY2suY292ZXJhZ2U9dHJ1ZSBcCi0gICAgLUQgamFjay5jb3ZlcmFnZS5tZXRhZGF0YS5maWxlPSQoaW50ZXJtZWRpYXRlcy5DT01NT04pL2NvdmVyYWdlLmVtIFwKLSAgICAtRCBqYWNrLmNvdmVyYWdlLmphY29jby5wYWNrYWdlPSQoSkFDT0NPX1BBQ0tBR0VfTkFNRSkgXAotICAgICQoYWRkcHJlZml4IC1EIGphY2suY292ZXJhZ2UuamFjb2NvLmluY2x1ZGU9LCQoTE9DQUxfSkFDS19DT1ZFUkFHRV9JTkNMVURFX0ZJTFRFUikpIFwKLSAgICAkKGFkZHByZWZpeCAtRCBqYWNrLmNvdmVyYWdlLmphY29jby5leGNsdWRlPSwkKExPQ0FMX0pBQ0tfQ09WRVJBR0VfRVhDTFVERV9GSUxURVIpKQotZWxzZQotJChidWlsdF9kZXhfaW50ZXJtZWRpYXRlKTogUFJJVkFURV9KQUNLX0NPVkVSQUdFX09QVElPTlMgOj0KLWVuZGlmCi0KLSMgQ29tcGlsaW5nIHdpdGggamF2YWMgdG8gamFyLCB0aGVuIGNvbnZlcnRpbmcgamFyIHRvIGRleCB3aXRoIGphY2sKLWlmZXEgKCQoTE9DQUxfSkFDS19FTkFCTEVEKSxqYXZhY19mcm9udGVuZCkKLQotIyBQUklWQVRFX0VYVFJBX0pBUl9BUkdTIGFuZCBzb3VyY2UgZmlsZXMgd2VyZSBhbHJlYWR5IGhhbmRsZWQgZHVyaW5nIGphdmFjCi0kKGJ1aWx0X2RleF9pbnRlcm1lZGlhdGUpOiBQUklWQVRFX0VYVFJBX0pBUl9BUkdTIDo9Ci0kKGJ1aWx0X2RleF9pbnRlcm1lZGlhdGUpOiBQUklWQVRFX0pBVkFfU09VUkNFUyA6PQotJChidWlsdF9kZXhfaW50ZXJtZWRpYXRlKTogUFJJVkFURV9TT1VSQ0VfSU5URVJNRURJQVRFU19ESVIgOj0KLSQoYnVpbHRfZGV4X2ludGVybWVkaWF0ZSk6IFBSSVZBVEVfSEFTX1BST1RPX1NPVVJDRVMgOj0KLSQoYnVpbHRfZGV4X2ludGVybWVkaWF0ZSk6IFBSSVZBVEVfSEFTX1JTX1NPVVJDRVMgOj0KLQotIyBJbmNyZW1lbnRhbCBjb21waWxhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIHdoZW4gbWl4aW5nIGphdmFjIGFuZCBqYWNrCi0kKGJ1aWx0X2RleF9pbnRlcm1lZGlhdGUpOiBQUklWQVRFX0pBQ0tfSU5DUkVNRU5UQUxfRElSIDo9Ci0KLSMgUGFzcyBvdXRwdXQgb2YgamF2YWMgdG8gamFjawotJChidWlsdF9kZXhfaW50ZXJtZWRpYXRlKTogUFJJVkFURV9KQUNLX0lNUE9SVF9KQVIgOj0gJChmdWxsX2NsYXNzZXNfY29tcGlsZWRfamFyKQotJChidWlsdF9kZXhfaW50ZXJtZWRpYXRlKTogJChmdWxsX2NsYXNzZXNfY29tcGlsZWRfamFyKQotZWxzZSAjIExPQ0FMX0pBQ0tfRU5BQkxFRCAhPSBqYXZhY19mcm9udGVuZAotJChidWlsdF9kZXhfaW50ZXJtZWRpYXRlKTogUFJJVkFURV9KQUNLX0lNUE9SVF9KQVIgOj0KLWVuZGlmICMgTE9DQUxfSkFDS19FTkFCTEVEICE9IGphdmFjX2Zyb250ZW5kCi0KLSQoYnVpbHRfZGV4X2ludGVybWVkaWF0ZSk6IFBSSVZBVEVfSkFDS19QTFVHSU5fUEFUSCA6PSAkKExPQ0FMX0pBQ0tfUExVR0lOX1BBVEgpCi0kKGJ1aWx0X2RleF9pbnRlcm1lZGlhdGUpOiBQUklWQVRFX0pBQ0tfUExVR0lOIDo9ICQoTE9DQUxfSkFDS19QTFVHSU4pCi0kKGJ1aWx0X2RleF9pbnRlcm1lZGlhdGUpOiAkKGphY2tfYWxsX2RlcHMpICQoTE9DQUxfSkFDS19QTFVHSU5fUEFUSCkgfCBzZXR1cC1qYWNrLXNlcnZlcgotCUBlY2hvIEJ1aWxkaW5nIHdpdGggSmFjazogJEAKLQkkKGphY2stamF2YS10by1kZXgpCi0KLSMgJChmdWxsX2NsYXNzZXNfamFjaykgaXMganVzdCBieS1wcm9kdWN0IG9mICQoYnVpbHRfZGV4X2ludGVybWVkaWF0ZSkuCi0jIFRoZSBkdW1teSBjb21tYW5kIHdhcyBhZGRlZCBiZWNhdXNlLCB3aXRob3V0IGl0LCBtYWtlIG1pc3NlcyB0aGUgZmFjdCB0aGUgJChidWlsdF9kZXgpIGFsc28KLSMgY2hhbmdlICQoZnVsbF9jbGFzc2VzX2phY2spLgotJChmdWxsX2NsYXNzZXNfamFjayk6ICQoYnVpbHRfZGV4X2ludGVybWVkaWF0ZSkKLQkkKGhpZGUpIHRvdWNoICRACi0KLSQoY2FsbCBkZWZpbmUtZGV4LXRvLXRvYy1ydWxlLCAkKGludGVybWVkaWF0ZXMuQ09NTU9OKSkKLQotZW5kaWYgI0xPQ0FMX0lTX1NUQVRJQ19KQVZBX0xJQlJBUlkKLQotJChub3Nocm9iX2NsYXNzZXNfamFjayk6IFBSSVZBVEVfSkFDS19QTFVHSU5fUEFUSCA6PSAkKExPQ0FMX0pBQ0tfUExVR0lOX1BBVEgpCi0kKG5vc2hyb2JfY2xhc3Nlc19qYWNrKTogUFJJVkFURV9KQUNLX1BMVUdJTiA6PSAkKExPQ0FMX0pBQ0tfUExVR0lOKQotJChub3Nocm9iX2NsYXNzZXNfamFjayk6IFBSSVZBVEVfSkFDS19JTlRFUk1FRElBVEVTX0RJUiA6PSAkKGludGVybWVkaWF0ZXMuQ09NTU9OKS9qYWNrLW5vc2hyb2ItcnNjCi0kKG5vc2hyb2JfY2xhc3Nlc19qYWNrKTogUFJJVkFURV9KQUNLX1BST0dVQVJEX0ZMQUdTIDo9Ci0kKG5vc2hyb2JfY2xhc3Nlc19qYWNrKTogJChqYWNrX2FsbF9kZXBzKSAkKExPQ0FMX0pBQ0tfUExVR0lOX1BBVEgpIHwgc2V0dXAtamFjay1zZXJ2ZXIKLQlAZWNobyBCdWlsZGluZyB3aXRoIEphY2s6ICRACi0JJChqYXZhLXRvLWphY2spCi1lbmRpZiAgIyBmdWxsX2NsYXNzZXNfamFyIGlzIGRlZmluZWQKLWVuZGlmICMgTE9DQUxfSkFDS19FTkFCTEVECiskKExPQ0FMX0lOVEVSTUVESUFURV9UQVJHRVRTKTogUFJJVkFURV9ERUZBVUxUX0FQUF9UQVJHRVRfU0RLIDo9ICQobXlfZGVmYXVsdF9hcHBfdGFyZ2V0X3NkaykKKyQoTE9DQUxfSU5URVJNRURJQVRFX1RBUkdFVFMpOiBQUklWQVRFX1NES19WRVJTSU9OIDo9ICQobXlfc2RrX3ZlcnNpb24pCiskKExPQ0FMX0lOVEVSTUVESUFURV9UQVJHRVRTKTogUFJJVkFURV9NSU5fU0RLX1ZFUlNJT04gOj0gJChteV9taW5fc2RrX3ZlcnNpb24pCmRpZmYgLS1naXQgYS9jb3JlL2phdmFfY29tbW9uLm1rIGIvY29yZS9qYXZhX2NvbW1vbi5tawppbmRleCBiZjdmMDM5Li44ZjQ2MTFlIDEwMDY0NAotLS0gYS9jb3JlL2phdmFfY29tbW9uLm1rCisrKyBiL2NvcmUvamF2YV9jb21tb24ubWsKQEAgLTEsNSArMSwxMSBAQAogIyBDb21tb24gdG8gaG9zdCBhbmQgdGFyZ2V0IEphdmEgbW9kdWxlcy4KIAorbXlfc29vbmdfcHJvYmxlbXMgOj0KKworaWZuZXEgKCQoZmlsdGVyIC4uLyUsJChMT0NBTF9TUkNfRklMRVMpKSwpCitteV9zb29uZ19wcm9ibGVtcyArPSBkb3Rkb3Rfc3JjcworZW5kaWYKKwogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICMjIEphdmEgdmVyc2lvbgogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKQEAgLTE1LDE4ICsyMSw0NyBAQAogIyBNb2R1bGVzIGNhbiBvdmVycmlkZSB0aGlzIGxvZ2ljIGJ5IHNwZWNpZnlpbmcKICMgTE9DQUxfSkFWQV9MQU5HVUFHRV9WRVJTSU9OIGV4cGxpY2l0bHkuCiBpZmVxICgsJChMT0NBTF9KQVZBX0xBTkdVQUdFX1ZFUlNJT04pKQotICBwcml2YXRlX3Nka192ZXJzaW9uc193aXRob3V0X2FueV9qYXZhXzE4X3N1cHBvcnQgOj0gMSAyIDMgNCA1IDYgNyA4IDkgMTAgMTEgMTIgMTMgMTQgMTUgMTYgMTcgMTggMTkgMjAgMjEgMjIgMjMKLSAgaWZuZXEgKCwkKGZpbHRlciAkKExPQ0FMX1NES19WRVJTSU9OKSwgJChwcml2YXRlX3Nka192ZXJzaW9uc193aXRob3V0X2FueV9qYXZhXzE4X3N1cHBvcnQpKSkKKyAgaWZuZXEgKCwkKGZpbHRlciAkKExPQ0FMX1NES19WRVJTSU9OKSwgJChUQVJHRVRfU0RLX1ZFUlNJT05TX1dJVEhPVVRfSkFWQV8xOF9TVVBQT1JUKSkpCiAgICAgTE9DQUxfSkFWQV9MQU5HVUFHRV9WRVJTSU9OIDo9IDEuNwotICBlbHNlCisgIGVsc2UgaWZuZXEgKCwkKGZpbHRlciAkKExPQ0FMX1NES19WRVJTSU9OKSwgJChUQVJHRVRfU0RLX1ZFUlNJT05TX1dJVEhPVVRfSkFWQV8xOV9TVVBQT1JUKSkpCiAgICAgTE9DQUxfSkFWQV9MQU5HVUFHRV9WRVJTSU9OIDo9IDEuOAorICBlbHNlIGlmbmVxICgsJChMT0NBTF9TREtfVkVSU0lPTikkKFRBUkdFVF9CVUlMRF9BUFBTKSkKKyAgICAjIFRPRE8oY2Nyb3NzKTogYWxsb3cgMS45IGZvciBjdXJyZW50IGFuZCB1bmJ1bmRsZWQgb25jZSB3ZSBoYXZlIFNESyBzeXN0ZW0gbW9kdWxlcworICAgIExPQ0FMX0pBVkFfTEFOR1VBR0VfVkVSU0lPTiA6PSAxLjgKKyAgZWxzZQorICAgICMgREVGQVVMVF9KQVZBX0xBTkdVQUdFX1ZFUlNJT04gaXMgMS44LCB1bmxlc3MgVEFSR0VUX09QRU5KREs5IGluIHdoaWNoIGNhc2UgaXQgaXMgMS45CisgICAgTE9DQUxfSkFWQV9MQU5HVUFHRV9WRVJTSU9OIDo9ICQoREVGQVVMVF9KQVZBX0xBTkdVQUdFX1ZFUlNJT04pCiAgIGVuZGlmCiBlbmRpZgogTE9DQUxfSkFWQUNGTEFHUyArPSAtc291cmNlICQoTE9DQUxfSkFWQV9MQU5HVUFHRV9WRVJTSU9OKSAtdGFyZ2V0ICQoTE9DQUxfSkFWQV9MQU5HVUFHRV9WRVJTSU9OKQogCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIE9wZW5KREsgdmVyc2lvbnMgdXAgdG8gOCBzaGlwcGVkIHdpdGggYm9vdHN0cmFwIGFuZCB0b29scyBqYXJzCisjIChydC5qYXIsIGpjZS5qYXIsIHRvb2xzLmphciBldGMuKS4gVGhlc2UgYXJlIG5vIGxvbmdlciBwYXJ0IG9mCisjIE9wZW5KREsgOSwgYnV0IHdlIHN0aWxsIG1ha2UgdGhlbSBhdmFpbGFibGUgZm9yIGhvc3QgdG9vbHMgdGhhdAorIyBhcmUgdGFyZ2V0aW5nIG9sZGVyIHZlcnNpb25zLgorVVNFX0hPU1RfQk9PVFNUUkFQX0pBUlMgOj0gdHJ1ZQoraWZlcSAoLCQoZmlsdGVyICQoTE9DQUxfSkFWQV9MQU5HVUFHRV9WRVJTSU9OKSwgMS42IDEuNyAxLjgpKQorVVNFX0hPU1RfQk9PVFNUUkFQX0pBUlMgOj0gZmFsc2UKK2VuZGlmCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgRHJvcCBIT1NUX0pES19UT09MU19KQVIgZnJvbSBjbGFzc3BhdGggd2hlbiB0YXJnZXRpbmcgdmVyc2lvbnMgPiA5ICh3aGljaCBkb24ndCBoYXZlIGl0KS4KKyMgVE9ETzogUmVtb3ZlIEhPU1RfSkRLX1RPT0xTX0pBUiBhbmQgYWxsIHJlZmVyZW5jZXMgdG8gaXQgb25jZSBob3N0CisjIGJvb3RzdHJhcCBqYXJzIGFyZSBubyBsb25nZXIgc3VwcG9ydGVkIChpZS4gd2hlbiBVU0VfSE9TVF9CT09UU1RSQVBfSkFSUworIyBpcyBhbHdheXMgZmFsc2UpLiBodHRwOi8vYi8zODQxODIyMAoraWZuZXEgKCQoVVNFX0hPU1RfQk9PVFNUUkFQX0pBUlMpLHRydWUpCitMT0NBTF9DTEFTU1BBVEggOj0gJChmaWx0ZXItb3V0ICQoSE9TVF9KREtfVE9PTFNfSkFSKSwkKExPQ0FMX0NMQVNTUEFUSCkpCitlbmRpZgorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIyMgLnByb3RvIGZpbGVzOiBDb21waWxlIHByb3RvIGZpbGVzIHRvIC5qYXZhCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworaWZlcSAoJChzdHJpcCAkKExPQ0FMX1BST1RPQ19PUFRJTUlaRV9UWVBFKSksKQorICBMT0NBTF9QUk9UT0NfT1BUSU1JWkVfVFlQRSA6PSBsaXRlCitlbmRpZgogcHJvdG9fc291cmNlcyA6PSAkKGZpbHRlciAlLnByb3RvLCQoTE9DQUxfU1JDX0ZJTEVTKSkKICMgQmVjYXVzZSBuYW1lcyBvZiB0aGUgLmphdmEgZmlsZXMgY29tcGlsZWQgZnJvbSAucHJvdG8gZmlsZXMgYXJlIHVua25vd24gdW50aWwgdGhlCiAjIC5wcm90byBmaWxlcyBhcmUgY29tcGlsZWQsIHdlIHVzZSBhIHRpbWVzdGFtcCBmaWxlIGFzIGRlcGVkZW5jeS4KQEAgLTU2LDcgKzkxLDcgQEAKICAgZW5kaWYKIGVuZGlmCiAkKHByb3RvX2phdmFfc291cmNlc19maWxlX3N0YW1wKTogUFJJVkFURV9QUk9UT0NfRkxBR1MgOj0gJChMT0NBTF9QUk9UT0NfRkxBR1MpCi0kKHByb3RvX2phdmFfc291cmNlc19maWxlX3N0YW1wKTogUFJJVkFURV9QUk9UT19KQVZBX09VVFBVVF9QQVJBTVMgOj0gJChMT0NBTF9QUk9UT19KQVZBX09VVFBVVF9QQVJBTVMpCiskKHByb3RvX2phdmFfc291cmNlc19maWxlX3N0YW1wKTogUFJJVkFURV9QUk9UT19KQVZBX09VVFBVVF9QQVJBTVMgOj0gJChpZiAkKGZpbHRlciBsaXRlLCQoTE9DQUxfUFJPVE9DX09QVElNSVpFX1RZUEUpKSxsaXRlJChpZiAkKExPQ0FMX1BST1RPX0pBVkFfT1VUUFVUX1BBUkFNUyksOiwpLCkkKExPQ0FMX1BST1RPX0pBVkFfT1VUUFVUX1BBUkFNUykKICQocHJvdG9famF2YV9zb3VyY2VzX2ZpbGVfc3RhbXApIDogJChwcm90b19zb3VyY2VzX2Z1bGxwYXRoKSAkKFBST1RPQykKIAkkKGNhbGwgdHJhbnNmb3JtLXByb3RvLXRvLWphdmEpCiAKQEAgLTE0Miw3ICsxNzcsNyBAQAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIyMgV2FybiBpZiB0aGVyZSBpcyB1bnJlY29nbml6ZWQgZmlsZSBpbiBMT0NBTF9TUkNfRklMRVMuCiBteV91bmtub3duX3NyY19maWxlcyA6PSAkKGZpbHRlci1vdXQgXAotICAlLmphdmEgJS5haWRsICUucHJvdG8gJS5sb2d0YWdzICUuZnMgJS5ycywgXAorICAlLmphdmEgJS5haWRsICUucHJvdG8gJS5sb2d0YWdzLCBcCiAgICQoTE9DQUxfU1JDX0ZJTEVTKSAkKExPQ0FMX0lOVEVSTUVESUFURV9TT1VSQ0VTKSAkKExPQ0FMX0dFTkVSQVRFRF9TT1VSQ0VTKSkKIGlmbmVxICgkKG15X3Vua25vd25fc3JjX2ZpbGVzKSwpCiAkKHdhcm5pbmcgJChMT0NBTF9NT0RVTEVfTUFLRUZJTEUpOiAkKExPQ0FMX01PRFVMRSk6IFVudXNlZCBzb3VyY2UgZmlsZXM6ICQobXlfdW5rbm93bl9zcmNfZmlsZXMpKQpAQCAtMTUzLDE0ICsxODgsMTQgQEAKICMgTE9DQUxfU09VUkNFX0ZJTEVTX0FMTF9HRU5FUkFURUQgaXMgc2V0IG9ubHkgaWYgdGhlIG1vZHVsZSBkb2VzIG5vdCBoYXZlIHN0YXRpYyBzb3VyY2UgZmlsZXMsCiAjIGJ1dCBnZW5lcmF0ZWQgc291cmNlIGZpbGVzIGluIGl0cyBMT0NBTF9JTlRFUk1FRElBVEVfU09VUkNFX0RJUi4KICMgWW91IGhhdmUgdG8gc2V0IHVwIHRoZSBkZXBlbmRlbmN5IGluIHNvbWUgb3RoZXIgd2F5LgotbmVlZF9jb21waWxlX2phdmEgOj0gJChzdHJpcCAkKGFsbF9qYXZhX3NvdXJjZXMpJChhbGxfcmVzX2Fzc2V0cykkKGphdmFfcmVzb3VyY2Vfc291cmNlcykpJChMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMpJChmaWx0ZXIgdHJ1ZSwkKExPQ0FMX1NPVVJDRV9GSUxFU19BTExfR0VORVJBVEVEKSkKK25lZWRfY29tcGlsZV9qYXZhIDo9ICQoc3RyaXAgJChhbGxfamF2YV9zb3VyY2VzKSQoTE9DQUxfU1JDSkFSUykkKGFsbF9yZXNfYXNzZXRzKSQoamF2YV9yZXNvdXJjZV9zb3VyY2VzKSkkKExPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUykkKGZpbHRlciB0cnVlLCQoTE9DQUxfU09VUkNFX0ZJTEVTX0FMTF9HRU5FUkFURUQpKQogaWZkZWYgbmVlZF9jb21waWxlX2phdmEKIAogYW5ub3RhdGlvbl9wcm9jZXNzb3JfZmxhZ3MgOj0KIGFubm90YXRpb25fcHJvY2Vzc29yX2RlcHMgOj0KIAogaWZkZWYgTE9DQUxfQU5OT1RBVElPTl9QUk9DRVNTT1JTCi0gIGFubm90YXRpb25fcHJvY2Vzc29yX2phcnMgOj0gJChjYWxsIGphdmEtbGliLWRlcHMsJChMT0NBTF9BTk5PVEFUSU9OX1BST0NFU1NPUlMpLHRydWUpCisgIGFubm90YXRpb25fcHJvY2Vzc29yX2phcnMgOj0gJChjYWxsIGphdmEtbGliLWZpbGVzLCQoTE9DQUxfQU5OT1RBVElPTl9QUk9DRVNTT1JTKSx0cnVlKQogICBhbm5vdGF0aW9uX3Byb2Nlc3Nvcl9mbGFncyArPSAtcHJvY2Vzc29ycGF0aCAkKGNhbGwgbm9ybWFsaXplLXBhdGgtbGlzdCwkKGFubm90YXRpb25fcHJvY2Vzc29yX2phcnMpKQogICBhbm5vdGF0aW9uX3Byb2Nlc3Nvcl9kZXBzICs9ICQoYW5ub3RhdGlvbl9wcm9jZXNzb3JfamFycykKIApAQCAtMTcwLDEyICsyMDUsMTEgQEAKICAgYW5ub3RhdGlvbl9wcm9jZXNzb3JfamFycyA6PQogZW5kaWYKIAotZnVsbF9zdGF0aWNfamF2YV9saWJzIDo9IFwKLSAgICAkKGZvcmVhY2ggbGliLCQoTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTKSwgXAotICAgICAgJChjYWxsIGludGVybWVkaWF0ZXMtZGlyLWZvciwgXAotICAgICAgICBKQVZBX0xJQlJBUklFUywkKGxpYiksJChMT0NBTF9JU19IT1NUX01PRFVMRSksQ09NTU9OKS9jbGFzc2VzLmphcikKK2Z1bGxfc3RhdGljX2phdmFfbGlicyA6PSAkKGNhbGwgamF2YS1saWItZmlsZXMsJChMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMpLCQoTE9DQUxfSVNfSE9TVF9NT0RVTEUpKQorZnVsbF9zdGF0aWNfamF2YV9oZWFkZXJfbGlicyA6PSAkKGNhbGwgamF2YS1saWItaGVhZGVyLWZpbGVzLCQoTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTKSwkKExPQ0FMX0lTX0hPU1RfTU9EVUxFKSkKIAogJChMT0NBTF9JTlRFUk1FRElBVEVfVEFSR0VUUyk6IFBSSVZBVEVfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9ICQoZnVsbF9zdGF0aWNfamF2YV9saWJzKQorJChMT0NBTF9JTlRFUk1FRElBVEVfVEFSR0VUUyk6IFBSSVZBVEVfU1RBVElDX0pBVkFfSEVBREVSX0xJQlJBUklFUyA6PSAkKGZ1bGxfc3RhdGljX2phdmFfaGVhZGVyX2xpYnMpCiAKICQoTE9DQUxfSU5URVJNRURJQVRFX1RBUkdFVFMpOiBQUklWQVRFX1JFU09VUkNFX0RJUiA6PSAkKExPQ0FMX1JFU09VUkNFX0RJUikKICQoTE9DQUxfSU5URVJNRURJQVRFX1RBUkdFVFMpOiBQUklWQVRFX0FTU0VUX0RJUiA6PSAkKExPQ0FMX0FTU0VUX0RJUikKQEAgLTE4Nyw5MCArMjIxLDE1NyBAQAogJChMT0NBTF9JTlRFUk1FRElBVEVfVEFSR0VUUyk6IFBSSVZBVEVfUFJPVE9fU09VUkNFX0lOVEVSTUVESUFURVNfRElSIDo9ICQoaW50ZXJtZWRpYXRlcy5DT01NT04pL3Byb3RvCiAkKExPQ0FMX0lOVEVSTUVESUFURV9UQVJHRVRTKTogUFJJVkFURV9IQVNfUlNfU09VUkNFUyA6PQogJChMT0NBTF9JTlRFUk1FRElBVEVfVEFSR0VUUyk6IFBSSVZBVEVfSkFWQV9TT1VSQ0VTIDo9ICQoYWxsX2phdmFfc291cmNlcykKKyQoTE9DQUxfSU5URVJNRURJQVRFX1RBUkdFVFMpOiBQUklWQVRFX0pBVkFfU09VUkNFX0xJU1QgOj0gJChqYXZhX3NvdXJjZV9saXN0X2ZpbGUpCiAKICQoTE9DQUxfSU5URVJNRURJQVRFX1RBUkdFVFMpOiBQUklWQVRFX1JNVFlQRURFRlMgOj0gJChMT0NBTF9STVRZUEVERUZTKQogCi0jIGZ1bGxfamF2YV9saWJzOiBUaGUgbGlzdCBvZiBmaWxlcyB0aGF0IHNob3VsZCBiZSB1c2VkIGFzIHRoZSBjbGFzc3BhdGguCi0jICAgICAgICAgICAgICAgICBVc2luZyB0aGlzIGxpc3QgYXMgYSBkZXBlbmRlbmN5IGxpc3QgV0lMTCBOT1QgV09SSy4KLSMgZnVsbF9qYXZhX2xpYl9kZXBzOiBTaG91bGQgYmUgc3BlY2lmaWVkIGFzIGEgcHJlcmVxdWlzaXRlIG9mIHRoaXMgbW9kdWxlCi0jICAgICAgICAgICAgICAgICB0byBndWFyYW50ZWUgdGhhdCB0aGUgZmlsZXMgaW4gZnVsbF9qYXZhX2xpYnMgd2lsbAotIyAgICAgICAgICAgICAgICAgYmUgdXAtdG8tZGF0ZS4KK2Z1bGxfamF2YV9ib290Y2xhc3NwYXRoX2xpYnMgOj0KK2VtcHR5X2Jvb3RjbGFzc3BhdGggOj0KK215X3N5c3RlbV9tb2R1bGVzIDo9CisKIGlmbmRlZiBMT0NBTF9JU19IT1NUX01PRFVMRQotaWZlcSAoJChMT0NBTF9TREtfVkVSU0lPTiksKQotaWZlcSAoJChMT0NBTF9OT19TVEFOREFSRF9MSUJSQVJJRVMpLHRydWUpCi0jIE5vIGJvb3RjbGFzc3BhdGguIEJ1dCB3ZSBzdGlsbCBuZWVkICIiIHRvIHByZXZlbnQgamF2YWMgZnJvbSB1c2luZyBkZWZhdWx0IGhvc3QgYm9vdGNsYXNzcGF0aC4KLW15X2Jvb3RjbGFzc3BhdGggOj0gIiIKLWVsc2UgICMgTE9DQUxfTk9fU1RBTkRBUkRfTElCUkFSSUVTCi1teV9ib290Y2xhc3NwYXRoIDo9ICQoY2FsbCBqYXZhLWxpYi1maWxlcyxjb3JlLW9qKTokKGNhbGwgamF2YS1saWItZmlsZXMsY29yZS1saWJhcnQpCi1lbmRpZiAgIyBMT0NBTF9OT19TVEFOREFSRF9MSUJSQVJJRVMKLWVsc2UKLWlmZXEgKCQoTE9DQUxfU0RLX1ZFUlNJT04pJChUQVJHRVRfQlVJTERfQVBQUyksY3VycmVudCkKLSMgTE9DQUxfU0RLX1ZFUlNJT04gaXMgY3VycmVudCBhbmQgbm8gVEFSR0VUX0JVSUxEX0FQUFMuCi1teV9ib290Y2xhc3NwYXRoIDo9ICQoY2FsbCBqYXZhLWxpYi1maWxlcyxhbmRyb2lkX3N0dWJzX2N1cnJlbnQpCi1lbHNlIGlmZXEgKCQoTE9DQUxfU0RLX1ZFUlNJT04pJChUQVJHRVRfQlVJTERfQVBQUyksc3lzdGVtX2N1cnJlbnQpCi1teV9ib290Y2xhc3NwYXRoIDo9ICQoY2FsbCBqYXZhLWxpYi1maWxlcyxhbmRyb2lkX3N5c3RlbV9zdHVic19jdXJyZW50KQotZWxzZSBpZmVxICgkKExPQ0FMX1NES19WRVJTSU9OKSQoVEFSR0VUX0JVSUxEX0FQUFMpLHRlc3RfY3VycmVudCkKLW15X2Jvb3RjbGFzc3BhdGggOj0gJChjYWxsIGphdmEtbGliLWZpbGVzLGFuZHJvaWRfdGVzdF9zdHVic19jdXJyZW50KQotZWxzZQotbXlfYm9vdGNsYXNzcGF0aCA6PSAkKGNhbGwgamF2YS1saWItZmlsZXMsc2RrX3YkKExPQ0FMX1NES19WRVJTSU9OKSkKLWVuZGlmICMgY3VycmVudCwgc3lzdGVtX2N1cnJlbnQsIG9yIHRlc3RfY3VycmVudAotZW5kaWYgIyBMT0NBTF9TREtfVkVSU0lPTgotJChMT0NBTF9JTlRFUk1FRElBVEVfVEFSR0VUUyk6IFBSSVZBVEVfQk9PVENMQVNTUEFUSCA6PSAtYm9vdGNsYXNzcGF0aCAkKG15X2Jvb3RjbGFzc3BhdGgpCisgIGlmZXEgKCQoTE9DQUxfU0RLX1ZFUlNJT04pLCkKKyAgICBpZmVxICgkKExPQ0FMX05PX1NUQU5EQVJEX0xJQlJBUklFUyksdHJ1ZSkKKyAgICAgICMgTm8gYm9vdGNsYXNzcGF0aC4gQnV0IHdlIHN0aWxsIG5lZWQgIiIgdG8gcHJldmVudCBqYXZhYyBmcm9tIHVzaW5nIGRlZmF1bHQgaG9zdCBib290Y2xhc3NwYXRoLgorICAgICAgZW1wdHlfYm9vdGNsYXNzcGF0aCA6PSAiIgorICAgICAgIyBNb3N0IHVzZXJzIG9mIExPQ0FMX05PX1NUQU5EQVJEX0xJQlJBUklFUyByZWFsbHkgbWVhbiBubyBmcmFtZXdvcmsgbGlicywKKyAgICAgICMgYW5kIG1hbnVhbGx5IGFkZCBiYWNrIHRoZSBjb3JlIGxpYnMuICBUaGUgb25lcyB0aGF0IGRvbid0IGFyZSBpbiBzb29uZworICAgICAgIyBub3csIHNvIGp1c3QgYWx3YXlzIGFzc3VtZSB0aGF0IHRoZXkgd2FudCB0aGUgZGVmYXVsdCBzeXN0ZW0gbW9kdWxlcworICAgICAgbXlfc3lzdGVtX21vZHVsZXMgOj0gJChERUZBVUxUX1NZU1RFTV9NT0RVTEVTKQorICAgIGVsc2UgICMgTE9DQUxfTk9fU1RBTkRBUkRfTElCUkFSSUVTCisgICAgICBmdWxsX2phdmFfYm9vdGNsYXNzcGF0aF9saWJzIDo9ICQoY2FsbCBqYXZhLWxpYi1oZWFkZXItZmlsZXMsJChUQVJHRVRfREVGQVVMVF9CT09UQ0xBU1NQQVRIX0xJQlJBUklFUykgJChUQVJHRVRfREVGQVVMVF9KQVZBX0xJQlJBUklFUykpCisgICAgICBMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSAkKGZpbHRlci1vdXQgJChUQVJHRVRfREVGQVVMVF9CT09UQ0xBU1NQQVRIX0xJQlJBUklFUykgJChUQVJHRVRfREVGQVVMVF9KQVZBX0xJQlJBUklFUyksJChMT0NBTF9KQVZBX0xJQlJBUklFUykpCisgICAgICBteV9zeXN0ZW1fbW9kdWxlcyA6PSAkKERFRkFVTFRfU1lTVEVNX01PRFVMRVMpCisgICAgZW5kaWYgICMgTE9DQUxfTk9fU1RBTkRBUkRfTElCUkFSSUVTCisgIGVsc2UKKyAgICBpZmVxICgkKExPQ0FMX05PX1NUQU5EQVJEX0xJQlJBUklFUyksdHJ1ZSkKKyAgICAgICQoY2FsbCBwcmV0dHktZXJyb3IsTXVzdCBub3QgZGVmaW5lIGJvdGggTE9DQUxfTk9fU1RBTkRBUkRfTElCUkFSSUVTIGFuZCBMT0NBTF9TREtfVkVSU0lPTikKKyAgICBlbmRpZgorICAgIGlmZXEgKCQoc3RyaXAgJChmaWx0ZXIgJChMT0NBTF9TREtfVkVSU0lPTiksJChUQVJHRVRfQVZBSUxBQkxFX1NES19WRVJTSU9OUykpKSwpCisgICAgICAkKGNhbGwgcHJldHR5LWVycm9yLEludmFsaWQgTE9DQUxfU0RLX1ZFUlNJT04gJyQoTE9DQUxfU0RLX1ZFUlNJT04pJyBcCisgICAgICAgICAgICAgQ2hvaWNlcyBhcmU6ICQoVEFSR0VUX0FWQUlMQUJMRV9TREtfVkVSU0lPTlMpKQorICAgIGVuZGlmCisgICAgaWZlcSAoJChMT0NBTF9TREtfVkVSU0lPTikkKFRBUkdFVF9CVUlMRF9BUFBTKSxjdXJyZW50KQorICAgICAgIyBMT0NBTF9TREtfVkVSU0lPTiBpcyBjdXJyZW50IGFuZCBubyBUQVJHRVRfQlVJTERfQVBQUy4KKyAgICAgIGZ1bGxfamF2YV9ib290Y2xhc3NwYXRoX2xpYnMgOj0gJChjYWxsIGphdmEtbGliLWhlYWRlci1maWxlcyxhbmRyb2lkX3N0dWJzX2N1cnJlbnQpCisgICAgZWxzZSBpZmVxICgkKExPQ0FMX1NES19WRVJTSU9OKSQoVEFSR0VUX0JVSUxEX0FQUFMpLHN5c3RlbV9jdXJyZW50KQorICAgICAgZnVsbF9qYXZhX2Jvb3RjbGFzc3BhdGhfbGlicyA6PSAkKGNhbGwgamF2YS1saWItaGVhZGVyLWZpbGVzLGFuZHJvaWRfc3lzdGVtX3N0dWJzX2N1cnJlbnQpCisgICAgZWxzZSBpZmVxICgkKExPQ0FMX1NES19WRVJTSU9OKSQoVEFSR0VUX0JVSUxEX0FQUFMpLHRlc3RfY3VycmVudCkKKyAgICAgIGZ1bGxfamF2YV9ib290Y2xhc3NwYXRoX2xpYnMgOj0gJChjYWxsIGphdmEtbGliLWhlYWRlci1maWxlcyxhbmRyb2lkX3Rlc3Rfc3R1YnNfY3VycmVudCkKKyAgICBlbHNlIGlmZXEgKCQoTE9DQUxfU0RLX1ZFUlNJT04pJChUQVJHRVRfQlVJTERfQVBQUyksY29yZV9jdXJyZW50KQorICAgICAgZnVsbF9qYXZhX2Jvb3RjbGFzc3BhdGhfbGlicyA6PSAkKGNhbGwgamF2YS1saWItaGVhZGVyLWZpbGVzLGNvcmUuY3VycmVudC5zdHVicykKKyAgICBlbHNlCisgICAgICAjIGNvcmVfPHZlcj4gaXMgc3Vic2V0IG9mIDx2ZXI+LiBJbnN0ZWFkIG9mIGRlZmluaW5nIGEgcHJlYnVpbHQgbGliIGZvciBjb3JlXzx2ZXI+LAorICAgICAgIyB1c2UgdGhlIHN0dWIgZm9yIDx2ZXI+IHdoZW4gYnVpbGRpbmcgZm9yIGFwcHMuCisgICAgICBfdmVyc2lvbiA6PSAkKHBhdHN1YnN0IGNvcmVfJSwlLCQoTE9DQUxfU0RLX1ZFUlNJT04pKQorICAgICAgZnVsbF9qYXZhX2Jvb3RjbGFzc3BhdGhfbGlicyA6PSAkKGNhbGwgamF2YS1saWItaGVhZGVyLWZpbGVzLHNka192JChfdmVyc2lvbikpCisgICAgICBfdmVyc2lvbiA6PQorICAgIGVuZGlmICMgY3VycmVudCwgc3lzdGVtX2N1cnJlbnQsIHN5c3RlbV8ke1ZFUn0sIHRlc3RfY3VycmVudCBvciBjb3JlX2N1cnJlbnQKKyAgZW5kaWYgIyBMT0NBTF9TREtfVkVSU0lPTgogCi0jIEluIG9yZGVyIHRvIGNvbXBpbGUgbGFtYmRhIGNvZGUgamF2YWMgcmVxdWlyZXMgdmFyaW91cyBpbnZva2VkeW5hbWljLQotIyByZWxhdGVkIGNsYXNzZXMgdG8gYmUgcHJlc2VudC4gVGhpcyBjaGFuZ2UgYWRkcyBzdHVicyBuZWVkZWQgZm9yCi0jIGphdmFjIHRvIGNvbXBpbGUgbGFtYmRhcy4KLW15X2FkZGl0aW9uYWxfamF2YWNfbGlicyA6PQotaWZuZGVmIFRBUkdFVF9CVUlMRF9BUFBTCi0jIFRPRE86IHN1cHBvcnQgdG8gYnVpbGQgbGFtZGJhcyB1c2luZyBqYXZhYyBpbiB1bmJ1bmRsZWQgYnVpbGQuCi0jIFdlIG1heSBuZWVkIHRvIGNoZWNrIGluIGEgcHJlYnVpbHQgY29yZS1sYW1iZGEtc3R1YnMgdG8gcHJlYnVpbHRzL3Nkay4KLWlmbmVxICgkKExPQ0FMX05PX1NUQU5EQVJEX0xJQlJBUklFUyksdHJ1ZSkKLW15X2FkZGl0aW9uYWxfamF2YWNfbGlicyA6PSBjb3JlLWxhbWJkYS1zdHVicwotZW5kaWYKLWVuZGlmCisgIGlmbmVxICgkKExPQ0FMX05PX1NUQU5EQVJEX0xJQlJBUklFUyksdHJ1ZSkKKyAgICBpZm5lcSAoJChMT0NBTF9NT0RVTEUpLGphY29jb2FnZW50KQorICAgICAgaWZlcSAoJChFTU1BX0lOU1RSVU1FTlQpLHRydWUpCisgICAgICAgIGlmbmVxICgkKEVNTUFfSU5TVFJVTUVOVF9TVEFUSUMpLHRydWUpCisgICAgICAgICAgIyBGb3IgaW5zdHJ1bWVudGVkIGJ1aWxkLCBpZiBKYWNvY28gaXMgbm90IGJlaW5nIGluY2x1ZGVkIHN0YXRpY2FsbHkKKyAgICAgICAgICAjIGluIGluc3RydW1lbnRlZCBwYWNrYWdlcyB0aGVuIGluY2x1ZGUgSmFjb2NvIGNsYXNzZXMgaW50byB0aGUKKyAgICAgICAgICAjIGJvb3RjbGFzc3BhdGguCisgICAgICAgICAgZnVsbF9qYXZhX2Jvb3RjbGFzc3BhdGhfbGlicyArPSAkKGNhbGwgamF2YS1saWItaGVhZGVyLWZpbGVzLGphY29jb2FnZW50KQorICAgICAgICBlbmRpZiAjIEVNTUFfSU5TVFJVTUVOVF9TVEFUSUMKKyAgICAgIGVuZGlmICMgRU1NQV9JTlNUUlVNRU5UCisgICAgZW5kaWYgIyBMT0NBTF9NT0RVTEUgPT0gamFjb2NvYWdlbnQKKyAgZW5kaWYgIyBMT0NBTF9OT19TVEFOREFSRF9MSUJSQVJJRVMKIAotZnVsbF9zaGFyZWRfamF2YV9saWJzIDo9ICQoY2FsbCBqYXZhLWxpYi1maWxlcywkKExPQ0FMX0pBVkFfTElCUkFSSUVTKSAkKG15X2FkZGl0aW9uYWxfamF2YWNfbGlicyksJChMT0NBTF9JU19IT1NUX01PRFVMRSkpCi1mdWxsX2phdmFfbGliX2RlcHMgOj0gJChjYWxsIGphdmEtbGliLWRlcHMsJChMT0NBTF9KQVZBX0xJQlJBUklFUykgJChteV9hZGRpdGlvbmFsX2phdmFjX2xpYnMpLCQoTE9DQUxfSVNfSE9TVF9NT0RVTEUpKQotZnVsbF9qYXZhX2xpYl9kZXBzIDo9ICQoYWRkc3VmZml4IC50b2MsICQoZnVsbF9qYXZhX2xpYl9kZXBzKSkKKyAgIyBJbiBvcmRlciB0byBjb21waWxlIGxhbWJkYSBjb2RlIGphdmFjIHJlcXVpcmVzIHZhcmlvdXMgaW52b2tlZHluYW1pYy0KKyAgIyByZWxhdGVkIGNsYXNzZXMgdG8gYmUgcHJlc2VudC4gVGhpcyBjaGFuZ2UgYWRkcyBzdHVicyBuZWVkZWQgZm9yCisgICMgamF2YWMgdG8gY29tcGlsZSBsYW1iZGFzLgorICBpZm5lcSAoJChMT0NBTF9OT19TVEFOREFSRF9MSUJSQVJJRVMpLHRydWUpCisgICAgaWZkZWYgVEFSR0VUX0JVSUxEX0FQUFMKKyAgICAgIGZ1bGxfamF2YV9ib290Y2xhc3NwYXRoX2xpYnMgKz0gJChjYWxsIGphdmEtbGliLWhlYWRlci1maWxlcyxzZGstY29yZS1sYW1iZGEtc3R1YnMpCisgICAgZWxzZQorICAgICAgZnVsbF9qYXZhX2Jvb3RjbGFzc3BhdGhfbGlicyArPSAkKGNhbGwgamF2YS1saWItaGVhZGVyLWZpbGVzLGNvcmUtbGFtYmRhLXN0dWJzKQorICAgIGVuZGlmCisgIGVuZGlmCisKKyAgZnVsbF9zaGFyZWRfamF2YV9saWJzIDo9ICQoY2FsbCBqYXZhLWxpYi1maWxlcywkKExPQ0FMX0pBVkFfTElCUkFSSUVTKSwkKExPQ0FMX0lTX0hPU1RfTU9EVUxFKSkKKyAgZnVsbF9zaGFyZWRfamF2YV9oZWFkZXJfbGlicyA6PSAkKGNhbGwgamF2YS1saWItaGVhZGVyLWZpbGVzLCQoTE9DQUxfSkFWQV9MSUJSQVJJRVMpLCQoTE9DQUxfSVNfSE9TVF9NT0RVTEUpKQogCiBlbHNlICMgTE9DQUxfSVNfSE9TVF9NT0RVTEUKIAotaWZlcSAoJChVU0VfQ09SRV9MSUJfQk9PVENMQVNTUEFUSCksdHJ1ZSkKLWlmZXEgKCQoTE9DQUxfTk9fU1RBTkRBUkRfTElCUkFSSUVTKSx0cnVlKQotbXlfYm9vdGNsYXNzcGF0aCA6PSAiIgotZWxzZQotbXlfYm9vdGNsYXNzcGF0aCA6PSAkKGNhbGwgbm9ybWFsaXplLXBhdGgtbGlzdCwkKGNhbGwgamF2YS1saWItZmlsZXMsY29yZS1vai1ob3N0ZGV4IGNvcmUtbGliYXJ0LWhvc3RkZXgsdHJ1ZSkpCi1lbmRpZgotJChMT0NBTF9JTlRFUk1FRElBVEVfVEFSR0VUUyk6IFBSSVZBVEVfQk9PVENMQVNTUEFUSCA6PSAtYm9vdGNsYXNzcGF0aCAkKG15X2Jvb3RjbGFzc3BhdGgpCisgIGlmZXEgKCQoVVNFX0NPUkVfTElCX0JPT1RDTEFTU1BBVEgpLHRydWUpCisgICAgaWZlcSAoJChMT0NBTF9OT19TVEFOREFSRF9MSUJSQVJJRVMpLHRydWUpCisgICAgICBlbXB0eV9ib290Y2xhc3NwYXRoIDo9ICIiCisgICAgZWxzZQorICAgICAgZnVsbF9qYXZhX2Jvb3RjbGFzc3BhdGhfbGlicyA6PSAkKGNhbGwgamF2YS1saWItaGVhZGVyLWZpbGVzLCQoYWRkc3VmZml4IC1ob3N0ZGV4LCQoVEFSR0VUX0RFRkFVTFRfQk9PVENMQVNTUEFUSF9MSUJSQVJJRVMpKSx0cnVlKQorICAgIGVuZGlmCiAKLWZ1bGxfc2hhcmVkX2phdmFfbGlicyA6PSAkKGNhbGwgamF2YS1saWItZmlsZXMsJChMT0NBTF9KQVZBX0xJQlJBUklFUyksdHJ1ZSkKLWZ1bGxfamF2YV9saWJfZGVwcyA6PSAkKGZ1bGxfc2hhcmVkX2phdmFfbGlicykKLWVsc2UgIyAhVVNFX0NPUkVfTElCX0JPT1RDTEFTU1BBVEgKLSQoTE9DQUxfSU5URVJNRURJQVRFX1RBUkdFVFMpOiBQUklWQVRFX0JPT1RDTEFTU1BBVEggOj0KLQotZnVsbF9zaGFyZWRfamF2YV9saWJzIDo9ICQoYWRkcHJlZml4ICQoSE9TVF9PVVRfSkFWQV9MSUJSQVJJRVMpLyxcCi0gICAgJChhZGRzdWZmaXggJChDT01NT05fSkFWQV9QQUNLQUdFX1NVRkZJWCksJChMT0NBTF9KQVZBX0xJQlJBUklFUykpKQotZnVsbF9qYXZhX2xpYl9kZXBzIDo9ICQoZnVsbF9zaGFyZWRfamF2YV9saWJzKQotZW5kaWYgIyBVU0VfQ09SRV9MSUJfQk9PVENMQVNTUEFUSAorICAgIG15X3N5c3RlbV9tb2R1bGVzIDo9ICQoREVGQVVMVF9TWVNURU1fTU9EVUxFUykKKyAgICBmdWxsX3NoYXJlZF9qYXZhX2xpYnMgOj0gJChjYWxsIGphdmEtbGliLWZpbGVzLCQoTE9DQUxfSkFWQV9MSUJSQVJJRVMpLHRydWUpCisgICAgZnVsbF9zaGFyZWRfamF2YV9oZWFkZXJfbGlicyA6PSAkKGNhbGwgamF2YS1saWItaGVhZGVyLWZpbGVzLCQoTE9DQUxfSkFWQV9MSUJSQVJJRVMpLHRydWUpCisgIGVsc2UgIyAhVVNFX0NPUkVfTElCX0JPT1RDTEFTU1BBVEgKKyAgICAjIEdpdmUgaG9zdC1zaWRlIHRvb2xzIGEgdmVyc2lvbiBvZiBPcGVuSkRLJ3Mgc3RhbmRhcmQgbGlicmFyaWVzCisgICAgIyBjbG9zZSB0byB3aGF0IHRoZXkncmUgdGFyZ2V0aW5nLiBBcyBvZiBEZWMgMjAxNywgQU9TUCBpcyBvbmx5CisgICAgIyBidW5kbGluZyBPcGVuSkRLIDggYW5kIDksIHNvIG5vdGhpbmcgPCA4IGlzIGF2YWlsYWJsZS4KKyAgICAjCisgICAgIyBXaGVuIGJ1aWxkaW5nIHdpdGggT3BlbkpESyA4LCB0aGUgZm9sbG93aW5nIHNob3VsZCBoYXZlIG5vCisgICAgIyBlZmZlY3Qgc2luY2UgdGhvc2UgamFycyB3b3VsZCBiZSBhdmFpbGFibGUgYnkgZGVmYXVsdC4KKyAgICAjCisgICAgIyBXaGVuIGJ1aWxkaW5nIHdpdGggT3BlbkpESyA5IGJ1dCB0YXJnZXRpbmcgYSB2ZXJzaW9uIDwgMS44LAorICAgICMgcHV0dGluZyB0aGVtIG9uIHRoZSBib290Y2xhc3NwYXRoIG1lYW5zIHRoYXQ6CisgICAgIyBhKSBjb2RlIGNhbid0IChhY2NpZGVudGFsbHkpIHJlZmVyIHRvIE9wZW5KREsgOSBzcGVjaWZpYyBBUElzCisgICAgIyBiKSByZWZlcmVuY2VzIHRvIGV4aXN0aW5nIEFQSXMgYXJlIG5vdCByZWludGVycHJldGVkIGluIGFuCisgICAgIyAgICBPcGVuSkRLIDktc3BlY2lmaWMgd2F5LCBlZy4gY2FsbHMgdG8gc3ViY2xhc3NlcyBvZgorICAgICMgICAgamF2YS5uaW8uQnVmZmVyIGFzIGluIGh0dHA6Ly9iLzcwODYyNTgzCisgICAgaWZlcSAoJChVU0VfSE9TVF9CT09UU1RSQVBfSkFSUyksdHJ1ZSkKKyAgICAgIGZ1bGxfamF2YV9ib290Y2xhc3NwYXRoX2xpYnMgKz0gJChBTkRST0lEX0pBVkE4X0hPTUUpL2pyZS9saWIvamNlLmphcgorICAgICAgZnVsbF9qYXZhX2Jvb3RjbGFzc3BhdGhfbGlicyArPSAkKEFORFJPSURfSkFWQThfSE9NRSkvanJlL2xpYi9ydC5qYXIKKyAgICBlbmRpZgorICAgIGZ1bGxfc2hhcmVkX2phdmFfbGlicyA6PSAkKGFkZHByZWZpeCAkKEhPU1RfT1VUX0pBVkFfTElCUkFSSUVTKS8sXAorICAgICAgJChhZGRzdWZmaXggJChDT01NT05fSkFWQV9QQUNLQUdFX1NVRkZJWCksJChMT0NBTF9KQVZBX0xJQlJBUklFUykpKQorICAgIGZ1bGxfc2hhcmVkX2phdmFfaGVhZGVyX2xpYnMgOj0gJChmdWxsX3NoYXJlZF9qYXZhX2xpYnMpCisgIGVuZGlmICMgVVNFX0NPUkVfTElCX0JPT1RDTEFTU1BBVEgKIGVuZGlmICMgIUxPQ0FMX0lTX0hPU1RfTU9EVUxFCiAKLWZ1bGxfamF2YV9saWJzIDo9ICQoZnVsbF9zaGFyZWRfamF2YV9saWJzKSAkKGZ1bGxfc3RhdGljX2phdmFfbGlicykgJChMT0NBTF9DTEFTU1BBVEgpCi1mdWxsX2phdmFfbGliX2RlcHMgOj0gJChmdWxsX2phdmFfbGliX2RlcHMpICQoZnVsbF9zdGF0aWNfamF2YV9saWJzKSAkKExPQ0FMX0NMQVNTUEFUSCkKK2lmZGVmIGVtcHR5X2Jvb3RjbGFzc3BhdGgKKyAgaWZkZWYgZnVsbF9qYXZhX2Jvb3RjbGFzc3BhdGhfbGlicworICAgICQoY2FsbCBwcmV0dHktZXJyb3IsaW50ZXJuYWwgZXJyb3I6IGVtcHR5X2Jvb3RjbGFzc3BhdGggYW5kIGZ1bGxfamF2YV9ib290Y2xhc3NwYXRoX2xpYnMgc2hvdWxkIG5vdCBib3RoIGJlIHNldCkKKyAgZW5kaWYKK2VuZGlmCisKK2Z1bGxfamF2YV9zeXN0ZW1fbW9kdWxlc19kZXBzIDo9CitteV9zeXN0ZW1fbW9kdWxlc19kaXIgOj0KKyQoTE9DQUxfSU5URVJNRURJQVRFX1RBUkdFVFMpOiBQUklWQVRFX1VTRV9TWVNURU1fTU9EVUxFUyA6PQoraWZlcSAoJChMT0NBTF9KQVZBX0xBTkdVQUdFX1ZFUlNJT04pLDEuOSkKKyAgJChMT0NBTF9JTlRFUk1FRElBVEVfVEFSR0VUUyk6IFBSSVZBVEVfVVNFX1NZU1RFTV9NT0RVTEVTIDo9IHRydWUKKyAgaWZkZWYgbXlfc3lzdGVtX21vZHVsZXMKKyAgICBpZm5lcSAoJChteV9zeXN0ZW1fbW9kdWxlcyksbm9uZSkKKyAgICAgIGlmbmRlZiBTT09OR19TWVNURU1fTU9EVUxFU18kKG15X3N5c3RlbV9tb2R1bGVzKQorICAgICAgICAkKGNhbGwgcHJldHR5LWVycm9yLCBJbnZhbGlkIHN5c3RlbSBtb2R1bGVzICQobXlfc3lzdGVtX21vZHVsZXMpKQorICAgICAgZW5kaWYKKyAgICAgIGZ1bGxfamF2YV9zeXN0ZW1fbW9kdWxlc19kZXBzIDo9ICQoU09PTkdfU1lTVEVNX01PRFVMRVNfJChteV9zeXN0ZW1fbW9kdWxlcykpCisgICAgICBteV9zeXN0ZW1fbW9kdWxlc19kaXIgOj0gJChwYXRzdWJzdCAlL2xpYi9tb2R1bGVzLCUsJChTT09OR19TWVNURU1fTU9EVUxFU18kKG15X3N5c3RlbV9tb2R1bGVzKSkpCisgICAgZW5kaWYKKyAgZW5kaWYKK2VuZGlmCisKKyQoTE9DQUxfSU5URVJNRURJQVRFX1RBUkdFVFMpOiBQUklWQVRFX0JPT1RDTEFTU1BBVEggOj0gJChmdWxsX2phdmFfYm9vdGNsYXNzcGF0aF9saWJzKQorJChMT0NBTF9JTlRFUk1FRElBVEVfVEFSR0VUUyk6IFBSSVZBVEVfRU1QVFlfQk9PVENMQVNTUEFUSCA6PSAkKGVtcHR5X2Jvb3RjbGFzc3BhdGgpCiskKExPQ0FMX0lOVEVSTUVESUFURV9UQVJHRVRTKTogUFJJVkFURV9TWVNURU1fTU9EVUxFUyA6PSAkKG15X3N5c3RlbV9tb2R1bGVzKQorJChMT0NBTF9JTlRFUk1FRElBVEVfVEFSR0VUUyk6IFBSSVZBVEVfU1lTVEVNX01PRFVMRVNfRElSIDo9ICQobXlfc3lzdGVtX21vZHVsZXNfZGlyKQorJChMT0NBTF9JTlRFUk1FRElBVEVfVEFSR0VUUyk6IFBSSVZBVEVfU1lTVEVNX01PRFVMRVNfTElCUyA6PSAkKGNhbGwgamF2YS1saWItZmlsZXMsJChTT09OR19TWVNURU1fTU9EVUxFU19MSUJTXyQobXlfc3lzdGVtX21vZHVsZXMpKSkKKyQoTE9DQUxfSU5URVJNRURJQVRFX1RBUkdFVFMpOiBQUklWQVRFX1BBVENIX01PRFVMRSA6PSAkKExPQ0FMX1BBVENIX01PRFVMRSkKIAogaWZuZGVmIExPQ0FMX0lTX0hPU1RfTU9EVUxFCiAjIFRoaXMgaXMgc2V0IGJ5IHBhY2thZ2VzIHRoYXQgYXJlIGxpbmtpbmcgdG8gb3RoZXIgcGFja2FnZXMgdGhhdCBleHBvcnQKICMgc2hhcmVkIGxpYnJhcmllcywgYWxsb3dpbmcgdGhlbSB0byBtYWtlIHVzZSBvZiB0aGUgY29kZSBpbiB0aGUgbGlua2VkIGFway4KIGFwa19saWJyYXJpZXMgOj0gJChzb3J0ICQoTE9DQUxfQVBLX0xJQlJBUklFUykgJChMT0NBTF9SRVNfTElCUkFSSUVTKSkKIGlmbmVxICgkKGFwa19saWJyYXJpZXMpLCkKLSAgbGlua19hcGtfbGlicmFyaWVzIDo9IFwKLSAgICAgICQoZm9yZWFjaCBsaWIsJChhcGtfbGlicmFyaWVzKSwgXAotICAgICAgICAkKGNhbGwgaW50ZXJtZWRpYXRlcy1kaXItZm9yLCBcCi0gICAgICAgICAgICAgIEFQUFMsJChsaWIpLCxDT01NT04pL2NsYXNzZXMtcHJlLXByb2d1YXJkLmphcikKKyAgbGlua19hcGtfbGlicmFyaWVzIDo9ICQoY2FsbCBhcHAtbGliLWZpbGVzLCQoYXBrX2xpYnJhcmllcykpCisgIGxpbmtfYXBrX2hlYWRlcl9saWJzIDo9ICQoY2FsbCBhcHAtbGliLWhlYWRlci1maWxlcywkKGFwa19saWJyYXJpZXMpKQogCiAgICMgbGluayBhZ2FpbnN0IHRoZSBqYXIgd2l0aCBmdWxsIG9yaWdpbmFsIG5hbWVzIChiZWZvcmUgcHJvZ3VhcmQgcHJvY2Vzc2luZykuCiAgIGZ1bGxfc2hhcmVkX2phdmFfbGlicyArPSAkKGxpbmtfYXBrX2xpYnJhcmllcykKLSAgZnVsbF9qYXZhX2xpYnMgKz0gJChsaW5rX2Fwa19saWJyYXJpZXMpCi0gIGZ1bGxfamF2YV9saWJfZGVwcyArPSAkKGxpbmtfYXBrX2xpYnJhcmllcykKKyAgZnVsbF9zaGFyZWRfamF2YV9oZWFkZXJfbGlicyArPSAkKGxpbmtfYXBrX2hlYWRlcl9saWJzKQogZW5kaWYKIAogIyBUaGlzIGlzIHNldCBieSBwYWNrYWdlcyB0aGF0IGNvbnRhaW4gaW5zdHJ1bWVudGF0aW9uLCBhbGxvd2luZyB0aGVtIHRvCkBAIC0yODcsOCArMzg4LDEzIEBACiAgICAgICBBUFBTLCQoTE9DQUxfSU5TVFJVTUVOVEFUSU9OX0ZPUiksLENPTU1PTikKICAgIyBsaW5rIGFnYWluc3QgdGhlIGphciB3aXRoIGZ1bGwgb3JpZ2luYWwgbmFtZXMgKGJlZm9yZSBwcm9ndWFyZCBwcm9jZXNzaW5nKS4KICAgbGlua19pbnN0cl9jbGFzc2VzX2phciA6PSAkKGxpbmtfaW5zdHJfaW50ZXJtZWRpYXRlc19kaXIuQ09NTU9OKS9jbGFzc2VzLXByZS1wcm9ndWFyZC5qYXIKLSAgZnVsbF9qYXZhX2xpYnMgKz0gJChsaW5rX2luc3RyX2NsYXNzZXNfamFyKQotICBmdWxsX2phdmFfbGliX2RlcHMgKz0gJChsaW5rX2luc3RyX2NsYXNzZXNfamFyKQorICBpZm5lcSAoJChUVVJCSU5FX0VOQUJMRUQpLGZhbHNlKQorICAgIGxpbmtfaW5zdHJfY2xhc3Nlc19oZWFkZXJfamFyIDo9ICQobGlua19pbnN0cl9pbnRlcm1lZGlhdGVzX2Rpci5DT01NT04pL2NsYXNzZXMtaGVhZGVyLmphcgorICBlbHNlCisgICAgbGlua19pbnN0cl9jbGFzc2VzX2hlYWRlcl9qYXIgOj0gJChsaW5rX2luc3RyX2ludGVybWVkaWF0ZXNfZGlyLkNPTU1PTikvY2xhc3Nlcy5qYXIKKyAgZW5kaWYKKyAgZnVsbF9zaGFyZWRfamF2YV9saWJzICs9ICQobGlua19pbnN0cl9jbGFzc2VzX2phcikKKyAgZnVsbF9zaGFyZWRfamF2YV9oZWFkZXJfbGlicyArPSAkKGxpbmtfaW5zdHJfY2xhc3Nlc19oZWFkZXJfamFyKQogZW5kaWYgICMgTE9DQUxfSU5TVFJVTUVOVEFUSU9OX0ZPUgogZW5kaWYgICMgTE9DQUxfSVNfSE9TVF9NT0RVTEUKIApAQCAtMzA1LDEwMCArNDExLDMxIEBACiBlbmRpZgogCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1pZm5kZWYgTE9DQUxfSVNfSE9TVF9NT0RVTEUKLSMjIEFBUFQgRmxhZ3MKLSMgYWFwdCBkb2Vzbid0IGFjY2VwdCBtdWx0aXBsZSAtLWV4dHJhLXBhY2thZ2VzIGZsYWdzLgotIyBXZSBoYXZlIHRvIGNvbGxhcHNlIHRoZW0gaW50byBhIHNpbmdsZSAtLWV4dHJhLXBhY2thZ2VzIGZsYWcgaGVyZS4KLUxPQ0FMX0FBUFRfRkxBR1MgOj0gJChzdHJpcCAkKExPQ0FMX0FBUFRfRkxBR1MpKQotaWZkZWYgTE9DQUxfQUFQVF9GTEFHUwotaWZlcSAoJChmaWx0ZXIgMCAxLCQod29yZHMgJChmaWx0ZXIgLS1leHRyYS1wYWNrYWdlcywkKExPQ0FMX0FBUFRfRkxBR1MpKSkpLCkKLWFhcHRfZmxhZ3MgOj0gJChzdWJzdCAtLWV4dHJhLXBhY2thZ2VzJChzcGFjZSksLS1leHRyYS1wYWNrYWdlc0AsJChMT0NBTF9BQVBUX0ZMQUdTKSkKLWFhcHRfZmxhZ3NfZXh0cmFfcGFja2FnZXMgOj0gJChwYXRzdWJzdCAtLWV4dHJhLXBhY2thZ2VzQCUsJSwkKGZpbHRlciAtLWV4dHJhLXBhY2thZ2VzQCUsJChhYXB0X2ZsYWdzKSkpCi1hYXB0X2ZsYWdzX2V4dHJhX3BhY2thZ2VzIDo9ICQoc29ydCAkKHN1YnN0IDosJChzcGFjZSksJChhYXB0X2ZsYWdzX2V4dHJhX3BhY2thZ2VzKSkpCi1MT0NBTF9BQVBUX0ZMQUdTIDo9ICQoZmlsdGVyLW91dCAtLWV4dHJhLXBhY2thZ2VzQCUsJChhYXB0X2ZsYWdzKSkgXAotICAgIC0tZXh0cmEtcGFja2FnZXMgJChzdWJzdCAkKHNwYWNlKSw6LCQoYWFwdF9mbGFnc19leHRyYV9wYWNrYWdlcykpCi1hYXB0X2ZsYWdzX2V4dHJhX3BhY2thZ2VzIDo9Ci1hYXB0X2ZsYWdzIDo9Ci1lbmRpZgotZW5kaWYKIAotJChMT0NBTF9JTlRFUk1FRElBVEVfVEFSR0VUUyk6IFBSSVZBVEVfQUFQVF9GTEFHUyA6PSAkKExPQ0FMX0FBUFRfRkxBR1MpICQoUFJPRFVDVF9BQVBUX0ZMQUdTKQotJChMT0NBTF9JTlRFUk1FRElBVEVfVEFSR0VUUyk6IFBSSVZBVEVfVEFSR0VUX0FBUFRfQ0hBUkFDVEVSSVNUSUNTIDo9ICQoVEFSR0VUX0FBUFRfQ0hBUkFDVEVSSVNUSUNTKQotJChMT0NBTF9JTlRFUk1FRElBVEVfVEFSR0VUUyk6IFBSSVZBVEVfTUFOSUZFU1RfUEFDS0FHRV9OQU1FIDo9ICQoTE9DQUxfTUFOSUZFU1RfUEFDS0FHRV9OQU1FKQotJChMT0NBTF9JTlRFUk1FRElBVEVfVEFSR0VUUyk6IFBSSVZBVEVfTUFOSUZFU1RfSU5TVFJVTUVOVEFUSU9OX0ZPUiA6PSAkKExPQ0FMX01BTklGRVNUX0lOU1RSVU1FTlRBVElPTl9GT1IpCi0KLWlmZGVmIGFpZGxfc291cmNlcwotQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5BSURMX0ZJTEVTIDo9ICQoYWlkbF9zb3VyY2VzKQotZW5kaWYKLWlmZGVmIHJlbmRlcnNjcmlwdF9zb3VyY2VzCi1BTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLlJTX0ZJTEVTIDo9ICQocmVuZGVyc2NyaXB0X3NvdXJjZXNfZnVsbHBhdGgpCi1lbmRpZgotZW5kaWYgICMgIUxPQ0FMX0lTX0hPU1RfTU9EVUxFCitmdWxsX2phdmFfbGlicyA6PSAkKGZ1bGxfc2hhcmVkX2phdmFfbGlicykgJChmdWxsX3N0YXRpY19qYXZhX2xpYnMpICQoTE9DQUxfQ0xBU1NQQVRIKQorZnVsbF9qYXZhX2hlYWRlcl9saWJzIDo9ICQoZnVsbF9zaGFyZWRfamF2YV9oZWFkZXJfbGlicykgJChmdWxsX3N0YXRpY19qYXZhX2hlYWRlcl9saWJzKQogCiAkKExPQ0FMX0lOVEVSTUVESUFURV9UQVJHRVRTKTogUFJJVkFURV9BTExfSkFWQV9MSUJSQVJJRVMgOj0gJChmdWxsX2phdmFfbGlicykKKyQoTE9DQUxfSU5URVJNRURJQVRFX1RBUkdFVFMpOiBQUklWQVRFX0FMTF9KQVZBX0hFQURFUl9MSUJSQVJJRVMgOj0gJChmdWxsX2phdmFfaGVhZGVyX2xpYnMpCiskKExPQ0FMX0lOVEVSTUVESUFURV9UQVJHRVRTKTogUFJJVkFURV9TSEFSRURfSkFWQV9IRUFERVJfTElCUkFSSUVTIDo9ICQoZnVsbF9zaGFyZWRfamF2YV9oZWFkZXJfbGlicykKIAogQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5JTlRFUk1FRElBVEVfU09VUkNFX0RJUiA6PSBcCiAgICAgJChBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLklOVEVSTUVESUFURV9TT1VSQ0VfRElSKSAkKExPQ0FMX0lOVEVSTUVESUFURV9TT1VSQ0VfRElSKQogCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBKQUNLCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotaWZkZWYgTE9DQUxfSkFDS19FTkFCTEVECi1pZmRlZiBuZWVkX2NvbXBpbGVfamF2YQogCi1MT0NBTF9KQUNLX0ZMQUdTICs9IC1EIGphY2suamF2YS5zb3VyY2UudmVyc2lvbj0kKExPQ0FMX0pBVkFfTEFOR1VBR0VfVkVSU0lPTikKLQotZnVsbF9zdGF0aWNfamFja19saWJzIDo9IFwKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQ29weSBOT1RJQ0UgZmlsZXMgb2YgdHJhbnNpdGl2ZSBzdGF0aWMgZGVwZW5kZW5jaWVzCisjIERvbid0IGRvIHRoaXMgaW4gbW0sIHNpbmNlIG1hbnkgb2YgdGhlIHRhcmdldHMgd29uJ3QgZXhpc3QuCitpZmVxICgkKE9ORV9TSE9UX01BS0VGSUxFKSwpCitpbnN0YWxsZWRfc3RhdGljX2xpYnJhcnlfbm90aWNlX2ZpbGVfdGFyZ2V0cyA6PSBcCiAgICAgJChmb3JlYWNoIGxpYiwkKExPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyksIFwKLSAgICAgICQoY2FsbCBpbnRlcm1lZGlhdGVzLWRpci1mb3IsIFwKLSAgICAgICAgSkFWQV9MSUJSQVJJRVMsJChsaWIpLCQoTE9DQUxfSVNfSE9TVF9NT0RVTEUpLENPTU1PTikvY2xhc3Nlcy5qYWNrKQotCi0kKExPQ0FMX0lOVEVSTUVESUFURV9UQVJHRVRTKTogUFJJVkFURV9TVEFUSUNfSkFDS19MSUJSQVJJRVMgOj0gJChmdWxsX3N0YXRpY19qYWNrX2xpYnMpCi0KLWZ1bGxfc2hhcmVkX2phY2tfbGlicyA6PSAkKGNhbGwgamFjay1saWItZmlsZXMsJChMT0NBTF9KQVZBX0xJQlJBUklFUyksJChMT0NBTF9JU19IT1NUX01PRFVMRSkpCi1mdWxsX2phY2tfZGVwcyA6PSAkKGZ1bGxfc2hhcmVkX2phY2tfbGlicykKLQotaWZuZGVmIExPQ0FMX0lTX0hPU1RfTU9EVUxFCi0jIFR1cm4gb2ZmIC50b2Mgb3B0aW1pemF0aW9uIGZvciBhcHBzIGJ1aWxkIGFzIHdlIGNhbm5vdCBidWlsZCBkZXhkdW1wLgotaWZlcSAoLCQoVEFSR0VUX0JVSUxEX0FQUFMpKQotZnVsbF9qYWNrX2RlcHMgOj0gJChwYXRzdWJzdCAlLmphY2ssICUuZGV4LnRvYywgJChmdWxsX2phY2tfZGVwcykpCi1lbmRpZgotZW5kaWYgIyAhTE9DQUxfSVNfSE9TVF9NT0RVTEUKLWZ1bGxfc2hhcmVkX2phY2tfbGlicyArPSAkKExPQ0FMX0pBQ0tfQ0xBU1NQQVRIKQotZnVsbF9qYWNrX2RlcHMgKz0gJChmdWxsX3N0YXRpY19qYWNrX2xpYnMpICQoTE9DQUxfSkFDS19DTEFTU1BBVEgpCi0KLWlmbmRlZiBMT0NBTF9JU19IT1NUX01PRFVMRQotIyBUaGlzIGlzIHNldCBieSBwYWNrYWdlcyB0aGF0IGFyZSBsaW5raW5nIHRvIG90aGVyIHBhY2thZ2VzIHRoYXQgZXhwb3J0Ci0jIHNoYXJlZCBsaWJyYXJpZXMsIGFsbG93aW5nIHRoZW0gdG8gbWFrZSB1c2Ugb2YgdGhlIGNvZGUgaW4gdGhlIGxpbmtlZCBhcGsuCi1pZm5lcSAoJChhcGtfbGlicmFyaWVzKSwpCi0gIGxpbmtfYXBrX2phY2tfbGlicmFyaWVzIDo9IFwKLSAgICAgICQoZm9yZWFjaCBsaWIsJChhcGtfbGlicmFyaWVzKSwgXAotICAgICAgICAkKGNhbGwgaW50ZXJtZWRpYXRlcy1kaXItZm9yLCBcCi0gICAgICAgICAgICAgIEFQUFMsJChsaWIpLCxDT01NT04pL2NsYXNzZXMuamFjaykKLQotICAjIGxpbmsgYWdhaW5zdCB0aGUgamFyIHdpdGggZnVsbCBvcmlnaW5hbCBuYW1lcyAoYmVmb3JlIHByb2d1YXJkIHByb2Nlc3NpbmcpLgotICBmdWxsX3NoYXJlZF9qYWNrX2xpYnMgKz0gJChsaW5rX2Fwa19qYWNrX2xpYnJhcmllcykKLSAgZnVsbF9qYWNrX2RlcHMgKz0gJChsaW5rX2Fwa19qYWNrX2xpYnJhcmllcykKKyAgICAgIE5PVElDRS0kKGlmICQoTE9DQUxfSVNfSE9TVF9NT0RVTEUpLEhPU1QsVEFSR0VUKS1KQVZBX0xJQlJBUklFUy0kKGxpYikpCitlbHNlCitpbnN0YWxsZWRfc3RhdGljX2xpYnJhcnlfbm90aWNlX2ZpbGVfdGFyZ2V0cyA6PQogZW5kaWYKIAotIyBUaGlzIGlzIHNldCBieSBwYWNrYWdlcyB0aGF0IGNvbnRhaW4gaW5zdHJ1bWVudGF0aW9uLCBhbGxvd2luZyB0aGVtIHRvCi0jIGxpbmsgYWdhaW5zdCB0aGUgcGFja2FnZSB0aGV5IGFyZSBpbnN0cnVtZW50aW5nLiAgQ3VycmVudGx5IG9ubHkgb25lIHN1Y2gKLSMgcGFja2FnZSBpcyBhbGxvd2VkLgotaWZkZWYgTE9DQUxfSU5TVFJVTUVOVEFUSU9OX0ZPUgotICAgIyBsaW5rIGFnYWluc3QgdGhlIGphciB3aXRoIGZ1bGwgb3JpZ2luYWwgbmFtZXMgKGJlZm9yZSBwcm9ndWFyZCBwcm9jZXNzaW5nKS4KLSAgIGxpbmtfaW5zdHJfY2xhc3Nlc19qYWNrIDo9ICQobGlua19pbnN0cl9pbnRlcm1lZGlhdGVzX2Rpci5DT01NT04pL2NsYXNzZXMubm9zaHJvYi5qYWNrCi0gICBmdWxsX3NoYXJlZF9qYWNrX2xpYnMgKz0gJChsaW5rX2luc3RyX2NsYXNzZXNfamFjaykKLSAgIGZ1bGxfamFja19kZXBzICs9ICQobGlua19pbnN0cl9jbGFzc2VzX2phY2spCi1lbmRpZiAgIyBMT0NBTF9JTlNUUlVNRU5UQVRJT05fRk9SCi1lbmRpZiAgIyAhTE9DQUxfSVNfSE9TVF9NT0RVTEUKLQotIyBQcm9wYWdhdGUgbG9jYWwgY29uZmlndXJhdGlvbiBvcHRpb25zIHRvIHRoaXMgdGFyZ2V0LgotJChMT0NBTF9JTlRFUk1FRElBVEVfVEFSR0VUUyk6IFBSSVZBVEVfSkFDS19TSEFSRURfTElCUkFSSUVTOj0gJChmdWxsX3NoYXJlZF9qYWNrX2xpYnMpCi0kKExPQ0FMX0lOVEVSTUVESUFURV9UQVJHRVRTKTogUFJJVkFURV9KQVJKQVJfUlVMRVMgOj0gJChMT0NBTF9KQVJKQVJfUlVMRVMpCi0KLWVuZGlmICAjIG5lZWRfY29tcGlsZV9qYXZhCi1lbmRpZiAjIExPQ0FMX0pBQ0tfRU5BQkxFRAotCiskKG5vdGljZV90YXJnZXQpOiB8ICQoaW5zdGFsbGVkX3N0YXRpY19saWJyYXJ5X25vdGljZV9maWxlX3RhcmdldHMpCiskKExPQ0FMX0lOU1RBTExFRF9NT0RVTEUpOiB8ICQobm90aWNlX3RhcmdldCkKIAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICMgVmVyaWZ5IHRoYXQgYWxsIGxpYnJhcmllcyBhcmUgc2FmZSB0byB1c2UKQEAgLTQwNiwyMiArNDQzLDUxIEBACiBpZm5kZWYgTE9DQUxfSVNfSE9TVF9NT0RVTEUKIGlmZXEgKCQoTE9DQUxfU0RLX1ZFUlNJT04pLHN5c3RlbV9jdXJyZW50KQogbXlfbGlua190eXBlIDo9IGphdmE6c3lzdGVtCi1teV93YXJuX3R5cGVzIDo9IGphdmE6cGxhdGZvcm0KLW15X2FsbG93ZWRfdHlwZXMgOj0gamF2YTpzZGsgamF2YTpzeXN0ZW0KK215X3dhcm5fdHlwZXMgOj0KK215X2FsbG93ZWRfdHlwZXMgOj0gamF2YTpzZGsgamF2YTpzeXN0ZW0gamF2YTpjb3JlCitlbHNlIGlmbmVxICgsJChjYWxsIGhhcy1zeXN0ZW0tc2RrLXZlcnNpb24sJChMT0NBTF9TREtfVkVSU0lPTikpKQorbXlfbGlua190eXBlIDo9IGphdmE6c3lzdGVtCitteV93YXJuX3R5cGVzIDo9CitteV9hbGxvd2VkX3R5cGVzIDo9IGphdmE6c2RrIGphdmE6c3lzdGVtIGphdmE6Y29yZQorZWxzZSBpZmVxICgkKExPQ0FMX1NES19WRVJTSU9OKSxjb3JlX2N1cnJlbnQpCitteV9saW5rX3R5cGUgOj0gamF2YTpjb3JlCitteV93YXJuX3R5cGVzIDo9CitteV9hbGxvd2VkX3R5cGVzIDo9IGphdmE6Y29yZQogZWxzZSBpZm5lcSAoJChMT0NBTF9TREtfVkVSU0lPTiksKQogbXlfbGlua190eXBlIDo9IGphdmE6c2RrCi1teV93YXJuX3R5cGVzIDo9IGphdmE6c3lzdGVtIGphdmE6cGxhdGZvcm0KLW15X2FsbG93ZWRfdHlwZXMgOj0gamF2YTpzZGsKK215X3dhcm5fdHlwZXMgOj0KK215X2FsbG93ZWRfdHlwZXMgOj0gamF2YTpzZGsgamF2YTpjb3JlCiBlbHNlCiBteV9saW5rX3R5cGUgOj0gamF2YTpwbGF0Zm9ybQogbXlfd2Fybl90eXBlcyA6PQotbXlfYWxsb3dlZF90eXBlcyA6PSBqYXZhOnNkayBqYXZhOnN5c3RlbSBqYXZhOnBsYXRmb3JtCitteV9hbGxvd2VkX3R5cGVzIDo9IGphdmE6c2RrIGphdmE6c3lzdGVtIGphdmE6cGxhdGZvcm0gamF2YTpjb3JlCiBlbmRpZgogCi1teV9saW5rX2RlcHMgOj0gJChhZGRwcmVmaXggSkFWQV9MSUJSQVJJRVM6LCQoTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTKSkKK2lmZGVmIExPQ0FMX0FBUFQyX09OTFkKK215X2xpbmtfdHlwZSArPSBhYXB0Ml9vbmx5CitlbmRpZgoraWZkZWYgTE9DQUxfVVNFX0FBUFQyCitteV9hbGxvd2VkX3R5cGVzICs9IGFhcHQyX29ubHkKK2VuZGlmCisKK215X2xpbmtfZGVwcyA6PSAkKGFkZHByZWZpeCBKQVZBX0xJQlJBUklFUzosJChMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMpICQoTE9DQUxfSkFWQV9MSUJSQVJJRVMpKQogbXlfbGlua19kZXBzICs9ICQoYWRkcHJlZml4IEFQUFM6LCQoYXBrX2xpYnJhcmllcykpCiAKIG15XzJuZF9hcmNoX3ByZWZpeCA6PSAkKExPQ0FMXzJORF9BUkNIX1ZBUl9QUkVGSVgpCiBteV9jb21tb24gOj0gQ09NTU9OCiBpbmNsdWRlICQoQlVJTERfU1lTVEVNKS9saW5rX3R5cGUubWsKIGVuZGlmICAjICFMT0NBTF9JU19IT1NUX01PRFVMRQorCitpZm5lcSAoJChMT0NBTF9NT0RVTEVfTUFLRUZJTEUpLCQoU09PTkdfQU5EUk9JRF9NSykpCisKK1NPT05HX0NPTlYuJChMT0NBTF9NT0RVTEUpLlBST0JMRU1TIDo9IFwKKyAgICAkKFNPT05HX0NPTlYuJChMT0NBTF9NT0RVTEUpLlBST0JMRU1TKSAkKG15X3Nvb25nX3Byb2JsZW1zKQorU09PTkdfQ09OVi4kKExPQ0FMX01PRFVMRSkuREVQUyA6PSBcCisgICAgJChTT09OR19DT05WLiQoTE9DQUxfTU9EVUxFKS5ERVBTKSBcCisgICAgJChMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMpIFwKKyAgICAkKExPQ0FMX0pBVkFfTElCUkFSSUVTKSBcCisgICAgJChMT0NBTF9KTklfU0hBUkVEX0xJQlJBUklFUykKK1NPT05HX0NPTlYuJChMT0NBTF9NT0RVTEUpLlRZUEUgOj0gamF2YQorU09PTkdfQ09OViA6PSAkKFNPT05HX0NPTlYpICQoTE9DQUxfTU9EVUxFKQorCitlbmRpZgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhX2xpYnJhcnkubWsgYi9jb3JlL2phdmFfbGlicmFyeS5tawppbmRleCA4NGY0NDE5Li4xYjkxNGY1IDEwMDY0NAotLS0gYS9jb3JlL2phdmFfbGlicmFyeS5taworKysgYi9jb3JlL2phdmFfbGlicmFyeS5tawpAQCAtMjUsMjEgKzI1LDggQEAKIAogTE9DQUxfQlVJTFRfTU9EVUxFX1NURU0gOj0gamF2YWxpYi5qYXIKIAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1pbmNsdWRlICQoQlVJTERfU1lTVEVNKS9jb25maWd1cmVfbG9jYWxfamFjay5tawotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLWlmZGVmIExPQ0FMX0pBQ0tfRU5BQkxFRAotaWZkZWYgTE9DQUxfSVNfU1RBVElDX0pBVkFfTElCUkFSWQotTE9DQUxfQlVJTFRfTU9EVUxFX1NURU0gOj0gY2xhc3Nlcy5qYWNrCi1lbmRpZgotZW5kaWYKLQotIyBGb3Igbm9uLXN0YXRpYyBqYXZhIGxpYnJhcmllcywgb3RoZXIgbW9kdWxlcyBzaG91bGQgZGVwZW5kIG9uCi0jIG91dC90YXJnZXQvY29tbW9uL29iai9KQVZBX0xJQlJBUklFUy8uLi4vamF2YWxpYi5qYXIgKGZvciBqYWNrKQotIyBvciBvdXQvdGFyZ2V0L2NvbW1vbi9vYmovSkFWQV9MSUJSQVJJRVMvLi4uL2NsYXNzZXMuamFyIChmb3IgamF2YWMpLgotIyBGb3Igc3RhdGljIGphdmEgbGlicmFyaWVzLCBvdGhlciBtb2R1bGVzIHNob3VsZCBkZXBlbmQgb24KLSMgb3V0L3RhcmdldC9jb21tb24vb2JqL0pBVkFfTElCUkFSSUVTLy4uLi9jbGFzc2VzLmphcgorIyBGb3IgamF2YSBsaWJyYXJpZXMsIG90aGVyIG1vZHVsZXMgc2hvdWxkIGRlcGVuZCBvbgorIyBvdXQvdGFyZ2V0L2NvbW1vbi9vYmovSkFWQV9MSUJSQVJJRVMvLi4uL2NsYXNzZXMuamFyLgogIyBUaGVyZSBhcmUgc29tZSBkZXBlbmRlbmNpZXMgb3V0c2lkZSB0aGUgYnVpbGQgc3lzdGVtIHRoYXQgYXNzdW1lIHN0YXRpYwogIyBqYXZhIGxpYnJhcmllcyBwcm9kdWNlIGphdmFsaWIuamFyLCBzbyB3ZSB3aWxsIGNvcHkgY2xhc3Nlcy5qYXIgdGhlcmUgdG9vLgogaW50ZXJtZWRpYXRlcy5DT01NT04gOj0gJChjYWxsIGxvY2FsLWludGVybWVkaWF0ZXMtZGlyLENPTU1PTikKQEAgLTU1LDYgKzQyLDggQEAKIGlmZXEgKHRydWUsJChMT0NBTF9FTU1BX0lOU1RSVU1FTlQpKQogaWZlcSAodHJ1ZSwkKEVNTUFfSU5TVFJVTUVOVF9TVEFUSUMpKQogTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTICs9IGphY29jb2FnZW50CisjIEV4Y2x1ZGUgamFjb2NvIGNsYXNzZXMgZnJvbSBwcm9ndWFyZAorTE9DQUxfUFJPR1VBUkRfRkxBR1MgKz0gLWluY2x1ZGUgJChCVUlMRF9TWVNURU0pL3Byb2d1YXJkLmphY29jby5mbGFncwogZW5kaWYgIyBMT0NBTF9FTU1BX0lOU1RSVU1FTlQKIGVuZGlmICMgRU1NQV9JTlNUUlVNRU5UX1NUQVRJQwogZWxzZQpAQCAtNjgsMzEgKzU3LDI3IEBACiBpZmVxICgkKExPQ0FMX0lTX1NUQVRJQ19KQVZBX0xJQlJBUlkpLHRydWUpCiAjIFRoZXJlIGFyZSBzb21lIGRlcGVuZGVuY2llcyBvdXRzaWRlIHRoZSBidWlsZCBzeXN0ZW0gdGhhdCBhc3N1bWUgY2xhc3Nlcy5qYXIKICMgaXMgYXZhaWxhYmxlIGFzIGphdmFsaWIuamFyIHNvIGNvcHkgaXQgdGhlcmUgdG9vLgotJChldmFsICQoY2FsbCBjb3B5LW9uZS1maWxlLCQoZnVsbF9jbGFzc2VzX2phciksJChjb21tb25famF2YWxpYi5qYXIpKSkKKyQoZXZhbCAkKGNhbGwgY29weS1vbmUtZmlsZSwkKGZ1bGxfY2xhc3Nlc19wcm9ndWFyZF9qYXIpLCQoY29tbW9uX2phdmFsaWIuamFyKSkpCiAKLWlmZGVmIExPQ0FMX0pBQ0tfRU5BQkxFRAotJChldmFsICQoY2FsbCBjb3B5LW9uZS1maWxlLCQoZnVsbF9jbGFzc2VzX2phY2spLCQoTE9DQUxfQlVJTFRfTU9EVUxFKSkpCi1lbHNlCi0kKGV2YWwgJChjYWxsIGNvcHktb25lLWZpbGUsJChmdWxsX2NsYXNzZXNfamFyKSwkKExPQ0FMX0JVSUxUX01PRFVMRSkpKQotZW5kaWYKKyQoZXZhbCAkKGNhbGwgY29weS1vbmUtZmlsZSwkKGZ1bGxfY2xhc3Nlc19wcm9ndWFyZF9qYXIpLCQoTE9DQUxfQlVJTFRfTU9EVUxFKSkpCiAKIGVsc2UgIyAhTE9DQUxfSVNfU1RBVElDX0pBVkFfTElCUkFSWQogCiAkKGNvbW1vbl9qYXZhbGliLmphcik6IFBSSVZBVEVfREVYX0ZJTEUgOj0gJChidWlsdF9kZXgpCiAkKGNvbW1vbl9qYXZhbGliLmphcik6IFBSSVZBVEVfU09VUkNFX0FSQ0hJVkUgOj0gJChmdWxsX2NsYXNzZXNfcHJlX3Byb2d1YXJkX2phcikKICQoY29tbW9uX2phdmFsaWIuamFyKTogUFJJVkFURV9ET05UX0RFTEVURV9KQVJfRElSUyA6PSAkKExPQ0FMX0RPTlRfREVMRVRFX0pBUl9ESVJTKQotJChjb21tb25famF2YWxpYi5qYXIpIDogJChidWlsdF9kZXgpICQoamF2YV9yZXNvdXJjZV9zb3VyY2VzKSB8ICQoWklQVElNRSkKKyQoY29tbW9uX2phdmFsaWIuamFyKSA6ICQoYnVpbHRfZGV4KSAkKGphdmFfcmVzb3VyY2Vfc291cmNlcykgfCAkKFpJUFRJTUUpICQoWklQQUxJR04pCiAJQGVjaG8gInRhcmdldCBKYXI6ICQoUFJJVkFURV9NT0RVTEUpICgkQCkiCi1pZmRlZiBMT0NBTF9KQUNLX0VOQUJMRUQKLQkkKGNyZWF0ZS1lbXB0eS1wYWNrYWdlKQotZWxzZQotCSQoY2FsbCBpbml0aWFsaXplLXBhY2thZ2UtZmlsZSwkKFBSSVZBVEVfU09VUkNFX0FSQ0hJVkUpLCRAKQotZW5kaWYKLQkkKGFkZC1kZXgtdG8tcGFja2FnZSkKLWlmZGVmIExPQ0FMX0pBQ0tfRU5BQkxFRAotCSQoYWRkLWNhcnJpZWQtamFjay1yZXNvdXJjZXMpCi1lbmRpZgotCSQocmVtb3ZlLXRpbWVzdGFtcHMtZnJvbS1wYWNrYWdlKQorCSQoY2FsbCBpbml0aWFsaXplLXBhY2thZ2UtZmlsZSwkKFBSSVZBVEVfU09VUkNFX0FSQ0hJVkUpLCRALnRtcCkKKwkkKGNhbGwgYWRkLWRleC10by1wYWNrYWdlLWFyZywkQC50bXApCisJJChoaWRlKSAkKFpJUFRJTUUpICRALnRtcAorCSQoY2FsbCBjb21taXQtY2hhbmdlLWZvci10b2MsJEApCitpZmVxICh0cnVlLCAkKExPQ0FMX1VOQ09NUFJFU1NfREVYKSkKKwkkKHVuY29tcHJlc3MtZGV4cykKKwkkKGFsaWduLXBhY2thZ2UpCitlbmRpZiAgIyBMT0NBTF9VTkNPTVBSRVNTX0RFWAorCisuS0FUSV9SRVNUQVQ6ICQoY29tbW9uX2phdmFsaWIuamFyKQogCiBpZmRlZiBMT0NBTF9ERVhfUFJFT1BUCiBpZm5lcSAoJChkZXhwcmVvcHRfYm9vdF9qYXJfbW9kdWxlKSwpICMgYm9vdCBqYXIKQEAgLTEwOCwxMCArOTMsNyBAQAogCUBlY2hvICJEZXhwcmVvcHQgSmFyOiAkKFBSSVZBVEVfTU9EVUxFKSAoJEApIgogCSQoY2FsbCBkZXhwcmVvcHQtb25lLWZpbGUsJDwsJEApCiAKLSQoZXZhbCAkKGNhbGwgY29weS1vbmUtZmlsZSwkKGNvbW1vbl9qYXZhbGliLmphciksJChMT0NBTF9CVUlMVF9NT0RVTEUpKSkKLWlmbmVxIChub3N0cmlwcGluZywkKExPQ0FMX0RFWF9QUkVPUFQpKQotCSQoY2FsbCBkZXhwcmVvcHQtcmVtb3ZlLWNsYXNzZXMuZGV4LCRAKQotZW5kaWYKKyQoZXZhbCAkKGNhbGwgZGV4cHJlb3B0LWNvcHktamFyLCQoY29tbW9uX2phdmFsaWIuamFyKSwkKExPQ0FMX0JVSUxUX01PRFVMRSksJChMT0NBTF9ERVhfUFJFT1BUKSkpCiAKIGVuZGlmICMgISBib290IGphcgogCmRpZmYgLS1naXQgYS9jb3JlL2phdmFfcmVuZGVyc2NyaXB0Lm1rIGIvY29yZS9qYXZhX3JlbmRlcnNjcmlwdC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTFiM2JlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhX3JlbmRlcnNjcmlwdC5tawpAQCAtMCwwICsxLDE1NSBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyBSZW5kZXJzY3JpcHQgc3VwcG9ydCBmb3IgamF2YQorIyMgQWRkcyBydWxlcyB0byBjb252ZXJ0IC5ycyBmaWxlcyB0byAuamF2YSBhbmQgLmJjIGZpbGVzCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworcmVuZGVyc2NyaXB0X3NvdXJjZXMgOj0gJChmaWx0ZXIgJS5ycywkKExPQ0FMX1NSQ19GSUxFUykpCitMT0NBTF9TUkNfRklMRVMgOj0gJChmaWx0ZXItb3V0ICUucnMsJChMT0NBTF9TUkNfRklMRVMpKQorCityc19nZW5lcmF0ZWRfcmVzX3ppcCA6PQorcnNfZ2VuZXJhdGVkX3NyY19qYXIgOj0KK3JzX2NvbXBhdGliaWxpdHlfam5pX2xpYnMgOj0KK2lmbmVxICgkKHJlbmRlcnNjcmlwdF9zb3VyY2VzKSwpCityZW5kZXJzY3JpcHRfc291cmNlc19mdWxscGF0aCA6PSAkKGFkZHByZWZpeCAkKExPQ0FMX1BBVEgpLywgJChyZW5kZXJzY3JpcHRfc291cmNlcykpCityZW5kZXJzY3JpcHRfaW50ZXJtZWRpYXRlLkNPTU1PTiA6PSAkKGludGVybWVkaWF0ZXMuQ09NTU9OKS9yZW5kZXJzY3JpcHQKK3JzX2dlbmVyYXRlZF9yZXNfemlwIDo9ICQocmVuZGVyc2NyaXB0X2ludGVybWVkaWF0ZS5DT01NT04pL3Jlcy56aXAKK3JzX2dlbmVyYXRlZF9zcmNfamFyIDo9ICQocmVuZGVyc2NyaXB0X2ludGVybWVkaWF0ZS5DT01NT04pL3JzLnNyY2phcgorCitMT0NBTF9TUkNKQVJTICs9ICQocnNfZ2VuZXJhdGVkX3NyY19qYXIpCisKKyMgRGVmYXVsdGluZyB0byBhbiBlbXB0eSBzdHJpbmcgdXNlcyB0aGUgbGF0ZXN0IGF2YWlsYWJsZSBwbGF0Zm9ybSBTREsuCityZW5kZXJzY3JpcHRfdGFyZ2V0X2FwaSA6PQorCitpZm5lcSAoLCQoTE9DQUxfUkVOREVSU0NSSVBUX1RBUkdFVF9BUEkpKQorICByZW5kZXJzY3JpcHRfdGFyZ2V0X2FwaSA6PSAkKExPQ0FMX1JFTkRFUlNDUklQVF9UQVJHRVRfQVBJKQorZWxzZQorICBpZm5lcSAoLCQoTE9DQUxfU0RLX1ZFUlNJT04pKQorICAgICMgU2V0IHRhcmdldC1hcGkgZm9yIExPQ0FMX1NES19WRVJTSU9OcyBvdGhlciB0aGFuIGN1cnJlbnQuCisgICAgaWZuZXEgKCwkKGZpbHRlci1vdXQgY3VycmVudCBzeXN0ZW1fY3VycmVudCB0ZXN0X2N1cnJlbnQgY29yZV9jdXJyZW50LCAkKExPQ0FMX1NES19WRVJTSU9OKSkpCisgICAgICByZW5kZXJzY3JpcHRfdGFyZ2V0X2FwaSA6PSAkKGNhbGwgZ2V0LW51bWVyaWMtc2RrLXZlcnNpb24sJChMT0NBTF9TREtfVkVSU0lPTikpCisgICAgZW5kaWYKKyAgZW5kaWYgICMgTE9DQUxfU0RLX1ZFUlNJT04gaXMgc2V0CitlbmRpZiAgIyBMT0NBTF9SRU5ERVJTQ1JJUFRfVEFSR0VUX0FQSSBpcyBzZXQKKworIyBGb3IgNjQtYml0LCB3ZSBhbHdheXMgaGF2ZSB0byB1cGdyYWRlIHRvIGF0IGxlYXN0IDIxIGZvciBjb21wYXQgYnVpbGQuCitpZm5lcSAoJChMT0NBTF9SRU5ERVJTQ1JJUFRfQ09NUEFUSUJJTElUWSksKQorICBpZmVxICgkKFRBUkdFVF9JU182NF9CSVQpLHRydWUpCisgICAgaWZuZXEgKCQoZmlsdGVyICQoUlNDT01QQVRfMzJCSVRfT05MWV9BUElfTEVWRUxTKSwkKHJlbmRlcnNjcmlwdF90YXJnZXRfYXBpKSksKQorICAgICAgcmVuZGVyc2NyaXB0X3RhcmdldF9hcGkgOj0gMjEKKyAgICBlbmRpZgorICBlbmRpZgorZW5kaWYKKworaWZlcSAoJChMT0NBTF9SRU5ERVJTQ1JJUFRfQ0MpLCkKK0xPQ0FMX1JFTkRFUlNDUklQVF9DQyA6PSAkKExMVk1fUlNfQ0MpCitlbmRpZgorCisjIFR1cm4gb24gYWxsIHdhcm5pbmdzIGFuZCB3YXJuaW5ncyBhcyBlcnJvcnMgZm9yIFJTIGNvbXBpbGVzLgorIyBUaGlzIGNhbiBiZSBkaXNhYmxlZCB3aXRoIExPQ0FMX1JFTkRFUlNDUklQVF9GTEFHUyA6PSAtV25vLWVycm9yCityZW5kZXJzY3JpcHRfZmxhZ3MgOj0gLVdhbGwgLVdlcnJvcgorcmVuZGVyc2NyaXB0X2ZsYWdzICs9ICQoTE9DQUxfUkVOREVSU0NSSVBUX0ZMQUdTKQorCisjIHByZXBlbmQgdGhlIFJlbmRlclNjcmlwdCBzeXN0ZW0gaW5jbHVkZSBwYXRoCitpZm5lcSAoJChmaWx0ZXItb3V0IGN1cnJlbnQgc3lzdGVtX2N1cnJlbnQgdGVzdF9jdXJyZW50IGNvcmVfY3VycmVudCwkKExPQ0FMX1NES19WRVJTSU9OKSkkKGlmICQoVEFSR0VUX0JVSUxEX0FQUFMpLCQoZmlsdGVyIGN1cnJlbnQgc3lzdGVtX2N1cnJlbnQgdGVzdF9jdXJyZW50LCQoTE9DQUxfU0RLX1ZFUlNJT04pKSksKQorIyBpZiBhIG51bWVyaWMgTE9DQUxfU0RLX1ZFUlNJT04sIG9yIGN1cnJlbnQgTE9DQUxfU0RLX1ZFUlNJT04gd2l0aCBUQVJHRVRfQlVJTERfQVBQUworTE9DQUxfUkVOREVSU0NSSVBUX0lOQ0xVREVTIDo9IFwKKyAgICAkKEhJU1RPUklDQUxfU0RLX1ZFUlNJT05TX1JPT1QpL3JlbmRlcnNjcmlwdC9jbGFuZy1pbmNsdWRlIFwKKyAgICAkKEhJU1RPUklDQUxfU0RLX1ZFUlNJT05TX1JPT1QpL3JlbmRlcnNjcmlwdC9pbmNsdWRlIFwKKyAgICAkKExPQ0FMX1JFTkRFUlNDUklQVF9JTkNMVURFUykKK2Vsc2UKK0xPQ0FMX1JFTkRFUlNDUklQVF9JTkNMVURFUyA6PSBcCisgICAgJChUT1BESVIpZXh0ZXJuYWwvY2xhbmcvbGliL0hlYWRlcnMgXAorICAgICQoVE9QRElSKWZyYW1ld29ya3MvcnMvc2NyaXB0X2FwaS9pbmNsdWRlIFwKKyAgICAkKExPQ0FMX1JFTkRFUlNDUklQVF9JTkNMVURFUykKK2VuZGlmCisKK2lmbmVxICgkKExPQ0FMX1JFTkRFUlNDUklQVF9JTkNMVURFU19PVkVSUklERSksKQorTE9DQUxfUkVOREVSU0NSSVBUX0lOQ0xVREVTIDo9ICQoTE9DQUxfUkVOREVSU0NSSVBUX0lOQ0xVREVTX09WRVJSSURFKQorZW5kaWYKKworYmNfZmlsZXMgOj0gJChwYXRzdWJzdCAlLnJzLCUuYmMsICQobm90ZGlyICQocmVuZGVyc2NyaXB0X3NvdXJjZXMpKSkKK2JjX2RlcF9maWxlcyA6PSAkKGFkZHByZWZpeCAkKHJlbmRlcnNjcmlwdF9pbnRlcm1lZGlhdGUuQ09NTU9OKS8sJChwYXRzdWJzdCAlLmJjLCUuZCwkKGJjX2ZpbGVzKSkpCisKKyQocnNfZ2VuZXJhdGVkX3NyY19qYXIpOiBQUklWQVRFX1JTX0lOQ0xVREVTIDo9ICQoTE9DQUxfUkVOREVSU0NSSVBUX0lOQ0xVREVTKQorJChyc19nZW5lcmF0ZWRfc3JjX2phcik6IFBSSVZBVEVfUlNfQ0MgOj0gJChMT0NBTF9SRU5ERVJTQ1JJUFRfQ0MpCiskKHJzX2dlbmVyYXRlZF9zcmNfamFyKTogUFJJVkFURV9SU19GTEFHUyA6PSAkKHJlbmRlcnNjcmlwdF9mbGFncykKKyQocnNfZ2VuZXJhdGVkX3NyY19qYXIpOiBQUklWQVRFX1JTX1NPVVJDRV9GSUxFUyA6PSAkKHJlbmRlcnNjcmlwdF9zb3VyY2VzX2Z1bGxwYXRoKQorJChyc19nZW5lcmF0ZWRfc3JjX2phcik6IFBSSVZBVEVfUlNfT1VUUFVUX0RJUiA6PSAkKHJlbmRlcnNjcmlwdF9pbnRlcm1lZGlhdGUuQ09NTU9OKQorJChyc19nZW5lcmF0ZWRfc3JjX2phcik6IFBSSVZBVEVfUlNfVEFSR0VUX0FQSSA6PSAkKHJlbmRlcnNjcmlwdF90YXJnZXRfYXBpKQorJChyc19nZW5lcmF0ZWRfc3JjX2phcik6IFBSSVZBVEVfREVQX0ZJTEVTIDo9ICQoYmNfZGVwX2ZpbGVzKQorJChyc19nZW5lcmF0ZWRfc3JjX2phcik6IFBSSVZBVEVfUlNfT1VUUFVUX1JFU19aSVAgOj0gJChyc19nZW5lcmF0ZWRfcmVzX3ppcCkKKyQocnNfZ2VuZXJhdGVkX3NyY19qYXIpOiAuS0FUSV9JTVBMSUNJVF9PVVRQVVRTIDo9ICQocnNfZ2VuZXJhdGVkX3Jlc196aXApCiskKHJzX2dlbmVyYXRlZF9zcmNfamFyKTogJChyZW5kZXJzY3JpcHRfc291cmNlc19mdWxscGF0aCkgJChMT0NBTF9SRU5ERVJTQ1JJUFRfQ0MpICQoU09PTkdfWklQKQorCSQodHJhbnNmb3JtLXJlbmRlcnNjcmlwdHMtdG8tamF2YS1hbmQtYmMpCisKKyMgaW5jbHVkZSB0aGUgZGVwZW5kZW5jeSBmaWxlcyAoLmQvLlApIGdlbmVyYXRlZCBieSBsbHZtLXJzLWNjLgorJChjYWxsIGluY2x1ZGUtZGVwZmlsZSwkKHJzX2dlbmVyYXRlZF9zcmNfamFyKS5QLCQocnNfZ2VuZXJhdGVkX3NyY19qYXIpKQorCitpZm5lcSAoJChMT0NBTF9SRU5ERVJTQ1JJUFRfQ09NUEFUSUJJTElUWSksKQorCisKK2lmZXEgKCQoZmlsdGVyICQoUlNDT01QQVRfMzJCSVRfT05MWV9BUElfTEVWRUxTKSwkKHJlbmRlcnNjcmlwdF90YXJnZXRfYXBpKSksKQoraWZlcSAoJChUQVJHRVRfSVNfNjRfQklUKSx0cnVlKQorcmVuZGVyc2NyaXB0X2ludGVybWVkaWF0ZS5iY19mb2xkZXIgOj0gJChyZW5kZXJzY3JpcHRfaW50ZXJtZWRpYXRlLkNPTU1PTikvcmVzL3Jhdy9iYzY0LworZWxzZQorcmVuZGVyc2NyaXB0X2ludGVybWVkaWF0ZS5iY19mb2xkZXIgOj0gJChyZW5kZXJzY3JpcHRfaW50ZXJtZWRpYXRlLkNPTU1PTikvcmVzL3Jhdy9iYzMyLworZW5kaWYKK2Vsc2UKK3JlbmRlcnNjcmlwdF9pbnRlcm1lZGlhdGUuYmNfZm9sZGVyIDo9ICQocmVuZGVyc2NyaXB0X2ludGVybWVkaWF0ZS5DT01NT04pL3Jlcy9yYXcvCitlbmRpZgorCityc19nZW5lcmF0ZWRfYmMgOj0gJChhZGRwcmVmaXggXAorICAgICQocmVuZGVyc2NyaXB0X2ludGVybWVkaWF0ZS5iY19mb2xkZXIpLCAkKGJjX2ZpbGVzKSkKKworcmVuZGVyc2NyaXB0X2ludGVybWVkaWF0ZSA6PSAkKGludGVybWVkaWF0ZXMpL3JlbmRlcnNjcmlwdAorCisjIFdlIGRvbid0IG5lZWQgdGhlIC5zbyBmaWxlcyBpbiBidW5kbGVkIGJyYW5jaGVzCisjIFByZXZlbnQgdGhlc2UgZnJvbSBzaG93aW5nIHVwIG9uIHRoZSBkZXZpY2UKKyMgT25lIGV4Y2VwdGlvbiBpcyBsaWJyc2puaS5zbywgd2hpY2ggaXMgbmVlZGVkIGZvcgorIyBib3RoIG5hdGl2ZSBwYXRoIGFuZCBjb21wYXQgcGF0aC4KK3JzX2puaV9saWIgOj0gJChUQVJHRVRfT1VUX0lOVEVSTUVESUFURV9MSUJSQVJJRVMpL2xpYnJzam5pLnNvCitMT0NBTF9KTklfU0hBUkVEX0xJQlJBUklFUyArPSBsaWJyc2puaQorCitpZm5lcSAoLCQoVEFSR0VUX0JVSUxEX0FQUFMpJChGT1JDRV9CVUlMRF9SU19DT01QQVQpKQorCityc19jb21wYXRpYmlsaXR5X2puaV9saWJzIDo9ICQoYWRkcHJlZml4IFwKKyAgICAkKHJlbmRlcnNjcmlwdF9pbnRlcm1lZGlhdGUpL2xpYnJzLiwgXAorICAgICQocGF0c3Vic3QgJS5iYywlLnNvLCAkKGJjX2ZpbGVzKSkpCisKKyQocnNfZ2VuZXJhdGVkX3NyY19qYXIpOiAuS0FUSV9JTVBMSUNJVF9PVVRQVVRTICs9ICQocnNfZ2VuZXJhdGVkX2JjKQorCityc19zdXBwb3J0X2xpYiA6PSAkKFRBUkdFVF9PVVRfSU5URVJNRURJQVRFX0xJQlJBUklFUykvbGliUlNTdXBwb3J0LnNvCitMT0NBTF9KTklfU0hBUkVEX0xJQlJBUklFUyArPSBsaWJSU1N1cHBvcnQKKworcnNfc3VwcG9ydF9pb19saWIgOj0KKyMgY2hlY2sgaWYgdGhlIHRhcmdldCBhcGkgbGV2ZWwgc3VwcG9ydCBVU0FHRV9JTworaWZlcSAoJChmaWx0ZXIgJChSU0NPTVBBVF9OT19VU0FHRUlPX0FQSV9MRVZFTFMpLCQocmVuZGVyc2NyaXB0X3RhcmdldF9hcGkpKSwpCityc19zdXBwb3J0X2lvX2xpYiA6PSAkKFRBUkdFVF9PVVRfSU5URVJNRURJQVRFX0xJQlJBUklFUykvbGliUlNTdXBwb3J0SU8uc28KK0xPQ0FMX0pOSV9TSEFSRURfTElCUkFSSUVTICs9IGxpYlJTU3VwcG9ydElPCitlbmRpZgorCitteV9hcmNoIDo9ICQoVEFSR0VUXyQoTE9DQUxfMk5EX0FSQ0hfVkFSX1BSRUZJWClBUkNIKQoraWZuZXEgKCwkKGZpbHRlciBhcm02NCBtaXBzNjQgeDg2XzY0LCQobXlfYXJjaCkpKQorICBteV9taW5fc2RrX3ZlcnNpb24gOj0gMjEKK2Vsc2UKKyAgbXlfbWluX3Nka192ZXJzaW9uIDo9ICQoTUlOX1NVUFBPUlRFRF9TREtfVkVSU0lPTikKK2VuZGlmCisKKyQocnNfY29tcGF0aWJpbGl0eV9qbmlfbGlicyk6ICQoUlNfUFJFQlVJTFRfQ0xDT1JFKSBcCisgICAgJChyc19zdXBwb3J0X2xpYikgJChyc19zdXBwb3J0X2lvX2xpYikgJChyc19qbmlfbGliKSAkKHJzX2NvbXBpbGVyX3J0KQorJChyc19jb21wYXRpYmlsaXR5X2puaV9saWJzKTogJChCQ0NfQ09NUEFUKQorJChyc19jb21wYXRpYmlsaXR5X2puaV9saWJzKTogUFJJVkFURV9DWFggOj0gJChDWFhfV1JBUFBFUikgJChUQVJHRVRfQ1hYKQorJChyc19jb21wYXRpYmlsaXR5X2puaV9saWJzKTogUFJJVkFURV9TREtfVkVSU0lPTiA6PSAkKG15X21pbl9zZGtfdmVyc2lvbikKKyQocnNfY29tcGF0aWJpbGl0eV9qbmlfbGlicyk6ICQocmVuZGVyc2NyaXB0X2ludGVybWVkaWF0ZSkvbGlicnMuJS5zbzogXAorICAgICQocmVuZGVyc2NyaXB0X2ludGVybWVkaWF0ZS5iY19mb2xkZXIpJS5iYyBcCisgICAgJChTT09OR19PVVRfRElSKS9uZGsudGltZXN0YW1wCisJJCh0cmFuc2Zvcm0tYmMtdG8tc28pCisKK2VuZGlmCisKK2VuZGlmCisKK0xPQ0FMX0lOVEVSTUVESUFURV9UQVJHRVRTICs9ICQocnNfZ2VuZXJhdGVkX3NyY19qYXIpCisjIE1ha2Ugc3VyZSB0aGUgZ2VuZXJhdGVkIHJlc291cmNlIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGFway4KK0xPQ0FMX1JFU09VUkNFX0RJUiA6PSAkKHJlbmRlcnNjcmlwdF9pbnRlcm1lZGlhdGUuQ09NTU9OKS9yZXMgJChMT0NBTF9SRVNPVVJDRV9ESVIpCitlbmRpZgpkaWZmIC0tZ2l0IGEvY29yZS9qZXRpZmllci5tayBiL2NvcmUvamV0aWZpZXIubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNhNDYyNAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamV0aWZpZXIubWsKQEAgLTAsMCArMSwzNCBAQAorIworIyBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworIyBUaGlzIGZpbGUgc2V0cyB1cCB0aGUgcnVubmluZyBvZiBKZXRpZmllcgorCisjIG5vdyBhZGQgdGhlIHJ1bGUgdG8gcnVuIGpldGlmaWVyCitpZmVxICgkKHN0cmlwICQoTE9DQUxfSkVUSUZJRVJfRU5BQkxFRCkpLHRydWUpCisgIG15X2pldGlmaWVyX2lucHV0X3BhdGggOj0gJChMT0NBTF9KRVRJRklFUl9JTlBVVF9GSUxFKQorICBteV9maWxlcyA6PSAkKGludGVybWVkaWF0ZXMuQ09NTU9OKS9qZXRpZmllcgorICBteV9qZXRpZmllcl9vdXRwdXRfcGF0aCA6PSAkKG15X2ZpbGVzKS9qZXRpZmllZC0kKG5vdGRpciAkKG15X2pldGlmaWVyX2lucHV0X3BhdGgpKQorCiskKG15X2pldGlmaWVyX291dHB1dF9wYXRoKSA6ICQobXlfamV0aWZpZXJfaW5wdXRfcGF0aCkgJChKRVRJRklFUikKKwlybSAtcmYgJEAKKwkkKEpFVElGSUVSKSAtb3V0cHV0ZmlsZSAkQCAtaSAkPAorCisgIExPQ0FMX0pFVElGSUVSX09VVFBVVF9GSUxFIDo9ICQobXlfamV0aWZpZXJfb3V0cHV0X3BhdGgpCisgIExPQ0FMX0lOVEVSTUVESUFURV9UQVJHRVRTICs9ICQoTE9DQUxfSkVUSUZJRVJfT1VUUFVUX0ZJTEUpCitlbHNlCisgIExPQ0FMX0pFVElGSUVSX09VVFBVVF9GSUxFIDo9ICQoTE9DQUxfSkVUSUZJRVJfSU5QVVRfRklMRSkKK2VuZGlmCisKZGlmZiAtLWdpdCBhL2NvcmUvbG9jYWxfc3lzdGVtc2RrLm1rIGIvY29yZS9sb2NhbF9zeXN0ZW1zZGsubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDkwODVmZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvbG9jYWxfc3lzdGVtc2RrLm1rCkBAIC0wLDAgKzEsNjEgQEAKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2lmZGVmIEJPQVJEX1NZU1RFTVNES19WRVJTSU9OUworICAjIEFwcHMgYW5kIGphcnMgaW4gdmVuZG9yIG9yIG9kbSBwYXJ0aXRpb24gYXJlIGZvcmNlZCB0byBidWlsZCBhZ2FpbnN0IFN5c3RlbSBTREsuCisgIF9pc192ZW5kb3JfYXBwIDo9CisgIGlmbmVxICgsJChmaWx0ZXIgdHJ1ZSwkKExPQ0FMX1ZFTkRPUl9NT0RVTEUpICQoTE9DQUxfT0RNX01PRFVMRSkgJChMT0NBTF9QUk9QUklFVEFSWV9NT0RVTEUpKSkKKyAgICAjIE5vdGU6IG5vIG5lZWQgdG8gY2hlY2sgTE9DQUxfTU9EVUxFX1BBVEgqIHNpbmNlIExPQ0FMX1tWRU5ET1J8T0RNfE9FTV1fTU9EVUxFIGlzIGFscmVhZHkKKyAgICAjIHNldCBjb3JyZWN0bHkgYmVmb3JlIHRoaXMgaXMgaW5jbHVkZWQuCisgICAgX2lzX3ZlbmRvcl9hcHAgOj0gdHJ1ZQorICBlbmRpZgorICBpZm5lcSAoLCQoZmlsdGVyIEpBVkFfTElCUkFSSUVTIEFQUFMsJChMT0NBTF9NT0RVTEVfQ0xBU1MpKSkKKyAgICBpZm5kZWYgTE9DQUxfU0RLX1ZFUlNJT04KKyAgICAgIGlmZXEgKCQoX2lzX3ZlbmRvcl9hcHApLHRydWUpCisgICAgICAgIGlmZXEgKCwkKGZpbmRzdHJpbmcgX19hdXRvX2dlbmVyYXRlZF9ycm8sJChMT0NBTF9NT0RVTEUpKSkKKyAgICAgICAgICAjIFJ1bnRpbWUgcmVzb3VyY2Ugb3ZlcmxheSBmb3IgZnJhbWV3b3JrLXJlcyBpcyBleGVtcHRlZCBmcm9tIGJ1aWxkaW5nCisgICAgICAgICAgIyBhZ2FpbnN0IFN5c3RlbSBTREsuCisgICAgICAgICAgIyBUT0RPKGIvMzU4NTk3MjYpOiByZW1vdmUgdGhpcyBleGNlcHRpb24KKyAgICAgICAgICBMT0NBTF9TREtfVkVSU0lPTiA6PSBzeXN0ZW1fY3VycmVudAorICAgICAgICBlbmRpZgorICAgICAgZW5kaWYKKyAgICBlbmRpZgorICBlbmRpZgorZW5kaWYKKworIyBFbnN1cmUgdGhhdCB0aGUgc2VsZWN0ZWQgU3lzdGVtIFNESyB2ZXJzaW9uIGlzIG9uZSBvZiB0aGUgc3VwcG9ydGVkIHZlcnNpb25zLgorIyBUaGUgcmFuZ2Ugb2Ygc3VwcG9ydCB2ZXJzaW9ucyBiZWNvbWVzIG5hcnJvd2VyIHdoZW4gQk9BUkRfU1lTVEVNU0RLX1ZFUlNJT05TCisjIGlzIHNldCwgd2hpY2ggaXMgYSBzdWJzZXQgb2YgUExBVEZPUk1fU1lTVEVNU0RLX1ZFUlNJT05TLgoraWZuZXEgKCwkKGNhbGwgaGFzLXN5c3RlbS1zZGstdmVyc2lvbiwkKExPQ0FMX1NES19WRVJTSU9OKSkpCisgIGlmbmVxICgkKF9pc192ZW5kb3JfYXBwKSx0cnVlKQorICAgICMgYXBwcyBidW5kbGVkIGluIHN5c3RlbSBwYXJ0aXRpb24gY2FuIHVzZSBhbGwgc3lzdGVtIHNkayB2ZXJzaW9ucyBwcm92aWRlZCBieSB0aGUgcGxhdGZvcm0KKyAgICBfc3VwcG9ydGVkX3N5c3RlbXNka192ZXJzaW9ucyA6PSAkKFBMQVRGT1JNX1NZU1RFTVNES19WRVJTSU9OUykKKyAgZWxzZSBpZmRlZiBCT0FSRF9TWVNURU1TREtfVkVSU0lPTlMKKyAgICAjIFdoZW4gQk9BUkRfU1lTVEVNU0RLX1ZFUlNJT05TIGlzIHNldCwgdmVuZG9ycyBhcHBzIGFyZSByZXN0cmljdGVkIHRvIHVzZSB0aG9zZSB2ZXJzaW9ucworICAgICMgd2hpY2ggaXMgZXF1YWwgdG8gb3Igc21hbGxlciB0aGFuIFBMQVRGT1JNX1NZU1RFTVNES19WRVJTSU9OUworICAgIF9zdXBwb3J0ZWRfc3lzdGVtc2RrX3ZlcnNpb25zIDo9ICQoQk9BUkRfU1lTVEVNU0RLX1ZFUlNJT05TKQorICBlbHNlCisgICAgIyBJZiBub3QsIHZlbmRvciBhcGtzIGFyZSB0cmVhdGVkIGVxdWFsbHkgdG8gc3lzdGVtIGFwcHMKKyAgICBfc3VwcG9ydGVkX3N5c3RlbXNka192ZXJzaW9ucyA6PSAkKFBMQVRGT1JNX1NZU1RFTVNES19WRVJTSU9OUykKKyAgZW5kaWYKKyAgX3N5c3RlbV9zZGtfdmVyc2lvbiA6PSAkKGNhbGwgZ2V0LW51bWVyaWMtc2RrLXZlcnNpb24sJChMT0NBTF9TREtfVkVSU0lPTikpCisgIGlmbmVxICgkKF9zeXN0ZW1fc2RrX3ZlcnNpb24pLCQoZmlsdGVyICQoX3N5c3RlbV9zZGtfdmVyc2lvbiksJChfc3VwcG9ydGVkX3N5c3RlbXNka192ZXJzaW9ucykpKQorICAgICQoY2FsbCBwcmV0dHktZXJyb3IsSW5jb21wYXRpYmxlIExPQ0FMX1NES19WRVJTSU9OICckKExPQ0FMX1NES19WRVJTSU9OKScuIFwKKyAgICAgICAgICAgU3lzdGVtIFNESyB2ZXJzaW9uICckKF9zeXN0ZW1fc2RrX3ZlcnNpb24pJyBpcyBub3Qgc3VwcG9ydGVkLiBTdXBwb3J0ZWQgdmVyc2lvbnMgYXJlOiAkKF9zdXBwb3J0ZWRfc3lzdGVtc2RrX3ZlcnNpb25zKSkKKyAgZW5kaWYKKyAgX3N5c3RlbV9zZGtfdmVyc2lvbiA6PQorICBfc3VwcG9ydGVkX3N5c3RlbXNka192ZXJzaW9ucyA6PQorZW5kaWYKZGlmZiAtLWdpdCBhL2NvcmUvbG9jYWxfdm5kay5tayBiL2NvcmUvbG9jYWxfdm5kay5tawppbmRleCA2NDBhYWM3Li4zNjc3ZDQwIDEwMDY0NAotLS0gYS9jb3JlL2xvY2FsX3ZuZGsubWsKKysrIGIvY29yZS9sb2NhbF92bmRrLm1rCkBAIC01LDEwICs1LDggQEAKIGlmbmRlZiBMT0NBTF9TREtfVkVSU0lPTgogICBpZm5lcSAoLCQoZmlsdGVyIHRydWUsJChMT0NBTF9WRU5ET1JfTU9EVUxFKSAkKExPQ0FMX09ETV9NT0RVTEUpICQoTE9DQUxfT0VNX01PRFVMRSkgJChMT0NBTF9QUk9QUklFVEFSWV9NT0RVTEUpKSkKICAgICBMT0NBTF9VU0VfVk5ESzo9dHJ1ZQotICBlbHNlCi0gICAgaWZuZXEgKCwkKGZpbHRlciAkKFRBUkdFVF9PVVRfVkVORE9SKSUsJChMT0NBTF9NT0RVTEVfUEFUSCkgJChMT0NBTF9NT0RVTEVfUEFUSF8zMikgJChMT0NBTF9NT0RVTEVfUEFUSF82NCkpKQotICAgICAgTE9DQUxfVVNFX1ZOREs6PXRydWUKLSAgICBlbmRpZgorICAgICMgTm90ZTogbm8gbmVlZCB0byBjaGVjayBMT0NBTF9NT0RVTEVfUEFUSCogc2luY2UgTE9DQUxfW1ZFTkRPUnxPRE18T0VNXV9NT0RVTEUgaXMgYWxyZWFkeQorICAgICMgc2V0IGNvcnJlY3RseSBiZWZvcmUgdGhpcyBpcyBpbmNsdWRlZC4KICAgZW5kaWYKIGVuZGlmCiBlbmRpZgpkaWZmIC0tZ2l0IGEvY29yZS9tYWluLm1rIGIvY29yZS9tYWluLm1rCmluZGV4IDFlYTIxNjAuLjE5NDZlZGIgMTAwNjQ0Ci0tLSBhL2NvcmUvbWFpbi5taworKysgYi9jb3JlL21haW4ubWsKQEAgLTM0LDcgKzM0LDcgQEAKIFRPUCA6PSAuCiBUT1BESVIgOj0KIAotQlVJTERfU1lTVEVNIDo9ICQoVE9QRElSKWJ1aWxkL2NvcmUKK0JVSUxEX1NZU1RFTSA6PSAkKFRPUERJUilidWlsZC9tYWtlL2NvcmUKIAogIyBUaGlzIGlzIHRoZSBkZWZhdWx0IHRhcmdldC4gIEl0IG11c3QgYmUgdGhlIGZpcnN0IGRlY2xhcmVkIHRhcmdldC4KIC5QSE9OWTogZHJvaWQKQEAgLTUyLDYgKzUyLDEwIEBACiBkb250X2JvdGhlciA6PSB0cnVlCiBlbmRpZgogCisuS0FUSV9SRUFET05MWSA6PSBTT09OR19DT05GSUdfTkFNRVNQQUNFUworLktBVElfUkVBRE9OTFkgOj0gJChmb3JlYWNoIG4sJChTT09OR19DT05GSUdfTkFNRVNQQUNFUyksU09PTkdfQ09ORklHXyQobikpCisuS0FUSV9SRUFET05MWSA6PSAkKGZvcmVhY2ggbiwkKFNPT05HX0NPTkZJR19OQU1FU1BBQ0VTKSwkKGZvcmVhY2ggaywkKFNPT05HX0NPTkZJR18kKG4pKSxTT09OR19DT05GSUdfJChuKV8kKGspKSkKKwogaW5jbHVkZSAkKFNPT05HX01BS0VWQVJTX01LKQogCiBpbmNsdWRlICQoQlVJTERfU1lTVEVNKS9jbGFuZy9jb25maWcubWsKQEAgLTYwLDE2ICs2NCwyOCBAQAogIyB3aXRob3V0IGNoYW5naW5nIHRoZSBjb21tYW5kIGxpbmUgZXZlcnkgdGltZS4gIEF2b2lkcyByZWJ1aWxkcwogIyB3aGVuIHVzaW5nIG5pbmphLgogJChzaGVsbCBta2RpciAtcCAkKE9VVF9ESVIpICYmIFwKLSAgICBlY2hvIC1uICQoQlVJTERfTlVNQkVSKSA+ICQoT1VUX0RJUikvYnVpbGRfbnVtYmVyLnR4dCAmJiBcCi0gICAgZWNobyAtbiAkKEJVSUxEX0RBVEVUSU1FKSA+ICQoT1VUX0RJUikvYnVpbGRfZGF0ZS50eHQpCi1CVUlMRF9OVU1CRVJfRlJPTV9GSUxFIDo9ICQkKGNhdCAkKE9VVF9ESVIpL2J1aWxkX251bWJlci50eHQpCi1CVUlMRF9EQVRFVElNRV9GUk9NX0ZJTEUgOj0gJCQoY2F0ICQoT1VUX0RJUikvYnVpbGRfZGF0ZS50eHQpCisgICAgZWNobyAtbiAkKEJVSUxEX05VTUJFUikgPiAkKE9VVF9ESVIpL2J1aWxkX251bWJlci50eHQpCitCVUlMRF9OVU1CRVJfRklMRSA6PSAkKE9VVF9ESVIpL2J1aWxkX251bWJlci50eHQKKwogaWZlcSAoJChIT1NUX09TKSxkYXJ3aW4pCiBEQVRFX0ZST01fRklMRSA6PSBkYXRlIC1yICQoQlVJTERfREFURVRJTUVfRlJPTV9GSUxFKQogZWxzZQogREFURV9GUk9NX0ZJTEUgOj0gZGF0ZSAtZCBAJChCVUlMRF9EQVRFVElNRV9GUk9NX0ZJTEUpCiBlbmRpZgogCisjIFBpY2sgYSByZWFzb25hYmxlIHN0cmluZyB0byB1c2UgdG8gaWRlbnRpZnkgZmlsZXMuCitpZmVxICgkKHN0cmlwICQoSEFTX0JVSUxEX05VTUJFUikpLGZhbHNlKQorICAjIEJVSUxEX05VTUJFUiBoYXMgYSB0aW1lc3RhbXAgaW4gaXQsIHdoaWNoIG1lYW5zIHRoYXQKKyAgIyBpdCB3aWxsIGNoYW5nZSBldmVyeSB0aW1lLiAgUGljayBhIHN0YWJsZSB2YWx1ZS4KKyAgRklMRV9OQU1FX1RBRyA6PSBlbmcuJChVU0VSKQorZWxzZQorICBGSUxFX05BTUVfVEFHIDo9ICQoZmlsZSA8JChCVUlMRF9OVU1CRVJfRklMRSkpCitlbmRpZgorCisjIE1ha2UgYW4gZW1wdHkgZGlyZWN0b3J5LCB3aGljaCBjYW4gYmUgdXNlZCB0byBtYWtlIGVtcHR5IGphcnMKK0VNUFRZX0RJUkVDVE9SWSA6PSAkKE9VVF9ESVIpL2VtcHR5CiskKHNoZWxsIG1rZGlyIC1wICQoRU1QVFlfRElSRUNUT1JZKSAmJiBybSAtcmYgJChFTVBUWV9ESVJFQ1RPUlkpLyopCisKICMgQ1RTLXNwZWNpZmljIGNvbmZpZy4KIC1pbmNsdWRlIGN0cy9idWlsZC9jb25maWcubWsKICMgVlRTLXNwZWNpZmljIGNvbmZpZy4KQEAgLTgwLDEyICs5NiwxNiBAQAogLWluY2x1ZGUgdG9vbHMvdHJhZGVmZWRlcmF0aW9uL2J1aWxkL3N1aXRlcy9nZW5lcmFsLXRlc3RzL2NvbmZpZy5tawogIyBTVFMtc3BlY2lmaWMgY29uZmlnLgogLWluY2x1ZGUgdGVzdC9zdHMvdG9vbHMvc3RzLXRyYWRlZmVkL2J1aWxkL2NvbmZpZy5taworIyBDVFMtSW5zdGFudC1zcGVjaWZpYyBjb25maWcKKy1pbmNsdWRlIHRlc3Qvc3VpdGVfaGFybmVzcy90b29scy9jdHMtaW5zdGFudC10cmFkZWZlZC9idWlsZC9jb25maWcubWsKIAotIyBUaGlzIGFsbG93cyB1cyB0byBmb3JjZSBhIGNsZWFuIGJ1aWxkIC0gaW5jbHVkZWQgYWZ0ZXIgdGhlIGNvbmZpZy5tawotIyBlbnZpcm9ubWVudCBzZXR1cCBpcyBkb25lLCBidXQgYmVmb3JlIHdlIGdlbmVyYXRlIGFueSBkZXBlbmRlbmNpZXMuICBUaGlzCi0jIGZpbGUgZG9lcyB0aGUgcm0gLXJmIGlubGluZSBzbyB0aGUgZGVwcyB3aGljaCBhcmUgYWxsIGRvbmUgYmVsb3cgd2lsbAotIyBiZSBnZW5lcmF0ZWQgY29ycmVjdGx5Ci1pbmNsdWRlICQoQlVJTERfU1lTVEVNKS9jbGVhbmJ1aWxkLm1rCisjIENsZWFuIHJ1bGVzCisuUEhPTlk6IGNsZWFuLWRleC1maWxlcworY2xlYW4tZGV4LWZpbGVzOgorCSQoaGlkZSkgZmluZCAkKE9VVF9ESVIpIC1uYW1lICIqLmRleCIgfCB4YXJncyBybSAtZgorCSQoaGlkZSkgZm9yIGkgaW4gYGZpbmQgJChPVVRfRElSKSAtbmFtZSAiKi5qYXIiIC1vIC1uYW1lICIqLmFwayJgIDsgZG8gKCh1bnppcCAtbCAkJGkgMj4gL2Rldi9udWxsIHwgXAorCQkJCWdyZXAgLXEgIlwuZGV4JCQiICYmIHJtIC1mICQkaSkgfHwgY29udGludWUgKSA7IGRvbmUKKwlAZWNobyAiQWxsIGRleCBmaWxlcyBhbmQgYXJjaGl2ZXMgY29udGFpbmluZyBkZXggZmlsZXMgaGF2ZSBiZWVuIHJlbW92ZWQuIgogCiAjIEluY2x1ZGUgdGhlIGdvb2dsZS1zcGVjaWZpYyBjb25maWcKIC1pbmNsdWRlIHZlbmRvci9nb29nbGUvYnVpbGQvY29uZmlnLm1rCkBAIC05NSwxMSArMTE1LDIxIEBACiAjIChtdXN0IGJlIGRlZmluZWQgYmVmb3JlIGluY2x1ZGluZyBkZWZpbml0aW9ucy5tYWtlKQogSU5URVJOQUxfTU9ESUZJRVJfVEFSR0VUUyA6PSBhbGwKIAotIyBFTU1BX0lOU1RSVU1FTlRfU1RBVElDIG1lcmdlcyB0aGUgc3RhdGljIGVtbWEgbGlicmFyeSB0byBlYWNoIGVtbWEtZW5hYmxlZCBtb2R1bGUuCisjIEVNTUFfSU5TVFJVTUVOVF9TVEFUSUMgbWVyZ2VzIHRoZSBzdGF0aWMgamFjb2NvIGxpYnJhcnkgdG8gZWFjaAorIyBqYWNvY28tZW5hYmxlZCBtb2R1bGUuCiBpZmVxICh0cnVlLCQoRU1NQV9JTlNUUlVNRU5UX1NUQVRJQykpCiBFTU1BX0lOU1RSVU1FTlQgOj0gdHJ1ZQogZW5kaWYKIAoraWZlcSAodHJ1ZSwkKEVNTUFfSU5TVFJVTUVOVCkpCisjIEFkZGluZyB0aGUgamFjb2NvIGxpYnJhcnkgY2FuIGNhdXNlIHRoZSBpbmNsdXNpb24gb2YKKyMgc29tZSB0eXBpY2FsbHkgYmFubmVkIGNsYXNzZXMKKyMgU28gaWYgdGhlIHVzZXIgZGlkbid0IHNwZWNpZnkgU0tJUF9CT09UX0pBUlNfQ0hFQ0ssIGVuYWJsZSBpdCBoZXJlCitpZm5kZWYgU0tJUF9CT09UX0pBUlNfQ0hFQ0sKK1NLSVBfQk9PVF9KQVJTX0NIRUNLIDo9IHRydWUKK2VuZGlmCitlbmRpZgorCiAjCiAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAjIFZhbGlkYXRlIEFERElUSU9OQUxfREVGQVVMVF9QUk9QRVJUSUVTLgpAQCAtMTE0LDYgKzE0NCw4IEBACiAkKGVycm9yIEFERElUSU9OQUxfQlVJTERfUFJPUEVSVElFUyBtdXN0IG5vdCBiZSBzZXQgYmVmb3JlIGhlcmU6ICQoQURESVRJT05BTF9CVUlMRF9QUk9QRVJUSUVTKSkKIGVuZGlmCiAKK0FERElUSU9OQUxfQlVJTERfUFJPUEVSVElFUyA6PQorCiAjCiAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAjIEFkZCB0aGUgcHJvZHVjdC1kZWZpbmVkIHByb3BlcnRpZXMgdG8gdGhlIGJ1aWxkIHByb3BlcnRpZXMuCkBAIC0xNjksMzkgKzIwMSwzOCBAQAogCiAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAjIFRoZSBwZGsgKFBsYXRmb3JtIERldmVsb3BtZW50IEtpdCkgYnVpbGQKLWluY2x1ZGUgYnVpbGQvY29yZS9wZGtfY29uZmlnLm1rCitpbmNsdWRlIGJ1aWxkL21ha2UvY29yZS9wZGtfY29uZmlnLm1rCiAKICMKICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgSmFjayB2ZXJzaW9uIGNvbmZpZ3VyYXRpb24KLS1pbmNsdWRlICQoVE9QRElSKXByZWJ1aWx0cy9zZGsvdG9vbHMvamFja192ZXJzaW9ucy5tawotLWluY2x1ZGUgJChUT1BESVIpcHJlYnVpbHRzL3Nkay90b29scy9qYWNrX2Zvcl9tb2R1bGUubWsKLQotIwotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBJbnN0YWxsIGFuZCBzdGFydCBKYWNrIHNlcnZlcgotLWluY2x1ZGUgJChUT1BESVIpcHJlYnVpbHRzL3Nkay90b29scy9qYWNrX3NlcnZlcl9zZXR1cC5tawotCi0jCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIEphY29jbyBwYWNrYWdlIG5hbWUgZm9yIEphY2sKLS1pbmNsdWRlICQoVE9QRElSKWV4dGVybmFsL2phY29jby9jb25maWcubWsKLQotIwotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBFbmFibGUgZHluYW1pYyBsaW5rZXIgZGV2ZWxvcGVyIHdhcm5pbmdzIGZvciB1c2VyZGVidWcsIGVuZwotIyBhbmQgbm9uLVJFTCBidWlsZHMKKyMgRW5hYmxlIGR5bmFtaWMgbGlua2VyIGFuZCBoaWRkZW4gQVBJIGRldmVsb3BlciB3YXJuaW5ncyBmb3IKKyMgdXNlcmRlYnVnLCBlbmcgYW5kIG5vbi1SRUwgYnVpbGRzCiBpZm5lcSAoJChUQVJHRVRfQlVJTERfVkFSSUFOVCksdXNlcikKLSAgQURESVRJT05BTF9CVUlMRF9QUk9QRVJUSUVTICs9IHJvLmJpb25pYy5sZC53YXJuaW5nPTEKKyAgQURESVRJT05BTF9CVUlMRF9QUk9QRVJUSUVTICs9IHJvLmJpb25pYy5sZC53YXJuaW5nPTEgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm8uYXJ0LmhpZGRlbmFwaS53YXJuaW5nPTEKIGVsc2UKICMgRW5hYmxlIGl0IGZvciB1c2VyIGJ1aWxkcyBhcyBsb25nIGFzIHRoZXkgYXJlIG5vdCBmaW5hbC4KIGlmbmVxICgkKFBMQVRGT1JNX1ZFUlNJT05fQ09ERU5BTUUpLFJFTCkKLSAgQURESVRJT05BTF9CVUlMRF9QUk9QRVJUSUVTICs9IHJvLmJpb25pYy5sZC53YXJuaW5nPTEKKyAgQURESVRJT05BTF9CVUlMRF9QUk9QRVJUSUVTICs9IHJvLmJpb25pYy5sZC53YXJuaW5nPTEgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm8uYXJ0LmhpZGRlbmFwaS53YXJuaW5nPTEKIGVuZGlmCiBlbmRpZgogCiBBRERJVElPTkFMX0JVSUxEX1BST1BFUlRJRVMgKz0gcm8udHJlYmxlLmVuYWJsZWQ9JHtQUk9EVUNUX0ZVTExfVFJFQkxFfQogCiskKEtBVElfb2Jzb2xldGVfdmFyIFBST0RVQ1RfRlVMTF9UUkVCTEUsXAorCUNvZGUgc2hvdWxkIGJlIHdyaXR0ZW4gdG8gd29yayByZWdhcmRsZXNzIG9mIGEgZGV2aWNlIGJlaW5nIFRyZWJsZSBvciBcCisJdmFyaWFibGVzIGxpa2UgUFJPRFVDVF9TRVBPTElDWV9TUExJVCBzaG91bGQgYmUgdXNlZCB1bnRpbCB0aGF0IGlzIFwKKwlwb3NzaWJsZS4pCisKKyMgU2V0cyByby5hY3Rpb25hYmxlX2NvbXBhdGlibGVfcHJvcGVydHkuZW5hYmxlZCB0byBrbm93IG9uIHJ1bnRpbWUgd2hldGhlciB0aGUgd2hpdGVsaXN0CisjIG9mIGFjdGlvbmFibGUgY29tcGF0aWJsZSBwcm9wZXJ0aWVzIGlzIGVuYWJsZWQgb3Igbm90LgoraWZlcSAoJChQUk9EVUNUX0FDVElPTkFCTEVfQ09NUEFUSUJMRV9QUk9QRVJUWV9ESVNBQkxFKSx0cnVlKQorQURESVRJT05BTF9ERUZBVUxUX1BST1BFUlRJRVMgKz0gcm8uYWN0aW9uYWJsZV9jb21wYXRpYmxlX3Byb3BlcnR5LmVuYWJsZWQ9ZmFsc2UKK2Vsc2UKK0FERElUSU9OQUxfREVGQVVMVF9QUk9QRVJUSUVTICs9IHJvLmFjdGlvbmFibGVfY29tcGF0aWJsZV9wcm9wZXJ0eS5lbmFibGVkPSR7UFJPRFVDVF9DT01QQVRJQkxFX1BST1BFUlRZfQorZW5kaWYKKwogIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIyMjCiAjIyMgSW4gdGhpcyBzZWN0aW9uIHdlIHNldCB1cCB0aGUgdGhpbmdzIHRoYXQgYXJlIGRpZmZlcmVudApAQCAtNDE4LDE2ICs0NDksMTYgQEAKICMgSW5jbHVkZSBhbGwgb2YgdGhlIG1ha2VmaWxlcyBpbiB0aGUgc3lzdGVtCiAjCiAKLXN1YmRpcl9tYWtlZmlsZXMgOj0gJChTT09OR19BTkRST0lEX01LKSAkKGNhbGwgZmlyc3QtbWFrZWZpbGVzLXVuZGVyLCQoVE9QKSkKK3N1YmRpcl9tYWtlZmlsZXMgOj0gJChTT09OR19BTkRST0lEX01LKSAkKGZpbGUgPCQoT1VUX0RJUikvLm1vZHVsZV9wYXRocy9BbmRyb2lkLm1rLmxpc3QpCiBzdWJkaXJfbWFrZWZpbGVzX3RvdGFsIDo9ICQod29yZHMgJChzdWJkaXJfbWFrZWZpbGVzKSkKIC5LQVRJX1JFQURPTkxZIDo9IHN1YmRpcl9tYWtlZmlsZXNfdG90YWwKIAogJChmb3JlYWNoIG1rLCQoc3ViZGlyX21ha2VmaWxlcyksJChpbmZvIFskKGNhbGwgaW5jX2FuZF9wcmludCxzdWJkaXJfbWFrZWZpbGVzX2luYykvJChzdWJkaXJfbWFrZWZpbGVzX3RvdGFsKV0gaW5jbHVkaW5nICQobWspIC4uLikkKGV2YWwgaW5jbHVkZSAkKG1rKSkpCiAKLWlmZGVmIFBES19GVVNJT05fUExBVEZPUk1fWklQCitpZm5lcSAoLCQoUERLX0ZVU0lPTl9QTEFURk9STV9aSVApJChQREtfRlVTSU9OX1BMQVRGT1JNX0RJUikpCiAjIEJyaW5nIGluIHRoZSBQREsgcGxhdGZvcm0uemlwIG1vZHVsZXMuCiBpbmNsdWRlICQoQlVJTERfU1lTVEVNKS9wZGtfZnVzaW9uX21vZHVsZXMubWsKLWVuZGlmICMgUERLX0ZVU0lPTl9QTEFURk9STV9aSVAKK2VuZGlmICMgUERLX0ZVU0lPTl9QTEFURk9STV9aSVAgfHwgUERLX0ZVU0lPTl9QTEFURk9STV9ESVIKIAogZHJvaWRfdGFyZ2V0cyA6IGJsdWVwcmludF90b29scwogCkBAIC01MDAsOSArNTMxLDEwIEBACiAjIElmIGEgbW9kdWxlIGlzIGZvciBhIGNyb3NzIGhvc3Qgb3MsIHRoZSByZXF1aXJlZCBtb2R1bGVzIG11c3QgYmUgZm9yCiAjIHRoYXQgT1MgdG9vLgogIyBJZiBhIG1vZHVsZSBpcyBidWlsdCBmb3IgMzItYml0LCB0aGUgcmVxdWlyZWQgbW9kdWxlcyBtdXN0IGJlIDMyLWJpdCB0b287Ci0jIE90aGVyd2lzZSBpZiB0aGUgbW9kdWxlIGlzIGFuIGV4ZWN0dWFibGUgb3Igc2hhcmVkIGxpYnJhcnksCisjIE90aGVyd2lzZSBpZiB0aGUgbW9kdWxlIGlzIGFuIGV4ZWN1dGFibGUgb3Igc2hhcmVkIGxpYnJhcnksCiAjICAgdGhlIHJlcXVpcmVkIG1vZHVsZXMgbXVzdCBiZSA2NC1iaXQ7CiAjICAgb3RoZXJ3aXNlIHdlIHJlcXVpcmUgYm90aCA2NC1iaXQgYW5kIDMyLWJpdCB2YXJpYW50LCBpZiBvbmUgZXhpc3RzLgorZGVmaW5lIHNlbGVjdC1iaXRuZXNzLW9mLXJlcXVpcmVkLW1vZHVsZXMKICQoZm9yZWFjaCBtLCQoQUxMX01PRFVMRVMpLFwKICAgJChldmFsIHIgOj0gJChBTExfTU9EVUxFUy4kKG0pLlJFUVVJUkVEKSlcCiAgICQoaWYgJChyKSxcCkBAIC01MTgsNiArNTUwLDggQEAKICAgICAgJChldmFsIEFMTF9NT0RVTEVTLiQobSkuUkVRVUlSRUQgOj0gJChzdHJpcCAkKHJfcikpKVwKICAgKVwKICkKK2VuZGVmCiskKGNhbGwgc2VsZWN0LWJpdG5lc3Mtb2YtcmVxdWlyZWQtbW9kdWxlcykKIHJfciA6PQogCiBkZWZpbmUgYWRkLXJlcXVpcmVkLWRlcHMKQEAgLTUzMiwyNCArNTY2LDkzIEBACiAkKDEpOiAkKDIpCiBlbmRlZgogCisjIFNldHMgdXAgZGVwZW5kZW5jaWVzIHN1Y2ggdGhhdCB3aGVuZXZlciBhIGhvc3QgbW9kdWxlIGlzIGluc3RhbGxlZCwKKyMgYW55IG90aGVyIGhvc3QgbW9kdWxlcyBsaXN0ZWQgaW4gJChBTExfTU9EVUxFUy4kKG0pLlJFUVVJUkVEKSB3aWxsIGFsc28gYmUgaW5zdGFsbGVkCitkZWZpbmUgYWRkLWFsbC1ob3N0LXRvLWhvc3QtcmVxdWlyZWQtbW9kdWxlcy1kZXBzCiskKGZvcmVhY2ggbSwkKEFMTF9NT0RVTEVTKSwgXAorICAkKGV2YWwgciA6PSAkKEFMTF9NT0RVTEVTLiQobSkuUkVRVUlSRUQpKSBcCisgICQoaWYgJChyKSwgXAorICAgICQoZXZhbCByIDo9ICQoY2FsbCBtb2R1bGUtaW5zdGFsbGVkLWZpbGVzLCQocikpKSBcCisgICAgJChldmFsIGhfbSA6PSAkKGZpbHRlciAkKEhPU1RfT1VUKS8lLCAkKEFMTF9NT0RVTEVTLiQobSkuSU5TVEFMTEVEKSkpIFwKKyAgICAkKGV2YWwgaGNfbSA6PSAkKGZpbHRlciAkKEhPU1RfQ1JPU1NfT1VUKS8lLCAkKEFMTF9NT0RVTEVTLiQobSkuSU5TVEFMTEVEKSkpIFwKKyAgICAkKGV2YWwgaF9yIDo9ICQoZmlsdGVyICQoSE9TVF9PVVQpLyUsICQocikpKSBcCisgICAgJChldmFsIGhjX3IgOj0gJChmaWx0ZXIgJChIT1NUX0NST1NTX09VVCkvJSwgJChyKSkpIFwKKyAgICAkKGV2YWwgaF9tIDo9ICQoZmlsdGVyLW91dCAkKGhfciksICQoaF9tKSkpIFwKKyAgICAkKGV2YWwgaGNfbSA6PSAkKGZpbHRlci1vdXQgJChoY19yKSwgJChoY19tKSkpIFwKKyAgICAkKGlmICQoaF9tKSwgJChldmFsICQoY2FsbCBhZGQtcmVxdWlyZWQtZGVwcywgJChoX20pLCQoaF9yKSkpKSBcCisgICAgJChpZiAkKGhjX20pLCAkKGV2YWwgJChjYWxsIGFkZC1yZXF1aXJlZC1kZXBzLCAkKGhjX20pLCQoaGNfcikpKSkgXAorICApIFwKKykKK2VuZGVmCiskKGNhbGwgYWRkLWFsbC1ob3N0LXRvLWhvc3QtcmVxdWlyZWQtbW9kdWxlcy1kZXBzKQorCisjIFNldHMgdXAgZGVwZW5kZW5jaWVzIHN1Y2ggdGhhdCB3aGVuZXZlciBhIHRhcmdldCBtb2R1bGUgaXMgaW5zdGFsbGVkLAorIyBhbnkgb3RoZXIgdGFyZ2V0IG1vZHVsZXMgbGlzdGVkIGluICQoQUxMX01PRFVMRVMuJChtKS5SRVFVSVJFRCkgd2lsbCBhbHNvIGJlIGluc3RhbGxlZAorZGVmaW5lIGFkZC1hbGwtdGFyZ2V0LXRvLXRhcmdldC1yZXF1aXJlZC1tb2R1bGVzLWRlcHMKICQoZm9yZWFjaCBtLCQoQUxMX01PRFVMRVMpLCBcCiAgICQoZXZhbCByIDo9ICQoQUxMX01PRFVMRVMuJChtKS5SRVFVSVJFRCkpIFwKICAgJChpZiAkKHIpLCBcCiAgICAgJChldmFsIHIgOj0gJChjYWxsIG1vZHVsZS1pbnN0YWxsZWQtZmlsZXMsJChyKSkpIFwKICAgICAkKGV2YWwgdF9tIDo9ICQoZmlsdGVyICQoVEFSR0VUX09VVF9ST09UKS8lLCAkKEFMTF9NT0RVTEVTLiQobSkuSU5TVEFMTEVEKSkpIFwKLSAgICAkKGV2YWwgaF9tIDo9ICQoZmlsdGVyICQoSE9TVF9PVVQpLyUsICQoQUxMX01PRFVMRVMuJChtKS5JTlNUQUxMRUQpKSkgXAotICAgICQoZXZhbCBoY19tIDo9ICQoZmlsdGVyICQoSE9TVF9DUk9TU19PVVQpLyUsICQoQUxMX01PRFVMRVMuJChtKS5JTlNUQUxMRUQpKSkgXAogICAgICQoZXZhbCB0X3IgOj0gJChmaWx0ZXIgJChUQVJHRVRfT1VUX1JPT1QpLyUsICQocikpKSBcCi0gICAgJChldmFsIGhfciA6PSAkKGZpbHRlciAkKEhPU1RfT1VUKS8lLCAkKHIpKSkgXAotICAgICQoZXZhbCBoY19yIDo9ICQoZmlsdGVyICQoSE9TVF9DUk9TU19PVVQpLyUsICQocikpKSBcCiAgICAgJChldmFsIHRfbSA6PSAkKGZpbHRlci1vdXQgJCh0X3IpLCAkKHRfbSkpKSBcCi0gICAgJChldmFsIGhfbSA6PSAkKGZpbHRlci1vdXQgJChoX3IpLCAkKGhfbSkpKSBcCi0gICAgJChldmFsIGhjX20gOj0gJChmaWx0ZXItb3V0ICQoaGNfciksICQoaGNfbSkpKSBcCiAgICAgJChpZiAkKHRfbSksICQoZXZhbCAkKGNhbGwgYWRkLXJlcXVpcmVkLWRlcHMsICQodF9tKSwkKHRfcikpKSkgXAotICAgICQoaWYgJChoX20pLCAkKGV2YWwgJChjYWxsIGFkZC1yZXF1aXJlZC1kZXBzLCAkKGhfbSksJChoX3IpKSkpIFwKLSAgICAkKGlmICQoaGNfbSksICQoZXZhbCAkKGNhbGwgYWRkLXJlcXVpcmVkLWRlcHMsICQoaGNfbSksJChoY19yKSkpKSBcCi0gICApIFwKLSApCisgICkgXAorKQorZW5kZWYKKyQoY2FsbCBhZGQtYWxsLXRhcmdldC10by10YXJnZXQtcmVxdWlyZWQtbW9kdWxlcy1kZXBzKQorCisjIFNldHMgdXAgZGVwZW5kZW5jaWVzIHN1Y2ggdGhhdCB3aGVuZXZlciBhIGhvc3QgbW9kdWxlIGlzIGluc3RhbGxlZCwKKyMgYW55IHRhcmdldCBtb2R1bGVzIGxpc3RlZCBpbiAkKEFMTF9NT0RVTEVTLiQobSkuVEFSR0VUX1JFUVVJUkVEKSB3aWxsIGFsc28gYmUgaW5zdGFsbGVkCitkZWZpbmUgYWRkLWFsbC1ob3N0LXRvLXRhcmdldC1yZXF1aXJlZC1tb2R1bGVzLWRlcHMKKyQoZm9yZWFjaCBtLCQoQUxMX01PRFVMRVMpLCBcCisgICQoZXZhbCByZXFfbW9kcyA6PSAkKEFMTF9NT0RVTEVTLiQobSkuVEFSR0VUX1JFUVVJUkVEKSlcCisgICQoaWYgJChyZXFfbW9kcyksIFwKKyAgICAkKGV2YWwgcmVxX2ZpbGVzIDo9IClcCisgICAgJChmb3JlYWNoIHJlcV9tb2QsJChyZXFfbW9kcyksIFwKKyAgICAgICQoZXZhbCByZXFfZmlsZSA6PSAkKGZpbHRlciAkKFRBUkdFVF9PVVRfUk9PVCkvJSwgJChjYWxsIG1vZHVsZS1pbnN0YWxsZWQtZmlsZXMsJChyZXFfbW9kKSkpKSBcCisgICAgICAkKGlmICQoc3RyaXAgJChyZXFfZmlsZSkpLFwKKyAgICAgICAgLFwKKyAgICAgICAgJChlcnJvciAkKG0pLkxPQ0FMX1RBUkdFVF9SRVFVSVJFRF9NT0RVTEVTIDogaWxsZWdhbCB2YWx1ZSAkKHJlcV9tb2QpIDogbm90IGEgZGV2aWNlIG1vZHVsZS4gSWYgeW91IHdhbnQgdG8gc3BlY2lmeSBob3N0IG1vZHVsZXMgdG8gYmUgcmVxdWlyZWQgdG8gYmUgaW5zdGFsbGVkIGFsb25nIHdpdGggeW91ciBob3N0IG1vZHVsZSwgYWRkIHRob3NlIG1vZHVsZSBuYW1lcyB0byBMT0NBTF9SRVFVSVJFRF9NT0RVTEVTIGluc3RlYWQpXAorICAgICAgKVwKKyAgICAgICQoZXZhbCByZXFfZmlsZXMgOj0gJChyZXFfZmlsZXMpJChzcGFjZSkkKHJlcV9maWxlKSlcCisgICAgKVwKKyAgICAkKGV2YWwgcmVxX2ZpbGVzIDo9ICQoc3RyaXAgJChyZXFfZmlsZXMpKSlcCisgICAgJChldmFsIG1vZF9maWxlcyA6PSAkKGZpbHRlciAkKEhPU1RfT1VUKS8lLCAkKGNhbGwgbW9kdWxlLWluc3RhbGxlZC1maWxlcywkKG0pKSkpIFwKKyAgICAkKGV2YWwgbW9kX2ZpbGVzIDo9ICQoZmlsdGVyLW91dCAkKHJlcV9maWxlcyksJChtb2RfZmlsZXMpKSlcCisgICAgJChpZiAkKG1vZF9maWxlcyksXAorICAgICAgJChldmFsICQoY2FsbCBhZGQtcmVxdWlyZWQtZGVwcywgJChtb2RfZmlsZXMpLCQocmVxX2ZpbGVzKSkpIFwKKyAgICApXAorICApXAorKQorZW5kZWYKKyQoY2FsbCBhZGQtYWxsLWhvc3QtdG8tdGFyZ2V0LXJlcXVpcmVkLW1vZHVsZXMtZGVwcykKKworIyBTZXRzIHVwIGRlcGVuZGVuY2llcyBzdWNoIHRoYXQgd2hlbmV2ZXIgYSB0YXJnZXQgbW9kdWxlIGlzIGluc3RhbGxlZCwKKyMgYW55IGhvc3QgbW9kdWxlcyBsaXN0ZWQgaW4gJChBTExfTU9EVUxFUy4kKG0pLkhPU1RfUkVRVUlSRUQpIHdpbGwgYWxzbyBiZSBpbnN0YWxsZWQKK2RlZmluZSBhZGQtYWxsLXRhcmdldC10by1ob3N0LXJlcXVpcmVkLW1vZHVsZXMtZGVwcworJChmb3JlYWNoIG0sJChBTExfTU9EVUxFUyksIFwKKyAgJChldmFsIHJlcV9tb2RzIDo9ICQoQUxMX01PRFVMRVMuJChtKS5IT1NUX1JFUVVJUkVEKSlcCisgICQoaWYgJChyZXFfbW9kcyksIFwKKyAgICAkKGV2YWwgcmVxX2ZpbGVzIDo9IClcCisgICAgJChmb3JlYWNoIHJlcV9tb2QsJChyZXFfbW9kcyksIFwKKyAgICAgICQoZXZhbCByZXFfZmlsZSA6PSAkKGZpbHRlciAkKEhPU1RfT1VUKS8lLCAkKGNhbGwgbW9kdWxlLWluc3RhbGxlZC1maWxlcywkKHJlcV9tb2QpKSkpIFwKKyAgICAgICQoaWYgJChzdHJpcCAkKHJlcV9maWxlKSksXAorICAgICAgICAsXAorICAgICAgICAkKGVycm9yICQobSkuTE9DQUxfSE9TVF9SRVFVSVJFRF9NT0RVTEVTIDogaWxsZWdhbCB2YWx1ZSAkKHJlcV9tb2QpIDogbm90IGEgaG9zdCBtb2R1bGUuIElmIHlvdSB3YW50IHRvIHNwZWNpZnkgdGFyZ2V0IG1vZHVsZXMgdG8gYmUgcmVxdWlyZWQgdG8gYmUgaW5zdGFsbGVkIGFsb25nIHdpdGggeW91ciB0YXJnZXQgbW9kdWxlLCBhZGQgdGhvc2UgbW9kdWxlIG5hbWVzIHRvIExPQ0FMX1JFUVVJUkVEX01PRFVMRVMgaW5zdGVhZClcCisgICAgICApXAorICAgICAgJChldmFsIHJlcV9maWxlcyA6PSAkKHJlcV9maWxlcykkKHNwYWNlKSQocmVxX2ZpbGUpKVwKKyAgICApXAorICAgICQoZXZhbCByZXFfZmlsZXMgOj0gJChzdHJpcCAkKHJlcV9maWxlcykpKVwKKyAgICAkKGV2YWwgbW9kX2ZpbGVzIDo9ICQoZmlsdGVyICQoVEFSR0VUX09VVF9ST09UKS8lLCAkKGNhbGwgbW9kdWxlLWluc3RhbGxlZC1maWxlcywkKG0pKSkpXAorICAgICQoZXZhbCBtb2RfZmlsZXMgOj0gJChmaWx0ZXItb3V0ICQocmVxX2ZpbGVzKSwkKG1vZF9maWxlcykpKVwKKyAgICAkKGlmICQobW9kX2ZpbGVzKSxcCisgICAgICAkKGV2YWwgJChjYWxsIGFkZC1yZXF1aXJlZC1kZXBzLCAkKG1vZF9maWxlcyksJChyZXFfZmlsZXMpKSkgXAorICAgIClcCisgIClcCispCitlbmRlZgorJChjYWxsIGFkZC1hbGwtdGFyZ2V0LXRvLWhvc3QtcmVxdWlyZWQtbW9kdWxlcy1kZXBzKQogCiB0X20gOj0KIGhfbSA6PQpAQCAtNTU4LDcgKzY2MSw3IEBACiBoX3IgOj0KIGhjX3IgOj0KIAotIyBFc3RhYmxpc2ggdGhlIGRlcGVuZGVjaWVzIG9uIHRoZSBzaGFyZWQgbGlicmFyaWVzLgorIyBFc3RhYmxpc2ggdGhlIGRlcGVuZGVuY2llcyBvbiB0aGUgc2hhcmVkIGxpYnJhcmllcy4KICMgSXQgYWxzbyBhZGRzIHRoZSBzaGFyZWQgbGlicmFyeSBtb2R1bGUgbmFtZXMgdG8gQUxMX01PRFVMRVMuJChtKS5SRVFVSVJFRCwKICMgc28gdGhleSBjYW4gYmUgZXhwYW5kZWQgdG8gcHJvZHVjdF9NT0RVTEVTIGxhdGVyLgogIyAkKDEpOiBUQVJHRVRfIG9yIEhPU1RfIG9yIEhPU1RfQ1JPU1NfLgpAQCAtNzk0LDYgKzg5Nyw5IEBACiAgICMgYnkgdGhlIGFwcHJvcHJpYXRlIHByb2R1Y3QgZGVmaW5pdGlvbiBmaWxlLCB3aGljaCB3YXMgaW5jbHVkZWQKICAgIyBieSBwcm9kdWN0X2NvbmZpZy5tay4KICAgcHJvZHVjdF9NT0RVTEVTIDo9ICQoUFJPRFVDVFMuJChJTlRFUk5BTF9QUk9EVUNUKS5QUk9EVUNUX1BBQ0tBR0VTKQoraWZkZWYgQk9BUkRfVk5ES19WRVJTSU9OCisgIHByb2R1Y3RfTU9EVUxFUyArPSB2bmRrX3BhY2thZ2UKK2VuZGlmCiAgICMgRmlsdGVyIG91dCB0aGUgb3ZlcnJpZGRlbiBwYWNrYWdlcyBiZWZvcmUgZG9pbmcgZXhwYW5zaW9uCiAgIHByb2R1Y3RfTU9EVUxFUyA6PSAkKGZpbHRlci1vdXQgJChmb3JlYWNoIHAsICQocHJvZHVjdF9NT0RVTEVTKSwgXAogICAgICAgJChQQUNLQUdFUy4kKHApLk9WRVJSSURFUykpLCAkKHByb2R1Y3RfTU9EVUxFUykpCkBAIC05MDUsNyArMTAxMSw3IEBACiAgICAgICAkKHdhcm5pbmcgJChBTExfTU9EVUxFUy4kKG0pLk1BS0VGSUxFKTogTW9kdWxlICckKG0pJyBpbiBQUk9EVUNUX1BBQ0tBR0VTX1RFU1RTIGhhcyBub3RoaW5nIHRvIGluc3RhbGwhKSkpCiBlbmRpZgogCi0jIGJ1aWxkL2NvcmUvTWFrZWZpbGUgY29udGFpbnMgZXh0cmEgc3R1ZmYgdGhhdCB3ZSBkb24ndCB3YW50IHRvIHBvbGx1dGUgdGhpcworIyBidWlsZC9tYWtlL2NvcmUvTWFrZWZpbGUgY29udGFpbnMgZXh0cmEgc3R1ZmYgdGhhdCB3ZSBkb24ndCB3YW50IHRvIHBvbGx1dGUgdGhpcwogIyB0b3AtbGV2ZWwgbWFrZWZpbGUgd2l0aC4gIEl0IGV4cGVjdHMgdGhhdCBBTExfREVGQVVMVF9JTlNUQUxMRURfTU9EVUxFUwogIyBjb250YWlucyBldmVyeXRoaW5nIHRoYXQncyBidWlsdCBkdXJpbmcgdGhlIGN1cnJlbnQgbWFrZSwgYnV0IGl0IGFsc28gZnVydGhlcgogIyBleHRlbmRzIEFMTF9ERUZBVUxUX0lOU1RBTExFRF9NT0RVTEVTLgpAQCAtOTgzLDYgKzEwODksOSBAQAogLlBIT05ZOiB2ZW5kb3JpbWFnZQogdmVuZG9yaW1hZ2U6ICQoSU5TVEFMTEVEX1ZFTkRPUklNQUdFX1RBUkdFVCkKIAorLlBIT05ZOiBwcm9kdWN0aW1hZ2UKK3Byb2R1Y3RpbWFnZTogJChJTlNUQUxMRURfUFJPRFVDVElNQUdFX1RBUkdFVCkKKwogLlBIT05ZOiBzeXN0ZW1vdGhlcmltYWdlCiBzeXN0ZW1vdGhlcmltYWdlOiAkKElOU1RBTExFRF9TWVNURU1PVEhFUklNQUdFX1RBUkdFVCkKIApAQCAtMTAwNiwxMCArMTExNSwxMyBAQAogCSQoSU5TVEFMTEVEX0NBQ0hFSU1BR0VfVEFSR0VUKSBcCiAJJChJTlNUQUxMRURfQlBUSU1BR0VfVEFSR0VUKSBcCiAJJChJTlNUQUxMRURfVkVORE9SSU1BR0VfVEFSR0VUKSBcCisJJChJTlNUQUxMRURfUFJPRFVDVElNQUdFX1RBUkdFVCkgXAogCSQoSU5TVEFMTEVEX1NZU1RFTU9USEVSSU1BR0VfVEFSR0VUKSBcCiAJJChJTlNUQUxMRURfRklMRVNfRklMRSkgXAogCSQoSU5TVEFMTEVEX0ZJTEVTX0ZJTEVfVkVORE9SKSBcCi0JJChJTlNUQUxMRURfRklMRVNfRklMRV9TWVNURU1PVEhFUikKKwkkKElOU1RBTExFRF9GSUxFU19GSUxFX1BST0RVQ1QpIFwKKwkkKElOU1RBTExFRF9GSUxFU19GSUxFX1NZU1RFTU9USEVSKSBcCisJc29vbmdfZG9jcwogCiAjIGRpc3RfZmlsZXMgb25seSBmb3IgcHV0dGluZyB5b3VyIGxpYnJhcnkgaW50byB0aGUgZGlzdCBkaXJlY3Rvcnkgd2l0aCBhIGZ1bGwgYnVpbGQuCiAuUEhPTlk6IGRpc3RfZmlsZXMKQEAgLTEwMzcsMTMgKzExNDksOCBAQAogICAkKGNhbGwgZGlzdC1mb3ItZ29hbHMsYXBwc19vbmx5LCAkKGFwcHNfb25seV9kaXN0X2J1aWx0X2ZpbGVzKSkKIAogICBpZmVxICgkKEVNTUFfSU5TVFJVTUVOVCksdHJ1ZSkKLSAgICBpZmVxICgkKEFORFJPSURfQ09NUElMRV9XSVRIX0pBQ0spLGZhbHNlKQotICAgICAgJChKQUNPQ09fUkVQT1JUX0NMQVNTRVNfQUxMKSA6ICQoYXBwc19vbmx5X2luc3RhbGxlZF9maWxlcykKLSAgICAgICQoY2FsbCBkaXN0LWZvci1nb2FscyxhcHBzX29ubHksICQoSkFDT0NPX1JFUE9SVF9DTEFTU0VTX0FMTCkpCi0gICAgZWxzZQotICAgICAgJChFTU1BX01FVEFfWklQKSA6ICQoYXBwc19vbmx5X2luc3RhbGxlZF9maWxlcykKLSAgICAgICQoY2FsbCBkaXN0LWZvci1nb2FscyxhcHBzX29ubHksICQoRU1NQV9NRVRBX1pJUCkpCi0gICAgZW5kaWYKKyAgICAkKEpBQ09DT19SRVBPUlRfQ0xBU1NFU19BTEwpIDogJChhcHBzX29ubHlfaW5zdGFsbGVkX2ZpbGVzKQorICAgICQoY2FsbCBkaXN0LWZvci1nb2FscyxhcHBzX29ubHksICQoSkFDT0NPX1JFUE9SVF9DTEFTU0VTX0FMTCkpCiAgIGVuZGlmCiAKICAgJChQUk9HVUFSRF9ESUNUX1pJUCkgOiAkKGFwcHNfb25seV9pbnN0YWxsZWRfZmlsZXMpCkBAIC0xMDc4LDYgKzExODUsNyBAQAogICAgICQoQ09WRVJBR0VfWklQKSBcCiAgICAgJChJTlNUQUxMRURfRklMRVNfRklMRSkgXAogICAgICQoSU5TVEFMTEVEX0ZJTEVTX0ZJTEVfVkVORE9SKSBcCisgICAgJChJTlNUQUxMRURfRklMRVNfRklMRV9QUk9EVUNUKSBcCiAgICAgJChJTlNUQUxMRURfRklMRVNfRklMRV9TWVNURU1PVEhFUikgXAogICAgICQoSU5TVEFMTEVEX0JVSUxEX1BST1BfVEFSR0VUKSBcCiAgICAgJChCVUlMVF9UQVJHRVRfRklMRVNfUEFDS0FHRSkgXApAQCAtMTEwMCwxMyArMTIwOCw4IEBACiAgIGVuZGlmCiAKICAgaWZlcSAoJChFTU1BX0lOU1RSVU1FTlQpLHRydWUpCi0gICAgaWZlcSAoJChBTkRST0lEX0NPTVBJTEVfV0lUSF9KQUNLKSxmYWxzZSkKLSAgICAgICQoSkFDT0NPX1JFUE9SVF9DTEFTU0VTX0FMTCkgOiAkKElOU1RBTExFRF9TWVNURU1JTUFHRSkKLSAgICAgICQoY2FsbCBkaXN0LWZvci1nb2FscywgZGlzdF9maWxlcywgJChKQUNPQ09fUkVQT1JUX0NMQVNTRVNfQUxMKSkKLSAgICBlbHNlCi0gICAgICAkKEVNTUFfTUVUQV9aSVApIDogJChJTlNUQUxMRURfU1lTVEVNSU1BR0UpCi0gICAgICAkKGNhbGwgZGlzdC1mb3ItZ29hbHMsIGRpc3RfZmlsZXMsICQoRU1NQV9NRVRBX1pJUCkpCi0gICAgZW5kaWYKKyAgICAkKEpBQ09DT19SRVBPUlRfQ0xBU1NFU19BTEwpIDogJChJTlNUQUxMRURfU1lTVEVNSU1BR0UpCisgICAgJChjYWxsIGRpc3QtZm9yLWdvYWxzLCBkaXN0X2ZpbGVzLCAkKEpBQ09DT19SRVBPUlRfQ0xBU1NFU19BTEwpKQogICBlbmRpZgogCiAjIEJ1aWxkaW5nIGEgZnVsbCBzeXN0ZW0tLSB0aGUgZGVmYXVsdCBpcyB0byBidWlsZCBkcm9pZGNvcmUKQEAgLTExNDIsNyArMTI0NSw3IEBACiB0YXJnZXQtbmF0aXZlLXRlc3RzIDogbmF0aXZlLXRhcmdldC10ZXN0cwogdGVzdHMgOiBob3N0LXRlc3RzIHRhcmdldC10ZXN0cwogCi0jIFBob255IHRhcmdldCB0byBydW4gYWxsIGphdmEgY29tcGlsYXRpb25zIHRoYXQgdXNlIGphdmFjIGluc3RlYWQgb2YgamFjay4KKyMgUGhvbnkgdGFyZ2V0IHRvIHJ1biBhbGwgamF2YSBjb21waWxhdGlvbnMgdGhhdCB1c2UgamF2YWMKIC5QSE9OWTogamF2YWMtY2hlY2sKIAogaWZuZXEgKCwkKGZpbHRlciBzYW1wbGVjb2RlLCAkKE1BS0VDTURHT0FMUykpKQpAQCAtMTE2NCw2ICsxMjY3LDkgQEAKIC5QSE9OWTogZmluZGJ1Z3MKIGZpbmRidWdzOiAkKElOVEVSTkFMX0ZJTkRCVUdTX0hUTUxfVEFSR0VUKSAkKElOVEVSTkFMX0ZJTkRCVUdTX1hNTF9UQVJHRVQpCiAKKy5QSE9OWTogZmluZGxzZHVtcHMKK2ZpbmRsc2R1bXBzOiAkKEZJTkRfTFNEVU1QU19GSUxFKQorCiAjeHh4IHNjcmFwZSB0aGlzIGZyb20gQUxMX01PRFVMRV9OQU1FX1RBR1MKIC5QSE9OWTogbW9kdWxlcwogbW9kdWxlczoKZGlmZiAtLWdpdCBhL2NvcmUvbWF0aC5tayBiL2NvcmUvbWF0aC5tawppbmRleCAwNDdkMDQ2Li40NGUwM2NlIDEwMDY0NAotLS0gYS9jb3JlL21hdGgubWsKKysrIGIvY29yZS9tYXRoLm1rCkBAIC00Miw2ICs0MiwxMSBAQAogJChpZiAkKGNhbGwgbWF0aF9pc19udW1iZXIsJCgxKSksLCQoZXJyb3IgT25seSBwb3NpdGl2ZSBpbnRlZ2VycyA8PSAxMDAgYXJlIHN1cHBvcnRlZCAobm90ICQoMSkpKSkKIGVuZGVmCiAKKyMgcmV0dXJuIGEgbGlzdCBjb250YWluaW5nIGludGVnZXJzIHJhbmdpbmcgZnJvbSBbJCgxKSwkKDIpXQorZGVmaW5lIGludF9yYW5nZV9saXN0CiskKGNhbGwgX21hdGhfY2hlY2tfdmFsaWQsJCgxKSkkKGNhbGwgX21hdGhfY2hlY2tfdmFsaWQsJCgyKSkkKHdvcmRsaXN0ICQoMSksJCgyKSwkKF9fTUFUSF9OVU1CRVJTKSkKK2VuZGVmCisKICMkKGNhbGwgX21hdGhfY2hlY2tfdmFsaWQsMCkKICMkKGNhbGwgX21hdGhfY2hlY2tfdmFsaWQsMSkKICMkKGNhbGwgX21hdGhfY2hlY2tfdmFsaWQsMTAwKQpAQCAtNjcsNiArNzIsMTAgQEAKICQoaWYgJChmaWx0ZXIgJCgxKSwkKGNhbGwgbWF0aF9tYXgsJCgxKSwkKDIpKSksdHJ1ZSkKIGVuZGVmCiAKK2RlZmluZSBtYXRoX2x0CiskKGlmICQoY2FsbCBtYXRoX2d0X29yX2VxLCQoMSksJCgyKSksLHRydWUpCitlbmRlZgorCiAjJCh3YXJuaW5nICQoY2FsbCBtYXRoX2d0X29yX2VxLCAyLCAxKSkKICMkKHdhcm5pbmcgJChjYWxsIG1hdGhfZ3Rfb3JfZXEsIDEsIDEpKQogIyQod2FybmluZyAkKGlmICQoY2FsbCBtYXRoX2d0X29yX2VxLCAxLCAyKSxmYWxzZSx0cnVlKSkKQEAgLTc1LDMgKzg0LDY5IEBACiBkZWZpbmUgaW5jX2FuZF9wcmludAogJChzdHJpcCAkKGV2YWwgJCgxKSA6PSAkKCQoMSkpIC4pJCh3b3JkcyAkKCQoMSkpKSkKIGVuZGVmCisKKyMgUmV0dXJucyB0aGUgd29yZHMgaW4gJDIgdGhhdCBhcmUgbnVtYmVycyBhbmQgYXJlIGxlc3MgdGhhbiAkMQorZGVmaW5lIG51bWJlcnNfbGVzc190aGFuCiskKHN0cmlwIFwKKyAgJChmb3JlYWNoIG4sJDIsIFwKKyAgICAkKGlmICQoY2FsbCBtYXRoX2lzX251bWJlciwkKG4pKSwgXAorICAgICAgJChpZiAkKGNhbGwgbWF0aF9sdCwkKG4pLCQoMSkpLCBcCisgICAgICAgICQobikpKSkpCitlbmRlZgorCitfSU5UX0xJTUlUX1dPUkRTIDo9ICQoZm9yZWFjaCBhLHggeCwkKGZvcmVhY2ggYix4IHggeCB4IHggeCB4IHggeCB4IHggeCB4IHggeCB4LFwKKyAgJChmb3JlYWNoIGMseCB4IHggeCB4IHggeCB4IHggeCB4IHggeCB4IHggeCx4IHggeCB4IHggeCB4IHggeCB4IHggeCB4IHggeCB4KSkpCisKK2RlZmluZSBfaW50X2VuY29kZQorJChpZiAkKGZpbHRlciAkKHdvcmRzIHggJChfSU5UX0xJTUlUX1dPUkRTKSksJCh3b3JkcyAkKHdvcmRsaXN0IDEsJCgxKSx4ICQoX0lOVF9MSU1JVF9XT1JEUykpKSksXAorICAkKGNhbGwgcHJldHR5LWVycm9yLGludGVnZXIgZ3JlYXRlciB0aGFuICQod29yZHMgJChfSU5UX0xJTUlUX1dPUkRTKSkgaXMgbm90IHN1cHBvcnRlZCEpLFwKKyAgICAkKHdvcmRsaXN0IDEsJCgxKSwkKF9JTlRfTElNSVRfV09SRFMpKSkKK2VuZGVmCisKKyMgX2ludF9tYXggcmV0dXJucyB0aGUgbWF4aW11bSBvZiB0aGUgdHdvIGFyZ3VtZW50cworIyBpbnB1dDogdHdvICh4KSBsaXN0czsgb3V0cHV0OiBvbmUgKHgpIGxpc3QKKyMgaW50ZWdlciBjYW5ub3QgYmUgcGFzc2VkIGluIGRpcmVjdGx5LiBJdCBoYXMgdG8gYmUgY29udmVydGVkIHVzaW5nIF9pbnRfZW5jb2RlLgorZGVmaW5lIF9pbnRfbWF4CiskKHN1YnN0IHh4LHgsJChqb2luICQoMSksJCgyKSkpCitlbmRlZgorCisjIGZpcnN0IGFyZ3VtZW50IGlzIGdyZWF0ZXIgdGhhbiBzZWNvbmQgYXJndW1lbnQKKyMgb3V0cHV0OiBub24tZW1wdHkgaWYgdHJ1ZQorIyBpbnRlZ2VyIGNhbm5vdCBiZSBwYXNzZWQgaW4gZGlyZWN0bHkuIEl0IGhhcyB0byBiZSBjb252ZXJ0ZWQgdXNpbmcgX2ludF9lbmNvZGUuCitkZWZpbmUgX2ludF9ncmVhdGVyLXRoYW4KKyQoZmlsdGVyLW91dCAkKHdvcmRzICQoMikpLCQod29yZHMgJChjYWxsIF9pbnRfbWF4LCQoMSksJCgyKSkpKQorZW5kZWYKKworIyBmaXJzdCBhcmd1bWVudCBlcXVhbHMgdG8gc2Vjb25kIGFyZ3VtZW50CisjIG91dHB1dDogbm9uLWVtcHR5IGlmIHRydWUKKyMgaW50ZWdlciBjYW5ub3QgYmUgcGFzc2VkIGluIGRpcmVjdGx5LiBJdCBoYXMgdG8gYmUgY29udmVydGVkIHVzaW5nIF9pbnRfZW5jb2RlLgorZGVmaW5lIF9pbnRfZXF1YWwKKyQoZmlsdGVyICQod29yZHMgJCgxKSksJCh3b3JkcyAkKDIpKSkKK2VuZGVmCisKKyMgZmlyc3QgYXJndW1lbnQgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHNlY29uZCBhcmd1bWVudAorIyBvdXRwdXQ6IG5vbi1lbXB0eSBpZiB0cnVlCisjIGludGVnZXIgY2Fubm90IGJlIHBhc3NlZCBpbiBkaXJlY3RseS4gSXQgaGFzIHRvIGJlIGNvbnZlcnRlZCB1c2luZyBfaW50X2VuY29kZS4KK2RlZmluZSBfaW50X2dyZWF0ZXItb3ItZXF1YWwKKyQoY2FsbCBfaW50X2dyZWF0ZXItdGhhbiwkKDEpLCQoMikpJChjYWxsIF9pbnRfZXF1YWwsJCgxKSwkKDIpKQorZW5kZWYKKworZGVmaW5lIGludF9wbHVzCiskKHdvcmRzICQoY2FsbCBfaW50X2VuY29kZSwkKDEpKSAkKGNhbGwgX2ludF9lbmNvZGUsJCgyKSkpCitlbmRlZgorCitkZWZpbmUgaW50X3N1YnRyYWN0CiskKGlmICQoY2FsbCBfaW50X2dyZWF0ZXItb3ItZXF1YWwsJChjYWxsIF9pbnRfZW5jb2RlLCQoMSkpLCQoY2FsbCBfaW50X2VuY29kZSwkKDIpKSksXAorICAkKHdvcmRzICQoZmlsdGVyLW91dCB4eCwkKGpvaW4gJChjYWxsIF9pbnRfZW5jb2RlLCQoMSkpLCQoY2FsbCBfaW50X2VuY29kZSwkKDIpKSkpKSxcCisgICAgJChjYWxsIHByZXR0eS1lcnJvciwkKDEpIHN1YnRyYWN0IHVuZGVyZmxvdyAkKDIpKSkKK2VuZGVmCisKK2RlZmluZSBpbnRfbXVsdGlwbHkKKyQod29yZHMgJChmb3JlYWNoIGEsJChjYWxsIF9pbnRfZW5jb2RlLCQoMSkpLCQoY2FsbCBfaW50X2VuY29kZSwkKDIpKSkpCitlbmRlZgorCitkZWZpbmUgaW50X2RpdmlkZQorJChpZiAkKGZpbHRlciAwLCQoMikpLCQoY2FsbCBwcmV0dHktZXJyb3IsZGl2aXNpb24gYnkgemVybyBpcyBub3QgYWxsb3dlZCEpLCQoc3RyaXAgXAorICAkKGlmICQoY2FsbCBfaW50X2dyZWF0ZXItb3ItZXF1YWwsJChjYWxsIF9pbnRfZW5jb2RlLCQoMSkpLCQoY2FsbCBfaW50X2VuY29kZSwkKDIpKSksIFwKKyAgICAkKGNhbGwgaW50X3BsdXMsJChjYWxsIGludF9kaXZpZGUsJChjYWxsIGludF9zdWJ0cmFjdCwkKDEpLCQoMikpLCQoMikpLDEpLDApKSkKK2VuZGVmCmRpZmYgLS1naXQgYS9jb3JlL25hdGl2ZV90ZXN0X2NvbmZpZ190ZW1wbGF0ZS54bWwgYi9jb3JlL25hdGl2ZV90ZXN0X2NvbmZpZ190ZW1wbGF0ZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTk2MDUyOQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvbmF0aXZlX3Rlc3RfY29uZmlnX3RlbXBsYXRlLnhtbApAQCAtMCwwICsxLDI3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPCEtLSBUaGlzIHRlc3QgY29uZmlnIGZpbGUgaXMgYXV0by1nZW5lcmF0ZWQuIC0tPgorPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IlJ1bnMge01PRFVMRX0uIj4KKyAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLlB1c2hGaWxlUHJlcGFyZXIiPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAiIHZhbHVlPSJ0cnVlIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2giIHZhbHVlPSJ7TU9EVUxFfS0+L2RhdGEvbG9jYWwvdG1wL3tNT0RVTEV9IiAvPgorICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgorCisgICAgPHRlc3QgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLkdUZXN0IiA+CisgICAgICAgIDxvcHRpb24gbmFtZT0ibmF0aXZlLXRlc3QtZGV2aWNlLXBhdGgiIHZhbHVlPSIvZGF0YS9sb2NhbC90bXAiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0ibW9kdWxlLW5hbWUiIHZhbHVlPSJ7TU9EVUxFfSIgLz4KKyAgICA8L3Rlc3Q+Cis8L2NvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9jb3JlL25vX2phdmFfcGF0aC9qYXIgYi9jb3JlL25vX2phdmFfcGF0aC9qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDg1ODYzOTcuLjAwMDAwMDAKLS0tIGEvY29yZS9ub19qYXZhX3BhdGgvamFyCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotamF2YQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvbm9famF2YV9wYXRoL2phcnNpZ25lciBiL2NvcmUvbm9famF2YV9wYXRoL2phcnNpZ25lcgpkZWxldGVkIGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggODU4NjM5Ny4uMDAwMDAwMAotLS0gYS9jb3JlL25vX2phdmFfcGF0aC9qYXJzaWduZXIKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1qYXZhClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9ub19qYXZhX3BhdGgvamF2YSBiL2NvcmUvbm9famF2YV9wYXRoL2phdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGYzNDIyZjMuLjAwMDAwMDAKLS0tIGEvY29yZS9ub19qYXZhX3BhdGgvamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotIyEvYmluL2Jhc2gKLQotZWNobyAiRXJyb3I6IEpBVkFfTk9UX1JFUVVJUkVEPXRydWUsICQoYmFzZW5hbWUgJDApIGlzIHVuYXZhaWxhYmxlLiIgMT4mMgotZXhpdCAxCmRpZmYgLS1naXQgYS9jb3JlL25vX2phdmFfcGF0aC9qYXZhYyBiL2NvcmUvbm9famF2YV9wYXRoL2phdmFjCmRlbGV0ZWQgZmlsZSBtb2RlIDEyMDAwMAppbmRleCA4NTg2Mzk3Li4wMDAwMDAwCi0tLSBhL2NvcmUvbm9famF2YV9wYXRoL2phdmFjCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotamF2YQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvbm9famF2YV9wYXRoL2tleXRvb2wgYi9jb3JlL25vX2phdmFfcGF0aC9rZXl0b29sCmRlbGV0ZWQgZmlsZSBtb2RlIDEyMDAwMAppbmRleCA4NTg2Mzk3Li4wMDAwMDAwCi0tLSBhL2NvcmUvbm9famF2YV9wYXRoL2tleXRvb2wKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1qYXZhClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9ub3RpY2VfZmlsZXMubWsgYi9jb3JlL25vdGljZV9maWxlcy5tawppbmRleCBmODUwZmZmLi4zODNkNzNjIDEwMDY0NAotLS0gYS9jb3JlL25vdGljZV9maWxlcy5taworKysgYi9jb3JlL25vdGljZV9maWxlcy5tawpAQCAtNTcsNyArNTcsNyBAQAogICAgICAgIyBqYXZhbGliLmphciBpcyB0aGUgZGVmYXVsdCBuYW1lIGZvciB0aGUgYnVpbGQgbW9kdWxlIChhbmQgaXNuJ3QgbWVhbmluZ2Z1bCkKICAgICAgICMgSWYgdGhhdCdzIHdoYXQgd2UgaGF2ZSwgc3Vic3RpdHV0ZSB0aGUgbW9kdWxlIG5hbWUgaW5zdGVhZC4gIFRoZXNlIGZpbGVzCiAgICAgICAjIGFyZW4ndCBpbmNsdWRlZCBvbiB0aGUgZGV2aWNlLCBzbyB0aGlzIG5hbWUgaXMgc3ludGhldGljIGFueXdheS4KLSAgICAgIGlmbmVxICgkKGZpbHRlciBqYXZhbGliLmphciBjbGFzc2VzLmphY2ssJChtb2R1bGVfbGVhZikpLCkKKyAgICAgIGlmbmVxICgkKGZpbHRlciBqYXZhbGliLmphciwkKG1vZHVsZV9sZWFmKSksKQogICAgICAgICBtb2R1bGVfbGVhZiA6PSAkKExPQ0FMX01PRFVMRSkuamFyCiAgICAgICBlbmRpZgogICAgICAgbW9kdWxlX2luc3RhbGxlZF9maWxlbmFtZSA6PSBcCmRpZmYgLS1naXQgYS9jb3JlL3BhY2thZ2VfaW50ZXJuYWwubWsgYi9jb3JlL3BhY2thZ2VfaW50ZXJuYWwubWsKaW5kZXggNWM0YWQyOC4uODBkMzg2ZCAxMDA2NDQKLS0tIGEvY29yZS9wYWNrYWdlX2ludGVybmFsLm1rCisrKyBiL2NvcmUvcGFja2FnZV9pbnRlcm5hbC5tawpAQCAtNjAsMTAgKzYwLDYgQEAKIGludGVybWVkaWF0ZXMgOj0gJChjYWxsIGxvY2FsLWludGVybWVkaWF0ZXMtZGlyKQogaW50ZXJtZWRpYXRlcy5DT01NT04gOj0gJChjYWxsIGxvY2FsLWludGVybWVkaWF0ZXMtZGlyLENPTU1PTikKIAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1pbmNsdWRlICQoQlVJTERfU1lTVEVNKS9jb25maWd1cmVfbG9jYWxfamFjay5tawotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KICMgUGFja2FnZSBMT0NBTF9NT0RVTEVfVEFHUyBkZWZhdWx0IHRvIG9wdGlvbmFsCiBMT0NBTF9NT0RVTEVfVEFHUyA6PSAkKHN0cmlwICQoTE9DQUxfTU9EVUxFX1RBR1MpKQogaWZlcSAoJChMT0NBTF9NT0RVTEVfVEFHUyksKQpAQCAtMTE1LDYgKzExMSw4IEBACiAgICAgICAgIGVuZm9yY2VfcnJvX2VuYWJsZWQgOj0KICAgICAgIGVsc2UgaWZlcSAodHJ1ZSwkKExPQ0FMX09ETV9NT0RVTEUpKQogICAgICAgICBlbmZvcmNlX3Jyb19lbmFibGVkIDo9CisgICAgICBlbHNlIGlmZXEgKHRydWUsJChMT0NBTF9QUk9EVUNUX01PRFVMRSkpCisgICAgICAgIGVuZm9yY2VfcnJvX2VuYWJsZWQgOj0KICAgICAgIGVuZGlmCiAgICAgZWxzZSBpZmVxICgkKGZpbHRlciAkKFRBUkdFVF9PVVQpLyUsJChMT0NBTF9NT0RVTEVfUEFUSCkpLCkKICAgICAgIGVuZm9yY2VfcnJvX2VuYWJsZWQgOj0KQEAgLTE1MCw2ICsxNDgsMTAgQEAKIG5lZWRfY29tcGlsZV9hc3NldCA6PSB0cnVlCiBlbmRpZgogCitpZmRlZiBMT0NBTF9BQVBUMl9PTkxZCitMT0NBTF9VU0VfQUFQVDIgOj0gdHJ1ZQorZW5kaWYKKwogbXlfcmVzX3BhY2thZ2UgOj0KIGlmZGVmIExPQ0FMX1VTRV9BQVBUMgogIyBJbiBhYXB0MiB0aGUgbGFzdCB0YWtlcyBwcmVjZWRlbmNlLgpAQCAtMjU5LDEzICsyNjEsNiBAQAogZW5kaWYgIyAhY3VzdG9tCiBMT0NBTF9QUk9HVUFSRF9GTEFHUyA6PSAkKGFkZHByZWZpeCAtaW5jbHVkZSAsJChwcm9ndWFyZF9vcHRpb25zX2ZpbGUpKSAkKExPQ0FMX1BST0dVQVJEX0ZMQUdTKQogCi1pZmRlZiBMT0NBTF9KQUNLX0VOQUJMRUQKLWlmbmRlZiBMT0NBTF9KQUNLX1BST0dVQVJEX0ZMQUdTCi0gICAgTE9DQUxfSkFDS19QUk9HVUFSRF9GTEFHUyA6PSAkKExPQ0FMX1BST0dVQVJEX0ZMQUdTKQotZW5kaWYKLUxPQ0FMX0pBQ0tfUFJPR1VBUkRfRkxBR1MgOj0gJChhZGRwcmVmaXggLWluY2x1ZGUgLCQocHJvZ3VhcmRfb3B0aW9uc19maWxlKSkgJChMT0NBTF9KQUNLX1BST0dVQVJEX0ZMQUdTKQotZW5kaWYgIyBMT0NBTF9KQUNLX0VOQUJMRUQKLQogaWZlcSAodHJ1ZSwkKEVNTUFfSU5TVFJVTUVOVCkpCiBpZm5kZWYgTE9DQUxfRU1NQV9JTlNUUlVNRU5UCiAjIE5vIGphY29jbyBmb3IgdGVzdCBhcGtzLgpAQCAtMjc5LDkgKzI3NCwxMSBAQAogCiBpZmVxICh0cnVlLCQoTE9DQUxfRU1NQV9JTlNUUlVNRU5UKSkKIGlmZXEgKHRydWUsJChFTU1BX0lOU1RSVU1FTlRfU1RBVElDKSkKLWlmbmVxICgkKExPQ0FMX1NSQ19GSUxFUykkKExPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUykkKExPQ0FMX1NPVVJDRV9GSUxFU19BTExfR0VORVJBVEVEKSwpCitpZm5lcSAoJChMT0NBTF9TUkNfRklMRVMpJChMT0NBTF9TUkNKQVJTKSQoTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTKSQoTE9DQUxfU09VUkNFX0ZJTEVTX0FMTF9HRU5FUkFURUQpLCkKICMgT25seSBhZGQgamFjb2NvYWdlbnQgaWYgdGhlIHBhY2thZ2UgY29udGFpbnMgc29tZSBqYXZhIGNvZGUKIExPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyArPSBqYWNvY29hZ2VudAorIyBFeGNsdWRlIGphY29jbyBjbGFzc2VzIGZyb20gcHJvZ3VhcmQKK0xPQ0FMX1BST0dVQVJEX0ZMQUdTICs9IC1pbmNsdWRlICQoQlVJTERfU1lTVEVNKS9wcm9ndWFyZC5qYWNvY28uZmxhZ3MKIGVuZGlmICMgQ29udGFpbnMgamF2YSBjb2RlCiBlbHNlCiBpZmRlZiBMT0NBTF9TREtfVkVSU0lPTgpAQCAtMjkyLDIwICsyODksOCBAQAogTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTICs9IGphY29jb2FnZW50CiAjIEV4Y2x1ZGUgamFjb2NvIGNsYXNzZXMgZnJvbSBwcm9ndWFyZAogTE9DQUxfUFJPR1VBUkRfRkxBR1MgKz0gLWluY2x1ZGUgJChCVUlMRF9TWVNURU0pL3Byb2d1YXJkLmphY29jby5mbGFncwotTE9DQUxfSkFDS19QUk9HVUFSRF9GTEFHUyArPSAtaW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvcHJvZ3VhcmQuamFjb2NvLmZsYWdzCiBlbmRpZiAjIENvbnRhaW5zIGphdmEgY29kZQotZWxzZSAgIyAhIFRBUkdFVF9CVUlMRF9BUFBTCi1pZmRlZiBMT0NBTF9KQUNLX0VOQUJMRUQKLSMgSWYgYnVpbGQgYWdhaW5zdCB0aGUgU0RLIGluIGZ1bGwgYnVpbGQsIGNvcmUuamFyIGlzIG5vdCB1c2VkCi0jIHNvIGNvdmVyYWdlIGNsYXNzZXMgYXJlIG5vdCBwcmVzZW50LgotIyBKYWNrIG5lZWRzIGphY29jbyBvbiB0aGUgY2xhc3NwYXRoIGJ1dCB3ZSBkbyBub3Qgd2FudCBpdCB0byBiZSBpbgotIyB0aGUgZmluYWwgYXBrLiBXaGlsZSBpdCBpcyBhIHN0YXRpYyBsaWJyYXJ5LCB3ZSBhZGQgaXQgdG8gdGhlCi0jIExPQ0FMX0pBVkFfTElCUkFSSUVTIHdoaWNoIGFyZSBvbmx5IHByZXNlbnQgb24gdGhlIGNsYXNzcGF0aC4KLSMgTm90ZTogd2UgaGF2ZSBub3RoaW5nIHRvIGRvIGZvciBwcm9ndWFyZCBzaW5jZSBqYWNvY28gd2lsbCBiZQotIyBvbiB0aGUgY2xhc3NwYXRoIG9ubHksIHRodXMgbm90IG1vZGlmaWVkIGR1cmluZyB0aGUgY29tcGlsYXRpb24uCi1MT0NBTF9KQVZBX0xJQlJBUklFUyArPSBqYWNvY29hZ2VudAotZW5kaWYgIyAhIExPQ0FMX0pBQ0tfRU5BQkxFRAotZW5kaWYgIyAhIFRBUkdFVF9CVUlMRF9BUFBTCitlbmRpZiAjIFRBUkdFVF9CVUlMRF9BUFBTCiBlbmRpZiAjIExPQ0FMX1NES19WRVJTSU9OCiBlbmRpZiAjIEVNTUFfSU5TVFJVTUVOVF9TVEFUSUMKIGVuZGlmICMgTE9DQUxfRU1NQV9JTlNUUlVNRU5UCkBAIC0zMTYsNyArMzAxLDYgQEAKIGRhdGFfYmluZGluZ19pbnRlcm1lZGlhdGVzIDo9ICQoaW50ZXJtZWRpYXRlcy5DT01NT04pL2RhdGEtYmluZGluZwogCiBMT0NBTF9KQVZBQ0ZMQUdTICs9IC1wcm9jZXNzb3JwYXRoICQoREFUQV9CSU5ESU5HX0NPTVBJTEVSKSAtcyAkKGRhdGFfYmluZGluZ19pbnRlcm1lZGlhdGVzKS9hbm5vLXNyYwotTE9DQUxfSkFDS19GTEFHUyArPSAtLXByb2Nlc3NvcnBhdGggJChEQVRBX0JJTkRJTkdfQ09NUElMRVIpCiAKIExPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyArPSBkYXRhYmluZGluZy1iYXNlbGlicmFyeQogTE9DQUxfU1RBVElDX0pBVkFfQUFSX0xJQlJBUklFUyArPSBkYXRhYmluZGluZy1saWJyYXJ5IGRhdGFiaW5kaW5nLWFkYXB0ZXJzCkBAIC0zMzAsNiArMzE0LDkgQEAKIExPQ0FMX0FBUFRfRkxBR1MgKz0gLS1hdXRvLWFkZC1vdmVybGF5IC0tZXh0cmEtcGFja2FnZXMgY29tLmFuZHJvaWQuZGF0YWJpbmRpbmcubGlicmFyeQogZW5kaWYgICMgTE9DQUxfREFUQV9CSU5ESU5HCiAKKyMgUHJvY2VzcyBTdXBwb3J0IExpYnJhcnkgZGVwZW5kZW5jaWVzLgoraW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvc3VwcG9ydF9saWJyYXJpZXMubWsKKwogIyBJZiB0aGUgbW9kdWxlIGlzIGEgY29tcHJlc3NlZCBtb2R1bGUsIHdlIGRvbid0IHByZS1vcHQgaXQgYmVjYXVzZSBpdHMgZmluYWwKICMgaW5zdGFsbGF0aW9uIGxvY2F0aW9uIHdpbGwgYmUgdGhlIGRhdGEgcGFydGl0aW9uLgogaWZkZWYgTE9DQUxfQ09NUFJFU1NFRF9NT0RVTEUKQEAgLTMzOCwxMiArMzI1LDEyMyBAQAogCiBpbmNsdWRlICQoQlVJTERfU1lTVEVNKS9hbmRyb2lkX21hbmlmZXN0Lm1rCiAKK3Jlc291cmNlX2V4cG9ydF9wYWNrYWdlIDo9CisKK2luY2x1ZGUgJChCVUlMRF9TWVNURU0pL2phdmFfcmVuZGVyc2NyaXB0Lm1rCisKK2luY2x1ZGUgJChCVUlMRF9TWVNURU0pL2FhcHRfZmxhZ3MubWsKKworaWZlcSAoJChuZWVkX2NvbXBpbGVfcmVzKSx0cnVlKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyBBUEsgc3BsaXRzCitidWlsdF9hcGtfc3BsaXRzIDo9CitpbnN0YWxsZWRfYXBrX3NwbGl0cyA6PQorbXlfYXBrX3NwbGl0X2NvbmZpZ3MgOj0KKworaWZkZWYgTE9DQUxfUEFDS0FHRV9TUExJVFMKK2lmZGVmIExPQ0FMX0NPTVBSRVNTRURfTU9EVUxFCiskKGVycm9yICQoTE9DQUxfTU9EVUxFKTogTE9DQUxfQ09NUFJFU1NFRF9NT0RVTEUgaXMgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQgZm9yIHNwbGl0IGluc3RhbGxzKQorZW5kaWYgICMgTE9DQUxfQ09NUFJFU1NFRF9NT0RVTEUKKworbXlfYXBrX3NwbGl0X2NvbmZpZ3MgOj0gJChMT0NBTF9QQUNLQUdFX1NQTElUUykKK215X3NwbGl0X3N1ZmZpeGVzIDo9ICQoc3Vic3QgJChjb21tYSksXywkKG15X2Fwa19zcGxpdF9jb25maWdzKSkKK2J1aWx0X2Fwa19zcGxpdHMgOj0gJChmb3JlYWNoIHMsJChteV9zcGxpdF9zdWZmaXhlcyksJChpbnRlcm1lZGlhdGVzKS9wYWNrYWdlXyQocykuYXBrKQorZW5kaWYKKworJChSX2ZpbGVfc3RhbXApICQobXlfcmVzX3BhY2thZ2UpOiBQUklWQVRFX0FBUFRfRkxBR1MgOj0gJChMT0NBTF9BQVBUX0ZMQUdTKQorJChSX2ZpbGVfc3RhbXApICQobXlfcmVzX3BhY2thZ2UpOiBQUklWQVRFX1RBUkdFVF9BQVBUX0NIQVJBQ1RFUklTVElDUyA6PSAkKFRBUkdFVF9BQVBUX0NIQVJBQ1RFUklTVElDUykKKyQoUl9maWxlX3N0YW1wKSAkKG15X3Jlc19wYWNrYWdlKTogUFJJVkFURV9NQU5JRkVTVF9QQUNLQUdFX05BTUUgOj0gJChMT0NBTF9NQU5JRkVTVF9QQUNLQUdFX05BTUUpCiskKFJfZmlsZV9zdGFtcCkgJChteV9yZXNfcGFja2FnZSk6IFBSSVZBVEVfTUFOSUZFU1RfSU5TVFJVTUVOVEFUSU9OX0ZPUiA6PSAkKExPQ0FMX01BTklGRVNUX0lOU1RSVU1FTlRBVElPTl9GT1IpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIEFBUFQvQUFQVDIKKworaWZkZWYgTE9DQUxfVVNFX0FBUFQyCisgIG15X2NvbXBpbGVkX3Jlc19iYXNlX2RpciA6PSAkKGludGVybWVkaWF0ZXMuQ09NTU9OKS9mbGF0LXJlcworICBpZm5lcSAoLCQocmVuZGVyc2NyaXB0X3RhcmdldF9hcGkpKQorICAgIGlmbmVxICgkKGNhbGwgbWF0aF9ndF9vcl9lcSwkKHJlbmRlcnNjcmlwdF90YXJnZXRfYXBpKSwyMSksdHJ1ZSkKKyAgICAgIG15X2dlbmVyYXRlZF9yZXNfemlwcyA6PSAkKHJzX2dlbmVyYXRlZF9yZXNfemlwKQorICAgIGVuZGlmICAjIHJlbmRlcnNjcmlwdF90YXJnZXRfYXBpIDwgMjEKKyAgZW5kaWYgICMgcmVuZGVyc2NyaXB0X3RhcmdldF9hcGkgaXMgc2V0CisgIG15X2Fzc2V0X2RpcnMgOj0gJChMT0NBTF9BU1NFVF9ESVIpCisgIG15X2Z1bGxfYXNzZXRfcGF0aHMgOj0gJChhbGxfYXNzZXRzKQorCisgICMgQWRkIEFBUFQyIGxpbmsgc3BlY2lmaWMgZmxhZ3MuCisgICQobXlfcmVzX3BhY2thZ2UpOiBQUklWQVRFX0FBUFRfRkxBR1MgOj0gJChMT0NBTF9BQVBUX0ZMQUdTKQorICBpZm5kZWYgTE9DQUxfQUFQVF9OQU1FU1BBQ0VTCisgICAgJChteV9yZXNfcGFja2FnZSk6IFBSSVZBVEVfQUFQVF9GTEFHUyArPSAtLW5vLXN0YXRpYy1saWItcGFja2FnZXMKKyAgZW5kaWYKKworICBpbmNsdWRlICQoQlVJTERfU1lTVEVNKS9hYXB0Mi5taworZWxzZSAgIyBMT0NBTF9VU0VfQUFQVDIKKworICBteV9zcmNqYXIgOj0gJChpbnRlcm1lZGlhdGVzLkNPTU1PTikvYWFwdC5zcmNqYXIKKyAgTE9DQUxfU1JDSkFSUyArPSAkKG15X3NyY2phcikKKyAgJChSX2ZpbGVfc3RhbXApOiBQUklWQVRFX1NSQ0pBUiA6PSAkKG15X3NyY2phcikKKyAgJChSX2ZpbGVfc3RhbXApOiBQUklWQVRFX0pBVkFfR0VOX0RJUiA6PSAkKGludGVybWVkaWF0ZXMuQ09NTU9OKS9hYXB0CisgICQoUl9maWxlX3N0YW1wKTogLktBVElfSU1QTElDSVRfT1VUUFVUUyA6PSAkKG15X3NyY2phcikKKyAgIyBTaW5jZSB3ZSBkb24ndCBrbm93IHdoZXJlIHRoZSByZWFsIFIuamF2YSBmaWxlIGlzIGdvaW5nIHRvIGVuZCB1cCwKKyAgIyB3ZSBuZWVkIHRvIHVzZSBhbm90aGVyIGZpbGUgdG8gc3RhbmQgaW4gaXRzIHBsYWNlLiAgV2UnbGwganVzdAorICAjIGNvcHkgdGhlIGdlbmVyYXRlZCBmaWxlIHRvIHNyYy9SLnN0YW1wLCB3aGljaCBtZWFucyBpdCB3aWxsCisgICMgaGF2ZSB0aGUgc2FtZSBjb250ZW50cyBhbmQgdGltZXN0YW1wIGFzIHRoZSBhY3R1YWwgZmlsZS4KKyAgIworICAjIEF0IHRoZSBzYW1lIHRpbWUsIHRoaXMgd2lsbCBjb3B5IHRoZSBSLmphdmEgZmlsZSB0byBhIGNlbnRyYWwKKyAgIyAnUicgZGlyZWN0b3J5IHRvIG1ha2UgaXQgZWFzaWVyIHRvIGFkZCB0aGUgZmlsZXMgdG8gYW4gSURFLgorICAjCisKKyAgJChSX2ZpbGVfc3RhbXApOiBQUklWQVRFX1JFU09VUkNFX1BVQkxJQ1NfT1VUUFVUIDo9IFwKKwkJCSQoaW50ZXJtZWRpYXRlcy5DT01NT04pL3B1YmxpY19yZXNvdXJjZXMueG1sCisgICQoUl9maWxlX3N0YW1wKTogUFJJVkFURV9QUk9HVUFSRF9PUFRJT05TX0ZJTEUgOj0gJChwcm9ndWFyZF9vcHRpb25zX2ZpbGUpCisgICQoUl9maWxlX3N0YW1wKTogUFJJVkFURV9SRVNPVVJDRV9MSVNUIDo9ICQoYWxsX3Jlc19hc3NldHMpCisgICQoUl9maWxlX3N0YW1wKTogJChhbGxfcmVzX2Fzc2V0cykgJChmdWxsX2FuZHJvaWRfbWFuaWZlc3QpICQocnNfZ2VuZXJhdGVkX3Jlc196aXApICQoQUFQVCkgJChTT09OR19aSVApIHwgJChBQ1ApCisJQGVjaG8gInRhcmdldCBSLmphdmEvTWFuaWZlc3QuamF2YTogJChQUklWQVRFX01PRFVMRSkgKCRAKSIKKwlAcm0gLXJmICRAICYmIG1rZGlyIC1wICQoZGlyICRAKQorCSQoY3JlYXRlLXJlc291cmNlLWphdmEtZmlsZXMpCisJJChjYWxsIGZpbmQtZ2VuZXJhdGVkLVIuamF2YSwkKFBSSVZBVEVfSkFWQV9HRU5fRElSKSwkQCkKKworICAkKHByb2d1YXJkX29wdGlvbnNfZmlsZSk6ICQoUl9maWxlX3N0YW1wKQorCisgIGlmZGVmIExPQ0FMX0VYUE9SVF9QQUNLQUdFX1JFU09VUkNFUworICAgICMgUHV0IHRoaXMgbW9kdWxlJ3MgcmVzb3VyY2VzIGludG8gYSBQUk9EVUNULWFnbm9zaXRjIHBhY2thZ2UgdGhhdAorICAgICMgb3RoZXIgcGFja2FnZXMgY2FuIHVzZSB0byBidWlsZCB0aGVpciBvd24gUFJPRFVDVC1hZ25vc3RpYyBSLmphdmEgKGV0Yy4pCisgICAgIyBmaWxlcy4KKyAgICByZXNvdXJjZV9leHBvcnRfcGFja2FnZSA6PSAkKGludGVybWVkaWF0ZXMuQ09NTU9OKS9wYWNrYWdlLWV4cG9ydC5hcGsKKyAgICAkKFJfZmlsZV9zdGFtcCk6ICQocmVzb3VyY2VfZXhwb3J0X3BhY2thZ2UpCisKKyAgICAjIGFkZC1hc3NldHMtdG8tcGFja2FnZSBsb29rcyBhdCBQUk9EVUNUX0FBUFRfQ09ORklHLCBidXQgdGhpcyB0YXJnZXQKKyAgICAjIGNhbid0IGtub3cgYW55dGhpbmcgYWJvdXQgUFJPRFVDVC4gIENsZWFyIGl0IG91dCBqdXN0IGZvciB0aGlzIHRhcmdldC4KKyAgICAkKHJlc291cmNlX2V4cG9ydF9wYWNrYWdlKTogUFJJVkFURV9QUk9EVUNUX0FBUFRfQ09ORklHIDo9CisgICAgJChyZXNvdXJjZV9leHBvcnRfcGFja2FnZSk6IFBSSVZBVEVfUFJPRFVDVF9BQVBUX1BSRUZfQ09ORklHIDo9CisgICAgJChyZXNvdXJjZV9leHBvcnRfcGFja2FnZSk6IFBSSVZBVEVfUkVTT1VSQ0VfTElTVCA6PSAkKGFsbF9yZXNfYXNzZXRzKQorICAgICQocmVzb3VyY2VfZXhwb3J0X3BhY2thZ2UpOiAkKGFsbF9yZXNfYXNzZXRzKSAkKGZ1bGxfYW5kcm9pZF9tYW5pZmVzdCkgJChyc19nZW5lcmF0ZWRfcmVzX3ppcCkgJChBQVBUKQorCUBlY2hvICJ0YXJnZXQgRXhwb3J0IFJlc291cmNlczogJChQUklWQVRFX01PRFVMRSkgKCRAKSIKKwkkKGNyZWF0ZS1lbXB0eS1wYWNrYWdlKQorCSQoYWRkLWFzc2V0cy10by1wYWNrYWdlKQorICBlbmRpZgorCitlbmRpZiAgIyBMT0NBTF9VU0VfQUFQVDIKKworZW5kaWYgICMgbmVlZF9jb21waWxlX3JlcworCiBjYWxsZWRfZnJvbV9wYWNrYWdlX2ludGVybmFsIDo9IHRydWUKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogaW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvamF2YS5tawogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiBjYWxsZWRfZnJvbV9wYWNrYWdlX2ludGVybmFsIDo9CiAKK2lmZXEgKCQobmVlZF9jb21waWxlX3JlcyksdHJ1ZSkKKworIyBPdGhlciBtb2R1bGVzIHNob3VsZCBkZXBlbmQgb24gdGhlIEJVSUxUIG1vZHVsZSBpZgorIyB0aGV5IHdhbnQgdG8gdXNlIHRoaXMgbW9kdWxlJ3MgUi5qYXZhIGZpbGUuCiskKExPQ0FMX0JVSUxUX01PRFVMRSk6ICQoUl9maWxlX3N0YW1wKQorCisjIFRoZSBSLmphdmEgZmlsZSBtdXN0IGV4aXN0IGJ5IHRoZSB0aW1lIHRoZSBqYXZhIHNvdXJjZQorIyBsaXN0IGlzIGdlbmVyYXRlZAorJChqYXZhX3NvdXJjZV9saXN0X2ZpbGUpOiAkKFJfZmlsZV9zdGFtcCkKKworZW5kaWYgIyBuZWVkX2NvbXBpbGVfcmVzCisKIExPQ0FMX1NES19SRVNfVkVSU0lPTjo9JChzdHJpcCAkKExPQ0FMX1NES19SRVNfVkVSU0lPTikpCiBpZmVxICgkKExPQ0FMX1NES19SRVNfVkVSU0lPTiksKQogICBMT0NBTF9TREtfUkVTX1ZFUlNJT046PSQoTE9DQUxfU0RLX1ZFUlNJT04pCkBAIC0zNzUsMTUyICs0NzMsMzYgQEAKIAkkKGhpZGUpIHRvdWNoICRACiAKICMgTWFrZSBzdXJlIHRoZSBkYXRhLWJpbmRpbmcgcHJvY2VzcyBoYXBwZW5zIGJlZm9yZSBqYXZhYyBhbmQgZ2VuZXJhdGlvbiBvZiBSLmphdmEuCi0kKFJfZmlsZV9zdGFtcCkgJChmdWxsX2NsYXNzZXNfY29tcGlsZWRfamFyKSA6ICQoZGF0YV9iaW5kaW5nX3N0YW1wKQotIyBUaGUgZGVwZW5kZW5jeSBwYXRoIHdoZW4gamFjayBpcyBlbmFibGVkCi0kKGJ1aWx0X2RleF9pbnRlcm1lZGlhdGUpIDogJChkYXRhX2JpbmRpbmdfc3RhbXApCiskKFJfZmlsZV9zdGFtcCk6ICQoZGF0YV9iaW5kaW5nX3N0YW1wKQorJChqYXZhX3NvdXJjZV9saXN0X2ZpbGUpOiAkKGRhdGFfYmluZGluZ19zdGFtcCkKKyQoZnVsbF9jbGFzc2VzX2NvbXBpbGVkX2phcik6ICQoZGF0YV9iaW5kaW5nX3N0YW1wKQogZW5kaWYgICMgTE9DQUxfREFUQV9CSU5ESU5HCiAKLWlmZXEgKCQobmVlZF9jb21waWxlX3JlcyksdHJ1ZSkKK2ZyYW1ld29ya19yZXNfcGFja2FnZV9leHBvcnQgOj0KIAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyMgQVBLIHNwbGl0cwotYnVpbHRfYXBrX3NwbGl0cyA6PQotaW5zdGFsbGVkX2Fwa19zcGxpdHMgOj0KLW15X2Fwa19zcGxpdF9jb25maWdzIDo9Ci0KLWlmZGVmIExPQ0FMX1BBQ0tBR0VfU1BMSVRTCi1pZmRlZiBMT0NBTF9DT01QUkVTU0VEX01PRFVMRQotJChlcnJvciAkKExPQ0FMX01PRFVMRSk6IExPQ0FMX0NPTVBSRVNTRURfTU9EVUxFIGlzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkIGZvciBzcGxpdCBpbnN0YWxscykKLWVuZGlmICAjIExPQ0FMX0NPTVBSRVNTRURfTU9EVUxFCi0KLW15X2Fwa19zcGxpdF9jb25maWdzIDo9ICQoTE9DQUxfUEFDS0FHRV9TUExJVFMpCi1teV9zcGxpdF9zdWZmaXhlcyA6PSAkKHN1YnN0ICQoY29tbWEpLF8sJChteV9hcGtfc3BsaXRfY29uZmlncykpCi1idWlsdF9hcGtfc3BsaXRzIDo9ICQoZm9yZWFjaCBzLCQobXlfc3BsaXRfc3VmZml4ZXMpLCQoaW50ZXJtZWRpYXRlcykvcGFja2FnZV8kKHMpLmFwaykKLWluc3RhbGxlZF9hcGtfc3BsaXRzIDo9ICQoZm9yZWFjaCBzLCQobXlfc3BsaXRfc3VmZml4ZXMpLCQobXlfbW9kdWxlX3BhdGgpLyQoTE9DQUxfTU9EVUxFKV8kKHMpLmFwaykKLWVuZGlmCi0KLWlmZGVmIExPQ0FMX1VTRV9BQVBUMgotbXlfY29tcGlsZWRfcmVzX2Jhc2VfZGlyIDo9ICQoaW50ZXJtZWRpYXRlcykvZmxhdC1yZXMKLXJlbmRlcnNjcmlwdF90YXJnZXRfYXBpIDo9Ci1pZm5lcSAoLCQoTE9DQUxfUkVOREVSU0NSSVBUX1RBUkdFVF9BUEkpKQotcmVuZGVyc2NyaXB0X3RhcmdldF9hcGkgOj0gJChMT0NBTF9SRU5ERVJTQ1JJUFRfVEFSR0VUX0FQSSkKLWVsc2UKLWlmbmVxICgsJChMT0NBTF9TREtfVkVSU0lPTikpCi0jIFNldCB0YXJnZXQtYXBpIGZvciBMT0NBTF9TREtfVkVSU0lPTnMgb3RoZXIgdGhhbiBjdXJyZW50LgotaWZuZXEgKCwkKGZpbHRlci1vdXQgY3VycmVudCBzeXN0ZW1fY3VycmVudCB0ZXN0X2N1cnJlbnQsICQoTE9DQUxfU0RLX1ZFUlNJT04pKSkKLXJlbmRlcnNjcmlwdF90YXJnZXRfYXBpIDo9ICQoTE9DQUxfU0RLX1ZFUlNJT04pCi1lbmRpZgotZW5kaWYgICMgTE9DQUxfU0RLX1ZFUlNJT04gaXMgc2V0Ci1lbmRpZiAgIyBMT0NBTF9SRU5ERVJTQ1JJUFRfVEFSR0VUX0FQSSBpcyBzZXQKLWlmbmVxICgsJChyZW5kZXJzY3JpcHRfdGFyZ2V0X2FwaSkpCi1pZm5lcSAoJChjYWxsIG1hdGhfZ3Rfb3JfZXEsJChyZW5kZXJzY3JpcHRfdGFyZ2V0X2FwaSksMjEpLHRydWUpCi1teV9nZW5lcmF0ZWRfcmVzX2RpcnMgOj0gJChyc19nZW5lcmF0ZWRfcmVzX2RpcikKLW15X2dlbmVyYXRlZF9yZXNfZGlyc19kZXBzIDo9ICQoUmVuZGVyU2NyaXB0X2ZpbGVfc3RhbXApCi1lbmRpZiAgIyByZW5kZXJzY3JpcHRfdGFyZ2V0X2FwaSA8IDIxCi1lbmRpZiAgIyByZW5kZXJzY3JpcHRfdGFyZ2V0X2FwaSBpcyBzZXQKLW15X2Fzc2V0X2RpcnMgOj0gJChMT0NBTF9BU1NFVF9ESVIpCi1teV9mdWxsX2Fzc2V0X3BhdGhzIDo9ICQoYWxsX2Fzc2V0cykKLSMgQWRkIEFBUFQyIGxpbmsgc3BlY2lmaWMgZmxhZ3MuCi0kKG15X3Jlc19wYWNrYWdlKTogUFJJVkFURV9BQVBUX0ZMQUdTIDo9ICQoTE9DQUxfQUFQVF9GTEFHUykgLS1uby1zdGF0aWMtbGliLXBhY2thZ2VzCi1pbmNsdWRlICQoQlVJTERfU1lTVEVNKS9hYXB0Mi5tawotZWxzZSAgIyBMT0NBTF9VU0VfQUFQVDIKLQotIyBTaW5jZSB3ZSBkb24ndCBrbm93IHdoZXJlIHRoZSByZWFsIFIuamF2YSBmaWxlIGlzIGdvaW5nIHRvIGVuZCB1cCwKLSMgd2UgbmVlZCB0byB1c2UgYW5vdGhlciBmaWxlIHRvIHN0YW5kIGluIGl0cyBwbGFjZS4gIFdlJ2xsIGp1c3QKLSMgY29weSB0aGUgZ2VuZXJhdGVkIGZpbGUgdG8gc3JjL1Iuc3RhbXAsIHdoaWNoIG1lYW5zIGl0IHdpbGwKLSMgaGF2ZSB0aGUgc2FtZSBjb250ZW50cyBhbmQgdGltZXN0YW1wIGFzIHRoZSBhY3R1YWwgZmlsZS4KLSMKLSMgQXQgdGhlIHNhbWUgdGltZSwgdGhpcyB3aWxsIGNvcHkgdGhlIFIuamF2YSBmaWxlIHRvIGEgY2VudHJhbAotIyAnUicgZGlyZWN0b3J5IHRvIG1ha2UgaXQgZWFzaWVyIHRvIGFkZCB0aGUgZmlsZXMgdG8gYW4gSURFLgotIwotCi0kKFJfZmlsZV9zdGFtcCk6IFBSSVZBVEVfUkVTT1VSQ0VfUFVCTElDU19PVVRQVVQgOj0gXAotCQkJJChpbnRlcm1lZGlhdGVzLkNPTU1PTikvcHVibGljX3Jlc291cmNlcy54bWwKLSQoUl9maWxlX3N0YW1wKTogUFJJVkFURV9QUk9HVUFSRF9PUFRJT05TX0ZJTEUgOj0gJChwcm9ndWFyZF9vcHRpb25zX2ZpbGUpCi0kKFJfZmlsZV9zdGFtcCk6ICQoYWxsX3Jlc19hc3NldHMpICQoZnVsbF9hbmRyb2lkX21hbmlmZXN0KSAkKFJlbmRlclNjcmlwdF9maWxlX3N0YW1wKSAkKEFBUFQpIHwgJChBQ1ApCi0JQGVjaG8gInRhcmdldCBSLmphdmEvTWFuaWZlc3QuamF2YTogJChQUklWQVRFX01PRFVMRSkgKCRAKSIKLQlAcm0gLXJmICRAICYmIG1rZGlyIC1wICQoZGlyICRAKQotCSQoY3JlYXRlLXJlc291cmNlLWphdmEtZmlsZXMpCi0JJChjYWxsIGZpbmQtZ2VuZXJhdGVkLVIuamF2YSkKLQotJChwcm9ndWFyZF9vcHRpb25zX2ZpbGUpOiAkKFJfZmlsZV9zdGFtcCkKLQotcmVzb3VyY2VfZXhwb3J0X3BhY2thZ2UgOj0KLWlmZGVmIExPQ0FMX0VYUE9SVF9QQUNLQUdFX1JFU09VUkNFUwotIyBQdXQgdGhpcyBtb2R1bGUncyByZXNvdXJjZXMgaW50byBhIFBST0RVQ1QtYWdub3NpdGMgcGFja2FnZSB0aGF0Ci0jIG90aGVyIHBhY2thZ2VzIGNhbiB1c2UgdG8gYnVpbGQgdGhlaXIgb3duIFBST0RVQ1QtYWdub3N0aWMgUi5qYXZhIChldGMuKQotIyBmaWxlcy4KLXJlc291cmNlX2V4cG9ydF9wYWNrYWdlIDo9ICQoaW50ZXJtZWRpYXRlcy5DT01NT04pL3BhY2thZ2UtZXhwb3J0LmFwawotJChSX2ZpbGVfc3RhbXApOiAkKHJlc291cmNlX2V4cG9ydF9wYWNrYWdlKQotCi0jIGFkZC1hc3NldHMtdG8tcGFja2FnZSBsb29rcyBhdCBQUk9EVUNUX0FBUFRfQ09ORklHLCBidXQgdGhpcyB0YXJnZXQKLSMgY2FuJ3Qga25vdyBhbnl0aGluZyBhYm91dCBQUk9EVUNULiAgQ2xlYXIgaXQgb3V0IGp1c3QgZm9yIHRoaXMgdGFyZ2V0LgotJChyZXNvdXJjZV9leHBvcnRfcGFja2FnZSk6IFBSSVZBVEVfUFJPRFVDVF9BQVBUX0NPTkZJRyA6PQotJChyZXNvdXJjZV9leHBvcnRfcGFja2FnZSk6IFBSSVZBVEVfUFJPRFVDVF9BQVBUX1BSRUZfQ09ORklHIDo9Ci0kKHJlc291cmNlX2V4cG9ydF9wYWNrYWdlKTogJChhbGxfcmVzX2Fzc2V0cykgJChmdWxsX2FuZHJvaWRfbWFuaWZlc3QpICQoUmVuZGVyU2NyaXB0X2ZpbGVfc3RhbXApICQoQUFQVCkKLQlAZWNobyAidGFyZ2V0IEV4cG9ydCBSZXNvdXJjZXM6ICQoUFJJVkFURV9NT0RVTEUpICgkQCkiCi0JJChjcmVhdGUtZW1wdHktcGFja2FnZSkKLQkkKGFkZC1hc3NldHMtdG8tcGFja2FnZSkKLWVuZGlmCi0KLWVuZGlmICAjIExPQ0FMX1VTRV9BQVBUMgotCi0jIE90aGVyIG1vZHVsZXMgc2hvdWxkIGRlcGVuZCBvbiB0aGUgQlVJTFQgbW9kdWxlIGlmCi0jIHRoZXkgd2FudCB0byB1c2UgdGhpcyBtb2R1bGUncyBSLmphdmEgZmlsZS4KLSQoTE9DQUxfQlVJTFRfTU9EVUxFKTogJChSX2ZpbGVfc3RhbXApCi0KLWlmZGVmIExPQ0FMX0pBQ0tfRU5BQkxFRAotaWZuZXEgKCQoYnVpbHRfZGV4X2ludGVybWVkaWF0ZSksKQotJChidWlsdF9kZXhfaW50ZXJtZWRpYXRlKTogJChSX2ZpbGVfc3RhbXApCi1lbmRpZgotaWZuZXEgKCQobm9zaHJvYl9jbGFzc2VzX2phY2spLCkKLSQobm9zaHJvYl9jbGFzc2VzX2phY2spOiAkKFJfZmlsZV9zdGFtcCkKLWVuZGlmCi1pZm5lcSAoJChmdWxsX2NsYXNzZXNfamFjayksKQotJChmdWxsX2NsYXNzZXNfamFjayk6ICQoUl9maWxlX3N0YW1wKQotJChqYWNrX2NoZWNrX3RpbWVzdGFtcCk6ICQoUl9maWxlX3N0YW1wKQotZW5kaWYKLWVuZGlmICMgTE9DQUxfSkFDS19FTkFCTEVECi0KLWlmbmVxICgkKGZ1bGxfY2xhc3Nlc19qYXIpLCkKLSMgSWYgZnVsbF9jbGFzc2VzX2phciBpcyBub24tZW1wdHksIHdlJ3JlIGJ1aWxkaW5nIHNvdXJjZXMuCi0jIElmIHdlJ3JlIGJ1aWxkaW5nIHNvdXJjZXMsIHRoZSBpbml0aWFsIGphdmFjIHN0ZXAgKHdoaWNoCi0jIHByb2R1Y2VzIGZ1bGxfY2xhc3Nlc19jb21waWxlZF9qYXIpIG5lZWRzIHRvIGVuc3VyZSB0aGUKLSMgUi5qYXZhIGFuZCBNYW5pZmVzdC5qYXZhIGZpbGVzIGhhdmUgYmVlbiBnZW5lcmF0ZWQgZmlyc3QuCi0kKGZ1bGxfY2xhc3Nlc19jb21waWxlZF9qYXIpOiAkKFJfZmlsZV9zdGFtcCkKLWVuZGlmCi0KLWVuZGlmICAjIG5lZWRfY29tcGlsZV9yZXMKLQotaWZlcSAoJChMT0NBTF9OT19TVEFOREFSRF9MSUJSQVJJRVMpLHRydWUpCi0jIFdlIG5lZWQgdG8gZXhwbGljaXRseSBjbGVhciB0aGlzIHZhciBzbyB0aGF0IHdlIGRvbid0Ci0jIGluaGVyaXQgdGhlIHZhbHVlIGZyb20gd2hvbWV2ZXIgY2F1c2VkIHVzIHRvIGJlIGJ1aWx0LgotJChMT0NBTF9JTlRFUk1FRElBVEVfVEFSR0VUUyk6IFBSSVZBVEVfQUFQVF9JTkNMVURFUyA6PQotZWxzZQoraWZuZXEgKCQoTE9DQUxfTk9fU1RBTkRBUkRfTElCUkFSSUVTKSx0cnVlKQogIyBNb3N0IHBhY2thZ2VzIHNob3VsZCBsaW5rIGFnYWluc3QgdGhlIHJlc291cmNlcyBkZWZpbmVkIGJ5IGZyYW1ld29yay1yZXMuCiAjIEV2ZW4gaWYgdGhleSBkb24ndCBoYXZlIHRoZWlyIG93biByZXNvdXJjZXMsIHRoZXkgbWF5IHVzZSBmcmFtZXdvcmsKICMgcmVzb3VyY2VzLgotaWZuZXEgKCQoZmlsdGVyLW91dCBjdXJyZW50IHN5c3RlbV9jdXJyZW50IHRlc3RfY3VycmVudCwkKExPQ0FMX1NES19SRVNfVkVSU0lPTikpJChpZiAkKFRBUkdFVF9CVUlMRF9BUFBTKSwkKGZpbHRlciBjdXJyZW50IHN5c3RlbV9jdXJyZW50IHRlc3RfY3VycmVudCwkKExPQ0FMX1NES19SRVNfVkVSU0lPTikpKSwpCitpZmVxICgkKExPQ0FMX1NES19SRVNfVkVSU0lPTiksY29yZV9jdXJyZW50KQorIyBjb3JlX2N1cnJlbnQgZG9lc24ndCBjb250YWluIGFueSBmcmFtZXdvcmsgcmVzb3VyY2VzLgorZWxzZSBpZm5lcSAoJChmaWx0ZXItb3V0IGN1cnJlbnQgc3lzdGVtX2N1cnJlbnQgdGVzdF9jdXJyZW50LCQoTE9DQUxfU0RLX1JFU19WRVJTSU9OKSkkKGlmICQoVEFSR0VUX0JVSUxEX0FQUFMpLCQoZmlsdGVyIGN1cnJlbnQgc3lzdGVtX2N1cnJlbnQgdGVzdF9jdXJyZW50LCQoTE9DQUxfU0RLX1JFU19WRVJTSU9OKSkpLCkKICMgZm9yIHJlbGVhc2VkIHNkayB2ZXJzaW9ucywgdGhlIHBsYXRmb3JtIHJlc291cmNlcyB3ZXJlIGJ1aWx0IGludG8gYW5kcm9pZC5qYXIuCiBmcmFtZXdvcmtfcmVzX3BhY2thZ2VfZXhwb3J0IDo9IFwKICAgICAkKEhJU1RPUklDQUxfU0RLX1ZFUlNJT05TX1JPT1QpLyQoTE9DQUxfU0RLX1JFU19WRVJTSU9OKS9hbmRyb2lkLmphcgotZnJhbWV3b3JrX3Jlc19wYWNrYWdlX2V4cG9ydF9kZXBzIDo9ICQoZnJhbWV3b3JrX3Jlc19wYWNrYWdlX2V4cG9ydCkKIGVsc2UgIyBMT0NBTF9TREtfUkVTX1ZFUlNJT04KIGZyYW1ld29ya19yZXNfcGFja2FnZV9leHBvcnQgOj0gXAogICAgICQoY2FsbCBpbnRlcm1lZGlhdGVzLWRpci1mb3IsQVBQUyxmcmFtZXdvcmstcmVzLCxDT01NT04pL3BhY2thZ2UtZXhwb3J0LmFwawotIyBXZSBjYW4ndCBkZXBlbmQgZGlyZWN0bHkgb24gdGhlIGV4cG9ydC5hcGsgZmlsZTsgaXQgd29uJ3QgZ2V0IGl0cwotIyBQUklWQVRFXyB2YXJzIHNldCB1cCBjb3JyZWN0bHkgaWYgd2UgZG8uICBJbnN0ZWFkLCBkZXBlbmQgb24gdGhlCi0jIGNvcnJlc3BvbmRpbmcgUi5zdGFtcCBmaWxlLCB3aGljaCBsaXN0cyB0aGUgZXhwb3J0LmFwayBhcyBhIGRlcGVuZGVuY3kuCi1mcmFtZXdvcmtfcmVzX3BhY2thZ2VfZXhwb3J0X2RlcHMgOj0gXAotICAgICQoZGlyICQoZnJhbWV3b3JrX3Jlc19wYWNrYWdlX2V4cG9ydCkpc3JjL1Iuc3RhbXAKIGVuZGlmICMgTE9DQUxfU0RLX1JFU19WRVJTSU9OCitlbmRpZiAjIExPQ0FMX05PX1NUQU5EQVJEX0xJQlJBUklFUworCiBhbGxfbGlicmFyeV9yZXNfcGFja2FnZV9leHBvcnRzIDo9IFwKICAgICAkKGZyYW1ld29ya19yZXNfcGFja2FnZV9leHBvcnQpIFwKICAgICAkKGZvcmVhY2ggbGliLCQoTE9DQUxfUkVTX0xJQlJBUklFUyksXAogICAgICAgICAkKGNhbGwgaW50ZXJtZWRpYXRlcy1kaXItZm9yLEFQUFMsJChsaWIpLCxDT01NT04pL3BhY2thZ2UtZXhwb3J0LmFwaykKIAogYWxsX2xpYnJhcnlfcmVzX3BhY2thZ2VfZXhwb3J0X2RlcHMgOj0gXAotICAgICQoZnJhbWV3b3JrX3Jlc19wYWNrYWdlX2V4cG9ydF9kZXBzKSBcCisgICAgJChmcmFtZXdvcmtfcmVzX3BhY2thZ2VfZXhwb3J0KSBcCiAgICAgJChmb3JlYWNoIGxpYiwkKExPQ0FMX1JFU19MSUJSQVJJRVMpLFwKICAgICAgICAgJChjYWxsIGludGVybWVkaWF0ZXMtZGlyLWZvcixBUFBTLCQobGliKSwsQ09NTU9OKS9zcmMvUi5zdGFtcCkKICQocmVzb3VyY2VfZXhwb3J0X3BhY2thZ2UpICQoUl9maWxlX3N0YW1wKSAkKExPQ0FMX0JVSUxUX01PRFVMRSk6ICQoYWxsX2xpYnJhcnlfcmVzX3BhY2thZ2VfZXhwb3J0X2RlcHMpCkBAIC01MzAsNyArNTEyLDE0IEBACiBpZmRlZiBMT0NBTF9VU0VfQUFQVDIKICQobXlfcmVzX3BhY2thZ2UpIDogJChhbGxfbGlicmFyeV9yZXNfcGFja2FnZV9leHBvcnRfZGVwcykKIGVuZGlmCi1lbmRpZiAjIExPQ0FMX05PX1NUQU5EQVJEX0xJQlJBUklFUworCisjIFRoZXNlIGZvdXIgYXJlIHNldCBhYm92ZSBmb3IgJChSX3N0YW1wX2ZpbGUpIGFuZCAkKG15X3Jlc19wYWNrYWdlKSwgYnV0CisjICQoTE9DQUxfQlVJTFRfTU9EVUxFKSBpcyBub3Qgc2V0IGJlZm9yZSBqYXZhLm1rLCBzbyB0aGV5IGhhdmUgdG8gYmUgc2V0IGFnYWluCisjIGhlcmUuCiskKExPQ0FMX0JVSUxUX01PRFVMRSk6IFBSSVZBVEVfQUFQVF9GTEFHUyA6PSAkKExPQ0FMX0FBUFRfRkxBR1MpCiskKExPQ0FMX0JVSUxUX01PRFVMRSk6IFBSSVZBVEVfVEFSR0VUX0FBUFRfQ0hBUkFDVEVSSVNUSUNTIDo9ICQoVEFSR0VUX0FBUFRfQ0hBUkFDVEVSSVNUSUNTKQorJChMT0NBTF9CVUlMVF9NT0RVTEUpOiBQUklWQVRFX01BTklGRVNUX1BBQ0tBR0VfTkFNRSA6PSAkKExPQ0FMX01BTklGRVNUX1BBQ0tBR0VfTkFNRSkKKyQoTE9DQUxfQlVJTFRfTU9EVUxFKTogUFJJVkFURV9NQU5JRkVTVF9JTlNUUlVNRU5UQVRJT05fRk9SIDo9ICQoTE9DQUxfTUFOSUZFU1RfSU5TVFJVTUVOVEFUSU9OX0ZPUikKIAogaWZuZXEgKCQoZnVsbF9jbGFzc2VzX2phciksKQogJChMT0NBTF9CVUlMVF9NT0RVTEUpOiBQUklWQVRFX0RFWF9GSUxFIDo9ICQoYnVpbHRfZGV4KQpAQCAtNTk4LDE0ICs1ODcsMTkgQEAKICAgICAkKG15X3Jlc19wYWNrYWdlKSAkKExPQ0FMX0JVSUxUX01PRFVMRSk6IFBSSVZBVEVfUFJPRFVDVF9BQVBUX1BSRUZfQ09ORklHIDo9ICQoUFJPRFVDVF9BQVBUX1BSRUZfQ09ORklHKQogZW5kaWYKIGVuZGlmCisKICQoTE9DQUxfQlVJTFRfTU9EVUxFKTogUFJJVkFURV9ET05UX0RFTEVURV9KQVJfRElSUyA6PSAkKExPQ0FMX0RPTlRfREVMRVRFX0pBUl9ESVJTKQorJChMT0NBTF9CVUlMVF9NT0RVTEUpOiBQUklWQVRFX1JFU09VUkNFX0lOVEVSTUVESUFURVNfRElSIDo9ICQoaW50ZXJtZWRpYXRlcy5DT01NT04pL3Jlc291cmNlcworJChMT0NBTF9CVUlMVF9NT0RVTEUpOiBQUklWQVRFX0ZVTExfQ0xBU1NFU19KQVIgOj0gJChmdWxsX2NsYXNzZXNfamFyKQogJChMT0NBTF9CVUlMVF9NT0RVTEUpIDogJChqbmlfc2hhcmVkX2xpYnJhcmllcykKKyQoTE9DQUxfQlVJTFRfTU9EVUxFKSA6ICQoSkFSX0FSR1MpCiBpZmRlZiBMT0NBTF9VU0VfQUFQVDIKICQoTE9DQUxfQlVJTFRfTU9EVUxFKTogUFJJVkFURV9SRVNfUEFDS0FHRSA6PSAkKG15X3Jlc19wYWNrYWdlKQogJChMT0NBTF9CVUlMVF9NT0RVTEUpIDogJChteV9yZXNfcGFja2FnZSkgJChBQVBUMikgfCAkKEFDUCkKIGVsc2UKLSQoTE9DQUxfQlVJTFRfTU9EVUxFKSA6ICQoYWxsX3Jlc19hc3NldHMpICQoZnVsbF9hbmRyb2lkX21hbmlmZXN0KSAkKEFBUFQpCi1lbmRpZgorJChMT0NBTF9CVUlMVF9NT0RVTEUpOiBQUklWQVRFX1JFU09VUkNFX0xJU1QgOj0gJChhbGxfcmVzX2Fzc2V0cykKKyQoTE9DQUxfQlVJTFRfTU9EVUxFKSA6ICQoYWxsX3Jlc19hc3NldHMpICQoZnVsbF9hbmRyb2lkX21hbmlmZXN0KSAkKEFBUFQpICQoWklQQUxJR04pCitlbmRpZiAgIyBMT0NBTF9VU0VfQUFQVDIKIGlmZGVmIExPQ0FMX0NPTVBSRVNTRURfTU9EVUxFCiAkKExPQ0FMX0JVSUxUX01PRFVMRSkgOiAkKE1JTklHWklQKQogZW5kaWYKQEAgLTYxMywxMyArNjA3LDkgQEAKIGlmZGVmIExPQ0FMX1VTRV9BQVBUMgogCSQoY2FsbCBjb3B5LWZpbGUtdG8tbmV3LXRhcmdldCkKIGVsc2UgICMgISBMT0NBTF9VU0VfQUFQVDIKLWlmZGVmIExPQ0FMX0pBQ0tfRU5BQkxFRAotCSQoY3JlYXRlLWVtcHR5LXBhY2thZ2UpCi1lbHNlCiAJJChpZiAkKFBSSVZBVEVfU09VUkNFX0FSQ0hJVkUpLFwKIAkgICQoY2FsbCBpbml0aWFsaXplLXBhY2thZ2UtZmlsZSwkKFBSSVZBVEVfU09VUkNFX0FSQ0hJVkUpLCRAKSxcCiAJICAkKGNyZWF0ZS1lbXB0eS1wYWNrYWdlKSkKLWVuZGlmCiAJJChhZGQtYXNzZXRzLXRvLXBhY2thZ2UpCiBlbmRpZiAgIyBMT0NBTF9VU0VfQUFQVDIKIGlmbmVxICgkKGpuaV9zaGFyZWRfbGlicmFyaWVzKSwpCkBAIC02MzAsOSArNjIwLDEzIEBACiAJJChpZiAkKFBSSVZBVEVfRVhUUkFfSkFSX0FSR1MpLCQoY2FsbCBhZGQtamF2YS1yZXNvdXJjZXMtdG8sJEApKQogZWxzZSAgIyBmdWxsX2NsYXNzZXNfamFyCiAJJChhZGQtZGV4LXRvLXBhY2thZ2UpCitpZmRlZiBMT0NBTF9VU0VfQUFQVDIKKwkkKGNhbGwgYWRkLWphci1yZXNvdXJjZXMtdG8tcGFja2FnZSwkQCwkKFBSSVZBVEVfRlVMTF9DTEFTU0VTX0pBUiksJChQUklWQVRFX1JFU09VUkNFX0lOVEVSTUVESUFURVNfRElSKSkKK2VuZGlmCiBlbmRpZiAgIyBmdWxsX2NsYXNzZXNfamFyCi1pZmRlZiBMT0NBTF9KQUNLX0VOQUJMRUQKLQkkKGFkZC1jYXJyaWVkLWphY2stcmVzb3VyY2VzKQoraWZlcSAodHJ1ZSwgJChMT0NBTF9VTkNPTVBSRVNTX0RFWCkpCisJQCMgTm8gbmVlZCB0byBhbGlnbiwgc2lnbi1wYWNrYWdlIGJlbG93IHdpbGwgZG8gaXQuCisJJCh1bmNvbXByZXNzLWRleHMpCiBlbmRpZgogaWZkZWYgTE9DQUxfREVYX1BSRU9QVAogaWZuZXEgKCQoQlVJTERfUExBVEZPUk1fWklQKSwpCkBAIC02NDIsNyArNjM2LDcgQEAKIGlmbmVxIChub3N0cmlwcGluZywkKExPQ0FMX0RFWF9QUkVPUFQpKQogCSQoY2FsbCBkZXhwcmVvcHQtcmVtb3ZlLWNsYXNzZXMuZGV4LCRAKQogZW5kaWYKLWVuZGlmCitlbmRpZiAgIyBMT0NBTF9ERVhfUFJFT1BUCiAJJChzaWduLXBhY2thZ2UpCiBpZmRlZiBMT0NBTF9DT01QUkVTU0VEX01PRFVMRQogCSQoY29tcHJlc3MtcGFja2FnZSkKQEAgLTY2Niw2ICs2NjAsMTAgQEAKICQoYnVpbHRfb2RleCkgOiAkKGRpciAkKExPQ0FMX0JVSUxUX01PRFVMRSkpJSA6ICQoYnVpbHRfZGV4KQogCSQoaGlkZSkgbWtkaXIgLXAgJChkaXIgJEApICYmIHJtIC1mICRACiAJJChhZGQtZGV4LXRvLXBhY2thZ2UpCitpZmVxICh0cnVlLCAkKExPQ0FMX1VOQ09NUFJFU1NfREVYKSkKKwkkKHVuY29tcHJlc3MtZGV4cykKKwkkKGFsaWduLXBhY2thZ2UpCitlbmRpZgogCSQoaGlkZSkgbXYgJEAgJEAuaW5wdXQKIAkkKGNhbGwgZGV4cHJlb3B0LW9uZS1maWxlLCRALmlucHV0LCRAKQogCSQoaGlkZSkgcm0gJEAuaW5wdXQKQEAgLTY4OSw2ICs2ODcsNyBAQAogCSQoc2lnbi1wYWNrYWdlKQogCiAjIFJ1bGVzIHRvIGluc3RhbGwgdGhlIHNwbGl0cworaW5zdGFsbGVkX2Fwa19zcGxpdHMgOj0gJChmb3JlYWNoIHMsJChteV9zcGxpdF9zdWZmaXhlcyksJChteV9tb2R1bGVfcGF0aCkvJChMT0NBTF9NT0RVTEUpXyQocykuYXBrKQogJChpbnN0YWxsZWRfYXBrX3NwbGl0cykgOiAkKG15X21vZHVsZV9wYXRoKS8kKExPQ0FMX01PRFVMRSlfJS5hcGsgOiAkKGludGVybWVkaWF0ZXMpL3BhY2thZ2VfJS5hcGsKIAlAZWNobyAiSW5zdGFsbDogJEAiCiAJJChjb3B5LWZpbGUtdG8tbmV3LXRhcmdldCkKZGlmZiAtLWdpdCBhL2NvcmUvcGRrX2NvbmZpZy5tayBiL2NvcmUvcGRrX2NvbmZpZy5tawppbmRleCBlMTJiZTI5Li41N2FmYTNmIDEwMDY0NAotLS0gYS9jb3JlL3Bka19jb25maWcubWsKKysrIGIvY29yZS9wZGtfY29uZmlnLm1rCkBAIC03LDEyICs3LDE0IEBACiAJaG9zdC9jb21tb24vb2JqL0pBVkFfTElCUkFSSUVTL2hvc3R0ZXN0bGliX2ludGVybWVkaWF0ZXMKIFBES19QTEFURk9STV9KQVZBX1pJUF9DT05URU5UUyA6PQogCi1pZm5lcSAoLCQoZmlsdGVyIHBsYXRmb3JtLWphdmEsICQoTUFLRUNNREdPQUxTKSkkKFBES19GVVNJT05fUExBVEZPUk1fWklQKSkKK2lmbmVxICgsJChmaWx0ZXIgcGxhdGZvcm0tamF2YSwgJChNQUtFQ01ER09BTFMpKSQoUERLX0ZVU0lPTl9QTEFURk9STV9aSVApJChQREtfRlVTSU9OX1BMQVRGT1JNX0RJUikpCiAjIGFkZGl0aW9uYWwgaXRlbXMgdG8gYWRkIHRvIHBsYXRmb3JtLnppcCBmb3IgcGxhdGZvcm0tamF2YSBidWlsZAogIyBGb3IgdGhlc2UgZGlycywgYWRkIGNsYXNzZXMuamFyIGFuZCBqYXZhbGliLmphciBmcm9tIHRoZSBkaXIgdG8gcGxhdGZvcm0uemlwCiAjIGFsbCBwYXRocyB1bmRlciBvdXQgZGlyCiBQREtfUExBVEZPUk1fSkFWQV9aSVBfSkFWQV9UQVJHRVRfTElCX0RJUiArPSBcCiAgIHRhcmdldC9jb21tb24vb2JqL0pBVkFfTElCUkFSSUVTL2FuZHJvaWQudGVzdC5ydW5uZXJfaW50ZXJtZWRpYXRlcyBcCisgIHRhcmdldC9jb21tb24vb2JqL0pBVkFfTElCUkFSSUVTL2FuZHJvaWQuaGlkbC5iYXNlLVYxLjAtamF2YV9pbnRlcm1lZGlhdGVzIFwKKyAgdGFyZ2V0L2NvbW1vbi9vYmovSkFWQV9MSUJSQVJJRVMvYW5kcm9pZC5oaWRsLm1hbmFnZXItVjEuMC1qYXZhX2ludGVybWVkaWF0ZXMgXAogICB0YXJnZXQvY29tbW9uL29iai9KQVZBX0xJQlJBUklFUy9hbmRyb2lkLWNvbW1vbl9pbnRlcm1lZGlhdGVzIFwKICAgdGFyZ2V0L2NvbW1vbi9vYmovSkFWQV9MSUJSQVJJRVMvYW5kcm9pZC1leC1jYW1lcmEyX2ludGVybWVkaWF0ZXMgXAogICB0YXJnZXQvY29tbW9uL29iai9KQVZBX0xJQlJBUklFUy9hbmRyb2lkX3N0dWJzX2N1cnJlbnRfaW50ZXJtZWRpYXRlcyBcCkBAIC0yNCw2ICsyNiw3IEBACiAgIHRhcmdldC9jb21tb24vb2JqL0pBVkFfTElCUkFSSUVTL2xlZ2FjeS1hbmRyb2lkLXRlc3RfaW50ZXJtZWRpYXRlcyBcCiAgIHRhcmdldC9jb21tb24vb2JqL0pBVkFfTElCUkFSSUVTL2V4dF9pbnRlcm1lZGlhdGVzIFwKICAgdGFyZ2V0L2NvbW1vbi9vYmovSkFWQV9MSUJSQVJJRVMvZnJhbWV3b3JrX2ludGVybWVkaWF0ZXMgXAorICB0YXJnZXQvY29tbW9uL29iai9KQVZBX0xJQlJBUklFUy9od2JpbmRlcl9pbnRlcm1lZGlhdGVzIFwKICAgdGFyZ2V0L2NvbW1vbi9vYmovSkFWQV9MSUJSQVJJRVMvaW1zLWNvbW1vbl9pbnRlcm1lZGlhdGVzIFwKICAgdGFyZ2V0L2NvbW1vbi9vYmovSkFWQV9MSUJSQVJJRVMvb2todHRwX2ludGVybWVkaWF0ZXMgXAogICB0YXJnZXQvY29tbW9uL29iai9KQVZBX0xJQlJBUklFUy90ZWxlcGhvbnktY29tbW9uX2ludGVybWVkaWF0ZXMgXApAQCAtNDAsMzkgKzQzLDYwIEBACiAJJChQREtfUExBVEZPUk1fSkFWQV9aSVBfSkFWQV9IT1NUX0xJQl9ESVIpCiAKIFBES19QTEFURk9STV9KQVZBX1pJUF9DT05URU5UUyArPSAkKGZvcmVhY2ggbGliX2RpciwkKFBES19QTEFURk9STV9KQVZBX1pJUF9KQVZBX0xJQl9ESVIpLFwKLSAgICAkKGxpYl9kaXIpL2NsYXNzZXMuamFjayAkKGxpYl9kaXIpL2NsYXNzZXMuamFyICQobGliX2RpcikvY2xhc3Nlcy5qYXIudG9jIFwKKyAgICAkKGxpYl9kaXIpL2NsYXNzZXMuamFyICQobGliX2RpcikvY2xhc3Nlcy1oZWFkZXIuamFyIFwKICAgICAkKGxpYl9kaXIpL2phdmFsaWIuamFyICAkKGxpYl9kaXIpL2NsYXNzZXMqLmRleCBcCiAgICAgJChsaWJfZGlyKS9jbGFzc2VzLmRleC50b2MgKQogCiAjIGNoZWNrIGFuZCBvdmVycmlkZSBqYXZhIHN1cHBvcnQgbGV2ZWwKLWlmbmVxICgkKFRBUkdFVF9CVUlMRF9QREspJChQREtfRlVTSU9OX1BMQVRGT1JNX1pJUCksKQotaWZuZXEgKCQod2lsZGNhcmQgZXh0ZXJuYWwvcHJvZ3VhcmQpLCkKLVRBUkdFVF9CVUlMRF9KQVZBX1NVUFBPUlRfTEVWRUwgOj0gc2RrCi1lbHNlICMgbm8gcHJvZ3VhcmQKLVRBUkdFVF9CVUlMRF9KQVZBX1NVUFBPUlRfTEVWRUwgOj0KLWVuZGlmCi0jIHBsYXRmb3JtIHN1cHByb3QgaXMgc2V0IGFmdGVyIGNoZWNraW5nIHBsYXRmb3JtLnppcAoraWZuZXEgKCQoVEFSR0VUX0JVSUxEX1BESykkKFBES19GVVNJT05fUExBVEZPUk1fWklQKSQoUERLX0ZVU0lPTl9QTEFURk9STV9ESVIpLCkKKyAgaWZuZXEgKCQod2lsZGNhcmQgZXh0ZXJuYWwvcHJvZ3VhcmQpLCkKKyAgICBUQVJHRVRfQlVJTERfSkFWQV9TVVBQT1JUX0xFVkVMIDo9IHNkaworICBlbHNlICMgbm8gcHJvZ3VhcmQKKyAgICBUQVJHRVRfQlVJTERfSkFWQV9TVVBQT1JUX0xFVkVMIDo9CisgIGVuZGlmCisgICMgcGxhdGZvcm0gc3VwcG9ydCBpcyBzZXQgYWZ0ZXIgY2hlY2tpbmcgcGxhdGZvcm0uemlwCiBlbmRpZiAjIFBESwogCitpZm5lcSAoLCQoUERLX0ZVU0lPTl9QTEFURk9STV9ESVIpJChQREtfRlVTSU9OX1BMQVRGT1JNX1pJUCkpCisKK19wZGtfZnVzaW9uX2ludGVybWVkaWF0ZXMgOj0KK19wZGtfZnVzaW9uX3N0YW1wIDo9CitfcGRrX2Z1c2lvbl9maWxlX2xpc3QgOj0KK19wZGtfZnVzaW9uX2phdmFfZmlsZV9saXN0IDo9CitQREtfRlVTSU9OX1NZTUxJTktfU1RBTVAgOj0KKworaWZkZWYgUERLX0ZVU0lPTl9QTEFURk9STV9ESVIKKyAgX3Bka19mdXNpb25faW50ZXJtZWRpYXRlcyA6PSAkKFBES19GVVNJT05fUExBVEZPUk1fRElSKQorICBfcGRrX2Z1c2lvbl9maWxlX2xpc3QgOj0gJChzb3J0IFwKKyAgICAkKHNoZWxsIGNkICQoUERLX0ZVU0lPTl9QTEFURk9STV9ESVIpOyBmaW5kICogLXR5cGUgZikpCisgIF9wZGtfZnVzaW9uX2phdmFfZmlsZV9saXN0IDo9ICQoZmlsdGVyIHRhcmdldC9jb21tb24vJSwkKF9wZGtfZnVzaW9uX2ZpbGVfbGlzdCkpCisgIF9wZGtfZnVzaW9uX2ZpbGVfbGlzdCA6PSAkKGZpbHRlci1vdXQgdGFyZ2V0L2NvbW1vbi8lLCQoX3Bka19mdXNpb25fZmlsZV9saXN0KSkKKworICBQREtfRlVTSU9OX1NZTUxJTktfU1RBTVAgOj0gJChjYWxsIGludGVybWVkaWF0ZXMtZGlyLWZvciwgUEFDS0FHSU5HLCBwZGtfZnVzaW9uKS9wZGtfc3ltbGlua3Muc3RhbXAKKworICBzeW1saW5rX2xpc3QgOj0gJChzb3J0IFwKKyAgICAkKHNoZWxsIGNkICQoUERLX0ZVU0lPTl9QTEFURk9STV9ESVIpOyBmaW5kICogLXR5cGUgbCkpCiskKFBES19GVVNJT05fU1lNTElOS19TVEFNUCk6IFBSSVZBVEVfU1lNTElOS1MgOj0gJChmb3JlYWNoIHMsJChzeW1saW5rX2xpc3QpLFwKKyAgICAkKHMpOiQoc2hlbGwgcmVhZGxpbmsgJChQREtfRlVTSU9OX1BMQVRGT1JNX0RJUikvJChzKSkpCiskKFBES19GVVNJT05fU1lNTElOS19TVEFNUCk6CisJJChmb3JlYWNoIHMsJChQUklWQVRFX1NZTUxJTktTKSxcCisJICBta2RpciAtcCAkKFBST0RVQ1RfT1VUKS8kKGRpciAkKGNhbGwgd29yZC1jb2xvbiwxLCQocykpKSAmJiBcCisJICBsbiAtc2YgJChjYWxsIHdvcmQtY29sb24sMiwkKHMpKSAkKFBST0RVQ1RfT1VUKS8kKGNhbGwgd29yZC1jb2xvbiwxLCQocykpICYmKSB0cnVlCisJdG91Y2ggJEAKKworICBzeW1saW5rX2xpc3QgOj0KK2VuZGlmICMgUERLX0ZVU0lPTl9QTEFURk9STV9ESVIKKwogaWZkZWYgUERLX0ZVU0lPTl9QTEFURk9STV9aSVAKLV9wZGtfZnVzaW9uX2ludGVybWVkaWF0ZXMgOj0gJChjYWxsIGludGVybWVkaWF0ZXMtZGlyLWZvciwgUEFDS0FHSU5HLCBwZGtfZnVzaW9uKQotX3Bka19mdXNpb25fc3RhbXAgOj0gJChfcGRrX2Z1c2lvbl9pbnRlcm1lZGlhdGVzKS9wZGtfZnVzaW9uLnN0YW1wCisgIF9wZGtfZnVzaW9uX2ludGVybWVkaWF0ZXMgOj0gJChjYWxsIGludGVybWVkaWF0ZXMtZGlyLWZvciwgUEFDS0FHSU5HLCBwZGtfZnVzaW9uKQorICBfcGRrX2Z1c2lvbl9zdGFtcCA6PSAkKF9wZGtfZnVzaW9uX2ludGVybWVkaWF0ZXMpL3Bka19mdXNpb24uc3RhbXAKIAotX3Bka19mdXNpb25fZmlsZV9saXN0IDo9ICQoc2hlbGwgdW56aXAgLVogLTEgJChQREtfRlVTSU9OX1BMQVRGT1JNX1pJUCkgXAotICAgICcqW14vXScgLXggJ3RhcmdldC9jb21tb24vKicgMj4vZGV2L251bGwpCi1fcGRrX2Z1c2lvbl9qYXZhX2ZpbGVfbGlzdCA6PSBcCi0JJChzaGVsbCB1bnppcCAtWiAtMSAkKFBES19GVVNJT05fUExBVEZPUk1fWklQKSAndGFyZ2V0L2NvbW1vbi8qJyAyPi9kZXYvbnVsbCkKLV9wZGtfZnVzaW9uX2ZpbGVzIDo9ICQoYWRkcHJlZml4ICQoX3Bka19mdXNpb25faW50ZXJtZWRpYXRlcykvLFwKLSAgICAkKF9wZGtfZnVzaW9uX2ZpbGVfbGlzdCkgJChfcGRrX2Z1c2lvbl9qYXZhX2ZpbGVfbGlzdCkpCi0KLWlmbmVxICgkKF9wZGtfZnVzaW9uX2phdmFfZmlsZV9saXN0KSwpCi0jIFRoaXMgcmVwcmVzZW50cyB3aGV0aGVyIGphdmEgYnVpbGQgY2FuIHVzZSBwbGF0Zm9ybSBBUEkgb3Igbm90Ci0jIFRoaXMgc2hvdWxkIG5vdCBiZSB1c2VkIGluIEFuZHJvaWQubWsKLVRBUkdFVF9CVUlMRF9QREtfSkFWQV9QTEFURk9STSA6PSB0cnVlCi1pZm5lcSAoJChUQVJHRVRfQlVJTERfSkFWQV9TVVBQT1JUX0xFVkVMKSwpCi1UQVJHRVRfQlVJTERfSkFWQV9TVVBQT1JUX0xFVkVMIDo9IHBsYXRmb3JtCi1lbmRpZgotZW5kaWYKKyAgX3Bka19mdXNpb25fZmlsZV9saXN0IDo9ICQoc2hlbGwgdW56aXAgLVogLTEgJChQREtfRlVTSU9OX1BMQVRGT1JNX1pJUCkgXAorICAgICAgJypbXi9dJyAteCAndGFyZ2V0L2NvbW1vbi8qJyAyPi9kZXYvbnVsbCkKKyAgX3Bka19mdXNpb25famF2YV9maWxlX2xpc3QgOj0gXAorICAgICAgJChzaGVsbCB1bnppcCAtWiAtMSAkKFBES19GVVNJT05fUExBVEZPUk1fWklQKSAndGFyZ2V0L2NvbW1vbi8qJyAyPi9kZXYvbnVsbCkKKyAgX3Bka19mdXNpb25fZmlsZXMgOj0gJChhZGRwcmVmaXggJChfcGRrX2Z1c2lvbl9pbnRlcm1lZGlhdGVzKS8sXAorICAgICAgJChfcGRrX2Z1c2lvbl9maWxlX2xpc3QpICQoX3Bka19mdXNpb25famF2YV9maWxlX2xpc3QpKQogCiAkKF9wZGtfZnVzaW9uX3N0YW1wKSA6ICQoUERLX0ZVU0lPTl9QTEFURk9STV9aSVApCiAJQGVjaG8gIlVuemlwICQoZGlyICRAKSA8LSAkPCIKQEAgLTgxLDkgKzEwNSwxNyBAQAogCSQoY2FsbCBzcGxpdC1sb25nLWFyZ3VtZW50cywtdG91Y2gsJChfcGRrX2Z1c2lvbl9maWxlcykpCiAJJChoaWRlKSB0b3VjaCAkQAogCi0KICQoX3Bka19mdXNpb25fZmlsZXMpIDogJChfcGRrX2Z1c2lvbl9zdGFtcCkKK2VuZGlmICMgUERLX0ZVU0lPTl9QTEFURk9STV9aSVAKIAoraWZuZXEgKCQoX3Bka19mdXNpb25famF2YV9maWxlX2xpc3QpLCkKKyAgIyBUaGlzIHJlcHJlc2VudHMgd2hldGhlciBqYXZhIGJ1aWxkIGNhbiB1c2UgcGxhdGZvcm0gQVBJIG9yIG5vdAorICAjIFRoaXMgc2hvdWxkIG5vdCBiZSB1c2VkIGluIEFuZHJvaWQubWsKKyAgVEFSR0VUX0JVSUxEX1BES19KQVZBX1BMQVRGT1JNIDo9IHRydWUKKyAgaWZuZXEgKCQoVEFSR0VUX0JVSUxEX0pBVkFfU1VQUE9SVF9MRVZFTCksKQorICAgIFRBUkdFVF9CVUlMRF9KQVZBX1NVUFBPUlRfTEVWRUwgOj0gcGxhdGZvcm0KKyAgZW5kaWYKK2VuZGlmCiAKICMgSW1wbGljaXQgcGF0dGVybiBydWxlcyB0byBjb3B5IHRoZSBmdXNpb24gZmlsZXMgdG8gdGhlIHN5c3RlbSBpbWFnZSBkaXJlY3RvcnkuCiAjIE5vdGUgdGhhdCBpZiB0aGVyZSBpcyBhbHJlYWR5IGV4cGxpY2l0IHJ1bGUgaW4gdGhlIGJ1aWxkIHN5c3RlbSB0byBnZW5lcmF0ZSBhIGZpbGUsCkBAIC0xMDEsNzQgKzEzMyw1NyBAQAogCSQoaGlkZSkgY3AgLWZwUFIgJDwgJEAKIAogaWZlcSAodHJ1ZSwkKFRBUkdFVF9CVUlMRF9QREtfSkFWQV9QTEFURk9STSkpCisgIFBES19GVVNJT05fT1VUX0RJUiA6PSAkKE9VVF9ESVIpCiAKLVBES19GVVNJT05fT1VUX0RJUiA6PSAkKE9VVF9ESVIpCi1pZmVxIChkZWJ1ZywkKFRBUkdFVF9CVUlMRF9UWVBFKSkKLVBES19GVVNJT05fT1VUX0RJUiA6PSAkKERFQlVHX09VVF9ESVIpCi1lbmRpZgorICBkZWZpbmUgSkFWQV9kZXBlbmRlbmN5X3RlbXBsYXRlCisgICQoY2FsbCBhZGQtZGVwZW5kZW5jeSwkKFBES19GVVNJT05fT1VUX0RJUikvJChzdHJpcCAkKDEpKSxcCisgICAgJChmb3JlYWNoIGQsJChmaWx0ZXIgJCgyKSwkKF9wZGtfZnVzaW9uX2phdmFfZmlsZV9saXN0KSksJChQREtfRlVTSU9OX09VVF9ESVIpLyQoZCkpKQorICBlbmRlZgogCi1kZWZpbmUgSkFWQV9kZXBlbmRlbmN5X3RlbXBsYXRlCi0kKGNhbGwgYWRkLWRlcGVuZGVuY3ksJChQREtfRlVTSU9OX09VVF9ESVIpLyQoc3RyaXAgJCgxKSksXAotICAkKGZvcmVhY2ggZCwkKGZpbHRlciAkKDIpLCQoX3Bka19mdXNpb25famF2YV9maWxlX2xpc3QpKSwkKFBES19GVVNJT05fT1VUX0RJUikvJChkKSkpCi1lbmRlZgorICAjIG5lZWRzIGV4cGxpY2l0IGRlcGVuZGVuY3kgYXMgcGFja2FnZS1leHBvcnQuYXBrIGlzIG5vdCBleHBsaWNpdGx5IHB1bGxlZAorICAkKGV2YWwgJChjYWxsIEpBVkFfZGVwZW5kZW5jeV90ZW1wbGF0ZSxcCisgIHRhcmdldC9jb21tb24vb2JqL0FQUFMvZnJhbWV3b3JrLXJlc19pbnRlcm1lZGlhdGVzL3NyYy9SLnN0YW1wLFwKKyAgdGFyZ2V0L2NvbW1vbi9vYmovQVBQUy9mcmFtZXdvcmstcmVzX2ludGVybWVkaWF0ZXMvcGFja2FnZS1leHBvcnQuYXBrKSkKIAotIyBuZWVkcyBleHBsaWNpdCBkZXBlbmRlbmN5IGFzIHBhY2thZ2UtZXhwb3J0LmFwayBpcyBub3QgZXhwbGljaXRseSBwdWxsZWQKLSQoZXZhbCAkKGNhbGwgSkFWQV9kZXBlbmRlbmN5X3RlbXBsYXRlLFwKLXRhcmdldC9jb21tb24vb2JqL0FQUFMvZnJhbWV3b3JrLXJlc19pbnRlcm1lZGlhdGVzL3NyYy9SLnN0YW1wLFwKLXRhcmdldC9jb21tb24vb2JqL0FQUFMvZnJhbWV3b3JrLXJlc19pbnRlcm1lZGlhdGVzL3BhY2thZ2UtZXhwb3J0LmFwaykpCi0KLSMgamF2YWxpYi5qYXIgc2hvdWxkIHB1bGwgY2xhc3Nlcy5qYXIgYXMgY2xhc3Nlcy5qYXIgaXMgbm90IGV4cGxpY2l0bHkgcHVsbGVkLgotJChmb3JlYWNoIGxpYl9kaXIsJChQREtfUExBVEZPUk1fSkFWQV9aSVBfSkFWQV9UQVJHRVRfTElCX0RJUiksXAotJChldmFsICQoY2FsbCBKQVZBX2RlcGVuZGVuY3lfdGVtcGxhdGUsJChsaWJfZGlyKS9qYXZhbGliLmphcixcCi0kKGxpYl9kaXIpL2NsYXNzZXMuamFyKSkpCi0KLSMgcHVsbCAuamFjayBhbmQgLmRleCBmaWxlcwotJChmb3JlYWNoIGxpYl9kaXIsJChQREtfUExBVEZPUk1fSkFWQV9aSVBfSkFWQV9UQVJHRVRfTElCX0RJUiksXAotICAkKGV2YWwgJChjYWxsIEpBVkFfZGVwZW5kZW5jeV90ZW1wbGF0ZSwkKGxpYl9kaXIpL2NsYXNzZXMuamFyLnRvYyxcCi0gICAgJChsaWJfZGlyKS9jbGFzc2VzLmphciAkKGxpYl9kaXIpL2NsYXNzZXMuamFjaykpKQotJChmb3JlYWNoIGxpYl9kaXIsJChQREtfUExBVEZPUk1fSkFWQV9aSVBfSkFWQV9UQVJHRVRfTElCX0RJUiksXAotICAkKGV2YWwgJChjYWxsIEpBVkFfZGVwZW5kZW5jeV90ZW1wbGF0ZSwkKGxpYl9kaXIpL2NsYXNzZXMuZGV4LnRvYyxcCi0gICAgJChsaWJfZGlyKS9jbGFzc2VzLmphciAkKGxpYl9kaXIpL2NsYXNzZXMuamFjayAkKGxpYl9kaXIpL2NsYXNzZXMlLmRleCkpKQorICAjIGphdmFsaWIuamFyIHNob3VsZCBwdWxsIGNsYXNzZXMuamFyIGFzIGNsYXNzZXMuamFyIGlzIG5vdCBleHBsaWNpdGx5IHB1bGxlZC4KKyAgJChmb3JlYWNoIGxpYl9kaXIsJChQREtfUExBVEZPUk1fSkFWQV9aSVBfSkFWQV9UQVJHRVRfTElCX0RJUiksXAorICAkKGV2YWwgJChjYWxsIEpBVkFfZGVwZW5kZW5jeV90ZW1wbGF0ZSwkKGxpYl9kaXIpL2phdmFsaWIuamFyLFwKKyAgJChsaWJfZGlyKS9jbGFzc2VzLmphcikpKQogCiAjIGltcGxpY2l0IHJ1bGVzIGZvciBhbGwgb3RoZXIgdGFyZ2V0IGZpbGVzCiAkKFRBUkdFVF9DT01NT05fT1VUX1JPT1QpLyUgOiAkKF9wZGtfZnVzaW9uX2ludGVybWVkaWF0ZXMpL3RhcmdldC9jb21tb24vJSAkKF9wZGtfZnVzaW9uX3N0YW1wKQogCUBta2RpciAtcCAkKGRpciAkQCkKIAkkKGhpZGUpIGNwIC1mcFBSICQ8ICRACi1lbmRpZgorZW5kaWYgIyBUQVJHRVRfQlVJTERfUERLX0pBVkFfUExBVEZPUk0KIAogQUxMX1BES19GVVNJT05fRklMRVMgOj0gJChhZGRwcmVmaXggJChQUk9EVUNUX09VVCkvLCAkKF9wZGtfZnVzaW9uX2ZpbGVfbGlzdCkpCiAKLWVuZGlmICMgUERLX0ZVU0lPTl9QTEFURk9STV9aSVAKK2VuZGlmICMgUERLX0ZVU0lPTl9QTEFURk9STV9aSVAgfHwgUERLX0ZVU0lPTl9QTEFURk9STV9ESVIKIAogaWZlcSAoJChUQVJHRVRfQlVJTERfUERLKSx0cnVlKQotJChpbmZvIFBESyBUQVJHRVRfQlVJTERfSkFWQV9TVVBQT1JUX0xFVkVMICQoVEFSR0VUX0JVSUxEX0pBVkFfU1VQUE9SVF9MRVZFTCkpCi1pZmVxICgkKFRBUkdFVF9CVUlMRF9QREtfSkFWQV9QTEFURk9STSksKQotCi0jIFNESyB1c2VkIGZvciBKYXZhIGJ1aWxkIHVuZGVyIFBESwotUERLX0JVSUxEX1NES19WRVJTSU9OIDo9ICQobGFzdHdvcmQgJChUQVJHRVRfQVZBSUxBQkxFX1NES19WRVJTSU9OUykpCi0kKGluZm8gUERLIEJ1aWxkIHVzZXMgU0RLICQoUERLX0JVSUxEX1NES19WRVJTSU9OKSkKLQotZWxzZSAjIFBES19KQVZBCi0KLSQoaW5mbyBQREsgQnVpbGQgdXNlcyB0aGUgY3VycmVudCBwbGF0Zm9ybSBBUEkpCi0KLWVuZGlmICMgUERLX0pBVkEKLQorICAkKGluZm8gUERLIFRBUkdFVF9CVUlMRF9KQVZBX1NVUFBPUlRfTEVWRUwgJChUQVJHRVRfQlVJTERfSkFWQV9TVVBQT1JUX0xFVkVMKSkKKyAgaWZlcSAoJChUQVJHRVRfQlVJTERfUERLX0pBVkFfUExBVEZPUk0pLCkKKyAgICAjIFNESyB1c2VkIGZvciBKYXZhIGJ1aWxkIHVuZGVyIFBESworICAgIFBES19CVUlMRF9TREtfVkVSU0lPTiA6PSAkKGxhc3R3b3JkICQoVEFSR0VUX0FWQUlMQUJMRV9TREtfVkVSU0lPTlMpKQorICAgICQoaW5mbyBQREsgQnVpbGQgdXNlcyBTREsgJChQREtfQlVJTERfU0RLX1ZFUlNJT04pKQorICBlbHNlICMgUERLX0pBVkEKKyAgICAkKGluZm8gUERLIEJ1aWxkIHVzZXMgdGhlIGN1cnJlbnQgcGxhdGZvcm0gQVBJKQorICBlbmRpZiAjIFBES19KQVZBCiBlbmRpZiAjIEJVSUxEX1BESwogCiBpZm5lcSAoLCQoZmlsdGVyIHBsYXRmb3JtIHBsYXRmb3JtLWphdmEsICQoTUFLRUNNREdPQUxTKSkkKGZpbHRlciB0cnVlLCQoVEFSR0VUX0JVSUxEX1BESykpKQotIyBmaWxlcyB1bmRlciAkKFBST0RVQ1RfT1VUKS9zeW1ib2xzIHRvIGhlbHAgZGVidWdnaW5nLgotIyBTb3VyY2Ugbm90IGluY2x1ZGVkIHRvIFBESyBkdWUgdG8gZGVwZW5kZW5jeSBpc3N1ZSwgc28gcHJvdmlkZSBzeW1ib2xzIGluc3RlYWQuCisgICMgZmlsZXMgdW5kZXIgJChQUk9EVUNUX09VVCkvc3ltYm9scyB0byBoZWxwIGRlYnVnZ2luZy4KKyAgIyBTb3VyY2Ugbm90IGluY2x1ZGVkIHRvIFBESyBkdWUgdG8gZGVwZW5kZW5jeSBpc3N1ZSwgc28gcHJvdmlkZSBzeW1ib2xzIGluc3RlYWQuCiAKLSMgV2UgbWF5IG5vdCBiZSBidWlsZGluZyBhbGwgb2YgdGhlbS4KLSMgVGhlIHBsYXRmb3JtLnppcCBqdXN0IHNpbGVudGx5IGlnbm9yZXMgdGhlIG5vbmV4aXN0ZW50IG9uZXMuCi1QREtfU1lNQk9MX0ZJTEVTX0xJU1QgOj0gXAotICAgIHN5c3RlbS9iaW4vYXBwX3Byb2Nlc3MzMiBcCi0gICAgc3lzdGVtL2Jpbi9hcHBfcHJvY2VzczY0CisgICMgV2UgbWF5IG5vdCBiZSBidWlsZGluZyBhbGwgb2YgdGhlbS4KKyAgIyBUaGUgcGxhdGZvcm0uemlwIGp1c3Qgc2lsZW50bHkgaWdub3JlcyB0aGUgbm9uZXhpc3RlbnQgb25lcy4KKyAgUERLX1NZTUJPTF9GSUxFU19MSVNUIDo9IFwKKyAgICAgIHN5c3RlbS9iaW4vYXBwX3Byb2Nlc3MzMiBcCisgICAgICBzeXN0ZW0vYmluL2FwcF9wcm9jZXNzNjQKIAotaWZkZWYgUERLX0ZVU0lPTl9QTEFURk9STV9aSVAKLSMgc3ltYm9scyBzaG91bGQgYmUgZXhwbGljaXRseSBwdWxsZWQgZm9yIGZ1c2lvbiBidWlsZAotJChmb3JlYWNoIGYsJChmaWx0ZXIgJChQREtfU1lNQk9MX0ZJTEVTX0xJU1QpLCAkKF9wZGtfZnVzaW9uX2ZpbGVfbGlzdCkpLFwKLSAgJChldmFsICQoY2FsbCBhZGQtZGVwZW5kZW5jeSwkKFBST0RVQ1RfT1VUKS8kKGYpLCQoUFJPRFVDVF9PVVQpL3N5bWJvbHMvJChmKSkpKQotZW5kaWYgIyBQTEFURk9STV9aSVAKLWVuZGlmICMgcGxhdGZvcm0uemlwIGJ1aWxkIG9yIFBESworICBpZm5lcSAoLCQoUERLX0ZVU0lPTl9QTEFURk9STV9aSVApJChQREtfRlVTSU9OX1BMQVRGT1JNX0RJUikpCisgICAgIyBzeW1ib2xzIHNob3VsZCBiZSBleHBsaWNpdGx5IHB1bGxlZCBmb3IgZnVzaW9uIGJ1aWxkCisgICAgJChmb3JlYWNoIGYsJChmaWx0ZXIgJChQREtfU1lNQk9MX0ZJTEVTX0xJU1QpLCAkKF9wZGtfZnVzaW9uX2ZpbGVfbGlzdCkpLFwKKyAgICAgICQoZXZhbCAkKGNhbGwgYWRkLWRlcGVuZGVuY3ksJChQUk9EVUNUX09VVCkvJChmKSwkKFBST0RVQ1RfT1VUKS9zeW1ib2xzLyQoZikpKSkKKyAgZW5kaWYgIyBQTEFURk9STV9aSVAgfHwgUExBVEZPUk1fRElSCitlbmRpZiAjIHBsYXRmb3JtLnppcC9kaXIgYnVpbGQgb3IgUERLCmRpZmYgLS1naXQgYS9jb3JlL3Bka19mdXNpb25fbW9kdWxlcy5tayBiL2NvcmUvcGRrX2Z1c2lvbl9tb2R1bGVzLm1rCmluZGV4IDBjMDNmMzcuLjlhYWJkMGYgMTAwNjQ0Ci0tLSBhL2NvcmUvcGRrX2Z1c2lvbl9tb2R1bGVzLm1rCisrKyBiL2NvcmUvcGRrX2Z1c2lvbl9tb2R1bGVzLm1rCkBAIC0yLDEwICsyLDE2IEBACiAjIFdlIHVzZSB0aGVzZSBydWxlcyB0byByZWJ1aWxkIC5vZGV4IGZpbGVzIG9mIHRoZSAuamFyLy5hcGsgaW5zaWRlIHRoZSBwbGF0Zm9ybS56aXAuCiAjCiAKK2lmZGVmIFBES19GVVNJT05fUExBVEZPUk1fWklQCiBwZGtfZGV4cHJlb3B0X2NvbmZpZ19tayA6PSAkKFRBUkdFVF9PVVRfSU5URVJNRURJQVRFUykvcGRrX2RleHByZW9wdF9jb25maWcubWsKIAogJChzaGVsbCBybSAtZiAkKHBka19kZXhwcmVvcHRfY29uZmlnX21rKSAmJiBta2RpciAtcCAkKGRpciAkKHBka19kZXhwcmVvcHRfY29uZmlnX21rKSkgJiYgXAogICAgICAgICB1bnppcCAtcW8gJChQREtfRlVTSU9OX1BMQVRGT1JNX1pJUCkgLWQgJChkaXIgJChwZGtfZGV4cHJlb3B0X2NvbmZpZ19taykpIHBka19kZXhwcmVvcHRfY29uZmlnLm1rIDI+L2Rldi9udWxsKQorZW5kaWYKKworaWZkZWYgUERLX0ZVU0lPTl9QTEFURk9STV9ESVIKK3Bka19kZXhwcmVvcHRfY29uZmlnX21rIDo9ICQoUERLX0ZVU0lPTl9QTEFURk9STV9ESVIpL3Bka19kZXhwcmVvcHRfY29uZmlnLm1rCitlbmRpZgogCiAtaW5jbHVkZSAkKHBka19kZXhwcmVvcHRfY29uZmlnX21rKQogCmRpZmYgLS1naXQgYS9jb3JlL3ByZWJ1aWx0X2ludGVybmFsLm1rIGIvY29yZS9wcmVidWlsdF9pbnRlcm5hbC5tawppbmRleCA2MjBjMjJjLi4wZWZkYTU3IDEwMDY0NAotLS0gYS9jb3JlL3ByZWJ1aWx0X2ludGVybmFsLm1rCisrKyBiL2NvcmUvcHJlYnVpbHRfaW50ZXJuYWwubWsKQEAgLTIwLDE5ICsyMCwxOSBAQAogCiBpZmRlZiBMT0NBTF9QUkVCVUlMVF9NT0RVTEVfRklMRQogICBteV9wcmVidWlsdF9zcmNfZmlsZSA6PSAkKExPQ0FMX1BSRUJVSUxUX01PRFVMRV9GSUxFKQorZWxzZSBpZmRlZiBMT0NBTF9TUkNfRklMRVNfJCgkKG15X3ByZWZpeCkkKExPQ0FMXzJORF9BUkNIX1ZBUl9QUkVGSVgpQVJDSCkKKyAgbXlfcHJlYnVpbHRfc3JjX2ZpbGUgOj0gJChMT0NBTF9QQVRIKS8kKExPQ0FMX1NSQ19GSUxFU18kKCQobXlfcHJlZml4KSQoTE9DQUxfMk5EX0FSQ0hfVkFSX1BSRUZJWClBUkNIKSkKKyAgTE9DQUxfU1JDX0ZJTEVTXyQoJChteV9wcmVmaXgpJChMT0NBTF8yTkRfQVJDSF9WQVJfUFJFRklYKUFSQ0gpIDo9CitlbHNlIGlmZGVmIExPQ0FMX1NSQ19GSUxFU18kKG15XzMyXzY0X2JpdF9zdWZmaXgpCisgIG15X3ByZWJ1aWx0X3NyY19maWxlIDo9ICQoTE9DQUxfUEFUSCkvJChMT0NBTF9TUkNfRklMRVNfJChteV8zMl82NF9iaXRfc3VmZml4KSkKKyAgTE9DQUxfU1JDX0ZJTEVTXyQobXlfMzJfNjRfYml0X3N1ZmZpeCkgOj0KK2Vsc2UgaWZkZWYgTE9DQUxfU1JDX0ZJTEVTCisgIG15X3ByZWJ1aWx0X3NyY19maWxlIDo9ICQoTE9DQUxfUEFUSCkvJChMT0NBTF9TUkNfRklMRVMpCisgIExPQ0FMX1NSQ19GSUxFUyA6PQorZWxzZSBpZmRlZiBMT0NBTF9SRVBMQUNFX1BSRUJVSUxUX0FQS19JTlNUQUxMRUQKKyAgIyBUaGlzIGlzIGhhbmRsZWQgc3BlY2lhbGx5IGJlbG93CiBlbHNlCi0gIGlmZGVmIExPQ0FMX1NSQ19GSUxFU18kKCQobXlfcHJlZml4KSQoTE9DQUxfMk5EX0FSQ0hfVkFSX1BSRUZJWClBUkNIKQotICAgIG15X3ByZWJ1aWx0X3NyY19maWxlIDo9ICQoTE9DQUxfUEFUSCkvJChMT0NBTF9TUkNfRklMRVNfJCgkKG15X3ByZWZpeCkkKExPQ0FMXzJORF9BUkNIX1ZBUl9QUkVGSVgpQVJDSCkpCi0gICAgTE9DQUxfU1JDX0ZJTEVTXyQoJChteV9wcmVmaXgpJChMT0NBTF8yTkRfQVJDSF9WQVJfUFJFRklYKUFSQ0gpIDo9Ci0gIGVsc2UKLSAgICBpZmRlZiBMT0NBTF9TUkNfRklMRVNfJChteV8zMl82NF9iaXRfc3VmZml4KQotICAgICAgbXlfcHJlYnVpbHRfc3JjX2ZpbGUgOj0gJChMT0NBTF9QQVRIKS8kKExPQ0FMX1NSQ19GSUxFU18kKG15XzMyXzY0X2JpdF9zdWZmaXgpKQotICAgICAgTE9DQUxfU1JDX0ZJTEVTXyQobXlfMzJfNjRfYml0X3N1ZmZpeCkgOj0KLSAgICBlbHNlCi0gICAgICBteV9wcmVidWlsdF9zcmNfZmlsZSA6PSAkKExPQ0FMX1BBVEgpLyQoTE9DQUxfU1JDX0ZJTEVTKQotICAgICAgTE9DQUxfU1JDX0ZJTEVTIDo9Ci0gICAgZW5kaWYKLSAgZW5kaWYKKyAgJChjYWxsIHByZXR0eS1lcnJvcixObyBzb3VyY2UgZmlsZXMgc3BlY2lmaWVkKQogZW5kaWYKIAogTE9DQUxfQ0hFQ0tFRF9NT0RVTEUgOj0gJChteV9wcmVidWlsdF9zcmNfZmlsZSkKQEAgLTE3MywxMCArMTczLDIxIEBACiBlbmRpZgogZXhwb3J0X2NmbGFncyA6PQogCitpbmNsdWRlICQoQlVJTERfU1lTVEVNKS9hbGxvd2VkX25ka190eXBlcy5taworCiBpZmRlZiBMT0NBTF9TREtfVkVSU0lPTgotbXlfbGlua190eXBlIDo9IG5hdGl2ZTpuZGsKK215X2xpbmtfdHlwZSA6PSBuYXRpdmU6bmRrOiQobXlfbmRrX3N0bF9mYW1pbHkpOiQobXlfbmRrX3N0bF9saW5rX3R5cGUpCiBlbHNlIGlmZGVmIExPQ0FMX1VTRV9WTkRLCi1teV9saW5rX3R5cGUgOj0gbmF0aXZlOnZlbmRvcgorICAgIF9uYW1lIDo9ICQocGF0c3Vic3QgJS52ZW5kb3IsJSwkKExPQ0FMX01PRFVMRSkpCisgICAgaWZuZXEgKCQoZmlsdGVyICQoX25hbWUpLCQoVk5ES19DT1JFX0xJQlJBUklFUykgJChWTkRLX1NBTUVQUk9DRVNTX0xJQlJBUklFUykgJChMTE5ES19MSUJSQVJJRVMpKSwpCisgICAgICAgIGlmZXEgKCQoZmlsdGVyICQoX25hbWUpLCQoVk5ES19QUklWQVRFX0xJQlJBUklFUykpLCkKKyAgICAgICAgICAgIG15X2xpbmtfdHlwZSA6PSBuYXRpdmU6dm5kaworICAgICAgICBlbHNlCisgICAgICAgICAgICBteV9saW5rX3R5cGUgOj0gbmF0aXZlOnZuZGtfcHJpdmF0ZQorICAgICAgICBlbmRpZgorICAgIGVsc2UKKyAgICAgICAgbXlfbGlua190eXBlIDo9IG5hdGl2ZTp2ZW5kb3IKKyAgICBlbmRpZgogZWxzZQogbXlfbGlua190eXBlIDo9IG5hdGl2ZTpwbGF0Zm9ybQogZW5kaWYKQEAgLTIyOCw3ICsyMzksNyBAQAogICAgIGVsc2UKICAgICAgIG15X2NvdmVyYWdlX3BhdGggOj0gJChUQVJHRVRfT1VUX0NPVkVSQUdFKS8kKHBhdHN1YnN0ICQoUFJPRFVDVF9PVVQpLyUsJSwkKG15X21vZHVsZV9wYXRoKSkKICAgICBlbmRpZgotICAgIG15X2NvdmVyYWdlX3BhdGggOj0gJChteV9jb3ZlcmFnZV9wYXRoKS8kKGJhc2VuYW1lICQobXlfaW5zdGFsbGVkX21vZHVsZV9zdGVtKSkuZ2Nub2RpcgorICAgIG15X2NvdmVyYWdlX3BhdGggOj0gJChteV9jb3ZlcmFnZV9wYXRoKS8kKHBhdHN1YnN0ICUuc28sJSwkKG15X2luc3RhbGxlZF9tb2R1bGVfc3RlbSkpLmdjbm9kaXIKICAgICAkKGV2YWwgJChjYWxsIGNvcHktb25lLWZpbGUsJChMT0NBTF9QUkVCVUlMVF9DT1ZFUkFHRV9BUkNISVZFKSwkKG15X2NvdmVyYWdlX3BhdGgpKSkKICAgICAkKExPQ0FMX0JVSUxUX01PRFVMRSk6ICQobXlfY292ZXJhZ2VfcGF0aCkKICAgZW5kaWYKQEAgLTM3OSw2ICszOTAsOSBAQAogJChidWlsdF9tb2R1bGUpIDogJChteV9wcmVidWlsdF9zcmNfZmlsZSkgfCAkKFpJUEFMSUdOKSAkKFNJR05BUEtfSkFSKQogCSQodHJhbnNmb3JtLXByZWJ1aWx0LXRvLXRhcmdldCkKIAkkKHVuY29tcHJlc3Mtc2hhcmVkLWxpYnMpCitpZmVxICh0cnVlLCAkKExPQ0FMX1VOQ09NUFJFU1NfREVYKSkKKwkkKHVuY29tcHJlc3MtZGV4cykKK2VuZGlmICAjIExPQ0FMX1VOQ09NUFJFU1NfREVYCiBpZmRlZiBMT0NBTF9ERVhfUFJFT1BUCiBpZm5lcSAoJChCVUlMRF9QTEFURk9STV9aSVApLCkKIAlAIyBLZWVwIGEgY29weSBvZiBhcGsgd2l0aCBjbGFzc2VzLmRleCB1bnN0cmlwcGVkCkBAIC00MDMsMTEgKzQxNywxOSBAQAogZW5kaWYgICMgISBMT0NBTF9SRVBMQUNFX1BSRUJVSUxUX0FQS19JTlNUQUxMRUQKIAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyMgUnVsZSB0byBidWlsZCB0aGUgb2RleCBmaWxlCisjIyBSdWxlIHRvIGJ1aWxkIHRoZSBvZGV4IGZpbGUuCisjIEluIGNhc2Ugd2UgZG9uJ3Qgc3RyaXAgdGhlIGJ1aWx0IG1vZHVsZSwgdXNlIGl0LCBhcyBkZXhwcmVvcHQKKyMgY2FuIGRvIG9wdGltaXphdGlvbnMgYmFzZWQgb24gd2hldGhlciB0aGUgYnVpbHQgbW9kdWxlIG9ubHkKKyMgY29udGFpbnMgdW5jb21wcmVzc2VkIGRleCBjb2RlLgogaWZkZWYgTE9DQUxfREVYX1BSRU9QVAoraWZlcSAobm9zdHJpcHBpbmcsJChMT0NBTF9ERVhfUFJFT1BUKSkKKyQoYnVpbHRfb2RleCkgOiAkKGJ1aWx0X21vZHVsZSkKKwkkKGNhbGwgZGV4cHJlb3B0LW9uZS1maWxlLCQ8LCRAKQorZWxzZQogJChidWlsdF9vZGV4KSA6ICQobXlfcHJlYnVpbHRfc3JjX2ZpbGUpCiAJJChjYWxsIGRleHByZW9wdC1vbmUtZmlsZSwkPCwkQCkKIGVuZGlmCitlbmRpZgogCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAjIyBJbnN0YWxsIHNwbGl0IGFwa3MuCkBAIC00NzAsMTEgKzQ5Miw3IEBACiAJQGVjaG8gIkRleHByZW9wdCBKYXI6ICQoUFJJVkFURV9NT0RVTEUpICgkQCkiCiAJJChjYWxsIGRleHByZW9wdC1vbmUtZmlsZSwkPCwkQCkKIAotJChidWlsdF9tb2R1bGUpIDogJChteV9wcmVidWlsdF9zcmNfZmlsZSkKLQkkKGNhbGwgY29weS1maWxlLXRvLXRhcmdldCkKLWlmbmVxIChub3N0cmlwcGluZywkKExPQ0FMX0RFWF9QUkVPUFQpKQotCSQoY2FsbCBkZXhwcmVvcHQtcmVtb3ZlLWNsYXNzZXMuZGV4LCRAKQotZW5kaWYKKyQoZXZhbCAkKGNhbGwgZGV4cHJlb3B0LWNvcHktamFyLCQobXlfcHJlYnVpbHRfc3JjX2ZpbGUpLCQoYnVpbHRfbW9kdWxlKSwkKExPQ0FMX0RFWF9QUkVPUFQpKSkKIGVuZGlmICMgYm9vdCBqYXIKIGVsc2UgIyAhIExPQ0FMX0RFWF9QUkVPUFQKICQoYnVpbHRfbW9kdWxlKSA6ICQobXlfcHJlYnVpbHRfc3JjX2ZpbGUpCkBAIC01MDAsNiArNTE4LDcgQEAKICMgZm9yIGhvc3QgamF2YSBsaWJyYXJpZXMgZGVwcyBzaG91bGQgYmUgaW4gdGhlIGNvbW1vbiBkaXIsIHNvIHdlIG1ha2UgYSBjb3B5IGluCiAjIHRoZSBjb21tb24gZGlyLgogY29tbW9uX2NsYXNzZXNfamFyIDo9ICQoaW50ZXJtZWRpYXRlcy5DT01NT04pL2NsYXNzZXMuamFyCitjb21tb25faGVhZGVyX2phciA6PSAkKGludGVybWVkaWF0ZXMuQ09NTU9OKS9jbGFzc2VzLWhlYWRlci5qYXIKIAogJChjb21tb25fY2xhc3Nlc19qYXIpOiBQUklWQVRFX01PRFVMRSA6PSAkKExPQ0FMX01PRFVMRSkKICQoY29tbW9uX2NsYXNzZXNfamFyKTogUFJJVkFURV9QUkVGSVggOj0gJChteV9wcmVmaXgpCkBAIC01MDcsMTAgKzUyNiwxNiBAQAogJChjb21tb25fY2xhc3Nlc19qYXIpIDogJChteV9zcmNfamFyKQogCSQodHJhbnNmb3JtLXByZWJ1aWx0LXRvLXRhcmdldCkKIAoraWZuZXEgKCQoVFVSQklORV9FTkFCTEVEKSxmYWxzZSkKKyQoY29tbW9uX2hlYWRlcl9qYXIpIDogJChteV9zcmNfamFyKQorCSQodHJhbnNmb3JtLXByZWJ1aWx0LXRvLXRhcmdldCkKK2VuZGlmCisKIGVsc2UgIyAhTE9DQUxfSVNfSE9TVF9NT0RVTEUKICMgZm9yIHRhcmdldCBqYXZhIGxpYnJhcmllcywgdGhlIExPQ0FMX0JVSUxUX01PRFVMRSBpcyBpbiBhIHByb2R1Y3Qtc3BlY2lmaWMgZGlyLAogIyB3aGlsZSB0aGUgZGVwcyBzaG91bGQgYmUgaW4gdGhlIGNvbW1vbiBkaXIsIHNvIHdlIG1ha2UgYSBjb3B5IGluIHRoZSBjb21tb24gZGlyLgogY29tbW9uX2NsYXNzZXNfamFyIDo9ICQoaW50ZXJtZWRpYXRlcy5DT01NT04pL2NsYXNzZXMuamFyCitjb21tb25faGVhZGVyX2phciA6PSAkKGludGVybWVkaWF0ZXMuQ09NTU9OKS9jbGFzc2VzLWhlYWRlci5qYXIKIGNvbW1vbl9jbGFzc2VzX3ByZV9wcm9ndWFyZF9qYXIgOj0gJChpbnRlcm1lZGlhdGVzLkNPTU1PTikvY2xhc3Nlcy1wcmUtcHJvZ3VhcmQuamFyCiBjb21tb25famF2YWxpYl9qYXIgOj0gJChpbnRlcm1lZGlhdGVzLkNPTU1PTikvamF2YWxpYi5qYXIKIApAQCAtNTE5LDYgKzU0NCwxMCBAQAogCiBpZmVxICgkKExPQ0FMX1NES19WRVJTSU9OKSxzeXN0ZW1fY3VycmVudCkKIG15X2xpbmtfdHlwZSA6PSBqYXZhOnN5c3RlbQorZWxzZSBpZm5lcSAoLCQoY2FsbCBoYXMtc3lzdGVtLXNkay12ZXJzaW9uLCQoTE9DQUxfU0RLX1ZFUlNJT04pKSkKK215X2xpbmtfdHlwZSA6PSBqYXZhOnN5c3RlbQorZWxzZSBpZmVxICgkKExPQ0FMX1NES19WRVJTSU9OKSxjb3JlX2N1cnJlbnQpCitteV9saW5rX3R5cGUgOj0gamF2YTpjb3JlCiBlbHNlIGlmbmVxICgkKExPQ0FMX1NES19WRVJTSU9OKSwpCiBteV9saW5rX3R5cGUgOj0gamF2YTpzZGsKIGVsc2UKQEAgLTU0Miw0NyArNTcxLDcwIEBACiBteV9zcmNfYWFyIDo9ICQoZmlsdGVyICUuYWFyLCAkKG15X3ByZWJ1aWx0X3NyY19maWxlKSkKIGlmbmVxICgkKG15X3NyY19hYXIpLCkKICMgVGhpcyBpcyAuYWFyIGZpbGUsIGFyY2hpdmUgb2YgY2xhc3Nlcy5qYXIgYW5kIEFuZHJvaWQgcmVzb3VyY2VzLgotbXlfc3JjX2phciA6PSAkKGludGVybWVkaWF0ZXMuQ09NTU9OKS9hYXIvY2xhc3Nlcy5qYXIKIAorIyBydW4gSmV0aWZpZXIgaWYgbmVlZGVkCitMT0NBTF9KRVRJRklFUl9JTlBVVF9GSUxFIDo9ICQobXlfc3JjX2FhcikKK2luY2x1ZGUgJChCVUlMRF9TWVNURU0pL2pldGlmaWVyLm1rCitteV9zcmNfYWFyIDo9ICQoTE9DQUxfSkVUSUZJRVJfT1VUUFVUX0ZJTEUpCisKK215X3NyY19qYXIgOj0gJChpbnRlcm1lZGlhdGVzLkNPTU1PTikvYWFyL2NsYXNzZXMuamFyCitteV9zcmNfcHJvZ3VhcmRfb3B0aW9ucyA6PSAkKGludGVybWVkaWF0ZXMuQ09NTU9OKS9hYXIvcHJvZ3VhcmQudHh0CisKKyQobXlfc3JjX2phcikgOiAuS0FUSV9JTVBMSUNJVF9PVVRQVVRTIDo9ICQobXlfc3JjX3Byb2d1YXJkX29wdGlvbnMpCiAkKG15X3NyY19qYXIpIDogJChteV9zcmNfYWFyKQogCSQoaGlkZSkgcm0gLXJmICQoZGlyICRAKSAmJiBta2RpciAtcCAkKGRpciAkQCkgJChkaXIgJEApL3JlcwogCSQoaGlkZSkgdW56aXAgLXFvIC1kICQoZGlyICRAKSAkPAogCSMgTWFrZSBzdXJlIHRoZSBleHRyYWN0ZWQgY2xhc3Nlcy5qYXIgaGFzIGEgbmV3IHRpbWVzdGFtcC4KIAkkKGhpZGUpIHRvdWNoICRACisJIyBNYWtlIHN1cmUgdGhlIHByb2d1YXJkIGZpbGUgZXhpc3RzIGFuZCBoYXMgYSBuZXcgdGltZXN0YW1wLgorCSQoaGlkZSkgdG91Y2ggJChkaXIgJEApL3Byb2d1YXJkLnR4dAorZWxzZQorCisjIHJ1biBKZXRpZmllciBpZiBuZWVkZWQKK0xPQ0FMX0pFVElGSUVSX0lOUFVUX0ZJTEUgOj0gJChteV9zcmNfamFyKQoraW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvamV0aWZpZXIubWsKK215X3NyY19qYXIgOj0gJChMT0NBTF9KRVRJRklFUl9PVVRQVVRfRklMRSkKIAogZW5kaWYKIAogJChjb21tb25fY2xhc3Nlc19qYXIpIDogJChteV9zcmNfamFyKQogCSQodHJhbnNmb3JtLXByZWJ1aWx0LXRvLXRhcmdldCkKIAoraWZuZXEgKCQoVFVSQklORV9FTkFCTEVEKSxmYWxzZSkKKyQoY29tbW9uX2hlYWRlcl9qYXIpIDogJChteV9zcmNfamFyKQorCSQodHJhbnNmb3JtLXByZWJ1aWx0LXRvLXRhcmdldCkKK2VuZGlmCisKICQoY29tbW9uX2NsYXNzZXNfcHJlX3Byb2d1YXJkX2phcikgOiAkKG15X3NyY19qYXIpCiAJJCh0cmFuc2Zvcm0tcHJlYnVpbHQtdG8tdGFyZ2V0KQogCiAkKGNvbW1vbl9qYXZhbGliX2phcikgOiAkKGNvbW1vbl9jbGFzc2VzX2phcikKIAkkKHRyYW5zZm9ybS1wcmVidWlsdC10by10YXJnZXQpCiAKLSQoY2FsbCBkZWZpbmUtamFyLXRvLXRvYy1ydWxlLCAkKGNvbW1vbl9jbGFzc2VzX2phcikpCitpZmRlZiBMT0NBTF9BQVBUMl9PTkxZCitMT0NBTF9VU0VfQUFQVDIgOj0gdHJ1ZQorZW5kaWYKIAogaWZkZWYgTE9DQUxfVVNFX0FBUFQyCiBpZm5lcSAoJChteV9zcmNfYWFyKSwpCisKKyQoaW50ZXJtZWRpYXRlcy5DT01NT04pL2V4cG9ydF9wcm9ndWFyZF9mbGFncyA6ICQobXlfc3JjX3Byb2d1YXJkX29wdGlvbnMpCisJJCh0cmFuc2Zvcm0tcHJlYnVpbHQtdG8tdGFyZ2V0KQorCiBMT0NBTF9TREtfUkVTX1ZFUlNJT046PSQoc3RyaXAgJChMT0NBTF9TREtfUkVTX1ZFUlNJT04pKQogaWZlcSAoJChMT0NBTF9TREtfUkVTX1ZFUlNJT04pLCkKICAgTE9DQUxfU0RLX1JFU19WRVJTSU9OOj0kKExPQ0FMX1NES19WRVJTSU9OKQogZW5kaWYKIAogZnJhbWV3b3JrX3Jlc19wYWNrYWdlX2V4cG9ydCA6PQotZnJhbWV3b3JrX3Jlc19wYWNrYWdlX2V4cG9ydF9kZXBzIDo9CiAjIFBsZWFzZSByZWZlciB0byBwYWNrYWdlLm1rCiBpZm5lcSAoJChMT0NBTF9OT19TVEFOREFSRF9MSUJSQVJJRVMpLHRydWUpCiBpZm5lcSAoJChmaWx0ZXItb3V0IGN1cnJlbnQgc3lzdGVtX2N1cnJlbnQgdGVzdF9jdXJyZW50LCQoTE9DQUxfU0RLX1JFU19WRVJTSU9OKSkkKGlmICQoVEFSR0VUX0JVSUxEX0FQUFMpLCQoZmlsdGVyIGN1cnJlbnQgc3lzdGVtX2N1cnJlbnQgdGVzdF9jdXJyZW50LCQoTE9DQUxfU0RLX1JFU19WRVJTSU9OKSkpLCkKIGZyYW1ld29ya19yZXNfcGFja2FnZV9leHBvcnQgOj0gXAogICAgICQoSElTVE9SSUNBTF9TREtfVkVSU0lPTlNfUk9PVCkvJChMT0NBTF9TREtfUkVTX1ZFUlNJT04pL2FuZHJvaWQuamFyCi1mcmFtZXdvcmtfcmVzX3BhY2thZ2VfZXhwb3J0X2RlcHMgOj0gJChmcmFtZXdvcmtfcmVzX3BhY2thZ2VfZXhwb3J0KQogZWxzZQogZnJhbWV3b3JrX3Jlc19wYWNrYWdlX2V4cG9ydCA6PSBcCiAgICAgJChjYWxsIGludGVybWVkaWF0ZXMtZGlyLWZvcixBUFBTLGZyYW1ld29yay1yZXMsLENPTU1PTikvcGFja2FnZS1leHBvcnQuYXBrCi1mcmFtZXdvcmtfcmVzX3BhY2thZ2VfZXhwb3J0X2RlcHMgOj0gXAotICAgICQoZGlyICQoZnJhbWV3b3JrX3Jlc19wYWNrYWdlX2V4cG9ydCkpc3JjL1Iuc3RhbXAKIGVuZGlmCiBlbmRpZgogCkBAIC01OTAsNyArNjQyLDcgQEAKIAogIyBXZSBuZWVkZWQgb25seSB2ZXJ5IGZldyBQUklWQVRFIHZhcmlhYmxlcyBhbmQgYWFwdDIubWsgaW5wdXQgdmFyaWFibGVzLiBSZXNldCB0aGUgdW5uZWNlc3Nhcnkgb25lcy4KICQobXlfcmVzX3BhY2thZ2UpOiBQUklWQVRFX0FBUFQyX0NGTEFHUyA6PQotJChteV9yZXNfcGFja2FnZSk6IFBSSVZBVEVfQUFQVF9GTEFHUyA6PSAtLXN0YXRpYy1saWIgLS1uby1zdGF0aWMtbGliLXBhY2thZ2VzCiskKG15X3Jlc19wYWNrYWdlKTogUFJJVkFURV9BQVBUX0ZMQUdTIDo9IC0tc3RhdGljLWxpYiAtLW5vLXN0YXRpYy1saWItcGFja2FnZXMgLS1hdXRvLWFkZC1vdmVybGF5CiAkKG15X3Jlc19wYWNrYWdlKTogUFJJVkFURV9BTkRST0lEX01BTklGRVNUIDo9ICQoaW50ZXJtZWRpYXRlcy5DT01NT04pL2Fhci9BbmRyb2lkTWFuaWZlc3QueG1sCiAkKG15X3Jlc19wYWNrYWdlKTogUFJJVkFURV9BQVBUX0lOQ0xVREVTIDo9ICQoZnJhbWV3b3JrX3Jlc19wYWNrYWdlX2V4cG9ydCkKICQobXlfcmVzX3BhY2thZ2UpOiBQUklWQVRFX1NPVVJDRV9JTlRFUk1FRElBVEVTX0RJUiA6PQpAQCAtNjAwLDcgKzY1Miw3IEBACiAkKG15X3Jlc19wYWNrYWdlKTogUFJJVkFURV9QUk9EVUNUX0FBUFRfQ09ORklHIDo9CiAkKG15X3Jlc19wYWNrYWdlKTogUFJJVkFURV9QUk9EVUNUX0FBUFRfUFJFRl9DT05GSUcgOj0KICQobXlfcmVzX3BhY2thZ2UpOiBQUklWQVRFX1RBUkdFVF9BQVBUX0NIQVJBQ1RFUklTVElDUyA6PQotJChteV9yZXNfcGFja2FnZSkgOiAkKGZyYW1ld29ya19yZXNfcGFja2FnZV9leHBvcnRfZGVwcykKKyQobXlfcmVzX3BhY2thZ2UpIDogJChmcmFtZXdvcmtfcmVzX3BhY2thZ2VfZXhwb3J0KQogCiBmdWxsX2FuZHJvaWRfbWFuaWZlc3QgOj0KIG15X3Jlc19yZXNvdXJjZXMgOj0KQEAgLTYyMiwyNSArNjc0LDYgQEAKIGVuZGlmICMgISBwcmVidWlsdF9tb2R1bGVfaXNfZGV4X2phdmFsaWIKIGVuZGlmICMgTE9DQUxfSVNfSE9TVF9NT0RVTEUgaXMgbm90IHNldAogCi1pZm5lcSAoJChwcmVidWlsdF9tb2R1bGVfaXNfZGV4X2phdmFsaWIpLHRydWUpCi0KLWlmZGVmIExPQ0FMX0pBQ0tfRU5BQkxFRAotIyBXZSBtYXkgYmUgYnVpbGRpbmcgY2xhc3Nlcy5qYWNrIGZyb20gYSBob3N0IGphciBmb3IgaG9zdCBkYWx2aWsgSmF2YSBsaWJyYXJ5LgotJChpbnRlcm1lZGlhdGVzLkNPTU1PTikvY2xhc3Nlcy5qYWNrIDogUFJJVkFURV9KQUNLX0ZMQUdTOj0kKExPQ0FMX0pBQ0tfRkxBR1MpCi0kKGludGVybWVkaWF0ZXMuQ09NTU9OKS9jbGFzc2VzLmphY2sgOiBQUklWQVRFX0pBQ0tfTUlOX1NES19WRVJTSU9OIDo9ICQoaWYgJChzdHJpcCAkKExPQ0FMX01JTl9TREtfVkVSU0lPTikpLCQoTE9DQUxfTUlOX1NES19WRVJTSU9OKSwxKQotJChpbnRlcm1lZGlhdGVzLkNPTU1PTikvY2xhc3Nlcy5qYWNrIDogUFJJVkFURV9KQUNLX1BMVUdJTl9QQVRIIDo9ICQoTE9DQUxfSkFDS19QTFVHSU5fUEFUSCkKLSQoaW50ZXJtZWRpYXRlcy5DT01NT04pL2NsYXNzZXMuamFjayA6IFBSSVZBVEVfSkFDS19QTFVHSU4gOj0gJChMT0NBTF9KQUNLX1BMVUdJTikKLSQoaW50ZXJtZWRpYXRlcy5DT01NT04pL2NsYXNzZXMuamFjayA6ICQoTE9DQUxfSkFDS19QTFVHSU5fUEFUSCkgJChteV9zcmNfamFyKSBcCi0gICAgICAgICQoTE9DQUxfQURESVRJT05BTF9ERVBFTkRFTkNJRVMpICQoSkFDS19ERUZBVUxUX0FSR1MpICQoSkFDSykgXAotICAgICAgICB8IHNldHVwLWphY2stc2VydmVyCi0JJCh0cmFuc2Zvcm0tamFyLXRvLWphY2spCi0KLSMgVXBkYXRlIHRpbWVzdGFtcHMgb2YgLnRvYyBmaWxlcyBmb3IgcHJlYnVpbHRzIHNvIGRlcGVuZGVudHMgd2lsbCBiZQotIyBhbHdheXMgcmVidWlsdC4KLSQoaW50ZXJtZWRpYXRlcy5DT01NT04pL2NsYXNzZXMuZGV4LnRvYzogJChpbnRlcm1lZGlhdGVzLkNPTU1PTikvY2xhc3Nlcy5qYWNrCi0JdG91Y2ggJEAKLWVuZGlmICMgTE9DQUxfSkFDS19FTkFCTEVECi1lbmRpZiAjICEgcHJlYnVpbHRfbW9kdWxlX2lzX2RleF9qYXZhbGliCiBlbmRpZiAjIEpBVkFfTElCUkFSSUVTCiAKICQoYnVpbHRfbW9kdWxlKSA6ICQoTE9DQUxfQURESVRJT05BTF9ERVBFTkRFTkNJRVMpCmRpZmYgLS1naXQgYS9jb3JlL3Byb2R1Y3QtZ3JhcGgubWsgYi9jb3JlL3Byb2R1Y3QtZ3JhcGgubWsKaW5kZXggMzZlOTAzNy4uNTc2ZDE0ZCAxMDA2NDQKLS0tIGEvY29yZS9wcm9kdWN0LWdyYXBoLm1rCisrKyBiL2NvcmUvcHJvZHVjdC1ncmFwaC5tawpAQCAtMzQsNyArMzQsNyBAQAogZW5kZWYKIAogCi10aGlzX21ha2VmaWxlIDo9IGJ1aWxkL2NvcmUvcHJvZHVjdC1ncmFwaC5tawordGhpc19tYWtlZmlsZSA6PSBidWlsZC9tYWtlL2NvcmUvcHJvZHVjdC1ncmFwaC5tawogCiBwcm9kdWN0c19zdmcgOj0gJChPVVRfRElSKS9wcm9kdWN0cy5zdmcKIHByb2R1Y3RzX3BkZiA6PSAkKE9VVF9ESVIpL3Byb2R1Y3RzLnBkZgpAQCAtNzcsNyArNzcsNyBAQAogCSAgJChmb3JlYWNoIGQsJChQUk9EVUNUUy4kKHN0cmlwICQocCkpLklOSEVSSVRTX0ZST00pLCBlY2hvIFwiJChkKVwiIC1cPiBcIiQocClcIiA+PiAkQC5pbjspKQogCSQoZm9yZWFjaCBwLCQoUFJJVkFURV9QUk9EVUNUUyksJChjYWxsIGVtaXQtcHJvZHVjdC1ub2RlLXByb3BzLCQocCksJEAuaW4pKQogCSQoaGlkZSkgZWNobyAnfScgPj4gJEAuaW4KLQkkKGhpZGUpIC4vYnVpbGQvdG9vbHMvZmlsdGVyLXByb2R1Y3QtZ3JhcGgucHkgJChQUklWQVRFX1BST0RVQ1RTX0ZJTFRFUikgPCAkQC5pbiA+ICRACisJJChoaWRlKSBidWlsZC9tYWtlL3Rvb2xzL2ZpbHRlci1wcm9kdWN0LWdyYXBoLnB5ICQoUFJJVkFURV9QUk9EVUNUU19GSUxURVIpIDwgJEAuaW4gPiAkQAogCiAjIEV2YWx1YXRlcyB0byB0aGUgbmFtZSBvZiB0aGUgcHJvZHVjdCBmaWxlCiAjICQoMSkgcHJvZHVjdCBmaWxlCkBAIC0xMDMsNiArMTAzLDggQEAKIAkkKGhpZGUpIGVjaG8gJ1BST0RVQ1RfTUFOVUZBQ1RVUkVSPSQkKFBST0RVQ1RTLiQoc3RyaXAgJCgxKSkuUFJPRFVDVF9NQU5VRkFDVFVSRVIpJyA+PiAkJEAKIAkkKGhpZGUpIGVjaG8gJ1BST0RVQ1RfUFJPUEVSVFlfT1ZFUlJJREVTPSQkKFBST0RVQ1RTLiQoc3RyaXAgJCgxKSkuUFJPRFVDVF9QUk9QRVJUWV9PVkVSUklERVMpJyA+PiAkJEAKIAkkKGhpZGUpIGVjaG8gJ1BST0RVQ1RfREVGQVVMVF9QUk9QRVJUWV9PVkVSUklERVM9JCQoUFJPRFVDVFMuJChzdHJpcCAkKDEpKS5QUk9EVUNUX0RFRkFVTFRfUFJPUEVSVFlfT1ZFUlJJREVTKScgPj4gJCRACisJJChoaWRlKSBlY2hvICdQUk9EVUNUX1NZU1RFTV9ERUZBVUxUX1BST1BFUlRJRVM9JCQoUFJPRFVDVFMuJChzdHJpcCAkKDEpKS5QUk9EVUNUX1NZU1RFTV9ERUZBVUxUX1BST1BFUlRJRVMpJyA+PiAkJEAKKwkkKGhpZGUpIGVjaG8gJ1BST0RVQ1RfUFJPRFVDVF9QUk9QRVJUSUVTPSQkKFBST0RVQ1RTLiQoc3RyaXAgJCgxKSkuUFJPRFVDVF9QUk9EVUNUX1BST1BFUlRJRVMpJyA+PiAkJEAKIAkkKGhpZGUpIGVjaG8gJ1BST0RVQ1RfQ0hBUkFDVEVSSVNUSUNTPSQkKFBST0RVQ1RTLiQoc3RyaXAgJCgxKSkuUFJPRFVDVF9DSEFSQUNURVJJU1RJQ1MpJyA+PiAkJEAKIAkkKGhpZGUpIGVjaG8gJ1BST0RVQ1RfQ09QWV9GSUxFUz0kJChQUk9EVUNUUy4kKHN0cmlwICQoMSkpLlBST0RVQ1RfQ09QWV9GSUxFUyknID4+ICQkQAogCSQoaGlkZSkgZWNobyAnUFJPRFVDVF9PVEFfUFVCTElDX0tFWVM9JCQoUFJPRFVDVFMuJChzdHJpcCAkKDEpKS5QUk9EVUNUX09UQV9QVUJMSUNfS0VZUyknID4+ICQkQApAQCAtMTIwLDExICsxMjIsMTEgQEAKIAogJChjYWxsIHByb2R1Y3QtZGVidWctZmlsZW5hbWUsICQocCkpOiBcCiAJCQkkKE9VVF9ESVIpL3Byb2R1Y3RzLyQoc3RyaXAgJCgxKSkudHh0IFwKLQkJCWJ1aWxkL3Rvb2xzL3Byb2R1Y3RfZGVidWcucHkgXAorCQkJYnVpbGQvbWFrZS90b29scy9wcm9kdWN0X2RlYnVnLnB5IFwKIAkJCSQodGhpc19tYWtlZmlsZSkKIAlAZWNobyBQcm9kdWN0IGRlYnVnIGh0bWwgZmlsZTogJCRACiAJJChoaWRlKSBta2RpciAtcCAkJChkaXIgJCRAKQotCSQoaGlkZSkgY2F0ICQkPCB8IGJ1aWxkL3Rvb2xzL3Byb2R1Y3RfZGVidWcucHkgPiAkJEAKKwkkKGhpZGUpIGNhdCAkJDwgfCBidWlsZC9tYWtlL3Rvb2xzL3Byb2R1Y3RfZGVidWcucHkgPiAkJEAKIGVuZGVmCiAKIHByb2R1Y3RfZGVidWdfZmlsZXM6PQpkaWZmIC0tZ2l0IGEvY29yZS9wcm9kdWN0Lm1rIGIvY29yZS9wcm9kdWN0Lm1rCmluZGV4IDQ2ODJkYWMuLjg5OWI4MDYgMTAwNjQ0Ci0tLSBhL2NvcmUvcHJvZHVjdC5taworKysgYi9jb3JlL3Byb2R1Y3QubWsKQEAgLTg4LDYgKzg4LDcgQEAKICAgICBQUk9EVUNUX0JSQU5EIFwKICAgICBQUk9EVUNUX1BST1BFUlRZX09WRVJSSURFUyBcCiAgICAgUFJPRFVDVF9ERUZBVUxUX1BST1BFUlRZX09WRVJSSURFUyBcCisgICAgUFJPRFVDVF9QUk9EVUNUX1BST1BFUlRJRVMgXAogICAgIFBST0RVQ1RfQ0hBUkFDVEVSSVNUSUNTIFwKICAgICBQUk9EVUNUX0NPUFlfRklMRVMgXAogICAgIFBST0RVQ1RfT1RBX1BVQkxJQ19LRVlTIFwKQEAgLTEwMiw2ICsxMDMsNyBAQAogICAgIFBST0RVQ1RfU0RLX0FERE9OX0NPUFlfTU9EVUxFUyBcCiAgICAgUFJPRFVDVF9TREtfQURET05fRE9DX01PRFVMRVMgXAogICAgIFBST0RVQ1RfU0RLX0FERE9OX1NZU19JTUdfU09VUkNFX1BST1AgXAorICAgIFBST0RVQ1RfU09PTkdfTkFNRVNQQUNFUyBcCiAgICAgUFJPRFVDVF9ERUZBVUxUX1dJRklfQ0hBTk5FTFMgXAogICAgIFBST0RVQ1RfREVGQVVMVF9ERVZfQ0VSVElGSUNBVEUgXAogICAgIFBST0RVQ1RfUkVTVFJJQ1RfVkVORE9SX0ZJTEVTIFwKQEAgLTExMiwyNyArMTE0LDM1IEBACiAgICAgUFJPRFVDVF9TVVBQT1JUU19WRVJJVFkgXAogICAgIFBST0RVQ1RfU1VQUE9SVFNfVkVSSVRZX0ZFQyBcCiAgICAgUFJPRFVDVF9PRU1fUFJPUEVSVElFUyBcCisgICAgUFJPRFVDVF9TWVNURU1fREVGQVVMVF9QUk9QRVJUSUVTIFwKICAgICBQUk9EVUNUX1NZU1RFTV9QUk9QRVJUWV9CTEFDS0xJU1QgXAorICAgIFBST0RVQ1RfVkVORE9SX1BST1BFUlRZX0JMQUNLTElTVCBcCiAgICAgUFJPRFVDVF9TWVNURU1fU0VSVkVSX0FQUFMgXAogICAgIFBST0RVQ1RfU1lTVEVNX1NFUlZFUl9KQVJTIFwKICAgICBQUk9EVUNUX0FMV0FZU19QUkVPUFRfRVhUUkFDVEVEX0FQSyBcCiAgICAgUFJPRFVDVF9ERVhQUkVPUFRfU1BFRURfQVBQUyBcCisgICAgUFJPRFVDVF9MT0FERURfQllfUFJJVklMRUdFRF9NT0RVTEVTIFwKICAgICBQUk9EVUNUX1ZCT09UX1NJR05JTkdfS0VZIFwKICAgICBQUk9EVUNUX1ZCT09UX1NJR05JTkdfU1VCS0VZIFwKICAgICBQUk9EVUNUX1ZFUklUWV9TSUdOSU5HX0tFWSBcCiAgICAgUFJPRFVDVF9TWVNURU1fVkVSSVRZX1BBUlRJVElPTiBcCiAgICAgUFJPRFVDVF9WRU5ET1JfVkVSSVRZX1BBUlRJVElPTiBcCisgICAgUFJPRFVDVF9QUk9EVUNUX1ZFUklUWV9QQVJUSVRJT04gXAogICAgIFBST0RVQ1RfU1lTVEVNX1NFUlZFUl9ERUJVR19JTkZPIFwKKyAgICBQUk9EVUNUX09USEVSX0pBVkFfREVCVUdfSU5GTyBcCiAgICAgUFJPRFVDVF9ERVhfUFJFT1BUX01PRFVMRV9DT05GSUdTIFwKKyAgICBQUk9EVUNUX0RFWF9QUkVPUFRfREVGQVVMVF9DT01QSUxFUl9GSUxURVIgXAogICAgIFBST0RVQ1RfREVYX1BSRU9QVF9ERUZBVUxUX0ZMQUdTIFwKICAgICBQUk9EVUNUX0RFWF9QUkVPUFRfQk9PVF9GTEFHUyBcCiAgICAgUFJPRFVDVF9ERVhfUFJFT1BUX1BST0ZJTEVfRElSIFwKICAgICBQUk9EVUNUX0RFWF9QUkVPUFRfQk9PVF9JTUFHRV9QUk9GSUxFX0xPQ0FUSU9OIFwKKyAgICBQUk9EVUNUX0RFWF9QUkVPUFRfR0VORVJBVEVfRE1fRklMRVMgXAogICAgIFBST0RVQ1RfVVNFX1BST0ZJTEVfRk9SX0JPT1RfSU1BR0UgXAogICAgIFBST0RVQ1RfU1lTVEVNX1NFUlZFUl9DT01QSUxFUl9GSUxURVIgXAogICAgIFBST0RVQ1RfU0FOSVRJWkVSX01PRFVMRV9DT05GSUdTIFwKICAgICBQUk9EVUNUX1NZU1RFTV9CQVNFX0ZTX1BBVEggXAogICAgIFBST0RVQ1RfVkVORE9SX0JBU0VfRlNfUEFUSCBcCisgICAgUFJPRFVDVF9QUk9EVUNUX0JBU0VfRlNfUEFUSCBcCiAgICAgUFJPRFVDVF9TSElQUElOR19BUElfTEVWRUwgXAogICAgIFZFTkRPUl9QUk9EVUNUX1JFU1RSSUNUX1ZFTkRPUl9GSUxFUyBcCiAgICAgVkVORE9SX0VYQ0VQVElPTl9NT0RVTEVTIFwKQEAgLTE0Myw4ICsxNTMsMTEgQEAKICAgICBQUk9EVUNUX1NZU1RFTV9IRUFEUk9PTSBcCiAgICAgUFJPRFVDVF9NSU5JTUlaRV9KQVZBX0RFQlVHX0lORk8gXAogICAgIFBST0RVQ1RfSU5URUdFUl9PVkVSRkxPV19FWENMVURFX1BBVEhTIFwKLQotCisgICAgUFJPRFVDVF9BREJfS0VZUyBcCisgICAgUFJPRFVDVF9DRklfSU5DTFVERV9QQVRIUyBcCisgICAgUFJPRFVDVF9DRklfRVhDTFVERV9QQVRIUyBcCisgICAgUFJPRFVDVF9DT01QQVRJQkxFX1BST1BFUlRZX09WRVJSSURFIFwKKyAgICBQUk9EVUNUX0FDVElPTkFCTEVfQ09NUEFUSUJMRV9QUk9QRVJUWV9ESVNBQkxFIFwKIAogZGVmaW5lIGR1bXAtcHJvZHVjdAogJChpbmZvID09PT0gJCgxKSA9PT09KVwKQEAgLTI5OCwxNCArMzExLDE1IEBACiAJQk9BUkRfRkxBU0hfQkxPQ0tfU0laRSBcCiAJQk9BUkRfVkVORE9SSU1BR0VfUEFSVElUSU9OX1NJWkUgXAogCUJPQVJEX1ZFTkRPUklNQUdFX0ZJTEVfU1lTVEVNX1RZUEUgXAorCUJPQVJEX1BST0RVQ1RJTUFHRV9QQVJUSVRJT05fU0laRSBcCisJQk9BUkRfUFJPRFVDVElNQUdFX0ZJTEVfU1lTVEVNX1RZUEUgXAogCUJPQVJEX0lOU1RBTExFUl9DTURMSU5FIFwKIAogCiBfcHJvZHVjdF9zdGFzaF92YXJfbGlzdCArPSBcCiAJREVGQVVMVF9TWVNURU1fREVWX0NFUlRJRklDQVRFIFwKIAlXSVRIX0RFWFBSRU9QVCBcCi0JV0lUSF9ERVhQUkVPUFRfQk9PVF9JTUdfQU5EX1NZU1RFTV9TRVJWRVJfT05MWSBcCi0JV0lUSF9ERVhQUkVPUFRfQVBQX0lNQUdFCisJV0lUSF9ERVhQUkVPUFRfQk9PVF9JTUdfQU5EX1NZU1RFTV9TRVJWRVJfT05MWQogCiAjCiAjIE1hcmsgdGhlIHZhcmlhYmxlcyBpbiBfcHJvZHVjdF9zdGFzaF92YXJfbGlzdCBhcyByZWFkb25seQpkaWZmIC0tZ2l0IGEvY29yZS9wcm9kdWN0X2NvbmZpZy5tayBiL2NvcmUvcHJvZHVjdF9jb25maWcubWsKaW5kZXggZjdhZTgzNC4uOTQwNjgxMiAxMDA2NDQKLS0tIGEvY29yZS9wcm9kdWN0X2NvbmZpZy5taworKysgYi9jb3JlL3Byb2R1Y3RfY29uZmlnLm1rCkBAIC04OCw3ICs4OCw3IEBACiAjIFByb3ZpZGUgIlBST0RVQ1QtPHByb2RuYW1lPi08Z29hbD4iIHRhcmdldHMsIHdoaWNoIGxldHMgeW91IGJ1aWxkCiAjIGEgcGFydGljdWxhciBjb25maWd1cmF0aW9uIHdpdGhvdXQgbmVlZGluZyB0byBzZXQgdXAgdGhlIGVudmlyb25tZW50LgogIwotaWZuZGVmIEtBVEkKK2lmZXEgKCQoQ0FMTEVEX0ZST01fU0VUVVApLHRydWUpCiBwcm9kdWN0X2dvYWxzIDo9ICQoc3RyaXAgJChmaWx0ZXIgUFJPRFVDVC0lLCQoTUFLRUNNREdPQUxTKSkpCiBpZmRlZiBwcm9kdWN0X2dvYWxzCiAgICMgU2NyYXBlIHRoZSBwcm9kdWN0IGFuZCBidWlsZCBuYW1lcyBvdXQgb2YgdGhlIGdvYWwsCkBAIC0xMjksMTQgKzEyOSwxNCBAQAogICAjIHBvc2l0aW9uLCBpbiBjYXNlIGl0IG1hdHRlcnMuCiAgIG92ZXJyaWRlIE1BS0VDTURHT0FMUyA6PSAkKHBhdHN1YnN0ICQoZ29hbF9uYW1lKSwkKGRlZmF1bHRfZ29hbF9zdWJzdGl0dXRpb24pLCQoTUFLRUNNREdPQUxTKSkKIGVuZGlmCi1lbmRpZiAjICFLQVRJCitlbmRpZiAjIENBTExFRF9GUk9NX1NFVFVQCiAjIGVsc2U6IFVzZSB0aGUgdmFsdWUgc2V0IGluIHRoZSBlbnZpcm9ubWVudCBvciBidWlsZHNwZWMubWsuCiAKICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAjIFByb3ZpZGUgIkFQUC08YXBwbmFtZT4iIHRhcmdldHMsIHdoaWNoIGxldHMgeW91IGJ1aWxkCiAjIGFuIHVuYnVuZGxlZCBhcHAuCiAjCi1pZm5kZWYgS0FUSQoraWZlcSAoJChDQUxMRURfRlJPTV9TRVRVUCksdHJ1ZSkKIHVuYnVuZGxlZF9nb2FscyA6PSAkKHN0cmlwICQoZmlsdGVyIEFQUC0lLCQoTUFLRUNNREdPQUxTKSkpCiBpZmRlZiB1bmJ1bmRsZWRfZ29hbHMKICAgaWZuZXEgKCQod29yZHMgJCh1bmJ1bmRsZWRfZ29hbHMpKSwxKQpAQCAtMTUxLDYgKzE1MSwxMyBAQAogZW5kaWYgIyB1bmJ1bmRsZWRfZ29hbHMKIGVuZGlmCiAKKyMgTm93IHRoYXQgd2UndmUgcGFyc2VkIEFQUC0qIGFuZCBQUk9EVUNULSosIG1hcmsgdGhlc2UgYXMgcmVhZG9ubHkKK1RBUkdFVF9CVUlMRF9BUFBTID89CisuS0FUSV9SRUFET05MWSA6PSBcCisgIFRBUkdFVF9QUk9EVUNUIFwKKyAgVEFSR0VUX0JVSUxEX1ZBUklBTlQgXAorICBUQVJHRVRfQlVJTERfQVBQUworCiAjIERlZmF1bHQgdG8gYnVpbGRpbmcgZGFsdmlrdm0gb24gaG9zdHMgdGhhdCBzdXBwb3J0IGl0Li4uCiBpZmVxICgkKEhPU1RfT1MpLGxpbnV4KQogIyAuLi4gb3IgaWYgdGhlIGlmIHRoZSBvcHRpb24gaXMgYWxyZWFkeSBzZXQKQEAgLTI1OSw2ICsyNjYsNyBAQAogUFJPRFVDVF9TWVNURU1fU0VSVkVSX0pBUlMgOj0gJChzdHJpcCAkKFBST0RVQ1RTLiQoSU5URVJOQUxfUFJPRFVDVCkuUFJPRFVDVF9TWVNURU1fU0VSVkVSX0pBUlMpKQogUFJPRFVDVF9TWVNURU1fU0VSVkVSX0FQUFMgOj0gJChzdHJpcCAkKFBST0RVQ1RTLiQoSU5URVJOQUxfUFJPRFVDVCkuUFJPRFVDVF9TWVNURU1fU0VSVkVSX0FQUFMpKQogUFJPRFVDVF9ERVhQUkVPUFRfU1BFRURfQVBQUyA6PSAkKHN0cmlwICQoUFJPRFVDVFMuJChJTlRFUk5BTF9QUk9EVUNUKS5QUk9EVUNUX0RFWFBSRU9QVF9TUEVFRF9BUFBTKSkKK1BST0RVQ1RfTE9BREVEX0JZX1BSSVZJTEVHRURfTU9EVUxFUyA6PSAkKHN0cmlwICQoUFJPRFVDVFMuJChJTlRFUk5BTF9QUk9EVUNUKS5QUk9EVUNUX0xPQURFRF9CWV9QUklWSUxFR0VEX01PRFVMRVMpKQogCiAjIEFsbCBvZiB0aGUgYXBwcyB0aGF0IHdlIGZvcmNlIHByZW9wdCwgdGhpcyBvdmVycmlkZXMgV0lUSF9ERVhQUkVPUFQuCiBQUk9EVUNUX0FMV0FZU19QUkVPUFRfRVhUUkFDVEVEX0FQSyA6PSAkKHN0cmlwICQoUFJPRFVDVFMuJChJTlRFUk5BTF9QUk9EVUNUKS5QUk9EVUNUX0FMV0FZU19QUkVPUFRfRVhUUkFDVEVEX0FQSykpCkBAIC0yOTUsMTUgKzMwMyw2IEBACiBQUk9EVUNUX0FBUFRfQ09ORklHIDo9IFwKICAgICAkKHN1YnN0ICQoc3BhY2UpLCQoY29tbWEpLCQoc3RyaXAgJChQUk9EVUNUX0FBUFRfQ09ORklHKSkpCiAKLSMgcHJvZHVjdC1zY29wZWQgYWFwdCBmbGFncwotUFJPRFVDVF9BQVBUX0ZMQUdTIDo9Ci1QUk9EVUNUX0FBUFQyX0NGTEFHUyA6PQotaWZuZXEgKCQoZmlsdGVyIGVuX1hBIGFyX1hCLCQoUFJPRFVDVF9MT0NBTEVTKSksKQotICAjIEZvcmNlIGdlbmVyYXRpbmcgcmVzb3VyY2VzIGZvciBwc2V1ZG8tbG9jYWxlcy4KLSAgUFJPRFVDVF9BQVBUMl9DRkxBR1MgKz0gLS1wc2V1ZG8tbG9jYWxpemUKLSAgUFJPRFVDVF9BQVBUX0ZMQUdTICs9IC0tcHNldWRvLWxvY2FsaXplCi1lbmRpZgotCiBQUk9EVUNUX0JSQU5EIDo9ICQoc3RyaXAgJChQUk9EVUNUUy4kKElOVEVSTkFMX1BST0RVQ1QpLlBST0RVQ1RfQlJBTkQpKQogCiBQUk9EVUNUX01PREVMIDo9ICQoc3RyaXAgJChQUk9EVUNUUy4kKElOVEVSTkFMX1BST0RVQ1QpLlBST0RVQ1RfTU9ERUwpKQpAQCAtMzM5LDcgKzMzOCw3IEBACiAjIFRoZSBmaWxlIGF0IHRoZSBzb3VyY2UgcGF0aCBzaG91bGQgYmUgY29waWVkIHRvIHRoZSBkZXN0aW5hdGlvbiBwYXRoCiAjIHdoZW4gYnVpbGRpbmcgIHRoaXMgcHJvZHVjdC4gIDxkZXN0aW5hdGlvbiBwYXRoPiBpcyByZWxhdGl2ZSB0bwogIyAkKFBST0RVQ1RfT1VUKSwgc28gaXQgc2hvdWxkIGxvb2sgbGlrZSwgZS5nLiwgInN5c3RlbS9ldGMvZmlsZS54bWwiLgotIyBUaGUgcnVsZXMgZm9yIHRoZXNlIGNvcHkgc3RlcHMgYXJlIGRlZmluZWQgaW4gYnVpbGQvY29yZS9NYWtlZmlsZS4KKyMgVGhlIHJ1bGVzIGZvciB0aGVzZSBjb3B5IHN0ZXBzIGFyZSBkZWZpbmVkIGluIGJ1aWxkL21ha2UvY29yZS9NYWtlZmlsZS4KICMgVGhlIG9wdGlvbmFsIDo8b3duZXI+IGlzIHVzZWQgdG8gaW5kaWNhdGUgdGhlIG93bmVyIG9mIGEgdmVuZG9yIGZpbGUuCiBQUk9EVUNUX0NPUFlfRklMRVMgOj0gXAogICAgICQoc3RyaXAgJChQUk9EVUNUUy4kKElOVEVSTkFMX1BST0RVQ1QpLlBST0RVQ1RfQ09QWV9GSUxFUykpCkBAIC0zNTksNiArMzU4LDIwIEBACiAgICAgJChzdHJpcCAkKFBST0RVQ1RTLiQoSU5URVJOQUxfUFJPRFVDVCkuUFJPRFVDVF9ERUZBVUxUX1BST1BFUlRZX09WRVJSSURFUykpCiAuS0FUSV9SRUFET05MWSA6PSBQUk9EVUNUX0RFRkFVTFRfUFJPUEVSVFlfT1ZFUlJJREVTCiAKKyMgQSBsaXN0IG9mIHByb3BlcnR5IGFzc2lnbm1lbnRzLCBsaWtlICJrZXkgPSB2YWx1ZSIsIHdpdGggemVybyBvciBtb3JlCisjIHdoaXRlc3BhY2UgY2hhcmFjdGVycyBvbiBlaXRoZXIgc2lkZSBvZiB0aGUgJz0nLgorIyB1c2VkIGZvciBhZGRpbmcgcHJvcGVydGllcyB0byBkZWZhdWx0LnByb3Agb2Ygc3lzdGVtIHBhcnRpdGlvbgorUFJPRFVDVF9TWVNURU1fREVGQVVMVF9QUk9QRVJUSUVTIDo9IFwKKyAgICAkKHN0cmlwICQoUFJPRFVDVFMuJChJTlRFUk5BTF9QUk9EVUNUKS5QUk9EVUNUX1NZU1RFTV9ERUZBVUxUX1BST1BFUlRJRVMpKQorLktBVElfUkVBRE9OTFkgOj0gUFJPRFVDVF9TWVNURU1fREVGQVVMVF9QUk9QRVJUSUVTCisKKyMgQSBsaXN0IG9mIHByb3BlcnR5IGFzc2lnbm1lbnRzLCBsaWtlICJrZXkgPSB2YWx1ZSIsIHdpdGggemVybyBvciBtb3JlCisjIHdoaXRlc3BhY2UgY2hhcmFjdGVycyBvbiBlaXRoZXIgc2lkZSBvZiB0aGUgJz0nLgorIyB1c2VkIGZvciBhZGRpbmcgcHJvcGVydGllcyB0byBidWlsZC5wcm9wIG9mIHByb2R1Y3QgcGFydGl0aW9uCitQUk9EVUNUX1BST0RVQ1RfUFJPUEVSVElFUyA6PSBcCisgICAgJChzdHJpcCAkKFBST0RVQ1RTLiQoSU5URVJOQUxfUFJPRFVDVCkuUFJPRFVDVF9QUk9EVUNUX1BST1BFUlRJRVMpKQorLktBVElfUkVBRE9OTFkgOj0gUFJPRFVDVF9QUk9EVUNUX1BST1BFUlRJRVMKKwogIyBTaG91bGQgd2UgdXNlIHRoZSBkZWZhdWx0IHJlc291cmNlcyBvciBhZGQgYW55IHByb2R1Y3Qgc3BlY2lmaWMgb3ZlcmxheXMKIFBST0RVQ1RfUEFDS0FHRV9PVkVSTEFZUyA6PSBcCiAgICAgJChzdHJpcCAkKFBST0RVQ1RTLiQoSU5URVJOQUxfUFJPRFVDVCkuUFJPRFVDVF9QQUNLQUdFX09WRVJMQVlTKSkKQEAgLTM3OSw4ICszOTIsMTIgQEAKIFBST0RVQ1RfRVhUUkFfUkVDT1ZFUllfS0VZUyA6PSAkKHNvcnQgXAogICAgICQoUFJPRFVDVFMuJChJTlRFUk5BTF9QUk9EVUNUKS5QUk9EVUNUX0VYVFJBX1JFQ09WRVJZX0tFWVMpKQogCitQUk9EVUNUX0RFWF9QUkVPUFRfREVGQVVMVF9DT01QSUxFUl9GSUxURVIgOj0gXAorICAgICQoc3RyaXAgJChQUk9EVUNUUy4kKElOVEVSTkFMX1BST0RVQ1QpLlBST0RVQ1RfREVYX1BSRU9QVF9ERUZBVUxUX0NPTVBJTEVSX0ZJTFRFUikpCiBQUk9EVUNUX0RFWF9QUkVPUFRfREVGQVVMVF9GTEFHUyA6PSBcCiAgICAgJChzdHJpcCAkKFBST0RVQ1RTLiQoSU5URVJOQUxfUFJPRFVDVCkuUFJPRFVDVF9ERVhfUFJFT1BUX0RFRkFVTFRfRkxBR1MpKQorUFJPRFVDVF9ERVhfUFJFT1BUX0dFTkVSQVRFX0RNX0ZJTEVTIDo9IFwKKyAgICAkKHN0cmlwICQoUFJPRFVDVFMuJChJTlRFUk5BTF9QUk9EVUNUKS5QUk9EVUNUX0RFWF9QUkVPUFRfR0VORVJBVEVfRE1fRklMRVMpKQogUFJPRFVDVF9ERVhfUFJFT1BUX0JPT1RfRkxBR1MgOj0gXAogICAgICQoc3RyaXAgJChQUk9EVUNUUy4kKElOVEVSTkFMX1BST0RVQ1QpLlBST0RVQ1RfREVYX1BSRU9QVF9CT09UX0ZMQUdTKSkKIFBST0RVQ1RfREVYX1BSRU9QVF9QUk9GSUxFX0RJUiA6PSBcCkBAIC0zOTYsNiArNDEzLDggQEAKICAgICAkKHN0cmlwICQoUFJPRFVDVFMuJChJTlRFUk5BTF9QUk9EVUNUKS5QUk9EVUNUX1NZU1RFTV9TRVJWRVJfQ09NUElMRVJfRklMVEVSKSkKIFBST0RVQ1RfU1lTVEVNX1NFUlZFUl9ERUJVR19JTkZPIDo9IFwKICAgICAkKHN0cmlwICQoUFJPRFVDVFMuJChJTlRFUk5BTF9QUk9EVUNUKS5QUk9EVUNUX1NZU1RFTV9TRVJWRVJfREVCVUdfSU5GTykpCitQUk9EVUNUX09USEVSX0pBVkFfREVCVUdfSU5GTyA6PSBcCisgICAgJChzdHJpcCAkKFBST0RVQ1RTLiQoSU5URVJOQUxfUFJPRFVDVCkuUFJPRFVDVF9PVEhFUl9KQVZBX0RFQlVHX0lORk8pKQogCiAjIFJlc29sdmUgYW5kIHNldHVwIHBlci1tb2R1bGUgZGV4LXByZW9wdCBjb25maWdzLgogUFJPRFVDVF9ERVhfUFJFT1BUX01PRFVMRV9DT05GSUdTIDo9IFwKQEAgLTQ1NiwzICs0NzUsMzMgQEAKICMgV2hldGhlciBhbnkgcGF0aHMgYXJlIGV4Y2x1ZGVkIGZyb20gc2FuaXRpemF0aW9uIHdoZW4gU0FOSVRJWkVfVEFSR0VUPWludGVnZXJfb3ZlcmZsb3cKIFBST0RVQ1RfSU5URUdFUl9PVkVSRkxPV19FWENMVURFX1BBVEhTIDo9IFwKICAgICAkKHN0cmlwICQoUFJPRFVDVFMuJChJTlRFUk5BTF9QUk9EVUNUKS5QUk9EVUNUX0lOVEVHRVJfT1ZFUkZMT1dfRVhDTFVERV9QQVRIUykpCisKKyMgQURCIGtleXMgZm9yIGRlYnVnZ2FibGUgYnVpbGRzCitQUk9EVUNUX0FEQl9LRVlTIDo9CitpZm5lcSAoJChmaWx0ZXIgZW5nIHVzZXJkZWJ1ZywkKFRBUkdFVF9CVUlMRF9WQVJJQU5UKSksKQorICBQUk9EVUNUX0FEQl9LRVlTIDo9ICQoc3RyaXAgJChQUk9EVUNUUy4kKElOVEVSTkFMX1BST0RVQ1QpLlBST0RVQ1RfQURCX0tFWVMpKQorZW5kaWYKK2lmbmVxICgkKGZpbHRlci1vdXQgMCAxLCQod29yZHMgJChQUk9EVUNUX0FEQl9LRVlTKSkpLCkKKyAgJChlcnJvciBPbmx5IG9uZSBmaWxlIG1heSBiZSBpbiBQUk9EVUNUX0FEQl9LRVlTOiAkKFBST0RVQ1RfQURCX0tFWVMpKQorZW5kaWYKKy5LQVRJX1JFQURPTkxZIDo9IFBST0RVQ1RfQURCX0tFWVMKKworIyBXaGV0aGVyIGFueSBwYXRocyBhcmUgZXhjbHVkZWQgZnJvbSBzYW5pdGl6YXRpb24gd2hlbiBTQU5JVElaRV9UQVJHRVQ9Y2ZpCitQUk9EVUNUX0NGSV9FWENMVURFX1BBVEhTIDo9IFwKKyAgICAkKHN0cmlwICQoUFJPRFVDVFMuJChJTlRFUk5BTF9QUk9EVUNUKS5QUk9EVUNUX0NGSV9FWENMVURFX1BBVEhTKSkKKworIyBXaGV0aGVyIGFueSBwYXRocyBzaG91bGQgaGF2ZSBDRkkgZW5hYmxlZCBmb3IgY29tcG9uZW50cworUFJPRFVDVF9DRklfSU5DTFVERV9QQVRIUyA6PSBcCisgICAgJChzdHJpcCAkKFBST0RVQ1RTLiQoSU5URVJOQUxfUFJPRFVDVCkuUFJPRFVDVF9DRklfSU5DTFVERV9QQVRIUykpCisKKyMgd2hpY2ggU29vbmcgbmFtZXNwYWNlcyB0byBleHBvcnQgdG8gTWFrZQorUFJPRFVDVF9TT09OR19OQU1FU1BBQ0VTIDo9IFwKKyAgICAkKHN0cmlwICQoUFJPRFVDVFMuJChJTlRFUk5BTF9QUk9EVUNUKS5QUk9EVUNUX1NPT05HX05BTUVTUEFDRVMpKQorCisjIEEgZmxhZyB0byBvdmVycmlkZSBQUk9EVUNUX0NPTVBBVElCTEVfUFJPUEVSVFkKK1BST0RVQ1RfQ09NUEFUSUJMRV9QUk9QRVJUWV9PVkVSUklERSA6PSBcCisgICAgJChzdHJpcCAkKFBST0RVQ1RTLiQoSU5URVJOQUxfUFJPRFVDVCkuUFJPRFVDVF9DT01QQVRJQkxFX1BST1BFUlRZX09WRVJSSURFKSkKKworIyBXaGV0aGVyIHRoZSB3aGl0ZWxpc3Qgb2YgYWN0aW9uYWJsZSBjb21wYXRpYmxlIHByb3BlcnRpZXMgc2hvdWxkIGJlIGRpc2FibGVkIG9yIG5vdAorUFJPRFVDVF9BQ1RJT05BQkxFX0NPTVBBVElCTEVfUFJPUEVSVFlfRElTQUJMRSA6PSBcCisgICAgJChzdHJpcCAkKFBST0RVQ1RTLiQoSU5URVJOQUxfUFJPRFVDVCkuUFJPRFVDVF9BQ1RJT05BQkxFX0NPTVBBVElCTEVfUFJPUEVSVFlfRElTQUJMRSkpCmRpZmYgLS1naXQgYS9jb3JlL3Byb2d1YXJkLmVtbWEuZmxhZ3MgYi9jb3JlL3Byb2d1YXJkLmVtbWEuZmxhZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmOTQwODYuLjAwMDAwMDAKLS0tIGEvY29yZS9wcm9ndWFyZC5lbW1hLmZsYWdzCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0jIEtlZXAgZXZlcnl0aGluZyBmb3IgdGhlIGVtbWEgY2xhc3NlcwotLWtlZXAgY2xhc3MgY29tLnZsYWRpdW0uKiogewotICAqOwotfQpkaWZmIC0tZ2l0IGEvY29yZS9wcm9ndWFyZF90ZXN0cy5mbGFncyBiL2NvcmUvcHJvZ3VhcmRfdGVzdHMuZmxhZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmODQwYmMuLjAwMDAwMDAKLS0tIGEvY29yZS9wcm9ndWFyZF90ZXN0cy5mbGFncworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLSMgS2VlcCBldmVyeXRoaW5nIGZvciB0ZXN0cwotIyBUaGlzIGZsYWcgaGFzIGJlZW4gbW92ZWQgdG8gdGhlIG1ha2VmaWxlcyBhbmQgaXMgc2V0IGZvciB0ZXN0cyBieSBkZWZhdWx0LgotIy1kb250c2hyaW5rCi0KLSMgQnV0IHdlIG1heSB3YW50IHRvIG9iZnVzY2F0ZSBpZiB0aGUgbWFpbiBhcHAgZ2V0cyBvYmZ1c2NhdGVkLgotIyBUaGlzIGZsYWcgaGFzIGJlZW4gbW92ZWQgdG8gdGhlIG1ha2VmaWxlcy4KLSMtZG9udG9iZnVzY2F0ZQotCi0jLWtlZXAgY2xhc3MgKiBleHRlbmRzIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSB7Ci0jICBwdWJsaWMgdm9pZCB0ZXN0KigpOwotI30KLQotIy1rZWVwY2xhc3Nlc3dpdGhtZW1iZXJzIGNsYXNzICogewotIyAgcHVibGljIHN0YXRpYyB2b2lkIHJ1bigpOwotIyAgcHVibGljIHN0YXRpYyBqdW5pdC5mcmFtZXdvcmsuVGVzdCBzdWl0ZSgpOwotI30KLQotIyBzb21lIEFsbFRlc3RzIGRvbid0IGluY2x1ZGUgcnVuKCkuCi0jLWtlZXBjbGFzc2Vzd2l0aG1lbWJlcnMgY2xhc3MgKiB7Ci0jICBwdWJsaWMgc3RhdGljIGp1bml0LmZyYW1ld29yay5UZXN0IHN1aXRlKCk7Ci0jfQotCi0jLWtlZXAgY2xhc3MgKiBleHRlbmRzIGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGUKLSMta2VlcCBjbGFzcyAqIGV4dGVuZHMgYW5kcm9pZC5hcHAuSW5zdHJ1bWVudGF0aW9uCi0jLWtlZXAgY2xhc3MgKiBleHRlbmRzIGFuZHJvaWQudGVzdC5UZXN0U3VpdGVQcm92aWRlcgotCmRpZmYgLS1naXQgYS90YXJnZXQvYm9hcmQvZ2VuZXJpY19hcm12NS9Cb2FyZENvbmZpZy5tayBiL2NvcmUvcHJvamVjdF9kZWZpbml0aW9ucy5tawpzaW1pbGFyaXR5IGluZGV4IDcwJQpjb3B5IGZyb20gdGFyZ2V0L2JvYXJkL2dlbmVyaWNfYXJtdjUvQm9hcmRDb25maWcubWsKY29weSB0byBjb3JlL3Byb2plY3RfZGVmaW5pdGlvbnMubWsKaW5kZXggMDE2OTM3YS4uNTcyOGI2NyAxMDA2NDQKLS0tIGEvdGFyZ2V0L2JvYXJkL2dlbmVyaWNfYXJtdjUvQm9hcmRDb25maWcubWsKKysrIGIvY29yZS9wcm9qZWN0X2RlZmluaXRpb25zLm1rCkBAIC0xLDUgKzEsNSBAQAogIwotIyBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIyBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogIwogIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMTQsMTAgKzE0LDExIEBACiAjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1pbmNsdWRlIGJ1aWxkL3RhcmdldC9ib2FyZC9nZW5lcmljL0JvYXJkQ29uZmlnLm1rCisjCisjIEFsbG93IHByb2plY3RzIHRvIGRlZmluZSB0aGVpciBvd24gZ2xvYmFsbHktYXZhaWxhYmxlIHZhcmlhYmxlcy4KKyMKIAotVEFSR0VUX0FSQ0hfVkFSSUFOVCA6PSBhcm12NXRlCi1UQVJHRVRfQ1BVX0FCSSA6PSBhcm1lYWJpCi1UQVJHRVRfQ1BVX0FCSTIgOj0KLQotV0lUSF9ERVhQUkVPUFQgOj0gZmFsc2UKKyMKKyMgSW5jbHVkZSBkZWZpbml0aW9ucyBmb3IgcHJlYnVpbHQgU0RLLCBpZiBwcmVzZW50LgorIworLWluY2x1ZGUgcHJlYnVpbHRzL3Nkay9jdXJyZW50L2RlZmluaXRpb25zLm1rCmRpZmYgLS1naXQgYS9jb3JlL3Jvb3QubWsgYi9jb3JlL3Jvb3QubWsKaW5kZXggNmM4Zjc5NS4uMWVmOWFjYSAxMDA2NDQKLS0tIGEvY29yZS9yb290Lm1rCisrKyBiL2NvcmUvcm9vdC5tawpAQCAtMSwzICsxLDMgQEAKICMjIyBETyBOT1QgRURJVCBUSElTIEZJTEUgIyMjCi1pbmNsdWRlIGJ1aWxkL2NvcmUvbWFpbi5taworaW5jbHVkZSBidWlsZC9tYWtlL2NvcmUvbWFpbi5tawogIyMjIERPIE5PVCBFRElUIFRISVMgRklMRSAjIyMKZGlmZiAtLWdpdCBhL2NvcmUvc2RrX2NoZWNrLm1rIGIvY29yZS9zZGtfY2hlY2subWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA5ZmM3YwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvc2RrX2NoZWNrLm1rCkBAIC0wLDAgKzEsMzcgQEAKKworIyBFbmZvcmNlbWVudCBjaGVja3MgdGhhdCBMT0NBTF9TREtfVkVSU0lPTiBhbmQgTE9DQUxfUFJJVkFURV9QTEFURk9STV9BUElTIGFyZQorIyBzZXQgY29ycmVjdGx5LgorIyBTaG91bGQgYmUgaW5jbHVkZWQgYnkgamF2YSB0YXJnZXRzIHRoYXQgYWxsb3cgc3BlY2lmeWluZyBMT0NBTF9TREtfVkVSU0lPTi4KKyMgVGhlIEpBVkFfU0RLX0VORk9SQ0VNRU5UX1dBUk5JTkcgYW5kIEpBVkFfU0RLX0VORk9SQ0VNRU5UX0VSUk9SIHZhcmlhYmxlcyBtYXkKKyMgYmUgc2V0IHRvIGEgcGFydGljdWxhciBtb2R1bGUgY2xhc3MgdG8gZW5hYmxlIHdhcm5pbmdzIGFuZCBlcnJvcnMgZm9yIHRoYXQKKyMgc3VidHlwZS4KKword2hpdGVsaXN0ZWRfbW9kdWxlcyA6PSBmcmFtZXdvcmstcmVzX19hdXRvX2dlbmVyYXRlZF9ycm8KKworCitpZmVxICgsJChKQVZBX1NES19FTkZPUkNFTUVOVF9FUlJPUikpCisgIEpBVkFfU0RLX0VORk9SQ0VNRU5UX0VSUk9SIDo9IEFQUFMKK2VuZGlmCisKK2lmZXEgKCQoTE9DQUxfU0RLX1ZFUlNJT04pJChMT0NBTF9QUklWQVRFX1BMQVRGT1JNX0FQSVMpLCkKKyAgaWZlcSAoLCQoZmlsdGVyICQoTE9DQUxfTU9EVUxFKSwkKHdoaXRlbGlzdGVkX21vZHVsZXMpKSkKKyAgICBpZm5lcSAoJChKQVZBX1NES19FTkZPUkNFTUVOVF9XQVJOSU5HKSQoSkFWQV9TREtfRU5GT1JDRU1FTlRfRVJST1IpLCkKKyAgICAgIG15X21lc3NhZ2UgOj0gTXVzdCBzcGVjaWZ5IExPQ0FMX1NES19WRVJTSU9OIG9yIExPQ0FMX1BSSVZBVEVfUExBVEZPUk1fQVBJUywKKyAgICAgIGlmZXEgKCQoTE9DQUxfTU9EVUxFX0NMQVNTKSwkKEpBVkFfU0RLX0VORk9SQ0VNRU5UX0VSUk9SKSkKKyAgICAgICAgJChjYWxsIHByZXR0eS1lcnJvciwkKG15X21lc3NhZ2UpKQorICAgICAgZW5kaWYKKyAgICAgIGlmZXEgKCQoTE9DQUxfTU9EVUxFX0NMQVNTKSwkKEpBVkFfU0RLX0VORk9SQ0VNRU5UX1dBUk5JTkcpKQorICAgICAgICAkKGNhbGwgcHJldHR5LXdhcm5pbmcsJChteV9tZXNzYWdlKSkKKyAgICAgIGVuZGlmCisgICAgICBteV9tZXNzYWdlIDo9CisgICAgZW5kaWYKKyAgZW5kaWYKK2Vsc2UgaWZuZXEgKCQoTE9DQUxfU0RLX1ZFUlNJT04pLCkKKyAgaWZuZXEgKCQoTE9DQUxfUFJJVkFURV9QTEFURk9STV9BUElTKSwpCisgICAgbXlfbWVzc2FnZSA6PSBTcGVjaWZpZXMgYm90aCBMT0NBTF9TREtfVkVSU0lPTiAoJChMT0NBTF9TREtfVkVSU0lPTikpIGFuZAorICAgIG15X21lc3NhZ2UgKz0gTE9DQUxfUFJJVkFURV9QTEFURk9STV9BUElTICgkKExPQ0FMX1BSSVZBVEVfUExBVEZPUk1fQVBJUykpCisgICAgbXlfbWVzc2FnZSArPSBidXQgc2hvdWxkIHNwZWNpZnkgb25seSBvbmUKKyAgICAkKGNhbGwgcHJldHR5LWVycm9yLCQobXlfbWVzc2FnZSkpCisgICAgbXlfbWVzc2FnZSA6PQorICBlbmRpZgorZW5kaWYKZGlmZiAtLWdpdCBhL2NvcmUvc2V0dXBfb25lX29kZXgubWsgYi9jb3JlL3NldHVwX29uZV9vZGV4Lm1rCmluZGV4IGYwZmZlODEuLjUxZGY0M2UgMTAwNjQ0Ci0tLSBhL2NvcmUvc2V0dXBfb25lX29kZXgubWsKKysrIGIvY29yZS9zZXR1cF9vbmVfb2RleC5tawpAQCAtMjUsOSArMjUsODUgQEAKIG15X2RleF9wcmVvcHRfaW1hZ2VfbG9jYXRpb24gOj0gJCgkKG15XzJuZF9hcmNoX3ByZWZpeClERUZBVUxUX0RFWF9QUkVPUFRfQlVJTFRfSU1BR0VfTE9DQVRJT04pCiBlbmRpZgogbXlfZGV4X3ByZW9wdF9pbWFnZV9maWxlbmFtZSA6PSAkKGNhbGwgZ2V0LWltYWdlLWZpbGUtcGF0aCwkKCQobXlfMm5kX2FyY2hfcHJlZml4KURFWDJPQVRfVEFSR0VUX0FSQ0gpLCQobXlfZGV4X3ByZW9wdF9pbWFnZV9sb2NhdGlvbikpCisKKyMgSWYgTE9DQUxfRU5GT1JDRV9VU0VTX0xJQlJBUklFUyBpcyBub3Qgc2V0LCBkZWZhdWx0IHRvIHRydWUgaWYgZWl0aGVyIG9mIExPQ0FMX1VTRVNfTElCUkFSSUVTIG9yCisjIExPQ0FMX09QVElPTkFMX1VTRVNfTElCUkFSSUVTIGFyZSBzcGVjaWZpZWQuCitpZmVxICgsJChMT0NBTF9FTkZPUkNFX1VTRVNfTElCUkFSSUVTKSkKKyMgV2lsbCBjaGFuZ2UgdGhlIGRlZmF1bHQgdG8gdHJ1ZSB1bmNvbmRpdGlvbmFsbHkgaW4gdGhlIGZ1dHVyZS4KK2lmbmVxICgsJChMT0NBTF9PUFRJT05BTF9VU0VTX0xJQlJBUklFUykpCitMT0NBTF9FTkZPUkNFX1VTRVNfTElCUkFSSUVTIDo9IHRydWUKK2VuZGlmCitpZm5lcSAoLCQoTE9DQUxfVVNFU19MSUJSQVJJRVMpKQorTE9DQUxfRU5GT1JDRV9VU0VTX0xJQlJBUklFUyA6PSB0cnVlCitlbmRpZgorZW5kaWYKKworbXlfdXNlc19saWJyYXJpZXMgOj0gJChMT0NBTF9VU0VTX0xJQlJBUklFUykKK215X29wdGlvbmFsX3VzZXNfbGlicmFyaWVzIDo9ICQoTE9DQUxfT1BUSU9OQUxfVVNFU19MSUJSQVJJRVMpCitteV9taXNzaW5nX3VzZXNfbGlicmFyaWVzIDo9ICQoSU5URVJOQUxfUExBVEZPUk1fTUlTU0lOR19VU0VTX0xJQlJBUklFUykKKworIyBJZiB3ZSBoYXZlIGVpdGhlciBvcHRpb25hbCBvciByZXF1aXJlZCB1c2VzLWxpYnJhcmllcywgc2V0IHVwIHRoZSBjbGFzcyBsb2FkZXIgY29udGV4dAorIyBhY2NvcmRpbmdseS4KK215X2xpYl9uYW1lcyA6PQorbXlfb3B0aW9uYWxfbGliX25hbWVzIDo9CitteV9maWx0ZXJlZF9vcHRpb25hbF91c2VzX2xpYnJhcmllcyA6PQorbXlfc3lzdGVtX2RlcGVuZGVuY2llcyA6PQorbXlfc3RvcmVkX3ByZW9wdF9jbGFzc19sb2FkZXJfY29udGV4dF9saWJzIDo9CitteV9jb25kaXRpb25hbF91c2VzX2xpYnJhcmllc19ob3N0IDo9CitteV9jb25kaXRpb25hbF91c2VzX2xpYnJhcmllc190YXJnZXQgOj0KKworaWZuZXEgKHRydWUsJChMT0NBTF9FTkZPUkNFX1VTRVNfTElCUkFSSUVTKSkKKyAgIyBQYXNzIHNwZWNpYWwgY2xhc3MgbG9hZGVyIGNvbnRleHQgdG8gc2tpcCB0aGUgY2xhc3NwYXRoIGFuZCBjb2xsaXNpb24gY2hlY2suCisgICMgVGhpcyB3aWxsIGdldCByZW1vdmVkIG9uY2UgTE9DQUxfVVNFU19MSUJSQVJJRVMgaXMgZW5mb3JjZWQuCisgICMgUmlnaHQgbm93IExPQ0FMX1VTRVNfTElCUkFSSUVTIGlzIG9wdCBpbiwgZm9yIHRoZSBjYXNlIHdoZXJlIGl0J3Mgbm90IHNwZWNpZmllZCB3ZSBzdGlsbCBkZWZhdWx0CisgICMgdG8gdGhlICYuCisgIG15X2RleF9wcmVvcHRfY2xhc3NfbG9hZGVyX2NvbnRleHQgOj0gXCYKK2Vsc2UKKyAgIyBDb21wdXRlIHRoZSBmaWx0ZXJlZCBvcHRpb25hbCB1c2VzIGxpYnJhcmllcyBieSByZW1vdmluZyBvbmVzIHRoYXQgYXJlIG5vdCBzdXBwb3NlZCB0byBleGlzdC4KKyAgbXlfZmlsdGVyZWRfb3B0aW9uYWxfdXNlc19saWJyYXJpZXMgOj0gXAorICAgICAgJChmaWx0ZXItb3V0ICQobXlfbWlzc2luZ191c2VzX2xpYnJhcmllcyksICQobXlfb3B0aW9uYWxfdXNlc19saWJyYXJpZXMpKQorICBteV9maWx0ZXJlZF91c2VzX2xpYnJhcmllcyA6PSAkKG15X3VzZXNfbGlicmFyaWVzKSAkKG15X2ZpbHRlcmVkX29wdGlvbmFsX3VzZXNfbGlicmFyaWVzKQorCisgICMgVGhlc2UgYXJlIHRoZSBvbmVzIHdlIGFyZSB2ZXJpZnlpbmcgaW4gdGhlIG1ha2UgcnVsZSwgdXNlIHRoZSB1bmZpbHRlcmVkIGxpYnJhcmllcy4KKyAgbXlfbGliX25hbWVzIDo9ICQobXlfdXNlc19saWJyYXJpZXMpCisgIG15X29wdGlvbmFsX2xpYl9uYW1lcyA6PSAkKG15X29wdGlvbmFsX3VzZXNfbGlicmFyaWVzKQorCisgICMgQ2FsY3VsYXRlIHN5c3RlbSBidWlsZCBkZXBlbmRlbmNpZXMgYmFzZWQgb24gdGhlIGZpbHRlcmVkIGxpYnJhcmllcy4KKyAgbXlfaW50ZXJtZWRpYXRlX2xpYnMgOj0gJChmb3JlYWNoIGxpYl9uYW1lLCAkKG15X2xpYl9uYW1lcykgJChteV9maWx0ZXJlZF9vcHRpb25hbF91c2VzX2xpYnJhcmllcyksIFwKKyAgICAkKGNhbGwgaW50ZXJtZWRpYXRlcy1kaXItZm9yLEpBVkFfTElCUkFSSUVTLCQobGliX25hbWUpLCxDT01NT04pL2phdmFsaWIuamFyKQorICBteV9kZXhfcHJlb3B0X3N5c3RlbV9kZXBlbmRlbmNpZXMgOj0gJChteV9pbnRlcm1lZGlhdGVfbGlicykKKyAgbXlfZGV4X3ByZW9wdF9jbGFzc19sb2FkZXJfY29udGV4dCA6PSAkKGNhbGwgbm9ybWFsaXplLXBhdGgtbGlzdCwkKG15X2ludGVybWVkaWF0ZV9saWJzKSkKKworICAjIFRoZSBjbGFzcyBsb2FkZXIgY29udGV4dCBjaGVja3N1bXMgYXJlIGZpbGxlZCBpbiBieSBkZXgyb2F0LgorICBteV9zdG9yZWRfcHJlb3B0X2NsYXNzX2xvYWRlcl9jb250ZXh0X2xpYnMgOj0gJChjYWxsIG5vcm1hbGl6ZS1wYXRoLWxpc3QsIFwKKyAgICAgICQoZm9yZWFjaCBsaWJfbmFtZSwkKG15X2ZpbHRlcmVkX3VzZXNfbGlicmFyaWVzKSwvc3lzdGVtL2ZyYW1ld29yay8kKGxpYl9uYW1lKS5qYXIpKQorCisgICMgRml4IHVwIG9yZy5hcGFjaGUuaHR0cC5sZWdhY3kuYm9vdCBzaW5jZSBpdCBzaG91bGQgYmUgb3JnLmFwYWNoZS5odHRwLmxlZ2FjeSBpbiB0aGUgbWFuaWZlc3QuCisgIG15X2xpYl9uYW1lcyA6PSAkKHBhdHN1YnN0IG9yZy5hcGFjaGUuaHR0cC5sZWdhY3kuYm9vdCxvcmcuYXBhY2hlLmh0dHAubGVnYWN5LCQobXlfbGliX25hbWVzKSkKKyAgbXlfb3B0aW9uYWxfbGliX25hbWVzIDo9ICQocGF0c3Vic3Qgb3JnLmFwYWNoZS5odHRwLmxlZ2FjeS5ib290LG9yZy5hcGFjaGUuaHR0cC5sZWdhY3ksJChteV9vcHRpb25hbF9saWJfbmFtZXMpKQorICBpZmVxICgsJChmaWx0ZXIgb3JnLmFwYWNoZS5odHRwLmxlZ2FjeSwkKG15X2xpYl9uYW1lcykgJChteV9vcHRpb25hbF9saWJfbmFtZXMpKSkKKyAgICBteV9jb25kaXRpb25hbF91c2VzX2xpYnJhcmllc19ob3N0IDo9ICQoY2FsbCBpbnRlcm1lZGlhdGVzLWRpci1mb3IsSkFWQV9MSUJSQVJJRVMsb3JnLmFwYWNoZS5odHRwLmxlZ2FjeS5ib290LCxDT01NT04pL2phdmFsaWIuamFyCisgICAgbXlfY29uZGl0aW9uYWxfdXNlc19saWJyYXJpZXNfdGFyZ2V0IDo9IC9zeXN0ZW0vZnJhbWV3b3JrL29yZy5hcGFjaGUuaHR0cC5sZWdhY3kuYm9vdC5qYXIKKyAgZW5kaWYKK2VuZGlmCisKKyMgQWx3YXlzIGRlcGVuZCBvbiBvcmcuYXBhY2hlLmh0dHAubGVnYWN5LmJvb3Qgc2luY2UgaXQgbWF5IGdldCB1c2VkIGJ5IGRleDJvYXQtb25lLWZpbGUgZm9yIGFwcHMKKyMgdGFyZ2V0dGluZyA8U0RLIDI4KFApLgorbXlfYWx3YXlzX2RlcGVuZF9saWJyYXJpZXMgOj0gJChjYWxsIGludGVybWVkaWF0ZXMtZGlyLWZvcixKQVZBX0xJQlJBUklFUyxvcmcuYXBhY2hlLmh0dHAubGVnYWN5LmJvb3QsLENPTU1PTikvamF2YWxpYi5qYXIKKworJChteV9idWlsdF9vZGV4KTogJChBQVBUKQorJChteV9idWlsdF9vZGV4KTogJChteV9hbHdheXNfZGVwZW5kX2xpYnJhcmllcykKKyQobXlfYnVpbHRfb2RleCk6ICQobXlfZGV4X3ByZW9wdF9zeXN0ZW1fZGVwZW5kZW5jaWVzKQorJChteV9idWlsdF9vZGV4KTogUFJJVkFURV9FTkZPUkNFX1VTRVNfTElCUkFSSUVTIDo9ICQoTE9DQUxfRU5GT1JDRV9VU0VTX0xJQlJBUklFUykKKyQobXlfYnVpbHRfb2RleCk6IFBSSVZBVEVfQ09ORElUSU9OQUxfVVNFU19MSUJSQVJJRVNfSE9TVCA6PSAkKG15X2NvbmRpdGlvbmFsX3VzZXNfbGlicmFyaWVzX2hvc3QpCiskKG15X2J1aWx0X29kZXgpOiBQUklWQVRFX0NPTkRJVElPTkFMX1VTRVNfTElCUkFSSUVTX1RBUkdFVCA6PSAkKG15X2NvbmRpdGlvbmFsX3VzZXNfbGlicmFyaWVzX3RhcmdldCkKKyQobXlfYnVpbHRfb2RleCk6IFBSSVZBVEVfVVNFU19MSUJSQVJZX05BTUVTIDo9ICQobXlfbGliX25hbWVzKQorJChteV9idWlsdF9vZGV4KTogUFJJVkFURV9PUFRJT05BTF9VU0VTX0xJQlJBUllfTkFNRVMgOj0gJChteV9vcHRpb25hbF9saWJfbmFtZXMpCiAkKG15X2J1aWx0X29kZXgpOiBQUklWQVRFXzJORF9BUkNIX1ZBUl9QUkVGSVggOj0gJChteV8ybmRfYXJjaF9wcmVmaXgpCiAkKG15X2J1aWx0X29kZXgpOiBQUklWQVRFX0RFWF9MT0NBVElPTiA6PSAkKHBhdHN1YnN0ICQoUFJPRFVDVF9PVVQpJSwlLCQoTE9DQUxfSU5TVEFMTEVEX01PRFVMRSkpCiAkKG15X2J1aWx0X29kZXgpOiBQUklWQVRFX0RFWF9QUkVPUFRfSU1BR0VfTE9DQVRJT04gOj0gJChteV9kZXhfcHJlb3B0X2ltYWdlX2xvY2F0aW9uKQorJChteV9idWlsdF9vZGV4KTogUFJJVkFURV9ERVgyT0FUX0NMQVNTX0xPQURFUl9DT05URVhUIDo9ICQobXlfZGV4X3ByZW9wdF9jbGFzc19sb2FkZXJfY29udGV4dCkKKyQobXlfYnVpbHRfb2RleCk6IFBSSVZBVEVfREVYMk9BVF9TVE9SRURfQ0xBU1NfTE9BREVSX0NPTlRFWFRfTElCUyA6PSAkKG15X3N0b3JlZF9wcmVvcHRfY2xhc3NfbG9hZGVyX2NvbnRleHRfbGlicykKICQobXlfYnVpbHRfb2RleCkgOiAkKCQobXlfMm5kX2FyY2hfcHJlZml4KURFWFBSRU9QVF9PTkVfRklMRV9ERVBFTkRFTkNZX0JVSUxUX0JPT1RfUFJFT1BUKSBcCiAgICAgJChERVhQUkVPUFRfT05FX0ZJTEVfREVQRU5ERU5DWV9UT09MUykgXAogICAgICQobXlfZGV4X3ByZW9wdF9pbWFnZV9maWxlbmFtZSkKZGlmZiAtLWdpdCBhL2NvcmUvc2hhcmVkX2xpYnJhcnlfaW50ZXJuYWwubWsgYi9jb3JlL3NoYXJlZF9saWJyYXJ5X2ludGVybmFsLm1rCmluZGV4IDY4NzUzNmIuLmFiODg3ZTAgMTAwNjQ0Ci0tLSBhL2NvcmUvc2hhcmVkX2xpYnJhcnlfaW50ZXJuYWwubWsKKysrIGIvY29yZS9zaGFyZWRfbGlicmFyeV9pbnRlcm5hbC5tawpAQCAtMjAsNyArMjAsOSBAQAogJChlcnJvciAkKExPQ0FMX1BBVEgpOiBDYW5ub3Qgc2V0IG1vZHVsZSBzdGVtIGZvciBhIGxpYnJhcnkpCiBlbmRpZgogCitpZmRlZiB0YXJnZXQtc2hhcmVkLWxpYnJhcnktaG9vawogJChjYWxsIHRhcmdldC1zaGFyZWQtbGlicmFyeS1ob29rKQorZW5kaWYKIAogc2tpcF9idWlsZF9mcm9tX3NvdXJjZSA6PQogaWZkZWYgTE9DQUxfUFJFQlVJTFRfTU9EVUxFX0ZJTEUKZGlmZiAtLWdpdCBhL2NvcmUvc29vbmdfYXBwX3ByZWJ1aWx0Lm1rIGIvY29yZS9zb29uZ19hcHBfcHJlYnVpbHQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWUwZDE5NgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvc29vbmdfYXBwX3ByZWJ1aWx0Lm1rCkBAIC0wLDAgKzEsMTA0IEBACisjIEFwcCBwcmVidWlsdCBjb21pbmcgZnJvbSBTb29uZy4KKyMgRXh0cmEgaW5wdXRzOgorIyBMT0NBTF9TT09OR19SRVNPVVJDRV9FWFBPUlRfUEFDS0FHRQorCitpZm5lcSAoJChMT0NBTF9NT0RVTEVfTUFLRUZJTEUpLCQoU09PTkdfQU5EUk9JRF9NSykpCisgICQoY2FsbCBwcmV0dHktZXJyb3Isc29vbmdfYXBwX3ByZWJ1aWx0Lm1rIG1heSBvbmx5IGJlIHVzZWQgZnJvbSBTb29uZykKK2VuZGlmCisKK0xPQ0FMX01PRFVMRV9TVUZGSVggOj0gLmFwaworTE9DQUxfQlVJTFRfTU9EVUxFX1NURU0gOj0gcGFja2FnZS5hcGsKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitpbmNsdWRlICQoQlVJTERfU1lTVEVNKS9iYXNlX3J1bGVzLm1rCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworZnVsbF9jbGFzc2VzX2phciA6PSAkKGludGVybWVkaWF0ZXMuQ09NTU9OKS9jbGFzc2VzLmphcgorZnVsbF9jbGFzc2VzX3ByZV9wcm9ndWFyZF9qYXIgOj0gJChpbnRlcm1lZGlhdGVzLkNPTU1PTikvY2xhc3Nlcy1wcmUtcHJvZ3VhcmQuamFyCitmdWxsX2NsYXNzZXNfaGVhZGVyX2phciA6PSAkKGludGVybWVkaWF0ZXMuQ09NTU9OKS9jbGFzc2VzLWhlYWRlci5qYXIKKworJChldmFsICQoY2FsbCBjb3B5LW9uZS1maWxlLCQoTE9DQUxfU09PTkdfQ0xBU1NFU19KQVIpLCQoZnVsbF9jbGFzc2VzX2phcikpKQorJChldmFsICQoY2FsbCBjb3B5LW9uZS1maWxlLCQoTE9DQUxfU09PTkdfQ0xBU1NFU19KQVIpLCQoZnVsbF9jbGFzc2VzX3ByZV9wcm9ndWFyZF9qYXIpKSkKKworaWZkZWYgTE9DQUxfU09PTkdfSkFDT0NPX1JFUE9SVF9DTEFTU0VTX0pBUgorICAkKGV2YWwgJChjYWxsIGNvcHktb25lLWZpbGUsJChMT0NBTF9TT09OR19KQUNPQ09fUkVQT1JUX0NMQVNTRVNfSkFSKSxcCisgICAgJChpbnRlcm1lZGlhdGVzLkNPTU1PTikvamFjb2NvLXJlcG9ydC1jbGFzc2VzLmphcikpCisgICQoY2FsbCBhZGQtZGVwZW5kZW5jeSwkKExPQ0FMX0JVSUxUX01PRFVMRSksXAorICAgICQoaW50ZXJtZWRpYXRlcy5DT01NT04pL2phY29jby1yZXBvcnQtY2xhc3Nlcy5qYXIpCitlbmRpZgorCitpZmRlZiBMT0NBTF9TT09OR19QUk9HVUFSRF9ESUNUCisgICQoZXZhbCAkKGNhbGwgY29weS1vbmUtZmlsZSwkKExPQ0FMX1NPT05HX1BST0dVQVJEX0RJQ1QpLFwKKyAgICAkKGludGVybWVkaWF0ZXMuQ09NTU9OKS9wcm9ndWFyZF9kaWN0aW9uYXJ5KSkKKyAgJChjYWxsIGFkZC1kZXBlbmRlbmN5LCQoTE9DQUxfQlVJTFRfTU9EVUxFKSxcCisgICAgJChpbnRlcm1lZGlhdGVzLkNPTU1PTikvcHJvZ3VhcmRfZGljdGlvbmFyeSkKK2VuZGlmCisKK2lmbmVxICgkKFRVUkJJTkVfRU5BQkxFRCksZmFsc2UpCitpZmRlZiBMT0NBTF9TT09OR19IRUFERVJfSkFSCiskKGV2YWwgJChjYWxsIGNvcHktb25lLWZpbGUsJChMT0NBTF9TT09OR19IRUFERVJfSkFSKSwkKGZ1bGxfY2xhc3Nlc19oZWFkZXJfamFyKSkpCitlbHNlCiskKGV2YWwgJChjYWxsIGNvcHktb25lLWZpbGUsJChmdWxsX2NsYXNzZXNfamFyKSwkKGZ1bGxfY2xhc3Nlc19oZWFkZXJfamFyKSkpCitlbmRpZgorZW5kaWYgIyBUVVJCSU5FX0VOQUJMRUQgIT0gZmFsc2UKKworCiskKGV2YWwgJChjYWxsIGNvcHktb25lLWZpbGUsJChMT0NBTF9QUkVCVUlMVF9NT0RVTEVfRklMRSksJChMT0NBTF9CVUlMVF9NT0RVTEUpKSkKKworaWZkZWYgTE9DQUxfU09PTkdfUkVTT1VSQ0VfRVhQT1JUX1BBQ0tBR0UKK3Jlc291cmNlX2V4cG9ydF9wYWNrYWdlIDo9ICQoaW50ZXJtZWRpYXRlcy5DT01NT04pL3BhY2thZ2UtZXhwb3J0LmFwaworcmVzb3VyY2VfZXhwb3J0X3N0YW1wIDo9ICQoaW50ZXJtZWRpYXRlcy5DT01NT04pL3NyYy9SLnN0YW1wCisKKyQocmVzb3VyY2VfZXhwb3J0X3BhY2thZ2UpOiBQUklWQVRFX1NUQU1QIDo9ICQocmVzb3VyY2VfZXhwb3J0X3N0YW1wKQorJChyZXNvdXJjZV9leHBvcnRfcGFja2FnZSk6IC5LQVRJX0lNUExJQ0lUX09VVFBVVFMgOj0gJChyZXNvdXJjZV9leHBvcnRfc3RhbXApCiskKHJlc291cmNlX2V4cG9ydF9wYWNrYWdlKTogJChMT0NBTF9TT09OR19SRVNPVVJDRV9FWFBPUlRfUEFDS0FHRSkKKwlAZWNobyAiQ29weTogJCRAIgorCSQoY29weS1maWxlLXRvLXRhcmdldCkKKwl0b3VjaCAkKFBSSVZBVEVfU1RBTVApCiskKGNhbGwgYWRkLWRlcGVuZGVuY3ksJChMT0NBTF9CVUlMVF9NT0RVTEUpLCQocmVzb3VyY2VfZXhwb3J0X3BhY2thZ2UpKQorCitlbmRpZiAjIExPQ0FMX1NPT05HX1JFU09VUkNFX0VYUE9SVF9QQUNLQUdFCisKK2phdmEtZGV4OiAkKExPQ0FMX1NPT05HX0RFWF9KQVIpCisKK2lmZGVmIExPQ0FMX0RFWF9QUkVPUFQKKyMgZGVmaW5lcyBidWlsdF9vZGV4IGFsb25nIHdpdGggcnVsZSB0byBpbnN0YWxsIG9kZXgKK2luY2x1ZGUgJChCVUlMRF9TWVNURU0pL2RleF9wcmVvcHRfb2RleF9pbnN0YWxsLm1rCisKKyQoYnVpbHRfb2RleCk6ICQoTE9DQUxfU09PTkdfREVYX0pBUikKKwkkKGNhbGwgZGV4cHJlb3B0LW9uZS1maWxlLCQ8LCRAKQorZW5kaWYKKworUEFDS0FHRVMgOj0gJChQQUNLQUdFUykgJChMT0NBTF9NT0RVTEUpCitpZmRlZiBMT0NBTF9DRVJUSUZJQ0FURQorICBQQUNLQUdFUy4kKExPQ0FMX01PRFVMRSkuQ0VSVElGSUNBVEUgOj0gJChMT0NBTF9DRVJUSUZJQ0FURSkKKyAgUEFDS0FHRVMuJChMT0NBTF9NT0RVTEUpLlBSSVZBVEVfS0VZIDo9ICQocGF0c3Vic3QgJS54NTA5LnBlbSwlLnBrOCwkKExPQ0FMX0NFUlRJRklDQVRFKSkKK2VuZGlmCisKK2lmbmRlZiBMT0NBTF9JU19IT1NUX01PRFVMRQoraWZlcSAoJChMT0NBTF9TREtfVkVSU0lPTiksc3lzdGVtX2N1cnJlbnQpCitteV9saW5rX3R5cGUgOj0gamF2YTpzeXN0ZW0KK2Vsc2UgaWZuZXEgKCQoTE9DQUxfU0RLX1ZFUlNJT04pLCkKK215X2xpbmtfdHlwZSA6PSBqYXZhOnNkaworZWxzZQorbXlfbGlua190eXBlIDo9IGphdmE6cGxhdGZvcm0KK2VuZGlmCisjIHdhcm4vYWxsb3dlZCB0eXBlcyBhcmUgYm90aCBlbXB0eSBiZWNhdXNlIFNvb25nIG1vZHVsZXMgY2FuJ3QgZGVwZW5kIG9uCisjIG1ha2UtZGVmaW5lZCBtb2R1bGVzLgorbXlfd2Fybl90eXBlcyA6PQorbXlfYWxsb3dlZF90eXBlcyA6PQorCitteV9saW5rX2RlcHMgOj0KK215XzJuZF9hcmNoX3ByZWZpeCA6PSAkKExPQ0FMXzJORF9BUkNIX1ZBUl9QUkVGSVgpCitteV9jb21tb24gOj0gQ09NTU9OCitpbmNsdWRlICQoQlVJTERfU1lTVEVNKS9saW5rX3R5cGUubWsKK2VuZGlmICMgIUxPQ0FMX0lTX0hPU1RfTU9EVUxFCisKK2lmZGVmIExPQ0FMX1NPT05HX1JST19ESVJTCisgICQoY2FsbCBhcHBlbmRfZW5mb3JjZV9ycm9fc291cmNlcywgXAorICAgICAgJChteV9yZWdpc3Rlcl9uYW1lKSwgXAorICAgICAgZmFsc2UsIFwKKyAgICAgICQoTE9DQUxfRlVMTF9NQU5JRkVTVF9GSUxFKSwgXAorICAgICAgJChMT0NBTF9FWFBPUlRfUEFDS0FHRV9SRVNPVVJDRVMpLCBcCisgICAgICAkKExPQ0FMX1NPT05HX1JST19ESVJTKSkKK2VuZGlmCmRpZmYgLS1naXQgYS9jb3JlL3Nvb25nX2NvbmZpZy5tayBiL2NvcmUvc29vbmdfY29uZmlnLm1rCmluZGV4IGNkZDI4OTYuLmY4Y2IyZmIgMTAwNjQ0Ci0tLSBhL2NvcmUvc29vbmdfY29uZmlnLm1rCisrKyBiL2NvcmUvc29vbmdfY29uZmlnLm1rCkBAIC0xMyw2ICsxMyw3IEBACiBlbmRpZgogZW5kaWYKIAoraWZlcSAoJChXUklURV9TT09OR19WQVJJQUJMRVMpLHRydWUpCiAjIENvbnZlcnRzIGEgbGlzdCB0byBhIEpTT04gbGlzdC4KICMgJDE6IExpc3Qgc2VwYXJhdG9yLgogIyAkMjogTGlzdC4KQEAgLTI0LDc1ICsyNSwxNTEgQEAKICMgQ29udmVydHMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCB0byBhIEpTT04gbGlzdC4KIGNzdl90b19qc29uX2xpc3QgPSAkKGNhbGwgX2pzb25fbGlzdCwkKGNvbW1hKSwkKDEpKQogCisjIDE6IEtleSBuYW1lCisjIDI6IFZhbHVlCithZGRfanNvbl92YWwgPSAkKGV2YWwgX2NvbnRlbnRzIDo9ICQkKF9jb250ZW50cykgICAgIiQkKHN0cmlwICQkKDEpKSI6JCQoc3BhY2UpJCQoc3RyaXAgJCQoMikpJCQoY29tbWEpJCQobmV3bGluZSkpCithZGRfanNvbl9zdHIgPSAkKGNhbGwgYWRkX2pzb25fdmFsLCQoMSksIiQoc3RyaXAgJCgyKSkiKQorYWRkX2pzb25fbGlzdCA9ICQoY2FsbCBhZGRfanNvbl92YWwsJCgxKSwkKGNhbGwganNvbl9saXN0LCQocGF0c3Vic3QgJSwlLCQoMikpKSkKK2FkZF9qc29uX2NzdiA9ICQoY2FsbCBhZGRfanNvbl92YWwsJCgxKSwkKGNhbGwgY3N2X3RvX2pzb25fbGlzdCwkKHN0cmlwICQoMikpKSkKK2FkZF9qc29uX2Jvb2wgPSAkKGNhbGwgYWRkX2pzb25fdmFsLCQoMSksJChpZiAkKHN0cmlwICQoMikpLHRydWUsZmFsc2UpKQorCitpbnZlcnRfYm9vbCA9ICQoaWYgJChzdHJpcCAkKDEpKSwsdHJ1ZSkKKwogIyBDcmVhdGUgc29vbmcudmFyaWFibGVzIHdpdGggY29waWVzIG9mIG1ha2VmaWxlIHNldHRpbmdzLiAgUnVucyBldmVyeSBidWlsZCwKICMgYnV0IG9ubHkgdXBkYXRlcyBzb29uZy52YXJpYWJsZXMgaWYgaXQgY2hhbmdlcwotU09PTkdfVkFSSUFCTEVTX1RNUCA6PSAkKFNPT05HX1ZBUklBQkxFUykuJCQkJAotJChTT09OR19WQVJJQUJMRVMpOiBGT1JDRQotCSQoaGlkZSkgbWtkaXIgLXAgJChkaXIgJEApCi0JJChoaWRlKSAoXAotCWVjaG8gJ3snOyBcCi0JZWNobyAnICAgICJNYWtlX3N1ZmZpeCI6ICItJChUQVJHRVRfUFJPRFVDVCkiLCc7IFwKLQllY2hvICcnOyBcCi0JZWNobyAnICAgICJQbGF0Zm9ybV9zZGtfdmVyc2lvbiI6ICQoUExBVEZPUk1fU0RLX1ZFUlNJT04pLCc7IFwKLQllY2hvICcgICAgIlBsYXRmb3JtX3ZlcnNpb25fYWxsX2NvZGVuYW1lcyI6ICQoY2FsbCBjc3ZfdG9fanNvbl9saXN0LCQoUExBVEZPUk1fVkVSU0lPTl9BTExfQ09ERU5BTUVTKSksJzsgXAotCWVjaG8gJyAgICAiVW5idW5kbGVkX2J1aWxkIjogJChpZiAkKFRBUkdFVF9CVUlMRF9BUFBTKSx0cnVlLGZhbHNlKSwnOyBcCi0JZWNobyAnICAgICJCcmlsbG8iOiAkKGlmICQoQlJJTExPKSx0cnVlLGZhbHNlKSwnOyBcCi0JZWNobyAnICAgICJNYWxsb2Nfbm90X3N2ZWx0ZSI6ICQoaWYgJChmaWx0ZXIgdHJ1ZSwkKE1BTExPQ19TVkVMVEUpKSxmYWxzZSx0cnVlKSwnOyBcCi0JZWNobyAnICAgICJBbGxvd19taXNzaW5nX2RlcGVuZGVuY2llcyI6ICQoaWYgJChBTExPV19NSVNTSU5HX0RFUEVOREVOQ0lFUyksdHJ1ZSxmYWxzZSksJzsgXAotCWVjaG8gJyAgICAiU2FuaXRpemVIb3N0IjogJChjYWxsIGpzb25fbGlzdCwkKFNBTklUSVpFX0hPU1QpKSwnOyBcCi0JZWNobyAnICAgICJTYW5pdGl6ZURldmljZSI6ICQoY2FsbCBqc29uX2xpc3QsJChTQU5JVElaRV9UQVJHRVQpKSwnOyBcCi0JZWNobyAnICAgICJTYW5pdGl6ZURldmljZURpYWciOiAkKGNhbGwganNvbl9saXN0LCQoU0FOSVRJWkVfVEFSR0VUX0RJQUcpKSwnOyBcCi0JZWNobyAnICAgICJTYW5pdGl6ZURldmljZUFyY2giOiAkKGNhbGwganNvbl9saXN0LCQoU0FOSVRJWkVfVEFSR0VUX0FSQ0gpKSwnOyBcCi0JZWNobyAnICAgICJIb3N0U3RhdGljQmluYXJpZXMiOiAkKGlmICQoc3RyaXAgJChCVUlMRF9IT1NUX3N0YXRpYykpLHRydWUsZmFsc2UpLCc7IFwKLQllY2hvICcgICAgIkJpbmRlcjMyYml0IjogJChpZiAkKEJJTkRFUjMyQklUKSx0cnVlLGZhbHNlKSwnOyBcCi0JZWNobyAnICAgICJEZXZpY2VQcmVmZXIzMkJpdEV4ZWN1dGFibGVzIjogJChpZiAkKGZpbHRlciB0cnVlLCQoVEFSR0VUX1BSRUZFUl8zMl9CSVRfRVhFQ1VUQUJMRVMpKSx0cnVlLGZhbHNlKSwnOyBcCi0JZWNobyAnICAgICJVc2VHb21hIjogJChpZiAkKGZpbHRlci1vdXQgZmFsc2UsJChVU0VfR09NQSkpLHRydWUsZmFsc2UpLCc7IFwKLQllY2hvICcgICAgIkRlYnVnZ2FibGUiOiAkKGlmICQoZmlsdGVyIHVzZXJkZWJ1ZyBlbmcsJChUQVJHRVRfQlVJTERfVkFSSUFOVCkpLHRydWUsZmFsc2UpLCc7IFwKLQllY2hvICcgICAgIkVuZyI6ICQoaWYgJChmaWx0ZXIgZW5nLCQoVEFSR0VUX0JVSUxEX1ZBUklBTlQpKSx0cnVlLGZhbHNlKSwnOyBcCi0JZWNobyAnICAgICJWZW5kb3JQYXRoIjogIiQoVEFSR0VUX0NPUFlfT1VUX1ZFTkRPUikiLCc7IFwKLQllY2hvICcnOyBcCi0JZWNobyAnICAgICJDbGFuZ1RpZHkiOiAkKGlmICQoZmlsdGVyIDEgdHJ1ZSwkKFdJVEhfVElEWSkpLHRydWUsZmFsc2UpLCc7IFwKLQllY2hvICcgICAgIlRpZHlDaGVja3MiOiAiJChXSVRIX1RJRFlfQ0hFQ0tTKSIsJzsgXAotCWVjaG8gJyc7IFwKLQllY2hvICcgICAgIk5hdGl2ZUNvdmVyYWdlIjogJChpZiAkKGZpbHRlciB0cnVlLCQoTkFUSVZFX0NPVkVSQUdFKSksdHJ1ZSxmYWxzZSksJzsgXAotCWVjaG8gJyAgICAiQ292ZXJhZ2VQYXRocyI6ICQoY2FsbCBjc3ZfdG9fanNvbl9saXN0LCQoQ09WRVJBR0VfUEFUSFMpKSwnOyBcCi0JZWNobyAnICAgICJDb3ZlcmFnZUV4Y2x1ZGVQYXRocyI6ICQoY2FsbCBjc3ZfdG9fanNvbl9saXN0LCQoQ09WRVJBR0VfRVhDTFVERV9QQVRIUykpLCc7IFwKLQllY2hvICcnOyBcCi0JZWNobyAnICAgICJEZXZpY2VOYW1lIjogIiQoVEFSR0VUX0RFVklDRSkiLCc7IFwKLQllY2hvICcgICAgIkRldmljZUFyY2giOiAiJChUQVJHRVRfQVJDSCkiLCc7IFwKLQllY2hvICcgICAgIkRldmljZUFyY2hWYXJpYW50IjogIiQoVEFSR0VUX0FSQ0hfVkFSSUFOVCkiLCc7IFwKLQllY2hvICcgICAgIkRldmljZUNwdVZhcmlhbnQiOiAiJChUQVJHRVRfQ1BVX1ZBUklBTlQpIiwnOyBcCi0JZWNobyAnICAgICJEZXZpY2VBYmkiOiBbIiQoVEFSR0VUX0NQVV9BQkkpIiwgIiQoVEFSR0VUX0NQVV9BQkkyKSJdLCc7IFwKLQllY2hvICcgICAgIkRldmljZVVzZXNDbGFuZyI6ICQoaWYgJChVU0VfQ0xBTkdfUExBVEZPUk1fQlVJTEQpLCQoVVNFX0NMQU5HX1BMQVRGT1JNX0JVSUxEKSxmYWxzZSksJzsgXAotCWVjaG8gJyAgICAiRGV2aWNlVm5ka1ZlcnNpb24iOiAiJChCT0FSRF9WTkRLX1ZFUlNJT04pIiwnOyBcCi0JZWNobyAnJzsgXAotCWVjaG8gJyAgICAiRGV2aWNlU2Vjb25kYXJ5QXJjaCI6ICIkKFRBUkdFVF8yTkRfQVJDSCkiLCc7IFwKLQllY2hvICcgICAgIkRldmljZVNlY29uZGFyeUFyY2hWYXJpYW50IjogIiQoVEFSR0VUXzJORF9BUkNIX1ZBUklBTlQpIiwnOyBcCi0JZWNobyAnICAgICJEZXZpY2VTZWNvbmRhcnlDcHVWYXJpYW50IjogIiQoVEFSR0VUXzJORF9DUFVfVkFSSUFOVCkiLCc7IFwKLQllY2hvICcgICAgIkRldmljZVNlY29uZGFyeUFiaSI6IFsiJChUQVJHRVRfMk5EX0NQVV9BQkkpIiwgIiQoVEFSR0VUXzJORF9DUFVfQUJJMikiXSwnOyBcCi0JZWNobyAnJzsgXAotCWVjaG8gJyAgICAiSG9zdEFyY2giOiAiJChIT1NUX0FSQ0gpIiwnOyBcCi0JZWNobyAnICAgICJIb3N0U2Vjb25kYXJ5QXJjaCI6ICIkKEhPU1RfMk5EX0FSQ0gpIiwnOyBcCi0JZWNobyAnJzsgXAotCWVjaG8gJyAgICAiQ3Jvc3NIb3N0IjogIiQoSE9TVF9DUk9TU19PUykiLCc7IFwKLQllY2hvICcgICAgIkNyb3NzSG9zdEFyY2giOiAiJChIT1NUX0NST1NTX0FSQ0gpIiwnOyBcCi0JZWNobyAnICAgICJDcm9zc0hvc3RTZWNvbmRhcnlBcmNoIjogIiQoSE9TVF9DUk9TU18yTkRfQVJDSCkiLCc7IFwKLQllY2hvICcgICAgIlNhZmVzdGFjayI6ICQoaWYgJChmaWx0ZXIgdHJ1ZSwkKFVTRV9TQUZFU1RBQ0spKSx0cnVlLGZhbHNlKSwnOyBcCi0JZWNobyAnICAgICJFbmFibGVDRkkiOiAkKGlmICQoZmlsdGVyIGZhbHNlLCQoRU5BQkxFX0NGSSkpLGZhbHNlLHRydWUpLCc7IFwKLQllY2hvICcgICAgIkludGVnZXJPdmVyZmxvd0V4Y2x1ZGVQYXRocyI6ICQoY2FsbCBqc29uX2xpc3QsJChJTlRFR0VSX09WRVJGTE9XX0VYQ0xVREVfUEFUSFMpICQoUFJPRFVDVF9JTlRFR0VSX09WRVJGTE9XX0VYQ0xVREVfUEFUSFMpKSwnOyBcCi0JZWNobyAnICAgICJEZXZpY2VfdXNlc19od2MyIjogJChpZiAkKGZpbHRlciB0cnVlLCQoVEFSR0VUX1VTRVNfSFdDMikpLHRydWUsZmFsc2UpLCc7IFwKLQllY2hvICcgICAgIk92ZXJyaWRlX3JzX2RyaXZlciI6ICIkKE9WRVJSSURFX1JTX0RSSVZFUikiLCc7IFwKLQllY2hvICcgICAgIlRyZWJsZSI6ICQoaWYgJChmaWx0ZXIgdHJ1ZSwkKFBST0RVQ1RfRlVMTF9UUkVCTEUpKSx0cnVlLGZhbHNlKSwnOyBcCi0JZWNobyAnICAgICJQZGsiOiAkKGlmICQoZmlsdGVyIHRydWUsJChUQVJHRVRfQlVJTERfUERLKSksdHJ1ZSxmYWxzZSksJzsgXAotCWVjaG8gJyc7IFwKLQllY2hvICcgICAgIkFydFVzZVJlYWRCYXJyaWVyIjogJChpZiAkKGZpbHRlciBmYWxzZSwkKFBST0RVQ1RfQVJUX1VTRV9SRUFEX0JBUlJJRVIpKSxmYWxzZSx0cnVlKSwnOyBcCi0JZWNobyAnJzsgXAotCWVjaG8gJyAgICAiQnRDb25maWdJbmNsdWRlRGlyIjogIiQoQk9BUkRfQkxVRVRPT1RIX0JEUk9JRF9CVUlMRENGR19JTkNMVURFX0RJUikiLCc7IFwKLQllY2hvICcnOyBcCi0JZWNobyAnICAgICJEZXZpY2VLZXJuZWxIZWFkZXJzIjogJChjYWxsIGpzb25fbGlzdCwkKHN0cmlwICQoVEFSR0VUX1BST0pFQ1RfU1lTVEVNX0lOQ0xVREVTKSkpJzsgXAotCWVjaG8gJ30nKSA+ICQoU09PTkdfVkFSSUFCTEVTX1RNUCk7IFwKLQlpZiAhIGNtcCAtcyAkKFNPT05HX1ZBUklBQkxFU19UTVApICQoU09PTkdfVkFSSUFCTEVTKTsgdGhlbiBcCi0JICBtdiAkKFNPT05HX1ZBUklBQkxFU19UTVApICQoU09PTkdfVkFSSUFCTEVTKTsgXAorJChzaGVsbCBta2RpciAtcCAkKGRpciAkKFNPT05HX1ZBUklBQkxFUykpKQorX2NvbnRlbnRzIDo9IHskKG5ld2xpbmUpCisKKyQoY2FsbCBhZGRfanNvbl9zdHIsICBNYWtlX3N1ZmZpeCwgLSQoVEFSR0VUX1BST0RVQ1QpKQorCiskKGNhbGwgYWRkX2pzb25fc3RyLCAgQnVpbGRJZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAkKEJVSUxEX0lEKSkKKyQoY2FsbCBhZGRfanNvbl9zdHIsICBCdWlsZE51bWJlckZyb21GaWxlLCAgICAgICAgICAgICAgICQkJChCVUlMRF9OVU1CRVJfRlJPTV9GSUxFKSkKKworJChjYWxsIGFkZF9qc29uX3N0ciwgIFBsYXRmb3JtX3ZlcnNpb25fbmFtZSwgICAgICAgICAgICAgJChQTEFURk9STV9WRVJTSU9OKSkKKyQoY2FsbCBhZGRfanNvbl92YWwsICBQbGF0Zm9ybV9zZGtfdmVyc2lvbiwgICAgICAgICAgICAgICQoUExBVEZPUk1fU0RLX1ZFUlNJT04pKQorJChjYWxsIGFkZF9qc29uX3N0ciwgIFBsYXRmb3JtX3Nka19jb2RlbmFtZSwgICAgICAgICAgICAgJChQTEFURk9STV9WRVJTSU9OX0NPREVOQU1FKSkKKyQoY2FsbCBhZGRfanNvbl9ib29sLCBQbGF0Zm9ybV9zZGtfZmluYWwsICAgICAgICAgICAgICAgICQoZmlsdGVyIFJFTCwkKFBMQVRGT1JNX1ZFUlNJT05fQ09ERU5BTUUpKSkKKyQoY2FsbCBhZGRfanNvbl9jc3YsICBQbGF0Zm9ybV92ZXJzaW9uX2FjdGl2ZV9jb2RlbmFtZXMsICQoUExBVEZPUk1fVkVSU0lPTl9BTExfQ09ERU5BTUVTKSkKKyQoY2FsbCBhZGRfanNvbl9jc3YsICBQbGF0Zm9ybV92ZXJzaW9uX2Z1dHVyZV9jb2RlbmFtZXMsICQoUExBVEZPUk1fVkVSU0lPTl9GVVRVUkVfQ09ERU5BTUVTKSkKKworJChjYWxsIGFkZF9qc29uX2Jvb2wsIEFsbG93X21pc3NpbmdfZGVwZW5kZW5jaWVzLCAgICAgICAgJChBTExPV19NSVNTSU5HX0RFUEVOREVOQ0lFUykpCiskKGNhbGwgYWRkX2pzb25fYm9vbCwgVW5idW5kbGVkX2J1aWxkLCAgICAgICAgICAgICAgICAgICAkKFRBUkdFVF9CVUlMRF9BUFBTKSkKKyQoY2FsbCBhZGRfanNvbl9ib29sLCBQZGssICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoZmlsdGVyIHRydWUsJChUQVJHRVRfQlVJTERfUERLKSkpCisKKyQoY2FsbCBhZGRfanNvbl9ib29sLCBEZWJ1Z2dhYmxlLCAgICAgICAgICAgICAgICAgICAgICAgICQoZmlsdGVyIHVzZXJkZWJ1ZyBlbmcsJChUQVJHRVRfQlVJTERfVkFSSUFOVCkpKQorJChjYWxsIGFkZF9qc29uX2Jvb2wsIEVuZywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChmaWx0ZXIgZW5nLCQoVEFSR0VUX0JVSUxEX1ZBUklBTlQpKSkKKworJChjYWxsIGFkZF9qc29uX3N0ciwgIERldmljZU5hbWUsICAgICAgICAgICAgICAgICAgICAgICAgJChUQVJHRVRfREVWSUNFKSkKKyQoY2FsbCBhZGRfanNvbl9zdHIsICBEZXZpY2VBcmNoLCAgICAgICAgICAgICAgICAgICAgICAgICQoVEFSR0VUX0FSQ0gpKQorJChjYWxsIGFkZF9qc29uX3N0ciwgIERldmljZUFyY2hWYXJpYW50LCAgICAgICAgICAgICAgICAgJChUQVJHRVRfQVJDSF9WQVJJQU5UKSkKKyQoY2FsbCBhZGRfanNvbl9zdHIsICBEZXZpY2VDcHVWYXJpYW50LCAgICAgICAgICAgICAgICAgICQoVEFSR0VUX0NQVV9WQVJJQU5UKSkKKyQoY2FsbCBhZGRfanNvbl9saXN0LCBEZXZpY2VBYmksICAgICAgICAgICAgICAgICAgICAgICAgICQoVEFSR0VUX0NQVV9BQkkpICQoVEFSR0VUX0NQVV9BQkkyKSkKKworJChjYWxsIGFkZF9qc29uX3N0ciwgIERldmljZVNlY29uZGFyeUFyY2gsICAgICAgICAgICAgICAgJChUQVJHRVRfMk5EX0FSQ0gpKQorJChjYWxsIGFkZF9qc29uX3N0ciwgIERldmljZVNlY29uZGFyeUFyY2hWYXJpYW50LCAgICAgICAgJChUQVJHRVRfMk5EX0FSQ0hfVkFSSUFOVCkpCiskKGNhbGwgYWRkX2pzb25fc3RyLCAgRGV2aWNlU2Vjb25kYXJ5Q3B1VmFyaWFudCwgICAgICAgICAkKFRBUkdFVF8yTkRfQ1BVX1ZBUklBTlQpKQorJChjYWxsIGFkZF9qc29uX2xpc3QsIERldmljZVNlY29uZGFyeUFiaSwgICAgICAgICAgICAgICAgJChUQVJHRVRfMk5EX0NQVV9BQkkpICQoVEFSR0VUXzJORF9DUFVfQUJJMikpCisKKyQoY2FsbCBhZGRfanNvbl9zdHIsICBIb3N0QXJjaCwgICAgICAgICAgICAgICAgICAgICAgICAgICQoSE9TVF9BUkNIKSkKKyQoY2FsbCBhZGRfanNvbl9zdHIsICBIb3N0U2Vjb25kYXJ5QXJjaCwgICAgICAgICAgICAgICAgICQoSE9TVF8yTkRfQVJDSCkpCiskKGNhbGwgYWRkX2pzb25fYm9vbCwgSG9zdFN0YXRpY0JpbmFyaWVzLCAgICAgICAgICAgICAgICAkKEJVSUxEX0hPU1Rfc3RhdGljKSkKKworJChjYWxsIGFkZF9qc29uX3N0ciwgIENyb3NzSG9zdCwgICAgICAgICAgICAgICAgICAgICAgICAgJChIT1NUX0NST1NTX09TKSkKKyQoY2FsbCBhZGRfanNvbl9zdHIsICBDcm9zc0hvc3RBcmNoLCAgICAgICAgICAgICAgICAgICAgICQoSE9TVF9DUk9TU19BUkNIKSkKKyQoY2FsbCBhZGRfanNvbl9zdHIsICBDcm9zc0hvc3RTZWNvbmRhcnlBcmNoLCAgICAgICAgICAgICQoSE9TVF9DUk9TU18yTkRfQVJDSCkpCisKKyQoY2FsbCBhZGRfanNvbl9saXN0LCBSZXNvdXJjZU92ZXJsYXlzLCAgICAgICAgICAgICAgICAgICQoUFJPRFVDVF9QQUNLQUdFX09WRVJMQVlTKSAkKERFVklDRV9QQUNLQUdFX09WRVJMQVlTKSkKKyQoY2FsbCBhZGRfanNvbl9saXN0LCBFbmZvcmNlUlJPVGFyZ2V0cywgICAgICAgICAgICAgICAgICQoUFJPRFVDVF9FTkZPUkNFX1JST19UQVJHRVRTKSkKKyQoY2FsbCBhZGRfanNvbl9saXN0LCBFbmZvcmNlUlJPRXhjbHVkZWRPdmVybGF5cywgICAgICAgICQoUFJPRFVDVF9FTkZPUkNFX1JST19FWENMVURFRF9PVkVSTEFZUykpCisKKyQoY2FsbCBhZGRfanNvbl9zdHIsICBBQVBUQ2hhcmFjdGVyaXN0aWNzLCAgICAgICAgICAgICAgICQoVEFSR0VUX0FBUFRfQ0hBUkFDVEVSSVNUSUNTKSkKKyQoY2FsbCBhZGRfanNvbl9saXN0LCBBQVBUQ29uZmlnLCAgICAgICAgICAgICAgICAgICAgICAgICQoUFJPRFVDVF9BQVBUX0NPTkZJRykpCiskKGNhbGwgYWRkX2pzb25fc3RyLCAgQUFQVFByZWZlcnJlZENvbmZpZywgICAgICAgICAgICAgICAkKFBST0RVQ1RfQUFQVF9QUkVGX0NPTkZJRykpCiskKGNhbGwgYWRkX2pzb25fbGlzdCwgQUFQVFByZWJ1aWx0RFBJLCAgICAgICAgICAgICAgICAgICAkKFBST0RVQ1RfQUFQVF9QUkVCVUlMVF9EUEkpKQorCiskKGNhbGwgYWRkX2pzb25fc3RyLCAgRGVmYXVsdEFwcENlcnRpZmljYXRlLCAgICAgICAgICAgICAkKFBST0RVQ1RfREVGQVVMVF9ERVZfQ0VSVElGSUNBVEUpKQorCiskKGNhbGwgYWRkX2pzb25fc3RyLCAgQXBwc0RlZmF1bHRWZXJzaW9uTmFtZSwgICAgICAgICAgICAkKEFQUFNfREVGQVVMVF9WRVJTSU9OX05BTUUpKQorCiskKGNhbGwgYWRkX2pzb25fbGlzdCwgU2FuaXRpemVIb3N0LCAgICAgICAgICAgICAgICAgICAgICAkKFNBTklUSVpFX0hPU1QpKQorJChjYWxsIGFkZF9qc29uX2xpc3QsIFNhbml0aXplRGV2aWNlLCAgICAgICAgICAgICAgICAgICAgJChTQU5JVElaRV9UQVJHRVQpKQorJChjYWxsIGFkZF9qc29uX2xpc3QsIFNhbml0aXplRGV2aWNlRGlhZywgICAgICAgICAgICAgICAgJChTQU5JVElaRV9UQVJHRVRfRElBRykpCiskKGNhbGwgYWRkX2pzb25fbGlzdCwgU2FuaXRpemVEZXZpY2VBcmNoLCAgICAgICAgICAgICAgICAkKFNBTklUSVpFX1RBUkdFVF9BUkNIKSkKKworJChjYWxsIGFkZF9qc29uX2Jvb2wsIFNhZmVzdGFjaywgICAgICAgICAgICAgICAgICAgICAgICAgJChmaWx0ZXIgdHJ1ZSwkKFVTRV9TQUZFU1RBQ0spKSkKKyQoY2FsbCBhZGRfanNvbl9ib29sLCBFbmFibGVDRkksICAgICAgICAgICAgICAgICAgICAgICAgICQoY2FsbCBpbnZlcnRfYm9vbCwkKGZpbHRlciBmYWxzZSwkKEVOQUJMRV9DRkkpKSkpCiskKGNhbGwgYWRkX2pzb25fbGlzdCwgQ0ZJRXhjbHVkZVBhdGhzLCAgICAgICAgICAgICAgICAgICAkKENGSV9FWENMVURFX1BBVEhTKSAkKFBST0RVQ1RfQ0ZJX0VYQ0xVREVfUEFUSFMpKQorJChjYWxsIGFkZF9qc29uX2xpc3QsIENGSUluY2x1ZGVQYXRocywgICAgICAgICAgICAgICAgICAgJChDRklfSU5DTFVERV9QQVRIUykgJChQUk9EVUNUX0NGSV9JTkNMVURFX1BBVEhTKSkKKyQoY2FsbCBhZGRfanNvbl9saXN0LCBJbnRlZ2VyT3ZlcmZsb3dFeGNsdWRlUGF0aHMsICAgICAgICQoSU5URUdFUl9PVkVSRkxPV19FWENMVURFX1BBVEhTKSAkKFBST0RVQ1RfSU5URUdFUl9PVkVSRkxPV19FWENMVURFX1BBVEhTKSkKKworJChjYWxsIGFkZF9qc29uX2Jvb2wsIENsYW5nVGlkeSwgICAgICAgICAgICAgICAgICAgICAgICAgJChmaWx0ZXIgMSB0cnVlLCQoV0lUSF9USURZKSkpCiskKGNhbGwgYWRkX2pzb25fc3RyLCAgVGlkeUNoZWNrcywgICAgICAgICAgICAgICAgICAgICAgICAkKFdJVEhfVElEWV9DSEVDS1MpKQorCiskKGNhbGwgYWRkX2pzb25fYm9vbCwgTmF0aXZlQ292ZXJhZ2UsICAgICAgICAgICAgICAgICAgICAkKGZpbHRlciB0cnVlLCQoTkFUSVZFX0NPVkVSQUdFKSkpCiskKGNhbGwgYWRkX2pzb25fbGlzdCwgQ292ZXJhZ2VQYXRocywgICAgICAgICAgICAgICAgICAgICAkKENPVkVSQUdFX1BBVEhTKSkKKyQoY2FsbCBhZGRfanNvbl9saXN0LCBDb3ZlcmFnZUV4Y2x1ZGVQYXRocywgICAgICAgICAgICAgICQoQ09WRVJBR0VfRVhDTFVERV9QQVRIUykpCisKKyQoY2FsbCBhZGRfanNvbl9ib29sLCBBcnRVc2VSZWFkQmFycmllciwgICAgICAgICAgICAgICAgICQoY2FsbCBpbnZlcnRfYm9vbCwkKGZpbHRlciBmYWxzZSwkKFBST0RVQ1RfQVJUX1VTRV9SRUFEX0JBUlJJRVIpKSkpCiskKGNhbGwgYWRkX2pzb25fYm9vbCwgQmluZGVyMzJiaXQsICAgICAgICAgICAgICAgICAgICAgICAkKEJJTkRFUjMyQklUKSkKKyQoY2FsbCBhZGRfanNvbl9ib29sLCBCcmlsbG8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoQlJJTExPKSkKKyQoY2FsbCBhZGRfanNvbl9zdHIsICBCdENvbmZpZ0luY2x1ZGVEaXIsICAgICAgICAgICAgICAgICQoQk9BUkRfQkxVRVRPT1RIX0JEUk9JRF9CVUlMRENGR19JTkNMVURFX0RJUikpCiskKGNhbGwgYWRkX2pzb25fYm9vbCwgRGV2aWNlX3VzZXNfaHdjMiwgICAgICAgICAgICAgICAgICAkKGZpbHRlciB0cnVlLCQoVEFSR0VUX1VTRVNfSFdDMikpKQorJChjYWxsIGFkZF9qc29uX2xpc3QsIERldmljZUtlcm5lbEhlYWRlcnMsICAgICAgICAgICAgICAgJChUQVJHRVRfUFJPSkVDVF9TWVNURU1fSU5DTFVERVMpKQorJChjYWxsIGFkZF9qc29uX2Jvb2wsIERldmljZVByZWZlcjMyQml0RXhlY3V0YWJsZXMsICAgICAgJChmaWx0ZXIgdHJ1ZSwkKFRBUkdFVF9QUkVGRVJfMzJfQklUX0VYRUNVVEFCTEVTKSkpCiskKGNhbGwgYWRkX2pzb25fc3RyLCAgRGV2aWNlVm5ka1ZlcnNpb24sICAgICAgICAgICAgICAgICAkKEJPQVJEX1ZOREtfVkVSU0lPTikpCiskKGNhbGwgYWRkX2pzb25fc3RyLCAgUGxhdGZvcm1fdm5ka192ZXJzaW9uLCAgICAgICAgICAgICAkKFBMQVRGT1JNX1ZOREtfVkVSU0lPTikpCiskKGNhbGwgYWRkX2pzb25fbGlzdCwgRXh0cmFWbmRrVmVyc2lvbnMsICAgICAgICAgICAgICAgICAkKFBST0RVQ1RfRVhUUkFfVk5ES19WRVJTSU9OUykpCiskKGNhbGwgYWRkX2pzb25fbGlzdCwgRGV2aWNlU3lzdGVtU2RrVmVyc2lvbnMsICAgICAgICAgICAkKEJPQVJEX1NZU1RFTVNES19WRVJTSU9OUykpCiskKGNhbGwgYWRkX2pzb25fbGlzdCwgUGxhdGZvcm1fc3lzdGVtc2RrX3ZlcnNpb25zLCAgICAgICAkKFBMQVRGT1JNX1NZU1RFTVNES19WRVJTSU9OUykpCiskKGNhbGwgYWRkX2pzb25fYm9vbCwgTWFsbG9jX25vdF9zdmVsdGUsICAgICAgICAgICAgICAgICAkKGNhbGwgaW52ZXJ0X2Jvb2wsJChmaWx0ZXIgdHJ1ZSwkKE1BTExPQ19TVkVMVEUpKSkpCiskKGNhbGwgYWRkX2pzb25fc3RyLCAgT3ZlcnJpZGVfcnNfZHJpdmVyLCAgICAgICAgICAgICAgICAkKE9WRVJSSURFX1JTX0RSSVZFUikpCisKKyQoY2FsbCBhZGRfanNvbl9ib29sLCBUcmVibGVfbGlua2VyX25hbWVzcGFjZXMsICAgICAgICAgICQoZmlsdGVyIHRydWUsJChQUk9EVUNUX1RSRUJMRV9MSU5LRVJfTkFNRVNQQUNFUykpKQorJChjYWxsIGFkZF9qc29uX2Jvb2wsIEVuZm9yY2VfdmludGZfbWFuaWZlc3QsICAgICAgICAgICAgJChmaWx0ZXIgdHJ1ZSwkKFBST0RVQ1RfRU5GT1JDRV9WSU5URl9NQU5JRkVTVCkpKQorCiskKGNhbGwgYWRkX2pzb25fYm9vbCwgVW1sLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGZpbHRlciB0cnVlLCQoVEFSR0VUX1VTRVJfTU9ERV9MSU5VWCkpKQorJChjYWxsIGFkZF9qc29uX2Jvb2wsIFVzZV9sbWtkX3N0YXRzX2xvZywgICAgICAgICAgICAgICAgJChmaWx0ZXIgdHJ1ZSwkKFRBUkdFVF9MTUtEX1NUQVRTX0xPRykpKQorJChjYWxsIGFkZF9qc29uX3N0ciwgIFZlbmRvclBhdGgsICAgICAgICAgICAgICAgICAgICAgICAgJChUQVJHRVRfQ09QWV9PVVRfVkVORE9SKSkKKyQoY2FsbCBhZGRfanNvbl9zdHIsICBPZG1QYXRoLCAgICAgICAgICAgICAgICAgICAgICAgICAgICQoVEFSR0VUX0NPUFlfT1VUX09ETSkpCiskKGNhbGwgYWRkX2pzb25fc3RyLCAgUHJvZHVjdFBhdGgsICAgICAgICAgICAgICAgICAgICAgICAkKFRBUkdFVF9DT1BZX09VVF9QUk9EVUNUKSkKKyQoY2FsbCBhZGRfanNvbl9ib29sLCBNaW5pbWl6ZUphdmFEZWJ1Z0luZm8sICAgICAgICAgICAgICQoZmlsdGVyIHRydWUsJChQUk9EVUNUX01JTklNSVpFX0pBVkFfREVCVUdfSU5GTykpKQorCiskKGNhbGwgYWRkX2pzb25fYm9vbCwgVXNlR29tYSwgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGZpbHRlci1vdXQgZmFsc2UsJChVU0VfR09NQSkpKQorJChjYWxsIGFkZF9qc29uX2Jvb2wsIEFyYywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChmaWx0ZXIgdHJ1ZSwkKFRBUkdFVF9BUkMpKSkKKworJChjYWxsIGFkZF9qc29uX3N0ciwgIERpc3REaXIsICAgICAgICAgICAgICAgICAgICAgICAgICAgJChpZiAkKGRpc3RfZ29hbCksICQoRElTVF9ESVIpKSkKKworJChjYWxsIGFkZF9qc29uX2xpc3QsIE5hbWVzcGFjZXNUb0V4cG9ydCwgICAgICAgICAgICAgICAgJChQUk9EVUNUX1NPT05HX05BTUVTUEFDRVMpKQorCiskKGNhbGwgYWRkX2pzb25fbGlzdCwgUGdvQWRkaXRpb25hbFByb2ZpbGVEaXJzLCAgICAgICAgICAkKFBHT19BRERJVElPTkFMX1BST0ZJTEVfRElSUykpCisKK19jb250ZW50cyA6PSAkKF9jb250ZW50cykgICAgIlZlbmRvclZhcnMiOiB7JChuZXdsaW5lKQorJChmb3JlYWNoIG5hbWVzcGFjZSwkKFNPT05HX0NPTkZJR19OQU1FU1BBQ0VTKSxcCisgICQoZXZhbCBfY29udGVudHMgOj0gJCQoX2NvbnRlbnRzKSAgICAgICAgIiQobmFtZXNwYWNlKSI6IHskJChuZXdsaW5lKSkgXAorICAkKGZvcmVhY2gga2V5LCQoU09PTkdfQ09ORklHXyQobmFtZXNwYWNlKSksXAorICAgICQoZXZhbCBfY29udGVudHMgOj0gJCQoX2NvbnRlbnRzKSAgICAgICAgICAgICIkKGtleSkiOiAiJChTT09OR19DT05GSUdfJChuYW1lc3BhY2UpXyQoa2V5KSkiLCQkKG5ld2xpbmUpKSlcCisgICQoZXZhbCBfY29udGVudHMgOj0gJCQoX2NvbnRlbnRzKSQoaWYgJChzdHJpcCAkKFNPT05HX0NPTkZJR18kKG5hbWVzcGFjZSkpKSxfX1NWX0VORCkgICAgICAgIH0sJCQobmV3bGluZSkpKQorX2NvbnRlbnRzIDo9ICQoX2NvbnRlbnRzKSQoaWYgJChzdHJpcCAkKFNPT05HX0NPTkZJR19OQU1FU1BBQ0VTKSksX19TVl9FTkQpICAgIH0sJChuZXdsaW5lKQorCitfY29udGVudHMgOj0gJChzdWJzdCAkKGNvbW1hKSQobmV3bGluZSlfX1NWX0VORCwkKG5ld2xpbmUpLCQoX2NvbnRlbnRzKV9fU1ZfRU5EfSQobmV3bGluZSkpCisKKyQoZmlsZSA+JChTT09OR19WQVJJQUJMRVMpLnRtcCwkKF9jb250ZW50cykpCisKKyQoc2hlbGwgaWYgISBjbXAgLXMgJChTT09OR19WQVJJQUJMRVMpLnRtcCAkKFNPT05HX1ZBUklBQkxFUyk7IHRoZW4gXAorCSAgbXYgJChTT09OR19WQVJJQUJMRVMpLnRtcCAkKFNPT05HX1ZBUklBQkxFUyk7IFwKIAllbHNlIFwKLQkgIHJtICQoU09PTkdfVkFSSUFCTEVTX1RNUCk7IFwKLQlmaQorCSAgcm0gJChTT09OR19WQVJJQUJMRVMpLnRtcDsgXAorCWZpKQorCitfanNvbl9saXN0IDo9Citqc29uX2xpc3QgOj0KK2Nzdl90b19qc29uX2xpc3QgOj0KK2FkZF9qc29uX3ZhbCA6PQorYWRkX2pzb25fc3RyIDo9CithZGRfanNvbl9saXN0IDo9CithZGRfanNvbl9jc3YgOj0KK2FkZF9qc29uX2Jvb2wgOj0KK2ludmVydF9ib29sIDo9CitfY29udGVudHMgOj0KKworZW5kaWYgIyBDT05GSUdVUkVfU09PTkcKZGlmZiAtLWdpdCBhL2NvcmUvc29vbmdfamF2YV9wcmVidWlsdC5tayBiL2NvcmUvc29vbmdfamF2YV9wcmVidWlsdC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2I1ZjcxCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9zb29uZ19qYXZhX3ByZWJ1aWx0Lm1rCkBAIC0wLDAgKzEsMTQ1IEBACisjIEphdmEgcHJlYnVpbHQgY29taW5nIGZyb20gU29vbmcuCisjIEV4dHJhIGlucHV0czoKKyMgTE9DQUxfU09PTkdfSEVBREVSX0pBUgorIyBMT0NBTF9TT09OR19ERVhfSkFSCisjIExPQ0FMX1NPT05HX0pBQ09DT19SRVBPUlRfQ0xBU1NFU19KQVIKKworaWZuZXEgKCQoTE9DQUxfTU9EVUxFX01BS0VGSUxFKSwkKFNPT05HX0FORFJPSURfTUspKQorICAkKGNhbGwgcHJldHR5LWVycm9yLHNvb25nX2phdmFfcHJlYnVpbHQubWsgbWF5IG9ubHkgYmUgdXNlZCBmcm9tIFNvb25nKQorZW5kaWYKKworTE9DQUxfTU9EVUxFX1NVRkZJWCA6PSAuamFyCitMT0NBTF9CVUlMVF9NT0RVTEVfU1RFTSA6PSBqYXZhbGliLmphcgorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2luY2x1ZGUgJChCVUlMRF9TWVNURU0pL2Jhc2VfcnVsZXMubWsKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitmdWxsX2NsYXNzZXNfamFyIDo9ICQoaW50ZXJtZWRpYXRlcy5DT01NT04pL2NsYXNzZXMuamFyCitmdWxsX2NsYXNzZXNfcHJlX3Byb2d1YXJkX2phciA6PSAkKGludGVybWVkaWF0ZXMuQ09NTU9OKS9jbGFzc2VzLXByZS1wcm9ndWFyZC5qYXIKK2Z1bGxfY2xhc3Nlc19oZWFkZXJfamFyIDo9ICQoaW50ZXJtZWRpYXRlcy5DT01NT04pL2NsYXNzZXMtaGVhZGVyLmphcgorY29tbW9uX2phdmFsaWIuamFyIDo9ICQoaW50ZXJtZWRpYXRlcy5DT01NT04pL2phdmFsaWIuamFyCisKKyQoZXZhbCAkKGNhbGwgY29weS1vbmUtZmlsZSwkKExPQ0FMX1BSRUJVSUxUX01PRFVMRV9GSUxFKSwkKGZ1bGxfY2xhc3Nlc19qYXIpKSkKKyQoZXZhbCAkKGNhbGwgY29weS1vbmUtZmlsZSwkKExPQ0FMX1BSRUJVSUxUX01PRFVMRV9GSUxFKSwkKGZ1bGxfY2xhc3Nlc19wcmVfcHJvZ3VhcmRfamFyKSkpCisKK2lmZGVmIExPQ0FMX0RST0lERE9DX1NUVUJTX0pBUgorJChldmFsICQoY2FsbCBjb3B5LW9uZS1maWxlLCQoTE9DQUxfRFJPSURET0NfU1RVQlNfSkFSKSwkKE9VVF9ET0NTKS8kKExPQ0FMX01PRFVMRSktc3R1YnMuc3JjamFyKSkKK0FMTF9ET0NTICs9ICQoT1VUX0RPQ1MpLyQoTE9DQUxfTU9EVUxFKS1zdHVicy5zcmNqYXIKK2VuZGlmCisKK2lmZGVmIExPQ0FMX0RST0lERE9DX0RPQ19aSVAKKyQoZXZhbCAkKGNhbGwgY29weS1vbmUtZmlsZSwkKExPQ0FMX0RST0lERE9DX0RPQ19aSVApLCQoT1VUX0RPQ1MpLyQoTE9DQUxfTU9EVUxFKS1kb2NzLnppcCkpCitlbmRpZgorCitpZmRlZiBMT0NBTF9TT09OR19KQUNPQ09fUkVQT1JUX0NMQVNTRVNfSkFSCisgICQoZXZhbCAkKGNhbGwgY29weS1vbmUtZmlsZSwkKExPQ0FMX1NPT05HX0pBQ09DT19SRVBPUlRfQ0xBU1NFU19KQVIpLFwKKyAgICAkKGludGVybWVkaWF0ZXMuQ09NTU9OKS9qYWNvY28tcmVwb3J0LWNsYXNzZXMuamFyKSkKKyAgJChjYWxsIGFkZC1kZXBlbmRlbmN5LCQoY29tbW9uX2phdmFsaWIuamFyKSxcCisgICAgJChpbnRlcm1lZGlhdGVzLkNPTU1PTikvamFjb2NvLXJlcG9ydC1jbGFzc2VzLmphcikKK2VuZGlmCisKK2lmZGVmIExPQ0FMX1NPT05HX1JFU09VUkNFX0VYUE9SVF9QQUNLQUdFCisgIG15X3Jlc19wYWNrYWdlIDo9ICQoaW50ZXJtZWRpYXRlcy5DT01NT04pL3BhY2thZ2UtcmVzLmFwaworCisgICQobXlfcmVzX3BhY2thZ2UpOiAkKExPQ0FMX1NPT05HX1JFU09VUkNFX0VYUE9SVF9QQUNLQUdFKQorCUBlY2hvICJDb3B5OiAkQCIKKwkkKGNvcHktZmlsZS10by10YXJnZXQpCisKKyAgJChjYWxsIGFkZC1kZXBlbmRlbmN5LCQoTE9DQUxfQlVJTFRfTU9EVUxFKSwkKG15X3Jlc19wYWNrYWdlKSkKKworICBteV9wcm9ndWFyZF9mbGFncyA6PSAkKGludGVybWVkaWF0ZXMuQ09NTU9OKS9leHBvcnRfcHJvZ3VhcmRfZmxhZ3MKKyAgJChteV9wcm9ndWFyZF9mbGFncyk6ICQoTE9DQUxfU09PTkdfRVhQT1JUX1BST0dVQVJEX0ZMQUdTKQorCUBlY2hvICJFeHBvcnQgcHJvZ3VhcmQgZmxhZ3M6ICRAIgorCXJtIC1mICRACisJdG91Y2ggJEAKKwlmb3IgZiBpbiAkKzsgZG8gXAorCQllY2hvIC1lICJcbiMgaW5jbHVkaW5nICQkZiIgPj4kQDsgXAorCQljYXQgJCRmID4+JEA7IFwKKwlkb25lCisKKyAgJChjYWxsIGFkZC1kZXBlbmRlbmN5LCQoTE9DQUxfQlVJTFRfTU9EVUxFKSwkKG15X3Byb2d1YXJkX2ZsYWdzKSkKKworICBteV9zdGF0aWNfbGlicmFyeV9leHRyYV9wYWNrYWdlcyA6PSAkKGludGVybWVkaWF0ZXMuQ09NTU9OKS9leHRyYV9wYWNrYWdlcworICAkKGV2YWwgJChjYWxsIGNvcHktb25lLWZpbGUsJChMT0NBTF9TT09OR19TVEFUSUNfTElCUkFSWV9FWFRSQV9QQUNLQUdFUyksJChteV9zdGF0aWNfbGlicmFyeV9leHRyYV9wYWNrYWdlcykpKQorICAkKGNhbGwgYWRkLWRlcGVuZGVuY3ksJChMT0NBTF9CVUlMVF9NT0RVTEUpLCQobXlfc3RhdGljX2xpYnJhcnlfZXh0cmFfcGFja2FnZXMpKQorZW5kaWYgIyBMT0NBTF9TT09OR19SRVNPVVJDRV9FWFBPUlRfUEFDS0FHRQorCitpZm5lcSAoJChUVVJCSU5FX0VOQUJMRUQpLGZhbHNlKQoraWZkZWYgTE9DQUxfU09PTkdfSEVBREVSX0pBUgorJChldmFsICQoY2FsbCBjb3B5LW9uZS1maWxlLCQoTE9DQUxfU09PTkdfSEVBREVSX0pBUiksJChmdWxsX2NsYXNzZXNfaGVhZGVyX2phcikpKQorZWxzZQorJChldmFsICQoY2FsbCBjb3B5LW9uZS1maWxlLCQoZnVsbF9jbGFzc2VzX2phciksJChmdWxsX2NsYXNzZXNfaGVhZGVyX2phcikpKQorZW5kaWYKK2VuZGlmICMgVFVSQklORV9FTkFCTEVEICE9IGZhbHNlCisKK2lmZGVmIExPQ0FMX1NPT05HX0RFWF9KQVIKKyAgaWZuZGVmIExPQ0FMX0lTX0hPU1RfTU9EVUxFCisgICAgaWZuZXEgKCQoZmlsdGVyICQoTE9DQUxfTU9EVUxFKSwkKFBST0RVQ1RfQk9PVF9KQVJTKSksKSAgIyBpc19ib290X2phcgorICAgICAgJChldmFsICQoY2FsbCBoaWRkZW5hcGktY29weS1zb29uZy1qYXIsJChMT0NBTF9TT09OR19ERVhfSkFSKSwkKGNvbW1vbl9qYXZhbGliLmphcikpKQorICAgIGVsc2UgIyAhaXNfYm9vdF9qYXIKKyAgICAgICQoZXZhbCAkKGNhbGwgY29weS1vbmUtZmlsZSwkKExPQ0FMX1NPT05HX0RFWF9KQVIpLCQoY29tbW9uX2phdmFsaWIuamFyKSkpCisgICAgZW5kaWYgIyBpc19ib290X2phcgorICAgICQoZXZhbCAkKGNhbGwgYWRkLWRlcGVuZGVuY3ksJChjb21tb25famF2YWxpYi5qYXIpLCQoZnVsbF9jbGFzc2VzX2phcikgJChmdWxsX2NsYXNzZXNfaGVhZGVyX2phcikpKQorCisgICAgZGV4X3ByZW9wdF9wcm9maWxlX3NyY19maWxlIDo9ICQoY29tbW9uX2phdmFsaWIuamFyKQorCisgICAgIyBkZWZpbmVzIGJ1aWx0X29kZXggYWxvbmcgd2l0aCBydWxlIHRvIGluc3RhbGwgb2RleAorICAgIGluY2x1ZGUgJChCVUlMRF9TWVNURU0pL2RleF9wcmVvcHRfb2RleF9pbnN0YWxsLm1rCisKKyAgICBkZXhfcHJlb3B0X3Byb2ZpbGVfc3JjX2ZpbGUgOj0KKworICAgIGlmZGVmIExPQ0FMX0RFWF9QUkVPUFQKKyAgICAgIGlmbmVxICgkKGRleHByZW9wdF9ib290X2phcl9tb2R1bGUpLCkgIyBib290IGphcgorICAgICAgICAjIGJvb3QgamFyJ3MgcnVsZXMgYXJlIGRlZmluZWQgaW4gZGV4X3ByZW9wdC5taworICAgICAgICBkZXhwcmVvcHRlZF9ib290X2phciA6PSAkKERFWFBSRU9QVF9CT09UX0pBUl9ESVJfRlVMTF9QQVRIKS8kKGRleHByZW9wdF9ib290X2phcl9tb2R1bGUpX25vZGV4LmphcgorICAgICAgICAkKGV2YWwgJChjYWxsIGNvcHktb25lLWZpbGUsJChkZXhwcmVvcHRlZF9ib290X2phciksJChMT0NBTF9CVUlMVF9NT0RVTEUpKSkKKworICAgICAgICAjIEZvciBsaWJhcnQgYm9vdCBqYXJzLCB3ZSBkb24ndCBoYXZlIC5vZGV4IGZpbGVzLgorICAgICAgZWxzZSAjICEgYm9vdCBqYXIKKyAgICAgICAgJChidWlsdF9vZGV4KTogUFJJVkFURV9NT0RVTEUgOj0gJChMT0NBTF9NT0RVTEUpCisgICAgICAgICMgVXNlIHBhdHRlcm4gcnVsZSAtIHdlIG1heSBoYXZlIG11bHRpcGxlIGJ1aWx0IG9kZXggZmlsZXMuCiskKGJ1aWx0X29kZXgpIDogJChkaXIgJChMT0NBTF9CVUlMVF9NT0RVTEUpKSUgOiAkKGNvbW1vbl9qYXZhbGliLmphcikKKwlAZWNobyAiRGV4cHJlb3B0IEphcjogJChQUklWQVRFX01PRFVMRSkgKCRAKSIKKwkkKGNhbGwgZGV4cHJlb3B0LW9uZS1maWxlLCQ8LCRAKQorCisgICAgICAgJChldmFsICQoY2FsbCBkZXhwcmVvcHQtY29weS1qYXIsJChjb21tb25famF2YWxpYi5qYXIpLCQoTE9DQUxfQlVJTFRfTU9EVUxFKSwkKExPQ0FMX0RFWF9QUkVPUFQpKSkKKyAgICAgIGVuZGlmICMgISBib290IGphcgorICAgIGVsc2UgIyBMT0NBTF9ERVhfUFJFT1BUCisgICAgICAkKGV2YWwgJChjYWxsIGNvcHktb25lLWZpbGUsJChjb21tb25famF2YWxpYi5qYXIpLCQoTE9DQUxfQlVJTFRfTU9EVUxFKSkpCisgICAgZW5kaWYgIyBMT0NBTF9ERVhfUFJFT1BUCisgIGVsc2UgIyBMT0NBTF9JU19IT1NUX01PRFVMRQorICAgICQoZXZhbCAkKGNhbGwgY29weS1vbmUtZmlsZSwkKExPQ0FMX1NPT05HX0RFWF9KQVIpLCQoTE9DQUxfQlVJTFRfTU9EVUxFKSkpCisgICAgJChldmFsICQoY2FsbCBhZGQtZGVwZW5kZW5jeSwkKExPQ0FMX0JVSUxUX01PRFVMRSksJChmdWxsX2NsYXNzZXNfamFyKSAkKGZ1bGxfY2xhc3Nlc19oZWFkZXJfamFyKSkpCisgIGVuZGlmCisKKyAgamF2YS1kZXggOiAkKExPQ0FMX0JVSUxUX01PRFVMRSkKK2Vsc2UKKyAgJChldmFsICQoY2FsbCBjb3B5LW9uZS1maWxlLCQoZnVsbF9jbGFzc2VzX2phciksJChMT0NBTF9CVUlMVF9NT0RVTEUpKSkKK2VuZGlmCisKK2phdmFjLWNoZWNrIDogJChmdWxsX2NsYXNzZXNfamFyKQoramF2YWMtY2hlY2stJChMT0NBTF9NT0RVTEUpIDogJChmdWxsX2NsYXNzZXNfamFyKQorCitpZm5kZWYgTE9DQUxfSVNfSE9TVF9NT0RVTEUKK2lmZXEgKCQoTE9DQUxfU0RLX1ZFUlNJT04pLHN5c3RlbV9jdXJyZW50KQorbXlfbGlua190eXBlIDo9IGphdmE6c3lzdGVtCitlbHNlIGlmbmVxICgsJChjYWxsIGhhcy1zeXN0ZW0tc2RrLXZlcnNpb24sJChMT0NBTF9TREtfVkVSU0lPTikpKQorbXlfbGlua190eXBlIDo9IGphdmE6c3lzdGVtCitlbHNlIGlmZXEgKCQoTE9DQUxfU0RLX1ZFUlNJT04pLGNvcmVfY3VycmVudCkKK215X2xpbmtfdHlwZSA6PSBqYXZhOmNvcmUKK2Vsc2UgaWZuZXEgKCQoTE9DQUxfU0RLX1ZFUlNJT04pLCkKK215X2xpbmtfdHlwZSA6PSBqYXZhOnNkaworZWxzZQorbXlfbGlua190eXBlIDo9IGphdmE6cGxhdGZvcm0KK2VuZGlmCisjIHdhcm4vYWxsb3dlZCB0eXBlcyBhcmUgYm90aCBlbXB0eSBiZWNhdXNlIFNvb25nIG1vZHVsZXMgY2FuJ3QgZGVwZW5kIG9uCisjIG1ha2UtZGVmaW5lZCBtb2R1bGVzLgorbXlfd2Fybl90eXBlcyA6PQorbXlfYWxsb3dlZF90eXBlcyA6PQorCitteV9saW5rX2RlcHMgOj0KK215XzJuZF9hcmNoX3ByZWZpeCA6PSAkKExPQ0FMXzJORF9BUkNIX1ZBUl9QUkVGSVgpCitteV9jb21tb24gOj0gQ09NTU9OCitpbmNsdWRlICQoQlVJTERfU1lTVEVNKS9saW5rX3R5cGUubWsKK2VuZGlmICMgIUxPQ0FMX0lTX0hPU1RfTU9EVUxFCmRpZmYgLS1naXQgYS9jb3JlL3N0YXRpY19qYXZhX2xpYnJhcnkubWsgYi9jb3JlL3N0YXRpY19qYXZhX2xpYnJhcnkubWsKaW5kZXggMTM3MzAxMS4uMDQyOWRkMiAxMDA2NDQKLS0tIGEvY29yZS9zdGF0aWNfamF2YV9saWJyYXJ5Lm1rCisrKyBiL2NvcmUvc3RhdGljX2phdmFfbGlicmFyeS5tawpAQCAtMjQsMTQgKzI0LDE3IEBACiBMT0NBTF9JU19TVEFUSUNfSkFWQV9MSUJSQVJZIDo9IHRydWUKIExPQ0FMX01PRFVMRV9DTEFTUyA6PSBKQVZBX0xJQlJBUklFUwogCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWluY2x1ZGUgJChCVUlMRF9TWVNURU0pL2NvbmZpZ3VyZV9sb2NhbF9qYWNrLm1rCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQogaW50ZXJtZWRpYXRlcy5DT01NT04gOj0gJChjYWxsIGxvY2FsLWludGVybWVkaWF0ZXMtZGlyLENPTU1PTikKIAogbXlfcmVzX3BhY2thZ2UgOj0KIAoraWZkZWYgTE9DQUxfQUFQVDJfT05MWQorTE9DQUxfVVNFX0FBUFQyIDo9IHRydWUKK2VuZGlmCisKKyMgUHJvY2VzcyBTdXBwb3J0IExpYnJhcnkgZGVwZW5kZW5jaWVzLgoraW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvc3VwcG9ydF9saWJyYXJpZXMubWsKKwogIyBIYWNrIHRvIGJ1aWxkIHN0YXRpYyBKYXZhIGxpYnJhcnkgd2l0aCBBbmRyb2lkIHJlc291cmNlCiAjIFNlZSBidWcgNTcxNDUxNgogYWxsX3Jlc291cmNlcyA6PQpAQCAtNzYsMTMgKzc5LDYgQEAKIAogTE9DQUxfUFJPR1VBUkRfRkxBR1MgOj0gJChhZGRwcmVmaXggLWluY2x1ZGUgLCQocHJvZ3VhcmRfb3B0aW9uc19maWxlKSkgJChMT0NBTF9QUk9HVUFSRF9GTEFHUykKIAotaWZkZWYgTE9DQUxfSkFDS19FTkFCTEVECi1pZm5kZWYgTE9DQUxfSkFDS19QUk9HVUFSRF9GTEFHUwotICAgIExPQ0FMX0pBQ0tfUFJPR1VBUkRfRkxBR1MgOj0gJChMT0NBTF9QUk9HVUFSRF9GTEFHUykKLWVuZGlmCi1MT0NBTF9KQUNLX1BST0dVQVJEX0ZMQUdTIDo9ICQoYWRkcHJlZml4IC1pbmNsdWRlICwkKHByb2d1YXJkX29wdGlvbnNfZmlsZSkpICQoTE9DQUxfSkFDS19QUk9HVUFSRF9GTEFHUykKLWVuZGlmICMgTE9DQUxfSkFDS19FTkFCTEVECi0KIFJfZmlsZV9zdGFtcCA6PSAkKGludGVybWVkaWF0ZXMuQ09NTU9OKS9zcmMvUi5zdGFtcAogTE9DQUxfSU5URVJNRURJQVRFX1RBUkdFVFMgKz0gJChSX2ZpbGVfc3RhbXApCiAKQEAgLTk1LDExICs5MSwxMSBAQAogCiBMT0NBTF9JTlRFUk1FRElBVEVfVEFSR0VUUyArPSAkKG15X3Jlc19wYWNrYWdlKQogZW5kaWYgICMgTE9DQUxfVVNFX0FBUFQyCi1lbmRpZiAgIyBMT0NBTF9SRVNPVVJDRV9ESVIKK2VuZGlmICAjIG5lZWRfY29tcGlsZV9yZXMKIAogYWxsX3Jlc19hc3NldHMgOj0gJChhbGxfcmVzb3VyY2VzKQogCi1pbmNsdWRlICQoQlVJTERfU1lTVEVNKS9qYXZhX2xpYnJhcnkubWsKK2luY2x1ZGUgJChCVUlMRF9TWVNURU0pL2phdmFfcmVuZGVyc2NyaXB0Lm1rCiAKIGlmZXEgKHRydWUsJChuZWVkX2NvbXBpbGVfcmVzKSkKIGluY2x1ZGUgJChCVUlMRF9TWVNURU0pL2FuZHJvaWRfbWFuaWZlc3QubWsKQEAgLTExMCwzMyArMTA2LDU4IEBACiBlbmRpZgogCiBmcmFtZXdvcmtfcmVzX3BhY2thZ2VfZXhwb3J0IDo9Ci1mcmFtZXdvcmtfcmVzX3BhY2thZ2VfZXhwb3J0X2RlcHMgOj0KICMgUGxlYXNlIHJlZmVyIHRvIHBhY2thZ2UubWsKIGlmbmVxICgkKExPQ0FMX05PX1NUQU5EQVJEX0xJQlJBUklFUyksdHJ1ZSkKIGlmbmVxICgkKGZpbHRlci1vdXQgY3VycmVudCBzeXN0ZW1fY3VycmVudCB0ZXN0X2N1cnJlbnQsJChMT0NBTF9TREtfUkVTX1ZFUlNJT04pKSQoaWYgJChUQVJHRVRfQlVJTERfQVBQUyksJChmaWx0ZXIgY3VycmVudCBzeXN0ZW1fY3VycmVudCB0ZXN0X2N1cnJlbnQsJChMT0NBTF9TREtfUkVTX1ZFUlNJT04pKSksKQogZnJhbWV3b3JrX3Jlc19wYWNrYWdlX2V4cG9ydCA6PSBcCiAgICAgJChISVNUT1JJQ0FMX1NES19WRVJTSU9OU19ST09UKS8kKExPQ0FMX1NES19SRVNfVkVSU0lPTikvYW5kcm9pZC5qYXIKLWZyYW1ld29ya19yZXNfcGFja2FnZV9leHBvcnRfZGVwcyA6PSAkKGZyYW1ld29ya19yZXNfcGFja2FnZV9leHBvcnQpCiBlbHNlCiBmcmFtZXdvcmtfcmVzX3BhY2thZ2VfZXhwb3J0IDo9IFwKICAgICAkKGNhbGwgaW50ZXJtZWRpYXRlcy1kaXItZm9yLEFQUFMsZnJhbWV3b3JrLXJlcywsQ09NTU9OKS9wYWNrYWdlLWV4cG9ydC5hcGsKLWZyYW1ld29ya19yZXNfcGFja2FnZV9leHBvcnRfZGVwcyA6PSBcCi0gICAgJChkaXIgJChmcmFtZXdvcmtfcmVzX3BhY2thZ2VfZXhwb3J0KSlzcmMvUi5zdGFtcAogZW5kaWYKIGVuZGlmCiAKK2lmZGVmIExPQ0FMX1VTRV9BQVBUMgoraW1wb3J0X3Byb2d1YXJkX2ZsYWdfZmlsZXMgOj0gJChzdHJpcCAkKGZvcmVhY2ggbCwkKExPQ0FMX1NUQVRJQ19BTkRST0lEX0xJQlJBUklFUyksXAorICAgICQoY2FsbCBpbnRlcm1lZGlhdGVzLWRpci1mb3IsSkFWQV9MSUJSQVJJRVMsJChsKSwsQ09NTU9OKS9leHBvcnRfcHJvZ3VhcmRfZmxhZ3MpKQorJChpbnRlcm1lZGlhdGVzLkNPTU1PTikvZXhwb3J0X3Byb2d1YXJkX2ZsYWdzOiAkKGltcG9ydF9wcm9ndWFyZF9mbGFnX2ZpbGVzKSAkKGFkZHByZWZpeCAkKExPQ0FMX1BBVEgpLywkKExPQ0FMX0VYUE9SVF9QUk9HVUFSRF9GTEFHX0ZJTEVTKSkKKwlAZWNobyAiRXhwb3J0IHByb2d1YXJkIGZsYWdzOiAkQCIKKwlybSAtZiAkQAorCXRvdWNoICRACisJZm9yIGYgaW4gJCs7IGRvIFwKKwkJZWNobyAtZSAiXG4jIGluY2x1ZGluZyAkJGYiID4+JEA7IFwKKwkJY2F0ICQkZiA+PiRAOyBcCisJZG9uZQoraW1wb3J0X3Byb2d1YXJkX2ZsYWdfZmlsZXMgOj0KK2VuZGlmCisKK2luY2x1ZGUgJChCVUlMRF9TWVNURU0pL2FhcHRfZmxhZ3MubWsKKworJChMT0NBTF9JTlRFUk1FRElBVEVfVEFSR0VUUyk6IFBSSVZBVEVfQUFQVF9GTEFHUyA6PSAkKExPQ0FMX0FBUFRfRkxBR1MpCiskKExPQ0FMX0lOVEVSTUVESUFURV9UQVJHRVRTKTogUFJJVkFURV9UQVJHRVRfQUFQVF9DSEFSQUNURVJJU1RJQ1MgOj0gJChUQVJHRVRfQUFQVF9DSEFSQUNURVJJU1RJQ1MpCiskKExPQ0FMX0lOVEVSTUVESUFURV9UQVJHRVRTKTogUFJJVkFURV9NQU5JRkVTVF9QQUNLQUdFX05BTUUgOj0gJChMT0NBTF9NQU5JRkVTVF9QQUNLQUdFX05BTUUpCiskKExPQ0FMX0lOVEVSTUVESUFURV9UQVJHRVRTKTogUFJJVkFURV9NQU5JRkVTVF9JTlNUUlVNRU5UQVRJT05fRk9SIDo9ICQoTE9DQUxfTUFOSUZFU1RfSU5TVFJVTUVOVEFUSU9OX0ZPUikKKwogIyBhZGQgLS1ub24tY29uc3RhbnQtaWQgdG8gcHJldmVudCBpbmxpbmluZyBjb25zdGFudHMuCiAjIEFBUiBuZWVkcyB0ZXh0IHN5bWJvbCBmaWxlIFIudHh0LgogaWZkZWYgTE9DQUxfVVNFX0FBUFQyCi0kKExPQ0FMX0lOVEVSTUVESUFURV9UQVJHRVRTKTogUFJJVkFURV9BQVBUX0ZMQUdTIDo9ICQoTE9DQUxfQUFQVF9GTEFHUykgLS1zdGF0aWMtbGliIC0tbm8tc3RhdGljLWxpYi1wYWNrYWdlcworJChMT0NBTF9JTlRFUk1FRElBVEVfVEFSR0VUUyk6IFBSSVZBVEVfQUFQVF9GTEFHUyA6PSAkKExPQ0FMX0FBUFRfRkxBR1MpIC0tc3RhdGljLWxpYiAtLW91dHB1dC10ZXh0LXN5bWJvbHMgJChpbnRlcm1lZGlhdGVzLkNPTU1PTikvUi50eHQKK2lmbmRlZiBMT0NBTF9BQVBUX05BTUVTUEFDRVMKKyAgJChMT0NBTF9JTlRFUk1FRElBVEVfVEFSR0VUUyk6IFBSSVZBVEVfQUFQVF9GTEFHUyArPSAtLW5vLXN0YXRpYy1saWItcGFja2FnZXMKK2VuZGlmCiAkKExPQ0FMX0lOVEVSTUVESUFURV9UQVJHRVRTKTogUFJJVkFURV9QUk9EVUNUX0FBUFRfQ09ORklHIDo9CiAkKExPQ0FMX0lOVEVSTUVESUFURV9UQVJHRVRTKTogUFJJVkFURV9QUk9EVUNUX0FBUFRfUFJFRl9DT05GSUcgOj0KICQoTE9DQUxfSU5URVJNRURJQVRFX1RBUkdFVFMpOiBQUklWQVRFX1RBUkdFVF9BQVBUX0NIQVJBQ1RFUklTVElDUyA6PQogZWxzZQotJChMT0NBTF9JTlRFUk1FRElBVEVfVEFSR0VUUyk6IFBSSVZBVEVfQUFQVF9GTEFHUyA6PSAkKExPQ0FMX0FBUFRfRkxBR1MpIC0tbm9uLWNvbnN0YW50LWlkIC0tb3V0cHV0LXRleHQtc3ltYm9scyAkKExPQ0FMX0lOVEVSTUVESUFURV9TT1VSQ0VfRElSKQorJChMT0NBTF9JTlRFUk1FRElBVEVfVEFSR0VUUyk6IFBSSVZBVEVfQUFQVF9GTEFHUyA6PSAkKExPQ0FMX0FBUFRfRkxBR1MpIC0tbm9uLWNvbnN0YW50LWlkIC0tb3V0cHV0LXRleHQtc3ltYm9scyAkKGludGVybWVkaWF0ZXMuQ09NTU9OKQorCitteV9zcmNqYXIgOj0gJChpbnRlcm1lZGlhdGVzLkNPTU1PTikvYWFwdC5zcmNqYXIKK0xPQ0FMX1NSQ0pBUlMgKz0gJChteV9zcmNqYXIpCiskKFJfZmlsZV9zdGFtcCk6IFBSSVZBVEVfU1JDSkFSIDo9ICQobXlfc3JjamFyKQorJChSX2ZpbGVfc3RhbXApOiBQUklWQVRFX0pBVkFfR0VOX0RJUiA6PSAkKGludGVybWVkaWF0ZXMuQ09NTU9OKS9hYXB0CiskKFJfZmlsZV9zdGFtcCk6IC5LQVRJX0lNUExJQ0lUX09VVFBVVFMgOj0gJChteV9zcmNqYXIpCiBlbmRpZgogCi0kKExPQ0FMX0lOVEVSTUVESUFURV9UQVJHRVRTKTogUFJJVkFURV9TT1VSQ0VfSU5URVJNRURJQVRFU19ESVIgOj0gJChMT0NBTF9JTlRFUk1FRElBVEVfU09VUkNFX0RJUikKICQoTE9DQUxfSU5URVJNRURJQVRFX1RBUkdFVFMpOiBQUklWQVRFX0FORFJPSURfTUFOSUZFU1QgOj0gJChmdWxsX2FuZHJvaWRfbWFuaWZlc3QpCiAkKExPQ0FMX0lOVEVSTUVESUFURV9UQVJHRVRTKTogUFJJVkFURV9SRVNPVVJDRV9QVUJMSUNTX09VVFBVVCA6PSAkKGludGVybWVkaWF0ZXMuQ09NTU9OKS9wdWJsaWNfcmVzb3VyY2VzLnhtbAogJChMT0NBTF9JTlRFUk1FRElBVEVfVEFSR0VUUyk6IFBSSVZBVEVfUkVTT1VSQ0VfRElSIDo9ICQoTE9DQUxfUkVTT1VSQ0VfRElSKQpAQCAtMTQ4LDQxICsxNjksMzYgQEAKICQoTE9DQUxfSU5URVJNRURJQVRFX1RBUkdFVFMpOiBQUklWQVRFX01BTklGRVNUX0lOU1RSVU1FTlRBVElPTl9GT1IgOj0KIAogaWZkZWYgTE9DQUxfVVNFX0FBUFQyCi0jIE9uZSBtb3JlIGxldmVsIHdpdGggbmFtZSByZXMgc28gd2UgY2FuIHppcCB1cCB0aGUgZmxhdCByZXNvdXJjZXMgdGhhdCBjYW4gYmUgbGlua2VkIGJ5IGFwcHMuCi1teV9jb21waWxlZF9yZXNfYmFzZV9kaXIgOj0gJChpbnRlcm1lZGlhdGVzLkNPTU1PTikvZmxhdC1yZXMvcmVzCi1yZW5kZXJzY3JpcHRfdGFyZ2V0X2FwaSA6PQotaWZuZXEgKCwkKExPQ0FMX1JFTkRFUlNDUklQVF9UQVJHRVRfQVBJKSkKLXJlbmRlcnNjcmlwdF90YXJnZXRfYXBpIDo9ICQoTE9DQUxfUkVOREVSU0NSSVBUX1RBUkdFVF9BUEkpCisgICMgT25lIG1vcmUgbGV2ZWwgd2l0aCBuYW1lIHJlcyBzbyB3ZSBjYW4gemlwIHVwIHRoZSBmbGF0IHJlc291cmNlcyB0aGF0IGNhbiBiZSBsaW5rZWQgYnkgYXBwcy4KKyAgbXlfY29tcGlsZWRfcmVzX2Jhc2VfZGlyIDo9ICQoaW50ZXJtZWRpYXRlcy5DT01NT04pL2ZsYXQtcmVzL3JlcworICBpZm5lcSAoLCQocmVuZGVyc2NyaXB0X3RhcmdldF9hcGkpKQorICAgIGlmbmVxICgkKGNhbGwgbWF0aF9ndF9vcl9lcSwkKHJlbmRlcnNjcmlwdF90YXJnZXRfYXBpKSwyMSksdHJ1ZSkKKyAgICAgIG15X2dlbmVyYXRlZF9yZXNfemlwcyA6PSAkKHJzX2dlbmVyYXRlZF9yZXNfemlwKQorICAgIGVuZGlmICAjIHJlbmRlcnNjcmlwdF90YXJnZXRfYXBpIDwgMjEKKyAgZW5kaWYgICMgcmVuZGVyc2NyaXB0X3RhcmdldF9hcGkgaXMgc2V0CisgIGluY2x1ZGUgJChCVUlMRF9TWVNURU0pL2FhcHQyLm1rCisgICQobXlfcmVzX3BhY2thZ2UpIDogJChmcmFtZXdvcmtfcmVzX3BhY2thZ2VfZXhwb3J0KQorICAkKG15X3Jlc19wYWNrYWdlKTogLktBVElfSU1QTElDSVRfT1VUUFVUUyArPSAkKGludGVybWVkaWF0ZXMuQ09NTU9OKS9SLnR4dAogZWxzZQotaWZuZXEgKCwkKExPQ0FMX1NES19WRVJTSU9OKSkKLSMgU2V0IHRhcmdldC1hcGkgZm9yIExPQ0FMX1NES19WRVJTSU9OcyBvdGhlciB0aGFuIGN1cnJlbnQuCi1pZm5lcSAoLCQoZmlsdGVyLW91dCBjdXJyZW50IHN5c3RlbV9jdXJyZW50IHRlc3RfY3VycmVudCwgJChMT0NBTF9TREtfVkVSU0lPTikpKQotcmVuZGVyc2NyaXB0X3RhcmdldF9hcGkgOj0gJChMT0NBTF9TREtfVkVSU0lPTikKLWVuZGlmCi1lbmRpZiAgIyBMT0NBTF9TREtfVkVSU0lPTiBpcyBzZXQKLWVuZGlmICAjIExPQ0FMX1JFTkRFUlNDUklQVF9UQVJHRVRfQVBJIGlzIHNldAotaWZuZXEgKCwkKHJlbmRlcnNjcmlwdF90YXJnZXRfYXBpKSkKLWlmbmVxICgkKGNhbGwgbWF0aF9ndF9vcl9lcSwkKHJlbmRlcnNjcmlwdF90YXJnZXRfYXBpKSwyMSksdHJ1ZSkKLW15X2dlbmVyYXRlZF9yZXNfZGlycyA6PSAkKHJzX2dlbmVyYXRlZF9yZXNfZGlyKQotbXlfZ2VuZXJhdGVkX3Jlc19kaXJzX2RlcHMgOj0gJChSZW5kZXJTY3JpcHRfZmlsZV9zdGFtcCkKLWVuZGlmICAjIHJlbmRlcnNjcmlwdF90YXJnZXRfYXBpIDwgMjEKLWVuZGlmICAjIHJlbmRlcnNjcmlwdF90YXJnZXRfYXBpIGlzIHNldAotaW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvYWFwdDIubWsKLSQobXlfcmVzX3BhY2thZ2UpIDogJChmcmFtZXdvcmtfcmVzX3BhY2thZ2VfZXhwb3J0X2RlcHMpCi1lbHNlCi0kKFJfZmlsZV9zdGFtcCkgOiAkKGFsbF9yZXNvdXJjZXMpICQoZnVsbF9hbmRyb2lkX21hbmlmZXN0KSAkKEFBUFQpICQoZnJhbWV3b3JrX3Jlc19wYWNrYWdlX2V4cG9ydF9kZXBzKQorICAkKFJfZmlsZV9zdGFtcCk6IC5LQVRJX0lNUExJQ0lUX09VVFBVVFMgKz0gJChpbnRlcm1lZGlhdGVzLkNPTU1PTikvUi50eHQKKyAgJChSX2ZpbGVfc3RhbXApOiBQUklWQVRFX1JFU09VUkNFX0xJU1QgOj0gJChhbGxfcmVzb3VyY2VzKQorICAkKFJfZmlsZV9zdGFtcCkgOiAkKGFsbF9yZXNvdXJjZXMpICQoZnVsbF9hbmRyb2lkX21hbmlmZXN0KSAkKEFBUFQpICQoU09PTkdfWklQKSBcCisgICAgJChmcmFtZXdvcmtfcmVzX3BhY2thZ2VfZXhwb3J0KSAkKHJzX2dlbmVyYXRlZF9yZXNfemlwKQogCUBlY2hvICJ0YXJnZXQgUi5qYXZhL01hbmlmZXN0LmphdmE6ICQoUFJJVkFURV9NT0RVTEUpICgkQCkiCiAJJChjcmVhdGUtcmVzb3VyY2UtamF2YS1maWxlcykKLQkkKGhpZGUpIGZpbmQgJChQUklWQVRFX1NPVVJDRV9JTlRFUk1FRElBVEVTX0RJUikgLW5hbWUgUi5qYXZhIHwgeGFyZ3MgY2F0ID4gJEAKKwkkKGhpZGUpIGZpbmQgJChQUklWQVRFX0pBVkFfR0VOX0RJUikgLW5hbWUgUi5qYXZhIHwgeGFyZ3MgY2F0ID4gJEAKIGVuZGlmICAjIExPQ0FMX1VTRV9BQVBUMgogCitlbmRpZiAjIG5lZWRfY29tcGlsZV9yZXMKKworaW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvamF2YV9saWJyYXJ5Lm1rCisKK2lmZXEgKHRydWUsJChuZWVkX2NvbXBpbGVfcmVzKSkKKwogJChMT0NBTF9CVUlMVF9NT0RVTEUpOiAkKFJfZmlsZV9zdGFtcCkKLWlmZGVmIExPQ0FMX0pBQ0tfRU5BQkxFRAotJChub3Nocm9iX2NsYXNzZXNfamFjayk6ICQoUl9maWxlX3N0YW1wKQotJChmdWxsX2NsYXNzZXNfamFjayk6ICQoUl9maWxlX3N0YW1wKQotJChqYWNrX2NoZWNrX3RpbWVzdGFtcCk6ICQoUl9maWxlX3N0YW1wKQotZW5kaWYgIyBMT0NBTF9KQUNLX0VOQUJMRUQKKyQoamF2YV9zb3VyY2VfbGlzdF9maWxlKTogJChSX2ZpbGVfc3RhbXApCiAkKGZ1bGxfY2xhc3Nlc19jb21waWxlZF9qYXIpOiAkKFJfZmlsZV9zdGFtcCkKKyQoZnVsbF9jbGFzc2VzX3R1cmJpbmVfamFyKTogJChSX2ZpbGVfc3RhbXApCiAKIAogIyBpZiB3ZSBoYXZlIGN1c3RvbSBwcm9ndWFyZGluZyBkb25lIHVzZSB0aGUgcHJvZ3VhcmRlZCBjbGFzc2VzIGphciBpbnN0ZWFkIG9mIHRoZSBub3JtYWwgY2xhc3NlcyBqYXIKQEAgLTE5OCw4ICsyMTQsOSBAQAogJChidWlsdF9hYXIpOiBQUklWQVRFX0FORFJPSURfTUFOSUZFU1QgOj0gJChmdWxsX2FuZHJvaWRfbWFuaWZlc3QpCiAkKGJ1aWx0X2Fhcik6IFBSSVZBVEVfQ0xBU1NFU19KQVIgOj0gJChhYXJfY2xhc3Nlc19qYXIpCiAkKGJ1aWx0X2Fhcik6IFBSSVZBVEVfUkVTT1VSQ0VfRElSIDo9ICQoTE9DQUxfUkVTT1VSQ0VfRElSKQotJChidWlsdF9hYXIpOiBQUklWQVRFX1JfVFhUIDo9ICQoTE9DQUxfSU5URVJNRURJQVRFX1NPVVJDRV9ESVIpL1IudHh0Ci0kKGJ1aWx0X2FhcikgOiAkKGFhcl9jbGFzc2VzX2phcikgJChmdWxsX2FuZHJvaWRfbWFuaWZlc3QpCiskKGJ1aWx0X2Fhcik6IFBSSVZBVEVfUl9UWFQgOj0gJChpbnRlcm1lZGlhdGVzLkNPTU1PTikvUi50eHQKKyQoYnVpbHRfYWFyKTogJChKQVJfQVJHUykKKyQoYnVpbHRfYWFyKSA6ICQoYWFyX2NsYXNzZXNfamFyKSAkKGZ1bGxfYW5kcm9pZF9tYW5pZmVzdCkgJChpbnRlcm1lZGlhdGVzLkNPTU1PTikvUi50eHQKIAlAZWNobyAidGFyZ2V0IEFBUjogICQoUFJJVkFURV9NT0RVTEUpICgkQCkiCiAJJChoaWRlKSBybSAtcmYgJChkaXIgJEApYWFyICYmIG1rZGlyIC1wICQoZGlyICRAKWFhci9yZXMKIAkkKGhpZGUpIGNwICQoUFJJVkFURV9BTkRST0lEX01BTklGRVNUKSAkKGRpciAkQClhYXIvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMjA4LDcgKzIyNSw3IEBACiAJJChoaWRlKSAkKGZvcmVhY2ggcmVzLCQoUFJJVkFURV9SRVNPVVJDRV9ESVIpLGNwIC1SZm4gJChyZXMpLyogJChkaXIgJEApYWFyL3JlczspCiAJJChoaWRlKSBjcCAkKFBSSVZBVEVfUl9UWFQpICQoZGlyICRAKWFhci9SLnR4dAogCSQoaGlkZSkgJChKQVIpIC1jTWYgJEAgXAotCSAgLUMgJChkaXIgJEApYWFyIC4KKwkgICQoY2FsbCBqYXItYXJncy1zb3J0ZWQtZmlsZXMtaW4tZGlyZWN0b3J5LCQoZGlyICRAKWFhcikKIAogIyBSZWdpc3RlciB0aGUgYWFyIGZpbGUuCiBBTExfTU9EVUxFUy4kKExPQ0FMX01PRFVMRSkuQUFSIDo9ICQoYnVpbHRfYWFyKQpkaWZmIC0tZ2l0IGEvY29yZS9zdXBwb3J0X2xpYnJhcmllcy5tayBiL2NvcmUvc3VwcG9ydF9saWJyYXJpZXMubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzUzOGNlMAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvc3VwcG9ydF9saWJyYXJpZXMubWsKQEAgLTAsMCArMSw1MyBAQAorIworIyBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIFJ1bGVzIGZvciByZXNvbHZpbmcgU3VwcG9ydCBMaWJyYXJ5IGRlcGVuZGVuY2llcy4KKyMjCisjIyBUaGUgZm9sbG93aW5nIHZhcmlhYmxlcyBtYXkgYmUgbW9kaWZpZWQ6CisjIyAtIExPQ0FMX0pBVkFfTElCUkFSSUVTCisjIyAtIExPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUworIyMgLSBMT0NBTF9TSEFSRURfQU5EUk9JRF9MSUJSQVJJRVMKKyMjIC0gTE9DQUxfU1RBVElDX0FORFJPSURfTElCUkFSSUVTCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIFNvbWUgcHJvamVjdHMgZG9uJ3Qgd29yayBjb3JyZWN0bHkgeWV0LiBBbGxvdyB0aGVtIHRvIHNraXAgcmVzb2x1dGlvbi4KK2lmbmRlZiBMT0NBTF9ESVNBQkxFX1JFU09MVkVfU1VQUE9SVF9MSUJSQVJJRVMKKworIyBBZ2dyZWdhdGUgYWxsIHJlcXVlc3RlZCBTdXBwb3J0IExpYnJhcnkgbW9kdWxlcy4KK3JlcXVlc3RlZF9zdXBwb3J0X2xpYnMgOj0gJChmaWx0ZXIgJChTVVBQT1JUX0xJQlJBUklFU19KQVJTKSAkKFNVUFBPUlRfTElCUkFSSUVTX0FBUlMpLCBcCisgICAgJChMT0NBTF9KQVZBX0xJQlJBUklFUykgJChMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMpIFwKKyAgICAkKExPQ0FMX1NIQVJFRF9BTkRST0lEX0xJQlJBUklFUykgJChMT0NBTF9TVEFUSUNfQU5EUk9JRF9MSUJSQVJJRVMpKQorCisjIEZpbHRlciB0aGUgU3VwcG9ydCBMaWJyYXJ5IG1vZHVsZXMgb3V0IG9mIHRoZSBsaWJyYXJ5IHZhcmlhYmxlcy4gV2UgZG9uJ3QKKyMgdHJ1c3QgZGV2ZWxvcGVycyB0byBnZXQgdGhlc2UgcmlnaHQsIHNvIHRoZXkgd2lsbCBiZSBhZGRlZCBiYWNrIGJ5IHRoZQorIyBidWlsZCBzeXN0ZW0gYmFzZWQgb24gdGhlIG91dHB1dCBvZiB0aGlzIGZpbGUgYW5kIHRoZSB0eXBlIG9mIGJ1aWxkLgorTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gJChmaWx0ZXItb3V0ICQocmVxdWVzdGVkX3N1cHBvcnRfbGlicyksIFwKKyAgICAkKExPQ0FMX0pBVkFfTElCUkFSSUVTKSkKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSAkKGZpbHRlci1vdXQgJChyZXF1ZXN0ZWRfc3VwcG9ydF9saWJzKSwgXAorICAgICQoTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTKSkKK0xPQ0FMX1NIQVJFRF9BTkRST0lEX0xJQlJBUklFUyA6PSAkKGZpbHRlci1vdXQgJChyZXF1ZXN0ZWRfc3VwcG9ydF9saWJzKSwgXAorICAgICQoTE9DQUxfU0hBUkVEX0FORFJPSURfTElCUkFSSUVTKSkKK0xPQ0FMX1NUQVRJQ19BTkRST0lEX0xJQlJBUklFUyA6PSAkKGZpbHRlci1vdXQgJChyZXF1ZXN0ZWRfc3VwcG9ydF9saWJzKSwgXAorICAgICQoTE9DQUxfU1RBVElDX0FORFJPSURfTElCUkFSSUVTKSkKKworTE9DQUxfU1RBVElDX0FORFJPSURfTElCUkFSSUVTIDo9ICQoc3RyaXAgJChMT0NBTF9TVEFUSUNfQU5EUk9JRF9MSUJSQVJJRVMpIFwKKyAgICAkKGZpbHRlciAkKFNVUFBPUlRfTElCUkFSSUVTX0FBUlMpLCQocmVxdWVzdGVkX3N1cHBvcnRfbGlicykpKQorTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9ICQoc3RyaXAgJChMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMpIFwKKyAgICAkKGZpbHRlciAkKFNVUFBPUlRfTElCUkFSSUVTX0pBUlMpLCQocmVxdWVzdGVkX3N1cHBvcnRfbGlicykpKQorCitlbmRpZiAjTE9DQUxfRElTQUJMRV9SRVNPTFZFX1NVUFBPUlRfTElCUkFSSUVTCitMT0NBTF9ESVNBQkxFX1JFU09MVkVfU1VQUE9SVF9MSUJSQVJJRVMgOj0KZGlmZiAtLWdpdCBhL3RhcmdldC9ib2FyZC9nZW5lcmljX2FybXY1L0JvYXJkQ29uZmlnLm1rIGIvY29yZS90YXJnZXRfdGVzdF9jb25maWcubWsKc2ltaWxhcml0eSBpbmRleCA3MCUKcmVuYW1lIGZyb20gdGFyZ2V0L2JvYXJkL2dlbmVyaWNfYXJtdjUvQm9hcmRDb25maWcubWsKcmVuYW1lIHRvIGNvcmUvdGFyZ2V0X3Rlc3RfY29uZmlnLm1rCmluZGV4IDAxNjkzN2EuLjYxZjVkMmIgMTAwNjQ0Ci0tLSBhL3RhcmdldC9ib2FyZC9nZW5lcmljX2FybXY1L0JvYXJkQ29uZmlnLm1rCisrKyBiL2NvcmUvdGFyZ2V0X3Rlc3RfY29uZmlnLm1rCkBAIC0xLDUgKzEsNSBAQAogIwotIyBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIyBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogIwogIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMTQsMTAgKzE0LDEwIEBACiAjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1pbmNsdWRlIGJ1aWxkL3RhcmdldC9ib2FyZC9nZW5lcmljL0JvYXJkQ29uZmlnLm1rCisjCisjIENvbW1vbiBydWxlcyBmb3IgYnVpbGRpbmcgYSBUcmFkZUZlZCB0ZXN0IFhNTCBmaWxlIGZvciB0YXJnZXQgc2lkZSB0ZXN0cy4KKyMKIAotVEFSR0VUX0FSQ0hfVkFSSUFOVCA6PSBhcm12NXRlCi1UQVJHRVRfQ1BVX0FCSSA6PSBhcm1lYWJpCi1UQVJHRVRfQ1BVX0FCSTIgOj0KKyQoY2FsbCByZWNvcmQtbW9kdWxlLXR5cGUsVEFSR0VUX1RFU1RfQ09ORklHKQogCi1XSVRIX0RFWFBSRU9QVCA6PSBmYWxzZQoraW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvdGVzdF9jb25maWdfY29tbW9uLm1rCmRpZmYgLS1naXQgYS9jb3JlL3RhcmdldF90ZXN0X2ludGVybmFsLm1rIGIvY29yZS90YXJnZXRfdGVzdF9pbnRlcm5hbC5tawppbmRleCA1OWEzYTllLi5iNWMzYTdjIDEwMDY0NAotLS0gYS9jb3JlL3RhcmdldF90ZXN0X2ludGVybmFsLm1rCisrKyBiL2NvcmUvdGFyZ2V0X3Rlc3RfaW50ZXJuYWwubWsKQEAgLTgsMTUgKzgsOSBAQAogICBpZm5kZWYgTE9DQUxfU0RLX1ZFUlNJT04KICAgICBMT0NBTF9TVEFUSUNfTElCUkFSSUVTICs9IGxpYmd0ZXN0X21haW4gbGliZ3Rlc3QKICAgZWxzZQotICAgIGlmbmVxICgsJChmaWx0ZXIgYysrXyUsJChMT0NBTF9OREtfU1RMX1ZBUklBTlQpKSkKLSAgICAgICAgbXlfbmRrX2d0ZXN0X3N1ZmZpeCA6PSBfYysrCi0gICAgZWxzZSBpZm5lcSAoJChmaWx0ZXIgc3RscG9ydF8sJChMT0NBTF9OREtfU1RMX1ZBUklBTlQpKSwpCi0gICAgICAgIG15X25ka19ndGVzdF9zdWZmaXggOj0gX3N0bHBvcnQKLSAgICBlbHNlIGlmbmVxICgkKGZpbHRlciBnbnVzdGxfLCQoTE9DQUxfTkRLX1NUTF9WQVJJQU5UKSksKQotICAgICAgICBteV9uZGtfZ3Rlc3Rfc3VmZml4IDo9IF9nbnVzdGwKLSAgICBlbHNlICMgc3lzdGVtIFNUTCwgdXNlIHN0bHBvcnQKLSAgICAgICAgbXlfbmRrX2d0ZXN0X3N1ZmZpeCA6PSBfc3RscG9ydAotICAgIGVuZGlmCisgICAgIyBUT0RPKGRhbmFsYmVydCk6IFJlbW92ZSB0aGUgc3VmZml4IGZyb20gdGhlIG1vZHVsZSBzaW5jZSB3ZSBvbmx5IG5lZWQgdGhlCisgICAgIyBvbmUgdmFyaWFudCBub3cuCisgICAgbXlfbmRrX2d0ZXN0X3N1ZmZpeCA6PSBfYysrCiAgICAgTE9DQUxfU1RBVElDX0xJQlJBUklFUyArPSBcCiAgICAgICAgIGxpYmd0ZXN0X21haW5fbmRrJChteV9uZGtfZ3Rlc3Rfc3VmZml4KSBcCiAgICAgICAgIGxpYmd0ZXN0X25kayQobXlfbmRrX2d0ZXN0X3N1ZmZpeCkKZGlmZiAtLWdpdCBhL2NvcmUvdGFza3MvYXBpY2hlY2subWsgYi9jb3JlL3Rhc2tzL2FwaWNoZWNrLm1rCmluZGV4IDM5NzVkMjAuLmY0YWVlM2YgMTAwNjQ0Ci0tLSBhL2NvcmUvdGFza3MvYXBpY2hlY2subWsKKysrIGIvY29yZS90YXNrcy9hcGljaGVjay5tawpAQCAtNTEsNyArNTEsNyBAQAogICAgICQoSU5URVJOQUxfUExBVEZPUk1fUkVNT1ZFRF9BUElfRklMRSksIFwKICAgICAtaGlkZSAyIC1oaWRlIDMgLWhpZGUgNCAtaGlkZSA1IC1oaWRlIDYgLWhpZGUgMjQgLWhpZGUgMjUgLWhpZGUgMjYgLWhpZGUgMjcgXAogICAgIC1lcnJvciA3IC1lcnJvciA4IC1lcnJvciA5IC1lcnJvciAxMCAtZXJyb3IgMTEgLWVycm9yIDEyIC1lcnJvciAxMyAtZXJyb3IgMTQgLWVycm9yIDE1IFwKLSAgICAtZXJyb3IgMTYgLWVycm9yIDE3IC1lcnJvciAxOCAsIFwKKyAgICAtZXJyb3IgMTYgLWVycm9yIDE3IC1lcnJvciAxOCAtZXJyb3IgMzEsIFwKICAgICBjYXQgJChCVUlMRF9TWVNURU0pL2FwaWNoZWNrX21zZ19sYXN0LnR4dCwgXAogICAgIGNoZWNrLXB1YmxpYy1hcGksIFwKICAgICAkKGNhbGwgZG9jLXRpbWVzdGFtcC1mb3IsYXBpLXN0dWJzKSBcCkBAIC05Nyw3ICs5Nyw3IEBACiAgICAgJChJTlRFUk5BTF9QTEFURk9STV9TWVNURU1fUkVNT1ZFRF9BUElfRklMRSksIFwKICAgICAtaGlkZSAyIC1oaWRlIDMgLWhpZGUgNCAtaGlkZSA1IC1oaWRlIDYgLWhpZGUgMjQgLWhpZGUgMjUgLWhpZGUgMjYgLWhpZGUgMjcgXAogICAgIC1lcnJvciA3IC1lcnJvciA4IC1lcnJvciA5IC1lcnJvciAxMCAtZXJyb3IgMTEgLWVycm9yIDEyIC1lcnJvciAxMyAtZXJyb3IgMTQgLWVycm9yIDE1IFwKLSAgICAtZXJyb3IgMTYgLWVycm9yIDE3IC1lcnJvciAxOCAsIFwKKyAgICAtZXJyb3IgMTYgLWVycm9yIDE3IC1lcnJvciAxOCAtZXJyb3IgMzEsIFwKICAgICBjYXQgJChCVUlMRF9TWVNURU0pL2FwaWNoZWNrX21zZ19sYXN0LnR4dCwgXAogICAgIGNoZWNrLXN5c3RlbS1hcGksIFwKICAgICAkKGNhbGwgZG9jLXRpbWVzdGFtcC1mb3Isc3lzdGVtLWFwaS1zdHVicykgXApkaWZmIC0tZ2l0IGEvdGFyZ2V0L2JvYXJkL2dlbmVyaWNfYXJtdjUvZGV2aWNlLm1rIGIvY29yZS90YXNrcy9hcGlkaWZmLm1rCnNpbWlsYXJpdHkgaW5kZXggNzglCnJlbmFtZSBmcm9tIHRhcmdldC9ib2FyZC9nZW5lcmljX2FybXY1L2RldmljZS5tawpyZW5hbWUgdG8gY29yZS90YXNrcy9hcGlkaWZmLm1rCmluZGV4IDdjNGFhZjIuLjRlYjU5YWYgMTAwNjQ0Ci0tLSBhL3RhcmdldC9ib2FyZC9nZW5lcmljX2FybXY1L2RldmljZS5taworKysgYi9jb3JlL3Rhc2tzL2FwaWRpZmYubWsKQEAgLTEsNSArMSw0IEBACi0jCi0jIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAjCiAjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0xMiw2ICsxMSwxMSBAQAogIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIworIyBSdWxlcyBmb3IgYnVpbGRpbmcgQVBJIGRpZmZzLgogIwogCi1pbmNsdWRlIGJ1aWxkL3RhcmdldC9ib2FyZC9nZW5lcmljL2RldmljZS5taworLlBIT05ZOiBhcGktZGlmZgorCithcGktZGlmZjogb2ZmbGluZS1zZGstcmVmZXJlbmNlb25seS1kaWZmCmRpZmYgLS1naXQgYS9jb3JlL3Rhc2tzL2Jvb3RfamFyc19wYWNrYWdlX2NoZWNrLm1rIGIvY29yZS90YXNrcy9ib290X2phcnNfcGFja2FnZV9jaGVjay5tawppbmRleCAxODhjMjY3Li5kYzc5ZTIzIDEwMDY0NAotLS0gYS9jb3JlL3Rhc2tzL2Jvb3RfamFyc19wYWNrYWdlX2NoZWNrLm1rCisrKyBiL2NvcmUvdGFza3MvYm9vdF9qYXJzX3BhY2thZ2VfY2hlY2subWsKQEAgLTI0LDggKzI0LDggQEAKIHN0YW1wIDo9ICQoaW50ZXJtZWRpYXRlcykvc3RhbXAKIGJ1aWx0X2Jvb3RfamFycyA6PSAkKGZvcmVhY2ggaiwgJChQUk9EVUNUX0JPT1RfSkFSUyksIFwKICAgJChjYWxsIGludGVybWVkaWF0ZXMtZGlyLWZvciwgSkFWQV9MSUJSQVJJRVMsICQoaiksLENPTU1PTikvY2xhc3Nlcy5qYXIpCi1zY3JpcHQgOj0gYnVpbGQvY29yZS90YXNrcy9jaGVja19ib290X2phcnMvY2hlY2tfYm9vdF9qYXJzLnB5Ci13aGl0ZWxpc3RfZmlsZSA6PSBidWlsZC9jb3JlL3Rhc2tzL2NoZWNrX2Jvb3RfamFycy9wYWNrYWdlX3doaXRlbGlzdC50eHQKK3NjcmlwdCA6PSBidWlsZC9tYWtlL2NvcmUvdGFza3MvY2hlY2tfYm9vdF9qYXJzL2NoZWNrX2Jvb3RfamFycy5weQord2hpdGVsaXN0X2ZpbGUgOj0gYnVpbGQvbWFrZS9jb3JlL3Rhc2tzL2NoZWNrX2Jvb3RfamFycy9wYWNrYWdlX3doaXRlbGlzdC50eHQKIAogJChzdGFtcCk6IFBSSVZBVEVfQk9PVF9KQVJTIDo9ICQoYnVpbHRfYm9vdF9qYXJzKQogJChzdGFtcCk6IFBSSVZBVEVfU0NSSVBUIDo9ICQoc2NyaXB0KQpkaWZmIC0tZ2l0IGEvY29yZS90YXNrcy9jaGVja19ib290X2phcnMvcGFja2FnZV93aGl0ZWxpc3QudHh0IGIvY29yZS90YXNrcy9jaGVja19ib290X2phcnMvcGFja2FnZV93aGl0ZWxpc3QudHh0CmluZGV4IDE1Yjk5OTAuLmIwYmVjYmEgMTAwNjQ0Ci0tLSBhL2NvcmUvdGFza3MvY2hlY2tfYm9vdF9qYXJzL3BhY2thZ2Vfd2hpdGVsaXN0LnR4dAorKysgYi9jb3JlL3Rhc2tzL2NoZWNrX2Jvb3RfamFycy9wYWNrYWdlX3doaXRlbGlzdC50eHQKQEAgLTEyMSw3ICsxMjEsNyBAQAogCiAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBsZWdhY3ktdGVzdC5qYXIKKyMgYW5kcm9pZC50ZXN0LmJhc2UuamFyCiBqdW5pdFwuZXh0ZW5zaW9ucwoganVuaXRcLmZyYW1ld29yawogYW5kcm9pZFwudGVzdApAQCAtMjM3LDMgKzIzNyw3IEBACiAjIFBhY2thZ2VzIGluIHRoZSBnb29nbGUgbmFtZXNwYWNlIGFjcm9zcyBhbGwgYm9vdGNsYXNzcGF0aCBqYXJzLgogY29tXC5nb29nbGVcLmFuZHJvaWRcLi4qCiBjb21cLmdvb2dsZVwudnJcLnBsYXRmb3JtLioKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIFBhY2thZ2VzIHVzZWQgZm9yIEFuZHJvaWQgaW4gQ2hyb21lIE9TCitvcmdcLmNocm9taXVtXC5hcmMKZGlmZiAtLWdpdCBhL2NvcmUvdGFza3MvY2hlY2tfZW11X2Jvb3QubWsgYi9jb3JlL3Rhc2tzL2NoZWNrX2VtdV9ib290Lm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4NzA2NzcKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Rhc2tzL2NoZWNrX2VtdV9ib290Lm1rCkBAIC0wLDAgKzEsMjMgQEAKK2NoZWNrX2VtdV9ib290MCA6PSAkKERJU1RfRElSKS8kKFRBUkdFVF9QUk9EVUNUKS0kKFRBUkdFVF9CVUlMRF9WQVJJQU5UKS1lbXVsYXRvci1ib290LXRlc3QtcmVzdWx0LnR4dAorJChjaGVja19lbXVfYm9vdDApIDogUFJJVkFURV9QUkVGSVggOj0gJChUQVJHRVRfUFJPRFVDVCktJChUQVJHRVRfQlVJTERfVkFSSUFOVCkKKyQoY2hlY2tfZW11X2Jvb3QwKSA6IFBSSVZBVEVfRU1VTEFUT1JfQk9PVF9URVNUX1NIIDo9IGRldmljZS9nZW5lcmljL2dvbGRmaXNoL3Rvb2xzL2VtdWxhdG9yX2Jvb3RfdGVzdC5zaAorJChjaGVja19lbXVfYm9vdDApIDogUFJJVkFURV9CT09UX0NPTVBMRVRFX1NUUklORyA6PSAiZW11bGF0b3I6IElORk86IGJvb3QgY29tcGxldGVkIgorJChjaGVja19lbXVfYm9vdDApIDogUFJJVkFURV9CT09UX0ZBSUxfU1RSSU5HIDo9ICJlbXVsYXRvcjogRVJST1I6IGZhaWwgdG8gYm9vdCBhZnRlciIKKyQoY2hlY2tfZW11X2Jvb3QwKSA6IFBSSVZBVEVfU1VDQ0VTU19GSUxFIDo9ICQoRElTVF9ESVIpLyQoUFJJVkFURV9QUkVGSVgpLUJPT1QtU1VDQ0VTUy50eHQKKyQoY2hlY2tfZW11X2Jvb3QwKSA6IFBSSVZBVEVfRkFJTF9GSUxFIDo9ICQoRElTVF9ESVIpLyQoUFJJVkFURV9QUkVGSVgpLUJPT1QtRkFJTC50eHQKKyQoY2hlY2tfZW11X2Jvb3QwKSA6ICQoSU5TVEFMTEVEX1FFTVVfU1lTVEVNSU1BR0UpICAkKElOU1RBTExFRF9RRU1VX1ZFTkRPUklNQUdFKSBcCisgICAgICAgICAgICAgICAgICQoaWYgJChCT0FSRF9VU0VSREFUQUlNQUdFX1BBUlRJVElPTl9TSVpFKSwkKFBST0RVQ1RfT1VUKS91c2VyZGF0YS5pbWcpIFwKKyAgICAgICAgICAgICAgICAgJChQUk9EVUNUX09VVCkvcmFtZGlzay5pbWcgZGV2aWNlL2dlbmVyaWMvZ29sZGZpc2gvdG9vbHMvZW11bGF0b3JfYm9vdF90ZXN0LnNoCisJQG1rZGlyIC1wICQoZGlyICQoY2hlY2tfZW11X2Jvb3QwKSkKKwkkKGhpZGUpIHJtIC1mICQoY2hlY2tfZW11X2Jvb3QwKQorCSQoaGlkZSkgcm0gLWYgJChQUklWQVRFX1NVQ0NFU1NfRklMRSkKKwkkKGhpZGUpIHJtIC1mICQoUFJJVkFURV9GQUlMX0ZJTEUpCisJKGV4cG9ydCBBTkRST0lEX1BST0RVQ1RfT1VUPSQkKGNkICQoUFJPRFVDVF9PVVQpO3B3ZCk7XAorCQlleHBvcnQgQU5EUk9JRF9CVUlMRF9UT1A9JCQocHdkKTtcCisJCSQoUFJJVkFURV9FTVVMQVRPUl9CT09UX1RFU1RfU0gpID4gJChjaGVja19lbXVfYm9vdDApKQorCShpZiBncmVwIC1xICQoUFJJVkFURV9CT09UX0NPTVBMRVRFX1NUUklORykgJChjaGVja19lbXVfYm9vdDApO1wKKwl0aGVuIGVjaG8gYm9vdF9zdWNjZWVkZWQgPiAkKFBSSVZBVEVfU1VDQ0VTU19GSUxFKTsgZmkpCisJKGlmIGdyZXAgLXEgJChQUklWQVRFX0JPT1RfRkFJTF9TVFJJTkcpICQoY2hlY2tfZW11X2Jvb3QwKTtcCisJdGhlbiBlY2hvIGJvb3RfZmFpbGVkID4gJChQUklWQVRFX0ZBSUxfRklMRSk7IGZpKQorLlBIT05ZOiBjaGVja19lbXVfYm9vdAorY2hlY2tfZW11X2Jvb3Q6ICQoY2hlY2tfZW11X2Jvb3QwKQpkaWZmIC0tZ2l0IGEvY29yZS90YXNrcy9jb2xsZWN0X2dwbF9zb3VyY2VzLm1rIGIvY29yZS90YXNrcy9jb2xsZWN0X2dwbF9zb3VyY2VzLm1rCmluZGV4IDMwYmE2MmIuLjcwZjBhZmUgMTAwNjQ0Ci0tLSBhL2NvcmUvdGFza3MvY29sbGVjdF9ncGxfc291cmNlcy5taworKysgYi9jb3JlL3Rhc2tzL2NvbGxlY3RfZ3BsX3NvdXJjZXMubWsKQEAgLTEyLDIwICsxMiwyMiBAQAogIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCi1ncGxfc291cmNlX3RneiA6PSAkKGNhbGwgaW50ZXJtZWRpYXRlcy1kaXItZm9yLFBBQ0tBR0lORyxncGxfc291cmNlLEhPU1QsQ09NTU9OKS9ncGxfc291cmNlLnRnegoraWZkZWYgZGlzdF9nb2FsCisKKyMgVGhlIHJ1bGUgYmVsb3cgZG9lc24ndCBoYXZlIGRlcGVuZGVuaWNlcyBvbiB0aGUgZmlsZXMgdGhhdCBpdCBjb3BpZXMsCisjIHNvIG1hbnVhbGx5IGdlbmVyYXRlIGRpcmVjdGx5IGludG8gdGhlIERJU1RfRElSIGRpcmVjdG9yeSB0aGF0IGlzIGFsd2F5cworIyB3aXBlZCBiZXR3ZWVuIGRpc3QgYnVpbGRzLgorZ3BsX3NvdXJjZV90Z3ogOj0gJChESVNUX0RJUikvZ3BsX3NvdXJjZS50Z3oKIAogIyBGT1JDRSBzaW5jZSB3ZSBjYW4ndCBrbm93IHdoZXRoZXIgYW55IG9mIHRoZSBzb3VyY2VzIGNoYW5nZWQKICQoZ3BsX3NvdXJjZV90Z3opOiBQUklWQVRFX1BBVEhTIDo9ICQoc29ydCAkKHBhdHN1YnN0ICUvLCAlLCAkKGRpciAkKEFMTF9HUExfTU9EVUxFX0xJQ0VOU0VfRklMRVMpKSkpCi0kKGdwbF9zb3VyY2VfdGd6KSA6ICQoQUxMX0dQTF9NT0RVTEVfTElDRU5TRV9GSUxFUykgRk9SQ0UKKyQoZ3BsX3NvdXJjZV90Z3opIDogJChBTExfR1BMX01PRFVMRV9MSUNFTlNFX0ZJTEVTKQogCUBlY2hvIFBhY2thZ2UgZ3BsIHNvdXJjZXM6ICRACi0JQHJtIC1yZiAkKGRpciAkQCkgJiYgbWtkaXIgLXAgJChkaXIgJEApCiAJJChoaWRlKSB0YXIgY2Z6ICRAIC0tZXhjbHVkZSAiLmdpdCoiICQoUFJJVkFURV9QQVRIUykKIAotCi0uUEhPTlk6IGdwbF9zb3VyY2VfdGd6Ci1ncGxfc291cmNlX3RneiA6ICQoZ3BsX3NvdXJjZV90Z3opCi0KICMgRGlzdCB0aGUgdGd6IG9ubHkgaWYgd2UgYXJlIGRvaW5nIGEgZnVsbCBidWlsZAogaWZlcSAoLCQoVEFSR0VUX0JVSUxEX0FQUFMpKQotJChjYWxsIGRpc3QtZm9yLWdvYWxzLCBkcm9pZGNvcmUsICQoZ3BsX3NvdXJjZV90Z3opKQorZHJvaWRjb3JlOiAkKGdwbF9zb3VyY2VfdGd6KQogZW5kaWYKKworZW5kaWYgIyBkaXN0X2dvYWwKZGlmZiAtLWdpdCBhL2NvcmUvdGFza3MvY3RzLm1rIGIvY29yZS90YXNrcy9jdHMubWsKaW5kZXggZmRkOTU5MS4uMzNjM2E4MyAxMDA2NDQKLS0tIGEvY29yZS90YXNrcy9jdHMubWsKKysrIGIvY29yZS90YXNrcy9jdHMubWsKQEAgLTE0LDggKzE0LDkgQEAKIAogdGVzdF9zdWl0ZV9uYW1lIDo9IGN0cwogdGVzdF9zdWl0ZV90cmFkZWZlZCA6PSBjdHMtdHJhZGVmZWQKLXRlc3Rfc3VpdGVfZHluYW1pY19jb25maWcgOj0gY3RzL3Rvb2xzL2N0cy10cmFkZWZlZC9EeW5hbWljQ29uZmlnLnhtbAotdGVzdF9zdWl0ZV9yZWFkbWUgOj0gY3RzL3Rvb2xzL2N0cy10cmFkZWZlZC9SRUFETUUKKyMgVE9ETzogRml4IHRoZSBmb2xsb3dpbmcgdHdvIGxpbmVzIGFmdGVyIGhhcm5lc3MgaXMgbW92ZWQgdG8gaXRzIG93biByZXBvCit0ZXN0X3N1aXRlX2R5bmFtaWNfY29uZmlnIDo9IHRlc3Qvc3VpdGVfaGFybmVzcy90b29scy9jdHMtdHJhZGVmZWQvRHluYW1pY0NvbmZpZy54bWwKK3Rlc3Rfc3VpdGVfcmVhZG1lIDo9IHRlc3Qvc3VpdGVfaGFybmVzcy90b29scy9jdHMtdHJhZGVmZWQvUkVBRE1FCiAKIGluY2x1ZGUgJChCVUlMRF9TWVNURU0pL3Rhc2tzL3Rvb2xzL2NvbXBhdGliaWxpdHkubWsKIApkaWZmIC0tZ2l0IGEvY29yZS90YXNrcy9jdHNfaW5zdGFudC5tayBiL2NvcmUvdGFza3MvY3RzX2luc3RhbnQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThmMWRiMwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvdGFza3MvY3RzX2luc3RhbnQubWsKQEAgLTAsMCArMSwyNSBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKwordGVzdF9zdWl0ZV9uYW1lIDo9IGN0c19pbnN0YW50Cit0ZXN0X3N1aXRlX3RyYWRlZmVkIDo9IGN0cy1pbnN0YW50LXRyYWRlZmVkCit0ZXN0X3N1aXRlX2R5bmFtaWNfY29uZmlnIDo9IHRlc3Qvc3VpdGVfaGFybmVzcy90b29scy9jdHMtaW5zdGFudC10cmFkZWZlZC9EeW5hbWljQ29uZmlnLnhtbAordGVzdF9zdWl0ZV9yZWFkbWUgOj0gdGVzdC9zdWl0ZV9oYXJuZXNzL3Rvb2xzL2N0cy1pbnN0YW50LXRyYWRlZmVkL1JFQURNRQorCitpbmNsdWRlICQoQlVJTERfU1lTVEVNKS90YXNrcy90b29scy9jb21wYXRpYmlsaXR5Lm1rCisKKy5QSE9OWTogY3RzX2luc3RhbnQKK2N0c19pbnN0YW50OiAkKGNvbXBhdGliaWxpdHlfemlwKQorJChjYWxsIGRpc3QtZm9yLWdvYWxzLCBjdHNfaW5zdGFudCwgJChjb21wYXRpYmlsaXR5X3ppcCkpCisKZGlmZiAtLWdpdCBhL2NvcmUvdGFza3MvZGV2aWNlLXRlc3RzLm1rIGIvY29yZS90YXNrcy9kZXZpY2UtdGVzdHMubWsKaW5kZXggYjFiOTM2YS4uYTJiNjI2ZSAxMDA2NDQKLS0tIGEvY29yZS90YXNrcy9kZXZpY2UtdGVzdHMubWsKKysrIGIvY29yZS90YXNrcy9kZXZpY2UtdGVzdHMubWsKQEAgLTYsNyArNiw3IEBACiAjCiAjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAjCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JscyBlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZApAQCAtMTYsMTQgKzE2LDIzIEBACiAuUEhPTlk6IGRldmljZS10ZXN0cwogCiBkZXZpY2UtdGVzdHMtemlwIDo9ICQoUFJPRFVDVF9PVVQpL2RldmljZS10ZXN0cy56aXAKLSQoZGV2aWNlLXRlc3RzLXppcCk6ICQoQ09NUEFUSUJJTElUWS5kZXZpY2UtdGVzdHMuRklMRVMpICQoU09PTkdfWklQKQotCWVjaG8gJChzb3J0ICQoQ09NUEFUSUJJTElUWS5kZXZpY2UtdGVzdHMuRklMRVMpKSA+ICRALmxpc3QKLQlzZWQgLWkgLWUgJ3MvXHNcKy9cbi9nJyAkQC5saXN0CisjIENyZWF0ZSBhbiBhcnRpZmFjdCB0byBpbmNsdWRlIGEgbGlzdCBvZiB0ZXN0IGNvbmZpZyBmaWxlcyBpbiBkZXZpY2UtdGVzdHMuCitkZXZpY2UtdGVzdHMtbGlzdC16aXAgOj0gJChQUk9EVUNUX09VVCkvZGV2aWNlLXRlc3RzX2xpc3QuemlwCiskKGRldmljZS10ZXN0cy16aXApIDogLktBVElfSU1QTElDSVRfT1VUUFVUUyA6PSAkKGRldmljZS10ZXN0cy1saXN0LXppcCkKKyQoZGV2aWNlLXRlc3RzLXppcCkgOiBQUklWQVRFX2RldmljZV90ZXN0c19saXN0IDo9ICQoUFJPRFVDVF9PVVQpL2RldmljZS10ZXN0c19saXN0CisKKyQoZGV2aWNlLXRlc3RzLXppcCkgOiAkKENPTVBBVElCSUxJVFkuZGV2aWNlLXRlc3RzLkZJTEVTKSAkKFNPT05HX1pJUCkKKwllY2hvICQoc29ydCAkKENPTVBBVElCSUxJVFkuZGV2aWNlLXRlc3RzLkZJTEVTKSkgfCB0ciAiICIgIlxuIiA+ICRALmxpc3QKIAlncmVwICQoSE9TVF9PVVRfVEVTVENBU0VTKSAkQC5saXN0ID4gJEAtaG9zdC5saXN0IHx8IHRydWUKIAlncmVwICQoVEFSR0VUX09VVF9URVNUQ0FTRVMpICRALmxpc3QgPiAkQC10YXJnZXQubGlzdCB8fCB0cnVlCiAJJChoaWRlKSAkKFNPT05HX1pJUCkgLWQgLW8gJEAgLVAgaG9zdCAtQyAkKEhPU1RfT1VUKSAtbCAkQC1ob3N0Lmxpc3QgLVAgdGFyZ2V0IC1DICQoUFJPRFVDVF9PVVQpIC1sICRALXRhcmdldC5saXN0CisJcm0gLWYgJChQUklWQVRFX2RldmljZV90ZXN0c19saXN0KQorCSQoaGlkZSkgZ3JlcCAtZSAuKi5jb25maWckJCAkQC1ob3N0Lmxpc3QgfCBzZWQgcyUkKEhPU1RfT1VUKSVob3N0JWcgPiAkKFBSSVZBVEVfZGV2aWNlX3Rlc3RzX2xpc3QpCisJJChoaWRlKSBncmVwIC1lIC4qLmNvbmZpZyQkICRALXRhcmdldC5saXN0IHwgc2VkIHMlJChQUk9EVUNUX09VVCkldGFyZ2V0JWcgPj4gJChQUklWQVRFX2RldmljZV90ZXN0c19saXN0KQorCSQoaGlkZSkgJChTT09OR19aSVApIC1kIC1vICQoZGV2aWNlLXRlc3RzLWxpc3QtemlwKSAtQyAkKGRpciAkQCkgLWYgJChQUklWQVRFX2RldmljZV90ZXN0c19saXN0KQorCXJtIC1mICRALmxpc3QgJEAtaG9zdC5saXN0ICRALXRhcmdldC5saXN0ICQoUFJJVkFURV9kZXZpY2VfdGVzdHNfbGlzdCkKIAogZGV2aWNlLXRlc3RzOiAkKGRldmljZS10ZXN0cy16aXApCi0kKGNhbGwgZGlzdC1mb3ItZ29hbHMsIGRldmljZS10ZXN0cywgJChkZXZpY2UtdGVzdHMtemlwKSkKKyQoY2FsbCBkaXN0LWZvci1nb2FscywgZGV2aWNlLXRlc3RzLCAkKGRldmljZS10ZXN0cy16aXApICQoZGV2aWNlLXRlc3RzLWxpc3QtemlwKSkKIAogdGVzdHM6IGRldmljZS10ZXN0cwpkaWZmIC0tZ2l0IGEvY29yZS90YXNrcy9nZW5lcmFsLXRlc3RzLm1rIGIvY29yZS90YXNrcy9nZW5lcmFsLXRlc3RzLm1rCmluZGV4IDc2M2RkNTEuLmM3ZjFkYzkgMTAwNjQ0Ci0tLSBhL2NvcmUvdGFza3MvZ2VuZXJhbC10ZXN0cy5taworKysgYi9jb3JlL3Rhc2tzL2dlbmVyYWwtdGVzdHMubWsKQEAgLTYsNyArNiw3IEBACiAjCiAjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAjCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JscyBlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZApAQCAtMTUsMTIgKzE1LDIxIEBACiAuUEhPTlk6IGdlbmVyYWwtdGVzdHMKIAogZ2VuZXJhbC10ZXN0cy16aXAgOj0gJChQUk9EVUNUX09VVCkvZ2VuZXJhbC10ZXN0cy56aXAKLSQoZ2VuZXJhbC10ZXN0cy16aXApOiAkKENPTVBBVElCSUxJVFkuZ2VuZXJhbC10ZXN0cy5GSUxFUykgJChTT09OR19aSVApCi0JZWNobyAkKHNvcnQgJChDT01QQVRJQklMSVRZLmdlbmVyYWwtdGVzdHMuRklMRVMpKSA+ICRALmxpc3QKLQlzZWQgLWkgLWUgJ3MvXHNcKy9cbi9nJyAkQC5saXN0CisjIENyZWF0ZSBhbiBhcnRpZmFjdCB0byBpbmNsdWRlIGEgbGlzdCBvZiB0ZXN0IGNvbmZpZyBmaWxlcyBpbiBnZW5lcmFsLXRlc3RzLgorZ2VuZXJhbC10ZXN0cy1saXN0LXppcCA6PSAkKFBST0RVQ1RfT1VUKS9nZW5lcmFsLXRlc3RzX2xpc3QuemlwCiskKGdlbmVyYWwtdGVzdHMtemlwKSA6IC5LQVRJX0lNUExJQ0lUX09VVFBVVFMgOj0gJChnZW5lcmFsLXRlc3RzLWxpc3QtemlwKQorJChnZW5lcmFsLXRlc3RzLXppcCkgOiBQUklWQVRFX2dlbmVyYWxfdGVzdHNfbGlzdCA6PSAkKFBST0RVQ1RfT1VUKS9nZW5lcmFsLXRlc3RzX2xpc3QKKworJChnZW5lcmFsLXRlc3RzLXppcCkgOiAkKENPTVBBVElCSUxJVFkuZ2VuZXJhbC10ZXN0cy5GSUxFUykgJChTT09OR19aSVApCisJZWNobyAkKHNvcnQgJChDT01QQVRJQklMSVRZLmdlbmVyYWwtdGVzdHMuRklMRVMpKSB8IHRyICIgIiAiXG4iID4gJEAubGlzdAogCWdyZXAgJChIT1NUX09VVF9URVNUQ0FTRVMpICRALmxpc3QgPiAkQC1ob3N0Lmxpc3QgfHwgdHJ1ZQogCWdyZXAgJChUQVJHRVRfT1VUX1RFU1RDQVNFUykgJEAubGlzdCA+ICRALXRhcmdldC5saXN0IHx8IHRydWUKIAkkKGhpZGUpICQoU09PTkdfWklQKSAtZCAtbyAkQCAtUCBob3N0IC1DICQoSE9TVF9PVVQpIC1sICRALWhvc3QubGlzdCAtUCB0YXJnZXQgLUMgJChQUk9EVUNUX09VVCkgLWwgJEAtdGFyZ2V0Lmxpc3QKKwlybSAtZiAkKFBSSVZBVEVfZ2VuZXJhbF90ZXN0c19saXN0KQorCSQoaGlkZSkgZ3JlcCAtZSAuKi5jb25maWckJCAkQC1ob3N0Lmxpc3QgfCBzZWQgcyUkKEhPU1RfT1VUKSVob3N0JWcgPiAkKFBSSVZBVEVfZ2VuZXJhbF90ZXN0c19saXN0KQorCSQoaGlkZSkgZ3JlcCAtZSAuKi5jb25maWckJCAkQC10YXJnZXQubGlzdCB8IHNlZCBzJSQoUFJPRFVDVF9PVVQpJXRhcmdldCVnID4+ICQoUFJJVkFURV9nZW5lcmFsX3Rlc3RzX2xpc3QpCisJJChoaWRlKSAkKFNPT05HX1pJUCkgLWQgLW8gJChnZW5lcmFsLXRlc3RzLWxpc3QtemlwKSAtQyAkKGRpciAkQCkgLWYgJChQUklWQVRFX2dlbmVyYWxfdGVzdHNfbGlzdCkKKwlybSAtZiAkQC5saXN0ICRALWhvc3QubGlzdCAkQC10YXJnZXQubGlzdCAkKFBSSVZBVEVfZ2VuZXJhbF90ZXN0c19saXN0KQogCiBnZW5lcmFsLXRlc3RzOiAkKGdlbmVyYWwtdGVzdHMtemlwKQotJChjYWxsIGRpc3QtZm9yLWdvYWxzLCBnZW5lcmFsLXRlc3RzLCAkKGdlbmVyYWwtdGVzdHMtemlwKSkKKyQoY2FsbCBkaXN0LWZvci1nb2FscywgZ2VuZXJhbC10ZXN0cywgJChnZW5lcmFsLXRlc3RzLXppcCkgJChnZW5lcmFsLXRlc3RzLWxpc3QtemlwKSkKZGlmZiAtLWdpdCBhL2NvcmUvdGFza3MvbW9kdWxlLWluZm8ubWsgYi9jb3JlL3Rhc2tzL21vZHVsZS1pbmZvLm1rCmluZGV4IGU5YjJhYzcuLmI0NTUyNmYgMTAwNjQ0Ci0tLSBhL2NvcmUvdGFza3MvbW9kdWxlLWluZm8ubWsKKysrIGIvY29yZS90YXNrcy9tb2R1bGUtaW5mby5tawpAQCAtMTEsNiArMTEsOCBAQAogCQkJJyJwYXRoIjogWyQoZm9yZWFjaCB3LCQoc29ydCAkKEFMTF9NT0RVTEVTLiQobSkuUEFUSCkpLCIkKHcpIiwgKV0sICcgXAogCQkJJyJ0YWdzIjogWyQoZm9yZWFjaCB3LCQoc29ydCAkKEFMTF9NT0RVTEVTLiQobSkuVEFHUykpLCIkKHcpIiwgKV0sICcgXAogCQkJJyJpbnN0YWxsZWQiOiBbJChmb3JlYWNoIHcsJChzb3J0ICQoQUxMX01PRFVMRVMuJChtKS5JTlNUQUxMRUQpKSwiJCh3KSIsICldLCAnIFwKKwkJCSciY29tcGF0aWJpbGl0eV9zdWl0ZXMiOiBbJChmb3JlYWNoIHcsJChzb3J0ICQoQUxMX01PRFVMRVMuJChtKS5DT01QQVRJQklMSVRZX1NVSVRFUykpLCIkKHcpIiwgKV0sICcgXAorCQkJJyJhdXRvX3Rlc3RfY29uZmlnIjogWyQoQUxMX01PRFVMRVMuJChtKS5hdXRvX3Rlc3RfY29uZmlnKV0sICcgXAogCQkJJ30sXG4nIFwKIAkgKSB8IHNlZCAtZSAncy8sICpcXS9dL2cnIC1lICdzLywgKlx9LyB9L2cnIC1lICckJHMvLCQkLy8nID4+ICRACiAJJChoaWRlKSBlY2hvICd9JyA+PiAkQApkaWZmIC0tZ2l0IGEvY29yZS90YXNrcy9vZW1faW1hZ2UubWsgYi9jb3JlL3Rhc2tzL29lbV9pbWFnZS5tawppbmRleCAzMmQ1NmE3Li42NmVlYzIyIDEwMDY0NAotLS0gYS9jb3JlL3Rhc2tzL29lbV9pbWFnZS5taworKysgYi9jb3JlL3Rhc2tzL29lbV9pbWFnZS5tawpAQCAtMzUsNyArMzUsNyBAQAogCUBta2RpciAtcCAkKG9lbWltYWdlX2ludGVybWVkaWF0ZXMpICYmIHJtIC1yZiAkKG9lbWltYWdlX2ludGVybWVkaWF0ZXMpL29lbV9pbWFnZV9pbmZvLnR4dAogCSQoY2FsbCBnZW5lcmF0ZS11c2VyaW1hZ2UtcHJvcC1kaWN0aW9uYXJ5LCAkKG9lbWltYWdlX2ludGVybWVkaWF0ZXMpL29lbV9pbWFnZV9pbmZvLnR4dCwgc2tpcF9mc2NrPXRydWUpCiAJJChoaWRlKSBQQVRIPSQoZm9yZWFjaCBwLCQoSU5URVJOQUxfVVNFUklNQUdFU19CSU5BUllfUEFUSFMpLCQocCk6KSQkUEFUSCBcCi0JICAuL2J1aWxkL3Rvb2xzL3JlbGVhc2V0b29scy9idWlsZF9pbWFnZS5weSBcCisJICBidWlsZC9tYWtlL3Rvb2xzL3JlbGVhc2V0b29scy9idWlsZF9pbWFnZS5weSBcCiAJICAkKFRBUkdFVF9PVVRfT0VNKSAkKG9lbWltYWdlX2ludGVybWVkaWF0ZXMpL29lbV9pbWFnZV9pbmZvLnR4dCAkQCAkKFRBUkdFVF9PVVQpCiAJJChoaWRlKSAkKGNhbGwgYXNzZXJ0LW1heC1pbWFnZS1zaXplLCRALCQoQk9BUkRfT0VNSU1BR0VfUEFSVElUSU9OX1NJWkUpKQogCmRpZmYgLS1naXQgYS9jb3JlL3Rhc2tzL3Nkay1hZGRvbi5tayBiL2NvcmUvdGFza3Mvc2RrLWFkZG9uLm1rCmluZGV4IGUyNjc3M2MuLmJjMTFiNDkgMTAwNjQ0Ci0tLSBhL2NvcmUvdGFza3Mvc2RrLWFkZG9uLm1rCisrKyBiL2NvcmUvdGFza3Mvc2RrLWFkZG9uLm1rCkBAIC02NSw5ICs2NSw5IEBACiBmaWxlc190b19jb3B5ICs9IFwKIAkkKGFkZG9uX2Rpcl9pbWcpOiQoSU5TVEFMTEVEX1FFTVVfU1lTVEVNSU1BR0UpOmltYWdlcy8kKFRBUkdFVF9DUFVfQUJJKS9zeXN0ZW0uaW1nIFwKIAkkKGFkZG9uX2Rpcl9pbWcpOiQoSU5TVEFMTEVEX1FFTVVfVkVORE9SSU1BR0UpOmltYWdlcy8kKFRBUkdFVF9DUFVfQUJJKS92ZW5kb3IuaW1nIFwKLQkkKGFkZG9uX2Rpcl9pbWcpOiQoQlVJTFRfVVNFUkRBVEFJTUFHRV9UQVJHRVQpOmltYWdlcy8kKFRBUkdFVF9DUFVfQUJJKS91c2VyZGF0YS5pbWcgXAogCSQoYWRkb25fZGlyX2ltZyk6JChCVUlMVF9SQU1ESVNLX1RBUkdFVCk6aW1hZ2VzLyQoVEFSR0VUX0NQVV9BQkkpL3JhbWRpc2suaW1nIFwKIAkkKGFkZG9uX2Rpcl9pbWcpOiQoUFJPRFVDVF9PVVQpL3N5c3RlbS9idWlsZC5wcm9wOmltYWdlcy8kKFRBUkdFVF9DUFVfQUJJKS9idWlsZC5wcm9wIFwKKwkkKGFkZG9uX2Rpcl9pbWcpOmRldmljZS9nZW5lcmljL2dvbGRmaXNoL2RhdGEvZXRjL3VzZXJkYXRhLmltZzppbWFnZXMvJChUQVJHRVRfQ1BVX0FCSSkvdXNlcmRhdGEuaW1nIFwKIAkkKGFkZG9uX2Rpcl9pbWcpOiQodGFyZ2V0X25vdGljZV9maWxlX3R4dCk6aW1hZ2VzLyQoVEFSR0VUX0NQVV9BQkkpL05PVElDRS50eHQgXAogCSQoYWRkb25fZGlyX2ltZyk6JChQUk9EVUNUUy4kKElOVEVSTkFMX1BST0RVQ1QpLlBST0RVQ1RfU0RLX0FERE9OX1NZU19JTUdfU09VUkNFX1BST1ApOmltYWdlcy9zb3VyY2UucHJvcGVydGllcwogCkBAIC0xMDUsMjEgKzEwNSwyMSBAQAogCiAkKGZ1bGxfdGFyZ2V0KTogUFJJVkFURV9TVEFHSU5HX0RJUiA6PSAkKGNhbGwgYXBwZW5kLXBhdGgsJChzdGFnaW5nKSwkKGFkZG9uX2Rpcl9sZWFmKSkKIAotJChmdWxsX3RhcmdldCk6ICQoc2RrX2FkZG9uX2RlcHMpIHwgJChBQ1ApCiskKGZ1bGxfdGFyZ2V0KTogJChzZGtfYWRkb25fZGVwcykgfCAkKEFDUCkgJChTT09OR19aSVApCiAJQGVjaG8gUGFja2FnaW5nIFNESyBBZGRvbjogJEAKIAkkKGhpZGUpIG1rZGlyIC1wICQoUFJJVkFURV9TVEFHSU5HX0RJUikvZG9jcwogCSQoaGlkZSkgZm9yIGQgaW4gJChQUklWQVRFX0RPQ1NfRElSUyk7IGRvIFwKIAkgICAgJChBQ1ApIC1yICQkZCAkKFBSSVZBVEVfU1RBR0lOR19ESVIpL2RvY3MgO1wKIAkgIGRvbmUKIAkkKGhpZGUpIG1rZGlyIC1wICQoZGlyICRAKQotCSQoaGlkZSkgKCBGPSQkKHB3ZCkvJEAgOyBjZCAkKFBSSVZBVEVfU1RBR0lOR19ESVIpLy4uICYmIHppcCAtcnFYICQkRiAkKG5vdGRpciAkKFBSSVZBVEVfU1RBR0lOR19ESVIpKSApCisJJChoaWRlKSAkKFNPT05HX1pJUCkgLW8gJEAgLUMgJChkaXIgJChQUklWQVRFX1NUQUdJTkdfRElSKSkgLUQgJChQUklWQVRFX1NUQUdJTkdfRElSKQogCiAkKGZ1bGxfdGFyZ2V0X2ltZyk6IFBSSVZBVEVfU1RBR0lOR19ESVIgOj0gJChjYWxsIGFwcGVuZC1wYXRoLCQoc3RhZ2luZyksJChhZGRvbl9kaXJfaW1nKSkvaW1hZ2VzLyQoVEFSR0VUX0NQVV9BQkkpCi0kKGZ1bGxfdGFyZ2V0X2ltZyk6ICQoZnVsbF90YXJnZXQpICQoYWRkb25faW1nX3NvdXJjZV9wcm9wKSB8ICQoQUNQKQorJChmdWxsX3RhcmdldF9pbWcpOiAkKGZ1bGxfdGFyZ2V0KSAkKGFkZG9uX2ltZ19zb3VyY2VfcHJvcCkgfCAkKEFDUCkgJChTT09OR19aSVApCiAJQGVjaG8gUGFja2FnaW5nIFNESyBBZGRvbiBTeXN0ZW0tSW1hZ2U6ICRACiAJJChoaWRlKSBta2RpciAtcCAkKGRpciAkQCkKIAkkKEFDUCkgLXIgJChQUk9EVUNUX09VVCkvZGF0YSAkKFBSSVZBVEVfU1RBR0lOR19ESVIpL2RhdGEKLQkkKGhpZGUpICggRj0kJChwd2QpLyRAIDsgY2QgJChQUklWQVRFX1NUQUdJTkdfRElSKS8uLiAmJiB6aXAgLXJxWCAkJEYgJChub3RkaXIgJChQUklWQVRFX1NUQUdJTkdfRElSKSkgKQorCSQoaGlkZSkgJChTT09OR19aSVApIC1vICRAIC1DICQoZGlyICQoUFJJVkFURV9TVEFHSU5HX0RJUikpIC1EICQoUFJJVkFURV9TVEFHSU5HX0RJUikKIAogCiAuUEhPTlk6IHNka19hZGRvbgpkaWZmIC0tZ2l0IGEvY29yZS90YXNrcy90ZXN0X21hcHBpbmcubWsgYi9jb3JlL3Rhc2tzL3Rlc3RfbWFwcGluZy5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjI3NWIwCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS90YXNrcy90ZXN0X21hcHBpbmcubWsKQEAgLTAsMCArMSwzNCBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIyBDcmVhdGUgYW4gYXJ0aWZhY3QgdG8gaW5jbHVkZSBURVNUX01BUFBJTkcgZmlsZXMgaW4gc291cmNlIHRyZWUuCisKKy5QSE9OWTogdGVzdF9tYXBwaW5nCisKK2ludGVybWVkaWF0ZXMgOj0gJChjYWxsIGludGVybWVkaWF0ZXMtZGlyLWZvcixQQUNLQUdJTkcsdGVzdF9tYXBwaW5nKQordGVzdF9tYXBwaW5nc196aXAgOj0gJChpbnRlcm1lZGlhdGVzKS90ZXN0X21hcHBpbmdzLnppcAordGVzdF9tYXBwaW5nX2xpc3QgOj0gJChPVVRfRElSKS8ubW9kdWxlX3BhdGhzL1RFU1RfTUFQUElORy5saXN0Cit0ZXN0X21hcHBpbmdzIDo9ICQoZmlsZSA8JCh0ZXN0X21hcHBpbmdfbGlzdCkpCiskKHRlc3RfbWFwcGluZ3NfemlwKSA6IFBSSVZBVEVfdGVzdF9tYXBwaW5ncyA6PSAkKHN1YnN0ICQobmV3bGluZSksXG4sJCh0ZXN0X21hcHBpbmdzKSkKKworJCh0ZXN0X21hcHBpbmdzX3ppcCkgOiAkKHRlc3RfbWFwcGluZ3MpICQoU09PTkdfWklQKQorCUBlY2hvICJCdWlsZGluZyBhcnRpZmFjdCB0byBpbmNsdWRlIFRFU1RfTUFQUElORyBmaWxlcy4iCisJcm0gLXJmICRACisJZWNobyAtZSAiJChQUklWQVRFX3Rlc3RfbWFwcGluZ3MpIiA+ICRALmxpc3QKKwkkKFNPT05HX1pJUCkgLW8gJEAgLUMgLiAtbCAkQC5saXN0CisJcm0gLWYgJEAubGlzdAorCit0ZXN0X21hcHBpbmcgOiAkKHRlc3RfbWFwcGluZ3NfemlwKQorCiskKGNhbGwgZGlzdC1mb3ItZ29hbHMsIGRpc3RfZmlsZXMgdGVzdF9tYXBwaW5nLCQodGVzdF9tYXBwaW5nc196aXApKQpkaWZmIC0tZ2l0IGEvY29yZS90YXNrcy90b29scy9idWlsZF9jdXN0b21faW1hZ2UubWsgYi9jb3JlL3Rhc2tzL3Rvb2xzL2J1aWxkX2N1c3RvbV9pbWFnZS5tawppbmRleCA3MTkyNzljLi5hMTE1MWU5IDEwMDY0NAotLS0gYS9jb3JlL3Rhc2tzL3Rvb2xzL2J1aWxkX2N1c3RvbV9pbWFnZS5taworKysgYi9jb3JlL3Rhc2tzL3Rvb2xzL2J1aWxkX2N1c3RvbV9pbWFnZS5tawpAQCAtNjIsMTIgKzYyLDE2IEBACiAgICQoZXZhbCBteV9pbWFnZV9jb3B5X2ZpbGVzICs9ICQoc3JjKSlcCiAgICQoZXZhbCBteV9jb3B5X3BhaXJzICs9ICQoc3JjKTokKG15X3N0YWdpbmdfZGlyKS8kKHdvcmQgMiwkKHBhaXIpKSkpCiAKLWlmbmRlZiBDVVNUT01fSU1BR0VfQVZCX0tFWV9QQVRICi0jIElmIGtleSBwYXRoIGlzbid0IHNwZWNpZmllZCwgdXNlIHRoZSBkZWZhdWx0IHNpZ25pbmcgYXJncy4KLW15X2F2Yl9zaWduaW5nX2FyZ3MgOj0gJChJTlRFUk5BTF9BVkJfU0lHTklOR19BUkdTKQotZWxzZQotbXlfYXZiX3NpZ25pbmdfYXJncyA6PSBcCi0gIC0tYWxnb3JpdGhtICQoQ1VTVE9NX0lNQUdFX0FWQl9BTEdPUklUSE0pIC0ta2V5ICQoQ1VTVE9NX0lNQUdFX0FWQl9LRVlfUEFUSCkKK2lmZGVmIENVU1RPTV9JTUFHRV9BVkJfS0VZX1BBVEgKK2lmbmRlZiBDVVNUT01fSU1BR0VfQVZCX0FMR09SSVRITQorICAkKGVycm9yIENVU1RPTV9JTUFHRV9BVkJfQUxHT1JJVEhNIGlzIG5vdCBkZWZpbmVkKQorZW5kaWYKK2lmbmRlZiBDVVNUT01fSU1BR0VfQVZCX1JPTExCQUNLX0lOREVYCisgICQoZXJyb3IgQ1VTVE9NX0lNQUdFX0FWQl9ST0xMQkFDS19JTkRFWCBpcyBub3QgZGVmaW5lZCkKK2VuZGlmCisjIHNldCByb2xsYmFja19pbmRleCB2aWEgZm9vdGVyIGFyZ3MKK0NVU1RPTV9JTUFHRV9BVkJfQUREX0hBU0hfRk9PVEVSX0FSR1MgKz0gLS1yb2xsYmFja19pbmRleCAkKENVU1RPTV9JTUFHRV9BVkJfUk9MTEJBQ0tfSU5ERVgpCitDVVNUT01fSU1BR0VfQVZCX0FERF9IQVNIVFJFRV9GT09URVJfQVJHUyArPSAtLXJvbGxiYWNrX2luZGV4ICQoQ1VTVE9NX0lNQUdFX0FWQl9ST0xMQkFDS19JTkRFWCkKIGVuZGlmCiAKICQobXlfYnVpbHRfY3VzdG9tX2ltYWdlKTogUFJJVkFURV9JTlRFUk1FRElBVEVTIDo9ICQoaW50ZXJtZWRpYXRlcykKQEAgLTg0LDcgKzg4LDggQEAKICQobXlfYnVpbHRfY3VzdG9tX2ltYWdlKTogUFJJVkFURV9WRVJJVFlfQkxPQ0tfREVWSUNFIDo9ICQoQ1VTVE9NX0lNQUdFX1ZFUklUWV9CTE9DS19ERVZJQ0UpCiAkKG15X2J1aWx0X2N1c3RvbV9pbWFnZSk6IFBSSVZBVEVfRElDVF9GSUxFIDo9ICQoQ1VTVE9NX0lNQUdFX0RJQ1RfRklMRSkKICQobXlfYnVpbHRfY3VzdG9tX2ltYWdlKTogUFJJVkFURV9BVkJfQVZCVE9PTCA6PSAkKEFWQlRPT0wpCi0kKG15X2J1aWx0X2N1c3RvbV9pbWFnZSk6IFBSSVZBVEVfQVZCX1NJR05JTkdfQVJHUyA6PSAkKG15X2F2Yl9zaWduaW5nX2FyZ3MpCiskKG15X2J1aWx0X2N1c3RvbV9pbWFnZSk6IFBSSVZBVEVfQVZCX0tFWV9QQVRIIDo9ICQoQ1VTVE9NX0lNQUdFX0FWQl9LRVlfUEFUSCkKKyQobXlfYnVpbHRfY3VzdG9tX2ltYWdlKTogUFJJVkFURV9BVkJfQUxHT1JJVEhNOj0gJChDVVNUT01fSU1BR0VfQVZCX0FMR09SSVRITSkKICQobXlfYnVpbHRfY3VzdG9tX2ltYWdlKTogUFJJVkFURV9BVkJfSEFTSF9FTkFCTEUgOj0gJChDVVNUT01fSU1BR0VfQVZCX0hBU0hfRU5BQkxFKQogJChteV9idWlsdF9jdXN0b21faW1hZ2UpOiBQUklWQVRFX0FWQl9BRERfSEFTSF9GT09URVJfQVJHUyA6PSAkKENVU1RPTV9JTUFHRV9BVkJfQUREX0hBU0hfRk9PVEVSX0FSR1MpCiAkKG15X2J1aWx0X2N1c3RvbV9pbWFnZSk6IFBSSVZBVEVfQVZCX0hBU0hUUkVFX0VOQUJMRSA6PSAkKENVU1RPTV9JTUFHRV9BVkJfSEFTSFRSRUVfRU5BQkxFKQpAQCAtMTMwLDggKzEzNSwxMSBAQAogCSAgICBlY2hvICJ2ZXJpdHlfYmxvY2tfZGV2aWNlPSQoUFJJVkFURV9WRVJJVFlfQkxPQ0tfREVWSUNFKSIgPj4gJChQUklWQVRFX0lOVEVSTUVESUFURVMpL2ltYWdlX2luZm8udHh0KQogCSQoaWYgJChQUklWQVRFX1NVUFBPUlRfVkVSSVRZX0ZFQyksXAogCSAgJChoaWRlKSBlY2hvICJ2ZXJpdHlfZmVjPSQoUFJJVkFURV9TVVBQT1JUX1ZFUklUWV9GRUMpIiA+PiAkKFBSSVZBVEVfSU5URVJNRURJQVRFUykvaW1hZ2VfaW5mby50eHQpCisJJChpZiAkKGZpbHRlciBlbmcsICQoVEFSR0VUX0JVSUxEX1ZBUklBTlQpKSwkKGhpZGUpIGVjaG8gInZlcml0eV9kaXNhYmxlPXRydWUiID4+ICQoUFJJVkFURV9JTlRFUk1FRElBVEVTKS9pbWFnZV9pbmZvLnR4dCkKIAkkKGhpZGUpIGVjaG8gImF2Yl9hdmJ0b29sPSQoUFJJVkFURV9BVkJfQVZCVE9PTCkiID4+ICQoUFJJVkFURV9JTlRFUk1FRElBVEVTKS9pbWFnZV9pbmZvLnR4dAotCSQoaGlkZSkgZWNobyAiYXZiX3NpZ25pbmdfYXJncz0kKFBSSVZBVEVfQVZCX1NJR05JTkdfQVJHUykiID4+ICQoUFJJVkFURV9JTlRFUk1FRElBVEVTKS9pbWFnZV9pbmZvLnR4dAorCSQoaWYgJChQUklWQVRFX0FWQl9LRVlfUEFUSCksXAorCSAgJChoaWRlKSBlY2hvICJhdmJfa2V5X3BhdGg9JChQUklWQVRFX0FWQl9LRVlfUEFUSCkiID4+ICQoUFJJVkFURV9JTlRFUk1FRElBVEVTKS9pbWFnZV9pbmZvLnR4dDtcCisJICAgIGVjaG8gImF2Yl9hbGdvcml0aG09JChQUklWQVRFX0FWQl9BTEdPUklUSE0pIiA+PiAkKFBSSVZBVEVfSU5URVJNRURJQVRFUykvaW1hZ2VfaW5mby50eHQpCiAJJChpZiAkKFBSSVZBVEVfQVZCX0hBU0hfRU5BQkxFKSxcCiAJICAkKGhpZGUpIGVjaG8gImF2Yl9oYXNoX2VuYWJsZT0kKFBSSVZBVEVfQVZCX0hBU0hfRU5BQkxFKSIgPj4gJChQUklWQVRFX0lOVEVSTUVESUFURVMpL2ltYWdlX2luZm8udHh0O1wKIAkgICAgZWNobyAiYXZiX2FkZF9oYXNoX2Zvb3Rlcl9hcmdzPSQoUFJJVkFURV9BVkJfQUREX0hBU0hfRk9PVEVSX0FSR1MpIiA+PiAkKFBSSVZBVEVfSU5URVJNRURJQVRFUykvaW1hZ2VfaW5mby50eHQpCkBAIC0xNDMsOSArMTUxLDkgQEAKIAkgICAgY2F0ICQoUFJJVkFURV9ESUNUX0ZJTEUpID4+ICQoUFJJVkFURV9JTlRFUk1FRElBVEVTKS9pbWFnZV9pbmZvLnR4dCkKIAkjIEdlbmVyYXRlIHRoZSBpbWFnZS4KIAkkKGlmICQoZmlsdGVyIG9lbSwkKFBSSVZBVEVfTU9VTlRfUE9JTlQpKSwgXAotCSAgJChoaWRlKSBlY2hvICJvZW0uYnVpbGRudW1iZXI9JChCVUlMRF9OVU1CRVIpIiA+PiAkKFBSSVZBVEVfU1RBR0lOR19ESVIpL29lbS5wcm9wKQorCSAgJChoaWRlKSBlY2hvICJvZW0uYnVpbGRudW1iZXI9JChCVUlMRF9OVU1CRVJfRlJPTV9GSUxFKSIgPj4gJChQUklWQVRFX1NUQUdJTkdfRElSKS9vZW0ucHJvcCkKIAkkKGhpZGUpIFBBVEg9JChmb3JlYWNoIHAsJChJTlRFUk5BTF9VU0VSSU1BR0VTX0JJTkFSWV9QQVRIUyksJChwKTopJCRQQVRIIFwKLQkgIC4vYnVpbGQvdG9vbHMvcmVsZWFzZXRvb2xzL2J1aWxkX2ltYWdlLnB5IFwKKwkgIGJ1aWxkL21ha2UvdG9vbHMvcmVsZWFzZXRvb2xzL2J1aWxkX2ltYWdlLnB5IFwKIAkgICQoUFJJVkFURV9TVEFHSU5HX0RJUikgJChQUklWQVRFX0lOVEVSTUVESUFURVMpL2ltYWdlX2luZm8udHh0ICRAICQoVEFSR0VUX09VVCkKIAogbXlfaW5zdGFsbGVkX2N1c3RvbV9pbWFnZSA6PSAkKFBST0RVQ1RfT1VUKS8kKG5vdGRpciAkKG15X2J1aWx0X2N1c3RvbV9pbWFnZSkpCmRpZmYgLS1naXQgYS9jb3JlL3Rhc2tzL3Rvb2xzL2NvbXBhdGliaWxpdHkubWsgYi9jb3JlL3Rhc2tzL3Rvb2xzL2NvbXBhdGliaWxpdHkubWsKaW5kZXggMGZjMjA0NS4uM2QxZDc4MyAxMDA2NDQKLS0tIGEvY29yZS90YXNrcy90b29scy9jb21wYXRpYmlsaXR5Lm1rCisrKyBiL2NvcmUvdGFza3MvdG9vbHMvY29tcGF0aWJpbGl0eS5tawpAQCAtMjEsNiArMjEsOCBAQAogIyAgIHRlc3Rfc3VpdGVfcmVhZG1lOiB0aGUgcGF0aCB0byBhIFJFQURNRSBmaWxlIGZvciB0aGlzIHRlc3Qgc3VpdGUKICMgICB0ZXN0X3N1aXRlX3ByZWJ1aWx0X3Rvb2xzOiB0aGUgc2V0IG9mIHByZWJ1aWx0IHRvb2xzIHRvIGJlIGluY2x1ZGVkIGRpcmVjdGx5CiAjICAgICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSAndG9vbHMnIHN1YmRpcmVjdG9yeSBvZiB0aGUgdGVzdCBzdWl0ZS4KKyMgICB0ZXN0X3N1aXRlX3Rvb2xzOiB0aGUgc2V0IG9mIHRvb2xzIGZvciB0aGlzIHRlc3Qgc3VpdGUKKyMKICMgT3V0cHV0IHZhcmlhYmxlczoKICMgICBjb21wYXRpYmlsaXR5X3ppcDogdGhlIHBhdGggdG8gdGhlIG91dHB1dCB6aXAgZmlsZS4KIApAQCAtMjgsNiArMzAsNyBAQAogdGVzdF9hcnRpZmFjdHMgOj0gJChDT01QQVRJQklMSVRZLiQodGVzdF9zdWl0ZV9uYW1lKS5GSUxFUykKIHRlc3RfdG9vbHMgOj0gJChIT1NUX09VVF9KQVZBX0xJQlJBUklFUykvaG9zdHRlc3RsaWIuamFyIFwKICAgJChIT1NUX09VVF9KQVZBX0xJQlJBUklFUykvdHJhZGVmZWQuamFyIFwKKyAgJChIT1NUX09VVF9KQVZBX0xJQlJBUklFUykvbG9nYW5hbHlzaXMuamFyIFwKICAgJChIT1NUX09VVF9KQVZBX0xJQlJBUklFUykvY29tcGF0aWJpbGl0eS1ob3N0LXV0aWwuamFyIFwKICAgJChIT1NUX09VVF9KQVZBX0xJQlJBUklFUykvY29tcGF0aWJpbGl0eS1ob3N0LXV0aWwtdGVzdHMuamFyIFwKICAgJChIT1NUX09VVF9KQVZBX0xJQlJBUklFUykvY29tcGF0aWJpbGl0eS1jb21tb24tdXRpbC10ZXN0cy5qYXIgXApAQCAtMzgsNiArNDEsOCBAQAogICAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS8kKHRlc3Rfc3VpdGVfdHJhZGVmZWQpIFwKICAgJCh0ZXN0X3N1aXRlX3JlYWRtZSkKIAordGVzdF90b29scyArPSAkKHRlc3Rfc3VpdGVfdG9vbHMpCisKIGNvbXBhdGliaWxpdHlfemlwIDo9ICQob3V0X2RpcikuemlwCiAkKGNvbXBhdGliaWxpdHlfemlwKTogUFJJVkFURV9OQU1FIDo9IGFuZHJvaWQtJCh0ZXN0X3N1aXRlX25hbWUpCiAkKGNvbXBhdGliaWxpdHlfemlwKTogUFJJVkFURV9PVVRfRElSIDo9ICQob3V0X2RpcikKQEAgLTU5LDMgKzY0LDQgQEAKIHRlc3Rfc3VpdGVfZHluYW1pY19jb25maWcgOj0KIHRlc3Rfc3VpdGVfcmVhZG1lIDo9CiB0ZXN0X3N1aXRlX3ByZWJ1aWx0X3Rvb2xzIDo9Cit0ZXN0X3N1aXRlX3Rvb2xzIDo9CmRpZmYgLS1naXQgYS9jb3JlL3Rhc2tzL3Rvb2xzL3BhY2thZ2UtbW9kdWxlcy5tayBiL2NvcmUvdGFza3MvdG9vbHMvcGFja2FnZS1tb2R1bGVzLm1rCmluZGV4IDYyOWE5YjIuLjQxNTVhMzkgMTAwNjQ0Ci0tLSBhL2NvcmUvdGFza3MvdG9vbHMvcGFja2FnZS1tb2R1bGVzLm1rCisrKyBiL2NvcmUvdGFza3MvdG9vbHMvcGFja2FnZS1tb2R1bGVzLm1rCkBAIC0yOCw5ICsyOCwxMCBAQAogCiAjIElnbm9yZSB1bmtub3duIGluc3RhbGxlZCBmaWxlcyBvbiBwYXJ0aWFsIGJ1aWxkcwogbXlfbWlzc2luZ19maWxlcyA6PQotaWZuZXEgKCQoQUxMT1dfTUlTU0lOR19ERVBFTkRFTkNJRVMpLHRydWUpCi1teV9taXNzaW5nX2ZpbGVzID0gJChzaGVsbCAkKGNhbGwgZWNoby13YXJuaW5nLCQobXlfbWFrZWZpbGUpLCQobXlfcGFja2FnZV9uYW1lKTogVW5rbm93biBpbnN0YWxsZWQgZmlsZSBmb3IgbW9kdWxlICckKDEpJykpCi1lbmRpZgorIyBUaGVzZSB3YXJuaW5ncyBhcmUgdG9vIG5vaXN5LCBzaWxlbmNlIHRoZW0gZm9yIG5vdy4KKyNpZm5lcSAoJChBTExPV19NSVNTSU5HX0RFUEVOREVOQ0lFUyksdHJ1ZSkKKyNteV9taXNzaW5nX2ZpbGVzID0gJChzaGVsbCAkKGNhbGwgZWNoby13YXJuaW5nLCQobXlfbWFrZWZpbGUpLCQobXlfcGFja2FnZV9uYW1lKTogVW5rbm93biBpbnN0YWxsZWQgZmlsZSBmb3IgbW9kdWxlICckKDEpJykpCisjZW5kaWYKIAogIyBJdGVyYXRlIG92ZXIgbW9kdWxlcycgYnVpbHQgZmlsZXMgYW5kIGluc3RhbGxlZCBmaWxlczsKICMgQ2FsY3VsYXRlIHRoZSBkZXN0IGZpbGVzIGluIHRoZSBvdXRwdXQgemlwIGZpbGUuCmRpZmYgLS1naXQgYS9jb3JlL3Rhc2tzL3RyYWRlZmVkLXRlc3RzLWxpc3QubWsgYi9jb3JlL3Rhc2tzL3RyYWRlZmVkLXRlc3RzLWxpc3QubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmNiZGZjZgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvdGFza3MvdHJhZGVmZWQtdGVzdHMtbGlzdC5tawpAQCAtMCwwICsxLDM4IEBACisjIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjIExpc3QgYWxsIFRyYWRlRmVkIHRlc3RzIGZyb20gQ09NUEFUSUJJTElUWS50cmFkZWZlZF90ZXN0c19kaXIKKy5QSE9OWTogdHJhZGVmZWQtdGVzdHMtbGlzdAorCit0cmFkZWZlZF90ZXN0cyA6PQorJChmb3JlYWNoIGRpciwgJChDT01QQVRJQklMSVRZLnRyYWRlZmVkX3Rlc3RzX2RpciksIFwKKyAgJChldmFsIHRyYWRlZmVkX3Rlc3RzICs9ICQoc2hlbGwgZmluZCAkKGRpcikgLXR5cGUgZiAtbmFtZSAiKi54bWwiKSkpCit0cmFkZWZlZF90ZXN0c19saXN0X2ludGVybWVkaWF0ZXMgOj0gJChjYWxsIGludGVybWVkaWF0ZXMtZGlyLWZvcixQQUNLQUdJTkcsdHJhZGVmZWRfdGVzdHNfbGlzdCxIT1NULENPTU1PTikKK3RyYWRlZmVkX3Rlc3RzX2xpc3RfemlwIDo9ICQodHJhZGVmZWRfdGVzdHNfbGlzdF9pbnRlcm1lZGlhdGVzKS90cmFkZWZlZC10ZXN0c19saXN0LnppcAorYWxsX3Rlc3RzIDo9CiskKGZvcmVhY2ggdGVzdCwgJCh0cmFkZWZlZF90ZXN0cyksIFwKKyAgJChldmFsIGFsbF90ZXN0cyArPSAkKHdvcmQgMiwkKHN1YnN0IC9yZXMvY29uZmlnLywkKHNwYWNlKSwkKHRlc3QpKSkpKQorJCh0cmFkZWZlZF90ZXN0c19saXN0X3ppcCkgOiBQUklWQVRFX3RyYWRlZmVkX3Rlc3RzIDo9ICQoc3Vic3QgLnhtbCwsJChzdWJzdCAkKHNwYWNlKSxcbiwkKHNvcnQgJChhbGxfdGVzdHMpKSkpCiskKHRyYWRlZmVkX3Rlc3RzX2xpc3RfemlwKSA6IFBSSVZBVEVfdHJhZGVmZWRfdGVzdHNfbGlzdCA6PSAkKHRyYWRlZmVkX3Rlc3RzX2xpc3RfaW50ZXJtZWRpYXRlcykvdHJhZGVmZWQtdGVzdHNfbGlzdAorCiskKHRyYWRlZmVkX3Rlc3RzX2xpc3RfemlwKSA6ICQodHJhZGVmZWRfdGVzdHMpICQoU09PTkdfWklQKQorCUBlY2hvICJQYWNrYWdlOiAkQCIKKwkkKGhpZGUpIHJtIC1yZiAkKGRpciAkQCkgJiYgbWtkaXIgLXAgJChkaXIgJEApCisJJChoaWRlKSBlY2hvIC1lICIkKFBSSVZBVEVfdHJhZGVmZWRfdGVzdHMpIiA+ICQoUFJJVkFURV90cmFkZWZlZF90ZXN0c19saXN0KQorCSQoaGlkZSkgJChTT09OR19aSVApIC1kIC1vICRAIC1DICQoZGlyICRAKSAtZiAkKFBSSVZBVEVfdHJhZGVmZWRfdGVzdHNfbGlzdCkKKwordHJhZGVmZWQtdGVzdHMtbGlzdCA6ICQodHJhZGVmZWRfdGVzdHNfbGlzdF96aXApCiskKGNhbGwgZGlzdC1mb3ItZ29hbHMsIHRyYWRlZmVkLXRlc3RzLWxpc3QsICQodHJhZGVmZWRfdGVzdHNfbGlzdF96aXApKQorCit0ZXN0czogdHJhZGVmZWQtdGVzdHMtbGlzdApkaWZmIC0tZ2l0IGEvY29yZS90YXNrcy92ZW5kb3JfbW9kdWxlX2NoZWNrLm1rIGIvY29yZS90YXNrcy92ZW5kb3JfbW9kdWxlX2NoZWNrLm1rCmluZGV4IGFlOTY3YzYuLjY2OTU5OTQgMTAwNjQ0Ci0tLSBhL2NvcmUvdGFza3MvdmVuZG9yX21vZHVsZV9jaGVjay5taworKysgYi9jb3JlL3Rhc2tzL3ZlbmRvcl9tb2R1bGVfY2hlY2subWsKQEAgLTQ0LDYgKzQ0LDcgQEAKICAgICAgICAgdGkgXAogICAgICAgICB0cnVzdGVkX2xvZ2ljIFwKICAgICAgICAgdmVyaXpvbiBcCisgICAgICAgIHdhdmVzIFwKICAgICAgICAgd2lkZXZpbmUKIAogCmRpZmYgLS1naXQgYS9jb3JlL3Rhc2tzL3ZuZGsubWsgYi9jb3JlL3Rhc2tzL3ZuZGsubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjkxMzNkZgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvdGFza3Mvdm5kay5tawpAQCAtMCwwICsxLDI2NCBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworY3VycmVudF9tYWtlZmlsZSA6PSAkKGxhc3R3b3JkICQoTUFLRUZJTEVfTElTVCkpCisKKyMgQk9BUkRfVk5ES19WRVJTSU9OIG11c3QgYmUgc2V0IHRvICdjdXJyZW50JyBpbiBvcmRlciB0byBnZW5lcmF0ZSBhIFZOREsgc25hcHNob3QuCitpZmVxICgkKEJPQVJEX1ZOREtfVkVSU0lPTiksY3VycmVudCkKKworIyBQTEFURk9STV9WTkRLX1ZFUlNJT04gbXVzdCBiZSBzZXQuCitpZm5lcSAoLCQoUExBVEZPUk1fVk5ES19WRVJTSU9OKSkKKworIyBCT0FSRF9WTkRLX1JVTlRJTUVfRElTQUJMRSBtdXN0IG5vdCBiZSBzZXQgdG8gJ3RydWUnLgoraWZuZXEgKCQoQk9BUkRfVk5ES19SVU5USU1FX0RJU0FCTEUpLHRydWUpCisKKyMgUmV0dXJucyBhcmNoLXNwZWNpZmljIGxpYmNsYW5nX3J0LnVic2FuKiBsaWJyYXJ5IG5hbWUuCisjIEJlY2F1c2UgVk5ES19DT1JFX0xJQlJBUklFUyBpbmNsdWRlcyBhbGwgYXJjaCB2YXJpYW50cyBmb3IgbGliY2xhbmdfcnQudWJzYW4qCisjIGxpYnMsIHRoZSBhcmNoLXNwZWNpZmljIGxpYnMgYXJlIHNlbGVjdGVkIHNlcGFyYXRlbHkuCisjCisjIEFyZ3M6CisjICAgJCgxKTogaWYgbm90IGVtcHR5LCBldmFsdWF0ZXMgZm9yIFRBUkdFVF8yTkRfQVJDSAorZGVmaW5lIGNsYW5nLXVic2FuLXZuZGstY29yZQorJChzdHJpcCBcCisgICQoZXZhbCBwcmVmaXggOj0gJChpZiAkKDEpLDJORF8sKSkgXAorICAkKGFkZHN1ZmZpeCAudmVuZG9yLCQoJChhZGRwcmVmaXggJChwcmVmaXgpLFVCU0FOX1JVTlRJTUVfTElCUkFSWSkpKSBcCispCitlbmRlZgorCisjIFJldHVybnMgbGlzdCBvZiBmaWxlIHBhdGhzIG9mIHRoZSBpbnRlcm1lZGlhdGUgb2JqcworIworIyBBcmdzOgorIyAgICQoMSk6IGxpc3Qgb2YgbW9kdWxlIGFuZCBmaWxlbmFtZSBwYWlycyAoZS5nLiwgbGQuY29uZmlnLnR4dDpsZC5jb25maWcuMjcudHh0IC4uLikKKyMgICAkKDIpOiB0YXJnZXQgY2xhc3MgKGUuZy4sIFNIQVJFRF9MSUJSQVJJRVMsIFNUQVRJQ19MSUJSQVJJRVMsIEVUQykKKyMgICAkKDMpOiBpZiBub3QgZW1wdHksIGV2YWx1YXRlcyBmb3IgVEFSR0VUXzJORF9BUkNICitkZWZpbmUgcGF0aHMtb2YtaW50ZXJtZWRpYXRlcworJChzdHJpcCBcCisgICQoZm9yZWFjaCBwYWlyLCQoMSksIFwKKyAgICAkKGV2YWwgc3BsaXRfcGFpciA6PSAkKHN1YnN0IDosJChzcGFjZSksJChwYWlyKSkpIFwKKyAgICAkKGV2YWwgbW9kdWxlIDo9ICQod29yZCAxLCQoc3BsaXRfcGFpcikpKSBcCisgICAgJChldmFsIGZpbGVuYW1lIDo9ICQod29yZCAyLCQoc3BsaXRfcGFpcikpKSBcCisgICAgJChldmFsIGRpciA6PSAkKGNhbGwgaW50ZXJtZWRpYXRlcy1kaXItZm9yLCQoMiksJChtb2R1bGUpLCwsJCgzKSkpIFwKKyAgICAkKGNhbGwgYXBwZW5kLXBhdGgsJChkaXIpLCQoZmlsZW5hbWUpKSBcCisgICkgXAorKQorZW5kZWYKKworIyBSZXR1cm5zIHBhdGhzIG9mIG5vdGljZSBmaWxlcyB1bmRlciAkKFRBUkdFVF9PVVRfTk9USUNFX0ZJTEVTKQorIworIyBBcmdzOgorIyAgICQoMSk6IGxpc3Qgb2YgbGliIG5hbWVzIChlLmcuLCBsaWJmb28udmVuZG9yKQorIyAgICQoMik6IHZuZGsgbGliIHR5cGUsIG9uZSBvZiAndm5kaycgb3IgJ3ZuZGstc3AnCitkZWZpbmUgcGF0aHMtb2Ytbm90aWNlLWZpbGVzCiskKHN0cmlwIFwKKyAgJChldmFsIGxpYl9kaXIgOj0gbGliJChpZiAkKFRBUkdFVF9JU182NEJJVCksNjQsKSkgXAorICAkKGV2YWwgdm5ka19kaXIgOj0gJCgyKS0kKFBMQVRGT1JNX1ZOREtfVkVSU0lPTikpIFwKKyAgJChmb3JlYWNoIGxpYiwkKDEpLCBcCisgICAgJChldmFsIG5vdGljZV9maWxlX25hbWUgOj0gJChwYXRzdWJzdCAlLnZlbmRvciwlLnNvLnR4dCwkKGxpYikpKSBcCisgICAgJChUQVJHRVRfT1VUX05PVElDRV9GSUxFUykvc3JjL3N5c3RlbS8kKGxpYl9kaXIpLyQodm5ka19kaXIpLyQobm90aWNlX2ZpbGVfbmFtZSkgXAorICApIFwKKykKK2VuZGVmCisKKyMgSWYgaW4gdGhlIGZ1dHVyZSBsaWJjbGFuZ19ydC51YnNhbiogaXMgcmVtb3ZlZCBmcm9tIHRoZSBWTkRLLWNvcmUgbGlzdCwKKyMgbmVlZCB0byB1cGRhdGUgdGhlIHJlbGF0ZWQgbG9naWMgaW4gdGhpcyBmaWxlLgoraWZlcSAoLCQoZmlsdGVyIGxpYmNsYW5nX3J0LnVic2FuJSwkKFZOREtfQ09SRV9MSUJSQVJJRVMpKSkKKyAgJCh3YXJuaW5nIGxpYmNsYW5nX3J0LnVic2FuKiBpcyBubyBsb25nZXIgYSBWTkRLLWNvcmUgbGlicmFyeS4gUGxlYXNlIHVwZGF0ZSB0aGlzIGZpbGUuKQorICB2bmRrX2NvcmVfbGlicyA6PSAkKGFkZHN1ZmZpeCAudmVuZG9yLCQoVk5ES19DT1JFX0xJQlJBUklFUykpCitlbHNlCisgIHZuZGtfY29yZV9saWJzIDo9ICQoYWRkc3VmZml4IC52ZW5kb3IsJChmaWx0ZXItb3V0IGxpYmNsYW5nX3J0LnVic2FuJSwkKFZOREtfQ09SRV9MSUJSQVJJRVMpKSkKKworICB2bmRrX2NvcmVfbGlicyArPSAkKGNhbGwgY2xhbmctdWJzYW4tdm5kay1jb3JlKQorICBpZmRlZiBUQVJHRVRfMk5EX0FSQ0gKKyAgICB2bmRrX2NvcmVfbGlicyArPSAkKGNhbGwgY2xhbmctdWJzYW4tdm5kay1jb3JlLHRydWUpCisgIGVuZGlmCitlbmRpZgorCit2bmRrX3NwX2xpYnMgOj0gJChhZGRzdWZmaXggLnZlbmRvciwkKFZOREtfU0FNRVBST0NFU1NfTElCUkFSSUVTKSkKK3ZuZGtfcHJpdmF0ZV9saWJzIDo9ICQoYWRkc3VmZml4IC52ZW5kb3IsJChWTkRLX1BSSVZBVEVfTElCUkFSSUVTKSkKKwordm5ka19zbmFwc2hvdF9saWJzIDo9IFwKKyAgJCh2bmRrX2NvcmVfbGlicykgXAorICAkKHZuZGtfc3BfbGlicykKKwordm5ka19wcmVidWlsdF90eHRzIDo9IFwKKyAgbGQuY29uZmlnLnR4dCBcCisgIHZuZGtzcC5saWJyYXJpZXMudHh0IFwKKyAgbGxuZGsubGlicmFyaWVzLnR4dAorCit2bmRrX3NuYXBzaG90X3RvcCA6PSAkKGNhbGwgaW50ZXJtZWRpYXRlcy1kaXItZm9yLFBBQ0tBR0lORyx2bmRrLXNuYXBzaG90KQordm5ka19zbmFwc2hvdF9vdXQgOj0gJCh2bmRrX3NuYXBzaG90X3RvcCkvdm5kay1zbmFwc2hvdAordm5ka19zbmFwc2hvdF9jb25maWdzX291dCA6PSAkKHZuZGtfc25hcHNob3RfdG9wKS9jb25maWdzCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyB2bmRrY29yZS5saWJyYXJpZXMudHh0Cit2bmRrY29yZS5saWJyYXJpZXMudHh0IDo9ICQodm5ka19zbmFwc2hvdF9jb25maWdzX291dCkvdm5ka2NvcmUubGlicmFyaWVzLnR4dAorJCh2bmRrY29yZS5saWJyYXJpZXMudHh0KTogJCh2bmRrX2NvcmVfbGlicykKKwlAZWNobyAnR2VuZXJhdGluZzogJEAnCisJQHJtIC1mICRACisJQG1rZGlyIC1wICQoZGlyICRAKQorCSQoaGlkZSkgZWNobyAtbiA+ICRACisJJChoaWRlKSAkKGZvcmVhY2ggbGliLCReLGVjaG8gJChwYXRzdWJzdCAlLnZlbmRvciwlLCQobGliKSkuc28gPj4gJEA7KQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyB2bmRrcHJpdmF0ZS5saWJyYXJpZXMudHh0Cit2bmRrcHJpdmF0ZS5saWJyYXJpZXMudHh0IDo9ICQodm5ka19zbmFwc2hvdF9jb25maWdzX291dCkvdm5ka3ByaXZhdGUubGlicmFyaWVzLnR4dAorJCh2bmRrcHJpdmF0ZS5saWJyYXJpZXMudHh0KTogJCh2bmRrX3ByaXZhdGVfbGlicykKKwlAZWNobyAnR2VuZXJhdGluZzogJEAnCisJQHJtIC1mICRACisJQG1rZGlyIC1wICQoZGlyICRAKQorCSQoaGlkZSkgZWNobyAtbiA+ICRACisJJChoaWRlKSAkKGZvcmVhY2ggbGliLCReLGVjaG8gJChwYXRzdWJzdCAlLnZlbmRvciwlLCQobGliKSkuc28gPj4gJEA7KQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBtb2R1bGVfcGF0aHMudHh0Cittb2R1bGVfcGF0aHMudHh0IDo9ICQodm5ka19zbmFwc2hvdF9jb25maWdzX291dCkvbW9kdWxlX3BhdGhzLnR4dAorJChtb2R1bGVfcGF0aHMudHh0KTogJCh2bmRrX3NuYXBzaG90X2xpYnMpCisJQGVjaG8gJ0dlbmVyYXRpbmc6ICRAJworCUBybSAtZiAkQAorCUBta2RpciAtcCAkKGRpciAkQCkKKwkkKGhpZGUpIGVjaG8gLW4gPiAkQAorCSQoaGlkZSkgJChmb3JlYWNoIGxpYiwkXixlY2hvICQocGF0c3Vic3QgJS52ZW5kb3IsJSwkKGxpYikpLnNvICQoQUxMX01PRFVMRVMuJChsaWIpLlBBVEgpID4+ICRAOykKKworCit2bmRrX3NuYXBzaG90X2NvbmZpZ3MgOj0gXAorICAkKHZuZGtjb3JlLmxpYnJhcmllcy50eHQpIFwKKyAgJCh2bmRrcHJpdmF0ZS5saWJyYXJpZXMudHh0KSBcCisgICQobW9kdWxlX3BhdGhzLnR4dCkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIHZuZGtfc25hcHNob3RfemlwCit2bmRrX3NuYXBzaG90X3ZhcmlhbnQgOj0gJCh2bmRrX3NuYXBzaG90X291dCkvJChUQVJHRVRfQVJDSCkKK2JpbmRlciA6PQoraWZuZXEgKCQoVEFSR0VUX1VTRVNfNjRfQklUX0JJTkRFUiksIHRydWUpCisgIGJpbmRlciA6PSBiaW5kZXIzMgorZW5kaWYKK3ZuZGtfbGliX2RpciA6PSAkKHN1YnN0ICQoc3BhY2UpLC8sJChzdHJpcCAkKHZuZGtfc25hcHNob3RfdmFyaWFudCkgJChiaW5kZXIpIGFyY2gtJChUQVJHRVRfQVJDSCktJChUQVJHRVRfQVJDSF9WQVJJQU5UKSkpCit2bmRrX2xpYl9kaXJfMm5kIDo9ICQoc3Vic3QgJChzcGFjZSksLywkKHN0cmlwICQodm5ka19zbmFwc2hvdF92YXJpYW50KSAkKGJpbmRlcikgYXJjaC0kKFRBUkdFVF8yTkRfQVJDSCktJChUQVJHRVRfMk5EX0FSQ0hfVkFSSUFOVCkpKQordm5ka19zbmFwc2hvdF96aXAgOj0gJChQUk9EVUNUX09VVCkvYW5kcm9pZC12bmRrLSQoVEFSR0VUX1BST0RVQ1QpLnppcAorCiskKHZuZGtfc25hcHNob3RfemlwKTogUFJJVkFURV9WTkRLX1NOQVBTSE9UX09VVCA6PSAkKHZuZGtfc25hcHNob3Rfb3V0KQorCiskKHZuZGtfc25hcHNob3RfemlwKTogUFJJVkFURV9WTkRLX0NPUkVfT1VUIDo9ICQodm5ka19saWJfZGlyKS9zaGFyZWQvdm5kay1jb3JlCiskKHZuZGtfc25hcHNob3RfemlwKTogUFJJVkFURV9WTkRLX0NPUkVfSU5URVJNRURJQVRFUyA6PSBcCisgICQoY2FsbCBwYXRocy1vZi1pbnRlcm1lZGlhdGVzLCQoZm9yZWFjaCBsaWIsJCh2bmRrX2NvcmVfbGlicyksJChsaWIpOiQobGliKS5zbyksU0hBUkVEX0xJQlJBUklFUykKKworJCh2bmRrX3NuYXBzaG90X3ppcCk6IFBSSVZBVEVfVk5ES19TUF9PVVQgOj0gJCh2bmRrX2xpYl9kaXIpL3NoYXJlZC92bmRrLXNwCiskKHZuZGtfc25hcHNob3RfemlwKTogUFJJVkFURV9WTkRLX1NQX0lOVEVSTUVESUFURVMgOj0gXAorICAkKGNhbGwgcGF0aHMtb2YtaW50ZXJtZWRpYXRlcywkKGZvcmVhY2ggbGliLCQodm5ka19zcF9saWJzKSwkKGxpYik6JChsaWIpLnNvKSxTSEFSRURfTElCUkFSSUVTKQorCiskKHZuZGtfc25hcHNob3RfemlwKTogUFJJVkFURV9DT05GSUdTX09VVCA6PSAkKHZuZGtfc25hcHNob3RfdmFyaWFudCkvY29uZmlncworJCh2bmRrX3NuYXBzaG90X3ppcCk6IFBSSVZBVEVfQ09ORklHU19JTlRFUk1FRElBVEVTIDo9IFwKKyAgJChjYWxsIHBhdGhzLW9mLWludGVybWVkaWF0ZXMsJChmb3JlYWNoIHR4dCwkKHZuZGtfcHJlYnVpbHRfdHh0cyksIFwKKyAgICAkKHR4dCk6JChwYXRzdWJzdCAlLnR4dCwlLiQoUExBVEZPUk1fVk5ES19WRVJTSU9OKS50eHQsJCh0eHQpKSksRVRDKSBcCisgICQodm5ka19zbmFwc2hvdF9jb25maWdzKQorCiskKHZuZGtfc25hcHNob3RfemlwKTogUFJJVkFURV9OT1RJQ0VfRklMRVNfT1VUIDo9ICQodm5ka19zbmFwc2hvdF92YXJpYW50KS9OT1RJQ0VfRklMRVMKKyQodm5ka19zbmFwc2hvdF96aXApOiBQUklWQVRFX05PVElDRV9GSUxFU19JTlRFUk1FRElBVEVTIDo9IFwKKyAgJChjYWxsIHBhdGhzLW9mLW5vdGljZS1maWxlcywkKHZuZGtfY29yZV9saWJzKSx2bmRrKSBcCisgICQoY2FsbCBwYXRocy1vZi1ub3RpY2UtZmlsZXMsJCh2bmRrX3NwX2xpYnMpLHZuZGstc3ApCisKK2lmZGVmIFRBUkdFVF8yTkRfQVJDSAorJCh2bmRrX3NuYXBzaG90X3ppcCk6IFBSSVZBVEVfVk5ES19DT1JFX09VVF8yTkQgOj0gJCh2bmRrX2xpYl9kaXJfMm5kKS9zaGFyZWQvdm5kay1jb3JlCiskKHZuZGtfc25hcHNob3RfemlwKTogUFJJVkFURV9WTkRLX0NPUkVfSU5URVJNRURJQVRFU18yTkQgOj0gXAorICAkKGNhbGwgcGF0aHMtb2YtaW50ZXJtZWRpYXRlcywkKGZvcmVhY2ggbGliLCQodm5ka19jb3JlX2xpYnMpLCQobGliKTokKGxpYikuc28pLFNIQVJFRF9MSUJSQVJJRVMsdHJ1ZSkKKworJCh2bmRrX3NuYXBzaG90X3ppcCk6IFBSSVZBVEVfVk5ES19TUF9PVVRfMk5EIDo9ICQodm5ka19saWJfZGlyXzJuZCkvc2hhcmVkL3ZuZGstc3AKKyQodm5ka19zbmFwc2hvdF96aXApOiBQUklWQVRFX1ZOREtfU1BfSU5URVJNRURJQVRFU18yTkQgOj0gXAorICAkKGNhbGwgcGF0aHMtb2YtaW50ZXJtZWRpYXRlcywkKGZvcmVhY2ggbGliLCQodm5ka19zcF9saWJzKSwkKGxpYik6JChsaWIpLnNvKSxTSEFSRURfTElCUkFSSUVTLHRydWUpCitlbmRpZgorCisjIEFyZ3MKKyMgICAkKDEpOiBkZXN0aW5hdGlvbiBkaXJlY3RvcnkKKyMgICAkKDIpOiBsaXN0IG9mIGZpbGVzIHRvIGNvcHkKKyQodm5ka19zbmFwc2hvdF96aXApOiBwcml2YXRlLWNvcHktdm5kay1pbnRlcm1lZGlhdGVzID0gXAorICAkKGlmICQoMiksJChzdHJpcCBcCisgICAgQG1rZGlyIC1wICQoMSk7IFwKKyAgICAkKGZvcmVhY2ggZmlsZSwkKDIpLCBcCisgICAgICBpZiBbIC1lICQoZmlsZSkgXTsgdGhlbiBcCisgICAgICAgIGNwIC1wICQoZmlsZSkgJChjYWxsIGFwcGVuZC1wYXRoLCQoMSksJChzdWJzdCAudmVuZG9yLCwkKG5vdGRpciAkKGZpbGUpKSkpOyBcCisgICAgICBmaTsgXAorICAgICkgXAorICApKQorCit2bmRrX3NuYXBzaG90X2RlcGVuZGVuY2llcyA6PSBcCisgICQodm5ka19zbmFwc2hvdF9saWJzKSBcCisgICQodm5ka19wcmVidWlsdF90eHRzKSBcCisgICQodm5ka19zbmFwc2hvdF9jb25maWdzKQorCiskKHZuZGtfc25hcHNob3RfemlwKTogJCh2bmRrX3NuYXBzaG90X2RlcGVuZGVuY2llcykgJChTT09OR19aSVApCisJQGVjaG8gJ0dlbmVyYXRpbmcgVk5ESyBzbmFwc2hvdDogJEAnCisJQHJtIC1mICRACisJQHJtIC1yZiAkKFBSSVZBVEVfVk5ES19TTkFQU0hPVF9PVVQpCisJQG1rZGlyIC1wICQoUFJJVkFURV9WTkRLX1NOQVBTSE9UX09VVCkKKwkkKGNhbGwgcHJpdmF0ZS1jb3B5LXZuZGstaW50ZXJtZWRpYXRlcywgXAorCQkkKFBSSVZBVEVfVk5ES19DT1JFX09VVCksJChQUklWQVRFX1ZOREtfQ09SRV9JTlRFUk1FRElBVEVTKSkKKwkkKGNhbGwgcHJpdmF0ZS1jb3B5LXZuZGstaW50ZXJtZWRpYXRlcywgXAorCQkkKFBSSVZBVEVfVk5ES19TUF9PVVQpLCQoUFJJVkFURV9WTkRLX1NQX0lOVEVSTUVESUFURVMpKQorCSQoY2FsbCBwcml2YXRlLWNvcHktdm5kay1pbnRlcm1lZGlhdGVzLCBcCisJCSQoUFJJVkFURV9DT05GSUdTX09VVCksJChQUklWQVRFX0NPTkZJR1NfSU5URVJNRURJQVRFUykpCisJJChjYWxsIHByaXZhdGUtY29weS12bmRrLWludGVybWVkaWF0ZXMsIFwKKwkJJChQUklWQVRFX05PVElDRV9GSUxFU19PVVQpLCQoUFJJVkFURV9OT1RJQ0VfRklMRVNfSU5URVJNRURJQVRFUykpCitpZmRlZiBUQVJHRVRfMk5EX0FSQ0gKKwkkKGNhbGwgcHJpdmF0ZS1jb3B5LXZuZGstaW50ZXJtZWRpYXRlcywgXAorCQkkKFBSSVZBVEVfVk5ES19DT1JFX09VVF8yTkQpLCQoUFJJVkFURV9WTkRLX0NPUkVfSU5URVJNRURJQVRFU18yTkQpKQorCSQoY2FsbCBwcml2YXRlLWNvcHktdm5kay1pbnRlcm1lZGlhdGVzLCBcCisJCSQoUFJJVkFURV9WTkRLX1NQX09VVF8yTkQpLCQoUFJJVkFURV9WTkRLX1NQX0lOVEVSTUVESUFURVNfMk5EKSkKK2VuZGlmCisJJChoaWRlKSAkKFNPT05HX1pJUCkgLW8gJEAgLUMgJChQUklWQVRFX1ZOREtfU05BUFNIT1RfT1VUKSAtRCAkKFBSSVZBVEVfVk5ES19TTkFQU0hPVF9PVVQpCisKKy5QSE9OWTogdm5kawordm5kazogJCh2bmRrX3NuYXBzaG90X3ppcCkKKworJChjYWxsIGRpc3QtZm9yLWdvYWxzLCB2bmRrLCAkKHZuZGtfc25hcHNob3RfemlwKSkKKworIyBjbGVhciBnbG9iYWwgdmFycworY2xhbmctdWJzYW4tdm5kay1jb3JlIDo9CitwYXRocy1vZi1pbnRlcm1lZGlhdGVzIDo9CitwYXRocy1vZi1ub3RpY2UtZmlsZXMgOj0KK3ZuZGtfY29yZV9saWJzIDo9Cit2bmRrX3NwX2xpYnMgOj0KK3ZuZGtfc25hcHNob3RfbGlicyA6PQordm5ka19wcmVidWlsdF90eHRzIDo9Cit2bmRrX3NuYXBzaG90X2NvbmZpZ3MgOj0KK3ZuZGtfc25hcHNob3RfdG9wIDo9Cit2bmRrX3NuYXBzaG90X291dCA6PQordm5ka19zbmFwc2hvdF9jb25maWdzX291dCA6PQordm5ka19zbmFwc2hvdF92YXJpYW50IDo9CitiaW5kZXIgOj0KK3ZuZGtfbGliX2RpciA6PQordm5ka19saWJfZGlyXzJuZCA6PQordm5ka19zbmFwc2hvdF9kZXBlbmRlbmNpZXMgOj0KKworZWxzZSAjIEJPQVJEX1ZOREtfUlVOVElNRV9ESVNBQkxFIGlzIHNldCB0byAndHJ1ZScKK2Vycm9yX21zZyA6PSAiQ0FOTk9UIGdlbmVyYXRlIFZOREsgc25hcHNob3QuIEJPQVJEX1ZOREtfUlVOVElNRV9ESVNBQkxFIG11c3Qgbm90IGJlIHNldCB0byAndHJ1ZScuIgorZW5kaWYgIyBCT0FSRF9WTkRLX1JVTlRJTUVfRElTQUJMRQorCitlbHNlICMgUExBVEZPUk1fVk5ES19WRVJTSU9OIGlzIE5PVCBzZXQKK2Vycm9yX21zZyA6PSAiQ0FOTk9UIGdlbmVyYXRlIFZOREsgc25hcHNob3QuIFBMQVRGT1JNX1ZOREtfVkVSU0lPTiBtdXN0IGJlIHNldC4iCitlbmRpZiAjIFBMQVRGT1JNX1ZOREtfVkVSU0lPTgorCitlbHNlICMgQk9BUkRfVk5ES19WRVJTSU9OIGlzIE5PVCBzZXQgdG8gJ2N1cnJlbnQnCitlcnJvcl9tc2cgOj0gIkNBTk5PVCBnZW5lcmF0ZSBWTkRLIHNuYXBzaG90LiBCT0FSRF9WTkRLX1ZFUlNJT04gbXVzdCBiZSBzZXQgdG8gJ2N1cnJlbnQnLiIKK2VuZGlmICMgQk9BUkRfVk5ES19WRVJTSU9OCisKK2lmbmVxICgsJChlcnJvcl9tc2cpKQorCisuUEhPTlk6IHZuZGsKK3ZuZGs6CisJJChjYWxsIGVjaG8tZXJyb3IsJChjdXJyZW50X21ha2VmaWxlKSwkKGVycm9yX21zZykpCisJZXhpdCAxCisKK2VuZGlmCmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RfY29uZmlnX2NvbW1vbi5tayBiL2NvcmUvdGVzdF9jb25maWdfY29tbW9uLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4N2Y5ZjIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Rlc3RfY29uZmlnX2NvbW1vbi5tawpAQCAtMCwwICsxLDU2IEBACisjCisjIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitMT0NBTF9NT0RVTEVfQ0xBU1MgOj0gVEVTVF9DT05GSUcKKworIyBPdXRwdXQgdGVzdCBjb25maWcgZmlsZXMgdG8gdGVzdGNhc2VzIGRpcmVjdG9yeS4KK2lmZXEgKCwkKGZpbHRlciBnZW5lcmFsLXRlc3RzLCAkKExPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUpKSkKKyAgTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSArPSBnZW5lcmFsLXRlc3RzCitlbmRpZgorCitMT0NBTF9NT0RVTEVfU1VGRklYIDo9IC5jb25maWcKKworbXlfdGVzdF9jb25maWdfZmlsZSA6PSAkKHdpbGRjYXJkICQoTE9DQUxfUEFUSCkvJChMT0NBTF9NT0RVTEUpLnhtbCkKK0xPQ0FMX1NSQ19GSUxFUyA6PQorCitpbmNsdWRlICQoQlVJTERfU1lTVEVNKS9iYXNlX3J1bGVzLm1rCisKKyMgVGhlIHRlc3QgY29uZmlnIGlzIG5vdCBpbiBhIHN0YW5kYWxvbmUgWE1MIGZpbGUuCitpZm5kZWYgbXlfdGVzdF9jb25maWdfZmlsZQorCitpZm5kZWYgTE9DQUxfVEVTVF9DT05GSUdfT1BUSU9OUworICAkKGNhbGwgcHJldHR5LWVycm9yLExPQ0FMX1RFU1RfQ09ORklHX09QVElPTlMgbXVzdCBiZSBzZXQgaWYgdGhlIHRlc3QgWE1MIGZpbGUgaXMgbm90IHByb3ZpZGVkLikKK2VuZGlmCisKK215X2Jhc2VfdGVzdF9jb25maWdfZmlsZSA6PSAkKExPQ0FMX1BBVEgpL0FuZHJvaWRUZXN0LnhtbAorbXlfdGVzdF9jb25maWdfZmlsZSA6PSAkKGRpciAkKExPQ0FMX0JVSUxUX01PRFVMRSkpQW5kcm9pZFRlc3QueG1sCisKKyQobXlfdGVzdF9jb25maWdfZmlsZSkgOiBQUklWQVRFX3Rlc3RfY29uZmlnX29wdGlvbnMgOj0gJChMT0NBTF9URVNUX0NPTkZJR19PUFRJT05TKQorJChteV90ZXN0X2NvbmZpZ19maWxlKSA6ICQobXlfYmFzZV90ZXN0X2NvbmZpZ19maWxlKQorCUBlY2hvICJDcmVhdGUgJChub3RkaXIgJEApIHdpdGggb3B0aW9uczogJChQUklWQVRFX3Rlc3RfY29uZmlnX29wdGlvbnMpLiIKKwkkKGV2YWwgX29wdGlvbl94bWwgOj0gXAorCQkkKGZvcmVhY2ggb3B0aW9uLCQoUFJJVkFURV90ZXN0X2NvbmZpZ19vcHRpb25zKSwgXAorCQkJJChldmFsIHAgOj0gJChzdWJzdCA6LCQoc3BhY2UpLCQob3B0aW9uKSkpIFwKKwkJCTxvcHRpb24gbmFtZT0iJCh3b3JkIDEsJChwKSkiIHZhbHVlPSIkKHdvcmQgMiwkKHApKSIgXC8+XG4pKQorCSQoaGlkZSkgc2VkICdzJjwvY29uZmlndXJhdGlvbj4mJChfb3B0aW9uX3htbCk8L2NvbmZpZ3VyYXRpb24+JicgJDwgPiAkQAorCitlbmRpZiAjIG15X3Rlc3RfY29uZmlnX2ZpbGUKKworJChMT0NBTF9CVUlMVF9NT0RVTEUpIDogJChteV90ZXN0X2NvbmZpZ19maWxlKQorCSQoY29weS1maWxlLXRvLXRhcmdldCkKKworbXlfYmFzZV90ZXN0X2NvbmZpZ19maWxlIDo9CitteV90ZXN0X2NvbmZpZ19maWxlIDo9CmRpZmYgLS1naXQgYS9jb3JlL3ZlcmlmeV91c2VzX2xpYnJhcmllcy5zaCBiL2NvcmUvdmVyaWZ5X3VzZXNfbGlicmFyaWVzLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjgxMzViZTYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3ZlcmlmeV91c2VzX2xpYnJhcmllcy5zaApAQCAtMCwwICsxLDQ1IEBACisjIS9iaW4vYmFzaAorIworIyBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworCisjIFBhcnNlIHNkaywgdGFyZ2V0U2RrLCBhbmQgdXNlcyBsaWJyYXJlcyBpbiB0aGUgQVBLLCB0aGVuIGNyb3NzIHJlZmVyZW5jZSBhZ2FpbnN0IGJ1aWxkIHNwZWNpZmllZCBvbmVzLgorCitzZXQgLWUKK2xvY2FsX2Fwaz0kMQorYmFkZ2luZz0kKGFhcHQgZHVtcCBiYWRnaW5nICIke2xvY2FsX2Fwa30iKQorZXhwb3J0IHNka192ZXJzaW9uPSQoZWNobyAiJHtiYWRnaW5nfSIgfCBncmVwICJzZGtWZXJzaW9uIiB8IHNlZCAtbiAicy9zZGtWZXJzaW9uOidcKC4qXCknL1wxL3AiKQorIyBFeHBvcnQgdGFyZ2V0X3Nka192ZXJzaW9uIHRvIHRoZSBjYWxsZXIuCitleHBvcnQgdGFyZ2V0X3Nka192ZXJzaW9uPSQoZWNobyAiJHtiYWRnaW5nfSIgfCBncmVwICJ0YXJnZXRTZGtWZXJzaW9uIiB8IHNlZCAtbiAicy90YXJnZXRTZGtWZXJzaW9uOidcKC4qXCknL1wxL3AiKQordXNlc19saWJyYXJpZXM9JChlY2hvICIke2JhZGdpbmd9IiB8IGdyZXAgInVzZXMtbGlicmFyeSIgfCBzZWQgLW4gInMvdXNlcy1saWJyYXJ5OidcKC4qXCknL1wxL3AiKQorb3B0aW9uYWxfdXNlc19saWJyYXJpZXM9JChlY2hvICIke2JhZGdpbmd9IiB8IGdyZXAgInVzZXMtbGlicmFyeS1ub3QtcmVxdWlyZWQiIHwgc2VkIC1uICJzL3VzZXMtbGlicmFyeS1ub3QtcmVxdWlyZWQ6J1woLipcKScvXDEvcCIpCisKKyMgVmVyaWZ5IHRoYXQgdGhlIHVzZXMgbGlicmFyaWVzIG1hdGNoIGV4YWN0bHkuCisjIEN1cnJlbnRseSB3ZSB2YWxpZGF0ZSB0aGUgb3JkZXJpbmcgb2YgdGhlIGxpYnJhcmllcyBzaW5jZSBpdCBtYXR0ZXJzIGZvciByZXNvbHV0aW9uLgorc2luZ2xlX2xpbmVfbGlicz0kKGVjaG8gIiR7dXNlc19saWJyYXJpZXN9IiB8IHRyICdcbicgJyAnIHwgYXdrICd7JDE9JDF9MScpCitpZiBbWyAiJHtzaW5nbGVfbGluZV9saWJzfSIgIT0gIiR7dXNlc19saWJyYXJ5X25hbWVzfSIgXV07IHRoZW4KKyAgZWNobyAiTE9DQUxfVVNFU19MSUJSQVJJRVMgKCR7dXNlc19saWJyYXJ5X25hbWVzfSkiIFwKKyAgICAgICAiZG8gbm90IG1hdGNoICgke3NpbmdsZV9saW5lX2xpYnN9KSBpbiBtYW5pZmVzdCBmb3IgJHtsb2NhbF9hcGt9IgorICBleGl0IDEKK2ZpCisKKyMgVmVyaWZ5IHRoYXQgdGhlIG9wdGlvbmFsIHVzZXMgbGlicmFyaWVzIG1hdGNoIGV4YWN0bHkuCitzaW5nbGVfbGluZV9vcHRpb25hbF9saWJzPSQoZWNobyAiJHtvcHRpb25hbF91c2VzX2xpYnJhcmllc30iIHwgdHIgJ1xuJyAnICcgfCBhd2sgJ3skMT0kMX0xJykKK2lmIFtbICIke3NpbmdsZV9saW5lX29wdGlvbmFsX2xpYnN9IiAhPSAiJHtvcHRpb25hbF91c2VzX2xpYnJhcnlfbmFtZXN9IiBdXTsgdGhlbgorICBlY2hvICJMT0NBTF9PUFRJT05BTF9VU0VTX0xJQlJBUklFUyAoJHtvcHRpb25hbF91c2VzX2xpYnJhcnlfbmFtZXN9KSAiIFwKKyAgICAgICAiZG8gbm90IG1hdGNoICgke3NpbmdsZV9saW5lX29wdGlvbmFsX2xpYnN9KSBpbiBtYW5pZmVzdCBmb3IgJHtsb2NhbF9hcGt9IgorICBleGl0IDEKK2ZpCisKZGlmZiAtLWdpdCBhL2NvcmUvdmVyc2lvbl9kZWZhdWx0cy5tayBiL2NvcmUvdmVyc2lvbl9kZWZhdWx0cy5tawppbmRleCBmOTllODA2Li43ZjFmMThjIDEwMDY0NAotLS0gYS9jb3JlL3ZlcnNpb25fZGVmYXVsdHMubWsKKysrIGIvY29yZS92ZXJzaW9uX2RlZmF1bHRzLm1rCkBAIC0yNCw4ICsyNCw5IEBACiAjICAgICBERUZBVUxUX0FQUF9UQVJHRVRfU0RLCiAjICAgICBCVUlMRF9JRAogIyAgICAgQlVJTERfTlVNQkVSCi0jICAgICBCVUlMRF9EQVRFVElNRQogIyAgICAgUExBVEZPUk1fU0VDVVJJVFlfUEFUQ0gKKyMgICAgIFBMQVRGT1JNX1ZOREtfVkVSU0lPTgorIyAgICAgUExBVEZPUk1fU1lTVEVNU0RLX1ZFUlNJT05TCiAjCiAKICMgTG9vayBmb3IgYW4gb3B0aW9uYWwgZmlsZSBjb250YWluaW5nIG92ZXJyaWRlcyBvZiB0aGUgZGVmYXVsdHMsCkBAIC0zOCw5ICszOSw5IEBACiAgIGluY2x1ZGUgJChJTlRFUk5BTF9CVUlMRF9JRF9NQUtFRklMRSkKIGVuZGlmCiAKLURFRkFVTFRfUExBVEZPUk1fVkVSU0lPTiA6PSBPUE0xCi1NSU5fUExBVEZPUk1fVkVSU0lPTiA6PSBPUE0xCi1NQVhfUExBVEZPUk1fVkVSU0lPTiA6PSBPUE0xCitERUZBVUxUX1BMQVRGT1JNX1ZFUlNJT04gOj0gUFBSMQorTUlOX1BMQVRGT1JNX1ZFUlNJT04gOj0gUFBSMQorTUFYX1BMQVRGT1JNX1ZFUlNJT04gOj0gUFBSMQogCiBBTExPV0VEX1ZFUlNJT05TIDo9ICQoY2FsbCBhbGxvd2VkLXBsYXRmb3JtLXZlcnNpb25zLFwKICAgJChNSU5fUExBVEZPUk1fVkVSU0lPTiksXApAQCAtNzQsMTEgKzc1LDExIEBACiAjIHBsZWFzZSBhZGQgdGhhdCBQTEFURk9STV9WRVJTSU9OIGFzIHdlbGwgYXMgY2xlYW4gdXAgb2Jzb2xldGUgUExBVEZPUk1fVkVSU0lPTidzCiAjIGluIHRoZSBmb2xsb3dpbmcgdGV4dCBmaWxlOgogIyBjdHMvdGVzdHMvdGVzdHMvb3MvYXNzZXRzL3BsYXRmb3JtX3ZlcnNpb25zLnR4dAotUExBVEZPUk1fVkVSU0lPTi5PUE0xIDo9IDguMS4wCitQTEFURk9STV9WRVJTSU9OLlBQUjEgOj0gOQogCiAjIFRoZXNlIGFyZSB0aGUgY3VycmVudCBkZXZlbG9wbWVudCBjb2RlbmFtZXMsIGlmIHRoZSBidWlsZCBpcyBub3QgYSBmaW5hbAogIyByZWxlYXNlIGJ1aWxkLiAgSWYgdGhpcyBpcyBhIGZpbmFsIHJlbGVhc2UgYnVpbGQsIGl0IGlzIHNpbXBseSAiUkVMIi4KLVBMQVRGT1JNX1ZFUlNJT05fQ09ERU5BTUUuT1BNMSA6PSBSRUwKK1BMQVRGT1JNX1ZFUlNJT05fQ09ERU5BTUUuUFBSMSA6PSBSRUwKIAogaWZuZGVmIFBMQVRGT1JNX1ZFUlNJT04KICAgUExBVEZPUk1fVkVSU0lPTiA6PSAkKFBMQVRGT1JNX1ZFUlNJT04uJChUQVJHRVRfUExBVEZPUk1fVkVSU0lPTikpCkBAIC0xMDUsMTYgKzEwNiw3IEBACiAgICMgV2hlbiB5b3UgaW5jcmVtZW50IHRoZSBQTEFURk9STV9TREtfVkVSU0lPTiBwbGVhc2UgZW5zdXJlIHlvdSBhbHNvCiAgICMgY2xlYXIgb3V0IHRoZSBmb2xsb3dpbmcgdGV4dCBmaWxlIG9mIGFsbCBvbGRlciBQTEFURk9STV9WRVJTSU9OJ3M6CiAgICMgY3RzL3Rlc3RzL3Rlc3RzL29zL2Fzc2V0cy9wbGF0Zm9ybV92ZXJzaW9ucy50eHQKLSAgUExBVEZPUk1fU0RLX1ZFUlNJT04gOj0gMjcKLWVuZGlmCi0KLWlmbmRlZiBQTEFURk9STV9KQUNLX01JTl9TREtfVkVSU0lPTgotICAjIFRoaXMgaXMgZGVmaW5pdGlvbiBvZiB0aGUgbWluIFNESyB2ZXJzaW9uIGdpdmVuIHRvIEphY2sgZm9yIHRoZSBjdXJyZW50Ci0gICMgcGxhdGZvcm0uIEZvciByZWxlYXNlZCB2ZXJzaW9uIGl0IHNob3VsZCBiZSB0aGUgc2FtZSBhcwotICAjIFBMQVRGT1JNX1NES19WRVJTSU9OLiBEdXJpbmcgZGV2ZWxvcG1lbnQsIHRoaXMgbnVtYmVyIG1heSBiZSBpbmNyZW1lbnRlZAotICAjIGJlZm9yZSBQTEFURk9STV9TREtfVkVSU0lPTiBpZiB0aGUgcGxhdGZvcm0gc3RhcnRzIHRvIGFkZCBuZXcgamF2YQotICAjIGxhbmd1YWdlIHN1cHBvcnRzLgotICBQTEFURk9STV9KQUNLX01JTl9TREtfVkVSU0lPTiA6PSBvLWIxCisgIFBMQVRGT1JNX1NES19WRVJTSU9OIDo9IDI4CiBlbmRpZgogCiBpZm5kZWYgUExBVEZPUk1fVkVSU0lPTl9DT0RFTkFNRQpAQCAtMTI0LDE0ICsxMTYsMTcgQEAKICAgICBQTEFURk9STV9WRVJTSU9OX0NPREVOQU1FIDo9ICQoVEFSR0VUX1BMQVRGT1JNX1ZFUlNJT04pCiAgIGVuZGlmCiAKLSAgIyBUaGlzIGlzIGFsbCBvZiB0aGUgZGV2ZWxvcG1lbnQgY29kZW5hbWVzIHRoYXQgYXJlIGFjdGl2ZS4gIFNob3VsZCBiZSBlaXRoZXIKLSAgIyB0aGUgc2FtZSBhcyBQTEFURk9STV9WRVJTSU9OX0NPREVOQU1FIG9yIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgYWRkaXRpb25hbAotICAjIGNvZGVuYW1lcyBhZnRlciBQTEFURk9STV9WRVJTSU9OX0NPREVOQU1FLgorICAjIFRoaXMgaXMgYWxsIG9mIHRoZSAqYWN0aXZlKiBkZXZlbG9wbWVudCBjb2RlbmFtZXMuIFRoZXJlIGFyZSBmdXR1cmUKKyAgIyBjb2RlbmFtZXMgbm90IGluY2x1ZGVkIGluIHRoaXMgbGlzdC4gVGhpcyBjb25mdXNpbmcgbmFtZSBpcyBuZWVkZWQgYmVjYXVzZQorICAjIGFsbF9jb2RlbmFtZXMgaGFzIGJlZW4gYmFrZWQgaW50byBidWlsZC5wcm9wIGZvciBhZ2VzLgorICAjCisgICMgU2hvdWxkIGJlIGVpdGhlciB0aGUgc2FtZSBhcyBQTEFURk9STV9WRVJTSU9OX0NPREVOQU1FIG9yIGEgY29tbWEtc2VwYXJhdGVkCisgICMgbGlzdCBvZiBhZGRpdGlvbmFsIGNvZGVuYW1lcyBhZnRlciBQTEFURk9STV9WRVJTSU9OX0NPREVOQU1FLgogICBQTEFURk9STV9WRVJTSU9OX0FMTF9DT0RFTkFNRVMgOj0KIAotICAjIEJ1aWxkIGEgbGlzdCBvZiBhbGwgcG9zc2libGUgY29kZSBuYW1lcy4gQXZvaWQgZHVwbGljYXRlcywgYW5kIHN0b3Agd2hlbiB3ZQorICAjIEJ1aWxkIGEgbGlzdCBvZiBhbGwgYWN0aXZlIGNvZGUgbmFtZXMuIEF2b2lkIGR1cGxpY2F0ZXMsIGFuZCBzdG9wIHdoZW4gd2UKICAgIyByZWFjaCBhIGNvZGVuYW1lIHRoYXQgbWF0Y2hlcyBQTEFURk9STV9WRVJTSU9OX0NPREVOQU1FIChhbnl0aGluZyBiZXlvbmQKLSAgIyB0aGF0IGlzIG5vdCBpbmNsdWRlZCBpbiBvdXIgYnVpbGQuCisgICMgdGhhdCBpcyBub3QgaW5jbHVkZWQgaW4gb3VyIGJ1aWxkKS4KICAgX3ZlcnNpb25zX2luX3RhcmdldCA6PSBcCiAgICAgJChjYWxsIGZpbmRfYW5kX2VhcmxpZXIsJChBTExfVkVSU0lPTlMpLCQoVEFSR0VUX1BMQVRGT1JNX1ZFUlNJT04pKQogICAkKGZvcmVhY2ggdmVyc2lvbiwkKF92ZXJzaW9uc19pbl90YXJnZXQpLFwKQEAgLTEzOSw5ICsxMzQsMjMgQEAKICAgICAkKGlmICQoZmlsdGVyICQoX2NvZGVuYW1lKSwkKFBMQVRGT1JNX1ZFUlNJT05fQUxMX0NPREVOQU1FUykpLCxcCiAgICAgICAkKGV2YWwgUExBVEZPUk1fVkVSU0lPTl9BTExfQ09ERU5BTUVTICs9ICQoX2NvZGVuYW1lKSkpKQogCisgICMgVGhpcyBpcyBhbGwgb2YgdGhlIGluYWN0aXZlIGRldmVsb3BtZW50IGNvZGVuYW1lcy4gQXZhaWxhYmxlIHRvIGJlIHRhcmdldGVkCisgICMgaW4gdGhpcyBicmFuY2ggYnV0IGluIHRoZSBmdXR1cmUgcmVsYXRpdmUgdG8gb3VyIGN1cnJlbnQgdGFyZ2V0LgorICBQTEFURk9STV9WRVJTSU9OX0ZVVFVSRV9DT0RFTkFNRVMgOj0KKworICAjIEJ1aWxkIGEgbGlzdCBvZiBhbGwgdW50YXJnZXRlZCBjb2RlIG5hbWVzLiBBdm9pZCBkdXBsaWNhdGVzLgorICBfdmVyc2lvbnNfbm90X2luX3RhcmdldCA6PSBcCisgICAgJChmaWx0ZXItb3V0ICQoUExBVEZPUk1fVkVSU0lPTl9BTExfQ09ERU5BTUVTKSwkKEFMTF9WRVJTSU9OUykpCisgICQoZm9yZWFjaCB2ZXJzaW9uLCQoX3ZlcnNpb25zX25vdF9pbl90YXJnZXQpLFwKKyAgICAkKGV2YWwgX2NvZGVuYW1lIDo9ICQoUExBVEZPUk1fVkVSU0lPTl9DT0RFTkFNRS4kKHZlcnNpb24pKSlcCisgICAgJChpZiAkKGZpbHRlciAkKF9jb2RlbmFtZSksJChQTEFURk9STV9WRVJTSU9OX0ZVVFVSRV9DT0RFTkFNRVMpKSwsXAorICAgICAgJChldmFsIFBMQVRGT1JNX1ZFUlNJT05fRlVUVVJFX0NPREVOQU1FUyArPSAkKF9jb2RlbmFtZSkpKSkKKwogICAjIEFuZCBjb252ZXJ0IGZyb20gc3BhY2Ugc2VwYXJhdGVkIHRvIGNvbW1hIHNlcGFyYXRlZC4KICAgUExBVEZPUk1fVkVSU0lPTl9BTExfQ09ERU5BTUVTIDo9IFwKICAgICAkKHN1YnN0ICQoc3BhY2UpLCQoY29tbWEpLCQoc3RyaXAgJChQTEFURk9STV9WRVJTSU9OX0FMTF9DT0RFTkFNRVMpKSkKKyAgUExBVEZPUk1fVkVSU0lPTl9GVVRVUkVfQ09ERU5BTUVTIDo9IFwKKyAgICAkKHN1YnN0ICQoc3BhY2UpLCQoY29tbWEpLCQoc3RyaXAgJChQTEFURk9STV9WRVJTSU9OX0ZVVFVSRV9DT0RFTkFNRVMpKSkKIAogZW5kaWYKIApAQCAtMTc1LDYgKzE4NCw0NyBAQAogICBlbmRpZgogZW5kaWYKIAoraWZuZGVmIFBMQVRGT1JNX1ZOREtfVkVSU0lPTgorICAjIFRoaXMgaXMgdGhlIGRlZmluaXRpb24gb2YgdGhlIFZOREsgdmVyc2lvbiBmb3IgdGhlIGN1cnJlbnQgVk5ESyBsaWJyYXJpZXMuCisgICMgVGhlIHZlcnNpb24gaXMgb25seSBhdmFpbGFibGUgd2hlbiBQTEFURk9STV9WRVJTSU9OX0NPREVOQU1FID09IFJFTC4KKyAgIyBPdGhlcndpc2UsIGl0IHdpbGwgYmUgc2V0IHRvIGEgQ09ERU5BTUUgdmVyc2lvbi4gVGhlIEFCSSBpcyBhbGxvd2VkIHRvIGJlCisgICMgY2hhbmdlZCBvbmx5IGJlZm9yZSB0aGUgQW5kcm9pZCB2ZXJzaW9uIGlzIHJlbGVhc2VkLiBPbmNlCisgICMgUExBVEZPUk1fVk5ES19WRVJTSU9OIGlzIHNldCB0byBhY3R1YWwgdmVyc2lvbiwgdGhlIEFCSSBmb3IgdGhpcyB2ZXJzaW9uCisgICMgd2lsbCBiZSBmcm96b24gYW5kIGVtaXQgYnVpbGQgZXJyb3JzIGlmIGFueSBBQkkgZm9yIHRoZSBWTkRLIGxpYnMgYXJlCisgICMgY2hhbmdlZC4KKyAgIyBBZnRlciB0aGF0IHRoZSBzbmFwc2hvdCBvZiB0aGUgVk5ESyB3aXRoIHRoaXMgdmVyc2lvbiB3aWxsIGJlIGdlbmVyYXRlZC4KKyAgIworICAjIFRoZSBWTkRLIHZlcnNpb24gZm9sbG93cyBQTEFURk9STV9TREtfVkVSU0lPTi4KKyAgaWZlcSAoUkVMLCQoUExBVEZPUk1fVkVSU0lPTl9DT0RFTkFNRSkpCisgICAgUExBVEZPUk1fVk5ES19WRVJTSU9OIDo9ICQoUExBVEZPUk1fU0RLX1ZFUlNJT04pCisgIGVsc2UKKyAgICBQTEFURk9STV9WTkRLX1ZFUlNJT04gOj0gJChQTEFURk9STV9WRVJTSU9OX0NPREVOQU1FKQorICBlbmRpZgorZW5kaWYKKworaWZuZGVmIFBMQVRGT1JNX1NZU1RFTVNES19NSU5fVkVSU0lPTgorICAjIFRoaXMgaXMgdGhlIG9sZGVzdCB2ZXJzaW9uIG9mIHN5c3RlbSBTREsgdGhhdCB0aGUgcGxhdGZvcm0gc3VwcG9ydHMuIENvbnRyYXJ5CisgICMgdG8gdGhlIHB1YmxpYyBTREsgd2hlcmUgcGxhdGZvcm0gZXNzZW50aWFsbHkgc3VwcG9ydHMgYWxsIHByZXZpb3VzIFNESyB2ZXJzaW9ucywKKyAgIyBwbGF0Zm9ybSBzdXBwb3J0cyBvbmx5IGEgZmV3IG51bWJlciBvZiByZWNlbnQgc3lzdGVtIFNESyB2ZXJzaW9ucyBhcyBzb21lIG9mCisgICMgb2xkIHN5c3RlbSBBUElzIGFyZSBncmFkdWFsbHkgZGVwcmVjYXRlZCwgcmVtb3ZlZCBhbmQgdGhlbiBkZWxldGVkLgorICBQTEFURk9STV9TWVNURU1TREtfTUlOX1ZFUlNJT04gOj0gMjgKK2VuZGlmCisKKyMgVGhpcyBpcyB0aGUgbGlzdCBvZiBzeXN0ZW0gU0RLIHZlcnNpb25zIHRoYXQgdGhlIGN1cnJlbnQgcGxhdGZvcm0gc3VwcG9ydHMuCitQTEFURk9STV9TWVNURU1TREtfVkVSU0lPTlMgOj0KK2lmbmVxICgsJChQTEFURk9STV9TWVNURU1TREtfTUlOX1ZFUlNJT04pKQorICAkKGlmICQoY2FsbCBtYXRoX2lzX251bWJlciwkKFBMQVRGT1JNX1NZU1RFTVNES19NSU5fVkVSU0lPTikpLCxcCisgICAgJChlcnJvciBQTEFURk9STV9TWVNURU1TREtfTUlOX1ZFUlNJT04gbXVzdCBiZSBhIG51bWJlciwgYnV0IHdhcyAkKFBMQVRGT1JNX1NZU1RFTVNES19NSU5fVkVSU0lPTikpKQorICBQTEFURk9STV9TWVNURU1TREtfVkVSU0lPTlMgOj0gJChjYWxsIGludF9yYW5nZV9saXN0LCQoUExBVEZPUk1fU1lTVEVNU0RLX01JTl9WRVJTSU9OKSwkKFBMQVRGT1JNX1NES19WRVJTSU9OKSkKK2VuZGlmCisjIFBsYXRmb3JtIGFsd2F5cyBzdXBwb3J0cyB0aGUgY3VycmVudCB2ZXJzaW9uCitpZmVxIChSRUwsJChQTEFURk9STV9WRVJTSU9OX0NPREVOQU1FKSkKKyAgUExBVEZPUk1fU1lTVEVNU0RLX1ZFUlNJT05TICs9ICQoUExBVEZPUk1fU0RLX1ZFUlNJT04pCitlbHNlCisgIFBMQVRGT1JNX1NZU1RFTVNES19WRVJTSU9OUyArPSAkKFBMQVRGT1JNX1ZFUlNJT05fQ09ERU5BTUUpCitlbmRpZgorUExBVEZPUk1fU1lTVEVNU0RLX1ZFUlNJT05TIDo9ICQoc3RyaXAgJChzb3J0ICQoUExBVEZPUk1fU1lTVEVNU0RLX1ZFUlNJT05TKSkpCisKIGlmbmRlZiBQTEFURk9STV9TRUNVUklUWV9QQVRDSAogICAgICMgIFVzZWQgdG8gaW5kaWNhdGUgdGhlIHNlY3VyaXR5IHBhdGNoIHRoYXQgaGFzIGJlZW4gYXBwbGllZCB0byB0aGUgZGV2aWNlLgogICAgICMgIEl0IG11c3Qgc2lnbmlmeSB0aGF0IHRoZSBidWlsZCBpbmNsdWRlcyBhbGwgc2VjdXJpdHkgcGF0Y2hlcyBpc3N1ZWQgdXAgdGhyb3VnaCB0aGUgZGVzaWduYXRlZCBBbmRyb2lkIFB1YmxpYyBTZWN1cml0eSBCdWxsZXRpbi4KQEAgLTE4NCw2ICsyMzQsMTYgQEAKICAgICAgIFBMQVRGT1JNX1NFQ1VSSVRZX1BBVENIIDo9IDIwMjEtMDMtMDEKIGVuZGlmCiAKK2lmbmRlZiBQTEFURk9STV9TRUNVUklUWV9QQVRDSF9USU1FU1RBTVAKKyAgIyBVc2VkIHRvIGluZGljYXRlIHRoZSBtYXRjaGluZyB0aW1lc3RhbXAgZm9yIHRoZSBzZWN1cml0eSBwYXRjaCBzdHJpbmcgaW4gUExBVEZPUk1fU0VDVVJJVFlfUEFUQ0guCisgIGlmbmVxICgsJChmaW5kc3RyaW5nIERhcndpbiwkKFVOQU1FKSkpCisgICAgUExBVEZPUk1fU0VDVVJJVFlfUEFUQ0hfVElNRVNUQU1QIDo9ICQoc2hlbGwgZGF0ZSAtamYgJyVZLSVtLSVkICVUICVaJyAnJChQTEFURk9STV9TRUNVUklUWV9QQVRDSCkgMDA6MDA6MDAgR01UJyArJXMpCisgIGVsc2UKKyAgICBQTEFURk9STV9TRUNVUklUWV9QQVRDSF9USU1FU1RBTVAgOj0gJChzaGVsbCBkYXRlIC1kICdUWj0iR01UIiAkKFBMQVRGT1JNX1NFQ1VSSVRZX1BBVENIKScgKyVzKQorICBlbmRpZgorZW5kaWYKKy5LQVRJX1JFQURPTkxZIDo9IFBMQVRGT1JNX1NFQ1VSSVRZX1BBVENIX1RJTUVTVEFNUAorCiBpZm5kZWYgUExBVEZPUk1fQkFTRV9PUwogICAjIFVzZWQgdG8gaW5kaWNhdGUgdGhlIGJhc2Ugb3MgYXBwbGllZCB0byB0aGUgZGV2aWNlLgogICAjIENhbiBiZSBhbiBhcmJpdHJhcnkgc3RyaW5nLCBidXQgbXVzdCBiZSBhIHNpbmdsZSB3b3JkLgpAQCAtMjA3LDEyICsyNjcsMTggQEAKICAgQlVJTERfREFURVRJTUUgOj0gJChzaGVsbCBkYXRlICslcykKIGVuZGlmCiAKLWlmbmVxICgsJChmaW5kc3RyaW5nIERhcndpbiwkKHNoZWxsIHVuYW1lIC1zbSkpKQoraWZuZXEgKCwkKGZpbmRzdHJpbmcgRGFyd2luLCQoVU5BTUUpKSkKIERBVEUgOj0gZGF0ZSAtciAkKEJVSUxEX0RBVEVUSU1FKQogZWxzZQogREFURSA6PSBkYXRlIC1kIEAkKEJVSUxEX0RBVEVUSU1FKQogZW5kaWYKIAorIyBFdmVyeXRoaW5nIHNob3VsZCBiZSB1c2luZyBCVUlMRF9EQVRFVElNRV9GUk9NX0ZJTEUgaW5zdGVhZC4KKyMgQlVJTERfREFURVRJTUUgYW5kIERBVEUgY2FuIGJlIHJlbW92ZWQgb25jZSBCVUlMRF9OVU1CRVIgbW92ZXMKKyMgdG8gc29vbmdfdWkuCitCVUlMRF9EQVRFVElNRSA6PQorCitIQVNfQlVJTERfTlVNQkVSIDo9IHRydWUKIGlmbmRlZiBCVUlMRF9OVU1CRVIKICAgIyBCVUlMRF9OVU1CRVIgc2hvdWxkIGJlIHNldCB0byB0aGUgc291cmNlIGNvbnRyb2wgdmFsdWUgdGhhdAogICAjIHJlcHJlc2VudHMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHNvdXJjZSBjb2RlLiAgRS5nLiwgYQpAQCAtMjI0LDQgKzI5MCwxMiBAQAogICAjIGZyb20gdGhpcyBkYXRlL3RpbWUiIHZhbHVlLiAgTWFrZSBpdCBzdGFydCB3aXRoIGEgbm9uLWRpZ2l0IHNvIHRoYXQKICAgIyBhbnlvbmUgdHJ5aW5nIHRvIHBhcnNlIGl0IGFzIGFuIGludGVnZXIgd2lsbCBwcm9iYWJseSBnZXQgIjAiLgogICBCVUlMRF9OVU1CRVIgOj0gZW5nLiQoc2hlbGwgZWNobyAkJHtVU0VSOjA6Nn0pLiQoc2hlbGwgJChEQVRFKSArJVklbSVkLiVIJU0lUykKKyAgSEFTX0JVSUxEX05VTUJFUiA6PSBmYWxzZQorZW5kaWYKKworaWZuZGVmIFBMQVRGT1JNX01JTl9TVVBQT1JURURfVEFSR0VUX1NES19WRVJTSU9OCisgICMgVXNlZCB0byBzZXQgbWluaW11bSBzdXBwb3J0ZWQgdGFyZ2V0IHNkayB2ZXJzaW9uLiBBcHBzIHRhcmdldGluZyBzZGsKKyAgIyB2ZXJzaW9uIGxvd2VyIHRoYW4gdGhlIHNldCB2YWx1ZSB3aWxsIGZhaWwgdG8gaW5zdGFsbCBhbmQgcnVuIG9uIGFuZHJvaWQKKyAgIyBkZXZpY2UuCisgIFBMQVRGT1JNX01JTl9TVVBQT1JURURfVEFSR0VUX1NES19WRVJTSU9OIDo9IDE3CiBlbmRpZgpkaWZmIC0tZ2l0IGEvZW52c2V0dXAuc2ggYi9lbnZzZXR1cC5zaAppbmRleCA0Y2JlM2U3Li5jZjYxOTUwIDEwMDY0NAotLS0gYS9lbnZzZXR1cC5zaAorKysgYi9lbnZzZXR1cC5zaApAQCAtMSw4ICsxLDE0IEBACiBmdW5jdGlvbiBobW0oKSB7CiBjYXQgPDxFT0YKKworUnVuICJtIGhlbHAiIGZvciBoZWxwIHdpdGggdGhlIGJ1aWxkIHN5c3RlbSBpdHNlbGYuCisKIEludm9rZSAiLiBidWlsZC9lbnZzZXR1cC5zaCIgZnJvbSB5b3VyIHNoZWxsIHRvIGFkZCB0aGUgZm9sbG93aW5nIGZ1bmN0aW9ucyB0byB5b3VyIGVudmlyb25tZW50OgogLSBsdW5jaDogICAgIGx1bmNoIDxwcm9kdWN0X25hbWU+LTxidWlsZF92YXJpYW50PgotLSB0YXBhczogICAgIHRhcGFzIFs8QXBwMT4gPEFwcDI+IC4uLl0gW2FybXx4ODZ8bWlwc3xhcm12NXxhcm02NHx4ODZfNjR8bWlwczY0XSBbZW5nfHVzZXJkZWJ1Z3x1c2VyXQorICAgICAgICAgICAgIFNlbGVjdHMgPHByb2R1Y3RfbmFtZT4gYXMgdGhlIHByb2R1Y3QgdG8gYnVpbGQsIGFuZCA8YnVpbGRfdmFyaWFudD4gYXMgdGhlIHZhcmlhbnQgdG8KKyAgICAgICAgICAgICBidWlsZCwgYW5kIHN0b3JlcyB0aG9zZSBzZWxlY3Rpb25zIGluIHRoZSBlbnZpcm9ubWVudCB0byBiZSByZWFkIGJ5IHN1YnNlcXVlbnQKKyAgICAgICAgICAgICBpbnZvY2F0aW9ucyBvZiAnbScgZXRjLgorLSB0YXBhczogICAgIHRhcGFzIFs8QXBwMT4gPEFwcDI+IC4uLl0gW2FybXx4ODZ8bWlwc3xhcm02NHx4ODZfNjR8bWlwczY0XSBbZW5nfHVzZXJkZWJ1Z3x1c2VyXQogLSBjcm9vdDogICAgIENoYW5nZXMgZGlyZWN0b3J5IHRvIHRoZSB0b3Agb2YgdGhlIHRyZWUuCiAtIG06ICAgICAgICAgTWFrZXMgZnJvbSB0aGUgdG9wIG9mIHRoZSB0cmVlLgogLSBtbTogICAgICAgIEJ1aWxkcyBhbGwgb2YgdGhlIG1vZHVsZXMgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LCBidXQgbm90IHRoZWlyIGRlcGVuZGVuY2llcy4KQEAgLTQ1LDIwICs1MSwxOCBAQAogICAgIGNhY2hlZF92YXJzPWBjYXQgJFQvYnVpbGQvZW52c2V0dXAuc2ggfCB0ciAnKCknICcgICcgfCBhd2sgJ3tmb3IoaT0xO2k8PU5GO2krKykgaWYoJGl+L2dldF9idWlsZF92YXIvKSBwcmludCAkKGkrMSl9JyB8IHNvcnQgLXUgfCB0ciAnXG4nICcgJ2AKICAgICBjYWNoZWRfYWJzX3ZhcnM9YGNhdCAkVC9idWlsZC9lbnZzZXR1cC5zaCB8IHRyICcoKScgJyAgJyB8IGF3ayAne2ZvcihpPTE7aTw9TkY7aSsrKSBpZigkaX4vZ2V0X2Fic19idWlsZF92YXIvKSBwcmludCAkKGkrMSl9JyB8IHNvcnQgLXUgfCB0ciAnXG4nICcgJ2AKICAgICAjIENhbGwgdGhlIGJ1aWxkIHN5c3RlbSB0byBkdW1wIHRoZSAiPHZhbD49PHZhbHVlPiIgcGFpcnMgYXMgYSBzaGVsbCBzY3JpcHQuCi0gICAgYnVpbGRfZGljdHNfc2NyaXB0PWBcY2QgJFQ7IENBTExFRF9GUk9NX1NFVFVQPXRydWUgQlVJTERfU1lTVEVNPWJ1aWxkL2NvcmUgXAotICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZCBtYWtlIC0tbm8tcHJpbnQtZGlyZWN0b3J5IC1mIGJ1aWxkL2NvcmUvY29uZmlnLm1rIFwKLSAgICAgICAgICAgICAgICAgICAgICAgIGR1bXAtbWFueS12YXJzIFwKLSAgICAgICAgICAgICAgICAgICAgICAgIERVTVBfTUFOWV9WQVJTPSIkY2FjaGVkX3ZhcnMiIFwKLSAgICAgICAgICAgICAgICAgICAgICAgIERVTVBfTUFOWV9BQlNfVkFSUz0iJGNhY2hlZF9hYnNfdmFycyIgXAotICAgICAgICAgICAgICAgICAgICAgICAgRFVNUF9WQVJfUFJFRklYPSJ2YXJfY2FjaGVfIiBcCi0gICAgICAgICAgICAgICAgICAgICAgICBEVU1QX0FCU19WQVJfUFJFRklYPSJhYnNfdmFyX2NhY2hlXyJgCisgICAgYnVpbGRfZGljdHNfc2NyaXB0PWBcYnVpbHRpbiBjZCAkVDsgYnVpbGQvc29vbmcvc29vbmdfdWkuYmFzaCAtLWR1bXB2YXJzLW1vZGUgXAorICAgICAgICAgICAgICAgICAgICAgICAgLS12YXJzPSIkY2FjaGVkX3ZhcnMiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIC0tYWJzLXZhcnM9IiRjYWNoZWRfYWJzX3ZhcnMiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIC0tdmFyLXByZWZpeD12YXJfY2FjaGVfIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIC0tYWJzLXZhci1wcmVmaXg9YWJzX3Zhcl9jYWNoZV9gCiAgICAgbG9jYWwgcmV0PSQ/CiAgICAgaWYgWyAkcmV0IC1uZSAwIF0KICAgICB0aGVuCiAgICAgICAgIHVuc2V0IGJ1aWxkX2RpY3RzX3NjcmlwdAogICAgICAgICByZXR1cm4gJHJldAogICAgIGZpCi0gICAgIyBFeGN1dGUgdGhlIHNjcmlwdCB0byBzdG9yZSB0aGUgIjx2YWw+PTx2YWx1ZT4iIHBhaXJzIGFzIHNoZWxsIHZhcmlhYmxlcy4KKyAgICAjIEV4ZWN1dGUgdGhlIHNjcmlwdCB0byBzdG9yZSB0aGUgIjx2YWw+PTx2YWx1ZT4iIHBhaXJzIGFzIHNoZWxsIHZhcmlhYmxlcy4KICAgICBldmFsICIkYnVpbGRfZGljdHNfc2NyaXB0IgogICAgIHJldD0kPwogICAgIHVuc2V0IGJ1aWxkX2RpY3RzX3NjcmlwdApAQCAtOTksOCArMTAzLDcgQEAKICAgICAgICAgZWNobyAiQ291bGRuJ3QgbG9jYXRlIHRoZSB0b3Agb2YgdGhlIHRyZWUuICBUcnkgc2V0dGluZyBUT1AuIiA+JjIKICAgICAgICAgcmV0dXJuCiAgICAgZmkKLSAgICAoXGNkICRUOyBDQUxMRURfRlJPTV9TRVRVUD10cnVlIEJVSUxEX1NZU1RFTT1idWlsZC9jb3JlIFwKLSAgICAgIGNvbW1hbmQgbWFrZSAtLW5vLXByaW50LWRpcmVjdG9yeSAtZiBidWlsZC9jb3JlL2NvbmZpZy5tayBkdW1wdmFyLWFicy0kMSkKKyAgICAoXGNkICRUOyBidWlsZC9zb29uZy9zb29uZ191aS5iYXNoIC0tZHVtcHZhci1tb2RlIC0tYWJzICQxKQogfQogCiAjIEdldCB0aGUgZXhhY3QgdmFsdWUgb2YgYSBidWlsZCB2YXJpYWJsZS4KQEAgLTExNyw4ICsxMjAsNyBAQAogICAgICAgICBlY2hvICJDb3VsZG4ndCBsb2NhdGUgdGhlIHRvcCBvZiB0aGUgdHJlZS4gIFRyeSBzZXR0aW5nIFRPUC4iID4mMgogICAgICAgICByZXR1cm4KICAgICBmaQotICAgIChcY2QgJFQ7IENBTExFRF9GUk9NX1NFVFVQPXRydWUgQlVJTERfU1lTVEVNPWJ1aWxkL2NvcmUgXAotICAgICAgY29tbWFuZCBtYWtlIC0tbm8tcHJpbnQtZGlyZWN0b3J5IC1mIGJ1aWxkL2NvcmUvY29uZmlnLm1rIGR1bXB2YXItJDEpCisgICAgKFxjZCAkVDsgYnVpbGQvc29vbmcvc29vbmdfdWkuYmFzaCAtLWR1bXB2YXItbW9kZSAkMSkKIH0KIAogIyBjaGVjayB0byBzZWUgaWYgdGhlIHN1cHBsaWVkIHByb2R1Y3QgaXMgb25lIHdlIGNhbiBidWlsZApAQCAtMjM1LDcgKzIzNywxMiBAQAogICAgICAgICAgICAgOzsKICAgICBlc2FjCiAKLSAgICBleHBvcnQgQU5EUk9JRF9CVUlMRF9QQVRIUz0kKGdldF9idWlsZF92YXIgQU5EUk9JRF9CVUlMRF9QQVRIUyk6JEFORFJPSURfVE9PTENIQUlOOiRBTkRST0lEX1RPT0xDSEFJTl8yTkRfQVJDSDokQU5EUk9JRF9ERVZfU0NSSVBUUzoKKyAgICBBTkRST0lEX0JVSUxEX1BBVEhTPSQoZ2V0X2J1aWxkX3ZhciBBTkRST0lEX0JVSUxEX1BBVEhTKTokQU5EUk9JRF9UT09MQ0hBSU4KKyAgICBpZiBbIC1uICIkQU5EUk9JRF9UT09MQ0hBSU5fMk5EX0FSQ0giIF07IHRoZW4KKyAgICAgICAgQU5EUk9JRF9CVUlMRF9QQVRIUz0kQU5EUk9JRF9CVUlMRF9QQVRIUzokQU5EUk9JRF9UT09MQ0hBSU5fMk5EX0FSQ0gKKyAgICBmaQorICAgIEFORFJPSURfQlVJTERfUEFUSFM9JEFORFJPSURfQlVJTERfUEFUSFM6JEFORFJPSURfREVWX1NDUklQVFM6CisgICAgZXhwb3J0IEFORFJPSURfQlVJTERfUEFUSFMKIAogICAgICMgSWYgcHJlYnVpbHRzL2FuZHJvaWQtZW11bGF0b3IvPHN5c3RlbT4vIGV4aXN0cywgcHJlcGVuZCBpdCB0byBvdXIgUEFUSAogICAgICMgdG8gZW5zdXJlIHRoYXQgdGhlIGNvcnJlc3BvbmRpbmcgJ2VtdWxhdG9yJyBiaW5hcmllcyBhcmUgdXNlZC4KQEAgLTI1OCwxMyArMjY1LDExIEBACiAgICAgZXhwb3J0IFBBVEg9JEFORFJPSURfQlVJTERfUEFUSFMkUEFUSAogICAgIGV4cG9ydCBQWVRIT05QQVRIPSRUL2RldmVsb3BtZW50L3B5dGhvbi1wYWNrYWdlczokUFlUSE9OUEFUSAogCi0gICAgdW5zZXQgQU5EUk9JRF9KQVZBX1RPT0xDSEFJTgotICAgIHVuc2V0IEFORFJPSURfUFJFX0JVSUxEX1BBVEhTCi0gICAgaWYgWyAtbiAiJEpBVkFfSE9NRSIgXTsgdGhlbgotICAgICAgICBleHBvcnQgQU5EUk9JRF9KQVZBX1RPT0xDSEFJTj0kSkFWQV9IT01FL2JpbgotICAgICAgICBleHBvcnQgQU5EUk9JRF9QUkVfQlVJTERfUEFUSFM9JEFORFJPSURfSkFWQV9UT09MQ0hBSU46Ci0gICAgICAgIGV4cG9ydCBQQVRIPSRBTkRST0lEX1BSRV9CVUlMRF9QQVRIUyRQQVRICi0gICAgZmkKKyAgICBleHBvcnQgQU5EUk9JRF9KQVZBX0hPTUU9JChnZXRfYWJzX2J1aWxkX3ZhciBBTkRST0lEX0pBVkFfSE9NRSkKKyAgICBleHBvcnQgSkFWQV9IT01FPSRBTkRST0lEX0pBVkFfSE9NRQorICAgIGV4cG9ydCBBTkRST0lEX0pBVkFfVE9PTENIQUlOPSQoZ2V0X2Fic19idWlsZF92YXIgQU5EUk9JRF9KQVZBX1RPT0xDSEFJTikKKyAgICBleHBvcnQgQU5EUk9JRF9QUkVfQlVJTERfUEFUSFM9JEFORFJPSURfSkFWQV9UT09MQ0hBSU46CisgICAgZXhwb3J0IFBBVEg9JEFORFJPSURfUFJFX0JVSUxEX1BBVEhTJFBBVEgKIAogICAgIHVuc2V0IEFORFJPSURfUFJPRFVDVF9PVVQKICAgICBleHBvcnQgQU5EUk9JRF9QUk9EVUNUX09VVD0kKGdldF9hYnNfYnVpbGRfdmFyIFBST0RVQ1RfT1VUKQpAQCAtMjk3LDcgKzMwMiw2IEBACiBmdW5jdGlvbiBzZXRfc3R1ZmZfZm9yX2Vudmlyb25tZW50KCkKIHsKICAgICBzZXR0aXRsZQotICAgIHNldF9qYXZhX2hvbWUKICAgICBzZXRwYXRocwogICAgIHNldF9zZXF1ZW5jZV9udW1iZXIKIApAQCAtMzE0LDcgKzMxOCwxMiBAQAogCiBmdW5jdGlvbiBzZXR0aXRsZSgpCiB7Ci0gICAgaWYgWyAiJFNUQVlfT0ZGX01ZX0xBV04iID0gIiIgXTsgdGhlbgorICAgICMgVGhpcyB1c2VkIHRvIGJlIG9wdC1vdXQgd2l0aCBTVEFZX09GRl9NWV9MQVdOLCBidXQgdGhpcyBicmVha3MgZm9sa3MKKyAgICAjIGFjdHVhbGx5IHVzaW5nIFBST01QVF9DT01NQU5EIChodHRwczovL2lzc3VldHJhY2tlci5nb29nbGUuY29tLzM4NDAyMjU2KSwKKyAgICAjIGFuZCB0aGUgYXR0ZW1wdCB0byBzZXQgdGhlIHRpdGxlIGRvZXNuJ3QgZG8gYW55dGhpbmcgZm9yIHRoZSBkZWZhdWx0CisgICAgIyB3aW5kb3cgbWFuYWdlciBpbiBkZWJpYW4gcmlnaHQgbm93LCBzbyBzd2l0Y2ggaXQgdG8gb3B0LWluIGZvciBhbnlvbmUKKyAgICAjIHdobyBhY3R1YWxseSB3YW50cyB0aGlzLgorICAgIGlmIFsgIiRBTkRST0lEX0JVSUxEX1NFVF9XSU5ET1dfVElUTEUiID0gInRydWUiIF07IHRoZW4KICAgICAgICAgbG9jYWwgYXJjaD0kKGdldHRhcmdldGFyY2gpCiAgICAgICAgIGxvY2FsIHByb2R1Y3Q9JFRBUkdFVF9QUk9EVUNUCiAgICAgICAgIGxvY2FsIHZhcmlhbnQ9JFRBUkdFVF9CVUlMRF9WQVJJQU5UCkBAIC02NTEsMTAgKzY2MCwxNiBAQAogIyBSdW4gdGFwYXMgd2l0aCBvbmUgb3IgbW9yZSBhcHAgbmFtZXMgKGZyb20gTE9DQUxfUEFDS0FHRV9OQU1FKQogZnVuY3Rpb24gdGFwYXMoKQogewotICAgIGxvY2FsIGFyY2g9IiQoZWNobyAkKiB8IHhhcmdzIC1uIDEgZWNobyB8IFxncmVwIC1FICdeKGFybXx4ODZ8bWlwc3xhcm12NXxhcm02NHx4ODZfNjR8bWlwczY0KSQnIHwgeGFyZ3MpIgorICAgIGxvY2FsIHNob3dIZWxwPSIkKGVjaG8gJCogfCB4YXJncyAtbiAxIGVjaG8gfCBcZ3JlcCAtRSAnXihoZWxwKSQnIHwgeGFyZ3MpIgorICAgIGxvY2FsIGFyY2g9IiQoZWNobyAkKiB8IHhhcmdzIC1uIDEgZWNobyB8IFxncmVwIC1FICdeKGFybXx4ODZ8bWlwc3xhcm02NHx4ODZfNjR8bWlwczY0KSQnIHwgeGFyZ3MpIgogICAgIGxvY2FsIHZhcmlhbnQ9IiQoZWNobyAkKiB8IHhhcmdzIC1uIDEgZWNobyB8IFxncmVwIC1FICdeKHVzZXJ8dXNlcmRlYnVnfGVuZykkJyB8IHhhcmdzKSIKICAgICBsb2NhbCBkZW5zaXR5PSIkKGVjaG8gJCogfCB4YXJncyAtbiAxIGVjaG8gfCBcZ3JlcCAtRSAnXihsZHBpfG1kcGl8dHZkcGl8aGRwaXx4aGRwaXx4eGhkcGl8eHh4aGRwaXxhbGxkcGkpJCcgfCB4YXJncykiCi0gICAgbG9jYWwgYXBwcz0iJChlY2hvICQqIHwgeGFyZ3MgLW4gMSBlY2hvIHwgXGdyZXAgLUUgLXYgJ14odXNlcnx1c2VyZGVidWd8ZW5nfGFybXx4ODZ8bWlwc3xhcm12NXxhcm02NHx4ODZfNjR8bWlwczY0fGxkcGl8bWRwaXx0dmRwaXxoZHBpfHhoZHBpfHh4aGRwaXx4eHhoZHBpfGFsbGRwaSkkJyB8IHhhcmdzKSIKKyAgICBsb2NhbCBhcHBzPSIkKGVjaG8gJCogfCB4YXJncyAtbiAxIGVjaG8gfCBcZ3JlcCAtRSAtdiAnXih1c2VyfHVzZXJkZWJ1Z3xlbmd8YXJtfHg4NnxtaXBzfGFybTY0fHg4Nl82NHxtaXBzNjR8bGRwaXxtZHBpfHR2ZHBpfGhkcGl8eGhkcGl8eHhoZHBpfHh4eGhkcGl8YWxsZHBpKSQnIHwgeGFyZ3MpIgorCisgICAgaWYgWyAiJHNob3dIZWxwIiAhPSAiIiBdOyB0aGVuCisgICAgICAkKGdldHRvcCkvYnVpbGQvbWFrZS90YXBhc0hlbHAuc2gKKyAgICAgIHJldHVybgorICAgIGZpCiAKICAgICBpZiBbICQoZWNobyAkYXJjaCB8IHdjIC13KSAtZ3QgMSBdOyB0aGVuCiAgICAgICAgIGVjaG8gInRhcGFzOiBFcnJvcjogTXVsdGlwbGUgYnVpbGQgYXJjaHMgc3VwcGxpZWQ6ICRhcmNoIgpAQCAtNjczLDcgKzY4OCw2IEBACiAgICAgY2FzZSAkYXJjaCBpbgogICAgICAgeDg2KSAgICBwcm9kdWN0PWFvc3BfeDg2OzsKICAgICAgIG1pcHMpICAgcHJvZHVjdD1hb3NwX21pcHM7OwotICAgICAgYXJtdjUpICBwcm9kdWN0PWdlbmVyaWNfYXJtdjU7OwogICAgICAgYXJtNjQpICBwcm9kdWN0PWFvc3BfYXJtNjQ7OwogICAgICAgeDg2XzY0KSBwcm9kdWN0PWFvc3BfeDg2XzY0OzsKICAgICAgIG1pcHM2NCkgIHByb2R1Y3Q9YW9zcF9taXBzNjQ7OwpAQCAtNzAyLDcgKzcxNiw3IEBACiAKIGZ1bmN0aW9uIGdldHRvcAogewotICAgIGxvY2FsIFRPUEZJTEU9YnVpbGQvY29yZS9lbnZzZXR1cC5taworICAgIGxvY2FsIFRPUEZJTEU9YnVpbGQvbWFrZS9jb3JlL2VudnNldHVwLm1rCiAgICAgaWYgWyAtbiAiJFRPUCIgLWEgLWYgIiRUT1AvJFRPUEZJTEUiIF0gOyB0aGVuCiAgICAgICAgICMgVGhlIGZvbGxvd2luZyBjaXJjdW1sb2N1dGlvbiBlbnN1cmVzIHdlIHJlbW92ZSBzeW1saW5rcyBmcm9tIFRPUC4KICAgICAgICAgKGNkICRUT1A7IFBXRD0gL2Jpbi9wd2QpCkBAIC03MjcsMzMgKzc0MSwxMSBAQAogICAgIGZpCiB9CiAKLSMgUmV0dXJuIGRyaXZlciBmb3IgIm1ha2UiLCBpZiBhbnkgKGVnLiBzdGF0aWMgYW5hbHl6ZXIpCi1mdW5jdGlvbiBnZXRkcml2ZXIoKQotewotICAgIGxvY2FsIFQ9IiQxIgotICAgIHRlc3QgIiRXSVRIX1NUQVRJQ19BTkFMWVpFUiIgPSAiMCIgJiYgdW5zZXQgV0lUSF9TVEFUSUNfQU5BTFlaRVIKLSAgICBpZiBbIC1uICIkV0lUSF9TVEFUSUNfQU5BTFlaRVIiIF07IHRoZW4KLSAgICAgICAgIyBVc2Ugc2Nhbi1idWlsZCB0byBjb2xsZWN0IGFsbCBzdGF0aWMgYW5hbHl6ZXIgcmVwb3J0cyBpbnRvIGRpcmVjdG9yeQotICAgICAgICAjIC90bXAvc2Nhbi1idWlsZC15eXl5LW1tLWRkLWhobW1zcy0qCi0gICAgICAgICMgVGhlIGNsYW5nIGNvbXBpbGVyIHBhc3NlZCBieSAtLXVzZS1hbmFseXplciBoZXJlIGlzIG5vdCBpbXBvcnRhbnQuCi0gICAgICAgICMgYnVpbGQvY29yZS9iaW5hcnkubWsgd2lsbCBzZXQgQ0xBTkdfQ1hYIGFuZCBDTEFORyBiZWZvcmUgY2FsbGluZwotICAgICAgICAjIGMrKy1hbmFseXplciBhbmQgY2NjLWFuYWx5emVyLgotICAgICAgICBsb2NhbCBDTEFOR19WRVJTSU9OPSQoZ2V0X2J1aWxkX3ZhciBMTFZNX1BSRUJVSUxUU19WRVJTSU9OKQotICAgICAgICBsb2NhbCBCVUlMRF9PUz0kKGdldF9idWlsZF92YXIgQlVJTERfT1MpCi0gICAgICAgIGxvY2FsIENMQU5HX0RJUj0iJFQvcHJlYnVpbHRzL2NsYW5nL2hvc3QvJHtCVUlMRF9PU30teDg2LyR7Q0xBTkdfVkVSU0lPTn0iCi0gICAgICAgIGVjaG8gIlwKLSR7Q0xBTkdfRElSfS90b29scy9zY2FuLWJ1aWxkL2Jpbi9zY2FuLWJ1aWxkIFwKLS0tdXNlLWFuYWx5emVyICR7Q0xBTkdfRElSfS9iaW4vY2xhbmcgXAotLS1zdGF0dXMtYnVncyIKLSAgICBmaQotfQotCiBmdW5jdGlvbiBtKCkKIHsKICAgICBsb2NhbCBUPSQoZ2V0dG9wKQotICAgIGxvY2FsIERSVj0kKGdldGRyaXZlciAkVCkKICAgICBpZiBbICIkVCIgXTsgdGhlbgotICAgICAgICBfd3JhcF9idWlsZCAkRFJWICRUL2J1aWxkL3Nvb25nL3Nvb25nX3VpLmJhc2ggLS1tYWtlLW1vZGUgJEAKKyAgICAgICAgX3dyYXBfYnVpbGQgJFQvYnVpbGQvc29vbmcvc29vbmdfdWkuYmFzaCAtLW1ha2UtbW9kZSAkQAogICAgIGVsc2UKICAgICAgICAgZWNobyAiQ291bGRuJ3QgbG9jYXRlIHRoZSB0b3Agb2YgdGhlIHRyZWUuICBUcnkgc2V0dGluZyBUT1AuIgogICAgICAgICByZXR1cm4gMQpAQCAtNzYyLDcgKzc1NCw3IEBACiAKIGZ1bmN0aW9uIGZpbmRtYWtlZmlsZSgpCiB7Ci0gICAgbG9jYWwgVE9QRklMRT1idWlsZC9jb3JlL2VudnNldHVwLm1rCisgICAgbG9jYWwgVE9QRklMRT1idWlsZC9tYWtlL2NvcmUvZW52c2V0dXAubWsKICAgICBsb2NhbCBIRVJFPSRQV0QKICAgICBsb2NhbCBUPQogICAgIHdoaWxlIFsgXCggISBcKCAtZiAkVE9QRklMRSBcKSBcKSAtYSBcKCAkUFdEICE9ICIvIiBcKSBdOyBkbwpAQCAtNzgwLDExICs3NzIsMTAgQEAKIGZ1bmN0aW9uIG1tKCkKIHsKICAgICBsb2NhbCBUPSQoZ2V0dG9wKQotICAgIGxvY2FsIERSVj0kKGdldGRyaXZlciAkVCkKICAgICAjIElmIHdlJ3JlIHNpdHRpbmcgaW4gdGhlIHJvb3Qgb2YgdGhlIGJ1aWxkIHRyZWUsIGp1c3QgZG8gYQogICAgICMgbm9ybWFsIGJ1aWxkLgogICAgIGlmIFsgLWYgYnVpbGQvc29vbmcvc29vbmdfdWkuYmFzaCBdOyB0aGVuCi0gICAgICAgIF93cmFwX2J1aWxkICREUlYgJFQvYnVpbGQvc29vbmcvc29vbmdfdWkuYmFzaCAtLW1ha2UtbW9kZSAkQAorICAgICAgICBfd3JhcF9idWlsZCAkVC9idWlsZC9zb29uZy9zb29uZ191aS5iYXNoIC0tbWFrZS1tb2RlICRACiAgICAgZWxzZQogICAgICAgICAjIEZpbmQgdGhlIGNsb3Nlc3QgQW5kcm9pZC5tayBmaWxlLgogICAgICAgICBsb2NhbCBNPSQoZmluZG1ha2VmaWxlKQpAQCAtODE5LDcgKzgxMCw3IEBACiAgICAgICAgICAgICBpZiBbICIxIiA9ICIke1dJVEhfVElEWV9PTkxZfSIgLW8gInRydWUiID0gIiR7V0lUSF9USURZX09OTFl9IiBdOyB0aGVuCiAgICAgICAgICAgICAgIE1PRFVMRVM9dGlkeV9vbmx5CiAgICAgICAgICAgICBmaQotICAgICAgICAgICAgT05FX1NIT1RfTUFLRUZJTEU9JE0gX3dyYXBfYnVpbGQgJERSViAkVC9idWlsZC9zb29uZy9zb29uZ191aS5iYXNoIC0tbWFrZS1tb2RlICRNT0RVTEVTICRBUkdTCisgICAgICAgICAgICBPTkVfU0hPVF9NQUtFRklMRT0kTSBfd3JhcF9idWlsZCAkVC9idWlsZC9zb29uZy9zb29uZ191aS5iYXNoIC0tbWFrZS1tb2RlICRNT0RVTEVTICRBUkdTCiAgICAgICAgIGZpCiAgICAgZmkKIH0KQEAgLTgyNyw3ICs4MTgsNiBAQAogZnVuY3Rpb24gbW1tKCkKIHsKICAgICBsb2NhbCBUPSQoZ2V0dG9wKQotICAgIGxvY2FsIERSVj0kKGdldGRyaXZlciAkVCkKICAgICBpZiBbICIkVCIgXTsgdGhlbgogICAgICAgICBsb2NhbCBNQUtFRklMRT0KICAgICAgICAgbG9jYWwgTU9EVUxFUz0KQEAgLTg4Nyw3ICs4NzcsNyBAQAogICAgICAgICBmaQogICAgICAgICAjIENvbnZlcnQgIi8iIHRvICItIi4KICAgICAgICAgTU9EVUxFU19JTl9QQVRIUz0ke01PRFVMRVNfSU5fUEFUSFMvL1wvLy19Ci0gICAgICAgIE9ORV9TSE9UX01BS0VGSUxFPSIkTUFLRUZJTEUiIF93cmFwX2J1aWxkICREUlYgJFQvYnVpbGQvc29vbmcvc29vbmdfdWkuYmFzaCAtLW1ha2UtbW9kZSAkREFTSF9BUkdTICRNT0RVTEVTICRNT0RVTEVTX0lOX1BBVEhTICRBUkdTCisgICAgICAgIE9ORV9TSE9UX01BS0VGSUxFPSIkTUFLRUZJTEUiIF93cmFwX2J1aWxkICRUL2J1aWxkL3Nvb25nL3Nvb25nX3VpLmJhc2ggLS1tYWtlLW1vZGUgJERBU0hfQVJHUyAkTU9EVUxFUyAkTU9EVUxFU19JTl9QQVRIUyAkQVJHUwogICAgIGVsc2UKICAgICAgICAgZWNobyAiQ291bGRuJ3QgbG9jYXRlIHRoZSB0b3Agb2YgdGhlIHRyZWUuICBUcnkgc2V0dGluZyBUT1AuIgogICAgICAgICByZXR1cm4gMQpAQCAtODk3LDkgKzg4Nyw4IEBACiBmdW5jdGlvbiBtbWEoKQogewogICBsb2NhbCBUPSQoZ2V0dG9wKQotICBsb2NhbCBEUlY9JChnZXRkcml2ZXIgJFQpCiAgIGlmIFsgLWYgYnVpbGQvc29vbmcvc29vbmdfdWkuYmFzaCBdOyB0aGVuCi0gICAgX3dyYXBfYnVpbGQgJERSViAkVC9idWlsZC9zb29uZy9zb29uZ191aS5iYXNoIC0tbWFrZS1tb2RlICRACisgICAgX3dyYXBfYnVpbGQgJFQvYnVpbGQvc29vbmcvc29vbmdfdWkuYmFzaCAtLW1ha2UtbW9kZSAkQAogICBlbHNlCiAgICAgaWYgWyAhICIkVCIgXTsgdGhlbgogICAgICAgZWNobyAiQ291bGRuJ3QgbG9jYXRlIHRoZSB0b3Agb2YgdGhlIHRyZWUuICBUcnkgc2V0dGluZyBUT1AuIgpAQCAtOTExLDE0ICs5MDAsMTMgQEAKICAgICBsb2NhbCBNT0RVTEVTX0lOX1BBVEhTPU1PRFVMRVMtSU4tJChkaXJuYW1lICR7TX0pCiAgICAgIyBDb252ZXJ0ICIvIiB0byAiLSIuCiAgICAgTU9EVUxFU19JTl9QQVRIUz0ke01PRFVMRVNfSU5fUEFUSFMvL1wvLy19Ci0gICAgX3dyYXBfYnVpbGQgJERSViAkVC9idWlsZC9zb29uZy9zb29uZ191aS5iYXNoIC0tbWFrZS1tb2RlICRAICRNT0RVTEVTX0lOX1BBVEhTCisgICAgX3dyYXBfYnVpbGQgJFQvYnVpbGQvc29vbmcvc29vbmdfdWkuYmFzaCAtLW1ha2UtbW9kZSAkQCAkTU9EVUxFU19JTl9QQVRIUwogICBmaQogfQogCiBmdW5jdGlvbiBtbW1hKCkKIHsKICAgbG9jYWwgVD0kKGdldHRvcCkKLSAgbG9jYWwgRFJWPSQoZ2V0ZHJpdmVyICRUKQogICBpZiBbICIkVCIgXTsgdGhlbgogICAgIGxvY2FsIERBU0hfQVJHUz0kKGVjaG8gIiRAIiB8IGF3ayAtdiBSUz0iICIgLXYgT1JTPSIgIiAnL14tLiokLycpCiAgICAgbG9jYWwgRElSUz0kKGVjaG8gIiRAIiB8IGF3ayAtdiBSUz0iICIgLXYgT1JTPSIgIiAnL15bXi1dLiokLycpCkBAIC05NDksNyArOTM3LDcgQEAKICAgICBkb25lCiAgICAgIyBDb252ZXJ0ICIvIiB0byAiLSIuCiAgICAgTU9EVUxFU19JTl9QQVRIUz0ke01PRFVMRVNfSU5fUEFUSFMvL1wvLy19Ci0gICAgX3dyYXBfYnVpbGQgJERSViAkVC9idWlsZC9zb29uZy9zb29uZ191aS5iYXNoIC0tbWFrZS1tb2RlICREQVNIX0FSR1MgJEFSR1MgJE1PRFVMRVNfSU5fUEFUSFMKKyAgICBfd3JhcF9idWlsZCAkVC9idWlsZC9zb29uZy9zb29uZ191aS5iYXNoIC0tbWFrZS1tb2RlICREQVNIX0FSR1MgJEFSR1MgJE1PRFVMRVNfSU5fUEFUSFMKICAgZWxzZQogICAgIGVjaG8gIkNvdWxkbid0IGxvY2F0ZSB0aGUgdG9wIG9mIHRoZSB0cmVlLiAgVHJ5IHNldHRpbmcgVE9QLiIKICAgICByZXR1cm4gMQpAQCAtOTcyLDcgKzk2MCw3IEBACiAKIGZ1bmN0aW9uIGNwcm9qKCkKIHsKLSAgICBsb2NhbCBUT1BGSUxFPWJ1aWxkL2NvcmUvZW52c2V0dXAubWsKKyAgICBsb2NhbCBUT1BGSUxFPWJ1aWxkL21ha2UvY29yZS9lbnZzZXR1cC5tawogICAgIGxvY2FsIEhFUkU9JFBXRAogICAgIGxvY2FsIFQ9CiAgICAgd2hpbGUgWyBcKCAhIFwoIC1mICRUT1BGSUxFIFwpIFwpIC1hIFwoICRQV0QgIT0gIi8iIFwpIF07IGRvCkBAIC0xNTQwLDQ2ICsxNTI4LDYgQEAKICAgICBcY2QgJFQvJHBhdGhuYW1lCiB9CiAKLSMgRm9yY2UgSkFWQV9IT01FIHRvIHBvaW50IHRvIGphdmEgMS43LzEuOCBpZiBpdCBpc24ndCBhbHJlYWR5IHNldC4KLWZ1bmN0aW9uIHNldF9qYXZhX2hvbWUoKSB7Ci0gICAgIyBDbGVhciB0aGUgZXhpc3RpbmcgSkFWQV9IT01FIHZhbHVlIGlmIHdlIHNldCBpdCBvdXJzZWx2ZXMsIHNvIHRoYXQKLSAgICAjIHdlIGNhbiByZXNldCBpdCBsYXRlciwgZGVwZW5kaW5nIG9uIHRoZSB2ZXJzaW9uIG9mIGphdmEgdGhlIGJ1aWxkCi0gICAgIyBzeXN0ZW0gbmVlZHMuCi0gICAgIwotICAgICMgSWYgd2UgZG9uJ3QgZG8gdGhpcywgdGhlIEpBVkFfSE9NRSB2YWx1ZSBzZXQgYnkgdGhlIGZpcnN0IGNhbGwgdG8KLSAgICAjIGJ1aWxkL2VudnNldHVwLnNoIHdpbGwgcGVyc2lzdCBmb3JldmVyLgotICAgIGlmIFsgLW4gIiRBTkRST0lEX1NFVF9KQVZBX0hPTUUiIF07IHRoZW4KLSAgICAgIGV4cG9ydCBKQVZBX0hPTUU9IiIKLSAgICBmaQotCi0gICAgaWYgWyAhICIkSkFWQV9IT01FIiBdOyB0aGVuCi0gICAgICBpZiBbIC1uICIkTEVHQUNZX1VTRV9KQVZBNyIgXTsgdGhlbgotICAgICAgICBlY2hvIFdhcm5pbmc6IFN1cHBvcnQgZm9yIEpESyA3IHdpbGwgYmUgZHJvcHBlZC4gU3dpdGNoIHRvIEpESyA4LgotICAgICAgICBjYXNlIGB1bmFtZSAtc2AgaW4KLSAgICAgICAgICAgIERhcndpbikKLSAgICAgICAgICAgICAgICBleHBvcnQgSkFWQV9IT01FPSQoL3Vzci9saWJleGVjL2phdmFfaG9tZSAtdiAxLjcpCi0gICAgICAgICAgICAgICAgOzsKLSAgICAgICAgICAgICopCi0gICAgICAgICAgICAgICAgZXhwb3J0IEpBVkFfSE9NRT0vdXNyL2xpYi9qdm0vamF2YS03LW9wZW5qZGstYW1kNjQKLSAgICAgICAgICAgICAgICA7OwotICAgICAgICBlc2FjCi0gICAgICBlbHNlCi0gICAgICAgIGNhc2UgYHVuYW1lIC1zYCBpbgotICAgICAgICAgICAgRGFyd2luKQotICAgICAgICAgICAgICAgIGV4cG9ydCBKQVZBX0hPTUU9JCgvdXNyL2xpYmV4ZWMvamF2YV9ob21lIC12IDEuOCkKLSAgICAgICAgICAgICAgICA7OwotICAgICAgICAgICAgKikKLSAgICAgICAgICAgICAgICBleHBvcnQgSkFWQV9IT01FPS91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAotICAgICAgICAgICAgICAgIDs7Ci0gICAgICAgIGVzYWMKLSAgICAgIGZpCi0KLSAgICAgICMgS2VlcCB0cmFjayBvZiB0aGUgZmFjdCB0aGF0IHdlIHNldCBKQVZBX0hPTUUgb3Vyc2VsdmVzLCBzbyB0aGF0Ci0gICAgICAjIHdlIGNhbiBjaGFuZ2UgaXQgb24gdGhlIG5leHQgZW52c2V0dXAuc2gsIGlmIHJlcXVpcmVkLgotICAgICAgZXhwb3J0IEFORFJPSURfU0VUX0pBVkFfSE9NRT10cnVlCi0gICAgZmkKLX0KLQogIyBQcmludCBjb2xvcmVkIGV4aXQgY29uZGl0aW9uCiBmdW5jdGlvbiBwZXogewogICAgICIkQCIKQEAgLTE1OTcsNiArMTU0NSwxMyBAQAogewogICAgICMgSWYgd2UncmUgaW4gdGhlIHRvcCBvZiBhbiBBbmRyb2lkIHRyZWUsIHVzZSBzb29uZ191aS5iYXNoIGluc3RlYWQgb2YgbWFrZQogICAgIGlmIFsgLWYgYnVpbGQvc29vbmcvc29vbmdfdWkuYmFzaCBdOyB0aGVuCisgICAgICAgICMgQWx3YXlzIHVzZSB0aGUgcmVhbCBtYWtlIGlmIC1DIGlzIHBhc3NlZCBpbgorICAgICAgICBmb3IgYXJnIGluICIkQCI7IGRvCisgICAgICAgICAgICBpZiBbWyAkYXJnID09IC1DKiBdXTsgdGhlbgorICAgICAgICAgICAgICAgIGVjaG8gY29tbWFuZCBtYWtlCisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBmaQorICAgICAgICBkb25lCiAgICAgICAgIGVjaG8gYnVpbGQvc29vbmcvc29vbmdfdWkuYmFzaCAtLW1ha2UtbW9kZQogICAgIGVsc2UKICAgICAgICAgZWNobyBjb21tYW5kIG1ha2UKQEAgLTE2NDMsNyArMTU5OCw3IEBACiAKIGZ1bmN0aW9uIG1ha2UoKQogewotICAgIF93cmFwX2J1aWxkICQoZ2V0X21ha2VfY29tbWFuZCkgIiRAIgorICAgIF93cmFwX2J1aWxkICQoZ2V0X21ha2VfY29tbWFuZCAiJEAiKSAiJEAiCiB9CiAKIGZ1bmN0aW9uIHByb3Zpc2lvbigpCkBAIC0xNjc1LDYgKzE2MzAsMTQgQEAKICAgICAiJEFORFJPSURfUFJPRFVDVF9PVVQvcHJvdmlzaW9uLWRldmljZSIgIiRAIgogfQogCitmdW5jdGlvbiBhdGVzdCgpCit7CisgICAgIyBUT0RPIChzYmFzaSk6IFJlcGxhY2UgdGhpcyB0byBiZSBhIGRlc3RpbmF0aW9uIGluIHRoZSBidWlsZCBvdXQgd2hlbiAmIGlmCisgICAgIyBhdGVzdCBpcyBidWlsdCBieSB0aGUgYnVpbGQgc3lzdGVtLiAoVGhpcyB3aWxsIGJlIG5lY2Vzc2FyeSBpZiBpdCBldmVyCisgICAgIyBkZXBlbmRzIG9uIGV4dGVybmFsIHBpcCBwcm9qZWN0cykuCisgICAgIiQoZ2V0dG9wKSIvdG9vbHMvdHJhZGVmZWRlcmF0aW9uL2NvcmUvYXRlc3QvYXRlc3QucHkgIiRAIgorfQorCiBpZiBbICJ4JFNIRUxMIiAhPSAieC9iaW4vYmFzaCIgXTsgdGhlbgogICAgIGNhc2UgYHBzIC1vIGNvbW1hbmQgLXAgJCRgIGluCiAgICAgICAgICpiYXNoKikKZGlmZiAtLWdpdCBhL2hlbHAuc2ggYi9oZWxwLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmMxNDM1NDIKLS0tIC9kZXYvbnVsbAorKysgYi9oZWxwLnNoCkBAIC0wLDAgKzEsNTUgQEAKKyMhL2Jpbi9iYXNoCisKKyMgbG9jYXRlIHNvbWUgZGlyZWN0b3JpZXMKK2NkICIkKGRpcm5hbWUgJDApIgorU0NSSVBUX0RJUj0iJHtQV0R9IgorY2QgLi4vLi4KK1RPUD0iJHtQV0R9IgorCittZXNzYWdlPSdUaGUgYmFzaWMgQW5kcm9pZCBidWlsZCBwcm9jZXNzIGlzOgorCitjZCAnIiR7VE9QfSInCitzb3VyY2UgYnVpbGQvZW52c2V0dXAuc2ggICAgIyBBZGQgImx1bmNoIiAoYW5kIG90aGVyIHV0aWxpdGllcyBhbmQgdmFyaWFibGVzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgdG8gdGhlIHNoZWxsIGVudmlyb25tZW50LgorbHVuY2ggWzxwcm9kdWN0Pi08dmFyaWFudD5dICMgQ2hvb3NlIHRoZSBkZXZpY2UgdG8gdGFyZ2V0LgorbSAtaiBbPGdvYWxzPl0gICAgICAgICAgICAgICMgRXhlY3V0ZSB0aGUgY29uZmlndXJlZCBidWlsZC4KKworVXNhZ2Ugb2YgIm0iIGltaXRhdGVzIHVzYWdlIG9mIHRoZSBwcm9ncmFtICJtYWtlIi4KK1NlZSAnIiR7U0NSSVBUX0RJUn0iJy9Vc2FnZS50eHQgZm9yIG1vcmUgaW5mbyBhYm91dCBidWlsZCB1c2FnZSBhbmQgY29uY2VwdHMuCisKK0NvbW1vbiBnb2FscyBhcmU6CisKKyAgICBjbGVhbiAgICAgICAgICAgICAgICAgICAoYWthIGNsb2JiZXIpIGVxdWl2YWxlbnQgdG8gcm0gLXJmIG91dC8KKyAgICBjaGVja2J1aWxkICAgICAgICAgICAgICBCdWlsZCBldmVyeSBtb2R1bGUgZGVmaW5lZCBpbiB0aGUgc291cmNlIHRyZWUKKyAgICBkcm9pZCAgICAgICAgICAgICAgICAgICBEZWZhdWx0IHRhcmdldAorICAgIG5vdGhpbmcgICAgICAgICAgICAgICAgIERvIG5vdCBidWlsZCBhbnl0aGluZywganVzdCBwYXJzZSBhbmQgdmFsaWRhdGUgdGhlIGJ1aWxkIHN0cnVjdHVyZQorCisgICAgamF2YSAgICAgICAgICAgICAgICAgICAgQnVpbGQgYWxsIHRoZSBqYXZhIGNvZGUgaW4gdGhlIHNvdXJjZSB0cmVlCisgICAgbmF0aXZlICAgICAgICAgICAgICAgICAgQnVpbGQgYWxsIHRoZSBuYXRpdmUgY29kZSBpbiB0aGUgc291cmNlIHRyZWUKKworICAgIGhvc3QgICAgICAgICAgICAgICAgICAgIEJ1aWxkIGFsbCB0aGUgaG9zdCBjb2RlIChub3QgdG8gYmUgcnVuIG9uIGEgZGV2aWNlKSBpbiB0aGUgc291cmNlIHRyZWUKKyAgICB0YXJnZXQgICAgICAgICAgICAgICAgICBCdWlsZCBhbGwgdGhlIHRhcmdldCBjb2RlICh0byBiZSBydW4gb24gdGhlIGRldmljZSkgaW4gdGhlIHNvdXJjZSB0cmVlCisKKyAgICAoamF2YXxuYXRpdmUpLShob3N0fHRhcmdldCkKKyAgICAoaG9zdHx0YXJnZXQpLShqYXZhfG5hdGl2ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWlsZCB0aGUgaW50ZXJzZWN0aW9uIG9mIHRoZSB0d28gZ2l2ZW4gYXJndW1lbnRzCisKKyAgICBzbm9kICAgICAgICAgICAgICAgICAgICBRdWlja2x5IHJlYnVpbGQgdGhlIHN5c3RlbSBpbWFnZSBmcm9tIGJ1aWx0IHBhY2thZ2VzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhbmRzIGZvciAiU3lzdGVtLCBOTyBEZXBlbmRlbmNpZXMiCisgICAgdm5vZCAgICAgICAgICAgICAgICAgICAgUXVpY2tseSByZWJ1aWxkIHRoZSB2ZW5kb3IgaW1hZ2UgZnJvbSBidWlsdCBwYWNrYWdlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YW5kcyBmb3IgIlZlbmRvciwgTk8gRGVwZW5kZW5jaWVzIgorICAgIHBub2QgICAgICAgICAgICAgICAgICAgIFF1aWNrbHkgcmVidWlsZCB0aGUgcHJvZHVjdCBpbWFnZSBmcm9tIGJ1aWx0IHBhY2thZ2VzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhbmRzIGZvciAiUHJvZHVjdCwgTk8gRGVwZW5kZW5jaWVzIgorCisKK1NvLCBmb3IgZXhhbXBsZSwgeW91IGNvdWxkIHJ1bjoKKworY2QgJyIke1RPUH0iJworc291cmNlIGJ1aWxkL2VudnNldHVwLnNoCitsdW5jaCBhb3NwX2FybS11c2VyZGVidWcKK20gLWogamF2YQorCit0byBidWlsZCBhbGwgb2YgdGhlIGphdmEgY29kZSBmb3IgdGhlIHVzZXJkZWJ1ZyB2YXJpYW50IG9mIHRoZSBhb3NwX2FybSBkZXZpY2UuCisnCisKK2VjaG8gIiRtZXNzYWdlIgpkaWZmIC0tZ2l0IGEvbmF2YmFyLm1kIGIvbmF2YmFyLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyMThhNzgKLS0tIC9kZXYvbnVsbAorKysgYi9uYXZiYXIubWQKQEAgLTAsMCArMSw0IEBACisqIFtIb21lXSgvUkVBRE1FLm1kKQorKiBbVXNhZ2VdKC9Vc2FnZS50eHQpCisqIFtDaGFuZ2VzXSgvQ2hhbmdlcy5tZCkKKyogW091dGRhdGVkIFJlZmVyZW5jZV0oL2NvcmUvYnVpbGQtc3lzdGVtLmh0bWwpCmRpZmYgLS1naXQgYS90YXBhc0hlbHAuc2ggYi90YXBhc0hlbHAuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzhiM2UzNAotLS0gL2Rldi9udWxsCisrKyBiL3RhcGFzSGVscC5zaApAQCAtMCwwICsxLDIzIEBACisjIS9iaW4vYmFzaAorCisjIGxvY2F0ZSBzb21lIGRpcmVjdG9yaWVzCitjZCAiJChkaXJuYW1lICQwKSIKK1NDUklQVF9ESVI9IiR7UFdEfSIKK2NkIC4uLy4uCitUT1A9IiR7UFdEfSIKKworbWVzc2FnZT0ndXNhZ2U6IHRhcGFzIFs8QXBwMT4gPEFwcDI+IC4uLl0gW2FybXx4ODZ8bWlwc3xhcm02NHx4ODZfNjR8bWlwczY0XSBbZW5nfHVzZXJkZWJ1Z3x1c2VyXQorCit0YXBhcyBzZWxlY3RzIGluZGl2aWR1YWwgYXBwcyB0byBiZSBidWlsdCBieSB0aGUgQW5kcm9pZCBidWlsZCBzeXN0ZW0uIFVubGlrZQorImx1bmNoIiwgInRhcGFzIiBkb2VzIG5vdCByZXF1ZXN0IHRoZSBidWlsZGluZyBvZiBpbWFnZXMgZm9yIGEgZGV2aWNlLgorQWRkaXRpb25hbGx5LCBhbiBhcHAgYnVpbHQgd2l0aCAidGFwYXMiIHdpbGwgaGF2ZSBpdHMgZGV4IGZpbGUgaW5zaWRlIGl0cyBhcGssCit3aGljaCBzaG91bGQgY2F1c2UgaXQgdG8gYmUgc3VpdGFibGUgZm9yIGluc3RhbGxpbmcgb24gYW55IGFwaS1jb21wYXRpYmxlCitkZXZpY2UuIEluIG90aGVyIHdvcmRzLCAidGFwYXMiIGNvbmZpZ3VyZXMgdGhlIGJ1aWxkIG9mIHVuYnVuZGxlZCBhcHBzLgorCitUaGUgbmFtZXMgPEFwcDE+IDxBcHAyPiAuLi4gc2hvdWxkIG1hdGNoIExPQ0FMX1BBQ0tBR0VfTkFNRSBhcyBkZWZpbmVkIGluIGFuCitBbmRyb2lkLm1rCisKK1RoZSB1c2FnZSBvZiB0aGUgb3RoZXIgYXJndW1lbnRzIG1hdGNoZXMgdGhhdCBvZiB0aGUgcmVzdCBvZiB0aGUgcGxhdGZvcm0KK2J1aWxkIHN5c3RlbSBhbmQgY2FuIGJlIGZvdW5kIGJ5IHJ1bm5pbmcgYG0gaGVscGAnCisKK2VjaG8gIiRtZXNzYWdlIgpkaWZmIC0tZ2l0IGEvdGFyZ2V0L2JvYXJkL2dlbmVyaWNfYXJtdjUvQm9hcmRDb25maWcubWsgYi90YXJnZXQvQW5kcm9pZC5tawpzaW1pbGFyaXR5IGluZGV4IDYzJQpjb3B5IGZyb20gdGFyZ2V0L2JvYXJkL2dlbmVyaWNfYXJtdjUvQm9hcmRDb25maWcubWsKY29weSB0byB0YXJnZXQvQW5kcm9pZC5tawppbmRleCAwMTY5MzdhLi45OTI5YjAwIDEwMDY0NAotLS0gYS90YXJnZXQvYm9hcmQvZ2VuZXJpY19hcm12NS9Cb2FyZENvbmZpZy5taworKysgYi90YXJnZXQvQW5kcm9pZC5tawpAQCAtMSw1ICsxLDUgQEAKICMKLSMgQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMgQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKICMKICMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTE0LDEwICsxNCwxMCBAQAogIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotaW5jbHVkZSBidWlsZC90YXJnZXQvYm9hcmQvZ2VuZXJpYy9Cb2FyZENvbmZpZy5taworTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQogCi1UQVJHRVRfQVJDSF9WQVJJQU5UIDo9IGFybXY1dGUKLVRBUkdFVF9DUFVfQUJJIDo9IGFybWVhYmkKLVRBUkdFVF9DUFVfQUJJMiA6PQotCi1XSVRIX0RFWFBSRU9QVCA6PSBmYWxzZQorIyBPbmx5IGlmIHRoaXMgQW5kcm9pZC5tayB3YXMgaW5jbHVkZWQgbm90IGJ5IGEgc3ltbGluayBzaG91bGQgaXQgYmUgdXNlZC4KKyMgVGhpcyBmYWNpbGl0YXRlcyB0aGUgdHJhbnNpdGlvbiBhd2F5IGZyb20gc3ltbGlua3M6IGIvNjQzOTc5NjAKK2lmZXEgKCQoTE9DQUxfUEFUSCksYnVpbGQvbWFrZS90YXJnZXQpCitpbmNsdWRlICQoY2FsbCBmaXJzdC1tYWtlZmlsZXMtdW5kZXIsJChMT0NBTF9QQVRIKSkKK2VuZGlmCmRpZmYgLS1naXQgYS90YXJnZXQvYm9hcmQvQW5kcm9pZC5tayBiL3RhcmdldC9ib2FyZC9BbmRyb2lkLm1rCmluZGV4IDU1MDRjNTIuLjdmZTQ1ZWIgMTAwNjQ0Ci0tLSBhL3RhcmdldC9ib2FyZC9BbmRyb2lkLm1rCisrKyBiL3RhcmdldC9ib2FyZC9BbmRyb2lkLm1rCkBAIC0yMCw3ICsyMCw3IEBACiBib2FyZF9pbmZvX3R4dCA6PSAkKHdpbGRjYXJkICQoVEFSR0VUX0RFVklDRV9ESVIpL2JvYXJkLWluZm8udHh0KQogZW5kaWYKICQoSU5TVEFMTEVEX0FORFJPSURfSU5GT19UWFRfVEFSR0VUKTogJChib2FyZF9pbmZvX3R4dCkKLQkkKGhpZGUpIGJ1aWxkL3Rvb2xzL2NoZWNrX3JhZGlvX3ZlcnNpb25zLnB5ICQ8ICQoQk9BUkRfSU5GT19DSEVDSykKKwkkKGhpZGUpIGJ1aWxkL21ha2UvdG9vbHMvY2hlY2tfcmFkaW9fdmVyc2lvbnMucHkgJDwgJChCT0FSRF9JTkZPX0NIRUNLKQogCSQoY2FsbCBwcmV0dHksIkdlbmVyYXRlZDogKCRAKSIpCiBpZmRlZiBib2FyZF9pbmZvX3R4dAogCSQoaGlkZSkgZ3JlcCAtdiAnIycgJDwgPiAkQApAQCAtMzQsMTQgKzM0LDE3IEBACiBpZmRlZiBERVZJQ0VfTUFOSUZFU1RfRklMRQogIyAkKERFVklDRV9NQU5JRkVTVF9GSUxFKSBjYW4gYmUgYSBsaXN0IG9mIGZpbGVzCiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKLUxPQ0FMX01PRFVMRSAgICAgICAgOj0gbWFuaWZlc3QueG1sCitMT0NBTF9NT0RVTEUgICAgICAgIDo9IGRldmljZV9tYW5pZmVzdC54bWwKK0xPQ0FMX01PRFVMRV9TVEVNICAgOj0gbWFuaWZlc3QueG1sCiBMT0NBTF9NT0RVTEVfQ0xBU1MgIDo9IEVUQwotTE9DQUxfTU9EVUxFX1BBVEggICA6PSAkKFRBUkdFVF9PVVRfVkVORE9SKQorTE9DQUxfTU9EVUxFX1BBVEggICA6PSAkKFRBUkdFVF9PVVRfVkVORE9SKS9ldGMvdmludGYKIAogR0VOIDo9ICQobG9jYWwtZ2VuZXJhdGVkLXNvdXJjZXMtZGlyKS9tYW5pZmVzdC54bWwKICQoR0VOKTogUFJJVkFURV9ERVZJQ0VfTUFOSUZFU1RfRklMRSA6PSAkKERFVklDRV9NQU5JRkVTVF9GSUxFKQogJChHRU4pOiAkKERFVklDRV9NQU5JRkVTVF9GSUxFKSAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9hc3NlbWJsZV92aW50ZgogCUJPQVJEX1NFUE9MSUNZX1ZFUlM9JChCT0FSRF9TRVBPTElDWV9WRVJTKSBcCisJUFJPRFVDVF9FTkZPUkNFX1ZJTlRGX01BTklGRVNUPSQoUFJPRFVDVF9FTkZPUkNFX1ZJTlRGX01BTklGRVNUKSBcCisJUFJPRFVDVF9TSElQUElOR19BUElfTEVWRUw9JChQUk9EVUNUX1NISVBQSU5HX0FQSV9MRVZFTCkgXAogCSQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL2Fzc2VtYmxlX3ZpbnRmIC1vICRAIFwKIAkJLWkgJChjYWxsIG5vcm1hbGl6ZS1wYXRoLWxpc3QsJChQUklWQVRFX0RFVklDRV9NQU5JRkVTVF9GSUxFKSkKIApAQCAtNDksMTA2ICs1MiwzIEBACiBpbmNsdWRlICQoQlVJTERfUFJFQlVJTFQpCiBCVUlMVF9WRU5ET1JfTUFOSUZFU1QgOj0gJChMT0NBTF9CVUlMVF9NT0RVTEUpCiBlbmRpZgotCi0jIERldmljZSBDb21wYXRpYmlsaXR5IE1hdHJpeAotaWZkZWYgREVWSUNFX01BVFJJWF9GSUxFCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLUxPQ0FMX01PRFVMRSAgICAgICAgOj0gY29tcGF0aWJpbGl0eV9tYXRyaXgueG1sCi1MT0NBTF9NT0RVTEVfQ0xBU1MgIDo9IEVUQwotTE9DQUxfTU9EVUxFX1BBVEggICA6PSAkKFRBUkdFVF9PVVRfVkVORE9SKQotCi1HRU4gOj0gJChsb2NhbC1nZW5lcmF0ZWQtc291cmNlcy1kaXIpL2NvbXBhdGliaWxpdHlfbWF0cml4LnhtbAotJChHRU4pOiAkKERFVklDRV9NQVRSSVhfRklMRSkgJChIT1NUX09VVF9FWEVDVVRBQkxFUykvYXNzZW1ibGVfdmludGYKLQkjIFRPRE8oYi8zNzM0MjYyNyk6IHB1dCBCT0FSRF9WTkRLX1ZFUlNJT04gJiBCT0FSRF9WTkRLX0xJQlJBUklFUyBpbnRvIGRldmljZSBtYXRyaXguCi0JJChIT1NUX09VVF9FWEVDVVRBQkxFUykvYXNzZW1ibGVfdmludGYgLWkgJDwgLW8gJEAKLQotTE9DQUxfUFJFQlVJTFRfTU9EVUxFX0ZJTEUgOj0gJChHRU4pCi1pbmNsdWRlICQoQlVJTERfUFJFQlVJTFQpCi1CVUlMVF9WRU5ET1JfTUFUUklYIDo9ICQoTE9DQUxfQlVJTFRfTU9EVUxFKQotZW5kaWYKLQotIyBGcmFtZXdvcmsgTWFuaWZlc3QKLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotTE9DQUxfTU9EVUxFICAgICAgICA6PSBzeXN0ZW1fbWFuaWZlc3QueG1sCi1MT0NBTF9NT0RVTEVfU1RFTSAgIDo9IG1hbmlmZXN0LnhtbAotTE9DQUxfTU9EVUxFX0NMQVNTICA6PSBFVEMKLUxPQ0FMX01PRFVMRV9QQVRIICAgOj0gJChUQVJHRVRfT1VUKQotCi1HRU4gOj0gJChsb2NhbC1nZW5lcmF0ZWQtc291cmNlcy1kaXIpL21hbmlmZXN0LnhtbAotCi0kKEdFTik6IFBSSVZBVEVfRkxBR1MgOj0KLQotIyBUT0RPKGIvMzc5NTQ0NTgpLCAoYi8zNzMyMTMwOSkgcmVtb3ZlIGNoZWNrIG9mIFBST0RVQ1RfRlVMTF9UUkVCTEUgYWZ0ZXIKLSMgcHV0dGluZyBkZXZpY2UgY29tcGF0aWJpbGl0eSBtYXRyaWNlcyBmb3Igbm9uLXRyZWJsZSBkZXZpY2VzLgotaWZlcSAoJChQUk9EVUNUX0ZVTExfVFJFQkxFKSx0cnVlKQotaWZkZWYgQlVJTFRfVkVORE9SX01BVFJJWAotJChHRU4pOiAkKEJVSUxUX1ZFTkRPUl9NQVRSSVgpCi0kKEdFTik6IFBSSVZBVEVfRkxBR1MgKz0gLWMgIiQoQlVJTFRfVkVORE9SX01BVFJJWCkiCi1lbmRpZgotZW5kaWYKLQotJChHRU4pOiAkKEZSQU1FV09SS19NQU5JRkVTVF9GSUxFKSAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9hc3NlbWJsZV92aW50ZgotCUJPQVJEX1NFUE9MSUNZX1ZFUlM9JChCT0FSRF9TRVBPTElDWV9WRVJTKSAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9hc3NlbWJsZV92aW50ZiAtaSAkPCAtbyAkQCAkKFBSSVZBVEVfRkxBR1MpCi0KLUxPQ0FMX1BSRUJVSUxUX01PRFVMRV9GSUxFIDo9ICQoR0VOKQotaW5jbHVkZSAkKEJVSUxEX1BSRUJVSUxUKQotQlVJTFRfU1lTVEVNX01BTklGRVNUIDo9ICQoTE9DQUxfQlVJTFRfTU9EVUxFKQotCi0jIEZyYW1ld29yayBDb21wYXRpYmlsaXR5IE1hdHJpeAotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi1MT0NBTF9NT0RVTEUgICAgICAgIDo9IHN5c3RlbV9jb21wYXRpYmlsaXR5X21hdHJpeC54bWwKLUxPQ0FMX01PRFVMRV9TVEVNICAgOj0gY29tcGF0aWJpbGl0eV9tYXRyaXgueG1sCi1MT0NBTF9NT0RVTEVfQ0xBU1MgIDo9IEVUQwotTE9DQUxfTU9EVUxFX1BBVEggICA6PSAkKFRBUkdFVF9PVVQpCi0KLUdFTiA6PSAkKGxvY2FsLWdlbmVyYXRlZC1zb3VyY2VzLWRpcikvY29tcGF0aWJpbGl0eV9tYXRyaXgueG1sCi0KLSQoR0VOKTogUFJJVkFURV9GTEFHUyA6PQotCi0jIFRPRE8oYi8zNzk1NDQ1OCksIChiLzM3MzIxMzA5KSByZW1vdmUgY2hlY2sgb2YgUFJPRFVDVF9GVUxMX1RSRUJMRSBhZnRlcgotIyBwdXR0aW5nIGNvbXBsZXRlIEhBTCBtYW5pZmVzdHMgb24gbm9uLXRyZWJsZSBkZXZpY2VzLgotaWZlcSAoJChQUk9EVUNUX0ZVTExfVFJFQkxFKSx0cnVlKQotaWZkZWYgQlVJTFRfVkVORE9SX01BTklGRVNUCi0kKEdFTik6ICQoQlVJTFRfVkVORE9SX01BTklGRVNUKQotJChHRU4pOiBQUklWQVRFX0ZMQUdTICs9IC1jICIkKEJVSUxUX1ZFTkRPUl9NQU5JRkVTVCkiCi1lbmRpZgotZW5kaWYKLQotaWZlcSAodHJ1ZSwkKEJPQVJEX0FWQl9FTkFCTEUpKQotJChHRU4pOiAkKEFWQlRPT0wpCi0jIElOVEVSTkFMX0FWQl9TWVNURU1fU0lHTklOR19BUkdTIGNvbnNpc3RzIG9mIEJPQVJEX0FWQl9TWVNURU1fS0VZX1BBVEggYW5kCi0jIEJPQVJEX0FWQl9TWVNURU1fQUxHT1JJVEhNLiBXZSBzaG91bGQgYWRkIHRoZSBkZXBlbmRlbmN5IG9mIGtleSBwYXRoLCB3aGljaAotIyBpcyBhIGZpbGUsIGhlcmUuCi0kKEdFTik6ICQoQk9BUkRfQVZCX1NZU1RFTV9LRVlfUEFUSCkKLSMgVXNlIGRlZmVycmVkIGFzc2lnbm1lbnQgKD0pIGluc3RlYWQgb2YgaW1tZWRpYXRlIGFzc2lnbm1lbnQgKDo9KS4KLSMgT3RoZXJ3aXNlLCBjYW5ub3QgZ2V0IElOVEVSTkFMX0FWQl9TWVNURU1fU0lHTklOR19BUkdTLgotRlJBTUVXT1JLX1ZCTUVUQV9WRVJTSU9OID0gJCQoIiQoQVZCVE9PTCkiIGFkZF9oYXNodHJlZV9mb290ZXIgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS1wcmludF9yZXF1aXJlZF9saWJhdmJfdmVyc2lvbiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKElOVEVSTkFMX0FWQl9TWVNURU1fU0lHTklOR19BUkdTKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKEJPQVJEX0FWQl9TWVNURU1fQUREX0hBU0hUUkVFX0ZPT1RFUl9BUkdTKSkKLWVsc2UKLUZSQU1FV09SS19WQk1FVEFfVkVSU0lPTiA6PSAwLjAKLWVuZGlmCi0KLSMgQWxsIGtlcm5lbCB2ZXJzaW9ucyB0aGF0IHRoZSBzeXN0ZW0gaW1hZ2Ugd29ya3Mgd2l0aC4KLUtFUk5FTF9WRVJTSU9OUyA6PSAzLjE4IDQuNCA0LjkKLUtFUk5FTF9DT05GSUdfREFUQSA6PSB0ZXN0L3Z0cy10ZXN0Y2FzZS9rZXJuZWwvY29uZmlnL2RhdGEKLQotJChHRU4pOiAkKGZvcmVhY2ggdmVyc2lvbiwkKEtFUk5FTF9WRVJTSU9OUyksXAotCSQod2lsZGNhcmQgJChLRVJORUxfQ09ORklHX0RBVEEpL2FuZHJvaWQtJCh2ZXJzaW9uKS9hbmRyb2lkLWJhc2UqLmNmZykpCi0kKEdFTik6IFBSSVZBVEVfRkxBR1MgKz0gJChmb3JlYWNoIHZlcnNpb24sJChLRVJORUxfVkVSU0lPTlMpLFwKLQktLWtlcm5lbD0kKHZlcnNpb24pOiQoY2FsbCBub3JtYWxpemUtcGF0aC1saXN0LFwKLQkJJCh3aWxkY2FyZCAkKEtFUk5FTF9DT05GSUdfREFUQSkvYW5kcm9pZC0kKHZlcnNpb24pL2FuZHJvaWQtYmFzZSouY2ZnKSkpCi0KLUtFUk5FTF9WRVJTSU9OUyA6PQotS0VSTkVMX0NPTkZJR19EQVRBIDo9Ci0KLSQoR0VOKTogJChGUkFNRVdPUktfQ09NUEFUSUJJTElUWV9NQVRSSVhfRklMRSkgJChIT1NUX09VVF9FWEVDVVRBQkxFUykvYXNzZW1ibGVfdmludGYKLQkjIFRPRE8oYi8zNzQwNTg2OSkgKGIvMzc3MTUzNzUpIGluamVjdCBhdmIgdmVyc2lvbnMgYXMgd2VsbCBmb3IgZGV2aWNlcyB0aGF0IGhhdmUgYXZiIGVuYWJsZWQuCi0JUE9MSUNZVkVSUz0kKFBPTElDWVZFUlMpIFwKLQkJQk9BUkRfU0VQT0xJQ1lfVkVSUz0kKEJPQVJEX1NFUE9MSUNZX1ZFUlMpIFwKLQkJRlJBTUVXT1JLX1ZCTUVUQV9WRVJTSU9OPSQoRlJBTUVXT1JLX1ZCTUVUQV9WRVJTSU9OKSBcCi0JCSQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL2Fzc2VtYmxlX3ZpbnRmIC1pICQ8IC1vICRAICQoUFJJVkFURV9GTEFHUykKLUxPQ0FMX1BSRUJVSUxUX01PRFVMRV9GSUxFIDo9ICQoR0VOKQotaW5jbHVkZSAkKEJVSUxEX1BSRUJVSUxUKQotQlVJTFRfU1lTVEVNX0NPTVBBVElCSUxJVFlfTUFUUklYIDo9ICQoTE9DQUxfQlVJTFRfTU9EVUxFKQpkaWZmIC0tZ2l0IGEvdGFyZ2V0L2JvYXJkL2dlbmVyaWMvQm9hcmRDb25maWcubWsgYi90YXJnZXQvYm9hcmQvZ2VuZXJpYy9Cb2FyZENvbmZpZy5tawppbmRleCAzMzFmMDgyLi42YzgyODQ2IDEwMDY0NAotLS0gYS90YXJnZXQvYm9hcmQvZ2VuZXJpYy9Cb2FyZENvbmZpZy5taworKysgYi90YXJnZXQvYm9hcmQvZ2VuZXJpYy9Cb2FyZENvbmZpZy5tawpAQCAtOCwzNiArOCw0MyBAQAogVEFSR0VUX05PX0tFUk5FTCA6PSB0cnVlCiBUQVJHRVRfQVJDSCA6PSBhcm0KIAotIyBOb3RlOiB3ZSBidWlsZCB0aGUgcGxhdGZvcm0gaW1hZ2VzIGZvciBBUk12Ny1BIF93aXRob3V0XyBORU9OLgorIyBOb3RlOiBCZWZvcmUgUGksIHdlIGJ1aWx0IHRoZSBwbGF0Zm9ybSBpbWFnZXMgZm9yIEFSTXY3LUEgX3dpdGhvdXRfIE5FT04uCiAjCi0jIFRlY2huaWNhbGx5LCB0aGUgZW11bGF0b3Igc3VwcG9ydHMgQVJNdjctQSBfYW5kXyBORU9OIGluc3RydWN0aW9ucywgYnV0Ci0jIGVtdWxhdGVkIE5FT04gY29kZSBwYXRocyB0eXBpY2FsbHkgZW5kcyB1cCAyeCBzbG93ZXIgdGhhbiB0aGUgbm9ybWFsIEMgY29kZQotIyBpdCBpcyBzdXBwb3NlZCB0byByZXBsYWNlICh1bmxpa2Ugb24gcmVhbCBkZXZpY2VzIHdoZXJlIGl0IGlzIDJ4IHRvIDN4Ci0jIGZhc3RlcikuCitpZm5lcSAoJChUQVJHRVRfQlVJTERfQVBQUykkKGZpbHRlciBjdHMgc2RrLCQoTUFLRUNNREdPQUxTKSksKQorIyBETyBOT1QgVVNFCiAjCi0jIFdoYXQgdGhpcyBtZWFucyBpcyB0aGF0IHRoZSBwbGF0Zm9ybSBpbWFnZSB3aWxsIG5vdCB1c2UgTkVPTiBjb2RlIHBhdGhzCi0jIHRoYXQgYXJlIHNsb3dlciB0byBlbXVsYXRlLiBPbiB0aGUgb3RoZXIgaGFuZCwgaXQgaXMgcG9zc2libGUgdG8gZW11bGF0ZQotIyBhcHBsaWNhdGlvbiBjb2RlIGdlbmVyYXRlZCB3aXRoIHRoZSBOREsgdGhhdCB1c2VzIE5FT04gaW4gdGhlIGVtdWxhdG9yLgorIyBUaGlzIGFyY2hpdGVjdHVyZSB2YXJpYW50IHNob3VsZCBOT1QgYmUgdXNlZCBmb3IgMzIgYml0IGFybSBwbGF0Zm9ybQorIyBidWlsZHMuIEl0IGlzIHRoZSBsb3dlc3QgY29tbW9uIGRlbm9taW5hdG9yIHJlcXVpcmVkIHRvIGJ1aWxkCisjIGFuIHVuYnVuZGxlZCBhcHBsaWNhdGlvbiBmb3IgYWxsIHN1cHBvcnRlZCAzMiBwbGF0Zm9ybXMuCisjIGN0cyBmb3IgMzIgYml0IGFybSBpcyBidWlsdCB1c2luZyBhb3NwX2FybTY0IHByb2R1Y3QuCiAjCisjIElmIHlvdSBhcmUgYnVpbGRpbmcgYSAzMiBiaXQgcGxhdGZvcm0gKGFuZCBub3QgYW4gYXBwbGljYXRpb24pLAorIyB5b3Ugc2hvdWxkIHNldCB0aGUgZm9sbG93aW5nIGFzIDJuZCBhcmNoIHZhcmlhbnQ6CisjCisjIFRBUkdFVF9BUkNIX1ZBUklBTlQgOj0gYXJtdjctYS1uZW9uCisjCisjIERPIE5PVCBVU0UKIFRBUkdFVF9BUkNIX1ZBUklBTlQgOj0gYXJtdjctYQorIyBETyBOT1QgVVNFCitlbHNlCisjIFN0YXJ0aW5nIGZyb20gUGksIFN5c3RlbSBpbWFnZSBvZiBhb3NwX2FybSBwcm9kdWN0cyBpcyB0aGUgbmV3IEdTSQorIyBmb3IgcmVhbCBkZXZpY2VzIG5ld2x5IGxhdW5jaGVkIGZvciBQaS4gVGhlc2UgZGV2aWNlcyBhcmUgdXN1YWx5IG5vdAorIyBhcyBwZXJmb3JtYW50IGFzIHRoZSBtYWluc3RyZWFtIDY0LWJpdCBkZXZpY2VzIGFuZCB0aGUgcGVyZm9ybWFuY2UKKyMgcHJvdmlkZWQgYnkgTkVPTiBpcyBpbXBvcnRhbnQgZm9yIHRoZW0gdG8gcGFzcyByZWxhdGVkIENUUyB0ZXN0cy4KK1RBUkdFVF9BUkNIX1ZBUklBTlQgOj0gYXJtdjctYS1uZW9uCitlbmRpZgogVEFSR0VUX0NQVV9WQVJJQU5UIDo9IGdlbmVyaWMKIFRBUkdFVF9DUFVfQUJJIDo9IGFybWVhYmktdjdhCiBUQVJHRVRfQ1BVX0FCSTIgOj0gYXJtZWFiaQogSEFWRV9IVENfQVVESU9fRFJJVkVSIDo9IHRydWUKIEJPQVJEX1VTRVNfR0VORVJJQ19BVURJTyA6PSB0cnVlCitUQVJHRVRfQk9PVExPQURFUl9CT0FSRF9OQU1FIDo9IGdvbGRmaXNoXyQoVEFSR0VUX0FSQ0gpCisKK1RBUkdFVF9VU0VTXzY0X0JJVF9CSU5ERVIgOj0gdHJ1ZQogCiAjIG5vIGhhcmR3YXJlIGNhbWVyYQogVVNFX0NBTUVSQV9TVFVCIDo9IHRydWUKIAotIyBFbmFibGUgZGV4LXByZW9wdGltaXphdGlvbiB0byBzcGVlZCB1cCB0aGUgZmlyc3QgYm9vdCBzZXF1ZW5jZQotIyBvZiBhbiBTREsgQVZELiBOb3RlIHRoYXQgdGhpcyBvcGVyYXRpb24gb25seSB3b3JrcyBvbiBMaW51eCBmb3Igbm93Ci1pZmVxICgkKEhPU1RfT1MpLGxpbnV4KQotICBpZmVxICgkKFdJVEhfREVYUFJFT1BUKSwpCi0gICAgV0lUSF9ERVhQUkVPUFQgOj0gdHJ1ZQotICAgIFdJVEhfREVYUFJFT1BUX0JPT1RfSU1HX0FORF9TWVNURU1fU0VSVkVSX09OTFkgOj0gZmFsc2UKLSAgZW5kaWYKLWVuZGlmCi0KIFRBUkdFVF9VU0VTX0hXQzIgOj0gdHJ1ZQogTlVNX0ZSQU1FQlVGRkVSX1NVUkZBQ0VfQlVGRkVSUyA6PSAzCiAKQEAgLTUwLDE4ICs1Nyw1NyBAQAogVVNFX09QRU5HTF9SRU5ERVJFUiA6PSB0cnVlCiAKIFRBUkdFVF9VU0VSSU1BR0VTX1VTRV9FWFQ0IDo9IHRydWUKLUJPQVJEX1NZU1RFTUlNQUdFX1BBUlRJVElPTl9TSVpFIDo9IDIxNDc0ODM2NDggICMgMiBHQgorIyBQYXJ0aXRpb24gc2l6ZSBpcyBkZWZhdWx0IDEuNUdCICgxNTM2TUIpIGZvciA2NCBiaXRzIHByb2plY3RzCitCT0FSRF9TWVNURU1JTUFHRV9QQVJUSVRJT05fU0laRSA6PSAxNjEwNjEyNzM2CiBCT0FSRF9VU0VSREFUQUlNQUdFX1BBUlRJVElPTl9TSVpFIDo9IDU3NjcxNjgwMAogVEFSR0VUX0NPUFlfT1VUX1ZFTkRPUiA6PSB2ZW5kb3IKICMgfjEwMCBNQiB2ZW5kb3IgaW1hZ2UuIFBsZWFzZSBhZGp1c3Qgc3lzdGVtIGltYWdlIC8gdmVuZG9yIGltYWdlIHNpemVzCiAjIHdoZW4gZmluYWxpemluZyB0aGVtLgogQk9BUkRfVkVORE9SSU1BR0VfUEFSVElUSU9OX1NJWkUgOj0gMTAwMDAwMDAwCiBCT0FSRF9WRU5ET1JJTUFHRV9GSUxFX1NZU1RFTV9UWVBFIDo9IGV4dDQKLUJPQVJEX0NBQ0hFSU1BR0VfUEFSVElUSU9OX1NJWkUgOj0gNjkyMDYwMTYKLUJPQVJEX0NBQ0hFSU1BR0VfRklMRV9TWVNURU1fVFlQRSA6PSBleHQ0CiBCT0FSRF9GTEFTSF9CTE9DS19TSVpFIDo9IDUxMgogVEFSR0VUX1VTRVJJTUFHRVNfU1BBUlNFX0VYVF9ESVNBQkxFRCA6PSB0cnVlCiBERVZJQ0VfTUFUUklYX0ZJTEUgICA6PSBkZXZpY2UvZ2VuZXJpYy9nb2xkZmlzaC9jb21wYXRpYmlsaXR5X21hdHJpeC54bWwKIAotQk9BUkRfU0VQT0xJQ1lfRElSUyArPSBidWlsZC90YXJnZXQvYm9hcmQvZ2VuZXJpYy9zZXBvbGljeQorIyBBbmRyb2lkIGdlbmVyaWMgc3lzdGVtIGltYWdlIGFsd2F5cyBjcmVhdGUgbWV0YWRhdGEgcGFydGl0aW9uCitCT0FSRF9VU0VTX01FVEFEQVRBX1BBUlRJVElPTiA6PSB0cnVlCisKKyMgU2V0IHRoaXMgdG8gY3JlYXRlIC9jYWNoZSBtb3VudCBwb2ludCBmb3Igbm9uLUEvQiBkZXZpY2VzIHRoYXQgbW91bnRzIC9jYWNoZS4KKyMgVGhlIHBhcnRpdGlvbiBzaXplIGRvZXNuJ3QgbWF0dGVyLCBqdXN0IHRvIG1ha2UgYnVpbGQgcGFzcy4KK0JPQVJEX0NBQ0hFSU1BR0VfRklMRV9TWVNURU1fVFlQRSA6PSBleHQ0CitCT0FSRF9DQUNIRUlNQUdFX1BBUlRJVElPTl9TSVpFIDo9IDE2Nzc3MjE2CisKK0JPQVJEX1NFUE9MSUNZX0RJUlMgKz0gZGV2aWNlL2dlbmVyaWMvZ29sZGZpc2gvc2Vwb2xpY3kvY29tbW9uCiBCT0FSRF9QUk9QRVJUWV9PVkVSUklERVNfU1BMSVRfRU5BQkxFRCA6PSB0cnVlCisKKyMgQW5kcm9pZCBWZXJpZmllZCBCb290IChBVkIpOgorIyAgIEJ1aWxkcyBhIHNwZWNpYWwgdmJtZXRhLmltZyB0aGF0IGRpc2FibGVzIEFWQiB2ZXJpZmljYXRpb24uCisjICAgT3RoZXJ3aXNlLCBBVkIgd2lsbCBwcmV2ZW50IHRoZSBkZXZpY2UgZnJvbSBib290aW5nIHRoZSBnZW5lcmljIHN5c3RlbS5pbWcuCisjICAgQWxzbyBjaGVja3MgdGhhdCBCT0FSRF9BVkJfRU5BQkxFIGlzIG5vdCBzZXQsIHRvIHByZXZlbnQgYWRkaW5nIHZlcml0eQorIyAgIG1ldGFkYXRhIGludG8gc3lzdGVtLmltZy4KK2lmZXEgKCQoQk9BUkRfQVZCX0VOQUJMRSksdHJ1ZSkKKyQoZXJyb3IgQk9BUkRfQVZCX0VOQUJMRSBjYW5ub3QgYmUgc2V0IGZvciBHU0kpCitlbmRpZgorQk9BUkRfQlVJTERfRElTQUJMRURfVkJNRVRBSU1BR0UgOj0gdHJ1ZQorCitpZm5lcSAoLCQoZmlsdGVyIHVzZXJkZWJ1ZyBlbmcsJChUQVJHRVRfQlVJTERfVkFSSUFOVCkpKQorIyBHU0kgaXMgYWx3YXlzIHVzZXJkZWJ1ZyBhbmQgbmVlZHMgYSBjb3VwbGUgb2YgcHJvcGVydGllcyB0YWtpbmcgcHJlY2VkZW5jZQorIyBvdmVyIHRob3NlIHNldCBieSB0aGUgdmVuZG9yLgorVEFSR0VUX1NZU1RFTV9QUk9QIDo9IGJ1aWxkL21ha2UvdGFyZ2V0L2JvYXJkL2dzaV9zeXN0ZW0ucHJvcAorZW5kaWYKK0JPQVJEX1ZOREtfVkVSU0lPTiA6PSBjdXJyZW50CisKKyMgV2lmaS4KK0JPQVJEX1dMQU5fREVWSUNFICAgICAgICAgICA6PSBlbXVsYXRvcgorQk9BUkRfSE9TVEFQRF9EUklWRVIgICAgICAgIDo9IE5MODAyMTEKK0JPQVJEX1dQQV9TVVBQTElDQU5UX0RSSVZFUiA6PSBOTDgwMjExCitCT0FSRF9IT1NUQVBEX1BSSVZBVEVfTElCICAgOj0gbGliX2RyaXZlcl9jbWRfc2ltdWxhdGVkCitCT0FSRF9XUEFfU1VQUExJQ0FOVF9QUklWQVRFX0xJQiA6PSBsaWJfZHJpdmVyX2NtZF9zaW11bGF0ZWQKK1dQQV9TVVBQTElDQU5UX1ZFUlNJT04gICAgICA6PSBWRVJfMF84X1gKK1dJRklfRFJJVkVSX0ZXX1BBVEhfUEFSQU0gICA6PSAiL2Rldi9udWxsIgorV0lGSV9EUklWRVJfRldfUEFUSF9TVEEgICAgIDo9ICIvZGV2L251bGwiCitXSUZJX0RSSVZFUl9GV19QQVRIX0FQICAgICAgOj0gIi9kZXYvbnVsbCIKKworIyBFbmFibGUgQS9CIHVwZGF0ZQorVEFSR0VUX05PX1JFQ09WRVJZIDo9IHRydWUKK0JPQVJEX0JVSUxEX1NZU1RFTV9ST09UX0lNQUdFIDo9IHRydWUKZGlmZiAtLWdpdCBhL3RhcmdldC9ib2FyZC9nZW5lcmljL2RldmljZS5tayBiL3RhcmdldC9ib2FyZC9nZW5lcmljL2RldmljZS5tawppbmRleCBlMThjMTY1Li4yNzNhYzcxIDEwMDY0NAotLS0gYS90YXJnZXQvYm9hcmQvZ2VuZXJpYy9kZXZpY2UubWsKKysrIGIvdGFyZ2V0L2JvYXJkL2dlbmVyaWMvZGV2aWNlLm1rCkBAIC0xNCwxOCArMTQsMTkgQEAKICMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLSMgVGhpcyBpcyBhIGJ1aWxkIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBwcm9kdWN0IGFzcGVjdHMgdGhhdAotIyBhcmUgc3BlY2lmaWMgdG8gdGhlIGVtdWxhdG9yLgorIyBtaW5pbWFsIGNvbmZpZ3VyYXRpb24gZm9yIGF1ZGlvIHBvbGljeS4KK1BST0RVQ1RfQ09QWV9GSUxFUyArPSBcCisgICAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb25fZ2VuZXJpYy54bWw6c3lzdGVtL2V0Yy9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwgXAorICAgIGZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL3ByaW1hcnlfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sOnN5c3RlbS9ldGMvcHJpbWFyeV9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwgXAorICAgIGZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL3Jfc3VibWl4X2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbDpzeXN0ZW0vZXRjL3Jfc3VibWl4X2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbCBcCisgICAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvYXVkaW9fcG9saWN5X3ZvbHVtZXMueG1sOnN5c3RlbS9ldGMvYXVkaW9fcG9saWN5X3ZvbHVtZXMueG1sIFwKKyAgICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9kZWZhdWx0X3ZvbHVtZV90YWJsZXMueG1sOnN5c3RlbS9ldGMvZGVmYXVsdF92b2x1bWVfdGFibGVzLnhtbCBcCiAKLVBST0RVQ1RfUFJPUEVSVFlfT1ZFUlJJREVTIDo9IFwKLSAgICByby5yaWwuaHN4cGE9MSBcCi0gICAgcm8ucmlsLmdwcnNjbGFzcz0xMAotCi1QUk9EVUNUX0NPUFlfRklMRVMgOj0gXAotICAgIGRldmljZS9nZW5lcmljL2dvbGRmaXNoL2RhdGEvZXRjL2FwbnMtY29uZi54bWw6c3lzdGVtL2V0Yy9hcG5zLWNvbmYueG1sIFwKLSAgICBkZXZpY2UvZ2VuZXJpYy9nb2xkZmlzaC9jYW1lcmEvbWVkaWFfcHJvZmlsZXMueG1sOnN5c3RlbS9ldGMvbWVkaWFfcHJvZmlsZXMueG1sIFwKLSAgICBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2RhdGEvbWVkaWFfY29kZWNzX2dvb2dsZV9hdWRpby54bWw6c3lzdGVtL2V0Yy9tZWRpYV9jb2RlY3NfZ29vZ2xlX2F1ZGlvLnhtbCBcCi0gICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9kYXRhL21lZGlhX2NvZGVjc19nb29nbGVfdGVsZXBob255LnhtbDpzeXN0ZW0vZXRjL21lZGlhX2NvZGVjc19nb29nbGVfdGVsZXBob255LnhtbCBcCi0gICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9kYXRhL21lZGlhX2NvZGVjc19nb29nbGVfdmlkZW8ueG1sOnN5c3RlbS9ldGMvbWVkaWFfY29kZWNzX2dvb2dsZV92aWRlby54bWwgXAotICAgIGRldmljZS9nZW5lcmljL2dvbGRmaXNoL2NhbWVyYS9tZWRpYV9jb2RlY3MueG1sOnN5c3RlbS9ldGMvbWVkaWFfY29kZWNzLnhtbCBcCi0gICAgaGFyZHdhcmUvbGliaGFyZHdhcmVfbGVnYWN5L2F1ZGlvL2F1ZGlvX3BvbGljeS5jb25mOnN5c3RlbS9ldGMvYXVkaW9fcG9saWN5LmNvbmYKKyMgTkZDOgorIyAgIFByb3ZpZGUgZGVmYXVsdCBsaWJuZmMtbmNpLmNvbmYgZmlsZSBmb3IgZGV2aWNlcyB0aGF0IGRvZXMgbm90IGhhdmUgb25lIGluCisjICAgdmVuZG9yL2V0YyBiZWNhdXNlIGFvc3Agc3lzdGVtIGltYWdlIChvZiBhb3NwXyRhcmNoIHByb2R1Y3RzKSBpcyBnb2luZyB0bworIyAgIGJlIHVzZWQgYXMgR1NJLgorIyAgIE1heSBuZWVkIHRvIHJlbW92ZSB0aGUgZm9sbG93aW5nIGZvciBuZXdseSBsYXVuY2hlZCBkZXZpY2VzIGluIFAgc2luY2UgdGhpcworIyAgIE5GQyBjb25maWd1cmF0aW9uIGZpbGUgc2hvdWxkIGJlIGluIHZlbmRvci9ldGMsIGluc3RlYWQgb2Ygc3lzdGVtL2V0YworUFJPRFVDVF9DT1BZX0ZJTEVTICs9IFwKKyAgICBkZXZpY2UvZ2VuZXJpYy9jb21tb24vbmZjL2xpYm5mYy1uY2kuY29uZjpzeXN0ZW0vZXRjL2xpYm5mYy1uY2kuY29uZgpkaWZmIC0tZ2l0IGEvdGFyZ2V0L2JvYXJkL2dlbmVyaWMvc2Vwb2xpY3kvYWRiZC50ZSBiL3RhcmdldC9ib2FyZC9nZW5lcmljL3NlcG9saWN5L2FkYmQudGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1NDZjMWEuLjAwMDAwMDAKLS0tIGEvdGFyZ2V0L2JvYXJkL2dlbmVyaWMvc2Vwb2xpY3kvYWRiZC50ZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLXNldF9wcm9wKGFkYmQsIGN0bF9tZG5zZF9wcm9wKTsKZGlmZiAtLWdpdCBhL3RhcmdldC9ib2FyZC9nZW5lcmljL3NlcG9saWN5L2F1ZGlvc2VydmVyLnRlIGIvdGFyZ2V0L2JvYXJkL2dlbmVyaWMvc2Vwb2xpY3kvYXVkaW9zZXJ2ZXIudGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzYzRhM2EuLjAwMDAwMDAKLS0tIGEvdGFyZ2V0L2JvYXJkL2dlbmVyaWMvc2Vwb2xpY3kvYXVkaW9zZXJ2ZXIudGUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1hbGxvdyBhdWRpb3NlcnZlciBib290YW5pbTpiaW5kZXIgY2FsbDsKZGlmZiAtLWdpdCBhL3RhcmdldC9ib2FyZC9nZW5lcmljL3NlcG9saWN5L2Jvb3RhbmltLnRlIGIvdGFyZ2V0L2JvYXJkL2dlbmVyaWMvc2Vwb2xpY3kvYm9vdGFuaW0udGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiZTFjOGEuLjAwMDAwMDAKLS0tIGEvdGFyZ2V0L2JvYXJkL2dlbmVyaWMvc2Vwb2xpY3kvYm9vdGFuaW0udGUKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLWFsbG93IGJvb3RhbmltIHNlbGY6cHJvY2VzcyBleGVjbWVtOwotYWxsb3cgYm9vdGFuaW0gYXNobWVtX2RldmljZTpjaHJfZmlsZSBleGVjdXRlOwotI1RPRE86IFRoaXMgY2FuIHNhZmVseSBiZSBpZ25vcmVkIHVudGlsIGIvNjI5NTQ4NzcgaXMgZml4ZWQKLWRvbnRhdWRpdCBib290YW5pbSBzeXN0ZW1fZGF0YV9maWxlOmRpciByZWFkOwotc2V0X3Byb3AoYm9vdGFuaW0sIHFlbXVfcHJvcCkKZGlmZiAtLWdpdCBhL3RhcmdldC9ib2FyZC9nZW5lcmljL3NlcG9saWN5L2NhbWVyYXNlcnZlci50ZSBiL3RhcmdldC9ib2FyZC9nZW5lcmljL3NlcG9saWN5L2NhbWVyYXNlcnZlci50ZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmNmNWQ2YS4uMDAwMDAwMAotLS0gYS90YXJnZXQvYm9hcmQvZ2VuZXJpYy9zZXBvbGljeS9jYW1lcmFzZXJ2ZXIudGUKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLWFsbG93IGNhbWVyYXNlcnZlciBzeXN0ZW1fZmlsZTpkaXIgeyBvcGVuIHJlYWQgfTsKLWFsbG93IGNhbWVyYXNlcnZlciBoYWxfYWxsb2NhdG9yOmZkIHVzZTsKZGlmZiAtLWdpdCBhL3RhcmdldC9ib2FyZC9nZW5lcmljL3NlcG9saWN5L2RldmljZS50ZSBiL3RhcmdldC9ib2FyZC9nZW5lcmljL3NlcG9saWN5L2RldmljZS50ZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDEyOTQ0MS4uMDAwMDAwMAotLS0gYS90YXJnZXQvYm9hcmQvZ2VuZXJpYy9zZXBvbGljeS9kZXZpY2UudGUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi10eXBlIHFlbXVfZGV2aWNlLCBkZXZfdHlwZSwgbWxzdHJ1c3RlZG9iamVjdDsKZGlmZiAtLWdpdCBhL3RhcmdldC9ib2FyZC9nZW5lcmljL3NlcG9saWN5L2RvbWFpbi50ZSBiL3RhcmdldC9ib2FyZC9nZW5lcmljL3NlcG9saWN5L2RvbWFpbi50ZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQ1ZTRhYy4uMDAwMDAwMAotLS0gYS90YXJnZXQvYm9hcmQvZ2VuZXJpYy9zZXBvbGljeS9kb21haW4udGUKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSMgRm9yIC9zeXMvcWVtdV90cmFjZSBmaWxlcyBpbiB0aGUgZW11bGF0b3IuCi1hbGxvdyBkb21haW4gc3lzZnNfd3JpdGFibGU6ZGlyIHNlYXJjaDsKLWFsbG93IGRvbWFpbiBzeXNmc193cml0YWJsZTpmaWxlIHJ3X2ZpbGVfcGVybXM7Ci1hbGxvdyBkb21haW4gcWVtdV9kZXZpY2U6Y2hyX2ZpbGUgcndfZmlsZV9wZXJtczsKLQotZ2V0X3Byb3AoZG9tYWluLCBxZW11X3Byb3ApCmRpZmYgLS1naXQgYS90YXJnZXQvYm9hcmQvZ2VuZXJpYy9zZXBvbGljeS9maWxlLnRlIGIvdGFyZ2V0L2JvYXJkL2dlbmVyaWMvc2Vwb2xpY3kvZmlsZS50ZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjRhZTllNC4uMDAwMDAwMAotLS0gYS90YXJnZXQvYm9hcmQvZ2VuZXJpYy9zZXBvbGljeS9maWxlLnRlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotdHlwZSBzeXNmc193cml0YWJsZSwgZnNfdHlwZSwgc3lzZnNfdHlwZSwgbWxzdHJ1c3RlZG9iamVjdDsKZGlmZiAtLWdpdCBhL3RhcmdldC9ib2FyZC9nZW5lcmljL3NlcG9saWN5L2ZpbGVfY29udGV4dHMgYi90YXJnZXQvYm9hcmQvZ2VuZXJpYy9zZXBvbGljeS9maWxlX2NvbnRleHRzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTUwZjRkLi4wMDAwMDAwCi0tLSBhL3RhcmdldC9ib2FyZC9nZW5lcmljL3NlcG9saWN5L2ZpbGVfY29udGV4dHMKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0jIGdvbGRmaXNoCi0vZGV2L2Jsb2NrL210ZGJsb2NrMCAgICAgICAgIHU6b2JqZWN0X3I6c3lzdGVtX2Jsb2NrX2RldmljZTpzMAotL2Rldi9ibG9jay9tdGRibG9jazEgICAgICAgICB1Om9iamVjdF9yOnVzZXJkYXRhX2Jsb2NrX2RldmljZTpzMAotL2Rldi9ibG9jay9tdGRibG9jazIgICAgICAgICB1Om9iamVjdF9yOmNhY2hlX2Jsb2NrX2RldmljZTpzMAotCi0jIHJhbmNodQotL2Rldi9ibG9jay92ZGEgICAgICAgICAgICAgICB1Om9iamVjdF9yOnN5c3RlbV9ibG9ja19kZXZpY2U6czAKLS9kZXYvYmxvY2svdmRiICAgICAgICAgICAgICAgdTpvYmplY3RfcjpjYWNoZV9ibG9ja19kZXZpY2U6czAKLS9kZXYvYmxvY2svdmRjICAgICAgICAgICAgICAgdTpvYmplY3Rfcjp1c2VyZGF0YV9ibG9ja19kZXZpY2U6czAKLS9kZXYvYmxvY2svdmRkICAgICAgICAgICAgICAgdTpvYmplY3RfcjptZXRhZGF0YV9ibG9ja19kZXZpY2U6czAKLS9kZXYvYmxvY2svdmRlICAgICAgICAgICAgICAgdTpvYmplY3RfcjpzeXN0ZW1fYmxvY2tfZGV2aWNlOnMwCi0KLS9kZXYvZ29sZGZpc2hfcGlwZSAgICAgICAgICAgdTpvYmplY3RfcjpxZW11X2RldmljZTpzMAotL2Rldi9nb2xkZmlzaF9zeW5jICAgICAgICAgICB1Om9iamVjdF9yOnFlbXVfZGV2aWNlOnMwCi0vZGV2L3FlbXVfLiogICAgICAgICAgICAgICAgIHU6b2JqZWN0X3I6cWVtdV9kZXZpY2U6czAKLS9kZXYvdHR5R0ZbMC05XSogICAgICAgICAgICAgdTpvYmplY3RfcjpzZXJpYWxfZGV2aWNlOnMwCi0vZGV2L3R0eVMyICAgICAgICAgICAgICAgICAgIHU6b2JqZWN0X3I6Y29uc29sZV9kZXZpY2U6czAKLS9zeXMvcWVtdV90cmFjZSgvLiopPyAgICAgICAgdTpvYmplY3RfcjpzeXNmc193cml0YWJsZTpzMAotL3ZlbmRvci9iaW4vaW5pdFwucmFuY2h1LWNvcmVcLnNoIHU6b2JqZWN0X3I6Z29sZGZpc2hfc2V0dXBfZXhlYzpzMAotL3ZlbmRvci9iaW4vaW5pdFwucmFuY2h1LW5ldFwuc2ggdTpvYmplY3Rfcjpnb2xkZmlzaF9zZXR1cF9leGVjOnMwCi0vdmVuZG9yL2Jpbi9xZW11LXByb3BzICAgICAgIHU6b2JqZWN0X3I6cWVtdV9wcm9wc19leGVjOnMwCi0KLS92ZW5kb3IvYmluL2h3L2FuZHJvaWRcLmhhcmR3YXJlXC5kcm1AMVwuMC1zZXJ2aWNlXC53aWRldmluZSAgICAgICAgICB1Om9iamVjdF9yOmhhbF9kcm1fd2lkZXZpbmVfZXhlYzpzMAotCi0vdmVuZG9yL2xpYig2NCk/L2h3L2dyYWxsb2NcLnJhbmNodVwuc28gICB1Om9iamVjdF9yOnNhbWVfcHJvY2Vzc19oYWxfZmlsZTpzMAotL3ZlbmRvci9saWIoNjQpPy9saWJFR0xfZW11bGF0aW9uXC5zbyAgICAgICAgICB1Om9iamVjdF9yOnNhbWVfcHJvY2Vzc19oYWxfZmlsZTpzMAotL3ZlbmRvci9saWIoNjQpPy9saWJHTEVTdjFfQ01fZW11bGF0aW9uXC5zbyAgICB1Om9iamVjdF9yOnNhbWVfcHJvY2Vzc19oYWxfZmlsZTpzMAotL3ZlbmRvci9saWIoNjQpPy9saWJHTEVTdjJfZW11bGF0aW9uXC5zbyAgICAgICB1Om9iamVjdF9yOnNhbWVfcHJvY2Vzc19oYWxfZmlsZTpzMAotL3ZlbmRvci9saWIoNjQpPy9saWJFR0xfc3dpZnRzaGFkZXJcLnNvICAgICAgICAgIHU6b2JqZWN0X3I6c2FtZV9wcm9jZXNzX2hhbF9maWxlOnMwCi0vdmVuZG9yL2xpYig2NCk/L2xpYkdMRVN2MV9DTV9zd2lmdHNoYWRlclwuc28gICAgdTpvYmplY3RfcjpzYW1lX3Byb2Nlc3NfaGFsX2ZpbGU6czAKLS92ZW5kb3IvbGliKDY0KT8vbGliR0xFU3YyX3N3aWZ0c2hhZGVyXC5zbyAgICAgICB1Om9iamVjdF9yOnNhbWVfcHJvY2Vzc19oYWxfZmlsZTpzMAotL3ZlbmRvci9saWIoNjQpPy9saWJPcGVuZ2xTeXN0ZW1Db21tb25cLnNvICAgICAgIHU6b2JqZWN0X3I6c2FtZV9wcm9jZXNzX2hhbF9maWxlOnMwCi0vdmVuZG9yL2xpYig2NCk/L2xpYl9yZW5kZXJDb250cm9sX2VuY1wuc28gICAgICAgdTpvYmplY3RfcjpzYW1lX3Byb2Nlc3NfaGFsX2ZpbGU6czAKLS92ZW5kb3IvbGliKDY0KT8vbGliR0xFU3YxX2VuY1wuc28gICAgICAgdTpvYmplY3RfcjpzYW1lX3Byb2Nlc3NfaGFsX2ZpbGU6czAKLS92ZW5kb3IvbGliKDY0KT8vbGliR0xFU3YyX2VuY1wuc28gICAgICAgdTpvYmplY3RfcjpzYW1lX3Byb2Nlc3NfaGFsX2ZpbGU6czAKZGlmZiAtLWdpdCBhL3RhcmdldC9ib2FyZC9nZW5lcmljL3NlcG9saWN5L2dvbGRmaXNoX3NldHVwLnRlIGIvdGFyZ2V0L2JvYXJkL2dlbmVyaWMvc2Vwb2xpY3kvZ29sZGZpc2hfc2V0dXAudGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjZDQ5YmQuLjAwMDAwMDAKLS0tIGEvdGFyZ2V0L2JvYXJkL2dlbmVyaWMvc2Vwb2xpY3kvZ29sZGZpc2hfc2V0dXAudGUKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIGdvbGRmaXNoLXNldHVwIHNlcnZpY2U6IHJ1bnMgaW5pdC5nb2xkZmlzaC5zaCBzY3JpcHQKLXR5cGUgZ29sZGZpc2hfc2V0dXAsIGRvbWFpbjsKLXR5cGUgZ29sZGZpc2hfc2V0dXBfZXhlYywgdmVuZG9yX2ZpbGVfdHlwZSwgZXhlY190eXBlLCBmaWxlX3R5cGU7Ci0KLWluaXRfZGFlbW9uX2RvbWFpbihnb2xkZmlzaF9zZXR1cCkKLQotYWxsb3cgZ29sZGZpc2hfc2V0dXAgc2VsZjpjYXBhYmlsaXR5IHsgbmV0X2FkbWluIG5ldF9yYXcgfTsKLWFsbG93IGdvbGRmaXNoX3NldHVwIHNlbGY6dWRwX3NvY2tldCB7IGNyZWF0ZSBpb2N0bCB9OwotYWxsb3cgZ29sZGZpc2hfc2V0dXAgdmVuZG9yX3Rvb2xib3hfZXhlYzpmaWxlIGV4ZWN1dGVfbm9fdHJhbnM7Ci1hbGxvd3hwZXJtIGdvbGRmaXNoX3NldHVwIHNlbGY6dWRwX3NvY2tldCBpb2N0bCBwcml2X3NvY2tfaW9jdGxzOwotd2FrZWxvY2tfdXNlKGdvbGRmaXNoX3NldHVwKTsKLWFsbG93IGdvbGRmaXNoX3NldHVwIHZlbmRvcl9zaGVsbF9leGVjOmZpbGUgeyByeF9maWxlX3Blcm1zIH07CmRpZmYgLS1naXQgYS90YXJnZXQvYm9hcmQvZ2VuZXJpYy9zZXBvbGljeS9oYWxfY2FtZXJhX2RlZmF1bHQudGUgYi90YXJnZXQvYm9hcmQvZ2VuZXJpYy9zZXBvbGljeS9oYWxfY2FtZXJhX2RlZmF1bHQudGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViODhjMzYuLjAwMDAwMDAKLS0tIGEvdGFyZ2V0L2JvYXJkL2dlbmVyaWMvc2Vwb2xpY3kvaGFsX2NhbWVyYV9kZWZhdWx0LnRlCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi12bmRiaW5kZXJfdXNlKGhhbF9jYW1lcmFfZGVmYXVsdCk7Ci1hbGxvdyBoYWxfY2FtZXJhX2RlZmF1bHQgaGFsX2dyYXBoaWNzX21hcHBlcl9od3NlcnZpY2U6aHdzZXJ2aWNlX21hbmFnZXIgZmluZDsKLWhhbF9jbGllbnRfZG9tYWluKGhhbF9jYW1lcmFfZGVmYXVsdCwgaGFsX2dyYXBoaWNzX2NvbXBvc2VyKQpkaWZmIC0tZ2l0IGEvdGFyZ2V0L2JvYXJkL2dlbmVyaWMvc2Vwb2xpY3kvaGFsX2Nhc19kZWZhdWx0LnRlIGIvdGFyZ2V0L2JvYXJkL2dlbmVyaWMvc2Vwb2xpY3kvaGFsX2Nhc19kZWZhdWx0LnRlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZWQzYmVlLi4wMDAwMDAwCi0tLSBhL3RhcmdldC9ib2FyZC9nZW5lcmljL3NlcG9saWN5L2hhbF9jYXNfZGVmYXVsdC50ZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLXZuZGJpbmRlcl91c2UoaGFsX2Nhc19kZWZhdWx0KTsKZGlmZiAtLWdpdCBhL3RhcmdldC9ib2FyZC9nZW5lcmljL3NlcG9saWN5L2hhbF9kcm1fZGVmYXVsdC50ZSBiL3RhcmdldC9ib2FyZC9nZW5lcmljL3NlcG9saWN5L2hhbF9kcm1fZGVmYXVsdC50ZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWEwNzQzMy4uMDAwMDAwMAotLS0gYS90YXJnZXQvYm9hcmQvZ2VuZXJpYy9zZXBvbGljeS9oYWxfZHJtX2RlZmF1bHQudGUKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLXZuZGJpbmRlcl91c2UoaGFsX2RybV9kZWZhdWx0KTsKLWhhbF9jbGllbnRfZG9tYWluKGhhbF9kcm1fZGVmYXVsdCwgaGFsX2dyYXBoaWNzX2NvbXBvc2VyKQpkaWZmIC0tZ2l0IGEvdGFyZ2V0L2JvYXJkL2dlbmVyaWMvc2Vwb2xpY3kvaGFsX2RybV93aWRldmluZS50ZSBiL3RhcmdldC9ib2FyZC9nZW5lcmljL3NlcG9saWN5L2hhbF9kcm1fd2lkZXZpbmUudGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyZDQ2MmEuLjAwMDAwMDAKLS0tIGEvdGFyZ2V0L2JvYXJkL2dlbmVyaWMvc2Vwb2xpY3kvaGFsX2RybV93aWRldmluZS50ZQorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMgZGVmaW5lIFNFTGludXggZG9tYWluCi10eXBlIGhhbF9kcm1fd2lkZXZpbmUsIGRvbWFpbjsKLWhhbF9zZXJ2ZXJfZG9tYWluKGhhbF9kcm1fd2lkZXZpbmUsIGhhbF9kcm0pCi0KLXR5cGUgaGFsX2RybV93aWRldmluZV9leGVjLCBleGVjX3R5cGUsIHZlbmRvcl9maWxlX3R5cGUsIGZpbGVfdHlwZTsKLWluaXRfZGFlbW9uX2RvbWFpbihoYWxfZHJtX3dpZGV2aW5lKQotCi1hbGxvdyBoYWxfZHJtIG1lZGlhY29kZWM6ZmQgdXNlOwotYWxsb3cgaGFsX2RybSB7IGFwcGRvbWFpbiAtaXNvbGF0ZWRfYXBwIH06ZmQgdXNlOwotCi12bmRiaW5kZXJfdXNlKGhhbF9kcm1fd2lkZXZpbmUpOwotaGFsX2NsaWVudF9kb21haW4oaGFsX2RybV93aWRldmluZSwgaGFsX2dyYXBoaWNzX2NvbXBvc2VyKTsKZGlmZiAtLWdpdCBhL3RhcmdldC9ib2FyZC9nZW5lcmljL3NlcG9saWN5L2hhbF9nbnNzX2RlZmF1bHQudGUgYi90YXJnZXQvYm9hcmQvZ2VuZXJpYy9zZXBvbGljeS9oYWxfZ25zc19kZWZhdWx0LnRlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGQzZDAzLi4wMDAwMDAwCi0tLSBhL3RhcmdldC9ib2FyZC9nZW5lcmljL3NlcG9saWN5L2hhbF9nbnNzX2RlZmF1bHQudGUKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSM9PT09PT09PT09PT09IGhhbF9nbnNzX2RlZmF1bHQgPT09PT09PT09PT09PT0KLWFsbG93IGhhbF9nbnNzX2RlZmF1bHQgdm5kYmluZGVyX2RldmljZTpjaHJfZmlsZSB7IGlvY3RsIG9wZW4gcmVhZCB3cml0ZSB9OwotCmRpZmYgLS1naXQgYS90YXJnZXQvYm9hcmQvZ2VuZXJpYy9zZXBvbGljeS9oYWxfZ3JhcGhpY3NfY29tcG9zZXJfZGVmYXVsdC50ZSBiL3RhcmdldC9ib2FyZC9nZW5lcmljL3NlcG9saWN5L2hhbF9ncmFwaGljc19jb21wb3Nlcl9kZWZhdWx0LnRlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzRiZGVmLi4wMDAwMDAwCi0tLSBhL3RhcmdldC9ib2FyZC9nZW5lcmljL3NlcG9saWN5L2hhbF9ncmFwaGljc19jb21wb3Nlcl9kZWZhdWx0LnRlCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jPT09PT09PT09PT09PSBoYWxfZ3JhcGhpY3NfY29tcG9zZXJfZGVmYXVsdCA9PT09PT09PT09PT09PQotYWxsb3cgaGFsX2dyYXBoaWNzX2NvbXBvc2VyX2RlZmF1bHQgdm5kYmluZGVyX2RldmljZTpjaHJfZmlsZSB7IGlvY3RsIG9wZW4gcmVhZCB3cml0ZSB9OwotCmRpZmYgLS1naXQgYS90YXJnZXQvYm9hcmQvZ2VuZXJpYy9zZXBvbGljeS9pbml0LnRlIGIvdGFyZ2V0L2JvYXJkL2dlbmVyaWMvc2Vwb2xpY3kvaW5pdC50ZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODRhNGU4ZC4uMDAwMDAwMAotLS0gYS90YXJnZXQvYm9hcmQvZ2VuZXJpYy9zZXBvbGljeS9pbml0LnRlCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1hbGxvdyBpbml0IHRtcGZzOmxua19maWxlIGNyZWF0ZV9maWxlX3Blcm1zOwotZG9udGF1ZGl0IGluaXQga2VybmVsOnN5c3RlbSBtb2R1bGVfcmVxdWVzdDsKZGlmZiAtLWdpdCBhL3RhcmdldC9ib2FyZC9nZW5lcmljL3NlcG9saWN5L2xvZ3BlcnNpc3QudGUgYi90YXJnZXQvYm9hcmQvZ2VuZXJpYy9zZXBvbGljeS9sb2dwZXJzaXN0LnRlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZmMwMjUwLi4wMDAwMDAwCi0tLSBhL3RhcmdldC9ib2FyZC9nZW5lcmljL3NlcG9saWN5L2xvZ3BlcnNpc3QudGUKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIGdvbGRmaXNoIGxvZ2NhdCBzZXJ2aWNlOiAgcnVucyBsb2djYXQgLVEgaW4gbG9ncGVyc2lzdCBkb21haW4KLQotIyBTZWUgZ2xvYmFsIGxvZ2NhdC50ZS9sb2dwZXJzaXN0LnRlLCBvbmx5IHNldCBmb3IgZW5nICYgdXNlcmRlYnVnLAotIyBhbGxvdyBmb3IgYWxsIGJ1aWxkcyBpbiBhIG5vbi1jb25mbGljdGluZyBtYW5uZXIuCi0KLWRvbWFpbl9hdXRvX3RyYW5zKGluaXQsIGxvZ2NhdF9leGVjLCBsb2dwZXJzaXN0KQotCi0jIFJlYWQgZnJvbSBsb2dkLgotdW5peF9zb2NrZXRfY29ubmVjdChsb2dwZXJzaXN0LCBsb2dkciwgbG9nZCkKLQotIyBXcml0ZSB0byAvZGV2L3R0eVMyIGFuZCAvZGV2L3R0eUdGMi4KLWFsbG93IGxvZ3BlcnNpc3Qgc2VyaWFsX2RldmljZTpjaHJfZmlsZSB7IHdyaXRlIG9wZW4gfTsKLWdldF9wcm9wKGxvZ3BlcnNpc3QsIHFlbXVfY21kbGluZSkKZGlmZiAtLWdpdCBhL3RhcmdldC9ib2FyZC9nZW5lcmljL3NlcG9saWN5L21lZGlhY29kZWMudGUgYi90YXJnZXQvYm9hcmQvZ2VuZXJpYy9zZXBvbGljeS9tZWRpYWNvZGVjLnRlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2Y0ZTU5Li4wMDAwMDAwCi0tLSBhL3RhcmdldC9ib2FyZC9nZW5lcmljL3NlcG9saWN5L21lZGlhY29kZWMudGUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1hbGxvdyBtZWRpYWNvZGVjIHN5c3RlbV9maWxlOmRpciB7IG9wZW4gcmVhZCB9OwpkaWZmIC0tZ2l0IGEvdGFyZ2V0L2JvYXJkL2dlbmVyaWMvc2Vwb2xpY3kvbmV0ZC50ZSBiL3RhcmdldC9ib2FyZC9nZW5lcmljL3NlcG9saWN5L25ldGQudGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5YTI4YjkuLjAwMDAwMDAKLS0tIGEvdGFyZ2V0L2JvYXJkL2dlbmVyaWMvc2Vwb2xpY3kvbmV0ZC50ZQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotZG9udGF1ZGl0IG5ldGQgc2VsZjpjYXBhYmlsaXR5IHN5c19tb2R1bGU7Ci0jVE9ETzogVGhpcyBjYW4gc2FmZWx5IGJlIGlnbm9yZWQgdW50aWwgYi82Mjk1NDg3NyBpcyBmaXhlZAotZG9udGF1ZGl0IG5ldGQga2VybmVsOnN5c3RlbSBtb2R1bGVfcmVxdWVzdDsKZGlmZiAtLWdpdCBhL3RhcmdldC9ib2FyZC9nZW5lcmljL3NlcG9saWN5L3ByaXZfYXBwLnRlIGIvdGFyZ2V0L2JvYXJkL2dlbmVyaWMvc2Vwb2xpY3kvcHJpdl9hcHAudGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkMTZmMzIuLjAwMDAwMDAKLS0tIGEvdGFyZ2V0L2JvYXJkL2dlbmVyaWMvc2Vwb2xpY3kvcHJpdl9hcHAudGUKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLSNUT0RPOiBiLzYyOTA4MDI1Ci1kb250YXVkaXQgcHJpdl9hcHAgZmlyc3Rib290X3Byb3A6ZmlsZSB7IGdldGF0dHIgb3BlbiB9OwotZG9udGF1ZGl0IHByaXZfYXBwIGRldmljZTpkaXIgeyBvcGVuIHJlYWQgfTsKLWRvbnRhdWRpdCBwcml2X2FwcCBwcm9jX2ludGVycnVwdHM6ZmlsZSB7IGdldGF0dHIgb3BlbiByZWFkIH07Ci1kb250YXVkaXQgcHJpdl9hcHAgcHJvY19tb2R1bGVzOmZpbGUgeyBnZXRhdHRyIG9wZW4gcmVhZCB9OwpkaWZmIC0tZ2l0IGEvdGFyZ2V0L2JvYXJkL2dlbmVyaWMvc2Vwb2xpY3kvcHJvcGVydHkudGUgYi90YXJnZXQvYm9hcmQvZ2VuZXJpYy9zZXBvbGljeS9wcm9wZXJ0eS50ZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQ4NjcwMi4uMDAwMDAwMAotLS0gYS90YXJnZXQvYm9hcmQvZ2VuZXJpYy9zZXBvbGljeS9wcm9wZXJ0eS50ZQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotdHlwZSBxZW11X3Byb3AsIHByb3BlcnR5X3R5cGU7Ci10eXBlIHFlbXVfY21kbGluZSwgcHJvcGVydHlfdHlwZTsKLXR5cGUgcmFkaW9fbm9yaWxfcHJvcCwgcHJvcGVydHlfdHlwZTsKLXR5cGUgb3BlbmdsZXNfcHJvcCwgcHJvcGVydHlfdHlwZTsKZGlmZiAtLWdpdCBhL3RhcmdldC9ib2FyZC9nZW5lcmljL3NlcG9saWN5L3Byb3BlcnR5X2NvbnRleHRzIGIvdGFyZ2V0L2JvYXJkL2dlbmVyaWMvc2Vwb2xpY3kvcHJvcGVydHlfY29udGV4dHMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2NmE4NWYuLjAwMDAwMDAKLS0tIGEvdGFyZ2V0L2JvYXJkL2dlbmVyaWMvc2Vwb2xpY3kvcHJvcGVydHlfY29udGV4dHMKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLXFlbXUuICAgICAgICAgICAgICAgICAgIHU6b2JqZWN0X3I6cWVtdV9wcm9wOnMwCi1xZW11LmNtZGxpbmUgICAgICAgICAgICB1Om9iamVjdF9yOnFlbXVfY21kbGluZTpzMAotcm8uZW11LiAgICAgICAgICAgICAgICAgdTpvYmplY3RfcjpxZW11X3Byb3A6czAKLXJvLmVtdWxhdG9yLiAgICAgICAgICAgIHU6b2JqZWN0X3I6cWVtdV9wcm9wOnMwCi1yby5yYWRpby5ub3JpbCAgICAgICAgICB1Om9iamVjdF9yOnJhZGlvX25vcmlsX3Byb3A6czAKLXJvLm9wZW5nbGVzLiAgICAgICAgICAgIHU6b2JqZWN0X3I6b3BlbmdsZXNfcHJvcDpzMApkaWZmIC0tZ2l0IGEvdGFyZ2V0L2JvYXJkL2dlbmVyaWMvc2Vwb2xpY3kvcWVtdV9wcm9wcy50ZSBiL3RhcmdldC9ib2FyZC9nZW5lcmljL3NlcG9saWN5L3FlbXVfcHJvcHMudGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmNWVjOGMuLjAwMDAwMDAKLS0tIGEvdGFyZ2V0L2JvYXJkL2dlbmVyaWMvc2Vwb2xpY3kvcWVtdV9wcm9wcy50ZQorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotIyBxZW11LXByb3BzIHNlcnZpY2U6ICBTZXRzIHN5c3RlbSBwcm9wZXJ0aWVzIG9uIGJvb3QuCi10eXBlIHFlbXVfcHJvcHMsIGRvbWFpbjsKLXR5cGUgcWVtdV9wcm9wc19leGVjLCB2ZW5kb3JfZmlsZV90eXBlLCBleGVjX3R5cGUsIGZpbGVfdHlwZTsKLQotaW5pdF9kYWVtb25fZG9tYWluKHFlbXVfcHJvcHMpCi0KLXNldF9wcm9wKHFlbXVfcHJvcHMsIHFlbXVfcHJvcCkKLXNldF9wcm9wKHFlbXVfcHJvcHMsIGRhbHZpa19wcm9wKQotc2V0X3Byb3AocWVtdV9wcm9wcywgcWVtdV9jbWRsaW5lKQpkaWZmIC0tZ2l0IGEvdGFyZ2V0L2JvYXJkL2dlbmVyaWMvc2Vwb2xpY3kvc2hlbGwudGUgYi90YXJnZXQvYm9hcmQvZ2VuZXJpYy9zZXBvbGljeS9zaGVsbC50ZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjI0NmQ3ZS4uMDAwMDAwMAotLS0gYS90YXJnZXQvYm9hcmQvZ2VuZXJpYy9zZXBvbGljeS9zaGVsbC50ZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWFsbG93IHNoZWxsIHNlcmlhbF9kZXZpY2U6Y2hyX2ZpbGUgcndfZmlsZV9wZXJtczsKZGlmZiAtLWdpdCBhL3RhcmdldC9ib2FyZC9nZW5lcmljL3NlcG9saWN5L3N1cmZhY2VmbGluZ2VyLnRlIGIvdGFyZ2V0L2JvYXJkL2dlbmVyaWMvc2Vwb2xpY3kvc3VyZmFjZWZsaW5nZXIudGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwM2QwN2UuLjAwMDAwMDAKLS0tIGEvdGFyZ2V0L2JvYXJkL2dlbmVyaWMvc2Vwb2xpY3kvc3VyZmFjZWZsaW5nZXIudGUKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLWFsbG93IHN1cmZhY2VmbGluZ2VyIHNlbGY6cHJvY2VzcyBleGVjbWVtOwotYWxsb3cgc3VyZmFjZWZsaW5nZXIgYXNobWVtX2RldmljZTpjaHJfZmlsZSBleGVjdXRlOwotCi1zZXRfcHJvcChzdXJmYWNlZmxpbmdlciwgcWVtdV9wcm9wKQpkaWZmIC0tZ2l0IGEvdGFyZ2V0L2JvYXJkL2dlbmVyaWMvc2Vwb2xpY3kvc3lzdGVtX3NlcnZlci50ZSBiL3RhcmdldC9ib2FyZC9nZW5lcmljL3NlcG9saWN5L3N5c3RlbV9zZXJ2ZXIudGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwNjMwOTUuLjAwMDAwMDAKLS0tIGEvdGFyZ2V0L2JvYXJkL2dlbmVyaWMvc2Vwb2xpY3kvc3lzdGVtX3NlcnZlci50ZQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotZ2V0X3Byb3Aoc3lzdGVtX3NlcnZlciwgb3BlbmdsZXNfcHJvcCkKLWdldF9wcm9wKHN5c3RlbV9zZXJ2ZXIsIHJhZGlvX25vcmlsX3Byb3ApCmRpZmYgLS1naXQgYS90YXJnZXQvYm9hcmQvZ2VuZXJpYy9zZXBvbGljeS92b2xkLnRlIGIvdGFyZ2V0L2JvYXJkL2dlbmVyaWMvc2Vwb2xpY3kvdm9sZC50ZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWYzYmRkNC4uMDAwMDAwMAotLS0gYS90YXJnZXQvYm9hcmQvZ2VuZXJpYy9zZXBvbGljeS92b2xkLnRlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotZG9udGF1ZGl0IHZvbGQga2VybmVsOnN5c3RlbSBtb2R1bGVfcmVxdWVzdDsKZGlmZiAtLWdpdCBhL3RhcmdldC9ib2FyZC9nZW5lcmljL3NlcG9saWN5L3p5Z290ZS50ZSBiL3RhcmdldC9ib2FyZC9nZW5lcmljL3NlcG9saWN5L3p5Z290ZS50ZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTk3ZDg5NS4uMDAwMDAwMAotLS0gYS90YXJnZXQvYm9hcmQvZ2VuZXJpYy9zZXBvbGljeS96eWdvdGUudGUKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLXNldF9wcm9wKHp5Z290ZSwgcWVtdV9wcm9wKQotIyBUT0RPIChiLzYzNjMxNzk5KSBmaXggdGhpcyBhY2Nlc3MKLSMgU3VwcHJlc3MgZGVuaWFscyB0byBzdG9yYWdlLiBXZWJ2aWV3IHp5Z290ZSBzaG91bGQgbm90IGJlIGFjY2Vzc2luZy4KLWRvbnRhdWRpdCB3ZWJ2aWV3X3p5Z290ZSBtbnRfZXhwYW5kX2ZpbGU6ZGlyIGdldGF0dHI7CmRpZmYgLS1naXQgYS90YXJnZXQvYm9hcmQvZ2VuZXJpY19hcm02NC9Cb2FyZENvbmZpZy5tayBiL3RhcmdldC9ib2FyZC9nZW5lcmljX2FybTY0L0JvYXJkQ29uZmlnLm1rCmluZGV4IDQ2Yzg4NjUuLjU2ZjE1ZGUgMTAwNjQ0Ci0tLSBhL3RhcmdldC9ib2FyZC9nZW5lcmljX2FybTY0L0JvYXJkQ29uZmlnLm1rCisrKyBiL3RhcmdldC9ib2FyZC9nZW5lcmljX2FybTY0L0JvYXJkQ29uZmlnLm1rCkBAIC0yMCwxMiArMjAsMTMgQEAKIFRBUkdFVF9BUkNIX1ZBUklBTlQgOj0gYXJtdjgtYQogVEFSR0VUX0NQVV9WQVJJQU5UIDo9IGdlbmVyaWMKIFRBUkdFVF9DUFVfQUJJIDo9IGFybTY0LXY4YQorVEFSR0VUX0JPT1RMT0FERVJfQk9BUkRfTkFNRSA6PSBnb2xkZmlzaF8kKFRBUkdFVF9BUkNIKQogCiBUQVJHRVRfMk5EX0FSQ0ggOj0gYXJtCiBUQVJHRVRfMk5EX0NQVV9BQkkgOj0gYXJtZWFiaS12N2EKIFRBUkdFVF8yTkRfQ1BVX0FCSTIgOj0gYXJtZWFiaQogCi1pZm5lcSAoJChUQVJHRVRfQlVJTERfQVBQUykkKGZpbHRlciBjdHMsJChNQUtFQ01ER09BTFMpKSwpCitpZm5lcSAoJChUQVJHRVRfQlVJTERfQVBQUykkKGZpbHRlciBjdHMgc2RrLCQoTUFLRUNNREdPQUxTKSksKQogIyBETyBOT1QgVVNFCiAjIERPIE5PVCBVU0UKICMKQEAgLTM1LDExICszNiwxMSBAQAogIyBwbGF0Zm9ybXMuCiAjCiAjIElmIHlvdSdyZSBidWlsZGluZyBhIDY0IGJpdCBwbGF0Zm9ybSAoYW5kIG5vdCBhbiBhcHBsaWNhdGlvbikgdGhlCi0jIEFSTS12OCBzcGVjaWZpY2F0aW9uIGFsbG93cyB5b3UgdG8gYXNzdW1lIE5FT04gYW5kIGFsbCB0aGUgZmVhdHVyZXMKLSMgYXZhaWxhYmxlIGluIGEgY29ydGV4LUExNSBDUFUuIFlvdSBzaG91bGQgYmUgYWJsZSB0byBzZXQgOgorIyBBUk0tdjggc3BlY2lmaWNhdGlvbiBhbGxvd3MgeW91IHRvIGFzc3VtZSBhbGwgdGhlIGZlYXR1cmVzIGF2YWlsYWJsZSBpbiBhbgorIyBhcm12Ny1hLW5lb24gQ1BVLiBZb3Ugc2hvdWxkIHNldCB0aGUgZm9sbG93aW5nIGFzIDJuZCBhcmNoL2NwdSB2YXJpYW50OgogIwotIyBUQVJHRVRfMk5EX0FSQ0hfVkFSSUFOVCA6PSBhcm12Ny1hLW5lb24KLSMgVEFSR0VUXzJORF9DUFVfVkFSSUFOVCA6PSBjb3J0ZXgtYTE1CisjIFRBUkdFVF8yTkRfQVJDSF9WQVJJQU5UIDo9IGFybXY4LWEKKyMgVEFSR0VUXzJORF9DUFVfVkFSSUFOVCA6PSBnZW5lcmljCiAjCiAjIERPIE5PVCBVU0UKICMgRE8gTk9UIFVTRQpAQCAtNTAsOCArNTEsOCBAQAogIyBETyBOT1QgVVNFCiAjIERPIE5PVCBVU0UKIGVsc2UKLVRBUkdFVF8yTkRfQVJDSF9WQVJJQU5UIDo9IGFybXY3LWEtbmVvbgotVEFSR0VUXzJORF9DUFVfVkFSSUFOVCA6PSBjb3J0ZXgtYTE1CitUQVJHRVRfMk5EX0FSQ0hfVkFSSUFOVCA6PSBhcm12OC1hCitUQVJHRVRfMk5EX0NQVV9WQVJJQU5UIDo9IGdlbmVyaWMKIGVuZGlmCiAKIApAQCAtNjAsMTUgKzYxLDYgQEAKICMgbm8gaGFyZHdhcmUgY2FtZXJhCiBVU0VfQ0FNRVJBX1NUVUIgOj0gdHJ1ZQogCi0jIEVuYWJsZSBkZXgtcHJlb3B0aW1pemF0aW9uIHRvIHNwZWVkIHVwIHRoZSBmaXJzdCBib290IHNlcXVlbmNlCi0jIG9mIGFuIFNESyBBVkQuIE5vdGUgdGhhdCB0aGlzIG9wZXJhdGlvbiBvbmx5IHdvcmtzIG9uIExpbnV4IGZvciBub3cKLWlmZXEgKCQoSE9TVF9PUyksbGludXgpCi0gIGlmZXEgKCQoV0lUSF9ERVhQUkVPUFQpLCkKLSAgICBXSVRIX0RFWFBSRU9QVCA6PSB0cnVlCi0gICAgV0lUSF9ERVhQUkVPUFRfQk9PVF9JTUdfQU5EX1NZU1RFTV9TRVJWRVJfT05MWSA6PSBmYWxzZQotICBlbmRpZgotZW5kaWYKLQogVEFSR0VUX1VTRVNfSFdDMiA6PSB0cnVlCiBOVU1fRlJBTUVCVUZGRVJfU1VSRkFDRV9CVUZGRVJTIDo9IDMKIApAQCAtODEsMTggKzczLDY3IEBACiBVU0VfT1BFTkdMX1JFTkRFUkVSIDo9IHRydWUKIAogVEFSR0VUX1VTRVJJTUFHRVNfVVNFX0VYVDQgOj0gdHJ1ZQotQk9BUkRfU1lTVEVNSU1BR0VfUEFSVElUSU9OX1NJWkUgOj0gMjY4NDM1NDU2MCAgIyAyLjUgR0IKK0JPQVJEX1NZU1RFTUlNQUdFX1BBUlRJVElPTl9TSVpFIDo9IDI2ODQzNTQ1NjAgIyAyLjUgR0IKIEJPQVJEX1VTRVJEQVRBSU1BR0VfUEFSVElUSU9OX1NJWkUgOj0gNTc2NzE2ODAwCiBUQVJHRVRfQ09QWV9PVVRfVkVORE9SIDo9IHZlbmRvcgogIyB+MTAwIE1CIHZlbmRvciBpbWFnZS4gUGxlYXNlIGFkanVzdCBzeXN0ZW0gaW1hZ2UgLyB2ZW5kb3IgaW1hZ2Ugc2l6ZXMKICMgd2hlbiBmaW5hbGl6aW5nIHRoZW0uCiBCT0FSRF9WRU5ET1JJTUFHRV9QQVJUSVRJT05fU0laRSA6PSAxMDAwMDAwMDAKIEJPQVJEX1ZFTkRPUklNQUdFX0ZJTEVfU1lTVEVNX1RZUEUgOj0gZXh0NAotQk9BUkRfQ0FDSEVJTUFHRV9QQVJUSVRJT05fU0laRSA6PSA2OTIwNjAxNgotQk9BUkRfQ0FDSEVJTUFHRV9GSUxFX1NZU1RFTV9UWVBFIDo9IGV4dDQKIEJPQVJEX0ZMQVNIX0JMT0NLX1NJWkUgOj0gNTEyCiBUQVJHRVRfVVNFUklNQUdFU19TUEFSU0VfRVhUX0RJU0FCTEVEIDo9IHRydWUKIERFVklDRV9NQVRSSVhfRklMRSAgIDo9IGRldmljZS9nZW5lcmljL2dvbGRmaXNoL2NvbXBhdGliaWxpdHlfbWF0cml4LnhtbAogCisjIEFuZHJvaWQgZ2VuZXJpYyBzeXN0ZW0gaW1hZ2UgYWx3YXlzIGNyZWF0ZSBtZXRhZGF0YSBwYXJ0aXRpb24KK0JPQVJEX1VTRVNfTUVUQURBVEFfUEFSVElUSU9OIDo9IHRydWUKKworIyBTZXQgdGhpcyB0byBjcmVhdGUgL2NhY2hlIG1vdW50IHBvaW50IGZvciBub24tQS9CIGRldmljZXMgdGhhdCBtb3VudHMgL2NhY2hlLgorIyBUaGUgcGFydGl0aW9uIHNpemUgZG9lc24ndCBtYXR0ZXIsIGp1c3QgdG8gbWFrZSBidWlsZCBwYXNzLgorQk9BUkRfQ0FDSEVJTUFHRV9GSUxFX1NZU1RFTV9UWVBFIDo9IGV4dDQKK0JPQVJEX0NBQ0hFSU1BR0VfUEFSVElUSU9OX1NJWkUgOj0gMTY3NzcyMTYKKwogQk9BUkRfUFJPUEVSVFlfT1ZFUlJJREVTX1NQTElUX0VOQUJMRUQgOj0gdHJ1ZQotQk9BUkRfU0VQT0xJQ1lfRElSUyArPSBidWlsZC90YXJnZXQvYm9hcmQvZ2VuZXJpYy9zZXBvbGljeQorQk9BUkRfU0VQT0xJQ1lfRElSUyArPSBkZXZpY2UvZ2VuZXJpYy9nb2xkZmlzaC9zZXBvbGljeS9jb21tb24KKworIyBBbmRyb2lkIFZlcmlmaWVkIEJvb3QgKEFWQik6CisjICAgQnVpbGRzIGEgc3BlY2lhbCB2Ym1ldGEuaW1nIHRoYXQgZGlzYWJsZXMgQVZCIHZlcmlmaWNhdGlvbi4KKyMgICBPdGhlcndpc2UsIEFWQiB3aWxsIHByZXZlbnQgdGhlIGRldmljZSBmcm9tIGJvb3RpbmcgdGhlIGdlbmVyaWMgc3lzdGVtLmltZy4KKyMgICBBbHNvIGNoZWNrcyB0aGF0IEJPQVJEX0FWQl9FTkFCTEUgaXMgbm90IHNldCwgdG8gcHJldmVudCBhZGRpbmcgdmVyaXR5CisjICAgbWV0YWRhdGEgaW50byBzeXN0ZW0uaW1nLgoraWZlcSAoJChCT0FSRF9BVkJfRU5BQkxFKSx0cnVlKQorJChlcnJvciBCT0FSRF9BVkJfRU5BQkxFIGNhbm5vdCBiZSBzZXQgZm9yIEdTSSkKK2VuZGlmCitCT0FSRF9CVUlMRF9ESVNBQkxFRF9WQk1FVEFJTUFHRSA6PSB0cnVlCisKK2lmbmVxICgsJChmaWx0ZXIgdXNlcmRlYnVnIGVuZywkKFRBUkdFVF9CVUlMRF9WQVJJQU5UKSkpCisjIEdTSSBpcyBhbHdheXMgdXNlcmRlYnVnIGFuZCBuZWVkcyBhIGNvdXBsZSBvZiBwcm9wZXJ0aWVzIHRha2luZyBwcmVjZWRlbmNlCisjIG92ZXIgdGhvc2Ugc2V0IGJ5IHRoZSB2ZW5kb3IuCitUQVJHRVRfU1lTVEVNX1BST1AgOj0gYnVpbGQvbWFrZS90YXJnZXQvYm9hcmQvZ3NpX3N5c3RlbS5wcm9wCitlbmRpZgorQk9BUkRfVk5ES19WRVJTSU9OIDo9IGN1cnJlbnQKKworIyBFbXVsYXRvciBzeXN0ZW0gaW1hZ2UgaXMgZ29pbmcgdG8gYmUgdXNlZCBhcyBHU0kgYW5kIHNvbWUgdmVuZG9yIHN0aWxsIGhhc24ndAorIyBjbGVhbmVkIHVwIGFsbCBkZXZpY2Ugc3BlY2lmaWMgZGlyZWN0b3JpZXMgdW5kZXIgcm9vdCEKKworIyBUT0RPKGppeW9uZykgVGhlc2UgbWlnaHQgYmUgU29DIHNwZWNpZmljLgorQk9BUkRfUk9PVF9FWFRSQV9GT0xERVJTICs9IGZpcm13YXJlIGZpcm13YXJlL3JhZGlvIHBlcnNpc3QKK0JPQVJEX1JPT1RfRVhUUkFfU1lNTElOS1MgOj0gL3ZlbmRvci9saWIvZHNwOi9kc3AKKworIyBUT0RPKGIvMzY3NjQyMTUpOiByZW1vdmUgdGhpcyBzZXR0aW5nIHdoZW4gdGhlIGdlbmVyaWMgc3lzdGVtIGltYWdlCisjIG5vIGxvbmdlciBoYXMgUUNPTS1zcGVjaWZpYyBkaXJlY3RvcmllcyB1bmRlciAvLgorQk9BUkRfU0VQT0xJQ1lfRElSUyArPSBidWlsZC90YXJnZXQvYm9hcmQvZ2VuZXJpY19hcm02NF9hYi9zZXBvbGljeQorCisjIFdpZmkuCitCT0FSRF9XTEFOX0RFVklDRSAgICAgICAgICAgOj0gZW11bGF0b3IKK0JPQVJEX0hPU1RBUERfRFJJVkVSICAgICAgICA6PSBOTDgwMjExCitCT0FSRF9XUEFfU1VQUExJQ0FOVF9EUklWRVIgOj0gTkw4MDIxMQorQk9BUkRfSE9TVEFQRF9QUklWQVRFX0xJQiAgIDo9IGxpYl9kcml2ZXJfY21kX3NpbXVsYXRlZAorQk9BUkRfV1BBX1NVUFBMSUNBTlRfUFJJVkFURV9MSUIgOj0gbGliX2RyaXZlcl9jbWRfc2ltdWxhdGVkCitXUEFfU1VQUExJQ0FOVF9WRVJTSU9OICAgICAgOj0gVkVSXzBfOF9YCitXSUZJX0RSSVZFUl9GV19QQVRIX1BBUkFNICAgOj0gIi9kZXYvbnVsbCIKK1dJRklfRFJJVkVSX0ZXX1BBVEhfU1RBICAgICA6PSAiL2Rldi9udWxsIgorV0lGSV9EUklWRVJfRldfUEFUSF9BUCAgICAgIDo9ICIvZGV2L251bGwiCisKKyMgRW5hYmxlIEEvQiB1cGRhdGUKK1RBUkdFVF9OT19SRUNPVkVSWSA6PSB0cnVlCitCT0FSRF9CVUlMRF9TWVNURU1fUk9PVF9JTUFHRSA6PSB0cnVlCmRpZmYgLS1naXQgYS90YXJnZXQvYm9hcmQvZ2VuZXJpY19hcm02NC9kZXZpY2UubWsgYi90YXJnZXQvYm9hcmQvZ2VuZXJpY19hcm02NC9kZXZpY2UubWsKaW5kZXggY2EyODdlYi4uOGUyNjcwMCAxMDA2NDQKLS0tIGEvdGFyZ2V0L2JvYXJkL2dlbmVyaWNfYXJtNjQvZGV2aWNlLm1rCisrKyBiL3RhcmdldC9ib2FyZC9nZW5lcmljX2FybTY0L2RldmljZS5tawpAQCAtMTQsMjAgKzE0LDIyIEBACiAjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi0jIFRoaXMgaXMgYSBidWlsZCBjb25maWd1cmF0aW9uIGZvciB0aGUgcHJvZHVjdCBhc3BlY3RzIHRoYXQKLSMgYXJlIHNwZWNpZmljIHRvIHRoZSBlbXVsYXRvci4KKyMgbWluaW1hbCBjb25maWd1cmF0aW9uIGZvciBhdWRpbyBwb2xpY3kuCitQUk9EVUNUX0NPUFlfRklMRVMgKz0gXAorICAgIGZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uX2dlbmVyaWMueG1sOnN5c3RlbS9ldGMvYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sIFwKKyAgICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9wcmltYXJ5X2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbDpzeXN0ZW0vZXRjL3ByaW1hcnlfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sIFwKKyAgICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9yX3N1Ym1peF9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWw6c3lzdGVtL2V0Yy9yX3N1Ym1peF9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwgXAorICAgIGZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL2F1ZGlvX3BvbGljeV92b2x1bWVzLnhtbDpzeXN0ZW0vZXRjL2F1ZGlvX3BvbGljeV92b2x1bWVzLnhtbCBcCisgICAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvZGVmYXVsdF92b2x1bWVfdGFibGVzLnhtbDpzeXN0ZW0vZXRjL2RlZmF1bHRfdm9sdW1lX3RhYmxlcy54bWwgXAogCi1QUk9EVUNUX1BST1BFUlRZX09WRVJSSURFUyA6PSBcCi0gICAgcm8ucmlsLmhzeHBhPTEgXAotICAgIHJvLnJpbC5ncHJzY2xhc3M9MTAKLQotUFJPRFVDVF9DT1BZX0ZJTEVTIDo9IFwKLSAgICBkZXZpY2UvZ2VuZXJpYy9nb2xkZmlzaC9kYXRhL2V0Yy9hcG5zLWNvbmYueG1sOnN5c3RlbS9ldGMvYXBucy1jb25mLnhtbCBcCi0gICAgZGV2aWNlL2dlbmVyaWMvZ29sZGZpc2gvY2FtZXJhL21lZGlhX3Byb2ZpbGVzLnhtbDpzeXN0ZW0vZXRjL21lZGlhX3Byb2ZpbGVzLnhtbCBcCi0gICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9kYXRhL21lZGlhX2NvZGVjc19nb29nbGVfYXVkaW8ueG1sOnN5c3RlbS9ldGMvbWVkaWFfY29kZWNzX2dvb2dsZV9hdWRpby54bWwgXAotICAgIGZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZGF0YS9tZWRpYV9jb2RlY3NfZ29vZ2xlX3RlbGVwaG9ueS54bWw6c3lzdGVtL2V0Yy9tZWRpYV9jb2RlY3NfZ29vZ2xlX3RlbGVwaG9ueS54bWwgXAotICAgIGZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZGF0YS9tZWRpYV9jb2RlY3NfZ29vZ2xlX3ZpZGVvLnhtbDpzeXN0ZW0vZXRjL21lZGlhX2NvZGVjc19nb29nbGVfdmlkZW8ueG1sIFwKLSAgICBkZXZpY2UvZ2VuZXJpYy9nb2xkZmlzaC9jYW1lcmEvbWVkaWFfY29kZWNzLnhtbDpzeXN0ZW0vZXRjL21lZGlhX2NvZGVjcy54bWwKKyMgTkZDOgorIyAgIFByb3ZpZGUgZGVmYXVsdCBsaWJuZmMtbmNpLmNvbmYgZmlsZSBmb3IgZGV2aWNlcyB0aGF0IGRvZXMgbm90IGhhdmUgb25lIGluCisjICAgdmVuZG9yL2V0YyBiZWNhdXNlIGFvc3Agc3lzdGVtIGltYWdlIChvZiBhb3NwXyRhcmNoIHByb2R1Y3RzKSBpcyBnb2luZyB0bworIyAgIGJlIHVzZWQgYXMgR1NJLgorIyAgIE1heSBuZWVkIHRvIHJlbW92ZSB0aGUgZm9sbG93aW5nIGZvciBuZXdseSBsYXVuY2hlZCBkZXZpY2VzIGluIFAgc2luY2UgdGhpcworIyAgIE5GQyBjb25maWd1cmF0aW9uIGZpbGUgc2hvdWxkIGJlIGluIHZlbmRvci9ldGMsIGluc3RlYWQgb2Ygc3lzdGVtL2V0YworUFJPRFVDVF9DT1BZX0ZJTEVTICs9IFwKKyAgICBkZXZpY2UvZ2VuZXJpYy9jb21tb24vbmZjL2xpYm5mYy1uY2kuY29uZjpzeXN0ZW0vZXRjL2xpYm5mYy1uY2kuY29uZgogCiAjIEFkanVzdCB0aGUgRGFsdmlrIGhlYXAgdG8gYmUgYXBwcm9wcmlhdGUgZm9yIGEgdGFibGV0LgogJChjYWxsIGluaGVyaXQtcHJvZHVjdC1pZi1leGlzdHMsIGZyYW1ld29ya3MvYmFzZS9idWlsZC90YWJsZXQtZGFsdmlrLWhlYXAubWspCmRpZmYgLS1naXQgYS90YXJnZXQvYm9hcmQvZ2VuZXJpY19hcm02NF9hL0JvYXJkQ29uZmlnLm1rIGIvdGFyZ2V0L2JvYXJkL2dlbmVyaWNfYXJtNjRfYS9Cb2FyZENvbmZpZy5tawppbmRleCA4ZjQwNDNmLi4zNGE4YWMwIDEwMDY0NAotLS0gYS90YXJnZXQvYm9hcmQvZ2VuZXJpY19hcm02NF9hL0JvYXJkQ29uZmlnLm1rCisrKyBiL3RhcmdldC9ib2FyZC9nZW5lcmljX2FybTY0X2EvQm9hcmRDb25maWcubWsKQEAgLTIzLDcgKzIzLDcgQEAKIFRBUkdFVF9DUFVfVkFSSUFOVCA6PSBnZW5lcmljCiAKIFRBUkdFVF8yTkRfQVJDSCA6PSBhcm0KLVRBUkdFVF8yTkRfQVJDSF9WQVJJQU5UIDo9IGFybXY3LWEtbmVvbgorVEFSR0VUXzJORF9BUkNIX1ZBUklBTlQgOj0gYXJtdjgtYQogVEFSR0VUXzJORF9DUFVfQUJJIDo9IGFybWVhYmktdjdhCiBUQVJHRVRfMk5EX0NQVV9BQkkyIDo9IGFybWVhYmkKLVRBUkdFVF8yTkRfQ1BVX1ZBUklBTlQgOj0gY29ydGV4LWExNQorVEFSR0VUXzJORF9DUFVfVkFSSUFOVCA6PSBnZW5lcmljCmRpZmYgLS1naXQgYS90YXJnZXQvYm9hcmQvZ2VuZXJpY19hcm02NF9hYi9Cb2FyZENvbmZpZy5tayBiL3RhcmdldC9ib2FyZC9nZW5lcmljX2FybTY0X2FiL0JvYXJkQ29uZmlnLm1rCmluZGV4IDY3NDQyODkuLmZjNmI1ODIgMTAwNjQ0Ci0tLSBhL3RhcmdldC9ib2FyZC9nZW5lcmljX2FybTY0X2FiL0JvYXJkQ29uZmlnLm1rCisrKyBiL3RhcmdldC9ib2FyZC9nZW5lcmljX2FybTY0X2FiL0JvYXJkQ29uZmlnLm1rCkBAIC0yMywxMCArMjMsMTAgQEAKIFRBUkdFVF9DUFVfVkFSSUFOVCA6PSBnZW5lcmljCiAKIFRBUkdFVF8yTkRfQVJDSCA6PSBhcm0KLVRBUkdFVF8yTkRfQVJDSF9WQVJJQU5UIDo9IGFybXY3LWEtbmVvbgorVEFSR0VUXzJORF9BUkNIX1ZBUklBTlQgOj0gYXJtdjgtYQogVEFSR0VUXzJORF9DUFVfQUJJIDo9IGFybWVhYmktdjdhCiBUQVJHRVRfMk5EX0NQVV9BQkkyIDo9IGFybWVhYmkKLVRBUkdFVF8yTkRfQ1BVX1ZBUklBTlQgOj0gY29ydGV4LWExNQorVEFSR0VUXzJORF9DUFVfVkFSSUFOVCA6PSBnZW5lcmljCiAKICMgRW5hYmxlIEEvQiB1cGRhdGUKIFRBUkdFVF9OT19SRUNPVkVSWSA6PSB0cnVlCkBAIC0zNiw2ICszNiwxMSBAQAogQk9BUkRfUk9PVF9FWFRSQV9GT0xERVJTICs9IGZpcm13YXJlIGZpcm13YXJlL3JhZGlvIHBlcnNpc3QKIEJPQVJEX1JPT1RfRVhUUkFfU1lNTElOS1MgOj0gL3ZlbmRvci9saWIvZHNwOi9kc3AKIAorIyBTZXQgdGhpcyB0byBjcmVhdGUgL2NhY2hlIG1vdW50IHBvaW50IGZvciBub24tQS9CIGRldmljZXMgdGhhdCBtb3VudHMgL2NhY2hlLgorIyBUaGUgcGFydGl0aW9uIHNpemUgZG9lc24ndCBtYXR0ZXIsIGp1c3QgdG8gbWFrZSBidWlsZCBwYXNzLgorQk9BUkRfQ0FDSEVJTUFHRV9GSUxFX1NZU1RFTV9UWVBFIDo9IGV4dDQKK0JPQVJEX0NBQ0hFSU1BR0VfUEFSVElUSU9OX1NJWkUgOj0gMTY3NzcyMTYKKwogIyBUT0RPKGIvMzY3NjQyMTUpOiByZW1vdmUgdGhpcyBzZXR0aW5nIHdoZW4gdGhlIGdlbmVyaWMgc3lzdGVtIGltYWdlCiAjIG5vIGxvbmdlciBoYXMgUUNPTS1zcGVjaWZpYyBkaXJlY3RvcmllcyB1bmRlciAvLgogQk9BUkRfU0VQT0xJQ1lfRElSUyArPSBidWlsZC90YXJnZXQvYm9hcmQvZ2VuZXJpY19hcm02NF9hYi9zZXBvbGljeQpkaWZmIC0tZ2l0IGEvdGFyZ2V0L2JvYXJkL2dlbmVyaWNfYXJtNjRfYWIvc2Vwb2xpY3kvT1dORVJTIGIvdGFyZ2V0L2JvYXJkL2dlbmVyaWNfYXJtNjRfYWIvc2Vwb2xpY3kvT1dORVJTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4Mjg5ODgKLS0tIC9kZXYvbnVsbAorKysgYi90YXJnZXQvYm9hcmQvZ2VuZXJpY19hcm02NF9hYi9zZXBvbGljeS9PV05FUlMKQEAgLTAsMCArMSw0IEBACitqZWZmdkBnb29nbGUuY29tCitkY2FzaG1hbkBnb29nbGUuY29tCitqYmlyZXNAZ29vZ2xlLmNvbQorc3NwYXRpbEBnb29nbGUuY29tCmRpZmYgLS1naXQgYS90YXJnZXQvYm9hcmQvZ2VuZXJpY19hcm1fYS9Cb2FyZENvbmZpZy5tayBiL3RhcmdldC9ib2FyZC9nZW5lcmljX2FybV9hL0JvYXJkQ29uZmlnLm1rCmluZGV4IGQ5MzA3NDkuLmYwZTFhMzkgMTAwNjQ0Ci0tLSBhL3RhcmdldC9ib2FyZC9nZW5lcmljX2FybV9hL0JvYXJkQ29uZmlnLm1rCisrKyBiL3RhcmdldC9ib2FyZC9nZW5lcmljX2FybV9hL0JvYXJkQ29uZmlnLm1rCkBAIC0xNyw3ICsxNyw3IEBACiBpbmNsdWRlIGJ1aWxkL21ha2UvdGFyZ2V0L2JvYXJkL3RyZWJsZV9jb21tb25fMzIubWsKIAogIyBPdmVyd3JpdGUgdGhlIHNldHRpbmcgaW4gdHJlYmxlX2NvbW1vbl8zMi5tayBmb3Igbm9uLUEvQiBhcm0gR1NJCi1CT0FSRF9TWVNURU1JTUFHRV9QQVJUSVRJT05fU0laRSA6PSA4MDUzMDYzNjggIyA3NjhNQgorQk9BUkRfU1lTVEVNSU1BR0VfUEFSVElUSU9OX1NJWkUgOj0gOTQzNzE4NDAwICMgOTAwTUIKIAogVEFSR0VUX0FSQ0ggOj0gYXJtCiBUQVJHRVRfQVJDSF9WQVJJQU5UIDo9IGFybXY3LWEtbmVvbgpkaWZmIC0tZ2l0IGEvdGFyZ2V0L2JvYXJkL2dlbmVyaWNfYXJtX2FiL0JvYXJkQ29uZmlnLm1rIGIvdGFyZ2V0L2JvYXJkL2dlbmVyaWNfYXJtX2FiL0JvYXJkQ29uZmlnLm1rCmluZGV4IDAxMWJjZGYuLjdjMDRjZDUgMTAwNjQ0Ci0tLSBhL3RhcmdldC9ib2FyZC9nZW5lcmljX2FybV9hYi9Cb2FyZENvbmZpZy5taworKysgYi90YXJnZXQvYm9hcmQvZ2VuZXJpY19hcm1fYWIvQm9hcmRDb25maWcubWsKQEAgLTE3LDcgKzE3LDcgQEAKIGluY2x1ZGUgYnVpbGQvbWFrZS90YXJnZXQvYm9hcmQvdHJlYmxlX2NvbW1vbl8zMi5tawogCiAjIE92ZXJ3cml0ZSB0aGUgc2V0dGluZyBpbiB0cmVibGVfY29tbW9uXzMyLm1rIGZvciBub24tQS9CIGFybSBHU0kKLUJPQVJEX1NZU1RFTUlNQUdFX1BBUlRJVElPTl9TSVpFIDo9IDgwNTMwNjM2OCAjIDc2OE1CCitCT0FSRF9TWVNURU1JTUFHRV9QQVJUSVRJT05fU0laRSA6PSA5NDM3MTg0MDAgIyA5MDBNQgogCiBUQVJHRVRfQVJDSCA6PSBhcm0KIFRBUkdFVF9BUkNIX1ZBUklBTlQgOj0gYXJtdjctYS1uZW9uCkBAIC0yOCwzICsyOCwxNiBAQAogIyBFbmFibGUgQS9CIHVwZGF0ZQogVEFSR0VUX05PX1JFQ09WRVJZIDo9IHRydWUKIEJPQVJEX0JVSUxEX1NZU1RFTV9ST09UX0lNQUdFIDo9IHRydWUKKworIyBUT0RPKGppeW9uZykgVGhlc2UgbWlnaHQgYmUgU29DIHNwZWNpZmljLgorQk9BUkRfUk9PVF9FWFRSQV9GT0xERVJTICs9IGZpcm13YXJlIGZpcm13YXJlL3JhZGlvIHBlcnNpc3QKK0JPQVJEX1JPT1RfRVhUUkFfU1lNTElOS1MgOj0gL3ZlbmRvci9saWIvZHNwOi9kc3AKKworIyBTZXQgdGhpcyB0byBjcmVhdGUgL2NhY2hlIG1vdW50IHBvaW50IGZvciBub24tQS9CIGRldmljZXMgdGhhdCBtb3VudHMgL2NhY2hlLgorIyBUaGUgcGFydGl0aW9uIHNpemUgZG9lc24ndCBtYXR0ZXIsIGp1c3QgdG8gbWFrZSBidWlsZCBwYXNzLgorQk9BUkRfQ0FDSEVJTUFHRV9GSUxFX1NZU1RFTV9UWVBFIDo9IGV4dDQKK0JPQVJEX0NBQ0hFSU1BR0VfUEFSVElUSU9OX1NJWkUgOj0gMTY3NzcyMTYKKworIyBUT0RPKGIvMzY3NjQyMTUpOiByZW1vdmUgdGhpcyBzZXR0aW5nIHdoZW4gdGhlIGdlbmVyaWMgc3lzdGVtIGltYWdlCisjIG5vIGxvbmdlciBoYXMgUUNPTS1zcGVjaWZpYyBkaXJlY3RvcmllcyB1bmRlciAvLgorQk9BUkRfU0VQT0xJQ1lfRElSUyArPSBidWlsZC90YXJnZXQvYm9hcmQvZ2VuZXJpY19hcm02NF9hYi9zZXBvbGljeQpkaWZmIC0tZ2l0IGEvdGFyZ2V0L2JvYXJkL2dlbmVyaWNfYXJtdjUvQW5kcm9pZEJvYXJkLm1rIGIvdGFyZ2V0L2JvYXJkL2dlbmVyaWNfYXJtdjUvQW5kcm9pZEJvYXJkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZGFmZjI3Li4wMDAwMDAwCi0tLSBhL3RhcmdldC9ib2FyZC9nZW5lcmljX2FybXY1L0FuZHJvaWRCb2FyZC5taworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSMKLSMgQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLS1pbmNsdWRlIGJ1aWxkL3RhcmdldC9ib2FyZC9nZW5lcmljL0FuZHJvaWRCb2FyZC5tawpkaWZmIC0tZ2l0IGEvdGFyZ2V0L2JvYXJkL2dlbmVyaWNfYXJtdjUvUkVBRE1FLnR4dCBiL3RhcmdldC9ib2FyZC9nZW5lcmljX2FybXY1L1JFQURNRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1ZDU5MGEuLjAwMDAwMDAKLS0tIGEvdGFyZ2V0L2JvYXJkL2dlbmVyaWNfYXJtdjUvUkVBRE1FLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotVGhlICJnZW5lcmljX2FybXY1IiBwcm9kdWN0IGRlZmluZXMgYSBub24taGFyZHdhcmUtc3BlY2lmaWMgdGFyZ2V0Ci13aXRob3V0IGEga2VybmVsIG9yIGJvb3Rsb2FkZXIuCi0KLUl0IGlzIG5vdCBhIHByb2R1Y3QgImJhc2UgY2xhc3MiOyBubyBvdGhlciBwcm9kdWN0cyBpbmhlcml0Ci1mcm9tIGl0IG9yIHVzZSBpdCBpbiBhbnkgd2F5LgpkaWZmIC0tZ2l0IGEvdGFyZ2V0L2JvYXJkL2dlbmVyaWNfYXJtdjUvc3lzdGVtLnByb3AgYi90YXJnZXQvYm9hcmQvZ2VuZXJpY19hcm12NS9zeXN0ZW0ucHJvcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTM3YTBmOS4uMDAwMDAwMAotLS0gYS90YXJnZXQvYm9hcmQvZ2VuZXJpY19hcm12NS9zeXN0ZW0ucHJvcAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotIwotIyBzeXN0ZW0ucHJvcCBmb3IgZ2VuZXJpYyBzZGsKLSMKLQotcmlsZC5saWJwYXRoPS9zeXN0ZW0vbGliL2xpYnJlZmVyZW5jZS1yaWwuc28KLXJpbGQubGliYXJncz0tZCAvZGV2L3R0eVMwCmRpZmYgLS1naXQgYS90YXJnZXQvYm9hcmQvZ2VuZXJpY19taXBzL0JvYXJkQ29uZmlnLm1rIGIvdGFyZ2V0L2JvYXJkL2dlbmVyaWNfbWlwcy9Cb2FyZENvbmZpZy5tawppbmRleCBmYjY2ZDIxLi41MjM0MDhiIDEwMDY0NAotLS0gYS90YXJnZXQvYm9hcmQvZ2VuZXJpY19taXBzL0JvYXJkQ29uZmlnLm1rCisrKyBiL3RhcmdldC9ib2FyZC9nZW5lcmljX21pcHMvQm9hcmRDb25maWcubWsKQEAgLTY1LDEwICs2NSwxMiBAQAogIyB3aGVuIGZpbmFsaXppbmcgdGhlbS4KIEJPQVJEX1ZFTkRPUklNQUdFX1BBUlRJVElPTl9TSVpFIDo9IDEwMDAwMDAwMAogQk9BUkRfVkVORE9SSU1BR0VfRklMRV9TWVNURU1fVFlQRSA6PSBleHQ0Ci1CT0FSRF9DQUNIRUlNQUdFX1BBUlRJVElPTl9TSVpFIDo9IDY5MjA2MDE2Ci1CT0FSRF9DQUNIRUlNQUdFX0ZJTEVfU1lTVEVNX1RZUEUgOj0gZXh0NAogQk9BUkRfRkxBU0hfQkxPQ0tfU0laRSA6PSA1MTIKIFRBUkdFVF9VU0VSSU1BR0VTX1NQQVJTRV9FWFRfRElTQUJMRUQgOj0gdHJ1ZQogREVWSUNFX01BVFJJWF9GSUxFICAgOj0gZGV2aWNlL2dlbmVyaWMvZ29sZGZpc2gvY29tcGF0aWJpbGl0eV9tYXRyaXgueG1sCiAKIEJPQVJEX1NFUE9MSUNZX0RJUlMgKz0gYnVpbGQvdGFyZ2V0L2JvYXJkL2dlbmVyaWMvc2Vwb2xpY3kKKworIyBFbmFibGUgQS9CIHVwZGF0ZQorVEFSR0VUX05PX1JFQ09WRVJZIDo9IHRydWUKK0JPQVJEX0JVSUxEX1NZU1RFTV9ST09UX0lNQUdFIDo9IHRydWUKZGlmZiAtLWdpdCBhL3RhcmdldC9ib2FyZC9nZW5lcmljX21pcHM2NC9Cb2FyZENvbmZpZy5tayBiL3RhcmdldC9ib2FyZC9nZW5lcmljX21pcHM2NC9Cb2FyZENvbmZpZy5tawppbmRleCA2N2JiNTFmLi4yMDUyZDdiIDEwMDY0NAotLS0gYS90YXJnZXQvYm9hcmQvZ2VuZXJpY19taXBzNjQvQm9hcmRDb25maWcubWsKKysrIGIvdGFyZ2V0L2JvYXJkL2dlbmVyaWNfbWlwczY0L0JvYXJkQ29uZmlnLm1rCkBAIC04MCw4ICs4MCw2IEBACiAjIHdoZW4gZmluYWxpemluZyB0aGVtLgogQk9BUkRfVkVORE9SSU1BR0VfUEFSVElUSU9OX1NJWkUgOj0gMTAwMDAwMDAwCiBCT0FSRF9WRU5ET1JJTUFHRV9GSUxFX1NZU1RFTV9UWVBFIDo9IGV4dDQKLUJPQVJEX0NBQ0hFSU1BR0VfUEFSVElUSU9OX1NJWkUgOj0gNjkyMDYwMTYKLUJPQVJEX0NBQ0hFSU1BR0VfRklMRV9TWVNURU1fVFlQRSA6PSBleHQ0CiBCT0FSRF9GTEFTSF9CTE9DS19TSVpFIDo9IDUxMgogVEFSR0VUX1VTRVJJTUFHRVNfU1BBUlNFX0VYVF9ESVNBQkxFRCA6PSB0cnVlCiBERVZJQ0VfTUFUUklYX0ZJTEUgICA6PSBkZXZpY2UvZ2VuZXJpYy9nb2xkZmlzaC9jb21wYXRpYmlsaXR5X21hdHJpeC54bWwKQEAgLTg5LDMgKzg3LDcgQEAKIEJPQVJEX1NFUE9MSUNZX0RJUlMgKz0gYnVpbGQvdGFyZ2V0L2JvYXJkL2dlbmVyaWMvc2Vwb2xpY3kKIAogREVYX1BSRU9QVF9ERUZBVUxUIDo9IG5vc3RyaXBwaW5nCisKKyMgRW5hYmxlIEEvQiB1cGRhdGUKK1RBUkdFVF9OT19SRUNPVkVSWSA6PSB0cnVlCitCT0FSRF9CVUlMRF9TWVNURU1fUk9PVF9JTUFHRSA6PSB0cnVlCmRpZmYgLS1naXQgYS90YXJnZXQvYm9hcmQvZ2VuZXJpY194ODYvQm9hcmRDb25maWcubWsgYi90YXJnZXQvYm9hcmQvZ2VuZXJpY194ODYvQm9hcmRDb25maWcubWsKaW5kZXggMDAwYTlhMy4uNjg0ZGZjNyAxMDA2NDQKLS0tIGEvdGFyZ2V0L2JvYXJkL2dlbmVyaWNfeDg2L0JvYXJkQ29uZmlnLm1rCisrKyBiL3RhcmdldC9ib2FyZC9nZW5lcmljX3g4Ni9Cb2FyZENvbmZpZy5tawpAQCAtMTAsNiArMTAsMTEgQEAKIFRBUkdFVF9BUkNIIDo9IHg4NgogVEFSR0VUX0FSQ0hfVkFSSUFOVCA6PSB4ODYKIFRBUkdFVF9QUkVMSU5LX01PRFVMRSA6PSBmYWxzZQorVEFSR0VUX0JPT1RMT0FERVJfQk9BUkRfTkFNRSA6PSBnb2xkZmlzaF8kKFRBUkdFVF9BUkNIKQorCisjZW11bGF0b3Igbm93IHVzZXMgNjRiaXQga2VybmVsIHRvIHJ1biAzMmJpdCB4ODYgaW1hZ2UKKyMKK1RBUkdFVF9VU0VTXzY0X0JJVF9CSU5ERVIgOj0gdHJ1ZQogCiAjIFRoZSBJQSBlbXVsYXRvciAocWVtdSkgdXNlcyB0aGUgR29sZGZpc2ggZGV2aWNlcwogSEFWRV9IVENfQVVESU9fRFJJVkVSIDo9IHRydWUKQEAgLTQxLDE5ICs0Niw1OCBAQAogCiBUQVJHRVRfVVNFUklNQUdFU19VU0VfRVhUNCA6PSB0cnVlCiBCT0FSRF9TWVNURU1JTUFHRV9QQVJUSVRJT05fU0laRSA6PSAyNjg0MzU0NTYwCi1CT0FSRF9VU0VSREFUQUlNQUdFX1BBUlRJVElPTl9TSVpFIDo9IDU3NjcxNjgwMAorIyBSZXNpemUgdG8gNEcgdG8gYWNjb21vZGF0ZSBBU0FOIGFuZCBDVFMKK0JPQVJEX1VTRVJEQVRBSU1BR0VfUEFSVElUSU9OX1NJWkUgOj0gNDI5NDk2NzI5NgogVEFSR0VUX0NPUFlfT1VUX1ZFTkRPUiA6PSB2ZW5kb3IKIEJPQVJEX1BST1BFUlRZX09WRVJSSURFU19TUExJVF9FTkFCTEVEIDo9IHRydWUKICMgfjEwMCBNQiB2ZW5kb3IgaW1hZ2UuIFBsZWFzZSBhZGp1c3Qgc3lzdGVtIGltYWdlIC8gdmVuZG9yIGltYWdlIHNpemVzCiAjIHdoZW4gZmluYWxpemluZyB0aGVtLgogQk9BUkRfVkVORE9SSU1BR0VfUEFSVElUSU9OX1NJWkUgOj0gMTAwMDAwMDAwCiBCT0FSRF9WRU5ET1JJTUFHRV9GSUxFX1NZU1RFTV9UWVBFIDo9IGV4dDQKLUJPQVJEX0NBQ0hFSU1BR0VfUEFSVElUSU9OX1NJWkUgOj0gNjkyMDYwMTYKLUJPQVJEX0NBQ0hFSU1BR0VfRklMRV9TWVNURU1fVFlQRSA6PSBleHQ0CiBCT0FSRF9GTEFTSF9CTE9DS19TSVpFIDo9IDUxMgogVEFSR0VUX1VTRVJJTUFHRVNfU1BBUlNFX0VYVF9ESVNBQkxFRCA6PSB0cnVlCiBERVZJQ0VfTUFUUklYX0ZJTEUgICA6PSBkZXZpY2UvZ2VuZXJpYy9nb2xkZmlzaC9jb21wYXRpYmlsaXR5X21hdHJpeC54bWwKIAorIyBBbmRyb2lkIGdlbmVyaWMgc3lzdGVtIGltYWdlIGFsd2F5cyBjcmVhdGUgbWV0YWRhdGEgcGFydGl0aW9uCitCT0FSRF9VU0VTX01FVEFEQVRBX1BBUlRJVElPTiA6PSB0cnVlCisKKyMgU2V0IHRoaXMgdG8gY3JlYXRlIC9jYWNoZSBtb3VudCBwb2ludCBmb3Igbm9uLUEvQiBkZXZpY2VzIHRoYXQgbW91bnRzIC9jYWNoZS4KKyMgVGhlIHBhcnRpdGlvbiBzaXplIGRvZXNuJ3QgbWF0dGVyLCBqdXN0IHRvIG1ha2UgYnVpbGQgcGFzcy4KK0JPQVJEX0NBQ0hFSU1BR0VfRklMRV9TWVNURU1fVFlQRSA6PSBleHQ0CitCT0FSRF9DQUNIRUlNQUdFX1BBUlRJVElPTl9TSVpFIDo9IDE2Nzc3MjE2CisKIEJPQVJEX1NFUE9MSUNZX0RJUlMgKz0gXAotICAgICAgICBidWlsZC90YXJnZXQvYm9hcmQvZ2VuZXJpYy9zZXBvbGljeSBcCi0gICAgICAgIGJ1aWxkL3RhcmdldC9ib2FyZC9nZW5lcmljX3g4Ni9zZXBvbGljeQorICAgICAgICBkZXZpY2UvZ2VuZXJpYy9nb2xkZmlzaC9zZXBvbGljeS9jb21tb24gXAorICAgICAgICBkZXZpY2UvZ2VuZXJpYy9nb2xkZmlzaC9zZXBvbGljeS94ODYKKworIyBBbmRyb2lkIFZlcmlmaWVkIEJvb3QgKEFWQik6CisjICAgQnVpbGRzIGEgc3BlY2lhbCB2Ym1ldGEuaW1nIHRoYXQgZGlzYWJsZXMgQVZCIHZlcmlmaWNhdGlvbi4KKyMgICBPdGhlcndpc2UsIEFWQiB3aWxsIHByZXZlbnQgdGhlIGRldmljZSBmcm9tIGJvb3RpbmcgdGhlIGdlbmVyaWMgc3lzdGVtLmltZy4KKyMgICBBbHNvIGNoZWNrcyB0aGF0IEJPQVJEX0FWQl9FTkFCTEUgaXMgbm90IHNldCwgdG8gcHJldmVudCBhZGRpbmcgdmVyaXR5CisjICAgbWV0YWRhdGEgaW50byBzeXN0ZW0uaW1nLgoraWZlcSAoJChCT0FSRF9BVkJfRU5BQkxFKSx0cnVlKQorJChlcnJvciBCT0FSRF9BVkJfRU5BQkxFIGNhbm5vdCBiZSBzZXQgZm9yIEdTSSkKK2VuZGlmCitCT0FSRF9CVUlMRF9ESVNBQkxFRF9WQk1FVEFJTUFHRSA6PSB0cnVlCisKK2lmbmVxICgsJChmaWx0ZXIgdXNlcmRlYnVnIGVuZywkKFRBUkdFVF9CVUlMRF9WQVJJQU5UKSkpCisjIEdTSSBpcyBhbHdheXMgdXNlcmRlYnVnIGFuZCBuZWVkcyBhIGNvdXBsZSBvZiBwcm9wZXJ0aWVzIHRha2luZyBwcmVjZWRlbmNlCisjIG92ZXIgdGhvc2Ugc2V0IGJ5IHRoZSB2ZW5kb3IuCitUQVJHRVRfU1lTVEVNX1BST1AgOj0gYnVpbGQvbWFrZS90YXJnZXQvYm9hcmQvZ3NpX3N5c3RlbS5wcm9wCitlbmRpZgorQk9BUkRfVk5ES19WRVJTSU9OIDo9IGN1cnJlbnQKKworIyBFbmFibGUgQS9CIHVwZGF0ZQorVEFSR0VUX05PX1JFQ09WRVJZIDo9IHRydWUKK0JPQVJEX0JVSUxEX1NZU1RFTV9ST09UX0lNQUdFIDo9IHRydWUKKworIyBXaWZpLgorQk9BUkRfV0xBTl9ERVZJQ0UgICAgICAgICAgIDo9IGVtdWxhdG9yCitCT0FSRF9IT1NUQVBEX0RSSVZFUiAgICAgICAgOj0gTkw4MDIxMQorQk9BUkRfV1BBX1NVUFBMSUNBTlRfRFJJVkVSIDo9IE5MODAyMTEKK0JPQVJEX0hPU1RBUERfUFJJVkFURV9MSUIgICA6PSBsaWJfZHJpdmVyX2NtZF9zaW11bGF0ZWQKK0JPQVJEX1dQQV9TVVBQTElDQU5UX1BSSVZBVEVfTElCIDo9IGxpYl9kcml2ZXJfY21kX3NpbXVsYXRlZAorV1BBX1NVUFBMSUNBTlRfVkVSU0lPTiAgICAgIDo9IFZFUl8wXzhfWAorV0lGSV9EUklWRVJfRldfUEFUSF9QQVJBTSAgIDo9ICIvZGV2L251bGwiCitXSUZJX0RSSVZFUl9GV19QQVRIX1NUQSAgICAgOj0gIi9kZXYvbnVsbCIKK1dJRklfRFJJVkVSX0ZXX1BBVEhfQVAgICAgICA6PSAiL2Rldi9udWxsIgpkaWZmIC0tZ2l0IGEvdGFyZ2V0L2JvYXJkL2dlbmVyaWNfeDg2L2RldmljZS5tayBiL3RhcmdldC9ib2FyZC9nZW5lcmljX3g4Ni9kZXZpY2UubWsKaW5kZXggMjRjMzlhNS4uMjczYWM3MSAxMDA2NDQKLS0tIGEvdGFyZ2V0L2JvYXJkL2dlbmVyaWNfeDg2L2RldmljZS5taworKysgYi90YXJnZXQvYm9hcmQvZ2VuZXJpY194ODYvZGV2aWNlLm1rCkBAIC0xNCwyMSArMTQsMTkgQEAKICMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLSMgVGhpcyBpcyBhIGJ1aWxkIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBwcm9kdWN0IGFzcGVjdHMgdGhhdAotIyBhcmUgc3BlY2lmaWMgdG8gdGhlIGVtdWxhdG9yLgorIyBtaW5pbWFsIGNvbmZpZ3VyYXRpb24gZm9yIGF1ZGlvIHBvbGljeS4KK1BST0RVQ1RfQ09QWV9GSUxFUyArPSBcCisgICAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb25fZ2VuZXJpYy54bWw6c3lzdGVtL2V0Yy9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwgXAorICAgIGZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL3ByaW1hcnlfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sOnN5c3RlbS9ldGMvcHJpbWFyeV9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwgXAorICAgIGZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL3Jfc3VibWl4X2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbDpzeXN0ZW0vZXRjL3Jfc3VibWl4X2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbCBcCisgICAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvYXVkaW9fcG9saWN5X3ZvbHVtZXMueG1sOnN5c3RlbS9ldGMvYXVkaW9fcG9saWN5X3ZvbHVtZXMueG1sIFwKKyAgICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9kZWZhdWx0X3ZvbHVtZV90YWJsZXMueG1sOnN5c3RlbS9ldGMvZGVmYXVsdF92b2x1bWVfdGFibGVzLnhtbCBcCiAKLVBST0RVQ1RfUFJPUEVSVFlfT1ZFUlJJREVTIDo9IFwKLSAgICByby5yaWwuaHN4cGE9MSBcCi0gICAgcm8ucmlsLmdwcnNjbGFzcz0xMAotCi1QUk9EVUNUX0NPUFlfRklMRVMgOj0gXAotICAgIGRldmljZS9nZW5lcmljL2dvbGRmaXNoL2RhdGEvZXRjL2FwbnMtY29uZi54bWw6c3lzdGVtL2V0Yy9hcG5zLWNvbmYueG1sIFwKLSAgICBkZXZpY2UvZ2VuZXJpYy9nb2xkZmlzaC9jYW1lcmEvbWVkaWFfcHJvZmlsZXMueG1sOnN5c3RlbS9ldGMvbWVkaWFfcHJvZmlsZXMueG1sIFwKLSAgICBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2RhdGEvbWVkaWFfY29kZWNzX2dvb2dsZV9hdWRpby54bWw6c3lzdGVtL2V0Yy9tZWRpYV9jb2RlY3NfZ29vZ2xlX2F1ZGlvLnhtbCBcCi0gICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9kYXRhL21lZGlhX2NvZGVjc19nb29nbGVfdGVsZXBob255LnhtbDpzeXN0ZW0vZXRjL21lZGlhX2NvZGVjc19nb29nbGVfdGVsZXBob255LnhtbCBcCi0gICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9kYXRhL21lZGlhX2NvZGVjc19nb29nbGVfdmlkZW8ueG1sOnN5c3RlbS9ldGMvbWVkaWFfY29kZWNzX2dvb2dsZV92aWRlby54bWwgXAotICAgIGRldmljZS9nZW5lcmljL2dvbGRmaXNoL2NhbWVyYS9tZWRpYV9jb2RlY3MueG1sOnN5c3RlbS9ldGMvbWVkaWFfY29kZWNzLnhtbAotCi1QUk9EVUNUX1BBQ0tBR0VTIDo9IFwKLSAgICBhdWRpby5wcmltYXJ5LmdvbGRmaXNoIFwKLSAgICB2aWJyYXRvci5nb2xkZmlzaAorIyBORkM6CisjICAgUHJvdmlkZSBkZWZhdWx0IGxpYm5mYy1uY2kuY29uZiBmaWxlIGZvciBkZXZpY2VzIHRoYXQgZG9lcyBub3QgaGF2ZSBvbmUgaW4KKyMgICB2ZW5kb3IvZXRjIGJlY2F1c2UgYW9zcCBzeXN0ZW0gaW1hZ2UgKG9mIGFvc3BfJGFyY2ggcHJvZHVjdHMpIGlzIGdvaW5nIHRvCisjICAgYmUgdXNlZCBhcyBHU0kuCisjICAgTWF5IG5lZWQgdG8gcmVtb3ZlIHRoZSBmb2xsb3dpbmcgZm9yIG5ld2x5IGxhdW5jaGVkIGRldmljZXMgaW4gUCBzaW5jZSB0aGlzCisjICAgTkZDIGNvbmZpZ3VyYXRpb24gZmlsZSBzaG91bGQgYmUgaW4gdmVuZG9yL2V0YywgaW5zdGVhZCBvZiBzeXN0ZW0vZXRjCitQUk9EVUNUX0NPUFlfRklMRVMgKz0gXAorICAgIGRldmljZS9nZW5lcmljL2NvbW1vbi9uZmMvbGlibmZjLW5jaS5jb25mOnN5c3RlbS9ldGMvbGlibmZjLW5jaS5jb25mCmRpZmYgLS1naXQgYS90YXJnZXQvYm9hcmQvZ2VuZXJpY194ODYvc2Vwb2xpY3kvZG9tYWluLnRlIGIvdGFyZ2V0L2JvYXJkL2dlbmVyaWNfeDg2L3NlcG9saWN5L2RvbWFpbi50ZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGJjOGQ4Ny4uMDAwMDAwMAotLS0gYS90YXJnZXQvYm9hcmQvZ2VuZXJpY194ODYvc2Vwb2xpY3kvZG9tYWluLnRlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYWxsb3cgZG9tYWluIGNwdWN0bF9kZXZpY2U6ZGlyIHNlYXJjaDsKZGlmZiAtLWdpdCBhL3RhcmdldC9ib2FyZC9nZW5lcmljX3g4Ni9zZXBvbGljeS9oZWFsdGhkLnRlIGIvdGFyZ2V0L2JvYXJkL2dlbmVyaWNfeDg2L3NlcG9saWN5L2hlYWx0aGQudGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1ZmE4MDcuLjAwMDAwMDAKLS0tIGEvdGFyZ2V0L2JvYXJkL2dlbmVyaWNfeDg2L3NlcG9saWN5L2hlYWx0aGQudGUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1hbGxvdyBoZWFsdGhkIHNlbGY6Y2FwYWJpbGl0eSBzeXNfbmljZTsKZGlmZiAtLWdpdCBhL3RhcmdldC9ib2FyZC9nZW5lcmljX3g4Ni9zZXBvbGljeS9pbml0LnRlIGIvdGFyZ2V0L2JvYXJkL2dlbmVyaWNfeDg2L3NlcG9saWN5L2luaXQudGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhYTgxZDEuLjAwMDAwMDAKLS0tIGEvdGFyZ2V0L2JvYXJkL2dlbmVyaWNfeDg2L3NlcG9saWN5L2luaXQudGUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1hbGxvdyBpbml0IHRtcGZzOmxua19maWxlIGNyZWF0ZV9maWxlX3Blcm1zOwpkaWZmIC0tZ2l0IGEvdGFyZ2V0L2JvYXJkL2dlbmVyaWNfeDg2L3NlcG9saWN5L2luc3RhbGxkLnRlIGIvdGFyZ2V0L2JvYXJkL2dlbmVyaWNfeDg2L3NlcG9saWN5L2luc3RhbGxkLnRlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTU1OGIxLi4wMDAwMDAwCi0tLSBhL3RhcmdldC9ib2FyZC9nZW5lcmljX3g4Ni9zZXBvbGljeS9pbnN0YWxsZC50ZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWFsbG93IGluc3RhbGxkIHNlbGY6cHJvY2VzcyBleGVjbWVtOwpkaWZmIC0tZ2l0IGEvdGFyZ2V0L2JvYXJkL2dlbmVyaWNfeDg2L3NlcG9saWN5L3p5Z290ZS50ZSBiL3RhcmdldC9ib2FyZC9nZW5lcmljX3g4Ni9zZXBvbGljeS96eWdvdGUudGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzOTkzYTQuLjAwMDAwMDAKLS0tIGEvdGFyZ2V0L2JvYXJkL2dlbmVyaWNfeDg2L3NlcG9saWN5L3p5Z290ZS50ZQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotYWxsb3cgenlnb3RlIHNlbGY6cHJvY2VzcyBleGVjbWVtOwotYWxsb3cgenlnb3RlIHNlbGY6Y2FwYWJpbGl0eSBzeXNfbmljZTsKZGlmZiAtLWdpdCBhL3RhcmdldC9ib2FyZC9nZW5lcmljX3g4Nl82NC9Cb2FyZENvbmZpZy5tayBiL3RhcmdldC9ib2FyZC9nZW5lcmljX3g4Nl82NC9Cb2FyZENvbmZpZy5tawppbmRleCA4ODNkZDJlLi41YmNiOWFkIDEwMDc1NQotLS0gYS90YXJnZXQvYm9hcmQvZ2VuZXJpY194ODZfNjQvQm9hcmRDb25maWcubWsKKysrIGIvdGFyZ2V0L2JvYXJkL2dlbmVyaWNfeDg2XzY0L0JvYXJkQ29uZmlnLm1rCkBAIC0xMCw2ICsxMCw3IEBACiBUQVJHRVRfQVJDSCA6PSB4ODZfNjQKIFRBUkdFVF9BUkNIX1ZBUklBTlQgOj0geDg2XzY0CiBUQVJHRVRfUFJFTElOS19NT0RVTEUgOj0gZmFsc2UKK1RBUkdFVF9CT09UTE9BREVSX0JPQVJEX05BTUUgOj0gZ29sZGZpc2hfJChUQVJHRVRfQVJDSCkKIAogVEFSR0VUXzJORF9DUFVfQUJJIDo9IHg4NgogVEFSR0VUXzJORF9BUkNIIDo9IHg4NgpAQCAtNTAsMTMgKzUxLDUxIEBACiAjIHdoZW4gZmluYWxpemluZyB0aGVtLgogQk9BUkRfVkVORE9SSU1BR0VfUEFSVElUSU9OX1NJWkUgOj0gMTAwMDAwMDAwCiBCT0FSRF9WRU5ET1JJTUFHRV9GSUxFX1NZU1RFTV9UWVBFIDo9IGV4dDQKLUJPQVJEX0NBQ0hFSU1BR0VfUEFSVElUSU9OX1NJWkUgOj0gNjkyMDYwMTYKLUJPQVJEX0NBQ0hFSU1BR0VfRklMRV9TWVNURU1fVFlQRSA6PSBleHQ0CiBCT0FSRF9GTEFTSF9CTE9DS19TSVpFIDo9IDUxMgogVEFSR0VUX1VTRVJJTUFHRVNfU1BBUlNFX0VYVF9ESVNBQkxFRCA6PSB0cnVlCiBCT0FSRF9QUk9QRVJUWV9PVkVSUklERVNfU1BMSVRfRU5BQkxFRCA6PSB0cnVlCiBERVZJQ0VfTUFUUklYX0ZJTEUgICA6PSBkZXZpY2UvZ2VuZXJpYy9nb2xkZmlzaC9jb21wYXRpYmlsaXR5X21hdHJpeC54bWwKIAorIyBBbmRyb2lkIGdlbmVyaWMgc3lzdGVtIGltYWdlIGFsd2F5cyBjcmVhdGUgbWV0YWRhdGEgcGFydGl0aW9uCitCT0FSRF9VU0VTX01FVEFEQVRBX1BBUlRJVElPTiA6PSB0cnVlCisKKyMgU2V0IHRoaXMgdG8gY3JlYXRlIC9jYWNoZSBtb3VudCBwb2ludCBmb3Igbm9uLUEvQiBkZXZpY2VzIHRoYXQgbW91bnRzIC9jYWNoZS4KKyMgVGhlIHBhcnRpdGlvbiBzaXplIGRvZXNuJ3QgbWF0dGVyLCBqdXN0IHRvIG1ha2UgYnVpbGQgcGFzcy4KK0JPQVJEX0NBQ0hFSU1BR0VfRklMRV9TWVNURU1fVFlQRSA6PSBleHQ0CitCT0FSRF9DQUNIRUlNQUdFX1BBUlRJVElPTl9TSVpFIDo9IDE2Nzc3MjE2CisKIEJPQVJEX1NFUE9MSUNZX0RJUlMgKz0gXAotICAgICAgICBidWlsZC90YXJnZXQvYm9hcmQvZ2VuZXJpYy9zZXBvbGljeSBcCi0gICAgICAgIGJ1aWxkL3RhcmdldC9ib2FyZC9nZW5lcmljX3g4Ni9zZXBvbGljeQorICAgICAgICBkZXZpY2UvZ2VuZXJpYy9nb2xkZmlzaC9zZXBvbGljeS9jb21tb24gXAorICAgICAgICBkZXZpY2UvZ2VuZXJpYy9nb2xkZmlzaC9zZXBvbGljeS94ODYKKworIyBBbmRyb2lkIFZlcmlmaWVkIEJvb3QgKEFWQik6CisjICAgQnVpbGRzIGEgc3BlY2lhbCB2Ym1ldGEuaW1nIHRoYXQgZGlzYWJsZXMgQVZCIHZlcmlmaWNhdGlvbi4KKyMgICBPdGhlcndpc2UsIEFWQiB3aWxsIHByZXZlbnQgdGhlIGRldmljZSBmcm9tIGJvb3RpbmcgdGhlIGdlbmVyaWMgc3lzdGVtLmltZy4KKyMgICBBbHNvIGNoZWNrcyB0aGF0IEJPQVJEX0FWQl9FTkFCTEUgaXMgbm90IHNldCwgdG8gcHJldmVudCBhZGRpbmcgdmVyaXR5CisjICAgbWV0YWRhdGEgaW50byBzeXN0ZW0uaW1nLgoraWZlcSAoJChCT0FSRF9BVkJfRU5BQkxFKSx0cnVlKQorJChlcnJvciBCT0FSRF9BVkJfRU5BQkxFIGNhbm5vdCBiZSBzZXQgZm9yIEdTSSkKK2VuZGlmCitCT0FSRF9CVUlMRF9ESVNBQkxFRF9WQk1FVEFJTUFHRSA6PSB0cnVlCisKK2lmbmVxICgsJChmaWx0ZXIgdXNlcmRlYnVnIGVuZywkKFRBUkdFVF9CVUlMRF9WQVJJQU5UKSkpCisjIEdTSSBpcyBhbHdheXMgdXNlcmRlYnVnIGFuZCBuZWVkcyBhIGNvdXBsZSBvZiBwcm9wZXJ0aWVzIHRha2luZyBwcmVjZWRlbmNlCisjIG92ZXIgdGhvc2Ugc2V0IGJ5IHRoZSB2ZW5kb3IuCitUQVJHRVRfU1lTVEVNX1BST1AgOj0gYnVpbGQvbWFrZS90YXJnZXQvYm9hcmQvZ3NpX3N5c3RlbS5wcm9wCitlbmRpZgorQk9BUkRfVk5ES19WRVJTSU9OIDo9IGN1cnJlbnQKKworIyBXaWZpLgorQk9BUkRfV0xBTl9ERVZJQ0UgICAgICAgICAgIDo9IGVtdWxhdG9yCitCT0FSRF9IT1NUQVBEX0RSSVZFUiAgICAgICAgOj0gTkw4MDIxMQorQk9BUkRfV1BBX1NVUFBMSUNBTlRfRFJJVkVSIDo9IE5MODAyMTEKK0JPQVJEX0hPU1RBUERfUFJJVkFURV9MSUIgICA6PSBsaWJfZHJpdmVyX2NtZF9zaW11bGF0ZWQKK0JPQVJEX1dQQV9TVVBQTElDQU5UX1BSSVZBVEVfTElCIDo9IGxpYl9kcml2ZXJfY21kX3NpbXVsYXRlZAorV1BBX1NVUFBMSUNBTlRfVkVSU0lPTiAgICAgIDo9IFZFUl8wXzhfWAorV0lGSV9EUklWRVJfRldfUEFUSF9QQVJBTSAgIDo9ICIvZGV2L251bGwiCitXSUZJX0RSSVZFUl9GV19QQVRIX1NUQSAgICAgOj0gIi9kZXYvbnVsbCIKK1dJRklfRFJJVkVSX0ZXX1BBVEhfQVAgICAgICA6PSAiL2Rldi9udWxsIgorCisjIEVuYWJsZSBBL0IgdXBkYXRlCitUQVJHRVRfTk9fUkVDT1ZFUlkgOj0gdHJ1ZQorQk9BUkRfQlVJTERfU1lTVEVNX1JPT1RfSU1BR0UgOj0gdHJ1ZQpkaWZmIC0tZ2l0IGEvdGFyZ2V0L2JvYXJkL2dlbmVyaWNfeDg2XzY0L2RldmljZS5tayBiL3RhcmdldC9ib2FyZC9nZW5lcmljX3g4Nl82NC9kZXZpY2UubWsKaW5kZXggMjRjMzlhNS4uMjczYWM3MSAxMDA3NTUKLS0tIGEvdGFyZ2V0L2JvYXJkL2dlbmVyaWNfeDg2XzY0L2RldmljZS5taworKysgYi90YXJnZXQvYm9hcmQvZ2VuZXJpY194ODZfNjQvZGV2aWNlLm1rCkBAIC0xNCwyMSArMTQsMTkgQEAKICMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLSMgVGhpcyBpcyBhIGJ1aWxkIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBwcm9kdWN0IGFzcGVjdHMgdGhhdAotIyBhcmUgc3BlY2lmaWMgdG8gdGhlIGVtdWxhdG9yLgorIyBtaW5pbWFsIGNvbmZpZ3VyYXRpb24gZm9yIGF1ZGlvIHBvbGljeS4KK1BST0RVQ1RfQ09QWV9GSUxFUyArPSBcCisgICAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb25fZ2VuZXJpYy54bWw6c3lzdGVtL2V0Yy9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwgXAorICAgIGZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL3ByaW1hcnlfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sOnN5c3RlbS9ldGMvcHJpbWFyeV9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwgXAorICAgIGZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL3Jfc3VibWl4X2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbDpzeXN0ZW0vZXRjL3Jfc3VibWl4X2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbCBcCisgICAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvYXVkaW9fcG9saWN5X3ZvbHVtZXMueG1sOnN5c3RlbS9ldGMvYXVkaW9fcG9saWN5X3ZvbHVtZXMueG1sIFwKKyAgICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9kZWZhdWx0X3ZvbHVtZV90YWJsZXMueG1sOnN5c3RlbS9ldGMvZGVmYXVsdF92b2x1bWVfdGFibGVzLnhtbCBcCiAKLVBST0RVQ1RfUFJPUEVSVFlfT1ZFUlJJREVTIDo9IFwKLSAgICByby5yaWwuaHN4cGE9MSBcCi0gICAgcm8ucmlsLmdwcnNjbGFzcz0xMAotCi1QUk9EVUNUX0NPUFlfRklMRVMgOj0gXAotICAgIGRldmljZS9nZW5lcmljL2dvbGRmaXNoL2RhdGEvZXRjL2FwbnMtY29uZi54bWw6c3lzdGVtL2V0Yy9hcG5zLWNvbmYueG1sIFwKLSAgICBkZXZpY2UvZ2VuZXJpYy9nb2xkZmlzaC9jYW1lcmEvbWVkaWFfcHJvZmlsZXMueG1sOnN5c3RlbS9ldGMvbWVkaWFfcHJvZmlsZXMueG1sIFwKLSAgICBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2RhdGEvbWVkaWFfY29kZWNzX2dvb2dsZV9hdWRpby54bWw6c3lzdGVtL2V0Yy9tZWRpYV9jb2RlY3NfZ29vZ2xlX2F1ZGlvLnhtbCBcCi0gICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9kYXRhL21lZGlhX2NvZGVjc19nb29nbGVfdGVsZXBob255LnhtbDpzeXN0ZW0vZXRjL21lZGlhX2NvZGVjc19nb29nbGVfdGVsZXBob255LnhtbCBcCi0gICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9kYXRhL21lZGlhX2NvZGVjc19nb29nbGVfdmlkZW8ueG1sOnN5c3RlbS9ldGMvbWVkaWFfY29kZWNzX2dvb2dsZV92aWRlby54bWwgXAotICAgIGRldmljZS9nZW5lcmljL2dvbGRmaXNoL2NhbWVyYS9tZWRpYV9jb2RlY3MueG1sOnN5c3RlbS9ldGMvbWVkaWFfY29kZWNzLnhtbAotCi1QUk9EVUNUX1BBQ0tBR0VTIDo9IFwKLSAgICBhdWRpby5wcmltYXJ5LmdvbGRmaXNoIFwKLSAgICB2aWJyYXRvci5nb2xkZmlzaAorIyBORkM6CisjICAgUHJvdmlkZSBkZWZhdWx0IGxpYm5mYy1uY2kuY29uZiBmaWxlIGZvciBkZXZpY2VzIHRoYXQgZG9lcyBub3QgaGF2ZSBvbmUgaW4KKyMgICB2ZW5kb3IvZXRjIGJlY2F1c2UgYW9zcCBzeXN0ZW0gaW1hZ2UgKG9mIGFvc3BfJGFyY2ggcHJvZHVjdHMpIGlzIGdvaW5nIHRvCisjICAgYmUgdXNlZCBhcyBHU0kuCisjICAgTWF5IG5lZWQgdG8gcmVtb3ZlIHRoZSBmb2xsb3dpbmcgZm9yIG5ld2x5IGxhdW5jaGVkIGRldmljZXMgaW4gUCBzaW5jZSB0aGlzCisjICAgTkZDIGNvbmZpZ3VyYXRpb24gZmlsZSBzaG91bGQgYmUgaW4gdmVuZG9yL2V0YywgaW5zdGVhZCBvZiBzeXN0ZW0vZXRjCitQUk9EVUNUX0NPUFlfRklMRVMgKz0gXAorICAgIGRldmljZS9nZW5lcmljL2NvbW1vbi9uZmMvbGlibmZjLW5jaS5jb25mOnN5c3RlbS9ldGMvbGlibmZjLW5jaS5jb25mCmRpZmYgLS1naXQgYS90YXJnZXQvYm9hcmQvZ2VuZXJpY194ODZfNjRfYWIvQm9hcmRDb25maWcubWsgYi90YXJnZXQvYm9hcmQvZ2VuZXJpY194ODZfNjRfYWIvQm9hcmRDb25maWcubWsKaW5kZXggZTQ5ODYzYS4uYTA5OGRmZSAxMDA2NDQKLS0tIGEvdGFyZ2V0L2JvYXJkL2dlbmVyaWNfeDg2XzY0X2FiL0JvYXJkQ29uZmlnLm1rCisrKyBiL3RhcmdldC9ib2FyZC9nZW5lcmljX3g4Nl82NF9hYi9Cb2FyZENvbmZpZy5tawpAQCAtMjQsNiArMjQsMTEgQEAKIFRBUkdFVF8yTkRfQVJDSCA6PSB4ODYKIFRBUkdFVF8yTkRfQVJDSF9WQVJJQU5UIDo9IHg4Nl82NAogCisjIFNldCB0aGlzIHRvIGNyZWF0ZSAvY2FjaGUgbW91bnQgcG9pbnQgZm9yIG5vbi1BL0IgZGV2aWNlcyB0aGF0IG1vdW50cyAvY2FjaGUuCisjIFRoZSBwYXJ0aXRpb24gc2l6ZSBkb2Vzbid0IG1hdHRlciwganVzdCB0byBtYWtlIGJ1aWxkIHBhc3MuCitCT0FSRF9DQUNIRUlNQUdFX0ZJTEVfU1lTVEVNX1RZUEUgOj0gZXh0NAorQk9BUkRfQ0FDSEVJTUFHRV9QQVJUSVRJT05fU0laRSA6PSAxNjc3NzIxNgorCiAjIEVuYWJsZSBBL0IgdXBkYXRlCiBUQVJHRVRfTk9fUkVDT1ZFUlkgOj0gdHJ1ZQogQk9BUkRfQlVJTERfU1lTVEVNX1JPT1RfSU1BR0UgOj0gdHJ1ZQpkaWZmIC0tZ2l0IGEvdGFyZ2V0L2JvYXJkL2dlbmVyaWNfeDg2X2FiL0JvYXJkQ29uZmlnLm1rIGIvdGFyZ2V0L2JvYXJkL2dlbmVyaWNfeDg2X2FiL0JvYXJkQ29uZmlnLm1rCmluZGV4IDZlNTExMDIuLmRiNGRhY2QgMTAwNjQ0Ci0tLSBhL3RhcmdldC9ib2FyZC9nZW5lcmljX3g4Nl9hYi9Cb2FyZENvbmZpZy5taworKysgYi90YXJnZXQvYm9hcmQvZ2VuZXJpY194ODZfYWIvQm9hcmRDb25maWcubWsKQEAgLTIwLDYgKzIwLDExIEBACiBUQVJHRVRfQVJDSCA6PSB4ODYKIFRBUkdFVF9BUkNIX1ZBUklBTlQgOj0geDg2CiAKKyMgU2V0IHRoaXMgdG8gY3JlYXRlIC9jYWNoZSBtb3VudCBwb2ludCBmb3Igbm9uLUEvQiBkZXZpY2VzIHRoYXQgbW91bnRzIC9jYWNoZS4KKyMgVGhlIHBhcnRpdGlvbiBzaXplIGRvZXNuJ3QgbWF0dGVyLCBqdXN0IHRvIG1ha2UgYnVpbGQgcGFzcy4KK0JPQVJEX0NBQ0hFSU1BR0VfRklMRV9TWVNURU1fVFlQRSA6PSBleHQ0CitCT0FSRF9DQUNIRUlNQUdFX1BBUlRJVElPTl9TSVpFIDo9IDE2Nzc3MjE2CisKICMgRW5hYmxlIEEvQiB1cGRhdGUKIFRBUkdFVF9OT19SRUNPVkVSWSA6PSB0cnVlCiBCT0FSRF9CVUlMRF9TWVNURU1fUk9PVF9JTUFHRSA6PSB0cnVlCmRpZmYgLS1naXQgYS90YXJnZXQvYm9hcmQvZ2VuZXJpY194ODZfYXJtL0JvYXJkQ29uZmlnLm1rIGIvdGFyZ2V0L2JvYXJkL2dlbmVyaWNfeDg2X2FybS9Cb2FyZENvbmZpZy5tawppbmRleCAxMzFjMDAxLi5jNjZhYWNjIDEwMDY0NAotLS0gYS90YXJnZXQvYm9hcmQvZ2VuZXJpY194ODZfYXJtL0JvYXJkQ29uZmlnLm1rCisrKyBiL3RhcmdldC9ib2FyZC9nZW5lcmljX3g4Nl9hcm0vQm9hcmRDb25maWcubWsKQEAgLTYxLDQgKzYxLDQgQEAKIEJPQVJEX0ZMQVNIX0JMT0NLX1NJWkUgOj0gNTEyCiBUQVJHRVRfVVNFUklNQUdFU19TUEFSU0VfRVhUX0RJU0FCTEVEIDo9IHRydWUKIAotQk9BUkRfU0VQT0xJQ1lfRElSUyArPSBidWlsZC90YXJnZXQvYm9hcmQvZ2VuZXJpYy9zZXBvbGljeQorQk9BUkRfU0VQT0xJQ1lfRElSUyArPSBkZXZpY2UvZ2VuZXJpYy9nb2xkZmlzaC9zZXBvbGljeS9jb21tb24KZGlmZiAtLWdpdCBhL3RhcmdldC9ib2FyZC9nc2lfc3lzdGVtLnByb3AgYi90YXJnZXQvYm9hcmQvZ3NpX3N5c3RlbS5wcm9wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjMDRhOTUKLS0tIC9kZXYvbnVsbAorKysgYi90YXJnZXQvYm9hcmQvZ3NpX3N5c3RlbS5wcm9wCkBAIC0wLDAgKzEsOCBAQAorIyBHU0kgYWx3YXlzIGdlbmVyYXRlIGRleCBwcmUtb3B0IGluIHN5c3RlbSBpbWFnZQorcm8uY3Bfc3lzdGVtX290aGVyX29kZXg9MAorCisjIEdTSSBhbHdheXMgZGlzYWJsZXMgYWRiIGF1dGhlbnRpY2F0aW9uCityby5hZGIuc2VjdXJlPTAKKworIyBUT0RPKGIvNzgxMDU5NTUpOiBkaXNhYmxlIHByaXZhcHBfcGVybWlzc2lvbnMgY2hlY2tpbmcgYmVmb3JlIHRoZSBidWcgc29sdmVkCityby5jb250cm9sX3ByaXZhcHBfcGVybWlzc2lvbnM9ZGlzYWJsZQpkaWZmIC0tZ2l0IGEvdGFyZ2V0L2JvYXJkL3RyZWJsZV9jb21tb24ubWsgYi90YXJnZXQvYm9hcmQvdHJlYmxlX2NvbW1vbi5tawppbmRleCBmZDMzNjNjLi5jNGU2OGZlIDEwMDY0NAotLS0gYS90YXJnZXQvYm9hcmQvdHJlYmxlX2NvbW1vbi5taworKysgYi90YXJnZXQvYm9hcmQvdHJlYmxlX2NvbW1vbi5tawpAQCAtMTksNyArMTksNiBAQAogCiAjIFZOREsKIEJPQVJEX1ZOREtfVkVSU0lPTiA6PSBjdXJyZW50Ci1CT0FSRF9WTkRLX1JVTlRJTUVfRElTQUJMRSA6PSB0cnVlCiAKICMgUHJvcGVydGllcwogVEFSR0VUX1NZU1RFTV9QUk9QIDo9IGJ1aWxkL21ha2UvdGFyZ2V0L2JvYXJkL3RyZWJsZV9zeXN0ZW0ucHJvcApAQCAtNDAsMjggKzM5LDIzIEBACiAjIEdlbmVyaWMgQU9TUCBpbWFnZSBhbHdheXMgcmVxdWlyZXMgc2VwYXJhdGUgdmVuZG9yLmltZwogVEFSR0VUX0NPUFlfT1VUX1ZFTkRPUiA6PSB2ZW5kb3IKIAotIyBFbmFibGUgZGV4IHByZS1vcHQgdG8gc3BlZWQgdXAgaW5pdGlhbCBib290Ci1pZmVxICgkKEhPU1RfT1MpLGxpbnV4KQotICBpZmVxICgkKFdJVEhfREVYUFJFT1BUKSwpCi0gICAgV0lUSF9ERVhQUkVPUFQgOj0gdHJ1ZQotICAgIFdJVEhfREVYUFJFT1BUX1BJQyA6PSB0cnVlCi0gICAgaWZuZXEgKCQoVEFSR0VUX0JVSUxEX1ZBUklBTlQpLHVzZXIpCi0gICAgICAjIFJldGFpbiBjbGFzc2VzLmRleCBpbiBBUEsncyBmb3Igbm9uLXVzZXIgYnVpbGRzCi0gICAgICBERVhfUFJFT1BUX0RFRkFVTFQgOj0gbm9zdHJpcHBpbmcKLSAgICBlbmRpZgotICBlbmRpZgotZW5kaWYKKyMgQW5kcm9pZCBnZW5lcmljIHN5c3RlbSBpbWFnZSBhbHdheXMgY3JlYXRlIG1ldGFkYXRhIHBhcnRpdGlvbgorQk9BUkRfVVNFU19NRVRBREFUQV9QQVJUSVRJT04gOj0gdHJ1ZQogCiAjIEdlbmVyaWMgQU9TUCBpbWFnZSBkb2VzIE5PVCBzdXBwb3J0IEhXQzEKIFRBUkdFVF9VU0VTX0hXQzIgOj0gdHJ1ZQogIyBTZXQgZW11bGF0b3IgZnJhbWVidWZmZXIgZGlzcGxheSBkZXZpY2UgYnVmZmVyIGNvdW50IHRvIDMKIE5VTV9GUkFNRUJVRkZFUl9TVVJGQUNFX0JVRkZFUlMgOj0gMwogCi0jIFRPRE8oYi8zNTc5MDM5OSk6IHJlbW92ZSB3aGVuIGIvMzU3OTAzOTkgaXMgZml4ZWQuCi1CT0FSRF9OQU5EX1NQQVJFX1NJWkUgOj0gMAotQk9BUkRfRkxBU0hfQkxPQ0tfU0laRSA6PSA1MTIKKyMgQXVkaW8KK1VTRV9YTUxfQVVESU9fUE9MSUNZX0NPTkYgOj0gMQogCi0jIGIvNjQ3MDAxOTU6IGFkZCBtaW5pbXVtIHN1cHBvcnQgZm9yIG9kbS5pbWcKLSMgQ3VycmVudGx5IG9kbS5pbWcgY2FuIG9ubHkgYmUgYnVpbHQgYnkgYG1ha2UgY3VzdG9tX2ltYWdlc2AuCi0jIEFkZGluZyAvb2RtIG1vdW50IHBvaW50IHVuZGVyIHJvb3QgZGlyZWN0b3J5LgotQk9BUkRfUk9PVF9FWFRSQV9GT0xERVJTICs9IG9kbQorIyBBbmRyb2lkIFZlcmlmaWVkIEJvb3QgKEFWQik6CisjICAgQnVpbGRzIGEgc3BlY2lhbCB2Ym1ldGEuaW1nIHRoYXQgZGlzYWJsZXMgQVZCIHZlcmlmaWNhdGlvbi4KKyMgICBPdGhlcndpc2UsIEFWQiB3aWxsIHByZXZlbnQgdGhlIGRldmljZSBmcm9tIGJvb3RpbmcgdGhlIGdlbmVyaWMgc3lzdGVtLmltZy4KKyMgICBBbHNvIGNoZWNrcyB0aGF0IEJPQVJEX0FWQl9FTkFCTEUgaXMgbm90IHNldCwgdG8gcHJldmVudCBhZGRpbmcgdmVyaXR5CisjICAgbWV0YWRhdGEgaW50byBzeXN0ZW0uaW1nLgoraWZlcSAoJChCT0FSRF9BVkJfRU5BQkxFKSx0cnVlKQorJChlcnJvciBCT0FSRF9BVkJfRU5BQkxFIGNhbm5vdCBiZSBzZXQgZm9yIFRyZWJsZSBHU0kpCitlbmRpZgorQk9BUkRfQlVJTERfRElTQUJMRURfVkJNRVRBSU1BR0UgOj0gdHJ1ZQpkaWZmIC0tZ2l0IGEvdGFyZ2V0L2JvYXJkL3RyZWJsZV9zeXN0ZW0ucHJvcCBiL3RhcmdldC9ib2FyZC90cmVibGVfc3lzdGVtLnByb3AKaW5kZXggNGI1NGFhZi4uMGMwNGE5NSAxMDA2NDQKLS0tIGEvdGFyZ2V0L2JvYXJkL3RyZWJsZV9zeXN0ZW0ucHJvcAorKysgYi90YXJnZXQvYm9hcmQvdHJlYmxlX3N5c3RlbS5wcm9wCkBAIC0zLDMgKzMsNiBAQAogCiAjIEdTSSBhbHdheXMgZGlzYWJsZXMgYWRiIGF1dGhlbnRpY2F0aW9uCiByby5hZGIuc2VjdXJlPTAKKworIyBUT0RPKGIvNzgxMDU5NTUpOiBkaXNhYmxlIHByaXZhcHBfcGVybWlzc2lvbnMgY2hlY2tpbmcgYmVmb3JlIHRoZSBidWcgc29sdmVkCityby5jb250cm9sX3ByaXZhcHBfcGVybWlzc2lvbnM9ZGlzYWJsZQpkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3QvQW5kcm9pZFByb2R1Y3RzLm1rIGIvdGFyZ2V0L3Byb2R1Y3QvQW5kcm9pZFByb2R1Y3RzLm1rCmluZGV4IDllMmFkZWUuLjg1MzMwYjMgMTAwNjQ0Ci0tLSBhL3RhcmdldC9wcm9kdWN0L0FuZHJvaWRQcm9kdWN0cy5taworKysgYi90YXJnZXQvcHJvZHVjdC9BbmRyb2lkUHJvZHVjdHMubWsKQEAgLTM2LDcgKzM2LDYgQEAKIFBST0RVQ1RfTUFLRUZJTEVTIDo9IFwKICAgICAkKExPQ0FMX0RJUikvYW9zcF9hcm0ubWsgXAogICAgICQoTE9DQUxfRElSKS9mdWxsLm1rIFwKLSAgICAkKExPQ0FMX0RJUikvZ2VuZXJpY19hcm12NS5tayBcCiAgICAgJChMT0NBTF9ESVIpL2Fvc3BfeDg2Lm1rIFwKICAgICAkKExPQ0FMX0RJUikvZnVsbF94ODYubWsgXAogICAgICQoTE9DQUxfRElSKS9hb3NwX21pcHMubWsgXApkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3QvYW9zcF9hcm0ubWsgYi90YXJnZXQvcHJvZHVjdC9hb3NwX2FybS5tawppbmRleCA5ZWQ1Mjg0Li5iODcyZjQ4IDEwMDY0NAotLS0gYS90YXJnZXQvcHJvZHVjdC9hb3NwX2FybS5taworKysgYi90YXJnZXQvcHJvZHVjdC9hb3NwX2FybS5tawpAQCAtMTQsMTggKzE0LDE1IEBACiAjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1QUk9EVUNUX1BST1BFUlRZX09WRVJSSURFUyArPSBcCi0JcmlsZC5saWJwYXRoPS92ZW5kb3IvbGliL2xpYnJlZmVyZW5jZS1yaWwuc28KKy1pbmNsdWRlIGRldmljZS9nZW5lcmljL2dvbGRmaXNoL2FybTMyLXZlbmRvci5tawogCi0jIE5vdGU6IHRoZSBmb2xsb3dpbmcgbGluZXMgbmVlZCB0byBzdGF5IGF0IHRoZSBiZWdpbm5pbmcgc28gdGhhdCBpdCBjYW4KLSMgdGFrZSBwcmlvcml0eSAgYW5kIG92ZXJyaWRlIHRoZSBydWxlcyBpdCBpbmhlcml0IGZyb20gb3RoZXIgbWsgZmlsZXMKLSMgc2VlIGNvcHkgZmlsZSBydWxlcyBpbiBjb3JlL01ha2VmaWxlCi1QUk9EVUNUX0NPUFlfRklMRVMgKz0gXAotICAgIGRldmVsb3BtZW50L3N5cy1pbWcvYWR2YW5jZWRGZWF0dXJlcy5pbmkuYXJtOmFkdmFuY2VkRmVhdHVyZXMuaW5pIFwKLSAgICBwcmVidWlsdHMvcWVtdS1rZXJuZWwvYXJtLzMuMTgva2VybmVsLXFlbXUyOmtlcm5lbC1yYW5jaHUgXAotICAgIGRldmljZS9nZW5lcmljL2dvbGRmaXNoL2ZzdGFiLnJhbmNodS5hcm06cm9vdC9mc3RhYi5yYW5jaHUgXAotICAgIGRldmljZS9nZW5lcmljL2dvbGRmaXNoL2ZzdGFiLnJhbmNodS5lYXJseS5hcm06cm9vdC9mc3RhYi5yYW5jaHUuZWFybHkKKyMgVE9ETyhiLzc4MzA4NTU5KTogaW5jbHVkZXMgdnJfaHdjIGludG8gR1NJIGJlZm9yZSB2cl9od2MgbW92ZSB0byB2ZW5kb3IKK1BST0RVQ1RfUEFDS0FHRVMgKz0gXAorICAgIHZyX2h3YwogCiBpbmNsdWRlICQoU1JDX1RBUkdFVF9ESVIpL3Byb2R1Y3QvZnVsbC5tawogCisjIE5lZWRlZCBieSBQaSBuZXdseSBsYXVuY2hlZCBkZXZpY2UgdG8gcGFzcyBWdHNUcmVibGVTeXNQcm9wIG9uIEdTSQorUFJPRFVDVF9DT01QQVRJQkxFX1BST1BFUlRZX09WRVJSSURFIDo9IHRydWUKKwogUFJPRFVDVF9OQU1FIDo9IGFvc3BfYXJtCmRpZmYgLS1naXQgYS90YXJnZXQvcHJvZHVjdC9hb3NwX2FybTY0Lm1rIGIvdGFyZ2V0L3Byb2R1Y3QvYW9zcF9hcm02NC5tawppbmRleCAxOGQ2MTNiLi4zM2RlZmUxIDEwMDY0NAotLS0gYS90YXJnZXQvcHJvZHVjdC9hb3NwX2FybTY0Lm1rCisrKyBiL3RhcmdldC9wcm9kdWN0L2Fvc3BfYXJtNjQubWsKQEAgLTE0LDI4ICsxNCwzMyBAQAogIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotUFJPRFVDVF9QUk9QRVJUWV9PVkVSUklERVMgKz0gXAotCXJpbGQubGlicGF0aD0vdmVuZG9yL2xpYjY0L2xpYnJlZmVyZW5jZS1yaWwuc28KLQogIyBUaGlzIGlzIGEgYnVpbGQgY29uZmlndXJhdGlvbiBmb3IgYSBmdWxsLWZlYXR1cmVkIGJ1aWxkIG9mIHRoZQogIyBPcGVuLVNvdXJjZSBwYXJ0IG9mIHRoZSB0cmVlLiBJdCdzIGdlYXJlZCB0b3dhcmQgYSBVUy1jZW50cmljCiAjIGJ1aWxkIHF1aXRlIHNwZWNpZmljYWxseSBmb3IgdGhlIGVtdWxhdG9yLCBhbmQgbWlnaHQgbm90IGJlCiAjIGVudGlyZWx5IGFwcHJvcHJpYXRlIHRvIGluaGVyaXQgZnJvbSBmb3Igb24tZGV2aWNlIGNvbmZpZ3VyYXRpb25zLgogCi0jIE5vdGU6IHRoZSBmb2xsb3dpbmcgbGluZXMgbmVlZCB0byBzdGF5IGF0IHRoZSBiZWdpbm5pbmcgc28gdGhhdCBpdCBjYW4KLSMgdGFrZSBwcmlvcml0eSAgYW5kIG92ZXJyaWRlIHRoZSBydWxlcyBpdCBpbmhlcml0IGZyb20gb3RoZXIgbWsgZmlsZXMKLSMgc2VlIGNvcHkgZmlsZSBydWxlcyBpbiBjb3JlL01ha2VmaWxlCi1QUk9EVUNUX0NPUFlfRklMRVMgKz0gXAotICAgIGRldmVsb3BtZW50L3N5cy1pbWcvYWR2YW5jZWRGZWF0dXJlcy5pbmkuYXJtOmFkdmFuY2VkRmVhdHVyZXMuaW5pIFwKLSAgICBwcmVidWlsdHMvcWVtdS1rZXJuZWwvYXJtNjQvMy4xOC9rZXJuZWwtcWVtdTI6a2VybmVsLXJhbmNodSBcCi0gICAgZGV2aWNlL2dlbmVyaWMvZ29sZGZpc2gvZnN0YWIucmFuY2h1LmFybTpyb290L2ZzdGFiLnJhbmNodSBcCi0gICAgZGV2aWNlL2dlbmVyaWMvZ29sZGZpc2gvZnN0YWIucmFuY2h1LmVhcmx5LmFybTpyb290L2ZzdGFiLnJhbmNodS5lYXJseQorLWluY2x1ZGUgZGV2aWNlL2dlbmVyaWMvZ29sZGZpc2gvYXJtNjQtdmVuZG9yLm1rCiAKKyMgQ29weSBkaWZmZXJlbnQgenlnb3RlIHNldHRpbmdzIGZvciB2ZW5kb3IuaW1nIHRvIHNlbGVjdCBieSBzZXR0aW5nIHByb3BlcnR5CisjIHJvLnp5Z290ZT16eWdvdGU2NF8zMiBvciByby56eWdvdGU9enlnb3RlMzJfNjQ6CisjICAgMS4gNjQtYml0IHByaW1hcnksIDMyLWJpdCBzZWNvbmRhcnkgT1IKKyMgICAyLiAzMi1iaXQgcHJpbWFyeSwgNjQtYml0IHNlY29uZGFyeQorIyBpbml0Lnp5Z290ZTY0XzMyLnJjIGlzIGluIHRoZSBjb3JlXzY0X2JpdC5tayBiZWxvdworUFJPRFVDVF9DT1BZX0ZJTEVTICs9IFwKKyAgICBzeXN0ZW0vY29yZS9yb290ZGlyL2luaXQuenlnb3RlMzJfNjQucmM6cm9vdC9pbml0Lnp5Z290ZTMyXzY0LnJjCisKKyMgVE9ETyhiLzc4MzA4NTU5KTogaW5jbHVkZXMgdnJfaHdjIGludG8gR1NJIGJlZm9yZSB2cl9od2MgbW92ZSB0byB2ZW5kb3IKK1BST0RVQ1RfUEFDS0FHRVMgKz0gXAorICAgIHZyX2h3YworCiskKGNhbGwgaW5oZXJpdC1wcm9kdWN0LCAkKFNSQ19UQVJHRVRfRElSKS9wcm9kdWN0L2VtdWxhdG9yLm1rKQogJChjYWxsIGluaGVyaXQtcHJvZHVjdCwgJChTUkNfVEFSR0VUX0RJUikvcHJvZHVjdC9jb3JlXzY0X2JpdC5taykKICQoY2FsbCBpbmhlcml0LXByb2R1Y3QsICQoU1JDX1RBUkdFVF9ESVIpL3Byb2R1Y3QvYW9zcF9iYXNlX3RlbGVwaG9ueS5taykKICQoY2FsbCBpbmhlcml0LXByb2R1Y3QsICQoU1JDX1RBUkdFVF9ESVIpL2JvYXJkL2dlbmVyaWNfYXJtNjQvZGV2aWNlLm1rKQogCi1pbmNsdWRlICQoU1JDX1RBUkdFVF9ESVIpL3Byb2R1Y3QvZW11bGF0b3IubWsKKyMgTmVlZGVkIGJ5IFBpIG5ld2x5IGxhdW5jaGVkIGRldmljZSB0byBwYXNzIFZ0c1RyZWJsZVN5c1Byb3Agb24gR1NJCitQUk9EVUNUX0NPTVBBVElCTEVfUFJPUEVSVFlfT1ZFUlJJREUgOj0gdHJ1ZQorCiBQUk9EVUNUX05BTUUgOj0gYW9zcF9hcm02NAogUFJPRFVDVF9ERVZJQ0UgOj0gZ2VuZXJpY19hcm02NAogUFJPRFVDVF9CUkFORCA6PSBBbmRyb2lkCmRpZmYgLS1naXQgYS90YXJnZXQvcHJvZHVjdC9hb3NwX2FybTY0X2FiLm1rIGIvdGFyZ2V0L3Byb2R1Y3QvYW9zcF9hcm02NF9hYi5tawppbmRleCBjOTZjYjkxLi42ZmYxMTU3IDEwMDY0NAotLS0gYS90YXJnZXQvcHJvZHVjdC9hb3NwX2FybTY0X2FiLm1rCisrKyBiL3RhcmdldC9wcm9kdWN0L2Fvc3BfYXJtNjRfYWIubWsKQEAgLTIxLDEyICsyMSw2IEBACiAKIGluY2x1ZGUgYnVpbGQvbWFrZS90YXJnZXQvcHJvZHVjdC90cmVibGVfY29tbW9uXzY0Lm1rCiAKLUFCX09UQV9VUERBVEVSIDo9IHRydWUKLUFCX09UQV9QQVJUSVRJT05TIDo9IHN5c3RlbQotUFJPRFVDVF9QQUNLQUdFUyArPSBcCi0gICAgdXBkYXRlX2VuZ2luZSBcCi0gICAgdXBkYXRlX3ZlcmlmaWVyCi0KIFBST0RVQ1RfTkFNRSA6PSBhb3NwX2FybTY0X2FiCiBQUk9EVUNUX0RFVklDRSA6PSBnZW5lcmljX2FybTY0X2FiCiBQUk9EVUNUX0JSQU5EIDo9IEFuZHJvaWQKZGlmZiAtLWdpdCBhL3RhcmdldC9wcm9kdWN0L2Fvc3BfYXJtX2FiLm1rIGIvdGFyZ2V0L3Byb2R1Y3QvYW9zcF9hcm1fYWIubWsKaW5kZXggOThiMmY5OS4uOWE0Njg4ZSAxMDA2NDQKLS0tIGEvdGFyZ2V0L3Byb2R1Y3QvYW9zcF9hcm1fYWIubWsKKysrIGIvdGFyZ2V0L3Byb2R1Y3QvYW9zcF9hcm1fYWIubWsKQEAgLTIxLDEyICsyMSw2IEBACiAKIGluY2x1ZGUgYnVpbGQvbWFrZS90YXJnZXQvcHJvZHVjdC90cmVibGVfY29tbW9uXzMyLm1rCiAKLUFCX09UQV9VUERBVEVSIDo9IHRydWUKLUFCX09UQV9QQVJUSVRJT05TIDo9IHN5c3RlbQotUFJPRFVDVF9QQUNLQUdFUyArPSBcCi0gICAgdXBkYXRlX2VuZ2luZSBcCi0gICAgdXBkYXRlX3ZlcmlmaWVyCi0KIFBST0RVQ1RfTkFNRSA6PSBhb3NwX2FybV9hYgogUFJPRFVDVF9ERVZJQ0UgOj0gZ2VuZXJpY19hcm1fYWIKIFBST0RVQ1RfQlJBTkQgOj0gQW5kcm9pZApkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3QvYW9zcF9taXBzLm1rIGIvdGFyZ2V0L3Byb2R1Y3QvYW9zcF9taXBzLm1rCmluZGV4IGE3NmI5M2EuLjVlZTYxODUgMTAwNjQ0Ci0tLSBhL3RhcmdldC9wcm9kdWN0L2Fvc3BfbWlwcy5taworKysgYi90YXJnZXQvcHJvZHVjdC9hb3NwX21pcHMubWsKQEAgLTEsNSArMSw1IEBACiAjCi0jIENvcHlyaWdodCAyMDEzIFRoZSBBbmRyb2lkIE9wZW4tU291cmNlIFByb2plY3QKKyMgQ29weXJpZ2h0IDIwMTcgVGhlIEFuZHJvaWQgT3Blbi1Tb3VyY2UgUHJvamVjdAogIwogIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMTMsNiArMTMsMTkgQEAKICMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICMKKworUFJPRFVDVF9QUk9QRVJUWV9PVkVSUklERVMgKz0gXAorCXJpbGQubGlicGF0aD0vdmVuZG9yL2xpYi9saWJyZWZlcmVuY2UtcmlsLnNvCisKKyMgTm90ZTogdGhlIGZvbGxvd2luZyBsaW5lcyBuZWVkIHRvIHN0YXkgYXQgdGhlIGJlZ2lubmluZyBzbyB0aGF0IGl0IGNhbgorIyB0YWtlIHByaW9yaXR5ICBhbmQgb3ZlcnJpZGUgdGhlIHJ1bGVzIGl0IGluaGVyaXQgZnJvbSBvdGhlciBtayBmaWxlcworIyBzZWUgY29weSBmaWxlIHJ1bGVzIGluIGNvcmUvTWFrZWZpbGUKK1BST0RVQ1RfQ09QWV9GSUxFUyArPSBcCisgICAgZGV2ZWxvcG1lbnQvc3lzLWltZy9hZHZhbmNlZEZlYXR1cmVzLmluaS5hcm06YWR2YW5jZWRGZWF0dXJlcy5pbmkgXAorICAgIHByZWJ1aWx0cy9xZW11LWtlcm5lbC9taXBzLzMuMTgva2VybmVsLXFlbXUyOmtlcm5lbC1yYW5jaHUgXAorICAgIGRldmljZS9nZW5lcmljL2dvbGRmaXNoL2ZzdGFiLnJhbmNodS5taXBzOnJvb3QvZnN0YWIucmFuY2h1IFwKKyAgICBkZXZpY2UvZ2VuZXJpYy9nb2xkZmlzaC9mc3RhYi5yYW5jaHUuZWFybHkuYXJtOnJvb3QvZnN0YWIucmFuY2h1LmVhcmx5CisKIGluY2x1ZGUgJChTUkNfVEFSR0VUX0RJUikvcHJvZHVjdC9mdWxsX21pcHMubWsKIAogUFJPRFVDVF9OQU1FIDo9IGFvc3BfbWlwcwpkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3QvYW9zcF9taXBzNjQubWsgYi90YXJnZXQvcHJvZHVjdC9hb3NwX21pcHM2NC5tawppbmRleCBmNjA2ODU4Li43M2QzNzMxIDEwMDY0NAotLS0gYS90YXJnZXQvcHJvZHVjdC9hb3NwX21pcHM2NC5taworKysgYi90YXJnZXQvcHJvZHVjdC9hb3NwX21pcHM2NC5tawpAQCAtMSw1ICsxLDUgQEAKICMKLSMgQ29weXJpZ2h0IDIwMTMgVGhlIEFuZHJvaWQgT3Blbi1Tb3VyY2UgUHJvamVjdAorIyBDb3B5cmlnaHQgMjAxNyBUaGUgQW5kcm9pZCBPcGVuLVNvdXJjZSBQcm9qZWN0CiAjCiAjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0xNCwxNCArMTQsMjIgQEAKICMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKK1BST0RVQ1RfUFJPUEVSVFlfT1ZFUlJJREVTICs9IFwKKwlyaWxkLmxpYnBhdGg9L3ZlbmRvci9saWI2NC9saWJyZWZlcmVuY2UtcmlsLnNvCisKICMgVGhpcyBpcyBhIGJ1aWxkIGNvbmZpZ3VyYXRpb24gZm9yIGEgZnVsbC1mZWF0dXJlZCBidWlsZCBvZiB0aGUKICMgT3Blbi1Tb3VyY2UgcGFydCBvZiB0aGUgdHJlZS4gSXQncyBnZWFyZWQgdG93YXJkIGEgVVMtY2VudHJpYwotIyBtaXBzNjQgYnVpbGQgcXVpdGUgc3BlY2lmaWNhbGx5IGZvciB0aGUgZW11bGF0b3IsIGFuZCBtaWdodCBub3QgYmUKKyMgYnVpbGQgcXVpdGUgc3BlY2lmaWNhbGx5IGZvciB0aGUgZW11bGF0b3IsIGFuZCBtaWdodCBub3QgYmUKICMgZW50aXJlbHkgYXBwcm9wcmlhdGUgdG8gaW5oZXJpdCBmcm9tIGZvciBvbi1kZXZpY2UgY29uZmlndXJhdGlvbnMuCiAKLSMgVGhpcyBpcyBmb3IgZW5hYmxpbmcgZXRoZXJuZXQgc3VwcG9ydCBmb3IgcmFuY2h1LgotIyBDb25zaWRlciByZW1vdmluZyB0aGlzIGFmdGVyIFJJTCBzdXBwb3J0IGlzIHByb3ZpZGVkIGluIHJhbmNodS4KLVBST0RVQ1RfQ09QWV9GSUxFUyArPSBmcmFtZXdvcmtzL25hdGl2ZS9kYXRhL2V0Yy9hbmRyb2lkLmhhcmR3YXJlLmV0aGVybmV0LnhtbDpzeXN0ZW0vZXRjL3Blcm1pc3Npb25zL2FuZHJvaWQuaGFyZHdhcmUuZXRoZXJuZXQueG1sCisjIE5vdGU6IHRoZSBmb2xsb3dpbmcgbGluZXMgbmVlZCB0byBzdGF5IGF0IHRoZSBiZWdpbm5pbmcgc28gdGhhdCBpdCBjYW4KKyMgdGFrZSBwcmlvcml0eSAgYW5kIG92ZXJyaWRlIHRoZSBydWxlcyBpdCBpbmhlcml0IGZyb20gb3RoZXIgbWsgZmlsZXMKKyMgc2VlIGNvcHkgZmlsZSBydWxlcyBpbiBjb3JlL01ha2VmaWxlCitQUk9EVUNUX0NPUFlfRklMRVMgKz0gXAorICAgIGRldmVsb3BtZW50L3N5cy1pbWcvYWR2YW5jZWRGZWF0dXJlcy5pbmkuYXJtOmFkdmFuY2VkRmVhdHVyZXMuaW5pIFwKKyAgICBwcmVidWlsdHMvcWVtdS1rZXJuZWwvbWlwczY0LzMuMTgva2VybmVsLXFlbXUyOmtlcm5lbC1yYW5jaHUgXAorICAgIGRldmljZS9nZW5lcmljL2dvbGRmaXNoL2ZzdGFiLnJhbmNodS5taXBzOnJvb3QvZnN0YWIucmFuY2h1IFwKKyAgICBkZXZpY2UvZ2VuZXJpYy9nb2xkZmlzaC9mc3RhYi5yYW5jaHUuZWFybHkuYXJtOnJvb3QvZnN0YWIucmFuY2h1LmVhcmx5CiAKICQoY2FsbCBpbmhlcml0LXByb2R1Y3QsICQoU1JDX1RBUkdFVF9ESVIpL3Byb2R1Y3QvY29yZV82NF9iaXQubWspCiAkKGNhbGwgaW5oZXJpdC1wcm9kdWN0LCAkKFNSQ19UQVJHRVRfRElSKS9wcm9kdWN0L2Fvc3BfYmFzZV90ZWxlcGhvbnkubWspCmRpZmYgLS1naXQgYS90YXJnZXQvcHJvZHVjdC9hb3NwX3g4Ni5tayBiL3RhcmdldC9wcm9kdWN0L2Fvc3BfeDg2Lm1rCmluZGV4IDAzMjAzY2UuLjliYTk1MjMgMTAwNjQ0Ci0tLSBhL3RhcmdldC9wcm9kdWN0L2Fvc3BfeDg2Lm1rCisrKyBiL3RhcmdldC9wcm9kdWN0L2Fvc3BfeDg2Lm1rCkBAIC0xNCwxOCArMTQsMTUgQEAKICMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLVBST0RVQ1RfUFJPUEVSVFlfT1ZFUlJJREVTICs9IFwKLQlyaWxkLmxpYnBhdGg9L3ZlbmRvci9saWIvbGlicmVmZXJlbmNlLXJpbC5zbworLWluY2x1ZGUgZGV2aWNlL2dlbmVyaWMvZ29sZGZpc2gveDg2LXZlbmRvci5tawogCi0jIFRoaXMgaXMgYSBidWlsZCBjb25maWd1cmF0aW9uIGZvciBhIGZ1bGwtZmVhdHVyZWQgYnVpbGQgb2YgdGhlCi0jIE9wZW4tU291cmNlIHBhcnQgb2YgdGhlIHRyZWUuIEl0J3MgZ2VhcmVkIHRvd2FyZCBhIFVTLWNlbnRyaWMKLSMgYnVpbGQgcXVpdGUgc3BlY2lmaWNhbGx5IGZvciB0aGUgZW11bGF0b3IsIGFuZCBtaWdodCBub3QgYmUKLSMgZW50aXJlbHkgYXBwcm9wcmlhdGUgdG8gaW5oZXJpdCBmcm9tIGZvciBvbi1kZXZpY2UgY29uZmlndXJhdGlvbnMuCi1QUk9EVUNUX0NPUFlfRklMRVMgKz0gXAotICAgIGRldmVsb3BtZW50L3N5cy1pbWcvYWR2YW5jZWRGZWF0dXJlcy5pbmk6YWR2YW5jZWRGZWF0dXJlcy5pbmkgXAotICAgIGRldmljZS9nZW5lcmljL2dvbGRmaXNoL2RhdGEvZXRjL2VuY3J5cHRpb25rZXkuaW1nOmVuY3J5cHRpb25rZXkuaW1nIFwKLSAgICBwcmVidWlsdHMvcWVtdS1rZXJuZWwveDg2LzMuMTgva2VybmVsLXFlbXUyOmtlcm5lbC1yYW5jaHUKKyMgVE9ETyhiLzc4MzA4NTU5KTogaW5jbHVkZXMgdnJfaHdjIGludG8gR1NJIGJlZm9yZSB2cl9od2MgbW92ZSB0byB2ZW5kb3IKK1BST0RVQ1RfUEFDS0FHRVMgKz0gXAorICAgIHZyX2h3YwogCiBpbmNsdWRlICQoU1JDX1RBUkdFVF9ESVIpL3Byb2R1Y3QvZnVsbF94ODYubWsKIAorIyBOZWVkZWQgYnkgUGkgbmV3bHkgbGF1bmNoZWQgZGV2aWNlIHRvIHBhc3MgVnRzVHJlYmxlU3lzUHJvcCBvbiBHU0kKK1BST0RVQ1RfQ09NUEFUSUJMRV9QUk9QRVJUWV9PVkVSUklERSA6PSB0cnVlCisKIFBST0RVQ1RfTkFNRSA6PSBhb3NwX3g4NgpkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3QvYW9zcF94ODZfNjQubWsgYi90YXJnZXQvcHJvZHVjdC9hb3NwX3g4Nl82NC5tawppbmRleCA2OTNiZGFmLi43YWZjNzgyIDEwMDY0NAotLS0gYS90YXJnZXQvcHJvZHVjdC9hb3NwX3g4Nl82NC5taworKysgYi90YXJnZXQvcHJvZHVjdC9hb3NwX3g4Nl82NC5tawpAQCAtMTQsMjQgKzE0LDMyIEBACiAjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1QUk9EVUNUX1BST1BFUlRZX09WRVJSSURFUyArPSBcCi0JcmlsZC5saWJwYXRoPS92ZW5kb3IvbGliNjQvbGlicmVmZXJlbmNlLXJpbC5zbwotCiAjIFRoaXMgaXMgYSBidWlsZCBjb25maWd1cmF0aW9uIGZvciBhIGZ1bGwtZmVhdHVyZWQgYnVpbGQgb2YgdGhlCiAjIE9wZW4tU291cmNlIHBhcnQgb2YgdGhlIHRyZWUuIEl0J3MgZ2VhcmVkIHRvd2FyZCBhIFVTLWNlbnRyaWMKICMgYnVpbGQgcXVpdGUgc3BlY2lmaWNhbGx5IGZvciB0aGUgZW11bGF0b3IsIGFuZCBtaWdodCBub3QgYmUKICMgZW50aXJlbHkgYXBwcm9wcmlhdGUgdG8gaW5oZXJpdCBmcm9tIGZvciBvbi1kZXZpY2UgY29uZmlndXJhdGlvbnMuCiAKLVBST0RVQ1RfQ09QWV9GSUxFUyArPSBcCi0gICAgZGV2ZWxvcG1lbnQvc3lzLWltZy9hZHZhbmNlZEZlYXR1cmVzLmluaTphZHZhbmNlZEZlYXR1cmVzLmluaSBcCi0gICAgZGV2aWNlL2dlbmVyaWMvZ29sZGZpc2gvZGF0YS9ldGMvZW5jcnlwdGlvbmtleS5pbWc6ZW5jcnlwdGlvbmtleS5pbWcgXAotICAgIHByZWJ1aWx0cy9xZW11LWtlcm5lbC94ODZfNjQvMy4xOC9rZXJuZWwtcWVtdTI6a2VybmVsLXJhbmNodQorLWluY2x1ZGUgZGV2aWNlL2dlbmVyaWMvZ29sZGZpc2gveDg2XzY0LXZlbmRvci5tawogCisjIENvcHkgZGlmZmVyZW50IHp5Z290ZSBzZXR0aW5ncyBmb3IgdmVuZG9yLmltZyB0byBzZWxlY3QgYnkgc2V0dGluZyBwcm9wZXJ0eQorIyByby56eWdvdGU9enlnb3RlNjRfMzIgb3Igcm8uenlnb3RlPXp5Z290ZTMyXzY0OgorIyAgIDEuIDY0LWJpdCBwcmltYXJ5LCAzMi1iaXQgc2Vjb25kYXJ5IE9SCisjICAgMi4gMzItYml0IHByaW1hcnksIDY0LWJpdCBzZWNvbmRhcnkKKyMgaW5pdC56eWdvdGU2NF8zMi5yYyBpcyBpbiB0aGUgY29yZV82NF9iaXQubWsgYmVsb3cKK1BST0RVQ1RfQ09QWV9GSUxFUyArPSBcCisgICAgc3lzdGVtL2NvcmUvcm9vdGRpci9pbml0Lnp5Z290ZTMyXzY0LnJjOnJvb3QvaW5pdC56eWdvdGUzMl82NC5yYworCisjIFRPRE8oYi83ODMwODU1OSk6IGluY2x1ZGVzIHZyX2h3YyBpbnRvIEdTSSBiZWZvcmUgdnJfaHdjIG1vdmUgdG8gdmVuZG9yCitQUk9EVUNUX1BBQ0tBR0VTICs9IFwKKyAgICB2cl9od2MKKworJChjYWxsIGluaGVyaXQtcHJvZHVjdCwgJChTUkNfVEFSR0VUX0RJUikvcHJvZHVjdC9lbXVsYXRvci5taykKICQoY2FsbCBpbmhlcml0LXByb2R1Y3QsICQoU1JDX1RBUkdFVF9ESVIpL3Byb2R1Y3QvY29yZV82NF9iaXQubWspCiAkKGNhbGwgaW5oZXJpdC1wcm9kdWN0LCAkKFNSQ19UQVJHRVRfRElSKS9wcm9kdWN0L2Fvc3BfYmFzZV90ZWxlcGhvbnkubWspCiAkKGNhbGwgaW5oZXJpdC1wcm9kdWN0LCAkKFNSQ19UQVJHRVRfRElSKS9ib2FyZC9nZW5lcmljX3g4Nl82NC9kZXZpY2UubWspCiAKLWluY2x1ZGUgJChTUkNfVEFSR0VUX0RJUikvcHJvZHVjdC9lbXVsYXRvci5taworIyBOZWVkZWQgYnkgUGkgbmV3bHkgbGF1bmNoZWQgZGV2aWNlIHRvIHBhc3MgVnRzVHJlYmxlU3lzUHJvcCBvbiBHU0kKK1BST0RVQ1RfQ09NUEFUSUJMRV9QUk9QRVJUWV9PVkVSUklERSA6PSB0cnVlCiAKIGlmZGVmIE5FVF9FVEgwX1NUQVJUT05CT09UCiAgIFBST0RVQ1RfUFJPUEVSVFlfT1ZFUlJJREVTICs9IG5ldC5ldGgwLnN0YXJ0b25ib290PTEKZGlmZiAtLWdpdCBhL3RhcmdldC9wcm9kdWN0L2Fvc3BfeDg2XzY0X2FiLm1rIGIvdGFyZ2V0L3Byb2R1Y3QvYW9zcF94ODZfNjRfYWIubWsKaW5kZXggNDU5MGRjNS4uMzUyNGRiYyAxMDA2NDQKLS0tIGEvdGFyZ2V0L3Byb2R1Y3QvYW9zcF94ODZfNjRfYWIubWsKKysrIGIvdGFyZ2V0L3Byb2R1Y3QvYW9zcF94ODZfNjRfYWIubWsKQEAgLTIxLDEyICsyMSw2IEBACiAKIGluY2x1ZGUgYnVpbGQvbWFrZS90YXJnZXQvcHJvZHVjdC90cmVibGVfY29tbW9uXzY0Lm1rCiAKLUFCX09UQV9VUERBVEVSIDo9IHRydWUKLUFCX09UQV9QQVJUSVRJT05TIDo9IHN5c3RlbQotUFJPRFVDVF9QQUNLQUdFUyArPSBcCi0gICAgdXBkYXRlX2VuZ2luZSBcCi0gICAgdXBkYXRlX3ZlcmlmaWVyCi0KIFBST0RVQ1RfTkFNRSA6PSBhb3NwX3g4Nl82NF9hYgogUFJPRFVDVF9ERVZJQ0UgOj0gZ2VuZXJpY194ODZfNjRfYWIKIFBST0RVQ1RfQlJBTkQgOj0gQW5kcm9pZApkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3QvYW9zcF94ODZfYWIubWsgYi90YXJnZXQvcHJvZHVjdC9hb3NwX3g4Nl9hYi5tawppbmRleCA0MDRhNGRhLi5lNzJiMzhkIDEwMDY0NAotLS0gYS90YXJnZXQvcHJvZHVjdC9hb3NwX3g4Nl9hYi5taworKysgYi90YXJnZXQvcHJvZHVjdC9hb3NwX3g4Nl9hYi5tawpAQCAtMjEsMTIgKzIxLDYgQEAKIAogaW5jbHVkZSBidWlsZC9tYWtlL3RhcmdldC9wcm9kdWN0L3RyZWJsZV9jb21tb25fMzIubWsKIAotQUJfT1RBX1VQREFURVIgOj0gdHJ1ZQotQUJfT1RBX1BBUlRJVElPTlMgOj0gc3lzdGVtCi1QUk9EVUNUX1BBQ0tBR0VTICs9IFwKLSAgICB1cGRhdGVfZW5naW5lIFwKLSAgICB1cGRhdGVfdmVyaWZpZXIKLQogUFJPRFVDVF9OQU1FIDo9IGFvc3BfeDg2X2FiCiBQUk9EVUNUX0RFVklDRSA6PSBnZW5lcmljX3g4Nl9hYgogUFJPRFVDVF9CUkFORCA6PSBBbmRyb2lkCmRpZmYgLS1naXQgYS90YXJnZXQvcHJvZHVjdC9iYXNlLm1rIGIvdGFyZ2V0L3Byb2R1Y3QvYmFzZS5tawppbmRleCA5ZTM4NjIzLi5iYzM3MTBjIDEwMDY0NAotLS0gYS90YXJnZXQvcHJvZHVjdC9iYXNlLm1rCisrKyBiL3RhcmdldC9wcm9kdWN0L2Jhc2UubWsKQEAgLTIzLDYgKzIzLDcgQEAKICAgICBhcHBvcHMgXAogICAgIGFtIFwKICAgICBhbmRyb2lkLnBvbGljeSBcCisgICAgYW5kcm9pZC50ZXN0LmJhc2UgXAogICAgIGFuZHJvaWQudGVzdC5tb2NrIFwKICAgICBhbmRyb2lkLnRlc3QucnVubmVyIFwKICAgICBhcHBfcHJvY2VzcyBcCkBAIC0zMSw2ICszMiw3IEBACiAgICAgYml0IFwKICAgICBibGtpZCBcCiAgICAgYm1nciBcCisgICAgYnBmbG9hZGVyIFwKICAgICBidWdyZXBvcnQgXAogICAgIGJ1Z3JlcG9ydHogXAogICAgIGNhbWVyYXNlcnZlciBcCkBAIC00NCw2ICs0Niw3IEBACiAgICAgaW1lIFwKICAgICBpbmNpZGVudGQgXAogICAgIGluY2lkZW50IFwKKyAgICBpbmNpZGVudF9oZWxwZXIgXAogICAgIGluY2lkZW50X3JlcG9ydCBcCiAgICAgaW5wdXQgXAogICAgIGphdmF4Lm9iZXggXApAQCAtNjAsNiArNjMsNyBAQAogICAgIGxpYmNhbWVyYTJuZGsgXAogICAgIGxpYmRsIFwKICAgICBsaWJkcm1jbGVhcmtleXBsdWdpbiBcCisgICAgbGliZHlucHJvYyBcCiAgICAgbGliY2xlYXJrZXljYXNwbHVnaW4gXAogICAgIGxpYmVmZmVjdHByb3h5IFwKICAgICBsaWJlZmZlY3RzIFwKQEAgLTExNCw2ICsxMTgsNyBAQAogICAgIG10cGQgXAogICAgIG5kYyBcCiAgICAgbmV0ZCBcCisgICAgcGVyZmV0dG8gXAogICAgIHBpbmcgXAogICAgIHBpbmc2IFwKICAgICBwbGF0Zm9ybS54bWwgXApAQCAtMTI5LDEzICsxMzQsMjggQEAKICAgICBzZXR0aW5ncyBcCiAgICAgc2dkaXNrIFwKICAgICBzbSBcCisgICAgc3RhdHNkIFwKICAgICBzdmMgXAogICAgIHRjIFwKICAgICB0ZWxlY29tIFwKKyAgICB0cmFjZWQgXAorICAgIHRyYWNlZF9wcm9iZXMgXAogICAgIHZkYyBcCiAgICAgdm9sZCBcCiAgICAgd20KIAorIyBBZGQgdGhlIGNvbXBhdGliaWxpdHkgbGlicmFyeSB0aGF0IGlzIG5lZWRlZCB3aGVuIG9yZy5hcGFjaGUuaHR0cC5sZWdhY3kKKyMgaXMgcmVtb3ZlZCBmcm9tIHRoZSBib290Y2xhc3NwYXRoLgoraWZlcSAoJChSRU1PVkVfT0FITF9GUk9NX0JDUCksdHJ1ZSkKK1BST0RVQ1RfUEFDS0FHRVMgKz0gZnJhbWV3b3JrLW9haGwtYmFja3dhcmQtY29tcGF0aWJpbGl0eQorZW5kaWYKKworIyBBZGQgdGhlIGNvbXBhdGliaWxpdHkgbGlicmFyeSB0aGF0IGlzIG5lZWRlZCB3aGVuIGFuZHJvaWQudGVzdC5iYXNlCisjIGlzIHJlbW92ZWQgZnJvbSB0aGUgYm9vdGNsYXNzcGF0aC4KK2lmZXEgKCQoUkVNT1ZFX0FUQl9GUk9NX0JDUCksdHJ1ZSkKK1BST0RVQ1RfUEFDS0FHRVMgKz0gZnJhbWV3b3JrLWF0Yi1iYWNrd2FyZC1jb21wYXRpYmlsaXR5CitlbmRpZgorCiAjIEVzc2VudGlhbCBIQUwgbW9kdWxlcwogUFJPRFVDVF9QQUNLQUdFUyArPSBcCiAgICAgYW5kcm9pZC5oYXJkd2FyZS5jYXNAMS4wLXNlcnZpY2UgXApAQCAtMTQ3LDggKzE2NywxMCBAQAogCiAjIFBhY2thZ2VzIGluY2x1ZGVkIG9ubHkgZm9yIGVuZyBvciB1c2VyZGVidWcgYnVpbGRzLCBwcmV2aW91c2x5IGRlYnVnIHRhZ2dlZAogUFJPRFVDVF9QQUNLQUdFU19ERUJVRyA6PSBcCisgICAgbG9ncGVyc2lzdC5zdGFydCBcCiAgICAgcGVyZnByb2ZkIFwKLSAgICBzcWxpdGUzCisgICAgc3FsaXRlMyBcCisgICAgc3RyYWNlCiAKIFBST0RVQ1RfQ09QWV9GSUxFUyA6PSAkKGNhbGwgYWRkLXRvLXByb2R1Y3QtY29weS1maWxlcy1pZi1leGlzdHMsXAogICAgIGZyYW1ld29ya3MvYmFzZS9jb25maWcvcHJlbG9hZGVkLWNsYXNzZXM6c3lzdGVtL2V0Yy9wcmVsb2FkZWQtY2xhc3NlcykKZGlmZiAtLWdpdCBhL3RhcmdldC9wcm9kdWN0L2NmaS1jb21tb24ubWsgYi90YXJnZXQvcHJvZHVjdC9jZmktY29tbW9uLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhNTNiYzEKLS0tIC9kZXYvbnVsbAorKysgYi90YXJnZXQvcHJvZHVjdC9jZmktY29tbW9uLm1rCkBAIC0wLDAgKzEsMzkgQEAKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKyMgVGhpcyBpcyBhIHNldCBvZiBjb21tb24gY29tcG9uZW50cyB0byBlbmFibGUgQ0ZJIGZvciAoYWNyb3NzCisjIGNvbXBhdGlibGUgcHJvZHVjdCBjb25maWdzKQorUFJPRFVDVF9DRklfSU5DTFVERV9QQVRIUyA6PSAgXAorICAgIGRldmljZS9nb29nbGUvY3V0dGxlZmlzaF9jb21tb24vZ3Vlc3QvbGlicy93cGFfc3VwcGxpY2FudF84X2xpYiBcCisgICAgZGV2aWNlL2dvb2dsZS93YWhvby93aWZpX29mZmxvYWQgXAorICAgIGV4dGVybmFsL3Rpbnl4bWwyIFwKKyAgICBleHRlcm5hbC93cGFfc3VwcGxpY2FudF84IFwKKyAgICBmcmFtZXdvcmtzL2F2L2NhbWVyYSBcCisgICAgZnJhbWV3b3Jrcy9hdi9tZWRpYSBcCisgICAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcyBcCisgICAgZnJhbWV3b3Jrcy9taW5pa2luIFwKKyAgICBoYXJkd2FyZS9icm9hZGNvbS93bGFuL2JjbWRoZC93cGFfc3VwcGxpY2FudF84X2xpYiBcCisgICAgaGFyZHdhcmUvaW50ZXJmYWNlcy9uZmMgXAorICAgIGhhcmR3YXJlL3Fjb20vd2xhbi9xY3djbi93cGFfc3VwcGxpY2FudF84X2xpYiBcCisgICAgaGFyd2FyZS9pbnRlcmZhY2VzL2tleW1hc3RlciBcCisgICAgc3lzdGVtL2J0IFwKKyAgICBzeXN0ZW0vY2hyZSBcCisgICAgc3lzdGVtL2NvcmUvbGlibmV0dXRpbHMgXAorICAgIHN5c3RlbS9jb3JlL2xpYnppcGFyY2hpdmUgXAorICAgIHN5c3RlbS9nYXRla2VlcGVyIFwKKyAgICBzeXN0ZW0va2V5bWFzdGVyIFwKKyAgICBzeXN0ZW0vbmZjIFwKKyAgICBzeXN0ZW0vc2VjdXJpdHkgXApkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3QvY29yZS5tayBiL3RhcmdldC9wcm9kdWN0L2NvcmUubWsKaW5kZXggYTJiMGYxYy4uYzcyYmIyZiAxMDA2NDQKLS0tIGEvdGFyZ2V0L3Byb2R1Y3QvY29yZS5taworKysgYi90YXJnZXQvcHJvZHVjdC9jb3JlLm1rCkBAIC00MiwyMSArNDIsMjQgQEAKICAgICBLZXlDaGFpbiBcCiAgICAgS2V5Z3VhcmQgXAogICAgIExhdGluSU1FIFwKLSAgICBMYXVuY2hlcjIgXAorICAgIExhdW5jaGVyM1F1aWNrU3RlcCBcCiAgICAgTWFuYWdlZFByb3Zpc2lvbmluZyBcCiAgICAgTXRwRG9jdW1lbnRzUHJvdmlkZXIgXAotICAgIFBpY29UdHMgXAogICAgIFBhY1Byb2Nlc3NvciBcCiAgICAgbGlicGFjIFwKICAgICBQcmludFNwb29sZXIgXAogICAgIFByaW50UmVjb21tZW5kYXRpb25TZXJ2aWNlIFwKICAgICBQcm94eUhhbmRsZXIgXAogICAgIFF1aWNrU2VhcmNoQm94IFwKKyAgICBTZWN1cmVFbGVtZW50IFwKICAgICBTZXR0aW5ncyBcCisgICAgU2V0dGluZ3NJbnRlbGxpZ2VuY2UgXAogICAgIFNoYXJlZFN0b3JhZ2VCYWNrdXAgXAorICAgIFNpbUFwcERpYWxvZyBcCiAgICAgU3RvcmFnZU1hbmFnZXIgXAogICAgIFRlbGVjb20gXAogICAgIFRlbGVTZXJ2aWNlIFwKKyAgICBUcmFjZXVyIFwKICAgICBWcG5EaWFsb2dzIFwKICAgICB2ciBcCiAgICAgTW1zU2VydmljZQpkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3QvY29yZV82NF9iaXRfb25seS5tayBiL3RhcmdldC9wcm9kdWN0L2NvcmVfNjRfYml0X29ubHkubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzJkMzBmNQotLS0gL2Rldi9udWxsCisrKyBiL3RhcmdldC9wcm9kdWN0L2NvcmVfNjRfYml0X29ubHkubWsKQEAgLTAsMCArMSwzMCBAQAorIworIyBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworIyBJbmhlcml0IGZyb20gdGhpcyBwcm9kdWN0IGZvciBkZXZpY2VzIHRoYXQgc3VwcG9ydCBvbmx5IDY0LWJpdCBhcHBzIHVzaW5nOgorIyAkKGNhbGwgaW5oZXJpdC1wcm9kdWN0LCAkKFNSQ19UQVJHRVRfRElSKS9wcm9kdWN0L2NvcmVfNjRfYml0X29ubHkubWspCisjIFRoZSBpbmhlcml0YW5jZSBmb3IgdGhpcyBtdXN0IGNvbWUgYmVmb3JlIHRoZSBpbmhlcml0YW5jZSBjaGFpbiB0aGF0IGxlYWRzCisjIHRvIGNvcmVfbWluaW1hbC5tay4KKworIyBDb3B5IHRoZSA2NC1iaXQgenlnb3RlIHN0YXJ0dXAgc2NyaXB0CitQUk9EVUNUX0NPUFlfRklMRVMgKz0gc3lzdGVtL2NvcmUvcm9vdGRpci9pbml0Lnp5Z290ZTY0LnJjOnJvb3QvaW5pdC56eWdvdGU2NC5yYworCisjIFNldCB0aGUgenlnb3RlIHByb3BlcnR5IHRvIHNlbGVjdCB0aGUgNjQtYml0IHNjcmlwdC4KKyMgVGhpcyBsaW5lIG11c3QgYmUgcGFyc2VkIGJlZm9yZSB0aGUgb25lIGluIGNvcmVfbWluaW1hbC5taworUFJPRFVDVF9ERUZBVUxUX1BST1BFUlRZX09WRVJSSURFUyArPSByby56eWdvdGU9enlnb3RlNjQKKworVEFSR0VUX1NVUFBPUlRTXzMyX0JJVF9BUFBTIDo9IGZhbHNlCitUQVJHRVRfU1VQUE9SVFNfNjRfQklUX0FQUFMgOj0gdHJ1ZQpkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3QvY29yZV9iYXNlLm1rIGIvdGFyZ2V0L3Byb2R1Y3QvY29yZV9iYXNlLm1rCmluZGV4IDE1MWU4ZGUuLjdkYzAwMTAgMTAwNjQ0Ci0tLSBhL3RhcmdldC9wcm9kdWN0L2NvcmVfYmFzZS5taworKysgYi90YXJnZXQvcHJvZHVjdC9jb3JlX2Jhc2UubWsKQEAgLTYyLDkgKzYyLDQgQEAKICAgICBtZG5zZCBcCiAgICAgcmVxdWVzdHN5bmMgXAogCi0jIFdpZmkgbW9kdWxlcwotUFJPRFVDVF9QQUNLQUdFUyArPSBcCi0gICAgd2lmaS1zZXJ2aWNlIFwKLSAgICB3aWZpY29uZCBcCi0KICQoY2FsbCBpbmhlcml0LXByb2R1Y3QsICQoU1JDX1RBUkdFVF9ESVIpL3Byb2R1Y3QvY29yZV9taW5pbWFsLm1rKQpkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3QvY29yZV9taW5pbWFsLm1rIGIvdGFyZ2V0L3Byb2R1Y3QvY29yZV9taW5pbWFsLm1rCmluZGV4IGFiNjVmNWIuLjg1NjQ2YzEgMTAwNjQ0Ci0tLSBhL3RhcmdldC9wcm9kdWN0L2NvcmVfbWluaW1hbC5taworKysgYi90YXJnZXQvcHJvZHVjdC9jb3JlX21pbmltYWwubWsKQEAgLTMzLDYgKzMzLDcgQEAKICAgICBIVE1MVmlld2VyIFwKICAgICBNZWRpYVByb3ZpZGVyIFwKICAgICBQYWNrYWdlSW5zdGFsbGVyIFwKKyAgICBTZWN1cmVFbGVtZW50IFwKICAgICBTZXR0aW5nc1Byb3ZpZGVyIFwKICAgICBTaGVsbCBcCiAgICAgU3RhdGVtZW50U2VydmljZSBcCkBAIC02MCw3ICs2MSw2IEBACiAgICAgaXB0YWJsZXMgXAogICAgIGdhdGVrZWVwZXJkIFwKICAgICBrZXlzdG9yZSBcCi0gICAga2V5c3RvcmUuZGVmYXVsdCBcCiAgICAgbGQuY29uZmlnLnR4dCBcCiAgICAgbGQubWMgXAogICAgIGxpYmFhdWRpbyBcCkBAIC03Nyw3ICs3Nyw3IEBACiAgICAgbGlid2Vidmlld2Nocm9taXVtX3BsYXRfc3VwcG9ydCBcCiAgICAgbGlid2lsaGVsbSBcCiAgICAgbG9nZCBcCi0gICAgbWFrZV9leHQ0ZnMgXAorICAgIG1rZTJmcyBcCiAgICAgZTJmc2NrIFwKICAgICByZXNpemUyZnMgXAogICAgIHR1bmUyZnMgXApAQCAtODYsNiArODYsNyBAQAogICAgIHRlbGVwaG9ueS1jb21tb24gXAogICAgIHVpYXV0b21hdG9yIFwKICAgICB1bmNyeXB0IFwKKyAgICB2bmRrX3NuYXBzaG90X3BhY2thZ2UgXAogICAgIHZvaXAtY29tbW9uIFwKICAgICB3ZWJ2aWV3IFwKICAgICB3ZWJ2aWV3X3p5Z290ZSBcCkBAIC0xMTAsMTYgKzExMSwyNiBAQAogIyBUaGUgb3JkZXIgb2YgUFJPRFVDVF9CT09UX0pBUlMgbWF0dGVycy4KIFBST0RVQ1RfQk9PVF9KQVJTIDo9IFwKICAgICAkKFRBUkdFVF9DT1JFX0pBUlMpIFwKLSAgICBsZWdhY3ktdGVzdCBcCiAgICAgZXh0IFwKICAgICBmcmFtZXdvcmsgXAogICAgIHRlbGVwaG9ueS1jb21tb24gXAogICAgIHZvaXAtY29tbW9uIFwKICAgICBpbXMtY29tbW9uIFwKLSAgICBvcmcuYXBhY2hlLmh0dHAubGVnYWN5LmJvb3QgXAogICAgIGFuZHJvaWQuaGlkbC5iYXNlLVYxLjAtamF2YSBcCiAgICAgYW5kcm9pZC5oaWRsLm1hbmFnZXItVjEuMC1qYXZhCiAKK2lmZXEgKCQoUkVNT1ZFX09BSExfRlJPTV9CQ1ApLHRydWUpCitQUk9EVUNUX0JPT1RfSkFSUyArPSBmcmFtZXdvcmstb2FobC1iYWNrd2FyZC1jb21wYXRpYmlsaXR5CitlbHNlCitQUk9EVUNUX0JPT1RfSkFSUyArPSBvcmcuYXBhY2hlLmh0dHAubGVnYWN5LmJvb3QKK2VuZGlmCisKK2lmZXEgKCQoUkVNT1ZFX0FUQl9GUk9NX0JDUCksdHJ1ZSkKK1BST0RVQ1RfQk9PVF9KQVJTICs9IGZyYW1ld29yay1hdGItYmFja3dhcmQtY29tcGF0aWJpbGl0eQorZWxzZQorUFJPRFVDVF9CT09UX0pBUlMgKz0gYW5kcm9pZC50ZXN0LmJhc2UKK2VuZGlmCisKICMgVGhlIG9yZGVyIG9mIFBST0RVQ1RfU1lTVEVNX1NFUlZFUl9KQVJTIG1hdHRlcnMuCiBQUk9EVUNUX1NZU1RFTV9TRVJWRVJfSkFSUyA6PSBcCiAgICAgc2VydmljZXMgXApAQCAtMTM1LDcgKzE0Niw3IEBACiAjIEFkb3B0YWJsZSBleHRlcm5hbCBzdG9yYWdlIHN1cHBvcnRzIGJvdGggZXh0NCBhbmQgZjJmcwogUFJPRFVDVF9QQUNLQUdFUyArPSBcCiAgICAgZTJmc2NrIFwKLSAgICBtYWtlX2V4dDRmcyBcCisgICAgbWtlMmZzIFwKICAgICBmc2NrLmYyZnMgXAogICAgIG1ha2VfZjJmcyBcCiAKQEAgLTE1Nyw5ICsxNjgsMTcgQEAKIAogIyBPbiB1c2VyZGVidWcgYnVpbGRzLCBjb2xsZWN0IG1vcmUgdG9tYnN0b25lcyBieSBkZWZhdWx0LgogaWZuZXEgKCwkKGZpbHRlciB1c2VyZGVidWcgZW5nLCQoVEFSR0VUX0JVSUxEX1ZBUklBTlQpKSkKLVBST0RVQ1RfREVGQVVMVF9QUk9QRVJUWV9PVkVSUklERVMgKz0gXAorUFJPRFVDVF9TWVNURU1fREVGQVVMVF9QUk9QRVJUSUVTICs9IFwKICAgICB0b21ic3RvbmVkLm1heF90b21ic3RvbmVfY291bnQ9NTAKIGVuZGlmCiAKK1BST0RVQ1RfREVGQVVMVF9QUk9QRVJUWV9PVkVSUklERVMgKz0gXAorICAgIHJvLmxvZ2Quc2l6ZS5zdGF0cz02NEsgXAorICAgIGxvZy50YWcuc3RhdHNfbG9nPUkKKwogJChjYWxsIGluaGVyaXQtcHJvZHVjdCwgJChTUkNfVEFSR0VUX0RJUikvcHJvZHVjdC9ydW50aW1lX2xpYmFydC5taykKICQoY2FsbCBpbmhlcml0LXByb2R1Y3QsICQoU1JDX1RBUkdFVF9ESVIpL3Byb2R1Y3QvYmFzZS5taykKKworIyBFbmFibGUgQ0ZJIGZvciBzZWN1cml0eS1zZW5zaXRpdmUgY29tcG9uZW50cworJChjYWxsIGluaGVyaXQtcHJvZHVjdCwgJChTUkNfVEFSR0VUX0RJUikvcHJvZHVjdC9jZmktY29tbW9uLm1rKQorJChjYWxsIGluaGVyaXQtcHJvZHVjdC1pZi1leGlzdHMsIHZlbmRvci9nb29nbGUvcHJvZHVjdHMvY2ZpLXZlbmRvci5taykKZGlmZiAtLWdpdCBhL3RhcmdldC9wcm9kdWN0L2NvcmVfdGlueS5tayBiL3RhcmdldC9wcm9kdWN0L2NvcmVfdGlueS5tawppbmRleCBlNDczNDEzLi40ZWY3YjQ4IDEwMDY0NAotLS0gYS90YXJnZXQvcHJvZHVjdC9jb3JlX3RpbnkubWsKKysrIGIvdGFyZ2V0L3Byb2R1Y3QvY29yZV90aW55Lm1rCkBAIC00MSw2ICs0MSw3IEBACiAgICAgRGVmYXVsdENvbnRhaW5lclNlcnZpY2UgXAogICAgIEV4dFNoYXJlZCBcCiAgICAgRXh0U2VydmljZXMgXAorICAgIFNlY3VyZUVsZW1lbnQgXAogICAgIFNldHRpbmdzUHJvdmlkZXIgXAogICAgIFNoZWxsIFwKICAgICBXYWxscGFwZXJCYWNrdXAgXApAQCAtNTksNyArNjAsNyBAQAogICAgIGlwdGFibGVzIFwKICAgICBnYXRla2VlcGVyZCBcCiAgICAga2V5c3RvcmUgXAotICAgIGtleXN0b3JlLmRlZmF1bHQgXAorICAgIGxkLmNvbmZpZy50eHQgXAogICAgIGxkLm1jIFwKICAgICBsaWJhYXVkaW8gXAogICAgIGxpYk9wZW5NQVhBTCBcCkBAIC03MSwxMSArNzIsMTAgQEAKICAgICBsaWJ3aWxoZWxtIFwKICAgICBsaWJkcm1mcmFtZXdvcmtfam5pIFwKICAgICBsaWJkcm1mcmFtZXdvcmsgXAotICAgIG1ha2VfZXh0NGZzIFwKKyAgICBta2UyZnMgXAogICAgIGUyZnNjayBcCiAgICAgcmVzaXplMmZzIFwKICAgICB0dW5lMmZzIFwKLSAgICBudWxsd2VidmlldyBcCiAgICAgc2NyZWVuY2FwIFwKICAgICBzZW5zb3JzZXJ2aWNlIFwKICAgICB1aWF1dG9tYXRvciBcCkBAIC05NiwxNyArOTYsMjYgQEAKICMgVGhlIG9yZGVyIG1hdHRlcnMKIFBST0RVQ1RfQk9PVF9KQVJTIDo9IFwKICAgICAkKFRBUkdFVF9DT1JFX0pBUlMpIFwKLSAgICBsZWdhY3ktdGVzdCBcCiAgICAgZXh0IFwKICAgICBmcmFtZXdvcmsgXAogICAgIHRlbGVwaG9ueS1jb21tb24gXAogICAgIHZvaXAtY29tbW9uIFwKICAgICBpbXMtY29tbW9uIFwKLSAgICBudWxsd2VidmlldyBcCi0gICAgb3JnLmFwYWNoZS5odHRwLmxlZ2FjeS5ib290IFwKICAgICBhbmRyb2lkLmhpZGwuYmFzZS1WMS4wLWphdmEgXAogICAgIGFuZHJvaWQuaGlkbC5tYW5hZ2VyLVYxLjAtamF2YQogCitpZmVxICgkKFJFTU9WRV9PQUhMX0ZST01fQkNQKSx0cnVlKQorUFJPRFVDVF9CT09UX0pBUlMgKz0gZnJhbWV3b3JrLW9haGwtYmFja3dhcmQtY29tcGF0aWJpbGl0eQorZWxzZQorUFJPRFVDVF9CT09UX0pBUlMgKz0gb3JnLmFwYWNoZS5odHRwLmxlZ2FjeS5ib290CitlbmRpZgorCitpZmVxICgkKFJFTU9WRV9BVEJfRlJPTV9CQ1ApLHRydWUpCitQUk9EVUNUX0JPT1RfSkFSUyArPSBmcmFtZXdvcmstYXRiLWJhY2t3YXJkLWNvbXBhdGliaWxpdHkKK2Vsc2UKK1BST0RVQ1RfQk9PVF9KQVJTICs9IGFuZHJvaWQudGVzdC5iYXNlCitlbmRpZgorCiAjIFRoZSBvcmRlciBvZiBQUk9EVUNUX1NZU1RFTV9TRVJWRVJfSkFSUyBtYXR0ZXJzLgogUFJPRFVDVF9TWVNURU1fU0VSVkVSX0pBUlMgOj0gXAogICAgIHNlcnZpY2VzIFwKZGlmZiAtLWdpdCBhL3RhcmdldC9wcm9kdWN0L2VtYmVkZGVkLm1rIGIvdGFyZ2V0L3Byb2R1Y3QvZW1iZWRkZWQubWsKaW5kZXggN2VmYTY4Ni4uNjljZjEwMiAxMDA2NDQKLS0tIGEvdGFyZ2V0L3Byb2R1Y3QvZW1iZWRkZWQubWsKKysrIGIvdGFyZ2V0L3Byb2R1Y3QvZW1iZWRkZWQubWsKQEAgLTIwLDEwICsyMCwxMyBAQAogUFJPRFVDVF9QQUNLQUdFUyArPSBcCiAgICAgYWRiIFwKICAgICBhZGJkIFwKLSAgICBhbmRyb2lkLmhhcmR3YXJlLmNvbmZpZ3N0b3JlQDEuMC1zZXJ2aWNlIFwKKyAgICB1c2JkIFwKKyAgICBhbmRyb2lkLmhhcmR3YXJlLmNvbmZpZ3N0b3JlQDEuMS1zZXJ2aWNlIFwKICAgICBhbmRyb2lkLmhpZGwuYWxsb2NhdG9yQDEuMC1zZXJ2aWNlIFwKICAgICBhbmRyb2lkLmhpZGwubWVtb3J5QDEuMC1pbXBsIFwKKyAgICBhbmRyb2lkLmhpZGwubWVtb3J5QDEuMC1pbXBsLnZlbmRvciBcCiAgICAgYXRyYWNlIFwKKyAgICBibGFua19zY3JlZW4gXAogICAgIGJvb3RhbmltYXRpb24gXAogICAgIGJvb3RzdGF0IFwKICAgICBjaGFyZ2VyIFwKQEAgLTQ4LDYgKzUxLDcgQEAKICAgICBsaWJiaW5kZXIgXAogICAgIGxpYmMgXAogICAgIGxpYmNfbWFsbG9jX2RlYnVnIFwKKyAgICBsaWJjX21hbGxvY19ob29rcyBcCiAgICAgbGliY3V0aWxzIFwKICAgICBsaWJkbCBcCiAgICAgbGliZ3VpIFwKQEAgLTY4LDcgKzcyLDYgQEAKICAgICBsaW5rZXIgXAogICAgIGxta2QgXAogICAgIGxvZ2NhdCBcCi0gICAgbG9nd3JhcHBlciBcCiAgICAgbHNoYWwgXAogICAgIHJlY292ZXJ5IFwKICAgICBzZXJ2aWNlIFwKQEAgLTgxLDI1ICs4NCwxOCBAQAogICAgIHR6ZGF0YWNoZWNrIFwKICAgICB2bmRzZXJ2aWNlIFwKICAgICB2bmRzZXJ2aWNlbWFuYWdlciBcCi0gICAgY29tcGF0aWJpbGl0eV9tYXRyaXgueG1sIFwKLSAgICBtYW5pZmVzdC54bWwgXAotICAgIHN5c3RlbV9tYW5pZmVzdC54bWwgXAotICAgIHN5c3RlbV9jb21wYXRpYmlsaXR5X21hdHJpeC54bWwgXAogCi0jIFNFTGludXggcGFja2FnZXMKKyMgVklOVEYgZGF0YQogUFJPRFVDVF9QQUNLQUdFUyArPSBcCi0gICAgbm9ucGxhdF9tYWNfcGVybWlzc2lvbnMueG1sIFwKLSAgICBub25wbGF0X3Byb3BlcnR5X2NvbnRleHRzIFwKLSAgICBub25wbGF0X3NlYXBwX2NvbnRleHRzIFwKLSAgICBub25wbGF0X3NlcnZpY2VfY29udGV4dHMgXAotICAgIG5vbnBsYXRfaHdzZXJ2aWNlX2NvbnRleHRzIFwKLSAgICBwbGF0X21hY19wZXJtaXNzaW9ucy54bWwgXAotICAgIHBsYXRfcHJvcGVydHlfY29udGV4dHMgXAotICAgIHBsYXRfc2VhcHBfY29udGV4dHMgXAotICAgIHBsYXRfc2VydmljZV9jb250ZXh0cyBcCi0gICAgcGxhdF9od3NlcnZpY2VfY29udGV4dHMgXAorICAgIGRldmljZV9jb21wYXRpYmlsaXR5X21hdHJpeC54bWwgXAorICAgIGRldmljZV9tYW5pZmVzdC54bWwgXAorICAgIGZyYW1ld29ya19tYW5pZmVzdC54bWwgXAorICAgIGZyYW1ld29ya19jb21wYXRpYmlsaXR5X21hdHJpeC54bWwgXAorCisjIFNFTGludXggcGFja2FnZXMgYXJlIGFkZGVkIGFzIGRlcGVuZGVuY2llcyBvZiB0aGUgc2VsaW51eF9wb2xpY3kKKyMgcGhvbnkgcGFja2FnZS4KK1BST0RVQ1RfUEFDS0FHRVMgKz0gXAogICAgIHNlbGludXhfcG9saWN5IFwKLSAgICB2bmRzZXJ2aWNlX2NvbnRleHRzCiAKICMgQUlEIEdlbmVyYXRpb24gZm9yCiAjIDxwd2QuaD4gYW5kIDxncnAuaD4KQEAgLTEwOSw5ICsxMDUsMTQgQEAKICAgICBmc19jb25maWdfZmlsZXMgXAogICAgIGZzX2NvbmZpZ19kaXJzCiAKKyMgSWYgdGhlcmUgYXJlIHByb2R1Y3Qtc3BlY2lmaWMgYWRiIGtleXMgZGVmaW5lZCwgaW5zdGFsbCB0aGVtIG9uIGRlYnVnZ2FibGUKKyMgYnVpbGRzLgorUFJPRFVDVF9QQUNLQUdFU19ERUJVRyArPSBcCisgICAgYWRiX2tleXMKKwogIyBFbnN1cmUgdGhhdCB0aGlzIHByb3BlcnR5IGlzIGFsd2F5cyBkZWZpbmVkIHNvIHRoYXQgYmlvbmljX3N5c3RyYWNlLmNwcAogIyBjYW4gcmVseSBvbiBpdCBiZWluZyBpbml0aWFsbHkgc2V0IGJ5IGluaXQuCi1QUk9EVUNUX0RFRkFVTFRfUFJPUEVSVFlfT1ZFUlJJREVTICs9IFwKK1BST0RVQ1RfU1lTVEVNX0RFRkFVTFRfUFJPUEVSVElFUyArPSBcCiAgICAgZGVidWcuYXRyYWNlLnRhZ3MuZW5hYmxlZmxhZ3M9MAogCiBQUk9EVUNUX0NPUFlfRklMRVMgKz0gXApkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3QvZW1wdHktcHJlbG9hZGVkLWNsYXNzZXMgYi90YXJnZXQvcHJvZHVjdC9lbXB0eS1wcmVsb2FkZWQtY2xhc3NlcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMmZmMWU5Ci0tLSAvZGV2L251bGwKKysrIGIvdGFyZ2V0L3Byb2R1Y3QvZW1wdHktcHJlbG9hZGVkLWNsYXNzZXMKQEAgLTAsMCArMSBAQAorIyBFbXB0eSBwcmVsb2FkZWQtY2xhc3NlcyBmaWxlIGZvciBhdXRvbWF0ZWQgdGVzdGluZy4KZGlmZiAtLWdpdCBhL3RhcmdldC9wcm9kdWN0L2VtcHR5LXByb2ZpbGUgYi90YXJnZXQvcHJvZHVjdC9lbXB0eS1wcm9maWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyZmYxZTkKLS0tIC9kZXYvbnVsbAorKysgYi90YXJnZXQvcHJvZHVjdC9lbXB0eS1wcm9maWxlCkBAIC0wLDAgKzEgQEAKKyMgRW1wdHkgcHJlbG9hZGVkLWNsYXNzZXMgZmlsZSBmb3IgYXV0b21hdGVkIHRlc3RpbmcuCmRpZmYgLS1naXQgYS90YXJnZXQvcHJvZHVjdC9lbXVsYXRvci5tayBiL3RhcmdldC9wcm9kdWN0L2VtdWxhdG9yLm1rCmluZGV4IDBlMWU1ODEuLmY2ZTEwMTEgMTAwNjQ0Ci0tLSBhL3RhcmdldC9wcm9kdWN0L2VtdWxhdG9yLm1rCisrKyBiL3RhcmdldC9wcm9kdWN0L2VtdWxhdG9yLm1rCkBAIC0xOCwxMzYgKzE4LDQ5IEBACiAjIGVtdWxhdG9yLXJlbGF0ZWQgbW9kdWxlcyB0byBQUk9EVUNUX1BBQ0tBR0VTLgogIwogCi0jIEhvc3QgbW9kdWxlcwotUFJPRFVDVF9QQUNLQUdFUyArPSBcCi0KLQogIyBEZXZpY2UgbW9kdWxlcwogUFJPRFVDVF9QQUNLQUdFUyArPSBcCi0gICAgZWdsLmNmZyBcCi0gICAgZ3JhbGxvYy5nb2xkZmlzaCBcCi0gICAgZ3JhbGxvYy5yYW5jaHUgXAotICAgIGxpYkdMRVN2MV9DTV9lbXVsYXRpb24gXAotICAgIGxpYl9yZW5kZXJDb250cm9sX2VuYyBcCi0gICAgbGliRUdMX2VtdWxhdGlvbiBcCiAgICAgbGliR0xFU19hbmRyb2lkIFwKLSAgICBsaWJHTEVTdjJfZW5jIFwKLSAgICBsaWJPcGVuZ2xTeXN0ZW1Db21tb24gXAotICAgIGxpYkdMRVN2Ml9lbXVsYXRpb24gXAotICAgIGxpYkdMRVN2MV9lbmMgXAotICAgIHFlbXUtcHJvcHMgXAotICAgIGNhbWVyYS5nb2xkZmlzaCBcCi0gICAgY2FtZXJhLmdvbGRmaXNoLmpwZWcgXAotICAgIGNhbWVyYS5yYW5jaHUgXAotICAgIGNhbWVyYS5yYW5jaHUuanBlZyBcCi0gICAga2V5c3RvcmUuZ29sZGZpc2ggXAotICAgIGtleXN0b3JlLnJhbmNodSBcCi0gICAgZ2F0ZWtlZXBlci5yYW5jaHUgXAotICAgIGxpZ2h0cy5nb2xkZmlzaCBcCi0gICAgZ3BzLmdvbGRmaXNoIFwKLSAgICBncHMucmFuY2h1IFwKLSAgICBmaW5nZXJwcmludC5nb2xkZmlzaCBcCi0gICAgc2Vuc29ycy5nb2xkZmlzaCBcCi0gICAgYXVkaW8ucHJpbWFyeS5nb2xkZmlzaCBcCi0gICAgYXVkaW8ucHJpbWFyeS5nb2xkZmlzaF9sZWdhY3kgXAotICAgIGFuZHJvaWQuaGFyZHdhcmUuYXVkaW9AMi4wLXNlcnZpY2UgXAotICAgIHZpYnJhdG9yLmdvbGRmaXNoIFwKLSAgICBwb3dlci5nb2xkZmlzaCBcCi0gICAgcG93ZXIucmFuY2h1IFwKLSAgICBmaW5nZXJwcmludC5yYW5jaHUgXAotICAgIGFuZHJvaWQuaGFyZHdhcmUuYmlvbWV0cmljcy5maW5nZXJwcmludEAyLjEtc2VydmljZSBcCi0gICAgc2Vuc29ycy5yYW5jaHUgXAotICAgIGFuZHJvaWQuaGFyZHdhcmUuZ3JhcGhpY3MuY29tcG9zZXJAMi4xLWltcGwgXAotICAgIGFuZHJvaWQuaGFyZHdhcmUuZ3JhcGhpY3MuY29tcG9zZXJAMi4xLXNlcnZpY2UgXAotICAgIGFuZHJvaWQuaGFyZHdhcmUuZ3JhcGhpY3MuYWxsb2NhdG9yQDIuMC1zZXJ2aWNlIFwKLSAgICBhbmRyb2lkLmhhcmR3YXJlLmdyYXBoaWNzLmFsbG9jYXRvckAyLjAtaW1wbCBcCi0gICAgYW5kcm9pZC5oYXJkd2FyZS5ncmFwaGljcy5tYXBwZXJAMi4wLWltcGwgXAotICAgIGh3Y29tcG9zZXIuZ29sZGZpc2ggXAotICAgIGh3Y29tcG9zZXIucmFuY2h1IFwKLSAgICBzaF92ZW5kb3IgXAogICAgIHZpbnRmIFwKLSAgICB0b3lib3hfdmVuZG9yIFwKLSAgICBDYXJyaWVyQ29uZmlnCi0KLVBST0RVQ1RfUEFDS0FHRVMgKz0gXAotICAgIGFuZHJvaWQuaGFyZHdhcmUuYXVkaW9AMi4wLWltcGwgXAotICAgIGFuZHJvaWQuaGFyZHdhcmUuYXVkaW8uZWZmZWN0QDIuMC1pbXBsIFwKLSAgICBhbmRyb2lkLmhhcmR3YXJlLmJyb2FkY2FzdHJhZGlvQDEuMC1pbXBsIFwKLSAgICBhbmRyb2lkLmhhcmR3YXJlLnNvdW5kdHJpZ2dlckAyLjAtaW1wbAotCi1QUk9EVUNUX1BBQ0tBR0VTICs9IFwKLSAgICBhbmRyb2lkLmhhcmR3YXJlLmtleW1hc3RlckAzLjAtaW1wbCBcCi0gICAgYW5kcm9pZC5oYXJkd2FyZS5rZXltYXN0ZXJAMy4wLXNlcnZpY2UKLQotUFJPRFVDVF9QQUNLQUdFUyArPSBcCi0gICAgYW5kcm9pZC5oYXJkd2FyZS5nbnNzQDEuMC1zZXJ2aWNlIFwKLSAgICBhbmRyb2lkLmhhcmR3YXJlLmduc3NAMS4wLWltcGwKLQotUFJPRFVDVF9QQUNLQUdFUyArPSBcCi0gICAgYW5kcm9pZC5oYXJkd2FyZS5zZW5zb3JzQDEuMC1pbXBsIFwKLSAgICBhbmRyb2lkLmhhcmR3YXJlLnNlbnNvcnNAMS4wLXNlcnZpY2UKLQotUFJPRFVDVF9QQUNLQUdFUyArPSBcCi0gICAgYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4wLXNlcnZpY2UgXAotICAgIGFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMC1pbXBsCi0KLVBST0RVQ1RfUEFDS0FHRVMgKz0gXAotICAgIGFuZHJvaWQuaGFyZHdhcmUucG93ZXJAMS4wLXNlcnZpY2UgXAotICAgIGFuZHJvaWQuaGFyZHdhcmUucG93ZXJAMS4wLWltcGwKLQotUFJPRFVDVF9QQUNLQUdFUyArPSBcCi0gICAgY2FtZXJhLmRldmljZUAxLjAtaW1wbCBcCi0gICAgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEucHJvdmlkZXJAMi40LXNlcnZpY2UgXAotICAgIGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLnByb3ZpZGVyQDIuNC1pbXBsIFwKLQotUFJPRFVDVF9QQUNLQUdFUyArPSBcCi0gICAgYW5kcm9pZC5oYXJkd2FyZS5nYXRla2VlcGVyQDEuMC1pbXBsIFwKLSAgICBhbmRyb2lkLmhhcmR3YXJlLmdhdGVrZWVwZXJAMS4wLXNlcnZpY2UKKyAgICBDYXJyaWVyQ29uZmlnIFwKIAogIyBuZWVkIHRoaXMgZm9yIGdsZXMgbGlicmFyaWVzIHRvIGxvYWQgcHJvcGVybHkKICMgYWZ0ZXIgbW92aW5nIHRvIC92ZW5kb3IvbGliLwogUFJPRFVDVF9QQUNLQUdFUyArPSBcCi0gICAgYW5kcm9pZC5oYXJkd2FyZS5yZW5kZXJzY3JpcHRAMS4wLnZuZGstc3BcCi0gICAgYW5kcm9pZC5oYXJkd2FyZS5ncmFwaGljcy5hbGxvY2F0b3JAMi4wLnZuZGstc3BcCi0gICAgYW5kcm9pZC5oYXJkd2FyZS5ncmFwaGljcy5tYXBwZXJAMi4wLnZuZGstc3BcCi0gICAgYW5kcm9pZC5oYXJkd2FyZS5ncmFwaGljcy5jb21tb25AMS4wLnZuZGstc3BcCi0gICAgbGliaHdiaW5kZXIudm5kay1zcFwKLSAgICBsaWJiYXNlLnZuZGstc3BcCi0gICAgbGliY3V0aWxzLnZuZGstc3BcCi0gICAgbGliaGFyZHdhcmUudm5kay1zcFwKLSAgICBsaWJoaWRsYmFzZS52bmRrLXNwXAotICAgIGxpYmhpZGx0cmFuc3BvcnQudm5kay1zcFwKLSAgICBsaWJ1dGlscy52bmRrLXNwXAotICAgIGxpYmMrKy52bmRrLXNwXAotICAgIGxpYlJTX2ludGVybmFsLnZuZGstc3BcCi0gICAgbGliUlNEcml2ZXIudm5kay1zcFwKLSAgICBsaWJSU0NwdVJlZi52bmRrLXNwXAotICAgIGxpYmJjaW5mby52bmRrLXNwXAotICAgIGxpYmJsYXMudm5kay1zcFwKLSAgICBsaWJmdDIudm5kay1zcFwKLSAgICBsaWJwbmcudm5kay1zcFwKLSAgICBsaWJjb21waWxlcl9ydC52bmRrLXNwXAotICAgIGxpYmJhY2t0cmFjZS52bmRrLXNwXAotICAgIGxpYnVud2luZC52bmRrLXNwXAotICAgIGxpYmx6bWEudm5kay1zcFwKLSAgICBsaWJ6LnZuZGstc3BcCisgICAgdm5kay1zcAogCisjIFdpRmk6IHN5c3RlbSBzaWRlCitQUk9EVUNUX1BBQ0tBR0VTICs9IFwKKwlpcCBcCisJaXcgXAorCXdpZmljb25kIFwKIAotUFJPRFVDVF9DT1BZX0ZJTEVTICs9IFwKLSAgICBkZXZpY2UvZ2VuZXJpYy9nb2xkZmlzaC9pbml0LnJhbmNodS1jb3JlLnNoOnZlbmRvci9iaW4vaW5pdC5yYW5jaHUtY29yZS5zaCBcCi0gICAgZGV2aWNlL2dlbmVyaWMvZ29sZGZpc2gvaW5pdC5yYW5jaHUtbmV0LnNoOnZlbmRvci9iaW4vaW5pdC5yYW5jaHUtbmV0LnNoIFwKLSAgICBkZXZpY2UvZ2VuZXJpYy9nb2xkZmlzaC9pbml0LnJhbmNodS5yYzpyb290L2luaXQucmFuY2h1LnJjIFwKLSAgICBkZXZpY2UvZ2VuZXJpYy9nb2xkZmlzaC9mc3RhYi5yYW5jaHU6cm9vdC9mc3RhYi5yYW5jaHUgXAotICAgIGRldmljZS9nZW5lcmljL2dvbGRmaXNoL2ZzdGFiLnJhbmNodS5lYXJseTpyb290L2ZzdGFiLnJhbmNodS5lYXJseSBcCi0gICAgZGV2aWNlL2dlbmVyaWMvZ29sZGZpc2gvdWV2ZW50ZC5yYW5jaHUucmM6cm9vdC91ZXZlbnRkLnJhbmNodS5yYyBcCi0gICAgZGV2aWNlL2dlbmVyaWMvZ29sZGZpc2gvaW5wdXQvZ29sZGZpc2hfcm90YXJ5LmlkYzpzeXN0ZW0vdXNyL2lkYy9nb2xkZmlzaF9yb3RhcnkuaWRjIFwKLSAgICBkZXZpY2UvZ2VuZXJpYy9nb2xkZmlzaC9tYW5pZmVzdC54bWw6JChUQVJHRVRfQ09QWV9PVVRfVkVORE9SKS9tYW5pZmVzdC54bWwgXAotICAgIGRldmljZS9nZW5lcmljL2dvbGRmaXNoL2RhdGEvZXRjL3Blcm1pc3Npb25zL3ByaXZhcHAtcGVybWlzc2lvbnMtZ29sZGZpc2gueG1sOnN5c3RlbS9ldGMvcGVybWlzc2lvbnMvcHJpdmFwcC1wZXJtaXNzaW9ucy1nb2xkZmlzaC54bWwgXAotICAgIGRldmljZS9nZW5lcmljL2dvbGRmaXNoL2RhdGEvZXRjL2NvbmZpZy5pbmk6Y29uZmlnLmluaSBcCi0gICAgZnJhbWV3b3Jrcy9uYXRpdmUvZGF0YS9ldGMvYW5kcm9pZC5oYXJkd2FyZS51c2IuYWNjZXNzb3J5LnhtbDpzeXN0ZW0vZXRjL3Blcm1pc3Npb25zL2FuZHJvaWQuaGFyZHdhcmUudXNiLmFjY2Vzc29yeS54bWwKIAogUFJPRFVDVF9QQUNLQUdFX09WRVJMQVlTIDo9IGRldmljZS9nZW5lcmljL2dvbGRmaXNoL292ZXJsYXkKIAogUFJPRFVDVF9DSEFSQUNURVJJU1RJQ1MgOj0gZW11bGF0b3IKIAogUFJPRFVDVF9GVUxMX1RSRUJMRV9PVkVSUklERSA6PSB0cnVlCisKKyMgZ29sZGZpc2ggdmVuZG9yIHBhcnRpdGlvbiBjb25maWd1cmF0aW9ucworJChjYWxsIGluaGVyaXQtcHJvZHVjdC1pZi1leGlzdHMsIGRldmljZS9nZW5lcmljL2dvbGRmaXNoL3ZlbmRvci5taykKKworI3dhdGNoZG9nIHRpZ2dlcnMgcmVib290IGJlY2F1c2UgbG9jYXRpb24gc2VydmljZSBpcyBub3QKKyNyZXNwb25kaW5nLCBkaXNibGUgaXQgZm9yIG5vdy4KKyNzdGlsbCBrZWVwIGl0IG9uIGludGVybmFsIG1hc3RlciBhcyBpdCBpcyBzdGlsbCB3b3JraW5nCisjb25jZSBpdCBpcyBmaXhlZCBpbiBhb3NwLCByZW1vdmUgdGhpcyBibG9jayBvZiBjb21tZW50LgorI1BST0RVQ1RfREVGQVVMVF9QUk9QRVJUWV9PVkVSUklERVMgKz0gXAorI2NvbmZpZy5kaXNhYmxlX2xvY2F0aW9uPXRydWUKKworIyBFbmFibGUgUGVyZmV0dG8gdHJhY2VkCitQUk9EVUNUX1NZU1RFTV9ERUZBVUxUX1BST1BFUlRJRVMgKz0gXAorICAgIHBlcnNpc3QudHJhY2VkLmVuYWJsZT0xCisKKyMgZW5hYmxlIEdvb2dsZS1zcGVjaWZpYyBsb2NhdGlvbiBmZWF0dXJlcywKKyMgbGlrZSBOZXR3b3JrTG9jYXRpb25Qcm92aWRlciBhbmQgTG9jYXRpb25Db2xsZWN0b3IKK1BST0RVQ1RfU1lTVEVNX0RFRkFVTFRfUFJPUEVSVElFUyArPSBcCisgICAgcm8uY29tLmdvb2dsZS5sb2NhdGlvbmZlYXR1cmVzPTEKKworIyBkaXNhYmxlIHNldHVwd2l6YXJkCitQUk9EVUNUX1NZU1RFTV9ERUZBVUxUX1BST1BFUlRJRVMgKz0gXAorICAgIHJvLnNldHVwd2l6YXJkLm1vZGU9RElTQUJMRUQKZGlmZiAtLWdpdCBhL3RhcmdldC9wcm9kdWN0L2Z1bGwubWsgYi90YXJnZXQvcHJvZHVjdC9mdWxsLm1rCmluZGV4IGI2NmFlOTIuLjdjMDU3OGMgMTAwNjQ0Ci0tLSBhL3RhcmdldC9wcm9kdWN0L2Z1bGwubWsKKysrIGIvdGFyZ2V0L3Byb2R1Y3QvZnVsbC5tawpAQCAtMTksMTEgKzE5LDEwIEBACiAjIGJ1aWxkIHF1aXRlIHNwZWNpZmljYWxseSBmb3IgdGhlIGVtdWxhdG9yLCBhbmQgbWlnaHQgbm90IGJlCiAjIGVudGlyZWx5IGFwcHJvcHJpYXRlIHRvIGluaGVyaXQgZnJvbSBmb3Igb24tZGV2aWNlIGNvbmZpZ3VyYXRpb25zLgogCiskKGNhbGwgaW5oZXJpdC1wcm9kdWN0LCAkKFNSQ19UQVJHRVRfRElSKS9wcm9kdWN0L2VtdWxhdG9yLm1rKQogJChjYWxsIGluaGVyaXQtcHJvZHVjdCwgJChTUkNfVEFSR0VUX0RJUikvcHJvZHVjdC9hb3NwX2Jhc2VfdGVsZXBob255Lm1rKQogJChjYWxsIGluaGVyaXQtcHJvZHVjdCwgJChTUkNfVEFSR0VUX0RJUikvYm9hcmQvZ2VuZXJpYy9kZXZpY2UubWspCiAKLWluY2x1ZGUgJChTUkNfVEFSR0VUX0RJUikvcHJvZHVjdC9lbXVsYXRvci5tawotCiAjIE92ZXJyaWRlcwogUFJPRFVDVF9OQU1FIDo9IGZ1bGwKIFBST0RVQ1RfREVWSUNFIDo9IGdlbmVyaWMKZGlmZiAtLWdpdCBhL3RhcmdldC9wcm9kdWN0L2Z1bGxfYmFzZS5tayBiL3RhcmdldC9wcm9kdWN0L2Z1bGxfYmFzZS5tawppbmRleCA2NWJkZjBmLi5jMzkwZmZkIDEwMDY0NAotLS0gYS90YXJnZXQvcHJvZHVjdC9mdWxsX2Jhc2UubWsKKysrIGIvdGFyZ2V0L3Byb2R1Y3QvZnVsbF9iYXNlLm1rCkBAIC0yMSwxMCArMjEsNiBAQAogCiBQUk9EVUNUX1BBQ0tBR0VTIDo9IFwKICAgICBsaWJmd2Rsb2NrZW5naW5lIFwKLSAgICBPcGVuV25uIFwKLSAgICBsaWJXbm5FbmdEaWMgXAotICAgIGxpYldubkpwbkRpYyBcCi0gICAgbGlid25uZGljdCBcCiAgICAgV0FQUHVzaE1hbmFnZXIKIAogUFJPRFVDVF9QQUNLQUdFUyArPSBcCkBAIC0zNyw2ICszMywyMCBAQAogICAgIFBoYXNlQmVhbSBcCiAgICAgUGhvdG9UYWJsZQogCisjIEJsdWV0b290aDoKKyMgICBhdWRpby5hMmRwLmRlZmF1bHQgaXMgYSBzeXN0ZW0gbW9kdWxlLiBHZW5lcmljIHN5c3RlbSBpbWFnZSBpbmNsdWRlcworIyAgIGF1ZGlvLmEyZHAuZGVmYXVsdCB0byBzdXBwb3J0IEEyRFAgaWYgYm9hcmQgaGFzIHRoZSBjYXBhYmlsaXR5LgorUFJPRFVDVF9QQUNLQUdFUyArPSBcCisgICAgYXVkaW8uYTJkcC5kZWZhdWx0CisKKyMgTmV0OgorIyAgIFZlbmRvcnMgY2FuIHVzZSB0aGUgcGxhdGZvcm0tcHJvdmlkZWQgbmV0d29yayBjb25maWd1cmF0aW9uIHV0aWxpdGllcyAoaXAsCisjICAgaXB0YWJsZSwgZXRjLikgdG8gY29uZmlndXJlIHRoZSBMaW51eCBuZXR3b3JraW5nIHN0YWNrLCBidXQgdGhlc2UgdXRpbGl0aWVzCisjICAgZG8gbm90IHlldCBpbmNsdWRlIGEgSElETCBpbnRlcmZhY2Ugd3JhcHBlci4gVGhpcyBpcyBhIHNvbHV0aW9uIG9uCisjICAgQW5kcm9pZCBPLgorUFJPRFVDVF9QQUNLQUdFUyArPSBcCisgICAgbmV0dXRpbHMtd3JhcHBlci0xLjAKKwogIyBBZGRpdGlvbmFsIHNldHRpbmdzIHVzZWQgaW4gYWxsIEFPU1AgYnVpbGRzCiBQUk9EVUNUX1BST1BFUlRZX09WRVJSSURFUyA6PSBcCiAgICAgcm8uY29uZmlnLnJpbmd0b25lPVJpbmdfU3ludGhfMDQub2dnIFwKQEAgLTQ4LDExICs1OCwxMSBAQAogIyBHZXQgc29tZSBzb3VuZHMKICQoY2FsbCBpbmhlcml0LXByb2R1Y3QtaWYtZXhpc3RzLCBmcmFtZXdvcmtzL2Jhc2UvZGF0YS9zb3VuZHMvQWxsQXVkaW8ubWspCiAKLSMgR2V0IHRoZSBUVFMgbGFuZ3VhZ2UgcGFja3MKLSQoY2FsbCBpbmhlcml0LXByb2R1Y3QtaWYtZXhpc3RzLCBleHRlcm5hbC9zdm94L3BpY28vbGFuZy9hbGxfcGljb19sYW5ndWFnZXMubWspCi0KICMgR2V0IGEgbGlzdCBvZiBsYW5ndWFnZXMuCi0kKGNhbGwgaW5oZXJpdC1wcm9kdWN0LCAkKFNSQ19UQVJHRVRfRElSKS9wcm9kdWN0L2xvY2FsZXNfZnVsbC5taykKKyQoY2FsbCBpbmhlcml0LXByb2R1Y3QsICQoU1JDX1RBUkdFVF9ESVIpL3Byb2R1Y3QvbGFuZ3VhZ2VzX2Z1bGwubWspCiAKICMgR2V0IGV2ZXJ5dGhpbmcgZWxzZSBmcm9tIHRoZSBwYXJlbnQgcGFja2FnZQogJChjYWxsIGluaGVyaXQtcHJvZHVjdCwgJChTUkNfVEFSR0VUX0RJUikvcHJvZHVjdC9nZW5lcmljX25vX3RlbGVwaG9ueS5taykKKworIyBBZGQgYWRiIGtleXMgdG8gZGVidWdnYWJsZSBBT1NQIGJ1aWxkcyAoaWYgdGhleSBleGlzdCkKKyQoY2FsbCBpbmhlcml0LXByb2R1Y3QtaWYtZXhpc3RzLCB2ZW5kb3IvZ29vZ2xlL3NlY3VyaXR5L2FkYi92ZW5kb3Jfa2V5Lm1rKQpkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3QvZnVsbF9iYXNlX3RlbGVwaG9ueS5tayBiL3RhcmdldC9wcm9kdWN0L2Z1bGxfYmFzZV90ZWxlcGhvbnkubWsKaW5kZXggOWEyYzYzYS4uYWY0MDk3ZCAxMDA2NDQKLS0tIGEvdGFyZ2V0L3Byb2R1Y3QvZnVsbF9iYXNlX3RlbGVwaG9ueS5taworKysgYi90YXJnZXQvcHJvZHVjdC9mdWxsX2Jhc2VfdGVsZXBob255Lm1rCkBAIC0yNCw4ICsyNCw4IEBACiAgICAgcm8uY29tLmFuZHJvaWQuZGF0YXJvYW1pbmc9dHJ1ZQogCiBQUk9EVUNUX0NPUFlfRklMRVMgOj0gXAotICAgIGRldmljZS9nZW5lcmljL2dvbGRmaXNoL2RhdGEvZXRjL2FwbnMtY29uZi54bWw6c3lzdGVtL2V0Yy9hcG5zLWNvbmYueG1sIFwKLSAgICBmcmFtZXdvcmtzL25hdGl2ZS9kYXRhL2V0Yy9oYW5kaGVsZF9jb3JlX2hhcmR3YXJlLnhtbDpzeXN0ZW0vZXRjL3Blcm1pc3Npb25zL2hhbmRoZWxkX2NvcmVfaGFyZHdhcmUueG1sCisgICAgZGV2aWNlL3NhbXBsZS9ldGMvYXBucy1mdWxsLWNvbmYueG1sOnN5c3RlbS9ldGMvYXBucy1jb25mLnhtbCBcCisgICAgZnJhbWV3b3Jrcy9uYXRpdmUvZGF0YS9ldGMvaGFuZGhlbGRfY29yZV9oYXJkd2FyZS54bWw6JChUQVJHRVRfQ09QWV9PVVRfVkVORE9SKS9ldGMvcGVybWlzc2lvbnMvaGFuZGhlbGRfY29yZV9oYXJkd2FyZS54bWwKIAogJChjYWxsIGluaGVyaXQtcHJvZHVjdCwgJChTUkNfVEFSR0VUX0RJUikvcHJvZHVjdC9hb3NwX2Jhc2UubWspCiAkKGNhbGwgaW5oZXJpdC1wcm9kdWN0LCAkKFNSQ19UQVJHRVRfRElSKS9wcm9kdWN0L3RlbGVwaG9ueS5taykKZGlmZiAtLWdpdCBhL3RhcmdldC9wcm9kdWN0L2Z1bGxfeDg2Lm1rIGIvdGFyZ2V0L3Byb2R1Y3QvZnVsbF94ODYubWsKaW5kZXggNGRmZjcxMy4uNmVhMmQwNSAxMDA2NDQKLS0tIGEvdGFyZ2V0L3Byb2R1Y3QvZnVsbF94ODYubWsKKysrIGIvdGFyZ2V0L3Byb2R1Y3QvZnVsbF94ODYubWsKQEAgLTIzLDExICsyMywxMCBAQAogIyB0aGF0IGlzbid0IGEgd2lmaSBjb25uZWN0aW9uLiBUaGlzIHdpbGwgaW5zdHJ1Y3QgaW5pdC5yYyB0byBlbmFibGUgdGhlCiAjIG5ldHdvcmsgY29ubmVjdGlvbiBzbyB0aGF0IHlvdSBjYW4gdXNlIGl0IHdpdGggQURCCiAKKyQoY2FsbCBpbmhlcml0LXByb2R1Y3QsICQoU1JDX1RBUkdFVF9ESVIpL3Byb2R1Y3QvZW11bGF0b3IubWspCiAkKGNhbGwgaW5oZXJpdC1wcm9kdWN0LCAkKFNSQ19UQVJHRVRfRElSKS9wcm9kdWN0L2Fvc3BfYmFzZV90ZWxlcGhvbnkubWspCiAkKGNhbGwgaW5oZXJpdC1wcm9kdWN0LCAkKFNSQ19UQVJHRVRfRElSKS9ib2FyZC9nZW5lcmljX3g4Ni9kZXZpY2UubWspCiAKLWluY2x1ZGUgJChTUkNfVEFSR0VUX0RJUikvcHJvZHVjdC9lbXVsYXRvci5tawotCiBpZmRlZiBORVRfRVRIMF9TVEFSVE9OQk9PVAogICBQUk9EVUNUX1BST1BFUlRZX09WRVJSSURFUyArPSBuZXQuZXRoMC5zdGFydG9uYm9vdD0xCiBlbmRpZgpkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3QvZ2VuZXJpY19hcm12NS5tayBiL3RhcmdldC9wcm9kdWN0L2dlbmVyaWNfYXJtdjUubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhYTMyMWEuLjAwMDAwMDAKLS0tIGEvdGFyZ2V0L3Byb2R1Y3QvZ2VuZXJpY19hcm12NS5taworKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLSMKLSMgQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLSMgVGhpcyBpcyBhIGdlbmVyaWMgcHJvZHVjdCB0aGF0IGlzbid0IHNwZWNpYWxpemVkIGZvciBhIHNwZWNpZmljIGRldmljZS4KLSMgSXQgaW5jbHVkZXMgdGhlIGJhc2UgQW5kcm9pZCBwbGF0Zm9ybS4KLQotJChjYWxsIGluaGVyaXQtcHJvZHVjdCwgJChTUkNfVEFSR0VUX0RJUikvcHJvZHVjdC9nZW5lcmljLm1rKQotCi0jIE92ZXJyaWRlcwotUFJPRFVDVF9CUkFORCA6PSBnZW5lcmljX2FybXY1Ci1QUk9EVUNUX0RFVklDRSA6PSBnZW5lcmljX2FybXY1Ci1QUk9EVUNUX05BTUUgOj0gZ2VuZXJpY19hcm12NQpkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3QvZ2VuZXJpY19ub190ZWxlcGhvbnkubWsgYi90YXJnZXQvcHJvZHVjdC9nZW5lcmljX25vX3RlbGVwaG9ueS5tawppbmRleCAxOTBhODg5Li42YTg0YzM1IDEwMDY0NAotLS0gYS90YXJnZXQvcHJvZHVjdC9nZW5lcmljX25vX3RlbGVwaG9ueS5taworKysgYi90YXJnZXQvcHJvZHVjdC9nZW5lcmljX25vX3RlbGVwaG9ueS5tawpAQCAtMjksNiArMjksOSBAQAogICAgIFByb3Zpc2lvbiBcCiAgICAgU3lzdGVtVUkgXAogICAgIFN5c3VpRGFya1RoZW1lT3ZlcmxheSBcCisgICAgRGlzcGxheUN1dG91dEVtdWxhdGlvbkRvdWJsZU92ZXJsYXkgXAorICAgIERpc3BsYXlDdXRvdXRFbXVsYXRpb25Db3JuZXJPdmVybGF5IFwKKyAgICBEaXNwbGF5Q3V0b3V0RW11bGF0aW9uVGFsbE92ZXJsYXkgXAogICAgIEVhc3RlckVnZyBcCiAgICAgV2FsbHBhcGVyQ3JvcHBlcgogCmRpZmYgLS1naXQgYS90YXJnZXQvcHJvZHVjdC9nb19kZWZhdWx0c19jb21tb24ubWsgYi90YXJnZXQvcHJvZHVjdC9nb19kZWZhdWx0c19jb21tb24ubWsKaW5kZXggY2E1OGMxZC4uMTg5MDdjMSAxMDA2NDQKLS0tIGEvdGFyZ2V0L3Byb2R1Y3QvZ29fZGVmYXVsdHNfY29tbW9uLm1rCisrKyBiL3RhcmdldC9wcm9kdWN0L2dvX2RlZmF1bHRzX2NvbW1vbi5tawpAQCAtMjAsNyArMjAsMTAgQEAKIFBST0RVQ1RfUFJPUEVSVFlfT1ZFUlJJREVTICs9IFwKICAgICAgcm8uY29uZmlnLmxvd19yYW09dHJ1ZSBcCiAgICAgIHJvLmxtay5jcml0aWNhbF91cGdyYWRlPXRydWUgXAotICAgICByby5sbWsudXBncmFkZV9wcmVzc3VyZT00MAorICAgICByby5sbWsudXBncmFkZV9wcmVzc3VyZT00MCBcCisgICAgIHJvLmxtay5kb3duZ3JhZGVfcHJlc3N1cmU9NjAgXAorICAgICByby5sbWsua2lsbF9oZWF2aWVzdF90YXNrPWZhbHNlIFwKKyAgICAgcm8uc3RhdHNkLmVuYWJsZT1mYWxzZQogCiAjIHNldCB0aHJlc2hvbGQgdG8gZmlsdGVyIHVudXNlZCBhcHBzCiBQUk9EVUNUX1BST1BFUlRZX09WRVJSSURFUyArPSBcCmRpZmYgLS1naXQgYS90YXJnZXQvcHJvZHVjdC9sYW5ndWFnZXNfZnVsbC5tayBiL3RhcmdldC9wcm9kdWN0L2xhbmd1YWdlc19mdWxsLm1rCmluZGV4IDg0NmNkNzAuLjVmMzc5NWYgMTAwNjQ0Ci0tLSBhL3RhcmdldC9wcm9kdWN0L2xhbmd1YWdlc19mdWxsLm1rCisrKyBiL3RhcmdldC9wcm9kdWN0L2xhbmd1YWdlc19mdWxsLm1rCkBAIC0yMyw2ICsyMyw3IEBACiAgICAgICAgIGFtX0VUIFwKICAgICAgICAgYXJfRUcgXAogICAgICAgICBhcl9YQiBcCisgICAgICAgIGFzX0lOIFwKICAgICAgICAgYXpfQVogXAogICAgICAgICBiZV9CWSBcCiAgICAgICAgIGJnX0JHIFwKQEAgLTc2LDYgKzc3LDcgQEAKICAgICAgICAgbmJfTk8gXAogICAgICAgICBuZV9OUCBcCiAgICAgICAgIG5sX05MIFwKKyAgICAgICAgb3JfSU4gXAogICAgICAgICBwYV9JTiBcCiAgICAgICAgIHBsX1BMIFwKICAgICAgICAgcHRfQlIgXApkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3QvbG9jYWxlc19mdWxsLm1rIGIvdGFyZ2V0L3Byb2R1Y3QvbG9jYWxlc19mdWxsLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTkwZDJiLi4wMDAwMDAwCi0tLSBhL3RhcmdldC9wcm9kdWN0L2xvY2FsZXNfZnVsbC5taworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotUFJPRFVDVF9MT0NBTEVTIDo9IGVuX1VTIGNzX0NaIGRhX0RLIGRlX0FUIGRlX0NIIGRlX0RFIGRlX0xJIGVsX0dSIGVuX0FVIGVuX0NBIGVuX0dCIGVuX05aIGVuX1NHIGVvX0VVIGVzX0VTIGZyX0NBIGZyX0NIIGZyX0JFIGZyX0ZSIGl0X0NIIGl0X0lUIGphX0pQIGtvX0tSIG5iX05PIG5sX0JFIG5sX05MIHBsX1BMIHB0X1BUIHJ1X1JVIHN2X1NFIHRyX1RSIHpoX0NOIHpoX0hLIHpoX1RXIGFtX0VUIGhpX0lOCi0KLSQoY2FsbCBpbmhlcml0LXByb2R1Y3QsIGJ1aWxkL3RhcmdldC9wcm9kdWN0L2xhbmd1YWdlc19mdWxsLm1rKQpkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3QvcHJvZHVjdF9sYXVuY2hlZF93aXRoX2subWsgYi90YXJnZXQvcHJvZHVjdC9wcm9kdWN0X2xhdW5jaGVkX3dpdGhfay5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44N2ZhYTEyCi0tLSAvZGV2L251bGwKKysrIGIvdGFyZ2V0L3Byb2R1Y3QvcHJvZHVjdF9sYXVuY2hlZF93aXRoX2subWsKQEAgLTAsMCArMSwyIEBACisjUFJPRFVDVF9TSElQUElOR19BUElfTEVWRUwgaW5kaWNhdGVzIHRoZSBmaXJzdCBhcGkgbGV2ZWwsIGRldmljZSBoYXMgYmVlbiBjb21tZXJjaWFsbHkgbGF1bmNoZWQgb24uCitQUk9EVUNUX1NISVBQSU5HX0FQSV9MRVZFTCA6PSAxOQpkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3QvcHJvZHVjdF9sYXVuY2hlZF93aXRoX2wubWsgYi90YXJnZXQvcHJvZHVjdC9wcm9kdWN0X2xhdW5jaGVkX3dpdGhfbC5tawppbmRleCA4MTI3YmMzLi40ZTc5NzQ5IDEwMDY0NAotLS0gYS90YXJnZXQvcHJvZHVjdC9wcm9kdWN0X2xhdW5jaGVkX3dpdGhfbC5taworKysgYi90YXJnZXQvcHJvZHVjdC9wcm9kdWN0X2xhdW5jaGVkX3dpdGhfbC5tawpAQCAtMSwzICsxLDIgQEAKLSNQUk9EVUNUX1NISVBQSU5HX0FQSV9MRVZFTCBpbmRpY2F0ZXMgdGhlIGZpcnN0IGFwaSBsZXZlbCwgZGV2aWNlIGhhcyBiZWVuIGNvbW1lcmNpYWxseSBsYXVuY2VkIG9uLgorI1BST0RVQ1RfU0hJUFBJTkdfQVBJX0xFVkVMIGluZGljYXRlcyB0aGUgZmlyc3QgYXBpIGxldmVsLCBkZXZpY2UgaGFzIGJlZW4gY29tbWVyY2lhbGx5IGxhdW5jaGVkIG9uLgogUFJPRFVDVF9TSElQUElOR19BUElfTEVWRUwgOj0gMjEKLQpkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3QvcHJvZHVjdF9sYXVuY2hlZF93aXRoX2xfbXIxLm1rIGIvdGFyZ2V0L3Byb2R1Y3QvcHJvZHVjdF9sYXVuY2hlZF93aXRoX2xfbXIxLm1rCmluZGV4IDdhNWJkMGYuLjIwODY4MzIgMTAwNjQ0Ci0tLSBhL3RhcmdldC9wcm9kdWN0L3Byb2R1Y3RfbGF1bmNoZWRfd2l0aF9sX21yMS5taworKysgYi90YXJnZXQvcHJvZHVjdC9wcm9kdWN0X2xhdW5jaGVkX3dpdGhfbF9tcjEubWsKQEAgLTEsMiArMSwyIEBACi0jUFJPRFVDVF9TSElQUElOR19BUElfTEVWRUwgaW5kaWNhdGVzIHRoZSBmaXJzdCBhcGkgbGV2ZWwsIGRldmljZSBoYXMgYmVlbiBjb21tZXJjaWFsbHkgbGF1bmNlZCBvbi4KKyNQUk9EVUNUX1NISVBQSU5HX0FQSV9MRVZFTCBpbmRpY2F0ZXMgdGhlIGZpcnN0IGFwaSBsZXZlbCwgZGV2aWNlIGhhcyBiZWVuIGNvbW1lcmNpYWxseSBsYXVuY2hlZCBvbi4KIFBST0RVQ1RfU0hJUFBJTkdfQVBJX0xFVkVMIDo9IDIyCmRpZmYgLS1naXQgYS90YXJnZXQvcHJvZHVjdC9wcm9kdWN0X2xhdW5jaGVkX3dpdGhfbS5tayBiL3RhcmdldC9wcm9kdWN0L3Byb2R1Y3RfbGF1bmNoZWRfd2l0aF9tLm1rCmluZGV4IGFmZDg2NDcuLjFiYTEwMTQgMTAwNjQ0Ci0tLSBhL3RhcmdldC9wcm9kdWN0L3Byb2R1Y3RfbGF1bmNoZWRfd2l0aF9tLm1rCisrKyBiL3RhcmdldC9wcm9kdWN0L3Byb2R1Y3RfbGF1bmNoZWRfd2l0aF9tLm1rCkBAIC0xLDIgKzEsMiBAQAotI1BST0RVQ1RfU0hJUFBJTkdfQVBJX0xFVkVMIGluZGljYXRlcyB0aGUgZmlyc3QgYXBpIGxldmVsLCBkZXZpY2UgaGFzIGJlZW4gY29tbWVyY2lhbGx5IGxhdW5jZWQgb24uCisjUFJPRFVDVF9TSElQUElOR19BUElfTEVWRUwgaW5kaWNhdGVzIHRoZSBmaXJzdCBhcGkgbGV2ZWwsIGRldmljZSBoYXMgYmVlbiBjb21tZXJjaWFsbHkgbGF1bmNoZWQgb24uCiBQUk9EVUNUX1NISVBQSU5HX0FQSV9MRVZFTCA6PSAyMwpkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3QvcHJvZHVjdF9sYXVuY2hlZF93aXRoX24ubWsgYi90YXJnZXQvcHJvZHVjdC9wcm9kdWN0X2xhdW5jaGVkX3dpdGhfbi5tawppbmRleCBmN2M1ZDc5Li5jYWMyOWViIDEwMDY0NAotLS0gYS90YXJnZXQvcHJvZHVjdC9wcm9kdWN0X2xhdW5jaGVkX3dpdGhfbi5taworKysgYi90YXJnZXQvcHJvZHVjdC9wcm9kdWN0X2xhdW5jaGVkX3dpdGhfbi5tawpAQCAtMSwyICsxLDIgQEAKLSNQUk9EVUNUX1NISVBQSU5HX0FQSV9MRVZFTCBpbmRpY2F0ZXMgdGhlIGZpcnN0IGFwaSBsZXZlbCwgZGV2aWNlIGhhcyBiZWVuIGNvbW1lcmNpYWxseSBsYXVuY2VkIG9uLgorI1BST0RVQ1RfU0hJUFBJTkdfQVBJX0xFVkVMIGluZGljYXRlcyB0aGUgZmlyc3QgYXBpIGxldmVsLCBkZXZpY2UgaGFzIGJlZW4gY29tbWVyY2lhbGx5IGxhdW5jaGVkIG9uLgogUFJPRFVDVF9TSElQUElOR19BUElfTEVWRUwgOj0gMjQKZGlmZiAtLWdpdCBhL3RhcmdldC9wcm9kdWN0L3Byb2R1Y3RfbGF1bmNoZWRfd2l0aF9uX21yMS5tayBiL3RhcmdldC9wcm9kdWN0L3Byb2R1Y3RfbGF1bmNoZWRfd2l0aF9uX21yMS5tawppbmRleCA2NWQ0ZDNmLi4xOTRhMWFhIDEwMDY0NAotLS0gYS90YXJnZXQvcHJvZHVjdC9wcm9kdWN0X2xhdW5jaGVkX3dpdGhfbl9tcjEubWsKKysrIGIvdGFyZ2V0L3Byb2R1Y3QvcHJvZHVjdF9sYXVuY2hlZF93aXRoX25fbXIxLm1rCkBAIC0xLDIgKzEsMiBAQAotI1BST0RVQ1RfU0hJUFBJTkdfQVBJX0xFVkVMIGluZGljYXRlcyB0aGUgZmlyc3QgYXBpIGxldmVsLCBkZXZpY2UgaGFzIGJlZW4gY29tbWVyY2lhbGx5IGxhdW5jZWQgb24uCisjUFJPRFVDVF9TSElQUElOR19BUElfTEVWRUwgaW5kaWNhdGVzIHRoZSBmaXJzdCBhcGkgbGV2ZWwsIGRldmljZSBoYXMgYmVlbiBjb21tZXJjaWFsbHkgbGF1bmNoZWQgb24uCiBQUk9EVUNUX1NISVBQSU5HX0FQSV9MRVZFTCA6PSAyNQpkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3QvcHJvZHVjdF9sYXVuY2hlZF93aXRoX28ubWsgYi90YXJnZXQvcHJvZHVjdC9wcm9kdWN0X2xhdW5jaGVkX3dpdGhfby5tawppbmRleCA5NGQzMGM2Li44ZTI1YTJiIDEwMDY0NAotLS0gYS90YXJnZXQvcHJvZHVjdC9wcm9kdWN0X2xhdW5jaGVkX3dpdGhfby5taworKysgYi90YXJnZXQvcHJvZHVjdC9wcm9kdWN0X2xhdW5jaGVkX3dpdGhfby5tawpAQCAtMSwyICsxLDIgQEAKLSNQUk9EVUNUX1NISVBQSU5HX0FQSV9MRVZFTCBpbmRpY2F0ZXMgdGhlIGZpcnN0IGFwaSBsZXZlbCwgZGV2aWNlIGhhcyBiZWVuIGNvbW1lcmNpYWxseSBsYXVuY2VkIG9uLgorI1BST0RVQ1RfU0hJUFBJTkdfQVBJX0xFVkVMIGluZGljYXRlcyB0aGUgZmlyc3QgYXBpIGxldmVsLCBkZXZpY2UgaGFzIGJlZW4gY29tbWVyY2lhbGx5IGxhdW5jaGVkIG9uLgogUFJPRFVDVF9TSElQUElOR19BUElfTEVWRUwgOj0gMjYKZGlmZiAtLWdpdCBhL3RhcmdldC9wcm9kdWN0L3Byb2R1Y3RfbGF1bmNoZWRfd2l0aF9vX21yMS5tayBiL3RhcmdldC9wcm9kdWN0L3Byb2R1Y3RfbGF1bmNoZWRfd2l0aF9vX21yMS5tawppbmRleCAyNTYyMGFhLi4yZjNkN2U2IDEwMDY0NAotLS0gYS90YXJnZXQvcHJvZHVjdC9wcm9kdWN0X2xhdW5jaGVkX3dpdGhfb19tcjEubWsKKysrIGIvdGFyZ2V0L3Byb2R1Y3QvcHJvZHVjdF9sYXVuY2hlZF93aXRoX29fbXIxLm1rCkBAIC0xLDIgKzEsMiBAQAotI1BST0RVQ1RfU0hJUFBJTkdfQVBJX0xFVkVMIGluZGljYXRlcyB0aGUgZmlyc3QgYXBpIGxldmVsLCBkZXZpY2UgaGFzIGJlZW4gY29tbWVyY2lhbGx5IGxhdW5jZWQgb24uCisjUFJPRFVDVF9TSElQUElOR19BUElfTEVWRUwgaW5kaWNhdGVzIHRoZSBmaXJzdCBhcGkgbGV2ZWwsIGRldmljZSBoYXMgYmVlbiBjb21tZXJjaWFsbHkgbGF1bmNoZWQgb24uCiBQUk9EVUNUX1NISVBQSU5HX0FQSV9MRVZFTCA6PSAyNwpkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3QvcHJvZHVjdF9sYXVuY2hlZF93aXRoX3AubWsgYi90YXJnZXQvcHJvZHVjdC9wcm9kdWN0X2xhdW5jaGVkX3dpdGhfcC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTc1OTFmCi0tLSAvZGV2L251bGwKKysrIGIvdGFyZ2V0L3Byb2R1Y3QvcHJvZHVjdF9sYXVuY2hlZF93aXRoX3AubWsKQEAgLTAsMCArMSwyIEBACisjUFJPRFVDVF9TSElQUElOR19BUElfTEVWRUwgaW5kaWNhdGVzIHRoZSBmaXJzdCBhcGkgbGV2ZWwsIGRldmljZSBoYXMgYmVlbiBjb21tZXJjaWFsbHkgbGF1bmNoZWQgb24uCitQUk9EVUNUX1NISVBQSU5HX0FQSV9MRVZFTCA6PSAyOApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RhcmdldC9wcm9kdWN0L3Byb2ZpbGVfYm9vdF9jb21tb24ubWsgYi90YXJnZXQvcHJvZHVjdC9wcm9maWxlX2Jvb3RfY29tbW9uLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyNDM5MDIKLS0tIC9kZXYvbnVsbAorKysgYi90YXJnZXQvcHJvZHVjdC9wcm9maWxlX2Jvb3RfY29tbW9uLm1rCkBAIC0wLDAgKzEsNDUgQEAKKyMKKyMgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworIyBVc2UgYW4gZW1wdHkgcHJvZmlsZSB0byBtYWtlIG5vbiBvZiB0aGUgYm9vdCBpbWFnZSBiZSBBT1QgY29tcGlsZWQgKGZvciBub3cpLgorIyBOb3RlIHRoYXQgd2UgY291bGQgdXNlIGEgcHJldmlvdXMgcHJvZmlsZSBidXQgd2Ugd2lsbCBtaXNzIHRoZSBvcHBvcnR1bml0eSB0bworIyByZW1vdmUgY2xhc3NlcyB0aGF0IGFyZSBubyBsb25nZXIgaW4gdXNlLgorIyBJZGVhbGx5IHdlIHdvdWxkIGp1c3QgZ2VuZXJhdGUgYW4gZW1wdHkgYm9vdC5hcnQgYnV0IHdlIGRvbid0IGhhdmUgdGhlIGJ1aWxkCisjIHN1cHBvcnQgdG8gc2VwYXJhdGUgdGhlIGltYWdlIGZyb20gdGhlIGNvbXBpbGUgY29kZS4KK1BST0RVQ1RfREVYX1BSRU9QVF9CT09UX0lNQUdFX1BST0ZJTEVfTE9DQVRJT04gOj0gYnVpbGQvdGFyZ2V0L3Byb2R1Y3QvZW1wdHktcHJvZmlsZQorUFJPRFVDVF9ERVhfUFJFT1BUX0JPT1RfRkxBR1MgOj0gLS1jb3VudC1ob3RuZXNzLWluLWNvbXBpbGVkLWNvZGUKK0RFWF9QUkVPUFRfREVGQVVMVCA6PSBub3N0cmlwcGluZworCisjIERpc2FibGUgdW5jb21wcmVzc2luZyBwcml2IGFwcHMgc28gdGhhdCB0aGVyZSBpcyBlbm91Z2ggc3BhY2UgdG8gYnVpbGQgdGhlIHN5c3RlbSBwYXJ0aXRpb24uCitET05UX1VOQ09NUFJFU1NfUFJJVl9BUFBTX0RFWFMgOj0gdHJ1ZQorCisjIFVzZSBhbiBlbXB0eSBwcmVsb2FkZWQtY2xhc3NlcyBsaXN0LgorUFJPRFVDVF9DT1BZX0ZJTEVTICs9IFwKKyAgICBidWlsZC90YXJnZXQvcHJvZHVjdC9lbXB0eS1wcmVsb2FkZWQtY2xhc3NlczpzeXN0ZW0vZXRjL3ByZWxvYWRlZC1jbGFzc2VzCisKKyMgQm9vdCBpbWFnZSBwcm9wZXJ0eSBvdmVycmlkZXMuCitQUk9EVUNUX1BST1BFUlRZX09WRVJSSURFUyArPSBcCisgICAgZGFsdmlrLnZtLmppdGluaXRpYWxzaXplPTMybSBcCisgICAgZGFsdmlrLnZtLmppdG1heHNpemU9MzJtIFwKKyAgICBkYWx2aWsudm0udXNlaml0cHJvZmlsZXM9dHJ1ZSBcCisgICAgZGFsdmlrLnZtLmhvdC1zdGFydHVwLW1ldGhvZC1zYW1wbGVzPTI1NiBcCisgICAgZGFsdmlrLnZtLnByb2ZpbGVzeXN0ZW1zZXJ2ZXI9dHJ1ZSBcCisgICAgZGFsdmlrLnZtLnByb2ZpbGVib290aW1hZ2U9dHJ1ZQorCisjIFVzZSBzcGVlZCBjb21waWxlciBmaWx0ZXIgc2luY2Ugc3lzdGVtIHNlcnZlciBkb2Vzbid0IGhhdmUgSklULgorUFJPRFVDVF9ERVhfUFJFT1BUX0JPT1RfRkxBR1MgKz0gLS1jb21waWxlci1maWx0ZXI9c3BlZWQKKworUFJPRFVDVF9ESVNUX0JPT1RfQU5EX1NZU1RFTV9KQVJTIDo9IHRydWUKZGlmZiAtLWdpdCBhL3RhcmdldC9wcm9kdWN0L3J1bnRpbWVfbGliYXJ0Lm1rIGIvdGFyZ2V0L3Byb2R1Y3QvcnVudGltZV9saWJhcnQubWsKaW5kZXggOGFlZGVlNy4uYmRhNDUyNCAxMDA2NDQKLS0tIGEvdGFyZ2V0L3Byb2R1Y3QvcnVudGltZV9saWJhcnQubWsKKysrIGIvdGFyZ2V0L3Byb2R1Y3QvcnVudGltZV9saWJhcnQubWsKQEAgLTI3LDcgKzI3LDcgQEAKIAogIyBBZGRpdGlvbmFsIG1peGlucyB0byB0aGUgYm9vdCBjbGFzc3BhdGguCiBQUk9EVUNUX1BBQ0tBR0VTICs9IFwKLSAgICBsZWdhY3ktdGVzdCBcCisgICAgYW5kcm9pZC50ZXN0LmJhc2UgXAogCiAjIFdoeSBhcmUgd2UgcHVsbGluZyBpbiBleHQsIHdoaWNoIGlzIGZyYW1ld29ya3MvYmFzZSwgZGVwZW5kaW5nIG9uIHRhZ3NvdXAgYW5kIG5pc3Qtc2lwPwogUFJPRFVDVF9QQUNLQUdFUyArPSBcCkBAIC01NiwzMiArNTYsNDQgQEAKIFBST0RVQ1RfUEFDS0FHRVMgKz0gXAogICAgIGNhY2VydHMgXAogCi1QUk9EVUNUX0RFRkFVTFRfUFJPUEVSVFlfT1ZFUlJJREVTICs9IFwKK1BST0RVQ1RfUEFDS0FHRVMgKz0gXAorICAgIGhpZGRlbmFwaS1wYWNrYWdlLXdoaXRlbGlzdC54bWwgXAorCitQUk9EVUNUX1NZU1RFTV9ERUZBVUxUX1BST1BFUlRJRVMgKz0gXAogICAgIGRhbHZpay52bS5pbWFnZS1kZXgyb2F0LVhtcz02NG0gXAogICAgIGRhbHZpay52bS5pbWFnZS1kZXgyb2F0LVhteD02NG0gXAogICAgIGRhbHZpay52bS5kZXgyb2F0LVhtcz02NG0gXAogICAgIGRhbHZpay52bS5kZXgyb2F0LVhteD01MTJtIFwKLSAgICByby5kYWx2aWsudm0ubmF0aXZlLmJyaWRnZT0wIFwKICAgICBkYWx2aWsudm0udXNlaml0PXRydWUgXAogICAgIGRhbHZpay52bS51c2VqaXRwcm9maWxlcz10cnVlIFwKICAgICBkYWx2aWsudm0uZGV4b3B0LnNlY29uZGFyeT10cnVlIFwKICAgICBkYWx2aWsudm0uYXBwaW1hZ2Vmb3JtYXQ9bHo0CiAKK1BST0RVQ1RfUFJPUEVSVFlfT1ZFUlJJREVTICs9IFwKKyAgICByby5kYWx2aWsudm0ubmF0aXZlLmJyaWRnZT0wCisKICMgRGlmZmVyZW50IGRleG9wdCB0eXBlcyBmb3IgZGlmZmVyZW50IHBhY2thZ2UgdXBkYXRlL2luc3RhbGwgdGltZXMuCiAjIE9uIGVuZyBidWlsZHMsIG1ha2UgImJvb3QiIHJlYXNvbnMgb25seSBleHRyYWN0IGZvciBmYXN0ZXIgdHVybmFyb3VuZC4KIGlmZXEgKGVuZywkKFRBUkdFVF9CVUlMRF9WQVJJQU5UKSkKLSAgICBQUk9EVUNUX0RFRkFVTFRfUFJPUEVSVFlfT1ZFUlJJREVTICs9IFwKKyAgICBQUk9EVUNUX1NZU1RFTV9ERUZBVUxUX1BST1BFUlRJRVMgKz0gXAogICAgICAgICBwbS5kZXhvcHQuZmlyc3QtYm9vdD1leHRyYWN0IFwKICAgICAgICAgcG0uZGV4b3B0LmJvb3Q9ZXh0cmFjdAogZWxzZQotICAgIFBST0RVQ1RfREVGQVVMVF9QUk9QRVJUWV9PVkVSUklERVMgKz0gXAorICAgIFBST0RVQ1RfU1lTVEVNX0RFRkFVTFRfUFJPUEVSVElFUyArPSBcCiAgICAgICAgIHBtLmRleG9wdC5maXJzdC1ib290PXF1aWNrZW4gXAogICAgICAgICBwbS5kZXhvcHQuYm9vdD12ZXJpZnkKIGVuZGlmCiAKLVBST0RVQ1RfREVGQVVMVF9QUk9QRVJUWV9PVkVSUklERVMgKz0gXAotICAgIHBtLmRleG9wdC5pbnN0YWxsPXF1aWNrZW4gXAorIyBUaGUgaW5zdGFsbCBmaWx0ZXIgaXMgc3BlZWQtcHJvZmlsZSBpbiBvcmRlciB0byBlbmFibGUgdGhlIHVzZSBvZgorIyBwcm9maWxlcyBmcm9tIHRoZSBkZXggbWV0YWRhdGEgZmlsZXMuIE5vdGUgdGhhdCBpZiBhIHByb2ZpbGUgaXMgbm90IHByb3ZpZGVkCisjIG9yIGlmIGl0IGlzIGVtcHR5IHNwZWVkLXByb2ZpbGUgaXMgZXF1aXZhbGVudCB0byAocXVpY2tlbiArIGVtcHR5IGFwcCBpbWFnZSkuCitQUk9EVUNUX1NZU1RFTV9ERUZBVUxUX1BST1BFUlRJRVMgKz0gXAorICAgIHBtLmRleG9wdC5pbnN0YWxsPXNwZWVkLXByb2ZpbGUgXAogICAgIHBtLmRleG9wdC5iZy1kZXhvcHQ9c3BlZWQtcHJvZmlsZSBcCiAgICAgcG0uZGV4b3B0LmFiLW90YT1zcGVlZC1wcm9maWxlIFwKICAgICBwbS5kZXhvcHQuaW5hY3RpdmU9dmVyaWZ5IFwKICAgICBwbS5kZXhvcHQuc2hhcmVkPXNwZWVkCisKKyMgRW5hYmxlIG1pbmlkZWJ1Z2luZm8gZ2VuZXJhdGlvbiB1bmxlc3Mgb3ZlcnJpZGRlbi4KK1BST0RVQ1RfU1lTVEVNX0RFRkFVTFRfUFJPUEVSVElFUyArPSBcCisgICAgZGFsdmlrLnZtLmRleDJvYXQtbWluaWRlYnVnaW5mbz10cnVlCmRpZmYgLS1naXQgYS90YXJnZXQvcHJvZHVjdC9zZGtfYmFzZS5tayBiL3RhcmdldC9wcm9kdWN0L3Nka19iYXNlLm1rCmluZGV4IDZkNGQ1OWYuLjFlNWVkMTkgMTAwNjQ0Ci0tLSBhL3RhcmdldC9wcm9kdWN0L3Nka19iYXNlLm1rCisrKyBiL3RhcmdldC9wcm9kdWN0L3Nka19iYXNlLm1rCkBAIC0xNywzOCArMTcsMjkgQEAKIFBST0RVQ1RfUFJPUEVSVFlfT1ZFUlJJREVTIDo9CiAKIFBST0RVQ1RfUEFDS0FHRVMgOj0gXAotCUFwaURlbW9zIFwKIAlDZWxsQnJvYWRjYXN0UmVjZWl2ZXIgXAogCUN1YmVMaXZlV2FsbHBhcGVycyBcCiAJQ3VzdG9tTG9jYWxlIFwKIAlEZXZlbG9wbWVudCBcCiAJRGlhbGVyIFwKLQlFbXVsYXRvclNtb2tlVGVzdHMgXAogCUdhbGxlcnkyIFwKLQlHZXN0dXJlQnVpbGRlciBcCi0JTGF1bmNoZXIzIFwKKwlMYXVuY2hlcjNRdWlja1N0ZXAgXAogCUNhbWVyYTIgXAogCWxpYnJzX2puaSBcCi0JbGlid25uZGljdCBcCi0JbGliV25uRW5nRGljIFwKLQlsaWJXbm5KcG5EaWMgXAogCUxpdmVXYWxscGFwZXJzUGlja2VyIFwKIAlNbXMgXAogCU11c2ljIFwKLQlPcGVuV25uIFwKIAlQcm90aXBzIFwKIAlyaWxkIFwKIAlzY3JlZW5yZWNvcmQgXAogCVNka1NldHVwIFwKLQlTbW9rZVRlc3QgXAotCVNtb2tlVGVzdEFwcCBcCiAJU29mdEtleWJvYXJkIFwKIAlzcWxpdGUzIFwKIAlTeXN0ZW1VSSBcCiAJU3lzdWlEYXJrVGhlbWVPdmVybGF5IFwKIAlFYXN0ZXJFZ2cgXAogCVdhbGxwYXBlclBpY2tlciBcCi0JV2lkZ2V0UHJldmlldworCVdpZGdldFByZXZpZXcgXAogCiAjIERlZmluZSB0aGUgaG9zdCB0b29scyBhbmQgbGlicyB0aGF0IGFyZSBwYXJ0cyBvZiB0aGUgU0RLLgogLWluY2x1ZGUgc2RrL2J1aWxkL3Byb2R1Y3Rfc2RrLm1rCkBAIC05MSwxOSArODIsMjAgQEAKIAlmcmFtZXdvcmtzL2Jhc2UvZGF0YS9zb3VuZHMvZWZmZWN0cy9jYW1lcmFfY2xpY2sub2dnOnN5c3RlbS9tZWRpYS9hdWRpby91aS9jYW1lcmFfY2xpY2sub2dnIFwKIAlmcmFtZXdvcmtzL2Jhc2UvZGF0YS9zb3VuZHMvZWZmZWN0cy9WaWRlb1JlY29yZC5vZ2c6c3lzdGVtL21lZGlhL2F1ZGlvL3VpL1ZpZGVvUmVjb3JkLm9nZyBcCiAJZnJhbWV3b3Jrcy9iYXNlL2RhdGEvc291bmRzL2VmZmVjdHMvVmlkZW9TdG9wLm9nZzpzeXN0ZW0vbWVkaWEvYXVkaW8vdWkvVmlkZW9TdG9wLm9nZyBcCi0JZGV2aWNlL2dlbmVyaWMvZ29sZGZpc2gvZGF0YS9ldGMvaGFuZGhlbGRfY29yZV9oYXJkd2FyZS54bWw6c3lzdGVtL2V0Yy9wZXJtaXNzaW9ucy9oYW5kaGVsZF9jb3JlX2hhcmR3YXJlLnhtbCBcCi0JZGV2aWNlL2dlbmVyaWMvZ29sZGZpc2gvY2FtZXJhL21lZGlhX3Byb2ZpbGVzLnhtbDpzeXN0ZW0vZXRjL21lZGlhX3Byb2ZpbGVzLnhtbCBcCi0JZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9kYXRhL21lZGlhX2NvZGVjc19nb29nbGVfYXVkaW8ueG1sOnN5c3RlbS9ldGMvbWVkaWFfY29kZWNzX2dvb2dsZV9hdWRpby54bWwgXAotCWZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZGF0YS9tZWRpYV9jb2RlY3NfZ29vZ2xlX3RlbGVwaG9ueS54bWw6c3lzdGVtL2V0Yy9tZWRpYV9jb2RlY3NfZ29vZ2xlX3RlbGVwaG9ueS54bWwgXAotCWRldmljZS9nZW5lcmljL2dvbGRmaXNoL2NhbWVyYS9tZWRpYV9jb2RlY3NfZ29vZ2xlX3ZpZGVvLnhtbDpzeXN0ZW0vZXRjL21lZGlhX2NvZGVjc19nb29nbGVfdmlkZW8ueG1sIFwKLQlkZXZpY2UvZ2VuZXJpYy9nb2xkZmlzaC9jYW1lcmEvbWVkaWFfY29kZWNzLnhtbDpzeXN0ZW0vZXRjL21lZGlhX2NvZGVjcy54bWwgXAotCWRldmljZS9nZW5lcmljL2dvbGRmaXNoL2NhbWVyYS9tZWRpYV9jb2RlY3NfcGVyZm9ybWFuY2UueG1sOnN5c3RlbS9ldGMvbWVkaWFfY29kZWNzX3BlcmZvcm1hbmNlLnhtbCBcCi0JZnJhbWV3b3Jrcy9uYXRpdmUvZGF0YS9ldGMvYW5kcm9pZC5oYXJkd2FyZS50b3VjaHNjcmVlbi5tdWx0aXRvdWNoLmphenpoYW5kLnhtbDpzeXN0ZW0vZXRjL3Blcm1pc3Npb25zL2FuZHJvaWQuaGFyZHdhcmUudG91Y2hzY3JlZW4ubXVsdGl0b3VjaC5qYXp6aGFuZC54bWwgXAotCWZyYW1ld29ya3MvbmF0aXZlL2RhdGEvZXRjL2FuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLnhtbDpzeXN0ZW0vZXRjL3Blcm1pc3Npb25zL2FuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLnhtbCBcCi0JZnJhbWV3b3Jrcy9uYXRpdmUvZGF0YS9ldGMvYW5kcm9pZC5oYXJkd2FyZS5maW5nZXJwcmludC54bWw6c3lzdGVtL2V0Yy9wZXJtaXNzaW9ucy9hbmRyb2lkLmhhcmR3YXJlLmZpbmdlcnByaW50LnhtbCBcCi0JZnJhbWV3b3Jrcy9uYXRpdmUvZGF0YS9ldGMvYW5kcm9pZC5zb2Z0d2FyZS5hdXRvZmlsbC54bWw6c3lzdGVtL2V0Yy9wZXJtaXNzaW9ucy9hbmRyb2lkLnNvZnR3YXJlLmF1dG9maWxsLnhtbCBcCi0JZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJlZmZlY3RzL2RhdGEvYXVkaW9fZWZmZWN0cy5jb25mOnN5c3RlbS9ldGMvYXVkaW9fZWZmZWN0cy5jb25mIFwKLQlkZXZpY2UvZ2VuZXJpYy9nb2xkZmlzaC9hdWRpb19wb2xpY3kuY29uZjpzeXN0ZW0vZXRjL2F1ZGlvX3BvbGljeS5jb25mCisJZGV2aWNlL2dlbmVyaWMvZ29sZGZpc2gvZGF0YS9ldGMvaGFuZGhlbGRfY29yZV9oYXJkd2FyZS54bWw6JChUQVJHRVRfQ09QWV9PVVRfVkVORE9SKS9ldGMvcGVybWlzc2lvbnMvaGFuZGhlbGRfY29yZV9oYXJkd2FyZS54bWwgXAorCWRldmljZS9nZW5lcmljL2dvbGRmaXNoL2NhbWVyYS9tZWRpYV9wcm9maWxlcy54bWw6JChUQVJHRVRfQ09QWV9PVVRfVkVORE9SKS9ldGMvbWVkaWFfcHJvZmlsZXNfVjFfMC54bWwgXAorCWZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZGF0YS9tZWRpYV9jb2RlY3NfZ29vZ2xlX2F1ZGlvLnhtbDokKFRBUkdFVF9DT1BZX09VVF9WRU5ET1IpL2V0Yy9tZWRpYV9jb2RlY3NfZ29vZ2xlX2F1ZGlvLnhtbCBcCisJZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9kYXRhL21lZGlhX2NvZGVjc19nb29nbGVfdGVsZXBob255LnhtbDokKFRBUkdFVF9DT1BZX09VVF9WRU5ET1IpL2V0Yy9tZWRpYV9jb2RlY3NfZ29vZ2xlX3RlbGVwaG9ueS54bWwgXAorCWRldmljZS9nZW5lcmljL2dvbGRmaXNoL2NhbWVyYS9tZWRpYV9jb2RlY3NfZ29vZ2xlX3ZpZGVvLnhtbDokKFRBUkdFVF9DT1BZX09VVF9WRU5ET1IpL2V0Yy9tZWRpYV9jb2RlY3NfZ29vZ2xlX3ZpZGVvLnhtbCBcCisJZGV2aWNlL2dlbmVyaWMvZ29sZGZpc2gvY2FtZXJhL21lZGlhX2NvZGVjcy54bWw6JChUQVJHRVRfQ09QWV9PVVRfVkVORE9SKS9ldGMvbWVkaWFfY29kZWNzLnhtbCBcCisJZGV2aWNlL2dlbmVyaWMvZ29sZGZpc2gvY2FtZXJhL21lZGlhX2NvZGVjc19wZXJmb3JtYW5jZS54bWw6JChUQVJHRVRfQ09QWV9PVVRfVkVORE9SKS9ldGMvbWVkaWFfY29kZWNzX3BlcmZvcm1hbmNlLnhtbCBcCisJZnJhbWV3b3Jrcy9uYXRpdmUvZGF0YS9ldGMvYW5kcm9pZC5oYXJkd2FyZS50b3VjaHNjcmVlbi5tdWx0aXRvdWNoLmphenpoYW5kLnhtbDokKFRBUkdFVF9DT1BZX09VVF9WRU5ET1IpL2V0Yy9wZXJtaXNzaW9ucy9hbmRyb2lkLmhhcmR3YXJlLnRvdWNoc2NyZWVuLm11bHRpdG91Y2guamF6emhhbmQueG1sIFwKKwlmcmFtZXdvcmtzL25hdGl2ZS9kYXRhL2V0Yy9hbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5hdXRvZm9jdXMueG1sOiQoVEFSR0VUX0NPUFlfT1VUX1ZFTkRPUikvZXRjL3Blcm1pc3Npb25zL2FuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmF1dG9mb2N1cy54bWwgXAorCWZyYW1ld29ya3MvbmF0aXZlL2RhdGEvZXRjL2FuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmZ1bGwueG1sOiQoVEFSR0VUX0NPUFlfT1VUX1ZFTkRPUikvZXRjL3Blcm1pc3Npb25zL2FuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmZ1bGwueG1sIFwKKwlmcmFtZXdvcmtzL25hdGl2ZS9kYXRhL2V0Yy9hbmRyb2lkLmhhcmR3YXJlLmZpbmdlcnByaW50LnhtbDokKFRBUkdFVF9DT1BZX09VVF9WRU5ET1IpL2V0Yy9wZXJtaXNzaW9ucy9hbmRyb2lkLmhhcmR3YXJlLmZpbmdlcnByaW50LnhtbCBcCisJZnJhbWV3b3Jrcy9uYXRpdmUvZGF0YS9ldGMvYW5kcm9pZC5zb2Z0d2FyZS5hdXRvZmlsbC54bWw6JChUQVJHRVRfQ09QWV9PVVRfVkVORE9SKS9ldGMvcGVybWlzc2lvbnMvYW5kcm9pZC5zb2Z0d2FyZS5hdXRvZmlsbC54bWwgXAorCWZyYW1ld29ya3MvYXYvbWVkaWEvbGliZWZmZWN0cy9kYXRhL2F1ZGlvX2VmZmVjdHMuY29uZjokKFRBUkdFVF9DT1BZX09VVF9WRU5ET1IpL2V0Yy9hdWRpb19lZmZlY3RzLmNvbmYgXAorCWRldmljZS9nZW5lcmljL2dvbGRmaXNoL2F1ZGlvX3BvbGljeS5jb25mOiQoVEFSR0VUX0NPUFlfT1VUX1ZFTkRPUikvZXRjL2F1ZGlvX3BvbGljeS5jb25mCiAKIGluY2x1ZGUgJChTUkNfVEFSR0VUX0RJUikvcHJvZHVjdC9lbXVsYXRvci5tawogCkBAIC0xMTksMTQgKzExMSw2IEBACiAkKGNhbGwgaW5oZXJpdC1wcm9kdWN0LWlmLWV4aXN0cywgZnJhbWV3b3Jrcy93ZWJ2aWV3L2Nocm9taXVtL2Nocm9taXVtLm1rKQogJChjYWxsIGluaGVyaXQtcHJvZHVjdCwgJChTUkNfVEFSR0VUX0RJUikvcHJvZHVjdC9jb3JlLm1rKQogCi0jIGluY2x1ZGUgYXZhaWxhYmxlIGxhbmd1YWdlcyBmb3IgVFRTIGluIHRoZSBzeXN0ZW0gaW1hZ2UKLS1pbmNsdWRlIGV4dGVybmFsL3N2b3gvcGljby9sYW5nL1BpY29MYW5nRGVEZUluU3lzdGVtLm1rCi0taW5jbHVkZSBleHRlcm5hbC9zdm94L3BpY28vbGFuZy9QaWNvTGFuZ0VuR0JJblN5c3RlbS5tawotLWluY2x1ZGUgZXh0ZXJuYWwvc3ZveC9waWNvL2xhbmcvUGljb0xhbmdFblVzSW5TeXN0ZW0ubWsKLS1pbmNsdWRlIGV4dGVybmFsL3N2b3gvcGljby9sYW5nL1BpY29MYW5nRXNFc0luU3lzdGVtLm1rCi0taW5jbHVkZSBleHRlcm5hbC9zdm94L3BpY28vbGFuZy9QaWNvTGFuZ0ZyRnJJblN5c3RlbS5tawotLWluY2x1ZGUgZXh0ZXJuYWwvc3ZveC9waWNvL2xhbmcvUGljb0xhbmdJdEl0SW5TeXN0ZW0ubWsKLQogIyBsb2NhbGUuIGVuX1VTIGlzIGJvdGggZmlyc3QgYW5kIGluIGFscGhhYmV0aWNhbCBvcmRlciB0bwogIyBlbnN1cmUgdGhpcyBpcyB0aGUgZGVmYXVsdCBsb2NhbGUuCiBQUk9EVUNUX0xPQ0FMRVMgOj0gXApkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3Qvc2RrX3Bob25lX2FybTY0Lm1rIGIvdGFyZ2V0L3Byb2R1Y3Qvc2RrX3Bob25lX2FybTY0Lm1rCmluZGV4IDJhYTY4OGIuLmM2YjI5MGYgMTAwNjQ0Ci0tLSBhL3RhcmdldC9wcm9kdWN0L3Nka19waG9uZV9hcm02NC5taworKysgYi90YXJnZXQvcHJvZHVjdC9zZGtfcGhvbmVfYXJtNjQubWsKQEAgLTE0LDMyICsxNCwxMSBAQAogIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotUFJPRFVDVF9QUk9QRVJUWV9PVkVSUklERVMgKz0gXAotCXJpbGQubGlicGF0aD0vdmVuZG9yL2xpYjY0L2xpYnJlZmVyZW5jZS1yaWwuc28KKyQoY2FsbCBpbmhlcml0LXByb2R1Y3QsICQoU1JDX1RBUkdFVF9ESVIpL3Byb2R1Y3QvYW9zcF9hcm02NC5taykKIAotIyBUaGlzIGlzIGEgYnVpbGQgY29uZmlndXJhdGlvbiBmb3IgYSBmdWxsLWZlYXR1cmVkIGJ1aWxkIG9mIHRoZQotIyBPcGVuLVNvdXJjZSBwYXJ0IG9mIHRoZSB0cmVlLiBJdCdzIGdlYXJlZCB0b3dhcmQgYSBVUy1jZW50cmljCi0jIGJ1aWxkIHF1aXRlIHNwZWNpZmljYWxseSBmb3IgdGhlIGVtdWxhdG9yLCBhbmQgbWlnaHQgbm90IGJlCi0jIGVudGlyZWx5IGFwcHJvcHJpYXRlIHRvIGluaGVyaXQgZnJvbSBmb3Igb24tZGV2aWNlIGNvbmZpZ3VyYXRpb25zLgotCi0jIE5vdGU6IHRoZSBmb2xsb3dpbmcgbGluZXMgbmVlZCB0byBzdGF5IGF0IHRoZSBiZWdpbm5pbmcgc28gdGhhdCBpdCBjYW4KLSMgdGFrZSBwcmlvcml0eSAgYW5kIG92ZXJyaWRlIHRoZSBydWxlcyBpdCBpbmhlcml0IGZyb20gb3RoZXIgbWsgZmlsZXMKLSMgc2VlIGNvcHkgZmlsZSBydWxlcyBpbiBjb3JlL01ha2VmaWxlCi1QUk9EVUNUX0NPUFlfRklMRVMgKz0gXAotICAgIGRldmVsb3BtZW50L3N5cy1pbWcvYWR2YW5jZWRGZWF0dXJlcy5pbmkuYXJtOmFkdmFuY2VkRmVhdHVyZXMuaW5pIFwKLSAgICBwcmVidWlsdHMvcWVtdS1rZXJuZWwvYXJtNjQvMy4xOC9rZXJuZWwtcWVtdTI6a2VybmVsLXJhbmNodSBcCi0gICAgZGV2aWNlL2dlbmVyaWMvZ29sZGZpc2gvZnN0YWIucmFuY2h1LmFybTpyb290L2ZzdGFiLnJhbmNodSBcCi0gICAgZGV2aWNlL2dlbmVyaWMvZ29sZGZpc2gvZnN0YWIucmFuY2h1LmVhcmx5LmFybTpyb290L2ZzdGFiLnJhbmNodS5lYXJseQotCi0kKGNhbGwgaW5oZXJpdC1wcm9kdWN0LCAkKFNSQ19UQVJHRVRfRElSKS9wcm9kdWN0L2NvcmVfNjRfYml0Lm1rKQotJChjYWxsIGluaGVyaXQtcHJvZHVjdCwgJChTUkNfVEFSR0VUX0RJUikvcHJvZHVjdC9zZGtfYmFzZS5taykKLSQoY2FsbCBpbmhlcml0LXByb2R1Y3QsICQoU1JDX1RBUkdFVF9ESVIpL2JvYXJkL2dlbmVyaWNfYXJtNjQvZGV2aWNlLm1rKQotCi0jIEFPU1AgZW11bGF0b3IgaW1hZ2VzIGJ1aWxkIHRoZSBBT1NQIG1lc3NhZ2luZyBhcHAuCi0jIEdvb2dsZSBBUEkgaW1hZ2VzIG92ZXJyaWRlIHdpdGggdGhlIEdvb2dsZSBBUEkgYXBwLgotIyBTZWUgdmVuZG9yL2dvb2dsZS9wcm9kdWN0cy9zZGtfZ29vZ2xlX3Bob25lXyoubWsKLVBST0RVQ1RfUEFDS0FHRVMgKz0gXAotICAgIG1lc3NhZ2luZworIyBEZWZpbmUgdGhlIGhvc3QgdG9vbHMgYW5kIGxpYnMgdGhhdCBhcmUgcGFydHMgb2YgdGhlIFNESy4KKyQoY2FsbCBpbmhlcml0LXByb2R1Y3QsIHNkay9idWlsZC9wcm9kdWN0X3Nkay5taykKKyQoY2FsbCBpbmhlcml0LXByb2R1Y3QsIGRldmVsb3BtZW50L2J1aWxkL3Byb2R1Y3Rfc2RrLm1rKQogCiAjIE92ZXJyaWRlcwogUFJPRFVDVF9CUkFORCA6PSBBbmRyb2lkCmRpZmYgLS1naXQgYS90YXJnZXQvcHJvZHVjdC9zZGtfcGhvbmVfYXJtdjcubWsgYi90YXJnZXQvcHJvZHVjdC9zZGtfcGhvbmVfYXJtdjcubWsKaW5kZXggZTk5ZjBmNS4uZjJiNTFjZiAxMDA2NDQKLS0tIGEvdGFyZ2V0L3Byb2R1Y3Qvc2RrX3Bob25lX2FybXY3Lm1rCisrKyBiL3RhcmdldC9wcm9kdWN0L3Nka19waG9uZV9hcm12Ny5tawpAQCAtMTQsMjUgKzE0LDEyIEBACiAjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1QUk9EVUNUX1BST1BFUlRZX09WRVJSSURFUyArPSBcCi0JcmlsZC5saWJwYXRoPS92ZW5kb3IvbGliL2xpYnJlZmVyZW5jZS1yaWwuc28KKyQoY2FsbCBpbmhlcml0LXByb2R1Y3QsICQoU1JDX1RBUkdFVF9ESVIpL3Byb2R1Y3QvYW9zcF9hcm0ubWspCiAKLSMgTm90ZTogdGhlIGZvbGxvd2luZyBsaW5lcyBuZWVkIHRvIHN0YXkgYXQgdGhlIGJlZ2lubmluZyBzbyB0aGF0IGl0IGNhbgotIyB0YWtlIHByaW9yaXR5ICBhbmQgb3ZlcnJpZGUgdGhlIHJ1bGVzIGl0IGluaGVyaXQgZnJvbSBvdGhlciBtayBmaWxlcwotIyBzZWUgY29weSBmaWxlIHJ1bGVzIGluIGNvcmUvTWFrZWZpbGUKLVBST0RVQ1RfQ09QWV9GSUxFUyArPSBcCi0gICAgZGV2ZWxvcG1lbnQvc3lzLWltZy9hZHZhbmNlZEZlYXR1cmVzLmluaS5hcm06YWR2YW5jZWRGZWF0dXJlcy5pbmkgXAotICAgIHByZWJ1aWx0cy9xZW11LWtlcm5lbC9hcm0vMy4xOC9rZXJuZWwtcWVtdTI6a2VybmVsLXJhbmNodSBcCi0gICAgZGV2aWNlL2dlbmVyaWMvZ29sZGZpc2gvZnN0YWIucmFuY2h1LmFybTpyb290L2ZzdGFiLnJhbmNodSBcCi0gICAgZGV2aWNlL2dlbmVyaWMvZ29sZGZpc2gvZnN0YWIucmFuY2h1LmVhcmx5LmFybTpyb290L2ZzdGFiLnJhbmNodS5lYXJseQorIyBEZWZpbmUgdGhlIGhvc3QgdG9vbHMgYW5kIGxpYnMgdGhhdCBhcmUgcGFydHMgb2YgdGhlIFNESy4KKyQoY2FsbCBpbmhlcml0LXByb2R1Y3QsIHNkay9idWlsZC9wcm9kdWN0X3Nkay5taykKKyQoY2FsbCBpbmhlcml0LXByb2R1Y3QsIGRldmVsb3BtZW50L2J1aWxkL3Byb2R1Y3Rfc2RrLm1rKQogCi0kKGNhbGwgaW5oZXJpdC1wcm9kdWN0LCAkKFNSQ19UQVJHRVRfRElSKS9wcm9kdWN0L3Nka19iYXNlLm1rKQotCi0jIEFPU1AgZW11bGF0b3IgaW1hZ2VzIGJ1aWxkIHRoZSBBT1NQIG1lc3NhZ2luZyBhcHAuCi0jIEdvb2dsZSBBUEkgaW1hZ2VzIG92ZXJyaWRlIHdpdGggdGhlIEdvb2dsZSBBUEkgYXBwLgotIyBTZWUgdmVuZG9yL2dvb2dsZS9wcm9kdWN0cy9zZGtfZ29vZ2xlX3Bob25lXyoubWsKLVBST0RVQ1RfUEFDS0FHRVMgKz0gXAotICAgIG1lc3NhZ2luZwogCiAjIE92ZXJyaWRlcwogUFJPRFVDVF9CUkFORCA6PSBBbmRyb2lkCmRpZmYgLS1naXQgYS90YXJnZXQvcHJvZHVjdC9zZGtfcGhvbmVfeDg2Lm1rIGIvdGFyZ2V0L3Byb2R1Y3Qvc2RrX3Bob25lX3g4Ni5tawppbmRleCAxZTgyNzczLi5iMzRlNWI2IDEwMDY0NAotLS0gYS90YXJnZXQvcHJvZHVjdC9zZGtfcGhvbmVfeDg2Lm1rCisrKyBiL3RhcmdldC9wcm9kdWN0L3Nka19waG9uZV94ODYubWsKQEAgLTE0LDI1ICsxNCwxMSBAQAogIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotUFJPRFVDVF9QUk9QRVJUWV9PVkVSUklERVMgKz0gXAotCXJpbGQubGlicGF0aD0vdmVuZG9yL2xpYi9saWJyZWZlcmVuY2UtcmlsLnNvCiskKGNhbGwgaW5oZXJpdC1wcm9kdWN0LCAkKFNSQ19UQVJHRVRfRElSKS9wcm9kdWN0L2Fvc3BfeDg2Lm1rKQogCi0jIFRoaXMgaXMgYSBidWlsZCBjb25maWd1cmF0aW9uIGZvciBhIGZ1bGwtZmVhdHVyZWQgYnVpbGQgb2YgdGhlCi0jIE9wZW4tU291cmNlIHBhcnQgb2YgdGhlIHRyZWUuIEl0J3MgZ2VhcmVkIHRvd2FyZCBhIFVTLWNlbnRyaWMKLSMgYnVpbGQgcXVpdGUgc3BlY2lmaWNhbGx5IGZvciB0aGUgZW11bGF0b3IsIGFuZCBtaWdodCBub3QgYmUKLSMgZW50aXJlbHkgYXBwcm9wcmlhdGUgdG8gaW5oZXJpdCBmcm9tIGZvciBvbi1kZXZpY2UgY29uZmlndXJhdGlvbnMuCi1QUk9EVUNUX0NPUFlfRklMRVMgKz0gXAotICAgIGRldmVsb3BtZW50L3N5cy1pbWcvYWR2YW5jZWRGZWF0dXJlcy5pbmk6YWR2YW5jZWRGZWF0dXJlcy5pbmkgXAotICAgIGRldmljZS9nZW5lcmljL2dvbGRmaXNoL2RhdGEvZXRjL2VuY3J5cHRpb25rZXkuaW1nOmVuY3J5cHRpb25rZXkuaW1nIFwKLSAgICBwcmVidWlsdHMvcWVtdS1rZXJuZWwveDg2LzMuMTgva2VybmVsLXFlbXUyOmtlcm5lbC1yYW5jaHUKLQotJChjYWxsIGluaGVyaXQtcHJvZHVjdCwgJChTUkNfVEFSR0VUX0RJUikvcHJvZHVjdC9zZGtfYmFzZS5taykKLQotIyBBT1NQIGVtdWxhdG9yIGltYWdlcyBidWlsZCB0aGUgQU9TUCBtZXNzYWdpbmcgYXBwLgotIyBHb29nbGUgQVBJIGltYWdlcyBvdmVycmlkZSB3aXRoIHRoZSBHb29nbGUgQVBJIGFwcC4KLSMgU2VlIHZlbmRvci9nb29nbGUvcHJvZHVjdHMvc2RrX2dvb2dsZV9waG9uZV8qLm1rCi1QUk9EVUNUX1BBQ0tBR0VTICs9IFwKLSAgICBtZXNzYWdpbmcKKyMgRGVmaW5lIHRoZSBob3N0IHRvb2xzIGFuZCBsaWJzIHRoYXQgYXJlIHBhcnRzIG9mIHRoZSBTREsuCistaW5jbHVkZSBzZGsvYnVpbGQvcHJvZHVjdF9zZGsubWsKKy1pbmNsdWRlIGRldmVsb3BtZW50L2J1aWxkL3Byb2R1Y3Rfc2RrLm1rCiAKICMgT3ZlcnJpZGVzCiBQUk9EVUNUX0JSQU5EIDo9IEFuZHJvaWQKZGlmZiAtLWdpdCBhL3RhcmdldC9wcm9kdWN0L3Nka19waG9uZV94ODZfNjQubWsgYi90YXJnZXQvcHJvZHVjdC9zZGtfcGhvbmVfeDg2XzY0Lm1rCmluZGV4IGExOGM0ZjguLjM3YzA3OGUgMTAwNjQ0Ci0tLSBhL3RhcmdldC9wcm9kdWN0L3Nka19waG9uZV94ODZfNjQubWsKKysrIGIvdGFyZ2V0L3Byb2R1Y3Qvc2RrX3Bob25lX3g4Nl82NC5tawpAQCAtMTQsMjcgKzE0LDExIEBACiAjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1QUk9EVUNUX1BST1BFUlRZX09WRVJSSURFUyArPSBcCi0JcmlsZC5saWJwYXRoPS92ZW5kb3IvbGliNjQvbGlicmVmZXJlbmNlLXJpbC5zbworJChjYWxsIGluaGVyaXQtcHJvZHVjdCwgJChTUkNfVEFSR0VUX0RJUikvcHJvZHVjdC9hb3NwX3g4Nl82NC5taykKIAotIyBUaGlzIGlzIGEgYnVpbGQgY29uZmlndXJhdGlvbiBmb3IgYSBmdWxsLWZlYXR1cmVkIGJ1aWxkIG9mIHRoZQotIyBPcGVuLVNvdXJjZSBwYXJ0IG9mIHRoZSB0cmVlLiBJdCdzIGdlYXJlZCB0b3dhcmQgYSBVUy1jZW50cmljCi0jIGJ1aWxkIHF1aXRlIHNwZWNpZmljYWxseSBmb3IgdGhlIGVtdWxhdG9yLCBhbmQgbWlnaHQgbm90IGJlCi0jIGVudGlyZWx5IGFwcHJvcHJpYXRlIHRvIGluaGVyaXQgZnJvbSBmb3Igb24tZGV2aWNlIGNvbmZpZ3VyYXRpb25zLgotCi1QUk9EVUNUX0NPUFlfRklMRVMgKz0gXAotICAgIGRldmVsb3BtZW50L3N5cy1pbWcvYWR2YW5jZWRGZWF0dXJlcy5pbmk6YWR2YW5jZWRGZWF0dXJlcy5pbmkgXAotICAgIGRldmljZS9nZW5lcmljL2dvbGRmaXNoL2RhdGEvZXRjL2VuY3J5cHRpb25rZXkuaW1nOmVuY3J5cHRpb25rZXkuaW1nIFwKLSAgICBwcmVidWlsdHMvcWVtdS1rZXJuZWwveDg2XzY0LzMuMTgva2VybmVsLXFlbXUyOmtlcm5lbC1yYW5jaHUKLQotJChjYWxsIGluaGVyaXQtcHJvZHVjdCwgJChTUkNfVEFSR0VUX0RJUikvcHJvZHVjdC9jb3JlXzY0X2JpdC5taykKLSQoY2FsbCBpbmhlcml0LXByb2R1Y3QsICQoU1JDX1RBUkdFVF9ESVIpL3Byb2R1Y3Qvc2RrX2Jhc2UubWspCi0KLSMgQU9TUCBlbXVsYXRvciBpbWFnZXMgYnVpbGQgdGhlIEFPU1AgbWVzc2FnaW5nIGFwcC4KLSMgR29vZ2xlIEFQSSBpbWFnZXMgb3ZlcnJpZGUgd2l0aCB0aGUgR29vZ2xlIEFQSSBhcHAuCi0jIFNlZSB2ZW5kb3IvZ29vZ2xlL3Byb2R1Y3RzL3Nka19nb29nbGVfcGhvbmVfKi5tawotUFJPRFVDVF9QQUNLQUdFUyArPSBcCi0gICAgbWVzc2FnaW5nCisjIERlZmluZSB0aGUgaG9zdCB0b29scyBhbmQgbGlicyB0aGF0IGFyZSBwYXJ0cyBvZiB0aGUgU0RLLgorLWluY2x1ZGUgc2RrL2J1aWxkL3Byb2R1Y3Rfc2RrLm1rCistaW5jbHVkZSBkZXZlbG9wbWVudC9idWlsZC9wcm9kdWN0X3Nkay5tawogCiAjIE92ZXJyaWRlcwogUFJPRFVDVF9CUkFORCA6PSBBbmRyb2lkCmRpZmYgLS1naXQgYS90YXJnZXQvcHJvZHVjdC9zZWN1cml0eS9BbmRyb2lkLm1rIGIvdGFyZ2V0L3Byb2R1Y3Qvc2VjdXJpdHkvQW5kcm9pZC5tawppbmRleCA1YTQwMzk3Li40MTQyZWE5IDEwMDY0NAotLS0gYS90YXJnZXQvcHJvZHVjdC9zZWN1cml0eS9BbmRyb2lkLm1rCisrKyBiL3RhcmdldC9wcm9kdWN0L3NlY3VyaXR5L0FuZHJvaWQubWsKQEAgLTEwLDMgKzEwLDE2IEBACiBMT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9ST09UX09VVCkKIAogaW5jbHVkZSAkKEJVSUxEX1BSRUJVSUxUKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgYWRiIGtleSwgaWYgY29uZmlndXJlZCB2aWEgUFJPRFVDVF9BREJfS0VZUworaWZkZWYgUFJPRFVDVF9BREJfS0VZUworICBpZm5lcSAoJChmaWx0ZXIgZW5nIHVzZXJkZWJ1ZywkKFRBUkdFVF9CVUlMRF9WQVJJQU5UKSksKQorICAgIGluY2x1ZGUgJChDTEVBUl9WQVJTKQorICAgIExPQ0FMX01PRFVMRSA6PSBhZGJfa2V5cworICAgIExPQ0FMX01PRFVMRV9DTEFTUyA6PSBFVEMKKyAgICBMT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9ST09UX09VVCkKKyAgICBMT0NBTF9QUkVCVUlMVF9NT0RVTEVfRklMRSA6PSAkKFBST0RVQ1RfQURCX0tFWVMpCisgICAgaW5jbHVkZSAkKEJVSUxEX1BSRUJVSUxUKQorICBlbmRpZgorZW5kaWYKZGlmZiAtLWdpdCBhL3RhcmdldC9wcm9kdWN0L3NlY3VyaXR5L1JFQURNRSBiL3RhcmdldC9wcm9kdWN0L3NlY3VyaXR5L1JFQURNRQppbmRleCAxNWYyZTkzLi42YTZlNjJkIDEwMDY0NAotLS0gYS90YXJnZXQvcHJvZHVjdC9zZWN1cml0eS9SRUFETUUKKysrIGIvdGFyZ2V0L3Byb2R1Y3Qvc2VjdXJpdHkvUkVBRE1FCkBAIC0zNCw1ICszNCw1IEBACiAgICAgJCBqYXZhIC1qYXIgb3V0L2hvc3QvbGludXgteDg2L2ZyYW1ld29yay9kdW1wa2V5LmphciBidWlsZC90YXJnZXQvcHJvZHVjdC9zZWN1cml0eS90ZXN0a2V5Lng1MDkucGVtCiAgICAgezY0LDB4YzkyNmFkMjEsezE3OTUwOTA3MTksMjE0MTM5NjMxNSw5NTAwNTU0NDcsMjU4MTU2ODQzMCw0MjY4OTIzMTY1LDE5MjA4MDk5ODgsNTQ2NTg2NTIxLDM0OTg5OTc3OTgsMTc3Njc5Nzg1OCwzNzQwMDYwODE0LDE4MDUzMTc5OTksMTQyOTQxMDI0NCwxMjk2MjI1OTksMTQyMjQ0MTQxOCwxNzgzODkzMzc3LDEyMjIzNzQ3NTksMjU2MzMxOTkyNywzMjM5OTM1NjYsMjg1MTc3MzIsNjA5NzUzNDE2LDE4MjY0NzI4ODgsMjE1MjM3ODUwLDQyNjE2NDI3MDAsNDA0OTA4MjU5MSwzMjI4NDYyNDAyLDc3NDg1Nzc0NiwxNTQ4MjI0NTUsMjQ5NzE5ODg5NywyNzU4MTk5NDE4LDMwMTkwMTUzMjgsMjc5NDc3NzY0NCw4NzI1MTQzMCwyNTM0OTI3OTc4LDEyMDc3NDc4NCw1NzEyOTc4MDAsMzY5NTg5OTQ3MiwyNDc5OTI1MTg3LDM4MTE2MjU0NTAsMzQwMTgzMjk5MCwyMzk0ODY5NjQ3LDMyNjcyNDYyMDcsOTUwMDk1NDk3LDU1NTA1ODkyOCw0MTQ3Mjk5NzMsMTEzNjU0NDg4MiwzMDQ0NTkwMDg0LDQ2NTU0NzgyNCw0MDU4MTQ2NzI4LDI3MzE3OTYwNTQsMTY4OTgzODg0NiwzODkwNzU2OTM5LDEwNDgwMjk1MDcsODk1MDkwNjQ5LDI0NzE0MDI0OSwxNzg3NDQ1NTAsMzU0Nzg4NTIyMywzMTY1MTc5MjQzLDEwOTg4MTU3NiwzOTQ0NjA0NDE1LDEwNDQzMDMyMTIsMzc3MjM3MzAyOSwyOTg1MTUwMzA2LDM3Mzc1MjA5MzIsMzU5OTk2NDQyMH0sezM0MzcwMTc0ODEsMzc4NDQ3NTEyOSwyODAwMjI0OTcyLDMwODYyMjI2ODgsMjUxMzMzNTgwLDIxMzE5MzEzMjMsNTEyNzc0OTM4LDMyNTk0ODg4MCwyNjU3NDg2NDM3LDIxMDI2OTQyODcsMzgyMDU2ODIyNiw3OTI4MTI4MTYsMTAyNjQyMjUwMiwyMDUzMjc1MzQzLDI4MDA4ODkyMDAsMzExMzU4NjgxMCwxNjU1NDk3NDYsNDI3MzUxOTk2OSw0MDY1MjQ3ODkyLDE5MDI3ODkyNDcsNzcyOTMyNzE5LDM5NDE4NDg0MjYsMzY1Mjc0NDEwOSwyMTY4NzE5NDcsMzE2NDQwMDY0OSwxOTQyMzc4NzU1LDM5OTY3NjU4NTEsMTA1NTc3NzM3MCw5NjQwNDc3OTksNjI5MzkxNzE3LDIyMzI3NDQzMTcsMzkxMDU1ODk5MiwxOTE4Njg1NjksMjc1ODg4MzgzNywzNjgyODE2NzUyLDI5OTc3MTQ3MzIsMjcwMjUyOTI1MCwzNTcwNzAwNDU1LDM3NzY4NzM4MzIsMzkyNDA2NzU0NiwzNTU1Njg5NTQ1LDI3NTg4MjU0MzQsMTMyMzE0NDUzNSw2MTMxMTkwNSwxOTk3NDExMDg1LDM3Njg0NDIwNCwyMTM3Nzc2MDQsNDA3NzMyMzU4NCw5MTM1MzgxLDE2MjU4MDkzMzUsMjgwNDc0MjEzNywyOTUyMjkzOTQ1LDExMTcxOTA4MjksNDIzNzMxMjc4MiwxODI1MTA4ODU1LDMwMTMxNDc5NzEsMTExMTI1MTM1MSwyNTY4ODM3NTcyLDE2ODQzMjQyMTEsMjUyMDk3ODgwNSwzNjcyNTE5NzUsODEwNzU2NzMwLDIzNTM3ODQzNDQsMTE3NTA4MDMxMH19CiAKLVRoaXMgaXMgY2FsbGVkIGJ5IGJ1aWxkL2NvcmUvTWFrZWZpbGUgdG8gaW5jb3Jwb3JhdGUgdGhlIE9UQSBzaWduaW5nIGtleXMKK1RoaXMgaXMgY2FsbGVkIGJ5IGJ1aWxkL21ha2UvY29yZS9NYWtlZmlsZSB0byBpbmNvcnBvcmF0ZSB0aGUgT1RBIHNpZ25pbmcga2V5cwogaW50byB0aGUgcmVjb3ZlcnkgaW1hZ2UuCmRpZmYgLS1naXQgYS90YXJnZXQvcHJvZHVjdC90cmVibGVfY29tbW9uLm1rIGIvdGFyZ2V0L3Byb2R1Y3QvdHJlYmxlX2NvbW1vbi5tawppbmRleCAxM2I3NzY5Li42Y2Y2NmFmIDEwMDY0NAotLS0gYS90YXJnZXQvcHJvZHVjdC90cmVibGVfY29tbW9uLm1rCisrKyBiL3RhcmdldC9wcm9kdWN0L3RyZWJsZV9jb21tb24ubWsKQEAgLTMxLDE1ICszMSw2IEBACiBQUk9EVUNUX1BBQ0tBR0VTICs9IFwKICAgICBtZXNzYWdpbmcKIAotIyBBbGwgVk5ESyBsaWJyYXJpZXMgKEhBTCBpbnRlcmZhY2VzLCBWTkRLLCBWTkRLLVNQLCBMTC1OREspCi1QUk9EVUNUX1BBQ0tBR0VTICs9IHZuZGtfcGFja2FnZQotCi0jIFNQLU5ESzoKLVBST0RVQ1RfUEFDS0FHRVMgKz0gXAotICAgIGxpYnZ1bGthbiBcCi0KLSMgQXVkaW86Ci1VU0VfWE1MX0FVRElPX1BPTElDWV9DT05GIDo9IDEKICMgVGhlIGZvbGxvd2luZyBwb2xpY3kgWE1MIGZpbGVzIGFyZSB1c2VkIGFzIGZhbGxiYWNrIGZvcgogIyB2ZW5kb3JzL2RldmljZXMgbm90IHVzaW5nIFhNTCB0byBjb25maWd1cmUgYXVkaW8gcG9saWN5LgogUFJPRFVDVF9DT1BZX0ZJTEVTICs9IFwKQEAgLTQ5LDI2ICs0MCwyOSBAQAogICAgIGZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL2F1ZGlvX3BvbGljeV92b2x1bWVzLnhtbDpzeXN0ZW0vZXRjL2F1ZGlvX3BvbGljeV92b2x1bWVzLnhtbCBcCiAgICAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvZGVmYXVsdF92b2x1bWVfdGFibGVzLnhtbDpzeXN0ZW0vZXRjL2RlZmF1bHRfdm9sdW1lX3RhYmxlcy54bWwgXAogCi0jIEJsdWV0b290aDoKLSMgICBhdWRpby5hMmRwLmRlZmF1bHQgaXMgYSBzeXN0ZW0gbW9kdWxlLiBHZW5lcmljIHN5c3RlbSBpbWFnZSBpbmNsdWRlcwotIyAgIGF1ZGlvLmEyZHAuZGVmYXVsdCB0byBzdXBwb3J0IEEyRFAgaWYgYm9hcmQgaGFzIHRoZSBjYXBhYmlsaXR5LgotUFJPRFVDVF9QQUNLQUdFUyArPSBcCi0gICAgYXVkaW8uYTJkcC5kZWZhdWx0CisjIFRlbGVwaG9ueToKKyMgICBQcm92aWRlIGEgZGVmYXVsdCBBUE4gY29uZmlndXJhdGlvbgorUFJPRFVDVF9DT1BZX0ZJTEVTICs9IFwKKyAgICBkZXZpY2UvZ2VuZXJpYy9nb2xkZmlzaC9kYXRhL2V0Yy9hcG5zLWNvbmYueG1sOnN5c3RlbS9ldGMvYXBucy1jb25mLnhtbAogCi0jIE5ldDoKLSMgICBWZW5kb3JzIGNhbiB1c2UgdGhlIHBsYXRmb3JtLXByb3ZpZGVkIG5ldHdvcmsgY29uZmlndXJhdGlvbiB1dGlsaXRpZXMgKGlwLAotIyAgIGlwdGFibGUsIGV0Yy4pIHRvIGNvbmZpZ3VyZSB0aGUgTGludXggbmV0d29ya2luZyBzdGFjaywgYnV0IHRoZXNlIHV0aWxpdGllcwotIyAgIGRvIG5vdCB5ZXQgaW5jbHVkZSBhIEhJREwgaW50ZXJmYWNlIHdyYXBwZXIuIFRoaXMgaXMgYSBzb2x1dGlvbiBvbgotIyAgIEFuZHJvaWQgTy4KLVBST0RVQ1RfUEFDS0FHRVMgKz0gXAotICAgIG5ldHV0aWxzLXdyYXBwZXItMS4wCisjIE5GQzoKKyMgICBQcm92aWRlIGRlZmF1bHQgbGlibmZjLW5jaS5jb25mIGZpbGUgZm9yIGRldmljZXMgdGhhdCBkb2VzIG5vdCBoYXZlIG9uZSBpbgorIyAgIHZlbmRvci9ldGMKK1BST0RVQ1RfQ09QWV9GSUxFUyArPSBcCisgICAgZGV2aWNlL2dlbmVyaWMvY29tbW9uL25mYy9saWJuZmMtbmNpLmNvbmY6c3lzdGVtL2V0Yy9saWJuZmMtbmNpLmNvbmYKIAotIyBBbmRyb2lkIFZlcmlmaWVkIEJvb3QgKEFWQik6Ci0jICAgQnVpbGRzIGEgc3BlY2lhbCB2Ym1ldGEuaW1nIHRoYXQgZGlzYWJsZXMgQVZCIHZlcmlmaWNhdGlvbi4KLSMgICBPdGhlcndpc2UsIEFWQiB3aWxsIHByZXZlbnQgdGhlIGRldmljZSBmcm9tIGJvb3RpbmcgdGhlIGdlbmVyaWMgc3lzdGVtLmltZy4KLSMgICBBbHNvIGNoZWNrcyB0aGF0IEJPQVJEX0FWQl9FTkFCTEUgaXMgbm90IHNldCwgdG8gcHJldmVudCBhZGRpbmcgdmVyaXR5Ci0jICAgbWV0YWRhdGEgaW50byBzeXN0ZW0uaW1nLgotaWZlcSAoJChCT0FSRF9BVkJfRU5BQkxFKSx0cnVlKQotJChlcnJvciBCT0FSRF9BVkJfRU5BQkxFIGNhbm5vdCBiZSBzZXQgZm9yIFRyZWJsZSBHU0kpCi1lbmRpZgotQk9BUkRfQlVJTERfRElTQUJMRURfVkJNRVRBSU1BR0UgOj0gdHJ1ZQorIyBTdXBwb3J0IGZvciB0aGUgTy1NUjEgZGV2aWNlcworUFJPRFVDVF9DT1BZX0ZJTEVTICs9IFwKKyAgICBidWlsZC9tYWtlL3RhcmdldC9wcm9kdWN0L3ZuZGsvaW5pdC5nc2kucmM6c3lzdGVtL2V0Yy9pbml0L2luaXQuZ3NpLnJjIFwKKyAgICBidWlsZC9tYWtlL3RhcmdldC9wcm9kdWN0L3ZuZGsvaW5pdC52bmRrLTI3LnJjOnN5c3RlbS9ldGMvaW5pdC9nc2kvaW5pdC52bmRrLTI3LnJjCisKKyMgTmFtZSBzcGFjZSBjb25maWd1cmF0aW9uIGZpbGUgZm9yIG5vbi1lbmZvcmNpbmcgVk5ESworUFJPRFVDVF9QQUNLQUdFUyArPSBcCisgICAgbGQuY29uZmlnLnZuZGtfbGl0ZS50eHQKKworIyBTdXBwb3J0IGFkZHRpb25hbCBPLU1SMSB2ZW5kb3IgaW50ZXJmYWNlCitQUk9EVUNUX0VYVFJBX1ZOREtfVkVSU0lPTlMgOj0gMjcKKworIyBUT0RPKGIvNzgzMDg1NTkpOiBpbmNsdWRlcyB2cl9od2MgaW50byBHU0kgYmVmb3JlIHZyX2h3YyBtb3ZlIHRvIHZlbmRvcgorUFJPRFVDVF9QQUNLQUdFUyArPSBcCisgICAgdnJfaHdjCmRpZmYgLS1naXQgYS90YXJnZXQvcHJvZHVjdC92ZXJpdHkubWsgYi90YXJnZXQvcHJvZHVjdC92ZXJpdHkubWsKaW5kZXggMGJhZGI5Zi4uZDk1NDE1OSAxMDA2NDQKLS0tIGEvdGFyZ2V0L3Byb2R1Y3QvdmVyaXR5Lm1rCisrKyBiL3RhcmdldC9wcm9kdWN0L3Zlcml0eS5tawpAQCAtMTQsMjAgKzE0LDE2IEBACiAjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi0jIFByb3ZpZGVzIGRlcGVuZGVuY2llcyBuZWNlc3NhcnkgZm9yIHZlcmlmaWVkIGJvb3QgKG9ubHkgZm9yIHVzZXIgYW5kCi0jIHVzZXJkZWJ1ZyBidWlsZHMpCisjIFByb3ZpZGVzIGRlcGVuZGVuY2llcyBuZWNlc3NhcnkgZm9yIHZlcmlmaWVkIGJvb3QuCiAKLXVzZXJfdmFyaWFudCA6PSAkKGZpbHRlciB1c2VyIHVzZXJkZWJ1ZywkKFRBUkdFVF9CVUlMRF9WQVJJQU5UKSkKLWlmbmVxICgsJCh1c2VyX3ZhcmlhbnQpKQotICAgIFBST0RVQ1RfU1VQUE9SVFNfQk9PVF9TSUdORVIgOj0gdHJ1ZQotICAgIFBST0RVQ1RfU1VQUE9SVFNfVkVSSVRZIDo9IHRydWUKLSAgICBQUk9EVUNUX1NVUFBPUlRTX1ZFUklUWV9GRUMgOj0gdHJ1ZQorUFJPRFVDVF9TVVBQT1JUU19CT09UX1NJR05FUiA6PSB0cnVlCitQUk9EVUNUX1NVUFBPUlRTX1ZFUklUWSA6PSB0cnVlCitQUk9EVUNUX1NVUFBPUlRTX1ZFUklUWV9GRUMgOj0gdHJ1ZQogCi0gICAgIyBUaGUgZGV2IGtleSBpcyB1c2VkIHRvIHNpZ24gYm9vdCBhbmQgcmVjb3ZlcnkgaW1hZ2VzLCBhbmQgdGhlIHZlcml0eQotICAgICMgbWV0YWRhdGEgdGFibGUuIEFjdHVhbCBwcm9kdWN0IGRlbGl2ZXJhYmxlcyB3aWxsIGJlIHJlLXNpZ25lZCBieSBoYW5kLgotICAgICMgV2UgZXhwZWN0IHRoaXMgZmlsZSB0byBleGlzdCB3aXRoIHRoZSBzdWZmaXhlcyAiLng1MDkucGVtIiBhbmQgIi5wazgiLgotICAgIFBST0RVQ1RfVkVSSVRZX1NJR05JTkdfS0VZIDo9IGJ1aWxkL3RhcmdldC9wcm9kdWN0L3NlY3VyaXR5L3Zlcml0eQorIyBUaGUgZGV2IGtleSBpcyB1c2VkIHRvIHNpZ24gYm9vdCBhbmQgcmVjb3ZlcnkgaW1hZ2VzLCBhbmQgdGhlIHZlcml0eQorIyBtZXRhZGF0YSB0YWJsZS4gQWN0dWFsIHByb2R1Y3QgZGVsaXZlcmFibGVzIHdpbGwgYmUgcmUtc2lnbmVkIGJ5IGhhbmQuCisjIFdlIGV4cGVjdCB0aGlzIGZpbGUgdG8gZXhpc3Qgd2l0aCB0aGUgc3VmZml4ZXMgIi54NTA5LnBlbSIgYW5kICIucGs4Ii4KK1BST0RVQ1RfVkVSSVRZX1NJR05JTkdfS0VZIDo9IGJ1aWxkL3RhcmdldC9wcm9kdWN0L3NlY3VyaXR5L3Zlcml0eQogCi0gICAgUFJPRFVDVF9QQUNLQUdFUyArPSBcCi0gICAgICAgICAgICB2ZXJpdHlfa2V5Ci1lbmRpZgorUFJPRFVDVF9QQUNLQUdFUyArPSBcCisgICAgICAgIHZlcml0eV9rZXkKZGlmZiAtLWdpdCBhL3RhcmdldC9wcm9kdWN0L3ZuZGsvMjgudHh0IGIvdGFyZ2V0L3Byb2R1Y3Qvdm5kay8yOC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzEyZTkxYwotLS0gL2Rldi9udWxsCisrKyBiL3RhcmdldC9wcm9kdWN0L3ZuZGsvMjgudHh0CkBAIC0wLDAgKzEsMjUyIEBACitMTE5ESzogbGliRUdMLnNvCitMTE5ESzogbGliR0xFU3YxX0NNLnNvCitMTE5ESzogbGliR0xFU3YyLnNvCitMTE5ESzogbGliR0xFU3YzLnNvCitMTE5ESzogbGliUlMuc28KK0xMTkRLOiBsaWJhbmRyb2lkX25ldC5zbworTExOREs6IGxpYmMuc28KK0xMTkRLOiBsaWJkbC5zbworTExOREs6IGxpYmZ0Mi5zbworTExOREs6IGxpYmxvZy5zbworTExOREs6IGxpYm0uc28KK0xMTkRLOiBsaWJtZWRpYW5kay5zbworTExOREs6IGxpYm5hdGl2ZXdpbmRvdy5zbworTExOREs6IGxpYm5ldXJhbG5ldHdvcmtzLnNvCitMTE5ESzogbGlic3luYy5zbworTExOREs6IGxpYnZuZGtzdXBwb3J0LnNvCitMTE5ESzogbGlidnVsa2FuLnNvCitWTkRLLVNQOiBhbmRyb2lkLmhhcmR3YXJlLmdyYXBoaWNzLmNvbW1vbkAxLjAuc28KK1ZOREstU1A6IGFuZHJvaWQuaGFyZHdhcmUuZ3JhcGhpY3MuY29tbW9uQDEuMS5zbworVk5ESy1TUDogYW5kcm9pZC5oYXJkd2FyZS5ncmFwaGljcy5tYXBwZXJAMi4wLnNvCitWTkRLLVNQOiBhbmRyb2lkLmhhcmR3YXJlLmdyYXBoaWNzLm1hcHBlckAyLjEuc28KK1ZOREstU1A6IGFuZHJvaWQuaGFyZHdhcmUucmVuZGVyc2NyaXB0QDEuMC5zbworVk5ESy1TUDogYW5kcm9pZC5oaWRsLm1lbW9yeS50b2tlbkAxLjAuc28KK1ZOREstU1A6IGFuZHJvaWQuaGlkbC5tZW1vcnlAMS4wLnNvCitWTkRLLVNQOiBhbmRyb2lkLmhpZGwubWVtb3J5QDEuMC1pbXBsLnNvCitWTkRLLVNQOiBsaWJSU0NwdVJlZi5zbworVk5ESy1TUDogbGliUlNEcml2ZXIuc28KK1ZOREstU1A6IGxpYlJTX2ludGVybmFsLnNvCitWTkRLLVNQOiBsaWJiYWNrdHJhY2Uuc28KK1ZOREstU1A6IGxpYmJhc2Uuc28KK1ZOREstU1A6IGxpYmJjaW5mby5zbworVk5ESy1TUDogbGliYmxhcy5zbworVk5ESy1TUDogbGliYysrLnNvCitWTkRLLVNQOiBsaWJjb21waWxlcl9ydC5zbworVk5ESy1TUDogbGliY3V0aWxzLnNvCitWTkRLLVNQOiBsaWJoYXJkd2FyZS5zbworVk5ESy1TUDogbGliaGlkbGJhc2Uuc28KK1ZOREstU1A6IGxpYmhpZGxtZW1vcnkuc28KK1ZOREstU1A6IGxpYmhpZGx0cmFuc3BvcnQuc28KK1ZOREstU1A6IGxpYmh3YmluZGVyLnNvCitWTkRLLVNQOiBsaWJod2JpbmRlcl9ub2x0b3Bnby5zbworVk5ESy1TUDogbGliaW9uLnNvCitWTkRLLVNQOiBsaWJsem1hLnNvCitWTkRLLVNQOiBsaWJ1bndpbmQuc28KK1ZOREstU1A6IGxpYnVud2luZHN0YWNrLnNvCitWTkRLLVNQOiBsaWJ1dGlscy5zbworVk5ESy1TUDogbGlidXRpbHNjYWxsc3RhY2suc28KK1ZOREstU1A6IGxpYnouc28KK1ZOREstY29yZTogYW5kcm9pZC5mcmFtZXdvcmtzLmRpc3BsYXlzZXJ2aWNlQDEuMC5zbworVk5ESy1jb3JlOiBhbmRyb2lkLmZyYW1ld29ya3Muc2NoZWR1bGVyc2VydmljZUAxLjAuc28KK1ZOREstY29yZTogYW5kcm9pZC5mcmFtZXdvcmtzLnNlbnNvcnNlcnZpY2VAMS4wLnNvCitWTkRLLWNvcmU6IGFuZHJvaWQuZnJhbWV3b3Jrcy52ci5jb21wb3NlckAxLjAuc28KK1ZOREstY29yZTogYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5jb21tb24tdXRpbC5zbworVk5ESy1jb3JlOiBhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmNvbW1vbkAyLjAuc28KK1ZOREstY29yZTogYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5jb21tb25AMi4wLXV0aWwuc28KK1ZOREstY29yZTogYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5jb21tb25ANC4wLnNvCitWTkRLLWNvcmU6IGFuZHJvaWQuaGFyZHdhcmUuYXVkaW8uY29tbW9uQDQuMC11dGlsLnNvCitWTkRLLWNvcmU6IGFuZHJvaWQuaGFyZHdhcmUuYXVkaW8uZWZmZWN0QDIuMC5zbworVk5ESy1jb3JlOiBhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmVmZmVjdEA0LjAuc28KK1ZOREstY29yZTogYW5kcm9pZC5oYXJkd2FyZS5hdWRpb0AyLjAuc28KK1ZOREstY29yZTogYW5kcm9pZC5oYXJkd2FyZS5hdWRpb0A0LjAuc28KK1ZOREstY29yZTogYW5kcm9pZC5oYXJkd2FyZS5hdXRoc2VjcmV0QDEuMC5zbworVk5ESy1jb3JlOiBhbmRyb2lkLmhhcmR3YXJlLmF1dG9tb3RpdmUuYXVkaW9jb250cm9sQDEuMC5zbworVk5ESy1jb3JlOiBhbmRyb2lkLmhhcmR3YXJlLmF1dG9tb3RpdmUuZXZzQDEuMC5zbworVk5ESy1jb3JlOiBhbmRyb2lkLmhhcmR3YXJlLmF1dG9tb3RpdmUudmVoaWNsZUAyLjAuc28KK1ZOREstY29yZTogYW5kcm9pZC5oYXJkd2FyZS5iaW9tZXRyaWNzLmZpbmdlcnByaW50QDIuMS5zbworVk5ESy1jb3JlOiBhbmRyb2lkLmhhcmR3YXJlLmJsdWV0b290aC5hMmRwQDEuMC5zbworVk5ESy1jb3JlOiBhbmRyb2lkLmhhcmR3YXJlLmJsdWV0b290aEAxLjAuc28KK1ZOREstY29yZTogYW5kcm9pZC5oYXJkd2FyZS5ib290QDEuMC5zbworVk5ESy1jb3JlOiBhbmRyb2lkLmhhcmR3YXJlLmJyb2FkY2FzdHJhZGlvQDEuMC5zbworVk5ESy1jb3JlOiBhbmRyb2lkLmhhcmR3YXJlLmJyb2FkY2FzdHJhZGlvQDEuMS5zbworVk5ESy1jb3JlOiBhbmRyb2lkLmhhcmR3YXJlLmJyb2FkY2FzdHJhZGlvQDIuMC5zbworVk5ESy1jb3JlOiBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5jb21tb25AMS4wLnNvCitWTkRLLWNvcmU6IGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmRldmljZUAxLjAuc28KK1ZOREstY29yZTogYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuZGV2aWNlQDMuMi5zbworVk5ESy1jb3JlOiBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5kZXZpY2VAMy4zLnNvCitWTkRLLWNvcmU6IGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmRldmljZUAzLjQuc28KK1ZOREstY29yZTogYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEubWV0YWRhdGFAMy4yLnNvCitWTkRLLWNvcmU6IGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLm1ldGFkYXRhQDMuMy5zbworVk5ESy1jb3JlOiBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5wcm92aWRlckAyLjQuc28KK1ZOREstY29yZTogYW5kcm9pZC5oYXJkd2FyZS5jYXMubmF0aXZlQDEuMC5zbworVk5ESy1jb3JlOiBhbmRyb2lkLmhhcmR3YXJlLmNhc0AxLjAuc28KK1ZOREstY29yZTogYW5kcm9pZC5oYXJkd2FyZS5jb25maWdzdG9yZS11dGlscy5zbworVk5ESy1jb3JlOiBhbmRyb2lkLmhhcmR3YXJlLmNvbmZpZ3N0b3JlQDEuMC5zbworVk5ESy1jb3JlOiBhbmRyb2lkLmhhcmR3YXJlLmNvbmZpZ3N0b3JlQDEuMS5zbworVk5ESy1jb3JlOiBhbmRyb2lkLmhhcmR3YXJlLmNvbmZpcm1hdGlvbnVpLXN1cHBvcnQtbGliLnNvCitWTkRLLWNvcmU6IGFuZHJvaWQuaGFyZHdhcmUuY29uZmlybWF0aW9udWlAMS4wLnNvCitWTkRLLWNvcmU6IGFuZHJvaWQuaGFyZHdhcmUuY29udGV4dGh1YkAxLjAuc28KK1ZOREstY29yZTogYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4wLnNvCitWTkRLLWNvcmU6IGFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMS5zbworVk5ESy1jb3JlOiBhbmRyb2lkLmhhcmR3YXJlLmR1bXBzdGF0ZUAxLjAuc28KK1ZOREstY29yZTogYW5kcm9pZC5oYXJkd2FyZS5nYXRla2VlcGVyQDEuMC5zbworVk5ESy1jb3JlOiBhbmRyb2lkLmhhcmR3YXJlLmduc3NAMS4wLnNvCitWTkRLLWNvcmU6IGFuZHJvaWQuaGFyZHdhcmUuZ25zc0AxLjEuc28KK1ZOREstY29yZTogYW5kcm9pZC5oYXJkd2FyZS5ncmFwaGljcy5hbGxvY2F0b3JAMi4wLnNvCitWTkRLLWNvcmU6IGFuZHJvaWQuaGFyZHdhcmUuZ3JhcGhpY3MuYnVmZmVycXVldWVAMS4wLnNvCitWTkRLLWNvcmU6IGFuZHJvaWQuaGFyZHdhcmUuZ3JhcGhpY3MuY29tcG9zZXJAMi4xLnNvCitWTkRLLWNvcmU6IGFuZHJvaWQuaGFyZHdhcmUuZ3JhcGhpY3MuY29tcG9zZXJAMi4yLnNvCitWTkRLLWNvcmU6IGFuZHJvaWQuaGFyZHdhcmUuaGVhbHRoQDEuMC5zbworVk5ESy1jb3JlOiBhbmRyb2lkLmhhcmR3YXJlLmhlYWx0aEAyLjAuc28KK1ZOREstY29yZTogYW5kcm9pZC5oYXJkd2FyZS5pckAxLjAuc28KK1ZOREstY29yZTogYW5kcm9pZC5oYXJkd2FyZS5rZXltYXN0ZXJAMy4wLnNvCitWTkRLLWNvcmU6IGFuZHJvaWQuaGFyZHdhcmUua2V5bWFzdGVyQDQuMC5zbworVk5ESy1jb3JlOiBhbmRyb2lkLmhhcmR3YXJlLmxpZ2h0QDIuMC5zbworVk5ESy1jb3JlOiBhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmJ1ZmZlcnBvb2xAMS4wLnNvCitWTkRLLWNvcmU6IGFuZHJvaWQuaGFyZHdhcmUubWVkaWEub214QDEuMC5zbworVk5ESy1jb3JlOiBhbmRyb2lkLmhhcmR3YXJlLm1lZGlhQDEuMC5zbworVk5ESy1jb3JlOiBhbmRyb2lkLmhhcmR3YXJlLm1lbXRyYWNrQDEuMC5zbworVk5ESy1jb3JlOiBhbmRyb2lkLmhhcmR3YXJlLm5ldXJhbG5ldHdvcmtzQDEuMC5zbworVk5ESy1jb3JlOiBhbmRyb2lkLmhhcmR3YXJlLm5ldXJhbG5ldHdvcmtzQDEuMS5zbworVk5ESy1jb3JlOiBhbmRyb2lkLmhhcmR3YXJlLm5mY0AxLjAuc28KK1ZOREstY29yZTogYW5kcm9pZC5oYXJkd2FyZS5uZmNAMS4xLnNvCitWTkRLLWNvcmU6IGFuZHJvaWQuaGFyZHdhcmUub2VtbG9ja0AxLjAuc28KK1ZOREstY29yZTogYW5kcm9pZC5oYXJkd2FyZS5wb3dlckAxLjAuc28KK1ZOREstY29yZTogYW5kcm9pZC5oYXJkd2FyZS5wb3dlckAxLjEuc28KK1ZOREstY29yZTogYW5kcm9pZC5oYXJkd2FyZS5wb3dlckAxLjIuc28KK1ZOREstY29yZTogYW5kcm9pZC5oYXJkd2FyZS5yYWRpby5jb25maWdAMS4wLnNvCitWTkRLLWNvcmU6IGFuZHJvaWQuaGFyZHdhcmUucmFkaW8uZGVwcmVjYXRlZEAxLjAuc28KK1ZOREstY29yZTogYW5kcm9pZC5oYXJkd2FyZS5yYWRpb0AxLjAuc28KK1ZOREstY29yZTogYW5kcm9pZC5oYXJkd2FyZS5yYWRpb0AxLjEuc28KK1ZOREstY29yZTogYW5kcm9pZC5oYXJkd2FyZS5yYWRpb0AxLjIuc28KK1ZOREstY29yZTogYW5kcm9pZC5oYXJkd2FyZS5zZWN1cmVfZWxlbWVudEAxLjAuc28KK1ZOREstY29yZTogYW5kcm9pZC5oYXJkd2FyZS5zZW5zb3JzQDEuMC5zbworVk5ESy1jb3JlOiBhbmRyb2lkLmhhcmR3YXJlLnNvdW5kdHJpZ2dlckAyLjAuc28KK1ZOREstY29yZTogYW5kcm9pZC5oYXJkd2FyZS5zb3VuZHRyaWdnZXJAMi4wLWNvcmUuc28KK1ZOREstY29yZTogYW5kcm9pZC5oYXJkd2FyZS5zb3VuZHRyaWdnZXJAMi4xLnNvCitWTkRLLWNvcmU6IGFuZHJvaWQuaGFyZHdhcmUudGV0aGVyb2ZmbG9hZC5jb25maWdAMS4wLnNvCitWTkRLLWNvcmU6IGFuZHJvaWQuaGFyZHdhcmUudGV0aGVyb2ZmbG9hZC5jb250cm9sQDEuMC5zbworVk5ESy1jb3JlOiBhbmRyb2lkLmhhcmR3YXJlLnRoZXJtYWxAMS4wLnNvCitWTkRLLWNvcmU6IGFuZHJvaWQuaGFyZHdhcmUudGhlcm1hbEAxLjEuc28KK1ZOREstY29yZTogYW5kcm9pZC5oYXJkd2FyZS50di5jZWNAMS4wLnNvCitWTkRLLWNvcmU6IGFuZHJvaWQuaGFyZHdhcmUudHYuaW5wdXRAMS4wLnNvCitWTkRLLWNvcmU6IGFuZHJvaWQuaGFyZHdhcmUudXNiLmdhZGdldEAxLjAuc28KK1ZOREstY29yZTogYW5kcm9pZC5oYXJkd2FyZS51c2JAMS4wLnNvCitWTkRLLWNvcmU6IGFuZHJvaWQuaGFyZHdhcmUudXNiQDEuMS5zbworVk5ESy1jb3JlOiBhbmRyb2lkLmhhcmR3YXJlLnZpYnJhdG9yQDEuMC5zbworVk5ESy1jb3JlOiBhbmRyb2lkLmhhcmR3YXJlLnZpYnJhdG9yQDEuMS5zbworVk5ESy1jb3JlOiBhbmRyb2lkLmhhcmR3YXJlLnZpYnJhdG9yQDEuMi5zbworVk5ESy1jb3JlOiBhbmRyb2lkLmhhcmR3YXJlLnZyQDEuMC5zbworVk5ESy1jb3JlOiBhbmRyb2lkLmhhcmR3YXJlLndlYXZlckAxLjAuc28KK1ZOREstY29yZTogYW5kcm9pZC5oYXJkd2FyZS53aWZpLmhvc3RhcGRAMS4wLnNvCitWTkRLLWNvcmU6IGFuZHJvaWQuaGFyZHdhcmUud2lmaS5vZmZsb2FkQDEuMC5zbworVk5ESy1jb3JlOiBhbmRyb2lkLmhhcmR3YXJlLndpZmkuc3VwcGxpY2FudEAxLjAuc28KK1ZOREstY29yZTogYW5kcm9pZC5oYXJkd2FyZS53aWZpLnN1cHBsaWNhbnRAMS4xLnNvCitWTkRLLWNvcmU6IGFuZHJvaWQuaGFyZHdhcmUud2lmaUAxLjAuc28KK1ZOREstY29yZTogYW5kcm9pZC5oYXJkd2FyZS53aWZpQDEuMS5zbworVk5ESy1jb3JlOiBhbmRyb2lkLmhhcmR3YXJlLndpZmlAMS4yLnNvCitWTkRLLWNvcmU6IGFuZHJvaWQuaGlkbC5hbGxvY2F0b3JAMS4wLnNvCitWTkRLLWNvcmU6IGFuZHJvaWQuaGlkbC5tZW1vcnkuYmxvY2tAMS4wLnNvCitWTkRLLWNvcmU6IGFuZHJvaWQuaGlkbC50b2tlbkAxLjAuc28KK1ZOREstY29yZTogYW5kcm9pZC5oaWRsLnRva2VuQDEuMC11dGlscy5zbworVk5ESy1jb3JlOiBhbmRyb2lkLnN5c3RlbS5uZXQubmV0ZEAxLjAuc28KK1ZOREstY29yZTogYW5kcm9pZC5zeXN0ZW0ubmV0Lm5ldGRAMS4xLnNvCitWTkRLLWNvcmU6IGFuZHJvaWQuc3lzdGVtLndpZmkua2V5c3RvcmVAMS4wLnNvCitWTkRLLWNvcmU6IGxpYmFkZi5zbworVk5ESy1jb3JlOiBsaWJhdWRpb3JvdXRlLnNvCitWTkRLLWNvcmU6IGxpYmF1ZGlvdXRpbHMuc28KK1ZOREstY29yZTogbGliYmluZGVyLnNvCitWTkRLLWNvcmU6IGxpYmNhbWVyYV9tZXRhZGF0YS5zbworVk5ESy1jb3JlOiBsaWJjYXAuc28KK1ZOREstY29yZTogbGliY24tY2Jvci5zbworVk5ESy1jb3JlOiBsaWJjcnlwdG8uc28KK1ZOREstY29yZTogbGliY3J5cHRvX3V0aWxzLnNvCitWTkRLLWNvcmU6IGxpYmN1cmwuc28KK1ZOREstY29yZTogbGliZGlza2NvbmZpZy5zbworVk5ESy1jb3JlOiBsaWJkdW1wc3RhdGV1dGlsLnNvCitWTkRLLWNvcmU6IGxpYmV2ZW50LnNvCitWTkRLLWNvcmU6IGxpYmV4aWYuc28KK1ZOREstY29yZTogbGliZXhwYXQuc28KK1ZOREstY29yZTogbGliZm1xLnNvCitWTkRLLWNvcmU6IGxpYmdhdGVrZWVwZXIuc28KK1ZOREstY29yZTogbGliZ3VpLnNvCitWTkRLLWNvcmU6IGxpYmhhcmR3YXJlX2xlZ2FjeS5zbworVk5ESy1jb3JlOiBsaWJoaWRsYWxsb2NhdG9ydXRpbHMuc28KK1ZOREstY29yZTogbGliaGlkbGNhY2hlLnNvCitWTkRLLWNvcmU6IGxpYmpwZWcuc28KK1ZOREstY29yZTogbGlia2V5bWFzdGVyX21lc3NhZ2VzLnNvCitWTkRLLWNvcmU6IGxpYmtleW1hc3Rlcl9wb3J0YWJsZS5zbworVk5ESy1jb3JlOiBsaWJsZGFjQlRfYWJyLnNvCitWTkRLLWNvcmU6IGxpYmxkYWNCVF9lbmMuc28KK1ZOREstY29yZTogbGlibHo0LnNvCitWTkRLLWNvcmU6IGxpYm1lZGlhX2hlbHBlci5zbworVk5ESy1jb3JlOiBsaWJtZWRpYV9vbXguc28KK1ZOREstY29yZTogbGlibWVtdHJhY2suc28KK1ZOREstY29yZTogbGlibWluaWphaWwuc28KK1ZOREstY29yZTogbGlibWtib290aW1nX2FiaV9jaGVjay5zbworVk5ESy1jb3JlOiBsaWJuZXR1dGlscy5zbworVk5ESy1jb3JlOiBsaWJubC5zbworVk5ESy1jb3JlOiBsaWJvcHVzLnNvCitWTkRLLWNvcmU6IGxpYnBhZ2VtYXAuc28KK1ZOREstY29yZTogbGlicGNyZTIuc28KK1ZOREstY29yZTogbGlicGlleC5zbworVk5ESy1jb3JlOiBsaWJwbmcuc28KK1ZOREstY29yZTogbGlicG93ZXIuc28KK1ZOREstY29yZTogbGlicHJvY2luZm8uc28KK1ZOREstY29yZTogbGlicHJvdG9idWYtY3BwLWZ1bGwuc28KK1ZOREstY29yZTogbGlicHJvdG9idWYtY3BwLWxpdGUuc28KK1ZOREstY29yZTogbGlicHVyZXNvZnRrZXltYXN0ZXJkZXZpY2Uuc28KK1ZOREstY29yZTogbGlicmFkaW9fbWV0YWRhdGEuc28KK1ZOREstY29yZTogbGlic2VsaW51eC5zbworVk5ESy1jb3JlOiBsaWJzb2Z0a2V5bWFzdGVyZGV2aWNlLnNvCitWTkRLLWNvcmU6IGxpYnNwZWV4cmVzYW1wbGVyLnNvCitWTkRLLWNvcmU6IGxpYnNxbGl0ZS5zbworVk5ESy1jb3JlOiBsaWJzc2wuc28KK1ZOREstY29yZTogbGlic3RhZ2VmcmlnaHRfYW1ybmJfY29tbW9uLnNvCitWTkRLLWNvcmU6IGxpYnN0YWdlZnJpZ2h0X2J1ZmZlcnF1ZXVlX2hlbHBlci5zbworVk5ESy1jb3JlOiBsaWJzdGFnZWZyaWdodF9lbmNfY29tbW9uLnNvCitWTkRLLWNvcmU6IGxpYnN0YWdlZnJpZ2h0X2ZsYWNkZWMuc28KK1ZOREstY29yZTogbGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbi5zbworVk5ESy1jb3JlOiBsaWJzdGFnZWZyaWdodF9vbXguc28KK1ZOREstY29yZTogbGlic3RhZ2VmcmlnaHRfb214X3V0aWxzLnNvCitWTkRLLWNvcmU6IGxpYnN0YWdlZnJpZ2h0X3NvZnRfYWFjZGVjLnNvCitWTkRLLWNvcmU6IGxpYnN0YWdlZnJpZ2h0X3NvZnRfYWFjZW5jLnNvCitWTkRLLWNvcmU6IGxpYnN0YWdlZnJpZ2h0X3NvZnRfYW1yZGVjLnNvCitWTkRLLWNvcmU6IGxpYnN0YWdlZnJpZ2h0X3NvZnRfYW1ybmJlbmMuc28KK1ZOREstY29yZTogbGlic3RhZ2VmcmlnaHRfc29mdF9hbXJ3YmVuYy5zbworVk5ESy1jb3JlOiBsaWJzdGFnZWZyaWdodF9zb2Z0X2F2Y2RlYy5zbworVk5ESy1jb3JlOiBsaWJzdGFnZWZyaWdodF9zb2Z0X2F2Y2VuYy5zbworVk5ESy1jb3JlOiBsaWJzdGFnZWZyaWdodF9zb2Z0X2ZsYWNkZWMuc28KK1ZOREstY29yZTogbGlic3RhZ2VmcmlnaHRfc29mdF9mbGFjZW5jLnNvCitWTkRLLWNvcmU6IGxpYnN0YWdlZnJpZ2h0X3NvZnRfZzcxMWRlYy5zbworVk5ESy1jb3JlOiBsaWJzdGFnZWZyaWdodF9zb2Z0X2dzbWRlYy5zbworVk5ESy1jb3JlOiBsaWJzdGFnZWZyaWdodF9zb2Z0X2hldmNkZWMuc28KK1ZOREstY29yZTogbGlic3RhZ2VmcmlnaHRfc29mdF9tcDNkZWMuc28KK1ZOREstY29yZTogbGlic3RhZ2VmcmlnaHRfc29mdF9tcGVnMmRlYy5zbworVk5ESy1jb3JlOiBsaWJzdGFnZWZyaWdodF9zb2Z0X21wZWc0ZGVjLnNvCitWTkRLLWNvcmU6IGxpYnN0YWdlZnJpZ2h0X3NvZnRfbXBlZzRlbmMuc28KK1ZOREstY29yZTogbGlic3RhZ2VmcmlnaHRfc29mdF9vcHVzZGVjLnNvCitWTkRLLWNvcmU6IGxpYnN0YWdlZnJpZ2h0X3NvZnRfcmF3ZGVjLnNvCitWTkRLLWNvcmU6IGxpYnN0YWdlZnJpZ2h0X3NvZnRfdm9yYmlzZGVjLnNvCitWTkRLLWNvcmU6IGxpYnN0YWdlZnJpZ2h0X3NvZnRfdnB4ZGVjLnNvCitWTkRLLWNvcmU6IGxpYnN0YWdlZnJpZ2h0X3NvZnRfdnB4ZW5jLnNvCitWTkRLLWNvcmU6IGxpYnN0YWdlZnJpZ2h0X3htbHBhcnNlci5zbworVk5ESy1jb3JlOiBsaWJzdXNwZW5kLnNvCitWTkRLLWNvcmU6IGxpYnN5c3V0aWxzLnNvCitWTkRLLWNvcmU6IGxpYnRpbnlhbHNhLnNvCitWTkRLLWNvcmU6IGxpYnRpbnl4bWwyLnNvCitWTkRLLWNvcmU6IGxpYnVpLnNvCitWTkRLLWNvcmU6IGxpYnVzYmhvc3Quc28KK1ZOREstY29yZTogbGlidml4bC1hcm0uc28KK1ZOREstY29yZTogbGlidml4bC1hcm02NC5zbworVk5ESy1jb3JlOiBsaWJ2b3JiaXNpZGVjLnNvCitWTkRLLWNvcmU6IGxpYndpZmktc3lzdGVtLWlmYWNlLnNvCitWTkRLLWNvcmU6IGxpYnhtbDIuc28KK1ZOREstY29yZTogbGlieXV2LnNvCitWTkRLLWNvcmU6IGxpYnppcGFyY2hpdmUuc28KK1ZOREstcHJpdmF0ZTogbGliYmFja3RyYWNlLnNvCitWTkRLLXByaXZhdGU6IGxpYmJsYXMuc28KK1ZOREstcHJpdmF0ZTogbGliY29tcGlsZXJfcnQuc28KK1ZOREstcHJpdmF0ZTogbGliZnQyLnNvCitWTkRLLXByaXZhdGU6IGxpYmd1aS5zbworVk5ESy1wcml2YXRlOiBsaWJ1bndpbmQuc28KZGlmZiAtLWdpdCBhL3RhcmdldC9wcm9kdWN0L3ZuZGsvQW5kcm9pZC5tayBiL3RhcmdldC9wcm9kdWN0L3ZuZGsvQW5kcm9pZC5tawppbmRleCBjOGVkODczLi43NjhjYjgwIDEwMDY0NAotLS0gYS90YXJnZXQvcHJvZHVjdC92bmRrL0FuZHJvaWQubWsKKysrIGIvdGFyZ2V0L3Byb2R1Y3Qvdm5kay9BbmRyb2lkLm1rCkBAIC0xLDcgKzEsOTIgQEAKK2lmbmVxICgkKEJPQVJEX1ZOREtfVkVSU0lPTiksKQogTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCiAKLWluY2x1ZGUgJChDTEVBUl9WQVJTKQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIENyZWF0ZSB0aGUgbGlzdCBvZiB2bmRrIGxpYnJhcmllcyBmcm9tIHRoZSBzb3VyY2UgY29kZS4KK0lOVEVSTkFMX1ZOREtfTElCX0xJU1QgOj0gJChjYWxsIGludGVybWVkaWF0ZXMtZGlyLWZvcixQQUNLQUdJTkcsdm5kaykvbGlicy50eHQKKyQoSU5URVJOQUxfVk5ES19MSUJfTElTVCk6CisJQGVjaG8gIkdlbmVyYXRlOiAkQCIKKwlAbWtkaXIgLXAgJChkaXIgJEApCisJJChoaWRlKSBlY2hvIC1uID4gJEAKKwkkKGhpZGUpICQoZm9yZWFjaCBsaWIsICQoZmlsdGVyLW91dCBsaWJjbGFuZ19ydC4lLCQoTExOREtfTElCUkFSSUVTKSksIFwKKwkgIGVjaG8gTExOREs6ICQobGliKS5zbyA+PiAkQDspCisJJChoaWRlKSAkKGZvcmVhY2ggbGliLCAkKFZOREtfU0FNRVBST0NFU1NfTElCUkFSSUVTKSwgXAorCSAgZWNobyBWTkRLLVNQOiAkKGxpYikuc28gPj4gJEA7KQorCSQoaGlkZSkgJChmb3JlYWNoIGxpYiwgJChmaWx0ZXItb3V0IGxpYmNsYW5nX3J0LiUsJChWTkRLX0NPUkVfTElCUkFSSUVTKSksIFwKKwkgIGVjaG8gVk5ESy1jb3JlOiAkKGxpYikuc28gPj4gJEA7KQorCSQoaGlkZSkgJChmb3JlYWNoIGxpYiwgJChWTkRLX1BSSVZBVEVfTElCUkFSSUVTKSwgXAorCSAgZWNobyBWTkRLLXByaXZhdGU6ICQobGliKS5zbyA+PiAkQDspCiAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBUaGlzIGlzIHRoZSB1cC10by1kYXRlIGxpc3Qgb2Ygdm5kayBsaWJzLgorIyBUT0RPKGIvNjIwMTIyODUpOiB0aGUgbGliIGxpc3Qgc2hvdWxkIGJlIHN0b3JlZCBzb21ld2hlcmUgdW5kZXIKKyMgL3ByZWJ1aWx0cy92bmRrCitpZmVxIChSRUwsJChQTEFURk9STV9WRVJTSU9OX0NPREVOQU1FKSkKK0xBVEVTVF9WTkRLX0xJQl9MSVNUIDo9ICQoTE9DQUxfUEFUSCkvJChQTEFURk9STV9WTkRLX1ZFUlNJT04pLnR4dAoraWZlcSAoJCh3aWxkY2FyZCAkKExBVEVTVF9WTkRLX0xJQl9MSVNUKSksKQorJChlcnJvciAkKExBVEVTVF9WTkRLX0xJQl9MSVNUKSBmaWxlIG5vdCBmb3VuZC4gUGxlYXNlIGNvcHkgIiQoTE9DQUxfUEFUSCkvY3VycmVudC50eHQiIHRvICIkKExBVEVTVF9WTkRLX0xJQl9MSVNUKSIgYW5kIGNvbW1pdCBhIENMIGZvciByZWxlYXNlIGJyYW5jaCkKK2VuZGlmCitlbHNlCitMQVRFU1RfVk5ES19MSUJfTElTVCA6PSAkKExPQ0FMX1BBVEgpL2N1cnJlbnQudHh0CitlbmRpZgorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQ2hlY2sgdGhlIGdlbmVyYXRlIGxpc3QgYWdhaW5zdCB0aGUgbGF0ZXN0IGxpc3Qgc3RvcmVkIGluIHRoZQorIyBzb3VyY2UgdHJlZQorLlBIT05ZOiBjaGVjay12bmRrLWxpc3QKKworIyBDaGVjayBpZiB2bmRrIGxpc3QgaXMgY2hhbmdlZAorZHJvaWRjb3JlOiBjaGVjay12bmRrLWxpc3QKKworY2hlY2stdm5kay1saXN0LXRpbWVzdGFtcCA6PSAkKGNhbGwgaW50ZXJtZWRpYXRlcy1kaXItZm9yLFBBQ0tBR0lORyx2bmRrKS9jaGVjay1saXN0LXRpbWVzdGFtcAorY2hlY2stdm5kay1saXN0OiAkKGNoZWNrLXZuZGstbGlzdC10aW1lc3RhbXApCisKK192bmRrX2NoZWNrX2ZhaWx1cmVfbWVzc2FnZSA6PSAiIGVycm9yOiBWTkRLIGxpYnJhcnkgbGlzdCBoYXMgYmVlbiBjaGFuZ2VkLlxuIgoraWZlcSAoUkVMLCQoUExBVEZPUk1fVkVSU0lPTl9DT0RFTkFNRSkpCitfdm5ka19jaGVja19mYWlsdXJlX21lc3NhZ2UgKz0gIiAgICAgICBDaGFuZ2luZyB0aGUgVk5ESyBsaWJyYXJ5IGxpc3QgaXMgbm90IGFsbG93ZWQgaW4gQVBJIGxvY2tlZCBicmFuY2hlcy4iCitlbHNlCitfdm5ka19jaGVja19mYWlsdXJlX21lc3NhZ2UgKz0gIiAgICAgICBSdW4gdXBkYXRlLXZuZGstbGlzdC5zaCB0byB1cGRhdGUgJChMQVRFU1RfVk5ES19MSUJfTElTVCkiCitlbmRpZgorCiskKGNoZWNrLXZuZGstbGlzdC10aW1lc3RhbXApOiAkKElOVEVSTkFMX1ZOREtfTElCX0xJU1QpICQoTEFURVNUX1ZOREtfTElCX0xJU1QpICQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL3VwZGF0ZS12bmRrLWxpc3Quc2gKKwkkKGhpZGUpICggZGlmZiAtLW9sZC1saW5lLWZvcm1hdD0iUmVtb3ZlZCAlTCIgXAorCSAgLS1uZXctbGluZS1mb3JtYXQ9IkFkZGVkICVMIiBcCisJICAtLXVuY2hhbmdlZC1saW5lLWZvcm1hdD0iIiBcCisJICAkKExBVEVTVF9WTkRLX0xJQl9MSVNUKSAkKElOVEVSTkFMX1ZOREtfTElCX0xJU1QpIFwKKwkgIHx8ICggZWNobyAtZSAkKF92bmRrX2NoZWNrX2ZhaWx1cmVfbWVzc2FnZSk7IGV4aXQgMSApKQorCSQoaGlkZSkgbWtkaXIgLXAgJChkaXIgJEApCisJJChoaWRlKSB0b3VjaCAkQAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgU2NyaXB0IHRvIHVwZGF0ZSB0aGUgbGF0ZXN0IFZOREsgbGliIGxpc3QKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorTE9DQUxfTU9EVUxFIDo9IHVwZGF0ZS12bmRrLWxpc3Quc2gKK0xPQ0FMX01PRFVMRV9DTEFTUyA6PSBFWEVDVVRBQkxFUworTE9DQUxfTU9EVUxFX1NURU0gOj0gJChMT0NBTF9NT0RVTEUpCitMT0NBTF9JU19IT1NUX01PRFVMRSA6PSB0cnVlCitpbmNsdWRlICQoQlVJTERfU1lTVEVNKS9iYXNlX3J1bGVzLm1rCiskKExPQ0FMX0JVSUxUX01PRFVMRSk6IFBSSVZBVEVfSU5URVJOQUxfVk5ES19MSUJfTElTVCA6PSAkKElOVEVSTkFMX1ZOREtfTElCX0xJU1QpCiskKExPQ0FMX0JVSUxUX01PRFVMRSk6IFBSSVZBVEVfTEFURVNUX1ZOREtfTElCX0xJU1QgOj0gJChMQVRFU1RfVk5ES19MSUJfTElTVCkKKyQoTE9DQUxfQlVJTFRfTU9EVUxFKToKKwlAZWNobyAiR2VuZXJhdGU6ICRAIgorCUBta2RpciAtcCAkKGRpciAkQCkKKwlAcm0gLWYgJEAKKwkkKGhpZGUpIGVjaG8gIiMhL2Jpbi9iYXNoIiA+ICRACitpZmVxIChSRUwsJChQTEFURk9STV9WRVJTSU9OX0NPREVOQU1FKSkKKwkkKGhpZGUpIGVjaG8gImVjaG8gVXBkYXRpbmcgVk5ESyBsaWJyYXJ5IGxpc3QgaXMgTk9UIGFsbG93ZWQgaW4gQVBJIGxvY2tlZCBicmFuY2hlcy4iID4+ICRAOyBcCisJICAgICAgICBlY2hvICJleGl0IDEiID4+ICRACitlbHNlCisJJChoaWRlKSBlY2hvICJpZiBbIC16IFwiXCQke0FORFJPSURfQlVJTERfVE9QfVwiIF07IHRoZW4iID4+ICRAOyBcCisJICAgICAgICBlY2hvICIgIGVjaG8gUnVuIGx1bmNoIG9yIGNob29zZWNvbWJvIGZpcnN0IiA+PiAkQDsgXAorCSAgICAgICAgZWNobyAiICBleGl0IDEiID4+ICRAOyBcCisJICAgICAgICBlY2hvICJmaSIgPj4gJEA7IFwKKwkgICAgICAgIGVjaG8gImNkIFwkJHtBTkRST0lEX0JVSUxEX1RPUH0iID4+ICRAOyBcCisJICAgICAgICBlY2hvICJjcCAkKFBSSVZBVEVfSU5URVJOQUxfVk5ES19MSUJfTElTVCkgJChQUklWQVRFX0xBVEVTVF9WTkRLX0xJQl9MSVNUKSIgPj4gJEA7IFwKKwkgICAgICAgIGVjaG8gImVjaG8gJChQUklWQVRFX0xBVEVTVF9WTkRLX0xJQl9MSVNUKSB1cGRhdGVkLiIgPj4gJEAKK2VuZGlmCisJQGNobW9kIGEreCAkQAorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKIExPQ0FMX01PRFVMRSA6PSB2bmRrX3BhY2thZ2UKIExPQ0FMX1JFUVVJUkVEX01PRFVMRVMgOj0gXAogICAgICQoYWRkc3VmZml4IC52ZW5kb3IsJChWTkRLX0NPUkVfTElCUkFSSUVTKSkgXApAQCAtOSw1ICs5NCwxMiBAQAogICAgICQoTExOREtfTElCUkFSSUVTKSBcCiAgICAgbGxuZGsubGlicmFyaWVzLnR4dCBcCiAgICAgdm5ka3NwLmxpYnJhcmllcy50eHQKLQogaW5jbHVkZSAkKEJVSUxEX1BIT05ZX1BBQ0tBR0UpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorTE9DQUxfTU9EVUxFIDo9IHZuZGtfc25hcHNob3RfcGFja2FnZQorTE9DQUxfUkVRVUlSRURfTU9EVUxFUyA6PSBcCisgICAgJChmb3JlYWNoIHZuZGtfdmVyLCQoUFJPRFVDVF9FWFRSQV9WTkRLX1ZFUlNJT05TKSx2bmRrX3YkKHZuZGtfdmVyKV8kKFRBUkdFVF9BUkNIKSkKK2luY2x1ZGUgJChCVUlMRF9QSE9OWV9QQUNLQUdFKQorCitlbmRpZiAjIEJPQVJEX1ZOREtfVkVSU0lPTiBpcyBzZXQKZGlmZiAtLWdpdCBhL3RhcmdldC9wcm9kdWN0L3ZuZGsvY3VycmVudC50eHQgYi90YXJnZXQvcHJvZHVjdC92bmRrL2N1cnJlbnQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxMmU5MWMKLS0tIC9kZXYvbnVsbAorKysgYi90YXJnZXQvcHJvZHVjdC92bmRrL2N1cnJlbnQudHh0CkBAIC0wLDAgKzEsMjUyIEBACitMTE5ESzogbGliRUdMLnNvCitMTE5ESzogbGliR0xFU3YxX0NNLnNvCitMTE5ESzogbGliR0xFU3YyLnNvCitMTE5ESzogbGliR0xFU3YzLnNvCitMTE5ESzogbGliUlMuc28KK0xMTkRLOiBsaWJhbmRyb2lkX25ldC5zbworTExOREs6IGxpYmMuc28KK0xMTkRLOiBsaWJkbC5zbworTExOREs6IGxpYmZ0Mi5zbworTExOREs6IGxpYmxvZy5zbworTExOREs6IGxpYm0uc28KK0xMTkRLOiBsaWJtZWRpYW5kay5zbworTExOREs6IGxpYm5hdGl2ZXdpbmRvdy5zbworTExOREs6IGxpYm5ldXJhbG5ldHdvcmtzLnNvCitMTE5ESzogbGlic3luYy5zbworTExOREs6IGxpYnZuZGtzdXBwb3J0LnNvCitMTE5ESzogbGlidnVsa2FuLnNvCitWTkRLLVNQOiBhbmRyb2lkLmhhcmR3YXJlLmdyYXBoaWNzLmNvbW1vbkAxLjAuc28KK1ZOREstU1A6IGFuZHJvaWQuaGFyZHdhcmUuZ3JhcGhpY3MuY29tbW9uQDEuMS5zbworVk5ESy1TUDogYW5kcm9pZC5oYXJkd2FyZS5ncmFwaGljcy5tYXBwZXJAMi4wLnNvCitWTkRLLVNQOiBhbmRyb2lkLmhhcmR3YXJlLmdyYXBoaWNzLm1hcHBlckAyLjEuc28KK1ZOREstU1A6IGFuZHJvaWQuaGFyZHdhcmUucmVuZGVyc2NyaXB0QDEuMC5zbworVk5ESy1TUDogYW5kcm9pZC5oaWRsLm1lbW9yeS50b2tlbkAxLjAuc28KK1ZOREstU1A6IGFuZHJvaWQuaGlkbC5tZW1vcnlAMS4wLnNvCitWTkRLLVNQOiBhbmRyb2lkLmhpZGwubWVtb3J5QDEuMC1pbXBsLnNvCitWTkRLLVNQOiBsaWJSU0NwdVJlZi5zbworVk5ESy1TUDogbGliUlNEcml2ZXIuc28KK1ZOREstU1A6IGxpYlJTX2ludGVybmFsLnNvCitWTkRLLVNQOiBsaWJiYWNrdHJhY2Uuc28KK1ZOREstU1A6IGxpYmJhc2Uuc28KK1ZOREstU1A6IGxpYmJjaW5mby5zbworVk5ESy1TUDogbGliYmxhcy5zbworVk5ESy1TUDogbGliYysrLnNvCitWTkRLLVNQOiBsaWJjb21waWxlcl9ydC5zbworVk5ESy1TUDogbGliY3V0aWxzLnNvCitWTkRLLVNQOiBsaWJoYXJkd2FyZS5zbworVk5ESy1TUDogbGliaGlkbGJhc2Uuc28KK1ZOREstU1A6IGxpYmhpZGxtZW1vcnkuc28KK1ZOREstU1A6IGxpYmhpZGx0cmFuc3BvcnQuc28KK1ZOREstU1A6IGxpYmh3YmluZGVyLnNvCitWTkRLLVNQOiBsaWJod2JpbmRlcl9ub2x0b3Bnby5zbworVk5ESy1TUDogbGliaW9uLnNvCitWTkRLLVNQOiBsaWJsem1hLnNvCitWTkRLLVNQOiBsaWJ1bndpbmQuc28KK1ZOREstU1A6IGxpYnVud2luZHN0YWNrLnNvCitWTkRLLVNQOiBsaWJ1dGlscy5zbworVk5ESy1TUDogbGlidXRpbHNjYWxsc3RhY2suc28KK1ZOREstU1A6IGxpYnouc28KK1ZOREstY29yZTogYW5kcm9pZC5mcmFtZXdvcmtzLmRpc3BsYXlzZXJ2aWNlQDEuMC5zbworVk5ESy1jb3JlOiBhbmRyb2lkLmZyYW1ld29ya3Muc2NoZWR1bGVyc2VydmljZUAxLjAuc28KK1ZOREstY29yZTogYW5kcm9pZC5mcmFtZXdvcmtzLnNlbnNvcnNlcnZpY2VAMS4wLnNvCitWTkRLLWNvcmU6IGFuZHJvaWQuZnJhbWV3b3Jrcy52ci5jb21wb3NlckAxLjAuc28KK1ZOREstY29yZTogYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5jb21tb24tdXRpbC5zbworVk5ESy1jb3JlOiBhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmNvbW1vbkAyLjAuc28KK1ZOREstY29yZTogYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5jb21tb25AMi4wLXV0aWwuc28KK1ZOREstY29yZTogYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5jb21tb25ANC4wLnNvCitWTkRLLWNvcmU6IGFuZHJvaWQuaGFyZHdhcmUuYXVkaW8uY29tbW9uQDQuMC11dGlsLnNvCitWTkRLLWNvcmU6IGFuZHJvaWQuaGFyZHdhcmUuYXVkaW8uZWZmZWN0QDIuMC5zbworVk5ESy1jb3JlOiBhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmVmZmVjdEA0LjAuc28KK1ZOREstY29yZTogYW5kcm9pZC5oYXJkd2FyZS5hdWRpb0AyLjAuc28KK1ZOREstY29yZTogYW5kcm9pZC5oYXJkd2FyZS5hdWRpb0A0LjAuc28KK1ZOREstY29yZTogYW5kcm9pZC5oYXJkd2FyZS5hdXRoc2VjcmV0QDEuMC5zbworVk5ESy1jb3JlOiBhbmRyb2lkLmhhcmR3YXJlLmF1dG9tb3RpdmUuYXVkaW9jb250cm9sQDEuMC5zbworVk5ESy1jb3JlOiBhbmRyb2lkLmhhcmR3YXJlLmF1dG9tb3RpdmUuZXZzQDEuMC5zbworVk5ESy1jb3JlOiBhbmRyb2lkLmhhcmR3YXJlLmF1dG9tb3RpdmUudmVoaWNsZUAyLjAuc28KK1ZOREstY29yZTogYW5kcm9pZC5oYXJkd2FyZS5iaW9tZXRyaWNzLmZpbmdlcnByaW50QDIuMS5zbworVk5ESy1jb3JlOiBhbmRyb2lkLmhhcmR3YXJlLmJsdWV0b290aC5hMmRwQDEuMC5zbworVk5ESy1jb3JlOiBhbmRyb2lkLmhhcmR3YXJlLmJsdWV0b290aEAxLjAuc28KK1ZOREstY29yZTogYW5kcm9pZC5oYXJkd2FyZS5ib290QDEuMC5zbworVk5ESy1jb3JlOiBhbmRyb2lkLmhhcmR3YXJlLmJyb2FkY2FzdHJhZGlvQDEuMC5zbworVk5ESy1jb3JlOiBhbmRyb2lkLmhhcmR3YXJlLmJyb2FkY2FzdHJhZGlvQDEuMS5zbworVk5ESy1jb3JlOiBhbmRyb2lkLmhhcmR3YXJlLmJyb2FkY2FzdHJhZGlvQDIuMC5zbworVk5ESy1jb3JlOiBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5jb21tb25AMS4wLnNvCitWTkRLLWNvcmU6IGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmRldmljZUAxLjAuc28KK1ZOREstY29yZTogYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuZGV2aWNlQDMuMi5zbworVk5ESy1jb3JlOiBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5kZXZpY2VAMy4zLnNvCitWTkRLLWNvcmU6IGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmRldmljZUAzLjQuc28KK1ZOREstY29yZTogYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEubWV0YWRhdGFAMy4yLnNvCitWTkRLLWNvcmU6IGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLm1ldGFkYXRhQDMuMy5zbworVk5ESy1jb3JlOiBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5wcm92aWRlckAyLjQuc28KK1ZOREstY29yZTogYW5kcm9pZC5oYXJkd2FyZS5jYXMubmF0aXZlQDEuMC5zbworVk5ESy1jb3JlOiBhbmRyb2lkLmhhcmR3YXJlLmNhc0AxLjAuc28KK1ZOREstY29yZTogYW5kcm9pZC5oYXJkd2FyZS5jb25maWdzdG9yZS11dGlscy5zbworVk5ESy1jb3JlOiBhbmRyb2lkLmhhcmR3YXJlLmNvbmZpZ3N0b3JlQDEuMC5zbworVk5ESy1jb3JlOiBhbmRyb2lkLmhhcmR3YXJlLmNvbmZpZ3N0b3JlQDEuMS5zbworVk5ESy1jb3JlOiBhbmRyb2lkLmhhcmR3YXJlLmNvbmZpcm1hdGlvbnVpLXN1cHBvcnQtbGliLnNvCitWTkRLLWNvcmU6IGFuZHJvaWQuaGFyZHdhcmUuY29uZmlybWF0aW9udWlAMS4wLnNvCitWTkRLLWNvcmU6IGFuZHJvaWQuaGFyZHdhcmUuY29udGV4dGh1YkAxLjAuc28KK1ZOREstY29yZTogYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4wLnNvCitWTkRLLWNvcmU6IGFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMS5zbworVk5ESy1jb3JlOiBhbmRyb2lkLmhhcmR3YXJlLmR1bXBzdGF0ZUAxLjAuc28KK1ZOREstY29yZTogYW5kcm9pZC5oYXJkd2FyZS5nYXRla2VlcGVyQDEuMC5zbworVk5ESy1jb3JlOiBhbmRyb2lkLmhhcmR3YXJlLmduc3NAMS4wLnNvCitWTkRLLWNvcmU6IGFuZHJvaWQuaGFyZHdhcmUuZ25zc0AxLjEuc28KK1ZOREstY29yZTogYW5kcm9pZC5oYXJkd2FyZS5ncmFwaGljcy5hbGxvY2F0b3JAMi4wLnNvCitWTkRLLWNvcmU6IGFuZHJvaWQuaGFyZHdhcmUuZ3JhcGhpY3MuYnVmZmVycXVldWVAMS4wLnNvCitWTkRLLWNvcmU6IGFuZHJvaWQuaGFyZHdhcmUuZ3JhcGhpY3MuY29tcG9zZXJAMi4xLnNvCitWTkRLLWNvcmU6IGFuZHJvaWQuaGFyZHdhcmUuZ3JhcGhpY3MuY29tcG9zZXJAMi4yLnNvCitWTkRLLWNvcmU6IGFuZHJvaWQuaGFyZHdhcmUuaGVhbHRoQDEuMC5zbworVk5ESy1jb3JlOiBhbmRyb2lkLmhhcmR3YXJlLmhlYWx0aEAyLjAuc28KK1ZOREstY29yZTogYW5kcm9pZC5oYXJkd2FyZS5pckAxLjAuc28KK1ZOREstY29yZTogYW5kcm9pZC5oYXJkd2FyZS5rZXltYXN0ZXJAMy4wLnNvCitWTkRLLWNvcmU6IGFuZHJvaWQuaGFyZHdhcmUua2V5bWFzdGVyQDQuMC5zbworVk5ESy1jb3JlOiBhbmRyb2lkLmhhcmR3YXJlLmxpZ2h0QDIuMC5zbworVk5ESy1jb3JlOiBhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmJ1ZmZlcnBvb2xAMS4wLnNvCitWTkRLLWNvcmU6IGFuZHJvaWQuaGFyZHdhcmUubWVkaWEub214QDEuMC5zbworVk5ESy1jb3JlOiBhbmRyb2lkLmhhcmR3YXJlLm1lZGlhQDEuMC5zbworVk5ESy1jb3JlOiBhbmRyb2lkLmhhcmR3YXJlLm1lbXRyYWNrQDEuMC5zbworVk5ESy1jb3JlOiBhbmRyb2lkLmhhcmR3YXJlLm5ldXJhbG5ldHdvcmtzQDEuMC5zbworVk5ESy1jb3JlOiBhbmRyb2lkLmhhcmR3YXJlLm5ldXJhbG5ldHdvcmtzQDEuMS5zbworVk5ESy1jb3JlOiBhbmRyb2lkLmhhcmR3YXJlLm5mY0AxLjAuc28KK1ZOREstY29yZTogYW5kcm9pZC5oYXJkd2FyZS5uZmNAMS4xLnNvCitWTkRLLWNvcmU6IGFuZHJvaWQuaGFyZHdhcmUub2VtbG9ja0AxLjAuc28KK1ZOREstY29yZTogYW5kcm9pZC5oYXJkd2FyZS5wb3dlckAxLjAuc28KK1ZOREstY29yZTogYW5kcm9pZC5oYXJkd2FyZS5wb3dlckAxLjEuc28KK1ZOREstY29yZTogYW5kcm9pZC5oYXJkd2FyZS5wb3dlckAxLjIuc28KK1ZOREstY29yZTogYW5kcm9pZC5oYXJkd2FyZS5yYWRpby5jb25maWdAMS4wLnNvCitWTkRLLWNvcmU6IGFuZHJvaWQuaGFyZHdhcmUucmFkaW8uZGVwcmVjYXRlZEAxLjAuc28KK1ZOREstY29yZTogYW5kcm9pZC5oYXJkd2FyZS5yYWRpb0AxLjAuc28KK1ZOREstY29yZTogYW5kcm9pZC5oYXJkd2FyZS5yYWRpb0AxLjEuc28KK1ZOREstY29yZTogYW5kcm9pZC5oYXJkd2FyZS5yYWRpb0AxLjIuc28KK1ZOREstY29yZTogYW5kcm9pZC5oYXJkd2FyZS5zZWN1cmVfZWxlbWVudEAxLjAuc28KK1ZOREstY29yZTogYW5kcm9pZC5oYXJkd2FyZS5zZW5zb3JzQDEuMC5zbworVk5ESy1jb3JlOiBhbmRyb2lkLmhhcmR3YXJlLnNvdW5kdHJpZ2dlckAyLjAuc28KK1ZOREstY29yZTogYW5kcm9pZC5oYXJkd2FyZS5zb3VuZHRyaWdnZXJAMi4wLWNvcmUuc28KK1ZOREstY29yZTogYW5kcm9pZC5oYXJkd2FyZS5zb3VuZHRyaWdnZXJAMi4xLnNvCitWTkRLLWNvcmU6IGFuZHJvaWQuaGFyZHdhcmUudGV0aGVyb2ZmbG9hZC5jb25maWdAMS4wLnNvCitWTkRLLWNvcmU6IGFuZHJvaWQuaGFyZHdhcmUudGV0aGVyb2ZmbG9hZC5jb250cm9sQDEuMC5zbworVk5ESy1jb3JlOiBhbmRyb2lkLmhhcmR3YXJlLnRoZXJtYWxAMS4wLnNvCitWTkRLLWNvcmU6IGFuZHJvaWQuaGFyZHdhcmUudGhlcm1hbEAxLjEuc28KK1ZOREstY29yZTogYW5kcm9pZC5oYXJkd2FyZS50di5jZWNAMS4wLnNvCitWTkRLLWNvcmU6IGFuZHJvaWQuaGFyZHdhcmUudHYuaW5wdXRAMS4wLnNvCitWTkRLLWNvcmU6IGFuZHJvaWQuaGFyZHdhcmUudXNiLmdhZGdldEAxLjAuc28KK1ZOREstY29yZTogYW5kcm9pZC5oYXJkd2FyZS51c2JAMS4wLnNvCitWTkRLLWNvcmU6IGFuZHJvaWQuaGFyZHdhcmUudXNiQDEuMS5zbworVk5ESy1jb3JlOiBhbmRyb2lkLmhhcmR3YXJlLnZpYnJhdG9yQDEuMC5zbworVk5ESy1jb3JlOiBhbmRyb2lkLmhhcmR3YXJlLnZpYnJhdG9yQDEuMS5zbworVk5ESy1jb3JlOiBhbmRyb2lkLmhhcmR3YXJlLnZpYnJhdG9yQDEuMi5zbworVk5ESy1jb3JlOiBhbmRyb2lkLmhhcmR3YXJlLnZyQDEuMC5zbworVk5ESy1jb3JlOiBhbmRyb2lkLmhhcmR3YXJlLndlYXZlckAxLjAuc28KK1ZOREstY29yZTogYW5kcm9pZC5oYXJkd2FyZS53aWZpLmhvc3RhcGRAMS4wLnNvCitWTkRLLWNvcmU6IGFuZHJvaWQuaGFyZHdhcmUud2lmaS5vZmZsb2FkQDEuMC5zbworVk5ESy1jb3JlOiBhbmRyb2lkLmhhcmR3YXJlLndpZmkuc3VwcGxpY2FudEAxLjAuc28KK1ZOREstY29yZTogYW5kcm9pZC5oYXJkd2FyZS53aWZpLnN1cHBsaWNhbnRAMS4xLnNvCitWTkRLLWNvcmU6IGFuZHJvaWQuaGFyZHdhcmUud2lmaUAxLjAuc28KK1ZOREstY29yZTogYW5kcm9pZC5oYXJkd2FyZS53aWZpQDEuMS5zbworVk5ESy1jb3JlOiBhbmRyb2lkLmhhcmR3YXJlLndpZmlAMS4yLnNvCitWTkRLLWNvcmU6IGFuZHJvaWQuaGlkbC5hbGxvY2F0b3JAMS4wLnNvCitWTkRLLWNvcmU6IGFuZHJvaWQuaGlkbC5tZW1vcnkuYmxvY2tAMS4wLnNvCitWTkRLLWNvcmU6IGFuZHJvaWQuaGlkbC50b2tlbkAxLjAuc28KK1ZOREstY29yZTogYW5kcm9pZC5oaWRsLnRva2VuQDEuMC11dGlscy5zbworVk5ESy1jb3JlOiBhbmRyb2lkLnN5c3RlbS5uZXQubmV0ZEAxLjAuc28KK1ZOREstY29yZTogYW5kcm9pZC5zeXN0ZW0ubmV0Lm5ldGRAMS4xLnNvCitWTkRLLWNvcmU6IGFuZHJvaWQuc3lzdGVtLndpZmkua2V5c3RvcmVAMS4wLnNvCitWTkRLLWNvcmU6IGxpYmFkZi5zbworVk5ESy1jb3JlOiBsaWJhdWRpb3JvdXRlLnNvCitWTkRLLWNvcmU6IGxpYmF1ZGlvdXRpbHMuc28KK1ZOREstY29yZTogbGliYmluZGVyLnNvCitWTkRLLWNvcmU6IGxpYmNhbWVyYV9tZXRhZGF0YS5zbworVk5ESy1jb3JlOiBsaWJjYXAuc28KK1ZOREstY29yZTogbGliY24tY2Jvci5zbworVk5ESy1jb3JlOiBsaWJjcnlwdG8uc28KK1ZOREstY29yZTogbGliY3J5cHRvX3V0aWxzLnNvCitWTkRLLWNvcmU6IGxpYmN1cmwuc28KK1ZOREstY29yZTogbGliZGlza2NvbmZpZy5zbworVk5ESy1jb3JlOiBsaWJkdW1wc3RhdGV1dGlsLnNvCitWTkRLLWNvcmU6IGxpYmV2ZW50LnNvCitWTkRLLWNvcmU6IGxpYmV4aWYuc28KK1ZOREstY29yZTogbGliZXhwYXQuc28KK1ZOREstY29yZTogbGliZm1xLnNvCitWTkRLLWNvcmU6IGxpYmdhdGVrZWVwZXIuc28KK1ZOREstY29yZTogbGliZ3VpLnNvCitWTkRLLWNvcmU6IGxpYmhhcmR3YXJlX2xlZ2FjeS5zbworVk5ESy1jb3JlOiBsaWJoaWRsYWxsb2NhdG9ydXRpbHMuc28KK1ZOREstY29yZTogbGliaGlkbGNhY2hlLnNvCitWTkRLLWNvcmU6IGxpYmpwZWcuc28KK1ZOREstY29yZTogbGlia2V5bWFzdGVyX21lc3NhZ2VzLnNvCitWTkRLLWNvcmU6IGxpYmtleW1hc3Rlcl9wb3J0YWJsZS5zbworVk5ESy1jb3JlOiBsaWJsZGFjQlRfYWJyLnNvCitWTkRLLWNvcmU6IGxpYmxkYWNCVF9lbmMuc28KK1ZOREstY29yZTogbGlibHo0LnNvCitWTkRLLWNvcmU6IGxpYm1lZGlhX2hlbHBlci5zbworVk5ESy1jb3JlOiBsaWJtZWRpYV9vbXguc28KK1ZOREstY29yZTogbGlibWVtdHJhY2suc28KK1ZOREstY29yZTogbGlibWluaWphaWwuc28KK1ZOREstY29yZTogbGlibWtib290aW1nX2FiaV9jaGVjay5zbworVk5ESy1jb3JlOiBsaWJuZXR1dGlscy5zbworVk5ESy1jb3JlOiBsaWJubC5zbworVk5ESy1jb3JlOiBsaWJvcHVzLnNvCitWTkRLLWNvcmU6IGxpYnBhZ2VtYXAuc28KK1ZOREstY29yZTogbGlicGNyZTIuc28KK1ZOREstY29yZTogbGlicGlleC5zbworVk5ESy1jb3JlOiBsaWJwbmcuc28KK1ZOREstY29yZTogbGlicG93ZXIuc28KK1ZOREstY29yZTogbGlicHJvY2luZm8uc28KK1ZOREstY29yZTogbGlicHJvdG9idWYtY3BwLWZ1bGwuc28KK1ZOREstY29yZTogbGlicHJvdG9idWYtY3BwLWxpdGUuc28KK1ZOREstY29yZTogbGlicHVyZXNvZnRrZXltYXN0ZXJkZXZpY2Uuc28KK1ZOREstY29yZTogbGlicmFkaW9fbWV0YWRhdGEuc28KK1ZOREstY29yZTogbGlic2VsaW51eC5zbworVk5ESy1jb3JlOiBsaWJzb2Z0a2V5bWFzdGVyZGV2aWNlLnNvCitWTkRLLWNvcmU6IGxpYnNwZWV4cmVzYW1wbGVyLnNvCitWTkRLLWNvcmU6IGxpYnNxbGl0ZS5zbworVk5ESy1jb3JlOiBsaWJzc2wuc28KK1ZOREstY29yZTogbGlic3RhZ2VmcmlnaHRfYW1ybmJfY29tbW9uLnNvCitWTkRLLWNvcmU6IGxpYnN0YWdlZnJpZ2h0X2J1ZmZlcnF1ZXVlX2hlbHBlci5zbworVk5ESy1jb3JlOiBsaWJzdGFnZWZyaWdodF9lbmNfY29tbW9uLnNvCitWTkRLLWNvcmU6IGxpYnN0YWdlZnJpZ2h0X2ZsYWNkZWMuc28KK1ZOREstY29yZTogbGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbi5zbworVk5ESy1jb3JlOiBsaWJzdGFnZWZyaWdodF9vbXguc28KK1ZOREstY29yZTogbGlic3RhZ2VmcmlnaHRfb214X3V0aWxzLnNvCitWTkRLLWNvcmU6IGxpYnN0YWdlZnJpZ2h0X3NvZnRfYWFjZGVjLnNvCitWTkRLLWNvcmU6IGxpYnN0YWdlZnJpZ2h0X3NvZnRfYWFjZW5jLnNvCitWTkRLLWNvcmU6IGxpYnN0YWdlZnJpZ2h0X3NvZnRfYW1yZGVjLnNvCitWTkRLLWNvcmU6IGxpYnN0YWdlZnJpZ2h0X3NvZnRfYW1ybmJlbmMuc28KK1ZOREstY29yZTogbGlic3RhZ2VmcmlnaHRfc29mdF9hbXJ3YmVuYy5zbworVk5ESy1jb3JlOiBsaWJzdGFnZWZyaWdodF9zb2Z0X2F2Y2RlYy5zbworVk5ESy1jb3JlOiBsaWJzdGFnZWZyaWdodF9zb2Z0X2F2Y2VuYy5zbworVk5ESy1jb3JlOiBsaWJzdGFnZWZyaWdodF9zb2Z0X2ZsYWNkZWMuc28KK1ZOREstY29yZTogbGlic3RhZ2VmcmlnaHRfc29mdF9mbGFjZW5jLnNvCitWTkRLLWNvcmU6IGxpYnN0YWdlZnJpZ2h0X3NvZnRfZzcxMWRlYy5zbworVk5ESy1jb3JlOiBsaWJzdGFnZWZyaWdodF9zb2Z0X2dzbWRlYy5zbworVk5ESy1jb3JlOiBsaWJzdGFnZWZyaWdodF9zb2Z0X2hldmNkZWMuc28KK1ZOREstY29yZTogbGlic3RhZ2VmcmlnaHRfc29mdF9tcDNkZWMuc28KK1ZOREstY29yZTogbGlic3RhZ2VmcmlnaHRfc29mdF9tcGVnMmRlYy5zbworVk5ESy1jb3JlOiBsaWJzdGFnZWZyaWdodF9zb2Z0X21wZWc0ZGVjLnNvCitWTkRLLWNvcmU6IGxpYnN0YWdlZnJpZ2h0X3NvZnRfbXBlZzRlbmMuc28KK1ZOREstY29yZTogbGlic3RhZ2VmcmlnaHRfc29mdF9vcHVzZGVjLnNvCitWTkRLLWNvcmU6IGxpYnN0YWdlZnJpZ2h0X3NvZnRfcmF3ZGVjLnNvCitWTkRLLWNvcmU6IGxpYnN0YWdlZnJpZ2h0X3NvZnRfdm9yYmlzZGVjLnNvCitWTkRLLWNvcmU6IGxpYnN0YWdlZnJpZ2h0X3NvZnRfdnB4ZGVjLnNvCitWTkRLLWNvcmU6IGxpYnN0YWdlZnJpZ2h0X3NvZnRfdnB4ZW5jLnNvCitWTkRLLWNvcmU6IGxpYnN0YWdlZnJpZ2h0X3htbHBhcnNlci5zbworVk5ESy1jb3JlOiBsaWJzdXNwZW5kLnNvCitWTkRLLWNvcmU6IGxpYnN5c3V0aWxzLnNvCitWTkRLLWNvcmU6IGxpYnRpbnlhbHNhLnNvCitWTkRLLWNvcmU6IGxpYnRpbnl4bWwyLnNvCitWTkRLLWNvcmU6IGxpYnVpLnNvCitWTkRLLWNvcmU6IGxpYnVzYmhvc3Quc28KK1ZOREstY29yZTogbGlidml4bC1hcm0uc28KK1ZOREstY29yZTogbGlidml4bC1hcm02NC5zbworVk5ESy1jb3JlOiBsaWJ2b3JiaXNpZGVjLnNvCitWTkRLLWNvcmU6IGxpYndpZmktc3lzdGVtLWlmYWNlLnNvCitWTkRLLWNvcmU6IGxpYnhtbDIuc28KK1ZOREstY29yZTogbGlieXV2LnNvCitWTkRLLWNvcmU6IGxpYnppcGFyY2hpdmUuc28KK1ZOREstcHJpdmF0ZTogbGliYmFja3RyYWNlLnNvCitWTkRLLXByaXZhdGU6IGxpYmJsYXMuc28KK1ZOREstcHJpdmF0ZTogbGliY29tcGlsZXJfcnQuc28KK1ZOREstcHJpdmF0ZTogbGliZnQyLnNvCitWTkRLLXByaXZhdGU6IGxpYmd1aS5zbworVk5ESy1wcml2YXRlOiBsaWJ1bndpbmQuc28KZGlmZiAtLWdpdCBhL3RhcmdldC9wcm9kdWN0L3ZuZGsvaW5pdC5nc2kucmMgYi90YXJnZXQvcHJvZHVjdC92bmRrL2luaXQuZ3NpLnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxNTBiMWEKLS0tIC9kZXYvbnVsbAorKysgYi90YXJnZXQvcHJvZHVjdC92bmRrL2luaXQuZ3NpLnJjCkBAIC0wLDAgKzEsMiBAQAorIyBJZiByby52bmRrLnZlcnNpb24gaXMgbm90IGRlZmluZWQsIGltcG9ydCBpbml0LnZuZGstMjcucmMuCitpbXBvcnQgL3N5c3RlbS9ldGMvaW5pdC9nc2kvaW5pdC52bmRrLSR7cm8udm5kay52ZXJzaW9uOi0yN30ucmMKZGlmZiAtLWdpdCBhL3RhcmdldC9wcm9kdWN0L3ZuZGsvaW5pdC52bmRrLTI3LnJjIGIvdGFyZ2V0L3Byb2R1Y3Qvdm5kay9pbml0LnZuZGstMjcucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQ2NGEyZgotLS0gL2Rldi9udWxsCisrKyBiL3RhcmdldC9wcm9kdWN0L3ZuZGsvaW5pdC52bmRrLTI3LnJjCkBAIC0wLDAgKzEsMyBAQAorb24gZWFybHktaW5pdAorICAgICMgU2V0IHJvLnZuZGsudmVyc2lvbiB0byAyNyBzbyB0aGF0IE8tTVIxLVZFTkRPUiBjYW4gcnVuIGxhdGVzdCBHU0kuCisgICAgc2V0cHJvcCByby52bmRrLnZlcnNpb24gMjcKZGlmZiAtLWdpdCBhL3Rvb2xzL0FuZHJvaWQubWsgYi90b29scy9BbmRyb2lkLm1rCmluZGV4IDkwNzNhYzMuLmMwNWQ2ODEgMTAwNjQ0Ci0tLSBhL3Rvb2xzL0FuZHJvaWQubWsKKysrIGIvdG9vbHMvQW5kcm9pZC5tawpAQCAtMTYsNCArMTYsOCBAQAogCiBMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCiAKKyMgT25seSBpZiB0aGlzIEFuZHJvaWQubWsgd2FzIGluY2x1ZGVkIG5vdCBieSBhIHN5bWxpbmsgc2hvdWxkIGl0IGJlIHVzZWQuCisjIFRoaXMgZmFjaWxpdGF0ZXMgdGhlIHRyYW5zaXRpb24gYXdheSBmcm9tIHN5bWxpbmtzOiBiLzY0Mzk3OTYwCitpZmVxICgkKExPQ0FMX1BBVEgpLGJ1aWxkL21ha2UvdG9vbHMpCiBpbmNsdWRlICQoY2FsbCBhbGwtbWFrZWZpbGVzLXVuZGVyLCQoTE9DQUxfUEFUSCkpCitlbmRpZgpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNwL0FuZHJvaWQuYnAgYi90b29scy9hY3AvQW5kcm9pZC5icAppbmRleCBmYWYyMDM0Li42NGY1YTEwIDEwMDY0NAotLS0gYS90b29scy9hY3AvQW5kcm9pZC5icAorKysgYi90b29scy9hY3AvQW5kcm9pZC5icApAQCAtNSw2ICs1LDcgQEAKIGNjX2JpbmFyeV9ob3N0IHsKIAogICAgIHNyY3M6IFsiYWNwLmMiXSwKKyAgICBjZmxhZ3M6IFsiLVdhbGwiLCAiLVdlcnJvciJdLAogCiAgICAgc3RhdGljX2xpYnM6IFsibGliaG9zdCJdLAogICAgIG5hbWU6ICJhY3AiLApkaWZmIC0tZ2l0IGEvdG9vbHMvYWNwL2FjcC5jIGIvdG9vbHMvYWNwL2FjcC5jCmluZGV4IGViMWRlMWYuLmQ0YTlmYmMgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2FjcC9hY3AuYworKysgYi90b29scy9hY3AvYWNwLmMKQEAgLTQxLDEwICs0MSw5IEBACiBpbnQgcHJvY2VzcyhpbnQgYXJnYywgY2hhciogY29uc3QgYXJndltdLCB1bnNpZ25lZCBpbnQgb3B0aW9ucykKIHsKICAgICBpbnQgcmV0VmFsID0gMDsKLSAgICBpbnQgaSwgY2M7CisgICAgaW50IGk7CiAgICAgY2hhciogc3RyaXBEZXN0ID0gTlVMTDsKICAgICBpbnQgc3RyaXBEZXN0TGVuOwotICAgIHN0cnVjdCBzdGF0IGRlc3RTdGF0OwogICAgIGJvb2wgZGVzdE11c3RCZURpciA9IGZhbHNlOwogICAgIHN0cnVjdCBzdGF0IHNiOwogCmRpZmYgLS1naXQgYS90b29scy9hZGJzIGIvdG9vbHMvYWRicwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYThmMDZjMC4uMDAwMDAwMAotLS0gYS90b29scy9hZGJzCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCi0KLSMgQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICdMaWNlbnNlJyk7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gJ0FTIElTJyBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLWltcG9ydCBvcwotaW1wb3J0IG9zLnBhdGgKLWltcG9ydCByZQotaW1wb3J0IHN0cmluZwotaW1wb3J0IHN5cwotCi1zeXMucGF0aC5pbnNlcnQoMCwgb3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSArICIvLi4vLi4vZGV2ZWxvcG1lbnQvc2NyaXB0cyIpCi1pbXBvcnQgc3RhY2tfY29yZQotaW1wb3J0IHN5bWJvbAotCi1pZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgotICAjIHBhc3MgdGhlIG9wdGlvbnMgdG8gYWRiCi0gIGFkYl9jbWQgID0gImFkYiAiICsgJyAnLmpvaW4oc3lzLmFyZ3ZbMTpdKQotCi0gICMgY3JlYXRlIHRyYWNlciBmb3IgbGluZSBwYXJzaW5nCi0gIHRyYWNlciA9IHN0YWNrX2NvcmUuVHJhY2VDb252ZXJ0ZXIoKQotCi0gICMgaW52b2tlIHRoZSBhZGIgY29tbWFuZCBhbmQgZmlsdGVyIGl0cyBvdXRwdXQKLSAgc3RyZWFtID0gb3MucG9wZW4oYWRiX2NtZCkKLSAgd2hpbGUgKFRydWUpOgotICAgIGxpbmUgPSBzdHJlYW0ucmVhZGxpbmUoKQotICAgIGlmIChsaW5lID09ICcnKToKLSAgICAgIGJyZWFrCi0gICAgaWYodHJhY2VyLlByb2Nlc3NMaW5lKGxpbmUpID09IEZhbHNlKToKLSAgICAgIHByaW50KGxpbmUuc3RyaXAoKSkKLSAgICAgIHN5cy5zdGRvdXQuZmx1c2goKQotCi0gICMgYWRiIGl0c2VsZiBhYm9ydHMKLSAgc3RyZWFtLmNsb3NlKCkKZGlmZiAtLWdpdCBhL3Rvb2xzL2FwaWNoZWNrL0FuZHJvaWQubWsgYi90b29scy9hcGljaGVjay9BbmRyb2lkLm1rCmluZGV4IGI1NDcwNTguLmFiMzQ5M2QgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2FwaWNoZWNrL0FuZHJvaWQubWsKKysrIGIvdG9vbHMvYXBpY2hlY2svQW5kcm9pZC5tawpAQCAtMTIsNyArMTIsNiBAQAogIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCi1pZm5lcSAoJChUQVJHRVRfQlVJTERfUERLKSx0cnVlKQogTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQogCiAjIHRoZSBoYXQgc2NyaXB0CkBAIC0yNiw0ICsyNSwzIEBACiBpbmNsdWRlICQoQlVJTERfUFJFQlVJTFQpCiAKICMgQXBpY2hlY2sgaXMgbm93IHBhcnQgb2YgRG9jbGF2YSAtLSBTZWUgZXh0ZXJuYWwvZG9jbGF2YS4KLWVuZGlmCmRpZmYgLS1naXQgYS90b29scy9hcGljaGVjay9ldGMvYXBpY2hlY2sgYi90b29scy9hcGljaGVjay9ldGMvYXBpY2hlY2sKaW5kZXggYzcxMGM0Ni4uZTRmZmI3NyAxMDA2NDQKLS0tIGEvdG9vbHMvYXBpY2hlY2svZXRjL2FwaWNoZWNrCisrKyBiL3Rvb2xzL2FwaWNoZWNrL2V0Yy9hcGljaGVjawpAQCAtMTgsNyArMTgsNyBAQAogIyBhbmQgc2V0IHVwIHByb2dkaXIgdG8gYmUgdGhlIGZ1bGx5LXF1YWxpZmllZCBwYXRobmFtZSBvZiBpdHMgZGlyZWN0b3J5LgogIwogIyBUaGUgY2xhc3NwYXRoIGFuZCBvdGhlciBqYXZhIG9wdGlvbnMgdXNlZCBpbiBhcGljaGVjayBhcmUgc3BlY2lmaWVkIGluCi0jIGJ1aWxkL2NvcmUvdGFza3MvYXBpY2hlY2subWsuCisjIGJ1aWxkL21ha2UvY29yZS90YXNrcy9hcGljaGVjay5tay4KIAogcHJvZz0iJDAiCiB3aGlsZSBbIC1oICIke3Byb2d9IiBdOyBkbwpkaWZmIC0tZ2l0IGEvdG9vbHMvYXRyZWUvQW5kcm9pZC5icCBiL3Rvb2xzL2F0cmVlL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWZiZTA0MgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2F0cmVlL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwxNCBAQAorLy8gQ29weXJpZ2h0IDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIENvcGllcyBmaWxlcyBpbnRvIHRoZSBkaXJlY3Rvcnkgc3RydWN0dXJlIGRlc2NyaWJlZCBieSBhIG1hbmlmZXN0CisKK2NjX2JpbmFyeV9ob3N0IHsKKyAgICBuYW1lOiAiYXRyZWUiLAorICAgIHNyY3M6IFsKKyAgICAgICAgImF0cmVlLmNwcCIsCisgICAgICAgICJmaWxlcy5jcHAiLAorICAgICAgICAiZnMuY3BwIiwKKyAgICBdLAorICAgIGNmbGFnczogWyItV2FsbCIsICItV2Vycm9yIl0sCisgICAgc3RhdGljX2xpYnM6IFsibGliaG9zdCJdLAorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYXRyZWUvQW5kcm9pZC5tayBiL3Rvb2xzL2F0cmVlL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1OThkYjUuLjAwMDAwMDAKLS0tIGEvdG9vbHMvYXRyZWUvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMgQ29weXJpZ2h0IDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBDb3BpZXMgZmlsZXMgaW50byB0aGUgZGlyZWN0b3J5IHN0cnVjdHVyZSBkZXNjcmliZWQgYnkgYSBtYW5pZmVzdAotCi1MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9TUkNfRklMRVMgOj0gXAotCWF0cmVlLmNwcCBcCi0JZmlsZXMuY3BwIFwKLQlmcy5jcHAKLQotTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBcCi0JbGliaG9zdAotCi1MT0NBTF9NT0RVTEUgOj0gYXRyZWUKLQotaW5jbHVkZSAkKEJVSUxEX0hPU1RfRVhFQ1VUQUJMRSkKLQpkaWZmIC0tZ2l0IGEvdG9vbHMvYXRyZWUvZmlsZXMuY3BwIGIvdG9vbHMvYXRyZWUvZmlsZXMuY3BwCmluZGV4IGQ5NDVmNTguLmQ1YzhhOTcgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2F0cmVlL2ZpbGVzLmNwcAorKysgYi90b29scy9hdHJlZS9maWxlcy5jcHAKQEAgLTQyNSw4ICs0MjUsNiBAQAogICAgICAgICAgICAgICAgIGNvbnN0IHZlY3RvcjxzdHJpbmc+JiBleGNsdWRlcywKICAgICAgICAgICAgICAgICB2ZWN0b3I8RmlsZVJlY29yZD4qIG1vcmUpCiB7Ci0gICAgaW50IGVycjsKLQogICAgIHN0cmluZyBmdWxsID0gcGF0aF9hcHBlbmQocmVjLnNvdXJjZUJhc2UsIHJlYy5zb3VyY2VOYW1lKTsKICAgICBmdWxsID0gcGF0aF9hcHBlbmQoZnVsbCwgcGF0aCk7CiAKZGlmZiAtLWdpdCBhL3Rvb2xzL2F1dG9fZ2VuX3Rlc3RfY29uZmlnLnB5IGIvdG9vbHMvYXV0b19nZW5fdGVzdF9jb25maWcucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYzdjNWJkYwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2F1dG9fZ2VuX3Rlc3RfY29uZmlnLnB5CkBAIC0wLDAgKzEsODkgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIworIyBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIiIiQSB0b29sIHRvIGdlbmVyYXRlIFRyYWRlRmVkIHRlc3QgY29uZmlnIGZpbGUuCisiIiIKKworaW1wb3J0IG9zCitpbXBvcnQgc2h1dGlsCitpbXBvcnQgc3lzCitmcm9tIHhtbC5kb20ubWluaWRvbSBpbXBvcnQgcGFyc2UKKworQVRUUklCVVRFX0xBQkVMID0gJ2FuZHJvaWQ6bGFiZWwnCitBVFRSSUJVVEVfUlVOTkVSID0gJ2FuZHJvaWQ6bmFtZScKK0FUVFJJQlVURV9QQUNLQUdFID0gJ3BhY2thZ2UnCisKK1BMQUNFSE9MREVSX0xBQkVMID0gJ3tMQUJFTH0nCitQTEFDRUhPTERFUl9NT0RVTEUgPSAne01PRFVMRX0nCitQTEFDRUhPTERFUl9QQUNLQUdFID0gJ3tQQUNLQUdFfScKK1BMQUNFSE9MREVSX1JVTk5FUiA9ICd7UlVOTkVSfScKK1BMQUNFSE9MREVSX1RFU1RfVFlQRSA9ICd7VEVTVF9UWVBFfScKKworCitkZWYgbWFpbihhcmd2KToKKyAgIiIiRW50cnkgcG9pbnQgb2YgYXV0b19nZW5fdGVzdF9jb25maWcuCisKKyAgQXJnczoKKyAgICBhcmd2OiBBIGxpc3Qgb2YgYXJndW1lbnRzLgorICBSZXR1cm5zOgorICAgIDAgaWYgbm8gZXJyb3IsIG90aGVyd2lzZSAxLgorICAiIiIKKyAgaWYgbGVuKGFyZ3YpICE9IDQ6CisgICAgc3lzLnN0ZGVyci53cml0ZSgKKyAgICAgICAgJ0ludmFsaWQgYXJndWVtZW50cy4gVGhlIHNjcmlwdCByZXF1aXJlcyA0IGFyZ3VtZW50cyBmb3IgZmlsZSBwYXRoczogJworICAgICAgICAndGFyZ2V0X2NvbmZpZyBhbmRyb2lkX21hbmlmZXN0IGVtcHR5X2NvbmZpZyAnCisgICAgICAgICdpbnN0cnVtZW50YXRpb25fdGVzdF9jb25maWdfdGVtcGxhdGUuXG4nKQorICAgIHJldHVybiAxCisgIHRhcmdldF9jb25maWcgPSBhcmd2WzBdCisgIGFuZHJvaWRfbWFuaWZlc3QgPSBhcmd2WzFdCisgIGVtcHR5X2NvbmZpZyA9IGFyZ3ZbMl0KKyAgaW5zdHJ1bWVudGF0aW9uX3Rlc3RfY29uZmlnX3RlbXBsYXRlID0gYXJndlszXQorCisgIG1hbmlmZXN0ID0gcGFyc2UoYW5kcm9pZF9tYW5pZmVzdCkKKyAgaW5zdHJ1bWVudGF0aW9uX2VsZW1lbnRzID0gbWFuaWZlc3QuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2luc3RydW1lbnRhdGlvbicpCisgIG1hbmlmZXN0X2VsZW1lbnRzID0gbWFuaWZlc3QuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ21hbmlmZXN0JykKKyAgaWYgbGVuKGluc3RydW1lbnRhdGlvbl9lbGVtZW50cykgIT0gMSBvciBsZW4obWFuaWZlc3RfZWxlbWVudHMpICE9IDE6CisgICAgIyBGYWlsZWQgdG8gbG9jYXRlIGluc3RydW1lbnRhdGlvbiBvciBtYW5pZmVzdCBlbGVtZW50IGluIEFuZHJvaWRNYW5pZmVzdC4KKyAgICAjIGZpbGUuIEVtcHR5IHRlc3QgY29uZmlnIGZpbGUgd2lsbCBiZSBjcmVhdGVkLgorICAgIHNodXRpbC5jb3B5ZmlsZShlbXB0eV9jb25maWcsIHRhcmdldF9jb25maWcpCisgICAgcmV0dXJuIDAKKworICBtb2R1bGUgPSBvcy5wYXRoLnNwbGl0ZXh0KG9zLnBhdGguYmFzZW5hbWUodGFyZ2V0X2NvbmZpZykpWzBdCisgIGluc3RydW1lbnRhdGlvbiA9IGluc3RydW1lbnRhdGlvbl9lbGVtZW50c1swXQorICBtYW5pZmVzdCA9IG1hbmlmZXN0X2VsZW1lbnRzWzBdCisgIGlmIGluc3RydW1lbnRhdGlvbi5hdHRyaWJ1dGVzLmhhc19rZXkoQVRUUklCVVRFX0xBQkVMKToKKyAgICBsYWJlbCA9IGluc3RydW1lbnRhdGlvbi5hdHRyaWJ1dGVzW0FUVFJJQlVURV9MQUJFTF0udmFsdWUKKyAgZWxzZToKKyAgICBsYWJlbCA9IG1vZHVsZQorICBydW5uZXIgPSBpbnN0cnVtZW50YXRpb24uYXR0cmlidXRlc1tBVFRSSUJVVEVfUlVOTkVSXS52YWx1ZQorICBwYWNrYWdlID0gbWFuaWZlc3QuYXR0cmlidXRlc1tBVFRSSUJVVEVfUEFDS0FHRV0udmFsdWUKKyAgdGVzdF90eXBlID0gKCdJbnN0cnVtZW50YXRpb25UZXN0JworICAgICAgICAgICAgICAgaWYgcnVubmVyLmVuZHN3aXRoKCcuSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lcicpCisgICAgICAgICAgICAgICBlbHNlICdBbmRyb2lkSlVuaXRUZXN0JykKKworICB3aXRoIG9wZW4oaW5zdHJ1bWVudGF0aW9uX3Rlc3RfY29uZmlnX3RlbXBsYXRlKSBhcyB0ZW1wbGF0ZToKKyAgICBjb25maWcgPSB0ZW1wbGF0ZS5yZWFkKCkKKyAgICBjb25maWcgPSBjb25maWcucmVwbGFjZShQTEFDRUhPTERFUl9MQUJFTCwgbGFiZWwpCisgICAgY29uZmlnID0gY29uZmlnLnJlcGxhY2UoUExBQ0VIT0xERVJfTU9EVUxFLCBtb2R1bGUpCisgICAgY29uZmlnID0gY29uZmlnLnJlcGxhY2UoUExBQ0VIT0xERVJfUEFDS0FHRSwgcGFja2FnZSkKKyAgICBjb25maWcgPSBjb25maWcucmVwbGFjZShQTEFDRUhPTERFUl9URVNUX1RZUEUsIHRlc3RfdHlwZSkKKyAgICBjb25maWcgPSBjb25maWcucmVwbGFjZShQTEFDRUhPTERFUl9SVU5ORVIsIHJ1bm5lcikKKyAgICB3aXRoIG9wZW4odGFyZ2V0X2NvbmZpZywgJ3cnKSBhcyBjb25maWdfZmlsZToKKyAgICAgIGNvbmZpZ19maWxlLndyaXRlKGNvbmZpZykKKyAgcmV0dXJuIDAKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgc3lzLmV4aXQobWFpbihzeXMuYXJndlsxOl0pKQpkaWZmIC0tZ2l0IGEvdG9vbHMvYXV0b19nZW5fdGVzdF9jb25maWdfdGVzdC5weSBiL3Rvb2xzL2F1dG9fZ2VuX3Rlc3RfY29uZmlnX3Rlc3QucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY4YzI3ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2F1dG9fZ2VuX3Rlc3RfY29uZmlnX3Rlc3QucHkKQEAgLTAsMCArMSwxNzMgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIworIyBDb3B5cmlnaHQgMjAxNywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisiIiJVbml0dGVzdHMgZm9yIGF1dG9fZ2VuX3Rlc3RfY29uZmlnLiIiIgorCitpbXBvcnQgb3MKK2ltcG9ydCBzaHV0aWwKK2ltcG9ydCB0ZW1wZmlsZQoraW1wb3J0IHVuaXR0ZXN0CisKK2ltcG9ydCBhdXRvX2dlbl90ZXN0X2NvbmZpZworCitURVNUX01PRFVMRSA9ICdUZXN0TW9kdWxlJworCitNQU5JRkVTVF9JTlZBTElEID0gIiIiPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorPC9tYW5pZmVzdD4KKyIiIgorCitNQU5JRkVTVF9KVU5JVF9URVNUID0gIiIiPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgIHBhY2thZ2U9ImNvbS5hbmRyb2lkLm15LnRlc3RzLngiPgorICAgIDxpbnN0cnVtZW50YXRpb24KKyAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgorICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImNvbS5hbmRyb2lkLm15LnRlc3RzIiAvPgorPC9tYW5pZmVzdD4KKyIiIgorCitNQU5JRkVTVF9JTlNUUlVNRU5UQVRJT05fVEVTVCA9ICIiIjw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICBwYWNrYWdlPSJjb20uYW5kcm9pZC5teS50ZXN0cy54Ij4KKyAgICA8aW5zdHJ1bWVudGF0aW9uCisgICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RSdW5uZXIiCisgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iY29tLmFuZHJvaWQubXkudGVzdHMiCisgICAgICAgIGFuZHJvaWQ6bGFiZWw9Ik15IFRlc3RzIiAvPgorPC9tYW5pZmVzdD4KKyIiIgorCitFWFBFQ1RFRF9KVU5JVF9URVNUX0NPTkZJRyA9ICIiIjw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8IS0tIFRoaXMgdGVzdCBjb25maWcgZmlsZSBpcyBhdXRvLWdlbmVyYXRlZC4gLS0+Cis8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iUnVucyBUZXN0TW9kdWxlLiI+CisgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5zdWl0ZS5TdWl0ZUFwa0luc3RhbGxlciI+CisgICAgICAgIDxvcHRpb24gbmFtZT0idGVzdC1maWxlLW5hbWUiIHZhbHVlPSJUZXN0TW9kdWxlLmFwayIgLz4KKyAgICA8L3RhcmdldF9wcmVwYXJlcj4KKworICAgIDx0ZXN0IGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5BbmRyb2lkSlVuaXRUZXN0IiA+CisgICAgICAgIDxvcHRpb24gbmFtZT0icGFja2FnZSIgdmFsdWU9ImNvbS5hbmRyb2lkLm15LnRlc3RzLngiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0icnVubmVyIiB2YWx1ZT0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIgLz4KKyAgICA8L3Rlc3Q+Cis8L2NvbmZpZ3VyYXRpb24+CisiIiIKKworRVhQRUNURURfSU5TVFJVTUVOVEFUSU9OX1RFU1RfQ09ORklHID0gIiIiPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzwhLS0gVGhpcyB0ZXN0IGNvbmZpZyBmaWxlIGlzIGF1dG8tZ2VuZXJhdGVkLiAtLT4KKzxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJSdW5zIE15IFRlc3RzLiI+CisgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5zdWl0ZS5TdWl0ZUFwa0luc3RhbGxlciI+CisgICAgICAgIDxvcHRpb24gbmFtZT0idGVzdC1maWxlLW5hbWUiIHZhbHVlPSJUZXN0TW9kdWxlLmFwayIgLz4KKyAgICA8L3RhcmdldF9wcmVwYXJlcj4KKworICAgIDx0ZXN0IGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5JbnN0cnVtZW50YXRpb25UZXN0IiA+CisgICAgICAgIDxvcHRpb24gbmFtZT0icGFja2FnZSIgdmFsdWU9ImNvbS5hbmRyb2lkLm15LnRlc3RzLngiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0icnVubmVyIiB2YWx1ZT0iYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RSdW5uZXIiIC8+CisgICAgPC90ZXN0PgorPC9jb25maWd1cmF0aW9uPgorIiIiCisKK1RPT0xTX0RJUiA9IG9zLnBhdGguZGlybmFtZShvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pKQorRU1QVFlfVEVTVF9DT05GSUcgPSBvcy5wYXRoLmpvaW4oCisgICAgVE9PTFNfRElSLCAnLi4nLCAnY29yZScsICdlbXB0eV90ZXN0X2NvbmZpZy54bWwnKQorSU5TVFJVTUVOVEFUSU9OX1RFU1RfQ09ORklHX1RFTVBMQVRFID0gb3MucGF0aC5qb2luKAorICAgIFRPT0xTX0RJUiwgJy4uJywgJ2NvcmUnLCAnaW5zdHJ1bWVudGF0aW9uX3Rlc3RfY29uZmlnX3RlbXBsYXRlLnhtbCcpCisKKworY2xhc3MgQXV0b0dlblRlc3RDb25maWdVbml0dGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAiIiJVbml0dGVzdHMgZm9yIGF1dG9fZ2VuX3Rlc3RfY29uZmlnLiIiIgorCisgIGRlZiBzZXRVcChzZWxmKToKKyAgICAiIiJTZXR1cCBkaXJlY3RvcnkgZm9yIHRlc3QuIiIiCisgICAgc2VsZi50ZXN0X2RpciA9IHRlbXBmaWxlLm1rZHRlbXAoKQorICAgIHNlbGYuY29uZmlnX2ZpbGUgPSBvcy5wYXRoLmpvaW4oc2VsZi50ZXN0X2RpciwgVEVTVF9NT0RVTEUgKyAnLmNvbmZpZycpCisgICAgc2VsZi5tYW5pZmVzdF9maWxlID0gb3MucGF0aC5qb2luKHNlbGYudGVzdF9kaXIsICdBbmRyb2lkTWFuaWZlc3QueG1sJykKKworICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgIiIiQ2xlYW51cCB0aGUgdGVzdCBkaXJlY3RvcnkuIiIiCisgICAgc2h1dGlsLnJtdHJlZShzZWxmLnRlc3RfZGlyLCBpZ25vcmVfZXJyb3JzPVRydWUpCisKKyAgZGVmIHRlc3RJbnZhbGlkTWFuaWZlc3Qoc2VsZik6CisgICAgIiIiQW4gZW1wdHkgdGVzdCBjb25maWcgc2hvdWxkIGJlIGdlbmVyYXRlZCBpZiBBbmRyb2lkTWFuaWZlc3QgaXMgaW52YWxpZC4KKyAgICAiIiIKKyAgICB3aXRoIG9wZW4oc2VsZi5tYW5pZmVzdF9maWxlLCAndycpIGFzIGY6CisgICAgICBmLndyaXRlKE1BTklGRVNUX0lOVkFMSUQpCisKKyAgICBhcmd2ID0gW3NlbGYuY29uZmlnX2ZpbGUsCisgICAgICAgICAgICBzZWxmLm1hbmlmZXN0X2ZpbGUsCisgICAgICAgICAgICBFTVBUWV9URVNUX0NPTkZJRywKKyAgICAgICAgICAgIElOU1RSVU1FTlRBVElPTl9URVNUX0NPTkZJR19URU1QTEFURV0KKyAgICBhdXRvX2dlbl90ZXN0X2NvbmZpZy5tYWluKGFyZ3YpCisgICAgd2l0aCBvcGVuKHNlbGYuY29uZmlnX2ZpbGUpIGFzIGNvbmZpZ19maWxlOgorICAgICAgd2l0aCBvcGVuKEVNUFRZX1RFU1RfQ09ORklHKSBhcyBlbXB0eV9jb25maWc6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29uZmlnX2ZpbGUucmVhZCgpLCBlbXB0eV9jb25maWcucmVhZCgpKQorCisgIGRlZiB0ZXN0Q3JlYXRlSlVuaXRUZXN0Q29uZmlnKHNlbGYpOgorICAgICIiIlRlc3QgY3JlYXRpbmcgdGVzdCBjb25maWcgZm9yIEFuZHJvaWRKVW5pdFRlc3QuCisgICAgIiIiCisgICAgd2l0aCBvcGVuKHNlbGYubWFuaWZlc3RfZmlsZSwgJ3cnKSBhcyBmOgorICAgICAgZi53cml0ZShNQU5JRkVTVF9KVU5JVF9URVNUKQorCisgICAgYXJndiA9IFtzZWxmLmNvbmZpZ19maWxlLAorICAgICAgICAgICAgc2VsZi5tYW5pZmVzdF9maWxlLAorICAgICAgICAgICAgRU1QVFlfVEVTVF9DT05GSUcsCisgICAgICAgICAgICBJTlNUUlVNRU5UQVRJT05fVEVTVF9DT05GSUdfVEVNUExBVEVdCisgICAgYXV0b19nZW5fdGVzdF9jb25maWcubWFpbihhcmd2KQorICAgIHdpdGggb3BlbihzZWxmLmNvbmZpZ19maWxlKSBhcyBjb25maWdfZmlsZToKKyAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29uZmlnX2ZpbGUucmVhZCgpLCBFWFBFQ1RFRF9KVU5JVF9URVNUX0NPTkZJRykKKworICBkZWYgdGVzdENyZWF0ZUluc3RydW1lbnRhdGlvblRlc3RDb25maWcoc2VsZik6CisgICAgIiIiVGVzdCBjcmVhdGluZyB0ZXN0IGNvbmZpZyBmb3IgSW5zdHJ1bWVudGF0aW9uVGVzdC4KKyAgICAiIiIKKyAgICB3aXRoIG9wZW4oc2VsZi5tYW5pZmVzdF9maWxlLCAndycpIGFzIGY6CisgICAgICBmLndyaXRlKE1BTklGRVNUX0lOU1RSVU1FTlRBVElPTl9URVNUKQorCisgICAgYXJndiA9IFtzZWxmLmNvbmZpZ19maWxlLAorICAgICAgICAgICAgc2VsZi5tYW5pZmVzdF9maWxlLAorICAgICAgICAgICAgRU1QVFlfVEVTVF9DT05GSUcsCisgICAgICAgICAgICBJTlNUUlVNRU5UQVRJT05fVEVTVF9DT05GSUdfVEVNUExBVEVdCisgICAgYXV0b19nZW5fdGVzdF9jb25maWcubWFpbihhcmd2KQorICAgIHdpdGggb3BlbihzZWxmLmNvbmZpZ19maWxlKSBhcyBjb25maWdfZmlsZToKKyAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgY29uZmlnX2ZpbGUucmVhZCgpLCBFWFBFQ1RFRF9JTlNUUlVNRU5UQVRJT05fVEVTVF9DT05GSUcpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvdG9vbHMvYnVpbGRpbmZvLnNoIGIvdG9vbHMvYnVpbGRpbmZvLnNoCmluZGV4IGQyMTRhYWIuLjVhNTQ0NjIgMTAwNzU1Ci0tLSBhL3Rvb2xzL2J1aWxkaW5mby5zaAorKysgYi90b29scy9idWlsZGluZm8uc2gKQEAgLTEzLDYgKzEzLDcgQEAKIGVjaG8gInJvLmJ1aWxkLnZlcnNpb24ucmVsZWFzZT0kUExBVEZPUk1fVkVSU0lPTiIKIGVjaG8gInJvLmJ1aWxkLnZlcnNpb24uc2VjdXJpdHlfcGF0Y2g9JFBMQVRGT1JNX1NFQ1VSSVRZX1BBVENIIgogZWNobyAicm8uYnVpbGQudmVyc2lvbi5iYXNlX29zPSRQTEFURk9STV9CQVNFX09TIgorZWNobyAicm8uYnVpbGQudmVyc2lvbi5taW5fc3VwcG9ydGVkX3RhcmdldF9zZGs9JFBMQVRGT1JNX01JTl9TVVBQT1JURURfVEFSR0VUX1NES19WRVJTSU9OIgogZWNobyAicm8uYnVpbGQuZGF0ZT1gJERBVEVgIgogZWNobyAicm8uYnVpbGQuZGF0ZS51dGM9YCREQVRFICslc2AiCiBlY2hvICJyby5idWlsZC50eXBlPSRUQVJHRVRfQlVJTERfVFlQRSIKZGlmZiAtLWdpdCBhL3Rvb2xzL2NoZWNrX2J1aWxkcy5zaCBiL3Rvb2xzL2NoZWNrX2J1aWxkcy5zaAppbmRleCBjMjU1YmYwLi43ZTRlYTdjIDEwMDY0NAotLS0gYS90b29scy9jaGVja19idWlsZHMuc2gKKysrIGIvdG9vbHMvY2hlY2tfYnVpbGRzLnNoCkBAIC02NSw3ICs2NSw3IEBACiAgICAgICAgIGlucHV0cz0iJGlucHV0cyAkVEVTVF9CVUlMRF9ESVIvZGlzdC0kMS9pbnN0YWxsZWQtZmlsZXMudHh0IgogICAgICAgICBzaGlmdAogICAgIGRvbmUKLSAgICBidWlsZC90b29scy9jb21wYXJlX2ZpbGVzbGlzdC5weSAkaW5wdXRzID4gJFRFU1RfQlVJTERfRElSL3NpemVzLmh0bWwKKyAgICBidWlsZC9tYWtlL3Rvb2xzL2NvbXBhcmVfZmlsZXNsaXN0LnB5ICRpbnB1dHMgPiAkVEVTVF9CVUlMRF9ESVIvc2l6ZXMuaHRtbAogfQogCiBmdW5jdGlvbiBjaGVja19idWlsZHMKQEAgLTg3LDYgKzg3LDYgQEAKICAgICAgICAgZmkKICAgICAgICAgc2hpZnQKICAgICBkb25lCi0gICAgYnVpbGQvdG9vbHMvY29tcGFyZV9maWxlc2xpc3QucHkgJGlucHV0cyA+ICRURVNUX0JVSUxEX0RJUi9zaXplcy5odG1sCisgICAgYnVpbGQvbWFrZS90b29scy9jb21wYXJlX2ZpbGVzbGlzdC5weSAkaW5wdXRzID4gJFRFU1RfQlVJTERfRElSL3NpemVzLmh0bWwKIH0KIApkaWZmIC0tZ2l0IGEvdG9vbHMvY2hlY2tvd25lcnMucHkgYi90b29scy9jaGVja293bmVycy5weQppbmRleCBiODc0OTU1Li4xMTkwZDMwIDEwMDc1NQotLS0gYS90b29scy9jaGVja293bmVycy5weQorKysgYi90b29scy9jaGVja293bmVycy5weQpAQCAtMzQsOCArMzQsOCBAQAogICAgICAgICAgICAgICAgKyB1cmxsaWIucXVvdGUoYWRkcmVzcykpCiAgICAgZWNobygnQ2hlY2tpbmcgZW1haWwgYWRkcmVzczogJyArIGFkZHJlc3MpCiAgICAgcmVzdWx0ID0gdXJsbGliMi51cmxvcGVuKHJlcXVlc3QpLnJlYWQoKQotICAgIGV4cGVjdGVkID0gJyJlbWFpbCI6ICInICsgYWRkcmVzcyArICciJwotICAgIGNoZWNrZWRfYWRkcmVzc2VzW2FkZHJlc3NdID0gKHJlc3VsdC5maW5kKGV4cGVjdGVkKSA+PSAwKQorICAgIGNoZWNrZWRfYWRkcmVzc2VzW2FkZHJlc3NdID0gKAorICAgICAgICByZXN1bHQuZmluZCgnImVtYWlsIjonKSA+PSAwIGFuZCByZXN1bHQuZmluZCgnIl9hY2NvdW50X2lkIjonKSA+PSAwKQogICByZXR1cm4gY2hlY2tlZF9hZGRyZXNzZXNbYWRkcmVzc10KIAogCmRpZmYgLS1naXQgYS90b29scy9kb2NrZXIvLmdpdGlnbm9yZSBiL3Rvb2xzL2RvY2tlci8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmMGIzNjcKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9kb2NrZXIvLmdpdGlnbm9yZQpAQCAtMCwwICsxIEBACitnaXRjb25maWcKZGlmZiAtLWdpdCBhL3Rvb2xzL2RvY2tlci9Eb2NrZXJmaWxlIGIvdG9vbHMvZG9ja2VyL0RvY2tlcmZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWM2NWFhZgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2RvY2tlci9Eb2NrZXJmaWxlCkBAIC0wLDAgKzEsMjUgQEAKK0ZST00gdWJ1bnR1OjE0LjA0CitBUkcgdXNlcmlkCitBUkcgZ3JvdXBpZAorQVJHIHVzZXJuYW1lCisKK1JVTiBhcHQtZ2V0IHVwZGF0ZSAmJiBhcHQtZ2V0IGluc3RhbGwgLXkgZ2l0LWNvcmUgZ251cGcgZmxleCBiaXNvbiBncGVyZiBidWlsZC1lc3NlbnRpYWwgemlwIGN1cmwgemxpYjFnLWRldiBnY2MtbXVsdGlsaWIgZysrLW11bHRpbGliIGxpYmM2LWRldi1pMzg2IGxpYjMybmN1cnNlczUtZGV2IHgxMXByb3RvLWNvcmUtZGV2IGxpYngxMS1kZXYgbGliMzJ6LWRldiBjY2FjaGUgbGliZ2wxLW1lc2EtZGV2IGxpYnhtbDItdXRpbHMgeHNsdHByb2MgdW56aXAgcHl0aG9uIG9wZW5qZGstNy1qZGsKKworUlVOIGN1cmwgLW8gamRrOC50Z3ogaHR0cHM6Ly9hbmRyb2lkLmdvb2dsZXNvdXJjZS5jb20vcGxhdGZvcm0vcHJlYnVpbHRzL2pkay9qZGs4LythcmNoaXZlL21hc3Rlci50YXIuZ3ogXAorICYmIHRhciAtenhmIGpkazgudGd6IGxpbnV4LXg4NiBcCisgJiYgbXYgbGludXgteDg2IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NCBcCisgJiYgcm0gLXJmIGpkazgudGd6CisKK1JVTiBjdXJsIC1vIC91c3IvbG9jYWwvYmluL3JlcG8gaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2dpdC1yZXBvLWRvd25sb2Fkcy9yZXBvIFwKKyAmJiBlY2hvICJlMTQ3ZjAzOTI2ODZjNDBjZmQ3ZDVlNmYzMzJjNmVlNzRjNGVhYjRkMjRlMjY5NGIzYjBhMGMwMzdiZjUxZGM1ICAvdXNyL2xvY2FsL2Jpbi9yZXBvIiB8IHNoYTI1NnN1bSAtLXN0cmljdCAtYyAtIFwKKyAmJiBjaG1vZCBhK3ggL3Vzci9sb2NhbC9iaW4vcmVwbworCitSVU4gZ3JvdXBhZGQgLWcgJGdyb3VwaWQgJHVzZXJuYW1lIFwKKyAmJiB1c2VyYWRkIC1tIC11ICR1c2VyaWQgLWcgJGdyb3VwaWQgJHVzZXJuYW1lIFwKKyAmJiBlY2hvICR1c2VybmFtZSA+L3Jvb3QvdXNlcm5hbWUgXAorICYmIGVjaG8gImV4cG9ydCBVU0VSPSIkdXNlcm5hbWUgPj4vaG9tZS8kdXNlcm5hbWUvLmdpdGNvbmZpZworQ09QWSBnaXRjb25maWcgL2hvbWUvJHVzZXJuYW1lLy5naXRjb25maWcKK1JVTiBjaG93biAkdXNlcmlkOiRncm91cGlkIC9ob21lLyR1c2VybmFtZS8uZ2l0Y29uZmlnCitFTlYgSE9NRT0vaG9tZS8kdXNlcm5hbWUKKworRU5UUllQT0lOVCBjaHJvb3QgLS11c2Vyc3BlYz0kKGNhdCAvcm9vdC91c2VybmFtZSk6JChjYXQgL3Jvb3QvdXNlcm5hbWUpIC8gL2Jpbi9iYXNoIC1pCmRpZmYgLS1naXQgYS90b29scy9kb2NrZXIvUkVBRE1FLm1kIGIvdG9vbHMvZG9ja2VyL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDRmZDE4Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvZG9ja2VyL1JFQURNRS5tZApAQCAtMCwwICsxLDE4IEBACitUaGUgRG9ja2VyZmlsZSBpbiB0aGlzIGRpcmVjdG9yeSBzZXRzIHVwIGFuIFVidW50dSBUcnVzdHkgaW1hZ2UgcmVhZHkgdG8gYnVpbGQKK2EgdmFyaWV0eSBvZiBBbmRyb2lkIGJyYW5jaGVzICg+PSBMb2xsaXBvcCkuIEl0J3MgcGFydGljdWxhcnkgdXNlZnVsIHRvIGJ1aWxkCitvbGRlciBicmFuY2hlcyB0aGF0IHJlcXVpcmVkIDE0LjA0IGlmIHlvdSd2ZSB1cGdyYWRlZCB0byBzb21ldGhpbmcgbmV3ZXIuCisKK0ZpcnN0LCBidWlsZCB0aGUgaW1hZ2U6CitgYGAKKyMgQ29weSB5b3VyIGhvc3QgZ2l0Y29uZmlnLCBvciBjcmVhdGUgYSBzdHJpcHBlZCBkb3duIHZlcnNpb24KKyQgY3Agfi8uZ2l0Y29uZmlnIGdpdGNvbmZpZworJCBkb2NrZXIgYnVpbGQgLS1idWlsZC1hcmcgdXNlcmlkPSQoaWQgLXUpIC0tYnVpbGQtYXJnIGdyb3VwaWQ9JChpZCAtZykgLS1idWlsZC1hcmcgdXNlcm5hbWU9JChpZCAtdW4pIC10IGFuZHJvaWQtYnVpbGQtdHJ1c3R5IC4KK2BgYAorCitUaGVuIHlvdSBjYW4gc3RhcnQgdXAgbmV3IGluc3RhbmNlcyB3aXRoOgorYGBgCiskIGRvY2tlciBydW4gLWl0IC0tcm0gLXYgJEFORFJPSURfQlVJTERfVE9QOi9zcmMgYW5kcm9pZC1idWlsZC10cnVzdHkKKz4gY2QgL3NyYzsgc291cmNlIGJ1aWxkL2VudnNldHVwLnNoCis+IGx1bmNoIGFvc3BfYXJtLWVuZworPiBtIC1qNTAKK2BgYApkaWZmIC0tZ2l0IGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvR1BMLUxJQ0VOU0UudHh0IGIvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvR1BMLUxJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NmEwZjE4Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL0dQTC1MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDI3OCArMCwwIEBACi0gICAgICAgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKLSAgICAgICAgICAgVmVyc2lvbiAyLCBKdW5lIDE5OTEKLQotIENvcHlyaWdodCAoQykgMTk4OSwgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLSBFdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMKLSBvZiB0aGlzIGxpY2Vuc2UgZG9jdW1lbnQsIGJ1dCBjaGFuZ2luZyBpdCBpcyBub3QgYWxsb3dlZC4KLQotICAgICAgICAgIFByZWFtYmxlCi0KLSAgVGhlIGxpY2Vuc2VzIGZvciBtb3N0IHNvZnR3YXJlIGFyZSBkZXNpZ25lZCB0byB0YWtlIGF3YXkgeW91cgotZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlIGl0LiAgQnkgY29udHJhc3QsIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZ3VhcmFudGVlIHlvdXIgZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlIGZyZWUKLXNvZnR3YXJlLS10byBtYWtlIHN1cmUgdGhlIHNvZnR3YXJlIGlzIGZyZWUgZm9yIGFsbCBpdHMgdXNlcnMuICBUaGlzCi1HZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFwcGxpZXMgdG8gbW9zdCBvZiB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbidzIHNvZnR3YXJlIGFuZCB0byBhbnkgb3RoZXIgcHJvZ3JhbSB3aG9zZSBhdXRob3JzIGNvbW1pdCB0bwotdXNpbmcgaXQuICAoU29tZSBvdGhlciBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gc29mdHdhcmUgaXMgY292ZXJlZCBieQotdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpbnN0ZWFkLikgIFlvdSBjYW4gYXBwbHkgaXQgdG8KLXlvdXIgcHJvZ3JhbXMsIHRvby4KLQotICBXaGVuIHdlIHNwZWFrIG9mIGZyZWUgc29mdHdhcmUsIHdlIGFyZSByZWZlcnJpbmcgdG8gZnJlZWRvbSwgbm90Ci1wcmljZS4gIE91ciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlcyBhcmUgZGVzaWduZWQgdG8gbWFrZSBzdXJlIHRoYXQgeW91Ci1oYXZlIHRoZSBmcmVlZG9tIHRvIGRpc3RyaWJ1dGUgY29waWVzIG9mIGZyZWUgc29mdHdhcmUgKGFuZCBjaGFyZ2UgZm9yCi10aGlzIHNlcnZpY2UgaWYgeW91IHdpc2gpLCB0aGF0IHlvdSByZWNlaXZlIHNvdXJjZSBjb2RlIG9yIGNhbiBnZXQgaXQKLWlmIHlvdSB3YW50IGl0LCB0aGF0IHlvdSBjYW4gY2hhbmdlIHRoZSBzb2Z0d2FyZSBvciB1c2UgcGllY2VzIG9mIGl0Ci1pbiBuZXcgZnJlZSBwcm9ncmFtczsgYW5kIHRoYXQgeW91IGtub3cgeW91IGNhbiBkbyB0aGVzZSB0aGluZ3MuCi0KLSAgVG8gcHJvdGVjdCB5b3VyIHJpZ2h0cywgd2UgbmVlZCB0byBtYWtlIHJlc3RyaWN0aW9ucyB0aGF0IGZvcmJpZAotYW55b25lIHRvIGRlbnkgeW91IHRoZXNlIHJpZ2h0cyBvciB0byBhc2sgeW91IHRvIHN1cnJlbmRlciB0aGUgcmlnaHRzLgotVGhlc2UgcmVzdHJpY3Rpb25zIHRyYW5zbGF0ZSB0byBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgZm9yIHlvdSBpZiB5b3UKLWRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZSBzb2Z0d2FyZSwgb3IgaWYgeW91IG1vZGlmeSBpdC4KLQotICBGb3IgZXhhbXBsZSwgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHN1Y2ggYSBwcm9ncmFtLCB3aGV0aGVyCi1ncmF0aXMgb3IgZm9yIGEgZmVlLCB5b3UgbXVzdCBnaXZlIHRoZSByZWNpcGllbnRzIGFsbCB0aGUgcmlnaHRzIHRoYXQKLXlvdSBoYXZlLiAgWW91IG11c3QgbWFrZSBzdXJlIHRoYXQgdGhleSwgdG9vLCByZWNlaXZlIG9yIGNhbiBnZXQgdGhlCi1zb3VyY2UgY29kZS4gIEFuZCB5b3UgbXVzdCBzaG93IHRoZW0gdGhlc2UgdGVybXMgc28gdGhleSBrbm93IHRoZWlyCi1yaWdodHMuCi0KLSAgV2UgcHJvdGVjdCB5b3VyIHJpZ2h0cyB3aXRoIHR3byBzdGVwczogKDEpIGNvcHlyaWdodCB0aGUgc29mdHdhcmUsIGFuZAotKDIpIG9mZmVyIHlvdSB0aGlzIGxpY2Vuc2Ugd2hpY2ggZ2l2ZXMgeW91IGxlZ2FsIHBlcm1pc3Npb24gdG8gY29weSwKLWRpc3RyaWJ1dGUgYW5kL29yIG1vZGlmeSB0aGUgc29mdHdhcmUuCi0KLSAgQWxzbywgZm9yIGVhY2ggYXV0aG9yJ3MgcHJvdGVjdGlvbiBhbmQgb3Vycywgd2Ugd2FudCB0byBtYWtlIGNlcnRhaW4KLXRoYXQgZXZlcnlvbmUgdW5kZXJzdGFuZHMgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSBmb3IgdGhpcyBmcmVlCi1zb2Z0d2FyZS4gIElmIHRoZSBzb2Z0d2FyZSBpcyBtb2RpZmllZCBieSBzb21lb25lIGVsc2UgYW5kIHBhc3NlZCBvbiwgd2UKLXdhbnQgaXRzIHJlY2lwaWVudHMgdG8ga25vdyB0aGF0IHdoYXQgdGhleSBoYXZlIGlzIG5vdCB0aGUgb3JpZ2luYWwsIHNvCi10aGF0IGFueSBwcm9ibGVtcyBpbnRyb2R1Y2VkIGJ5IG90aGVycyB3aWxsIG5vdCByZWZsZWN0IG9uIHRoZSBvcmlnaW5hbAotYXV0aG9ycycgcmVwdXRhdGlvbnMuCi0KLSAgRmluYWxseSwgYW55IGZyZWUgcHJvZ3JhbSBpcyB0aHJlYXRlbmVkIGNvbnN0YW50bHkgYnkgc29mdHdhcmUKLXBhdGVudHMuICBXZSB3aXNoIHRvIGF2b2lkIHRoZSBkYW5nZXIgdGhhdCByZWRpc3RyaWJ1dG9ycyBvZiBhIGZyZWUKLXByb2dyYW0gd2lsbCBpbmRpdmlkdWFsbHkgb2J0YWluIHBhdGVudCBsaWNlbnNlcywgaW4gZWZmZWN0IG1ha2luZyB0aGUKLXByb2dyYW0gcHJvcHJpZXRhcnkuICBUbyBwcmV2ZW50IHRoaXMsIHdlIGhhdmUgbWFkZSBpdCBjbGVhciB0aGF0IGFueQotcGF0ZW50IG11c3QgYmUgbGljZW5zZWQgZm9yIGV2ZXJ5b25lJ3MgZnJlZSB1c2Ugb3Igbm90IGxpY2Vuc2VkIGF0IGFsbC4KLQotICBUaGUgcHJlY2lzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW9uIGFuZAotbW9kaWZpY2F0aW9uIGZvbGxvdy4KLQotICAgICAgICBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIENPUFlJTkcsIERJU1RSSUJVVElPTiBBTkQgTU9ESUZJQ0FUSU9OCi0KLSAgMC4gVGhpcyBMaWNlbnNlIGFwcGxpZXMgdG8gYW55IHByb2dyYW0gb3Igb3RoZXIgd29yayB3aGljaCBjb250YWlucwotYSBub3RpY2UgcGxhY2VkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVyIHNheWluZyBpdCBtYXkgYmUgZGlzdHJpYnV0ZWQKLXVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBUaGUgIlByb2dyYW0iLCBiZWxvdywKLXJlZmVycyB0byBhbnkgc3VjaCBwcm9ncmFtIG9yIHdvcmssIGFuZCBhICJ3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtIgotbWVhbnMgZWl0aGVyIHRoZSBQcm9ncmFtIG9yIGFueSBkZXJpdmF0aXZlIHdvcmsgdW5kZXIgY29weXJpZ2h0IGxhdzoKLXRoYXQgaXMgdG8gc2F5LCBhIHdvcmsgY29udGFpbmluZyB0aGUgUHJvZ3JhbSBvciBhIHBvcnRpb24gb2YgaXQsCi1laXRoZXIgdmVyYmF0aW0gb3Igd2l0aCBtb2RpZmljYXRpb25zIGFuZC9vciB0cmFuc2xhdGVkIGludG8gYW5vdGhlcgotbGFuZ3VhZ2UuICAoSGVyZWluYWZ0ZXIsIHRyYW5zbGF0aW9uIGlzIGluY2x1ZGVkIHdpdGhvdXQgbGltaXRhdGlvbiBpbgotdGhlIHRlcm0gIm1vZGlmaWNhdGlvbiIuKSAgRWFjaCBsaWNlbnNlZSBpcyBhZGRyZXNzZWQgYXMgInlvdSIuCi0KLUFjdGl2aXRpZXMgb3RoZXIgdGhhbiBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kIG1vZGlmaWNhdGlvbiBhcmUgbm90Ci1jb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZTsgdGhleSBhcmUgb3V0c2lkZSBpdHMgc2NvcGUuICBUaGUgYWN0IG9mCi1ydW5uaW5nIHRoZSBQcm9ncmFtIGlzIG5vdCByZXN0cmljdGVkLCBhbmQgdGhlIG91dHB1dCBmcm9tIHRoZSBQcm9ncmFtCi1pcyBjb3ZlcmVkIG9ubHkgaWYgaXRzIGNvbnRlbnRzIGNvbnN0aXR1dGUgYSB3b3JrIGJhc2VkIG9uIHRoZQotUHJvZ3JhbSAoaW5kZXBlbmRlbnQgb2YgaGF2aW5nIGJlZW4gbWFkZSBieSBydW5uaW5nIHRoZSBQcm9ncmFtKS4KLVdoZXRoZXIgdGhhdCBpcyB0cnVlIGRlcGVuZHMgb24gd2hhdCB0aGUgUHJvZ3JhbSBkb2VzLgotCi0gIDEuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YgdGhlIFByb2dyYW0ncwotc291cmNlIGNvZGUgYXMgeW91IHJlY2VpdmUgaXQsIGluIGFueSBtZWRpdW0sIHByb3ZpZGVkIHRoYXQgeW91Ci1jb25zcGljdW91c2x5IGFuZCBhcHByb3ByaWF0ZWx5IHB1Ymxpc2ggb24gZWFjaCBjb3B5IGFuIGFwcHJvcHJpYXRlCi1jb3B5cmlnaHQgbm90aWNlIGFuZCBkaXNjbGFpbWVyIG9mIHdhcnJhbnR5OyBrZWVwIGludGFjdCBhbGwgdGhlCi1ub3RpY2VzIHRoYXQgcmVmZXIgdG8gdGhpcyBMaWNlbnNlIGFuZCB0byB0aGUgYWJzZW5jZSBvZiBhbnkgd2FycmFudHk7Ci1hbmQgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgUHJvZ3JhbSBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoZSBQcm9ncmFtLgotCi1Zb3UgbWF5IGNoYXJnZSBhIGZlZSBmb3IgdGhlIHBoeXNpY2FsIGFjdCBvZiB0cmFuc2ZlcnJpbmcgYSBjb3B5LCBhbmQKLXlvdSBtYXkgYXQgeW91ciBvcHRpb24gb2ZmZXIgd2FycmFudHkgcHJvdGVjdGlvbiBpbiBleGNoYW5nZSBmb3IgYSBmZWUuCi0KLSAgMi4gWW91IG1heSBtb2RpZnkgeW91ciBjb3B5IG9yIGNvcGllcyBvZiB0aGUgUHJvZ3JhbSBvciBhbnkgcG9ydGlvbgotb2YgaXQsIHRodXMgZm9ybWluZyBhIHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0sIGFuZCBjb3B5IGFuZAotZGlzdHJpYnV0ZSBzdWNoIG1vZGlmaWNhdGlvbnMgb3Igd29yayB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbiAxCi1hYm92ZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0IGFsbCBvZiB0aGVzZSBjb25kaXRpb25zOgotCi0gICAgYSkgWW91IG11c3QgY2F1c2UgdGhlIG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBmaWxlcyBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4KLQotICAgIGIpIFlvdSBtdXN0IGNhdXNlIGFueSB3b3JrIHRoYXQgeW91IGRpc3RyaWJ1dGUgb3IgcHVibGlzaCwgdGhhdCBpbgotICAgIHdob2xlIG9yIGluIHBhcnQgY29udGFpbnMgb3IgaXMgZGVyaXZlZCBmcm9tIHRoZSBQcm9ncmFtIG9yIGFueQotICAgIHBhcnQgdGhlcmVvZiwgdG8gYmUgbGljZW5zZWQgYXMgYSB3aG9sZSBhdCBubyBjaGFyZ2UgdG8gYWxsIHRoaXJkCi0gICAgcGFydGllcyB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLgotCi0gICAgYykgSWYgdGhlIG1vZGlmaWVkIHByb2dyYW0gbm9ybWFsbHkgcmVhZHMgY29tbWFuZHMgaW50ZXJhY3RpdmVseQotICAgIHdoZW4gcnVuLCB5b3UgbXVzdCBjYXVzZSBpdCwgd2hlbiBzdGFydGVkIHJ1bm5pbmcgZm9yIHN1Y2gKLSAgICBpbnRlcmFjdGl2ZSB1c2UgaW4gdGhlIG1vc3Qgb3JkaW5hcnkgd2F5LCB0byBwcmludCBvciBkaXNwbGF5IGFuCi0gICAgYW5ub3VuY2VtZW50IGluY2x1ZGluZyBhbiBhcHByb3ByaWF0ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCBhCi0gICAgbm90aWNlIHRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgKG9yIGVsc2UsIHNheWluZyB0aGF0IHlvdSBwcm92aWRlCi0gICAgYSB3YXJyYW50eSkgYW5kIHRoYXQgdXNlcnMgbWF5IHJlZGlzdHJpYnV0ZSB0aGUgcHJvZ3JhbSB1bmRlcgotICAgIHRoZXNlIGNvbmRpdGlvbnMsIGFuZCB0ZWxsaW5nIHRoZSB1c2VyIGhvdyB0byB2aWV3IGEgY29weSBvZiB0aGlzCi0gICAgTGljZW5zZS4gIChFeGNlcHRpb246IGlmIHRoZSBQcm9ncmFtIGl0c2VsZiBpcyBpbnRlcmFjdGl2ZSBidXQKLSAgICBkb2VzIG5vdCBub3JtYWxseSBwcmludCBzdWNoIGFuIGFubm91bmNlbWVudCwgeW91ciB3b3JrIGJhc2VkIG9uCi0gICAgdGhlIFByb2dyYW0gaXMgbm90IHJlcXVpcmVkIHRvIHByaW50IGFuIGFubm91bmNlbWVudC4pCi0KLVRoZXNlIHJlcXVpcmVtZW50cyBhcHBseSB0byB0aGUgbW9kaWZpZWQgd29yayBhcyBhIHdob2xlLiAgSWYKLWlkZW50aWZpYWJsZSBzZWN0aW9ucyBvZiB0aGF0IHdvcmsgYXJlIG5vdCBkZXJpdmVkIGZyb20gdGhlIFByb2dyYW0sCi1hbmQgY2FuIGJlIHJlYXNvbmFibHkgY29uc2lkZXJlZCBpbmRlcGVuZGVudCBhbmQgc2VwYXJhdGUgd29ya3MgaW4KLXRoZW1zZWx2ZXMsIHRoZW4gdGhpcyBMaWNlbnNlLCBhbmQgaXRzIHRlcm1zLCBkbyBub3QgYXBwbHkgdG8gdGhvc2UKLXNlY3Rpb25zIHdoZW4geW91IGRpc3RyaWJ1dGUgdGhlbSBhcyBzZXBhcmF0ZSB3b3Jrcy4gIEJ1dCB3aGVuIHlvdQotZGlzdHJpYnV0ZSB0aGUgc2FtZSBzZWN0aW9ucyBhcyBwYXJ0IG9mIGEgd2hvbGUgd2hpY2ggaXMgYSB3b3JrIGJhc2VkCi1vbiB0aGUgUHJvZ3JhbSwgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd2hvbGUgbXVzdCBiZSBvbiB0aGUgdGVybXMgb2YKLXRoaXMgTGljZW5zZSwgd2hvc2UgcGVybWlzc2lvbnMgZm9yIG90aGVyIGxpY2Vuc2VlcyBleHRlbmQgdG8gdGhlCi1lbnRpcmUgd2hvbGUsIGFuZCB0aHVzIHRvIGVhY2ggYW5kIGV2ZXJ5IHBhcnQgcmVnYXJkbGVzcyBvZiB3aG8gd3JvdGUgaXQuCi0KLVRodXMsIGl0IGlzIG5vdCB0aGUgaW50ZW50IG9mIHRoaXMgc2VjdGlvbiB0byBjbGFpbSByaWdodHMgb3IgY29udGVzdAoteW91ciByaWdodHMgdG8gd29yayB3cml0dGVuIGVudGlyZWx5IGJ5IHlvdTsgcmF0aGVyLCB0aGUgaW50ZW50IGlzIHRvCi1leGVyY2lzZSB0aGUgcmlnaHQgdG8gY29udHJvbCB0aGUgZGlzdHJpYnV0aW9uIG9mIGRlcml2YXRpdmUgb3IKLWNvbGxlY3RpdmUgd29ya3MgYmFzZWQgb24gdGhlIFByb2dyYW0uCi0KLUluIGFkZGl0aW9uLCBtZXJlIGFnZ3JlZ2F0aW9uIG9mIGFub3RoZXIgd29yayBub3QgYmFzZWQgb24gdGhlIFByb2dyYW0KLXdpdGggdGhlIFByb2dyYW0gKG9yIHdpdGggYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtKSBvbiBhIHZvbHVtZSBvZgotYSBzdG9yYWdlIG9yIGRpc3RyaWJ1dGlvbiBtZWRpdW0gZG9lcyBub3QgYnJpbmcgdGhlIG90aGVyIHdvcmsgdW5kZXIKLXRoZSBzY29wZSBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgMy4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChvciBhIHdvcmsgYmFzZWQgb24gaXQsCi11bmRlciBTZWN0aW9uIDIpIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybSB1bmRlciB0aGUgdGVybXMgb2YKLVNlY3Rpb25zIDEgYW5kIDIgYWJvdmUgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBkbyBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLQotICAgIGEpIEFjY29tcGFueSBpdCB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nIG1hY2hpbmUtcmVhZGFibGUKLSAgICBzb3VyY2UgY29kZSwgd2hpY2ggbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMKLSAgICAxIGFuZCAyIGFib3ZlIG9uIGEgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlOyBvciwKLQotICAgIGIpIEFjY29tcGFueSBpdCB3aXRoIGEgd3JpdHRlbiBvZmZlciwgdmFsaWQgZm9yIGF0IGxlYXN0IHRocmVlCi0gICAgeWVhcnMsIHRvIGdpdmUgYW55IHRoaXJkIHBhcnR5LCBmb3IgYSBjaGFyZ2Ugbm8gbW9yZSB0aGFuIHlvdXIKLSAgICBjb3N0IG9mIHBoeXNpY2FsbHkgcGVyZm9ybWluZyBzb3VyY2UgZGlzdHJpYnV0aW9uLCBhIGNvbXBsZXRlCi0gICAgbWFjaGluZS1yZWFkYWJsZSBjb3B5IG9mIHRoZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlLCB0byBiZQotICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIG9uIGEgbWVkaXVtCi0gICAgY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2U7IG9yLAotCi0gICAgYykgQWNjb21wYW55IGl0IHdpdGggdGhlIGluZm9ybWF0aW9uIHlvdSByZWNlaXZlZCBhcyB0byB0aGUgb2ZmZXIKLSAgICB0byBkaXN0cmlidXRlIGNvcnJlc3BvbmRpbmcgc291cmNlIGNvZGUuICAoVGhpcyBhbHRlcm5hdGl2ZSBpcwotICAgIGFsbG93ZWQgb25seSBmb3Igbm9uY29tbWVyY2lhbCBkaXN0cmlidXRpb24gYW5kIG9ubHkgaWYgeW91Ci0gICAgcmVjZWl2ZWQgdGhlIHByb2dyYW0gaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtIHdpdGggc3VjaAotICAgIGFuIG9mZmVyLCBpbiBhY2NvcmQgd2l0aCBTdWJzZWN0aW9uIGIgYWJvdmUuKQotCi1UaGUgc291cmNlIGNvZGUgZm9yIGEgd29yayBtZWFucyB0aGUgcHJlZmVycmVkIGZvcm0gb2YgdGhlIHdvcmsgZm9yCi1tYWtpbmcgbW9kaWZpY2F0aW9ucyB0byBpdC4gIEZvciBhbiBleGVjdXRhYmxlIHdvcmssIGNvbXBsZXRlIHNvdXJjZQotY29kZSBtZWFucyBhbGwgdGhlIHNvdXJjZSBjb2RlIGZvciBhbGwgbW9kdWxlcyBpdCBjb250YWlucywgcGx1cyBhbnkKLWFzc29jaWF0ZWQgaW50ZXJmYWNlIGRlZmluaXRpb24gZmlsZXMsIHBsdXMgdGhlIHNjcmlwdHMgdXNlZCB0bwotY29udHJvbCBjb21waWxhdGlvbiBhbmQgaW5zdGFsbGF0aW9uIG9mIHRoZSBleGVjdXRhYmxlLiAgSG93ZXZlciwgYXMgYQotc3BlY2lhbCBleGNlcHRpb24sIHRoZSBzb3VyY2UgY29kZSBkaXN0cmlidXRlZCBuZWVkIG5vdCBpbmNsdWRlCi1hbnl0aGluZyB0aGF0IGlzIG5vcm1hbGx5IGRpc3RyaWJ1dGVkIChpbiBlaXRoZXIgc291cmNlIG9yIGJpbmFyeQotZm9ybSkgd2l0aCB0aGUgbWFqb3IgY29tcG9uZW50cyAoY29tcGlsZXIsIGtlcm5lbCwgYW5kIHNvIG9uKSBvZiB0aGUKLW9wZXJhdGluZyBzeXN0ZW0gb24gd2hpY2ggdGhlIGV4ZWN1dGFibGUgcnVucywgdW5sZXNzIHRoYXQgY29tcG9uZW50Ci1pdHNlbGYgYWNjb21wYW5pZXMgdGhlIGV4ZWN1dGFibGUuCi0KLUlmIGRpc3RyaWJ1dGlvbiBvZiBleGVjdXRhYmxlIG9yIG9iamVjdCBjb2RlIGlzIG1hZGUgYnkgb2ZmZXJpbmcKLWFjY2VzcyB0byBjb3B5IGZyb20gYSBkZXNpZ25hdGVkIHBsYWNlLCB0aGVuIG9mZmVyaW5nIGVxdWl2YWxlbnQKLWFjY2VzcyB0byBjb3B5IHRoZSBzb3VyY2UgY29kZSBmcm9tIHRoZSBzYW1lIHBsYWNlIGNvdW50cyBhcwotZGlzdHJpYnV0aW9uIG9mIHRoZSBzb3VyY2UgY29kZSwgZXZlbiB0aG91Z2ggdGhpcmQgcGFydGllcyBhcmUgbm90Ci1jb21wZWxsZWQgdG8gY29weSB0aGUgc291cmNlIGFsb25nIHdpdGggdGhlIG9iamVjdCBjb2RlLgotCi0gIDQuIFlvdSBtYXkgbm90IGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSwgb3IgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQotZXhjZXB0IGFzIGV4cHJlc3NseSBwcm92aWRlZCB1bmRlciB0aGlzIExpY2Vuc2UuICBBbnkgYXR0ZW1wdAotb3RoZXJ3aXNlIHRvIGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSBvciBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGlzCi12b2lkLCBhbmQgd2lsbCBhdXRvbWF0aWNhbGx5IHRlcm1pbmF0ZSB5b3VyIHJpZ2h0cyB1bmRlciB0aGlzIExpY2Vuc2UuCi1Ib3dldmVyLCBwYXJ0aWVzIHdobyBoYXZlIHJlY2VpdmVkIGNvcGllcywgb3IgcmlnaHRzLCBmcm9tIHlvdSB1bmRlcgotdGhpcyBMaWNlbnNlIHdpbGwgbm90IGhhdmUgdGhlaXIgbGljZW5zZXMgdGVybWluYXRlZCBzbyBsb25nIGFzIHN1Y2gKLXBhcnRpZXMgcmVtYWluIGluIGZ1bGwgY29tcGxpYW5jZS4KLQotICA1LiBZb3UgYXJlIG5vdCByZXF1aXJlZCB0byBhY2NlcHQgdGhpcyBMaWNlbnNlLCBzaW5jZSB5b3UgaGF2ZSBub3QKLXNpZ25lZCBpdC4gIEhvd2V2ZXIsIG5vdGhpbmcgZWxzZSBncmFudHMgeW91IHBlcm1pc3Npb24gdG8gbW9kaWZ5IG9yCi1kaXN0cmlidXRlIHRoZSBQcm9ncmFtIG9yIGl0cyBkZXJpdmF0aXZlIHdvcmtzLiAgVGhlc2UgYWN0aW9ucyBhcmUKLXByb2hpYml0ZWQgYnkgbGF3IGlmIHlvdSBkbyBub3QgYWNjZXB0IHRoaXMgTGljZW5zZS4gIFRoZXJlZm9yZSwgYnkKLW1vZGlmeWluZyBvciBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0gKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQotUHJvZ3JhbSksIHlvdSBpbmRpY2F0ZSB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhpcyBMaWNlbnNlIHRvIGRvIHNvLCBhbmQKLWFsbCBpdHMgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGluZyBvciBtb2RpZnlpbmcKLXRoZSBQcm9ncmFtIG9yIHdvcmtzIGJhc2VkIG9uIGl0LgotCi0gIDYuIEVhY2ggdGltZSB5b3UgcmVkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKLVByb2dyYW0pLCB0aGUgcmVjaXBpZW50IGF1dG9tYXRpY2FsbHkgcmVjZWl2ZXMgYSBsaWNlbnNlIGZyb20gdGhlCi1vcmlnaW5hbCBsaWNlbnNvciB0byBjb3B5LCBkaXN0cmlidXRlIG9yIG1vZGlmeSB0aGUgUHJvZ3JhbSBzdWJqZWN0IHRvCi10aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4gIFlvdSBtYXkgbm90IGltcG9zZSBhbnkgZnVydGhlcgotcmVzdHJpY3Rpb25zIG9uIHRoZSByZWNpcGllbnRzJyBleGVyY2lzZSBvZiB0aGUgcmlnaHRzIGdyYW50ZWQgaGVyZWluLgotWW91IGFyZSBub3QgcmVzcG9uc2libGUgZm9yIGVuZm9yY2luZyBjb21wbGlhbmNlIGJ5IHRoaXJkIHBhcnRpZXMgdG8KLXRoaXMgTGljZW5zZS4KLQotICA3LiBJZiwgYXMgYSBjb25zZXF1ZW5jZSBvZiBhIGNvdXJ0IGp1ZGdtZW50IG9yIGFsbGVnYXRpb24gb2YgcGF0ZW50Ci1pbmZyaW5nZW1lbnQgb3IgZm9yIGFueSBvdGhlciByZWFzb24gKG5vdCBsaW1pdGVkIHRvIHBhdGVudCBpc3N1ZXMpLAotY29uZGl0aW9ucyBhcmUgaW1wb3NlZCBvbiB5b3UgKHdoZXRoZXIgYnkgY291cnQgb3JkZXIsIGFncmVlbWVudCBvcgotb3RoZXJ3aXNlKSB0aGF0IGNvbnRyYWRpY3QgdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLCB0aGV5IGRvIG5vdAotZXhjdXNlIHlvdSBmcm9tIHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZS4gIElmIHlvdSBjYW5ub3QKLWRpc3RyaWJ1dGUgc28gYXMgdG8gc2F0aXNmeSBzaW11bHRhbmVvdXNseSB5b3VyIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMKLUxpY2Vuc2UgYW5kIGFueSBvdGhlciBwZXJ0aW5lbnQgb2JsaWdhdGlvbnMsIHRoZW4gYXMgYSBjb25zZXF1ZW5jZSB5b3UKLW1heSBub3QgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBhdCBhbGwuICBGb3IgZXhhbXBsZSwgaWYgYSBwYXRlbnQKLWxpY2Vuc2Ugd291bGQgbm90IHBlcm1pdCByb3lhbHR5LWZyZWUgcmVkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYnkKLWFsbCB0aG9zZSB3aG8gcmVjZWl2ZSBjb3BpZXMgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSB0aHJvdWdoIHlvdSwgdGhlbgotdGhlIG9ubHkgd2F5IHlvdSBjb3VsZCBzYXRpc2Z5IGJvdGggaXQgYW5kIHRoaXMgTGljZW5zZSB3b3VsZCBiZSB0bwotcmVmcmFpbiBlbnRpcmVseSBmcm9tIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbS4KLQotSWYgYW55IHBvcnRpb24gb2YgdGhpcyBzZWN0aW9uIGlzIGhlbGQgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlIHVuZGVyCi1hbnkgcGFydGljdWxhciBjaXJjdW1zdGFuY2UsIHRoZSBiYWxhbmNlIG9mIHRoZSBzZWN0aW9uIGlzIGludGVuZGVkIHRvCi1hcHBseSBhbmQgdGhlIHNlY3Rpb24gYXMgYSB3aG9sZSBpcyBpbnRlbmRlZCB0byBhcHBseSBpbiBvdGhlcgotY2lyY3Vtc3RhbmNlcy4KLQotSXQgaXMgbm90IHRoZSBwdXJwb3NlIG9mIHRoaXMgc2VjdGlvbiB0byBpbmR1Y2UgeW91IHRvIGluZnJpbmdlIGFueQotcGF0ZW50cyBvciBvdGhlciBwcm9wZXJ0eSByaWdodCBjbGFpbXMgb3IgdG8gY29udGVzdCB2YWxpZGl0eSBvZiBhbnkKLXN1Y2ggY2xhaW1zOyB0aGlzIHNlY3Rpb24gaGFzIHRoZSBzb2xlIHB1cnBvc2Ugb2YgcHJvdGVjdGluZyB0aGUKLWludGVncml0eSBvZiB0aGUgZnJlZSBzb2Z0d2FyZSBkaXN0cmlidXRpb24gc3lzdGVtLCB3aGljaCBpcwotaW1wbGVtZW50ZWQgYnkgcHVibGljIGxpY2Vuc2UgcHJhY3RpY2VzLiAgTWFueSBwZW9wbGUgaGF2ZSBtYWRlCi1nZW5lcm91cyBjb250cmlidXRpb25zIHRvIHRoZSB3aWRlIHJhbmdlIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkCi10aHJvdWdoIHRoYXQgc3lzdGVtIGluIHJlbGlhbmNlIG9uIGNvbnNpc3RlbnQgYXBwbGljYXRpb24gb2YgdGhhdAotc3lzdGVtOyBpdCBpcyB1cCB0byB0aGUgYXV0aG9yL2Rvbm9yIHRvIGRlY2lkZSBpZiBoZSBvciBzaGUgaXMgd2lsbGluZwotdG8gZGlzdHJpYnV0ZSBzb2Z0d2FyZSB0aHJvdWdoIGFueSBvdGhlciBzeXN0ZW0gYW5kIGEgbGljZW5zZWUgY2Fubm90Ci1pbXBvc2UgdGhhdCBjaG9pY2UuCi0KLVRoaXMgc2VjdGlvbiBpcyBpbnRlbmRlZCB0byBtYWtlIHRob3JvdWdobHkgY2xlYXIgd2hhdCBpcyBiZWxpZXZlZCB0bwotYmUgYSBjb25zZXF1ZW5jZSBvZiB0aGUgcmVzdCBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgOC4gSWYgdGhlIGRpc3RyaWJ1dGlvbiBhbmQvb3IgdXNlIG9mIHRoZSBQcm9ncmFtIGlzIHJlc3RyaWN0ZWQgaW4KLWNlcnRhaW4gY291bnRyaWVzIGVpdGhlciBieSBwYXRlbnRzIG9yIGJ5IGNvcHlyaWdodGVkIGludGVyZmFjZXMsIHRoZQotb3JpZ2luYWwgY29weXJpZ2h0IGhvbGRlciB3aG8gcGxhY2VzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgTGljZW5zZQotbWF5IGFkZCBhbiBleHBsaWNpdCBnZW9ncmFwaGljYWwgZGlzdHJpYnV0aW9uIGxpbWl0YXRpb24gZXhjbHVkaW5nCi10aG9zZSBjb3VudHJpZXMsIHNvIHRoYXQgZGlzdHJpYnV0aW9uIGlzIHBlcm1pdHRlZCBvbmx5IGluIG9yIGFtb25nCi1jb3VudHJpZXMgbm90IHRodXMgZXhjbHVkZWQuICBJbiBzdWNoIGNhc2UsIHRoaXMgTGljZW5zZSBpbmNvcnBvcmF0ZXMKLXRoZSBsaW1pdGF0aW9uIGFzIGlmIHdyaXR0ZW4gaW4gdGhlIGJvZHkgb2YgdGhpcyBMaWNlbnNlLgotCi0gIDkuIFRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gbWF5IHB1Ymxpc2ggcmV2aXNlZCBhbmQvb3IgbmV3IHZlcnNpb25zCi1vZiB0aGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmcm9tIHRpbWUgdG8gdGltZS4gIFN1Y2ggbmV3IHZlcnNpb25zIHdpbGwKLWJlIHNpbWlsYXIgaW4gc3Bpcml0IHRvIHRoZSBwcmVzZW50IHZlcnNpb24sIGJ1dCBtYXkgZGlmZmVyIGluIGRldGFpbCB0bwotYWRkcmVzcyBuZXcgcHJvYmxlbXMgb3IgY29uY2VybnMuCi0KLUVhY2ggdmVyc2lvbiBpcyBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiAgSWYgdGhlIFByb2dyYW0KLXNwZWNpZmllcyBhIHZlcnNpb24gbnVtYmVyIG9mIHRoaXMgTGljZW5zZSB3aGljaCBhcHBsaWVzIHRvIGl0IGFuZCAiYW55Ci1sYXRlciB2ZXJzaW9uIiwgeW91IGhhdmUgdGhlIG9wdGlvbiBvZiBmb2xsb3dpbmcgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCi1laXRoZXIgb2YgdGhhdCB2ZXJzaW9uIG9yIG9mIGFueSBsYXRlciB2ZXJzaW9uIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbi4gIElmIHRoZSBQcm9ncmFtIGRvZXMgbm90IHNwZWNpZnkgYSB2ZXJzaW9uIG51bWJlciBvZgotdGhpcyBMaWNlbnNlLCB5b3UgbWF5IGNob29zZSBhbnkgdmVyc2lvbiBldmVyIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbi4KLQotICAxMC4gSWYgeW91IHdpc2ggdG8gaW5jb3Jwb3JhdGUgcGFydHMgb2YgdGhlIFByb2dyYW0gaW50byBvdGhlciBmcmVlCi1wcm9ncmFtcyB3aG9zZSBkaXN0cmlidXRpb24gY29uZGl0aW9ucyBhcmUgZGlmZmVyZW50LCB3cml0ZSB0byB0aGUgYXV0aG9yCi10byBhc2sgZm9yIHBlcm1pc3Npb24uICBGb3Igc29mdHdhcmUgd2hpY2ggaXMgY29weXJpZ2h0ZWQgYnkgdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24sIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHdlIHNvbWV0aW1lcwotbWFrZSBleGNlcHRpb25zIGZvciB0aGlzLiAgT3VyIGRlY2lzaW9uIHdpbGwgYmUgZ3VpZGVkIGJ5IHRoZSB0d28gZ29hbHMKLW9mIHByZXNlcnZpbmcgdGhlIGZyZWUgc3RhdHVzIG9mIGFsbCBkZXJpdmF0aXZlcyBvZiBvdXIgZnJlZSBzb2Z0d2FyZSBhbmQKLW9mIHByb21vdGluZyB0aGUgc2hhcmluZyBhbmQgcmV1c2Ugb2Ygc29mdHdhcmUgZ2VuZXJhbGx5LgotCi0gICAgICAgICAgTk8gV0FSUkFOVFkKLQotICAxMS4gQkVDQVVTRSBUSEUgUFJPR1JBTSBJUyBMSUNFTlNFRCBGUkVFIE9GIENIQVJHRSwgVEhFUkUgSVMgTk8gV0FSUkFOVFkKLUZPUiBUSEUgUFJPR1JBTSwgVE8gVEhFIEVYVEVOVCBQRVJNSVRURUQgQlkgQVBQTElDQUJMRSBMQVcuICBFWENFUFQgV0hFTgotT1RIRVJXSVNFIFNUQVRFRCBJTiBXUklUSU5HIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQvT1IgT1RIRVIgUEFSVElFUwotUFJPVklERSBUSEUgUFJPR1JBTSAiQVMgSVMiIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTRUQKLU9SIElNUExJRUQsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCi1NRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgVEhFIEVOVElSRSBSSVNLIEFTCi1UTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIFBST0dSQU0gSVMgV0lUSCBZT1UuICBTSE9VTEQgVEhFCi1QUk9HUkFNIFBST1ZFIERFRkVDVElWRSwgWU9VIEFTU1VNRSBUSEUgQ09TVCBPRiBBTEwgTkVDRVNTQVJZIFNFUlZJQ0lORywKLVJFUEFJUiBPUiBDT1JSRUNUSU9OLgotCi0gIDEyLiBJTiBOTyBFVkVOVCBVTkxFU1MgUkVRVUlSRUQgQlkgQVBQTElDQUJMRSBMQVcgT1IgQUdSRUVEIFRPIElOIFdSSVRJTkcKLVdJTEwgQU5ZIENPUFlSSUdIVCBIT0xERVIsIE9SIEFOWSBPVEhFUiBQQVJUWSBXSE8gTUFZIE1PRElGWSBBTkQvT1IKLVJFRElTVFJJQlVURSBUSEUgUFJPR1JBTSBBUyBQRVJNSVRURUQgQUJPVkUsIEJFIExJQUJMRSBUTyBZT1UgRk9SIERBTUFHRVMsCi1JTkNMVURJTkcgQU5ZIEdFTkVSQUwsIFNQRUNJQUwsIElOQ0lERU5UQUwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcKLU9VVCBPRiBUSEUgVVNFIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFIFBST0dSQU0gKElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQKLVRPIExPU1MgT0YgREFUQSBPUiBEQVRBIEJFSU5HIFJFTkRFUkVEIElOQUNDVVJBVEUgT1IgTE9TU0VTIFNVU1RBSU5FRCBCWQotWU9VIE9SIFRISVJEIFBBUlRJRVMgT1IgQSBGQUlMVVJFIE9GIFRIRSBQUk9HUkFNIFRPIE9QRVJBVEUgV0lUSCBBTlkgT1RIRVIKLVBST0dSQU1TKSwgRVZFTiBJRiBTVUNIIEhPTERFUiBPUiBPVEhFUiBQQVJUWSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRQotUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL0xJQ0VOU0UudHh0IGIvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4NDMyOGIuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi1Db3B5cmlnaHQgKGMpIDIwMTEgSm9obiBSZXNpZywgaHR0cDovL2pxdWVyeS5jb20vCi0KLVBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZwotYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCi0iU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCi13aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCi1kaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KLXBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bwotdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi1UaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQotaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCi0KLVRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAotRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCi1NRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAotTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRQotTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTgotT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OCi1XSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9hbmRyb2lkLWRldmVsb3Blci1kb2NzLmNzcyBiL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2FuZHJvaWQtZGV2ZWxvcGVyLWRvY3MuY3NzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDYxMGY3Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2FuZHJvaWQtZGV2ZWxvcGVyLWRvY3MuY3NzCisrKyAvZGV2L251bGwKQEAgLTEsMjc2OCArMCwwIEBACi0vKiBmaWxlOiBhbmRyb2lkLWRldmVsb3Blci1jb3JlLmNzcwotICAgYXV0aG9yOiBzbWFpbgotICAgZGF0ZTogc2VwdGVtYmVyIDIwMDgKLSAgIGluZm86IGNvcmUgZGV2ZWxvcGVyIHN0eWxlcyAoZGV2ZWxvcGVyLmFuZHJvaWQuY29tKQotICAgUmVxdWlyZWQgYnkgamRpZmYKLSovCi0KLQotLyogUkVTRVQgU1RZTEVTICovCi0KLWh0bWwsYm9keSxkaXYsaDEsaDIsaDMsaDQsaDUsaDYscCxpbWcsCi1kbCxkdCxkZCxvbCx1bCxsaSx0YWJsZSxjYXB0aW9uLHRib2R5LAotdGZvb3QsdGhlYWQsdHIsdGgsdGQsZm9ybSxmaWVsZHNldCwKLWVtYmVkLG9iamVjdCxhcHBsZXQgewotICBtYXJnaW46IDA7Ci0gIHBhZGRpbmc6IDA7Ci0gIGJvcmRlcjogMDsKLX0KLQotLyogQkFTSUNTICovCi0KLWh0bWwsIGJvZHkgewotICBvdmVyZmxvdzpoaWRkZW47IC8qIGtlZXBzIHNjcm9sbGJhciBvZmYgSUUgKi8KLSAgYmFja2dyb3VuZC1jb2xvcjojZmZmOwotfQotCi1ib2R5IHsKLSAgZm9udC1mYW1pbHk6YXJpYWwsc2Fucy1zZXJpZjsKLSAgY29sb3I6IzAwMDsKLSAgZm9udC1zaXplOjEzcHg7Ci0gIGNvbG9yOiMzMzM7Ci0gIGJhY2tncm91bmQtaW1hZ2U6dXJsKGltYWdlcy9iZ19mYWRlLmpwZyk7Ci0gIGJhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OwotfQotCi1hLCBhIGNvZGUgewotICBjb2xvcjojMDA2Njk5OwotfQotCi1hOmFjdGl2ZSwKLWE6YWN0aXZlIGNvZGUgewotICBjb2xvcjojZjAwOwotfSAKLQotYTp2aXNpdGVkLAotYTp2aXNpdGVkIGNvZGUgewotICBjb2xvcjojMDA2Njk5OwotfQotCi1pbnB1dCwgc2VsZWN0LAotdGV4dGFyZWEsIG9wdGlvbiwgbGFiZWwgewotICBmb250LWZhbWlseTppbmhlcml0OwotICBmb250LXNpemU6aW5oZXJpdDsKLSAgcGFkZGluZzowOwotICBtYXJnaW46MDsKLSAgdmVydGljYWwtYWxpZ246bWlkZGxlOwotfQotCi1vcHRpb24gewotICBwYWRkaW5nOjAgNHB4OwotfQotCi1wLCBmb3JtIHsKLSAgcGFkZGluZzowOwotICBtYXJnaW46MCAwIDFlbTsKLX0KLQotY29kZSwgcHJlIHsKLSAgY29sb3I6IzAwNzAwMDsKLSAgZm9udC1mYW1pbHk6bW9ub3NwYWNlOwotICBsaW5lLWhlaWdodDoxZW07Ci19Ci0KLXZhciB7Ci0gIGNvbG9yOiMwMDcwMDA7Ci0gIGZvbnQtc3R5bGU6aXRhbGljOwotfQotCi1wcmUgewotICBib3JkZXI6MXB4IHNvbGlkICNjY2M7Ci0gIGJhY2tncm91bmQtY29sb3I6I2ZhZmFmYTsKLSAgcGFkZGluZzoxMHB4OwotICBtYXJnaW46MCAwIDFlbSAxZW07Ci0gIG92ZXJmbG93OmF1dG87Ci0gIGxpbmUtaGVpZ2h0OmluaGVyaXQ7IC8qIGZpeGVzIHZlcnRpY2FsIHNjcm9sbGluZyBpbiB3ZWJraXQgKi8KLX0KLQotaDEsaDIsaDMsaDQsaDUgewotICBtYXJnaW46MWVtIDA7Ci0gIHBhZGRpbmc6MDsKLX0KLQotcCx1bCxvbCxkbCxkZCxkdCxsaSB7Ci0gIGxpbmUtaGVpZ2h0OjEuM2VtOwotfQotCi11bCxvbCB7Ci0gIG1hcmdpbjowIDAgLjhlbTsKLSAgcGFkZGluZzowIDAgMCAyZW07Ci19Ci0KLWxpIHsKLSAgcGFkZGluZzowIDAgLjVlbTsKLX0KLQotZGwgewotICBtYXJnaW46MCAwIDFlbSAwOwotICBwYWRkaW5nOjA7Ci19Ci0KLWR0IHsKLSAgbWFyZ2luOjA7Ci0gIHBhZGRpbmc6MDsKLX0KLQotZGQgewotICBtYXJnaW46MCAwIDFlbTsKLSAgcGFkZGluZzowIDAgMCAyZW07Ci19Ci0KLWxpIHAgewotICBtYXJnaW46LjVlbSAwIDA7Ci19Ci0KLWRkIHAgewotICBtYXJnaW46MWVtIDAgMDsKLX0KLQotbGkgcHJlLCBsaSB0YWJsZSwgbGkgaW1nIHsKLSAgbWFyZ2luOi41ZW0gMCAwIDFlbTsKLX0KLQotZGQgcHJlLAotI2pkLWNvbnRlbnQgZGQgdGFibGUsCi0jamQtY29udGVudCBkZCBpbWcgewotICBtYXJnaW46MWVtIDAgMCAxZW07Ci19Ci0KLWxpIHVsLAotbGkgb2wsCi1kZCB1bCwKLWRkIG9sIHsKLSAgbWFyZ2luOjA7Ci0gIHBhZGRpbmc6IDAgMCAwIDJlbTsKLX0KLQotbGkgbGksCi1kZCBsaSB7Ci0gIG1hcmdpbjowOwotICBwYWRkaW5nOi41ZW0gMCAwOwotfQotCi1kbCBkbCwKLW9sIGRsLAotdWwgZGwgewotICBtYXJnaW46MCAwIDFlbTsKLSAgcGFkZGluZzowOwotfQotCi10YWJsZSB7Ci0gIGZvbnQtc2l6ZToxZW07Ci0gIG1hcmdpbjowIDAgMWVtOwotICBwYWRkaW5nOjA7Ci0gIGJvcmRlci1jb2xsYXBzZTpjb2xsYXBzZTsKLSAgYm9yZGVyLXdpZHRoOjA7Ci0gIGVtcHR5LWNlbGxzOnNob3c7Ci19Ci0KLXRkLHRoIHsKLSAgYm9yZGVyOjFweCBzb2xpZCAjY2NjOwotICBwYWRkaW5nOjZweCAxMnB4OwotICB0ZXh0LWFsaWduOmxlZnQ7Ci0gIHZlcnRpY2FsLWFsaWduOnRvcDsKLSAgYmFja2dyb3VuZC1jb2xvcjppbmhlcml0OwotfQotCi10aCB7Ci0gIGJhY2tncm91bmQtY29sb3I6I2RlZThmMTsKLX0KLQotdGQgPiBwOmxhc3QtY2hpbGQgewotICBtYXJnaW46MDsKLX0KLQotaHIuYmx1ZSB7Ci0gIGJhY2tncm91bmQtY29sb3I6I0RERjBGMjsKLSAgYm9yZGVyOm5vbmU7Ci0gIGhlaWdodDo1cHg7Ci0gIG1hcmdpbjoyMHB4IDAgMTBweDsKLX0KLQotYmxvY2txdW90ZSB7Ci0gIG1hcmdpbjogMCAwIDFlbSAxZW07Ci0gIHBhZGRpbmc6IDAgNGVtIDAgMWVtOwotICBib3JkZXItbGVmdDoycHggc29saWQgI2VlZTsKLX0KLS8qIExBWU9VVCAqLwotCi0jYm9keS1jb250ZW50IHsKLSAgLyogIlByZWxpbWluYXJ5IiB3YXRlcm1hcmsgZm9yIHByZXZpZXcgcmVsZWFzZXMgYW5kIGludGVyaW0gYnVpbGRzLgotICBiYWNrZ3JvdW5kOnRyYW5zcGFyZW50IHVybChpbWFnZXMvcHJlbGltaW5hcnkucG5nKSByZXBlYXQgc2Nyb2xsIDAgMDsgKi8KLSAgbWFyZ2luOjA7Ci0gIHBvc2l0aW9uOnJlbGF0aXZlOwotICB3aWR0aDoxMDAlOwotfQotCi0jaGVhZGVyIHsKLSAgaGVpZ2h0OiAxMTRweDsKLSAgcG9zaXRpb246cmVsYXRpdmU7Ci0gIHotaW5kZXg6MTAwOwotICBtaW4td2lkdGg6Njc1cHg7IC8qIG1pbiB3aWR0aCBmb3IgdGhlIHRhYnMsIGJlZm9yZSB0aGV5IHdyYXAgKi8KLSAgcGFkZGluZzowIDEwcHg7Ci0gIGJvcmRlci1ib3R0b206M3B4IHNvbGlkICM5NGI5MjI7Ci19Ci0KLSNoZWFkZXJMZWZ0ewotICBwYWRkaW5nOiAyNXB4IDAgMDsKLX0KLQotI2hlYWRlckxlZnQgaW1newotICBoZWlnaHQ6NTBweDsKLSAgd2lkdGg6MTgwcHg7Ci19Ci0KLSNoZWFkZXJSaWdodCB7Ci0gIHBvc2l0aW9uOmFic29sdXRlOwotICByaWdodDowOwotICB0b3A6MDsKLSAgdGV4dC1hbGlnbjpyaWdodDsKLX0KLQotLyogVGFicyBpbiB0aGUgaGVhZGVyICovCi0KLSNoZWFkZXIgdWwgewotICBsaXN0LXN0eWxlOiBub25lOwotICBtYXJnaW46IDdweCAwIDA7Ci0gIHBhZGRpbmc6IDA7Ci0gIGhlaWdodDogMjlweDsKLX0KLQotI2hlYWRlciBsaSB7Ci0gIGZsb2F0OiBsZWZ0OwotICBtYXJnaW46IDBweCAycHggMHB4IDBweDsKLSAgcGFkZGluZzowOwotfQotCi0jaGVhZGVyIGxpIGEgewotICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci0gIGRpc3BsYXk6IGJsb2NrOwotICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoaW1hZ2VzL2JnX2ltYWdlc19zcHJpdGUucG5nKTsKLSAgYmFja2dyb3VuZC1wb3NpdGlvbjogMCAtNThweDsKLSAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDsKLSAgY29sb3I6ICM2NjY7Ci0gIGZvbnQtc2l6ZTogMTNweDsKLSAgZm9udC13ZWlnaHQ6IGJvbGQ7Ci0gIHdpZHRoOiA5NHB4OwotICBoZWlnaHQ6IDI5cHg7Ci0gIHRleHQtYWxpZ246IGNlbnRlcjsKLSAgbWFyZ2luOiAwcHg7Ci19Ci0KLSNoZWFkZXIgbGkgYTpob3ZlciB7Ci0gIGJhY2tncm91bmQtaW1hZ2U6IHVybChpbWFnZXMvYmdfaW1hZ2VzX3Nwcml0ZS5wbmcpOwotICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIC0yOXB4OwotICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0OwotfQotCi0jaGVhZGVyIGxpIGEgc3BhbiB7Ci0gIHBvc2l0aW9uOnJlbGF0aXZlOwotICB0b3A6N3B4OwotfQotCi0jaGVhZGVyIGxpIGEgc3BhbitzcGFuIHsKLSAgZGlzcGxheTpub25lOwotfQotCi0vKiB0YWIgaGlnaGxpZ2h0aW5nICovCi0KLS5ob21lICNob21lLWxpbmsgYSwKLS5ndWlkZSAjZ3VpZGUtbGluayBhLAotLnJlZmVyZW5jZSAjcmVmZXJlbmNlLWxpbmsgYSwKLS5zZGsgI3Nkay1saW5rIGEsCi0ucmVzb3VyY2VzICNyZXNvdXJjZXMtbGluayBhLAotLnZpZGVvcyAjdmlkZW9zLWxpbmsgYSB7Ci0gIGJhY2tncm91bmQtaW1hZ2U6IHVybChpbWFnZXMvYmdfaW1hZ2VzX3Nwcml0ZS5wbmcpOwotICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIDA7Ci0gIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7Ci0gIGNvbG9yOiAjZmZmOwotICBmb250LXdlaWdodDogYm9sZDsKLSAgY3Vyc29yOmRlZmF1bHQ7Ci19Ci0KLS5ob21lICNob21lLWxpbmsgYTpob3ZlciwKLS5ndWlkZSAjZ3VpZGUtbGluayBhOmhvdmVyLAotLnJlZmVyZW5jZSAjcmVmZXJlbmNlLWxpbmsgYTpob3ZlciwKLS5zZGsgI3Nkay1saW5rIGE6aG92ZXIsCi0ucmVzb3VyY2VzICNyZXNvdXJjZXMtbGluayBhOmhvdmVyLAotLnZpZGVvcyAjdmlkZW9zLWxpbmsgIGE6aG92ZXIgewotICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoaW1hZ2VzL2JnX2ltYWdlc19zcHJpdGUucG5nKTsKLSAgYmFja2dyb3VuZC1wb3NpdGlvbjogMCAwOwotfQotCi0jaGVhZGVyTGlua3MgewotICBtYXJnaW46MTBweCAxMHB4IDAgMDsKLSAgaGVpZ2h0OjEzcHg7Ci0gIGZvbnQtc2l6ZTogMTFweDsKLSAgdmVydGljYWwtYWxpZ246IHRvcDsKLX0KLQotI2hlYWRlckxpbmtzIGEgewotICBjb2xvcjogIzdGQTlCNTsKLX0KLQotI2hlYWRlckxpbmtzIGltZyB7Ci0gIHZlcnRpY2FsLWFsaWduOm1pZGRsZTsKLX0KLQotI2xhbmd1YWdlIHsKLSAgbWFyZ2luOjAgMTBweCAwIDRweDsKLX0KLQotI3NlYXJjaCB7Ci0gIGhlaWdodDo0NXB4OwotICBtYXJnaW46MTVweCAxMHB4IDAgMDsKLX0KLQotLyogTUFJTiBCT0RZICovCi0KLSNtYWluQm9keUZsdWlkIHsKLSAgbWFyZ2luOiAyMHB4IDEwcHg7Ci0gIGNvbG9yOiMzMzM7Ci19Ci0KLSNtYWluQm9keUZpeGVkIHsKLSAgbWFyZ2luOiAyMHB4IDEwcHg7Ci0gIGNvbG9yOiAjMzMzOwotICB3aWR0aDo5MzBweDsKLSAgcG9zaXRpb246cmVsYXRpdmU7Ci19Ci0KLSNtYWluQm9keUZpeGVkIGgzLAotI21haW5Cb2R5Rmx1aWQgaDMgewotICBjb2xvcjojMzM2NjY2OwotICBmb250LXNpemU6MS4yNWVtOwotICBtYXJnaW46IDBlbSAwZW0gMGVtIDBlbTsKLSAgcGFkZGluZy1ib3R0b206LjVlbTsKLX0KLQotI21haW5Cb2R5Rml4ZWQgaDIsCi0jbWFpbkJvZHlGbHVpZCBoMiB7Ci0gIGNvbG9yOiMzMzY2NjY7Ci0gIGZvbnQtc2l6ZToxLjI1ZW07Ci0gIG1hcmdpbjogMDsKLSAgcGFkZGluZy1ib3R0b206LjVlbTsKLX0KLQotI21haW5Cb2R5Rml4ZWQgaDEsCi0jbWFpbkJvZHlGbHVpZCBoMSB7Ci0gIGNvbG9yOiM0MzVBNkU7Ci0gIGZvbnQtc2l6ZToxLjdlbTsKLSAgbWFyZ2luOiAxZW0gMDsKLX0KLQotI21haW5Cb2R5Rml4ZWQgLmdyZWVuLAotI21haW5Cb2R5Rmx1aWQgLmdyZWVuLAotI2pkLWNvbnRlbnQgLmdyZWVuIHsKLSAgY29sb3I6IzdCQjAyNjsKLSAgYmFja2dyb3VuZC1jb2xvcjpub25lOwotfQotCi0jbWFpbkJvZHlMZWZ0IHsKLSAgZmxvYXQ6IGxlZnQ7Ci0gIHdpZHRoOiA2MDBweDsKLSAgbWFyZ2luLXJpZ2h0OiAyMHB4OwotICBjb2xvcjogIzMzMzsKLSAgcG9zaXRpb246cmVsYXRpdmU7Ci19Ci0KLWRpdi5pbmRlbnQgewotICBtYXJnaW4tbGVmdDogNDBweDsKLSAgbWFyZ2luLXJpZ2h0OiA3MHB4OwotfQotCi0jbWFpbkJvZHlMZWZ0IHAgewotICBjb2xvcjogIzMzMzsKLSAgZm9udC1zaXplOiAxM3B4OwotfQotCi0jbWFpbkJvZHlMZWZ0IHAuYmx1ZSB7Ci0gIGNvbG9yOiAjNjY5OTk5OwotfQotCi0jbWFpbkJvZHlMZWZ0ICNjb21tdW5pdHlEaXYgewotICBmbG9hdDogbGVmdDsKLSAgYmFja2dyb3VuZC1pbWFnZTp1cmwoaW1hZ2VzL2JnX2NvbW11bml0eV9sZWZ0RGl2LmpwZyk7Ci0gIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7Ci0gIHdpZHRoOiA1ODFweDsKLSAgaGVpZ2h0OiAzNDdweDsKLSAgcGFkZGluZzogMjBweCAwcHggMHB4IDIwcHg7Ci19Ci0KLSNtYWluQm9keVJpZ2h0IHsKLSAgZmxvYXQ6IGxlZnQ7Ci0gIHdpZHRoOiAzMDBweDsKLSAgY29sb3I6ICMzMzM7Ci19Ci0KLSNtYWluQm9keVJpZ2h0IHAgewotICBwYWRkaW5nLXJpZ2h0OiA1MHB4OwotICBjb2xvcjogIzMzMzsKLX0KLQotI21haW5Cb2R5UmlnaHQgdGFibGUgewotICB3aWR0aDogMTAwJTsKLX0KLQotI21haW5Cb2R5UmlnaHQgdGQgewotICBib3JkZXI6MHB4IHNvbGlkICM2NjY7Ci0gIHBhZGRpbmc6MHB4IDVweDsKLSAgdGV4dC1hbGlnbjpsZWZ0OwotfQotCi0jbWFpbkJvZHlSaWdodCB0ZCBwIHsKLSAgbWFyZ2luOjAgMCAxZW0gMDsKLX0KLQotI21haW5Cb2R5UmlnaHQgLmJsdWVCb3JkZXJCb3ggewotICBib3JkZXI6NXB4IHNvbGlkICNkZGYwZjI7Ci0gIHBhZGRpbmc6MThweCAxOHB4IDE4cHggMThweDsKLSAgdGV4dC1hbGlnbjpsZWZ0OwotfQotCi0jbWFpbkJvZHlGaXhlZCAuc2VwZXJhdG9yIHsKLSAgYmFja2dyb3VuZC1pbWFnZTp1cmwoaW1hZ2VzL2hyX2dyYXlfc2lkZS5qcGcpOwotICBiYWNrZ3JvdW5kLXJlcGVhdDpuby1yZXBlYXQ7Ci0gIHdpZHRoOiAxMDAlOwotICBmbG9hdDogbGVmdDsKLSAgY2xlYXI6IGJvdGg7Ci19Ci0KLSNtYWluQm9keUJvdHRvbSB7Ci0gIGZsb2F0OiBsZWZ0OwotICB3aWR0aDogMTAwJTsKLSAgY2xlYXI6Ym90aDsKLSAgY29sb3I6ICMzMzM7Ci19Ci0KLSNtYWluQm9keUJvdHRvbSAuc2VwZXJhdG9yIHsKLSAgYmFja2dyb3VuZC1pbWFnZTp1cmwoaW1hZ2VzL2hyX2dyYXlfbWFpbi5qcGcpOwotICBiYWNrZ3JvdW5kLXJlcGVhdDpuby1yZXBlYXQ7Ci0gIHdpZHRoOiAxMDAlOwotICBmbG9hdDogbGVmdDsKLSAgY2xlYXI6IGJvdGg7Ci19Ci0KLS8qIEZPT1RFUiAqLwotCi0jZm9vdGVyIHsKLSAgZmxvYXQ6IGxlZnQ7Ci0gIHdpZHRoOjkwJTsKLSAgbWFyZ2luOiAyMHB4OwotICBjb2xvcjogI2FhYTsKLSAgZm9udC1zaXplOiAxMXB4OwotfQotCi0jZm9vdGVyIGEgewotICBjb2xvcjogI2FhYTsKLSAgZm9udC1zaXplOiAxMXB4OwotfQotCi0jZm9vdGVyIGE6aG92ZXIgewotICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKLSAgY29sb3I6I2FhYTsKLX0KLQotI2Zvb3RlcmxpbmtzIHsKLSAgbWFyZ2luLXRvcDoycHg7Ci19Ci0KLSNmb290ZXJsaW5rcyBhLAotI2Zvb3RlcmxpbmtzIGE6dmlzaXRlZCB7Ci0gIGNvbG9yOiMwMDY2OTk7Ci19Ci0KLS8qIFNFQVJDSCBGSUxURVIgKi8KLQotI3NlYXJjaF9hdXRvY29tcGxldGUgewotICBjb2xvcjojYWFhOwotfQotCi0jc2VhcmNoLWJ1dHRvbiB7Ci0gIGRpc3BsYXk6aW5saW5lOwotfQotCi0jc2VhcmNoX2ZpbHRlcmVkX2RpdiB7Ci0gIHBvc2l0aW9uOmFic29sdXRlOwotICBtYXJnaW4tdG9wOi0xcHg7Ci0gIHotaW5kZXg6MTAxOwotICBib3JkZXI6MXB4IHNvbGlkICNCQ0NERjA7Ci0gIGJhY2tncm91bmQtY29sb3I6I2ZmZjsKLX0KLQotI3NlYXJjaF9maWx0ZXJlZCB7Ci0gIG1pbi13aWR0aDoxMDAlOwotfQotI3NlYXJjaF9maWx0ZXJlZCB0ZHsKLSAgYmFja2dyb3VuZC1jb2xvcjojZmZmOwotICBib3JkZXItYm90dG9tOiAxcHggc29saWQgIzY2OTk5OTsKLSAgbGluZS1oZWlnaHQ6MS41ZW07Ci19Ci0KLSNzZWFyY2hfZmlsdGVyZWQgLmpkLXNlbGVjdGVkIHsKLSAgYmFja2dyb3VuZC1jb2xvcjogIzk0YjkyMjsKLSAgY3Vyc29yOnBvaW50ZXI7Ci19Ci0jc2VhcmNoX2ZpbHRlcmVkIC5qZC1zZWxlY3RlZCwKLSNzZWFyY2hfZmlsdGVyZWQgLmpkLXNlbGVjdGVkIGEgewotICBjb2xvcjojZmZmOwotfQotCi0ubm8tZGlzcGxheSB7Ci0gIGRpc3BsYXk6IG5vbmU7Ci19Ci0KLS5qZC1hdXRvY29tcGxldGUgewotICBmb250LWZhbWlseTogQXJpYWwsIHNhbnMtc2VyaWY7Ci0gIHBhZGRpbmctbGVmdDogNnB4OwotICBwYWRkaW5nLXJpZ2h0OiA2cHg7Ci0gIHBhZGRpbmctdG9wOiAxcHg7Ci0gIHBhZGRpbmctYm90dG9tOiAxcHg7Ci0gIGZvbnQtc2l6ZTogMC44MWVtOwotICBib3JkZXI6IG5vbmU7Ci0gIG1hcmdpbjogMDsKLSAgbGluZS1oZWlnaHQ6IDEuMDVlbTsKLX0KLQotLnNob3ctcm93IHsKLSAgZGlzcGxheTogdGFibGUtcm93OwotfQotLmhpZGUtcm93IHsKLSAgZGlzcGxheTogaGlkZGVuOwotfQotCi0vKiBTRUFSQ0ggKi8KLQotLyogcmVzdHJpY3QgZ2xvYmFsIHNlYXJjaCBmb3JtIHdpZHRoICovCi0jc2VhcmNoRm9ybSB7Ci0gIHdpZHRoOjM1MHB4OwotfQotCi0jc2VhcmNoVHh0IHsKLSAgd2lkdGg6MjAwcHg7Ci19Ci0KLS8qIGRpc2FibGUgdHdpZGRsZSBhbmQgc2l6ZSBzZWxlY3RvcnMgZm9yIGxlZnQgY29sdW1uICovCi0jbGVmdFNlYXJjaENvbnRyb2wgZGl2IHsKLSAgd2lkdGg6IDEwMCU7Ci19Ci0KLSNsZWZ0U2VhcmNoQ29udHJvbCAuZ3NjLXR3aWRkbGUgewotICBiYWNrZ3JvdW5kLWltYWdlIDogbm9uZTsKLX0KLQotI2xlZnRTZWFyY2hDb250cm9sIHRkLCAjc2VhcmNoRm9ybSB0ZCB7Ci0gIGJvcmRlcjogMHB4IHNvbGlkICMwMDA7Ci19Ci0KLSNsZWZ0U2VhcmNoQ29udHJvbCAuZ3NjLXJlc3VsdHNIZWFkZXIgLmdzYy10aXRsZSB7Ci0gIHBhZGRpbmctbGVmdCA6IDBweDsKLSAgZm9udC13ZWlnaHQgOiBib2xkOwotICBmb250LXNpemUgOiAxM3B4OwotICBjb2xvcjojMDA2Njk5OwotICBkaXNwbGF5IDogbm9uZTsKLX0KLQotI2xlZnRTZWFyY2hDb250cm9sIC5nc2MtcmVzdWx0c0hlYWRlciBkaXYuZ3NjLXJlc3VsdHMtc2VsZWN0b3IgewotICBkaXNwbGF5IDogbm9uZTsKLX0KLQotI2xlZnRTZWFyY2hDb250cm9sIC5nc2MtcmVzdWx0c1Jvb3QgewotICBwYWRkaW5nLXRvcCA6IDZweDsKLX0KLQotI2xlZnRTZWFyY2hDb250cm9sIGRpdi5ncy12aXNpYmxlVXJsLWxvbmcgewotICBkaXNwbGF5IDogYmxvY2s7Ci0gIGNvbG9yOiMwMDY2OTk7Ci19Ci0KLS5nc2Mtd2ViUmVzdWx0IGRpdi5ncy12aXNpYmxlVXJsLXNob3J0LAotdGFibGUuZ3NjLWJyYW5kaW5nLAotLmdzYy1jbGVhci1idXR0b24gewotICBkaXNwbGF5IDogbm9uZTsKLX0KLQotLmdzYy1jdXJzb3ItYm94IC5nc2MtY3Vyc29yIGRpdi5nc2MtY3Vyc29yLXBhZ2UsCi0uZ3NjLWN1cnNvci1ib3ggLmdzYy10cmFpbGluZy1tb3JlLXJlc3VsdHMgYS5nc2MtdHJhaWxpbmctbW9yZS1yZXN1bHRzLAotI2xlZnRTZWFyY2hDb250cm9sIGEsCi0jbGVmdFNlYXJjaENvbnRyb2wgYSBiIHsKLSAgY29sb3I6IzAwNjY5OTsKLX0KLQotLmdzYy1yZXN1bHRzSGVhZGVyIHsKLSAgZGlzcGxheTogbm9uZTsKLX0KLQotLyogRGlzYWJsZSBidWlsdCBpbiBzZWFyY2ggZm9ybXMgKi8KLS5nc2MtY29udHJvbCBmb3JtLmdzYy1zZWFyY2gtYm94IHsKLSAgZGlzcGxheSA6IG5vbmU7Ci19Ci10YWJsZS5nc2Mtc2VhcmNoLWJveCB7Ci0gIG1hcmdpbjo2cHggMCAwIDA7Ci0gIGJvcmRlci1jb2xsYXBzZTpjb2xsYXBzZTsKLX0KLQotdGQuZ3NjLWlucHV0IHsKLSAgcGFkZGluZzowIDJweDsKLSAgd2lkdGg6MTAwJTsKLSAgdmVydGljYWwtYWxpZ246bWlkZGxlOwotfQotCi1pbnB1dC5nc2MtaW5wdXQgewotICBib3JkZXI6MXB4IHNvbGlkICNCQ0NERjA7Ci0gIHdpZHRoOjk5JTsKLSAgcGFkZGluZy1sZWZ0OjJweDsKLSAgZm9udC1zaXplOi45NWVtOwotfQotCi10ZC5nc2Mtc2VhcmNoLWJ1dHRvbiB7Ci0gIHRleHQtYWxpZ246IHJpZ2h0OwotICBwYWRkaW5nOjA7Ci0gIHZlcnRpY2FsLWFsaWduOnRvcDsKLX0KLQotI3NlYXJjaC1idXR0b24gewotICBtYXJnaW46MCAwIDAgMnB4OwotICBmb250LXNpemU6MTFweDsKLX0KLQotLyogc2VhcmNoIHJlc3VsdCB0YWJzICovCi0KLSNkb2MtY29udGVudCAuZ3NjLWNvbnRyb2wgewotICBwb3NpdGlvbjpyZWxhdGl2ZTsKLX0KLQotI2RvYy1jb250ZW50IC5nc2MtdGFic0FyZWEgewotICBwb3NpdGlvbjpyZWxhdGl2ZTsKLSAgd2hpdGUtc3BhY2U6bm93cmFwOwotfQotCi0jZG9jLWNvbnRlbnQgLmdzYy10YWJIZWFkZXIgewotICBwYWRkaW5nOiAzcHggNnB4OwotICBwb3NpdGlvbjpyZWxhdGl2ZTsKLSAgd2lkdGg6YXV0bzsKLX0KLQotI2RvYy1jb250ZW50IC5nc2MtdGFiSGVhZGVyLmdzYy10YWJoQWN0aXZlIHsKLSAgYm9yZGVyLXRvcDogMnB4IHNvbGlkICM5NEI5MjI7Ci19Ci0KLSNkb2MtY29udGVudCBoMiNzZWFyY2hUaXRsZSB7Ci0gIHBhZGRpbmc6MDsKLX0KLQotI2RvYy1jb250ZW50IC5nc2MtcmVzdWx0c2JveC12aXNpYmxlIHsKLSAgcGFkZGluZzoxZW0gMCAwIDZweDsKLX0KLQotLyogQ0FST1VTRUwgKi8KLQotI2hvbWVNaWRkbGUgewotICBwYWRkaW5nOiAwcHggMHB4IDBweCAwcHg7Ci0gIGZsb2F0OiBsZWZ0OwotICB3aWR0aDogNTg0cHg7Ci0gIGhlaWdodDogNjI3cHg7Ci0gIHBvc2l0aW9uOnJlbGF0aXZlOwotfQotCi0jdG9wQW5ub3VuY2VtZW50IHsKLSAgYmFja2dyb3VuZDp1cmwoaW1hZ2VzL2hvbWUvYmdfaG9tZV9hbm5vdW5jZW1lbnQucG5nKSBuby1yZXBlYXQgMCAwOwotfQotICAKLSNob21lVGl0bGUgewotICBwYWRkaW5nOjE1cHggMTVweCAwOwotICBoZWlnaHQ6MzBweDsKLX0KLQotI2hvbWVUaXRsZSBoMiB7Ci0gIHBhZGRpbmc6MDsKLX0KLQotI2Fubm91bmNlbWVudC1ibG9jayB7Ci0gIHBhZGRpbmc6MCAxNXB4IDA7Ci0gIG92ZXJmbG93OmhpZGRlbjsKLSAgYmFja2dyb3VuZDogdXJsKGltYWdlcy9ocl9ncmF5X3NpZGUuanBnKSBuby1yZXBlYXQgMTVweCAwOwotICB6b29tOjE7Ci19Ci0KLSNhbm5vdW5jZW1lbnQtYmxvY2s+KiB7Ci0gIHBhZGRpbmc6MTVweCAwIDA7Ci19Ci0KLSNhbm5vdW5jZW1lbnQtYmxvY2sgaW1nIHsKLSAgZmxvYXQ6bGVmdDsKLSAgbWFyZ2luOjAgMzBweCAwIDA7Ci19Ci0KLSNhbm5vdW5jZW1lbnQgewotICBmbG9hdDpsZWZ0OwotICBtYXJnaW46MDsKLX0KLQotI2Nhcm91c2VsIHsKLSAgYmFja2dyb3VuZDp1cmwoaW1hZ2VzL2hvbWUvYmdfaG9tZV9jYXJvdXNlbC5wbmcpIG5vLXJlcGVhdCAwIDA7Ci0gIHBvc2l0aW9uOnJlbGF0aXZlOwotICBoZWlnaHQ6NDAwcHg7Ci19Ci0KLSNjYXJvdXNlbE1haW4gewotICBiYWNrZ3JvdW5kOiB1cmwoaW1hZ2VzL2hvbWUvYmdfaG9tZV9jYXJvdXNlbF9ib2FyZC5wbmcpIDAgMCBuby1yZXBlYXQ7Ci0gIGhlaWdodDphdXRvOwotICBwYWRkaW5nOiAyNXB4IDIxcHggMDsKLSAgb3ZlcmZsb3c6aGlkZGVuOwotICBwb3NpdGlvbjpyZWxhdGl2ZTsKLSAgem9vbToxOyAvKklFNiovCi19Ci0KLSNjYXJvdXNlbE1haW4gaW1nIHsKLSAgbWFyZ2luOjA7Ci19Ci0KLSNjYXJvdXNlbE1haW4gLmJ1bGxldGluRGVzYyBoMyB7Ci0gIG1hcmdpbjowOwotICBwYWRkaW5nOjA7Ci19Ci0KLSNjYXJvdXNlbE1haW4gLmJ1bGxldGluRGVzYyBwIHsKLSAgbWFyZ2luOjA7Ci0gIHBhZGRpbmc6MC43ZW0gMCAwOwotfQotCi0jY2Fyb3VzZWxXaGVlbCB7Ci0gIGJhY2tncm91bmQ6IHVybChpbWFnZXMvaG9tZS9iZ19ob21lX2Nhcm91c2VsX3doZWVsLnBuZykgMCAwIG5vLXJlcGVhdDsKLSAgcGFkZGluZy10b3A6NDBweDsKLSAgaGVpZ2h0OjE1MHB4OwotfQotCi0uY2xlYXJlciB7IGNsZWFyOmJvdGg7IH0KLQotYSNhcnJvdy1sZWZ0LCBhI2Fycm93LXJpZ2h0IHsKLSAgZmxvYXQ6bGVmdDsKLSAgd2lkdGg6NDJweDsKLSAgaGVpZ2h0OjQycHg7Ci0gIGJhY2tncm91bmQtaW1hZ2U6dXJsKGltYWdlcy9ob21lL2Nhcm91c2VsX2J1dHRvbnNfc3ByaXRlLnBuZyk7Ci0gIGJhY2tncm91bmQtcmVwZWF0Om5vLXJlcGVhdDsKLX0KLWEjYXJyb3ctbGVmdCB7Ci0gIG1hcmdpbjozNXB4IDNweCAwIDEwcHg7Ci19Ci1hI2Fycm93LXJpZ2h0IHsKLSAgbWFyZ2luOjM1cHggMTBweCAwIDA7Ci19Ci1hLmFycm93LWxlZnQtb2ZmLAotYSNhcnJvdy1sZWZ0LmFycm93LWxlZnQtb2ZmOmhvdmVyIHsKLSAgYmFja2dyb3VuZC1wb3NpdGlvbjowIDA7Ci19Ci1hLmFycm93LXJpZ2h0LW9mZiwKLWEjYXJyb3ctcmlnaHQuYXJyb3ctcmlnaHQtb2ZmOmhvdmVyIHsKLSAgYmFja2dyb3VuZC1wb3NpdGlvbjotNDJweCAwOwotfQotYSNhcnJvdy1sZWZ0OmhvdmVyIHsKLSAgYmFja2dyb3VuZC1wb3NpdGlvbjowIC00MnB4OwotfQotYSNhcnJvdy1yaWdodDpob3ZlciB7Ci0gIGJhY2tncm91bmQtcG9zaXRpb246LTQycHggLTQycHg7Ci19Ci1hLmFycm93LWxlZnQtb24gewotICBiYWNrZ3JvdW5kLXBvc2l0aW9uOjAgMDsKLX0KLWEuYXJyb3ctcmlnaHQtb24gewotICBiYWNrZ3JvdW5kLXBvc2l0aW9uOi00MnB4IDA7Ci19Ci1hLmFycm93LXJpZ2h0LW9mZiwKLWEuYXJyb3ctbGVmdC1vZmYgewotICBjdXJzb3I6ZGVmYXVsdDsKLX0KLQotLmFwcC1saXN0LWNvbnRhaW5lciB7Ci0gIG1hcmdpbjowIDIwcHg7Ci0gIHBvc2l0aW9uOnJlbGF0aXZlOwotICB3aWR0aDoxMDAlOwotfQotCi1kaXYjbGlzdC1jbGlwIHsKLSAgaGVpZ2h0OjExMHB4OwotICB3aWR0aDo0MzhweDsKLSAgb3ZlcmZsb3c6aGlkZGVuOwotICBwb3NpdGlvbjpyZWxhdGl2ZTsKLSAgZmxvYXQ6bGVmdDsKLX0KLQotZGl2I2FwcC1saXN0IHsKLSAgbGVmdDowOwotICB6LWluZGV4OjE7Ci0gIHBvc2l0aW9uOmFic29sdXRlOwotICBtYXJnaW46MTFweCAwIDA7Ci0gIF9tYXJnaW4tdG9wOjEzcHg7Ci0gIHdpZHRoOjEwMDAlOwotfQotCi0jYXBwLWxpc3QgYSB7Ci0gIGRpc3BsYXk6YmxvY2s7Ci0gIGZsb2F0OmxlZnQ7Ci0gIGhlaWdodDo5MHB4OwotICB3aWR0aDo5MHB4OwotICBtYXJnaW46MCAyNHB4IDA7Ci0gIHBhZGRpbmc6M3B4OwotICBiYWNrZ3JvdW5kOiM5OWNjY2M7Ci0gIC13ZWJraXQtYm9yZGVyLXJhZGl1czo3cHg7Ci0gIC1tb3otYm9yZGVyLXJhZGl1czo3cHg7Ci0gIGJvcmRlci1yYWRpdXM6N3B4OwotICB0ZXh0LWRlY29yYXRpb246bm9uZTsKLSAgdGV4dC1hbGlnbjpjZW50ZXI7Ci0gIGZvbnQtc2l6ZToxMXB4OwotICBsaW5lLWhlaWdodDoxMXB4OwotfQotCi0jYXBwLWxpc3QgYSBzcGFuIHsKLSAgcG9zaXRpb246cmVsYXRpdmU7Ci0gIHRvcDotNHB4OwotfQotCi0jYXBwLWxpc3QgaW1nIHsKLSAgd2lkdGg6OTBweDsKLSAgaGVpZ2h0OjcwcHg7Ci0gIG1hcmdpbjowOwotfQotCi0jYXBwLWxpc3QgYS5zZWxlY3RlZCwKLSNhcHAtbGlzdCBhOmFjdGl2ZS5zZWxlY3RlZCwKLSNhcHAtbGlzdCBhOmhvdmVyLnNlbGVjdGVkIHsKLSAgYmFja2dyb3VuZDojQTRDNjM5OwotICBjb2xvcjojZmZmOwotICBjdXJzb3I6ZGVmYXVsdDsKLSAgdGV4dC1kZWNvcmF0aW9uOm5vbmU7Ci19Ci0KLSNhcHAtbGlzdCBhOmhvdmVyLAotI2FwcC1saXN0IGE6YWN0aXZlIHsKLSAgYmFja2dyb3VuZDojZmY5OTAwOwotfQotCi0jYXBwLWxpc3QgYTpob3ZlciBzcGFuLAotI2FwcC1saXN0IGE6YWN0aXZlIHNwYW4gewotICB0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lOwotfQotCi0jZHJvaWQtbmFtZSB7Ci0gIHBhZGRpbmctdG9wOi41ZW07Ci0gIGNvbG9yOiM2NjY7Ci0gIHBhZGRpbmctYm90dG9tOi4yNWVtOwotfQotCi0vKklFNiovCi0qIGh0bWwgI2FwcC1saXN0IGEgeyB6b29tOiAxOyBtYXJnaW46MCAyNHB4IDAgMTVweDt9Ci0KLSogaHRtbCAjbGlzdC1jbGlwIHsKLSAgd2lkdGg6NDMwcHggIWltcG9ydGFudDsKLX0KLQotLypjYXJvdXNlbCBidWxsZXRpbiBsYXlvdXRzKi8KLS8qNDYwcHggd2lkdGgqLwotLyoxODVweCBoZWlnaHQqLwotLmltZy1sZWZ0IHsKLSAgZmxvYXQ6bGVmdDsKLSAgd2lkdGg6MjMwcHg7Ci0gIG92ZXJmbG93OmhpZGRlbjsKLSAgcGFkZGluZzo4cHggMCA4cHggOHB4OwotfQotLmRlc2MtcmlnaHQgewotICBmbG9hdDpsZWZ0OwotICB3aWR0aDoyNzBweDsKLSAgcGFkZGluZzoxMHB4OwotfQotLmltZy1yaWdodCB7Ci0gIGZsb2F0OnJpZ2h0OwotICB3aWR0aDoyMjBweDsKLSAgb3ZlcmZsb3c6aGlkZGVuOwotICBwYWRkaW5nOjhweCA4cHggOHB4IDA7Ci19Ci0uZGVzYy1sZWZ0IHsKLSAgZmxvYXQ6cmlnaHQ7Ci0gIHdpZHRoOjI4MHB4OwotICBwYWRkaW5nOjEwcHg7Ci0gIHRleHQtYWxpZ246cmlnaHQ7Ci19Ci0uaW1nLXRvcCB7Ci0gIHBhZGRpbmc6MjBweCAyMHB4IDA7Ci19Ci0uZGVzYy1ib3R0b20gewotICBwYWRkaW5nOjEwcHg7Ci19Ci0KLQotLyogVklERU8gUEFHRSAqLwotCi0jbWFpbkJvZHlMZWZ0LnZpZGVvUGxheWVyIHsKLSAgd2lkdGg6NTcwcHg7Ci19Ci0KLSNtYWluQm9keVJpZ2h0LnZpZGVvUGxheWVyIHsKLSAgd2lkdGg6MzMwcHg7Ci19Ci0KLS8qIHBsYXllciAqLwotCi0jdmlkZW9QbGF5ZXJCb3ggewotICBiYWNrZ3JvdW5kLWNvbG9yOiAjREFGM0ZDOwotICBib3JkZXItcmFkaXVzOjdweDsKLSAgLW1vei1ib3JkZXItcmFkaXVzOjdweDsKLSAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOjdweDsKLSAgd2lkdGg6NTMwcHg7Ci0gIHBhZGRpbmc6MjBweDsKLSAgYm9yZGVyOjFweCBzb2xpZCAjZDNlY2Y1OwotICBib3gtc2hhZG93OjJweCAzcHggMXB4ICNlZWU7Ci0gIC1tb3otYm94LXNoYWRvdzoycHggM3B4IDFweCAjZWVlOwotICAtd2Via2l0LWJveC1zaGFkb3c6MnB4IDNweCAxcHggI2VlZTsKLX0KLQotI3ZpZGVvQm9yZGVyIHsKLSAgYmFja2dyb3VuZC1jb2xvcjogI0ZGRjsKLSAgbWluLWhlaWdodDozOTlweDsKLSAgaGVpZ2h0OmF1dG8gIWltcG9ydGFudDsKLSAgYm9yZGVyOjFweCBzb2xpZCAjY2NkYWRhOwotICBib3JkZXItcmFkaXVzOjdweCA3cHggMCAwOwotICAtbW96LWJvcmRlci1yYWRpdXM6N3B4IDdweCAwIDA7Ci0gIC13ZWJraXQtYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czo3cHg7Ci0gIC13ZWJraXQtYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6N3B4OwotfQotCi0jdmlkZW9QbGF5ZXJUaXRsZSB7Ci0gIHdpZHRoOjUwMHB4OwotICBwYWRkaW5nOjE1cHggMTVweCAwOwotfQotCi0jdmlkZW9QbGF5ZXJUaXRsZSBoMiB7Ci0gIGZvbnQtd2VpZ2h0OmJvbGQ7Ci0gIGZvbnQtc2l6ZToxLjJlbTsKLSAgY29sb3I6IzMzNjY2NjsKLSAgbWFyZ2luOjA7Ci0gIHBhZGRpbmc6MDsKLX0KLQotI29iamVjdFdyYXBwZXIgewotICBwYWRkaW5nOjE1cHggMTVweDsKLSAgaGVpZ2h0OjMzNHB4OwotICB3aWR0aDo1MDBweDsKLX0KLQotLyogcGxheWxpc3QgdGFicyAqLwotCi11bCN2aWRlb1RhYnMgewotICBsaXN0LXN0eWxlLXR5cGU6bm9uZTsKLSAgcGFkZGluZzowOwotICBjbGVhcjpib3RoOwotICBtYXJnaW46MDsKLSAgcGFkZGluZzogMjBweCAwIDAgMTVweDsKLSAgem9vbToxOyAvKiBJRTcvOCwgb3RoZXJ3aXNlIHRvcC1wYWRkaW5nIGlzIGRvdWJsZSAqLwotfQotCi11bCN2aWRlb1RhYnMgbGkgewotICBkaXNwbGF5OmlubGluZTsKLSAgcGFkZGluZzowOwotICBtYXJnaW46MCAzcHggMCAwOwotICBsaW5lLWhlaWdodDoyZW07Ci19Ci0KLXVsI3ZpZGVvVGFicyBsaSBhIHsKLSAgYm9yZGVyLXJhZGl1czo3cHggN3B4IDAgMDsKLSAgLW1vei1ib3JkZXItcmFkaXVzOjdweCA3cHggMCAwOwotICAtd2Via2l0LWJvcmRlci10b3AtbGVmdC1yYWRpdXM6N3B4OwotICAtd2Via2l0LWJvcmRlci10b3AtcmlnaHQtcmFkaXVzOjdweDsKLSAgYmFja2dyb3VuZDojOTVjMGQwOwotICBjb2xvcjojZmZmOwotICB0ZXh0LWRlY29yYXRpb246bm9uZTsKLSAgcGFkZGluZzouNDVlbSAxLjVlbTsKLSAgZm9udC13ZWlnaHQ6Ym9sZDsKLX0KLQotdWwjdmlkZW9UYWJzIGxpLnNlbGVjdGVkIGEgewotICBmb250LXdlaWdodDpib2xkOwotICB0ZXh0LWRlY29yYXRpb246bm9uZTsKLSAgY29sb3I6IzU1NTsKLSAgYmFja2dyb3VuZDojZGFmM2ZjOwotICBib3JkZXItYm90dG9tOjFweCBzb2xpZCAjZGFmM2ZjOwotfQotCi11bCN2aWRlb1RhYnMgbGk6aG92ZXIgYSB7Ci0gIGJhY2tncm91bmQ6Izg1YWNiYTsKLX0KLQotdWwjdmlkZW9UYWJzIGxpLnNlbGVjdGVkOmhvdmVyIGEgewotICBiYWNrZ3JvdW5kOiNkYWYzZmM7Ci19Ci0KLS8qIHBsYXlsaXN0cyAqLwotCi0jdmlkZW9zIHsKLSAgYmFja2dyb3VuZDojZGFmM2ZjOwotICBtYXJnaW4tYm90dG9tOjEuNWVtOwotICBwYWRkaW5nOjE1cHg7Ci0gIGJvcmRlci1yYWRpdXM6NXB4OwotICAtbW96LWJvcmRlci1yYWRpdXM6NXB4OwotICAtd2Via2l0LWJvcmRlci1yYWRpdXM6NXB4OwotICBib3gtc2hhZG93OjJweCAzcHggMXB4ICNlZWU7Ci0gIC1tb3otYm94LXNoYWRvdzoycHggM3B4IDFweCAjZWVlOwotICAtd2Via2l0LWJveC1zaGFkb3c6MnB4IDNweCAxcHggI2VlZTsKLX0KLQotI3ZpZGVvcyBkaXYgewotICBkaXNwbGF5Om5vbmU7Ci19Ci0KLSN2aWRlb3MgZGl2LnNlbGVjdGVkIHsKLSAgZGlzcGxheTpibG9jazsKLX0KLQotdWwudmlkZW9QcmV2aWV3cyB7Ci0gIGxpc3Qtc3R5bGU6bm9uZTsKLSAgcGFkZGluZzowOwotICBtYXJnaW46MDsKLSAgem9vbToxOyAvKiBJRSwgb3RoZXJ3aXNlLCBsYXlvdXQgZG9lc24ndCB1cGRhdGUgd2hlbiBzaG93aW5nICdtb3JlJyAqLwotfQotCi11bC52aWRlb1ByZXZpZXdzIGxpIHsKLSAgbWFyZ2luOjAgMCA1cHg7Ci0gIHBhZGRpbmc6MDsKLSAgb3ZlcmZsb3c6aGlkZGVuOwotICBwb3NpdGlvbjpyZWxhdGl2ZTsKLX0KLQotI21haW5Cb2R5Rml4ZWQgdWwudmlkZW9QcmV2aWV3cyBoMyB7Ci0gIGZvbnQtc2l6ZTogMTJweDsKLSAgbWFyZ2luOjAgMCAxZW0gMTMwcHg7Ci0gIHBhZGRpbmc6MDsKLSAgZm9udC13ZWlnaHQ6Ym9sZDsKLSAgY29sb3I6aW5oZXJpdDsKLX0KLQotdWwudmlkZW9QcmV2aWV3cyBhIHsKLSAgbWFyZ2luOjFweDsKLSAgcGFkZGluZzoxMHB4OwotICB0ZXh0LWRlY29yYXRpb246bm9uZTsKLSAgaGVpZ2h0OjkwcHg7Ci0gIGRpc3BsYXk6YmxvY2s7Ci0gIGJvcmRlci1yYWRpdXM6NXB4OwotICAtbW96LWJvcmRlci1yYWRpdXM6NXB4OwotICAtd2Via2l0LWJvcmRlci1yYWRpdXM6NXB4OwotICBiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50OwotfQotCi11bC52aWRlb1ByZXZpZXdzIGE6aG92ZXIgewotICBiYWNrZ3JvdW5kLWNvbG9yOiNGRkY7Ci0gIGJvcmRlcjpub25lOyAvKiBJRTgsIG90aGVyd2lzZSwgYmcgZG9lc24ndCB3b3JrICovCi19Ci0KLXVsLnZpZGVvUHJldmlld3MgYS5zZWxlY3RlZCB7Ci0gIGJhY2tncm91bmQtY29sb3I6ICNGRjk5MDA7Ci19Ci0KLXVsLnZpZGVvUHJldmlld3MgaW1nIHsKLSAgZmxvYXQ6bGVmdDsKLSAgY2xlYXI6bGVmdDsKLSAgbWFyZ2luOjA7Ci19Ci0KLXVsLnZpZGVvUHJldmlld3MgaDMgewotICBmb250LXNpemU6MTJweDsKLSAgZm9udC13ZWlnaHQ6Ym9sZDsKLSAgdGV4dC1kZWNvcmF0aW9uOm5vbmU7Ci0gIG1hcmdpbjowIDAgMWVtIDEzMHB4OwotICBwYWRkaW5nOjA7Ci19Ci0KLXVsLnZpZGVvUHJldmlld3MgcCB7Ci0gIGZvbnQtc2l6ZTogMTJweDsKLSAgdGV4dC1kZWNvcmF0aW9uOm5vbmU7Ci0gIG1hcmdpbjowIDAgMS4yZW0gMTMwcHg7Ci19Ci0KLXVsLnZpZGVvUHJldmlld3MgcC5mdWxsIHsKLSAgZGlzcGxheTpub25lOwotfQotCi11bC52aWRlb1ByZXZpZXdzIHNwYW4ubW9yZSB7Ci0gIHBhZGRpbmc6MCAwIDAgMTJweDsKLSAgYmFja2dyb3VuZDp1cmwoaW1hZ2VzL2Fycm93X2JsdWVsaW5rX2Rvd24ucG5nKSAwIDJweCBuby1yZXBlYXQ7Ci19Ci0KLXVsLnZpZGVvUHJldmlld3Mgc3Bhbi5sZXNzIHsKLSAgcGFkZGluZzowIDAgMCAxMnB4OwotICBiYWNrZ3JvdW5kOnVybChpbWFnZXMvYXJyb3dfYmx1ZWxpbmtfdXAucG5nKSAwIDJweCBuby1yZXBlYXQ7Ci0gIGRpc3BsYXk6bm9uZTsKLX0KLQotdWwudmlkZW9QcmV2aWV3cyBwLnRvZ2dsZSB7Ci0gIHBvc2l0aW9uOmFic29sdXRlOwotICBtYXJnaW46MDsKLSAgbWFyZ2luLXRvcDotMjNweDsgLyogaW5zdGVhZCBvZiBib3R0b206MjNweCwgYmVjYXVzZSBJRSB3b24ndCBkbyBpdCBjb3JyZWN0bHkgKi8KLSAgbGVmdDoxNDBweDsKLX0KLQotdWwudmlkZW9QcmV2aWV3cyBwLnRvZ2dsZSBhIHsKLSAgaGVpZ2h0OmF1dG87Ci0gIG1hcmdpbjowOwotICBwYWRkaW5nOjA7Ci0gIHpvb206MTsgLyogSUU2LCBvdGhlcndpc2UgdGhlIG1hcmdpbiBjb25zaWRlcnMgdGhlIGltZyBvbiByZWRyYXdzICovCi19Ci0KLXVsLnZpZGVvUHJldmlld3MgcC50b2dnbGUgYTpob3ZlciB7Ci0gIHRleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7Ci0gIGJhY2tncm91bmQ6dHJhbnNwYXJlbnQ7IC8qIElFNiwgb3RoZXJ3aXNlIGl0IGluaGVyaXRzIHdoaXRlICovCi19Ci0KLS8qIGZlYXR1cmVkIHZpZGVvcyAqLwotCi0jbWFpbkJvZHlSaWdodCBoMiB7Ci0gIHBhZGRpbmc6MCAwIDVweDsKLX0KLQotI21haW5Cb2R5UmlnaHQgdWwudmlkZW9QcmV2aWV3cyB7Ci0gIG1hcmdpbjoxMHB4IDAgMDsKLX0KLQotI21haW5Cb2R5UmlnaHQgdWwudmlkZW9QcmV2aWV3cyBsaSB7Ci0gIGZvbnQtc2l6ZToxMXB4OwotICBsaW5lLWhlaWdodDoxM3B4OwotICBtYXJnaW46MCAwIDVweDsKLSAgcGFkZGluZzowOwotfQotCi0jbWFpbkJvZHlSaWdodCB1bC52aWRlb1ByZXZpZXdzIGgzIHsKLSAgcGFkZGluZzowOwotICBtYXJnaW46MDsKLSAgZm9udC1zaXplOjEwMCU7Ci19Ci0KLSNtYWluQm9keVJpZ2h0IHVsLnZpZGVvUHJldmlld3MgYSB7Ci0gIHRleHQtZGVjb3JhdGlvbjpub25lOwotICBoZWlnaHQ6MTA4cHg7Ci0gIGJvcmRlcjoxcHggc29saWQgI0ZGRjsKLX0KLQotI21haW5Cb2R5UmlnaHQgdWwudmlkZW9QcmV2aWV3cyBhOmhvdmVyIHsKLSAgYm9yZGVyOjFweCBzb2xpZCAjQ0NEQURBOwotfQotCi0jbWFpbkJvZHlSaWdodCB1bC52aWRlb1ByZXZpZXdzIGEuc2VsZWN0ZWQgewotICBib3JkZXI6MXB4IHNvbGlkICNGRkY7Ci19Ci0KLSNtYWluQm9keVJpZ2h0IHVsLnZpZGVvUHJldmlld3MgcCB7Ci0gIGxpbmUtaGVpZ2h0OjEuMmVtOwotICBwYWRkaW5nOjA7Ci0gIG1hcmdpbjo0cHggMCAwIDEzMHB4OwotfQotCi0jbWFpbkJvZHlSaWdodCB1bC52aWRlb1ByZXZpZXdzIGltZyB7Ci0gIG1hcmdpbi10b3A6NXB4OwotfQotCi0vKiBQcmV0dHkgcHJpbnRpbmcgc3R5bGVzLiBVc2VkIHdpdGggcHJldHRpZnkuanMuICovCi0KLS5zdHIgeyBjb2xvcjogIzA4MDsgfQotLmt3ZCB7IGNvbG9yOiAjMDA4OyB9Ci0uY29tIHsgY29sb3I6ICM4MDA7IH0KLS50eXAgeyBjb2xvcjogIzYwNjsgfQotLmxpdCB7IGNvbG9yOiAjMDY2OyB9Ci0ucHVuIHsgY29sb3I6ICM2NjA7IH0KLS5wbG4geyBjb2xvcjogIzAwMDsgfQotZGwudGFnLWxpc3QgZHQgY29kZSwKLS50YWcgeyBjb2xvcjogIzAwODsgfQotZGwuYXRuLWxpc3QgZHQgY29kZSwKLS5hdG4geyBjb2xvcjogIzgyODsgfQotLmF0diB7IGNvbG9yOiAjMDgwOyB9Ci0uZGVjIHsgY29sb3I6ICM2MDY7IH0KLQotQG1lZGlhIHByaW50IHsKLSAgLnN0ciB7IGNvbG9yOiAjMDYwOyB9Ci0gIC5rd2QgeyBjb2xvcjogIzAwNjsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0KLSAgLmNvbSB7IGNvbG9yOiAjNjAwOyBmb250LXN0eWxlOiBpdGFsaWM7IH0KLSAgLnR5cCB7IGNvbG9yOiAjNDA0OyBmb250LXdlaWdodDogYm9sZDsgfQotICAubGl0IHsgY29sb3I6ICMwNDQ7IH0KLSAgLnB1biB7IGNvbG9yOiAjNDQwOyB9Ci0gIC5wbG4geyBjb2xvcjogIzAwMDsgfQotICAudGFnIHsgY29sb3I6ICMwMDY7IGZvbnQtd2VpZ2h0OiBib2xkOyB9Ci0gIC5hdG4geyBjb2xvcjogIzQwNDsgfQotICAuYXR2IHsgY29sb3I6ICMwNjA7IH0KLX0KLQotCi0jdGl0bGUgewotICBib3JkZXItYm90dG9tOiA0cHggc29saWQgI2NjYzsKLSAgZGlzcGxheTpub25lOwotfQotCi0jdGl0bGUgaDEgewotICBjb2xvcjojMzM2NjY2OwotICBtYXJnaW46MDsKLSAgcGFkZGluZzogNXB4IDEwcHg7Ci0gIGZvbnQtc2l6ZTogMWVtOwotICBsaW5lLWhlaWdodDogMTVweDsKLX0KLQotI3RpdGxlIGgxIC5zbWFsbHsKLSAgY29sb3I6IzAwMDsKLSAgbWFyZ2luOjA7Ci0gIGZvbnQtc2l6ZTogMTNweDsKLSAgcGFkZGluZzowIDAgMCAxNXB4OwotfQotCi0vKiBTSURFIE5BVklHQVRJT04gKi8KLQotI3NpZGUtbmF2IHsKLSAgcGFkZGluZzowIDZweCAwIDA7Ci0gIGJhY2tncm91bmQtY29sb3I6ICNmZmY7Ci0gIGZvbnQtc2l6ZToxMnB4OwotfQotCi0jcmVzaXplLXBhY2thZ2VzLW5hdiB7Ci0vKiBrZWVwcyB0aGUgcmVzaXplIGhhbmRsZSBiZWxvdyB0aGUgaC1zY3JvbGwgaGFuZGxlICovCi0gIGhlaWdodDoyNzBweDsKLSAgb3ZlcmZsb3c6aGlkZGVuOwotICBtYXgtaGVpZ2h0OjEwMCU7Ci19Ci0KLSNwYWNrYWdlcy1uYXYgewotICBoZWlnaHQ6MjcwcHg7Ci0gIG1heC1oZWlnaHQ6aW5oZXJpdDsKLSAgcG9zaXRpb246cmVsYXRpdmU7Ci0gIG92ZXJmbG93OmF1dG87Ci19Ci0KLSNjbGFzc2VzLW5hdiwKLSNkZXZkb2MtbmF2IHsKLSAgb3ZlcmZsb3c6YXV0bzsKLSAgcG9zaXRpb246cmVsYXRpdmU7Ci19Ci0KLSNzaWRlLW5hdiB1bCB7Ci0gIGxpc3Qtc3R5bGU6IG5vbmU7Ci0gIG1hcmdpbjogMDsKLSAgcGFkZGluZzo1cHggMDsKLX0KLQotI3NpZGUtbmF2IHVsIHVsIHsKLSAgbWFyZ2luOiAuNWVtIDAgMCAwOwotICBwYWRkaW5nOiAwOwotfQotCi0jc2lkZS1uYXYgbGkgewotICBwYWRkaW5nOjA7Ci0gIHBhZGRpbmc6MXB4IDAgMXB4IDA7Ci0gIHpvb206MTsKLX0KLQotI3NpZGUtbmF2IGxpIHNwYW4uaGVhZGluZywKLSNzaWRlLW5hdiBsaSBoMiB7Ci0gIGRpc3BsYXk6YmxvY2s7Ci0gIGZvbnQtc2l6ZToxMnB4OwotICBmb250LXdlaWdodDogYm9sZDsKLSAgbWFyZ2luOi41ZW0gMCAwIDA7Ci0gIHBhZGRpbmc6IDNweCAwIDFweCA5cHg7Ci19Ci0KLSNzaWRlLW5hdiBsaSBhIHsKLSAgZGlzcGxheTogaW5saW5lLWJsb2NrOyAvKiBuZWVkZWQgdG8gYXBwbHkgcGFkZGluZyB0byBsaW5lLXdyYXBzICovCi0gIHRleHQtZGVjb3JhdGlvbjpub25lOwotICBwYWRkaW5nOiAwIDAgMCAxOHB4OwotICB6b29tOjE7Ci19Ci0KLSNzaWRlLW5hdiBsaSBhIHNwYW4rc3BhbiB7Ci0gIGRpc3BsYXk6bm9uZTsKLX0KLQotI3NpZGUtbmF2IGxpIGE6aG92ZXIgewotICB0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lOwotfQotCi0jc2lkZS1uYXYgbGkgYSthIHsKLSAgcGFkZGluZzogMDsKLX0KLS8qc2Vjb25kIGxldmVsIChuZXN0ZWQpIGxpc3QqLwotI3NpZGUtbmF2IGxpIGxpIGxpIGEgewotICBwYWRkaW5nOiAwIDAgMCAyOHB4OwotfQotLyp0aGlyZCBsZXZlbCAobmVzdGVkKSBsaXN0Ki8KLSNzaWRlLW5hdiBsaSBsaSBsaSBsaSBhIHsKLSAgcGFkZGluZzogMCAwIDAgMzhweDsKLX0KLQotI3NpZGUtbmF2IC5zZWxlY3RlZCB7Ci0gIGJhY2tncm91bmQtY29sb3I6ICM0MzVhNmU7Ci0gIGNvbG9yOiAjZmZmOwotICBmb250LXdlaWdodDpib2xkOwotfQotCi0jc2lkZS1uYXYgLnNlbGVjdGVkIGEgewotICBjb2xvcjogI2ZmZjsKLSAgdGV4dC1kZWNvcmF0aW9uOm5vbmU7Ci19Ci0KLSNzaWRlLW5hdiBzdHJvbmcgewotICBkaXNwbGF5OmJsb2NrOwotfQotCi0jc2lkZS1uYXYgLnRvZ2dsZS1saXN0IC50b2dnbGUtaW1nIHsKLSAgbWFyZ2luOjA7Ci0gIHBhZGRpbmc6MDsKLSAgcG9zaXRpb246YWJzb2x1dGU7Ci0gIHRvcDowOwotICBsZWZ0OjA7Ci0gIGhlaWdodDoxNnB4OwotICB3aWR0aDoxNXB4OwotICBvdXRsaW5lLXN0eWxlOm5vbmU7Ci19Ci0vKiBzZWNvbmQtbGV2ZWwgdG9nZ2xlICovCi0jc2lkZS1uYXYgLnRvZ2dsZS1saXN0IC50b2dnbGUtbGlzdCAudG9nZ2xlLWltZyB7Ci0gIGxlZnQ6MTBweDsKLX0KLQotI3NpZGUtbmF2IC5jbG9zZWQgLnRvZ2dsZS1pbWcsCi0jc2lkZS1uYXYgLm9wZW4gLmNsb3NlZCAudG9nZ2xlLWltZyB7Ci0gIGJhY2tncm91bmQ6dXJsKCdpbWFnZXMvdHJpYW5nbGUtY2xvc2VkLXNtYWxsLnBuZycpIDdweCA0cHggbm8tcmVwZWF0OwotfQotI3NpZGUtbmF2IC5vcGVuIC50b2dnbGUtaW1nIHsKLSAgYmFja2dyb3VuZDp1cmwoJ2ltYWdlcy90cmlhbmdsZS1vcGVuZWQtc21hbGwucG5nJykgN3B4IDRweCBuby1yZXBlYXQ7Ci19Ci0KLSNzaWRlLW5hdiAudG9nZ2xlLWxpc3QgewotICBwb3NpdGlvbjpyZWxhdGl2ZTsKLX0KLQotI3NpZGUtbmF2IC50b2dnbGUtbGlzdCB1bCB7Ci0gIG1hcmdpbjowOwotICBkaXNwbGF5Om5vbmU7Ci19Ci0KLSNzaWRlLW5hdiAudG9nZ2xlLWxpc3QgZGl2IHsKLSAgZGlzcGxheTpibG9jazsKLX0KLQotI2luZGV4LWxpbmtzIC5zZWxlY3RlZCB7Ci0gIGJhY2tncm91bmQtY29sb3I6ICNmZmY7Ci0gIGNvbG9yOiAjMDAwOwotICBmb250LXdlaWdodDpub3JtYWw7Ci0gIHRleHQtZGVjb3JhdGlvbjpub25lOwotfQotCi0jaW5kZXgtbGlua3MgewotICBwYWRkaW5nOjdweCAwIDRweCAxMHB4OwotfQotCi0vKiBuYXYgdHJlZSAqLwotCi0jbmF2LXRyZWUgdWwgewotICBwYWRkaW5nOjVweCAwIDEuNWVtOwotfQotCi0jc2lkZS1uYXYgI25hdi10cmVlIHVsIGxpIGEsCi0jc2lkZS1uYXYgI25hdi10cmVlIHVsIGxpIHNwYW4ubm8tY2hpbGRyZW4gewotICBwYWRkaW5nOiAwIDAgMCAwOwotICBtYXJnaW46IDA7Ci19Ci0KLSNuYXYtdHJlZSAucGx1cyB7Ci0gIG1hcmdpbjogMCAzcHggMCAwOwotfQotCi0jbmF2LXRyZWUgdWwgdWwgewotICBsaXN0LXN0eWxlOiBub25lOwotICBtYXJnaW46IDA7Ci0gIHBhZGRpbmc6IDAgMCAwIDA7Ci19Ci0KLSNuYXYtdHJlZSB1bCBsaSB7Ci0gIG1hcmdpbjogMDsKLSAgcGFkZGluZzogMCAwIDAgMDsKLSAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKLX0KLQotI25hdi10cmVlIC5jaGlsZHJlbl91bCB7Ci0gIG1hcmdpbjowOwotfQotCi0jbmF2LXRyZWUgYS5ub2xpbmsgewotICBjb2xvcjogYmxhY2s7Ci0gIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotI25hdi10cmVlIHNwYW4ubGFiZWwgewotICB3aWR0aDogMTAwJTsKLX0KLQotI25hdi10cmVlIHsKLSAgb3ZlcmZsb3cteDogYXV0bzsKLSAgb3ZlcmZsb3cteTogc2Nyb2xsOwotfQotCi0jbmF2LXN3YXAgewotICBmb250LXNpemU6MTBweDsKLSAgbGluZS1oZWlnaHQ6MTBweDsKLSAgbWFyZ2luLWxlZnQ6MWVtOwotICB0ZXh0LWRlY29yYXRpb246bm9uZTsKLSAgZGlzcGxheTpibG9jazsKLX0KLQotI3RyZWUtbGluayB7Ci0KLX0KLQotLyogRE9DVU1FTlQgQk9EWSAqLwotCi0jZG9jLWNvbnRlbnQgewotICBvdmVyZmxvdzphdXRvOwotfQotCi0jamQtaGVhZGVyIHsKLSAgYmFja2dyb3VuZC1jb2xvcjogI0UyRTJFMjsKLSAgcGFkZGluZzogN3B4IDE1cHg7Ci19Ci0KLSNqZC1oZWFkZXIgaDEgewotICBtYXJnaW46IDAgMCAxMHB4OwotICBmb250LXNpemU6MS43ZW07Ci19Ci0KLSNqZC1oZWFkZXIgLmNydW1iIHsKLSAgZm9udC1zaXplOi45ZW07Ci0gIGxpbmUtaGVpZ2h0OjFlbTsKLSAgY29sb3I6Izc3NzsKLX0KLQotI2pkLWhlYWRlciAuY3J1bWIgYSwKLSNqZC1oZWFkZXIgLmNydW1iIGE6dmlzaXRlZCB7Ci0gIHRleHQtZGVjb3JhdGlvbjpub25lOwotICBjb2xvcjojNzc3OwotfQotCi0jamQtaGVhZGVyIC5jcnVtYiBhOmhvdmVyIHsKLSAgdGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTsKLX0KLQotI2pkLWhlYWRlciB0YWJsZSB7Ci0gIG1hcmdpbjowOwotICBwYWRkaW5nOjA7Ci19Ci0KLSNqZC1oZWFkZXIgdGQgewotICBib3JkZXI6bm9uZTsKLSAgcGFkZGluZzowOwotICB2ZXJ0aWNhbC1hbGlnbjp0b3A7Ci19Ci0KLSNqZC1oZWFkZXIuZ3VpZGUtaGVhZGVyIHsKLSAgYmFja2dyb3VuZC1jb2xvcjojZmZmOwotICBjb2xvcjojNDM1YTZlOwotICBoZWlnaHQ6NTBweDsKLX0KLQotI2pkLWRlc2NyIHsKLSAgcG9zaXRpb246cmVsYXRpdmU7Ci19Ci0KLS8qIHN1bW1hcnkgdGFibGVzIGZvciByZWZlcmVuY2UgcGFnZXMgKi8KLS5qZC1zdW10YWJsZSB7Ci0gIG1hcmdpbjogLjVlbSAxZW0gMWVtIDFlbTsKLSAgd2lkdGg6OTUlOyAvKiBjb25zaXN0ZW50IHRhYmxlIHdpZHRoczsgd2l0aGluIElFJ3MgcXVpcmtzICovCi0gIGZvbnQtc2l6ZTouOWVtOwotfQotCi0uamQtc3VtdGFibGUgYSB7Ci0gIHRleHQtZGVjb3JhdGlvbjpub25lOwotfQotCi0uamQtc3VtdGFibGUgYTpob3ZlciB7Ci0gIHRleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7Ci19Ci0KLS8qIHRoZSBsaW5rIGluc2lkZSBhIHN1bXRhYmxlIGZvciAiU2hvdyBBbGwvSGlkZSBBbGwiICovCi0udG9nZ2xlLWFsbCB7Ci0gIGRpc3BsYXk6YmxvY2s7Ci0gIGZsb2F0OnJpZ2h0OwotICBmb250LXdlaWdodDpub3JtYWw7Ci0gIGZvbnQtc2l6ZTowLjllbTsKLX0KLQotLyogYWRqdXN0bWVudHMgZm9yIGluL2RpcmVjdCBzdWJjbGFzc2VzIHRhYmxlcyAqLwotLmpkLXN1bXRhYmxlLXN1YmNsYXNzZXMgewotICBtYXJnaW46IDFlbSAwIDAgMDsKLSAgbWF4LXdpZHRoOjk2OHB4OwotfQotCi0vKiBleHRyYSBzcGFjZSBiZXR3ZWVuIGVuZCBvZiBtZXRob2QgbmFtZSBhbmQgb3Blbi1wYXJlbiAqLwotLnN5bXBhZCB7Ci0gIG1hcmdpbi1yaWdodDogMnB4OwotfQotCi0vKiByaWdodCBhbGlnbm1lbnQgZm9yIHRoZSByZXR1cm4gdHlwZSBpbiBzdW10YWJsZSAqLwotLmpkLXN1bXRhYmxlIC5qZC10eXBlY29sIHsKLSAgdGV4dC1hbGlnbjpyaWdodDsKLX0KLQotLyogYWRqdXN0bWVudHMgZm9yIHRoZSBleHBhbmRvIHRhYmxlLWluLXRhYmxlICovCi0uamQtc3VtdGFibGUtZXhwYW5kbyB7Ci0gIG1hcmdpbjouNWVtIDA7Ci0gIHBhZGRpbmc6MDsKLX0KLQotLyogYSBkaXYgdGhhdCBob2xkcyBhIHNob3J0IGRlc2NyaXB0aW9uICovCi0uamQtZGVzY3JkaXYgewotICBwYWRkaW5nOjNweCAxZW0gMCAxZW07Ci0gIG1hcmdpbjowOwotICBib3JkZXI6MDsKLX0KLQotLyogcGFnZS10b3AtcmlnaHQgY29udGFpbmVyIGZvciByZWZlcmVuY2UgcGFnZXMgKGhvbGRzCi1saW5rcyB0byBzdW1tYXJ5IHRhYmxlcykgKi8KLSNhcGktaW5mby1ibG9jayB7Ci0gIGZvbnQtc2l6ZTouOGVtOwotICBwYWRkaW5nOjZweCAxMHB4OwotICBmb250LXdlaWdodDpub3JtYWw7Ci0gIGZsb2F0OnJpZ2h0OwotICB0ZXh0LWFsaWduOnJpZ2h0OwotICBjb2xvcjojOTk5OwotICBtYXgtd2lkdGg6NzAlOwotfQotCi0jYXBpLWxldmVsLXRvZ2dsZSB7Ci0gIHBhZGRpbmc6MCAxMHB4OwotICBmb250LXNpemU6MTFweDsKLSAgZmxvYXQ6cmlnaHQ7Ci19Ci0KLSNhcGktbGV2ZWwtdG9nZ2xlIGxhYmVsLmRpc2FibGVkIHsKLSAgY29sb3I6Izk5OTsKLX0KLQotZGl2LmFwaS1sZXZlbCB7Ci0gIGZvbnQtc2l6ZTouOGVtOwotICBmb250LXdlaWdodDpub3JtYWw7Ci0gIGNvbG9yOiM5OTk7Ci0gIGZsb2F0OnJpZ2h0OwotICBwYWRkaW5nOjAgN3B4IDA7Ci0gIG1hcmdpbi10b3A6LTI1cHg7Ci19Ci0KLSNhcGktaW5mby1ibG9jayBkaXYuYXBpLWxldmVsIHsKLSAgZm9udC1zaXplOjEuM2VtOwotICBmb250LXdlaWdodDpib2xkOwotICBmbG9hdDpub25lOwotICBjb2xvcjojNDQ0OwotICBwYWRkaW5nOjA7Ci0gIG1hcmdpbjowOwotfQotCi0vKiBGb3JjZSBsaW5rIGNvbG9ycyBmb3IgSUU2ICovCi1kaXYuYXBpLWxldmVsIGEgewotICBjb2xvcjojOTk5OwotfQotI2FwaS1pbmZvLWJsb2NrIGRpdi5hcGktbGV2ZWwgYTpsaW5rIHsKLSAgY29sb3I6IzQ0NDsKLX0KLSNhcGktbGV2ZWwtdG9nZ2xlIGEgewotICBjb2xvcjojOTk5OwotfQotCi1kaXYjZGVwcmVjYXRlZFN0aWNrZXIgewotICBkaXNwbGF5Om5vbmU7Ci0gIHotaW5kZXg6OTk7Ci0gIHBvc2l0aW9uOmZpeGVkOwotICByaWdodDoxNXB4OwotICB0b3A6MTE0cHg7Ci0gIG1hcmdpbjowOwotICBwYWRkaW5nOjFlbTsKLSAgYmFja2dyb3VuZDojRkZGOwotICBib3JkZXI6MXB4IHNvbGlkICNkZGRkMDA7Ci0gIGJveC1zaGFkb3c6LTVweCA1cHggMTBweCAjY2NjOwotICAtbW96LWJveC1zaGFkb3c6LTVweCA1cHggMTBweCAjY2NjOwotICAtd2Via2l0LWJveC1zaGFkb3c6LTVweCA1cHggMTBweCAjY2NjOwotfQotCi1kaXYjbmFNZXNzYWdlIHsKLSAgZGlzcGxheTpub25lOwotICB3aWR0aDo1NTVweDsKLSAgaGVpZ2h0OjA7Ci0gIG1hcmdpbjowIGF1dG87Ci19Ci0KLWRpdiNuYU1lc3NhZ2UgZGl2IHsKLSAgei1pbmRleDo5OTsKLSAgd2lkdGg6NDUwcHg7Ci0gIHBvc2l0aW9uOmZpeGVkOwotICBtYXJnaW46NTBweCAwOwotICBwYWRkaW5nOjRlbSA0ZW0gM2VtOwotICBiYWNrZ3JvdW5kOiNGRkY7Ci0gIGJvcmRlcjoxcHggc29saWQgI2RkZGQwMDsKLSAgYm94LXNoYWRvdzotMTBweCAxMHB4IDQwcHggIzg4ODsKLSAgLW1vei1ib3gtc2hhZG93Oi0xMHB4IDEwcHggNDBweCAjODg4OwotICAtd2Via2l0LWJveC1zaGFkb3c6LTEwcHggMTBweCA0MHB4ICM4ODg7Ci19Ci0vKiBJRTYgY2FuJ3QgcG9zaXRpb24gZml4ZWQgKi8KLSogaHRtbCBkaXYjbmFNZXNzYWdlIGRpdiB7IHBvc2l0aW9uOmFic29sdXRlOyB9Ci0KLWRpdiNuYU1lc3NhZ2Ugc3Ryb25nIHsKLSAgZm9udC1zaXplOjEuMWVtOwotfQotCi0uYWJzZW50LAotLmFic2VudCBhOmxpbmssCi0uYWJzZW50IGE6dmlzaXRlZCwKLS5hYnNlbnQgYTpob3ZlciwKLS5hYnNlbnQgKiB7Ci0gIGNvbG9yOiNiYmIgIWltcG9ydGFudDsKLSAgY3Vyc29yOmRlZmF1bHQgIWltcG9ydGFudDsKLSAgdGV4dC1kZWNvcmF0aW9uOm5vbmUgIWltcG9ydGFudDsKLX0KLQotI2FwaS1sZXZlbC10b2dnbGUgYSwKLS5hcGktbGV2ZWwgYSB7Ci0gIGNvbG9yOmluaGVyaXQ7Ci0gIHRleHQtZGVjb3JhdGlvbjpub25lOwotfQotCi0jYXBpLWxldmVsLXRvZ2dsZSBhOmhvdmVyLAotLmFwaS1sZXZlbCBhOmhvdmVyIHsKLSAgY29sb3I6aW5oZXJpdDsKLSAgdGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZSAhaW1wb3J0YW50OwotICBjdXJzb3I6cG9pbnRlciAhaW1wb3J0YW50OwotfQotCi0jc2lkZS1uYXYgbGkuYWJzZW50LnNlbGVjdGVkLAotI3NpZGUtbmF2IGxpLmFic2VudC5zZWxlY3RlZCAqLAotI3NpZGUtbmF2IGRpdi5sYWJlbC5hYnNlbnQuc2VsZWN0ZWQsCi0jc2lkZS1uYXYgZGl2LmxhYmVsLmFic2VudC5zZWxlY3RlZCAqIHsKLSAgYmFja2dyb3VuZC1jb2xvcjojZWFlYWVhICFpbXBvcnRhbnQ7Ci19Ci0vKiBJRTYgcXVpcmsgKHdvbid0IGNoYWluIGNsYXNzZXMsIHNvIGp1c3Qga2VlcCBiYWNrZ3JvdW5kIGJsdWUpICovCi0qIGh0bWwgI3NpZGUtbmF2IGxpLnNlbGVjdGVkLAotKiBodG1sICNzaWRlLW5hdiBsaS5zZWxlY3RlZCAqLAotKiBodG1sICNzaWRlLW5hdiBkaXYubGFiZWwuc2VsZWN0ZWQsCi0qIGh0bWwgI3NpZGUtbmF2IGRpdi5sYWJlbC5zZWxlY3RlZCAqIHsKLSAgYmFja2dyb3VuZC1jb2xvcjogIzQzNWE2ZSAhaW1wb3J0YW50OwotfQotCi0KLS5hYnNlbnQgaDQuamQtZGV0YWlscy10aXRsZSwKLS5hYnNlbnQgaDQuamQtZGV0YWlscy10aXRsZSAqIHsKLSAgYmFja2dyb3VuZC1jb2xvcjojZjZmNmY2ICFpbXBvcnRhbnQ7Ci19Ci0KLS5hYnNlbnQgaW1nIHsKLSAgb3BhY2l0eTogLjM7Ci0gIGZpbHRlcjogYWxwaGEob3BhY2l0eT0zMCk7Ci0gIC1tcy1maWx0ZXI6InByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5BbHBoYShPcGFjaXR5PTMwKSI7Ci19Ci0KLQotLyogYXBwbGllcyB0byBhIGRpdiBjb250YWluaW5nIGxpbmtzIHRvIHN1bW1hcnkgdGFibGVzICovCi0uc3VtLWRldGFpbHMtbGlua3MgewotICBwYWRkaW5nOjA7Ci0gIGZvbnQtd2VpZ2h0Om5vcm1hbDsKLX0KLQotLnN1bS1kZXRhaWxzLWxpbmtzIGEgewotICB0ZXh0LWRlY29yYXRpb246bm9uZTsKLX0KLQotLnN1bS1kZXRhaWxzLWxpbmtzIGE6aG92ZXIgewotICB0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lOwotfQotCi0KLS8qIGluaGVyaXRhbmNlIHRhYmxlICovCi0uamQtaW5oZXJpdGFuY2UtdGFibGUgewotICBib3JkZXItc3BhY2luZzowOwotICBtYXJnaW46MDsKLSAgcGFkZGluZzowOwotICBmb250LXNpemU6LjllbTsKLX0KLS5qZC1pbmhlcml0YW5jZS10YWJsZSB0ZCB7Ci0gIGJvcmRlcjogbm9uZTsKLSAgbWFyZ2luOiAwOwotICBwYWRkaW5nOiAwOwotfQotLmpkLWluaGVyaXRhbmNlLXRhYmxlIC5qZC1pbmhlcml0YW5jZS1zcGFjZSB7Ci0gIGZvbnQtd2VpZ2h0OmJvbGQ7Ci0gIHdpZHRoOjFlbTsKLX0KLS5qZC1pbmhlcml0YW5jZS10YWJsZSAuamQtaW5oZXJpdGFuY2UtaW50ZXJmYWNlLWNlbGwgewotICBwYWRkaW5nLWxlZnQ6IDE3cHg7Ci19Ci0KLSNqZC1jb250ZW50IHsKLSAgcGFkZGluZzogMThweCAxNXB4OwotfQotCi1ociB7Ci0gIGJhY2tncm91bmQtY29sb3I6I2NjYzsKLSAgYm9yZGVyLWNvbG9yOiNmZmY7Ci0gIG1hcmdpbjoyZW0gMCAxZW07Ci19Ci0KLS8qIERPQyBDTEFTU0VTICovCi0KLSNqZC1jb250ZW50IGgxIHsKLS8qc2RrIHBhZ2UqLwotICBmb250LXNpemU6MS42ZW07Ci0gIGNvbG9yOiMzMzY2NjY7Ci0gIG1hcmdpbjowIDAgLjVlbTsKLX0KLQotI2pkLWNvbnRlbnQgaDIgewotICBmb250LXNpemU6MS40NWVtOwotICBjb2xvcjojMTExOwotICBib3JkZXItdG9wOjJweCBzb2xpZCAjY2NjOwotICBwYWRkaW5nOiAuNWVtIDAgMDsKLSAgbWFyZ2luOiAyZW0gMCAxZW0gMDsKLX0KLQotI2pkLWNvbnRlbnQgaDMgewotICBmb250LXNpemU6MS4zZW07Ci0gIGNvbG9yOiMzYTNhM2E7Ci0gIHBhZGRpbmc6IDA7Ci0gIG1hcmdpbjogMS41ZW0gMCAuNjVlbSAwOwotfQotCi0jamQtY29udGVudCBoNCB7Ci0gIGZvbnQtc2l6ZToxLjFlbTsKLSAgY29sb3I6IzNhM2EzYTsKLSAgcGFkZGluZzogMDsKLSAgbWFyZ2luOiAxLjI1ZW0gMCAuNjVlbSAwOwotfQotCi0jamQtY29udGVudCBoNSB7Ci0gIGZvbnQtc2l6ZToxLjBlbTsKLSAgY29sb3I6IzNhM2EzYTsKLSAgcGFkZGluZzogMDsKLSAgbWFyZ2luOiAxZW0gMCAuNjVlbSAwOwotfQotCi0jamQtY29udGVudCAuc21hbGwtaGVhZGVyIHsKLSAgZm9udC1zaXplOjFlbTsKLSAgY29sb3I6IzAwMDsKLSAgZm9udC13ZWlnaHQ6Ym9sZDsKLSAgYm9yZGVyOm5vbmU7Ci0gIHBhZGRpbmc6MDsKLSAgbWFyZ2luOjFlbSAwIC41ZW07Ci0gIHBvc2l0aW9uOmluaGVyaXQ7Ci19Ci0KLSNqZC1jb250ZW50IHRhYmxlIHsKLSAgbWFyZ2luOiAwIDAgMWVtIDFlbTsKLX0KLQotI2pkLWNvbnRlbnQgaW1nIHsKLSAgbWFyZ2luOiAwIDAgMWVtIDFlbTsKLX0KLQotI2pkLWNvbnRlbnQgbGkgaW1nLAotI2pkLWNvbnRlbnQgZGQgaW1nIHsKLSAgbWFyZ2luOi41ZW0gMCAuNWVtIDFlbTsKLX0KLQotLm5vbGlzdCB7Ci0gIGxpc3Qtc3R5bGU6bm9uZTsKLSAgcGFkZGluZzowOwotICBtYXJnaW46MCAwIDFlbSAxZW07Ci19Ci0KLS5ub2xpc3QgbGkgewotICBwYWRkaW5nOjAgMCAycHg7Ci0gIG1hcmdpbjowOwotfQotCi1oNCAubm9ybWFsIHsKLSAgZm9udC1zaXplOi45ZW07Ci0gIGZvbnQtd2VpZ2h0Om5vcm1hbDsKLX0KLQotLmNhcHMgewotICBmb250LXZhcmlhbnQ6c21hbGwtY2FwczsKLSAgZm9udC1zaXplOjEuMmVtOwotfQotCi1kbC50YWctbGlzdCBkbC5hdG4tbGlzdCB7Ci0gIHBhZGRpbmc6MCAwIDAgMmVtOwotfQotCi0uamQtZGV0YWlscyB7Ci0vKiAgYm9yZGVyOjFweCBzb2xpZCAjNjY5OTk5OwotICBwYWRkaW5nOjRweDsgKi8KLSAgbWFyZ2luOjAgMCAxZW07Ci19Ci0KLS8qIEFQSSByZWZlcmVuY2U6IGEgY29udGFpbmVyIGZvciB0aGUKLS50YWdkYXRhIGJsb2NrcyB0aGF0IG1ha2UgdXAgdGhlIGRldGFpbGVkCi1kZXNjcmlwdGlvbiAqLwotLmpkLWRldGFpbHMtZGVzY3IgewotICBwYWRkaW5nOjA7Ci0gIG1hcmdpbjouNWVtIC4yNWVtOwotfQotCi0vKiBBUEkgcmVmZXJlbmNlOiBhIGJsb2NrIGNvbnRhaW5pbmcKLWEgZGV0YWlsZWQgZGVzY3JpcHRpb24sIGEgcGFyYW1zIHRhYmxlLAotc2VlYWxzbyBsaXN0LCBldGMgKi8KLS5qZC10YWdkYXRhIHsKLSAgbWFyZ2luOi41ZW0gMWVtOwotfQotCi0uamQtdGFnZGF0YSBwIHsKLSAgbWFyZ2luOjAgMCAxZW0gMWVtOwotfQotCi0vKiBBUEkgcmVmZXJlbmNlOiBhZGp1c3RtZW50cyB0bwotdGhlIGRldGFpbGVkIGRlc2NyaXB0aW9uIGJsb2NrICovCi0uamQtdGFnZGVzY3IgewotICBtYXJnaW46LjI1ZW0gMCAuNzVlbSAwOwotICBsaW5lLWhlaWdodDoxZW07Ci19Ci0KLS5qZC10YWdkZXNjciBwIHsKLSAgbWFyZ2luOi41ZW0gMDsKLSAgcGFkZGluZzowOwotCi19Ci0KLS5qZC10YWdkZXNjciBvbCwKLS5qZC10YWdkZXNjciB1bCB7Ci0gIG1hcmdpbjowIDIuNWVtOwotICBwYWRkaW5nOjA7Ci19Ci0KLS5qZC10YWdkZXNjciB0YWJsZSwKLS5qZC10YWdkZXNjciBpbWcgewotICBtYXJnaW46LjI1ZW0gMWVtOwotfQotCi0uamQtdGFnZGVzY3IgbGkgewotbWFyZ2luOjAgMCAuMjVlbSAwOwotcGFkZGluZzowOwotfQotCi0vKiBBUEkgcmVmZXJlbmNlOiBoZWFkaW5nIG1hcmtpbmcKLXRoZSBkZXRhaWxzIHNlY3Rpb24gZm9yIGNvbnN0YW50cywKLWF0dHJzLCBtZXRob2RzLCBldGMuICovCi1oNC5qZC1kZXRhaWxzLXRpdGxlIHsKLSAgZm9udC1zaXplOjEuMTVlbTsKLSAgYmFja2dyb3VuZC1jb2xvcjogI0UyRTJFMjsKLSAgbWFyZ2luOjEuNWVtIDAgLjZlbTsKLSAgcGFkZGluZzozcHggOTVweCAzcHggM3B4OyAvKiByb29tIGZvciBhcGktbGV2ZWwgKi8KLX0KLQotaDQuamQtdGFndGl0bGUgewotICBtYXJnaW46MDsKLX0KLQotLyogQVBJIHJlZmVyZW5jZTogaGVhZGluZyBmb3IgIlBhcmFtZXRlcnMiLCAiU2VlIEFsc28iLCBldGMuLAotaW4gZGV0YWlscyBzZWN0aW9ucyAqLwotaDUuamQtdGFndGl0bGUgewotICBtYXJnaW46MCAwIC4yNWVtIDA7Ci0gIGZvbnQtc2l6ZToxZW07Ci19Ci0KLS5qZC10YWd0YWJsZSB7Ci0gIG1hcmdpbjowOwotfQotCi0uamQtdGFndGFibGUgdGQsCi0uamQtdGFndGFibGUgdGggewotICBib3JkZXI6bm9uZTsKLSAgYmFja2dyb3VuZC1jb2xvcjojZmZmOwotICB2ZXJ0aWNhbC1hbGlnbjp0b3A7Ci0gIGZvbnQtd2VpZ2h0Om5vcm1hbDsKLSAgcGFkZGluZzoycHggMTBweDsKLX0KLQotLmpkLXRhZ3RhYmxlIHRoIHsKLSAgZm9udC1zdHlsZTppdGFsaWM7Ci19Ci0KLSNqZC1jb250ZW50IHRhYmxlIGgyIHsKLSAgYmFja2dyb3VuZC1jb2xvcjogI2Q2ZDZkNjsKLSAgZm9udC1zaXplOiAxLjFlbTsKLSAgbWFyZ2luOjAgMCAxMHB4OwotICBwYWRkaW5nOjVweDsKLSAgbGVmdDowOwotICB3aWR0aDphdXRvOwotfQotCi1kaXYuZGVzaWduLWFubm91bmNlIHsKLSAgYm9yZGVyLXRvcDoxcHggc29saWQgIzMzQjVFNTsKLSAgYm9yZGVyLWJvdHRvbToxcHggc29saWQgIzMzQjVFNTsKLSAgcGFkZGluZzo1cHggMTBweCAxMHB4IDU1cHg7Ci0gIG1hcmdpbjoyZW0gMDsKLSAgYmFja2dyb3VuZDp1cmwoJ2ltYWdlcy9pY29uX2Rlc2lnbi5wbmcnKSA1cHggMTNweCBuby1yZXBlYXQ7Ci19Ci0KLWRpdi5kZXNpZ24tYW5ub3VuY2UgcCB7Ci0gIG1hcmdpbjogLjVlbSAwIDAgMDsKLX0KLQotZGl2LnNwZWNpYWwgewotICBwYWRkaW5nOiAuNWVtIDFlbSAxZW0gMWVtOwotICBtYXJnaW46IDAgMCAxZW07Ci0gIGJhY2tncm91bmQtY29sb3I6ICNEQUYzRkM7Ci0gIGJvcmRlcjoxcHggc29saWQgI2QzZWNmNTsKLSAgYm9yZGVyLXJhZGl1czo1cHg7Ci0gIC1tb3otYm9yZGVyLXJhZGl1czo1cHg7Ci0gIC13ZWJraXQtYm9yZGVyLXJhZGl1czo1cHg7Ci19Ci0KLWRpdi5zcGVjaWFsIHAgewotICBtYXJnaW46IC41ZW0gMCAwIDA7Ci19Ci0KLWRpdi5zcGVjaWFsIG9sIHsKLSAgbWFyZ2luOiAwOwotfQotCi1kaXYuc3BlY2lhbCBvbCBsaSB7Ci0gIG1hcmdpbjogMDsKLSAgcGFkZGluZzogMDsKLX0KLQotI2pkLWNvbnRlbnQgZGl2LnNwZWNpYWwgaDIsCi0jamQtY29udGVudCBkaXYuc3BlY2lhbCBoMyB7Ci0gIGNvbG9yOiM2Njk5OTk7Ci0gIGZvbnQtc2l6ZToxLjJlbTsKLSAgYm9yZGVyOm5vbmU7Ci0gIG1hcmdpbjowIDAgLjVlbTsKLSAgcGFkZGluZzowOwotfQotCi0jamQtY29udGVudCBkaXYuc3BlY2lhbC5yZWZlcmVuY2UgaDIsCi0jamQtY29udGVudCBkaXYuc3BlY2lhbC5yZWZlcmVuY2UgaDMsCi0jamQtY29udGVudCBkaXYuc3BlY2lhbC5yZWZlcmVuY2UgaDQgewotICBjb2xvcjojMDAwOwotICBmb250LXNpemU6MWVtOwotICBib3JkZXI6bm9uZTsKLSAgZm9udC13ZWlnaHQ6Ym9sZDsKLSAgbWFyZ2luOi41ZW0gMDsKLSAgcGFkZGluZzowOwotfQotCi1wLm5vdGUsIGRpdi5ub3RlLAotcC5jYXV0aW9uLCBkaXYuY2F1dGlvbiwKLXAud2FybmluZywgZGl2Lndhcm5pbmcgewotICBtYXJnaW46IDFlbTsKLSAgcGFkZGluZzogMCAwIDAgLjVlbTsKLSAgYm9yZGVyLWxlZnQ6IDRweCBzb2xpZDsKLX0KLQotcC5zcGVjaWFsLW5vdGUsCi1kaXYuc3BlY2lhbC1ub3RlIHsKLSAgYmFja2dyb3VuZC1jb2xvcjojRUJGM0RCOwotICBwYWRkaW5nOjEwcHggMjBweDsKLSAgbWFyZ2luOjAgMCAxZW07Ci19Ci0KLXAubm90ZSwKLWRpdi5ub3RlIHsKLSBib3JkZXItY29sb3I6ICM5OWFhY2M7Ci19Ci0KLXAud2FybmluZywKLWRpdi53YXJuaW5nIHsKLSAgYm9yZGVyLWNvbG9yOiAjYWEwMDMzOwotfQotCi1wLmNhdXRpb24sCi1kaXYuY2F1dGlvbiB7Ci0gIGJvcmRlci1jb2xvcjogI2ZmY2YwMDsKLX0KLQotbGkgLm5vdGUsCi1saSAuY2F1dGlvbiwKLWxpIC53YXJuaW5nIHsKLSAgbWFyZ2luOiAuNWVtIDAgMCAwOwotICBwYWRkaW5nOiAuMmVtIC41ZW0gLjJlbSAuOWVtOwotfQotCi0vKiBNYWtlcyBzdXJlIHRoZSBmaXJzdCBwYXJhZ3JhcGggZG9lcyBub3QgYWRkIHRvcC13aGl0ZXNwYWNlIHdpdGhpbiB0aGUgYm94Ki8KLWxpIC5ub3RlPnA6Zmlyc3QtY2hpbGQsCi1saSAuY2F1dGlvbj5wOmZpcnN0LWNoaWxkLAotbGkgLndhcm5pbmc+cDpmaXJzdC1jaGlsZCB7Ci0gIG1hcmdpbi10b3A6MDsKLSAgcGFkZGluZy10b3A6MDsKLX0KLQotZGwueG1sIGR0IHsKLSAgZm9udC12YXJpYW50OnNtYWxsLWNhcHM7Ci0gIGZvbnQtc2l6ZToxLjJlbTsKLX0KLQotZGwueG1sIGRsIHsKLSAgcGFkZGluZzowOwotfQotCi1kbC54bWwgZGwgZHQgewotICBmb250LXZhcmlhbnQ6bm9ybWFsOwotICBmb250LXNpemU6MWVtOwotfQotCi0ubGlzdGhlYWQgbGkgewotICBmb250LXdlaWdodDogYm9sZDsKLX0KLQotLmxpc3RoZWFkIGxpICosIC8qaWUqLy5saXN0aGVhZCBsaSBsaSB7Ci0gIGZvbnQtd2VpZ2h0OiBub3JtYWw7Ci19Ci0KLW9sLm5vLXN0eWxlLAotdWwubm8tc3R5bGUgewotICBsaXN0LXN0eWxlOm5vbmU7Ci0gIHBhZGRpbmctbGVmdDoxZW07Ci19Ci0KLS5uZXcsCi0ubmV3LWNoaWxkIHsKLSAgZm9udC1zaXplOiAuNzhlbTsKLSAgZm9udC13ZWlnaHQ6IGJvbGQ7Ci0gIGNvbG9yOiAjZmYzZDNkOwotICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci0gIHZlcnRpY2FsLWFsaWduOnRvcDsKLSAgbGluZS1oZWlnaHQ6LjllbTsKLSAgd2hpdGUtc3BhY2U6bm93cmFwOwotfQotCi0udG9nZ2xlLWxpc3Qub3BlbiAubmV3LWNoaWxkIHsKLSAgZGlzcGxheTpub25lOwotfQotCi1wcmUuY2xhc3NpYyB7Ci0gIGJhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7Ci0gIGJvcmRlcjpub25lOwotICBwYWRkaW5nOjA7Ci19Ci0KLXAuaW1nLWNhcHRpb24gewotICBtYXJnaW46IC0wLjVlbSAwIDFlbSAxZW07IC8qIG1hdGNoZXMgZGVmYXVsdCBpbWcgbGVmdC1tYXJnaW4gKi8KLX0KLQotZGl2LmZpZ3VyZSB7Ci0gIGZsb2F0OnJpZ2h0OwotICBjbGVhcjpyaWdodDsKLSAgbWFyZ2luOjFlbSAwIDAgMDsKLSAgcGFkZGluZzowIDAgMCAzZW07Ci0gIGJhY2tncm91bmQtY29sb3I6I2ZmZjsKLSAgLyogd2lkdGggbXVzdCBiZSBkZWZpbmVkIHcvIGFuIGlubGluZSBzdHlsZSBtYXRjaGluZyB0aGUgaW1hZ2Ugd2lkdGggKi8KLX0KLQotI2pkLWNvbnRlbnQKLWRpdi5maWd1cmUgaW1nIHsKLSAgbWFyZ2luOiAwIDAgMWVtOwotfQotCi1kaXYuZmlndXJlIHAuaW1nLWNhcHRpb24gewotICBtYXJnaW46IC0wLjVlbSAwIDFlbSAwOwotfQotCi1wLnRhYmxlLWNhcHRpb24gewotICBtYXJnaW46IDAgMCAwLjVlbSAxZW07IC8qIG1hdGNoZXMgZGVmYXVsdCB0YWJsZSBsZWZ0LW1hcmdpbiAqLwotfQotCi0KLS8qIHRvZ2dsZSBmb3IgbWlzYyBjb250ZW50IChzdWNoIGFzIGxvbmcgc2FtcGxlIGNvZGUpIAotICAgc2VlIHRvZ2dsZUNvbnRlbnQoKSBzY3JpcHQgaW4gYW5kcm9pZC1kZXZlbG9wZXItZG9jcy5qcyAqLwotLnRvZ2dsZS1jb250ZW50LmNsb3NlZCAudG9nZ2xlLWNvbnRlbnQtdG9nZ2xlbWUgewotICBkaXNwbGF5Om5vbmU7Ci19Ci0KLS50b2dnbGUtY29udGVudCBhW2hyZWY9IiMiXSB7Ci0gIHRleHQtZGVjb3JhdGlvbjpub25lOwotICBjb2xvcjppbmhlcml0OwotfQotCi0udG9nZ2xlLWNvbnRlbnQtdG9nZ2xlbWUgewotICBwYWRkaW5nLWJvdHRvbToxcHg7IC8qIGZpeGVzIGFuaW1hdGlvbiBib3VuY2UgZHVlIHRvIG1hcmdpbnMgKi8KLX0KLQotI2pkLWNvbnRlbnQgLnRvZ2dsZS1jb250ZW50IGltZy50b2dnbGUtY29udGVudC1pbWcgewotICBtYXJnaW46MDsKLX0KLQotCi0vKiBCRUdJTiBxdWlja3ZpZXcgc2lkZWJhciBlbGVtZW50IHN0eWxlcyAqLwotCi0jcXYtd3JhcHBlciB7Ci0gIGZsb2F0OiByaWdodDsKLSAgd2lkdGg6MzEwcHg7IC8qICszNXB4IHBhZGRpbmcgKi8KLSAgYmFja2dyb3VuZC1jb2xvcjojZmZmOwotICBtYXJnaW46LTQ4cHggMCAycHggMDsKLSAgcGFkZGluZzowIDAgMjBweCAzNXB4OwotfQotCi0jcXYgewotICBiYWNrZ3JvdW5kLWNvbG9yOiNmZmY7Ci0gIGJvcmRlcjo0cHggc29saWQgI2RlZThmMTsKLSAgbWFyZ2luOjA7Ci0gIHBhZGRpbmc6MCA1cHggNXB4OwotICB3aWR0aDoyOTJweDsgLyogKzEwcHggcGFkZGluZzsgKzhweCBib3JkZXIgKi8KLSAgZm9udC1zaXplOi45ZW07Ci19Ci0KLSNxdiBvbCB7Ci0gIGxpc3Qtc3R5bGU6bm9uZTsKLSAgcGFkZGluZzogMDsKLX0KLQotI3F2IG9sIG9sewotICBsaXN0LXN0eWxlOm5vbmU7Ci0gIHBhZGRpbmc6IDAgMCAwIDEycHg7Ci0gIG1hcmdpbjowOwotfQotCi0jcXYgdWwgewotICBwYWRkaW5nOiAwIDEwcHggMCAyZW07Ci19Ci0KLSNxdiBsaSB7Ci0gIHBhZGRpbmc6IDAgMTBweCAzcHg7Ci0gIGxpbmUtaGVpZ2h0OiAxLjJlbTsKLX0KLQotI3F2IGxpIGxpIHsKLSAgcGFkZGluZzogM3B4IDEwcHggMDsKLX0KLQotI3F2IHVsIGxpIHsKLSAgcGFkZGluZzogMCAxMHB4IDAgMDsKLX0KLQotI3F2IGxpLnNlbGVjdGVkIGEgewotICBjb2xvcjojNTU1OwotICB0ZXh0LWRlY29yYXRpb246bm9uZTsKLX0KLQotI3F2IGEsCi0jcXYgYSBjb2RlIHsKLSAgY29sb3I6I2NjNjYwMDsKLX0KLQotI3F2IHAgewotICBtYXJnaW46OHB4IDAgMDsKLSAgcGFkZGluZzowIDEwcHg7Ci19Ci0KLSNqZC1jb250ZW50ICNxdiBoMiB7Ci0gIGZvbnQtc2l6ZToxLjA1ZW07Ci0gIGZvbnQtd2VpZ2h0OmJvbGQ7Ci0gIG1hcmdpbjoxMnB4IDAgLjI1ZW0gMDsKLSAgcGFkZGluZzowIDEwcHg7Ci0gIGJhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7Ci0gIGNvbG9yOiM3QkIwMjY7Ci0gIGJvcmRlcjpub25lOwotICBsZWZ0OjA7Ci0gIHotaW5kZXg6MTsKLX0KLQotI3F2LWV4dHJhICNydWxlIHsKLSAgcGFkZGluZzogMCAxMHB4OwotICBtYXJnaW46IDA7Ci19Ci0KLSNxdi1zdWItcnVsZSB7Ci0gIHBhZGRpbmc6IDVweCAxNXB4IDEwcHg7Ci0gIG1hcmdpbjogMDsKLX0KLQotI2pkLWNvbnRlbnQKLSNxdi1zdWItcnVsZSBoMiB7Ci0gIG1hcmdpbjogMCAwIC41ZW0gMDsKLX0KLQotLyogRU5EIHF1aWNrdmlldyBzaWRlYmFyIGVsZW1lbnQgc3R5bGVzICovCi0KLS8qIEJlZ2luIHNpZGVib3ggc2lkZWJhciBlbGVtZW50IHN0eWxlcyAqLwotCi0uc2lkZWJveC13cmFwcGVyIHsKLSAgZmxvYXQ6cmlnaHQ7Ci0gIGNsZWFyOnJpZ2h0OwotICB3aWR0aDozMTBweDsgLyogKzM1cHggcGFkZGluZyAqLwotICBiYWNrZ3JvdW5kLWNvbG9yOiNmZmY7Ci0gIG1hcmdpbjowOwotICBwYWRkaW5nOjAgMCAyMHB4IDM1cHg7Ci19Ci0KLS5zaWRlYm94IHsKLSAgYm9yZGVyLWxlZnQ6MXB4IHNvbGlkICNkZWU4ZjE7Ci0gIGJhY2tncm91bmQtY29sb3I6I2ZmZmZlZTsKLSAgbWFyZ2luOjA7Ci0gIHBhZGRpbmc6OHB4IDEycHg7Ci0gIGZvbnQtc2l6ZTowLjllbTsKLSAgd2lkdGg6Mjg1cHg7IC8qICsyNHB4IHBhZGRpbmc7ICsxcHggYm9yZGVyICovCi19Ci0KLS5zaWRlYm94IHAgewotICBtYXJnaW4tYm90dG9tOiAuNzVlbTsKLX0KLQotLnNpZGVib3ggdWwgewotICBwYWRkaW5nOiAwIDAgMCAxLjVlbTsKLX0KLQotLnNpZGVib3ggbGkgdWwgewotICBtYXJnaW4tdG9wOjA7Ci0gIG1hcmdpbi1ib3R0b206LjFlbTsKLX0KLQotLnNpZGVib3ggbGkgewotcGFkZGluZzowIDAgMCAwZW07Ci19Ci0KLSNqZC1jb250ZW50IC5zaWRlYm94IGgyLAotI2pkLWNvbnRlbnQgLnNpZGVib3ggaDMsCi0jamQtY29udGVudCAuc2lkZWJveCBoNCwKLSNqZC1jb250ZW50IC5zaWRlYm94IGg1IHsKLSAgYm9yZGVyOm5vbmU7Ci0gIGZvbnQtc2l6ZToxZW07Ci0gIG1hcmdpbjowOwotICBwYWRkaW5nOjAgMCA4cHg7Ci0gIGxlZnQ6MDsKLSAgei1pbmRleDowOwotfQotCi0uc2lkZWJveCBociB7Ci0gIGJhY2tncm91bmQtY29sb3I6I2NjYzsKLSAgYm9yZGVyOm5vbmU7Ci19Ci0KLS8qIEVuZCBzaWRlYm94IHNpZGViYXIgZWxlbWVudCBzdHlsZXMgKi8KLQotLyogQkVHSU4gZGV2ZWxvcGVyIHRyYWluaW5nIGJhciBzdHlsZXMgKi8KLQotZGl2I3RiLXdyYXBwZXIgewotICBmbG9hdDogcmlnaHQ7Ci0gIGNsZWFyOnJpZ2h0OwotICB3aWR0aDozODBweDsgLyogKzI1cHggcGFkZGluZyA9IDQwNSAqLwotICBiYWNrZ3JvdW5kLWNvbG9yOiNmZmY7Ci0gIG1hcmdpbjowIDAgMnB4IDA7Ci0gIHBhZGRpbmc6MCAwIDIwcHggMjVweDsKLX0KLQotZGl2I3RiIHsKLSAgbWFyZ2luOjA7Ci0gIHBhZGRpbmc6MCAxNXB4OwotICB3aWR0aDozNTBweDsgLyogKzE1cHggcGFkZGluZyA9IDM4MCAqLwotICBmb250LXNpemU6LjllbTsKLSAgYmFja2dyb3VuZDojZTllOWU5OwotICBib3JkZXI6MXB4IHNvbGlkICNhYWE7Ci0gIGJvcmRlci1yYWRpdXM6NXB4OwotICAtbW96LWJvcmRlci1yYWRpdXM6NXB4OwotICAtd2Via2l0LWJvcmRlci1yYWRpdXM6NXB4OwotICBvdmVyZmxvdzphdXRvOwotfQotCi1kaXYjdGIgaDIgewotICBmb250LXNpemU6MS4zZW07Ci0gIGZvbnQtd2VpZ2h0OmJvbGQ7Ci0gIG1hcmdpbjoxZW0gMDsKLSAgcGFkZGluZzowOwotICBiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50OwotICBib3JkZXI6bm9uZTsKLSAgY2xlYXI6Ym90aDsKLX0KLQotZGl2LmRvd25sb2FkLWJveCBhLmJ1dHRvbiB7Ci0gIGNvbG9yOiAjMDY5OwotICBmb250LXNpemU6MS4xZW07Ci0gIGZvbnQtd2VpZ2h0OmJvbGQ7Ci0gIHRleHQtZGVjb3JhdGlvbjpub25lOwotICBoZWlnaHQ6MjdweDsKLSAgbGluZS1oZWlnaHQ6MjdweDsKLSAgdGV4dC1hbGlnbjpjZW50ZXI7Ci0gIHBhZGRpbmc6NXB4IDhweDsKLSAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjsKLSAgYm9yZGVyOiAxcHggc29saWQgI2FhYTsKLSAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiAycHg7Ci0gIC1tb3otYm9yZGVyLXJhZGl1czogMnB4OwotICBib3JkZXItcmFkaXVzOiAycHg7Ci19Ci0KLWRpdi5kb3dubG9hZC1ib3ggYS5idXR0b246aG92ZXIgewotICBib3JkZXItY29sb3I6ICMwOUM7Ci0gIGJhY2tncm91bmQtY29sb3I6ICM0Q0FEQ0I7Ci0gIGJhY2tncm91bmQtaW1hZ2U6IC13ZWJraXQtZ3JhZGllbnQobGluZWFyLGxlZnQgdG9wLGxlZnQgYm90dG9tLGZyb20oIzVkYmNkOSksdG8oIzRjYWRjYikpOwotICBiYWNrZ3JvdW5kLWltYWdlOiAtd2Via2l0LWxpbmVhci1ncmFkaWVudCh0b3AsIzVkYmNkOSwjNGNhZGNiKTsKLSAgYmFja2dyb3VuZC1pbWFnZTogLW1vei1saW5lYXItZ3JhZGllbnQodG9wLCM1ZGJjZDksIzRjYWRjYik7Ci0gIGJhY2tncm91bmQtaW1hZ2U6IC1tcy1saW5lYXItZ3JhZGllbnQodG9wLCM1ZGJjZDksIzRjYWRjYik7Ci0gIGJhY2tncm91bmQtaW1hZ2U6IC1vLWxpbmVhci1ncmFkaWVudCh0b3AsIzVkYmNkOSwjNGNhZGNiKTsKLSAgYmFja2dyb3VuZC1pbWFnZTogbGluZWFyLWdyYWRpZW50KHRvcCwjNWRiY2Q5LCM0Y2FkY2IpOwotICBmaWx0ZXI6IHByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5ncmFkaWVudChzdGFydENvbG9yU3RyPScjNWRiY2Q5JyxFbmRDb2xvclN0cj0nIzRjYWRjYicpOwotICBjb2xvcjogI2ZmZjsKLX0KLQotZGl2LmRvd25sb2FkLWJveCBhLmJ1dHRvbjphY3RpdmUgewotICBiYWNrZ3JvdW5kLWNvbG9yOiAjMUU3OTlBOwotICBiYWNrZ3JvdW5kLWltYWdlOiBub25lOwotICBib3JkZXItY29sb3I6ICMzMEI3RTY7Ci19Ci0KLWRpdi5kb3dubG9hZC1ib3ggcC5maWxlbmFtZSB7Ci0gIGZvbnQtc2l6ZTowLjg1ZW07Ci0gIGNvbG9yOiM4ODg7Ci0gIG1hcmdpbjo0cHggMCAxZW0gMTBweDsKLX0KLQotLyogRW5kIGRldmVsb3BlciB0cmFpbmluZyBiYXIgKi8KLQotLyogVHJhaW5pbmcgbmF2IGJhciAocHJldmlvdXMvbmV4dCkgKi8KLQotZGl2LnRyYWluaW5nLW5hdi10b3AgewotICBmbG9hdDogcmlnaHQ7Ci0gIHdpZHRoOjM4MHB4OyAvKiArMjVweCBwYWRkaW5nID0gNDA1ICovCi0gIG1hcmdpbjotNThweCAwIDAgMDsKLSAgcGFkZGluZzowIDAgMjBweCAyNXB4OwotfQotCi1kaXYudHJhaW5pbmctbmF2LWJvdHRvbSB7Ci0gIHBhZGRpbmc6MXB4OyAvKiBmb3Igd2VpcmQgRkYgYnVnIChzY3JvbGxiYXIgYXBwZWFycykgKi8KLSAgbWFyZ2luOjNlbSAwOwotICBvdmVyZmxvdzphdXRvOwotfQotCi1kaXYudHJhaW5pbmctbmF2LWJ1dHRvbi1uZXh0IGEsCi1kaXYudHJhaW5pbmctbmF2LWJ1dHRvbi1wcmV2aW91cyBhIHsKLSAgZGlzcGxheTpibG9jazsKLSAgd2lkdGg6MTYwcHg7Ci0gIGhlaWdodDo1NXB4OwotICBwYWRkaW5nOjRweCA3cHg7Ci0gIGJvcmRlcjoxcHggc29saWQgI2FhYTsKLSAgYm9yZGVyLXJhZGl1czo1cHg7Ci0gIC1tb3otYm9yZGVyLXJhZGl1czo1cHg7Ci0gIC13ZWJraXQtYm9yZGVyLXJhZGl1czo1cHg7Ci0gIHRleHQtZGVjb3JhdGlvbjpub25lOwotICBmb250LXdlaWdodDpib2xkOwotfQotCi1kaXYudHJhaW5pbmctbmF2LWJ1dHRvbi1uZXh0IGE6aG92ZXIsCi1kaXYudHJhaW5pbmctbmF2LWJ1dHRvbi1wcmV2aW91cyBhOmhvdmVyIHsKLSAgYm9yZGVyOjFweCBzb2xpZCAjMDY5OyAvKiBtYXRjaCBsaW5rIGNvbG9yICovCi19Ci0KLWRpdi50cmFpbmluZy1uYXYtYnV0dG9uLW5leHQgYTphY3RpdmUsCi1kaXYudHJhaW5pbmctbmF2LWJ1dHRvbi1wcmV2aW91cyBhOmFjdGl2ZSB7Ci0gIGJvcmRlcjoxcHggc29saWQgI2YwMDsgLyogbWF0Y2ggbGluayBjb2xvciAqLwotfQotICAKLWRpdi50cmFpbmluZy1uYXYtYnV0dG9uLXByZXZpb3VzIHsKLSAgZmxvYXQ6bGVmdDsKLSAgdGV4dC1hbGlnbjpsZWZ0OwotfQotCi1kaXYudHJhaW5pbmctbmF2LWJ1dHRvbi1uZXh0IHsKLSAgZmxvYXQ6cmlnaHQ7Ci0gIHRleHQtYWxpZ246cmlnaHQ7Ci19Ci0KLXNwYW4udHJhaW5pbmctbmF2LWJ1dHRvbi10aXRsZSB7Ci0gIGRpc3BsYXk6YmxvY2s7Ci0gIGZvbnQtc2l6ZTouODVlbTsKLSAgZm9udC13ZWlnaHQ6bm9ybWFsOwotICBsaW5lLWhlaWdodDoxLjNlbTsKLSAgbWFyZ2luOi41ZW0gMCAwOwotfQotCi0vKiBFbmQgdHJhaW5pbmcgbmF2IGJhciAqLwotCi0vKiBCRUdJTiBpbWFnZSBhbmQgY2FwdGlvbiBzdHlsZXMgKG9yaWdpbmFsbHkgZm9yIFVJIEd1aWRlbGluZXMgZG9jcykgKi8KLQotdGFibGUuaW1hZ2UtY2FwdGlvbiB7Ci0gIHBhZGRpbmc6MDsKLSAgbWFyZ2luOi41ZW0gMDsKLSAgYm9yZGVyOjA7Ci19Ci0KLXRkLmltYWdlLWNhcHRpb24taSB7Ci0gIGZvbnQtc2l6ZTo5MiU7Ci0gIHBhZGRpbmc6MCA1cHg7Ci0gIG1hcmdpbjowOwotICBib3JkZXI6MDsKLX0KLQotdGQuaW1hZ2UtY2FwdGlvbi1pIGltZyB7Ci0gIHBhZGRpbmc6MCAxZW07Ci0gIG1hcmdpbjowOwotfQotCi0uaW1hZ2UtbGlzdCB7Ci0gIHdpZHRoOjI0cHg7Ci0gIHRleHQtYWxpZ246Y2VudGVyOwotfQotCi10ZC5pbWFnZS1jYXB0aW9uLWMgewotICBmb250LXNpemU6OTIlOwotICBwYWRkaW5nOjFlbSAycHggMnB4IDJweDsKLSAgbWFyZ2luOjA7Ci0gIGJvcmRlcjowOwotICB3aWR0aDozNTBweDsKLX0KLQotLmdyYWQtcnVsZS10b3AgewotYmFja2dyb3VuZC1pbWFnZTp1cmwoaW1hZ2VzL2dyYWQtcnVsZS1xdi5wbmcpOwotYmFja2dyb3VuZC1yZXBlYXQ6bm8tcmVwZWF0OwotcGFkZGluZy10b3A6MWVtOwotbWFyZ2luLXRvcDowOwotfQotCi0uaW1hZ2UtY2FwdGlvbi1uZXN0ZWQgewotICBtYXJnaW4tdG9wOjA7Ci0gIHBhZGRpbmc6MCAwIDAgMWVtOwotfQotCi0uaW1hZ2UtY2FwdGlvbi1uZXN0ZWQgdGQgewotICBwYWRkaW5nOjAgNHB4IDJweCAwOwotICBtYXJnaW46MDsKLSAgYm9yZGVyOjA7Ci19Ci0KLS8qIEVORCBpbWFnZSBhbmQgY2FwdGlvbiBzdHlsZXMgKi8KLQotLyogdGFibGUgb2YgY29udGVudHMgKi8KLQotb2wudG9jIHsKLSAgbWFyZ2luOiAwIDAgMWVtIDA7Ci0gIHBhZGRpbmc6IDA7Ci0gIGxpc3Qtc3R5bGU6IG5vbmU7Ci0gIGZvbnQtc2l6ZTo5NSU7Ci19Ci0KLW9sLnRvYyBsaSB7Ci0gIGZvbnQtd2VpZ2h0OiBib2xkOwotICBtYXJnaW46IDAgMCAuNWVtIDFlbTsKLSAgcGFkZGluZzogMDsKLX0KLQotb2wudG9jIGxpIHAgewotICBmb250LXdlaWdodDogbm9ybWFsOwotfQotCi1vbC50b2MgbGkgb2wgewotICBtYXJnaW46IDA7Ci0gIHBhZGRpbmc6IDA7Ci19Ci0KLW9sLnRvYyBsaSBsaSB7Ci0gIHBhZGRpbmc6IDA7Ci0gIG1hcmdpbjogMCAwIDAgMWVtOwotICBmb250LXdlaWdodDogbm9ybWFsOwotICBsaXN0LXN0eWxlOiBub25lOwotfQotCi10YWJsZSBvbC50b2MgewotICBtYXJnaW4tbGVmdDogMDsKLX0KLQotLmNvbHVtbnMgdGQgewotICBwYWRkaW5nOjAgNXB4OwotICBib3JkZXI6bm9uZTsKLX0KLQotLyogbGluayB0YWJsZSAqLwotLmpkLWxpbmt0YWJsZSB7Ci0gIG1hcmdpbjogMCAwIDFlbTsKLSAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICM4ODg7Ci19Ci0uamQtbGlua3RhYmxlIHRoLAotLmpkLWxpbmt0YWJsZSB0ZCB7Ci0gIHBhZGRpbmc6IDNweCA1cHg7Ci0gIHZlcnRpY2FsLWFsaWduOiB0b3A7Ci0gIHRleHQtYWxpZ246IGxlZnQ7Ci0gIGJvcmRlcjpub25lOwotfQotLmpkLWxpbmt0YWJsZSB0ciB7Ci0gIGJhY2tncm91bmQtY29sb3I6ICNmZmY7Ci19Ci0uamQtbGlua3RhYmxlIHRkIHsKLSAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICM4ODg7Ci0gIGJhY2tncm91bmQtY29sb3I6IGluaGVyaXQ7Ci19Ci0uamQtbGlua3RhYmxlIHRkICBwIHsKLSAgcGFkZGluZzogMCAwIDVweDsKLX0KLS5qZC1saW5rdGFibGUgLmpkLWxpbmtjb2wgewotfQotLmpkLWxpbmt0YWJsZSAuamQtZGVzY3Jjb2wgewotfQotLmpkLWxpbmt0YWJsZSAuamQtdHlwZWNvbCB7Ci0gIHRleHQtYWxpZ246cmlnaHQ7Ci19Ci0uamQtbGlua3RhYmxlIC5qZC12YWxjb2wgewotfQotLmpkLWxpbmt0YWJsZSAuamQtY29tbWVudHJvdyB7Ci0gIGJvcmRlci10b3A6bm9uZTsKLSAgcGFkZGluZy1sZWZ0OjI1cHg7Ci19Ci0uamQtZGVwcmVjYXRlZC13YXJuaW5nIHsKLSAgbWFyZ2luLXRvcDogMDsKLSAgbWFyZ2luLWJvdHRvbTogMTBweDsKLX0KLQotdHIuYWx0LWNvbG9yIHsKLSAgYmFja2dyb3VuZC1jb2xvcjogI2Y2ZjZmNjsKLX0KLQotLyogZXhwYW5kbyB0cmlnZ2VyICovCi0jamQtY29udGVudCAuamQtZXhwYW5kby10cmlnZ2VyLWltZyB7Ci0gIG1hcmdpbjowOwotfQotCi0vKiBqZC1leHBhbmRvICovCi0uamQtaW5oZXJpdGVkbGlua3MgewotICBwYWRkaW5nOjAgMCAwIDEzcHgKLX0KLQotLyogU0RLIFBBR0UgKi8KLXRhYmxlLmRvd25sb2FkIHRyIHsKLSAgYmFja2dyb3VuZC1jb2xvcjojZDlkOWQ5OwotfQotCi10YWJsZS5kb3dubG9hZCB0ci5hbHQtY29sb3IgewotICBiYWNrZ3JvdW5kLWNvbG9yOiNlZGVkZWQ7Ci19Ci0KLXRhYmxlLmRvd25sb2FkIHRkLAotdGFibGUuZG93bmxvYWQgdGggewotICBib3JkZXI6MnB4IHNvbGlkICNmZmY7Ci0gIHBhZGRpbmc6MTBweCA1cHg7Ci19Ci0KLXRhYmxlLmRvd25sb2FkIHRoIHsKLSAgYmFja2dyb3VuZC1jb2xvcjojNmQ4MjkzOwotICBjb2xvcjojZmZmOwotfQotCi0vKiBJTkxBWSAxODAgQ09QWSBhbmQgMjQwUFggRVhURU5TSU9OICovCi0vKiBtb2RpZmllZCB0byA0M3B4IHNvIHRoYXQgYWxsIGJyb3dzZXJzIGVsaW1pbmF0ZSB0aGUgcGFja2FnZSBwYW5lbCBoLXNjcm9sbCAqLwotLmctdHBsLTI0MCAuZy11bml0LAotLmctdW5pdCAuZy10cGwtMjQwIC5nLXVuaXQsCi0uZy11bml0IC5nLXVuaXQgLmctdHBsLTI0MCAuZy11bml0IHsKLSAgZGlzcGxheTogYmxvY2s7Ci0gIG1hcmdpbjogMCAwIDAgMjQzcHg7Ci0gIHdpZHRoOiBhdXRvOwotICBmbG9hdDogbm9uZTsKLX0KLS5nLXVuaXQgLmctdW5pdCAuZy10cGwtMjQwIC5nLWZpcnN0LAotLmctdW5pdCAuZy10cGwtMjQwIC5nLWZpcnN0LAotLmctdHBsLTI0MCAuZy1maXJzdCB7Ci0gIGRpc3BsYXk6IGJsb2NrOwotICBtYXJnaW46IDA7Ci0gIHdpZHRoOiAyNDNweDsKLSAgZmxvYXQ6IGxlZnQ7Ci19Ci0vKiAyNDBweCBhbHQgKi8KLS5nLXRwbC0yNDAtYWx0IC5nLXVuaXQsCi0uZy11bml0IC5nLXRwbC0yNDAtYWx0IC5nLXVuaXQsCi0uZy11bml0IC5nLXVuaXQgLmctdHBsLTI0MC1hbHQgLmctdW5pdCB7Ci0gIGRpc3BsYXk6IGJsb2NrOwotICBtYXJnaW46IDAgMjQzcHggMCAwOwotICB3aWR0aDogYXV0bzsKLSAgZmxvYXQ6IG5vbmU7Ci19Ci0uZy11bml0IC5nLXVuaXQgLmctdHBsLTI0MC1hbHQgLmctZmlyc3QsCi0uZy11bml0IC5nLXRwbC0yNDAtYWx0IC5nLWZpcnN0LAotLmctdHBsLTI0MC1hbHQgLmctZmlyc3QgewotICBkaXNwbGF5OiBibG9jazsKLSAgbWFyZ2luOiAwOwotICB3aWR0aDogMjQzcHg7Ci0gIGZsb2F0OiByaWdodDsKLX0KLQotLyogMjAwcHggKi8KLS5nLXRwbC0yMDAgLmctdW5pdCwKLS5nLXVuaXQgLmctdHBsLTIwMCAuZy11bml0LAotLmctdW5pdCAuZy11bml0IC5nLXRwbC0yMDAgLmctdW5pdCB7Ci0gIGRpc3BsYXk6IGJsb2NrOwotICBtYXJnaW46IDAgMCAwIDIwMHB4OwotICB3aWR0aDogYXV0bzsKLSAgZmxvYXQ6IG5vbmU7Ci19Ci0uZy11bml0IC5nLXVuaXQgLmctdHBsLTIwMCAuZy1maXJzdCwKLS5nLXVuaXQgLmctdHBsLTIwMCAuZy1maXJzdCwKLS5nLXRwbC0yMDAgLmctZmlyc3QgewotICBkaXNwbGF5OiBibG9jazsKLSAgbWFyZ2luOiAwOwotICB3aWR0aDogMjAwcHg7Ci0gIGZsb2F0OiBsZWZ0OwotfQotLyogMjAwcHggYWx0ICovCi0uZy10cGwtMjAwLWFsdCAuZy11bml0LAotLmctdW5pdCAuZy10cGwtMjAwLWFsdCAuZy11bml0LAotLmctdW5pdCAuZy11bml0IC5nLXRwbC0yMDAtYWx0IC5nLXVuaXQgewotICBkaXNwbGF5OiBibG9jazsKLSAgbWFyZ2luOiAwIDIwMHB4IDAgMDsKLSAgd2lkdGg6IGF1dG87Ci0gIGZsb2F0OiBub25lOwotfQotLmctdW5pdCAuZy11bml0IC5nLXRwbC0yMDAtYWx0IC5nLWZpcnN0LAotLmctdW5pdCAuZy10cGwtMjAwLWFsdCAuZy1maXJzdCwKLS5nLXRwbC0yMDAtYWx0IC5nLWZpcnN0IHsKLSAgZGlzcGxheTogYmxvY2s7Ci0gIG1hcmdpbjogMDsKLSAgd2lkdGg6IDIwMHB4OwotICBmbG9hdDogcmlnaHQ7Ci19Ci0KLS8qIDE5MHB4ICovCi0uZy10cGwtMTkwIC5nLXVuaXQsCi0uZy11bml0IC5nLXRwbC0xOTAgLmctdW5pdCwKLS5nLXVuaXQgLmctdW5pdCAuZy10cGwtMTkwIC5nLXVuaXQgewotICBkaXNwbGF5OiBibG9jazsKLSAgbWFyZ2luOiAwIDAgMCAxOTBweDsKLSAgd2lkdGg6IGF1dG87Ci0gIGZsb2F0OiBub25lOwotfQotLmctdW5pdCAuZy11bml0IC5nLXRwbC0xOTAgLmctZmlyc3QsCi0uZy11bml0IC5nLXRwbC0xOTAgLmctZmlyc3QsCi0uZy10cGwtMTkwIC5nLWZpcnN0IHsKLSAgZGlzcGxheTogYmxvY2s7Ci0gIG1hcmdpbjogMDsKLSAgd2lkdGg6IDE5MHB4OwotICBmbG9hdDogbGVmdDsKLX0KLS8qIDE5MHB4IGFsdCAqLwotLmctdHBsLTE5MC1hbHQgLmctdW5pdCwKLS5nLXVuaXQgLmctdHBsLTE5MC1hbHQgLmctdW5pdCwKLS5nLXVuaXQgLmctdW5pdCAuZy10cGwtMTkwLWFsdCAuZy11bml0IHsKLSAgZGlzcGxheTogYmxvY2s7Ci0gIG1hcmdpbjogMCAxOTBweCAwIDA7Ci0gIHdpZHRoOiBhdXRvOwotICBmbG9hdDogbm9uZTsKLX0KLS5nLXVuaXQgLmctdW5pdCAuZy10cGwtMTkwLWFsdCAuZy1maXJzdCwKLS5nLXVuaXQgLmctdHBsLTE5MC1hbHQgLmctZmlyc3QsCi0uZy10cGwtMTkwLWFsdCAuZy1maXJzdCB7Ci0gIGRpc3BsYXk6IGJsb2NrOwotICBtYXJnaW46IDA7Ci0gIHdpZHRoOiAxOTBweDsKLSAgZmxvYXQ6IHJpZ2h0OwotfQotCi0vKiAxODBweCAqLwotLmctdHBsLTE4MCAuZy11bml0LAotLmctdW5pdCAuZy10cGwtMTgwIC5nLXVuaXQsCi0uZy11bml0IC5nLXVuaXQgLmctdHBsLTE4MCAuZy11bml0IHsKLSAgZGlzcGxheTogYmxvY2s7Ci0gIG1hcmdpbjogMCAwIDAgMTgwcHg7Ci0gIHdpZHRoOiBhdXRvOwotICBmbG9hdDogbm9uZTsKLX0KLS5nLXVuaXQgLmctdW5pdCAuZy10cGwtMTgwIC5nLWZpcnN0LAotLmctdW5pdCAuZy10cGwtMTgwIC5nLWZpcnN0LAotLmctdHBsLTE4MCAuZy1maXJzdCB7Ci0gIGRpc3BsYXk6IGJsb2NrOwotICBtYXJnaW46IDA7Ci0gIHdpZHRoOiAxODBweDsKLSAgZmxvYXQ6IGxlZnQ7Ci19Ci0vKiAxODBweCBhbHQgKi8KLS5nLXRwbC0xODAtYWx0IC5nLXVuaXQsCi0uZy11bml0IC5nLXRwbC0xODAtYWx0IC5nLXVuaXQsCi0uZy11bml0IC5nLXVuaXQgLmctdHBsLTE4MC1hbHQgLmctdW5pdCB7Ci0gIGRpc3BsYXk6IGJsb2NrOwotICBtYXJnaW46IDAgMTgwcHggMCAwOwotICB3aWR0aDogYXV0bzsKLSAgZmxvYXQ6IG5vbmU7Ci19Ci0uZy11bml0IC5nLXVuaXQgLmctdHBsLTE4MC1hbHQgLmctZmlyc3QsCi0uZy11bml0IC5nLXRwbC0xODAtYWx0IC5nLWZpcnN0LAotLmctdHBsLTE4MC1hbHQgLmctZmlyc3QgewotICBkaXNwbGF5OiBibG9jazsKLSAgbWFyZ2luOiAwOwotICB3aWR0aDogMTgwcHg7Ci0gIGZsb2F0OiByaWdodDsKLX0KLQotCi0vKiBKUVVFUlkgUkVTSVpBQkxFIFNUWUxFUyAqLwotLnVpLXJlc2l6YWJsZSB7IHBvc2l0aW9uOiByZWxhdGl2ZTsgfQotLnVpLXJlc2l6YWJsZS1oYW5kbGUgeyBwb3NpdGlvbjogYWJzb2x1dGU7IGRpc3BsYXk6IG5vbmU7IGZvbnQtc2l6ZTogMC4xcHg7IHotaW5kZXg6MTsgfQotLnVpLXJlc2l6YWJsZSAudWktcmVzaXphYmxlLWhhbmRsZSB7IGRpc3BsYXk6IGJsb2NrOyB9Ci1ib2R5IC51aS1yZXNpemFibGUtZGlzYWJsZWQgLnVpLXJlc2l6YWJsZS1oYW5kbGUgeyBkaXNwbGF5OiBub25lOyB9Ci1ib2R5IC51aS1yZXNpemFibGUtYXV0b2hpZGUgLnVpLXJlc2l6YWJsZS1oYW5kbGUgeyBkaXNwbGF5OiBub25lOyB9Ci0udWktcmVzaXphYmxlLXMgeyBjdXJzb3I6IHMtcmVzaXplOyBoZWlnaHQ6IDZweDsgd2lkdGg6IDEwMCU7IGJvdHRvbTogMHB4OyBsZWZ0OiAwcHg7Ci0gIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50IHVybCgiaW1hZ2VzL3Jlc2l6YWJsZS1zMi5naWYiKSByZXBlYXQgc2Nyb2xsIGNlbnRlciB0b3A7IH0KLS51aS1yZXNpemFibGUtZSB7IGN1cnNvcjogZS1yZXNpemU7IHdpZHRoOiA2cHg7IHJpZ2h0OiAwcHg7IHRvcDogMHB4OyBoZWlnaHQ6IDEwMCU7Ci0gIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50IHVybCgiaW1hZ2VzL3Jlc2l6YWJsZS1lMi5naWYiKSByZXBlYXQgc2Nyb2xsIHJpZ2h0IGNlbnRlcjsgfQotCi1AbWVkaWEgcHJpbnQgewotCi0gIGJvZHkgewotICAgIG92ZXJmbG93OnZpc2libGU7Ci0gIH0KLQotICAjaGVhZGVyIHsKLSAgICBoZWlnaHQ6NjBweDsKLSAgfQotCi0gICNoZWFkZXJMZWZ0IHsKLSAgICBwYWRkaW5nOjA7Ci0gIH0KLQotICAjaGVhZGVyLXRhYnMsCi0gICNoZWFkZXJSaWdodCwKLSAgI3NpZGUtbmF2LAotICAjYXBpLWluZm8tYmxvY2sgewotICAgIGRpc3BsYXk6bm9uZTsKLSAgfQotCi0gICNib2R5LWNvbnRlbnQgewotICAgIHBvc2l0aW9uOmluaGVyaXQ7Ci0gIH0KLQotICAjZG9jLWNvbnRlbnQgewotICAgIG1hcmdpbi1sZWZ0OjAgIWltcG9ydGFudDsKLSAgICBoZWlnaHQ6YXV0byAhaW1wb3J0YW50OwotICAgIHdpZHRoOmF1dG8gIWltcG9ydGFudDsKLSAgICBvdmVyZmxvdzppbmhlcml0OwotICAgIGRpc3BsYXk6aW5saW5lOwotICB9Ci0KLSAgI2pkLWhlYWRlciB7Ci0gICAgcGFkZGluZzoxMHB4IDA7Ci0gIH0KLQotICAjamQtY29udGVudCB7Ci0gICAgcGFkZGluZzoxNXB4IDAgMDsKLSAgfQotCi0gICNmb290ZXIgewotICAgIGZsb2F0Om5vbmU7Ci0gICAgbWFyZ2luOjJlbSAwIDA7Ci0gIH0KLQotICBoNC5qZC1kZXRhaWxzLXRpdGxlIHsKLSAgICBib3JkZXItYm90dG9tOjFweCBzb2xpZCAjNjY2OwotICB9Ci0KLSAgcHJlIHsKLSAgICAvKiB0aGVzZSBhbGxvdyBsaW5lcyB0byBicmVhayAoaWYgdGhlcmUncyBhIHdoaXRlIHNwYWNlKSAqLwotICAgIG92ZXJmbG93OiB2aXNpYmxlOwotICAgIHRleHQtd3JhcDogdW5yZXN0cmljdGVkOwotICAgIHdoaXRlLXNwYWNlOiAtbW96LXByZS13cmFwOyAvKiBNb3ogKi8KLSAgICB3aGl0ZS1zcGFjZTogLXByZS13cmFwOyAvKiBPcGVyYSA0LTYgKi8KLSAgICB3aGl0ZS1zcGFjZTogLW8tcHJlLXdyYXA7IC8qIE9wZXJhIDcgKi8KLSAgICB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7IC8qIENTUzMgICovCi0gICAgd29yZC13cmFwOiBicmVhay13b3JkOyAvKiBJRSA1LjUrICovCi0gIH0KLQotICBoMSwgaDIsIGgzLCBoNCwgaDUsIGg2IHsKLSAgICBwYWdlLWJyZWFrLWFmdGVyOiBhdm9pZDsKLSAgfQotCi0gIHRhYmxlLCBpbWcgewotICAgIHBhZ2UtYnJlYWstaW5zaWRlOiBhdm9pZDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvY3NzL2RlZmF1bHQuY3NzIGIvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvY3NzL2RlZmF1bHQuY3NzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWFmYTI1Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2Nzcy9kZWZhdWx0LmNzcworKysgL2Rldi9udWxsCkBAIC0xLDQ2NjIgKzAsMCBAQAotLyogY29sb3IgZGVmaW5pdGlvbnMgKi8KLS8qIDE2IGNvbHVtbiBsYXlvdXQgKi8KLS8qIGNsZWFyZml4IGlkaW9tICovCi0vKiBjb21tb24gbWl4aW5zICovCi0vKiBwYWdlIGxheW91dCArIHRvcC1sZXZlbCBzdHlsZXMgKi8KLTo6c2VsZWN0aW9uIHsKLSAgYmFja2dyb3VuZC1jb2xvcjogIzAwOTljYzsKLSAgY29sb3I6ICNmZmY7IH0KLTo6LXdlYmtpdC1zZWxlY3Rpb24gewotICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDA5OWNjOwotICBjb2xvcjogI2ZmZjsgfQotOjotbW96LXNlbGVjdGlvbiB7Ci0gIGJhY2tncm91bmQtY29sb3I6ICMwMDk5Y2M7Ci0gIGNvbG9yOiAjZmZmOyB9Ci0KLWh0bWwsIGJvZHkgewotICBoZWlnaHQ6IDEwMCU7Ci0gIG1hcmdpbjogMDsKLSAgcGFkZGluZzogMDsKLSAgYmFja2dyb3VuZC1jb2xvcjojRjlGOUY5OwotICAtd2Via2l0LWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDsKLSAgLyogcHJldmVudCBzdWJwaXhlbCBhbnRpYWxpYXNpbmcsIHdoaWNoIHRoaWNrZW5zIHRoZSB0ZXh0ICovCi0gIC8qIHRleHQtcmVuZGVyaW5nOiBvcHRpbWl6ZUxlZ2liaWxpdHk7ICovCi0gIC8qIHR1cm5lZCBvZmYgbGlnYXR1cmVzIGR1ZSB0byBidWcgNTk0NTQ1NSAqLyB9Ci0KLWJvZHkgewotICBjb2xvcjogIzIyMjsKLSAgZm9udDogMTRweC8xOXB4IFJvYm90bywgc2Fucy1zZXJpZjsKLSAgZm9udC13ZWlnaHQ6IDQwMDsKLSAgbGV0dGVyLXNwYWNpbmc6LjE7Ci0gIHBhZGRpbmc6MCAxMHB4OyB9Ci0KLSNwYWdlLWNvbnRhaW5lciB7Ci0gIHdpZHRoOiA5NDBweDsKLSAgbWFyZ2luOiAwIDQwcHg7IH0KLQotI3BhZ2UtaGVhZGVyIHsKLSAgaGVpZ2h0OiA4MHB4OwotICBtYXJnaW4tYm90dG9tOiAyMHB4OwotICBmb250LXNpemU6IDQ4cHg7Ci0gIGxpbmUtaGVpZ2h0OiA0OHB4OwotICBmb250LXdlaWdodDogMTAwOwotICBwYWRkaW5nLWxlZnQ6IDEwcHg7IH0KLSAgI3BhZ2UtaGVhZGVyIGEgewotICAgIGRpc3BsYXk6IGJsb2NrOwotICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKLSAgICB0b3A6IDIwcHg7Ci0gICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwotICAgIGNvbG9yOiAjNTU1NTU1ICFpbXBvcnRhbnQ7IH0KLQotI21haW4tcm93IHsKLSAgZGlzcGxheTogaW5saW5lLWJsb2NrOyB9Ci0gICNtYWluLXJvdzphZnRlciB7Ci0gICAgY29udGVudDogIi4iOwotICAgIGRpc3BsYXk6IGJsb2NrOwotICAgIGhlaWdodDogMDsKLSAgICBjbGVhcjogYm90aDsKLSAgICB2aXNpYmlsaXR5OiBoaWRkZW47IH0KLSAgKiBodG1sICNtYWluLXJvdyB7Ci0gICAgaGVpZ2h0OiAxcHg7IH0KLQotI3BhZ2UtZm9vdGVyIHsKLSAgbWFyZ2luLWxlZnQ6IDE5MHB4OwotICBtYXJnaW4tdG9wOiA4MHB4OwotICBjb2xvcjogIzk5OTk5OTsKLSAgcGFkZGluZy1ib3R0b206IDQwcHg7Ci0gIGZvbnQtc2l6ZTogMTJweDsKLSAgbGluZS1oZWlnaHQ6IDE1cHg7IH0KLSAgI3BhZ2UtZm9vdGVyIGEgewotICAgIGNvbG9yOiAjNzc3Nzc3OyB9Ci0gICNwYWdlLWZvb3RlciAjY29weXJpZ2h0IHsKLSAgICBtYXJnaW4tYm90dG9tOiAxMHB4OyB9Ci0KLSNuYXYtY29udGFpbmVyIHsKLSAgd2lkdGg6IDE2MHB4OwotICBtaW4taGVpZ2h0OiAxMHB4OwotICBtYXJnaW4tcmlnaHQ6IDIwcHg7Ci0gIGZsb2F0OiBsZWZ0OyB9Ci0KLSNuYXYgewotICBtYXJnaW46MDsKLSAgcGFkZGluZzowIDAgMzBweDsKLX0KLQotI3NpZGUtbmF2IHsKLSAgbWluLWhlaWdodDo1cHg7IC8qIHNpbGx5IHdheSB0byBhdm9pZCBkb2MgZmxvYXRpbmcgbGVmdCB3aGVuIG5hdiBnb2VzIGZpeGVkICovCi0gIG1hcmdpbi1ib3R0b206MXB4OwotfQotI2RldmRvYy1uYXYgewotICBvdXRsaW5lOm5vbmU7Ci0gIHdpZHRoOmF1dG87Ci0gIG1hcmdpbjogMjBweCAwIDA7IH0KLSAgCi0jZGV2ZG9jLW5hdiBoMiB7Ci0gIGJvcmRlcjowOwotfQotCi0jZGV2ZG9jLW5hdi5maXhlZCB7Ci0gIHBvc2l0aW9uOiBmaXhlZDsKLSAgbWFyZ2luOjA7Ci0gIHRvcDogMjBweDsgfQotICAKLSNkZXZkb2MtbmF2IHNwYW4uc21hbGwgewotICBmb250LXNpemU6MTJweDsKLSAgZm9udC13ZWlnaHQ6bm9ybWFsOwotfQotCi0jY29udGVudCB7Ci0gIHdpZHRoOiA3NjBweDsKLSAgZmxvYXQ6IGxlZnQ7IH0KLQotYTpob3ZlciwKLWFjcm9ueW06aG92ZXIgewotICBjb2xvcjogIzdhYTFiMCAhaW1wb3J0YW50OyB9Ci0KLWE6Zm9jdXMsCi1hOmFjdGl2ZSB7Ci0gIGNvbG9yOiAjMzNiNWU1ICFpbXBvcnRhbnQ7IH0KLSAgCi1hLmV4dGVybmFsLWxpbmsgewotICBiYWNrZ3JvdW5kOnVybCgnLi4vaW1hZ2VzL3N0eWxlcy9vcGVuX25ld19wYWdlLnBuZycpIG5vLXJlcGVhdCAxMDAlIDUwJTsKLSAgcGFkZGluZy1yaWdodDoxNnB4OwotfQotCi0ubm93cmFwIHsKLSAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKLX0KLQotaW1nIHsKLSAgYm9yZGVyOiBub25lOyB9Ci0jamQtY29udGVudCBpbWcgewotICBtYXJnaW4tYm90dG9tOjE1cHg7Ci19Ci0KLXVsIHsKLSAgbWFyZ2luOiAwOwotICBwYWRkaW5nOiAwOyB9Ci0KLXN0cm9uZyB7Ci0gIGZvbnQtd2VpZ2h0OiA1MDA7IH0KLQotZW0gewotICBmb250LXN0eWxlOiBpdGFsaWM7IH0KLQotYWNyb255bSwKLS50b29sdGlwLWxpbmsgewotICBib3JkZXItYm90dG9tOiAxcHggZG90dGVkICM1NTU1NTU7Ci0gIGN1cnNvcjogaGVscDsgfQotCi1hY3JvbnltOmhvdmVyLAotLnRvb2x0aXAtbGluazpob3ZlciB7Ci0gIGNvbG9yOiAjN2FhMWIwOwotICBib3JkZXItYm90dG9tLWNvbG9yOiAjN2FhMWIwOyB9Ci0KLWltZy53aXRoLXNoYWRvdywKLXZpZGVvLndpdGgtc2hhZG93IHsKLSAgYm94LXNoYWRvdzogMCAycHggNHB4IHJnYmEoMCwgMCwgMCwgMC4yNSk7IH0KLQotLyogZGlzY2xvc3VyZXMgbWl4aW4gKi8KLS8qIGNvbnRlbnQgbGF5b3V0ICovCi0ubGF5b3V0LWNvbnRlbnQtcm93IHsKLSAgZGlzcGxheTogaW5saW5lLWJsb2NrOwotICBtYXJnaW4tYm90dG9tOiAxMHB4OyB9Ci0gIC5sYXlvdXQtY29udGVudC1yb3c6YWZ0ZXIgewotICAgIGNvbnRlbnQ6ICIuIjsKLSAgICBkaXNwbGF5OiBibG9jazsKLSAgICBoZWlnaHQ6IDA7Ci0gICAgY2xlYXI6IGJvdGg7Ci0gICAgdmlzaWJpbGl0eTogaGlkZGVuOyB9Ci0gICogaHRtbCAubGF5b3V0LWNvbnRlbnQtcm93IHsKLSAgICBoZWlnaHQ6IDFweDsgfQotCi0ubGF5b3V0LWNvbnRlbnQtY29sIHsKLSAgZmxvYXQ6IGxlZnQ7Ci0gIG1hcmdpbi1sZWZ0OiAyMHB4OyB9Ci0gIC5sYXlvdXQtY29udGVudC1jb2w6Zmlyc3QtY2hpbGQgewotICAgIG1hcmdpbi1sZWZ0OiAwOyB9Ci0gIC5sYXlvdXQtY29udGVudC1jb2wgaDMsCi0gIC5sYXlvdXQtY29udGVudC1jb2wgaDQgewotICAgIG1hcmdpbi10b3A6MDsgfQotCi0ubGF5b3V0LWNvbnRlbnQtY29sLnNwYW4tMSB7Ci0gIHdpZHRoOiA0MHB4OyB9Ci0KLS5sYXlvdXQtY29udGVudC1jb2wuc3Bhbi0yIHsKLSAgd2lkdGg6IDEwMHB4OyB9Ci0KLS5sYXlvdXQtY29udGVudC1jb2wuc3Bhbi0zIHsKLSAgd2lkdGg6IDE2MHB4OyB9Ci0KLS5sYXlvdXQtY29udGVudC1jb2wuc3Bhbi00IHsKLSAgd2lkdGg6IDIyMHB4OyB9Ci0KLS5sYXlvdXQtY29udGVudC1jb2wuc3Bhbi01IHsKLSAgd2lkdGg6IDI4MHB4OyB9Ci0KLS5sYXlvdXQtY29udGVudC1jb2wuc3Bhbi02IHsKLSAgd2lkdGg6IDM0MHB4OyB9Ci0KLS5sYXlvdXQtY29udGVudC1jb2wuc3Bhbi03IHsKLSAgd2lkdGg6IDQwMHB4OyB9Ci0KLS5sYXlvdXQtY29udGVudC1jb2wuc3Bhbi04IHsKLSAgd2lkdGg6IDQ2MHB4OyB9Ci0KLS5sYXlvdXQtY29udGVudC1jb2wuc3Bhbi05IHsKLSAgd2lkdGg6IDUyMHB4OyB9Ci0KLS5sYXlvdXQtY29udGVudC1jb2wuc3Bhbi0xMCB7Ci0gIHdpZHRoOiA1ODBweDsgfQotCi0ubGF5b3V0LWNvbnRlbnQtY29sLnNwYW4tMTEgewotICB3aWR0aDogNjQwcHg7IH0KLQotLmxheW91dC1jb250ZW50LWNvbC5zcGFuLTEyIHsKLSAgd2lkdGg6IDcwMHB4OyB9Ci0KLS5sYXlvdXQtY29udGVudC1jb2wuc3Bhbi0xMyB7Ci0gIHdpZHRoOiA3NjBweDsgfQotCi0udnNwYWNlLnNpemUtMSB7Ci0gIGhlaWdodDogMTBweDsgfQotCi0udnNwYWNlLnNpemUtMiB7Ci0gIGhlaWdodDogMjBweDsgfQotCi0udnNwYWNlLnNpemUtMyB7Ci0gIGhlaWdodDogMzBweDsgfQotCi0udnNwYWNlLnNpemUtNCB7Ci0gIGhlaWdodDogNDBweDsgfQotCi0udnNwYWNlLnNpemUtNSB7Ci0gIGhlaWdodDogNTBweDsgfQotCi0udnNwYWNlLnNpemUtNiB7Ci0gIGhlaWdodDogNjBweDsgfQotCi0udnNwYWNlLnNpemUtNyB7Ci0gIGhlaWdodDogNzBweDsgfQotCi0udnNwYWNlLnNpemUtOCB7Ci0gIGhlaWdodDogODBweDsgfQotCi0udnNwYWNlLnNpemUtOSB7Ci0gIGhlaWdodDogOTBweDsgfQotCi0udnNwYWNlLnNpemUtMTAgewotICBoZWlnaHQ6IDEwMHB4OyB9Ci0KLS52c3BhY2Uuc2l6ZS0xMSB7Ci0gIGhlaWdodDogMTEwcHg7IH0KLQotLnZzcGFjZS5zaXplLTEyIHsKLSAgaGVpZ2h0OiAxMjBweDsgfQotCi0udnNwYWNlLnNpemUtMTMgewotICBoZWlnaHQ6IDEzMHB4OyB9Ci0KLS52c3BhY2Uuc2l6ZS0xNCB7Ci0gIGhlaWdodDogMTQwcHg7IH0KLQotLnZzcGFjZS5zaXplLTE1IHsKLSAgaGVpZ2h0OiAxNTBweDsgfQotCi0udnNwYWNlLnNpemUtMTYgewotICBoZWlnaHQ6IDE2MHB4OyB9Ci0KLS8qIG5hdiAqLwotI25hdiB7Ci0gIC8qIHNlY3Rpb24gaGVhZGVyIGRpdnMgKi8KLSAgLyogZXhwYW5kZWQgc2VjdGlvbiBoZWFkZXIgZGl2cyAqLwotICAvKiBzdWJsaW5rcyAqLyB9Ci0gICNuYXYgbGkgewotICAgIGxpc3Qtc3R5bGUtdHlwZTogbm9uZTsKLSAgICBmb250LXNpemU6IDE0cHg7Ci0gICAgbWFyZ2luOjA7Ci0gICAgcGFkZGluZzowOwotICAgIGxpbmUtaGVpZ2h0OiAxNXB4OyB9Ci0gICNuYXYgYSB7Ci0gICAgY29sb3I6ICM1NTU1NTU7Ci0gICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwotICAgIHdvcmQtd3JhcDpicmVhay13b3JkOyB9Ci0gICNuYXYgLm5hdi1zZWN0aW9uLWhlYWRlciB7Ci0gICAgcG9zaXRpb246IHJlbGF0aXZlOwotICAgIG1hcmdpbi1ib3R0b206IDFweDsKLSAgICBwYWRkaW5nOiAwIDMwcHggMCAwOyB9Ci0gICNuYXYgbGkuc2VsZWN0ZWQgYSwgI25hdiBsaS5zZWxlY3RlZCA+IC5uYXYtc2VjdGlvbi1oZWFkZXIgPiBhIHsKLSAgICBjb2xvcjogIzA5QzsKLSAgfQotICAjbmF2IGxpLnNlbGVjdGVkIHVsIGxpIGEgewotICAvKiBkb24ndCBoaWdobGlnaHQgY2hpbGQgaXRlbXMgKi8KLSAgICBjb2xvcjogIzU1NTU1NTsgfQotICAjbmF2IC5uYXYtc2VjdGlvbiAubmF2LXNlY3Rpb24gLm5hdi1zZWN0aW9uLWhlYWRlciB7Ci0gICAgLyogbm8gd2hpdGUgbGluZSBiZXR3ZWVuIHNlY29uZCBsZXZlbCBzZWN0aW9ucyAqLwotICAgIG1hcmdpbi1ib3R0b206IDA7IH0KLSAgICAvKiBzZWN0aW9uIGhlYWRlciBsaW5rcyAqLwotICAgICNuYXYgPiBsaSA+IGRpdiA+IGEgewotICAgICAgZGlzcGxheTogYmxvY2s7Ci0gICAgICBjb2xvcjogIzMzMzMzMzsKLSAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7Ci0gICAgICBwYWRkaW5nOiAxMHB4IDAgMTBweCAxMHB4OyB9Ci0gICAgI25hdiAubmF2LXNlY3Rpb24taGVhZGVyOmFmdGVyIHsKLSAgICAgIGNvbnRlbnQ6ICcnOwotICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQgdXJsKC4uL2ltYWdlcy9zdHlsZXMvZGlzY2xvc3VyZV9kb3duLnBuZykgbm8tcmVwZWF0IHNjcm9sbCA1MCUgNTAlOwotICAgICAgd2lkdGg6IDM0cHg7Ci0gICAgICBoZWlnaHQ6IDM0cHg7Ci0gICAgICBkaXNwbGF5OiBibG9jazsKLSAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKLSAgICAgIHRvcDogMDsKLSAgICAgIHJpZ2h0OiAwOyB9Ci0gICAgI25hdiAubmF2LXNlY3Rpb24taGVhZGVyLmVtcHR5OmFmdGVyIHsKLSAgICAgIGRpc3BsYXk6IG5vbmU7IH0KLSAgICAvKiBuZXN0ZWQgbmF2IGhlYWRlcnMgKi8KLSAgICAjbmF2IC5uYXYtc2VjdGlvbiAubmF2LXNlY3Rpb24gewotICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwotICAgICAgcGFkZGluZzogMDsKLSAgICAgIG1hcmdpbjogMDsgfQotICAgICNuYXYgLm5hdi1zZWN0aW9uIGxpIGEgewotICAgIC8qIGZpcnN0IGdlbiBjaGlsZCAoMm5kIGxldmVsIGxpKSAqLwotICAgICAgZGlzcGxheTpibG9jazsKLSAgICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7Ci0gICAgICB0ZXh0LXRyYW5zZm9ybTogbm9uZTsKLSAgICAgIHBhZGRpbmc6IDdweCA1cHggN3B4IDEwcHg7Ci0gICAgICAgfQotICAgICNuYXYgLm5hdi1zZWN0aW9uIGxpIGxpIGEgewotICAgIC8qIHNlY29uZCBnZW4gY2hpbGQgKDNyZCBsZXZlbCBsaSkgKi8KLSAgICAgIHBhZGRpbmc6IDVweCA1cHggNXB4IDEwcHg7Ci0gICAgICAgfQotICAjbmF2IGxpLmV4cGFuZGVkIC5uYXYtc2VjdGlvbi1oZWFkZXIgewotICAgIGJhY2tncm91bmQ6I2U5ZTllOTsKLSAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMDUpOyB9Ci0gICNuYXYgbGkuZXhwYW5kZWQgbGkgLm5hdi1zZWN0aW9uLWhlYWRlciB7Ci0gICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7IH0KLSAgI25hdiBsaS5leHBhbmRlZCBsaSB1bCB7Ci0gIC8qIDNyZCBsZXZlbCB1bCAqLwotICAgIHBhZGRpbmc6MCAwIDAgMTBweDsKLSAgfQotICAgICNuYXYgbGkuZXhwYW5kZWQgPiAubmF2LXNlY3Rpb24taGVhZGVyOmFmdGVyIHsKLSAgICAgIGNvbnRlbnQ6ICcnOwotICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQgdXJsKC4uL2ltYWdlcy9zdHlsZXMvZGlzY2xvc3VyZV91cC5wbmcpIG5vLXJlcGVhdCBzY3JvbGwgNTAlIDUwJTsKLSAgICAgIHdpZHRoOiAzNHB4OwotICAgICAgaGVpZ2h0OiAzNHB4OyB9Ci0gICNuYXYgbGkuZXhwYW5kZWQgbGkgdWwudHJlZS1saXN0LWNoaWxkcmVuIHsKLSAgICBwYWRkaW5nOjA7ICAKLSAgfQotICAjbmF2IGxpLmV4cGFuZGVkIGxpIHVsLnRyZWUtbGlzdC1jaGlsZHJlbiAudHJlZS1saXN0LWNoaWxkcmVuIHsKLSAgICBwYWRkaW5nOjAgMCAwIDEwcHg7ICAKLSAgfQotICAjbmF2IGxpIHNwYW4udHJlZS1saXN0LXN1YnRpdGxlIHsKLSAgICBkaXNwbGF5OmlubGluZS1ibG9jazsKLSAgICBwYWRkaW5nOjVweCAwIDAgMTBweDsKLSAgICBjb2xvcjojNTU1OwotICAgIHRleHQtdHJhbnNmb3JtOnVwcGVyY2FzZTsKLSAgICBmb250LXNpemU6MTJweDsKLSAgfQotICAjbmF2IGxpIHNwYW4udHJlZS1saXN0LXN1YnRpdGxlOmJlZm9yZSB7Ci0gICAgY29udGVudDogJ+KAlCc7Ci0gIH0KLSAgI25hdiBsaSBzcGFuLnRyZWUtbGlzdC1zdWJ0aXRsZTphZnRlciB7Ci0gICAgY29udGVudDogJ+KAlCc7Ci0gIH0KLSAgI25hdiBsaSB1bCB7Ci0gICAgZGlzcGxheTpub25lOwotICAgIG92ZXJmbG93OiBoaWRkZW47Ci0gICAgbWFyZ2luOiAwOyB9Ci0gICAgI25hdiBsaSB1bC5hbmltYXRlLWhlaWdodC1pbiB7Ci0gICAgICAtd2Via2l0LXRyYW5zaXRpb246IGhlaWdodCAwLjI1cyBlYXNlLWluOwotICAgICAgLW1vei10cmFuc2l0aW9uOiBoZWlnaHQgMC4yNXMgZWFzZS1pbjsKLSAgICAgIHRyYW5zaXRpb246IGhlaWdodCAwLjI1cyBlYXNlLWluOyB9Ci0gICAgI25hdiBsaSB1bC5hbmltYXRlLWhlaWdodC1vdXQgewotICAgICAgLXdlYmtpdC10cmFuc2l0aW9uOiBoZWlnaHQgMC4yNXMgZWFzZS1vdXQ7Ci0gICAgICAtbW96LXRyYW5zaXRpb246IGhlaWdodCAwLjI1cyBlYXNlLW91dDsKLSAgICAgIHRyYW5zaXRpb246IGhlaWdodCAwLjI1cyBlYXNlLW91dDsgfQotICAgICNuYXYgbGkgdWwgbGkgewotICAgICAgcGFkZGluZzogMDsgfQotICAgICAgI25hdiBsaSBsaSBsaSB7Ci0gICAgICAgIHBhZGRpbmc6IDA7IH0KLSAgI25hdiBsaS5leHBhbmRlZCB1bCB7Ci0gICAgfQotICAgICNuYXYgbGkgdWwgPiBsaSB7Ci0gICAgICBwYWRkaW5nOjA7Ci0gICAgfQotICAgICNuYXYgbGkgdWwgPiBsaTpsYXN0LWNoaWxkIHsKLSAgICAgIHBhZGRpbmctYm90dG9tOjVweDsKLSAgICB9Ci0gICAgI25hdiBsaSB1bC50cmVlLWxpc3QtY2hpbGRyZW4gPiBsaTpsYXN0LWNoaWxkIHsKLSAgICAgIHBhZGRpbmctYm90dG9tOjA7Ci0gICAgfQotICAgICNuYXYgbGkuZXhwYW5kZWQgdWwgPiBsaSB7Ci0gICAgICBiYWNrZ3JvdW5kOiNlZmVmZWY7Ci0gICAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMDMpOyB9Ci0gICAgI25hdiBsaS5leHBhbmRlZCB1bCA+IGxpIGxpIHsKLSAgICAgIGJhY2tncm91bmQ6aW5oZXJpdDsgfQotICAjbmF2IGxpIHVsLnRyZWUtbGlzdC1jaGlsZHJlbiB1bCB7Ci0gICAgZGlzcGxheTpibG9jazsgfQotCi0ubmV3LAotLm5ldy1jaGlsZCB7Ci0gIGZvbnQtc2l6ZTogLjc4ZW07Ci0gIGZvbnQtd2VpZ2h0OiBib2xkOwotICBjb2xvcjogI2ZmM2QzZDsKLSAgdmVydGljYWwtYWxpZ246dG9wOwotICB3aGl0ZS1zcGFjZTpub3dyYXA7Ci19Ci0KLS8qIGNvbnRlbnQgaGVhZGVyICovCi0uY29udGVudC1oZWFkZXIgewotICBoZWlnaHQ6IDMwcHg7Ci0gIG1hcmdpbjoyMHB4IDAgMjVweDsKLSAgcGFkZGluZzowIDAgMTBweDt9Ci0uY29udGVudC1oZWFkZXIuanVzdC1saW5rcyB7Ci0gIG1hcmdpbi1ib3R0b206MDsKLSAgcGFkZGluZy1ib3R0b206MDt9Ci0gCi0uY29udGVudC1oZWFkZXIgaDEgewotICBjb2xvcjojMDAwOwotICBtYXJnaW46MDsKLSAgYm9yZGVyLWJvdHRvbTowOwotICBwYWRkaW5nOjA7Ci19Ci0KLS5jb250ZW50LWZvb3RlciB7Ci0gIGJvcmRlci10b3A6IDFweCBzb2xpZCAjY2NjOwotICBtYXJnaW4tdG9wOiAxMHB4OwotICBwYWRkaW5nLXRvcDoxMHB4OwotICBoZWlnaHQ6IDMwcHg7Ci19Ci0KLS5jb250ZW50LWZvb3Rlci1zYWMgewotICBib3JkZXItdG9wOiAxcHggc29saWQgI2NjYzsKLX0KLS5jb250ZW50LWZvb3RlciAuY29sLTkgewotICBtYXJnaW4tbGVmdDowOwotfQotLmNvbnRlbnQtZm9vdGVyIC5jb2wtNCB7Ci0gIG1hcmdpbi1yaWdodDowOwotfQotLmNvbnRlbnQtZm9vdGVyLndyYXAgewotICB3aWR0aDo5NDBweDsKLX0KLQotLnBhZ2luZy1saW5rcyB7Ci0gIHBvc2l0aW9uOiByZWxhdGl2ZTsgfQotICAucGFnaW5nLWxpbmtzIGEgewotICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsgfQotICAucGFnaW5nLWxpbmtzIGEsCi0gIC50cmFpbmluZy1uYXYtdG9wIGEgewotICAgIGZvbnQtc2l6ZTogMTRweDsKLSAgICBsaW5lLWhlaWdodDogMzBweDsKLSAgICBjb2xvcjogIzU1NTU1NTsKLSAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci0gICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsgfQotICAgIC5wYWdpbmctbGlua3MgLnByZXYtcGFnZS1saW5rOmJlZm9yZSwKLSAgICAudHJhaW5pbmctbmF2LXRvcCAucHJldi1wYWdlLWxpbms6YmVmb3JlIHsKLSAgICAgIGNvbnRlbnQ6ICcnOwotICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQgdXJsKC4uL2ltYWdlcy9zdHlsZXMvZGlzY2xvc3VyZV9sZWZ0LnBuZykgbm8tcmVwZWF0IHNjcm9sbCA1MCUgNTAlOwotICAgICAgd2lkdGg6IDEwcHg7Ci0gICAgICBoZWlnaHQ6IDEwcHg7Ci0gICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Ci0gICAgICBtYXJnaW4tcmlnaHQ6IDVweDsgfQotICAgIC50cmFpbmluZy1uYXYtdG9wIC5uZXh0LXBhZ2UtbGluaywKLSAgICAudHJhaW5pbmctbmF2LXRvcCAuc3RhcnQtY2xhc3MtbGluaywKLSAgICAudHJhaW5pbmctbmF2LXRvcCAuc3RhcnQtY291cnNlLWxpbmsgewotICAgIHJpZ2h0OiAxMHB4OyB9Ci0gICAgLnBhZ2luZy1saW5rcyAucHJldi1wYWdlLWxpbmsgewotICAgICAgbGVmdDogLTE1cHg7IH0KLSAgICAucGFnaW5nLWxpbmtzIC5uZXh0LXBhZ2UtbGluayB7Ci0gICAgICByaWdodDogMHB4OyB9Ci0gICAgLm5leHQtcGFnZS1saW5rOmFmdGVyLAotICAgIC5zdGFydC1jbGFzcy1saW5rOmFmdGVyLAotICAgIC5zdGFydC1jb3Vyc2UtbGluazphZnRlciwKLSAgICAubmV4dC1jbGFzcy1saW5rOmFmdGVyIHsKLSAgICAgIGNvbnRlbnQ6ICcnOwotICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQgdXJsKC4uL2ltYWdlcy9zdHlsZXMvZGlzY2xvc3VyZV9yaWdodC5wbmcpIG5vLXJlcGVhdCBzY3JvbGwgNTAlIDUwJTsKLSAgICAgIHdpZHRoOiAxMHB4OwotICAgICAgaGVpZ2h0OiAxMHB4OwotICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwotICAgICAgbWFyZ2luLWxlZnQ6IDVweDsgfQotICAgICAgCi0gICAgICAKLSAgLnRyYWluaW5nLW5hdi10b3AgYSB7Ci0gICAgZGlzcGxheTpibG9jazsKLSAgICBmbG9hdDpsZWZ0OwotICAgIHdpZHRoOjEyMnB4OwotICAgIGhlaWdodDoyOHB4OwotICAgIHBhZGRpbmc6IDhweDsKLSAgICBsaW5lLWhlaWdodDoyOHB4OwotICAgIHRleHQtYWxpZ246Y2VudGVyOwotICAgIGJvcmRlcjoxcHggc29saWQgI0RBREFEQTsKLSAgICBib3JkZXItYm90dG9tOjA7Ci0gIH0KLQotICAudHJhaW5pbmctbmF2LXRvcCBhLm5leHQtcGFnZS1saW5rIHsKLSAgICBib3JkZXItbGVmdDowOwotICAgIHdpZHRoOjEyM3B4OwotICB9Ci0gICAgICAKLSAgLnBhZ2luZy1saW5rcyBhLmRpc2FibGVkLAotICAudHJhaW5pbmctbmF2LXRvcCBhLmRpc2FibGVkLAotICAuY29udGVudC1mb290ZXIgYS5kaXNhYmxlZCB7Ci0gICAgY29sb3I6I2JiYjsKLSAgfQotICAgICAgCi0gIC5wYWdpbmctbGlua3MgYS5kaXNhYmxlZDpob3ZlciwKLSAgLnRyYWluaW5nLW5hdi10b3AgYS5kaXNhYmxlZDpob3ZlciwKLSAgLmNvbnRlbnQtZm9vdGVyIGEuZGlzYWJsZWQ6aG92ZXIgewotICAgIGN1cnNvcjpkZWZhdWx0OwotICAgIGNvbG9yOiNiYmIgIWltcG9ydGFudDsKLSAgfQotICAgICAgCi0gIC50cmFpbmluZy1uYXYtdG9wIGEuc3RhcnQtY2xhc3MtbGluaywKLSAgLnRyYWluaW5nLW5hdi10b3AgYS5zdGFydC1jb3Vyc2UtbGluayB7Ci0gICAgd2lkdGg6MjYycHg7Ci0gIH0KLSAgCi0gIC8qIGxpc3Qgb2YgY2xhc3NlcyBvbiBjb3Vyc2UgbGFuZGluZyBwYWdlICovCi0gIG9sLmNsYXNzLWxpc3QgewotICAgIGxpc3Qtc3R5bGU6bm9uZTsKLSAgICBtYXJnaW4tbGVmdDowOwotICB9Ci0gIG9sLmNsYXNzLWxpc3Q+bGkgewotICAgIG1hcmdpbjowIDAgMTVweDsKLSAgICBwYWRkaW5nOjVweCAwIDA7Ci0gICAgb3ZlcmZsb3c6aGlkZGVuOwotICAgIGJvcmRlci10b3A6MXB4IHNvbGlkICNjY2M7Ci0gIH0KLSAgb2wuY2xhc3MtbGlzdCBsaSBhLnRpdGxlIHsKLSAgICBmb250LXNpemU6MTZweDsKLSAgICBtYXJnaW46MDsKLSAgICBjbGVhcjpsZWZ0OwotICAgIGRpc3BsYXk6YmxvY2s7Ci0gICAgaGVpZ2h0OjMycHg7Ci0gICAgcGFkZGluZzowIDRweDsKLSAgfQotICBvbC5jbGFzcy1saXN0IGxpIGEudGl0bGUgaDIgewotICAgIGNvbG9yOmluaGVyaXQ7Ci0gICAgbWFyZ2luOjAgMCAxMHB4OwotICAgIGRpc3BsYXk6YmxvY2s7Ci0gICAgZmxvYXQ6bGVmdDsKLSAgICB3aWR0aDo2NzVweDsKLSAgfQotICBvbC5jbGFzcy1saXN0IGxpIGEudGl0bGUgc3BhbiB7Ci0gICAgZGlzcGxheTpub25lOwotICAgIGZsb2F0OmxlZnQ7Ci0gICAgZm9udC1zaXplOjE4cHg7Ci0gICAgZm9udC13ZWlnaHQ6Ym9sZDsKLSAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudCB1cmwoLi4vaW1hZ2VzL3N0eWxlcy9kaXNjbG9zdXJlX3JpZ2h0LnBuZykgbm8tcmVwZWF0IHNjcm9sbCA1MCUgNTAlOwotICAgIHdpZHRoOiAxMHB4OwotICAgIGhlaWdodDogMzJweDsKLSAgfQotICBvbC5jbGFzcy1saXN0IGxpIGEudGl0bGU6aG92ZXIgewotICAgIGJhY2tncm91bmQ6I2RkZDsKLSAgICBjb2xvcjojMjU4QUFGICFpbXBvcnRhbnQ7Ci0gIH0KLSAgb2wuY2xhc3MtbGlzdCBsaSBhLnRpdGxlOmhvdmVyIHNwYW4gewotICAgIGRpc3BsYXk6YmxvY2s7Ci0gIH0KLSAgCi0gICNqZC1jb250ZW50Ci0gIG9sLmNsYXNzLWxpc3QgbGkgaW1nIHsKLSAgICBmbG9hdDpsZWZ0OwotICAgIGNsZWFyOmxlZnQ7Ci0gICAgd2lkdGg6NjRweDsKLSAgICBtYXJnaW46MCAyMHB4IDAgMDsKLSAgfQotICBvbC5jbGFzcy1saXN0IGxpIHAuZGVzY3JpcHRpb24gewotICAgIGZsb2F0OmxlZnQ7Ci0gICAgZGlzcGxheTpibG9jazsKLSAgICB3aWR0aDoyNTBweDsKLSAgICBtYXJnaW46MDsKLSAgfQotICBvbC5jbGFzcy1saXN0IGxpIHAuZGVzY3JpcHRpb24uYXJ0aWNsZSB7Ci0gICAgd2lkdGg6IDU1MHB4OwotICB9Ci0gIG9sLmNsYXNzLWxpc3Qgb2wgewotICAgIGZsb2F0OmxlZnQ7Ci0gICAgd2lkdGg6MzIwcHg7Ci0gICAgbWFyZ2luOjAgMCAwIDMwcHg7Ci0gICAgbGlzdC1zdHlsZTpub25lOwotICAgIG1hcmdpbjowIDAgMCAyMHB4OwotICB9Ci0gIG9sLmNsYXNzLWxpc3QgZGl2Lmxlc3NvbnMgbGkgewotICAgIG1hcmdpbjowIDAgNnB4OwotICAgIGxpbmUtaGVpZ2h0OjE2cHg7Ci0gIH0KLSAgCi0gIAotICAuaGlkZSB7Ci0gICAgZGlzcGxheTpub25lICFpbXBvcnRhbnQ7Ci0gIH0KLSAgCi0gIC5jb250ZW50LWZvb3Rlci5uZXh0LWNsYXNzIHsKLSAgICBkaXNwbGF5OmJsb2NrOwotICAgIGJvcmRlcjowOwotICAgIG1hcmdpbi10b3A6MDsKLSAgICBwYWRkaW5nLXRvcDowOwotICB9Ci0gIAotICAuY29udGVudC1mb290ZXIubmV4dC1jbGFzcyBhLm5leHQtY2xhc3MtbGluayB7Ci0gICAgZGlzcGxheTpibG9jazsKLSAgICBmbG9hdDpyaWdodDsKLSAgICB0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2U7Ci0gIH0KLSAgCi0gIAotICAKLSAgLyogaW5uZXItZG9jIHRhYnMgdy8gdGl0bGUgKi8KLSAgCi1kaXYjdGl0bGUtdGFicy13cmFwcGVyIHsKLSAgYm9yZGVyLWJvdHRvbToxcHggc29saWQgI2NjYzsKLSAgbWFyZ2luOjIwcHggMCAzMHB4OwotfQotaDEud2l0aC10aXRsZS10YWJzIHsKLSAgZGlzcGxheTppbmxpbmUtYmxvY2s7Ci0gIG1hcmdpbjowIDAgLTFweCAwOwotICBwYWRkaW5nOjAgNjBweCAwIDA7Ci0gIGJvcmRlci1ib3R0b206MXB4IHNvbGlkICNGOUY5Rjk7Ci19Ci11bCN0aXRsZS10YWJzIHsKLSAgbGlzdC1zdHlsZTpub25lOwotICBwYWRkaW5nOjA7Ci0gIGhlaWdodDoyOXB4OwotICBtYXJnaW46MDsKLSAgZm9udC1zaXplOjE2cHg7Ci0gIGxpbmUtaGVpZ2h0OjI2cHg7Ci0gIGRpc3BsYXk6aW5saW5lLWJsb2NrOwotICB2ZXJ0aWNhbC1hbGlnbjpib3R0b207Ci19Ci11bCN0aXRsZS10YWJzIGxpIHsKLSAgZGlzcGxheTpibG9jazsKLSAgZmxvYXQ6bGVmdDsKLSAgbWFyZ2luLXJpZ2h0OjQwcHg7Ci0gIGJvcmRlci1ib3R0b206IDNweCBzb2xpZCB0cmFuc3BhcmVudDsKLX0KLXVsI3RpdGxlLXRhYnMgbGkuc2VsZWN0ZWQgewotICBib3JkZXItYm90dG9tOiAzcHggc29saWQgIzkzQzsKLX0KLXVsI3RpdGxlLXRhYnMgbGkgYSB7Ci0gIGNvbG9yOiMzMzM7Ci19Ci11bCN0aXRsZS10YWJzIGxpIGE6aG92ZXIsCi11bCN0aXRsZS10YWJzIGxpIGE6YWN0aXZlIHsKLSAgY29sb3I6IzkzQyAhaW1wb3J0YW50OwotfQotCi0KLQotLyogY29udGVudCBib2R5ICovCi1ALXdlYmtpdC1rZXlmcmFtZXMgZ2xvd2hlYWRlciB7Ci0gIGZyb20gewotICAgIGJhY2tncm91bmQtY29sb3I6ICMzM2I1ZTU7Ci0gICAgY29sb3I6ICMwMDA7Ci0gICAgYm9yZGVyLWJvdHRvbS1jb2xvcjogIzAwMDsgfQotCi0gIHRvIHsKLSAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDsKLSAgICBjb2xvcjogIzMzYjVlNTsKLSAgICBib3JkZXItYm90dG9tLWNvbG9yOiAjMzNiNWU1OyB9IH0KLQotQC1tb3ota2V5ZnJhbWVzIGdsb3doZWFkZXIgewotICBmcm9tIHsKLSAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMzNiNWU1OwotICAgIGNvbG9yOiAjMDAwOwotICAgIGJvcmRlci1ib3R0b20tY29sb3I6ICMwMDA7IH0KLQotICB0byB7Ci0gICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7Ci0gICAgY29sb3I6ICMzM2I1ZTU7Ci0gICAgYm9yZGVyLWJvdHRvbS1jb2xvcjogIzMzYjVlNTsgfSB9Ci0KLUBrZXlmcmFtZXMgZ2xvd2hlYWRlciB7Ci0gIGZyb20gewotICAgIGJhY2tncm91bmQtY29sb3I6ICMzM2I1ZTU7Ci0gICAgY29sb3I6ICMwMDA7Ci0gICAgYm9yZGVyLWJvdHRvbS1jb2xvcjogIzAwMDsgfQotCi0gIHRvIHsKLSAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDsKLSAgICBjb2xvcjogIzMzYjVlNTsKLSAgICBib3JkZXItYm90dG9tLWNvbG9yOiAjMzNiNWU1OyB9IH0KLQotaDI6dGFyZ2V0LAotaDM6dGFyZ2V0IHsKLSAgICAtd2Via2l0LWFuaW1hdGlvbi1uYW1lOiBnbG93aGVhZGVyOwotICAgIC1tb3otYW5pbWF0aW9uLW5hbWU6IGdsb3doZWFkZXI7Ci0gICAgYW5pbWF0aW9uLW5hbWU6IGdsb3doZWFkZXI7Ci0gICAgLXdlYmtpdC1hbmltYXRpb24tZHVyYXRpb246IDAuN3M7Ci0gICAgLW1vei1hbmltYXRpb24tZHVyYXRpb246IDAuN3M7Ci0gICAgYW5pbWF0aW9uLWR1cmF0aW9uOiAwLjdzOwotICAgIC13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogZWFzZS1vdXQ7Ci0gICAgLW1vei1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBlYXNlLW91dDsKLSAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBlYXNlLW91dDsgfQotCi0uZGVzaWduIG9sIGg0IHsKLSAgbWFyZ2luLWJvdHRvbTowOwotfQotLmRlc2lnbiBvbCB7Ci0gIGNvdW50ZXItcmVzZXQ6IGl0ZW07IH0KLSAgLmRlc2lnbiBvbD5saSB7Ci0gICAgZm9udC1zaXplOiAxNHB4OwotICAgIGxpbmUtaGVpZ2h0OiAyMHB4OwotICAgIGxpc3Qtc3R5bGUtdHlwZTogbm9uZTsKLSAgICBwb3NpdGlvbjogcmVsYXRpdmU7IH0KLSAgICAuZGVzaWduIG9sPmxpOmJlZm9yZSB7Ci0gICAgICBjb250ZW50OiBjb3VudGVyKGl0ZW0pICIuICI7Ci0gICAgICBjb3VudGVyLWluY3JlbWVudDogaXRlbTsKLSAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKLSAgICAgIGxlZnQ6IC0yMHB4OwotICAgICAgdG9wOiAwOyB9Ci0gICAgLmRlc2lnbiBvbCBsaS52YWx1ZS0xOmJlZm9yZSB7Ci0gICAgICBjb250ZW50OiAiMS4gIjsgfQotICAgIC5kZXNpZ24gb2wgbGkudmFsdWUtMjpiZWZvcmUgewotICAgICAgY29udGVudDogIjIuICI7IH0KLSAgICAuZGVzaWduIG9sIGxpLnZhbHVlLTM6YmVmb3JlIHsKLSAgICAgIGNvbnRlbnQ6ICIzLiAiOyB9Ci0gICAgLmRlc2lnbiBvbCBsaS52YWx1ZS00OmJlZm9yZSB7Ci0gICAgICBjb250ZW50OiAiNC4gIjsgfQotICAgIC5kZXNpZ24gb2wgbGkudmFsdWUtNTpiZWZvcmUgewotICAgICAgY29udGVudDogIjUuICI7IH0KLSAgICAuZGVzaWduIG9sIGxpLnZhbHVlLTY6YmVmb3JlIHsKLSAgICAgIGNvbnRlbnQ6ICI2LiAiOyB9Ci0gICAgLmRlc2lnbiBvbCBsaS52YWx1ZS03OmJlZm9yZSB7Ci0gICAgICBjb250ZW50OiAiNy4gIjsgfQotICAgIC5kZXNpZ24gb2wgbGkudmFsdWUtODpiZWZvcmUgewotICAgICAgY29udGVudDogIjguICI7IH0KLSAgICAuZGVzaWduIG9sIGxpLnZhbHVlLTk6YmVmb3JlIHsKLSAgICAgIGNvbnRlbnQ6ICI5LiAiOyB9Ci0gICAgLmRlc2lnbiBvbCBsaS52YWx1ZS0xMDpiZWZvcmUgewotICAgICAgY29udGVudDogIjEwLiAiOyB9Ci0uZGVzaWduIC53aXRoLWNhbGxvdXRzIG9sPmxpIHsKLSAgbGlzdC1zdHlsZS1wb3NpdGlvbjogaW5zaWRlOwotICBtYXJnaW4tbGVmdDogMDsgfQotICAuZGVzaWduIC53aXRoLWNhbGxvdXRzIG9sPmxpOmJlZm9yZSB7Ci0gICAgZGlzcGxheTogaW5saW5lOwotICAgIGxlZnQ6IC0yMHB4OwotICAgIGZsb2F0OiBsZWZ0OwotICAgIHdpZHRoOiAxN3B4OwotICAgIGNvbG9yOiAjMzNiNWU1OwotICAgIGZvbnQtd2VpZ2h0OiA1MDA7IH0KLS5kZXNpZ24gLndpdGgtY2FsbG91dHMgdWw+bGkgewotICBsaXN0LXN0eWxlLXBvc2l0aW9uOiBvdXRzaWRlOyB9Ci0KLS8qIHNwZWNpYWwgbGlzdCBpdGVtcyAqLwotbGkubm8tYnVsbGV0IHsKLSAgbGlzdC1zdHlsZS10eXBlOiBub25lICFpbXBvcnRhbnQ7IH0KLWxpLm5vLWJ1bGxldCAqewotICBtYXJnaW46MDsgfQotCi0uZGVzaWduIGxpLndpdGgtaWNvbiB7Ci0gIHBvc2l0aW9uOiByZWxhdGl2ZTsKLSAgbWFyZ2luLWxlZnQ6IDIwcHg7Ci0gIG1pbi1oZWlnaHQ6IDMwcHg7IH0KLSAgLmRlc2lnbiBsaS53aXRoLWljb24gcCB7Ci0gICAgbWFyZ2luLWxlZnQ6IDAgIWltcG9ydGFudDsgfQotICAuZGVzaWduIGxpLndpdGgtaWNvbjpiZWZvcmUgewotICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKLSAgICBsZWZ0OiAtNDBweDsKLSAgICB0b3A6IDA7Ci0gICAgY29udGVudDogJyc7Ci0gICAgd2lkdGg6IDMwcHg7Ci0gICAgaGVpZ2h0OiAzMHB4OyB9Ci0gIC5kZXNpZ24gbGkud2l0aC1pY29uLnRhYmxldDpiZWZvcmUgewotICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybCguLi9pbWFnZXMvc3R5bGVzL2ljb19waG9uZV90YWJsZXQucG5nKTsgfQotICAuZGVzaWduIGxpLndpdGgtaWNvbi53ZWI6YmVmb3JlIHsKLSAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoLi4vaW1hZ2VzL3N0eWxlcy9pY29fd2ViLnBuZyk7IH0KLSAgLmRlc2lnbiBsaS53aXRoLWljb24uYWN0aW9uOmJlZm9yZSB7Ci0gICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKC4uL2ltYWdlcy9zdHlsZXMvaWNvX2FjdGlvbi5wbmcpOyB9Ci0gIC5kZXNpZ24gbGkud2l0aC1pY29uLnVzZTpiZWZvcmUgewotICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybCguLi9pbWFnZXMvc3R5bGVzL2ljb191c2UucG5nKTsgfQotCi0vKiBmaWd1cmVzIGFuZCBjYWxsb3V0cyAqLwotLmZpZ3VyZSB7Ci0gIHBvc2l0aW9uOiByZWxhdGl2ZTsgfQotICAuZmlndXJlLnBhZC1iZWxvdyB7Ci0gICAgbWFyZ2luLWJvdHRvbTogMjBweDsgfQotICAuZmlndXJlIC5maWd1cmUtY2FsbG91dCB7Ci0gICAgcG9zaXRpb246IGFic29sdXRlOwotICAgIGNvbG9yOiAjZmZmOwotICAgIGZvbnQtd2VpZ2h0OiA1MDA7Ci0gICAgZm9udC1zaXplOiAxNnB4OwotICAgIGxpbmUtaGVpZ2h0OiAyM3B4OwotICAgIHRleHQtYWxpZ246IGNlbnRlcjsKLSAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudCB1cmwoLi4vaW1hZ2VzL3N0eWxlcy9jYWxsb3V0LnBuZykgbm8tcmVwZWF0IHNjcm9sbCA1MCUgNTAlOwotICAgIHBhZGRpbmctcmlnaHQ6IDJweDsKLSAgICB3aWR0aDogMzBweDsKLSAgICBoZWlnaHQ6IDI5cHg7Ci0gICAgei1pbmRleDogMTAwMDsgfQotICAgIC5maWd1cmUgLmZpZ3VyZS1jYWxsb3V0LnRvcCB7Ci0gICAgICB0b3A6IC05cHg7IH0KLSAgICAuZmlndXJlIC5maWd1cmUtY2FsbG91dC5yaWdodCB7Ci0gICAgICByaWdodDogLTVweDsgfQotCi0uZmlndXJlLWNhcHRpb24gewotICBtYXJnaW46IDAgMTBweCAyMHB4IDA7Ci0gIGZvbnQtc2l6ZTogMTRweDsKLSAgbGluZS1oZWlnaHQ6IDIwcHg7Ci0gIGZvbnQtc3R5bGU6IGl0YWxpYzsgfQotCi0vKiByb3dzIG9mIGZpZ3VyZXMgKi8KLS5maWd1cmUtcm93IHsKLSAgZm9udC1zaXplOiAwOwotICBsaW5lLWhlaWdodDogMDsKLSAgLyogdG8gcHJldmVudCBzcGFjZSBiZXR3ZWVuIGZpZ3VyZXMgKi8gfQotICAuZmlndXJlLXJvdyAuZmlndXJlIHsKLSAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Ci0gICAgdmVydGljYWwtYWxpZ246IHRvcDsgfQotICAuZmlndXJlLXJvdyAuZmlndXJlICsgLmZpZ3VyZSB7Ci0gICAgbWFyZ2luLWxlZnQ6IDEwcHg7Ci0gICAgLyogcmVpbnRyb2R1Y2Ugc3BhY2UgYmV0d2VlbiBmaWd1cmVzICovIH0KLQotLyogdmlkZW8gIGNvbnRhaW5lcnMgKi8KLS5mcmFtZWQtZ2FsYXh5bmV4dXMtbGFuZC1zcGFuLTEzIHsKLSAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQgdXJsKC4uL2ltYWdlcy9zdHlsZXMvZGV2aWNlX2dhbGF4eW5leHVzX2JsYW5rX2xhbmRfc3BhbjEzLnBuZykgbm8tcmVwZWF0Ci1zY3JvbGwgdG9wIGxlZnQ7Ci0gIHBhZGRpbmc6IDQycHggMTIycHggNjJweCAxMjZweDsKLSAgb3ZlcmZsb3c6IGhpZGRlbjsgfQotICAuZnJhbWVkLWdhbGF4eW5leHVzLWxhbmQtc3Bhbi0xMywgLmZyYW1lZC1nYWxheHluZXh1cy1sYW5kLXNwYW4tMTMgdmlkZW8sCi0uZnJhbWVkLWdhbGF4eW5leHVzLWxhbmQtc3Bhbi0xMyBpbWcgewotICAgIHdpZHRoOiA1MTJweDsKLSAgICBoZWlnaHQ6IDI4NnB4OyB9Ci0KLQotLmZyYW1lZC1nYWxheHluZXh1cy1sYW5kLXNwYW4tOHsKLSAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQgdXJsKC4uL2ltYWdlcy9zdHlsZXMvZGV2aWNlX2dhbGF4eW5leHVzX2JsYW5rX2xhbmRfc3BhbjgucG5nKSBuby1yZXBlYXQKLXNjcm9sbCB0b3AgbGVmdDsKLSAgcGFkZGluZzogMjZweCA2OHB4IDM4cHggNzJweDsKLSAgb3ZlcmZsb3c6IGhpZGRlbjsgfQotICAuZnJhbWVkLWdhbGF4eW5leHVzLWxhbmQtc3Bhbi04LCAuZnJhbWVkLWdhbGF4eW5leHVzLWxhbmQtc3Bhbi04IHZpZGVvLAotLmZyYW1lZC1nYWxheHluZXh1cy1sYW5kLXNwYW4tOCBpbWcgewotICAgIHdpZHRoOiAzMjBweDsKLSAgICBoZWlnaHQ6IDE4MHB4OyB9Ci0KLS5mcmFtZWQtZ2FsYXh5bmV4dXMtcG9ydC1zcGFuLTkgewotICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudCB1cmwoLi4vaW1hZ2VzL3N0eWxlcy9kZXZpY2VfZ2FsYXh5bmV4dXNfYmxhbmtfcG9ydF9zcGFuOS5wbmcpIG5vLXJlcGVhdAotc2Nyb2xsIHRvcCBsZWZ0OwotICBwYWRkaW5nOiA5NXB4IDEyMnB4IDEwN3B4IDEyNHB4OwotICBvdmVyZmxvdzogaGlkZGVuOyB9Ci0gIC5mcmFtZWQtZ2FsYXh5bmV4dXMtcG9ydC1zcGFuLTksIC5mcmFtZWQtZ2FsYXh5bmV4dXMtcG9ydC1zcGFuLTkgdmlkZW8sCi0uZnJhbWVkLWdhbGF4eW5leHVzLXBvcnQtc3Bhbi05IGltZyB7Ci0gICAgd2lkdGg6IDI3NHB4OwotICAgIGhlaWdodDogNDg4cHg7IH0KLQotLmZyYW1lZC1nYWxheHluZXh1cy1wb3J0LXNwYW4tNSB7Ci0gIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50IHVybCguLi9pbWFnZXMvc3R5bGVzL2RldmljZV9nYWxheHluZXh1c19ibGFua19wb3J0X3NwYW41LnBuZykgbm8tcmVwZWF0Ci1zY3JvbGwgdG9wIGxlZnQ7Ci0gIHBhZGRpbmc6IDc1cHggMzFweCA3NnB4IDMzcHg7Ci0gIG92ZXJmbG93OiBoaWRkZW47IH0KLSAgLmZyYW1lZC1nYWxheHluZXh1cy1wb3J0LXNwYW4tNSwgLmZyYW1lZC1nYWxheHluZXh1cy1wb3J0LXNwYW4tNSB2aWRlbywKLS5mcmFtZWQtZ2FsYXh5bmV4dXMtcG9ydC1zcGFuLTUgaW1nIHsKLSAgICB3aWR0aDogMjE2cHg7Ci0gICAgaGVpZ2h0OiAzODRweDsgfQotCi0vKiBsYW5kaW5nIHBhZ2UgZGlzY2xvc3VyZXMgKi8KLS5sYW5kaW5nLXBhZ2UtbGluayB7Ci0gIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKLSAgZm9udC13ZWlnaHQ6IDUwMDsKLSAgY29sb3I6ICMzMzMzMzM7IH0KLSAgLmxhbmRpbmctcGFnZS1saW5rOmFmdGVyIHsKLSAgICBjb250ZW50OiAnJzsKLSAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudCB1cmwoLi4vaW1hZ2VzL3N0eWxlcy9kaXNjbG9zdXJlX3JpZ2h0LnBuZykgbm8tcmVwZWF0IHNjcm9sbCA1MCUgNTAlOwotICAgIHdpZHRoOiAxMHB4OwotICAgIGhlaWdodDogMTBweDsKLSAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Ci0gICAgbWFyZ2luLWxlZnQ6IDVweDsgfQotCi0vKiB0b29sdGlwcyAqLwotLnRvb2x0aXAtYm94IHsKLSAgcG9zaXRpb246IGFic29sdXRlOwotICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuOSk7Ci0gIGJvcmRlci1yYWRpdXM6IDJweDsKLSAgZm9udC1zaXplOiAxNHB4OwotICBsaW5lLWhlaWdodDogMjBweDsKLSAgY29sb3I6ICNmZmY7Ci0gIHBhZGRpbmc6IDZweCAxMHB4OwotICBtYXgtd2lkdGg6IDI1MHB4OwotICB6LWluZGV4OiAxMDAwMDsgfQotICAudG9vbHRpcC1ib3guYmVsb3c6YWZ0ZXIgewotICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKLSAgICBjb250ZW50OiAnJzsKLSAgICBsaW5lLWhlaWdodDogMDsKLSAgICBkaXNwbGF5OiBibG9jazsKLSAgICB0b3A6IC0xMHB4OwotICAgIGxlZnQ6IDVweDsKLSAgICBib3JkZXI6IDVweCBzb2xpZCB0cmFuc3BhcmVudDsKLSAgICBib3JkZXItYm90dG9tLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuOSk7IH0KLQotLyogdmlkZW8gbm90ZSAqLwotLnZpZGVvLWluc3RydWN0aW9ucyB7Ci0gIG1hcmdpbi10b3A6IDEwcHg7Ci0gIG1hcmdpbi1ib3R0b206IDEwcHg7IH0KLSAgLnZpZGVvLWluc3RydWN0aW9uczpiZWZvcmUgewotICAgIGNvbnRlbnQ6ICcnOwotICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50IHVybCguLi9pbWFnZXMvc3R5bGVzL2ljb19tb3ZpZV9pbmxpbmUucG5nKSBuby1yZXBlYXQgc2Nyb2xsIHRvcCBsZWZ0OwotICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKLSAgICB3aWR0aDogMTJweDsKLSAgICBoZWlnaHQ6IDEycHg7Ci0gICAgbWFyZ2luLXJpZ2h0OiA4cHg7IH0KLSAgLnZpZGVvLWluc3RydWN0aW9uczphZnRlciB7Ci0gICAgY29udGVudDogJ0NsaWNrIGRldmljZSBzY3JlZW4gdG8gcmVwbGF5IG1vdmllLic7IH0KLQotLyogZG93bmxvYWQgYnV0dG9ucyAqLwotLmRvd25sb2FkLWJ1dHRvbiB7Ci0gIGRpc3BsYXk6IGJsb2NrOwotICBtYXJnaW4tYm90dG9tOiA1cHg7Ci0gIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKLSAgYmFja2dyb3VuZC1jb2xvcjogIzMzYjVlNTsKLSAgY29sb3I6ICNmZmYgIWltcG9ydGFudDsKLSAgZm9udC13ZWlnaHQ6IDUwMDsKLSAgYm94LXNoYWRvdzogMCAxcHggMXB4IHJnYmEoMCwgMCwgMCwgMC4xMik7Ci0gIHBhZGRpbmc6IDZweCAxMnB4OwotICBib3JkZXItcmFkaXVzOiAycHg7IH0KLSAgLmRvd25sb2FkLWJ1dHRvbjpob3ZlciwgLmRvd25sb2FkLWJ1dHRvbjpmb2N1cyB7Ci0gICAgYmFja2dyb3VuZC1jb2xvcjogIzAwOTljYzsKLSAgICBjb2xvcjogI2ZmZiAhaW1wb3J0YW50OyB9Ci0gIC5kb3dubG9hZC1idXR0b246YWN0aXZlIHsKLSAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDA2Njk5OyB9Ci0KLS8qIFVJIHRhYmxlcyBhbmQgb3RoZXIgdGhpbmdzIGZvdW5kIGluIFdyaXRpbmcgc3R5bGUgYW5kIFNldHRpbmdzIHBhdHRlcm4gKi8KLS51aS10YWJsZSB7Ci0gIHdpZHRoOiAxMDAlOwotICBiYWNrZ3JvdW5kLWNvbG9yOiAjMjgyODI4OwotICBjb2xvcjogI2ZmZjsKLSAgYm9yZGVyLXJhZGl1czogMnB4OwotICBib3gtc2hhZG93OiAwIDJweCA0cHggcmdiYSgwLCAwLCAwLCAwLjI1KTsKLSAgYm9yZGVyLWNvbGxhcHNlOiBzZXBhcmF0ZTsgfQotICAudWktdGFibGUgdGgsCi0gIC51aS10YWJsZSB0ZCB7Ci0gICAgcGFkZGluZzogNXB4IDEwcHg7Ci0gICAgYmFja2dyb3VuZC1jb2xvcjogaW5oZXJpdDsgCi0gICAgYm9yZGVyOjA7fQotICAudWktdGFibGUgdGhlYWQgdGggewotICAgIGZvbnQtd2VpZ2h0OiBib2xkOyB9Ci0gIC51aS10YWJsZSB0Zm9vdCB0ZCB7Ci0gICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICM0OTQ5NDk7Ci0gICAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgIzQ5NDk0OTsKLSAgICB0ZXh0LWFsaWduOiBjZW50ZXI7IH0KLSAgICAudWktdGFibGUgdGZvb3QgdGQ6bGFzdC1jaGlsZCB7Ci0gICAgICBib3JkZXItcmlnaHQ6IDA7IH0KLQotLmxheW91dC13aXRoLWxpc3QtaXRlbS1tYXJnaW5zIHsKLSAgbWFyZ2luLWxlZnQ6IDMwcHggIWltcG9ydGFudDsgfQotCi0uZW11bGF0ZS1jb250ZW50LWxlZnQtcGFkZGluZyB7Ci0gIG1hcmdpbi1sZWZ0OiAxMHB4OyB9Ci0KLS5kby1kb250LWxhYmVsIHsKLSAgbWFyZ2luLWJvdHRvbTogMTBweDsKLSAgcGFkZGluZy1sZWZ0OiAyMHB4OwotICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudCBub25lIG5vLXJlcGVhdCBzY3JvbGwgMHB4IDNweDsgfQotICAuZG8tZG9udC1sYWJlbC5iYWQgewotICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybCguLi9pbWFnZXMvc3R5bGVzL2ljb193cm9uZy5wbmcpOyB9Ci0gIC5kby1kb250LWxhYmVsLmdvb2QgewotICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybCguLi9pbWFnZXMvc3R5bGVzL2ljb19nb29kLnBuZyk7IH0KLSAgICAKLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLS8qKioqKiBQUkVWSU9VU0xZIHN0eWxlLmNzcyAqKioqKioqKioqKioqKioqKiovCi0KLQotCi0KLQotQG1lZGlhIHNjcmVlbiwgcHJvamVjdGlvbiwgcHJpbnQgewotW2Rpcj0ncnRsJ10gewotICAgIGRpcmVjdGlvbjogcnRsOwotfQotaHRtbCB7Ci0gICAgbGluZS1oZWlnaHQ6IDIwcHg7Ci19Ci1wcmUsIHRhYmxlLCBpbnB1dCwgdGV4dGFyZWEsIGNvZGUgewotICAgIGZvbnQtc2l6ZTogMWVtOwotfQotYWRkcmVzcywgYWJiciwgY2l0ZSB7Ci0gICAgZm9udC1zdHlsZTogbm9ybWFsOwotfQotW2Rpcj0ncnRsJ10gdGggewotICAgIHRleHQtYWxpZ246IHJpZ2h0OwotfQotaHRtbFtsYW5nXj1qYV0gYmxvY2txdW90ZSwgaHRtbFtsYW5nXj1qYV0gcSwgaHRtbFtsYW5nXj1rb10gYmxvY2txdW90ZSwgaHRtbFtsYW5nXj1rb10gcSwKLWh0bWxbbGFuZ149emhdIGJsb2NrcXVvdGUsIGh0bWxbbGFuZ149emhdIHEgewotICAgIGZvbnQtc3R5bGU6IG5vcm1hbDsKLX0KLXEgewotICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKLX0KLWZpZWxkc2V0LCBpZnJhbWUsIGltZyB7Ci0gICAgYm9yZGVyOiAwOwotfQotaW1nIHsgCi0gIC1tcy1pbnRlcnBvbGF0aW9uLW1vZGU6IGJpY3ViaWM7Ci0gIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7Ci0gIG1heC13aWR0aDogMTAwJTsKLX0KLXEgewotICAgIHF1b3Rlczogbm9uZTsKLX0KLXN1cCwgc3ViIHsKLSAgICBmb250LXNpemU6IDExcHg7Ci0gICAgbGluZS1oZWlnaHQ6IDA7Ci19Ci19Ci0KLUBtZWRpYSBzY3JlZW4sIHByb2plY3Rpb24gewotCi10YWJsZSwgZmllbGRzZXQgewotICAgIG1hcmdpbjogMDsKLX0KLWgxIHsKLSAgICBjb2xvcjojMzMzOwotICAgIGZvbnQtc2l6ZTogMzRweDsKLSAgICBtYXJnaW46IDM2cHggMCAyN3B4OwotICAgIHBhZGRpbmc6MCAwIDEwcHg7Ci0gICAgZm9udC13ZWlnaHQ6MzAwOwotfQotaDEsIGgyIHsKLSAgICBsaW5lLWhlaWdodDogMzBweDsKLX0KLWgxLnNob3J0IHsKLSAgbWFyZ2luLXJpZ2h0OjMyMHB4OwotfQotaDEuc2hvcnQgewotICBtYXJnaW4tcmlnaHQ6MzIwcHg7Ci19Ci1oMS5zdXBlciB7Ci0gICAgZm9udC1zaXplOiAzN3B4OwotfQotaDIgewotICAgIGNvbG9yOiMzMzM7Ci0gICAgZm9udC1zaXplOiAyNnB4OwotICAgIG1hcmdpbjogMzJweCAwIDIwcHg7Ci0gICAgcGFkZGluZzowOwotICAgIGZvbnQtd2VpZ2h0OjMwMDsKLX0KLWgzIHsKLSAgICBjb2xvcjojMzMzOwotICAgIGZvbnQtc2l6ZTogMjFweDsKLSAgICBmb250LXdlaWdodDo0MDA7Ci0gICAgbWFyZ2luOjIxcHggMCAxNHB4IDA7Ci19Ci1oMywgaDQgewotICAgIGxpbmUtaGVpZ2h0OiAyMXB4OwotfQotaDQgewotICBmb250LXNpemU6IDE4cHg7Ci0gIG1hcmdpbjogMTJweCAwOwotICBmb250LXdlaWdodDo1MDA7Ci19Ci1oNSB7Ci0gIGZvbnQtc2l6ZTogMTRweDsKLX0KLWg1LCBoNiB7Ci0gIG1hcmdpbjogNXB4IDA7Ci19Ci1oNiB7Ci0gIGZvbnQtc2l6ZTogMTJweDsKLX0KLQotCi0KLWhyIHsgLyogYXBwbGllZCB0byB0aGUgYm90dG9tIG9mIGgyIGVsZW1lbnRzICovCi0gIGhlaWdodDogMXB4OwotICBtYXJnaW46IDVweCAwIDIwcHg7Ci0gIGJvcmRlcjogMDsKLSAgYmFja2dyb3VuZDogI2NjYzsKLX0KLXAsIHByZSwgdGFibGUsIGZvcm0gewotICAgIG1hcmdpbjogMCAwIDE1cHg7Ci19Ci1zbWFsbCB7Ci0gIGZvbnQtc2l6ZTogMTEuNXB4OwotICBjb2xvcjogIzAwMDsKLX0KLXVsLCBvbCB7Ci0gICAgbWFyZ2luOiAwIDAgMTVweCAxOHB4OwotICAgIHBhZGRpbmc6IDA7Ci19Ci1bZGlyPSdydGwnXSB1bCwgW2Rpcj0ncnRsJ10gb2wgewotICAgIG1hcmdpbjogMTBweCAzMHB4IDEwcHggMTBweDsKLX0KLXVsIHVsLCB1bCBvbCwgb2wgdWwsIG9sIG9sIHsKLSAgICBtYXJnaW4tYm90dG9tOiAwOwotICAgIG1hcmdpbi10b3A6IDA7Ci19Ci1saSB7Ci0gIG1hcmdpbjowIDAgNXB4OwotfQotZHQgewotICBmb250LXdlaWdodDpib2xkOwotfQotZGQgewotICBtYXJnaW46MCAwIDEwcHggMzBweDsKLSAgcGFkZGluZzogNXB4OwotfQotZGQgcCwKLWRkIHByZSwKLWRkIHVsLAotZGQgb2wsCi1kZCBkbCB7Ci0gIG1hcmdpbjoxMHB4IDAgMDsKLX0KLWxpIHAsCi1saSBwcmUsCi1saSB1bCwKLWxpIG9sLAotbGkgZGwgewotICBtYXJnaW4tdG9wOjVweDsKLSAgbWFyZ2luLWJvdHRvbTo1cHg7Ci19Ci1wcmUgc3Ryb25nLCBwcmUgYiwgYSBzdHJvbmcsIGEgYiwgYSBjb2RlIHsKLSAgICBjb2xvcjogaW5oZXJpdDsKLX0KLXByZSwgY29kZSB7Ci0gICAgY29sb3I6ICMwNjA7Ci0gICAgZm9udDogMTNweC8xLjUgbW9ub3NwYWNlOwotfQotY29kZSB7Ci0gICAgZm9udC13ZWlnaHQ6Ym9sZDsKLSAgICBmb250OiAxM3B4LzE0cHggbW9ub3NwYWNlOwotfQotCi1sZWdlbmQgewotICAgIGRpc3BsYXk6IG5vbmU7Ci19Ci1hOmxpbmssIGE6dmlzaXRlZCB7Ci0gIGNvbG9yOiAjMjU4YWFmOwotICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci1hOmZvY3VzLCBhOmhvdmVyLCBhOmFjdGl2ZSB7Ci0gIGNvbG9yOiAjMzNCNUU1OwotICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci1zdHJvbmcsIGIgewotICBmb250LXdlaWdodDpib2xkOwotICBjb2xvcjogIzIyMjsKLX0KLXRhYmxlIHsKLSAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsKLSAgYm9yZGVyLXNwYWNpbmc6IDA7Ci0gIGJvcmRlcjowOwotICBtYXJnaW46IC41ZW0gMWVtIDFlbSAwOwotICB3aWR0aDoxMDAlOyAvKiBjb25zaXN0ZW50IHRhYmxlIHdpZHRoczsgd2l0aGluIElFJ3MgcXVpcmtzICovCi0gIGJhY2tncm91bmQtY29sb3I6I2Y3ZjdmNzsKLX0KLXRoLCB0ZCB7Ci0gIHBhZGRpbmc6IDRweCAxMnB4OwotICB2ZXJ0aWNhbC1hbGlnbjogdG9wOwotICB0ZXh0LWFsaWduOiBsZWZ0OwotfQotdGQgewotICBiYWNrZ3JvdW5kLWNvbG9yOmluaGVyaXQ7Ci0gIGJvcmRlcjpzb2xpZCAxcHggI0RERDsKLX0KLXRkICo6bGFzdC1jaGlsZCB7Ci0gIG1hcmdpbi1ib3R0b206MDsKLX0KLXRoIHsKLSAgYmFja2dyb3VuZC1jb2xvcjogIzk5OTsKLSAgY29sb3I6ICNmZmY7Ci0gIGJvcmRlcjpzb2xpZCAxcHggI0RERDsKLSAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKLX0KLXRyOmZpcnN0LW9mLXR5cGUgdGg6Zmlyc3Qtb2YtdHlwZTplbXB0eSB7Ci0gICAgdmlzaWJpbGl0eTogaGlkZGVuOwotfQotCi0vKiBvcGNvZGVzIHRhYmxlICovCi0KLXRhYmxlLmluc3RydWMgdGQ6Zmlyc3QtY2hpbGQgewotICAgIHdpZHRoOiAxMiU7Ci19Ci0KLXRhYmxlLmluc3RydWMgdGQ6Zmlyc3QtY2hpbGQgKyB0ZCB7Ci0gICAgd2lkdGg6IDIzJTsKLX0KLQotdGFibGUuaW5zdHJ1YyB0ZDpmaXJzdC1jaGlsZCArIHRkICsgdGQgewotICAgIHdpZHRoOiAyOCU7Ci19Ci0KLXRhYmxlLmluc3RydWMgdGQ6Zmlyc3QtY2hpbGQgKyB0ZCArIHRkICsgdGQgewotICAgIHdpZHRoOiAzNyU7Ci19Ci0KLS8qIHN1cHBsZW1lbnRhbCBvcGNvZGUgZm9ybWF0IHRhYmxlICovCi0KLXRhYmxlLnN1cHBsZW1lbnQgdGQ6Zmlyc3QtY2hpbGQgewotICAgIHdpZHRoOiAyMCU7Ci19Ci0KLXRhYmxlLnN1cHBsZW1lbnQgdGQ6Zmlyc3QtY2hpbGQgKyB0ZCB7Ci0gICAgd2lkdGg6IDIwJTsKLX0KLQotdGFibGUuc3VwcGxlbWVudCB0ZDpmaXJzdC1jaGlsZCArIHRkICsgdGQgewotICAgIHdpZHRoOiA2MCU7Ci19Ci0KLS8qIG1hdGggZGV0YWlscyB0YWJsZSAqLwotCi10YWJsZS5tYXRoIHRkOmZpcnN0LWNoaWxkIHsKLSAgICB3aWR0aDogMTAlOwotfQotCi10YWJsZS5tYXRoIHRkOmZpcnN0LWNoaWxkICsgdGQgewotICAgIHdpZHRoOiAzMCU7Ci19Ci0KLXRhYmxlLm1hdGggdGQ6Zmlyc3QtY2hpbGQgKyB0ZCArIHRkIHsKLSAgICB3aWR0aDogNjAlOwotfQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotRm9vdGVyCi0qLwotLmxpbmUgewotICAgIGNsZWFyOiBib3RoOwotICAgIGJhY2tncm91bmQ6ICNhY2JjMDA7Ci0gICAgYmFja2dyb3VuZDogLW1vei1saW5lYXItZ3JhZGllbnQodG9wLCAjYWNiYzAwIDAsICNhY2JjMDAgNTAlLCAjYmRkZTAwIDUwJSwgI2JkZGUwMCAxMDAlKTsKLSAgICBiYWNrZ3JvdW5kOiAtd2Via2l0LWdyYWRpZW50KGxpbmVhciwgbGVmdCB0b3AsIGxlZnQgYm90dG9tLCBjb2xvci1zdG9wKDAsICNhY2JjMDApLAotY29sb3Itc3RvcCg1MCUsICNhY2JjMDApLCBjb2xvci1zdG9wKDUwJSwgI2JkZGUwMCksIGNvbG9yLXN0b3AoMTAwJSwgI2JkZGUwMCkpOwotICAgIGJhY2tncm91bmQ6IC13ZWJraXQtbGluZWFyLWdyYWRpZW50KHRvcCwgI2FjYmMwMCAwLCAjYWNiYzAwIDUwJSwgI2JkZGUwMCA1MCUsICNiZGRlMDAgMTAwJSk7Ci0gICAgYmFja2dyb3VuZDogLW8tbGluZWFyLWdyYWRpZW50KHRvcCwgI2FjYmMwMCAwLCAjYWNiYzAwIDUwJSwgI2JkZGUwMCA1MCUsICNiZGRlMDAgMTAwJSk7Ci0gICAgYmFja2dyb3VuZDogLW1zLWxpbmVhci1ncmFkaWVudCh0b3AsICNhY2JjMDAgMCwgI2FjYmMwMCA1MCUsICNiZGRlMDAgNTAlLCAjYmRkZTAwIDEwMCUpOwotICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCh0b3AsICNhY2JjMDAgMCwgI2FjYmMwMCA1MCUsICNiZGRlMDAgNTAlLCAjYmRkZTAwIDEwMCUpOwotICAgIGhlaWdodDogMnB4OwotICAgIG1hcmdpbi10b3A6IDE1MHB4OwotICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKLSAgICB6LWluZGV4OiAxMTsKLX0KLSNmb290ZXIgewotICAgIGZvbnQtc2l6ZToxMXB4OwotICAgIGNsZWFyOiBib3RoOwotICAgIGNvbG9yOiAjOTk5OwotICAgIHBhZGRpbmc6IDE1cHggMDsKLSAgICBtYXJnaW4tdG9wOjEwcHg7Ci0gICAgd2lkdGg6YXV0bzsKLX0KLSNmb290ZXItbG9jYWwgdWwgewotICBsaXN0LXN0eWxlOiBub25lOwotICBtYXJnaW46IDVweCAwIDMwcHggMDsKLX0KLSNmb290ZXItbG9jYWwgbGkgewotICAgIGRpc3BsYXk6IGlubGluZTsKLX0KLSNmb290ZXItbG9jYWwgbGkrbGk6YmVmb3JlIHsKLSAgICBjb250ZW50OiAnfCc7Ci0gICAgcGFkZGluZzogMCAzcHg7Ci0gIGNvbG9yOiAjZTVlNWU1OwotfQotI2Zvb3Rlci1nbG9iYWwgewotICAgIHBhZGRpbmc6IDEwcHggMTVweDsKLSAgYmFja2dyb3VuZDogI2Y1ZjVmNTsKLX0KLSNmb290ZXItZ2xvYmFsIHsKLSAgICBib3JkZXItdG9wOiAxcHggc29saWQgI2ViZWJlYjsKLSAgICBmb250LXNpemU6IDExLjVweDsKLSAgICBsaW5lLWhlaWdodDogMS44OwotICAgIGxpc3Qtc3R5bGU6IG5vbmU7Ci19Ci0jZm9vdGVyLWdsb2JhbCB1bCB7Ci0gICAgbWFyZ2luOiAwOwotfQotI2Zvb3Rlci1nbG9iYWwgbGkgewotICAgIGRpc3BsYXk6IGlubGluZTsKLSAgICBmb250LXdlaWdodDogYm9sZDsKLX0KLSNmb290ZXItZ2xvYmFsIGxpK2xpOmJlZm9yZSB7Ci0gICAgY29udGVudDogJ8KsPyc7Ci0gICAgcGFkZGluZzogMCAzcHg7Ci19Ci0qIGh0bWwgI2Zvb3Rlci1nbG9iYWwgbGkgewotICAgIG1hcmdpbjogMCAxM3B4IDAgMDsKLX0KLSogW2Rpcj0ncnRsJ10gI2Zvb3Rlci1nbG9iYWwgbGkgewotICAgIG1hcmdpbjogMCAwIDAgMTNweDsKLX0KLSoraHRtbCAjZm9vdGVyLWdsb2JhbCBsaSB7Ci0gICAgbWFyZ2luOiAwIDEzcHggMCAwOwotfQotKitbZGlyPSdydGwnXSAjZm9vdGVyLWdsb2JhbCBsaSB7Ci0gICAgbWFyZ2luOiAwIDAgMCAxM3B4OwotfQotI2Zvb3Rlci1nbG9iYWwgbGkgYSB7Ci0gICAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKLX0KLS5sb2NhbGVzIHsKLSAgbWFyZ2luOiAxMHB4IDAgMCAwcHg7Ci19Ci1bZGlyPSdydGwnXSAubG9jYWxlcyB7Ci0gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogcmlnaHQgY2VudGVyOwotICAgIGZsb2F0OiBsZWZ0OwotICAgIHBhZGRpbmc6IDAgMjRweCAwIDA7Ci19Ci0ubG9jYWxlcyBmb3JtIHsKLSAgICBtYXJnaW46IDA7ICAKLX0KLS5sb2NhbGVzIHNlbGVjdCwgLnNpdGVzIHNlbGVjdCB7Ci0gIGxpbmUtaGVpZ2h0OiAzLjA4OwotICBtYXJnaW46IDBweCAwOwotICBib3JkZXI6IHNvbGlkIDFweCAjRUJFQkVCOwotICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7Ci0gIGJhY2tncm91bmQ6IHdoaXRlIHVybCgnLi4vaW1hZ2VzL2Fycm93cy11cC1kb3duLnBuZycpIHJpZ2h0IGNlbnRlciBuby1yZXBlYXQ7Ci0gIGhlaWdodDogMzBweDsKLSAgY29sb3I6ICMyMjI7Ci0gIGxpbmUtaGVpZ2h0OiBub3JtYWw7Ci0gIHBhZGRpbmc6IDVweDsKLSAgd2lkdGg6IDIzMHB4OwotfQotfQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgUHJpbnQgT25seQotICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLUBtZWRpYSBwcmludCB7Ci0gIC8qIGNvbmZpZ3VyZSBwcmludGVkIHBhZ2UgKi8KLSAgQHBhZ2UgewotICAgICAgbWFyZ2luOiAwLjc1aW4gMWluOwotICAgICAgd2lkb3dzOiA0OwotICAgICAgb3JwaGFuczogNDsKLSAgfQotCi0gIC8qIHJlc2V0IHNwYWNpbmcgbWV0cmljcyAqLwotICBodG1sLCBib2R5LCAud3JhcCB7Ci0gICAgICBtYXJnaW46IDAgIWltcG9ydGFudDsKLSAgICAgIHBhZGRpbmc6IDAgIWltcG9ydGFudDsKLSAgICAgIHdpZHRoOiBhdXRvICFpbXBvcnRhbnQ7Ci0gIH0KLQotICAvKiBsZWF2ZSBlbm91Z2ggc3BhY2Ugb24gdGhlIGxlZnQgZm9yIGJ1bGxldHMgKi8KLSAgYm9keSB7Ci0gICAgICBwYWRkaW5nLWxlZnQ6IDIwcHggIWltcG9ydGFudDsKLSAgfQotICAjZG9jLWNvbCB7Ci0gICAgICBtYXJnaW4tbGVmdDogMDsKLSAgfQotCi0gIC8qIGhpZGUgYSBidW5jaCBvZiBub24tY29udGVudCBlbGVtZW50cyAqLwotICAjaGVhZGVyLCAjZm9vdGVyLCAjbmF2LXgsICNzaWRlLW5hdiwKLSAgLnRyYWluaW5nLW5hdi10b3AsIC50cmFpbmluZy1uYXYtYm90dG9tLAotICAjZG9jLWNvbCAuY29udGVudC1mb290ZXIsCi0gIC5uYXYteCwgLm5hdi15LAotICAucGFnaW5nLWxpbmtzLAotICBhLnRvdG9wIHsKLSAgICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKLSAgfQotCi0gIC8qIHJlbW92ZSBleHRyYSBzcGFjZSBhYm92ZSBwYWdlIHRpdGxlcyAqLwotICAjZG9jLWNvbCAuY29udGVudC1oZWFkZXIgewotICAgICAgbWFyZ2luLXRvcDogMDsKLSAgfQotCi0gIC8qIGJ1bXAgdXAgc3BhY2luZyBhYm92ZSBzdWJoZWFkaW5ncyAqLwotICBoMiB7Ci0gICAgICBtYXJnaW4tdG9wOiA0MHB4ICFpbXBvcnRhbnQ7Ci0gIH0KLQotICAvKiBwcmludCBsaW5rIFVSTHMgd2hlcmUgcG9zc2libGUgYW5kIGdpdmUgbGlua3MgZGVmYXVsdCB0ZXh0IGNvbG9yICovCi0gIHAgYTphZnRlciB7Ci0gICAgICBjb250ZW50OiAiICgiIGF0dHIoaHJlZikgIikiOwotICAgICAgZm9udC1zaXplOiA4MCU7Ci0gIH0KLSAgcCBhIHsKLSAgICAgIHdvcmQtd3JhcDogYnJlYWstd29yZDsKLSAgfQotICBhIHsKLSAgICAgIGNvbG9yOiBpbmhlcml0OwotICB9Ci0KLSAgLyogc3ludGF4IGhpZ2hsaWdodGluZyBydWxlcyAqLwotICAuc3RyIHsgY29sb3I6ICMwNjA7IH0KLSAgLmt3ZCB7IGNvbG9yOiAjMDA2OyBmb250LXdlaWdodDogYm9sZDsgfQotICAuY29tIHsgY29sb3I6ICM2MDA7IGZvbnQtc3R5bGU6IGl0YWxpYzsgfQotICAudHlwIHsgY29sb3I6ICM0MDQ7IGZvbnQtd2VpZ2h0OiBib2xkOyB9Ci0gIC5saXQgeyBjb2xvcjogIzA0NDsgfQotICAucHVuIHsgY29sb3I6ICM0NDA7IH0KLSAgLnBsbiB7IGNvbG9yOiAjMDAwOyB9Ci0gIC50YWcgeyBjb2xvcjogIzAwNjsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0KLSAgLmF0biB7IGNvbG9yOiAjNDA0OyB9Ci0gIC5hdHYgeyBjb2xvcjogIzA2MDsgfQotfQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgQ29sdW1ucwotICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLQotQG1lZGlhIHNjcmVlbiwgcHJvamVjdGlvbiwgcHJpbnQgewotLmZ1bGwgewotICBwYWRkaW5nOiAyLjVlbSAwOwotICBib3JkZXItdG9wOiBzb2xpZCAxcHggI2RkZDsKLSAgYm9yZGVyLWJvdHRvbTogc29saWQgMXB4ICNkZGQ7Ci0gIGJhY2tncm91bmQ6ICNmN2Y3Zjc7ICAKLX0KLS53cmFwIHsKLSAgbWFyZ2luOiAwIGF1dG87Ci0gIHdpZHRoOiA5NDBweDsKLSAgY2xlYXI6IGJvdGg7Ci19Ci0uY29scyB7Ci0gICAgaGVpZ2h0OiAxJTsKLSAgICBtYXJnaW46IDAgLTEuNTMzNzQyMzMxMjg4MzQzNTU4MjgyJTsKLSAgICB3aWR0aDogMTAzLjA2NzQ4NDY2MjU3NjY5JX0KLSoraHRtbCAuY29scyB7Ci0gICAgbWFyZ2luLWJvdHRvbTogMjBweDsKLX0KLS5jb2xzOmFmdGVyIHsKLSAgICBjbGVhcjogYm90aDsKLSAgICBjb250ZW50OiAnICc7Ci0gICAgZGlzcGxheTogYmxvY2s7Ci0gICAgaGVpZ2h0OiAwOwotICAgIHZpc2liaWxpdHk6IGhpZGRlbjsKLX0KLS5jb2wtMSwgLmNvbC0yLCAuY29sLTMsIC5jb2wtNCwgLmNvbC01LCAuY29sLTYsIC5jb2wtNywgLmNvbC04LCAuY29sLTksIC5jb2wtMTAsIC5jb2wtMTEsIC5jb2wtMTIsCi0uY29sLTEzLCAuY29sLTE0LCAuY29sLTE1LCAuY29sLTE2IHsKLSAgICBkaXNwbGF5OiBpbmxpbmU7Ci0gIGZsb2F0OiBsZWZ0OwotICBtYXJnaW4tbGVmdDogMTBweDsKLSAgbWFyZ2luLXJpZ2h0OiAxMHB4OwotfQotLyoKLSogaHRtbCAuY29sLTEsICogaHRtbCAuY29sLTIsICogaHRtbCAuY29sLTMsICogaHRtbCAuY29sLTQsICogaHRtbCAuY29sLTUsICogaHRtbCAuY29sLTYsICogaHRtbAotLmNvbC03LCAqIGh0bWwgLmNvbC04LCAqIGh0bWwgLmNvbC05LCAqIGh0bWwgLmNvbC0xMCwgKiBodG1sIC5jb2wtMTEsICogaHRtbCAuY29sLTEyICB7Ci0gICAgbWFyZ2luOiAwOwotICAgIHBhZGRpbmc6IDAgMS40JSAyMHB4OwotfQotW2Rpcj0ncnRsJ10gLmNvbC0xLCBbZGlyPSdydGwnXSAuY29sLTIsIFtkaXI9J3J0bCddIC5jb2wtMywgW2Rpcj0ncnRsJ10gLmNvbC00LCBbZGlyPSdydGwnXSAuY29sLTUsCi1bZGlyPSdydGwnXSAuY29sLTYsIFtkaXI9J3J0bCddIC5jb2wtNywgW2Rpcj0ncnRsJ10gLmNvbC04LCBbZGlyPSdydGwnXSAuY29sLTksIFtkaXI9J3J0bCddIC5jb2wtMTAsCi1bZGlyPSdydGwnXSAuY29sLTExLCBbZGlyPSdydGwnXSAuY29sLTEyIHsKLSAgICBmbG9hdDogcmlnaHQ7Ci19Ci0qLwotLmNvbC0xIHsgd2lkdGg6IDQwcHggfQotLmNvbC0yIHsgd2lkdGg6IDEwMHB4IH0KLS5jb2wtMyB7IHdpZHRoOiAxNjBweCB9Ci0uY29sLTQgeyB3aWR0aDogMjIwcHggfQotLmNvbC01IHsgd2lkdGg6IDI4MHB4IH0KLS5jb2wtNiB7IHdpZHRoOiAzNDBweCB9Ci0uY29sLTcgeyB3aWR0aDogNDAwcHggfQotLmNvbC04IHsgd2lkdGg6IDQ2MHB4IH0KLS5jb2wtOSB7IHdpZHRoOiA1MjBweCB9Ci0uY29sLTEwIHsgd2lkdGg6IDU4MHB4IH0KLS5jb2wtMTEgeyB3aWR0aDogNjQwcHggfQotLmNvbC0xMiB7IHdpZHRoOiA3MDBweCB9Ci0uY29sLTEzIHsgd2lkdGg6IDc2MHB4IH0KLS5jb2wtMTQgeyB3aWR0aDogODIwcHggfQotLmNvbC0xNSB7IHdpZHRoOiA4ODBweCB9Ci0uY29sLTE2IHsgd2lkdGg6IDk0MHB4IH0KLX0KLQotLmNvbC1yaWdodCB7Ci0gIG1hcmdpbi1yaWdodDowcHg7Ci19Ci0KLUBtZWRpYSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6NzcycHgpIHsKLS5jb2wtNSwgLmNvbC02LCAuY29sLTcgewotICAgIGNsZWFyOiBib3RoOwotICAgIHdpZHRoOiA5Ny4wMjM4MDk2JX0KLX0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgIExheW91dAotICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLUBtZWRpYSBzY3JlZW4sIHByb2plY3Rpb24sIHByaW50IHsKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUhlYWRlciwgTG9naW4sIE5hdi1YLCBTZWFyY2gKLSovCi0jaGVhZGVyIHsKLSAgcGFkZGluZzogMi4yZW0gMCAwLjJlbSAwOwotfQotI2hlYWRlcjpiZWZvcmUsICNoZWFkZXI6YWZ0ZXIgewotICBjb250ZW50OiAiIjsKLSAgZGlzcGxheTogdGFibGU7Ci0gIGNsZWFyOiBib3RoCi19Ci0ubG9nbywgLm5hdi14IHsKLSAgICBmbG9hdDogbGVmdDsKLX0KLS5uYXYteCB7Ci0gICAgbWFyZ2luLXRvcDogLTJweDsKLSAgbGlzdC1zdHlsZS10eXBlOiBub25lOwotfQotLm5hdi14IGEgewotICAgIGNvbG9yOiAjMzMzOwotICAgIGZvbnQtc2l6ZTogMTZweDsKLX0KLS5kZXNpZ24gYS5zZWxlY3RlZCB7Ci0gICAgY29sb3I6ICMzM2I1ZTU7Ci19Ci0uZGV2ZWxvcCBhLnNlbGVjdGVkIHsKLSAgICBjb2xvcjogI0Y4MDsKLX0KLS5kaXN0cmlidXRlIGEuc2VsZWN0ZWQgewotICAgIGNvbG9yOiAjOUMwOwotfQotLnNvdXJjZSBhLnNlbGVjdGVkIHsKLSAgICBjb2xvcjogIzMzYjVlNTsKLX0KLS5kZXZpY2VzIGEuc2VsZWN0ZWQgewotICAgIGNvbG9yOiAjRjgwOwotfQotLnNlY3VyaXR5IGEuc2VsZWN0ZWQgewotICAgIGNvbG9yOiAjOUMwOwotfQotLmNvbXBhdGliaWxpdHkgYS5zZWxlY3RlZCB7Ci0gICAgY29sb3I6ICM5OTMzQ0M7Ci19Ci0KLQotLm5hdi14IGxpIHsKLSAgICBkaXNwbGF5OiBpbmxpbmU7Ci0gICAgbWFyZ2luLXJpZ2h0OiA0NXB4OwotfQotLnNlYXJjaCB7Ci0gIGZsb2F0OiByaWdodDsKLSAgcG9zaXRpb246IHJlbGF0aXZlOwotICB3aWR0aDogMjIwcHgKLX0KLS5zZWFyY2ggLmJvdHRvbSwgLnNlYXJjaCAubGVmdCwgLnNlYXJjaCAucmlnaHQgewotICBwb3NpdGlvbjogYWJzb2x1dGU7Ci0gIGJhY2tncm91bmQtY29sb3I6ICNhM2EzYTM7Ci19Ci0uc2VhcmNoIC5ib3R0b20gewotICB3aWR0aDogMjIwcHg7Ci0gIGhlaWdodDogMXB4OwotICB0b3A6IDI0cHg7Ci0gIGxlZnQ6IDAKLX0KLS5zZWFyY2ggLmxlZnQsIC5zZWFyY2ggLnJpZ2h0IHsgCi0gIGhlaWdodDogNXB4OwotICB3aWR0aDogMXB4Ci19Ci0uc2VhcmNoIC5sZWZ0IHsgdG9wOiAxOXB4OyBsZWZ0OiAwIH0KLS5zZWFyY2ggLnJpZ2h0IHsgdG9wOiAxOXB4OyByaWdodDogMCB9Ci0uc2VhcmNoIGZvcm0gewotICBmbG9hdDogbGVmdDsKLSAgbWFyZ2luLXRvcDogMnB4OwotICB3aWR0aDogaW5oZXJpdDsKLX0KLS5zZWFyY2ggLmNsb3NlLAotI3BsYXllci1mcmFtZSAuY2xvc2UgewotICBwb3NpdGlvbjogYWJzb2x1dGU7Ci0gIHJpZ2h0OiA4cHg7Ci0gIGJvdHRvbTogNHB4OwotICB3aWR0aDogMTZweDsKLSAgaGVpZ2h0OiAxNnB4OwotICBtYXJnaW46IDA7Ci0gIHRleHQtaW5kZW50OiAtMTAwMGVtOwotICBiYWNrZ3JvdW5kOiB1cmwoLi4vaW1hZ2VzL2Nsb3NlLnBuZykgbm8tcmVwZWF0IDAgMDsKLSAgei1pbmRleDo5OTk5OwotfQotLnNlYXJjaCAuY2xvc2U6aG92ZXIsIC5zZWFyY2ggLmNsb3NlOmZvY3VzLAotI3BsYXllci1mcmFtZSAuY2xvc2U6aG92ZXIsICNwbGF5ZXItZnJhbWUgLmNsb3NlOmZvY3VzIHsKLSAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE2cHggMDsKLSAgY3Vyc29yOnBvaW50ZXI7Ci19Ci0jcGxheWVyLWZyYW1lIC5jbG9zZSB7Ci0gIHRvcDogNnB4OwotfQotLnNlYXJjaCBmb3JtIGlucHV0IHsKLSAgY29sb3I6ICM5OTk7Ci0gIGZvbnQtc2l6ZTogMWVtOwotICB3aWR0aDogaW5oZXJpdDsKLSAgYm9yZGVyOiBub25lOwotICBtYXJnaW46IDA7Ci0gIHBhZGRpbmc6MCAwIDAgNnB4OwotICB6LWluZGV4OiAxNTAwOwotICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudAotfQotLnNlYXJjaDpob3ZlciAuYm90dG9tLCAuc2VhcmNoOmhvdmVyIC5sZWZ0LCAuc2VhcmNoOmhvdmVyIC5yaWdodCB7Ci0gIGJhY2tncm91bmQtY29sb3I6ICMzM2I1ZTU7Ci19Ci0uc2VhcmNoOmhvdmVyIC5pY29uIHsKLSAgYmFja2dyb3VuZC1wb3NpdGlvbjogLThweCAwCi19Ci0uc2VhcmNoIGZvcm0gaW5wdXQ6Zm9jdXMgewotICBjb2xvcjogIzIyMjsKLSAgZm9udC13ZWlnaHQ6IGJvbGQ7Ci0gIG91dGxpbmU6MDsKLX0KLS8qIFNlYXJjaCBEcm9wZG93biAqLwotLnNlYXJjaC1kcm9wZG93biB7Ci0gIHBhZGRpbmc6IDE1cHg7Ci0gIHdpZHRoOiAxOTJweDsKLSAgYm9yZGVyOiBzb2xpZCAxcHggI2M1YzVjNTsKLSAgYmFja2dyb3VuZDogI2ZmZjsKLSAgcG9zaXRpb246IGFic29sdXRlOwotICB0b3A6IDM1cHg7Ci0gIGxlZnQ6IDA7Ci0gIC1tb3otYm94LXNoYWRvdzogMCAwIDEwcHggcmdiYSgwLDAsMCwwLjIpOwotICAtd2Via2l0LWJveC1zaGFkb3c6IDAgMCAxMHB4IHJnYmEoMCwwLDAsMC4yKTsKLSAgYm94LXNoYWRvdzogMCAgMCAxMHB4IHJnYmEoMCwwLDAsMC4yKQotfQotLnNlYXJjaC1kcm9wZG93biB1bCwgLnNlYXJjaC1kcm9wZG93biB1bCBsaSB7Ci0gIGxpc3Qtc3R5bGUtdHlwZTogbm9uZTsKLSAgbWFyZ2luOiAwOwotICBwYWRkaW5nOiAwCi19Ci0uc2VhcmNoLWRyb3Bkb3duIHVsIGxpIHsKLSAgY2xlYXI6IGJvdGggCi19Ci0uc2VhcmNoLWRyb3Bkb3duIGltZyB7Ci0gIGZsb2F0OiBsZWZ0OwotICBtYXJnaW46IDAgMTBweCAxMHB4IDAKLX0KLS5zZWFyY2gtZHJvcGRvd24gaDYgewotICBjb2xvcjogIzIyMjsKLSAgbWFyZ2luOiAwOwotICBsaW5lLWhlaWdodDogbm9ybWFsCi19Ci0uc2VhcmNoLWRyb3Bkb3duIC5kZXNjIHsKLSAgY29sb3I6ICM5OTk7Ci0gIGZvbnQtc2l6ZTogMTEuNXB4OwotICBsaW5lLWhlaWdodDogbm9ybWFsOwotICBtYXJnaW46IDA7Ci19Ci0uc2VhcmNoLWRyb3Bkb3duIGxpIGE6aG92ZXIgaDYsIC5zZWFyY2gtZHJvcGRvd24gbGkgYTpob3ZlciAuZGVzYyB7Ci0gIGNvbG9yOiAjMzNiNWU1Ci19Ci0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQnV0dG9ucwotKi8KLS5idXR0b24sIGEuYnV0dG9uLCAuYnV0dG9uLXNlY29uZGFyeSwgYS5idXR0b24tc2Vjb25kYXJ5IHsKLSAgYm9yZGVyLWltYWdlOiBpbml0aWFsOwotICAgIC13ZWJraXQtYm9yZGVyLXJhZGl1czogMnB4OwotICAgIC1tb3otYm9yZGVyLXJhZGl1czogMnB4OwotICAgIGJvcmRlci1yYWRpdXM6IDJweDsKLSAgICBjdXJzb3I6IHBvaW50ZXI7Ci19Ci0uYnV0dG9uLCBhLmJ1dHRvbiB7Ci0gICAgZGlzcGxheTppbmxpbmUtYmxvY2s7Ci0gICAgYmFja2dyb3VuZC1jb2xvcjogIzA5YzsKLSAgICBiYWNrZ3JvdW5kLWltYWdlOiAtd2Via2l0LWdyYWRpZW50KGxpbmVhciwgbGVmdCB0b3AsIGxlZnQgYm90dG9tLCBmcm9tKCMyZmFkZGIpLCB0bygjMDljKSk7Ci0gICAgYmFja2dyb3VuZC1pbWFnZTogLXdlYmtpdC1saW5lYXItZ3JhZGllbnQodG9wLCAjMmZhZGRiLCAjMDljKTsKLSAgICBiYWNrZ3JvdW5kLWltYWdlOiAtbW96LWxpbmVhci1ncmFkaWVudCh0b3AsICMyZmFkZGIsICMwOWMpOwotICAgIGJhY2tncm91bmQtaW1hZ2U6IC1tcy1saW5lYXItZ3JhZGllbnQodG9wLCAjMmZhZGRiLCAjMDljKTsKLSAgICBiYWNrZ3JvdW5kLWltYWdlOiAtby1saW5lYXItZ3JhZGllbnQodG9wLCAjMmZhZGRiLCAjMDljKTsKLSAgICBiYWNrZ3JvdW5kLWltYWdlOiBsaW5lYXItZ3JhZGllbnQodG9wLCAjMmZhZGRiLCAjMDljKTsKLSAgICBmaWx0ZXI6IHByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5ncmFkaWVudChzdGFydENvbG9yU3RyPScjMmZhZGRiJywgRW5kQ29sb3JTdHI9JyMwMDk5Y2MnLEdyYWRpZW50VHlwZT0wKTsKLSAgICBib3JkZXI6IDFweCBzb2xpZCAjMzk5MGFiOwotICAgIGNvbG9yOiAjZmZmOwotfQotLmJ1dHRvbi1zZWNvbmRhcnksIGEuYnV0dG9uLXNlY29uZGFyeSB7Ci0gICAgYmFja2dyb3VuZC1jb2xvcjogI2YzZjNmMzsKLSAgICBib3JkZXI6IDFweCBzb2xpZCAjZGNkY2RjOwotICAgIGNvbG9yOiAjNDQ0OwotfQotYS5idXR0b24sIGEuYnV0dG9uOnZpc2l0ZWQsIGEuYnV0dG9uLXNlY29uZGFyeSwgYS5idXR0b24tc2Vjb25kYXJ5OnZpc2l0ZWQgewotICAgIG1hcmdpbi1yaWdodDogMTZweDsKLSAgIGZvbnQtd2VpZ2h0OiA0MDA7Ci0gICAgbWluLXdpZHRoOiA1NHB4OwotICAgIG91dGxpbmU6IDA7Ci0gICAgcGFkZGluZzogOHB4IDE1cHg7Ci0gICAgdGV4dC1hbGlnbjogY2VudGVyOwotfQotLmJ1dHRvbiwgLmJ1dHRvbi1zZWNvbmRhcnkgewotICAgIG1hcmdpbi1yaWdodDogMTZweDsKLSAgZm9udC13ZWlnaHQ6IDQwMDsKLSAgICBtaW4td2lkdGg6IDU0cHg7Ci0gICAgb3V0bGluZTogMDsKLSAgICBwYWRkaW5nOiAwIDE1cHg7Ci0gICAgdGV4dC1hbGlnbjogY2VudGVyOwotfQotLmJ1dHRvbjpob3ZlciwgYS5idXR0b246aG92ZXIgewotICAgIGJvcmRlci1jb2xvcjogIzA5YzsKLSAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjNGNhZGNiOwotICAgIGJhY2tncm91bmQtaW1hZ2U6IC13ZWJraXQtZ3JhZGllbnQobGluZWFyLCBsZWZ0IHRvcCwgbGVmdCBib3R0b20sIGZyb20oIzVkYmNkOSksIHRvKCM0Y2FkY2IpKTsKLSAgICBiYWNrZ3JvdW5kLWltYWdlOiAtd2Via2l0LWxpbmVhci1ncmFkaWVudCh0b3AsICM1ZGJjZDksICM0Y2FkY2IpOwotICAgIGJhY2tncm91bmQtaW1hZ2U6IC1tb3otbGluZWFyLWdyYWRpZW50KHRvcCwgIzVkYmNkOSwgIzRjYWRjYik7Ci0gICAgYmFja2dyb3VuZC1pbWFnZTogLW1zLWxpbmVhci1ncmFkaWVudCh0b3AsICM1ZGJjZDksICM0Y2FkY2IpOwotICAgIGJhY2tncm91bmQtaW1hZ2U6IC1vLWxpbmVhci1ncmFkaWVudCh0b3AsICM1ZGJjZDksICM0Y2FkY2IpOwotICAgIGJhY2tncm91bmQtaW1hZ2U6IGxpbmVhci1ncmFkaWVudCh0b3AsICM1ZGJjZDksICM0Y2FkY2IpOwotICAgIGZpbHRlcjogcHJvZ2lkOkRYSW1hZ2VUcmFuc2Zvcm0uTWljcm9zb2Z0LmdyYWRpZW50KHN0YXJ0Q29sb3JTdHI9JyM1ZGJjZDknLAotRW5kQ29sb3JTdHI9JyM0Y2FkY2InLEdyYWRpZW50VHlwZT0wKTsKLSAgICBjb2xvcjogI2ZmZiAhaW1wb3J0YW50OwotfQotLmJ1dHRvbjphY3RpdmUsIGEuYnV0dG9uOmFjdGl2ZSB7Ci0gICAgYmFja2dyb3VuZC1jb2xvcjogIzFlNzk5YTsKLSAgICBiYWNrZ3JvdW5kLWltYWdlOiBub25lOwotICAgIGJvcmRlci1jb2xvcjogIzMwYjdlNjsKLX0KLWEuYnV0dG9uLmJpZy5zdWJ0aXRsZSB7Ci0gIGxpbmUtaGVpZ2h0OjE4cHg7Ci19Ci0uYnV0dG9uLXNlY29uZGFyeTpob3ZlciwgYS5idXR0b24tc2Vjb25kYXJ5OmhvdmVyIHsKLSAgICBib3JkZXItY29sb3I6ICNkYmRiZGI7Ci0gICAgYmFja2dyb3VuZC1jb2xvcjogI2YzZjNmMzsKLSAgICBiYWNrZ3JvdW5kLWltYWdlOiAtd2Via2l0LWdyYWRpZW50KGxpbmVhciwgbGVmdCB0b3AsIGxlZnQgYm90dG9tLCBmcm9tKCNmOWY5ZjkpLCB0bygjZWNlY2VjKSk7Ci0gICAgYmFja2dyb3VuZC1pbWFnZTogLXdlYmtpdC1saW5lYXItZ3JhZGllbnQodG9wLCAjZjlmOWY5LCAjZWNlY2VjKTsKLSAgICBiYWNrZ3JvdW5kLWltYWdlOiAtbW96LWxpbmVhci1ncmFkaWVudCh0b3AsICNmOWY5ZjksICNlY2VjZWMpOwotICAgIGJhY2tncm91bmQtaW1hZ2U6IC1tcy1saW5lYXItZ3JhZGllbnQodG9wLCAjZjlmOWY5LCAjZWNlY2VjKTsKLSAgICBiYWNrZ3JvdW5kLWltYWdlOiAtby1saW5lYXItZ3JhZGllbnQodG9wLCAjZjlmOWY5LCAjZWNlY2VjKTsKLSAgICBiYWNrZ3JvdW5kLWltYWdlOiBsaW5lYXItZ3JhZGllbnQodG9wLCAjZjlmOWY5LCAjZWNlY2VjKTsKLSAgICBmaWx0ZXI6IHByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5ncmFkaWVudChzdGFydENvbG9yU3RyPScjZjlmOWY5JywKLUVuZENvbG9yU3RyPScjZWNlY2VjJyk7Ci0gICAgY29sb3I6ICMzM0I1RTUgIWltcG9ydGFudDsKLX0KLS5idXR0b24tc2Vjb25kYXJ5OmFjdGl2ZSwgYS5idXR0b24tc2Vjb25kYXJ5OmFjdGl2ZSB7Ci0gICBib3JkZXItY29sb3I6ICNkYWRhZGE7Ci0gIGJhY2tncm91bmQ6ICNlYmViZWI7IC8qIE9sZCBicm93c2VycyAqLwotICAvKiBJRTkgU1ZHLCBuZWVkcyBjb25kaXRpb25hbCBvdmVycmlkZSBvZiAnZmlsdGVyJyB0byAnbm9uZScgKi8KLSAgYmFja2dyb3VuZDoKLXVybChkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBEOTRiV3dnZG1WeWMybHZiajBpTVM0d0lpQS8KLVBnbzhjM1puSUhodGJHNXpQU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh5TURBd0wzTjJaeUlnZDJsa2RHZzlJakV3TUNVaUlHaGxhV2RvZEQwaU1UQXdKU0lnZG1sbGQwSnYKLWVEMGlNQ0F3SURFZ01TSWdjSEpsYzJWeWRtVkJjM0JsWTNSU1lYUnBiejBpYm05dVpTSSsKLUNpQWdQR3hwYm1WaGNrZHlZV1JwWlc1MElHbGtQU0puY21Ga0xYVmpaMmN0WjJWdVpYSmhkR1ZrSWlCbmNtRmthV1Z1ZEZWdWFYUnpQU0oxYzJWeVUzQmhZMlZQYmxWelpTSWcKLWVERTlJakFsSWlCNU1UMGlNQ1VpSUhneVBTSXdKU0lnZVRJOUlqRXdNQ1VpUGdvZ0lDQWdQSE4wYjNBZ2IyWm1jMlYwUFNJd0pTSWdjM1J2Y0MxamIyeHZjajBpSTJWaVpXSmwKLVlpSWdjM1J2Y0MxdmNHRmphWFI1UFNJeElpOCsKLUNpQWdJQ0E4YzNSdmNDQnZabVp6WlhROUlqRXdKU0lnYzNSdmNDMWpiMnh2Y2owaUkyWTVaamxtT1NJZ2MzUnZjQzF2Y0dGamFYUjVQU0l4SWk4KwotQ2lBZ0lDQThjM1J2Y0NCdlptWnpaWFE5SWpVd0pTSWdjM1J2Y0MxamIyeHZjajBpSTJaaFptRm1ZU0lnYzNSdmNDMXZjR0ZqYVhSNVBTSXhJaTgrCi1DaUFnSUNBOGMzUnZjQ0J2Wm1aelpYUTlJamt3SlNJZ2MzUnZjQzFqYjJ4dmNqMGlJMlk1WmpsbU9TSWdjM1J2Y0MxdmNHRmphWFI1UFNJeElpOCsKLUNpQWdJQ0E4YzNSdmNDQnZabVp6WlhROUlqRXdNQ1VpSUhOMGIzQXRZMjlzYjNJOUlpTm1ObVkyWmpZaUlITjBiM0F0YjNCaFkybDBlVDBpTVNJdlBnb2dJRHd2YkdsdVpXRnkKLVIzSmhaR2xsYm5RKwotQ2lBZ1BISmxZM1FnZUQwaU1DSWdlVDBpTUNJZ2QybGtkR2c5SWpFaUlHaGxhV2RvZEQwaU1TSWdabWxzYkQwaWRYSnNLQ05uY21Ga0xYVmpaMmN0WjJWdVpYSmhkR1ZrS1NJZwotTHo0S1BDOXpkbWMrKTsKLSAgYmFja2dyb3VuZDogLW1vei1saW5lYXItZ3JhZGllbnQodG9wLCAgI2ViZWJlYiAwJSwgI2Y5ZjlmOSA1JSwgI2ZhZmFmYSA1MCUsICNmOWY5ZjkgOTAlLAotI2ZmZmZmZiAxMDAlKTsgLyogRkYzLjYrICovCi0gIGJhY2tncm91bmQ6IC13ZWJraXQtZ3JhZGllbnQobGluZWFyLCBsZWZ0IHRvcCwgbGVmdCBib3R0b20sIGNvbG9yLXN0b3AoMCUsI2ViZWJlYiksCi1jb2xvci1zdG9wKDUlLCNmOWY5ZjkpLCBjb2xvci1zdG9wKDUwJSwjZmFmYWZhKSwgY29sb3Itc3RvcCg5MCUsI2Y5ZjlmOSksIGNvbG9yLXN0b3AoMTAwJSwjZmZmZmZmKSk7Ci0vKiBDaHJvbWUsU2FmYXJpNCsgKi8KLSAgYmFja2dyb3VuZDogLXdlYmtpdC1saW5lYXItZ3JhZGllbnQodG9wLCAgI2ViZWJlYiAwJSwjZjlmOWY5IDUlLCNmYWZhZmEgNTAlLCNmOWY5ZjkKLTkwJSwjZmZmZmZmIDEwMCUpOyAvKiBDaHJvbWUxMCssU2FmYXJpNS4xKyAqLwotICBiYWNrZ3JvdW5kOiAtby1saW5lYXItZ3JhZGllbnQodG9wLCAgI2ViZWJlYiAwJSwjZjlmOWY5IDUlLCNmYWZhZmEgNTAlLCNmOWY5ZjkgOTAlLCNmZmZmZmYKLTEwMCUpOyAvKiBPcGVyYSAxMS4xMCsgKi8KLSAgYmFja2dyb3VuZDogLW1zLWxpbmVhci1ncmFkaWVudCh0b3AsICAjZWJlYmViIDAlLCNmOWY5ZjkgNSUsI2ZhZmFmYSA1MCUsI2Y5ZjlmOSA5MCUsI2ZmZmZmZgotMTAwJSk7IC8qIElFMTArICovCi0gIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCh0b3AsICAjZWJlYmViIDAlLCNmOWY5ZjkgNSUsI2ZhZmFmYSA1MCUsI2Y5ZjlmOSA5MCUsI2ZmZmZmZgotMTAwJSk7IC8qIFczQyAqLwotICBmaWx0ZXI6IHByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5ncmFkaWVudCggc3RhcnRDb2xvcnN0cj0nI2ViZWJlYicsCi1lbmRDb2xvcnN0cj0nI2ZmZmZmZicsR3JhZGllbnRUeXBlPTAgKTsgLyogSUU2LTggKi8KLSAgLXdlYmtpdC1ib3gtc2hhZG93OiBpbnNldCAwcHggMHB4IDVweCAycHggcmdiYSgwLCAwLCAwLCAuMDUpOwotICAtbW96LWJveC1zaGFkb3c6IGluc2V0IDBweCAwcHggNXB4IDJweCByZ2JhKDAsIDAsIDAsIC4wNSk7Ci0gIGJveC1zaGFkb3c6IGluc2V0IDBweCAwcHggNXB4IDJweCByZ2JhKDAsIDAsIDAsIC4wNSk7IAotICBjb2xvcjogIzI1OEFBRiAhaW1wb3J0YW50OwotfQotLmJ1dHRvbi5iaWcgewotICBmb250LXNpemU6MjBweDsKLSAgZGlzcGxheTppbmxpbmUtYmxvY2s7Ci19Ci0uYnV0dG9uLmJpZyBzcGFuLnNtYWxsIHsKLSAgZm9udC1zaXplOjE0cHg7Ci19Ci0uYnV0dG9uLWNhcHRpb24gewotICBtYXJnaW4tdG9wOjEwcHg7Ci0gIGZvbnQtc2l6ZToxMnB4OwotICBmb250LXN0eWxlOml0YWxpYzsKLX0KLQotLmJ1dHRvbi5kaXNhYmxlZCwKLS5idXR0b24uZGlzYWJsZWQ6aG92ZXIsCi0uYnV0dG9uLmRpc2FibGVkOmFjdGl2ZSB7Ci0gIGJhY2tncm91bmQ6I2ViZWJlYjsKLSAgY29sb3I6Izk5OSAhaW1wb3J0YW50OwotICBib3JkZXItY29sb3I6Izk5OTsKLSAgY3Vyc29yOmRlZmF1bHQ7Ci19Ci0KLS50cmFpbmluZy1uYXYtdG9wIGEuYnV0dG9uLXNlY29uZGFyeSwKLS50cmFpbmluZy1uYXYtYm90dG9tIGEuYnV0dG9uLXNlY29uZGFyeSB7Ci0gIGRpc3BsYXk6YmxvY2s7Ci0gIGZsb2F0OmxlZnQ7Ci0gIG1hcmdpbjowOwotICB3aWR0aDoxMzBweDsKLSAgdGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlOwotICBmb250LXdlaWdodDpib2xkOwotICAKLSAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjNmM2YzOwotICAgIGJhY2tncm91bmQtaW1hZ2U6IC13ZWJraXQtZ3JhZGllbnQobGluZWFyLCBsZWZ0IHRvcCwgbGVmdCBib3R0b20sIGZyb20oI2Y5ZjlmOSksIHRvKCNlY2VjZWMpKTsKLSAgICBiYWNrZ3JvdW5kLWltYWdlOiAtd2Via2l0LWxpbmVhci1ncmFkaWVudCh0b3AsICNmOWY5ZjksICNlY2VjZWMpOwotICAgIGJhY2tncm91bmQtaW1hZ2U6IC1tb3otbGluZWFyLWdyYWRpZW50KHRvcCwgI2Y5ZjlmOSwgI2VjZWNlYyk7Ci0gICAgYmFja2dyb3VuZC1pbWFnZTogLW1zLWxpbmVhci1ncmFkaWVudCh0b3AsICNmOWY5ZjksICNlY2VjZWMpOwotICAgIGJhY2tncm91bmQtaW1hZ2U6IC1vLWxpbmVhci1ncmFkaWVudCh0b3AsICNmOWY5ZjksICNlY2VjZWMpOwotICAgIGJhY2tncm91bmQtaW1hZ2U6IGxpbmVhci1ncmFkaWVudCh0b3AsICNmOWY5ZjksICNlY2VjZWMpOwotICAgIGZpbHRlcjogcHJvZ2lkOkRYSW1hZ2VUcmFuc2Zvcm0uTWljcm9zb2Z0LmdyYWRpZW50KHN0YXJ0Q29sb3JTdHI9JyNmOWY5ZjknLAotRW5kQ29sb3JTdHI9JyNlY2VjZWMnKTsKLSAgICBjb2xvcjogIzMzQjVFNTsKLX0KLQotLnRyYWluaW5nLW5hdi10b3AgYS5idXR0b24tc2Vjb25kYXJ5OmhvdmVyLAotLnRyYWluaW5nLW5hdi1ib3R0b20gYS5idXR0b24tc2Vjb25kYXJ5OmhvdmVyIHsKLSAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDljOwotICAgIGJhY2tncm91bmQtaW1hZ2U6IC13ZWJraXQtZ3JhZGllbnQobGluZWFyLCBsZWZ0IHRvcCwgbGVmdCBib3R0b20sIGZyb20oIzJmYWRkYiksIHRvKCMwOWMpKTsKLSAgICBiYWNrZ3JvdW5kLWltYWdlOiAtd2Via2l0LWxpbmVhci1ncmFkaWVudCh0b3AsICMyZmFkZGIsICMwOWMpOwotICAgIGJhY2tncm91bmQtaW1hZ2U6IC1tb3otbGluZWFyLWdyYWRpZW50KHRvcCwgIzJmYWRkYiwgIzA5Yyk7Ci0gICAgYmFja2dyb3VuZC1pbWFnZTogLW1zLWxpbmVhci1ncmFkaWVudCh0b3AsICMyZmFkZGIsICMwOWMpOwotICAgIGJhY2tncm91bmQtaW1hZ2U6IC1vLWxpbmVhci1ncmFkaWVudCh0b3AsICMyZmFkZGIsICMwOWMpOwotICAgIGJhY2tncm91bmQtaW1hZ2U6IGxpbmVhci1ncmFkaWVudCh0b3AsICMyZmFkZGIsICMwOWMpOwotICAgIGZpbHRlcjogcHJvZ2lkOkRYSW1hZ2VUcmFuc2Zvcm0uTWljcm9zb2Z0LmdyYWRpZW50KHN0YXJ0Q29sb3JTdHI9JyMyZmFkZGInLCBFbmRDb2xvclN0cj0nIzA5YycpOwotICAgIGJvcmRlcjogMXB4IHNvbGlkICMzOTkwYWI7Ci0gICAgY29sb3I6ICNmZmYgIWltcG9ydGFudDsKLX0KLQotLnRyYWluaW5nLW5hdi10b3AgYS5idXR0b24tc2Vjb25kYXJ5Lmxhc3QsCi0udHJhaW5pbmctbmF2LWJvdHRvbSBhLmJ1dHRvbi1zZWNvbmRhcnkubGFzdCB7Ci0gIGJvcmRlci1sZWZ0OjA7Ci19Ci0KLS50cmFpbmluZy1uYXYtdG9wIGEuYnV0dG9uLXNlY29uZGFyeS5kb3VibGUtc2l6ZSwKLS50cmFpbmluZy1uYXYtYm90dG9tIGEuYnV0dG9uLXNlY29uZGFyeS5kb3VibGUtc2l6ZSB7Ci0gIHdpZHRoOjI5MXB4OwotfQotCi0udHJhaW5pbmctbmF2LXRvcCwKLS50cmFpbmluZy1uYXYtYm90dG9tIHsKLSAgZmxvYXQ6cmlnaHQ7Ci0gIG1hcmdpbjowIDAgMCAyMHB4OwotfQotCi0udHJhaW5pbmctbmF2LWJvdHRvbSB7Ci0gIHBhZGRpbmc6MCAwIDIwcHg7Ci19Ci0KLSN0Yi13cmFwcGVyLAotI3F2LXdyYXBwZXIgewotICBmbG9hdDpyaWdodDsKLSAgY2xlYXI6cmlnaHQ7Ci0gIG1hcmdpbjotMjdweCAwIDAgMjBweDsgLyogbmVnYXRpdmUgdG9wLW1hcmdpbiB0byBjb3VudGVyIHRoZSBjb250ZW50LWhlYWRlciBib3R0b20gbWFyZ2luICovCi0gIHBhZGRpbmc6MCAwIDIwcHg7Ci19Ci0KLSN0YiwKLSNxdiB7Ci0gIGZvbnQtc2l6ZToxM3B4OwotICBsaW5lLWhlaWdodDoxOHB4OwotICB3aWR0aDoyMzhweDsKLSAgYm9yZGVyOjFweCBzb2xpZCAjY2NjOwotICBmbG9hdDpyaWdodDsKLX0KLQotI3RiIHsKLSAgd2lkdGg6Mjc4cHg7Ci19Ci0KLSN0YiBoMiwKLSNxdiBoMiB7Ci0gIG1hcmdpbjoxMHB4IDE1cHg7Ci0gIHBhZGRpbmc6MDsKLSAgdGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlOwotICBib3JkZXItYm90dG9tOjFweCBzb2xpZCBnYWluc2Jvcm87Ci19Ci0KLSN0YiAqLAotI3F2ICogewotICBmb250LXNpemU6aW5oZXJpdDsKLX0KLQotI3RiIC5kb3dubG9hZC1ib3ggewotICBwYWRkaW5nOjAgMCAwIDE1cHg7Ci19Ci0KLSN0YiAuZG93bmxvYWQtYm94IC5maWxlbmFtZSB7Ci0gIGZvbnQtc2l6ZToxMXB4OwotICBtYXJnaW46NHB4IDRweCAxMHB4OwotICBjb2xvcjojNjY2OwotfQotCi0KLS8qIERldiBndWlkZSBxdWlja25hdiAqLwotCi0uc2lkZWJveC13cmFwcGVyIHsKLSAgZmxvYXQ6cmlnaHQ7Ci0gIGNsZWFyOnJpZ2h0OwotICBtYXJnaW46MCAwIDAgMjBweDsKLSAgcGFkZGluZzowIDAgMjBweDsKLX0KLQotLnNpZGVib3ggewotICB3aWR0aDoyMjZweDsKLSAgZm9udC1zaXplOjEzcHg7Ci0gIGxpbmUtaGVpZ2h0OjE4cHg7Ci0gIGJvcmRlci1sZWZ0OjRweCBzb2xpZCAjOTlDQzAwOwotICBmbG9hdDpyaWdodDsKLSAgcGFkZGluZzowIDAgMCAxMHB4OwotICBtYXJnaW46MCAwIDFlbSAyMHB4OwotfQotCi0uc2lkZWJveCBoMiwKLS5zaWRlYm94IGgzLAotLnNpZGVib3ggaDQsCi0uc2lkZWJveCBoNSB7Ci0gIGZvbnQtd2VpZ2h0OmJvbGQ7Ci0gIG1hcmdpbjowIDAgMTBweDsKLX0KLQotLnNpZGVib3ggKiB7Ci0gIGZvbnQtc2l6ZTppbmhlcml0OwotfQotCi0jdGIgb2wsCi0jdGIgdWwsCi0jcXYgdWwgewotICBtYXJnaW46MCAxNXB4IDEwcHggMzVweDsKLX0KLQotI3F2IG9sIHsKLSAgbGlzdC1zdHlsZTpub25lOwotICBtYXJnaW46MCAxNXB4IDE1cHg7Ci0gIGZvbnQtc2l6ZTppbmhlcml0OwotICBsaW5lLWhlaWdodDppbmhlcml0OwotfQotCi0jdGIgb2wgb2wsCi0jdGIgdWwgdWwsCi0jcXYgb2wgb2wsCi0jcXYgdWwgdWwsCi0uc2lkZWJveCBvbCBvbCwKLS5zaWRlYm94IHVsIHVsIHsKLSAgbWFyZ2luLWJvdHRvbTowOwotfQotCi0jcXYgb2wgb2wgewotICBtYXJnaW46M3B4IDAgM3B4IDE1cHg7Ci19Ci0KLS5zaWRlYm94IHAsCi0jcXYgcCwKLSN0YiBwIHsKLSAgbWFyZ2luOiAwIDAgMTBweDsKLX0KLQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotRm9ybQotKi8KLS5hcnRpY2xlIGZvcm0gewotICAgIG1hcmdpbjogMCAwIDIwcHg7Ci19Ci0uYXJ0aWNsZSBmb3JtIC5mb3JtLXJlcXVpcmVkIHsKLSAgICBjb2xvcjogI2RkNGIzOTsKLX0KLS5hcnRpY2xlIGZvcm0gZmllbGRzZXQgewotICAgIG1hcmdpbjogMCAwIDIwcHg7Ci0gICAgcGFkZGluZzogMDsKLX0KLS5hcnRpY2xlIGZvcm0gbGVnZW5kIHsKLSAgICBkaXNwbGF5OiBibG9jazsKLSAgICBsaW5lLWhlaWdodDogMS41OwotICAgIG1hcmdpbjogMDsKLSAgICBwYWRkaW5nOiAwOwotfQotLyoKLS5hcnRpY2xlIGZvcm0gb2wsIC5hcnRpY2xlIGZvcm0gdWwgewotICAgIG1hcmdpbjogMCAwIDAgMWVtOwotICAgIHBhZGRpbmc6IDAgMCAwIDFlbTsKLX0KLVtkaXI9J3J0bCddIC5hcnRpY2xlIGZvcm0gb2wsIFtkaXI9J3J0bCddIC5hcnRpY2xlIGZvcm0gdWwgewotICAgIG1hcmdpbjogMCAxZW0gMCAwOwotICAgIHBhZGRpbmc6IDAgMWVtIDAgMDsKLX0KLS5hcnRpY2xlIGZvcm0gb2wgdWwsIC5hcnRpY2xlIGZvcm0gdWwgdWwsIFtkaXI9J3J0bCddIC5hcnRpY2xlIGZvcm0gb2wgdWwsIFtkaXI9J3J0bCddIC5hcnRpY2xlIGZvcm0KLXVsIHVsIHsKLSAgICBsaXN0LXN0eWxlOiBub25lOwotICAgIG1hcmdpbjogMDsKLSAgICBwYWRkaW5nOiAwOwotfQotLmFydGljbGUgZm9ybSBsaSB7Ci0gICAgbWFyZ2luOiAwIDAgMjBweDsKLX0KLS5hcnRpY2xlIGZvcm0gbGkgbGkgewotICAgIG1hcmdpbjogMCAwIDVweDsKLX0KLSovCi0uYXJ0aWNsZSBmb3JtIGxhYmVsIHsKLSAgICBkaXNwbGF5OiBibG9jazsKLSAgICBtYXJnaW46IDAgMCA1cHg7Ci0gICAgcGFkZGluZzogMDsKLX0KLS5hcnRpY2xlIGZvcm0gaW5wdXRbdHlwZT0ndGV4dCddLCAuYXJ0aWNsZSBmb3JtIHNlbGVjdCwgLmFydGljbGUgZm9ybSB0ZXh0YXJlYSwgLmFydGljbGUgZm9ybQotLmNoZWNrYm94LWdyb3VwLCAuYXJ0aWNsZSBmb3JtIC5yYWRpby1ncm91cCB7Ci0gICAgbWFyZ2luLWJvdHRvbTogMTVweDsKLX0KLS5jaGVja2JveC1ncm91cCBpbnB1dCB7Ci0gIHdpZHRoOiAxM3B4OwotICBoZWlnaHQ6IDEzcHg7Ci0gIGJhY2tncm91bmQ6ICNmZmY7Ci0gIGJvcmRlcjogc29saWQgMXB4ICNjNmM2YzY7Ci0gIGZsb2F0OiBsZWZ0OwotfQotLmFydGljbGUgZm9ybSAuY2hlY2tib3gtZ3JvdXAsIC5hcnRpY2xlIGZvcm0gLnJhZGlvLWdyb3VwIHsKLSAgZGlzcGxheTogYmxvY2sKLX0KLS5hcnRpY2xlIGZvcm0gc2VsZWN0IHsKLSAgICBib3JkZXI6IHNvbGlkIDFweCAjZWJlYmViOwotICAgIGJvcmRlci10b3AtY29sb3I6ICNkZGQ7Ci0gICAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lOwotICAgIGJhY2tncm91bmQ6ICNmM2YzZjMgdXJsKC4uL2ltYWdlcy9hcnJvd3MtdXAtZG93bi5wbmcpIHJpZ2h0IGNlbnRlciBuby1yZXBlYXQ7Ci0gICAgaGVpZ2h0OiAzMHB4OwotICAgIGNvbG9yOiAjMjIyOwotICAgIGxpbmUtaGVpZ2h0OiBub3JtYWw7Ci0gICAgcGFkZGluZzogNXB4OwotICAgIHdpZHRoOiAxMzBweDsKLX0KLSAgICAKLS5hcnRpY2xlIGZvcm0gLmJyb3dzZSAuYnJvd3NlLW1zZyB7Ci0gIGZvbnQtc2l6ZTogMTEuNXB4OyAgCi19Ci0uYXJ0aWNsZSBmb3JtIC5icm93c2UgLmJ1dHRvbi1zZWNvbmRhcnkgewotICBoZWlnaHQ6IGF1dG87Ci0gIGxpbmUtaGVpZ2h0OiAyNXB4OwotICBmb250LXNpemU6IDExcHg7Ci0gIHBhZGRpbmc6IDAgOHB4OwotICBtYXJnaW46IDAgMTBweCAxNXB4IDA7Ci19Ci0uYXJ0aWNsZSBmb3JtIGlucHV0W3R5cGU9J3RleHQnXSwgLmFydGljbGUgZm9ybSB0ZXh0YXJlYSB7Ci0gICAgYm9yZGVyOiAxcHggc29saWQgI2ViZWJlYjsKLSAgICBib3JkZXItdG9wLWNvbG9yOiAjZGNkY2RjOwotICAgIGNvbG9yOiAjMjIyOwotICAgIGxpbmUtaGVpZ2h0OiBub3JtYWw7Ci0gICAgcGFkZGluZzogNnB4IDEwcHg7Ci0gICAgd2lkdGg6IDMwMHB4OyAKLX0KLS5hcnRpY2xlIGZvcm0gdGV4dGFyZWEgewotICAgIGhlaWdodDogMTUwcHg7Ci19Ci0uYXJ0aWNsZSBmb3JtIGlucHV0W3R5cGU9J3RleHQnXTpmb2N1cywgLmFydGljbGUgZm9ybSB0ZXh0YXJlYTpmb2N1cyB7Ci0gICAgYm9yZGVyLWNvbG9yOiAjMzNCNUU1OwotICAgIC1tb3otYm94LXNoYWRvdzogaW5zZXQgMCAxcHggMnB4IHJnYmEoMCwgMCwgMCwgLjIpOwotICAgIC1vLWJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDJweCByZ2JhKDAsIDAsIDAsIC4yKTsKLSAgICAtd2Via2l0LWJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDJweCByZ2JhKDAsIDAsIDAsIC4yKTsKLSAgICBib3gtc2hhZG93OiBpbnNldCAwIDFweCAycHggcmdiYSgwLCAwLCAwLCAuMik7Ci0gICAgb3V0bGluZTogMDsKLX0KLS5hcnRpY2xlIGZvcm0gaW5wdXRbZGlzYWJsZWRdLCAuYXJ0aWNsZSBmb3JtIHRleHRhcmVhW2Rpc2FibGVkXSwgLmFydGljbGUgZm9ybSBsYWJlbC5mb3JtLWRpc2FibGVkIHsKLSAgICBjb2xvcjogIzk5OTsKLX0KLS5hcnRpY2xlIGZvcm0gaW5wdXRbdHlwZT0ndGV4dCddW2Rpc2FibGVkXSwgLmFydGljbGUgZm9ybSB0ZXh0YXJlYVtkaXNhYmxlZF0gewotICAgIGJhY2tncm91bmQtY29sb3I6ICNlYmViZWI7Ci19Ci1mb3JtIC5mb3JtLWVycm9yIGlucHV0W3R5cGU9J3RleHQnXSwgZm9ybSAuZm9ybS1lcnJvciB0ZXh0YXJlYSB7Ci0gICAgYm9yZGVyLWNvbG9yOiAjZGQ0YjM5OwotICBtYXJnaW4tcmlnaHQ6IDIwcHg7Ci19Ci0uYXNpZGUgewotICAgIC1tb3otYm9yZGVyLXJhZGl1czogMnB4OwotICAgIC13ZWJraXQtYm9yZGVyLXJhZGl1czogMnB4OwotICAgIGJvcmRlci1yYWRpdXM6IDJweDsKLSAgICBtYXJnaW46IDEwcHggMDsKLSAgICBwYWRkaW5nOiAyMHB4OwotICBjb2xvcjogIzY2NjsKLSAgICBwb3NpdGlvbjogcmVsYXRpdmU7Ci0gIGJhY2tncm91bmQ6ICNmOWY5Zjk7Ci19Ci0vKgotLmFzaWRlLCAubm90aWZpY2F0aW9uLCAucHJvbW8gewotICAgIC1tb3otYm9yZGVyLXJhZGl1czogMnB4OwotICAgIC13ZWJraXQtYm9yZGVyLXJhZGl1czogMnB4OwotICAgIGJvcmRlci1yYWRpdXM6IDJweDsKLSAgICBtYXJnaW46IDEwcHggMDsKLSAgICBwYWRkaW5nOiAxMHB4OwotICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKLX0KLS5hc2lkZT46Zmlyc3QtY2hpbGQsIC5ub3RpZmljYXRpb24+OmZpcnN0LWNoaWxkLCAucHJvbW8+OmZpcnN0LWNoaWxkIHsKLSAgICBtYXJnaW4tdG9wOiAwOwotfQotLmFzaWRlPjpsYXN0LWNoaWxkLCAubm90aWZpY2F0aW9uPjpsYXN0LWNoaWxkLCAucHJvbW8+Omxhc3QtY2hpbGQgewotICAgIG1hcmdpbi1ib3R0b206IDA7Ci19Ci0uYXNpZGUgewotICAgIGJhY2tncm91bmQ6ICNmOWY5Zjk7Ci19Ci0ubm90aWZpY2F0aW9uIHsKLSAgICBiYWNrZ3JvdW5kOiAjZmZmYmU0OwotICAgIGJvcmRlci1jb2xvcjogI2Y4ZjZlNjsKLX0KLS5wcm9tbyB7Ci0gICAgYmFja2dyb3VuZDogI2Y2ZjlmZjsKLSAgICBib3JkZXItY29sb3I6ICNlZmYyZjk7Ci19Ci0qLwotCi0vKiBTREsgVE9TIHN0eWxlcyAqLwotCi1kaXYuc2RrLXRlcm1zIHsKLSAgd2hpdGUtc3BhY2U6IHByZS13cmFwOwotICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7Ci0gIGZvbnQtZmFtaWx5OiBpbmhlcml0OwotICBmb250LXNpemU6IGluaGVyaXQ7Ci0gIHBhZGRpbmc6IDEwcHg7Ci0gIGhlaWdodDogMzcwcHg7Ci0gIHdpZHRoOiA3MzhweDsKLSAgYm9yZGVyOiAxcHggc29saWQgIzQ0NDsKLSAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7Ci0gIG92ZXJmbG93OmF1dG87Ci0gIG1hcmdpbjowIDAgMTBweDsKLX0KLQotZGl2LnNkay10ZXJtcy5mdWxsc2l6ZSB7Ci0gIHBhZGRpbmc6IDA7Ci0gIGhlaWdodDogYXV0bzsKLSAgd2lkdGg6IGF1dG87Ci0gIGJvcmRlcjpub25lOwotfQotCi1kaXYuc2RrLXRlcm1zIGgzLAotZGl2LnNkay10ZXJtcyBoMiB7Ci0gIG1hcmdpbjowOwotfQotCi1kaXYjc2RrLXRlcm1zLWZvcm0gewotICBwYWRkaW5nOjAgMCAwIDEwcHg7Ci19Ci0KLWRpdiNzZGstdGVybXMtZm9ybSBpbnB1dCB7Ci0gIGRpc3BsYXk6aW5saW5lOwotICBtYXJnaW46NHB4IDRweCA0cHggMDsKLX0KLQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQ29kZSBTdHlsZQotKi8KLXByZSB7Ci0gIG1hcmdpbjowIDAgMWVtIDA7Ci0gIHBhZGRpbmc6IDFlbTsKLSAgb3ZlcmZsb3c6IGF1dG87Ci0gIGJvcmRlcjogc29saWQgMXB4ICNkZGQ7Ci0gIGJhY2tncm91bmQ6ICNmN2Y3Zjc7ICAKLX0KLS5zdHIgeyBjb2xvcjogIzA4MDsgfQotLmt3ZCB7IGNvbG9yOiAjMDA4OyB9Ci0uY29tIHsgY29sb3I6ICM4MDA7IH0KLS50eXAgeyBjb2xvcjogIzYwNjsgfQotLmxpdCB7IGNvbG9yOiAjMDY2OyB9Ci0ucHVuIHsgY29sb3I6ICM2NjA7IH0KLS5wbG4geyBjb2xvcjogIzAwMDsgfQotLnRhZyB7IGNvbG9yOiAjMDA4OyB9Ci0uYXRuIHsgY29sb3I6ICM4Mjg7IH0KLS5hdHYgeyBjb2xvcjogIzA4MDsgfQotLmRlYyB7IGNvbG9yOiAjNjA2OyB9Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1UaHJlZS1QYW5lCi0qLwotLyogUGFja2FnZSBOYXYgJiBDbGFzc2VzIE5hdiAqLwotLnRocmVlLXBhbmUgewotICBwb3NpdGlvbjogcmVsYXRpdmU7Ci0gIGJvcmRlci10b3A6IHNvbGlkIDFweCAjZWJlYmViOwotfQotI3BhY2thZ2VzLW5hdiAuanMtcGFuZSwKLSNjbGFzc2VzLW5hdiAuanMtcGFuZSB7Ci0gIG92ZXJmbG93OnZpc2libGU7Ci19Ci0jcGFja2FnZXMtbmF2IHsKLSAgICAgICAgaGVpZ2h0OjI3MHB4OwotICBtYXgtaGVpZ2h0OiBpbmhlcml0OwotICBvdmVyZmxvdzogaGlkZGVuOwotICBwb3NpdGlvbjogcmVsYXRpdmU7IAotfQotI2NsYXNzZXMtbmF2IHsKLSAgb3ZlcmZsb3c6IGhpZGRlbjsKLSAgcG9zaXRpb246IHJlbGF0aXZlOyAKLX0KLSNwYWNrYWdlcy1uYXYgdWwsICNjbGFzc2VzLW5hdiB1bCB7Ci0gIGxpc3Qtc3R5bGUtdHlwZTogbm9uZTsKLSAgbWFyZ2luOiAxMHB4IDAgMjBweCAwOwotICBwYWRkaW5nOiAwOyAKLX0KLSNjbGFzc2VzLW5hdiBsaSB7Ci0gIGZvbnQtd2VpZ2h0OiBib2xkOwotICBtYXJnaW46IDVweCAwOwotfQotI3BhY2thZ2VzLW5hdiBsaSwKLSNjbGFzc2VzLW5hdiBsaSBsaSB7Ci0gIG1hcmdpbjogMDsKLX0KLSNwYWNrYWdlcy1uYXYgbGkgYSwgI3BhY2thZ2VzLW5hdiBsaSBhOmFjdGl2ZSwgI3BhY2thZ2VzLW5hdiBsaSBhOnZpc2l0ZWQsCi0jY2xhc3Nlcy1uYXYgbGkgYSwgI2NsYXNzZXMtbmF2IGxpIGE6YWN0aXZlLCAjY2xhc3Nlcy1uYXYgbGkgYTp2aXNpdGVkIHsKLSAgcGFkZGluZzogMCAwIDAgNHB4OwotfQotI3BhY2thZ2VzLW5hdiBsaSBhLCAjcGFja2FnZXMtbmF2IGxpIGE6YWN0aXZlLCAjcGFja2FnZXMtbmF2IGxpIGE6dmlzaXRlZCwKLSNjbGFzc2VzLW5hdiBsaSBsaSBhLCAjY2xhc3Nlcy1uYXYgbGkgbGkgYTphY3RpdmUsICNjbGFzc2VzLW5hdiBsaSBsaSBhOnZpc2l0ZWQsCi0jbmF2LXRyZWUgbGkgYSwgI25hdi10cmVlIGxpIGE6YWN0aXZlLCAjbmF2LXRyZWUgbGkgYTp2aXNpdGVkIHsKLSAgY29sb3I6ICMyMjI7Ci0gIGZvbnQtd2VpZ2h0OiBub3JtYWw7ICAKLX0KLSNwYWNrYWdlcy1uYXYgbGkgYSwgI3BhY2thZ2VzLW5hdiBsaSBhOmFjdGl2ZSwgI3BhY2thZ2VzLW5hdiBsaSBhOnZpc2l0ZWQsCi0jY2xhc3Nlcy1uYXYgbGkgbGkgYSwgI2NsYXNzZXMtbmF2IGxpIGxpIGE6YWN0aXZlLCAjY2xhc3Nlcy1uYXYgbGkgbGkgYTp2aXNpdGVkIHsKLSAgZGlzcGxheTogYmxvY2s7Ci19Ci0jcGFja2FnZXMtbmF2IGxpLnNlbGVjdGVkIGEsICNwYWNrYWdlcy1uYXYgbGkuc2VsZWN0ZWQgYTphY3RpdmUsICNwYWNrYWdlcy1uYXYgbGkuc2VsZWN0ZWQKLWE6dmlzaXRlZCwKLSNjbGFzc2VzLW5hdiBsaSBsaS5zZWxlY3RlZCBhLCAjY2xhc3Nlcy1uYXYgbGkgbGkuc2VsZWN0ZWQgYTphY3RpdmUsICNjbGFzc2VzLW5hdiBsaSBsaS5zZWxlY3RlZAotYTp2aXNpdGVkLAotI25hdi10cmVlIGxpIGRpdi5zZWxlY3RlZCB7Ci0gICAgZm9udC13ZWlnaHQ6IDUwMDsKLSAgICBjb2xvcjogIzAwOTljYzsKLSAgICBiYWNrZ3JvdW5kLWNvbG9yOiNmZmY7IH0KLSAgI3BhY2thZ2VzLW5hdiBsaS5zZWxlY3RlZCB1bCBsaSBhLAotICAjY2xhc3Nlcy1uYXYgbGkuc2VsZWN0ZWQgdWwgbGkgYSB7Ci0gIC8qIGRvbid0IGhpZ2hsaWdodCBjaGlsZCBpdGVtcyAqLwotICAgIGNvbG9yOiAjNTU1NTU1OyB9Ci0jbmF2LXRyZWUgbGkgZGl2LnNlbGVjdGVkIGEgewotICAgIGZvbnQtd2VpZ2h0OiA1MDA7Ci0gICAgY29sb3I6ICMwMDk5Y2M7Ci19Ci0jbmF2LXN3YXAgewotICBoZWlnaHQ6MzBweDsKLSAgYm9yZGVyLXRvcDoxcHggc29saWQgI2NjYzsKLSAgZGlzcGxheTogbm9uZTsKLX0KLSNuYXYtc3dhcCBhIHsKLSAgZGlzcGxheTppbmxpbmUtYmxvY2s7Ci0gIGhlaWdodDoxMDAlOwotICBjb2xvcjogIzIyMjsKLSAgZm9udC1zaXplOiAxMnB4OwotICBwYWRkaW5nOiA1cHggMCA1cHggNXB4OwotfQotCi0jbmF2LXN3YXAgLmZ1bGxzY3JlZW4gewotICBmbG9hdDogcmlnaHQ7Ci0gIHdpZHRoOiAyNHB4OwotICBoZWlnaHQ6IDI0cHg7Ci0gIHRleHQtaW5kZW50OiAtMTAwMGVtOwotICBwYWRkaW5nOjA7Ci0gIG1hcmdpbjozcHggNXB4IDA7Ci0gIGJhY2tncm91bmQ6IHVybCguLi9pbWFnZXMvZnVsbHNjcmVlbi5wbmcpIG5vLXJlcGVhdCAtMjRweCAwOwotfQotI25hdi1zd2FwIC5mdWxsc2NyZWVuLmRpc2FibGVkIHsKLSAgYmFja2dyb3VuZC1wb3NpdGlvbjogMCAwOwotfQotI25hdi1zd2FwIC5mdWxsc2NyZWVuOmhvdmVyLCAKLSNuYXYtc3dhcCAuZnVsbHNjcmVlbjpmb2N1cyB7Ci0gIGN1cnNvcjpwb2ludGVyOwotfQotCi0KLS8qIG5hdiB0cmVlICovCi0jc2lkZS1uYXYsICNkZXZkb2MtbmF2LCAjc3dhcHBlciwKLSNuYXYtdHJlZSwgI3RyZWUtbGlzdCB7Ci0gIG92ZXJmbG93OmhpZGRlbjsKLSAgbWFyZ2luLWxlZnQ6MDsKLX0KLQotI25hdi10cmVlLCAjc3dhcHBlciB7Ci0gIGRpc3BsYXk6IG5vbmU7Ci19Ci0KLSNuYXYtdHJlZSB1bCB7Ci0gIGxpc3Qtc3R5bGU6bm9uZTsKLSAgcGFkZGluZzowOwotICBtYXJnaW46MTBweCAwOwotfQotCi0jbmF2LXRyZWUgdWwgbGkgZGl2IHsKLSAgcGFkZGluZzowIDAgMCA0cHg7Ci19Ci0KLSNzaWRlLW5hdiAjbmF2LXRyZWUgdWwgbGkgYSwKLSNzaWRlLW5hdiAjbmF2LXRyZWUgdWwgbGkgc3Bhbi5uby1jaGlsZHJlbiB7Ci0gIHBhZGRpbmc6IDA7Ci0gIG1hcmdpbjogMDsKLX0KLQotI25hdi10cmVlIC5wbHVzIHsKLSAgbWFyZ2luOiAwIDNweCAwIDA7Ci19Ci0KLSNuYXYtdHJlZSB1bCB1bCB7Ci0gIGxpc3Qtc3R5bGU6IG5vbmU7Ci0gIG1hcmdpbjogMDsKLSAgcGFkZGluZzogMCAwIDAgMDsKLX0KLQotI25hdi10cmVlIHVsIGxpIHsKLSAgbWFyZ2luOiAwOwotICBwYWRkaW5nOiAwIDAgMCAwOwotICB3aGl0ZS1zcGFjZTogbm93cmFwOwotfQotCi0jbmF2LXRyZWUgLmNoaWxkcmVuX3VsIHsKLSAgcGFkZGluZzowOwotICBtYXJnaW46MDsKLX0KLSNuYXYtdHJlZSAuY2hpbGRyZW5fdWwgbGkgZGl2IHsKLSAgcGFkZGluZzowIDAgMCAxMHB4OwotfQotI25hdi10cmVlIC5jaGlsZHJlbl91bCAuY2hpbGRyZW5fdWwgbGkgZGl2IHsKLSAgcGFkZGluZzowIDAgMCAyMHB4OwotfQotCi0jbmF2LXRyZWUgYS5ub2xpbmsgewotICBjb2xvcjogIzIyMjsKLSAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0jbmF2LXRyZWUgc3Bhbi5sYWJlbCB7Ci0gIHdpZHRoOiAxMDAlOwotfQotCi0jbmF2LXRyZWUgewotICBvdmVyZmxvdy14OiBhdXRvOwotICBvdmVyZmxvdy15OiBzY3JvbGw7Ci0gIG91dGxpbmU6MDsKLX0KLQotCi0vKiBDb250ZW50ICovCi0jZG9jLWNvbCB7Ci0gIG1hcmdpbi1yaWdodDowOwotfQotI2RvYy1jb250ZW50LWNvbnRhaW5lciB7Ci0gIG1hcmdpbi1sZWZ0OiAyOTFweCAgCi19Ci0jZG9jLWhlYWRlciwgI2RvYy1jb250ZW50IHsKLSAgcGFkZGluZzogMWVtIDJlbTsKLX0KLSNkb2MtaGVhZGVyIHsKLSAgYmFja2dyb3VuZDogI2Y3ZjdmNzsgIAotfQotI2RvYy1oZWFkZXIgaDEgewotICBsaW5lLWhlaWdodDogMDsKLSAgbWFyZ2luLWJvdHRvbTogMTVweDsKLX0KLSNhcGktaW5mby1ibG9jayB7Ci0gIGZsb2F0OiByaWdodDsKLSAgZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0jYXBpLWluZm8tYmxvY2sgYSwgI2FwaS1pbmZvLWJsb2NrIGE6YWN0aXZlLCAjYXBpLWluZm8tYmxvY2sgYTp2aXNpdGVkIHsKLSAgY29sb3I6ICMyMjI7Ci19Ci0jYXBpLWluZm8tYmxvY2sgYTpob3ZlciwgI2FwaS1pbmZvLWJsb2NrIGE6Zm9jdXMgewotICBjb2xvcjogIzMzQjVFNTsKLX0KLSNhcGktbmF2LWhlYWRlciB7Ci0gIGhlaWdodDoxOXB4OyAvKiBwbHVzIDE2cHggcGFkZGluZyA9IDM1OyBzYW1lIGFzICNuYXYgbGkgKi8KLSAgZm9udC1zaXplOjE0cHg7Ci0gIHBhZGRpbmc6IDhweCAwOwotICBtYXJnaW46IDA7Ci0gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjQ0NDOwotICBiYWNrZ3JvdW5kOiNlOWU5ZTk7Ci0gIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC4wNSk7IC8qIG1hdGNoZXMgI25hdiBsaS5leHBhbmRlZCAqLwotICBkaXNwbGF5OiBub25lOwotCi19Ci0jYXBpLW5hdi10aXRsZSB7Ci0gIHBhZGRpbmc6MCA1cHg7Ci0gIHdoaXRlLXNwYWNlOm5vd3JhcDsKLSAgZGlzcGxheTogbm9uZTsKLX0KLQotI2FwaS1sZXZlbC10b2dnbGUgewotICBmbG9hdDpyaWdodDsKLSAgcGFkZGluZzowIDVweDsKLX0KLQotI2FwaS1sZXZlbC10b2dnbGUgbGFiZWwgewotICBtYXJnaW46MDsKLSAgdmVydGljYWwtYWxpZ246dG9wOwotICBsaW5lLWhlaWdodDogMTlweDsKLSAgZm9udC1zaXplOjEzcHg7Ci0gIGhlaWdodDogMTlweDsKLX0KLQotI2FwaS1sZXZlbC10b2dnbGUgLnNlbGVjdC13cmFwcGVyIHsKLSAgd2lkdGg6IDM1cHg7Ci0gIGRpc3BsYXk6IGlubGluZS1ibG9jazsKLSAgb3ZlcmZsb3c6IGhpZGRlbjsKLX0KLSNhcGktbGV2ZWwtdG9nZ2xlIHNlbGVjdCB7Ci0gIGJvcmRlcjogMDsKLSAgYXBwZWFyYW5jZTpub25lOwotICAtbW96LWFwcGVhcmFuY2U6bm9uZTsKLSAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lOwotICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudCB1cmwoLi4vaW1hZ2VzL2Fycm93cy11cC1kb3duLnBuZykgMjNweCA1cHggbm8tcmVwZWF0OwotICBjb2xvcjogIzIyMjsKLSAgaGVpZ2h0OiAxOXB4OwotICBsaW5lLWhlaWdodDogMTlweDsKLSAgcGFkZGluZzogMDsKLSAgbWFyZ2luOjFweCAwIDAgMDsKLSAgd2lkdGg6MTUwJTsKLSAgZm9udC1zaXplOjEzcHg7Ci0gIHZlcnRpY2FsLWFsaWduOnRvcDsKLSAgb3V0bGluZTowOwotfQotCi0KLS8qIFRvZ2dsZSBmb3IgcmV2aXNpb24gbm90ZXMgYW5kIHN0dWZmICovCi1kaXYudG9nZ2xlLWNvbnRlbnQuY2xvc2VkIC50b2dnbGUtY29udGVudC10b2dnbGVtZSB7Ci0gIGRpc3BsYXk6bm9uZTsKLX0KLQotI2pkLWNvbnRlbnQgaW1nLnRvZ2dsZS1jb250ZW50LWltZyB7Ci0gIG1hcmdpbjowIDVweCA1cHggMDsKLX0KLWRpdi50b2dnbGUtY29udGVudCBwIHsKLSAgbWFyZ2luOjEwcHggMCAwOwotfQotZGl2LnRvZ2dsZS1jb250ZW50LXRvZ2dsZW1lIHsKLSAgcGFkZGluZzowIDAgMCAxNXB4OwotfQotCi0KLS8qIEFQSSBMRVZFTCBGSUxURVJFRCBNRU1CRVJTICovCi0KLS5hYnNlbnQsCi0uYWJzZW50IGE6bGluaywKLS5hYnNlbnQgYTp2aXNpdGVkLAotLmFic2VudCBhOmhvdmVyLAotLmFic2VudCAqIHsKLSAgY29sb3I6I2JiYiAhaW1wb3J0YW50OwotICBjdXJzb3I6ZGVmYXVsdCAhaW1wb3J0YW50OwotICB0ZXh0LWRlY29yYXRpb246bm9uZSAhaW1wb3J0YW50OwotfQotI2RldmRvYy1uYXYgbGkuYWJzZW50LnNlbGVjdGVkLAotI2RldmRvYy1uYXYgbGkuYWJzZW50LnNlbGVjdGVkICosCi0jZGV2ZG9jLW5hdiBkaXYubGFiZWwuYWJzZW50LnNlbGVjdGVkLAotI2RldmRvYy1uYXYgZGl2LmxhYmVsLmFic2VudC5zZWxlY3RlZCAqIHsKLSAgYmFja2dyb3VuZC1jb2xvcjojZWFlYWVhICFpbXBvcnRhbnQ7Ci19Ci0uYWJzZW50IGg0LmpkLWRldGFpbHMtdGl0bGUsCi0uYWJzZW50IGg0LmpkLWRldGFpbHMtdGl0bGUgKiB7Ci0gIGJhY2tncm91bmQtY29sb3I6I2Y2ZjZmNiAhaW1wb3J0YW50OwotfQotLmFic2VudCBpbWcgewotICBvcGFjaXR5OiAuMzsKLSAgZmlsdGVyOiBhbHBoYShvcGFjaXR5PTMwKTsKLSAgLW1zLWZpbHRlcjoicHJvZ2lkOkRYSW1hZ2VUcmFuc2Zvcm0uTWljcm9zb2Z0LkFscGhhKE9wYWNpdHk9MzApIjsKLX0KLQotCi0KLQotCi0KLQotCi0KLS8qIEpRVUVSWSBSRVNJWkFCTEUgU1RZTEVTICovCi0udWktcmVzaXphYmxlIHsgcG9zaXRpb246IHJlbGF0aXZlOyB9Ci0udWktcmVzaXphYmxlLWhhbmRsZSB7IHBvc2l0aW9uOiBhYnNvbHV0ZTsgZGlzcGxheTogbm9uZTsgZm9udC1zaXplOiAwLjFweDsgei1pbmRleDoxOyB9Ci0udWktcmVzaXphYmxlIC51aS1yZXNpemFibGUtaGFuZGxlIHsgZGlzcGxheTogYmxvY2s7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZTRlNGU0OyB9Ci0vKmJvZHkgLnVpLXJlc2l6YWJsZS1kaXNhYmxlZCAudWktcmVzaXphYmxlLWhhbmRsZSB7IGRpc3BsYXk6IG5vbmU7IH0KLWJvZHkgLnVpLXJlc2l6YWJsZS1hdXRvaGlkZSAudWktcmVzaXphYmxlLWhhbmRsZSB7IGRpc3BsYXk6IG5vbmU7IH0qLwotLnVpLXJlc2l6YWJsZS1zIHsgY3Vyc29yOiBzLXJlc2l6ZTsgaGVpZ2h0OiAxMHB4OyB3aWR0aDogMTAwJSAhaW1wb3J0YW50OyBib3R0b206IC0xMXB4OyBsZWZ0OiAwOwotYm9yZGVyLWJvdHRvbTogc29saWQgMXB4ICNlZGVkZWQ7Ci0gIGJhY2tncm91bmQ6ICNmN2Y3ZjcgdXJsKCIuLi9pbWFnZXMvcmVzaXphYmxlLXMyLnBuZyIpIG5vLXJlcGVhdCBzY3JvbGwgY2VudGVyIGNlbnRlcjsgfQotLyoKLS51aS1yZXNpemFibGUtZSB7IAotY3Vyc29yOiBlLXJlc2l6ZTsgd2lkdGg6IDEwcHg7IHJpZ2h0OiAwOyB0b3A6IDA7IGhlaWdodDogMTAwJTsgYm9yZGVyLXJpZ2h0OiBzb2xpZAotMXB4ICNlZGVkZWQ7YmFja2dyb3VuZDogI2Y3ZjdmNyB1cmwoIi4uL2ltYWdlcy9yZXNpemFibGUtZTIucG5nIikgbm8tcmVwZWF0IHNjcm9sbCBjZW50ZXIgY2VudGVyOyB9Ci0qLwotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotTGlnaHRib3gKLSovCi0ubGlnaHRib3ggeyAKLSAgd2lkdGg6IDc2OXB4OwotICBwYWRkaW5nOiAxLjVlbTsKLSAgbWFyZ2luOiAwIGF1dG87Ci0gIGJvcmRlcjogc29saWQgMXB4ICNkY2RjZGM7Ci0gIGJhY2tncm91bmQ6ICNmZmY7Ci0gIC1tb3otYm94LXNoYWRvdzogMXB4IDFweCA1cHggcmdiYSgwLDAsMCwwLjEpOwotICAtd2Via2l0LWJveC1zaGFkb3c6IDFweCAxcHggNXB4IHJnYmEoMCwwLDAsMC4xKTsKLSAgYm94LXNoYWRvdzogMXB4IDFweCA1cHggcmdiYSgwLDAsMCwwLjEpCi19Ci0ubGlnaHRib3ggLmhlYWRlciB7Ci0gIGZsb2F0OiBsZWZ0OwotICB3aWR0aDogNzIwcHg7Ci0gIG1hcmdpbjogLTEwcHggMjBweCAxMHB4IDA7ICAKLX0KLS5saWdodGJveCAuY2xvc2UgewotICBmbG9hdDogcmlnaHQ7Ci0gIHdpZHRoOiAxMHB4OwotICBoZWlnaHQ6IDEwcHg7Ci0gIG1hcmdpbjogLTEwcHggLTEwcHggMTBweCAwOwotICB0ZXh0LWluZGVudDogLTEwMDBlbTsKLSAgYmFja2dyb3VuZDogdXJsKC4uL2ltYWdlcy9jbG9zZS5wbmcpIG5vLXJlcGVhdCAwIDA7Ci19Ci0ubGlnaHRib3ggLmNsb3NlOmhvdmVyLCAubGlnaHRib3ggLmNsb3NlOmZvY3VzIHsKLSAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTEwcHggMDsKLX0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUJ1dHRlcmJhcgotKi8KLSNidXR0ZXJiYXItd3JhcHBlciB7Ci0gIHBvc2l0aW9uOmFic29sdXRlOwotICB0b3A6MDsKLSAgbGVmdDowOwotICB3aWR0aDoxMDAlOwotfQotI2J1dHRlcmJhciB7Ci0gIHdpZHRoOjk0MHB4OwotICBtYXJnaW46MCBhdXRvOwotfQotI2J1dHRlcmJhci1tZXNzYWdlIHsKLSAgYmFja2dyb3VuZC1jb2xvcjojZjgwOwotICBmbG9hdDpyaWdodDsKLSAgZm9udC1zaXplOjEycHg7Ci0gIGZvbnQtd2VpZ2h0OmJvbGQ7Ci0gIHBhZGRpbmc6MCAxMHB4OwotICBib3JkZXItcmFkaXVzOiAwIDAgNXB4IDVweDsKLX0KLSNidXR0ZXJiYXItbWVzc2FnZSBhIHtjb2xvcjojZmZmICFpbXBvcnRhbnR9Ci0jYnV0dGVyYmFyLW1lc3NhZ2UgYTpob3ZlciB7dGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTt9Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1NaXNjCi0qLwotCi0KLS5jbGVhcmZpeDpiZWZvcmUsIC5jbGVhcmZpeDphZnRlciB7Ci0gIGNvbnRlbnQ6ICIiOwotICBkaXNwbGF5OiB0YWJsZQotfQotLmNsZWFyZml4OmFmdGVyIHsKLSAgY2xlYXI6IGJvdGgKLX0KLS5jbGVhcmZpeCB7Ci0gICp6b29tOiAxCi19Ci10YWJsZS5ibGFuayB0aCwgdGFibGUuYmxhbmsgdGQgewotICAgIGJvcmRlcjogMDsKLSAgYmFja2dyb3VuZDogbm9uZQotfQotLmNhcHRpb24gewotICBtYXJnaW46IDAuNWVtIDAgMmVtIDA7Ci0gIGNvbG9yOiAjMDAwOwotICBmb250LXNpemU6IDExLjVweDsgIAotfQotCi0ubm9saXN0IHsKLSAgbGlzdC1zdHlsZTpub25lOwotICBtYXJnaW4tbGVmdDowOwotfQotI3RiIC5ub2xpc3QgewotICBtYXJnaW4tbGVmdDoxNXB4OwotfQotCi0KLXByZS5jbGFzc2ljIHsKLSAgYmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDsKLSAgYm9yZGVyOm5vbmU7Ci0gIHBhZGRpbmc6MDsKLX0KLQotcC5pbWctY2FwdGlvbiB7Ci0gIG1hcmdpbjogLTEwcHggMCAyMHB4OwotICBmb250LXNpemU6MTNweDsKLSAgY29sb3I6IzY2NjsKLX0KLQotZGl2LmZpZ3VyZSwKLWRpdi5maWd1cmUtcmlnaHQgewotICBmbG9hdDpyaWdodDsKLSAgY2xlYXI6cmlnaHQ7Ci0gIG1hcmdpbjoxMHB4IDAgMCAwOwotICBwYWRkaW5nOjAgMCAwIDIwcHg7Ci0gIC8qIHdpZHRoIG11c3QgYmUgZGVmaW5lZCB3LyBhbiBpbmxpbmUgc3R5bGUgbWF0Y2hpbmcgdGhlIGltYWdlIHdpZHRoICovCi19Ci0KLWRpdi5maWd1cmUtbGVmdCB7Ci0gIGZsb2F0OmxlZnQ7Ci0gIGNsZWFyOmxlZnQ7Ci0gIG1hcmdpbjoxMHB4IDAgMCAwOwotICBwYWRkaW5nOjAgMjBweCAwIDA7Ci0gIC8qIHdpZHRoIG11c3QgYmUgZGVmaW5lZCB3LyBhbiBpbmxpbmUgc3R5bGUgbWF0Y2hpbmcgdGhlIGltYWdlIHdpZHRoICovCi19Ci0KLWltZy5mcmFtZSB7Ci0gIGJvcmRlcjoxcHggc29saWQgI0RERDsKLSAgcGFkZGluZzo0cHg7Ci19Ci0KLXAudGFibGUtY2FwdGlvbiB7Ci0gIG1hcmdpbjogMCAwIDRweCAwOwotICBmb250LXNpemU6MTNweDsKLSAgY29sb3I6IzY2NjsKLX0KLQotcC5jb2RlLWNhcHRpb24gewotICBtYXJnaW46IDAgMCA0cHggMDsKLSAgZm9udDogMTJweC8xLjUgbW9ub3NwYWNlOwotICBjb2xvcjojNjY2OwotfQotCi1kaXYubm90ZSwgCi1kaXYuY2F1dGlvbiwgCi1kaXYud2FybmluZyB7Ci0gIG1hcmdpbjogMCAwIDE1cHg7Ci19Ci0KLXAubm90ZSwgZGl2Lm5vdGUsIAotcC5jYXV0aW9uLCBkaXYuY2F1dGlvbiwgCi1wLndhcm5pbmcsIGRpdi53YXJuaW5nIHsKLSAgcGFkZGluZzogMCAwIDAgMTBweDsKLSAgYm9yZGVyLWxlZnQ6IDRweCBzb2xpZDsKLX0KLQotcC5ub3RlLCBkaXYubm90ZSB7Ci0gIGJvcmRlci1jb2xvcjogIzI1OEFBRjsKLX0KLQotcC5jYXV0aW9uLCBkaXYuY2F1dGlvbiB7Ci0gIGJvcmRlci1jb2xvcjogI0ZGODgwMDsKLX0KLQotcC53YXJuaW5nLCBkaXYud2FybmluZyB7Ci0gIGJvcmRlci1jb2xvcjogI2ZmNDQ0MzsKLX0KLQotZGl2Lm5vdGUuZGVzaWduIHsKLSAgYm9yZGVyLWxlZnQ6IDRweCBzb2xpZCAjMzNCNUU1OwotfQotCi1kaXYubm90ZS5kZXZlbG9wIHsKLSAgYm9yZGVyLWxlZnQ6IDRweCBzb2xpZCAjRjgwOwotfQotCi1kaXYubm90ZS5kaXN0cmlidXRlIHsKLSAgYm9yZGVyLWxlZnQ6IDRweCBzb2xpZCAjOUMwOwotfQotCi0ubm90ZSBwLCAuY2F1dGlvbiBwLCAud2FybmluZyBwIHsKLSAgbWFyZ2luOjAgMCA1cHg7Ci19Ci0KLS5ub3RlIHA6bGFzdC1jaGlsZCwgLmNhdXRpb24gcDpsYXN0LWNoaWxkLCAud2FybmluZyBwOmxhc3QtY2hpbGQgewotICBtYXJnaW4tYm90dG9tOjA7Ci19Ci0KLWJvZHkuYWJvdXQgYmxvY2txdW90ZSB7Ci0gIGRpc3BsYXk6YmxvY2s7Ci0gIGZsb2F0OnJpZ2h0OwotICB3aWR0aDoyODBweDsKLSAgZm9udC1zaXplOjIwcHg7Ci0gIGZvbnQtc3R5bGU6aXRhbGljOwotICBsaW5lLWhlaWdodDoyNHB4OwotICBjb2xvcjojMzNCNUU1OwotICBtYXJnaW46MCAwIDIwcHggMzBweDsKLX0KLQotZGl2LmRlc2lnbi1hbm5vdW5jZSBwIHsKLSAgbWFyZ2luOjAgMCAxMHB4OwotfQotCi0jZGV2ZG9jLW5hdiBhLnRvdG9wIHsKLSAgZGlzcGxheTpibG9jazsKLSAgdG9wOjA7Ci0gIHdpZHRoOmluaGVyaXQ7Ci0gIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50IHVybCguLi9pbWFnZXMvc3R5bGVzL2dvdG90b3AucG5nKSBuby1yZXBlYXQgc2Nyb2xsIDUwJSA1MCU7Ci0gIHRleHQtaW5kZW50Oi05OTk5ZW07Ci19Ci0jZGV2ZG9jLW5hdiBhLnRvdG9wIHsKLSAgcG9zaXRpb246Zml4ZWQ7Ci0gIGRpc3BsYXk6bm9uZTsKLX0KLSNkZXZkb2MtbmF2IGEudG90b3A6aG92ZXIgewotICBiYWNrZ3JvdW5kLWNvbG9yOiMzM0I1RTU7Ci19Ci0KLS5jb250ZW50LWZvb3RlciBhLnRvdG9wIHsKLSAgdGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlOwotICBsaW5lLWhlaWdodDozMHB4OwotfQotCi0uZXhwYW5kYWJsZSB7Ci0gIGhlaWdodDozNHB4OwotICBwYWRkaW5nLWxlZnQ6MjBweDsKLSAgcG9zaXRpb246cmVsYXRpdmU7Ci19Ci0uZXhwYW5kYWJsZTpiZWZvcmUgewotICBjb250ZW50OiAnJzsKLSAgYmFja2dyb3VuZC1pbWFnZTogdXJsKC4uL2ltYWdlcy9zdHlsZXMvZGlzY2xvc3VyZV9kb3duLnBuZyk7Ci0gIGJhY2tncm91bmQtcmVwZWF0Om5vLXJlcGVhdDsKLSAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTEycHggLTlweDsKLSAgd2lkdGg6IDIwcHg7Ci0gIGhlaWdodDogMjBweDsKLSAgZGlzcGxheTogaW5saW5lLWJsb2NrOwotICBwb3NpdGlvbjogYWJzb2x1dGU7Ci0gIHRvcDogMDsKLSAgbGVmdDogMDsgfQotfQotLmV4cGFuZGFibGUuZXhwYW5kZWQ6YmVmb3JlIHsKLSAgYmFja2dyb3VuZC1pbWFnZTogdXJsKC4uL2ltYWdlcy9zdHlsZXMvZGlzY2xvc3VyZV91cC5wbmcpOwotfQotCi0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLURpYWxvZyBib3ggZm9yIHBvcHVwIG1lc3NhZ2VzIAotKi8KLQotZGl2LmRpYWxvZyB7Ci0gIGhlaWdodDowOwotICBtYXJnaW46MCBhdXRvOwotfQotCi1kaXYuZGlhbG9nPmRpdiB7Ci0gIHotaW5kZXg6OTk7Ci0gIHBvc2l0aW9uOmZpeGVkOwotICBtYXJnaW46NzBweCAwOwotICB3aWR0aDogMzkxcHg7Ci0gIGhlaWdodDogMjAwcHg7Ci0gIGJhY2tncm91bmQ6ICNGN0Y3Rjc7Ci0tbW96LWJveC1zaGFkb3c6IDAgMCAxNXB4IHJnYmEoMCwwLDAsMC41KTsKLS13ZWJraXQtYm94LXNoYWRvdzogMCAwIDE1cHggcmdiYSgwLDAsMCwwLjUpOwotYm94LXNoYWRvdzogMCAwIDE1cHggcmdiYSgwLDAsMCwwLjUpOwotfQotLyogSUU2IGNhbid0IHBvc2l0aW9uIGZpeGVkICovCi0qIGh0bWwgZGl2LmRpYWxvZyBkaXYgeyBwb3NpdGlvbjphYnNvbHV0ZTsgfQotCi0KLWRpdiNkZXByZWNhdGVkU3RpY2tlciB7Ci0gIGRpc3BsYXk6bm9uZTsKLSAgei1pbmRleDo5OTsKLSAgcG9zaXRpb246Zml4ZWQ7Ci0gIHJpZ2h0OjE1cHg7Ci0gIHRvcDoxMTRweDsKLSAgbWFyZ2luOjA7Ci0gIHBhZGRpbmc6MWVtOwotICBiYWNrZ3JvdW5kOiNGRkY7Ci0gIGJvcmRlcjoxcHggc29saWQgI2RkZGQwMDsKLSAgYm94LXNoYWRvdzotNXB4IDVweCAxMHB4ICNjY2M7Ci0gIC1tb3otYm94LXNoYWRvdzotNXB4IDVweCAxMHB4ICNjY2M7Ci0gIC13ZWJraXQtYm94LXNoYWRvdzotNXB4IDVweCAxMHB4ICNjY2M7Ci19Ci0KLWRpdiNuYU1lc3NhZ2UgewotICBkaXNwbGF5Om5vbmU7Ci0gIHdpZHRoOjU1NXB4OwotICBoZWlnaHQ6MDsKLSAgbWFyZ2luOjAgYXV0bzsKLX0KLQotZGl2I25hTWVzc2FnZSBkaXYgewotICB6LWluZGV4Ojk5OwotICB3aWR0aDo0NTBweDsKLSAgcG9zaXRpb246Zml4ZWQ7Ci0gIG1hcmdpbjo1MHB4IDA7Ci0gIHBhZGRpbmc6NGVtIDRlbSAzZW07Ci0gIGJhY2tncm91bmQ6I0ZGRjsKLSAgYm9yZGVyOjFweCBzb2xpZCAjOTk5OwotICBib3gtc2hhZG93Oi0xMHB4IDEwcHggNDBweCAjODg4OwotICAtbW96LWJveC1zaGFkb3c6LTEwcHggMTBweCA0MHB4ICM4ODg7Ci0gIC13ZWJraXQtYm94LXNoYWRvdzotMTBweCAxMHB4IDQwcHggIzg4ODsKLX0KLS8qIElFNiBjYW4ndCBwb3NpdGlvbiBmaXhlZCAqLwotKiBodG1sIGRpdiNuYU1lc3NhZ2UgZGl2IHsgcG9zaXRpb246YWJzb2x1dGU7IH0KLQotZGl2I25hTWVzc2FnZSBzdHJvbmcgewotICBmb250LXNpemU6MS4xZW07Ci19Ci0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVNsaWRlc2hvdyBDb250cm9scyAmIE5leHQvUHJldiAKLSovCi0uc2xpZGVzaG93LW5leHQsIC5zbGlkZXNob3ctcHJldiB7ICAKLSAgd2lkdGg6IDIwcHg7Ci0gIGhlaWdodDogMzZweDsKLSAgdGV4dC1pbmRlbnQ6IC0xMDAwZW07Ci19Ci0uc2xpZGVzaG93LWNvbnRhaW5lciB7Ci0gIG1hcmdpbjogMmVtIDA7Ci19Ci0uc2xpZGVzaG93LWNvbnRhaW5lcjpiZWZvcmUsIC5zbGlkZXNob3ctY29udGFpbmVyOmFmdGVyIHsKLSAgY29udGVudDogIiI7Ci0gIGRpc3BsYXk6IHRhYmxlOwotICBjbGVhcjogYm90aDsKLX0KLWEuc2xpZGVzaG93LW5leHQsIGEuc2xpZGVzaG93LW5leHQ6dmlzaXRlZCB7Ci0KLSAgZmxvYXQ6IHJpZ2h0OwotCi0gIGJhY2tncm91bmQ6IHVybCguLi9pbWFnZXMvYXJyb3ctcmlnaHQucG5nKSBuby1yZXBlYXQgMCAwCi0KLX0KLQotYS5zbGlkZXNob3ctcHJldiwgYS5zbGlkZXNob3ctcHJldjp2aXNpdGVkIHsKLQotICBmbG9hdDogbGVmdDsgIAotCi0gIGJhY2tncm91bmQ6IHVybCguLi9pbWFnZXMvYXJyb3ctbGVmdC5wbmcpIG5vLXJlcGVhdCAwIDAKLQotfQotCi0uc2xpZGVzaG93LW5leHQ6aG92ZXIsIC5zbGlkZXNob3ctcHJldjpob3ZlciwgLnNsaWRlc2hvdy1uZXh0OmZvY3VzLCAuc2xpZGVzaG93LXByZXY6Zm9jdXMgewotCi0gIGJhY2tncm91bmQtcG9zaXRpb246IDAgLTM2cHggIAotCi19Ci0KLS5zbGlkZXNob3ctbmV4dDphY3RpdmUsIC5zbGlkZXNob3ctcHJldjphY3RpdmUgewotCi0gIGJhY2tncm91bmQtcG9zaXRpb246IDAgLTcycHggIAotCi19Ci0uc2xpZGVzaG93LW5hdiB7Ci0gIHdpZHRoOiA3NHB4OwotICBtYXJnaW46IDAgYXV0bzsgICAKLX0KLS5zbGlkZXNob3ctbmF2IGEsIC5zbGlkZXNob3ctbmF2IGE6dmlzaXRlZCB7Ci0gIGRpc3BsYXk6IGlubGluZS1ibG9jazsKLSAgd2lkdGg6IDEycHg7Ci0gIGhlaWdodDogMTJweDsKLSAgbWFyZ2luOiAwIDJweCAyMHB4IDJweDsKLSAgYmFja2dyb3VuZDogI2NjYzsKLSAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiA1MCU7Ci0gIC1tb3otYm9yZGVyLXJhZGl1czogNTAlOwotICBib3JkZXItcmFkaXVzOiA1MCU7Ci19Ci0uc2xpZGVzaG93LW5hdiBhOmhvdmVyLCAuc2xpZGVzaG93LW5hdiBhOmZvY3VzIHsKLQotICBiYWNrZ3JvdW5kOiAjMzNCNUU1Ci19Ci0KLS5zbGlkZXNob3ctbmF2IGE6YWN0aXZlIHsKLQotICBiYWNrZ3JvdW5kOiAjMWU3OTlhOwotICBiYWNrZ3JvdW5kOiAjZWJlYmViOyAgCi0gIC13ZWJraXQtYm94LXNoYWRvdzogaW5zZXQgMHB4IDBweCA1cHggMnB4IHJnYmEoMCwgMCwgMCwgLjA1KTsKLSAgLW1vei1ib3gtc2hhZG93OiBpbnNldCAwcHggMHB4IDVweCAycHggcmdiYSgwLCAwLCAwLCAuMDUpOwotICBib3gtc2hhZG93OiBpbnNldCAwcHggMHB4IDVweCAycHggcmdiYSgwLCAwLCAwLCAuMDUpOwotfQotLnNsaWRlc2hvdy1uYXYgYS5hY3RpdmUsIC5zbGlkZXNob3ctbmF2IGEuYWN0aXZlOmFjdGl2ZSwgLnNsaWRlc2hvdy1uYXYgYS5hY3RpdmU6dmlzaXRlZCB7Ci0gIGJhY2tncm91bmQ6ICMzM0I1RTUKLX0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1UYWJzCi0qLwotdWwudGFicyB7Ci0gIHBhZGRpbmc6IDA7Ci0gIG1hcmdpbjogMmVtIDAgMCAwOyAgCi19Ci11bC50YWJzOmJlZm9yZSwgdWwudGFiczphZnRlciB7Ci0gIGNvbnRlbnQ6ICIiOwotICBkaXNwbGF5OiB0YWJsZTsKLSAgY2xlYXI6IGJvdGg7Ci19Ci11bC50YWJzIGxpIHsKLSAgbGlzdC1zdHlsZS10eXBlOiBub25lOwotICBmbG9hdDogbGVmdDsgIAotfQotdWwudGFicyBsaSBhLCB1bC50YWJzIGxpIGE6YWN0aXZlLCB1bC50YWJzIGxpIGE6dmlzaXRlZCB7Ci0gIGRpc3BsYXk6IGJsb2NrOwotICBoZWlnaHQ6IDM2cHg7Ci0gIGxpbmUtaGVpZ2h0OiAzNnB4OwotICBwYWRkaW5nOiAwIDE1cHg7Ci0gIG1hcmdpbi1yaWdodDogMnB4OwotICBjb2xvcjogIzIyMjsKLSAgLW1vei1ib3JkZXItcmFkaXVzLXRvcGxlZnQ6IDJweDsKLSAgLW1vei1ib3JkZXItcmFkaXVzLXRvcHJpZ2h0OiAycHg7Ci0gIC1tb3otYm9yZGVyLXJhZGl1cy1ib3R0b21yaWdodDogcHg7Ci0gIC1tb3otYm9yZGVyLXJhZGl1cy1ib3R0b21sZWZ0OiBweDsKLSAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiAycHggMnB4IHB4IHB4OwotICBib3JkZXItcmFkaXVzOiAycHggMnB4IHB4IHB4OyAKLSAgYm9yZGVyLXRvcDogc29saWQgMXB4ICNlYmViZWI7Ci0gIGJvcmRlci1sZWZ0OiBzb2xpZCAxcHggI2ViZWJlYjsKLSAgYm9yZGVyLXJpZ2h0OiBzb2xpZCAxcHggI2ViZWJlYjsKLSAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjsKLSAgICBiYWNrZ3JvdW5kLWltYWdlOiAtd2Via2l0LWdyYWRpZW50KGxpbmVhciwgbGVmdCB0b3AsIGxlZnQgYm90dG9tLCBmcm9tKCNmZmZmZmYpLCB0bygjZmFmYWZhKSk7Ci0gICAgYmFja2dyb3VuZC1pbWFnZTogLXdlYmtpdC1saW5lYXItZ3JhZGllbnQodG9wLCAjZmZmZmZmLCAjZmFmYWZhKTsKLSAgICBiYWNrZ3JvdW5kLWltYWdlOiAtbW96LWxpbmVhci1ncmFkaWVudCh0b3AsICNmZmZmZmYsICNmYWZhZmEpOwotICAgIGJhY2tncm91bmQtaW1hZ2U6IC1tcy1saW5lYXItZ3JhZGllbnQodG9wLCAjZmZmZmZmLCAjZmFmYWZhKTsKLSAgICBiYWNrZ3JvdW5kLWltYWdlOiAtby1saW5lYXItZ3JhZGllbnQodG9wLCAjZmZmZmZmLCAjZmFmYWZhKTsKLSAgICBiYWNrZ3JvdW5kLWltYWdlOiBsaW5lYXItZ3JhZGllbnQodG9wLCAjZmZmZmZmLCAjZmFmYWZhKTsKLSAgICBmaWx0ZXI6IHByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5ncmFkaWVudChzdGFydENvbG9yU3RyPScjZmZmZmZmJywKLUVuZENvbG9yU3RyPScjZmFmYWZhJyk7Ci19Ci11bC50YWJzIGxpIGE6aG92ZXIgewotICBjb2xvcjogIzMzQjVFNTsgCi19Ci11bC50YWJzIGxpIGEuc2VsZWN0ZWQgewotICBoZWlnaHQ6IDM3cHg7Ci0gIGNvbG9yOiAjMzNCNUU1OwotICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjdmN2Y3OwotICBiYWNrZ3JvdW5kLWltYWdlOiBub25lOwotICBib3JkZXItY29sb3I6ICNkZGQ7Ci19Ci0udGFiLWNvbnRlbnQgewotICBwYWRkaW5nOiAxLjJlbTsKLSAgbWFyZ2luOiAtMXB4IDAgMmVtIDA7Ci0gIC13ZWJraXQtYm9yZGVyLXJhZGl1czogMnB4OwotICAgIC1tb3otYm9yZGVyLXJhZGl1czogMnB4OwotICAgIGJvcmRlci1yYWRpdXM6IDJweDsKLSAgYm9yZGVyOiBzb2xpZCAxcHggI2RkZDsKLSAgYmFja2dyb3VuZDogI2Y3ZjdmNzsKLX0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1GZWF0dXJlIEJveGVzCi0qLwotLmZlYXR1cmUtYm94IHsKLSAgd2lkdGg6IDI5MXB4OwotICBoZWlnaHQ6IDIwMHB4OwotICBwb3NpdGlvbjogcmVsYXRpdmU7Ci0gIGJhY2tncm91bmQ6ICNGN0Y3Rjc7Ci19Ci0uYm94LWJvcmRlciAudG9wLCAuYm94LWJvcmRlciAuYm90dG9tLCAuYm94LWJvcmRlciAubGVmdCwgLmJveC1ib3JkZXIgLnJpZ2h0IHsKLSAgei1pbmRleDogMTAwOwotICBwb3NpdGlvbjogYWJzb2x1dGU7Ci0gIGJhY2tncm91bmQtY29sb3I6ICNhYWE7Ci19Ci0uYm94LWJvcmRlciAudG9wLCAuYm94LWJvcmRlciAuYm90dG9tIHsKLSAgd2lkdGg6IDI5MXB4OwotICBoZWlnaHQ6IDFweDsKLX0KLS5kaWFsb2cgLmJveC1ib3JkZXIgLnRvcCwKLS5kaWFsb2cgLmJveC1ib3JkZXIgLmJvdHRvbSB7IHdpZHRoOjM5MXB4OyB9Ci0KLS5ib3gtYm9yZGVyIC5sZWZ0LCAuYm94LWJvcmRlciAucmlnaHQgeyAKLSAgd2lkdGg6IDFweDsKLSAgaGVpZ2h0OiA4cHg7ICAgIAotfQotLmJveC1ib3JkZXIgLnRvcCB7IHRvcDogMDsgbGVmdDogMCB9Ci0uYm94LWJvcmRlciAudG9wIC5sZWZ0IHsgdG9wOiAxcHg7IGxlZnQ6IDAgfQotLmJveC1ib3JkZXIgLnRvcCAucmlnaHQgeyB0b3A6IDFweDsgcmlnaHQ6IDAgfQotLmJveC1ib3JkZXIgLmJvdHRvbSAubGVmdCB7IHRvcDogLThweDsgbGVmdDogMCB9Ci0uYm94LWJvcmRlciAuYm90dG9tIHsgdG9wOiAyMDBweDsgbGVmdDogMCB9Ci0uYm94LWJvcmRlciAuYm90dG9tIC5yaWdodCB7IHRvcDogLThweDsgcmlnaHQ6IDAgfQotCi0uZmVhdHVyZS1ib3ggaDQsCi0uZGlhbG9nIGg0IHsKLSAgICBtYXJnaW46IDE1cHggMThweCAxMHB4OwotICAgIHBhZGRpbmc6MDsKLX0KLQotLmZlYXR1cmUtYm94IHAsCi0uZGlhbG9nIHAgewotICAgIG1hcmdpbjogMTBweCAxOHB4OwotICAgIHBhZGRpbmc6MDsKLX0KLS5mZWF0dXJlLWJveCAubGluaywKLS5kaWFsb2cgLmxpbmsgewotICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCAjZGVkZWRlOwotICAgIGJvdHRvbTogMDsKLSAgICBwb3NpdGlvbjogYWJzb2x1dGU7Ci0gICAgd2lkdGg6IGluaGVyaXQ7Ci19Ci0uZmVhdHVyZS1ib3ggYSwgLmZlYXR1cmUtYm94IGg0LAotLmRpYWxvZyBhLCAuZGlhbG9nIGg0IHsKLSAgICAtd2Via2l0LXRyYW5zaXRpb246IGNvbG9yIC40cyBlYXNlOwotICAgIC1tb3otdHJhbnNpdGlvbjogY29sb3IgLjRzIGVhc2U7Ci0gICAgLW8tdHJhbnNpdGlvbjogY29sb3IgLjRzIGVhc2U7Ci0gICAgdHJhbnNpdGlvbjogY29sb3IgLjRzIGVhc2U7Ci19Ci0uZmVhdHVyZS1ib3g6aG92ZXIgewotICBjdXJzb3I6IHBvaW50ZXI7ICAKLX0KLS5mZWF0dXJlLWJveDpob3ZlciAuYm94LWJvcmRlciAudG9wLCAuZmVhdHVyZS1ib3g6aG92ZXIgLmJveC1ib3JkZXIgLmJvdHRvbSwgLmZlYXR1cmUtYm94OmhvdmVyCi0ubGVmdCwgLmZlYXR1cmUtYm94OmhvdmVyIC5yaWdodCB7ICAKLSAgYmFja2dyb3VuZC1jb2xvcjogIzMzQjVFNTsKLX0KLS5mZWF0dXJlLWJveDpob3ZlciBoNCwgLmZlYXR1cmUtYm94OmhvdmVyIGEgewotICBjb2xvcjogIzMzQjVFNTsKLX0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1QYWdlLVNwZWNpZmljIFN0eWxlcwotKi8KLS5jb2xvcnMgeyAKLSAgcG9zaXRpb246IHJlbGF0aXZlOwotICBmbG9hdDogbGVmdDsKLSAgd2lkdGg6IDkycHg7Ci0gIG1hcmdpbjogNDBweCAwIDIwcHg7Ci19Ci0uY29sb3JzIGRpdiB7Ci0gIGNvbG9yOiAjZmZmOwotICBmb250LXNpemU6IDExLjVweDsKLSAgd2lkdGg6IDgycHg7Ci0gIGhlaWdodDogODJweDsKLSAgbWFyZ2luLXRvcDotMzBweDsKLSAgbGluZS1oZWlnaHQ6IDgycHg7Ci0gIHRleHQtYWxpZ246IGNlbnRlcjsKLSAgYm9yZGVyOiBzb2xpZCA1cHggI2ZmZjsKLSAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiA1MCU7Ci0gIC1tb3otYm9yZGVyLXJhZGl1czogNTAlOwotICBib3JkZXItcmFkaXVzOiA1MCU7Ci19Ci0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotLyogIyMjIyMjIyMjIyMgUkVGRVJFTkNFIERPQ1MgIyMjIyMjIyMjIyMjIyMjIyMjICovCi0KLSNwYWNrYWdlcy1uYXYgaDIsCi0jY2xhc3Nlcy1uYXYgaDIgewotICBmb250LXNpemU6MThweDsKLSAgbWFyZ2luOjA7Ci0gIHBhZGRpbmc6MCAwIDAgNHB4OwotfQotCi0jamQtaGVhZGVyIHsKLSAgcGFkZGluZzogMCAwIDVweDsKLSAgbWFyZ2luOiAyMHB4IDAgMTBweDsKLSAgZm9udC1zaXplOjEzcHg7Ci0gIGJvcmRlci1ib3R0b206c29saWQgMXB4ICNjY2M7Ci19Ci0KLSNqZC1oZWFkZXIgaDEgewotICBtYXJnaW46MDsKLSAgcGFkZGluZzowOwotfQotCi0vKiBwYWdlLXRvcC1yaWdodCBjb250YWluZXIgZm9yIHJlZmVyZW5jZSBwYWdlcyAoaG9sZHMKLWxpbmtzIHRvIHN1bW1hcnkgdGFibGVzKSAqLwotI2FwaS1pbmZvLWJsb2NrIHsKLSAgZm9udC1zaXplOjEzcHg7Ci0gIG1hcmdpbjoyMHB4IDAgMDsKLSAgcGFkZGluZzowIDEwcHggNnB4OwotICBmb250LXdlaWdodDpub3JtYWw7Ci0gIGZsb2F0OnJpZ2h0OwotICB0ZXh0LWFsaWduOnJpZ2h0OwotICBjb2xvcjojOTk5OwotICBtYXgtd2lkdGg6NzAlOwotfQotCi0jYXBpLWluZm8tYmxvY2sgZGl2LmFwaS1sZXZlbCB7Ci0gIGZvbnQtd2VpZ2h0OmJvbGQ7Ci0gIGZvbnQtc2l6ZTppbmhlcml0OwotICBmbG9hdDpub25lOwotICBjb2xvcjojMjIyOwotICBwYWRkaW5nOjA7Ci0gIG1hcmdpbjowOwotfQotCi0vKiBpbmhlcml0YW5jZSB0YWJsZSAqLwotLmpkLWluaGVyaXRhbmNlLXRhYmxlIHsKLSAgYm9yZGVyLXNwYWNpbmc6MDsKLSAgbWFyZ2luOjA7Ci0gIHBhZGRpbmc6MDsKLSAgZm9udC1zaXplOjEzcHg7Ci0gIGJhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7Ci19Ci0uamQtaW5oZXJpdGFuY2UtdGFibGUgdHIgdGQgewotICBib3JkZXI6IG5vbmU7Ci0gIG1hcmdpbjogMDsKLSAgcGFkZGluZzogMDsKLSAgYmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDsKLX0KLS5qZC1pbmhlcml0YW5jZS10YWJsZSAuamQtaW5oZXJpdGFuY2Utc3BhY2UgewotICBmb250LXdlaWdodDpib2xkOwotICB3aWR0aDoxZW07Ci19Ci0uamQtaW5oZXJpdGFuY2UtdGFibGUgLmpkLWluaGVyaXRhbmNlLWludGVyZmFjZS1jZWxsIHsKLSAgcGFkZGluZy1sZWZ0OiAxN3B4OwotfQotCi0KLQotLmpkLXN1bXRhYmxlIGEgewotICB0ZXh0LWRlY29yYXRpb246bm9uZTsKLX0KLQotLmpkLXN1bXRhYmxlIGE6aG92ZXIgewotICB0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lOwotfQotCi0vKiB0aGUgbGluayBpbnNpZGUgYSBzdW10YWJsZSBmb3IgIlNob3cgQWxsL0hpZGUgQWxsIiAqLwotLnRvZ2dsZS1hbGwgewotICBkaXNwbGF5OmJsb2NrOwotICBmbG9hdDpyaWdodDsKLSAgZm9udC13ZWlnaHQ6bm9ybWFsOwotICBmb250LXNpemU6MC45ZW07Ci19Ci0KLS8qIGFkanVzdG1lbnRzIGZvciBpbi9kaXJlY3Qgc3ViY2xhc3NlcyB0YWJsZXMgKi8KLS5qZC1zdW10YWJsZS5qZC1zdW10YWJsZS1zdWJjbGFzc2VzIHsKLSAgbWFyZ2luOiAxZW0gMCAwIDA7Ci0gIG1heC13aWR0aDo5NjhweDsKLSAgYmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDsKLSAgZm9udC1zaXplOjEzcHg7Ci19Ci0KLS8qIGV4dHJhIHNwYWNlIGJldHdlZW4gZW5kIG9mIG1ldGhvZCBuYW1lIGFuZCBvcGVuLXBhcmVuICovCi0uc3ltcGFkIHsKLSAgbWFyZ2luLXJpZ2h0OiAycHg7Ci19Ci0KLS8qIHJpZ2h0IGFsaWdubWVudCBmb3IgdGhlIHJldHVybiB0eXBlIGluIHN1bXRhYmxlICovCi0uamQtc3VtdGFibGUgLmpkLXR5cGVjb2wgewotICB0ZXh0LWFsaWduOnJpZ2h0OwotfQotCi0vKiBhZGp1c3RtZW50cyBmb3IgdGhlIGV4cGFuZG8gdGFibGUtaW4tdGFibGUgKi8KLS5qZC1zdW10YWJsZS1leHBhbmRvIHsKLSAgbWFyZ2luOi41ZW0gMDsKLSAgcGFkZGluZzowOwotfQotCi0vKiBhIGRpdiB0aGF0IGhvbGRzIGEgc2hvcnQgZGVzY3JpcHRpb24gKi8KLS5qZC1kZXNjcmRpdiB7Ci0gIHBhZGRpbmc6M3B4IDFlbSAwIDFlbTsKLSAgbWFyZ2luOjA7Ci0gIGJvcmRlcjowOwotfQotCi0jamQtY29udGVudCBpbWcuamQtZXhwYW5kby10cmlnZ2VyLWltZyB7Ci0gIHBhZGRpbmc6MCA0cHggNHB4IDA7Ci0gIG1hcmdpbjowOwotfQotCi0uamQtc3VtdGFibGUtc3ViY2xhc3NlcyBkaXYjc3ViY2xhc3Nlcy1kaXJlY3QsCi0uamQtc3VtdGFibGUtc3ViY2xhc3NlcyBkaXYjc3ViY2xhc3Nlcy1pbmRpcmVjdCB7Ci0gIG1hcmdpbjowIDAgMCAxM3B4OwotfQotCi0KLQotLyoqKioqKioqKiBNRU1CRVIgUkVGICoqKioqKioqKioqKiovCi0KLQotLmpkLWRldGFpbHMgewotLyogIGJvcmRlcjoxcHggc29saWQgIzY2OTk5OTsKLSAgcGFkZGluZzo0cHg7ICovCi0gIG1hcmdpbjowIDAgMWVtOwotfQotCi0vKiBBUEkgcmVmZXJlbmNlOiBhIGNvbnRhaW5lciBmb3IgdGhlCi0udGFnZGF0YSBibG9ja3MgdGhhdCBtYWtlIHVwIHRoZSBkZXRhaWxlZAotZGVzY3JpcHRpb24gKi8KLS5qZC1kZXRhaWxzLWRlc2NyIHsKLSAgcGFkZGluZzowOwotICBtYXJnaW46LjVlbSAuMjVlbTsKLX0KLQotLyogQVBJIHJlZmVyZW5jZTogYSBibG9jayBjb250YWluaW5nCi1hIGRldGFpbGVkIGRlc2NyaXB0aW9uLCBhIHBhcmFtcyB0YWJsZSwKLXNlZWFsc28gbGlzdCwgZXRjICovCi0uamQtdGFnZGF0YSB7Ci0gIG1hcmdpbjouNWVtIDFlbTsKLX0KLQotLmpkLXRhZ2RhdGEgcCB7Ci0gIG1hcmdpbjowIDAgMWVtIDFlbTsKLX0KLQotLyogQVBJIHJlZmVyZW5jZTogYWRqdXN0bWVudHMgdG8KLXRoZSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBibG9jayAqLwotLmpkLXRhZ2Rlc2NyIHsKLSAgbWFyZ2luOi4yNWVtIDAgLjc1ZW0gMDsKLX0KLQotLmpkLXRhZ2Rlc2NyIG9sLAotLmpkLXRhZ2Rlc2NyIHVsIHsKLSAgbWFyZ2luOjAgMi41ZW07Ci0gIHBhZGRpbmc6MDsKLX0KLQotLmpkLXRhZ2Rlc2NyIHRhYmxlLAotLmpkLXRhZ2Rlc2NyIGltZyB7Ci0gIG1hcmdpbjouMjVlbSAxZW07Ci19Ci0KLS5qZC10YWdkZXNjciBsaSB7Ci1tYXJnaW46MCAwIC4yNWVtIDA7Ci1wYWRkaW5nOjA7Ci19Ci0KLS8qIEFQSSByZWZlcmVuY2U6IGhlYWRpbmcgbWFya2luZwotdGhlIGRldGFpbHMgc2VjdGlvbiBmb3IgY29uc3RhbnRzLAotYXR0cnMsIG1ldGhvZHMsIGV0Yy4gKi8KLWg0LmpkLWRldGFpbHMtdGl0bGUgewotICBmb250LXNpemU6MS4xNWVtOwotICBiYWNrZ3JvdW5kLWNvbG9yOiAjRTJFMkUyOwotICBtYXJnaW46MS41ZW0gMCAuNmVtOwotICBwYWRkaW5nOjNweCA5NXB4IDNweCAzcHg7IC8qIHJvb20gZm9yIGFwaS1sZXZlbCAqLwotfQotYm9keS5nb29nbGUgaDQuamQtZGV0YWlscy10aXRsZSB7Ci0gIGJhY2tncm91bmQtY29sb3I6ICNGRkY7Ci0gIHBhZGRpbmctdG9wOjVweDsKLSAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNjY2M7Ci19Ci1ib2R5Lmdvb2dsZSB0YWJsZS5qZC1zdW10YWJsZSB0aCB7Ci0gIGJhY2tncm91bmQtY29sb3I6ICNGRkY7Ci0gIGNvbG9yOiMwMDA7Ci19Ci0KLWg0LmpkLXRhZ3RpdGxlIHsKLSAgbWFyZ2luOjA7Ci19Ci0KLWg0IC5ub3JtYWwgewotICBmb250LXdlaWdodDpub3JtYWw7Ci19Ci0KLS8qIEFQSSByZWZlcmVuY2U6IGhlYWRpbmcgZm9yICJQYXJhbWV0ZXJzIiwgIlNlZSBBbHNvIiwgZXRjLiwKLWluIGRldGFpbHMgc2VjdGlvbnMgKi8KLWg1LmpkLXRhZ3RpdGxlIHsKLSAgbWFyZ2luOjAgMCAuMjVlbSAwOwotICBmb250LXNpemU6MWVtOwotfQotCi0uamQtdGFndGFibGUgewotICBtYXJnaW46MDsKLSAgYmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDsKLSAgd2lkdGg6YXV0bzsKLX0KLQotLmpkLXRhZ3RhYmxlIHRkLAotLmpkLXRhZ3RhYmxlIHRoIHsKLSAgYm9yZGVyOm5vbmU7Ci0gIGJhY2tncm91bmQtY29sb3I6I2ZmZjsKLSAgdmVydGljYWwtYWxpZ246dG9wOwotICBmb250LXdlaWdodDpub3JtYWw7Ci0gIHBhZGRpbmc6MnB4IDEwcHg7Ci19Ci0KLS5qZC10YWd0YWJsZSB0aCB7Ci0gIGZvbnQtc3R5bGU6aXRhbGljOwotfQotCi0vKiBJbmxpbmUgYXBpIGxldmVsIGluZGljYXRvciBmb3IgbWV0aG9kcyAqLwotZGl2LmFwaS1sZXZlbCB7Ci0gIGZvbnQtc2l6ZTouOGVtOwotICBmb250LXdlaWdodDpub3JtYWw7Ci0gIGNvbG9yOiM5OTk7Ci0gIGZsb2F0OnJpZ2h0OwotICBwYWRkaW5nOjAgOHB4IDA7Ci0gIG1hcmdpbi10b3A6LTMwcHg7Ci19Ci0KLXRhYmxlLmpkLXRhZ3RhYmxlIHRkLAotdGFibGUuamQtdGFndGFibGUgdGggewotICBiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50OwotfQotCi10YWJsZS5qZC10YWd0YWJsZSB0aCB7Ci0gIGNvbG9yOmluaGVyaXQ7Ci19Ci0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotLyogU0VBUkNIIEZJTFRFUiAqLwotCi0jc2VhcmNoX2F1dG9jb21wbGV0ZSB7Ci0gIGZvbnQtd2VpZ2h0Om5vcm1hbDsKLX0KLQotI3NlYXJjaF9maWx0ZXJlZF93cmFwcGVyIHsKLSAgd2lkdGg6IDE5M3B4OwotICBmbG9hdDogcmlnaHQ7Ci19Ci0jc2VhcmNoX2ZpbHRlcmVkX2RpdiB7Ci0gIHBvc2l0aW9uOmFic29sdXRlOwotICB6LWluZGV4Ojk5OTk7Ci0gIG1pbi13aWR0aDoxNzFweDsgLyogK3BhZGRpbmcgYW5kIGJvcmRlciBtYWtlcyB0aGlzIG1hdGNoIGlucHV0IHdpZHRoICovCi0gIHBhZGRpbmc6NXB4OwotICBib3JkZXI6IHNvbGlkIDFweCAjQzVDNUM1OwotICBiYWNrZ3JvdW5kOiB3aGl0ZTsKLSAgdG9wOiAzNXB4OwotICAtbW96LWJveC1zaGFkb3c6IDAgMCAxMHB4IHJnYmEoMCwwLDAsMC4yKTsKLSAgLXdlYmtpdC1ib3gtc2hhZG93OiAwIDAgMTBweCByZ2JhKDAsIDAsIDAsIDAuMik7Ci0gIGJveC1zaGFkb3c6IDAgMCAxMHB4IHJnYmEoMCwgMCwgMCwgMC4yKTsKLX0KLQotdWwjc2VhcmNoX2ZpbHRlcmVkIHsKLSAgbWluLXdpZHRoOjEwMCU7Ci0gIG1hcmdpbjowOwotICBsaXN0LXN0eWxlOiBub25lOwotICBtYXJnaW46IDA7Ci0gIHBhZGRpbmc6IDA7Ci19Ci0KLSNzZWFyY2hfZmlsdGVyZWQgLmpkLXNlbGVjdGVkIHsKLSAgYmFja2dyb3VuZC1jb2xvcjogIzMzQjVFNTsKLSAgY3Vyc29yOnBvaW50ZXI7Ci19Ci0jc2VhcmNoX2ZpbHRlcmVkIC5qZC1zZWxlY3RlZCwKLSNzZWFyY2hfZmlsdGVyZWQgLmpkLXNlbGVjdGVkIGEgewotICBjb2xvcjojZjdmN2Y3ICFpbXBvcnRhbnQ7Ci19Ci0KLS5uby1kaXNwbGF5IHsKLSAgZGlzcGxheTogbm9uZTsKLX0KLQotI3NlYXJjaF9maWx0ZXJlZCBsaS5qZC1hdXRvY29tcGxldGUgewotICBmb250LXNpemU6IDAuODFlbTsKLSAgYm9yZGVyOiBub25lOwotICBtYXJnaW46IDAgMCAycHg7Ci0gIHBhZGRpbmc6IDA7Ci0gIGxpbmUtaGVpZ2h0OjEuNWVtOwotfQotCi0jc2VhcmNoX2ZpbHRlcmVkIGxpIGEgewotICBwYWRkaW5nOjAgNXB4OwotICBjb2xvcjojMjIyICFpbXBvcnRhbnQ7Ci19Ci0KLSNzZWFyY2hfZmlsdGVyZWQgbGkuaGVhZGVyIHsKLSAgY29sb3I6I2FhYTsKLSAgZm9udC13ZWlnaHQ6Ym9sZDsKLSAgZm9udC1zaXplOiAwLjgxZW07Ci0gIGJvcmRlcjogbm9uZTsKLSAgbWFyZ2luOiA4cHggMCAycHg7Ci0gIHBhZGRpbmc6MXB4IDVweDsKLSAgbGluZS1oZWlnaHQ6MS41ZW07Ci19Ci0KLSNzZWFyY2hfZmlsdGVyZWQgbGkuaGVhZGVyOmZpcnN0LWNoaWxkIHsKLSAgbWFyZ2luOiAwIDAgMnB4OwotfQotCi0uc2hvdy1pdGVtIHsKLSAgZGlzcGxheTogdGFibGUtcm93OwotfQotLmhpZGUtaXRlbSB7Ci0gIGRpc3BsYXk6IGhpZGRlbjsKLX0KLQotCi0KLQotCi0vKiBTRUFSQ0ggUkVTVUxUUyAqLwotCi0KLSNsZWZ0U2VhcmNoQ29udHJvbCAuZ3NjLXR3aWRkbGUgewotICBiYWNrZ3JvdW5kLWltYWdlIDogbm9uZTsKLX0KLQotI2xlZnRTZWFyY2hDb250cm9sIHRkLCAjc2VhcmNoRm9ybSB0ZCB7Ci0gIGJvcmRlcjogMHB4IHNvbGlkICMwMDA7Ci0gIHBhZGRpbmc6MDsKLX0KLQotI2xlZnRTZWFyY2hDb250cm9sIC5nc2MtcmVzdWx0c0hlYWRlciAuZ3NjLXRpdGxlIHsKLSAgcGFkZGluZy1sZWZ0IDogMHB4OwotICBmb250LXdlaWdodCA6IGJvbGQ7Ci0gIGZvbnQtc2l6ZSA6IDEzcHg7Ci0gIGNvbG9yOiMwMDY2OTk7Ci0gIGRpc3BsYXkgOiBub25lOwotfQotCi0jbGVmdFNlYXJjaENvbnRyb2wgLmdzYy1yZXN1bHRzSGVhZGVyIGRpdi5nc2MtcmVzdWx0cy1zZWxlY3RvciB7Ci0gIGRpc3BsYXkgOiBub25lOwotfQotCi0jbGVmdFNlYXJjaENvbnRyb2wgLmdzYy1yZXN1bHRzUm9vdCB7Ci0gIHBhZGRpbmctdG9wIDogNnB4OwotfQotCi0jbGVmdFNlYXJjaENvbnRyb2wgZGl2LmdzLXZpc2libGVVcmwtbG9uZyB7Ci0gIGRpc3BsYXkgOiBibG9jazsKLSAgY29sb3I6IzAwNjY5OTsKLX0KLQotI2xlZnRTZWFyY2hDb250cm9sIC5nc2Mtd2ViUmVzdWx0IHsKLSAgcGFkZGluZzowIDAgMjBweCAwOwotfQotCi0uZ3NjLXdlYlJlc3VsdCBkaXYuZ3MtdmlzaWJsZVVybC1zaG9ydCwKLXRhYmxlLmdzYy1icmFuZGluZywKLS5nc2MtY2xlYXItYnV0dG9uIHsKLSAgZGlzcGxheSA6IG5vbmU7Ci19Ci0KLS5nc2MtY3Vyc29yLWJveCAuZ3NjLWN1cnNvciBkaXYuZ3NjLWN1cnNvci1wYWdlLAotLmdzYy1jdXJzb3ItYm94IC5nc2MtdHJhaWxpbmctbW9yZS1yZXN1bHRzIGEuZ3NjLXRyYWlsaW5nLW1vcmUtcmVzdWx0cywKLSNsZWZ0U2VhcmNoQ29udHJvbCBhLAotI2xlZnRTZWFyY2hDb250cm9sIGEgYiB7Ci0gIGNvbG9yOiMwMDY2OTk7Ci19Ci0KLS5nc2MtcmVzdWx0c0hlYWRlciB7Ci0gIGRpc3BsYXk6IG5vbmU7Ci19Ci0KLS8qIERpc2FibGUgYnVpbHQgaW4gc2VhcmNoIGZvcm1zICovCi0uZ3NjLWNvbnRyb2wgZm9ybS5nc2Mtc2VhcmNoLWJveCB7Ci0gIGRpc3BsYXkgOiBub25lOwotfQotdGFibGUuZ3NjLXNlYXJjaC1ib3ggewotICBtYXJnaW46NnB4IDAgMCAwOwotICBib3JkZXItY29sbGFwc2U6Y29sbGFwc2U7Ci19Ci0KLXRkLmdzYy1pbnB1dCB7Ci0gIHBhZGRpbmc6MCAycHg7Ci0gIHdpZHRoOjEwMCU7Ci0gIHZlcnRpY2FsLWFsaWduOm1pZGRsZTsKLX0KLQotaW5wdXQuZ3NjLWlucHV0IHsKLSAgYm9yZGVyOjFweCBzb2xpZCAjQkNDREYwOwotICB3aWR0aDo5OSU7Ci0gIHBhZGRpbmctbGVmdDoycHg7Ci0gIGZvbnQtc2l6ZTouOTVlbTsKLX0KLQotdGQuZ3NjLXNlYXJjaC1idXR0b24gewotICB0ZXh0LWFsaWduOiByaWdodDsKLSAgcGFkZGluZzowOwotICB2ZXJ0aWNhbC1hbGlnbjp0b3A7Ci19Ci0KLQotI3NlYXJjaFJlc3VsdHMgewotICBvdmVyZmxvdzpoaWRkZW47IC8qIGJlY2F1c2UgdGhlIHJlcG9zaXRpb25lZCBwYWdlIGxpbmtzIG1ha2VzIHRoZSBzZWN0aW9uIHRoaW5rIGl0IG5lZWRzIHRvIHNjcm9sbAotKGl0IGRvZXNuJ3QpICovCi0gIGhlaWdodDphdXRvOwotfQotCi0jc2VhcmNoUmVzdWx0cyAuZ3NjLWNvbnRyb2wgewotICBwb3NpdGlvbjpyZWxhdGl2ZTsKLSAgd2lkdGg6YXV0bzsKLSAgcGFkZGluZzowIDAgMTBweDsKLX0KLQotI3NlYXJjaFJlc3VsdHMgLmdzYy10YWJzQXJlYSB7Ci0gIHBvc2l0aW9uOnJlbGF0aXZlOwotICB3aGl0ZS1zcGFjZTpub3dyYXA7Ci0gIGZsb2F0OmxlZnQ7Ci0gIHdpZHRoOjIwMHB4OwotfQotCi0jc2VhcmNoUmVzdWx0cyAuZ3NjLWFib3ZlLXdyYXBwZXItYXJlYSB7Ci0gIGRpc3BsYXk6bm9uZTsKLX0KLQotI3NlYXJjaFJlc3VsdHMgLmdzYy1yZXN1bHRzYm94LXZpc2libGUgewotICBmbG9hdDpsZWZ0OwotICB3aWR0aDo3MjBweDsKLSAgbWFyZ2luLWxlZnQ6MjBweDsKLX0KLQotI3NlYXJjaFJlc3VsdHMgLmdzYy10YWJIZWFkZXIgewotICBwYWRkaW5nOiAzcHggNnB4OwotICBwb3NpdGlvbjpyZWxhdGl2ZTsKLSAgd2lkdGg6YXV0bzsKLSAgZGlzcGxheTpibG9jazsKLX0KLQotI3NlYXJjaFJlc3VsdHMgaDIjc2VhcmNoVGl0bGUgewotICBwYWRkaW5nOjA7Ci0gIG1hcmdpbjo1cHggMDsKLSAgYm9yZGVyOm5vbmU7Ci19Ci0KLSNzZWFyY2hSZXN1bHRzIGgyI3NlYXJjaFRpdGxlIGVtIHsKLSAgZm9udC1zdHlsZTpub3JtYWw7Ci0gIGNvbG9yOiMzM0I1RTU7Ci19Ci0KLSNzZWFyY2hSZXN1bHRzIC5nc2MtdGFibGUtcmVzdWx0IHsKLSAgbWFyZ2luOjVweCAwIDEwcHggMDsKLSAgYmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDsKLX0KLSNzZWFyY2hSZXN1bHRzIC5ncy13ZWItaW1hZ2UtYm94LCAuZ3MtcHJvbW90aW9uLWltYWdlLWJveCB7Ci0gIHdpZHRoOjEyMHB4OwotfQotI3NlYXJjaFJlc3VsdHMgLmdzLXdlYi1pbWFnZS1ib3ggaW1nLmdzLWltYWdlLCAuZ3MtcHJvbW90aW9uLWltYWdlLWJveCBpbWcuZ3MtcHJvbW90aW9uLWltYWdlIHsKLSAgbWF4LXdpZHRoOjEyMHB4OwotfQotCi0jc2VhcmNoUmVzdWx0cyAuZ3NjLXRhYmxlLXJlc3VsdCAuZ3NjLXRodW1ibmFpbCB7Ci0gIHBhZGRpbmc6MCAyMHB4IDAgMDsKLX0KLQotI3NlYXJjaFJlc3VsdHMgdGQgewotICBiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50OwotfQotCi0jc2VhcmNoUmVzdWx0cyAuZ3NjLWV4cGFuc2lvbkFyZWEgewotICBwb3NpdGlvbjpyZWxhdGl2ZTsKLX0KLSNzZWFyY2hSZXN1bHRzIC5nc2MtdGFic0FyZWEgLmdzYy1jdXJzb3ItYm94IHsKLSAgd2lkdGg6MjAwcHg7Ci0gIHBhZGRpbmc6MjBweCAwIDAgMXB4OwotfQotI3NlYXJjaFJlc3VsdHMgLmdzYy1jdXJzb3ItcGFnZSB7Ci0gIGRpc3BsYXk6aW5saW5lLWJsb2NrOwotICBmbG9hdDpsZWZ0OwotICBtYXJnaW46LTFweCAwIDAgLTFweDsKLSAgcGFkZGluZzowOwotICBoZWlnaHQ6MjdweDsKLSAgd2lkdGg6MjdweDsKLSAgdGV4dC1hbGlnbjpjZW50ZXI7Ci0gIGxpbmUtaGVpZ2h0OjI7Ci19Ci0KLSNzZWFyY2hSZXN1bHRzIC5nc2MtdGFiSGVhZGVyLmdzYy10YWJoSW5hY3RpdmUsCi0jc2VhcmNoUmVzdWx0cyAuZ3NjLWN1cnNvci1wYWdlIHsKLSAgdGV4dC1kZWNvcmF0aW9uOm5vbmU7Ci0gIGNvbG9yOiMyNThBQUY7Ci0gIGJvcmRlcjogc29saWQgMXB4ICNEQURBREE7Ci19Ci0KLSNzZWFyY2hSZXN1bHRzIC5nc2MtdGFiSGVhZGVyLmdzYy10YWJoSW5hY3RpdmU6aG92ZXIsCi0jc2VhcmNoUmVzdWx0cyAuZ3NjLWN1cnNvci1wYWdlOmhvdmVyIHsKLSAgYm9yZGVyLWNvbG9yOiAjREJEQkRCOwotICBiYWNrZ3JvdW5kLWNvbG9yOiAjRjNGM0YzOwotICBiYWNrZ3JvdW5kLWltYWdlOiAtd2Via2l0LWdyYWRpZW50KGxpbmVhciwgbGVmdCB0b3AsIGxlZnQgYm90dG9tLCBmcm9tKCNGOUY5RjkpLCB0bygjRUNFQ0VDKSk7Ci0gIGJhY2tncm91bmQtaW1hZ2U6IC13ZWJraXQtbGluZWFyLWdyYWRpZW50KHRvcCwgI0Y5RjlGOSwgI0VDRUNFQyk7Ci0gIGJhY2tncm91bmQtaW1hZ2U6IC1tb3otbGluZWFyLWdyYWRpZW50KHRvcCwgI0Y5RjlGOSwgI0VDRUNFQyk7Ci0gIGJhY2tncm91bmQtaW1hZ2U6IC1tcy1saW5lYXItZ3JhZGllbnQodG9wLCAjRjlGOUY5LCAjRUNFQ0VDKTsKLSAgYmFja2dyb3VuZC1pbWFnZTogLW8tbGluZWFyLWdyYWRpZW50KHRvcCwgI0Y5RjlGOSwgI0VDRUNFQyk7Ci0gIGJhY2tncm91bmQtaW1hZ2U6IGxpbmVhci1ncmFkaWVudCh0b3AsICNGOUY5RjksICNFQ0VDRUMpOwotICBmaWx0ZXI6IHByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5ncmFkaWVudChzdGFydENvbG9yU3RyPScjZjlmOWY5JywKLUVuZENvbG9yU3RyPScjZWNlY2VjJyk7Ci0gIGNvbG9yOiAjMzNCNUU1OwotfQotCi0jc2VhcmNoUmVzdWx0cyAuZ3NjLXRhYkhlYWRlci5nc2MtdGFiaEFjdGl2ZSwKLSNzZWFyY2hSZXN1bHRzIC5nc2MtdGFiSGVhZGVyLmdzYy10YWJoQWN0aXZlOmhvdmVyLAotI3NlYXJjaFJlc3VsdHMgLmdzYy1jdXJzb3ItcGFnZS5nc2MtY3Vyc29yLWN1cnJlbnQtcGFnZSwKLSNzZWFyY2hSZXN1bHRzIC5nc2MtY3Vyc29yLXBhZ2UuZ3NjLWN1cnNvci1jdXJyZW50LXBhZ2U6aG92ZXIgewotICBjb2xvcjojZmZmOwotICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDlDOwotICBiYWNrZ3JvdW5kLWltYWdlOiAtd2Via2l0LWdyYWRpZW50KGxpbmVhciwgbGVmdCB0b3AsIGxlZnQgYm90dG9tLCBmcm9tKCMyRkFEREIpLCB0bygjMDlDKSk7Ci0gIGJhY2tncm91bmQtaW1hZ2U6IC13ZWJraXQtbGluZWFyLWdyYWRpZW50KHRvcCwgIzJGQUREQiwgIzA5Qyk7Ci0gIGJhY2tncm91bmQtaW1hZ2U6IC1tb3otbGluZWFyLWdyYWRpZW50KHRvcCwgIzJGQUREQiwgIzA5Qyk7Ci0gIGJhY2tncm91bmQtaW1hZ2U6IC1tcy1saW5lYXItZ3JhZGllbnQodG9wLCAjMkZBRERCLCAjMDlDKTsKLSAgYmFja2dyb3VuZC1pbWFnZTogLW8tbGluZWFyLWdyYWRpZW50KHRvcCwgIzJGQUREQiwgIzA5Qyk7Ci0gIGJhY2tncm91bmQtaW1hZ2U6IGxpbmVhci1ncmFkaWVudCh0b3AsICMyRkFEREIsICMwOUMpOwotICBmaWx0ZXI6IHByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5ncmFkaWVudChzdGFydENvbG9yU3RyPScjMmZhZGRiJywgRW5kQ29sb3JTdHI9JyMwOWMnKTsKLSAgYm9yZGVyOiAxcHggc29saWQgIzM5OTBBQjsKLSAgei1pbmRleDoxMDA7Ci19Ci0KLX0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotLyoqKioqKioqKioqIFBSRVZJT1VTTFkgZGFjLXN0eWxlcy5jc3MgKioqKioqKioqKioqKioqLwotCi0KLSNoZWFkZXIgewotICBib3JkZXItYm90dG9tOjA7Ci19Ci0KLSNoZWFkZXIgLndyYXAgewotICBtYXgtd2lkdGg6OTQwcHg7Ci0gIGhlaWdodDo0MXB4OwotICBib3JkZXItYm90dG9tOjFweCBzb2xpZDsKLSAgYm9yZGVyLWNvbG9yOiAjY2NjOwotICBwb3NpdGlvbjpyZWxhdGl2ZTsKLX0KLQotLmFib3V0ICNoZWFkZXIgLndyYXAgewotICBib3JkZXItY29sb3I6ICM5OTMzQ0M7Ci19Ci0KLS5kZXNpZ24gI2hlYWRlciAud3JhcCB7Ci0gIGJvcmRlci1jb2xvcjogIzMzYjVlNTsKLX0KLQotLy8gRnVkZ2luZyB0aGlzIHNvIFNBQyBsb29rcyBPSwotLmRldmVsb3AgI2hlYWRlciAud3JhcCB7Ci0gIGJvcmRlci1jb2xvcjogI0NDQzsKLX0KLQotLmRpc3RyaWJ1dGUgI2hlYWRlciAud3JhcCB7Ci0gIGJvcmRlci1jb2xvcjogIzlDMDsKLX0KLQotLmxvZ28gYSB7Ci0gIHdpZHRoOjEyM3B4OwotICBmbG9hdDpsZWZ0OwotfQotCi0jaGVhZGVyIC5sb2dvIHsKLSAgbWFyZ2luLXRvcDogLTZweDsKLSAgbWFyZ2luLWxlZnQ6IDBweDsKLSAgbWFyZ2luLWJvdHRvbTowcHg7Ci0gIHdpZHRoOiAxNjBweDsKLSAgcGFkZGluZy1yaWdodDoxMHB4OwotfQotCi0jaGVhZGVyIC5zYWNsb2dvIHsKLSAgbWFyZ2luLXRvcDogLTNweDsKLSAgbWFyZ2luLWxlZnQ6IDBweDsKLSAgbWFyZ2luLWJvdHRvbTogMHB4OwotICBtYXJnaW4tcmlnaHQ6IDMwcHg7Ci0gIHdpZHRoOiAxNDBweDsKLSAgcGFkZGluZy1yaWdodDowcHg7Ci0gIGJvcmRlci1yaWdodDoxcHggc29saWQgI0NDQzsKLX0KLQotLnNlYXJjaCB7Ci0gIGhlaWdodDoyNXB4OwotICBtYXJnaW4tdG9wOiAtM3B4OwotICBtYXJnaW4tYm90dG9tOiAwcHg7Ci19Ci0KLQotCi0vKiBRdWlja25hdiAqLwotLmJ0bi1xdWlja25hdiB7Ci0gIHdpZHRoOjIwcHg7Ci0gIGhlaWdodDoyOHB4OwotICBmbG9hdDpsZWZ0OwotICBtYXJnaW4tbGVmdDo2cHg7Ci0gIHBhZGRpbmctcmlnaHQ6MTBweDsKLSAgcG9zaXRpb246cmVsYXRpdmU7Ci0gIGN1cnNvcjpwb2ludGVyOwotICBib3JkZXItcmlnaHQ6MXB4IHNvbGlkICNDQ0M7Ci19Ci0KLS5idG4tcXVpY2tuYXYgYSB7Ci0gIHpvb206MTsKLSAgcG9zaXRpb246YWJzb2x1dGU7Ci0gIHRvcDoxM3B4OwotICBsZWZ0OjVweDsKLSAgZGlzcGxheTpibG9jazsKLSAgdGV4dC1pbmRlbnQ6LTk5OTllbTsKLSAgd2lkdGg6MTBweDsKLSAgaGVpZ2h0OjVweDsKLSAgYmFja2dyb3VuZDp1cmwoLi4vaW1hZ2VzL3F1aWNrbmF2X2Fycm93LnBuZykgbm8tcmVwZWF0OwotfQotCi0uYnRuLXF1aWNrbmF2IGEuYXJyb3ctYWN0aXZlIHsKLSAgYmFja2dyb3VuZC1wb3NpdGlvbjogMCAtNXB4OwotICBkaXNwbGF5Om5vbmU7Ci19Ci0KLSNoZWFkZXItd3JhcC5xdWlja25hdiBhLmFycm93LWluYWN0aXZlIHsKLSAgZGlzcGxheTpub25lOwotfQotCi0uYnRuLXF1aWNrbmF2LmFjdGl2ZSBhLmFycm93LWFjdGl2ZSB7Ci0gIGRpc3BsYXk6YmxvY2s7Ci19Ci0KLS5uYXYteCBsaSB7Ci0gIGRpc3BsYXk6YmxvY2s7Ci0gIGZsb2F0OmxlZnQ7Ci0gIG1hcmdpbi1yaWdodDo0NXB4OwotICAtd2Via2l0LXRyYW5zaXRpb246IGFsbCAwLjI1cyBsaW5lYXI7Ci0gICAgICAtbW96LXRyYW5zaXRpb246IGFsbCAwLjI1cyBsaW5lYXI7Ci0gICAgICAgLW1zLXRyYW5zaXRpb246IGFsbCAwLjI1cyBsaW5lYXI7Ci0gICAgICAgIC1vLXRyYW5zaXRpb246IGFsbCAwLjI1cyBsaW5lYXI7Ci0gICAgICAgICAgIHRyYW5zaXRpb246IGFsbCAwLjI1cyBsaW5lYXI7Ci19Ci0KLSNoZWFkZXItd3JhcC5xdWlja25hdiAubmF2LXggbGkgewotICBtaW4td2lkdGg6MTYwcHg7Ci0gIG1hcmdpbi1yaWdodDoyMHB4OwotfQotCi0jaGVhZGVyLXdyYXAucXVpY2tuYXYgbGkubGFzdCB7Ci0gIG1hcmdpbi1yaWdodDowcHg7Ci19Ci0KLSNxdWlja25hdiB7Ci0gZmxvYXQ6bm9uZTsgCi0gY2xlYXI6Ym90aDsKLSBtYXJnaW4tbGVmdDoxODBweDsKLSBtYXJnaW4tdG9wOi0zMHB4OwotIGRpc3BsYXk6bm9uZTsKLSBvdmVyZmxvdzpoaWRkZW47Ci19Ci0KLSNoZWFkZXItd3JhcC5xdWlja25hdiAjcXVpY2tuYXYgewotCi19Ci0KLSNxdWlja25hdiB1bCB7Ci0gIG1hcmdpbjoxMHB4IDA7Ci0gIHBhZGRpbmc6MDsKLX0KLQotI3F1aWNrbmF2IHVsIGxpLmRlc2lnbiB7Ci0gIGJvcmRlci10b3A6MXB4IHNvbGlkICMzM2I1ZTU7Ci19Ci0KLSNxdWlja25hdiB1bCBsaS5kZXZlbG9wIHsKLSAgYm9yZGVyLXRvcDoxcHggc29saWQgI0ZGODgwMDsKLX0KLQotI3F1aWNrbmF2IHVsIGxpLmRpc3RyaWJ1dGUgewotICBib3JkZXItdG9wOjFweCBzb2xpZCAjOTljYzAwOwotfQotCi0jcXVpY2tuYXYgdWwgbGkgewotICBkaXNwbGF5OmJsb2NrOwotICBmbG9hdDpsZWZ0OwotICBtYXJnaW46MCAyMHB4IDAgMDsKLSAgbWluLXdpZHRoOjE0MHB4OwotfQotCi0jcXVpY2tuYXYgdWwgbGkubGFzdCB7Ci0gIG1hcmdpbi1yaWdodDowcHg7Ci19Ci0KLSNxdWlja25hdiB1bCBsaSB1bCBsaSB7Ci0gIGZsb2F0Om5vbmU7Ci19Ci0KLSNxdWlja25hdiB1bCBsaSB1bCBsaSBhIHsKLSAgY29sb3I6IzIyMjsKLX0KLQotI3F1aWNrbmF2IHVsIGxpIGxpIHVsLAotI3F1aWNrbmF2IHVsIGxpIGxpIHVsIGxpIHsKLSAgbWFyZ2luOjA7Ci19Ci0KLSNxdWlja25hdiB1bCBsaSBsaSB1bCBsaTpiZWZvcmUgewotICBjb250ZW50OiJcMjFCMyI7Ci19Ci0KLSNoZWFkZXItd3JhcCB7Ci0gICAtd2Via2l0LXRyYW5zaXRpb246IGFsbCAwLjI1cyBlYXNlLW91dDsKLSAgICAgIC1tb3otdHJhbnNpdGlvbjogYWxsIDAuMjVzIGVhc2Utb3V0OwotICAgICAgIC1tcy10cmFuc2l0aW9uOiBhbGwgMC4yNXMgZWFzZS1vdXQ7Ci0gICAgICAgIC1vLXRyYW5zaXRpb246IGFsbCAwLjI1cyBlYXNlLW91dDsKLSAgICAgICAgICAgdHJhbnNpdGlvbjogYWxsIDAuMjVzIGVhc2Utb3V0OwotCi19Ci0KLSNoZWFkZXItd3JhcC5xdWlja25hdiB7Ci0gIGhlaWdodDoxOTZweDsKLSAgCi19Ci0KLS8qIFNFQVJDSCBBTkQgTU9SRSAqLwotLnNlYXJjaCB7Ci0gIHBvc2l0aW9uOiBhYnNvbHV0ZTsKLSAgd2lkdGg6IDUwcHg7Ci0gIGhlaWdodDoyOHB4OwotICBkaXNwbGF5OiBibG9jazsKLSAgbWFyZ2luLXRvcDotM3B4OwotICBtYXJnaW4tYm90dG9tOjdweDsKLSAgb3ZlcmZsb3c6aGlkZGVuOwotICB6LWluZGV4OjEwMDsKLSAgcmlnaHQ6NTRweDsKLSAgLXdlYmtpdC10cmFuc2l0aW9uOiB3aWR0aCAwLjRzIGVhc2U7Ci0gICAgIC1tb3otdHJhbnNpdGlvbjogd2lkdGggMC40cyBlYXNlOwotICAgICAgIC1vLXRyYW5zaXRpb246IHdpZHRoIDAuNHMgZWFzZTsKLSAgICAgICAgICB0cmFuc2l0aW9uOiB3aWR0aCAwLjRzIGVhc2U7Ci19Ci0KLS5zZWFyY2ggI3NlYXJjaC1idG4gewotICB3aWR0aDo1MHB4OwotICBoZWlnaHQ6MjhweDsKLSAgYmFja2dyb3VuZDp1cmwoLi4vaW1hZ2VzL2ljb25fc2VhcmNoLnBuZykgbm8tcmVwZWF0OwotICBmbG9hdDpsZWZ0OwotfQotCi0uc2VhcmNoLWlubmVyIHsKLSAgd2lkdGg6MjQ1cHg7Ci19Ci0KLS5zZWFyY2g6aG92ZXIsIC5zZWFyY2guYWN0aXZlIHsKLSAgd2lkdGg6MjQ1cHg7Ci19Ci0KLS5zZWFyY2ggLmJvdHRvbSwgLnNlYXJjaCAubGVmdCwgLnNlYXJjaCAucmlnaHQgewotICBwb3NpdGlvbjogYWJzb2x1dGU7Ci0gIGJhY2tncm91bmQtY29sb3I6ICNhMmEyYTIKLX0KLQotLnNlYXJjaCAuYm90dG9tIHsKLSAgd2lkdGg6IDIxNHB4OwotICBoZWlnaHQ6IDFweDsKLSAgdG9wOiAyNHB4OwotICBsZWZ0OiAwCi19Ci0KLS5zZWFyY2ggLmxlZnQsIC5zZWFyY2ggLnJpZ2h0IHsgCi0gIGhlaWdodDogNXB4OwotICB3aWR0aDogMXB4Ci19Ci0KLS5zZWFyY2ggLmxlZnQgewotICB0b3A6IDIycHg7Ci0gIGxlZnQ6IDU2cHg7Ci0gIGJhY2tncm91bmQtY29sb3I6I0NDQzsKLX0KLQotLnNlYXJjaCAucmlnaHQgewotICB0b3A6IDIycHg7Ci0gIGxlZnQ6IDIzOHB4OwotICBiYWNrZ3JvdW5kLWNvbG9yOiNDQ0M7Ci19Ci0KLS5zZWFyY2ggZm9ybSB7Ci0gIG1hcmdpbi10b3A6IDJweDsKLSAgd2lkdGg6IDE2MnB4OwotICBmbG9hdDpsZWZ0OwotfQotCi0uc2VhcmNoIGZvcm0gaW5wdXQgewotICBjb2xvcjogIzJmMmYyZjsKLSAgZm9udC1zaXplOiAwLjk1ZW07Ci0gIHdpZHRoOiAxNzhweDsgIAotICBib3JkZXI6IG5vbmU7Ci0gIG1hcmdpbi1sZWZ0OiA2cHg7ICAKLSAgei1pbmRleDogMTUwMDsgIAotICBwb3NpdGlvbjogcmVsYXRpdmU7Ci0gIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50OwotICBib3JkZXItYm90dG9tOjFweCBzb2xpZCAjQ0NDOwotICBwYWRkaW5nOjAgMCAwIDRweDsKLSAgb3V0bGluZTpub25lOwotICBoZWlnaHQ6MjRweDsKLX0KLQotLnNlYXJjaDpob3ZlciBmb3JtIGlucHV0IHsKLSAgYm9yZGVyLWJvdHRvbToxcHggc29saWQgIzMzQjVFNTsKLX0KLQotLnNlYXJjaDpob3ZlciAuYm90dG9tLCAuc2VhcmNoOmhvdmVyIC5sZWZ0LCAuc2VhcmNoOmhvdmVyIC5yaWdodCB7Ci0gIGJhY2tncm91bmQtY29sb3I6ICMzM2I1ZTU7Ci19Ci0KLS5zZWFyY2g6aG92ZXIgI3NlYXJjaC1idG4gewotICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIC0yOHB4Ci19Ci0KLS5zZWFyY2ggZm9ybSBpbnB1dDpmb2N1cyB7Ci0gIGNvbG9yOiAjMjIyOwotICBmb250LXdlaWdodDogYm9sZAotfQotCi0ubW9yZW1lbnUgewotICBmbG9hdDogcmlnaHQ7Ci0gIHBvc2l0aW9uOiByZWxhdGl2ZTsKLSAgd2lkdGg6IDUwcHg7Ci0gIGhlaWdodDoyOHB4OwotICBkaXNwbGF5OiBibG9jazsKLSAgbWFyZ2luLXRvcDotM3B4OwotICBtYXJnaW4tYm90dG9tOjdweDsKLSAgb3ZlcmZsb3c6aGlkZGVuOwotICAtd2Via2l0LXRyYW5zaXRpb246IHdpZHRoIDAuMjVzIGVhc2U7Ci0gICAgIC1tb3otdHJhbnNpdGlvbjogd2lkdGggMC4yNXMgZWFzZTsKLSAgICAgICAtby10cmFuc2l0aW9uOiB3aWR0aCAwLjI1cyBlYXNlOwotICAgICAgICAgIHRyYW5zaXRpb246IHdpZHRoIDAuMjVzIGVhc2U7Ci19Ci0KLS5tb3JlbWVudSAjbW9yZS1idG4gewotICB3aWR0aDo0MHB4OwotICBoZWlnaHQ6MjhweDsKLSAgYmFja2dyb3VuZDp1cmwoLi4vaW1hZ2VzL2ljb25fbW9yZS5wbmcpIG5vLXJlcGVhdDsKLSAgYm9yZGVyLWxlZnQ6MXB4IHNvbGlkICNDQ0M7Ci0gIGZsb2F0OmxlZnQ7Ci0gIGN1cnNvcjpwb2ludGVyOwotfQotCi0ubW9yZW1lbnU6aG92ZXIgI21vcmUtYnRuIHsKLSAgYmFja2dyb3VuZC1wb3NpdGlvbjowIC0yOHB4OwotfQotCi0ubW9yZWhvdmVyIHsKLSAgcG9zaXRpb246YWJzb2x1dGU7Ci0gIHJpZ2h0OjZweDsKLSAgdG9wOi05cHg7Ci0gIHdpZHRoOjQwcHg7Ci0gIGhlaWdodDozNXB4OwotICB6LWluZGV4Ojk5OwotICBvdmVyZmxvdzpoaWRkZW47Ci0KLSAgLXdlYmtpdC1vcGFjaXR5OjA7Ci0gICAgIC1tb3otb3BhY2l0eTowOwotICAgICAgIC1vLW9wYWNpdHk6MDsKLSAgICAgICAgICBvcGFjaXR5OjA7Ci0KLSAgLXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOjEwMCUgMCU7Ci0gICAgIC1tb3otdHJhbnNmb3JtLW9yaWdpbjoxMDAlIDAlOyAKLSAgICAgICAtby10cmFuc2Zvcm0tb3JpZ2luOjEwMCUgMCU7Ci0gICAgICAgICAgdHJhbnNmb3JtLW9yaWdpbjoxMDAlIDAlOwotICAKLSAgLXdlYmtpdC10cmFuc2l0aW9uLXByb3BlcnR5OiAtd2Via2l0LW9wYWNpdHk7Ci0gIC13ZWJraXQtdHJhbnNpdGlvbi1kdXJhdGlvbjogLjI1czsKLSAgLXdlYmtpdC10cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjplYXNlOwotCi0gIC1tb3otdHJhbnNpdGlvbi1wcm9wZXJ0eTogLXdlYmtpdC1vcGFjaXR5OwotICAtbW96LXRyYW5zaXRpb24tZHVyYXRpb246IC4yNXM7Ci0gIC1tb3otdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246ZWFzZTsKLQotICAtby10cmFuc2l0aW9uLXByb3BlcnR5OiAtd2Via2l0LW9wYWNpdHk7Ci0gIC1vLXRyYW5zaXRpb24tZHVyYXRpb246IC4yNXM7Ci0gIC1vLXRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOmVhc2U7Ci0gIAotICAtdHJhbnNpdGlvbi1wcm9wZXJ0eTogLXdlYmtpdC1vcGFjaXR5OwotICAtdHJhbnNpdGlvbi1kdXJhdGlvbjogLjI1czsKLSAgLXRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOmVhc2U7Ci19Ci0KLS5tb3JlaG92ZXI6aG92ZXIsCi0ubW9yZWhvdmVyLmhvdmVyIHsKLSAgb3BhY2l0eToxOwotICBoZWlnaHQ6Mzg1cHg7Ci0gIHdpZHRoOjI2OHB4OwotICAtd2Via2l0LXRyYW5zaXRpb24tcHJvcGVydHk6aGVpZ2h0LCAgLXdlYmtpdC1vcGFjaXR5OwotfQotCi0ubW9yZWhvdmVyIC50b3AgewotICB3aWR0aDoyNjhweDsKLSAgaGVpZ2h0OjM5cHg7Ci0gIGJhY2tncm91bmQ6dXJsKC4uL2ltYWdlcy9tb3JlX3RvcC5wbmcpIG5vLXJlcGVhdDsKLX0KLQotLm1vcmVob3ZlciAubWlkIHsKLSAgd2lkdGg6MjI4cHg7Ci0gIGJhY2tncm91bmQ6dXJsKC4uL2ltYWdlcy9tb3JlX21pZC5wbmcpIHJlcGVhdC15OwotICBwYWRkaW5nOjEwcHggMjBweCAwIDIwcHg7Ci19Ci0KLS5tb3JlaG92ZXIgLm1pZCAuaGVhZGVyIHsKLSAgYm9yZGVyLWJvdHRvbToxcHggc29saWQgI2NjYzsKLSAgZm9udC13ZWlnaHQ6Ym9sZDsKLX0KLQotLm1vcmVob3ZlciAuYm90dG9tIHsKLSAgd2lkdGg6MjY4cHg7Ci0gIGhlaWdodDo2cHg7Ci0gIGJhY2tncm91bmQ6dXJsKC4uL2ltYWdlcy9tb3JlX2JvdHRvbS5wbmcpIG5vLXJlcGVhdDsKLX0KLQotLm1vcmVob3ZlciB1bCB7Ci0gIG1hcmdpbjoxMHB4IDEwcHggMjBweCAwOwotfQotCi0ubW9yZWhvdmVyIHVsIGxpIHsKLSAgbGlzdC1zdHlsZTpub25lOwotfQotCi0ubW9yZWhvdmVyIHVsIGxpLmFjdGl2ZSBhLAotLm1vcmVob3ZlciB1bCBsaS5hY3RpdmUgYTpob3ZlciB7Ci0gIGNvbG9yOiMyMjIgIWltcG9ydGFudDsKLX0KLQotLm1vcmVob3ZlciB1bCBsaS5hY3RpdmUgaW1nIHsKLSAgbWFyZ2luLXJpZ2h0OjRweDsKLX0KLQotCi0KLQotLyogTUFSUVVFRSAqLwotLnNsaWRlc2hvdy1jb250YWluZXIgewotICB3aWR0aDoxMDAlOwotICBvdmVyZmxvdzpoaWRkZW47Ci0gIHBvc2l0aW9uOnJlbGF0aXZlOwotfQotLnNsaWRlc2hvdy1jb250YWluZXIgLnNsaWRlc2hvdy1wcmV2IHsKLSAgcG9zaXRpb246YWJzb2x1dGU7Ci0gIHRvcDo1MCU7Ci0gIGxlZnQ6MHB4OwotICBtYXJnaW4tdG9wOi0zNnB4OwotICB6LWluZGV4Ojk5OwotfQotLnNsaWRlc2hvdy1jb250YWluZXIgLnNsaWRlc2hvdy1uZXh0IHsKLSAgcG9zaXRpb246YWJzb2x1dGU7Ci0gIHRvcDo1MCU7Ci0gIG1hcmdpbi10b3A6LTM2cHg7Ci0gIHotaW5kZXg6OTk7Ci0gIHJpZ2h0OjBweDsKLX0KLQotLnNsaWRlc2hvdy1jb250YWluZXIgLnBhZ2luYXRpb24gewotICBwb3NpdGlvbjphYnNvbHV0ZTsKLSAgYm90dG9tOjIwcHg7Ci0gIHdpZHRoOjEwMCU7Ci0gIHRleHQtYWxpZ246Y2VudGVyOwotICB6LWluZGV4Ojk5OwotfQotLnNsaWRlc2hvdy1jb250YWluZXIgLnBhZ2luYXRpb24gdWwgewotICBtYXJnaW46MDsKLX0KLS5zbGlkZXNob3ctY29udGFpbmVyIC5wYWdpbmF0aW9uIHVsIGxpewotICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Ci0gIHdpZHRoOjEycHg7Ci0gIGhlaWdodDoxMnB4OwotICB0ZXh0LWluZGVudDotODAwMHB4OwotICBsaXN0LXN0eWxlOm5vbmU7Ci0gIG1hcmdpbjogMCAycHg7Ci0gIGJvcmRlci1yYWRpdXM6NnB4OwotICBiYWNrZ3JvdW5kLWNvbG9yOiNjY2M7Ci0gIGN1cnNvcjpwb2ludGVyOwotICAgICAgICAtd2Via2l0LXRyYW5zaXRpb246Y29sb3IgLjVzIGVhc2UtaW47ICAKLSAgICAgICAgLW1vei10cmFuc2l0aW9uOmNvbG9yIC41cyBlYXNlLWluOyAgCi0gICAgICAgIC1vLXRyYW5zaXRpb246Y29sb3IgLjVzIGVhc2UtaW47ICAKLSAgICAgICAgdHJhbnNpdGlvbjpjb2xvciAuNXMgZWFzZS1pbjsKLX0KLS5zbGlkZXNob3ctY29udGFpbmVyIC5wYWdpbmF0aW9uIHVsIGxpOmhvdmVyIHsKLSAgYmFja2dyb3VuZC1jb2xvcjojOTk5OwotfQotLnNsaWRlc2hvdy1jb250YWluZXIgLnBhZ2luYXRpb24gdWwgbGkuYWN0aXZlIHsKLSAgYmFja2dyb3VuZC1jb2xvcjojMzNiNWU1OwotfQotLnNsaWRlc2hvdy1jb250YWluZXIgLnBhZ2luYXRpb24gdWwgbGkuYWN0aXZlOmhvdmVyIHsKLSAgYmFja2dyb3VuZC1jb2xvcjojMzNiNWU1OwotfQotLnNsaWRlc2hvdy1jb250YWluZXIgdWwgbGkgewotICBkaXNwbGF5OmlubGluZTsKLSAgbGlzdC1zdHlsZTpub25lOwotfQotCi0KLQotCi1hLmRvd25sb2FkLXNkayB7Ci0gICAgZmxvYXQ6cmlnaHQ7Ci0gICAgbWFyZ2luOi0xMHB4IDA7Ci0gICAgaGVpZ2h0OjMwcHg7Ci0gICAgcGFkZGluZy10b3A6NHB4OwotICAgIHBhZGRpbmctYm90dG9tOjBweDsKLX0KLQotI25hdi14IHsKLSAgcGFkZGluZy10b3A6IDE0cHg7Ci19Ci0KLSNuYXYteCAud3JhcCB7Ci0gIG1pbi1oZWlnaHQ6MzRweDsKLX0KLQotI25hdi14IC53cmFwLAotI3NlYXJjaFJlc3VsdHMud3JhcCB7Ci0gICAgbWF4LXdpZHRoOjk0MHB4OwotICAgIGJvcmRlci1ib3R0b206MXB4IHNvbGlkICNDQ0M7Ci19Ci0KLSNzZWFyY2hSZXN1bHRzLndyYXAgI2xlZnRTZWFyY2hDb250cm9sIHsKLSAgbWluLWhlaWdodDo3MDBweAotfQotLm5hdi14IHsKLSAgICBtYXJnaW4tbGVmdDowOwotICAgIG1hcmdpbi1ib3R0b206MDsKLX0KLQotCi0KLQotCi0KLQotCi0KLQotLyoKLSAqIENTUyBTdHlsZXMgdGhhdCBhcmUgbmVlZGVkIGJ5IGpTY3JvbGxQYW5lIGZvciBpdCB0byBvcGVyYXRlIGNvcnJlY3RseS4KLSAqLwotCi0uanNwQ29udGFpbmVyIHsKLSAgb3ZlcmZsb3c6IGhpZGRlbjsKLSAgcG9zaXRpb246IHJlbGF0aXZlOwotfQotCi0uanNwUGFuZSB7Ci0gIHBvc2l0aW9uOiBhYnNvbHV0ZTsKLSAgb3ZlcmZsb3c6IGhpZGRlbjsKLSAgd2lkdGg6MTAwJSAhaW1wb3J0YW50OyAvKiB0byBhdm9pZCBjdXQtb2ZmIGFwaSBuYW1lcyBpbiByZWZlcmVuY2UgaW4gaG9yaXogc2Nyb2xsICovCi19Ci0KLS5qc3BWZXJ0aWNhbEJhciB7Ci0gIHBvc2l0aW9uOiBhYnNvbHV0ZTsKLSAgdG9wOiAwOwotICByaWdodDogMDsKLSAgd2lkdGg6IDRweDsKLSAgaGVpZ2h0OiAxMDAlOwotICBiYWNrZ3JvdW5kOiAjZjVmNWY1OwotfQotCi0uanNwSG9yaXpvbnRhbEJhciB7Ci0gIHBvc2l0aW9uOiBhYnNvbHV0ZTsKLSAgYm90dG9tOiAwOwotICBsZWZ0OiAwOwotICB3aWR0aDogMTAwJTsKLSAgaGVpZ2h0OiA0cHg7Ci0gIGJhY2tncm91bmQ6ICNmNWY1ZjU7Ci19Ci0KLS5qc3BWZXJ0aWNhbEJhciAqLAotLmpzcEhvcml6b250YWxCYXIgKiB7Ci0gIG1hcmdpbjogMDsKLSAgcGFkZGluZzogMDsKLX0KLS5qc3BDYXAgewotICBkaXNwbGF5OiBibG9jazsKLX0KLQotLmpzcFZlcnRpY2FsQmFyIC5qc3BDYXAgewotICBoZWlnaHQ6IDRweDsKLX0KLQotLmpzcEhvcml6b250YWxCYXIgLmpzcENhcCB7Ci0gIHdpZHRoOiAwOwotICBoZWlnaHQ6IDEwMCU7Ci19Ci0KLS5qc3BIb3Jpem9udGFsQmFyIC5qc3BDYXAgewotICBmbG9hdDogbGVmdDsKLX0KLQotLmpzcFRyYWNrIHsKLSAgcG9zaXRpb246IHJlbGF0aXZlOwotfQotCi0uanNwRHJhZyB7Ci0gIGJhY2tncm91bmQ6ICNiYmI7Ci0gIHBvc2l0aW9uOiByZWxhdGl2ZTsKLSAgdG9wOiAwOwotICBsZWZ0OiAwOwotICBjdXJzb3I6IHBvaW50ZXI7Ci19Ci0KLS5qc3BEcmFnOmhvdmVyLAotLmpzcERyYWc6YWN0aXZlIHsKLSAgYm9yZGVyLWNvbG9yOiAjMDljOwotICBiYWNrZ3JvdW5kLWNvbG9yOiAjNGNhZGNiOwotICBiYWNrZ3JvdW5kLWltYWdlOiAtd2Via2l0LWdyYWRpZW50KGxpbmVhciwgbGVmdCB0b3AsIHJpZ2h0IHRvcCwgZnJvbSgjNWRiY2Q5KSwgdG8oIzRjYWRjYikpOwotICBiYWNrZ3JvdW5kLWltYWdlOiAtd2Via2l0LWxpbmVhci1ncmFkaWVudChsZWZ0LCAjNWRiY2Q5LCAjNGNhZGNiKTsKLSAgYmFja2dyb3VuZC1pbWFnZTogLW1vei1saW5lYXItZ3JhZGllbnQobGVmdCwgIzVkYmNkOSwgIzRjYWRjYik7Ci0gIGJhY2tncm91bmQtaW1hZ2U6IC1tcy1saW5lYXItZ3JhZGllbnQobGVmdCwgIzVkYmNkOSwgIzRjYWRjYik7Ci0gIGJhY2tncm91bmQtaW1hZ2U6IC1vLWxpbmVhci1ncmFkaWVudChsZWZ0LCAjNWRiY2Q5LCAjNGNhZGNiKTsKLSAgYmFja2dyb3VuZC1pbWFnZTogbGluZWFyLWdyYWRpZW50KGxlZnQsICM1ZGJjZDksICM0Y2FkY2IpOwotICBmaWx0ZXI6IHByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5ncmFkaWVudChzdGFydENvbG9yU3RyPScjNWRiY2Q5JywgRW5kQ29sb3JTdHI9JyM0Y2FkY2InKTsgCi19Ci0KLS5qc3BIb3Jpem9udGFsQmFyIC5qc3BUcmFjaywKLS5qc3BIb3Jpem9udGFsQmFyIC5qc3BEcmFnIHsKLSAgZmxvYXQ6IGxlZnQ7Ci0gIGhlaWdodDogMTAwJTsKLX0KLQotLmpzcEFycm93IHsKLSAgYmFja2dyb3VuZDogIzk5OTsKLSAgdGV4dC1pbmRlbnQ6IC0yMDAwMHB4OwotICBkaXNwbGF5OiBibG9jazsKLSAgY3Vyc29yOiBwb2ludGVyOwotfQotCi0uanNwQXJyb3cuanNwRGlzYWJsZWQgewotICBjdXJzb3I6IGRlZmF1bHQ7Ci0gIGJhY2tncm91bmQ6ICNjY2M7Ci19Ci0KLS5qc3BWZXJ0aWNhbEJhciAuanNwQXJyb3cgewotICBoZWlnaHQ6IDE2cHg7Ci19Ci0KLS5qc3BIb3Jpem9udGFsQmFyIC5qc3BBcnJvdyB7Ci0gIHdpZHRoOiAxNnB4OwotICBmbG9hdDogbGVmdDsKLSAgaGVpZ2h0OiAxMDAlOwotfQotCi0uanNwVmVydGljYWxCYXIgLmpzcEFycm93OmZvY3VzIHsKLSAgb3V0bGluZTogbm9uZTsKLX0KLQotLmpzcENvcm5lciB7Ci0gIGZsb2F0OiBsZWZ0OwotICBoZWlnaHQ6IDEwMCU7Ci19Ci0KLS8qIFl1ayEgQ1NTIEhhY2sgZm9yIElFNiAzIHBpeGVsIGJ1ZyA6KCAqLwotKiBodG1sIC5qc3BDb3JuZXIgewotICBtYXJnaW46IDAgLTNweCAwIDA7Ci19Ci0vKioqKioqKiBlbmQgb2YganNjcm9sbHBhbmUgKioqKioqKioqLwotCi0KLQotCi0KLS8qKioqKioqKioqKiogREVWRUxPUCBIT01FUEFHRSAqKioqKioqKioqKioqKioqKiovCi0KLS8qIFNsaWRlc2hvdyAqLwotLnNsaWRlc2hvdy1kZXZlbG9wIHsKLSAgaGVpZ2h0OiAzMDBweDsKLSAgd2lkdGg6IDk0MHB4OwotICBwb3NpdGlvbjogcmVsYXRpdmU7Ci0gIG92ZXJmbG93OmhpZGRlbjsKLX0KLS5zbGlkZXNob3ctZGV2ZWxvcCAuZnJhbWUgewotICB3aWR0aDogOTQwcHg7Ci0gIGhlaWdodDogMzAwcHg7Ci19Ci0uc2xpZGVzaG93LWRldmVsb3AgaW1nLnBsYXkgewotICBtYXgtd2lkdGg6MzUwcHg7Ci0gIG1heC1oZWlnaHQ6MjQwcHg7Ci0gIG1hcmdpbjoyMHB4IDAgMCA5MHB4OwotICAtd2Via2l0LXRyYW5zZm9ybTogcGVyc3BlY3RpdmUoODAwcHggKSByb3RhdGVZKCAzNWRlZyApOwotICBib3gtc2hhZG93OiAtMTZweCAyMHB4IDQwcHggcmdiYSgwLCAwLCAwLCAwLjMpOwotICAtbW96LWJveC1zaGFkb3c6IC0xNnB4IDIwcHggNDBweCByZ2JhKDAsIDAsIDAsIDAuMyk7Ci0gIC13ZWJraXQtYm94LXNoYWRvdzogLTE2cHggMjBweCA0MHB4IHJnYmEoMCwgMCwgMCwgMC4zKTsKLX0KLS5zbGlkZXNob3ctZGV2ZWxvcCBpbWcucGxheS5uby1zaGFkb3cgewotICAgIGJveC1zaGFkb3c6IG5vbmU7Ci0gICAgLW1vei1ib3gtc2hhZG93OiBub25lOwotICAgIC13ZWJraXQtYm94LXNoYWRvdzogbm9uZTsKLX0KLS5zbGlkZXNob3ctZGV2ZWxvcCBpbWcucGxheS5uby10cmFuc2Zvcm0gewotICAtd2Via2l0LXRyYW5zZm9ybTogbm9uZTsKLX0KLS5zbGlkZXNob3ctZGV2ZWxvcCBhLnNsaWRlc2hvdy1uZXh0IHsKLSAgYmFja2dyb3VuZDogdXJsKC4uL2ltYWdlcy9hcnJvdy1yaWdodC1kZXZlbG9wLnBuZyk7Ci19Ci0uc2xpZGVzaG93LWRldmVsb3AgYS5zbGlkZXNob3ctcHJldiB7Ci0gIGJhY2tncm91bmQ6IHVybCguLi9pbWFnZXMvYXJyb3ctbGVmdC1kZXZlbG9wLnBuZyk7Ci19Ci0uc2xpZGVzaG93LWRldmVsb3AgLmNvbnRlbnQtcmlnaHQgewotICBmbG9hdDogbGVmdDsKLX0KLS5zbGlkZXNob3ctZGV2ZWxvcCAuY29udGVudC1yaWdodCBoMiB7Ci0gIHBhZGRpbmc6MDsKLSAgbWFyZ2luLWJvdHRvbToxMHB4OwotICBib3JkZXI6bm9uZTsKLX0KLS5zbGlkZXNob3ctZGV2ZWxvcCAuaXRlbSB7Ci0gIGhlaWdodDogMzAwcHg7Ci0gIHdpZHRoOiA5NDBweDsKLX0KLS5zbGlkZXNob3ctZGV2ZWxvcCAucGFnaW5hdGlvbiB1bCBsaS5hY3RpdmUgewotICBiYWNrZ3JvdW5kLWNvbG9yOiAjRjgwOwotfQotLnNsaWRlc2hvdy1kZXZlbG9wIC5wYWdpbmF0aW9uIHVsIGxpLmFjdGl2ZTpob3ZlciB7Ci0gIGJhY2tncm91bmQtY29sb3I6ICNGODA7Ci19Ci0uc2xpZGVzaG93LWRldmVsb3AgLml0ZW0gaHIgewotICBtYXJnaW46NXB4IDAgMTBweDsKLX0KLS5zbGlkZXNob3ctZGV2ZWxvcCAuaXRlbSBwIHsKLSAgbWFyZ2luOjEwcHggMDsKLX0KLS5zbGlkZXNob3ctZGV2ZWxvcCAuaXRlbSBwLnRpdGxlLWludHJvIHsKLSAgcG9zaXRpb246YWJzb2x1dGU7Ci0gIG1hcmdpbjowOwotfQotCi0vKiBGZWVkcyAqLwotLmZlZWQgdWwgewotICBtYXJnaW46IDA7Ci19Ci0uZmVlZCAuZmVlZC1uYXYgewotICBoZWlnaHQ6IDI1cHg7Ci0gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjQ0NDOwotfQotLmZlZWQgLmZlZWQtbmF2IGxpIHsKLSAgbGlzdC1zdHlsZTogbm9uZTsKLSAgZmxvYXQ6IGxlZnQ7Ci0gIGhlaWdodDogMjFweDsgLyogKzRweCBib3R0b20gYm9yZGVyID0gMjVweDsgc2FtZSBhcyAuZmVlZC1uYXYgKi8KLSAgbWFyZ2luLXJpZ2h0OiAyNXB4OwotICBjdXJzb3I6IHBvaW50ZXI7Ci19Ci0uZmVlZCAuZmVlZC1uYXYgbGkuYWN0aXZlIHsKLSAgY29sb3I6ICMwMDA7Ci0gIGJvcmRlci1ib3R0b206IDRweCBzb2xpZCAjRjgwOwotfQotLmZlZWQgLmZlZWQtY29udGFpbmVyIHsKLSAgb3ZlcmZsb3c6IGhpZGRlbjsKLSAgd2lkdGg6IDQ2MHB4OwotfQotLmZlZWQgLmZlZWQtY29udGFpbmVyIC5mZWVkLWZyYW1lIHsKLSAgd2lkdGg6IDEwMDBweDsKLX0KLS5mZWVkIC5mZWVkLWNvbnRhaW5lciAuZmVlZC1mcmFtZSB1bCB7Ci0gIGZsb2F0OiBsZWZ0OwotICB3aWR0aDo0NjBweDsKLX0KLS5mZWVkIC5mZWVkLWNvbnRhaW5lciAuZmVlZC1mcmFtZSB1bCB1bCB7Ci0gIGZsb2F0OiBub25lOwotICBtYXJnaW46MTBweCAwIDAgMzBweDsKLX0KLS5mZWVkIC5mZWVkLWNvbnRhaW5lciAuZmVlZC1mcmFtZSBsaSB7Ci0gIGxpc3Qtc3R5bGU6IG5vbmU7Ci0gIG1hcmdpbjogMjBweCAwIDIwcHggMDsKLSAgd2lkdGg6IDQ2MHB4OwotICBoZWlnaHQ6OTNweDsKLX0KLS5mZWVkIC5mZWVkLWNvbnRhaW5lciAuZmVlZC1mcmFtZSBsaS5wbGF5bGlzdCB7Ci0gIGhlaWdodDphdXRvOwotfQotLmZlZWQgLmZlZWQtY29udGFpbmVyIC5mZWVkLWZyYW1lIGxpLnBsYXlsaXN0IGEgewotICBoZWlnaHQ6OTNweDsKLSAgZGlzcGxheTpibG9jazsKLX0KLS5mZWVkIC5mZWVkLWNvbnRhaW5lciAuZmVlZC1mcmFtZSBsaS5tb3JlIHsKLSAgaGVpZ2h0OjIwcHg7Ci0gIG1hcmdpbjoxMHB4IDAgNXB4IDVweDsKLX0KLS5mZWVkIC5mZWVkLWNvbnRhaW5lciAuZmVlZC1mcmFtZSBsaS5tb3JlIGEgewotICBoZWlnaHQ6aW5oZXJpdDsKLX0KLS5mZWVkIC5mZWVkLWNvbnRhaW5lciAuZmVlZC1mcmFtZSBsaS5wbGF5bGlzdC12aWRlbyB7Ci0gIGxpc3Qtc3R5bGU6IG5vbmU7Ci0gIG1hcmdpbjogMDsKLSAgd2lkdGg6IDQ2MHB4OwotICBoZWlnaHQ6NTVweDsKLSAgZm9udC1zaXplOjEycHg7Ci19Ci0uZmVlZCAuZmVlZC1jb250YWluZXIgLmZlZWQtZnJhbWUgbGkucGxheWxpc3QtdmlkZW8gYSB7Ci0gIGhlaWdodDo0NXB4OwotICBwYWRkaW5nOjVweDsKLX0KLS5mZWVkIC5mZWVkLWNvbnRhaW5lciAuZmVlZC1mcmFtZSBsaS5wbGF5bGlzdC12aWRlbyBoNSB7Ci0gIGZvbnQtc2l6ZToxMnB4OwotICBsaW5lLWhlaWdodDoxM3B4OwotICBtYXJnaW46MDsKLX0KLS5mZWVkIC5mZWVkLWNvbnRhaW5lciAuZmVlZC1mcmFtZSBsaS5wbGF5bGlzdC12aWRlbyBwIHsKLSAgbWFyZ2luOjVweCAwIDA7Ci0gIGxpbmUtaGVpZ2h0OjE1cHg7Ci19Ci0uZmVlZC1jb250YWluZXIgLmZlZWQtZnJhbWUgZGl2LmZlZWQtaW1hZ2UgewotICBmbG9hdDogbGVmdDsKLSAgYm9yZGVyOiAxcHggc29saWQgIzk5OTsKLSAgbWFyZ2luOjAgMjBweCAwIDA7Ci0gIHdpZHRoOjEyMnB4OwotICBoZWlnaHQ6OTJweDsKLSAgYmFja2dyb3VuZDp1cmwoJy4uL2ltYWdlcy9ibG9nLWRlZmF1bHQucG5nJykgbm8tcmVwZWF0IDAgMDsKLSAgYmFja2dyb3VuZC1zaXplOjE4MHB4OwotfQotI2pkLWNvbnRlbnQgLmZlZWQgLmZlZWQtY29udGFpbmVyIC5mZWVkLWZyYW1lIGxpIGltZyB7Ci0gIGZsb2F0OiBsZWZ0OwotICBib3JkZXI6IDFweCBzb2xpZCAjOTk5OwotICBtYXJnaW46MCAyMHB4IDAgMDsKLSAgd2lkdGg6MTIycHg7Ci0gIGhlaWdodDo5MnB4OwotfQotI2pkLWNvbnRlbnQgLmZlZWQgLmZlZWQtY29udGFpbmVyIC5mZWVkLWZyYW1lIGxpLnBsYXlsaXN0LXZpZGVvIGltZyB7Ci0gIHdpZHRoOmluaGVyaXQ7Ci0gIGhlaWdodDppbmhlcml0OwotfQotCi0uZmVlZCAuZmVlZC1jb250YWluZXIgLmZlZWQtZnJhbWUgbGkgYSwKLS5mZWVkIC5mZWVkLWNvbnRhaW5lciAuZmVlZC1mcmFtZSBsaSBhOmFjdGl2ZSB7Ci0gIGNvbG9yOiM1NTUgIWltcG9ydGFudDsKLX0KLQotLmZlZWQgLmZlZWQtY29udGFpbmVyIC5mZWVkLWZyYW1lIGxpIGE6aG92ZXIsCi0uZmVlZCAuZmVlZC1jb250YWluZXIgLmZlZWQtZnJhbWUgbGkgYTpob3ZlciAqIHsKLSAgY29sb3I6IzdBQTFCMCAhaW1wb3J0YW50OwotfQotCi0vKiBWaWRlbyBwbGF5ZXIgKi8KLSNwbGF5ZXItd3JhcHBlciB7Ci0gIGRpc3BsYXk6bm9uZTsKLSAgbWFyZ2luOiAtMXB4IGF1dG8gMDsKLSAgcG9zaXRpb246IHJlbGF0aXZlOwotICB3aWR0aDogOTQwcHg7Ci0gIGhlaWdodDogMHB4OwotfQotI3BsYXllci1mcmFtZSB7Ci0gIGJhY2tncm91bmQ6ICNFRkVGRUY7Ci0gIGJvcmRlcjogMXB4IHNvbGlkICNDQ0M7Ci0gIHBhZGRpbmc6IDBweCAyMDdweDsKLSAgei1pbmRleDogMTA7IC8qIHN0YXkgYWJvdmUgbWFycXVlLCBidXQgYmVsb3cgc2VhcmNoIHN1Z2dlc3Rpb25zICovCi0gIHdpZHRoOiA1MjVweDsKLSAgaGVpZ2h0OiAzMzBweDsKLSAgcG9zaXRpb246IHJlbGF0aXZlOwotfQotCi0KLQotLyoqKioqKioqKioqKiBESVNUUklCVVRFIEhPTUVQQUdFICoqKioqKioqKioqKioqKi8KLQotLm1hcnF1ZWUgewotICB3aWR0aDogNzYwcHg7Ci19Ci0ubWFycXVlZSAubWFpbi1pbWcgewotICBmbG9hdDogbGVmdDsKLSAgbWFyZ2luLXRvcDogMjBweDsKLSAgd2lkdGg6IDQ5MHB4OwotfQotLm1hcnF1ZWUgLmNvcHkgewotICB3aWR0aDogMjcwcHg7Ci0gIGZsb2F0OiBsZWZ0OwotICBtYXJnaW4tdG9wOiAzMHB4OwotfQotLmRpc3RyaWJ1dGUtZmVhdHVyZXMgewotICBtYXJnaW46IDA7Ci19Ci0uZGlzdHJpYnV0ZS1mZWF0dXJlcyB1bCB7Ci0gIG1hcmdpbjogMDsKLX0KLS5kaXN0cmlidXRlLWZlYXR1cmVzIHVsIGxpIHsKLSAgbGlzdC1zdHlsZTogbm9uZTsKLSAgZmxvYXQ6IGxlZnQ7Ci0gIGJvcmRlci10b3A6IDFweCBzb2xpZCAjOUMwOwotICB3aWR0aDogMjIwcHg7Ci0gIG1hcmdpbi1yaWdodDogNTBweDsKLX0KLS5kaXN0cmlidXRlLWZlYXR1cmVzIHVsIGxpLmxhc3QgewotICBtYXJnaW4tcmlnaHQ6IDBweDsKLX0KLQotCi0KLS8qKioqKioqKioqKiogREVWRUxPUCBUT1BJQyBDT05UQUlORVJTICoqKioqKioqKioqKi8KLQotLmxhbmRpbmctYmFubmVyLAotLmxhbmRpbmctZG9jcyB7Ci0gIG1hcmdpbjoyMHB4IDAgMDsKLX0KLS5sYW5kaW5nLWJhbm5lciBkaXY6Zmlyc3QtY2hpbGQsCi0ubGFuZGluZy1kb2NzIGRpdjpmaXJzdC1jaGlsZCwKLS5sYW5kaW5nLWRvY3MgLmNvbC0xMiB7Ci0gIG1hcmdpbi1sZWZ0OjA7Ci0gIG1pbi1oZWlnaHQ6MjgwcHg7Ci19Ci0ubGFuZGluZy1iYW5uZXIgZGl2Omxhc3QtY2hpbGQsCi0ubGFuZGluZy1kb2NzIGRpdjpsYXN0LWNoaWxkLAotLmxhbmRpbmctZG9jcyAuY29sLTEyIHsKLSAgbWFyZ2luLXJpZ2h0OjA7Ci19Ci0KLS5sYW5kaW5nLWJhbm5lciBoMSB7Ci0gIG1hcmdpbi10b3A6MDsKLX0KLS5sYW5kaW5nLWRvY3MgewotICBjbGVhcjpsZWZ0OwotICBvdmVyZmxvdzpoaWRkZW47Ci19Ci0ubGFuZGluZy1kb2NzIGgzIHsKLSAgZm9udC1zaXplOjE0cHg7Ci0gIGxpbmUtaGVpZ2h0OjIxcHg7Ci0gIGNvbG9yOiM1NTU7Ci0gIHRleHQtdHJhbnNmb3JtOnVwcGVyY2FzZTsKLSAgYm9yZGVyLWJvdHRvbToxcHggc29saWQgI0NDQzsKLSAgbWFyZ2luOjAgMCAyMHB4OwotfQotLmxhbmRpbmctZG9jcyBhIHsKLSAgY29sb3I6IzMzMyAhaW1wb3J0YW50OwotfQotCi0ubGFuZGluZy1kb2NzIGE6aG92ZXIsCi0ubGFuZGluZy1kb2NzIGE6aG92ZXIgKiB7Ci0gIGNvbG9yOiM3QUExQjAgIWltcG9ydGFudAotfQotCi0ubGFuZGluZy1kb2NzIC5ub3JtYWwtbGlua3MgYSB7Ci0gIGNvbG9yOiMyNThhYWYgIWltcG9ydGFudDsKLX0KLQotLnBsdXNvbmUgewotICBmbG9hdDpyaWdodDsKLX0KLQotLmZlZWRiYWNrIHsKLSAgZmxvYXQ6cmlnaHQgIWltcG9ydGFudDsKLSAgbWFyZ2luOiAwIDAgMCAxMHB4OwotICBmb250LXNpemU6IDE0cHg7Ci19Ci0KLQotLyoqKioqKioqKioqKiogSE9NRS9MQU5ESU5HIFBBR0UgKioqKioqKioqKioqKioqKiovCi0KLS5zbGlkZXNob3ctaG9tZSB7Ci0gIGhlaWdodDogNTAwcHg7Ci0gIHdpZHRoOiA5NDBweDsKLSAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNDQ0M7Ci0gIHBvc2l0aW9uOiByZWxhdGl2ZTsKLSAgbWFyZ2luOiAwOwotfQotLnNsaWRlc2hvdy1ob21lIC5mcmFtZSB7Ci0gIHdpZHRoOiA5NDBweDsKLSAgaGVpZ2h0OiA1MDBweDsKLX0KLS5zbGlkZXNob3ctaG9tZSAuY29udGVudC1sZWZ0IHsKLSAgZmxvYXQ6IGxlZnQ7Ci0gIHRleHQtYWxpZ246IGNlbnRlcjsKLSAgdmVydGljYWwtYWxpZ246IGNlbnRlcjsKLSAgbWFyZ2luOiAwIDAgMCAzNXB4OwotfQotLnNsaWRlc2hvdy1ob21lIC5jb250ZW50LXJpZ2h0IHsKLSAgbWFyZ2luOiA4MHB4IDAgMCAwOwotfQotLnNsaWRlc2hvdy1ob21lIC5jb250ZW50LXJpZ2h0IHAgewotICBtYXJnaW4tYm90dG9tOiAxMHB4OwotfQotLnNsaWRlc2hvdy1ob21lIC5jb250ZW50LXJpZ2h0IHA6bGFzdC1jaGlsZCB7Ci0gIG1hcmdpbi10b3A6IDE1cHg7Ci19Ci0uc2xpZGVzaG93LWhvbWUgLmNvbnRlbnQtcmlnaHQgaDEgewotICBwYWRkaW5nOjA7Ci19Ci0uc2xpZGVzaG93LWhvbWUgLml0ZW0gewotICBoZWlnaHQ6IDUwMHB4OwotICB3aWR0aDogOTQwcHg7Ci19Ci0uaG9tZS1zZWN0aW9ucyB7Ci0gIHBhZGRpbmc6IDMwcHggMjBweCAyMHB4OwotICBtYXJnaW46IDIwcHggMDsKLSAgYmFja2dyb3VuZDogLXdlYmtpdC1saW5lYXItZ3JhZGllbnQodG9wLCAjRjZGNkY2LCNGOUY5RjkpOwotfQotLmhvbWUtc2VjdGlvbnMgdWwgewotICBtYXJnaW46IDA7Ci19Ci0uaG9tZS1zZWN0aW9ucyB1bCBsaSB7Ci0gIGZsb2F0OiBsZWZ0OwotICBkaXNwbGF5OiBibG9jazsKLSAgbGlzdC1zdHlsZTogbm9uZTsKLSAgd2lkdGg6IDE3MHB4OwotICBoZWlnaHQ6IDM1cHg7Ci0gIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7Ci0gIGJhY2tncm91bmQ6IHdoaXRlOwotICBtYXJnaW4tcmlnaHQ6IDEwcHg7Ci0gIGJvcmRlci1yYWRpdXM6IDFweDsKLSAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiAxcHg7Ci0gIC1tb3otYm9yZGVyLXJhZGl1czogMXB4OwotICBib3gtc2hhZG93OiAxcHggMXB4IDVweCAjRUVFOwotICAtd2Via2l0LWJveC1zaGFkb3c6IDFweCAxcHggNXB4ICNFRUU7Ci0gIC1tb3otYm94LXNoYWRvdzogMXB4IDFweCA1cHggI0VFRTsKLSAgYmFja2dyb3VuZDogd2hpdGU7Ci19Ci0uaG9tZS1zZWN0aW9ucyB1bCBsaTpob3ZlciB7Ci0gIGJhY2tncm91bmQ6ICNGOUY5Rjk7Ci0gIGJvcmRlcjogMXB4IHNvbGlkICNDQ0M7Ci19Ci0uaG9tZS1zZWN0aW9ucyB1bCBsaSBhLAotLmhvbWUtc2VjdGlvbnMgdWwgbGkgYTpob3ZlciB7Ci0gIGZvbnQtd2VpZ2h0OiBib2xkOwotICBtYXJnaW4tdG9wOiA4cHg7Ci0gIGxpbmUtaGVpZ2h0OiAxOHB4OwotICBmbG9hdDogbGVmdDsKLSAgd2lkdGg6IDEwMCU7Ci0gIHRleHQtYWxpZ246IGNlbnRlcjsKLSAgY29sb3I6ICMwOWMgIWltcG9ydGFudDsKLX0KLS5ob21lLXNlY3Rpb25zIHVsIGxpIGEgewotICBmb250LXdlaWdodDogYm9sZDsKLSAgbWFyZ2luLXRvcDogOHB4OwotICBsaW5lLWhlaWdodDogMThweDsKLSAgZmxvYXQ6IGxlZnQ7Ci0gIHdpZHRoOjEwMCU7Ci0gIHRleHQtYWxpZ246Y2VudGVyOwotfQotLmhvbWUtc2VjdGlvbnMgdWwgbGkgaW1nIHsKLSAgZmxvYXQ6IGxlZnQ7Ci0gIG1hcmdpbjogLThweCAwIDAgMTBweDsKLX0KLS5ob21lLXNlY3Rpb25zIHVsIGxpLmxhc3QgewotICBtYXJnaW4tcmlnaHQ6IDBweDsKLX0KLS5mdWxscGFnZSAjZm9vdGVyIHsKLSAgbWFyZ2luLXRvcDogLTQwcHg7Ci19Ci0KLS5hbm5vdGF0aW9uLW1lc3NhZ2UgewotICBkaXNwbGF5OiBibG9jazsKLX0KLQotLmRhYy1jdXN0b20tc2VhcmNoIHsKLSAgYmFja2dyb3VuZDogI2ZmZjsKLSAgbWFyZ2luOiAwIC0xMHB4OwotICBwYWRkaW5nOiAyMHB4IDEwcHg7Ci0gIHotaW5kZXg6IDE7Ci19Ci0KLS5kYWMtY3VzdG9tLXNlYXJjaCAuZGFjLWZhYiwgLmRhYy1jdXN0b20tc2VhcmNoIC5kYWMtYnV0dG9uLXNvY2lhbCB7Ci0gIHRvcDogLTQ4cHg7Ci19Ci0KLS5kYWMtY3VzdG9tLXNlYXJjaC1zZWN0aW9uLXRpdGxlIHsKLSAgY29sb3I6ICM1MDUwNTA7Ci19Ci0KLS5kYWMtY3VzdG9tLXNlYXJjaC1lbnRyeSB7Ci0gIG1hcmdpbi1ib3R0b206IDM2cHg7Ci0gIG1hcmdpbi10b3A6IDI0cHg7Ci0gIG1hcmdpbi1sZWZ0OiAwZW07Ci19Ci0KLS5kYWMtY3VzdG9tLXNlYXJjaC1pbWFnZSB7Ci0gIGJhY2tncm91bmQtc2l6ZTogY292ZXI7Ci0gIGhlaWdodDogMTEycHg7Ci19Ci0KLS5kYWMtY3VzdG9tLXNlYXJjaC10aXRsZSB7Ci0gIGNvbG9yOiAjMzMzOwotICBmb250LXNpemU6IDE0cHg7Ci0gIGZvbnQtd2VpZ2h0OiA3MDA7Ci0gIGxpbmUtaGVpZ2h0OiAwcHg7Ci0gIHBhZGRpbmc6IDA7Ci0gIG1hcmdpbjogMWVtIDBlbSAxZW0gMGVtOwotfQotCi0uZGFjLWN1c3RvbS1zZWFyY2gtdGl0bGUgYSB7Ci0gIGNvbG9yOiBpbmhlcml0OwotfQotCi0uZGFjLWN1c3RvbS1zZWFyY2gtc2VjdGlvbiB7Ci0gIGNvbG9yOiAjOTk5OwotICBmb250LXNpemU6IDE2cHg7Ci0gIGZvbnQtdmFyaWFudDogc21hbGwtY2FwczsKLSAgZm9udC13ZWlnaHQ6IDcwMDsKLSAgbWFyZ2luOiAtNXB4IDAgMCAwOwotfQotCi0uZGFjLWN1c3RvbS1zZWFyY2gtc25pcHBldCB7Ci0gIGNvbG9yOiAjNjY2OwotICBtYXJnaW46IDBlbSAwZW0gLjI1ZW0gMGVtOwotfQotCi0uZGFjLWN1c3RvbS1zZWFyY2gtbGluayB7Ci0gIGZvbnQtd2VpZ2h0OiA1MDA7Ci0gIHdvcmQtd3JhcDogYnJlYWstd29yZDsKLSAgd2lkdGg6IDEwMCU7Ci19Ci0KLS5kYWMtY3VzdG9tLXNlYXJjaC1sb2FkLW1vcmUgewotICBiYWNrZ3JvdW5kOiBub25lOwotICBib3JkZXI6IG5vbmU7Ci0gIGNvbG9yOiAjMzMzOwotICBjdXJzb3I6IHBvaW50ZXI7Ci0gIGRpc3BsYXk6IGJsb2NrOwotICBmb250LXNpemU6IDE0cHg7Ci0gIGZvbnQtd2VpZ2h0OiA3MDA7Ci0gIG1hcmdpbjogNzVweCBhdXRvOwotICBvdXRsaW5lOiBub25lOwotICBwYWRkaW5nOiAxMHB4OwotfQotCi0uZGFjLWN1c3RvbS1zZWFyY2gtbG9hZC1tb3JlOmhvdmVyIHsKLSAgb3BhY2l0eTogMC43OwotfQotCi0uZGFjLWN1c3RvbS1zZWFyY2gtbm8tcmVzdWx0cyB7Ci0gIGNvbG9yOiAjOTk5OwotfQotCmRpZmYgLS1naXQgYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9jc3MvZnVsbHNjcmVlbi5jc3MgYi90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9jc3MvZnVsbHNjcmVlbi5jc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxY2Y2NWIuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvY3NzL2Z1bGxzY3JlZW4uY3NzCisrKyAvZGV2L251bGwKQEAgLTEsMjAwICswLDAgQEAKLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgIENvbHVtbnMKLSAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0vKiBBcHBsaWVkIHRvIGJvZHkgdG8gZGVidWcgbGF5b3V0IGFsaWdubWVudHMKLS5ncmlkIHsKLSAgd2lkdGg6MTAwJTsKLSAgaGVpZ2h0OjEwMCU7Ci0gIGJhY2tncm91bmQ6dXJsKC4uL2ltYWdlcy9ncmlkLnBuZykgY2VudGVyIHJlcGVhdC15OwotICB0b3A6MHB4OwotICBtYXJnaW46YXV0bzsKLSAgcG9zaXRpb246YWJzb2x1dGU7Ci19ICAgCi0qLwotCi1AbWVkaWEgc2NyZWVuLCBwcm9qZWN0aW9uLCBwcmludCB7Ci0uZnVsbCB7Ci0JcGFkZGluZzogMi41ZW0gMDsKLQlib3JkZXItdG9wOiBzb2xpZCAxcHggI2RkZDsKLQlib3JkZXItYm90dG9tOiBzb2xpZCAxcHggI2RkZDsKLQliYWNrZ3JvdW5kOiAjZjdmN2Y3OwkKLX0KLS53cmFwIHsKLQltYXJnaW46IDAgYXV0bzsKLQl3aWR0aDogMTAwJTsKLQltaW4td2lkdGg6NjAwcHg7Ci0JY2xlYXI6IGJvdGg7Ci19Ci0uY29scyB7Ci0gICAgaGVpZ2h0OiAxJTsKLSAgICBtYXJnaW46IDAgLTEuNTMzNzQyMzMxMjg4MzQzNTU4MjgyJTsKLSAgICB3aWR0aDogMTAzLjA2NzQ4NDY2MjU3NjY5JX0KLSoraHRtbCAuY29scyB7Ci0gICAgbWFyZ2luLWJvdHRvbTogMjBweDsKLX0KLS5jb2xzOmFmdGVyIHsKLSAgICBjbGVhcjogYm90aDsKLSAgICBjb250ZW50OiAnICc7Ci0gICAgZGlzcGxheTogYmxvY2s7Ci0gICAgaGVpZ2h0OiAwOwotICAgIHZpc2liaWxpdHk6IGhpZGRlbjsKLX0KLS5jb2wtMSwgLmNvbC0yLCAuY29sLTMsIC5jb2wtNCwgLmNvbC01LCAuY29sLTYsIC5jb2wtNywgLmNvbC04LCAuY29sLTksIC5jb2wtMTAsIC5jb2wtMTEsIC5jb2wtMTIsCi0uY29sLTEzLCAuY29sLTE0LCAuY29sLTE1LCAuY29sLTE2IHsKLSAgICBmbG9hdDogbGVmdDsKLSAgICBtYXJnaW46IDAgMS4wNjM4Mjk3ODcyMzQlIDIwcHggMS4wNjM4Mjk3ODcyMzQlOwotfQotKiBodG1sIC5jb2wtMSwgKiBodG1sIC5jb2wtMiwgKiBodG1sIC5jb2wtMywgKiBodG1sIC5jb2wtNCwgKiBodG1sIC5jb2wtNSwgKiBodG1sIC5jb2wtNiwgKiBodG1sCi0uY29sLTcsICogaHRtbCAuY29sLTgsICogaHRtbCAuY29sLTksICogaHRtbCAuY29sLTEwLCAqIGh0bWwgLmNvbC0xMSwgKiBodG1sIC5jb2wtMTIsICogaHRtbAotLmNvbC0xMywgKiBodG1sIC5jb2wtMTQsICogaHRtbCAuY29sLTE1LCAqIGh0bWwgLmNvbC0xNiAgewotICAgIG1hcmdpbjogMDsKLSAgICBtYXJnaW46IDAgMS4wNjM4Mjk3ODcyMzQlIDIwcHggMS4wNjM4Mjk3ODcyMzQlOwotfQotW2Rpcj0ncnRsJ10gLmNvbC0xLCBbZGlyPSdydGwnXSAuY29sLTIsIFtkaXI9J3J0bCddIC5jb2wtMywgW2Rpcj0ncnRsJ10gLmNvbC00LCBbZGlyPSdydGwnXSAuY29sLTUsCi1bZGlyPSdydGwnXSAuY29sLTYsIFtkaXI9J3J0bCddIC5jb2wtNywgW2Rpcj0ncnRsJ10gLmNvbC04LCBbZGlyPSdydGwnXSAuY29sLTksIFtkaXI9J3J0bCddIC5jb2wtMTAsCi1bZGlyPSdydGwnXSAuY29sLTExLCBbZGlyPSdydGwnXSAuY29sLTEyIHsKLSAgICBmbG9hdDogcmlnaHQ7Ci19Ci0uY29sLTEgewotICAgIHdpZHRoOiA0LjE2NjY2NjY2NjY2NjY3JTsKLX0KLS5jb2wtMiB7Ci0gICAgd2lkdGg6IDEwLjQxNjY2NjY2NjY2NjclOwotfQotLmNvbC0zIHsKLSAgICB3aWR0aDogMTYuNjY2NjY2NjY2NjY2NyU7Ci19Ci0uY29sLTQgewotICAgIHdpZHRoOiAyMi45MTY2NjY2NjY2NjY3JTsKLX0KLS5jb2wtNSB7Ci0gICAgd2lkdGg6IDI5LjE2NjY2NjY2NjY2NjclOwotfQotLmNvbC02IHsKLSAgICB3aWR0aDogMzUuNDE2NjY2NjY2NjY2NyU7Ci19Ci0uY29sLTcgewotICAgIHdpZHRoOiA0MS42NjY2NjY2NjY2NjY3JTsKLX0KLS5jb2wtOCB7Ci0gICAgd2lkdGg6IDQ3LjkxNjY2NjY2NjY2NjclOwotfQotLmNvbC05IHsKLSAgICB3aWR0aDogNTUuMzMzMzMzMzMzMzMzMyU7Ci19Ci0uY29sLTEwIHsKLSAgICB3aWR0aDogNjAuNDE2NjY2NjY2NjY2NyU7Ci19Ci0uY29sLTExIHsKLSAgICB3aWR0aDogNjYuNjY2NjY2NjY2NjY2NyU7Ci19Ci0uY29sLTEyIHsKLSAgICB3aWR0aDogNzIuOTE2NjY2NjY2NjY2NyU7Ci19Ci0uY29sLTEzIHsKLSAgICB3aWR0aDogNzkuMTY2NjY2NjY2NjY2NyU7Ci19Ci0uY29sLTE0IHsKLSAgICB3aWR0aDogODUuNDE2NjY2NjY2NjY2NyU7Ci19Ci0uY29sLTE1IHsKLSAgICB3aWR0aDogOTEuNjY2NjY2NjY2NjY2NyU7Ci19Ci0uY29sLTE2IHsKLSAgICB3aWR0aDogOTcuOTE2NjY2NjY2NjY2NyU7Ci19Ci0KLQotCi0KLQotCi0KLSNoZWFkZXIgLmNvbC0xLAotI25hdi14IC5jb2wtMSB7IHdpZHRoOiA0MHB4IH0KLSNoZWFkZXIgLmNvbC0yLAotI25hdi14IC5jb2wtMiB7IHdpZHRoOiAxMDBweCB9Ci0jaGVhZGVyIC5jb2wtMywKLSNuYXYteCAuY29sLTMgeyB3aWR0aDogMTYwcHggfQotI2hlYWRlciAuY29sLTQsCi0jbmF2LXggLmNvbC00IHsgd2lkdGg6IDIyMHB4IH0KLSNoZWFkZXIgLmNvbC01LAotI25hdi14IC5jb2wtNSB7IHdpZHRoOiAyODBweCB9Ci0jaGVhZGVyIC5jb2wtNiwKLSNuYXYteCAuY29sLTYgeyB3aWR0aDogMzQwcHggfQotI2hlYWRlciAuY29sLTcsCi0jbmF2LXggLmNvbC03IHsgd2lkdGg6IDQwMHB4IH0KLSNoZWFkZXIgLmNvbC04LAotI25hdi14IC5jb2wtOCB7IHdpZHRoOiA0NjBweCB9Ci0jaGVhZGVyIC5jb2wtOSwKLSNuYXYteCAuY29sLTkgeyB3aWR0aDogNTIwcHggfQotI2hlYWRlciAuY29sLTEwLAotI25hdi14IC5jb2wtMTAgeyB3aWR0aDogNTgwcHggfQotI2hlYWRlciAuY29sLTExLAotI25hdi14IC5jb2wtMTEgeyB3aWR0aDogNjQwcHggfQotI2hlYWRlciAuY29sLTEyLAotI25hdi14IC5jb2wtMTIgeyB3aWR0aDogNzAwcHggfQotI2hlYWRlciAuY29sLTEzLAotI25hdi14IC5jb2wtMTMgeyB3aWR0aDogNzYwcHggfQotI2hlYWRlciAuY29sLTE0LAotI25hdi14IC5jb2wtMTQgeyB3aWR0aDogODIwcHggfQotI2hlYWRlciAuY29sLTE1LAotI25hdi14IC5jb2wtMTUgeyB3aWR0aDogODgwcHggfQotI2hlYWRlciAuY29sLTE2LAotI25hdi14IC5jb2wtMTYgeyB3aWR0aDogOTQwcHggfQotCi0KLQotYm9keSB7Ci0gIHBhZGRpbmc6MCAyMHB4OwotfQotI2hlYWRlciwKLSNzZWFyY2hSZXN1bHRzLAotI25hdi14IHsKLSAgbWFyZ2luOjA7Ci19Ci0jYm9keS1jb250ZW50IHsKLSAgbWFyZ2luOjA7Ci19Ci0jYm9keS1jb250ZW50ID4gLmNvbC0xMiB7Ci0gIHdpZHRoOjc3Ljk4MDQ5NjUlOwotICBtYXJnaW46MCAwIDAgMC45NyU7IC8qIHRoaXMgcGVyY2VudGFnZSBjaG9zZW4gdG8gbWFrZSBJRTkgaGFwcHkgKi8KLX0KLSNzaWRlLW5hdiB7Ci0gIHdpZHRoOiAxOS45ODA0OTY1JTsKLSAgbWFyZ2luOjAgMS4wNjM4Mjk3ODcyMzQlIDAgMDsKLX0KLQotI2hlYWRlciAud3JhcCB7Ci0gIG1heC13aWR0aDogMTAwJTsKLX0KLQotI25hdi14IC53cmFwLAotI3NlYXJjaFJlc3VsdHMud3JhcCB7Ci0gICAgbWF4LXdpZHRoOjEwMCU7Ci19Ci0KLS5uYXYteCB7Ci0gIG1hcmdpbjotMnB4IDAgMCAwOwotfQotCi0jZGV2ZG9jLW5hdi5maXhlZCwKLSNkZXZkb2MtbmF2LmZpeGVkIGEudG90b3AgewotICBsZWZ0OjIwcHg7IC8qICFpbXBvcnRhbnQgLi4uIGZvciBJRSBpIHRoaW5rICovCi19Ci0KLQotCi0KLX0KLQotLmNvbC1yaWdodCB7Ci0gIG1hcmdpbi1yaWdodDowcHg7Ci19Ci0KLUBtZWRpYSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6NzcycHgpIHsKLS5jb2wtNSwgLmNvbC02LCAuY29sLTcgewotICAgIGNsZWFyOiBib3RoOwotICAgIHdpZHRoOiA5Ny4wMjM4MDk2JX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9kZXNpZ24vZGVmYXVsdC5qcyBiL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2Rlc2lnbi9kZWZhdWx0LmpzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYmE4NDg2Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2Rlc2lnbi9kZWZhdWx0LmpzCisrKyAvZGV2L251bGwKQEAgLTEsMTg4ICswLDAgQEAKLSQoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uKCkgewotICAvLyBwcmVwIG5hdiBleHBhbmRvcwotICB2YXIgcGFnZVBhdGggPSBkb2N1bWVudC5sb2NhdGlvbi5wYXRobmFtZTsKLSAgaWYgKHBhZ2VQYXRoLmluZGV4T2YoU0lURV9ST09UKSA9PSAwKSB7Ci0gICAgcGFnZVBhdGggPSBwYWdlUGF0aC5zdWJzdHIoU0lURV9ST09ULmxlbmd0aCk7Ci0gICAgaWYgKHBhZ2VQYXRoID09ICcnIHx8IHBhZ2VQYXRoLmNoYXJBdChwYWdlUGF0aC5sZW5ndGggLSAxKSA9PSAnLycpIHsKLSAgICAgIHBhZ2VQYXRoICs9ICdpbmRleC5odG1sJzsKLSAgICB9Ci0gIH0KLQotICBpZiAoU0lURV9ST09ULm1hdGNoKC9cLlwuXC8vKSB8fCBTSVRFX1JPT1QgPT0gJycpIHsKLSAgICAvLyBJZiBydW5uaW5nIGxvY2FsbHksIFNJVEVfUk9PVCB3aWxsIGJlIGEgcmVsYXRpdmUgcGF0aCwgc28gYWNjb3VudCBmb3IgdGhhdCBieQotICAgIC8vIGZpbmRpbmcgdGhlIHJlbGF0aXZlIFVSTCB0byB0aGlzIHBhZ2UuIFRoaXMgd2lsbCBhbGxvdyB1cyB0byBmaW5kIGxpbmtzIG9uIHRoZSBwYWdlCi0gICAgLy8gbGVhZGluZyBiYWNrIHRvIHRoaXMgcGFnZS4KLSAgICB2YXIgcGF0aFBhcnRzID0gcGFnZVBhdGguc3BsaXQoJy8nKTsKLSAgICB2YXIgcmVsYXRpdmVQYWdlUGF0aFBhcnRzID0gW107Ci0gICAgdmFyIHVwRGlycyA9IChTSVRFX1JPT1QubWF0Y2goLyhcLlwuXC8pKy8pIHx8IFsnJ10pWzBdLmxlbmd0aCAvIDM7Ci0gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB1cERpcnM7IGkrKykgewotICAgICAgcmVsYXRpdmVQYWdlUGF0aFBhcnRzLnB1c2goJy4uJyk7Ci0gICAgfQotICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdXBEaXJzOyBpKyspIHsKLSAgICAgIHJlbGF0aXZlUGFnZVBhdGhQYXJ0cy5wdXNoKHBhdGhQYXJ0c1twYXRoUGFydHMubGVuZ3RoIC0gKHVwRGlycyAtIGkpIC0gMV0pOwotICAgIH0KLSAgICByZWxhdGl2ZVBhZ2VQYXRoUGFydHMucHVzaChwYXRoUGFydHNbcGF0aFBhcnRzLmxlbmd0aCAtIDFdKTsKLSAgICBwYWdlUGF0aCA9IHJlbGF0aXZlUGFnZVBhdGhQYXJ0cy5qb2luKCcvJyk7Ci0gIH0gZWxzZSB7Ci0gICAgLy8gT3RoZXJ3aXNlIHRoZSBwYWdlIHBhdGggc2hvdWxkIGJlIGFuIGFic29sdXRlIFVSTC4KLSAgICBwYWdlUGF0aCA9IFNJVEVfUk9PVCArIHBhZ2VQYXRoOwotICB9Ci0KLSAgLy8gc2VsZWN0IGN1cnJlbnQgcGFnZSBpbiBzaWRlbmF2IGFuZCBzZXQgdXAgcHJldi9uZXh0IGxpbmtzIGlmIHRoZXkgZXhpc3QKLSAgdmFyICRzZWxOYXZMaW5rID0gJCgnLm5hdi15JykuZmluZCgnYVtocmVmPSInICsgcGFnZVBhdGggKyAnIl0nKTsKLSAgaWYgKCRzZWxOYXZMaW5rLmxlbmd0aCkgewotICAgICRzZWxMaXN0SXRlbSA9ICRzZWxOYXZMaW5rLmNsb3Nlc3QoJ2xpJyk7Ci0KLSAgICAkc2VsTGlzdEl0ZW0uYWRkQ2xhc3MoJ3NlbGVjdGVkJyk7Ci0gICAgJHNlbExpc3RJdGVtLmNsb3Nlc3QoJ2xpPnVsJykuYWRkQ2xhc3MoJ2V4cGFuZGVkJyk7Ci0KLSAgICAvLyBzZXQgdXAgcHJldiBsaW5rcwotICAgIHZhciAkcHJldkxpbmsgPSBbXTsKLSAgICB2YXIgJHByZXZMaXN0SXRlbSA9ICRzZWxMaXN0SXRlbS5wcmV2KCdsaScpOwotICAgIGlmICgkcHJldkxpc3RJdGVtLmxlbmd0aCkgewotICAgICAgaWYgKCRwcmV2TGlzdEl0ZW0uaGFzQ2xhc3MoJ25hdi1zZWN0aW9uJykpIHsKLSAgICAgICAgLy8ganVtcCB0byBsYXN0IHRvcGljIG9mIHByZXZpb3VzIHNlY3Rpb24KLSAgICAgICAgJHByZXZMaW5rID0gJHByZXZMaXN0SXRlbS5maW5kKCdhOmxhc3QnKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIGp1bXAgdG8gcHJldmlvdXMgdG9waWMgaW4gdGhpcyBzZWN0aW9uCi0gICAgICAgICRwcmV2TGluayA9ICRwcmV2TGlzdEl0ZW0uZmluZCgnYTplcSgwKScpOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAvLyBqdW1wIHRvIHRoaXMgc2VjdGlvbidzIGluZGV4IHBhZ2UgKGlmIGl0IGV4aXN0cykKLSAgICAgICRwcmV2TGluayA9ICRzZWxMaXN0SXRlbS5wYXJlbnRzKCdsaScpLmZpbmQoJ2EnKTsKLSAgICB9Ci0KLSAgICBpZiAoJHByZXZMaW5rLmxlbmd0aCkgewotICAgICAgdmFyIHByZXZIcmVmID0gJHByZXZMaW5rLmF0dHIoJ2hyZWYnKTsKLSAgICAgIGlmIChwcmV2SHJlZiA9PSBTSVRFX1JPT1QgKyAnaW5kZXguaHRtbCcpIHsKLSAgICAgICAgLy8gRG9uJ3Qgc2hvdyBQcmV2aW91cyB3aGVuIGl0IGxlYWRzIHRvIHRoZSBob21lcGFnZQotICAgICAgICAkKCcucHJldi1wYWdlLWxpbmsnKS5oaWRlKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAkKCcucHJldi1wYWdlLWxpbmsnKS5hdHRyKCdocmVmJywgcHJldkhyZWYpLnNob3coKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgJCgnLnByZXYtcGFnZS1saW5rJykuaGlkZSgpOwotICAgIH0KLQotICAgIC8vIHNldCB1cCBuZXh0IGxpbmtzCi0gICAgdmFyICRuZXh0TGluayA9IFtdOwotICAgIGlmICgkc2VsTGlzdEl0ZW0uaGFzQ2xhc3MoJ25hdi1zZWN0aW9uJykpIHsKLSAgICAgIC8vIHdlJ3JlIG9uIGFuIGluZGV4IHBhZ2UsIGp1bXAgdG8gdGhlIGZpcnN0IHRvcGljCi0gICAgICAkbmV4dExpbmsgPSAkc2VsTGlzdEl0ZW0uZmluZCgndWwnKS5maW5kKCdhOmVxKDApJykKLSAgICB9IGVsc2UgewotICAgICAgLy8ganVtcCB0byB0aGUgbmV4dCB0b3BpYyBpbiB0aGlzIHNlY3Rpb24gKGlmIGl0IGV4aXN0cykKLSAgICAgICRuZXh0TGluayA9ICRzZWxMaXN0SXRlbS5uZXh0KCdsaScpLmZpbmQoJ2E6ZXEoMCknKTsKLSAgICAgIGlmICghJG5leHRMaW5rLmxlbmd0aCkgewotICAgICAgICAvLyBubyBtb3JlIHRvcGljcyBpbiB0aGlzIHNlY3Rpb24sIGp1bXAgdG8gdGhlIGZpcnN0IHRvcGljIGluIHRoZSBuZXh0IHNlY3Rpb24KLSAgICAgICAgJG5leHRMaW5rID0gJHNlbExpc3RJdGVtLnBhcmVudHMoJ2xpJykubmV4dCgnbGkubmF2LXNlY3Rpb24nKS5maW5kKCdhOmVxKDApJyk7Ci0gICAgICB9Ci0gICAgfQotICAgIGlmICgkbmV4dExpbmsubGVuZ3RoKSB7Ci0gICAgICAkKCcubmV4dC1wYWdlLWxpbmsnKS5hdHRyKCdocmVmJywgJG5leHRMaW5rLmF0dHIoJ2hyZWYnKSkuc2hvdygpOwotICAgIH0gZWxzZSB7Ci0gICAgICAkKCcubmV4dC1wYWdlLWxpbmsnKS5oaWRlKCk7Ci0gICAgfQotICB9Ci0KLSAgLy8gU2V0IHVwIGV4cGFuZC9jb2xsYXBzZSBiZWhhdmlvcgotICAkKCcubmF2LXkgbGknKS5oYXMoJ3VsJykuY2xpY2soZnVuY3Rpb24oKSB7Ci0gICAgaWYgKCQodGhpcykuaGFzQ2xhc3MoJ2V4cGFuZGVkJykpIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyBoaWRlIG90aGVyCi0gICAgdmFyICRvbGQgPSAkKCcubmF2LXkgbGkuZXhwYW5kZWQnKTsKLSAgICBpZiAoJG9sZC5sZW5ndGgpIHsKLSAgICAgIHZhciAkb2xkVWwgPSAkb2xkLmNoaWxkcmVuKCd1bCcpOwotICAgICAgJG9sZFVsLmNzcygnaGVpZ2h0JywgJG9sZFVsLmhlaWdodCgpICsgJ3B4Jyk7Ci0gICAgICB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpIHsKLSAgICAgICAgJG9sZFVsCi0gICAgICAgICAgICAuYWRkQ2xhc3MoJ2FuaW1hdGUtaGVpZ2h0JykKLSAgICAgICAgICAgIC5jc3MoJ2hlaWdodCcsICcnKTsKLSAgICAgIH0sIDApOwotICAgICAgJG9sZC5yZW1vdmVDbGFzcygnZXhwYW5kZWQnKTsKLSAgICB9Ci0KLSAgICAvLyBzaG93IG1lCi0gICAgJCh0aGlzKS5hZGRDbGFzcygnZXhwYW5kZWQnKTsKLSAgICB2YXIgJHVsID0gJCh0aGlzKS5jaGlsZHJlbigndWwnKTsKLSAgICB2YXIgZXhwYW5kZWRIZWlnaHQgPSAkdWwuaGVpZ2h0KCk7Ci0gICAgJHVsCi0gICAgICAgIC5yZW1vdmVDbGFzcygnYW5pbWF0ZS1oZWlnaHQnKQotICAgICAgICAuY3NzKCdoZWlnaHQnLCAwKTsKLSAgICB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpIHsKLSAgICAgICR1bAotICAgICAgICAgIC5hZGRDbGFzcygnYW5pbWF0ZS1oZWlnaHQnKQotICAgICAgICAgIC5jc3MoJ2hlaWdodCcsIGV4cGFuZGVkSGVpZ2h0ICsgJ3B4Jyk7Ci0gICAgfSwgMCk7Ci0gIH0pOwotCi0gIC8vIFN0b3AgZXhwYW5kL2NvbGxhcHNlIGJlaGF2aW9yIHdoZW4gY2xpY2tpbmcgb24gbmF2IHNlY3Rpb24gbGlua3MgKHNpbmNlIHdlJ3JlIG5hdmlnYXRpbmcgYXdheQotICAvLyBmcm9tIHRoZSBwYWdlKQotICAkKCcubmF2LXkgbGknKS5oYXMoJ3VsJykuZmluZCgnYTplcSgwKScpLmNsaWNrKGZ1bmN0aW9uKGV2dCkgewotICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gJCh0aGlzKS5hdHRyKCdocmVmJyk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9KTsKLQotICAvLyBTZXQgdXAgcGxheS1vbi1ob3ZlciA8dmlkZW8+IHRhZ3MuCi0gICQoJ3ZpZGVvLnBsYXktb24taG92ZXInKS5iaW5kKCdjbGljaycsIGZ1bmN0aW9uKCl7Ci0gICAgJCh0aGlzKS5nZXQoMCkubG9hZCgpOyAvLyBpbiBjYXNlIHRoZSB2aWRlbyBpc24ndCBzZWVrYWJsZQotICAgICQodGhpcykuZ2V0KDApLnBsYXkoKTsKLSAgfSk7Ci0KLSAgLy8gU2V0IHVwIHRvb2x0aXBzCi0gIHZhciBUT09MVElQX01BUkdJTiA9IDEwOwotICAkKCdhY3JvbnltJykuZWFjaChmdW5jdGlvbigpIHsKLSAgICB2YXIgJHRhcmdldCA9ICQodGhpcyk7Ci0gICAgdmFyICR0b29sdGlwID0gJCgnPGRpdj4nKQotICAgICAgICAuYWRkQ2xhc3MoJ3Rvb2x0aXAtYm94JykKLSAgICAgICAgLnRleHQoJHRhcmdldC5hdHRyKCd0aXRsZScpKQotICAgICAgICAuaGlkZSgpCi0gICAgICAgIC5hcHBlbmRUbygnYm9keScpOwotICAgICR0YXJnZXQucmVtb3ZlQXR0cigndGl0bGUnKTsKLQotICAgICR0YXJnZXQuaG92ZXIoZnVuY3Rpb24oKSB7Ci0gICAgICAvLyBpbgotICAgICAgdmFyIHRhcmdldFJlY3QgPSAkdGFyZ2V0Lm9mZnNldCgpOwotICAgICAgdGFyZ2V0UmVjdC53aWR0aCA9ICR0YXJnZXQud2lkdGgoKTsKLSAgICAgIHRhcmdldFJlY3QuaGVpZ2h0ID0gJHRhcmdldC5oZWlnaHQoKTsKLQotICAgICAgJHRvb2x0aXAuY3NzKHsKLSAgICAgICAgbGVmdDogdGFyZ2V0UmVjdC5sZWZ0LAotICAgICAgICB0b3A6IHRhcmdldFJlY3QudG9wICsgdGFyZ2V0UmVjdC5oZWlnaHQgKyBUT09MVElQX01BUkdJTgotICAgICAgfSk7Ci0gICAgICAkdG9vbHRpcC5hZGRDbGFzcygnYmVsb3cnKTsKLSAgICAgICR0b29sdGlwLnNob3coKTsKLSAgICB9LCBmdW5jdGlvbigpIHsKLSAgICAgIC8vIG91dAotICAgICAgJHRvb2x0aXAuaGlkZSgpOwotICAgIH0pOwotICB9KTsKLQotICAvLyBTZXQgdXAgPGgyPiBkZWVwbGlua3MKLSAgJCgnaDInKS5jbGljayhmdW5jdGlvbigpIHsKLSAgICB2YXIgaWQgPSAkKHRoaXMpLmF0dHIoJ2lkJyk7Ci0gICAgaWYgKGlkKSB7Ci0gICAgICBkb2N1bWVudC5sb2NhdGlvbi5oYXNoID0gaWQ7Ci0gICAgfQotICB9KTsKLQotICAvLyBTZXQgdXAgZml4ZWQgbmF2YmFyCi0gIHZhciBuYXZCYXJJc0ZpeGVkID0gZmFsc2U7Ci0gICQod2luZG93KS5zY3JvbGwoZnVuY3Rpb24oKSB7Ci0gICAgdmFyIHNjcm9sbFRvcCA9ICQod2luZG93KS5zY3JvbGxUb3AoKTsKLSAgICB2YXIgbmF2QmFyU2hvdWxkQmVGaXhlZCA9IChzY3JvbGxUb3AgPiAoMTAwIC0gNDApKTsKLSAgICBpZiAobmF2QmFySXNGaXhlZCAhPSBuYXZCYXJTaG91bGRCZUZpeGVkKSB7Ci0gICAgICBpZiAobmF2QmFyU2hvdWxkQmVGaXhlZCkgewotICAgICAgICAkKCcjbmF2JykKLSAgICAgICAgICAgIC5hZGRDbGFzcygnZml4ZWQnKQotICAgICAgICAgICAgLnByZXBlbmRUbygnI3BhZ2UtY29udGFpbmVyJyk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAkKCcjbmF2JykKLSAgICAgICAgICAgIC5yZW1vdmVDbGFzcygnZml4ZWQnKQotICAgICAgICAgICAgLnByZXBlbmRUbygnI25hdi1jb250YWluZXInKTsKLSAgICAgIH0KLSAgICAgIG5hdkJhcklzRml4ZWQgPSBuYXZCYXJTaG91bGRCZUZpeGVkOwotICAgIH0KLSAgfSk7Ci19KTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvYW5kcm9pZC1kZXZlbG9wZXJzLWxvZ28ucG5nIGIvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2FuZHJvaWQtZGV2ZWxvcGVycy1sb2dvLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzBhOGY2Mi4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvYW5kcm9pZC1kZXZlbG9wZXJzLWxvZ28ucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2FuZHJvaWRfd3JlbmNoLnBuZyBiL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9hbmRyb2lkX3dyZW5jaC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzOTBhMmQuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2FuZHJvaWRfd3JlbmNoLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9hcnJvdy1sZWZ0LWRldmVsb3AucG5nIGIvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2Fycm93LWxlZnQtZGV2ZWxvcC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmZGZhYTMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2Fycm93LWxlZnQtZGV2ZWxvcC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvYXJyb3ctbGVmdC5wbmcgYi90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvYXJyb3ctbGVmdC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzYWZlYzguLjAwMDAwMDAKLS0tIGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2Fycm93LWxlZnQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2Fycm93LXJpZ2h0LWRldmVsb3AucG5nIGIvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2Fycm93LXJpZ2h0LWRldmVsb3AucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODZmMWYzLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9hcnJvdy1yaWdodC1kZXZlbG9wLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9hcnJvdy1yaWdodC5wbmcgYi90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvYXJyb3ctcmlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjdkNmRiLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9hcnJvdy1yaWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvYXJyb3dfYmx1ZWxpbmtfZG93bi5wbmcgYi90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvYXJyb3dfYmx1ZWxpbmtfZG93bi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU4YzI0OGEuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2Fycm93X2JsdWVsaW5rX2Rvd24ucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2Fycm93X2JsdWVsaW5rX3VwLnBuZyBiL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9hcnJvd19ibHVlbGlua191cC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDdkMGYzOGUuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2Fycm93X2JsdWVsaW5rX3VwLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9hcnJvd19sZWZ0X29mZi5qcGcgYi90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvYXJyb3dfbGVmdF9vZmYuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmZDMyYTY0Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9hcnJvd19sZWZ0X29mZi5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvYXJyb3dfbGVmdF9vbi5qcGcgYi90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvYXJyb3dfbGVmdF9vbi5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE0MzE4NGIuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2Fycm93X2xlZnRfb24uanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2Fycm93X3JpZ2h0X29mZi5qcGcgYi90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvYXJyb3dfcmlnaHRfb2ZmLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTdkMmVmZS4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvYXJyb3dfcmlnaHRfb2ZmLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9hcnJvd19yaWdodF9vbi5qcGcgYi90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvYXJyb3dfcmlnaHRfb24uanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiYWEyYWYxLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9hcnJvd19yaWdodF9vbi5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvYXJyb3dzLXVwLWRvd24ucG5nIGIvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2Fycm93cy11cC1kb3duLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJhOTFlZC4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvYXJyb3dzLXVwLWRvd24ucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2JnX2NvbW11bml0eV9sZWZ0RGl2LmpwZyBiL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9iZ19jb21tdW5pdHlfbGVmdERpdi5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE2ZDZmMGUuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2JnX2NvbW11bml0eV9sZWZ0RGl2LmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9iZ19mYWRlLmpwZyBiL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9iZ19mYWRlLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzZjNzBiNi4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvYmdfZmFkZS5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvYmdfZ3JhZGllbnQuanBnIGIvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2JnX2dyYWRpZW50LmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODg0ZjhmNS4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvYmdfZ3JhZGllbnQuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2JnX2ltYWdlc19zcHJpdGUucG5nIGIvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2JnX2ltYWdlc19zcHJpdGUucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4NDQzN2U3Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9iZ19pbWFnZXNfc3ByaXRlLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9iZ19sb2dvLnBuZyBiL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9iZ19sb2dvLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2NmMGNiOS4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvYmdfbG9nby5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvYmxvZy1kZWZhdWx0LnBuZyBiL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9ibG9nLWRlZmF1bHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOGFiNmMzLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9ibG9nLWRlZmF1bHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2JvZHktZ3JhZGllbnQtdGFiLnBuZyBiL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9ib2R5LWdyYWRpZW50LXRhYi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyMjNhYzMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2JvZHktZ3JhZGllbnQtdGFiLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9ib2R5LWdyYWRpZW50LnBuZyBiL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9ib2R5LWdyYWRpZW50LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWQ1OTg1NS4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvYm9keS1ncmFkaWVudC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvY2xvc2UucG5nIGIvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2Nsb3NlLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmFlMzM5MS4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvY2xvc2UucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2RhY19sb2dvLnBuZyBiL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9kYWNfbG9nby5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmMTEwNDQuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2RhY19sb2dvLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9kZXZlbG9wZXJzLWxvZ28ucG5nIGIvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2RldmVsb3BlcnMtbG9nby5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA4MTIyZWUuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2RldmVsb3BlcnMtbG9nby5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvZnVsbHNjcmVlbi5wbmcgYi90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvZnVsbHNjcmVlbi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxZjk3MWMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2Z1bGxzY3JlZW4ucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2dyYWQtcnVsZS1xdi5wbmcgYi90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvZ3JhZC1ydWxlLXF2LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmFlMmQxOC4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvZ3JhZC1ydWxlLXF2LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9ob21lL0FuZHJvaWRfRGV2X0xhYl9sLnBuZyBiL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9ob21lL0FuZHJvaWRfRGV2X0xhYl9sLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2MwNGYyNC4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvaG9tZS9BbmRyb2lkX0Rldl9MYWJfbC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvaG9tZS9HREMyMDExLnBuZyBiL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9ob21lL0dEQzIwMTEucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MmNlOTE4Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9ob21lL0dEQzIwMTEucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2hvbWUvR1RWX2ljb25fbGFyZ2UucG5nIGIvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2hvbWUvR1RWX2ljb25fbGFyZ2UucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MmQ1NGFkLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9ob21lL0dUVl9pY29uX2xhcmdlLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9ob21lL0dUVl9pY29uX3NtYWxsLnBuZyBiL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9ob21lL0dUVl9pY29uX3NtYWxsLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RhMTY5OS4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvaG9tZS9HVFZfaWNvbl9zbWFsbC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvaG9tZS9JTy1sb2dvLTIwMTEucG5nIGIvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2hvbWUvSU8tbG9nby0yMDExLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGEyODQ0Ny4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvaG9tZS9JTy1sb2dvLTIwMTEucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2hvbWUvSU8tbG9nby5wbmcgYi90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvaG9tZS9JTy1sb2dvLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjUzMzRjOC4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvaG9tZS9JTy1sb2dvLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9ob21lL2FkYzJfbC5wbmcgYi90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvaG9tZS9hZGMyX2wucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjEwMWE0Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9ob21lL2FkYzJfbC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvaG9tZS9hZGMyX3MucG5nIGIvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2hvbWUvYWRjMl9zLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQzNmJkYi4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvaG9tZS9hZGMyX3MucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2hvbWUvYW5kcm9pZF9hZGMucG5nIGIvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2hvbWUvYW5kcm9pZF9hZGMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZmU3ZjhmLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9ob21lL2FuZHJvaWRfYWRjLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9ob21lL2JnX2hvbWVfYW5ub3VuY2VtZW50LnBuZyBiL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9ob21lL2JnX2hvbWVfYW5ub3VuY2VtZW50LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTE0ODVmZi4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvaG9tZS9iZ19ob21lX2Fubm91bmNlbWVudC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvaG9tZS9iZ19ob21lX2JvdHRvbS5qcGcgYi90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvaG9tZS9iZ19ob21lX2JvdHRvbS5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRhY2Q0MDEuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2hvbWUvYmdfaG9tZV9ib3R0b20uanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2hvbWUvYmdfaG9tZV9jYXJvdXNlbC5wbmcgYi90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvaG9tZS9iZ19ob21lX2Nhcm91c2VsLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWNlNWUzMC4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvaG9tZS9iZ19ob21lX2Nhcm91c2VsLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9ob21lL2JnX2hvbWVfY2Fyb3VzZWxfYm9hcmQucG5nIGIvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2hvbWUvYmdfaG9tZV9jYXJvdXNlbF9ib2FyZC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM1NzdlMDIuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2hvbWUvYmdfaG9tZV9jYXJvdXNlbF9ib2FyZC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvaG9tZS9iZ19ob21lX2Nhcm91c2VsX3doZWVsLnBuZyBiL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9ob21lL2JnX2hvbWVfY2Fyb3VzZWxfd2hlZWwucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhYTIyNGFkLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9ob21lL2JnX2hvbWVfY2Fyb3VzZWxfd2hlZWwucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2hvbWUvY2Fyb3VzZWxfYnV0dG9uc19zcHJpdGUucG5nIGIvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2hvbWUvY2Fyb3VzZWxfYnV0dG9uc19zcHJpdGUucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlOThjOTQyLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9ob21lL2Nhcm91c2VsX2J1dHRvbnNfc3ByaXRlLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9ob21lL2RldnBob25lLWxhcmdlLnBuZyBiL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9ob21lL2RldnBob25lLWxhcmdlLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRiMGY2Yy4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvaG9tZS9kZXZwaG9uZS1sYXJnZS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvaG9tZS9kZXZwaG9uZS1zbWFsbC5wbmcgYi90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvaG9tZS9kZXZwaG9uZS1zbWFsbC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxMGJmYTkuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2hvbWUvZGV2cGhvbmUtc21hbGwucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2hvbWUvZG9udXQtYW5kcm9pZC5wbmcgYi90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvaG9tZS9kb251dC1hbmRyb2lkLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmFiYTA2Yi4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvaG9tZS9kb251dC1hbmRyb2lkLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9ob21lL2VjbGFpci1hbmRyb2lkLnBuZyBiL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9ob21lL2VjbGFpci1hbmRyb2lkLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ3NmNlOS4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvaG9tZS9lY2xhaXItYW5kcm9pZC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvaG9tZS9mcm95by1hbmRyb2lkLnBuZyBiL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9ob21lL2Zyb3lvLWFuZHJvaWQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjNmN2YwLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9ob21lL2Zyb3lvLWFuZHJvaWQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2hvbWUvZ2RjLWxvZ28ucG5nIGIvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2hvbWUvZ2RjLWxvZ28ucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZmI1M2ZiLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9ob21lL2dkYy1sb2dvLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9ob21lL2dpbmdlcmRyb2lkLnBuZyBiL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9ob21lL2dpbmdlcmRyb2lkLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODM5OWQ4NC4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvaG9tZS9naW5nZXJkcm9pZC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvaG9tZS9nb29nbGUtcGx1cy1zbWFsbC5wbmcgYi90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvaG9tZS9nb29nbGUtcGx1cy1zbWFsbC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViYjdkN2EuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2hvbWUvZ29vZ2xlLXBsdXMtc21hbGwucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2hvbWUvZ29vZ2xlLXBsdXMucG5nIGIvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2hvbWUvZ29vZ2xlLXBsdXMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDg3MWUxLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9ob21lL2dvb2dsZS1wbHVzLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9ob21lL2hvbmV5Y29tYi1hbmRyb2lkLnBuZyBiL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9ob21lL2hvbmV5Y29tYi1hbmRyb2lkLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmNjNTAzMS4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvaG9tZS9ob25leWNvbWItYW5kcm9pZC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvaG9tZS9pY29uLWFib3V0LnBuZyBiL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9ob21lL2ljb24tYWJvdXQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzM5NzYyLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9ob21lL2ljb24tYWJvdXQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2hvbWUvaWNvbi1kZXNpZ24ucG5nIGIvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2hvbWUvaWNvbi1kZXNpZ24ucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDMxY2RmLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9ob21lL2ljb24tZGVzaWduLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9ob21lL2ljb24tZGV2ZWxvcC5wbmcgYi90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvaG9tZS9pY29uLWRldmVsb3AucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDJiMjBmLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9ob21lL2ljb24tZGV2ZWxvcC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvaG9tZS9pY29uLWRpc3RyaWJ1dGUucG5nIGIvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2hvbWUvaWNvbi1kaXN0cmlidXRlLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDgyNDA3Mi4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvaG9tZS9pY29uLWRpc3RyaWJ1dGUucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2hvbWUvaWNzLWFuZHJvaWQucG5nIGIvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2hvbWUvaWNzLWFuZHJvaWQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTYyY2E4Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9ob21lL2ljcy1hbmRyb2lkLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9ob21lL2lvLWxhcmdlLnBuZyBiL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9ob21lL2lvLWxhcmdlLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTg2MDUzYy4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvaG9tZS9pby1sYXJnZS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvaG9tZS9pby1zbWFsbC5wbmcgYi90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvaG9tZS9pby1zbWFsbC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNhMjI1NDkuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2hvbWUvaW8tc21hbGwucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2hvbWUvbWFwcy1sYXJnZS5wbmcgYi90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvaG9tZS9tYXBzLWxhcmdlLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjI2ZjY1YS4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvaG9tZS9tYXBzLWxhcmdlLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9ob21lL21hcHMtc21hbGwucG5nIGIvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2hvbWUvbWFwcy1zbWFsbC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjNWYxZmEuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2hvbWUvbWFwcy1zbWFsbC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvaG9tZS9tYXJrZXQtbGFyZ2UucG5nIGIvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2hvbWUvbWFya2V0LWxhcmdlLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY5ZmVlNy4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvaG9tZS9tYXJrZXQtbGFyZ2UucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2hvbWUvbWFya2V0LXNtYWxsLnBuZyBiL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9ob21lL21hcmtldC1zbWFsbC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhMTIwMWMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2hvbWUvbWFya2V0LXNtYWxsLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9ob21lL3Nkay1sYXJnZS5wbmcgYi90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvaG9tZS9zZGstbGFyZ2UucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTVhMWJmLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9ob21lL3Nkay1sYXJnZS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvaG9tZS9zZGstc21hbGwucG5nIGIvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2hvbWUvc2RrLXNtYWxsLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGYxNjcwZC4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvaG9tZS9zZGstc21hbGwucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2hyX2dyYXlfbWFpbi5qcGcgYi90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvaHJfZ3JheV9tYWluLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjdhMGEyZi4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvaHJfZ3JheV9tYWluLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9ocl9ncmF5X3NpZGUuanBnIGIvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2hyX2dyYXlfc2lkZS5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDY2Njc0NzYuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2hyX2dyYXlfc2lkZS5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvaWNvbl9jb250cmlidXRlLmpwZyBiL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9pY29uX2NvbnRyaWJ1dGUuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxYWExMmI2Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9pY29uX2NvbnRyaWJ1dGUuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2ljb25fZGVzaWduLnBuZyBiL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9pY29uX2Rlc2lnbi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxMjkwN2MuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2ljb25fZGVzaWduLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9pY29uX2Rvd25sb2FkLmpwZyBiL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9pY29uX2Rvd25sb2FkLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjhjMTE2NS4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvaWNvbl9kb3dubG9hZC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvaWNvbl9kb3dubG9hZDIuanBnIGIvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2ljb25fZG93bmxvYWQyLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzBhZjdhMi4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvaWNvbl9kb3dubG9hZDIuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2ljb25fZ3VpZGVsaW5lc19sb2dvLnBuZyBiL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9pY29uX2d1aWRlbGluZXNfbG9nby5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzNjJjOGYuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2ljb25fZ3VpZGVsaW5lc19sb2dvLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9pY29uX21hcmtldC5qcGcgYi90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvaWNvbl9tYXJrZXQuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZmJiMTk3Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9pY29uX21hcmtldC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvaWNvbl9tb3JlLnBuZyBiL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9pY29uX21vcmUucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Y2QwM2EzLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9pY29uX21vcmUucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2ljb25fcGxheS5wbmcgYi90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvaWNvbl9wbGF5LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGJmZGM3Yi4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvaWNvbl9wbGF5LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9pY29uX3JvYm90LmpwZyBiL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9pY29uX3JvYm90LmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2EwZmQzOS4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvaWNvbl9yb2JvdC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvaWNvbl9zZWFyY2gucG5nIGIvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2ljb25fc2VhcmNoLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWU5MGExMi4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvaWNvbl9zZWFyY2gucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2ljb25fd29ybGQuanBnIGIvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2ljb25fd29ybGQuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2NWI4ZmE2Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9pY29uX3dvcmxkLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9sZWZ0X29mZi5qcGcgYi90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvbGVmdF9vZmYuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmZDMyYTY0Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9sZWZ0X29mZi5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvbGVmdF9vbi5qcGcgYi90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvbGVmdF9vbi5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE0MzE4NGIuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2xlZnRfb24uanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2xvY2FsZS5wbmcgYi90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvbG9jYWxlLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGUzYWFlNy4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvbG9jYWxlLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9sb2dvX2JyZWFkY3J1bWJ6LmpwZyBiL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9sb2dvX2JyZWFkY3J1bWJ6LmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTc0M2Y4Ni4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvbG9nb19icmVhZGNydW1iei5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvbW9yZV9ib3R0b20ucG5nIGIvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL21vcmVfYm90dG9tLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjMyNTQ2YS4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvbW9yZV9ib3R0b20ucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL21vcmVfY2hlY2sucG5nIGIvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL21vcmVfY2hlY2sucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMmZjYmZjLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9tb3JlX2NoZWNrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9tb3JlX21pZC5wbmcgYi90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvbW9yZV9taWQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OWJjOTk5Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9tb3JlX21pZC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvbW9yZV90b3AucG5nIGIvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL21vcmVfdG9wLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGVhZDFkMy4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvbW9yZV90b3AucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL29wZW5fc291cmNlLnBuZyBiL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9vcGVuX3NvdXJjZS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDEyYmIxZmIuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL29wZW5fc291cmNlLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9wcmVsaW1pbmFyeS5wbmcgYi90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvcHJlbGltaW5hcnkucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTBkYTNkLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9wcmVsaW1pbmFyeS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvcXVpY2tuYXZfYXJyb3cucG5nIGIvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL3F1aWNrbmF2X2Fycm93LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjk3YWM4Mi4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvcXVpY2tuYXZfYXJyb3cucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL3F1aWNrbmF2X2J0bl9iZy5wbmcgYi90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvcXVpY2tuYXZfYnRuX2JnLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjgwYzlhOC4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvcXVpY2tuYXZfYnRuX2JnLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9yZXNpemFibGUtZS5naWYgYi90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvcmVzaXphYmxlLWUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmNzQ4MDk3Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9yZXNpemFibGUtZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvcmVzaXphYmxlLWUyLmdpZiBiL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9yZXNpemFibGUtZTIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlNDVkMGM1Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9yZXNpemFibGUtZTIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL3Jlc2l6YWJsZS1lZy5naWYgYi90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvcmVzaXphYmxlLWVnLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjE5NjYxNi4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvcmVzaXphYmxlLWVnLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9yZXNpemFibGUtcy5naWYgYi90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvcmVzaXphYmxlLXMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3ZjZhNGViLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9yZXNpemFibGUtcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvcmVzaXphYmxlLXMyLmdpZiBiL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9yZXNpemFibGUtczIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5OWU4NjljLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9yZXNpemFibGUtczIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL3Jlc2l6YWJsZS1zMi5wbmcgYi90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvcmVzaXphYmxlLXMyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjNhNmQyZC4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvcmVzaXphYmxlLXMyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9yZXNpemFibGUtc2cuZ2lmIGIvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL3Jlc2l6YWJsZS1zZy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGI0YmVhMTAuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL3Jlc2l6YWJsZS1zZy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvcmVzb3VyY2UtYXJ0aWNsZS5wbmcgYi90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvcmVzb3VyY2UtYXJ0aWNsZS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxNjQ5M2YuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL3Jlc291cmNlLWFydGljbGUucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL3Jlc291cmNlLWJpZy1hcnRpY2xlLnBuZyBiL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9yZXNvdXJjZS1iaWctYXJ0aWNsZS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyNzMyNzUuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL3Jlc291cmNlLWJpZy1hcnRpY2xlLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9yZXNvdXJjZS1iaWctc2FtcGxlLnBuZyBiL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9yZXNvdXJjZS1iaWctc2FtcGxlLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTliNmI2OC4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvcmVzb3VyY2UtYmlnLXNhbXBsZS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvcmVzb3VyY2UtYmlnLXR1dG9yaWFsLnBuZyBiL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9yZXNvdXJjZS1iaWctdHV0b3JpYWwucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzJlODlhLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9yZXNvdXJjZS1iaWctdHV0b3JpYWwucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL3Jlc291cmNlLWJpZy12aWRlby5wbmcgYi90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvcmVzb3VyY2UtYmlnLXZpZGVvLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTlkNDZhMC4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvcmVzb3VyY2UtYmlnLXZpZGVvLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9yZXNvdXJjZS1zYW1wbGUucG5nIGIvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL3Jlc291cmNlLXNhbXBsZS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3YTQxMWMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL3Jlc291cmNlLXNhbXBsZS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvcmVzb3VyY2UtdHV0b3JpYWwucG5nIGIvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL3Jlc291cmNlLXR1dG9yaWFsLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBhMTRmZS4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvcmVzb3VyY2UtdHV0b3JpYWwucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL3Jlc291cmNlLXZpZGVvLnBuZyBiL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9yZXNvdXJjZS12aWRlby5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmZDVjYWUuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL3Jlc291cmNlLXZpZGVvLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9yaWdodF9vZmYuanBnIGIvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL3JpZ2h0X29mZi5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE3ZDJlZmUuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL3JpZ2h0X29mZi5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvcmlnaHRfb24uanBnIGIvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL3JpZ2h0X29uLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmFhMmFmMS4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvcmlnaHRfb24uanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL3NhY19sb2dvLnBuZyBiL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9zYWNfbG9nby5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhZDExM2MuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL3NhY19sb2dvLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9zYWNfbG9nb0AyeC5wbmcgYi90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvc2FjX2xvZ29AMngucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDQwZjNmLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9zYWNfbG9nb0AyeC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvc2lkZW5hdi1ydWxlLnBuZyBiL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9zaWRlbmF2LXJ1bGUucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWI5OTIwLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9zaWRlbmF2LXJ1bGUucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL3NsaWRlXzEuanBnIGIvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL3NsaWRlXzEuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2ZDc1YmUxLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9zbGlkZV8xLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9zbGlkZV8yLmpwZyBiL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9zbGlkZV8yLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWE5OTRjMi4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvc2xpZGVfMi5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvc2xpZGVfMy5qcGcgYi90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvc2xpZGVfMy5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGIwNGRlYjMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL3NsaWRlXzMuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL3NsaWRlX2xhcmdlXzEuanBnIGIvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL3NsaWRlX2xhcmdlXzEuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhOTkyZTkyLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9zbGlkZV9sYXJnZV8xLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9zbGlkZV9sYXJnZV8yLmpwZyBiL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9zbGlkZV9sYXJnZV8yLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWFmNjNmNC4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvc2xpZGVfbGFyZ2VfMi5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvc2xpZGVfbGFyZ2VfMy5qcGcgYi90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvc2xpZGVfbGFyZ2VfMy5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZjZjIzNmMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL3NsaWRlX2xhcmdlXzMuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL3NsaWRlX29mZi5qcGcgYi90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvc2xpZGVfb2ZmLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTk3MTIyNy4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvc2xpZGVfb2ZmLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9zbGlkZV9vbi5qcGcgYi90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvc2xpZGVfb24uanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3Y2EzNTc3Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9zbGlkZV9vbi5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvc3BhY2VyLmdpZiBiL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9zcGFjZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmOTZiMzU1Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9zcGFjZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL3N0eWxlcy9jYWxsb3V0LnBuZyBiL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9zdHlsZXMvY2FsbG91dC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkNDlmMzQuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL3N0eWxlcy9jYWxsb3V0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9zdHlsZXMvZGV2aWNlX2dhbGF4eW5leHVzX2JsYW5rX2xhbmRfc3BhbjEzLnBuZyBiL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9zdHlsZXMvZGV2aWNlX2dhbGF4eW5leHVzX2JsYW5rX2xhbmRfc3BhbjEzLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmFiNmFjYS4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvc3R5bGVzL2RldmljZV9nYWxheHluZXh1c19ibGFua19sYW5kX3NwYW4xMy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvc3R5bGVzL2RldmljZV9nYWxheHluZXh1c19ibGFua19sYW5kX3NwYW44LnBuZyBiL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9zdHlsZXMvZGV2aWNlX2dhbGF4eW5leHVzX2JsYW5rX2xhbmRfc3BhbjgucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjE4MGJmLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9zdHlsZXMvZGV2aWNlX2dhbGF4eW5leHVzX2JsYW5rX2xhbmRfc3BhbjgucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL3N0eWxlcy9kZXZpY2VfZ2FsYXh5bmV4dXNfYmxhbmtfcG9ydF9zcGFuNS5wbmcgYi90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvc3R5bGVzL2RldmljZV9nYWxheHluZXh1c19ibGFua19wb3J0X3NwYW41LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRjY2MyZi4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvc3R5bGVzL2RldmljZV9nYWxheHluZXh1c19ibGFua19wb3J0X3NwYW41LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9zdHlsZXMvZGV2aWNlX2dhbGF4eW5leHVzX2JsYW5rX3BvcnRfc3BhbjkucG5nIGIvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL3N0eWxlcy9kZXZpY2VfZ2FsYXh5bmV4dXNfYmxhbmtfcG9ydF9zcGFuOS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlMDEzNWIuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL3N0eWxlcy9kZXZpY2VfZ2FsYXh5bmV4dXNfYmxhbmtfcG9ydF9zcGFuOS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvc3R5bGVzL2Rpc2Nsb3N1cmVfZG93bi5wbmcgYi90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvc3R5bGVzL2Rpc2Nsb3N1cmVfZG93bi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhMGE4ZWUuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL3N0eWxlcy9kaXNjbG9zdXJlX2Rvd24ucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL3N0eWxlcy9kaXNjbG9zdXJlX2xlZnQucG5nIGIvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL3N0eWxlcy9kaXNjbG9zdXJlX2xlZnQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODg3YjJhLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9zdHlsZXMvZGlzY2xvc3VyZV9sZWZ0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9zdHlsZXMvZGlzY2xvc3VyZV9yaWdodC5wbmcgYi90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvc3R5bGVzL2Rpc2Nsb3N1cmVfcmlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWQ3ZmE0Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9zdHlsZXMvZGlzY2xvc3VyZV9yaWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvc3R5bGVzL2Rpc2Nsb3N1cmVfdXAucG5nIGIvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL3N0eWxlcy9kaXNjbG9zdXJlX3VwLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGRkNGVjOS4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvc3R5bGVzL2Rpc2Nsb3N1cmVfdXAucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL3N0eWxlcy9nb3RvdG9wLnBuZyBiL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9zdHlsZXMvZ290b3RvcC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmMDlhMjkuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL3N0eWxlcy9nb3RvdG9wLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9zdHlsZXMvaWNvX2FjdGlvbi5wbmcgYi90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvc3R5bGVzL2ljb19hY3Rpb24ucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMGU0Y2M3Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9zdHlsZXMvaWNvX2FjdGlvbi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvc3R5bGVzL2ljb19nb29kLnBuZyBiL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9zdHlsZXMvaWNvX2dvb2QucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmViZTFjLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9zdHlsZXMvaWNvX2dvb2QucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL3N0eWxlcy9pY29fbW92aWVfaW5saW5lLnBuZyBiL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9zdHlsZXMvaWNvX21vdmllX2lubGluZS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjZmI1YzUuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL3N0eWxlcy9pY29fbW92aWVfaW5saW5lLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9zdHlsZXMvaWNvX3Bob25lX3RhYmxldC5wbmcgYi90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvc3R5bGVzL2ljb19waG9uZV90YWJsZXQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDNiODc2Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9zdHlsZXMvaWNvX3Bob25lX3RhYmxldC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvc3R5bGVzL2ljb191c2UucG5nIGIvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL3N0eWxlcy9pY29fdXNlLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQ4NjhiMy4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvc3R5bGVzL2ljb191c2UucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL3N0eWxlcy9pY29fd2ViLnBuZyBiL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9zdHlsZXMvaWNvX3dlYi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4NDhlM2MuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL3N0eWxlcy9pY29fd2ViLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9zdHlsZXMvaWNvX3dyb25nLnBuZyBiL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9zdHlsZXMvaWNvX3dyb25nLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjdkMDRjZS4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvc3R5bGVzL2ljb193cm9uZy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvc3R5bGVzL29wZW5fbmV3X3BhZ2UucG5nIGIvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL3N0eWxlcy9vcGVuX25ld19wYWdlLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjE5N2UzYS4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvc3R5bGVzL29wZW5fbmV3X3BhZ2UucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL3RyaWFuZ2xlLWNsb3NlZC1zbWFsbC5wbmcgYi90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvdHJpYW5nbGUtY2xvc2VkLXNtYWxsLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAyMzY0YS4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvdHJpYW5nbGUtY2xvc2VkLXNtYWxsLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy90cmlhbmdsZS1jbG9zZWQucG5nIGIvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL3RyaWFuZ2xlLWNsb3NlZC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwYTY4ZDkuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL3RyaWFuZ2xlLWNsb3NlZC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvdHJpYW5nbGUtb3BlbmVkLXNtYWxsLnBuZyBiL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy90cmlhbmdsZS1vcGVuZWQtc21hbGwucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMWViNzg0Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy90cmlhbmdsZS1vcGVuZWQtc21hbGwucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL3RyaWFuZ2xlLW9wZW5lZC5wbmcgYi90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvdHJpYW5nbGUtb3BlbmVkLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzg5ZjVmYS4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvdHJpYW5nbGUtb3BlbmVkLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy91aWd1aWRlbGluZXMxLnBuZyBiL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy91aWd1aWRlbGluZXMxLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWNlMTYxMS4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvdWlndWlkZWxpbmVzMS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvdmlkZW8tZHJvaWQucG5nIGIvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL3ZpZGVvLWRyb2lkLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjUxNjNiNi4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvdmlkZW8tZHJvaWQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvanMvYW5kcm9pZF8zcC1idW5kbGUuanMgYi90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9qcy9hbmRyb2lkXzNwLWJ1bmRsZS5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTY3YjViMC4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9qcy9hbmRyb2lkXzNwLWJ1bmRsZS5qcworKysgL2Rldi9udWxsCkBAIC0xLDI3NjYgKzAsMCBAQAotLy90aGlyZF9wYXJ0eS9qYXZhc2NyaXB0L2dvb2dsZV9jb2RlX3ByZXR0aWZ5L3NyYy9wcmV0dGlmeS5qcwotLyoqCi0gKiBAbGljZW5zZSBDb3B5cmlnaHQgKEMpIDIwMDYgR29vZ2xlIEluYy4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKiBAZmlsZW92ZXJ2aWV3Ci0gKiBzb21lIGZ1bmN0aW9ucyBmb3IgYnJvd3Nlci1zaWRlIHByZXR0eSBwcmludGluZyBvZiBjb2RlIGNvbnRhaW5lZCBpbiBodG1sLgotICogPHA+Ci0gKgotICogRm9yIGEgZmFpcmx5IGNvbXByZWhlbnNpdmUgc2V0IG9mIGxhbmd1YWdlcyBzZWUgdGhlCi0gKiA8YSBocmVmPSJodHRwOi8vZ29vZ2xlLWNvZGUtcHJldHRpZnkuZ29vZ2xlY29kZS5jb20vc3ZuL3RydW5rL1JFQURNRS5odG1sI2xhbmdzIj5SRUFETUU8L2E+Ci0gKiBmaWxlIHRoYXQgY2FtZSB3aXRoIHRoaXMgc291cmNlLiAgQXQgYSBtaW5pbXVtLCB0aGUgbGV4ZXIgc2hvdWxkIHdvcmsgb24gYQotICogbnVtYmVyIG9mIGxhbmd1YWdlcyBpbmNsdWRpbmcgQyBhbmQgZnJpZW5kcywgSmF2YSwgUHl0aG9uLCBCYXNoLCBTUUwsIEhUTUwsCi0gKiBYTUwsIENTUywgSmF2YXNjcmlwdCwgYW5kIE1ha2VmaWxlcy4gIEl0IHdvcmtzIHBhc3NhYmx5IG9uIFJ1YnksIFBIUCBhbmQgQXdrCi0gKiBhbmQgYSBzdWJzZXQgb2YgUGVybCwgYnV0LCBiZWNhdXNlIG9mIGNvbW1lbnRpbmcgY29udmVudGlvbnMsIGRvZXNuJ3Qgd29yayBvbgotICogU21hbGx0YWxrLCBMaXNwLWxpa2UsIG9yIENBTUwtbGlrZSBsYW5ndWFnZXMgd2l0aG91dCBhbiBleHBsaWNpdCBsYW5nIGNsYXNzLgotICogPHA+Ci0gKiBVc2FnZTogPG9sPgotICogPGxpPiBpbmNsdWRlIHRoaXMgc291cmNlIGZpbGUgaW4gYW4gaHRtbCBwYWdlIHZpYQotICogICB7QGNvZGUgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iL3BhdGgvdG8vcHJldHRpZnkuanMiPjwvc2NyaXB0Pn0KLSAqIDxsaT4gZGVmaW5lIHN0eWxlIHJ1bGVzLiAgU2VlIHRoZSBleGFtcGxlIHBhZ2UgZm9yIGV4YW1wbGVzLgotICogPGxpPiBtYXJrIHRoZSB7QGNvZGUgPHByZT59IGFuZCB7QGNvZGUgPGNvZGU+fSB0YWdzIGluIHlvdXIgc291cmNlIHdpdGgKLSAqICAgIHtAY29kZSBjbGFzcz1wcmV0dHlwcmludC59Ci0gKiAgICBZb3UgY2FuIGFsc28gdXNlIHRoZSAoaHRtbCBkZXByZWNhdGVkKSB7QGNvZGUgPHhtcD59IHRhZywgYnV0IHRoZSBwcmV0dHkKLSAqICAgIHByaW50ZXIgbmVlZHMgdG8gZG8gbW9yZSBzdWJzdGFudGlhbCBET00gbWFuaXB1bGF0aW9ucyB0byBzdXBwb3J0IHRoYXQsIHNvCi0gKiAgICBzb21lIGNzcyBzdHlsZXMgbWF5IG5vdCBiZSBwcmVzZXJ2ZWQuCi0gKiA8L29sPgotICogVGhhdCdzIGl0LiAgSSB3YW50ZWQgdG8ga2VlcCB0aGUgQVBJIGFzIHNpbXBsZSBhcyBwb3NzaWJsZSwgc28gdGhlcmUncyBubwotICogbmVlZCB0byBzcGVjaWZ5IHdoaWNoIGxhbmd1YWdlIHRoZSBjb2RlIGlzIGluLCBidXQgaWYgeW91IHdpc2gsIHlvdSBjYW4gYWRkCi0gKiBhbm90aGVyIGNsYXNzIHRvIHRoZSB7QGNvZGUgPHByZT59IG9yIHtAY29kZSA8Y29kZT59IGVsZW1lbnQgdG8gc3BlY2lmeSB0aGUKLSAqIGxhbmd1YWdlLCBhcyBpbiB7QGNvZGUgPHByZSBjbGFzcz0icHJldHR5cHJpbnQgbGFuZy1qYXZhIj59LiAgQW55IGNsYXNzIHRoYXQKLSAqIHN0YXJ0cyB3aXRoICJsYW5nLSIgZm9sbG93ZWQgYnkgYSBmaWxlIGV4dGVuc2lvbiwgc3BlY2lmaWVzIHRoZSBmaWxlIHR5cGUuCi0gKiBTZWUgdGhlICJsYW5nLSouanMiIGZpbGVzIGluIHRoaXMgZGlyZWN0b3J5IGZvciBjb2RlIHRoYXQgaW1wbGVtZW50cwotICogcGVyLWxhbmd1YWdlIGZpbGUgaGFuZGxlcnMuCi0gKiA8cD4KLSAqIENoYW5nZSBsb2c6PGJyPgotICogY2JldXN0LCAyMDA2LzA4LzIyCi0gKiA8YmxvY2txdW90ZT4KLSAqICAgSmF2YSBhbm5vdGF0aW9ucyAoc3RhcnQgd2l0aCAiQCIpIGFyZSBub3cgY2FwdHVyZWQgYXMgbGl0ZXJhbHMgKCJsaXQiKQotICogPC9ibG9ja3F1b3RlPgotICogQHJlcXVpcmVzIGNvbnNvbGUKLSAqLwotCi0vLyBKU0xpbnQgZGVjbGFyYXRpb25zCi0vKmdsb2JhbCBjb25zb2xlLCBkb2N1bWVudCwgbmF2aWdhdG9yLCBzZXRUaW1lb3V0LCB3aW5kb3cgKi8KLQotLyoqCi0gKiBTcGxpdCB7QGNvZGUgcHJldHR5UHJpbnR9IGludG8gbXVsdGlwbGUgdGltZW91dHMgc28gYXMgbm90IHRvIGludGVyZmVyZSB3aXRoCi0gKiBVSSBldmVudHMuCi0gKiBJZiBzZXQgdG8ge0Bjb2RlIGZhbHNlfSwge0Bjb2RlIHByZXR0eVByaW50KCl9IGlzIHN5bmNocm9ub3VzLgotICovCi13aW5kb3dbJ1BSX1NIT1VMRF9VU0VfQ09OVElOVUFUSU9OJ10gPSB0cnVlOwotCi0vKiogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGJldHdlZW4gdGFiIGNvbHVtbnMgKi8KLXdpbmRvd1snUFJfVEFCX1dJRFRIJ10gPSA4OwotCi0vKiogV2Fsa3MgdGhlIERPTSByZXR1cm5pbmcgYSBwcm9wZXJseSBlc2NhcGVkIHZlcnNpb24gb2YgaW5uZXJIVE1MLgotICAqIEBwYXJhbSB7Tm9kZX0gbm9kZQotICAqIEBwYXJhbSB7QXJyYXkuPHN0cmluZz59IG91dCBvdXRwdXQgYnVmZmVyIHRoYXQgcmVjZWl2ZXMgY2h1bmtzIG9mIEhUTUwuCi0gICovCi13aW5kb3dbJ1BSX25vcm1hbGl6ZWRIdG1sJ10KLQotLyoqIENvbnRhaW5zIGZ1bmN0aW9ucyBmb3IgY3JlYXRpbmcgYW5kIHJlZ2lzdGVyaW5nIG5ldyBsYW5ndWFnZSBoYW5kbGVycy4KLSAgKiBAdHlwZSB7T2JqZWN0fQotICAqLwotICA9IHdpbmRvd1snUFInXQotCi0vKiogUHJldHR5IHByaW50IGEgY2h1bmsgb2YgY29kZS4KLSAgKgotICAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2VDb2RlSHRtbCBjb2RlIGFzIGh0bWwKLSAgKiBAcmV0dXJuIHtzdHJpbmd9IGNvZGUgYXMgaHRtbCwgYnV0IHByZXR0aWVyCi0gICovCi0gID0gd2luZG93WydwcmV0dHlQcmludE9uZSddCi0vKiogRmluZCBhbGwgdGhlIHtAY29kZSA8cHJlPn0gYW5kIHtAY29kZSA8Y29kZT59IHRhZ3MgaW4gdGhlIERPTSB3aXRoCi0gICoge0Bjb2RlIGNsYXNzPXByZXR0eXByaW50fSBhbmQgcHJldHRpZnkgdGhlbS4KLSAgKiBAcGFyYW0ge0Z1bmN0aW9uP30gb3B0X3doZW5Eb25lIGlmIHNwZWNpZmllZCwgY2FsbGVkIHdoZW4gdGhlIGxhc3QgZW50cnkKLSAgKiAgICAgaGFzIGJlZW4gZmluaXNoZWQuCi0gICovCi0gID0gd2luZG93WydwcmV0dHlQcmludCddID0gdm9pZCAwOwotCi0vKiogYnJvd3NlciBkZXRlY3Rpb24uIEBleHRlcm4gQHJldHVybnMgZmFsc2UgaWYgbm90IElFLCBvdGhlcndpc2UgdGhlIG1ham9yIHZlcnNpb24uICovCi13aW5kb3dbJ19wcl9pc0lFNiddID0gZnVuY3Rpb24gKCkgewotICB2YXIgaWVWZXJzaW9uID0gbmF2aWdhdG9yICYmIG5hdmlnYXRvci51c2VyQWdlbnQgJiYKLSAgICAgIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1xiTVNJRSAoWzY3OF0pXC4vKTsKLSAgaWVWZXJzaW9uID0gaWVWZXJzaW9uID8gK2llVmVyc2lvblsxXSA6IGZhbHNlOwotICB3aW5kb3dbJ19wcl9pc0lFNiddID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gaWVWZXJzaW9uOyB9OwotICByZXR1cm4gaWVWZXJzaW9uOwotfTsKLQotCi0oZnVuY3Rpb24gKCkgewotICAvLyBLZXl3b3JkIGxpc3RzIGZvciB2YXJpb3VzIGxhbmd1YWdlcy4KLSAgdmFyIEZMT1dfQ09OVFJPTF9LRVlXT1JEUyA9Ci0gICAgICAiYnJlYWsgY29udGludWUgZG8gZWxzZSBmb3IgaWYgcmV0dXJuIHdoaWxlICI7Ci0gIHZhciBDX0tFWVdPUkRTID0gRkxPV19DT05UUk9MX0tFWVdPUkRTICsgImF1dG8gY2FzZSBjaGFyIGNvbnN0IGRlZmF1bHQgIiArCi0gICAgICAiZG91YmxlIGVudW0gZXh0ZXJuIGZsb2F0IGdvdG8gaW50IGxvbmcgcmVnaXN0ZXIgc2hvcnQgc2lnbmVkIHNpemVvZiAiICsKLSAgICAgICJzdGF0aWMgc3RydWN0IHN3aXRjaCB0eXBlZGVmIHVuaW9uIHVuc2lnbmVkIHZvaWQgdm9sYXRpbGUgIjsKLSAgdmFyIENPTU1PTl9LRVlXT1JEUyA9IENfS0VZV09SRFMgKyAiY2F0Y2ggY2xhc3MgZGVsZXRlIGZhbHNlIGltcG9ydCAiICsKLSAgICAgICJuZXcgb3BlcmF0b3IgcHJpdmF0ZSBwcm90ZWN0ZWQgcHVibGljIHRoaXMgdGhyb3cgdHJ1ZSB0cnkgdHlwZW9mICI7Ci0gIHZhciBDUFBfS0VZV09SRFMgPSBDT01NT05fS0VZV09SRFMgKyAiYWxpZ25vZiBhbGlnbl91bmlvbiBhc20gYXhpb20gYm9vbCAiICsKLSAgICAgICJjb25jZXB0IGNvbmNlcHRfbWFwIGNvbnN0X2Nhc3QgY29uc3RleHByIGRlY2x0eXBlICIgKwotICAgICAgImR5bmFtaWNfY2FzdCBleHBsaWNpdCBleHBvcnQgZnJpZW5kIGlubGluZSBsYXRlX2NoZWNrICIgKwotICAgICAgIm11dGFibGUgbmFtZXNwYWNlIG51bGxwdHIgcmVpbnRlcnByZXRfY2FzdCBzdGF0aWNfYXNzZXJ0IHN0YXRpY19jYXN0ICIgKwotICAgICAgInRlbXBsYXRlIHR5cGVpZCB0eXBlbmFtZSB1c2luZyB2aXJ0dWFsIHdjaGFyX3Qgd2hlcmUgIjsKLSAgdmFyIEpBVkFfS0VZV09SRFMgPSBDT01NT05fS0VZV09SRFMgKwotICAgICAgImFic3RyYWN0IGJvb2xlYW4gYnl0ZSBleHRlbmRzIGZpbmFsIGZpbmFsbHkgaW1wbGVtZW50cyBpbXBvcnQgIiArCi0gICAgICAiaW5zdGFuY2VvZiBudWxsIG5hdGl2ZSBwYWNrYWdlIHN0cmljdGZwIHN1cGVyIHN5bmNocm9uaXplZCB0aHJvd3MgIiArCi0gICAgICAidHJhbnNpZW50ICI7Ci0gIHZhciBDU0hBUlBfS0VZV09SRFMgPSBKQVZBX0tFWVdPUkRTICsKLSAgICAgICJhcyBiYXNlIGJ5IGNoZWNrZWQgZGVjaW1hbCBkZWxlZ2F0ZSBkZXNjZW5kaW5nIGR5bmFtaWMgZXZlbnQgIiArCi0gICAgICAiZml4ZWQgZm9yZWFjaCBmcm9tIGdyb3VwIGltcGxpY2l0IGluIGludGVyZmFjZSBpbnRlcm5hbCBpbnRvIGlzIGxvY2sgIiArCi0gICAgICAib2JqZWN0IG91dCBvdmVycmlkZSBvcmRlcmJ5IHBhcmFtcyBwYXJ0aWFsIHJlYWRvbmx5IHJlZiBzYnl0ZSBzZWFsZWQgIiArCi0gICAgICAic3RhY2thbGxvYyBzdHJpbmcgc2VsZWN0IHVpbnQgdWxvbmcgdW5jaGVja2VkIHVuc2FmZSB1c2hvcnQgdmFyICI7Ci0gIHZhciBDT0ZGRUVfS0VZV09SRFMgPSAiYWxsIGFuZCBieSBjYXRjaCBjbGFzcyBlbHNlIGV4dGVuZHMgZmFsc2UgZmluYWxseSAiICsKLSAgICAgICJmb3IgaWYgaW4gaXMgaXNudCBsb29wIG5ldyBubyBub3QgbnVsbCBvZiBvZmYgb24gb3IgcmV0dXJuIHN1cGVyIHRoZW4gIiArCi0gICAgICAidHJ1ZSB0cnkgdW5sZXNzIHVudGlsIHdoZW4gd2hpbGUgeWVzICI7Ci0gIHZhciBKU0NSSVBUX0tFWVdPUkRTID0gQ09NTU9OX0tFWVdPUkRTICsKLSAgICAgICJkZWJ1Z2dlciBldmFsIGV4cG9ydCBmdW5jdGlvbiBnZXQgbnVsbCBzZXQgdW5kZWZpbmVkIHZhciB3aXRoICIgKwotICAgICAgIkluZmluaXR5IE5hTiAiOwotICB2YXIgUEVSTF9LRVlXT1JEUyA9ICJjYWxsZXIgZGVsZXRlIGRpZSBkbyBkdW1wIGVsc2lmIGV2YWwgZXhpdCBmb3JlYWNoIGZvciAiICsKLSAgICAgICJnb3RvIGlmIGltcG9ydCBsYXN0IGxvY2FsIG15IG5leHQgbm8gb3VyIHByaW50IHBhY2thZ2UgcmVkbyByZXF1aXJlICIgKwotICAgICAgInN1YiB1bmRlZiB1bmxlc3MgdW50aWwgdXNlIHdhbnRhcnJheSB3aGlsZSBCRUdJTiBFTkQgIjsKLSAgdmFyIFBZVEhPTl9LRVlXT1JEUyA9IEZMT1dfQ09OVFJPTF9LRVlXT1JEUyArICJhbmQgYXMgYXNzZXJ0IGNsYXNzIGRlZiBkZWwgIiArCi0gICAgICAiZWxpZiBleGNlcHQgZXhlYyBmaW5hbGx5IGZyb20gZ2xvYmFsIGltcG9ydCBpbiBpcyBsYW1iZGEgIiArCi0gICAgICAibm9ubG9jYWwgbm90IG9yIHBhc3MgcHJpbnQgcmFpc2UgdHJ5IHdpdGggeWllbGQgIiArCi0gICAgICAiRmFsc2UgVHJ1ZSBOb25lICI7Ci0gIHZhciBSVUJZX0tFWVdPUkRTID0gRkxPV19DT05UUk9MX0tFWVdPUkRTICsgImFsaWFzIGFuZCBiZWdpbiBjYXNlIGNsYXNzIGRlZiIgKwotICAgICAgIiBkZWZpbmVkIGVsc2lmIGVuZCBlbnN1cmUgZmFsc2UgaW4gbW9kdWxlIG5leHQgbmlsIG5vdCBvciByZWRvIHJlc2N1ZSAiICsKLSAgICAgICJyZXRyeSBzZWxmIHN1cGVyIHRoZW4gdHJ1ZSB1bmRlZiB1bmxlc3MgdW50aWwgd2hlbiB5aWVsZCBCRUdJTiBFTkQgIjsKLSAgdmFyIFNIX0tFWVdPUkRTID0gRkxPV19DT05UUk9MX0tFWVdPUkRTICsgImNhc2UgZG9uZSBlbGlmIGVzYWMgZXZhbCBmaSAiICsKLSAgICAgICJmdW5jdGlvbiBpbiBsb2NhbCBzZXQgdGhlbiB1bnRpbCAiOwotICB2YXIgQUxMX0tFWVdPUkRTID0gKAotICAgICAgQ1BQX0tFWVdPUkRTICsgQ1NIQVJQX0tFWVdPUkRTICsgSlNDUklQVF9LRVlXT1JEUyArIFBFUkxfS0VZV09SRFMgKwotICAgICAgUFlUSE9OX0tFWVdPUkRTICsgUlVCWV9LRVlXT1JEUyArIFNIX0tFWVdPUkRTKTsKLQotICAvLyB0b2tlbiBzdHlsZSBuYW1lcy4gIGNvcnJlc3BvbmQgdG8gY3NzIGNsYXNzZXMKLSAgLyoqIHRva2VuIHN0eWxlIGZvciBhIHN0cmluZyBsaXRlcmFsICovCi0gIHZhciBQUl9TVFJJTkcgPSAnc3RyJzsKLSAgLyoqIHRva2VuIHN0eWxlIGZvciBhIGtleXdvcmQgKi8KLSAgdmFyIFBSX0tFWVdPUkQgPSAna3dkJzsKLSAgLyoqIHRva2VuIHN0eWxlIGZvciBhIGNvbW1lbnQgKi8KLSAgdmFyIFBSX0NPTU1FTlQgPSAnY29tJzsKLSAgLyoqIHRva2VuIHN0eWxlIGZvciBhIHR5cGUgKi8KLSAgdmFyIFBSX1RZUEUgPSAndHlwJzsKLSAgLyoqIHRva2VuIHN0eWxlIGZvciBhIGxpdGVyYWwgdmFsdWUuICBlLmcuIDEsIG51bGwsIHRydWUuICovCi0gIHZhciBQUl9MSVRFUkFMID0gJ2xpdCc7Ci0gIC8qKiB0b2tlbiBzdHlsZSBmb3IgYSBwdW5jdHVhdGlvbiBzdHJpbmcuICovCi0gIHZhciBQUl9QVU5DVFVBVElPTiA9ICdwdW4nOwotICAvKiogdG9rZW4gc3R5bGUgZm9yIGEgcHVuY3R1YXRpb24gc3RyaW5nLiAqLwotICB2YXIgUFJfUExBSU4gPSAncGxuJzsKLQotICAvKiogdG9rZW4gc3R5bGUgZm9yIGFuIHNnbWwgdGFnLiAqLwotICB2YXIgUFJfVEFHID0gJ3RhZyc7Ci0gIC8qKiB0b2tlbiBzdHlsZSBmb3IgYSBtYXJrdXAgZGVjbGFyYXRpb24gc3VjaCBhcyBhIERPQ1RZUEUuICovCi0gIHZhciBQUl9ERUNMQVJBVElPTiA9ICdkZWMnOwotICAvKiogdG9rZW4gc3R5bGUgZm9yIGVtYmVkZGVkIHNvdXJjZS4gKi8KLSAgdmFyIFBSX1NPVVJDRSA9ICdzcmMnOwotICAvKiogdG9rZW4gc3R5bGUgZm9yIGFuIHNnbWwgYXR0cmlidXRlIG5hbWUuICovCi0gIHZhciBQUl9BVFRSSUJfTkFNRSA9ICdhdG4nOwotICAvKiogdG9rZW4gc3R5bGUgZm9yIGFuIHNnbWwgYXR0cmlidXRlIHZhbHVlLiAqLwotICB2YXIgUFJfQVRUUklCX1ZBTFVFID0gJ2F0dic7Ci0KLSAgLyoqCi0gICAqIEEgY2xhc3MgdGhhdCBpbmRpY2F0ZXMgYSBzZWN0aW9uIG9mIG1hcmt1cCB0aGF0IGlzIG5vdCBjb2RlLCBlLmcuIHRvIGFsbG93Ci0gICAqIGVtYmVkZGluZyBvZiBsaW5lIG51bWJlcnMgd2l0aGluIGNvZGUgbGlzdGluZ3MuCi0gICAqLwotICB2YXIgUFJfTk9DT0RFID0gJ25vY29kZSc7Ci0KLSAgLyoqIEEgc2V0IG9mIHRva2VucyB0aGF0IGNhbiBwcmVjZWRlIGEgcmVndWxhciBleHByZXNzaW9uIGxpdGVyYWwgaW4KLSAgICAqIGphdmFzY3JpcHQuCi0gICAgKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL2pzL2xhbmd1YWdlL2pzMjAvcmF0aW9uYWxlL3N5bnRheC5odG1sIGhhcyB0aGUgZnVsbAotICAgICogbGlzdCwgYnV0IEkndmUgcmVtb3ZlZCBvbmVzIHRoYXQgbWlnaHQgYmUgcHJvYmxlbWF0aWMgd2hlbiBzZWVuIGluCi0gICAgKiBsYW5ndWFnZXMgdGhhdCBkb24ndCBzdXBwb3J0IHJlZ3VsYXIgZXhwcmVzc2lvbiBsaXRlcmFscy4KLSAgICAqCi0gICAgKiA8cD5TcGVjaWZpY2FsbHksIEkndmUgcmVtb3ZlZCBhbnkga2V5d29yZHMgdGhhdCBjYW4ndCBwcmVjZWRlIGEgcmVnZXhwCi0gICAgKiBsaXRlcmFsIGluIGEgc3ludGFjdGljYWxseSBsZWdhbCBqYXZhc2NyaXB0IHByb2dyYW0sIGFuZCBJJ3ZlIHJlbW92ZWQgdGhlCi0gICAgKiAiaW4iIGtleXdvcmQgc2luY2UgaXQncyBub3QgYSBrZXl3b3JkIGluIG1hbnkgbGFuZ3VhZ2VzLCBhbmQgbWlnaHQgYmUgdXNlZAotICAgICogYXMgYSBjb3VudCBvZiBpbmNoZXMuCi0gICAgKgotICAgICogPHA+VGhlIGxpbmsgYSBhYm92ZSBkb2VzIG5vdCBhY2N1cmF0ZWx5IGRlc2NyaWJlIEVjbWFTY3JpcHQgcnVsZXMgc2luY2UKLSAgICAqIGl0IGZhaWxzIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gKGE9KysvYi9pKSBhbmQgKGErKy9iL2kpIGJ1dCBpdCB3b3JrcwotICAgICogdmVyeSB3ZWxsIGluIHByYWN0aWNlLgotICAgICoKLSAgICAqIEBwcml2YXRlCi0gICAgKi8KLSAgdmFyIFJFR0VYUF9QUkVDRURFUl9QQVRURVJOID0gZnVuY3Rpb24gKCkgewotICAgICAgdmFyIHByZWNlZGVycyA9IFsKLSAgICAgICAgICAiISIsICIhPSIsICIhPT0iLCAiIyIsICIlIiwgIiU9IiwgIiYiLCAiJiYiLCAiJiY9IiwKLSAgICAgICAgICAiJj0iLCAiKCIsICIqIiwgIio9IiwgLyogIisiLCAqLyAiKz0iLCAiLCIsIC8qICItIiwgKi8gIi09IiwKLSAgICAgICAgICAiLT4iLCAvKiIuIiwgIi4uIiwgIi4uLiIsIGhhbmRsZWQgYmVsb3cgKi8gIi8iLCAiLz0iLCAiOiIsICI6OiIsICI7IiwKLSAgICAgICAgICAiPCIsICI8PCIsICI8PD0iLCAiPD0iLCAiPSIsICI9PSIsICI9PT0iLCAiPiIsCi0gICAgICAgICAgIj49IiwgIj4+IiwgIj4+PSIsICI+Pj4iLCAiPj4+PSIsICI/IiwgIkAiLCAiWyIsCi0gICAgICAgICAgIl4iLCAiXj0iLCAiXl4iLCAiXl49IiwgInsiLCAifCIsICJ8PSIsICJ8fCIsCi0gICAgICAgICAgInx8PSIsICJ+IiAvKiBoYW5kbGVzID1+IGFuZCAhfiAqLywKLSAgICAgICAgICAiYnJlYWsiLCAiY2FzZSIsICJjb250aW51ZSIsICJkZWxldGUiLAotICAgICAgICAgICJkbyIsICJlbHNlIiwgImZpbmFsbHkiLCAiaW5zdGFuY2VvZiIsCi0gICAgICAgICAgInJldHVybiIsICJ0aHJvdyIsICJ0cnkiLCAidHlwZW9mIgotICAgICAgICAgIF07Ci0gICAgICB2YXIgcGF0dGVybiA9ICcoPzpeXnxbKy1dJzsKLSAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJlY2VkZXJzLmxlbmd0aDsgKytpKSB7Ci0gICAgICAgIHBhdHRlcm4gKz0gJ3wnICsgcHJlY2VkZXJzW2ldLnJlcGxhY2UoLyhbXj08PjomYS16XSkvZywgJ1xcJDEnKTsKLSAgICAgIH0KLSAgICAgIHBhdHRlcm4gKz0gJylcXHMqJzsgIC8vIG1hdGNoZXMgYXQgZW5kLCBhbmQgbWF0Y2hlcyBlbXB0eSBzdHJpbmcKLSAgICAgIHJldHVybiBwYXR0ZXJuOwotICAgICAgLy8gQ0FWRUFUOiB0aGlzIGRvZXMgbm90IHByb3Blcmx5IGhhbmRsZSB0aGUgY2FzZSB3aGVyZSBhIHJlZ3VsYXIKLSAgICAgIC8vIGV4cHJlc3Npb24gaW1tZWRpYXRlbHkgZm9sbG93cyBhbm90aGVyIHNpbmNlIGEgcmVndWxhciBleHByZXNzaW9uIG1heQotICAgICAgLy8gaGF2ZSBmbGFncyBmb3IgY2FzZS1zZW5zaXRpdml0eSBhbmQgdGhlIGxpa2UuICBIYXZpbmcgcmVnZXhwIHRva2VucwotICAgICAgLy8gYWRqYWNlbnQgaXMgbm90IHZhbGlkIGluIGFueSBsYW5ndWFnZSBJJ20gYXdhcmUgb2YsIHNvIEknbSBwdW50aW5nLgotICAgICAgLy8gVE9ETzogbWF5YmUgc3R5bGUgc3BlY2lhbCBjaGFyYWN0ZXJzIGluc2lkZSBhIHJlZ2V4cCBhcyBwdW5jdHVhdGlvbi4KLSAgICB9KCk7Ci0KLSAgLy8gRGVmaW5lIHJlZ2V4cHMgaGVyZSBzbyB0aGF0IHRoZSBpbnRlcnByZXRlciBkb2Vzbid0IGhhdmUgdG8gY3JlYXRlIGFuCi0gIC8vIG9iamVjdCBlYWNoIHRpbWUgdGhlIGZ1bmN0aW9uIGNvbnRhaW5pbmcgdGhlbSBpcyBjYWxsZWQuCi0gIC8vIFRoZSBsYW5ndWFnZSBzcGVjIHJlcXVpcmVzIGEgbmV3IG9iamVjdCBjcmVhdGVkIGV2ZW4gaWYgeW91IGRvbid0IGFjY2VzcwotICAvLyB0aGUgJDEgbWVtYmVycy4KLSAgdmFyIHByX2FtcCA9IC8mL2c7Ci0gIHZhciBwcl9sdCA9IC88L2c7Ci0gIHZhciBwcl9ndCA9IC8+L2c7Ci0gIHZhciBwcl9xdW90ID0gL1wiL2c7Ci0gIC8qKiBsaWtlIHRleHRUb0h0bWwgYnV0IGVzY2FwZXMgZG91YmxlIHF1b3RlcyB0byBiZSBhdHRyaWJ1dGUgc2FmZS4gKi8KLSAgZnVuY3Rpb24gYXR0cmliVG9IdG1sKHN0cikgewotICAgIHJldHVybiBzdHIucmVwbGFjZShwcl9hbXAsICcmYW1wOycpCi0gICAgICAgIC5yZXBsYWNlKHByX2x0LCAnJmx0OycpCi0gICAgICAgIC5yZXBsYWNlKHByX2d0LCAnJmd0OycpCi0gICAgICAgIC5yZXBsYWNlKHByX3F1b3QsICcmcXVvdDsnKTsKLSAgfQotCi0gIC8qKiBlc2NhcGVzdCBodG1sIHNwZWNpYWwgY2hhcmFjdGVycyB0byBodG1sLiAqLwotICBmdW5jdGlvbiB0ZXh0VG9IdG1sKHN0cikgewotICAgIHJldHVybiBzdHIucmVwbGFjZShwcl9hbXAsICcmYW1wOycpCi0gICAgICAgIC5yZXBsYWNlKHByX2x0LCAnJmx0OycpCi0gICAgICAgIC5yZXBsYWNlKHByX2d0LCAnJmd0OycpOwotICB9Ci0KLQotICB2YXIgcHJfbHRFbnQgPSAvJmx0Oy9nOwotICB2YXIgcHJfZ3RFbnQgPSAvJmd0Oy9nOwotICB2YXIgcHJfYXBvc0VudCA9IC8mYXBvczsvZzsKLSAgdmFyIHByX3F1b3RFbnQgPSAvJnF1b3Q7L2c7Ci0gIHZhciBwcl9hbXBFbnQgPSAvJmFtcDsvZzsKLSAgdmFyIHByX25ic3BFbnQgPSAvJm5ic3A7L2c7Ci0gIC8qKiB1bmVzY2FwZXMgaHRtbCB0byBwbGFpbiB0ZXh0LiAqLwotICBmdW5jdGlvbiBodG1sVG9UZXh0KGh0bWwpIHsKLSAgICB2YXIgcG9zID0gaHRtbC5pbmRleE9mKCcmJyk7Ci0gICAgaWYgKHBvcyA8IDApIHsgcmV0dXJuIGh0bWw7IH0KLSAgICAvLyBIYW5kbGUgbnVtZXJpYyBlbnRpdGllcyBzcGVjaWFsbHkuICBXZSBjYW4ndCB1c2UgZnVuY3Rpb25hbCBzdWJzdGl0dXRpb24KLSAgICAvLyBzaW5jZSB0aGF0IGRvZXNuJ3Qgd29yayBpbiBvbGRlciB2ZXJzaW9ucyBvZiBTYWZhcmkuCi0gICAgLy8gVGhlc2Ugc2hvdWxkIGJlIHJhcmUgc2luY2UgbW9zdCBicm93c2VycyBjb252ZXJ0IHRoZW0gdG8gbm9ybWFsIGNoYXJzLgotICAgIGZvciAoLS1wb3M7IChwb3MgPSBodG1sLmluZGV4T2YoJyYjJywgcG9zICsgMSkpID49IDA7KSB7Ci0gICAgICB2YXIgZW5kID0gaHRtbC5pbmRleE9mKCc7JywgcG9zKTsKLSAgICAgIGlmIChlbmQgPj0gMCkgewotICAgICAgICB2YXIgbnVtID0gaHRtbC5zdWJzdHJpbmcocG9zICsgMywgZW5kKTsKLSAgICAgICAgdmFyIHJhZGl4ID0gMTA7Ci0gICAgICAgIGlmIChudW0gJiYgbnVtLmNoYXJBdCgwKSA9PT0gJ3gnKSB7Ci0gICAgICAgICAgbnVtID0gbnVtLnN1YnN0cmluZygxKTsKLSAgICAgICAgICByYWRpeCA9IDE2OwotICAgICAgICB9Ci0gICAgICAgIHZhciBjb2RlUG9pbnQgPSBwYXJzZUludChudW0sIHJhZGl4KTsKLSAgICAgICAgaWYgKCFpc05hTihjb2RlUG9pbnQpKSB7Ci0gICAgICAgICAgaHRtbCA9IChodG1sLnN1YnN0cmluZygwLCBwb3MpICsgU3RyaW5nLmZyb21DaGFyQ29kZShjb2RlUG9pbnQpICsKLSAgICAgICAgICAgICAgICAgIGh0bWwuc3Vic3RyaW5nKGVuZCArIDEpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBodG1sLnJlcGxhY2UocHJfbHRFbnQsICc8JykKLSAgICAgICAgLnJlcGxhY2UocHJfZ3RFbnQsICc+JykKLSAgICAgICAgLnJlcGxhY2UocHJfYXBvc0VudCwgIiciKQotICAgICAgICAucmVwbGFjZShwcl9xdW90RW50LCAnIicpCi0gICAgICAgIC5yZXBsYWNlKHByX25ic3BFbnQsICcgJykKLSAgICAgICAgLnJlcGxhY2UocHJfYW1wRW50LCAnJicpOwotICB9Ci0KLSAgLyoqIGlzIHRoZSBnaXZlbiBub2RlJ3MgaW5uZXJIVE1MIG5vcm1hbGx5IHVuZXNjYXBlZD8gKi8KLSAgZnVuY3Rpb24gaXNSYXdDb250ZW50KG5vZGUpIHsKLSAgICByZXR1cm4gJ1hNUCcgPT09IG5vZGUudGFnTmFtZTsKLSAgfQotCi0gIHZhciBuZXdsaW5lUmUgPSAvW1xyXG5dL2c7Ci0gIC8qKgotICAgKiBBcmUgbmV3bGluZXMgYW5kIGFkamFjZW50IHNwYWNlcyBzaWduaWZpY2FudCBpbiB0aGUgZ2l2ZW4gbm9kZSdzIGlubmVySFRNTD8KLSAgICovCi0gIGZ1bmN0aW9uIGlzUHJlZm9ybWF0dGVkKG5vZGUsIGNvbnRlbnQpIHsKLSAgICAvLyBQUkUgbWVhbnMgcHJlZm9ybWF0dGVkLCBhbmQgaXMgYSB2ZXJ5IGNvbW1vbiBjYXNlLCBzbyBkb24ndCBjcmVhdGUKLSAgICAvLyB1bm5lY2Vzc2FyeSBjb21wdXRlZCBzdHlsZSBvYmplY3RzLgotICAgIGlmICgnUFJFJyA9PT0gbm9kZS50YWdOYW1lKSB7IHJldHVybiB0cnVlOyB9Ci0gICAgaWYgKCFuZXdsaW5lUmUudGVzdChjb250ZW50KSkgeyByZXR1cm4gdHJ1ZTsgfSAgLy8gRG9uJ3QgY2FyZQotICAgIHZhciB3aGl0ZXNwYWNlID0gJyc7Ci0gICAgLy8gRm9yIGRpc2Nvbm5lY3RlZCBub2RlcywgSUUgaGFzIG5vIGN1cnJlbnRTdHlsZS4KLSAgICBpZiAobm9kZS5jdXJyZW50U3R5bGUpIHsKLSAgICAgIHdoaXRlc3BhY2UgPSBub2RlLmN1cnJlbnRTdHlsZS53aGl0ZVNwYWNlOwotICAgIH0gZWxzZSBpZiAod2luZG93LmdldENvbXB1dGVkU3R5bGUpIHsKLSAgICAgIC8vIEZpcmVmb3ggbWFrZXMgYSBiZXN0IGd1ZXNzIGlmIG5vZGUgaXMgZGlzY29ubmVjdGVkIHdoZXJlYXMgU2FmYXJpCi0gICAgICAvLyByZXR1cm5zIHRoZSBlbXB0eSBzdHJpbmcuCi0gICAgICB3aGl0ZXNwYWNlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUobm9kZSwgbnVsbCkud2hpdGVTcGFjZTsKLSAgICB9Ci0gICAgcmV0dXJuICF3aGl0ZXNwYWNlIHx8IHdoaXRlc3BhY2UgPT09ICdwcmUnOwotICB9Ci0KLSAgZnVuY3Rpb24gbm9ybWFsaXplZEh0bWwobm9kZSwgb3V0LCBvcHRfc29ydEF0dHJzKSB7Ci0gICAgc3dpdGNoIChub2RlLm5vZGVUeXBlKSB7Ci0gICAgICBjYXNlIDE6ICAvLyBhbiBlbGVtZW50Ci0gICAgICAgIHZhciBuYW1lID0gbm9kZS50YWdOYW1lLnRvTG93ZXJDYXNlKCk7Ci0KLSAgICAgICAgb3V0LnB1c2goJzwnLCBuYW1lKTsKLSAgICAgICAgdmFyIGF0dHJzID0gbm9kZS5hdHRyaWJ1dGVzOwotICAgICAgICB2YXIgbiA9IGF0dHJzLmxlbmd0aDsKLSAgICAgICAgaWYgKG4pIHsKLSAgICAgICAgICBpZiAob3B0X3NvcnRBdHRycykgewotICAgICAgICAgICAgdmFyIHNvcnRlZEF0dHJzID0gW107Ci0gICAgICAgICAgICBmb3IgKHZhciBpID0gbjsgLS1pID49IDA7KSB7IHNvcnRlZEF0dHJzW2ldID0gYXR0cnNbaV07IH0KLSAgICAgICAgICAgIHNvcnRlZEF0dHJzLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKGEubmFtZSA8IGIubmFtZSkgPyAtMSA6IGEubmFtZSA9PT0gYi5uYW1lID8gMCA6IDE7Ci0gICAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgYXR0cnMgPSBzb3J0ZWRBdHRyczsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuOyArK2kpIHsKLSAgICAgICAgICAgIHZhciBhdHRyID0gYXR0cnNbaV07Ci0gICAgICAgICAgICBpZiAoIWF0dHIuc3BlY2lmaWVkKSB7IGNvbnRpbnVlOyB9Ci0gICAgICAgICAgICBvdXQucHVzaCgnICcsIGF0dHIubmFtZS50b0xvd2VyQ2FzZSgpLAotICAgICAgICAgICAgICAgICAgICAgJz0iJywgYXR0cmliVG9IdG1sKGF0dHIudmFsdWUpLCAnIicpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBvdXQucHVzaCgnPicpOwotICAgICAgICBmb3IgKHZhciBjaGlsZCA9IG5vZGUuZmlyc3RDaGlsZDsgY2hpbGQ7IGNoaWxkID0gY2hpbGQubmV4dFNpYmxpbmcpIHsKLSAgICAgICAgICBub3JtYWxpemVkSHRtbChjaGlsZCwgb3V0LCBvcHRfc29ydEF0dHJzKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobm9kZS5maXJzdENoaWxkIHx8ICEvXig/OmJyfGxpbmt8aW1nKSQvLnRlc3QobmFtZSkpIHsKLSAgICAgICAgICBvdXQucHVzaCgnPFwvJywgbmFtZSwgJz4nKTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgMzogY2FzZSA0OiAvLyB0ZXh0Ci0gICAgICAgIG91dC5wdXNoKHRleHRUb0h0bWwobm9kZS5ub2RlVmFsdWUpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEdpdmVuIGEgZ3JvdXAgb2Yge0BsaW5rIFJlZ0V4cH1zLCByZXR1cm5zIGEge0Bjb2RlIFJlZ0V4cH0gdGhhdCBnbG9iYWxseQotICAgKiBtYXRjaGVzIHRoZSB1bmlvbiBvIHRoZSBzZXRzIG8gc3RyaW5ncyBtYXRjaGVkIGQgYnkgdGhlIGlucHV0IFJlZ0V4cC4KLSAgICogU2luY2UgaXQgbWF0Y2hlcyBnbG9iYWxseSwgaWYgdGhlIGlucHV0IHN0cmluZ3MgaGF2ZSBhIHN0YXJ0LW9mLWlucHV0Ci0gICAqIGFuY2hvciAoL14uLi4vKSwgaXQgaXMgaWdub3JlZCBmb3IgdGhlIHB1cnBvc2VzIG9mIHVuaW9uaW5nLgotICAgKiBAcGFyYW0ge0FycmF5LjxSZWdFeHA+fSByZWdleHMgbm9uIG11bHRpbGluZSwgbm9uLWdsb2JhbCByZWdleHMuCi0gICAqIEByZXR1cm4ge1JlZ0V4cH0gYSBnbG9iYWwgcmVnZXguCi0gICAqLwotICBmdW5jdGlvbiBjb21iaW5lUHJlZml4UGF0dGVybnMocmVnZXhzKSB7Ci0gICAgdmFyIGNhcHR1cmVkR3JvdXBJbmRleCA9IDA7Ci0KLSAgICB2YXIgbmVlZFRvRm9sZENhc2UgPSBmYWxzZTsKLSAgICB2YXIgaWdub3JlQ2FzZSA9IGZhbHNlOwotICAgIGZvciAodmFyIGkgPSAwLCBuID0gcmVnZXhzLmxlbmd0aDsgaSA8IG47ICsraSkgewotICAgICAgdmFyIHJlZ2V4ID0gcmVnZXhzW2ldOwotICAgICAgaWYgKHJlZ2V4Lmlnbm9yZUNhc2UpIHsKLSAgICAgICAgaWdub3JlQ2FzZSA9IHRydWU7Ci0gICAgICB9IGVsc2UgaWYgKC9bYS16XS9pLnRlc3QocmVnZXguc291cmNlLnJlcGxhY2UoCi0gICAgICAgICAgICAgICAgICAgICAvXFx1WzAtOWEtZl17NH18XFx4WzAtOWEtZl17Mn18XFxbXnV4XS9naSwgJycpKSkgewotICAgICAgICBuZWVkVG9Gb2xkQ2FzZSA9IHRydWU7Ci0gICAgICAgIGlnbm9yZUNhc2UgPSBmYWxzZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgZnVuY3Rpb24gZGVjb2RlRXNjYXBlKGNoYXJzZXRQYXJ0KSB7Ci0gICAgICBpZiAoY2hhcnNldFBhcnQuY2hhckF0KDApICE9PSAnXFwnKSB7IHJldHVybiBjaGFyc2V0UGFydC5jaGFyQ29kZUF0KDApOyB9Ci0gICAgICBzd2l0Y2ggKGNoYXJzZXRQYXJ0LmNoYXJBdCgxKSkgewotICAgICAgICBjYXNlICdiJzogcmV0dXJuIDg7Ci0gICAgICAgIGNhc2UgJ3QnOiByZXR1cm4gOTsKLSAgICAgICAgY2FzZSAnbic6IHJldHVybiAweGE7Ci0gICAgICAgIGNhc2UgJ3YnOiByZXR1cm4gMHhiOwotICAgICAgICBjYXNlICdmJzogcmV0dXJuIDB4YzsKLSAgICAgICAgY2FzZSAncic6IHJldHVybiAweGQ7Ci0gICAgICAgIGNhc2UgJ3UnOiBjYXNlICd4JzoKLSAgICAgICAgICByZXR1cm4gcGFyc2VJbnQoY2hhcnNldFBhcnQuc3Vic3RyaW5nKDIpLCAxNikKLSAgICAgICAgICAgICAgfHwgY2hhcnNldFBhcnQuY2hhckNvZGVBdCgxKTsKLSAgICAgICAgY2FzZSAnMCc6IGNhc2UgJzEnOiBjYXNlICcyJzogY2FzZSAnMyc6IGNhc2UgJzQnOgotICAgICAgICBjYXNlICc1JzogY2FzZSAnNic6IGNhc2UgJzcnOgotICAgICAgICAgIHJldHVybiBwYXJzZUludChjaGFyc2V0UGFydC5zdWJzdHJpbmcoMSksIDgpOwotICAgICAgICBkZWZhdWx0OiByZXR1cm4gY2hhcnNldFBhcnQuY2hhckNvZGVBdCgxKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBmdW5jdGlvbiBlbmNvZGVFc2NhcGUoY2hhckNvZGUpIHsKLSAgICAgIGlmIChjaGFyQ29kZSA8IDB4MjApIHsKLSAgICAgICAgcmV0dXJuIChjaGFyQ29kZSA8IDB4MTAgPyAnXFx4MCcgOiAnXFx4JykgKyBjaGFyQ29kZS50b1N0cmluZygxNik7Ci0gICAgICB9Ci0gICAgICB2YXIgY2ggPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGNoYXJDb2RlKTsKLSAgICAgIGlmIChjaCA9PT0gJ1xcJyB8fCBjaCA9PT0gJy0nIHx8IGNoID09PSAnWycgfHwgY2ggPT09ICddJykgewotICAgICAgICBjaCA9ICdcXCcgKyBjaDsKLSAgICAgIH0KLSAgICAgIHJldHVybiBjaDsKLSAgICB9Ci0KLSAgICBmdW5jdGlvbiBjYXNlRm9sZENoYXJzZXQoY2hhclNldCkgewotICAgICAgdmFyIGNoYXJzZXRQYXJ0cyA9IGNoYXJTZXQuc3Vic3RyaW5nKDEsIGNoYXJTZXQubGVuZ3RoIC0gMSkubWF0Y2goCi0gICAgICAgICAgbmV3IFJlZ0V4cCgKLSAgICAgICAgICAgICAgJ1xcXFx1WzAtOUEtRmEtZl17NH0nCi0gICAgICAgICAgICAgICsgJ3xcXFxceFswLTlBLUZhLWZdezJ9JwotICAgICAgICAgICAgICArICd8XFxcXFswLTNdWzAtN117MCwyfScKLSAgICAgICAgICAgICAgKyAnfFxcXFxbMC03XXsxLDJ9JwotICAgICAgICAgICAgICArICd8XFxcXFtcXHNcXFNdJwotICAgICAgICAgICAgICArICd8LScKLSAgICAgICAgICAgICAgKyAnfFteLVxcXFxdJywKLSAgICAgICAgICAgICAgJ2cnKSk7Ci0gICAgICB2YXIgZ3JvdXBzID0gW107Ci0gICAgICB2YXIgcmFuZ2VzID0gW107Ci0gICAgICB2YXIgaW52ZXJzZSA9IGNoYXJzZXRQYXJ0c1swXSA9PT0gJ14nOwotICAgICAgZm9yICh2YXIgaSA9IGludmVyc2UgPyAxIDogMCwgbiA9IGNoYXJzZXRQYXJ0cy5sZW5ndGg7IGkgPCBuOyArK2kpIHsKLSAgICAgICAgdmFyIHAgPSBjaGFyc2V0UGFydHNbaV07Ci0gICAgICAgIHN3aXRjaCAocCkgewotICAgICAgICAgIGNhc2UgJ1xcQic6IGNhc2UgJ1xcYic6Ci0gICAgICAgICAgY2FzZSAnXFxEJzogY2FzZSAnXFxkJzoKLSAgICAgICAgICBjYXNlICdcXFMnOiBjYXNlICdcXHMnOgotICAgICAgICAgIGNhc2UgJ1xcVyc6IGNhc2UgJ1xcdyc6Ci0gICAgICAgICAgICBncm91cHMucHVzaChwKTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIHZhciBzdGFydCA9IGRlY29kZUVzY2FwZShwKTsKLSAgICAgICAgdmFyIGVuZDsKLSAgICAgICAgaWYgKGkgKyAyIDwgbiAmJiAnLScgPT09IGNoYXJzZXRQYXJ0c1tpICsgMV0pIHsKLSAgICAgICAgICBlbmQgPSBkZWNvZGVFc2NhcGUoY2hhcnNldFBhcnRzW2kgKyAyXSk7Ci0gICAgICAgICAgaSArPSAyOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGVuZCA9IHN0YXJ0OwotICAgICAgICB9Ci0gICAgICAgIHJhbmdlcy5wdXNoKFtzdGFydCwgZW5kXSk7Ci0gICAgICAgIC8vIElmIHRoZSByYW5nZSBtaWdodCBpbnRlcnNlY3QgbGV0dGVycywgdGhlbiBleHBhbmQgaXQuCi0gICAgICAgIGlmICghKGVuZCA8IDY1IHx8IHN0YXJ0ID4gMTIyKSkgewotICAgICAgICAgIGlmICghKGVuZCA8IDY1IHx8IHN0YXJ0ID4gOTApKSB7Ci0gICAgICAgICAgICByYW5nZXMucHVzaChbTWF0aC5tYXgoNjUsIHN0YXJ0KSB8IDMyLCBNYXRoLm1pbihlbmQsIDkwKSB8IDMyXSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmICghKGVuZCA8IDk3IHx8IHN0YXJ0ID4gMTIyKSkgewotICAgICAgICAgICAgcmFuZ2VzLnB1c2goW01hdGgubWF4KDk3LCBzdGFydCkgJiB+MzIsIE1hdGgubWluKGVuZCwgMTIyKSAmIH4zMl0pOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICAvLyBbWzEsIDEwXSwgWzMsIDRdLCBbOCwgMTJdLCBbMTQsIDE0XSwgWzE2LCAxNl0sIFsxNywgMTddXQotICAgICAgLy8gLT4gW1sxLCAxMl0sIFsxNCwgMTRdLCBbMTYsIDE3XV0KLSAgICAgIHJhbmdlcy5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiAoYVswXSAtIGJbMF0pIHx8IChiWzFdICAtIGFbMV0pOyB9KTsKLSAgICAgIHZhciBjb25zb2xpZGF0ZWRSYW5nZXMgPSBbXTsKLSAgICAgIHZhciBsYXN0UmFuZ2UgPSBbTmFOLCBOYU5dOwotICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByYW5nZXMubGVuZ3RoOyArK2kpIHsKLSAgICAgICAgdmFyIHJhbmdlID0gcmFuZ2VzW2ldOwotICAgICAgICBpZiAocmFuZ2VbMF0gPD0gbGFzdFJhbmdlWzFdICsgMSkgewotICAgICAgICAgIGxhc3RSYW5nZVsxXSA9IE1hdGgubWF4KGxhc3RSYW5nZVsxXSwgcmFuZ2VbMV0pOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGNvbnNvbGlkYXRlZFJhbmdlcy5wdXNoKGxhc3RSYW5nZSA9IHJhbmdlKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICB2YXIgb3V0ID0gWydbJ107Ci0gICAgICBpZiAoaW52ZXJzZSkgeyBvdXQucHVzaCgnXicpOyB9Ci0gICAgICBvdXQucHVzaC5hcHBseShvdXQsIGdyb3Vwcyk7Ci0gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbnNvbGlkYXRlZFJhbmdlcy5sZW5ndGg7ICsraSkgewotICAgICAgICB2YXIgcmFuZ2UgPSBjb25zb2xpZGF0ZWRSYW5nZXNbaV07Ci0gICAgICAgIG91dC5wdXNoKGVuY29kZUVzY2FwZShyYW5nZVswXSkpOwotICAgICAgICBpZiAocmFuZ2VbMV0gPiByYW5nZVswXSkgewotICAgICAgICAgIGlmIChyYW5nZVsxXSArIDEgPiByYW5nZVswXSkgeyBvdXQucHVzaCgnLScpOyB9Ci0gICAgICAgICAgb3V0LnB1c2goZW5jb2RlRXNjYXBlKHJhbmdlWzFdKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIG91dC5wdXNoKCddJyk7Ci0gICAgICByZXR1cm4gb3V0LmpvaW4oJycpOwotICAgIH0KLQotICAgIGZ1bmN0aW9uIGFsbG93QW55d2hlcmVGb2xkQ2FzZUFuZFJlbnVtYmVyR3JvdXBzKHJlZ2V4KSB7Ci0gICAgICAvLyBTcGxpdCBpbnRvIGNoYXJhY3RlciBzZXRzLCBlc2NhcGUgc2VxdWVuY2VzLCBwdW5jdHVhdGlvbiBzdHJpbmdzCi0gICAgICAvLyBsaWtlICgnKCcsICcoPzonLCAnKScsICdeJyksIGFuZCBydW5zIG9mIGNoYXJhY3RlcnMgdGhhdCBkbyBub3QKLSAgICAgIC8vIGluY2x1ZGUgYW55IG9mIHRoZSBhYm92ZS4KLSAgICAgIHZhciBwYXJ0cyA9IHJlZ2V4LnNvdXJjZS5tYXRjaCgKLSAgICAgICAgICBuZXcgUmVnRXhwKAotICAgICAgICAgICAgICAnKD86JwotICAgICAgICAgICAgICArICdcXFsoPzpbXlxceDVDXFx4NURdfFxcXFxbXFxzXFxTXSkqXFxdJyAgLy8gYSBjaGFyYWN0ZXIgc2V0Ci0gICAgICAgICAgICAgICsgJ3xcXFxcdVtBLUZhLWYwLTldezR9JyAgLy8gYSB1bmljb2RlIGVzY2FwZQotICAgICAgICAgICAgICArICd8XFxcXHhbQS1GYS1mMC05XXsyfScgIC8vIGEgaGV4IGVzY2FwZQotICAgICAgICAgICAgICArICd8XFxcXFswLTldKycgIC8vIGEgYmFjay1yZWZlcmVuY2Ugb3Igb2N0YWwgZXNjYXBlCi0gICAgICAgICAgICAgICsgJ3xcXFxcW151eDAtOV0nICAvLyBvdGhlciBlc2NhcGUgc2VxdWVuY2UKLSAgICAgICAgICAgICAgKyAnfFxcKFxcP1s6IT1dJyAgLy8gc3RhcnQgb2YgYSBub24tY2FwdHVyaW5nIGdyb3VwCi0gICAgICAgICAgICAgICsgJ3xbXFwoXFwpXFxeXScgIC8vIHN0YXJ0L2VtZCBvZiBhIGdyb3VwLCBvciBsaW5lIHN0YXJ0Ci0gICAgICAgICAgICAgICsgJ3xbXlxceDVCXFx4NUNcXChcXClcXF5dKycgIC8vIHJ1biBvZiBvdGhlciBjaGFyYWN0ZXJzCi0gICAgICAgICAgICAgICsgJyknLAotICAgICAgICAgICAgICAnZycpKTsKLSAgICAgIHZhciBuID0gcGFydHMubGVuZ3RoOwotCi0gICAgICAvLyBNYXBzIGNhcHR1cmVkIGdyb3VwIG51bWJlcnMgdG8gdGhlIG51bWJlciB0aGV5IHdpbGwgb2NjdXB5IGluCi0gICAgICAvLyB0aGUgb3V0cHV0IG9yIHRvIC0xIGlmIHRoYXQgaGFzIG5vdCBiZWVuIGRldGVybWluZWQsIG9yIHRvCi0gICAgICAvLyB1bmRlZmluZWQgaWYgdGhleSBuZWVkIG5vdCBiZSBjYXB0dXJpbmcgaW4gdGhlIG91dHB1dC4KLSAgICAgIHZhciBjYXB0dXJlZEdyb3VwcyA9IFtdOwotCi0gICAgICAvLyBXYWxrIG92ZXIgYW5kIGlkZW50aWZ5IGJhY2sgcmVmZXJlbmNlcyB0byBidWlsZCB0aGUgY2FwdHVyZWRHcm91cHMKLSAgICAgIC8vIG1hcHBpbmcuCi0gICAgICBmb3IgKHZhciBpID0gMCwgZ3JvdXBJbmRleCA9IDA7IGkgPCBuOyArK2kpIHsKLSAgICAgICAgdmFyIHAgPSBwYXJ0c1tpXTsKLSAgICAgICAgaWYgKHAgPT09ICcoJykgewotICAgICAgICAgIC8vIGdyb3VwcyBhcmUgMS1pbmRleGVkLCBzbyBtYXggZ3JvdXAgaW5kZXggaXMgY291bnQgb2YgJygnCi0gICAgICAgICAgKytncm91cEluZGV4OwotICAgICAgICB9IGVsc2UgaWYgKCdcXCcgPT09IHAuY2hhckF0KDApKSB7Ci0gICAgICAgICAgdmFyIGRlY2ltYWxWYWx1ZSA9ICtwLnN1YnN0cmluZygxKTsKLSAgICAgICAgICBpZiAoZGVjaW1hbFZhbHVlICYmIGRlY2ltYWxWYWx1ZSA8PSBncm91cEluZGV4KSB7Ci0gICAgICAgICAgICBjYXB0dXJlZEdyb3Vwc1tkZWNpbWFsVmFsdWVdID0gLTE7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIC8vIFJlbnVtYmVyIGdyb3VwcyBhbmQgcmVkdWNlIGNhcHR1cmluZyBncm91cHMgdG8gbm9uLWNhcHR1cmluZyBncm91cHMKLSAgICAgIC8vIHdoZXJlIHBvc3NpYmxlLgotICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBjYXB0dXJlZEdyb3Vwcy5sZW5ndGg7ICsraSkgewotICAgICAgICBpZiAoLTEgPT09IGNhcHR1cmVkR3JvdXBzW2ldKSB7Ci0gICAgICAgICAgY2FwdHVyZWRHcm91cHNbaV0gPSArK2NhcHR1cmVkR3JvdXBJbmRleDsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZm9yICh2YXIgaSA9IDAsIGdyb3VwSW5kZXggPSAwOyBpIDwgbjsgKytpKSB7Ci0gICAgICAgIHZhciBwID0gcGFydHNbaV07Ci0gICAgICAgIGlmIChwID09PSAnKCcpIHsKLSAgICAgICAgICArK2dyb3VwSW5kZXg7Ci0gICAgICAgICAgaWYgKGNhcHR1cmVkR3JvdXBzW2dyb3VwSW5kZXhdID09PSB1bmRlZmluZWQpIHsKLSAgICAgICAgICAgIHBhcnRzW2ldID0gJyg/Oic7Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKCdcXCcgPT09IHAuY2hhckF0KDApKSB7Ci0gICAgICAgICAgdmFyIGRlY2ltYWxWYWx1ZSA9ICtwLnN1YnN0cmluZygxKTsKLSAgICAgICAgICBpZiAoZGVjaW1hbFZhbHVlICYmIGRlY2ltYWxWYWx1ZSA8PSBncm91cEluZGV4KSB7Ci0gICAgICAgICAgICBwYXJ0c1tpXSA9ICdcXCcgKyBjYXB0dXJlZEdyb3Vwc1tncm91cEluZGV4XTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLy8gUmVtb3ZlIGFueSBwcmVmaXggYW5jaG9ycyBzbyB0aGF0IHRoZSBvdXRwdXQgd2lsbCBtYXRjaCBhbnl3aGVyZS4KLSAgICAgIC8vIF5eIHJlYWxseSBkb2VzIG1lYW4gYW4gYW5jaG9yZWQgbWF0Y2ggdGhvdWdoLgotICAgICAgZm9yICh2YXIgaSA9IDAsIGdyb3VwSW5kZXggPSAwOyBpIDwgbjsgKytpKSB7Ci0gICAgICAgIGlmICgnXicgPT09IHBhcnRzW2ldICYmICdeJyAhPT0gcGFydHNbaSArIDFdKSB7IHBhcnRzW2ldID0gJyc7IH0KLSAgICAgIH0KLQotICAgICAgLy8gRXhwYW5kIGxldHRlcnMgdG8gZ3JvdXB0cyB0byBoYW5kbGUgbWl4aW5nIG9mIGNhc2Utc2Vuc2l0aXZlIGFuZAotICAgICAgLy8gY2FzZS1pbnNlbnNpdGl2ZSBwYXR0ZXJucyBpZiBuZWNlc3NhcnkuCi0gICAgICBpZiAocmVnZXguaWdub3JlQ2FzZSAmJiBuZWVkVG9Gb2xkQ2FzZSkgewotICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG47ICsraSkgewotICAgICAgICAgIHZhciBwID0gcGFydHNbaV07Ci0gICAgICAgICAgdmFyIGNoMCA9IHAuY2hhckF0KDApOwotICAgICAgICAgIGlmIChwLmxlbmd0aCA+PSAyICYmIGNoMCA9PT0gJ1snKSB7Ci0gICAgICAgICAgICBwYXJ0c1tpXSA9IGNhc2VGb2xkQ2hhcnNldChwKTsKLSAgICAgICAgICB9IGVsc2UgaWYgKGNoMCAhPT0gJ1xcJykgewotICAgICAgICAgICAgLy8gVE9ETzogaGFuZGxlIGxldHRlcnMgaW4gbnVtZXJpYyBlc2NhcGVzLgotICAgICAgICAgICAgcGFydHNbaV0gPSBwLnJlcGxhY2UoCi0gICAgICAgICAgICAgICAgL1thLXpBLVpdL2csCi0gICAgICAgICAgICAgICAgZnVuY3Rpb24gKGNoKSB7Ci0gICAgICAgICAgICAgICAgICB2YXIgY2MgPSBjaC5jaGFyQ29kZUF0KDApOwotICAgICAgICAgICAgICAgICAgcmV0dXJuICdbJyArIFN0cmluZy5mcm9tQ2hhckNvZGUoY2MgJiB+MzIsIGNjIHwgMzIpICsgJ10nOwotICAgICAgICAgICAgICAgIH0pOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICByZXR1cm4gcGFydHMuam9pbignJyk7Ci0gICAgfQotCi0gICAgdmFyIHJld3JpdHRlbiA9IFtdOwotICAgIGZvciAodmFyIGkgPSAwLCBuID0gcmVnZXhzLmxlbmd0aDsgaSA8IG47ICsraSkgewotICAgICAgdmFyIHJlZ2V4ID0gcmVnZXhzW2ldOwotICAgICAgaWYgKHJlZ2V4Lmdsb2JhbCB8fCByZWdleC5tdWx0aWxpbmUpIHsgdGhyb3cgbmV3IEVycm9yKCcnICsgcmVnZXgpOyB9Ci0gICAgICByZXdyaXR0ZW4ucHVzaCgKLSAgICAgICAgICAnKD86JyArIGFsbG93QW55d2hlcmVGb2xkQ2FzZUFuZFJlbnVtYmVyR3JvdXBzKHJlZ2V4KSArICcpJyk7Ci0gICAgfQotCi0gICAgcmV0dXJuIG5ldyBSZWdFeHAocmV3cml0dGVuLmpvaW4oJ3wnKSwgaWdub3JlQ2FzZSA/ICdnaScgOiAnZycpOwotICB9Ci0KLSAgdmFyIFBSX2lubmVySHRtbFdvcmtzID0gbnVsbDsKLSAgZnVuY3Rpb24gZ2V0SW5uZXJIdG1sKG5vZGUpIHsKLSAgICAvLyBpbm5lciBodG1sIGlzIGhvcGVsZXNzbHkgYnJva2VuIGluIFNhZmFyaSAyLjAuNCB3aGVuIHRoZSBjb250ZW50IGlzCi0gICAgLy8gYW4gaHRtbCBkZXNjcmlwdGlvbiBvZiB3ZWxsIGZvcm1lZCBYTUwgYW5kIHRoZSBjb250YWluaW5nIHRhZyBpcyBhIFBSRQotICAgIC8vIHRhZywgc28gd2UgZGV0ZWN0IHRoYXQgY2FzZSBhbmQgZW11bGF0ZSBpbm5lckhUTUwuCi0gICAgaWYgKG51bGwgPT09IFBSX2lubmVySHRtbFdvcmtzKSB7Ci0gICAgICB2YXIgdGVzdE5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdQUkUnKTsKLSAgICAgIHRlc3ROb2RlLmFwcGVuZENoaWxkKAotICAgICAgICAgIGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCc8IURPQ1RZUEUgZm9vIFBVQkxJQyAiZm9vIGJhciI+XG48Zm9vIC8+JykpOwotICAgICAgUFJfaW5uZXJIdG1sV29ya3MgPSAhLzwvLnRlc3QodGVzdE5vZGUuaW5uZXJIVE1MKTsKLSAgICB9Ci0KLSAgICBpZiAoUFJfaW5uZXJIdG1sV29ya3MpIHsKLSAgICAgIHZhciBjb250ZW50ID0gbm9kZS5pbm5lckhUTUw7Ci0gICAgICAvLyBYTVAgdGFncyBjb250YWluIHVuZXNjYXBlZCBlbnRpdGllcyBzbyByZXF1aXJlIHNwZWNpYWwgaGFuZGxpbmcuCi0gICAgICBpZiAoaXNSYXdDb250ZW50KG5vZGUpKSB7Ci0gICAgICAgIGNvbnRlbnQgPSB0ZXh0VG9IdG1sKGNvbnRlbnQpOwotICAgICAgfSBlbHNlIGlmICghaXNQcmVmb3JtYXR0ZWQobm9kZSwgY29udGVudCkpIHsKLSAgICAgICAgY29udGVudCA9IGNvbnRlbnQucmVwbGFjZSgvKDxiclxzKlwvPz4pW1xyXG5dKy9nLCAnJDEnKQotICAgICAgICAgICAgLnJlcGxhY2UoLyg/OltcclxuXStbIFx0XSopKy9nLCAnICcpOwotICAgICAgfQotICAgICAgcmV0dXJuIGNvbnRlbnQ7Ci0gICAgfQotCi0gICAgdmFyIG91dCA9IFtdOwotICAgIGZvciAodmFyIGNoaWxkID0gbm9kZS5maXJzdENoaWxkOyBjaGlsZDsgY2hpbGQgPSBjaGlsZC5uZXh0U2libGluZykgewotICAgICAgbm9ybWFsaXplZEh0bWwoY2hpbGQsIG91dCk7Ci0gICAgfQotICAgIHJldHVybiBvdXQuam9pbignJyk7Ci0gIH0KLQotICAvKiogcmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgZXhwYW5kIHRhYnMgdG8gc3BhY2VzLiAgVGhpcyBmdW5jdGlvbiBjYW4gYmUgZmVkCi0gICAgKiBzdWNjZXNzaXZlIGNodW5rcyBvZiB0ZXh0LCBhbmQgd2lsbCBtYWludGFpbiBpdHMgb3duIGludGVybmFsIHN0YXRlIHRvCi0gICAgKiBrZWVwIHRyYWNrIG9mIGhvdyB0YWJzIGFyZSBleHBhbmRlZC4KLSAgICAqIEByZXR1cm4ge2Z1bmN0aW9uIChzdHJpbmcpIDogc3RyaW5nfSBhIGZ1bmN0aW9uIHRoYXQgdGFrZXMKLSAgICAqICAgcGxhaW4gdGV4dCBhbmQgcmV0dXJuIHRoZSB0ZXh0IHdpdGggdGFicyBleHBhbmRlZC4KLSAgICAqIEBwcml2YXRlCi0gICAgKi8KLSAgZnVuY3Rpb24gbWFrZVRhYkV4cGFuZGVyKHRhYldpZHRoKSB7Ci0gICAgdmFyIFNQQUNFUyA9ICcgICAgICAgICAgICAgICAgJzsKLSAgICB2YXIgY2hhckluTGluZSA9IDA7Ci0KLSAgICByZXR1cm4gZnVuY3Rpb24gKHBsYWluVGV4dCkgewotICAgICAgLy8gd2FsayBvdmVyIGVhY2ggY2hhcmFjdGVyIGxvb2tpbmcgZm9yIHRhYnMgYW5kIG5ld2xpbmVzLgotICAgICAgLy8gT24gdGFicywgZXhwYW5kIHRoZW0uICBPbiBuZXdsaW5lcywgcmVzZXQgY2hhckluTGluZS4KLSAgICAgIC8vIE90aGVyd2lzZSBpbmNyZW1lbnQgY2hhckluTGluZQotICAgICAgdmFyIG91dCA9IG51bGw7Ci0gICAgICB2YXIgcG9zID0gMDsKLSAgICAgIGZvciAodmFyIGkgPSAwLCBuID0gcGxhaW5UZXh0Lmxlbmd0aDsgaSA8IG47ICsraSkgewotICAgICAgICB2YXIgY2ggPSBwbGFpblRleHQuY2hhckF0KGkpOwotCi0gICAgICAgIHN3aXRjaCAoY2gpIHsKLSAgICAgICAgICBjYXNlICdcdCc6Ci0gICAgICAgICAgICBpZiAoIW91dCkgeyBvdXQgPSBbXTsgfQotICAgICAgICAgICAgb3V0LnB1c2gocGxhaW5UZXh0LnN1YnN0cmluZyhwb3MsIGkpKTsKLSAgICAgICAgICAgIC8vIGNhbGN1bGF0ZSBob3cgbXVjaCBzcGFjZSB3ZSBuZWVkIGluIGZyb250IG9mIHRoaXMgcGFydAotICAgICAgICAgICAgLy8gblNwYWNlcyBpcyB0aGUgYW1vdW50IG9mIHBhZGRpbmcgLS0gdGhlIG51bWJlciBvZiBzcGFjZXMgbmVlZGVkCi0gICAgICAgICAgICAvLyB0byBtb3ZlIHVzIHRvIHRoZSBuZXh0IGNvbHVtbiwgd2hlcmUgY29sdW1ucyBvY2N1ciBhdCBmYWN0b3JzIG9mCi0gICAgICAgICAgICAvLyB0YWJXaWR0aC4KLSAgICAgICAgICAgIHZhciBuU3BhY2VzID0gdGFiV2lkdGggLSAoY2hhckluTGluZSAlIHRhYldpZHRoKTsKLSAgICAgICAgICAgIGNoYXJJbkxpbmUgKz0gblNwYWNlczsKLSAgICAgICAgICAgIGZvciAoOyBuU3BhY2VzID49IDA7IG5TcGFjZXMgLT0gU1BBQ0VTLmxlbmd0aCkgewotICAgICAgICAgICAgICBvdXQucHVzaChTUEFDRVMuc3Vic3RyaW5nKDAsIG5TcGFjZXMpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBvcyA9IGkgKyAxOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSAnXG4nOgotICAgICAgICAgICAgY2hhckluTGluZSA9IDA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgKytjaGFySW5MaW5lOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoIW91dCkgeyByZXR1cm4gcGxhaW5UZXh0OyB9Ci0gICAgICBvdXQucHVzaChwbGFpblRleHQuc3Vic3RyaW5nKHBvcykpOwotICAgICAgcmV0dXJuIG91dC5qb2luKCcnKTsKLSAgICB9OwotICB9Ci0KLSAgdmFyIHByX2NodW5rUGF0dGVybiA9IG5ldyBSZWdFeHAoCi0gICAgICAnW148XSsnICAvLyBBIHJ1biBvZiBjaGFyYWN0ZXJzIG90aGVyIHRoYW4gJzwnCi0gICAgICArICd8PFwhLS1bXFxzXFxTXSo/LS1cPicgIC8vIGFuIEhUTUwgY29tbWVudAotICAgICAgKyAnfDwhXFxbQ0RBVEFcXFtbXFxzXFxTXSo/XFxdXFxdPicgIC8vIGEgQ0RBVEEgc2VjdGlvbgotICAgICAgLy8gYSBwcm9iYWJsZSB0YWcgdGhhdCBzaG91bGQgbm90IGJlIGhpZ2hsaWdodGVkCi0gICAgICArICd8PFwvP1thLXpBLVpdKD86W14+XCJcJ118XCdbXlwnXSpcJ3xcIlteXCJdKlwiKSo+JwotICAgICAgKyAnfDwnLCAgLy8gQSAnPCcgdGhhdCBkb2VzIG5vdCBiZWdpbiBhIGxhcmdlciBjaHVuawotICAgICAgJ2cnKTsKLSAgdmFyIHByX2NvbW1lbnRQcmVmaXggPSAvXjxcIS0tLzsKLSAgdmFyIHByX2NkYXRhUHJlZml4ID0gL148IVxbQ0RBVEFcWy87Ci0gIHZhciBwcl9iclByZWZpeCA9IC9ePGJyXGIvaTsKLSAgdmFyIHByX3RhZ05hbWVSZSA9IC9ePChcLz8pKFthLXpBLVpdW2EtekEtWjAtOV0qKS87Ci0KLSAgLyoqIHNwbGl0IG1hcmt1cCBpbnRvIGNodW5rcyBvZiBodG1sIHRhZ3MgKHN0eWxlIG51bGwpIGFuZAotICAgICogcGxhaW4gdGV4dCAoc3R5bGUge0BsaW5rICNQUl9QTEFJTn0pLCBjb252ZXJ0aW5nIHRhZ3Mgd2hpY2ggYXJlCi0gICAgKiBzaWduaWZpY2FudCBmb3IgdG9rZW5pemF0aW9uICg8YnI+KSBpbnRvIHRoZWlyIHRleHR1YWwgZXF1aXZhbGVudC4KLSAgICAqCi0gICAgKiBAcGFyYW0ge3N0cmluZ30gcyBodG1sIHdoZXJlIHdoaXRlc3BhY2UgaXMgY29uc2lkZXJlZCBzaWduaWZpY2FudC4KLSAgICAqIEByZXR1cm4ge09iamVjdH0gc291cmNlIGNvZGUgYW5kIGV4dHJhY3RlZCB0YWdzLgotICAgICogQHByaXZhdGUKLSAgICAqLwotICBmdW5jdGlvbiBleHRyYWN0VGFncyhzKSB7Ci0gICAgLy8gc2luY2UgdGhlIHBhdHRlcm4gaGFzIHRoZSAnZycgbW9kaWZpZXIgYW5kIGRlZmluZXMgbm8gY2FwdHVyaW5nIGdyb3VwcywKLSAgICAvLyB0aGlzIHdpbGwgcmV0dXJuIGEgbGlzdCBvZiBhbGwgY2h1bmtzIHdoaWNoIHdlIHRoZW4gY2xhc3NpZnkgYW5kIHdyYXAgYXMKLSAgICAvLyBQUl9Ub2tlbnMKLSAgICB2YXIgbWF0Y2hlcyA9IHMubWF0Y2gocHJfY2h1bmtQYXR0ZXJuKTsKLSAgICB2YXIgc291cmNlQnVmID0gW107Ci0gICAgdmFyIHNvdXJjZUJ1ZkxlbiA9IDA7Ci0gICAgdmFyIGV4dHJhY3RlZFRhZ3MgPSBbXTsKLSAgICBpZiAobWF0Y2hlcykgewotICAgICAgZm9yICh2YXIgaSA9IDAsIG4gPSBtYXRjaGVzLmxlbmd0aDsgaSA8IG47ICsraSkgewotICAgICAgICB2YXIgbWF0Y2ggPSBtYXRjaGVzW2ldOwotICAgICAgICBpZiAobWF0Y2gubGVuZ3RoID4gMSAmJiBtYXRjaC5jaGFyQXQoMCkgPT09ICc8JykgewotICAgICAgICAgIGlmIChwcl9jb21tZW50UHJlZml4LnRlc3QobWF0Y2gpKSB7IGNvbnRpbnVlOyB9Ci0gICAgICAgICAgaWYgKHByX2NkYXRhUHJlZml4LnRlc3QobWF0Y2gpKSB7Ci0gICAgICAgICAgICAvLyBzdHJpcCBDREFUQSBwcmVmaXggYW5kIHN1ZmZpeC4gIERvbid0IHVuZXNjYXBlIHNpbmNlIGl0J3MgQ0RBVEEKLSAgICAgICAgICAgIHNvdXJjZUJ1Zi5wdXNoKG1hdGNoLnN1YnN0cmluZyg5LCBtYXRjaC5sZW5ndGggLSAzKSk7Ci0gICAgICAgICAgICBzb3VyY2VCdWZMZW4gKz0gbWF0Y2gubGVuZ3RoIC0gMTI7Ci0gICAgICAgICAgfSBlbHNlIGlmIChwcl9iclByZWZpeC50ZXN0KG1hdGNoKSkgewotICAgICAgICAgICAgLy8gPGJyPiB0YWdzIGFyZSBsZXhpY2FsbHkgc2lnbmlmaWNhbnQgc28gY29udmVydCB0aGVtIHRvIHRleHQuCi0gICAgICAgICAgICAvLyBUaGlzIGlzIHVuZG9uZSBsYXRlci4KLSAgICAgICAgICAgIHNvdXJjZUJ1Zi5wdXNoKCdcbicpOwotICAgICAgICAgICAgKytzb3VyY2VCdWZMZW47Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChtYXRjaC5pbmRleE9mKFBSX05PQ09ERSkgPj0gMCAmJiBpc05vQ29kZVRhZyhtYXRjaCkpIHsKLSAgICAgICAgICAgICAgLy8gQSA8c3BhbiBjbGFzcz0ibm9jb2RlIj4gd2lsbCBzdGFydCBhIHNlY3Rpb24gdGhhdCBzaG91bGQgYmUKLSAgICAgICAgICAgICAgLy8gaWdub3JlZC4gIENvbnRpbnVlIHdhbGtpbmcgdGhlIGxpc3QgdW50aWwgd2Ugc2VlIGEgbWF0Y2hpbmcgZW5kCi0gICAgICAgICAgICAgIC8vIHRhZy4KLSAgICAgICAgICAgICAgdmFyIG5hbWUgPSBtYXRjaC5tYXRjaChwcl90YWdOYW1lUmUpWzJdOwotICAgICAgICAgICAgICB2YXIgZGVwdGggPSAxOwotICAgICAgICAgICAgICB2YXIgajsKLSAgICAgICAgICAgICAgZW5kX3RhZ19sb29wOgotICAgICAgICAgICAgICBmb3IgKGogPSBpICsgMTsgaiA8IG47ICsraikgewotICAgICAgICAgICAgICAgIHZhciBuYW1lMiA9IG1hdGNoZXNbal0ubWF0Y2gocHJfdGFnTmFtZVJlKTsKLSAgICAgICAgICAgICAgICBpZiAobmFtZTIgJiYgbmFtZTJbMl0gPT09IG5hbWUpIHsKLSAgICAgICAgICAgICAgICAgIGlmIChuYW1lMlsxXSA9PT0gJy8nKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgtLWRlcHRoID09PSAwKSB7IGJyZWFrIGVuZF90YWdfbG9vcDsgfQotICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgKytkZXB0aDsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgaWYgKGogPCBuKSB7Ci0gICAgICAgICAgICAgICAgZXh0cmFjdGVkVGFncy5wdXNoKAotICAgICAgICAgICAgICAgICAgICBzb3VyY2VCdWZMZW4sIG1hdGNoZXMuc2xpY2UoaSwgaiArIDEpLmpvaW4oJycpKTsKLSAgICAgICAgICAgICAgICBpID0gajsKLSAgICAgICAgICAgICAgfSBlbHNlIHsgIC8vIElnbm9yZSB1bmNsb3NlZCBzZWN0aW9ucy4KLSAgICAgICAgICAgICAgICBleHRyYWN0ZWRUYWdzLnB1c2goc291cmNlQnVmTGVuLCBtYXRjaCk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgIGV4dHJhY3RlZFRhZ3MucHVzaChzb3VyY2VCdWZMZW4sIG1hdGNoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgdmFyIGxpdGVyYWxUZXh0ID0gaHRtbFRvVGV4dChtYXRjaCk7Ci0gICAgICAgICAgc291cmNlQnVmLnB1c2gobGl0ZXJhbFRleHQpOwotICAgICAgICAgIHNvdXJjZUJ1ZkxlbiArPSBsaXRlcmFsVGV4dC5sZW5ndGg7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHsgc291cmNlOiBzb3VyY2VCdWYuam9pbignJyksIHRhZ3M6IGV4dHJhY3RlZFRhZ3MgfTsKLSAgfQotCi0gIC8qKiBUcnVlIGlmIHRoZSBnaXZlbiB0YWcgY29udGFpbnMgYSBjbGFzcyBhdHRyaWJ1dGUgd2l0aCB0aGUgbm9jb2RlIGNsYXNzLiAqLwotICBmdW5jdGlvbiBpc05vQ29kZVRhZyh0YWcpIHsKLSAgICByZXR1cm4gISF0YWcKLSAgICAgICAgLy8gRmlyc3QgY2Fub25pY2FsaXplIHRoZSByZXByZXNlbnRhdGlvbiBvZiBhdHRyaWJ1dGVzCi0gICAgICAgIC5yZXBsYWNlKC9ccyhcdyspXHMqPVxzKig/OlwiKFteXCJdKilcInwnKFteXCddKiknfChcUyspKS9nLAotICAgICAgICAgICAgICAgICAnICQxPSIkMiQzJDQiJykKLSAgICAgICAgLy8gVGhlbiBsb29rIGZvciB0aGUgYXR0cmlidXRlIHdlIHdhbnQuCi0gICAgICAgIC5tYXRjaCgvW2NDXVtsTF1bYUFdW3NTXVtzU109XCJbXlwiXSpcYm5vY29kZVxiLyk7Ci0gIH0KLQotICAvKioKLSAgICogQXBwbHkgdGhlIGdpdmVuIGxhbmd1YWdlIGhhbmRsZXIgdG8gc291cmNlQ29kZSBhbmQgYWRkIHRoZSByZXN1bHRpbmcKLSAgICogZGVjb3JhdGlvbnMgdG8gb3V0LgotICAgKiBAcGFyYW0ge251bWJlcn0gYmFzZVBvcyB0aGUgaW5kZXggb2Ygc291cmNlQ29kZSB3aXRoaW4gdGhlIGNodW5rIG9mIHNvdXJjZQotICAgKiAgICB3aG9zZSBkZWNvcmF0aW9ucyBhcmUgYWxyZWFkeSBwcmVzZW50IG9uIG91dC4KLSAgICovCi0gIGZ1bmN0aW9uIGFwcGVuZERlY29yYXRpb25zKGJhc2VQb3MsIHNvdXJjZUNvZGUsIGxhbmdIYW5kbGVyLCBvdXQpIHsKLSAgICBpZiAoIXNvdXJjZUNvZGUpIHsgcmV0dXJuOyB9Ci0gICAgdmFyIGpvYiA9IHsKLSAgICAgIHNvdXJjZTogc291cmNlQ29kZSwKLSAgICAgIGJhc2VQb3M6IGJhc2VQb3MKLSAgICB9OwotICAgIGxhbmdIYW5kbGVyKGpvYik7Ci0gICAgb3V0LnB1c2guYXBwbHkob3V0LCBqb2IuZGVjb3JhdGlvbnMpOwotICB9Ci0KLSAgLyoqIEdpdmVuIHRyaXBsZXMgb2YgW3N0eWxlLCBwYXR0ZXJuLCBjb250ZXh0XSByZXR1cm5zIGEgbGV4aW5nIGZ1bmN0aW9uLAotICAgICogVGhlIGxleGluZyBmdW5jdGlvbiBpbnRlcnByZXRzIHRoZSBwYXR0ZXJucyB0byBmaW5kIHRva2VuIGJvdW5kYXJpZXMgYW5kCi0gICAgKiByZXR1cm5zIGEgZGVjb3JhdGlvbiBsaXN0IG9mIHRoZSBmb3JtCi0gICAgKiBbaW5kZXhfMCwgc3R5bGVfMCwgaW5kZXhfMSwgc3R5bGVfMSwgLi4uLCBpbmRleF9uLCBzdHlsZV9uXQotICAgICogd2hlcmUgaW5kZXhfbiBpcyBhbiBpbmRleCBpbnRvIHRoZSBzb3VyY2VDb2RlLCBhbmQgc3R5bGVfbiBpcyBhIHN0eWxlCi0gICAgKiBjb25zdGFudCBsaWtlIFBSX1BMQUlOLiAgaW5kZXhfbi0xIDw9IGluZGV4X24sIGFuZCBzdHlsZV9uLTEgYXBwbGllcyB0bwotICAgICogYWxsIGNoYXJhY3RlcnMgaW4gc291cmNlQ29kZVtpbmRleF9uLTE6aW5kZXhfbl0uCi0gICAgKgotICAgICogVGhlIHN0eWxlUGF0dGVybnMgaXMgYSBsaXN0IHdob3NlIGVsZW1lbnRzIGhhdmUgdGhlIGZvcm0KLSAgICAqIFtzdHlsZSA6IHN0cmluZywgcGF0dGVybiA6IFJlZ0V4cCwgREVQUkVDQVRFRCwgc2hvcnRjdXQgOiBzdHJpbmddLgotICAgICoKLSAgICAqIFN0eWxlIGlzIGEgc3R5bGUgY29uc3RhbnQgbGlrZSBQUl9QTEFJTiwgb3IgY2FuIGJlIGEgc3RyaW5nIG9mIHRoZQotICAgICogZm9ybSAnbGFuZy1GT08nLCB3aGVyZSBGT08gaXMgYSBsYW5ndWFnZSBleHRlbnNpb24gZGVzY3JpYmluZyB0aGUKLSAgICAqIGxhbmd1YWdlIG9mIHRoZSBwb3J0aW9uIG9mIHRoZSB0b2tlbiBpbiAkMSBhZnRlciBwYXR0ZXJuIGV4ZWN1dGVzLgotICAgICogRS5nLiwgaWYgc3R5bGUgaXMgJ2xhbmctbGlzcCcsIGFuZCBncm91cCAxIGNvbnRhaW5zIHRoZSB0ZXh0Ci0gICAgKiAnKGhlbGxvICh3b3JsZCkpJywgdGhlbiB0aGF0IHBvcnRpb24gb2YgdGhlIHRva2VuIHdpbGwgYmUgcGFzc2VkIHRvIHRoZQotICAgICogcmVnaXN0ZXJlZCBsaXNwIGhhbmRsZXIgZm9yIGZvcm1hdHRpbmcuCi0gICAgKiBUaGUgdGV4dCBiZWZvcmUgYW5kIGFmdGVyIGdyb3VwIDEgd2lsbCBiZSByZXN0eWxlZCB1c2luZyB0aGlzIGRlY29yYXRvcgotICAgICogc28gZGVjb3JhdG9ycyBzaG91bGQgdGFrZSBjYXJlIHRoYXQgdGhpcyBkb2Vzbid0IHJlc3VsdCBpbiBpbmZpbml0ZQotICAgICogcmVjdXJzaW9uLiAgRm9yIGV4YW1wbGUsIHRoZSBIVE1MIGxleGVyIHJ1bGUgZm9yIFNDUklQVCBlbGVtZW50cyBsb29rcwotICAgICogc29tZXRoaW5nIGxpa2UgWydsYW5nLWpzJywgLzxbc11jcmlwdD4oLis/KTxcL3NjcmlwdD4vXS4gIFRoaXMgbWF5IG1hdGNoCi0gICAgKiAnPHNjcmlwdD5mb28oKTxcL3NjcmlwdD4nLCB3aGljaCB3b3VsZCBjYXVzZSB0aGUgY3VycmVudCBkZWNvcmF0b3IgdG8KLSAgICAqIGJlIGNhbGxlZCB3aXRoICc8c2NyaXB0Picgd2hpY2ggd291bGQgbm90IG1hdGNoIHRoZSBzYW1lIHJ1bGUgc2luY2UKLSAgICAqIGdyb3VwIDEgbXVzdCBub3QgYmUgZW1wdHksIHNvIGl0IHdvdWxkIGJlIGluc3RlYWQgc3R5bGVkIGFzIFBSX1RBRyBieQotICAgICogdGhlIGdlbmVyaWMgdGFnIHJ1bGUuICBUaGUgaGFuZGxlciByZWdpc3RlcmVkIGZvciB0aGUgJ2pzJyBleHRlbnNpb24gd291bGQKLSAgICAqIHRoZW4gYmUgY2FsbGVkIHdpdGggJ2ZvbygpJywgYW5kIGZpbmFsbHksIHRoZSBjdXJyZW50IGRlY29yYXRvciB3b3VsZAotICAgICogYmUgY2FsbGVkIHdpdGggJzxcL3NjcmlwdD4nIHdoaWNoIHdvdWxkIG5vdCBtYXRjaCB0aGUgb3JpZ2luYWwgcnVsZSBhbmQKLSAgICAqIHNvIHRoZSBnZW5lcmljIHRhZyBydWxlIHdvdWxkIGlkZW50aWZ5IGl0IGFzIGEgdGFnLgotICAgICoKLSAgICAqIFBhdHRlcm4gbXVzdCBvbmx5IG1hdGNoIHByZWZpeGVzLCBhbmQgaWYgaXQgbWF0Y2hlcyBhIHByZWZpeCwgdGhlbiB0aGF0Ci0gICAgKiBtYXRjaCBpcyBjb25zaWRlcmVkIGEgdG9rZW4gd2l0aCB0aGUgc2FtZSBzdHlsZS4KLSAgICAqCi0gICAgKiBDb250ZXh0IGlzIGFwcGxpZWQgdG8gdGhlIGxhc3Qgbm9uLXdoaXRlc3BhY2UsIG5vbi1jb21tZW50IHRva2VuCi0gICAgKiByZWNvZ25pemVkLgotICAgICoKLSAgICAqIFNob3J0Y3V0IGlzIGFuIG9wdGlvbmFsIHN0cmluZyBvZiBjaGFyYWN0ZXJzLCBhbnkgb2Ygd2hpY2gsIGlmIHRoZSBmaXJzdAotICAgICogY2hhcmFjdGVyLCBndXJhbnRlZSB0aGF0IHRoaXMgcGF0dGVybiBhbmQgb25seSB0aGlzIHBhdHRlcm4gbWF0Y2hlcy4KLSAgICAqCi0gICAgKiBAcGFyYW0ge0FycmF5fSBzaG9ydGN1dFN0eWxlUGF0dGVybnMgcGF0dGVybnMgdGhhdCBhbHdheXMgc3RhcnQgd2l0aAotICAgICogICBhIGtub3duIGNoYXJhY3Rlci4gIE11c3QgaGF2ZSBhIHNob3J0Y3V0IHN0cmluZy4KLSAgICAqIEBwYXJhbSB7QXJyYXl9IGZhbGx0aHJvdWdoU3R5bGVQYXR0ZXJucyBwYXR0ZXJucyB0aGF0IHdpbGwgYmUgdHJpZWQgaW4KLSAgICAqICAgb3JkZXIgaWYgdGhlIHNob3J0Y3V0IG9uZXMgZmFpbC4gIE1heSBoYXZlIHNob3J0Y3V0cy4KLSAgICAqCi0gICAgKiBAcmV0dXJuIHtmdW5jdGlvbiAoT2JqZWN0KX0gYQotICAgICogICBmdW5jdGlvbiB0aGF0IHRha2VzIHNvdXJjZSBjb2RlIGFuZCByZXR1cm5zIGEgbGlzdCBvZiBkZWNvcmF0aW9ucy4KLSAgICAqLwotICBmdW5jdGlvbiBjcmVhdGVTaW1wbGVMZXhlcihzaG9ydGN1dFN0eWxlUGF0dGVybnMsIGZhbGx0aHJvdWdoU3R5bGVQYXR0ZXJucykgewotICAgIHZhciBzaG9ydGN1dHMgPSB7fTsKLSAgICB2YXIgdG9rZW5pemVyOwotICAgIChmdW5jdGlvbiAoKSB7Ci0gICAgICB2YXIgYWxsUGF0dGVybnMgPSBzaG9ydGN1dFN0eWxlUGF0dGVybnMuY29uY2F0KGZhbGx0aHJvdWdoU3R5bGVQYXR0ZXJucyk7Ci0gICAgICB2YXIgYWxsUmVnZXhzID0gW107Ci0gICAgICB2YXIgcmVnZXhLZXlzID0ge307Ci0gICAgICBmb3IgKHZhciBpID0gMCwgbiA9IGFsbFBhdHRlcm5zLmxlbmd0aDsgaSA8IG47ICsraSkgewotICAgICAgICB2YXIgcGF0dGVyblBhcnRzID0gYWxsUGF0dGVybnNbaV07Ci0gICAgICAgIHZhciBzaG9ydGN1dENoYXJzID0gcGF0dGVyblBhcnRzWzNdOwotICAgICAgICBpZiAoc2hvcnRjdXRDaGFycykgewotICAgICAgICAgIGZvciAodmFyIGMgPSBzaG9ydGN1dENoYXJzLmxlbmd0aDsgLS1jID49IDA7KSB7Ci0gICAgICAgICAgICBzaG9ydGN1dHNbc2hvcnRjdXRDaGFycy5jaGFyQXQoYyldID0gcGF0dGVyblBhcnRzOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB2YXIgcmVnZXggPSBwYXR0ZXJuUGFydHNbMV07Ci0gICAgICAgIHZhciBrID0gJycgKyByZWdleDsKLSAgICAgICAgaWYgKCFyZWdleEtleXMuaGFzT3duUHJvcGVydHkoaykpIHsKLSAgICAgICAgICBhbGxSZWdleHMucHVzaChyZWdleCk7Ci0gICAgICAgICAgcmVnZXhLZXlzW2tdID0gbnVsbDsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgYWxsUmVnZXhzLnB1c2goL1tcMC1cdWZmZmZdLyk7Ci0gICAgICB0b2tlbml6ZXIgPSBjb21iaW5lUHJlZml4UGF0dGVybnMoYWxsUmVnZXhzKTsKLSAgICB9KSgpOwotCi0gICAgdmFyIG5QYXR0ZXJucyA9IGZhbGx0aHJvdWdoU3R5bGVQYXR0ZXJucy5sZW5ndGg7Ci0gICAgdmFyIG5vdFdzID0gL1xTLzsKLQotICAgIC8qKgotICAgICAqIExleGVzIGpvYi5zb3VyY2UgYW5kIHByb2R1Y2VzIGFuIG91dHB1dCBhcnJheSBqb2IuZGVjb3JhdGlvbnMgb2Ygc3R5bGUKLSAgICAgKiBjbGFzc2VzIHByZWNlZGVkIGJ5IHRoZSBwb3NpdGlvbiBhdCB3aGljaCB0aGV5IHN0YXJ0IGluIGpvYi5zb3VyY2UgaW4KLSAgICAgKiBvcmRlci4KLSAgICAgKgotICAgICAqIEBwYXJhbSB7T2JqZWN0fSBqb2IgYW4gb2JqZWN0IGxpa2Uge0Bjb2RlCi0gICAgICogICAgc291cmNlOiB7c3RyaW5nfSBzb3VyY2VUZXh0IHBsYWluIHRleHQsCi0gICAgICogICAgYmFzZVBvczoge2ludH0gcG9zaXRpb24gb2Ygam9iLnNvdXJjZSBpbiB0aGUgbGFyZ2VyIGNodW5rIG9mCi0gICAgICogICAgICAgIHNvdXJjZUNvZGUuCi0gICAgICogfQotICAgICAqLwotICAgIHZhciBkZWNvcmF0ZSA9IGZ1bmN0aW9uIChqb2IpIHsKLSAgICAgIHZhciBzb3VyY2VDb2RlID0gam9iLnNvdXJjZSwgYmFzZVBvcyA9IGpvYi5iYXNlUG9zOwotICAgICAgLyoqIEV2ZW4gZW50cmllcyBhcmUgcG9zaXRpb25zIGluIHNvdXJjZSBpbiBhc2NlbmRpbmcgb3JkZXIuICBPZGQgZW50aWVzCi0gICAgICAgICogYXJlIHN0eWxlIG1hcmtlcnMgKGUuZy4sIFBSX0NPTU1FTlQpIHRoYXQgcnVuIGZyb20gdGhhdCBwb3NpdGlvbiB1bnRpbAotICAgICAgICAqIHRoZSBlbmQuCi0gICAgICAgICogQHR5cGUge0FycmF5LjxudW1iZXJ8c3RyaW5nPn0KLSAgICAgICAgKi8KLSAgICAgIHZhciBkZWNvcmF0aW9ucyA9IFtiYXNlUG9zLCBQUl9QTEFJTl07Ci0gICAgICB2YXIgcG9zID0gMDsgIC8vIGluZGV4IGludG8gc291cmNlQ29kZQotICAgICAgdmFyIHRva2VucyA9IHNvdXJjZUNvZGUubWF0Y2godG9rZW5pemVyKSB8fCBbXTsKLSAgICAgIHZhciBzdHlsZUNhY2hlID0ge307Ci0KLSAgICAgIGZvciAodmFyIHRpID0gMCwgblRva2VucyA9IHRva2Vucy5sZW5ndGg7IHRpIDwgblRva2VuczsgKyt0aSkgewotICAgICAgICB2YXIgdG9rZW4gPSB0b2tlbnNbdGldOwotICAgICAgICB2YXIgc3R5bGUgPSBzdHlsZUNhY2hlW3Rva2VuXTsKLSAgICAgICAgdmFyIG1hdGNoID0gdm9pZCAwOwotCi0gICAgICAgIHZhciBpc0VtYmVkZGVkOwotICAgICAgICBpZiAodHlwZW9mIHN0eWxlID09PSAnc3RyaW5nJykgewotICAgICAgICAgIGlzRW1iZWRkZWQgPSBmYWxzZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICB2YXIgcGF0dGVyblBhcnRzID0gc2hvcnRjdXRzW3Rva2VuLmNoYXJBdCgwKV07Ci0gICAgICAgICAgaWYgKHBhdHRlcm5QYXJ0cykgewotICAgICAgICAgICAgbWF0Y2ggPSB0b2tlbi5tYXRjaChwYXR0ZXJuUGFydHNbMV0pOwotICAgICAgICAgICAgc3R5bGUgPSBwYXR0ZXJuUGFydHNbMF07Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgblBhdHRlcm5zOyArK2kpIHsKLSAgICAgICAgICAgICAgcGF0dGVyblBhcnRzID0gZmFsbHRocm91Z2hTdHlsZVBhdHRlcm5zW2ldOwotICAgICAgICAgICAgICBtYXRjaCA9IHRva2VuLm1hdGNoKHBhdHRlcm5QYXJ0c1sxXSk7Ci0gICAgICAgICAgICAgIGlmIChtYXRjaCkgewotICAgICAgICAgICAgICAgIHN0eWxlID0gcGF0dGVyblBhcnRzWzBdOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghbWF0Y2gpIHsgIC8vIG1ha2Ugc3VyZSB0aGF0IHdlIG1ha2UgcHJvZ3Jlc3MKLSAgICAgICAgICAgICAgc3R5bGUgPSBQUl9QTEFJTjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBpc0VtYmVkZGVkID0gc3R5bGUubGVuZ3RoID49IDUgJiYgJ2xhbmctJyA9PT0gc3R5bGUuc3Vic3RyaW5nKDAsIDUpOwotICAgICAgICAgIGlmIChpc0VtYmVkZGVkICYmICEobWF0Y2ggJiYgdHlwZW9mIG1hdGNoWzFdID09PSAnc3RyaW5nJykpIHsKLSAgICAgICAgICAgIGlzRW1iZWRkZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIHN0eWxlID0gUFJfU09VUkNFOwotICAgICAgICAgIH0KLQotICAgICAgICAgIGlmICghaXNFbWJlZGRlZCkgeyBzdHlsZUNhY2hlW3Rva2VuXSA9IHN0eWxlOyB9Ci0gICAgICAgIH0KLQotICAgICAgICB2YXIgdG9rZW5TdGFydCA9IHBvczsKLSAgICAgICAgcG9zICs9IHRva2VuLmxlbmd0aDsKLQotICAgICAgICBpZiAoIWlzRW1iZWRkZWQpIHsKLSAgICAgICAgICBkZWNvcmF0aW9ucy5wdXNoKGJhc2VQb3MgKyB0b2tlblN0YXJ0LCBzdHlsZSk7Ci0gICAgICAgIH0gZWxzZSB7ICAvLyBUcmVhdCBncm91cCAxIGFzIGFuIGVtYmVkZGVkIGJsb2NrIG9mIHNvdXJjZSBjb2RlLgotICAgICAgICAgIHZhciBlbWJlZGRlZFNvdXJjZSA9IG1hdGNoWzFdOwotICAgICAgICAgIHZhciBlbWJlZGRlZFNvdXJjZVN0YXJ0ID0gdG9rZW4uaW5kZXhPZihlbWJlZGRlZFNvdXJjZSk7Ci0gICAgICAgICAgdmFyIGVtYmVkZGVkU291cmNlRW5kID0gZW1iZWRkZWRTb3VyY2VTdGFydCArIGVtYmVkZGVkU291cmNlLmxlbmd0aDsKLSAgICAgICAgICBpZiAobWF0Y2hbMl0pIHsKLSAgICAgICAgICAgIC8vIElmIGVtYmVkZGVkU291cmNlIGNhbiBiZSBibGFuaywgdGhlbiBpdCB3b3VsZCBtYXRjaCBhdCB0aGUKLSAgICAgICAgICAgIC8vIGJlZ2lubmluZyB3aGljaCB3b3VsZCBjYXVzZSB1cyB0byBpbmZpbml0ZWx5IHJlY3Vyc2Ugb24gdGhlCi0gICAgICAgICAgICAvLyBlbnRpcmUgdG9rZW4sIHNvIHdlIGNhdGNoIHRoZSByaWdodCBjb250ZXh0IGluIG1hdGNoWzJdLgotICAgICAgICAgICAgZW1iZWRkZWRTb3VyY2VFbmQgPSB0b2tlbi5sZW5ndGggLSBtYXRjaFsyXS5sZW5ndGg7Ci0gICAgICAgICAgICBlbWJlZGRlZFNvdXJjZVN0YXJ0ID0gZW1iZWRkZWRTb3VyY2VFbmQgLSBlbWJlZGRlZFNvdXJjZS5sZW5ndGg7Ci0gICAgICAgICAgfQotICAgICAgICAgIHZhciBsYW5nID0gc3R5bGUuc3Vic3RyaW5nKDUpOwotICAgICAgICAgIC8vIERlY29yYXRlIHRoZSBsZWZ0IG9mIHRoZSBlbWJlZGRlZCBzb3VyY2UKLSAgICAgICAgICBhcHBlbmREZWNvcmF0aW9ucygKLSAgICAgICAgICAgICAgYmFzZVBvcyArIHRva2VuU3RhcnQsCi0gICAgICAgICAgICAgIHRva2VuLnN1YnN0cmluZygwLCBlbWJlZGRlZFNvdXJjZVN0YXJ0KSwKLSAgICAgICAgICAgICAgZGVjb3JhdGUsIGRlY29yYXRpb25zKTsKLSAgICAgICAgICAvLyBEZWNvcmF0ZSB0aGUgZW1iZWRkZWQgc291cmNlCi0gICAgICAgICAgYXBwZW5kRGVjb3JhdGlvbnMoCi0gICAgICAgICAgICAgIGJhc2VQb3MgKyB0b2tlblN0YXJ0ICsgZW1iZWRkZWRTb3VyY2VTdGFydCwKLSAgICAgICAgICAgICAgZW1iZWRkZWRTb3VyY2UsCi0gICAgICAgICAgICAgIGxhbmdIYW5kbGVyRm9yRXh0ZW5zaW9uKGxhbmcsIGVtYmVkZGVkU291cmNlKSwKLSAgICAgICAgICAgICAgZGVjb3JhdGlvbnMpOwotICAgICAgICAgIC8vIERlY29yYXRlIHRoZSByaWdodCBvZiB0aGUgZW1iZWRkZWQgc2VjdGlvbgotICAgICAgICAgIGFwcGVuZERlY29yYXRpb25zKAotICAgICAgICAgICAgICBiYXNlUG9zICsgdG9rZW5TdGFydCArIGVtYmVkZGVkU291cmNlRW5kLAotICAgICAgICAgICAgICB0b2tlbi5zdWJzdHJpbmcoZW1iZWRkZWRTb3VyY2VFbmQpLAotICAgICAgICAgICAgICBkZWNvcmF0ZSwgZGVjb3JhdGlvbnMpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBqb2IuZGVjb3JhdGlvbnMgPSBkZWNvcmF0aW9uczsKLSAgICB9OwotICAgIHJldHVybiBkZWNvcmF0ZTsKLSAgfQotCi0gIC8qKiByZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCBwcm9kdWNlcyBhIGxpc3Qgb2YgZGVjb3JhdGlvbnMgZnJvbSBzb3VyY2UgdGV4dC4KLSAgICAqCi0gICAgKiBUaGlzIGNvZGUgdHJlYXRzICIsICcsIGFuZCBgIGFzIHN0cmluZyBkZWxpbWl0ZXJzLCBhbmQgXCBhcyBhIHN0cmluZwotICAgICogZXNjYXBlLiAgSXQgZG9lcyBub3QgcmVjb2duaXplIHBlcmwncyBxcSgpIHN0eWxlIHN0cmluZ3MuCi0gICAgKiBJdCBoYXMgbm8gc3BlY2lhbCBoYW5kbGluZyBmb3IgZG91YmxlIGRlbGltaXRlciBlc2NhcGVzIGFzIGluIGJhc2ljLCBvcgotICAgICogdGhlIHRyaXBsZWQgZGVsaW1pdGVycyB1c2VkIGluIHB5dGhvbiwgYnV0IHNob3VsZCB3b3JrIG9uIHRob3NlIHJlZ2FyZGxlc3MKLSAgICAqIGFsdGhvdWdoIGluIHRob3NlIGNhc2VzIGEgc2luZ2xlIHN0cmluZyBsaXRlcmFsIG1heSBiZSBicm9rZW4gdXAgaW50bwotICAgICogbXVsdGlwbGUgYWRqYWNlbnQgc3RyaW5nIGxpdGVyYWxzLgotICAgICoKLSAgICAqIEl0IHJlY29nbml6ZXMgQywgQysrLCBhbmQgc2hlbGwgc3R5bGUgY29tbWVudHMuCi0gICAgKgotICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgYSBzZXQgb2Ygb3B0aW9uYWwgcGFyYW1ldGVycy4KLSAgICAqIEByZXR1cm4ge2Z1bmN0aW9uIChPYmplY3QpfSBhIGZ1bmN0aW9uIHRoYXQgZXhhbWluZXMgdGhlIHNvdXJjZSBjb2RlCi0gICAgKiAgICAgaW4gdGhlIGlucHV0IGpvYiBhbmQgYnVpbGRzIHRoZSBkZWNvcmF0aW9uIGxpc3QuCi0gICAgKi8KLSAgZnVuY3Rpb24gc291cmNlRGVjb3JhdG9yKG9wdGlvbnMpIHsKLSAgICB2YXIgc2hvcnRjdXRTdHlsZVBhdHRlcm5zID0gW10sIGZhbGx0aHJvdWdoU3R5bGVQYXR0ZXJucyA9IFtdOwotICAgIGlmIChvcHRpb25zWyd0cmlwbGVRdW90ZWRTdHJpbmdzJ10pIHsKLSAgICAgIC8vICcnJ211bHRpLWxpbmUtc3RyaW5nJycnLCAnc2luZ2xlLWxpbmUtc3RyaW5nJywgYW5kIGRvdWJsZS1xdW90ZWQKLSAgICAgIHNob3J0Y3V0U3R5bGVQYXR0ZXJucy5wdXNoKAotICAgICAgICAgIFtQUl9TVFJJTkcsICAvXig/OlwnXCdcJyg/OlteXCdcXF18XFxbXHNcU118XCd7MSwyfSg/PVteXCddKSkqKD86XCdcJ1wnfCQpfFwiXCJcIig/OlteXCJcXF18XFxbXHNcU118XCJ7MSwyfSg/PVteXCJdKSkqKD86XCJcIlwifCQpfFwnKD86W15cXFwnXXxcXFtcc1xTXSkqKD86XCd8JCl8XCIoPzpbXlxcXCJdfFxcW1xzXFNdKSooPzpcInwkKSkvLAotICAgICAgICAgICBudWxsLCAnXCciJ10pOwotICAgIH0gZWxzZSBpZiAob3B0aW9uc1snbXVsdGlMaW5lU3RyaW5ncyddKSB7Ci0gICAgICAvLyAnbXVsdGktbGluZS1zdHJpbmcnLCAibXVsdGktbGluZS1zdHJpbmciCi0gICAgICBzaG9ydGN1dFN0eWxlUGF0dGVybnMucHVzaCgKLSAgICAgICAgICBbUFJfU1RSSU5HLCAgL14oPzpcJyg/OlteXFxcJ118XFxbXHNcU10pKig/OlwnfCQpfFwiKD86W15cXFwiXXxcXFtcc1xTXSkqKD86XCJ8JCl8XGAoPzpbXlxcXGBdfFxcW1xzXFNdKSooPzpcYHwkKSkvLAotICAgICAgICAgICBudWxsLCAnXCciYCddKTsKLSAgICB9IGVsc2UgewotICAgICAgLy8gJ3NpbmdsZS1saW5lLXN0cmluZycsICJzaW5nbGUtbGluZS1zdHJpbmciCi0gICAgICBzaG9ydGN1dFN0eWxlUGF0dGVybnMucHVzaCgKLSAgICAgICAgICBbUFJfU1RSSU5HLAotICAgICAgICAgICAvXig/OlwnKD86W15cXFwnXHJcbl18XFwuKSooPzpcJ3wkKXxcIig/OlteXFxcIlxyXG5dfFxcLikqKD86XCJ8JCkpLywKLSAgICAgICAgICAgbnVsbCwgJyJcJyddKTsKLSAgICB9Ci0gICAgaWYgKG9wdGlvbnNbJ3ZlcmJhdGltU3RyaW5ncyddKSB7Ci0gICAgICAvLyB2ZXJiYXRpbS1zdHJpbmctbGl0ZXJhbCBwcm9kdWN0aW9uIGZyb20gdGhlIEMjIGdyYW1tYXIuICBTZWUgaXNzdWUgOTMuCi0gICAgICBmYWxsdGhyb3VnaFN0eWxlUGF0dGVybnMucHVzaCgKLSAgICAgICAgICBbUFJfU1RSSU5HLCAvXkBcIig/OlteXCJdfFwiXCIpKig/OlwifCQpLywgbnVsbF0pOwotICAgIH0KLSAgICB2YXIgaGMgPSBvcHRpb25zWydoYXNoQ29tbWVudHMnXTsKLSAgICBpZiAoaGMpIHsKLSAgICAgIGlmIChvcHRpb25zWydjU3R5bGVDb21tZW50cyddKSB7Ci0gICAgICAgIGlmIChoYyA+IDEpIHsgIC8vIG11bHRpbGluZSBoYXNoIGNvbW1lbnRzCi0gICAgICAgICAgc2hvcnRjdXRTdHlsZVBhdHRlcm5zLnB1c2goCi0gICAgICAgICAgICAgIFtQUl9DT01NRU5ULCAvXiMoPzojIyg/OlteI118Iyg/ISMjKSkqKD86IyMjfCQpfC4qKS8sIG51bGwsICcjJ10pOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIC8vIFN0b3AgQyBwcmVwcm9jZXNzb3IgZGVjbGFyYXRpb25zIGF0IGFuIHVuY2xvc2VkIG9wZW4gY29tbWVudAotICAgICAgICAgIHNob3J0Y3V0U3R5bGVQYXR0ZXJucy5wdXNoKAotICAgICAgICAgICAgICBbUFJfQ09NTUVOVCwgL14jKD86KD86ZGVmaW5lfGVsaWZ8ZWxzZXxlbmRpZnxlcnJvcnxpZmRlZnxpbmNsdWRlfGlmbmRlZnxsaW5lfHByYWdtYXx1bmRlZnx3YXJuaW5nKVxifFteXHJcbl0qKS8sCi0gICAgICAgICAgICAgICBudWxsLCAnIyddKTsKLSAgICAgICAgfQotICAgICAgICBmYWxsdGhyb3VnaFN0eWxlUGF0dGVybnMucHVzaCgKLSAgICAgICAgICAgIFtQUl9TVFJJTkcsCi0gICAgICAgICAgICAgL148KD86KD86KD86XC5cLlwvKSp8XC8/KSg/Oltcdy1dKyg/OlwvW1x3LV0rKSspP1tcdy1dK1wuaHxbYS16XVx3Kik+LywKLSAgICAgICAgICAgICBudWxsXSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBzaG9ydGN1dFN0eWxlUGF0dGVybnMucHVzaChbUFJfQ09NTUVOVCwgL14jW15cclxuXSovLCBudWxsLCAnIyddKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKG9wdGlvbnNbJ2NTdHlsZUNvbW1lbnRzJ10pIHsKLSAgICAgIGZhbGx0aHJvdWdoU3R5bGVQYXR0ZXJucy5wdXNoKFtQUl9DT01NRU5ULCAvXlwvXC9bXlxyXG5dKi8sIG51bGxdKTsKLSAgICAgIGZhbGx0aHJvdWdoU3R5bGVQYXR0ZXJucy5wdXNoKAotICAgICAgICAgIFtQUl9DT01NRU5ULCAvXlwvXCpbXHNcU10qPyg/OlwqXC98JCkvLCBudWxsXSk7Ci0gICAgfQotICAgIGlmIChvcHRpb25zWydyZWdleExpdGVyYWxzJ10pIHsKLSAgICAgIHZhciBSRUdFWF9MSVRFUkFMID0gKAotICAgICAgICAgIC8vIEEgcmVndWxhciBleHByZXNzaW9uIGxpdGVyYWwgc3RhcnRzIHdpdGggYSBzbGFzaCB0aGF0IGlzCi0gICAgICAgICAgLy8gbm90IGZvbGxvd2VkIGJ5ICogb3IgLyBzbyB0aGF0IGl0IGlzIG5vdCBjb25mdXNlZCB3aXRoCi0gICAgICAgICAgLy8gY29tbWVudHMuCi0gICAgICAgICAgJy8oPz1bXi8qXSknCi0gICAgICAgICAgLy8gYW5kIHRoZW4gY29udGFpbnMgYW55IG51bWJlciBvZiByYXcgY2hhcmFjdGVycywKLSAgICAgICAgICArICcoPzpbXi9cXHg1QlxceDVDXScKLSAgICAgICAgICAvLyBlc2NhcGUgc2VxdWVuY2VzIChceDVDKSwKLSAgICAgICAgICArICAgICd8XFx4NUNbXFxzXFxTXScKLSAgICAgICAgICAvLyBvciBub24tbmVzdGluZyBjaGFyYWN0ZXIgc2V0cyAoXHg1Qlx4NUQpOwotICAgICAgICAgICsgICAgJ3xcXHg1Qig/OlteXFx4NUNcXHg1RF18XFx4NUNbXFxzXFxTXSkqKD86XFx4NUR8JCkpKycKLSAgICAgICAgICAvLyBmaW5hbGx5IGNsb3NlZCBieSBhIC8uCi0gICAgICAgICAgKyAnLycpOwotICAgICAgZmFsbHRocm91Z2hTdHlsZVBhdHRlcm5zLnB1c2goCi0gICAgICAgICAgWydsYW5nLXJlZ2V4JywKLSAgICAgICAgICAgbmV3IFJlZ0V4cCgnXicgKyBSRUdFWFBfUFJFQ0VERVJfUEFUVEVSTiArICcoJyArIFJFR0VYX0xJVEVSQUwgKyAnKScpCi0gICAgICAgICAgIF0pOwotICAgIH0KLQotICAgIHZhciBrZXl3b3JkcyA9IG9wdGlvbnNbJ2tleXdvcmRzJ10ucmVwbGFjZSgvXlxzK3xccyskL2csICcnKTsKLSAgICBpZiAoa2V5d29yZHMubGVuZ3RoKSB7Ci0gICAgICBmYWxsdGhyb3VnaFN0eWxlUGF0dGVybnMucHVzaCgKLSAgICAgICAgICBbUFJfS0VZV09SRCwKLSAgICAgICAgICAgbmV3IFJlZ0V4cCgnXig/OicgKyBrZXl3b3Jkcy5yZXBsYWNlKC9ccysvZywgJ3wnKSArICcpXFxiJyksIG51bGxdKTsKLSAgICB9Ci0KLSAgICBzaG9ydGN1dFN0eWxlUGF0dGVybnMucHVzaChbUFJfUExBSU4sICAgICAgIC9eXHMrLywgbnVsbCwgJyBcclxuXHRceEEwJ10pOwotICAgIGZhbGx0aHJvdWdoU3R5bGVQYXR0ZXJucy5wdXNoKAotICAgICAgICAvLyBUT0RPKG1pa2VzYW11ZWwpOiByZWNvZ25pemUgbm9uLWxhdGluIGxldHRlcnMgYW5kIG51bWVyYWxzIGluIGlkZW50cwotICAgICAgICBbUFJfTElURVJBTCwgICAgIC9eQFthLXpfJF1bYS16XyRAMC05XSovaSwgbnVsbF0sCi0gICAgICAgIFtQUl9UWVBFLCAgICAgICAgL15AP1tBLVpdK1thLXpdW0EtWmEtel8kQDAtOV0qLywgbnVsbF0sCi0gICAgICAgIFtQUl9QTEFJTiwgICAgICAgL15bYS16XyRdW2Etel8kQDAtOV0qL2ksIG51bGxdLAotICAgICAgICBbUFJfTElURVJBTCwKLSAgICAgICAgIG5ldyBSZWdFeHAoCi0gICAgICAgICAgICAgJ14oPzonCi0gICAgICAgICAgICAgLy8gQSBoZXggbnVtYmVyCi0gICAgICAgICAgICAgKyAnMHhbYS1mMC05XSsnCi0gICAgICAgICAgICAgLy8gb3IgYW4gb2N0YWwgb3IgZGVjaW1hbCBudW1iZXIsCi0gICAgICAgICAgICAgKyAnfCg/OlxcZCg/Ol9cXGQrKSpcXGQqKD86XFwuXFxkKik/fFxcLlxcZFxcKyknCi0gICAgICAgICAgICAgLy8gcG9zc2libHkgaW4gc2NpZW50aWZpYyBub3RhdGlvbgotICAgICAgICAgICAgICsgJyg/OmVbK1xcLV0/XFxkKyk/JwotICAgICAgICAgICAgICsgJyknCi0gICAgICAgICAgICAgLy8gd2l0aCBhbiBvcHRpb25hbCBtb2RpZmllciBsaWtlIFVMIGZvciB1bnNpZ25lZCBsb25nCi0gICAgICAgICAgICAgKyAnW2Etel0qJywgJ2knKSwKLSAgICAgICAgIG51bGwsICcwMTIzNDU2Nzg5J10sCi0gICAgICAgIFtQUl9QVU5DVFVBVElPTiwgL14uW15cc1x3XC4kQFwnXCJcYFwvXCNdKi8sIG51bGxdKTsKLQotICAgIHJldHVybiBjcmVhdGVTaW1wbGVMZXhlcihzaG9ydGN1dFN0eWxlUGF0dGVybnMsIGZhbGx0aHJvdWdoU3R5bGVQYXR0ZXJucyk7Ci0gIH0KLQotICB2YXIgZGVjb3JhdGVTb3VyY2UgPSBzb3VyY2VEZWNvcmF0b3IoewotICAgICAgICAna2V5d29yZHMnOiBBTExfS0VZV09SRFMsCi0gICAgICAgICdoYXNoQ29tbWVudHMnOiB0cnVlLAotICAgICAgICAnY1N0eWxlQ29tbWVudHMnOiB0cnVlLAotICAgICAgICAnbXVsdGlMaW5lU3RyaW5ncyc6IHRydWUsCi0gICAgICAgICdyZWdleExpdGVyYWxzJzogdHJ1ZQotICAgICAgfSk7Ci0KLSAgLyoqIEJyZWFrcyB7QGNvZGUgam9iLnNvdXJjZX0gYXJvdW5kIHN0eWxlIGJvdW5kYXJpZXMgaW4KLSAgICAqIHtAY29kZSBqb2IuZGVjb3JhdGlvbnN9IHdoaWxlIHJlLWludGVybGVhdmluZyB7QGNvZGUgam9iLmV4dHJhY3RlZFRhZ3N9LAotICAgICogYW5kIGxlYXZlcyB0aGUgcmVzdWx0IGluIHtAY29kZSBqb2IucHJldHR5UHJpbnRlZEh0bWx9LgotICAgICogQHBhcmFtIHtPYmplY3R9IGpvYiBsaWtlIHsKLSAgICAqICAgIHNvdXJjZToge3N0cmluZ30gc291cmNlIGFzIHBsYWluIHRleHQsCi0gICAgKiAgICBleHRyYWN0ZWRUYWdzOiB7QXJyYXkuPG51bWJlcnxzdHJpbmc+fSBleHRyYWN0ZWRUYWdzIGNodW5rcyBvZiByYXcKLSAgICAqICAgICAgICAgICAgICAgICAgIGh0bWwgcHJlY2VkZWQgYnkgdGhlaXIgcG9zaXRpb24gaW4ge0Bjb2RlIGpvYi5zb3VyY2V9Ci0gICAgKiAgICAgICAgICAgICAgICAgICBpbiBvcmRlcgotICAgICogICAgZGVjb3JhdGlvbnM6IHtBcnJheS48bnVtYmVyfHN0cmluZ30gYW4gYXJyYXkgb2Ygc3R5bGUgY2xhc3NlcyBwcmVjZWRlZAotICAgICogICAgICAgICAgICAgICAgIGJ5IHRoZSBwb3NpdGlvbiBhdCB3aGljaCB0aGV5IHN0YXJ0IGluIGpvYi5zb3VyY2UgaW4gb3JkZXIKLSAgICAqIH0KLSAgICAqIEBwcml2YXRlCi0gICAgKi8KLSAgZnVuY3Rpb24gcmVjb21iaW5lVGFnc0FuZERlY29yYXRpb25zKGpvYikgewotICAgIHZhciBzb3VyY2VUZXh0ID0gam9iLnNvdXJjZTsKLSAgICB2YXIgZXh0cmFjdGVkVGFncyA9IGpvYi5leHRyYWN0ZWRUYWdzOwotICAgIHZhciBkZWNvcmF0aW9ucyA9IGpvYi5kZWNvcmF0aW9uczsKLSAgICB2YXIgbnVtYmVyTGluZXMgPSBqb2IubnVtYmVyTGluZXM7Ci0gICAgdmFyIHNvdXJjZU5vZGUgPSBqb2Iuc291cmNlTm9kZTsKLQotICAgIHZhciBodG1sID0gW107Ci0gICAgLy8gaW5kZXggcGFzdCB0aGUgbGFzdCBjaGFyIGluIHNvdXJjZVRleHQgd3JpdHRlbiB0byBodG1sCi0gICAgdmFyIG91dHB1dElkeCA9IDA7Ci0KLSAgICB2YXIgb3BlbkRlY29yYXRpb24gPSBudWxsOwotICAgIHZhciBjdXJyZW50RGVjb3JhdGlvbiA9IG51bGw7Ci0gICAgdmFyIHRhZ1BvcyA9IDA7ICAvLyBpbmRleCBpbnRvIGV4dHJhY3RlZFRhZ3MKLSAgICB2YXIgZGVjUG9zID0gMDsgIC8vIGluZGV4IGludG8gZGVjb3JhdGlvbnMKLSAgICB2YXIgdGFiRXhwYW5kZXIgPSBtYWtlVGFiRXhwYW5kZXIod2luZG93WydQUl9UQUJfV0lEVEgnXSk7Ci0KLSAgICB2YXIgYWRqYWNlbnRTcGFjZVJlID0gLyhbXHJcbiBdKSAvZzsKLSAgICB2YXIgc3RhcnRPclNwYWNlUmUgPSAvKF58ICkgL2dtOwotICAgIHZhciBuZXdsaW5lUmUgPSAvXHJcbj98XG4vZzsKLSAgICB2YXIgdHJhaWxpbmdTcGFjZVJlID0gL1sgXHJcbl0kLzsKLSAgICB2YXIgbGFzdFdhc1NwYWNlID0gdHJ1ZTsgIC8vIHRoZSBsYXN0IHRleHQgY2h1bmsgZW1pdHRlZCBlbmRlZCB3aXRoIGEgc3BhY2UuCi0KLSAgICAvLyBTZWUgYnVnIDcxIGFuZCBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzEzNjQ0My93aHktZG9lc250LWllNy0KLSAgICB2YXIgaXNJRTY3OCA9IHdpbmRvd1snX3ByX2lzSUU2J10oKTsKLSAgICB2YXIgbGluZUJyZWFrSHRtbCA9ICgKLSAgICAgICAgaXNJRTY3OAotICAgICAgICA/IChzb3VyY2VOb2RlICYmIHNvdXJjZU5vZGUudGFnTmFtZSA9PT0gJ1BSRScKLSAgICAgICAgICAgLy8gVXNlIGxpbmUgZmVlZHMgaW5zdGVhZCBvZiA8YnI+cyBzbyB0aGF0IGNvcHlpbmcgYW5kIHBhc3Rpbmcgd29ya3MKLSAgICAgICAgICAgLy8gb24gSUUuCi0gICAgICAgICAgIC8vIFNlZSBJc3N1ZSAxMDQgZm9yIHRoZSBkZXJpdmF0aW9uIG9mIHRoaXMgbWVzcy4KLSAgICAgICAgICAgPyAoaXNJRTY3OCA9PT0gNiA/ICcmIzE2MDtcclxuJyA6Ci0gICAgICAgICAgICAgIGlzSUU2NzggPT09IDcgPyAnJiMxNjA7PGJyIC8+XHInIDoKLSAgICAgICAgICAgICAgaXNJRTY3OCA9PT0gOCA/ICcmIzE2MDs8YnIgLz4nIDogJyYjMTYwO1xyJykKLSAgICAgICAgICAgLy8gSUUgY29sbGFwc2VzIG11bHRpcGxlIGFkamFjZW50IDxicj5zIGludG8gMSBsaW5lIGJyZWFrLgotICAgICAgICAgICAvLyBQcmVmaXggZXZlcnkgbmV3bGluZSB3aXRoICcmIzE2MDsnIHRvIHByZXZlbnQgc3VjaCBiZWhhdmlvci4KLSAgICAgICAgICAgLy8gJm5ic3A7IGlzIHRoZSBzYW1lIGFzICYjMTYwOyBidXQgd29ya3MgaW4gWE1MIGFzIHdlbGwgYXMgSFRNTC4KLSAgICAgICAgICAgOiAnJiMxNjA7PGJyIC8+JykKLSAgICAgICAgOiAnPGJyIC8+Jyk7Ci0KLSAgICB2YXIgbGluZUJyZWFrZXI7Ci0gICAgaWYgKG51bWJlckxpbmVzKSB7Ci0gICAgICB2YXIgbGluZUJyZWFrcyA9IFtdOwotICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCAxMDsgKytpKSB7Ci0gICAgICAgIGxpbmVCcmVha3NbaV0gPSBsaW5lQnJlYWtIdG1sICsgJzwvbGk+PGxpIGNsYXNzPSJMJyArIGkgKyAnIj4nOwotICAgICAgfQotICAgICAgdmFyIGxpbmVOdW0gPSB0eXBlb2YgbnVtYmVyTGluZXMgPT09ICdudW1iZXInCi0gICAgICAgICAgPyBudW1iZXJMaW5lcyAtIDEgLyogbnVtYmVyIGxpbmVzIGFyZSAxIGluZGV4ZWQgKi8gOiAwOwotICAgICAgaHRtbC5wdXNoKCc8b2wgY2xhc3M9ImxpbmVudW1zIj48bGkgY2xhc3M9IkwnLCAobGluZU51bSkgJSAxMCwgJyInKTsKLSAgICAgIGlmIChsaW5lTnVtKSB7Ci0gICAgICAgIGh0bWwucHVzaCgnIHZhbHVlPSInLCBsaW5lTnVtICsgMSwgJyInKTsKLSAgICAgIH0KLSAgICAgIGh0bWwucHVzaCgnPicpOwotICAgICAgbGluZUJyZWFrZXIgPSBmdW5jdGlvbiAoKSB7Ci0gICAgICAgIHZhciBsYiA9IGxpbmVCcmVha3NbKytsaW5lTnVtICUgMTBdOwotICAgICAgICAvLyBJZiBhIGRlY29yYXRpb24gaXMgb3Blbiwgd2UgbmVlZCB0byBjbG9zZSBpdCBiZWZvcmUgY2xvc2luZyBhIGxpc3QtaXRlbQotICAgICAgICAvLyBhbmQgcmVvcGVuIGl0IG9uIHRoZSBvdGhlciBzaWRlIG9mIHRoZSBsaXN0IGl0ZW0uCi0gICAgICAgIHJldHVybiBvcGVuRGVjb3JhdGlvbgotICAgICAgICAgICAgPyAoJzwvc3Bhbj4nICsgbGIgKyAnPHNwYW4gY2xhc3M9IicgKyBvcGVuRGVjb3JhdGlvbiArICciPicpIDogbGI7Ci0gICAgICB9OwotICAgIH0gZWxzZSB7Ci0gICAgICBsaW5lQnJlYWtlciA9IGxpbmVCcmVha0h0bWw7Ci0gICAgfQotCi0gICAgLy8gQSBoZWxwZXIgZnVuY3Rpb24gdGhhdCBpcyByZXNwb25zaWJsZSBmb3Igb3BlbmluZyBzZWN0aW9ucyBvZiBkZWNvcmF0aW9uCi0gICAgLy8gYW5kIG91dHB1dGluZyBwcm9wZXJseSBlc2NhcGVkIGNodW5rcyBvZiBzb3VyY2UKLSAgICBmdW5jdGlvbiBlbWl0VGV4dFVwVG8oc291cmNlSWR4KSB7Ci0gICAgICBpZiAoc291cmNlSWR4ID4gb3V0cHV0SWR4KSB7Ci0gICAgICAgIGlmIChvcGVuRGVjb3JhdGlvbiAmJiBvcGVuRGVjb3JhdGlvbiAhPT0gY3VycmVudERlY29yYXRpb24pIHsKLSAgICAgICAgICAvLyBDbG9zZSB0aGUgY3VycmVudCBkZWNvcmF0aW9uCi0gICAgICAgICAgaHRtbC5wdXNoKCc8L3NwYW4+Jyk7Ci0gICAgICAgICAgb3BlbkRlY29yYXRpb24gPSBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGlmICghb3BlbkRlY29yYXRpb24gJiYgY3VycmVudERlY29yYXRpb24pIHsKLSAgICAgICAgICBvcGVuRGVjb3JhdGlvbiA9IGN1cnJlbnREZWNvcmF0aW9uOwotICAgICAgICAgIGh0bWwucHVzaCgnPHNwYW4gY2xhc3M9IicsIG9wZW5EZWNvcmF0aW9uLCAnIj4nKTsKLSAgICAgICAgfQotICAgICAgICAvLyBUaGlzIGludGVyYWN0cyBiYWRseSB3aXRoIHNvbWUgd2lraXMgd2hpY2ggaW50cm9kdWNlcyBwYXJhZ3JhcGggdGFncwotICAgICAgICAvLyBpbnRvIHByZSBibG9ja3MgZm9yIHNvbWUgc3RyYW5nZSByZWFzb24uCi0gICAgICAgIC8vIEl0J3MgbmVjZXNzYXJ5IGZvciBJRSB0aG91Z2ggd2hpY2ggc2VlbXMgdG8gbG9zZSB0aGUgcHJlZm9ybWF0dGVkbmVzcwotICAgICAgICAvLyBvZiA8cHJlPiB0YWdzIHdoZW4gdGhlaXIgaW5uZXJIVE1MIGlzIGFzc2lnbmVkLgotICAgICAgICAvLyBodHRwOi8vc3R1ZDMudHV3aWVuLmFjLmF0L35lMDIyNjQzMC9pbm5lckh0bWxRdWlyay5odG1sCi0gICAgICAgIC8vIGFuZCBpdCBzZXJ2ZXMgdG8gdW5kbyB0aGUgY29udmVyc2lvbiBvZiA8YnI+cyB0byBuZXdsaW5lcyBkb25lIGluCi0gICAgICAgIC8vIGNodW5raWZ5LgotICAgICAgICB2YXIgaHRtbENodW5rID0gdGV4dFRvSHRtbCgKLSAgICAgICAgICAgIHRhYkV4cGFuZGVyKHNvdXJjZVRleHQuc3Vic3RyaW5nKG91dHB1dElkeCwgc291cmNlSWR4KSkpCi0gICAgICAgICAgICAucmVwbGFjZShsYXN0V2FzU3BhY2UKLSAgICAgICAgICAgICAgICAgICAgID8gc3RhcnRPclNwYWNlUmUKLSAgICAgICAgICAgICAgICAgICAgIDogYWRqYWNlbnRTcGFjZVJlLCAnJDEmIzE2MDsnKTsKLSAgICAgICAgLy8gS2VlcCB0cmFjayBvZiB3aGV0aGVyIHdlIG5lZWQgdG8gZXNjYXBlIHNwYWNlIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlCi0gICAgICAgIC8vIG5leHQgY2h1bmsuCi0gICAgICAgIGxhc3RXYXNTcGFjZSA9IHRyYWlsaW5nU3BhY2VSZS50ZXN0KGh0bWxDaHVuayk7Ci0gICAgICAgIGh0bWwucHVzaChodG1sQ2h1bmsucmVwbGFjZShuZXdsaW5lUmUsIGxpbmVCcmVha2VyKSk7Ci0gICAgICAgIG91dHB1dElkeCA9IHNvdXJjZUlkeDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgLy8gRGV0ZXJtaW5lIGlmIHdlJ3JlIGdvaW5nIHRvIGNvbnN1bWUgYSB0YWcgdGhpcyB0aW1lIGFyb3VuZC4gIE90aGVyd2lzZQotICAgICAgLy8gd2UgY29uc3VtZSBhIGRlY29yYXRpb24gb3IgZXhpdC4KLSAgICAgIHZhciBvdXRwdXRUYWc7Ci0gICAgICBpZiAodGFnUG9zIDwgZXh0cmFjdGVkVGFncy5sZW5ndGgpIHsKLSAgICAgICAgaWYgKGRlY1BvcyA8IGRlY29yYXRpb25zLmxlbmd0aCkgewotICAgICAgICAgIC8vIFBpY2sgb25lIGdpdmluZyBwcmVmZXJlbmNlIHRvIGV4dHJhY3RlZFRhZ3Mgc2luY2Ugd2Ugc2hvdWxkbid0IG9wZW4KLSAgICAgICAgICAvLyBhIG5ldyBzdHlsZSB0aGF0IHdlJ3JlIGdvaW5nIHRvIGhhdmUgdG8gaW1tZWRpYXRlbHkgY2xvc2UgaW4gb3JkZXIKLSAgICAgICAgICAvLyB0byBvdXRwdXQgYSB0YWcuCi0gICAgICAgICAgb3V0cHV0VGFnID0gZXh0cmFjdGVkVGFnc1t0YWdQb3NdIDw9IGRlY29yYXRpb25zW2RlY1Bvc107Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgb3V0cHV0VGFnID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgb3V0cHV0VGFnID0gZmFsc2U7Ci0gICAgICB9Ci0gICAgICAvLyBDb25zdW1lIGVpdGhlciBhIGRlY29yYXRpb24gb3IgYSB0YWcgb3IgZXhpdC4KLSAgICAgIGlmIChvdXRwdXRUYWcpIHsKLSAgICAgICAgZW1pdFRleHRVcFRvKGV4dHJhY3RlZFRhZ3NbdGFnUG9zXSk7Ci0gICAgICAgIGlmIChvcGVuRGVjb3JhdGlvbikgewotICAgICAgICAgIC8vIENsb3NlIHRoZSBjdXJyZW50IGRlY29yYXRpb24KLSAgICAgICAgICBodG1sLnB1c2goJzwvc3Bhbj4nKTsKLSAgICAgICAgICBvcGVuRGVjb3JhdGlvbiA9IG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgaHRtbC5wdXNoKGV4dHJhY3RlZFRhZ3NbdGFnUG9zICsgMV0pOwotICAgICAgICB0YWdQb3MgKz0gMjsKLSAgICAgIH0gZWxzZSBpZiAoZGVjUG9zIDwgZGVjb3JhdGlvbnMubGVuZ3RoKSB7Ci0gICAgICAgIGVtaXRUZXh0VXBUbyhkZWNvcmF0aW9uc1tkZWNQb3NdKTsKLSAgICAgICAgY3VycmVudERlY29yYXRpb24gPSBkZWNvcmF0aW9uc1tkZWNQb3MgKyAxXTsKLSAgICAgICAgZGVjUG9zICs9IDI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gICAgZW1pdFRleHRVcFRvKHNvdXJjZVRleHQubGVuZ3RoKTsKLSAgICBpZiAob3BlbkRlY29yYXRpb24pIHsKLSAgICAgIGh0bWwucHVzaCgnPC9zcGFuPicpOwotICAgIH0KLSAgICBpZiAobnVtYmVyTGluZXMpIHsgaHRtbC5wdXNoKCc8L2xpPjwvb2w+Jyk7IH0KLSAgICBqb2IucHJldHR5UHJpbnRlZEh0bWwgPSBodG1sLmpvaW4oJycpOwotICB9Ci0KLSAgLyoqIE1hcHMgbGFuZ3VhZ2Utc3BlY2lmaWMgZmlsZSBleHRlbnNpb25zIHRvIGhhbmRsZXJzLiAqLwotICB2YXIgbGFuZ0hhbmRsZXJSZWdpc3RyeSA9IHt9OwotICAvKiogUmVnaXN0ZXIgYSBsYW5ndWFnZSBoYW5kbGVyIGZvciB0aGUgZ2l2ZW4gZmlsZSBleHRlbnNpb25zLgotICAgICogQHBhcmFtIHtmdW5jdGlvbiAoT2JqZWN0KX0gaGFuZGxlciBhIGZ1bmN0aW9uIGZyb20gc291cmNlIGNvZGUgdG8gYSBsaXN0Ci0gICAgKiAgICAgIG9mIGRlY29yYXRpb25zLiAgVGFrZXMgYSBzaW5nbGUgYXJndW1lbnQgam9iIHdoaWNoIGRlc2NyaWJlcyB0aGUKLSAgICAqICAgICAgc3RhdGUgb2YgdGhlIGNvbXB1dGF0aW9uLiAgIFRoZSBzaW5nbGUgcGFyYW1ldGVyIGhhcyB0aGUgZm9ybQotICAgICogICAgICB7QGNvZGUgewotICAgICogICAgICAgIHNvdXJjZToge3N0cmluZ30gYXMgcGxhaW4gdGV4dC4KLSAgICAqICAgICAgICBkZWNvcmF0aW9uczoge0FycmF5LjxudW1iZXJ8c3RyaW5nPn0gYW4gYXJyYXkgb2Ygc3R5bGUgY2xhc3NlcwotICAgICogICAgICAgICAgICAgICAgICAgICBwcmVjZWRlZCBieSB0aGUgcG9zaXRpb24gYXQgd2hpY2ggdGhleSBzdGFydCBpbgotICAgICogICAgICAgICAgICAgICAgICAgICBqb2Iuc291cmNlIGluIG9yZGVyLgotICAgICogICAgICAgICAgICAgICAgICAgICBUaGUgbGFuZ3VhZ2UgaGFuZGxlciBzaG91bGQgYXNzaWduZWQgdGhpcyBmaWVsZC4KLSAgICAqICAgICAgICBiYXNlUG9zOiB7aW50fSB0aGUgcG9zaXRpb24gb2Ygc291cmNlIGluIHRoZSBsYXJnZXIgc291cmNlIGNodW5rLgotICAgICogICAgICAgICAgICAgICAgIEFsbCBwb3NpdGlvbnMgaW4gdGhlIG91dHB1dCBkZWNvcmF0aW9ucyBhcnJheSBhcmUgcmVsYXRpdmUKLSAgICAqICAgICAgICAgICAgICAgICB0byB0aGUgbGFyZ2VyIHNvdXJjZSBjaHVuay4KLSAgICAqICAgICAgfSB9Ci0gICAgKiBAcGFyYW0ge0FycmF5LjxzdHJpbmc+fSBmaWxlRXh0ZW5zaW9ucwotICAgICovCi0gIGZ1bmN0aW9uIHJlZ2lzdGVyTGFuZ0hhbmRsZXIoaGFuZGxlciwgZmlsZUV4dGVuc2lvbnMpIHsKLSAgICBmb3IgKHZhciBpID0gZmlsZUV4dGVuc2lvbnMubGVuZ3RoOyAtLWkgPj0gMDspIHsKLSAgICAgIHZhciBleHQgPSBmaWxlRXh0ZW5zaW9uc1tpXTsKLSAgICAgIGlmICghbGFuZ0hhbmRsZXJSZWdpc3RyeS5oYXNPd25Qcm9wZXJ0eShleHQpKSB7Ci0gICAgICAgIGxhbmdIYW5kbGVyUmVnaXN0cnlbZXh0XSA9IGhhbmRsZXI7Ci0gICAgICB9IGVsc2UgaWYgKCdjb25zb2xlJyBpbiB3aW5kb3cpIHsKLSAgICAgICAgY29uc29sZVsnd2FybiddKCdjYW5ub3Qgb3ZlcnJpZGUgbGFuZ3VhZ2UgaGFuZGxlciAlcycsIGV4dCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIGZ1bmN0aW9uIGxhbmdIYW5kbGVyRm9yRXh0ZW5zaW9uKGV4dGVuc2lvbiwgc291cmNlKSB7Ci0gICAgaWYgKCEoZXh0ZW5zaW9uICYmIGxhbmdIYW5kbGVyUmVnaXN0cnkuaGFzT3duUHJvcGVydHkoZXh0ZW5zaW9uKSkpIHsKLSAgICAgIC8vIFRyZWF0IGl0IGFzIG1hcmt1cCBpZiB0aGUgZmlyc3Qgbm9uIHdoaXRlc3BhY2UgY2hhcmFjdGVyIGlzIGEgPCBhbmQKLSAgICAgIC8vIHRoZSBsYXN0IG5vbi13aGl0ZXNwYWNlIGNoYXJhY3RlciBpcyBhID4uCi0gICAgICBleHRlbnNpb24gPSAvXlxzKjwvLnRlc3Qoc291cmNlKQotICAgICAgICAgID8gJ2RlZmF1bHQtbWFya3VwJwotICAgICAgICAgIDogJ2RlZmF1bHQtY29kZSc7Ci0gICAgfQotICAgIHJldHVybiBsYW5nSGFuZGxlclJlZ2lzdHJ5W2V4dGVuc2lvbl07Ci0gIH0KLSAgcmVnaXN0ZXJMYW5nSGFuZGxlcihkZWNvcmF0ZVNvdXJjZSwgWydkZWZhdWx0LWNvZGUnXSk7Ci0gIHJlZ2lzdGVyTGFuZ0hhbmRsZXIoCi0gICAgICBjcmVhdGVTaW1wbGVMZXhlcigKLSAgICAgICAgICBbXSwKLSAgICAgICAgICBbCi0gICAgICAgICAgIFtQUl9QTEFJTiwgICAgICAgL15bXjw/XSsvXSwKLSAgICAgICAgICAgW1BSX0RFQ0xBUkFUSU9OLCAvXjwhXHdbXj5dKig/Oj58JCkvXSwKLSAgICAgICAgICAgW1BSX0NPTU1FTlQsICAgICAvXjxcIS0tW1xzXFNdKj8oPzotXC0+fCQpL10sCi0gICAgICAgICAgIC8vIFVuZXNjYXBlZCBjb250ZW50IGluIGFuIHVua25vd24gbGFuZ3VhZ2UKLSAgICAgICAgICAgWydsYW5nLScsICAgICAgICAvXjxcPyhbXHNcU10rPykoPzpcPz58JCkvXSwKLSAgICAgICAgICAgWydsYW5nLScsICAgICAgICAvXjwlKFtcc1xTXSs/KSg/OiU+fCQpL10sCi0gICAgICAgICAgIFtQUl9QVU5DVFVBVElPTiwgL14oPzo8WyU/XXxbJT9dPikvXSwKLSAgICAgICAgICAgWydsYW5nLScsICAgICAgICAvXjx4bXBcYltePl0qPihbXHNcU10rPyk8XC94bXBcYltePl0qPi9pXSwKLSAgICAgICAgICAgLy8gVW5lc2NhcGVkIGNvbnRlbnQgaW4gamF2YXNjcmlwdC4gIChPciBwb3NzaWJseSB2YnNjcmlwdCkuCi0gICAgICAgICAgIFsnbGFuZy1qcycsICAgICAgL148c2NyaXB0XGJbXj5dKj4oW1xzXFNdKj8pKDxcL3NjcmlwdFxiW14+XSo+KS9pXSwKLSAgICAgICAgICAgLy8gQ29udGFpbnMgdW5lc2NhcGVkIHN0eWxlc2hlZXQgY29udGVudAotICAgICAgICAgICBbJ2xhbmctY3NzJywgICAgIC9ePHN0eWxlXGJbXj5dKj4oW1xzXFNdKj8pKDxcL3N0eWxlXGJbXj5dKj4pL2ldLAotICAgICAgICAgICBbJ2xhbmctaW4udGFnJywgIC9eKDxcLz9bYS16XVtePD5dKj4pL2ldCi0gICAgICAgICAgXSksCi0gICAgICBbJ2RlZmF1bHQtbWFya3VwJywgJ2h0bScsICdodG1sJywgJ214bWwnLCAneGh0bWwnLCAneG1sJywgJ3hzbCddKTsKLSAgcmVnaXN0ZXJMYW5nSGFuZGxlcigKLSAgICAgIGNyZWF0ZVNpbXBsZUxleGVyKAotICAgICAgICAgIFsKLSAgICAgICAgICAgW1BSX1BMQUlOLCAgICAgICAgL15bXHNdKy8sIG51bGwsICcgXHRcclxuJ10sCi0gICAgICAgICAgIFtQUl9BVFRSSUJfVkFMVUUsIC9eKD86XCJbXlwiXSpcIj98XCdbXlwnXSpcJz8pLywgbnVsbCwgJ1wiXCcnXQotICAgICAgICAgICBdLAotICAgICAgICAgIFsKLSAgICAgICAgICAgW1BSX1RBRywgICAgICAgICAgL15ePFwvP1thLXpdKD86W1x3LjotXSpcdyk/fFwvPz4kL2ldLAotICAgICAgICAgICBbUFJfQVRUUklCX05BTUUsICAvXig/IXN0eWxlW1xzPV18b24pW2Etel0oPzpbXHc6LV0qXHcpPy9pXSwKLSAgICAgICAgICAgWydsYW5nLXVxLnZhbCcsICAgL149XHMqKFtePlwnXCJcc10qKD86W14+XCdcIlxzXC9dfFwvKD89XHMpKSkvXSwKLSAgICAgICAgICAgW1BSX1BVTkNUVUFUSU9OLCAgL15bPTw+XC9dKy9dLAotICAgICAgICAgICBbJ2xhbmctanMnLCAgICAgICAvXm9uXHcrXHMqPVxzKlwiKFteXCJdKylcIi9pXSwKLSAgICAgICAgICAgWydsYW5nLWpzJywgICAgICAgL15vblx3K1xzKj1ccypcJyhbXlwnXSspXCcvaV0sCi0gICAgICAgICAgIFsnbGFuZy1qcycsICAgICAgIC9eb25cdytccyo9XHMqKFteXCJcJz5cc10rKS9pXSwKLSAgICAgICAgICAgWydsYW5nLWNzcycsICAgICAgL15zdHlsZVxzKj1ccypcIihbXlwiXSspXCIvaV0sCi0gICAgICAgICAgIFsnbGFuZy1jc3MnLCAgICAgIC9ec3R5bGVccyo9XHMqXCcoW15cJ10rKVwnL2ldLAotICAgICAgICAgICBbJ2xhbmctY3NzJywgICAgICAvXnN0eWxlXHMqPVxzKihbXlwiXCc+XHNdKykvaV0KLSAgICAgICAgICAgXSksCi0gICAgICBbJ2luLnRhZyddKTsKLSAgcmVnaXN0ZXJMYW5nSGFuZGxlcigKLSAgICAgIGNyZWF0ZVNpbXBsZUxleGVyKFtdLCBbW1BSX0FUVFJJQl9WQUxVRSwgL15bXHNcU10rL11dKSwgWyd1cS52YWwnXSk7Ci0gIHJlZ2lzdGVyTGFuZ0hhbmRsZXIoc291cmNlRGVjb3JhdG9yKHsKLSAgICAgICAgICAna2V5d29yZHMnOiBDUFBfS0VZV09SRFMsCi0gICAgICAgICAgJ2hhc2hDb21tZW50cyc6IHRydWUsCi0gICAgICAgICAgJ2NTdHlsZUNvbW1lbnRzJzogdHJ1ZQotICAgICAgICB9KSwgWydjJywgJ2NjJywgJ2NwcCcsICdjeHgnLCAnY3ljJywgJ20nXSk7Ci0gIHJlZ2lzdGVyTGFuZ0hhbmRsZXIoc291cmNlRGVjb3JhdG9yKHsKLSAgICAgICAgICAna2V5d29yZHMnOiAnbnVsbCB0cnVlIGZhbHNlJwotICAgICAgICB9KSwgWydqc29uJ10pOwotICByZWdpc3RlckxhbmdIYW5kbGVyKHNvdXJjZURlY29yYXRvcih7Ci0gICAgICAgICAgJ2tleXdvcmRzJzogQ1NIQVJQX0tFWVdPUkRTLAotICAgICAgICAgICdoYXNoQ29tbWVudHMnOiB0cnVlLAotICAgICAgICAgICdjU3R5bGVDb21tZW50cyc6IHRydWUsCi0gICAgICAgICAgJ3ZlcmJhdGltU3RyaW5ncyc6IHRydWUKLSAgICAgICAgfSksIFsnY3MnXSk7Ci0gIHJlZ2lzdGVyTGFuZ0hhbmRsZXIoc291cmNlRGVjb3JhdG9yKHsKLSAgICAgICAgICAna2V5d29yZHMnOiBKQVZBX0tFWVdPUkRTLAotICAgICAgICAgICdjU3R5bGVDb21tZW50cyc6IHRydWUKLSAgICAgICAgfSksIFsnamF2YSddKTsKLSAgcmVnaXN0ZXJMYW5nSGFuZGxlcihzb3VyY2VEZWNvcmF0b3IoewotICAgICAgICAgICdrZXl3b3Jkcyc6IFNIX0tFWVdPUkRTLAotICAgICAgICAgICdoYXNoQ29tbWVudHMnOiB0cnVlLAotICAgICAgICAgICdtdWx0aUxpbmVTdHJpbmdzJzogdHJ1ZQotICAgICAgICB9KSwgWydic2gnLCAnY3NoJywgJ3NoJ10pOwotICByZWdpc3RlckxhbmdIYW5kbGVyKHNvdXJjZURlY29yYXRvcih7Ci0gICAgICAgICAgJ2tleXdvcmRzJzogUFlUSE9OX0tFWVdPUkRTLAotICAgICAgICAgICdoYXNoQ29tbWVudHMnOiB0cnVlLAotICAgICAgICAgICdtdWx0aUxpbmVTdHJpbmdzJzogdHJ1ZSwKLSAgICAgICAgICAndHJpcGxlUXVvdGVkU3RyaW5ncyc6IHRydWUKLSAgICAgICAgfSksIFsnY3YnLCAncHknXSk7Ci0gIHJlZ2lzdGVyTGFuZ0hhbmRsZXIoc291cmNlRGVjb3JhdG9yKHsKLSAgICAgICAgICAna2V5d29yZHMnOiBQRVJMX0tFWVdPUkRTLAotICAgICAgICAgICdoYXNoQ29tbWVudHMnOiB0cnVlLAotICAgICAgICAgICdtdWx0aUxpbmVTdHJpbmdzJzogdHJ1ZSwKLSAgICAgICAgICAncmVnZXhMaXRlcmFscyc6IHRydWUKLSAgICAgICAgfSksIFsncGVybCcsICdwbCcsICdwbSddKTsKLSAgcmVnaXN0ZXJMYW5nSGFuZGxlcihzb3VyY2VEZWNvcmF0b3IoewotICAgICAgICAgICdrZXl3b3Jkcyc6IFJVQllfS0VZV09SRFMsCi0gICAgICAgICAgJ2hhc2hDb21tZW50cyc6IHRydWUsCi0gICAgICAgICAgJ211bHRpTGluZVN0cmluZ3MnOiB0cnVlLAotICAgICAgICAgICdyZWdleExpdGVyYWxzJzogdHJ1ZQotICAgICAgICB9KSwgWydyYiddKTsKLSAgcmVnaXN0ZXJMYW5nSGFuZGxlcihzb3VyY2VEZWNvcmF0b3IoewotICAgICAgICAgICdrZXl3b3Jkcyc6IEpTQ1JJUFRfS0VZV09SRFMsCi0gICAgICAgICAgJ2NTdHlsZUNvbW1lbnRzJzogdHJ1ZSwKLSAgICAgICAgICAncmVnZXhMaXRlcmFscyc6IHRydWUKLSAgICAgICAgfSksIFsnanMnXSk7Ci0gIHJlZ2lzdGVyTGFuZ0hhbmRsZXIoc291cmNlRGVjb3JhdG9yKHsKLSAgICAgICAgICAna2V5d29yZHMnOiBDT0ZGRUVfS0VZV09SRFMsCi0gICAgICAgICAgJ2hhc2hDb21tZW50cyc6IDMsICAvLyAjIyMgc3R5bGUgYmxvY2sgY29tbWVudHMKLSAgICAgICAgICAnY1N0eWxlQ29tbWVudHMnOiB0cnVlLAotICAgICAgICAgICdtdWx0aWxpbmVTdHJpbmdzJzogdHJ1ZSwKLSAgICAgICAgICAndHJpcGxlUXVvdGVkU3RyaW5ncyc6IHRydWUsCi0gICAgICAgICAgJ3JlZ2V4TGl0ZXJhbHMnOiB0cnVlCi0gICAgICAgIH0pLCBbJ2NvZmZlZSddKTsKLSAgcmVnaXN0ZXJMYW5nSGFuZGxlcihjcmVhdGVTaW1wbGVMZXhlcihbXSwgW1tQUl9TVFJJTkcsIC9eW1xzXFNdKy9dXSksIFsncmVnZXgnXSk7Ci0KLSAgZnVuY3Rpb24gYXBwbHlEZWNvcmF0b3Ioam9iKSB7Ci0gICAgdmFyIHNvdXJjZUNvZGVIdG1sID0gam9iLnNvdXJjZUNvZGVIdG1sOwotICAgIHZhciBvcHRfbGFuZ0V4dGVuc2lvbiA9IGpvYi5sYW5nRXh0ZW5zaW9uOwotCi0gICAgLy8gUHJlcG9wdWxhdGUgb3V0cHV0IGluIGNhc2UgcHJvY2Vzc2luZyBmYWlscyB3aXRoIGFuIGV4Y2VwdGlvbi4KLSAgICBqb2IucHJldHR5UHJpbnRlZEh0bWwgPSBzb3VyY2VDb2RlSHRtbDsKLQotICAgIHRyeSB7Ci0gICAgICAvLyBFeHRyYWN0IHRhZ3MsIGFuZCBjb252ZXJ0IHRoZSBzb3VyY2UgY29kZSB0byBwbGFpbiB0ZXh0LgotICAgICAgdmFyIHNvdXJjZUFuZEV4dHJhY3RlZFRhZ3MgPSBleHRyYWN0VGFncyhzb3VyY2VDb2RlSHRtbCk7Ci0gICAgICAvKiogUGxhaW4gdGV4dC4gQHR5cGUge3N0cmluZ30gKi8KLSAgICAgIHZhciBzb3VyY2UgPSBzb3VyY2VBbmRFeHRyYWN0ZWRUYWdzLnNvdXJjZTsKLSAgICAgIGpvYi5zb3VyY2UgPSBzb3VyY2U7Ci0gICAgICBqb2IuYmFzZVBvcyA9IDA7Ci0KLSAgICAgIC8qKiBFdmVuIGVudHJpZXMgYXJlIHBvc2l0aW9ucyBpbiBzb3VyY2UgaW4gYXNjZW5kaW5nIG9yZGVyLiAgT2RkIGVudHJpZXMKLSAgICAgICAgKiBhcmUgdGFncyB0aGF0IHdlcmUgZXh0cmFjdGVkIGF0IHRoYXQgcG9zaXRpb24uCi0gICAgICAgICogQHR5cGUge0FycmF5LjxudW1iZXJ8c3RyaW5nPn0KLSAgICAgICAgKi8KLSAgICAgIGpvYi5leHRyYWN0ZWRUYWdzID0gc291cmNlQW5kRXh0cmFjdGVkVGFncy50YWdzOwotCi0gICAgICAvLyBBcHBseSB0aGUgYXBwcm9wcmlhdGUgbGFuZ3VhZ2UgaGFuZGxlcgotICAgICAgbGFuZ0hhbmRsZXJGb3JFeHRlbnNpb24ob3B0X2xhbmdFeHRlbnNpb24sIHNvdXJjZSkoam9iKTsKLSAgICAgIC8vIEludGVncmF0ZSB0aGUgZGVjb3JhdGlvbnMgYW5kIHRhZ3MgYmFjayBpbnRvIHRoZSBzb3VyY2UgY29kZSB0byBwcm9kdWNlCi0gICAgICAvLyBhIGRlY29yYXRlZCBodG1sIHN0cmluZyB3aGljaCBpcyBsZWZ0IGluIGpvYi5wcmV0dHlQcmludGVkSHRtbC4KLSAgICAgIHJlY29tYmluZVRhZ3NBbmREZWNvcmF0aW9ucyhqb2IpOwotICAgIH0gY2F0Y2ggKGUpIHsKLSAgICAgIGlmICgnY29uc29sZScgaW4gd2luZG93KSB7Ci0gICAgICAgIGNvbnNvbGVbJ2xvZyddKGUgJiYgZVsnc3RhY2snXSA/IGVbJ3N0YWNrJ10gOiBlKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogQHBhcmFtIHNvdXJjZUNvZGVIdG1sIHtzdHJpbmd9IFRoZSBIVE1MIHRvIHByZXR0eSBwcmludC4KLSAgICogQHBhcmFtIG9wdF9sYW5nRXh0ZW5zaW9uIHtzdHJpbmd9IFRoZSBsYW5ndWFnZSBuYW1lIHRvIHVzZS4KLSAgICogICAgIFR5cGljYWxseSwgYSBmaWxlbmFtZSBleHRlbnNpb24gbGlrZSAnY3BwJyBvciAnamF2YScuCi0gICAqIEBwYXJhbSBvcHRfbnVtYmVyTGluZXMge251bWJlcnxib29sZWFufSBUcnVlIHRvIG51bWJlciBsaW5lcywKLSAgICogICAgIG9yIHRoZSAxLWluZGV4ZWQgbnVtYmVyIG9mIHRoZSBmaXJzdCBsaW5lIGluIHNvdXJjZUNvZGVIdG1sLgotICAgKi8KLSAgZnVuY3Rpb24gcHJldHR5UHJpbnRPbmUoc291cmNlQ29kZUh0bWwsIG9wdF9sYW5nRXh0ZW5zaW9uLCBvcHRfbnVtYmVyTGluZXMpIHsKLSAgICB2YXIgam9iID0gewotICAgICAgc291cmNlQ29kZUh0bWw6IHNvdXJjZUNvZGVIdG1sLAotICAgICAgbGFuZ0V4dGVuc2lvbjogb3B0X2xhbmdFeHRlbnNpb24sCi0gICAgICBudW1iZXJMaW5lczogb3B0X251bWJlckxpbmVzCi0gICAgfTsKLSAgICBhcHBseURlY29yYXRvcihqb2IpOwotICAgIHJldHVybiBqb2IucHJldHR5UHJpbnRlZEh0bWw7Ci0gIH0KLQotICBmdW5jdGlvbiBwcmV0dHlQcmludChvcHRfd2hlbkRvbmUpIHsKLSAgICBmdW5jdGlvbiBieVRhZ05hbWUodG4pIHsgcmV0dXJuIGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKHRuKTsgfQotICAgIC8vIGZldGNoIGEgbGlzdCBvZiBub2RlcyB0byByZXdyaXRlCi0gICAgdmFyIGNvZGVTZWdtZW50cyA9IFtieVRhZ05hbWUoJ3ByZScpLCBieVRhZ05hbWUoJ2NvZGUnKSwgYnlUYWdOYW1lKCd4bXAnKV07Ci0gICAgdmFyIGVsZW1lbnRzID0gW107Ci0gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb2RlU2VnbWVudHMubGVuZ3RoOyArK2kpIHsKLSAgICAgIGZvciAodmFyIGogPSAwLCBuID0gY29kZVNlZ21lbnRzW2ldLmxlbmd0aDsgaiA8IG47ICsraikgewotICAgICAgICBlbGVtZW50cy5wdXNoKGNvZGVTZWdtZW50c1tpXVtqXSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGNvZGVTZWdtZW50cyA9IG51bGw7Ci0KLSAgICB2YXIgY2xvY2sgPSBEYXRlOwotICAgIGlmICghY2xvY2tbJ25vdyddKSB7Ci0gICAgICBjbG9jayA9IHsgJ25vdyc6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIChuZXcgRGF0ZSkuZ2V0VGltZSgpOyB9IH07Ci0gICAgfQotCi0gICAgLy8gVGhlIGxvb3AgaXMgYnJva2VuIGludG8gYSBzZXJpZXMgb2YgY29udGludWF0aW9ucyB0byBtYWtlIHN1cmUgdGhhdCB3ZQotICAgIC8vIGRvbid0IG1ha2UgdGhlIGJyb3dzZXIgdW5yZXNwb25zaXZlIHdoZW4gcmV3cml0aW5nIGEgbGFyZ2UgcGFnZS4KLSAgICB2YXIgayA9IDA7Ci0gICAgdmFyIHByZXR0eVByaW50aW5nSm9iOwotCi0gICAgZnVuY3Rpb24gZG9Xb3JrKCkgewotICAgICAgdmFyIGVuZFRpbWUgPSAod2luZG93WydQUl9TSE9VTERfVVNFX0NPTlRJTlVBVElPTiddID8KLSAgICAgICAgICAgICAgICAgICAgIGNsb2NrLm5vdygpICsgMjUwIC8qIG1zICovIDoKLSAgICAgICAgICAgICAgICAgICAgIEluZmluaXR5KTsKLSAgICAgIGZvciAoOyBrIDwgZWxlbWVudHMubGVuZ3RoICYmIGNsb2NrLm5vdygpIDwgZW5kVGltZTsgaysrKSB7Ci0gICAgICAgIHZhciBjcyA9IGVsZW1lbnRzW2tdOwotICAgICAgICBpZiAoY3MuY2xhc3NOYW1lICYmIGNzLmNsYXNzTmFtZS5pbmRleE9mKCdwcmV0dHlwcmludCcpID49IDApIHsKLSAgICAgICAgICAvLyBJZiB0aGUgY2xhc3NlcyBpbmNsdWRlcyBhIGxhbmd1YWdlIGV4dGVuc2lvbnMsIHVzZSBpdC4KLSAgICAgICAgICAvLyBMYW5ndWFnZSBleHRlbnNpb25zIGNhbiBiZSBzcGVjaWZpZWQgbGlrZQotICAgICAgICAgIC8vICAgICA8cHJlIGNsYXNzPSJwcmV0dHlwcmludCBsYW5nLWNwcCI+Ci0gICAgICAgICAgLy8gdGhlIGxhbmd1YWdlIGV4dGVuc2lvbiAiY3BwIiBpcyB1c2VkIHRvIGZpbmQgYSBsYW5ndWFnZSBoYW5kbGVyIGFzCi0gICAgICAgICAgLy8gcGFzc2VkIHRvIFBSLnJlZ2lzdGVyTGFuZ0hhbmRsZXIuCi0gICAgICAgICAgdmFyIGxhbmdFeHRlbnNpb24gPSBjcy5jbGFzc05hbWUubWF0Y2goL1xibGFuZy0oXHcrKVxiLyk7Ci0gICAgICAgICAgaWYgKGxhbmdFeHRlbnNpb24pIHsgbGFuZ0V4dGVuc2lvbiA9IGxhbmdFeHRlbnNpb25bMV07IH0KLQotICAgICAgICAgIC8vIG1ha2Ugc3VyZSB0aGlzIGlzIG5vdCBuZXN0ZWQgaW4gYW4gYWxyZWFkeSBwcmV0dGlmaWVkIGVsZW1lbnQKLSAgICAgICAgICB2YXIgbmVzdGVkID0gZmFsc2U7Ci0gICAgICAgICAgZm9yICh2YXIgcCA9IGNzLnBhcmVudE5vZGU7IHA7IHAgPSBwLnBhcmVudE5vZGUpIHsKLSAgICAgICAgICAgIGlmICgocC50YWdOYW1lID09PSAncHJlJyB8fCBwLnRhZ05hbWUgPT09ICdjb2RlJyB8fAotICAgICAgICAgICAgICAgICBwLnRhZ05hbWUgPT09ICd4bXAnKSAmJgotICAgICAgICAgICAgICAgIHAuY2xhc3NOYW1lICYmIHAuY2xhc3NOYW1lLmluZGV4T2YoJ3ByZXR0eXByaW50JykgPj0gMCkgewotICAgICAgICAgICAgICBuZXN0ZWQgPSB0cnVlOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKCFuZXN0ZWQpIHsKLSAgICAgICAgICAgIC8vIGZldGNoIHRoZSBjb250ZW50IGFzIGEgc25pcHBldCBvZiBwcm9wZXJseSBlc2NhcGVkIEhUTUwuCi0gICAgICAgICAgICAvLyBGaXJlZm94IGFkZHMgbmV3bGluZXMgYXQgdGhlIGVuZC4KLSAgICAgICAgICAgIHZhciBjb250ZW50ID0gZ2V0SW5uZXJIdG1sKGNzKTsKLSAgICAgICAgICAgIGNvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UoLyg/OlxyXG4/fFxuKSQvLCAnJyk7Ci0KLSAgICAgICAgICAgIC8vIExvb2sgZm9yIGEgY2xhc3MgbGlrZSBsaW5lbnVtcyBvciBsaW5lbnVtczo8bj4gd2hlcmUgPG4+IGlzIHRoZQotICAgICAgICAgICAgLy8gMS1pbmRleGVkIG51bWJlciBvZiB0aGUgZmlyc3QgbGluZS4KLSAgICAgICAgICAgIHZhciBudW1iZXJMaW5lcyA9IGNzLmNsYXNzTmFtZS5tYXRjaCgvXGJsaW5lbnVtc1xiKD86OihcZCspKT8vKTsKLQotICAgICAgICAgICAgLy8gZG8gdGhlIHByZXR0eSBwcmludGluZwotICAgICAgICAgICAgcHJldHR5UHJpbnRpbmdKb2IgPSB7Ci0gICAgICAgICAgICAgIHNvdXJjZUNvZGVIdG1sOiBjb250ZW50LAotICAgICAgICAgICAgICBsYW5nRXh0ZW5zaW9uOiBsYW5nRXh0ZW5zaW9uLAotICAgICAgICAgICAgICBzb3VyY2VOb2RlOiBjcywKLSAgICAgICAgICAgICAgbnVtYmVyTGluZXM6IG51bWJlckxpbmVzCi0gICAgICAgICAgICAgICAgICA/IG51bWJlckxpbmVzWzFdICYmIG51bWJlckxpbmVzWzFdLmxlbmd0aCA/ICtudW1iZXJMaW5lc1sxXSA6IHRydWUKLSAgICAgICAgICAgICAgICAgIDogZmFsc2UKLSAgICAgICAgICAgIH07Ci0gICAgICAgICAgICBhcHBseURlY29yYXRvcihwcmV0dHlQcmludGluZ0pvYik7Ci0gICAgICAgICAgICByZXBsYWNlV2l0aFByZXR0eVByaW50ZWRIdG1sKCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoayA8IGVsZW1lbnRzLmxlbmd0aCkgewotICAgICAgICAvLyBmaW5pc2ggdXAgaW4gYSBjb250aW51YXRpb24KLSAgICAgICAgc2V0VGltZW91dChkb1dvcmssIDI1MCk7Ci0gICAgICB9IGVsc2UgaWYgKG9wdF93aGVuRG9uZSkgewotICAgICAgICBvcHRfd2hlbkRvbmUoKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBmdW5jdGlvbiByZXBsYWNlV2l0aFByZXR0eVByaW50ZWRIdG1sKCkgewotICAgICAgdmFyIG5ld0NvbnRlbnQgPSBwcmV0dHlQcmludGluZ0pvYi5wcmV0dHlQcmludGVkSHRtbDsKLSAgICAgIGlmICghbmV3Q29udGVudCkgeyByZXR1cm47IH0KLSAgICAgIHZhciBjcyA9IHByZXR0eVByaW50aW5nSm9iLnNvdXJjZU5vZGU7Ci0KLSAgICAgIC8vIHB1c2ggdGhlIHByZXR0aWZpZWQgaHRtbCBiYWNrIGludG8gdGhlIHRhZy4KLSAgICAgIGlmICghaXNSYXdDb250ZW50KGNzKSkgewotICAgICAgICAvLyBqdXN0IHJlcGxhY2UgdGhlIG9sZCBodG1sIHdpdGggdGhlIG5ldwotICAgICAgICBjcy5pbm5lckhUTUwgPSBuZXdDb250ZW50OwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgLy8gd2UgbmVlZCB0byBjaGFuZ2UgdGhlIHRhZyB0byBhIDxwcmU+IHNpbmNlIDx4bXA+cyBkbyBub3QgYWxsb3cKLSAgICAgICAgLy8gZW1iZWRkZWQgdGFncyBzdWNoIGFzIHRoZSBzcGFuIHRhZ3MgdXNlZCB0byBhdHRhY2ggc3R5bGVzIHRvCi0gICAgICAgIC8vIHNlY3Rpb25zIG9mIHNvdXJjZSBjb2RlLgotICAgICAgICB2YXIgcHJlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnUFJFJyk7Ci0gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY3MuYXR0cmlidXRlcy5sZW5ndGg7ICsraSkgewotICAgICAgICAgIHZhciBhID0gY3MuYXR0cmlidXRlc1tpXTsKLSAgICAgICAgICBpZiAoYS5zcGVjaWZpZWQpIHsKLSAgICAgICAgICAgIHZhciBhbmFtZSA9IGEubmFtZS50b0xvd2VyQ2FzZSgpOwotICAgICAgICAgICAgaWYgKGFuYW1lID09PSAnY2xhc3MnKSB7Ci0gICAgICAgICAgICAgIHByZS5jbGFzc05hbWUgPSBhLnZhbHVlOyAgLy8gRm9yIElFIDYKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgIHByZS5zZXRBdHRyaWJ1dGUoYS5uYW1lLCBhLnZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcHJlLmlubmVySFRNTCA9IG5ld0NvbnRlbnQ7Ci0KLSAgICAgICAgLy8gcmVtb3ZlIHRoZSBvbGQKLSAgICAgICAgY3MucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQocHJlLCBjcyk7Ci0gICAgICAgIGNzID0gcHJlOwotICAgICAgfQotICAgIH0KLQotICAgIGRvV29yaygpOwotICB9Ci0KLSAgd2luZG93WydQUl9ub3JtYWxpemVkSHRtbCddID0gbm9ybWFsaXplZEh0bWw7Ci0gIHdpbmRvd1sncHJldHR5UHJpbnRPbmUnXSA9IHByZXR0eVByaW50T25lOwotICB3aW5kb3dbJ3ByZXR0eVByaW50J10gPSBwcmV0dHlQcmludDsKLSAgd2luZG93WydQUiddID0gewotICAgICAgICAnY29tYmluZVByZWZpeFBhdHRlcm5zJzogY29tYmluZVByZWZpeFBhdHRlcm5zLAotICAgICAgICAnY3JlYXRlU2ltcGxlTGV4ZXInOiBjcmVhdGVTaW1wbGVMZXhlciwKLSAgICAgICAgJ3JlZ2lzdGVyTGFuZ0hhbmRsZXInOiByZWdpc3RlckxhbmdIYW5kbGVyLAotICAgICAgICAnc291cmNlRGVjb3JhdG9yJzogc291cmNlRGVjb3JhdG9yLAotICAgICAgICAnUFJfQVRUUklCX05BTUUnOiBQUl9BVFRSSUJfTkFNRSwKLSAgICAgICAgJ1BSX0FUVFJJQl9WQUxVRSc6IFBSX0FUVFJJQl9WQUxVRSwKLSAgICAgICAgJ1BSX0NPTU1FTlQnOiBQUl9DT01NRU5ULAotICAgICAgICAnUFJfREVDTEFSQVRJT04nOiBQUl9ERUNMQVJBVElPTiwKLSAgICAgICAgJ1BSX0tFWVdPUkQnOiBQUl9LRVlXT1JELAotICAgICAgICAnUFJfTElURVJBTCc6IFBSX0xJVEVSQUwsCi0gICAgICAgICdQUl9OT0NPREUnOiBQUl9OT0NPREUsCi0gICAgICAgICdQUl9QTEFJTic6IFBSX1BMQUlOLAotICAgICAgICAnUFJfUFVOQ1RVQVRJT04nOiBQUl9QVU5DVFVBVElPTiwKLSAgICAgICAgJ1BSX1NPVVJDRSc6IFBSX1NPVVJDRSwKLSAgICAgICAgJ1BSX1NUUklORyc6IFBSX1NUUklORywKLSAgICAgICAgJ1BSX1RBRyc6IFBSX1RBRywKLSAgICAgICAgJ1BSX1RZUEUnOiBQUl9UWVBFCi0gICAgICB9OwotfSkoKTsKLQotLy90aGlyZF9wYXJ0eS9qYXZhc2NyaXB0L2dvb2dsZV9jb2RlX3ByZXR0aWZ5L3NyYy9sYW5nLWFwb2xsby5qcwotLyoqCi0gKiBAbGljZW5zZSBDb3B5cmlnaHQgKEMpIDIwMDkgT25ubyBIb21tZXMuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICogQGZpbGVvdmVydmlldwotICogUmVnaXN0ZXJzIGEgbGFuZ3VhZ2UgaGFuZGxlciBmb3IgdGhlIEFHQy9BRUEgQXNzZW1ibHkgTGFuZ3VhZ2UgYXMgZGVzY3JpYmVkCi0gKiBhdCBodHRwOi8vdmlydHVhbGFnYy5nb29nbGVjb2RlLmNvbQotICogPHA+Ci0gKiBUaGlzIGZpbGUgY291bGQgYmUgdXNlZCBieSBnb29kbGUgY29kZSB0byBhbGxvdyBzeW50YXggaGlnaGxpZ2h0IGZvcgotICogVmlydHVhbCBBR0MgU1ZOIHJlcG9zaXRvcnkgb3IgaWYgeW91IGRvbid0IHdhbnQgdG8gY29tbW9uaXplCi0gKiB0aGUgaGVhZGVyIGZvciB0aGUgYWdjL2FlYSBodG1sIGFzc2VtYmx5IGxpc3RpbmcuCi0gKgotICogQGF1dGhvciBvaG9tbWVzQGFsdW1uaS5jbXUuZWR1Ci0gKi8KLQotUFJbJ3JlZ2lzdGVyTGFuZ0hhbmRsZXInXSgKLSAgICBQUlsnY3JlYXRlU2ltcGxlTGV4ZXInXSgKLSAgICAgICAgWwotICAgICAgICAgLy8gQSBsaW5lIGNvbW1lbnQgdGhhdCBzdGFydHMgd2l0aCA7Ci0gICAgICAgICBbUFJbJ1BSX0NPTU1FTlQnXSwgICAgIC9eI1teXHJcbl0qLywgbnVsbCwgJyMnXSwKLSAgICAgICAgIC8vIFdoaXRlc3BhY2UKLSAgICAgICAgIFtQUlsnUFJfUExBSU4nXSwgICAgICAgL15bXHRcblxyIFx4QTBdKy8sIG51bGwsICdcdFxuXHIgXHhBMCddLAotICAgICAgICAgLy8gQSBkb3VibGUgcXVvdGVkLCBwb3NzaWJseSBtdWx0aS1saW5lLCBzdHJpbmcuCi0gICAgICAgICBbUFJbJ1BSX1NUUklORyddLCAgICAgIC9eXCIoPzpbXlwiXFxdfFxcW1xzXFNdKSooPzpcInwkKS8sIG51bGwsICciJ10KLSAgICAgICAgXSwKLSAgICAgICAgWwotICAgICAgICAgW1BSWydQUl9LRVlXT1JEJ10sIC9eKD86QURTfEFEfEFVR3xCWkZ8QlpNRnxDQUV8Q0FGfENBfENDU3xDT018Q1N8REFTfERDQXxEQ09NfERDU3xERE9VQkx8RElNfERPVUJMRXxEVENCfERUQ0Z8RFZ8RFhDSHxFRFJVUFR8RVhURU5EfElOQ1J8SU5ERVh8TkRYfElOSElOVHxMWENIfE1BU0t8TVNLfE1QfE1TVXxOT09QfE9WU0t8UVhDSHxSQU5EfFJFQUR8UkVMSU5UfFJFU1VNRXxSRVRVUk58Uk9SfFJYT1J8U1FVQVJFfFNVfFRDUnxUQ0FBfE9WU0t8VENGfFRDfFRTfFdBTkR8V09SfFdSSVRFfFhDSHxYTFF8WFhBTFF8Wkx8WlF8QUREfEFEWnxTVUJ8U1VafE1QWXxNUFJ8TVBafERWUHxDT018QUJTfENMQXxDTFp8TERRfFNUT3xTVFF8QUxTfExMU3xMUlN8VFJBfFRTUXxUTUl8VE9WfEFYVHxUSVh8RExZfElOUHxPVVQpXHMvLG51bGxdLAotICAgICAgICAgW1BSWydQUl9UWVBFJ10sIC9eKD86LT9HRU5BRFJ8PU1JTlVTfDJCQ0FEUnxWTnxCT0Z8TU18LT8yQ0FEUnwtP1sxLTZdRE5BRFJ8QURSRVN8QkJDT058W1NFXT9CQU5LXD0/fEJMT0NLfEJOS1NVTXxFP0NBRFJ8Q09VTlRcKj98Mj9ERUNcKj98LT9ETkNIQU58LT9ETlBUUnxFUVVBTFN8RVJBU0V8TUVNT1JZfDI/T0NUfFJFTUFEUnxTRVRMT0N8U1VCUk98T1JHfEJTU3xCRVN8U1lOfEVRVXxERUZJTkV8RU5EKVxzLyxudWxsXSwKLSAgICAgICAgIC8vIEEgc2luZ2xlIHF1b3RlIHBvc3NpYmx5IGZvbGxvd2VkIGJ5IGEgd29yZCB0aGF0IG9wdGlvbmFsbHkgZW5kcyB3aXRoCi0gICAgICAgICAvLyA9ICEgb3IgPy4KLSAgICAgICAgIFtQUlsnUFJfTElURVJBTCddLAotICAgICAgICAgIC9eXCcoPzotKig/Olx3fFxcW1x4MjEtXHg3ZV0pKD86W1x3LV0qfFxcW1x4MjEtXHg3ZV0pWz0hP10/KT8vXSwKLSAgICAgICAgIC8vIEFueSB3b3JkIGluY2x1ZGluZyBsYWJlbHMgdGhhdCBvcHRpb25hbGx5IGVuZHMgd2l0aCA9ICEgb3IgPy4KLSAgICAgICAgIFtQUlsnUFJfUExBSU4nXSwKLSAgICAgICAgICAvXi0qKD86WyEtel9dfFxcW1x4MjEtXHg3ZV0pKD86W1x3LV0qfFxcW1x4MjEtXHg3ZV0pWz0hP10/L2ldLAotICAgICAgICAgLy8gQSBwcmludGFibGUgbm9uLXNwYWNlIG5vbi1zcGVjaWFsIGNoYXJhY3RlcgotICAgICAgICAgW1BSWydQUl9QVU5DVFVBVElPTiddLCAvXlteXHdcdFxuXHIgXHhBMCgpXCJcXFwnO10rL10KLSAgICAgICAgXSksCi0gICAgWydhcG9sbG8nLCAnYWdjJywgJ2FlYSddKTsKLQotLy90aGlyZF9wYXJ0eS9qYXZhc2NyaXB0L2dvb2dsZV9jb2RlX3ByZXR0aWZ5L3NyYy9sYW5nLWNsai5qcwotLyoqCi0gKiBAbGljZW5zZSBDb3B5cmlnaHQgKEMpIDIwMTEgR29vZ2xlIEluYy4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKiBAZmlsZW92ZXJ2aWV3Ci0gKiBSZWdpc3RlcnMgYSBsYW5ndWFnZSBoYW5kbGVyIGZvciBDbG9qdXJlLgotICoKLSAqCi0gKiBUbyB1c2UsIGluY2x1ZGUgcHJldHRpZnkuanMgYW5kIHRoaXMgZmlsZSBpbiB5b3VyIEhUTUwgcGFnZS4KLSAqIFRoZW4gcHV0IHlvdXIgY29kZSBpbiBhbiBIVE1MIHRhZyBsaWtlCi0gKiAgICAgIDxwcmUgY2xhc3M9InByZXR0eXByaW50IGxhbmctbGlzcCI+KG15IGxpc3AgY29kZSk8L3ByZT4KLSAqIFRoZSBsYW5nLWNsIGNsYXNzIGlkZW50aWZpZXMgdGhlIGxhbmd1YWdlIGFzIGNvbW1vbiBsaXNwLgotICogVGhpcyBmaWxlIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgbGFuZ3VhZ2UgZXh0ZW5zaW9uczoKLSAqICAgICBsYW5nLWNsaiAtIENsb2p1cmUKLSAqCi0gKgotICogSSB1c2VkIGxhbmctbGlzcC5qcyBhcyB0aGUgYmFzaXMgZm9yIHRoaXMgYWRkaW5nIHRoZSBjbG9qdXJlIHNwZWNpZmljCi0gKiBrZXl3b3JkcyBhbmQgc3ludGF4LgotICoKLSAqICJOYW1lIiAgICA9ICdDbG9qdXJlJwotICogIkF1dGhvciIgID0gJ1JpY2ggSGlja2V5JwotICogIlZlcnNpb24iID0gJzEuMicKLSAqICJBYm91dCIgICA9ICdDbG9qdXJlIGlzIGEgbGlzcCBmb3IgdGhlIGp2bSB3aXRoIGNvbmN1cnJlbmN5IHByaW1pdGl2ZXMgYW5kIGEgcmljaGVyIHNldCBvZiB0eXBlcy4nCi0gKgotICoKLSAqIEkgdXNlZCA8YSBocmVmPSJodHRwOi8vY2xvanVyZS5vcmcvUmVmZXJlbmNlIj5DbG9qdXJlLm9yZyBSZWZlcmVuY2U8L2E+IGFzCi0gKiB0aGUgYmFzaXMgZm9yIHRoZSByZXNlcnZlZCB3b3JkIGxpc3QuCi0gKgotICoKLSAqIEBhdXRob3IgandhbGxAZ29vZ2xlLmNvbQotICovCi0KLVBSWydyZWdpc3RlckxhbmdIYW5kbGVyJ10oCi0gICAgUFJbJ2NyZWF0ZVNpbXBsZUxleGVyJ10oCi0gICAgICAgIFsKLSAgICAgICAgIC8vIGNsb2p1cmUgaGFzIG1vcmUgcGFyZW4gdHlwZXMgdGhhbiBtaW5pbWFsIGxpc3AuCi0gICAgICAgICBbJ29wbicsICAgICAgICAgICAgIC9eW1woXHtcW10rLywgbnVsbCwgJyhbeyddLAotICAgICAgICAgWydjbG8nLCAgICAgICAgICAgICAvXltcKVx9XF1dKy8sIG51bGwsICcpXX0nXSwKLSAgICAgICAgIC8vIEEgbGluZSBjb21tZW50IHRoYXQgc3RhcnRzIHdpdGggOwotICAgICAgICAgW1BSWydQUl9DT01NRU5UJ10sICAgICAvXjtbXlxyXG5dKi8sIG51bGwsICc7J10sCi0gICAgICAgICAvLyBXaGl0ZXNwYWNlCi0gICAgICAgICBbUFJbJ1BSX1BMQUlOJ10sICAgICAgIC9eW1x0XG5cciBceEEwXSsvLCBudWxsLCAnXHRcblxyIFx4QTAnXSwKLSAgICAgICAgIC8vIEEgZG91YmxlIHF1b3RlZCwgcG9zc2libHkgbXVsdGktbGluZSwgc3RyaW5nLgotICAgICAgICAgW1BSWydQUl9TVFJJTkcnXSwgICAgICAvXlwiKD86W15cIlxcXXxcXFtcc1xTXSkqKD86XCJ8JCkvLCBudWxsLCAnIiddCi0gICAgICAgIF0sCi0gICAgICAgIFsKLSAgICAgICAgIC8vIGNsb2p1cmUgaGFzIGEgbXVjaCBsYXJnZXIgc2V0IG9mIGtleXdvcmRzCi0gICAgICAgICBbUFJbJ1BSX0tFWVdPUkQnXSwgICAgIC9eKD86ZGVmfGlmfGRvfGxldHxxdW90ZXx2YXJ8Zm58bG9vcHxyZWN1cnx0aHJvd3x0cnl8bW9uaXRvci1lbnRlcnxtb25pdG9yLWV4aXR8ZGVmbWFjcm98ZGVmbnxkZWZuLXxtYWNyb2V4cGFuZHxtYWNyb2V4cGFuZC0xfGZvcnxkb3NlcXxkb3N5bmN8ZG90aW1lc3xhbmR8b3J8d2hlbnxub3R8YXNzZXJ0fGRvdG98cHJveHl8ZGVmc3RydWN0fGZpcnN0fHJlc3R8Y29uc3xkZWZwcm90b2NvbHxkZWZ0eXBlfGRlZnJlY29yZHxyZWlmeXxkZWZtdWx0aXxkZWZtZXRob2R8bWV0YXx3aXRoLW1ldGF8bnN8aW4tbnN8Y3JlYXRlLW5zfGltcG9ydHxpbnRlcm58cmVmZXJ8YWxpYXN8bmFtZXNwYWNlfHJlc29sdmV8cmVmfGRlcmVmfHJlZnNldHxuZXd8c2V0IXxtZW1mbnx0by1hcnJheXxpbnRvLWFycmF5fGFzZXR8Z2VuLWNsYXNzfHJlZHVjZXxtYXB8ZmlsdGVyfGZpbmR8bmlsP3xlbXB0eT98aGFzaC1tYXB8aGFzaC1zZXR8dmVjfHZlY3RvcnxzZXF8ZmxhdHRlbnxyZXZlcnNlfGFzc29jfGRpc3NvY3xsaXN0fGxpc3Q/fGRpc2p8Z2V0fHVuaW9ufGRpZmZlcmVuY2V8aW50ZXJzZWN0aW9ufGV4dGVuZHxleHRlbmQtdHlwZXxleHRlbmQtcHJvdG9jb2x8cHJuKVxiLywgbnVsbF0sCi0gICAgICAgICBbUFJbJ1BSX1RZUEUnXSwgL146WzAtOWEtekEtWlwtXSsvXQotICAgICAgICBdKSwKLSAgICBbJ2NsaiddKTsKLQotLy90aGlyZF9wYXJ0eS9qYXZhc2NyaXB0L2dvb2dsZV9jb2RlX3ByZXR0aWZ5L3NyYy9sYW5nLWNzcy5qcwotLyoqCi0gKiBAbGljZW5zZSBDb3B5cmlnaHQgKEMpIDIwMDkgR29vZ2xlIEluYy4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKiBAZmlsZW92ZXJ2aWV3Ci0gKiBSZWdpc3RlcnMgYSBsYW5ndWFnZSBoYW5kbGVyIGZvciBDU1MuCi0gKgotICoKLSAqIFRvIHVzZSwgaW5jbHVkZSBwcmV0dGlmeS5qcyBhbmQgdGhpcyBmaWxlIGluIHlvdXIgSFRNTCBwYWdlLgotICogVGhlbiBwdXQgeW91ciBjb2RlIGluIGFuIEhUTUwgdGFnIGxpa2UKLSAqICAgICAgPHByZSBjbGFzcz0icHJldHR5cHJpbnQgbGFuZy1jc3MiPjwvcHJlPgotICoKLSAqCi0gKiBodHRwOi8vd3d3LnczLm9yZy9UUi9DU1MyMS9ncmFtbWFyLmh0bWwgU2VjdGlvbiBHMiBkZWZpbmVzIHRoZSBsZXhpY2FsCi0gKiBncmFtbWFyLiAgVGhpcyBzY2hlbWUgZG9lcyBub3QgcmVjb2duaXplIGtleXdvcmRzIGNvbnRhaW5pbmcgZXNjYXBlcy4KLSAqCi0gKiBAYXV0aG9yIG1pa2VzYW11ZWxAZ21haWwuY29tCi0gKi8KLQotUFJbJ3JlZ2lzdGVyTGFuZ0hhbmRsZXInXSgKLSAgICBQUlsnY3JlYXRlU2ltcGxlTGV4ZXInXSgKLSAgICAgICAgWwotICAgICAgICAgLy8gVGhlIHNwYWNlIHByb2R1Y3Rpb24gPHM+Ci0gICAgICAgICBbUFJbJ1BSX1BMQUlOJ10sICAgICAgIC9eWyBcdFxyXG5cZl0rLywgbnVsbCwgJyBcdFxyXG5cZiddCi0gICAgICAgIF0sCi0gICAgICAgIFsKLSAgICAgICAgIC8vIFF1b3RlZCBzdHJpbmdzLiAgPHN0cmluZzE+IGFuZCA8c3RyaW5nMj4KLSAgICAgICAgIFtQUlsnUFJfU1RSSU5HJ10sCi0gICAgICAgICAgL15cIig/OlteXG5cclxmXFxcIl18XFwoPzpcclxuP3xcbnxcZil8XFxbXHNcU10pKlwiLywgbnVsbF0sCi0gICAgICAgICBbUFJbJ1BSX1NUUklORyddLAotICAgICAgICAgIC9eXCcoPzpbXlxuXHJcZlxcXCddfFxcKD86XHJcbj98XG58XGYpfFxcW1xzXFNdKSpcJy8sIG51bGxdLAotICAgICAgICAgWydsYW5nLWNzcy1zdHInLCAvXnVybFwoKFteXClcIlwnXSopXCkvaV0sCi0gICAgICAgICBbUFJbJ1BSX0tFWVdPUkQnXSwKLSAgICAgICAgICAvXig/OnVybHxyZ2J8XCFpbXBvcnRhbnR8QGltcG9ydHxAcGFnZXxAbWVkaWF8QGNoYXJzZXR8aW5oZXJpdCkoPz1bXlwtXHddfCQpL2ksCi0gICAgICAgICAgbnVsbF0sCi0gICAgICAgICAvLyBBIHByb3BlcnR5IG5hbWUgLS0gYW4gaWRlbnRpZmllciBmb2xsb3dlZCBieSBhIGNvbG9uLgotICAgICAgICAgWydsYW5nLWNzcy1rdycsIC9eKC0/KD86W19hLXpdfCg/OlxcWzAtOWEtZl0rID8pKSg/OltfYS16MC05XC1dfFxcKD86XFxbMC05YS1mXSsgPykpKilccyo6L2ldLAotICAgICAgICAgLy8gQSBDIHN0eWxlIGJsb2NrIGNvbW1lbnQuICBUaGUgPGNvbW1lbnQ+IHByb2R1Y3Rpb24uCi0gICAgICAgICBbUFJbJ1BSX0NPTU1FTlQnXSwgL15cL1wqW14qXSpcKisoPzpbXlwvKl1bXipdKlwqKykqXC8vXSwKLSAgICAgICAgIC8vIEVzY2FwaW5nIHRleHQgc3BhbnMKLSAgICAgICAgIFtQUlsnUFJfQ09NTUVOVCddLCAvXig/OjwhLS18LS0+KS9dLAotICAgICAgICAgLy8gQSBudW1iZXIgcG9zc2libHkgY29udGFpbmluZyBhIHN1ZmZpeC4KLSAgICAgICAgIFtQUlsnUFJfTElURVJBTCddLCAvXig/OlxkK3xcZCpcLlxkKykoPzolfFthLXpdKyk/L2ldLAotICAgICAgICAgLy8gQSBoZXggY29sb3IKLSAgICAgICAgIFtQUlsnUFJfTElURVJBTCddLCAvXiMoPzpbMC05YS1mXXszfSl7MSwyfS9pXSwKLSAgICAgICAgIC8vIEFuIGlkZW50aWZpZXIKLSAgICAgICAgIFtQUlsnUFJfUExBSU4nXSwKLSAgICAgICAgICAvXi0/KD86W19hLXpdfCg/OlxcW1xkYS1mXSsgPykpKD86W19hLXpcZFwtXXxcXCg/OlxcW1xkYS1mXSsgPykpKi9pXSwKLSAgICAgICAgIC8vIEEgcnVuIG9mIHB1bmN0dWF0aW9uCi0gICAgICAgICBbUFJbJ1BSX1BVTkNUVUFUSU9OJ10sIC9eW15cc1x3XCdcIl0rL10KLSAgICAgICAgXSksCi0gICAgWydjc3MnXSk7Ci1QUlsncmVnaXN0ZXJMYW5nSGFuZGxlciddKAotICAgIFBSWydjcmVhdGVTaW1wbGVMZXhlciddKFtdLAotICAgICAgICBbCi0gICAgICAgICBbUFJbJ1BSX0tFWVdPUkQnXSwKLSAgICAgICAgICAvXi0/KD86W19hLXpdfCg/OlxcW1xkYS1mXSsgPykpKD86W19hLXpcZFwtXXxcXCg/OlxcW1xkYS1mXSsgPykpKi9pXQotICAgICAgICBdKSwKLSAgICBbJ2Nzcy1rdyddKTsKLVBSWydyZWdpc3RlckxhbmdIYW5kbGVyJ10oCi0gICAgUFJbJ2NyZWF0ZVNpbXBsZUxleGVyJ10oW10sCi0gICAgICAgIFsKLSAgICAgICAgIFtQUlsnUFJfU1RSSU5HJ10sIC9eW15cKVwiXCddKy9dCi0gICAgICAgIF0pLAotICAgIFsnY3NzLXN0ciddKTsKLQotLy90aGlyZF9wYXJ0eS9qYXZhc2NyaXB0L2dvb2dsZV9jb2RlX3ByZXR0aWZ5L3NyYy9sYW5nLWdvLmpzCi0vKioKLSAqIEBsaWNlbnNlIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqIEBmaWxlb3ZlcnZpZXcKLSAqIFJlZ2lzdGVycyBhIGxhbmd1YWdlIGhhbmRsZXIgZm9yIHRoZSBHbyBsYW5ndWFnZS4uCi0gKiA8cD4KLSAqIEJhc2VkIG9uIHRoZSBsZXhpY2FsIGdyYW1tYXIgYXQgCi0gKiBodHRwOi8vZ29sYW5nLm9yZy9kb2MvZ29fc3BlYy5odG1sI0xleGljYWxfZWxlbWVudHMKLSAqIDxwPgotICogR28gdXNlcyBhIG1pbmltYWwgc3R5bGUgZm9yIGhpZ2hsaWdodGluZyBzbyB0aGUgYmVsb3cgZG9lcyBub3QgZGlzdGluZ3Vpc2gKLSAqIHN0cmluZ3MsIGtleXdvcmRzLCBsaXRlcmFscywgZXRjLiBieSBkZXNpZ24uCi0gKiBGcm9tIGEgZGlzY3Vzc2lvbiB3aXRoIHRoZSBHbyBkZXNpZ25lcnM6Ci0gKiA8cHJlPgotICogT24gVGh1cnNkYXksIEp1bHkgMjIsIDIwMTAsIE1pa2UgU2FtdWVsIDwuLi4+IHdyb3RlOgotICogPiBPbiBUaHUsIEp1bCAyMiwgMjAxMCwgUm9iICdDb21tYW5kZXInIFBpa2UgPC4uLj4gd3JvdGU6Ci0gKiA+PiBQZXJzb25hbGx5LCBJIHdvdWxkIHZvdGUgZm9yIHRoZSBzdWJkdWVkIHN0eWxlIGdvZG9jIHByZXNlbnRzIGF0IGh0dHA6Ly9nb2xhbmcub3JnCi0gKiA+PgotICogPj4gTm90IGFzIGZhbmN5IGFzIHNvbWUgbGlrZSwgYnV0IGEgY2FzZSBjYW4gYmUgbWFkZSBpdCdzIHRoZSBvZmZpY2lhbCBzdHlsZS4KLSAqID4+IElmIHBlb3BsZSB3YW50IG1vcmUgY29sb3JzLCBJIHdvdWxkbid0IGZpZ2h0IHRvbyBoYXJkLCBpbiB0aGUgaW50ZXJlc3Qgb2YKLSAqID4+IGVuY291cmFnZW1lbnQgdGhyb3VnaCBmYW1pbGlhcml0eSwgYnV0IGV2ZW4gdGhlbiBJIHdvdWxkIGFzayB0byBzaHkgYXdheQotICogPj4gZnJvbSB0ZWNobmljb2xvciBzdGFyYnVyc3RzLgotICogPgotICogPiBMaWtlIGh0dHA6Ly9nb2xhbmcub3JnL3BrZy9nby9zY2FubmVyLyB3aGVyZSBjb21tZW50cyBhcmUgYmx1ZSBhbmQgYWxsCi0gKiA+IG90aGVyIGNvbnRlbnQgaXMgYmxhY2s/ICBJIGNhbiBkbyB0aGF0LgotICogPC9wcmU+Ci0gKgotICogQGF1dGhvciBtaWtlc2FtdWVsQGdtYWlsLmNvbQotICovCi0KLVBSWydyZWdpc3RlckxhbmdIYW5kbGVyJ10oCi0gICAgUFJbJ2NyZWF0ZVNpbXBsZUxleGVyJ10oCi0gICAgICAgIFsKLSAgICAgICAgIC8vIFdoaXRlc3BhY2UgaXMgbWFkZSB1cCBvZiBzcGFjZXMsIHRhYnMgYW5kIG5ld2xpbmUgY2hhcmFjdGVycy4KLSAgICAgICAgIFtQUlsnUFJfUExBSU4nXSwgICAgICAgL15bXHRcblxyIFx4QTBdKy8sIG51bGwsICdcdFxuXHIgXHhBMCddLAotICAgICAgICAgLy8gTm90IGVzY2FwZWQgYXMgYSBzdHJpbmcuICBTZWUgbm90ZSBvbiBtaW5pbWFsaXNtIGFib3ZlLgotICAgICAgICAgW1BSWydQUl9QTEFJTiddLCAgICAgICAvXig/OlwiKD86W15cIlxcXXxcXFtcc1xTXSkqKD86XCJ8JCl8XCcoPzpbXlwnXFxdfFxcW1xzXFNdKSsoPzpcJ3wkKSkvLCBudWxsLCAnIlwnJ10KLSAgICAgICAgXSwKLSAgICAgICAgWwotICAgICAgICAgLy8gQmxvY2sgY29tbWVudHMgYXJlIGRlbGltaXRlZCBieSAvKiBhbmQgKi8uCi0gICAgICAgICAvLyBTaW5nbGUtbGluZSBjb21tZW50cyBiZWdpbiB3aXRoIC8vIGFuZCBleHRlbmQgdG8gdGhlIGVuZCBvZiBhIGxpbmUuCi0gICAgICAgICBbUFJbJ1BSX0NPTU1FTlQnXSwgICAgIC9eKD86XC9cL1teXHJcbl0qfFwvXCpbXHNcU10qP1wqXC8pL10sCi0gICAgICAgICBbUFJbJ1BSX1BMQUlOJ10sICAgICAgIC9eKD86W15cL1wiXCddfFwvKD8hW1wvXCpdKSkrL2ldCi0gICAgICAgIF0pLAotICAgIFsnZ28nXSk7Ci0KLS8vdGhpcmRfcGFydHkvamF2YXNjcmlwdC9nb29nbGVfY29kZV9wcmV0dGlmeS9zcmMvbGFuZy1ocy5qcwotLyoqCi0gKiBAbGljZW5zZSBDb3B5cmlnaHQgKEMpIDIwMDkgR29vZ2xlIEluYy4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKiBAZmlsZW92ZXJ2aWV3Ci0gKiBSZWdpc3RlcnMgYSBsYW5ndWFnZSBoYW5kbGVyIGZvciBIYXNrZWxsLgotICoKLSAqCi0gKiBUbyB1c2UsIGluY2x1ZGUgcHJldHRpZnkuanMgYW5kIHRoaXMgZmlsZSBpbiB5b3VyIEhUTUwgcGFnZS4KLSAqIFRoZW4gcHV0IHlvdXIgY29kZSBpbiBhbiBIVE1MIHRhZyBsaWtlCi0gKiAgICAgIDxwcmUgY2xhc3M9InByZXR0eXByaW50IGxhbmctaHMiPihteSBsaXNwIGNvZGUpPC9wcmU+Ci0gKiBUaGUgbGFuZy1jbCBjbGFzcyBpZGVudGlmaWVzIHRoZSBsYW5ndWFnZSBhcyBjb21tb24gbGlzcC4KLSAqIFRoaXMgZmlsZSBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIGxhbmd1YWdlIGV4dGVuc2lvbnM6Ci0gKiAgICAgbGFuZy1jbCAtIENvbW1vbiBMaXNwCi0gKiAgICAgbGFuZy1lbCAtIEVtYWNzIExpc3AKLSAqICAgICBsYW5nLWxpc3AgLSBMaXNwCi0gKiAgICAgbGFuZy1zY20gLSBTY2hlbWUKLSAqCi0gKgotICogSSB1c2VkIGh0dHA6Ly93d3cuaW5mb3JtYXRpay51bmktZnJlaWJ1cmcuZGUvfnRoaWVtYW5uL2hhc2tlbGwvaGFza2VsbDk4LXJlcG9ydC1odG1sL3N5bnRheC1pc28uaHRtbAotICogYXMgdGhlIGJhc2lzLCBidXQgaWdub3JlIHRoZSB3YXkgdGhlIG5jb21tZW50IHByb2R1Y3Rpb24gbmVzdHMgc2luY2UgdGhpcwotICogbWFrZXMgdGhlIGxleGljYWwgZ3JhbW1hciBpcnJlZ3VsYXIuICBJdCBtaWdodCBiZSBwb3NzaWJsZSB0byBzdXBwb3J0Ci0gKiBuY29tbWVudHMgdXNpbmcgdGhlIGxvb2tiZWhpbmQgZmlsdGVyLgotICoKLSAqCi0gKiBAYXV0aG9yIG1pa2VzYW11ZWxAZ21haWwuY29tCi0gKi8KLQotUFJbJ3JlZ2lzdGVyTGFuZ0hhbmRsZXInXSgKLSAgICBQUlsnY3JlYXRlU2ltcGxlTGV4ZXInXSgKLSAgICAgICAgWwotICAgICAgICAgLy8gV2hpdGVzcGFjZQotICAgICAgICAgLy8gd2hpdGVjaGFyICAgIC0+ICAgIG5ld2xpbmUgfCB2ZXJ0YWIgfCBzcGFjZSB8IHRhYiB8IHVuaVdoaXRlCi0gICAgICAgICAvLyBuZXdsaW5lICAgICAgLT4gICAgcmV0dXJuIGxpbmVmZWVkIHwgcmV0dXJuIHwgbGluZWZlZWQgfCBmb3JtZmVlZAotICAgICAgICAgW1BSWydQUl9QTEFJTiddLCAgICAgICAvXltcdFxuXHgwQlx4MENcciBdKy8sIG51bGwsICdcdFxuXHgwQlx4MENcciAnXSwKLSAgICAgICAgIC8vIFNpbmdsZSBsaW5lIGRvdWJsZSBhbmQgc2luZ2xlLXF1b3RlZCBzdHJpbmdzLgotICAgICAgICAgLy8gY2hhciAgICAgICAgIC0+ICAgICcgKGdyYXBoaWM8JyB8IFw+IHwgc3BhY2UgfCBlc2NhcGU8XCY+KSAnCi0gICAgICAgICAvLyBzdHJpbmcgICAgICAgLT4gICAgIiB7Z3JhcGhpYzwiIHwgXD4gfCBzcGFjZSB8IGVzY2FwZSB8IGdhcH0iCi0gICAgICAgICAvLyBlc2NhcGUgICAgICAgLT4gICAgXCAoIGNoYXJlc2MgfCBhc2NpaSB8IGRlY2ltYWwgfCBvIG9jdGFsCi0gICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgIHwgeCBoZXhhZGVjaW1hbCApCi0gICAgICAgICAvLyBjaGFyZXNjICAgICAgLT4gICAgYSB8IGIgfCBmIHwgbiB8IHIgfCB0IHwgdiB8IFwgfCAiIHwgJyB8ICYKLSAgICAgICAgIFtQUlsnUFJfU1RSSU5HJ10sICAgICAgL15cIig/OlteXCJcXFxuXHgwQ1xyXXxcXFtcc1xTXSkqKD86XCJ8JCkvLAotICAgICAgICAgIG51bGwsICciJ10sCi0gICAgICAgICBbUFJbJ1BSX1NUUklORyddLCAgICAgIC9eXCcoPzpbXlwnXFxcblx4MENccl18XFxbXiZdKVwnPy8sCi0gICAgICAgICAgbnVsbCwgIiciXSwKLSAgICAgICAgIC8vIGRlY2ltYWwgICAgICAtPiAgICBkaWdpdHtkaWdpdH0KLSAgICAgICAgIC8vIG9jdGFsICAgICAgICAtPiAgICBvY3RpdHtvY3RpdH0KLSAgICAgICAgIC8vIGhleGFkZWNpbWFsICAtPiAgICBoZXhpdHtoZXhpdH0KLSAgICAgICAgIC8vIGludGVnZXIgICAgICAtPiAgICBkZWNpbWFsCi0gICAgICAgICAvLyAgICAgICAgICAgICAgIHwgICAgMG8gb2N0YWwgfCAwTyBvY3RhbAotICAgICAgICAgLy8gICAgICAgICAgICAgICB8ICAgIDB4IGhleGFkZWNpbWFsIHwgMFggaGV4YWRlY2ltYWwKLSAgICAgICAgIC8vIGZsb2F0ICAgICAgICAtPiAgICBkZWNpbWFsIC4gZGVjaW1hbCBbZXhwb25lbnRdCi0gICAgICAgICAvLyAgICAgICAgICAgICAgIHwgICAgZGVjaW1hbCBleHBvbmVudAotICAgICAgICAgLy8gZXhwb25lbnQgICAgIC0+ICAgIChlIHwgRSkgWysgfCAtXSBkZWNpbWFsCi0gICAgICAgICBbUFJbJ1BSX0xJVEVSQUwnXSwKLSAgICAgICAgICAvXig/OjBvWzAtN10rfDB4W1xkYS1mXSt8XGQrKD86XC5cZCspPyg/OmVbK1wtXT9cZCspPykvaSwKLSAgICAgICAgICBudWxsLCAnMDEyMzQ1Njc4OSddCi0gICAgICAgIF0sCi0gICAgICAgIFsKLSAgICAgICAgIC8vIEhhc2tlbGwgZG9lcyBub3QgaGF2ZSBhIHJlZ3VsYXIgbGV4aWNhbCBncmFtbWFyIGR1ZSB0byB0aGUgbmVzdGVkCi0gICAgICAgICAvLyBuY29tbWVudC4KLSAgICAgICAgIC8vIGNvbW1lbnQgICAgICAtPiAgICBkYXNoZXMgWyBhbnk8c3ltYm9sPiB7YW55fV0gbmV3bGluZQotICAgICAgICAgLy8gbmNvbW1lbnQgICAgIC0+ICAgIG9wZW5jb20gQU5Zc2VxIHtuY29tbWVudCBBTllzZXF9Y2xvc2Vjb20KLSAgICAgICAgIC8vIGRhc2hlcyAgICAgICAtPiAgICAnLS0nIHsnLSd9Ci0gICAgICAgICAvLyBvcGVuY29tICAgICAgLT4gICAgJ3stJwotICAgICAgICAgLy8gY2xvc2Vjb20gICAgIC0+ICAgICctfScKLSAgICAgICAgIFtQUlsnUFJfQ09NTUVOVCddLCAgICAgL14oPzooPzotLSsoPzpbXlxyXG5ceDBDXSopPyl8KD86XHstKD86W14tXXwtK1teLVx9XSkqLVx9KSkvXSwKLSAgICAgICAgIC8vIHJlc2VydmVkaWQgICAtPiAgICBjYXNlIHwgY2xhc3MgfCBkYXRhIHwgZGVmYXVsdCB8IGRlcml2aW5nIHwgZG8KLSAgICAgICAgIC8vICAgICAgICAgICAgICAgfCAgICBlbHNlIHwgaWYgfCBpbXBvcnQgfCBpbiB8IGluZml4IHwgaW5maXhsIHwgaW5maXhyCi0gICAgICAgICAvLyAgICAgICAgICAgICAgIHwgICAgaW5zdGFuY2UgfCBsZXQgfCBtb2R1bGUgfCBuZXd0eXBlIHwgb2YgfCB0aGVuCi0gICAgICAgICAvLyAgICAgICAgICAgICAgIHwgICAgdHlwZSB8IHdoZXJlIHwgXwotICAgICAgICAgW1BSWydQUl9LRVlXT1JEJ10sICAgICAvXig/OmNhc2V8Y2xhc3N8ZGF0YXxkZWZhdWx0fGRlcml2aW5nfGRvfGVsc2V8aWZ8aW1wb3J0fGlufGluZml4fGluZml4bHxpbmZpeHJ8aW5zdGFuY2V8bGV0fG1vZHVsZXxuZXd0eXBlfG9mfHRoZW58dHlwZXx3aGVyZXxfKSg/PVteYS16QS1aMC05XCddfCQpLywgbnVsbF0sCi0gICAgICAgICAvLyBxdmFyaWQgICAgICAgLT4gICAgWyBtb2RpZCAuIF0gdmFyaWQKLSAgICAgICAgIC8vIHFjb25pZCAgICAgICAtPiAgICBbIG1vZGlkIC4gXSBjb25pZAotICAgICAgICAgLy8gdmFyaWQgICAgICAgIC0+ICAgIChzbWFsbCB7c21hbGwgfCBsYXJnZSB8IGRpZ2l0IHwgJyB9KTxyZXNlcnZlZGlkPgotICAgICAgICAgLy8gY29uaWQgICAgICAgIC0+ICAgIGxhcmdlIHtzbWFsbCB8IGxhcmdlIHwgZGlnaXQgfCAnIH0KLSAgICAgICAgIC8vIG1vZGlkICAgICAgICAtPiAgICBjb25pZAotICAgICAgICAgLy8gc21hbGwgICAgICAgIC0+ICAgIGFzY1NtYWxsIHwgdW5pU21hbGwgfCBfCi0gICAgICAgICAvLyBhc2NTbWFsbCAgICAgLT4gICAgYSB8IGIgfCAuLi4gfCB6Ci0gICAgICAgICAvLyB1bmlTbWFsbCAgICAgLT4gICAgYW55IFVuaWNvZGUgbG93ZXJjYXNlIGxldHRlcgotICAgICAgICAgLy8gbGFyZ2UgICAgICAgIC0+ICAgIGFzY0xhcmdlIHwgdW5pTGFyZ2UKLSAgICAgICAgIC8vIGFzY0xhcmdlICAgICAtPiAgICBBIHwgQiB8IC4uLiB8IFoKLSAgICAgICAgIC8vIHVuaUxhcmdlICAgICAtPiAgICBhbnkgdXBwZXJjYXNlIG9yIHRpdGxlY2FzZSBVbmljb2RlIGxldHRlcgotICAgICAgICAgW1BSWydQUl9QTEFJTiddLCAgL14oPzpbQS1aXVtcd1wnXSpcLikqW2EtekEtWl1bXHdcJ10qL10sCi0gICAgICAgICAvLyBtYXRjaGVzIHRoZSBzeW1ib2wgcHJvZHVjdGlvbgotICAgICAgICAgW1BSWydQUl9QVU5DVFVBVElPTiddLCAvXlteXHRcblx4MEJceDBDXHIgYS16QS1aMC05XCdcIl0rL10KLSAgICAgICAgXSksCi0gICAgWydocyddKTsKLQotLy90aGlyZF9wYXJ0eS9qYXZhc2NyaXB0L2dvb2dsZV9jb2RlX3ByZXR0aWZ5L3NyYy9sYW5nLWxpc3AuanMKLS8qKgotICogQGxpY2Vuc2UgQ29weXJpZ2h0IChDKSAyMDA4IEdvb2dsZSBJbmMuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICogQGZpbGVvdmVydmlldwotICogUmVnaXN0ZXJzIGEgbGFuZ3VhZ2UgaGFuZGxlciBmb3IgQ29tbW9uIExpc3AgYW5kIHJlbGF0ZWQgbGFuZ3VhZ2VzLgotICoKLSAqCi0gKiBUbyB1c2UsIGluY2x1ZGUgcHJldHRpZnkuanMgYW5kIHRoaXMgZmlsZSBpbiB5b3VyIEhUTUwgcGFnZS4KLSAqIFRoZW4gcHV0IHlvdXIgY29kZSBpbiBhbiBIVE1MIHRhZyBsaWtlCi0gKiAgICAgIDxwcmUgY2xhc3M9InByZXR0eXByaW50IGxhbmctbGlzcCI+KG15IGxpc3AgY29kZSk8L3ByZT4KLSAqIFRoZSBsYW5nLWNsIGNsYXNzIGlkZW50aWZpZXMgdGhlIGxhbmd1YWdlIGFzIGNvbW1vbiBsaXNwLgotICogVGhpcyBmaWxlIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgbGFuZ3VhZ2UgZXh0ZW5zaW9uczoKLSAqICAgICBsYW5nLWNsIC0gQ29tbW9uIExpc3AKLSAqICAgICBsYW5nLWVsIC0gRW1hY3MgTGlzcAotICogICAgIGxhbmctbGlzcCAtIExpc3AKLSAqICAgICBsYW5nLXNjbSAtIFNjaGVtZQotICoKLSAqCi0gKiBJIHVzZWQgaHR0cDovL3d3dy5kZXZpbmNvb2suY29tL2dvbGRwYXJzZXIvZG9jL21ldGEtbGFuZ3VhZ2UvZ3JhbW1hci1MSVNQLmh0bQotICogYXMgdGhlIGJhc2lzLCBidXQgYWRkZWQgbGluZSBjb21tZW50cyB0aGF0IHN0YXJ0IHdpdGggOyBhbmQgY2hhbmdlZCB0aGUgYXRvbQotICogcHJvZHVjdGlvbiB0byBkaXNhbGxvdyB1bnF1b3RlZCBzZW1pY29sb25zLgotICoKLSAqICJOYW1lIiAgICA9ICdMSVNQJwotICogIkF1dGhvciIgID0gJ0pvaG4gTWNDYXJ0aHknCi0gKiAiVmVyc2lvbiIgPSAnTWluaW1hbCcKLSAqICJBYm91dCIgICA9ICdMSVNQIGlzIGFuIGFic3RyYWN0IGxhbmd1YWdlIHRoYXQgb3JnYW5pemVzIEFMTCcKLSAqICAgICAgICAgICB8ICdkYXRhIGFyb3VuZCAibGlzdHMiLicKLSAqCi0gKiAiU3RhcnQgU3ltYm9sIiA9IFtzLUV4cHJlc3Npb25dCi0gKgotICoge0F0b20gQ2hhcn0gICA9IHtQcmludGFibGV9IC0ge1doaXRlc3BhY2V9IC0gWygpIlwnJ10KLSAqCi0gKiBBdG9tID0gKCB7QXRvbSBDaGFyfSB8ICdcJ3tQcmludGFibGV9ICkrCi0gKgotICogW3MtRXhwcmVzc2lvbl0gOjo9IFtRdW90ZV0gQXRvbQotICogICAgICAgICAgICAgICAgICB8IFtRdW90ZV0gJygnIFtTZXJpZXNdICcpJwotICogICAgICAgICAgICAgICAgICB8IFtRdW90ZV0gJygnIFtzLUV4cHJlc3Npb25dICcuJyBbcy1FeHByZXNzaW9uXSAnKScKLSAqCi0gKiBbU2VyaWVzXSA6Oj0gW3MtRXhwcmVzc2lvbl0gW1Nlcmllc10KLSAqICAgICAgICAgICAgfAotICoKLSAqIFtRdW90ZV0gIDo6PSAnJyAgICAgICFRdW90ZSA9IGRvIG5vdCBldmFsdWF0ZQotICogICAgICAgICAgICB8Ci0gKgotICoKLSAqIEkgdXNlZCA8YSBocmVmPSJodHRwOi8vZ2lnYW1vbmtleXMuY29tL2Jvb2svIj5QcmFjdGljYWwgQ29tbW9uIExpc3A8L2E+IGFzCi0gKiB0aGUgYmFzaXMgZm9yIHRoZSByZXNlcnZlZCB3b3JkIGxpc3QuCi0gKgotICoKLSAqIEBhdXRob3IgbWlrZXNhbXVlbEBnbWFpbC5jb20KLSAqLwotCi1QUlsncmVnaXN0ZXJMYW5nSGFuZGxlciddKAotICAgIFBSWydjcmVhdGVTaW1wbGVMZXhlciddKAotICAgICAgICBbCi0gICAgICAgICBbJ29wbicsICAgICAgICAgICAgIC9eXCgrLywgbnVsbCwgJygnXSwKLSAgICAgICAgIFsnY2xvJywgICAgICAgICAgICAgL15cKSsvLCBudWxsLCAnKSddLAotICAgICAgICAgLy8gQSBsaW5lIGNvbW1lbnQgdGhhdCBzdGFydHMgd2l0aCA7Ci0gICAgICAgICBbUFJbJ1BSX0NPTU1FTlQnXSwgICAgIC9eO1teXHJcbl0qLywgbnVsbCwgJzsnXSwKLSAgICAgICAgIC8vIFdoaXRlc3BhY2UKLSAgICAgICAgIFtQUlsnUFJfUExBSU4nXSwgICAgICAgL15bXHRcblxyIFx4QTBdKy8sIG51bGwsICdcdFxuXHIgXHhBMCddLAotICAgICAgICAgLy8gQSBkb3VibGUgcXVvdGVkLCBwb3NzaWJseSBtdWx0aS1saW5lLCBzdHJpbmcuCi0gICAgICAgICBbUFJbJ1BSX1NUUklORyddLCAgICAgIC9eXCIoPzpbXlwiXFxdfFxcW1xzXFNdKSooPzpcInwkKS8sIG51bGwsICciJ10KLSAgICAgICAgXSwKLSAgICAgICAgWwotICAgICAgICAgW1BSWydQUl9LRVlXT1JEJ10sICAgICAvXig/OmJsb2NrfGNbYWRdK3J8Y2F0Y2h8Y29uW2RzXXxkZWYoPzppbmV8dW4pfGRvfGVxfGVxbHxlcXVhbHxlcXVhbHB8ZXZhbC13aGVufGZsZXR8Zm9ybWF0fGdvfGlmfGxhYmVsc3xsYW1iZGF8bGV0fGxvYWQtdGltZS12YWx1ZXxsb2NhbGx5fG1hY3JvbGV0fG11bHRpcGxlLXZhbHVlLWNhbGx8bmlsfHByb2dufHByb2d2fHF1b3RlfHJlcXVpcmV8cmV0dXJuLWZyb218c2V0cXxzeW1ib2wtbWFjcm9sZXR8dHx0YWdib2R5fHRoZXx0aHJvd3x1bndpbmQpXGIvLCBudWxsXSwKLSAgICAgICAgIFtQUlsnUFJfTElURVJBTCddLAotICAgICAgICAgIC9eWytcLV0/KD86WzAjXXhbMC05YS1mXSt8XGQrXC9cZCt8KD86XC5cZCt8XGQrKD86XC5cZCopPykoPzpbZWRdWytcLV0/XGQrKT8pL2ldLAotICAgICAgICAgLy8gQSBzaW5nbGUgcXVvdGUgcG9zc2libHkgZm9sbG93ZWQgYnkgYSB3b3JkIHRoYXQgb3B0aW9uYWxseSBlbmRzIHdpdGgKLSAgICAgICAgIC8vID0gISBvciA/LgotICAgICAgICAgW1BSWydQUl9MSVRFUkFMJ10sCi0gICAgICAgICAgL15cJyg/Oi0qKD86XHd8XFxbXHgyMS1ceDdlXSkoPzpbXHctXSp8XFxbXHgyMS1ceDdlXSlbPSE/XT8pPy9dLAotICAgICAgICAgLy8gQSB3b3JkIHRoYXQgb3B0aW9uYWxseSBlbmRzIHdpdGggPSAhIG9yID8uCi0gICAgICAgICBbUFJbJ1BSX1BMQUlOJ10sCi0gICAgICAgICAgL14tKig/OlthLXpfXXxcXFtceDIxLVx4N2VdKSg/Oltcdy1dKnxcXFtceDIxLVx4N2VdKVs9IT9dPy9pXSwKLSAgICAgICAgIC8vIEEgcHJpbnRhYmxlIG5vbi1zcGFjZSBub24tc3BlY2lhbCBjaGFyYWN0ZXIKLSAgICAgICAgIFtQUlsnUFJfUFVOQ1RVQVRJT04nXSwgL15bXlx3XHRcblxyIFx4QTAoKVwiXFxcJztdKy9dCi0gICAgICAgIF0pLAotICAgIFsnY2wnLCAnZWwnLCAnbGlzcCcsICdzY20nXSk7Ci0KLS8vdGhpcmRfcGFydHkvamF2YXNjcmlwdC9nb29nbGVfY29kZV9wcmV0dGlmeS9zcmMvbGFuZy1sdWEuanMKLS8qKgotICogQGxpY2Vuc2UgQ29weXJpZ2h0IChDKSAyMDA4IEdvb2dsZSBJbmMuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICogQGZpbGVvdmVydmlldwotICogUmVnaXN0ZXJzIGEgbGFuZ3VhZ2UgaGFuZGxlciBmb3IgTHVhLgotICoKLSAqCi0gKiBUbyB1c2UsIGluY2x1ZGUgcHJldHRpZnkuanMgYW5kIHRoaXMgZmlsZSBpbiB5b3VyIEhUTUwgcGFnZS4KLSAqIFRoZW4gcHV0IHlvdXIgY29kZSBpbiBhbiBIVE1MIHRhZyBsaWtlCi0gKiAgICAgIDxwcmUgY2xhc3M9InByZXR0eXByaW50IGxhbmctbHVhIj4obXkgTHVhIGNvZGUpPC9wcmU+Ci0gKgotICoKLSAqIEkgdXNlZCBodHRwOi8vd3d3Lmx1YS5vcmcvbWFudWFsLzUuMS9tYW51YWwuaHRtbCMyLjEKLSAqIEJlY2F1c2Ugb2YgdGhlIGxvbmctYnJhY2tldCBjb25jZXB0IHVzZWQgaW4gc3RyaW5ncyBhbmQgY29tbWVudHMsIEx1YSBkb2VzCi0gKiBub3QgaGF2ZSBhIHJlZ3VsYXIgbGV4aWNhbCBncmFtbWFyLCBidXQgbHVja2lseSBpdCBmaXRzIHdpdGhpbiB0aGUgc3BhY2UKLSAqIG9mIGlycmVndWxhciBncmFtbWFycyBzdXBwb3J0ZWQgYnkgamF2YXNjcmlwdCByZWd1bGFyIGV4cHJlc3Npb25zLgotICoKLSAqIEBhdXRob3IgbWlrZXNhbXVlbEBnbWFpbC5jb20KLSAqLwotCi1QUlsncmVnaXN0ZXJMYW5nSGFuZGxlciddKAotICAgIFBSWydjcmVhdGVTaW1wbGVMZXhlciddKAotICAgICAgICBbCi0gICAgICAgICAvLyBXaGl0ZXNwYWNlCi0gICAgICAgICBbUFJbJ1BSX1BMQUlOJ10sICAgICAgIC9eW1x0XG5cciBceEEwXSsvLCBudWxsLCAnXHRcblxyIFx4QTAnXSwKLSAgICAgICAgIC8vIEEgZG91YmxlIG9yIHNpbmdsZSBxdW90ZWQsIHBvc3NpYmx5IG11bHRpLWxpbmUsIHN0cmluZy4KLSAgICAgICAgIFtQUlsnUFJfU1RSSU5HJ10sICAgICAgL14oPzpcIig/OlteXCJcXF18XFxbXHNcU10pKig/OlwifCQpfFwnKD86W15cJ1xcXXxcXFtcc1xTXSkqKD86XCd8JCkpLywgbnVsbCwgJyJcJyddCi0gICAgICAgIF0sCi0gICAgICAgIFsKLSAgICAgICAgIC8vIEEgY29tbWVudCBpcyBlaXRoZXIgYSBsaW5lIGNvbW1lbnQgdGhhdCBzdGFydHMgd2l0aCB0d28gZGFzaGVzLCBvcgotICAgICAgICAgLy8gdHdvIGRhc2hlcyBwcmVjZWRpbmcgYSBsb25nIGJyYWNrZXRlZCBibG9jay4KLSAgICAgICAgIFtQUlsnUFJfQ09NTUVOVCddLCAvXi0tKD86XFsoPSopXFtbXHNcU10qPyg/OlxdXDFcXXwkKXxbXlxyXG5dKikvXSwKLSAgICAgICAgIC8vIEEgbG9uZyBicmFja2V0ZWQgYmxvY2sgbm90IHByZWNlZGVkIGJ5IC0tIGlzIGEgc3RyaW5nLgotICAgICAgICAgW1BSWydQUl9TVFJJTkcnXSwgIC9eXFsoPSopXFtbXHNcU10qPyg/OlxdXDFcXXwkKS9dLAotICAgICAgICAgW1BSWydQUl9LRVlXT1JEJ10sIC9eKD86YW5kfGJyZWFrfGRvfGVsc2V8ZWxzZWlmfGVuZHxmYWxzZXxmb3J8ZnVuY3Rpb258aWZ8aW58bG9jYWx8bmlsfG5vdHxvcnxyZXBlYXR8cmV0dXJufHRoZW58dHJ1ZXx1bnRpbHx3aGlsZSlcYi8sIG51bGxdLAotICAgICAgICAgLy8gQSBudW1iZXIgaXMgYSBoZXggaW50ZWdlciBsaXRlcmFsLCBhIGRlY2ltYWwgcmVhbCBsaXRlcmFsLCBvciBpbgotICAgICAgICAgLy8gc2NpZW50aWZpYyBub3RhdGlvbi4KLSAgICAgICAgIFtQUlsnUFJfTElURVJBTCddLAotICAgICAgICAgIC9eWystXT8oPzoweFtcZGEtZl0rfCg/Oig/OlwuXGQrfFxkKyg/OlwuXGQqKT8pKD86ZVsrXC1dP1xkKyk/KSkvaV0sCi0gICAgICAgICAvLyBBbiBpZGVudGlmaWVyCi0gICAgICAgICBbUFJbJ1BSX1BMQUlOJ10sIC9eW2Etel9dXHcqL2ldLAotICAgICAgICAgLy8gQSBydW4gb2YgcHVuY3R1YXRpb24KLSAgICAgICAgIFtQUlsnUFJfUFVOQ1RVQVRJT04nXSwgL15bXlx3XHRcblxyIFx4QTBdW15cd1x0XG5cciBceEEwXCJcJ1wtXCs9XSovXQotICAgICAgICBdKSwKLSAgICBbJ2x1YSddKTsKLQotLy90aGlyZF9wYXJ0eS9qYXZhc2NyaXB0L2dvb2dsZV9jb2RlX3ByZXR0aWZ5L3NyYy9sYW5nLW1sLmpzCi0vKioKLSAqIEBsaWNlbnNlIENvcHlyaWdodCAoQykgMjAwOCBHb29nbGUgSW5jLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqIEBmaWxlb3ZlcnZpZXcKLSAqIFJlZ2lzdGVycyBhIGxhbmd1YWdlIGhhbmRsZXIgZm9yIE9DYW1sLCBTTUwsIEYjIGFuZCBzaW1pbGFyIGxhbmd1YWdlcy4KLSAqCi0gKiBCYXNlZCBvbiB0aGUgbGV4aWNhbCBncmFtbWFyIGF0Ci0gKiBodHRwOi8vcmVzZWFyY2gubWljcm9zb2Z0LmNvbS9lbi11cy91bS9jYW1icmlkZ2UvcHJvamVjdHMvZnNoYXJwL21hbnVhbC9zcGVjLmh0bWwjX1RvYzI3MDU5NzM4OAotICoKLSAqIEBhdXRob3IgbWlrZXNhbXVlbEBnbWFpbC5jb20KLSAqLwotCi1QUlsncmVnaXN0ZXJMYW5nSGFuZGxlciddKAotICAgIFBSWydjcmVhdGVTaW1wbGVMZXhlciddKAotICAgICAgICBbCi0gICAgICAgICAvLyBXaGl0ZXNwYWNlIGlzIG1hZGUgdXAgb2Ygc3BhY2VzLCB0YWJzIGFuZCBuZXdsaW5lIGNoYXJhY3RlcnMuCi0gICAgICAgICBbUFJbJ1BSX1BMQUlOJ10sICAgICAgIC9eW1x0XG5cciBceEEwXSsvLCBudWxsLCAnXHRcblxyIFx4QTAnXSwKLSAgICAgICAgIC8vICNpZiBpZGVudC8jZWxzZS8jZW5kaWYgZGlyZWN0aXZlcyBkZWxpbWl0IGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uCi0gICAgICAgICAvLyBzZWN0aW9ucwotICAgICAgICAgW1BSWydQUl9DT01NRU5UJ10sCi0gICAgICAgICAgL14jKD86aWZbXHRcblxyIFx4QTBdKyg/OlthLXpfJF1bXHdcJ10qfGBgW15cclxuXHRgXSooPzpgYHwkKSl8ZWxzZXxlbmRpZnxsaWdodCkvaSwKLSAgICAgICAgICBudWxsLCAnIyddLAotICAgICAgICAgLy8gQSBkb3VibGUgb3Igc2luZ2xlIHF1b3RlZCwgcG9zc2libHkgbXVsdGktbGluZSwgc3RyaW5nLgotICAgICAgICAgLy8gRiMgYWxsb3dzIGVzY2FwZWQgbmV3bGluZXMgaW4gc3RyaW5ncy4KLSAgICAgICAgIFtQUlsnUFJfU1RSSU5HJ10sICAgICAgL14oPzpcIig/OlteXCJcXF18XFxbXHNcU10pKig/OlwifCQpfFwnKD86W15cJ1xcXXxcXFtcc1xTXSkoPzpcJ3wkKSkvLCBudWxsLCAnIlwnJ10KLSAgICAgICAgXSwKLSAgICAgICAgWwotICAgICAgICAgLy8gQmxvY2sgY29tbWVudHMgYXJlIGRlbGltaXRlZCBieSAoKiBhbmQgKikgYW5kIG1heSBiZQotICAgICAgICAgLy8gbmVzdGVkLiBTaW5nbGUtbGluZSBjb21tZW50cyBiZWdpbiB3aXRoIC8vIGFuZCBleHRlbmQgdG8KLSAgICAgICAgIC8vIHRoZSBlbmQgb2YgYSBsaW5lLgotICAgICAgICAgLy8gVE9ETzogKCouLi4qKSBjb21tZW50cyBjYW4gYmUgbmVzdGVkLiAgVGhpcyBkb2VzIG5vdCBoYW5kbGUgdGhhdC4KLSAgICAgICAgIFtQUlsnUFJfQ09NTUVOVCddLCAgICAgL14oPzpcL1wvW15cclxuXSp8XChcKltcc1xTXSo/XCpcKSkvXSwKLSAgICAgICAgIFtQUlsnUFJfS0VZV09SRCddLCAgICAgL14oPzphYnN0cmFjdHxhbmR8YXN8YXNzZXJ0fGJlZ2lufGNsYXNzfGRlZmF1bHR8ZGVsZWdhdGV8ZG98ZG9uZXxkb3duY2FzdHxkb3dudG98ZWxpZnxlbHNlfGVuZHxleGNlcHRpb258ZXh0ZXJufGZhbHNlfGZpbmFsbHl8Zm9yfGZ1bnxmdW5jdGlvbnxpZnxpbnxpbmhlcml0fGlubGluZXxpbnRlcmZhY2V8aW50ZXJuYWx8bGF6eXxsZXR8bWF0Y2h8bWVtYmVyfG1vZHVsZXxtdXRhYmxlfG5hbWVzcGFjZXxuZXd8bnVsbHxvZnxvcGVufG9yfG92ZXJyaWRlfHByaXZhdGV8cHVibGljfHJlY3xyZXR1cm58c3RhdGljfHN0cnVjdHx0aGVufHRvfHRydWV8dHJ5fHR5cGV8dXBjYXN0fHVzZXx2YWx8dm9pZHx3aGVufHdoaWxlfHdpdGh8eWllbGR8YXNyfGxhbmR8bG9yfGxzbHxsc3J8bHhvcnxtb2R8c2lnfGF0b21pY3xicmVha3xjaGVja2VkfGNvbXBvbmVudHxjb25zdHxjb25zdHJhaW50fGNvbnN0cnVjdG9yfGNvbnRpbnVlfGVhZ2VyfGV2ZW50fGV4dGVybmFsfGZpeGVkfGZ1bmN0b3J8Z2xvYmFsfGluY2x1ZGV8bWV0aG9kfG1peGlufG9iamVjdHxwYXJhbGxlbHxwcm9jZXNzfHByb3RlY3RlZHxwdXJlfHNlYWxlZHx0cmFpdHx2aXJ0dWFsfHZvbGF0aWxlKVxiL10sCi0gICAgICAgICAvLyBBIG51bWJlciBpcyBhIGhleCBpbnRlZ2VyIGxpdGVyYWwsIGEgZGVjaW1hbCByZWFsIGxpdGVyYWwsIG9yIGluCi0gICAgICAgICAvLyBzY2llbnRpZmljIG5vdGF0aW9uLgotICAgICAgICAgW1BSWydQUl9MSVRFUkFMJ10sCi0gICAgICAgICAgL15bK1wtXT8oPzoweFtcZGEtZl0rfCg/Oig/OlwuXGQrfFxkKyg/OlwuXGQqKT8pKD86ZVsrXC1dP1xkKyk/KSkvaV0sCi0gICAgICAgICBbUFJbJ1BSX1BMQUlOJ10sICAgICAgIC9eKD86W2Etel9dW1x3J10qWyE/I10/fGBgW15cclxuXHRgXSooPzpgYHwkKSkvaV0sCi0gICAgICAgICAvLyBBIHByaW50YWJsZSBub24tc3BhY2Ugbm9uLXNwZWNpYWwgY2hhcmFjdGVyCi0gICAgICAgICBbUFJbJ1BSX1BVTkNUVUFUSU9OJ10sIC9eW15cdFxuXHIgXHhBMFwiXCdcd10rL10KLSAgICAgICAgXSksCi0gICAgWydmcycsICdtbCddKTsKLQotLy90aGlyZF9wYXJ0eS9qYXZhc2NyaXB0L2dvb2dsZV9jb2RlX3ByZXR0aWZ5L3NyYy9sYW5nLXByb3RvLmpzCi0vKioKLSAqIEBsaWNlbnNlIENvcHlyaWdodCAoQykgMjAwNiBHb29nbGUgSW5jLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqIEBmaWxlb3ZlcnZpZXcKLSAqIFJlZ2lzdGVycyBhIGxhbmd1YWdlIGhhbmRsZXIgZm9yIFByb3RvY29sIEJ1ZmZlcnMgYXMgZGVzY3JpYmVkIGF0Ci0gKiBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvLgotICoKLSAqIEJhc2VkIG9uIHRoZSBsZXhpY2FsIGdyYW1tYXIgYXQKLSAqIGh0dHA6Ly9yZXNlYXJjaC5taWNyb3NvZnQuY29tL2ZzaGFycC9tYW51YWwvc3BlYzIuYXNweCNfVG9jMjAyMzgzNzE1Ci0gKgotICogQGF1dGhvciBtaWtlc2FtdWVsQGdtYWlsLmNvbQotICovCi0KLVBSWydyZWdpc3RlckxhbmdIYW5kbGVyJ10oUFJbJ3NvdXJjZURlY29yYXRvciddKHsKLSAgICAgICAga2V5d29yZHM6ICgKLSAgICAgICAgICAgICdib29sIGJ5dGVzIGRlZmF1bHQgZG91YmxlIGVudW0gZXh0ZW5kIGV4dGVuc2lvbnMgZmFsc2UgZml4ZWQzMiAnCi0gICAgICAgICAgICArICdmaXhlZDY0IGZsb2F0IGdyb3VwIGltcG9ydCBpbnQzMiBpbnQ2NCBtYXggbWVzc2FnZSBvcHRpb24gJwotICAgICAgICAgICAgKyAnb3B0aW9uYWwgcGFja2FnZSByZXBlYXRlZCByZXF1aXJlZCByZXR1cm5zIHJwYyBzZXJ2aWNlICcKLSAgICAgICAgICAgICsgJ3NmaXhlZDMyIHNmaXhlZDY0IHNpbnQzMiBzaW50NjQgc3RyaW5nIHN5bnRheCB0byB0cnVlIHVpbnQzMiAnCi0gICAgICAgICAgICArICd1aW50NjQnKSwKLSAgICAgICAgY1N0eWxlQ29tbWVudHM6IHRydWUKLSAgICAgIH0pLCBbJ3Byb3RvJ10pOwotCi0vL3RoaXJkX3BhcnR5L2phdmFzY3JpcHQvZ29vZ2xlX2NvZGVfcHJldHRpZnkvc3JjL2xhbmctc2NhbGEuanMKLS8qKgotICogQGxpY2Vuc2UgQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICogQGZpbGVvdmVydmlldwotICogUmVnaXN0ZXJzIGEgbGFuZ3VhZ2UgaGFuZGxlciBmb3IgU2NhbGEuCi0gKgotICogRGVyaXZlZCBmcm9tIGh0dHA6Ly9sYW1wc3ZuLmVwZmwuY2gvc3ZuLXJlcG9zL3NjYWxhL3NjYWxhLWRvY3VtZW50YXRpb24vdHJ1bmsvc3JjL3JlZmVyZW5jZS9TeW50YXhTdW1tYXJ5LnRleAotICoKLSAqIEBhdXRob3IgbWlrZXNhbXVlbEBnbWFpbC5jb20KLSAqLwotCi1QUlsncmVnaXN0ZXJMYW5nSGFuZGxlciddKAotICAgIFBSWydjcmVhdGVTaW1wbGVMZXhlciddKAotICAgICAgICBbCi0gICAgICAgICAvLyBXaGl0ZXNwYWNlCi0gICAgICAgICBbUFJbJ1BSX1BMQUlOJ10sICAgICAgIC9eW1x0XG5cciBceEEwXSsvLCBudWxsLCAnXHRcblxyIFx4QTAnXSwKLSAgICAgICAgIC8vIEEgZG91YmxlIG9yIHNpbmdsZSBxdW90ZWQgc3RyaW5nCi0gICAgICAgICAgLy8gb3IgYSB0cmlwbGUgZG91YmxlLXF1b3RlZCBtdWx0aS1saW5lIHN0cmluZy4KLSAgICAgICAgIFtQUlsnUFJfU1RSSU5HJ10sCi0gICAgICAgICAgL14oPzoiKD86KD86IiIoPzoiIj8oPyEiKXxbXlxcIl18XFwuKSoiezAsM30pfCg/OlteIlxyXG5cXF18XFwuKSoiPykpLywKLSAgICAgICAgICBudWxsLCAnIiddLAotICAgICAgICAgW1BSWydQUl9MSVRFUkFMJ10sICAgICAvXmAoPzpbXlxyXG5cXGBdfFxcLikqYD8vLCBudWxsLCAnYCddLAotICAgICAgICAgW1BSWydQUl9QVU5DVFVBVElPTiddLCAvXlshIyUmKCkqKyxcLTo7PD0+P0BcW1xcXF1ee3x9fl0rLywgbnVsbCwKLSAgICAgICAgICAnISMlJigpKissLTo7PD0+P0BbXFxdXnt8fX4nXQotICAgICAgICBdLAotICAgICAgICBbCi0gICAgICAgICAvLyBBIHN5bWJvbCBsaXRlcmFsIGlzIGEgc2luZ2xlIHF1b3RlIGZvbGxvd2VkIGJ5IGFuIGlkZW50aWZpZXIgd2l0aCBubwotICAgICAgICAgLy8gc2luZ2xlIHF1b3RlIGZvbGxvd2luZwotICAgICAgICAgLy8gQSBjaGFyYWN0ZXIgbGl0ZXJhbCBoYXMgc2luZ2xlIHF1b3RlcyBvbiBlaXRoZXIgc2lkZQotICAgICAgICAgW1BSWydQUl9TVFJJTkcnXSwgICAgICAvXicoPzpbXlxyXG5cXCddfFxcKD86J3xbXlxyXG4nXSspKScvXSwKLSAgICAgICAgIFtQUlsnUFJfTElURVJBTCddLCAgICAgL14nW2EtekEtWl8kXVtcdyRdKig/IVsnJFx3XSkvXSwKLSAgICAgICAgIFtQUlsnUFJfS0VZV09SRCddLCAgICAgL14oPzphYnN0cmFjdHxjYXNlfGNhdGNofGNsYXNzfGRlZnxkb3xlbHNlfGV4dGVuZHN8ZmluYWx8ZmluYWxseXxmb3J8Zm9yU29tZXxpZnxpbXBsaWNpdHxpbXBvcnR8bGF6eXxtYXRjaHxuZXd8b2JqZWN0fG92ZXJyaWRlfHBhY2thZ2V8cHJpdmF0ZXxwcm90ZWN0ZWR8cmVxdWlyZXN8cmV0dXJufHNlYWxlZHxzdXBlcnx0aHJvd3x0cmFpdHx0cnl8dHlwZXx2YWx8dmFyfHdoaWxlfHdpdGh8eWllbGQpXGIvXSwKLSAgICAgICAgIFtQUlsnUFJfTElURVJBTCddLCAgICAgL14oPzp0cnVlfGZhbHNlfG51bGx8dGhpcylcYi9dLAotICAgICAgICAgW1BSWydQUl9MSVRFUkFMJ10sICAgICAvXig/Oig/OjAoPzpbMC03XSt8WFswLTlBLUZdKykpTD98KD86KD86MHxbMS05XVswLTldKikoPzooPzpcLlswLTldKyk/KD86RVsrXC1dP1swLTldKyk/Rj98TD8pKXxcXC5bMC05XSsoPzpFWytcLV0/WzAtOV0rKT9GPykvaV0sCi0gICAgICAgICAvLyBUcmVhdCB1cHBlciBjYW1lbCBjYXNlIGlkZW50aWZpZXJzIGFzIHR5cGVzLgotICAgICAgICAgW1BSWydQUl9UWVBFJ10sICAgICAgICAvXlskX10qW0EtWl1bXyRBLVowLTldKlthLXpdW1x3JF0qL10sCi0gICAgICAgICBbUFJbJ1BSX1BMQUlOJ10sICAgICAgIC9eWyRhLXpBLVpfXVtcdyRdKi9dLAotICAgICAgICAgW1BSWydQUl9DT01NRU5UJ10sICAgICAvXlwvKD86XC8uKnxcKig/OlwvfFwqKlteKi9dKSooPzpcKitcLz8pPykvXSwKLSAgICAgICAgIFtQUlsnUFJfUFVOQ1RVQVRJT04nXSwgL14oPzpcLit8XC8pL10KLSAgICAgICAgXSksCi0gICAgWydzY2FsYSddKTsKLQotLy90aGlyZF9wYXJ0eS9qYXZhc2NyaXB0L2dvb2dsZV9jb2RlX3ByZXR0aWZ5L3NyYy9sYW5nLXNxbC5qcwotLyoqCi0gKiBAbGljZW5zZSBDb3B5cmlnaHQgKEMpIDIwMDggR29vZ2xlIEluYy4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi0vKioKLSAqIEBmaWxlb3ZlcnZpZXcKLSAqIFJlZ2lzdGVycyBhIGxhbmd1YWdlIGhhbmRsZXIgZm9yIFNRTC4KLSAqCi0gKgotICogVG8gdXNlLCBpbmNsdWRlIHByZXR0aWZ5LmpzIGFuZCB0aGlzIGZpbGUgaW4geW91ciBIVE1MIHBhZ2UuCi0gKiBUaGVuIHB1dCB5b3VyIGNvZGUgaW4gYW4gSFRNTCB0YWcgbGlrZQotICogICAgICA8cHJlIGNsYXNzPSJwcmV0dHlwcmludCBsYW5nLXNxbCI+KG15IFNRTCBjb2RlKTwvcHJlPgotICoKLSAqCi0gKiBodHRwOi8vc2F2YWdlLm5ldC5hdS9TUUwvc3FsLTk5LmJuZi5odG1sIGlzIHRoZSBiYXNpcyBmb3IgdGhlIGdyYW1tYXIsIGFuZAotICogaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L2FhMjM4NTA3KFNRTC44MCkuYXNweCBhcyB0aGUgYmFzaXMKLSAqIGZvciB0aGUga2V5d29yZCBsaXN0LgotICoKLSAqIEBhdXRob3IgbWlrZXNhbXVlbEBnbWFpbC5jb20KLSAqLwotCi1QUlsncmVnaXN0ZXJMYW5nSGFuZGxlciddKAotICAgIFBSWydjcmVhdGVTaW1wbGVMZXhlciddKAotICAgICAgICBbCi0gICAgICAgICAvLyBXaGl0ZXNwYWNlCi0gICAgICAgICBbUFJbJ1BSX1BMQUlOJ10sICAgICAgIC9eW1x0XG5cciBceEEwXSsvLCBudWxsLCAnXHRcblxyIFx4QTAnXSwKLSAgICAgICAgIC8vIEEgZG91YmxlIG9yIHNpbmdsZSBxdW90ZWQsIHBvc3NpYmx5IG11bHRpLWxpbmUsIHN0cmluZy4KLSAgICAgICAgIFtQUlsnUFJfU1RSSU5HJ10sICAgICAgL14oPzoiKD86W15cIlxcXXxcXC4pKiJ8Jyg/OlteXCdcXF18XFwuKSonKS8sIG51bGwsCi0gICAgICAgICAgJyJcJyddCi0gICAgICAgIF0sCi0gICAgICAgIFsKLSAgICAgICAgIC8vIEEgY29tbWVudCBpcyBlaXRoZXIgYSBsaW5lIGNvbW1lbnQgdGhhdCBzdGFydHMgd2l0aCB0d28gZGFzaGVzLCBvcgotICAgICAgICAgLy8gdHdvIGRhc2hlcyBwcmVjZWRpbmcgYSBsb25nIGJyYWNrZXRlZCBibG9jay4KLSAgICAgICAgIFtQUlsnUFJfQ09NTUVOVCddLCAvXig/Oi0tW15cclxuXSp8XC9cKltcc1xTXSo/KD86XCpcL3wkKSkvXSwKLSAgICAgICAgIFtQUlsnUFJfS0VZV09SRCddLCAvXig/OkFERHxBTEx8QUxURVJ8QU5EfEFOWXxBU3xBU0N8QVVUSE9SSVpBVElPTnxCQUNLVVB8QkVHSU58QkVUV0VFTnxCUkVBS3xCUk9XU0V8QlVMS3xCWXxDQVNDQURFfENBU0V8Q0hFQ0t8Q0hFQ0tQT0lOVHxDTE9TRXxDTFVTVEVSRUR8Q09BTEVTQ0V8Q09MTEFURXxDT0xVTU58Q09NTUlUfENPTVBVVEV8Q09OU1RSQUlOVHxDT05UQUlOU3xDT05UQUlOU1RBQkxFfENPTlRJTlVFfENPTlZFUlR8Q1JFQVRFfENST1NTfENVUlJFTlR8Q1VSUkVOVF9EQVRFfENVUlJFTlRfVElNRXxDVVJSRU5UX1RJTUVTVEFNUHxDVVJSRU5UX1VTRVJ8Q1VSU09SfERBVEFCQVNFfERCQ0N8REVBTExPQ0FURXxERUNMQVJFfERFRkFVTFR8REVMRVRFfERFTll8REVTQ3xESVNLfERJU1RJTkNUfERJU1RSSUJVVEVEfERPVUJMRXxEUk9QfERVTU1ZfERVTVB8RUxTRXxFTkR8RVJSTFZMfEVTQ0FQRXxFWENFUFR8RVhFQ3xFWEVDVVRFfEVYSVNUU3xFWElUfEZFVENIfEZJTEV8RklMTEZBQ1RPUnxGT1J8Rk9SRUlHTnxGUkVFVEVYVHxGUkVFVEVYVFRBQkxFfEZST018RlVMTHxGVU5DVElPTnxHT1RPfEdSQU5UfEdST1VQfEhBVklOR3xIT0xETE9DS3xJREVOVElUWXxJREVOVElUWUNPTHxJREVOVElUWV9JTlNFUlR8SUZ8SU58SU5ERVh8SU5ORVJ8SU5TRVJUfElOVEVSU0VDVHxJTlRPfElTfEpPSU58S0VZfEtJTEx8TEVGVHxMSUtFfExJTkVOT3xMT0FEfE5BVElPTkFMfE5PQ0hFQ0t8Tk9OQ0xVU1RFUkVEfE5PVHxOVUxMfE5VTExJRnxPRnxPRkZ8T0ZGU0VUU3xPTnxPUEVOfE9QRU5EQVRBU09VUkNFfE9QRU5RVUVSWXxPUEVOUk9XU0VUfE9QRU5YTUx8T1BUSU9OfE9SfE9SREVSfE9VVEVSfE9WRVJ8UEVSQ0VOVHxQTEFOfFBSRUNJU0lPTnxQUklNQVJZfFBSSU5UfFBST0N8UFJPQ0VEVVJFfFBVQkxJQ3xSQUlTRVJST1J8UkVBRHxSRUFEVEVYVHxSRUNPTkZJR1VSRXxSRUZFUkVOQ0VTfFJFUExJQ0FUSU9OfFJFU1RPUkV8UkVTVFJJQ1R8UkVUVVJOfFJFVk9LRXxSSUdIVHxST0xMQkFDS3xST1dDT1VOVHxST1dHVUlEQ09MfFJVTEV8U0FWRXxTQ0hFTUF8U0VMRUNUfFNFU1NJT05fVVNFUnxTRVR8U0VUVVNFUnxTSFVURE9XTnxTT01FfFNUQVRJU1RJQ1N8U1lTVEVNX1VTRVJ8VEFCTEV8VEVYVFNJWkV8VEhFTnxUT3xUT1B8VFJBTnxUUkFOU0FDVElPTnxUUklHR0VSfFRSVU5DQVRFfFRTRVFVQUx8VU5JT058VU5JUVVFfFVQREFURXxVUERBVEVURVhUfFVTRXxVU0VSfFZBTFVFU3xWQVJZSU5HfFZJRVd8V0FJVEZPUnxXSEVOfFdIRVJFfFdISUxFfFdJVEh8V1JJVEVURVhUKSg/PVteXHctXXwkKS9pLCBudWxsXSwKLSAgICAgICAgIC8vIEEgbnVtYmVyIGlzIGEgaGV4IGludGVnZXIgbGl0ZXJhbCwgYSBkZWNpbWFsIHJlYWwgbGl0ZXJhbCwgb3IgaW4KLSAgICAgICAgIC8vIHNjaWVudGlmaWMgbm90YXRpb24uCi0gICAgICAgICBbUFJbJ1BSX0xJVEVSQUwnXSwKLSAgICAgICAgICAvXlsrLV0/KD86MHhbXGRhLWZdK3woPzooPzpcLlxkK3xcZCsoPzpcLlxkKik/KSg/OmVbK1wtXT9cZCspPykpL2ldLAotICAgICAgICAgLy8gQW4gaWRlbnRpZmllcgotICAgICAgICAgW1BSWydQUl9QTEFJTiddLCAvXlthLXpfXVtcdy1dKi9pXSwKLSAgICAgICAgIC8vIEEgcnVuIG9mIHB1bmN0dWF0aW9uCi0gICAgICAgICBbUFJbJ1BSX1BVTkNUVUFUSU9OJ10sIC9eW15cd1x0XG5cciBceEEwXCJcJ11bXlx3XHRcblxyIFx4QTArXC1cIlwnXSovXQotICAgICAgICBdKSwKLSAgICBbJ3NxbCddKTsKLQotLy90aGlyZF9wYXJ0eS9qYXZhc2NyaXB0L2dvb2dsZV9jb2RlX3ByZXR0aWZ5L3NyYy9sYW5nLXZiLmpzCi0vKioKLSAqIEBsaWNlbnNlIENvcHlyaWdodCAoQykgMjAwOSBHb29nbGUgSW5jLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLQotLyoqCi0gKiBAZmlsZW92ZXJ2aWV3Ci0gKiBSZWdpc3RlcnMgYSBsYW5ndWFnZSBoYW5kbGVyIGZvciB2YXJpb3VzIGZsYXZvcnMgb2YgYmFzaWMuCi0gKgotICoKLSAqIFRvIHVzZSwgaW5jbHVkZSBwcmV0dGlmeS5qcyBhbmQgdGhpcyBmaWxlIGluIHlvdXIgSFRNTCBwYWdlLgotICogVGhlbiBwdXQgeW91ciBjb2RlIGluIGFuIEhUTUwgdGFnIGxpa2UKLSAqICAgICAgPHByZSBjbGFzcz0icHJldHR5cHJpbnQgbGFuZy12YiI+PC9wcmU+Ci0gKgotICoKLSAqIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9hYTcxMTYzOChWUy43MSkuYXNweCBkZWZpbmVzIHRoZQotICogdmlzdWFsIGJhc2ljIGdyYW1tYXIgbGV4aWNhbCBncmFtbWFyLgotICoKLSAqIEBhdXRob3IgbWlrZXNhbXVlbEBnbWFpbC5jb20KLSAqLwotCi1QUlsncmVnaXN0ZXJMYW5nSGFuZGxlciddKAotICAgIFBSWydjcmVhdGVTaW1wbGVMZXhlciddKAotICAgICAgICBbCi0gICAgICAgICAvLyBXaGl0ZXNwYWNlCi0gICAgICAgICBbUFJbJ1BSX1BMQUlOJ10sICAgICAgIC9eW1x0XG5cciBceEEwXHUyMDI4XHUyMDI5XSsvLCBudWxsLCAnXHRcblxyIFx4QTBcdTIwMjhcdTIwMjknXSwKLSAgICAgICAgIC8vIEEgZG91YmxlIHF1b3RlZCBzdHJpbmcgd2l0aCBxdW90ZXMgZXNjYXBlZCBieSBkb3VibGluZyB0aGVtLgotICAgICAgICAgLy8gQSBzaW5nbGUgY2hhcmFjdGVyIGNhbiBiZSBzdWZmaXhlZCB3aXRoIEMuCi0gICAgICAgICBbUFJbJ1BSX1NUUklORyddLCAgICAgIC9eKD86W1wiXHUyMDFDXHUyMDFEXSg/OlteXCJcdTIwMUNcdTIwMURdfFtcIlx1MjAxQ1x1MjAxRF17Mn0pKD86W1wiXHUyMDFDXHUyMDFEXWN8JCl8W1wiXHUyMDFDXHUyMDFEXSg/OlteXCJcdTIwMUNcdTIwMURdfFtcIlx1MjAxQ1x1MjAxRF17Mn0pKig/OltcIlx1MjAxQ1x1MjAxRF18JCkpL2ksIG51bGwsCi0gICAgICAgICAgJyJcdTIwMUNcdTIwMUQnXSwKLSAgICAgICAgIC8vIEEgY29tbWVudCBzdGFydHMgd2l0aCBhIHNpbmdsZSBxdW90ZSBhbmQgcnVucyB1bnRpbCB0aGUgZW5kIG9mIHRoZQotICAgICAgICAgLy8gbGluZS4KLSAgICAgICAgIFtQUlsnUFJfQ09NTUVOVCddLCAgICAgL15bXCdcdTIwMThcdTIwMTldW15cclxuXHUyMDI4XHUyMDI5XSovLCBudWxsLCAnXCdcdTIwMThcdTIwMTknXQotICAgICAgICBdLAotICAgICAgICBbCi0gICAgICAgICBbUFJbJ1BSX0tFWVdPUkQnXSwgL14oPzpBZGRIYW5kbGVyfEFkZHJlc3NPZnxBbGlhc3xBbmR8QW5kQWxzb3xBbnNpfEFzfEFzc2VtYmx5fEF1dG98Qm9vbGVhbnxCeVJlZnxCeXRlfEJ5VmFsfENhbGx8Q2FzZXxDYXRjaHxDQm9vbHxDQnl0ZXxDQ2hhcnxDRGF0ZXxDRGJsfENEZWN8Q2hhcnxDSW50fENsYXNzfENMbmd8Q09ianxDb25zdHxDU2hvcnR8Q1NuZ3xDU3RyfENUeXBlfERhdGV8RGVjaW1hbHxEZWNsYXJlfERlZmF1bHR8RGVsZWdhdGV8RGltfERpcmVjdENhc3R8RG98RG91YmxlfEVhY2h8RWxzZXxFbHNlSWZ8RW5kfEVuZElmfEVudW18RXJhc2V8RXJyb3J8RXZlbnR8RXhpdHxGaW5hbGx5fEZvcnxGcmllbmR8RnVuY3Rpb258R2V0fEdldFR5cGV8R29TdWJ8R29Ub3xIYW5kbGVzfElmfEltcGxlbWVudHN8SW1wb3J0c3xJbnxJbmhlcml0c3xJbnRlZ2VyfEludGVyZmFjZXxJc3xMZXR8TGlifExpa2V8TG9uZ3xMb29wfE1lfE1vZHxNb2R1bGV8TXVzdEluaGVyaXR8TXVzdE92ZXJyaWRlfE15QmFzZXxNeUNsYXNzfE5hbWVzcGFjZXxOZXd8TmV4dHxOb3R8Tm90SW5oZXJpdGFibGV8Tm90T3ZlcnJpZGFibGV8T2JqZWN0fE9ufE9wdGlvbnxPcHRpb25hbHxPcnxPckVsc2V8T3ZlcmxvYWRzfE92ZXJyaWRhYmxlfE92ZXJyaWRlc3xQYXJhbUFycmF5fFByZXNlcnZlfFByaXZhdGV8UHJvcGVydHl8UHJvdGVjdGVkfFB1YmxpY3xSYWlzZUV2ZW50fFJlYWRPbmx5fFJlRGltfFJlbW92ZUhhbmRsZXJ8UmVzdW1lfFJldHVybnxTZWxlY3R8U2V0fFNoYWRvd3N8U2hhcmVkfFNob3J0fFNpbmdsZXxTdGF0aWN8U3RlcHxTdG9wfFN0cmluZ3xTdHJ1Y3R1cmV8U3VifFN5bmNMb2NrfFRoZW58VGhyb3d8VG98VHJ5fFR5cGVPZnxVbmljb2RlfFVudGlsfFZhcmlhbnR8V2VuZHxXaGVufFdoaWxlfFdpdGh8V2l0aEV2ZW50c3xXcml0ZU9ubHl8WG9yfEVuZElmfEdvU3VifExldHxWYXJpYW50fFdlbmQpXGIvaSwgbnVsbF0sCi0gICAgICAgICAvLyBBIHNlY29uZCBjb21tZW50IGZvcm0KLSAgICAgICAgIFtQUlsnUFJfQ09NTUVOVCddLCAvXlJFTVteXHJcblx1MjAyOFx1MjAyOV0qL2ldLAotICAgICAgICAgLy8gQSBib29sZWFuLCBudW1lcmljLCBvciBkYXRlIGxpdGVyYWwuCi0gICAgICAgICBbUFJbJ1BSX0xJVEVSQUwnXSwKLSAgICAgICAgICAvXig/OlRydWVcYnxGYWxzZVxifE5vdGhpbmdcYnxcZCsoPzpFWytcLV0/XGQrW0ZSRF0/fFtGUkRTSUxdKT98KD86JkhbMC05QS1GXSt8Jk9bMC03XSspW1NJTF0/fFxkKlwuXGQrKD86RVsrXC1dP1xkKyk/W0ZSRF0/fCNccysoPzpcZCtbXC1cL11cZCtbXC1cL11cZCsoPzpccytcZCs6XGQrKD86OlxkKyk/KFxzKig/OkFNfFBNKSk/KT98XGQrOlxkKyg/OjpcZCspPyhccyooPzpBTXxQTSkpPylccysjKS9pXSwKLSAgICAgICAgIC8vIEFuIGlkZW50aWZpZXI/Ci0gICAgICAgICBbUFJbJ1BSX1BMQUlOJ10sIC9eKD86KD86W2Etel18X1x3KVx3KnxcWyg/OlthLXpdfF9cdylcdypcXSkvaV0sCi0gICAgICAgICAvLyBBIHJ1biBvZiBwdW5jdHVhdGlvbgotICAgICAgICAgW1BSWydQUl9QVU5DVFVBVElPTiddLAotICAgICAgICAgIC9eW15cd1x0XG5cciBcIlwnXFtcXVx4QTBcdTIwMThcdTIwMTlcdTIwMUNcdTIwMURcdTIwMjhcdTIwMjldKy9dLAotICAgICAgICAgLy8gU3F1YXJlIGJyYWNrZXRzCi0gICAgICAgICBbUFJbJ1BSX1BVTkNUVUFUSU9OJ10sIC9eKD86XFt8XF0pL10KLSAgICAgICAgXSksCi0gICAgWyd2YicsICd2YnMnXSk7Ci0KLS8vdGhpcmRfcGFydHkvamF2YXNjcmlwdC9nb29nbGVfY29kZV9wcmV0dGlmeS9zcmMvbGFuZy12aGRsLmpzCi0vKioKLSAqIEBmaWxlb3ZlcnZpZXcKLSAqIFJlZ2lzdGVycyBhIGxhbmd1YWdlIGhhbmRsZXIgZm9yIFZIREwgJzkzLgotICoKLSAqIEJhc2VkIG9uIHRoZSBsZXhpY2FsIGdyYW1tYXIgYW5kIGtleXdvcmRzIGF0Ci0gKiBodHRwOi8vd3d3Lmlpcy5lZS5ldGh6LmNoL356aW1taS9kb3dubG9hZC92aGRsOTNfc3ludGF4Lmh0bWwKLSAqCi0gKiBAYXV0aG9yIGJlbm9pdEByeWRlci5mcgotICovCi0KLVBSWydyZWdpc3RlckxhbmdIYW5kbGVyJ10oCi0gICAgUFJbJ2NyZWF0ZVNpbXBsZUxleGVyJ10oCi0gICAgICAgIFsKLSAgICAgICAgIC8vIFdoaXRlc3BhY2UKLSAgICAgICAgIFtQUlsnUFJfUExBSU4nXSwgL15bXHRcblxyIFx4QTBdKy8sIG51bGwsICdcdFxuXHIgXHhBMCddCi0gICAgICAgIF0sCi0gICAgICAgIFsKLSAgICAgICAgIC8vIFN0cmluZywgY2hhcmFjdGVyIG9yIGJpdCBzdHJpbmcKLSAgICAgICAgIFtQUlsnUFJfU1RSSU5HJ10sIC9eKD86W0JPWF0/Iig/OlteXCJdfCIiKSoifCcuJykvaV0sCi0gICAgICAgICAvLyBDb21tZW50LCBmcm9tIHR3byBkYXNoZXMgdW50aWwgZW5kIG9mIGxpbmUuCi0gICAgICAgICBbUFJbJ1BSX0NPTU1FTlQnXSwgL14tLVteXHJcbl0qL10sCi0gICAgICAgICBbUFJbJ1BSX0tFWVdPUkQnXSwgL14oPzphYnN8YWNjZXNzfGFmdGVyfGFsaWFzfGFsbHxhbmR8YXJjaGl0ZWN0dXJlfGFycmF5fGFzc2VydHxhdHRyaWJ1dGV8YmVnaW58YmxvY2t8Ym9keXxidWZmZXJ8YnVzfGNhc2V8Y29tcG9uZW50fGNvbmZpZ3VyYXRpb258Y29uc3RhbnR8ZGlzY29ubmVjdHxkb3dudG98ZWxzZXxlbHNpZnxlbmR8ZW50aXR5fGV4aXR8ZmlsZXxmb3J8ZnVuY3Rpb258Z2VuZXJhdGV8Z2VuZXJpY3xncm91cHxndWFyZGVkfGlmfGltcHVyZXxpbnxpbmVydGlhbHxpbm91dHxpc3xsYWJlbHxsaWJyYXJ5fGxpbmthZ2V8bGl0ZXJhbHxsb29wfG1hcHxtb2R8bmFuZHxuZXd8bmV4dHxub3J8bm90fG51bGx8b2Z8b258b3BlbnxvcnxvdGhlcnN8b3V0fHBhY2thZ2V8cG9ydHxwb3N0cG9uZWR8cHJvY2VkdXJlfHByb2Nlc3N8cHVyZXxyYW5nZXxyZWNvcmR8cmVnaXN0ZXJ8cmVqZWN0fHJlbXxyZXBvcnR8cmV0dXJufHJvbHxyb3J8c2VsZWN0fHNldmVyaXR5fHNoYXJlZHxzaWduYWx8c2xhfHNsbHxzcmF8c3JsfHN1YnR5cGV8dGhlbnx0b3x0cmFuc3BvcnR8dHlwZXx1bmFmZmVjdGVkfHVuaXRzfHVudGlsfHVzZXx2YXJpYWJsZXx3YWl0fHdoZW58d2hpbGV8d2l0aHx4bm9yfHhvcikoPz1bXlx3LV18JCkvaSwgbnVsbF0sCi0gICAgICAgICAvLyBUeXBlLCBwcmVkZWZpbmVkIG9yIHN0YW5kYXJkCi0gICAgICAgICBbUFJbJ1BSX1RZUEUnXSwgL14oPzpiaXR8Yml0X3ZlY3RvcnxjaGFyYWN0ZXJ8Ym9vbGVhbnxpbnRlZ2VyfHJlYWx8dGltZXxzdHJpbmd8c2V2ZXJpdHlfbGV2ZWx8cG9zaXRpdmV8bmF0dXJhbHxzaWduZWR8dW5zaWduZWR8bGluZXx0ZXh0fHN0ZF91P2xvZ2ljKD86X3ZlY3Rvcik/KSg/PVteXHctXXwkKS9pLCBudWxsXSwKLSAgICAgICAgIC8vIFByZWRlZmluZWQgYXR0cmlidXRlcwotICAgICAgICAgW1BSWydQUl9UWVBFJ10sIC9eXCcoPzpBQ1RJVkV8QVNDRU5ESU5HfEJBU0V8REVMQVlFRHxEUklWSU5HfERSSVZJTkdfVkFMVUV8RVZFTlR8SElHSHxJTUFHRXxJTlNUQU5DRV9OQU1FfExBU1RfQUNUSVZFfExBU1RfRVZFTlR8TEFTVF9WQUxVRXxMRUZUfExFRlRPRnxMRU5HVEh8TE9XfFBBVEhfTkFNRXxQT1N8UFJFRHxRVUlFVHxSQU5HRXxSRVZFUlNFX1JBTkdFfFJJR0hUfFJJR0hUT0Z8U0lNUExFX05BTUV8U1RBQkxFfFNVQ0N8VFJBTlNBQ1RJT058VkFMfFZBTFVFKSg/PVteXHctXXwkKS9pLCBudWxsXSwKLSAgICAgICAgIC8vIE51bWJlciwgZGVjaW1hbCBvciBiYXNlZCBsaXRlcmFsCi0gICAgICAgICBbUFJbJ1BSX0xJVEVSQUwnXSwgL15cZCsoPzpfXGQrKSooPzojW1x3XFwuXSsjKD86WytcLV0/XGQrKD86X1xkKykqKT98KD86XC5cZCsoPzpfXGQrKSopPyg/OkVbK1wtXT9cZCsoPzpfXGQrKSopPykvaV0sCi0gICAgICAgICAvLyBJZGVudGlmaWVyLCBiYXNpYyBvciBleHRlbmRlZAotICAgICAgICAgW1BSWydQUl9QTEFJTiddLCAvXig/OlthLXpdXHcqfFxcW15cXF0qXFwpL2ldLAotICAgICAgICAgLy8gUHVuY3R1YXRpb24KLSAgICAgICAgIFtQUlsnUFJfUFVOQ1RVQVRJT04nXSwgL15bXlx3XHRcblxyIFx4QTBcIlwnXVteXHdcdFxuXHIgXHhBMFwtXCJcJ10qL10KLSAgICAgICAgXSksCi0gICAgWyd2aGRsJywgJ3ZoZCddKTsKLQotLy90aGlyZF9wYXJ0eS9qYXZhc2NyaXB0L2dvb2dsZV9jb2RlX3ByZXR0aWZ5L3NyYy9sYW5nLXdpa2kuanMKLS8qKgotICogQGxpY2Vuc2UgQ29weXJpZ2h0IChDKSAyMDA5IEdvb2dsZSBJbmMuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICogQGZpbGVvdmVydmlldwotICogUmVnaXN0ZXJzIGEgbGFuZ3VhZ2UgaGFuZGxlciBmb3IgV2lraSBwYWdlcy4KLSAqCi0gKiBCYXNlZCBvbiBXaWtpU3ludGF4IGF0IGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9zdXBwb3J0L3dpa2kvV2lraVN5bnRheAotICoKLSAqIEBhdXRob3IgbWlrZXNhbXVlbEBnbWFpbC5jb20KLSAqLwotCi1QUlsncmVnaXN0ZXJMYW5nSGFuZGxlciddKAotICAgIFBSWydjcmVhdGVTaW1wbGVMZXhlciddKAotICAgICAgICBbCi0gICAgICAgICAvLyBXaGl0ZXNwYWNlCi0gICAgICAgICBbUFJbJ1BSX1BMQUlOJ10sICAgICAgIC9eW1x0IFx4QTBhLWdpLXowLTldKy8sIG51bGwsCi0gICAgICAgICAgJ1x0IFx4QTBhYmNkZWZnaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSddLAotICAgICAgICAgLy8gV2lraSBmb3JtYXR0aW5nCi0gICAgICAgICBbUFJbJ1BSX1BVTkNUVUFUSU9OJ10sIC9eWz0qflxeXFtcXV0rLywgbnVsbCwgJz0qfl5bXSddCi0gICAgICAgIF0sCi0gICAgICAgIFsKLSAgICAgICAgIC8vIE1ldGEtaW5mbyBsaWtlICNzdW1tYXJ5LCAjbGFiZWxzLCBldGMuCi0gICAgICAgICBbJ2xhbmctd2lraS5tZXRhJywgIC8oPzpeXnxcclxuP3xcbikoI1thLXpdKylcYi9dLAotICAgICAgICAgLy8gQSBXaWtpV29yZAotICAgICAgICAgW1BSWydQUl9MSVRFUkFMJ10sICAgICAvXig/OltBLVpdW2Etel1bYS16MC05XStbQS1aXVthLXpdW2EtekEtWjAtOV0rKVxiLwotICAgICAgICAgIF0sCi0gICAgICAgICAvLyBBIHByZWZvcm1hdHRlZCBibG9jayBpbiBhbiB1bmtub3duIGxhbmd1YWdlCi0gICAgICAgICBbJ2xhbmctJywgICAgICAgICAgIC9eXHtce1x7KFtcc1xTXSs/KVx9XH1cfS9dLAotICAgICAgICAgLy8gQSBibG9jayBvZiBzb3VyY2UgY29kZSBpbiBhbiB1bmtub3duIGxhbmd1YWdlCi0gICAgICAgICBbJ2xhbmctJywgICAgICAgICAgIC9eYChbXlxyXG5gXSspYC9dLAotICAgICAgICAgLy8gQW4gaW5saW5lIFVSTC4KLSAgICAgICAgIFtQUlsnUFJfU1RSSU5HJ10sCi0gICAgICAgICAgL15odHRwcz86XC9cL1teXC8/I1xzXSooPzpcL1tePyNcc10qKT8oPzpcP1teI1xzXSopPyg/OiNcUyopPy9pXSwKLSAgICAgICAgIFtQUlsnUFJfUExBSU4nXSwgICAgICAgL14oPzpcclxufFtcc1xTXSlbXiM9Kn5eQS1aaFx7YFxbXHJcbl0qL10KLSAgICAgICAgXSksCi0gICAgWyd3aWtpJ10pOwotCi1QUlsncmVnaXN0ZXJMYW5nSGFuZGxlciddKAotICAgIFBSWydjcmVhdGVTaW1wbGVMZXhlciddKFtbUFJbJ1BSX0tFWVdPUkQnXSwgL14jW2Etel0rL2ksIG51bGwsICcjJ11dLCBbXSksCi0gICAgWyd3aWtpLm1ldGEnXSk7Ci0KLS8vdGhpcmRfcGFydHkvamF2YXNjcmlwdC9nb29nbGVfY29kZV9wcmV0dGlmeS9zcmMvbGFuZy15YW1sLmpzCi0vKiogQ29udHJpYnV0ZWQgYnkgcmlicmRiIEAgY29kZS5nb29nbGUuY29tCi0gKi8KLQotLyoqCi0gKiBAZmlsZW92ZXJ2aWV3Ci0gKiBSZWdpc3RlcnMgYSBsYW5ndWFnZSBoYW5kbGVyIGZvciBZQU1MLgotICoKLSAqIEBhdXRob3IgcmlicmRiCi0gKi8KLQotUFJbJ3JlZ2lzdGVyTGFuZ0hhbmRsZXInXSgKLSAgUFJbJ2NyZWF0ZVNpbXBsZUxleGVyJ10oCi0gICAgWwotICAgICAgW1BSWydQUl9QVU5DVFVBVElPTiddLCAvXls6fD4/XSsvLCBudWxsLCAnOnw+PyddLAotICAgICAgW1BSWydQUl9ERUNMQVJBVElPTiddLCAgL14lKD86WUFNTHxUQUcpW14jXHJcbl0rLywgbnVsbCwgJyUnXSwKLSAgICAgIFtQUlsnUFJfVFlQRSddLCAvXlsmXVxTKy8sIG51bGwsICcmJ10sCi0gICAgICBbUFJbJ1BSX1RZUEUnXSwgL14hXFMqLywgbnVsbCwgJyEnXSwKLSAgICAgIFtQUlsnUFJfU1RSSU5HJ10sIC9eIig/OlteXFwiXXxcXC4pKig/OiJ8JCkvLCBudWxsLCAnIiddLAotICAgICAgW1BSWydQUl9TVFJJTkcnXSwgL14nKD86W14nXXwnJykqKD86J3wkKS8sIG51bGwsICInIl0sCi0gICAgICBbUFJbJ1BSX0NPTU1FTlQnXSwgL14jW15cclxuXSovLCBudWxsLCAnIyddLAotICAgICAgW1BSWydQUl9QTEFJTiddLCAvXlxzKy8sIG51bGwsICcgXHRcclxuJ10KLSAgICBdLAotICAgIFsKLSAgICAgIFtQUlsnUFJfREVDTEFSQVRJT04nXSwgL14oPzotLS18XC5cLlwuKSg/OltcclxuXXwkKS9dLAotICAgICAgW1BSWydQUl9QVU5DVFVBVElPTiddLCAvXi0vXSwKLSAgICAgIFtQUlsnUFJfS0VZV09SRCddLCAvXlx3KzpbIFxyXG5dL10sCi0gICAgICBbUFJbJ1BSX1BMQUlOJ10sIC9eXHcrL10KLSAgICBdKSwgWyd5YW1sJywgJ3ltbCddKTsKLQotLy90aGlyZF9wYXJ0eS9qYXZhc2NyaXB0L2pxdWVyeS92MV83XzIvanF1ZXJ5LTEuNy4yLm1pbi5qcwotLyoqCi0gKiBAbGljZW5zZSBqUXVlcnkgSmF2YVNjcmlwdCBMaWJyYXJ5IHYxLjcuMgotICogaHR0cDovL2pxdWVyeS5jb20vCi0gKgotICogQ29weXJpZ2h0IDIwMTEsIEpvaG4gUmVzaWcKLSAqIER1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBvciBHUEwgVmVyc2lvbiAyIGxpY2Vuc2VzLgotICogaHR0cDovL2pxdWVyeS5vcmcvbGljZW5zZQotICoKLSAqIEluY2x1ZGVzIFNpenpsZS5qcwotICogaHR0cDovL3NpenpsZWpzLmNvbS8KLSAqIENvcHlyaWdodCAyMDExLCBUaGUgRG9qbyBGb3VuZGF0aW9uCi0gKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlULCBCU0QsIGFuZCBHUEwgTGljZW5zZXMuCi0gKgotICogRGF0ZTogV2VkIE1hciAyMSAxMjo0NjozNCAyMDEyIC0wNzAwCi0gKi8KLShmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGN5KGEpe3JldHVybiBmLmlzV2luZG93KGEpP2E6YS5ub2RlVHlwZT09PTk/YS5kZWZhdWx0Vmlld3x8YS5wYXJlbnRXaW5kb3c6ITF9ZnVuY3Rpb24gY3UoYSl7aWYoIWNqW2FdKXt2YXIgYj1jLmJvZHksZD1mKCI8IithKyI+IikuYXBwZW5kVG8oYiksZT1kLmNzcygiZGlzcGxheSIpO2QucmVtb3ZlKCk7aWYoZT09PSJub25lInx8ZT09PSIiKXtja3x8KGNrPWMuY3JlYXRlRWxlbWVudCgiaWZyYW1lIiksY2suZnJhbWVCb3JkZXI9Y2sud2lkdGg9Y2suaGVpZ2h0PTApLGIuYXBwZW5kQ2hpbGQoY2spO2lmKCFjbHx8IWNrLmNyZWF0ZUVsZW1lbnQpY2w9KGNrLmNvbnRlbnRXaW5kb3d8fGNrLmNvbnRlbnREb2N1bWVudCkuZG9jdW1lbnQsY2wud3JpdGUoKGYuc3VwcG9ydC5ib3hNb2RlbD8iPCFkb2N0eXBlIGh0bWw+IjoiIikrIjxodG1sPjxib2R5PiIpLGNsLmNsb3NlKCk7ZD1jbC5jcmVhdGVFbGVtZW50KGEpLGNsLmJvZHkuYXBwZW5kQ2hpbGQoZCksZT1mLmNzcyhkLCJkaXNwbGF5IiksYi5yZW1vdmVDaGlsZChjayl9Y2pbYV09ZX1yZXR1cm4gY2pbYV19ZnVuY3Rpb24gY3QoYSxiKXt2YXIgYz17fTtmLmVhY2goY3AuY29uY2F0LmFwcGx5KFtdLGNwLnNsaWNlKDAsYikpLGZ1bmN0aW9uKCl7Y1t0aGlzXT1hfSk7cmV0dXJuIGN9ZnVuY3Rpb24gY3MoKXtjcT1ifWZ1bmN0aW9uIGNyKCl7c2V0VGltZW91dChjcywwKTtyZXR1cm4gY3E9Zi5ub3coKX1mdW5jdGlvbiBjaSgpe3RyeXtyZXR1cm4gbmV3IGEuQWN0aXZlWE9iamVjdCgiTWljcm9zb2Z0LlhNTEhUVFAiKX1jYXRjaChiKXt9fWZ1bmN0aW9uIGNoKCl7dHJ5e3JldHVybiBuZXcgYS5YTUxIdHRwUmVxdWVzdH1jYXRjaChiKXt9fWZ1bmN0aW9uIGNiKGEsYyl7YS5kYXRhRmlsdGVyJiYoYz1hLmRhdGFGaWx0ZXIoYyxhLmRhdGFUeXBlKSk7dmFyIGQ9YS5kYXRhVHlwZXMsZT17fSxnLGgsaT1kLmxlbmd0aCxqLGs9ZFswXSxsLG0sbixvLHA7Zm9yKGc9MTtnPGk7ZysrKXtpZihnPT09MSlmb3IoaCBpbiBhLmNvbnZlcnRlcnMpdHlwZW9mIGg9PSJzdHJpbmciJiYoZVtoLnRvTG93ZXJDYXNlKCldPWEuY29udmVydGVyc1toXSk7bD1rLGs9ZFtnXTtpZihrPT09IioiKWs9bDtlbHNlIGlmKGwhPT0iKiImJmwhPT1rKXttPWwrIiAiK2ssbj1lW21dfHxlWyIqICIra107aWYoIW4pe3A9Yjtmb3IobyBpbiBlKXtqPW8uc3BsaXQoIiAiKTtpZihqWzBdPT09bHx8alswXT09PSIqIil7cD1lW2pbMV0rIiAiK2tdO2lmKHApe289ZVtvXSxvPT09ITA/bj1wOnA9PT0hMCYmKG49byk7YnJlYWt9fX19IW4mJiFwJiZmLmVycm9yKCJObyBjb252ZXJzaW9uIGZyb20gIittLnJlcGxhY2UoIiAiLCIgdG8gIikpLG4hPT0hMCYmKGM9bj9uKGMpOnAobyhjKSkpfX1yZXR1cm4gY31mdW5jdGlvbiBjYShhLGMsZCl7dmFyIGU9YS5jb250ZW50cyxmPWEuZGF0YVR5cGVzLGc9YS5yZXNwb25zZUZpZWxkcyxoLGksaixrO2ZvcihpIGluIGcpaSBpbiBkJiYoY1tnW2ldXT1kW2ldKTt3aGlsZShmWzBdPT09IioiKWYuc2hpZnQoKSxoPT09YiYmKGg9YS5taW1lVHlwZXx8Yy5nZXRSZXNwb25zZUhlYWRlcigiY29udGVudC10eXBlIikpO2lmKGgpZm9yKGkgaW4gZSlpZihlW2ldJiZlW2ldLnRlc3QoaCkpe2YudW5zaGlmdChpKTticmVha31pZihmWzBdaW4gZClqPWZbMF07ZWxzZXtmb3IoaSBpbiBkKXtpZighZlswXXx8YS5jb252ZXJ0ZXJzW2krIiAiK2ZbMF1dKXtqPWk7YnJlYWt9a3x8KGs9aSl9aj1qfHxrfWlmKGope2ohPT1mWzBdJiZmLnVuc2hpZnQoaik7cmV0dXJuIGRbal19fWZ1bmN0aW9uIGJfKGEsYixjLGQpe2lmKGYuaXNBcnJheShiKSlmLmVhY2goYixmdW5jdGlvbihiLGUpe2N8fGJELnRlc3QoYSk/ZChhLGUpOmJfKGErIlsiKyh0eXBlb2YgZT09Im9iamVjdCI/YjoiIikrIl0iLGUsYyxkKX0pO2Vsc2UgaWYoIWMmJmYudHlwZShiKT09PSJvYmplY3QiKWZvcih2YXIgZSBpbiBiKWJfKGErIlsiK2UrIl0iLGJbZV0sYyxkKTtlbHNlIGQoYSxiKX1mdW5jdGlvbiBiJChhLGMpe3ZhciBkLGUsZz1mLmFqYXhTZXR0aW5ncy5mbGF0T3B0aW9uc3x8e307Zm9yKGQgaW4gYyljW2RdIT09YiYmKChnW2RdP2E6ZXx8KGU9e30pKVtkXT1jW2RdKTtlJiZmLmV4dGVuZCghMCxhLGUpfWZ1bmN0aW9uIGJaKGEsYyxkLGUsZixnKXtmPWZ8fGMuZGF0YVR5cGVzWzBdLGc9Z3x8e30sZ1tmXT0hMDt2YXIgaD1hW2ZdLGk9MCxqPWg/aC5sZW5ndGg6MCxrPWE9PT1iUyxsO2Zvcig7aTxqJiYoa3x8IWwpO2krKylsPWhbaV0oYyxkLGUpLHR5cGVvZiBsPT0ic3RyaW5nIiYmKCFrfHxnW2xdP2w9YjooYy5kYXRhVHlwZXMudW5zaGlmdChsKSxsPWJaKGEsYyxkLGUsbCxnKSkpOyhrfHwhbCkmJiFnWyIqIl0mJihsPWJaKGEsYyxkLGUsIioiLGcpKTtyZXR1cm4gbH1mdW5jdGlvbiBiWShhKXtyZXR1cm4gZnVuY3Rpb24oYixjKXt0eXBlb2YgYiE9InN0cmluZyImJihjPWIsYj0iKiIpO2lmKGYuaXNGdW5jdGlvbihjKSl7dmFyIGQ9Yi50b0xvd2VyQ2FzZSgpLnNwbGl0KGJPKSxlPTAsZz1kLmxlbmd0aCxoLGksajtmb3IoO2U8ZztlKyspaD1kW2VdLGo9L15cKy8udGVzdChoKSxqJiYoaD1oLnN1YnN0cigxKXx8IioiKSxpPWFbaF09YVtoXXx8W10saVtqPyJ1bnNoaWZ0IjoicHVzaCJdKGMpfX19ZnVuY3Rpb24gYkIoYSxiLGMpe3ZhciBkPWI9PT0id2lkdGgiP2Eub2Zmc2V0V2lkdGg6YS5vZmZzZXRIZWlnaHQsZT1iPT09IndpZHRoIj8xOjAsZz00O2lmKGQ+MCl7aWYoYyE9PSJib3JkZXIiKWZvcig7ZTxnO2UrPTIpY3x8KGQtPXBhcnNlRmxvYXQoZi5jc3MoYSwicGFkZGluZyIrYnhbZV0pKXx8MCksYz09PSJtYXJnaW4iP2QrPXBhcnNlRmxvYXQoZi5jc3MoYSxjK2J4W2VdKSl8fDA6ZC09cGFyc2VGbG9hdChmLmNzcyhhLCJib3JkZXIiK2J4W2VdKyJXaWR0aCIpKXx8MDtyZXR1cm4gZCsicHgifWQ9YnkoYSxiKTtpZihkPDB8fGQ9PW51bGwpZD1hLnN0eWxlW2JdO2lmKGJ0LnRlc3QoZCkpcmV0dXJuIGQ7ZD1wYXJzZUZsb2F0KGQpfHwwO2lmKGMpZm9yKDtlPGc7ZSs9MilkKz1wYXJzZUZsb2F0KGYuY3NzKGEsInBhZGRpbmciK2J4W2VdKSl8fDAsYyE9PSJwYWRkaW5nIiYmKGQrPXBhcnNlRmxvYXQoZi5jc3MoYSwiYm9yZGVyIitieFtlXSsiV2lkdGgiKSl8fDApLGM9PT0ibWFyZ2luIiYmKGQrPXBhcnNlRmxvYXQoZi5jc3MoYSxjK2J4W2VdKSl8fDApO3JldHVybiBkKyJweCJ9ZnVuY3Rpb24gYm8oYSl7dmFyIGI9Yy5jcmVhdGVFbGVtZW50KCJkaXYiKTtiaC5hcHBlbmRDaGlsZChiKSxiLmlubmVySFRNTD1hLm91dGVySFRNTDtyZXR1cm4gYi5maXJzdENoaWxkfWZ1bmN0aW9uIGJuKGEpe3ZhciBiPShhLm5vZGVOYW1lfHwiIikudG9Mb3dlckNhc2UoKTtiPT09ImlucHV0Ij9ibShhKTpiIT09InNjcmlwdCImJnR5cGVvZiBhLmdldEVsZW1lbnRzQnlUYWdOYW1lIT0idW5kZWZpbmVkIiYmZi5ncmVwKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlucHV0IiksYm0pfWZ1bmN0aW9uIGJtKGEpe2lmKGEudHlwZT09PSJjaGVja2JveCJ8fGEudHlwZT09PSJyYWRpbyIpYS5kZWZhdWx0Q2hlY2tlZD1hLmNoZWNrZWR9ZnVuY3Rpb24gYmwoYSl7cmV0dXJuIHR5cGVvZiBhLmdldEVsZW1lbnRzQnlUYWdOYW1lIT0idW5kZWZpbmVkIj9hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIik6dHlwZW9mIGEucXVlcnlTZWxlY3RvckFsbCE9InVuZGVmaW5lZCI/YS5xdWVyeVNlbGVjdG9yQWxsKCIqIik6W119ZnVuY3Rpb24gYmsoYSxiKXt2YXIgYztiLm5vZGVUeXBlPT09MSYmKGIuY2xlYXJBdHRyaWJ1dGVzJiZiLmNsZWFyQXR0cmlidXRlcygpLGIubWVyZ2VBdHRyaWJ1dGVzJiZiLm1lcmdlQXR0cmlidXRlcyhhKSxjPWIubm9kZU5hbWUudG9Mb3dlckNhc2UoKSxjPT09Im9iamVjdCI/Yi5vdXRlckhUTUw9YS5vdXRlckhUTUw6YyE9PSJpbnB1dCJ8fGEudHlwZSE9PSJjaGVja2JveCImJmEudHlwZSE9PSJyYWRpbyI/Yz09PSJvcHRpb24iP2Iuc2VsZWN0ZWQ9YS5kZWZhdWx0U2VsZWN0ZWQ6Yz09PSJpbnB1dCJ8fGM9PT0idGV4dGFyZWEiP2IuZGVmYXVsdFZhbHVlPWEuZGVmYXVsdFZhbHVlOmM9PT0ic2NyaXB0IiYmYi50ZXh0IT09YS50ZXh0JiYoYi50ZXh0PWEudGV4dCk6KGEuY2hlY2tlZCYmKGIuZGVmYXVsdENoZWNrZWQ9Yi5jaGVja2VkPWEuY2hlY2tlZCksYi52YWx1ZSE9PWEudmFsdWUmJihiLnZhbHVlPWEudmFsdWUpKSxiLnJlbW92ZUF0dHJpYnV0ZShmLmV4cGFuZG8pLGIucmVtb3ZlQXR0cmlidXRlKCJfc3VibWl0X2F0dGFjaGVkIiksYi5yZW1vdmVBdHRyaWJ1dGUoIl9jaGFuZ2VfYXR0YWNoZWQiKSl9ZnVuY3Rpb24gYmooYSxiKXtpZihiLm5vZGVUeXBlPT09MSYmISFmLmhhc0RhdGEoYSkpe3ZhciBjLGQsZSxnPWYuX2RhdGEoYSksaD1mLl9kYXRhKGIsZyksaT1nLmV2ZW50cztpZihpKXtkZWxldGUgaC5oYW5kbGUsaC5ldmVudHM9e307Zm9yKGMgaW4gaSlmb3IoZD0wLGU9aVtjXS5sZW5ndGg7ZDxlO2QrKylmLmV2ZW50LmFkZChiLGMsaVtjXVtkXSl9aC5kYXRhJiYoaC5kYXRhPWYuZXh0ZW5kKHt9LGguZGF0YSkpfX1mdW5jdGlvbiBiaShhLGIpe3JldHVybiBmLm5vZGVOYW1lKGEsInRhYmxlIik/YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGJvZHkiKVswXXx8YS5hcHBlbmRDaGlsZChhLm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGJvZHkiKSk6YX1mdW5jdGlvbiBVKGEpe3ZhciBiPVYuc3BsaXQoInwiKSxjPWEuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO2lmKGMuY3JlYXRlRWxlbWVudCl3aGlsZShiLmxlbmd0aCljLmNyZWF0ZUVsZW1lbnQoYi5wb3AoKSk7cmV0dXJuIGN9ZnVuY3Rpb24gVChhLGIsYyl7Yj1ifHwwO2lmKGYuaXNGdW5jdGlvbihiKSlyZXR1cm4gZi5ncmVwKGEsZnVuY3Rpb24oYSxkKXt2YXIgZT0hIWIuY2FsbChhLGQsYSk7cmV0dXJuIGU9PT1jfSk7aWYoYi5ub2RlVHlwZSlyZXR1cm4gZi5ncmVwKGEsZnVuY3Rpb24oYSxkKXtyZXR1cm4gYT09PWI9PT1jfSk7aWYodHlwZW9mIGI9PSJzdHJpbmciKXt2YXIgZD1mLmdyZXAoYSxmdW5jdGlvbihhKXtyZXR1cm4gYS5ub2RlVHlwZT09PTF9KTtpZihPLnRlc3QoYikpcmV0dXJuIGYuZmlsdGVyKGIsZCwhYyk7Yj1mLmZpbHRlcihiLGQpfXJldHVybiBmLmdyZXAoYSxmdW5jdGlvbihhLGQpe3JldHVybiBmLmluQXJyYXkoYSxiKT49MD09PWN9KX1mdW5jdGlvbiBTKGEpe3JldHVybiFhfHwhYS5wYXJlbnROb2RlfHxhLnBhcmVudE5vZGUubm9kZVR5cGU9PT0xMX1mdW5jdGlvbiBLKCl7cmV0dXJuITB9ZnVuY3Rpb24gSigpe3JldHVybiExfWZ1bmN0aW9uIG4oYSxiLGMpe3ZhciBkPWIrImRlZmVyIixlPWIrInF1ZXVlIixnPWIrIm1hcmsiLGg9Zi5fZGF0YShhLGQpO2gmJihjPT09InF1ZXVlInx8IWYuX2RhdGEoYSxlKSkmJihjPT09Im1hcmsifHwhZi5fZGF0YShhLGcpKSYmc2V0VGltZW91dChmdW5jdGlvbigpeyFmLl9kYXRhKGEsZSkmJiFmLl9kYXRhKGEsZykmJihmLnJlbW92ZURhdGEoYSxkLCEwKSxoLmZpcmUoKSl9LDApfWZ1bmN0aW9uIG0oYSl7Zm9yKHZhciBiIGluIGEpe2lmKGI9PT0iZGF0YSImJmYuaXNFbXB0eU9iamVjdChhW2JdKSljb250aW51ZTtpZihiIT09InRvSlNPTiIpcmV0dXJuITF9cmV0dXJuITB9ZnVuY3Rpb24gbChhLGMsZCl7aWYoZD09PWImJmEubm9kZVR5cGU9PT0xKXt2YXIgZT0iZGF0YS0iK2MucmVwbGFjZShrLCItJDEiKS50b0xvd2VyQ2FzZSgpO2Q9YS5nZXRBdHRyaWJ1dGUoZSk7aWYodHlwZW9mIGQ9PSJzdHJpbmciKXt0cnl7ZD1kPT09InRydWUiPyEwOmQ9PT0iZmFsc2UiPyExOmQ9PT0ibnVsbCI/bnVsbDpmLmlzTnVtZXJpYyhkKT8rZDpqLnRlc3QoZCk/Zi5wYXJzZUpTT04oZCk6ZH1jYXRjaChnKXt9Zi5kYXRhKGEsYyxkKX1lbHNlIGQ9Yn1yZXR1cm4gZH1mdW5jdGlvbiBoKGEpe3ZhciBiPWdbYV09e30sYyxkO2E9YS5zcGxpdCgvXHMrLyk7Zm9yKGM9MCxkPWEubGVuZ3RoO2M8ZDtjKyspYlthW2NdXT0hMDtyZXR1cm4gYn12YXIgYz1hLmRvY3VtZW50LGQ9YS5uYXZpZ2F0b3IsZT1hLmxvY2F0aW9uLGY9ZnVuY3Rpb24oKXtmdW5jdGlvbiBKKCl7aWYoIWUuaXNSZWFkeSl7dHJ5e2MuZG9jdW1lbnRFbGVtZW50LmRvU2Nyb2xsKCJsZWZ0Iil9Y2F0Y2goYSl7c2V0VGltZW91dChKLDEpO3JldHVybn1lLnJlYWR5KCl9fXZhciBlPWZ1bmN0aW9uKGEsYil7cmV0dXJuIG5ldyBlLmZuLmluaXQoYSxiLGgpfSxmPWEualF1ZXJ5LGc9YS4kLGgsaT0vXig/OlteIzxdKig8W1x3XFddKz4pW14+XSokfCMoW1x3XC1dKikkKS8saj0vXFMvLGs9L15ccysvLGw9L1xzKyQvLG09L148KFx3KylccypcLz8+KD86PFwvXDE+KT8kLyxuPS9eW1xdLDp7fVxzXSokLyxvPS9cXCg/OlsiXFxcL2JmbnJ0XXx1WzAtOWEtZkEtRl17NH0pL2cscD0vIlteIlxcXG5ccl0qInx0cnVlfGZhbHNlfG51bGx8LT9cZCsoPzpcLlxkKik/KD86W2VFXVsrXC1dP1xkKyk/L2cscT0vKD86Xnw6fCwpKD86XHMqXFspKy9nLHI9Lyh3ZWJraXQpWyBcL10oW1x3Ll0rKS8scz0vKG9wZXJhKSg/Oi4qdmVyc2lvbik/WyBcL10oW1x3Ll0rKS8sdD0vKG1zaWUpIChbXHcuXSspLyx1PS8obW96aWxsYSkoPzouKj8gcnY6KFtcdy5dKykpPy8sdj0vLShbYS16XXxbMC05XSkvaWcsdz0vXi1tcy0vLHg9ZnVuY3Rpb24oYSxiKXtyZXR1cm4oYisiIikudG9VcHBlckNhc2UoKX0seT1kLnVzZXJBZ2VudCx6LEEsQixDPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsRD1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LEU9QXJyYXkucHJvdG90eXBlLnB1c2gsRj1BcnJheS5wcm90b3R5cGUuc2xpY2UsRz1TdHJpbmcucHJvdG90eXBlLnRyaW0sSD1BcnJheS5wcm90b3R5cGUuaW5kZXhPZixJPXt9O2UuZm49ZS5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOmUsaW5pdDpmdW5jdGlvbihhLGQsZil7dmFyIGcsaCxqLGs7aWYoIWEpcmV0dXJuIHRoaXM7aWYoYS5ub2RlVHlwZSl7dGhpcy5jb250ZXh0PXRoaXNbMF09YSx0aGlzLmxlbmd0aD0xO3JldHVybiB0aGlzfWlmKGE9PT0iYm9keSImJiFkJiZjLmJvZHkpe3RoaXMuY29udGV4dD1jLHRoaXNbMF09Yy5ib2R5LHRoaXMuc2VsZWN0b3I9YSx0aGlzLmxlbmd0aD0xO3JldHVybiB0aGlzfWlmKHR5cGVvZiBhPT0ic3RyaW5nIil7YS5jaGFyQXQoMCkhPT0iPCJ8fGEuY2hhckF0KGEubGVuZ3RoLTEpIT09Ij4ifHxhLmxlbmd0aDwzP2c9aS5leGVjKGEpOmc9W251bGwsYSxudWxsXTtpZihnJiYoZ1sxXXx8IWQpKXtpZihnWzFdKXtkPWQgaW5zdGFuY2VvZiBlP2RbMF06ZCxrPWQ/ZC5vd25lckRvY3VtZW50fHxkOmMsaj1tLmV4ZWMoYSksaj9lLmlzUGxhaW5PYmplY3QoZCk/KGE9W2MuY3JlYXRlRWxlbWVudChqWzFdKV0sZS5mbi5hdHRyLmNhbGwoYSxkLCEwKSk6YT1bay5jcmVhdGVFbGVtZW50KGpbMV0pXTooaj1lLmJ1aWxkRnJhZ21lbnQoW2dbMV1dLFtrXSksYT0oai5jYWNoZWFibGU/ZS5jbG9uZShqLmZyYWdtZW50KTpqLmZyYWdtZW50KS5jaGlsZE5vZGVzKTtyZXR1cm4gZS5tZXJnZSh0aGlzLGEpfWg9Yy5nZXRFbGVtZW50QnlJZChnWzJdKTtpZihoJiZoLnBhcmVudE5vZGUpe2lmKGguaWQhPT1nWzJdKXJldHVybiBmLmZpbmQoYSk7dGhpcy5sZW5ndGg9MSx0aGlzWzBdPWh9dGhpcy5jb250ZXh0PWMsdGhpcy5zZWxlY3Rvcj1hO3JldHVybiB0aGlzfXJldHVybiFkfHxkLmpxdWVyeT8oZHx8ZikuZmluZChhKTp0aGlzLmNvbnN0cnVjdG9yKGQpLmZpbmQoYSl9aWYoZS5pc0Z1bmN0aW9uKGEpKXJldHVybiBmLnJlYWR5KGEpO2Euc2VsZWN0b3IhPT1iJiYodGhpcy5zZWxlY3Rvcj1hLnNlbGVjdG9yLHRoaXMuY29udGV4dD1hLmNvbnRleHQpO3JldHVybiBlLm1ha2VBcnJheShhLHRoaXMpfSxzZWxlY3RvcjoiIixqcXVlcnk6IjEuNy4yIixsZW5ndGg6MCxzaXplOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGVuZ3RofSx0b0FycmF5OmZ1bmN0aW9uKCl7cmV0dXJuIEYuY2FsbCh0aGlzLDApfSxnZXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGE9PW51bGw/dGhpcy50b0FycmF5KCk6YTwwP3RoaXNbdGhpcy5sZW5ndGgrYV06dGhpc1thXX0scHVzaFN0YWNrOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD10aGlzLmNvbnN0cnVjdG9yKCk7ZS5pc0FycmF5KGEpP0UuYXBwbHkoZCxhKTplLm1lcmdlKGQsYSksZC5wcmV2T2JqZWN0PXRoaXMsZC5jb250ZXh0PXRoaXMuY29udGV4dCxiPT09ImZpbmQiP2Quc2VsZWN0b3I9dGhpcy5zZWxlY3RvcisodGhpcy5zZWxlY3Rvcj8iICI6IiIpK2M6YiYmKGQuc2VsZWN0b3I9dGhpcy5zZWxlY3RvcisiLiIrYisiKCIrYysiKSIpO3JldHVybiBkfSxlYWNoOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGUuZWFjaCh0aGlzLGEsYil9LHJlYWR5OmZ1bmN0aW9uKGEpe2UuYmluZFJlYWR5KCksQS5hZGQoYSk7cmV0dXJuIHRoaXN9LGVxOmZ1bmN0aW9uKGEpe2E9K2E7cmV0dXJuIGE9PT0tMT90aGlzLnNsaWNlKGEpOnRoaXMuc2xpY2UoYSxhKzEpfSxmaXJzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVxKDApfSxsYXN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXEoLTEpfSxzbGljZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnB1c2hTdGFjayhGLmFwcGx5KHRoaXMsYXJndW1lbnRzKSwic2xpY2UiLEYuY2FsbChhcmd1bWVudHMpLmpvaW4oIiwiKSl9LG1hcDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soZS5tYXAodGhpcyxmdW5jdGlvbihiLGMpe3JldHVybiBhLmNhbGwoYixjLGIpfSkpfSxlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wcmV2T2JqZWN0fHx0aGlzLmNvbnN0cnVjdG9yKG51bGwpfSxwdXNoOkUsc29ydDpbXS5zb3J0LHNwbGljZTpbXS5zcGxpY2V9LGUuZm4uaW5pdC5wcm90b3R5cGU9ZS5mbixlLmV4dGVuZD1lLmZuLmV4dGVuZD1mdW5jdGlvbigpe3ZhciBhLGMsZCxmLGcsaCxpPWFyZ3VtZW50c1swXXx8e30saj0xLGs9YXJndW1lbnRzLmxlbmd0aCxsPSExO3R5cGVvZiBpPT0iYm9vbGVhbiImJihsPWksaT1hcmd1bWVudHNbMV18fHt9LGo9MiksdHlwZW9mIGkhPSJvYmplY3QiJiYhZS5pc0Z1bmN0aW9uKGkpJiYoaT17fSksaz09PWomJihpPXRoaXMsLS1qKTtmb3IoO2o8aztqKyspaWYoKGE9YXJndW1lbnRzW2pdKSE9bnVsbClmb3IoYyBpbiBhKXtkPWlbY10sZj1hW2NdO2lmKGk9PT1mKWNvbnRpbnVlO2wmJmYmJihlLmlzUGxhaW5PYmplY3QoZil8fChnPWUuaXNBcnJheShmKSkpPyhnPyhnPSExLGg9ZCYmZS5pc0FycmF5KGQpP2Q6W10pOmg9ZCYmZS5pc1BsYWluT2JqZWN0KGQpP2Q6e30saVtjXT1lLmV4dGVuZChsLGgsZikpOmYhPT1iJiYoaVtjXT1mKX1yZXR1cm4gaX0sZS5leHRlbmQoe25vQ29uZmxpY3Q6ZnVuY3Rpb24oYil7YS4kPT09ZSYmKGEuJD1nKSxiJiZhLmpRdWVyeT09PWUmJihhLmpRdWVyeT1mKTtyZXR1cm4gZX0saXNSZWFkeTohMSxyZWFkeVdhaXQ6MSxob2xkUmVhZHk6ZnVuY3Rpb24oYSl7YT9lLnJlYWR5V2FpdCsrOmUucmVhZHkoITApfSxyZWFkeTpmdW5jdGlvbihhKXtpZihhPT09ITAmJiEtLWUucmVhZHlXYWl0fHxhIT09ITAmJiFlLmlzUmVhZHkpe2lmKCFjLmJvZHkpcmV0dXJuIHNldFRpbWVvdXQoZS5yZWFkeSwxKTtlLmlzUmVhZHk9ITA7aWYoYSE9PSEwJiYtLWUucmVhZHlXYWl0PjApcmV0dXJuO0EuZmlyZVdpdGgoYyxbZV0pLGUuZm4udHJpZ2dlciYmZShjKS50cmlnZ2VyKCJyZWFkeSIpLm9mZigicmVhZHkiKX19LGJpbmRSZWFkeTpmdW5jdGlvbigpe2lmKCFBKXtBPWUuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpO2lmKGMucmVhZHlTdGF0ZT09PSJjb21wbGV0ZSIpcmV0dXJuIHNldFRpbWVvdXQoZS5yZWFkeSwxKTtpZihjLmFkZEV2ZW50TGlzdGVuZXIpYy5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIixCLCExKSxhLmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLGUucmVhZHksITEpO2Vsc2UgaWYoYy5hdHRhY2hFdmVudCl7Yy5hdHRhY2hFdmVudCgib25yZWFkeXN0YXRlY2hhbmdlIixCKSxhLmF0dGFjaEV2ZW50KCJvbmxvYWQiLGUucmVhZHkpO3ZhciBiPSExO3RyeXtiPWEuZnJhbWVFbGVtZW50PT1udWxsfWNhdGNoKGQpe31jLmRvY3VtZW50RWxlbWVudC5kb1Njcm9sbCYmYiYmSigpfX19LGlzRnVuY3Rpb246ZnVuY3Rpb24oYSl7cmV0dXJuIGUudHlwZShhKT09PSJmdW5jdGlvbiJ9LGlzQXJyYXk6QXJyYXkuaXNBcnJheXx8ZnVuY3Rpb24oYSl7cmV0dXJuIGUudHlwZShhKT09PSJhcnJheSJ9LGlzV2luZG93OmZ1bmN0aW9uKGEpe3JldHVybiBhIT1udWxsJiZhPT1hLndpbmRvd30saXNOdW1lcmljOmZ1bmN0aW9uKGEpe3JldHVybiFpc05hTihwYXJzZUZsb2F0KGEpKSYmaXNGaW5pdGUoYSl9LHR5cGU6ZnVuY3Rpb24oYSl7cmV0dXJuIGE9PW51bGw/U3RyaW5nKGEpOklbQy5jYWxsKGEpXXx8Im9iamVjdCJ9LGlzUGxhaW5PYmplY3Q6ZnVuY3Rpb24oYSl7aWYoIWF8fGUudHlwZShhKSE9PSJvYmplY3QifHxhLm5vZGVUeXBlfHxlLmlzV2luZG93KGEpKXJldHVybiExO3RyeXtpZihhLmNvbnN0cnVjdG9yJiYhRC5jYWxsKGEsImNvbnN0cnVjdG9yIikmJiFELmNhbGwoYS5jb25zdHJ1Y3Rvci5wcm90b3R5cGUsImlzUHJvdG90eXBlT2YiKSlyZXR1cm4hMX1jYXRjaChjKXtyZXR1cm4hMX12YXIgZDtmb3IoZCBpbiBhKTtyZXR1cm4gZD09PWJ8fEQuY2FsbChhLGQpfSxpc0VtcHR5T2JqZWN0OmZ1bmN0aW9uKGEpe2Zvcih2YXIgYiBpbiBhKXJldHVybiExO3JldHVybiEwfSxlcnJvcjpmdW5jdGlvbihhKXt0aHJvdyBuZXcgRXJyb3IoYSl9LHBhcnNlSlNPTjpmdW5jdGlvbihiKXtpZih0eXBlb2YgYiE9InN0cmluZyJ8fCFiKXJldHVybiBudWxsO2I9ZS50cmltKGIpO2lmKGEuSlNPTiYmYS5KU09OLnBhcnNlKXJldHVybiBhLkpTT04ucGFyc2UoYik7aWYobi50ZXN0KGIucmVwbGFjZShvLCJAIikucmVwbGFjZShwLCJdIikucmVwbGFjZShxLCIiKSkpcmV0dXJuKG5ldyBGdW5jdGlvbigicmV0dXJuICIrYikpKCk7ZS5lcnJvcigiSW52YWxpZCBKU09OOiAiK2IpfSxwYXJzZVhNTDpmdW5jdGlvbihjKXtpZih0eXBlb2YgYyE9InN0cmluZyJ8fCFjKXJldHVybiBudWxsO3ZhciBkLGY7dHJ5e2EuRE9NUGFyc2VyPyhmPW5ldyBET01QYXJzZXIsZD1mLnBhcnNlRnJvbVN0cmluZyhjLCJ0ZXh0L3htbCIpKTooZD1uZXcgQWN0aXZlWE9iamVjdCgiTWljcm9zb2Z0LlhNTERPTSIpLGQuYXN5bmM9ImZhbHNlIixkLmxvYWRYTUwoYykpfWNhdGNoKGcpe2Q9Yn0oIWR8fCFkLmRvY3VtZW50RWxlbWVudHx8ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgicGFyc2VyZXJyb3IiKS5sZW5ndGgpJiZlLmVycm9yKCJJbnZhbGlkIFhNTDogIitjKTtyZXR1cm4gZH0sbm9vcDpmdW5jdGlvbigpe30sZ2xvYmFsRXZhbDpmdW5jdGlvbihiKXtiJiZqLnRlc3QoYikmJihhLmV4ZWNTY3JpcHR8fGZ1bmN0aW9uKGIpe2EuZXZhbC5jYWxsKGEsYil9KShiKX0sY2FtZWxDYXNlOmZ1bmN0aW9uKGEpe3JldHVybiBhLnJlcGxhY2UodywibXMtIikucmVwbGFjZSh2LHgpfSxub2RlTmFtZTpmdW5jdGlvbihhLGIpe3JldHVybiBhLm5vZGVOYW1lJiZhLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCk9PT1iLnRvVXBwZXJDYXNlKCl9LGVhY2g6ZnVuY3Rpb24oYSxjLGQpe3ZhciBmLGc9MCxoPWEubGVuZ3RoLGk9aD09PWJ8fGUuaXNGdW5jdGlvbihhKTtpZihkKXtpZihpKXtmb3IoZiBpbiBhKWlmKGMuYXBwbHkoYVtmXSxkKT09PSExKWJyZWFrfWVsc2UgZm9yKDtnPGg7KWlmKGMuYXBwbHkoYVtnKytdLGQpPT09ITEpYnJlYWt9ZWxzZSBpZihpKXtmb3IoZiBpbiBhKWlmKGMuY2FsbChhW2ZdLGYsYVtmXSk9PT0hMSlicmVha31lbHNlIGZvcig7ZzxoOylpZihjLmNhbGwoYVtnXSxnLGFbZysrXSk9PT0hMSlicmVhaztyZXR1cm4gYX0sdHJpbTpHP2Z1bmN0aW9uKGEpe3JldHVybiBhPT1udWxsPyIiOkcuY2FsbChhKX06ZnVuY3Rpb24oYSl7cmV0dXJuIGE9PW51bGw/IiI6KGErIiIpLnJlcGxhY2UoaywiIikucmVwbGFjZShsLCIiKX0sbWFrZUFycmF5OmZ1bmN0aW9uKGEsYil7dmFyIGM9Ynx8W107aWYoYSE9bnVsbCl7dmFyIGQ9ZS50eXBlKGEpO2EubGVuZ3RoPT1udWxsfHxkPT09InN0cmluZyJ8fGQ9PT0iZnVuY3Rpb24ifHxkPT09InJlZ2V4cCJ8fGUuaXNXaW5kb3coYSk/RS5jYWxsKGMsYSk6ZS5tZXJnZShjLGEpfXJldHVybiBjfSxpbkFycmF5OmZ1bmN0aW9uKGEsYixjKXt2YXIgZDtpZihiKXtpZihIKXJldHVybiBILmNhbGwoYixhLGMpO2Q9Yi5sZW5ndGgsYz1jP2M8MD9NYXRoLm1heCgwLGQrYyk6YzowO2Zvcig7YzxkO2MrKylpZihjIGluIGImJmJbY109PT1hKXJldHVybiBjfXJldHVybi0xfSxtZXJnZTpmdW5jdGlvbihhLGMpe3ZhciBkPWEubGVuZ3RoLGU9MDtpZih0eXBlb2YgYy5sZW5ndGg9PSJudW1iZXIiKWZvcih2YXIgZj1jLmxlbmd0aDtlPGY7ZSsrKWFbZCsrXT1jW2VdO2Vsc2Ugd2hpbGUoY1tlXSE9PWIpYVtkKytdPWNbZSsrXTthLmxlbmd0aD1kO3JldHVybiBhfSxncmVwOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD1bXSxlO2M9ISFjO2Zvcih2YXIgZj0wLGc9YS5sZW5ndGg7ZjxnO2YrKyllPSEhYihhW2ZdLGYpLGMhPT1lJiZkLnB1c2goYVtmXSk7cmV0dXJuIGR9LG1hcDpmdW5jdGlvbihhLGMsZCl7dmFyIGYsZyxoPVtdLGk9MCxqPWEubGVuZ3RoLGs9YSBpbnN0YW5jZW9mIGV8fGohPT1iJiZ0eXBlb2Ygaj09Im51bWJlciImJihqPjAmJmFbMF0mJmFbai0xXXx8aj09PTB8fGUuaXNBcnJheShhKSk7aWYoaylmb3IoO2k8ajtpKyspZj1jKGFbaV0saSxkKSxmIT1udWxsJiYoaFtoLmxlbmd0aF09Zik7ZWxzZSBmb3IoZyBpbiBhKWY9YyhhW2ddLGcsZCksZiE9bnVsbCYmKGhbaC5sZW5ndGhdPWYpO3JldHVybiBoLmNvbmNhdC5hcHBseShbXSxoKX0sZ3VpZDoxLHByb3h5OmZ1bmN0aW9uKGEsYyl7aWYodHlwZW9mIGM9PSJzdHJpbmciKXt2YXIgZD1hW2NdO2M9YSxhPWR9aWYoIWUuaXNGdW5jdGlvbihhKSlyZXR1cm4gYjt2YXIgZj1GLmNhbGwoYXJndW1lbnRzLDIpLGc9ZnVuY3Rpb24oKXtyZXR1cm4gYS5hcHBseShjLGYuY29uY2F0KEYuY2FsbChhcmd1bWVudHMpKSl9O2cuZ3VpZD1hLmd1aWQ9YS5ndWlkfHxnLmd1aWR8fGUuZ3VpZCsrO3JldHVybiBnfSxhY2Nlc3M6ZnVuY3Rpb24oYSxjLGQsZixnLGgsaSl7dmFyIGosaz1kPT1udWxsLGw9MCxtPWEubGVuZ3RoO2lmKGQmJnR5cGVvZiBkPT0ib2JqZWN0Iil7Zm9yKGwgaW4gZCllLmFjY2VzcyhhLGMsbCxkW2xdLDEsaCxmKTtnPTF9ZWxzZSBpZihmIT09Yil7aj1pPT09YiYmZS5pc0Z1bmN0aW9uKGYpLGsmJihqPyhqPWMsYz1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIGouY2FsbChlKGEpLGMpfSk6KGMuY2FsbChhLGYpLGM9bnVsbCkpO2lmKGMpZm9yKDtsPG07bCsrKWMoYVtsXSxkLGo/Zi5jYWxsKGFbbF0sbCxjKGFbbF0sZCkpOmYsaSk7Zz0xfXJldHVybiBnP2E6az9jLmNhbGwoYSk6bT9jKGFbMF0sZCk6aH0sbm93OmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyBEYXRlKS5nZXRUaW1lKCl9LHVhTWF0Y2g6ZnVuY3Rpb24oYSl7YT1hLnRvTG93ZXJDYXNlKCk7dmFyIGI9ci5leGVjKGEpfHxzLmV4ZWMoYSl8fHQuZXhlYyhhKXx8YS5pbmRleE9mKCJjb21wYXRpYmxlIik8MCYmdS5leGVjKGEpfHxbXTtyZXR1cm57YnJvd3NlcjpiWzFdfHwiIix2ZXJzaW9uOmJbMl18fCIwIn19LHN1YjpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYixjKXtyZXR1cm4gbmV3IGEuZm4uaW5pdChiLGMpfWUuZXh0ZW5kKCEwLGEsdGhpcyksYS5zdXBlcmNsYXNzPXRoaXMsYS5mbj1hLnByb3RvdHlwZT10aGlzKCksYS5mbi5jb25zdHJ1Y3Rvcj1hLGEuc3ViPXRoaXMuc3ViLGEuZm4uaW5pdD1mdW5jdGlvbihkLGYpe2YmJmYgaW5zdGFuY2VvZiBlJiYhKGYgaW5zdGFuY2VvZiBhKSYmKGY9YShmKSk7cmV0dXJuIGUuZm4uaW5pdC5jYWxsKHRoaXMsZCxmLGIpfSxhLmZuLmluaXQucHJvdG90eXBlPWEuZm47dmFyIGI9YShjKTtyZXR1cm4gYX0sYnJvd3Nlcjp7fX0pLGUuZWFjaCgiQm9vbGVhbiBOdW1iZXIgU3RyaW5nIEZ1bmN0aW9uIEFycmF5IERhdGUgUmVnRXhwIE9iamVjdCIuc3BsaXQoIiAiKSxmdW5jdGlvbihhLGIpe0lbIltvYmplY3QgIitiKyJdIl09Yi50b0xvd2VyQ2FzZSgpfSksej1lLnVhTWF0Y2goeSksei5icm93c2VyJiYoZS5icm93c2VyW3ouYnJvd3Nlcl09ITAsZS5icm93c2VyLnZlcnNpb249ei52ZXJzaW9uKSxlLmJyb3dzZXIud2Via2l0JiYoZS5icm93c2VyLnNhZmFyaT0hMCksai50ZXN0KCLDgiAiKSYmKGs9L15bXHNceEEwXSsvLGw9L1tcc1x4QTBdKyQvKSxoPWUoYyksYy5hZGRFdmVudExpc3RlbmVyP0I9ZnVuY3Rpb24oKXtjLnJlbW92ZUV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLEIsITEpLGUucmVhZHkoKX06Yy5hdHRhY2hFdmVudCYmKEI9ZnVuY3Rpb24oKXtjLnJlYWR5U3RhdGU9PT0iY29tcGxldGUiJiYoYy5kZXRhY2hFdmVudCgib25yZWFkeXN0YXRlY2hhbmdlIixCKSxlLnJlYWR5KCkpfSk7cmV0dXJuIGV9KCksZz17fTtmLkNhbGxiYWNrcz1mdW5jdGlvbihhKXthPWE/Z1thXXx8aChhKTp7fTt2YXIgYz1bXSxkPVtdLGUsaSxqLGssbCxtLG49ZnVuY3Rpb24oYil7dmFyIGQsZSxnLGgsaTtmb3IoZD0wLGU9Yi5sZW5ndGg7ZDxlO2QrKylnPWJbZF0saD1mLnR5cGUoZyksaD09PSJhcnJheSI/bihnKTpoPT09ImZ1bmN0aW9uIiYmKCFhLnVuaXF1ZXx8IXAuaGFzKGcpKSYmYy5wdXNoKGcpfSxvPWZ1bmN0aW9uKGIsZil7Zj1mfHxbXSxlPSFhLm1lbW9yeXx8W2IsZl0saT0hMCxqPSEwLG09a3x8MCxrPTAsbD1jLmxlbmd0aDtmb3IoO2MmJm08bDttKyspaWYoY1ttXS5hcHBseShiLGYpPT09ITEmJmEuc3RvcE9uRmFsc2Upe2U9ITA7YnJlYWt9aj0hMSxjJiYoYS5vbmNlP2U9PT0hMD9wLmRpc2FibGUoKTpjPVtdOmQmJmQubGVuZ3RoJiYoZT1kLnNoaWZ0KCkscC5maXJlV2l0aChlWzBdLGVbMV0pKSl9LHA9e2FkZDpmdW5jdGlvbigpe2lmKGMpe3ZhciBhPWMubGVuZ3RoO24oYXJndW1lbnRzKSxqP2w9Yy5sZW5ndGg6ZSYmZSE9PSEwJiYoaz1hLG8oZVswXSxlWzFdKSl9cmV0dXJuIHRoaXN9LHJlbW92ZTpmdW5jdGlvbigpe2lmKGMpe3ZhciBiPWFyZ3VtZW50cyxkPTAsZT1iLmxlbmd0aDtmb3IoO2Q8ZTtkKyspZm9yKHZhciBmPTA7ZjxjLmxlbmd0aDtmKyspaWYoYltkXT09PWNbZl0pe2omJmY8PWwmJihsLS0sZjw9bSYmbS0tKSxjLnNwbGljZShmLS0sMSk7aWYoYS51bmlxdWUpYnJlYWt9fXJldHVybiB0aGlzfSxoYXM6ZnVuY3Rpb24oYSl7aWYoYyl7dmFyIGI9MCxkPWMubGVuZ3RoO2Zvcig7YjxkO2IrKylpZihhPT09Y1tiXSlyZXR1cm4hMH1yZXR1cm4hMX0sZW1wdHk6ZnVuY3Rpb24oKXtjPVtdO3JldHVybiB0aGlzfSxkaXNhYmxlOmZ1bmN0aW9uKCl7Yz1kPWU9YjtyZXR1cm4gdGhpc30sZGlzYWJsZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hY30sbG9jazpmdW5jdGlvbigpe2Q9YiwoIWV8fGU9PT0hMCkmJnAuZGlzYWJsZSgpO3JldHVybiB0aGlzfSxsb2NrZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hZH0sZmlyZVdpdGg6ZnVuY3Rpb24oYixjKXtkJiYoaj9hLm9uY2V8fGQucHVzaChbYixjXSk6KCFhLm9uY2V8fCFlKSYmbyhiLGMpKTtyZXR1cm4gdGhpc30sZmlyZTpmdW5jdGlvbigpe3AuZmlyZVdpdGgodGhpcyxhcmd1bWVudHMpO3JldHVybiB0aGlzfSxmaXJlZDpmdW5jdGlvbigpe3JldHVybiEhaX19O3JldHVybiBwfTt2YXIgaT1bXS5zbGljZTtmLmV4dGVuZCh7RGVmZXJyZWQ6ZnVuY3Rpb24oYSl7dmFyIGI9Zi5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksYz1mLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSxkPWYuQ2FsbGJhY2tzKCJtZW1vcnkiKSxlPSJwZW5kaW5nIixnPXtyZXNvbHZlOmIscmVqZWN0OmMsbm90aWZ5OmR9LGg9e2RvbmU6Yi5hZGQsZmFpbDpjLmFkZCxwcm9ncmVzczpkLmFkZCxzdGF0ZTpmdW5jdGlvbigpe3JldHVybiBlfSxpc1Jlc29sdmVkOmIuZmlyZWQsaXNSZWplY3RlZDpjLmZpcmVkLHRoZW46ZnVuY3Rpb24oYSxiLGMpe2kuZG9uZShhKS5mYWlsKGIpLnByb2dyZXNzKGMpO3JldHVybiB0aGlzfSxhbHdheXM6ZnVuY3Rpb24oKXtpLmRvbmUuYXBwbHkoaSxhcmd1bWVudHMpLmZhaWwuYXBwbHkoaSxhcmd1bWVudHMpO3JldHVybiB0aGlzfSxwaXBlOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gZi5EZWZlcnJlZChmdW5jdGlvbihkKXtmLmVhY2goe2RvbmU6W2EsInJlc29sdmUiXSxmYWlsOltiLCJyZWplY3QiXSxwcm9ncmVzczpbYywibm90aWZ5Il19LGZ1bmN0aW9uKGEsYil7dmFyIGM9YlswXSxlPWJbMV0sZztmLmlzRnVuY3Rpb24oYyk/aVthXShmdW5jdGlvbigpe2c9Yy5hcHBseSh0aGlzLGFyZ3VtZW50cyksZyYmZi5pc0Z1bmN0aW9uKGcucHJvbWlzZSk/Zy5wcm9taXNlKCkudGhlbihkLnJlc29sdmUsZC5yZWplY3QsZC5ub3RpZnkpOmRbZSsiV2l0aCJdKHRoaXM9PT1pP2Q6dGhpcyxbZ10pfSk6aVthXShkW2VdKX0pfSkucHJvbWlzZSgpfSxwcm9taXNlOmZ1bmN0aW9uKGEpe2lmKGE9PW51bGwpYT1oO2Vsc2UgZm9yKHZhciBiIGluIGgpYVtiXT1oW2JdO3JldHVybiBhfX0saT1oLnByb21pc2Uoe30pLGo7Zm9yKGogaW4gZylpW2pdPWdbal0uZmlyZSxpW2orIldpdGgiXT1nW2pdLmZpcmVXaXRoO2kuZG9uZShmdW5jdGlvbigpe2U9InJlc29sdmVkIn0sYy5kaXNhYmxlLGQubG9jaykuZmFpbChmdW5jdGlvbigpe2U9InJlamVjdGVkIn0sYi5kaXNhYmxlLGQubG9jayksYSYmYS5jYWxsKGksaSk7cmV0dXJuIGl9LHdoZW46ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gbShhKXtyZXR1cm4gZnVuY3Rpb24oYil7ZVthXT1hcmd1bWVudHMubGVuZ3RoPjE/aS5jYWxsKGFyZ3VtZW50cywwKTpiLGoubm90aWZ5V2l0aChrLGUpfX1mdW5jdGlvbiBsKGEpe3JldHVybiBmdW5jdGlvbihjKXtiW2FdPWFyZ3VtZW50cy5sZW5ndGg+MT9pLmNhbGwoYXJndW1lbnRzLDApOmMsLS1nfHxqLnJlc29sdmVXaXRoKGosYil9fXZhciBiPWkuY2FsbChhcmd1bWVudHMsMCksYz0wLGQ9Yi5sZW5ndGgsZT1BcnJheShkKSxnPWQsaD1kLGo9ZDw9MSYmYSYmZi5pc0Z1bmN0aW9uKGEucHJvbWlzZSk/YTpmLkRlZmVycmVkKCksaz1qLnByb21pc2UoKTtpZihkPjEpe2Zvcig7YzxkO2MrKyliW2NdJiZiW2NdLnByb21pc2UmJmYuaXNGdW5jdGlvbihiW2NdLnByb21pc2UpP2JbY10ucHJvbWlzZSgpLnRoZW4obChjKSxqLnJlamVjdCxtKGMpKTotLWc7Z3x8ai5yZXNvbHZlV2l0aChqLGIpfWVsc2UgaiE9PWEmJmoucmVzb2x2ZVdpdGgoaixkP1thXTpbXSk7cmV0dXJuIGt9fSksZi5zdXBwb3J0PWZ1bmN0aW9uKCl7dmFyIGIsZCxlLGcsaCxpLGosayxsLG0sbixvLHA9Yy5jcmVhdGVFbGVtZW50KCJkaXYiKSxxPWMuZG9jdW1lbnRFbGVtZW50O3Auc2V0QXR0cmlidXRlKCJjbGFzc05hbWUiLCJ0IikscC5pbm5lckhUTUw9IiAgIDxsaW5rLz48dGFibGU+PC90YWJsZT48YSBocmVmPScvYScgc3R5bGU9J3RvcDoxcHg7ZmxvYXQ6bGVmdDtvcGFjaXR5Oi41NTsnPmE8L2E+PGlucHV0IHR5cGU9J2NoZWNrYm94Jy8+IixkPXAuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKSxlPXAuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImEiKVswXTtpZighZHx8IWQubGVuZ3RofHwhZSlyZXR1cm57fTtnPWMuY3JlYXRlRWxlbWVudCgic2VsZWN0IiksaD1nLmFwcGVuZENoaWxkKGMuY3JlYXRlRWxlbWVudCgib3B0aW9uIikpLGk9cC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaW5wdXQiKVswXSxiPXtsZWFkaW5nV2hpdGVzcGFjZTpwLmZpcnN0Q2hpbGQubm9kZVR5cGU9PT0zLHRib2R5OiFwLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0Ym9keSIpLmxlbmd0aCxodG1sU2VyaWFsaXplOiEhcC5nZXRFbGVtZW50c0J5VGFnTmFtZSgibGluayIpLmxlbmd0aCxzdHlsZTovdG9wLy50ZXN0KGUuZ2V0QXR0cmlidXRlKCJzdHlsZSIpKSxocmVmTm9ybWFsaXplZDplLmdldEF0dHJpYnV0ZSgiaHJlZiIpPT09Ii9hIixvcGFjaXR5Oi9eMC41NS8udGVzdChlLnN0eWxlLm9wYWNpdHkpLGNzc0Zsb2F0OiEhZS5zdHlsZS5jc3NGbG9hdCxjaGVja09uOmkudmFsdWU9PT0ib24iLG9wdFNlbGVjdGVkOmguc2VsZWN0ZWQsZ2V0U2V0QXR0cmlidXRlOnAuY2xhc3NOYW1lIT09InQiLGVuY3R5cGU6ISFjLmNyZWF0ZUVsZW1lbnQoImZvcm0iKS5lbmN0eXBlLGh0bWw1Q2xvbmU6Yy5jcmVhdGVFbGVtZW50KCJuYXYiKS5jbG9uZU5vZGUoITApLm91dGVySFRNTCE9PSI8Om5hdj48LzpuYXY+IixzdWJtaXRCdWJibGVzOiEwLGNoYW5nZUJ1YmJsZXM6ITAsZm9jdXNpbkJ1YmJsZXM6ITEsZGVsZXRlRXhwYW5kbzohMCxub0Nsb25lRXZlbnQ6ITAsaW5saW5lQmxvY2tOZWVkc0xheW91dDohMSxzaHJpbmtXcmFwQmxvY2tzOiExLHJlbGlhYmxlTWFyZ2luUmlnaHQ6ITAscGl4ZWxNYXJnaW46ITB9LGYuYm94TW9kZWw9Yi5ib3hNb2RlbD1jLmNvbXBhdE1vZGU9PT0iQ1NTMUNvbXBhdCIsaS5jaGVja2VkPSEwLGIubm9DbG9uZUNoZWNrZWQ9aS5jbG9uZU5vZGUoITApLmNoZWNrZWQsZy5kaXNhYmxlZD0hMCxiLm9wdERpc2FibGVkPSFoLmRpc2FibGVkO3RyeXtkZWxldGUgcC50ZXN0fWNhdGNoKHIpe2IuZGVsZXRlRXhwYW5kbz0hMX0hcC5hZGRFdmVudExpc3RlbmVyJiZwLmF0dGFjaEV2ZW50JiZwLmZpcmVFdmVudCYmKHAuYXR0YWNoRXZlbnQoIm9uY2xpY2siLGZ1bmN0aW9uKCl7Yi5ub0Nsb25lRXZlbnQ9ITF9KSxwLmNsb25lTm9kZSghMCkuZmlyZUV2ZW50KCJvbmNsaWNrIikpLGk9Yy5jcmVhdGVFbGVtZW50KCJpbnB1dCIpLGkudmFsdWU9InQiLGkuc2V0QXR0cmlidXRlKCJ0eXBlIiwicmFkaW8iKSxiLnJhZGlvVmFsdWU9aS52YWx1ZT09PSJ0IixpLnNldEF0dHJpYnV0ZSgiY2hlY2tlZCIsImNoZWNrZWQiKSxpLnNldEF0dHJpYnV0ZSgibmFtZSIsInQiKSxwLmFwcGVuZENoaWxkKGkpLGo9Yy5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCksai5hcHBlbmRDaGlsZChwLmxhc3RDaGlsZCksYi5jaGVja0Nsb25lPWouY2xvbmVOb2RlKCEwKS5jbG9uZU5vZGUoITApLmxhc3RDaGlsZC5jaGVja2VkLGIuYXBwZW5kQ2hlY2tlZD1pLmNoZWNrZWQsai5yZW1vdmVDaGlsZChpKSxqLmFwcGVuZENoaWxkKHApO2lmKHAuYXR0YWNoRXZlbnQpZm9yKG4gaW57c3VibWl0OjEsY2hhbmdlOjEsZm9jdXNpbjoxfSltPSJvbiIrbixvPW0gaW4gcCxvfHwocC5zZXRBdHRyaWJ1dGUobSwicmV0dXJuOyIpLG89dHlwZW9mIHBbbV09PSJmdW5jdGlvbiIpLGJbbisiQnViYmxlcyJdPW87ai5yZW1vdmVDaGlsZChwKSxqPWc9aD1wPWk9bnVsbCxmKGZ1bmN0aW9uKCl7dmFyIGQsZSxnLGgsaSxqLGwsbSxuLHEscixzLHQsdT1jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJib2R5IilbMF07IXV8fChtPTEsdD0icGFkZGluZzowO21hcmdpbjowO2JvcmRlcjoiLHI9InBvc2l0aW9uOmFic29sdXRlO3RvcDowO2xlZnQ6MDt3aWR0aDoxcHg7aGVpZ2h0OjFweDsiLHM9dCsiMDt2aXNpYmlsaXR5OmhpZGRlbjsiLG49InN0eWxlPSciK3IrdCsiNXB4IHNvbGlkICMwMDA7IixxPSI8ZGl2ICIrbisiZGlzcGxheTpibG9jazsnPjxkaXYgc3R5bGU9JyIrdCsiMDtkaXNwbGF5OmJsb2NrO292ZXJmbG93OmhpZGRlbjsnPjwvZGl2PjwvZGl2PiIrIjx0YWJsZSAiK24rIicgY2VsbHBhZGRpbmc9JzAnIGNlbGxzcGFjaW5nPScwJz4iKyI8dHI+PHRkPjwvdGQ+PC90cj48L3RhYmxlPiIsZD1jLmNyZWF0ZUVsZW1lbnQoImRpdiIpLGQuc3R5bGUuY3NzVGV4dD1zKyJ3aWR0aDowO2hlaWdodDowO3Bvc2l0aW9uOnN0YXRpYzt0b3A6MDttYXJnaW4tdG9wOiIrbSsicHgiLHUuaW5zZXJ0QmVmb3JlKGQsdS5maXJzdENoaWxkKSxwPWMuY3JlYXRlRWxlbWVudCgiZGl2IiksZC5hcHBlbmRDaGlsZChwKSxwLmlubmVySFRNTD0iPHRhYmxlPjx0cj48dGQgc3R5bGU9JyIrdCsiMDtkaXNwbGF5Om5vbmUnPjwvdGQ+PHRkPnQ8L3RkPjwvdHI+PC90YWJsZT4iLGs9cC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGQiKSxvPWtbMF0ub2Zmc2V0SGVpZ2h0PT09MCxrWzBdLnN0eWxlLmRpc3BsYXk9IiIsa1sxXS5zdHlsZS5kaXNwbGF5PSJub25lIixiLnJlbGlhYmxlSGlkZGVuT2Zmc2V0cz1vJiZrWzBdLm9mZnNldEhlaWdodD09PTAsYS5nZXRDb21wdXRlZFN0eWxlJiYocC5pbm5lckhUTUw9IiIsbD1jLmNyZWF0ZUVsZW1lbnQoImRpdiIpLGwuc3R5bGUud2lkdGg9IjAiLGwuc3R5bGUubWFyZ2luUmlnaHQ9IjAiLHAuc3R5bGUud2lkdGg9IjJweCIscC5hcHBlbmRDaGlsZChsKSxiLnJlbGlhYmxlTWFyZ2luUmlnaHQ9KHBhcnNlSW50KChhLmdldENvbXB1dGVkU3R5bGUobCxudWxsKXx8e21hcmdpblJpZ2h0OjB9KS5tYXJnaW5SaWdodCwxMCl8fDApPT09MCksdHlwZW9mIHAuc3R5bGUuem9vbSE9InVuZGVmaW5lZCImJihwLmlubmVySFRNTD0iIixwLnN0eWxlLndpZHRoPXAuc3R5bGUucGFkZGluZz0iMXB4IixwLnN0eWxlLmJvcmRlcj0wLHAuc3R5bGUub3ZlcmZsb3c9ImhpZGRlbiIscC5zdHlsZS5kaXNwbGF5PSJpbmxpbmUiLHAuc3R5bGUuem9vbT0xLGIuaW5saW5lQmxvY2tOZWVkc0xheW91dD1wLm9mZnNldFdpZHRoPT09MyxwLnN0eWxlLmRpc3BsYXk9ImJsb2NrIixwLnN0eWxlLm92ZXJmbG93PSJ2aXNpYmxlIixwLmlubmVySFRNTD0iPGRpdiBzdHlsZT0nd2lkdGg6NXB4Oyc+PC9kaXY+IixiLnNocmlua1dyYXBCbG9ja3M9cC5vZmZzZXRXaWR0aCE9PTMpLHAuc3R5bGUuY3NzVGV4dD1yK3MscC5pbm5lckhUTUw9cSxlPXAuZmlyc3RDaGlsZCxnPWUuZmlyc3RDaGlsZCxpPWUubmV4dFNpYmxpbmcuZmlyc3RDaGlsZC5maXJzdENoaWxkLGo9e2RvZXNOb3RBZGRCb3JkZXI6Zy5vZmZzZXRUb3AhPT01LGRvZXNBZGRCb3JkZXJGb3JUYWJsZUFuZENlbGxzOmkub2Zmc2V0VG9wPT09NX0sZy5zdHlsZS5wb3NpdGlvbj0iZml4ZWQiLGcuc3R5bGUudG9wPSIyMHB4IixqLmZpeGVkUG9zaXRpb249Zy5vZmZzZXRUb3A9PT0yMHx8Zy5vZmZzZXRUb3A9PT0xNSxnLnN0eWxlLnBvc2l0aW9uPWcuc3R5bGUudG9wPSIiLGUuc3R5bGUub3ZlcmZsb3c9ImhpZGRlbiIsZS5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGouc3VidHJhY3RzQm9yZGVyRm9yT3ZlcmZsb3dOb3RWaXNpYmxlPWcub2Zmc2V0VG9wPT09LTUsai5kb2VzTm90SW5jbHVkZU1hcmdpbkluQm9keU9mZnNldD11Lm9mZnNldFRvcCE9PW0sYS5nZXRDb21wdXRlZFN0eWxlJiYocC5zdHlsZS5tYXJnaW5Ub3A9IjElIixiLnBpeGVsTWFyZ2luPShhLmdldENvbXB1dGVkU3R5bGUocCxudWxsKXx8e21hcmdpblRvcDowfSkubWFyZ2luVG9wIT09IjElIiksdHlwZW9mIGQuc3R5bGUuem9vbSE9InVuZGVmaW5lZCImJihkLnN0eWxlLnpvb209MSksdS5yZW1vdmVDaGlsZChkKSxsPXA9ZD1udWxsLGYuZXh0ZW5kKGIsaikpfSk7cmV0dXJuIGJ9KCk7dmFyIGo9L14oPzpcey4qXH18XFsuKlxdKSQvLGs9LyhbQS1aXSkvZztmLmV4dGVuZCh7Y2FjaGU6e30sdXVpZDowLGV4cGFuZG86ImpRdWVyeSIrKGYuZm4uanF1ZXJ5K01hdGgucmFuZG9tKCkpLnJlcGxhY2UoL1xEL2csIiIpLG5vRGF0YTp7ZW1iZWQ6ITAsb2JqZWN0OiJjbHNpZDpEMjdDREI2RS1BRTZELTExY2YtOTZCOC00NDQ1NTM1NDAwMDAiLGFwcGxldDohMH0saGFzRGF0YTpmdW5jdGlvbihhKXthPWEubm9kZVR5cGU/Zi5jYWNoZVthW2YuZXhwYW5kb11dOmFbZi5leHBhbmRvXTtyZXR1cm4hIWEmJiFtKGEpfSxkYXRhOmZ1bmN0aW9uKGEsYyxkLGUpe2lmKCEhZi5hY2NlcHREYXRhKGEpKXt2YXIgZyxoLGksaj1mLmV4cGFuZG8saz10eXBlb2YgYz09InN0cmluZyIsbD1hLm5vZGVUeXBlLG09bD9mLmNhY2hlOmEsbj1sP2Fbal06YVtqXSYmaixvPWM9PT0iZXZlbnRzIjtpZigoIW58fCFtW25dfHwhbyYmIWUmJiFtW25dLmRhdGEpJiZrJiZkPT09YilyZXR1cm47bnx8KGw/YVtqXT1uPSsrZi51dWlkOm49aiksbVtuXXx8KG1bbl09e30sbHx8KG1bbl0udG9KU09OPWYubm9vcCkpO2lmKHR5cGVvZiBjPT0ib2JqZWN0Inx8dHlwZW9mIGM9PSJmdW5jdGlvbiIpZT9tW25dPWYuZXh0ZW5kKG1bbl0sYyk6bVtuXS5kYXRhPWYuZXh0ZW5kKG1bbl0uZGF0YSxjKTtnPWg9bVtuXSxlfHwoaC5kYXRhfHwoaC5kYXRhPXt9KSxoPWguZGF0YSksZCE9PWImJihoW2YuY2FtZWxDYXNlKGMpXT1kKTtpZihvJiYhaFtjXSlyZXR1cm4gZy5ldmVudHM7az8oaT1oW2NdLGk9PW51bGwmJihpPWhbZi5jYW1lbENhc2UoYyldKSk6aT1oO3JldHVybiBpfX0scmVtb3ZlRGF0YTpmdW5jdGlvbihhLGIsYyl7aWYoISFmLmFjY2VwdERhdGEoYSkpe3ZhciBkLGUsZyxoPWYuZXhwYW5kbyxpPWEubm9kZVR5cGUsaj1pP2YuY2FjaGU6YSxrPWk/YVtoXTpoO2lmKCFqW2tdKXJldHVybjtpZihiKXtkPWM/altrXTpqW2tdLmRhdGE7aWYoZCl7Zi5pc0FycmF5KGIpfHwoYiBpbiBkP2I9W2JdOihiPWYuY2FtZWxDYXNlKGIpLGIgaW4gZD9iPVtiXTpiPWIuc3BsaXQoIiAiKSkpO2ZvcihlPTAsZz1iLmxlbmd0aDtlPGc7ZSsrKWRlbGV0ZSBkW2JbZV1dO2lmKCEoYz9tOmYuaXNFbXB0eU9iamVjdCkoZCkpcmV0dXJufX1pZighYyl7ZGVsZXRlIGpba10uZGF0YTtpZighbShqW2tdKSlyZXR1cm59Zi5zdXBwb3J0LmRlbGV0ZUV4cGFuZG98fCFqLnNldEludGVydmFsP2RlbGV0ZSBqW2tdOmpba109bnVsbCxpJiYoZi5zdXBwb3J0LmRlbGV0ZUV4cGFuZG8/ZGVsZXRlIGFbaF06YS5yZW1vdmVBdHRyaWJ1dGU/YS5yZW1vdmVBdHRyaWJ1dGUoaCk6YVtoXT1udWxsKX19LF9kYXRhOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gZi5kYXRhKGEsYixjLCEwKX0sYWNjZXB0RGF0YTpmdW5jdGlvbihhKXtpZihhLm5vZGVOYW1lKXt2YXIgYj1mLm5vRGF0YVthLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldO2lmKGIpcmV0dXJuIGIhPT0hMCYmYS5nZXRBdHRyaWJ1dGUoImNsYXNzaWQiKT09PWJ9cmV0dXJuITB9fSksZi5mbi5leHRlbmQoe2RhdGE6ZnVuY3Rpb24oYSxjKXt2YXIgZCxlLGcsaCxpLGo9dGhpc1swXSxrPTAsbT1udWxsO2lmKGE9PT1iKXtpZih0aGlzLmxlbmd0aCl7bT1mLmRhdGEoaik7aWYoai5ub2RlVHlwZT09PTEmJiFmLl9kYXRhKGosInBhcnNlZEF0dHJzIikpe2c9ai5hdHRyaWJ1dGVzO2ZvcihpPWcubGVuZ3RoO2s8aTtrKyspaD1nW2tdLm5hbWUsaC5pbmRleE9mKCJkYXRhLSIpPT09MCYmKGg9Zi5jYW1lbENhc2UoaC5zdWJzdHJpbmcoNSkpLGwoaixoLG1baF0pKTtmLl9kYXRhKGosInBhcnNlZEF0dHJzIiwhMCl9fXJldHVybiBtfWlmKHR5cGVvZiBhPT0ib2JqZWN0IilyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Zi5kYXRhKHRoaXMsYSl9KTtkPWEuc3BsaXQoIi4iLDIpLGRbMV09ZFsxXT8iLiIrZFsxXToiIixlPWRbMV0rIiEiO3JldHVybiBmLmFjY2Vzcyh0aGlzLGZ1bmN0aW9uKGMpe2lmKGM9PT1iKXttPXRoaXMudHJpZ2dlckhhbmRsZXIoImdldERhdGEiK2UsW2RbMF1dKSxtPT09YiYmaiYmKG09Zi5kYXRhKGosYSksbT1sKGosYSxtKSk7cmV0dXJuIG09PT1iJiZkWzFdP3RoaXMuZGF0YShkWzBdKTptfWRbMV09Yyx0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgYj1mKHRoaXMpO2IudHJpZ2dlckhhbmRsZXIoInNldERhdGEiK2UsZCksZi5kYXRhKHRoaXMsYSxjKSxiLnRyaWdnZXJIYW5kbGVyKCJjaGFuZ2VEYXRhIitlLGQpfSl9LG51bGwsYyxhcmd1bWVudHMubGVuZ3RoPjEsbnVsbCwhMSl9LHJlbW92ZURhdGE6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2YucmVtb3ZlRGF0YSh0aGlzLGEpfSl9fSksZi5leHRlbmQoe19tYXJrOmZ1bmN0aW9uKGEsYil7YSYmKGI9KGJ8fCJmeCIpKyJtYXJrIixmLl9kYXRhKGEsYiwoZi5fZGF0YShhLGIpfHwwKSsxKSl9LF91bm1hcms6ZnVuY3Rpb24oYSxiLGMpe2EhPT0hMCYmKGM9YixiPWEsYT0hMSk7aWYoYil7Yz1jfHwiZngiO3ZhciBkPWMrIm1hcmsiLGU9YT8wOihmLl9kYXRhKGIsZCl8fDEpLTE7ZT9mLl9kYXRhKGIsZCxlKTooZi5yZW1vdmVEYXRhKGIsZCwhMCksbihiLGMsIm1hcmsiKSl9fSxxdWV1ZTpmdW5jdGlvbihhLGIsYyl7dmFyIGQ7aWYoYSl7Yj0oYnx8ImZ4IikrInF1ZXVlIixkPWYuX2RhdGEoYSxiKSxjJiYoIWR8fGYuaXNBcnJheShjKT9kPWYuX2RhdGEoYSxiLGYubWFrZUFycmF5KGMpKTpkLnB1c2goYykpO3JldHVybiBkfHxbXX19LGRlcXVldWU6ZnVuY3Rpb24oYSxiKXtiPWJ8fCJmeCI7dmFyIGM9Zi5xdWV1ZShhLGIpLGQ9Yy5zaGlmdCgpLGU9e307ZD09PSJpbnByb2dyZXNzIiYmKGQ9Yy5zaGlmdCgpKSxkJiYoYj09PSJmeCImJmMudW5zaGlmdCgiaW5wcm9ncmVzcyIpLGYuX2RhdGEoYSxiKyIucnVuIixlKSxkLmNhbGwoYSxmdW5jdGlvbigpe2YuZGVxdWV1ZShhLGIpfSxlKSksYy5sZW5ndGh8fChmLnJlbW92ZURhdGEoYSxiKyJxdWV1ZSAiK2IrIi5ydW4iLCEwKSxuKGEsYiwicXVldWUiKSl9fSksZi5mbi5leHRlbmQoe3F1ZXVlOmZ1bmN0aW9uKGEsYyl7dmFyIGQ9Mjt0eXBlb2YgYSE9InN0cmluZyImJihjPWEsYT0iZngiLGQtLSk7aWYoYXJndW1lbnRzLmxlbmd0aDxkKXJldHVybiBmLnF1ZXVlKHRoaXNbMF0sYSk7cmV0dXJuIGM9PT1iP3RoaXM6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGI9Zi5xdWV1ZSh0aGlzLGEsYyk7YT09PSJmeCImJmJbMF0hPT0iaW5wcm9ncmVzcyImJmYuZGVxdWV1ZSh0aGlzLGEpfSl9LGRlcXVldWU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2YuZGVxdWV1ZSh0aGlzLGEpfSl9LGRlbGF5OmZ1bmN0aW9uKGEsYil7YT1mLmZ4P2YuZnguc3BlZWRzW2FdfHxhOmEsYj1ifHwiZngiO3JldHVybiB0aGlzLnF1ZXVlKGIsZnVuY3Rpb24oYixjKXt2YXIgZD1zZXRUaW1lb3V0KGIsYSk7Yy5zdG9wPWZ1bmN0aW9uKCl7Y2xlYXJUaW1lb3V0KGQpfX0pfSxjbGVhclF1ZXVlOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnF1ZXVlKGF8fCJmeCIsW10pfSxwcm9taXNlOmZ1bmN0aW9uKGEsYyl7ZnVuY3Rpb24gbSgpey0taHx8ZC5yZXNvbHZlV2l0aChlLFtlXSl9dHlwZW9mIGEhPSJzdHJpbmciJiYoYz1hLGE9YiksYT1hfHwiZngiO3ZhciBkPWYuRGVmZXJyZWQoKSxlPXRoaXMsZz1lLmxlbmd0aCxoPTEsaT1hKyJkZWZlciIsaj1hKyJxdWV1ZSIsaz1hKyJtYXJrIixsO3doaWxlKGctLSlpZihsPWYuZGF0YShlW2ddLGksYiwhMCl8fChmLmRhdGEoZVtnXSxqLGIsITApfHxmLmRhdGEoZVtnXSxrLGIsITApKSYmZi5kYXRhKGVbZ10saSxmLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSwhMCkpaCsrLGwuYWRkKG0pO20oKTtyZXR1cm4gZC5wcm9taXNlKGMpfX0pO3ZhciBvPS9bXG5cdFxyXS9nLHA9L1xzKy8scT0vXHIvZyxyPS9eKD86YnV0dG9ufGlucHV0KSQvaSxzPS9eKD86YnV0dG9ufGlucHV0fG9iamVjdHxzZWxlY3R8dGV4dGFyZWEpJC9pLHQ9L15hKD86cmVhKT8kL2ksdT0vXig/OmF1dG9mb2N1c3xhdXRvcGxheXxhc3luY3xjaGVja2VkfGNvbnRyb2xzfGRlZmVyfGRpc2FibGVkfGhpZGRlbnxsb29wfG11bHRpcGxlfG9wZW58cmVhZG9ubHl8cmVxdWlyZWR8c2NvcGVkfHNlbGVjdGVkKSQvaSx2PWYuc3VwcG9ydC5nZXRTZXRBdHRyaWJ1dGUsdyx4LHk7Zi5mbi5leHRlbmQoe2F0dHI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZi5hY2Nlc3ModGhpcyxmLmF0dHIsYSxiLGFyZ3VtZW50cy5sZW5ndGg+MSl9LHJlbW92ZUF0dHI6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2YucmVtb3ZlQXR0cih0aGlzLGEpfSl9LHByb3A6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZi5hY2Nlc3ModGhpcyxmLnByb3AsYSxiLGFyZ3VtZW50cy5sZW5ndGg+MSl9LHJlbW92ZVByb3A6ZnVuY3Rpb24oYSl7YT1mLnByb3BGaXhbYV18fGE7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3RyeXt0aGlzW2FdPWIsZGVsZXRlIHRoaXNbYV19Y2F0Y2goYyl7fX0pfSxhZGRDbGFzczpmdW5jdGlvbihhKXt2YXIgYixjLGQsZSxnLGgsaTtpZihmLmlzRnVuY3Rpb24oYSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihiKXtmKHRoaXMpLmFkZENsYXNzKGEuY2FsbCh0aGlzLGIsdGhpcy5jbGFzc05hbWUpKX0pO2lmKGEmJnR5cGVvZiBhPT0ic3RyaW5nIil7Yj1hLnNwbGl0KHApO2ZvcihjPTAsZD10aGlzLmxlbmd0aDtjPGQ7YysrKXtlPXRoaXNbY107aWYoZS5ub2RlVHlwZT09PTEpaWYoIWUuY2xhc3NOYW1lJiZiLmxlbmd0aD09PTEpZS5jbGFzc05hbWU9YTtlbHNle2c9IiAiK2UuY2xhc3NOYW1lKyIgIjtmb3IoaD0wLGk9Yi5sZW5ndGg7aDxpO2grKyl+Zy5pbmRleE9mKCIgIitiW2hdKyIgIil8fChnKz1iW2hdKyIgIik7ZS5jbGFzc05hbWU9Zi50cmltKGcpfX19cmV0dXJuIHRoaXN9LHJlbW92ZUNsYXNzOmZ1bmN0aW9uKGEpe3ZhciBjLGQsZSxnLGgsaSxqO2lmKGYuaXNGdW5jdGlvbihhKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGIpe2YodGhpcykucmVtb3ZlQ2xhc3MoYS5jYWxsKHRoaXMsYix0aGlzLmNsYXNzTmFtZSkpfSk7aWYoYSYmdHlwZW9mIGE9PSJzdHJpbmcifHxhPT09Yil7Yz0oYXx8IiIpLnNwbGl0KHApO2ZvcihkPTAsZT10aGlzLmxlbmd0aDtkPGU7ZCsrKXtnPXRoaXNbZF07aWYoZy5ub2RlVHlwZT09PTEmJmcuY2xhc3NOYW1lKWlmKGEpe2g9KCIgIitnLmNsYXNzTmFtZSsiICIpLnJlcGxhY2UobywiICIpO2ZvcihpPTAsaj1jLmxlbmd0aDtpPGo7aSsrKWg9aC5yZXBsYWNlKCIgIitjW2ldKyIgIiwiICIpO2cuY2xhc3NOYW1lPWYudHJpbShoKX1lbHNlIGcuY2xhc3NOYW1lPSIifX1yZXR1cm4gdGhpc30sdG9nZ2xlQ2xhc3M6ZnVuY3Rpb24oYSxiKXt2YXIgYz10eXBlb2YgYSxkPXR5cGVvZiBiPT0iYm9vbGVhbiI7aWYoZi5pc0Z1bmN0aW9uKGEpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYyl7Zih0aGlzKS50b2dnbGVDbGFzcyhhLmNhbGwodGhpcyxjLHRoaXMuY2xhc3NOYW1lLGIpLGIpfSk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2lmKGM9PT0ic3RyaW5nIil7dmFyIGUsZz0wLGg9Zih0aGlzKSxpPWIsaj1hLnNwbGl0KHApO3doaWxlKGU9altnKytdKWk9ZD9pOiFoLmhhc0NsYXNzKGUpLGhbaT8iYWRkQ2xhc3MiOiJyZW1vdmVDbGFzcyJdKGUpfWVsc2UgaWYoYz09PSJ1bmRlZmluZWQifHxjPT09ImJvb2xlYW4iKXRoaXMuY2xhc3NOYW1lJiZmLl9kYXRhKHRoaXMsIl9fY2xhc3NOYW1lX18iLHRoaXMuY2xhc3NOYW1lKSx0aGlzLmNsYXNzTmFtZT10aGlzLmNsYXNzTmFtZXx8YT09PSExPyIiOmYuX2RhdGEodGhpcywiX19jbGFzc05hbWVfXyIpfHwiIn0pfSxoYXNDbGFzczpmdW5jdGlvbihhKXt2YXIgYj0iICIrYSsiICIsYz0wLGQ9dGhpcy5sZW5ndGg7Zm9yKDtjPGQ7YysrKWlmKHRoaXNbY10ubm9kZVR5cGU9PT0xJiYoIiAiK3RoaXNbY10uY2xhc3NOYW1lKyIgIikucmVwbGFjZShvLCIgIikuaW5kZXhPZihiKT4tMSlyZXR1cm4hMDtyZXR1cm4hMX0sdmFsOmZ1bmN0aW9uKGEpe3ZhciBjLGQsZSxnPXRoaXNbMF07e2lmKCEhYXJndW1lbnRzLmxlbmd0aCl7ZT1mLmlzRnVuY3Rpb24oYSk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihkKXt2YXIgZz1mKHRoaXMpLGg7aWYodGhpcy5ub2RlVHlwZT09PTEpe2U/aD1hLmNhbGwodGhpcyxkLGcudmFsKCkpOmg9YSxoPT1udWxsP2g9IiI6dHlwZW9mIGg9PSJudW1iZXIiP2grPSIiOmYuaXNBcnJheShoKSYmKGg9Zi5tYXAoaCxmdW5jdGlvbihhKXtyZXR1cm4gYT09bnVsbD8iIjphKyIifSkpLGM9Zi52YWxIb29rc1t0aGlzLnR5cGVdfHxmLnZhbEhvb2tzW3RoaXMubm9kZU5hbWUudG9Mb3dlckNhc2UoKV07aWYoIWN8fCEoInNldCJpbiBjKXx8Yy5zZXQodGhpcyxoLCJ2YWx1ZSIpPT09Yil0aGlzLnZhbHVlPWh9fSl9aWYoZyl7Yz1mLnZhbEhvb2tzW2cudHlwZV18fGYudmFsSG9va3NbZy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXTtpZihjJiYiZ2V0ImluIGMmJihkPWMuZ2V0KGcsInZhbHVlIikpIT09YilyZXR1cm4gZDtkPWcudmFsdWU7cmV0dXJuIHR5cGVvZiBkPT0ic3RyaW5nIj9kLnJlcGxhY2UocSwiIik6ZD09bnVsbD8iIjpkfX19fSksZi5leHRlbmQoe3ZhbEhvb2tzOntvcHRpb246e2dldDpmdW5jdGlvbihhKXt2YXIgYj1hLmF0dHJpYnV0ZXMudmFsdWU7cmV0dXJuIWJ8fGIuc3BlY2lmaWVkP2EudmFsdWU6YS50ZXh0fX0sc2VsZWN0OntnZXQ6ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGUsZz1hLnNlbGVjdGVkSW5kZXgsaD1bXSxpPWEub3B0aW9ucyxqPWEudHlwZT09PSJzZWxlY3Qtb25lIjtpZihnPDApcmV0dXJuIG51bGw7Yz1qP2c6MCxkPWo/ZysxOmkubGVuZ3RoO2Zvcig7YzxkO2MrKyl7ZT1pW2NdO2lmKGUuc2VsZWN0ZWQmJihmLnN1cHBvcnQub3B0RGlzYWJsZWQ/IWUuZGlzYWJsZWQ6ZS5nZXRBdHRyaWJ1dGUoImRpc2FibGVkIik9PT1udWxsKSYmKCFlLnBhcmVudE5vZGUuZGlzYWJsZWR8fCFmLm5vZGVOYW1lKGUucGFyZW50Tm9kZSwib3B0Z3JvdXAiKSkpe2I9ZihlKS52YWwoKTtpZihqKXJldHVybiBiO2gucHVzaChiKX19aWYoaiYmIWgubGVuZ3RoJiZpLmxlbmd0aClyZXR1cm4gZihpW2ddKS52YWwoKTtyZXR1cm4gaH0sc2V0OmZ1bmN0aW9uKGEsYil7dmFyIGM9Zi5tYWtlQXJyYXkoYik7ZihhKS5maW5kKCJvcHRpb24iKS5lYWNoKGZ1bmN0aW9uKCl7dGhpcy5zZWxlY3RlZD1mLmluQXJyYXkoZih0aGlzKS52YWwoKSxjKT49MH0pLGMubGVuZ3RofHwoYS5zZWxlY3RlZEluZGV4PS0xKTtyZXR1cm4gY319fSxhdHRyRm46e3ZhbDohMCxjc3M6ITAsaHRtbDohMCx0ZXh0OiEwLGRhdGE6ITAsd2lkdGg6ITAsaGVpZ2h0OiEwLG9mZnNldDohMH0sYXR0cjpmdW5jdGlvbihhLGMsZCxlKXt2YXIgZyxoLGksaj1hLm5vZGVUeXBlO2lmKCEhYSYmaiE9PTMmJmohPT04JiZqIT09Mil7aWYoZSYmYyBpbiBmLmF0dHJGbilyZXR1cm4gZihhKVtjXShkKTtpZih0eXBlb2YgYS5nZXRBdHRyaWJ1dGU9PSJ1bmRlZmluZWQiKXJldHVybiBmLnByb3AoYSxjLGQpO2k9aiE9PTF8fCFmLmlzWE1MRG9jKGEpLGkmJihjPWMudG9Mb3dlckNhc2UoKSxoPWYuYXR0ckhvb2tzW2NdfHwodS50ZXN0KGMpP3g6dykpO2lmKGQhPT1iKXtpZihkPT09bnVsbCl7Zi5yZW1vdmVBdHRyKGEsYyk7cmV0dXJufWlmKGgmJiJzZXQiaW4gaCYmaSYmKGc9aC5zZXQoYSxkLGMpKSE9PWIpcmV0dXJuIGc7YS5zZXRBdHRyaWJ1dGUoYywiIitkKTtyZXR1cm4gZH1pZihoJiYiZ2V0ImluIGgmJmkmJihnPWguZ2V0KGEsYykpIT09bnVsbClyZXR1cm4gZztnPWEuZ2V0QXR0cmlidXRlKGMpO3JldHVybiBnPT09bnVsbD9iOmd9fSxyZW1vdmVBdHRyOmZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlLGcsaCxpPTA7aWYoYiYmYS5ub2RlVHlwZT09PTEpe2Q9Yi50b0xvd2VyQ2FzZSgpLnNwbGl0KHApLGc9ZC5sZW5ndGg7Zm9yKDtpPGc7aSsrKWU9ZFtpXSxlJiYoYz1mLnByb3BGaXhbZV18fGUsaD11LnRlc3QoZSksaHx8Zi5hdHRyKGEsZSwiIiksYS5yZW1vdmVBdHRyaWJ1dGUodj9lOmMpLGgmJmMgaW4gYSYmKGFbY109ITEpKX19LGF0dHJIb29rczp7dHlwZTp7c2V0OmZ1bmN0aW9uKGEsYil7aWYoci50ZXN0KGEubm9kZU5hbWUpJiZhLnBhcmVudE5vZGUpZi5lcnJvcigidHlwZSBwcm9wZXJ0eSBjYW4ndCBiZSBjaGFuZ2VkIik7ZWxzZSBpZighZi5zdXBwb3J0LnJhZGlvVmFsdWUmJmI9PT0icmFkaW8iJiZmLm5vZGVOYW1lKGEsImlucHV0Iikpe3ZhciBjPWEudmFsdWU7YS5zZXRBdHRyaWJ1dGUoInR5cGUiLGIpLGMmJihhLnZhbHVlPWMpO3JldHVybiBifX19LHZhbHVlOntnZXQ6ZnVuY3Rpb24oYSxiKXtpZih3JiZmLm5vZGVOYW1lKGEsImJ1dHRvbiIpKXJldHVybiB3LmdldChhLGIpO3JldHVybiBiIGluIGE/YS52YWx1ZTpudWxsfSxzZXQ6ZnVuY3Rpb24oYSxiLGMpe2lmKHcmJmYubm9kZU5hbWUoYSwiYnV0dG9uIikpcmV0dXJuIHcuc2V0KGEsYixjKTthLnZhbHVlPWJ9fX0scHJvcEZpeDp7dGFiaW5kZXg6InRhYkluZGV4IixyZWFkb25seToicmVhZE9ubHkiLCJmb3IiOiJodG1sRm9yIiwiY2xhc3MiOiJjbGFzc05hbWUiLG1heGxlbmd0aDoibWF4TGVuZ3RoIixjZWxsc3BhY2luZzoiY2VsbFNwYWNpbmciLGNlbGxwYWRkaW5nOiJjZWxsUGFkZGluZyIscm93c3Bhbjoicm93U3BhbiIsY29sc3BhbjoiY29sU3BhbiIsdXNlbWFwOiJ1c2VNYXAiLGZyYW1lYm9yZGVyOiJmcmFtZUJvcmRlciIsY29udGVudGVkaXRhYmxlOiJjb250ZW50RWRpdGFibGUifSxwcm9wOmZ1bmN0aW9uKGEsYyxkKXt2YXIgZSxnLGgsaT1hLm5vZGVUeXBlO2lmKCEhYSYmaSE9PTMmJmkhPT04JiZpIT09Mil7aD1pIT09MXx8IWYuaXNYTUxEb2MoYSksaCYmKGM9Zi5wcm9wRml4W2NdfHxjLGc9Zi5wcm9wSG9va3NbY10pO3JldHVybiBkIT09Yj9nJiYic2V0ImluIGcmJihlPWcuc2V0KGEsZCxjKSkhPT1iP2U6YVtjXT1kOmcmJiJnZXQiaW4gZyYmKGU9Zy5nZXQoYSxjKSkhPT1udWxsP2U6YVtjXX19LHByb3BIb29rczp7dGFiSW5kZXg6e2dldDpmdW5jdGlvbihhKXt2YXIgYz1hLmdldEF0dHJpYnV0ZU5vZGUoInRhYmluZGV4Iik7cmV0dXJuIGMmJmMuc3BlY2lmaWVkP3BhcnNlSW50KGMudmFsdWUsMTApOnMudGVzdChhLm5vZGVOYW1lKXx8dC50ZXN0KGEubm9kZU5hbWUpJiZhLmhyZWY/MDpifX19fSksZi5hdHRySG9va3MudGFiaW5kZXg9Zi5wcm9wSG9va3MudGFiSW5kZXgseD17Z2V0OmZ1bmN0aW9uKGEsYyl7dmFyIGQsZT1mLnByb3AoYSxjKTtyZXR1cm4gZT09PSEwfHx0eXBlb2YgZSE9ImJvb2xlYW4iJiYoZD1hLmdldEF0dHJpYnV0ZU5vZGUoYykpJiZkLm5vZGVWYWx1ZSE9PSExP2MudG9Mb3dlckNhc2UoKTpifSxzZXQ6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkO2I9PT0hMT9mLnJlbW92ZUF0dHIoYSxjKTooZD1mLnByb3BGaXhbY118fGMsZCBpbiBhJiYoYVtkXT0hMCksYS5zZXRBdHRyaWJ1dGUoYyxjLnRvTG93ZXJDYXNlKCkpKTtyZXR1cm4gY319LHZ8fCh5PXtuYW1lOiEwLGlkOiEwLGNvb3JkczohMH0sdz1mLnZhbEhvb2tzLmJ1dHRvbj17Z2V0OmZ1bmN0aW9uKGEsYyl7dmFyIGQ7ZD1hLmdldEF0dHJpYnV0ZU5vZGUoYyk7cmV0dXJuIGQmJih5W2NdP2Qubm9kZVZhbHVlIT09IiI6ZC5zcGVjaWZpZWQpP2Qubm9kZVZhbHVlOmJ9LHNldDpmdW5jdGlvbihhLGIsZCl7dmFyIGU9YS5nZXRBdHRyaWJ1dGVOb2RlKGQpO2V8fChlPWMuY3JlYXRlQXR0cmlidXRlKGQpLGEuc2V0QXR0cmlidXRlTm9kZShlKSk7cmV0dXJuIGUubm9kZVZhbHVlPWIrIiJ9fSxmLmF0dHJIb29rcy50YWJpbmRleC5zZXQ9dy5zZXQsZi5lYWNoKFsid2lkdGgiLCJoZWlnaHQiXSxmdW5jdGlvbihhLGIpe2YuYXR0ckhvb2tzW2JdPWYuZXh0ZW5kKGYuYXR0ckhvb2tzW2JdLHtzZXQ6ZnVuY3Rpb24oYSxjKXtpZihjPT09IiIpe2Euc2V0QXR0cmlidXRlKGIsImF1dG8iKTtyZXR1cm4gY319fSl9KSxmLmF0dHJIb29rcy5jb250ZW50ZWRpdGFibGU9e2dldDp3LmdldCxzZXQ6ZnVuY3Rpb24oYSxiLGMpe2I9PT0iIiYmKGI9ImZhbHNlIiksdy5zZXQoYSxiLGMpfX0pLGYuc3VwcG9ydC5ocmVmTm9ybWFsaXplZHx8Zi5lYWNoKFsiaHJlZiIsInNyYyIsIndpZHRoIiwiaGVpZ2h0Il0sZnVuY3Rpb24oYSxjKXtmLmF0dHJIb29rc1tjXT1mLmV4dGVuZChmLmF0dHJIb29rc1tjXSx7Z2V0OmZ1bmN0aW9uKGEpe3ZhciBkPWEuZ2V0QXR0cmlidXRlKGMsMik7cmV0dXJuIGQ9PT1udWxsP2I6ZH19KX0pLGYuc3VwcG9ydC5zdHlsZXx8KGYuYXR0ckhvb2tzLnN0eWxlPXtnZXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuc3R5bGUuY3NzVGV4dC50b0xvd2VyQ2FzZSgpfHxifSxzZXQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5zdHlsZS5jc3NUZXh0PSIiK2J9fSksZi5zdXBwb3J0Lm9wdFNlbGVjdGVkfHwoZi5wcm9wSG9va3Muc2VsZWN0ZWQ9Zi5leHRlbmQoZi5wcm9wSG9va3Muc2VsZWN0ZWQse2dldDpmdW5jdGlvbihhKXt2YXIgYj1hLnBhcmVudE5vZGU7YiYmKGIuc2VsZWN0ZWRJbmRleCxiLnBhcmVudE5vZGUmJmIucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4KTtyZXR1cm4gbnVsbH19KSksZi5zdXBwb3J0LmVuY3R5cGV8fChmLnByb3BGaXguZW5jdHlwZT0iZW5jb2RpbmciKSxmLnN1cHBvcnQuY2hlY2tPbnx8Zi5lYWNoKFsicmFkaW8iLCJjaGVja2JveCJdLGZ1bmN0aW9uKCl7Zi52YWxIb29rc1t0aGlzXT17Z2V0OmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgidmFsdWUiKT09PW51bGw/Im9uIjphLnZhbHVlfX19KSxmLmVhY2goWyJyYWRpbyIsImNoZWNrYm94Il0sZnVuY3Rpb24oKXtmLnZhbEhvb2tzW3RoaXNdPWYuZXh0ZW5kKGYudmFsSG9va3NbdGhpc10se3NldDpmdW5jdGlvbihhLGIpe2lmKGYuaXNBcnJheShiKSlyZXR1cm4gYS5jaGVja2VkPWYuaW5BcnJheShmKGEpLnZhbCgpLGIpPj0wfX0pfSk7dmFyIHo9L14oPzp0ZXh0YXJlYXxpbnB1dHxzZWxlY3QpJC9pLEE9L14oW15cLl0qKT8oPzpcLiguKykpPyQvLEI9Lyg/Ol58XHMpaG92ZXIoXC5cUyspP1xiLyxDPS9ea2V5LyxEPS9eKD86bW91c2V8Y29udGV4dG1lbnUpfGNsaWNrLyxFPS9eKD86Zm9jdXNpbmZvY3VzfGZvY3Vzb3V0Ymx1cikkLyxGPS9eKFx3KikoPzojKFtcd1wtXSspKT8oPzpcLihbXHdcLV0rKSk/JC8sRz1mdW5jdGlvbigKLWEpe3ZhciBiPUYuZXhlYyhhKTtiJiYoYlsxXT0oYlsxXXx8IiIpLnRvTG93ZXJDYXNlKCksYlszXT1iWzNdJiZuZXcgUmVnRXhwKCIoPzpefFxccykiK2JbM10rIig/Olxcc3wkKSIpKTtyZXR1cm4gYn0sSD1mdW5jdGlvbihhLGIpe3ZhciBjPWEuYXR0cmlidXRlc3x8e307cmV0dXJuKCFiWzFdfHxhLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1iWzFdKSYmKCFiWzJdfHwoYy5pZHx8e30pLnZhbHVlPT09YlsyXSkmJighYlszXXx8YlszXS50ZXN0KChjWyJjbGFzcyJdfHx7fSkudmFsdWUpKX0sST1mdW5jdGlvbihhKXtyZXR1cm4gZi5ldmVudC5zcGVjaWFsLmhvdmVyP2E6YS5yZXBsYWNlKEIsIm1vdXNlZW50ZXIkMSBtb3VzZWxlYXZlJDEiKX07Zi5ldmVudD17YWRkOmZ1bmN0aW9uKGEsYyxkLGUsZyl7dmFyIGgsaSxqLGssbCxtLG4sbyxwLHEscixzO2lmKCEoYS5ub2RlVHlwZT09PTN8fGEubm9kZVR5cGU9PT04fHwhY3x8IWR8fCEoaD1mLl9kYXRhKGEpKSkpe2QuaGFuZGxlciYmKHA9ZCxkPXAuaGFuZGxlcixnPXAuc2VsZWN0b3IpLGQuZ3VpZHx8KGQuZ3VpZD1mLmd1aWQrKyksaj1oLmV2ZW50cyxqfHwoaC5ldmVudHM9aj17fSksaT1oLmhhbmRsZSxpfHwoaC5oYW5kbGU9aT1mdW5jdGlvbihhKXtyZXR1cm4gdHlwZW9mIGYhPSJ1bmRlZmluZWQiJiYoIWF8fGYuZXZlbnQudHJpZ2dlcmVkIT09YS50eXBlKT9mLmV2ZW50LmRpc3BhdGNoLmFwcGx5KGkuZWxlbSxhcmd1bWVudHMpOmJ9LGkuZWxlbT1hKSxjPWYudHJpbShJKGMpKS5zcGxpdCgiICIpO2ZvcihrPTA7azxjLmxlbmd0aDtrKyspe2w9QS5leGVjKGNba10pfHxbXSxtPWxbMV0sbj0obFsyXXx8IiIpLnNwbGl0KCIuIikuc29ydCgpLHM9Zi5ldmVudC5zcGVjaWFsW21dfHx7fSxtPShnP3MuZGVsZWdhdGVUeXBlOnMuYmluZFR5cGUpfHxtLHM9Zi5ldmVudC5zcGVjaWFsW21dfHx7fSxvPWYuZXh0ZW5kKHt0eXBlOm0sb3JpZ1R5cGU6bFsxXSxkYXRhOmUsaGFuZGxlcjpkLGd1aWQ6ZC5ndWlkLHNlbGVjdG9yOmcscXVpY2s6ZyYmRyhnKSxuYW1lc3BhY2U6bi5qb2luKCIuIil9LHApLHI9alttXTtpZighcil7cj1qW21dPVtdLHIuZGVsZWdhdGVDb3VudD0wO2lmKCFzLnNldHVwfHxzLnNldHVwLmNhbGwoYSxlLG4saSk9PT0hMSlhLmFkZEV2ZW50TGlzdGVuZXI/YS5hZGRFdmVudExpc3RlbmVyKG0saSwhMSk6YS5hdHRhY2hFdmVudCYmYS5hdHRhY2hFdmVudCgib24iK20saSl9cy5hZGQmJihzLmFkZC5jYWxsKGEsbyksby5oYW5kbGVyLmd1aWR8fChvLmhhbmRsZXIuZ3VpZD1kLmd1aWQpKSxnP3Iuc3BsaWNlKHIuZGVsZWdhdGVDb3VudCsrLDAsbyk6ci5wdXNoKG8pLGYuZXZlbnQuZ2xvYmFsW21dPSEwfWE9bnVsbH19LGdsb2JhbDp7fSxyZW1vdmU6ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZz1mLmhhc0RhdGEoYSkmJmYuX2RhdGEoYSksaCxpLGosayxsLG0sbixvLHAscSxyLHM7aWYoISFnJiYhIShvPWcuZXZlbnRzKSl7Yj1mLnRyaW0oSShifHwiIikpLnNwbGl0KCIgIik7Zm9yKGg9MDtoPGIubGVuZ3RoO2grKyl7aT1BLmV4ZWMoYltoXSl8fFtdLGo9az1pWzFdLGw9aVsyXTtpZighail7Zm9yKGogaW4gbylmLmV2ZW50LnJlbW92ZShhLGorYltoXSxjLGQsITApO2NvbnRpbnVlfXA9Zi5ldmVudC5zcGVjaWFsW2pdfHx7fSxqPShkP3AuZGVsZWdhdGVUeXBlOnAuYmluZFR5cGUpfHxqLHI9b1tqXXx8W10sbT1yLmxlbmd0aCxsPWw/bmV3IFJlZ0V4cCgiKF58XFwuKSIrbC5zcGxpdCgiLiIpLnNvcnQoKS5qb2luKCJcXC4oPzouKlxcLik/IikrIihcXC58JCkiKTpudWxsO2ZvcihuPTA7bjxyLmxlbmd0aDtuKyspcz1yW25dLChlfHxrPT09cy5vcmlnVHlwZSkmJighY3x8Yy5ndWlkPT09cy5ndWlkKSYmKCFsfHxsLnRlc3Qocy5uYW1lc3BhY2UpKSYmKCFkfHxkPT09cy5zZWxlY3Rvcnx8ZD09PSIqKiImJnMuc2VsZWN0b3IpJiYoci5zcGxpY2Uobi0tLDEpLHMuc2VsZWN0b3ImJnIuZGVsZWdhdGVDb3VudC0tLHAucmVtb3ZlJiZwLnJlbW92ZS5jYWxsKGEscykpO3IubGVuZ3RoPT09MCYmbSE9PXIubGVuZ3RoJiYoKCFwLnRlYXJkb3dufHxwLnRlYXJkb3duLmNhbGwoYSxsKT09PSExKSYmZi5yZW1vdmVFdmVudChhLGosZy5oYW5kbGUpLGRlbGV0ZSBvW2pdKX1mLmlzRW1wdHlPYmplY3QobykmJihxPWcuaGFuZGxlLHEmJihxLmVsZW09bnVsbCksZi5yZW1vdmVEYXRhKGEsWyJldmVudHMiLCJoYW5kbGUiXSwhMCkpfX0sY3VzdG9tRXZlbnQ6e2dldERhdGE6ITAsc2V0RGF0YTohMCxjaGFuZ2VEYXRhOiEwfSx0cmlnZ2VyOmZ1bmN0aW9uKGMsZCxlLGcpe2lmKCFlfHxlLm5vZGVUeXBlIT09MyYmZS5ub2RlVHlwZSE9PTgpe3ZhciBoPWMudHlwZXx8YyxpPVtdLGosayxsLG0sbixvLHAscSxyLHM7aWYoRS50ZXN0KGgrZi5ldmVudC50cmlnZ2VyZWQpKXJldHVybjtoLmluZGV4T2YoIiEiKT49MCYmKGg9aC5zbGljZSgwLC0xKSxrPSEwKSxoLmluZGV4T2YoIi4iKT49MCYmKGk9aC5zcGxpdCgiLiIpLGg9aS5zaGlmdCgpLGkuc29ydCgpKTtpZigoIWV8fGYuZXZlbnQuY3VzdG9tRXZlbnRbaF0pJiYhZi5ldmVudC5nbG9iYWxbaF0pcmV0dXJuO2M9dHlwZW9mIGM9PSJvYmplY3QiP2NbZi5leHBhbmRvXT9jOm5ldyBmLkV2ZW50KGgsYyk6bmV3IGYuRXZlbnQoaCksYy50eXBlPWgsYy5pc1RyaWdnZXI9ITAsYy5leGNsdXNpdmU9ayxjLm5hbWVzcGFjZT1pLmpvaW4oIi4iKSxjLm5hbWVzcGFjZV9yZT1jLm5hbWVzcGFjZT9uZXcgUmVnRXhwKCIoXnxcXC4pIitpLmpvaW4oIlxcLig/Oi4qXFwuKT8iKSsiKFxcLnwkKSIpOm51bGwsbz1oLmluZGV4T2YoIjoiKTwwPyJvbiIraDoiIjtpZighZSl7aj1mLmNhY2hlO2ZvcihsIGluIGopaltsXS5ldmVudHMmJmpbbF0uZXZlbnRzW2hdJiZmLmV2ZW50LnRyaWdnZXIoYyxkLGpbbF0uaGFuZGxlLmVsZW0sITApO3JldHVybn1jLnJlc3VsdD1iLGMudGFyZ2V0fHwoYy50YXJnZXQ9ZSksZD1kIT1udWxsP2YubWFrZUFycmF5KGQpOltdLGQudW5zaGlmdChjKSxwPWYuZXZlbnQuc3BlY2lhbFtoXXx8e307aWYocC50cmlnZ2VyJiZwLnRyaWdnZXIuYXBwbHkoZSxkKT09PSExKXJldHVybjtyPVtbZSxwLmJpbmRUeXBlfHxoXV07aWYoIWcmJiFwLm5vQnViYmxlJiYhZi5pc1dpbmRvdyhlKSl7cz1wLmRlbGVnYXRlVHlwZXx8aCxtPUUudGVzdChzK2gpP2U6ZS5wYXJlbnROb2RlLG49bnVsbDtmb3IoO207bT1tLnBhcmVudE5vZGUpci5wdXNoKFttLHNdKSxuPW07biYmbj09PWUub3duZXJEb2N1bWVudCYmci5wdXNoKFtuLmRlZmF1bHRWaWV3fHxuLnBhcmVudFdpbmRvd3x8YSxzXSl9Zm9yKGw9MDtsPHIubGVuZ3RoJiYhYy5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpO2wrKyltPXJbbF1bMF0sYy50eXBlPXJbbF1bMV0scT0oZi5fZGF0YShtLCJldmVudHMiKXx8e30pW2MudHlwZV0mJmYuX2RhdGEobSwiaGFuZGxlIikscSYmcS5hcHBseShtLGQpLHE9byYmbVtvXSxxJiZmLmFjY2VwdERhdGEobSkmJnEuYXBwbHkobSxkKT09PSExJiZjLnByZXZlbnREZWZhdWx0KCk7Yy50eXBlPWgsIWcmJiFjLmlzRGVmYXVsdFByZXZlbnRlZCgpJiYoIXAuX2RlZmF1bHR8fHAuX2RlZmF1bHQuYXBwbHkoZS5vd25lckRvY3VtZW50LGQpPT09ITEpJiYoaCE9PSJjbGljayJ8fCFmLm5vZGVOYW1lKGUsImEiKSkmJmYuYWNjZXB0RGF0YShlKSYmbyYmZVtoXSYmKGghPT0iZm9jdXMiJiZoIT09ImJsdXIifHxjLnRhcmdldC5vZmZzZXRXaWR0aCE9PTApJiYhZi5pc1dpbmRvdyhlKSYmKG49ZVtvXSxuJiYoZVtvXT1udWxsKSxmLmV2ZW50LnRyaWdnZXJlZD1oLGVbaF0oKSxmLmV2ZW50LnRyaWdnZXJlZD1iLG4mJihlW29dPW4pKTtyZXR1cm4gYy5yZXN1bHR9fSxkaXNwYXRjaDpmdW5jdGlvbihjKXtjPWYuZXZlbnQuZml4KGN8fGEuZXZlbnQpO3ZhciBkPShmLl9kYXRhKHRoaXMsImV2ZW50cyIpfHx7fSlbYy50eXBlXXx8W10sZT1kLmRlbGVnYXRlQ291bnQsZz1bXS5zbGljZS5jYWxsKGFyZ3VtZW50cywwKSxoPSFjLmV4Y2x1c2l2ZSYmIWMubmFtZXNwYWNlLGk9Zi5ldmVudC5zcGVjaWFsW2MudHlwZV18fHt9LGo9W10sayxsLG0sbixvLHAscSxyLHMsdCx1O2dbMF09YyxjLmRlbGVnYXRlVGFyZ2V0PXRoaXM7aWYoIWkucHJlRGlzcGF0Y2h8fGkucHJlRGlzcGF0Y2guY2FsbCh0aGlzLGMpIT09ITEpe2lmKGUmJighYy5idXR0b258fGMudHlwZSE9PSJjbGljayIpKXtuPWYodGhpcyksbi5jb250ZXh0PXRoaXMub3duZXJEb2N1bWVudHx8dGhpcztmb3IobT1jLnRhcmdldDttIT10aGlzO209bS5wYXJlbnROb2RlfHx0aGlzKWlmKG0uZGlzYWJsZWQhPT0hMCl7cD17fSxyPVtdLG5bMF09bTtmb3Ioaz0wO2s8ZTtrKyspcz1kW2tdLHQ9cy5zZWxlY3RvcixwW3RdPT09YiYmKHBbdF09cy5xdWljaz9IKG0scy5xdWljayk6bi5pcyh0KSkscFt0XSYmci5wdXNoKHMpO3IubGVuZ3RoJiZqLnB1c2goe2VsZW06bSxtYXRjaGVzOnJ9KX19ZC5sZW5ndGg+ZSYmai5wdXNoKHtlbGVtOnRoaXMsbWF0Y2hlczpkLnNsaWNlKGUpfSk7Zm9yKGs9MDtrPGoubGVuZ3RoJiYhYy5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpO2srKyl7cT1qW2tdLGMuY3VycmVudFRhcmdldD1xLmVsZW07Zm9yKGw9MDtsPHEubWF0Y2hlcy5sZW5ndGgmJiFjLmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkKCk7bCsrKXtzPXEubWF0Y2hlc1tsXTtpZihofHwhYy5uYW1lc3BhY2UmJiFzLm5hbWVzcGFjZXx8Yy5uYW1lc3BhY2VfcmUmJmMubmFtZXNwYWNlX3JlLnRlc3Qocy5uYW1lc3BhY2UpKWMuZGF0YT1zLmRhdGEsYy5oYW5kbGVPYmo9cyxvPSgoZi5ldmVudC5zcGVjaWFsW3Mub3JpZ1R5cGVdfHx7fSkuaGFuZGxlfHxzLmhhbmRsZXIpLmFwcGx5KHEuZWxlbSxnKSxvIT09YiYmKGMucmVzdWx0PW8sbz09PSExJiYoYy5wcmV2ZW50RGVmYXVsdCgpLGMuc3RvcFByb3BhZ2F0aW9uKCkpKX19aS5wb3N0RGlzcGF0Y2gmJmkucG9zdERpc3BhdGNoLmNhbGwodGhpcyxjKTtyZXR1cm4gYy5yZXN1bHR9fSxwcm9wczoiYXR0ckNoYW5nZSBhdHRyTmFtZSByZWxhdGVkTm9kZSBzcmNFbGVtZW50IGFsdEtleSBidWJibGVzIGNhbmNlbGFibGUgY3RybEtleSBjdXJyZW50VGFyZ2V0IGV2ZW50UGhhc2UgbWV0YUtleSByZWxhdGVkVGFyZ2V0IHNoaWZ0S2V5IHRhcmdldCB0aW1lU3RhbXAgdmlldyB3aGljaCIuc3BsaXQoIiAiKSxmaXhIb29rczp7fSxrZXlIb29rczp7cHJvcHM6ImNoYXIgY2hhckNvZGUga2V5IGtleUNvZGUiLnNwbGl0KCIgIiksZmlsdGVyOmZ1bmN0aW9uKGEsYil7YS53aGljaD09bnVsbCYmKGEud2hpY2g9Yi5jaGFyQ29kZSE9bnVsbD9iLmNoYXJDb2RlOmIua2V5Q29kZSk7cmV0dXJuIGF9fSxtb3VzZUhvb2tzOntwcm9wczoiYnV0dG9uIGJ1dHRvbnMgY2xpZW50WCBjbGllbnRZIGZyb21FbGVtZW50IG9mZnNldFggb2Zmc2V0WSBwYWdlWCBwYWdlWSBzY3JlZW5YIHNjcmVlblkgdG9FbGVtZW50Ii5zcGxpdCgiICIpLGZpbHRlcjpmdW5jdGlvbihhLGQpe3ZhciBlLGYsZyxoPWQuYnV0dG9uLGk9ZC5mcm9tRWxlbWVudDthLnBhZ2VYPT1udWxsJiZkLmNsaWVudFghPW51bGwmJihlPWEudGFyZ2V0Lm93bmVyRG9jdW1lbnR8fGMsZj1lLmRvY3VtZW50RWxlbWVudCxnPWUuYm9keSxhLnBhZ2VYPWQuY2xpZW50WCsoZiYmZi5zY3JvbGxMZWZ0fHxnJiZnLnNjcm9sbExlZnR8fDApLShmJiZmLmNsaWVudExlZnR8fGcmJmcuY2xpZW50TGVmdHx8MCksYS5wYWdlWT1kLmNsaWVudFkrKGYmJmYuc2Nyb2xsVG9wfHxnJiZnLnNjcm9sbFRvcHx8MCktKGYmJmYuY2xpZW50VG9wfHxnJiZnLmNsaWVudFRvcHx8MCkpLCFhLnJlbGF0ZWRUYXJnZXQmJmkmJihhLnJlbGF0ZWRUYXJnZXQ9aT09PWEudGFyZ2V0P2QudG9FbGVtZW50OmkpLCFhLndoaWNoJiZoIT09YiYmKGEud2hpY2g9aCYxPzE6aCYyPzM6aCY0PzI6MCk7cmV0dXJuIGF9fSxmaXg6ZnVuY3Rpb24oYSl7aWYoYVtmLmV4cGFuZG9dKXJldHVybiBhO3ZhciBkLGUsZz1hLGg9Zi5ldmVudC5maXhIb29rc1thLnR5cGVdfHx7fSxpPWgucHJvcHM/dGhpcy5wcm9wcy5jb25jYXQoaC5wcm9wcyk6dGhpcy5wcm9wczthPWYuRXZlbnQoZyk7Zm9yKGQ9aS5sZW5ndGg7ZDspZT1pWy0tZF0sYVtlXT1nW2VdO2EudGFyZ2V0fHwoYS50YXJnZXQ9Zy5zcmNFbGVtZW50fHxjKSxhLnRhcmdldC5ub2RlVHlwZT09PTMmJihhLnRhcmdldD1hLnRhcmdldC5wYXJlbnROb2RlKSxhLm1ldGFLZXk9PT1iJiYoYS5tZXRhS2V5PWEuY3RybEtleSk7cmV0dXJuIGguZmlsdGVyP2guZmlsdGVyKGEsZyk6YX0sc3BlY2lhbDp7cmVhZHk6e3NldHVwOmYuYmluZFJlYWR5fSxsb2FkOntub0J1YmJsZTohMH0sZm9jdXM6e2RlbGVnYXRlVHlwZToiZm9jdXNpbiJ9LGJsdXI6e2RlbGVnYXRlVHlwZToiZm9jdXNvdXQifSxiZWZvcmV1bmxvYWQ6e3NldHVwOmZ1bmN0aW9uKGEsYixjKXtmLmlzV2luZG93KHRoaXMpJiYodGhpcy5vbmJlZm9yZXVubG9hZD1jKX0sdGVhcmRvd246ZnVuY3Rpb24oYSxiKXt0aGlzLm9uYmVmb3JldW5sb2FkPT09YiYmKHRoaXMub25iZWZvcmV1bmxvYWQ9bnVsbCl9fX0sc2ltdWxhdGU6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9Zi5leHRlbmQobmV3IGYuRXZlbnQsYyx7dHlwZTphLGlzU2ltdWxhdGVkOiEwLG9yaWdpbmFsRXZlbnQ6e319KTtkP2YuZXZlbnQudHJpZ2dlcihlLG51bGwsYik6Zi5ldmVudC5kaXNwYXRjaC5jYWxsKGIsZSksZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSYmYy5wcmV2ZW50RGVmYXVsdCgpfX0sZi5ldmVudC5oYW5kbGU9Zi5ldmVudC5kaXNwYXRjaCxmLnJlbW92ZUV2ZW50PWMucmVtb3ZlRXZlbnRMaXN0ZW5lcj9mdW5jdGlvbihhLGIsYyl7YS5yZW1vdmVFdmVudExpc3RlbmVyJiZhLnJlbW92ZUV2ZW50TGlzdGVuZXIoYixjLCExKX06ZnVuY3Rpb24oYSxiLGMpe2EuZGV0YWNoRXZlbnQmJmEuZGV0YWNoRXZlbnQoIm9uIitiLGMpfSxmLkV2ZW50PWZ1bmN0aW9uKGEsYil7aWYoISh0aGlzIGluc3RhbmNlb2YgZi5FdmVudCkpcmV0dXJuIG5ldyBmLkV2ZW50KGEsYik7YSYmYS50eXBlPyh0aGlzLm9yaWdpbmFsRXZlbnQ9YSx0aGlzLnR5cGU9YS50eXBlLHRoaXMuaXNEZWZhdWx0UHJldmVudGVkPWEuZGVmYXVsdFByZXZlbnRlZHx8YS5yZXR1cm5WYWx1ZT09PSExfHxhLmdldFByZXZlbnREZWZhdWx0JiZhLmdldFByZXZlbnREZWZhdWx0KCk/SzpKKTp0aGlzLnR5cGU9YSxiJiZmLmV4dGVuZCh0aGlzLGIpLHRoaXMudGltZVN0YW1wPWEmJmEudGltZVN0YW1wfHxmLm5vdygpLHRoaXNbZi5leHBhbmRvXT0hMH0sZi5FdmVudC5wcm90b3R5cGU9e3ByZXZlbnREZWZhdWx0OmZ1bmN0aW9uKCl7dGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQ9Szt2YXIgYT10aGlzLm9yaWdpbmFsRXZlbnQ7IWF8fChhLnByZXZlbnREZWZhdWx0P2EucHJldmVudERlZmF1bHQoKTphLnJldHVyblZhbHVlPSExKX0sc3RvcFByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dGhpcy5pc1Byb3BhZ2F0aW9uU3RvcHBlZD1LO3ZhciBhPXRoaXMub3JpZ2luYWxFdmVudDshYXx8KGEuc3RvcFByb3BhZ2F0aW9uJiZhLnN0b3BQcm9wYWdhdGlvbigpLGEuY2FuY2VsQnViYmxlPSEwKX0sc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dGhpcy5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZD1LLHRoaXMuc3RvcFByb3BhZ2F0aW9uKCl9LGlzRGVmYXVsdFByZXZlbnRlZDpKLGlzUHJvcGFnYXRpb25TdG9wcGVkOkosaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ6Sn0sZi5lYWNoKHttb3VzZWVudGVyOiJtb3VzZW92ZXIiLG1vdXNlbGVhdmU6Im1vdXNlb3V0In0sZnVuY3Rpb24oYSxiKXtmLmV2ZW50LnNwZWNpYWxbYV09e2RlbGVnYXRlVHlwZTpiLGJpbmRUeXBlOmIsaGFuZGxlOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMsZD1hLnJlbGF0ZWRUYXJnZXQsZT1hLmhhbmRsZU9iaixnPWUuc2VsZWN0b3IsaDtpZighZHx8ZCE9PWMmJiFmLmNvbnRhaW5zKGMsZCkpYS50eXBlPWUub3JpZ1R5cGUsaD1lLmhhbmRsZXIuYXBwbHkodGhpcyxhcmd1bWVudHMpLGEudHlwZT1iO3JldHVybiBofX19KSxmLnN1cHBvcnQuc3VibWl0QnViYmxlc3x8KGYuZXZlbnQuc3BlY2lhbC5zdWJtaXQ9e3NldHVwOmZ1bmN0aW9uKCl7aWYoZi5ub2RlTmFtZSh0aGlzLCJmb3JtIikpcmV0dXJuITE7Zi5ldmVudC5hZGQodGhpcywiY2xpY2suX3N1Ym1pdCBrZXlwcmVzcy5fc3VibWl0IixmdW5jdGlvbihhKXt2YXIgYz1hLnRhcmdldCxkPWYubm9kZU5hbWUoYywiaW5wdXQiKXx8Zi5ub2RlTmFtZShjLCJidXR0b24iKT9jLmZvcm06YjtkJiYhZC5fc3VibWl0X2F0dGFjaGVkJiYoZi5ldmVudC5hZGQoZCwic3VibWl0Ll9zdWJtaXQiLGZ1bmN0aW9uKGEpe2EuX3N1Ym1pdF9idWJibGU9ITB9KSxkLl9zdWJtaXRfYXR0YWNoZWQ9ITApfSl9LHBvc3REaXNwYXRjaDpmdW5jdGlvbihhKXthLl9zdWJtaXRfYnViYmxlJiYoZGVsZXRlIGEuX3N1Ym1pdF9idWJibGUsdGhpcy5wYXJlbnROb2RlJiYhYS5pc1RyaWdnZXImJmYuZXZlbnQuc2ltdWxhdGUoInN1Ym1pdCIsdGhpcy5wYXJlbnROb2RlLGEsITApKX0sdGVhcmRvd246ZnVuY3Rpb24oKXtpZihmLm5vZGVOYW1lKHRoaXMsImZvcm0iKSlyZXR1cm4hMTtmLmV2ZW50LnJlbW92ZSh0aGlzLCIuX3N1Ym1pdCIpfX0pLGYuc3VwcG9ydC5jaGFuZ2VCdWJibGVzfHwoZi5ldmVudC5zcGVjaWFsLmNoYW5nZT17c2V0dXA6ZnVuY3Rpb24oKXtpZih6LnRlc3QodGhpcy5ub2RlTmFtZSkpe2lmKHRoaXMudHlwZT09PSJjaGVja2JveCJ8fHRoaXMudHlwZT09PSJyYWRpbyIpZi5ldmVudC5hZGQodGhpcywicHJvcGVydHljaGFuZ2UuX2NoYW5nZSIsZnVuY3Rpb24oYSl7YS5vcmlnaW5hbEV2ZW50LnByb3BlcnR5TmFtZT09PSJjaGVja2VkIiYmKHRoaXMuX2p1c3RfY2hhbmdlZD0hMCl9KSxmLmV2ZW50LmFkZCh0aGlzLCJjbGljay5fY2hhbmdlIixmdW5jdGlvbihhKXt0aGlzLl9qdXN0X2NoYW5nZWQmJiFhLmlzVHJpZ2dlciYmKHRoaXMuX2p1c3RfY2hhbmdlZD0hMSxmLmV2ZW50LnNpbXVsYXRlKCJjaGFuZ2UiLHRoaXMsYSwhMCkpfSk7cmV0dXJuITF9Zi5ldmVudC5hZGQodGhpcywiYmVmb3JlYWN0aXZhdGUuX2NoYW5nZSIsZnVuY3Rpb24oYSl7dmFyIGI9YS50YXJnZXQ7ei50ZXN0KGIubm9kZU5hbWUpJiYhYi5fY2hhbmdlX2F0dGFjaGVkJiYoZi5ldmVudC5hZGQoYiwiY2hhbmdlLl9jaGFuZ2UiLGZ1bmN0aW9uKGEpe3RoaXMucGFyZW50Tm9kZSYmIWEuaXNTaW11bGF0ZWQmJiFhLmlzVHJpZ2dlciYmZi5ldmVudC5zaW11bGF0ZSgiY2hhbmdlIix0aGlzLnBhcmVudE5vZGUsYSwhMCl9KSxiLl9jaGFuZ2VfYXR0YWNoZWQ9ITApfSl9LGhhbmRsZTpmdW5jdGlvbihhKXt2YXIgYj1hLnRhcmdldDtpZih0aGlzIT09Ynx8YS5pc1NpbXVsYXRlZHx8YS5pc1RyaWdnZXJ8fGIudHlwZSE9PSJyYWRpbyImJmIudHlwZSE9PSJjaGVja2JveCIpcmV0dXJuIGEuaGFuZGxlT2JqLmhhbmRsZXIuYXBwbHkodGhpcyxhcmd1bWVudHMpfSx0ZWFyZG93bjpmdW5jdGlvbigpe2YuZXZlbnQucmVtb3ZlKHRoaXMsIi5fY2hhbmdlIik7cmV0dXJuIHoudGVzdCh0aGlzLm5vZGVOYW1lKX19KSxmLnN1cHBvcnQuZm9jdXNpbkJ1YmJsZXN8fGYuZWFjaCh7Zm9jdXM6ImZvY3VzaW4iLGJsdXI6ImZvY3Vzb3V0In0sZnVuY3Rpb24oYSxiKXt2YXIgZD0wLGU9ZnVuY3Rpb24oYSl7Zi5ldmVudC5zaW11bGF0ZShiLGEudGFyZ2V0LGYuZXZlbnQuZml4KGEpLCEwKX07Zi5ldmVudC5zcGVjaWFsW2JdPXtzZXR1cDpmdW5jdGlvbigpe2QrKz09PTAmJmMuYWRkRXZlbnRMaXN0ZW5lcihhLGUsITApfSx0ZWFyZG93bjpmdW5jdGlvbigpey0tZD09PTAmJmMucmVtb3ZlRXZlbnRMaXN0ZW5lcihhLGUsITApfX19KSxmLmZuLmV4dGVuZCh7b246ZnVuY3Rpb24oYSxjLGQsZSxnKXt2YXIgaCxpO2lmKHR5cGVvZiBhPT0ib2JqZWN0Iil7dHlwZW9mIGMhPSJzdHJpbmciJiYoZD1kfHxjLGM9Yik7Zm9yKGkgaW4gYSl0aGlzLm9uKGksYyxkLGFbaV0sZyk7cmV0dXJuIHRoaXN9ZD09bnVsbCYmZT09bnVsbD8oZT1jLGQ9Yz1iKTplPT1udWxsJiYodHlwZW9mIGM9PSJzdHJpbmciPyhlPWQsZD1iKTooZT1kLGQ9YyxjPWIpKTtpZihlPT09ITEpZT1KO2Vsc2UgaWYoIWUpcmV0dXJuIHRoaXM7Zz09PTEmJihoPWUsZT1mdW5jdGlvbihhKXtmKCkub2ZmKGEpO3JldHVybiBoLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sZS5ndWlkPWguZ3VpZHx8KGguZ3VpZD1mLmd1aWQrKykpO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtmLmV2ZW50LmFkZCh0aGlzLGEsZSxkLGMpfSl9LG9uZTpmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gdGhpcy5vbihhLGIsYyxkLDEpfSxvZmY6ZnVuY3Rpb24oYSxjLGQpe2lmKGEmJmEucHJldmVudERlZmF1bHQmJmEuaGFuZGxlT2JqKXt2YXIgZT1hLmhhbmRsZU9iajtmKGEuZGVsZWdhdGVUYXJnZXQpLm9mZihlLm5hbWVzcGFjZT9lLm9yaWdUeXBlKyIuIitlLm5hbWVzcGFjZTplLm9yaWdUeXBlLGUuc2VsZWN0b3IsZS5oYW5kbGVyKTtyZXR1cm4gdGhpc31pZih0eXBlb2YgYT09Im9iamVjdCIpe2Zvcih2YXIgZyBpbiBhKXRoaXMub2ZmKGcsYyxhW2ddKTtyZXR1cm4gdGhpc31pZihjPT09ITF8fHR5cGVvZiBjPT0iZnVuY3Rpb24iKWQ9YyxjPWI7ZD09PSExJiYoZD1KKTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Zi5ldmVudC5yZW1vdmUodGhpcyxhLGQsYyl9KX0sYmluZDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIHRoaXMub24oYSxudWxsLGIsYyl9LHVuYmluZDpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLm9mZihhLG51bGwsYil9LGxpdmU6ZnVuY3Rpb24oYSxiLGMpe2YodGhpcy5jb250ZXh0KS5vbihhLHRoaXMuc2VsZWN0b3IsYixjKTtyZXR1cm4gdGhpc30sZGllOmZ1bmN0aW9uKGEsYil7Zih0aGlzLmNvbnRleHQpLm9mZihhLHRoaXMuc2VsZWN0b3J8fCIqKiIsYik7cmV0dXJuIHRoaXN9LGRlbGVnYXRlOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiB0aGlzLm9uKGIsYSxjLGQpfSx1bmRlbGVnYXRlOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD09MT90aGlzLm9mZihhLCIqKiIpOnRoaXMub2ZmKGIsYSxjKX0sdHJpZ2dlcjpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtmLmV2ZW50LnRyaWdnZXIoYSxiLHRoaXMpfSl9LHRyaWdnZXJIYW5kbGVyOmZ1bmN0aW9uKGEsYil7aWYodGhpc1swXSlyZXR1cm4gZi5ldmVudC50cmlnZ2VyKGEsYix0aGlzWzBdLCEwKX0sdG9nZ2xlOmZ1bmN0aW9uKGEpe3ZhciBiPWFyZ3VtZW50cyxjPWEuZ3VpZHx8Zi5ndWlkKyssZD0wLGU9ZnVuY3Rpb24oYyl7dmFyIGU9KGYuX2RhdGEodGhpcywibGFzdFRvZ2dsZSIrYS5ndWlkKXx8MCklZDtmLl9kYXRhKHRoaXMsImxhc3RUb2dnbGUiK2EuZ3VpZCxlKzEpLGMucHJldmVudERlZmF1bHQoKTtyZXR1cm4gYltlXS5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fCExfTtlLmd1aWQ9Yzt3aGlsZShkPGIubGVuZ3RoKWJbZCsrXS5ndWlkPWM7cmV0dXJuIHRoaXMuY2xpY2soZSl9LGhvdmVyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMubW91c2VlbnRlcihhKS5tb3VzZWxlYXZlKGJ8fGEpfX0pLGYuZWFjaCgiYmx1ciBmb2N1cyBmb2N1c2luIGZvY3Vzb3V0IGxvYWQgcmVzaXplIHNjcm9sbCB1bmxvYWQgY2xpY2sgZGJsY2xpY2sgbW91c2Vkb3duIG1vdXNldXAgbW91c2Vtb3ZlIG1vdXNlb3ZlciBtb3VzZW91dCBtb3VzZWVudGVyIG1vdXNlbGVhdmUgY2hhbmdlIHNlbGVjdCBzdWJtaXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBlcnJvciBjb250ZXh0bWVudSIuc3BsaXQoIiAiKSxmdW5jdGlvbihhLGIpe2YuZm5bYl09ZnVuY3Rpb24oYSxjKXtjPT1udWxsJiYoYz1hLGE9bnVsbCk7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg+MD90aGlzLm9uKGIsbnVsbCxhLGMpOnRoaXMudHJpZ2dlcihiKX0sZi5hdHRyRm4mJihmLmF0dHJGbltiXT0hMCksQy50ZXN0KGIpJiYoZi5ldmVudC5maXhIb29rc1tiXT1mLmV2ZW50LmtleUhvb2tzKSxELnRlc3QoYikmJihmLmV2ZW50LmZpeEhvb2tzW2JdPWYuZXZlbnQubW91c2VIb29rcyl9KSxmdW5jdGlvbigpe2Z1bmN0aW9uIHgoYSxiLGMsZSxmLGcpe2Zvcih2YXIgaD0wLGk9ZS5sZW5ndGg7aDxpO2grKyl7dmFyIGo9ZVtoXTtpZihqKXt2YXIgaz0hMTtqPWpbYV07d2hpbGUoail7aWYoaltkXT09PWMpe2s9ZVtqLnNpenNldF07YnJlYWt9aWYoai5ub2RlVHlwZT09PTEpe2d8fChqW2RdPWMsai5zaXpzZXQ9aCk7aWYodHlwZW9mIGIhPSJzdHJpbmciKXtpZihqPT09Yil7az0hMDticmVha319ZWxzZSBpZihtLmZpbHRlcihiLFtqXSkubGVuZ3RoPjApe2s9ajticmVha319aj1qW2FdfWVbaF09a319fWZ1bmN0aW9uIHcoYSxiLGMsZSxmLGcpe2Zvcih2YXIgaD0wLGk9ZS5sZW5ndGg7aDxpO2grKyl7dmFyIGo9ZVtoXTtpZihqKXt2YXIgaz0hMTtqPWpbYV07d2hpbGUoail7aWYoaltkXT09PWMpe2s9ZVtqLnNpenNldF07YnJlYWt9ai5ub2RlVHlwZT09PTEmJiFnJiYoaltkXT1jLGouc2l6c2V0PWgpO2lmKGoubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PWIpe2s9ajticmVha31qPWpbYV19ZVtoXT1rfX19dmFyIGE9LygoPzpcKCg/OlwoW14oKV0rXCl8W14oKV0rKStcKXxcWyg/OlxbW15cW1xdXSpcXXxbJyJdW14nIl0qWyciXXxbXlxbXF0nIl0rKStcXXxcXC58W14gPit+LChcW1xcXSspK3xbPit+XSkoXHMqLFxzKik/KCg/Oi58XHJ8XG4pKikvZyxkPSJzaXpjYWNoZSIrKE1hdGgucmFuZG9tKCkrIiIpLnJlcGxhY2UoIi4iLCIiKSxlPTAsZz1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLGg9ITEsaT0hMCxqPS9cXC9nLGs9L1xyXG4vZyxsPS9cVy87WzAsMF0uc29ydChmdW5jdGlvbigpe2k9ITE7cmV0dXJuIDB9KTt2YXIgbT1mdW5jdGlvbihiLGQsZSxmKXtlPWV8fFtdLGQ9ZHx8Yzt2YXIgaD1kO2lmKGQubm9kZVR5cGUhPT0xJiZkLm5vZGVUeXBlIT09OSlyZXR1cm5bXTtpZighYnx8dHlwZW9mIGIhPSJzdHJpbmciKXJldHVybiBlO3ZhciBpLGosayxsLG4scSxyLHQsdT0hMCx2PW0uaXNYTUwoZCksdz1bXSx4PWI7ZG97YS5leGVjKCIiKSxpPWEuZXhlYyh4KTtpZihpKXt4PWlbM10sdy5wdXNoKGlbMV0pO2lmKGlbMl0pe2w9aVszXTticmVha319fXdoaWxlKGkpO2lmKHcubGVuZ3RoPjEmJnAuZXhlYyhiKSlpZih3Lmxlbmd0aD09PTImJm8ucmVsYXRpdmVbd1swXV0paj15KHdbMF0rd1sxXSxkLGYpO2Vsc2V7aj1vLnJlbGF0aXZlW3dbMF1dP1tkXTptKHcuc2hpZnQoKSxkKTt3aGlsZSh3Lmxlbmd0aCliPXcuc2hpZnQoKSxvLnJlbGF0aXZlW2JdJiYoYis9dy5zaGlmdCgpKSxqPXkoYixqLGYpfWVsc2V7IWYmJncubGVuZ3RoPjEmJmQubm9kZVR5cGU9PT05JiYhdiYmby5tYXRjaC5JRC50ZXN0KHdbMF0pJiYhby5tYXRjaC5JRC50ZXN0KHdbdy5sZW5ndGgtMV0pJiYobj1tLmZpbmQody5zaGlmdCgpLGQsdiksZD1uLmV4cHI/bS5maWx0ZXIobi5leHByLG4uc2V0KVswXTpuLnNldFswXSk7aWYoZCl7bj1mP3tleHByOncucG9wKCksc2V0OnMoZil9Om0uZmluZCh3LnBvcCgpLHcubGVuZ3RoPT09MSYmKHdbMF09PT0ifiJ8fHdbMF09PT0iKyIpJiZkLnBhcmVudE5vZGU/ZC5wYXJlbnROb2RlOmQsdiksaj1uLmV4cHI/bS5maWx0ZXIobi5leHByLG4uc2V0KTpuLnNldCx3Lmxlbmd0aD4wP2s9cyhqKTp1PSExO3doaWxlKHcubGVuZ3RoKXE9dy5wb3AoKSxyPXEsby5yZWxhdGl2ZVtxXT9yPXcucG9wKCk6cT0iIixyPT1udWxsJiYocj1kKSxvLnJlbGF0aXZlW3FdKGsscix2KX1lbHNlIGs9dz1bXX1rfHwoaz1qKSxrfHxtLmVycm9yKHF8fGIpO2lmKGcuY2FsbChrKT09PSJbb2JqZWN0IEFycmF5XSIpaWYoIXUpZS5wdXNoLmFwcGx5KGUsayk7ZWxzZSBpZihkJiZkLm5vZGVUeXBlPT09MSlmb3IodD0wO2tbdF0hPW51bGw7dCsrKWtbdF0mJihrW3RdPT09ITB8fGtbdF0ubm9kZVR5cGU9PT0xJiZtLmNvbnRhaW5zKGQsa1t0XSkpJiZlLnB1c2goalt0XSk7ZWxzZSBmb3IodD0wO2tbdF0hPW51bGw7dCsrKWtbdF0mJmtbdF0ubm9kZVR5cGU9PT0xJiZlLnB1c2goalt0XSk7ZWxzZSBzKGssZSk7bCYmKG0obCxoLGUsZiksbS51bmlxdWVTb3J0KGUpKTtyZXR1cm4gZX07bS51bmlxdWVTb3J0PWZ1bmN0aW9uKGEpe2lmKHUpe2g9aSxhLnNvcnQodSk7aWYoaClmb3IodmFyIGI9MTtiPGEubGVuZ3RoO2IrKylhW2JdPT09YVtiLTFdJiZhLnNwbGljZShiLS0sMSl9cmV0dXJuIGF9LG0ubWF0Y2hlcz1mdW5jdGlvbihhLGIpe3JldHVybiBtKGEsbnVsbCxudWxsLGIpfSxtLm1hdGNoZXNTZWxlY3Rvcj1mdW5jdGlvbihhLGIpe3JldHVybiBtKGIsbnVsbCxudWxsLFthXSkubGVuZ3RoPjB9LG0uZmluZD1mdW5jdGlvbihhLGIsYyl7dmFyIGQsZSxmLGcsaCxpO2lmKCFhKXJldHVybltdO2ZvcihlPTAsZj1vLm9yZGVyLmxlbmd0aDtlPGY7ZSsrKXtoPW8ub3JkZXJbZV07aWYoZz1vLmxlZnRNYXRjaFtoXS5leGVjKGEpKXtpPWdbMV0sZy5zcGxpY2UoMSwxKTtpZihpLnN1YnN0cihpLmxlbmd0aC0xKSE9PSJcXCIpe2dbMV09KGdbMV18fCIiKS5yZXBsYWNlKGosIiIpLGQ9by5maW5kW2hdKGcsYixjKTtpZihkIT1udWxsKXthPWEucmVwbGFjZShvLm1hdGNoW2hdLCIiKTticmVha319fX1kfHwoZD10eXBlb2YgYi5nZXRFbGVtZW50c0J5VGFnTmFtZSE9InVuZGVmaW5lZCI/Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpOltdKTtyZXR1cm57c2V0OmQsZXhwcjphfX0sbS5maWx0ZXI9ZnVuY3Rpb24oYSxjLGQsZSl7dmFyIGYsZyxoLGksaixrLGwsbixwLHE9YSxyPVtdLHM9Yyx0PWMmJmNbMF0mJm0uaXNYTUwoY1swXSk7d2hpbGUoYSYmYy5sZW5ndGgpe2ZvcihoIGluIG8uZmlsdGVyKWlmKChmPW8ubGVmdE1hdGNoW2hdLmV4ZWMoYSkpIT1udWxsJiZmWzJdKXtrPW8uZmlsdGVyW2hdLGw9ZlsxXSxnPSExLGYuc3BsaWNlKDEsMSk7aWYobC5zdWJzdHIobC5sZW5ndGgtMSk9PT0iXFwiKWNvbnRpbnVlO3M9PT1yJiYocj1bXSk7aWYoby5wcmVGaWx0ZXJbaF0pe2Y9by5wcmVGaWx0ZXJbaF0oZixzLGQscixlLHQpO2lmKCFmKWc9aT0hMDtlbHNlIGlmKGY9PT0hMCljb250aW51ZX1pZihmKWZvcihuPTA7KGo9c1tuXSkhPW51bGw7bisrKWomJihpPWsoaixmLG4scykscD1lXmksZCYmaSE9bnVsbD9wP2c9ITA6c1tuXT0hMTpwJiYoci5wdXNoKGopLGc9ITApKTtpZihpIT09Yil7ZHx8KHM9ciksYT1hLnJlcGxhY2Uoby5tYXRjaFtoXSwiIik7aWYoIWcpcmV0dXJuW107YnJlYWt9fWlmKGE9PT1xKWlmKGc9PW51bGwpbS5lcnJvcihhKTtlbHNlIGJyZWFrO3E9YX1yZXR1cm4gc30sbS5lcnJvcj1mdW5jdGlvbihhKXt0aHJvdyBuZXcgRXJyb3IoIlN5bnRheCBlcnJvciwgdW5yZWNvZ25pemVkIGV4cHJlc3Npb246ICIrYSl9O3ZhciBuPW0uZ2V0VGV4dD1mdW5jdGlvbihhKXt2YXIgYixjLGQ9YS5ub2RlVHlwZSxlPSIiO2lmKGQpe2lmKGQ9PT0xfHxkPT09OXx8ZD09PTExKXtpZih0eXBlb2YgYS50ZXh0Q29udGVudD09InN0cmluZyIpcmV0dXJuIGEudGV4dENvbnRlbnQ7aWYodHlwZW9mIGEuaW5uZXJUZXh0PT0ic3RyaW5nIilyZXR1cm4gYS5pbm5lclRleHQucmVwbGFjZShrLCIiKTtmb3IoYT1hLmZpcnN0Q2hpbGQ7YTthPWEubmV4dFNpYmxpbmcpZSs9bihhKX1lbHNlIGlmKGQ9PT0zfHxkPT09NClyZXR1cm4gYS5ub2RlVmFsdWV9ZWxzZSBmb3IoYj0wO2M9YVtiXTtiKyspYy5ub2RlVHlwZSE9PTgmJihlKz1uKGMpKTtyZXR1cm4gZX0sbz1tLnNlbGVjdG9ycz17b3JkZXI6WyJJRCIsIk5BTUUiLCJUQUciXSxtYXRjaDp7SUQ6LyMoKD86W1x3XHUwMGMwLVx1RkZGRlwtXXxcXC4pKykvLENMQVNTOi9cLigoPzpbXHdcdTAwYzAtXHVGRkZGXC1dfFxcLikrKS8sTkFNRTovXFtuYW1lPVsnIl0qKCg/Oltcd1x1MDBjMC1cdUZGRkZcLV18XFwuKSspWyciXSpcXS8sQVRUUjovXFtccyooKD86W1x3XHUwMGMwLVx1RkZGRlwtXXxcXC4pKylccyooPzooXFM/PSlccyooPzooWyciXSkoLio/KVwzfCgjPyg/Oltcd1x1MDBjMC1cdUZGRkZcLV18XFwuKSopfCl8KVxzKlxdLyxUQUc6L14oKD86W1x3XHUwMGMwLVx1RkZGRlwqXC1dfFxcLikrKS8sQ0hJTEQ6Lzoob25seXxudGh8bGFzdHxmaXJzdCktY2hpbGQoPzpcKFxzKihldmVufG9kZHwoPzpbK1wtXT9cZCt8KD86WytcLV0/XGQqKT9uXHMqKD86WytcLV1ccypcZCspPykpXHMqXCkpPy8sUE9TOi86KG50aHxlcXxndHxsdHxmaXJzdHxsYXN0fGV2ZW58b2RkKSg/OlwoKFxkKilcKSk/KD89W15cLV18JCkvLFBTRVVETzovOigoPzpbXHdcdTAwYzAtXHVGRkZGXC1dfFxcLikrKSg/OlwoKFsnIl0/KSgoPzpcKFteXCldK1wpfFteXChcKV0qKSspXDJcKSk/L30sbGVmdE1hdGNoOnt9LGF0dHJNYXA6eyJjbGFzcyI6ImNsYXNzTmFtZSIsImZvciI6Imh0bWxGb3IifSxhdHRySGFuZGxlOntocmVmOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgiaHJlZiIpfSx0eXBlOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgidHlwZSIpfX0scmVsYXRpdmU6eyIrIjpmdW5jdGlvbihhLGIpe3ZhciBjPXR5cGVvZiBiPT0ic3RyaW5nIixkPWMmJiFsLnRlc3QoYiksZT1jJiYhZDtkJiYoYj1iLnRvTG93ZXJDYXNlKCkpO2Zvcih2YXIgZj0wLGc9YS5sZW5ndGgsaDtmPGc7ZisrKWlmKGg9YVtmXSl7d2hpbGUoKGg9aC5wcmV2aW91c1NpYmxpbmcpJiZoLm5vZGVUeXBlIT09MSk7YVtmXT1lfHxoJiZoLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1iP2h8fCExOmg9PT1ifWUmJm0uZmlsdGVyKGIsYSwhMCl9LCI+IjpmdW5jdGlvbihhLGIpe3ZhciBjLGQ9dHlwZW9mIGI9PSJzdHJpbmciLGU9MCxmPWEubGVuZ3RoO2lmKGQmJiFsLnRlc3QoYikpe2I9Yi50b0xvd2VyQ2FzZSgpO2Zvcig7ZTxmO2UrKyl7Yz1hW2VdO2lmKGMpe3ZhciBnPWMucGFyZW50Tm9kZTthW2VdPWcubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PWI/ZzohMX19fWVsc2V7Zm9yKDtlPGY7ZSsrKWM9YVtlXSxjJiYoYVtlXT1kP2MucGFyZW50Tm9kZTpjLnBhcmVudE5vZGU9PT1iKTtkJiZtLmZpbHRlcihiLGEsITApfX0sIiI6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGY9ZSsrLGc9eDt0eXBlb2YgYj09InN0cmluZyImJiFsLnRlc3QoYikmJihiPWIudG9Mb3dlckNhc2UoKSxkPWIsZz13KSxnKCJwYXJlbnROb2RlIixiLGYsYSxkLGMpfSwifiI6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGY9ZSsrLGc9eDt0eXBlb2YgYj09InN0cmluZyImJiFsLnRlc3QoYikmJihiPWIudG9Mb3dlckNhc2UoKSxkPWIsZz13KSxnKCJwcmV2aW91c1NpYmxpbmciLGIsZixhLGQsYyl9fSxmaW5kOntJRDpmdW5jdGlvbihhLGIsYyl7aWYodHlwZW9mIGIuZ2V0RWxlbWVudEJ5SWQhPSJ1bmRlZmluZWQiJiYhYyl7dmFyIGQ9Yi5nZXRFbGVtZW50QnlJZChhWzFdKTtyZXR1cm4gZCYmZC5wYXJlbnROb2RlP1tkXTpbXX19LE5BTUU6ZnVuY3Rpb24oYSxiKXtpZih0eXBlb2YgYi5nZXRFbGVtZW50c0J5TmFtZSE9InVuZGVmaW5lZCIpe3ZhciBjPVtdLGQ9Yi5nZXRFbGVtZW50c0J5TmFtZShhWzFdKTtmb3IodmFyIGU9MCxmPWQubGVuZ3RoO2U8ZjtlKyspZFtlXS5nZXRBdHRyaWJ1dGUoIm5hbWUiKT09PWFbMV0mJmMucHVzaChkW2VdKTtyZXR1cm4gYy5sZW5ndGg9PT0wP251bGw6Y319LFRBRzpmdW5jdGlvbihhLGIpe2lmKHR5cGVvZiBiLmdldEVsZW1lbnRzQnlUYWdOYW1lIT0idW5kZWZpbmVkIilyZXR1cm4gYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhWzFdKX19LHByZUZpbHRlcjp7Q0xBU1M6ZnVuY3Rpb24oYSxiLGMsZCxlLGYpe2E9IiAiK2FbMV0ucmVwbGFjZShqLCIiKSsiICI7aWYoZilyZXR1cm4gYTtmb3IodmFyIGc9MCxoOyhoPWJbZ10pIT1udWxsO2crKyloJiYoZV4oaC5jbGFzc05hbWUmJigiICIraC5jbGFzc05hbWUrIiAiKS5yZXBsYWNlKC9bXHRcblxyXS9nLCIgIikuaW5kZXhPZihhKT49MCk/Y3x8ZC5wdXNoKGgpOmMmJihiW2ddPSExKSk7cmV0dXJuITF9LElEOmZ1bmN0aW9uKGEpe3JldHVybiBhWzFdLnJlcGxhY2UoaiwiIil9LFRBRzpmdW5jdGlvbihhLGIpe3JldHVybiBhWzFdLnJlcGxhY2UoaiwiIikudG9Mb3dlckNhc2UoKX0sQ0hJTEQ6ZnVuY3Rpb24oYSl7aWYoYVsxXT09PSJudGgiKXthWzJdfHxtLmVycm9yKGFbMF0pLGFbMl09YVsyXS5yZXBsYWNlKC9eXCt8XHMqL2csIiIpO3ZhciBiPS8oLT8pKFxkKikoPzpuKFsrXC1dP1xkKikpPy8uZXhlYyhhWzJdPT09ImV2ZW4iJiYiMm4ifHxhWzJdPT09Im9kZCImJiIybisxInx8IS9cRC8udGVzdChhWzJdKSYmIjBuKyIrYVsyXXx8YVsyXSk7YVsyXT1iWzFdKyhiWzJdfHwxKS0wLGFbM109YlszXS0wfWVsc2UgYVsyXSYmbS5lcnJvcihhWzBdKTthWzBdPWUrKztyZXR1cm4gYX0sQVRUUjpmdW5jdGlvbihhLGIsYyxkLGUsZil7dmFyIGc9YVsxXT1hWzFdLnJlcGxhY2UoaiwiIik7IWYmJm8uYXR0ck1hcFtnXSYmKGFbMV09by5hdHRyTWFwW2ddKSxhWzRdPShhWzRdfHxhWzVdfHwiIikucmVwbGFjZShqLCIiKSxhWzJdPT09In49IiYmKGFbNF09IiAiK2FbNF0rIiAiKTtyZXR1cm4gYX0sUFNFVURPOmZ1bmN0aW9uKGIsYyxkLGUsZil7aWYoYlsxXT09PSJub3QiKWlmKChhLmV4ZWMoYlszXSl8fCIiKS5sZW5ndGg+MXx8L15cdy8udGVzdChiWzNdKSliWzNdPW0oYlszXSxudWxsLG51bGwsYyk7ZWxzZXt2YXIgZz1tLmZpbHRlcihiWzNdLGMsZCwhMF5mKTtkfHxlLnB1c2guYXBwbHkoZSxnKTtyZXR1cm4hMX1lbHNlIGlmKG8ubWF0Y2guUE9TLnRlc3QoYlswXSl8fG8ubWF0Y2guQ0hJTEQudGVzdChiWzBdKSlyZXR1cm4hMDtyZXR1cm4gYn0sUE9TOmZ1bmN0aW9uKGEpe2EudW5zaGlmdCghMCk7cmV0dXJuIGF9fSxmaWx0ZXJzOntlbmFibGVkOmZ1bmN0aW9uKGEpe3JldHVybiBhLmRpc2FibGVkPT09ITEmJmEudHlwZSE9PSJoaWRkZW4ifSxkaXNhYmxlZDpmdW5jdGlvbihhKXtyZXR1cm4gYS5kaXNhYmxlZD09PSEwfSxjaGVja2VkOmZ1bmN0aW9uKGEpe3JldHVybiBhLmNoZWNrZWQ9PT0hMH0sc2VsZWN0ZWQ6ZnVuY3Rpb24oYSl7YS5wYXJlbnROb2RlJiZhLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleDtyZXR1cm4gYS5zZWxlY3RlZD09PSEwfSxwYXJlbnQ6ZnVuY3Rpb24oYSl7cmV0dXJuISFhLmZpcnN0Q2hpbGR9LGVtcHR5OmZ1bmN0aW9uKGEpe3JldHVybiFhLmZpcnN0Q2hpbGR9LGhhczpmdW5jdGlvbihhLGIsYyl7cmV0dXJuISFtKGNbM10sYSkubGVuZ3RofSxoZWFkZXI6ZnVuY3Rpb24oYSl7cmV0dXJuL2hcZC9pLnRlc3QoYS5ub2RlTmFtZSl9LHRleHQ6ZnVuY3Rpb24oYSl7dmFyIGI9YS5nZXRBdHRyaWJ1dGUoInR5cGUiKSxjPWEudHlwZTtyZXR1cm4gYS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09ImlucHV0IiYmInRleHQiPT09YyYmKGI9PT1jfHxiPT09bnVsbCl9LHJhZGlvOmZ1bmN0aW9uKGEpe3JldHVybiBhLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT0iaW5wdXQiJiYicmFkaW8iPT09YS50eXBlfSxjaGVja2JveDpmdW5jdGlvbihhKXtyZXR1cm4gYS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09ImlucHV0IiYmImNoZWNrYm94Ij09PWEudHlwZX0sZmlsZTpmdW5jdGlvbihhKXtyZXR1cm4gYS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09ImlucHV0IiYmImZpbGUiPT09YS50eXBlfSxwYXNzd29yZDpmdW5jdGlvbihhKXtyZXR1cm4gYS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09ImlucHV0IiYmInBhc3N3b3JkIj09PWEudHlwZX0sc3VibWl0OmZ1bmN0aW9uKGEpe3ZhciBiPWEubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4oYj09PSJpbnB1dCJ8fGI9PT0iYnV0dG9uIikmJiJzdWJtaXQiPT09YS50eXBlfSxpbWFnZTpmdW5jdGlvbihhKXtyZXR1cm4gYS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09ImlucHV0IiYmImltYWdlIj09PWEudHlwZX0scmVzZXQ6ZnVuY3Rpb24oYSl7dmFyIGI9YS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybihiPT09ImlucHV0Inx8Yj09PSJidXR0b24iKSYmInJlc2V0Ij09PWEudHlwZX0sYnV0dG9uOmZ1bmN0aW9uKGEpe3ZhciBiPWEubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4gYj09PSJpbnB1dCImJiJidXR0b24iPT09YS50eXBlfHxiPT09ImJ1dHRvbiJ9LGlucHV0OmZ1bmN0aW9uKGEpe3JldHVybi9pbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uL2kudGVzdChhLm5vZGVOYW1lKX0sZm9jdXM6ZnVuY3Rpb24oYSl7cmV0dXJuIGE9PT1hLm93bmVyRG9jdW1lbnQuYWN0aXZlRWxlbWVudH19LHNldEZpbHRlcnM6e2ZpcnN0OmZ1bmN0aW9uKGEsYil7cmV0dXJuIGI9PT0wfSxsYXN0OmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiBiPT09ZC5sZW5ndGgtMX0sZXZlbjpmdW5jdGlvbihhLGIpe3JldHVybiBiJTI9PT0wfSxvZGQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYiUyPT09MX0sbHQ6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBiPGNbM10tMH0sZ3Q6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBiPmNbM10tMH0sbnRoOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gY1szXS0wPT09Yn0sZXE6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBjWzNdLTA9PT1ifX0sZmlsdGVyOntQU0VVRE86ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9YlsxXSxmPW8uZmlsdGVyc1tlXTtpZihmKXJldHVybiBmKGEsYyxiLGQpO2lmKGU9PT0iY29udGFpbnMiKXJldHVybihhLnRleHRDb250ZW50fHxhLmlubmVyVGV4dHx8bihbYV0pfHwiIikuaW5kZXhPZihiWzNdKT49MDtpZihlPT09Im5vdCIpe3ZhciBnPWJbM107Zm9yKHZhciBoPTAsaT1nLmxlbmd0aDtoPGk7aCsrKWlmKGdbaF09PT1hKXJldHVybiExO3JldHVybiEwfW0uZXJyb3IoZSl9LENISUxEOmZ1bmN0aW9uKGEsYil7dmFyIGMsZSxmLGcsaCxpLGosaz1iWzFdLGw9YTtzd2l0Y2goayl7Y2FzZSJvbmx5IjpjYXNlImZpcnN0Ijp3aGlsZShsPWwucHJldmlvdXNTaWJsaW5nKWlmKGwubm9kZVR5cGU9PT0xKXJldHVybiExO2lmKGs9PT0iZmlyc3QiKXJldHVybiEwO2w9YTtjYXNlImxhc3QiOndoaWxlKGw9bC5uZXh0U2libGluZylpZihsLm5vZGVUeXBlPT09MSlyZXR1cm4hMTtyZXR1cm4hMDtjYXNlIm50aCI6Yz1iWzJdLGU9YlszXTtpZihjPT09MSYmZT09PTApcmV0dXJuITA7Zj1iWzBdLGc9YS5wYXJlbnROb2RlO2lmKGcmJihnW2RdIT09Znx8IWEubm9kZUluZGV4KSl7aT0wO2ZvcihsPWcuZmlyc3RDaGlsZDtsO2w9bC5uZXh0U2libGluZylsLm5vZGVUeXBlPT09MSYmKGwubm9kZUluZGV4PSsraSk7Z1tkXT1mfWo9YS5ub2RlSW5kZXgtZTtyZXR1cm4gYz09PTA/aj09PTA6aiVjPT09MCYmai9jPj0wfX0sSUQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5ub2RlVHlwZT09PTEmJmEuZ2V0QXR0cmlidXRlKCJpZCIpPT09Yn0sVEFHOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGI9PT0iKiImJmEubm9kZVR5cGU9PT0xfHwhIWEubm9kZU5hbWUmJmEubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PWJ9LENMQVNTOmZ1bmN0aW9uKGEsYil7cmV0dXJuKCIgIisoYS5jbGFzc05hbWV8fGEuZ2V0QXR0cmlidXRlKCJjbGFzcyIpKSsiICIpLmluZGV4T2YoYik+LTF9LEFUVFI6ZnVuY3Rpb24oYSxiKXt2YXIgYz1iWzFdLGQ9bS5hdHRyP20uYXR0cihhLGMpOm8uYXR0ckhhbmRsZVtjXT9vLmF0dHJIYW5kbGVbY10oYSk6YVtjXSE9bnVsbD9hW2NdOmEuZ2V0QXR0cmlidXRlKGMpLGU9ZCsiIixmPWJbMl0sZz1iWzRdO3JldHVybiBkPT1udWxsP2Y9PT0iIT0iOiFmJiZtLmF0dHI/ZCE9bnVsbDpmPT09Ij0iP2U9PT1nOmY9PT0iKj0iP2UuaW5kZXhPZihnKT49MDpmPT09In49Ij8oIiAiK2UrIiAiKS5pbmRleE9mKGcpPj0wOmc/Zj09PSIhPSI/ZSE9PWc6Zj09PSJePSI/ZS5pbmRleE9mKGcpPT09MDpmPT09IiQ9Ij9lLnN1YnN0cihlLmxlbmd0aC1nLmxlbmd0aCk9PT1nOmY9PT0ifD0iP2U9PT1nfHxlLnN1YnN0cigwLGcubGVuZ3RoKzEpPT09ZysiLSI6ITE6ZSYmZCE9PSExfSxQT1M6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9YlsyXSxmPW8uc2V0RmlsdGVyc1tlXTtpZihmKXJldHVybiBmKGEsYyxiLGQpfX19LHA9by5tYXRjaC5QT1MscT1mdW5jdGlvbihhLGIpe3JldHVybiJcXCIrKGItMCsxKX07Zm9yKHZhciByIGluIG8ubWF0Y2gpby5tYXRjaFtyXT1uZXcgUmVnRXhwKG8ubWF0Y2hbcl0uc291cmNlKy8oPyFbXlxbXSpcXSkoPyFbXlwoXSpcKSkvLnNvdXJjZSksby5sZWZ0TWF0Y2hbcl09bmV3IFJlZ0V4cCgvKF4oPzoufFxyfFxuKSo/KS8uc291cmNlK28ubWF0Y2hbcl0uc291cmNlLnJlcGxhY2UoL1xcKFxkKykvZyxxKSk7by5tYXRjaC5nbG9iYWxQT1M9cDt2YXIgcz1mdW5jdGlvbihhLGIpe2E9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYSwwKTtpZihiKXtiLnB1c2guYXBwbHkoYixhKTtyZXR1cm4gYn1yZXR1cm4gYX07dHJ5e0FycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGMuZG9jdW1lbnRFbGVtZW50LmNoaWxkTm9kZXMsMClbMF0ubm9kZVR5cGV9Y2F0Y2godCl7cz1mdW5jdGlvbihhLGIpe3ZhciBjPTAsZD1ifHxbXTtpZihnLmNhbGwoYSk9PT0iW29iamVjdCBBcnJheV0iKUFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KGQsYSk7ZWxzZSBpZih0eXBlb2YgYS5sZW5ndGg9PSJudW1iZXIiKWZvcih2YXIgZT1hLmxlbmd0aDtjPGU7YysrKWQucHVzaChhW2NdKTtlbHNlIGZvcig7YVtjXTtjKyspZC5wdXNoKGFbY10pO3JldHVybiBkfX12YXIgdSx2O2MuZG9jdW1lbnRFbGVtZW50LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uP3U9ZnVuY3Rpb24oYSxiKXtpZihhPT09Yil7aD0hMDtyZXR1cm4gMH1pZighYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbnx8IWIuY29tcGFyZURvY3VtZW50UG9zaXRpb24pcmV0dXJuIGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24/LTE6MTtyZXR1cm4gYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihiKSY0Py0xOjF9Oih1PWZ1bmN0aW9uKGEsYil7aWYoYT09PWIpe2g9ITA7cmV0dXJuIDB9aWYoYS5zb3VyY2VJbmRleCYmYi5zb3VyY2VJbmRleClyZXR1cm4gYS5zb3VyY2VJbmRleC1iLnNvdXJjZUluZGV4O3ZhciBjLGQsZT1bXSxmPVtdLGc9YS5wYXJlbnROb2RlLGk9Yi5wYXJlbnROb2RlLGo9ZztpZihnPT09aSlyZXR1cm4gdihhLGIpO2lmKCFnKXJldHVybi0xO2lmKCFpKXJldHVybiAxO3doaWxlKGopZS51bnNoaWZ0KGopLGo9ai5wYXJlbnROb2RlO2o9aTt3aGlsZShqKWYudW5zaGlmdChqKSxqPWoucGFyZW50Tm9kZTtjPWUubGVuZ3RoLGQ9Zi5sZW5ndGg7Zm9yKHZhciBrPTA7azxjJiZrPGQ7aysrKWlmKGVba10hPT1mW2tdKXJldHVybiB2KGVba10sZltrXSk7cmV0dXJuIGs9PT1jP3YoYSxmW2tdLC0xKTp2KGVba10sYiwxKX0sdj1mdW5jdGlvbihhLGIsYyl7aWYoYT09PWIpcmV0dXJuIGM7dmFyIGQ9YS5uZXh0U2libGluZzt3aGlsZShkKXtpZihkPT09YilyZXR1cm4tMTtkPWQubmV4dFNpYmxpbmd9cmV0dXJuIDF9KSxmdW5jdGlvbigpe3ZhciBhPWMuY3JlYXRlRWxlbWVudCgiZGl2IiksZD0ic2NyaXB0IisobmV3IERhdGUpLmdldFRpbWUoKSxlPWMuZG9jdW1lbnRFbGVtZW50O2EuaW5uZXJIVE1MPSI8YSBuYW1lPSciK2QrIicvPiIsZS5pbnNlcnRCZWZvcmUoYSxlLmZpcnN0Q2hpbGQpLGMuZ2V0RWxlbWVudEJ5SWQoZCkmJihvLmZpbmQuSUQ9ZnVuY3Rpb24oYSxjLGQpe2lmKHR5cGVvZiBjLmdldEVsZW1lbnRCeUlkIT0idW5kZWZpbmVkIiYmIWQpe3ZhciBlPWMuZ2V0RWxlbWVudEJ5SWQoYVsxXSk7cmV0dXJuIGU/ZS5pZD09PWFbMV18fHR5cGVvZiBlLmdldEF0dHJpYnV0ZU5vZGUhPSJ1bmRlZmluZWQiJiZlLmdldEF0dHJpYnV0ZU5vZGUoImlkIikubm9kZVZhbHVlPT09YVsxXT9bZV06YjpbXX19LG8uZmlsdGVyLklEPWZ1bmN0aW9uKGEsYil7dmFyIGM9dHlwZW9mIGEuZ2V0QXR0cmlidXRlTm9kZSE9InVuZGVmaW5lZCImJmEuZ2V0QXR0cmlidXRlTm9kZSgiaWQiKTtyZXR1cm4gYS5ub2RlVHlwZT09PTEmJmMmJmMubm9kZVZhbHVlPT09Yn0pLGUucmVtb3ZlQ2hpbGQoYSksZT1hPW51bGx9KCksZnVuY3Rpb24oKXt2YXIgYT1jLmNyZWF0ZUVsZW1lbnQoImRpdiIpO2EuYXBwZW5kQ2hpbGQoYy5jcmVhdGVDb21tZW50KCIiKSksYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpLmxlbmd0aD4wJiYoby5maW5kLlRBRz1mdW5jdGlvbihhLGIpe3ZhciBjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYVsxXSk7aWYoYVsxXT09PSIqIil7dmFyIGQ9W107Zm9yKHZhciBlPTA7Y1tlXTtlKyspY1tlXS5ub2RlVHlwZT09PTEmJmQucHVzaChjW2VdKTtjPWR9cmV0dXJuIGN9KSxhLmlubmVySFRNTD0iPGEgaHJlZj0nIyc+PC9hPiIsYS5maXJzdENoaWxkJiZ0eXBlb2YgYS5maXJzdENoaWxkLmdldEF0dHJpYnV0ZSE9InVuZGVmaW5lZCImJmEuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUoImhyZWYiKSE9PSIjIiYmKG8uYXR0ckhhbmRsZS5ocmVmPWZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgiaHJlZiIsMil9KSxhPW51bGx9KCksYy5xdWVyeVNlbGVjdG9yQWxsJiZmdW5jdGlvbigpe3ZhciBhPW0sYj1jLmNyZWF0ZUVsZW1lbnQoImRpdiIpLGQ9Il9fc2l6emxlX18iO2IuaW5uZXJIVE1MPSI8cCBjbGFzcz0nVEVTVCc+PC9wPiI7aWYoIWIucXVlcnlTZWxlY3RvckFsbHx8Yi5xdWVyeVNlbGVjdG9yQWxsKCIuVEVTVCIpLmxlbmd0aCE9PTApe209ZnVuY3Rpb24oYixlLGYsZyl7ZT1lfHxjO2lmKCFnJiYhbS5pc1hNTChlKSl7dmFyIGg9L14oXHcrJCl8XlwuKFtcd1wtXSskKXxeIyhbXHdcLV0rJCkvLmV4ZWMoYik7aWYoaCYmKGUubm9kZVR5cGU9PT0xfHxlLm5vZGVUeXBlPT09OSkpe2lmKGhbMV0pcmV0dXJuIHMoZS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKSxmKTtpZihoWzJdJiZvLmZpbmQuQ0xBU1MmJmUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSlyZXR1cm4gcyhlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoaFsyXSksZil9aWYoZS5ub2RlVHlwZT09PTkpe2lmKGI9PT0iYm9keSImJmUuYm9keSlyZXR1cm4gcyhbZS5ib2R5XSxmKTtpZihoJiZoWzNdKXt2YXIgaT1lLmdldEVsZW1lbnRCeUlkKGhbM10pO2lmKCFpfHwhaS5wYXJlbnROb2RlKXJldHVybiBzKFtdLGYpO2lmKGkuaWQ9PT1oWzNdKXJldHVybiBzKFtpXSxmKX10cnl7cmV0dXJuIHMoZS5xdWVyeVNlbGVjdG9yQWxsKGIpLGYpfWNhdGNoKGope319ZWxzZSBpZihlLm5vZGVUeXBlPT09MSYmZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpIT09Im9iamVjdCIpe3ZhciBrPWUsbD1lLmdldEF0dHJpYnV0ZSgiaWQiKSxuPWx8fGQscD1lLnBhcmVudE5vZGUscT0vXlxzKlsrfl0vLnRlc3QoYik7bD9uPW4ucmVwbGFjZSgvJy9nLCJcXCQmIik6ZS5zZXRBdHRyaWJ1dGUoImlkIixuKSxxJiZwJiYoZT1lLnBhcmVudE5vZGUpO3RyeXtpZighcXx8cClyZXR1cm4gcyhlLnF1ZXJ5U2VsZWN0b3JBbGwoIltpZD0nIituKyInXSAiK2IpLGYpfWNhdGNoKHIpe31maW5hbGx5e2x8fGsucmVtb3ZlQXR0cmlidXRlKCJpZCIpfX19cmV0dXJuIGEoYixlLGYsZyl9O2Zvcih2YXIgZSBpbiBhKW1bZV09YVtlXTtiPW51bGx9fSgpLGZ1bmN0aW9uKCl7dmFyIGE9Yy5kb2N1bWVudEVsZW1lbnQsYj1hLm1hdGNoZXNTZWxlY3Rvcnx8YS5tb3pNYXRjaGVzU2VsZWN0b3J8fGEud2Via2l0TWF0Y2hlc1NlbGVjdG9yfHxhLm1zTWF0Y2hlc1NlbGVjdG9yO2lmKGIpe3ZhciBkPSFiLmNhbGwoYy5jcmVhdGVFbGVtZW50KCJkaXYiKSwiZGl2IiksZT0hMTt0cnl7Yi5jYWxsKGMuZG9jdW1lbnRFbGVtZW50LCJbdGVzdCE9JyddOnNpenpsZSIpfWNhdGNoKGYpe2U9ITB9bS5tYXRjaGVzU2VsZWN0b3I9ZnVuY3Rpb24oYSxjKXtjPWMucmVwbGFjZSgvXD1ccyooW14nIlxdXSopXHMqXF0vZywiPSckMSddIik7aWYoIW0uaXNYTUwoYSkpdHJ5e2lmKGV8fCFvLm1hdGNoLlBTRVVETy50ZXN0KGMpJiYhLyE9Ly50ZXN0KGMpKXt2YXIgZj1iLmNhbGwoYSxjKTtpZihmfHwhZHx8YS5kb2N1bWVudCYmYS5kb2N1bWVudC5ub2RlVHlwZSE9PTExKXJldHVybiBmfX1jYXRjaChnKXt9cmV0dXJuIG0oYyxudWxsLG51bGwsW2FdKS5sZW5ndGg+MH19fSgpLGZ1bmN0aW9uKCl7dmFyIGE9Yy5jcmVhdGVFbGVtZW50KCJkaXYiKTthLmlubmVySFRNTD0iPGRpdiBjbGFzcz0ndGVzdCBlJz48L2Rpdj48ZGl2IGNsYXNzPSd0ZXN0Jz48L2Rpdj4iO2lmKCEhYS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lJiZhLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImUiKS5sZW5ndGghPT0wKXthLmxhc3RDaGlsZC5jbGFzc05hbWU9ImUiO2lmKGEuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiZSIpLmxlbmd0aD09PTEpcmV0dXJuO28ub3JkZXIuc3BsaWNlKDEsMCwiQ0xBU1MiKSxvLmZpbmQuQ0xBU1M9ZnVuY3Rpb24oYSxiLGMpe2lmKHR5cGVvZiBiLmdldEVsZW1lbnRzQnlDbGFzc05hbWUhPSJ1bmRlZmluZWQiJiYhYylyZXR1cm4gYi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGFbMV0pfSxhPW51bGx9fSgpLGMuZG9jdW1lbnRFbGVtZW50LmNvbnRhaW5zP20uY29udGFpbnM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSE9PWImJihhLmNvbnRhaW5zP2EuY29udGFpbnMoYik6ITApfTpjLmRvY3VtZW50RWxlbWVudC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbj9tLmNvbnRhaW5zPWZ1bmN0aW9uKGEsYil7cmV0dXJuISEoYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihiKSYxNil9Om0uY29udGFpbnM9ZnVuY3Rpb24oKXtyZXR1cm4hMX0sbS5pc1hNTD1mdW5jdGlvbihhKXt2YXIgYj0oYT9hLm93bmVyRG9jdW1lbnR8fGE6MCkuZG9jdW1lbnRFbGVtZW50O3JldHVybiBiP2Iubm9kZU5hbWUhPT0iSFRNTCI6ITF9O3ZhciB5PWZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlPVtdLGY9IiIsZz1iLm5vZGVUeXBlP1tiXTpiO3doaWxlKGQ9by5tYXRjaC5QU0VVRE8uZXhlYyhhKSlmKz1kWzBdLGE9YS5yZXBsYWNlKG8ubWF0Y2guUFNFVURPLCIiKTthPW8ucmVsYXRpdmVbYV0/YSsiKiI6YTtmb3IodmFyIGg9MCxpPWcubGVuZ3RoO2g8aTtoKyspbShhLGdbaF0sZSxjKTtyZXR1cm4gbS5maWx0ZXIoZixlKX07bS5hdHRyPWYuYXR0cixtLnNlbGVjdG9ycy5hdHRyTWFwPXt9LGYuZmluZD1tLGYuZXhwcj1tLnNlbGVjdG9ycyxmLmV4cHJbIjoiXT1mLmV4cHIuZmlsdGVycyxmLnVuaXF1ZT1tLnVuaXF1ZVNvcnQsZi50ZXh0PW0uZ2V0VGV4dCxmLmlzWE1MRG9jPW0uaXNYTUwsZi5jb250YWlucz1tLmNvbnRhaW5zfSgpO3ZhciBMPS9VbnRpbCQvLE09L14oPzpwYXJlbnRzfHByZXZVbnRpbHxwcmV2QWxsKS8sTj0vLC8sTz0vXi5bXjojXFtcLixdKiQvLFA9QXJyYXkucHJvdG90eXBlLnNsaWNlLFE9Zi5leHByLm1hdGNoLmdsb2JhbFBPUyxSPXtjaGlsZHJlbjohMCxjb250ZW50czohMCxuZXh0OiEwLHByZXY6ITB9O2YuZm4uZXh0ZW5kKHtmaW5kOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMsYyxkO2lmKHR5cGVvZiBhIT0ic3RyaW5nIilyZXR1cm4gZihhKS5maWx0ZXIoZnVuY3Rpb24oKXtmb3IoYz0wLGQ9Yi5sZW5ndGg7YzxkO2MrKylpZihmLmNvbnRhaW5zKGJbY10sdGhpcykpcmV0dXJuITB9KTt2YXIgZT10aGlzLnB1c2hTdGFjaygiIiwiZmluZCIsYSksZyxoLGk7Zm9yKGM9MCxkPXRoaXMubGVuZ3RoO2M8ZDtjKyspe2c9ZS5sZW5ndGgsZi5maW5kKGEsdGhpc1tjXSxlKTtpZihjPjApZm9yKGg9ZztoPGUubGVuZ3RoO2grKylmb3IoaT0wO2k8ZztpKyspaWYoZVtpXT09PWVbaF0pe2Uuc3BsaWNlKGgtLSwxKTticmVha319cmV0dXJuIGV9LGhhczpmdW5jdGlvbihhKXt2YXIgYj1mKGEpO3JldHVybiB0aGlzLmZpbHRlcihmdW5jdGlvbigpe2Zvcih2YXIgYT0wLGM9Yi5sZW5ndGg7YTxjO2ErKylpZihmLmNvbnRhaW5zKHRoaXMsYlthXSkpcmV0dXJuITB9KX0sbm90OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnB1c2hTdGFjayhUKHRoaXMsYSwhMSksIm5vdCIsYSl9LGZpbHRlcjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soVCh0aGlzLGEsITApLCJmaWx0ZXIiLGEpfSxpczpmdW5jdGlvbihhKXtyZXR1cm4hIWEmJih0eXBlb2YgYT09InN0cmluZyI/US50ZXN0KGEpP2YoYSx0aGlzLmNvbnRleHQpLmluZGV4KHRoaXNbMF0pPj0wOmYuZmlsdGVyKGEsdGhpcykubGVuZ3RoPjA6dGhpcy5maWx0ZXIoYSkubGVuZ3RoPjApfSxjbG9zZXN0OmZ1bmN0aW9uKGEsYil7dmFyIGM9W10sZCxlLGc9dGhpc1swXTtpZihmLmlzQXJyYXkoYSkpe3ZhciBoPTE7d2hpbGUoZyYmZy5vd25lckRvY3VtZW50JiZnIT09Yil7Zm9yKGQ9MDtkPGEubGVuZ3RoO2QrKylmKGcpLmlzKGFbZF0pJiZjLnB1c2goe3NlbGVjdG9yOmFbZF0sZWxlbTpnLGxldmVsOmh9KTtnPWcucGFyZW50Tm9kZSxoKyt9cmV0dXJuIGN9dmFyIGk9US50ZXN0KGEpfHx0eXBlb2YgYSE9InN0cmluZyI/ZihhLGJ8fHRoaXMuY29udGV4dCk6MDtmb3IoZD0wLGU9dGhpcy5sZW5ndGg7ZDxlO2QrKyl7Zz10aGlzW2RdO3doaWxlKGcpe2lmKGk/aS5pbmRleChnKT4tMTpmLmZpbmQubWF0Y2hlc1NlbGVjdG9yKGcsYSkpe2MucHVzaChnKTticmVha31nPWcucGFyZW50Tm9kZTtpZighZ3x8IWcub3duZXJEb2N1bWVudHx8Zz09PWJ8fGcubm9kZVR5cGU9PT0xMSlicmVha319Yz1jLmxlbmd0aD4xP2YudW5pcXVlKGMpOmM7cmV0dXJuIHRoaXMucHVzaFN0YWNrKGMsImNsb3Nlc3QiLGEpfSxpbmRleDpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4gdGhpc1swXSYmdGhpc1swXS5wYXJlbnROb2RlP3RoaXMucHJldkFsbCgpLmxlbmd0aDotMTtpZih0eXBlb2YgYT09InN0cmluZyIpcmV0dXJuIGYuaW5BcnJheSh0aGlzWzBdLGYoYSkpO3JldHVybiBmLmluQXJyYXkoYS5qcXVlcnk/YVswXTphLHRoaXMpfSxhZGQ6ZnVuY3Rpb24oYSxiKXt2YXIgYz10eXBlb2YgYT09InN0cmluZyI/ZihhLGIpOmYubWFrZUFycmF5KGEmJmEubm9kZVR5cGU/W2FdOmEpLGQ9Zi5tZXJnZSh0aGlzLmdldCgpLGMpO3JldHVybiB0aGlzLnB1c2hTdGFjayhTKGNbMF0pfHxTKGRbMF0pP2Q6Zi51bmlxdWUoZCkpfSxhbmRTZWxmOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYWRkKHRoaXMucHJldk9iamVjdCl9fSksZi5lYWNoKHtwYXJlbnQ6ZnVuY3Rpb24oYSl7dmFyIGI9YS5wYXJlbnROb2RlO3JldHVybiBiJiZiLm5vZGVUeXBlIT09MTE/YjpudWxsfSxwYXJlbnRzOmZ1bmN0aW9uKGEpe3JldHVybiBmLmRpcihhLCJwYXJlbnROb2RlIil9LHBhcmVudHNVbnRpbDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGYuZGlyKGEsInBhcmVudE5vZGUiLGMpfSxuZXh0OmZ1bmN0aW9uKGEpe3JldHVybiBmLm50aChhLDIsIm5leHRTaWJsaW5nIil9LHByZXY6ZnVuY3Rpb24oYSl7cmV0dXJuIGYubnRoKGEsMiwicHJldmlvdXNTaWJsaW5nIil9LG5leHRBbGw6ZnVuY3Rpb24oYSl7cmV0dXJuIGYuZGlyKGEsIm5leHRTaWJsaW5nIil9LHByZXZBbGw6ZnVuY3Rpb24oYSl7cmV0dXJuIGYuZGlyKGEsInByZXZpb3VzU2libGluZyIpfSxuZXh0VW50aWw6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBmLmRpcihhLCJuZXh0U2libGluZyIsYyl9LHByZXZVbnRpbDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGYuZGlyKGEsInByZXZpb3VzU2libGluZyIsYyl9LHNpYmxpbmdzOmZ1bmN0aW9uKGEpe3JldHVybiBmLnNpYmxpbmcoKGEucGFyZW50Tm9kZXx8e30pLmZpcnN0Q2hpbGQsYSl9LGNoaWxkcmVuOmZ1bmN0aW9uKGEpe3JldHVybiBmLnNpYmxpbmcoYS5maXJzdENoaWxkKX0sY29udGVudHM6ZnVuY3Rpb24oYSl7cmV0dXJuIGYubm9kZU5hbWUoYSwiaWZyYW1lIik/YS5jb250ZW50RG9jdW1lbnR8fGEuY29udGVudFdpbmRvdy5kb2N1bWVudDpmLm1ha2VBcnJheShhLmNoaWxkTm9kZXMpfX0sZnVuY3Rpb24oYSxiKXtmLmZuW2FdPWZ1bmN0aW9uKGMsZCl7dmFyIGU9Zi5tYXAodGhpcyxiLGMpO0wudGVzdChhKXx8KGQ9YyksZCYmdHlwZW9mIGQ9PSJzdHJpbmciJiYoZT1mLmZpbHRlcihkLGUpKSxlPXRoaXMubGVuZ3RoPjEmJiFSW2FdP2YudW5pcXVlKGUpOmUsKHRoaXMubGVuZ3RoPjF8fE4udGVzdChkKSkmJk0udGVzdChhKSYmKGU9ZS5yZXZlcnNlKCkpO3JldHVybiB0aGlzLnB1c2hTdGFjayhlLGEsUC5jYWxsKGFyZ3VtZW50cykuam9pbigiLCIpKX19KSxmLmV4dGVuZCh7ZmlsdGVyOmZ1bmN0aW9uKGEsYixjKXtjJiYoYT0iOm5vdCgiK2ErIikiKTtyZXR1cm4gYi5sZW5ndGg9PT0xP2YuZmluZC5tYXRjaGVzU2VsZWN0b3IoYlswXSxhKT9bYlswXV06W106Zi5maW5kLm1hdGNoZXMoYSxiKX0sZGlyOmZ1bmN0aW9uKGEsYyxkKXt2YXIgZT1bXSxnPWFbY107d2hpbGUoZyYmZy5ub2RlVHlwZSE9PTkmJihkPT09Ynx8Zy5ub2RlVHlwZSE9PTF8fCFmKGcpLmlzKGQpKSlnLm5vZGVUeXBlPT09MSYmZS5wdXNoKGcpLGc9Z1tjXTtyZXR1cm4gZX0sbnRoOmZ1bmN0aW9uKGEsYixjLGQpe2I9Ynx8MTt2YXIgZT0wO2Zvcig7YTthPWFbY10paWYoYS5ub2RlVHlwZT09PTEmJisrZT09PWIpYnJlYWs7cmV0dXJuIGF9LHNpYmxpbmc6ZnVuY3Rpb24oYSxiKXt2YXIgYz1bXTtmb3IoO2E7YT1hLm5leHRTaWJsaW5nKWEubm9kZVR5cGU9PT0xJiZhIT09YiYmYy5wdXNoKGEpO3JldHVybiBjfX0pO3ZhciBWPSJhYmJyfGFydGljbGV8YXNpZGV8YXVkaW98YmRpfGNhbnZhc3xkYXRhfGRhdGFsaXN0fGRldGFpbHN8ZmlnY2FwdGlvbnxmaWd1cmV8Zm9vdGVyfGhlYWRlcnxoZ3JvdXB8bWFya3xtZXRlcnxuYXZ8b3V0cHV0fHByb2dyZXNzfHNlY3Rpb258c3VtbWFyeXx0aW1lfHZpZGVvIixXPS8galF1ZXJ5XGQrPSIoPzpcZCt8bnVsbCkiL2csWD0vXlxzKy8sWT0vPCg/IWFyZWF8YnJ8Y29sfGVtYmVkfGhyfGltZ3xpbnB1dHxsaW5rfG1ldGF8cGFyYW0pKChbXHc6XSspW14+XSopXC8+L2lnLFo9LzwoW1x3Ol0rKS8sJD0vPHRib2R5L2ksXz0vPHwmIz9cdys7LyxiYT0vPCg/OnNjcmlwdHxzdHlsZSkvaSxiYj0vPCg/OnNjcmlwdHxvYmplY3R8ZW1iZWR8b3B0aW9ufHN0eWxlKS9pLGJjPW5ldyBSZWdFeHAoIjwoPzoiK1YrIilbXFxzLz5dIiwiaSIpLGJkPS9jaGVja2VkXHMqKD86W149XXw9XHMqLmNoZWNrZWQuKS9pLGJlPS9cLyhqYXZhfGVjbWEpc2NyaXB0L2ksYmY9L15ccyo8ISg/OlxbQ0RBVEFcW3xcLVwtKS8sYmc9e29wdGlvbjpbMSwiPHNlbGVjdCBtdWx0aXBsZT0nbXVsdGlwbGUnPiIsIjwvc2VsZWN0PiJdLGxlZ2VuZDpbMSwiPGZpZWxkc2V0PiIsIjwvZmllbGRzZXQ+Il0sdGhlYWQ6WzEsIjx0YWJsZT4iLCI8L3RhYmxlPiJdLHRyOlsyLCI8dGFibGU+PHRib2R5PiIsIjwvdGJvZHk+PC90YWJsZT4iXSx0ZDpbMywiPHRhYmxlPjx0Ym9keT48dHI+IiwiPC90cj48L3Rib2R5PjwvdGFibGU+Il0sY29sOlsyLCI8dGFibGU+PHRib2R5PjwvdGJvZHk+PGNvbGdyb3VwPiIsIjwvY29sZ3JvdXA+PC90YWJsZT4iXSxhcmVhOlsxLCI8bWFwPiIsIjwvbWFwPiJdLF9kZWZhdWx0OlswLCIiLCIiXX0sYmg9VShjKTtiZy5vcHRncm91cD1iZy5vcHRpb24sYmcudGJvZHk9YmcudGZvb3Q9YmcuY29sZ3JvdXA9YmcuY2FwdGlvbj1iZy50aGVhZCxiZy50aD1iZy50ZCxmLnN1cHBvcnQuaHRtbFNlcmlhbGl6ZXx8KGJnLl9kZWZhdWx0PVsxLCJkaXY8ZGl2PiIsIjwvZGl2PiJdKSxmLmZuLmV4dGVuZCh7dGV4dDpmdW5jdGlvbihhKXtyZXR1cm4gZi5hY2Nlc3ModGhpcyxmdW5jdGlvbihhKXtyZXR1cm4gYT09PWI/Zi50ZXh0KHRoaXMpOnRoaXMuZW1wdHkoKS5hcHBlbmQoKHRoaXNbMF0mJnRoaXNbMF0ub3duZXJEb2N1bWVudHx8YykuY3JlYXRlVGV4dE5vZGUoYSkpfSxudWxsLGEsYXJndW1lbnRzLmxlbmd0aCl9LHdyYXBBbGw6ZnVuY3Rpb24oYSl7aWYoZi5pc0Z1bmN0aW9uKGEpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYil7Zih0aGlzKS53cmFwQWxsKGEuY2FsbCh0aGlzLGIpKX0pO2lmKHRoaXNbMF0pe3ZhciBiPWYoYSx0aGlzWzBdLm93bmVyRG9jdW1lbnQpLmVxKDApLmNsb25lKCEwKTt0aGlzWzBdLnBhcmVudE5vZGUmJmIuaW5zZXJ0QmVmb3JlKHRoaXNbMF0pLGIubWFwKGZ1bmN0aW9uKCl7dmFyIGE9dGhpczt3aGlsZShhLmZpcnN0Q2hpbGQmJmEuZmlyc3RDaGlsZC5ub2RlVHlwZT09PTEpYT1hLmZpcnN0Q2hpbGQ7cmV0dXJuIGF9KS5hcHBlbmQodGhpcyl9cmV0dXJuIHRoaXN9LHdyYXBJbm5lcjpmdW5jdGlvbihhKXtpZihmLmlzRnVuY3Rpb24oYSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihiKXtmKHRoaXMpLndyYXBJbm5lcihhLmNhbGwodGhpcyxiKSl9KTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGI9Zih0aGlzKSxjPWIuY29udGVudHMoKTtjLmxlbmd0aD9jLndyYXBBbGwoYSk6Yi5hcHBlbmQoYSl9KX0sd3JhcDpmdW5jdGlvbihhKXt2YXIgYj1mLmlzRnVuY3Rpb24oYSk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihjKXtmKHRoaXMpLndyYXBBbGwoYj9hLmNhbGwodGhpcyxjKTphKX0pfSx1bndyYXA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wYXJlbnQoKS5lYWNoKGZ1bmN0aW9uKCl7Zi5ub2RlTmFtZSh0aGlzLCJib2R5Iil8fGYodGhpcykucmVwbGFjZVdpdGgodGhpcy5jaGlsZE5vZGVzKX0pLmVuZCgpfSxhcHBlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsITAsZnVuY3Rpb24oYSl7dGhpcy5ub2RlVHlwZT09PTEmJnRoaXMuYXBwZW5kQ2hpbGQoYSl9KX0scHJlcGVuZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cywhMCxmdW5jdGlvbihhKXt0aGlzLm5vZGVUeXBlPT09MSYmdGhpcy5pbnNlcnRCZWZvcmUoYSx0aGlzLmZpcnN0Q2hpbGQpfSl9LGJlZm9yZTpmdW5jdGlvbigpe2lmKHRoaXNbMF0mJnRoaXNbMF0ucGFyZW50Tm9kZSlyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsITEsZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZShhLHRoaXMpfSk7aWYoYXJndW1lbnRzLmxlbmd0aCl7dmFyIGE9ZgotLmNsZWFuKGFyZ3VtZW50cyk7YS5wdXNoLmFwcGx5KGEsdGhpcy50b0FycmF5KCkpO3JldHVybiB0aGlzLnB1c2hTdGFjayhhLCJiZWZvcmUiLGFyZ3VtZW50cyl9fSxhZnRlcjpmdW5jdGlvbigpe2lmKHRoaXNbMF0mJnRoaXNbMF0ucGFyZW50Tm9kZSlyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsITEsZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZShhLHRoaXMubmV4dFNpYmxpbmcpfSk7aWYoYXJndW1lbnRzLmxlbmd0aCl7dmFyIGE9dGhpcy5wdXNoU3RhY2sodGhpcywiYWZ0ZXIiLGFyZ3VtZW50cyk7YS5wdXNoLmFwcGx5KGEsZi5jbGVhbihhcmd1bWVudHMpKTtyZXR1cm4gYX19LHJlbW92ZTpmdW5jdGlvbihhLGIpe2Zvcih2YXIgYz0wLGQ7KGQ9dGhpc1tjXSkhPW51bGw7YysrKWlmKCFhfHxmLmZpbHRlcihhLFtkXSkubGVuZ3RoKSFiJiZkLm5vZGVUeXBlPT09MSYmKGYuY2xlYW5EYXRhKGQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKSksZi5jbGVhbkRhdGEoW2RdKSksZC5wYXJlbnROb2RlJiZkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZCk7cmV0dXJuIHRoaXN9LGVtcHR5OmZ1bmN0aW9uKCl7Zm9yKHZhciBhPTAsYjsoYj10aGlzW2FdKSE9bnVsbDthKyspe2Iubm9kZVR5cGU9PT0xJiZmLmNsZWFuRGF0YShiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikpO3doaWxlKGIuZmlyc3RDaGlsZCliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCl9cmV0dXJuIHRoaXN9LGNsb25lOmZ1bmN0aW9uKGEsYil7YT1hPT1udWxsPyExOmEsYj1iPT1udWxsP2E6YjtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKXtyZXR1cm4gZi5jbG9uZSh0aGlzLGEsYil9KX0saHRtbDpmdW5jdGlvbihhKXtyZXR1cm4gZi5hY2Nlc3ModGhpcyxmdW5jdGlvbihhKXt2YXIgYz10aGlzWzBdfHx7fSxkPTAsZT10aGlzLmxlbmd0aDtpZihhPT09YilyZXR1cm4gYy5ub2RlVHlwZT09PTE/Yy5pbm5lckhUTUwucmVwbGFjZShXLCIiKTpudWxsO2lmKHR5cGVvZiBhPT0ic3RyaW5nIiYmIWJhLnRlc3QoYSkmJihmLnN1cHBvcnQubGVhZGluZ1doaXRlc3BhY2V8fCFYLnRlc3QoYSkpJiYhYmdbKFouZXhlYyhhKXx8WyIiLCIiXSlbMV0udG9Mb3dlckNhc2UoKV0pe2E9YS5yZXBsYWNlKFksIjwkMT48LyQyPiIpO3RyeXtmb3IoO2Q8ZTtkKyspYz10aGlzW2RdfHx7fSxjLm5vZGVUeXBlPT09MSYmKGYuY2xlYW5EYXRhKGMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKSksYy5pbm5lckhUTUw9YSk7Yz0wfWNhdGNoKGcpe319YyYmdGhpcy5lbXB0eSgpLmFwcGVuZChhKX0sbnVsbCxhLGFyZ3VtZW50cy5sZW5ndGgpfSxyZXBsYWNlV2l0aDpmdW5jdGlvbihhKXtpZih0aGlzWzBdJiZ0aGlzWzBdLnBhcmVudE5vZGUpe2lmKGYuaXNGdW5jdGlvbihhKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGIpe3ZhciBjPWYodGhpcyksZD1jLmh0bWwoKTtjLnJlcGxhY2VXaXRoKGEuY2FsbCh0aGlzLGIsZCkpfSk7dHlwZW9mIGEhPSJzdHJpbmciJiYoYT1mKGEpLmRldGFjaCgpKTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5uZXh0U2libGluZyxjPXRoaXMucGFyZW50Tm9kZTtmKHRoaXMpLnJlbW92ZSgpLGI/ZihiKS5iZWZvcmUoYSk6ZihjKS5hcHBlbmQoYSl9KX1yZXR1cm4gdGhpcy5sZW5ndGg/dGhpcy5wdXNoU3RhY2soZihmLmlzRnVuY3Rpb24oYSk/YSgpOmEpLCJyZXBsYWNlV2l0aCIsYSk6dGhpc30sZGV0YWNoOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnJlbW92ZShhLCEwKX0sZG9tTWFuaXA6ZnVuY3Rpb24oYSxjLGQpe3ZhciBlLGcsaCxpLGo9YVswXSxrPVtdO2lmKCFmLnN1cHBvcnQuY2hlY2tDbG9uZSYmYXJndW1lbnRzLmxlbmd0aD09PTMmJnR5cGVvZiBqPT0ic3RyaW5nIiYmYmQudGVzdChqKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Zih0aGlzKS5kb21NYW5pcChhLGMsZCwhMCl9KTtpZihmLmlzRnVuY3Rpb24oaikpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihlKXt2YXIgZz1mKHRoaXMpO2FbMF09ai5jYWxsKHRoaXMsZSxjP2cuaHRtbCgpOmIpLGcuZG9tTWFuaXAoYSxjLGQpfSk7aWYodGhpc1swXSl7aT1qJiZqLnBhcmVudE5vZGUsZi5zdXBwb3J0LnBhcmVudE5vZGUmJmkmJmkubm9kZVR5cGU9PT0xMSYmaS5jaGlsZE5vZGVzLmxlbmd0aD09PXRoaXMubGVuZ3RoP2U9e2ZyYWdtZW50Oml9OmU9Zi5idWlsZEZyYWdtZW50KGEsdGhpcyxrKSxoPWUuZnJhZ21lbnQsaC5jaGlsZE5vZGVzLmxlbmd0aD09PTE/Zz1oPWguZmlyc3RDaGlsZDpnPWguZmlyc3RDaGlsZDtpZihnKXtjPWMmJmYubm9kZU5hbWUoZywidHIiKTtmb3IodmFyIGw9MCxtPXRoaXMubGVuZ3RoLG49bS0xO2w8bTtsKyspZC5jYWxsKGM/YmkodGhpc1tsXSxnKTp0aGlzW2xdLGUuY2FjaGVhYmxlfHxtPjEmJmw8bj9mLmNsb25lKGgsITAsITApOmgpfWsubGVuZ3RoJiZmLmVhY2goayxmdW5jdGlvbihhLGIpe2Iuc3JjP2YuYWpheCh7dHlwZToiR0VUIixnbG9iYWw6ITEsdXJsOmIuc3JjLGFzeW5jOiExLGRhdGFUeXBlOiJzY3JpcHQifSk6Zi5nbG9iYWxFdmFsKChiLnRleHR8fGIudGV4dENvbnRlbnR8fGIuaW5uZXJIVE1MfHwiIikucmVwbGFjZShiZiwiLyokMCovIikpLGIucGFyZW50Tm9kZSYmYi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGIpfSl9cmV0dXJuIHRoaXN9fSksZi5idWlsZEZyYWdtZW50PWZ1bmN0aW9uKGEsYixkKXt2YXIgZSxnLGgsaSxqPWFbMF07YiYmYlswXSYmKGk9YlswXS5vd25lckRvY3VtZW50fHxiWzBdKSxpLmNyZWF0ZURvY3VtZW50RnJhZ21lbnR8fChpPWMpLGEubGVuZ3RoPT09MSYmdHlwZW9mIGo9PSJzdHJpbmciJiZqLmxlbmd0aDw1MTImJmk9PT1jJiZqLmNoYXJBdCgwKT09PSI8IiYmIWJiLnRlc3QoaikmJihmLnN1cHBvcnQuY2hlY2tDbG9uZXx8IWJkLnRlc3QoaikpJiYoZi5zdXBwb3J0Lmh0bWw1Q2xvbmV8fCFiYy50ZXN0KGopKSYmKGc9ITAsaD1mLmZyYWdtZW50c1tqXSxoJiZoIT09MSYmKGU9aCkpLGV8fChlPWkuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLGYuY2xlYW4oYSxpLGUsZCkpLGcmJihmLmZyYWdtZW50c1tqXT1oP2U6MSk7cmV0dXJue2ZyYWdtZW50OmUsY2FjaGVhYmxlOmd9fSxmLmZyYWdtZW50cz17fSxmLmVhY2goe2FwcGVuZFRvOiJhcHBlbmQiLHByZXBlbmRUbzoicHJlcGVuZCIsaW5zZXJ0QmVmb3JlOiJiZWZvcmUiLGluc2VydEFmdGVyOiJhZnRlciIscmVwbGFjZUFsbDoicmVwbGFjZVdpdGgifSxmdW5jdGlvbihhLGIpe2YuZm5bYV09ZnVuY3Rpb24oYyl7dmFyIGQ9W10sZT1mKGMpLGc9dGhpcy5sZW5ndGg9PT0xJiZ0aGlzWzBdLnBhcmVudE5vZGU7aWYoZyYmZy5ub2RlVHlwZT09PTExJiZnLmNoaWxkTm9kZXMubGVuZ3RoPT09MSYmZS5sZW5ndGg9PT0xKXtlW2JdKHRoaXNbMF0pO3JldHVybiB0aGlzfWZvcih2YXIgaD0wLGk9ZS5sZW5ndGg7aDxpO2grKyl7dmFyIGo9KGg+MD90aGlzLmNsb25lKCEwKTp0aGlzKS5nZXQoKTtmKGVbaF0pW2JdKGopLGQ9ZC5jb25jYXQoail9cmV0dXJuIHRoaXMucHVzaFN0YWNrKGQsYSxlLnNlbGVjdG9yKX19KSxmLmV4dGVuZCh7Y2xvbmU6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGUsZyxoPWYuc3VwcG9ydC5odG1sNUNsb25lfHxmLmlzWE1MRG9jKGEpfHwhYmMudGVzdCgiPCIrYS5ub2RlTmFtZSsiPiIpP2EuY2xvbmVOb2RlKCEwKTpibyhhKTtpZigoIWYuc3VwcG9ydC5ub0Nsb25lRXZlbnR8fCFmLnN1cHBvcnQubm9DbG9uZUNoZWNrZWQpJiYoYS5ub2RlVHlwZT09PTF8fGEubm9kZVR5cGU9PT0xMSkmJiFmLmlzWE1MRG9jKGEpKXtiayhhLGgpLGQ9YmwoYSksZT1ibChoKTtmb3IoZz0wO2RbZ107KytnKWVbZ10mJmJrKGRbZ10sZVtnXSl9aWYoYil7YmooYSxoKTtpZihjKXtkPWJsKGEpLGU9YmwoaCk7Zm9yKGc9MDtkW2ddOysrZyliaihkW2ddLGVbZ10pfX1kPWU9bnVsbDtyZXR1cm4gaH0sY2xlYW46ZnVuY3Rpb24oYSxiLGQsZSl7dmFyIGcsaCxpLGo9W107Yj1ifHxjLHR5cGVvZiBiLmNyZWF0ZUVsZW1lbnQ9PSJ1bmRlZmluZWQiJiYoYj1iLm93bmVyRG9jdW1lbnR8fGJbMF0mJmJbMF0ub3duZXJEb2N1bWVudHx8Yyk7Zm9yKHZhciBrPTAsbDsobD1hW2tdKSE9bnVsbDtrKyspe3R5cGVvZiBsPT0ibnVtYmVyIiYmKGwrPSIiKTtpZighbCljb250aW51ZTtpZih0eXBlb2YgbD09InN0cmluZyIpaWYoIV8udGVzdChsKSlsPWIuY3JlYXRlVGV4dE5vZGUobCk7ZWxzZXtsPWwucmVwbGFjZShZLCI8JDE+PC8kMj4iKTt2YXIgbT0oWi5leGVjKGwpfHxbIiIsIiJdKVsxXS50b0xvd2VyQ2FzZSgpLG49YmdbbV18fGJnLl9kZWZhdWx0LG89blswXSxwPWIuY3JlYXRlRWxlbWVudCgiZGl2IikscT1iaC5jaGlsZE5vZGVzLHI7Yj09PWM/YmguYXBwZW5kQ2hpbGQocCk6VShiKS5hcHBlbmRDaGlsZChwKSxwLmlubmVySFRNTD1uWzFdK2wrblsyXTt3aGlsZShvLS0pcD1wLmxhc3RDaGlsZDtpZighZi5zdXBwb3J0LnRib2R5KXt2YXIgcz0kLnRlc3QobCksdD1tPT09InRhYmxlIiYmIXM/cC5maXJzdENoaWxkJiZwLmZpcnN0Q2hpbGQuY2hpbGROb2RlczpuWzFdPT09Ijx0YWJsZT4iJiYhcz9wLmNoaWxkTm9kZXM6W107Zm9yKGk9dC5sZW5ndGgtMTtpPj0wOy0taSlmLm5vZGVOYW1lKHRbaV0sInRib2R5IikmJiF0W2ldLmNoaWxkTm9kZXMubGVuZ3RoJiZ0W2ldLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodFtpXSl9IWYuc3VwcG9ydC5sZWFkaW5nV2hpdGVzcGFjZSYmWC50ZXN0KGwpJiZwLmluc2VydEJlZm9yZShiLmNyZWF0ZVRleHROb2RlKFguZXhlYyhsKVswXSkscC5maXJzdENoaWxkKSxsPXAuY2hpbGROb2RlcyxwJiYocC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHApLHEubGVuZ3RoPjAmJihyPXFbcS5sZW5ndGgtMV0sciYmci5wYXJlbnROb2RlJiZyLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQocikpKX12YXIgdTtpZighZi5zdXBwb3J0LmFwcGVuZENoZWNrZWQpaWYobFswXSYmdHlwZW9mICh1PWwubGVuZ3RoKT09Im51bWJlciIpZm9yKGk9MDtpPHU7aSsrKWJuKGxbaV0pO2Vsc2UgYm4obCk7bC5ub2RlVHlwZT9qLnB1c2gobCk6aj1mLm1lcmdlKGosbCl9aWYoZCl7Zz1mdW5jdGlvbihhKXtyZXR1cm4hYS50eXBlfHxiZS50ZXN0KGEudHlwZSl9O2ZvcihrPTA7altrXTtrKyspe2g9altrXTtpZihlJiZmLm5vZGVOYW1lKGgsInNjcmlwdCIpJiYoIWgudHlwZXx8YmUudGVzdChoLnR5cGUpKSllLnB1c2goaC5wYXJlbnROb2RlP2gucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChoKTpoKTtlbHNle2lmKGgubm9kZVR5cGU9PT0xKXt2YXIgdj1mLmdyZXAoaC5nZXRFbGVtZW50c0J5VGFnTmFtZSgic2NyaXB0IiksZyk7ai5zcGxpY2UuYXBwbHkoaixbaysxLDBdLmNvbmNhdCh2KSl9ZC5hcHBlbmRDaGlsZChoKX19fXJldHVybiBqfSxjbGVhbkRhdGE6ZnVuY3Rpb24oYSl7dmFyIGIsYyxkPWYuY2FjaGUsZT1mLmV2ZW50LnNwZWNpYWwsZz1mLnN1cHBvcnQuZGVsZXRlRXhwYW5kbztmb3IodmFyIGg9MCxpOyhpPWFbaF0pIT1udWxsO2grKyl7aWYoaS5ub2RlTmFtZSYmZi5ub0RhdGFbaS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXSljb250aW51ZTtjPWlbZi5leHBhbmRvXTtpZihjKXtiPWRbY107aWYoYiYmYi5ldmVudHMpe2Zvcih2YXIgaiBpbiBiLmV2ZW50cyllW2pdP2YuZXZlbnQucmVtb3ZlKGksaik6Zi5yZW1vdmVFdmVudChpLGosYi5oYW5kbGUpO2IuaGFuZGxlJiYoYi5oYW5kbGUuZWxlbT1udWxsKX1nP2RlbGV0ZSBpW2YuZXhwYW5kb106aS5yZW1vdmVBdHRyaWJ1dGUmJmkucmVtb3ZlQXR0cmlidXRlKGYuZXhwYW5kbyksZGVsZXRlIGRbY119fX19KTt2YXIgYnA9L2FscGhhXChbXildKlwpL2ksYnE9L29wYWNpdHk9KFteKV0qKS8sYnI9LyhbQS1aXXxebXMpL2csYnM9L15bXC0rXT8oPzpcZCpcLik/XGQrJC9pLGJ0PS9eLT8oPzpcZCpcLik/XGQrKD8hcHgpW15cZFxzXSskL2ksYnU9L14oW1wtK10pPShbXC0rLlxkZV0rKS8sYnY9L15tYXJnaW4vLGJ3PXtwb3NpdGlvbjoiYWJzb2x1dGUiLHZpc2liaWxpdHk6ImhpZGRlbiIsZGlzcGxheToiYmxvY2sifSxieD1bIlRvcCIsIlJpZ2h0IiwiQm90dG9tIiwiTGVmdCJdLGJ5LGJ6LGJBO2YuZm4uY3NzPWZ1bmN0aW9uKGEsYyl7cmV0dXJuIGYuYWNjZXNzKHRoaXMsZnVuY3Rpb24oYSxjLGQpe3JldHVybiBkIT09Yj9mLnN0eWxlKGEsYyxkKTpmLmNzcyhhLGMpfSxhLGMsYXJndW1lbnRzLmxlbmd0aD4xKX0sZi5leHRlbmQoe2Nzc0hvb2tzOntvcGFjaXR5OntnZXQ6ZnVuY3Rpb24oYSxiKXtpZihiKXt2YXIgYz1ieShhLCJvcGFjaXR5Iik7cmV0dXJuIGM9PT0iIj8iMSI6Y31yZXR1cm4gYS5zdHlsZS5vcGFjaXR5fX19LGNzc051bWJlcjp7ZmlsbE9wYWNpdHk6ITAsZm9udFdlaWdodDohMCxsaW5lSGVpZ2h0OiEwLG9wYWNpdHk6ITAsb3JwaGFuczohMCx3aWRvd3M6ITAsekluZGV4OiEwLHpvb206ITB9LGNzc1Byb3BzOnsiZmxvYXQiOmYuc3VwcG9ydC5jc3NGbG9hdD8iY3NzRmxvYXQiOiJzdHlsZUZsb2F0In0sc3R5bGU6ZnVuY3Rpb24oYSxjLGQsZSl7aWYoISFhJiZhLm5vZGVUeXBlIT09MyYmYS5ub2RlVHlwZSE9PTgmJiEhYS5zdHlsZSl7dmFyIGcsaCxpPWYuY2FtZWxDYXNlKGMpLGo9YS5zdHlsZSxrPWYuY3NzSG9va3NbaV07Yz1mLmNzc1Byb3BzW2ldfHxpO2lmKGQ9PT1iKXtpZihrJiYiZ2V0ImluIGsmJihnPWsuZ2V0KGEsITEsZSkpIT09YilyZXR1cm4gZztyZXR1cm4galtjXX1oPXR5cGVvZiBkLGg9PT0ic3RyaW5nIiYmKGc9YnUuZXhlYyhkKSkmJihkPSsoZ1sxXSsxKSorZ1syXStwYXJzZUZsb2F0KGYuY3NzKGEsYykpLGg9Im51bWJlciIpO2lmKGQ9PW51bGx8fGg9PT0ibnVtYmVyIiYmaXNOYU4oZCkpcmV0dXJuO2g9PT0ibnVtYmVyIiYmIWYuY3NzTnVtYmVyW2ldJiYoZCs9InB4Iik7aWYoIWt8fCEoInNldCJpbiBrKXx8KGQ9ay5zZXQoYSxkKSkhPT1iKXRyeXtqW2NdPWR9Y2F0Y2gobCl7fX19LGNzczpmdW5jdGlvbihhLGMsZCl7dmFyIGUsZztjPWYuY2FtZWxDYXNlKGMpLGc9Zi5jc3NIb29rc1tjXSxjPWYuY3NzUHJvcHNbY118fGMsYz09PSJjc3NGbG9hdCImJihjPSJmbG9hdCIpO2lmKGcmJiJnZXQiaW4gZyYmKGU9Zy5nZXQoYSwhMCxkKSkhPT1iKXJldHVybiBlO2lmKGJ5KXJldHVybiBieShhLGMpfSxzd2FwOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD17fSxlLGY7Zm9yKGYgaW4gYilkW2ZdPWEuc3R5bGVbZl0sYS5zdHlsZVtmXT1iW2ZdO2U9Yy5jYWxsKGEpO2ZvcihmIGluIGIpYS5zdHlsZVtmXT1kW2ZdO3JldHVybiBlfX0pLGYuY3VyQ1NTPWYuY3NzLGMuZGVmYXVsdFZpZXcmJmMuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSYmKGJ6PWZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlLGcsaD1hLnN0eWxlO2I9Yi5yZXBsYWNlKGJyLCItJDEiKS50b0xvd2VyQ2FzZSgpLChkPWEub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldykmJihlPWQuZ2V0Q29tcHV0ZWRTdHlsZShhLG51bGwpKSYmKGM9ZS5nZXRQcm9wZXJ0eVZhbHVlKGIpLGM9PT0iIiYmIWYuY29udGFpbnMoYS5vd25lckRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxhKSYmKGM9Zi5zdHlsZShhLGIpKSksIWYuc3VwcG9ydC5waXhlbE1hcmdpbiYmZSYmYnYudGVzdChiKSYmYnQudGVzdChjKSYmKGc9aC53aWR0aCxoLndpZHRoPWMsYz1lLndpZHRoLGgud2lkdGg9Zyk7cmV0dXJuIGN9KSxjLmRvY3VtZW50RWxlbWVudC5jdXJyZW50U3R5bGUmJihiQT1mdW5jdGlvbihhLGIpe3ZhciBjLGQsZSxmPWEuY3VycmVudFN0eWxlJiZhLmN1cnJlbnRTdHlsZVtiXSxnPWEuc3R5bGU7Zj09bnVsbCYmZyYmKGU9Z1tiXSkmJihmPWUpLGJ0LnRlc3QoZikmJihjPWcubGVmdCxkPWEucnVudGltZVN0eWxlJiZhLnJ1bnRpbWVTdHlsZS5sZWZ0LGQmJihhLnJ1bnRpbWVTdHlsZS5sZWZ0PWEuY3VycmVudFN0eWxlLmxlZnQpLGcubGVmdD1iPT09ImZvbnRTaXplIj8iMWVtIjpmLGY9Zy5waXhlbExlZnQrInB4IixnLmxlZnQ9YyxkJiYoYS5ydW50aW1lU3R5bGUubGVmdD1kKSk7cmV0dXJuIGY9PT0iIj8iYXV0byI6Zn0pLGJ5PWJ6fHxiQSxmLmVhY2goWyJoZWlnaHQiLCJ3aWR0aCJdLGZ1bmN0aW9uKGEsYil7Zi5jc3NIb29rc1tiXT17Z2V0OmZ1bmN0aW9uKGEsYyxkKXtpZihjKXJldHVybiBhLm9mZnNldFdpZHRoIT09MD9iQihhLGIsZCk6Zi5zd2FwKGEsYncsZnVuY3Rpb24oKXtyZXR1cm4gYkIoYSxiLGQpfSl9LHNldDpmdW5jdGlvbihhLGIpe3JldHVybiBicy50ZXN0KGIpP2IrInB4IjpifX19KSxmLnN1cHBvcnQub3BhY2l0eXx8KGYuY3NzSG9va3Mub3BhY2l0eT17Z2V0OmZ1bmN0aW9uKGEsYil7cmV0dXJuIGJxLnRlc3QoKGImJmEuY3VycmVudFN0eWxlP2EuY3VycmVudFN0eWxlLmZpbHRlcjphLnN0eWxlLmZpbHRlcil8fCIiKT9wYXJzZUZsb2F0KFJlZ0V4cC4kMSkvMTAwKyIiOmI/IjEiOiIifSxzZXQ6ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLnN0eWxlLGQ9YS5jdXJyZW50U3R5bGUsZT1mLmlzTnVtZXJpYyhiKT8iYWxwaGEob3BhY2l0eT0iK2IqMTAwKyIpIjoiIixnPWQmJmQuZmlsdGVyfHxjLmZpbHRlcnx8IiI7Yy56b29tPTE7aWYoYj49MSYmZi50cmltKGcucmVwbGFjZShicCwiIikpPT09IiIpe2MucmVtb3ZlQXR0cmlidXRlKCJmaWx0ZXIiKTtpZihkJiYhZC5maWx0ZXIpcmV0dXJufWMuZmlsdGVyPWJwLnRlc3QoZyk/Zy5yZXBsYWNlKGJwLGUpOmcrIiAiK2V9fSksZihmdW5jdGlvbigpe2Yuc3VwcG9ydC5yZWxpYWJsZU1hcmdpblJpZ2h0fHwoZi5jc3NIb29rcy5tYXJnaW5SaWdodD17Z2V0OmZ1bmN0aW9uKGEsYil7cmV0dXJuIGYuc3dhcChhLHtkaXNwbGF5OiJpbmxpbmUtYmxvY2sifSxmdW5jdGlvbigpe3JldHVybiBiP2J5KGEsIm1hcmdpbi1yaWdodCIpOmEuc3R5bGUubWFyZ2luUmlnaHR9KX19KX0pLGYuZXhwciYmZi5leHByLmZpbHRlcnMmJihmLmV4cHIuZmlsdGVycy5oaWRkZW49ZnVuY3Rpb24oYSl7dmFyIGI9YS5vZmZzZXRXaWR0aCxjPWEub2Zmc2V0SGVpZ2h0O3JldHVybiBiPT09MCYmYz09PTB8fCFmLnN1cHBvcnQucmVsaWFibGVIaWRkZW5PZmZzZXRzJiYoYS5zdHlsZSYmYS5zdHlsZS5kaXNwbGF5fHxmLmNzcyhhLCJkaXNwbGF5IikpPT09Im5vbmUifSxmLmV4cHIuZmlsdGVycy52aXNpYmxlPWZ1bmN0aW9uKGEpe3JldHVybiFmLmV4cHIuZmlsdGVycy5oaWRkZW4oYSl9KSxmLmVhY2goe21hcmdpbjoiIixwYWRkaW5nOiIiLGJvcmRlcjoiV2lkdGgifSxmdW5jdGlvbihhLGIpe2YuY3NzSG9va3NbYStiXT17ZXhwYW5kOmZ1bmN0aW9uKGMpe3ZhciBkLGU9dHlwZW9mIGM9PSJzdHJpbmciP2Muc3BsaXQoIiAiKTpbY10sZj17fTtmb3IoZD0wO2Q8NDtkKyspZlthK2J4W2RdK2JdPWVbZF18fGVbZC0yXXx8ZVswXTtyZXR1cm4gZn19fSk7dmFyIGJDPS8lMjAvZyxiRD0vXFtcXSQvLGJFPS9ccj9cbi9nLGJGPS8jLiokLyxiRz0vXiguKj8pOlsgXHRdKihbXlxyXG5dKilccj8kL21nLGJIPS9eKD86Y29sb3J8ZGF0ZXxkYXRldGltZXxkYXRldGltZS1sb2NhbHxlbWFpbHxoaWRkZW58bW9udGh8bnVtYmVyfHBhc3N3b3JkfHJhbmdlfHNlYXJjaHx0ZWx8dGV4dHx0aW1lfHVybHx3ZWVrKSQvaSxiST0vXig/OmFib3V0fGFwcHxhcHBcLXN0b3JhZ2V8LitcLWV4dGVuc2lvbnxmaWxlfHJlc3x3aWRnZXQpOiQvLGJKPS9eKD86R0VUfEhFQUQpJC8sYks9L15cL1wvLyxiTD0vXD8vLGJNPS88c2NyaXB0XGJbXjxdKig/Oig/ITxcL3NjcmlwdD4pPFtePF0qKSo8XC9zY3JpcHQ+L2dpLGJOPS9eKD86c2VsZWN0fHRleHRhcmVhKS9pLGJPPS9ccysvLGJQPS8oWz8mXSlfPVteJl0qLyxiUT0vXihbXHdcK1wuXC1dKzopKD86XC9cLyhbXlwvPyM6XSopKD86OihcZCspKT8pPy8sYlI9Zi5mbi5sb2FkLGJTPXt9LGJUPXt9LGJVLGJWLGJXPVsiKi8iXStbIioiXTt0cnl7YlU9ZS5ocmVmfWNhdGNoKGJYKXtiVT1jLmNyZWF0ZUVsZW1lbnQoImEiKSxiVS5ocmVmPSIiLGJVPWJVLmhyZWZ9YlY9YlEuZXhlYyhiVS50b0xvd2VyQ2FzZSgpKXx8W10sZi5mbi5leHRlbmQoe2xvYWQ6ZnVuY3Rpb24oYSxjLGQpe2lmKHR5cGVvZiBhIT0ic3RyaW5nIiYmYlIpcmV0dXJuIGJSLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtpZighdGhpcy5sZW5ndGgpcmV0dXJuIHRoaXM7dmFyIGU9YS5pbmRleE9mKCIgIik7aWYoZT49MCl7dmFyIGc9YS5zbGljZShlLGEubGVuZ3RoKTthPWEuc2xpY2UoMCxlKX12YXIgaD0iR0VUIjtjJiYoZi5pc0Z1bmN0aW9uKGMpPyhkPWMsYz1iKTp0eXBlb2YgYz09Im9iamVjdCImJihjPWYucGFyYW0oYyxmLmFqYXhTZXR0aW5ncy50cmFkaXRpb25hbCksaD0iUE9TVCIpKTt2YXIgaT10aGlzO2YuYWpheCh7dXJsOmEsdHlwZTpoLGRhdGFUeXBlOiJodG1sIixkYXRhOmMsY29tcGxldGU6ZnVuY3Rpb24oYSxiLGMpe2M9YS5yZXNwb25zZVRleHQsYS5pc1Jlc29sdmVkKCkmJihhLmRvbmUoZnVuY3Rpb24oYSl7Yz1hfSksaS5odG1sKGc/ZigiPGRpdj4iKS5hcHBlbmQoYy5yZXBsYWNlKGJNLCIiKSkuZmluZChnKTpjKSksZCYmaS5lYWNoKGQsW2MsYixhXSl9fSk7cmV0dXJuIHRoaXN9LHNlcmlhbGl6ZTpmdW5jdGlvbigpe3JldHVybiBmLnBhcmFtKHRoaXMuc2VyaWFsaXplQXJyYXkoKSl9LHNlcmlhbGl6ZUFycmF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWxlbWVudHM/Zi5tYWtlQXJyYXkodGhpcy5lbGVtZW50cyk6dGhpc30pLmZpbHRlcihmdW5jdGlvbigpe3JldHVybiB0aGlzLm5hbWUmJiF0aGlzLmRpc2FibGVkJiYodGhpcy5jaGVja2VkfHxiTi50ZXN0KHRoaXMubm9kZU5hbWUpfHxiSC50ZXN0KHRoaXMudHlwZSkpfSkubWFwKGZ1bmN0aW9uKGEsYil7dmFyIGM9Zih0aGlzKS52YWwoKTtyZXR1cm4gYz09bnVsbD9udWxsOmYuaXNBcnJheShjKT9mLm1hcChjLGZ1bmN0aW9uKGEsYyl7cmV0dXJue25hbWU6Yi5uYW1lLHZhbHVlOmEucmVwbGFjZShiRSwiXHJcbiIpfX0pOntuYW1lOmIubmFtZSx2YWx1ZTpjLnJlcGxhY2UoYkUsIlxyXG4iKX19KS5nZXQoKX19KSxmLmVhY2goImFqYXhTdGFydCBhamF4U3RvcCBhamF4Q29tcGxldGUgYWpheEVycm9yIGFqYXhTdWNjZXNzIGFqYXhTZW5kIi5zcGxpdCgiICIpLGZ1bmN0aW9uKGEsYil7Zi5mbltiXT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5vbihiLGEpfX0pLGYuZWFjaChbImdldCIsInBvc3QiXSxmdW5jdGlvbihhLGMpe2ZbY109ZnVuY3Rpb24oYSxkLGUsZyl7Zi5pc0Z1bmN0aW9uKGQpJiYoZz1nfHxlLGU9ZCxkPWIpO3JldHVybiBmLmFqYXgoe3R5cGU6Yyx1cmw6YSxkYXRhOmQsc3VjY2VzczplLGRhdGFUeXBlOmd9KX19KSxmLmV4dGVuZCh7Z2V0U2NyaXB0OmZ1bmN0aW9uKGEsYyl7cmV0dXJuIGYuZ2V0KGEsYixjLCJzY3JpcHQiKX0sZ2V0SlNPTjpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGYuZ2V0KGEsYixjLCJqc29uIil9LGFqYXhTZXR1cDpmdW5jdGlvbihhLGIpe2I/YiQoYSxmLmFqYXhTZXR0aW5ncyk6KGI9YSxhPWYuYWpheFNldHRpbmdzKSxiJChhLGIpO3JldHVybiBhfSxhamF4U2V0dGluZ3M6e3VybDpiVSxpc0xvY2FsOmJJLnRlc3QoYlZbMV0pLGdsb2JhbDohMCx0eXBlOiJHRVQiLGNvbnRlbnRUeXBlOiJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7IGNoYXJzZXQ9VVRGLTgiLHByb2Nlc3NEYXRhOiEwLGFzeW5jOiEwLGFjY2VwdHM6e3htbDoiYXBwbGljYXRpb24veG1sLCB0ZXh0L3htbCIsaHRtbDoidGV4dC9odG1sIix0ZXh0OiJ0ZXh0L3BsYWluIixqc29uOiJhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L2phdmFzY3JpcHQiLCIqIjpiV30sY29udGVudHM6e3htbDoveG1sLyxodG1sOi9odG1sLyxqc29uOi9qc29uL30scmVzcG9uc2VGaWVsZHM6e3htbDoicmVzcG9uc2VYTUwiLHRleHQ6InJlc3BvbnNlVGV4dCJ9LGNvbnZlcnRlcnM6eyIqIHRleHQiOmEuU3RyaW5nLCJ0ZXh0IGh0bWwiOiEwLCJ0ZXh0IGpzb24iOmYucGFyc2VKU09OLCJ0ZXh0IHhtbCI6Zi5wYXJzZVhNTH0sZmxhdE9wdGlvbnM6e2NvbnRleHQ6ITAsdXJsOiEwfX0sYWpheFByZWZpbHRlcjpiWShiUyksYWpheFRyYW5zcG9ydDpiWShiVCksYWpheDpmdW5jdGlvbihhLGMpe2Z1bmN0aW9uIHcoYSxjLGwsbSl7aWYocyE9PTIpe3M9MixxJiZjbGVhclRpbWVvdXQocSkscD1iLG49bXx8IiIsdi5yZWFkeVN0YXRlPWE+MD80OjA7dmFyIG8scix1LHc9Yyx4PWw/Y2EoZCx2LGwpOmIseSx6O2lmKGE+PTIwMCYmYTwzMDB8fGE9PT0zMDQpe2lmKGQuaWZNb2RpZmllZCl7aWYoeT12LmdldFJlc3BvbnNlSGVhZGVyKCJMYXN0LU1vZGlmaWVkIikpZi5sYXN0TW9kaWZpZWRba109eTtpZih6PXYuZ2V0UmVzcG9uc2VIZWFkZXIoIkV0YWciKSlmLmV0YWdba109en1pZihhPT09MzA0KXc9Im5vdG1vZGlmaWVkIixvPSEwO2Vsc2UgdHJ5e3I9Y2IoZCx4KSx3PSJzdWNjZXNzIixvPSEwfWNhdGNoKEEpe3c9InBhcnNlcmVycm9yIix1PUF9fWVsc2V7dT13O2lmKCF3fHxhKXc9ImVycm9yIixhPDAmJihhPTApfXYuc3RhdHVzPWEsdi5zdGF0dXNUZXh0PSIiKyhjfHx3KSxvP2gucmVzb2x2ZVdpdGgoZSxbcix3LHZdKTpoLnJlamVjdFdpdGgoZSxbdix3LHVdKSx2LnN0YXR1c0NvZGUoaiksaj1iLHQmJmcudHJpZ2dlcigiYWpheCIrKG8/IlN1Y2Nlc3MiOiJFcnJvciIpLFt2LGQsbz9yOnVdKSxpLmZpcmVXaXRoKGUsW3Ysd10pLHQmJihnLnRyaWdnZXIoImFqYXhDb21wbGV0ZSIsW3YsZF0pLC0tZi5hY3RpdmV8fGYuZXZlbnQudHJpZ2dlcigiYWpheFN0b3AiKSl9fXR5cGVvZiBhPT0ib2JqZWN0IiYmKGM9YSxhPWIpLGM9Y3x8e307dmFyIGQ9Zi5hamF4U2V0dXAoe30sYyksZT1kLmNvbnRleHR8fGQsZz1lIT09ZCYmKGUubm9kZVR5cGV8fGUgaW5zdGFuY2VvZiBmKT9mKGUpOmYuZXZlbnQsaD1mLkRlZmVycmVkKCksaT1mLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSxqPWQuc3RhdHVzQ29kZXx8e30sayxsPXt9LG09e30sbixvLHAscSxyLHM9MCx0LHUsdj17cmVhZHlTdGF0ZTowLHNldFJlcXVlc3RIZWFkZXI6ZnVuY3Rpb24oYSxiKXtpZighcyl7dmFyIGM9YS50b0xvd2VyQ2FzZSgpO2E9bVtjXT1tW2NdfHxhLGxbYV09Yn1yZXR1cm4gdGhpc30sZ2V0QWxsUmVzcG9uc2VIZWFkZXJzOmZ1bmN0aW9uKCl7cmV0dXJuIHM9PT0yP246bnVsbH0sZ2V0UmVzcG9uc2VIZWFkZXI6ZnVuY3Rpb24oYSl7dmFyIGM7aWYocz09PTIpe2lmKCFvKXtvPXt9O3doaWxlKGM9YkcuZXhlYyhuKSlvW2NbMV0udG9Mb3dlckNhc2UoKV09Y1syXX1jPW9bYS50b0xvd2VyQ2FzZSgpXX1yZXR1cm4gYz09PWI/bnVsbDpjfSxvdmVycmlkZU1pbWVUeXBlOmZ1bmN0aW9uKGEpe3N8fChkLm1pbWVUeXBlPWEpO3JldHVybiB0aGlzfSxhYm9ydDpmdW5jdGlvbihhKXthPWF8fCJhYm9ydCIscCYmcC5hYm9ydChhKSx3KDAsYSk7cmV0dXJuIHRoaXN9fTtoLnByb21pc2Uodiksdi5zdWNjZXNzPXYuZG9uZSx2LmVycm9yPXYuZmFpbCx2LmNvbXBsZXRlPWkuYWRkLHYuc3RhdHVzQ29kZT1mdW5jdGlvbihhKXtpZihhKXt2YXIgYjtpZihzPDIpZm9yKGIgaW4gYSlqW2JdPVtqW2JdLGFbYl1dO2Vsc2UgYj1hW3Yuc3RhdHVzXSx2LnRoZW4oYixiKX1yZXR1cm4gdGhpc30sZC51cmw9KChhfHxkLnVybCkrIiIpLnJlcGxhY2UoYkYsIiIpLnJlcGxhY2UoYkssYlZbMV0rIi8vIiksZC5kYXRhVHlwZXM9Zi50cmltKGQuZGF0YVR5cGV8fCIqIikudG9Mb3dlckNhc2UoKS5zcGxpdChiTyksZC5jcm9zc0RvbWFpbj09bnVsbCYmKHI9YlEuZXhlYyhkLnVybC50b0xvd2VyQ2FzZSgpKSxkLmNyb3NzRG9tYWluPSEoIXJ8fHJbMV09PWJWWzFdJiZyWzJdPT1iVlsyXSYmKHJbM118fChyWzFdPT09Imh0dHA6Ij84MDo0NDMpKT09KGJWWzNdfHwoYlZbMV09PT0iaHR0cDoiPzgwOjQ0MykpKSksZC5kYXRhJiZkLnByb2Nlc3NEYXRhJiZ0eXBlb2YgZC5kYXRhIT0ic3RyaW5nIiYmKGQuZGF0YT1mLnBhcmFtKGQuZGF0YSxkLnRyYWRpdGlvbmFsKSksYlooYlMsZCxjLHYpO2lmKHM9PT0yKXJldHVybiExO3Q9ZC5nbG9iYWwsZC50eXBlPWQudHlwZS50b1VwcGVyQ2FzZSgpLGQuaGFzQ29udGVudD0hYkoudGVzdChkLnR5cGUpLHQmJmYuYWN0aXZlKys9PT0wJiZmLmV2ZW50LnRyaWdnZXIoImFqYXhTdGFydCIpO2lmKCFkLmhhc0NvbnRlbnQpe2QuZGF0YSYmKGQudXJsKz0oYkwudGVzdChkLnVybCk/IiYiOiI/IikrZC5kYXRhLGRlbGV0ZSBkLmRhdGEpLGs9ZC51cmw7aWYoZC5jYWNoZT09PSExKXt2YXIgeD1mLm5vdygpLHk9ZC51cmwucmVwbGFjZShiUCwiJDFfPSIreCk7ZC51cmw9eSsoeT09PWQudXJsPyhiTC50ZXN0KGQudXJsKT8iJiI6Ij8iKSsiXz0iK3g6IiIpfX0oZC5kYXRhJiZkLmhhc0NvbnRlbnQmJmQuY29udGVudFR5cGUhPT0hMXx8Yy5jb250ZW50VHlwZSkmJnYuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC1UeXBlIixkLmNvbnRlbnRUeXBlKSxkLmlmTW9kaWZpZWQmJihrPWt8fGQudXJsLGYubGFzdE1vZGlmaWVkW2tdJiZ2LnNldFJlcXVlc3RIZWFkZXIoIklmLU1vZGlmaWVkLVNpbmNlIixmLmxhc3RNb2RpZmllZFtrXSksZi5ldGFnW2tdJiZ2LnNldFJlcXVlc3RIZWFkZXIoIklmLU5vbmUtTWF0Y2giLGYuZXRhZ1trXSkpLHYuc2V0UmVxdWVzdEhlYWRlcigiQWNjZXB0IixkLmRhdGFUeXBlc1swXSYmZC5hY2NlcHRzW2QuZGF0YVR5cGVzWzBdXT9kLmFjY2VwdHNbZC5kYXRhVHlwZXNbMF1dKyhkLmRhdGFUeXBlc1swXSE9PSIqIj8iLCAiK2JXKyI7IHE9MC4wMSI6IiIpOmQuYWNjZXB0c1siKiJdKTtmb3IodSBpbiBkLmhlYWRlcnMpdi5zZXRSZXF1ZXN0SGVhZGVyKHUsZC5oZWFkZXJzW3VdKTtpZihkLmJlZm9yZVNlbmQmJihkLmJlZm9yZVNlbmQuY2FsbChlLHYsZCk9PT0hMXx8cz09PTIpKXt2LmFib3J0KCk7cmV0dXJuITF9Zm9yKHUgaW57c3VjY2VzczoxLGVycm9yOjEsY29tcGxldGU6MX0pdlt1XShkW3VdKTtwPWJaKGJULGQsYyx2KTtpZighcCl3KC0xLCJObyBUcmFuc3BvcnQiKTtlbHNle3YucmVhZHlTdGF0ZT0xLHQmJmcudHJpZ2dlcigiYWpheFNlbmQiLFt2LGRdKSxkLmFzeW5jJiZkLnRpbWVvdXQ+MCYmKHE9c2V0VGltZW91dChmdW5jdGlvbigpe3YuYWJvcnQoInRpbWVvdXQiKX0sZC50aW1lb3V0KSk7dHJ5e3M9MSxwLnNlbmQobCx3KX1jYXRjaCh6KXtpZihzPDIpdygtMSx6KTtlbHNlIHRocm93IHp9fXJldHVybiB2fSxwYXJhbTpmdW5jdGlvbihhLGMpe3ZhciBkPVtdLGU9ZnVuY3Rpb24oYSxiKXtiPWYuaXNGdW5jdGlvbihiKT9iKCk6YixkW2QubGVuZ3RoXT1lbmNvZGVVUklDb21wb25lbnQoYSkrIj0iK2VuY29kZVVSSUNvbXBvbmVudChiKX07Yz09PWImJihjPWYuYWpheFNldHRpbmdzLnRyYWRpdGlvbmFsKTtpZihmLmlzQXJyYXkoYSl8fGEuanF1ZXJ5JiYhZi5pc1BsYWluT2JqZWN0KGEpKWYuZWFjaChhLGZ1bmN0aW9uKCl7ZSh0aGlzLm5hbWUsdGhpcy52YWx1ZSl9KTtlbHNlIGZvcih2YXIgZyBpbiBhKWJfKGcsYVtnXSxjLGUpO3JldHVybiBkLmpvaW4oIiYiKS5yZXBsYWNlKGJDLCIrIil9fSksZi5leHRlbmQoe2FjdGl2ZTowLGxhc3RNb2RpZmllZDp7fSxldGFnOnt9fSk7dmFyIGNjPWYubm93KCksY2Q9LyhcPSlcPygmfCQpfFw/XD8vaTtmLmFqYXhTZXR1cCh7anNvbnA6ImNhbGxiYWNrIixqc29ucENhbGxiYWNrOmZ1bmN0aW9uKCl7cmV0dXJuIGYuZXhwYW5kbysiXyIrY2MrK319KSxmLmFqYXhQcmVmaWx0ZXIoImpzb24ganNvbnAiLGZ1bmN0aW9uKGIsYyxkKXt2YXIgZT10eXBlb2YgYi5kYXRhPT0ic3RyaW5nIiYmL15hcHBsaWNhdGlvblwveFwtd3d3XC1mb3JtXC11cmxlbmNvZGVkLy50ZXN0KGIuY29udGVudFR5cGUpO2lmKGIuZGF0YVR5cGVzWzBdPT09Impzb25wInx8Yi5qc29ucCE9PSExJiYoY2QudGVzdChiLnVybCl8fGUmJmNkLnRlc3QoYi5kYXRhKSkpe3ZhciBnLGg9Yi5qc29ucENhbGxiYWNrPWYuaXNGdW5jdGlvbihiLmpzb25wQ2FsbGJhY2spP2IuanNvbnBDYWxsYmFjaygpOmIuanNvbnBDYWxsYmFjayxpPWFbaF0saj1iLnVybCxrPWIuZGF0YSxsPSIkMSIraCsiJDIiO2IuanNvbnAhPT0hMSYmKGo9ai5yZXBsYWNlKGNkLGwpLGIudXJsPT09aiYmKGUmJihrPWsucmVwbGFjZShjZCxsKSksYi5kYXRhPT09ayYmKGorPSgvXD8vLnRlc3Qoaik/IiYiOiI/IikrYi5qc29ucCsiPSIraCkpKSxiLnVybD1qLGIuZGF0YT1rLGFbaF09ZnVuY3Rpb24oYSl7Zz1bYV19LGQuYWx3YXlzKGZ1bmN0aW9uKCl7YVtoXT1pLGcmJmYuaXNGdW5jdGlvbihpKSYmYVtoXShnWzBdKX0pLGIuY29udmVydGVyc1sic2NyaXB0IGpzb24iXT1mdW5jdGlvbigpe2d8fGYuZXJyb3IoaCsiIHdhcyBub3QgY2FsbGVkIik7cmV0dXJuIGdbMF19LGIuZGF0YVR5cGVzWzBdPSJqc29uIjtyZXR1cm4ic2NyaXB0In19KSxmLmFqYXhTZXR1cCh7YWNjZXB0czp7c2NyaXB0OiJ0ZXh0L2phdmFzY3JpcHQsIGFwcGxpY2F0aW9uL2phdmFzY3JpcHQsIGFwcGxpY2F0aW9uL2VjbWFzY3JpcHQsIGFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCJ9LGNvbnRlbnRzOntzY3JpcHQ6L2phdmFzY3JpcHR8ZWNtYXNjcmlwdC99LGNvbnZlcnRlcnM6eyJ0ZXh0IHNjcmlwdCI6ZnVuY3Rpb24oYSl7Zi5nbG9iYWxFdmFsKGEpO3JldHVybiBhfX19KSxmLmFqYXhQcmVmaWx0ZXIoInNjcmlwdCIsZnVuY3Rpb24oYSl7YS5jYWNoZT09PWImJihhLmNhY2hlPSExKSxhLmNyb3NzRG9tYWluJiYoYS50eXBlPSJHRVQiLGEuZ2xvYmFsPSExKX0pLGYuYWpheFRyYW5zcG9ydCgic2NyaXB0IixmdW5jdGlvbihhKXtpZihhLmNyb3NzRG9tYWluKXt2YXIgZCxlPWMuaGVhZHx8Yy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaGVhZCIpWzBdfHxjLmRvY3VtZW50RWxlbWVudDtyZXR1cm57c2VuZDpmdW5jdGlvbihmLGcpe2Q9Yy5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKSxkLmFzeW5jPSJhc3luYyIsYS5zY3JpcHRDaGFyc2V0JiYoZC5jaGFyc2V0PWEuc2NyaXB0Q2hhcnNldCksZC5zcmM9YS51cmwsZC5vbmxvYWQ9ZC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oYSxjKXtpZihjfHwhZC5yZWFkeVN0YXRlfHwvbG9hZGVkfGNvbXBsZXRlLy50ZXN0KGQucmVhZHlTdGF0ZSkpZC5vbmxvYWQ9ZC5vbnJlYWR5c3RhdGVjaGFuZ2U9bnVsbCxlJiZkLnBhcmVudE5vZGUmJmUucmVtb3ZlQ2hpbGQoZCksZD1iLGN8fGcoMjAwLCJzdWNjZXNzIil9LGUuaW5zZXJ0QmVmb3JlKGQsZS5maXJzdENoaWxkKX0sYWJvcnQ6ZnVuY3Rpb24oKXtkJiZkLm9ubG9hZCgwLDEpfX19fSk7dmFyIGNlPWEuQWN0aXZlWE9iamVjdD9mdW5jdGlvbigpe2Zvcih2YXIgYSBpbiBjZyljZ1thXSgwLDEpfTohMSxjZj0wLGNnO2YuYWpheFNldHRpbmdzLnhocj1hLkFjdGl2ZVhPYmplY3Q/ZnVuY3Rpb24oKXtyZXR1cm4hdGhpcy5pc0xvY2FsJiZjaCgpfHxjaSgpfTpjaCxmdW5jdGlvbihhKXtmLmV4dGVuZChmLnN1cHBvcnQse2FqYXg6ISFhLGNvcnM6ISFhJiYid2l0aENyZWRlbnRpYWxzImluIGF9KX0oZi5hamF4U2V0dGluZ3MueGhyKCkpLGYuc3VwcG9ydC5hamF4JiZmLmFqYXhUcmFuc3BvcnQoZnVuY3Rpb24oYyl7aWYoIWMuY3Jvc3NEb21haW58fGYuc3VwcG9ydC5jb3JzKXt2YXIgZDtyZXR1cm57c2VuZDpmdW5jdGlvbihlLGcpe3ZhciBoPWMueGhyKCksaSxqO2MudXNlcm5hbWU/aC5vcGVuKGMudHlwZSxjLnVybCxjLmFzeW5jLGMudXNlcm5hbWUsYy5wYXNzd29yZCk6aC5vcGVuKGMudHlwZSxjLnVybCxjLmFzeW5jKTtpZihjLnhockZpZWxkcylmb3IoaiBpbiBjLnhockZpZWxkcyloW2pdPWMueGhyRmllbGRzW2pdO2MubWltZVR5cGUmJmgub3ZlcnJpZGVNaW1lVHlwZSYmaC5vdmVycmlkZU1pbWVUeXBlKGMubWltZVR5cGUpLCFjLmNyb3NzRG9tYWluJiYhZVsiWC1SZXF1ZXN0ZWQtV2l0aCJdJiYoZVsiWC1SZXF1ZXN0ZWQtV2l0aCJdPSJYTUxIdHRwUmVxdWVzdCIpO3RyeXtmb3IoaiBpbiBlKWguc2V0UmVxdWVzdEhlYWRlcihqLGVbal0pfWNhdGNoKGspe31oLnNlbmQoYy5oYXNDb250ZW50JiZjLmRhdGF8fG51bGwpLGQ9ZnVuY3Rpb24oYSxlKXt2YXIgaixrLGwsbSxuO3RyeXtpZihkJiYoZXx8aC5yZWFkeVN0YXRlPT09NCkpe2Q9YixpJiYoaC5vbnJlYWR5c3RhdGVjaGFuZ2U9Zi5ub29wLGNlJiZkZWxldGUgY2dbaV0pO2lmKGUpaC5yZWFkeVN0YXRlIT09NCYmaC5hYm9ydCgpO2Vsc2V7aj1oLnN0YXR1cyxsPWguZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCksbT17fSxuPWgucmVzcG9uc2VYTUwsbiYmbi5kb2N1bWVudEVsZW1lbnQmJihtLnhtbD1uKTt0cnl7bS50ZXh0PWgucmVzcG9uc2VUZXh0fWNhdGNoKGEpe310cnl7az1oLnN0YXR1c1RleHR9Y2F0Y2gobyl7az0iIn0haiYmYy5pc0xvY2FsJiYhYy5jcm9zc0RvbWFpbj9qPW0udGV4dD8yMDA6NDA0Omo9PT0xMjIzJiYoaj0yMDQpfX19Y2F0Y2gocCl7ZXx8ZygtMSxwKX1tJiZnKGosayxtLGwpfSwhYy5hc3luY3x8aC5yZWFkeVN0YXRlPT09ND9kKCk6KGk9KytjZixjZSYmKGNnfHwoY2c9e30sZihhKS51bmxvYWQoY2UpKSxjZ1tpXT1kKSxoLm9ucmVhZHlzdGF0ZWNoYW5nZT1kKX0sYWJvcnQ6ZnVuY3Rpb24oKXtkJiZkKDAsMSl9fX19KTt2YXIgY2o9e30sY2ssY2wsY209L14oPzp0b2dnbGV8c2hvd3xoaWRlKSQvLGNuPS9eKFsrXC1dPSk/KFtcZCsuXC1dKykoW2EteiVdKikkL2ksY28sY3A9W1siaGVpZ2h0IiwibWFyZ2luVG9wIiwibWFyZ2luQm90dG9tIiwicGFkZGluZ1RvcCIsInBhZGRpbmdCb3R0b20iXSxbIndpZHRoIiwibWFyZ2luTGVmdCIsIm1hcmdpblJpZ2h0IiwicGFkZGluZ0xlZnQiLCJwYWRkaW5nUmlnaHQiXSxbIm9wYWNpdHkiXV0sY3E7Zi5mbi5leHRlbmQoe3Nob3c6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGU7aWYoYXx8YT09PTApcmV0dXJuIHRoaXMuYW5pbWF0ZShjdCgic2hvdyIsMyksYSxiLGMpO2Zvcih2YXIgZz0wLGg9dGhpcy5sZW5ndGg7ZzxoO2crKylkPXRoaXNbZ10sZC5zdHlsZSYmKGU9ZC5zdHlsZS5kaXNwbGF5LCFmLl9kYXRhKGQsIm9sZGRpc3BsYXkiKSYmZT09PSJub25lIiYmKGU9ZC5zdHlsZS5kaXNwbGF5PSIiKSwoZT09PSIiJiZmLmNzcyhkLCJkaXNwbGF5Iik9PT0ibm9uZSJ8fCFmLmNvbnRhaW5zKGQub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsZCkpJiZmLl9kYXRhKGQsIm9sZGRpc3BsYXkiLGN1KGQubm9kZU5hbWUpKSk7Zm9yKGc9MDtnPGg7ZysrKXtkPXRoaXNbZ107aWYoZC5zdHlsZSl7ZT1kLnN0eWxlLmRpc3BsYXk7aWYoZT09PSIifHxlPT09Im5vbmUiKWQuc3R5bGUuZGlzcGxheT1mLl9kYXRhKGQsIm9sZGRpc3BsYXkiKXx8IiJ9fXJldHVybiB0aGlzfSxoaWRlOmZ1bmN0aW9uKGEsYixjKXtpZihhfHxhPT09MClyZXR1cm4gdGhpcy5hbmltYXRlKGN0KCJoaWRlIiwzKSxhLGIsYyk7dmFyIGQsZSxnPTAsaD10aGlzLmxlbmd0aDtmb3IoO2c8aDtnKyspZD10aGlzW2ddLGQuc3R5bGUmJihlPWYuY3NzKGQsImRpc3BsYXkiKSxlIT09Im5vbmUiJiYhZi5fZGF0YShkLCJvbGRkaXNwbGF5IikmJmYuX2RhdGEoZCwib2xkZGlzcGxheSIsZSkpO2ZvcihnPTA7ZzxoO2crKyl0aGlzW2ddLnN0eWxlJiYodGhpc1tnXS5zdHlsZS5kaXNwbGF5PSJub25lIik7cmV0dXJuIHRoaXN9LF90b2dnbGU6Zi5mbi50b2dnbGUsdG9nZ2xlOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD10eXBlb2YgYT09ImJvb2xlYW4iO2YuaXNGdW5jdGlvbihhKSYmZi5pc0Z1bmN0aW9uKGIpP3RoaXMuX3RvZ2dsZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk6YT09bnVsbHx8ZD90aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgYj1kP2E6Zih0aGlzKS5pcygiOmhpZGRlbiIpO2YodGhpcylbYj8ic2hvdyI6ImhpZGUiXSgpfSk6dGhpcy5hbmltYXRlKGN0KCJ0b2dnbGUiLDMpLGEsYixjKTtyZXR1cm4gdGhpc30sZmFkZVRvOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiB0aGlzLmZpbHRlcigiOmhpZGRlbiIpLmNzcygib3BhY2l0eSIsMCkuc2hvdygpLmVuZCgpLmFuaW1hdGUoe29wYWNpdHk6Yn0sYSxjLGQpfSxhbmltYXRlOmZ1bmN0aW9uKGEsYixjLGQpe2Z1bmN0aW9uIGcoKXtlLnF1ZXVlPT09ITEmJmYuX21hcmsodGhpcyk7dmFyIGI9Zi5leHRlbmQoe30sZSksYz10aGlzLm5vZGVUeXBlPT09MSxkPWMmJmYodGhpcykuaXMoIjpoaWRkZW4iKSxnLGgsaSxqLGssbCxtLG4sbyxwLHE7Yi5hbmltYXRlZFByb3BlcnRpZXM9e307Zm9yKGkgaW4gYSl7Zz1mLmNhbWVsQ2FzZShpKSxpIT09ZyYmKGFbZ109YVtpXSxkZWxldGUgYVtpXSk7aWYoKGs9Zi5jc3NIb29rc1tnXSkmJiJleHBhbmQiaW4gayl7bD1rLmV4cGFuZChhW2ddKSxkZWxldGUgYVtnXTtmb3IoaSBpbiBsKWkgaW4gYXx8KGFbaV09bFtpXSl9fWZvcihnIGluIGEpe2g9YVtnXSxmLmlzQXJyYXkoaCk/KGIuYW5pbWF0ZWRQcm9wZXJ0aWVzW2ddPWhbMV0saD1hW2ddPWhbMF0pOmIuYW5pbWF0ZWRQcm9wZXJ0aWVzW2ddPWIuc3BlY2lhbEVhc2luZyYmYi5zcGVjaWFsRWFzaW5nW2ddfHxiLmVhc2luZ3x8InN3aW5nIjtpZihoPT09ImhpZGUiJiZkfHxoPT09InNob3ciJiYhZClyZXR1cm4gYi5jb21wbGV0ZS5jYWxsKHRoaXMpO2MmJihnPT09ImhlaWdodCJ8fGc9PT0id2lkdGgiKSYmKGIub3ZlcmZsb3c9W3RoaXMuc3R5bGUub3ZlcmZsb3csdGhpcy5zdHlsZS5vdmVyZmxvd1gsdGhpcy5zdHlsZS5vdmVyZmxvd1ldLGYuY3NzKHRoaXMsImRpc3BsYXkiKT09PSJpbmxpbmUiJiZmLmNzcyh0aGlzLCJmbG9hdCIpPT09Im5vbmUiJiYoIWYuc3VwcG9ydC5pbmxpbmVCbG9ja05lZWRzTGF5b3V0fHxjdSh0aGlzLm5vZGVOYW1lKT09PSJpbmxpbmUiP3RoaXMuc3R5bGUuZGlzcGxheT0iaW5saW5lLWJsb2NrIjp0aGlzLnN0eWxlLnpvb209MSkpfWIub3ZlcmZsb3chPW51bGwmJih0aGlzLnN0eWxlLm92ZXJmbG93PSJoaWRkZW4iKTtmb3IoaSBpbiBhKWo9bmV3IGYuZngodGhpcyxiLGkpLGg9YVtpXSxjbS50ZXN0KGgpPyhxPWYuX2RhdGEodGhpcywidG9nZ2xlIitpKXx8KGg9PT0idG9nZ2xlIj9kPyJzaG93IjoiaGlkZSI6MCkscT8oZi5fZGF0YSh0aGlzLCJ0b2dnbGUiK2kscT09PSJzaG93Ij8iaGlkZSI6InNob3ciKSxqW3FdKCkpOmpbaF0oKSk6KG09Y24uZXhlYyhoKSxuPWouY3VyKCksbT8obz1wYXJzZUZsb2F0KG1bMl0pLHA9bVszXXx8KGYuY3NzTnVtYmVyW2ldPyIiOiJweCIpLHAhPT0icHgiJiYoZi5zdHlsZSh0aGlzLGksKG98fDEpK3ApLG49KG98fDEpL2ouY3VyKCkqbixmLnN0eWxlKHRoaXMsaSxuK3ApKSxtWzFdJiYobz0obVsxXT09PSItPSI/LTE6MSkqbytuKSxqLmN1c3RvbShuLG8scCkpOmouY3VzdG9tKG4saCwiIikpO3JldHVybiEwfXZhciBlPWYuc3BlZWQoYixjLGQpO2lmKGYuaXNFbXB0eU9iamVjdChhKSlyZXR1cm4gdGhpcy5lYWNoKGUuY29tcGxldGUsWyExXSk7YT1mLmV4dGVuZCh7fSxhKTtyZXR1cm4gZS5xdWV1ZT09PSExP3RoaXMuZWFjaChnKTp0aGlzLnF1ZXVlKGUucXVldWUsZyl9LHN0b3A6ZnVuY3Rpb24oYSxjLGQpe3R5cGVvZiBhIT0ic3RyaW5nIiYmKGQ9YyxjPWEsYT1iKSxjJiZhIT09ITEmJnRoaXMucXVldWUoYXx8ImZ4IixbXSk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2Z1bmN0aW9uIGgoYSxiLGMpe3ZhciBlPWJbY107Zi5yZW1vdmVEYXRhKGEsYywhMCksZS5zdG9wKGQpfXZhciBiLGM9ITEsZT1mLnRpbWVycyxnPWYuX2RhdGEodGhpcyk7ZHx8Zi5fdW5tYXJrKCEwLHRoaXMpO2lmKGE9PW51bGwpZm9yKGIgaW4gZylnW2JdJiZnW2JdLnN0b3AmJmIuaW5kZXhPZigiLnJ1biIpPT09Yi5sZW5ndGgtNCYmaCh0aGlzLGcsYik7ZWxzZSBnW2I9YSsiLnJ1biJdJiZnW2JdLnN0b3AmJmgodGhpcyxnLGIpO2ZvcihiPWUubGVuZ3RoO2ItLTspZVtiXS5lbGVtPT09dGhpcyYmKGE9PW51bGx8fGVbYl0ucXVldWU9PT1hKSYmKGQ/ZVtiXSghMCk6ZVtiXS5zYXZlU3RhdGUoKSxjPSEwLGUuc3BsaWNlKGIsMSkpOyghZHx8IWMpJiZmLmRlcXVldWUodGhpcyxhKX0pfX0pLGYuZWFjaCh7c2xpZGVEb3duOmN0KCJzaG93IiwxKSxzbGlkZVVwOmN0KCJoaWRlIiwxKSxzbGlkZVRvZ2dsZTpjdCgidG9nZ2xlIiwxKSxmYWRlSW46e29wYWNpdHk6InNob3cifSxmYWRlT3V0OntvcGFjaXR5OiJoaWRlIn0sZmFkZVRvZ2dsZTp7b3BhY2l0eToidG9nZ2xlIn19LGZ1bmN0aW9uKGEsYil7Zi5mblthXT1mdW5jdGlvbihhLGMsZCl7cmV0dXJuIHRoaXMuYW5pbWF0ZShiLGEsYyxkKX19KSxmLmV4dGVuZCh7c3BlZWQ6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWEmJnR5cGVvZiBhPT0ib2JqZWN0Ij9mLmV4dGVuZCh7fSxhKTp7Y29tcGxldGU6Y3x8IWMmJmJ8fGYuaXNGdW5jdGlvbihhKSYmYSxkdXJhdGlvbjphLGVhc2luZzpjJiZifHxiJiYhZi5pc0Z1bmN0aW9uKGIpJiZifTtkLmR1cmF0aW9uPWYuZngub2ZmPzA6dHlwZW9mIGQuZHVyYXRpb249PSJudW1iZXIiP2QuZHVyYXRpb246ZC5kdXJhdGlvbiBpbiBmLmZ4LnNwZWVkcz9mLmZ4LnNwZWVkc1tkLmR1cmF0aW9uXTpmLmZ4LnNwZWVkcy5fZGVmYXVsdDtpZihkLnF1ZXVlPT1udWxsfHxkLnF1ZXVlPT09ITApZC5xdWV1ZT0iZngiO2Qub2xkPWQuY29tcGxldGUsZC5jb21wbGV0ZT1mdW5jdGlvbihhKXtmLmlzRnVuY3Rpb24oZC5vbGQpJiZkLm9sZC5jYWxsKHRoaXMpLGQucXVldWU/Zi5kZXF1ZXVlKHRoaXMsZC5xdWV1ZSk6YSE9PSExJiZmLl91bm1hcmsodGhpcyl9O3JldHVybiBkfSxlYXNpbmc6e2xpbmVhcjpmdW5jdGlvbihhKXtyZXR1cm4gYX0sc3dpbmc6ZnVuY3Rpb24oYSl7cmV0dXJuLU1hdGguY29zKGEqTWF0aC5QSSkvMisuNX19LHRpbWVyczpbXSxmeDpmdW5jdGlvbihhLGIsYyl7dGhpcy5vcHRpb25zPWIsdGhpcy5lbGVtPWEsdGhpcy5wcm9wPWMsYi5vcmlnPWIub3JpZ3x8e319fSksZi5meC5wcm90b3R5cGU9e3VwZGF0ZTpmdW5jdGlvbigpe3RoaXMub3B0aW9ucy5zdGVwJiZ0aGlzLm9wdGlvbnMuc3RlcC5jYWxsKHRoaXMuZWxlbSx0aGlzLm5vdyx0aGlzKSwoZi5meC5zdGVwW3RoaXMucHJvcF18fGYuZnguc3RlcC5fZGVmYXVsdCkodGhpcyl9LGN1cjpmdW5jdGlvbigpe2lmKHRoaXMuZWxlbVt0aGlzLnByb3BdIT1udWxsJiYoIXRoaXMuZWxlbS5zdHlsZXx8dGhpcy5lbGVtLnN0eWxlW3RoaXMucHJvcF09PW51bGwpKXJldHVybiB0aGlzLmVsZW1bdGhpcy5wcm9wXTt2YXIgYSxiPWYuY3NzKHRoaXMuZWxlbSx0aGlzLnByb3ApO3JldHVybiBpc05hTihhPXBhcnNlRmxvYXQoYikpPyFifHxiPT09ImF1dG8iPzA6YjphfSxjdXN0b206ZnVuY3Rpb24oYSxjLGQpe2Z1bmN0aW9uIGgoYSl7cmV0dXJuIGUuc3RlcChhKX12YXIgZT10aGlzLGc9Zi5meDt0aGlzLnN0YXJ0VGltZT1jcXx8Y3IoKSx0aGlzLmVuZD1jLHRoaXMubm93PXRoaXMuc3RhcnQ9YSx0aGlzLnBvcz10aGlzLnN0YXRlPTAsdGhpcy51bml0PWR8fHRoaXMudW5pdHx8KGYuY3NzTnVtYmVyW3RoaXMucHJvcF0/IiI6InB4IiksaC5xdWV1ZT10aGlzLm9wdGlvbnMucXVldWUsaC5lbGVtPXRoaXMuZWxlbSxoLnNhdmVTdGF0ZT1mdW5jdGlvbigpe2YuX2RhdGEoZS5lbGVtLCJmeHNob3ciK2UucHJvcCk9PT1iJiYoZS5vcHRpb25zLmhpZGU/Zi5fZGF0YShlLmVsZW0sImZ4c2hvdyIrZS5wcm9wLGUuc3RhcnQpOmUub3B0aW9ucy5zaG93JiZmLl9kYXRhKGUuZWxlbSwiZnhzaG93IitlLnByb3AsZS5lbmQpKX0saCgpJiZmLnRpbWVycy5wdXNoKGgpJiYhY28mJihjbz1zZXRJbnRlcnZhbChnLnRpY2ssZy5pbnRlcnZhbCkpfSxzaG93OmZ1bmN0aW9uKCl7dmFyIGE9Zi5fZGF0YSh0aGlzLmVsZW0sImZ4c2hvdyIrdGhpcy5wcm9wKTt0aGlzLm9wdGlvbnMub3JpZ1t0aGlzLnByb3BdPWF8fGYuc3R5bGUodGhpcy5lbGVtLHRoaXMucHJvcCksdGhpcy5vcHRpb25zLnNob3c9ITAsYSE9PWI/dGhpcy5jdXN0b20odGhpcy5jdXIoKSxhKTp0aGlzLmN1c3RvbSh0aGlzLnByb3A9PT0id2lkdGgifHx0aGlzLnByb3A9PT0iaGVpZ2h0Ij8xOjAsdGhpcy5jdXIoKSksZih0aGlzLmVsZW0pLnNob3coKX0saGlkZTpmdW5jdGlvbigpe3RoaXMub3B0aW9ucy5vcmlnW3RoaXMucHJvcF09Zi5fZGF0YSh0aGlzLmVsZW0sImZ4c2hvdyIrdGhpcy5wcm9wKXx8Zi5zdHlsZSh0aGlzLmVsZW0sdGhpcy5wcm9wKSx0aGlzLm9wdGlvbnMuaGlkZT0hMCx0aGlzLmN1c3RvbSh0aGlzLmN1cigpLDApfSxzdGVwOmZ1bmN0aW9uKGEpe3ZhciBiLGMsZCxlPWNxfHxjcigpLGc9ITAsaD10aGlzLmVsZW0saT10aGlzLm9wdGlvbnM7aWYoYXx8ZT49aS5kdXJhdGlvbit0aGlzLnN0YXJ0VGltZSl7dGhpcy5ub3c9dGhpcy5lbmQsdGhpcy5wb3M9dGhpcy5zdGF0ZT0xLHRoaXMudXBkYXRlKCksaS5hbmltYXRlZFByb3BlcnRpZXNbdGhpcy5wcm9wXT0hMDtmb3IoYiBpbiBpLmFuaW1hdGVkUHJvcGVydGllcylpLmFuaW1hdGVkUHJvcGVydGllc1tiXSE9PSEwJiYoZz0hMSk7aWYoZyl7aS5vdmVyZmxvdyE9bnVsbCYmIWYuc3VwcG9ydC5zaHJpbmtXcmFwQmxvY2tzJiZmLmVhY2goWyIiLCJYIiwiWSJdLGZ1bmN0aW9uKGEsYil7aC5zdHlsZVsib3ZlcmZsb3ciK2JdPWkub3ZlcmZsb3dbYV19KSxpLmhpZGUmJmYoaCkuaGlkZSgpO2lmKGkuaGlkZXx8aS5zaG93KWZvcihiIGluIGkuYW5pbWF0ZWRQcm9wZXJ0aWVzKWYuc3R5bGUoaCxiLGkub3JpZ1tiXSksZi5yZW1vdmVEYXRhKGgsImZ4c2hvdyIrYiwhMCksZi5yZW1vdmVEYXRhKGgsInRvZ2dsZSIrYiwhMCk7ZD1pLmNvbXBsZXRlLGQmJihpLmNvbXBsZXRlPSExLGQuY2FsbChoKSl9cmV0dXJuITF9aS5kdXJhdGlvbj09SW5maW5pdHk/dGhpcy5ub3c9ZTooYz1lLXRoaXMuc3RhcnRUaW1lLHRoaXMuc3RhdGU9Yy9pLmR1cmF0aW9uLHRoaXMucG9zPWYuZWFzaW5nW2kuYW5pbWF0ZWRQcm9wZXJ0aWVzW3RoaXMucHJvcF1dKHRoaXMuc3RhdGUsYywwLDEsaS5kdXJhdGlvbiksdGhpcy5ub3c9dGhpcy5zdGFydCsodGhpcy5lbmQtdGhpcy5zdGFydCkqdGhpcy5wb3MpLHRoaXMudXBkYXRlKCk7cmV0dXJuITB9fSxmLmV4dGVuZChmLmZ4LHt0aWNrOmZ1bmN0aW9uKCl7dmFyIGEsYj1mLnRpbWVycyxjPTA7Zm9yKDtjPGIubGVuZ3RoO2MrKylhPWJbY10sIWEoKSYmYltjXT09PWEmJmIuc3BsaWNlKGMtLSwxKTtiLmxlbmd0aHx8Zi5meC5zdG9wKCl9LGludGVydmFsOjEzLHN0b3A6ZnVuY3Rpb24oKXtjbGVhckludGVydmFsKGNvKSxjbz1udWxsfSxzcGVlZHM6e3Nsb3c6NjAwLGZhc3Q6MjAwLF9kZWZhdWx0OjQwMH0sc3RlcDp7b3BhY2l0eTpmdW5jdGlvbihhKXtmLnN0eWxlKGEuZWxlbSwib3BhY2l0eSIsYS5ub3cpfSxfZGVmYXVsdDpmdW5jdGlvbihhKXthLmVsZW0uc3R5bGUmJmEuZWxlbS5zdHlsZVthLnByb3BdIT1udWxsP2EuZWxlbS5zdHlsZVthLnByb3BdPWEubm93K2EudW5pdDphLmVsZW1bYS5wcm9wXT1hLm5vd319fSksZi5lYWNoKGNwLmNvbmNhdC5hcHBseShbXSxjcCksZnVuY3Rpb24oYSxiKXtiLmluZGV4T2YoIm1hcmdpbiIpJiYoZi5meC5zdGVwW2JdPWZ1bmN0aW9uKGEpe2Yuc3R5bGUoYS5lbGVtLGIsTWF0aC5tYXgoMCxhLm5vdykrYS51bml0KX0pfSksZi5leHByJiZmLmV4cHIuZmlsdGVycyYmKGYuZXhwci5maWx0ZXJzLmFuaW1hdGVkPWZ1bmN0aW9uKGEpe3JldHVybiBmLmdyZXAoZi50aW1lcnMsZnVuY3Rpb24oYil7cmV0dXJuIGE9PT1iLmVsZW19KS5sZW5ndGh9KTt2YXIgY3YsY3c9L150KD86YWJsZXxkfGgpJC9pLGN4PS9eKD86Ym9keXxodG1sKSQvaTsiZ2V0Qm91bmRpbmdDbGllbnRSZWN0ImluIGMuZG9jdW1lbnRFbGVtZW50P2N2PWZ1bmN0aW9uKGEsYixjLGQpe3RyeXtkPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCl9Y2F0Y2goZSl7fWlmKCFkfHwhZi5jb250YWlucyhjLGEpKXJldHVybiBkP3t0b3A6ZC50b3AsbGVmdDpkLmxlZnR9Ont0b3A6MCxsZWZ0OjB9O3ZhciBnPWIuYm9keSxoPWN5KGIpLGk9Yy5jbGllbnRUb3B8fGcuY2xpZW50VG9wfHwwLGo9Yy5jbGllbnRMZWZ0fHxnLmNsaWVudExlZnR8fDAsaz1oLnBhZ2VZT2Zmc2V0fHxmLnN1cHBvcnQuYm94TW9kZWwmJmMuc2Nyb2xsVG9wfHxnLnNjcm9sbFRvcCxsPWgucGFnZVhPZmZzZXR8fGYuc3VwcG9ydC5ib3hNb2RlbCYmYy5zY3JvbGxMZWZ0fHxnLnNjcm9sbExlZnQsbT1kLnRvcCtrLWksbj1kLmxlZnQrbC1qO3JldHVybnt0b3A6bSxsZWZ0Om59fTpjdj1mdW5jdGlvbihhLGIsYyl7dmFyIGQsZT1hLm9mZnNldFBhcmVudCxnPWEsaD1iLmJvZHksaT1iLmRlZmF1bHRWaWV3LGo9aT9pLmdldENvbXB1dGVkU3R5bGUoYSxudWxsKTphLmN1cnJlbnRTdHlsZSxrPWEub2Zmc2V0VG9wLGw9YS5vZmZzZXRMZWZ0O3doaWxlKChhPWEucGFyZW50Tm9kZSkmJmEhPT1oJiZhIT09Yyl7aWYoZi5zdXBwb3J0LmZpeGVkUG9zaXRpb24mJmoucG9zaXRpb249PT0iZml4ZWQiKWJyZWFrO2Q9aT9pLmdldENvbXB1dGVkU3R5bGUoYSxudWxsKTphLmN1cnJlbnRTdHlsZSxrLT1hLnNjcm9sbFRvcCxsLT1hLnNjcm9sbExlZnQsYT09PWUmJihrKz1hLm9mZnNldFRvcCxsKz1hLm9mZnNldExlZnQsZi5zdXBwb3J0LmRvZXNOb3RBZGRCb3JkZXImJighZi5zdXBwb3J0LmRvZXNBZGRCb3JkZXJGb3JUYWJsZUFuZENlbGxzfHwhY3cudGVzdChhLm5vZGVOYW1lKSkmJihrKz1wYXJzZUZsb2F0KGQuYm9yZGVyVG9wV2lkdGgpfHwwLGwrPXBhcnNlRmxvYXQoZC5ib3JkZXJMZWZ0V2lkdGgpfHwwKSxnPWUsZT1hLm9mZnNldFBhcmVudCksZi5zdXBwb3J0LnN1YnRyYWN0c0JvcmRlckZvck92ZXJmbG93Tm90VmlzaWJsZSYmZC5vdmVyZmxvdyE9PSJ2aXNpYmxlIiYmKGsrPXBhcnNlRmxvYXQoZC5ib3JkZXJUb3BXaWR0aCl8fDAsbCs9cGFyc2VGbG9hdChkLmJvcmRlckxlZnRXaWR0aCl8fDApLGo9ZH1pZihqLnBvc2l0aW9uPT09InJlbGF0aXZlInx8ai5wb3NpdGlvbj09PSJzdGF0aWMiKWsrPWgub2Zmc2V0VG9wLGwrPWgub2Zmc2V0TGVmdDtmLnN1cHBvcnQuZml4ZWRQb3NpdGlvbiYmai5wb3NpdGlvbj09PSJmaXhlZCImJihrKz1NYXRoLm1heChjLnNjcm9sbFRvcCxoLnNjcm9sbFRvcCksbCs9TWF0aC5tYXgoYy5zY3JvbGxMZWZ0LGguc2Nyb2xsTGVmdCkpO3JldHVybnt0b3A6ayxsZWZ0Omx9fSxmLmZuLm9mZnNldD1mdW5jdGlvbihhKXtpZihhcmd1bWVudHMubGVuZ3RoKXJldHVybiBhPT09Yj90aGlzOnRoaXMuZWFjaChmdW5jdGlvbihiKXtmLm9mZnNldC5zZXRPZmZzZXQodGhpcyxhLGIpfSk7dmFyIGM9dGhpc1swXSxkPWMmJmMub3duZXJEb2N1bWVudDtpZighZClyZXR1cm4gbnVsbDtpZihjPT09ZC5ib2R5KXJldHVybiBmLm9mZnNldC5ib2R5T2Zmc2V0KGMpO3JldHVybiBjdihjLGQsZC5kb2N1bWVudEVsZW1lbnQpfSxmLm9mZnNldD17Ym9keU9mZnNldDpmdW5jdGlvbihhKXt2YXIgYj1hLm9mZnNldFRvcCxjPWEub2Zmc2V0TGVmdDtmLnN1cHBvcnQuZG9lc05vdEluY2x1ZGVNYXJnaW5JbkJvZHlPZmZzZXQmJihiKz1wYXJzZUZsb2F0KGYuY3NzKGEsIm1hcmdpblRvcCIpKXx8MCxjKz1wYXJzZUZsb2F0KGYuY3NzKGEsIm1hcmdpbkxlZnQiKSl8fDApO3JldHVybnt0b3A6YixsZWZ0OmN9fSxzZXRPZmZzZXQ6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWYuY3NzKGEsInBvc2l0aW9uIik7ZD09PSJzdGF0aWMiJiYoYS5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiKTt2YXIgZT1mKGEpLGc9ZS5vZmZzZXQoKSxoPWYuY3NzKGEsInRvcCIpLGk9Zi5jc3MoYSwibGVmdCIpLGo9KGQ9PT0iYWJzb2x1dGUifHxkPT09ImZpeGVkIikmJmYuaW5BcnJheSgiYXV0byIsW2gsaV0pPi0xLGs9e30sbD17fSxtLG47aj8obD1lLnBvc2l0aW9uKCksbT1sLnRvcCxuPWwubGVmdCk6KG09cGFyc2VGbG9hdChoKXx8MCxuPXBhcnNlRmxvYXQoaSl8fDApLGYuaXNGdW5jdGlvbihiKSYmKGI9Yi5jYWxsKGEsYyxnKSksYi50b3AhPW51bGwmJihrLnRvcD1iLnRvcC1nLnRvcCttKSxiLmxlZnQhPW51bGwmJihrLmxlZnQ9Yi5sZWZ0LWcubGVmdCtuKSwidXNpbmciaW4gYj9iLnVzaW5nLmNhbGwoYSxrKTplLmNzcyhrKX19LGYuZm4uZXh0ZW5kKHtwb3NpdGlvbjpmdW5jdGlvbigpe2lmKCF0aGlzWzBdKXJldHVybiBudWxsO3ZhciBhPXRoaXNbMF0sYj10aGlzLm9mZnNldFBhcmVudCgpLGM9dGhpcy5vZmZzZXQoKSxkPWN4LnRlc3QoYlswXS5ub2RlTmFtZSk/e3RvcDowLGxlZnQ6MH06Yi5vZmZzZXQoKTtjLnRvcC09cGFyc2VGbG9hdChmLmNzcyhhLCJtYXJnaW5Ub3AiKSl8fDAsYy5sZWZ0LT1wYXJzZUZsb2F0KGYuY3NzKGEsIm1hcmdpbkxlZnQiKSl8fDAsZC50b3ArPXBhcnNlRmxvYXQoZi5jc3MoYlswXSwiYm9yZGVyVG9wV2lkdGgiKSl8fDAsZC5sZWZ0Kz1wYXJzZUZsb2F0KGYuY3NzKGJbMF0sImJvcmRlckxlZnRXaWR0aCIpKXx8MDtyZXR1cm57dG9wOmMudG9wLWQudG9wLGxlZnQ6Yy5sZWZ0LWQubGVmdH19LG9mZnNldFBhcmVudDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hcChmdW5jdGlvbigpe3ZhciBhPXRoaXMub2Zmc2V0UGFyZW50fHxjLmJvZHk7d2hpbGUoYSYmIWN4LnRlc3QoYS5ub2RlTmFtZSkmJmYuY3NzKGEsInBvc2l0aW9uIik9PT0ic3RhdGljIilhPWEub2Zmc2V0UGFyZW50O3JldHVybiBhfSl9fSksZi5lYWNoKHtzY3JvbGxMZWZ0OiJwYWdlWE9mZnNldCIsc2Nyb2xsVG9wOiJwYWdlWU9mZnNldCJ9LGZ1bmN0aW9uKGEsYyl7dmFyIGQ9L1kvLnRlc3QoYyk7Zi5mblthXT1mdW5jdGlvbihlKXtyZXR1cm4gZi5hY2Nlc3ModGhpcyxmdW5jdGlvbihhLGUsZyl7dmFyIGg9Y3koYSk7aWYoZz09PWIpcmV0dXJuIGg/YyBpbiBoP2hbY106Zi5zdXBwb3J0LmJveE1vZGVsJiZoLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudFtlXXx8aC5kb2N1bWVudC5ib2R5W2VdOmFbZV07aD9oLnNjcm9sbFRvKGQ/ZihoKS5zY3JvbGxMZWZ0KCk6ZyxkP2c6ZihoKS5zY3JvbGxUb3AoKSk6YVtlXT1nfSxhLGUsYXJndW1lbnRzLmxlbmd0aCxudWxsKX19KSxmLmVhY2goe0hlaWdodDoiaGVpZ2h0IixXaWR0aDoid2lkdGgifSxmdW5jdGlvbihhLGMpe3ZhciBkPSJjbGllbnQiK2EsZT0ic2Nyb2xsIithLGc9Im9mZnNldCIrYTtmLmZuWyJpbm5lciIrYV09ZnVuY3Rpb24oKXt2YXIgYT10aGlzWzBdO3JldHVybiBhP2Euc3R5bGU/cGFyc2VGbG9hdChmLmNzcyhhLGMsInBhZGRpbmciKSk6dGhpc1tjXSgpOm51bGx9LGYuZm5bIm91dGVyIithXT1mdW5jdGlvbihhKXt2YXIgYj10aGlzWzBdO3JldHVybiBiP2Iuc3R5bGU/cGFyc2VGbG9hdChmLmNzcyhiLGMsYT8ibWFyZ2luIjoiYm9yZGVyIikpOnRoaXNbY10oKTpudWxsfSxmLmZuW2NdPWZ1bmN0aW9uKGEpe3JldHVybiBmLmFjY2Vzcyh0aGlzLGZ1bmN0aW9uKGEsYyxoKXt2YXIgaSxqLGssbDtpZihmLmlzV2luZG93KGEpKXtpPWEuZG9jdW1lbnQsaj1pLmRvY3VtZW50RWxlbWVudFtkXTtyZXR1cm4gZi5zdXBwb3J0LmJveE1vZGVsJiZqfHxpLmJvZHkmJmkuYm9keVtkXXx8an1pZihhLm5vZGVUeXBlPT09OSl7aT1hLmRvY3VtZW50RWxlbWVudDtpZihpW2RdPj1pW2VdKXJldHVybiBpW2RdO3JldHVybiBNYXRoLm1heChhLmJvZHlbZV0saVtlXSxhLmJvZHlbZ10saVtnXSl9aWYoaD09PWIpe2s9Zi5jc3MoYSxjKSxsPXBhcnNlRmxvYXQoayk7cmV0dXJuIGYuaXNOdW1lcmljKGwpP2w6a31mKGEpLmNzcyhjLGgpfSxjLGEsYXJndW1lbnRzLmxlbmd0aCxudWxsKX19KSxhLmpRdWVyeT1hLiQ9Zix0eXBlb2YgZGVmaW5lPT0iZnVuY3Rpb24iJiZkZWZpbmUuYW1kJiZkZWZpbmUuYW1kLmpRdWVyeSYmZGVmaW5lKCJqcXVlcnkiLFtdLGZ1bmN0aW9uKCl7cmV0dXJuIGZ9KX0pKHdpbmRvdyk7Ci0KLS8vdGhpcmRfcGFydHkvamF2YXNjcmlwdC9qcXVlcnlfaGFzaGNoYW5nZS9qcXVlcnkuaGFzaGNoYW5nZS5qcwotLyoqCi0gKiBAbGljZW5zZQotICogalF1ZXJ5IGhhc2hjaGFuZ2UgMS4wLjAKLSAqIAotICogKGJhc2VkIG9uIGpxdWVyeS5oaXN0b3J5KQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwOCBDaHJpcyBMZWlzaG1hbiAoY2hyaXNsZWlzaG1hbi5jb20pCi0gKiBEdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgKE1JVC1MSUNFTlNFLnR4dCkKLSAqIGFuZCBHUEwgKEdQTC1MSUNFTlNFLnR4dCkgbGljZW5zZXMuCi0gKi8KLShmdW5jdGlvbigkKSB7Ci0KLSQuZm4uZXh0ZW5kKHsKLSAgICBoYXNoY2hhbmdlOiBmdW5jdGlvbihjYWxsYmFjaykgeyB0aGlzLmJpbmQoJ2hhc2hjaGFuZ2UnLCBjYWxsYmFjaykgfSwKLSAgICBvcGVuT25DbGljazogZnVuY3Rpb24oaHJlZikgewotCQlpZiAoaHJlZiA9PT0gdW5kZWZpbmVkIHx8IGhyZWYubGVuZ3RoID09IDApCi0JCQlocmVmID0gJyMnOwotCQlyZXR1cm4gdGhpcy5jbGljayhmdW5jdGlvbihldikgewotCQkJaWYgKGhyZWYgJiYgaHJlZi5jaGFyQXQoMCkgPT0gJyMnKSB7Ci0JCQkJLy8gZXhlY3V0ZSBsb2FkIGluIHNlcGFyYXRlIGNhbGwgc3RhY2sKLQkJCQl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpIHsgJC5sb2NhdGlvbkhhc2goaHJlZikgfSwgMCk7Ci0JCQl9IGVsc2UgewotCQkJCXdpbmRvdy5sb2NhdGlvbihocmVmKTsKLQkJCX0KLQkJCWV2LnN0b3BQcm9wYWdhdGlvbigpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9KTsKLSAgICB9Ci19KTsKLQotLy8gSUUgOCBpbnRyb2R1Y2VzIHRoZSBoYXNoY2hhbmdlIGV2ZW50IG5hdGl2ZWx5IC0gc28gbm90aGluZyBtb3JlIHRvIGRvCi1pZiAoJC5icm93c2VyLm1zaWUgJiYgZG9jdW1lbnQuZG9jdW1lbnRNb2RlICYmIGRvY3VtZW50LmRvY3VtZW50TW9kZSA+PSA4KSB7Ci0JJC5leHRlbmQoewotCQlsb2NhdGlvbkhhc2g6IGZ1bmN0aW9uKGhhc2gpIHsKLQkgICAgICAgIGlmICghaGFzaCkgaGFzaCA9ICcjJzsKLQkgICAgICAgIGVsc2UgaWYgKGhhc2guY2hhckF0KDApICE9ICcjJykgaGFzaCA9ICcjJyArIGhhc2g7Ci0JICAgICAgICBsb2NhdGlvbi5oYXNoID0gaGFzaDsKLQkgICAgfQotCX0pOwotCXJldHVybjsKLX0KLQotdmFyIGN1ckhhc2g7Ci0vLyBoaWRkZW4gaWZyYW1lIGZvciBJRSAoZWFybGllciB0aGFuIDgpCi12YXIgaWZyYW1lOwotCi0kLmV4dGVuZCh7Ci0JbG9jYXRpb25IYXNoOiBmdW5jdGlvbihoYXNoKSB7Ci0JCWlmIChjdXJIYXNoID09PSB1bmRlZmluZWQpIHJldHVybjsKLQotCQlpZiAoIWhhc2gpIGhhc2ggPSAnIyc7Ci0JCWVsc2UgaWYgKGhhc2guY2hhckF0KDApICE9ICcjJykgaGFzaCA9ICcjJyArIGhhc2g7Ci0JCQotCQlsb2NhdGlvbi5oYXNoID0gaGFzaDsKLQkJCi0JCWlmIChjdXJIYXNoID09IGhhc2gpIHJldHVybjsKLQkJY3VySGFzaCA9IGhhc2g7Ci0JCQotCQlpZiAoJC5icm93c2VyLm1zaWUpIHVwZGF0ZUlFRnJhbWUoaGFzaCk7Ci0JCSQuZXZlbnQudHJpZ2dlcignaGFzaGNoYW5nZScpOwotCX0KLX0pOwotCi0kKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpIHsKLSAgICBjdXJIYXNoID0gbG9jYXRpb24uaGFzaDsKLSAgICBpZiAoJC5icm93c2VyLm1zaWUpIHsKLSAgICAgICAgLy8gc3RvcCB0aGUgY2FsbGJhY2sgZmlyaW5nIHR3aWNlIGR1cmluZyBpbml0IGlmIG5vIGhhc2ggcHJlc2VudAotICAgICAgICBpZiAoY3VySGFzaCA9PSAnJykgY3VySGFzaCA9ICcjJzsKLSAgICAgICAgLy8gYWRkIGhpZGRlbiBpZnJhbWUgZm9yIElFCi0gICAgICAgIGlmcmFtZSA9ICQoJzxpZnJhbWUgLz4nKS5oaWRlKCkuZ2V0KDApOwotICAgICAgICAkKCdib2R5JykucHJlcGVuZChpZnJhbWUpOwotICAgICAgICB1cGRhdGVJRUZyYW1lKGxvY2F0aW9uLmhhc2gpOwotICAgICAgICBzZXRJbnRlcnZhbChjaGVja0hhc2hJRSwgMTAwKTsKLSAgICB9IGVsc2UgewotICAgICAgICBzZXRJbnRlcnZhbChjaGVja0hhc2gsIDEwMCk7Ci0gICAgfQotfSk7Ci0kKHdpbmRvdykudW5sb2FkKGZ1bmN0aW9uKCkgeyBpZnJhbWUgPSBudWxsIH0pOwotCi1mdW5jdGlvbiBjaGVja0hhc2goKSB7Ci0gICAgdmFyIGhhc2ggPSBsb2NhdGlvbi5oYXNoOwotICAgIGlmIChoYXNoICE9IGN1ckhhc2gpIHsKLSAgICAgICAgY3VySGFzaCA9IGhhc2g7Ci0gICAgICAgICQuZXZlbnQudHJpZ2dlcignaGFzaGNoYW5nZScpOwotICAgIH0KLX0KLQotaWYgKCQuYnJvd3Nlci5tc2llKSB7Ci0gICAgLy8gQXR0YWNoIGEgbGl2ZSBoYW5kbGVyIGZvciBhbnkgYW5jaG9yIGxpbmtzCi0gICAgJCgnYVtocmVmXj0jXScpLmxpdmUoJ2NsaWNrJywgZnVuY3Rpb24oKSB7Ci0gICAgICAgIHZhciBoYXNoID0gJCh0aGlzKS5hdHRyKCdocmVmJyk7Ci0gICAgICAgIC8vIERvbid0IGludGVyY2VwdCB0aGUgY2xpY2sgaWYgdGhlcmUgaXMgYW4gZXhpc3RpbmcgYW5jaG9yIG9uIHRoZSBwYWdlCi0gICAgICAgIC8vIHRoYXQgbWF0Y2hlcyB0aGlzIGhhc2gKLSAgICAgICAgaWYgKCQoaGFzaCkubGVuZ3RoID09IDAgJiYgJCgnYVtuYW1lPScraGFzaC5zbGljZSgxKSsnXScpLmxlbmd0aCA9PSAwKSB7Ci0gICAgICAgICAgICAkLmxvY2F0aW9uSGFzaChoYXNoKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0pOwotfQotCi1mdW5jdGlvbiBjaGVja0hhc2hJRSgpIHsKLSAgICAvLyBPbiBJRSwgY2hlY2sgZm9yIGxvY2F0aW9uLmhhc2ggb2YgaWZyYW1lCi0gICAgdmFyIGlkb2MgPSBpZnJhbWUuY29udGVudERvY3VtZW50IHx8IGlmcmFtZS5jb250ZW50V2luZG93LmRvY3VtZW50OwotICAgIHZhciBoYXNoID0gaWRvYy5sb2NhdGlvbi5oYXNoOwotICAgIGlmIChoYXNoID09ICcnKSBoYXNoID0gJyMnOwotCi0gICAgaWYgKGhhc2ggIT0gY3VySGFzaCkgewotICAgICAgICBpZiAobG9jYXRpb24uaGFzaCAhPSBoYXNoKSBsb2NhdGlvbi5oYXNoID0gaGFzaDsKLSAgICAgICAgY3VySGFzaCA9IGhhc2g7Ci0gICAgICAgICQuZXZlbnQudHJpZ2dlcignaGFzaGNoYW5nZScpOwotICAgIH0KLX0KLQotZnVuY3Rpb24gdXBkYXRlSUVGcmFtZShoYXNoKSB7Ci0gICAgaWYgKGhhc2ggPT0gJyMnKSBoYXNoID0gJyc7Ci0gICAgdmFyIGlkb2MgPSBpZnJhbWUuY29udGVudFdpbmRvdy5kb2N1bWVudDsKLSAgICBpZG9jLm9wZW4oKTsKLSAgICBpZG9jLmNsb3NlKCk7Ci0gICAgaWYgKGlkb2MubG9jYXRpb24uaGFzaCAhPSBoYXNoKSBpZG9jLmxvY2F0aW9uLmhhc2ggPSBoYXNoOwotfQotCi19KShqUXVlcnkpOwotCi0vL3RoaXJkX3BhcnR5L2phdmFzY3JpcHQvanF1ZXJ5X2pzY3JvbGxwYW5lL2pxdWVyeS5qc2Nyb2xscGFuZS5taW4uanMKLS8qCi0gKiBAbGljZW5zZQotICogalNjcm9sbFBhbmUgLSB2Mi4wLjBiZXRhMTIgLSAyMDEyLTA5LTI3Ci0gKiBodHRwOi8vanNjcm9sbHBhbmUua2VsdmlubHVjay5jb20vCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDEwIEtlbHZpbiBMdWNrCi0gKiBEdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgb3IgR1BMIGxpY2Vuc2VzLgotICovCi0oZnVuY3Rpb24oYixhLGMpe2IuZm4ualNjcm9sbFBhbmU9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gZChELE8pe3ZhciBheSxRPXRoaXMsWSxhaix2LGFsLFQsWix5LHEsYXosYUUsYXUsaSxJLGgsaixhYSxVLGFwLFgsdCxBLGFxLGFmLGFtLEcsbCxhdCxheCx4LGF2LGFILGYsTCxhaT10cnVlLFA9dHJ1ZSxhRz1mYWxzZSxrPWZhbHNlLGFvPUQuY2xvbmUoZmFsc2UsZmFsc2UpLmVtcHR5KCksYWM9Yi5mbi5td2hlZWxJbnRlbnQ/Im13aGVlbEludGVudC5qc3AiOiJtb3VzZXdoZWVsLmpzcCI7YUg9RC5jc3MoInBhZGRpbmdUb3AiKSsiICIrRC5jc3MoInBhZGRpbmdSaWdodCIpKyIgIitELmNzcygicGFkZGluZ0JvdHRvbSIpKyIgIitELmNzcygicGFkZGluZ0xlZnQiKTtmPShwYXJzZUludChELmNzcygicGFkZGluZ0xlZnQiKSwxMCl8fDApKyhwYXJzZUludChELmNzcygicGFkZGluZ1JpZ2h0IiksMTApfHwwKTtmdW5jdGlvbiBhcihhUSl7dmFyIGFMLGFOLGFNLGFKLGFJLGFQLGFPPWZhbHNlLGFLPWZhbHNlO2F5PWFRO2lmKFk9PT1jKXthST1ELnNjcm9sbFRvcCgpO2FQPUQuc2Nyb2xsTGVmdCgpO0QuY3NzKHtvdmVyZmxvdzoiaGlkZGVuIixwYWRkaW5nOjB9KTthaj1ELmlubmVyV2lkdGgoKStmO3Y9RC5pbm5lckhlaWdodCgpO0Qud2lkdGgoYWopO1k9YignPGRpdiBjbGFzcz0ianNwUGFuZSIgLz4nKS5jc3MoInBhZGRpbmciLGFIKS5hcHBlbmQoRC5jaGlsZHJlbigpKTthbD1iKCc8ZGl2IGNsYXNzPSJqc3BDb250YWluZXIiIC8+JykuY3NzKHt3aWR0aDphaisicHgiLGhlaWdodDp2KyJweCJ9KS5hcHBlbmQoWSkuYXBwZW5kVG8oRCl9ZWxzZXtELmNzcygid2lkdGgiLCIiKTthTz1heS5zdGlja1RvQm90dG9tJiZLKCk7YUs9YXkuc3RpY2tUb1JpZ2h0JiZCKCk7YUo9RC5pbm5lcldpZHRoKCkrZiE9YWp8fEQub3V0ZXJIZWlnaHQoKSE9djtpZihhSil7YWo9RC5pbm5lcldpZHRoKCkrZjt2PUQuaW5uZXJIZWlnaHQoKTthbC5jc3Moe3dpZHRoOmFqKyJweCIsaGVpZ2h0OnYrInB4In0pfWlmKCFhSiYmTD09VCYmWS5vdXRlckhlaWdodCgpPT1aKXtELndpZHRoKGFqKTtyZXR1cm59TD1UO1kuY3NzKCJ3aWR0aCIsIiIpO0Qud2lkdGgoYWopO2FsLmZpbmQoIj4uanNwVmVydGljYWxCYXIsPi5qc3BIb3Jpem9udGFsQmFyIikucmVtb3ZlKCkuZW5kKCl9WS5jc3MoIm92ZXJmbG93IiwiYXV0byIpO2lmKGFRLmNvbnRlbnRXaWR0aCl7VD1hUS5jb250ZW50V2lkdGh9ZWxzZXtUPVlbMF0uc2Nyb2xsV2lkdGh9Wj1ZWzBdLnNjcm9sbEhlaWdodDtZLmNzcygib3ZlcmZsb3ciLCIiKTt5PVQvYWo7cT1aL3Y7YXo9cT4xO2FFPXk+MTtpZighKGFFfHxheikpe0QucmVtb3ZlQ2xhc3MoImpzcFNjcm9sbGFibGUiKTtZLmNzcyh7dG9wOjAsd2lkdGg6YWwud2lkdGgoKS1mfSk7bigpO0UoKTtSKCk7dygpfWVsc2V7RC5hZGRDbGFzcygianNwU2Nyb2xsYWJsZSIpO2FMPWF5Lm1haW50YWluUG9zaXRpb24mJihJfHxhYSk7aWYoYUwpe2FOPWFDKCk7YU09YUEoKX1hRigpO3ooKTtGKCk7aWYoYUwpe04oYUs/KFQtYWopOmFOLGZhbHNlKTtNKGFPPyhaLXYpOmFNLGZhbHNlKX1KKCk7YWcoKTthbigpO2lmKGF5LmVuYWJsZUtleWJvYXJkTmF2aWdhdGlvbil7UygpfWlmKGF5LmNsaWNrT25UcmFjayl7cCgpfUMoKTtpZihheS5oaWphY2tJbnRlcm5hbExpbmtzKXttKCl9fWlmKGF5LmF1dG9SZWluaXRpYWxpc2UmJiFhdil7YXY9c2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXthcihheSl9LGF5LmF1dG9SZWluaXRpYWxpc2VEZWxheSl9ZWxzZXtpZighYXkuYXV0b1JlaW5pdGlhbGlzZSYmYXYpe2NsZWFySW50ZXJ2YWwoYXYpfX1hSSYmRC5zY3JvbGxUb3AoMCkmJk0oYUksZmFsc2UpO2FQJiZELnNjcm9sbExlZnQoMCkmJk4oYVAsZmFsc2UpO0QudHJpZ2dlcigianNwLWluaXRpYWxpc2VkIixbYUV8fGF6XSl9ZnVuY3Rpb24gYUYoKXtpZihheil7YWwuYXBwZW5kKGIoJzxkaXYgY2xhc3M9ImpzcFZlcnRpY2FsQmFyIiAvPicpLmFwcGVuZChiKCc8ZGl2IGNsYXNzPSJqc3BDYXAganNwQ2FwVG9wIiAvPicpLGIoJzxkaXYgY2xhc3M9ImpzcFRyYWNrIiAvPicpLmFwcGVuZChiKCc8ZGl2IGNsYXNzPSJqc3BEcmFnIiAvPicpLmFwcGVuZChiKCc8ZGl2IGNsYXNzPSJqc3BEcmFnVG9wIiAvPicpLGIoJzxkaXYgY2xhc3M9ImpzcERyYWdCb3R0b20iIC8+JykpKSxiKCc8ZGl2IGNsYXNzPSJqc3BDYXAganNwQ2FwQm90dG9tIiAvPicpKSk7VT1hbC5maW5kKCI+LmpzcFZlcnRpY2FsQmFyIik7YXA9VS5maW5kKCI+LmpzcFRyYWNrIik7YXU9YXAuZmluZCgiPi5qc3BEcmFnIik7aWYoYXkuc2hvd0Fycm93cyl7YXE9YignPGEgY2xhc3M9ImpzcEFycm93IGpzcEFycm93VXAiIC8+JykuYmluZCgibW91c2Vkb3duLmpzcCIsYUQoMCwtMSkpLmJpbmQoImNsaWNrLmpzcCIsYUIpO2FmPWIoJzxhIGNsYXNzPSJqc3BBcnJvdyBqc3BBcnJvd0Rvd24iIC8+JykuYmluZCgibW91c2Vkb3duLmpzcCIsYUQoMCwxKSkuYmluZCgiY2xpY2suanNwIixhQik7aWYoYXkuYXJyb3dTY3JvbGxPbkhvdmVyKXthcS5iaW5kKCJtb3VzZW92ZXIuanNwIixhRCgwLC0xLGFxKSk7YWYuYmluZCgibW91c2VvdmVyLmpzcCIsYUQoMCwxLGFmKSl9YWsoYXAsYXkudmVydGljYWxBcnJvd1Bvc2l0aW9ucyxhcSxhZil9dD12O2FsLmZpbmQoIj4uanNwVmVydGljYWxCYXI+LmpzcENhcDp2aXNpYmxlLD4uanNwVmVydGljYWxCYXI+LmpzcEFycm93IikuZWFjaChmdW5jdGlvbigpe3QtPWIodGhpcykub3V0ZXJIZWlnaHQoKX0pO2F1LmhvdmVyKGZ1bmN0aW9uKCl7YXUuYWRkQ2xhc3MoImpzcEhvdmVyIil9LGZ1bmN0aW9uKCl7YXUucmVtb3ZlQ2xhc3MoImpzcEhvdmVyIil9KS5iaW5kKCJtb3VzZWRvd24uanNwIixmdW5jdGlvbihhSSl7YigiaHRtbCIpLmJpbmQoImRyYWdzdGFydC5qc3Agc2VsZWN0c3RhcnQuanNwIixhQik7YXUuYWRkQ2xhc3MoImpzcEFjdGl2ZSIpO3ZhciBzPWFJLnBhZ2VZLWF1LnBvc2l0aW9uKCkudG9wO2IoImh0bWwiKS5iaW5kKCJtb3VzZW1vdmUuanNwIixmdW5jdGlvbihhSil7VihhSi5wYWdlWS1zLGZhbHNlKX0pLmJpbmQoIm1vdXNldXAuanNwIG1vdXNlbGVhdmUuanNwIixhdyk7cmV0dXJuIGZhbHNlfSk7bygpfX1mdW5jdGlvbiBvKCl7YXAuaGVpZ2h0KHQrInB4Iik7ST0wO1g9YXkudmVydGljYWxHdXR0ZXIrYXAub3V0ZXJXaWR0aCgpO1kud2lkdGgoYWotWC1mKTt0cnl7aWYoVS5wb3NpdGlvbigpLmxlZnQ9PT0wKXtZLmNzcygibWFyZ2luLWxlZnQiLFgrInB4Iil9fWNhdGNoKHMpe319ZnVuY3Rpb24geigpe2lmKGFFKXthbC5hcHBlbmQoYignPGRpdiBjbGFzcz0ianNwSG9yaXpvbnRhbEJhciIgLz4nKS5hcHBlbmQoYignPGRpdiBjbGFzcz0ianNwQ2FwIGpzcENhcExlZnQiIC8+JyksYignPGRpdiBjbGFzcz0ianNwVHJhY2siIC8+JykuYXBwZW5kKGIoJzxkaXYgY2xhc3M9ImpzcERyYWciIC8+JykuYXBwZW5kKGIoJzxkaXYgY2xhc3M9ImpzcERyYWdMZWZ0IiAvPicpLGIoJzxkaXYgY2xhc3M9ImpzcERyYWdSaWdodCIgLz4nKSkpLGIoJzxkaXYgY2xhc3M9ImpzcENhcCBqc3BDYXBSaWdodCIgLz4nKSkpO2FtPWFsLmZpbmQoIj4uanNwSG9yaXpvbnRhbEJhciIpO0c9YW0uZmluZCgiPi5qc3BUcmFjayIpO2g9Ry5maW5kKCI+LmpzcERyYWciKTtpZihheS5zaG93QXJyb3dzKXtheD1iKCc8YSBjbGFzcz0ianNwQXJyb3cganNwQXJyb3dMZWZ0IiAvPicpLmJpbmQoIm1vdXNlZG93bi5qc3AiLGFEKC0xLDApKS5iaW5kKCJjbGljay5qc3AiLGFCKTt4PWIoJzxhIGNsYXNzPSJqc3BBcnJvdyBqc3BBcnJvd1JpZ2h0IiAvPicpLmJpbmQoIm1vdXNlZG93bi5qc3AiLGFEKDEsMCkpLmJpbmQoImNsaWNrLmpzcCIsYUIpOwotaWYoYXkuYXJyb3dTY3JvbGxPbkhvdmVyKXtheC5iaW5kKCJtb3VzZW92ZXIuanNwIixhRCgtMSwwLGF4KSk7eC5iaW5kKCJtb3VzZW92ZXIuanNwIixhRCgxLDAseCkpfWFrKEcsYXkuaG9yaXpvbnRhbEFycm93UG9zaXRpb25zLGF4LHgpfWguaG92ZXIoZnVuY3Rpb24oKXtoLmFkZENsYXNzKCJqc3BIb3ZlciIpfSxmdW5jdGlvbigpe2gucmVtb3ZlQ2xhc3MoImpzcEhvdmVyIil9KS5iaW5kKCJtb3VzZWRvd24uanNwIixmdW5jdGlvbihhSSl7YigiaHRtbCIpLmJpbmQoImRyYWdzdGFydC5qc3Agc2VsZWN0c3RhcnQuanNwIixhQik7aC5hZGRDbGFzcygianNwQWN0aXZlIik7dmFyIHM9YUkucGFnZVgtaC5wb3NpdGlvbigpLmxlZnQ7YigiaHRtbCIpLmJpbmQoIm1vdXNlbW92ZS5qc3AiLGZ1bmN0aW9uKGFKKXtXKGFKLnBhZ2VYLXMsZmFsc2UpfSkuYmluZCgibW91c2V1cC5qc3AgbW91c2VsZWF2ZS5qc3AiLGF3KTtyZXR1cm4gZmFsc2V9KTtsPWFsLmlubmVyV2lkdGgoKTthaCgpfX1mdW5jdGlvbiBhaCgpe2FsLmZpbmQoIj4uanNwSG9yaXpvbnRhbEJhcj4uanNwQ2FwOnZpc2libGUsPi5qc3BIb3Jpem9udGFsQmFyPi5qc3BBcnJvdyIpLmVhY2goZnVuY3Rpb24oKXtsLT1iKHRoaXMpLm91dGVyV2lkdGgoKX0pO0cud2lkdGgobCsicHgiKTthYT0wfWZ1bmN0aW9uIEYoKXtpZihhRSYmYXope3ZhciBhST1HLm91dGVySGVpZ2h0KCkscz1hcC5vdXRlcldpZHRoKCk7dC09YUk7YihhbSkuZmluZCgiPi5qc3BDYXA6dmlzaWJsZSw+LmpzcEFycm93IikuZWFjaChmdW5jdGlvbigpe2wrPWIodGhpcykub3V0ZXJXaWR0aCgpfSk7bC09czt2LT1zO2FqLT1hSTtHLnBhcmVudCgpLmFwcGVuZChiKCc8ZGl2IGNsYXNzPSJqc3BDb3JuZXIiIC8+JykuY3NzKCJ3aWR0aCIsYUkrInB4IikpO28oKTthaCgpfWlmKGFFKXtZLndpZHRoKChhbC5vdXRlcldpZHRoKCktZikrInB4Iil9Wj1ZLm91dGVySGVpZ2h0KCk7cT1aL3Y7aWYoYUUpe2F0PU1hdGguY2VpbCgxL3kqbCk7aWYoYXQ+YXkuaG9yaXpvbnRhbERyYWdNYXhXaWR0aCl7YXQ9YXkuaG9yaXpvbnRhbERyYWdNYXhXaWR0aH1lbHNle2lmKGF0PGF5Lmhvcml6b250YWxEcmFnTWluV2lkdGgpe2F0PWF5Lmhvcml6b250YWxEcmFnTWluV2lkdGh9fWgud2lkdGgoYXQrInB4Iik7aj1sLWF0O2FlKGFhKX1pZihheil7QT1NYXRoLmNlaWwoMS9xKnQpO2lmKEE+YXkudmVydGljYWxEcmFnTWF4SGVpZ2h0KXtBPWF5LnZlcnRpY2FsRHJhZ01heEhlaWdodH1lbHNle2lmKEE8YXkudmVydGljYWxEcmFnTWluSGVpZ2h0KXtBPWF5LnZlcnRpY2FsRHJhZ01pbkhlaWdodH19YXUuaGVpZ2h0KEErInB4Iik7aT10LUE7YWQoSSl9fWZ1bmN0aW9uIGFrKGFKLGFMLGFJLHMpe3ZhciBhTj0iYmVmb3JlIixhSz0iYWZ0ZXIiLGFNO2lmKGFMPT0ib3MiKXthTD0vTWFjLy50ZXN0KG5hdmlnYXRvci5wbGF0Zm9ybSk/ImFmdGVyIjoic3BsaXQifWlmKGFMPT1hTil7YUs9YUx9ZWxzZXtpZihhTD09YUspe2FOPWFMO2FNPWFJO2FJPXM7cz1hTX19YUpbYU5dKGFJKVthS10ocyl9ZnVuY3Rpb24gYUQoYUkscyxhSil7cmV0dXJuIGZ1bmN0aW9uKCl7SChhSSxzLHRoaXMsYUopO3RoaXMuYmx1cigpO3JldHVybiBmYWxzZX19ZnVuY3Rpb24gSChhTCxhSyxhTyxhTil7YU89YihhTykuYWRkQ2xhc3MoImpzcEFjdGl2ZSIpO3ZhciBhTSxhSixhST10cnVlLHM9ZnVuY3Rpb24oKXtpZihhTCE9PTApe1Euc2Nyb2xsQnlYKGFMKmF5LmFycm93QnV0dG9uU3BlZWQpfWlmKGFLIT09MCl7US5zY3JvbGxCeVkoYUsqYXkuYXJyb3dCdXR0b25TcGVlZCl9YUo9c2V0VGltZW91dChzLGFJP2F5LmluaXRpYWxEZWxheTpheS5hcnJvd1JlcGVhdEZyZXEpO2FJPWZhbHNlfTtzKCk7YU09YU4/Im1vdXNlb3V0LmpzcCI6Im1vdXNldXAuanNwIjthTj1hTnx8YigiaHRtbCIpO2FOLmJpbmQoYU0sZnVuY3Rpb24oKXthTy5yZW1vdmVDbGFzcygianNwQWN0aXZlIik7YUomJmNsZWFyVGltZW91dChhSik7YUo9bnVsbDthTi51bmJpbmQoYU0pfSl9ZnVuY3Rpb24gcCgpe3coKTtpZihheil7YXAuYmluZCgibW91c2Vkb3duLmpzcCIsZnVuY3Rpb24oYU4pe2lmKGFOLm9yaWdpbmFsVGFyZ2V0PT09Y3x8YU4ub3JpZ2luYWxUYXJnZXQ9PWFOLmN1cnJlbnRUYXJnZXQpe3ZhciBhTD1iKHRoaXMpLGFPPWFMLm9mZnNldCgpLGFNPWFOLnBhZ2VZLWFPLnRvcC1JLGFKLGFJPXRydWUscz1mdW5jdGlvbigpe3ZhciBhUj1hTC5vZmZzZXQoKSxhUz1hTi5wYWdlWS1hUi50b3AtQS8yLGFQPXYqYXkuc2Nyb2xsUGFnZVBlcmNlbnQsYVE9aSphUC8oWi12KTtpZihhTTwwKXtpZihJLWFRPmFTKXtRLnNjcm9sbEJ5WSgtYVApfWVsc2V7VihhUyl9fWVsc2V7aWYoYU0+MCl7aWYoSSthUTxhUyl7US5zY3JvbGxCeVkoYVApfWVsc2V7VihhUyl9fWVsc2V7YUsoKTtyZXR1cm59fWFKPXNldFRpbWVvdXQocyxhST9heS5pbml0aWFsRGVsYXk6YXkudHJhY2tDbGlja1JlcGVhdEZyZXEpO2FJPWZhbHNlfSxhSz1mdW5jdGlvbigpe2FKJiZjbGVhclRpbWVvdXQoYUopO2FKPW51bGw7Yihkb2N1bWVudCkudW5iaW5kKCJtb3VzZXVwLmpzcCIsYUspfTtzKCk7Yihkb2N1bWVudCkuYmluZCgibW91c2V1cC5qc3AiLGFLKTtyZXR1cm4gZmFsc2V9fSl9aWYoYUUpe0cuYmluZCgibW91c2Vkb3duLmpzcCIsZnVuY3Rpb24oYU4pe2lmKGFOLm9yaWdpbmFsVGFyZ2V0PT09Y3x8YU4ub3JpZ2luYWxUYXJnZXQ9PWFOLmN1cnJlbnRUYXJnZXQpe3ZhciBhTD1iKHRoaXMpLGFPPWFMLm9mZnNldCgpLGFNPWFOLnBhZ2VYLWFPLmxlZnQtYWEsYUosYUk9dHJ1ZSxzPWZ1bmN0aW9uKCl7dmFyIGFSPWFMLm9mZnNldCgpLGFTPWFOLnBhZ2VYLWFSLmxlZnQtYXQvMixhUD1haipheS5zY3JvbGxQYWdlUGVyY2VudCxhUT1qKmFQLyhULWFqKTtpZihhTTwwKXtpZihhYS1hUT5hUyl7US5zY3JvbGxCeVgoLWFQKX1lbHNle1coYVMpfX1lbHNle2lmKGFNPjApe2lmKGFhK2FRPGFTKXtRLnNjcm9sbEJ5WChhUCl9ZWxzZXtXKGFTKX19ZWxzZXthSygpO3JldHVybn19YUo9c2V0VGltZW91dChzLGFJP2F5LmluaXRpYWxEZWxheTpheS50cmFja0NsaWNrUmVwZWF0RnJlcSk7YUk9ZmFsc2V9LGFLPWZ1bmN0aW9uKCl7YUomJmNsZWFyVGltZW91dChhSik7YUo9bnVsbDtiKGRvY3VtZW50KS51bmJpbmQoIm1vdXNldXAuanNwIixhSyl9O3MoKTtiKGRvY3VtZW50KS5iaW5kKCJtb3VzZXVwLmpzcCIsYUspO3JldHVybiBmYWxzZX19KX19ZnVuY3Rpb24gdygpe2lmKEcpe0cudW5iaW5kKCJtb3VzZWRvd24uanNwIil9aWYoYXApe2FwLnVuYmluZCgibW91c2Vkb3duLmpzcCIpfX1mdW5jdGlvbiBhdygpe2IoImh0bWwiKS51bmJpbmQoImRyYWdzdGFydC5qc3Agc2VsZWN0c3RhcnQuanNwIG1vdXNlbW92ZS5qc3AgbW91c2V1cC5qc3AgbW91c2VsZWF2ZS5qc3AiKTtpZihhdSl7YXUucmVtb3ZlQ2xhc3MoImpzcEFjdGl2ZSIpfWlmKGgpe2gucmVtb3ZlQ2xhc3MoImpzcEFjdGl2ZSIpfX1mdW5jdGlvbiBWKHMsYUkpe2lmKCFheil7cmV0dXJufWlmKHM8MCl7cz0wfWVsc2V7aWYocz5pKXtzPWl9fWlmKGFJPT09Yyl7YUk9YXkuYW5pbWF0ZVNjcm9sbH1pZihhSSl7US5hbmltYXRlKGF1LCJ0b3AiLHMsYWQpfWVsc2V7YXUuY3NzKCJ0b3AiLHMpO2FkKHMpfX1mdW5jdGlvbiBhZChhSSl7aWYoYUk9PT1jKXthST1hdS5wb3NpdGlvbigpLnRvcH1hbC5zY3JvbGxUb3AoMCk7ST1hSTt2YXIgYUw9ST09PTAsYUo9ST09aSxhSz1hSS9pLHM9LWFLKihaLXYpO2lmKGFpIT1hTHx8YUchPWFKKXthaT1hTDthRz1hSjtELnRyaWdnZXIoImpzcC1hcnJvdy1jaGFuZ2UiLFthaSxhRyxQLGtdKX11KGFMLGFKKTtZLmNzcygidG9wIixzKTtELnRyaWdnZXIoImpzcC1zY3JvbGwteSIsWy1zLGFMLGFKXSkudHJpZ2dlcigic2Nyb2xsIil9ZnVuY3Rpb24gVyhhSSxzKXtpZighYUUpe3JldHVybn1pZihhSTwwKXthST0wfWVsc2V7aWYoYUk+ail7YUk9an19aWYocz09PWMpe3M9YXkuYW5pbWF0ZVNjcm9sbH1pZihzKXtRLmFuaW1hdGUoaCwibGVmdCIsYUksYWUpCi19ZWxzZXtoLmNzcygibGVmdCIsYUkpO2FlKGFJKX19ZnVuY3Rpb24gYWUoYUkpe2lmKGFJPT09Yyl7YUk9aC5wb3NpdGlvbigpLmxlZnR9YWwuc2Nyb2xsVG9wKDApO2FhPWFJO3ZhciBhTD1hYT09PTAsYUs9YWE9PWosYUo9YUkvaixzPS1hSiooVC1haik7aWYoUCE9YUx8fGshPWFLKXtQPWFMO2s9YUs7RC50cmlnZ2VyKCJqc3AtYXJyb3ctY2hhbmdlIixbYWksYUcsUCxrXSl9cihhTCxhSyk7WS5jc3MoImxlZnQiLHMpO0QudHJpZ2dlcigianNwLXNjcm9sbC14IixbLXMsYUwsYUtdKS50cmlnZ2VyKCJzY3JvbGwiKX1mdW5jdGlvbiB1KGFJLHMpe2lmKGF5LnNob3dBcnJvd3Mpe2FxW2FJPyJhZGRDbGFzcyI6InJlbW92ZUNsYXNzIl0oImpzcERpc2FibGVkIik7YWZbcz8iYWRkQ2xhc3MiOiJyZW1vdmVDbGFzcyJdKCJqc3BEaXNhYmxlZCIpfX1mdW5jdGlvbiByKGFJLHMpe2lmKGF5LnNob3dBcnJvd3Mpe2F4W2FJPyJhZGRDbGFzcyI6InJlbW92ZUNsYXNzIl0oImpzcERpc2FibGVkIik7eFtzPyJhZGRDbGFzcyI6InJlbW92ZUNsYXNzIl0oImpzcERpc2FibGVkIil9fWZ1bmN0aW9uIE0ocyxhSSl7dmFyIGFKPXMvKFotdik7VihhSippLGFJKX1mdW5jdGlvbiBOKGFJLHMpe3ZhciBhSj1hSS8oVC1haik7VyhhSipqLHMpfWZ1bmN0aW9uIGFiKGFWLGFRLGFKKXt2YXIgYU4sYUssYUwscz0wLGFVPTAsYUksYVAsYU8sYVMsYVIsYVQ7dHJ5e2FOPWIoYVYpfWNhdGNoKGFNKXtyZXR1cm59YUs9YU4ub3V0ZXJIZWlnaHQoKTthTD1hTi5vdXRlcldpZHRoKCk7YWwuc2Nyb2xsVG9wKDApO2FsLnNjcm9sbExlZnQoMCk7d2hpbGUoIWFOLmlzKCIuanNwUGFuZSIpKXtzKz1hTi5wb3NpdGlvbigpLnRvcDthVSs9YU4ucG9zaXRpb24oKS5sZWZ0O2FOPWFOLm9mZnNldFBhcmVudCgpO2lmKC9eYm9keXxodG1sJC9pLnRlc3QoYU5bMF0ubm9kZU5hbWUpKXtyZXR1cm59fWFJPWFBKCk7YU89YUkrdjtpZihzPGFJfHxhUSl7YVI9cy1heS52ZXJ0aWNhbEd1dHRlcn1lbHNle2lmKHMrYUs+YU8pe2FSPXMtdithSytheS52ZXJ0aWNhbEd1dHRlcn19aWYoYVIpe00oYVIsYUopfWFQPWFDKCk7YVM9YVArYWo7aWYoYVU8YVB8fGFRKXthVD1hVS1heS5ob3Jpem9udGFsR3V0dGVyfWVsc2V7aWYoYVUrYUw+YVMpe2FUPWFVLWFqK2FMK2F5Lmhvcml6b250YWxHdXR0ZXJ9fWlmKGFUKXtOKGFULGFKKX19ZnVuY3Rpb24gYUMoKXtyZXR1cm4gLVkucG9zaXRpb24oKS5sZWZ0fWZ1bmN0aW9uIGFBKCl7cmV0dXJuIC1ZLnBvc2l0aW9uKCkudG9wfWZ1bmN0aW9uIEsoKXt2YXIgcz1aLXY7cmV0dXJuKHM+MjApJiYocy1hQSgpPDEwKX1mdW5jdGlvbiBCKCl7dmFyIHM9VC1hajtyZXR1cm4ocz4yMCkmJihzLWFDKCk8MTApfWZ1bmN0aW9uIGFnKCl7YWwudW5iaW5kKGFjKS5iaW5kKGFjLGZ1bmN0aW9uKGFMLGFNLGFLLGFJKXt2YXIgYUo9YWEscz1JO1Euc2Nyb2xsQnkoYUsqYXkubW91c2VXaGVlbFNwZWVkLC1hSSpheS5tb3VzZVdoZWVsU3BlZWQsZmFsc2UpO3JldHVybiBhSj09YWEmJnM9PUl9KX1mdW5jdGlvbiBuKCl7YWwudW5iaW5kKGFjKX1mdW5jdGlvbiBhQigpe3JldHVybiBmYWxzZX1mdW5jdGlvbiBKKCl7WS5maW5kKCI6aW5wdXQsYSIpLnVuYmluZCgiZm9jdXMuanNwIikuYmluZCgiZm9jdXMuanNwIixmdW5jdGlvbihzKXthYihzLnRhcmdldCxmYWxzZSl9KX1mdW5jdGlvbiBFKCl7WS5maW5kKCI6aW5wdXQsYSIpLnVuYmluZCgiZm9jdXMuanNwIil9ZnVuY3Rpb24gUygpe3ZhciBzLGFJLGFLPVtdO2FFJiZhSy5wdXNoKGFtWzBdKTtheiYmYUsucHVzaChVWzBdKTtZLmZvY3VzKGZ1bmN0aW9uKCl7RC5mb2N1cygpfSk7RC5hdHRyKCJ0YWJpbmRleCIsMCkudW5iaW5kKCJrZXlkb3duLmpzcCBrZXlwcmVzcy5qc3AiKS5iaW5kKCJrZXlkb3duLmpzcCIsZnVuY3Rpb24oYU4pe2lmKGFOLnRhcmdldCE9PXRoaXMmJiEoYUsubGVuZ3RoJiZiKGFOLnRhcmdldCkuY2xvc2VzdChhSykubGVuZ3RoKSl7cmV0dXJufXZhciBhTT1hYSxhTD1JO3N3aXRjaChhTi5rZXlDb2RlKXtjYXNlIDQwOmNhc2UgMzg6Y2FzZSAzNDpjYXNlIDMyOmNhc2UgMzM6Y2FzZSAzOTpjYXNlIDM3OnM9YU4ua2V5Q29kZTthSigpO2JyZWFrO2Nhc2UgMzU6TShaLXYpO3M9bnVsbDticmVhaztjYXNlIDM2Ok0oMCk7cz1udWxsO2JyZWFrfWFJPWFOLmtleUNvZGU9PXMmJmFNIT1hYXx8YUwhPUk7cmV0dXJuICFhSX0pLmJpbmQoImtleXByZXNzLmpzcCIsZnVuY3Rpb24oYUwpe2lmKGFMLmtleUNvZGU9PXMpe2FKKCl9cmV0dXJuICFhSX0pO2lmKGF5LmhpZGVGb2N1cyl7RC5jc3MoIm91dGxpbmUiLCJub25lIik7aWYoImhpZGVGb2N1cyIgaW4gYWxbMF0pe0QuYXR0cigiaGlkZUZvY3VzIix0cnVlKX19ZWxzZXtELmNzcygib3V0bGluZSIsIiIpO2lmKCJoaWRlRm9jdXMiIGluIGFsWzBdKXtELmF0dHIoImhpZGVGb2N1cyIsZmFsc2UpfX1mdW5jdGlvbiBhSigpe3ZhciBhTT1hYSxhTD1JO3N3aXRjaChzKXtjYXNlIDQwOlEuc2Nyb2xsQnlZKGF5LmtleWJvYXJkU3BlZWQsZmFsc2UpO2JyZWFrO2Nhc2UgMzg6US5zY3JvbGxCeVkoLWF5LmtleWJvYXJkU3BlZWQsZmFsc2UpO2JyZWFrO2Nhc2UgMzQ6Y2FzZSAzMjpRLnNjcm9sbEJ5WSh2KmF5LnNjcm9sbFBhZ2VQZXJjZW50LGZhbHNlKTticmVhaztjYXNlIDMzOlEuc2Nyb2xsQnlZKC12KmF5LnNjcm9sbFBhZ2VQZXJjZW50LGZhbHNlKTticmVhaztjYXNlIDM5OlEuc2Nyb2xsQnlYKGF5LmtleWJvYXJkU3BlZWQsZmFsc2UpO2JyZWFrO2Nhc2UgMzc6US5zY3JvbGxCeVgoLWF5LmtleWJvYXJkU3BlZWQsZmFsc2UpO2JyZWFrfWFJPWFNIT1hYXx8YUwhPUk7cmV0dXJuIGFJfX1mdW5jdGlvbiBSKCl7RC5hdHRyKCJ0YWJpbmRleCIsIi0xIikucmVtb3ZlQXR0cigidGFiaW5kZXgiKS51bmJpbmQoImtleWRvd24uanNwIGtleXByZXNzLmpzcCIpfWZ1bmN0aW9uIEMoKXtpZihsb2NhdGlvbi5oYXNoJiZsb2NhdGlvbi5oYXNoLmxlbmd0aD4xKXt2YXIgYUssYUksYUo9ZXNjYXBlKGxvY2F0aW9uLmhhc2guc3Vic3RyKDEpKTt0cnl7YUs9YigiIyIrYUorJywgYVtuYW1lPSInK2FKKyciXScpfWNhdGNoKHMpe3JldHVybn1pZihhSy5sZW5ndGgmJlkuZmluZChhSikpe2lmKGFsLnNjcm9sbFRvcCgpPT09MCl7YUk9c2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXtpZihhbC5zY3JvbGxUb3AoKT4wKXthYihhSyx0cnVlKTtiKGRvY3VtZW50KS5zY3JvbGxUb3AoYWwucG9zaXRpb24oKS50b3ApO2NsZWFySW50ZXJ2YWwoYUkpfX0sNTApfWVsc2V7YWIoYUssdHJ1ZSk7Yihkb2N1bWVudCkuc2Nyb2xsVG9wKGFsLnBvc2l0aW9uKCkudG9wKX19fX1mdW5jdGlvbiBtKCl7aWYoYihkb2N1bWVudC5ib2R5KS5kYXRhKCJqc3BIaWphY2siKSl7cmV0dXJufWIoZG9jdW1lbnQuYm9keSkuZGF0YSgianNwSGlqYWNrIix0cnVlKTtiKGRvY3VtZW50LmJvZHkpLmRlbGVnYXRlKCJhW2hyZWYqPSNdIiwiY2xpY2siLGZ1bmN0aW9uKHMpe3ZhciBhST10aGlzLmhyZWYuc3Vic3RyKDAsdGhpcy5ocmVmLmluZGV4T2YoIiMiKSksYUs9bG9jYXRpb24uaHJlZixhTyxhUCxhSixhTSxhTCxhTjtpZihsb2NhdGlvbi5ocmVmLmluZGV4T2YoIiMiKSE9PS0xKXthSz1sb2NhdGlvbi5ocmVmLnN1YnN0cigwLGxvY2F0aW9uLmhyZWYuaW5kZXhPZigiIyIpKX1pZihhSSE9PWFLKXtyZXR1cm59YU89ZXNjYXBlKHRoaXMuaHJlZi5zdWJzdHIodGhpcy5ocmVmLmluZGV4T2YoIiMiKSsxKSk7YVA7dHJ5e2FQPWIoIiMiK2FPKycsIGFbbmFtZT0iJythTysnIl0nKX1jYXRjaChhUSl7cmV0dXJufWlmKCFhUC5sZW5ndGgpe3JldHVybn1hSj1hUC5jbG9zZXN0KCIuanNwU2Nyb2xsYWJsZSIpO2FNPWFKLmRhdGEoImpzcCIpO2FNLnNjcm9sbFRvRWxlbWVudChhUCx0cnVlKTtpZihhSlswXS5zY3JvbGxJbnRvVmlldyl7YUw9YihhKS5zY3JvbGxUb3AoKTthTj1hUC5vZmZzZXQoKS50b3A7aWYoYU48YUx8fGFOPmFMK2IoYSkuaGVpZ2h0KCkpe2FKWzBdLnNjcm9sbEludG9WaWV3KCl9fXMucHJldmVudERlZmF1bHQoKQotfSl9ZnVuY3Rpb24gYW4oKXt2YXIgYUosYUksYUwsYUssYU0scz1mYWxzZTthbC51bmJpbmQoInRvdWNoc3RhcnQuanNwIHRvdWNobW92ZS5qc3AgdG91Y2hlbmQuanNwIGNsaWNrLmpzcC10b3VjaGNsaWNrIikuYmluZCgidG91Y2hzdGFydC5qc3AiLGZ1bmN0aW9uKGFOKXt2YXIgYU89YU4ub3JpZ2luYWxFdmVudC50b3VjaGVzWzBdO2FKPWFDKCk7YUk9YUEoKTthTD1hTy5wYWdlWDthSz1hTy5wYWdlWTthTT1mYWxzZTtzPXRydWV9KS5iaW5kKCJ0b3VjaG1vdmUuanNwIixmdW5jdGlvbihhUSl7aWYoIXMpe3JldHVybn12YXIgYVA9YVEub3JpZ2luYWxFdmVudC50b3VjaGVzWzBdLGFPPWFhLGFOPUk7US5zY3JvbGxUbyhhSithTC1hUC5wYWdlWCxhSSthSy1hUC5wYWdlWSk7YU09YU18fE1hdGguYWJzKGFMLWFQLnBhZ2VYKT41fHxNYXRoLmFicyhhSy1hUC5wYWdlWSk+NTtyZXR1cm4gYU89PWFhJiZhTj09SX0pLmJpbmQoInRvdWNoZW5kLmpzcCIsZnVuY3Rpb24oYU4pe3M9ZmFsc2V9KS5iaW5kKCJjbGljay5qc3AtdG91Y2hjbGljayIsZnVuY3Rpb24oYU4pe2lmKGFNKXthTT1mYWxzZTtyZXR1cm4gZmFsc2V9fSl9ZnVuY3Rpb24gZygpe3ZhciBzPWFBKCksYUk9YUMoKTtELnJlbW92ZUNsYXNzKCJqc3BTY3JvbGxhYmxlIikudW5iaW5kKCIuanNwIik7RC5yZXBsYWNlV2l0aChhby5hcHBlbmQoWS5jaGlsZHJlbigpKSk7YW8uc2Nyb2xsVG9wKHMpO2FvLnNjcm9sbExlZnQoYUkpO2lmKGF2KXtjbGVhckludGVydmFsKGF2KX19Yi5leHRlbmQoUSx7cmVpbml0aWFsaXNlOmZ1bmN0aW9uKGFJKXthST1iLmV4dGVuZCh7fSxheSxhSSk7YXIoYUkpfSxzY3JvbGxUb0VsZW1lbnQ6ZnVuY3Rpb24oYUosYUkscyl7YWIoYUosYUkscyl9LHNjcm9sbFRvOmZ1bmN0aW9uKGFKLHMsYUkpe04oYUosYUkpO00ocyxhSSl9LHNjcm9sbFRvWDpmdW5jdGlvbihhSSxzKXtOKGFJLHMpfSxzY3JvbGxUb1k6ZnVuY3Rpb24ocyxhSSl7TShzLGFJKX0sc2Nyb2xsVG9QZXJjZW50WDpmdW5jdGlvbihhSSxzKXtOKGFJKihULWFqKSxzKX0sc2Nyb2xsVG9QZXJjZW50WTpmdW5jdGlvbihhSSxzKXtNKGFJKihaLXYpLHMpfSxzY3JvbGxCeTpmdW5jdGlvbihhSSxzLGFKKXtRLnNjcm9sbEJ5WChhSSxhSik7US5zY3JvbGxCeVkocyxhSil9LHNjcm9sbEJ5WDpmdW5jdGlvbihzLGFKKXt2YXIgYUk9YUMoKStNYXRoW3M8MD8iZmxvb3IiOiJjZWlsIl0ocyksYUs9YUkvKFQtYWopO1coYUsqaixhSil9LHNjcm9sbEJ5WTpmdW5jdGlvbihzLGFKKXt2YXIgYUk9YUEoKStNYXRoW3M8MD8iZmxvb3IiOiJjZWlsIl0ocyksYUs9YUkvKFotdik7VihhSyppLGFKKX0scG9zaXRpb25EcmFnWDpmdW5jdGlvbihzLGFJKXtXKHMsYUkpfSxwb3NpdGlvbkRyYWdZOmZ1bmN0aW9uKGFJLHMpe1YoYUkscyl9LGFuaW1hdGU6ZnVuY3Rpb24oYUksYUwscyxhSyl7dmFyIGFKPXt9O2FKW2FMXT1zO2FJLmFuaW1hdGUoYUose2R1cmF0aW9uOmF5LmFuaW1hdGVEdXJhdGlvbixlYXNpbmc6YXkuYW5pbWF0ZUVhc2UscXVldWU6ZmFsc2Usc3RlcDphS30pfSxnZXRDb250ZW50UG9zaXRpb25YOmZ1bmN0aW9uKCl7cmV0dXJuIGFDKCl9LGdldENvbnRlbnRQb3NpdGlvblk6ZnVuY3Rpb24oKXtyZXR1cm4gYUEoKX0sZ2V0Q29udGVudFdpZHRoOmZ1bmN0aW9uKCl7cmV0dXJuIFR9LGdldENvbnRlbnRIZWlnaHQ6ZnVuY3Rpb24oKXtyZXR1cm4gWn0sZ2V0UGVyY2VudFNjcm9sbGVkWDpmdW5jdGlvbigpe3JldHVybiBhQygpLyhULWFqKX0sZ2V0UGVyY2VudFNjcm9sbGVkWTpmdW5jdGlvbigpe3JldHVybiBhQSgpLyhaLXYpfSxnZXRJc1Njcm9sbGFibGVIOmZ1bmN0aW9uKCl7cmV0dXJuIGFFfSxnZXRJc1Njcm9sbGFibGVWOmZ1bmN0aW9uKCl7cmV0dXJuIGF6fSxnZXRDb250ZW50UGFuZTpmdW5jdGlvbigpe3JldHVybiBZfSxzY3JvbGxUb0JvdHRvbTpmdW5jdGlvbihzKXtWKGkscyl9LGhpamFja0ludGVybmFsTGlua3M6Yi5ub29wLGRlc3Ryb3k6ZnVuY3Rpb24oKXtnKCl9fSk7YXIoTyl9ZT1iLmV4dGVuZCh7fSxiLmZuLmpTY3JvbGxQYW5lLmRlZmF1bHRzLGUpO2IuZWFjaChbIm1vdXNlV2hlZWxTcGVlZCIsImFycm93QnV0dG9uU3BlZWQiLCJ0cmFja0NsaWNrU3BlZWQiLCJrZXlib2FyZFNwZWVkIl0sZnVuY3Rpb24oKXtlW3RoaXNdPWVbdGhpc118fGUuc3BlZWR9KTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGY9Yih0aGlzKSxnPWYuZGF0YSgianNwIik7aWYoZyl7Zy5yZWluaXRpYWxpc2UoZSl9ZWxzZXtiKCJzY3JpcHQiLGYpLmZpbHRlcignW3R5cGU9InRleHQvamF2YXNjcmlwdCJdLDpub3QoW3R5cGVdKScpLnJlbW92ZSgpO2c9bmV3IGQoZixlKTtmLmRhdGEoImpzcCIsZyl9fSl9O2IuZm4ualNjcm9sbFBhbmUuZGVmYXVsdHM9e3Nob3dBcnJvd3M6ZmFsc2UsbWFpbnRhaW5Qb3NpdGlvbjp0cnVlLHN0aWNrVG9Cb3R0b206ZmFsc2Usc3RpY2tUb1JpZ2h0OmZhbHNlLGNsaWNrT25UcmFjazp0cnVlLGF1dG9SZWluaXRpYWxpc2U6ZmFsc2UsYXV0b1JlaW5pdGlhbGlzZURlbGF5OjUwMCx2ZXJ0aWNhbERyYWdNaW5IZWlnaHQ6MCx2ZXJ0aWNhbERyYWdNYXhIZWlnaHQ6OTk5OTksaG9yaXpvbnRhbERyYWdNaW5XaWR0aDowLGhvcml6b250YWxEcmFnTWF4V2lkdGg6OTk5OTksY29udGVudFdpZHRoOmMsYW5pbWF0ZVNjcm9sbDpmYWxzZSxhbmltYXRlRHVyYXRpb246MzAwLGFuaW1hdGVFYXNlOiJsaW5lYXIiLGhpamFja0ludGVybmFsTGlua3M6ZmFsc2UsdmVydGljYWxHdXR0ZXI6NCxob3Jpem9udGFsR3V0dGVyOjQsbW91c2VXaGVlbFNwZWVkOjAsYXJyb3dCdXR0b25TcGVlZDowLGFycm93UmVwZWF0RnJlcTo1MCxhcnJvd1Njcm9sbE9uSG92ZXI6ZmFsc2UsdHJhY2tDbGlja1NwZWVkOjAsdHJhY2tDbGlja1JlcGVhdEZyZXE6NzAsdmVydGljYWxBcnJvd1Bvc2l0aW9uczoic3BsaXQiLGhvcml6b250YWxBcnJvd1Bvc2l0aW9uczoic3BsaXQiLGVuYWJsZUtleWJvYXJkTmF2aWdhdGlvbjp0cnVlLGhpZGVGb2N1czpmYWxzZSxrZXlib2FyZFNwZWVkOjAsaW5pdGlhbERlbGF5OjMwMCxzcGVlZDozMCxzY3JvbGxQYWdlUGVyY2VudDowLjh9fSkoalF1ZXJ5LHRoaXMpOwotCi0vL3RoaXJkX3BhcnR5L2phdmFzY3JpcHQvanF1ZXJ5X21vdXNld2hlZWwvanF1ZXJ5Lm1vdXNld2hlZWwubWluLmpzCi0vKioKLSAqIEBsaWNlbnNlCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgQnJhbmRvbiBBYXJvbiAoaHR0cDovL2JyYW5kb25hYXJvbi5uZXQpCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UgKExJQ0VOU0UudHh0KS4KLSAqCi0gKiBUaGFua3MgdG86IGh0dHA6Ly9hZG9tYXMub3JnL2phdmFzY3JpcHQtbW91c2Utd2hlZWwvIGZvciBzb21lIHBvaW50ZXJzLgotICogVGhhbmtzIHRvOiBNYXRoaWFzIEJhbmsoaHR0cDovL3d3dy5tYXRoaWFzLWJhbmsuZGUpIGZvciBhIHNjb3BlIGJ1ZyBmaXguCi0gKiBUaGFua3MgdG86IFNlYW11cyBMZWFoeSBmb3IgYWRkaW5nIGRlbHRhWCBhbmQgZGVsdGFZCi0gKgotICogVmVyc2lvbjogMy4wLjYKLSAqIAotICogUmVxdWlyZXM6IDEuMi4yKwotICovCi0oZnVuY3Rpb24oYSl7ZnVuY3Rpb24gZChiKXt2YXIgYz1ifHx3aW5kb3cuZXZlbnQsZD1bXS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKSxlPTAsZj0hMCxnPTAsaD0wO3JldHVybiBiPWEuZXZlbnQuZml4KGMpLGIudHlwZT0ibW91c2V3aGVlbCIsYy53aGVlbERlbHRhJiYoZT1jLndoZWVsRGVsdGEvMTIwKSxjLmRldGFpbCYmKGU9LWMuZGV0YWlsLzMpLGg9ZSxjLmF4aXMhPT11bmRlZmluZWQmJmMuYXhpcz09PWMuSE9SSVpPTlRBTF9BWElTJiYoaD0wLGc9LTEqZSksYy53aGVlbERlbHRhWSE9PXVuZGVmaW5lZCYmKGg9Yy53aGVlbERlbHRhWS8xMjApLGMud2hlZWxEZWx0YVghPT11bmRlZmluZWQmJihnPS0xKmMud2hlZWxEZWx0YVgvMTIwKSxkLnVuc2hpZnQoYixlLGcsaCksKGEuZXZlbnQuZGlzcGF0Y2h8fGEuZXZlbnQuaGFuZGxlKS5hcHBseSh0aGlzLGQpfXZhciBiPVsiRE9NTW91c2VTY3JvbGwiLCJtb3VzZXdoZWVsIl07aWYoYS5ldmVudC5maXhIb29rcylmb3IodmFyIGM9Yi5sZW5ndGg7YzspYS5ldmVudC5maXhIb29rc1tiWy0tY11dPWEuZXZlbnQubW91c2VIb29rczthLmV2ZW50LnNwZWNpYWwubW91c2V3aGVlbD17c2V0dXA6ZnVuY3Rpb24oKXtpZih0aGlzLmFkZEV2ZW50TGlzdGVuZXIpZm9yKHZhciBhPWIubGVuZ3RoO2E7KXRoaXMuYWRkRXZlbnRMaXN0ZW5lcihiWy0tYV0sZCwhMSk7ZWxzZSB0aGlzLm9ubW91c2V3aGVlbD1kfSx0ZWFyZG93bjpmdW5jdGlvbigpe2lmKHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcilmb3IodmFyIGE9Yi5sZW5ndGg7YTspdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKGJbLS1hXSxkLCExKTtlbHNlIHRoaXMub25tb3VzZXdoZWVsPW51bGx9fSxhLmZuLmV4dGVuZCh7bW91c2V3aGVlbDpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLmJpbmQoIm1vdXNld2hlZWwiLGEpOnRoaXMudHJpZ2dlcigibW91c2V3aGVlbCIpfSx1bm1vdXNld2hlZWw6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMudW5iaW5kKCJtb3VzZXdoZWVsIixhKX19KX0pKGpRdWVyeSk7Ci0KLS8vdGhpcmRfcGFydHkvamF2YXNjcmlwdC9qcXVlcnlfdWkvdjFfOF8yMy9qcy9qcXVlcnktdWktMS44LjIzLmN1c3RvbS5taW4uanMKLS8qKgotICogalF1ZXJ5IFVJCi0gKiBAdmVyc2lvbiAxLjguMjMKLSAqIEBkYXRlIDIwMTItMDgtMTUKLSAqIEBsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9qcXVlcnkvanF1ZXJ5LXVpCi0gKiBJbmNsdWRlczoganF1ZXJ5LnVpLmNvcmUuanMKLSAqIENvcHlyaWdodCAyMDEyLCBBVVRIT1JTLnR4dCAoaHR0cDovL2pxdWVyeXVpLmNvbS9hYm91dCkKLSAqIEBsaWNlbnNlIE1JVCAoRHVhbCBsaWNlbnNlZCB3aXRoIEdQTCBWZXJzaW9uIDIgbGljZW5zZSkuCi0gKiBodHRwOi8vanF1ZXJ5Lm9yZy9saWNlbnNlCi0gKi8KLShmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoYixjKXt2YXIgZT1iLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7aWYoImFyZWEiPT09ZSl7dmFyIGY9Yi5wYXJlbnROb2RlLGc9Zi5uYW1lLGg7cmV0dXJuIWIuaHJlZnx8IWd8fGYubm9kZU5hbWUudG9Mb3dlckNhc2UoKSE9PSJtYXAiPyExOihoPWEoImltZ1t1c2VtYXA9IyIrZysiXSIpWzBdLCEhaCYmZChoKSl9cmV0dXJuKC9pbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9ufG9iamVjdC8udGVzdChlKT8hYi5kaXNhYmxlZDoiYSI9PWU/Yi5ocmVmfHxjOmMpJiZkKGIpfWZ1bmN0aW9uIGQoYil7cmV0dXJuIWEoYikucGFyZW50cygpLmFuZFNlbGYoKS5maWx0ZXIoZnVuY3Rpb24oKXtyZXR1cm4gYS5jdXJDU1ModGhpcywidmlzaWJpbGl0eSIpPT09ImhpZGRlbiJ8fGEuZXhwci5maWx0ZXJzLmhpZGRlbih0aGlzKX0pLmxlbmd0aH1hLnVpPWEudWl8fHt9O2lmKGEudWkudmVyc2lvbilyZXR1cm47YS5leHRlbmQoYS51aSx7dmVyc2lvbjoiMS44LjIzIixrZXlDb2RlOntBTFQ6MTgsQkFDS1NQQUNFOjgsQ0FQU19MT0NLOjIwLENPTU1BOjE4OCxDT01NQU5EOjkxLENPTU1BTkRfTEVGVDo5MSxDT01NQU5EX1JJR0hUOjkzLENPTlRST0w6MTcsREVMRVRFOjQ2LERPV046NDAsRU5EOjM1LEVOVEVSOjEzLEVTQ0FQRToyNyxIT01FOjM2LElOU0VSVDo0NSxMRUZUOjM3LE1FTlU6OTMsTlVNUEFEX0FERDoxMDcsTlVNUEFEX0RFQ0lNQUw6MTEwLE5VTVBBRF9ESVZJREU6MTExLE5VTVBBRF9FTlRFUjoxMDgsTlVNUEFEX01VTFRJUExZOjEwNixOVU1QQURfU1VCVFJBQ1Q6MTA5LFBBR0VfRE9XTjozNCxQQUdFX1VQOjMzLFBFUklPRDoxOTAsUklHSFQ6MzksU0hJRlQ6MTYsU1BBQ0U6MzIsVEFCOjksVVA6MzgsV0lORE9XUzo5MX19KSxhLmZuLmV4dGVuZCh7cHJvcEF0dHI6YS5mbi5wcm9wfHxhLmZuLmF0dHIsX2ZvY3VzOmEuZm4uZm9jdXMsZm9jdXM6ZnVuY3Rpb24oYixjKXtyZXR1cm4gdHlwZW9mIGI9PSJudW1iZXIiP3RoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBkPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe2EoZCkuZm9jdXMoKSxjJiZjLmNhbGwoZCl9LGIpfSk6dGhpcy5fZm9jdXMuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxzY3JvbGxQYXJlbnQ6ZnVuY3Rpb24oKXt2YXIgYjtyZXR1cm4gYS5icm93c2VyLm1zaWUmJi8oc3RhdGljfHJlbGF0aXZlKS8udGVzdCh0aGlzLmNzcygicG9zaXRpb24iKSl8fC9hYnNvbHV0ZS8udGVzdCh0aGlzLmNzcygicG9zaXRpb24iKSk/Yj10aGlzLnBhcmVudHMoKS5maWx0ZXIoZnVuY3Rpb24oKXtyZXR1cm4vKHJlbGF0aXZlfGFic29sdXRlfGZpeGVkKS8udGVzdChhLmN1ckNTUyh0aGlzLCJwb3NpdGlvbiIsMSkpJiYvKGF1dG98c2Nyb2xsKS8udGVzdChhLmN1ckNTUyh0aGlzLCJvdmVyZmxvdyIsMSkrYS5jdXJDU1ModGhpcywib3ZlcmZsb3cteSIsMSkrYS5jdXJDU1ModGhpcywib3ZlcmZsb3cteCIsMSkpfSkuZXEoMCk6Yj10aGlzLnBhcmVudHMoKS5maWx0ZXIoZnVuY3Rpb24oKXtyZXR1cm4vKGF1dG98c2Nyb2xsKS8udGVzdChhLmN1ckNTUyh0aGlzLCJvdmVyZmxvdyIsMSkrYS5jdXJDU1ModGhpcywib3ZlcmZsb3cteSIsMSkrYS5jdXJDU1ModGhpcywib3ZlcmZsb3cteCIsMSkpfSkuZXEoMCksL2ZpeGVkLy50ZXN0KHRoaXMuY3NzKCJwb3NpdGlvbiIpKXx8IWIubGVuZ3RoP2EoZG9jdW1lbnQpOmJ9LHpJbmRleDpmdW5jdGlvbihjKXtpZihjIT09YilyZXR1cm4gdGhpcy5jc3MoInpJbmRleCIsYyk7aWYodGhpcy5sZW5ndGgpe3ZhciBkPWEodGhpc1swXSksZSxmO3doaWxlKGQubGVuZ3RoJiZkWzBdIT09ZG9jdW1lbnQpe2U9ZC5jc3MoInBvc2l0aW9uIik7aWYoZT09PSJhYnNvbHV0ZSJ8fGU9PT0icmVsYXRpdmUifHxlPT09ImZpeGVkIil7Zj1wYXJzZUludChkLmNzcygiekluZGV4IiksMTApO2lmKCFpc05hTihmKSYmZiE9PTApcmV0dXJuIGZ9ZD1kLnBhcmVudCgpfX1yZXR1cm4gMH0sZGlzYWJsZVNlbGVjdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmJpbmQoKGEuc3VwcG9ydC5zZWxlY3RzdGFydD8ic2VsZWN0c3RhcnQiOiJtb3VzZWRvd24iKSsiLnVpLWRpc2FibGVTZWxlY3Rpb24iLGZ1bmN0aW9uKGEpe2EucHJldmVudERlZmF1bHQoKX0pfSxlbmFibGVTZWxlY3Rpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51bmJpbmQoIi51aS1kaXNhYmxlU2VsZWN0aW9uIil9fSksYSgiPGE+Iikub3V0ZXJXaWR0aCgxKS5qcXVlcnl8fGEuZWFjaChbIldpZHRoIiwiSGVpZ2h0Il0sZnVuY3Rpb24oYyxkKXtmdW5jdGlvbiBoKGIsYyxkLGYpe3JldHVybiBhLmVhY2goZSxmdW5jdGlvbigpe2MtPXBhcnNlRmxvYXQoYS5jdXJDU1MoYiwicGFkZGluZyIrdGhpcywhMCkpfHwwLGQmJihjLT1wYXJzZUZsb2F0KGEuY3VyQ1NTKGIsImJvcmRlciIrdGhpcysiV2lkdGgiLCEwKSl8fDApLGYmJihjLT1wYXJzZUZsb2F0KGEuY3VyQ1NTKGIsIm1hcmdpbiIrdGhpcywhMCkpfHwwKX0pLGN9dmFyIGU9ZD09PSJXaWR0aCI/WyJMZWZ0IiwiUmlnaHQiXTpbIlRvcCIsIkJvdHRvbSJdLGY9ZC50b0xvd2VyQ2FzZSgpLGc9e2lubmVyV2lkdGg6YS5mbi5pbm5lcldpZHRoLGlubmVySGVpZ2h0OmEuZm4uaW5uZXJIZWlnaHQsb3V0ZXJXaWR0aDphLmZuLm91dGVyV2lkdGgsb3V0ZXJIZWlnaHQ6YS5mbi5vdXRlckhlaWdodH07YS5mblsiaW5uZXIiK2RdPWZ1bmN0aW9uKGMpe3JldHVybiBjPT09Yj9nWyJpbm5lciIrZF0uY2FsbCh0aGlzKTp0aGlzLmVhY2goZnVuY3Rpb24oKXthKHRoaXMpLmNzcyhmLGgodGhpcyxjKSsicHgiKX0pfSxhLmZuWyJvdXRlciIrZF09ZnVuY3Rpb24oYixjKXtyZXR1cm4gdHlwZW9mIGIhPSJudW1iZXIiP2dbIm91dGVyIitkXS5jYWxsKHRoaXMsYik6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7YSh0aGlzKS5jc3MoZixoKHRoaXMsYiwhMCxjKSsicHgiKX0pfX0pLGEuZXh0ZW5kKGEuZXhwclsiOiJdLHtkYXRhOmEuZXhwci5jcmVhdGVQc2V1ZG8/YS5leHByLmNyZWF0ZVBzZXVkbyhmdW5jdGlvbihiKXtyZXR1cm4gZnVuY3Rpb24oYyl7cmV0dXJuISFhLmRhdGEoYyxiKX19KTpmdW5jdGlvbihiLGMsZCl7cmV0dXJuISFhLmRhdGEoYixkWzNdKX0sZm9jdXNhYmxlOmZ1bmN0aW9uKGIpe3JldHVybiBjKGIsIWlzTmFOKGEuYXR0cihiLCJ0YWJpbmRleCIpKSl9LHRhYmJhYmxlOmZ1bmN0aW9uKGIpe3ZhciBkPWEuYXR0cihiLCJ0YWJpbmRleCIpLGU9aXNOYU4oZCk7cmV0dXJuKGV8fGQ+PTApJiZjKGIsIWUpfX0pLGEoZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5ib2R5LGM9Yi5hcHBlbmRDaGlsZChjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpKTtjLm9mZnNldEhlaWdodCxhLmV4dGVuZChjLnN0eWxlLHttaW5IZWlnaHQ6IjEwMHB4IixoZWlnaHQ6ImF1dG8iLHBhZGRpbmc6MCxib3JkZXJXaWR0aDowfSksYS5zdXBwb3J0Lm1pbkhlaWdodD1jLm9mZnNldEhlaWdodD09PTEwMCxhLnN1cHBvcnQuc2VsZWN0c3RhcnQ9Im9uc2VsZWN0c3RhcnQiaW4gYyxiLnJlbW92ZUNoaWxkKGMpLnN0eWxlLmRpc3BsYXk9Im5vbmUifSksYS5jdXJDU1N8fChhLmN1ckNTUz1hLmNzcyksYS5leHRlbmQoYS51aSx7cGx1Z2luOnthZGQ6ZnVuY3Rpb24oYixjLGQpe3ZhciBlPWEudWlbYl0ucHJvdG90eXBlO2Zvcih2YXIgZiBpbiBkKWUucGx1Z2luc1tmXT1lLnBsdWdpbnNbZl18fFtdLGUucGx1Z2luc1tmXS5wdXNoKFtjLGRbZl1dKX0sY2FsbDpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9YS5wbHVnaW5zW2JdO2lmKCFkfHwhYS5lbGVtZW50WzBdLnBhcmVudE5vZGUpcmV0dXJuO2Zvcih2YXIgZT0wO2U8ZC5sZW5ndGg7ZSsrKWEub3B0aW9uc1tkW2VdWzBdXSYmZFtlXVsxXS5hcHBseShhLmVsZW1lbnQsYyl9fSxjb250YWluczpmdW5jdGlvbihhLGIpe3JldHVybiBkb2N1bWVudC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbj9hLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGIpJjE2OmEhPT1iJiZhLmNvbnRhaW5zKGIpfSxoYXNTY3JvbGw6ZnVuY3Rpb24oYixjKXtpZihhKGIpLmNzcygib3ZlcmZsb3ciKT09PSJoaWRkZW4iKXJldHVybiExO3ZhciBkPWMmJmM9PT0ibGVmdCI/InNjcm9sbExlZnQiOiJzY3JvbGxUb3AiLGU9ITE7cmV0dXJuIGJbZF0+MD8hMDooYltkXT0xLGU9YltkXT4wLGJbZF09MCxlKX0saXNPdmVyQXhpczpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGE+YiYmYTxiK2N9LGlzT3ZlcjpmdW5jdGlvbihiLGMsZCxlLGYsZyl7cmV0dXJuIGEudWkuaXNPdmVyQXhpcyhiLGQsZikmJmEudWkuaXNPdmVyQXhpcyhjLGUsZyl9fSl9KShqUXVlcnkpOzsvKiEgalF1ZXJ5IFVJIC0gdjEuOC4yMyAtIDIwMTItMDgtMTUKLSogaHR0cHM6Ly9naXRodWIuY29tL2pxdWVyeS9qcXVlcnktdWkKLSogSW5jbHVkZXM6IGpxdWVyeS51aS53aWRnZXQuanMKLSogQ29weXJpZ2h0IChjKSAyMDEyIEFVVEhPUlMudHh0OyBMaWNlbnNlZCBNSVQsIEdQTCAqLwotKGZ1bmN0aW9uKGEsYil7aWYoYS5jbGVhbkRhdGEpe3ZhciBjPWEuY2xlYW5EYXRhO2EuY2xlYW5EYXRhPWZ1bmN0aW9uKGIpe2Zvcih2YXIgZD0wLGU7KGU9YltkXSkhPW51bGw7ZCsrKXRyeXthKGUpLnRyaWdnZXJIYW5kbGVyKCJyZW1vdmUiKX1jYXRjaChmKXt9YyhiKX19ZWxzZXt2YXIgZD1hLmZuLnJlbW92ZTthLmZuLnJlbW92ZT1mdW5jdGlvbihiLGMpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtyZXR1cm4gY3x8KCFifHxhLmZpbHRlcihiLFt0aGlzXSkubGVuZ3RoKSYmYSgiKiIsdGhpcykuYWRkKFt0aGlzXSkuZWFjaChmdW5jdGlvbigpe3RyeXthKHRoaXMpLnRyaWdnZXJIYW5kbGVyKCJyZW1vdmUiKX1jYXRjaChiKXt9fSksZC5jYWxsKGEodGhpcyksYixjKX0pfX1hLndpZGdldD1mdW5jdGlvbihiLGMsZCl7dmFyIGU9Yi5zcGxpdCgiLiIpWzBdLGY7Yj1iLnNwbGl0KCIuIilbMV0sZj1lKyItIitiLGR8fChkPWMsYz1hLldpZGdldCksYS5leHByWyI6Il1bZl09ZnVuY3Rpb24oYyl7cmV0dXJuISFhLmRhdGEoYyxiKX0sYVtlXT1hW2VdfHx7fSxhW2VdW2JdPWZ1bmN0aW9uKGEsYil7YXJndW1lbnRzLmxlbmd0aCYmdGhpcy5fY3JlYXRlV2lkZ2V0KGEsYil9O3ZhciBnPW5ldyBjO2cub3B0aW9ucz1hLmV4dGVuZCghMCx7fSxnLm9wdGlvbnMpLGFbZV1bYl0ucHJvdG90eXBlPWEuZXh0ZW5kKCEwLGcse25hbWVzcGFjZTplLHdpZGdldE5hbWU6Yix3aWRnZXRFdmVudFByZWZpeDphW2VdW2JdLnByb3RvdHlwZS53aWRnZXRFdmVudFByZWZpeHx8Yix3aWRnZXRCYXNlQ2xhc3M6Zn0sZCksYS53aWRnZXQuYnJpZGdlKGIsYVtlXVtiXSl9LGEud2lkZ2V0LmJyaWRnZT1mdW5jdGlvbihjLGQpe2EuZm5bY109ZnVuY3Rpb24oZSl7dmFyIGY9dHlwZW9mIGU9PSJzdHJpbmciLGc9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpLGg9dGhpcztyZXR1cm4gZT0hZiYmZy5sZW5ndGg/YS5leHRlbmQuYXBwbHkobnVsbCxbITAsZV0uY29uY2F0KGcpKTplLGYmJmUuY2hhckF0KDApPT09Il8iP2g6KGY/dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGQ9YS5kYXRhKHRoaXMsYyksZj1kJiZhLmlzRnVuY3Rpb24oZFtlXSk/ZFtlXS5hcHBseShkLGcpOmQ7aWYoZiE9PWQmJmYhPT1iKXJldHVybiBoPWYsITF9KTp0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgYj1hLmRhdGEodGhpcyxjKTtiP2Iub3B0aW9uKGV8fHt9KS5faW5pdCgpOmEuZGF0YSh0aGlzLGMsbmV3IGQoZSx0aGlzKSl9KSxoKX19LGEuV2lkZ2V0PWZ1bmN0aW9uKGEsYil7YXJndW1lbnRzLmxlbmd0aCYmdGhpcy5fY3JlYXRlV2lkZ2V0KGEsYil9LGEuV2lkZ2V0LnByb3RvdHlwZT17d2lkZ2V0TmFtZToid2lkZ2V0Iix3aWRnZXRFdmVudFByZWZpeDoiIixvcHRpb25zOntkaXNhYmxlZDohMX0sX2NyZWF0ZVdpZGdldDpmdW5jdGlvbihiLGMpe2EuZGF0YShjLHRoaXMud2lkZ2V0TmFtZSx0aGlzKSx0aGlzLmVsZW1lbnQ9YShjKSx0aGlzLm9wdGlvbnM9YS5leHRlbmQoITAse30sdGhpcy5vcHRpb25zLHRoaXMuX2dldENyZWF0ZU9wdGlvbnMoKSxiKTt2YXIgZD10aGlzO3RoaXMuZWxlbWVudC5iaW5kKCJyZW1vdmUuIit0aGlzLndpZGdldE5hbWUsZnVuY3Rpb24oKXtkLmRlc3Ryb3koKX0pLHRoaXMuX2NyZWF0ZSgpLHRoaXMuX3RyaWdnZXIoImNyZWF0ZSIpLHRoaXMuX2luaXQoKX0sX2dldENyZWF0ZU9wdGlvbnM6ZnVuY3Rpb24oKXtyZXR1cm4gYS5tZXRhZGF0YSYmYS5tZXRhZGF0YS5nZXQodGhpcy5lbGVtZW50WzBdKVt0aGlzLndpZGdldE5hbWVdfSxfY3JlYXRlOmZ1bmN0aW9uKCl7fSxfaW5pdDpmdW5jdGlvbigpe30sZGVzdHJveTpmdW5jdGlvbigpe3RoaXMuZWxlbWVudC51bmJpbmQoIi4iK3RoaXMud2lkZ2V0TmFtZSkucmVtb3ZlRGF0YSh0aGlzLndpZGdldE5hbWUpLHRoaXMud2lkZ2V0KCkudW5iaW5kKCIuIit0aGlzLndpZGdldE5hbWUpLnJlbW92ZUF0dHIoImFyaWEtZGlzYWJsZWQiKS5yZW1vdmVDbGFzcyh0aGlzLndpZGdldEJhc2VDbGFzcysiLWRpc2FibGVkICIrInVpLXN0YXRlLWRpc2FibGVkIil9LHdpZGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVsZW1lbnR9LG9wdGlvbjpmdW5jdGlvbihjLGQpe3ZhciBlPWM7aWYoYXJndW1lbnRzLmxlbmd0aD09PTApcmV0dXJuIGEuZXh0ZW5kKHt9LHRoaXMub3B0aW9ucyk7aWYodHlwZW9mIGM9PSJzdHJpbmciKXtpZihkPT09YilyZXR1cm4gdGhpcy5vcHRpb25zW2NdO2U9e30sZVtjXT1kfXJldHVybiB0aGlzLl9zZXRPcHRpb25zKGUpLHRoaXN9LF9zZXRPcHRpb25zOmZ1bmN0aW9uKGIpe3ZhciBjPXRoaXM7cmV0dXJuIGEuZWFjaChiLGZ1bmN0aW9uKGEsYil7Yy5fc2V0T3B0aW9uKGEsYil9KSx0aGlzfSxfc2V0T3B0aW9uOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMub3B0aW9uc1thXT1iLGE9PT0iZGlzYWJsZWQiJiZ0aGlzLndpZGdldCgpW2I/ImFkZENsYXNzIjoicmVtb3ZlQ2xhc3MiXSh0aGlzLndpZGdldEJhc2VDbGFzcysiLWRpc2FibGVkIisiICIrInVpLXN0YXRlLWRpc2FibGVkIikuYXR0cigiYXJpYS1kaXNhYmxlZCIsYiksdGhpc30sZW5hYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3NldE9wdGlvbigiZGlzYWJsZWQiLCExKX0sZGlzYWJsZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9zZXRPcHRpb24oImRpc2FibGVkIiwhMCl9LF90cmlnZ2VyOmZ1bmN0aW9uKGIsYyxkKXt2YXIgZSxmLGc9dGhpcy5vcHRpb25zW2JdO2Q9ZHx8e30sYz1hLkV2ZW50KGMpLGMudHlwZT0oYj09PXRoaXMud2lkZ2V0RXZlbnRQcmVmaXg/Yjp0aGlzLndpZGdldEV2ZW50UHJlZml4K2IpLnRvTG93ZXJDYXNlKCksYy50YXJnZXQ9dGhpcy5lbGVtZW50WzBdLGY9Yy5vcmlnaW5hbEV2ZW50O2lmKGYpZm9yKGUgaW4gZillIGluIGN8fChjW2VdPWZbZV0pO3JldHVybiB0aGlzLmVsZW1lbnQudHJpZ2dlcihjLGQpLCEoYS5pc0Z1bmN0aW9uKGcpJiZnLmNhbGwodGhpcy5lbGVtZW50WzBdLGMsZCk9PT0hMXx8Yy5pc0RlZmF1bHRQcmV2ZW50ZWQoKSl9fX0pKGpRdWVyeSk7Oy8qISBqUXVlcnkgVUkgLSB2MS44LjIzIC0gMjAxMi0wOC0xNQotKiBodHRwczovL2dpdGh1Yi5jb20vanF1ZXJ5L2pxdWVyeS11aQotKiBJbmNsdWRlczoganF1ZXJ5LnVpLm1vdXNlLmpzCi0qIENvcHlyaWdodCAoYykgMjAxMiBBVVRIT1JTLnR4dDsgTGljZW5zZWQgTUlULCBHUEwgKi8KLShmdW5jdGlvbihhLGIpe3ZhciBjPSExO2EoZG9jdW1lbnQpLm1vdXNldXAoZnVuY3Rpb24oYSl7Yz0hMX0pLGEud2lkZ2V0KCJ1aS5tb3VzZSIse29wdGlvbnM6e2NhbmNlbDoiOmlucHV0LG9wdGlvbiIsZGlzdGFuY2U6MSxkZWxheTowfSxfbW91c2VJbml0OmZ1bmN0aW9uKCl7dmFyIGI9dGhpczt0aGlzLmVsZW1lbnQuYmluZCgibW91c2Vkb3duLiIrdGhpcy53aWRnZXROYW1lLGZ1bmN0aW9uKGEpe3JldHVybiBiLl9tb3VzZURvd24oYSl9KS5iaW5kKCJjbGljay4iK3RoaXMud2lkZ2V0TmFtZSxmdW5jdGlvbihjKXtpZighMD09PWEuZGF0YShjLnRhcmdldCxiLndpZGdldE5hbWUrIi5wcmV2ZW50Q2xpY2tFdmVudCIpKXJldHVybiBhLnJlbW92ZURhdGEoYy50YXJnZXQsYi53aWRnZXROYW1lKyIucHJldmVudENsaWNrRXZlbnQiKSxjLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpLCExfSksdGhpcy5zdGFydGVkPSExfSxfbW91c2VEZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy5lbGVtZW50LnVuYmluZCgiLiIrdGhpcy53aWRnZXROYW1lKSx0aGlzLl9tb3VzZU1vdmVEZWxlZ2F0ZSYmYShkb2N1bWVudCkudW5iaW5kKCJtb3VzZW1vdmUuIit0aGlzLndpZGdldE5hbWUsdGhpcy5fbW91c2VNb3ZlRGVsZWdhdGUpLnVuYmluZCgibW91c2V1cC4iK3RoaXMud2lkZ2V0TmFtZSx0aGlzLl9tb3VzZVVwRGVsZWdhdGUpfSxfbW91c2VEb3duOmZ1bmN0aW9uKGIpe2lmKGMpcmV0dXJuO3RoaXMuX21vdXNlU3RhcnRlZCYmdGhpcy5fbW91c2VVcChiKSx0aGlzLl9tb3VzZURvd25FdmVudD1iO3ZhciBkPXRoaXMsZT1iLndoaWNoPT0xLGY9dHlwZW9mIHRoaXMub3B0aW9ucy5jYW5jZWw9PSJzdHJpbmciJiZiLnRhcmdldC5ub2RlTmFtZT9hKGIudGFyZ2V0KS5jbG9zZXN0KHRoaXMub3B0aW9ucy5jYW5jZWwpLmxlbmd0aDohMTtpZighZXx8Znx8IXRoaXMuX21vdXNlQ2FwdHVyZShiKSlyZXR1cm4hMDt0aGlzLm1vdXNlRGVsYXlNZXQ9IXRoaXMub3B0aW9ucy5kZWxheSx0aGlzLm1vdXNlRGVsYXlNZXR8fCh0aGlzLl9tb3VzZURlbGF5VGltZXI9c2V0VGltZW91dChmdW5jdGlvbigpe2QubW91c2VEZWxheU1ldD0hMH0sdGhpcy5vcHRpb25zLmRlbGF5KSk7aWYodGhpcy5fbW91c2VEaXN0YW5jZU1ldChiKSYmdGhpcy5fbW91c2VEZWxheU1ldChiKSl7dGhpcy5fbW91c2VTdGFydGVkPXRoaXMuX21vdXNlU3RhcnQoYikhPT0hMTtpZighdGhpcy5fbW91c2VTdGFydGVkKXJldHVybiBiLnByZXZlbnREZWZhdWx0KCksITB9cmV0dXJuITA9PT1hLmRhdGEoYi50YXJnZXQsdGhpcy53aWRnZXROYW1lKyIucHJldmVudENsaWNrRXZlbnQiKSYmYS5yZW1vdmVEYXRhKGIudGFyZ2V0LHRoaXMud2lkZ2V0TmFtZSsiLnByZXZlbnRDbGlja0V2ZW50IiksdGhpcy5fbW91c2VNb3ZlRGVsZWdhdGU9ZnVuY3Rpb24oYSl7cmV0dXJuIGQuX21vdXNlTW92ZShhKX0sdGhpcy5fbW91c2VVcERlbGVnYXRlPWZ1bmN0aW9uKGEpe3JldHVybiBkLl9tb3VzZVVwKGEpfSxhKGRvY3VtZW50KS5iaW5kKCJtb3VzZW1vdmUuIit0aGlzLndpZGdldE5hbWUsdGhpcy5fbW91c2VNb3ZlRGVsZWdhdGUpLmJpbmQoIm1vdXNldXAuIit0aGlzLndpZGdldE5hbWUsdGhpcy5fbW91c2VVcERlbGVnYXRlKSxiLnByZXZlbnREZWZhdWx0KCksYz0hMCwhMH0sX21vdXNlTW92ZTpmdW5jdGlvbihiKXtyZXR1cm4hYS5icm93c2VyLm1zaWV8fGRvY3VtZW50LmRvY3VtZW50TW9kZT49OXx8ISFiLmJ1dHRvbj90aGlzLl9tb3VzZVN0YXJ0ZWQ/KHRoaXMuX21vdXNlRHJhZyhiKSxiLnByZXZlbnREZWZhdWx0KCkpOih0aGlzLl9tb3VzZURpc3RhbmNlTWV0KGIpJiZ0aGlzLl9tb3VzZURlbGF5TWV0KGIpJiYodGhpcy5fbW91c2VTdGFydGVkPXRoaXMuX21vdXNlU3RhcnQodGhpcy5fbW91c2VEb3duRXZlbnQsYikhPT0hMSx0aGlzLl9tb3VzZVN0YXJ0ZWQ/dGhpcy5fbW91c2VEcmFnKGIpOnRoaXMuX21vdXNlVXAoYikpLCF0aGlzLl9tb3VzZVN0YXJ0ZWQpOnRoaXMuX21vdXNlVXAoYil9LF9tb3VzZVVwOmZ1bmN0aW9uKGIpe3JldHVybiBhKGRvY3VtZW50KS51bmJpbmQoIm1vdXNlbW92ZS4iK3RoaXMud2lkZ2V0TmFtZSx0aGlzLl9tb3VzZU1vdmVEZWxlZ2F0ZSkudW5iaW5kKCJtb3VzZXVwLiIrdGhpcy53aWRnZXROYW1lLHRoaXMuX21vdXNlVXBEZWxlZ2F0ZSksdGhpcy5fbW91c2VTdGFydGVkJiYodGhpcy5fbW91c2VTdGFydGVkPSExLGIudGFyZ2V0PT10aGlzLl9tb3VzZURvd25FdmVudC50YXJnZXQmJmEuZGF0YShiLnRhcmdldCx0aGlzLndpZGdldE5hbWUrIi5wcmV2ZW50Q2xpY2tFdmVudCIsITApLHRoaXMuX21vdXNlU3RvcChiKSksITF9LF9tb3VzZURpc3RhbmNlTWV0OmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLm1heChNYXRoLmFicyh0aGlzLl9tb3VzZURvd25FdmVudC5wYWdlWC1hLnBhZ2VYKSxNYXRoLmFicyh0aGlzLl9tb3VzZURvd25FdmVudC5wYWdlWS1hLnBhZ2VZKSk+PXRoaXMub3B0aW9ucy5kaXN0YW5jZX0sX21vdXNlRGVsYXlNZXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMubW91c2VEZWxheU1ldH0sX21vdXNlU3RhcnQ6ZnVuY3Rpb24oYSl7fSxfbW91c2VEcmFnOmZ1bmN0aW9uKGEpe30sX21vdXNlU3RvcDpmdW5jdGlvbihhKXt9LF9tb3VzZUNhcHR1cmU6ZnVuY3Rpb24oYSl7cmV0dXJuITB9fSl9KShqUXVlcnkpOzsvKiEgalF1ZXJ5IFVJIC0gdjEuOC4yMyAtIDIwMTItMDgtMTUKLSogaHR0cHM6Ly9naXRodWIuY29tL2pxdWVyeS9qcXVlcnktdWkKLSogSW5jbHVkZXM6IGpxdWVyeS51aS5wb3NpdGlvbi5qcwotKiBDb3B5cmlnaHQgKGMpIDIwMTIgQVVUSE9SUy50eHQ7IExpY2Vuc2VkIE1JVCwgR1BMICovCi0oZnVuY3Rpb24oYSxiKXthLnVpPWEudWl8fHt9O3ZhciBjPS9sZWZ0fGNlbnRlcnxyaWdodC8sZD0vdG9wfGNlbnRlcnxib3R0b20vLGU9ImNlbnRlciIsZj17fSxnPWEuZm4ucG9zaXRpb24saD1hLmZuLm9mZnNldDthLmZuLnBvc2l0aW9uPWZ1bmN0aW9uKGIpe2lmKCFifHwhYi5vZilyZXR1cm4gZy5hcHBseSh0aGlzLGFyZ3VtZW50cyk7Yj1hLmV4dGVuZCh7fSxiKTt2YXIgaD1hKGIub2YpLGk9aFswXSxqPShiLmNvbGxpc2lvbnx8ImZsaXAiKS5zcGxpdCgiICIpLGs9Yi5vZmZzZXQ/Yi5vZmZzZXQuc3BsaXQoIiAiKTpbMCwwXSxsLG0sbjtyZXR1cm4gaS5ub2RlVHlwZT09PTk/KGw9aC53aWR0aCgpLG09aC5oZWlnaHQoKSxuPXt0b3A6MCxsZWZ0OjB9KTppLnNldFRpbWVvdXQ/KGw9aC53aWR0aCgpLG09aC5oZWlnaHQoKSxuPXt0b3A6aC5zY3JvbGxUb3AoKSxsZWZ0Omguc2Nyb2xsTGVmdCgpfSk6aS5wcmV2ZW50RGVmYXVsdD8oYi5hdD0ibGVmdCB0b3AiLGw9bT0wLG49e3RvcDpiLm9mLnBhZ2VZLGxlZnQ6Yi5vZi5wYWdlWH0pOihsPWgub3V0ZXJXaWR0aCgpLG09aC5vdXRlckhlaWdodCgpLG49aC5vZmZzZXQoKSksYS5lYWNoKFsibXkiLCJhdCJdLGZ1bmN0aW9uKCl7dmFyIGE9KGJbdGhpc118fCIiKS5zcGxpdCgiICIpO2EubGVuZ3RoPT09MSYmKGE9Yy50ZXN0KGFbMF0pP2EuY29uY2F0KFtlXSk6ZC50ZXN0KGFbMF0pP1tlXS5jb25jYXQoYSk6W2UsZV0pLGFbMF09Yy50ZXN0KGFbMF0pP2FbMF06ZSxhWzFdPWQudGVzdChhWzFdKT9hWzFdOmUsYlt0aGlzXT1hfSksai5sZW5ndGg9PT0xJiYoalsxXT1qWzBdKSxrWzBdPXBhcnNlSW50KGtbMF0sMTApfHwwLGsubGVuZ3RoPT09MSYmKGtbMV09a1swXSksa1sxXT1wYXJzZUludChrWzFdLDEwKXx8MCxiLmF0WzBdPT09InJpZ2h0Ij9uLmxlZnQrPWw6Yi5hdFswXT09PWUmJihuLmxlZnQrPWwvMiksYi5hdFsxXT09PSJib3R0b20iP24udG9wKz1tOmIuYXRbMV09PT1lJiYobi50b3ArPW0vMiksbi5sZWZ0Kz1rWzBdLG4udG9wKz1rWzFdLHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBjPWEodGhpcyksZD1jLm91dGVyV2lkdGgoKSxnPWMub3V0ZXJIZWlnaHQoKSxoPXBhcnNlSW50KGEuY3VyQ1NTKHRoaXMsIm1hcmdpbkxlZnQiLCEwKSl8fDAsaT1wYXJzZUludChhLmN1ckNTUyh0aGlzLCJtYXJnaW5Ub3AiLCEwKSl8fDAsbz1kK2grKHBhcnNlSW50KGEuY3VyQ1NTKHRoaXMsIm1hcmdpblJpZ2h0IiwhMCkpfHwwKSxwPWcraSsocGFyc2VJbnQoYS5jdXJDU1ModGhpcywibWFyZ2luQm90dG9tIiwhMCkpfHwwKSxxPWEuZXh0ZW5kKHt9LG4pLHI7Yi5teVswXT09PSJyaWdodCI/cS5sZWZ0LT1kOmIubXlbMF09PT1lJiYocS5sZWZ0LT1kLzIpLGIubXlbMV09PT0iYm90dG9tIj9xLnRvcC09ZzpiLm15WzFdPT09ZSYmKHEudG9wLT1nLzIpLGYuZnJhY3Rpb25zfHwocS5sZWZ0PU1hdGgucm91bmQocS5sZWZ0KSxxLnRvcD1NYXRoLnJvdW5kKHEudG9wKSkscj17bGVmdDpxLmxlZnQtaCx0b3A6cS50b3AtaX0sYS5lYWNoKFsibGVmdCIsInRvcCJdLGZ1bmN0aW9uKGMsZSl7YS51aS5wb3NpdGlvbltqW2NdXSYmYS51aS5wb3NpdGlvbltqW2NdXVtlXShxLHt0YXJnZXRXaWR0aDpsLHRhcmdldEhlaWdodDptLGVsZW1XaWR0aDpkLGVsZW1IZWlnaHQ6Zyxjb2xsaXNpb25Qb3NpdGlvbjpyLGNvbGxpc2lvbldpZHRoOm8sY29sbGlzaW9uSGVpZ2h0OnAsb2Zmc2V0OmssbXk6Yi5teSxhdDpiLmF0fSl9KSxhLmZuLmJnaWZyYW1lJiZjLmJnaWZyYW1lKCksYy5vZmZzZXQoYS5leHRlbmQocSx7dXNpbmc6Yi51c2luZ30pKX0pfSxhLnVpLnBvc2l0aW9uPXtmaXQ6e2xlZnQ6ZnVuY3Rpb24oYixjKXt2YXIgZD1hKHdpbmRvdyksZT1jLmNvbGxpc2lvblBvc2l0aW9uLmxlZnQrYy5jb2xsaXNpb25XaWR0aC1kLndpZHRoKCktZC5zY3JvbGxMZWZ0KCk7Yi5sZWZ0PWU+MD9iLmxlZnQtZTpNYXRoLm1heChiLmxlZnQtYy5jb2xsaXNpb25Qb3NpdGlvbi5sZWZ0LGIubGVmdCl9LHRvcDpmdW5jdGlvbihiLGMpe3ZhciBkPWEod2luZG93KSxlPWMuY29sbGlzaW9uUG9zaXRpb24udG9wK2MuY29sbGlzaW9uSGVpZ2h0LWQuaGVpZ2h0KCktZC5zY3JvbGxUb3AoKTtiLnRvcD1lPjA/Yi50b3AtZTpNYXRoLm1heChiLnRvcC1jLmNvbGxpc2lvblBvc2l0aW9uLnRvcCxiLnRvcCl9fSxmbGlwOntsZWZ0OmZ1bmN0aW9uKGIsYyl7aWYoYy5hdFswXT09PWUpcmV0dXJuO3ZhciBkPWEod2luZG93KSxmPWMuY29sbGlzaW9uUG9zaXRpb24ubGVmdCtjLmNvbGxpc2lvbldpZHRoLWQud2lkdGgoKS1kLnNjcm9sbExlZnQoKSxnPWMubXlbMF09PT0ibGVmdCI/LWMuZWxlbVdpZHRoOmMubXlbMF09PT0icmlnaHQiP2MuZWxlbVdpZHRoOjAsaD1jLmF0WzBdPT09ImxlZnQiP2MudGFyZ2V0V2lkdGg6LWMudGFyZ2V0V2lkdGgsaT0tMipjLm9mZnNldFswXTtiLmxlZnQrPWMuY29sbGlzaW9uUG9zaXRpb24ubGVmdDwwP2craCtpOmY+MD9nK2graTowfSx0b3A6ZnVuY3Rpb24oYixjKXtpZihjLmF0WzFdPT09ZSlyZXR1cm47dmFyIGQ9YSh3aW5kb3cpLGY9Yy5jb2xsaXNpb25Qb3NpdGlvbi50b3ArYy5jb2xsaXNpb25IZWlnaHQtZC5oZWlnaHQoKS1kLnNjcm9sbFRvcCgpLGc9Yy5teVsxXT09PSJ0b3AiPy1jLmVsZW1IZWlnaHQ6Yy5teVsxXT09PSJib3R0b20iP2MuZWxlbUhlaWdodDowLGg9Yy5hdFsxXT09PSJ0b3AiP2MudGFyZ2V0SGVpZ2h0Oi1jLnRhcmdldEhlaWdodCxpPS0yKmMub2Zmc2V0WzFdO2IudG9wKz1jLmNvbGxpc2lvblBvc2l0aW9uLnRvcDwwP2craCtpOmY+MD9nK2graTowfX19LGEub2Zmc2V0LnNldE9mZnNldHx8KGEub2Zmc2V0LnNldE9mZnNldD1mdW5jdGlvbihiLGMpey9zdGF0aWMvLnRlc3QoYS5jdXJDU1MoYiwicG9zaXRpb24iKSkmJihiLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIpO3ZhciBkPWEoYiksZT1kLm9mZnNldCgpLGY9cGFyc2VJbnQoYS5jdXJDU1MoYiwidG9wIiwhMCksMTApfHwwLGc9cGFyc2VJbnQoYS5jdXJDU1MoYiwibGVmdCIsITApLDEwKXx8MCxoPXt0b3A6Yy50b3AtZS50b3ArZixsZWZ0OmMubGVmdC1lLmxlZnQrZ307InVzaW5nImluIGM/Yy51c2luZy5jYWxsKGIsaCk6ZC5jc3MoaCl9LGEuZm4ub2Zmc2V0PWZ1bmN0aW9uKGIpe3ZhciBjPXRoaXNbMF07cmV0dXJuIWN8fCFjLm93bmVyRG9jdW1lbnQ/bnVsbDpiP2EuaXNGdW5jdGlvbihiKT90aGlzLmVhY2goZnVuY3Rpb24oYyl7YSh0aGlzKS5vZmZzZXQoYi5jYWxsKHRoaXMsYyxhKHRoaXMpLm9mZnNldCgpKSl9KTp0aGlzLmVhY2goZnVuY3Rpb24oKXthLm9mZnNldC5zZXRPZmZzZXQodGhpcyxiKX0pOmguY2FsbCh0aGlzKX0pLGEuY3VyQ1NTfHwoYS5jdXJDU1M9YS5jc3MpLGZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImJvZHkiKVswXSxjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGQsZSxnLGgsaTtkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoYj8iZGl2IjoiYm9keSIpLGc9e3Zpc2liaWxpdHk6ImhpZGRlbiIsd2lkdGg6MCxoZWlnaHQ6MCxib3JkZXI6MCxtYXJnaW46MCxiYWNrZ3JvdW5kOiJub25lIn0sYiYmYS5leHRlbmQoZyx7cG9zaXRpb246ImFic29sdXRlIixsZWZ0OiItMTAwMHB4Iix0b3A6Ii0xMDAwcHgifSk7Zm9yKHZhciBqIGluIGcpZC5zdHlsZVtqXT1nW2pdO2QuYXBwZW5kQ2hpbGQoYyksZT1ifHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsZS5pbnNlcnRCZWZvcmUoZCxlLmZpcnN0Q2hpbGQpLGMuc3R5bGUuY3NzVGV4dD0icG9zaXRpb246IGFic29sdXRlOyBsZWZ0OiAxMC43NDMyMjIycHg7IHRvcDogMTAuNDMyMzI1cHg7IGhlaWdodDogMzBweDsgd2lkdGg6IDIwMXB4OyIsaD1hKGMpLm9mZnNldChmdW5jdGlvbihhLGIpe3JldHVybiBifSkub2Zmc2V0KCksZC5pbm5lckhUTUw9IiIsZS5yZW1vdmVDaGlsZChkKSxpPWgudG9wK2gubGVmdCsoYj8yZTM6MCksZi5mcmFjdGlvbnM9aT4yMSYmaTwyMn0oKX0pKGpRdWVyeSk7Oy8qISBqUXVlcnkgVUkgLSB2MS44LjIzIC0gMjAxMi0wOC0xNQotKiBodHRwczovL2dpdGh1Yi5jb20vanF1ZXJ5L2pxdWVyeS11aQotKiBJbmNsdWRlczoganF1ZXJ5LnVpLmRyYWdnYWJsZS5qcwotKiBDb3B5cmlnaHQgKGMpIDIwMTIgQVVUSE9SUy50eHQ7IExpY2Vuc2VkIE1JVCwgR1BMICovCi0oZnVuY3Rpb24oYSxiKXthLndpZGdldCgidWkuZHJhZ2dhYmxlIixhLnVpLm1vdXNlLHt3aWRnZXRFdmVudFByZWZpeDoiZHJhZyIsb3B0aW9uczp7YWRkQ2xhc3NlczohMCxhcHBlbmRUbzoicGFyZW50IixheGlzOiExLGNvbm5lY3RUb1NvcnRhYmxlOiExLGNvbnRhaW5tZW50OiExLGN1cnNvcjoiYXV0byIsY3Vyc29yQXQ6ITEsZ3JpZDohMSxoYW5kbGU6ITEsaGVscGVyOiJvcmlnaW5hbCIsaWZyYW1lRml4OiExLG9wYWNpdHk6ITEscmVmcmVzaFBvc2l0aW9uczohMSxyZXZlcnQ6ITEscmV2ZXJ0RHVyYXRpb246NTAwLHNjb3BlOiJkZWZhdWx0IixzY3JvbGw6ITAsc2Nyb2xsU2Vuc2l0aXZpdHk6MjAsc2Nyb2xsU3BlZWQ6MjAsc25hcDohMSxzbmFwTW9kZToiYm90aCIsc25hcFRvbGVyYW5jZToyMCxzdGFjazohMSx6SW5kZXg6ITF9LF9jcmVhdGU6ZnVuY3Rpb24oKXt0aGlzLm9wdGlvbnMuaGVscGVyPT0ib3JpZ2luYWwiJiYhL14oPzpyfGF8ZikvLnRlc3QodGhpcy5lbGVtZW50LmNzcygicG9zaXRpb24iKSkmJih0aGlzLmVsZW1lbnRbMF0uc3R5bGUucG9zaXRpb249InJlbGF0aXZlIiksdGhpcy5vcHRpb25zLmFkZENsYXNzZXMmJnRoaXMuZWxlbWVudC5hZGRDbGFzcygidWktZHJhZ2dhYmxlIiksdGhpcy5vcHRpb25zLmRpc2FibGVkJiZ0aGlzLmVsZW1lbnQuYWRkQ2xhc3MoInVpLWRyYWdnYWJsZS1kaXNhYmxlZCIpLHRoaXMuX21vdXNlSW5pdCgpfSxkZXN0cm95OmZ1bmN0aW9uKCl7aWYoIXRoaXMuZWxlbWVudC5kYXRhKCJkcmFnZ2FibGUiKSlyZXR1cm47cmV0dXJuIHRoaXMuZWxlbWVudC5yZW1vdmVEYXRhKCJkcmFnZ2FibGUiKS51bmJpbmQoIi5kcmFnZ2FibGUiKS5yZW1vdmVDbGFzcygidWktZHJhZ2dhYmxlIHVpLWRyYWdnYWJsZS1kcmFnZ2luZyB1aS1kcmFnZ2FibGUtZGlzYWJsZWQiKSx0aGlzLl9tb3VzZURlc3Ryb3koKSx0aGlzfSxfbW91c2VDYXB0dXJlOmZ1bmN0aW9uKGIpe3ZhciBjPXRoaXMub3B0aW9ucztyZXR1cm4gdGhpcy5oZWxwZXJ8fGMuZGlzYWJsZWR8fGEoYi50YXJnZXQpLmlzKCIudWktcmVzaXphYmxlLWhhbmRsZSIpPyExOih0aGlzLmhhbmRsZT10aGlzLl9nZXRIYW5kbGUoYiksdGhpcy5oYW5kbGU/KGMuaWZyYW1lRml4JiZhKGMuaWZyYW1lRml4PT09ITA/ImlmcmFtZSI6Yy5pZnJhbWVGaXgpLmVhY2goZnVuY3Rpb24oKXthKCc8ZGl2IGNsYXNzPSJ1aS1kcmFnZ2FibGUtaWZyYW1lRml4IiBzdHlsZT0iYmFja2dyb3VuZDogI2ZmZjsiPjwvZGl2PicpLmNzcyh7d2lkdGg6dGhpcy5vZmZzZXRXaWR0aCsicHgiLGhlaWdodDp0aGlzLm9mZnNldEhlaWdodCsicHgiLHBvc2l0aW9uOiJhYnNvbHV0ZSIsb3BhY2l0eToiMC4wMDEiLHpJbmRleDoxZTN9KS5jc3MoYSh0aGlzKS5vZmZzZXQoKSkuYXBwZW5kVG8oImJvZHkiKX0pLCEwKTohMSl9LF9tb3VzZVN0YXJ0OmZ1bmN0aW9uKGIpe3ZhciBjPXRoaXMub3B0aW9ucztyZXR1cm4gdGhpcy5oZWxwZXI9dGhpcy5fY3JlYXRlSGVscGVyKGIpLHRoaXMuaGVscGVyLmFkZENsYXNzKCJ1aS1kcmFnZ2FibGUtZHJhZ2dpbmciKSx0aGlzLl9jYWNoZUhlbHBlclByb3BvcnRpb25zKCksYS51aS5kZG1hbmFnZXImJihhLnVpLmRkbWFuYWdlci5jdXJyZW50PXRoaXMpLHRoaXMuX2NhY2hlTWFyZ2lucygpLHRoaXMuY3NzUG9zaXRpb249dGhpcy5oZWxwZXIuY3NzKCJwb3NpdGlvbiIpLHRoaXMuc2Nyb2xsUGFyZW50PXRoaXMuaGVscGVyLnNjcm9sbFBhcmVudCgpLHRoaXMub2Zmc2V0PXRoaXMucG9zaXRpb25BYnM9dGhpcy5lbGVtZW50Lm9mZnNldCgpLHRoaXMub2Zmc2V0PXt0b3A6dGhpcy5vZmZzZXQudG9wLXRoaXMubWFyZ2lucy50b3AsbGVmdDp0aGlzLm9mZnNldC5sZWZ0LXRoaXMubWFyZ2lucy5sZWZ0fSxhLmV4dGVuZCh0aGlzLm9mZnNldCx7Y2xpY2s6e2xlZnQ6Yi5wYWdlWC10aGlzLm9mZnNldC5sZWZ0LHRvcDpiLnBhZ2VZLXRoaXMub2Zmc2V0LnRvcH0scGFyZW50OnRoaXMuX2dldFBhcmVudE9mZnNldCgpLHJlbGF0aXZlOnRoaXMuX2dldFJlbGF0aXZlT2Zmc2V0KCl9KSx0aGlzLm9yaWdpbmFsUG9zaXRpb249dGhpcy5wb3NpdGlvbj10aGlzLl9nZW5lcmF0ZVBvc2l0aW9uKGIpLHRoaXMub3JpZ2luYWxQYWdlWD1iLnBhZ2VYLHRoaXMub3JpZ2luYWxQYWdlWT1iLnBhZ2VZLGMuY3Vyc29yQXQmJnRoaXMuX2FkanVzdE9mZnNldEZyb21IZWxwZXIoYy5jdXJzb3JBdCksYy5jb250YWlubWVudCYmdGhpcy5fc2V0Q29udGFpbm1lbnQoKSx0aGlzLl90cmlnZ2VyKCJzdGFydCIsYik9PT0hMT8odGhpcy5fY2xlYXIoKSwhMSk6KHRoaXMuX2NhY2hlSGVscGVyUHJvcG9ydGlvbnMoKSxhLnVpLmRkbWFuYWdlciYmIWMuZHJvcEJlaGF2aW91ciYmYS51aS5kZG1hbmFnZXIucHJlcGFyZU9mZnNldHModGhpcyxiKSx0aGlzLl9tb3VzZURyYWcoYiwhMCksYS51aS5kZG1hbmFnZXImJmEudWkuZGRtYW5hZ2VyLmRyYWdTdGFydCh0aGlzLGIpLCEwKX0sX21vdXNlRHJhZzpmdW5jdGlvbihiLGMpe3RoaXMucG9zaXRpb249dGhpcy5fZ2VuZXJhdGVQb3NpdGlvbihiKSx0aGlzLnBvc2l0aW9uQWJzPXRoaXMuX2NvbnZlcnRQb3NpdGlvblRvKCJhYnNvbHV0ZSIpO2lmKCFjKXt2YXIgZD10aGlzLl91aUhhc2goKTtpZih0aGlzLl90cmlnZ2VyKCJkcmFnIixiLGQpPT09ITEpcmV0dXJuIHRoaXMuX21vdXNlVXAoe30pLCExO3RoaXMucG9zaXRpb249ZC5wb3NpdGlvbn1pZighdGhpcy5vcHRpb25zLmF4aXN8fHRoaXMub3B0aW9ucy5heGlzIT0ieSIpdGhpcy5oZWxwZXJbMF0uc3R5bGUubGVmdD10aGlzLnBvc2l0aW9uLmxlZnQrInB4IjtpZighdGhpcy5vcHRpb25zLmF4aXN8fHRoaXMub3B0aW9ucy5heGlzIT0ieCIpdGhpcy5oZWxwZXJbMF0uc3R5bGUudG9wPXRoaXMucG9zaXRpb24udG9wKyJweCI7cmV0dXJuIGEudWkuZGRtYW5hZ2VyJiZhLnVpLmRkbWFuYWdlci5kcmFnKHRoaXMsYiksITF9LF9tb3VzZVN0b3A6ZnVuY3Rpb24oYil7dmFyIGM9ITE7YS51aS5kZG1hbmFnZXImJiF0aGlzLm9wdGlvbnMuZHJvcEJlaGF2aW91ciYmKGM9YS51aS5kZG1hbmFnZXIuZHJvcCh0aGlzLGIpKSx0aGlzLmRyb3BwZWQmJihjPXRoaXMuZHJvcHBlZCx0aGlzLmRyb3BwZWQ9ITEpO3ZhciBkPXRoaXMuZWxlbWVudFswXSxlPSExO3doaWxlKGQmJihkPWQucGFyZW50Tm9kZSkpZD09ZG9jdW1lbnQmJihlPSEwKTtpZighZSYmdGhpcy5vcHRpb25zLmhlbHBlcj09PSJvcmlnaW5hbCIpcmV0dXJuITE7aWYodGhpcy5vcHRpb25zLnJldmVydD09ImludmFsaWQiJiYhY3x8dGhpcy5vcHRpb25zLnJldmVydD09InZhbGlkIiYmY3x8dGhpcy5vcHRpb25zLnJldmVydD09PSEwfHxhLmlzRnVuY3Rpb24odGhpcy5vcHRpb25zLnJldmVydCkmJnRoaXMub3B0aW9ucy5yZXZlcnQuY2FsbCh0aGlzLmVsZW1lbnQsYykpe3ZhciBmPXRoaXM7YSh0aGlzLmhlbHBlcikuYW5pbWF0ZSh0aGlzLm9yaWdpbmFsUG9zaXRpb24scGFyc2VJbnQodGhpcy5vcHRpb25zLnJldmVydER1cmF0aW9uLDEwKSxmdW5jdGlvbigpe2YuX3RyaWdnZXIoInN0b3AiLGIpIT09ITEmJmYuX2NsZWFyKCl9KX1lbHNlIHRoaXMuX3RyaWdnZXIoInN0b3AiLGIpIT09ITEmJnRoaXMuX2NsZWFyKCk7cmV0dXJuITF9LF9tb3VzZVVwOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLm9wdGlvbnMuaWZyYW1lRml4PT09ITAmJmEoImRpdi51aS1kcmFnZ2FibGUtaWZyYW1lRml4IikuZWFjaChmdW5jdGlvbigpe3RoaXMucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzKX0pLGEudWkuZGRtYW5hZ2VyJiZhLnVpLmRkbWFuYWdlci5kcmFnU3RvcCh0aGlzLGIpLGEudWkubW91c2UucHJvdG90eXBlLl9tb3VzZVVwLmNhbGwodGhpcyxiKX0sY2FuY2VsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaGVscGVyLmlzKCIudWktZHJhZ2dhYmxlLWRyYWdnaW5nIik/dGhpcy5fbW91c2VVcCh7fSk6dGhpcy5fY2xlYXIoKSx0aGlzfSxfZ2V0SGFuZGxlOmZ1bmN0aW9uKGIpe3ZhciBjPSF0aGlzLm9wdGlvbnMuaGFuZGxlfHwhYSh0aGlzLm9wdGlvbnMuaGFuZGxlLHRoaXMuZWxlbWVudCkubGVuZ3RoPyEwOiExO3JldHVybiBhKHRoaXMub3B0aW9ucy5oYW5kbGUsdGhpcy5lbGVtZW50KS5maW5kKCIqIikuYW5kU2VsZigpLmVhY2goZnVuY3Rpb24oKXt0aGlzPT1iLnRhcmdldCYmKGM9ITApfSksY30sX2NyZWF0ZUhlbHBlcjpmdW5jdGlvbihiKXt2YXIgYz10aGlzLm9wdGlvbnMsZD1hLmlzRnVuY3Rpb24oYy5oZWxwZXIpP2EoYy5oZWxwZXIuYXBwbHkodGhpcy5lbGVtZW50WzBdLFtiXSkpOmMuaGVscGVyPT0iY2xvbmUiP3RoaXMuZWxlbWVudC5jbG9uZSgpLnJlbW92ZUF0dHIoImlkIik6dGhpcy5lbGVtZW50O3JldHVybiBkLnBhcmVudHMoImJvZHkiKS5sZW5ndGh8fGQuYXBwZW5kVG8oYy5hcHBlbmRUbz09InBhcmVudCI/dGhpcy5lbGVtZW50WzBdLnBhcmVudE5vZGU6Yy5hcHBlbmRUbyksZFswXSE9dGhpcy5lbGVtZW50WzBdJiYhLyhmaXhlZHxhYnNvbHV0ZSkvLnRlc3QoZC5jc3MoInBvc2l0aW9uIikpJiZkLmNzcygicG9zaXRpb24iLCJhYnNvbHV0ZSIpLGR9LF9hZGp1c3RPZmZzZXRGcm9tSGVscGVyOmZ1bmN0aW9uKGIpe3R5cGVvZiBiPT0ic3RyaW5nIiYmKGI9Yi5zcGxpdCgiICIpKSxhLmlzQXJyYXkoYikmJihiPXtsZWZ0OitiWzBdLHRvcDorYlsxXXx8MH0pLCJsZWZ0ImluIGImJih0aGlzLm9mZnNldC5jbGljay5sZWZ0PWIubGVmdCt0aGlzLm1hcmdpbnMubGVmdCksInJpZ2h0ImluIGImJih0aGlzLm9mZnNldC5jbGljay5sZWZ0PXRoaXMuaGVscGVyUHJvcG9ydGlvbnMud2lkdGgtYi5yaWdodCt0aGlzLm1hcmdpbnMubGVmdCksInRvcCJpbiBiJiYodGhpcy5vZmZzZXQuY2xpY2sudG9wPWIudG9wK3RoaXMubWFyZ2lucy50b3ApLCJib3R0b20iaW4gYiYmKHRoaXMub2Zmc2V0LmNsaWNrLnRvcD10aGlzLmhlbHBlclByb3BvcnRpb25zLmhlaWdodC1iLmJvdHRvbSt0aGlzLm1hcmdpbnMudG9wKX0sX2dldFBhcmVudE9mZnNldDpmdW5jdGlvbigpe3RoaXMub2Zmc2V0UGFyZW50PXRoaXMuaGVscGVyLm9mZnNldFBhcmVudCgpO3ZhciBiPXRoaXMub2Zmc2V0UGFyZW50Lm9mZnNldCgpO3RoaXMuY3NzUG9zaXRpb249PSJhYnNvbHV0ZSImJnRoaXMuc2Nyb2xsUGFyZW50WzBdIT1kb2N1bWVudCYmYS51aS5jb250YWlucyh0aGlzLnNjcm9sbFBhcmVudFswXSx0aGlzLm9mZnNldFBhcmVudFswXSkmJihiLmxlZnQrPXRoaXMuc2Nyb2xsUGFyZW50LnNjcm9sbExlZnQoKSxiLnRvcCs9dGhpcy5zY3JvbGxQYXJlbnQuc2Nyb2xsVG9wKCkpO2lmKHRoaXMub2Zmc2V0UGFyZW50WzBdPT1kb2N1bWVudC5ib2R5fHx0aGlzLm9mZnNldFBhcmVudFswXS50YWdOYW1lJiZ0aGlzLm9mZnNldFBhcmVudFswXS50YWdOYW1lLnRvTG93ZXJDYXNlKCk9PSJodG1sIiYmYS5icm93c2VyLm1zaWUpYj17dG9wOjAsbGVmdDowfTtyZXR1cm57dG9wOmIudG9wKyhwYXJzZUludCh0aGlzLm9mZnNldFBhcmVudC5jc3MoImJvcmRlclRvcFdpZHRoIiksMTApfHwwKSxsZWZ0OmIubGVmdCsocGFyc2VJbnQodGhpcy5vZmZzZXRQYXJlbnQuY3NzKCJib3JkZXJMZWZ0V2lkdGgiKSwxMCl8fDApfX0sX2dldFJlbGF0aXZlT2Zmc2V0OmZ1bmN0aW9uKCl7aWYodGhpcy5jc3NQb3NpdGlvbj09InJlbGF0aXZlIil7dmFyIGE9dGhpcy5lbGVtZW50LnBvc2l0aW9uKCk7cmV0dXJue3RvcDphLnRvcC0ocGFyc2VJbnQodGhpcy5oZWxwZXIuY3NzKCJ0b3AiKSwxMCl8fDApK3RoaXMuc2Nyb2xsUGFyZW50LnNjcm9sbFRvcCgpLGxlZnQ6YS5sZWZ0LShwYXJzZUludCh0aGlzLmhlbHBlci5jc3MoImxlZnQiKSwxMCl8fDApK3RoaXMuc2Nyb2xsUGFyZW50LnNjcm9sbExlZnQoKX19cmV0dXJue3RvcDowLGxlZnQ6MH19LF9jYWNoZU1hcmdpbnM6ZnVuY3Rpb24oKXt0aGlzLm1hcmdpbnM9e2xlZnQ6cGFyc2VJbnQodGhpcy5lbGVtZW50LmNzcygibWFyZ2luTGVmdCIpLDEwKXx8MCx0b3A6cGFyc2VJbnQodGhpcy5lbGVtZW50LmNzcygibWFyZ2luVG9wIiksMTApfHwwLHJpZ2h0OnBhcnNlSW50KHRoaXMuZWxlbWVudC5jc3MoIm1hcmdpblJpZ2h0IiksMTApfHwwLGJvdHRvbTpwYXJzZUludCh0aGlzLmVsZW1lbnQuY3NzKCJtYXJnaW5Cb3R0b20iKSwxMCl8fDB9fSxfY2FjaGVIZWxwZXJQcm9wb3J0aW9uczpmdW5jdGlvbigpe3RoaXMuaGVscGVyUHJvcG9ydGlvbnM9e3dpZHRoOnRoaXMuaGVscGVyLm91dGVyV2lkdGgoKSxoZWlnaHQ6dGhpcy5oZWxwZXIub3V0ZXJIZWlnaHQoKX19LF9zZXRDb250YWlubWVudDpmdW5jdGlvbigpe3ZhciBiPXRoaXMub3B0aW9ucztiLmNvbnRhaW5tZW50PT0icGFyZW50IiYmKGIuY29udGFpbm1lbnQ9dGhpcy5oZWxwZXJbMF0ucGFyZW50Tm9kZSk7aWYoYi5jb250YWlubWVudD09ImRvY3VtZW50Inx8Yi5jb250YWlubWVudD09IndpbmRvdyIpdGhpcy5jb250YWlubWVudD1bYi5jb250YWlubWVudD09ImRvY3VtZW50Ij8wOmEod2luZG93KS5zY3JvbGxMZWZ0KCktdGhpcy5vZmZzZXQucmVsYXRpdmUubGVmdC10aGlzLm9mZnNldC5wYXJlbnQubGVmdCxiLmNvbnRhaW5tZW50PT0iZG9jdW1lbnQiPzA6YSh3aW5kb3cpLnNjcm9sbFRvcCgpLXRoaXMub2Zmc2V0LnJlbGF0aXZlLnRvcC10aGlzLm9mZnNldC5wYXJlbnQudG9wLChiLmNvbnRhaW5tZW50PT0iZG9jdW1lbnQiPzA6YSh3aW5kb3cpLnNjcm9sbExlZnQoKSkrYShiLmNvbnRhaW5tZW50PT0iZG9jdW1lbnQiP2RvY3VtZW50OndpbmRvdykud2lkdGgoKS10aGlzLmhlbHBlclByb3BvcnRpb25zLndpZHRoLXRoaXMubWFyZ2lucy5sZWZ0LChiLmNvbnRhaW5tZW50PT0iZG9jdW1lbnQiPzA6YSh3aW5kb3cpLnNjcm9sbFRvcCgpKSsoYShiLmNvbnRhaW5tZW50PT0iZG9jdW1lbnQiP2RvY3VtZW50OndpbmRvdykuaGVpZ2h0KCl8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZS5zY3JvbGxIZWlnaHQpLXRoaXMuaGVscGVyUHJvcG9ydGlvbnMuaGVpZ2h0LXRoaXMubWFyZ2lucy50b3BdO2lmKCEvXihkb2N1bWVudHx3aW5kb3d8cGFyZW50KSQvLnRlc3QoYi5jb250YWlubWVudCkmJmIuY29udGFpbm1lbnQuY29uc3RydWN0b3IhPUFycmF5KXt2YXIgYz1hKGIuY29udGFpbm1lbnQpLGQ9Y1swXTtpZighZClyZXR1cm47dmFyIGU9Yy5vZmZzZXQoKSxmPWEoZCkuY3NzKCJvdmVyZmxvdyIpIT0iaGlkZGVuIjt0aGlzLmNvbnRhaW5tZW50PVsocGFyc2VJbnQoYShkKS5jc3MoImJvcmRlckxlZnRXaWR0aCIpLDEwKXx8MCkrKHBhcnNlSW50KGEoZCkuY3NzKCJwYWRkaW5nTGVmdCIpLDEwKXx8MCksKHBhcnNlSW50KGEoZCkuY3NzKCJib3JkZXJUb3BXaWR0aCIpLDEwKXx8MCkrKHBhcnNlSW50KGEoZCkuY3NzKCJwYWRkaW5nVG9wIiksMTApfHwwKSwoZj9NYXRoLm1heChkLnNjcm9sbFdpZHRoLGQub2Zmc2V0V2lkdGgpOmQub2Zmc2V0V2lkdGgpLShwYXJzZUludChhKGQpLmNzcygiYm9yZGVyTGVmdFdpZHRoIiksMTApfHwwKS0ocGFyc2VJbnQoYShkKS5jc3MoInBhZGRpbmdSaWdodCIpLDEwKXx8MCktdGhpcy5oZWxwZXJQcm9wb3J0aW9ucy53aWR0aC10aGlzLm1hcmdpbnMubGVmdC10aGlzLm1hcmdpbnMucmlnaHQsKGY/TWF0aC5tYXgoZC5zY3JvbGxIZWlnaHQsZC5vZmZzZXRIZWlnaHQpOmQub2Zmc2V0SGVpZ2h0KS0ocGFyc2VJbnQoYShkKS5jc3MoImJvcmRlclRvcFdpZHRoIiksMTApfHwwKS0ocGFyc2VJbnQoYShkKS5jc3MoInBhZGRpbmdCb3R0b20iKSwxMCl8fDApLXRoaXMuaGVscGVyUHJvcG9ydGlvbnMuaGVpZ2h0LXRoaXMubWFyZ2lucy50b3AtdGhpcy5tYXJnaW5zLmJvdHRvbV0sdGhpcy5yZWxhdGl2ZV9jb250YWluZXI9Y31lbHNlIGIuY29udGFpbm1lbnQuY29uc3RydWN0b3I9PUFycmF5JiYodGhpcy5jb250YWlubWVudD1iLmNvbnRhaW5tZW50KX0sX2NvbnZlcnRQb3NpdGlvblRvOmZ1bmN0aW9uKGIsYyl7Y3x8KGM9dGhpcy5wb3NpdGlvbik7dmFyIGQ9Yj09ImFic29sdXRlIj8xOi0xLGU9dGhpcy5vcHRpb25zLGY9dGhpcy5jc3NQb3NpdGlvbj09ImFic29sdXRlIiYmKHRoaXMuc2Nyb2xsUGFyZW50WzBdPT1kb2N1bWVudHx8IWEudWkuY29udGFpbnModGhpcy5zY3JvbGxQYXJlbnRbMF0sdGhpcy5vZmZzZXRQYXJlbnRbMF0pKT90aGlzLm9mZnNldFBhcmVudDp0aGlzLnNjcm9sbFBhcmVudCxnPS8oaHRtbHxib2R5KS9pLnRlc3QoZlswXS50YWdOYW1lKTtyZXR1cm57dG9wOmMudG9wK3RoaXMub2Zmc2V0LnJlbGF0aXZlLnRvcCpkK3RoaXMub2Zmc2V0LnBhcmVudC50b3AqZC0oYS5icm93c2VyLnNhZmFyaSYmYS5icm93c2VyLnZlcnNpb248NTI2JiZ0aGlzLmNzc1Bvc2l0aW9uPT0iZml4ZWQiPzA6KHRoaXMuY3NzUG9zaXRpb249PSJmaXhlZCI/LXRoaXMuc2Nyb2xsUGFyZW50LnNjcm9sbFRvcCgpOmc/MDpmLnNjcm9sbFRvcCgpKSpkKSxsZWZ0OmMubGVmdCt0aGlzLm9mZnNldC5yZWxhdGl2ZS5sZWZ0KmQrdGhpcy5vZmZzZXQucGFyZW50LmxlZnQqZC0oYS5icm93c2VyLnNhZmFyaSYmYS5icm93c2VyLnZlcnNpb248NTI2JiZ0aGlzLmNzc1Bvc2l0aW9uPT0iZml4ZWQiPzA6KHRoaXMuY3NzUG9zaXRpb249PSJmaXhlZCI/LXRoaXMuc2Nyb2xsUGFyZW50LnNjcm9sbExlZnQoKTpnPzA6Zi5zY3JvbGxMZWZ0KCkpKmQpfX0sX2dlbmVyYXRlUG9zaXRpb246ZnVuY3Rpb24oYil7dmFyIGM9dGhpcy5vcHRpb25zLGQ9dGhpcy5jc3NQb3NpdGlvbj09ImFic29sdXRlIiYmKHRoaXMuc2Nyb2xsUGFyZW50WzBdPT1kb2N1bWVudHx8IWEudWkuY29udGFpbnModGhpcy5zY3JvbGxQYXJlbnRbMF0sdGhpcy5vZmZzZXRQYXJlbnRbMF0pKT90aGlzLm9mZnNldFBhcmVudDp0aGlzLnNjcm9sbFBhcmVudCxlPS8oaHRtbHxib2R5KS9pLnRlc3QoZFswXS50YWdOYW1lKSxmPWIucGFnZVgsZz1iLnBhZ2VZO2lmKHRoaXMub3JpZ2luYWxQb3NpdGlvbil7dmFyIGg7aWYodGhpcy5jb250YWlubWVudCl7aWYodGhpcy5yZWxhdGl2ZV9jb250YWluZXIpe3ZhciBpPXRoaXMucmVsYXRpdmVfY29udGFpbmVyLm9mZnNldCgpO2g9W3RoaXMuY29udGFpbm1lbnRbMF0raS5sZWZ0LHRoaXMuY29udGFpbm1lbnRbMV0raS50b3AsdGhpcy5jb250YWlubWVudFsyXStpLmxlZnQsdGhpcy5jb250YWlubWVudFszXStpLnRvcF19ZWxzZSBoPXRoaXMuY29udGFpbm1lbnQ7Yi5wYWdlWC10aGlzLm9mZnNldC5jbGljay5sZWZ0PGhbMF0mJihmPWhbMF0rdGhpcy5vZmZzZXQuY2xpY2subGVmdCksYi5wYWdlWS10aGlzLm9mZnNldC5jbGljay50b3A8aFsxXSYmKGc9aFsxXSt0aGlzLm9mZnNldC5jbGljay50b3ApLGIucGFnZVgtdGhpcy5vZmZzZXQuY2xpY2subGVmdD5oWzJdJiYoZj1oWzJdK3RoaXMub2Zmc2V0LmNsaWNrLmxlZnQpLGIucGFnZVktdGhpcy5vZmZzZXQuY2xpY2sudG9wPmhbM10mJihnPWhbM10rdGhpcy5vZmZzZXQuY2xpY2sudG9wKX1pZihjLmdyaWQpe3ZhciBqPWMuZ3JpZFsxXT90aGlzLm9yaWdpbmFsUGFnZVkrTWF0aC5yb3VuZCgoZy10aGlzLm9yaWdpbmFsUGFnZVkpL2MuZ3JpZFsxXSkqYy5ncmlkWzFdOnRoaXMub3JpZ2luYWxQYWdlWTtnPWg/ai10aGlzLm9mZnNldC5jbGljay50b3A8aFsxXXx8ai10aGlzLm9mZnNldC5jbGljay50b3A+aFszXT9qLXRoaXMub2Zmc2V0LmNsaWNrLnRvcDxoWzFdP2orYy5ncmlkWzFdOmotYy5ncmlkWzFdOmo6ajt2YXIgaz1jLmdyaWRbMF0/dGhpcy5vcmlnaW5hbFBhZ2VYK01hdGgucm91bmQoKGYtdGhpcy5vcmlnaW5hbFBhZ2VYKS9jLmdyaWRbMF0pKmMuZ3JpZFswXTp0aGlzLm9yaWdpbmFsUGFnZVg7Zj1oP2stdGhpcy5vZmZzZXQuY2xpY2subGVmdDxoWzBdfHxrLXRoaXMub2Zmc2V0LmNsaWNrLmxlZnQ+aFsyXT9rLXRoaXMub2Zmc2V0LmNsaWNrLmxlZnQ8aFswXT9rK2MuZ3JpZFswXTprLWMuZ3JpZFswXTprOmt9fXJldHVybnt0b3A6Zy10aGlzLm9mZnNldC5jbGljay50b3AtdGhpcy5vZmZzZXQucmVsYXRpdmUudG9wLXRoaXMub2Zmc2V0LnBhcmVudC50b3ArKGEuYnJvd3Nlci5zYWZhcmkmJmEuYnJvd3Nlci52ZXJzaW9uPDUyNiYmdGhpcy5jc3NQb3NpdGlvbj09ImZpeGVkIj8wOnRoaXMuY3NzUG9zaXRpb249PSJmaXhlZCI/LXRoaXMuc2Nyb2xsUGFyZW50LnNjcm9sbFRvcCgpOmU/MDpkLnNjcm9sbFRvcCgpKSxsZWZ0OmYtdGhpcy5vZmZzZXQuY2xpY2subGVmdC10aGlzLm9mZnNldC5yZWxhdGl2ZS5sZWZ0LXRoaXMub2Zmc2V0LnBhcmVudC5sZWZ0KyhhLmJyb3dzZXIuc2FmYXJpJiZhLmJyb3dzZXIudmVyc2lvbjw1MjYmJnRoaXMuY3NzUG9zaXRpb249PSJmaXhlZCI/MDp0aGlzLmNzc1Bvc2l0aW9uPT0iZml4ZWQiPy10aGlzLnNjcm9sbFBhcmVudC5zY3JvbGxMZWZ0KCk6ZT8wOmQuc2Nyb2xsTGVmdCgpKX19LF9jbGVhcjpmdW5jdGlvbigpe3RoaXMuaGVscGVyLnJlbW92ZUNsYXNzKCJ1aS1kcmFnZ2FibGUtZHJhZ2dpbmciKSx0aGlzLmhlbHBlclswXSE9dGhpcy5lbGVtZW50WzBdJiYhdGhpcy5jYW5jZWxIZWxwZXJSZW1vdmFsJiZ0aGlzLmhlbHBlci5yZW1vdmUoKSx0aGlzLmhlbHBlcj1udWxsLHRoaXMuY2FuY2VsSGVscGVyUmVtb3ZhbD0hMX0sX3RyaWdnZXI6ZnVuY3Rpb24oYixjLGQpe3JldHVybiBkPWR8fHRoaXMuX3VpSGFzaCgpLGEudWkucGx1Z2luLmNhbGwodGhpcyxiLFtjLGRdKSxiPT0iZHJhZyImJih0aGlzLnBvc2l0aW9uQWJzPXRoaXMuX2NvbnZlcnRQb3NpdGlvblRvKCJhYnNvbHV0ZSIpKSxhLldpZGdldC5wcm90b3R5cGUuX3RyaWdnZXIuY2FsbCh0aGlzLGIsYyxkKX0scGx1Z2luczp7fSxfdWlIYXNoOmZ1bmN0aW9uKGEpe3JldHVybntoZWxwZXI6dGhpcy5oZWxwZXIscG9zaXRpb246dGhpcy5wb3NpdGlvbixvcmlnaW5hbFBvc2l0aW9uOnRoaXMub3JpZ2luYWxQb3NpdGlvbixvZmZzZXQ6dGhpcy5wb3NpdGlvbkFic319fSksYS5leHRlbmQoYS51aS5kcmFnZ2FibGUse3ZlcnNpb246IjEuOC4yMyJ9KSxhLnVpLnBsdWdpbi5hZGQoImRyYWdnYWJsZSIsImNvbm5lY3RUb1NvcnRhYmxlIix7c3RhcnQ6ZnVuY3Rpb24oYixjKXt2YXIgZD1hKHRoaXMpLmRhdGEoImRyYWdnYWJsZSIpLGU9ZC5vcHRpb25zLGY9YS5leHRlbmQoe30sYyx7aXRlbTpkLmVsZW1lbnR9KTtkLnNvcnRhYmxlcz1bXSxhKGUuY29ubmVjdFRvU29ydGFibGUpLmVhY2goZnVuY3Rpb24oKXt2YXIgYz1hLmRhdGEodGhpcywic29ydGFibGUiKTtjJiYhYy5vcHRpb25zLmRpc2FibGVkJiYoZC5zb3J0YWJsZXMucHVzaCh7aW5zdGFuY2U6YyxzaG91bGRSZXZlcnQ6Yy5vcHRpb25zLnJldmVydH0pLGMucmVmcmVzaFBvc2l0aW9ucygpLGMuX3RyaWdnZXIoImFjdGl2YXRlIixiLGYpKX0pfSxzdG9wOmZ1bmN0aW9uKGIsYyl7dmFyIGQ9YSh0aGlzKS5kYXRhKCJkcmFnZ2FibGUiKSxlPWEuZXh0ZW5kKHt9LGMse2l0ZW06ZC5lbGVtZW50fSk7YS5lYWNoKGQuc29ydGFibGVzLGZ1bmN0aW9uKCl7dGhpcy5pbnN0YW5jZS5pc092ZXI/KHRoaXMuaW5zdGFuY2UuaXNPdmVyPTAsZC5jYW5jZWxIZWxwZXJSZW1vdmFsPSEwLHRoaXMuaW5zdGFuY2UuY2FuY2VsSGVscGVyUmVtb3ZhbD0hMSx0aGlzLnNob3VsZFJldmVydCYmKHRoaXMuaW5zdGFuY2Uub3B0aW9ucy5yZXZlcnQ9ITApLHRoaXMuaW5zdGFuY2UuX21vdXNlU3RvcChiKSx0aGlzLmluc3RhbmNlLm9wdGlvbnMuaGVscGVyPXRoaXMuaW5zdGFuY2Uub3B0aW9ucy5faGVscGVyLGQub3B0aW9ucy5oZWxwZXI9PSJvcmlnaW5hbCImJnRoaXMuaW5zdGFuY2UuY3VycmVudEl0ZW0uY3NzKHt0b3A6ImF1dG8iLGxlZnQ6ImF1dG8ifSkpOih0aGlzLmluc3RhbmNlLmNhbmNlbEhlbHBlclJlbW92YWw9ITEsdGhpcy5pbnN0YW5jZS5fdHJpZ2dlcigiZGVhY3RpdmF0ZSIsYixlKSl9KX0sZHJhZzpmdW5jdGlvbihiLGMpe3ZhciBkPWEodGhpcykuZGF0YSgiZHJhZ2dhYmxlIiksZT10aGlzLGY9ZnVuY3Rpb24oYil7dmFyIGM9dGhpcy5vZmZzZXQuY2xpY2sudG9wLGQ9dGhpcy5vZmZzZXQuY2xpY2subGVmdCxlPXRoaXMucG9zaXRpb25BYnMudG9wLGY9dGhpcy5wb3NpdGlvbkFicy5sZWZ0LGc9Yi5oZWlnaHQsaD1iLndpZHRoLGk9Yi50b3Asaj1iLmxlZnQ7cmV0dXJuIGEudWkuaXNPdmVyKGUrYyxmK2QsaSxqLGcsaCl9O2EuZWFjaChkLnNvcnRhYmxlcyxmdW5jdGlvbihmKXt0aGlzLmluc3RhbmNlLnBvc2l0aW9uQWJzPWQucG9zaXRpb25BYnMsdGhpcy5pbnN0YW5jZS5oZWxwZXJQcm9wb3J0aW9ucz1kLmhlbHBlclByb3BvcnRpb25zLHRoaXMuaW5zdGFuY2Uub2Zmc2V0LmNsaWNrPWQub2Zmc2V0LmNsaWNrLHRoaXMuaW5zdGFuY2UuX2ludGVyc2VjdHNXaXRoKHRoaXMuaW5zdGFuY2UuY29udGFpbmVyQ2FjaGUpPyh0aGlzLmluc3RhbmNlLmlzT3Zlcnx8KHRoaXMuaW5zdGFuY2UuaXNPdmVyPTEsdGhpcy5pbnN0YW5jZS5jdXJyZW50SXRlbT1hKGUpLmNsb25lKCkucmVtb3ZlQXR0cigiaWQiKS5hcHBlbmRUbyh0aGlzLmluc3RhbmNlLmVsZW1lbnQpLmRhdGEoInNvcnRhYmxlLWl0ZW0iLCEwKSx0aGlzLmluc3RhbmNlLm9wdGlvbnMuX2hlbHBlcj10aGlzLmluc3RhbmNlLm9wdGlvbnMuaGVscGVyLHRoaXMuaW5zdGFuY2Uub3B0aW9ucy5oZWxwZXI9ZnVuY3Rpb24oKXtyZXR1cm4gYy5oZWxwZXJbMF19LGIudGFyZ2V0PXRoaXMuaW5zdGFuY2UuY3VycmVudEl0ZW1bMF0sdGhpcy5pbnN0YW5jZS5fbW91c2VDYXB0dXJlKGIsITApLHRoaXMuaW5zdGFuY2UuX21vdXNlU3RhcnQoYiwhMCwhMCksdGhpcy5pbnN0YW5jZS5vZmZzZXQuY2xpY2sudG9wPWQub2Zmc2V0LmNsaWNrLnRvcCx0aGlzLmluc3RhbmNlLm9mZnNldC5jbGljay5sZWZ0PWQub2Zmc2V0LmNsaWNrLmxlZnQsdGhpcy5pbnN0YW5jZS5vZmZzZXQucGFyZW50LmxlZnQtPWQub2Zmc2V0LnBhcmVudC5sZWZ0LXRoaXMuaW5zdGFuY2Uub2Zmc2V0LnBhcmVudC5sZWZ0LHRoaXMuaW5zdGFuY2Uub2Zmc2V0LnBhcmVudC50b3AtPWQub2Zmc2V0LnBhcmVudC50b3AtdGhpcy5pbnN0YW5jZS5vZmZzZXQucGFyZW50LnRvcCxkLl90cmlnZ2VyKCJ0b1NvcnRhYmxlIixiKSxkLmRyb3BwZWQ9dGhpcy5pbnN0YW5jZS5lbGVtZW50LGQuY3VycmVudEl0ZW09ZC5lbGVtZW50LHRoaXMuaW5zdGFuY2UuZnJvbU91dHNpZGU9ZCksdGhpcy5pbnN0YW5jZS5jdXJyZW50SXRlbSYmdGhpcy5pbnN0YW5jZS5fbW91c2VEcmFnKGIpKTp0aGlzLmluc3RhbmNlLmlzT3ZlciYmKHRoaXMuaW5zdGFuY2UuaXNPdmVyPTAsdGhpcy5pbnN0YW5jZS5jYW5jZWxIZWxwZXJSZW1vdmFsPSEwLHRoaXMuaW5zdGFuY2Uub3B0aW9ucy5yZXZlcnQ9ITEsdGhpcy5pbnN0YW5jZS5fdHJpZ2dlcigib3V0IixiLHRoaXMuaW5zdGFuY2UuX3VpSGFzaCh0aGlzLmluc3RhbmNlKSksdGhpcy5pbnN0YW5jZS5fbW91c2VTdG9wKGIsITApLHRoaXMuaW5zdGFuY2Uub3B0aW9ucy5oZWxwZXI9dGhpcy5pbnN0YW5jZS5vcHRpb25zLl9oZWxwZXIsdGhpcy5pbnN0YW5jZS5jdXJyZW50SXRlbS5yZW1vdmUoKSx0aGlzLmluc3RhbmNlLnBsYWNlaG9sZGVyJiZ0aGlzLmluc3RhbmNlLnBsYWNlaG9sZGVyLnJlbW92ZSgpLGQuX3RyaWdnZXIoImZyb21Tb3J0YWJsZSIsYiksZC5kcm9wcGVkPSExKX0pfX0pLGEudWkucGx1Z2luLmFkZCgiZHJhZ2dhYmxlIiwiY3Vyc29yIix7c3RhcnQ6ZnVuY3Rpb24oYixjKXt2YXIgZD1hKCJib2R5IiksZT1hKHRoaXMpLmRhdGEoImRyYWdnYWJsZSIpLm9wdGlvbnM7ZC5jc3MoImN1cnNvciIpJiYoZS5fY3Vyc29yPWQuY3NzKCJjdXJzb3IiKSksZC5jc3MoImN1cnNvciIsZS5jdXJzb3IpfSxzdG9wOmZ1bmN0aW9uKGIsYyl7dmFyIGQ9YSh0aGlzKS5kYXRhKCJkcmFnZ2FibGUiKS5vcHRpb25zO2QuX2N1cnNvciYmYSgiYm9keSIpLmNzcygiY3Vyc29yIixkLl9jdXJzb3IpfX0pLGEudWkucGx1Z2luLmFkZCgiZHJhZ2dhYmxlIiwib3BhY2l0eSIse3N0YXJ0OmZ1bmN0aW9uKGIsYyl7dmFyIGQ9YShjLmhlbHBlciksZT1hKHRoaXMpLmRhdGEoImRyYWdnYWJsZSIpLm9wdGlvbnM7ZC5jc3MoIm9wYWNpdHkiKSYmKGUuX29wYWNpdHk9ZC5jc3MoIm9wYWNpdHkiKSksZC5jc3MoIm9wYWNpdHkiLGUub3BhY2l0eSl9LHN0b3A6ZnVuY3Rpb24oYixjKXt2YXIgZD1hKHRoaXMpLmRhdGEoImRyYWdnYWJsZSIpLm9wdGlvbnM7ZC5fb3BhY2l0eSYmYShjLmhlbHBlcikuY3NzKCJvcGFjaXR5IixkLl9vcGFjaXR5KX19KSxhLnVpLnBsdWdpbi5hZGQoImRyYWdnYWJsZSIsInNjcm9sbCIse3N0YXJ0OmZ1bmN0aW9uKGIsYyl7dmFyIGQ9YSh0aGlzKS5kYXRhKCJkcmFnZ2FibGUiKTtkLnNjcm9sbFBhcmVudFswXSE9ZG9jdW1lbnQmJmQuc2Nyb2xsUGFyZW50WzBdLnRhZ05hbWUhPSJIVE1MIiYmKGQub3ZlcmZsb3dPZmZzZXQ9ZC5zY3JvbGxQYXJlbnQub2Zmc2V0KCkpfSxkcmFnOmZ1bmN0aW9uKGIsYyl7dmFyIGQ9YSh0aGlzKS5kYXRhKCJkcmFnZ2FibGUiKSxlPWQub3B0aW9ucyxmPSExO2lmKGQuc2Nyb2xsUGFyZW50WzBdIT1kb2N1bWVudCYmZC5zY3JvbGxQYXJlbnRbMF0udGFnTmFtZSE9IkhUTUwiKXtpZighZS5heGlzfHxlLmF4aXMhPSJ4IilkLm92ZXJmbG93T2Zmc2V0LnRvcCtkLnNjcm9sbFBhcmVudFswXS5vZmZzZXRIZWlnaHQtYi5wYWdlWTxlLnNjcm9sbFNlbnNpdGl2aXR5P2Quc2Nyb2xsUGFyZW50WzBdLnNjcm9sbFRvcD1mPWQuc2Nyb2xsUGFyZW50WzBdLnNjcm9sbFRvcCtlLnNjcm9sbFNwZWVkOmIucGFnZVktZC5vdmVyZmxvd09mZnNldC50b3A8ZS5zY3JvbGxTZW5zaXRpdml0eSYmKGQuc2Nyb2xsUGFyZW50WzBdLnNjcm9sbFRvcD1mPWQuc2Nyb2xsUGFyZW50WzBdLnNjcm9sbFRvcC1lLnNjcm9sbFNwZWVkKTtpZighZS5heGlzfHxlLmF4aXMhPSJ5IilkLm92ZXJmbG93T2Zmc2V0LmxlZnQrZC5zY3JvbGxQYXJlbnRbMF0ub2Zmc2V0V2lkdGgtYi5wYWdlWDxlLnNjcm9sbFNlbnNpdGl2aXR5P2Quc2Nyb2xsUGFyZW50WzBdLnNjcm9sbExlZnQ9Zj1kLnNjcm9sbFBhcmVudFswXS5zY3JvbGxMZWZ0K2Uuc2Nyb2xsU3BlZWQ6Yi5wYWdlWC1kLm92ZXJmbG93T2Zmc2V0LmxlZnQ8ZS5zY3JvbGxTZW5zaXRpdml0eSYmKGQuc2Nyb2xsUGFyZW50WzBdLnNjcm9sbExlZnQ9Zj1kLnNjcm9sbFBhcmVudFswXS5zY3JvbGxMZWZ0LWUuc2Nyb2xsU3BlZWQpfWVsc2V7aWYoIWUuYXhpc3x8ZS5heGlzIT0ieCIpYi5wYWdlWS1hKGRvY3VtZW50KS5zY3JvbGxUb3AoKTxlLnNjcm9sbFNlbnNpdGl2aXR5P2Y9YShkb2N1bWVudCkuc2Nyb2xsVG9wKGEoZG9jdW1lbnQpLnNjcm9sbFRvcCgpLWUuc2Nyb2xsU3BlZWQpOmEod2luZG93KS5oZWlnaHQoKS0oYi5wYWdlWS1hKGRvY3VtZW50KS5zY3JvbGxUb3AoKSk8ZS5zY3JvbGxTZW5zaXRpdml0eSYmKGY9YShkb2N1bWVudCkuc2Nyb2xsVG9wKGEoZG9jdW1lbnQpLnNjcm9sbFRvcCgpK2Uuc2Nyb2xsU3BlZWQpKTtpZighZS5heGlzfHxlLmF4aXMhPSJ5IiliLnBhZ2VYLWEoZG9jdW1lbnQpLnNjcm9sbExlZnQoKTxlLnNjcm9sbFNlbnNpdGl2aXR5P2Y9YShkb2N1bWVudCkuc2Nyb2xsTGVmdChhKGRvY3VtZW50KS5zY3JvbGxMZWZ0KCktZS5zY3JvbGxTcGVlZCk6YSh3aW5kb3cpLndpZHRoKCktKGIucGFnZVgtYShkb2N1bWVudCkuc2Nyb2xsTGVmdCgpKTxlLnNjcm9sbFNlbnNpdGl2aXR5JiYoZj1hKGRvY3VtZW50KS5zY3JvbGxMZWZ0KGEoZG9jdW1lbnQpLnNjcm9sbExlZnQoKStlLnNjcm9sbFNwZWVkKSl9ZiE9PSExJiZhLnVpLmRkbWFuYWdlciYmIWUuZHJvcEJlaGF2aW91ciYmYS51aS5kZG1hbmFnZXIucHJlcGFyZU9mZnNldHMoZCxiKX19KSxhLnVpLnBsdWdpbi5hZGQoImRyYWdnYWJsZSIsInNuYXAiLHtzdGFydDpmdW5jdGlvbihiLGMpe3ZhciBkPWEodGhpcykuZGF0YSgiZHJhZ2dhYmxlIiksZT1kLm9wdGlvbnM7ZC5zbmFwRWxlbWVudHM9W10sYShlLnNuYXAuY29uc3RydWN0b3IhPVN0cmluZz9lLnNuYXAuaXRlbXN8fCI6ZGF0YShkcmFnZ2FibGUpIjplLnNuYXApLmVhY2goZnVuY3Rpb24oKXt2YXIgYj1hKHRoaXMpLGM9Yi5vZmZzZXQoKTt0aGlzIT1kLmVsZW1lbnRbMF0mJmQuc25hcEVsZW1lbnRzLnB1c2goe2l0ZW06dGhpcyx3aWR0aDpiLm91dGVyV2lkdGgoKSxoZWlnaHQ6Yi5vdXRlckhlaWdodCgpLHRvcDpjLnRvcCxsZWZ0OmMubGVmdH0pfSl9LGRyYWc6ZnVuY3Rpb24oYixjKXt2YXIgZD1hKHRoaXMpLmRhdGEoImRyYWdnYWJsZSIpLGU9ZC5vcHRpb25zLGY9ZS5zbmFwVG9sZXJhbmNlLGc9Yy5vZmZzZXQubGVmdCxoPWcrZC5oZWxwZXJQcm9wb3J0aW9ucy53aWR0aCxpPWMub2Zmc2V0LnRvcCxqPWkrZC5oZWxwZXJQcm9wb3J0aW9ucy5oZWlnaHQ7Zm9yKHZhciBrPWQuc25hcEVsZW1lbnRzLmxlbmd0aC0xO2s+PTA7ay0tKXt2YXIgbD1kLnNuYXBFbGVtZW50c1trXS5sZWZ0LG09bCtkLnNuYXBFbGVtZW50c1trXS53aWR0aCxuPWQuc25hcEVsZW1lbnRzW2tdLnRvcCxvPW4rZC5zbmFwRWxlbWVudHNba10uaGVpZ2h0O2lmKCEobC1mPGcmJmc8bStmJiZuLWY8aSYmaTxvK2Z8fGwtZjxnJiZnPG0rZiYmbi1mPGomJmo8bytmfHxsLWY8aCYmaDxtK2YmJm4tZjxpJiZpPG8rZnx8bC1mPGgmJmg8bStmJiZuLWY8aiYmajxvK2YpKXtkLnNuYXBFbGVtZW50c1trXS5zbmFwcGluZyYmZC5vcHRpb25zLnNuYXAucmVsZWFzZSYmZC5vcHRpb25zLnNuYXAucmVsZWFzZS5jYWxsKGQuZWxlbWVudCxiLGEuZXh0ZW5kKGQuX3VpSGFzaCgpLHtzbmFwSXRlbTpkLnNuYXBFbGVtZW50c1trXS5pdGVtfSkpLGQuc25hcEVsZW1lbnRzW2tdLnNuYXBwaW5nPSExO2NvbnRpbnVlfWlmKGUuc25hcE1vZGUhPSJpbm5lciIpe3ZhciBwPU1hdGguYWJzKG4taik8PWYscT1NYXRoLmFicyhvLWkpPD1mLHI9TWF0aC5hYnMobC1oKTw9ZixzPU1hdGguYWJzKG0tZyk8PWY7cCYmKGMucG9zaXRpb24udG9wPWQuX2NvbnZlcnRQb3NpdGlvblRvKCJyZWxhdGl2ZSIse3RvcDpuLWQuaGVscGVyUHJvcG9ydGlvbnMuaGVpZ2h0LGxlZnQ6MH0pLnRvcC1kLm1hcmdpbnMudG9wKSxxJiYoYy5wb3NpdGlvbi50b3A9ZC5fY29udmVydFBvc2l0aW9uVG8oInJlbGF0aXZlIix7dG9wOm8sbGVmdDowfSkudG9wLWQubWFyZ2lucy50b3ApLHImJihjLnBvc2l0aW9uLmxlZnQ9ZC5fY29udmVydFBvc2l0aW9uVG8oInJlbGF0aXZlIix7dG9wOjAsbGVmdDpsLWQuaGVscGVyUHJvcG9ydGlvbnMud2lkdGh9KS5sZWZ0LWQubWFyZ2lucy5sZWZ0KSxzJiYoYy5wb3NpdGlvbi5sZWZ0PWQuX2NvbnZlcnRQb3NpdGlvblRvKCJyZWxhdGl2ZSIse3RvcDowLGxlZnQ6bX0pLmxlZnQtZC5tYXJnaW5zLmxlZnQpfXZhciB0PXB8fHF8fHJ8fHM7aWYoZS5zbmFwTW9kZSE9Im91dGVyIil7dmFyIHA9TWF0aC5hYnMobi1pKTw9ZixxPU1hdGguYWJzKG8taik8PWYscj1NYXRoLmFicyhsLWcpPD1mLHM9TWF0aC5hYnMobS1oKTw9ZjtwJiYoYy5wb3NpdGlvbi50b3A9ZC5fY29udmVydFBvc2l0aW9uVG8oInJlbGF0aXZlIix7dG9wOm4sbGVmdDowfSkudG9wLWQubWFyZ2lucy50b3ApLHEmJihjLnBvc2l0aW9uLnRvcD1kLl9jb252ZXJ0UG9zaXRpb25UbygicmVsYXRpdmUiLHt0b3A6by1kLmhlbHBlclByb3BvcnRpb25zLmhlaWdodCxsZWZ0OjB9KS50b3AtZC5tYXJnaW5zLnRvcCksciYmKGMucG9zaXRpb24ubGVmdD1kLl9jb252ZXJ0UG9zaXRpb25UbygicmVsYXRpdmUiLHt0b3A6MCxsZWZ0Omx9KS5sZWZ0LWQubWFyZ2lucy5sZWZ0KSxzJiYoYy5wb3NpdGlvbi5sZWZ0PWQuX2NvbnZlcnRQb3NpdGlvblRvKCJyZWxhdGl2ZSIse3RvcDowLGxlZnQ6bS1kLmhlbHBlclByb3BvcnRpb25zLndpZHRofSkubGVmdC1kLm1hcmdpbnMubGVmdCl9IWQuc25hcEVsZW1lbnRzW2tdLnNuYXBwaW5nJiYocHx8cXx8cnx8c3x8dCkmJmQub3B0aW9ucy5zbmFwLnNuYXAmJmQub3B0aW9ucy5zbmFwLnNuYXAuY2FsbChkLmVsZW1lbnQsYixhLmV4dGVuZChkLl91aUhhc2goKSx7c25hcEl0ZW06ZC5zbmFwRWxlbWVudHNba10uaXRlbX0pKSxkLnNuYXBFbGVtZW50c1trXS5zbmFwcGluZz1wfHxxfHxyfHxzfHx0fX19KSxhLnVpLnBsdWdpbi5hZGQoImRyYWdnYWJsZSIsInN0YWNrIix7c3RhcnQ6ZnVuY3Rpb24oYixjKXt2YXIgZD1hKHRoaXMpLmRhdGEoImRyYWdnYWJsZSIpLm9wdGlvbnMsZT1hLm1ha2VBcnJheShhKGQuc3RhY2spKS5zb3J0KGZ1bmN0aW9uKGIsYyl7cmV0dXJuKHBhcnNlSW50KGEoYikuY3NzKCJ6SW5kZXgiKSwxMCl8fDApLShwYXJzZUludChhKGMpLmNzcygiekluZGV4IiksMTApfHwwKX0pO2lmKCFlLmxlbmd0aClyZXR1cm47dmFyIGY9cGFyc2VJbnQoZVswXS5zdHlsZS56SW5kZXgpfHwwO2EoZSkuZWFjaChmdW5jdGlvbihhKXt0aGlzLnN0eWxlLnpJbmRleD1mK2F9KSx0aGlzWzBdLnN0eWxlLnpJbmRleD1mK2UubGVuZ3RofX0pLGEudWkucGx1Z2luLmFkZCgiZHJhZ2dhYmxlIiwiekluZGV4Iix7c3RhcnQ6ZnVuY3Rpb24oYixjKXt2YXIgZD1hKGMuaGVscGVyKSxlPWEodGhpcykuZGF0YSgiZHJhZ2dhYmxlIikub3B0aW9ucztkLmNzcygiekluZGV4IikmJihlLl96SW5kZXg9ZC5jc3MoInpJbmRleCIpKSxkLmNzcygiekluZGV4IixlLnpJbmRleCl9LHN0b3A6ZnVuY3Rpb24oYixjKXt2YXIgZD1hKHRoaXMpLmRhdGEoImRyYWdnYWJsZSIpLm9wdGlvbnM7ZC5fekluZGV4JiZhKGMuaGVscGVyKS5jc3MoInpJbmRleCIsZC5fekluZGV4KX19KX0pKGpRdWVyeSk7Oy8qISBqUXVlcnkgVUkgLSB2MS44LjIzIC0gMjAxMi0wOC0xNQotKiBodHRwczovL2dpdGh1Yi5jb20vanF1ZXJ5L2pxdWVyeS11aQotKiBJbmNsdWRlczoganF1ZXJ5LnVpLmRyb3BwYWJsZS5qcwotKiBDb3B5cmlnaHQgKGMpIDIwMTIgQVVUSE9SUy50eHQ7IExpY2Vuc2VkIE1JVCwgR1BMICovCi0oZnVuY3Rpb24oYSxiKXthLndpZGdldCgidWkuZHJvcHBhYmxlIix7d2lkZ2V0RXZlbnRQcmVmaXg6ImRyb3AiLG9wdGlvbnM6e2FjY2VwdDoiKiIsYWN0aXZlQ2xhc3M6ITEsYWRkQ2xhc3NlczohMCxncmVlZHk6ITEsaG92ZXJDbGFzczohMSxzY29wZToiZGVmYXVsdCIsdG9sZXJhbmNlOiJpbnRlcnNlY3QifSxfY3JlYXRlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5vcHRpb25zLGM9Yi5hY2NlcHQ7dGhpcy5pc292ZXI9MCx0aGlzLmlzb3V0PTEsdGhpcy5hY2NlcHQ9YS5pc0Z1bmN0aW9uKGMpP2M6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXMoYyl9LHRoaXMucHJvcG9ydGlvbnM9e3dpZHRoOnRoaXMuZWxlbWVudFswXS5vZmZzZXRXaWR0aCxoZWlnaHQ6dGhpcy5lbGVtZW50WzBdLm9mZnNldEhlaWdodH0sYS51aS5kZG1hbmFnZXIuZHJvcHBhYmxlc1tiLnNjb3BlXT1hLnVpLmRkbWFuYWdlci5kcm9wcGFibGVzW2Iuc2NvcGVdfHxbXSxhLnVpLmRkbWFuYWdlci5kcm9wcGFibGVzW2Iuc2NvcGVdLnB1c2godGhpcyksYi5hZGRDbGFzc2VzJiZ0aGlzLmVsZW1lbnQuYWRkQ2xhc3MoInVpLWRyb3BwYWJsZSIpfSxkZXN0cm95OmZ1bmN0aW9uKCl7dmFyIGI9YS51aS5kZG1hbmFnZXIuZHJvcHBhYmxlc1t0aGlzLm9wdGlvbnMuc2NvcGVdO2Zvcih2YXIgYz0wO2M8Yi5sZW5ndGg7YysrKWJbY109PXRoaXMmJmIuc3BsaWNlKGMsMSk7cmV0dXJuIHRoaXMuZWxlbWVudC5yZW1vdmVDbGFzcygidWktZHJvcHBhYmxlIHVpLWRyb3BwYWJsZS1kaXNhYmxlZCIpLnJlbW92ZURhdGEoImRyb3BwYWJsZSIpLnVuYmluZCgiLmRyb3BwYWJsZSIpLHRoaXN9LF9zZXRPcHRpb246ZnVuY3Rpb24oYixjKXtiPT0iYWNjZXB0IiYmKHRoaXMuYWNjZXB0PWEuaXNGdW5jdGlvbihjKT9jOmZ1bmN0aW9uKGEpe3JldHVybiBhLmlzKGMpfSksYS5XaWRnZXQucHJvdG90eXBlLl9zZXRPcHRpb24uYXBwbHkodGhpcyxhcmd1bWVudHMpfSxfYWN0aXZhdGU6ZnVuY3Rpb24oYil7dmFyIGM9YS51aS5kZG1hbmFnZXIuY3VycmVudDt0aGlzLm9wdGlvbnMuYWN0aXZlQ2xhc3MmJnRoaXMuZWxlbWVudC5hZGRDbGFzcyh0aGlzLm9wdGlvbnMuYWN0aXZlQ2xhc3MpLGMmJnRoaXMuX3RyaWdnZXIoImFjdGl2YXRlIixiLHRoaXMudWkoYykpfSxfZGVhY3RpdmF0ZTpmdW5jdGlvbihiKXt2YXIgYz1hLnVpLmRkbWFuYWdlci5jdXJyZW50O3RoaXMub3B0aW9ucy5hY3RpdmVDbGFzcyYmdGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKHRoaXMub3B0aW9ucy5hY3RpdmVDbGFzcyksYyYmdGhpcy5fdHJpZ2dlcigiZGVhY3RpdmF0ZSIsYix0aGlzLnVpKGMpKX0sX292ZXI6ZnVuY3Rpb24oYil7dmFyIGM9YS51aS5kZG1hbmFnZXIuY3VycmVudDtpZighY3x8KGMuY3VycmVudEl0ZW18fGMuZWxlbWVudClbMF09PXRoaXMuZWxlbWVudFswXSlyZXR1cm47dGhpcy5hY2NlcHQuY2FsbCh0aGlzLmVsZW1lbnRbMF0sYy5jdXJyZW50SXRlbXx8Yy5lbGVtZW50KSYmKHRoaXMub3B0aW9ucy5ob3ZlckNsYXNzJiZ0aGlzLmVsZW1lbnQuYWRkQ2xhc3ModGhpcy5vcHRpb25zLmhvdmVyQ2xhc3MpLHRoaXMuX3RyaWdnZXIoIm92ZXIiLGIsdGhpcy51aShjKSkpfSxfb3V0OmZ1bmN0aW9uKGIpe3ZhciBjPWEudWkuZGRtYW5hZ2VyLmN1cnJlbnQ7aWYoIWN8fChjLmN1cnJlbnRJdGVtfHxjLmVsZW1lbnQpWzBdPT10aGlzLmVsZW1lbnRbMF0pcmV0dXJuO3RoaXMuYWNjZXB0LmNhbGwodGhpcy5lbGVtZW50WzBdLGMuY3VycmVudEl0ZW18fGMuZWxlbWVudCkmJih0aGlzLm9wdGlvbnMuaG92ZXJDbGFzcyYmdGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKHRoaXMub3B0aW9ucy5ob3ZlckNsYXNzKSx0aGlzLl90cmlnZ2VyKCJvdXQiLGIsdGhpcy51aShjKSkpfSxfZHJvcDpmdW5jdGlvbihiLGMpe3ZhciBkPWN8fGEudWkuZGRtYW5hZ2VyLmN1cnJlbnQ7aWYoIWR8fChkLmN1cnJlbnRJdGVtfHxkLmVsZW1lbnQpWzBdPT10aGlzLmVsZW1lbnRbMF0pcmV0dXJuITE7dmFyIGU9ITE7cmV0dXJuIHRoaXMuZWxlbWVudC5maW5kKCI6ZGF0YShkcm9wcGFibGUpIikubm90KCIudWktZHJhZ2dhYmxlLWRyYWdnaW5nIikuZWFjaChmdW5jdGlvbigpe3ZhciBiPWEuZGF0YSh0aGlzLCJkcm9wcGFibGUiKTtpZihiLm9wdGlvbnMuZ3JlZWR5JiYhYi5vcHRpb25zLmRpc2FibGVkJiZiLm9wdGlvbnMuc2NvcGU9PWQub3B0aW9ucy5zY29wZSYmYi5hY2NlcHQuY2FsbChiLmVsZW1lbnRbMF0sZC5jdXJyZW50SXRlbXx8ZC5lbGVtZW50KSYmYS51aS5pbnRlcnNlY3QoZCxhLmV4dGVuZChiLHtvZmZzZXQ6Yi5lbGVtZW50Lm9mZnNldCgpfSksYi5vcHRpb25zLnRvbGVyYW5jZSkpcmV0dXJuIGU9ITAsITF9KSxlPyExOnRoaXMuYWNjZXB0LmNhbGwodGhpcy5lbGVtZW50WzBdLGQuY3VycmVudEl0ZW18fGQuZWxlbWVudCk/KHRoaXMub3B0aW9ucy5hY3RpdmVDbGFzcyYmdGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKHRoaXMub3B0aW9ucy5hY3RpdmVDbGFzcyksdGhpcy5vcHRpb25zLmhvdmVyQ2xhc3MmJnRoaXMuZWxlbWVudC5yZW1vdmVDbGFzcyh0aGlzLm9wdGlvbnMuaG92ZXJDbGFzcyksdGhpcy5fdHJpZ2dlcigiZHJvcCIsYix0aGlzLnVpKGQpKSx0aGlzLmVsZW1lbnQpOiExfSx1aTpmdW5jdGlvbihhKXtyZXR1cm57ZHJhZ2dhYmxlOmEuY3VycmVudEl0ZW18fGEuZWxlbWVudCxoZWxwZXI6YS5oZWxwZXIscG9zaXRpb246YS5wb3NpdGlvbixvZmZzZXQ6YS5wb3NpdGlvbkFic319fSksYS5leHRlbmQoYS51aS5kcm9wcGFibGUse3ZlcnNpb246IjEuOC4yMyJ9KSxhLnVpLmludGVyc2VjdD1mdW5jdGlvbihiLGMsZCl7aWYoIWMub2Zmc2V0KXJldHVybiExO3ZhciBlPShiLnBvc2l0aW9uQWJzfHxiLnBvc2l0aW9uLmFic29sdXRlKS5sZWZ0LGY9ZStiLmhlbHBlclByb3BvcnRpb25zLndpZHRoLGc9KGIucG9zaXRpb25BYnN8fGIucG9zaXRpb24uYWJzb2x1dGUpLnRvcCxoPWcrYi5oZWxwZXJQcm9wb3J0aW9ucy5oZWlnaHQsaT1jLm9mZnNldC5sZWZ0LGo9aStjLnByb3BvcnRpb25zLndpZHRoLGs9Yy5vZmZzZXQudG9wLGw9aytjLnByb3BvcnRpb25zLmhlaWdodDtzd2l0Y2goZCl7Y2FzZSJmaXQiOnJldHVybiBpPD1lJiZmPD1qJiZrPD1nJiZoPD1sO2Nhc2UiaW50ZXJzZWN0IjpyZXR1cm4gaTxlK2IuaGVscGVyUHJvcG9ydGlvbnMud2lkdGgvMiYmZi1iLmhlbHBlclByb3BvcnRpb25zLndpZHRoLzI8aiYmazxnK2IuaGVscGVyUHJvcG9ydGlvbnMuaGVpZ2h0LzImJmgtYi5oZWxwZXJQcm9wb3J0aW9ucy5oZWlnaHQvMjxsO2Nhc2UicG9pbnRlciI6dmFyIG09KGIucG9zaXRpb25BYnN8fGIucG9zaXRpb24uYWJzb2x1dGUpLmxlZnQrKGIuY2xpY2tPZmZzZXR8fGIub2Zmc2V0LmNsaWNrKS5sZWZ0LG49KGIucG9zaXRpb25BYnN8fGIucG9zaXRpb24uYWJzb2x1dGUpLnRvcCsoYi5jbGlja09mZnNldHx8Yi5vZmZzZXQuY2xpY2spLnRvcCxvPWEudWkuaXNPdmVyKG4sbSxrLGksYy5wcm9wb3J0aW9ucy5oZWlnaHQsYy5wcm9wb3J0aW9ucy53aWR0aCk7cmV0dXJuIG87Y2FzZSJ0b3VjaCI6cmV0dXJuKGc+PWsmJmc8PWx8fGg+PWsmJmg8PWx8fGc8ayYmaD5sKSYmKGU+PWkmJmU8PWp8fGY+PWkmJmY8PWp8fGU8aSYmZj5qKTtkZWZhdWx0OnJldHVybiExfX0sYS51aS5kZG1hbmFnZXI9e2N1cnJlbnQ6bnVsbCxkcm9wcGFibGVzOnsiZGVmYXVsdCI6W119LHByZXBhcmVPZmZzZXRzOmZ1bmN0aW9uKGIsYyl7dmFyIGQ9YS51aS5kZG1hbmFnZXIuZHJvcHBhYmxlc1tiLm9wdGlvbnMuc2NvcGVdfHxbXSxlPWM/Yy50eXBlOm51bGwsZj0oYi5jdXJyZW50SXRlbXx8Yi5lbGVtZW50KS5maW5kKCI6ZGF0YShkcm9wcGFibGUpIikuYW5kU2VsZigpO2c6Zm9yKHZhciBoPTA7aDxkLmxlbmd0aDtoKyspe2lmKGRbaF0ub3B0aW9ucy5kaXNhYmxlZHx8YiYmIWRbaF0uYWNjZXB0LmNhbGwoZFtoXS5lbGVtZW50WzBdLGIuY3VycmVudEl0ZW18fGIuZWxlbWVudCkpY29udGludWU7Zm9yKHZhciBpPTA7aTxmLmxlbmd0aDtpKyspaWYoZltpXT09ZFtoXS5lbGVtZW50WzBdKXtkW2hdLnByb3BvcnRpb25zLmhlaWdodD0wO2NvbnRpbnVlIGd9ZFtoXS52aXNpYmxlPWRbaF0uZWxlbWVudC5jc3MoImRpc3BsYXkiKSE9Im5vbmUiO2lmKCFkW2hdLnZpc2libGUpY29udGludWU7ZT09Im1vdXNlZG93biImJmRbaF0uX2FjdGl2YXRlLmNhbGwoZFtoXSxjKSxkW2hdLm9mZnNldD1kW2hdLmVsZW1lbnQub2Zmc2V0KCksZFtoXS5wcm9wb3J0aW9ucz17d2lkdGg6ZFtoXS5lbGVtZW50WzBdLm9mZnNldFdpZHRoLGhlaWdodDpkW2hdLmVsZW1lbnRbMF0ub2Zmc2V0SGVpZ2h0fX19LGRyb3A6ZnVuY3Rpb24oYixjKXt2YXIgZD0hMTtyZXR1cm4gYS5lYWNoKGEudWkuZGRtYW5hZ2VyLmRyb3BwYWJsZXNbYi5vcHRpb25zLnNjb3BlXXx8W10sZnVuY3Rpb24oKXtpZighdGhpcy5vcHRpb25zKXJldHVybjshdGhpcy5vcHRpb25zLmRpc2FibGVkJiZ0aGlzLnZpc2libGUmJmEudWkuaW50ZXJzZWN0KGIsdGhpcyx0aGlzLm9wdGlvbnMudG9sZXJhbmNlKSYmKGQ9dGhpcy5fZHJvcC5jYWxsKHRoaXMsYyl8fGQpLCF0aGlzLm9wdGlvbnMuZGlzYWJsZWQmJnRoaXMudmlzaWJsZSYmdGhpcy5hY2NlcHQuY2FsbCh0aGlzLmVsZW1lbnRbMF0sYi5jdXJyZW50SXRlbXx8Yi5lbGVtZW50KSYmKHRoaXMuaXNvdXQ9MSx0aGlzLmlzb3Zlcj0wLHRoaXMuX2RlYWN0aXZhdGUuY2FsbCh0aGlzLGMpKX0pLGR9LGRyYWdTdGFydDpmdW5jdGlvbihiLGMpe2IuZWxlbWVudC5wYXJlbnRzKCI6bm90KGJvZHksaHRtbCkiKS5iaW5kKCJzY3JvbGwuZHJvcHBhYmxlIixmdW5jdGlvbigpe2Iub3B0aW9ucy5yZWZyZXNoUG9zaXRpb25zfHxhLnVpLmRkbWFuYWdlci5wcmVwYXJlT2Zmc2V0cyhiLGMpfSl9LGRyYWc6ZnVuY3Rpb24oYixjKXtiLm9wdGlvbnMucmVmcmVzaFBvc2l0aW9ucyYmYS51aS5kZG1hbmFnZXIucHJlcGFyZU9mZnNldHMoYixjKSxhLmVhY2goYS51aS5kZG1hbmFnZXIuZHJvcHBhYmxlc1tiLm9wdGlvbnMuc2NvcGVdfHxbXSxmdW5jdGlvbigpe2lmKHRoaXMub3B0aW9ucy5kaXNhYmxlZHx8dGhpcy5ncmVlZHlDaGlsZHx8IXRoaXMudmlzaWJsZSlyZXR1cm47dmFyIGQ9YS51aS5pbnRlcnNlY3QoYix0aGlzLHRoaXMub3B0aW9ucy50b2xlcmFuY2UpLGU9IWQmJnRoaXMuaXNvdmVyPT0xPyJpc291dCI6ZCYmdGhpcy5pc292ZXI9PTA/Imlzb3ZlciI6bnVsbDtpZighZSlyZXR1cm47dmFyIGY7aWYodGhpcy5vcHRpb25zLmdyZWVkeSl7dmFyIGc9dGhpcy5lbGVtZW50LnBhcmVudHMoIjpkYXRhKGRyb3BwYWJsZSk6ZXEoMCkiKTtnLmxlbmd0aCYmKGY9YS5kYXRhKGdbMF0sImRyb3BwYWJsZSIpLGYuZ3JlZWR5Q2hpbGQ9ZT09Imlzb3ZlciI/MTowKX1mJiZlPT0iaXNvdmVyIiYmKGYuaXNvdmVyPTAsZi5pc291dD0xLGYuX291dC5jYWxsKGYsYykpLHRoaXNbZV09MSx0aGlzW2U9PSJpc291dCI/Imlzb3ZlciI6Imlzb3V0Il09MCx0aGlzW2U9PSJpc292ZXIiPyJfb3ZlciI6Il9vdXQiXS5jYWxsKHRoaXMsYyksZiYmZT09Imlzb3V0IiYmKGYuaXNvdXQ9MCxmLmlzb3Zlcj0xLGYuX292ZXIuY2FsbChmLGMpKX0pfSxkcmFnU3RvcDpmdW5jdGlvbihiLGMpe2IuZWxlbWVudC5wYXJlbnRzKCI6bm90KGJvZHksaHRtbCkiKS51bmJpbmQoInNjcm9sbC5kcm9wcGFibGUiKSxiLm9wdGlvbnMucmVmcmVzaFBvc2l0aW9uc3x8YS51aS5kZG1hbmFnZXIucHJlcGFyZU9mZnNldHMoYixjKX19fSkoalF1ZXJ5KTs7LyohIGpRdWVyeSBVSSAtIHYxLjguMjMgLSAyMDEyLTA4LTE1Ci0qIGh0dHBzOi8vZ2l0aHViLmNvbS9qcXVlcnkvanF1ZXJ5LXVpCi0qIEluY2x1ZGVzOiBqcXVlcnkudWkucmVzaXphYmxlLmpzCi0qIENvcHlyaWdodCAoYykgMjAxMiBBVVRIT1JTLnR4dDsgTGljZW5zZWQgTUlULCBHUEwgKi8KLShmdW5jdGlvbihhLGIpe2Eud2lkZ2V0KCJ1aS5yZXNpemFibGUiLGEudWkubW91c2Use3dpZGdldEV2ZW50UHJlZml4OiJyZXNpemUiLG9wdGlvbnM6e2Fsc29SZXNpemU6ITEsYW5pbWF0ZTohMSxhbmltYXRlRHVyYXRpb246InNsb3ciLGFuaW1hdGVFYXNpbmc6InN3aW5nIixhc3BlY3RSYXRpbzohMSxhdXRvSGlkZTohMSxjb250YWlubWVudDohMSxnaG9zdDohMSxncmlkOiExLGhhbmRsZXM6ImUscyxzZSIsaGVscGVyOiExLG1heEhlaWdodDpudWxsLG1heFdpZHRoOm51bGwsbWluSGVpZ2h0OjEwLG1pbldpZHRoOjEwLHpJbmRleDoxZTN9LF9jcmVhdGU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLGM9dGhpcy5vcHRpb25zO3RoaXMuZWxlbWVudC5hZGRDbGFzcygidWktcmVzaXphYmxlIiksYS5leHRlbmQodGhpcyx7X2FzcGVjdFJhdGlvOiEhYy5hc3BlY3RSYXRpbyxhc3BlY3RSYXRpbzpjLmFzcGVjdFJhdGlvLG9yaWdpbmFsRWxlbWVudDp0aGlzLmVsZW1lbnQsX3Byb3BvcnRpb25hbGx5UmVzaXplRWxlbWVudHM6W10sX2hlbHBlcjpjLmhlbHBlcnx8Yy5naG9zdHx8Yy5hbmltYXRlP2MuaGVscGVyfHwidWktcmVzaXphYmxlLWhlbHBlciI6bnVsbH0pLHRoaXMuZWxlbWVudFswXS5ub2RlTmFtZS5tYXRjaCgvY2FudmFzfHRleHRhcmVhfGlucHV0fHNlbGVjdHxidXR0b258aW1nL2kpJiYodGhpcy5lbGVtZW50LndyYXAoYSgnPGRpdiBjbGFzcz0idWktd3JhcHBlciIgc3R5bGU9Im92ZXJmbG93OiBoaWRkZW47Ij48L2Rpdj4nKS5jc3Moe3Bvc2l0aW9uOnRoaXMuZWxlbWVudC5jc3MoInBvc2l0aW9uIiksd2lkdGg6dGhpcy5lbGVtZW50Lm91dGVyV2lkdGgoKSxoZWlnaHQ6dGhpcy5lbGVtZW50Lm91dGVySGVpZ2h0KCksdG9wOnRoaXMuZWxlbWVudC5jc3MoInRvcCIpLGxlZnQ6dGhpcy5lbGVtZW50LmNzcygibGVmdCIpfSkpLHRoaXMuZWxlbWVudD10aGlzLmVsZW1lbnQucGFyZW50KCkuZGF0YSgicmVzaXphYmxlIix0aGlzLmVsZW1lbnQuZGF0YSgicmVzaXphYmxlIikpLHRoaXMuZWxlbWVudElzV3JhcHBlcj0hMCx0aGlzLmVsZW1lbnQuY3NzKHttYXJnaW5MZWZ0OnRoaXMub3JpZ2luYWxFbGVtZW50LmNzcygibWFyZ2luTGVmdCIpLG1hcmdpblRvcDp0aGlzLm9yaWdpbmFsRWxlbWVudC5jc3MoIm1hcmdpblRvcCIpLG1hcmdpblJpZ2h0OnRoaXMub3JpZ2luYWxFbGVtZW50LmNzcygibWFyZ2luUmlnaHQiKSxtYXJnaW5Cb3R0b206dGhpcy5vcmlnaW5hbEVsZW1lbnQuY3NzKCJtYXJnaW5Cb3R0b20iKX0pLHRoaXMub3JpZ2luYWxFbGVtZW50LmNzcyh7bWFyZ2luTGVmdDowLG1hcmdpblRvcDowLG1hcmdpblJpZ2h0OjAsbWFyZ2luQm90dG9tOjB9KSx0aGlzLm9yaWdpbmFsUmVzaXplU3R5bGU9dGhpcy5vcmlnaW5hbEVsZW1lbnQuY3NzKCJyZXNpemUiKSx0aGlzLm9yaWdpbmFsRWxlbWVudC5jc3MoInJlc2l6ZSIsIm5vbmUiKSx0aGlzLl9wcm9wb3J0aW9uYWxseVJlc2l6ZUVsZW1lbnRzLnB1c2godGhpcy5vcmlnaW5hbEVsZW1lbnQuY3NzKHtwb3NpdGlvbjoic3RhdGljIix6b29tOjEsZGlzcGxheToiYmxvY2sifSkpLHRoaXMub3JpZ2luYWxFbGVtZW50LmNzcyh7bWFyZ2luOnRoaXMub3JpZ2luYWxFbGVtZW50LmNzcygibWFyZ2luIil9KSx0aGlzLl9wcm9wb3J0aW9uYWxseVJlc2l6ZSgpKSx0aGlzLmhhbmRsZXM9Yy5oYW5kbGVzfHwoYSgiLnVpLXJlc2l6YWJsZS1oYW5kbGUiLHRoaXMuZWxlbWVudCkubGVuZ3RoP3tuOiIudWktcmVzaXphYmxlLW4iLGU6Ii51aS1yZXNpemFibGUtZSIsczoiLnVpLXJlc2l6YWJsZS1zIix3OiIudWktcmVzaXphYmxlLXciLHNlOiIudWktcmVzaXphYmxlLXNlIixzdzoiLnVpLXJlc2l6YWJsZS1zdyIsbmU6Ii51aS1yZXNpemFibGUtbmUiLG53OiIudWktcmVzaXphYmxlLW53In06ImUscyxzZSIpO2lmKHRoaXMuaGFuZGxlcy5jb25zdHJ1Y3Rvcj09U3RyaW5nKXt0aGlzLmhhbmRsZXM9PSJhbGwiJiYodGhpcy5oYW5kbGVzPSJuLGUscyx3LHNlLHN3LG5lLG53Iik7dmFyIGQ9dGhpcy5oYW5kbGVzLnNwbGl0KCIsIik7dGhpcy5oYW5kbGVzPXt9O2Zvcih2YXIgZT0wO2U8ZC5sZW5ndGg7ZSsrKXt2YXIgZj1hLnRyaW0oZFtlXSksZz0idWktcmVzaXphYmxlLSIrZixoPWEoJzxkaXYgY2xhc3M9InVpLXJlc2l6YWJsZS1oYW5kbGUgJytnKyciPjwvZGl2PicpO2guY3NzKHt6SW5kZXg6Yy56SW5kZXh9KSwic2UiPT1mJiZoLmFkZENsYXNzKCJ1aS1pY29uIHVpLWljb24tZ3JpcHNtYWxsLWRpYWdvbmFsLXNlIiksdGhpcy5oYW5kbGVzW2ZdPSIudWktcmVzaXphYmxlLSIrZix0aGlzLmVsZW1lbnQuYXBwZW5kKGgpfX10aGlzLl9yZW5kZXJBeGlzPWZ1bmN0aW9uKGIpe2I9Ynx8dGhpcy5lbGVtZW50O2Zvcih2YXIgYyBpbiB0aGlzLmhhbmRsZXMpe3RoaXMuaGFuZGxlc1tjXS5jb25zdHJ1Y3Rvcj09U3RyaW5nJiYodGhpcy5oYW5kbGVzW2NdPWEodGhpcy5oYW5kbGVzW2NdLHRoaXMuZWxlbWVudCkuc2hvdygpKTtpZih0aGlzLmVsZW1lbnRJc1dyYXBwZXImJnRoaXMub3JpZ2luYWxFbGVtZW50WzBdLm5vZGVOYW1lLm1hdGNoKC90ZXh0YXJlYXxpbnB1dHxzZWxlY3R8YnV0dG9uL2kpKXt2YXIgZD1hKHRoaXMuaGFuZGxlc1tjXSx0aGlzLmVsZW1lbnQpLGU9MDtlPS9zd3xuZXxud3xzZXxufHMvLnRlc3QoYyk/ZC5vdXRlckhlaWdodCgpOmQub3V0ZXJXaWR0aCgpO3ZhciBmPVsicGFkZGluZyIsL25lfG53fG4vLnRlc3QoYyk/IlRvcCI6L3NlfHN3fHMvLnRlc3QoYyk/IkJvdHRvbSI6L15lJC8udGVzdChjKT8iUmlnaHQiOiJMZWZ0Il0uam9pbigiIik7Yi5jc3MoZixlKSx0aGlzLl9wcm9wb3J0aW9uYWxseVJlc2l6ZSgpfWlmKCFhKHRoaXMuaGFuZGxlc1tjXSkubGVuZ3RoKWNvbnRpbnVlfX0sdGhpcy5fcmVuZGVyQXhpcyh0aGlzLmVsZW1lbnQpLHRoaXMuX2hhbmRsZXM9YSgiLnVpLXJlc2l6YWJsZS1oYW5kbGUiLHRoaXMuZWxlbWVudCkuZGlzYWJsZVNlbGVjdGlvbigpLHRoaXMuX2hhbmRsZXMubW91c2VvdmVyKGZ1bmN0aW9uKCl7aWYoIWIucmVzaXppbmcpe2lmKHRoaXMuY2xhc3NOYW1lKXZhciBhPXRoaXMuY2xhc3NOYW1lLm1hdGNoKC91aS1yZXNpemFibGUtKHNlfHN3fG5lfG53fG58ZXxzfHcpL2kpO2IuYXhpcz1hJiZhWzFdP2FbMV06InNlIn19KSxjLmF1dG9IaWRlJiYodGhpcy5faGFuZGxlcy5oaWRlKCksYSh0aGlzLmVsZW1lbnQpLmFkZENsYXNzKCJ1aS1yZXNpemFibGUtYXV0b2hpZGUiKS5ob3ZlcihmdW5jdGlvbigpe2lmKGMuZGlzYWJsZWQpcmV0dXJuO2EodGhpcykucmVtb3ZlQ2xhc3MoInVpLXJlc2l6YWJsZS1hdXRvaGlkZSIpLGIuX2hhbmRsZXMuc2hvdygpfSxmdW5jdGlvbigpe2lmKGMuZGlzYWJsZWQpcmV0dXJuO2IucmVzaXppbmd8fChhKHRoaXMpLmFkZENsYXNzKCJ1aS1yZXNpemFibGUtYXV0b2hpZGUiKSxiLl9oYW5kbGVzLmhpZGUoKSl9KSksdGhpcy5fbW91c2VJbml0KCl9LGRlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLl9tb3VzZURlc3Ryb3koKTt2YXIgYj1mdW5jdGlvbihiKXthKGIpLnJlbW92ZUNsYXNzKCJ1aS1yZXNpemFibGUgdWktcmVzaXphYmxlLWRpc2FibGVkIHVpLXJlc2l6YWJsZS1yZXNpemluZyIpLnJlbW92ZURhdGEoInJlc2l6YWJsZSIpLnVuYmluZCgiLnJlc2l6YWJsZSIpLmZpbmQoIi51aS1yZXNpemFibGUtaGFuZGxlIikucmVtb3ZlKCl9O2lmKHRoaXMuZWxlbWVudElzV3JhcHBlcil7Yih0aGlzLmVsZW1lbnQpO3ZhciBjPXRoaXMuZWxlbWVudDtjLmFmdGVyKHRoaXMub3JpZ2luYWxFbGVtZW50LmNzcyh7cG9zaXRpb246Yy5jc3MoInBvc2l0aW9uIiksd2lkdGg6Yy5vdXRlcldpZHRoKCksaGVpZ2h0OmMub3V0ZXJIZWlnaHQoKSx0b3A6Yy5jc3MoInRvcCIpLGxlZnQ6Yy5jc3MoImxlZnQiKX0pKS5yZW1vdmUoKX1yZXR1cm4gdGhpcy5vcmlnaW5hbEVsZW1lbnQuY3NzKCJyZXNpemUiLHRoaXMub3JpZ2luYWxSZXNpemVTdHlsZSksYih0aGlzLm9yaWdpbmFsRWxlbWVudCksdGhpc30sX21vdXNlQ2FwdHVyZTpmdW5jdGlvbihiKXt2YXIgYz0hMTtmb3IodmFyIGQgaW4gdGhpcy5oYW5kbGVzKWEodGhpcy5oYW5kbGVzW2RdKVswXT09Yi50YXJnZXQmJihjPSEwKTtyZXR1cm4hdGhpcy5vcHRpb25zLmRpc2FibGVkJiZjfSxfbW91c2VTdGFydDpmdW5jdGlvbihiKXt2YXIgZD10aGlzLm9wdGlvbnMsZT10aGlzLmVsZW1lbnQucG9zaXRpb24oKSxmPXRoaXMuZWxlbWVudDt0aGlzLnJlc2l6aW5nPSEwLHRoaXMuZG9jdW1lbnRTY3JvbGw9e3RvcDphKGRvY3VtZW50KS5zY3JvbGxUb3AoKSxsZWZ0OmEoZG9jdW1lbnQpLnNjcm9sbExlZnQoKX0sKGYuaXMoIi51aS1kcmFnZ2FibGUiKXx8L2Fic29sdXRlLy50ZXN0KGYuY3NzKCJwb3NpdGlvbiIpKSkmJmYuY3NzKHtwb3NpdGlvbjoiYWJzb2x1dGUiLHRvcDplLnRvcCxsZWZ0OmUubGVmdH0pLHRoaXMuX3JlbmRlclByb3h5KCk7dmFyIGc9Yyh0aGlzLmhlbHBlci5jc3MoImxlZnQiKSksaD1jKHRoaXMuaGVscGVyLmNzcygidG9wIikpO2QuY29udGFpbm1lbnQmJihnKz1hKGQuY29udGFpbm1lbnQpLnNjcm9sbExlZnQoKXx8MCxoKz1hKGQuY29udGFpbm1lbnQpLnNjcm9sbFRvcCgpfHwwKSx0aGlzLm9mZnNldD10aGlzLmhlbHBlci5vZmZzZXQoKSx0aGlzLnBvc2l0aW9uPXtsZWZ0OmcsdG9wOmh9LHRoaXMuc2l6ZT10aGlzLl9oZWxwZXI/e3dpZHRoOmYub3V0ZXJXaWR0aCgpLGhlaWdodDpmLm91dGVySGVpZ2h0KCl9Ont3aWR0aDpmLndpZHRoKCksaGVpZ2h0OmYuaGVpZ2h0KCl9LHRoaXMub3JpZ2luYWxTaXplPXRoaXMuX2hlbHBlcj97d2lkdGg6Zi5vdXRlcldpZHRoKCksaGVpZ2h0OmYub3V0ZXJIZWlnaHQoKX06e3dpZHRoOmYud2lkdGgoKSxoZWlnaHQ6Zi5oZWlnaHQoKX0sdGhpcy5vcmlnaW5hbFBvc2l0aW9uPXtsZWZ0OmcsdG9wOmh9LHRoaXMuc2l6ZURpZmY9e3dpZHRoOmYub3V0ZXJXaWR0aCgpLWYud2lkdGgoKSxoZWlnaHQ6Zi5vdXRlckhlaWdodCgpLWYuaGVpZ2h0KCl9LHRoaXMub3JpZ2luYWxNb3VzZVBvc2l0aW9uPXtsZWZ0OmIucGFnZVgsdG9wOmIucGFnZVl9LHRoaXMuYXNwZWN0UmF0aW89dHlwZW9mIGQuYXNwZWN0UmF0aW89PSJudW1iZXIiP2QuYXNwZWN0UmF0aW86dGhpcy5vcmlnaW5hbFNpemUud2lkdGgvdGhpcy5vcmlnaW5hbFNpemUuaGVpZ2h0fHwxO3ZhciBpPWEoIi51aS1yZXNpemFibGUtIit0aGlzLmF4aXMpLmNzcygiY3Vyc29yIik7cmV0dXJuIGEoImJvZHkiKS5jc3MoImN1cnNvciIsaT09ImF1dG8iP3RoaXMuYXhpcysiLXJlc2l6ZSI6aSksZi5hZGRDbGFzcygidWktcmVzaXphYmxlLXJlc2l6aW5nIiksdGhpcy5fcHJvcGFnYXRlKCJzdGFydCIsYiksITB9LF9tb3VzZURyYWc6ZnVuY3Rpb24oYil7dmFyIGM9dGhpcy5oZWxwZXIsZD10aGlzLm9wdGlvbnMsZT17fSxmPXRoaXMsZz10aGlzLm9yaWdpbmFsTW91c2VQb3NpdGlvbixoPXRoaXMuYXhpcyxpPWIucGFnZVgtZy5sZWZ0fHwwLGo9Yi5wYWdlWS1nLnRvcHx8MCxrPXRoaXMuX2NoYW5nZVtoXTtpZighaylyZXR1cm4hMTt2YXIgbD1rLmFwcGx5KHRoaXMsW2IsaSxqXSksbT1hLmJyb3dzZXIubXNpZSYmYS5icm93c2VyLnZlcnNpb248NyxuPXRoaXMuc2l6ZURpZmY7dGhpcy5fdXBkYXRlVmlydHVhbEJvdW5kYXJpZXMoYi5zaGlmdEtleSk7aWYodGhpcy5fYXNwZWN0UmF0aW98fGIuc2hpZnRLZXkpbD10aGlzLl91cGRhdGVSYXRpbyhsLGIpO3JldHVybiBsPXRoaXMuX3Jlc3BlY3RTaXplKGwsYiksdGhpcy5fcHJvcGFnYXRlKCJyZXNpemUiLGIpLGMuY3NzKHt0b3A6dGhpcy5wb3NpdGlvbi50b3ArInB4IixsZWZ0OnRoaXMucG9zaXRpb24ubGVmdCsicHgiLHdpZHRoOnRoaXMuc2l6ZS53aWR0aCsicHgiLGhlaWdodDp0aGlzLnNpemUuaGVpZ2h0KyJweCJ9KSwhdGhpcy5faGVscGVyJiZ0aGlzLl9wcm9wb3J0aW9uYWxseVJlc2l6ZUVsZW1lbnRzLmxlbmd0aCYmdGhpcy5fcHJvcG9ydGlvbmFsbHlSZXNpemUoKSx0aGlzLl91cGRhdGVDYWNoZShsKSx0aGlzLl90cmlnZ2VyKCJyZXNpemUiLGIsdGhpcy51aSgpKSwhMX0sX21vdXNlU3RvcDpmdW5jdGlvbihiKXt0aGlzLnJlc2l6aW5nPSExO3ZhciBjPXRoaXMub3B0aW9ucyxkPXRoaXM7aWYodGhpcy5faGVscGVyKXt2YXIgZT10aGlzLl9wcm9wb3J0aW9uYWxseVJlc2l6ZUVsZW1lbnRzLGY9ZS5sZW5ndGgmJi90ZXh0YXJlYS9pLnRlc3QoZVswXS5ub2RlTmFtZSksZz1mJiZhLnVpLmhhc1Njcm9sbChlWzBdLCJsZWZ0Iik/MDpkLnNpemVEaWZmLmhlaWdodCxoPWY/MDpkLnNpemVEaWZmLndpZHRoLGk9e3dpZHRoOmQuaGVscGVyLndpZHRoKCktaCxoZWlnaHQ6ZC5oZWxwZXIuaGVpZ2h0KCktZ30saj1wYXJzZUludChkLmVsZW1lbnQuY3NzKCJsZWZ0IiksMTApKyhkLnBvc2l0aW9uLmxlZnQtZC5vcmlnaW5hbFBvc2l0aW9uLmxlZnQpfHxudWxsLGs9cGFyc2VJbnQoZC5lbGVtZW50LmNzcygidG9wIiksMTApKyhkLnBvc2l0aW9uLnRvcC1kLm9yaWdpbmFsUG9zaXRpb24udG9wKXx8bnVsbDtjLmFuaW1hdGV8fHRoaXMuZWxlbWVudC5jc3MoYS5leHRlbmQoaSx7dG9wOmssbGVmdDpqfSkpLGQuaGVscGVyLmhlaWdodChkLnNpemUuaGVpZ2h0KSxkLmhlbHBlci53aWR0aChkLnNpemUud2lkdGgpLHRoaXMuX2hlbHBlciYmIWMuYW5pbWF0ZSYmdGhpcy5fcHJvcG9ydGlvbmFsbHlSZXNpemUoKX1yZXR1cm4gYSgiYm9keSIpLmNzcygiY3Vyc29yIiwiYXV0byIpLHRoaXMuZWxlbWVudC5yZW1vdmVDbGFzcygidWktcmVzaXphYmxlLXJlc2l6aW5nIiksdGhpcy5fcHJvcGFnYXRlKCJzdG9wIixiKSx0aGlzLl9oZWxwZXImJnRoaXMuaGVscGVyLnJlbW92ZSgpLCExfSxfdXBkYXRlVmlydHVhbEJvdW5kYXJpZXM6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLGMsZSxmLGcsaDtoPXttaW5XaWR0aDpkKGIubWluV2lkdGgpP2IubWluV2lkdGg6MCxtYXhXaWR0aDpkKGIubWF4V2lkdGgpP2IubWF4V2lkdGg6SW5maW5pdHksbWluSGVpZ2h0OmQoYi5taW5IZWlnaHQpP2IubWluSGVpZ2h0OjAsbWF4SGVpZ2h0OmQoYi5tYXhIZWlnaHQpP2IubWF4SGVpZ2h0OkluZmluaXR5fTtpZih0aGlzLl9hc3BlY3RSYXRpb3x8YSljPWgubWluSGVpZ2h0KnRoaXMuYXNwZWN0UmF0aW8sZj1oLm1pbldpZHRoL3RoaXMuYXNwZWN0UmF0aW8sZT1oLm1heEhlaWdodCp0aGlzLmFzcGVjdFJhdGlvLGc9aC5tYXhXaWR0aC90aGlzLmFzcGVjdFJhdGlvLGM+aC5taW5XaWR0aCYmKGgubWluV2lkdGg9YyksZj5oLm1pbkhlaWdodCYmKGgubWluSGVpZ2h0PWYpLGU8aC5tYXhXaWR0aCYmKGgubWF4V2lkdGg9ZSksZzxoLm1heEhlaWdodCYmKGgubWF4SGVpZ2h0PWcpO3RoaXMuX3ZCb3VuZGFyaWVzPWh9LF91cGRhdGVDYWNoZTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnM7dGhpcy5vZmZzZXQ9dGhpcy5oZWxwZXIub2Zmc2V0KCksZChhLmxlZnQpJiYodGhpcy5wb3NpdGlvbi5sZWZ0PWEubGVmdCksZChhLnRvcCkmJih0aGlzLnBvc2l0aW9uLnRvcD1hLnRvcCksZChhLmhlaWdodCkmJih0aGlzLnNpemUuaGVpZ2h0PWEuaGVpZ2h0KSxkKGEud2lkdGgpJiYodGhpcy5zaXplLndpZHRoPWEud2lkdGgpfSxfdXBkYXRlUmF0aW86ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzLm9wdGlvbnMsZT10aGlzLnBvc2l0aW9uLGY9dGhpcy5zaXplLGc9dGhpcy5heGlzO3JldHVybiBkKGEuaGVpZ2h0KT9hLndpZHRoPWEuaGVpZ2h0KnRoaXMuYXNwZWN0UmF0aW86ZChhLndpZHRoKSYmKGEuaGVpZ2h0PWEud2lkdGgvdGhpcy5hc3BlY3RSYXRpbyksZz09InN3IiYmKGEubGVmdD1lLmxlZnQrKGYud2lkdGgtYS53aWR0aCksYS50b3A9bnVsbCksZz09Im53IiYmKGEudG9wPWUudG9wKyhmLmhlaWdodC1hLmhlaWdodCksYS5sZWZ0PWUubGVmdCsoZi53aWR0aC1hLndpZHRoKSksYX0sX3Jlc3BlY3RTaXplOmZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpcy5oZWxwZXIsZT10aGlzLl92Qm91bmRhcmllcyxmPXRoaXMuX2FzcGVjdFJhdGlvfHxiLnNoaWZ0S2V5LGc9dGhpcy5heGlzLGg9ZChhLndpZHRoKSYmZS5tYXhXaWR0aCYmZS5tYXhXaWR0aDxhLndpZHRoLGk9ZChhLmhlaWdodCkmJmUubWF4SGVpZ2h0JiZlLm1heEhlaWdodDxhLmhlaWdodCxqPWQoYS53aWR0aCkmJmUubWluV2lkdGgmJmUubWluV2lkdGg+YS53aWR0aCxrPWQoYS5oZWlnaHQpJiZlLm1pbkhlaWdodCYmZS5taW5IZWlnaHQ+YS5oZWlnaHQ7aiYmKGEud2lkdGg9ZS5taW5XaWR0aCksayYmKGEuaGVpZ2h0PWUubWluSGVpZ2h0KSxoJiYoYS53aWR0aD1lLm1heFdpZHRoKSxpJiYoYS5oZWlnaHQ9ZS5tYXhIZWlnaHQpO3ZhciBsPXRoaXMub3JpZ2luYWxQb3NpdGlvbi5sZWZ0K3RoaXMub3JpZ2luYWxTaXplLndpZHRoLG09dGhpcy5wb3NpdGlvbi50b3ArdGhpcy5zaXplLmhlaWdodCxuPS9zd3xud3x3Ly50ZXN0KGcpLG89L253fG5lfG4vLnRlc3QoZyk7aiYmbiYmKGEubGVmdD1sLWUubWluV2lkdGgpLGgmJm4mJihhLmxlZnQ9bC1lLm1heFdpZHRoKSxrJiZvJiYoYS50b3A9bS1lLm1pbkhlaWdodCksaSYmbyYmKGEudG9wPW0tZS5tYXhIZWlnaHQpO3ZhciBwPSFhLndpZHRoJiYhYS5oZWlnaHQ7cmV0dXJuIHAmJiFhLmxlZnQmJmEudG9wP2EudG9wPW51bGw6cCYmIWEudG9wJiZhLmxlZnQmJihhLmxlZnQ9bnVsbCksYX0sX3Byb3BvcnRpb25hbGx5UmVzaXplOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5vcHRpb25zO2lmKCF0aGlzLl9wcm9wb3J0aW9uYWxseVJlc2l6ZUVsZW1lbnRzLmxlbmd0aClyZXR1cm47dmFyIGM9dGhpcy5oZWxwZXJ8fHRoaXMuZWxlbWVudDtmb3IodmFyIGQ9MDtkPHRoaXMuX3Byb3BvcnRpb25hbGx5UmVzaXplRWxlbWVudHMubGVuZ3RoO2QrKyl7dmFyIGU9dGhpcy5fcHJvcG9ydGlvbmFsbHlSZXNpemVFbGVtZW50c1tkXTtpZighdGhpcy5ib3JkZXJEaWYpe3ZhciBmPVtlLmNzcygiYm9yZGVyVG9wV2lkdGgiKSxlLmNzcygiYm9yZGVyUmlnaHRXaWR0aCIpLGUuY3NzKCJib3JkZXJCb3R0b21XaWR0aCIpLGUuY3NzKCJib3JkZXJMZWZ0V2lkdGgiKV0sZz1bZS5jc3MoInBhZGRpbmdUb3AiKSxlLmNzcygicGFkZGluZ1JpZ2h0IiksZS5jc3MoInBhZGRpbmdCb3R0b20iKSxlLmNzcygicGFkZGluZ0xlZnQiKV07dGhpcy5ib3JkZXJEaWY9YS5tYXAoZixmdW5jdGlvbihhLGIpe3ZhciBjPXBhcnNlSW50KGEsMTApfHwwLGQ9cGFyc2VJbnQoZ1tiXSwxMCl8fDA7cmV0dXJuIGMrZH0pfWlmKCFhLmJyb3dzZXIubXNpZXx8IWEoYykuaXMoIjpoaWRkZW4iKSYmIWEoYykucGFyZW50cygiOmhpZGRlbiIpLmxlbmd0aCllLmNzcyh7aGVpZ2h0OmMuaGVpZ2h0KCktdGhpcy5ib3JkZXJEaWZbMF0tdGhpcy5ib3JkZXJEaWZbMl18fDAsd2lkdGg6Yy53aWR0aCgpLXRoaXMuYm9yZGVyRGlmWzFdLXRoaXMuYm9yZGVyRGlmWzNdfHwwfSk7ZWxzZSBjb250aW51ZX19LF9yZW5kZXJQcm94eTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZWxlbWVudCxjPXRoaXMub3B0aW9uczt0aGlzLmVsZW1lbnRPZmZzZXQ9Yi5vZmZzZXQoKTtpZih0aGlzLl9oZWxwZXIpe3RoaXMuaGVscGVyPXRoaXMuaGVscGVyfHxhKCc8ZGl2IHN0eWxlPSJvdmVyZmxvdzpoaWRkZW47Ij48L2Rpdj4nKTt2YXIgZD1hLmJyb3dzZXIubXNpZSYmYS5icm93c2VyLnZlcnNpb248NyxlPWQ/MTowLGY9ZD8yOi0xO3RoaXMuaGVscGVyLmFkZENsYXNzKHRoaXMuX2hlbHBlcikuY3NzKHt3aWR0aDp0aGlzLmVsZW1lbnQub3V0ZXJXaWR0aCgpK2YsaGVpZ2h0OnRoaXMuZWxlbWVudC5vdXRlckhlaWdodCgpK2YscG9zaXRpb246ImFic29sdXRlIixsZWZ0OnRoaXMuZWxlbWVudE9mZnNldC5sZWZ0LWUrInB4Iix0b3A6dGhpcy5lbGVtZW50T2Zmc2V0LnRvcC1lKyJweCIsekluZGV4OisrYy56SW5kZXh9KSx0aGlzLmhlbHBlci5hcHBlbmRUbygiYm9keSIpLmRpc2FibGVTZWxlY3Rpb24oKX1lbHNlIHRoaXMuaGVscGVyPXRoaXMuZWxlbWVudH0sX2NoYW5nZTp7ZTpmdW5jdGlvbihhLGIsYyl7cmV0dXJue3dpZHRoOnRoaXMub3JpZ2luYWxTaXplLndpZHRoK2J9fSx3OmZ1bmN0aW9uKGEsYixjKXt2YXIgZD10aGlzLm9wdGlvbnMsZT10aGlzLm9yaWdpbmFsU2l6ZSxmPXRoaXMub3JpZ2luYWxQb3NpdGlvbjtyZXR1cm57bGVmdDpmLmxlZnQrYix3aWR0aDplLndpZHRoLWJ9fSxuOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD10aGlzLm9wdGlvbnMsZT10aGlzLm9yaWdpbmFsU2l6ZSxmPXRoaXMub3JpZ2luYWxQb3NpdGlvbjtyZXR1cm57dG9wOmYudG9wK2MsaGVpZ2h0OmUuaGVpZ2h0LWN9fSxzOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm57aGVpZ2h0OnRoaXMub3JpZ2luYWxTaXplLmhlaWdodCtjfX0sc2U6ZnVuY3Rpb24oYixjLGQpe3JldHVybiBhLmV4dGVuZCh0aGlzLl9jaGFuZ2Uucy5hcHBseSh0aGlzLGFyZ3VtZW50cyksdGhpcy5fY2hhbmdlLmUuYXBwbHkodGhpcyxbYixjLGRdKSl9LHN3OmZ1bmN0aW9uKGIsYyxkKXtyZXR1cm4gYS5leHRlbmQodGhpcy5fY2hhbmdlLnMuYXBwbHkodGhpcyxhcmd1bWVudHMpLHRoaXMuX2NoYW5nZS53LmFwcGx5KHRoaXMsW2IsYyxkXSkpfSxuZTpmdW5jdGlvbihiLGMsZCl7cmV0dXJuIGEuZXh0ZW5kKHRoaXMuX2NoYW5nZS5uLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlzLl9jaGFuZ2UuZS5hcHBseSh0aGlzLFtiLGMsZF0pKX0sbnc6ZnVuY3Rpb24oYixjLGQpe3JldHVybiBhLmV4dGVuZCh0aGlzLl9jaGFuZ2Uubi5hcHBseSh0aGlzLGFyZ3VtZW50cyksdGhpcy5fY2hhbmdlLncuYXBwbHkodGhpcyxbYixjLGRdKSl9fSxfcHJvcGFnYXRlOmZ1bmN0aW9uKGIsYyl7YS51aS5wbHVnaW4uY2FsbCh0aGlzLGIsW2MsdGhpcy51aSgpXSksYiE9InJlc2l6ZSImJnRoaXMuX3RyaWdnZXIoYixjLHRoaXMudWkoKSl9LHBsdWdpbnM6e30sdWk6ZnVuY3Rpb24oKXtyZXR1cm57b3JpZ2luYWxFbGVtZW50OnRoaXMub3JpZ2luYWxFbGVtZW50LGVsZW1lbnQ6dGhpcy5lbGVtZW50LGhlbHBlcjp0aGlzLmhlbHBlcixwb3NpdGlvbjp0aGlzLnBvc2l0aW9uLHNpemU6dGhpcy5zaXplLG9yaWdpbmFsU2l6ZTp0aGlzLm9yaWdpbmFsU2l6ZSxvcmlnaW5hbFBvc2l0aW9uOnRoaXMub3JpZ2luYWxQb3NpdGlvbn19fSksYS5leHRlbmQoYS51aS5yZXNpemFibGUse3ZlcnNpb246IjEuOC4yMyJ9KSxhLnVpLnBsdWdpbi5hZGQoInJlc2l6YWJsZSIsImFsc29SZXNpemUiLHtzdGFydDpmdW5jdGlvbihiLGMpe3ZhciBkPWEodGhpcykuZGF0YSgicmVzaXphYmxlIiksZT1kLm9wdGlvbnMsZj1mdW5jdGlvbihiKXthKGIpLmVhY2goZnVuY3Rpb24oKXt2YXIgYj1hKHRoaXMpO2IuZGF0YSgicmVzaXphYmxlLWFsc29yZXNpemUiLHt3aWR0aDpwYXJzZUludChiLndpZHRoKCksMTApLGhlaWdodDpwYXJzZUludChiLmhlaWdodCgpLDEwKSxsZWZ0OnBhcnNlSW50KGIuY3NzKCJsZWZ0IiksMTApLHRvcDpwYXJzZUludChiLmNzcygidG9wIiksMTApfSl9KX07dHlwZW9mIGUuYWxzb1Jlc2l6ZT09Im9iamVjdCImJiFlLmFsc29SZXNpemUucGFyZW50Tm9kZT9lLmFsc29SZXNpemUubGVuZ3RoPyhlLmFsc29SZXNpemU9ZS5hbHNvUmVzaXplWzBdLGYoZS5hbHNvUmVzaXplKSk6YS5lYWNoKGUuYWxzb1Jlc2l6ZSxmdW5jdGlvbihhKXtmKGEpfSk6ZihlLmFsc29SZXNpemUpfSxyZXNpemU6ZnVuY3Rpb24oYixjKXt2YXIgZD1hKHRoaXMpLmRhdGEoInJlc2l6YWJsZSIpLGU9ZC5vcHRpb25zLGY9ZC5vcmlnaW5hbFNpemUsZz1kLm9yaWdpbmFsUG9zaXRpb24saD17aGVpZ2h0OmQuc2l6ZS5oZWlnaHQtZi5oZWlnaHR8fDAsd2lkdGg6ZC5zaXplLndpZHRoLWYud2lkdGh8fDAsdG9wOmQucG9zaXRpb24udG9wLWcudG9wfHwwLGxlZnQ6ZC5wb3NpdGlvbi5sZWZ0LWcubGVmdHx8MH0saT1mdW5jdGlvbihiLGQpe2EoYikuZWFjaChmdW5jdGlvbigpe3ZhciBiPWEodGhpcyksZT1hKHRoaXMpLmRhdGEoInJlc2l6YWJsZS1hbHNvcmVzaXplIiksZj17fSxnPWQmJmQubGVuZ3RoP2Q6Yi5wYXJlbnRzKGMub3JpZ2luYWxFbGVtZW50WzBdKS5sZW5ndGg/WyJ3aWR0aCIsImhlaWdodCJdOlsid2lkdGgiLCJoZWlnaHQiLCJ0b3AiLCJsZWZ0Il07YS5lYWNoKGcsZnVuY3Rpb24oYSxiKXt2YXIgYz0oZVtiXXx8MCkrKGhbYl18fDApO2MmJmM+PTAmJihmW2JdPWN8fG51bGwpfSksYi5jc3MoZil9KX07dHlwZW9mIGUuYWxzb1Jlc2l6ZT09Im9iamVjdCImJiFlLmFsc29SZXNpemUubm9kZVR5cGU/YS5lYWNoKGUuYWxzb1Jlc2l6ZSxmdW5jdGlvbihhLGIpe2koYSxiKX0pOmkoZS5hbHNvUmVzaXplKX0sc3RvcDpmdW5jdGlvbihiLGMpe2EodGhpcykucmVtb3ZlRGF0YSgicmVzaXphYmxlLWFsc29yZXNpemUiKX19KSxhLnVpLnBsdWdpbi5hZGQoInJlc2l6YWJsZSIsImFuaW1hdGUiLHtzdG9wOmZ1bmN0aW9uKGIsYyl7dmFyIGQ9YSh0aGlzKS5kYXRhKCJyZXNpemFibGUiKSxlPWQub3B0aW9ucyxmPWQuX3Byb3BvcnRpb25hbGx5UmVzaXplRWxlbWVudHMsZz1mLmxlbmd0aCYmL3RleHRhcmVhL2kudGVzdChmWzBdLm5vZGVOYW1lKSxoPWcmJmEudWkuaGFzU2Nyb2xsKGZbMF0sImxlZnQiKT8wOmQuc2l6ZURpZmYuaGVpZ2h0LGk9Zz8wOmQuc2l6ZURpZmYud2lkdGgsaj17d2lkdGg6ZC5zaXplLndpZHRoLWksaGVpZ2h0OmQuc2l6ZS5oZWlnaHQtaH0saz1wYXJzZUludChkLmVsZW1lbnQuY3NzKCJsZWZ0IiksMTApKyhkLnBvc2l0aW9uLmxlZnQtZC5vcmlnaW5hbFBvc2l0aW9uLmxlZnQpfHxudWxsLGw9cGFyc2VJbnQoZC5lbGVtZW50LmNzcygidG9wIiksMTApKyhkLnBvc2l0aW9uLnRvcC1kLm9yaWdpbmFsUG9zaXRpb24udG9wKXx8bnVsbDtkLmVsZW1lbnQuYW5pbWF0ZShhLmV4dGVuZChqLGwmJms/e3RvcDpsLGxlZnQ6a306e30pLHtkdXJhdGlvbjplLmFuaW1hdGVEdXJhdGlvbixlYXNpbmc6ZS5hbmltYXRlRWFzaW5nLHN0ZXA6ZnVuY3Rpb24oKXt2YXIgYz17d2lkdGg6cGFyc2VJbnQoZC5lbGVtZW50LmNzcygid2lkdGgiKSwxMCksaGVpZ2h0OnBhcnNlSW50KGQuZWxlbWVudC5jc3MoImhlaWdodCIpLDEwKSx0b3A6cGFyc2VJbnQoZC5lbGVtZW50LmNzcygidG9wIiksMTApLGxlZnQ6cGFyc2VJbnQoZC5lbGVtZW50LmNzcygibGVmdCIpLDEwKX07ZiYmZi5sZW5ndGgmJmEoZlswXSkuY3NzKHt3aWR0aDpjLndpZHRoLGhlaWdodDpjLmhlaWdodH0pLGQuX3VwZGF0ZUNhY2hlKGMpLGQuX3Byb3BhZ2F0ZSgicmVzaXplIixiKX19KX19KSxhLnVpLnBsdWdpbi5hZGQoInJlc2l6YWJsZSIsImNvbnRhaW5tZW50Iix7c3RhcnQ6ZnVuY3Rpb24oYixkKXt2YXIgZT1hKHRoaXMpLmRhdGEoInJlc2l6YWJsZSIpLGY9ZS5vcHRpb25zLGc9ZS5lbGVtZW50LGg9Zi5jb250YWlubWVudCxpPWggaW5zdGFuY2VvZiBhP2guZ2V0KDApOi9wYXJlbnQvLnRlc3QoaCk/Zy5wYXJlbnQoKS5nZXQoMCk6aDtpZighaSlyZXR1cm47ZS5jb250YWluZXJFbGVtZW50PWEoaSk7aWYoL2RvY3VtZW50Ly50ZXN0KGgpfHxoPT1kb2N1bWVudCllLmNvbnRhaW5lck9mZnNldD17bGVmdDowLHRvcDowfSxlLmNvbnRhaW5lclBvc2l0aW9uPXtsZWZ0OjAsdG9wOjB9LGUucGFyZW50RGF0YT17ZWxlbWVudDphKGRvY3VtZW50KSxsZWZ0OjAsdG9wOjAsd2lkdGg6YShkb2N1bWVudCkud2lkdGgoKSxoZWlnaHQ6YShkb2N1bWVudCkuaGVpZ2h0KCl8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZS5zY3JvbGxIZWlnaHR9O2Vsc2V7dmFyIGo9YShpKSxrPVtdO2EoWyJUb3AiLCJSaWdodCIsIkxlZnQiLCJCb3R0b20iXSkuZWFjaChmdW5jdGlvbihhLGIpe2tbYV09YyhqLmNzcygicGFkZGluZyIrYikpfSksZS5jb250YWluZXJPZmZzZXQ9ai5vZmZzZXQoKSxlLmNvbnRhaW5lclBvc2l0aW9uPWoucG9zaXRpb24oKSxlLmNvbnRhaW5lclNpemU9e2hlaWdodDpqLmlubmVySGVpZ2h0KCkta1szXSx3aWR0aDpqLmlubmVyV2lkdGgoKS1rWzFdfTt2YXIgbD1lLmNvbnRhaW5lck9mZnNldCxtPWUuY29udGFpbmVyU2l6ZS5oZWlnaHQsbj1lLmNvbnRhaW5lclNpemUud2lkdGgsbz1hLnVpLmhhc1Njcm9sbChpLCJsZWZ0Iik/aS5zY3JvbGxXaWR0aDpuLHA9YS51aS5oYXNTY3JvbGwoaSk/aS5zY3JvbGxIZWlnaHQ6bTtlLnBhcmVudERhdGE9e2VsZW1lbnQ6aSxsZWZ0OmwubGVmdCx0b3A6bC50b3Asd2lkdGg6byxoZWlnaHQ6cH19fSxyZXNpemU6ZnVuY3Rpb24oYixjKXt2YXIgZD1hKHRoaXMpLmRhdGEoInJlc2l6YWJsZSIpLGU9ZC5vcHRpb25zLGY9ZC5jb250YWluZXJTaXplLGc9ZC5jb250YWluZXJPZmZzZXQsaD1kLnNpemUsaT1kLnBvc2l0aW9uLGo9ZC5fYXNwZWN0UmF0aW98fGIuc2hpZnRLZXksaz17dG9wOjAsbGVmdDowfSxsPWQuY29udGFpbmVyRWxlbWVudDtsWzBdIT1kb2N1bWVudCYmL3N0YXRpYy8udGVzdChsLmNzcygicG9zaXRpb24iKSkmJihrPWcpLGkubGVmdDwoZC5faGVscGVyP2cubGVmdDowKSYmKGQuc2l6ZS53aWR0aD1kLnNpemUud2lkdGgrKGQuX2hlbHBlcj9kLnBvc2l0aW9uLmxlZnQtZy5sZWZ0OmQucG9zaXRpb24ubGVmdC1rLmxlZnQpLGomJihkLnNpemUuaGVpZ2h0PWQuc2l6ZS53aWR0aC9kLmFzcGVjdFJhdGlvKSxkLnBvc2l0aW9uLmxlZnQ9ZS5oZWxwZXI/Zy5sZWZ0OjApLGkudG9wPChkLl9oZWxwZXI/Zy50b3A6MCkmJihkLnNpemUuaGVpZ2h0PWQuc2l6ZS5oZWlnaHQrKGQuX2hlbHBlcj9kLnBvc2l0aW9uLnRvcC1nLnRvcDpkLnBvc2l0aW9uLnRvcCksaiYmKGQuc2l6ZS53aWR0aD1kLnNpemUuaGVpZ2h0KmQuYXNwZWN0UmF0aW8pLGQucG9zaXRpb24udG9wPWQuX2hlbHBlcj9nLnRvcDowKSxkLm9mZnNldC5sZWZ0PWQucGFyZW50RGF0YS5sZWZ0K2QucG9zaXRpb24ubGVmdCxkLm9mZnNldC50b3A9ZC5wYXJlbnREYXRhLnRvcCtkLnBvc2l0aW9uLnRvcDt2YXIgbT1NYXRoLmFicygoZC5faGVscGVyP2Qub2Zmc2V0LmxlZnQtay5sZWZ0OmQub2Zmc2V0LmxlZnQtay5sZWZ0KStkLnNpemVEaWZmLndpZHRoKSxuPU1hdGguYWJzKChkLl9oZWxwZXI/ZC5vZmZzZXQudG9wLWsudG9wOmQub2Zmc2V0LnRvcC1nLnRvcCkrZC5zaXplRGlmZi5oZWlnaHQpLG89ZC5jb250YWluZXJFbGVtZW50LmdldCgwKT09ZC5lbGVtZW50LnBhcmVudCgpLmdldCgwKSxwPS9yZWxhdGl2ZXxhYnNvbHV0ZS8udGVzdChkLmNvbnRhaW5lckVsZW1lbnQuY3NzKCJwb3NpdGlvbiIpKTtvJiZwJiYobS09ZC5wYXJlbnREYXRhLmxlZnQpLG0rZC5zaXplLndpZHRoPj1kLnBhcmVudERhdGEud2lkdGgmJihkLnNpemUud2lkdGg9ZC5wYXJlbnREYXRhLndpZHRoLW0saiYmKGQuc2l6ZS5oZWlnaHQ9ZC5zaXplLndpZHRoL2QuYXNwZWN0UmF0aW8pKSxuK2Quc2l6ZS5oZWlnaHQ+PWQucGFyZW50RGF0YS5oZWlnaHQmJihkLnNpemUuaGVpZ2h0PWQucGFyZW50RGF0YS5oZWlnaHQtbixqJiYoZC5zaXplLndpZHRoPWQuc2l6ZS5oZWlnaHQqZC5hc3BlY3RSYXRpbykpfSxzdG9wOmZ1bmN0aW9uKGIsYyl7dmFyIGQ9YSh0aGlzKS5kYXRhKCJyZXNpemFibGUiKSxlPWQub3B0aW9ucyxmPWQucG9zaXRpb24sZz1kLmNvbnRhaW5lck9mZnNldCxoPWQuY29udGFpbmVyUG9zaXRpb24saT1kLmNvbnRhaW5lckVsZW1lbnQsaj1hKGQuaGVscGVyKSxrPWoub2Zmc2V0KCksbD1qLm91dGVyV2lkdGgoKS1kLnNpemVEaWZmLndpZHRoLG09ai5vdXRlckhlaWdodCgpLWQuc2l6ZURpZmYuaGVpZ2h0O2QuX2hlbHBlciYmIWUuYW5pbWF0ZSYmL3JlbGF0aXZlLy50ZXN0KGkuY3NzKCJwb3NpdGlvbiIpKSYmYSh0aGlzKS5jc3Moe2xlZnQ6ay5sZWZ0LWgubGVmdC1nLmxlZnQsd2lkdGg6bCxoZWlnaHQ6bX0pLGQuX2hlbHBlciYmIWUuYW5pbWF0ZSYmL3N0YXRpYy8udGVzdChpLmNzcygicG9zaXRpb24iKSkmJmEodGhpcykuY3NzKHtsZWZ0OmsubGVmdC1oLmxlZnQtZy5sZWZ0LHdpZHRoOmwsaGVpZ2h0Om19KX19KSxhLnVpLnBsdWdpbi5hZGQoInJlc2l6YWJsZSIsImdob3N0Iix7c3RhcnQ6ZnVuY3Rpb24oYixjKXt2YXIgZD1hKHRoaXMpLmRhdGEoInJlc2l6YWJsZSIpLGU9ZC5vcHRpb25zLGY9ZC5zaXplO2QuZ2hvc3Q9ZC5vcmlnaW5hbEVsZW1lbnQuY2xvbmUoKSxkLmdob3N0LmNzcyh7b3BhY2l0eTouMjUsZGlzcGxheToiYmxvY2siLHBvc2l0aW9uOiJyZWxhdGl2ZSIsaGVpZ2h0OmYuaGVpZ2h0LHdpZHRoOmYud2lkdGgsbWFyZ2luOjAsbGVmdDowLHRvcDowfSkuYWRkQ2xhc3MoInVpLXJlc2l6YWJsZS1naG9zdCIpLmFkZENsYXNzKHR5cGVvZiBlLmdob3N0PT0ic3RyaW5nIj9lLmdob3N0OiIiKSxkLmdob3N0LmFwcGVuZFRvKGQuaGVscGVyKX0scmVzaXplOmZ1bmN0aW9uKGIsYyl7dmFyIGQ9YSh0aGlzKS5kYXRhKCJyZXNpemFibGUiKSxlPWQub3B0aW9ucztkLmdob3N0JiZkLmdob3N0LmNzcyh7cG9zaXRpb246InJlbGF0aXZlIixoZWlnaHQ6ZC5zaXplLmhlaWdodCx3aWR0aDpkLnNpemUud2lkdGh9KX0sc3RvcDpmdW5jdGlvbihiLGMpe3ZhciBkPWEodGhpcykuZGF0YSgicmVzaXphYmxlIiksZT1kLm9wdGlvbnM7ZC5naG9zdCYmZC5oZWxwZXImJmQuaGVscGVyLmdldCgwKS5yZW1vdmVDaGlsZChkLmdob3N0LmdldCgwKSl9fSksYS51aS5wbHVnaW4uYWRkKCJyZXNpemFibGUiLCJncmlkIix7cmVzaXplOmZ1bmN0aW9uKGIsYyl7dmFyIGQ9YSh0aGlzKS5kYXRhKCJyZXNpemFibGUiKSxlPWQub3B0aW9ucyxmPWQuc2l6ZSxnPWQub3JpZ2luYWxTaXplLGg9ZC5vcmlnaW5hbFBvc2l0aW9uLGk9ZC5heGlzLGo9ZS5fYXNwZWN0UmF0aW98fGIuc2hpZnRLZXk7ZS5ncmlkPXR5cGVvZiBlLmdyaWQ9PSJudW1iZXIiP1tlLmdyaWQsZS5ncmlkXTplLmdyaWQ7dmFyIGs9TWF0aC5yb3VuZCgoZi53aWR0aC1nLndpZHRoKS8oZS5ncmlkWzBdfHwxKSkqKGUuZ3JpZFswXXx8MSksbD1NYXRoLnJvdW5kKChmLmhlaWdodC1nLmhlaWdodCkvKGUuZ3JpZFsxXXx8MSkpKihlLmdyaWRbMV18fDEpOy9eKHNlfHN8ZSkkLy50ZXN0KGkpPyhkLnNpemUud2lkdGg9Zy53aWR0aCtrLGQuc2l6ZS5oZWlnaHQ9Zy5oZWlnaHQrbCk6L14obmUpJC8udGVzdChpKT8oZC5zaXplLndpZHRoPWcud2lkdGgrayxkLnNpemUuaGVpZ2h0PWcuaGVpZ2h0K2wsZC5wb3NpdGlvbi50b3A9aC50b3AtbCk6L14oc3cpJC8udGVzdChpKT8oZC5zaXplLndpZHRoPWcud2lkdGgrayxkLnNpemUuaGVpZ2h0PWcuaGVpZ2h0K2wsZC5wb3NpdGlvbi5sZWZ0PWgubGVmdC1rKTooZC5zaXplLndpZHRoPWcud2lkdGgrayxkLnNpemUuaGVpZ2h0PWcuaGVpZ2h0K2wsZC5wb3NpdGlvbi50b3A9aC50b3AtbCxkLnBvc2l0aW9uLmxlZnQ9aC5sZWZ0LWspfX0pO3ZhciBjPWZ1bmN0aW9uKGEpe3JldHVybiBwYXJzZUludChhLDEwKXx8MH0sZD1mdW5jdGlvbihhKXtyZXR1cm4haXNOYU4ocGFyc2VJbnQoYSwxMCkpfX0pKGpRdWVyeSk7Oy8qISBqUXVlcnkgVUkgLSB2MS44LjIzIC0gMjAxMi0wOC0xNQotKiBodHRwczovL2dpdGh1Yi5jb20vanF1ZXJ5L2pxdWVyeS11aQotKiBJbmNsdWRlczoganF1ZXJ5LnVpLnNlbGVjdGFibGUuanMKLSogQ29weXJpZ2h0IChjKSAyMDEyIEFVVEhPUlMudHh0OyBMaWNlbnNlZCBNSVQsIEdQTCAqLwotKGZ1bmN0aW9uKGEsYil7YS53aWRnZXQoInVpLnNlbGVjdGFibGUiLGEudWkubW91c2Use29wdGlvbnM6e2FwcGVuZFRvOiJib2R5IixhdXRvUmVmcmVzaDohMCxkaXN0YW5jZTowLGZpbHRlcjoiKiIsdG9sZXJhbmNlOiJ0b3VjaCJ9LF9jcmVhdGU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzO3RoaXMuZWxlbWVudC5hZGRDbGFzcygidWktc2VsZWN0YWJsZSIpLHRoaXMuZHJhZ2dlZD0hMTt2YXIgYzt0aGlzLnJlZnJlc2g9ZnVuY3Rpb24oKXtjPWEoYi5vcHRpb25zLmZpbHRlcixiLmVsZW1lbnRbMF0pLGMuYWRkQ2xhc3MoInVpLXNlbGVjdGVlIiksYy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGI9YSh0aGlzKSxjPWIub2Zmc2V0KCk7YS5kYXRhKHRoaXMsInNlbGVjdGFibGUtaXRlbSIse2VsZW1lbnQ6dGhpcywkZWxlbWVudDpiLGxlZnQ6Yy5sZWZ0LHRvcDpjLnRvcCxyaWdodDpjLmxlZnQrYi5vdXRlcldpZHRoKCksYm90dG9tOmMudG9wK2Iub3V0ZXJIZWlnaHQoKSxzdGFydHNlbGVjdGVkOiExLHNlbGVjdGVkOmIuaGFzQ2xhc3MoInVpLXNlbGVjdGVkIiksc2VsZWN0aW5nOmIuaGFzQ2xhc3MoInVpLXNlbGVjdGluZyIpLHVuc2VsZWN0aW5nOmIuaGFzQ2xhc3MoInVpLXVuc2VsZWN0aW5nIil9KX0pfSx0aGlzLnJlZnJlc2goKSx0aGlzLnNlbGVjdGVlcz1jLmFkZENsYXNzKCJ1aS1zZWxlY3RlZSIpLHRoaXMuX21vdXNlSW5pdCgpLHRoaXMuaGVscGVyPWEoIjxkaXYgY2xhc3M9J3VpLXNlbGVjdGFibGUtaGVscGVyJz48L2Rpdj4iKX0sZGVzdHJveTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnNlbGVjdGVlcy5yZW1vdmVDbGFzcygidWktc2VsZWN0ZWUiKS5yZW1vdmVEYXRhKCJzZWxlY3RhYmxlLWl0ZW0iKSx0aGlzLmVsZW1lbnQucmVtb3ZlQ2xhc3MoInVpLXNlbGVjdGFibGUgdWktc2VsZWN0YWJsZS1kaXNhYmxlZCIpLnJlbW92ZURhdGEoInNlbGVjdGFibGUiKS51bmJpbmQoIi5zZWxlY3RhYmxlIiksdGhpcy5fbW91c2VEZXN0cm95KCksdGhpc30sX21vdXNlU3RhcnQ6ZnVuY3Rpb24oYil7dmFyIGM9dGhpczt0aGlzLm9wb3M9W2IucGFnZVgsYi5wYWdlWV07aWYodGhpcy5vcHRpb25zLmRpc2FibGVkKXJldHVybjt2YXIgZD10aGlzLm9wdGlvbnM7dGhpcy5zZWxlY3RlZXM9YShkLmZpbHRlcix0aGlzLmVsZW1lbnRbMF0pLHRoaXMuX3RyaWdnZXIoInN0YXJ0IixiKSxhKGQuYXBwZW5kVG8pLmFwcGVuZCh0aGlzLmhlbHBlciksdGhpcy5oZWxwZXIuY3NzKHtsZWZ0OmIuY2xpZW50WCx0b3A6Yi5jbGllbnRZLHdpZHRoOjAsaGVpZ2h0OjB9KSxkLmF1dG9SZWZyZXNoJiZ0aGlzLnJlZnJlc2goKSx0aGlzLnNlbGVjdGVlcy5maWx0ZXIoIi51aS1zZWxlY3RlZCIpLmVhY2goZnVuY3Rpb24oKXt2YXIgZD1hLmRhdGEodGhpcywic2VsZWN0YWJsZS1pdGVtIik7ZC5zdGFydHNlbGVjdGVkPSEwLCFiLm1ldGFLZXkmJiFiLmN0cmxLZXkmJihkLiRlbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1zZWxlY3RlZCIpLGQuc2VsZWN0ZWQ9ITEsZC4kZWxlbWVudC5hZGRDbGFzcygidWktdW5zZWxlY3RpbmciKSxkLnVuc2VsZWN0aW5nPSEwLGMuX3RyaWdnZXIoInVuc2VsZWN0aW5nIixiLHt1bnNlbGVjdGluZzpkLmVsZW1lbnR9KSl9KSxhKGIudGFyZ2V0KS5wYXJlbnRzKCkuYW5kU2VsZigpLmVhY2goZnVuY3Rpb24oKXt2YXIgZD1hLmRhdGEodGhpcywic2VsZWN0YWJsZS1pdGVtIik7aWYoZCl7dmFyIGU9IWIubWV0YUtleSYmIWIuY3RybEtleXx8IWQuJGVsZW1lbnQuaGFzQ2xhc3MoInVpLXNlbGVjdGVkIik7cmV0dXJuIGQuJGVsZW1lbnQucmVtb3ZlQ2xhc3MoZT8idWktdW5zZWxlY3RpbmciOiJ1aS1zZWxlY3RlZCIpLmFkZENsYXNzKGU/InVpLXNlbGVjdGluZyI6InVpLXVuc2VsZWN0aW5nIiksZC51bnNlbGVjdGluZz0hZSxkLnNlbGVjdGluZz1lLGQuc2VsZWN0ZWQ9ZSxlP2MuX3RyaWdnZXIoInNlbGVjdGluZyIsYix7c2VsZWN0aW5nOmQuZWxlbWVudH0pOmMuX3RyaWdnZXIoInVuc2VsZWN0aW5nIixiLHt1bnNlbGVjdGluZzpkLmVsZW1lbnR9KSwhMX19KX0sX21vdXNlRHJhZzpmdW5jdGlvbihiKXt2YXIgYz10aGlzO3RoaXMuZHJhZ2dlZD0hMDtpZih0aGlzLm9wdGlvbnMuZGlzYWJsZWQpcmV0dXJuO3ZhciBkPXRoaXMub3B0aW9ucyxlPXRoaXMub3Bvc1swXSxmPXRoaXMub3Bvc1sxXSxnPWIucGFnZVgsaD1iLnBhZ2VZO2lmKGU+Zyl7dmFyIGk9ZztnPWUsZT1pfWlmKGY+aCl7dmFyIGk9aDtoPWYsZj1pfXJldHVybiB0aGlzLmhlbHBlci5jc3Moe2xlZnQ6ZSx0b3A6Zix3aWR0aDpnLWUsaGVpZ2h0OmgtZn0pLHRoaXMuc2VsZWN0ZWVzLmVhY2goZnVuY3Rpb24oKXt2YXIgaT1hLmRhdGEodGhpcywic2VsZWN0YWJsZS1pdGVtIik7aWYoIWl8fGkuZWxlbWVudD09Yy5lbGVtZW50WzBdKXJldHVybjt2YXIgaj0hMTtkLnRvbGVyYW5jZT09InRvdWNoIj9qPSEoaS5sZWZ0Pmd8fGkucmlnaHQ8ZXx8aS50b3A+aHx8aS5ib3R0b208Zik6ZC50b2xlcmFuY2U9PSJmaXQiJiYoaj1pLmxlZnQ+ZSYmaS5yaWdodDxnJiZpLnRvcD5mJiZpLmJvdHRvbTxoKSxqPyhpLnNlbGVjdGVkJiYoaS4kZWxlbWVudC5yZW1vdmVDbGFzcygidWktc2VsZWN0ZWQiKSxpLnNlbGVjdGVkPSExKSxpLnVuc2VsZWN0aW5nJiYoaS4kZWxlbWVudC5yZW1vdmVDbGFzcygidWktdW5zZWxlY3RpbmciKSxpLnVuc2VsZWN0aW5nPSExKSxpLnNlbGVjdGluZ3x8KGkuJGVsZW1lbnQuYWRkQ2xhc3MoInVpLXNlbGVjdGluZyIpLGkuc2VsZWN0aW5nPSEwLGMuX3RyaWdnZXIoInNlbGVjdGluZyIsYix7c2VsZWN0aW5nOmkuZWxlbWVudH0pKSk6KGkuc2VsZWN0aW5nJiYoKGIubWV0YUtleXx8Yi5jdHJsS2V5KSYmaS5zdGFydHNlbGVjdGVkPyhpLiRlbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1zZWxlY3RpbmciKSxpLnNlbGVjdGluZz0hMSxpLiRlbGVtZW50LmFkZENsYXNzKCJ1aS1zZWxlY3RlZCIpLGkuc2VsZWN0ZWQ9ITApOihpLiRlbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1zZWxlY3RpbmciKSxpLnNlbGVjdGluZz0hMSxpLnN0YXJ0c2VsZWN0ZWQmJihpLiRlbGVtZW50LmFkZENsYXNzKCJ1aS11bnNlbGVjdGluZyIpLGkudW5zZWxlY3Rpbmc9ITApLGMuX3RyaWdnZXIoInVuc2VsZWN0aW5nIixiLHt1bnNlbGVjdGluZzppLmVsZW1lbnR9KSkpLGkuc2VsZWN0ZWQmJiFiLm1ldGFLZXkmJiFiLmN0cmxLZXkmJiFpLnN0YXJ0c2VsZWN0ZWQmJihpLiRlbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1zZWxlY3RlZCIpLGkuc2VsZWN0ZWQ9ITEsaS4kZWxlbWVudC5hZGRDbGFzcygidWktdW5zZWxlY3RpbmciKSxpLnVuc2VsZWN0aW5nPSEwLGMuX3RyaWdnZXIoInVuc2VsZWN0aW5nIixiLHt1bnNlbGVjdGluZzppLmVsZW1lbnR9KSkpfSksITF9LF9tb3VzZVN0b3A6ZnVuY3Rpb24oYil7dmFyIGM9dGhpczt0aGlzLmRyYWdnZWQ9ITE7dmFyIGQ9dGhpcy5vcHRpb25zO3JldHVybiBhKCIudWktdW5zZWxlY3RpbmciLHRoaXMuZWxlbWVudFswXSkuZWFjaChmdW5jdGlvbigpe3ZhciBkPWEuZGF0YSh0aGlzLCJzZWxlY3RhYmxlLWl0ZW0iKTtkLiRlbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS11bnNlbGVjdGluZyIpLGQudW5zZWxlY3Rpbmc9ITEsZC5zdGFydHNlbGVjdGVkPSExLGMuX3RyaWdnZXIoInVuc2VsZWN0ZWQiLGIse3Vuc2VsZWN0ZWQ6ZC5lbGVtZW50fSl9KSxhKCIudWktc2VsZWN0aW5nIix0aGlzLmVsZW1lbnRbMF0pLmVhY2goZnVuY3Rpb24oKXt2YXIgZD1hLmRhdGEodGhpcywic2VsZWN0YWJsZS1pdGVtIik7ZC4kZWxlbWVudC5yZW1vdmVDbGFzcygidWktc2VsZWN0aW5nIikuYWRkQ2xhc3MoInVpLXNlbGVjdGVkIiksZC5zZWxlY3Rpbmc9ITEsZC5zZWxlY3RlZD0hMCxkLnN0YXJ0c2VsZWN0ZWQ9ITAsYy5fdHJpZ2dlcigic2VsZWN0ZWQiLGIse3NlbGVjdGVkOmQuZWxlbWVudH0pfSksdGhpcy5fdHJpZ2dlcigic3RvcCIsYiksdGhpcy5oZWxwZXIucmVtb3ZlKCksITF9fSksYS5leHRlbmQoYS51aS5zZWxlY3RhYmxlLHt2ZXJzaW9uOiIxLjguMjMifSl9KShqUXVlcnkpOzsvKiEgalF1ZXJ5IFVJIC0gdjEuOC4yMyAtIDIwMTItMDgtMTUKLSogaHR0cHM6Ly9naXRodWIuY29tL2pxdWVyeS9qcXVlcnktdWkKLSogSW5jbHVkZXM6IGpxdWVyeS51aS5zb3J0YWJsZS5qcwotKiBDb3B5cmlnaHQgKGMpIDIwMTIgQVVUSE9SUy50eHQ7IExpY2Vuc2VkIE1JVCwgR1BMICovCi0oZnVuY3Rpb24oYSxiKXthLndpZGdldCgidWkuc29ydGFibGUiLGEudWkubW91c2Use3dpZGdldEV2ZW50UHJlZml4OiJzb3J0IixyZWFkeTohMSxvcHRpb25zOnthcHBlbmRUbzoicGFyZW50IixheGlzOiExLGNvbm5lY3RXaXRoOiExLGNvbnRhaW5tZW50OiExLGN1cnNvcjoiYXV0byIsY3Vyc29yQXQ6ITEsZHJvcE9uRW1wdHk6ITAsZm9yY2VQbGFjZWhvbGRlclNpemU6ITEsZm9yY2VIZWxwZXJTaXplOiExLGdyaWQ6ITEsaGFuZGxlOiExLGhlbHBlcjoib3JpZ2luYWwiLGl0ZW1zOiI+ICoiLG9wYWNpdHk6ITEscGxhY2Vob2xkZXI6ITEscmV2ZXJ0OiExLHNjcm9sbDohMCxzY3JvbGxTZW5zaXRpdml0eToyMCxzY3JvbGxTcGVlZDoyMCxzY29wZToiZGVmYXVsdCIsdG9sZXJhbmNlOiJpbnRlcnNlY3QiLHpJbmRleDoxZTN9LF9jcmVhdGU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLm9wdGlvbnM7dGhpcy5jb250YWluZXJDYWNoZT17fSx0aGlzLmVsZW1lbnQuYWRkQ2xhc3MoInVpLXNvcnRhYmxlIiksdGhpcy5yZWZyZXNoKCksdGhpcy5mbG9hdGluZz10aGlzLml0ZW1zLmxlbmd0aD9hLmF4aXM9PT0ieCJ8fC9sZWZ0fHJpZ2h0Ly50ZXN0KHRoaXMuaXRlbXNbMF0uaXRlbS5jc3MoImZsb2F0IikpfHwvaW5saW5lfHRhYmxlLWNlbGwvLnRlc3QodGhpcy5pdGVtc1swXS5pdGVtLmNzcygiZGlzcGxheSIpKTohMSx0aGlzLm9mZnNldD10aGlzLmVsZW1lbnQub2Zmc2V0KCksdGhpcy5fbW91c2VJbml0KCksdGhpcy5yZWFkeT0hMH0sZGVzdHJveTpmdW5jdGlvbigpe2EuV2lkZ2V0LnByb3RvdHlwZS5kZXN0cm95LmNhbGwodGhpcyksdGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1zb3J0YWJsZSB1aS1zb3J0YWJsZS1kaXNhYmxlZCIpLHRoaXMuX21vdXNlRGVzdHJveSgpO2Zvcih2YXIgYj10aGlzLml0ZW1zLmxlbmd0aC0xO2I+PTA7Yi0tKXRoaXMuaXRlbXNbYl0uaXRlbS5yZW1vdmVEYXRhKHRoaXMud2lkZ2V0TmFtZSsiLWl0ZW0iKTtyZXR1cm4gdGhpc30sX3NldE9wdGlvbjpmdW5jdGlvbihiLGMpe2I9PT0iZGlzYWJsZWQiPyh0aGlzLm9wdGlvbnNbYl09Yyx0aGlzLndpZGdldCgpW2M/ImFkZENsYXNzIjoicmVtb3ZlQ2xhc3MiXSgidWktc29ydGFibGUtZGlzYWJsZWQiKSk6YS5XaWRnZXQucHJvdG90eXBlLl9zZXRPcHRpb24uYXBwbHkodGhpcyxhcmd1bWVudHMpfSxfbW91c2VDYXB0dXJlOmZ1bmN0aW9uKGIsYyl7dmFyIGQ9dGhpcztpZih0aGlzLnJldmVydGluZylyZXR1cm4hMTtpZih0aGlzLm9wdGlvbnMuZGlzYWJsZWR8fHRoaXMub3B0aW9ucy50eXBlPT0ic3RhdGljIilyZXR1cm4hMTt0aGlzLl9yZWZyZXNoSXRlbXMoYik7dmFyIGU9bnVsbCxmPXRoaXMsZz1hKGIudGFyZ2V0KS5wYXJlbnRzKCkuZWFjaChmdW5jdGlvbigpe2lmKGEuZGF0YSh0aGlzLGQud2lkZ2V0TmFtZSsiLWl0ZW0iKT09ZilyZXR1cm4gZT1hKHRoaXMpLCExfSk7YS5kYXRhKGIudGFyZ2V0LGQud2lkZ2V0TmFtZSsiLWl0ZW0iKT09ZiYmKGU9YShiLnRhcmdldCkpO2lmKCFlKXJldHVybiExO2lmKHRoaXMub3B0aW9ucy5oYW5kbGUmJiFjKXt2YXIgaD0hMTthKHRoaXMub3B0aW9ucy5oYW5kbGUsZSkuZmluZCgiKiIpLmFuZFNlbGYoKS5lYWNoKGZ1bmN0aW9uKCl7dGhpcz09Yi50YXJnZXQmJihoPSEwKX0pO2lmKCFoKXJldHVybiExfXJldHVybiB0aGlzLmN1cnJlbnRJdGVtPWUsdGhpcy5fcmVtb3ZlQ3VycmVudHNGcm9tSXRlbXMoKSwhMH0sX21vdXNlU3RhcnQ6ZnVuY3Rpb24oYixjLGQpe3ZhciBlPXRoaXMub3B0aW9ucyxmPXRoaXM7dGhpcy5jdXJyZW50Q29udGFpbmVyPXRoaXMsdGhpcy5yZWZyZXNoUG9zaXRpb25zKCksdGhpcy5oZWxwZXI9dGhpcy5fY3JlYXRlSGVscGVyKGIpLHRoaXMuX2NhY2hlSGVscGVyUHJvcG9ydGlvbnMoKSx0aGlzLl9jYWNoZU1hcmdpbnMoKSx0aGlzLnNjcm9sbFBhcmVudD10aGlzLmhlbHBlci5zY3JvbGxQYXJlbnQoKSx0aGlzLm9mZnNldD10aGlzLmN1cnJlbnRJdGVtLm9mZnNldCgpLHRoaXMub2Zmc2V0PXt0b3A6dGhpcy5vZmZzZXQudG9wLXRoaXMubWFyZ2lucy50b3AsbGVmdDp0aGlzLm9mZnNldC5sZWZ0LXRoaXMubWFyZ2lucy5sZWZ0fSxhLmV4dGVuZCh0aGlzLm9mZnNldCx7Y2xpY2s6e2xlZnQ6Yi5wYWdlWC10aGlzLm9mZnNldC5sZWZ0LHRvcDpiLnBhZ2VZLXRoaXMub2Zmc2V0LnRvcH0scGFyZW50OnRoaXMuX2dldFBhcmVudE9mZnNldCgpLHJlbGF0aXZlOnRoaXMuX2dldFJlbGF0aXZlT2Zmc2V0KCl9KSx0aGlzLmhlbHBlci5jc3MoInBvc2l0aW9uIiwiYWJzb2x1dGUiKSx0aGlzLmNzc1Bvc2l0aW9uPXRoaXMuaGVscGVyLmNzcygicG9zaXRpb24iKSx0aGlzLm9yaWdpbmFsUG9zaXRpb249dGhpcy5fZ2VuZXJhdGVQb3NpdGlvbihiKSx0aGlzLm9yaWdpbmFsUGFnZVg9Yi5wYWdlWCx0aGlzLm9yaWdpbmFsUGFnZVk9Yi5wYWdlWSxlLmN1cnNvckF0JiZ0aGlzLl9hZGp1c3RPZmZzZXRGcm9tSGVscGVyKGUuY3Vyc29yQXQpLHRoaXMuZG9tUG9zaXRpb249e3ByZXY6dGhpcy5jdXJyZW50SXRlbS5wcmV2KClbMF0scGFyZW50OnRoaXMuY3VycmVudEl0ZW0ucGFyZW50KClbMF19LHRoaXMuaGVscGVyWzBdIT10aGlzLmN1cnJlbnRJdGVtWzBdJiZ0aGlzLmN1cnJlbnRJdGVtLmhpZGUoKSx0aGlzLl9jcmVhdGVQbGFjZWhvbGRlcigpLGUuY29udGFpbm1lbnQmJnRoaXMuX3NldENvbnRhaW5tZW50KCksZS5jdXJzb3ImJihhKCJib2R5IikuY3NzKCJjdXJzb3IiKSYmKHRoaXMuX3N0b3JlZEN1cnNvcj1hKCJib2R5IikuY3NzKCJjdXJzb3IiKSksYSgiYm9keSIpLmNzcygiY3Vyc29yIixlLmN1cnNvcikpLGUub3BhY2l0eSYmKHRoaXMuaGVscGVyLmNzcygib3BhY2l0eSIpJiYodGhpcy5fc3RvcmVkT3BhY2l0eT10aGlzLmhlbHBlci5jc3MoIm9wYWNpdHkiKSksdGhpcy5oZWxwZXIuY3NzKCJvcGFjaXR5IixlLm9wYWNpdHkpKSxlLnpJbmRleCYmKHRoaXMuaGVscGVyLmNzcygiekluZGV4IikmJih0aGlzLl9zdG9yZWRaSW5kZXg9dGhpcy5oZWxwZXIuY3NzKCJ6SW5kZXgiKSksdGhpcy5oZWxwZXIuY3NzKCJ6SW5kZXgiLGUuekluZGV4KSksdGhpcy5zY3JvbGxQYXJlbnRbMF0hPWRvY3VtZW50JiZ0aGlzLnNjcm9sbFBhcmVudFswXS50YWdOYW1lIT0iSFRNTCImJih0aGlzLm92ZXJmbG93T2Zmc2V0PXRoaXMuc2Nyb2xsUGFyZW50Lm9mZnNldCgpKSx0aGlzLl90cmlnZ2VyKCJzdGFydCIsYix0aGlzLl91aUhhc2goKSksdGhpcy5fcHJlc2VydmVIZWxwZXJQcm9wb3J0aW9uc3x8dGhpcy5fY2FjaGVIZWxwZXJQcm9wb3J0aW9ucygpO2lmKCFkKWZvcih2YXIgZz10aGlzLmNvbnRhaW5lcnMubGVuZ3RoLTE7Zz49MDtnLS0pdGhpcy5jb250YWluZXJzW2ddLl90cmlnZ2VyKCJhY3RpdmF0ZSIsYixmLl91aUhhc2godGhpcykpO3JldHVybiBhLnVpLmRkbWFuYWdlciYmKGEudWkuZGRtYW5hZ2VyLmN1cnJlbnQ9dGhpcyksYS51aS5kZG1hbmFnZXImJiFlLmRyb3BCZWhhdmlvdXImJmEudWkuZGRtYW5hZ2VyLnByZXBhcmVPZmZzZXRzKHRoaXMsYiksdGhpcy5kcmFnZ2luZz0hMCx0aGlzLmhlbHBlci5hZGRDbGFzcygidWktc29ydGFibGUtaGVscGVyIiksdGhpcy5fbW91c2VEcmFnKGIpLCEwfSxfbW91c2VEcmFnOmZ1bmN0aW9uKGIpe3RoaXMucG9zaXRpb249dGhpcy5fZ2VuZXJhdGVQb3NpdGlvbihiKSx0aGlzLnBvc2l0aW9uQWJzPXRoaXMuX2NvbnZlcnRQb3NpdGlvblRvKCJhYnNvbHV0ZSIpLHRoaXMubGFzdFBvc2l0aW9uQWJzfHwodGhpcy5sYXN0UG9zaXRpb25BYnM9dGhpcy5wb3NpdGlvbkFicyk7aWYodGhpcy5vcHRpb25zLnNjcm9sbCl7dmFyIGM9dGhpcy5vcHRpb25zLGQ9ITE7dGhpcy5zY3JvbGxQYXJlbnRbMF0hPWRvY3VtZW50JiZ0aGlzLnNjcm9sbFBhcmVudFswXS50YWdOYW1lIT0iSFRNTCI/KHRoaXMub3ZlcmZsb3dPZmZzZXQudG9wK3RoaXMuc2Nyb2xsUGFyZW50WzBdLm9mZnNldEhlaWdodC1iLnBhZ2VZPGMuc2Nyb2xsU2Vuc2l0aXZpdHk/dGhpcy5zY3JvbGxQYXJlbnRbMF0uc2Nyb2xsVG9wPWQ9dGhpcy5zY3JvbGxQYXJlbnRbMF0uc2Nyb2xsVG9wK2Muc2Nyb2xsU3BlZWQ6Yi5wYWdlWS10aGlzLm92ZXJmbG93T2Zmc2V0LnRvcDxjLnNjcm9sbFNlbnNpdGl2aXR5JiYodGhpcy5zY3JvbGxQYXJlbnRbMF0uc2Nyb2xsVG9wPWQ9dGhpcy5zY3JvbGxQYXJlbnRbMF0uc2Nyb2xsVG9wLWMuc2Nyb2xsU3BlZWQpLHRoaXMub3ZlcmZsb3dPZmZzZXQubGVmdCt0aGlzLnNjcm9sbFBhcmVudFswXS5vZmZzZXRXaWR0aC1iLnBhZ2VYPGMuc2Nyb2xsU2Vuc2l0aXZpdHk/dGhpcy5zY3JvbGxQYXJlbnRbMF0uc2Nyb2xsTGVmdD1kPXRoaXMuc2Nyb2xsUGFyZW50WzBdLnNjcm9sbExlZnQrYy5zY3JvbGxTcGVlZDpiLnBhZ2VYLXRoaXMub3ZlcmZsb3dPZmZzZXQubGVmdDxjLnNjcm9sbFNlbnNpdGl2aXR5JiYodGhpcy5zY3JvbGxQYXJlbnRbMF0uc2Nyb2xsTGVmdD1kPXRoaXMuc2Nyb2xsUGFyZW50WzBdLnNjcm9sbExlZnQtYy5zY3JvbGxTcGVlZCkpOihiLnBhZ2VZLWEoZG9jdW1lbnQpLnNjcm9sbFRvcCgpPGMuc2Nyb2xsU2Vuc2l0aXZpdHk/ZD1hKGRvY3VtZW50KS5zY3JvbGxUb3AoYShkb2N1bWVudCkuc2Nyb2xsVG9wKCktYy5zY3JvbGxTcGVlZCk6YSh3aW5kb3cpLmhlaWdodCgpLShiLnBhZ2VZLWEoZG9jdW1lbnQpLnNjcm9sbFRvcCgpKTxjLnNjcm9sbFNlbnNpdGl2aXR5JiYoZD1hKGRvY3VtZW50KS5zY3JvbGxUb3AoYShkb2N1bWVudCkuc2Nyb2xsVG9wKCkrYy5zY3JvbGxTcGVlZCkpLGIucGFnZVgtYShkb2N1bWVudCkuc2Nyb2xsTGVmdCgpPGMuc2Nyb2xsU2Vuc2l0aXZpdHk/ZD1hKGRvY3VtZW50KS5zY3JvbGxMZWZ0KGEoZG9jdW1lbnQpLnNjcm9sbExlZnQoKS1jLnNjcm9sbFNwZWVkKTphKHdpbmRvdykud2lkdGgoKS0oYi5wYWdlWC1hKGRvY3VtZW50KS5zY3JvbGxMZWZ0KCkpPGMuc2Nyb2xsU2Vuc2l0aXZpdHkmJihkPWEoZG9jdW1lbnQpLnNjcm9sbExlZnQoYShkb2N1bWVudCkuc2Nyb2xsTGVmdCgpK2Muc2Nyb2xsU3BlZWQpKSksZCE9PSExJiZhLnVpLmRkbWFuYWdlciYmIWMuZHJvcEJlaGF2aW91ciYmYS51aS5kZG1hbmFnZXIucHJlcGFyZU9mZnNldHModGhpcyxiKX10aGlzLnBvc2l0aW9uQWJzPXRoaXMuX2NvbnZlcnRQb3NpdGlvblRvKCJhYnNvbHV0ZSIpO2lmKCF0aGlzLm9wdGlvbnMuYXhpc3x8dGhpcy5vcHRpb25zLmF4aXMhPSJ5Iil0aGlzLmhlbHBlclswXS5zdHlsZS5sZWZ0PXRoaXMucG9zaXRpb24ubGVmdCsicHgiO2lmKCF0aGlzLm9wdGlvbnMuYXhpc3x8dGhpcy5vcHRpb25zLmF4aXMhPSJ4Iil0aGlzLmhlbHBlclswXS5zdHlsZS50b3A9dGhpcy5wb3NpdGlvbi50b3ArInB4Ijtmb3IodmFyIGU9dGhpcy5pdGVtcy5sZW5ndGgtMTtlPj0wO2UtLSl7dmFyIGY9dGhpcy5pdGVtc1tlXSxnPWYuaXRlbVswXSxoPXRoaXMuX2ludGVyc2VjdHNXaXRoUG9pbnRlcihmKTtpZighaCljb250aW51ZTtpZihnIT10aGlzLmN1cnJlbnRJdGVtWzBdJiZ0aGlzLnBsYWNlaG9sZGVyW2g9PTE/Im5leHQiOiJwcmV2Il0oKVswXSE9ZyYmIWEudWkuY29udGFpbnModGhpcy5wbGFjZWhvbGRlclswXSxnKSYmKHRoaXMub3B0aW9ucy50eXBlPT0ic2VtaS1keW5hbWljIj8hYS51aS5jb250YWlucyh0aGlzLmVsZW1lbnRbMF0sZyk6ITApKXt0aGlzLmRpcmVjdGlvbj1oPT0xPyJkb3duIjoidXAiO2lmKHRoaXMub3B0aW9ucy50b2xlcmFuY2U9PSJwb2ludGVyInx8dGhpcy5faW50ZXJzZWN0c1dpdGhTaWRlcyhmKSl0aGlzLl9yZWFycmFuZ2UoYixmKTtlbHNlIGJyZWFrO3RoaXMuX3RyaWdnZXIoImNoYW5nZSIsYix0aGlzLl91aUhhc2goKSk7YnJlYWt9fXJldHVybiB0aGlzLl9jb250YWN0Q29udGFpbmVycyhiKSxhLnVpLmRkbWFuYWdlciYmYS51aS5kZG1hbmFnZXIuZHJhZyh0aGlzLGIpLHRoaXMuX3RyaWdnZXIoInNvcnQiLGIsdGhpcy5fdWlIYXNoKCkpLHRoaXMubGFzdFBvc2l0aW9uQWJzPXRoaXMucG9zaXRpb25BYnMsITF9LF9tb3VzZVN0b3A6ZnVuY3Rpb24oYixjKXtpZighYilyZXR1cm47YS51aS5kZG1hbmFnZXImJiF0aGlzLm9wdGlvbnMuZHJvcEJlaGF2aW91ciYmYS51aS5kZG1hbmFnZXIuZHJvcCh0aGlzLGIpO2lmKHRoaXMub3B0aW9ucy5yZXZlcnQpe3ZhciBkPXRoaXMsZT1kLnBsYWNlaG9sZGVyLm9mZnNldCgpO2QucmV2ZXJ0aW5nPSEwLGEodGhpcy5oZWxwZXIpLmFuaW1hdGUoe2xlZnQ6ZS5sZWZ0LXRoaXMub2Zmc2V0LnBhcmVudC5sZWZ0LWQubWFyZ2lucy5sZWZ0Kyh0aGlzLm9mZnNldFBhcmVudFswXT09ZG9jdW1lbnQuYm9keT8wOnRoaXMub2Zmc2V0UGFyZW50WzBdLnNjcm9sbExlZnQpLHRvcDplLnRvcC10aGlzLm9mZnNldC5wYXJlbnQudG9wLWQubWFyZ2lucy50b3ArKHRoaXMub2Zmc2V0UGFyZW50WzBdPT1kb2N1bWVudC5ib2R5PzA6dGhpcy5vZmZzZXRQYXJlbnRbMF0uc2Nyb2xsVG9wKX0scGFyc2VJbnQodGhpcy5vcHRpb25zLnJldmVydCwxMCl8fDUwMCxmdW5jdGlvbigpe2QuX2NsZWFyKGIpfSl9ZWxzZSB0aGlzLl9jbGVhcihiLGMpO3JldHVybiExfSxjYW5jZWw6ZnVuY3Rpb24oKXt2YXIgYj10aGlzO2lmKHRoaXMuZHJhZ2dpbmcpe3RoaXMuX21vdXNlVXAoe3RhcmdldDpudWxsfSksdGhpcy5vcHRpb25zLmhlbHBlcj09Im9yaWdpbmFsIj90aGlzLmN1cnJlbnRJdGVtLmNzcyh0aGlzLl9zdG9yZWRDU1MpLnJlbW92ZUNsYXNzKCJ1aS1zb3J0YWJsZS1oZWxwZXIiKTp0aGlzLmN1cnJlbnRJdGVtLnNob3coKTtmb3IodmFyIGM9dGhpcy5jb250YWluZXJzLmxlbmd0aC0xO2M+PTA7Yy0tKXRoaXMuY29udGFpbmVyc1tjXS5fdHJpZ2dlcigiZGVhY3RpdmF0ZSIsbnVsbCxiLl91aUhhc2godGhpcykpLHRoaXMuY29udGFpbmVyc1tjXS5jb250YWluZXJDYWNoZS5vdmVyJiYodGhpcy5jb250YWluZXJzW2NdLl90cmlnZ2VyKCJvdXQiLG51bGwsYi5fdWlIYXNoKHRoaXMpKSx0aGlzLmNvbnRhaW5lcnNbY10uY29udGFpbmVyQ2FjaGUub3Zlcj0wKX1yZXR1cm4gdGhpcy5wbGFjZWhvbGRlciYmKHRoaXMucGxhY2Vob2xkZXJbMF0ucGFyZW50Tm9kZSYmdGhpcy5wbGFjZWhvbGRlclswXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMucGxhY2Vob2xkZXJbMF0pLHRoaXMub3B0aW9ucy5oZWxwZXIhPSJvcmlnaW5hbCImJnRoaXMuaGVscGVyJiZ0aGlzLmhlbHBlclswXS5wYXJlbnROb2RlJiZ0aGlzLmhlbHBlci5yZW1vdmUoKSxhLmV4dGVuZCh0aGlzLHtoZWxwZXI6bnVsbCxkcmFnZ2luZzohMSxyZXZlcnRpbmc6ITEsX25vRmluYWxTb3J0Om51bGx9KSx0aGlzLmRvbVBvc2l0aW9uLnByZXY/YSh0aGlzLmRvbVBvc2l0aW9uLnByZXYpLmFmdGVyKHRoaXMuY3VycmVudEl0ZW0pOmEodGhpcy5kb21Qb3NpdGlvbi5wYXJlbnQpLnByZXBlbmQodGhpcy5jdXJyZW50SXRlbSkpLHRoaXN9LHNlcmlhbGl6ZTpmdW5jdGlvbihiKXt2YXIgYz10aGlzLl9nZXRJdGVtc0FzalF1ZXJ5KGImJmIuY29ubmVjdGVkKSxkPVtdO3JldHVybiBiPWJ8fHt9LGEoYykuZWFjaChmdW5jdGlvbigpe3ZhciBjPShhKGIuaXRlbXx8dGhpcykuYXR0cihiLmF0dHJpYnV0ZXx8ImlkIil8fCIiKS5tYXRjaChiLmV4cHJlc3Npb258fC8oLispWy09X10oLispLyk7YyYmZC5wdXNoKChiLmtleXx8Y1sxXSsiW10iKSsiPSIrKGIua2V5JiZiLmV4cHJlc3Npb24/Y1sxXTpjWzJdKSl9KSwhZC5sZW5ndGgmJmIua2V5JiZkLnB1c2goYi5rZXkrIj0iKSxkLmpvaW4oIiYiKX0sdG9BcnJheTpmdW5jdGlvbihiKXt2YXIgYz10aGlzLl9nZXRJdGVtc0FzalF1ZXJ5KGImJmIuY29ubmVjdGVkKSxkPVtdO3JldHVybiBiPWJ8fHt9LGMuZWFjaChmdW5jdGlvbigpe2QucHVzaChhKGIuaXRlbXx8dGhpcykuYXR0cihiLmF0dHJpYnV0ZXx8ImlkIil8fCIiKX0pLGR9LF9pbnRlcnNlY3RzV2l0aDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnBvc2l0aW9uQWJzLmxlZnQsYz1iK3RoaXMuaGVscGVyUHJvcG9ydGlvbnMud2lkdGgsZD10aGlzLnBvc2l0aW9uQWJzLnRvcCxlPWQrdGhpcy5oZWxwZXJQcm9wb3J0aW9ucy5oZWlnaHQsZj1hLmxlZnQsZz1mK2Eud2lkdGgsaD1hLnRvcCxpPWgrYS5oZWlnaHQsaj10aGlzLm9mZnNldC5jbGljay50b3Asaz10aGlzLm9mZnNldC5jbGljay5sZWZ0LGw9ZCtqPmgmJmQrajxpJiZiK2s+ZiYmYitrPGc7cmV0dXJuIHRoaXMub3B0aW9ucy50b2xlcmFuY2U9PSJwb2ludGVyInx8dGhpcy5vcHRpb25zLmZvcmNlUG9pbnRlckZvckNvbnRhaW5lcnN8fHRoaXMub3B0aW9ucy50b2xlcmFuY2UhPSJwb2ludGVyIiYmdGhpcy5oZWxwZXJQcm9wb3J0aW9uc1t0aGlzLmZsb2F0aW5nPyJ3aWR0aCI6ImhlaWdodCJdPmFbdGhpcy5mbG9hdGluZz8id2lkdGgiOiJoZWlnaHQiXT9sOmY8Yit0aGlzLmhlbHBlclByb3BvcnRpb25zLndpZHRoLzImJmMtdGhpcy5oZWxwZXJQcm9wb3J0aW9ucy53aWR0aC8yPGcmJmg8ZCt0aGlzLmhlbHBlclByb3BvcnRpb25zLmhlaWdodC8yJiZlLXRoaXMuaGVscGVyUHJvcG9ydGlvbnMuaGVpZ2h0LzI8aX0sX2ludGVyc2VjdHNXaXRoUG9pbnRlcjpmdW5jdGlvbihiKXt2YXIgYz10aGlzLm9wdGlvbnMuYXhpcz09PSJ4Inx8YS51aS5pc092ZXJBeGlzKHRoaXMucG9zaXRpb25BYnMudG9wK3RoaXMub2Zmc2V0LmNsaWNrLnRvcCxiLnRvcCxiLmhlaWdodCksZD10aGlzLm9wdGlvbnMuYXhpcz09PSJ5Inx8YS51aS5pc092ZXJBeGlzKHRoaXMucG9zaXRpb25BYnMubGVmdCt0aGlzLm9mZnNldC5jbGljay5sZWZ0LGIubGVmdCxiLndpZHRoKSxlPWMmJmQsZj10aGlzLl9nZXREcmFnVmVydGljYWxEaXJlY3Rpb24oKSxnPXRoaXMuX2dldERyYWdIb3Jpem9udGFsRGlyZWN0aW9uKCk7cmV0dXJuIGU/dGhpcy5mbG9hdGluZz9nJiZnPT0icmlnaHQifHxmPT0iZG93biI/MjoxOmYmJihmPT0iZG93biI/MjoxKTohMX0sX2ludGVyc2VjdHNXaXRoU2lkZXM6ZnVuY3Rpb24oYil7dmFyIGM9YS51aS5pc092ZXJBeGlzKHRoaXMucG9zaXRpb25BYnMudG9wK3RoaXMub2Zmc2V0LmNsaWNrLnRvcCxiLnRvcCtiLmhlaWdodC8yLGIuaGVpZ2h0KSxkPWEudWkuaXNPdmVyQXhpcyh0aGlzLnBvc2l0aW9uQWJzLmxlZnQrdGhpcy5vZmZzZXQuY2xpY2subGVmdCxiLmxlZnQrYi53aWR0aC8yLGIud2lkdGgpLGU9dGhpcy5fZ2V0RHJhZ1ZlcnRpY2FsRGlyZWN0aW9uKCksZj10aGlzLl9nZXREcmFnSG9yaXpvbnRhbERpcmVjdGlvbigpO3JldHVybiB0aGlzLmZsb2F0aW5nJiZmP2Y9PSJyaWdodCImJmR8fGY9PSJsZWZ0IiYmIWQ6ZSYmKGU9PSJkb3duIiYmY3x8ZT09InVwIiYmIWMpfSxfZ2V0RHJhZ1ZlcnRpY2FsRGlyZWN0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wb3NpdGlvbkFicy50b3AtdGhpcy5sYXN0UG9zaXRpb25BYnMudG9wO3JldHVybiBhIT0wJiYoYT4wPyJkb3duIjoidXAiKX0sX2dldERyYWdIb3Jpem9udGFsRGlyZWN0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wb3NpdGlvbkFicy5sZWZ0LXRoaXMubGFzdFBvc2l0aW9uQWJzLmxlZnQ7cmV0dXJuIGEhPTAmJihhPjA/InJpZ2h0IjoibGVmdCIpfSxyZWZyZXNoOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLl9yZWZyZXNoSXRlbXMoYSksdGhpcy5yZWZyZXNoUG9zaXRpb25zKCksdGhpc30sX2Nvbm5lY3RXaXRoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5vcHRpb25zO3JldHVybiBhLmNvbm5lY3RXaXRoLmNvbnN0cnVjdG9yPT1TdHJpbmc/W2EuY29ubmVjdFdpdGhdOmEuY29ubmVjdFdpdGh9LF9nZXRJdGVtc0FzalF1ZXJ5OmZ1bmN0aW9uKGIpe3ZhciBjPXRoaXMsZD1bXSxlPVtdLGY9dGhpcy5fY29ubmVjdFdpdGgoKTtpZihmJiZiKWZvcih2YXIgZz1mLmxlbmd0aC0xO2c+PTA7Zy0tKXt2YXIgaD1hKGZbZ10pO2Zvcih2YXIgaT1oLmxlbmd0aC0xO2k+PTA7aS0tKXt2YXIgaj1hLmRhdGEoaFtpXSx0aGlzLndpZGdldE5hbWUpO2omJmohPXRoaXMmJiFqLm9wdGlvbnMuZGlzYWJsZWQmJmUucHVzaChbYS5pc0Z1bmN0aW9uKGoub3B0aW9ucy5pdGVtcyk/ai5vcHRpb25zLml0ZW1zLmNhbGwoai5lbGVtZW50KTphKGoub3B0aW9ucy5pdGVtcyxqLmVsZW1lbnQpLm5vdCgiLnVpLXNvcnRhYmxlLWhlbHBlciIpLm5vdCgiLnVpLXNvcnRhYmxlLXBsYWNlaG9sZGVyIiksal0pfX1lLnB1c2goW2EuaXNGdW5jdGlvbih0aGlzLm9wdGlvbnMuaXRlbXMpP3RoaXMub3B0aW9ucy5pdGVtcy5jYWxsKHRoaXMuZWxlbWVudCxudWxsLHtvcHRpb25zOnRoaXMub3B0aW9ucyxpdGVtOnRoaXMuY3VycmVudEl0ZW19KTphKHRoaXMub3B0aW9ucy5pdGVtcyx0aGlzLmVsZW1lbnQpLm5vdCgiLnVpLXNvcnRhYmxlLWhlbHBlciIpLm5vdCgiLnVpLXNvcnRhYmxlLXBsYWNlaG9sZGVyIiksdGhpc10pO2Zvcih2YXIgZz1lLmxlbmd0aC0xO2c+PTA7Zy0tKWVbZ11bMF0uZWFjaChmdW5jdGlvbigpe2QucHVzaCh0aGlzKX0pO3JldHVybiBhKGQpfSxfcmVtb3ZlQ3VycmVudHNGcm9tSXRlbXM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmN1cnJlbnRJdGVtLmZpbmQoIjpkYXRhKCIrdGhpcy53aWRnZXROYW1lKyItaXRlbSkiKTtmb3IodmFyIGI9MDtiPHRoaXMuaXRlbXMubGVuZ3RoO2IrKylmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKylhW2NdPT10aGlzLml0ZW1zW2JdLml0ZW1bMF0mJnRoaXMuaXRlbXMuc3BsaWNlKGIsMSl9LF9yZWZyZXNoSXRlbXM6ZnVuY3Rpb24oYil7dGhpcy5pdGVtcz1bXSx0aGlzLmNvbnRhaW5lcnM9W3RoaXNdO3ZhciBjPXRoaXMuaXRlbXMsZD10aGlzLGU9W1thLmlzRnVuY3Rpb24odGhpcy5vcHRpb25zLml0ZW1zKT90aGlzLm9wdGlvbnMuaXRlbXMuY2FsbCh0aGlzLmVsZW1lbnRbMF0sYix7aXRlbTp0aGlzLmN1cnJlbnRJdGVtfSk6YSh0aGlzLm9wdGlvbnMuaXRlbXMsdGhpcy5lbGVtZW50KSx0aGlzXV0sZj10aGlzLl9jb25uZWN0V2l0aCgpO2lmKGYmJnRoaXMucmVhZHkpZm9yKHZhciBnPWYubGVuZ3RoLTE7Zz49MDtnLS0pe3ZhciBoPWEoZltnXSk7Zm9yKHZhciBpPWgubGVuZ3RoLTE7aT49MDtpLS0pe3ZhciBqPWEuZGF0YShoW2ldLHRoaXMud2lkZ2V0TmFtZSk7aiYmaiE9dGhpcyYmIWoub3B0aW9ucy5kaXNhYmxlZCYmKGUucHVzaChbYS5pc0Z1bmN0aW9uKGoub3B0aW9ucy5pdGVtcyk/ai5vcHRpb25zLml0ZW1zLmNhbGwoai5lbGVtZW50WzBdLGIse2l0ZW06dGhpcy5jdXJyZW50SXRlbX0pOmEoai5vcHRpb25zLml0ZW1zLGouZWxlbWVudCksal0pLHRoaXMuY29udGFpbmVycy5wdXNoKGopKX19Zm9yKHZhciBnPWUubGVuZ3RoLTE7Zz49MDtnLS0pe3ZhciBrPWVbZ11bMV0sbD1lW2ddWzBdO2Zvcih2YXIgaT0wLG09bC5sZW5ndGg7aTxtO2krKyl7dmFyIG49YShsW2ldKTtuLmRhdGEodGhpcy53aWRnZXROYW1lKyItaXRlbSIsayksYy5wdXNoKHtpdGVtOm4saW5zdGFuY2U6ayx3aWR0aDowLGhlaWdodDowLGxlZnQ6MCx0b3A6MH0pfX19LHJlZnJlc2hQb3NpdGlvbnM6ZnVuY3Rpb24oYil7dGhpcy5vZmZzZXRQYXJlbnQmJnRoaXMuaGVscGVyJiYodGhpcy5vZmZzZXQucGFyZW50PXRoaXMuX2dldFBhcmVudE9mZnNldCgpKTtmb3IodmFyIGM9dGhpcy5pdGVtcy5sZW5ndGgtMTtjPj0wO2MtLSl7dmFyIGQ9dGhpcy5pdGVtc1tjXTtpZihkLmluc3RhbmNlIT10aGlzLmN1cnJlbnRDb250YWluZXImJnRoaXMuY3VycmVudENvbnRhaW5lciYmZC5pdGVtWzBdIT10aGlzLmN1cnJlbnRJdGVtWzBdKWNvbnRpbnVlO3ZhciBlPXRoaXMub3B0aW9ucy50b2xlcmFuY2VFbGVtZW50P2EodGhpcy5vcHRpb25zLnRvbGVyYW5jZUVsZW1lbnQsZC5pdGVtKTpkLml0ZW07Ynx8KGQud2lkdGg9ZS5vdXRlcldpZHRoKCksZC5oZWlnaHQ9ZS5vdXRlckhlaWdodCgpKTt2YXIgZj1lLm9mZnNldCgpO2QubGVmdD1mLmxlZnQsZC50b3A9Zi50b3B9aWYodGhpcy5vcHRpb25zLmN1c3RvbSYmdGhpcy5vcHRpb25zLmN1c3RvbS5yZWZyZXNoQ29udGFpbmVycyl0aGlzLm9wdGlvbnMuY3VzdG9tLnJlZnJlc2hDb250YWluZXJzLmNhbGwodGhpcyk7ZWxzZSBmb3IodmFyIGM9dGhpcy5jb250YWluZXJzLmxlbmd0aC0xO2M+PTA7Yy0tKXt2YXIgZj10aGlzLmNvbnRhaW5lcnNbY10uZWxlbWVudC5vZmZzZXQoKTt0aGlzLmNvbnRhaW5lcnNbY10uY29udGFpbmVyQ2FjaGUubGVmdD1mLmxlZnQsdGhpcy5jb250YWluZXJzW2NdLmNvbnRhaW5lckNhY2hlLnRvcD1mLnRvcCx0aGlzLmNvbnRhaW5lcnNbY10uY29udGFpbmVyQ2FjaGUud2lkdGg9dGhpcy5jb250YWluZXJzW2NdLmVsZW1lbnQub3V0ZXJXaWR0aCgpLHRoaXMuY29udGFpbmVyc1tjXS5jb250YWluZXJDYWNoZS5oZWlnaHQ9dGhpcy5jb250YWluZXJzW2NdLmVsZW1lbnQub3V0ZXJIZWlnaHQoKX1yZXR1cm4gdGhpc30sX2NyZWF0ZVBsYWNlaG9sZGVyOmZ1bmN0aW9uKGIpe3ZhciBjPWJ8fHRoaXMsZD1jLm9wdGlvbnM7aWYoIWQucGxhY2Vob2xkZXJ8fGQucGxhY2Vob2xkZXIuY29uc3RydWN0b3I9PVN0cmluZyl7dmFyIGU9ZC5wbGFjZWhvbGRlcjtkLnBsYWNlaG9sZGVyPXtlbGVtZW50OmZ1bmN0aW9uKCl7dmFyIGI9YShkb2N1bWVudC5jcmVhdGVFbGVtZW50KGMuY3VycmVudEl0ZW1bMF0ubm9kZU5hbWUpKS5hZGRDbGFzcyhlfHxjLmN1cnJlbnRJdGVtWzBdLmNsYXNzTmFtZSsiIHVpLXNvcnRhYmxlLXBsYWNlaG9sZGVyIikucmVtb3ZlQ2xhc3MoInVpLXNvcnRhYmxlLWhlbHBlciIpWzBdO3JldHVybiBlfHwoYi5zdHlsZS52aXNpYmlsaXR5PSJoaWRkZW4iKSxifSx1cGRhdGU6ZnVuY3Rpb24oYSxiKXtpZihlJiYhZC5mb3JjZVBsYWNlaG9sZGVyU2l6ZSlyZXR1cm47Yi5oZWlnaHQoKXx8Yi5oZWlnaHQoYy5jdXJyZW50SXRlbS5pbm5lckhlaWdodCgpLXBhcnNlSW50KGMuY3VycmVudEl0ZW0uY3NzKCJwYWRkaW5nVG9wIil8fDAsMTApLXBhcnNlSW50KGMuY3VycmVudEl0ZW0uY3NzKCJwYWRkaW5nQm90dG9tIil8fDAsMTApKSxiLndpZHRoKCl8fGIud2lkdGgoYy5jdXJyZW50SXRlbS5pbm5lcldpZHRoKCktcGFyc2VJbnQoYy5jdXJyZW50SXRlbS5jc3MoInBhZGRpbmdMZWZ0Iil8fDAsMTApLXBhcnNlSW50KGMuY3VycmVudEl0ZW0uY3NzKCJwYWRkaW5nUmlnaHQiKXx8MCwxMCkpfX19Yy5wbGFjZWhvbGRlcj1hKGQucGxhY2Vob2xkZXIuZWxlbWVudC5jYWxsKGMuZWxlbWVudCxjLmN1cnJlbnRJdGVtKSksYy5jdXJyZW50SXRlbS5hZnRlcihjLnBsYWNlaG9sZGVyKSxkLnBsYWNlaG9sZGVyLnVwZGF0ZShjLGMucGxhY2Vob2xkZXIpfSxfY29udGFjdENvbnRhaW5lcnM6ZnVuY3Rpb24oYil7dmFyIGM9bnVsbCxkPW51bGw7Zm9yKHZhciBlPXRoaXMuY29udGFpbmVycy5sZW5ndGgtMTtlPj0wO2UtLSl7aWYoYS51aS5jb250YWlucyh0aGlzLmN1cnJlbnRJdGVtWzBdLHRoaXMuY29udGFpbmVyc1tlXS5lbGVtZW50WzBdKSljb250aW51ZTtpZih0aGlzLl9pbnRlcnNlY3RzV2l0aCh0aGlzLmNvbnRhaW5lcnNbZV0uY29udGFpbmVyQ2FjaGUpKXtpZihjJiZhLnVpLmNvbnRhaW5zKHRoaXMuY29udGFpbmVyc1tlXS5lbGVtZW50WzBdLGMuZWxlbWVudFswXSkpY29udGludWU7Yz10aGlzLmNvbnRhaW5lcnNbZV0sZD1lfWVsc2UgdGhpcy5jb250YWluZXJzW2VdLmNvbnRhaW5lckNhY2hlLm92ZXImJih0aGlzLmNvbnRhaW5lcnNbZV0uX3RyaWdnZXIoIm91dCIsYix0aGlzLl91aUhhc2godGhpcykpLHRoaXMuY29udGFpbmVyc1tlXS5jb250YWluZXJDYWNoZS5vdmVyPTApfWlmKCFjKXJldHVybjtpZih0aGlzLmNvbnRhaW5lcnMubGVuZ3RoPT09MSl0aGlzLmNvbnRhaW5lcnNbZF0uX3RyaWdnZXIoIm92ZXIiLGIsdGhpcy5fdWlIYXNoKHRoaXMpKSx0aGlzLmNvbnRhaW5lcnNbZF0uY29udGFpbmVyQ2FjaGUub3Zlcj0xO2Vsc2UgaWYodGhpcy5jdXJyZW50Q29udGFpbmVyIT10aGlzLmNvbnRhaW5lcnNbZF0pe3ZhciBmPTFlNCxnPW51bGwsaD10aGlzLnBvc2l0aW9uQWJzW3RoaXMuY29udGFpbmVyc1tkXS5mbG9hdGluZz8ibGVmdCI6InRvcCJdO2Zvcih2YXIgaT10aGlzLml0ZW1zLmxlbmd0aC0xO2k+PTA7aS0tKXtpZighYS51aS5jb250YWlucyh0aGlzLmNvbnRhaW5lcnNbZF0uZWxlbWVudFswXSx0aGlzLml0ZW1zW2ldLml0ZW1bMF0pKWNvbnRpbnVlO3ZhciBqPXRoaXMuY29udGFpbmVyc1tkXS5mbG9hdGluZz90aGlzLml0ZW1zW2ldLml0ZW0ub2Zmc2V0KCkubGVmdDp0aGlzLml0ZW1zW2ldLml0ZW0ub2Zmc2V0KCkudG9wO01hdGguYWJzKGotaCk8ZiYmKGY9TWF0aC5hYnMoai1oKSxnPXRoaXMuaXRlbXNbaV0sdGhpcy5kaXJlY3Rpb249ai1oPjA/ImRvd24iOiJ1cCIpfWlmKCFnJiYhdGhpcy5vcHRpb25zLmRyb3BPbkVtcHR5KXJldHVybjt0aGlzLmN1cnJlbnRDb250YWluZXI9dGhpcy5jb250YWluZXJzW2RdLGc/dGhpcy5fcmVhcnJhbmdlKGIsZyxudWxsLCEwKTp0aGlzLl9yZWFycmFuZ2UoYixudWxsLHRoaXMuY29udGFpbmVyc1tkXS5lbGVtZW50LCEwKSx0aGlzLl90cmlnZ2VyKCJjaGFuZ2UiLGIsdGhpcy5fdWlIYXNoKCkpLHRoaXMuY29udGFpbmVyc1tkXS5fdHJpZ2dlcigiY2hhbmdlIixiLHRoaXMuX3VpSGFzaCh0aGlzKSksdGhpcy5vcHRpb25zLnBsYWNlaG9sZGVyLnVwZGF0ZSh0aGlzLmN1cnJlbnRDb250YWluZXIsdGhpcy5wbGFjZWhvbGRlciksdGhpcy5jb250YWluZXJzW2RdLl90cmlnZ2VyKCJvdmVyIixiLHRoaXMuX3VpSGFzaCh0aGlzKSksdGhpcy5jb250YWluZXJzW2RdLmNvbnRhaW5lckNhY2hlLm92ZXI9MX19LF9jcmVhdGVIZWxwZXI6ZnVuY3Rpb24oYil7dmFyIGM9dGhpcy5vcHRpb25zLGQ9YS5pc0Z1bmN0aW9uKGMuaGVscGVyKT9hKGMuaGVscGVyLmFwcGx5KHRoaXMuZWxlbWVudFswXSxbYix0aGlzLmN1cnJlbnRJdGVtXSkpOmMuaGVscGVyPT0iY2xvbmUiP3RoaXMuY3VycmVudEl0ZW0uY2xvbmUoKTp0aGlzLmN1cnJlbnRJdGVtO3JldHVybiBkLnBhcmVudHMoImJvZHkiKS5sZW5ndGh8fGEoYy5hcHBlbmRUbyE9InBhcmVudCI/Yy5hcHBlbmRUbzp0aGlzLmN1cnJlbnRJdGVtWzBdLnBhcmVudE5vZGUpWzBdLmFwcGVuZENoaWxkKGRbMF0pLGRbMF09PXRoaXMuY3VycmVudEl0ZW1bMF0mJih0aGlzLl9zdG9yZWRDU1M9e3dpZHRoOnRoaXMuY3VycmVudEl0ZW1bMF0uc3R5bGUud2lkdGgsaGVpZ2h0OnRoaXMuY3VycmVudEl0ZW1bMF0uc3R5bGUuaGVpZ2h0LHBvc2l0aW9uOnRoaXMuY3VycmVudEl0ZW0uY3NzKCJwb3NpdGlvbiIpLHRvcDp0aGlzLmN1cnJlbnRJdGVtLmNzcygidG9wIiksbGVmdDp0aGlzLmN1cnJlbnRJdGVtLmNzcygibGVmdCIpfSksKGRbMF0uc3R5bGUud2lkdGg9PSIifHxjLmZvcmNlSGVscGVyU2l6ZSkmJmQud2lkdGgodGhpcy5jdXJyZW50SXRlbS53aWR0aCgpKSwoZFswXS5zdHlsZS5oZWlnaHQ9PSIifHxjLmZvcmNlSGVscGVyU2l6ZSkmJmQuaGVpZ2h0KHRoaXMuY3VycmVudEl0ZW0uaGVpZ2h0KCkpLGR9LF9hZGp1c3RPZmZzZXRGcm9tSGVscGVyOmZ1bmN0aW9uKGIpe3R5cGVvZiBiPT0ic3RyaW5nIiYmKGI9Yi5zcGxpdCgiICIpKSxhLmlzQXJyYXkoYikmJihiPXtsZWZ0OitiWzBdLHRvcDorYlsxXXx8MH0pLCJsZWZ0ImluIGImJih0aGlzLm9mZnNldC5jbGljay5sZWZ0PWIubGVmdCt0aGlzLm1hcmdpbnMubGVmdCksInJpZ2h0ImluIGImJih0aGlzLm9mZnNldC5jbGljay5sZWZ0PXRoaXMuaGVscGVyUHJvcG9ydGlvbnMud2lkdGgtYi5yaWdodCt0aGlzLm1hcmdpbnMubGVmdCksInRvcCJpbiBiJiYodGhpcy5vZmZzZXQuY2xpY2sudG9wPWIudG9wK3RoaXMubWFyZ2lucy50b3ApLCJib3R0b20iaW4gYiYmKHRoaXMub2Zmc2V0LmNsaWNrLnRvcD10aGlzLmhlbHBlclByb3BvcnRpb25zLmhlaWdodC1iLmJvdHRvbSt0aGlzLm1hcmdpbnMudG9wKX0sX2dldFBhcmVudE9mZnNldDpmdW5jdGlvbigpe3RoaXMub2Zmc2V0UGFyZW50PXRoaXMuaGVscGVyLm9mZnNldFBhcmVudCgpO3ZhciBiPXRoaXMub2Zmc2V0UGFyZW50Lm9mZnNldCgpO3RoaXMuY3NzUG9zaXRpb249PSJhYnNvbHV0ZSImJnRoaXMuc2Nyb2xsUGFyZW50WzBdIT1kb2N1bWVudCYmYS51aS5jb250YWlucyh0aGlzLnNjcm9sbFBhcmVudFswXSx0aGlzLm9mZnNldFBhcmVudFswXSkmJihiLmxlZnQrPXRoaXMuc2Nyb2xsUGFyZW50LnNjcm9sbExlZnQoKSxiLnRvcCs9dGhpcy5zY3JvbGxQYXJlbnQuc2Nyb2xsVG9wKCkpO2lmKHRoaXMub2Zmc2V0UGFyZW50WzBdPT1kb2N1bWVudC5ib2R5fHx0aGlzLm9mZnNldFBhcmVudFswXS50YWdOYW1lJiZ0aGlzLm9mZnNldFBhcmVudFswXS50YWdOYW1lLnRvTG93ZXJDYXNlKCk9PSJodG1sIiYmYS5icm93c2VyLm1zaWUpYj17dG9wOjAsbGVmdDowfTtyZXR1cm57dG9wOmIudG9wKyhwYXJzZUludCh0aGlzLm9mZnNldFBhcmVudC5jc3MoImJvcmRlclRvcFdpZHRoIiksMTApfHwwKSxsZWZ0OmIubGVmdCsocGFyc2VJbnQodGhpcy5vZmZzZXRQYXJlbnQuY3NzKCJib3JkZXJMZWZ0V2lkdGgiKSwxMCl8fDApfX0sX2dldFJlbGF0aXZlT2Zmc2V0OmZ1bmN0aW9uKCl7aWYodGhpcy5jc3NQb3NpdGlvbj09InJlbGF0aXZlIil7dmFyIGE9dGhpcy5jdXJyZW50SXRlbS5wb3NpdGlvbigpO3JldHVybnt0b3A6YS50b3AtKHBhcnNlSW50KHRoaXMuaGVscGVyLmNzcygidG9wIiksMTApfHwwKSt0aGlzLnNjcm9sbFBhcmVudC5zY3JvbGxUb3AoKSxsZWZ0OmEubGVmdC0ocGFyc2VJbnQodGhpcy5oZWxwZXIuY3NzKCJsZWZ0IiksMTApfHwwKSt0aGlzLnNjcm9sbFBhcmVudC5zY3JvbGxMZWZ0KCl9fXJldHVybnt0b3A6MCxsZWZ0OjB9fSxfY2FjaGVNYXJnaW5zOmZ1bmN0aW9uKCl7dGhpcy5tYXJnaW5zPXtsZWZ0OnBhcnNlSW50KHRoaXMuY3VycmVudEl0ZW0uY3NzKCJtYXJnaW5MZWZ0IiksMTApfHwwLHRvcDpwYXJzZUludCh0aGlzLmN1cnJlbnRJdGVtLmNzcygibWFyZ2luVG9wIiksMTApfHwwfX0sX2NhY2hlSGVscGVyUHJvcG9ydGlvbnM6ZnVuY3Rpb24oKXt0aGlzLmhlbHBlclByb3BvcnRpb25zPXt3aWR0aDp0aGlzLmhlbHBlci5vdXRlcldpZHRoKCksaGVpZ2h0OnRoaXMuaGVscGVyLm91dGVySGVpZ2h0KCl9fSxfc2V0Q29udGFpbm1lbnQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLm9wdGlvbnM7Yi5jb250YWlubWVudD09InBhcmVudCImJihiLmNvbnRhaW5tZW50PXRoaXMuaGVscGVyWzBdLnBhcmVudE5vZGUpO2lmKGIuY29udGFpbm1lbnQ9PSJkb2N1bWVudCJ8fGIuY29udGFpbm1lbnQ9PSJ3aW5kb3ciKXRoaXMuY29udGFpbm1lbnQ9WzAtdGhpcy5vZmZzZXQucmVsYXRpdmUubGVmdC10aGlzLm9mZnNldC5wYXJlbnQubGVmdCwwLXRoaXMub2Zmc2V0LnJlbGF0aXZlLnRvcC10aGlzLm9mZnNldC5wYXJlbnQudG9wLGEoYi5jb250YWlubWVudD09ImRvY3VtZW50Ij9kb2N1bWVudDp3aW5kb3cpLndpZHRoKCktdGhpcy5oZWxwZXJQcm9wb3J0aW9ucy53aWR0aC10aGlzLm1hcmdpbnMubGVmdCwoYShiLmNvbnRhaW5tZW50PT0iZG9jdW1lbnQiP2RvY3VtZW50OndpbmRvdykuaGVpZ2h0KCl8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZS5zY3JvbGxIZWlnaHQpLXRoaXMuaGVscGVyUHJvcG9ydGlvbnMuaGVpZ2h0LXRoaXMubWFyZ2lucy50b3BdO2lmKCEvXihkb2N1bWVudHx3aW5kb3d8cGFyZW50KSQvLnRlc3QoYi5jb250YWlubWVudCkpe3ZhciBjPWEoYi5jb250YWlubWVudClbMF0sZD1hKGIuY29udGFpbm1lbnQpLm9mZnNldCgpLGU9YShjKS5jc3MoIm92ZXJmbG93IikhPSJoaWRkZW4iO3RoaXMuY29udGFpbm1lbnQ9W2QubGVmdCsocGFyc2VJbnQoYShjKS5jc3MoImJvcmRlckxlZnRXaWR0aCIpLDEwKXx8MCkrKHBhcnNlSW50KGEoYykuY3NzKCJwYWRkaW5nTGVmdCIpLDEwKXx8MCktdGhpcy5tYXJnaW5zLmxlZnQsZC50b3ArKHBhcnNlSW50KGEoYykuY3NzKCJib3JkZXJUb3BXaWR0aCIpLDEwKXx8MCkrKHBhcnNlSW50KGEoYykuY3NzKCJwYWRkaW5nVG9wIiksMTApfHwwKS10aGlzLm1hcmdpbnMudG9wLGQubGVmdCsoZT9NYXRoLm1heChjLnNjcm9sbFdpZHRoLGMub2Zmc2V0V2lkdGgpOmMub2Zmc2V0V2lkdGgpLShwYXJzZUludChhKGMpLmNzcygiYm9yZGVyTGVmdFdpZHRoIiksMTApfHwwKS0ocGFyc2VJbnQoYShjKS5jc3MoInBhZGRpbmdSaWdodCIpLDEwKXx8MCktdGhpcy5oZWxwZXJQcm9wb3J0aW9ucy53aWR0aC10aGlzLm1hcmdpbnMubGVmdCxkLnRvcCsoZT9NYXRoLm1heChjLnNjcm9sbEhlaWdodCxjLm9mZnNldEhlaWdodCk6Yy5vZmZzZXRIZWlnaHQpLShwYXJzZUludChhKGMpLmNzcygiYm9yZGVyVG9wV2lkdGgiKSwxMCl8fDApLShwYXJzZUludChhKGMpLmNzcygicGFkZGluZ0JvdHRvbSIpLDEwKXx8MCktdGhpcy5oZWxwZXJQcm9wb3J0aW9ucy5oZWlnaHQtdGhpcy5tYXJnaW5zLnRvcF19fSxfY29udmVydFBvc2l0aW9uVG86ZnVuY3Rpb24oYixjKXtjfHwoYz10aGlzLnBvc2l0aW9uKTt2YXIgZD1iPT0iYWJzb2x1dGUiPzE6LTEsZT10aGlzLm9wdGlvbnMsZj10aGlzLmNzc1Bvc2l0aW9uPT0iYWJzb2x1dGUiJiYodGhpcy5zY3JvbGxQYXJlbnRbMF09PWRvY3VtZW50fHwhYS51aS5jb250YWlucyh0aGlzLnNjcm9sbFBhcmVudFswXSx0aGlzLm9mZnNldFBhcmVudFswXSkpP3RoaXMub2Zmc2V0UGFyZW50OnRoaXMuc2Nyb2xsUGFyZW50LGc9LyhodG1sfGJvZHkpL2kudGVzdChmWzBdLnRhZ05hbWUpO3JldHVybnt0b3A6Yy50b3ArdGhpcy5vZmZzZXQucmVsYXRpdmUudG9wKmQrdGhpcy5vZmZzZXQucGFyZW50LnRvcCpkLShhLmJyb3dzZXIuc2FmYXJpJiZ0aGlzLmNzc1Bvc2l0aW9uPT0iZml4ZWQiPzA6KHRoaXMuY3NzUG9zaXRpb249PSJmaXhlZCI/LXRoaXMuc2Nyb2xsUGFyZW50LnNjcm9sbFRvcCgpOmc/MDpmLnNjcm9sbFRvcCgpKSpkKSxsZWZ0OmMubGVmdCt0aGlzLm9mZnNldC5yZWxhdGl2ZS5sZWZ0KmQrdGhpcy5vZmZzZXQucGFyZW50LmxlZnQqZC0oYS5icm93c2VyLnNhZmFyaSYmdGhpcy5jc3NQb3NpdGlvbj09ImZpeGVkIj8wOih0aGlzLmNzc1Bvc2l0aW9uPT0iZml4ZWQiPy10aGlzLnNjcm9sbFBhcmVudC5zY3JvbGxMZWZ0KCk6Zz8wOmYuc2Nyb2xsTGVmdCgpKSpkKX19LF9nZW5lcmF0ZVBvc2l0aW9uOmZ1bmN0aW9uKGIpe3ZhciBjPXRoaXMub3B0aW9ucyxkPXRoaXMuY3NzUG9zaXRpb249PSJhYnNvbHV0ZSImJih0aGlzLnNjcm9sbFBhcmVudFswXT09ZG9jdW1lbnR8fCFhLnVpLmNvbnRhaW5zKHRoaXMuc2Nyb2xsUGFyZW50WzBdLHRoaXMub2Zmc2V0UGFyZW50WzBdKSk/dGhpcy5vZmZzZXRQYXJlbnQ6dGhpcy5zY3JvbGxQYXJlbnQsZT0vKGh0bWx8Ym9keSkvaS50ZXN0KGRbMF0udGFnTmFtZSk7dGhpcy5jc3NQb3NpdGlvbj09InJlbGF0aXZlIiYmKHRoaXMuc2Nyb2xsUGFyZW50WzBdPT1kb2N1bWVudHx8dGhpcy5zY3JvbGxQYXJlbnRbMF09PXRoaXMub2Zmc2V0UGFyZW50WzBdKSYmKHRoaXMub2Zmc2V0LnJlbGF0aXZlPXRoaXMuX2dldFJlbGF0aXZlT2Zmc2V0KCkpO3ZhciBmPWIucGFnZVgsZz1iLnBhZ2VZO2lmKHRoaXMub3JpZ2luYWxQb3NpdGlvbil7dGhpcy5jb250YWlubWVudCYmKGIucGFnZVgtdGhpcy5vZmZzZXQuY2xpY2subGVmdDx0aGlzLmNvbnRhaW5tZW50WzBdJiYoZj10aGlzLmNvbnRhaW5tZW50WzBdK3RoaXMub2Zmc2V0LmNsaWNrLmxlZnQpLGIucGFnZVktdGhpcy5vZmZzZXQuY2xpY2sudG9wPHRoaXMuY29udGFpbm1lbnRbMV0mJihnPXRoaXMuY29udGFpbm1lbnRbMV0rdGhpcy5vZmZzZXQuY2xpY2sudG9wKSxiLnBhZ2VYLXRoaXMub2Zmc2V0LmNsaWNrLmxlZnQ+dGhpcy5jb250YWlubWVudFsyXSYmKGY9dGhpcy5jb250YWlubWVudFsyXSt0aGlzLm9mZnNldC5jbGljay5sZWZ0KSxiLnBhZ2VZLXRoaXMub2Zmc2V0LmNsaWNrLnRvcD50aGlzLmNvbnRhaW5tZW50WzNdJiYoZz10aGlzLmNvbnRhaW5tZW50WzNdK3RoaXMub2Zmc2V0LmNsaWNrLnRvcCkpO2lmKGMuZ3JpZCl7dmFyIGg9dGhpcy5vcmlnaW5hbFBhZ2VZK01hdGgucm91bmQoKGctdGhpcy5vcmlnaW5hbFBhZ2VZKS9jLmdyaWRbMV0pKmMuZ3JpZFsxXTtnPXRoaXMuY29udGFpbm1lbnQ/aC10aGlzLm9mZnNldC5jbGljay50b3A8dGhpcy5jb250YWlubWVudFsxXXx8aC10aGlzLm9mZnNldC5jbGljay50b3A+dGhpcy5jb250YWlubWVudFszXT9oLXRoaXMub2Zmc2V0LmNsaWNrLnRvcDx0aGlzLmNvbnRhaW5tZW50WzFdP2grYy5ncmlkWzFdOmgtYy5ncmlkWzFdOmg6aDt2YXIgaT10aGlzLm9yaWdpbmFsUGFnZVgrTWF0aC5yb3VuZCgoZi10aGlzLm9yaWdpbmFsUGFnZVgpL2MuZ3JpZFswXSkqYy5ncmlkWzBdO2Y9dGhpcy5jb250YWlubWVudD9pLXRoaXMub2Zmc2V0LmNsaWNrLmxlZnQ8dGhpcy5jb250YWlubWVudFswXXx8aS10aGlzLm9mZnNldC5jbGljay5sZWZ0PnRoaXMuY29udGFpbm1lbnRbMl0/aS10aGlzLm9mZnNldC5jbGljay5sZWZ0PHRoaXMuY29udGFpbm1lbnRbMF0/aStjLmdyaWRbMF06aS1jLmdyaWRbMF06aTppfX1yZXR1cm57dG9wOmctdGhpcy5vZmZzZXQuY2xpY2sudG9wLXRoaXMub2Zmc2V0LnJlbGF0aXZlLnRvcC10aGlzLm9mZnNldC5wYXJlbnQudG9wKyhhLmJyb3dzZXIuc2FmYXJpJiZ0aGlzLmNzc1Bvc2l0aW9uPT0iZml4ZWQiPzA6dGhpcy5jc3NQb3NpdGlvbj09ImZpeGVkIj8tdGhpcy5zY3JvbGxQYXJlbnQuc2Nyb2xsVG9wKCk6ZT8wOmQuc2Nyb2xsVG9wKCkpLGxlZnQ6Zi10aGlzLm9mZnNldC5jbGljay5sZWZ0LXRoaXMub2Zmc2V0LnJlbGF0aXZlLmxlZnQtdGhpcy5vZmZzZXQucGFyZW50LmxlZnQrKGEuYnJvd3Nlci5zYWZhcmkmJnRoaXMuY3NzUG9zaXRpb249PSJmaXhlZCI/MDp0aGlzLmNzc1Bvc2l0aW9uPT0iZml4ZWQiPy10aGlzLnNjcm9sbFBhcmVudC5zY3JvbGxMZWZ0KCk6ZT8wOmQuc2Nyb2xsTGVmdCgpKX19LF9yZWFycmFuZ2U6ZnVuY3Rpb24oYSxiLGMsZCl7Yz9jWzBdLmFwcGVuZENoaWxkKHRoaXMucGxhY2Vob2xkZXJbMF0pOmIuaXRlbVswXS5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0aGlzLnBsYWNlaG9sZGVyWzBdLHRoaXMuZGlyZWN0aW9uPT0iZG93biI/Yi5pdGVtWzBdOmIuaXRlbVswXS5uZXh0U2libGluZyksdGhpcy5jb3VudGVyPXRoaXMuY291bnRlcj8rK3RoaXMuY291bnRlcjoxO3ZhciBlPXRoaXMsZj10aGlzLmNvdW50ZXI7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmPT1lLmNvdW50ZXImJmUucmVmcmVzaFBvc2l0aW9ucyghZCl9LDApfSxfY2xlYXI6ZnVuY3Rpb24oYixjKXt0aGlzLnJldmVydGluZz0hMTt2YXIgZD1bXSxlPXRoaXM7IXRoaXMuX25vRmluYWxTb3J0JiZ0aGlzLmN1cnJlbnRJdGVtLnBhcmVudCgpLmxlbmd0aCYmdGhpcy5wbGFjZWhvbGRlci5iZWZvcmUodGhpcy5jdXJyZW50SXRlbSksdGhpcy5fbm9GaW5hbFNvcnQ9bnVsbDtpZih0aGlzLmhlbHBlclswXT09dGhpcy5jdXJyZW50SXRlbVswXSl7Zm9yKHZhciBmIGluIHRoaXMuX3N0b3JlZENTUylpZih0aGlzLl9zdG9yZWRDU1NbZl09PSJhdXRvInx8dGhpcy5fc3RvcmVkQ1NTW2ZdPT0ic3RhdGljIil0aGlzLl9zdG9yZWRDU1NbZl09IiI7dGhpcy5jdXJyZW50SXRlbS5jc3ModGhpcy5fc3RvcmVkQ1NTKS5yZW1vdmVDbGFzcygidWktc29ydGFibGUtaGVscGVyIil9ZWxzZSB0aGlzLmN1cnJlbnRJdGVtLnNob3coKTt0aGlzLmZyb21PdXRzaWRlJiYhYyYmZC5wdXNoKGZ1bmN0aW9uKGEpe3RoaXMuX3RyaWdnZXIoInJlY2VpdmUiLGEsdGhpcy5fdWlIYXNoKHRoaXMuZnJvbU91dHNpZGUpKX0pLCh0aGlzLmZyb21PdXRzaWRlfHx0aGlzLmRvbVBvc2l0aW9uLnByZXYhPXRoaXMuY3VycmVudEl0ZW0ucHJldigpLm5vdCgiLnVpLXNvcnRhYmxlLWhlbHBlciIpWzBdfHx0aGlzLmRvbVBvc2l0aW9uLnBhcmVudCE9dGhpcy5jdXJyZW50SXRlbS5wYXJlbnQoKVswXSkmJiFjJiZkLnB1c2goZnVuY3Rpb24oYSl7dGhpcy5fdHJpZ2dlcigidXBkYXRlIixhLHRoaXMuX3VpSGFzaCgpKX0pO2lmKCFhLnVpLmNvbnRhaW5zKHRoaXMuZWxlbWVudFswXSx0aGlzLmN1cnJlbnRJdGVtWzBdKSl7Y3x8ZC5wdXNoKGZ1bmN0aW9uKGEpe3RoaXMuX3RyaWdnZXIoInJlbW92ZSIsYSx0aGlzLl91aUhhc2goKSl9KTtmb3IodmFyIGY9dGhpcy5jb250YWluZXJzLmxlbmd0aC0xO2Y+PTA7Zi0tKWEudWkuY29udGFpbnModGhpcy5jb250YWluZXJzW2ZdLmVsZW1lbnRbMF0sdGhpcy5jdXJyZW50SXRlbVswXSkmJiFjJiYoZC5wdXNoKGZ1bmN0aW9uKGEpe3JldHVybiBmdW5jdGlvbihiKXthLl90cmlnZ2VyKCJyZWNlaXZlIixiLHRoaXMuX3VpSGFzaCh0aGlzKSl9fS5jYWxsKHRoaXMsdGhpcy5jb250YWluZXJzW2ZdKSksZC5wdXNoKGZ1bmN0aW9uKGEpe3JldHVybiBmdW5jdGlvbihiKXthLl90cmlnZ2VyKCJ1cGRhdGUiLGIsdGhpcy5fdWlIYXNoKHRoaXMpKX19LmNhbGwodGhpcyx0aGlzLmNvbnRhaW5lcnNbZl0pKSl9Zm9yKHZhciBmPXRoaXMuY29udGFpbmVycy5sZW5ndGgtMTtmPj0wO2YtLSljfHxkLnB1c2goZnVuY3Rpb24oYSl7cmV0dXJuIGZ1bmN0aW9uKGIpe2EuX3RyaWdnZXIoImRlYWN0aXZhdGUiLGIsdGhpcy5fdWlIYXNoKHRoaXMpKX19LmNhbGwodGhpcyx0aGlzLmNvbnRhaW5lcnNbZl0pKSx0aGlzLmNvbnRhaW5lcnNbZl0uY29udGFpbmVyQ2FjaGUub3ZlciYmKGQucHVzaChmdW5jdGlvbihhKXtyZXR1cm4gZnVuY3Rpb24oYil7YS5fdHJpZ2dlcigib3V0IixiLHRoaXMuX3VpSGFzaCh0aGlzKSl9fS5jYWxsKHRoaXMsdGhpcy5jb250YWluZXJzW2ZdKSksdGhpcy5jb250YWluZXJzW2ZdLmNvbnRhaW5lckNhY2hlLm92ZXI9MCk7dGhpcy5fc3RvcmVkQ3Vyc29yJiZhKCJib2R5IikuY3NzKCJjdXJzb3IiLHRoaXMuX3N0b3JlZEN1cnNvciksdGhpcy5fc3RvcmVkT3BhY2l0eSYmdGhpcy5oZWxwZXIuY3NzKCJvcGFjaXR5Iix0aGlzLl9zdG9yZWRPcGFjaXR5KSx0aGlzLl9zdG9yZWRaSW5kZXgmJnRoaXMuaGVscGVyLmNzcygiekluZGV4Iix0aGlzLl9zdG9yZWRaSW5kZXg9PSJhdXRvIj8iIjp0aGlzLl9zdG9yZWRaSW5kZXgpLHRoaXMuZHJhZ2dpbmc9ITE7aWYodGhpcy5jYW5jZWxIZWxwZXJSZW1vdmFsKXtpZighYyl7dGhpcy5fdHJpZ2dlcigiYmVmb3JlU3RvcCIsYix0aGlzLl91aUhhc2goKSk7Zm9yKHZhciBmPTA7ZjxkLmxlbmd0aDtmKyspZFtmXS5jYWxsKHRoaXMsYik7dGhpcy5fdHJpZ2dlcigic3RvcCIsYix0aGlzLl91aUhhc2goKSl9cmV0dXJuIHRoaXMuZnJvbU91dHNpZGU9ITEsITF9Y3x8dGhpcy5fdHJpZ2dlcigiYmVmb3JlU3RvcCIsYix0aGlzLl91aUhhc2goKSksdGhpcy5wbGFjZWhvbGRlclswXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMucGxhY2Vob2xkZXJbMF0pLHRoaXMuaGVscGVyWzBdIT10aGlzLmN1cnJlbnRJdGVtWzBdJiZ0aGlzLmhlbHBlci5yZW1vdmUoKSx0aGlzLmhlbHBlcj1udWxsO2lmKCFjKXtmb3IodmFyIGY9MDtmPGQubGVuZ3RoO2YrKylkW2ZdLmNhbGwodGhpcyxiKTt0aGlzLl90cmlnZ2VyKCJzdG9wIixiLHRoaXMuX3VpSGFzaCgpKX1yZXR1cm4gdGhpcy5mcm9tT3V0c2lkZT0hMSwhMH0sX3RyaWdnZXI6ZnVuY3Rpb24oKXthLldpZGdldC5wcm90b3R5cGUuX3RyaWdnZXIuYXBwbHkodGhpcyxhcmd1bWVudHMpPT09ITEmJnRoaXMuY2FuY2VsKCl9LF91aUhhc2g6ZnVuY3Rpb24oYil7dmFyIGM9Ynx8dGhpcztyZXR1cm57aGVscGVyOmMuaGVscGVyLHBsYWNlaG9sZGVyOmMucGxhY2Vob2xkZXJ8fGEoW10pLHBvc2l0aW9uOmMucG9zaXRpb24sb3JpZ2luYWxQb3NpdGlvbjpjLm9yaWdpbmFsUG9zaXRpb24sb2Zmc2V0OmMucG9zaXRpb25BYnMsaXRlbTpjLmN1cnJlbnRJdGVtLHNlbmRlcjpiP2IuZWxlbWVudDpudWxsfX19KSxhLmV4dGVuZChhLnVpLnNvcnRhYmxlLHt2ZXJzaW9uOiIxLjguMjMifSl9KShqUXVlcnkpOzsvKiEgalF1ZXJ5IFVJIC0gdjEuOC4yMyAtIDIwMTItMDgtMTUKLSogaHR0cHM6Ly9naXRodWIuY29tL2pxdWVyeS9qcXVlcnktdWkKLSogSW5jbHVkZXM6IGpxdWVyeS51aS5hY2NvcmRpb24uanMKLSogQ29weXJpZ2h0IChjKSAyMDEyIEFVVEhPUlMudHh0OyBMaWNlbnNlZCBNSVQsIEdQTCAqLwotKGZ1bmN0aW9uKGEsYil7YS53aWRnZXQoInVpLmFjY29yZGlvbiIse29wdGlvbnM6e2FjdGl2ZTowLGFuaW1hdGVkOiJzbGlkZSIsYXV0b0hlaWdodDohMCxjbGVhclN0eWxlOiExLGNvbGxhcHNpYmxlOiExLGV2ZW50OiJjbGljayIsZmlsbFNwYWNlOiExLGhlYWRlcjoiPiBsaSA+IDpmaXJzdC1jaGlsZCw+IDpub3QobGkpOmV2ZW4iLGljb25zOntoZWFkZXI6InVpLWljb24tdHJpYW5nbGUtMS1lIixoZWFkZXJTZWxlY3RlZDoidWktaWNvbi10cmlhbmdsZS0xLXMifSxuYXZpZ2F0aW9uOiExLG5hdmlnYXRpb25GaWx0ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ocmVmLnRvTG93ZXJDYXNlKCk9PT1sb2NhdGlvbi5ocmVmLnRvTG93ZXJDYXNlKCl9fSxfY3JlYXRlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcyxjPWIub3B0aW9ucztiLnJ1bm5pbmc9MCxiLmVsZW1lbnQuYWRkQ2xhc3MoInVpLWFjY29yZGlvbiB1aS13aWRnZXQgdWktaGVscGVyLXJlc2V0IikuY2hpbGRyZW4oImxpIikuYWRkQ2xhc3MoInVpLWFjY29yZGlvbi1saS1maXgiKSxiLmhlYWRlcnM9Yi5lbGVtZW50LmZpbmQoYy5oZWFkZXIpLmFkZENsYXNzKCJ1aS1hY2NvcmRpb24taGVhZGVyIHVpLWhlbHBlci1yZXNldCB1aS1zdGF0ZS1kZWZhdWx0IHVpLWNvcm5lci1hbGwiKS5iaW5kKCJtb3VzZWVudGVyLmFjY29yZGlvbiIsZnVuY3Rpb24oKXtpZihjLmRpc2FibGVkKXJldHVybjthKHRoaXMpLmFkZENsYXNzKCJ1aS1zdGF0ZS1ob3ZlciIpfSkuYmluZCgibW91c2VsZWF2ZS5hY2NvcmRpb24iLGZ1bmN0aW9uKCl7aWYoYy5kaXNhYmxlZClyZXR1cm47YSh0aGlzKS5yZW1vdmVDbGFzcygidWktc3RhdGUtaG92ZXIiKX0pLmJpbmQoImZvY3VzLmFjY29yZGlvbiIsZnVuY3Rpb24oKXtpZihjLmRpc2FibGVkKXJldHVybjthKHRoaXMpLmFkZENsYXNzKCJ1aS1zdGF0ZS1mb2N1cyIpfSkuYmluZCgiYmx1ci5hY2NvcmRpb24iLGZ1bmN0aW9uKCl7aWYoYy5kaXNhYmxlZClyZXR1cm47YSh0aGlzKS5yZW1vdmVDbGFzcygidWktc3RhdGUtZm9jdXMiKX0pLGIuaGVhZGVycy5uZXh0KCkuYWRkQ2xhc3MoInVpLWFjY29yZGlvbi1jb250ZW50IHVpLWhlbHBlci1yZXNldCB1aS13aWRnZXQtY29udGVudCB1aS1jb3JuZXItYm90dG9tIik7aWYoYy5uYXZpZ2F0aW9uKXt2YXIgZD1iLmVsZW1lbnQuZmluZCgiYSIpLmZpbHRlcihjLm5hdmlnYXRpb25GaWx0ZXIpLmVxKDApO2lmKGQubGVuZ3RoKXt2YXIgZT1kLmNsb3Nlc3QoIi51aS1hY2NvcmRpb24taGVhZGVyIik7ZS5sZW5ndGg/Yi5hY3RpdmU9ZTpiLmFjdGl2ZT1kLmNsb3Nlc3QoIi51aS1hY2NvcmRpb24tY29udGVudCIpLnByZXYoKX19Yi5hY3RpdmU9Yi5fZmluZEFjdGl2ZShiLmFjdGl2ZXx8Yy5hY3RpdmUpLmFkZENsYXNzKCJ1aS1zdGF0ZS1kZWZhdWx0IHVpLXN0YXRlLWFjdGl2ZSIpLnRvZ2dsZUNsYXNzKCJ1aS1jb3JuZXItYWxsIikudG9nZ2xlQ2xhc3MoInVpLWNvcm5lci10b3AiKSxiLmFjdGl2ZS5uZXh0KCkuYWRkQ2xhc3MoInVpLWFjY29yZGlvbi1jb250ZW50LWFjdGl2ZSIpLGIuX2NyZWF0ZUljb25zKCksYi5yZXNpemUoKSxiLmVsZW1lbnQuYXR0cigicm9sZSIsInRhYmxpc3QiKSxiLmhlYWRlcnMuYXR0cigicm9sZSIsInRhYiIpLmJpbmQoImtleWRvd24uYWNjb3JkaW9uIixmdW5jdGlvbihhKXtyZXR1cm4gYi5fa2V5ZG93bihhKX0pLm5leHQoKS5hdHRyKCJyb2xlIiwidGFicGFuZWwiKSxiLmhlYWRlcnMubm90KGIuYWN0aXZlfHwiIikuYXR0cih7ImFyaWEtZXhwYW5kZWQiOiJmYWxzZSIsImFyaWEtc2VsZWN0ZWQiOiJmYWxzZSIsdGFiSW5kZXg6LTF9KS5uZXh0KCkuaGlkZSgpLGIuYWN0aXZlLmxlbmd0aD9iLmFjdGl2ZS5hdHRyKHsiYXJpYS1leHBhbmRlZCI6InRydWUiLCJhcmlhLXNlbGVjdGVkIjoidHJ1ZSIsdGFiSW5kZXg6MH0pOmIuaGVhZGVycy5lcSgwKS5hdHRyKCJ0YWJJbmRleCIsMCksYS5icm93c2VyLnNhZmFyaXx8Yi5oZWFkZXJzLmZpbmQoImEiKS5hdHRyKCJ0YWJJbmRleCIsLTEpLGMuZXZlbnQmJmIuaGVhZGVycy5iaW5kKGMuZXZlbnQuc3BsaXQoIiAiKS5qb2luKCIuYWNjb3JkaW9uICIpKyIuYWNjb3JkaW9uIixmdW5jdGlvbihhKXtiLl9jbGlja0hhbmRsZXIuY2FsbChiLGEsdGhpcyksYS5wcmV2ZW50RGVmYXVsdCgpfSl9LF9jcmVhdGVJY29uczpmdW5jdGlvbigpe3ZhciBiPXRoaXMub3B0aW9ucztiLmljb25zJiYoYSgiPHNwYW4+PC9zcGFuPiIpLmFkZENsYXNzKCJ1aS1pY29uICIrYi5pY29ucy5oZWFkZXIpLnByZXBlbmRUbyh0aGlzLmhlYWRlcnMpLHRoaXMuYWN0aXZlLmNoaWxkcmVuKCIudWktaWNvbiIpLnRvZ2dsZUNsYXNzKGIuaWNvbnMuaGVhZGVyKS50b2dnbGVDbGFzcyhiLmljb25zLmhlYWRlclNlbGVjdGVkKSx0aGlzLmVsZW1lbnQuYWRkQ2xhc3MoInVpLWFjY29yZGlvbi1pY29ucyIpKX0sX2Rlc3Ryb3lJY29uczpmdW5jdGlvbigpe3RoaXMuaGVhZGVycy5jaGlsZHJlbigiLnVpLWljb24iKS5yZW1vdmUoKSx0aGlzLmVsZW1lbnQucmVtb3ZlQ2xhc3MoInVpLWFjY29yZGlvbi1pY29ucyIpfSxkZXN0cm95OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5vcHRpb25zO3RoaXMuZWxlbWVudC5yZW1vdmVDbGFzcygidWktYWNjb3JkaW9uIHVpLXdpZGdldCB1aS1oZWxwZXItcmVzZXQiKS5yZW1vdmVBdHRyKCJyb2xlIiksdGhpcy5oZWFkZXJzLnVuYmluZCgiLmFjY29yZGlvbiIpLnJlbW92ZUNsYXNzKCJ1aS1hY2NvcmRpb24taGVhZGVyIHVpLWFjY29yZGlvbi1kaXNhYmxlZCB1aS1oZWxwZXItcmVzZXQgdWktc3RhdGUtZGVmYXVsdCB1aS1jb3JuZXItYWxsIHVpLXN0YXRlLWFjdGl2ZSB1aS1zdGF0ZS1kaXNhYmxlZCB1aS1jb3JuZXItdG9wIikucmVtb3ZlQXR0cigicm9sZSIpLnJlbW92ZUF0dHIoImFyaWEtZXhwYW5kZWQiKS5yZW1vdmVBdHRyKCJhcmlhLXNlbGVjdGVkIikucmVtb3ZlQXR0cigidGFiSW5kZXgiKSx0aGlzLmhlYWRlcnMuZmluZCgiYSIpLnJlbW92ZUF0dHIoInRhYkluZGV4IiksdGhpcy5fZGVzdHJveUljb25zKCk7dmFyIGM9dGhpcy5oZWFkZXJzLm5leHQoKS5jc3MoImRpc3BsYXkiLCIiKS5yZW1vdmVBdHRyKCJyb2xlIikucmVtb3ZlQ2xhc3MoInVpLWhlbHBlci1yZXNldCB1aS13aWRnZXQtY29udGVudCB1aS1jb3JuZXItYm90dG9tIHVpLWFjY29yZGlvbi1jb250ZW50IHVpLWFjY29yZGlvbi1jb250ZW50LWFjdGl2ZSB1aS1hY2NvcmRpb24tZGlzYWJsZWQgdWktc3RhdGUtZGlzYWJsZWQiKTtyZXR1cm4oYi5hdXRvSGVpZ2h0fHxiLmZpbGxIZWlnaHQpJiZjLmNzcygiaGVpZ2h0IiwiIiksYS5XaWRnZXQucHJvdG90eXBlLmRlc3Ryb3kuY2FsbCh0aGlzKX0sX3NldE9wdGlvbjpmdW5jdGlvbihiLGMpe2EuV2lkZ2V0LnByb3RvdHlwZS5fc2V0T3B0aW9uLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxiPT0iYWN0aXZlIiYmdGhpcy5hY3RpdmF0ZShjKSxiPT0iaWNvbnMiJiYodGhpcy5fZGVzdHJveUljb25zKCksYyYmdGhpcy5fY3JlYXRlSWNvbnMoKSksYj09ImRpc2FibGVkIiYmdGhpcy5oZWFkZXJzLmFkZCh0aGlzLmhlYWRlcnMubmV4dCgpKVtjPyJhZGRDbGFzcyI6InJlbW92ZUNsYXNzIl0oInVpLWFjY29yZGlvbi1kaXNhYmxlZCB1aS1zdGF0ZS1kaXNhYmxlZCIpfSxfa2V5ZG93bjpmdW5jdGlvbihiKXtpZih0aGlzLm9wdGlvbnMuZGlzYWJsZWR8fGIuYWx0S2V5fHxiLmN0cmxLZXkpcmV0dXJuO3ZhciBjPWEudWkua2V5Q29kZSxkPXRoaXMuaGVhZGVycy5sZW5ndGgsZT10aGlzLmhlYWRlcnMuaW5kZXgoYi50YXJnZXQpLGY9ITE7c3dpdGNoKGIua2V5Q29kZSl7Y2FzZSBjLlJJR0hUOmNhc2UgYy5ET1dOOmY9dGhpcy5oZWFkZXJzWyhlKzEpJWRdO2JyZWFrO2Nhc2UgYy5MRUZUOmNhc2UgYy5VUDpmPXRoaXMuaGVhZGVyc1soZS0xK2QpJWRdO2JyZWFrO2Nhc2UgYy5TUEFDRTpjYXNlIGMuRU5URVI6dGhpcy5fY2xpY2tIYW5kbGVyKHt0YXJnZXQ6Yi50YXJnZXR9LGIudGFyZ2V0KSxiLnByZXZlbnREZWZhdWx0KCl9cmV0dXJuIGY/KGEoYi50YXJnZXQpLmF0dHIoInRhYkluZGV4IiwtMSksYShmKS5hdHRyKCJ0YWJJbmRleCIsMCksZi5mb2N1cygpLCExKTohMH0scmVzaXplOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5vcHRpb25zLGM7aWYoYi5maWxsU3BhY2Upe2lmKGEuYnJvd3Nlci5tc2llKXt2YXIgZD10aGlzLmVsZW1lbnQucGFyZW50KCkuY3NzKCJvdmVyZmxvdyIpO3RoaXMuZWxlbWVudC5wYXJlbnQoKS5jc3MoIm92ZXJmbG93IiwiaGlkZGVuIil9Yz10aGlzLmVsZW1lbnQucGFyZW50KCkuaGVpZ2h0KCksYS5icm93c2VyLm1zaWUmJnRoaXMuZWxlbWVudC5wYXJlbnQoKS5jc3MoIm92ZXJmbG93IixkKSx0aGlzLmhlYWRlcnMuZWFjaChmdW5jdGlvbigpe2MtPWEodGhpcykub3V0ZXJIZWlnaHQoITApfSksdGhpcy5oZWFkZXJzLm5leHQoKS5lYWNoKGZ1bmN0aW9uKCl7YSh0aGlzKS5oZWlnaHQoTWF0aC5tYXgoMCxjLWEodGhpcykuaW5uZXJIZWlnaHQoKSthKHRoaXMpLmhlaWdodCgpKSl9KS5jc3MoIm92ZXJmbG93IiwiYXV0byIpfWVsc2UgYi5hdXRvSGVpZ2h0JiYoYz0wLHRoaXMuaGVhZGVycy5uZXh0KCkuZWFjaChmdW5jdGlvbigpe2M9TWF0aC5tYXgoYyxhKHRoaXMpLmhlaWdodCgiIikuaGVpZ2h0KCkpfSkuaGVpZ2h0KGMpKTtyZXR1cm4gdGhpc30sYWN0aXZhdGU6ZnVuY3Rpb24oYSl7dGhpcy5vcHRpb25zLmFjdGl2ZT1hO3ZhciBiPXRoaXMuX2ZpbmRBY3RpdmUoYSlbMF07cmV0dXJuIHRoaXMuX2NsaWNrSGFuZGxlcih7dGFyZ2V0OmJ9LGIpLHRoaXN9LF9maW5kQWN0aXZlOmZ1bmN0aW9uKGIpe3JldHVybiBiP3R5cGVvZiBiPT0ibnVtYmVyIj90aGlzLmhlYWRlcnMuZmlsdGVyKCI6ZXEoIitiKyIpIik6dGhpcy5oZWFkZXJzLm5vdCh0aGlzLmhlYWRlcnMubm90KGIpKTpiPT09ITE/YShbXSk6dGhpcy5oZWFkZXJzLmZpbHRlcigiOmVxKDApIil9LF9jbGlja0hhbmRsZXI6ZnVuY3Rpb24oYixjKXt2YXIgZD10aGlzLm9wdGlvbnM7aWYoZC5kaXNhYmxlZClyZXR1cm47aWYoIWIudGFyZ2V0KXtpZighZC5jb2xsYXBzaWJsZSlyZXR1cm47dGhpcy5hY3RpdmUucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLWFjdGl2ZSB1aS1jb3JuZXItdG9wIikuYWRkQ2xhc3MoInVpLXN0YXRlLWRlZmF1bHQgdWktY29ybmVyLWFsbCIpLmNoaWxkcmVuKCIudWktaWNvbiIpLnJlbW92ZUNsYXNzKGQuaWNvbnMuaGVhZGVyU2VsZWN0ZWQpLmFkZENsYXNzKGQuaWNvbnMuaGVhZGVyKSx0aGlzLmFjdGl2ZS5uZXh0KCkuYWRkQ2xhc3MoInVpLWFjY29yZGlvbi1jb250ZW50LWFjdGl2ZSIpO3ZhciBlPXRoaXMuYWN0aXZlLm5leHQoKSxmPXtvcHRpb25zOmQsbmV3SGVhZGVyOmEoW10pLG9sZEhlYWRlcjpkLmFjdGl2ZSxuZXdDb250ZW50OmEoW10pLG9sZENvbnRlbnQ6ZX0sZz10aGlzLmFjdGl2ZT1hKFtdKTt0aGlzLl90b2dnbGUoZyxlLGYpO3JldHVybn12YXIgaD1hKGIuY3VycmVudFRhcmdldHx8YyksaT1oWzBdPT09dGhpcy5hY3RpdmVbMF07ZC5hY3RpdmU9ZC5jb2xsYXBzaWJsZSYmaT8hMTp0aGlzLmhlYWRlcnMuaW5kZXgoaCk7aWYodGhpcy5ydW5uaW5nfHwhZC5jb2xsYXBzaWJsZSYmaSlyZXR1cm47dmFyIGo9dGhpcy5hY3RpdmUsZz1oLm5leHQoKSxlPXRoaXMuYWN0aXZlLm5leHQoKSxmPXtvcHRpb25zOmQsbmV3SGVhZGVyOmkmJmQuY29sbGFwc2libGU/YShbXSk6aCxvbGRIZWFkZXI6dGhpcy5hY3RpdmUsbmV3Q29udGVudDppJiZkLmNvbGxhcHNpYmxlP2EoW10pOmcsb2xkQ29udGVudDplfSxrPXRoaXMuaGVhZGVycy5pbmRleCh0aGlzLmFjdGl2ZVswXSk+dGhpcy5oZWFkZXJzLmluZGV4KGhbMF0pO3RoaXMuYWN0aXZlPWk/YShbXSk6aCx0aGlzLl90b2dnbGUoZyxlLGYsaSxrKSxqLnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1hY3RpdmUgdWktY29ybmVyLXRvcCIpLmFkZENsYXNzKCJ1aS1zdGF0ZS1kZWZhdWx0IHVpLWNvcm5lci1hbGwiKS5jaGlsZHJlbigiLnVpLWljb24iKS5yZW1vdmVDbGFzcyhkLmljb25zLmhlYWRlclNlbGVjdGVkKS5hZGRDbGFzcyhkLmljb25zLmhlYWRlciksaXx8KGgucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLWRlZmF1bHQgdWktY29ybmVyLWFsbCIpLmFkZENsYXNzKCJ1aS1zdGF0ZS1hY3RpdmUgdWktY29ybmVyLXRvcCIpLmNoaWxkcmVuKCIudWktaWNvbiIpLnJlbW92ZUNsYXNzKGQuaWNvbnMuaGVhZGVyKS5hZGRDbGFzcyhkLmljb25zLmhlYWRlclNlbGVjdGVkKSxoLm5leHQoKS5hZGRDbGFzcygidWktYWNjb3JkaW9uLWNvbnRlbnQtYWN0aXZlIikpO3JldHVybn0sX3RvZ2dsZTpmdW5jdGlvbihiLGMsZCxlLGYpe3ZhciBnPXRoaXMsaD1nLm9wdGlvbnM7Zy50b1Nob3c9YixnLnRvSGlkZT1jLGcuZGF0YT1kO3ZhciBpPWZ1bmN0aW9uKCl7aWYoIWcpcmV0dXJuO3JldHVybiBnLl9jb21wbGV0ZWQuYXBwbHkoZyxhcmd1bWVudHMpfTtnLl90cmlnZ2VyKCJjaGFuZ2VzdGFydCIsbnVsbCxnLmRhdGEpLGcucnVubmluZz1jLnNpemUoKT09PTA/Yi5zaXplKCk6Yy5zaXplKCk7aWYoaC5hbmltYXRlZCl7dmFyIGo9e307aC5jb2xsYXBzaWJsZSYmZT9qPXt0b1Nob3c6YShbXSksdG9IaWRlOmMsY29tcGxldGU6aSxkb3duOmYsYXV0b0hlaWdodDpoLmF1dG9IZWlnaHR8fGguZmlsbFNwYWNlfTpqPXt0b1Nob3c6Yix0b0hpZGU6Yyxjb21wbGV0ZTppLGRvd246ZixhdXRvSGVpZ2h0OmguYXV0b0hlaWdodHx8aC5maWxsU3BhY2V9LGgucHJveGllZHx8KGgucHJveGllZD1oLmFuaW1hdGVkKSxoLnByb3hpZWREdXJhdGlvbnx8KGgucHJveGllZER1cmF0aW9uPWguZHVyYXRpb24pLGguYW5pbWF0ZWQ9YS5pc0Z1bmN0aW9uKGgucHJveGllZCk/aC5wcm94aWVkKGopOmgucHJveGllZCxoLmR1cmF0aW9uPWEuaXNGdW5jdGlvbihoLnByb3hpZWREdXJhdGlvbik/aC5wcm94aWVkRHVyYXRpb24oaik6aC5wcm94aWVkRHVyYXRpb247dmFyIGs9YS51aS5hY2NvcmRpb24uYW5pbWF0aW9ucyxsPWguZHVyYXRpb24sbT1oLmFuaW1hdGVkO20mJiFrW21dJiYhYS5lYXNpbmdbbV0mJihtPSJzbGlkZSIpLGtbbV18fChrW21dPWZ1bmN0aW9uKGEpe3RoaXMuc2xpZGUoYSx7ZWFzaW5nOm0sZHVyYXRpb246bHx8NzAwfSl9KSxrW21dKGopfWVsc2UgaC5jb2xsYXBzaWJsZSYmZT9iLnRvZ2dsZSgpOihjLmhpZGUoKSxiLnNob3coKSksaSghMCk7Yy5wcmV2KCkuYXR0cih7ImFyaWEtZXhwYW5kZWQiOiJmYWxzZSIsImFyaWEtc2VsZWN0ZWQiOiJmYWxzZSIsdGFiSW5kZXg6LTF9KS5ibHVyKCksYi5wcmV2KCkuYXR0cih7ImFyaWEtZXhwYW5kZWQiOiJ0cnVlIiwiYXJpYS1zZWxlY3RlZCI6InRydWUiLHRhYkluZGV4OjB9KS5mb2N1cygpfSxfY29tcGxldGVkOmZ1bmN0aW9uKGEpe3RoaXMucnVubmluZz1hPzA6LS10aGlzLnJ1bm5pbmc7aWYodGhpcy5ydW5uaW5nKXJldHVybjt0aGlzLm9wdGlvbnMuY2xlYXJTdHlsZSYmdGhpcy50b1Nob3cuYWRkKHRoaXMudG9IaWRlKS5jc3Moe2hlaWdodDoiIixvdmVyZmxvdzoiIn0pLHRoaXMudG9IaWRlLnJlbW92ZUNsYXNzKCJ1aS1hY2NvcmRpb24tY29udGVudC1hY3RpdmUiKSx0aGlzLnRvSGlkZS5sZW5ndGgmJih0aGlzLnRvSGlkZS5wYXJlbnQoKVswXS5jbGFzc05hbWU9dGhpcy50b0hpZGUucGFyZW50KClbMF0uY2xhc3NOYW1lKSx0aGlzLl90cmlnZ2VyKCJjaGFuZ2UiLG51bGwsdGhpcy5kYXRhKX19KSxhLmV4dGVuZChhLnVpLmFjY29yZGlvbix7dmVyc2lvbjoiMS44LjIzIixhbmltYXRpb25zOntzbGlkZTpmdW5jdGlvbihiLGMpe2I9YS5leHRlbmQoe2Vhc2luZzoic3dpbmciLGR1cmF0aW9uOjMwMH0sYixjKTtpZighYi50b0hpZGUuc2l6ZSgpKXtiLnRvU2hvdy5hbmltYXRlKHtoZWlnaHQ6InNob3ciLHBhZGRpbmdUb3A6InNob3ciLHBhZGRpbmdCb3R0b206InNob3cifSxiKTtyZXR1cm59aWYoIWIudG9TaG93LnNpemUoKSl7Yi50b0hpZGUuYW5pbWF0ZSh7aGVpZ2h0OiJoaWRlIixwYWRkaW5nVG9wOiJoaWRlIixwYWRkaW5nQm90dG9tOiJoaWRlIn0sYik7cmV0dXJufXZhciBkPWIudG9TaG93LmNzcygib3ZlcmZsb3ciKSxlPTAsZj17fSxnPXt9LGg9WyJoZWlnaHQiLCJwYWRkaW5nVG9wIiwicGFkZGluZ0JvdHRvbSJdLGksaj1iLnRvU2hvdztpPWpbMF0uc3R5bGUud2lkdGgsai53aWR0aChqLnBhcmVudCgpLndpZHRoKCktcGFyc2VGbG9hdChqLmNzcygicGFkZGluZ0xlZnQiKSktcGFyc2VGbG9hdChqLmNzcygicGFkZGluZ1JpZ2h0IikpLShwYXJzZUZsb2F0KGouY3NzKCJib3JkZXJMZWZ0V2lkdGgiKSl8fDApLShwYXJzZUZsb2F0KGouY3NzKCJib3JkZXJSaWdodFdpZHRoIikpfHwwKSksYS5lYWNoKGgsZnVuY3Rpb24oYyxkKXtnW2RdPSJoaWRlIjt2YXIgZT0oIiIrYS5jc3MoYi50b1Nob3dbMF0sZCkpLm1hdGNoKC9eKFtcZCstLl0rKSguKikkLyk7ZltkXT17dmFsdWU6ZVsxXSx1bml0OmVbMl18fCJweCJ9fSksYi50b1Nob3cuY3NzKHtoZWlnaHQ6MCxvdmVyZmxvdzoiaGlkZGVuIn0pLnNob3coKSxiLnRvSGlkZS5maWx0ZXIoIjpoaWRkZW4iKS5lYWNoKGIuY29tcGxldGUpLmVuZCgpLmZpbHRlcigiOnZpc2libGUiKS5hbmltYXRlKGcse3N0ZXA6ZnVuY3Rpb24oYSxjKXtjLnByb3A9PSJoZWlnaHQiJiYoZT1jLmVuZC1jLnN0YXJ0PT09MD8wOihjLm5vdy1jLnN0YXJ0KS8oYy5lbmQtYy5zdGFydCkpLGIudG9TaG93WzBdLnN0eWxlW2MucHJvcF09ZSpmW2MucHJvcF0udmFsdWUrZltjLnByb3BdLnVuaXR9LGR1cmF0aW9uOmIuZHVyYXRpb24sZWFzaW5nOmIuZWFzaW5nLGNvbXBsZXRlOmZ1bmN0aW9uKCl7Yi5hdXRvSGVpZ2h0fHxiLnRvU2hvdy5jc3MoImhlaWdodCIsIiIpLGIudG9TaG93LmNzcyh7d2lkdGg6aSxvdmVyZmxvdzpkfSksYi5jb21wbGV0ZSgpfX0pfSxib3VuY2VzbGlkZTpmdW5jdGlvbihhKXt0aGlzLnNsaWRlKGEse2Vhc2luZzphLmRvd24/ImVhc2VPdXRCb3VuY2UiOiJzd2luZyIsZHVyYXRpb246YS5kb3duPzFlMzoyMDB9KX19fSl9KShqUXVlcnkpOzsvKiEgalF1ZXJ5IFVJIC0gdjEuOC4yMyAtIDIwMTItMDgtMTUKLSogaHR0cHM6Ly9naXRodWIuY29tL2pxdWVyeS9qcXVlcnktdWkKLSogSW5jbHVkZXM6IGpxdWVyeS51aS5hdXRvY29tcGxldGUuanMKLSogQ29weXJpZ2h0IChjKSAyMDEyIEFVVEhPUlMudHh0OyBMaWNlbnNlZCBNSVQsIEdQTCAqLwotKGZ1bmN0aW9uKGEsYil7dmFyIGM9MDthLndpZGdldCgidWkuYXV0b2NvbXBsZXRlIix7b3B0aW9uczp7YXBwZW5kVG86ImJvZHkiLGF1dG9Gb2N1czohMSxkZWxheTozMDAsbWluTGVuZ3RoOjEscG9zaXRpb246e215OiJsZWZ0IHRvcCIsYXQ6ImxlZnQgYm90dG9tIixjb2xsaXNpb246Im5vbmUifSxzb3VyY2U6bnVsbH0scGVuZGluZzowLF9jcmVhdGU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLGM9dGhpcy5lbGVtZW50WzBdLm93bmVyRG9jdW1lbnQsZDt0aGlzLmlzTXVsdGlMaW5lPXRoaXMuZWxlbWVudC5pcygidGV4dGFyZWEiKSx0aGlzLmVsZW1lbnQuYWRkQ2xhc3MoInVpLWF1dG9jb21wbGV0ZS1pbnB1dCIpLmF0dHIoImF1dG9jb21wbGV0ZSIsIm9mZiIpLmF0dHIoe3JvbGU6InRleHRib3giLCJhcmlhLWF1dG9jb21wbGV0ZSI6Imxpc3QiLCJhcmlhLWhhc3BvcHVwIjoidHJ1ZSJ9KS5iaW5kKCJrZXlkb3duLmF1dG9jb21wbGV0ZSIsZnVuY3Rpb24oYyl7aWYoYi5vcHRpb25zLmRpc2FibGVkfHxiLmVsZW1lbnQucHJvcEF0dHIoInJlYWRPbmx5IikpcmV0dXJuO2Q9ITE7dmFyIGU9YS51aS5rZXlDb2RlO3N3aXRjaChjLmtleUNvZGUpe2Nhc2UgZS5QQUdFX1VQOmIuX21vdmUoInByZXZpb3VzUGFnZSIsYyk7YnJlYWs7Y2FzZSBlLlBBR0VfRE9XTjpiLl9tb3ZlKCJuZXh0UGFnZSIsYyk7YnJlYWs7Y2FzZSBlLlVQOmIuX2tleUV2ZW50KCJwcmV2aW91cyIsYyk7YnJlYWs7Y2FzZSBlLkRPV046Yi5fa2V5RXZlbnQoIm5leHQiLGMpO2JyZWFrO2Nhc2UgZS5FTlRFUjpjYXNlIGUuTlVNUEFEX0VOVEVSOmIubWVudS5hY3RpdmUmJihkPSEwLGMucHJldmVudERlZmF1bHQoKSk7Y2FzZSBlLlRBQjppZighYi5tZW51LmFjdGl2ZSlyZXR1cm47Yi5tZW51LnNlbGVjdChjKTticmVhaztjYXNlIGUuRVNDQVBFOmIuZWxlbWVudC52YWwoYi50ZXJtKSxiLmNsb3NlKGMpO2JyZWFrO2RlZmF1bHQ6Y2xlYXJUaW1lb3V0KGIuc2VhcmNoaW5nKSxiLnNlYXJjaGluZz1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Yi50ZXJtIT1iLmVsZW1lbnQudmFsKCkmJihiLnNlbGVjdGVkSXRlbT1udWxsLGIuc2VhcmNoKG51bGwsYykpfSxiLm9wdGlvbnMuZGVsYXkpfX0pLmJpbmQoImtleXByZXNzLmF1dG9jb21wbGV0ZSIsZnVuY3Rpb24oYSl7ZCYmKGQ9ITEsYS5wcmV2ZW50RGVmYXVsdCgpKX0pLmJpbmQoImZvY3VzLmF1dG9jb21wbGV0ZSIsZnVuY3Rpb24oKXtpZihiLm9wdGlvbnMuZGlzYWJsZWQpcmV0dXJuO2Iuc2VsZWN0ZWRJdGVtPW51bGwsYi5wcmV2aW91cz1iLmVsZW1lbnQudmFsKCl9KS5iaW5kKCJibHVyLmF1dG9jb21wbGV0ZSIsZnVuY3Rpb24oYSl7aWYoYi5vcHRpb25zLmRpc2FibGVkKXJldHVybjtjbGVhclRpbWVvdXQoYi5zZWFyY2hpbmcpLGIuY2xvc2luZz1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Yi5jbG9zZShhKSxiLl9jaGFuZ2UoYSl9LDE1MCl9KSx0aGlzLl9pbml0U291cmNlKCksdGhpcy5tZW51PWEoIjx1bD48L3VsPiIpLmFkZENsYXNzKCJ1aS1hdXRvY29tcGxldGUiKS5hcHBlbmRUbyhhKHRoaXMub3B0aW9ucy5hcHBlbmRUb3x8ImJvZHkiLGMpWzBdKS5tb3VzZWRvd24oZnVuY3Rpb24oYyl7dmFyIGQ9Yi5tZW51LmVsZW1lbnRbMF07YShjLnRhcmdldCkuY2xvc2VzdCgiLnVpLW1lbnUtaXRlbSIpLmxlbmd0aHx8c2V0VGltZW91dChmdW5jdGlvbigpe2EoZG9jdW1lbnQpLm9uZSgibW91c2Vkb3duIixmdW5jdGlvbihjKXtjLnRhcmdldCE9PWIuZWxlbWVudFswXSYmYy50YXJnZXQhPT1kJiYhYS51aS5jb250YWlucyhkLGMudGFyZ2V0KSYmYi5jbG9zZSgpfSl9LDEpLHNldFRpbWVvdXQoZnVuY3Rpb24oKXtjbGVhclRpbWVvdXQoYi5jbG9zaW5nKX0sMTMpfSkubWVudSh7Zm9jdXM6ZnVuY3Rpb24oYSxjKXt2YXIgZD1jLml0ZW0uZGF0YSgiaXRlbS5hdXRvY29tcGxldGUiKTshMSE9PWIuX3RyaWdnZXIoImZvY3VzIixhLHtpdGVtOmR9KSYmL15rZXkvLnRlc3QoYS5vcmlnaW5hbEV2ZW50LnR5cGUpJiZiLmVsZW1lbnQudmFsKGQudmFsdWUpfSxzZWxlY3RlZDpmdW5jdGlvbihhLGQpe3ZhciBlPWQuaXRlbS5kYXRhKCJpdGVtLmF1dG9jb21wbGV0ZSIpLGY9Yi5wcmV2aW91cztiLmVsZW1lbnRbMF0hPT1jLmFjdGl2ZUVsZW1lbnQmJihiLmVsZW1lbnQuZm9jdXMoKSxiLnByZXZpb3VzPWYsc2V0VGltZW91dChmdW5jdGlvbigpe2IucHJldmlvdXM9ZixiLnNlbGVjdGVkSXRlbT1lfSwxKSksITEhPT1iLl90cmlnZ2VyKCJzZWxlY3QiLGEse2l0ZW06ZX0pJiZiLmVsZW1lbnQudmFsKGUudmFsdWUpLGIudGVybT1iLmVsZW1lbnQudmFsKCksYi5jbG9zZShhKSxiLnNlbGVjdGVkSXRlbT1lfSxibHVyOmZ1bmN0aW9uKGEsYyl7Yi5tZW51LmVsZW1lbnQuaXMoIjp2aXNpYmxlIikmJmIuZWxlbWVudC52YWwoKSE9PWIudGVybSYmYi5lbGVtZW50LnZhbChiLnRlcm0pfX0pLnpJbmRleCh0aGlzLmVsZW1lbnQuekluZGV4KCkrMSkuY3NzKHt0b3A6MCxsZWZ0OjB9KS5oaWRlKCkuZGF0YSgibWVudSIpLGEuZm4uYmdpZnJhbWUmJnRoaXMubWVudS5lbGVtZW50LmJnaWZyYW1lKCksYi5iZWZvcmV1bmxvYWRIYW5kbGVyPWZ1bmN0aW9uKCl7Yi5lbGVtZW50LnJlbW92ZUF0dHIoImF1dG9jb21wbGV0ZSIpfSxhKHdpbmRvdykuYmluZCgiYmVmb3JldW5sb2FkIixiLmJlZm9yZXVubG9hZEhhbmRsZXIpfSxkZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1hdXRvY29tcGxldGUtaW5wdXQiKS5yZW1vdmVBdHRyKCJhdXRvY29tcGxldGUiKS5yZW1vdmVBdHRyKCJyb2xlIikucmVtb3ZlQXR0cigiYXJpYS1hdXRvY29tcGxldGUiKS5yZW1vdmVBdHRyKCJhcmlhLWhhc3BvcHVwIiksdGhpcy5tZW51LmVsZW1lbnQucmVtb3ZlKCksYSh3aW5kb3cpLnVuYmluZCgiYmVmb3JldW5sb2FkIix0aGlzLmJlZm9yZXVubG9hZEhhbmRsZXIpLGEuV2lkZ2V0LnByb3RvdHlwZS5kZXN0cm95LmNhbGwodGhpcyl9LF9zZXRPcHRpb246ZnVuY3Rpb24oYixjKXthLldpZGdldC5wcm90b3R5cGUuX3NldE9wdGlvbi5hcHBseSh0aGlzLGFyZ3VtZW50cyksYj09PSJzb3VyY2UiJiZ0aGlzLl9pbml0U291cmNlKCksYj09PSJhcHBlbmRUbyImJnRoaXMubWVudS5lbGVtZW50LmFwcGVuZFRvKGEoY3x8ImJvZHkiLHRoaXMuZWxlbWVudFswXS5vd25lckRvY3VtZW50KVswXSksYj09PSJkaXNhYmxlZCImJmMmJnRoaXMueGhyJiZ0aGlzLnhoci5hYm9ydCgpfSxfaW5pdFNvdXJjZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMsYyxkO2EuaXNBcnJheSh0aGlzLm9wdGlvbnMuc291cmNlKT8oYz10aGlzLm9wdGlvbnMuc291cmNlLHRoaXMuc291cmNlPWZ1bmN0aW9uKGIsZCl7ZChhLnVpLmF1dG9jb21wbGV0ZS5maWx0ZXIoYyxiLnRlcm0pKX0pOnR5cGVvZiB0aGlzLm9wdGlvbnMuc291cmNlPT0ic3RyaW5nIj8oZD10aGlzLm9wdGlvbnMuc291cmNlLHRoaXMuc291cmNlPWZ1bmN0aW9uKGMsZSl7Yi54aHImJmIueGhyLmFib3J0KCksYi54aHI9YS5hamF4KHt1cmw6ZCxkYXRhOmMsZGF0YVR5cGU6Impzb24iLHN1Y2Nlc3M6ZnVuY3Rpb24oYSxiKXtlKGEpfSxlcnJvcjpmdW5jdGlvbigpe2UoW10pfX0pfSk6dGhpcy5zb3VyY2U9dGhpcy5vcHRpb25zLnNvdXJjZX0sc2VhcmNoOmZ1bmN0aW9uKGEsYil7YT1hIT1udWxsP2E6dGhpcy5lbGVtZW50LnZhbCgpLHRoaXMudGVybT10aGlzLmVsZW1lbnQudmFsKCk7aWYoYS5sZW5ndGg8dGhpcy5vcHRpb25zLm1pbkxlbmd0aClyZXR1cm4gdGhpcy5jbG9zZShiKTtjbGVhclRpbWVvdXQodGhpcy5jbG9zaW5nKTtpZih0aGlzLl90cmlnZ2VyKCJzZWFyY2giLGIpPT09ITEpcmV0dXJuO3JldHVybiB0aGlzLl9zZWFyY2goYSl9LF9zZWFyY2g6ZnVuY3Rpb24oYSl7dGhpcy5wZW5kaW5nKyssdGhpcy5lbGVtZW50LmFkZENsYXNzKCJ1aS1hdXRvY29tcGxldGUtbG9hZGluZyIpLHRoaXMuc291cmNlKHt0ZXJtOmF9LHRoaXMuX3Jlc3BvbnNlKCkpfSxfcmVzcG9uc2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLGI9KytjO3JldHVybiBmdW5jdGlvbihkKXtiPT09YyYmYS5fX3Jlc3BvbnNlKGQpLGEucGVuZGluZy0tLGEucGVuZGluZ3x8YS5lbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1hdXRvY29tcGxldGUtbG9hZGluZyIpfX0sX19yZXNwb25zZTpmdW5jdGlvbihhKXshdGhpcy5vcHRpb25zLmRpc2FibGVkJiZhJiZhLmxlbmd0aD8oYT10aGlzLl9ub3JtYWxpemUoYSksdGhpcy5fc3VnZ2VzdChhKSx0aGlzLl90cmlnZ2VyKCJvcGVuIikpOnRoaXMuY2xvc2UoKX0sY2xvc2U6ZnVuY3Rpb24oYSl7Y2xlYXJUaW1lb3V0KHRoaXMuY2xvc2luZyksdGhpcy5tZW51LmVsZW1lbnQuaXMoIjp2aXNpYmxlIikmJih0aGlzLm1lbnUuZWxlbWVudC5oaWRlKCksdGhpcy5tZW51LmRlYWN0aXZhdGUoKSx0aGlzLl90cmlnZ2VyKCJjbG9zZSIsYSkpfSxfY2hhbmdlOmZ1bmN0aW9uKGEpe3RoaXMucHJldmlvdXMhPT10aGlzLmVsZW1lbnQudmFsKCkmJnRoaXMuX3RyaWdnZXIoImNoYW5nZSIsYSx7aXRlbTp0aGlzLnNlbGVjdGVkSXRlbX0pfSxfbm9ybWFsaXplOmZ1bmN0aW9uKGIpe3JldHVybiBiLmxlbmd0aCYmYlswXS5sYWJlbCYmYlswXS52YWx1ZT9iOmEubWFwKGIsZnVuY3Rpb24oYil7cmV0dXJuIHR5cGVvZiBiPT0ic3RyaW5nIj97bGFiZWw6Yix2YWx1ZTpifTphLmV4dGVuZCh7bGFiZWw6Yi5sYWJlbHx8Yi52YWx1ZSx2YWx1ZTpiLnZhbHVlfHxiLmxhYmVsfSxiKX0pfSxfc3VnZ2VzdDpmdW5jdGlvbihiKXt2YXIgYz10aGlzLm1lbnUuZWxlbWVudC5lbXB0eSgpLnpJbmRleCh0aGlzLmVsZW1lbnQuekluZGV4KCkrMSk7dGhpcy5fcmVuZGVyTWVudShjLGIpLHRoaXMubWVudS5kZWFjdGl2YXRlKCksdGhpcy5tZW51LnJlZnJlc2goKSxjLnNob3coKSx0aGlzLl9yZXNpemVNZW51KCksYy5wb3NpdGlvbihhLmV4dGVuZCh7b2Y6dGhpcy5lbGVtZW50fSx0aGlzLm9wdGlvbnMucG9zaXRpb24pKSx0aGlzLm9wdGlvbnMuYXV0b0ZvY3VzJiZ0aGlzLm1lbnUubmV4dChuZXcgYS5FdmVudCgibW91c2VvdmVyIikpfSxfcmVzaXplTWVudTpmdW5jdGlvbigpe3ZhciBhPXRoaXMubWVudS5lbGVtZW50O2Eub3V0ZXJXaWR0aChNYXRoLm1heChhLndpZHRoKCIiKS5vdXRlcldpZHRoKCkrMSx0aGlzLmVsZW1lbnQub3V0ZXJXaWR0aCgpKSl9LF9yZW5kZXJNZW51OmZ1bmN0aW9uKGIsYyl7dmFyIGQ9dGhpczthLmVhY2goYyxmdW5jdGlvbihhLGMpe2QuX3JlbmRlckl0ZW0oYixjKX0pfSxfcmVuZGVySXRlbTpmdW5jdGlvbihiLGMpe3JldHVybiBhKCI8bGk+PC9saT4iKS5kYXRhKCJpdGVtLmF1dG9jb21wbGV0ZSIsYykuYXBwZW5kKGEoIjxhPjwvYT4iKS50ZXh0KGMubGFiZWwpKS5hcHBlbmRUbyhiKX0sX21vdmU6ZnVuY3Rpb24oYSxiKXtpZighdGhpcy5tZW51LmVsZW1lbnQuaXMoIjp2aXNpYmxlIikpe3RoaXMuc2VhcmNoKG51bGwsYik7cmV0dXJufWlmKHRoaXMubWVudS5maXJzdCgpJiYvXnByZXZpb3VzLy50ZXN0KGEpfHx0aGlzLm1lbnUubGFzdCgpJiYvXm5leHQvLnRlc3QoYSkpe3RoaXMuZWxlbWVudC52YWwodGhpcy50ZXJtKSx0aGlzLm1lbnUuZGVhY3RpdmF0ZSgpO3JldHVybn10aGlzLm1lbnVbYV0oYil9LHdpZGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1lbnUuZWxlbWVudH0sX2tleUV2ZW50OmZ1bmN0aW9uKGEsYil7aWYoIXRoaXMuaXNNdWx0aUxpbmV8fHRoaXMubWVudS5lbGVtZW50LmlzKCI6dmlzaWJsZSIpKXRoaXMuX21vdmUoYSxiKSxiLnByZXZlbnREZWZhdWx0KCl9fSksYS5leHRlbmQoYS51aS5hdXRvY29tcGxldGUse2VzY2FwZVJlZ2V4OmZ1bmN0aW9uKGEpe3JldHVybiBhLnJlcGxhY2UoL1stW1xde30oKSorPy4sXFxeJHwjXHNdL2csIlxcJCYiKX0sZmlsdGVyOmZ1bmN0aW9uKGIsYyl7dmFyIGQ9bmV3IFJlZ0V4cChhLnVpLmF1dG9jb21wbGV0ZS5lc2NhcGVSZWdleChjKSwiaSIpO3JldHVybiBhLmdyZXAoYixmdW5jdGlvbihhKXtyZXR1cm4gZC50ZXN0KGEubGFiZWx8fGEudmFsdWV8fGEpfSl9fSl9KShqUXVlcnkpLGZ1bmN0aW9uKGEpe2Eud2lkZ2V0KCJ1aS5tZW51Iix7X2NyZWF0ZTpmdW5jdGlvbigpe3ZhciBiPXRoaXM7dGhpcy5lbGVtZW50LmFkZENsYXNzKCJ1aS1tZW51IHVpLXdpZGdldCB1aS13aWRnZXQtY29udGVudCB1aS1jb3JuZXItYWxsIikuYXR0cih7cm9sZToibGlzdGJveCIsImFyaWEtYWN0aXZlZGVzY2VuZGFudCI6InVpLWFjdGl2ZS1tZW51aXRlbSJ9KS5jbGljayhmdW5jdGlvbihjKXtpZighYShjLnRhcmdldCkuY2xvc2VzdCgiLnVpLW1lbnUtaXRlbSBhIikubGVuZ3RoKXJldHVybjtjLnByZXZlbnREZWZhdWx0KCksYi5zZWxlY3QoYyl9KSx0aGlzLnJlZnJlc2goKX0scmVmcmVzaDpmdW5jdGlvbigpe3ZhciBiPXRoaXMsYz10aGlzLmVsZW1lbnQuY2hpbGRyZW4oImxpOm5vdCgudWktbWVudS1pdGVtKTpoYXMoYSkiKS5hZGRDbGFzcygidWktbWVudS1pdGVtIikuYXR0cigicm9sZSIsIm1lbnVpdGVtIik7Yy5jaGlsZHJlbigiYSIpLmFkZENsYXNzKCJ1aS1jb3JuZXItYWxsIikuYXR0cigidGFiaW5kZXgiLC0xKS5tb3VzZWVudGVyKGZ1bmN0aW9uKGMpe2IuYWN0aXZhdGUoYyxhKHRoaXMpLnBhcmVudCgpKX0pLm1vdXNlbGVhdmUoZnVuY3Rpb24oKXtiLmRlYWN0aXZhdGUoKX0pfSxhY3RpdmF0ZTpmdW5jdGlvbihhLGIpe3RoaXMuZGVhY3RpdmF0ZSgpO2lmKHRoaXMuaGFzU2Nyb2xsKCkpe3ZhciBjPWIub2Zmc2V0KCkudG9wLXRoaXMuZWxlbWVudC5vZmZzZXQoKS50b3AsZD10aGlzLmVsZW1lbnQuc2Nyb2xsVG9wKCksZT10aGlzLmVsZW1lbnQuaGVpZ2h0KCk7YzwwP3RoaXMuZWxlbWVudC5zY3JvbGxUb3AoZCtjKTpjPj1lJiZ0aGlzLmVsZW1lbnQuc2Nyb2xsVG9wKGQrYy1lK2IuaGVpZ2h0KCkpfXRoaXMuYWN0aXZlPWIuZXEoMCkuY2hpbGRyZW4oImEiKS5hZGRDbGFzcygidWktc3RhdGUtaG92ZXIiKS5hdHRyKCJpZCIsInVpLWFjdGl2ZS1tZW51aXRlbSIpLmVuZCgpLHRoaXMuX3RyaWdnZXIoImZvY3VzIixhLHtpdGVtOmJ9KX0sZGVhY3RpdmF0ZTpmdW5jdGlvbigpe2lmKCF0aGlzLmFjdGl2ZSlyZXR1cm47dGhpcy5hY3RpdmUuY2hpbGRyZW4oImEiKS5yZW1vdmVDbGFzcygidWktc3RhdGUtaG92ZXIiKS5yZW1vdmVBdHRyKCJpZCIpLHRoaXMuX3RyaWdnZXIoImJsdXIiKSx0aGlzLmFjdGl2ZT1udWxsfSxuZXh0OmZ1bmN0aW9uKGEpe3RoaXMubW92ZSgibmV4dCIsIi51aS1tZW51LWl0ZW06Zmlyc3QiLGEpfSxwcmV2aW91czpmdW5jdGlvbihhKXt0aGlzLm1vdmUoInByZXYiLCIudWktbWVudS1pdGVtOmxhc3QiLGEpfSxmaXJzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmFjdGl2ZSYmIXRoaXMuYWN0aXZlLnByZXZBbGwoIi51aS1tZW51LWl0ZW0iKS5sZW5ndGh9LGxhc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hY3RpdmUmJiF0aGlzLmFjdGl2ZS5uZXh0QWxsKCIudWktbWVudS1pdGVtIikubGVuZ3RofSxtb3ZlOmZ1bmN0aW9uKGEsYixjKXtpZighdGhpcy5hY3RpdmUpe3RoaXMuYWN0aXZhdGUoYyx0aGlzLmVsZW1lbnQuY2hpbGRyZW4oYikpO3JldHVybn12YXIgZD10aGlzLmFjdGl2ZVthKyJBbGwiXSgiLnVpLW1lbnUtaXRlbSIpLmVxKDApO2QubGVuZ3RoP3RoaXMuYWN0aXZhdGUoYyxkKTp0aGlzLmFjdGl2YXRlKGMsdGhpcy5lbGVtZW50LmNoaWxkcmVuKGIpKX0sbmV4dFBhZ2U6ZnVuY3Rpb24oYil7aWYodGhpcy5oYXNTY3JvbGwoKSl7aWYoIXRoaXMuYWN0aXZlfHx0aGlzLmxhc3QoKSl7dGhpcy5hY3RpdmF0ZShiLHRoaXMuZWxlbWVudC5jaGlsZHJlbigiLnVpLW1lbnUtaXRlbTpmaXJzdCIpKTtyZXR1cm59dmFyIGM9dGhpcy5hY3RpdmUub2Zmc2V0KCkudG9wLGQ9dGhpcy5lbGVtZW50LmhlaWdodCgpLGU9dGhpcy5lbGVtZW50LmNoaWxkcmVuKCIudWktbWVudS1pdGVtIikuZmlsdGVyKGZ1bmN0aW9uKCl7dmFyIGI9YSh0aGlzKS5vZmZzZXQoKS50b3AtYy1kK2EodGhpcykuaGVpZ2h0KCk7cmV0dXJuIGI8MTAmJmI+LTEwfSk7ZS5sZW5ndGh8fChlPXRoaXMuZWxlbWVudC5jaGlsZHJlbigiLnVpLW1lbnUtaXRlbTpsYXN0IikpLHRoaXMuYWN0aXZhdGUoYixlKX1lbHNlIHRoaXMuYWN0aXZhdGUoYix0aGlzLmVsZW1lbnQuY2hpbGRyZW4oIi51aS1tZW51LWl0ZW0iKS5maWx0ZXIoIXRoaXMuYWN0aXZlfHx0aGlzLmxhc3QoKT8iOmZpcnN0IjoiOmxhc3QiKSl9LHByZXZpb3VzUGFnZTpmdW5jdGlvbihiKXtpZih0aGlzLmhhc1Njcm9sbCgpKXtpZighdGhpcy5hY3RpdmV8fHRoaXMuZmlyc3QoKSl7dGhpcy5hY3RpdmF0ZShiLHRoaXMuZWxlbWVudC5jaGlsZHJlbigiLnVpLW1lbnUtaXRlbTpsYXN0IikpO3JldHVybn12YXIgYz10aGlzLmFjdGl2ZS5vZmZzZXQoKS50b3AsZD10aGlzLmVsZW1lbnQuaGVpZ2h0KCksZT10aGlzLmVsZW1lbnQuY2hpbGRyZW4oIi51aS1tZW51LWl0ZW0iKS5maWx0ZXIoZnVuY3Rpb24oKXt2YXIgYj1hKHRoaXMpLm9mZnNldCgpLnRvcC1jK2QtYSh0aGlzKS5oZWlnaHQoKTtyZXR1cm4gYjwxMCYmYj4tMTB9KTtlLmxlbmd0aHx8KGU9dGhpcy5lbGVtZW50LmNoaWxkcmVuKCIudWktbWVudS1pdGVtOmZpcnN0IikpLHRoaXMuYWN0aXZhdGUoYixlKX1lbHNlIHRoaXMuYWN0aXZhdGUoYix0aGlzLmVsZW1lbnQuY2hpbGRyZW4oIi51aS1tZW51LWl0ZW0iKS5maWx0ZXIoIXRoaXMuYWN0aXZlfHx0aGlzLmZpcnN0KCk/IjpsYXN0IjoiOmZpcnN0IikpfSxoYXNTY3JvbGw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lbGVtZW50LmhlaWdodCgpPHRoaXMuZWxlbWVudFthLmZuLnByb3A/InByb3AiOiJhdHRyIl0oInNjcm9sbEhlaWdodCIpfSxzZWxlY3Q6ZnVuY3Rpb24oYSl7dGhpcy5fdHJpZ2dlcigic2VsZWN0ZWQiLGEse2l0ZW06dGhpcy5hY3RpdmV9KX19KX0oalF1ZXJ5KTs7LyohIGpRdWVyeSBVSSAtIHYxLjguMjMgLSAyMDEyLTA4LTE1Ci0qIGh0dHBzOi8vZ2l0aHViLmNvbS9qcXVlcnkvanF1ZXJ5LXVpCi0qIEluY2x1ZGVzOiBqcXVlcnkudWkuYnV0dG9uLmpzCi0qIENvcHlyaWdodCAoYykgMjAxMiBBVVRIT1JTLnR4dDsgTGljZW5zZWQgTUlULCBHUEwgKi8KLShmdW5jdGlvbihhLGIpe3ZhciBjLGQsZSxmLGc9InVpLWJ1dHRvbiB1aS13aWRnZXQgdWktc3RhdGUtZGVmYXVsdCB1aS1jb3JuZXItYWxsIixoPSJ1aS1zdGF0ZS1ob3ZlciB1aS1zdGF0ZS1hY3RpdmUgIixpPSJ1aS1idXR0b24taWNvbnMtb25seSB1aS1idXR0b24taWNvbi1vbmx5IHVpLWJ1dHRvbi10ZXh0LWljb25zIHVpLWJ1dHRvbi10ZXh0LWljb24tcHJpbWFyeSB1aS1idXR0b24tdGV4dC1pY29uLXNlY29uZGFyeSB1aS1idXR0b24tdGV4dC1vbmx5IixqPWZ1bmN0aW9uKCl7dmFyIGI9YSh0aGlzKS5maW5kKCI6dWktYnV0dG9uIik7c2V0VGltZW91dChmdW5jdGlvbigpe2IuYnV0dG9uKCJyZWZyZXNoIil9LDEpfSxrPWZ1bmN0aW9uKGIpe3ZhciBjPWIubmFtZSxkPWIuZm9ybSxlPWEoW10pO3JldHVybiBjJiYoZD9lPWEoZCkuZmluZCgiW25hbWU9JyIrYysiJ10iKTplPWEoIltuYW1lPSciK2MrIiddIixiLm93bmVyRG9jdW1lbnQpLmZpbHRlcihmdW5jdGlvbigpe3JldHVybiF0aGlzLmZvcm19KSksZX07YS53aWRnZXQoInVpLmJ1dHRvbiIse29wdGlvbnM6e2Rpc2FibGVkOm51bGwsdGV4dDohMCxsYWJlbDpudWxsLGljb25zOntwcmltYXJ5Om51bGwsc2Vjb25kYXJ5Om51bGx9fSxfY3JlYXRlOmZ1bmN0aW9uKCl7dGhpcy5lbGVtZW50LmNsb3Nlc3QoImZvcm0iKS51bmJpbmQoInJlc2V0LmJ1dHRvbiIpLmJpbmQoInJlc2V0LmJ1dHRvbiIsaiksdHlwZW9mIHRoaXMub3B0aW9ucy5kaXNhYmxlZCE9ImJvb2xlYW4iP3RoaXMub3B0aW9ucy5kaXNhYmxlZD0hIXRoaXMuZWxlbWVudC5wcm9wQXR0cigiZGlzYWJsZWQiKTp0aGlzLmVsZW1lbnQucHJvcEF0dHIoImRpc2FibGVkIix0aGlzLm9wdGlvbnMuZGlzYWJsZWQpLHRoaXMuX2RldGVybWluZUJ1dHRvblR5cGUoKSx0aGlzLmhhc1RpdGxlPSEhdGhpcy5idXR0b25FbGVtZW50LmF0dHIoInRpdGxlIik7dmFyIGI9dGhpcyxoPXRoaXMub3B0aW9ucyxpPXRoaXMudHlwZT09PSJjaGVja2JveCJ8fHRoaXMudHlwZT09PSJyYWRpbyIsbD0idWktc3RhdGUtaG92ZXIiKyhpPyIiOiIgdWktc3RhdGUtYWN0aXZlIiksbT0idWktc3RhdGUtZm9jdXMiO2gubGFiZWw9PT1udWxsJiYoaC5sYWJlbD10aGlzLmJ1dHRvbkVsZW1lbnQuaHRtbCgpKSx0aGlzLmJ1dHRvbkVsZW1lbnQuYWRkQ2xhc3MoZykuYXR0cigicm9sZSIsImJ1dHRvbiIpLmJpbmQoIm1vdXNlZW50ZXIuYnV0dG9uIixmdW5jdGlvbigpe2lmKGguZGlzYWJsZWQpcmV0dXJuO2EodGhpcykuYWRkQ2xhc3MoInVpLXN0YXRlLWhvdmVyIiksdGhpcz09PWMmJmEodGhpcykuYWRkQ2xhc3MoInVpLXN0YXRlLWFjdGl2ZSIpfSkuYmluZCgibW91c2VsZWF2ZS5idXR0b24iLGZ1bmN0aW9uKCl7aWYoaC5kaXNhYmxlZClyZXR1cm47YSh0aGlzKS5yZW1vdmVDbGFzcyhsKX0pLmJpbmQoImNsaWNrLmJ1dHRvbiIsZnVuY3Rpb24oYSl7aC5kaXNhYmxlZCYmKGEucHJldmVudERlZmF1bHQoKSxhLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpKX0pLHRoaXMuZWxlbWVudC5iaW5kKCJmb2N1cy5idXR0b24iLGZ1bmN0aW9uKCl7Yi5idXR0b25FbGVtZW50LmFkZENsYXNzKG0pfSkuYmluZCgiYmx1ci5idXR0b24iLGZ1bmN0aW9uKCl7Yi5idXR0b25FbGVtZW50LnJlbW92ZUNsYXNzKG0pfSksaSYmKHRoaXMuZWxlbWVudC5iaW5kKCJjaGFuZ2UuYnV0dG9uIixmdW5jdGlvbigpe2lmKGYpcmV0dXJuO2IucmVmcmVzaCgpfSksdGhpcy5idXR0b25FbGVtZW50LmJpbmQoIm1vdXNlZG93bi5idXR0b24iLGZ1bmN0aW9uKGEpe2lmKGguZGlzYWJsZWQpcmV0dXJuO2Y9ITEsZD1hLnBhZ2VYLGU9YS5wYWdlWX0pLmJpbmQoIm1vdXNldXAuYnV0dG9uIixmdW5jdGlvbihhKXtpZihoLmRpc2FibGVkKXJldHVybjtpZihkIT09YS5wYWdlWHx8ZSE9PWEucGFnZVkpZj0hMH0pKSx0aGlzLnR5cGU9PT0iY2hlY2tib3giP3RoaXMuYnV0dG9uRWxlbWVudC5iaW5kKCJjbGljay5idXR0b24iLGZ1bmN0aW9uKCl7aWYoaC5kaXNhYmxlZHx8ZilyZXR1cm4hMTthKHRoaXMpLnRvZ2dsZUNsYXNzKCJ1aS1zdGF0ZS1hY3RpdmUiKSxiLmJ1dHRvbkVsZW1lbnQuYXR0cigiYXJpYS1wcmVzc2VkIixiLmVsZW1lbnRbMF0uY2hlY2tlZCl9KTp0aGlzLnR5cGU9PT0icmFkaW8iP3RoaXMuYnV0dG9uRWxlbWVudC5iaW5kKCJjbGljay5idXR0b24iLGZ1bmN0aW9uKCl7aWYoaC5kaXNhYmxlZHx8ZilyZXR1cm4hMTthKHRoaXMpLmFkZENsYXNzKCJ1aS1zdGF0ZS1hY3RpdmUiKSxiLmJ1dHRvbkVsZW1lbnQuYXR0cigiYXJpYS1wcmVzc2VkIiwidHJ1ZSIpO3ZhciBjPWIuZWxlbWVudFswXTtrKGMpLm5vdChjKS5tYXAoZnVuY3Rpb24oKXtyZXR1cm4gYSh0aGlzKS5idXR0b24oIndpZGdldCIpWzBdfSkucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLWFjdGl2ZSIpLmF0dHIoImFyaWEtcHJlc3NlZCIsImZhbHNlIil9KToodGhpcy5idXR0b25FbGVtZW50LmJpbmQoIm1vdXNlZG93bi5idXR0b24iLGZ1bmN0aW9uKCl7aWYoaC5kaXNhYmxlZClyZXR1cm4hMTthKHRoaXMpLmFkZENsYXNzKCJ1aS1zdGF0ZS1hY3RpdmUiKSxjPXRoaXMsYShkb2N1bWVudCkub25lKCJtb3VzZXVwIixmdW5jdGlvbigpe2M9bnVsbH0pfSkuYmluZCgibW91c2V1cC5idXR0b24iLGZ1bmN0aW9uKCl7aWYoaC5kaXNhYmxlZClyZXR1cm4hMTthKHRoaXMpLnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1hY3RpdmUiKX0pLmJpbmQoImtleWRvd24uYnV0dG9uIixmdW5jdGlvbihiKXtpZihoLmRpc2FibGVkKXJldHVybiExOyhiLmtleUNvZGU9PWEudWkua2V5Q29kZS5TUEFDRXx8Yi5rZXlDb2RlPT1hLnVpLmtleUNvZGUuRU5URVIpJiZhKHRoaXMpLmFkZENsYXNzKCJ1aS1zdGF0ZS1hY3RpdmUiKX0pLmJpbmQoImtleXVwLmJ1dHRvbiIsZnVuY3Rpb24oKXthKHRoaXMpLnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1hY3RpdmUiKX0pLHRoaXMuYnV0dG9uRWxlbWVudC5pcygiYSIpJiZ0aGlzLmJ1dHRvbkVsZW1lbnQua2V5dXAoZnVuY3Rpb24oYil7Yi5rZXlDb2RlPT09YS51aS5rZXlDb2RlLlNQQUNFJiZhKHRoaXMpLmNsaWNrKCl9KSksdGhpcy5fc2V0T3B0aW9uKCJkaXNhYmxlZCIsaC5kaXNhYmxlZCksdGhpcy5fcmVzZXRCdXR0b24oKX0sX2RldGVybWluZUJ1dHRvblR5cGU6ZnVuY3Rpb24oKXt0aGlzLmVsZW1lbnQuaXMoIjpjaGVja2JveCIpP3RoaXMudHlwZT0iY2hlY2tib3giOnRoaXMuZWxlbWVudC5pcygiOnJhZGlvIik/dGhpcy50eXBlPSJyYWRpbyI6dGhpcy5lbGVtZW50LmlzKCJpbnB1dCIpP3RoaXMudHlwZT0iaW5wdXQiOnRoaXMudHlwZT0iYnV0dG9uIjtpZih0aGlzLnR5cGU9PT0iY2hlY2tib3gifHx0aGlzLnR5cGU9PT0icmFkaW8iKXt2YXIgYT10aGlzLmVsZW1lbnQucGFyZW50cygpLmZpbHRlcigiOmxhc3QiKSxiPSJsYWJlbFtmb3I9JyIrdGhpcy5lbGVtZW50LmF0dHIoImlkIikrIiddIjt0aGlzLmJ1dHRvbkVsZW1lbnQ9YS5maW5kKGIpLHRoaXMuYnV0dG9uRWxlbWVudC5sZW5ndGh8fChhPWEubGVuZ3RoP2Euc2libGluZ3MoKTp0aGlzLmVsZW1lbnQuc2libGluZ3MoKSx0aGlzLmJ1dHRvbkVsZW1lbnQ9YS5maWx0ZXIoYiksdGhpcy5idXR0b25FbGVtZW50Lmxlbmd0aHx8KHRoaXMuYnV0dG9uRWxlbWVudD1hLmZpbmQoYikpKSx0aGlzLmVsZW1lbnQuYWRkQ2xhc3MoInVpLWhlbHBlci1oaWRkZW4tYWNjZXNzaWJsZSIpO3ZhciBjPXRoaXMuZWxlbWVudC5pcygiOmNoZWNrZWQiKTtjJiZ0aGlzLmJ1dHRvbkVsZW1lbnQuYWRkQ2xhc3MoInVpLXN0YXRlLWFjdGl2ZSIpLHRoaXMuYnV0dG9uRWxlbWVudC5hdHRyKCJhcmlhLXByZXNzZWQiLGMpfWVsc2UgdGhpcy5idXR0b25FbGVtZW50PXRoaXMuZWxlbWVudH0sd2lkZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYnV0dG9uRWxlbWVudH0sZGVzdHJveTpmdW5jdGlvbigpe3RoaXMuZWxlbWVudC5yZW1vdmVDbGFzcygidWktaGVscGVyLWhpZGRlbi1hY2Nlc3NpYmxlIiksdGhpcy5idXR0b25FbGVtZW50LnJlbW92ZUNsYXNzKGcrIiAiK2grIiAiK2kpLnJlbW92ZUF0dHIoInJvbGUiKS5yZW1vdmVBdHRyKCJhcmlhLXByZXNzZWQiKS5odG1sKHRoaXMuYnV0dG9uRWxlbWVudC5maW5kKCIudWktYnV0dG9uLXRleHQiKS5odG1sKCkpLHRoaXMuaGFzVGl0bGV8fHRoaXMuYnV0dG9uRWxlbWVudC5yZW1vdmVBdHRyKCJ0aXRsZSIpLGEuV2lkZ2V0LnByb3RvdHlwZS5kZXN0cm95LmNhbGwodGhpcyl9LF9zZXRPcHRpb246ZnVuY3Rpb24oYixjKXthLldpZGdldC5wcm90b3R5cGUuX3NldE9wdGlvbi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7aWYoYj09PSJkaXNhYmxlZCIpe2M/dGhpcy5lbGVtZW50LnByb3BBdHRyKCJkaXNhYmxlZCIsITApOnRoaXMuZWxlbWVudC5wcm9wQXR0cigiZGlzYWJsZWQiLCExKTtyZXR1cm59dGhpcy5fcmVzZXRCdXR0b24oKX0scmVmcmVzaDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZWxlbWVudC5pcygiOmRpc2FibGVkIik7YiE9PXRoaXMub3B0aW9ucy5kaXNhYmxlZCYmdGhpcy5fc2V0T3B0aW9uKCJkaXNhYmxlZCIsYiksdGhpcy50eXBlPT09InJhZGlvIj9rKHRoaXMuZWxlbWVudFswXSkuZWFjaChmdW5jdGlvbigpe2EodGhpcykuaXMoIjpjaGVja2VkIik/YSh0aGlzKS5idXR0b24oIndpZGdldCIpLmFkZENsYXNzKCJ1aS1zdGF0ZS1hY3RpdmUiKS5hdHRyKCJhcmlhLXByZXNzZWQiLCJ0cnVlIik6YSh0aGlzKS5idXR0b24oIndpZGdldCIpLnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1hY3RpdmUiKS5hdHRyKCJhcmlhLXByZXNzZWQiLCJmYWxzZSIpfSk6dGhpcy50eXBlPT09ImNoZWNrYm94IiYmKHRoaXMuZWxlbWVudC5pcygiOmNoZWNrZWQiKT90aGlzLmJ1dHRvbkVsZW1lbnQuYWRkQ2xhc3MoInVpLXN0YXRlLWFjdGl2ZSIpLmF0dHIoImFyaWEtcHJlc3NlZCIsInRydWUiKTp0aGlzLmJ1dHRvbkVsZW1lbnQucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLWFjdGl2ZSIpLmF0dHIoImFyaWEtcHJlc3NlZCIsImZhbHNlIikpfSxfcmVzZXRCdXR0b246ZnVuY3Rpb24oKXtpZih0aGlzLnR5cGU9PT0iaW5wdXQiKXt0aGlzLm9wdGlvbnMubGFiZWwmJnRoaXMuZWxlbWVudC52YWwodGhpcy5vcHRpb25zLmxhYmVsKTtyZXR1cm59dmFyIGI9dGhpcy5idXR0b25FbGVtZW50LnJlbW92ZUNsYXNzKGkpLGM9YSgiPHNwYW4+PC9zcGFuPiIsdGhpcy5lbGVtZW50WzBdLm93bmVyRG9jdW1lbnQpLmFkZENsYXNzKCJ1aS1idXR0b24tdGV4dCIpLmh0bWwodGhpcy5vcHRpb25zLmxhYmVsKS5hcHBlbmRUbyhiLmVtcHR5KCkpLnRleHQoKSxkPXRoaXMub3B0aW9ucy5pY29ucyxlPWQucHJpbWFyeSYmZC5zZWNvbmRhcnksZj1bXTtkLnByaW1hcnl8fGQuc2Vjb25kYXJ5Pyh0aGlzLm9wdGlvbnMudGV4dCYmZi5wdXNoKCJ1aS1idXR0b24tdGV4dC1pY29uIisoZT8icyI6ZC5wcmltYXJ5PyItcHJpbWFyeSI6Ii1zZWNvbmRhcnkiKSksZC5wcmltYXJ5JiZiLnByZXBlbmQoIjxzcGFuIGNsYXNzPSd1aS1idXR0b24taWNvbi1wcmltYXJ5IHVpLWljb24gIitkLnByaW1hcnkrIic+PC9zcGFuPiIpLGQuc2Vjb25kYXJ5JiZiLmFwcGVuZCgiPHNwYW4gY2xhc3M9J3VpLWJ1dHRvbi1pY29uLXNlY29uZGFyeSB1aS1pY29uICIrZC5zZWNvbmRhcnkrIic+PC9zcGFuPiIpLHRoaXMub3B0aW9ucy50ZXh0fHwoZi5wdXNoKGU/InVpLWJ1dHRvbi1pY29ucy1vbmx5IjoidWktYnV0dG9uLWljb24tb25seSIpLHRoaXMuaGFzVGl0bGV8fGIuYXR0cigidGl0bGUiLGMpKSk6Zi5wdXNoKCJ1aS1idXR0b24tdGV4dC1vbmx5IiksYi5hZGRDbGFzcyhmLmpvaW4oIiAiKSl9fSksYS53aWRnZXQoInVpLmJ1dHRvbnNldCIse29wdGlvbnM6e2l0ZW1zOiI6YnV0dG9uLCA6c3VibWl0LCA6cmVzZXQsIDpjaGVja2JveCwgOnJhZGlvLCBhLCA6ZGF0YShidXR0b24pIn0sX2NyZWF0ZTpmdW5jdGlvbigpe3RoaXMuZWxlbWVudC5hZGRDbGFzcygidWktYnV0dG9uc2V0Iil9LF9pbml0OmZ1bmN0aW9uKCl7dGhpcy5yZWZyZXNoKCl9LF9zZXRPcHRpb246ZnVuY3Rpb24oYixjKXtiPT09ImRpc2FibGVkIiYmdGhpcy5idXR0b25zLmJ1dHRvbigib3B0aW9uIixiLGMpLGEuV2lkZ2V0LnByb3RvdHlwZS5fc2V0T3B0aW9uLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0scmVmcmVzaDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZWxlbWVudC5jc3MoImRpcmVjdGlvbiIpPT09InJ0bCI7dGhpcy5idXR0b25zPXRoaXMuZWxlbWVudC5maW5kKHRoaXMub3B0aW9ucy5pdGVtcykuZmlsdGVyKCI6dWktYnV0dG9uIikuYnV0dG9uKCJyZWZyZXNoIikuZW5kKCkubm90KCI6dWktYnV0dG9uIikuYnV0dG9uKCkuZW5kKCkubWFwKGZ1bmN0aW9uKCl7cmV0dXJuIGEodGhpcykuYnV0dG9uKCJ3aWRnZXQiKVswXX0pLnJlbW92ZUNsYXNzKCJ1aS1jb3JuZXItYWxsIHVpLWNvcm5lci1sZWZ0IHVpLWNvcm5lci1yaWdodCIpLmZpbHRlcigiOmZpcnN0IikuYWRkQ2xhc3MoYj8idWktY29ybmVyLXJpZ2h0IjoidWktY29ybmVyLWxlZnQiKS5lbmQoKS5maWx0ZXIoIjpsYXN0IikuYWRkQ2xhc3MoYj8idWktY29ybmVyLWxlZnQiOiJ1aS1jb3JuZXItcmlnaHQiKS5lbmQoKS5lbmQoKX0sZGVzdHJveTpmdW5jdGlvbigpe3RoaXMuZWxlbWVudC5yZW1vdmVDbGFzcygidWktYnV0dG9uc2V0IiksdGhpcy5idXR0b25zLm1hcChmdW5jdGlvbigpe3JldHVybiBhKHRoaXMpLmJ1dHRvbigid2lkZ2V0IilbMF19KS5yZW1vdmVDbGFzcygidWktY29ybmVyLWxlZnQgdWktY29ybmVyLXJpZ2h0IikuZW5kKCkuYnV0dG9uKCJkZXN0cm95IiksYS5XaWRnZXQucHJvdG90eXBlLmRlc3Ryb3kuY2FsbCh0aGlzKX19KX0pKGpRdWVyeSk7Oy8qISBqUXVlcnkgVUkgLSB2MS44LjIzIC0gMjAxMi0wOC0xNQotKiBodHRwczovL2dpdGh1Yi5jb20vanF1ZXJ5L2pxdWVyeS11aQotKiBJbmNsdWRlczoganF1ZXJ5LnVpLmRpYWxvZy5qcwotKiBDb3B5cmlnaHQgKGMpIDIwMTIgQVVUSE9SUy50eHQ7IExpY2Vuc2VkIE1JVCwgR1BMICovCi0oZnVuY3Rpb24oYSxiKXt2YXIgYz0idWktZGlhbG9nIHVpLXdpZGdldCB1aS13aWRnZXQtY29udGVudCB1aS1jb3JuZXItYWxsICIsZD17YnV0dG9uczohMCxoZWlnaHQ6ITAsbWF4SGVpZ2h0OiEwLG1heFdpZHRoOiEwLG1pbkhlaWdodDohMCxtaW5XaWR0aDohMCx3aWR0aDohMH0sZT17bWF4SGVpZ2h0OiEwLG1heFdpZHRoOiEwLG1pbkhlaWdodDohMCxtaW5XaWR0aDohMH07YS53aWRnZXQoInVpLmRpYWxvZyIse29wdGlvbnM6e2F1dG9PcGVuOiEwLGJ1dHRvbnM6e30sY2xvc2VPbkVzY2FwZTohMCxjbG9zZVRleHQ6ImNsb3NlIixkaWFsb2dDbGFzczoiIixkcmFnZ2FibGU6ITAsaGlkZTpudWxsLGhlaWdodDoiYXV0byIsbWF4SGVpZ2h0OiExLG1heFdpZHRoOiExLG1pbkhlaWdodDoxNTAsbWluV2lkdGg6MTUwLG1vZGFsOiExLHBvc2l0aW9uOntteToiY2VudGVyIixhdDoiY2VudGVyIixjb2xsaXNpb246ImZpdCIsdXNpbmc6ZnVuY3Rpb24oYil7dmFyIGM9YSh0aGlzKS5jc3MoYikub2Zmc2V0KCkudG9wO2M8MCYmYSh0aGlzKS5jc3MoInRvcCIsYi50b3AtYyl9fSxyZXNpemFibGU6ITAsc2hvdzpudWxsLHN0YWNrOiEwLHRpdGxlOiIiLHdpZHRoOjMwMCx6SW5kZXg6MWUzfSxfY3JlYXRlOmZ1bmN0aW9uKCl7dGhpcy5vcmlnaW5hbFRpdGxlPXRoaXMuZWxlbWVudC5hdHRyKCJ0aXRsZSIpLHR5cGVvZiB0aGlzLm9yaWdpbmFsVGl0bGUhPSJzdHJpbmciJiYodGhpcy5vcmlnaW5hbFRpdGxlPSIiKSx0aGlzLm9wdGlvbnMudGl0bGU9dGhpcy5vcHRpb25zLnRpdGxlfHx0aGlzLm9yaWdpbmFsVGl0bGU7dmFyIGI9dGhpcyxkPWIub3B0aW9ucyxlPWQudGl0bGV8fCImIzE2MDsiLGY9YS51aS5kaWFsb2cuZ2V0VGl0bGVJZChiLmVsZW1lbnQpLGc9KGIudWlEaWFsb2c9YSgiPGRpdj48L2Rpdj4iKSkuYXBwZW5kVG8oZG9jdW1lbnQuYm9keSkuaGlkZSgpLmFkZENsYXNzKGMrZC5kaWFsb2dDbGFzcykuY3NzKHt6SW5kZXg6ZC56SW5kZXh9KS5hdHRyKCJ0YWJJbmRleCIsLTEpLmNzcygib3V0bGluZSIsMCkua2V5ZG93bihmdW5jdGlvbihjKXtkLmNsb3NlT25Fc2NhcGUmJiFjLmlzRGVmYXVsdFByZXZlbnRlZCgpJiZjLmtleUNvZGUmJmMua2V5Q29kZT09PWEudWkua2V5Q29kZS5FU0NBUEUmJihiLmNsb3NlKGMpLGMucHJldmVudERlZmF1bHQoKSl9KS5hdHRyKHtyb2xlOiJkaWFsb2ciLCJhcmlhLWxhYmVsbGVkYnkiOmZ9KS5tb3VzZWRvd24oZnVuY3Rpb24oYSl7Yi5tb3ZlVG9Ub3AoITEsYSl9KSxoPWIuZWxlbWVudC5zaG93KCkucmVtb3ZlQXR0cigidGl0bGUiKS5hZGRDbGFzcygidWktZGlhbG9nLWNvbnRlbnQgdWktd2lkZ2V0LWNvbnRlbnQiKS5hcHBlbmRUbyhnKSxpPShiLnVpRGlhbG9nVGl0bGViYXI9YSgiPGRpdj48L2Rpdj4iKSkuYWRkQ2xhc3MoInVpLWRpYWxvZy10aXRsZWJhciB1aS13aWRnZXQtaGVhZGVyIHVpLWNvcm5lci1hbGwgdWktaGVscGVyLWNsZWFyZml4IikucHJlcGVuZFRvKGcpLGo9YSgnPGEgaHJlZj0iIyI+PC9hPicpLmFkZENsYXNzKCJ1aS1kaWFsb2ctdGl0bGViYXItY2xvc2UgdWktY29ybmVyLWFsbCIpLmF0dHIoInJvbGUiLCJidXR0b24iKS5ob3ZlcihmdW5jdGlvbigpe2ouYWRkQ2xhc3MoInVpLXN0YXRlLWhvdmVyIil9LGZ1bmN0aW9uKCl7ai5yZW1vdmVDbGFzcygidWktc3RhdGUtaG92ZXIiKX0pLmZvY3VzKGZ1bmN0aW9uKCl7ai5hZGRDbGFzcygidWktc3RhdGUtZm9jdXMiKX0pLmJsdXIoZnVuY3Rpb24oKXtqLnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1mb2N1cyIpfSkuY2xpY2soZnVuY3Rpb24oYSl7cmV0dXJuIGIuY2xvc2UoYSksITF9KS5hcHBlbmRUbyhpKSxrPShiLnVpRGlhbG9nVGl0bGViYXJDbG9zZVRleHQ9YSgiPHNwYW4+PC9zcGFuPiIpKS5hZGRDbGFzcygidWktaWNvbiB1aS1pY29uLWNsb3NldGhpY2siKS50ZXh0KGQuY2xvc2VUZXh0KS5hcHBlbmRUbyhqKSxsPWEoIjxzcGFuPjwvc3Bhbj4iKS5hZGRDbGFzcygidWktZGlhbG9nLXRpdGxlIikuYXR0cigiaWQiLGYpLmh0bWwoZSkucHJlcGVuZFRvKGkpO2EuaXNGdW5jdGlvbihkLmJlZm9yZWNsb3NlKSYmIWEuaXNGdW5jdGlvbihkLmJlZm9yZUNsb3NlKSYmKGQuYmVmb3JlQ2xvc2U9ZC5iZWZvcmVjbG9zZSksaS5maW5kKCIqIikuYWRkKGkpLmRpc2FibGVTZWxlY3Rpb24oKSxkLmRyYWdnYWJsZSYmYS5mbi5kcmFnZ2FibGUmJmIuX21ha2VEcmFnZ2FibGUoKSxkLnJlc2l6YWJsZSYmYS5mbi5yZXNpemFibGUmJmIuX21ha2VSZXNpemFibGUoKSxiLl9jcmVhdGVCdXR0b25zKGQuYnV0dG9ucyksYi5faXNPcGVuPSExLGEuZm4uYmdpZnJhbWUmJmcuYmdpZnJhbWUoKX0sX2luaXQ6ZnVuY3Rpb24oKXt0aGlzLm9wdGlvbnMuYXV0b09wZW4mJnRoaXMub3BlbigpfSxkZXN0cm95OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcztyZXR1cm4gYS5vdmVybGF5JiZhLm92ZXJsYXkuZGVzdHJveSgpLGEudWlEaWFsb2cuaGlkZSgpLGEuZWxlbWVudC51bmJpbmQoIi5kaWFsb2ciKS5yZW1vdmVEYXRhKCJkaWFsb2ciKS5yZW1vdmVDbGFzcygidWktZGlhbG9nLWNvbnRlbnQgdWktd2lkZ2V0LWNvbnRlbnQiKS5oaWRlKCkuYXBwZW5kVG8oImJvZHkiKSxhLnVpRGlhbG9nLnJlbW92ZSgpLGEub3JpZ2luYWxUaXRsZSYmYS5lbGVtZW50LmF0dHIoInRpdGxlIixhLm9yaWdpbmFsVGl0bGUpLGF9LHdpZGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnVpRGlhbG9nfSxjbG9zZTpmdW5jdGlvbihiKXt2YXIgYz10aGlzLGQsZTtpZighMT09PWMuX3RyaWdnZXIoImJlZm9yZUNsb3NlIixiKSlyZXR1cm47cmV0dXJuIGMub3ZlcmxheSYmYy5vdmVybGF5LmRlc3Ryb3koKSxjLnVpRGlhbG9nLnVuYmluZCgia2V5cHJlc3MudWktZGlhbG9nIiksYy5faXNPcGVuPSExLGMub3B0aW9ucy5oaWRlP2MudWlEaWFsb2cuaGlkZShjLm9wdGlvbnMuaGlkZSxmdW5jdGlvbigpe2MuX3RyaWdnZXIoImNsb3NlIixiKX0pOihjLnVpRGlhbG9nLmhpZGUoKSxjLl90cmlnZ2VyKCJjbG9zZSIsYikpLGEudWkuZGlhbG9nLm92ZXJsYXkucmVzaXplKCksYy5vcHRpb25zLm1vZGFsJiYoZD0wLGEoIi51aS1kaWFsb2ciKS5lYWNoKGZ1bmN0aW9uKCl7dGhpcyE9PWMudWlEaWFsb2dbMF0mJihlPWEodGhpcykuY3NzKCJ6LWluZGV4IiksaXNOYU4oZSl8fChkPU1hdGgubWF4KGQsZSkpKX0pLGEudWkuZGlhbG9nLm1heFo9ZCksY30saXNPcGVuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2lzT3Blbn0sbW92ZVRvVG9wOmZ1bmN0aW9uKGIsYyl7dmFyIGQ9dGhpcyxlPWQub3B0aW9ucyxmO3JldHVybiBlLm1vZGFsJiYhYnx8IWUuc3RhY2smJiFlLm1vZGFsP2QuX3RyaWdnZXIoImZvY3VzIixjKTooZS56SW5kZXg+YS51aS5kaWFsb2cubWF4WiYmKGEudWkuZGlhbG9nLm1heFo9ZS56SW5kZXgpLGQub3ZlcmxheSYmKGEudWkuZGlhbG9nLm1heForPTEsZC5vdmVybGF5LiRlbC5jc3MoInotaW5kZXgiLGEudWkuZGlhbG9nLm92ZXJsYXkubWF4Wj1hLnVpLmRpYWxvZy5tYXhaKSksZj17c2Nyb2xsVG9wOmQuZWxlbWVudC5zY3JvbGxUb3AoKSxzY3JvbGxMZWZ0OmQuZWxlbWVudC5zY3JvbGxMZWZ0KCl9LGEudWkuZGlhbG9nLm1heForPTEsZC51aURpYWxvZy5jc3MoInotaW5kZXgiLGEudWkuZGlhbG9nLm1heFopLGQuZWxlbWVudC5hdHRyKGYpLGQuX3RyaWdnZXIoImZvY3VzIixjKSxkKX0sb3BlbjpmdW5jdGlvbigpe2lmKHRoaXMuX2lzT3BlbilyZXR1cm47dmFyIGI9dGhpcyxjPWIub3B0aW9ucyxkPWIudWlEaWFsb2c7cmV0dXJuIGIub3ZlcmxheT1jLm1vZGFsP25ldyBhLnVpLmRpYWxvZy5vdmVybGF5KGIpOm51bGwsYi5fc2l6ZSgpLGIuX3Bvc2l0aW9uKGMucG9zaXRpb24pLGQuc2hvdyhjLnNob3cpLGIubW92ZVRvVG9wKCEwKSxjLm1vZGFsJiZkLmJpbmQoImtleWRvd24udWktZGlhbG9nIixmdW5jdGlvbihiKXtpZihiLmtleUNvZGUhPT1hLnVpLmtleUNvZGUuVEFCKXJldHVybjt2YXIgYz1hKCI6dGFiYmFibGUiLHRoaXMpLGQ9Yy5maWx0ZXIoIjpmaXJzdCIpLGU9Yy5maWx0ZXIoIjpsYXN0Iik7aWYoYi50YXJnZXQ9PT1lWzBdJiYhYi5zaGlmdEtleSlyZXR1cm4gZC5mb2N1cygxKSwhMTtpZihiLnRhcmdldD09PWRbMF0mJmIuc2hpZnRLZXkpcmV0dXJuIGUuZm9jdXMoMSksITF9KSxhKGIuZWxlbWVudC5maW5kKCI6dGFiYmFibGUiKS5nZXQoKS5jb25jYXQoZC5maW5kKCIudWktZGlhbG9nLWJ1dHRvbnBhbmUgOnRhYmJhYmxlIikuZ2V0KCkuY29uY2F0KGQuZ2V0KCkpKSkuZXEoMCkuZm9jdXMoKSxiLl9pc09wZW49ITAsYi5fdHJpZ2dlcigib3BlbiIpLGJ9LF9jcmVhdGVCdXR0b25zOmZ1bmN0aW9uKGIpe3ZhciBjPXRoaXMsZD0hMSxlPWEoIjxkaXY+PC9kaXY+IikuYWRkQ2xhc3MoInVpLWRpYWxvZy1idXR0b25wYW5lIHVpLXdpZGdldC1jb250ZW50IHVpLWhlbHBlci1jbGVhcmZpeCIpLGY9YSgiPGRpdj48L2Rpdj4iKS5hZGRDbGFzcygidWktZGlhbG9nLWJ1dHRvbnNldCIpLmFwcGVuZFRvKGUpO2MudWlEaWFsb2cuZmluZCgiLnVpLWRpYWxvZy1idXR0b25wYW5lIikucmVtb3ZlKCksdHlwZW9mIGI9PSJvYmplY3QiJiZiIT09bnVsbCYmYS5lYWNoKGIsZnVuY3Rpb24oKXtyZXR1cm4hKGQ9ITApfSksZCYmKGEuZWFjaChiLGZ1bmN0aW9uKGIsZCl7ZD1hLmlzRnVuY3Rpb24oZCk/e2NsaWNrOmQsdGV4dDpifTpkO3ZhciBlPWEoJzxidXR0b24gdHlwZT0iYnV0dG9uIj48L2J1dHRvbj4nKS5jbGljayhmdW5jdGlvbigpe2QuY2xpY2suYXBwbHkoYy5lbGVtZW50WzBdLGFyZ3VtZW50cyl9KS5hcHBlbmRUbyhmKTthLmVhY2goZCxmdW5jdGlvbihhLGIpe2lmKGE9PT0iY2xpY2siKXJldHVybjthIGluIGU/ZVthXShiKTplLmF0dHIoYSxiKX0pLGEuZm4uYnV0dG9uJiZlLmJ1dHRvbigpfSksZS5hcHBlbmRUbyhjLnVpRGlhbG9nKSl9LF9tYWtlRHJhZ2dhYmxlOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gZihhKXtyZXR1cm57cG9zaXRpb246YS5wb3NpdGlvbixvZmZzZXQ6YS5vZmZzZXR9fXZhciBiPXRoaXMsYz1iLm9wdGlvbnMsZD1hKGRvY3VtZW50KSxlO2IudWlEaWFsb2cuZHJhZ2dhYmxlKHtjYW5jZWw6Ii51aS1kaWFsb2ctY29udGVudCwgLnVpLWRpYWxvZy10aXRsZWJhci1jbG9zZSIsaGFuZGxlOiIudWktZGlhbG9nLXRpdGxlYmFyIixjb250YWlubWVudDoiZG9jdW1lbnQiLHN0YXJ0OmZ1bmN0aW9uKGQsZyl7ZT1jLmhlaWdodD09PSJhdXRvIj8iYXV0byI6YSh0aGlzKS5oZWlnaHQoKSxhKHRoaXMpLmhlaWdodChhKHRoaXMpLmhlaWdodCgpKS5hZGRDbGFzcygidWktZGlhbG9nLWRyYWdnaW5nIiksYi5fdHJpZ2dlcigiZHJhZ1N0YXJ0IixkLGYoZykpfSxkcmFnOmZ1bmN0aW9uKGEsYyl7Yi5fdHJpZ2dlcigiZHJhZyIsYSxmKGMpKX0sc3RvcDpmdW5jdGlvbihnLGgpe2MucG9zaXRpb249W2gucG9zaXRpb24ubGVmdC1kLnNjcm9sbExlZnQoKSxoLnBvc2l0aW9uLnRvcC1kLnNjcm9sbFRvcCgpXSxhKHRoaXMpLnJlbW92ZUNsYXNzKCJ1aS1kaWFsb2ctZHJhZ2dpbmciKS5oZWlnaHQoZSksYi5fdHJpZ2dlcigiZHJhZ1N0b3AiLGcsZihoKSksYS51aS5kaWFsb2cub3ZlcmxheS5yZXNpemUoKX19KX0sX21ha2VSZXNpemFibGU6ZnVuY3Rpb24oYyl7ZnVuY3Rpb24gaChhKXtyZXR1cm57b3JpZ2luYWxQb3NpdGlvbjphLm9yaWdpbmFsUG9zaXRpb24sb3JpZ2luYWxTaXplOmEub3JpZ2luYWxTaXplLHBvc2l0aW9uOmEucG9zaXRpb24sc2l6ZTphLnNpemV9fWM9Yz09PWI/dGhpcy5vcHRpb25zLnJlc2l6YWJsZTpjO3ZhciBkPXRoaXMsZT1kLm9wdGlvbnMsZj1kLnVpRGlhbG9nLmNzcygicG9zaXRpb24iKSxnPXR5cGVvZiBjPT0ic3RyaW5nIj9jOiJuLGUscyx3LHNlLHN3LG5lLG53IjtkLnVpRGlhbG9nLnJlc2l6YWJsZSh7Y2FuY2VsOiIudWktZGlhbG9nLWNvbnRlbnQiLGNvbnRhaW5tZW50OiJkb2N1bWVudCIsYWxzb1Jlc2l6ZTpkLmVsZW1lbnQsbWF4V2lkdGg6ZS5tYXhXaWR0aCxtYXhIZWlnaHQ6ZS5tYXhIZWlnaHQsbWluV2lkdGg6ZS5taW5XaWR0aCxtaW5IZWlnaHQ6ZC5fbWluSGVpZ2h0KCksaGFuZGxlczpnLHN0YXJ0OmZ1bmN0aW9uKGIsYyl7YSh0aGlzKS5hZGRDbGFzcygidWktZGlhbG9nLXJlc2l6aW5nIiksZC5fdHJpZ2dlcigicmVzaXplU3RhcnQiLGIsaChjKSl9LHJlc2l6ZTpmdW5jdGlvbihhLGIpe2QuX3RyaWdnZXIoInJlc2l6ZSIsYSxoKGIpKX0sc3RvcDpmdW5jdGlvbihiLGMpe2EodGhpcykucmVtb3ZlQ2xhc3MoInVpLWRpYWxvZy1yZXNpemluZyIpLGUuaGVpZ2h0PWEodGhpcykuaGVpZ2h0KCksZS53aWR0aD1hKHRoaXMpLndpZHRoKCksZC5fdHJpZ2dlcigicmVzaXplU3RvcCIsYixoKGMpKSxhLnVpLmRpYWxvZy5vdmVybGF5LnJlc2l6ZSgpfX0pLmNzcygicG9zaXRpb24iLGYpLmZpbmQoIi51aS1yZXNpemFibGUtc2UiKS5hZGRDbGFzcygidWktaWNvbiB1aS1pY29uLWdyaXAtZGlhZ29uYWwtc2UiKX0sX21pbkhlaWdodDpmdW5jdGlvbigpe3ZhciBhPXRoaXMub3B0aW9ucztyZXR1cm4gYS5oZWlnaHQ9PT0iYXV0byI/YS5taW5IZWlnaHQ6TWF0aC5taW4oYS5taW5IZWlnaHQsYS5oZWlnaHQpfSxfcG9zaXRpb246ZnVuY3Rpb24oYil7dmFyIGM9W10sZD1bMCwwXSxlO2lmKGIpe2lmKHR5cGVvZiBiPT0ic3RyaW5nInx8dHlwZW9mIGI9PSJvYmplY3QiJiYiMCJpbiBiKWM9Yi5zcGxpdD9iLnNwbGl0KCIgIik6W2JbMF0sYlsxXV0sYy5sZW5ndGg9PT0xJiYoY1sxXT1jWzBdKSxhLmVhY2goWyJsZWZ0IiwidG9wIl0sZnVuY3Rpb24oYSxiKXsrY1thXT09PWNbYV0mJihkW2FdPWNbYV0sY1thXT1iKX0pLGI9e215OmMuam9pbigiICIpLGF0OmMuam9pbigiICIpLG9mZnNldDpkLmpvaW4oIiAiKX07Yj1hLmV4dGVuZCh7fSxhLnVpLmRpYWxvZy5wcm90b3R5cGUub3B0aW9ucy5wb3NpdGlvbixiKX1lbHNlIGI9YS51aS5kaWFsb2cucHJvdG90eXBlLm9wdGlvbnMucG9zaXRpb247ZT10aGlzLnVpRGlhbG9nLmlzKCI6dmlzaWJsZSIpLGV8fHRoaXMudWlEaWFsb2cuc2hvdygpLHRoaXMudWlEaWFsb2cuY3NzKHt0b3A6MCxsZWZ0OjB9KS5wb3NpdGlvbihhLmV4dGVuZCh7b2Y6d2luZG93fSxiKSksZXx8dGhpcy51aURpYWxvZy5oaWRlKCl9LF9zZXRPcHRpb25zOmZ1bmN0aW9uKGIpe3ZhciBjPXRoaXMsZj17fSxnPSExO2EuZWFjaChiLGZ1bmN0aW9uKGEsYil7Yy5fc2V0T3B0aW9uKGEsYiksYSBpbiBkJiYoZz0hMCksYSBpbiBlJiYoZlthXT1iKX0pLGcmJnRoaXMuX3NpemUoKSx0aGlzLnVpRGlhbG9nLmlzKCI6ZGF0YShyZXNpemFibGUpIikmJnRoaXMudWlEaWFsb2cucmVzaXphYmxlKCJvcHRpb24iLGYpfSxfc2V0T3B0aW9uOmZ1bmN0aW9uKGIsZCl7dmFyIGU9dGhpcyxmPWUudWlEaWFsb2c7c3dpdGNoKGIpe2Nhc2UiYmVmb3JlY2xvc2UiOmI9ImJlZm9yZUNsb3NlIjticmVhaztjYXNlImJ1dHRvbnMiOmUuX2NyZWF0ZUJ1dHRvbnMoZCk7YnJlYWs7Y2FzZSJjbG9zZVRleHQiOmUudWlEaWFsb2dUaXRsZWJhckNsb3NlVGV4dC50ZXh0KCIiK2QpO2JyZWFrO2Nhc2UiZGlhbG9nQ2xhc3MiOmYucmVtb3ZlQ2xhc3MoZS5vcHRpb25zLmRpYWxvZ0NsYXNzKS5hZGRDbGFzcyhjK2QpO2JyZWFrO2Nhc2UiZGlzYWJsZWQiOmQ/Zi5hZGRDbGFzcygidWktZGlhbG9nLWRpc2FibGVkIik6Zi5yZW1vdmVDbGFzcygidWktZGlhbG9nLWRpc2FibGVkIik7YnJlYWs7Y2FzZSJkcmFnZ2FibGUiOnZhciBnPWYuaXMoIjpkYXRhKGRyYWdnYWJsZSkiKTtnJiYhZCYmZi5kcmFnZ2FibGUoImRlc3Ryb3kiKSwhZyYmZCYmZS5fbWFrZURyYWdnYWJsZSgpO2JyZWFrO2Nhc2UicG9zaXRpb24iOmUuX3Bvc2l0aW9uKGQpO2JyZWFrO2Nhc2UicmVzaXphYmxlIjp2YXIgaD1mLmlzKCI6ZGF0YShyZXNpemFibGUpIik7aCYmIWQmJmYucmVzaXphYmxlKCJkZXN0cm95IiksaCYmdHlwZW9mIGQ9PSJzdHJpbmciJiZmLnJlc2l6YWJsZSgib3B0aW9uIiwiaGFuZGxlcyIsZCksIWgmJmQhPT0hMSYmZS5fbWFrZVJlc2l6YWJsZShkKTticmVhaztjYXNlInRpdGxlIjphKCIudWktZGlhbG9nLXRpdGxlIixlLnVpRGlhbG9nVGl0bGViYXIpLmh0bWwoIiIrKGR8fCImIzE2MDsiKSl9YS5XaWRnZXQucHJvdG90eXBlLl9zZXRPcHRpb24uYXBwbHkoZSxhcmd1bWVudHMpfSxfc2l6ZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMub3B0aW9ucyxjLGQsZT10aGlzLnVpRGlhbG9nLmlzKCI6dmlzaWJsZSIpO3RoaXMuZWxlbWVudC5zaG93KCkuY3NzKHt3aWR0aDoiYXV0byIsbWluSGVpZ2h0OjAsaGVpZ2h0OjB9KSxiLm1pbldpZHRoPmIud2lkdGgmJihiLndpZHRoPWIubWluV2lkdGgpLGM9dGhpcy51aURpYWxvZy5jc3Moe2hlaWdodDoiYXV0byIsd2lkdGg6Yi53aWR0aH0pLmhlaWdodCgpLGQ9TWF0aC5tYXgoMCxiLm1pbkhlaWdodC1jKTtpZihiLmhlaWdodD09PSJhdXRvIilpZihhLnN1cHBvcnQubWluSGVpZ2h0KXRoaXMuZWxlbWVudC5jc3Moe21pbkhlaWdodDpkLGhlaWdodDoiYXV0byJ9KTtlbHNle3RoaXMudWlEaWFsb2cuc2hvdygpO3ZhciBmPXRoaXMuZWxlbWVudC5jc3MoImhlaWdodCIsImF1dG8iKS5oZWlnaHQoKTtlfHx0aGlzLnVpRGlhbG9nLmhpZGUoKSx0aGlzLmVsZW1lbnQuaGVpZ2h0KE1hdGgubWF4KGYsZCkpfWVsc2UgdGhpcy5lbGVtZW50LmhlaWdodChNYXRoLm1heChiLmhlaWdodC1jLDApKTt0aGlzLnVpRGlhbG9nLmlzKCI6ZGF0YShyZXNpemFibGUpIikmJnRoaXMudWlEaWFsb2cucmVzaXphYmxlKCJvcHRpb24iLCJtaW5IZWlnaHQiLHRoaXMuX21pbkhlaWdodCgpKX19KSxhLmV4dGVuZChhLnVpLmRpYWxvZyx7dmVyc2lvbjoiMS44LjIzIix1dWlkOjAsbWF4WjowLGdldFRpdGxlSWQ6ZnVuY3Rpb24oYSl7dmFyIGI9YS5hdHRyKCJpZCIpO3JldHVybiBifHwodGhpcy51dWlkKz0xLGI9dGhpcy51dWlkKSwidWktZGlhbG9nLXRpdGxlLSIrYn0sb3ZlcmxheTpmdW5jdGlvbihiKXt0aGlzLiRlbD1hLnVpLmRpYWxvZy5vdmVybGF5LmNyZWF0ZShiKX19KSxhLmV4dGVuZChhLnVpLmRpYWxvZy5vdmVybGF5LHtpbnN0YW5jZXM6W10sb2xkSW5zdGFuY2VzOltdLG1heFo6MCxldmVudHM6YS5tYXAoImZvY3VzLG1vdXNlZG93bixtb3VzZXVwLGtleWRvd24sa2V5cHJlc3MsY2xpY2siLnNwbGl0KCIsIiksZnVuY3Rpb24oYSl7cmV0dXJuIGErIi5kaWFsb2ctb3ZlcmxheSJ9KS5qb2luKCIgIiksY3JlYXRlOmZ1bmN0aW9uKGIpe3RoaXMuaW5zdGFuY2VzLmxlbmd0aD09PTAmJihzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YS51aS5kaWFsb2cub3ZlcmxheS5pbnN0YW5jZXMubGVuZ3RoJiZhKGRvY3VtZW50KS5iaW5kKGEudWkuZGlhbG9nLm92ZXJsYXkuZXZlbnRzLGZ1bmN0aW9uKGIpe2lmKGEoYi50YXJnZXQpLnpJbmRleCgpPGEudWkuZGlhbG9nLm92ZXJsYXkubWF4WilyZXR1cm4hMX0pfSwxKSxhKGRvY3VtZW50KS5iaW5kKCJrZXlkb3duLmRpYWxvZy1vdmVybGF5IixmdW5jdGlvbihjKXtiLm9wdGlvbnMuY2xvc2VPbkVzY2FwZSYmIWMuaXNEZWZhdWx0UHJldmVudGVkKCkmJmMua2V5Q29kZSYmYy5rZXlDb2RlPT09YS51aS5rZXlDb2RlLkVTQ0FQRSYmKGIuY2xvc2UoYyksYy5wcmV2ZW50RGVmYXVsdCgpKX0pLGEod2luZG93KS5iaW5kKCJyZXNpemUuZGlhbG9nLW92ZXJsYXkiLGEudWkuZGlhbG9nLm92ZXJsYXkucmVzaXplKSk7dmFyIGM9KHRoaXMub2xkSW5zdGFuY2VzLnBvcCgpfHxhKCI8ZGl2PjwvZGl2PiIpLmFkZENsYXNzKCJ1aS13aWRnZXQtb3ZlcmxheSIpKS5hcHBlbmRUbyhkb2N1bWVudC5ib2R5KS5jc3Moe3dpZHRoOnRoaXMud2lkdGgoKSxoZWlnaHQ6dGhpcy5oZWlnaHQoKX0pO3JldHVybiBhLmZuLmJnaWZyYW1lJiZjLmJnaWZyYW1lKCksdGhpcy5pbnN0YW5jZXMucHVzaChjKSxjfSxkZXN0cm95OmZ1bmN0aW9uKGIpe3ZhciBjPWEuaW5BcnJheShiLHRoaXMuaW5zdGFuY2VzKTtjIT0tMSYmdGhpcy5vbGRJbnN0YW5jZXMucHVzaCh0aGlzLmluc3RhbmNlcy5zcGxpY2UoYywxKVswXSksdGhpcy5pbnN0YW5jZXMubGVuZ3RoPT09MCYmYShbZG9jdW1lbnQsd2luZG93XSkudW5iaW5kKCIuZGlhbG9nLW92ZXJsYXkiKSxiLnJlbW92ZSgpO3ZhciBkPTA7YS5lYWNoKHRoaXMuaW5zdGFuY2VzLGZ1bmN0aW9uKCl7ZD1NYXRoLm1heChkLHRoaXMuY3NzKCJ6LWluZGV4IikpfSksdGhpcy5tYXhaPWR9LGhlaWdodDpmdW5jdGlvbigpe3ZhciBiLGM7cmV0dXJuIGEuYnJvd3Nlci5tc2llJiZhLmJyb3dzZXIudmVyc2lvbjw3PyhiPU1hdGgubWF4KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxIZWlnaHQsZG9jdW1lbnQuYm9keS5zY3JvbGxIZWlnaHQpLGM9TWF0aC5tYXgoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Lm9mZnNldEhlaWdodCxkb2N1bWVudC5ib2R5Lm9mZnNldEhlaWdodCksYjxjP2Eod2luZG93KS5oZWlnaHQoKSsicHgiOmIrInB4Iik6YShkb2N1bWVudCkuaGVpZ2h0KCkrInB4In0sd2lkdGg6ZnVuY3Rpb24oKXt2YXIgYixjO3JldHVybiBhLmJyb3dzZXIubXNpZT8oYj1NYXRoLm1heChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsV2lkdGgsZG9jdW1lbnQuYm9keS5zY3JvbGxXaWR0aCksYz1NYXRoLm1heChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQub2Zmc2V0V2lkdGgsZG9jdW1lbnQuYm9keS5vZmZzZXRXaWR0aCksYjxjP2Eod2luZG93KS53aWR0aCgpKyJweCI6YisicHgiKTphKGRvY3VtZW50KS53aWR0aCgpKyJweCJ9LHJlc2l6ZTpmdW5jdGlvbigpe3ZhciBiPWEoW10pO2EuZWFjaChhLnVpLmRpYWxvZy5vdmVybGF5Lmluc3RhbmNlcyxmdW5jdGlvbigpe2I9Yi5hZGQodGhpcyl9KSxiLmNzcyh7d2lkdGg6MCxoZWlnaHQ6MH0pLmNzcyh7d2lkdGg6YS51aS5kaWFsb2cub3ZlcmxheS53aWR0aCgpLGhlaWdodDphLnVpLmRpYWxvZy5vdmVybGF5LmhlaWdodCgpfSl9fSksYS5leHRlbmQoYS51aS5kaWFsb2cub3ZlcmxheS5wcm90b3R5cGUse2Rlc3Ryb3k6ZnVuY3Rpb24oKXthLnVpLmRpYWxvZy5vdmVybGF5LmRlc3Ryb3kodGhpcy4kZWwpfX0pfSkoalF1ZXJ5KTs7LyohIGpRdWVyeSBVSSAtIHYxLjguMjMgLSAyMDEyLTA4LTE1Ci0qIGh0dHBzOi8vZ2l0aHViLmNvbS9qcXVlcnkvanF1ZXJ5LXVpCi0qIEluY2x1ZGVzOiBqcXVlcnkudWkuc2xpZGVyLmpzCi0qIENvcHlyaWdodCAoYykgMjAxMiBBVVRIT1JTLnR4dDsgTGljZW5zZWQgTUlULCBHUEwgKi8KLShmdW5jdGlvbihhLGIpe3ZhciBjPTU7YS53aWRnZXQoInVpLnNsaWRlciIsYS51aS5tb3VzZSx7d2lkZ2V0RXZlbnRQcmVmaXg6InNsaWRlIixvcHRpb25zOnthbmltYXRlOiExLGRpc3RhbmNlOjAsbWF4OjEwMCxtaW46MCxvcmllbnRhdGlvbjoiaG9yaXpvbnRhbCIscmFuZ2U6ITEsc3RlcDoxLHZhbHVlOjAsdmFsdWVzOm51bGx9LF9jcmVhdGU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLGQ9dGhpcy5vcHRpb25zLGU9dGhpcy5lbGVtZW50LmZpbmQoIi51aS1zbGlkZXItaGFuZGxlIikuYWRkQ2xhc3MoInVpLXN0YXRlLWRlZmF1bHQgdWktY29ybmVyLWFsbCIpLGY9IjxhIGNsYXNzPSd1aS1zbGlkZXItaGFuZGxlIHVpLXN0YXRlLWRlZmF1bHQgdWktY29ybmVyLWFsbCcgaHJlZj0nIyc+PC9hPiIsZz1kLnZhbHVlcyYmZC52YWx1ZXMubGVuZ3RofHwxLGg9W107dGhpcy5fa2V5U2xpZGluZz0hMSx0aGlzLl9tb3VzZVNsaWRpbmc9ITEsdGhpcy5fYW5pbWF0ZU9mZj0hMCx0aGlzLl9oYW5kbGVJbmRleD1udWxsLHRoaXMuX2RldGVjdE9yaWVudGF0aW9uKCksdGhpcy5fbW91c2VJbml0KCksdGhpcy5lbGVtZW50LmFkZENsYXNzKCJ1aS1zbGlkZXIgdWktc2xpZGVyLSIrdGhpcy5vcmllbnRhdGlvbisiIHVpLXdpZGdldCIrIiB1aS13aWRnZXQtY29udGVudCIrIiB1aS1jb3JuZXItYWxsIisoZC5kaXNhYmxlZD8iIHVpLXNsaWRlci1kaXNhYmxlZCB1aS1kaXNhYmxlZCI6IiIpKSx0aGlzLnJhbmdlPWEoW10pLGQucmFuZ2UmJihkLnJhbmdlPT09ITAmJihkLnZhbHVlc3x8KGQudmFsdWVzPVt0aGlzLl92YWx1ZU1pbigpLHRoaXMuX3ZhbHVlTWluKCldKSxkLnZhbHVlcy5sZW5ndGgmJmQudmFsdWVzLmxlbmd0aCE9PTImJihkLnZhbHVlcz1bZC52YWx1ZXNbMF0sZC52YWx1ZXNbMF1dKSksdGhpcy5yYW5nZT1hKCI8ZGl2PjwvZGl2PiIpLmFwcGVuZFRvKHRoaXMuZWxlbWVudCkuYWRkQ2xhc3MoInVpLXNsaWRlci1yYW5nZSB1aS13aWRnZXQtaGVhZGVyIisoZC5yYW5nZT09PSJtaW4ifHxkLnJhbmdlPT09Im1heCI/IiB1aS1zbGlkZXItcmFuZ2UtIitkLnJhbmdlOiIiKSkpO2Zvcih2YXIgaT1lLmxlbmd0aDtpPGc7aSs9MSloLnB1c2goZik7dGhpcy5oYW5kbGVzPWUuYWRkKGEoaC5qb2luKCIiKSkuYXBwZW5kVG8oYi5lbGVtZW50KSksdGhpcy5oYW5kbGU9dGhpcy5oYW5kbGVzLmVxKDApLHRoaXMuaGFuZGxlcy5hZGQodGhpcy5yYW5nZSkuZmlsdGVyKCJhIikuY2xpY2soZnVuY3Rpb24oYSl7YS5wcmV2ZW50RGVmYXVsdCgpfSkuaG92ZXIoZnVuY3Rpb24oKXtkLmRpc2FibGVkfHxhKHRoaXMpLmFkZENsYXNzKCJ1aS1zdGF0ZS1ob3ZlciIpfSxmdW5jdGlvbigpe2EodGhpcykucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLWhvdmVyIil9KS5mb2N1cyhmdW5jdGlvbigpe2QuZGlzYWJsZWQ/YSh0aGlzKS5ibHVyKCk6KGEoIi51aS1zbGlkZXIgLnVpLXN0YXRlLWZvY3VzIikucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLWZvY3VzIiksYSh0aGlzKS5hZGRDbGFzcygidWktc3RhdGUtZm9jdXMiKSl9KS5ibHVyKGZ1bmN0aW9uKCl7YSh0aGlzKS5yZW1vdmVDbGFzcygidWktc3RhdGUtZm9jdXMiKX0pLHRoaXMuaGFuZGxlcy5lYWNoKGZ1bmN0aW9uKGIpe2EodGhpcykuZGF0YSgiaW5kZXgudWktc2xpZGVyLWhhbmRsZSIsYil9KSx0aGlzLmhhbmRsZXMua2V5ZG93bihmdW5jdGlvbihkKXt2YXIgZT1hKHRoaXMpLmRhdGEoImluZGV4LnVpLXNsaWRlci1oYW5kbGUiKSxmLGcsaCxpO2lmKGIub3B0aW9ucy5kaXNhYmxlZClyZXR1cm47c3dpdGNoKGQua2V5Q29kZSl7Y2FzZSBhLnVpLmtleUNvZGUuSE9NRTpjYXNlIGEudWkua2V5Q29kZS5FTkQ6Y2FzZSBhLnVpLmtleUNvZGUuUEFHRV9VUDpjYXNlIGEudWkua2V5Q29kZS5QQUdFX0RPV046Y2FzZSBhLnVpLmtleUNvZGUuVVA6Y2FzZSBhLnVpLmtleUNvZGUuUklHSFQ6Y2FzZSBhLnVpLmtleUNvZGUuRE9XTjpjYXNlIGEudWkua2V5Q29kZS5MRUZUOmQucHJldmVudERlZmF1bHQoKTtpZighYi5fa2V5U2xpZGluZyl7Yi5fa2V5U2xpZGluZz0hMCxhKHRoaXMpLmFkZENsYXNzKCJ1aS1zdGF0ZS1hY3RpdmUiKSxmPWIuX3N0YXJ0KGQsZSk7aWYoZj09PSExKXJldHVybn19aT1iLm9wdGlvbnMuc3RlcCxiLm9wdGlvbnMudmFsdWVzJiZiLm9wdGlvbnMudmFsdWVzLmxlbmd0aD9nPWg9Yi52YWx1ZXMoZSk6Zz1oPWIudmFsdWUoKTtzd2l0Y2goZC5rZXlDb2RlKXtjYXNlIGEudWkua2V5Q29kZS5IT01FOmg9Yi5fdmFsdWVNaW4oKTticmVhaztjYXNlIGEudWkua2V5Q29kZS5FTkQ6aD1iLl92YWx1ZU1heCgpO2JyZWFrO2Nhc2UgYS51aS5rZXlDb2RlLlBBR0VfVVA6aD1iLl90cmltQWxpZ25WYWx1ZShnKyhiLl92YWx1ZU1heCgpLWIuX3ZhbHVlTWluKCkpL2MpO2JyZWFrO2Nhc2UgYS51aS5rZXlDb2RlLlBBR0VfRE9XTjpoPWIuX3RyaW1BbGlnblZhbHVlKGctKGIuX3ZhbHVlTWF4KCktYi5fdmFsdWVNaW4oKSkvYyk7YnJlYWs7Y2FzZSBhLnVpLmtleUNvZGUuVVA6Y2FzZSBhLnVpLmtleUNvZGUuUklHSFQ6aWYoZz09PWIuX3ZhbHVlTWF4KCkpcmV0dXJuO2g9Yi5fdHJpbUFsaWduVmFsdWUoZytpKTticmVhaztjYXNlIGEudWkua2V5Q29kZS5ET1dOOmNhc2UgYS51aS5rZXlDb2RlLkxFRlQ6aWYoZz09PWIuX3ZhbHVlTWluKCkpcmV0dXJuO2g9Yi5fdHJpbUFsaWduVmFsdWUoZy1pKX1iLl9zbGlkZShkLGUsaCl9KS5rZXl1cChmdW5jdGlvbihjKXt2YXIgZD1hKHRoaXMpLmRhdGEoImluZGV4LnVpLXNsaWRlci1oYW5kbGUiKTtiLl9rZXlTbGlkaW5nJiYoYi5fa2V5U2xpZGluZz0hMSxiLl9zdG9wKGMsZCksYi5fY2hhbmdlKGMsZCksYSh0aGlzKS5yZW1vdmVDbGFzcygidWktc3RhdGUtYWN0aXZlIikpfSksdGhpcy5fcmVmcmVzaFZhbHVlKCksdGhpcy5fYW5pbWF0ZU9mZj0hMX0sZGVzdHJveTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmhhbmRsZXMucmVtb3ZlKCksdGhpcy5yYW5nZS5yZW1vdmUoKSx0aGlzLmVsZW1lbnQucmVtb3ZlQ2xhc3MoInVpLXNsaWRlciB1aS1zbGlkZXItaG9yaXpvbnRhbCB1aS1zbGlkZXItdmVydGljYWwgdWktc2xpZGVyLWRpc2FibGVkIHVpLXdpZGdldCB1aS13aWRnZXQtY29udGVudCB1aS1jb3JuZXItYWxsIikucmVtb3ZlRGF0YSgic2xpZGVyIikudW5iaW5kKCIuc2xpZGVyIiksdGhpcy5fbW91c2VEZXN0cm95KCksdGhpc30sX21vdXNlQ2FwdHVyZTpmdW5jdGlvbihiKXt2YXIgYz10aGlzLm9wdGlvbnMsZCxlLGYsZyxoLGksaixrLGw7cmV0dXJuIGMuZGlzYWJsZWQ/ITE6KHRoaXMuZWxlbWVudFNpemU9e3dpZHRoOnRoaXMuZWxlbWVudC5vdXRlcldpZHRoKCksaGVpZ2h0OnRoaXMuZWxlbWVudC5vdXRlckhlaWdodCgpfSx0aGlzLmVsZW1lbnRPZmZzZXQ9dGhpcy5lbGVtZW50Lm9mZnNldCgpLGQ9e3g6Yi5wYWdlWCx5OmIucGFnZVl9LGU9dGhpcy5fbm9ybVZhbHVlRnJvbU1vdXNlKGQpLGY9dGhpcy5fdmFsdWVNYXgoKS10aGlzLl92YWx1ZU1pbigpKzEsaD10aGlzLHRoaXMuaGFuZGxlcy5lYWNoKGZ1bmN0aW9uKGIpe3ZhciBjPU1hdGguYWJzKGUtaC52YWx1ZXMoYikpO2Y+YyYmKGY9YyxnPWEodGhpcyksaT1iKX0pLGMucmFuZ2U9PT0hMCYmdGhpcy52YWx1ZXMoMSk9PT1jLm1pbiYmKGkrPTEsZz1hKHRoaXMuaGFuZGxlc1tpXSkpLGo9dGhpcy5fc3RhcnQoYixpKSxqPT09ITE/ITE6KHRoaXMuX21vdXNlU2xpZGluZz0hMCxoLl9oYW5kbGVJbmRleD1pLGcuYWRkQ2xhc3MoInVpLXN0YXRlLWFjdGl2ZSIpLmZvY3VzKCksaz1nLm9mZnNldCgpLGw9IWEoYi50YXJnZXQpLnBhcmVudHMoKS5hbmRTZWxmKCkuaXMoIi51aS1zbGlkZXItaGFuZGxlIiksdGhpcy5fY2xpY2tPZmZzZXQ9bD97bGVmdDowLHRvcDowfTp7bGVmdDpiLnBhZ2VYLWsubGVmdC1nLndpZHRoKCkvMix0b3A6Yi5wYWdlWS1rLnRvcC1nLmhlaWdodCgpLzItKHBhcnNlSW50KGcuY3NzKCJib3JkZXJUb3BXaWR0aCIpLDEwKXx8MCktKHBhcnNlSW50KGcuY3NzKCJib3JkZXJCb3R0b21XaWR0aCIpLDEwKXx8MCkrKHBhcnNlSW50KGcuY3NzKCJtYXJnaW5Ub3AiKSwxMCl8fDApfSx0aGlzLmhhbmRsZXMuaGFzQ2xhc3MoInVpLXN0YXRlLWhvdmVyIil8fHRoaXMuX3NsaWRlKGIsaSxlKSx0aGlzLl9hbmltYXRlT2ZmPSEwLCEwKSl9LF9tb3VzZVN0YXJ0OmZ1bmN0aW9uKGEpe3JldHVybiEwfSxfbW91c2VEcmFnOmZ1bmN0aW9uKGEpe3ZhciBiPXt4OmEucGFnZVgseTphLnBhZ2VZfSxjPXRoaXMuX25vcm1WYWx1ZUZyb21Nb3VzZShiKTtyZXR1cm4gdGhpcy5fc2xpZGUoYSx0aGlzLl9oYW5kbGVJbmRleCxjKSwhMX0sX21vdXNlU3RvcDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5oYW5kbGVzLnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1hY3RpdmUiKSx0aGlzLl9tb3VzZVNsaWRpbmc9ITEsdGhpcy5fc3RvcChhLHRoaXMuX2hhbmRsZUluZGV4KSx0aGlzLl9jaGFuZ2UoYSx0aGlzLl9oYW5kbGVJbmRleCksdGhpcy5faGFuZGxlSW5kZXg9bnVsbCx0aGlzLl9jbGlja09mZnNldD1udWxsLHRoaXMuX2FuaW1hdGVPZmY9ITEsITF9LF9kZXRlY3RPcmllbnRhdGlvbjpmdW5jdGlvbigpe3RoaXMub3JpZW50YXRpb249dGhpcy5vcHRpb25zLm9yaWVudGF0aW9uPT09InZlcnRpY2FsIj8idmVydGljYWwiOiJob3Jpem9udGFsIn0sX25vcm1WYWx1ZUZyb21Nb3VzZTpmdW5jdGlvbihhKXt2YXIgYixjLGQsZSxmO3JldHVybiB0aGlzLm9yaWVudGF0aW9uPT09Imhvcml6b250YWwiPyhiPXRoaXMuZWxlbWVudFNpemUud2lkdGgsYz1hLngtdGhpcy5lbGVtZW50T2Zmc2V0LmxlZnQtKHRoaXMuX2NsaWNrT2Zmc2V0P3RoaXMuX2NsaWNrT2Zmc2V0LmxlZnQ6MCkpOihiPXRoaXMuZWxlbWVudFNpemUuaGVpZ2h0LGM9YS55LXRoaXMuZWxlbWVudE9mZnNldC50b3AtKHRoaXMuX2NsaWNrT2Zmc2V0P3RoaXMuX2NsaWNrT2Zmc2V0LnRvcDowKSksZD1jL2IsZD4xJiYoZD0xKSxkPDAmJihkPTApLHRoaXMub3JpZW50YXRpb249PT0idmVydGljYWwiJiYoZD0xLWQpLGU9dGhpcy5fdmFsdWVNYXgoKS10aGlzLl92YWx1ZU1pbigpLGY9dGhpcy5fdmFsdWVNaW4oKStkKmUsdGhpcy5fdHJpbUFsaWduVmFsdWUoZil9LF9zdGFydDpmdW5jdGlvbihhLGIpe3ZhciBjPXtoYW5kbGU6dGhpcy5oYW5kbGVzW2JdLHZhbHVlOnRoaXMudmFsdWUoKX07cmV0dXJuIHRoaXMub3B0aW9ucy52YWx1ZXMmJnRoaXMub3B0aW9ucy52YWx1ZXMubGVuZ3RoJiYoYy52YWx1ZT10aGlzLnZhbHVlcyhiKSxjLnZhbHVlcz10aGlzLnZhbHVlcygpKSx0aGlzLl90cmlnZ2VyKCJzdGFydCIsYSxjKX0sX3NsaWRlOmZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlLGY7dGhpcy5vcHRpb25zLnZhbHVlcyYmdGhpcy5vcHRpb25zLnZhbHVlcy5sZW5ndGg/KGQ9dGhpcy52YWx1ZXMoYj8wOjEpLHRoaXMub3B0aW9ucy52YWx1ZXMubGVuZ3RoPT09MiYmdGhpcy5vcHRpb25zLnJhbmdlPT09ITAmJihiPT09MCYmYz5kfHxiPT09MSYmYzxkKSYmKGM9ZCksYyE9PXRoaXMudmFsdWVzKGIpJiYoZT10aGlzLnZhbHVlcygpLGVbYl09YyxmPXRoaXMuX3RyaWdnZXIoInNsaWRlIixhLHtoYW5kbGU6dGhpcy5oYW5kbGVzW2JdLHZhbHVlOmMsdmFsdWVzOmV9KSxkPXRoaXMudmFsdWVzKGI/MDoxKSxmIT09ITEmJnRoaXMudmFsdWVzKGIsYywhMCkpKTpjIT09dGhpcy52YWx1ZSgpJiYoZj10aGlzLl90cmlnZ2VyKCJzbGlkZSIsYSx7aGFuZGxlOnRoaXMuaGFuZGxlc1tiXSx2YWx1ZTpjfSksZiE9PSExJiZ0aGlzLnZhbHVlKGMpKX0sX3N0b3A6ZnVuY3Rpb24oYSxiKXt2YXIgYz17aGFuZGxlOnRoaXMuaGFuZGxlc1tiXSx2YWx1ZTp0aGlzLnZhbHVlKCl9O3RoaXMub3B0aW9ucy52YWx1ZXMmJnRoaXMub3B0aW9ucy52YWx1ZXMubGVuZ3RoJiYoYy52YWx1ZT10aGlzLnZhbHVlcyhiKSxjLnZhbHVlcz10aGlzLnZhbHVlcygpKSx0aGlzLl90cmlnZ2VyKCJzdG9wIixhLGMpfSxfY2hhbmdlOmZ1bmN0aW9uKGEsYil7aWYoIXRoaXMuX2tleVNsaWRpbmcmJiF0aGlzLl9tb3VzZVNsaWRpbmcpe3ZhciBjPXtoYW5kbGU6dGhpcy5oYW5kbGVzW2JdLHZhbHVlOnRoaXMudmFsdWUoKX07dGhpcy5vcHRpb25zLnZhbHVlcyYmdGhpcy5vcHRpb25zLnZhbHVlcy5sZW5ndGgmJihjLnZhbHVlPXRoaXMudmFsdWVzKGIpLGMudmFsdWVzPXRoaXMudmFsdWVzKCkpLHRoaXMuX3RyaWdnZXIoImNoYW5nZSIsYSxjKX19LHZhbHVlOmZ1bmN0aW9uKGEpe2lmKGFyZ3VtZW50cy5sZW5ndGgpe3RoaXMub3B0aW9ucy52YWx1ZT10aGlzLl90cmltQWxpZ25WYWx1ZShhKSx0aGlzLl9yZWZyZXNoVmFsdWUoKSx0aGlzLl9jaGFuZ2UobnVsbCwwKTtyZXR1cm59cmV0dXJuIHRoaXMuX3ZhbHVlKCl9LHZhbHVlczpmdW5jdGlvbihiLGMpe3ZhciBkLGUsZjtpZihhcmd1bWVudHMubGVuZ3RoPjEpe3RoaXMub3B0aW9ucy52YWx1ZXNbYl09dGhpcy5fdHJpbUFsaWduVmFsdWUoYyksdGhpcy5fcmVmcmVzaFZhbHVlKCksdGhpcy5fY2hhbmdlKG51bGwsYik7cmV0dXJufWlmKCFhcmd1bWVudHMubGVuZ3RoKXJldHVybiB0aGlzLl92YWx1ZXMoKTtpZighYS5pc0FycmF5KGFyZ3VtZW50c1swXSkpcmV0dXJuIHRoaXMub3B0aW9ucy52YWx1ZXMmJnRoaXMub3B0aW9ucy52YWx1ZXMubGVuZ3RoP3RoaXMuX3ZhbHVlcyhiKTp0aGlzLnZhbHVlKCk7ZD10aGlzLm9wdGlvbnMudmFsdWVzLGU9YXJndW1lbnRzWzBdO2ZvcihmPTA7ZjxkLmxlbmd0aDtmKz0xKWRbZl09dGhpcy5fdHJpbUFsaWduVmFsdWUoZVtmXSksdGhpcy5fY2hhbmdlKG51bGwsZik7dGhpcy5fcmVmcmVzaFZhbHVlKCl9LF9zZXRPcHRpb246ZnVuY3Rpb24oYixjKXt2YXIgZCxlPTA7YS5pc0FycmF5KHRoaXMub3B0aW9ucy52YWx1ZXMpJiYoZT10aGlzLm9wdGlvbnMudmFsdWVzLmxlbmd0aCksYS5XaWRnZXQucHJvdG90eXBlLl9zZXRPcHRpb24uYXBwbHkodGhpcyxhcmd1bWVudHMpO3N3aXRjaChiKXtjYXNlImRpc2FibGVkIjpjPyh0aGlzLmhhbmRsZXMuZmlsdGVyKCIudWktc3RhdGUtZm9jdXMiKS5ibHVyKCksdGhpcy5oYW5kbGVzLnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1ob3ZlciIpLHRoaXMuaGFuZGxlcy5wcm9wQXR0cigiZGlzYWJsZWQiLCEwKSx0aGlzLmVsZW1lbnQuYWRkQ2xhc3MoInVpLWRpc2FibGVkIikpOih0aGlzLmhhbmRsZXMucHJvcEF0dHIoImRpc2FibGVkIiwhMSksdGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1kaXNhYmxlZCIpKTticmVhaztjYXNlIm9yaWVudGF0aW9uIjp0aGlzLl9kZXRlY3RPcmllbnRhdGlvbigpLHRoaXMuZWxlbWVudC5yZW1vdmVDbGFzcygidWktc2xpZGVyLWhvcml6b250YWwgdWktc2xpZGVyLXZlcnRpY2FsIikuYWRkQ2xhc3MoInVpLXNsaWRlci0iK3RoaXMub3JpZW50YXRpb24pLHRoaXMuX3JlZnJlc2hWYWx1ZSgpO2JyZWFrO2Nhc2UidmFsdWUiOnRoaXMuX2FuaW1hdGVPZmY9ITAsdGhpcy5fcmVmcmVzaFZhbHVlKCksdGhpcy5fY2hhbmdlKG51bGwsMCksdGhpcy5fYW5pbWF0ZU9mZj0hMTticmVhaztjYXNlInZhbHVlcyI6dGhpcy5fYW5pbWF0ZU9mZj0hMCx0aGlzLl9yZWZyZXNoVmFsdWUoKTtmb3IoZD0wO2Q8ZTtkKz0xKXRoaXMuX2NoYW5nZShudWxsLGQpO3RoaXMuX2FuaW1hdGVPZmY9ITF9fSxfdmFsdWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLm9wdGlvbnMudmFsdWU7cmV0dXJuIGE9dGhpcy5fdHJpbUFsaWduVmFsdWUoYSksYX0sX3ZhbHVlczpmdW5jdGlvbihhKXt2YXIgYixjLGQ7aWYoYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gYj10aGlzLm9wdGlvbnMudmFsdWVzW2FdLGI9dGhpcy5fdHJpbUFsaWduVmFsdWUoYiksYjtjPXRoaXMub3B0aW9ucy52YWx1ZXMuc2xpY2UoKTtmb3IoZD0wO2Q8Yy5sZW5ndGg7ZCs9MSljW2RdPXRoaXMuX3RyaW1BbGlnblZhbHVlKGNbZF0pO3JldHVybiBjfSxfdHJpbUFsaWduVmFsdWU6ZnVuY3Rpb24oYSl7aWYoYTw9dGhpcy5fdmFsdWVNaW4oKSlyZXR1cm4gdGhpcy5fdmFsdWVNaW4oKTtpZihhPj10aGlzLl92YWx1ZU1heCgpKXJldHVybiB0aGlzLl92YWx1ZU1heCgpO3ZhciBiPXRoaXMub3B0aW9ucy5zdGVwPjA/dGhpcy5vcHRpb25zLnN0ZXA6MSxjPShhLXRoaXMuX3ZhbHVlTWluKCkpJWIsZD1hLWM7cmV0dXJuIE1hdGguYWJzKGMpKjI+PWImJihkKz1jPjA/YjotYikscGFyc2VGbG9hdChkLnRvRml4ZWQoNSkpfSxfdmFsdWVNaW46ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHRpb25zLm1pbn0sX3ZhbHVlTWF4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub3B0aW9ucy5tYXh9LF9yZWZyZXNoVmFsdWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLm9wdGlvbnMucmFuZ2UsYz10aGlzLm9wdGlvbnMsZD10aGlzLGU9dGhpcy5fYW5pbWF0ZU9mZj8hMTpjLmFuaW1hdGUsZixnPXt9LGgsaSxqLGs7dGhpcy5vcHRpb25zLnZhbHVlcyYmdGhpcy5vcHRpb25zLnZhbHVlcy5sZW5ndGg/dGhpcy5oYW5kbGVzLmVhY2goZnVuY3Rpb24oYixpKXtmPShkLnZhbHVlcyhiKS1kLl92YWx1ZU1pbigpKS8oZC5fdmFsdWVNYXgoKS1kLl92YWx1ZU1pbigpKSoxMDAsZ1tkLm9yaWVudGF0aW9uPT09Imhvcml6b250YWwiPyJsZWZ0IjoiYm90dG9tIl09ZisiJSIsYSh0aGlzKS5zdG9wKDEsMSlbZT8iYW5pbWF0ZSI6ImNzcyJdKGcsYy5hbmltYXRlKSxkLm9wdGlvbnMucmFuZ2U9PT0hMCYmKGQub3JpZW50YXRpb249PT0iaG9yaXpvbnRhbCI/KGI9PT0wJiZkLnJhbmdlLnN0b3AoMSwxKVtlPyJhbmltYXRlIjoiY3NzIl0oe2xlZnQ6ZisiJSJ9LGMuYW5pbWF0ZSksYj09PTEmJmQucmFuZ2VbZT8iYW5pbWF0ZSI6ImNzcyJdKHt3aWR0aDpmLWgrIiUifSx7cXVldWU6ITEsZHVyYXRpb246Yy5hbmltYXRlfSkpOihiPT09MCYmZC5yYW5nZS5zdG9wKDEsMSlbZT8iYW5pbWF0ZSI6ImNzcyJdKHtib3R0b206ZisiJSJ9LGMuYW5pbWF0ZSksYj09PTEmJmQucmFuZ2VbZT8iYW5pbWF0ZSI6ImNzcyJdKHtoZWlnaHQ6Zi1oKyIlIn0se3F1ZXVlOiExLGR1cmF0aW9uOmMuYW5pbWF0ZX0pKSksaD1mfSk6KGk9dGhpcy52YWx1ZSgpLGo9dGhpcy5fdmFsdWVNaW4oKSxrPXRoaXMuX3ZhbHVlTWF4KCksZj1rIT09aj8oaS1qKS8oay1qKSoxMDA6MCxnW2Qub3JpZW50YXRpb249PT0iaG9yaXpvbnRhbCI/ImxlZnQiOiJib3R0b20iXT1mKyIlIix0aGlzLmhhbmRsZS5zdG9wKDEsMSlbZT8iYW5pbWF0ZSI6ImNzcyJdKGcsYy5hbmltYXRlKSxiPT09Im1pbiImJnRoaXMub3JpZW50YXRpb249PT0iaG9yaXpvbnRhbCImJnRoaXMucmFuZ2Uuc3RvcCgxLDEpW2U/ImFuaW1hdGUiOiJjc3MiXSh7d2lkdGg6ZisiJSJ9LGMuYW5pbWF0ZSksYj09PSJtYXgiJiZ0aGlzLm9yaWVudGF0aW9uPT09Imhvcml6b250YWwiJiZ0aGlzLnJhbmdlW2U/ImFuaW1hdGUiOiJjc3MiXSh7d2lkdGg6MTAwLWYrIiUifSx7cXVldWU6ITEsZHVyYXRpb246Yy5hbmltYXRlfSksYj09PSJtaW4iJiZ0aGlzLm9yaWVudGF0aW9uPT09InZlcnRpY2FsIiYmdGhpcy5yYW5nZS5zdG9wKDEsMSlbZT8iYW5pbWF0ZSI6ImNzcyJdKHtoZWlnaHQ6ZisiJSJ9LGMuYW5pbWF0ZSksYj09PSJtYXgiJiZ0aGlzLm9yaWVudGF0aW9uPT09InZlcnRpY2FsIiYmdGhpcy5yYW5nZVtlPyJhbmltYXRlIjoiY3NzIl0oe2hlaWdodDoxMDAtZisiJSJ9LHtxdWV1ZTohMSxkdXJhdGlvbjpjLmFuaW1hdGV9KSl9fSksYS5leHRlbmQoYS51aS5zbGlkZXIse3ZlcnNpb246IjEuOC4yMyJ9KX0pKGpRdWVyeSk7Oy8qISBqUXVlcnkgVUkgLSB2MS44LjIzIC0gMjAxMi0wOC0xNQotKiBodHRwczovL2dpdGh1Yi5jb20vanF1ZXJ5L2pxdWVyeS11aQotKiBJbmNsdWRlczoganF1ZXJ5LnVpLnRhYnMuanMKLSogQ29weXJpZ2h0IChjKSAyMDEyIEFVVEhPUlMudHh0OyBMaWNlbnNlZCBNSVQsIEdQTCAqLwotKGZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gZSgpe3JldHVybisrY31mdW5jdGlvbiBmKCl7cmV0dXJuKytkfXZhciBjPTAsZD0wO2Eud2lkZ2V0KCJ1aS50YWJzIix7b3B0aW9uczp7YWRkOm51bGwsYWpheE9wdGlvbnM6bnVsbCxjYWNoZTohMSxjb29raWU6bnVsbCxjb2xsYXBzaWJsZTohMSxkaXNhYmxlOm51bGwsZGlzYWJsZWQ6W10sZW5hYmxlOm51bGwsZXZlbnQ6ImNsaWNrIixmeDpudWxsLGlkUHJlZml4OiJ1aS10YWJzLSIsbG9hZDpudWxsLHBhbmVsVGVtcGxhdGU6IjxkaXY+PC9kaXY+IixyZW1vdmU6bnVsbCxzZWxlY3Q6bnVsbCxzaG93Om51bGwsc3Bpbm5lcjoiPGVtPkxvYWRpbmcmIzgyMzA7PC9lbT4iLHRhYlRlbXBsYXRlOiI8bGk+PGEgaHJlZj0nI3tocmVmfSc+PHNwYW4+I3tsYWJlbH08L3NwYW4+PC9hPjwvbGk+In0sX2NyZWF0ZTpmdW5jdGlvbigpe3RoaXMuX3RhYmlmeSghMCl9LF9zZXRPcHRpb246ZnVuY3Rpb24oYSxiKXtpZihhPT0ic2VsZWN0ZWQiKXtpZih0aGlzLm9wdGlvbnMuY29sbGFwc2libGUmJmI9PXRoaXMub3B0aW9ucy5zZWxlY3RlZClyZXR1cm47dGhpcy5zZWxlY3QoYil9ZWxzZSB0aGlzLm9wdGlvbnNbYV09Yix0aGlzLl90YWJpZnkoKX0sX3RhYklkOmZ1bmN0aW9uKGEpe3JldHVybiBhLnRpdGxlJiZhLnRpdGxlLnJlcGxhY2UoL1xzL2csIl8iKS5yZXBsYWNlKC9bXlx3XHUwMGMwLVx1RkZGRi1dL2csIiIpfHx0aGlzLm9wdGlvbnMuaWRQcmVmaXgrZSgpfSxfc2FuaXRpemVTZWxlY3RvcjpmdW5jdGlvbihhKXtyZXR1cm4gYS5yZXBsYWNlKC86L2csIlxcOiIpfSxfY29va2llOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5jb29raWV8fCh0aGlzLmNvb2tpZT10aGlzLm9wdGlvbnMuY29va2llLm5hbWV8fCJ1aS10YWJzLSIrZigpKTtyZXR1cm4gYS5jb29raWUuYXBwbHkobnVsbCxbYl0uY29uY2F0KGEubWFrZUFycmF5KGFyZ3VtZW50cykpKX0sX3VpOmZ1bmN0aW9uKGEsYil7cmV0dXJue3RhYjphLHBhbmVsOmIsaW5kZXg6dGhpcy5hbmNob3JzLmluZGV4KGEpfX0sX2NsZWFudXA6ZnVuY3Rpb24oKXt0aGlzLmxpcy5maWx0ZXIoIi51aS1zdGF0ZS1wcm9jZXNzaW5nIikucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLXByb2Nlc3NpbmciKS5maW5kKCJzcGFuOmRhdGEobGFiZWwudGFicykiKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIGI9YSh0aGlzKTtiLmh0bWwoYi5kYXRhKCJsYWJlbC50YWJzIikpLnJlbW92ZURhdGEoImxhYmVsLnRhYnMiKX0pfSxfdGFiaWZ5OmZ1bmN0aW9uKGMpe2Z1bmN0aW9uIG0oYixjKXtiLmNzcygiZGlzcGxheSIsIiIpLCFhLnN1cHBvcnQub3BhY2l0eSYmYy5vcGFjaXR5JiZiWzBdLnN0eWxlLnJlbW92ZUF0dHJpYnV0ZSgiZmlsdGVyIil9dmFyIGQ9dGhpcyxlPXRoaXMub3B0aW9ucyxmPS9eIy4rLzt0aGlzLmxpc3Q9dGhpcy5lbGVtZW50LmZpbmQoIm9sLHVsIikuZXEoMCksdGhpcy5saXM9YSgiID4gbGk6aGFzKGFbaHJlZl0pIix0aGlzLmxpc3QpLHRoaXMuYW5jaG9ycz10aGlzLmxpcy5tYXAoZnVuY3Rpb24oKXtyZXR1cm4gYSgiYSIsdGhpcylbMF19KSx0aGlzLnBhbmVscz1hKFtdKSx0aGlzLmFuY2hvcnMuZWFjaChmdW5jdGlvbihiLGMpe3ZhciBnPWEoYykuYXR0cigiaHJlZiIpLGg9Zy5zcGxpdCgiIyIpWzBdLGk7aCYmKGg9PT1sb2NhdGlvbi50b1N0cmluZygpLnNwbGl0KCIjIilbMF18fChpPWEoImJhc2UiKVswXSkmJmg9PT1pLmhyZWYpJiYoZz1jLmhhc2gsYy5ocmVmPWcpO2lmKGYudGVzdChnKSlkLnBhbmVscz1kLnBhbmVscy5hZGQoZC5lbGVtZW50LmZpbmQoZC5fc2FuaXRpemVTZWxlY3RvcihnKSkpO2Vsc2UgaWYoZyYmZyE9PSIjIil7YS5kYXRhKGMsImhyZWYudGFicyIsZyksYS5kYXRhKGMsImxvYWQudGFicyIsZy5yZXBsYWNlKC8jLiokLywiIikpO3ZhciBqPWQuX3RhYklkKGMpO2MuaHJlZj0iIyIrajt2YXIgaz1kLmVsZW1lbnQuZmluZCgiIyIraik7ay5sZW5ndGh8fChrPWEoZS5wYW5lbFRlbXBsYXRlKS5hdHRyKCJpZCIsaikuYWRkQ2xhc3MoInVpLXRhYnMtcGFuZWwgdWktd2lkZ2V0LWNvbnRlbnQgdWktY29ybmVyLWJvdHRvbSIpLmluc2VydEFmdGVyKGQucGFuZWxzW2ItMV18fGQubGlzdCksay5kYXRhKCJkZXN0cm95LnRhYnMiLCEwKSksZC5wYW5lbHM9ZC5wYW5lbHMuYWRkKGspfWVsc2UgZS5kaXNhYmxlZC5wdXNoKGIpfSksYz8odGhpcy5lbGVtZW50LmFkZENsYXNzKCJ1aS10YWJzIHVpLXdpZGdldCB1aS13aWRnZXQtY29udGVudCB1aS1jb3JuZXItYWxsIiksdGhpcy5saXN0LmFkZENsYXNzKCJ1aS10YWJzLW5hdiB1aS1oZWxwZXItcmVzZXQgdWktaGVscGVyLWNsZWFyZml4IHVpLXdpZGdldC1oZWFkZXIgdWktY29ybmVyLWFsbCIpLHRoaXMubGlzLmFkZENsYXNzKCJ1aS1zdGF0ZS1kZWZhdWx0IHVpLWNvcm5lci10b3AiKSx0aGlzLnBhbmVscy5hZGRDbGFzcygidWktdGFicy1wYW5lbCB1aS13aWRnZXQtY29udGVudCB1aS1jb3JuZXItYm90dG9tIiksZS5zZWxlY3RlZD09PWI/KGxvY2F0aW9uLmhhc2gmJnRoaXMuYW5jaG9ycy5lYWNoKGZ1bmN0aW9uKGEsYil7aWYoYi5oYXNoPT1sb2NhdGlvbi5oYXNoKXJldHVybiBlLnNlbGVjdGVkPWEsITF9KSx0eXBlb2YgZS5zZWxlY3RlZCE9Im51bWJlciImJmUuY29va2llJiYoZS5zZWxlY3RlZD1wYXJzZUludChkLl9jb29raWUoKSwxMCkpLHR5cGVvZiBlLnNlbGVjdGVkIT0ibnVtYmVyIiYmdGhpcy5saXMuZmlsdGVyKCIudWktdGFicy1zZWxlY3RlZCIpLmxlbmd0aCYmKGUuc2VsZWN0ZWQ9dGhpcy5saXMuaW5kZXgodGhpcy5saXMuZmlsdGVyKCIudWktdGFicy1zZWxlY3RlZCIpKSksZS5zZWxlY3RlZD1lLnNlbGVjdGVkfHwodGhpcy5saXMubGVuZ3RoPzA6LTEpKTplLnNlbGVjdGVkPT09bnVsbCYmKGUuc2VsZWN0ZWQ9LTEpLGUuc2VsZWN0ZWQ9ZS5zZWxlY3RlZD49MCYmdGhpcy5hbmNob3JzW2Uuc2VsZWN0ZWRdfHxlLnNlbGVjdGVkPDA/ZS5zZWxlY3RlZDowLGUuZGlzYWJsZWQ9YS51bmlxdWUoZS5kaXNhYmxlZC5jb25jYXQoYS5tYXAodGhpcy5saXMuZmlsdGVyKCIudWktc3RhdGUtZGlzYWJsZWQiKSxmdW5jdGlvbihhLGIpe3JldHVybiBkLmxpcy5pbmRleChhKX0pKSkuc29ydCgpLGEuaW5BcnJheShlLnNlbGVjdGVkLGUuZGlzYWJsZWQpIT0tMSYmZS5kaXNhYmxlZC5zcGxpY2UoYS5pbkFycmF5KGUuc2VsZWN0ZWQsZS5kaXNhYmxlZCksMSksdGhpcy5wYW5lbHMuYWRkQ2xhc3MoInVpLXRhYnMtaGlkZSIpLHRoaXMubGlzLnJlbW92ZUNsYXNzKCJ1aS10YWJzLXNlbGVjdGVkIHVpLXN0YXRlLWFjdGl2ZSIpLGUuc2VsZWN0ZWQ+PTAmJnRoaXMuYW5jaG9ycy5sZW5ndGgmJihkLmVsZW1lbnQuZmluZChkLl9zYW5pdGl6ZVNlbGVjdG9yKGQuYW5jaG9yc1tlLnNlbGVjdGVkXS5oYXNoKSkucmVtb3ZlQ2xhc3MoInVpLXRhYnMtaGlkZSIpLHRoaXMubGlzLmVxKGUuc2VsZWN0ZWQpLmFkZENsYXNzKCJ1aS10YWJzLXNlbGVjdGVkIHVpLXN0YXRlLWFjdGl2ZSIpLGQuZWxlbWVudC5xdWV1ZSgidGFicyIsZnVuY3Rpb24oKXtkLl90cmlnZ2VyKCJzaG93IixudWxsLGQuX3VpKGQuYW5jaG9yc1tlLnNlbGVjdGVkXSxkLmVsZW1lbnQuZmluZChkLl9zYW5pdGl6ZVNlbGVjdG9yKGQuYW5jaG9yc1tlLnNlbGVjdGVkXS5oYXNoKSlbMF0pKX0pLHRoaXMubG9hZChlLnNlbGVjdGVkKSksYSh3aW5kb3cpLmJpbmQoInVubG9hZCIsZnVuY3Rpb24oKXtkLmxpcy5hZGQoZC5hbmNob3JzKS51bmJpbmQoIi50YWJzIiksZC5saXM9ZC5hbmNob3JzPWQucGFuZWxzPW51bGx9KSk6ZS5zZWxlY3RlZD10aGlzLmxpcy5pbmRleCh0aGlzLmxpcy5maWx0ZXIoIi51aS10YWJzLXNlbGVjdGVkIikpLHRoaXMuZWxlbWVudFtlLmNvbGxhcHNpYmxlPyJhZGRDbGFzcyI6InJlbW92ZUNsYXNzIl0oInVpLXRhYnMtY29sbGFwc2libGUiKSxlLmNvb2tpZSYmdGhpcy5fY29va2llKGUuc2VsZWN0ZWQsZS5jb29raWUpO2Zvcih2YXIgZz0wLGg7aD10aGlzLmxpc1tnXTtnKyspYShoKVthLmluQXJyYXkoZyxlLmRpc2FibGVkKSE9LTEmJiFhKGgpLmhhc0NsYXNzKCJ1aS10YWJzLXNlbGVjdGVkIik/ImFkZENsYXNzIjoicmVtb3ZlQ2xhc3MiXSgidWktc3RhdGUtZGlzYWJsZWQiKTtlLmNhY2hlPT09ITEmJnRoaXMuYW5jaG9ycy5yZW1vdmVEYXRhKCJjYWNoZS50YWJzIiksdGhpcy5saXMuYWRkKHRoaXMuYW5jaG9ycykudW5iaW5kKCIudGFicyIpO2lmKGUuZXZlbnQhPT0ibW91c2VvdmVyIil7dmFyIGk9ZnVuY3Rpb24oYSxiKXtiLmlzKCI6bm90KC51aS1zdGF0ZS1kaXNhYmxlZCkiKSYmYi5hZGRDbGFzcygidWktc3RhdGUtIithKX0saj1mdW5jdGlvbihhLGIpe2IucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLSIrYSl9O3RoaXMubGlzLmJpbmQoIm1vdXNlb3Zlci50YWJzIixmdW5jdGlvbigpe2koImhvdmVyIixhKHRoaXMpKX0pLHRoaXMubGlzLmJpbmQoIm1vdXNlb3V0LnRhYnMiLGZ1bmN0aW9uKCl7aigiaG92ZXIiLGEodGhpcykpfSksdGhpcy5hbmNob3JzLmJpbmQoImZvY3VzLnRhYnMiLGZ1bmN0aW9uKCl7aSgiZm9jdXMiLGEodGhpcykuY2xvc2VzdCgibGkiKSl9KSx0aGlzLmFuY2hvcnMuYmluZCgiYmx1ci50YWJzIixmdW5jdGlvbigpe2ooImZvY3VzIixhKHRoaXMpLmNsb3Nlc3QoImxpIikpfSl9dmFyIGssbDtlLmZ4JiYoYS5pc0FycmF5KGUuZngpPyhrPWUuZnhbMF0sbD1lLmZ4WzFdKTprPWw9ZS5meCk7dmFyIG49bD9mdW5jdGlvbihiLGMpe2EoYikuY2xvc2VzdCgibGkiKS5hZGRDbGFzcygidWktdGFicy1zZWxlY3RlZCB1aS1zdGF0ZS1hY3RpdmUiKSxjLmhpZGUoKS5yZW1vdmVDbGFzcygidWktdGFicy1oaWRlIikuYW5pbWF0ZShsLGwuZHVyYXRpb258fCJub3JtYWwiLGZ1bmN0aW9uKCl7bShjLGwpLGQuX3RyaWdnZXIoInNob3ciLG51bGwsZC5fdWkoYixjWzBdKSl9KX06ZnVuY3Rpb24oYixjKXthKGIpLmNsb3Nlc3QoImxpIikuYWRkQ2xhc3MoInVpLXRhYnMtc2VsZWN0ZWQgdWktc3RhdGUtYWN0aXZlIiksYy5yZW1vdmVDbGFzcygidWktdGFicy1oaWRlIiksZC5fdHJpZ2dlcigic2hvdyIsbnVsbCxkLl91aShiLGNbMF0pKX0sbz1rP2Z1bmN0aW9uKGEsYil7Yi5hbmltYXRlKGssay5kdXJhdGlvbnx8Im5vcm1hbCIsZnVuY3Rpb24oKXtkLmxpcy5yZW1vdmVDbGFzcygidWktdGFicy1zZWxlY3RlZCB1aS1zdGF0ZS1hY3RpdmUiKSxiLmFkZENsYXNzKCJ1aS10YWJzLWhpZGUiKSxtKGIsayksZC5lbGVtZW50LmRlcXVldWUoInRhYnMiKX0pfTpmdW5jdGlvbihhLGIsYyl7ZC5saXMucmVtb3ZlQ2xhc3MoInVpLXRhYnMtc2VsZWN0ZWQgdWktc3RhdGUtYWN0aXZlIiksYi5hZGRDbGFzcygidWktdGFicy1oaWRlIiksZC5lbGVtZW50LmRlcXVldWUoInRhYnMiKX07dGhpcy5hbmNob3JzLmJpbmQoZS5ldmVudCsiLnRhYnMiLGZ1bmN0aW9uKCl7dmFyIGI9dGhpcyxjPWEoYikuY2xvc2VzdCgibGkiKSxmPWQucGFuZWxzLmZpbHRlcigiOm5vdCgudWktdGFicy1oaWRlKSIpLGc9ZC5lbGVtZW50LmZpbmQoZC5fc2FuaXRpemVTZWxlY3RvcihiLmhhc2gpKTtpZihjLmhhc0NsYXNzKCJ1aS10YWJzLXNlbGVjdGVkIikmJiFlLmNvbGxhcHNpYmxlfHxjLmhhc0NsYXNzKCJ1aS1zdGF0ZS1kaXNhYmxlZCIpfHxjLmhhc0NsYXNzKCJ1aS1zdGF0ZS1wcm9jZXNzaW5nIil8fGQucGFuZWxzLmZpbHRlcigiOmFuaW1hdGVkIikubGVuZ3RofHxkLl90cmlnZ2VyKCJzZWxlY3QiLG51bGwsZC5fdWkodGhpcyxnWzBdKSk9PT0hMSlyZXR1cm4gdGhpcy5ibHVyKCksITE7ZS5zZWxlY3RlZD1kLmFuY2hvcnMuaW5kZXgodGhpcyksZC5hYm9ydCgpO2lmKGUuY29sbGFwc2libGUpe2lmKGMuaGFzQ2xhc3MoInVpLXRhYnMtc2VsZWN0ZWQiKSlyZXR1cm4gZS5zZWxlY3RlZD0tMSxlLmNvb2tpZSYmZC5fY29va2llKGUuc2VsZWN0ZWQsZS5jb29raWUpLGQuZWxlbWVudC5xdWV1ZSgidGFicyIsZnVuY3Rpb24oKXtvKGIsZil9KS5kZXF1ZXVlKCJ0YWJzIiksdGhpcy5ibHVyKCksITE7aWYoIWYubGVuZ3RoKXJldHVybiBlLmNvb2tpZSYmZC5fY29va2llKGUuc2VsZWN0ZWQsZS5jb29raWUpLGQuZWxlbWVudC5xdWV1ZSgidGFicyIsZnVuY3Rpb24oKXtuKGIsZyl9KSxkLmxvYWQoZC5hbmNob3JzLmluZGV4KHRoaXMpKSx0aGlzLmJsdXIoKSwhMX1lLmNvb2tpZSYmZC5fY29va2llKGUuc2VsZWN0ZWQsZS5jb29raWUpO2lmKGcubGVuZ3RoKWYubGVuZ3RoJiZkLmVsZW1lbnQucXVldWUoInRhYnMiLGZ1bmN0aW9uKCl7byhiLGYpfSksZC5lbGVtZW50LnF1ZXVlKCJ0YWJzIixmdW5jdGlvbigpe24oYixnKX0pLGQubG9hZChkLmFuY2hvcnMuaW5kZXgodGhpcykpO2Vsc2UgdGhyb3cialF1ZXJ5IFVJIFRhYnM6IE1pc21hdGNoaW5nIGZyYWdtZW50IGlkZW50aWZpZXIuIjthLmJyb3dzZXIubXNpZSYmdGhpcy5ibHVyKCl9KSx0aGlzLmFuY2hvcnMuYmluZCgiY2xpY2sudGFicyIsZnVuY3Rpb24oKXtyZXR1cm4hMX0pfSxfZ2V0SW5kZXg6ZnVuY3Rpb24oYSl7cmV0dXJuIHR5cGVvZiBhPT0ic3RyaW5nIiYmKGE9dGhpcy5hbmNob3JzLmluZGV4KHRoaXMuYW5jaG9ycy5maWx0ZXIoIltocmVmJD0nIithKyInXSIpKSksYX0sZGVzdHJveTpmdW5jdGlvbigpe3ZhciBiPXRoaXMub3B0aW9ucztyZXR1cm4gdGhpcy5hYm9ydCgpLHRoaXMuZWxlbWVudC51bmJpbmQoIi50YWJzIikucmVtb3ZlQ2xhc3MoInVpLXRhYnMgdWktd2lkZ2V0IHVpLXdpZGdldC1jb250ZW50IHVpLWNvcm5lci1hbGwgdWktdGFicy1jb2xsYXBzaWJsZSIpLnJlbW92ZURhdGEoInRhYnMiKSx0aGlzLmxpc3QucmVtb3ZlQ2xhc3MoInVpLXRhYnMtbmF2IHVpLWhlbHBlci1yZXNldCB1aS1oZWxwZXItY2xlYXJmaXggdWktd2lkZ2V0LWhlYWRlciB1aS1jb3JuZXItYWxsIiksdGhpcy5hbmNob3JzLmVhY2goZnVuY3Rpb24oKXt2YXIgYj1hLmRhdGEodGhpcywiaHJlZi50YWJzIik7YiYmKHRoaXMuaHJlZj1iKTt2YXIgYz1hKHRoaXMpLnVuYmluZCgiLnRhYnMiKTthLmVhY2goWyJocmVmIiwibG9hZCIsImNhY2hlIl0sZnVuY3Rpb24oYSxiKXtjLnJlbW92ZURhdGEoYisiLnRhYnMiKX0pfSksdGhpcy5saXMudW5iaW5kKCIudGFicyIpLmFkZCh0aGlzLnBhbmVscykuZWFjaChmdW5jdGlvbigpe2EuZGF0YSh0aGlzLCJkZXN0cm95LnRhYnMiKT9hKHRoaXMpLnJlbW92ZSgpOmEodGhpcykucmVtb3ZlQ2xhc3MoWyJ1aS1zdGF0ZS1kZWZhdWx0IiwidWktY29ybmVyLXRvcCIsInVpLXRhYnMtc2VsZWN0ZWQiLCJ1aS1zdGF0ZS1hY3RpdmUiLCJ1aS1zdGF0ZS1ob3ZlciIsInVpLXN0YXRlLWZvY3VzIiwidWktc3RhdGUtZGlzYWJsZWQiLCJ1aS10YWJzLXBhbmVsIiwidWktd2lkZ2V0LWNvbnRlbnQiLCJ1aS1jb3JuZXItYm90dG9tIiwidWktdGFicy1oaWRlIl0uam9pbigiICIpKX0pLGIuY29va2llJiZ0aGlzLl9jb29raWUobnVsbCxiLmNvb2tpZSksdGhpc30sYWRkOmZ1bmN0aW9uKGMsZCxlKXtlPT09YiYmKGU9dGhpcy5hbmNob3JzLmxlbmd0aCk7dmFyIGY9dGhpcyxnPXRoaXMub3B0aW9ucyxoPWEoZy50YWJUZW1wbGF0ZS5yZXBsYWNlKC8jXHtocmVmXH0vZyxjKS5yZXBsYWNlKC8jXHtsYWJlbFx9L2csZCkpLGk9Yy5pbmRleE9mKCIjIik/dGhpcy5fdGFiSWQoYSgiYSIsaClbMF0pOmMucmVwbGFjZSgiIyIsIiIpO2guYWRkQ2xhc3MoInVpLXN0YXRlLWRlZmF1bHQgdWktY29ybmVyLXRvcCIpLmRhdGEoImRlc3Ryb3kudGFicyIsITApO3ZhciBqPWYuZWxlbWVudC5maW5kKCIjIitpKTtyZXR1cm4gai5sZW5ndGh8fChqPWEoZy5wYW5lbFRlbXBsYXRlKS5hdHRyKCJpZCIsaSkuZGF0YSgiZGVzdHJveS50YWJzIiwhMCkpLGouYWRkQ2xhc3MoInVpLXRhYnMtcGFuZWwgdWktd2lkZ2V0LWNvbnRlbnQgdWktY29ybmVyLWJvdHRvbSB1aS10YWJzLWhpZGUiKSxlPj10aGlzLmxpcy5sZW5ndGg/KGguYXBwZW5kVG8odGhpcy5saXN0KSxqLmFwcGVuZFRvKHRoaXMubGlzdFswXS5wYXJlbnROb2RlKSk6KGguaW5zZXJ0QmVmb3JlKHRoaXMubGlzW2VdKSxqLmluc2VydEJlZm9yZSh0aGlzLnBhbmVsc1tlXSkpLGcuZGlzYWJsZWQ9YS5tYXAoZy5kaXNhYmxlZCxmdW5jdGlvbihhLGIpe3JldHVybiBhPj1lPysrYTphfSksdGhpcy5fdGFiaWZ5KCksdGhpcy5hbmNob3JzLmxlbmd0aD09MSYmKGcuc2VsZWN0ZWQ9MCxoLmFkZENsYXNzKCJ1aS10YWJzLXNlbGVjdGVkIHVpLXN0YXRlLWFjdGl2ZSIpLGoucmVtb3ZlQ2xhc3MoInVpLXRhYnMtaGlkZSIpLHRoaXMuZWxlbWVudC5xdWV1ZSgidGFicyIsZnVuY3Rpb24oKXtmLl90cmlnZ2VyKCJzaG93IixudWxsLGYuX3VpKGYuYW5jaG9yc1swXSxmLnBhbmVsc1swXSkpfSksdGhpcy5sb2FkKDApKSx0aGlzLl90cmlnZ2VyKCJhZGQiLG51bGwsdGhpcy5fdWkodGhpcy5hbmNob3JzW2VdLHRoaXMucGFuZWxzW2VdKSksdGhpc30scmVtb3ZlOmZ1bmN0aW9uKGIpe2I9dGhpcy5fZ2V0SW5kZXgoYik7dmFyIGM9dGhpcy5vcHRpb25zLGQ9dGhpcy5saXMuZXEoYikucmVtb3ZlKCksZT10aGlzLnBhbmVscy5lcShiKS5yZW1vdmUoKTtyZXR1cm4gZC5oYXNDbGFzcygidWktdGFicy1zZWxlY3RlZCIpJiZ0aGlzLmFuY2hvcnMubGVuZ3RoPjEmJnRoaXMuc2VsZWN0KGIrKGIrMTx0aGlzLmFuY2hvcnMubGVuZ3RoPzE6LTEpKSxjLmRpc2FibGVkPWEubWFwKGEuZ3JlcChjLmRpc2FibGVkLGZ1bmN0aW9uKGEsYyl7cmV0dXJuIGEhPWJ9KSxmdW5jdGlvbihhLGMpe3JldHVybiBhPj1iPy0tYTphfSksdGhpcy5fdGFiaWZ5KCksdGhpcy5fdHJpZ2dlcigicmVtb3ZlIixudWxsLHRoaXMuX3VpKGQuZmluZCgiYSIpWzBdLGVbMF0pKSx0aGlzfSxlbmFibGU6ZnVuY3Rpb24oYil7Yj10aGlzLl9nZXRJbmRleChiKTt2YXIgYz10aGlzLm9wdGlvbnM7aWYoYS5pbkFycmF5KGIsYy5kaXNhYmxlZCk9PS0xKXJldHVybjtyZXR1cm4gdGhpcy5saXMuZXEoYikucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLWRpc2FibGVkIiksYy5kaXNhYmxlZD1hLmdyZXAoYy5kaXNhYmxlZCxmdW5jdGlvbihhLGMpe3JldHVybiBhIT1ifSksdGhpcy5fdHJpZ2dlcigiZW5hYmxlIixudWxsLHRoaXMuX3VpKHRoaXMuYW5jaG9yc1tiXSx0aGlzLnBhbmVsc1tiXSkpLHRoaXN9LGRpc2FibGU6ZnVuY3Rpb24oYSl7YT10aGlzLl9nZXRJbmRleChhKTt2YXIgYj10aGlzLGM9dGhpcy5vcHRpb25zO3JldHVybiBhIT1jLnNlbGVjdGVkJiYodGhpcy5saXMuZXEoYSkuYWRkQ2xhc3MoInVpLXN0YXRlLWRpc2FibGVkIiksYy5kaXNhYmxlZC5wdXNoKGEpLGMuZGlzYWJsZWQuc29ydCgpLHRoaXMuX3RyaWdnZXIoImRpc2FibGUiLG51bGwsdGhpcy5fdWkodGhpcy5hbmNob3JzW2FdLHRoaXMucGFuZWxzW2FdKSkpLHRoaXN9LHNlbGVjdDpmdW5jdGlvbihhKXthPXRoaXMuX2dldEluZGV4KGEpO2lmKGE9PS0xKWlmKHRoaXMub3B0aW9ucy5jb2xsYXBzaWJsZSYmdGhpcy5vcHRpb25zLnNlbGVjdGVkIT0tMSlhPXRoaXMub3B0aW9ucy5zZWxlY3RlZDtlbHNlIHJldHVybiB0aGlzO3JldHVybiB0aGlzLmFuY2hvcnMuZXEoYSkudHJpZ2dlcih0aGlzLm9wdGlvbnMuZXZlbnQrIi50YWJzIiksdGhpc30sbG9hZDpmdW5jdGlvbihiKXtiPXRoaXMuX2dldEluZGV4KGIpO3ZhciBjPXRoaXMsZD10aGlzLm9wdGlvbnMsZT10aGlzLmFuY2hvcnMuZXEoYilbMF0sZj1hLmRhdGEoZSwibG9hZC50YWJzIik7dGhpcy5hYm9ydCgpO2lmKCFmfHx0aGlzLmVsZW1lbnQucXVldWUoInRhYnMiKS5sZW5ndGghPT0wJiZhLmRhdGEoZSwiY2FjaGUudGFicyIpKXt0aGlzLmVsZW1lbnQuZGVxdWV1ZSgidGFicyIpO3JldHVybn10aGlzLmxpcy5lcShiKS5hZGRDbGFzcygidWktc3RhdGUtcHJvY2Vzc2luZyIpO2lmKGQuc3Bpbm5lcil7dmFyIGc9YSgic3BhbiIsZSk7Zy5kYXRhKCJsYWJlbC50YWJzIixnLmh0bWwoKSkuaHRtbChkLnNwaW5uZXIpfXJldHVybiB0aGlzLnhocj1hLmFqYXgoYS5leHRlbmQoe30sZC5hamF4T3B0aW9ucyx7dXJsOmYsc3VjY2VzczpmdW5jdGlvbihmLGcpe2MuZWxlbWVudC5maW5kKGMuX3Nhbml0aXplU2VsZWN0b3IoZS5oYXNoKSkuaHRtbChmKSxjLl9jbGVhbnVwKCksZC5jYWNoZSYmYS5kYXRhKGUsImNhY2hlLnRhYnMiLCEwKSxjLl90cmlnZ2VyKCJsb2FkIixudWxsLGMuX3VpKGMuYW5jaG9yc1tiXSxjLnBhbmVsc1tiXSkpO3RyeXtkLmFqYXhPcHRpb25zLnN1Y2Nlc3MoZixnKX1jYXRjaChoKXt9fSxlcnJvcjpmdW5jdGlvbihhLGYsZyl7Yy5fY2xlYW51cCgpLGMuX3RyaWdnZXIoImxvYWQiLG51bGwsYy5fdWkoYy5hbmNob3JzW2JdLGMucGFuZWxzW2JdKSk7dHJ5e2QuYWpheE9wdGlvbnMuZXJyb3IoYSxmLGIsZSl9Y2F0Y2goZyl7fX19KSksYy5lbGVtZW50LmRlcXVldWUoInRhYnMiKSx0aGlzfSxhYm9ydDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVsZW1lbnQucXVldWUoW10pLHRoaXMucGFuZWxzLnN0b3AoITEsITApLHRoaXMuZWxlbWVudC5xdWV1ZSgidGFicyIsdGhpcy5lbGVtZW50LnF1ZXVlKCJ0YWJzIikuc3BsaWNlKC0yLDIpKSx0aGlzLnhociYmKHRoaXMueGhyLmFib3J0KCksZGVsZXRlIHRoaXMueGhyKSx0aGlzLl9jbGVhbnVwKCksdGhpc30sdXJsOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuYW5jaG9ycy5lcShhKS5yZW1vdmVEYXRhKCJjYWNoZS50YWJzIikuZGF0YSgibG9hZC50YWJzIixiKSx0aGlzfSxsZW5ndGg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hbmNob3JzLmxlbmd0aH19KSxhLmV4dGVuZChhLnVpLnRhYnMse3ZlcnNpb246IjEuOC4yMyJ9KSxhLmV4dGVuZChhLnVpLnRhYnMucHJvdG90eXBlLHtyb3RhdGlvbjpudWxsLHJvdGF0ZTpmdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMsZD10aGlzLm9wdGlvbnMsZT1jLl9yb3RhdGV8fChjLl9yb3RhdGU9ZnVuY3Rpb24oYil7Y2xlYXJUaW1lb3V0KGMucm90YXRpb24pLGMucm90YXRpb249c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPWQuc2VsZWN0ZWQ7Yy5zZWxlY3QoKythPGMuYW5jaG9ycy5sZW5ndGg/YTowKX0sYSksYiYmYi5zdG9wUHJvcGFnYXRpb24oKX0pLGY9Yy5fdW5yb3RhdGV8fChjLl91bnJvdGF0ZT1iP2Z1bmN0aW9uKGEpe2UoKX06ZnVuY3Rpb24oYSl7YS5jbGllbnRYJiZjLnJvdGF0ZShudWxsKX0pO3JldHVybiBhPyh0aGlzLmVsZW1lbnQuYmluZCgidGFic3Nob3ciLGUpLHRoaXMuYW5jaG9ycy5iaW5kKGQuZXZlbnQrIi50YWJzIixmKSxlKCkpOihjbGVhclRpbWVvdXQoYy5yb3RhdGlvbiksdGhpcy5lbGVtZW50LnVuYmluZCgidGFic3Nob3ciLGUpLHRoaXMuYW5jaG9ycy51bmJpbmQoZC5ldmVudCsiLnRhYnMiLGYpLGRlbGV0ZSB0aGlzLl9yb3RhdGUsZGVsZXRlIHRoaXMuX3Vucm90YXRlKSx0aGlzfX0pfSkoalF1ZXJ5KTs7LyohIGpRdWVyeSBVSSAtIHYxLjguMjMgLSAyMDEyLTA4LTE1Ci0qIGh0dHBzOi8vZ2l0aHViLmNvbS9qcXVlcnkvanF1ZXJ5LXVpCi0qIEluY2x1ZGVzOiBqcXVlcnkudWkuZGF0ZXBpY2tlci5qcwotKiBDb3B5cmlnaHQgKGMpIDIwMTIgQVVUSE9SUy50eHQ7IExpY2Vuc2VkIE1JVCwgR1BMICovCi0oZnVuY3Rpb24oJCx1bmRlZmluZWQpe2Z1bmN0aW9uIERhdGVwaWNrZXIoKXt0aGlzLmRlYnVnPSExLHRoaXMuX2N1ckluc3Q9bnVsbCx0aGlzLl9rZXlFdmVudD0hMSx0aGlzLl9kaXNhYmxlZElucHV0cz1bXSx0aGlzLl9kYXRlcGlja2VyU2hvd2luZz0hMSx0aGlzLl9pbkRpYWxvZz0hMSx0aGlzLl9tYWluRGl2SWQ9InVpLWRhdGVwaWNrZXItZGl2Iix0aGlzLl9pbmxpbmVDbGFzcz0idWktZGF0ZXBpY2tlci1pbmxpbmUiLHRoaXMuX2FwcGVuZENsYXNzPSJ1aS1kYXRlcGlja2VyLWFwcGVuZCIsdGhpcy5fdHJpZ2dlckNsYXNzPSJ1aS1kYXRlcGlja2VyLXRyaWdnZXIiLHRoaXMuX2RpYWxvZ0NsYXNzPSJ1aS1kYXRlcGlja2VyLWRpYWxvZyIsdGhpcy5fZGlzYWJsZUNsYXNzPSJ1aS1kYXRlcGlja2VyLWRpc2FibGVkIix0aGlzLl91bnNlbGVjdGFibGVDbGFzcz0idWktZGF0ZXBpY2tlci11bnNlbGVjdGFibGUiLHRoaXMuX2N1cnJlbnRDbGFzcz0idWktZGF0ZXBpY2tlci1jdXJyZW50LWRheSIsdGhpcy5fZGF5T3ZlckNsYXNzPSJ1aS1kYXRlcGlja2VyLWRheXMtY2VsbC1vdmVyIix0aGlzLnJlZ2lvbmFsPVtdLHRoaXMucmVnaW9uYWxbIiJdPXtjbG9zZVRleHQ6IkRvbmUiLHByZXZUZXh0OiJQcmV2IixuZXh0VGV4dDoiTmV4dCIsY3VycmVudFRleHQ6IlRvZGF5Iixtb250aE5hbWVzOlsiSmFudWFyeSIsIkZlYnJ1YXJ5IiwiTWFyY2giLCJBcHJpbCIsIk1heSIsIkp1bmUiLCJKdWx5IiwiQXVndXN0IiwiU2VwdGVtYmVyIiwiT2N0b2JlciIsIk5vdmVtYmVyIiwiRGVjZW1iZXIiXSxtb250aE5hbWVzU2hvcnQ6WyJKYW4iLCJGZWIiLCJNYXIiLCJBcHIiLCJNYXkiLCJKdW4iLCJKdWwiLCJBdWciLCJTZXAiLCJPY3QiLCJOb3YiLCJEZWMiXSxkYXlOYW1lczpbIlN1bmRheSIsIk1vbmRheSIsIlR1ZXNkYXkiLCJXZWRuZXNkYXkiLCJUaHVyc2RheSIsIkZyaWRheSIsIlNhdHVyZGF5Il0sZGF5TmFtZXNTaG9ydDpbIlN1biIsIk1vbiIsIlR1ZSIsIldlZCIsIlRodSIsIkZyaSIsIlNhdCJdLGRheU5hbWVzTWluOlsiU3UiLCJNbyIsIlR1IiwiV2UiLCJUaCIsIkZyIiwiU2EiXSx3ZWVrSGVhZGVyOiJXayIsZGF0ZUZvcm1hdDoibW0vZGQveXkiLGZpcnN0RGF5OjAsaXNSVEw6ITEsc2hvd01vbnRoQWZ0ZXJZZWFyOiExLHllYXJTdWZmaXg6IiJ9LHRoaXMuX2RlZmF1bHRzPXtzaG93T246ImZvY3VzIixzaG93QW5pbToiZmFkZUluIixzaG93T3B0aW9uczp7fSxkZWZhdWx0RGF0ZTpudWxsLGFwcGVuZFRleHQ6IiIsYnV0dG9uVGV4dDoiLi4uIixidXR0b25JbWFnZToiIixidXR0b25JbWFnZU9ubHk6ITEsaGlkZUlmTm9QcmV2TmV4dDohMSxuYXZpZ2F0aW9uQXNEYXRlRm9ybWF0OiExLGdvdG9DdXJyZW50OiExLGNoYW5nZU1vbnRoOiExLGNoYW5nZVllYXI6ITEseWVhclJhbmdlOiJjLTEwOmMrMTAiLHNob3dPdGhlck1vbnRoczohMSxzZWxlY3RPdGhlck1vbnRoczohMSxzaG93V2VlazohMSxjYWxjdWxhdGVXZWVrOnRoaXMuaXNvODYwMVdlZWssc2hvcnRZZWFyQ3V0b2ZmOiIrMTAiLG1pbkRhdGU6bnVsbCxtYXhEYXRlOm51bGwsZHVyYXRpb246ImZhc3QiLGJlZm9yZVNob3dEYXk6bnVsbCxiZWZvcmVTaG93Om51bGwsb25TZWxlY3Q6bnVsbCxvbkNoYW5nZU1vbnRoWWVhcjpudWxsLG9uQ2xvc2U6bnVsbCxudW1iZXJPZk1vbnRoczoxLHNob3dDdXJyZW50QXRQb3M6MCxzdGVwTW9udGhzOjEsc3RlcEJpZ01vbnRoczoxMixhbHRGaWVsZDoiIixhbHRGb3JtYXQ6IiIsY29uc3RyYWluSW5wdXQ6ITAsc2hvd0J1dHRvblBhbmVsOiExLGF1dG9TaXplOiExLGRpc2FibGVkOiExfSwkLmV4dGVuZCh0aGlzLl9kZWZhdWx0cyx0aGlzLnJlZ2lvbmFsWyIiXSksdGhpcy5kcERpdj1iaW5kSG92ZXIoJCgnPGRpdiBpZD0iJyt0aGlzLl9tYWluRGl2SWQrJyIgY2xhc3M9InVpLWRhdGVwaWNrZXIgdWktd2lkZ2V0IHVpLXdpZGdldC1jb250ZW50IHVpLWhlbHBlci1jbGVhcmZpeCB1aS1jb3JuZXItYWxsIj48L2Rpdj4nKSl9ZnVuY3Rpb24gYmluZEhvdmVyKGEpe3ZhciBiPSJidXR0b24sIC51aS1kYXRlcGlja2VyLXByZXYsIC51aS1kYXRlcGlja2VyLW5leHQsIC51aS1kYXRlcGlja2VyLWNhbGVuZGFyIHRkIGEiO3JldHVybiBhLmJpbmQoIm1vdXNlb3V0IixmdW5jdGlvbihhKXt2YXIgYz0kKGEudGFyZ2V0KS5jbG9zZXN0KGIpO2lmKCFjLmxlbmd0aClyZXR1cm47Yy5yZW1vdmVDbGFzcygidWktc3RhdGUtaG92ZXIgdWktZGF0ZXBpY2tlci1wcmV2LWhvdmVyIHVpLWRhdGVwaWNrZXItbmV4dC1ob3ZlciIpfSkuYmluZCgibW91c2VvdmVyIixmdW5jdGlvbihjKXt2YXIgZD0kKGMudGFyZ2V0KS5jbG9zZXN0KGIpO2lmKCQuZGF0ZXBpY2tlci5faXNEaXNhYmxlZERhdGVwaWNrZXIoaW5zdEFjdGl2ZS5pbmxpbmU/YS5wYXJlbnQoKVswXTppbnN0QWN0aXZlLmlucHV0WzBdKXx8IWQubGVuZ3RoKXJldHVybjtkLnBhcmVudHMoIi51aS1kYXRlcGlja2VyLWNhbGVuZGFyIikuZmluZCgiYSIpLnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1ob3ZlciIpLGQuYWRkQ2xhc3MoInVpLXN0YXRlLWhvdmVyIiksZC5oYXNDbGFzcygidWktZGF0ZXBpY2tlci1wcmV2IikmJmQuYWRkQ2xhc3MoInVpLWRhdGVwaWNrZXItcHJldi1ob3ZlciIpLGQuaGFzQ2xhc3MoInVpLWRhdGVwaWNrZXItbmV4dCIpJiZkLmFkZENsYXNzKCJ1aS1kYXRlcGlja2VyLW5leHQtaG92ZXIiKX0pfWZ1bmN0aW9uIGV4dGVuZFJlbW92ZShhLGIpeyQuZXh0ZW5kKGEsYik7Zm9yKHZhciBjIGluIGIpaWYoYltjXT09bnVsbHx8YltjXT09dW5kZWZpbmVkKWFbY109YltjXTtyZXR1cm4gYX1mdW5jdGlvbiBpc0FycmF5KGEpe3JldHVybiBhJiYoJC5icm93c2VyLnNhZmFyaSYmdHlwZW9mIGE9PSJvYmplY3QiJiZhLmxlbmd0aHx8YS5jb25zdHJ1Y3RvciYmYS5jb25zdHJ1Y3Rvci50b1N0cmluZygpLm1hdGNoKC9cQXJyYXlcKFwpLykpfSQuZXh0ZW5kKCQudWkse2RhdGVwaWNrZXI6e3ZlcnNpb246IjEuOC4yMyJ9fSk7dmFyIFBST1BfTkFNRT0iZGF0ZXBpY2tlciIsZHB1dWlkPShuZXcgRGF0ZSkuZ2V0VGltZSgpLGluc3RBY3RpdmU7JC5leHRlbmQoRGF0ZXBpY2tlci5wcm90b3R5cGUse21hcmtlckNsYXNzTmFtZToiaGFzRGF0ZXBpY2tlciIsbWF4Um93czo0LGxvZzpmdW5jdGlvbigpe3RoaXMuZGVidWcmJmNvbnNvbGUubG9nLmFwcGx5KCIiLGFyZ3VtZW50cyl9LF93aWRnZXREYXRlcGlja2VyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHBEaXZ9LHNldERlZmF1bHRzOmZ1bmN0aW9uKGEpe3JldHVybiBleHRlbmRSZW1vdmUodGhpcy5fZGVmYXVsdHMsYXx8e30pLHRoaXN9LF9hdHRhY2hEYXRlcGlja2VyOmZ1bmN0aW9uKHRhcmdldCxzZXR0aW5ncyl7dmFyIGlubGluZVNldHRpbmdzPW51bGw7Zm9yKHZhciBhdHRyTmFtZSBpbiB0aGlzLl9kZWZhdWx0cyl7dmFyIGF0dHJWYWx1ZT10YXJnZXQuZ2V0QXR0cmlidXRlKCJkYXRlOiIrYXR0ck5hbWUpO2lmKGF0dHJWYWx1ZSl7aW5saW5lU2V0dGluZ3M9aW5saW5lU2V0dGluZ3N8fHt9O3RyeXtpbmxpbmVTZXR0aW5nc1thdHRyTmFtZV09ZXZhbChhdHRyVmFsdWUpfWNhdGNoKGVycil7aW5saW5lU2V0dGluZ3NbYXR0ck5hbWVdPWF0dHJWYWx1ZX19fXZhciBub2RlTmFtZT10YXJnZXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSxpbmxpbmU9bm9kZU5hbWU9PSJkaXYifHxub2RlTmFtZT09InNwYW4iO3RhcmdldC5pZHx8KHRoaXMudXVpZCs9MSx0YXJnZXQuaWQ9ImRwIit0aGlzLnV1aWQpO3ZhciBpbnN0PXRoaXMuX25ld0luc3QoJCh0YXJnZXQpLGlubGluZSk7aW5zdC5zZXR0aW5ncz0kLmV4dGVuZCh7fSxzZXR0aW5nc3x8e30saW5saW5lU2V0dGluZ3N8fHt9KSxub2RlTmFtZT09ImlucHV0Ij90aGlzLl9jb25uZWN0RGF0ZXBpY2tlcih0YXJnZXQsaW5zdCk6aW5saW5lJiZ0aGlzLl9pbmxpbmVEYXRlcGlja2VyKHRhcmdldCxpbnN0KX0sX25ld0luc3Q6ZnVuY3Rpb24oYSxiKXt2YXIgYz1hWzBdLmlkLnJlcGxhY2UoLyhbXkEtWmEtejAtOV8tXSkvZywiXFxcXCQxIik7cmV0dXJue2lkOmMsaW5wdXQ6YSxzZWxlY3RlZERheTowLHNlbGVjdGVkTW9udGg6MCxzZWxlY3RlZFllYXI6MCxkcmF3TW9udGg6MCxkcmF3WWVhcjowLGlubGluZTpiLGRwRGl2OmI/YmluZEhvdmVyKCQoJzxkaXYgY2xhc3M9IicrdGhpcy5faW5saW5lQ2xhc3MrJyB1aS1kYXRlcGlja2VyIHVpLXdpZGdldCB1aS13aWRnZXQtY29udGVudCB1aS1oZWxwZXItY2xlYXJmaXggdWktY29ybmVyLWFsbCI+PC9kaXY+JykpOnRoaXMuZHBEaXZ9fSxfY29ubmVjdERhdGVwaWNrZXI6ZnVuY3Rpb24oYSxiKXt2YXIgYz0kKGEpO2IuYXBwZW5kPSQoW10pLGIudHJpZ2dlcj0kKFtdKTtpZihjLmhhc0NsYXNzKHRoaXMubWFya2VyQ2xhc3NOYW1lKSlyZXR1cm47dGhpcy5fYXR0YWNobWVudHMoYyxiKSxjLmFkZENsYXNzKHRoaXMubWFya2VyQ2xhc3NOYW1lKS5rZXlkb3duKHRoaXMuX2RvS2V5RG93bikua2V5cHJlc3ModGhpcy5fZG9LZXlQcmVzcykua2V5dXAodGhpcy5fZG9LZXlVcCkuYmluZCgic2V0RGF0YS5kYXRlcGlja2VyIixmdW5jdGlvbihhLGMsZCl7Yi5zZXR0aW5nc1tjXT1kfSkuYmluZCgiZ2V0RGF0YS5kYXRlcGlja2VyIixmdW5jdGlvbihhLGMpe3JldHVybiB0aGlzLl9nZXQoYixjKX0pLHRoaXMuX2F1dG9TaXplKGIpLCQuZGF0YShhLFBST1BfTkFNRSxiKSxiLnNldHRpbmdzLmRpc2FibGVkJiZ0aGlzLl9kaXNhYmxlRGF0ZXBpY2tlcihhKX0sX2F0dGFjaG1lbnRzOmZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpcy5fZ2V0KGIsImFwcGVuZFRleHQiKSxkPXRoaXMuX2dldChiLCJpc1JUTCIpO2IuYXBwZW5kJiZiLmFwcGVuZC5yZW1vdmUoKSxjJiYoYi5hcHBlbmQ9JCgnPHNwYW4gY2xhc3M9IicrdGhpcy5fYXBwZW5kQ2xhc3MrJyI+JytjKyI8L3NwYW4+IiksYVtkPyJiZWZvcmUiOiJhZnRlciJdKGIuYXBwZW5kKSksYS51bmJpbmQoImZvY3VzIix0aGlzLl9zaG93RGF0ZXBpY2tlciksYi50cmlnZ2VyJiZiLnRyaWdnZXIucmVtb3ZlKCk7dmFyIGU9dGhpcy5fZ2V0KGIsInNob3dPbiIpOyhlPT0iZm9jdXMifHxlPT0iYm90aCIpJiZhLmZvY3VzKHRoaXMuX3Nob3dEYXRlcGlja2VyKTtpZihlPT0iYnV0dG9uInx8ZT09ImJvdGgiKXt2YXIgZj10aGlzLl9nZXQoYiwiYnV0dG9uVGV4dCIpLGc9dGhpcy5fZ2V0KGIsImJ1dHRvbkltYWdlIik7Yi50cmlnZ2VyPSQodGhpcy5fZ2V0KGIsImJ1dHRvbkltYWdlT25seSIpPyQoIjxpbWcvPiIpLmFkZENsYXNzKHRoaXMuX3RyaWdnZXJDbGFzcykuYXR0cih7c3JjOmcsYWx0OmYsdGl0bGU6Zn0pOiQoJzxidXR0b24gdHlwZT0iYnV0dG9uIj48L2J1dHRvbj4nKS5hZGRDbGFzcyh0aGlzLl90cmlnZ2VyQ2xhc3MpLmh0bWwoZz09IiI/ZjokKCI8aW1nLz4iKS5hdHRyKHtzcmM6ZyxhbHQ6Zix0aXRsZTpmfSkpKSxhW2Q/ImJlZm9yZSI6ImFmdGVyIl0oYi50cmlnZ2VyKSxiLnRyaWdnZXIuY2xpY2soZnVuY3Rpb24oKXtyZXR1cm4gJC5kYXRlcGlja2VyLl9kYXRlcGlja2VyU2hvd2luZyYmJC5kYXRlcGlja2VyLl9sYXN0SW5wdXQ9PWFbMF0/JC5kYXRlcGlja2VyLl9oaWRlRGF0ZXBpY2tlcigpOiQuZGF0ZXBpY2tlci5fZGF0ZXBpY2tlclNob3dpbmcmJiQuZGF0ZXBpY2tlci5fbGFzdElucHV0IT1hWzBdPygkLmRhdGVwaWNrZXIuX2hpZGVEYXRlcGlja2VyKCksJC5kYXRlcGlja2VyLl9zaG93RGF0ZXBpY2tlcihhWzBdKSk6JC5kYXRlcGlja2VyLl9zaG93RGF0ZXBpY2tlcihhWzBdKSwhMX0pfX0sX2F1dG9TaXplOmZ1bmN0aW9uKGEpe2lmKHRoaXMuX2dldChhLCJhdXRvU2l6ZSIpJiYhYS5pbmxpbmUpe3ZhciBiPW5ldyBEYXRlKDIwMDksMTEsMjApLGM9dGhpcy5fZ2V0KGEsImRhdGVGb3JtYXQiKTtpZihjLm1hdGNoKC9bRE1dLykpe3ZhciBkPWZ1bmN0aW9uKGEpe3ZhciBiPTAsYz0wO2Zvcih2YXIgZD0wO2Q8YS5sZW5ndGg7ZCsrKWFbZF0ubGVuZ3RoPmImJihiPWFbZF0ubGVuZ3RoLGM9ZCk7cmV0dXJuIGN9O2Iuc2V0TW9udGgoZCh0aGlzLl9nZXQoYSxjLm1hdGNoKC9NTS8pPyJtb250aE5hbWVzIjoibW9udGhOYW1lc1Nob3J0IikpKSxiLnNldERhdGUoZCh0aGlzLl9nZXQoYSxjLm1hdGNoKC9ERC8pPyJkYXlOYW1lcyI6ImRheU5hbWVzU2hvcnQiKSkrMjAtYi5nZXREYXkoKSl9YS5pbnB1dC5hdHRyKCJzaXplIix0aGlzLl9mb3JtYXREYXRlKGEsYikubGVuZ3RoKX19LF9pbmxpbmVEYXRlcGlja2VyOmZ1bmN0aW9uKGEsYil7dmFyIGM9JChhKTtpZihjLmhhc0NsYXNzKHRoaXMubWFya2VyQ2xhc3NOYW1lKSlyZXR1cm47Yy5hZGRDbGFzcyh0aGlzLm1hcmtlckNsYXNzTmFtZSkuYXBwZW5kKGIuZHBEaXYpLmJpbmQoInNldERhdGEuZGF0ZXBpY2tlciIsZnVuY3Rpb24oYSxjLGQpe2Iuc2V0dGluZ3NbY109ZH0pLmJpbmQoImdldERhdGEuZGF0ZXBpY2tlciIsZnVuY3Rpb24oYSxjKXtyZXR1cm4gdGhpcy5fZ2V0KGIsYyl9KSwkLmRhdGEoYSxQUk9QX05BTUUsYiksdGhpcy5fc2V0RGF0ZShiLHRoaXMuX2dldERlZmF1bHREYXRlKGIpLCEwKSx0aGlzLl91cGRhdGVEYXRlcGlja2VyKGIpLHRoaXMuX3VwZGF0ZUFsdGVybmF0ZShiKSxiLnNldHRpbmdzLmRpc2FibGVkJiZ0aGlzLl9kaXNhYmxlRGF0ZXBpY2tlcihhKSxiLmRwRGl2LmNzcygiZGlzcGxheSIsImJsb2NrIil9LF9kaWFsb2dEYXRlcGlja2VyOmZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGY9dGhpcy5fZGlhbG9nSW5zdDtpZighZil7dGhpcy51dWlkKz0xO3ZhciBnPSJkcCIrdGhpcy51dWlkO3RoaXMuX2RpYWxvZ0lucHV0PSQoJzxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iJytnKyciIHN0eWxlPSJwb3NpdGlvbjogYWJzb2x1dGU7IHRvcDogLTEwMHB4OyB3aWR0aDogMHB4OyIvPicpLHRoaXMuX2RpYWxvZ0lucHV0LmtleWRvd24odGhpcy5fZG9LZXlEb3duKSwkKCJib2R5IikuYXBwZW5kKHRoaXMuX2RpYWxvZ0lucHV0KSxmPXRoaXMuX2RpYWxvZ0luc3Q9dGhpcy5fbmV3SW5zdCh0aGlzLl9kaWFsb2dJbnB1dCwhMSksZi5zZXR0aW5ncz17fSwkLmRhdGEodGhpcy5fZGlhbG9nSW5wdXRbMF0sUFJPUF9OQU1FLGYpfWV4dGVuZFJlbW92ZShmLnNldHRpbmdzLGR8fHt9KSxiPWImJmIuY29uc3RydWN0b3I9PURhdGU/dGhpcy5fZm9ybWF0RGF0ZShmLGIpOmIsdGhpcy5fZGlhbG9nSW5wdXQudmFsKGIpLHRoaXMuX3Bvcz1lP2UubGVuZ3RoP2U6W2UucGFnZVgsZS5wYWdlWV06bnVsbDtpZighdGhpcy5fcG9zKXt2YXIgaD1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgsaT1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0LGo9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnR8fGRvY3VtZW50LmJvZHkuc2Nyb2xsTGVmdCxrPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3B8fGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wO3RoaXMuX3Bvcz1baC8yLTEwMCtqLGkvMi0xNTAra119cmV0dXJuIHRoaXMuX2RpYWxvZ0lucHV0LmNzcygibGVmdCIsdGhpcy5fcG9zWzBdKzIwKyJweCIpLmNzcygidG9wIix0aGlzLl9wb3NbMV0rInB4IiksZi5zZXR0aW5ncy5vblNlbGVjdD1jLHRoaXMuX2luRGlhbG9nPSEwLHRoaXMuZHBEaXYuYWRkQ2xhc3ModGhpcy5fZGlhbG9nQ2xhc3MpLHRoaXMuX3Nob3dEYXRlcGlja2VyKHRoaXMuX2RpYWxvZ0lucHV0WzBdKSwkLmJsb2NrVUkmJiQuYmxvY2tVSSh0aGlzLmRwRGl2KSwkLmRhdGEodGhpcy5fZGlhbG9nSW5wdXRbMF0sUFJPUF9OQU1FLGYpLHRoaXN9LF9kZXN0cm95RGF0ZXBpY2tlcjpmdW5jdGlvbihhKXt2YXIgYj0kKGEpLGM9JC5kYXRhKGEsUFJPUF9OQU1FKTtpZighYi5oYXNDbGFzcyh0aGlzLm1hcmtlckNsYXNzTmFtZSkpcmV0dXJuO3ZhciBkPWEubm9kZU5hbWUudG9Mb3dlckNhc2UoKTskLnJlbW92ZURhdGEoYSxQUk9QX05BTUUpLGQ9PSJpbnB1dCI/KGMuYXBwZW5kLnJlbW92ZSgpLGMudHJpZ2dlci5yZW1vdmUoKSxiLnJlbW92ZUNsYXNzKHRoaXMubWFya2VyQ2xhc3NOYW1lKS51bmJpbmQoImZvY3VzIix0aGlzLl9zaG93RGF0ZXBpY2tlcikudW5iaW5kKCJrZXlkb3duIix0aGlzLl9kb0tleURvd24pLnVuYmluZCgia2V5cHJlc3MiLHRoaXMuX2RvS2V5UHJlc3MpLnVuYmluZCgia2V5dXAiLHRoaXMuX2RvS2V5VXApKTooZD09ImRpdiJ8fGQ9PSJzcGFuIikmJmIucmVtb3ZlQ2xhc3ModGhpcy5tYXJrZXJDbGFzc05hbWUpLmVtcHR5KCl9LF9lbmFibGVEYXRlcGlja2VyOmZ1bmN0aW9uKGEpe3ZhciBiPSQoYSksYz0kLmRhdGEoYSxQUk9QX05BTUUpO2lmKCFiLmhhc0NsYXNzKHRoaXMubWFya2VyQ2xhc3NOYW1lKSlyZXR1cm47dmFyIGQ9YS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO2lmKGQ9PSJpbnB1dCIpYS5kaXNhYmxlZD0hMSxjLnRyaWdnZXIuZmlsdGVyKCJidXR0b24iKS5lYWNoKGZ1bmN0aW9uKCl7dGhpcy5kaXNhYmxlZD0hMX0pLmVuZCgpLmZpbHRlcigiaW1nIikuY3NzKHtvcGFjaXR5OiIxLjAiLGN1cnNvcjoiIn0pO2Vsc2UgaWYoZD09ImRpdiJ8fGQ9PSJzcGFuIil7dmFyIGU9Yi5jaGlsZHJlbigiLiIrdGhpcy5faW5saW5lQ2xhc3MpO2UuY2hpbGRyZW4oKS5yZW1vdmVDbGFzcygidWktc3RhdGUtZGlzYWJsZWQiKSxlLmZpbmQoInNlbGVjdC51aS1kYXRlcGlja2VyLW1vbnRoLCBzZWxlY3QudWktZGF0ZXBpY2tlci15ZWFyIikucmVtb3ZlQXR0cigiZGlzYWJsZWQiKX10aGlzLl9kaXNhYmxlZElucHV0cz0kLm1hcCh0aGlzLl9kaXNhYmxlZElucHV0cyxmdW5jdGlvbihiKXtyZXR1cm4gYj09YT9udWxsOmJ9KX0sX2Rpc2FibGVEYXRlcGlja2VyOmZ1bmN0aW9uKGEpe3ZhciBiPSQoYSksYz0kLmRhdGEoYSxQUk9QX05BTUUpO2lmKCFiLmhhc0NsYXNzKHRoaXMubWFya2VyQ2xhc3NOYW1lKSlyZXR1cm47dmFyIGQ9YS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO2lmKGQ9PSJpbnB1dCIpYS5kaXNhYmxlZD0hMCxjLnRyaWdnZXIuZmlsdGVyKCJidXR0b24iKS5lYWNoKGZ1bmN0aW9uKCl7dGhpcy5kaXNhYmxlZD0hMH0pLmVuZCgpLmZpbHRlcigiaW1nIikuY3NzKHtvcGFjaXR5OiIwLjUiLGN1cnNvcjoiZGVmYXVsdCJ9KTtlbHNlIGlmKGQ9PSJkaXYifHxkPT0ic3BhbiIpe3ZhciBlPWIuY2hpbGRyZW4oIi4iK3RoaXMuX2lubGluZUNsYXNzKTtlLmNoaWxkcmVuKCkuYWRkQ2xhc3MoInVpLXN0YXRlLWRpc2FibGVkIiksZS5maW5kKCJzZWxlY3QudWktZGF0ZXBpY2tlci1tb250aCwgc2VsZWN0LnVpLWRhdGVwaWNrZXIteWVhciIpLmF0dHIoImRpc2FibGVkIiwiZGlzYWJsZWQiKX10aGlzLl9kaXNhYmxlZElucHV0cz0kLm1hcCh0aGlzLl9kaXNhYmxlZElucHV0cyxmdW5jdGlvbihiKXtyZXR1cm4gYj09YT9udWxsOmJ9KSx0aGlzLl9kaXNhYmxlZElucHV0c1t0aGlzLl9kaXNhYmxlZElucHV0cy5sZW5ndGhdPWF9LF9pc0Rpc2FibGVkRGF0ZXBpY2tlcjpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4hMTtmb3IodmFyIGI9MDtiPHRoaXMuX2Rpc2FibGVkSW5wdXRzLmxlbmd0aDtiKyspaWYodGhpcy5fZGlzYWJsZWRJbnB1dHNbYl09PWEpcmV0dXJuITA7cmV0dXJuITF9LF9nZXRJbnN0OmZ1bmN0aW9uKGEpe3RyeXtyZXR1cm4gJC5kYXRhKGEsUFJPUF9OQU1FKX1jYXRjaChiKXt0aHJvdyJNaXNzaW5nIGluc3RhbmNlIGRhdGEgZm9yIHRoaXMgZGF0ZXBpY2tlciJ9fSxfb3B0aW9uRGF0ZXBpY2tlcjpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9dGhpcy5fZ2V0SW5zdChhKTtpZihhcmd1bWVudHMubGVuZ3RoPT0yJiZ0eXBlb2YgYj09InN0cmluZyIpcmV0dXJuIGI9PSJkZWZhdWx0cyI/JC5leHRlbmQoe30sJC5kYXRlcGlja2VyLl9kZWZhdWx0cyk6ZD9iPT0iYWxsIj8kLmV4dGVuZCh7fSxkLnNldHRpbmdzKTp0aGlzLl9nZXQoZCxiKTpudWxsO3ZhciBlPWJ8fHt9O3R5cGVvZiBiPT0ic3RyaW5nIiYmKGU9e30sZVtiXT1jKTtpZihkKXt0aGlzLl9jdXJJbnN0PT1kJiZ0aGlzLl9oaWRlRGF0ZXBpY2tlcigpO3ZhciBmPXRoaXMuX2dldERhdGVEYXRlcGlja2VyKGEsITApLGc9dGhpcy5fZ2V0TWluTWF4RGF0ZShkLCJtaW4iKSxoPXRoaXMuX2dldE1pbk1heERhdGUoZCwibWF4Iik7ZXh0ZW5kUmVtb3ZlKGQuc2V0dGluZ3MsZSksZyE9PW51bGwmJmUuZGF0ZUZvcm1hdCE9PXVuZGVmaW5lZCYmZS5taW5EYXRlPT09dW5kZWZpbmVkJiYoZC5zZXR0aW5ncy5taW5EYXRlPXRoaXMuX2Zvcm1hdERhdGUoZCxnKSksaCE9PW51bGwmJmUuZGF0ZUZvcm1hdCE9PXVuZGVmaW5lZCYmZS5tYXhEYXRlPT09dW5kZWZpbmVkJiYoZC5zZXR0aW5ncy5tYXhEYXRlPXRoaXMuX2Zvcm1hdERhdGUoZCxoKSksdGhpcy5fYXR0YWNobWVudHMoJChhKSxkKSx0aGlzLl9hdXRvU2l6ZShkKSx0aGlzLl9zZXREYXRlKGQsZiksdGhpcy5fdXBkYXRlQWx0ZXJuYXRlKGQpLHRoaXMuX3VwZGF0ZURhdGVwaWNrZXIoZCl9fSxfY2hhbmdlRGF0ZXBpY2tlcjpmdW5jdGlvbihhLGIsYyl7dGhpcy5fb3B0aW9uRGF0ZXBpY2tlcihhLGIsYyl9LF9yZWZyZXNoRGF0ZXBpY2tlcjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLl9nZXRJbnN0KGEpO2ImJnRoaXMuX3VwZGF0ZURhdGVwaWNrZXIoYil9LF9zZXREYXRlRGF0ZXBpY2tlcjpmdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMuX2dldEluc3QoYSk7YyYmKHRoaXMuX3NldERhdGUoYyxiKSx0aGlzLl91cGRhdGVEYXRlcGlja2VyKGMpLHRoaXMuX3VwZGF0ZUFsdGVybmF0ZShjKSl9LF9nZXREYXRlRGF0ZXBpY2tlcjpmdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMuX2dldEluc3QoYSk7cmV0dXJuIGMmJiFjLmlubGluZSYmdGhpcy5fc2V0RGF0ZUZyb21GaWVsZChjLGIpLGM/dGhpcy5fZ2V0RGF0ZShjKTpudWxsfSxfZG9LZXlEb3duOmZ1bmN0aW9uKGEpe3ZhciBiPSQuZGF0ZXBpY2tlci5fZ2V0SW5zdChhLnRhcmdldCksYz0hMCxkPWIuZHBEaXYuaXMoIi51aS1kYXRlcGlja2VyLXJ0bCIpO2IuX2tleUV2ZW50PSEwO2lmKCQuZGF0ZXBpY2tlci5fZGF0ZXBpY2tlclNob3dpbmcpc3dpdGNoKGEua2V5Q29kZSl7Y2FzZSA5OiQuZGF0ZXBpY2tlci5faGlkZURhdGVwaWNrZXIoKSxjPSExO2JyZWFrO2Nhc2UgMTM6dmFyIGU9JCgidGQuIiskLmRhdGVwaWNrZXIuX2RheU92ZXJDbGFzcysiOm5vdCguIiskLmRhdGVwaWNrZXIuX2N1cnJlbnRDbGFzcysiKSIsYi5kcERpdik7ZVswXSYmJC5kYXRlcGlja2VyLl9zZWxlY3REYXkoYS50YXJnZXQsYi5zZWxlY3RlZE1vbnRoLGIuc2VsZWN0ZWRZZWFyLGVbMF0pO3ZhciBmPSQuZGF0ZXBpY2tlci5fZ2V0KGIsIm9uU2VsZWN0Iik7aWYoZil7dmFyIGc9JC5kYXRlcGlja2VyLl9mb3JtYXREYXRlKGIpO2YuYXBwbHkoYi5pbnB1dD9iLmlucHV0WzBdOm51bGwsW2csYl0pfWVsc2UgJC5kYXRlcGlja2VyLl9oaWRlRGF0ZXBpY2tlcigpO3JldHVybiExO2Nhc2UgMjc6JC5kYXRlcGlja2VyLl9oaWRlRGF0ZXBpY2tlcigpO2JyZWFrO2Nhc2UgMzM6JC5kYXRlcGlja2VyLl9hZGp1c3REYXRlKGEudGFyZ2V0LGEuY3RybEtleT8tJC5kYXRlcGlja2VyLl9nZXQoYiwic3RlcEJpZ01vbnRocyIpOi0kLmRhdGVwaWNrZXIuX2dldChiLCJzdGVwTW9udGhzIiksIk0iKTticmVhaztjYXNlIDM0OiQuZGF0ZXBpY2tlci5fYWRqdXN0RGF0ZShhLnRhcmdldCxhLmN0cmxLZXk/KyQuZGF0ZXBpY2tlci5fZ2V0KGIsInN0ZXBCaWdNb250aHMiKTorJC5kYXRlcGlja2VyLl9nZXQoYiwic3RlcE1vbnRocyIpLCJNIik7YnJlYWs7Y2FzZSAzNTooYS5jdHJsS2V5fHxhLm1ldGFLZXkpJiYkLmRhdGVwaWNrZXIuX2NsZWFyRGF0ZShhLnRhcmdldCksYz1hLmN0cmxLZXl8fGEubWV0YUtleTticmVhaztjYXNlIDM2OihhLmN0cmxLZXl8fGEubWV0YUtleSkmJiQuZGF0ZXBpY2tlci5fZ290b1RvZGF5KGEudGFyZ2V0KSxjPWEuY3RybEtleXx8YS5tZXRhS2V5O2JyZWFrO2Nhc2UgMzc6KGEuY3RybEtleXx8YS5tZXRhS2V5KSYmJC5kYXRlcGlja2VyLl9hZGp1c3REYXRlKGEudGFyZ2V0LGQ/MTotMSwiRCIpLGM9YS5jdHJsS2V5fHxhLm1ldGFLZXksYS5vcmlnaW5hbEV2ZW50LmFsdEtleSYmJC5kYXRlcGlja2VyLl9hZGp1c3REYXRlKGEudGFyZ2V0LGEuY3RybEtleT8tJC5kYXRlcGlja2VyLl9nZXQoYiwic3RlcEJpZ01vbnRocyIpOi0kLmRhdGVwaWNrZXIuX2dldChiLCJzdGVwTW9udGhzIiksIk0iKTticmVhaztjYXNlIDM4OihhLmN0cmxLZXl8fGEubWV0YUtleSkmJiQuZGF0ZXBpY2tlci5fYWRqdXN0RGF0ZShhLnRhcmdldCwtNywiRCIpLGM9YS5jdHJsS2V5fHxhLm1ldGFLZXk7YnJlYWs7Y2FzZSAzOTooYS5jdHJsS2V5fHxhLm1ldGFLZXkpJiYkLmRhdGVwaWNrZXIuX2FkanVzdERhdGUoYS50YXJnZXQsZD8tMToxLCJEIiksYz1hLmN0cmxLZXl8fGEubWV0YUtleSxhLm9yaWdpbmFsRXZlbnQuYWx0S2V5JiYkLmRhdGVwaWNrZXIuX2FkanVzdERhdGUoYS50YXJnZXQsYS5jdHJsS2V5PyskLmRhdGVwaWNrZXIuX2dldChiLCJzdGVwQmlnTW9udGhzIik6KyQuZGF0ZXBpY2tlci5fZ2V0KGIsInN0ZXBNb250aHMiKSwiTSIpO2JyZWFrO2Nhc2UgNDA6KGEuY3RybEtleXx8YS5tZXRhS2V5KSYmJC5kYXRlcGlja2VyLl9hZGp1c3REYXRlKGEudGFyZ2V0LDcsIkQiKSxjPWEuY3RybEtleXx8YS5tZXRhS2V5O2JyZWFrO2RlZmF1bHQ6Yz0hMX1lbHNlIGEua2V5Q29kZT09MzYmJmEuY3RybEtleT8kLmRhdGVwaWNrZXIuX3Nob3dEYXRlcGlja2VyKHRoaXMpOmM9ITE7YyYmKGEucHJldmVudERlZmF1bHQoKSxhLnN0b3BQcm9wYWdhdGlvbigpKX0sX2RvS2V5UHJlc3M6ZnVuY3Rpb24oYSl7dmFyIGI9JC5kYXRlcGlja2VyLl9nZXRJbnN0KGEudGFyZ2V0KTtpZigkLmRhdGVwaWNrZXIuX2dldChiLCJjb25zdHJhaW5JbnB1dCIpKXt2YXIgYz0kLmRhdGVwaWNrZXIuX3Bvc3NpYmxlQ2hhcnMoJC5kYXRlcGlja2VyLl9nZXQoYiwiZGF0ZUZvcm1hdCIpKSxkPVN0cmluZy5mcm9tQ2hhckNvZGUoYS5jaGFyQ29kZT09dW5kZWZpbmVkP2Eua2V5Q29kZTphLmNoYXJDb2RlKTtyZXR1cm4gYS5jdHJsS2V5fHxhLm1ldGFLZXl8fGQ8IiAifHwhY3x8Yy5pbmRleE9mKGQpPi0xfX0sX2RvS2V5VXA6ZnVuY3Rpb24oYSl7dmFyIGI9JC5kYXRlcGlja2VyLl9nZXRJbnN0KGEudGFyZ2V0KTtpZihiLmlucHV0LnZhbCgpIT1iLmxhc3RWYWwpdHJ5e3ZhciBjPSQuZGF0ZXBpY2tlci5wYXJzZURhdGUoJC5kYXRlcGlja2VyLl9nZXQoYiwiZGF0ZUZvcm1hdCIpLGIuaW5wdXQ/Yi5pbnB1dC52YWwoKTpudWxsLCQuZGF0ZXBpY2tlci5fZ2V0Rm9ybWF0Q29uZmlnKGIpKTtjJiYoJC5kYXRlcGlja2VyLl9zZXREYXRlRnJvbUZpZWxkKGIpLCQuZGF0ZXBpY2tlci5fdXBkYXRlQWx0ZXJuYXRlKGIpLCQuZGF0ZXBpY2tlci5fdXBkYXRlRGF0ZXBpY2tlcihiKSl9Y2F0Y2goZCl7JC5kYXRlcGlja2VyLmxvZyhkKX1yZXR1cm4hMH0sX3Nob3dEYXRlcGlja2VyOmZ1bmN0aW9uKGEpe2E9YS50YXJnZXR8fGEsYS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpIT0iaW5wdXQiJiYoYT0kKCJpbnB1dCIsYS5wYXJlbnROb2RlKVswXSk7aWYoJC5kYXRlcGlja2VyLl9pc0Rpc2FibGVkRGF0ZXBpY2tlcihhKXx8JC5kYXRlcGlja2VyLl9sYXN0SW5wdXQ9PWEpcmV0dXJuO3ZhciBiPSQuZGF0ZXBpY2tlci5fZ2V0SW5zdChhKTskLmRhdGVwaWNrZXIuX2N1ckluc3QmJiQuZGF0ZXBpY2tlci5fY3VySW5zdCE9YiYmKCQuZGF0ZXBpY2tlci5fY3VySW5zdC5kcERpdi5zdG9wKCEwLCEwKSxiJiYkLmRhdGVwaWNrZXIuX2RhdGVwaWNrZXJTaG93aW5nJiYkLmRhdGVwaWNrZXIuX2hpZGVEYXRlcGlja2VyKCQuZGF0ZXBpY2tlci5fY3VySW5zdC5pbnB1dFswXSkpO3ZhciBjPSQuZGF0ZXBpY2tlci5fZ2V0KGIsImJlZm9yZVNob3ciKSxkPWM/Yy5hcHBseShhLFthLGJdKTp7fTtpZihkPT09ITEpcmV0dXJuO2V4dGVuZFJlbW92ZShiLnNldHRpbmdzLGQpLGIubGFzdFZhbD1udWxsLCQuZGF0ZXBpY2tlci5fbGFzdElucHV0PWEsJC5kYXRlcGlja2VyLl9zZXREYXRlRnJvbUZpZWxkKGIpLCQuZGF0ZXBpY2tlci5faW5EaWFsb2cmJihhLnZhbHVlPSIiKSwkLmRhdGVwaWNrZXIuX3Bvc3x8KCQuZGF0ZXBpY2tlci5fcG9zPSQuZGF0ZXBpY2tlci5fZmluZFBvcyhhKSwkLmRhdGVwaWNrZXIuX3Bvc1sxXSs9YS5vZmZzZXRIZWlnaHQpO3ZhciBlPSExOyQoYSkucGFyZW50cygpLmVhY2goZnVuY3Rpb24oKXtyZXR1cm4gZXw9JCh0aGlzKS5jc3MoInBvc2l0aW9uIik9PSJmaXhlZCIsIWV9KSxlJiYkLmJyb3dzZXIub3BlcmEmJigkLmRhdGVwaWNrZXIuX3Bvc1swXS09ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnQsJC5kYXRlcGlja2VyLl9wb3NbMV0tPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3ApO3ZhciBmPXtsZWZ0OiQuZGF0ZXBpY2tlci5fcG9zWzBdLHRvcDokLmRhdGVwaWNrZXIuX3Bvc1sxXX07JC5kYXRlcGlja2VyLl9wb3M9bnVsbCxiLmRwRGl2LmVtcHR5KCksYi5kcERpdi5jc3Moe3Bvc2l0aW9uOiJhYnNvbHV0ZSIsZGlzcGxheToiYmxvY2siLHRvcDoiLTEwMDBweCJ9KSwkLmRhdGVwaWNrZXIuX3VwZGF0ZURhdGVwaWNrZXIoYiksZj0kLmRhdGVwaWNrZXIuX2NoZWNrT2Zmc2V0KGIsZixlKSxiLmRwRGl2LmNzcyh7cG9zaXRpb246JC5kYXRlcGlja2VyLl9pbkRpYWxvZyYmJC5ibG9ja1VJPyJzdGF0aWMiOmU/ImZpeGVkIjoiYWJzb2x1dGUiLGRpc3BsYXk6Im5vbmUiLGxlZnQ6Zi5sZWZ0KyJweCIsdG9wOmYudG9wKyJweCJ9KTtpZighYi5pbmxpbmUpe3ZhciBnPSQuZGF0ZXBpY2tlci5fZ2V0KGIsInNob3dBbmltIiksaD0kLmRhdGVwaWNrZXIuX2dldChiLCJkdXJhdGlvbiIpLGk9ZnVuY3Rpb24oKXt2YXIgYT1iLmRwRGl2LmZpbmQoImlmcmFtZS51aS1kYXRlcGlja2VyLWNvdmVyIik7aWYoISFhLmxlbmd0aCl7dmFyIGM9JC5kYXRlcGlja2VyLl9nZXRCb3JkZXJzKGIuZHBEaXYpO2EuY3NzKHtsZWZ0Oi1jWzBdLHRvcDotY1sxXSx3aWR0aDpiLmRwRGl2Lm91dGVyV2lkdGgoKSxoZWlnaHQ6Yi5kcERpdi5vdXRlckhlaWdodCgpfSl9fTtiLmRwRGl2LnpJbmRleCgkKGEpLnpJbmRleCgpKzEpLCQuZGF0ZXBpY2tlci5fZGF0ZXBpY2tlclNob3dpbmc9ITAsJC5lZmZlY3RzJiYkLmVmZmVjdHNbZ10/Yi5kcERpdi5zaG93KGcsJC5kYXRlcGlja2VyLl9nZXQoYiwic2hvd09wdGlvbnMiKSxoLGkpOmIuZHBEaXZbZ3x8InNob3ciXShnP2g6bnVsbCxpKSwoIWd8fCFoKSYmaSgpLGIuaW5wdXQuaXMoIjp2aXNpYmxlIikmJiFiLmlucHV0LmlzKCI6ZGlzYWJsZWQiKSYmYi5pbnB1dC5mb2N1cygpLCQuZGF0ZXBpY2tlci5fY3VySW5zdD1ifX0sX3VwZGF0ZURhdGVwaWNrZXI6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcztiLm1heFJvd3M9NDt2YXIgYz0kLmRhdGVwaWNrZXIuX2dldEJvcmRlcnMoYS5kcERpdik7aW5zdEFjdGl2ZT1hLGEuZHBEaXYuZW1wdHkoKS5hcHBlbmQodGhpcy5fZ2VuZXJhdGVIVE1MKGEpKSx0aGlzLl9hdHRhY2hIYW5kbGVycyhhKTt2YXIgZD1hLmRwRGl2LmZpbmQoImlmcmFtZS51aS1kYXRlcGlja2VyLWNvdmVyIik7IWQubGVuZ3RofHxkLmNzcyh7bGVmdDotY1swXSx0b3A6LWNbMV0sd2lkdGg6YS5kcERpdi5vdXRlcldpZHRoKCksaGVpZ2h0OmEuZHBEaXYub3V0ZXJIZWlnaHQoKX0pLGEuZHBEaXYuZmluZCgiLiIrdGhpcy5fZGF5T3ZlckNsYXNzKyIgYSIpLm1vdXNlb3ZlcigpO3ZhciBlPXRoaXMuX2dldE51bWJlck9mTW9udGhzKGEpLGY9ZVsxXSxnPTE3O2EuZHBEaXYucmVtb3ZlQ2xhc3MoInVpLWRhdGVwaWNrZXItbXVsdGktMiB1aS1kYXRlcGlja2VyLW11bHRpLTMgdWktZGF0ZXBpY2tlci1tdWx0aS00Iikud2lkdGgoIiIpLGY+MSYmYS5kcERpdi5hZGRDbGFzcygidWktZGF0ZXBpY2tlci1tdWx0aS0iK2YpLmNzcygid2lkdGgiLGcqZisiZW0iKSxhLmRwRGl2WyhlWzBdIT0xfHxlWzFdIT0xPyJhZGQiOiJyZW1vdmUiKSsiQ2xhc3MiXSgidWktZGF0ZXBpY2tlci1tdWx0aSIpLGEuZHBEaXZbKHRoaXMuX2dldChhLCJpc1JUTCIpPyJhZGQiOiJyZW1vdmUiKSsiQ2xhc3MiXSgidWktZGF0ZXBpY2tlci1ydGwiKSxhPT0kLmRhdGVwaWNrZXIuX2N1ckluc3QmJiQuZGF0ZXBpY2tlci5fZGF0ZXBpY2tlclNob3dpbmcmJmEuaW5wdXQmJmEuaW5wdXQuaXMoIjp2aXNpYmxlIikmJiFhLmlucHV0LmlzKCI6ZGlzYWJsZWQiKSYmYS5pbnB1dFswXSE9ZG9jdW1lbnQuYWN0aXZlRWxlbWVudCYmYS5pbnB1dC5mb2N1cygpO2lmKGEueWVhcnNodG1sKXt2YXIgaD1hLnllYXJzaHRtbDtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7aD09PWEueWVhcnNodG1sJiZhLnllYXJzaHRtbCYmYS5kcERpdi5maW5kKCJzZWxlY3QudWktZGF0ZXBpY2tlci15ZWFyOmZpcnN0IikucmVwbGFjZVdpdGgoYS55ZWFyc2h0bWwpLGg9YS55ZWFyc2h0bWw9bnVsbH0sMCl9fSxfZ2V0Qm9yZGVyczpmdW5jdGlvbihhKXt2YXIgYj1mdW5jdGlvbihhKXtyZXR1cm57dGhpbjoxLG1lZGl1bToyLHRoaWNrOjN9W2FdfHxhfTtyZXR1cm5bcGFyc2VGbG9hdChiKGEuY3NzKCJib3JkZXItbGVmdC13aWR0aCIpKSkscGFyc2VGbG9hdChiKGEuY3NzKCJib3JkZXItdG9wLXdpZHRoIikpKV19LF9jaGVja09mZnNldDpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9YS5kcERpdi5vdXRlcldpZHRoKCksZT1hLmRwRGl2Lm91dGVySGVpZ2h0KCksZj1hLmlucHV0P2EuaW5wdXQub3V0ZXJXaWR0aCgpOjAsZz1hLmlucHV0P2EuaW5wdXQub3V0ZXJIZWlnaHQoKTowLGg9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKyhjPzA6JChkb2N1bWVudCkuc2Nyb2xsTGVmdCgpKSxpPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQrKGM/MDokKGRvY3VtZW50KS5zY3JvbGxUb3AoKSk7cmV0dXJuIGIubGVmdC09dGhpcy5fZ2V0KGEsImlzUlRMIik/ZC1mOjAsYi5sZWZ0LT1jJiZiLmxlZnQ9PWEuaW5wdXQub2Zmc2V0KCkubGVmdD8kKGRvY3VtZW50KS5zY3JvbGxMZWZ0KCk6MCxiLnRvcC09YyYmYi50b3A9PWEuaW5wdXQub2Zmc2V0KCkudG9wK2c/JChkb2N1bWVudCkuc2Nyb2xsVG9wKCk6MCxiLmxlZnQtPU1hdGgubWluKGIubGVmdCxiLmxlZnQrZD5oJiZoPmQ/TWF0aC5hYnMoYi5sZWZ0K2QtaCk6MCksYi50b3AtPU1hdGgubWluKGIudG9wLGIudG9wK2U+aSYmaT5lP01hdGguYWJzKGUrZyk6MCksYn0sX2ZpbmRQb3M6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5fZ2V0SW5zdChhKSxjPXRoaXMuX2dldChiLCJpc1JUTCIpO3doaWxlKGEmJihhLnR5cGU9PSJoaWRkZW4ifHxhLm5vZGVUeXBlIT0xfHwkLmV4cHIuZmlsdGVycy5oaWRkZW4oYSkpKWE9YVtjPyJwcmV2aW91c1NpYmxpbmciOiJuZXh0U2libGluZyJdO3ZhciBkPSQoYSkub2Zmc2V0KCk7cmV0dXJuW2QubGVmdCxkLnRvcF19LF9oaWRlRGF0ZXBpY2tlcjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLl9jdXJJbnN0O2lmKCFifHxhJiZiIT0kLmRhdGEoYSxQUk9QX05BTUUpKXJldHVybjtpZih0aGlzLl9kYXRlcGlja2VyU2hvd2luZyl7dmFyIGM9dGhpcy5fZ2V0KGIsInNob3dBbmltIiksZD10aGlzLl9nZXQoYiwiZHVyYXRpb24iKSxlPWZ1bmN0aW9uKCl7JC5kYXRlcGlja2VyLl90aWR5RGlhbG9nKGIpfTskLmVmZmVjdHMmJiQuZWZmZWN0c1tjXT9iLmRwRGl2LmhpZGUoYywkLmRhdGVwaWNrZXIuX2dldChiLCJzaG93T3B0aW9ucyIpLGQsZSk6Yi5kcERpdltjPT0ic2xpZGVEb3duIj8ic2xpZGVVcCI6Yz09ImZhZGVJbiI/ImZhZGVPdXQiOiJoaWRlIl0oYz9kOm51bGwsZSksY3x8ZSgpLHRoaXMuX2RhdGVwaWNrZXJTaG93aW5nPSExO3ZhciBmPXRoaXMuX2dldChiLCJvbkNsb3NlIik7ZiYmZi5hcHBseShiLmlucHV0P2IuaW5wdXRbMF06bnVsbCxbYi5pbnB1dD9iLmlucHV0LnZhbCgpOiIiLGJdKSx0aGlzLl9sYXN0SW5wdXQ9bnVsbCx0aGlzLl9pbkRpYWxvZyYmKHRoaXMuX2RpYWxvZ0lucHV0LmNzcyh7cG9zaXRpb246ImFic29sdXRlIixsZWZ0OiIwIix0b3A6Ii0xMDBweCJ9KSwkLmJsb2NrVUkmJigkLnVuYmxvY2tVSSgpLCQoImJvZHkiKS5hcHBlbmQodGhpcy5kcERpdikpKSx0aGlzLl9pbkRpYWxvZz0hMX19LF90aWR5RGlhbG9nOmZ1bmN0aW9uKGEpe2EuZHBEaXYucmVtb3ZlQ2xhc3ModGhpcy5fZGlhbG9nQ2xhc3MpLnVuYmluZCgiLnVpLWRhdGVwaWNrZXItY2FsZW5kYXIiKX0sX2NoZWNrRXh0ZXJuYWxDbGljazpmdW5jdGlvbihhKXtpZighJC5kYXRlcGlja2VyLl9jdXJJbnN0KXJldHVybjt2YXIgYj0kKGEudGFyZ2V0KSxjPSQuZGF0ZXBpY2tlci5fZ2V0SW5zdChiWzBdKTsoYlswXS5pZCE9JC5kYXRlcGlja2VyLl9tYWluRGl2SWQmJmIucGFyZW50cygiIyIrJC5kYXRlcGlja2VyLl9tYWluRGl2SWQpLmxlbmd0aD09MCYmIWIuaGFzQ2xhc3MoJC5kYXRlcGlja2VyLm1hcmtlckNsYXNzTmFtZSkmJiFiLmNsb3Nlc3QoIi4iKyQuZGF0ZXBpY2tlci5fdHJpZ2dlckNsYXNzKS5sZW5ndGgmJiQuZGF0ZXBpY2tlci5fZGF0ZXBpY2tlclNob3dpbmcmJighJC5kYXRlcGlja2VyLl9pbkRpYWxvZ3x8ISQuYmxvY2tVSSl8fGIuaGFzQ2xhc3MoJC5kYXRlcGlja2VyLm1hcmtlckNsYXNzTmFtZSkmJiQuZGF0ZXBpY2tlci5fY3VySW5zdCE9YykmJiQuZGF0ZXBpY2tlci5faGlkZURhdGVwaWNrZXIoKX0sX2FkanVzdERhdGU6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPSQoYSksZT10aGlzLl9nZXRJbnN0KGRbMF0pO2lmKHRoaXMuX2lzRGlzYWJsZWREYXRlcGlja2VyKGRbMF0pKXJldHVybjt0aGlzLl9hZGp1c3RJbnN0RGF0ZShlLGIrKGM9PSJNIj90aGlzLl9nZXQoZSwic2hvd0N1cnJlbnRBdFBvcyIpOjApLGMpLHRoaXMuX3VwZGF0ZURhdGVwaWNrZXIoZSl9LF9nb3RvVG9kYXk6ZnVuY3Rpb24oYSl7dmFyIGI9JChhKSxjPXRoaXMuX2dldEluc3QoYlswXSk7aWYodGhpcy5fZ2V0KGMsImdvdG9DdXJyZW50IikmJmMuY3VycmVudERheSljLnNlbGVjdGVkRGF5PWMuY3VycmVudERheSxjLmRyYXdNb250aD1jLnNlbGVjdGVkTW9udGg9Yy5jdXJyZW50TW9udGgsYy5kcmF3WWVhcj1jLnNlbGVjdGVkWWVhcj1jLmN1cnJlbnRZZWFyO2Vsc2V7dmFyIGQ9bmV3IERhdGU7Yy5zZWxlY3RlZERheT1kLmdldERhdGUoKSxjLmRyYXdNb250aD1jLnNlbGVjdGVkTW9udGg9ZC5nZXRNb250aCgpLGMuZHJhd1llYXI9Yy5zZWxlY3RlZFllYXI9ZC5nZXRGdWxsWWVhcigpfXRoaXMuX25vdGlmeUNoYW5nZShjKSx0aGlzLl9hZGp1c3REYXRlKGIpfSxfc2VsZWN0TW9udGhZZWFyOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD0kKGEpLGU9dGhpcy5fZ2V0SW5zdChkWzBdKTtlWyJzZWxlY3RlZCIrKGM9PSJNIj8iTW9udGgiOiJZZWFyIildPWVbImRyYXciKyhjPT0iTSI/Ik1vbnRoIjoiWWVhciIpXT1wYXJzZUludChiLm9wdGlvbnNbYi5zZWxlY3RlZEluZGV4XS52YWx1ZSwxMCksdGhpcy5fbm90aWZ5Q2hhbmdlKGUpLHRoaXMuX2FkanVzdERhdGUoZCl9LF9zZWxlY3REYXk6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9JChhKTtpZigkKGQpLmhhc0NsYXNzKHRoaXMuX3Vuc2VsZWN0YWJsZUNsYXNzKXx8dGhpcy5faXNEaXNhYmxlZERhdGVwaWNrZXIoZVswXSkpcmV0dXJuO3ZhciBmPXRoaXMuX2dldEluc3QoZVswXSk7Zi5zZWxlY3RlZERheT1mLmN1cnJlbnREYXk9JCgiYSIsZCkuaHRtbCgpLGYuc2VsZWN0ZWRNb250aD1mLmN1cnJlbnRNb250aD1iLGYuc2VsZWN0ZWRZZWFyPWYuY3VycmVudFllYXI9Yyx0aGlzLl9zZWxlY3REYXRlKGEsdGhpcy5fZm9ybWF0RGF0ZShmLGYuY3VycmVudERheSxmLmN1cnJlbnRNb250aCxmLmN1cnJlbnRZZWFyKSl9LF9jbGVhckRhdGU6ZnVuY3Rpb24oYSl7dmFyIGI9JChhKSxjPXRoaXMuX2dldEluc3QoYlswXSk7dGhpcy5fc2VsZWN0RGF0ZShiLCIiKX0sX3NlbGVjdERhdGU6ZnVuY3Rpb24oYSxiKXt2YXIgYz0kKGEpLGQ9dGhpcy5fZ2V0SW5zdChjWzBdKTtiPWIhPW51bGw/Yjp0aGlzLl9mb3JtYXREYXRlKGQpLGQuaW5wdXQmJmQuaW5wdXQudmFsKGIpLHRoaXMuX3VwZGF0ZUFsdGVybmF0ZShkKTt2YXIgZT10aGlzLl9nZXQoZCwib25TZWxlY3QiKTtlP2UuYXBwbHkoZC5pbnB1dD9kLmlucHV0WzBdOm51bGwsW2IsZF0pOmQuaW5wdXQmJmQuaW5wdXQudHJpZ2dlcigiY2hhbmdlIiksZC5pbmxpbmU/dGhpcy5fdXBkYXRlRGF0ZXBpY2tlcihkKToodGhpcy5faGlkZURhdGVwaWNrZXIoKSx0aGlzLl9sYXN0SW5wdXQ9ZC5pbnB1dFswXSx0eXBlb2YgZC5pbnB1dFswXSE9Im9iamVjdCImJmQuaW5wdXQuZm9jdXMoKSx0aGlzLl9sYXN0SW5wdXQ9bnVsbCl9LF91cGRhdGVBbHRlcm5hdGU6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5fZ2V0KGEsImFsdEZpZWxkIik7aWYoYil7dmFyIGM9dGhpcy5fZ2V0KGEsImFsdEZvcm1hdCIpfHx0aGlzLl9nZXQoYSwiZGF0ZUZvcm1hdCIpLGQ9dGhpcy5fZ2V0RGF0ZShhKSxlPXRoaXMuZm9ybWF0RGF0ZShjLGQsdGhpcy5fZ2V0Rm9ybWF0Q29uZmlnKGEpKTskKGIpLmVhY2goZnVuY3Rpb24oKXskKHRoaXMpLnZhbChlKX0pfX0sbm9XZWVrZW5kczpmdW5jdGlvbihhKXt2YXIgYj1hLmdldERheSgpO3JldHVybltiPjAmJmI8NiwiIl19LGlzbzg2MDFXZWVrOmZ1bmN0aW9uKGEpe3ZhciBiPW5ldyBEYXRlKGEuZ2V0VGltZSgpKTtiLnNldERhdGUoYi5nZXREYXRlKCkrNC0oYi5nZXREYXkoKXx8NykpO3ZhciBjPWIuZ2V0VGltZSgpO3JldHVybiBiLnNldE1vbnRoKDApLGIuc2V0RGF0ZSgxKSxNYXRoLmZsb29yKE1hdGgucm91bmQoKGMtYikvODY0ZTUpLzcpKzF9LHBhcnNlRGF0ZTpmdW5jdGlvbihhLGIsYyl7aWYoYT09bnVsbHx8Yj09bnVsbCl0aHJvdyJJbnZhbGlkIGFyZ3VtZW50cyI7Yj10eXBlb2YgYj09Im9iamVjdCI/Yi50b1N0cmluZygpOmIrIiI7aWYoYj09IiIpcmV0dXJuIG51bGw7dmFyIGQ9KGM/Yy5zaG9ydFllYXJDdXRvZmY6bnVsbCl8fHRoaXMuX2RlZmF1bHRzLnNob3J0WWVhckN1dG9mZjtkPXR5cGVvZiBkIT0ic3RyaW5nIj9kOihuZXcgRGF0ZSkuZ2V0RnVsbFllYXIoKSUxMDArcGFyc2VJbnQoZCwxMCk7dmFyIGU9KGM/Yy5kYXlOYW1lc1Nob3J0Om51bGwpfHx0aGlzLl9kZWZhdWx0cy5kYXlOYW1lc1Nob3J0LGY9KGM/Yy5kYXlOYW1lczpudWxsKXx8dGhpcy5fZGVmYXVsdHMuZGF5TmFtZXMsZz0oYz9jLm1vbnRoTmFtZXNTaG9ydDpudWxsKXx8dGhpcy5fZGVmYXVsdHMubW9udGhOYW1lc1Nob3J0LGg9KGM/Yy5tb250aE5hbWVzOm51bGwpfHx0aGlzLl9kZWZhdWx0cy5tb250aE5hbWVzLGk9LTEsaj0tMSxrPS0xLGw9LTEsbT0hMSxuPWZ1bmN0aW9uKGIpe3ZhciBjPXMrMTxhLmxlbmd0aCYmYS5jaGFyQXQocysxKT09YjtyZXR1cm4gYyYmcysrLGN9LG89ZnVuY3Rpb24oYSl7dmFyIGM9bihhKSxkPWE9PSJAIj8xNDphPT0iISI/MjA6YT09InkiJiZjPzQ6YT09Im8iPzM6MixlPW5ldyBSZWdFeHAoIl5cXGR7MSwiK2QrIn0iKSxmPWIuc3Vic3RyaW5nKHIpLm1hdGNoKGUpO2lmKCFmKXRocm93Ik1pc3NpbmcgbnVtYmVyIGF0IHBvc2l0aW9uICIrcjtyZXR1cm4gcis9ZlswXS5sZW5ndGgscGFyc2VJbnQoZlswXSwxMCl9LHA9ZnVuY3Rpb24oYSxjLGQpe3ZhciBlPSQubWFwKG4oYSk/ZDpjLGZ1bmN0aW9uKGEsYil7cmV0dXJuW1tiLGFdXX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4tKGFbMV0ubGVuZ3RoLWJbMV0ubGVuZ3RoKX0pLGY9LTE7JC5lYWNoKGUsZnVuY3Rpb24oYSxjKXt2YXIgZD1jWzFdO2lmKGIuc3Vic3RyKHIsZC5sZW5ndGgpLnRvTG93ZXJDYXNlKCk9PWQudG9Mb3dlckNhc2UoKSlyZXR1cm4gZj1jWzBdLHIrPWQubGVuZ3RoLCExfSk7aWYoZiE9LTEpcmV0dXJuIGYrMTt0aHJvdyJVbmtub3duIG5hbWUgYXQgcG9zaXRpb24gIityfSxxPWZ1bmN0aW9uKCl7aWYoYi5jaGFyQXQocikhPWEuY2hhckF0KHMpKXRocm93IlVuZXhwZWN0ZWQgbGl0ZXJhbCBhdCBwb3NpdGlvbiAiK3I7cisrfSxyPTA7Zm9yKHZhciBzPTA7czxhLmxlbmd0aDtzKyspaWYobSlhLmNoYXJBdChzKT09IiciJiYhbigiJyIpP209ITE6cSgpO2Vsc2Ugc3dpdGNoKGEuY2hhckF0KHMpKXtjYXNlImQiOms9bygiZCIpO2JyZWFrO2Nhc2UiRCI6cCgiRCIsZSxmKTticmVhaztjYXNlIm8iOmw9bygibyIpO2JyZWFrO2Nhc2UibSI6aj1vKCJtIik7YnJlYWs7Y2FzZSJNIjpqPXAoIk0iLGcsaCk7YnJlYWs7Y2FzZSJ5IjppPW8oInkiKTticmVhaztjYXNlIkAiOnZhciB0PW5ldyBEYXRlKG8oIkAiKSk7aT10LmdldEZ1bGxZZWFyKCksaj10LmdldE1vbnRoKCkrMSxrPXQuZ2V0RGF0ZSgpO2JyZWFrO2Nhc2UiISI6dmFyIHQ9bmV3IERhdGUoKG8oIiEiKS10aGlzLl90aWNrc1RvMTk3MCkvMWU0KTtpPXQuZ2V0RnVsbFllYXIoKSxqPXQuZ2V0TW9udGgoKSsxLGs9dC5nZXREYXRlKCk7YnJlYWs7Y2FzZSInIjpuKCInIik/cSgpOm09ITA7YnJlYWs7ZGVmYXVsdDpxKCl9aWYocjxiLmxlbmd0aCl0aHJvdyJFeHRyYS91bnBhcnNlZCBjaGFyYWN0ZXJzIGZvdW5kIGluIGRhdGU6ICIrYi5zdWJzdHJpbmcocik7aT09LTE/aT0obmV3IERhdGUpLmdldEZ1bGxZZWFyKCk6aTwxMDAmJihpKz0obmV3IERhdGUpLmdldEZ1bGxZZWFyKCktKG5ldyBEYXRlKS5nZXRGdWxsWWVhcigpJTEwMCsoaTw9ZD8wOi0xMDApKTtpZihsPi0xKXtqPTEsaz1sO2Rve3ZhciB1PXRoaXMuX2dldERheXNJbk1vbnRoKGksai0xKTtpZihrPD11KWJyZWFrO2orKyxrLT11fXdoaWxlKCEwKX12YXIgdD10aGlzLl9kYXlsaWdodFNhdmluZ0FkanVzdChuZXcgRGF0ZShpLGotMSxrKSk7aWYodC5nZXRGdWxsWWVhcigpIT1pfHx0LmdldE1vbnRoKCkrMSE9anx8dC5nZXREYXRlKCkhPWspdGhyb3ciSW52YWxpZCBkYXRlIjtyZXR1cm4gdH0sQVRPTToieXktbW0tZGQiLENPT0tJRToiRCwgZGQgTSB5eSIsSVNPXzg2MDE6Inl5LW1tLWRkIixSRkNfODIyOiJELCBkIE0geSIsUkZDXzg1MDoiREQsIGRkLU0teSIsUkZDXzEwMzY6IkQsIGQgTSB5IixSRkNfMTEyMzoiRCwgZCBNIHl5IixSRkNfMjgyMjoiRCwgZCBNIHl5IixSU1M6IkQsIGQgTSB5IixUSUNLUzoiISIsVElNRVNUQU1QOiJAIixXM0M6Inl5LW1tLWRkIixfdGlja3NUbzE5NzA6KDcxODY4NStNYXRoLmZsb29yKDQ5Mi41KS1NYXRoLmZsb29yKDE5LjcpK01hdGguZmxvb3IoNC45MjUpKSoyNCo2MCo2MCoxZTcsZm9ybWF0RGF0ZTpmdW5jdGlvbihhLGIsYyl7aWYoIWIpcmV0dXJuIiI7dmFyIGQ9KGM/Yy5kYXlOYW1lc1Nob3J0Om51bGwpfHx0aGlzLl9kZWZhdWx0cy5kYXlOYW1lc1Nob3J0LGU9KGM/Yy5kYXlOYW1lczpudWxsKXx8dGhpcy5fZGVmYXVsdHMuZGF5TmFtZXMsZj0oYz9jLm1vbnRoTmFtZXNTaG9ydDpudWxsKXx8dGhpcy5fZGVmYXVsdHMubW9udGhOYW1lc1Nob3J0LGc9KGM/Yy5tb250aE5hbWVzOm51bGwpfHx0aGlzLl9kZWZhdWx0cy5tb250aE5hbWVzLGg9ZnVuY3Rpb24oYil7dmFyIGM9bSsxPGEubGVuZ3RoJiZhLmNoYXJBdChtKzEpPT1iO3JldHVybiBjJiZtKyssY30saT1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9IiIrYjtpZihoKGEpKXdoaWxlKGQubGVuZ3RoPGMpZD0iMCIrZDtyZXR1cm4gZH0saj1mdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gaChhKT9kW2JdOmNbYl19LGs9IiIsbD0hMTtpZihiKWZvcih2YXIgbT0wO208YS5sZW5ndGg7bSsrKWlmKGwpYS5jaGFyQXQobSk9PSInIiYmIWgoIiciKT9sPSExOmsrPWEuY2hhckF0KG0pO2Vsc2Ugc3dpdGNoKGEuY2hhckF0KG0pKXtjYXNlImQiOmsrPWkoImQiLGIuZ2V0RGF0ZSgpLDIpO2JyZWFrO2Nhc2UiRCI6ays9aigiRCIsYi5nZXREYXkoKSxkLGUpO2JyZWFrO2Nhc2UibyI6ays9aSgibyIsTWF0aC5yb3VuZCgoKG5ldyBEYXRlKGIuZ2V0RnVsbFllYXIoKSxiLmdldE1vbnRoKCksYi5nZXREYXRlKCkpKS5nZXRUaW1lKCktKG5ldyBEYXRlKGIuZ2V0RnVsbFllYXIoKSwwLDApKS5nZXRUaW1lKCkpLzg2NGU1KSwzKTticmVhaztjYXNlIm0iOmsrPWkoIm0iLGIuZ2V0TW9udGgoKSsxLDIpO2JyZWFrO2Nhc2UiTSI6ays9aigiTSIsYi5nZXRNb250aCgpLGYsZyk7YnJlYWs7Y2FzZSJ5IjprKz1oKCJ5Iik/Yi5nZXRGdWxsWWVhcigpOihiLmdldFllYXIoKSUxMDA8MTA/IjAiOiIiKStiLmdldFllYXIoKSUxMDA7YnJlYWs7Y2FzZSJAIjprKz1iLmdldFRpbWUoKTticmVhaztjYXNlIiEiOmsrPWIuZ2V0VGltZSgpKjFlNCt0aGlzLl90aWNrc1RvMTk3MDticmVhaztjYXNlIiciOmgoIiciKT9rKz0iJyI6bD0hMDticmVhaztkZWZhdWx0OmsrPWEuY2hhckF0KG0pfXJldHVybiBrfSxfcG9zc2libGVDaGFyczpmdW5jdGlvbihhKXt2YXIgYj0iIixjPSExLGQ9ZnVuY3Rpb24oYil7dmFyIGM9ZSsxPGEubGVuZ3RoJiZhLmNoYXJBdChlKzEpPT1iO3JldHVybiBjJiZlKyssY307Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspaWYoYylhLmNoYXJBdChlKT09IiciJiYhZCgiJyIpP2M9ITE6Yis9YS5jaGFyQXQoZSk7ZWxzZSBzd2l0Y2goYS5jaGFyQXQoZSkpe2Nhc2UiZCI6Y2FzZSJtIjpjYXNlInkiOmNhc2UiQCI6Yis9IjAxMjM0NTY3ODkiO2JyZWFrO2Nhc2UiRCI6Y2FzZSJNIjpyZXR1cm4gbnVsbDtjYXNlIiciOmQoIiciKT9iKz0iJyI6Yz0hMDticmVhaztkZWZhdWx0OmIrPWEuY2hhckF0KGUpfXJldHVybiBifSxfZ2V0OmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuc2V0dGluZ3NbYl0hPT11bmRlZmluZWQ/YS5zZXR0aW5nc1tiXTp0aGlzLl9kZWZhdWx0c1tiXX0sX3NldERhdGVGcm9tRmllbGQ6ZnVuY3Rpb24oYSxiKXtpZihhLmlucHV0LnZhbCgpPT1hLmxhc3RWYWwpcmV0dXJuO3ZhciBjPXRoaXMuX2dldChhLCJkYXRlRm9ybWF0IiksZD1hLmxhc3RWYWw9YS5pbnB1dD9hLmlucHV0LnZhbCgpOm51bGwsZSxmO2U9Zj10aGlzLl9nZXREZWZhdWx0RGF0ZShhKTt2YXIgZz10aGlzLl9nZXRGb3JtYXRDb25maWcoYSk7dHJ5e2U9dGhpcy5wYXJzZURhdGUoYyxkLGcpfHxmfWNhdGNoKGgpe3RoaXMubG9nKGgpLGQ9Yj8iIjpkfWEuc2VsZWN0ZWREYXk9ZS5nZXREYXRlKCksYS5kcmF3TW9udGg9YS5zZWxlY3RlZE1vbnRoPWUuZ2V0TW9udGgoKSxhLmRyYXdZZWFyPWEuc2VsZWN0ZWRZZWFyPWUuZ2V0RnVsbFllYXIoKSxhLmN1cnJlbnREYXk9ZD9lLmdldERhdGUoKTowLGEuY3VycmVudE1vbnRoPWQ/ZS5nZXRNb250aCgpOjAsYS5jdXJyZW50WWVhcj1kP2UuZ2V0RnVsbFllYXIoKTowLHRoaXMuX2FkanVzdEluc3REYXRlKGEpfSxfZ2V0RGVmYXVsdERhdGU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuX3Jlc3RyaWN0TWluTWF4KGEsdGhpcy5fZGV0ZXJtaW5lRGF0ZShhLHRoaXMuX2dldChhLCJkZWZhdWx0RGF0ZSIpLG5ldyBEYXRlKSl9LF9kZXRlcm1pbmVEYXRlOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD1mdW5jdGlvbihhKXt2YXIgYj1uZXcgRGF0ZTtyZXR1cm4gYi5zZXREYXRlKGIuZ2V0RGF0ZSgpK2EpLGJ9LGU9ZnVuY3Rpb24oYil7dHJ5e3JldHVybiAkLmRhdGVwaWNrZXIucGFyc2VEYXRlKCQuZGF0ZXBpY2tlci5fZ2V0KGEsImRhdGVGb3JtYXQiKSxiLCQuZGF0ZXBpY2tlci5fZ2V0Rm9ybWF0Q29uZmlnKGEpKX1jYXRjaChjKXt9dmFyIGQ9KGIudG9Mb3dlckNhc2UoKS5tYXRjaCgvXmMvKT8kLmRhdGVwaWNrZXIuX2dldERhdGUoYSk6bnVsbCl8fG5ldyBEYXRlLGU9ZC5nZXRGdWxsWWVhcigpLGY9ZC5nZXRNb250aCgpLGc9ZC5nZXREYXRlKCksaD0vKFsrLV0/WzAtOV0rKVxzKihkfER8d3xXfG18TXx5fFkpPy9nLGk9aC5leGVjKGIpO3doaWxlKGkpe3N3aXRjaChpWzJdfHwiZCIpe2Nhc2UiZCI6Y2FzZSJEIjpnKz1wYXJzZUludChpWzFdLDEwKTticmVhaztjYXNlInciOmNhc2UiVyI6Zys9cGFyc2VJbnQoaVsxXSwxMCkqNzticmVhaztjYXNlIm0iOmNhc2UiTSI6Zis9cGFyc2VJbnQoaVsxXSwxMCksZz1NYXRoLm1pbihnLCQuZGF0ZXBpY2tlci5fZ2V0RGF5c0luTW9udGgoZSxmKSk7YnJlYWs7Y2FzZSJ5IjpjYXNlIlkiOmUrPXBhcnNlSW50KGlbMV0sMTApLGc9TWF0aC5taW4oZywkLmRhdGVwaWNrZXIuX2dldERheXNJbk1vbnRoKGUsZikpfWk9aC5leGVjKGIpfXJldHVybiBuZXcgRGF0ZShlLGYsZyl9LGY9Yj09bnVsbHx8Yj09PSIiP2M6dHlwZW9mIGI9PSJzdHJpbmciP2UoYik6dHlwZW9mIGI9PSJudW1iZXIiP2lzTmFOKGIpP2M6ZChiKTpuZXcgRGF0ZShiLmdldFRpbWUoKSk7cmV0dXJuIGY9ZiYmZi50b1N0cmluZygpPT0iSW52YWxpZCBEYXRlIj9jOmYsZiYmKGYuc2V0SG91cnMoMCksZi5zZXRNaW51dGVzKDApLGYuc2V0U2Vjb25kcygwKSxmLnNldE1pbGxpc2Vjb25kcygwKSksdGhpcy5fZGF5bGlnaHRTYXZpbmdBZGp1c3QoZil9LF9kYXlsaWdodFNhdmluZ0FkanVzdDpmdW5jdGlvbihhKXtyZXR1cm4gYT8oYS5zZXRIb3VycyhhLmdldEhvdXJzKCk+MTI/YS5nZXRIb3VycygpKzI6MCksYSk6bnVsbH0sX3NldERhdGU6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPSFiLGU9YS5zZWxlY3RlZE1vbnRoLGY9YS5zZWxlY3RlZFllYXIsZz10aGlzLl9yZXN0cmljdE1pbk1heChhLHRoaXMuX2RldGVybWluZURhdGUoYSxiLG5ldyBEYXRlKSk7YS5zZWxlY3RlZERheT1hLmN1cnJlbnREYXk9Zy5nZXREYXRlKCksYS5kcmF3TW9udGg9YS5zZWxlY3RlZE1vbnRoPWEuY3VycmVudE1vbnRoPWcuZ2V0TW9udGgoKSxhLmRyYXdZZWFyPWEuc2VsZWN0ZWRZZWFyPWEuY3VycmVudFllYXI9Zy5nZXRGdWxsWWVhcigpLChlIT1hLnNlbGVjdGVkTW9udGh8fGYhPWEuc2VsZWN0ZWRZZWFyKSYmIWMmJnRoaXMuX25vdGlmeUNoYW5nZShhKSx0aGlzLl9hZGp1c3RJbnN0RGF0ZShhKSxhLmlucHV0JiZhLmlucHV0LnZhbChkPyIiOnRoaXMuX2Zvcm1hdERhdGUoYSkpfSxfZ2V0RGF0ZTpmdW5jdGlvbihhKXt2YXIgYj0hYS5jdXJyZW50WWVhcnx8YS5pbnB1dCYmYS5pbnB1dC52YWwoKT09IiI/bnVsbDp0aGlzLl9kYXlsaWdodFNhdmluZ0FkanVzdChuZXcgRGF0ZShhLmN1cnJlbnRZZWFyLGEuY3VycmVudE1vbnRoLGEuY3VycmVudERheSkpO3JldHVybiBifSxfYXR0YWNoSGFuZGxlcnM6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5fZ2V0KGEsInN0ZXBNb250aHMiKSxjPSIjIithLmlkLnJlcGxhY2UoL1xcXFwvZywiXFwiKTthLmRwRGl2LmZpbmQoIltkYXRhLWhhbmRsZXJdIikubWFwKGZ1bmN0aW9uKCl7dmFyIGE9e3ByZXY6ZnVuY3Rpb24oKXt3aW5kb3dbIkRQX2pRdWVyeV8iK2RwdXVpZF0uZGF0ZXBpY2tlci5fYWRqdXN0RGF0ZShjLC1iLCJNIil9LG5leHQ6ZnVuY3Rpb24oKXt3aW5kb3dbIkRQX2pRdWVyeV8iK2RwdXVpZF0uZGF0ZXBpY2tlci5fYWRqdXN0RGF0ZShjLCtiLCJNIil9LGhpZGU6ZnVuY3Rpb24oKXt3aW5kb3dbIkRQX2pRdWVyeV8iK2RwdXVpZF0uZGF0ZXBpY2tlci5faGlkZURhdGVwaWNrZXIoKX0sdG9kYXk6ZnVuY3Rpb24oKXt3aW5kb3dbIkRQX2pRdWVyeV8iK2RwdXVpZF0uZGF0ZXBpY2tlci5fZ290b1RvZGF5KGMpfSxzZWxlY3REYXk6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93WyJEUF9qUXVlcnlfIitkcHV1aWRdLmRhdGVwaWNrZXIuX3NlbGVjdERheShjLCt0aGlzLmdldEF0dHJpYnV0ZSgiZGF0YS1tb250aCIpLCt0aGlzLmdldEF0dHJpYnV0ZSgiZGF0YS15ZWFyIiksdGhpcyksITF9LHNlbGVjdE1vbnRoOmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvd1siRFBfalF1ZXJ5XyIrZHB1dWlkXS5kYXRlcGlja2VyLl9zZWxlY3RNb250aFllYXIoYyx0aGlzLCJNIiksITF9LHNlbGVjdFllYXI6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93WyJEUF9qUXVlcnlfIitkcHV1aWRdLmRhdGVwaWNrZXIuX3NlbGVjdE1vbnRoWWVhcihjLHRoaXMsIlkiKSwhMX19OyQodGhpcykuYmluZCh0aGlzLmdldEF0dHJpYnV0ZSgiZGF0YS1ldmVudCIpLGFbdGhpcy5nZXRBdHRyaWJ1dGUoImRhdGEtaGFuZGxlciIpXSl9KX0sX2dlbmVyYXRlSFRNTDpmdW5jdGlvbihhKXt2YXIgYj1uZXcgRGF0ZTtiPXRoaXMuX2RheWxpZ2h0U2F2aW5nQWRqdXN0KG5ldyBEYXRlKGIuZ2V0RnVsbFllYXIoKSxiLmdldE1vbnRoKCksYi5nZXREYXRlKCkpKTt2YXIgYz10aGlzLl9nZXQoYSwiaXNSVEwiKSxkPXRoaXMuX2dldChhLCJzaG93QnV0dG9uUGFuZWwiKSxlPXRoaXMuX2dldChhLCJoaWRlSWZOb1ByZXZOZXh0IiksZj10aGlzLl9nZXQoYSwibmF2aWdhdGlvbkFzRGF0ZUZvcm1hdCIpLGc9dGhpcy5fZ2V0TnVtYmVyT2ZNb250aHMoYSksaD10aGlzLl9nZXQoYSwic2hvd0N1cnJlbnRBdFBvcyIpLGk9dGhpcy5fZ2V0KGEsInN0ZXBNb250aHMiKSxqPWdbMF0hPTF8fGdbMV0hPTEsaz10aGlzLl9kYXlsaWdodFNhdmluZ0FkanVzdChhLmN1cnJlbnREYXk/bmV3IERhdGUoYS5jdXJyZW50WWVhcixhLmN1cnJlbnRNb250aCxhLmN1cnJlbnREYXkpOm5ldyBEYXRlKDk5OTksOSw5KSksbD10aGlzLl9nZXRNaW5NYXhEYXRlKGEsIm1pbiIpLG09dGhpcy5fZ2V0TWluTWF4RGF0ZShhLCJtYXgiKSxuPWEuZHJhd01vbnRoLWgsbz1hLmRyYXdZZWFyO248MCYmKG4rPTEyLG8tLSk7aWYobSl7dmFyIHA9dGhpcy5fZGF5bGlnaHRTYXZpbmdBZGp1c3QobmV3IERhdGUobS5nZXRGdWxsWWVhcigpLG0uZ2V0TW9udGgoKS1nWzBdKmdbMV0rMSxtLmdldERhdGUoKSkpO3A9bCYmcDxsP2w6cDt3aGlsZSh0aGlzLl9kYXlsaWdodFNhdmluZ0FkanVzdChuZXcgRGF0ZShvLG4sMSkpPnApbi0tLG48MCYmKG49MTEsby0tKX1hLmRyYXdNb250aD1uLGEuZHJhd1llYXI9bzt2YXIgcT10aGlzLl9nZXQoYSwicHJldlRleHQiKTtxPWY/dGhpcy5mb3JtYXREYXRlKHEsdGhpcy5fZGF5bGlnaHRTYXZpbmdBZGp1c3QobmV3IERhdGUobyxuLWksMSkpLHRoaXMuX2dldEZvcm1hdENvbmZpZyhhKSk6cTt2YXIgcj10aGlzLl9jYW5BZGp1c3RNb250aChhLC0xLG8sbik/JzxhIGNsYXNzPSJ1aS1kYXRlcGlja2VyLXByZXYgdWktY29ybmVyLWFsbCIgZGF0YS1oYW5kbGVyPSJwcmV2IiBkYXRhLWV2ZW50PSJjbGljayIgdGl0bGU9IicrcSsnIj48c3BhbiBjbGFzcz0idWktaWNvbiB1aS1pY29uLWNpcmNsZS10cmlhbmdsZS0nKyhjPyJlIjoidyIpKyciPicrcSsiPC9zcGFuPjwvYT4iOmU/IiI6JzxhIGNsYXNzPSJ1aS1kYXRlcGlja2VyLXByZXYgdWktY29ybmVyLWFsbCB1aS1zdGF0ZS1kaXNhYmxlZCIgdGl0bGU9IicrcSsnIj48c3BhbiBjbGFzcz0idWktaWNvbiB1aS1pY29uLWNpcmNsZS10cmlhbmdsZS0nKyhjPyJlIjoidyIpKyciPicrcSsiPC9zcGFuPjwvYT4iLHM9dGhpcy5fZ2V0KGEsIm5leHRUZXh0Iik7cz1mP3RoaXMuZm9ybWF0RGF0ZShzLHRoaXMuX2RheWxpZ2h0U2F2aW5nQWRqdXN0KG5ldyBEYXRlKG8sbitpLDEpKSx0aGlzLl9nZXRGb3JtYXRDb25maWcoYSkpOnM7dmFyIHQ9dGhpcy5fY2FuQWRqdXN0TW9udGgoYSwxLG8sbik/JzxhIGNsYXNzPSJ1aS1kYXRlcGlja2VyLW5leHQgdWktY29ybmVyLWFsbCIgZGF0YS1oYW5kbGVyPSJuZXh0IiBkYXRhLWV2ZW50PSJjbGljayIgdGl0bGU9IicrcysnIj48c3BhbiBjbGFzcz0idWktaWNvbiB1aS1pY29uLWNpcmNsZS10cmlhbmdsZS0nKyhjPyJ3IjoiZSIpKyciPicrcysiPC9zcGFuPjwvYT4iOmU/IiI6JzxhIGNsYXNzPSJ1aS1kYXRlcGlja2VyLW5leHQgdWktY29ybmVyLWFsbCB1aS1zdGF0ZS1kaXNhYmxlZCIgdGl0bGU9IicrcysnIj48c3BhbiBjbGFzcz0idWktaWNvbiB1aS1pY29uLWNpcmNsZS10cmlhbmdsZS0nKyhjPyJ3IjoiZSIpKyciPicrcysiPC9zcGFuPjwvYT4iLHU9dGhpcy5fZ2V0KGEsImN1cnJlbnRUZXh0Iiksdj10aGlzLl9nZXQoYSwiZ290b0N1cnJlbnQiKSYmYS5jdXJyZW50RGF5P2s6Yjt1PWY/dGhpcy5mb3JtYXREYXRlKHUsdix0aGlzLl9nZXRGb3JtYXRDb25maWcoYSkpOnU7dmFyIHc9YS5pbmxpbmU/IiI6JzxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0idWktZGF0ZXBpY2tlci1jbG9zZSB1aS1zdGF0ZS1kZWZhdWx0IHVpLXByaW9yaXR5LXByaW1hcnkgdWktY29ybmVyLWFsbCIgZGF0YS1oYW5kbGVyPSJoaWRlIiBkYXRhLWV2ZW50PSJjbGljayI+Jyt0aGlzLl9nZXQoYSwiY2xvc2VUZXh0IikrIjwvYnV0dG9uPiIseD1kPyc8ZGl2IGNsYXNzPSJ1aS1kYXRlcGlja2VyLWJ1dHRvbnBhbmUgdWktd2lkZ2V0LWNvbnRlbnQiPicrKGM/dzoiIikrKHRoaXMuX2lzSW5SYW5nZShhLHYpPyc8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9InVpLWRhdGVwaWNrZXItY3VycmVudCB1aS1zdGF0ZS1kZWZhdWx0IHVpLXByaW9yaXR5LXNlY29uZGFyeSB1aS1jb3JuZXItYWxsIiBkYXRhLWhhbmRsZXI9InRvZGF5IiBkYXRhLWV2ZW50PSJjbGljayI+Jyt1KyI8L2J1dHRvbj4iOiIiKSsoYz8iIjp3KSsiPC9kaXY+IjoiIix5PXBhcnNlSW50KHRoaXMuX2dldChhLCJmaXJzdERheSIpLDEwKTt5PWlzTmFOKHkpPzA6eTt2YXIgej10aGlzLl9nZXQoYSwic2hvd1dlZWsiKSxBPXRoaXMuX2dldChhLCJkYXlOYW1lcyIpLEI9dGhpcy5fZ2V0KGEsImRheU5hbWVzU2hvcnQiKSxDPXRoaXMuX2dldChhLCJkYXlOYW1lc01pbiIpLEQ9dGhpcy5fZ2V0KGEsIm1vbnRoTmFtZXMiKSxFPXRoaXMuX2dldChhLCJtb250aE5hbWVzU2hvcnQiKSxGPXRoaXMuX2dldChhLCJiZWZvcmVTaG93RGF5IiksRz10aGlzLl9nZXQoYSwic2hvd090aGVyTW9udGhzIiksSD10aGlzLl9nZXQoYSwic2VsZWN0T3RoZXJNb250aHMiKSxJPXRoaXMuX2dldChhLCJjYWxjdWxhdGVXZWVrIil8fHRoaXMuaXNvODYwMVdlZWssSj10aGlzLl9nZXREZWZhdWx0RGF0ZShhKSxLPSIiO2Zvcih2YXIgTD0wO0w8Z1swXTtMKyspe3ZhciBNPSIiO3RoaXMubWF4Um93cz00O2Zvcih2YXIgTj0wO048Z1sxXTtOKyspe3ZhciBPPXRoaXMuX2RheWxpZ2h0U2F2aW5nQWRqdXN0KG5ldyBEYXRlKG8sbixhLnNlbGVjdGVkRGF5KSksUD0iIHVpLWNvcm5lci1hbGwiLFE9IiI7aWYoail7USs9JzxkaXYgY2xhc3M9InVpLWRhdGVwaWNrZXItZ3JvdXAnO2lmKGdbMV0+MSlzd2l0Y2goTil7Y2FzZSAwOlErPSIgdWktZGF0ZXBpY2tlci1ncm91cC1maXJzdCIsUD0iIHVpLWNvcm5lci0iKyhjPyJyaWdodCI6ImxlZnQiKTticmVhaztjYXNlIGdbMV0tMTpRKz0iIHVpLWRhdGVwaWNrZXItZ3JvdXAtbGFzdCIsUD0iIHVpLWNvcm5lci0iKyhjPyJsZWZ0IjoicmlnaHQiKTticmVhaztkZWZhdWx0OlErPSIgdWktZGF0ZXBpY2tlci1ncm91cC1taWRkbGUiLFA9IiJ9USs9JyI+J31RKz0nPGRpdiBjbGFzcz0idWktZGF0ZXBpY2tlci1oZWFkZXIgdWktd2lkZ2V0LWhlYWRlciB1aS1oZWxwZXItY2xlYXJmaXgnK1ArJyI+JysoL2FsbHxsZWZ0Ly50ZXN0KFApJiZMPT0wP2M/dDpyOiIiKSsoL2FsbHxyaWdodC8udGVzdChQKSYmTD09MD9jP3I6dDoiIikrdGhpcy5fZ2VuZXJhdGVNb250aFllYXJIZWFkZXIoYSxuLG8sbCxtLEw+MHx8Tj4wLEQsRSkrJzwvZGl2Pjx0YWJsZSBjbGFzcz0idWktZGF0ZXBpY2tlci1jYWxlbmRhciI+PHRoZWFkPicrIjx0cj4iO3ZhciBSPXo/Jzx0aCBjbGFzcz0idWktZGF0ZXBpY2tlci13ZWVrLWNvbCI+Jyt0aGlzLl9nZXQoYSwid2Vla0hlYWRlciIpKyI8L3RoPiI6IiI7Zm9yKHZhciBTPTA7Uzw3O1MrKyl7dmFyIFQ9KFMreSklNztSKz0iPHRoIisoKFMreSs2KSU3Pj01PycgY2xhc3M9InVpLWRhdGVwaWNrZXItd2Vlay1lbmQiJzoiIikrIj4iKyc8c3BhbiB0aXRsZT0iJytBW1RdKyciPicrQ1tUXSsiPC9zcGFuPjwvdGg+In1RKz1SKyI8L3RyPjwvdGhlYWQ+PHRib2R5PiI7dmFyIFU9dGhpcy5fZ2V0RGF5c0luTW9udGgobyxuKTtvPT1hLnNlbGVjdGVkWWVhciYmbj09YS5zZWxlY3RlZE1vbnRoJiYoYS5zZWxlY3RlZERheT1NYXRoLm1pbihhLnNlbGVjdGVkRGF5LFUpKTt2YXIgVj0odGhpcy5fZ2V0Rmlyc3REYXlPZk1vbnRoKG8sbikteSs3KSU3LFc9TWF0aC5jZWlsKChWK1UpLzcpLFg9aj90aGlzLm1heFJvd3M+Vz90aGlzLm1heFJvd3M6VzpXO3RoaXMubWF4Um93cz1YO3ZhciBZPXRoaXMuX2RheWxpZ2h0U2F2aW5nQWRqdXN0KG5ldyBEYXRlKG8sbiwxLVYpKTtmb3IodmFyIFo9MDtaPFg7WisrKXtRKz0iPHRyPiI7dmFyIF89ej8nPHRkIGNsYXNzPSJ1aS1kYXRlcGlja2VyLXdlZWstY29sIj4nK3RoaXMuX2dldChhLCJjYWxjdWxhdGVXZWVrIikoWSkrIjwvdGQ+IjoiIjtmb3IodmFyIFM9MDtTPDc7UysrKXt2YXIgYmE9Rj9GLmFwcGx5KGEuaW5wdXQ/YS5pbnB1dFswXTpudWxsLFtZXSk6WyEwLCIiXSxiYj1ZLmdldE1vbnRoKCkhPW4sYmM9YmImJiFIfHwhYmFbMF18fGwmJlk8bHx8bSYmWT5tO18rPSc8dGQgY2xhc3M9IicrKChTK3krNiklNz49NT8iIHVpLWRhdGVwaWNrZXItd2Vlay1lbmQiOiIiKSsoYmI/IiB1aS1kYXRlcGlja2VyLW90aGVyLW1vbnRoIjoiIikrKFkuZ2V0VGltZSgpPT1PLmdldFRpbWUoKSYmbj09YS5zZWxlY3RlZE1vbnRoJiZhLl9rZXlFdmVudHx8Si5nZXRUaW1lKCk9PVkuZ2V0VGltZSgpJiZKLmdldFRpbWUoKT09Ty5nZXRUaW1lKCk/IiAiK3RoaXMuX2RheU92ZXJDbGFzczoiIikrKGJjPyIgIit0aGlzLl91bnNlbGVjdGFibGVDbGFzcysiIHVpLXN0YXRlLWRpc2FibGVkIjoiIikrKGJiJiYhRz8iIjoiICIrYmFbMV0rKFkuZ2V0VGltZSgpPT1rLmdldFRpbWUoKT8iICIrdGhpcy5fY3VycmVudENsYXNzOiIiKSsoWS5nZXRUaW1lKCk9PWIuZ2V0VGltZSgpPyIgdWktZGF0ZXBpY2tlci10b2RheSI6IiIpKSsnIicrKCghYmJ8fEcpJiZiYVsyXT8nIHRpdGxlPSInK2JhWzJdKyciJzoiIikrKGJjPyIiOicgZGF0YS1oYW5kbGVyPSJzZWxlY3REYXkiIGRhdGEtZXZlbnQ9ImNsaWNrIiBkYXRhLW1vbnRoPSInK1kuZ2V0TW9udGgoKSsnIiBkYXRhLXllYXI9IicrWS5nZXRGdWxsWWVhcigpKyciJykrIj4iKyhiYiYmIUc/IiYjeGEwOyI6YmM/JzxzcGFuIGNsYXNzPSJ1aS1zdGF0ZS1kZWZhdWx0Ij4nK1kuZ2V0RGF0ZSgpKyI8L3NwYW4+IjonPGEgY2xhc3M9InVpLXN0YXRlLWRlZmF1bHQnKyhZLmdldFRpbWUoKT09Yi5nZXRUaW1lKCk/IiB1aS1zdGF0ZS1oaWdobGlnaHQiOiIiKSsoWS5nZXRUaW1lKCk9PWsuZ2V0VGltZSgpPyIgdWktc3RhdGUtYWN0aXZlIjoiIikrKGJiPyIgdWktcHJpb3JpdHktc2Vjb25kYXJ5IjoiIikrJyIgaHJlZj0iIyI+JytZLmdldERhdGUoKSsiPC9hPiIpKyI8L3RkPiIsWS5zZXREYXRlKFkuZ2V0RGF0ZSgpKzEpLFk9dGhpcy5fZGF5bGlnaHRTYXZpbmdBZGp1c3QoWSl9USs9XysiPC90cj4ifW4rKyxuPjExJiYobj0wLG8rKyksUSs9IjwvdGJvZHk+PC90YWJsZT4iKyhqPyI8L2Rpdj4iKyhnWzBdPjAmJk49PWdbMV0tMT8nPGRpdiBjbGFzcz0idWktZGF0ZXBpY2tlci1yb3ctYnJlYWsiPjwvZGl2Pic6IiIpOiIiKSxNKz1RfUsrPU19cmV0dXJuIEsrPXgrKCQuYnJvd3Nlci5tc2llJiZwYXJzZUludCgkLmJyb3dzZXIudmVyc2lvbiwxMCk8NyYmIWEuaW5saW5lPyc8aWZyYW1lIHNyYz0iamF2YXNjcmlwdDpmYWxzZTsiIGNsYXNzPSJ1aS1kYXRlcGlja2VyLWNvdmVyIiBmcmFtZWJvcmRlcj0iMCI+PC9pZnJhbWU+JzoiIiksYS5fa2V5RXZlbnQ9ITEsS30sX2dlbmVyYXRlTW9udGhZZWFySGVhZGVyOmZ1bmN0aW9uKGEsYixjLGQsZSxmLGcsaCl7dmFyIGk9dGhpcy5fZ2V0KGEsImNoYW5nZU1vbnRoIiksaj10aGlzLl9nZXQoYSwiY2hhbmdlWWVhciIpLGs9dGhpcy5fZ2V0KGEsInNob3dNb250aEFmdGVyWWVhciIpLGw9JzxkaXYgY2xhc3M9InVpLWRhdGVwaWNrZXItdGl0bGUiPicsbT0iIjtpZihmfHwhaSltKz0nPHNwYW4gY2xhc3M9InVpLWRhdGVwaWNrZXItbW9udGgiPicrZ1tiXSsiPC9zcGFuPiI7ZWxzZXt2YXIgbj1kJiZkLmdldEZ1bGxZZWFyKCk9PWMsbz1lJiZlLmdldEZ1bGxZZWFyKCk9PWM7bSs9JzxzZWxlY3QgY2xhc3M9InVpLWRhdGVwaWNrZXItbW9udGgiIGRhdGEtaGFuZGxlcj0ic2VsZWN0TW9udGgiIGRhdGEtZXZlbnQ9ImNoYW5nZSI+Jztmb3IodmFyIHA9MDtwPDEyO3ArKykoIW58fHA+PWQuZ2V0TW9udGgoKSkmJighb3x8cDw9ZS5nZXRNb250aCgpKSYmKG0rPSc8b3B0aW9uIHZhbHVlPSInK3ArJyInKyhwPT1iPycgc2VsZWN0ZWQ9InNlbGVjdGVkIic6IiIpKyI+IitoW3BdKyI8L29wdGlvbj4iKTttKz0iPC9zZWxlY3Q+In1rfHwobCs9bSsoZnx8IWl8fCFqPyImI3hhMDsiOiIiKSk7aWYoIWEueWVhcnNodG1sKXthLnllYXJzaHRtbD0iIjtpZihmfHwhailsKz0nPHNwYW4gY2xhc3M9InVpLWRhdGVwaWNrZXIteWVhciI+JytjKyI8L3NwYW4+IjtlbHNle3ZhciBxPXRoaXMuX2dldChhLCJ5ZWFyUmFuZ2UiKS5zcGxpdCgiOiIpLHI9KG5ldyBEYXRlKS5nZXRGdWxsWWVhcigpLHM9ZnVuY3Rpb24oYSl7dmFyIGI9YS5tYXRjaCgvY1srLV0uKi8pP2MrcGFyc2VJbnQoYS5zdWJzdHJpbmcoMSksMTApOmEubWF0Y2goL1srLV0uKi8pP3IrcGFyc2VJbnQoYSwxMCk6cGFyc2VJbnQoYSwxMCk7cmV0dXJuIGlzTmFOKGIpP3I6Yn0sdD1zKHFbMF0pLHU9TWF0aC5tYXgodCxzKHFbMV18fCIiKSk7dD1kP01hdGgubWF4KHQsZC5nZXRGdWxsWWVhcigpKTp0LHU9ZT9NYXRoLm1pbih1LGUuZ2V0RnVsbFllYXIoKSk6dSxhLnllYXJzaHRtbCs9JzxzZWxlY3QgY2xhc3M9InVpLWRhdGVwaWNrZXIteWVhciIgZGF0YS1oYW5kbGVyPSJzZWxlY3RZZWFyIiBkYXRhLWV2ZW50PSJjaGFuZ2UiPic7Zm9yKDt0PD11O3QrKylhLnllYXJzaHRtbCs9JzxvcHRpb24gdmFsdWU9IicrdCsnIicrKHQ9PWM/JyBzZWxlY3RlZD0ic2VsZWN0ZWQiJzoiIikrIj4iK3QrIjwvb3B0aW9uPiI7YS55ZWFyc2h0bWwrPSI8L3NlbGVjdD4iLGwrPWEueWVhcnNodG1sLGEueWVhcnNodG1sPW51bGx9fXJldHVybiBsKz10aGlzLl9nZXQoYSwieWVhclN1ZmZpeCIpLGsmJihsKz0oZnx8IWl8fCFqPyImI3hhMDsiOiIiKSttKSxsKz0iPC9kaXY+IixsfSxfYWRqdXN0SW5zdERhdGU6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWEuZHJhd1llYXIrKGM9PSJZIj9iOjApLGU9YS5kcmF3TW9udGgrKGM9PSJNIj9iOjApLGY9TWF0aC5taW4oYS5zZWxlY3RlZERheSx0aGlzLl9nZXREYXlzSW5Nb250aChkLGUpKSsoYz09IkQiP2I6MCksZz10aGlzLl9yZXN0cmljdE1pbk1heChhLHRoaXMuX2RheWxpZ2h0U2F2aW5nQWRqdXN0KG5ldyBEYXRlKGQsZSxmKSkpO2Euc2VsZWN0ZWREYXk9Zy5nZXREYXRlKCksYS5kcmF3TW9udGg9YS5zZWxlY3RlZE1vbnRoPWcuZ2V0TW9udGgoKSxhLmRyYXdZZWFyPWEuc2VsZWN0ZWRZZWFyPWcuZ2V0RnVsbFllYXIoKSwoYz09Ik0ifHxjPT0iWSIpJiZ0aGlzLl9ub3RpZnlDaGFuZ2UoYSl9LF9yZXN0cmljdE1pbk1heDpmdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMuX2dldE1pbk1heERhdGUoYSwibWluIiksZD10aGlzLl9nZXRNaW5NYXhEYXRlKGEsIm1heCIpLGU9YyYmYjxjP2M6YjtyZXR1cm4gZT1kJiZlPmQ/ZDplLGV9LF9ub3RpZnlDaGFuZ2U6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5fZ2V0KGEsIm9uQ2hhbmdlTW9udGhZZWFyIik7YiYmYi5hcHBseShhLmlucHV0P2EuaW5wdXRbMF06bnVsbCxbYS5zZWxlY3RlZFllYXIsYS5zZWxlY3RlZE1vbnRoKzEsYV0pfSxfZ2V0TnVtYmVyT2ZNb250aHM6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5fZ2V0KGEsIm51bWJlck9mTW9udGhzIik7cmV0dXJuIGI9PW51bGw/WzEsMV06dHlwZW9mIGI9PSJudW1iZXIiP1sxLGJdOmJ9LF9nZXRNaW5NYXhEYXRlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuX2RldGVybWluZURhdGUoYSx0aGlzLl9nZXQoYSxiKyJEYXRlIiksbnVsbCl9LF9nZXREYXlzSW5Nb250aDpmdW5jdGlvbihhLGIpe3JldHVybiAzMi10aGlzLl9kYXlsaWdodFNhdmluZ0FkanVzdChuZXcgRGF0ZShhLGIsMzIpKS5nZXREYXRlKCl9LF9nZXRGaXJzdERheU9mTW9udGg6ZnVuY3Rpb24oYSxiKXtyZXR1cm4obmV3IERhdGUoYSxiLDEpKS5nZXREYXkoKX0sX2NhbkFkanVzdE1vbnRoOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPXRoaXMuX2dldE51bWJlck9mTW9udGhzKGEpLGY9dGhpcy5fZGF5bGlnaHRTYXZpbmdBZGp1c3QobmV3IERhdGUoYyxkKyhiPDA/YjplWzBdKmVbMV0pLDEpKTtyZXR1cm4gYjwwJiZmLnNldERhdGUodGhpcy5fZ2V0RGF5c0luTW9udGgoZi5nZXRGdWxsWWVhcigpLGYuZ2V0TW9udGgoKSkpLHRoaXMuX2lzSW5SYW5nZShhLGYpfSxfaXNJblJhbmdlOmZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpcy5fZ2V0TWluTWF4RGF0ZShhLCJtaW4iKSxkPXRoaXMuX2dldE1pbk1heERhdGUoYSwibWF4Iik7cmV0dXJuKCFjfHxiLmdldFRpbWUoKT49Yy5nZXRUaW1lKCkpJiYoIWR8fGIuZ2V0VGltZSgpPD1kLmdldFRpbWUoKSl9LF9nZXRGb3JtYXRDb25maWc6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5fZ2V0KGEsInNob3J0WWVhckN1dG9mZiIpO3JldHVybiBiPXR5cGVvZiBiIT0ic3RyaW5nIj9iOihuZXcgRGF0ZSkuZ2V0RnVsbFllYXIoKSUxMDArcGFyc2VJbnQoYiwxMCkse3Nob3J0WWVhckN1dG9mZjpiLGRheU5hbWVzU2hvcnQ6dGhpcy5fZ2V0KGEsImRheU5hbWVzU2hvcnQiKSxkYXlOYW1lczp0aGlzLl9nZXQoYSwiZGF5TmFtZXMiKSxtb250aE5hbWVzU2hvcnQ6dGhpcy5fZ2V0KGEsIm1vbnRoTmFtZXNTaG9ydCIpLG1vbnRoTmFtZXM6dGhpcy5fZ2V0KGEsIm1vbnRoTmFtZXMiKX19LF9mb3JtYXREYXRlOmZ1bmN0aW9uKGEsYixjLGQpe2J8fChhLmN1cnJlbnREYXk9YS5zZWxlY3RlZERheSxhLmN1cnJlbnRNb250aD1hLnNlbGVjdGVkTW9udGgsYS5jdXJyZW50WWVhcj1hLnNlbGVjdGVkWWVhcik7dmFyIGU9Yj90eXBlb2YgYj09Im9iamVjdCI/Yjp0aGlzLl9kYXlsaWdodFNhdmluZ0FkanVzdChuZXcgRGF0ZShkLGMsYikpOnRoaXMuX2RheWxpZ2h0U2F2aW5nQWRqdXN0KG5ldyBEYXRlKGEuY3VycmVudFllYXIsYS5jdXJyZW50TW9udGgsYS5jdXJyZW50RGF5KSk7cmV0dXJuIHRoaXMuZm9ybWF0RGF0ZSh0aGlzLl9nZXQoYSwiZGF0ZUZvcm1hdCIpLGUsdGhpcy5fZ2V0Rm9ybWF0Q29uZmlnKGEpKX19KSwkLmZuLmRhdGVwaWNrZXI9ZnVuY3Rpb24oYSl7aWYoIXRoaXMubGVuZ3RoKXJldHVybiB0aGlzOyQuZGF0ZXBpY2tlci5pbml0aWFsaXplZHx8KCQoZG9jdW1lbnQpLm1vdXNlZG93bigkLmRhdGVwaWNrZXIuX2NoZWNrRXh0ZXJuYWxDbGljaykuZmluZCgiYm9keSIpLmFwcGVuZCgkLmRhdGVwaWNrZXIuZHBEaXYpLCQuZGF0ZXBpY2tlci5pbml0aWFsaXplZD0hMCk7dmFyIGI9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpO3JldHVybiB0eXBlb2YgYSE9InN0cmluZyJ8fGEhPSJpc0Rpc2FibGVkIiYmYSE9ImdldERhdGUiJiZhIT0id2lkZ2V0Ij9hPT0ib3B0aW9uIiYmYXJndW1lbnRzLmxlbmd0aD09MiYmdHlwZW9mIGFyZ3VtZW50c1sxXT09InN0cmluZyI/JC5kYXRlcGlja2VyWyJfIithKyJEYXRlcGlja2VyIl0uYXBwbHkoJC5kYXRlcGlja2VyLFt0aGlzWzBdXS5jb25jYXQoYikpOnRoaXMuZWFjaChmdW5jdGlvbigpe3R5cGVvZiBhPT0ic3RyaW5nIj8kLmRhdGVwaWNrZXJbIl8iK2ErIkRhdGVwaWNrZXIiXS5hcHBseSgkLmRhdGVwaWNrZXIsW3RoaXNdLmNvbmNhdChiKSk6JC5kYXRlcGlja2VyLl9hdHRhY2hEYXRlcGlja2VyKHRoaXMsYSl9KTokLmRhdGVwaWNrZXJbIl8iK2ErIkRhdGVwaWNrZXIiXS5hcHBseSgkLmRhdGVwaWNrZXIsW3RoaXNbMF1dLmNvbmNhdChiKSl9LCQuZGF0ZXBpY2tlcj1uZXcgRGF0ZXBpY2tlciwkLmRhdGVwaWNrZXIuaW5pdGlhbGl6ZWQ9ITEsJC5kYXRlcGlja2VyLnV1aWQ9KG5ldyBEYXRlKS5nZXRUaW1lKCksJC5kYXRlcGlja2VyLnZlcnNpb249IjEuOC4yMyIsd2luZG93WyJEUF9qUXVlcnlfIitkcHV1aWRdPSR9KShqUXVlcnkpOzsvKiEgalF1ZXJ5IFVJIC0gdjEuOC4yMyAtIDIwMTItMDgtMTUKLSogaHR0cHM6Ly9naXRodWIuY29tL2pxdWVyeS9qcXVlcnktdWkKLSogSW5jbHVkZXM6IGpxdWVyeS51aS5wcm9ncmVzc2Jhci5qcwotKiBDb3B5cmlnaHQgKGMpIDIwMTIgQVVUSE9SUy50eHQ7IExpY2Vuc2VkIE1JVCwgR1BMICovCi0oZnVuY3Rpb24oYSxiKXthLndpZGdldCgidWkucHJvZ3Jlc3NiYXIiLHtvcHRpb25zOnt2YWx1ZTowLG1heDoxMDB9LG1pbjowLF9jcmVhdGU6ZnVuY3Rpb24oKXt0aGlzLmVsZW1lbnQuYWRkQ2xhc3MoInVpLXByb2dyZXNzYmFyIHVpLXdpZGdldCB1aS13aWRnZXQtY29udGVudCB1aS1jb3JuZXItYWxsIikuYXR0cih7cm9sZToicHJvZ3Jlc3NiYXIiLCJhcmlhLXZhbHVlbWluIjp0aGlzLm1pbiwiYXJpYS12YWx1ZW1heCI6dGhpcy5vcHRpb25zLm1heCwiYXJpYS12YWx1ZW5vdyI6dGhpcy5fdmFsdWUoKX0pLHRoaXMudmFsdWVEaXY9YSgiPGRpdiBjbGFzcz0ndWktcHJvZ3Jlc3NiYXItdmFsdWUgdWktd2lkZ2V0LWhlYWRlciB1aS1jb3JuZXItbGVmdCc+PC9kaXY+IikuYXBwZW5kVG8odGhpcy5lbGVtZW50KSx0aGlzLm9sZFZhbHVlPXRoaXMuX3ZhbHVlKCksdGhpcy5fcmVmcmVzaFZhbHVlKCl9LGRlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLmVsZW1lbnQucmVtb3ZlQ2xhc3MoInVpLXByb2dyZXNzYmFyIHVpLXdpZGdldCB1aS13aWRnZXQtY29udGVudCB1aS1jb3JuZXItYWxsIikucmVtb3ZlQXR0cigicm9sZSIpLnJlbW92ZUF0dHIoImFyaWEtdmFsdWVtaW4iKS5yZW1vdmVBdHRyKCJhcmlhLXZhbHVlbWF4IikucmVtb3ZlQXR0cigiYXJpYS12YWx1ZW5vdyIpLHRoaXMudmFsdWVEaXYucmVtb3ZlKCksYS5XaWRnZXQucHJvdG90eXBlLmRlc3Ryb3kuYXBwbHkodGhpcyxhcmd1bWVudHMpfSx2YWx1ZTpmdW5jdGlvbihhKXtyZXR1cm4gYT09PWI/dGhpcy5fdmFsdWUoKToodGhpcy5fc2V0T3B0aW9uKCJ2YWx1ZSIsYSksdGhpcyl9LF9zZXRPcHRpb246ZnVuY3Rpb24oYixjKXtiPT09InZhbHVlIiYmKHRoaXMub3B0aW9ucy52YWx1ZT1jLHRoaXMuX3JlZnJlc2hWYWx1ZSgpLHRoaXMuX3ZhbHVlKCk9PT10aGlzLm9wdGlvbnMubWF4JiZ0aGlzLl90cmlnZ2VyKCJjb21wbGV0ZSIpKSxhLldpZGdldC5wcm90b3R5cGUuX3NldE9wdGlvbi5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LF92YWx1ZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMub3B0aW9ucy52YWx1ZTtyZXR1cm4gdHlwZW9mIGEhPSJudW1iZXIiJiYoYT0wKSxNYXRoLm1pbih0aGlzLm9wdGlvbnMubWF4LE1hdGgubWF4KHRoaXMubWluLGEpKX0sX3BlcmNlbnRhZ2U6ZnVuY3Rpb24oKXtyZXR1cm4gMTAwKnRoaXMuX3ZhbHVlKCkvdGhpcy5vcHRpb25zLm1heH0sX3JlZnJlc2hWYWx1ZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmFsdWUoKSxiPXRoaXMuX3BlcmNlbnRhZ2UoKTt0aGlzLm9sZFZhbHVlIT09YSYmKHRoaXMub2xkVmFsdWU9YSx0aGlzLl90cmlnZ2VyKCJjaGFuZ2UiKSksdGhpcy52YWx1ZURpdi50b2dnbGUoYT50aGlzLm1pbikudG9nZ2xlQ2xhc3MoInVpLWNvcm5lci1yaWdodCIsYT09PXRoaXMub3B0aW9ucy5tYXgpLndpZHRoKGIudG9GaXhlZCgwKSsiJSIpLHRoaXMuZWxlbWVudC5hdHRyKCJhcmlhLXZhbHVlbm93IixhKX19KSxhLmV4dGVuZChhLnVpLnByb2dyZXNzYmFyLHt2ZXJzaW9uOiIxLjguMjMifSl9KShqUXVlcnkpOzsvKiEgalF1ZXJ5IFVJIC0gdjEuOC4yMyAtIDIwMTItMDgtMTUKLSogaHR0cHM6Ly9naXRodWIuY29tL2pxdWVyeS9qcXVlcnktdWkKLSogSW5jbHVkZXM6IGpxdWVyeS5lZmZlY3RzLmNvcmUuanMKLSogQ29weXJpZ2h0IChjKSAyMDEyIEFVVEhPUlMudHh0OyBMaWNlbnNlZCBNSVQsIEdQTCAqLwotalF1ZXJ5LmVmZmVjdHN8fGZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYyhiKXt2YXIgYztyZXR1cm4gYiYmYi5jb25zdHJ1Y3Rvcj09QXJyYXkmJmIubGVuZ3RoPT0zP2I6KGM9L3JnYlwoXHMqKFswLTldezEsM30pXHMqLFxzKihbMC05XXsxLDN9KVxzKixccyooWzAtOV17MSwzfSlccypcKS8uZXhlYyhiKSk/W3BhcnNlSW50KGNbMV0sMTApLHBhcnNlSW50KGNbMl0sMTApLHBhcnNlSW50KGNbM10sMTApXTooYz0vcmdiXChccyooWzAtOV0rKD86XC5bMC05XSspPylcJVxzKixccyooWzAtOV0rKD86XC5bMC05XSspPylcJVxzKixccyooWzAtOV0rKD86XC5bMC05XSspPylcJVxzKlwpLy5leGVjKGIpKT9bcGFyc2VGbG9hdChjWzFdKSoyLjU1LHBhcnNlRmxvYXQoY1syXSkqMi41NSxwYXJzZUZsb2F0KGNbM10pKjIuNTVdOihjPS8jKFthLWZBLUYwLTldezJ9KShbYS1mQS1GMC05XXsyfSkoW2EtZkEtRjAtOV17Mn0pLy5leGVjKGIpKT9bcGFyc2VJbnQoY1sxXSwxNikscGFyc2VJbnQoY1syXSwxNikscGFyc2VJbnQoY1szXSwxNildOihjPS8jKFthLWZBLUYwLTldKShbYS1mQS1GMC05XSkoW2EtZkEtRjAtOV0pLy5leGVjKGIpKT9bcGFyc2VJbnQoY1sxXStjWzFdLDE2KSxwYXJzZUludChjWzJdK2NbMl0sMTYpLHBhcnNlSW50KGNbM10rY1szXSwxNildOihjPS9yZ2JhXCgwLCAwLCAwLCAwXCkvLmV4ZWMoYikpP2UudHJhbnNwYXJlbnQ6ZVthLnRyaW0oYikudG9Mb3dlckNhc2UoKV19ZnVuY3Rpb24gZChiLGQpe3ZhciBlO2Rve2U9KGEuY3VyQ1NTfHxhLmNzcykoYixkKTtpZihlIT0iIiYmZSE9InRyYW5zcGFyZW50Inx8YS5ub2RlTmFtZShiLCJib2R5IikpYnJlYWs7ZD0iYmFja2dyb3VuZENvbG9yIn13aGlsZShiPWIucGFyZW50Tm9kZSk7cmV0dXJuIGMoZSl9ZnVuY3Rpb24gaCgpe3ZhciBhPWRvY3VtZW50LmRlZmF1bHRWaWV3P2RvY3VtZW50LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUodGhpcyxudWxsKTp0aGlzLmN1cnJlbnRTdHlsZSxiPXt9LGMsZDtpZihhJiZhLmxlbmd0aCYmYVswXSYmYVthWzBdXSl7dmFyIGU9YS5sZW5ndGg7d2hpbGUoZS0tKWM9YVtlXSx0eXBlb2YgYVtjXT09InN0cmluZyImJihkPWMucmVwbGFjZSgvXC0oXHcpL2csZnVuY3Rpb24oYSxiKXtyZXR1cm4gYi50b1VwcGVyQ2FzZSgpfSksYltkXT1hW2NdKX1lbHNlIGZvcihjIGluIGEpdHlwZW9mIGFbY109PSJzdHJpbmciJiYoYltjXT1hW2NdKTtyZXR1cm4gYn1mdW5jdGlvbiBpKGIpe3ZhciBjLGQ7Zm9yKGMgaW4gYilkPWJbY10sKGQ9PW51bGx8fGEuaXNGdW5jdGlvbihkKXx8YyBpbiBnfHwvc2Nyb2xsYmFyLy50ZXN0KGMpfHwhL2NvbG9yL2kudGVzdChjKSYmaXNOYU4ocGFyc2VGbG9hdChkKSkpJiZkZWxldGUgYltjXTtyZXR1cm4gYn1mdW5jdGlvbiBqKGEsYil7dmFyIGM9e186MH0sZDtmb3IoZCBpbiBiKWFbZF0hPWJbZF0mJihjW2RdPWJbZF0pO3JldHVybiBjfWZ1bmN0aW9uIGsoYixjLGQsZSl7dHlwZW9mIGI9PSJvYmplY3QiJiYoZT1jLGQ9bnVsbCxjPWIsYj1jLmVmZmVjdCksYS5pc0Z1bmN0aW9uKGMpJiYoZT1jLGQ9bnVsbCxjPXt9KTtpZih0eXBlb2YgYz09Im51bWJlciJ8fGEuZnguc3BlZWRzW2NdKWU9ZCxkPWMsYz17fTtyZXR1cm4gYS5pc0Z1bmN0aW9uKGQpJiYoZT1kLGQ9bnVsbCksYz1jfHx7fSxkPWR8fGMuZHVyYXRpb24sZD1hLmZ4Lm9mZj8wOnR5cGVvZiBkPT0ibnVtYmVyIj9kOmQgaW4gYS5meC5zcGVlZHM/YS5meC5zcGVlZHNbZF06YS5meC5zcGVlZHMuX2RlZmF1bHQsZT1lfHxjLmNvbXBsZXRlLFtiLGMsZCxlXX1mdW5jdGlvbiBsKGIpe3JldHVybiFifHx0eXBlb2YgYj09Im51bWJlciJ8fGEuZnguc3BlZWRzW2JdPyEwOnR5cGVvZiBiPT0ic3RyaW5nIiYmIWEuZWZmZWN0c1tiXT8hMDohMX1hLmVmZmVjdHM9e30sYS5lYWNoKFsiYmFja2dyb3VuZENvbG9yIiwiYm9yZGVyQm90dG9tQ29sb3IiLCJib3JkZXJMZWZ0Q29sb3IiLCJib3JkZXJSaWdodENvbG9yIiwiYm9yZGVyVG9wQ29sb3IiLCJib3JkZXJDb2xvciIsImNvbG9yIiwib3V0bGluZUNvbG9yIl0sZnVuY3Rpb24oYixlKXthLmZ4LnN0ZXBbZV09ZnVuY3Rpb24oYSl7YS5jb2xvckluaXR8fChhLnN0YXJ0PWQoYS5lbGVtLGUpLGEuZW5kPWMoYS5lbmQpLGEuY29sb3JJbml0PSEwKSxhLmVsZW0uc3R5bGVbZV09InJnYigiK01hdGgubWF4KE1hdGgubWluKHBhcnNlSW50KGEucG9zKihhLmVuZFswXS1hLnN0YXJ0WzBdKSthLnN0YXJ0WzBdLDEwKSwyNTUpLDApKyIsIitNYXRoLm1heChNYXRoLm1pbihwYXJzZUludChhLnBvcyooYS5lbmRbMV0tYS5zdGFydFsxXSkrYS5zdGFydFsxXSwxMCksMjU1KSwwKSsiLCIrTWF0aC5tYXgoTWF0aC5taW4ocGFyc2VJbnQoYS5wb3MqKGEuZW5kWzJdLWEuc3RhcnRbMl0pK2Euc3RhcnRbMl0sMTApLDI1NSksMCkrIikifX0pO3ZhciBlPXthcXVhOlswLDI1NSwyNTVdLGF6dXJlOlsyNDAsMjU1LDI1NV0sYmVpZ2U6WzI0NSwyNDUsMjIwXSxibGFjazpbMCwwLDBdLGJsdWU6WzAsMCwyNTVdLGJyb3duOlsxNjUsNDIsNDJdLGN5YW46WzAsMjU1LDI1NV0sZGFya2JsdWU6WzAsMCwxMzldLGRhcmtjeWFuOlswLDEzOSwxMzldLGRhcmtncmV5OlsxNjksMTY5LDE2OV0sZGFya2dyZWVuOlswLDEwMCwwXSxkYXJra2hha2k6WzE4OSwxODMsMTA3XSxkYXJrbWFnZW50YTpbMTM5LDAsMTM5XSxkYXJrb2xpdmVncmVlbjpbODUsMTA3LDQ3XSxkYXJrb3JhbmdlOlsyNTUsMTQwLDBdLGRhcmtvcmNoaWQ6WzE1Myw1MCwyMDRdLGRhcmtyZWQ6WzEzOSwwLDBdLGRhcmtzYWxtb246WzIzMywxNTAsMTIyXSxkYXJrdmlvbGV0OlsxNDgsMCwyMTFdLGZ1Y2hzaWE6WzI1NSwwLDI1NV0sZ29sZDpbMjU1LDIxNSwwXSxncmVlbjpbMCwxMjgsMF0saW5kaWdvOls3NSwwLDEzMF0sa2hha2k6WzI0MCwyMzAsMTQwXSxsaWdodGJsdWU6WzE3MywyMTYsMjMwXSxsaWdodGN5YW46WzIyNCwyNTUsMjU1XSxsaWdodGdyZWVuOlsxNDQsMjM4LDE0NF0sbGlnaHRncmV5OlsyMTEsMjExLDIxMV0sbGlnaHRwaW5rOlsyNTUsMTgyLDE5M10sbGlnaHR5ZWxsb3c6WzI1NSwyNTUsMjI0XSxsaW1lOlswLDI1NSwwXSxtYWdlbnRhOlsyNTUsMCwyNTVdLG1hcm9vbjpbMTI4LDAsMF0sbmF2eTpbMCwwLDEyOF0sb2xpdmU6WzEyOCwxMjgsMF0sb3JhbmdlOlsyNTUsMTY1LDBdLHBpbms6WzI1NSwxOTIsMjAzXSxwdXJwbGU6WzEyOCwwLDEyOF0sdmlvbGV0OlsxMjgsMCwxMjhdLHJlZDpbMjU1LDAsMF0sc2lsdmVyOlsxOTIsMTkyLDE5Ml0sd2hpdGU6WzI1NSwyNTUsMjU1XSx5ZWxsb3c6WzI1NSwyNTUsMF0sdHJhbnNwYXJlbnQ6WzI1NSwyNTUsMjU1XX0sZj1bImFkZCIsInJlbW92ZSIsInRvZ2dsZSJdLGc9e2JvcmRlcjoxLGJvcmRlckJvdHRvbToxLGJvcmRlckNvbG9yOjEsYm9yZGVyTGVmdDoxLGJvcmRlclJpZ2h0OjEsYm9yZGVyVG9wOjEsYm9yZGVyV2lkdGg6MSxtYXJnaW46MSxwYWRkaW5nOjF9O2EuZWZmZWN0cy5hbmltYXRlQ2xhc3M9ZnVuY3Rpb24oYixjLGQsZSl7cmV0dXJuIGEuaXNGdW5jdGlvbihkKSYmKGU9ZCxkPW51bGwpLHRoaXMucXVldWUoZnVuY3Rpb24oKXt2YXIgZz1hKHRoaXMpLGs9Zy5hdHRyKCJzdHlsZSIpfHwiICIsbD1pKGguY2FsbCh0aGlzKSksbSxuPWcuYXR0cigiY2xhc3MiKXx8IiI7YS5lYWNoKGYsZnVuY3Rpb24oYSxjKXtiW2NdJiZnW2MrIkNsYXNzIl0oYltjXSl9KSxtPWkoaC5jYWxsKHRoaXMpKSxnLmF0dHIoImNsYXNzIixuKSxnLmFuaW1hdGUoaihsLG0pLHtxdWV1ZTohMSxkdXJhdGlvbjpjLGVhc2luZzpkLGNvbXBsZXRlOmZ1bmN0aW9uKCl7YS5lYWNoKGYsZnVuY3Rpb24oYSxjKXtiW2NdJiZnW2MrIkNsYXNzIl0oYltjXSl9KSx0eXBlb2YgZy5hdHRyKCJzdHlsZSIpPT0ib2JqZWN0Ij8oZy5hdHRyKCJzdHlsZSIpLmNzc1RleHQ9IiIsZy5hdHRyKCJzdHlsZSIpLmNzc1RleHQ9ayk6Zy5hdHRyKCJzdHlsZSIsayksZSYmZS5hcHBseSh0aGlzLGFyZ3VtZW50cyksYS5kZXF1ZXVlKHRoaXMpfX0pfSl9LGEuZm4uZXh0ZW5kKHtfYWRkQ2xhc3M6YS5mbi5hZGRDbGFzcyxhZGRDbGFzczpmdW5jdGlvbihiLGMsZCxlKXtyZXR1cm4gYz9hLmVmZmVjdHMuYW5pbWF0ZUNsYXNzLmFwcGx5KHRoaXMsW3thZGQ6Yn0sYyxkLGVdKTp0aGlzLl9hZGRDbGFzcyhiKX0sX3JlbW92ZUNsYXNzOmEuZm4ucmVtb3ZlQ2xhc3MscmVtb3ZlQ2xhc3M6ZnVuY3Rpb24oYixjLGQsZSl7cmV0dXJuIGM/YS5lZmZlY3RzLmFuaW1hdGVDbGFzcy5hcHBseSh0aGlzLFt7cmVtb3ZlOmJ9LGMsZCxlXSk6dGhpcy5fcmVtb3ZlQ2xhc3MoYil9LF90b2dnbGVDbGFzczphLmZuLnRvZ2dsZUNsYXNzLHRvZ2dsZUNsYXNzOmZ1bmN0aW9uKGMsZCxlLGYsZyl7cmV0dXJuIHR5cGVvZiBkPT0iYm9vbGVhbiJ8fGQ9PT1iP2U/YS5lZmZlY3RzLmFuaW1hdGVDbGFzcy5hcHBseSh0aGlzLFtkP3thZGQ6Y306e3JlbW92ZTpjfSxlLGYsZ10pOnRoaXMuX3RvZ2dsZUNsYXNzKGMsZCk6YS5lZmZlY3RzLmFuaW1hdGVDbGFzcy5hcHBseSh0aGlzLFt7dG9nZ2xlOmN9LGQsZSxmXSl9LHN3aXRjaENsYXNzOmZ1bmN0aW9uKGIsYyxkLGUsZil7cmV0dXJuIGEuZWZmZWN0cy5hbmltYXRlQ2xhc3MuYXBwbHkodGhpcyxbe2FkZDpjLHJlbW92ZTpifSxkLGUsZl0pfX0pLGEuZXh0ZW5kKGEuZWZmZWN0cyx7dmVyc2lvbjoiMS44LjIzIixzYXZlOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspYltjXSE9PW51bGwmJmEuZGF0YSgiZWMuc3RvcmFnZS4iK2JbY10sYVswXS5zdHlsZVtiW2NdXSl9LHJlc3RvcmU6ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKyliW2NdIT09bnVsbCYmYS5jc3MoYltjXSxhLmRhdGEoImVjLnN0b3JhZ2UuIitiW2NdKSl9LHNldE1vZGU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYj09InRvZ2dsZSImJihiPWEuaXMoIjpoaWRkZW4iKT8ic2hvdyI6ImhpZGUiKSxifSxnZXRCYXNlbGluZTpmdW5jdGlvbihhLGIpe3ZhciBjLGQ7c3dpdGNoKGFbMF0pe2Nhc2UidG9wIjpjPTA7YnJlYWs7Y2FzZSJtaWRkbGUiOmM9LjU7YnJlYWs7Y2FzZSJib3R0b20iOmM9MTticmVhaztkZWZhdWx0OmM9YVswXS9iLmhlaWdodH1zd2l0Y2goYVsxXSl7Y2FzZSJsZWZ0IjpkPTA7YnJlYWs7Y2FzZSJjZW50ZXIiOmQ9LjU7YnJlYWs7Y2FzZSJyaWdodCI6ZD0xO2JyZWFrO2RlZmF1bHQ6ZD1hWzFdL2Iud2lkdGh9cmV0dXJue3g6ZCx5OmN9fSxjcmVhdGVXcmFwcGVyOmZ1bmN0aW9uKGIpe2lmKGIucGFyZW50KCkuaXMoIi51aS1lZmZlY3RzLXdyYXBwZXIiKSlyZXR1cm4gYi5wYXJlbnQoKTt2YXIgYz17d2lkdGg6Yi5vdXRlcldpZHRoKCEwKSxoZWlnaHQ6Yi5vdXRlckhlaWdodCghMCksImZsb2F0IjpiLmNzcygiZmxvYXQiKX0sZD1hKCI8ZGl2PjwvZGl2PiIpLmFkZENsYXNzKCJ1aS1lZmZlY3RzLXdyYXBwZXIiKS5jc3Moe2ZvbnRTaXplOiIxMDAlIixiYWNrZ3JvdW5kOiJ0cmFuc3BhcmVudCIsYm9yZGVyOiJub25lIixtYXJnaW46MCxwYWRkaW5nOjB9KSxlPWRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7dHJ5e2UuaWR9Y2F0Y2goZil7ZT1kb2N1bWVudC5ib2R5fXJldHVybiBiLndyYXAoZCksKGJbMF09PT1lfHxhLmNvbnRhaW5zKGJbMF0sZSkpJiZhKGUpLmZvY3VzKCksZD1iLnBhcmVudCgpLGIuY3NzKCJwb3NpdGlvbiIpPT0ic3RhdGljIj8oZC5jc3Moe3Bvc2l0aW9uOiJyZWxhdGl2ZSJ9KSxiLmNzcyh7cG9zaXRpb246InJlbGF0aXZlIn0pKTooYS5leHRlbmQoYyx7cG9zaXRpb246Yi5jc3MoInBvc2l0aW9uIiksekluZGV4OmIuY3NzKCJ6LWluZGV4Iil9KSxhLmVhY2goWyJ0b3AiLCJsZWZ0IiwiYm90dG9tIiwicmlnaHQiXSxmdW5jdGlvbihhLGQpe2NbZF09Yi5jc3MoZCksaXNOYU4ocGFyc2VJbnQoY1tkXSwxMCkpJiYoY1tkXT0iYXV0byIpfSksYi5jc3Moe3Bvc2l0aW9uOiJyZWxhdGl2ZSIsdG9wOjAsbGVmdDowLHJpZ2h0OiJhdXRvIixib3R0b206ImF1dG8ifSkpLGQuY3NzKGMpLnNob3coKX0scmVtb3ZlV3JhcHBlcjpmdW5jdGlvbihiKXt2YXIgYyxkPWRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7cmV0dXJuIGIucGFyZW50KCkuaXMoIi51aS1lZmZlY3RzLXdyYXBwZXIiKT8oYz1iLnBhcmVudCgpLnJlcGxhY2VXaXRoKGIpLChiWzBdPT09ZHx8YS5jb250YWlucyhiWzBdLGQpKSYmYShkKS5mb2N1cygpLGMpOmJ9LHNldFRyYW5zaXRpb246ZnVuY3Rpb24oYixjLGQsZSl7cmV0dXJuIGU9ZXx8e30sYS5lYWNoKGMsZnVuY3Rpb24oYSxjKXt2YXIgZj1iLmNzc1VuaXQoYyk7ZlswXT4wJiYoZVtjXT1mWzBdKmQrZlsxXSl9KSxlfX0pLGEuZm4uZXh0ZW5kKHtlZmZlY3Q6ZnVuY3Rpb24oYixjLGQsZSl7dmFyIGY9ay5hcHBseSh0aGlzLGFyZ3VtZW50cyksZz17b3B0aW9uczpmWzFdLGR1cmF0aW9uOmZbMl0sY2FsbGJhY2s6ZlszXX0saD1nLm9wdGlvbnMubW9kZSxpPWEuZWZmZWN0c1tiXTtyZXR1cm4gYS5meC5vZmZ8fCFpP2g/dGhpc1toXShnLmR1cmF0aW9uLGcuY2FsbGJhY2spOnRoaXMuZWFjaChmdW5jdGlvbigpe2cuY2FsbGJhY2smJmcuY2FsbGJhY2suY2FsbCh0aGlzKX0pOmkuY2FsbCh0aGlzLGcpfSxfc2hvdzphLmZuLnNob3csc2hvdzpmdW5jdGlvbihhKXtpZihsKGEpKXJldHVybiB0aGlzLl9zaG93LmFwcGx5KHRoaXMsYXJndW1lbnRzKTt2YXIgYj1rLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gYlsxXS5tb2RlPSJzaG93Iix0aGlzLmVmZmVjdC5hcHBseSh0aGlzLGIpfSxfaGlkZTphLmZuLmhpZGUsaGlkZTpmdW5jdGlvbihhKXtpZihsKGEpKXJldHVybiB0aGlzLl9oaWRlLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt2YXIgYj1rLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gYlsxXS5tb2RlPSJoaWRlIix0aGlzLmVmZmVjdC5hcHBseSh0aGlzLGIpfSxfX3RvZ2dsZTphLmZuLnRvZ2dsZSx0b2dnbGU6ZnVuY3Rpb24oYil7aWYobChiKXx8dHlwZW9mIGI9PSJib29sZWFuInx8YS5pc0Z1bmN0aW9uKGIpKXJldHVybiB0aGlzLl9fdG9nZ2xlLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt2YXIgYz1rLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gY1sxXS5tb2RlPSJ0b2dnbGUiLHRoaXMuZWZmZWN0LmFwcGx5KHRoaXMsYyl9LGNzc1VuaXQ6ZnVuY3Rpb24oYil7dmFyIGM9dGhpcy5jc3MoYiksZD1bXTtyZXR1cm4gYS5lYWNoKFsiZW0iLCJweCIsIiUiLCJwdCJdLGZ1bmN0aW9uKGEsYil7Yy5pbmRleE9mKGIpPjAmJihkPVtwYXJzZUZsb2F0KGMpLGJdKX0pLGR9fSk7dmFyIG09e307YS5lYWNoKFsiUXVhZCIsIkN1YmljIiwiUXVhcnQiLCJRdWludCIsIkV4cG8iXSxmdW5jdGlvbihhLGIpe21bYl09ZnVuY3Rpb24oYil7cmV0dXJuIE1hdGgucG93KGIsYSsyKX19KSxhLmV4dGVuZChtLHtTaW5lOmZ1bmN0aW9uKGEpe3JldHVybiAxLU1hdGguY29zKGEqTWF0aC5QSS8yKX0sQ2lyYzpmdW5jdGlvbihhKXtyZXR1cm4gMS1NYXRoLnNxcnQoMS1hKmEpfSxFbGFzdGljOmZ1bmN0aW9uKGEpe3JldHVybiBhPT09MHx8YT09PTE/YTotTWF0aC5wb3coMiw4KihhLTEpKSpNYXRoLnNpbigoKGEtMSkqODAtNy41KSpNYXRoLlBJLzE1KX0sQmFjazpmdW5jdGlvbihhKXtyZXR1cm4gYSphKigzKmEtMil9LEJvdW5jZTpmdW5jdGlvbihhKXt2YXIgYixjPTQ7d2hpbGUoYTwoKGI9TWF0aC5wb3coMiwtLWMpKS0xKS8xMSk7cmV0dXJuIDEvTWF0aC5wb3coNCwzLWMpLTcuNTYyNSpNYXRoLnBvdygoYiozLTIpLzIyLWEsMil9fSksYS5lYWNoKG0sZnVuY3Rpb24oYixjKXthLmVhc2luZ1siZWFzZUluIitiXT1jLGEuZWFzaW5nWyJlYXNlT3V0IitiXT1mdW5jdGlvbihhKXtyZXR1cm4gMS1jKDEtYSl9LGEuZWFzaW5nWyJlYXNlSW5PdXQiK2JdPWZ1bmN0aW9uKGEpe3JldHVybiBhPC41P2MoYSoyKS8yOmMoYSotMisyKS8tMisxfX0pfShqUXVlcnkpOzsvKiEgalF1ZXJ5IFVJIC0gdjEuOC4yMyAtIDIwMTItMDgtMTUKLSogaHR0cHM6Ly9naXRodWIuY29tL2pxdWVyeS9qcXVlcnktdWkKLSogSW5jbHVkZXM6IGpxdWVyeS5lZmZlY3RzLmJsaW5kLmpzCi0qIENvcHlyaWdodCAoYykgMjAxMiBBVVRIT1JTLnR4dDsgTGljZW5zZWQgTUlULCBHUEwgKi8KLShmdW5jdGlvbihhLGIpe2EuZWZmZWN0cy5ibGluZD1mdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5xdWV1ZShmdW5jdGlvbigpe3ZhciBjPWEodGhpcyksZD1bInBvc2l0aW9uIiwidG9wIiwiYm90dG9tIiwibGVmdCIsInJpZ2h0Il0sZT1hLmVmZmVjdHMuc2V0TW9kZShjLGIub3B0aW9ucy5tb2RlfHwiaGlkZSIpLGY9Yi5vcHRpb25zLmRpcmVjdGlvbnx8InZlcnRpY2FsIjthLmVmZmVjdHMuc2F2ZShjLGQpLGMuc2hvdygpO3ZhciBnPWEuZWZmZWN0cy5jcmVhdGVXcmFwcGVyKGMpLmNzcyh7b3ZlcmZsb3c6ImhpZGRlbiJ9KSxoPWY9PSJ2ZXJ0aWNhbCI/ImhlaWdodCI6IndpZHRoIixpPWY9PSJ2ZXJ0aWNhbCI/Zy5oZWlnaHQoKTpnLndpZHRoKCk7ZT09InNob3ciJiZnLmNzcyhoLDApO3ZhciBqPXt9O2pbaF09ZT09InNob3ciP2k6MCxnLmFuaW1hdGUoaixiLmR1cmF0aW9uLGIub3B0aW9ucy5lYXNpbmcsZnVuY3Rpb24oKXtlPT0iaGlkZSImJmMuaGlkZSgpLGEuZWZmZWN0cy5yZXN0b3JlKGMsZCksYS5lZmZlY3RzLnJlbW92ZVdyYXBwZXIoYyksYi5jYWxsYmFjayYmYi5jYWxsYmFjay5hcHBseShjWzBdLGFyZ3VtZW50cyksYy5kZXF1ZXVlKCl9KX0pfX0pKGpRdWVyeSk7Oy8qISBqUXVlcnkgVUkgLSB2MS44LjIzIC0gMjAxMi0wOC0xNQotKiBodHRwczovL2dpdGh1Yi5jb20vanF1ZXJ5L2pxdWVyeS11aQotKiBJbmNsdWRlczoganF1ZXJ5LmVmZmVjdHMuYm91bmNlLmpzCi0qIENvcHlyaWdodCAoYykgMjAxMiBBVVRIT1JTLnR4dDsgTGljZW5zZWQgTUlULCBHUEwgKi8KLShmdW5jdGlvbihhLGIpe2EuZWZmZWN0cy5ib3VuY2U9ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMucXVldWUoZnVuY3Rpb24oKXt2YXIgYz1hKHRoaXMpLGQ9WyJwb3NpdGlvbiIsInRvcCIsImJvdHRvbSIsImxlZnQiLCJyaWdodCJdLGU9YS5lZmZlY3RzLnNldE1vZGUoYyxiLm9wdGlvbnMubW9kZXx8ImVmZmVjdCIpLGY9Yi5vcHRpb25zLmRpcmVjdGlvbnx8InVwIixnPWIub3B0aW9ucy5kaXN0YW5jZXx8MjAsaD1iLm9wdGlvbnMudGltZXN8fDUsaT1iLmR1cmF0aW9ufHwyNTA7L3Nob3d8aGlkZS8udGVzdChlKSYmZC5wdXNoKCJvcGFjaXR5IiksYS5lZmZlY3RzLnNhdmUoYyxkKSxjLnNob3coKSxhLmVmZmVjdHMuY3JlYXRlV3JhcHBlcihjKTt2YXIgaj1mPT0idXAifHxmPT0iZG93biI/InRvcCI6ImxlZnQiLGs9Zj09InVwInx8Zj09ImxlZnQiPyJwb3MiOiJuZWciLGc9Yi5vcHRpb25zLmRpc3RhbmNlfHwoaj09InRvcCI/Yy5vdXRlckhlaWdodCghMCkvMzpjLm91dGVyV2lkdGgoITApLzMpO2U9PSJzaG93IiYmYy5jc3MoIm9wYWNpdHkiLDApLmNzcyhqLGs9PSJwb3MiPy1nOmcpLGU9PSJoaWRlIiYmKGc9Zy8oaCoyKSksZSE9ImhpZGUiJiZoLS07aWYoZT09InNob3ciKXt2YXIgbD17b3BhY2l0eToxfTtsW2pdPShrPT0icG9zIj8iKz0iOiItPSIpK2csYy5hbmltYXRlKGwsaS8yLGIub3B0aW9ucy5lYXNpbmcpLGc9Zy8yLGgtLX1mb3IodmFyIG09MDttPGg7bSsrKXt2YXIgbj17fSxwPXt9O25bal09KGs9PSJwb3MiPyItPSI6Iis9IikrZyxwW2pdPShrPT0icG9zIj8iKz0iOiItPSIpK2csYy5hbmltYXRlKG4saS8yLGIub3B0aW9ucy5lYXNpbmcpLmFuaW1hdGUocCxpLzIsYi5vcHRpb25zLmVhc2luZyksZz1lPT0iaGlkZSI/ZyoyOmcvMn1pZihlPT0iaGlkZSIpe3ZhciBsPXtvcGFjaXR5OjB9O2xbal09KGs9PSJwb3MiPyItPSI6Iis9IikrZyxjLmFuaW1hdGUobCxpLzIsYi5vcHRpb25zLmVhc2luZyxmdW5jdGlvbigpe2MuaGlkZSgpLGEuZWZmZWN0cy5yZXN0b3JlKGMsZCksYS5lZmZlY3RzLnJlbW92ZVdyYXBwZXIoYyksYi5jYWxsYmFjayYmYi5jYWxsYmFjay5hcHBseSh0aGlzLGFyZ3VtZW50cyl9KX1lbHNle3ZhciBuPXt9LHA9e307bltqXT0oaz09InBvcyI/Ii09IjoiKz0iKStnLHBbal09KGs9PSJwb3MiPyIrPSI6Ii09IikrZyxjLmFuaW1hdGUobixpLzIsYi5vcHRpb25zLmVhc2luZykuYW5pbWF0ZShwLGkvMixiLm9wdGlvbnMuZWFzaW5nLGZ1bmN0aW9uKCl7YS5lZmZlY3RzLnJlc3RvcmUoYyxkKSxhLmVmZmVjdHMucmVtb3ZlV3JhcHBlcihjKSxiLmNhbGxiYWNrJiZiLmNhbGxiYWNrLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0pfWMucXVldWUoImZ4IixmdW5jdGlvbigpe2MuZGVxdWV1ZSgpfSksYy5kZXF1ZXVlKCl9KX19KShqUXVlcnkpOzsvKiEgalF1ZXJ5IFVJIC0gdjEuOC4yMyAtIDIwMTItMDgtMTUKLSogaHR0cHM6Ly9naXRodWIuY29tL2pxdWVyeS9qcXVlcnktdWkKLSogSW5jbHVkZXM6IGpxdWVyeS5lZmZlY3RzLmNsaXAuanMKLSogQ29weXJpZ2h0IChjKSAyMDEyIEFVVEhPUlMudHh0OyBMaWNlbnNlZCBNSVQsIEdQTCAqLwotKGZ1bmN0aW9uKGEsYil7YS5lZmZlY3RzLmNsaXA9ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMucXVldWUoZnVuY3Rpb24oKXt2YXIgYz1hKHRoaXMpLGQ9WyJwb3NpdGlvbiIsInRvcCIsImJvdHRvbSIsImxlZnQiLCJyaWdodCIsImhlaWdodCIsIndpZHRoIl0sZT1hLmVmZmVjdHMuc2V0TW9kZShjLGIub3B0aW9ucy5tb2RlfHwiaGlkZSIpLGY9Yi5vcHRpb25zLmRpcmVjdGlvbnx8InZlcnRpY2FsIjthLmVmZmVjdHMuc2F2ZShjLGQpLGMuc2hvdygpO3ZhciBnPWEuZWZmZWN0cy5jcmVhdGVXcmFwcGVyKGMpLmNzcyh7b3ZlcmZsb3c6ImhpZGRlbiJ9KSxoPWNbMF0udGFnTmFtZT09IklNRyI/ZzpjLGk9e3NpemU6Zj09InZlcnRpY2FsIj8iaGVpZ2h0Ijoid2lkdGgiLHBvc2l0aW9uOmY9PSJ2ZXJ0aWNhbCI/InRvcCI6ImxlZnQifSxqPWY9PSJ2ZXJ0aWNhbCI/aC5oZWlnaHQoKTpoLndpZHRoKCk7ZT09InNob3ciJiYoaC5jc3MoaS5zaXplLDApLGguY3NzKGkucG9zaXRpb24sai8yKSk7dmFyIGs9e307a1tpLnNpemVdPWU9PSJzaG93Ij9qOjAsa1tpLnBvc2l0aW9uXT1lPT0ic2hvdyI/MDpqLzIsaC5hbmltYXRlKGsse3F1ZXVlOiExLGR1cmF0aW9uOmIuZHVyYXRpb24sZWFzaW5nOmIub3B0aW9ucy5lYXNpbmcsY29tcGxldGU6ZnVuY3Rpb24oKXtlPT0iaGlkZSImJmMuaGlkZSgpLGEuZWZmZWN0cy5yZXN0b3JlKGMsZCksYS5lZmZlY3RzLnJlbW92ZVdyYXBwZXIoYyksYi5jYWxsYmFjayYmYi5jYWxsYmFjay5hcHBseShjWzBdLGFyZ3VtZW50cyksYy5kZXF1ZXVlKCl9fSl9KX19KShqUXVlcnkpOzsvKiEgalF1ZXJ5IFVJIC0gdjEuOC4yMyAtIDIwMTItMDgtMTUKLSogaHR0cHM6Ly9naXRodWIuY29tL2pxdWVyeS9qcXVlcnktdWkKLSogSW5jbHVkZXM6IGpxdWVyeS5lZmZlY3RzLmRyb3AuanMKLSogQ29weXJpZ2h0IChjKSAyMDEyIEFVVEhPUlMudHh0OyBMaWNlbnNlZCBNSVQsIEdQTCAqLwotKGZ1bmN0aW9uKGEsYil7YS5lZmZlY3RzLmRyb3A9ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMucXVldWUoZnVuY3Rpb24oKXt2YXIgYz1hKHRoaXMpLGQ9WyJwb3NpdGlvbiIsInRvcCIsImJvdHRvbSIsImxlZnQiLCJyaWdodCIsIm9wYWNpdHkiXSxlPWEuZWZmZWN0cy5zZXRNb2RlKGMsYi5vcHRpb25zLm1vZGV8fCJoaWRlIiksZj1iLm9wdGlvbnMuZGlyZWN0aW9ufHwibGVmdCI7YS5lZmZlY3RzLnNhdmUoYyxkKSxjLnNob3coKSxhLmVmZmVjdHMuY3JlYXRlV3JhcHBlcihjKTt2YXIgZz1mPT0idXAifHxmPT0iZG93biI/InRvcCI6ImxlZnQiLGg9Zj09InVwInx8Zj09ImxlZnQiPyJwb3MiOiJuZWciLGk9Yi5vcHRpb25zLmRpc3RhbmNlfHwoZz09InRvcCI/Yy5vdXRlckhlaWdodCghMCkvMjpjLm91dGVyV2lkdGgoITApLzIpO2U9PSJzaG93IiYmYy5jc3MoIm9wYWNpdHkiLDApLmNzcyhnLGg9PSJwb3MiPy1pOmkpO3ZhciBqPXtvcGFjaXR5OmU9PSJzaG93Ij8xOjB9O2pbZ109KGU9PSJzaG93Ij9oPT0icG9zIj8iKz0iOiItPSI6aD09InBvcyI/Ii09IjoiKz0iKStpLGMuYW5pbWF0ZShqLHtxdWV1ZTohMSxkdXJhdGlvbjpiLmR1cmF0aW9uLGVhc2luZzpiLm9wdGlvbnMuZWFzaW5nLGNvbXBsZXRlOmZ1bmN0aW9uKCl7ZT09ImhpZGUiJiZjLmhpZGUoKSxhLmVmZmVjdHMucmVzdG9yZShjLGQpLGEuZWZmZWN0cy5yZW1vdmVXcmFwcGVyKGMpLGIuY2FsbGJhY2smJmIuY2FsbGJhY2suYXBwbHkodGhpcyxhcmd1bWVudHMpLGMuZGVxdWV1ZSgpfX0pfSl9fSkoalF1ZXJ5KTs7LyohIGpRdWVyeSBVSSAtIHYxLjguMjMgLSAyMDEyLTA4LTE1Ci0qIGh0dHBzOi8vZ2l0aHViLmNvbS9qcXVlcnkvanF1ZXJ5LXVpCi0qIEluY2x1ZGVzOiBqcXVlcnkuZWZmZWN0cy5leHBsb2RlLmpzCi0qIENvcHlyaWdodCAoYykgMjAxMiBBVVRIT1JTLnR4dDsgTGljZW5zZWQgTUlULCBHUEwgKi8KLShmdW5jdGlvbihhLGIpe2EuZWZmZWN0cy5leHBsb2RlPWZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLnF1ZXVlKGZ1bmN0aW9uKCl7dmFyIGM9Yi5vcHRpb25zLnBpZWNlcz9NYXRoLnJvdW5kKE1hdGguc3FydChiLm9wdGlvbnMucGllY2VzKSk6MyxkPWIub3B0aW9ucy5waWVjZXM/TWF0aC5yb3VuZChNYXRoLnNxcnQoYi5vcHRpb25zLnBpZWNlcykpOjM7Yi5vcHRpb25zLm1vZGU9Yi5vcHRpb25zLm1vZGU9PSJ0b2dnbGUiP2EodGhpcykuaXMoIjp2aXNpYmxlIik/ImhpZGUiOiJzaG93IjpiLm9wdGlvbnMubW9kZTt2YXIgZT1hKHRoaXMpLnNob3coKS5jc3MoInZpc2liaWxpdHkiLCJoaWRkZW4iKSxmPWUub2Zmc2V0KCk7Zi50b3AtPXBhcnNlSW50KGUuY3NzKCJtYXJnaW5Ub3AiKSwxMCl8fDAsZi5sZWZ0LT1wYXJzZUludChlLmNzcygibWFyZ2luTGVmdCIpLDEwKXx8MDt2YXIgZz1lLm91dGVyV2lkdGgoITApLGg9ZS5vdXRlckhlaWdodCghMCk7Zm9yKHZhciBpPTA7aTxjO2krKylmb3IodmFyIGo9MDtqPGQ7aisrKWUuY2xvbmUoKS5hcHBlbmRUbygiYm9keSIpLndyYXAoIjxkaXY+PC9kaXY+IikuY3NzKHtwb3NpdGlvbjoiYWJzb2x1dGUiLHZpc2liaWxpdHk6InZpc2libGUiLGxlZnQ6LWoqKGcvZCksdG9wOi1pKihoL2MpfSkucGFyZW50KCkuYWRkQ2xhc3MoInVpLWVmZmVjdHMtZXhwbG9kZSIpLmNzcyh7cG9zaXRpb246ImFic29sdXRlIixvdmVyZmxvdzoiaGlkZGVuIix3aWR0aDpnL2QsaGVpZ2h0OmgvYyxsZWZ0OmYubGVmdCtqKihnL2QpKyhiLm9wdGlvbnMubW9kZT09InNob3ciPyhqLU1hdGguZmxvb3IoZC8yKSkqKGcvZCk6MCksdG9wOmYudG9wK2kqKGgvYykrKGIub3B0aW9ucy5tb2RlPT0ic2hvdyI/KGktTWF0aC5mbG9vcihjLzIpKSooaC9jKTowKSxvcGFjaXR5OmIub3B0aW9ucy5tb2RlPT0ic2hvdyI/MDoxfSkuYW5pbWF0ZSh7bGVmdDpmLmxlZnQraiooZy9kKSsoYi5vcHRpb25zLm1vZGU9PSJzaG93Ij8wOihqLU1hdGguZmxvb3IoZC8yKSkqKGcvZCkpLHRvcDpmLnRvcCtpKihoL2MpKyhiLm9wdGlvbnMubW9kZT09InNob3ciPzA6KGktTWF0aC5mbG9vcihjLzIpKSooaC9jKSksb3BhY2l0eTpiLm9wdGlvbnMubW9kZT09InNob3ciPzE6MH0sYi5kdXJhdGlvbnx8NTAwKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Yi5vcHRpb25zLm1vZGU9PSJzaG93Ij9lLmNzcyh7dmlzaWJpbGl0eToidmlzaWJsZSJ9KTplLmNzcyh7dmlzaWJpbGl0eToidmlzaWJsZSJ9KS5oaWRlKCksYi5jYWxsYmFjayYmYi5jYWxsYmFjay5hcHBseShlWzBdKSxlLmRlcXVldWUoKSxhKCJkaXYudWktZWZmZWN0cy1leHBsb2RlIikucmVtb3ZlKCl9LGIuZHVyYXRpb258fDUwMCl9KX19KShqUXVlcnkpOzsvKiEgalF1ZXJ5IFVJIC0gdjEuOC4yMyAtIDIwMTItMDgtMTUKLSogaHR0cHM6Ly9naXRodWIuY29tL2pxdWVyeS9qcXVlcnktdWkKLSogSW5jbHVkZXM6IGpxdWVyeS5lZmZlY3RzLmZhZGUuanMKLSogQ29weXJpZ2h0IChjKSAyMDEyIEFVVEhPUlMudHh0OyBMaWNlbnNlZCBNSVQsIEdQTCAqLwotKGZ1bmN0aW9uKGEsYil7YS5lZmZlY3RzLmZhZGU9ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMucXVldWUoZnVuY3Rpb24oKXt2YXIgYz1hKHRoaXMpLGQ9YS5lZmZlY3RzLnNldE1vZGUoYyxiLm9wdGlvbnMubW9kZXx8ImhpZGUiKTtjLmFuaW1hdGUoe29wYWNpdHk6ZH0se3F1ZXVlOiExLGR1cmF0aW9uOmIuZHVyYXRpb24sZWFzaW5nOmIub3B0aW9ucy5lYXNpbmcsY29tcGxldGU6ZnVuY3Rpb24oKXtiLmNhbGxiYWNrJiZiLmNhbGxiYWNrLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxjLmRlcXVldWUoKX19KX0pfX0pKGpRdWVyeSk7Oy8qISBqUXVlcnkgVUkgLSB2MS44LjIzIC0gMjAxMi0wOC0xNQotKiBodHRwczovL2dpdGh1Yi5jb20vanF1ZXJ5L2pxdWVyeS11aQotKiBJbmNsdWRlczoganF1ZXJ5LmVmZmVjdHMuZm9sZC5qcwotKiBDb3B5cmlnaHQgKGMpIDIwMTIgQVVUSE9SUy50eHQ7IExpY2Vuc2VkIE1JVCwgR1BMICovCi0oZnVuY3Rpb24oYSxiKXthLmVmZmVjdHMuZm9sZD1mdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5xdWV1ZShmdW5jdGlvbigpe3ZhciBjPWEodGhpcyksZD1bInBvc2l0aW9uIiwidG9wIiwiYm90dG9tIiwibGVmdCIsInJpZ2h0Il0sZT1hLmVmZmVjdHMuc2V0TW9kZShjLGIub3B0aW9ucy5tb2RlfHwiaGlkZSIpLGY9Yi5vcHRpb25zLnNpemV8fDE1LGc9ISFiLm9wdGlvbnMuaG9yaXpGaXJzdCxoPWIuZHVyYXRpb24/Yi5kdXJhdGlvbi8yOmEuZnguc3BlZWRzLl9kZWZhdWx0LzI7YS5lZmZlY3RzLnNhdmUoYyxkKSxjLnNob3coKTt2YXIgaT1hLmVmZmVjdHMuY3JlYXRlV3JhcHBlcihjKS5jc3Moe292ZXJmbG93OiJoaWRkZW4ifSksaj1lPT0ic2hvdyIhPWcsaz1qP1sid2lkdGgiLCJoZWlnaHQiXTpbImhlaWdodCIsIndpZHRoIl0sbD1qP1tpLndpZHRoKCksaS5oZWlnaHQoKV06W2kuaGVpZ2h0KCksaS53aWR0aCgpXSxtPS8oWzAtOV0rKSUvLmV4ZWMoZik7bSYmKGY9cGFyc2VJbnQobVsxXSwxMCkvMTAwKmxbZT09ImhpZGUiPzA6MV0pLGU9PSJzaG93IiYmaS5jc3MoZz97aGVpZ2h0OjAsd2lkdGg6Zn06e2hlaWdodDpmLHdpZHRoOjB9KTt2YXIgbj17fSxwPXt9O25ba1swXV09ZT09InNob3ciP2xbMF06ZixwW2tbMV1dPWU9PSJzaG93Ij9sWzFdOjAsaS5hbmltYXRlKG4saCxiLm9wdGlvbnMuZWFzaW5nKS5hbmltYXRlKHAsaCxiLm9wdGlvbnMuZWFzaW5nLGZ1bmN0aW9uKCl7ZT09ImhpZGUiJiZjLmhpZGUoKSxhLmVmZmVjdHMucmVzdG9yZShjLGQpLGEuZWZmZWN0cy5yZW1vdmVXcmFwcGVyKGMpLGIuY2FsbGJhY2smJmIuY2FsbGJhY2suYXBwbHkoY1swXSxhcmd1bWVudHMpLGMuZGVxdWV1ZSgpfSl9KX19KShqUXVlcnkpOzsvKiEgalF1ZXJ5IFVJIC0gdjEuOC4yMyAtIDIwMTItMDgtMTUKLSogaHR0cHM6Ly9naXRodWIuY29tL2pxdWVyeS9qcXVlcnktdWkKLSogSW5jbHVkZXM6IGpxdWVyeS5lZmZlY3RzLmhpZ2hsaWdodC5qcwotKiBDb3B5cmlnaHQgKGMpIDIwMTIgQVVUSE9SUy50eHQ7IExpY2Vuc2VkIE1JVCwgR1BMICovCi0oZnVuY3Rpb24oYSxiKXthLmVmZmVjdHMuaGlnaGxpZ2h0PWZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLnF1ZXVlKGZ1bmN0aW9uKCl7dmFyIGM9YSh0aGlzKSxkPVsiYmFja2dyb3VuZEltYWdlIiwiYmFja2dyb3VuZENvbG9yIiwib3BhY2l0eSJdLGU9YS5lZmZlY3RzLnNldE1vZGUoYyxiLm9wdGlvbnMubW9kZXx8InNob3ciKSxmPXtiYWNrZ3JvdW5kQ29sb3I6Yy5jc3MoImJhY2tncm91bmRDb2xvciIpfTtlPT0iaGlkZSImJihmLm9wYWNpdHk9MCksYS5lZmZlY3RzLnNhdmUoYyxkKSxjLnNob3coKS5jc3Moe2JhY2tncm91bmRJbWFnZToibm9uZSIsYmFja2dyb3VuZENvbG9yOmIub3B0aW9ucy5jb2xvcnx8IiNmZmZmOTkifSkuYW5pbWF0ZShmLHtxdWV1ZTohMSxkdXJhdGlvbjpiLmR1cmF0aW9uLGVhc2luZzpiLm9wdGlvbnMuZWFzaW5nLGNvbXBsZXRlOmZ1bmN0aW9uKCl7ZT09ImhpZGUiJiZjLmhpZGUoKSxhLmVmZmVjdHMucmVzdG9yZShjLGQpLGU9PSJzaG93IiYmIWEuc3VwcG9ydC5vcGFjaXR5JiZ0aGlzLnN0eWxlLnJlbW92ZUF0dHJpYnV0ZSgiZmlsdGVyIiksYi5jYWxsYmFjayYmYi5jYWxsYmFjay5hcHBseSh0aGlzLGFyZ3VtZW50cyksYy5kZXF1ZXVlKCl9fSl9KX19KShqUXVlcnkpOzsvKiEgalF1ZXJ5IFVJIC0gdjEuOC4yMyAtIDIwMTItMDgtMTUKLSogaHR0cHM6Ly9naXRodWIuY29tL2pxdWVyeS9qcXVlcnktdWkKLSogSW5jbHVkZXM6IGpxdWVyeS5lZmZlY3RzLnB1bHNhdGUuanMKLSogQ29weXJpZ2h0IChjKSAyMDEyIEFVVEhPUlMudHh0OyBMaWNlbnNlZCBNSVQsIEdQTCAqLwotKGZ1bmN0aW9uKGEsYil7YS5lZmZlY3RzLnB1bHNhdGU9ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMucXVldWUoZnVuY3Rpb24oKXt2YXIgYz1hKHRoaXMpLGQ9YS5lZmZlY3RzLnNldE1vZGUoYyxiLm9wdGlvbnMubW9kZXx8InNob3ciKSxlPShiLm9wdGlvbnMudGltZXN8fDUpKjItMSxmPWIuZHVyYXRpb24/Yi5kdXJhdGlvbi8yOmEuZnguc3BlZWRzLl9kZWZhdWx0LzIsZz1jLmlzKCI6dmlzaWJsZSIpLGg9MDtnfHwoYy5jc3MoIm9wYWNpdHkiLDApLnNob3coKSxoPTEpLChkPT0iaGlkZSImJmd8fGQ9PSJzaG93IiYmIWcpJiZlLS07Zm9yKHZhciBpPTA7aTxlO2krKyljLmFuaW1hdGUoe29wYWNpdHk6aH0sZixiLm9wdGlvbnMuZWFzaW5nKSxoPShoKzEpJTI7Yy5hbmltYXRlKHtvcGFjaXR5Omh9LGYsYi5vcHRpb25zLmVhc2luZyxmdW5jdGlvbigpe2g9PTAmJmMuaGlkZSgpLGIuY2FsbGJhY2smJmIuY2FsbGJhY2suYXBwbHkodGhpcyxhcmd1bWVudHMpfSksYy5xdWV1ZSgiZngiLGZ1bmN0aW9uKCl7Yy5kZXF1ZXVlKCl9KS5kZXF1ZXVlKCl9KX19KShqUXVlcnkpOzsvKiEgalF1ZXJ5IFVJIC0gdjEuOC4yMyAtIDIwMTItMDgtMTUKLSogaHR0cHM6Ly9naXRodWIuY29tL2pxdWVyeS9qcXVlcnktdWkKLSogSW5jbHVkZXM6IGpxdWVyeS5lZmZlY3RzLnNjYWxlLmpzCi0qIENvcHlyaWdodCAoYykgMjAxMiBBVVRIT1JTLnR4dDsgTGljZW5zZWQgTUlULCBHUEwgKi8KLShmdW5jdGlvbihhLGIpe2EuZWZmZWN0cy5wdWZmPWZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLnF1ZXVlKGZ1bmN0aW9uKCl7dmFyIGM9YSh0aGlzKSxkPWEuZWZmZWN0cy5zZXRNb2RlKGMsYi5vcHRpb25zLm1vZGV8fCJoaWRlIiksZT1wYXJzZUludChiLm9wdGlvbnMucGVyY2VudCwxMCl8fDE1MCxmPWUvMTAwLGc9e2hlaWdodDpjLmhlaWdodCgpLHdpZHRoOmMud2lkdGgoKX07YS5leHRlbmQoYi5vcHRpb25zLHtmYWRlOiEwLG1vZGU6ZCxwZXJjZW50OmQ9PSJoaWRlIj9lOjEwMCxmcm9tOmQ9PSJoaWRlIj9nOntoZWlnaHQ6Zy5oZWlnaHQqZix3aWR0aDpnLndpZHRoKmZ9fSksYy5lZmZlY3QoInNjYWxlIixiLm9wdGlvbnMsYi5kdXJhdGlvbixiLmNhbGxiYWNrKSxjLmRlcXVldWUoKX0pfSxhLmVmZmVjdHMuc2NhbGU9ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMucXVldWUoZnVuY3Rpb24oKXt2YXIgYz1hKHRoaXMpLGQ9YS5leHRlbmQoITAse30sYi5vcHRpb25zKSxlPWEuZWZmZWN0cy5zZXRNb2RlKGMsYi5vcHRpb25zLm1vZGV8fCJlZmZlY3QiKSxmPXBhcnNlSW50KGIub3B0aW9ucy5wZXJjZW50LDEwKXx8KHBhcnNlSW50KGIub3B0aW9ucy5wZXJjZW50LDEwKT09MD8wOmU9PSJoaWRlIj8wOjEwMCksZz1iLm9wdGlvbnMuZGlyZWN0aW9ufHwiYm90aCIsaD1iLm9wdGlvbnMub3JpZ2luO2UhPSJlZmZlY3QiJiYoZC5vcmlnaW49aHx8WyJtaWRkbGUiLCJjZW50ZXIiXSxkLnJlc3RvcmU9ITApO3ZhciBpPXtoZWlnaHQ6Yy5oZWlnaHQoKSx3aWR0aDpjLndpZHRoKCl9O2MuZnJvbT1iLm9wdGlvbnMuZnJvbXx8KGU9PSJzaG93Ij97aGVpZ2h0OjAsd2lkdGg6MH06aSk7dmFyIGo9e3k6ZyE9Imhvcml6b250YWwiP2YvMTAwOjEseDpnIT0idmVydGljYWwiP2YvMTAwOjF9O2MudG89e2hlaWdodDppLmhlaWdodCpqLnksd2lkdGg6aS53aWR0aCpqLnh9LGIub3B0aW9ucy5mYWRlJiYoZT09InNob3ciJiYoYy5mcm9tLm9wYWNpdHk9MCxjLnRvLm9wYWNpdHk9MSksZT09ImhpZGUiJiYoYy5mcm9tLm9wYWNpdHk9MSxjLnRvLm9wYWNpdHk9MCkpLGQuZnJvbT1jLmZyb20sZC50bz1jLnRvLGQubW9kZT1lLGMuZWZmZWN0KCJzaXplIixkLGIuZHVyYXRpb24sYi5jYWxsYmFjayksYy5kZXF1ZXVlKCl9KX0sYS5lZmZlY3RzLnNpemU9ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMucXVldWUoZnVuY3Rpb24oKXt2YXIgYz1hKHRoaXMpLGQ9WyJwb3NpdGlvbiIsInRvcCIsImJvdHRvbSIsImxlZnQiLCJyaWdodCIsIndpZHRoIiwiaGVpZ2h0Iiwib3ZlcmZsb3ciLCJvcGFjaXR5Il0sZT1bInBvc2l0aW9uIiwidG9wIiwiYm90dG9tIiwibGVmdCIsInJpZ2h0Iiwib3ZlcmZsb3ciLCJvcGFjaXR5Il0sZj1bIndpZHRoIiwiaGVpZ2h0Iiwib3ZlcmZsb3ciXSxnPVsiZm9udFNpemUiXSxoPVsiYm9yZGVyVG9wV2lkdGgiLCJib3JkZXJCb3R0b21XaWR0aCIsInBhZGRpbmdUb3AiLCJwYWRkaW5nQm90dG9tIl0saT1bImJvcmRlckxlZnRXaWR0aCIsImJvcmRlclJpZ2h0V2lkdGgiLCJwYWRkaW5nTGVmdCIsInBhZGRpbmdSaWdodCJdLGo9YS5lZmZlY3RzLnNldE1vZGUoYyxiLm9wdGlvbnMubW9kZXx8ImVmZmVjdCIpLGs9Yi5vcHRpb25zLnJlc3RvcmV8fCExLGw9Yi5vcHRpb25zLnNjYWxlfHwiYm90aCIsbT1iLm9wdGlvbnMub3JpZ2luLG49e2hlaWdodDpjLmhlaWdodCgpLHdpZHRoOmMud2lkdGgoKX07Yy5mcm9tPWIub3B0aW9ucy5mcm9tfHxuLGMudG89Yi5vcHRpb25zLnRvfHxuO2lmKG0pe3ZhciBwPWEuZWZmZWN0cy5nZXRCYXNlbGluZShtLG4pO2MuZnJvbS50b3A9KG4uaGVpZ2h0LWMuZnJvbS5oZWlnaHQpKnAueSxjLmZyb20ubGVmdD0obi53aWR0aC1jLmZyb20ud2lkdGgpKnAueCxjLnRvLnRvcD0obi5oZWlnaHQtYy50by5oZWlnaHQpKnAueSxjLnRvLmxlZnQ9KG4ud2lkdGgtYy50by53aWR0aCkqcC54fXZhciBxPXtmcm9tOnt5OmMuZnJvbS5oZWlnaHQvbi5oZWlnaHQseDpjLmZyb20ud2lkdGgvbi53aWR0aH0sdG86e3k6Yy50by5oZWlnaHQvbi5oZWlnaHQseDpjLnRvLndpZHRoL24ud2lkdGh9fTtpZihsPT0iYm94Inx8bD09ImJvdGgiKXEuZnJvbS55IT1xLnRvLnkmJihkPWQuY29uY2F0KGgpLGMuZnJvbT1hLmVmZmVjdHMuc2V0VHJhbnNpdGlvbihjLGgscS5mcm9tLnksYy5mcm9tKSxjLnRvPWEuZWZmZWN0cy5zZXRUcmFuc2l0aW9uKGMsaCxxLnRvLnksYy50bykpLHEuZnJvbS54IT1xLnRvLngmJihkPWQuY29uY2F0KGkpLGMuZnJvbT1hLmVmZmVjdHMuc2V0VHJhbnNpdGlvbihjLGkscS5mcm9tLngsYy5mcm9tKSxjLnRvPWEuZWZmZWN0cy5zZXRUcmFuc2l0aW9uKGMsaSxxLnRvLngsYy50bykpOyhsPT0iY29udGVudCJ8fGw9PSJib3RoIikmJnEuZnJvbS55IT1xLnRvLnkmJihkPWQuY29uY2F0KGcpLGMuZnJvbT1hLmVmZmVjdHMuc2V0VHJhbnNpdGlvbihjLGcscS5mcm9tLnksYy5mcm9tKSxjLnRvPWEuZWZmZWN0cy5zZXRUcmFuc2l0aW9uKGMsZyxxLnRvLnksYy50bykpLGEuZWZmZWN0cy5zYXZlKGMsaz9kOmUpLGMuc2hvdygpLGEuZWZmZWN0cy5jcmVhdGVXcmFwcGVyKGMpLGMuY3NzKCJvdmVyZmxvdyIsImhpZGRlbiIpLmNzcyhjLmZyb20pO2lmKGw9PSJjb250ZW50Inx8bD09ImJvdGgiKWg9aC5jb25jYXQoWyJtYXJnaW5Ub3AiLCJtYXJnaW5Cb3R0b20iXSkuY29uY2F0KGcpLGk9aS5jb25jYXQoWyJtYXJnaW5MZWZ0IiwibWFyZ2luUmlnaHQiXSksZj1kLmNvbmNhdChoKS5jb25jYXQoaSksYy5maW5kKCIqW3dpZHRoXSIpLmVhY2goZnVuY3Rpb24oKXt2YXIgYz1hKHRoaXMpO2smJmEuZWZmZWN0cy5zYXZlKGMsZik7dmFyIGQ9e2hlaWdodDpjLmhlaWdodCgpLHdpZHRoOmMud2lkdGgoKX07Yy5mcm9tPXtoZWlnaHQ6ZC5oZWlnaHQqcS5mcm9tLnksd2lkdGg6ZC53aWR0aCpxLmZyb20ueH0sYy50bz17aGVpZ2h0OmQuaGVpZ2h0KnEudG8ueSx3aWR0aDpkLndpZHRoKnEudG8ueH0scS5mcm9tLnkhPXEudG8ueSYmKGMuZnJvbT1hLmVmZmVjdHMuc2V0VHJhbnNpdGlvbihjLGgscS5mcm9tLnksYy5mcm9tKSxjLnRvPWEuZWZmZWN0cy5zZXRUcmFuc2l0aW9uKGMsaCxxLnRvLnksYy50bykpLHEuZnJvbS54IT1xLnRvLngmJihjLmZyb209YS5lZmZlY3RzLnNldFRyYW5zaXRpb24oYyxpLHEuZnJvbS54LGMuZnJvbSksYy50bz1hLmVmZmVjdHMuc2V0VHJhbnNpdGlvbihjLGkscS50by54LGMudG8pKSxjLmNzcyhjLmZyb20pLGMuYW5pbWF0ZShjLnRvLGIuZHVyYXRpb24sYi5vcHRpb25zLmVhc2luZyxmdW5jdGlvbigpe2smJmEuZWZmZWN0cy5yZXN0b3JlKGMsZil9KX0pO2MuYW5pbWF0ZShjLnRvLHtxdWV1ZTohMSxkdXJhdGlvbjpiLmR1cmF0aW9uLGVhc2luZzpiLm9wdGlvbnMuZWFzaW5nLGNvbXBsZXRlOmZ1bmN0aW9uKCl7Yy50by5vcGFjaXR5PT09MCYmYy5jc3MoIm9wYWNpdHkiLGMuZnJvbS5vcGFjaXR5KSxqPT0iaGlkZSImJmMuaGlkZSgpLGEuZWZmZWN0cy5yZXN0b3JlKGMsaz9kOmUpLGEuZWZmZWN0cy5yZW1vdmVXcmFwcGVyKGMpLGIuY2FsbGJhY2smJmIuY2FsbGJhY2suYXBwbHkodGhpcyxhcmd1bWVudHMpLGMuZGVxdWV1ZSgpfX0pfSl9fSkoalF1ZXJ5KTs7LyohIGpRdWVyeSBVSSAtIHYxLjguMjMgLSAyMDEyLTA4LTE1Ci0qIGh0dHBzOi8vZ2l0aHViLmNvbS9qcXVlcnkvanF1ZXJ5LXVpCi0qIEluY2x1ZGVzOiBqcXVlcnkuZWZmZWN0cy5zaGFrZS5qcwotKiBDb3B5cmlnaHQgKGMpIDIwMTIgQVVUSE9SUy50eHQ7IExpY2Vuc2VkIE1JVCwgR1BMICovCi0oZnVuY3Rpb24oYSxiKXthLmVmZmVjdHMuc2hha2U9ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMucXVldWUoZnVuY3Rpb24oKXt2YXIgYz1hKHRoaXMpLGQ9WyJwb3NpdGlvbiIsInRvcCIsImJvdHRvbSIsImxlZnQiLCJyaWdodCJdLGU9YS5lZmZlY3RzLnNldE1vZGUoYyxiLm9wdGlvbnMubW9kZXx8ImVmZmVjdCIpLGY9Yi5vcHRpb25zLmRpcmVjdGlvbnx8ImxlZnQiLGc9Yi5vcHRpb25zLmRpc3RhbmNlfHwyMCxoPWIub3B0aW9ucy50aW1lc3x8MyxpPWIuZHVyYXRpb258fGIub3B0aW9ucy5kdXJhdGlvbnx8MTQwO2EuZWZmZWN0cy5zYXZlKGMsZCksYy5zaG93KCksYS5lZmZlY3RzLmNyZWF0ZVdyYXBwZXIoYyk7dmFyIGo9Zj09InVwInx8Zj09ImRvd24iPyJ0b3AiOiJsZWZ0IixrPWY9PSJ1cCJ8fGY9PSJsZWZ0Ij8icG9zIjoibmVnIixsPXt9LG09e30sbj17fTtsW2pdPShrPT0icG9zIj8iLT0iOiIrPSIpK2csbVtqXT0oaz09InBvcyI/Iis9IjoiLT0iKStnKjIsbltqXT0oaz09InBvcyI/Ii09IjoiKz0iKStnKjIsYy5hbmltYXRlKGwsaSxiLm9wdGlvbnMuZWFzaW5nKTtmb3IodmFyIHA9MTtwPGg7cCsrKWMuYW5pbWF0ZShtLGksYi5vcHRpb25zLmVhc2luZykuYW5pbWF0ZShuLGksYi5vcHRpb25zLmVhc2luZyk7Yy5hbmltYXRlKG0saSxiLm9wdGlvbnMuZWFzaW5nKS5hbmltYXRlKGwsaS8yLGIub3B0aW9ucy5lYXNpbmcsZnVuY3Rpb24oKXthLmVmZmVjdHMucmVzdG9yZShjLGQpLGEuZWZmZWN0cy5yZW1vdmVXcmFwcGVyKGMpLGIuY2FsbGJhY2smJmIuY2FsbGJhY2suYXBwbHkodGhpcyxhcmd1bWVudHMpfSksYy5xdWV1ZSgiZngiLGZ1bmN0aW9uKCl7Yy5kZXF1ZXVlKCl9KSxjLmRlcXVldWUoKX0pfX0pKGpRdWVyeSk7Oy8qISBqUXVlcnkgVUkgLSB2MS44LjIzIC0gMjAxMi0wOC0xNQotKiBodHRwczovL2dpdGh1Yi5jb20vanF1ZXJ5L2pxdWVyeS11aQotKiBJbmNsdWRlczoganF1ZXJ5LmVmZmVjdHMuc2xpZGUuanMKLSogQ29weXJpZ2h0IChjKSAyMDEyIEFVVEhPUlMudHh0OyBMaWNlbnNlZCBNSVQsIEdQTCAqLwotKGZ1bmN0aW9uKGEsYil7YS5lZmZlY3RzLnNsaWRlPWZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLnF1ZXVlKGZ1bmN0aW9uKCl7dmFyIGM9YSh0aGlzKSxkPVsicG9zaXRpb24iLCJ0b3AiLCJib3R0b20iLCJsZWZ0IiwicmlnaHQiXSxlPWEuZWZmZWN0cy5zZXRNb2RlKGMsYi5vcHRpb25zLm1vZGV8fCJzaG93IiksZj1iLm9wdGlvbnMuZGlyZWN0aW9ufHwibGVmdCI7YS5lZmZlY3RzLnNhdmUoYyxkKSxjLnNob3coKSxhLmVmZmVjdHMuY3JlYXRlV3JhcHBlcihjKS5jc3Moe292ZXJmbG93OiJoaWRkZW4ifSk7dmFyIGc9Zj09InVwInx8Zj09ImRvd24iPyJ0b3AiOiJsZWZ0IixoPWY9PSJ1cCJ8fGY9PSJsZWZ0Ij8icG9zIjoibmVnIixpPWIub3B0aW9ucy5kaXN0YW5jZXx8KGc9PSJ0b3AiP2Mub3V0ZXJIZWlnaHQoITApOmMub3V0ZXJXaWR0aCghMCkpO2U9PSJzaG93IiYmYy5jc3MoZyxoPT0icG9zIj9pc05hTihpKT8iLSIraTotaTppKTt2YXIgaj17fTtqW2ddPShlPT0ic2hvdyI/aD09InBvcyI/Iis9IjoiLT0iOmg9PSJwb3MiPyItPSI6Iis9IikraSxjLmFuaW1hdGUoaix7cXVldWU6ITEsZHVyYXRpb246Yi5kdXJhdGlvbixlYXNpbmc6Yi5vcHRpb25zLmVhc2luZyxjb21wbGV0ZTpmdW5jdGlvbigpe2U9PSJoaWRlIiYmYy5oaWRlKCksYS5lZmZlY3RzLnJlc3RvcmUoYyxkKSxhLmVmZmVjdHMucmVtb3ZlV3JhcHBlcihjKSxiLmNhbGxiYWNrJiZiLmNhbGxiYWNrLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxjLmRlcXVldWUoKX19KX0pfX0pKGpRdWVyeSk7Oy8qISBqUXVlcnkgVUkgLSB2MS44LjIzIC0gMjAxMi0wOC0xNQotKiBodHRwczovL2dpdGh1Yi5jb20vanF1ZXJ5L2pxdWVyeS11aQotKiBJbmNsdWRlczoganF1ZXJ5LmVmZmVjdHMudHJhbnNmZXIuanMKLSogQ29weXJpZ2h0IChjKSAyMDEyIEFVVEhPUlMudHh0OyBMaWNlbnNlZCBNSVQsIEdQTCAqLwotKGZ1bmN0aW9uKGEsYil7YS5lZmZlY3RzLnRyYW5zZmVyPWZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLnF1ZXVlKGZ1bmN0aW9uKCl7dmFyIGM9YSh0aGlzKSxkPWEoYi5vcHRpb25zLnRvKSxlPWQub2Zmc2V0KCksZj17dG9wOmUudG9wLGxlZnQ6ZS5sZWZ0LGhlaWdodDpkLmlubmVySGVpZ2h0KCksd2lkdGg6ZC5pbm5lcldpZHRoKCl9LGc9Yy5vZmZzZXQoKSxoPWEoJzxkaXYgY2xhc3M9InVpLWVmZmVjdHMtdHJhbnNmZXIiPjwvZGl2PicpLmFwcGVuZFRvKGRvY3VtZW50LmJvZHkpLmFkZENsYXNzKGIub3B0aW9ucy5jbGFzc05hbWUpLmNzcyh7dG9wOmcudG9wLGxlZnQ6Zy5sZWZ0LGhlaWdodDpjLmlubmVySGVpZ2h0KCksd2lkdGg6Yy5pbm5lcldpZHRoKCkscG9zaXRpb246ImFic29sdXRlIn0pLmFuaW1hdGUoZixiLmR1cmF0aW9uLGIub3B0aW9ucy5lYXNpbmcsZnVuY3Rpb24oKXtoLnJlbW92ZSgpLGIuY2FsbGJhY2smJmIuY2FsbGJhY2suYXBwbHkoY1swXSxhcmd1bWVudHMpLGMuZGVxdWV1ZSgpfSl9KX19KShqUXVlcnkpOzsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9qcy9kb2NzLmpzIGIvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvanMvZG9jcy5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDBjMTJhOC4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9qcy9kb2NzLmpzCisrKyAvZGV2L251bGwKQEAgLTEsMjYwOSArMCwwIEBACi12YXIgY2xhc3Nlc05hdjsKLXZhciBkZXZkb2NOYXY7Ci12YXIgc2lkZW5hdjsKLXZhciBjb29raWVfbmFtZXNwYWNlID0gJ2FuZHJvaWRfZGV2ZWxvcGVyJzsKLXZhciBOQVZfUFJFRl9UUkVFID0gInRyZWUiOwotdmFyIE5BVl9QUkVGX1BBTkVMUyA9ICJwYW5lbHMiOwotdmFyIG5hdl9wcmVmOwotdmFyIGlzTW9iaWxlID0gZmFsc2U7IC8vIHRydWUgaWYgbW9iaWxlLCBzbyB3ZSBjYW4gYWRqdXN0IHNvbWUgbGF5b3V0Ci0KLXZhciBiYXNlUGF0aCA9IGdldEJhc2VVcmkobG9jYXRpb24ucGF0aG5hbWUpOwotdmFyIFNJVEVfUk9PVCA9IHRvUm9vdCArIGJhc2VQYXRoLnN1YnN0cmluZygxLGJhc2VQYXRoLmluZGV4T2YoIi8iLDEpKTsKLXZhciBHT09HTEVfREFUQTsgLy8gY29tYmluZWQgZGF0YSBmb3IgZ29vZ2xlIHNlcnZpY2UgYXBpcywgdXNlZCBmb3Igc2VhcmNoIHN1Z2dlc3QKLQotCi0vKioqKioqICBPTiBMT0FEIFNFVCBVUCBTVFVGRiAqKioqKioqKiovCi0KLXZhciBuYXZCYXJJc0ZpeGVkID0gZmFsc2U7Ci0kKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpIHsKLQotICAvLyBsb2FkIGpzb24gZmlsZSBmb3IgQW5kcm9pZCBBUEkgc2VhcmNoIHN1Z2dlc3Rpb25zCi0gICQuZ2V0U2NyaXB0KHRvUm9vdCArICdyZWZlcmVuY2UvbGlzdHMuanMnKTsKLSAgLy8gbG9hZCBqc29uIGZpbGVzIGZvciBHb29nbGUgc2VydmljZXMgQVBJIHN1Z2dlc3Rpb25zCi0gICQuZ2V0U2NyaXB0KHRvUm9vdCArICdyZWZlcmVuY2UvZ2NtX2xpc3RzLmpzJywgZnVuY3Rpb24oZGF0YSwgdGV4dFN0YXR1cywganF4aHIpIHsKLSAgICAgIC8vIG9uY2UgdGhlIEdDTSBqc29uIChHQ01fREFUQSkgaXMgbG9hZGVkLCBsb2FkIHRoZSBHTVMganNvbiAoR01TX0RBVEEpIGFuZCBtZXJnZSB0aGUgZGF0YQotICAgICAgaWYoanF4aHIuc3RhdHVzID09PSAyMDApIHsKLSAgICAgICAgICAkLmdldFNjcmlwdCh0b1Jvb3QgKyAncmVmZXJlbmNlL2dtc19saXN0cy5qcycsIGZ1bmN0aW9uKGRhdGEsIHRleHRTdGF0dXMsIGpxeGhyKSB7Ci0gICAgICAgICAgICAgIGlmKGpxeGhyLnN0YXR1cyA9PT0gMjAwKSB7Ci0gICAgICAgICAgICAgICAgICAvLyBjb21iaW5lIEdDTSBhbmQgR01TIGRhdGEKLSAgICAgICAgICAgICAgICAgIEdPT0dMRV9EQVRBID0gR01TX0RBVEE7Ci0gICAgICAgICAgICAgICAgICB2YXIgc3RhcnQgPSBHT09HTEVfREFUQS5sZW5ndGg7Ci0gICAgICAgICAgICAgICAgICBmb3IgKHZhciBpPTA7IGk8R0NNX0RBVEEubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICBHT09HTEVfREFUQS5wdXNoKHtpZDpzdGFydCtpLCBsYWJlbDpHQ01fREFUQVtpXS5sYWJlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbms6R0NNX0RBVEFbaV0ubGluaywgdHlwZTpHQ01fREFUQVtpXS50eXBlfSk7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICB9KTsKLSAgICAgIH0KLSAgfSk7Ci0KLSAgLy8gbGF5b3V0IGhvc3RlZCBvbiBkZXZzaXRlIGlzIHNwZWNpYWwKLSAgaWYgKGRldnNpdGUpIHsKLSAgICAvLyBtb3ZlIHRoZSBsYW5nIHNlbGVjdG9yIGludG8gdGhlIG92ZXJmbG93IG1lbnUKLSAgICAkKCIjbW9yZW1lbnUgLm1pZCBkaXYuaGVhZGVyOmxhc3QiKS5hZnRlcigkKCIjbGFuZ3VhZ2UiKS5kZXRhY2goKSk7Ci0gIH0KLQotICAvLyBpbml0IHRoZSBmdWxsc2NyZWVuIHRvZ2dsZSBjbGljayBldmVudAotICAkKCcjbmF2LXN3YXAgLmZ1bGxzY3JlZW4nKS5jbGljayhmdW5jdGlvbigpewotICAgIGlmICgkKHRoaXMpLmhhc0NsYXNzKCdkaXNhYmxlZCcpKSB7Ci0gICAgICB0b2dnbGVGdWxsc2NyZWVuKHRydWUpOwotICAgIH0gZWxzZSB7Ci0gICAgICB0b2dnbGVGdWxsc2NyZWVuKGZhbHNlKTsKLSAgICB9Ci0gIH0pOwotCi0gIC8vIGluaXRpYWxpemUgdGhlIGRpdnMgd2l0aCBjdXN0b20gc2Nyb2xsYmFycwotICAkKCcuc2Nyb2xsLXBhbmUnKS5qU2Nyb2xsUGFuZSgge3ZlcnRpY2FsR3V0dGVyOjB9ICk7Ci0KLSAgLy8gYWRkIEhScyBiZWxvdyBhbGwgSDJzIChleGNlcHQgZm9yIGEgZmV3IG90aGVyIGgyIHZhcmlhbnRzKQotICAkKCdoMicpLm5vdCgnI3F2IGgyJykubm90KCcjdGIgaDInKS5ub3QoJy5zaWRlYm94IGgyJykubm90KCcjZGV2ZG9jLW5hdiBoMicpLm5vdCgnaDIubm9ydWxlJykuY3NzKHttYXJnaW5Cb3R0b206MH0pLmFmdGVyKCc8aHIvPicpOwotCi0gIC8vIHNldCBzZWFyY2gncyBvbmtleXVwIGhhbmRsZXIgaGVyZSBzbyB3ZSBjYW4gc2hvdyBzdWdnZXN0aW9ucwotICAvLyBldmVuIHdoaWxlIHNlYXJjaCByZXN1bHRzIGFyZSB2aXNpYmxlCi0gICQoIiNzZWFyY2hfYXV0b2NvbXBsZXRlIikua2V5dXAoZnVuY3Rpb24oKSB7cmV0dXJuIHNlYXJjaF9jaGFuZ2VkKGV2ZW50LCBmYWxzZSwgdG9Sb290KX0pOwotCi0gIC8vIHNldCB1cCB0aGUgc2VhcmNoIGNsb3NlIGJ1dHRvbgotICAkKCcuc2VhcmNoIC5jbG9zZScpLmNsaWNrKGZ1bmN0aW9uKCkgewotICAgICRzZWFyY2hJbnB1dCA9ICQoJyNzZWFyY2hfYXV0b2NvbXBsZXRlJyk7Ci0gICAgJHNlYXJjaElucHV0LmF0dHIoJ3ZhbHVlJywgJycpOwotICAgICQodGhpcykuYWRkQ2xhc3MoImhpZGUiKTsKLSAgICAkKCIjc2VhcmNoLWNvbnRhaW5lciIpLnJlbW92ZUNsYXNzKCdhY3RpdmUnKTsKLSAgICAkKCIjc2VhcmNoX2F1dG9jb21wbGV0ZSIpLmJsdXIoKTsKLSAgICBzZWFyY2hfZm9jdXNfY2hhbmdlZCgkc2VhcmNoSW5wdXQuZ2V0KCksIGZhbHNlKTsgIC8vIHNlZSBzZWFyY2hfYXV0b2NvbXBsZXRlLmpzCi0gICAgaGlkZVJlc3VsdHMoKTsgIC8vIHNlZSBzZWFyY2hfYXV0b2NvbXBsZXRlLmpzCi0gIH0pOwotICAkKCcuc2VhcmNoJykuY2xpY2soZnVuY3Rpb24oKSB7Ci0gICAgaWYgKCEkKCcjc2VhcmNoX2F1dG9jb21wbGV0ZScpLmlzKCI6Zm9jdXMiKSkgewotICAgICAgICAkKCcjc2VhcmNoX2F1dG9jb21wbGV0ZScpLmZvY3VzKCk7Ci0gICAgfQotICB9KTsKLQotICAvLyBTZXQgdXAgcXVpY2tuYXYKLSAgdmFyIHF1aWNrbmF2X29wZW4gPSBmYWxzZTsKLSAgJCgiI2J0bi1xdWlja25hdiIpLmNsaWNrKGZ1bmN0aW9uKCkgewotICAgIGlmIChxdWlja25hdl9vcGVuKSB7Ci0gICAgICAkKHRoaXMpLnJlbW92ZUNsYXNzKCdhY3RpdmUnKTsKLSAgICAgIHF1aWNrbmF2X29wZW4gPSBmYWxzZTsKLSAgICAgIGNvbGxhcHNlKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICQodGhpcykuYWRkQ2xhc3MoJ2FjdGl2ZScpOwotICAgICAgcXVpY2tuYXZfb3BlbiA9IHRydWU7Ci0gICAgICBleHBhbmQoKTsKLSAgICB9Ci0gIH0pCi0KLSAgdmFyIGV4cGFuZCA9IGZ1bmN0aW9uKCkgewotICAgJCgnI2hlYWRlci13cmFwJykuYWRkQ2xhc3MoJ3F1aWNrbmF2Jyk7Ci0gICAkKCcjcXVpY2tuYXYnKS5zdG9wKCkuc2hvdygpLmFuaW1hdGUoe29wYWNpdHk6JzEnfSk7Ci0gIH0KLQotICB2YXIgY29sbGFwc2UgPSBmdW5jdGlvbigpIHsKLSAgICAkKCcjcXVpY2tuYXYnKS5zdG9wKCkuYW5pbWF0ZSh7b3BhY2l0eTonMCd9LCAxMDAsIGZ1bmN0aW9uKCkgewotICAgICAgJCh0aGlzKS5oaWRlKCk7Ci0gICAgICAkKCcjaGVhZGVyLXdyYXAnKS5yZW1vdmVDbGFzcygncXVpY2tuYXYnKTsKLSAgICB9KTsKLSAgfQotCi0KLSAgLy9TZXQgdXAgc2VhcmNoCi0gICQoIiNzZWFyY2hfYXV0b2NvbXBsZXRlIikuZm9jdXMoZnVuY3Rpb24oKSB7Ci0gICAgJCgiI3NlYXJjaC1jb250YWluZXIiKS5hZGRDbGFzcygnYWN0aXZlJyk7Ci0gIH0pCi0gICQoIiNzZWFyY2gtY29udGFpbmVyIikubW91c2VvdmVyKGZ1bmN0aW9uKCkgewotICAgICQoIiNzZWFyY2gtY29udGFpbmVyIikuYWRkQ2xhc3MoJ2FjdGl2ZScpOwotICAgICQoIiNzZWFyY2hfYXV0b2NvbXBsZXRlIikuZm9jdXMoKTsKLSAgfSkKLSAgJCgiI3NlYXJjaC1jb250YWluZXIiKS5tb3VzZW91dChmdW5jdGlvbigpIHsKLSAgICBpZiAoJCgiI3NlYXJjaF9hdXRvY29tcGxldGUiKS5pcygiOmZvY3VzIikpIHJldHVybjsKLSAgICBpZiAoJCgiI3NlYXJjaF9hdXRvY29tcGxldGUiKS52YWwoKSA9PSAnJykgewotICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpewotICAgICAgICAkKCIjc2VhcmNoLWNvbnRhaW5lciIpLnJlbW92ZUNsYXNzKCdhY3RpdmUnKTsKLSAgICAgICAgJCgiI3NlYXJjaF9hdXRvY29tcGxldGUiKS5ibHVyKCk7Ci0gICAgICB9LDI1MCk7Ci0gICAgfQotICB9KQotICAkKCIjc2VhcmNoX2F1dG9jb21wbGV0ZSIpLmJsdXIoZnVuY3Rpb24oKSB7Ci0gICAgaWYgKCQoIiNzZWFyY2hfYXV0b2NvbXBsZXRlIikudmFsKCkgPT0gJycpIHsKLSAgICAgICQoIiNzZWFyY2gtY29udGFpbmVyIikucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpOwotICAgIH0KLSAgfSkKLQotCi0gIC8vIHByZXAgbmF2IGV4cGFuZG9zCi0gIHZhciBwYWdlUGF0aCA9IGRvY3VtZW50LmxvY2F0aW9uLnBhdGhuYW1lOwotICAvLyBhY2NvdW50IGZvciBpbnRsIGRvY3MgYnkgcmVtb3ZpbmcgdGhlIGludGwvKi8gcGF0aAotICBpZiAocGFnZVBhdGguaW5kZXhPZigiL2ludGwvIikgPT0gMCkgewotICAgIHBhZ2VQYXRoID0gcGFnZVBhdGguc3Vic3RyKHBhZ2VQYXRoLmluZGV4T2YoIi8iLDYpKTsgLy8gc3RhcnQgYWZ0ZXIgaW50bC8gdG8gZ2V0IGxhc3QgLwotICB9Ci0KLSAgaWYgKHBhZ2VQYXRoLmluZGV4T2YoU0lURV9ST09UKSA9PSAwKSB7Ci0gICAgaWYgKHBhZ2VQYXRoID09ICcnIHx8IHBhZ2VQYXRoLmNoYXJBdChwYWdlUGF0aC5sZW5ndGggLSAxKSA9PSAnLycpIHsKLSAgICAgIHBhZ2VQYXRoICs9ICdpbmRleC5odG1sJzsKLSAgICB9Ci0gIH0KLQotICBpZiAoU0lURV9ST09ULm1hdGNoKC9cLlwuXC8vKSB8fCBTSVRFX1JPT1QgPT0gJycpIHsKLSAgICAvLyBJZiBydW5uaW5nIGxvY2FsbHksIFNJVEVfUk9PVCB3aWxsIGJlIGEgcmVsYXRpdmUgcGF0aCwgc28gYWNjb3VudCBmb3IgdGhhdCBieQotICAgIC8vIGZpbmRpbmcgdGhlIHJlbGF0aXZlIFVSTCB0byB0aGlzIHBhZ2UuIFRoaXMgd2lsbCBhbGxvdyB1cyB0byBmaW5kIGxpbmtzIG9uIHRoZSBwYWdlCi0gICAgLy8gbGVhZGluZyBiYWNrIHRvIHRoaXMgcGFnZS4KLSAgICB2YXIgcGF0aFBhcnRzID0gcGFnZVBhdGguc3BsaXQoJy8nKTsKLSAgICB2YXIgcmVsYXRpdmVQYWdlUGF0aFBhcnRzID0gW107Ci0gICAgdmFyIHVwRGlycyA9IChTSVRFX1JPT1QubWF0Y2goLyhcLlwuXC8pKy8pIHx8IFsnJ10pWzBdLmxlbmd0aCAvIDM7Ci0gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB1cERpcnM7IGkrKykgewotICAgICAgcmVsYXRpdmVQYWdlUGF0aFBhcnRzLnB1c2goJy4uJyk7Ci0gICAgfQotICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdXBEaXJzOyBpKyspIHsKLSAgICAgIHJlbGF0aXZlUGFnZVBhdGhQYXJ0cy5wdXNoKHBhdGhQYXJ0c1twYXRoUGFydHMubGVuZ3RoIC0gKHVwRGlycyAtIGkpIC0gMV0pOwotICAgIH0KLSAgICByZWxhdGl2ZVBhZ2VQYXRoUGFydHMucHVzaChwYXRoUGFydHNbcGF0aFBhcnRzLmxlbmd0aCAtIDFdKTsKLSAgICBwYWdlUGF0aCA9IHJlbGF0aXZlUGFnZVBhdGhQYXJ0cy5qb2luKCcvJyk7Ci0gIH0gZWxzZSB7Ci0gICAgLy8gT3RoZXJ3aXNlIHRoZSBwYWdlIHBhdGggaXMgYWxyZWFkeSBhbiBhYnNvbHV0ZSBVUkwKLSAgfQotCi0gIC8vIEhpZ2hsaWdodCB0aGUgaGVhZGVyIHRhYnMuLi4KLSAgLy8gaGlnaGxpZ2h0IERlc2lnbiB0YWIKLSAgaWYgKCQoImJvZHkiKS5oYXNDbGFzcygiZGVzaWduIikpIHsKLSAgICAkKCIjaGVhZGVyIGxpLmRlc2lnbiBhIikuYWRkQ2xhc3MoInNlbGVjdGVkIik7Ci0KLSAgLy8gaGlnaGxpZ2h0IERldmVsb3AgdGFiCi0gIH0gZWxzZSBpZiAoJCgiYm9keSIpLmhhc0NsYXNzKCJkZXZlbG9wIikgfHwgJCgiYm9keSIpLmhhc0NsYXNzKCJnb29nbGUiKSkgewotICAgICQoIiNoZWFkZXIgbGkuZGV2ZWxvcCBhIikuYWRkQ2xhc3MoInNlbGVjdGVkIik7Ci0KLSAgICAvLyBJbiBEZXZlbG9wIGRvY3MsIGFsc28gaGlnaGxpZ2h0IGFwcHJvcHJpYXRlIHN1Yi10YWIKLSAgICB2YXIgcm9vdERpciA9IHBhZ2VQYXRoLnN1YnN0cmluZygxLHBhZ2VQYXRoLmluZGV4T2YoJy8nLCAxKSk7Ci0gICAgaWYgKHJvb3REaXIgPT0gInRyYWluaW5nIikgewotICAgICAgJCgiI25hdi14IGxpLnRyYWluaW5nIGEiKS5hZGRDbGFzcygic2VsZWN0ZWQiKTsKLSAgICB9IGVsc2UgaWYgKHJvb3REaXIgPT0gImd1aWRlIikgewotICAgICAgJCgiI25hdi14IGxpLmd1aWRlIGEiKS5hZGRDbGFzcygic2VsZWN0ZWQiKTsKLSAgICB9IGVsc2UgaWYgKHJvb3REaXIgPT0gInJlZmVyZW5jZSIpIHsKLSAgICAgIC8vIElmIHRoZSByb290IGlzIHJlZmVyZW5jZSwgYnV0IHBhZ2UgaXMgYWxzbyBwYXJ0IG9mIEdvb2dsZSBTZXJ2aWNlcywgc2VsZWN0IEdvb2dsZQotICAgICAgaWYgKCQoImJvZHkiKS5oYXNDbGFzcygiZ29vZ2xlIikpIHsKLSAgICAgICAgJCgiI25hdi14IGxpLmdvb2dsZSBhIikuYWRkQ2xhc3MoInNlbGVjdGVkIik7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAkKCIjbmF2LXggbGkucmVmZXJlbmNlIGEiKS5hZGRDbGFzcygic2VsZWN0ZWQiKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKChyb290RGlyID09ICJ0b29scyIpIHx8IChyb290RGlyID09ICJzZGsiKSkgewotICAgICAgJCgiI25hdi14IGxpLnRvb2xzIGEiKS5hZGRDbGFzcygic2VsZWN0ZWQiKTsKLSAgICB9IGVsc2UgaWYgKCQoImJvZHkiKS5oYXNDbGFzcygiZ29vZ2xlIikpIHsKLSAgICAgICQoIiNuYXYteCBsaS5nb29nbGUgYSIpLmFkZENsYXNzKCJzZWxlY3RlZCIpOwotICAgIH0KLQotICAvLyBoaWdobGlnaHQgRGlzdHJpYnV0ZSB0YWIKLSAgfSBlbHNlIGlmICgkKCJib2R5IikuaGFzQ2xhc3MoImRpc3RyaWJ1dGUiKSkgewotICAgICQoIiNoZWFkZXIgbGkuZGlzdHJpYnV0ZSBhIikuYWRkQ2xhc3MoInNlbGVjdGVkIik7Ci0gIH0KLQotCi0gIC8vIHNlbGVjdCBjdXJyZW50IHBhZ2UgaW4gc2lkZW5hdiBhbmQgaGVhZGVyLCBhbmQgc2V0IHVwIHByZXYvbmV4dCBsaW5rcyBpZiB0aGV5IGV4aXN0Ci0gIHZhciAkc2VsTmF2TGluayA9ICQoJyNuYXYnKS5maW5kKCdhW2hyZWY9IicgKyBwYWdlUGF0aCArICciXScpOwotICB2YXIgJHNlbExpc3RJdGVtOwotICBpZiAoJHNlbE5hdkxpbmsubGVuZ3RoKSB7Ci0KLSAgICAvLyBGaW5kIHRoaXMgcGFnZSdzIDxsaT4gaW4gc2lkZW5hdiBhbmQgc2V0IHNlbGVjdGVkCi0gICAgJHNlbExpc3RJdGVtID0gJHNlbE5hdkxpbmsuY2xvc2VzdCgnbGknKTsKLSAgICAkc2VsTGlzdEl0ZW0uYWRkQ2xhc3MoJ3NlbGVjdGVkJyk7Ci0KLSAgICAvLyBUcmF2ZXJzZSB1cCB0aGUgdHJlZSBhbmQgZXhwYW5kIGFsbCBwYXJlbnQgbmF2LXNlY3Rpb25zCi0gICAgJHNlbE5hdkxpbmsucGFyZW50cygnbGkubmF2LXNlY3Rpb24nKS5lYWNoKGZ1bmN0aW9uKCkgewotICAgICAgJCh0aGlzKS5hZGRDbGFzcygnZXhwYW5kZWQnKTsKLSAgICAgICQodGhpcykuY2hpbGRyZW4oJ3VsJykuc2hvdygpOwotICAgIH0pOwotCi0gICAgLy8gc2V0IHVwIHByZXYgbGlua3MKLSAgICB2YXIgJHByZXZMaW5rID0gW107Ci0gICAgdmFyICRwcmV2TGlzdEl0ZW0gPSAkc2VsTGlzdEl0ZW0ucHJldignbGknKTsKLQotICAgIHZhciBjcm9zc0JvdW5kYXJpZXMgPSAoJCgiYm9keS5kZXNpZ24iKS5sZW5ndGggPiAwKSB8fCAoJCgiYm9keS5ndWlkZSIpLmxlbmd0aCA+IDApID8gdHJ1ZSA6Ci1mYWxzZTsgLy8gbmF2aWdhdGUgYWNyb3NzIHRvcGljIGJvdW5kYXJpZXMgb25seSBpbiBkZXNpZ24gZG9jcwotICAgIGlmICgkcHJldkxpc3RJdGVtLmxlbmd0aCkgewotICAgICAgaWYgKCRwcmV2TGlzdEl0ZW0uaGFzQ2xhc3MoJ25hdi1zZWN0aW9uJykpIHsKLSAgICAgICAgLy8ganVtcCB0byBsYXN0IHRvcGljIG9mIHByZXZpb3VzIHNlY3Rpb24KLSAgICAgICAgJHByZXZMaW5rID0gJHByZXZMaXN0SXRlbS5maW5kKCdhOmxhc3QnKTsKLSAgICAgIH0gZWxzZSBpZiAoISRzZWxMaXN0SXRlbS5oYXNDbGFzcygnbmF2LXNlY3Rpb24nKSkgewotICAgICAgICAvLyBqdW1wIHRvIHByZXZpb3VzIHRvcGljIGluIHRoaXMgc2VjdGlvbgotICAgICAgICAkcHJldkxpbmsgPSAkcHJldkxpc3RJdGVtLmZpbmQoJ2E6ZXEoMCknKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgLy8ganVtcCB0byB0aGlzIHNlY3Rpb24ncyBpbmRleCBwYWdlIChpZiBpdCBleGlzdHMpCi0gICAgICB2YXIgJHBhcmVudExpc3RJdGVtID0gJHNlbExpc3RJdGVtLnBhcmVudHMoJ2xpJyk7Ci0gICAgICAkcHJldkxpbmsgPSAkc2VsTGlzdEl0ZW0ucGFyZW50cygnbGknKS5maW5kKCdhJyk7Ci0KLSAgICAgIC8vIGV4Y2VwdCBpZiBjcm9zcyBib3VuZGFyaWVzIGFyZW4ndCBhbGxvd2VkLCBhbmQgd2UncmUgYXQgdGhlIHRvcCBvZiBhIHNlY3Rpb24gYWxyZWFkeQotICAgICAgLy8gKGFuZCB0aGVyZSdzIGFub3RoZXIgcGFyZW50KQotICAgICAgaWYgKCFjcm9zc0JvdW5kYXJpZXMgJiYgJHBhcmVudExpc3RJdGVtLmhhc0NsYXNzKCduYXYtc2VjdGlvbicpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAkc2VsTGlzdEl0ZW0uaGFzQ2xhc3MoJ25hdi1zZWN0aW9uJykpIHsKLSAgICAgICAgJHByZXZMaW5rID0gW107Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gc2V0IHVwIG5leHQgbGlua3MKLSAgICB2YXIgJG5leHRMaW5rID0gW107Ci0gICAgdmFyIHN0YXJ0Q2xhc3MgPSBmYWxzZTsKLSAgICB2YXIgdHJhaW5pbmcgPSAkKCIubmV4dC1jbGFzcy1saW5rIikubGVuZ3RoOyAvLyBkZWNpZGVzIHdoZXRoZXIgdG8gcHJvdmlkZSAibmV4dCBjbGFzcyIgbGluawotICAgIHZhciBpc0Nyb3NzaW5nQm91bmRhcnkgPSBmYWxzZTsKLQotICAgIGlmICgkc2VsTGlzdEl0ZW0uaGFzQ2xhc3MoJ25hdi1zZWN0aW9uJykpIHsKLSAgICAgIC8vIHdlJ3JlIG9uIGFuIGluZGV4IHBhZ2UsIGp1bXAgdG8gdGhlIGZpcnN0IHRvcGljCi0gICAgICAkbmV4dExpbmsgPSAkc2VsTGlzdEl0ZW0uZmluZCgndWw6ZXEoMCknKS5maW5kKCdhOmVxKDApJyk7Ci0KLSAgICAgIC8vIGlmIHRoZXJlIGFyZW4ndCBhbnkgY2hpbGRyZW4sIGdvIHRvIHRoZSBuZXh0IHNlY3Rpb24gKHJlcXVpcmVkIGZvciBBYm91dCBwYWdlcykKLSAgICAgIGlmKCRuZXh0TGluay5sZW5ndGggPT0gMCkgewotICAgICAgICAkbmV4dExpbmsgPSAkc2VsTGlzdEl0ZW0ubmV4dCgnbGknKS5maW5kKCdhJyk7Ci0gICAgICB9IGVsc2UgaWYgKCQoJy50b3BpYy1zdGFydC1saW5rJykubGVuZ3RoKSB7Ci0gICAgICAgIC8vIGFzIGxvbmcgYXMgdGhlcmUncyBhIGNoaWxkIGxpbmsgYW5kIHRoZXJlIGlzIGEgInRvcGljIHN0YXJ0IGxpbmsiICh3ZSdyZSBvbiBhIGxhbmRpbmcpCi0gICAgICAgIC8vIHRoZW4gc2V0IHRoZSBsYW5kaW5nIHBhZ2UgInN0YXJ0IGxpbmsiIHRleHQgdG8gYmUgdGhlIGZpcnN0IGRvYyB0aXRsZQotICAgICAgICAkKCcudG9waWMtc3RhcnQtbGluaycpLnRleHQoJG5leHRMaW5rLnRleHQoKS50b1VwcGVyQ2FzZSgpKTsKLSAgICAgIH0KLQotICAgICAgLy8gSWYgdGhlIHNlbGVjdGVkIHBhZ2UgaGFzIGEgZGVzY3JpcHRpb24sIHRoZW4gaXQncyBhIGNsYXNzIG9yIGFydGljbGUgaG9tZXBhZ2UKLSAgICAgIGlmICgkc2VsTGlzdEl0ZW0uZmluZCgnYVtkZXNjcmlwdGlvbl0nKS5sZW5ndGgpIHsKLSAgICAgICAgLy8gdGhpcyBtZWFucyB3ZSdyZSBvbiBhIGNsYXNzIGxhbmRpbmcgcGFnZQotICAgICAgICBzdGFydENsYXNzID0gdHJ1ZTsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgLy8ganVtcCB0byB0aGUgbmV4dCB0b3BpYyBpbiB0aGlzIHNlY3Rpb24gKGlmIGl0IGV4aXN0cykKLSAgICAgICRuZXh0TGluayA9ICRzZWxMaXN0SXRlbS5uZXh0KCdsaScpLmZpbmQoJ2E6ZXEoMCknKTsKLSAgICAgIGlmICghJG5leHRMaW5rLmxlbmd0aCkgewotICAgICAgICBpc0Nyb3NzaW5nQm91bmRhcnkgPSB0cnVlOwotICAgICAgICAvLyBubyBtb3JlIHRvcGljcyBpbiB0aGlzIHNlY3Rpb24sIGp1bXAgdG8gdGhlIGZpcnN0IHRvcGljIGluIHRoZSBuZXh0IHNlY3Rpb24KLSAgICAgICAgJG5leHRMaW5rID0gJHNlbExpc3RJdGVtLnBhcmVudHMoJ2xpOmVxKDApJykubmV4dCgnbGkubmF2LXNlY3Rpb24nKS5maW5kKCdhOmVxKDApJyk7Ci0gICAgICAgIGlmICghJG5leHRMaW5rLmxlbmd0aCkgeyAgLy8gR28gdXAgYW5vdGhlciBsYXllciB0byBsb29rIGZvciBuZXh0IHBhZ2UgKGxlc3NvbiA+IGNsYXNzID4gY291cnNlKQotICAgICAgICAgICRuZXh0TGluayA9ICRzZWxMaXN0SXRlbS5wYXJlbnRzKCdsaTplcSgxKScpLm5leHQoJ2xpLm5hdi1zZWN0aW9uJykuZmluZCgnYTplcSgwKScpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKHN0YXJ0Q2xhc3MpIHsKLSAgICAgICQoJy5zdGFydC1jbGFzcy1saW5rJykuYXR0cignaHJlZicsICRuZXh0TGluay5hdHRyKCdocmVmJykpLnJlbW92ZUNsYXNzKCJoaWRlIik7Ci0KLSAgICAgIC8vIGlmIHRoZXJlJ3Mgbm8gdHJhaW5pbmcgYmFyIChiZWxvdyB0aGUgc3RhcnQgYnV0dG9uKSwKLSAgICAgIC8vIHRoZW4gd2UgbmVlZCB0byBhZGQgYSBib3R0b20gYm9yZGVyIHRvIGJ1dHRvbgotICAgICAgaWYgKCEkKCIjdGIiKS5sZW5ndGgpIHsKLSAgICAgICAgJCgnLnN0YXJ0LWNsYXNzLWxpbmsnKS5jc3Moeydib3JkZXItYm90dG9tJzonMXB4IHNvbGlkICNEQURBREEnfSk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmIChpc0Nyb3NzaW5nQm91bmRhcnkgJiYgISQoJ2JvZHkuZGVzaWduJykubGVuZ3RoKSB7ICAvLyBEZXNpZ24gYWx3YXlzIGNyb3NzZXMgYm91bmRhcmllcwotICAgICAgJCgnLmNvbnRlbnQtZm9vdGVyLm5leHQtY2xhc3MnKS5zaG93KCk7Ci0gICAgICAkKCcubmV4dC1wYWdlLWxpbmsnKS5hdHRyKCdocmVmJywnJykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlbW92ZUNsYXNzKCJoaWRlIikuYWRkQ2xhc3MoImRpc2FibGVkIikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgLmNsaWNrKGZ1bmN0aW9uKCkgeyByZXR1cm4gZmFsc2U7IH0pOwotCi0gICAgICAkKCcubmV4dC1jbGFzcy1saW5rJykuYXR0cignaHJlZicsJG5leHRMaW5rLmF0dHIoJ2hyZWYnKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlbW92ZUNsYXNzKCJoaWRlIikuYXBwZW5kKCRuZXh0TGluay5odG1sKCkpOwotICAgICAgJCgnLm5leHQtY2xhc3MtbGluaycpLmZpbmQoJy5uZXcnKS5lbXB0eSgpOwotICAgIH0gZWxzZSB7Ci0gICAgICAkKCcubmV4dC1wYWdlLWxpbmsnKS5hdHRyKCdocmVmJywgJG5leHRMaW5rLmF0dHIoJ2hyZWYnKSkucmVtb3ZlQ2xhc3MoImhpZGUiKTsKLSAgICB9Ci0KLSAgICBpZiAoIXN0YXJ0Q2xhc3MgJiYgJHByZXZMaW5rLmxlbmd0aCkgewotICAgICAgdmFyIHByZXZIcmVmID0gJHByZXZMaW5rLmF0dHIoJ2hyZWYnKTsKLSAgICAgIGlmIChwcmV2SHJlZiA9PSBTSVRFX1JPT1QgKyAnaW5kZXguaHRtbCcpIHsKLSAgICAgICAgLy8gRG9uJ3Qgc2hvdyBQcmV2aW91cyB3aGVuIGl0IGxlYWRzIHRvIHRoZSBob21lcGFnZQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgJCgnLnByZXYtcGFnZS1saW5rJykuYXR0cignaHJlZicsICRwcmV2TGluay5hdHRyKCdocmVmJykpLnJlbW92ZUNsYXNzKCJoaWRlIik7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gSWYgdGhpcyBpcyBhIHRyYWluaW5nICdhcnRpY2xlJywgdGhlcmUgc2hvdWxkIGJlIG5vIHByZXYvbmV4dCBuYXYKLSAgICAvLyAuLi4gaWYgdGhlIGdyYW5kcGFyZW50IGlzIHRoZSAibmF2IiAuLi4gYW5kIGl0IGhhcyBubyBjaGlsZCBsaXN0IGl0ZW1zLi4uCi0gICAgaWYgKHRyYWluaW5nICYmICRzZWxMaXN0SXRlbS5wYXJlbnRzKCd1bCcpLmVxKDEpLmlzKCdbaWQ9Im5hdiJdJykgJiYKLSAgICAgICAgISRzZWxMaXN0SXRlbS5maW5kKCdsaScpLmxlbmd0aCkgewotICAgICAgJCgnLm5leHQtcGFnZS1saW5rLC5wcmV2LXBhZ2UtbGluaycpLmF0dHIoJ2hyZWYnLCcnKS5hZGRDbGFzcygiZGlzYWJsZWQiKQotICAgICAgICAgICAgICAgICAgICAgICAgICAuY2xpY2soZnVuY3Rpb24oKSB7IHJldHVybiBmYWxzZTsgfSk7Ci0gICAgfQotCi0gIH0KLS8vSWYgYXV0by10b2MgZGl2IGlzIHByZXNlbnQsIGdlbmVyYXRlIHRoZSBhdXRvbWF0ZWQgVE9DCi1pZiAoJCgiI2F1dG8tdG9jIikuaXMoJyonKSkgewotICB2YXIgcHJldmlvdXMgPSAkKHRoaXMpOyAvL25lZWRzIHRvIGJlIG5vdCBudWxsIGZpcnN0IHRpbWUgdGhyb3VnaCBsb29wCi0gIHZhciB0b2MgPSAiIjsKLSAgJCgiI2pkLWNvbnRlbnQiKS5maW5kKCJoMiwgaDMiKS5ub3QoJzpmaXJzdC1jaGlsZCcpLmVhY2goZnVuY3Rpb24oaSkgeyAvLyBoYXZlIHRvIHNraXAgdGhlIGZpcnN0IGgyLCB3aGljaCBpcyAiSW4gdGhpcyBEb2N1bWVudCIgd2l0aCBub3Q6Zmlyc3QtY2hpbGQKLSAgICAgIHZhciBjdXJyZW50ID0gJCh0aGlzKTsKLSAgICAgIGlmKGN1cnJlbnQuaXMoImgzIikgJiYgcHJldmlvdXMuaXMoImgyIikpeyAvL25lZWQgbmVzdGVkIG9scyBmb3IgaDNzCi0gICAgICAgIHRvYys9IjxvbD4iOwotICAgICAgfQotICAgICAgZWxzZSBpZihjdXJyZW50LmlzKCJoMiIpICYmIHByZXZpb3VzLmlzKCJoMyIpKXsgLy9jbG9zZSB1cCB0aGUgbmVzdGVkIG9sCi0gICAgICAgIHRvYys9Ijwvb2w+IjsKLSAgICAgIH0KLSAgICAgICAgdG9jKz0iPGxpPjxhIGhyZWY9JyMiICsgY3VycmVudFswXS5pZCArICInPiIgKwotICAgICAgICAgIGN1cnJlbnQuaHRtbCgpICsgIjwvYT48L2xpPiI7Ci0KLSAgICAgIHByZXZpb3VzID0gY3VycmVudDsgIC8va2VlcCB0cmFjayBvZiBwcmV2aW91cyBlbGVtZW50IG5leHQgdGltZSB0aHJvdWdoIGxvb3AKLSAgfSk7Ci0gICQoIiNhdXRvLXRvYyIpLmFwcGVuZCh0b2MpOyAgLy9hcHBlbmQgdG8gdGhlIGRpdgotfQotCi0gIC8vIFNldCB1cCB0aGUgY291cnNlIGxhbmRpbmcgcGFnZXMgZm9yIFRyYWluaW5nIHdpdGggY2xhc3MgbmFtZXMgYW5kIGRlc2NyaXB0aW9ucwotICBpZiAoJCgnYm9keS50cmFpbmluZ2NvdXJzZScpLmxlbmd0aCkgewotICAgIHZhciAkY2xhc3NMaW5rcyA9ICRzZWxMaXN0SXRlbS5maW5kKCd1bCBsaSBhJykubm90KCcjbmF2IC5uYXYtc2VjdGlvbiAubmF2LXNlY3Rpb24gdWwgYScpOwotICAgIHZhciAkY2xhc3NEZXNjcmlwdGlvbnMgPSAkY2xhc3NMaW5rcy5hdHRyKCdkZXNjcmlwdGlvbicpOwotCi0gICAgdmFyICRvbENsYXNzZXMgID0gJCgnPG9sIGNsYXNzPSJjbGFzcy1saXN0Ij48L29sPicpOwotICAgIHZhciAkbGlDbGFzczsKLSAgICB2YXIgJGltZ0ljb247Ci0gICAgdmFyICRoMlRpdGxlOwotICAgIHZhciAkcFN1bW1hcnk7Ci0gICAgdmFyICRvbExlc3NvbnM7Ci0gICAgdmFyICRsaUxlc3NvbjsKLSAgICAkY2xhc3NMaW5rcy5lYWNoKGZ1bmN0aW9uKGluZGV4KSB7Ci0gICAgICAkbGlDbGFzcyAgPSAkKCc8bGk+PC9saT4nKTsKLSAgICAgICRoMlRpdGxlICA9ICQoJzxhIGNsYXNzPSJ0aXRsZSIgaHJlZj0iJyskKHRoaXMpLmF0dHIoJ2hyZWYnKSsnIj48aDI+JyArICQodGhpcykuaHRtbCgpKyc8L2gyPjxzcGFuPjwvc3Bhbj48L2E+Jyk7Ci0gICAgICAkcFN1bW1hcnkgPSAkKCc8cCBjbGFzcz0iZGVzY3JpcHRpb24iPicgKyAkKHRoaXMpLmF0dHIoJ2Rlc2NyaXB0aW9uJykgKyAnPC9wPicpOwotCi0gICAgICAkb2xMZXNzb25zICA9ICQoJzxvbCBjbGFzcz0ibGVzc29uLWxpc3QiPjwvb2w+Jyk7Ci0KLSAgICAgICRsZXNzb25zID0gJCh0aGlzKS5jbG9zZXN0KCdsaScpLmZpbmQoJ3VsIGxpIGEnKTsKLQotICAgICAgaWYgKCRsZXNzb25zLmxlbmd0aCkgewotICAgICAgICAkaW1nSWNvbiA9ICQoJzxpbWcgc3JjPSInK3RvUm9vdCsnYXNzZXRzL2ltYWdlcy9yZXNvdXJjZS10dXRvcmlhbC5wbmciIGFsdD0iIi8+Jyk7Ci0gICAgICAgICRsZXNzb25zLmVhY2goZnVuY3Rpb24oaW5kZXgpIHsKLSAgICAgICAgICAkb2xMZXNzb25zLmFwcGVuZCgnPGxpPjxhIGhyZWY9IicrJCh0aGlzKS5hdHRyKCdocmVmJykrJyI+JyArICQodGhpcykuaHRtbCgpKyc8L2E+PC9saT4nKTsKLSAgICAgICAgfSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAkaW1nSWNvbiA9ICQoJzxpbWcgc3JjPSInK3RvUm9vdCsnYXNzZXRzL2ltYWdlcy9yZXNvdXJjZS1hcnRpY2xlLnBuZyIgYWx0PSIiLz4nKTsKLSAgICAgICAgJHBTdW1tYXJ5LmFkZENsYXNzKCdhcnRpY2xlJyk7Ci0gICAgICB9Ci0KLSAgICAgICRsaUNsYXNzLmFwcGVuZCgkaDJUaXRsZSkuYXBwZW5kKCRpbWdJY29uKS5hcHBlbmQoJHBTdW1tYXJ5KS5hcHBlbmQoJG9sTGVzc29ucyk7Ci0gICAgICAkb2xDbGFzc2VzLmFwcGVuZCgkbGlDbGFzcyk7Ci0gICAgfSk7Ci0gICAgJCgnLmpkLWRlc2NyJykuYXBwZW5kKCRvbENsYXNzZXMpOwotICB9Ci0KLQotCi0KLSAgLy8gU2V0IHVwIGV4cGFuZC9jb2xsYXBzZSBiZWhhdmlvcgotICAkKCcjbmF2IGxpLm5hdi1zZWN0aW9uIC5uYXYtc2VjdGlvbi1oZWFkZXInKS5jbGljayhmdW5jdGlvbigpIHsKLSAgICB2YXIgc2VjdGlvbiA9ICQodGhpcykuY2xvc2VzdCgnbGkubmF2LXNlY3Rpb24nKTsKLSAgICBpZiAoc2VjdGlvbi5oYXNDbGFzcygnZXhwYW5kZWQnKSkgewotICAgIC8qIGhpZGUgbWUgKi8KLSAgICAvLyAgaWYgKHNlY3Rpb24uaGFzQ2xhc3MoJ3NlbGVjdGVkJykgfHwgc2VjdGlvbi5maW5kKCdsaScpLmhhc0NsYXNzKCdzZWxlY3RlZCcpKSB7Ci0gICAvLyAgIC8qIGJ1dCBub3QgaWYgbXlzZWxmIG9yIG15IGRlc2NlbmRlbnRzIGFyZSBzZWxlY3RlZCAqLwotICAgLy8gICAgIHJldHVybjsKLSAgICAvLyAgfQotICAgICAgc2VjdGlvbi5jaGlsZHJlbigndWwnKS5zbGlkZVVwKDI1MCwgZnVuY3Rpb24oKSB7Ci0gICAgICAgIHNlY3Rpb24uY2xvc2VzdCgnbGknKS5yZW1vdmVDbGFzcygnZXhwYW5kZWQnKTsKLSAgICAgICAgcmVzaXplTmF2KCk7Ci0gICAgICB9KTsKLSAgICB9IGVsc2UgewotICAgIC8qIHNob3cgbWUgKi8KLSAgICAgIC8vIGZpcnN0IGhpZGUgYWxsIG90aGVyIHNpYmxpbmdzCi0gICAgICB2YXIgJG90aGVycyA9ICQoJ2xpLm5hdi1zZWN0aW9uLmV4cGFuZGVkJywgJCh0aGlzKS5jbG9zZXN0KCd1bCcpKTsKLSAgICAgICRvdGhlcnMucmVtb3ZlQ2xhc3MoJ2V4cGFuZGVkJykuY2hpbGRyZW4oJ3VsJykuc2xpZGVVcCgyNTApOwotCi0gICAgICAvLyBub3cgZXhwYW5kIG1lCi0gICAgICBzZWN0aW9uLmNsb3Nlc3QoJ2xpJykuYWRkQ2xhc3MoJ2V4cGFuZGVkJyk7Ci0gICAgICBzZWN0aW9uLmNoaWxkcmVuKCd1bCcpLnNsaWRlRG93bigyNTAsIGZ1bmN0aW9uKCkgewotICAgICAgICByZXNpemVOYXYoKTsKLSAgICAgIH0pOwotICAgIH0KLSAgfSk7Ci0KLSAgJCgiLnNjcm9sbC1wYW5lIikuc2Nyb2xsKGZ1bmN0aW9uKGV2ZW50KSB7Ci0gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICB9KTsKLQotICAvKiBSZXNpemUgbmF2IGhlaWdodCB3aGVuIHdpbmRvdyBoZWlnaHQgY2hhbmdlcyAqLwotICAkKHdpbmRvdykucmVzaXplKGZ1bmN0aW9uKCkgewotICAgIGlmICgkKCcjc2lkZS1uYXYnKS5sZW5ndGggPT0gMCkgcmV0dXJuOwotICAgIHZhciBzdHlsZXNoZWV0ID0gJCgnbGlua1tyZWw9InN0eWxlc2hlZXQiXVtjbGFzcz0iZnVsbHNjcmVlbiJdJyk7Ci0gICAgc2V0TmF2QmFyTGVmdFBvcygpOyAvLyBkbyB0aGlzIGV2ZW4gaWYgc2lkZW5hdiBpc24ndCBmaXhlZCBiZWNhdXNlIGl0IGNvdWxkIGJlY29tZSBmaXhlZAotICAgIC8vIG1ha2Ugc2lkZW5hdiBiZWhhdmUgd2hlbiByZXNpemluZyB0aGUgd2luZG93IGFuZCBzaWRlLXNjb2xsaW5nIGlzIGEgY29uY2VybgotICAgIGlmIChuYXZCYXJJc0ZpeGVkKSB7Ci0gICAgICBpZiAoKHN0eWxlc2hlZXQuYXR0cigiZGlzYWJsZWQiKSA9PSAiZGlzYWJsZWQiKSB8fCBzdHlsZXNoZWV0Lmxlbmd0aCA9PSAwKSB7Ci0gICAgICAgIHVwZGF0ZVNpZGVOYXZQb3NpdGlvbigpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgdXBkYXRlU2lkZW5hdkZ1bGxzY3JlZW5XaWR0aCgpOwotICAgICAgfQotICAgIH0KLSAgICByZXNpemVOYXYoKTsKLSAgfSk7Ci0KLQotICAvLyBTZXQgdXAgZml4ZWQgbmF2YmFyCi0gIHZhciBwcmV2U2Nyb2xsTGVmdCA9IDA7IC8vIHVzZWQgdG8gY29tcGFyZSBjdXJyZW50IHBvc2l0aW9uIHRvIHByZXZpb3VzIHBvc2l0aW9uIG9mIGhvcml6IHNjcm9sbAotICAkKHdpbmRvdykuc2Nyb2xsKGZ1bmN0aW9uKGV2ZW50KSB7Ci0gICAgaWYgKCQoJyNzaWRlLW5hdicpLmxlbmd0aCA9PSAwKSByZXR1cm47Ci0gICAgaWYgKGV2ZW50LnRhcmdldC5ub2RlTmFtZSA9PSAiRElWIikgewotICAgICAgLy8gRHVtcCBzY3JvbGwgZXZlbnQgaWYgdGhlIHRhcmdldCBpcyBhIERJViwgYmVjYXVzZSB0aGF0IG1lYW5zIHRoZSBldmVudCBpcyBjb21pbmcKLSAgICAgIC8vIGZyb20gYSBzY3JvbGxhYmxlIGRpdiBhbmQgc28gdGhlcmUncyBubyBuZWVkIHRvIG1ha2UgYWRqdXN0bWVudHMgdG8gb3VyIGxheW91dAotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICB2YXIgc2Nyb2xsVG9wID0gJCh3aW5kb3cpLnNjcm9sbFRvcCgpOwotICAgIHZhciBoZWFkZXJIZWlnaHQgPSAkKCcjaGVhZGVyJykub3V0ZXJIZWlnaHQoKTsKLSAgICB2YXIgc3ViaGVhZGVySGVpZ2h0ID0gJCgnI25hdi14Jykub3V0ZXJIZWlnaHQoKTsKLSAgICB2YXIgc2VhcmNoUmVzdWx0SGVpZ2h0ID0gJCgnI3NlYXJjaFJlc3VsdHMnKS5pcygiOnZpc2libGUiKSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJyNzZWFyY2hSZXN1bHRzJykub3V0ZXJIZWlnaHQoKSA6IDA7Ci0gICAgdmFyIHRvdGFsSGVhZGVySGVpZ2h0ID0gaGVhZGVySGVpZ2h0ICsgc3ViaGVhZGVySGVpZ2h0ICsgc2VhcmNoUmVzdWx0SGVpZ2h0OwotICAgIC8vIHdlIHNldCB0aGUgbmF2YmFyIGZpeGVkIHdoZW4gdGhlIHNjcm9sbCBwb3NpdGlvbiBpcyBiZXlvbmQgdGhlIGhlaWdodCBvZiB0aGUgc2l0ZSBoZWFkZXIuLi4KLSAgICB2YXIgbmF2QmFyU2hvdWxkQmVGaXhlZCA9IHNjcm9sbFRvcCA+IHRvdGFsSGVhZGVySGVpZ2h0OwotICAgIC8vIC4uLiBleGNlcHQgaWYgdGhlIGRvY3VtZW50IGNvbnRlbnQgaXMgc2hvcnRlciB0aGFuIHRoZSBzaWRlbmF2IGhlaWdodC4KLSAgICAvLyAodGhpcyBpcyBuZWNlc3NhcnkgdG8gYXZvaWQgY3JhenkgYmVoYXZpb3Igb24gT1NYIExpb24gZHVlIHRvIG92ZXJzY3JvbGwgYm91bmNpbmcpCi0gICAgaWYgKCQoIiNkb2MtY29sIikuaGVpZ2h0KCkgPCAkKCIjc2lkZS1uYXYiKS5oZWlnaHQoKSkgewotICAgICAgbmF2QmFyU2hvdWxkQmVGaXhlZCA9IGZhbHNlOwotICAgIH0KLQotICAgIHZhciBzY3JvbGxMZWZ0ID0gJCh3aW5kb3cpLnNjcm9sbExlZnQoKTsKLSAgICAvLyBXaGVuIHRoZSBzaWRlbmF2IGlzIGZpeGVkIGFuZCB1c2VyIHNjcm9sbHMgaG9yaXpvbnRhbGx5LCByZXBvc2l0aW9uIHRoZSBzaWRlbmF2IHRvIG1hdGNoCi0gICAgaWYgKG5hdkJhcklzRml4ZWQgJiYgKHNjcm9sbExlZnQgIT0gcHJldlNjcm9sbExlZnQpKSB7Ci0gICAgICB1cGRhdGVTaWRlTmF2UG9zaXRpb24oKTsKLSAgICAgIHByZXZTY3JvbGxMZWZ0ID0gc2Nyb2xsTGVmdDsKLSAgICB9Ci0KLSAgICAvLyBEb24ndCBjb250aW51ZSBpZiB0aGUgaGVhZGVyIGlzIHN1ZmZpY2VudGx5IGZhciBhd2F5Ci0gICAgLy8gKHRvIGF2b2lkIGludGVuc2l2ZSByZXNpemluZyB0aGF0IHNsb3dzIHNjcm9sbGluZykKLSAgICBpZiAobmF2QmFySXNGaXhlZCAmJiBuYXZCYXJTaG91bGRCZUZpeGVkKSB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKG5hdkJhcklzRml4ZWQgIT0gbmF2QmFyU2hvdWxkQmVGaXhlZCkgewotICAgICAgaWYgKG5hdkJhclNob3VsZEJlRml4ZWQpIHsKLSAgICAgICAgLy8gbWFrZSBpdCBmaXhlZAotICAgICAgICB2YXIgd2lkdGggPSAkKCcjZGV2ZG9jLW5hdicpLndpZHRoKCk7Ci0gICAgICAgICQoJyNkZXZkb2MtbmF2JykKLSAgICAgICAgICAgIC5hZGRDbGFzcygnZml4ZWQnKQotICAgICAgICAgICAgLmNzcyh7J3dpZHRoJzp3aWR0aCsncHgnfSkKLSAgICAgICAgICAgIC5wcmVwZW5kVG8oJyNib2R5LWNvbnRlbnQnKTsKLSAgICAgICAgLy8gYWRkIG5lYXRvICJiYWNrIHRvIHRvcCIgYnV0dG9uCi0gICAgICAgICQoJyNkZXZkb2MtbmF2IGEudG90b3AnKS5jc3MoeydkaXNwbGF5JzonYmxvY2snLCd3aWR0aCc6JCgiI25hdiIpLmlubmVyV2lkdGgoKSsncHgnfSk7Ci0KLSAgICAgICAgLy8gdXBkYXRlIHRoZSBzaWRlbmFhdiBwb3NpdGlvbiBmb3Igc2lkZSBzY3JvbGxpbmcKLSAgICAgICAgdXBkYXRlU2lkZU5hdlBvc2l0aW9uKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAvLyBtYWtlIGl0IHN0YXRpYyBhZ2FpbgotICAgICAgICAkKCcjZGV2ZG9jLW5hdicpCi0gICAgICAgICAgICAucmVtb3ZlQ2xhc3MoJ2ZpeGVkJykKLSAgICAgICAgICAgIC5jc3Moeyd3aWR0aCc6J2F1dG8nLCdtYXJnaW4nOicnfSkKLSAgICAgICAgICAgIC5wcmVwZW5kVG8oJyNzaWRlLW5hdicpOwotICAgICAgICAkKCcjZGV2ZG9jLW5hdiBhLnRvdG9wJykuaGlkZSgpOwotICAgICAgfQotICAgICAgbmF2QmFySXNGaXhlZCA9IG5hdkJhclNob3VsZEJlRml4ZWQ7Ci0gICAgfQotCi0gICAgcmVzaXplTmF2KDI1MCk7IC8vIHBhc3MgdHJ1ZSBpbiBvcmRlciB0byBkZWxheSB0aGUgc2Nyb2xsYmFyIHJlLWluaXRpYWxpemF0aW9uIGZvciBwZXJmb3JtYW5jZQotICB9KTsKLQotCi0gIHZhciBuYXZCYXJMZWZ0UG9zOwotICBpZiAoJCgnI2RldmRvYy1uYXYnKS5sZW5ndGgpIHsKLSAgICBzZXROYXZCYXJMZWZ0UG9zKCk7Ci0gIH0KLQotCi0gIC8vIFN0b3AgZXhwYW5kL2NvbGxhcHNlIGJlaGF2aW9yIHdoZW4gY2xpY2tpbmcgb24gbmF2IHNlY3Rpb24gbGlua3MgKHNpbmNlIHdlJ3JlIG5hdmlnYXRpbmcgYXdheQotICAvLyBmcm9tIHRoZSBwYWdlKQotICAkKCcubmF2LXNlY3Rpb24taGVhZGVyJykuZmluZCgnYTplcSgwKScpLmNsaWNrKGZ1bmN0aW9uKGV2dCkgewotICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gJCh0aGlzKS5hdHRyKCdocmVmJyk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9KTsKLQotICAvLyBTZXQgdXAgcGxheS1vbi1ob3ZlciA8dmlkZW8+IHRhZ3MuCi0gICQoJ3ZpZGVvLnBsYXktb24taG92ZXInKS5iaW5kKCdjbGljaycsIGZ1bmN0aW9uKCl7Ci0gICAgJCh0aGlzKS5nZXQoMCkubG9hZCgpOyAvLyBpbiBjYXNlIHRoZSB2aWRlbyBpc24ndCBzZWVrYWJsZQotICAgICQodGhpcykuZ2V0KDApLnBsYXkoKTsKLSAgfSk7Ci0KLSAgLy8gU2V0IHVwIHRvb2x0aXBzCi0gIHZhciBUT09MVElQX01BUkdJTiA9IDEwOwotICAkKCdhY3JvbnltLC50b29sdGlwLWxpbmsnKS5lYWNoKGZ1bmN0aW9uKCkgewotICAgIHZhciAkdGFyZ2V0ID0gJCh0aGlzKTsKLSAgICB2YXIgJHRvb2x0aXAgPSAkKCc8ZGl2PicpCi0gICAgICAgIC5hZGRDbGFzcygndG9vbHRpcC1ib3gnKQotICAgICAgICAuYXBwZW5kKCR0YXJnZXQuYXR0cigndGl0bGUnKSkKLSAgICAgICAgLmhpZGUoKQotICAgICAgICAuYXBwZW5kVG8oJ2JvZHknKTsKLSAgICAkdGFyZ2V0LnJlbW92ZUF0dHIoJ3RpdGxlJyk7Ci0KLSAgICAkdGFyZ2V0LmhvdmVyKGZ1bmN0aW9uKCkgewotICAgICAgLy8gaW4KLSAgICAgIHZhciB0YXJnZXRSZWN0ID0gJHRhcmdldC5vZmZzZXQoKTsKLSAgICAgIHRhcmdldFJlY3Qud2lkdGggPSAkdGFyZ2V0LndpZHRoKCk7Ci0gICAgICB0YXJnZXRSZWN0LmhlaWdodCA9ICR0YXJnZXQuaGVpZ2h0KCk7Ci0KLSAgICAgICR0b29sdGlwLmNzcyh7Ci0gICAgICAgIGxlZnQ6IHRhcmdldFJlY3QubGVmdCwKLSAgICAgICAgdG9wOiB0YXJnZXRSZWN0LnRvcCArIHRhcmdldFJlY3QuaGVpZ2h0ICsgVE9PTFRJUF9NQVJHSU4KLSAgICAgIH0pOwotICAgICAgJHRvb2x0aXAuYWRkQ2xhc3MoJ2JlbG93Jyk7Ci0gICAgICAkdG9vbHRpcC5zaG93KCk7Ci0gICAgfSwgZnVuY3Rpb24oKSB7Ci0gICAgICAvLyBvdXQKLSAgICAgICR0b29sdGlwLmhpZGUoKTsKLSAgICB9KTsKLSAgfSk7Ci0KLSAgLy8gU2V0IHVwIDxoMj4gZGVlcGxpbmtzCi0gICQoJ2gyJykuY2xpY2soZnVuY3Rpb24oKSB7Ci0gICAgdmFyIGlkID0gJCh0aGlzKS5hdHRyKCdpZCcpOwotICAgIGlmIChpZCkgewotICAgICAgZG9jdW1lbnQubG9jYXRpb24uaGFzaCA9IGlkOwotICAgIH0KLSAgfSk7Ci0KLSAgLy9Mb2FkcyB0aGUgKzEgYnV0dG9uCi0gIHZhciBwbyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpOyBwby50eXBlID0gJ3RleHQvamF2YXNjcmlwdCc7IHBvLmFzeW5jID0gdHJ1ZTsKLSAgcG8uc3JjID0gJ2h0dHBzOi8vYXBpcy5nb29nbGUuY29tL2pzL3BsdXNvbmUuanMnOwotICB2YXIgcyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdzY3JpcHQnKVswXTsgcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZShwbywgcyk7Ci0KLQotICAvLyBSZXZpc2UgdGhlIHNpZGVuYXYgd2lkdGhzIHRvIG1ha2Ugcm9vbSBmb3IgdGhlIHNjcm9sbGJhcgotICAvLyB3aGljaCBhdm9pZHMgdGhlIHZpc2libGUgd2lkdGggZnJvbSBjaGFuZ2luZyBlYWNoIHRpbWUgdGhlIGJhciBhcHBlYXJzCi0gIHZhciAkc2lkZW5hdiA9ICQoIiNzaWRlLW5hdiIpOwotICB2YXIgc2lkZW5hdl93aWR0aCA9IHBhcnNlSW50KCRzaWRlbmF2LmlubmVyV2lkdGgoKSk7Ci0KLSAgJCgiI2RldmRvYy1uYXYgICNuYXYiKS5jc3MoIndpZHRoIiwgc2lkZW5hdl93aWR0aCAtIDQgKyAicHgiKTsgLy8gNHB4IGlzIHNjcm9sbGJhciB3aWR0aAotCi0KLSAgJCgiLnNjcm9sbC1wYW5lIikucmVtb3ZlQXR0cigidGFiaW5kZXgiKTsgLy8gZ2V0IHJpZCBvZiB0YWJpbmRleCBhZGRlZCBieSBqc2Nyb2xsZXIKLQotICBpZiAoJCgiLnNjcm9sbC1wYW5lIikubGVuZ3RoID4gMSkgewotICAgIC8vIENoZWNrIGlmIHRoZXJlJ3MgYSB1c2VyIHByZWZlcmVuY2UgZm9yIHRoZSBwYW5lbCBoZWlnaHRzCi0gICAgdmFyIGNvb2tpZUhlaWdodCA9IHJlYWRDb29raWUoInJlZmVyZW5jZV9oZWlnaHQiKTsKLSAgICBpZiAoY29va2llSGVpZ2h0KSB7Ci0gICAgICByZXN0b3JlSGVpZ2h0KGNvb2tpZUhlaWdodCk7Ci0gICAgfQotICB9Ci0KLSAgcmVzaXplTmF2KCk7Ci0KLSAgLyogaW5pdCB0aGUgbGFuZ3VhZ2Ugc2VsZWN0b3IgYmFzZWQgb24gdXNlciBjb29raWUgZm9yIGxhbmcgKi8KLSAgbG9hZExhbmdQcmVmKCk7Ci0gIGNoYW5nZU5hdkxhbmcoZ2V0TGFuZ1ByZWYoKSk7Ci0KLSAgLyogc2V0dXAgZXZlbnQgaGFuZGxlcnMgdG8gZW5zdXJlIHRoZSBvdmVyZmxvdyBtZW51IGlzIHZpc2libGUgd2hpbGUgcGlja2luZyBsYW5nICovCi0gICQoIiNsYW5ndWFnZSBzZWxlY3QiKQotICAgICAgLm1vdXNlZG93bihmdW5jdGlvbigpIHsKLSAgICAgICAgJCgiZGl2Lm1vcmVob3ZlciIpLmFkZENsYXNzKCJob3ZlciIpOyB9KQotICAgICAgLmJsdXIoZnVuY3Rpb24oKSB7Ci0gICAgICAgICQoImRpdi5tb3JlaG92ZXIiKS5yZW1vdmVDbGFzcygiaG92ZXIiKTsgfSk7Ci0KLSAgLyogc29tZSBnbG9iYWwgdmFyaWFibGUgc2V0dXAgKi8KLSAgcmVzaXplUGFja2FnZXNOYXYgPSAkKCIjcmVzaXplLXBhY2thZ2VzLW5hdiIpOwotICBjbGFzc2VzTmF2ID0gJCgiI2NsYXNzZXMtbmF2Iik7Ci0gIGRldmRvY05hdiA9ICQoIiNkZXZkb2MtbmF2Iik7Ci0KLSAgdmFyIGNvb2tpZVBhdGggPSAiIjsKLSAgaWYgKGxvY2F0aW9uLmhyZWYuaW5kZXhPZigiL3JlZmVyZW5jZS8iKSAhPSAtMSkgewotICAgIGNvb2tpZVBhdGggPSAicmVmZXJlbmNlXyI7Ci0gIH0gZWxzZSBpZiAobG9jYXRpb24uaHJlZi5pbmRleE9mKCIvZ3VpZGUvIikgIT0gLTEpIHsKLSAgICBjb29raWVQYXRoID0gImd1aWRlXyI7Ci0gIH0gZWxzZSBpZiAobG9jYXRpb24uaHJlZi5pbmRleE9mKCIvdG9vbHMvIikgIT0gLTEpIHsKLSAgICBjb29raWVQYXRoID0gInRvb2xzXyI7Ci0gIH0gZWxzZSBpZiAobG9jYXRpb24uaHJlZi5pbmRleE9mKCIvdHJhaW5pbmcvIikgIT0gLTEpIHsKLSAgICBjb29raWVQYXRoID0gInRyYWluaW5nXyI7Ci0gIH0gZWxzZSBpZiAobG9jYXRpb24uaHJlZi5pbmRleE9mKCIvZGVzaWduLyIpICE9IC0xKSB7Ci0gICAgY29va2llUGF0aCA9ICJkZXNpZ25fIjsKLSAgfSBlbHNlIGlmIChsb2NhdGlvbi5ocmVmLmluZGV4T2YoIi9kaXN0cmlidXRlLyIpICE9IC0xKSB7Ci0gICAgY29va2llUGF0aCA9ICJkaXN0cmlidXRlXyI7Ci0gIH0KLQotfSk7Ci0vLyBFTkQgb2YgdGhlIG9ubG9hZCBldmVudAotCi0KLQotZnVuY3Rpb24gdG9nZ2xlRnVsbHNjcmVlbihlbmFibGUpIHsKLSAgdmFyIGRlbGF5ID0gMjA7Ci0gIHZhciBlbmFibGVkID0gdHJ1ZTsKLSAgdmFyIHN0eWxlc2hlZXQgPSAkKCdsaW5rW3JlbD0ic3R5bGVzaGVldCJdW2NsYXNzPSJmdWxsc2NyZWVuIl0nKTsKLSAgaWYgKGVuYWJsZSkgewotICAgIC8vIEN1cnJlbnRseSBOT1QgVVNJTkcgZnVsbHNjcmVlbjsgZW5hYmxlIGZ1bGxzY3JlZW4KLSAgICBzdHlsZXNoZWV0LnJlbW92ZUF0dHIoJ2Rpc2FibGVkJyk7Ci0gICAgJCgnI25hdi1zd2FwIC5mdWxsc2NyZWVuJykucmVtb3ZlQ2xhc3MoJ2Rpc2FibGVkJyk7Ci0gICAgJCgnI2RldmRvYy1uYXYnKS5jc3Moe2xlZnQ6Jyd9KTsKLSAgICBzZXRUaW1lb3V0KHVwZGF0ZVNpZGVuYXZGdWxsc2NyZWVuV2lkdGgsZGVsYXkpOyAvLyBuZWVkIHRvIHdhaXQgYSBtb21lbnQgZm9yIGNzcyB0byBzd2l0Y2gKLSAgICBlbmFibGVkID0gdHJ1ZTsKLSAgfSBlbHNlIHsKLSAgICAvLyBDdXJyZW50bHkgVVNJTkcgZnVsbHNjcmVlbjsgZGlzYWJsZSBmdWxsc2NyZWVuCi0gICAgc3R5bGVzaGVldC5hdHRyKCdkaXNhYmxlZCcsICdkaXNhYmxlZCcpOwotICAgICQoJyNuYXYtc3dhcCAuZnVsbHNjcmVlbicpLmFkZENsYXNzKCdkaXNhYmxlZCcpOwotICAgIHNldFRpbWVvdXQodXBkYXRlU2lkZW5hdkZpeGVkV2lkdGgsZGVsYXkpOyAvLyBuZWVkIHRvIHdhaXQgYSBtb21lbnQgZm9yIGNzcyB0byBzd2l0Y2gKLSAgICBlbmFibGVkID0gZmFsc2U7Ci0gIH0KLSAgd3JpdGVDb29raWUoImZ1bGxzY3JlZW4iLCBlbmFibGVkLCBudWxsLCBudWxsKTsKLSAgc2V0TmF2QmFyTGVmdFBvcygpOwotICByZXNpemVOYXYoZGVsYXkpOwotICB1cGRhdGVTaWRlTmF2UG9zaXRpb24oKTsKLSAgc2V0VGltZW91dChpbml0U2lkZW5hdkhlaWdodFJlc2l6ZSxkZWxheSk7Ci19Ci0KLQotZnVuY3Rpb24gc2V0TmF2QmFyTGVmdFBvcygpIHsKLSAgbmF2QmFyTGVmdFBvcyA9ICQoJyNib2R5LWNvbnRlbnQnKS5vZmZzZXQoKS5sZWZ0OwotfQotCi0KLWZ1bmN0aW9uIHVwZGF0ZVNpZGVOYXZQb3NpdGlvbigpIHsKLSAgdmFyIG5ld0xlZnQgPSAkKHdpbmRvdykuc2Nyb2xsTGVmdCgpIC0gbmF2QmFyTGVmdFBvczsKLSAgJCgnI2RldmRvYy1uYXYnKS5jc3Moe2xlZnQ6IC1uZXdMZWZ0fSk7Ci0gICQoJyNkZXZkb2MtbmF2IC50b3RvcCcpLmNzcyh7bGVmdDogLShuZXdMZWZ0IC0gcGFyc2VJbnQoJCgnI3NpZGUtbmF2JykuY3NzKCdtYXJnaW4tbGVmdCcpKSl9KTsKLX0KLQotCi0KLQotCi0KLQotCi0vLyBUT0RPOiB1c2UgJChkb2N1bWVudCkucmVhZHkgaW5zdGVhZAotZnVuY3Rpb24gYWRkTG9hZEV2ZW50KG5ld2Z1bikgewotICB2YXIgY3VycmVudCA9IHdpbmRvdy5vbmxvYWQ7Ci0gIGlmICh0eXBlb2Ygd2luZG93Lm9ubG9hZCAhPSAnZnVuY3Rpb24nKSB7Ci0gICAgd2luZG93Lm9ubG9hZCA9IG5ld2Z1bjsKLSAgfSBlbHNlIHsKLSAgICB3aW5kb3cub25sb2FkID0gZnVuY3Rpb24oKSB7Ci0gICAgICBjdXJyZW50KCk7Ci0gICAgICBuZXdmdW4oKTsKLSAgICB9Ci0gIH0KLX0KLQotdmFyIGFnZW50ID0gbmF2aWdhdG9yWyd1c2VyQWdlbnQnXS50b0xvd2VyQ2FzZSgpOwotLy8gSWYgYSBtb2JpbGUgcGhvbmUsIHNldCBmbGFnIGFuZCBkbyBtb2JpbGUgc2V0dXAKLWlmICgoYWdlbnQuaW5kZXhPZigibW9iaWxlIikgIT0gLTEpIHx8ICAgICAgLy8gYW5kcm9pZCwgaXBob25lLCBpcG9kCi0gICAgKGFnZW50LmluZGV4T2YoImJsYWNrYmVycnkiKSAhPSAtMSkgfHwKLSAgICAoYWdlbnQuaW5kZXhPZigid2Vib3MiKSAhPSAtMSkgfHwKLSAgICAoYWdlbnQuaW5kZXhPZigibWluaSIpICE9IC0xKSkgeyAgICAgICAgLy8gb3BlcmEgbWluaSBicm93c2VycwotICBpc01vYmlsZSA9IHRydWU7Ci19Ci0KLQotYWRkTG9hZEV2ZW50KCBmdW5jdGlvbigpIHsKLSAgJCgicHJlOm5vdCgubm8tcHJldHR5LXByaW50KSIpLmFkZENsYXNzKCJwcmV0dHlwcmludCIpOwotICBwcmV0dHlQcmludCgpOwotfSApOwotCi0KLQotCi0vKiAjIyMjIyMjIyMgUkVTSVpFIFRIRSBTSURFTkFWIEhFSUdIVCAjIyMjIyMjIyMjICovCi0KLWZ1bmN0aW9uIHJlc2l6ZU5hdihkZWxheSkgewotICB2YXIgJG5hdiA9ICQoIiNkZXZkb2MtbmF2Iik7Ci0gIHZhciAkd2luZG93ID0gJCh3aW5kb3cpOwotICB2YXIgbmF2SGVpZ2h0OwotCi0gIC8vIEdldCB0aGUgaGVpZ2h0IG9mIGVudGlyZSB3aW5kb3cgYW5kIHRoZSB0b3RhbCBoZWFkZXIgaGVpZ2h0LgotICAvLyBUaGVuIGZpZ3VyZSBvdXQgYmFzZWQgb24gc2Nyb2xsIHBvc2l0aW9uIHdoZXRoZXIgdGhlIGhlYWRlciBpcyB2aXNpYmxlCi0gIHZhciB3aW5kb3dIZWlnaHQgPSAkd2luZG93LmhlaWdodCgpOwotICB2YXIgc2Nyb2xsVG9wID0gJHdpbmRvdy5zY3JvbGxUb3AoKTsKLSAgdmFyIGhlYWRlckhlaWdodCA9ICQoJyNoZWFkZXInKS5vdXRlckhlaWdodCgpOwotICB2YXIgc3ViaGVhZGVySGVpZ2h0ID0gJCgnI25hdi14Jykub3V0ZXJIZWlnaHQoKTsKLSAgdmFyIGhlYWRlclZpc2libGUgPSAoc2Nyb2xsVG9wIDwgKGhlYWRlckhlaWdodCArIHN1YmhlYWRlckhlaWdodCkpOwotCi0gIC8vIGdldCB0aGUgaGVpZ2h0IG9mIHNwYWNlIGJldHdlZW4gbmF2IGFuZCB0b3Agb2Ygd2luZG93LgotICAvLyBDb3VsZCBiZSBlaXRoZXIgbWFyZ2luIG9yIHRvcCBwb3NpdGlvbiwgZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIG5hdiBpcyBmaXhlZC4KLSAgdmFyIHRvcE1hcmdpbiA9IChwYXJzZUludCgkbmF2LmNzcygnbWFyZ2luLXRvcCcpKSB8fCBwYXJzZUludCgkbmF2LmNzcygndG9wJykpKSArIDE7Ci0gIC8vIGFkZCAxIGZvciB0aGUgI3NpZGUtbmF2IGJvdHRvbSBtYXJnaW4KLQotICAvLyBEZXBlbmRpbmcgb24gd2hldGhlciB0aGUgaGVhZGVyIGlzIHZpc2libGUsIHNldCB0aGUgc2lkZSBuYXYncyBoZWlnaHQuCi0gIGlmIChoZWFkZXJWaXNpYmxlKSB7Ci0gICAgLy8gVGhlIHNpZGVuYXYgaGVpZ2h0IGdyb3dzIGFzIHRoZSBoZWFkZXIgZ29lcyBvZmYgc2NyZWVuCi0gICAgbmF2SGVpZ2h0ID0gd2luZG93SGVpZ2h0IC0gKGhlYWRlckhlaWdodCArIHN1YmhlYWRlckhlaWdodCAtIHNjcm9sbFRvcCkgLSB0b3BNYXJnaW47Ci0gIH0gZWxzZSB7Ci0gICAgLy8gT25jZSBoZWFkZXIgaXMgb2ZmIHNjcmVlbiwgdGhlIG5hdiBoZWlnaHQgaXMgYWxtb3N0IGZ1bGwgd2luZG93IGhlaWdodAotICAgIG5hdkhlaWdodCA9IHdpbmRvd0hlaWdodCAtIHRvcE1hcmdpbjsKLSAgfQotCi0KLQotICAkc2Nyb2xsUGFuZXMgPSAkKCIuc2Nyb2xsLXBhbmUiKTsKLSAgaWYgKCRzY3JvbGxQYW5lcy5sZW5ndGggPiAxKSB7Ci0gICAgLy8gc3VidHJhY3QgdGhlIGhlaWdodCBvZiB0aGUgYXBpIGxldmVsIHdpZGdldCBhbmQgbmF2IHN3YXBwZXIgZnJvbSB0aGUgYXZhaWxhYmxlIG5hdiBoZWlnaHQKLSAgICBuYXZIZWlnaHQgLT0gKCQoJyNhcGktbmF2LWhlYWRlcicpLm91dGVySGVpZ2h0KHRydWUpICsgJCgnI25hdi1zd2FwJykub3V0ZXJIZWlnaHQodHJ1ZSkpOwotCi0gICAgJCgiI3N3YXBwZXIiKS5jc3Moe2hlaWdodDpuYXZIZWlnaHQgKyAicHgifSk7Ci0gICAgaWYgKCQoIiNuYXYtdHJlZSIpLmlzKCI6dmlzaWJsZSIpKSB7Ci0gICAgICAkKCIjbmF2LXRyZWUiKS5jc3Moe2hlaWdodDpuYXZIZWlnaHR9KTsKLSAgICB9Ci0KLSAgICB2YXIgY2xhc3Nlc0hlaWdodCA9IG5hdkhlaWdodCAtIHBhcnNlSW50KCQoIiNyZXNpemUtcGFja2FnZXMtbmF2IikuY3NzKCJoZWlnaHQiKSkgLSAxMCArICJweCI7Ci0gICAgLy9zdWJ0cmFjdCAxMHB4IHRvIGFjY291bnQgZm9yIGRyYWcgYmFyCi0KLSAgICAvLyBpZiB0aGUgd2luZG93IGJlY29tZXMgc21hbGwgZW5vdWdoIHRvIG1ha2UgdGhlIGNsYXNzIHBhbmVsIGhlaWdodCAwLAotICAgIC8vIHRoZW4gdGhlIHBhY2thZ2UgcGFuZWwgc2hvdWxkIGJlZ2luIHRvIHNocmluawotICAgIGlmIChwYXJzZUludChjbGFzc2VzSGVpZ2h0KSA8PSAwKSB7Ci0gICAgICAkKCIjcmVzaXplLXBhY2thZ2VzLW5hdiIpLmNzcyh7aGVpZ2h0Om5hdkhlaWdodCAtIDEwfSk7IC8vc3VidHJhY3QgMTBweCBmb3IgZHJhZyBiYXIKLSAgICAgICQoIiNwYWNrYWdlcy1uYXYiKS5jc3Moe2hlaWdodDpuYXZIZWlnaHQgLSAxMH0pOwotICAgIH0KLQotICAgICQoIiNjbGFzc2VzLW5hdiIpLmNzcyh7J2hlaWdodCc6Y2xhc3Nlc0hlaWdodCwgJ21hcmdpbi10b3AnOicxMHB4J30pOwotICAgICQoIiNjbGFzc2VzLW5hdiAuanNwQ29udGFpbmVyIikuY3NzKHtoZWlnaHQ6Y2xhc3Nlc0hlaWdodH0pOwotCi0KLSAgfSBlbHNlIHsKLSAgICAkbmF2LmhlaWdodChuYXZIZWlnaHQpOwotICB9Ci0KLSAgaWYgKGRlbGF5KSB7Ci0gICAgdXBkYXRlRnJvbVJlc2l6ZSA9IHRydWU7Ci0gICAgZGVsYXllZFJlSW5pdFNjcm9sbGJhcnMoZGVsYXkpOwotICB9IGVsc2UgewotICAgIHJlSW5pdFNjcm9sbGJhcnMoKTsKLSAgfQotCi19Ci0KLXZhciB1cGRhdGVTY3JvbGxiYXJzID0gZmFsc2U7Ci12YXIgdXBkYXRlRnJvbVJlc2l6ZSA9IGZhbHNlOwotCi0vKiBSZS1pbml0aWFsaXplIHRoZSBzY3JvbGxiYXJzIHRvIGFjY291bnQgZm9yIGNoYW5nZWQgbmF2IHNpemUuCi0gKiBUaGlzIG1ldGhvZCBwb3N0cG9uZXMgdGhlIGFjdHVhbCB1cGRhdGUgYnkgYSAxLzQgc2Vjb25kIGluIG9yZGVyIHRvIG9wdGltaXplIHRoZQotICogc2Nyb2xsIHBlcmZvcm1hbmNlIHdoaWxlIHRoZSBoZWFkZXIgaXMgc3RpbGwgdmlzaWJsZSwgYmVjYXVzZSByZS1pbml0aWFsaXppbmcgdGhlCi0gKiBzY3JvbGwgcGFuZXMgaXMgYW4gaW50ZW5zaXZlIHByb2Nlc3MuCi0gKi8KLWZ1bmN0aW9uIGRlbGF5ZWRSZUluaXRTY3JvbGxiYXJzKGRlbGF5KSB7Ci0gIC8vIElmIHdlJ3JlIHNjaGVkdWxlZCBmb3IgYW4gdXBkYXRlLCBidXQgaGF2ZSByZWNlaXZlZCBhbm90aGVyIHJlc2l6ZSByZXF1ZXN0Ci0gIC8vIGJlZm9yZSB0aGUgc2NoZWR1bGVkIHJlc2l6ZSBoYXMgb2NjdXJlZCwganVzdCBpZ25vcmUgdGhlIG5ldyByZXF1ZXN0Ci0gIC8vIChhbmQgd2FpdCBmb3IgdGhlIHNjaGVkdWxlZCBvbmUpLgotICBpZiAodXBkYXRlU2Nyb2xsYmFycyAmJiB1cGRhdGVGcm9tUmVzaXplKSB7Ci0gICAgdXBkYXRlRnJvbVJlc2l6ZSA9IGZhbHNlOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8vIFdlJ3JlIHNjaGVkdWxlZCBmb3IgYW4gdXBkYXRlIGFuZCB0aGUgdXBkYXRlIHJlcXVlc3QgY2FtZSBmcm9tIHRoaXMgbWV0aG9kJ3Mgc2V0VGltZW91dAotICBpZiAodXBkYXRlU2Nyb2xsYmFycyAmJiAhdXBkYXRlRnJvbVJlc2l6ZSkgewotICAgIHJlSW5pdFNjcm9sbGJhcnMoKTsKLSAgICB1cGRhdGVTY3JvbGxiYXJzID0gZmFsc2U7Ci0gIH0gZWxzZSB7Ci0gICAgdXBkYXRlU2Nyb2xsYmFycyA9IHRydWU7Ci0gICAgdXBkYXRlRnJvbVJlc2l6ZSA9IGZhbHNlOwotICAgIHNldFRpbWVvdXQoJ2RlbGF5ZWRSZUluaXRTY3JvbGxiYXJzKCknLGRlbGF5KTsKLSAgfQotfQotCi0vKiBSZS1pbml0aWFsaXplIHRoZSBzY3JvbGxiYXJzIHRvIGFjY291bnQgZm9yIGNoYW5nZWQgbmF2IHNpemUuICovCi1mdW5jdGlvbiByZUluaXRTY3JvbGxiYXJzKCkgewotICB2YXIgcGFuZSA9ICQoIi5zY3JvbGwtcGFuZSIpLmVhY2goZnVuY3Rpb24oKXsKLSAgICB2YXIgYXBpID0gJCh0aGlzKS5kYXRhKCdqc3AnKTsKLSAgICBpZiAoIWFwaSkgeyBzZXRUaW1lb3V0KHJlSW5pdFNjcm9sbGJhcnMsMzAwKTsgcmV0dXJuO30KLSAgICBhcGkucmVpbml0aWFsaXNlKCB7dmVydGljYWxHdXR0ZXI6MH0gKTsKLSAgfSk7Ci0gICQoIi5zY3JvbGwtcGFuZSIpLnJlbW92ZUF0dHIoInRhYmluZGV4Iik7IC8vIGdldCByaWQgb2YgdGFiaW5kZXggYWRkZWQgYnkganNjcm9sbGVyCi19Ci0KLQotLyogUmVzaXplIHRoZSBoZWlnaHQgb2YgdGhlIG5hdiBwYW5lbHMgaW4gdGhlIHJlZmVyZW5jZSwKLSAqIGFuZCBzYXZlIHRoZSBuZXcgc2l6ZSB0byBhIGNvb2tpZSAqLwotZnVuY3Rpb24gc2F2ZU5hdlBhbmVscygpIHsKLSAgdmFyIGJhc2VQYXRoID0gZ2V0QmFzZVVyaShsb2NhdGlvbi5wYXRobmFtZSk7Ci0gIHZhciBzZWN0aW9uID0gYmFzZVBhdGguc3Vic3RyaW5nKDEsYmFzZVBhdGguaW5kZXhPZigiLyIsMSkpOwotICB3cml0ZUNvb2tpZSgiaGVpZ2h0IiwgcmVzaXplUGFja2FnZXNOYXYuY3NzKCJoZWlnaHQiKSwgc2VjdGlvbiwgbnVsbCk7Ci19Ci0KLQotCi1mdW5jdGlvbiByZXN0b3JlSGVpZ2h0KHBhY2thZ2VIZWlnaHQpIHsKLSAgICAkKCIjcmVzaXplLXBhY2thZ2VzLW5hdiIpLmhlaWdodChwYWNrYWdlSGVpZ2h0KTsKLSAgICAkKCIjcGFja2FnZXMtbmF2IikuaGVpZ2h0KHBhY2thZ2VIZWlnaHQpOwotICAvLyAgdmFyIGNsYXNzZXNIZWlnaHQgPSBuYXZIZWlnaHQgLSBwYWNrYWdlSGVpZ2h0OwotIC8vICAgJCgiI2NsYXNzZXMtbmF2IikuY3NzKHtoZWlnaHQ6Y2xhc3Nlc0hlaWdodH0pOwotICAvLyAgJCgiI2NsYXNzZXMtbmF2IC5qc3BDb250YWluZXIiKS5jc3Moe2hlaWdodDpjbGFzc2VzSGVpZ2h0fSk7Ci19Ci0KLQotCi0vKiAjIyMjIyMjIyMgRU5EIFJFU0laRSBUSEUgU0lERU5BViBIRUlHSFQgIyMjIyMjIyMjIyAqLwotCi0KLQotCi0KLS8qKiBTY3JvbGwgdGhlIGpTY3JvbGxQYW5lIHRvIG1ha2UgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBpdGVtIHZpc2libGUKLSAgICBUaGlzIGlzIGNhbGxlZCB3aGVuIHRoZSBwYWdlIGZpbmlzaGVkIGxvYWRpbmcuICovCi1mdW5jdGlvbiBzY3JvbGxJbnRvVmlldyhuYXYpIHsKLSAgdmFyICRuYXYgPSAkKCIjIituYXYpOwotICB2YXIgZWxlbWVudCA9ICRuYXYualNjcm9sbFBhbmUoey8qIC4uLnNldHRpbmdzLi4uICovfSk7Ci0gIHZhciBhcGkgPSBlbGVtZW50LmRhdGEoJ2pzcCcpOwotCi0gIGlmICgkbmF2LmlzKCc6dmlzaWJsZScpKSB7Ci0gICAgdmFyICRzZWxlY3RlZCA9ICQoIi5zZWxlY3RlZCIsICRuYXYpOwotICAgIGlmICgkc2VsZWN0ZWQubGVuZ3RoID09IDApIHJldHVybjsKLQotICAgIHZhciBzZWxlY3RlZE9mZnNldCA9ICRzZWxlY3RlZC5wb3NpdGlvbigpLnRvcDsKLSAgICBpZiAoc2VsZWN0ZWRPZmZzZXQgKyA5MCA+ICRuYXYuaGVpZ2h0KCkpIHsgIC8vIGFkZCA5MCBzbyB0aGF0IHdlIHNjcm9sbCB1cCBldmVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgY3VycmVudCBpdGVtIGlzIGNsb3NlIHRvIHRoZSBib3R0b20KLSAgICAgIGFwaS5zY3JvbGxUbygwLCBzZWxlY3RlZE9mZnNldCAtICgkbmF2LmhlaWdodCgpIC8gNCksIGZhbHNlKTsgLy8gc2Nyb2xsIHRoZSBpdGVtIGludG8gdmlldwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0byBiZSAxLzQgb2YgdGhlIHdheSBmcm9tIHRoZSB0b3AKLSAgICB9Ci0gIH0KLX0KLQotCi0KLQotCi0KLS8qIFNob3cgcG9wdXAgZGlhbG9ncyAqLwotZnVuY3Rpb24gc2hvd0RpYWxvZyhpZCkgewotICAkZGlhbG9nID0gJCgiIyIraWQpOwotICAkZGlhbG9nLnByZXBlbmQoJzxkaXYgY2xhc3M9ImJveC1ib3JkZXIiPjxkaXYgY2xhc3M9InRvcCI+IDxkaXYgY2xhc3M9ImxlZnQiPjwvZGl2PiA8ZGl2IGNsYXNzPSJyaWdodCI+PC9kaXY+PC9kaXY+PGRpdiBjbGFzcz0iYm90dG9tIj4gPGRpdiBjbGFzcz0ibGVmdCI+PC9kaXY+IDxkaXYgY2xhc3M9InJpZ2h0Ij48L2Rpdj4gPC9kaXY+IDwvZGl2PicpOwotICAkZGlhbG9nLndyYXBJbm5lcignPGRpdi8+Jyk7Ci0gICRkaWFsb2cucmVtb3ZlQ2xhc3MoImhpZGUiKTsKLX0KLQotCi0KLQotCi0vKiAjIyMjIyMjIyMgICAgQ09PS0lFUyEgICAgICMjIyMjIyMjIyMgKi8KLQotZnVuY3Rpb24gcmVhZENvb2tpZShjb29raWUpIHsKLSAgdmFyIG15Q29va2llID0gY29va2llX25hbWVzcGFjZSsiXyIrY29va2llKyI9IjsKLSAgaWYgKGRvY3VtZW50LmNvb2tpZSkgewotICAgIHZhciBpbmRleCA9IGRvY3VtZW50LmNvb2tpZS5pbmRleE9mKG15Q29va2llKTsKLSAgICBpZiAoaW5kZXggIT0gLTEpIHsKLSAgICAgIHZhciB2YWxTdGFydCA9IGluZGV4ICsgbXlDb29raWUubGVuZ3RoOwotICAgICAgdmFyIHZhbEVuZCA9IGRvY3VtZW50LmNvb2tpZS5pbmRleE9mKCI7IiwgdmFsU3RhcnQpOwotICAgICAgaWYgKHZhbEVuZCA9PSAtMSkgewotICAgICAgICB2YWxFbmQgPSBkb2N1bWVudC5jb29raWUubGVuZ3RoOwotICAgICAgfQotICAgICAgdmFyIHZhbCA9IGRvY3VtZW50LmNvb2tpZS5zdWJzdHJpbmcodmFsU3RhcnQsIHZhbEVuZCk7Ci0gICAgICByZXR1cm4gdmFsOwotICAgIH0KLSAgfQotICByZXR1cm4gMDsKLX0KLQotZnVuY3Rpb24gd3JpdGVDb29raWUoY29va2llLCB2YWwsIHNlY3Rpb24sIGV4cGlyYXRpb24pIHsKLSAgaWYgKHZhbD09dW5kZWZpbmVkKSByZXR1cm47Ci0gIHNlY3Rpb24gPSBzZWN0aW9uID09IG51bGwgPyAiXyIgOiAiXyIrc2VjdGlvbisiXyI7Ci0gIGlmIChleHBpcmF0aW9uID09IG51bGwpIHsKLSAgICB2YXIgZGF0ZSA9IG5ldyBEYXRlKCk7Ci0gICAgZGF0ZS5zZXRUaW1lKGRhdGUuZ2V0VGltZSgpKygxMCozNjUqMjQqNjAqNjAqMTAwMCkpOyAvLyBkZWZhdWx0IGV4cGlyYXRpb24gaXMgb25lIHdlZWsKLSAgICBleHBpcmF0aW9uID0gZGF0ZS50b0dNVFN0cmluZygpOwotICB9Ci0gIHZhciBjb29raWVWYWx1ZSA9IGNvb2tpZV9uYW1lc3BhY2UgKyBzZWN0aW9uICsgY29va2llICsgIj0iICsgdmFsCi0gICAgICAgICAgICAgICAgICAgICsgIjsgZXhwaXJlcz0iICsgZXhwaXJhdGlvbisiOyBwYXRoPS8iOwotICBkb2N1bWVudC5jb29raWUgPSBjb29raWVWYWx1ZTsKLX0KLQotLyogIyMjIyMjIyMjICAgICBFTkQgQ09PS0lFUyEgICAgICMjIyMjIyMjIyMgKi8KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotLyoKLQotUkVNRU1CRVIgVEhFIFBSRVZJT1VTIFBBR0UgRk9SIEVBQ0ggVEFCCi0KLWZ1bmN0aW9uIGxvYWRMYXN0KGNvb2tpZVBhdGgpIHsKLSAgdmFyIGxvY2F0aW9uID0gd2luZG93LmxvY2F0aW9uLmhyZWY7Ci0gIGlmIChsb2NhdGlvbi5pbmRleE9mKCIvIitjb29raWVQYXRoKyIvIikgIT0gLTEpIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICB2YXIgbGFzdFBhZ2UgPSByZWFkQ29va2llKGNvb2tpZVBhdGggKyAiX2xhc3RwYWdlIik7Ci0gIGlmIChsYXN0UGFnZSkgewotICAgIHdpbmRvdy5sb2NhdGlvbiA9IGxhc3RQYWdlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0KLSQod2luZG93KS51bmxvYWQoZnVuY3Rpb24oKXsKLSAgdmFyIHBhdGggPSBnZXRCYXNlVXJpKGxvY2F0aW9uLnBhdGhuYW1lKTsKLSAgaWYgKHBhdGguaW5kZXhPZigiL3JlZmVyZW5jZS8iKSAhPSAtMSkgewotICAgIHdyaXRlQ29va2llKCJsYXN0cGFnZSIsIHBhdGgsICJyZWZlcmVuY2UiLCBudWxsKTsKLSAgfSBlbHNlIGlmIChwYXRoLmluZGV4T2YoIi9ndWlkZS8iKSAhPSAtMSkgewotICAgIHdyaXRlQ29va2llKCJsYXN0cGFnZSIsIHBhdGgsICJndWlkZSIsIG51bGwpOwotICB9IGVsc2UgaWYgKChwYXRoLmluZGV4T2YoIi9yZXNvdXJjZXMvIikgIT0gLTEpIHx8IChwYXRoLmluZGV4T2YoIi90cmFpbmluZy8iKSAhPSAtMSkpIHsKLSAgICB3cml0ZUNvb2tpZSgibGFzdHBhZ2UiLCBwYXRoLCAicmVzb3VyY2VzIiwgbnVsbCk7Ci0gIH0KLX0pOwotCi0qLwotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLWZ1bmN0aW9uIHRvZ2dsZShvYmosIHNsaWRlKSB7Ci0gIHZhciB1bCA9ICQoInVsOmZpcnN0Iiwgb2JqKTsKLSAgdmFyIGxpID0gdWwucGFyZW50KCk7Ci0gIGlmIChsaS5oYXNDbGFzcygiY2xvc2VkIikpIHsKLSAgICBpZiAoc2xpZGUpIHsKLSAgICAgIHVsLnNsaWRlRG93bigiZmFzdCIpOwotICAgIH0gZWxzZSB7Ci0gICAgICB1bC5zaG93KCk7Ci0gICAgfQotICAgIGxpLnJlbW92ZUNsYXNzKCJjbG9zZWQiKTsKLSAgICBsaS5hZGRDbGFzcygib3BlbiIpOwotICAgICQoIi50b2dnbGUtaW1nIiwgbGkpLmF0dHIoInRpdGxlIiwgImhpZGUgcGFnZXMiKTsKLSAgfSBlbHNlIHsKLSAgICB1bC5zbGlkZVVwKCJmYXN0Iik7Ci0gICAgbGkucmVtb3ZlQ2xhc3MoIm9wZW4iKTsKLSAgICBsaS5hZGRDbGFzcygiY2xvc2VkIik7Ci0gICAgJCgiLnRvZ2dsZS1pbWciLCBsaSkuYXR0cigidGl0bGUiLCAic2hvdyBwYWdlcyIpOwotICB9Ci19Ci0KLQotCi0KLQotZnVuY3Rpb24gYnVpbGRUb2dnbGVMaXN0cygpIHsKLSAgJCgiLnRvZ2dsZS1saXN0IikuZWFjaCgKLSAgICBmdW5jdGlvbihpKSB7Ci0gICAgICAkKCJkaXY6Zmlyc3QiLCB0aGlzKS5hcHBlbmQoIjxhIGNsYXNzPSd0b2dnbGUtaW1nJyBocmVmPScjJyB0aXRsZT0nc2hvdyBwYWdlcycgb25DbGljaz0ndG9nZ2xlKHRoaXMucGFyZW50Tm9kZS5wYXJlbnROb2RlLCB0cnVlKTsgcmV0dXJuIGZhbHNlOyc+PC9hPiIpOwotICAgICAgJCh0aGlzKS5hZGRDbGFzcygiY2xvc2VkIik7Ci0gICAgfSk7Ci19Ci0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotLyogICAgICBSRUZFUkVOQ0UgTkFWIFNXQVAgICAgICovCi0KLQotZnVuY3Rpb24gZ2V0TmF2UHJlZigpIHsKLSAgdmFyIHYgPSByZWFkQ29va2llKCdyZWZlcmVuY2VfbmF2Jyk7Ci0gIGlmICh2ICE9IE5BVl9QUkVGX1RSRUUpIHsKLSAgICB2ID0gTkFWX1BSRUZfUEFORUxTOwotICB9Ci0gIHJldHVybiB2OwotfQotCi1mdW5jdGlvbiBjaG9vc2VEZWZhdWx0TmF2KCkgewotICBuYXZfcHJlZiA9IGdldE5hdlByZWYoKTsKLSAgaWYgKG5hdl9wcmVmID09IE5BVl9QUkVGX1RSRUUpIHsKLSAgICAkKCIjbmF2LXBhbmVscyIpLnRvZ2dsZSgpOwotICAgICQoIiNwYW5lbC1saW5rIikudG9nZ2xlKCk7Ci0gICAgJCgiI25hdi10cmVlIikudG9nZ2xlKCk7Ci0gICAgJCgiI3RyZWUtbGluayIpLnRvZ2dsZSgpOwotICB9Ci19Ci0KLWZ1bmN0aW9uIHN3YXBOYXYoKSB7Ci0gIGlmIChuYXZfcHJlZiA9PSBOQVZfUFJFRl9UUkVFKSB7Ci0gICAgbmF2X3ByZWYgPSBOQVZfUFJFRl9QQU5FTFM7Ci0gIH0gZWxzZSB7Ci0gICAgbmF2X3ByZWYgPSBOQVZfUFJFRl9UUkVFOwotICAgIGluaXRfZGVmYXVsdF9uYXZ0cmVlKHRvUm9vdCk7Ci0gIH0KLSAgdmFyIGRhdGUgPSBuZXcgRGF0ZSgpOwotICBkYXRlLnNldFRpbWUoZGF0ZS5nZXRUaW1lKCkrKDEwKjM2NSoyNCo2MCo2MCoxMDAwKSk7IC8vIGtlZXAgdGhpcyBmb3IgMTAgeWVhcnMKLSAgd3JpdGVDb29raWUoIm5hdiIsIG5hdl9wcmVmLCAicmVmZXJlbmNlIiwgZGF0ZS50b0dNVFN0cmluZygpKTsKLQotICAkKCIjbmF2LXBhbmVscyIpLnRvZ2dsZSgpOwotICAkKCIjcGFuZWwtbGluayIpLnRvZ2dsZSgpOwotICAkKCIjbmF2LXRyZWUiKS50b2dnbGUoKTsKLSAgJCgiI3RyZWUtbGluayIpLnRvZ2dsZSgpOwotCi0gIHJlc2l6ZU5hdigpOwotCi0gIC8vIEdyb3NzIG5hc3R5IGhhY2sgdG8gbWFrZSB0cmVlIHZpZXcgc2hvdyB1cCB1cG9uIGZpcnN0IHN3YXAgYnkgc2V0dGluZyBoZWlnaHQgbWFudWFsbHkKLSAgJCgiI25hdi10cmVlIC5qc3BDb250YWluZXI6dmlzaWJsZSIpCi0gICAgICAuY3NzKHsnaGVpZ2h0JzokKCIjbmF2LXRyZWUgLmpzcENvbnRhaW5lciAuanNwUGFuZSIpLmhlaWdodCgpICsncHgnfSk7Ci0gIC8vIEFub3RoZXIgbmFzdHkgaGFjayB0byBtYWtlIHRoZSBzY3JvbGxiYXIgYXBwZWFyIG5vdyB0aGF0IHdlIGhhdmUgaGVpZ2h0Ci0gIHJlc2l6ZU5hdigpOwotCi0gIGlmICgkKCIjbmF2LXRyZWUiKS5pcygnOnZpc2libGUnKSkgewotICAgIHNjcm9sbEludG9WaWV3KCJuYXYtdHJlZSIpOwotICB9IGVsc2UgewotICAgIHNjcm9sbEludG9WaWV3KCJwYWNrYWdlcy1uYXYiKTsKLSAgICBzY3JvbGxJbnRvVmlldygiY2xhc3Nlcy1uYXYiKTsKLSAgfQotfQotCi0KLQotLyogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgKi8KLS8qICMjIyMjIyMjIyMgICAgIExPQ0FMSVpBVElPTiAgICAgIyMjIyMjIyMjIyMjICovCi0vKiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAqLwotCi1mdW5jdGlvbiBnZXRCYXNlVXJpKHVyaSkgewotICB2YXIgaW50bFVybCA9ICh1cmkuc3Vic3RyaW5nKDAsNikgPT0gIi9pbnRsLyIpOwotICBpZiAoaW50bFVybCkgewotICAgIGJhc2UgPSB1cmkuc3Vic3RyaW5nKHVyaS5pbmRleE9mKCdpbnRsLycpKzUsdXJpLmxlbmd0aCk7Ci0gICAgYmFzZSA9IGJhc2Uuc3Vic3RyaW5nKGJhc2UuaW5kZXhPZignLycpKzEsIGJhc2UubGVuZ3RoKTsKLSAgICAgIC8vYWxlcnQoImludGwsIHJldHVybmluZyBiYXNlIHVybDogLyIgKyBiYXNlKTsKLSAgICByZXR1cm4gKCIvIiArIGJhc2UpOwotICB9IGVsc2UgewotICAgICAgLy9hbGVydCgibm90IGludGwsIHJldHVybmluZyB1cmkgYXMgZm91bmQuIik7Ci0gICAgcmV0dXJuIHVyaTsKLSAgfQotfQotCi1mdW5jdGlvbiByZXF1ZXN0QXBwZW5kSEwodXJpKSB7Ci0vL2FwcGVuZCAiP2hsPTxsYW5nPiB0byBhbiBvdXRnb2luZyByZXF1ZXN0IChzdWNoIGFzIHRvIGJsb2cpCi0gIHZhciBsYW5nID0gZ2V0TGFuZ1ByZWYoKTsKLSAgaWYgKGxhbmcpIHsKLSAgICB2YXIgcSA9ICdobD0nICsgbGFuZzsKLSAgICB1cmkgKz0gJz8nICsgcTsKLSAgICB3aW5kb3cubG9jYXRpb24gPSB1cmk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9IGVsc2UgewotICAgIHJldHVybiB0cnVlOwotICB9Ci19Ci0KLQotZnVuY3Rpb24gY2hhbmdlTmF2TGFuZyhsYW5nKSB7Ci0gIHZhciAkbGlua3MgPSAkKCIjZGV2ZG9jLW5hdiwjaGVhZGVyLCNuYXYteCwudHJhaW5pbmctbmF2LXRvcCwuY29udGVudC1mb290ZXIiKS5maW5kKCJhWyIrbGFuZysiLWxhbmddIik7Ci0gICRsaW5rcy5lYWNoKGZ1bmN0aW9uKGkpeyAvLyBmb3IgZWFjaCBsaW5rIHdpdGggYSB0cmFuc2xhdGlvbgotICAgIHZhciAkbGluayA9ICQodGhpcyk7Ci0gICAgaWYgKGxhbmcgIT0gImVuIikgeyAvLyBObyBuZWVkIHRvIHdvcnJ5IGFib3V0IEVuZ2xpc2gsIGJlY2F1c2UgYSBsYW5ndWFnZSBjaGFuZ2UgaW52b2tlcyBuZXcgcmVxdWVzdAotICAgICAgLy8gcHV0IHRoZSBkZXNpcmVkIGxhbmd1YWdlIGZyb20gdGhlIGF0dHJpYnV0ZSBhcyB0aGUgdGV4dAotICAgICAgJGxpbmsudGV4dCgkbGluay5hdHRyKGxhbmcrIi1sYW5nIikpCi0gICAgfQotICB9KTsKLX0KLQotZnVuY3Rpb24gY2hhbmdlTGFuZ1ByZWYobGFuZywgc3VibWl0KSB7Ci0gIHZhciBkYXRlID0gbmV3IERhdGUoKTsKLSAgZXhwaXJlcyA9IGRhdGUudG9HTVRTdHJpbmcoZGF0ZS5zZXRUaW1lKGRhdGUuZ2V0VGltZSgpKygxMCozNjUqMjQqNjAqNjAqMTAwMCkpKTsKLSAgLy8ga2VlcCB0aGlzIGZvciA1MCB5ZWFycwotICAvL2FsZXJ0KCJleHBpcmVzOiAiICsgZXhwaXJlcykKLSAgd3JpdGVDb29raWUoInByZWZfbGFuZyIsIGxhbmcsIG51bGwsIGV4cGlyZXMpOwotCi0gIC8vICAjIyMjIyMjICBUT0RPOiAgUmVtb3ZlIHRoaXMgY29uZGl0aW9uIG9uY2Ugd2UncmUgc3RhYmxlIG9uIGRldnNpdGUgIyMjIyMjIwotICAvLyAgVGhpcyBjb25kaXRpb24gaXMgb25seSBuZWVkZWQgaWYgd2Ugc3RpbGwgbmVlZCB0byBzdXBwb3J0IGxlZ2FjeSBHQUUgc2VydmVyCi0gIGlmIChkZXZzaXRlKSB7Ci0gICAgLy8gU3dpdGNoIGxhbmd1YWdlIHdoZW4gb24gRGV2c2l0ZSBzZXJ2ZXIKLSAgICBpZiAoc3VibWl0KSB7Ci0gICAgICAkKCIjc2V0bGFuZyIpLnN1Ym1pdCgpOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICAvLyBTd2l0Y2ggbGFuZ3VhZ2Ugd2hlbiBvbiBsZWdhY3kgR0FFIHNlcnZlcgotICAgIGlmIChzdWJtaXQpIHsKLSAgICAgIHdpbmRvdy5sb2NhdGlvbiA9IGdldEJhc2VVcmkobG9jYXRpb24ucGF0aG5hbWUpOwotICAgIH0KLSAgfQotfQotCi1mdW5jdGlvbiBsb2FkTGFuZ1ByZWYoKSB7Ci0gIHZhciBsYW5nID0gcmVhZENvb2tpZSgicHJlZl9sYW5nIik7Ci0gIGlmIChsYW5nICE9IDApIHsKLSAgICAkKCIjbGFuZ3VhZ2UiKS5maW5kKCJvcHRpb25bdmFsdWU9JyIrbGFuZysiJ10iKS5hdHRyKCJzZWxlY3RlZCIsdHJ1ZSk7Ci0gIH0KLX0KLQotZnVuY3Rpb24gZ2V0TGFuZ1ByZWYoKSB7Ci0gIHZhciBsYW5nID0gJCgiI2xhbmd1YWdlIikuZmluZCgiOnNlbGVjdGVkIikuYXR0cigidmFsdWUiKTsKLSAgaWYgKCFsYW5nKSB7Ci0gICAgbGFuZyA9IHJlYWRDb29raWUoInByZWZfbGFuZyIpOwotICB9Ci0gIHJldHVybiAobGFuZyAhPSAwKSA/IGxhbmcgOiAnZW4nOwotfQotCi0vKiAjIyMjIyMjIyMjICAgICBFTkQgTE9DQUxJWkFUSU9OICAgICAjIyMjIyMjIyMjIyMgKi8KLQotCi0KLQotCi0KLS8qIFVzZWQgdG8gaGlkZSBhbmQgcmV2ZWFsIHN1cHBsZW1lbnRhbCBjb250ZW50LCBzdWNoIGFzIGxvbmcgY29kZSBzYW1wbGVzLgotICAgU2VlIHRoZSBjb21wYW5pb24gQ1NTIGluIGFuZHJvaWQtZGV2ZWxvcGVyLWRvY3MuY3NzICovCi1mdW5jdGlvbiB0b2dnbGVDb250ZW50KG9iaikgewotICB2YXIgZGl2ID0gJChvYmoucGFyZW50Tm9kZS5wYXJlbnROb2RlKTsKLSAgdmFyIHRvZ2dsZU1lID0gJCgiLnRvZ2dsZS1jb250ZW50LXRvZ2dsZW1lIixkaXYpOwotICBpZiAoZGl2Lmhhc0NsYXNzKCJjbG9zZWQiKSkgeyAvLyBpZiBpdCdzIGNsb3NlZCwgb3BlbiBpdAotICAgIHRvZ2dsZU1lLnNsaWRlRG93bigpOwotICAgICQoIi50b2dnbGUtY29udGVudC10ZXh0Iiwgb2JqKS50b2dnbGUoKTsKLSAgICBkaXYucmVtb3ZlQ2xhc3MoImNsb3NlZCIpLmFkZENsYXNzKCJvcGVuIik7Ci0gICAgJCgiLnRvZ2dsZS1jb250ZW50LWltZyIsIGRpdikuYXR0cigidGl0bGUiLCAiaGlkZSIpLmF0dHIoInNyYyIsIHRvUm9vdAotICAgICAgICAgICAgICAgICAgKyAiYXNzZXRzL2ltYWdlcy90cmlhbmdsZS1vcGVuZWQucG5nIik7Ci0gIH0gZWxzZSB7IC8vIGlmIGl0J3Mgb3BlbiwgY2xvc2UgaXQKLSAgICB0b2dnbGVNZS5zbGlkZVVwKCdmYXN0JywgZnVuY3Rpb24oKSB7ICAvLyBXYWl0IHVudGlsIHRoZSBhbmltYXRpb24gaXMgZG9uZSBiZWZvcmUgY2xvc2luZyBhcnJvdwotICAgICAgJCgiLnRvZ2dsZS1jb250ZW50LXRleHQiLCBvYmopLnRvZ2dsZSgpOwotICAgICAgZGl2LnJlbW92ZUNsYXNzKCJvcGVuIikuYWRkQ2xhc3MoImNsb3NlZCIpOwotICAgICAgJCgiLnRvZ2dsZS1jb250ZW50LWltZyIsIGRpdikuYXR0cigidGl0bGUiLCAic2hvdyIpLmF0dHIoInNyYyIsIHRvUm9vdAotICAgICAgICAgICAgICAgICAgKyAiYXNzZXRzL2ltYWdlcy90cmlhbmdsZS1jbG9zZWQucG5nIik7Ci0gICAgfSk7Ci0gIH0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi0KLS8qIE5ldyB2ZXJzaW9uIG9mIGV4cGFuZGFibGUgY29udGVudCAqLwotZnVuY3Rpb24gdG9nZ2xlRXhwYW5kYWJsZShsaW5rLGlkKSB7Ci0gIGlmKCQoaWQpLmlzKCc6dmlzaWJsZScpKSB7Ci0gICAgJChpZCkuc2xpZGVVcCgpOwotICAgICQobGluaykucmVtb3ZlQ2xhc3MoJ2V4cGFuZGVkJyk7Ci0gIH0gZWxzZSB7Ci0gICAgJChpZCkuc2xpZGVEb3duKCk7Ci0gICAgJChsaW5rKS5hZGRDbGFzcygnZXhwYW5kZWQnKTsKLSAgfQotfQotCi1mdW5jdGlvbiBoaWRlRXhwYW5kYWJsZShpZHMpIHsKLSAgJChpZHMpLnNsaWRlVXAoKTsKLSAgJChpZHMpLnByZXYoJ2g0JykuZmluZCgnYS5leHBhbmRhYmxlJykucmVtb3ZlQ2xhc3MoJ2V4cGFuZGVkJyk7Ci19Ci0KLQotCi0KLQotLyoKLSAqICBTbGlkZXNob3cgMS4wCi0gKiAgVXNlZCBvbiAvaW5kZXguaHRtbCBhbmQgL2RldmVsb3AvaW5kZXguaHRtbCBmb3IgY2Fyb3VzZWwKLSAqCi0gKiAgU2FtcGxlIHVzYWdlOgotICogIEhUTUwgLQotICogIDxkaXYgY2xhc3M9InNsaWRlc2hvdy1jb250YWluZXIiPgotICogICA8YSBocmVmPSIiIGNsYXNzPSJzbGlkZXNob3ctcHJldiI+UHJldjwvYT4KLSAqICAgPGEgaHJlZj0iIiBjbGFzcz0ic2xpZGVzaG93LW5leHQiPk5leHQ8L2E+Ci0gKiAgIDx1bD4KLSAqICAgICAgIDxsaSBjbGFzcz0iaXRlbSI+PGltZyBzcmM9ImltYWdlcy9tYXJxdWVlMS5qcGciPjwvbGk+Ci0gKiAgICAgICA8bGkgY2xhc3M9Iml0ZW0iPjxpbWcgc3JjPSJpbWFnZXMvbWFycXVlZTIuanBnIj48L2xpPgotICogICAgICAgPGxpIGNsYXNzPSJpdGVtIj48aW1nIHNyYz0iaW1hZ2VzL21hcnF1ZWUzLmpwZyI+PC9saT4KLSAqICAgICAgIDxsaSBjbGFzcz0iaXRlbSI+PGltZyBzcmM9ImltYWdlcy9tYXJxdWVlNC5qcGciPjwvbGk+Ci0gKiAgIDwvdWw+Ci0gKiAgPC9kaXY+Ci0gKgotICogICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gKiAgICQoJy5zbGlkZXNob3ctY29udGFpbmVyJykuZGFjU2xpZGVzaG93KHsKLSAqICAgICAgIGF1dG86IHRydWUsCi0gKiAgICAgICBidG5QcmV2OiAnLnNsaWRlc2hvdy1wcmV2JywKLSAqICAgICAgIGJ0bk5leHQ6ICcuc2xpZGVzaG93LW5leHQnCi0gKiAgIH0pOwotICogICA8L3NjcmlwdD4KLSAqCi0gKiAgT3B0aW9uczoKLSAqICBidG5QcmV2OiAgICBvcHRpb25hbCBpZGVudGlmaWVyIGZvciBwcmV2aW91cyBidXR0b24KLSAqICBidG5OZXh0OiAgICBvcHRpb25hbCBpZGVudGlmaWVyIGZvciBuZXh0IGJ1dHRvbgotICogIGJ0blBhdXNlOiAgIG9wdGlvbmFsIGlkZW50aWZpZXIgZm9yIHBhdXNlIGJ1dHRvbgotICogIGF1dG86ICAgICAgIHdoZXRoZXIgb3Igbm90IHRvIGF1dG8tcHJvY2VlZAotICogIHNwZWVkOiAgICAgIGFuaW1hdGlvbiBzcGVlZAotICogIGF1dG9UaW1lOiAgIHRpbWUgYmV0d2VlbiBhdXRvLXJvdGF0aW9uCi0gKiAgZWFzaW5nOiAgICAgZWFzaW5nIGZ1bmN0aW9uIGZvciB0cmFuc2l0aW9uCi0gKiAgc3RhcnQ6ICAgICAgaXRlbSB0byBzZWxlY3QgYnkgZGVmYXVsdAotICogIHNjcm9sbDogICAgIGRpcmVjdGlvbiB0byBzY3JvbGwgaW4KLSAqICBwYWdpbmF0aW9uOiB3aGV0aGVyIG9yIG5vdCB0byBpbmNsdWRlIGRvdHRlZCBwYWdpbmF0aW9uCi0gKgotICovCi0KLSAoZnVuY3Rpb24oJCkgewotICQuZm4uZGFjU2xpZGVzaG93ID0gZnVuY3Rpb24obykgewotCi0gICAgIC8vT3B0aW9ucyAtIHNlZSBhYm92ZQotICAgICBvID0gJC5leHRlbmQoewotICAgICAgICAgYnRuUHJldjogICBudWxsLAotICAgICAgICAgYnRuTmV4dDogICBudWxsLAotICAgICAgICAgYnRuUGF1c2U6ICBudWxsLAotICAgICAgICAgYXV0bzogICAgICB0cnVlLAotICAgICAgICAgc3BlZWQ6ICAgICA1MDAsCi0gICAgICAgICBhdXRvVGltZTogIDEyMDAwLAotICAgICAgICAgZWFzaW5nOiAgICBudWxsLAotICAgICAgICAgc3RhcnQ6ICAgICAwLAotICAgICAgICAgc2Nyb2xsOiAgICAxLAotICAgICAgICAgcGFnaW5hdGlvbjogdHJ1ZQotCi0gICAgIH0sIG8gfHwge30pOwotCi0gICAgIC8vU2V0IHVwIGEgY2Fyb3VzZWwgZm9yIGVhY2gKLSAgICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHsKLQotICAgICAgICAgdmFyIHJ1bm5pbmcgPSBmYWxzZTsKLSAgICAgICAgIHZhciBhbmltQ3NzID0gby52ZXJ0aWNhbCA/ICJ0b3AiIDogImxlZnQiOwotICAgICAgICAgdmFyIHNpemVDc3MgPSBvLnZlcnRpY2FsID8gImhlaWdodCIgOiAid2lkdGgiOwotICAgICAgICAgdmFyIGRpdiA9ICQodGhpcyk7Ci0gICAgICAgICB2YXIgdWwgPSAkKCJ1bCIsIGRpdik7Ci0gICAgICAgICB2YXIgdExpID0gJCgibGkiLCB1bCk7Ci0gICAgICAgICB2YXIgdGwgPSB0TGkuc2l6ZSgpOwotICAgICAgICAgdmFyIHRpbWVyID0gbnVsbDsKLQotICAgICAgICAgdmFyIGxpID0gJCgibGkiLCB1bCk7Ci0gICAgICAgICB2YXIgaXRlbUxlbmd0aCA9IGxpLnNpemUoKTsKLSAgICAgICAgIHZhciBjdXJyID0gby5zdGFydDsKLQotICAgICAgICAgbGkuY3NzKHtmbG9hdDogby52ZXJ0aWNhbCA/ICJub25lIiA6ICJsZWZ0In0pOwotICAgICAgICAgdWwuY3NzKHttYXJnaW46ICIwIiwgcGFkZGluZzogIjAiLCBwb3NpdGlvbjogInJlbGF0aXZlIiwgImxpc3Qtc3R5bGUtdHlwZSI6ICJub25lIiwgInotaW5kZXgiOiAiMSJ9KTsKLSAgICAgICAgIGRpdi5jc3Moe3Bvc2l0aW9uOiAicmVsYXRpdmUiLCAiei1pbmRleCI6ICIyIiwgbGVmdDogIjBweCJ9KTsKLQotICAgICAgICAgdmFyIGxpU2l6ZSA9IG8udmVydGljYWwgPyBoZWlnaHQobGkpIDogd2lkdGgobGkpOwotICAgICAgICAgdmFyIHVsU2l6ZSA9IGxpU2l6ZSAqIGl0ZW1MZW5ndGg7Ci0gICAgICAgICB2YXIgZGl2U2l6ZSA9IGxpU2l6ZTsKLQotICAgICAgICAgbGkuY3NzKHt3aWR0aDogbGkud2lkdGgoKSwgaGVpZ2h0OiBsaS5oZWlnaHQoKX0pOwotICAgICAgICAgdWwuY3NzKHNpemVDc3MsIHVsU2l6ZSsicHgiKS5jc3MoYW5pbUNzcywgLShjdXJyKmxpU2l6ZSkpOwotCi0gICAgICAgICBkaXYuY3NzKHNpemVDc3MsIGRpdlNpemUrInB4Iik7Ci0KLSAgICAgICAgIC8vUGFnaW5hdGlvbgotICAgICAgICAgaWYgKG8ucGFnaW5hdGlvbikgewotICAgICAgICAgICAgIHZhciBwYWdpbmF0aW9uID0gJCgiPGRpdiBjbGFzcz0ncGFnaW5hdGlvbic+PC9kaXY+Iik7Ci0gICAgICAgICAgICAgdmFyIHBhZ191bCA9ICQoIjx1bD48L3VsPiIpOwotICAgICAgICAgICAgIGlmICh0bCA+IDEpIHsKLSAgICAgICAgICAgICAgIGZvciAodmFyIGk9MDtpPHRsO2krKykgewotICAgICAgICAgICAgICAgICAgICB2YXIgbGkgPSAkKCI8bGk+IitpKyI8L2xpPiIpOwotICAgICAgICAgICAgICAgICAgICBwYWdfdWwuYXBwZW5kKGxpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGk9PW8uc3RhcnQpIGxpLmFkZENsYXNzKCdhY3RpdmUnKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxpLmNsaWNrKGZ1bmN0aW9uKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZ28ocGFyc2VJbnQoJCh0aGlzKS50ZXh0KCkpKTsKLSAgICAgICAgICAgICAgICAgICAgfSkKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcGFnaW5hdGlvbi5hcHBlbmQocGFnX3VsKTsKLSAgICAgICAgICAgICAgICBkaXYuYXBwZW5kKHBhZ2luYXRpb24pOwotICAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLQotICAgICAgICAgLy9QcmV2aW91cyBidXR0b24KLSAgICAgICAgIGlmKG8uYnRuUHJldikKLSAgICAgICAgICAgICAkKG8uYnRuUHJldikuY2xpY2soZnVuY3Rpb24oZSkgewotICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7Ci0gICAgICAgICAgICAgICAgIHJldHVybiBnbyhjdXJyLW8uc2Nyb2xsKTsKLSAgICAgICAgICAgICB9KTsKLQotICAgICAgICAgLy9OZXh0IGJ1dHRvbgotICAgICAgICAgaWYoby5idG5OZXh0KQotICAgICAgICAgICAgICQoby5idG5OZXh0KS5jbGljayhmdW5jdGlvbihlKSB7Ci0gICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKLSAgICAgICAgICAgICAgICAgcmV0dXJuIGdvKGN1cnIrby5zY3JvbGwpOwotICAgICAgICAgICAgIH0pOwotCi0gICAgICAgICAvL1BhdXNlIGJ1dHRvbgotICAgICAgICAgaWYoby5idG5QYXVzZSkKLSAgICAgICAgICAgICAkKG8uYnRuUGF1c2UpLmNsaWNrKGZ1bmN0aW9uKGUpIHsKLSAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwotICAgICAgICAgICAgICAgICBpZiAoJCh0aGlzKS5oYXNDbGFzcygncGF1c2VkJykpIHsKLSAgICAgICAgICAgICAgICAgICAgIHN0YXJ0Um90YXRlVGltZXIoKTsKLSAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgIHBhdXNlUm90YXRlVGltZXIoKTsKLSAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgIH0pOwotCi0gICAgICAgICAvL0F1dG8gcm90YXRpb24KLSAgICAgICAgIGlmKG8uYXV0bykgc3RhcnRSb3RhdGVUaW1lcigpOwotCi0gICAgICAgICBmdW5jdGlvbiBzdGFydFJvdGF0ZVRpbWVyKCkgewotICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwodGltZXIpOwotICAgICAgICAgICAgIHRpbWVyID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgICBpZiAoY3VyciA9PSB0bC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgIGdvKDApOwotICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZ28oY3VycitvLnNjcm9sbCk7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0sIG8uYXV0b1RpbWUpOwotICAgICAgICAgICAgICQoby5idG5QYXVzZSkucmVtb3ZlQ2xhc3MoJ3BhdXNlZCcpOwotICAgICAgICAgfQotCi0gICAgICAgICBmdW5jdGlvbiBwYXVzZVJvdGF0ZVRpbWVyKCkgewotICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwodGltZXIpOwotICAgICAgICAgICAgICQoby5idG5QYXVzZSkuYWRkQ2xhc3MoJ3BhdXNlZCcpOwotICAgICAgICAgfQotCi0gICAgICAgICAvL0dvIHRvIGFuIGl0ZW0KLSAgICAgICAgIGZ1bmN0aW9uIGdvKHRvKSB7Ci0gICAgICAgICAgICAgaWYoIXJ1bm5pbmcpIHsKLQotICAgICAgICAgICAgICAgICBpZih0bzwwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRvID0gaXRlbUxlbmd0aC0xOwotICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRvPml0ZW1MZW5ndGgtMSkgewotICAgICAgICAgICAgICAgICAgICB0byA9IDA7Ci0gICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgY3VyciA9IHRvOwotCi0gICAgICAgICAgICAgICAgIHJ1bm5pbmcgPSB0cnVlOwotCi0gICAgICAgICAgICAgICAgIHVsLmFuaW1hdGUoCi0gICAgICAgICAgICAgICAgICAgICBhbmltQ3NzID09ICJsZWZ0IiA/IHsgbGVmdDogLShjdXJyKmxpU2l6ZSkgfSA6IHsgdG9wOiAtKGN1cnIqbGlTaXplKSB9ICwgby5zcGVlZCwgby5lYXNpbmcsCi0gICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICBydW5uaW5nID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICk7Ci0KLSAgICAgICAgICAgICAgICAgJChvLmJ0blByZXYgKyAiLCIgKyBvLmJ0bk5leHQpLnJlbW92ZUNsYXNzKCJkaXNhYmxlZCIpOwotICAgICAgICAgICAgICAgICAkKCAoY3Vyci1vLnNjcm9sbDwwICYmIG8uYnRuUHJldikKLSAgICAgICAgICAgICAgICAgICAgIHx8Ci0gICAgICAgICAgICAgICAgICAgIChjdXJyK28uc2Nyb2xsID4gaXRlbUxlbmd0aCAmJiBvLmJ0bk5leHQpCi0gICAgICAgICAgICAgICAgICAgICB8fAotICAgICAgICAgICAgICAgICAgICBbXQotICAgICAgICAgICAgICAgICAgKS5hZGRDbGFzcygiZGlzYWJsZWQiKTsKLQotCi0gICAgICAgICAgICAgICAgIHZhciBuYXZfaXRlbXMgPSAkKCdsaScsIHBhZ2luYXRpb24pOwotICAgICAgICAgICAgICAgICBuYXZfaXRlbXMucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpOwotICAgICAgICAgICAgICAgICBuYXZfaXRlbXMuZXEodG8pLmFkZENsYXNzKCdhY3RpdmUnKTsKLQotCi0gICAgICAgICAgICAgfQotICAgICAgICAgICAgIGlmKG8uYXV0bykgc3RhcnRSb3RhdGVUaW1lcigpOwotICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgIH07Ci0gICAgIH0pOwotIH07Ci0KLSBmdW5jdGlvbiBjc3MoZWwsIHByb3ApIHsKLSAgICAgcmV0dXJuIHBhcnNlSW50KCQuY3NzKGVsWzBdLCBwcm9wKSkgfHwgMDsKLSB9OwotIGZ1bmN0aW9uIHdpZHRoKGVsKSB7Ci0gICAgIHJldHVybiAgZWxbMF0ub2Zmc2V0V2lkdGggKyBjc3MoZWwsICdtYXJnaW5MZWZ0JykgKyBjc3MoZWwsICdtYXJnaW5SaWdodCcpOwotIH07Ci0gZnVuY3Rpb24gaGVpZ2h0KGVsKSB7Ci0gICAgIHJldHVybiBlbFswXS5vZmZzZXRIZWlnaHQgKyBjc3MoZWwsICdtYXJnaW5Ub3AnKSArIGNzcyhlbCwgJ21hcmdpbkJvdHRvbScpOwotIH07Ci0KLSB9KShqUXVlcnkpOwotCi0KLS8qCi0gKiAgZGFjU2xpZGVzaG93IDEuMAotICogIFVzZWQgb24gZGV2ZWxvcC9pbmRleC5odG1sIGZvciBzaWRlLXNsaWRpbmcgdGFicwotICoKLSAqICBTYW1wbGUgdXNhZ2U6Ci0gKiAgSFRNTCAtCi0gKiAgPGRpdiBjbGFzcz0ic2xpZGVzaG93LWNvbnRhaW5lciI+Ci0gKiAgIDxhIGhyZWY9IiIgY2xhc3M9InNsaWRlc2hvdy1wcmV2Ij5QcmV2PC9hPgotICogICA8YSBocmVmPSIiIGNsYXNzPSJzbGlkZXNob3ctbmV4dCI+TmV4dDwvYT4KLSAqICAgPHVsPgotICogICAgICAgPGxpIGNsYXNzPSJpdGVtIj48aW1nIHNyYz0iaW1hZ2VzL21hcnF1ZWUxLmpwZyI+PC9saT4KLSAqICAgICAgIDxsaSBjbGFzcz0iaXRlbSI+PGltZyBzcmM9ImltYWdlcy9tYXJxdWVlMi5qcGciPjwvbGk+Ci0gKiAgICAgICA8bGkgY2xhc3M9Iml0ZW0iPjxpbWcgc3JjPSJpbWFnZXMvbWFycXVlZTMuanBnIj48L2xpPgotICogICAgICAgPGxpIGNsYXNzPSJpdGVtIj48aW1nIHNyYz0iaW1hZ2VzL21hcnF1ZWU0LmpwZyI+PC9saT4KLSAqICAgPC91bD4KLSAqICA8L2Rpdj4KLSAqCi0gKiAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAqICAgJCgnLnNsaWRlc2hvdy1jb250YWluZXInKS5kYWNTbGlkZXNob3coewotICogICAgICAgYXV0bzogdHJ1ZSwKLSAqICAgICAgIGJ0blByZXY6ICcuc2xpZGVzaG93LXByZXYnLAotICogICAgICAgYnRuTmV4dDogJy5zbGlkZXNob3ctbmV4dCcKLSAqICAgfSk7Ci0gKiAgIDwvc2NyaXB0PgotICoKLSAqICBPcHRpb25zOgotICogIGJ0blByZXY6ICAgIG9wdGlvbmFsIGlkZW50aWZpZXIgZm9yIHByZXZpb3VzIGJ1dHRvbgotICogIGJ0bk5leHQ6ICAgIG9wdGlvbmFsIGlkZW50aWZpZXIgZm9yIG5leHQgYnV0dG9uCi0gKiAgYXV0bzogICAgICAgd2hldGhlciBvciBub3QgdG8gYXV0by1wcm9jZWVkCi0gKiAgc3BlZWQ6ICAgICAgYW5pbWF0aW9uIHNwZWVkCi0gKiAgYXV0b1RpbWU6ICAgdGltZSBiZXR3ZWVuIGF1dG8tcm90YXRpb24KLSAqICBlYXNpbmc6ICAgICBlYXNpbmcgZnVuY3Rpb24gZm9yIHRyYW5zaXRpb24KLSAqICBzdGFydDogICAgICBpdGVtIHRvIHNlbGVjdCBieSBkZWZhdWx0Ci0gKiAgc2Nyb2xsOiAgICAgZGlyZWN0aW9uIHRvIHNjcm9sbCBpbgotICogIHBhZ2luYXRpb246IHdoZXRoZXIgb3Igbm90IHRvIGluY2x1ZGUgZG90dGVkIHBhZ2luYXRpb24KLSAqCi0gKi8KLSAoZnVuY3Rpb24oJCkgewotICQuZm4uZGFjVGFiYmVkTGlzdCA9IGZ1bmN0aW9uKG8pIHsKLQotICAgICAvL09wdGlvbnMgLSBzZWUgYWJvdmUKLSAgICAgbyA9ICQuZXh0ZW5kKHsKLSAgICAgICAgIHNwZWVkIDogMjUwLAotICAgICAgICAgZWFzaW5nOiBudWxsLAotICAgICAgICAgbmF2X2lkOiBudWxsLAotICAgICAgICAgZnJhbWVfaWQ6IG51bGwKLSAgICAgfSwgbyB8fCB7fSk7Ci0KLSAgICAgLy9TZXQgdXAgYSBjYXJvdXNlbCBmb3IgZWFjaAotICAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewotCi0gICAgICAgICB2YXIgY3VyciA9IDA7Ci0gICAgICAgICB2YXIgcnVubmluZyA9IGZhbHNlOwotICAgICAgICAgdmFyIGFuaW1Dc3MgPSAibWFyZ2luLWxlZnQiOwotICAgICAgICAgdmFyIHNpemVDc3MgPSAid2lkdGgiOwotICAgICAgICAgdmFyIGRpdiA9ICQodGhpcyk7Ci0KLSAgICAgICAgIHZhciBuYXYgPSAkKG8ubmF2X2lkLCBkaXYpOwotICAgICAgICAgdmFyIG5hdl9saSA9ICQoImxpIiwgbmF2KTsKLSAgICAgICAgIHZhciBuYXZfc2l6ZSA9IG5hdl9saS5zaXplKCk7Ci0gICAgICAgICB2YXIgZnJhbWUgPSBkaXYuZmluZChvLmZyYW1lX2lkKTsKLSAgICAgICAgIHZhciBjb250ZW50X3dpZHRoID0gJChmcmFtZSkuZmluZCgndWwnKS53aWR0aCgpOwotICAgICAgICAgLy9CdXR0b25zCi0gICAgICAgICAkKG5hdl9saSkuY2xpY2soZnVuY3Rpb24oZSkgewotICAgICAgICAgICBnbygkKG5hdl9saSkuaW5kZXgoJCh0aGlzKSkpOwotICAgICAgICAgfSkKLQotICAgICAgICAgLy9HbyB0byBhbiBpdGVtCi0gICAgICAgICBmdW5jdGlvbiBnbyh0bykgewotICAgICAgICAgICAgIGlmKCFydW5uaW5nKSB7Ci0gICAgICAgICAgICAgICAgIGN1cnIgPSB0bzsKLSAgICAgICAgICAgICAgICAgcnVubmluZyA9IHRydWU7Ci0KLSAgICAgICAgICAgICAgICAgZnJhbWUuYW5pbWF0ZSh7ICdtYXJnaW4tbGVmdCcgOiAtKGN1cnIqY29udGVudF93aWR0aCkgfSwgby5zcGVlZCwgby5lYXNpbmcsCi0gICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICBydW5uaW5nID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICk7Ci0KLQotICAgICAgICAgICAgICAgICBuYXZfbGkucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpOwotICAgICAgICAgICAgICAgICBuYXZfbGkuZXEodG8pLmFkZENsYXNzKCdhY3RpdmUnKTsKLQotCi0gICAgICAgICAgICAgfQotICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgIH07Ci0gICAgIH0pOwotIH07Ci0KLSBmdW5jdGlvbiBjc3MoZWwsIHByb3ApIHsKLSAgICAgcmV0dXJuIHBhcnNlSW50KCQuY3NzKGVsWzBdLCBwcm9wKSkgfHwgMDsKLSB9OwotIGZ1bmN0aW9uIHdpZHRoKGVsKSB7Ci0gICAgIHJldHVybiAgZWxbMF0ub2Zmc2V0V2lkdGggKyBjc3MoZWwsICdtYXJnaW5MZWZ0JykgKyBjc3MoZWwsICdtYXJnaW5SaWdodCcpOwotIH07Ci0gZnVuY3Rpb24gaGVpZ2h0KGVsKSB7Ci0gICAgIHJldHVybiBlbFswXS5vZmZzZXRIZWlnaHQgKyBjc3MoZWwsICdtYXJnaW5Ub3AnKSArIGNzcyhlbCwgJ21hcmdpbkJvdHRvbScpOwotIH07Ci0KLSB9KShqUXVlcnkpOwotCi0KLQotCi0KLS8qICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjICovCi0vKiAjIyMjIyMjIyMjIyMjIyMjICBTRUFSQ0ggU1VHR0VTVElPTlMgICMjIyMjIyMjIyMjIyMjIyMjIyAqLwotLyogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgKi8KLQotCi0KLXZhciBnU2VsZWN0ZWRJbmRleCA9IC0xOwotdmFyIGdNYXRjaGVzID0gbmV3IEFycmF5KCk7Ci12YXIgZ0xhc3RUZXh0ID0gIiI7Ci12YXIgZ0luaXRpYWxpemVkID0gZmFsc2U7Ci12YXIgUk9XX0NPVU5UX0ZSQU1FV09SSyA9IDIwOyAgICAgICAvLyBtYXggbnVtYmVyIG9mIHJlc3VsdHMgaW4gbGlzdAotdmFyIGdMaXN0TGVuZ3RoID0gMDsKLQotCi12YXIgZ0dvb2dsZU1hdGNoZXMgPSBuZXcgQXJyYXkoKTsKLXZhciBST1dfQ09VTlRfR09PR0xFID0gMTU7ICAgICAgICAgIC8vIG1heCBudW1iZXIgb2YgcmVzdWx0cyBpbiBsaXN0Ci12YXIgZ0dvb2dsZUxpc3RMZW5ndGggPSAwOwotCi1mdW5jdGlvbiBzZXRfaXRlbV9zZWxlY3RlZCgkbGksIHNlbGVjdGVkKQotewotICAgIGlmIChzZWxlY3RlZCkgewotICAgICAgICAkbGkuYXR0cignY2xhc3MnLCdqZC1hdXRvY29tcGxldGUgamQtc2VsZWN0ZWQnKTsKLSAgICB9IGVsc2UgewotICAgICAgICAkbGkuYXR0cignY2xhc3MnLCdqZC1hdXRvY29tcGxldGUnKTsKLSAgICB9Ci19Ci0KLWZ1bmN0aW9uIHNldF9pdGVtX3ZhbHVlcyh0b3Jvb3QsICRsaSwgbWF0Y2gpCi17Ci0gICAgdmFyICRsaW5rID0gJCgnYScsJGxpKTsKLSAgICAkbGluay5odG1sKG1hdGNoLl9faGlsYWJlbCB8fCBtYXRjaC5sYWJlbCk7Ci0gICAgJGxpbmsuYXR0cignaHJlZicsdG9yb290ICsgbWF0Y2gubGluayk7Ci19Ci0KLWZ1bmN0aW9uIG5ld19zdWdnZXN0aW9uKCkgewotICAgIHZhciAkbGlzdCA9ICQoIiNzZWFyY2hfZmlsdGVyZWQiKTsKLSAgICB2YXIgJGxpID0gJCgiPGxpIGNsYXNzPSdqZC1hdXRvY29tcGxldGUnPjwvbGk+Iik7Ci0gICAgJGxpc3QuYXBwZW5kKCRsaSk7Ci0KLSAgICAkbGkubW91c2Vkb3duKGZ1bmN0aW9uKCkgewotICAgICAgICB3aW5kb3cubG9jYXRpb24gPSB0aGlzLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCJocmVmIik7Ci0gICAgfSk7Ci0gICAgJGxpLm1vdXNlb3ZlcihmdW5jdGlvbigpIHsKLSAgICAgICAgJCgnI3NlYXJjaF9maWx0ZXJlZCBsaScpLnJlbW92ZUNsYXNzKCdqZC1zZWxlY3RlZCcpOwotICAgICAgICAkKHRoaXMpLmFkZENsYXNzKCdqZC1zZWxlY3RlZCcpOwotICAgICAgICBnU2VsZWN0ZWRJbmRleCA9ICQoJyNzZWFyY2hfZmlsdGVyZWQgbGknKS5pbmRleCh0aGlzKTsKLSAgICB9KTsKLSAgICAkbGkuYXBwZW5kKCc8YT48L2E+Jyk7Ci0gICAgJGxpLmF0dHIoJ2NsYXNzJywnc2hvdy1pdGVtJyk7Ci0gICAgcmV0dXJuICRsaTsKLX0KLQotZnVuY3Rpb24gc3luY19zZWxlY3Rpb25fdGFibGUodG9yb290KQotewotICAgIHZhciAkbGlzdCA9ICQoIiNzZWFyY2hfZmlsdGVyZWQiKTsKLSAgICB2YXIgJGxpOyAvL2xpc3QgaXRlbSBqcXVlcnkgb2JqZWN0Ci0gICAgdmFyIGk7IC8vbGlzdCBpdGVtIGl0ZXJhdG9yCi0KLSAgICAvLyByZXNldCB0aGUgbGlzdAotICAgICQoImxpIiwkbGlzdCkucmVtb3ZlKCk7Ci0KLSAgICAvL2lmIHdlIGhhdmUgcmVzdWx0cywgbWFrZSB0aGUgdGFibGUgdmlzaWJsZSBhbmQgaW5pdGlhbGl6ZSByZXN1bHQgaW5mbwotICAgIGlmICgoZ01hdGNoZXMubGVuZ3RoID4gMCkgfHwgKGdHb29nbGVNYXRjaGVzLmxlbmd0aCA+IDApKSB7Ci0gICAgICAgIC8vIHJldmVhbCBzdWdnZXN0aW9uIGxpc3QKLSAgICAgICAgJCgnI3NlYXJjaF9maWx0ZXJlZF9kaXYnKS5yZW1vdmVDbGFzcygnbm8tZGlzcGxheScpOwotICAgICAgICB2YXIgbGlzdEluZGV4ID0gMDsgLy8gbGlzdCBpbmRleCBwb3NpdGlvbgotCi0gICAgICAgIC8vICMjIyMjIyMjIyMjIEFORFJPSUQgUkVTVUxUUyAjIyMjIyMjIyMjIyMjCi0gICAgICAgIGlmIChnTWF0Y2hlcy5sZW5ndGggPiAwKSB7Ci0KLSAgICAgICAgICAgIC8vIGRldGVybWluZSBhbmRyb2lkIHJlc3VsdHMgdG8gc2hvdwotICAgICAgICAgICAgZ0xpc3RMZW5ndGggPSBnTWF0Y2hlcy5sZW5ndGggPCBST1dfQ09VTlRfRlJBTUVXT1JLID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgZ01hdGNoZXMubGVuZ3RoIDogUk9XX0NPVU5UX0ZSQU1FV09SSzsKLSAgICAgICAgICAgIGZvciAoaT0wOyBpPGdMaXN0TGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICB2YXIgJGxpID0gbmV3X3N1Z2dlc3Rpb24oKTsKLSAgICAgICAgICAgICAgICBzZXRfaXRlbV92YWx1ZXModG9yb290LCAkbGksIGdNYXRjaGVzW2ldKTsKLSAgICAgICAgICAgICAgICBzZXRfaXRlbV9zZWxlY3RlZCgkbGksIGkgPT0gZ1NlbGVjdGVkSW5kZXgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gIyMjIyMjIyMjIyMgR09PR0xFIFJFU1VMVFMgIyMjIyMjIyMjIyMjIwotICAgICAgICBpZiAoZ0dvb2dsZU1hdGNoZXMubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgLy8gc2hvdyBoZWFkZXIgZm9yIGxpc3QKLSAgICAgICAgICAgICRsaXN0LmFwcGVuZCgiPGxpIGNsYXNzPSdoZWFkZXInPmluIEdvb2dsZSBTZXJ2aWNlczo8L2xpPiIpOwotCi0gICAgICAgICAgICAvLyBkZXRlcm1pbmUgZ29vZ2xlIHJlc3VsdHMgdG8gc2hvdwotICAgICAgICAgICAgZ0dvb2dsZUxpc3RMZW5ndGggPSBnR29vZ2xlTWF0Y2hlcy5sZW5ndGggPCBST1dfQ09VTlRfR09PR0xFID8gZ0dvb2dsZU1hdGNoZXMubGVuZ3RoIDogUk9XX0NPVU5UX0dPT0dMRTsKLSAgICAgICAgICAgIGZvciAoaT0wOyBpPGdHb29nbGVMaXN0TGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICB2YXIgJGxpID0gbmV3X3N1Z2dlc3Rpb24oKTsKLSAgICAgICAgICAgICAgICBzZXRfaXRlbV92YWx1ZXModG9yb290LCAkbGksIGdHb29nbGVNYXRjaGVzW2ldKTsKLSAgICAgICAgICAgICAgICBzZXRfaXRlbV9zZWxlY3RlZCgkbGksIGkgPT0gZ1NlbGVjdGVkSW5kZXgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAvL2lmIHdlIGhhdmUgbm8gcmVzdWx0cywgaGlkZSB0aGUgdGFibGUKLSAgICB9IGVsc2UgewotICAgICAgICAkKCcjc2VhcmNoX2ZpbHRlcmVkX2RpdicpLmFkZENsYXNzKCduby1kaXNwbGF5Jyk7Ci0gICAgfQotfQotCi1mdW5jdGlvbiBzZWFyY2hfY2hhbmdlZChlLCBrZCwgdG9yb290KQotewotICAgIHZhciBzZWFyY2ggPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgic2VhcmNoX2F1dG9jb21wbGV0ZSIpOwotICAgIHZhciB0ZXh0ID0gc2VhcmNoLnZhbHVlLnJlcGxhY2UoLyheICspfCggKyQpL2csICcnKTsKLQotICAgIC8vIHNob3cvaGlkZSB0aGUgY2xvc2UgYnV0dG9uCi0gICAgaWYgKHRleHQgIT0gJycpIHsKLSAgICAgICAgJCgiLnNlYXJjaCAuY2xvc2UiKS5yZW1vdmVDbGFzcygiaGlkZSIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgICQoIi5zZWFyY2ggLmNsb3NlIikuYWRkQ2xhc3MoImhpZGUiKTsKLSAgICB9Ci0KLSAgICAvLyAxMyA9IGVudGVyCi0gICAgaWYgKGUua2V5Q29kZSA9PSAxMykgewotICAgICAgICAkKCcjc2VhcmNoX2ZpbHRlcmVkX2RpdicpLmFkZENsYXNzKCduby1kaXNwbGF5Jyk7Ci0gICAgICAgIGlmICghJCgnI3NlYXJjaF9maWx0ZXJlZF9kaXYnKS5oYXNDbGFzcygnbm8tZGlzcGxheScpIHx8IChnU2VsZWN0ZWRJbmRleCA8IDApKSB7Ci0gICAgICAgICAgICBpZiAoJCgiI3NlYXJjaFJlc3VsdHMiKS5pcygiOmhpZGRlbiIpICYmIChzZWFyY2gudmFsdWUgIT0gIiIpKSB7Ci0gICAgICAgICAgICAgIC8vIGlmIHJlc3VsdHMgYXJlbid0IHNob3dpbmcgKGFuZCB0ZXh0IG5vdCBlbXB0eSksIHJldHVybiB0cnVlIHRvIGFsbG93IHNlYXJjaCB0byBleGVjdXRlCi0gICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgLy8gb3RoZXJ3aXNlLCByZXN1bHRzIGFyZSBhbHJlYWR5IHNob3dpbmcsIHNvIGFsbG93IGFqYXggdG8gYXV0byByZWZyZXNoIHRoZSByZXN1bHRzCi0gICAgICAgICAgICAgIC8vIGFuZCBpZ25vcmUgdGhpcyBFbnRlciBwcmVzcyB0byBhdm9pZCB0aGUgcmVsb2FkLgotICAgICAgICAgICAgICAvLyByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAgIC8vIEZvciBub3csIHdlJ3JlIG5vdCB1c2luZyBBSkFYIHNvIHdlIHJlc3BvbmQgdG8gZXZlcnkgRW50ZXIuCi0gICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKGtkICYmIGdTZWxlY3RlZEluZGV4ID49IDApIHsKLSAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbiA9ICQoImEiLCQoJyNzZWFyY2hfZmlsdGVyZWQgbGknKVtnU2VsZWN0ZWRJbmRleF0pLmF0dHIoImhyZWYiKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLSAgICAvLyAzOCAtLSBhcnJvdyB1cAotICAgIGVsc2UgaWYgKGtkICYmIChlLmtleUNvZGUgPT0gMzgpKSB7Ci0gICAgICAgIGlmICgkKCQoIiNzZWFyY2hfZmlsdGVyZWQgbGkiKVtnU2VsZWN0ZWRJbmRleC0xXSkuaGFzQ2xhc3MoImhlYWRlciIpKSB7Ci0gICAgICAgICAgICAkKCcjc2VhcmNoX2ZpbHRlcmVkX2RpdiBsaScpLnJlbW92ZUNsYXNzKCdqZC1zZWxlY3RlZCcpOwotICAgICAgICAgICAgZ1NlbGVjdGVkSW5kZXgtLTsKLSAgICAgICAgICAgICQoJyNzZWFyY2hfZmlsdGVyZWRfZGl2IGxpOm50aC1jaGlsZCgnKyhnU2VsZWN0ZWRJbmRleCsxKSsnKScpLmFkZENsYXNzKCdqZC1zZWxlY3RlZCcpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChnU2VsZWN0ZWRJbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAkKCcjc2VhcmNoX2ZpbHRlcmVkX2RpdiBsaScpLnJlbW92ZUNsYXNzKCdqZC1zZWxlY3RlZCcpOwotICAgICAgICAgICAgZ1NlbGVjdGVkSW5kZXgtLTsKLSAgICAgICAgICAgICQoJyNzZWFyY2hfZmlsdGVyZWRfZGl2IGxpOm50aC1jaGlsZCgnKyhnU2VsZWN0ZWRJbmRleCsxKSsnKScpLmFkZENsYXNzKCdqZC1zZWxlY3RlZCcpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgLy8gNDAgLS0gYXJyb3cgZG93bgotICAgIGVsc2UgaWYgKGtkICYmIChlLmtleUNvZGUgPT0gNDApKSB7Ci0gICAgICAgIGlmICgkKCQoIiNzZWFyY2hfZmlsdGVyZWQgbGkiKVtnU2VsZWN0ZWRJbmRleCsxXSkuaGFzQ2xhc3MoImhlYWRlciIpKSB7Ci0gICAgICAgICAgICAkKCcjc2VhcmNoX2ZpbHRlcmVkX2RpdiBsaScpLnJlbW92ZUNsYXNzKCdqZC1zZWxlY3RlZCcpOwotICAgICAgICAgICAgZ1NlbGVjdGVkSW5kZXgrKzsKLSAgICAgICAgICAgICQoJyNzZWFyY2hfZmlsdGVyZWRfZGl2IGxpOm50aC1jaGlsZCgnKyhnU2VsZWN0ZWRJbmRleCsxKSsnKScpLmFkZENsYXNzKCdqZC1zZWxlY3RlZCcpOwotICAgICAgICB9Ci0gICAgICAgIGlmICgoZ1NlbGVjdGVkSW5kZXggPCAkKCJ1bCNzZWFyY2hfZmlsdGVyZWQgbGkiKS5sZW5ndGgtMSkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICgkKCQoIiNzZWFyY2hfZmlsdGVyZWQgbGkiKVtnU2VsZWN0ZWRJbmRleCsxXSkuaGFzQ2xhc3MoImhlYWRlciIpKSkgewotICAgICAgICAgICAgJCgnI3NlYXJjaF9maWx0ZXJlZF9kaXYgbGknKS5yZW1vdmVDbGFzcygnamQtc2VsZWN0ZWQnKTsKLSAgICAgICAgICAgIGdTZWxlY3RlZEluZGV4Kys7Ci0gICAgICAgICAgICAkKCcjc2VhcmNoX2ZpbHRlcmVkX2RpdiBsaTpudGgtY2hpbGQoJysoZ1NlbGVjdGVkSW5kZXgrMSkrJyknKS5hZGRDbGFzcygnamQtc2VsZWN0ZWQnKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIC8vIGlmIGtleS11cCBldmVudCBhbmQgbm90IGFycm93IGRvd24vdXAsCi0gICAgLy8gcmVhZCB0aGUgc2VhcmNoIHF1ZXJ5IGFuZCBhZGQgc3VnZ2VzdHNpb25zIHRvIGdNYXRjaGVzCi0gICAgZWxzZSBpZiAoIWtkICYmIChlLmtleUNvZGUgIT0gNDApICYmIChlLmtleUNvZGUgIT0gMzgpKSB7Ci0gICAgICAgIGdNYXRjaGVzID0gbmV3IEFycmF5KCk7Ci0gICAgICAgIG1hdGNoZWRDb3VudCA9IDA7Ci0gICAgICAgIGdHb29nbGVNYXRjaGVzID0gbmV3IEFycmF5KCk7Ci0gICAgICAgIG1hdGNoZWRDb3VudEdvb2dsZSA9IDA7Ci0gICAgICAgIGdTZWxlY3RlZEluZGV4ID0gLTE7Ci0KLSAgICAgICAgLy8gU2VhcmNoIGZvciBBbmRyb2lkIG1hdGNoZXMKLSAgICAgICAgZm9yICh2YXIgaT0wOyBpPERBVEEubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIHZhciBzID0gREFUQVtpXTsKLSAgICAgICAgICAgIGlmICh0ZXh0Lmxlbmd0aCAhPSAwICYmCi0gICAgICAgICAgICAgICAgICBzLmxhYmVsLnRvTG93ZXJDYXNlKCkuaW5kZXhPZih0ZXh0LnRvTG93ZXJDYXNlKCkpICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgZ01hdGNoZXNbbWF0Y2hlZENvdW50XSA9IHM7Ci0gICAgICAgICAgICAgICAgbWF0Y2hlZENvdW50Kys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmFua19hdXRvY29tcGxldGVfcmVzdWx0cyh0ZXh0LCBnTWF0Y2hlcyk7Ci0gICAgICAgIGZvciAodmFyIGk9MDsgaTxnTWF0Y2hlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgdmFyIHMgPSBnTWF0Y2hlc1tpXTsKLSAgICAgICAgfQotCi0KLSAgICAgICAgLy8gU2VhcmNoIGZvciBHb29nbGUgbWF0Y2hlcwotICAgICAgICAvKgotICAgICAgICAgKiAgQ29tbWVudGVkIHRoaXMgb3V0IGJlY2F1c2UgR09PR0xFX0RBVEEgbm90IGRlZmluZWQgZm9yIHVzIGFuZCBjb2RlCi0gICAgICAgICAqICBjYXVzZXMgYW4gZXJyb3IuICBUaGlzIHByb2JhYmx5IGhhcyB0byBkbyB3aXRoIHRoZSBtaXNzaW5nCi0gICAgICAgICAqICBnbXNfbGlzdHMuanMgZmlsZSBpbiBTQUMuIFRPRE8gZmlndXJlIGl0IGFsbCBvdXQuCi0gICAgICAgICAqCi0gICAgICAgIGZvciAodmFyIGk9MDsgaTxHT09HTEVfREFUQS5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgdmFyIHMgPSBHT09HTEVfREFUQVtpXTsKLSAgICAgICAgICAgIGlmICh0ZXh0Lmxlbmd0aCAhPSAwICYmCi0gICAgICAgICAgICAgICAgICBzLmxhYmVsLnRvTG93ZXJDYXNlKCkuaW5kZXhPZih0ZXh0LnRvTG93ZXJDYXNlKCkpICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgZ0dvb2dsZU1hdGNoZXNbbWF0Y2hlZENvdW50R29vZ2xlXSA9IHM7Ci0gICAgICAgICAgICAgICAgbWF0Y2hlZENvdW50R29vZ2xlKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmFua19hdXRvY29tcGxldGVfcmVzdWx0cyh0ZXh0LCBnR29vZ2xlTWF0Y2hlcyk7Ci0gICAgICAgIGZvciAodmFyIGk9MDsgaTxnR29vZ2xlTWF0Y2hlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgdmFyIHMgPSBnR29vZ2xlTWF0Y2hlc1tpXTsKLSAgICAgICAgfQotICAgICAgICAqLwotCi0gICAgICAgIGhpZ2hsaWdodF9hdXRvY29tcGxldGVfcmVzdWx0X2xhYmVscyh0ZXh0KTsKLSAgICAgICAgc3luY19zZWxlY3Rpb25fdGFibGUodG9yb290KTsKLQotCi0gICAgICAgIHJldHVybiB0cnVlOyAvLyBhbGxvdyB0aGUgZXZlbnQgdG8gYnViYmxlIHVwIHRvIHRoZSBzZWFyY2ggYXBpCi0gICAgfQotfQotCi0vKiBPcmRlciB0aGUgcmVzdWx0IGxpc3QgYmFzZWQgb24gbWF0Y2ggcXVhbGl0eSAqLwotZnVuY3Rpb24gcmFua19hdXRvY29tcGxldGVfcmVzdWx0cyhxdWVyeSwgbWF0Y2hlcykgewotICAgIHF1ZXJ5ID0gcXVlcnkgfHwgJyc7Ci0gICAgaWYgKCFtYXRjaGVzIHx8ICFtYXRjaGVzLmxlbmd0aCkKLSAgICAgIHJldHVybjsKLQotICAgIC8vIGhlbHBlciBmdW5jdGlvbiB0aGF0IGdldHMgdGhlIGxhc3Qgb2NjdXJlbmNlIGluZGV4IG9mIHRoZSBnaXZlbiByZWdleAotICAgIC8vIGluIHRoZSBnaXZlbiBzdHJpbmcsIG9yIC0xIGlmIG5vdCBmb3VuZAotICAgIHZhciBfbGFzdFNlYXJjaCA9IGZ1bmN0aW9uKHMsIHJlKSB7Ci0gICAgICBpZiAocyA9PSAnJykKLSAgICAgICAgcmV0dXJuIC0xOwotICAgICAgdmFyIGwgPSAtMTsKLSAgICAgIHZhciB0bXA7Ci0gICAgICB3aGlsZSAoKHRtcCA9IHMuc2VhcmNoKHJlKSkgPj0gMCkgewotICAgICAgICBpZiAobCA8IDApIGwgPSAwOwotICAgICAgICBsICs9IHRtcDsKLSAgICAgICAgcyA9IHMuc3Vic3RyKHRtcCArIDEpOwotICAgICAgfQotICAgICAgcmV0dXJuIGw7Ci0gICAgfTsKLQotICAgIC8vIGhlbHBlciBmdW5jdGlvbiB0aGF0IGNvdW50cyB0aGUgb2NjdXJyZW5jZXMgb2YgYSBnaXZlbiBjaGFyYWN0ZXIgaW4KLSAgICAvLyBhIGdpdmVuIHN0cmluZwotICAgIHZhciBfY291bnRDaGFyID0gZnVuY3Rpb24ocywgYykgewotICAgICAgdmFyIG4gPSAwOwotICAgICAgZm9yICh2YXIgaT0wOyBpPHMubGVuZ3RoOyBpKyspCi0gICAgICAgIGlmIChzLmNoYXJBdChpKSA9PSBjKSArK247Ci0gICAgICByZXR1cm4gbjsKLSAgICB9OwotCi0gICAgdmFyIHF1ZXJ5TG93ZXIgPSBxdWVyeS50b0xvd2VyQ2FzZSgpOwotICAgIHZhciBxdWVyeUFsbnVtID0gKHF1ZXJ5TG93ZXIubWF0Y2goL1x3Ky8pIHx8IFsnJ10pWzBdOwotICAgIHZhciBwYXJ0UHJlZml4QWxudW1SRSA9IG5ldyBSZWdFeHAoJ1xcYicgKyBxdWVyeUFsbnVtKTsKLSAgICB2YXIgcGFydEV4YWN0QWxudW1SRSA9IG5ldyBSZWdFeHAoJ1xcYicgKyBxdWVyeUFsbnVtICsgJ1xcYicpOwotCi0gICAgdmFyIF9yZXN1bHRTY29yZUZuID0gZnVuY3Rpb24ocmVzdWx0KSB7Ci0gICAgICAgIC8vIHNjb3JlcyBhcmUgY2FsY3VsYXRlZCBiYXNlZCBvbiBleGFjdCBhbmQgcHJlZml4IG1hdGNoZXMsCi0gICAgICAgIC8vIGFuZCB0aGVuIG51bWJlciBvZiBwYXRoIHNlcGFyYXRvcnMgKGRvdHMpIGZyb20gdGhlIGxhc3QKLSAgICAgICAgLy8gbWF0Y2ggKGkuZS4gZmF2b3JpbmcgY2xhc3NlcyBhbmQgZGVlcCBwYWNrYWdlIG5hbWVzKQotICAgICAgICB2YXIgc2NvcmUgPSAxLjA7Ci0gICAgICAgIHZhciBsYWJlbExvd2VyID0gcmVzdWx0LmxhYmVsLnRvTG93ZXJDYXNlKCk7Ci0gICAgICAgIHZhciB0OwotICAgICAgICB0ID0gX2xhc3RTZWFyY2gobGFiZWxMb3dlciwgcGFydEV4YWN0QWxudW1SRSk7Ci0gICAgICAgIGlmICh0ID49IDApIHsKLSAgICAgICAgICAgIC8vIGV4YWN0IHBhcnQgbWF0Y2gKLSAgICAgICAgICAgIHZhciBwYXJ0c0FmdGVyID0gX2NvdW50Q2hhcihsYWJlbExvd2VyLnN1YnN0cih0ICsgMSksICcuJyk7Ci0gICAgICAgICAgICBzY29yZSAqPSAyMDAgLyAocGFydHNBZnRlciArIDEpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdCA9IF9sYXN0U2VhcmNoKGxhYmVsTG93ZXIsIHBhcnRQcmVmaXhBbG51bVJFKTsKLSAgICAgICAgICAgIGlmICh0ID49IDApIHsKLSAgICAgICAgICAgICAgICAvLyBwYXJ0IHByZWZpeCBtYXRjaAotICAgICAgICAgICAgICAgIHZhciBwYXJ0c0FmdGVyID0gX2NvdW50Q2hhcihsYWJlbExvd2VyLnN1YnN0cih0ICsgMSksICcuJyk7Ci0gICAgICAgICAgICAgICAgc2NvcmUgKj0gMjAgLyAocGFydHNBZnRlciArIDEpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHNjb3JlOwotICAgIH07Ci0KLSAgICBmb3IgKHZhciBpPTA7IGk8bWF0Y2hlcy5sZW5ndGg7IGkrKykgewotICAgICAgICBtYXRjaGVzW2ldLl9fcmVzdWx0U2NvcmUgPSBfcmVzdWx0U2NvcmVGbihtYXRjaGVzW2ldKTsKLSAgICB9Ci0KLSAgICBtYXRjaGVzLnNvcnQoZnVuY3Rpb24oYSxiKXsKLSAgICAgICAgdmFyIG4gPSBiLl9fcmVzdWx0U2NvcmUgLSBhLl9fcmVzdWx0U2NvcmU7Ci0gICAgICAgIGlmIChuID09IDApIC8vIGxleGljb2dyYXBoaWNhbCBzb3J0IGlmIHNjb3JlcyBhcmUgdGhlIHNhbWUKLSAgICAgICAgICAgIG4gPSAoYS5sYWJlbCA8IGIubGFiZWwpID8gLTEgOiAxOwotICAgICAgICByZXR1cm4gbjsKLSAgICB9KTsKLX0KLQotLyogQWRkIGVtcGhhc2lzIHRvIHBhcnQgb2Ygc3RyaW5nIHRoYXQgbWF0Y2hlcyBxdWVyeSAqLwotZnVuY3Rpb24gaGlnaGxpZ2h0X2F1dG9jb21wbGV0ZV9yZXN1bHRfbGFiZWxzKHF1ZXJ5KSB7Ci0gICAgcXVlcnkgPSBxdWVyeSB8fCAnJzsKLSAgICBpZiAoKCFnTWF0Y2hlcyB8fCAhZ01hdGNoZXMubGVuZ3RoKSAmJiAoIWdHb29nbGVNYXRjaGVzIHx8ICFnR29vZ2xlTWF0Y2hlcy5sZW5ndGgpKQotICAgICAgcmV0dXJuOwotCi0gICAgdmFyIHF1ZXJ5TG93ZXIgPSBxdWVyeS50b0xvd2VyQ2FzZSgpOwotICAgIHZhciBxdWVyeUFsbnVtRG90ID0gKHF1ZXJ5TG93ZXIubWF0Y2goL1tcd1wuXSsvKSB8fCBbJyddKVswXTsKLSAgICB2YXIgcXVlcnlSRSA9IG5ldyBSZWdFeHAoCi0gICAgICAgICcoJyArIHF1ZXJ5QWxudW1Eb3QucmVwbGFjZSgvXC4vZywgJ1xcLicpICsgJyknLCAnaWcnKTsKLSAgICBmb3IgKHZhciBpPTA7IGk8Z01hdGNoZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgZ01hdGNoZXNbaV0uX19oaWxhYmVsID0gZ01hdGNoZXNbaV0ubGFiZWwucmVwbGFjZSgKLSAgICAgICAgICAgIHF1ZXJ5UkUsICc8Yj4kMTwvYj4nKTsKLSAgICB9Ci0gICAgZm9yICh2YXIgaT0wOyBpPGdHb29nbGVNYXRjaGVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgIGdHb29nbGVNYXRjaGVzW2ldLl9faGlsYWJlbCA9IGdHb29nbGVNYXRjaGVzW2ldLmxhYmVsLnJlcGxhY2UoCi0gICAgICAgICAgICBxdWVyeVJFLCAnPGI+JDE8L2I+Jyk7Ci0gICAgfQotfQotCi1mdW5jdGlvbiBzZWFyY2hfZm9jdXNfY2hhbmdlZChvYmosIGZvY3VzZWQpCi17Ci0gICAgaWYgKCFmb2N1c2VkKSB7Ci0gICAgICAgIGlmKG9iai52YWx1ZSA9PSAiIil7Ci0gICAgICAgICAgJCgiLnNlYXJjaCAuY2xvc2UiKS5hZGRDbGFzcygiaGlkZSIpOwotICAgICAgICB9Ci0gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzZWFyY2hfZmlsdGVyZWRfZGl2IikuY2xhc3NOYW1lID0gIm5vLWRpc3BsYXkiOwotICAgIH0KLX0KLQotZnVuY3Rpb24gc3VibWl0X3NlYXJjaCgpIHsKLSAgdmFyIHF1ZXJ5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlYXJjaF9hdXRvY29tcGxldGUnKS52YWx1ZTsKLSAgbG9jYXRpb24uaGFzaCA9ICdxPScgKyBxdWVyeTsKLSAgbG9hZFNlYXJjaFJlc3VsdHMoKTsKLSAgJCgiI3NlYXJjaFJlc3VsdHMiKS5zbGlkZURvd24oJ3Nsb3cnKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0KLWZ1bmN0aW9uIGhpZGVSZXN1bHRzKCkgewotICAkKCIjc2VhcmNoUmVzdWx0cyIpLnNsaWRlVXAoKTsKLSAgJCgiLnNlYXJjaCAuY2xvc2UiKS5hZGRDbGFzcygiaGlkZSIpOwotICBsb2NhdGlvbi5oYXNoID0gJyc7Ci0KLSAgJCgiI3NlYXJjaF9hdXRvY29tcGxldGUiKS52YWwoIiIpLmJsdXIoKTsKLQotICAvLyByZXNldCB0aGUgYWpheCBzZWFyY2ggY2FsbGJhY2sgdG8gbm90aGluZywgc28gcmVzdWx0cyBkb24ndCBhcHBlYXIgdW5sZXNzIEVOVEVSCi0gIC8vICBzZWFyY2hDb250cm9sLnNldFNlYXJjaFN0YXJ0aW5nQ2FsbGJhY2sodGhpcywgZnVuY3Rpb24oY29udHJvbCwgc2VhcmNoZXIsIHF1ZXJ5KSB7fSk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotCi0vKiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjICovCi0vKiAjIyMjIyMjIyMjIyMjIyMjICBDVVNUT00gU0VBUkNIIEVOR0lORSAgIyMjIyMjIyMjIyMjIyMjIyMjICovCi0vKiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjICovCi0KLS8vIFRPRE8sIGFkZCBsb2NhbGl6ZWQgc2VhcmNoLgotZnVuY3Rpb24gZ2V0TGFuZ1ByZWYoKSB7Ci0gIHJldHVybiAiZW4iOwotfQotCi0vLyBQYWNrYWdlIG9mIGZ1bmN0aW9ucyB0aGF0IGRvZXMgY3VzdG9tIHNlYXJjaCwgZnJvbSBEQUMgcmVkZXNpZ24uCi0oZnVuY3Rpb24oJCkgewotICB2YXIgTEFORzsKLQotICBmdW5jdGlvbiBnZXRTZWFyY2hMYW5nKCkgewotICAgIGlmICghTEFORykgewotICAgICAgTEFORyA9IGdldExhbmdQcmVmKCk7Ci0KLSAgICAgIC8vIEZpeCB6aC1jbiB0byBiZSB6aC1DTi4KLSAgICAgIExBTkcgPSBMQU5HLnJlcGxhY2UoLy1cdysvLCBmdW5jdGlvbihtKSB7IHJldHVybiBtLnRvVXBwZXJDYXNlKCk7IH0pOwotICAgIH0KLSAgICByZXR1cm4gTEFORzsKLSAgfQotCi0gIGZ1bmN0aW9uIGN1c3RvbVNlYXJjaChxdWVyeSwgc3RhcnQpIHsKLSAgICB2YXIgc2VhcmNoUGFyYW1zID0gewotICAgICAgLy8gS2V5cyBmb3IgU0FDCi0gICAgICBjeDonMDE2MjU4NjQzNDYyMTY4ODU5ODc1OnFxcG04Zml3Z2MwJywKLSAgICAgIGtleTogJ0FJemFTeUJPV0hEM0pBRjZROUxJSjROaWFoR0FGNzBXN2lEQUk5TScsCi0KLSAgICAgIC8vIEtleXMgZm9yIERBQwotICAgICAgLy8gY3g6ICcwMDA1MjE3NTAwOTUwNTAyODkwMTA6enBjcGkxZWE0czgnLAotICAgICAgLy8ga2V5OiAnQUl6YVN5Q0ZoYkdualcwNmRZd3ZSQ1U4aF96amRwUzRQWVliRWU4JywKLQotICAgICAgcTogcXVlcnksCi0gICAgICBzdGFydDogc3RhcnQgfHwgMSwKLSAgICAgIG51bTogNiwKLSAgICAgIGhsOiBnZXRTZWFyY2hMYW5nKCksCi0gICAgICBmaWVsZHM6ICdxdWVyaWVzLGl0ZW1zKHBhZ2VtYXAsbGluayx0aXRsZSxodG1sU25pcHBldCxmb3JtYXR0ZWRVcmwpJwotICAgIH07Ci0KLSAgICByZXR1cm4gJC5nZXQoJ2h0dHBzOi8vY29udGVudC5nb29nbGVhcGlzLmNvbS9jdXN0b21zZWFyY2gvdjE/JyArICAkLnBhcmFtKHNlYXJjaFBhcmFtcykpOwotICB9Ci0KLSAgZnVuY3Rpb24gcmVuZGVyUmVzdWx0cyhlbCwgcmVzdWx0cykgewotICAgIGlmICghcmVzdWx0cy5pdGVtcykgewotICAgICAgZWwuYXBwZW5kKCQoJzxkaXY+JykudGV4dCgnTm8gcmVzdWx0cycpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlc3VsdHMuaXRlbXMubGVuZ3RoOyBpKyspIHsKLSAgICAgIHZhciBpdGVtID0gcmVzdWx0cy5pdGVtc1tpXTsKLSAgICAgIC8vIE5vIHRodW1ibmFpbCBpbWFnZXMgaW4gU0FDLgotICAgICAgLy8gdmFyIGhhc0ltYWdlID0gaXRlbS5wYWdlbWFwICYmIGl0ZW0ucGFnZW1hcC5jc2VfdGh1bWJuYWlsOwotICAgICAgdmFyIHNlY3Rpb25NYXRjaCA9IGl0ZW0ubGluay5tYXRjaCgvc291cmNlXC5hbmRyb2lkXC5jb21cLyhcdyopLyk7Ci0gICAgICB2YXIgc2VjdGlvbiA9IChzZWN0aW9uTWF0Y2ggJiYgc2VjdGlvbk1hdGNoWzFdKSB8fCAnYmxvZyc7Ci0KLSAgICAgIHZhciBlbnRyeSA9ICQoJzxkaXY+JykuYWRkQ2xhc3MoJ2RhYy1jdXN0b20tc2VhcmNoLWVudHJ5IGNvbHMnKTsKLQotLy8gTm8gdGh1bWJuYWlsIGltYWdlcyBpbiBTQUMuCi0vLyAgICAgIGlmIChoYXNJbWFnZSkgewotLy8gICAgICAgIHZhciBpbWFnZSA9IGl0ZW0ucGFnZW1hcC5jc2VfdGh1bWJuYWlsWzBdOwotLy8gICAgICAgIGVudHJ5LmFwcGVuZCgkKCc8ZGl2PicpLmFkZENsYXNzKCdjb2wtMW9mNicpCi0vLyAgICAgICAgICAuYXBwZW5kKCQoJzxkaXY+JykuYWRkQ2xhc3MoJ2RhYy1jdXN0b20tc2VhcmNoLWltYWdlJykuY3NzKCdiYWNrZ3JvdW5kLWltYWdlJywgJ3VybCgnICsgaW1hZ2Uuc3JjICsgJyknKSkpOwotLy8gICAgICB9Ci0vLyBlbnRyeS5hcHBlbmQoJCgnPGRpdj4nKS5hZGRDbGFzcyhoYXNJbWFnZSA/ICdjb2wtNW9mNicgOiAnY29sLTZvZjYnKQotICAgICAgZW50cnkuYXBwZW5kKCQoJzxkaXY+JykKLSAgICAgICAgLmFwcGVuZCgkKCc8cD4nKS5hZGRDbGFzcygnZGFjLWN1c3RvbS1zZWFyY2gtc2VjdGlvbicpLnRleHQoc2VjdGlvbikpCi0gICAgICAgIC5hcHBlbmQoCi0gICAgICAgICAgJCgnPGE+JykudGV4dChpdGVtLnRpdGxlKS5hdHRyKCdocmVmJywgaXRlbS5saW5rKS53cmFwKCc8aDI+JykucGFyZW50KCkuYWRkQ2xhc3MoJ2RhYy1jdXN0b20tc2VhcmNoLXRpdGxlJykKLSAgICAgICAgKQotICAgICAgICAuYXBwZW5kKCQoJzxwPicpLmFkZENsYXNzKCdkYWMtY3VzdG9tLXNlYXJjaC1zbmlwcGV0JykuaHRtbChpdGVtLmh0bWxTbmlwcGV0LnJlcGxhY2UoLzxicj4vZywgJycpKSkKLSAgICAgICAgLmFwcGVuZCgkKCc8YT4nKS5hZGRDbGFzcygnZGFjLWN1c3RvbS1zZWFyY2gtbGluaycpLnRleHQoaXRlbS5mb3JtYXR0ZWRVcmwpLmF0dHIoJ2hyZWYnLCBpdGVtLmxpbmspKSk7Ci0KLSAgICAgIGVsLmFwcGVuZChlbnRyeSk7Ci0gICAgfQotCi0gICAgaWYgKHJlc3VsdHMucXVlcmllcy5uZXh0UGFnZSkgewotICAgICAgdmFyIGxvYWRNb3JlQnV0dG9uID0gJCgnPGJ1dHRvbiBpZD0iZGFjLWN1c3RvbS1zZWFyY2gtbG9hZC1tb3JlIj4nKQotICAgICAgICAuYWRkQ2xhc3MoJ2RhYy1jdXN0b20tc2VhcmNoLWxvYWQtbW9yZScpCi0gICAgICAgIC50ZXh0KCdMb2FkIG1vcmUnKQotICAgICAgICAuY2xpY2soZnVuY3Rpb24oKSB7Ci0gICAgICAgICAgbG9hZE1vcmVSZXN1bHRzKGVsLCByZXN1bHRzKTsKLSAgICAgICAgfSk7Ci0KLSAgICAgIGVsLmFwcGVuZChsb2FkTW9yZUJ1dHRvbik7Ci0gICAgfQotICB9Ci0KLSAgZnVuY3Rpb24gbG9hZE1vcmVSZXN1bHRzKGVsLCByZXN1bHRzKSB7Ci0gICAgdmFyIHF1ZXJ5ID0gcmVzdWx0cy5xdWVyaWVzLnJlcXVlc3Quc2VhcmNoVGVybXM7Ci0gICAgdmFyIHN0YXJ0ID0gcmVzdWx0cy5xdWVyaWVzLm5leHRQYWdlLnN0YXJ0SW5kZXg7Ci0gICAgdmFyIGxvYWRNb3JlQnV0dG9uID0gZWwuZmluZCgnI2RhYy1jdXN0b20tc2VhcmNoLWxvYWQtbW9yZScpOwotCi0gICAgbG9hZE1vcmVCdXR0b24udGV4dCgnTG9hZGluZyBtb3JlLi4uJyk7Ci0KLSAgICBjdXN0b21TZWFyY2gocXVlcnksIHN0YXJ0KS50aGVuKGZ1bmN0aW9uKHJlc3VsdHMpIHsKLSAgICAgIGxvYWRNb3JlQnV0dG9uLnJlbW92ZSgpOwotICAgICAgcmVuZGVyUmVzdWx0cyhlbCwgcmVzdWx0cyk7Ci0gICAgfSk7Ci0gIH0KLQotICAkLmZuLmN1c3RvbVNlYXJjaCA9IGZ1bmN0aW9uKHF1ZXJ5KSB7Ci0gICAgdmFyIGVsID0gJCh0aGlzKTsKLQotICAgIGN1c3RvbVNlYXJjaChxdWVyeSkudGhlbihmdW5jdGlvbihyZXN1bHRzKSB7Ci0gICAgICBlbC5lbXB0eSgpOwotICAgICAgcmVuZGVyUmVzdWx0cyhlbCwgcmVzdWx0cyk7Ci0gICAgfSk7Ci0gIH07Ci19KShqUXVlcnkpOwotCi0KLWZ1bmN0aW9uIGxvYWRTZWFyY2hSZXN1bHRzKCkgewotCi0gIC8vIERyYXcgdGhlIHNlYXJjaCByZXN1bHRzIGJveAotICAvL3NlYXJjaENvbnRyb2wuZHJhdyhkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibGVmdFNlYXJjaENvbnRyb2wiKSwgZHJhd09wdGlvbnMpOwotICAkKHNlYXJjaFJlc3VsdHMpLmFwcGVuZCgnPGRpdiBjbGFzcz0ibGVmdFNlYXJjaENvbnRyb2wiPjwvZGl2PicpOwotCi0KLSAgLy8gUmVmcmVzaCB0aGUgdXJsIGFuZCBzZWFyY2ggdGl0bGUKLSAgdmFyIHF1ZXJ5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlYXJjaF9hdXRvY29tcGxldGUnKS52YWx1ZSB8fCBnZXRRdWVyeShsb2NhdGlvbi5oYXNoKTsKLSAgdXBkYXRlUmVzdWx0VGl0bGUocXVlcnkpOwotICBsb2NhdGlvbi5oYXNoID0gJ3E9JyArIHF1ZXJ5OwotCi0gIC8vIGdldCBxdWVyeSBhbmQgZXhlY3V0ZSB0aGUgc2VhcmNoCi0gIC8vc2VhcmNoQ29udHJvbC5leGVjdXRlKGRlY29kZVVSSShnZXRRdWVyeShsb2NhdGlvbi5oYXNoKSkpOwotICAkKGxlZnRTZWFyY2hDb250cm9sKS5jdXN0b21TZWFyY2goZ2V0UXVlcnkobG9jYXRpb24uaGFzaCkpOwotCi0gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzZWFyY2hfYXV0b2NvbXBsZXRlIikuZm9jdXMoKTsKLSAgYWRkVGFiTGlzdGVuZXJzKCk7Ci19Ci0vLyBFbmQgb2YgbG9hZFNlYXJjaFJlc3VsdHMKLQotZ29vZ2xlLnNldE9uTG9hZENhbGxiYWNrKGZ1bmN0aW9uKCl7Ci0KLSAgdmFyIHF1ZXJ5ID0gZGVjb2RlVVJJKGdldFF1ZXJ5KGxvY2F0aW9uLmhhc2gpKTsKLSAgaWYgKGxvY2F0aW9uLmhhc2guaW5kZXhPZigicT0iKSA9PSAtMSB8fCBxdWVyeSA9PSAnJykgewotICAgIC8vIGlmIHRoZXJlJ3Mgbm8gcXVlcnkgaW4gdGhlIHVybCwgZG9uJ3Qgc2VhcmNoIGFuZCBtYWtlIHN1cmUgcmVzdWx0cyBhcmUgaGlkZGVuCi0gICAgJCgnI3NlYXJjaFJlc3VsdHMnKS5oaWRlKCk7Ci0gICAgcmV0dXJuOwotICB9IGVsc2UgewotICAgIC8vIGZpcnN0IHRpbWUgbG9hZGluZyBzZWFyY2ggcmVzdWx0cyBmb3IgdGhpcyBwYWdlCi0gICAgJCgnI3NlYXJjaFJlc3VsdHMnKS5zbGlkZURvd24oJ3Nsb3cnKTsKLSAgICAkKCIuc2VhcmNoIC5jbG9zZSIpLnJlbW92ZUNsYXNzKCJoaWRlIik7Ci0gICAgbG9hZFNlYXJjaFJlc3VsdHMoKTsKLSAgfQotfSwgdHJ1ZSk7Ci0KLS8vIHdoZW4gYW4gZXZlbnQgb24gdGhlIGJyb3dzZXIgaGlzdG9yeSBvY2N1cnMgKGJhY2ssIGZvcndhcmQsIGxvYWQpIHJlcXVlcnkgaGFzaCBhbmQgZG8gc2VhcmNoCi0kKHdpbmRvdykuaGFzaGNoYW5nZSggZnVuY3Rpb24oKXsKLSAgLy8gRXhpdCBpZiB0aGUgaGFzaCBpc24ndCBhIHNlYXJjaCBxdWVyeSBvciB0aGVyZSdzIGFuIGVycm9yIGluIHRoZSBxdWVyeQotICBpZiAoKGxvY2F0aW9uLmhhc2guaW5kZXhPZigicT0iKSA9PSAtMSkgfHwgKHF1ZXJ5ID09ICJ1bmRlZmluZWQiKSkgewotICAgIC8vIElmIHRoZSByZXN1bHRzIHBhbmUgaXMgb3BlbiwgY2xvc2UgaXQuCi0gICAgaWYgKCEkKCIjc2VhcmNoUmVzdWx0cyIpLmlzKCI6aGlkZGVuIikpIHsKLSAgICAgIGhpZGVSZXN1bHRzKCk7Ci0gICAgfQotICAgIHJldHVybjsKLSAgfQotCi0gIC8vIE90aGVyd2lzZSwgd2UgaGF2ZSBhIHNlYXJjaCB0byBkbwotICB2YXIgcXVlcnkgPSBkZWNvZGVVUkkoZ2V0UXVlcnkobG9jYXRpb24uaGFzaCkpOwotICAvL3NlYXJjaENvbnRyb2wuZXhlY3V0ZShxdWVyeSk7Ci0gICQoJyNsZWZ0U2VhcmNoQ29udHJvbCcpLmN1c3RvbVNlYXJjaChxdWVyeSk7Ci0gICQoJyNzZWFyY2hSZXN1bHRzJykuc2xpZGVEb3duKCdzbG93Jyk7Ci0gICQoIiNzZWFyY2hfYXV0b2NvbXBsZXRlIikuZm9jdXMoKTsKLSAgJCgiLnNlYXJjaCAuY2xvc2UiKS5yZW1vdmVDbGFzcygiaGlkZSIpOwotCi0gIHVwZGF0ZVJlc3VsdFRpdGxlKHF1ZXJ5KTsKLX0pOwotCi1mdW5jdGlvbiB1cGRhdGVSZXN1bHRUaXRsZShxdWVyeSkgewotICAkKCIjc2VhcmNoVGl0bGUiKS5odG1sKCJSZXN1bHRzIGZvciA8ZW0+IiArIGVuY29kZVVSSUNvbXBvbmVudChxdWVyeSkgKyAiPC9lbT4iKTsKLX0KLQotLy8gZm9yY2VmdWxseSByZWdhaW4ga2V5LXVwIGV2ZW50IGNvbnRyb2wgKHByZXZpb3VzbHkgamFja2VkIGJ5IHNlYXJjaCBhcGkpCi0kKCIjc2VhcmNoX2F1dG9jb21wbGV0ZSIpLmtleXVwKGZ1bmN0aW9uKGV2ZW50KSB7Ci0gIHJldHVybiBzZWFyY2hfY2hhbmdlZChldmVudCwgZmFsc2UsIHRvUm9vdCk7Ci19KTsKLQotLy8gYWRkIGV2ZW50IGxpc3RlbmVycyB0byBlYWNoIHRhYiBzbyB3ZSBjYW4gdHJhY2sgdGhlIGJyb3dzZXIgaGlzdG9yeQotZnVuY3Rpb24gYWRkVGFiTGlzdGVuZXJzKCkgewotICB2YXIgdGFiSGVhZGVycyA9ICQoIi5nc2MtdGFiSGVhZGVyIik7Ci0gIGZvciAodmFyIGkgPSAwOyBpIDwgdGFiSGVhZGVycy5sZW5ndGg7IGkrKykgewotICAgICQodGFiSGVhZGVyc1tpXSkuYXR0cigiaWQiLGkpLmNsaWNrKGZ1bmN0aW9uKCkgewotICAgIC8qCi0gICAgICAvLyBtYWtlIGEgY29weSBvZiB0aGUgcGFnZSBudW1iZXJzIGZvciB0aGUgc2VhcmNoIGxlZnQgcGFuZQotICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsKLSAgICAgICAgLy8gcmVtb3ZlIGFueSByZXNpZHVhbCBwYWdlIG51bWJlcnMKLSAgICAgICAgJCgnI3NlYXJjaFJlc3VsdHMgLmdzYy10YWJzQXJlYSAuZ3NjLWN1cnNvci1ib3guZ3MtYmlkaS1zdGFydC1hbGlnbicpLnJlbW92ZSgpOwotICAgICAgICAvLyBtb3ZlIHRoZSBwYWdlIG51bWJlcnMgdG8gdGhlIGxlZnQgcG9zaXRpb247IG1ha2UgYSBjbG9uZSwKLSAgICAgICAgLy8gYmVjYXVzZSB0aGUgZWxlbWVudCBpcyBkcmF3biB0byB0aGUgRE9NIG9ubHkgb25jZQotICAgICAgICAvLyBhbmQgYmVjYXVzZSB3ZSdyZSBnb2luZyB0byByZW1vdmUgaXQgKHByZXZpb3VzIGxpbmUpLAotICAgICAgICAvLyB3ZSBuZWVkIGl0IHRvIGJlIGF2YWlsYWJsZSB0byBtb3ZlIGFnYWluIGFzIHRoZSB1c2VyIG5hdmlnYXRlcwotICAgICAgICAkKCcjc2VhcmNoUmVzdWx0cyAuZ3NjLXdlYlJlc3VsdCAuZ3NjLWN1cnNvci1ib3guZ3MtYmlkaS1zdGFydC1hbGlnbjp2aXNpYmxlJykKLSAgICAgICAgICAgICAgICAgICAgICAgIC5jbG9uZSgpLmFwcGVuZFRvKCcjc2VhcmNoUmVzdWx0cyAuZ3NjLXRhYnNBcmVhJyk7Ci0gICAgICAgIH0sIDIwMCk7Ci0gICAgICAqLwotICAgIH0pOwotICB9Ci0gIHNldFRpbWVvdXQoZnVuY3Rpb24oKXskKHRhYkhlYWRlcnNbMF0pLmNsaWNrKCl9LDIwMCk7Ci19Ci0KLQotZnVuY3Rpb24gZ2V0UXVlcnkoaGFzaCkgewotICB2YXIgcXVlcnlQYXJ0cyA9IGhhc2guc3BsaXQoJz0nKTsKLSAgcmV0dXJuIHF1ZXJ5UGFydHNbMV07Ci19Ci0KLQotLyogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgKi8KLS8qICMjIyMjIyMjIyMjIyMjIyMjICBKQVZBRE9DIFJFRkVSRU5DRSAjIyMjIyMjIyMjIyMjIyMjIyMjICovCi0vKiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAqLwotCi0vKiBJbml0aWFsaXplIHNvbWUgZHJvaWRkb2Mgc3R1ZmYsIGJ1dCBvbmx5IGlmIHdlJ3JlIGluIHRoZSByZWZlcmVuY2UgKi8KLWlmIChsb2NhdGlvbi5wYXRobmFtZS5pbmRleE9mKCIvcmVmZXJlbmNlIikpIHsKLSAgaWYoIWxvY2F0aW9uLnBhdGhuYW1lLmluZGV4T2YoIi9yZWZlcmVuY2UtZ21zL3BhY2thZ2VzLmh0bWwiKQotICAgICYmICFsb2NhdGlvbi5wYXRobmFtZS5pbmRleE9mKCIvcmVmZXJlbmNlLWdjbS9wYWNrYWdlcy5odG1sIikKLSAgICAmJiAhbG9jYXRpb24ucGF0aG5hbWUuaW5kZXhPZigiL3JlZmVyZW5jZS9jb20vZ29vZ2xlIikgPT0gMCkgewotICAgICQoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uKCkgewotICAgICAgLy8gaW5pdCBhdmFpbGFibGUgYXBpcyBiYXNlZCBvbiB1c2VyIHByZWYKLSAgICAgIGNoYW5nZUFwaUxldmVsKCk7Ci0gICAgICBpbml0U2lkZW5hdkhlaWdodFJlc2l6ZSgpCi0gICAgICB9KTsKLSAgfQotfQotCi12YXIgQVBJX0xFVkVMX0NPT0tJRSA9ICJhcGlfbGV2ZWwiOwotdmFyIG1pbkxldmVsID0gMTsKLXZhciBtYXhMZXZlbCA9IDE7Ci0KLS8qKioqKioqIFNJREVOQVYgRElNRU5TSU9OUyAqKioqKioqKioqKiovCi0KLSAgZnVuY3Rpb24gaW5pdFNpZGVuYXZIZWlnaHRSZXNpemUoKSB7Ci0gICAgLy8gQ2hhbmdlIHRoZSBkcmFnIGJhciBzaXplIHRvIG5pY2VseSBmaXQgdGhlIHNjcm9sbGJhciBwb3NpdGlvbnMKLSAgICB2YXIgJGRyYWdCYXIgPSAkKCIudWktcmVzaXphYmxlLXMiKTsKLSAgICAkZHJhZ0Jhci5jc3Moeyd3aWR0aCc6ICRkcmFnQmFyLnBhcmVudCgpLndpZHRoKCkgLSA1ICsgInB4In0pOwotCi0gICAgJCggIiNyZXNpemUtcGFja2FnZXMtbmF2IiApLnJlc2l6YWJsZSh7Ci0gICAgICBjb250YWlubWVudDogIiNuYXYtcGFuZWxzIiwKLSAgICAgIGhhbmRsZXM6ICJzIiwKLSAgICAgIGFsc29SZXNpemU6ICIjcGFja2FnZXMtbmF2IiwKLSAgICAgIHJlc2l6ZTogZnVuY3Rpb24oZXZlbnQsIHVpKSB7IHJlc2l6ZU5hdigpOyB9LCAvKiByZXNpemUgdGhlIG5hdiB3aGlsZSBkcmFnZ2luZyAqLwotICAgICAgc3RvcDogZnVuY3Rpb24oZXZlbnQsIHVpKSB7IHNhdmVOYXZQYW5lbHMoKTsgfSAvKiBvbmNlIHN0b3BwZWQsIHNhdmUgdGhlIHNpemVzIHRvIGNvb2tpZSAgKi8KLSAgICAgIH0pOwotCi0gIH0KLQotZnVuY3Rpb24gdXBkYXRlU2lkZW5hdkZpeGVkV2lkdGgoKSB7Ci0gIGlmICghbmF2QmFySXNGaXhlZCkgcmV0dXJuOwotICAkKCcjZGV2ZG9jLW5hdicpLmNzcyh7Ci0gICAgJ3dpZHRoJyA6ICQoJyNzaWRlLW5hdicpLmNzcygnd2lkdGgnKSwKLSAgICAnbWFyZ2luJyA6ICQoJyNzaWRlLW5hdicpLmNzcygnbWFyZ2luJykKLSAgfSk7Ci0gICQoJyNkZXZkb2MtbmF2IGEudG90b3AnKS5jc3MoeydkaXNwbGF5JzonYmxvY2snLCd3aWR0aCc6JCgiI25hdiIpLmlubmVyV2lkdGgoKSsncHgnfSk7Ci0KLSAgaW5pdFNpZGVuYXZIZWlnaHRSZXNpemUoKTsKLX0KLQotZnVuY3Rpb24gdXBkYXRlU2lkZW5hdkZ1bGxzY3JlZW5XaWR0aCgpIHsKLSAgaWYgKCFuYXZCYXJJc0ZpeGVkKSByZXR1cm47Ci0gICQoJyNkZXZkb2MtbmF2JykuY3NzKHsKLSAgICAnd2lkdGgnIDogJCgnI3NpZGUtbmF2JykuY3NzKCd3aWR0aCcpLAotICAgICdtYXJnaW4nIDogJCgnI3NpZGUtbmF2JykuY3NzKCdtYXJnaW4nKQotICB9KTsKLSAgJCgnI2RldmRvYy1uYXYgLnRvdG9wJykuY3NzKHsnbGVmdCc6ICdpbmhlcml0J30pOwotCi0gIGluaXRTaWRlbmF2SGVpZ2h0UmVzaXplKCk7Ci19Ci0KLWZ1bmN0aW9uIGJ1aWxkQXBpTGV2ZWxTZWxlY3RvcigpIHsKLSAgbWF4TGV2ZWwgPSBTSU5DRV9EQVRBLmxlbmd0aDsKLSAgdmFyIHVzZXJBcGlMZXZlbCA9IHBhcnNlSW50KHJlYWRDb29raWUoQVBJX0xFVkVMX0NPT0tJRSkpOwotICB1c2VyQXBpTGV2ZWwgPSB1c2VyQXBpTGV2ZWwgPT0gMCA/IG1heExldmVsIDogdXNlckFwaUxldmVsOyAvLyBJZiB0aGVyZSdzIG5vIGNvb2tpZSAoemVybyksIHVzZSB0aGUgbWF4IGJ5IGRlZmF1bHQKLQotICBtaW5MZXZlbCA9IHBhcnNlSW50KCQoIiNkb2MtYXBpLWxldmVsIikuYXR0cigiY2xhc3MiKSk7Ci0gIC8vIEhhbmRsZSBwcm92aXNpb25hbCBhcGkgbGV2ZWxzOyB0aGUgcHJvdmlzaW9uYWwgbGV2ZWwgd2lsbCBhbHdheXMgYmUgdGhlIGhpZ2hlc3QgcG9zc2libGUgbGV2ZWwKLSAgLy8gUHJvdmlzaW9uYWwgYXBpIGxldmVscyB3aWxsIGFsc28gaGF2ZSBhIGxlbmd0aDsgb3RoZXIgc3R1ZmYgdGhhdCdzIGp1c3QgbWlzc2luZyBhIGxldmVsIHdvbid0LAotICAvLyBzbyBsZWF2ZSB0aG9zZSBraW5kcyBvZiBlbnRpdGllcyBhdCB0aGUgZGVmYXVsdCBsZXZlbCBvZiAxIChmb3IgZXhhbXBsZSwgdGhlIFIuc3R5bGVhYmxlIGNsYXNzKQotICBpZiAoaXNOYU4obWluTGV2ZWwpICYmIG1pbkxldmVsLmxlbmd0aCkgewotICAgIG1pbkxldmVsID0gbWF4TGV2ZWw7Ci0gIH0KLSAgdmFyIHNlbGVjdCA9ICQoIiNhcGlMZXZlbFNlbGVjdG9yIikuaHRtbCgiIikuY2hhbmdlKGNoYW5nZUFwaUxldmVsKTsKLSAgZm9yICh2YXIgaSA9IG1heExldmVsLTE7IGkgPj0gMDsgaS0tKSB7Ci0gICAgdmFyIG9wdGlvbiA9ICQoIjxvcHRpb24gLz4iKS5hdHRyKCJ2YWx1ZSIsIiIrU0lOQ0VfREFUQVtpXSkuYXBwZW5kKCIiK1NJTkNFX0RBVEFbaV0pOwotICAvLyAgaWYgKFNJTkNFX0RBVEFbaV0gPCBtaW5MZXZlbCkgb3B0aW9uLmFkZENsYXNzKCJhYnNlbnQiKTsgLy8gYWx3YXlzIGZhbHNlIGZvciBzdHJpbmdzIChjb2RlbmFtZXMpCi0gICAgc2VsZWN0LmFwcGVuZChvcHRpb24pOwotICB9Ci0KLSAgLy8gZ2V0IHRoZSBET00gZWxlbWVudCBhbmQgdXNlIHNldEF0dHJpYnV0ZSBjdXogSUU2IGZhaWxzIHdoZW4gdXNpbmcganF1ZXJ5IC5hdHRyKCdzZWxlY3RlZCcsdHJ1ZSkKLSAgdmFyIHNlbGVjdGVkTGV2ZWxJdGVtID0gJCgiI2FwaUxldmVsU2VsZWN0b3Igb3B0aW9uW3ZhbHVlPSciK3VzZXJBcGlMZXZlbCsiJ10iKS5nZXQoMCk7Ci0vLyAgQW5vdGhlciBwaWVjZSBvZiBmdW5jdGlvbmFsaXR5IHRoYXQgd2UgZG9uJ3QgdXNlIHRoYXQgcHJvZHVjZXMgYW4gZXJyb3IuCi0vLyAgVE9ETyBmaWd1cmUgaXQgYWxsIG91dC4KLS8vICBzZWxlY3RlZExldmVsSXRlbS5zZXRBdHRyaWJ1dGUoJ3NlbGVjdGVkJyx0cnVlKTsKLX0KLQotZnVuY3Rpb24gY2hhbmdlQXBpTGV2ZWwoKSB7Ci0gIG1heExldmVsID0gU0lOQ0VfREFUQS5sZW5ndGg7Ci0gIHZhciBzZWxlY3RlZExldmVsID0gbWF4TGV2ZWw7Ci0KLSAgc2VsZWN0ZWRMZXZlbCA9IHBhcnNlSW50KCQoIiNhcGlMZXZlbFNlbGVjdG9yIG9wdGlvbjpzZWxlY3RlZCIpLnZhbCgpKTsKLSAgdG9nZ2xlVmlzaXNibGVBcGlzKHNlbGVjdGVkTGV2ZWwsICJib2R5Iik7Ci0KLSAgdmFyIGRhdGUgPSBuZXcgRGF0ZSgpOwotICBkYXRlLnNldFRpbWUoZGF0ZS5nZXRUaW1lKCkrKDEwKjM2NSoyNCo2MCo2MCoxMDAwKSk7IC8vIGtlZXAgdGhpcyBmb3IgMTAgeWVhcnMKLSAgdmFyIGV4cGlyYXRpb24gPSBkYXRlLnRvR01UU3RyaW5nKCk7Ci0gIHdyaXRlQ29va2llKEFQSV9MRVZFTF9DT09LSUUsIHNlbGVjdGVkTGV2ZWwsIG51bGwsIGV4cGlyYXRpb24pOwotCi0gIGlmIChzZWxlY3RlZExldmVsIDwgbWluTGV2ZWwpIHsKLSAgICB2YXIgdGhpbmcgPSAoJCgiI2pkLWhlYWRlciIpLmh0bWwoKS5pbmRleE9mKCJwYWNrYWdlIikgIT0gLTEpID8gInBhY2thZ2UiIDogImNsYXNzIjsKLSAgICAkKCIjbmFNZXNzYWdlIikuc2hvdygpLmh0bWwoIjxkaXY+PHA+PHN0cm9uZz5UaGlzICIgKyB0aGluZwotICAgICAgICAgICAgICArICIgcmVxdWlyZXMgQVBJIGxldmVsICIgKyBtaW5MZXZlbCArICIgb3IgaGlnaGVyLjwvc3Ryb25nPjwvcD4iCi0gICAgICAgICAgICAgICsgIjxwPlRoaXMgZG9jdW1lbnQgaXMgaGlkZGVuIGJlY2F1c2UgeW91ciBzZWxlY3RlZCBBUEkgbGV2ZWwgZm9yIHRoZSBkb2N1bWVudGF0aW9uIGlzICIKLSAgICAgICAgICAgICAgKyBzZWxlY3RlZExldmVsICsgIi4gWW91IGNhbiBjaGFuZ2UgdGhlIGRvY3VtZW50YXRpb24gQVBJIGxldmVsIHdpdGggdGhlIHNlbGVjdG9yICIKLSAgICAgICAgICAgICAgKyAiYWJvdmUgdGhlIGxlZnQgbmF2aWdhdGlvbi48L3A+IgotICAgICAgICAgICAgICArICI8cD5Gb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBzcGVjaWZ5aW5nIHRoZSBBUEkgbGV2ZWwgeW91ciBhcHAgcmVxdWlyZXMsICIKLSAgICAgICAgICAgICAgKyAicmVhZCA8YSBocmVmPSciICsgdG9Sb290ICsgInRyYWluaW5nL2Jhc2ljcy9zdXBwb3J0aW5nLWRldmljZXMvcGxhdGZvcm1zLmh0bWwnIgotICAgICAgICAgICAgICArICI+U3VwcG9ydGluZyBEaWZmZXJlbnQgUGxhdGZvcm0gVmVyc2lvbnM8L2E+LjwvcD4iCi0gICAgICAgICAgICAgICsgIjxpbnB1dCB0eXBlPSdidXR0b24nIHZhbHVlPSdPSywgbWFrZSB0aGlzIHBhZ2UgdmlzaWJsZScgIgotICAgICAgICAgICAgICArICJ0aXRsZT0nQ2hhbmdlIHRoZSBBUEkgbGV2ZWwgdG8gIiArIG1pbkxldmVsICsgIicgIgotICAgICAgICAgICAgICArICJvbmNsaWNrPSckKFwiI2FwaUxldmVsU2VsZWN0b3JcIikudmFsKFwiIiArIG1pbkxldmVsICsgIlwiKTtjaGFuZ2VBcGlMZXZlbCgpOycgLz4iCi0gICAgICAgICAgICAgICsgIjwvZGl2PiIpOwotICB9IGVsc2UgewotICAgICQoIiNuYU1lc3NhZ2UiKS5oaWRlKCk7Ci0gIH0KLX0KLQotZnVuY3Rpb24gdG9nZ2xlVmlzaXNibGVBcGlzKHNlbGVjdGVkTGV2ZWwsIGNvbnRleHQpIHsKLSAgdmFyIGFwaXMgPSAkKCIuYXBpIixjb250ZXh0KTsKLSAgYXBpcy5lYWNoKGZ1bmN0aW9uKGkpIHsKLSAgICB2YXIgb2JqID0gJCh0aGlzKTsKLSAgICB2YXIgY2xhc3NOYW1lID0gb2JqLmF0dHIoImNsYXNzIik7Ci0gICAgdmFyIGFwaUxldmVsSW5kZXggPSBjbGFzc05hbWUubGFzdEluZGV4T2YoIi0iKSsxOwotICAgIHZhciBhcGlMZXZlbEVuZEluZGV4ID0gY2xhc3NOYW1lLmluZGV4T2YoIiAiLCBhcGlMZXZlbEluZGV4KTsKLSAgICBhcGlMZXZlbEVuZEluZGV4ID0gYXBpTGV2ZWxFbmRJbmRleCAhPSAtMSA/IGFwaUxldmVsRW5kSW5kZXggOiBjbGFzc05hbWUubGVuZ3RoOwotICAgIHZhciBhcGlMZXZlbCA9IGNsYXNzTmFtZS5zdWJzdHJpbmcoYXBpTGV2ZWxJbmRleCwgYXBpTGV2ZWxFbmRJbmRleCk7Ci0gICAgaWYgKGFwaUxldmVsLmxlbmd0aCA9PSAwKSB7IC8vIGZvciBvZGQgY2FzZXMgd2hlbiB0aGUgc2luY2UgZGF0YSBpcyBhY3R1YWxseSBtaXNzaW5nLCBqdXN0IGJhaWwKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgYXBpTGV2ZWwgPSBwYXJzZUludChhcGlMZXZlbCk7Ci0KLSAgICAvLyBIYW5kbGUgcHJvdmlzaW9uYWwgYXBpIGxldmVsczsgaWYgdGhpcyBpdGVtJ3MgbGV2ZWwgaXMgdGhlIHByb3Zpc2lvbmFsIG9uZSwgc2V0IGl0IHRvIHRoZSBtYXgKLSAgICB2YXIgc2VsZWN0ZWRMZXZlbE51bSA9IHBhcnNlSW50KHNlbGVjdGVkTGV2ZWwpCi0gICAgdmFyIGFwaUxldmVsTnVtID0gcGFyc2VJbnQoYXBpTGV2ZWwpOwotICAgIGlmIChpc05hTihhcGlMZXZlbE51bSkpIHsKLSAgICAgICAgYXBpTGV2ZWxOdW0gPSBtYXhMZXZlbDsKLSAgICB9Ci0KLSAgICAvLyBHcmV5IHRoaW5ncyBvdXQgdGhhdCBhcmVuJ3QgYXZhaWxhYmxlIGFuZCBnaXZlIGEgdG9vbHRpcCB0aXRsZQotICAgIGlmIChhcGlMZXZlbE51bSA+IHNlbGVjdGVkTGV2ZWxOdW0pIHsKLSAgICAgIG9iai5hZGRDbGFzcygiYWJzZW50IikuYXR0cigidGl0bGUiLCJSZXF1aXJlcyBBUEkgTGV2ZWwgXCIiCi0gICAgICAgICAgICArIGFwaUxldmVsICsgIlwiIG9yIGhpZ2hlciIpOwotICAgIH0KLSAgICBlbHNlIG9iai5yZW1vdmVDbGFzcygiYWJzZW50IikucmVtb3ZlQXR0cigidGl0bGUiKTsKLSAgfSk7Ci19Ci0KLQotCi0KLS8qICMjIyMjIyMjIyMjIyMjIyMjICBTSURFTkFWIFRSRUUgVklFVyAjIyMjIyMjIyMjIyMjIyMjIyMjICovCi0KLWZ1bmN0aW9uIG5ld19ub2RlKG1lLCBtb20sIHRleHQsIGxpbmssIGNoaWxkcmVuX2RhdGEsIGFwaV9sZXZlbCkKLXsKLSAgdmFyIG5vZGUgPSBuZXcgT2JqZWN0KCk7Ci0gIG5vZGUuY2hpbGRyZW4gPSBBcnJheSgpOwotICBub2RlLmNoaWxkcmVuX2RhdGEgPSBjaGlsZHJlbl9kYXRhOwotICBub2RlLmRlcHRoID0gbW9tLmRlcHRoICsgMTsKLQotICBub2RlLmxpID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgibGkiKTsKLSAgbW9tLmdldF9jaGlsZHJlbl91bCgpLmFwcGVuZENoaWxkKG5vZGUubGkpOwotCi0gIG5vZGUubGFiZWxfZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Ci0gIG5vZGUubGFiZWxfZGl2LmNsYXNzTmFtZSA9ICJsYWJlbCI7Ci0gIGlmIChhcGlfbGV2ZWwgIT0gbnVsbCkgewotICAgICQobm9kZS5sYWJlbF9kaXYpLmFkZENsYXNzKCJhcGkiKTsKLSAgICAkKG5vZGUubGFiZWxfZGl2KS5hZGRDbGFzcygiYXBpLWxldmVsLSIrYXBpX2xldmVsKTsKLSAgfQotICBub2RlLmxpLmFwcGVuZENoaWxkKG5vZGUubGFiZWxfZGl2KTsKLQotICBpZiAoY2hpbGRyZW5fZGF0YSAhPSBudWxsKSB7Ci0gICAgbm9kZS5leHBhbmRfdG9nZ2xlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYSIpOwotICAgIG5vZGUuZXhwYW5kX3RvZ2dsZS5ocmVmID0gImphdmFzY3JpcHQ6dm9pZCgwKSI7Ci0gICAgbm9kZS5leHBhbmRfdG9nZ2xlLm9uY2xpY2sgPSBmdW5jdGlvbigpIHsKLSAgICAgICAgICBpZiAobm9kZS5leHBhbmRlZCkgewotICAgICAgICAgICAgJChub2RlLmdldF9jaGlsZHJlbl91bCgpKS5zbGlkZVVwKCJmYXN0Iik7Ci0gICAgICAgICAgICBub2RlLnBsdXNfaW1nLnNyYyA9IG1lLnRvcm9vdCArICJhc3NldHMvaW1hZ2VzL3RyaWFuZ2xlLWNsb3NlZC1zbWFsbC5wbmciOwotICAgICAgICAgICAgbm9kZS5leHBhbmRlZCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBleHBhbmRfbm9kZShtZSwgbm9kZSk7Ci0gICAgICAgICAgfQotICAgICAgIH07Ci0gICAgbm9kZS5sYWJlbF9kaXYuYXBwZW5kQ2hpbGQobm9kZS5leHBhbmRfdG9nZ2xlKTsKLQotICAgIG5vZGUucGx1c19pbWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKTsKLSAgICBub2RlLnBsdXNfaW1nLnNyYyA9IG1lLnRvcm9vdCArICJhc3NldHMvaW1hZ2VzL3RyaWFuZ2xlLWNsb3NlZC1zbWFsbC5wbmciOwotICAgIG5vZGUucGx1c19pbWcuY2xhc3NOYW1lID0gInBsdXMiOwotICAgIG5vZGUucGx1c19pbWcud2lkdGggPSAiOCI7Ci0gICAgbm9kZS5wbHVzX2ltZy5ib3JkZXIgPSAiMCI7Ci0gICAgbm9kZS5leHBhbmRfdG9nZ2xlLmFwcGVuZENoaWxkKG5vZGUucGx1c19pbWcpOwotCi0gICAgbm9kZS5leHBhbmRlZCA9IGZhbHNlOwotICB9Ci0KLSAgdmFyIGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJhIik7Ci0gIG5vZGUubGFiZWxfZGl2LmFwcGVuZENoaWxkKGEpOwotICBub2RlLmxhYmVsID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodGV4dCk7Ci0gIGEuYXBwZW5kQ2hpbGQobm9kZS5sYWJlbCk7Ci0gIGlmIChsaW5rKSB7Ci0gICAgYS5ocmVmID0gbWUudG9yb290ICsgbGluazsKLSAgfSBlbHNlIHsKLSAgICBpZiAoY2hpbGRyZW5fZGF0YSAhPSBudWxsKSB7Ci0gICAgICBhLmNsYXNzTmFtZSA9ICJub2xpbmsiOwotICAgICAgYS5ocmVmID0gImphdmFzY3JpcHQ6dm9pZCgwKSI7Ci0gICAgICBhLm9uY2xpY2sgPSBub2RlLmV4cGFuZF90b2dnbGUub25jbGljazsKLSAgICAgIC8vIFRoaXMgbmV4dCBsaW5lIHNob3VsZG4ndCBiZSBuZWNlc3NhcnkuICBJJ2xsIGJ1eSBhIGJlZXIgZm9yIHRoZSBmaXJzdAotICAgICAgLy8gcGVyc29uIHdobyBmaWd1cmVzIG91dCBob3cgdG8gcmVtb3ZlIHRoaXMgbGluZSBhbmQgaGF2ZSB0aGUgbGluawotICAgICAgLy8gdG9nZ2xlIHNodXQgb24gdGhlIGZpcnN0IHRyeS4gLS1qb2VvQGFuZHJvaWQuY29tCi0gICAgICBub2RlLmV4cGFuZGVkID0gZmFsc2U7Ci0gICAgfQotICB9Ci0KLQotICBub2RlLmNoaWxkcmVuX3VsID0gbnVsbDsKLSAgbm9kZS5nZXRfY2hpbGRyZW5fdWwgPSBmdW5jdGlvbigpIHsKLSAgICAgIGlmICghbm9kZS5jaGlsZHJlbl91bCkgewotICAgICAgICBub2RlLmNoaWxkcmVuX3VsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidWwiKTsKLSAgICAgICAgbm9kZS5jaGlsZHJlbl91bC5jbGFzc05hbWUgPSAiY2hpbGRyZW5fdWwiOwotICAgICAgICBub2RlLmNoaWxkcmVuX3VsLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7Ci0gICAgICAgIG5vZGUubGkuYXBwZW5kQ2hpbGQobm9kZS5jaGlsZHJlbl91bCk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gbm9kZS5jaGlsZHJlbl91bDsKLSAgICB9OwotCi0gIHJldHVybiBub2RlOwotfQotCi0KLQotCi1mdW5jdGlvbiBleHBhbmRfbm9kZShtZSwgbm9kZSkKLXsKLSAgaWYgKG5vZGUuY2hpbGRyZW5fZGF0YSAmJiAhbm9kZS5leHBhbmRlZCkgewotICAgIGlmIChub2RlLmNoaWxkcmVuX3Zpc2l0ZWQpIHsKLSAgICAgICQobm9kZS5nZXRfY2hpbGRyZW5fdWwoKSkuc2xpZGVEb3duKCJmYXN0Iik7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGdldF9ub2RlKG1lLCBub2RlKTsKLSAgICAgIGlmICgkKG5vZGUubGFiZWxfZGl2KS5oYXNDbGFzcygiYWJzZW50IikpIHsKLSAgICAgICAgJChub2RlLmdldF9jaGlsZHJlbl91bCgpKS5hZGRDbGFzcygiYWJzZW50Iik7Ci0gICAgICB9Ci0gICAgICAkKG5vZGUuZ2V0X2NoaWxkcmVuX3VsKCkpLnNsaWRlRG93bigiZmFzdCIpOwotICAgIH0KLSAgICBub2RlLnBsdXNfaW1nLnNyYyA9IG1lLnRvcm9vdCArICJhc3NldHMvaW1hZ2VzL3RyaWFuZ2xlLW9wZW5lZC1zbWFsbC5wbmciOwotICAgIG5vZGUuZXhwYW5kZWQgPSB0cnVlOwotCi0gICAgLy8gcGVyZm9ybSBhcGkgbGV2ZWwgdG9nZ2xpbmcgYmVjYXVzZSBuZXcgbm9kZXMgYXJlIG5ldyB0byB0aGUgRE9NCi0gICAgdmFyIHNlbGVjdGVkTGV2ZWwgPSAkKCIjYXBpTGV2ZWxTZWxlY3RvciBvcHRpb246c2VsZWN0ZWQiKS52YWwoKTsKLSAgICB0b2dnbGVWaXNpc2JsZUFwaXMoc2VsZWN0ZWRMZXZlbCwgIiNzaWRlLW5hdiIpOwotICB9Ci19Ci0KLWZ1bmN0aW9uIGdldF9ub2RlKG1lLCBtb20pCi17Ci0gIG1vbS5jaGlsZHJlbl92aXNpdGVkID0gdHJ1ZTsKLSAgZm9yICh2YXIgaSBpbiBtb20uY2hpbGRyZW5fZGF0YSkgewotICAgIHZhciBub2RlX2RhdGEgPSBtb20uY2hpbGRyZW5fZGF0YVtpXTsKLSAgICBtb20uY2hpbGRyZW5baV0gPSBuZXdfbm9kZShtZSwgbW9tLCBub2RlX2RhdGFbMF0sIG5vZGVfZGF0YVsxXSwKLSAgICAgICAgbm9kZV9kYXRhWzJdLCBub2RlX2RhdGFbM10pOwotICB9Ci19Ci0KLWZ1bmN0aW9uIHRoaXNfcGFnZV9yZWxhdGl2ZSh0b3Jvb3QpCi17Ci0gIHZhciBmdWxsID0gZG9jdW1lbnQubG9jYXRpb24ucGF0aG5hbWU7Ci0gIHZhciBmaWxlID0gIiI7Ci0gIGlmICh0b3Jvb3Quc3Vic3RyKDAsIDEpID09ICIvIikgewotICAgIGlmIChmdWxsLnN1YnN0cigwLCB0b3Jvb3QubGVuZ3RoKSA9PSB0b3Jvb3QpIHsKLSAgICAgIHJldHVybiBmdWxsLnN1YnN0cih0b3Jvb3QubGVuZ3RoKTsKLSAgICB9IGVsc2UgewotICAgICAgLy8gdGhlIGZpbGUgaXNuJ3QgdW5kZXIgdG9yb290LiAgRmFpbC4KLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBpZiAodG9yb290ICE9ICIuLyIpIHsKLSAgICAgIHRvcm9vdCA9ICIuLyIgKyB0b3Jvb3Q7Ci0gICAgfQotICAgIGRvIHsKLSAgICAgIGlmICh0b3Jvb3Quc3Vic3RyKHRvcm9vdC5sZW5ndGgtMywgMykgPT0gIi4uLyIgfHwgdG9yb290ID09ICIuLyIpIHsKLSAgICAgICAgdmFyIHBvcyA9IGZ1bGwubGFzdEluZGV4T2YoIi8iKTsKLSAgICAgICAgZmlsZSA9IGZ1bGwuc3Vic3RyKHBvcykgKyBmaWxlOwotICAgICAgICBmdWxsID0gZnVsbC5zdWJzdHIoMCwgcG9zKTsKLSAgICAgICAgdG9yb290ID0gdG9yb290LnN1YnN0cigwLCB0b3Jvb3QubGVuZ3RoLTMpOwotICAgICAgfQotICAgIH0gd2hpbGUgKHRvcm9vdCAhPSAiIiAmJiB0b3Jvb3QgIT0gIi8iKTsKLSAgICByZXR1cm4gZmlsZS5zdWJzdHIoMSk7Ci0gIH0KLX0KLQotZnVuY3Rpb24gZmluZF9wYWdlKHVybCwgZGF0YSkKLXsKLSAgdmFyIG5vZGVzID0gZGF0YTsKLSAgdmFyIHJlc3VsdCA9IG51bGw7Ci0gIGZvciAodmFyIGkgaW4gbm9kZXMpIHsKLSAgICB2YXIgZCA9IG5vZGVzW2ldOwotICAgIGlmIChkWzFdID09IHVybCkgewotICAgICAgcmV0dXJuIG5ldyBBcnJheShpKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoZFsyXSAhPSBudWxsKSB7Ci0gICAgICByZXN1bHQgPSBmaW5kX3BhZ2UodXJsLCBkWzJdKTsKLSAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkgewotICAgICAgICByZXR1cm4gKG5ldyBBcnJheShpKS5jb25jYXQocmVzdWx0KSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIHJldHVybiBudWxsOwotfQotCi1mdW5jdGlvbiBpbml0X2RlZmF1bHRfbmF2dHJlZSh0b3Jvb3QpIHsKLSAgaW5pdF9uYXZ0cmVlKCJ0cmVlLWxpc3QiLCB0b3Jvb3QsIE5BVlRSRUVfREFUQSk7Ci0KLSAgLy8gcGVyZm9ybSBhcGkgbGV2ZWwgdG9nZ2xpbmcgYmVjYXVzZSBiZWNhdXNlIHRoZSB3aG9sZSB0cmVlIGlzIG5ldyB0byB0aGUgRE9NCi0gIHZhciBzZWxlY3RlZExldmVsID0gJCgiI2FwaUxldmVsU2VsZWN0b3Igb3B0aW9uOnNlbGVjdGVkIikudmFsKCk7Ci0gIHRvZ2dsZVZpc2lzYmxlQXBpcyhzZWxlY3RlZExldmVsLCAiI3NpZGUtbmF2Iik7Ci19Ci0KLWZ1bmN0aW9uIGluaXRfbmF2dHJlZShuYXZ0cmVlX2lkLCB0b3Jvb3QsIHJvb3Rfbm9kZXMpCi17Ci0gIHZhciBtZSA9IG5ldyBPYmplY3QoKTsKLSAgbWUudG9yb290ID0gdG9yb290OwotICBtZS5ub2RlID0gbmV3IE9iamVjdCgpOwotCi0gIG1lLm5vZGUubGkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChuYXZ0cmVlX2lkKTsKLSAgbWUubm9kZS5jaGlsZHJlbl9kYXRhID0gcm9vdF9ub2RlczsKLSAgbWUubm9kZS5jaGlsZHJlbiA9IG5ldyBBcnJheSgpOwotICBtZS5ub2RlLmNoaWxkcmVuX3VsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidWwiKTsKLSAgbWUubm9kZS5nZXRfY2hpbGRyZW5fdWwgPSBmdW5jdGlvbigpIHsgcmV0dXJuIG1lLm5vZGUuY2hpbGRyZW5fdWw7IH07Ci0gIC8vbWUubm9kZS5jaGlsZHJlbl91bC5jbGFzc05hbWUgPSAiY2hpbGRyZW5fdWwiOwotICBtZS5ub2RlLmxpLmFwcGVuZENoaWxkKG1lLm5vZGUuY2hpbGRyZW5fdWwpOwotICBtZS5ub2RlLmRlcHRoID0gMDsKLQotICBnZXRfbm9kZShtZSwgbWUubm9kZSk7Ci0KLSAgbWUudGhpc19wYWdlID0gdGhpc19wYWdlX3JlbGF0aXZlKHRvcm9vdCk7Ci0gIG1lLmJyZWFkY3J1bWJzID0gZmluZF9wYWdlKG1lLnRoaXNfcGFnZSwgcm9vdF9ub2Rlcyk7Ci0gIGlmIChtZS5icmVhZGNydW1icyAhPSBudWxsICYmIG1lLmJyZWFkY3J1bWJzLmxlbmd0aCAhPSAwKSB7Ci0gICAgdmFyIG1vbSA9IG1lLm5vZGU7Ci0gICAgZm9yICh2YXIgaSBpbiBtZS5icmVhZGNydW1icykgewotICAgICAgdmFyIGogPSBtZS5icmVhZGNydW1ic1tpXTsKLSAgICAgIG1vbSA9IG1vbS5jaGlsZHJlbltqXTsKLSAgICAgIGV4cGFuZF9ub2RlKG1lLCBtb20pOwotICAgIH0KLSAgICBtb20ubGFiZWxfZGl2LmNsYXNzTmFtZSA9IG1vbS5sYWJlbF9kaXYuY2xhc3NOYW1lICsgIiBzZWxlY3RlZCI7Ci0gICAgYWRkTG9hZEV2ZW50KGZ1bmN0aW9uKCkgewotICAgICAgc2Nyb2xsSW50b1ZpZXcoIm5hdi10cmVlIik7Ci0gICAgICB9KTsKLSAgfQotfQotCi0vKiBUT0RPOiBlbGltaW5hdGUgcmVkdW5kYW5jeSB3aXRoIG5vbi1nb29nbGUgZnVuY3Rpb25zICovCi1mdW5jdGlvbiBpbml0X2dvb2dsZV9uYXZ0cmVlKG5hdnRyZWVfaWQsIHRvcm9vdCwgcm9vdF9ub2RlcykKLXsKLSAgdmFyIG1lID0gbmV3IE9iamVjdCgpOwotICBtZS50b3Jvb3QgPSB0b3Jvb3Q7Ci0gIG1lLm5vZGUgPSBuZXcgT2JqZWN0KCk7Ci0KLSAgbWUubm9kZS5saSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKG5hdnRyZWVfaWQpOwotICBtZS5ub2RlLmNoaWxkcmVuX2RhdGEgPSByb290X25vZGVzOwotICBtZS5ub2RlLmNoaWxkcmVuID0gbmV3IEFycmF5KCk7Ci0gIG1lLm5vZGUuY2hpbGRyZW5fdWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ1bCIpOwotICBtZS5ub2RlLmdldF9jaGlsZHJlbl91bCA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gbWUubm9kZS5jaGlsZHJlbl91bDsgfTsKLSAgLy9tZS5ub2RlLmNoaWxkcmVuX3VsLmNsYXNzTmFtZSA9ICJjaGlsZHJlbl91bCI7Ci0gIG1lLm5vZGUubGkuYXBwZW5kQ2hpbGQobWUubm9kZS5jaGlsZHJlbl91bCk7Ci0gIG1lLm5vZGUuZGVwdGggPSAwOwotCi0gIGdldF9nb29nbGVfbm9kZShtZSwgbWUubm9kZSk7Ci0KLX0KLQotZnVuY3Rpb24gbmV3X2dvb2dsZV9ub2RlKG1lLCBtb20sIHRleHQsIGxpbmssIGNoaWxkcmVuX2RhdGEsIGFwaV9sZXZlbCkKLXsKLSAgdmFyIG5vZGUgPSBuZXcgT2JqZWN0KCk7Ci0gIHZhciBjaGlsZDsKLSAgbm9kZS5jaGlsZHJlbiA9IEFycmF5KCk7Ci0gIG5vZGUuY2hpbGRyZW5fZGF0YSA9IGNoaWxkcmVuX2RhdGE7Ci0gIG5vZGUuZGVwdGggPSBtb20uZGVwdGggKyAxOwotICBub2RlLmdldF9jaGlsZHJlbl91bCA9IGZ1bmN0aW9uKCkgewotICAgICAgaWYgKCFub2RlLmNoaWxkcmVuX3VsKSB7Ci0gICAgICAgIG5vZGUuY2hpbGRyZW5fdWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ1bCIpOwotICAgICAgICBub2RlLmNoaWxkcmVuX3VsLmNsYXNzTmFtZSA9ICJ0cmVlLWxpc3QtY2hpbGRyZW4iOwotICAgICAgICBub2RlLmxpLmFwcGVuZENoaWxkKG5vZGUuY2hpbGRyZW5fdWwpOwotICAgICAgfQotICAgICAgcmV0dXJuIG5vZGUuY2hpbGRyZW5fdWw7Ci0gICAgfTsKLSAgbm9kZS5saSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImxpIik7Ci0KLSAgbW9tLmdldF9jaGlsZHJlbl91bCgpLmFwcGVuZENoaWxkKG5vZGUubGkpOwotCi0KLSAgaWYobGluaykgewotICAgIGNoaWxkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYSIpOwotCi0gIH0KLSAgZWxzZSB7Ci0gICAgY2hpbGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzcGFuIik7Ci0gICAgY2hpbGQuY2xhc3NOYW1lID0gInRyZWUtbGlzdC1zdWJ0aXRsZSI7Ci0KLSAgfQotICBpZiAoY2hpbGRyZW5fZGF0YSAhPSBudWxsKSB7Ci0gICAgbm9kZS5saS5jbGFzc05hbWU9Im5hdi1zZWN0aW9uIjsKLSAgICBub2RlLmxhYmVsX2RpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwotICAgIG5vZGUubGFiZWxfZGl2LmNsYXNzTmFtZSA9ICJuYXYtc2VjdGlvbi1oZWFkZXItcmVmIjsKLSAgICBub2RlLmxpLmFwcGVuZENoaWxkKG5vZGUubGFiZWxfZGl2KTsKLSAgICBnZXRfZ29vZ2xlX25vZGUobWUsIG5vZGUpOwotICAgIG5vZGUubGFiZWxfZGl2LmFwcGVuZENoaWxkKGNoaWxkKTsKLSAgfQotICBlbHNlIHsKLSAgICBub2RlLmxpLmFwcGVuZENoaWxkKGNoaWxkKTsKLSAgfQotICBpZihsaW5rKSB7Ci0gICAgY2hpbGQuaHJlZiA9IG1lLnRvcm9vdCArIGxpbms7Ci0gIH0KLSAgbm9kZS5sYWJlbCA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHRleHQpOwotICBjaGlsZC5hcHBlbmRDaGlsZChub2RlLmxhYmVsKTsKLQotICBub2RlLmNoaWxkcmVuX3VsID0gbnVsbDsKLQotICByZXR1cm4gbm9kZTsKLX0KLQotZnVuY3Rpb24gZ2V0X2dvb2dsZV9ub2RlKG1lLCBtb20pCi17Ci0gIG1vbS5jaGlsZHJlbl92aXNpdGVkID0gdHJ1ZTsKLSAgdmFyIGxpbmtUZXh0OwotICBmb3IgKHZhciBpIGluIG1vbS5jaGlsZHJlbl9kYXRhKSB7Ci0gICAgdmFyIG5vZGVfZGF0YSA9IG1vbS5jaGlsZHJlbl9kYXRhW2ldOwotICAgIGxpbmtUZXh0ID0gbm9kZV9kYXRhWzBdOwotCi0gICAgaWYobGlua1RleHQubWF0Y2goIl4iKyJjb20uZ29vZ2xlLmFuZHJvaWQiKT09ImNvbS5nb29nbGUuYW5kcm9pZCIpewotICAgICAgbGlua1RleHQgPSBsaW5rVGV4dC5zdWJzdHIoMTksIGxpbmtUZXh0Lmxlbmd0aCk7Ci0gICAgfQotICAgIGVsc2UgaWYobGlua1RleHQubWF0Y2goIl4iKyJjb20uYW5kcm9pZCIpPT0iY29tLmFuZHJvaWQiKXsKLSAgICAgIGxpbmtUZXh0ID0gbGlua1RleHQuc3Vic3RyKDEyLCBsaW5rVGV4dC5sZW5ndGgpOwotICAgIH0KLSAgICAgIG1vbS5jaGlsZHJlbltpXSA9IG5ld19nb29nbGVfbm9kZShtZSwgbW9tLCBsaW5rVGV4dCwgbm9kZV9kYXRhWzFdLAotICAgICAgICAgIG5vZGVfZGF0YVsyXSwgbm9kZV9kYXRhWzNdKTsKLSAgfQotfQotZnVuY3Rpb24gc2hvd0dvb2dsZVJlZlRyZWUoKSB7Ci0gIGluaXRfZGVmYXVsdF9nb29nbGVfbmF2dHJlZSh0b1Jvb3QpOwotICBpbml0X2RlZmF1bHRfZ2NtX25hdnRyZWUodG9Sb290KTsKLSAgcmVzaXplTmF2KCk7Ci19Ci0KLQotZnVuY3Rpb24gc2hvd1RyYWRlZmVkUmVmVHJlZSgpIHsKLSAgaW5pdF9kZWZhdWx0X3RyYWRlZmVkX25hdnRyZWUodG9Sb290KTsKLSAgcmVzaXplTmF2KCk7Ci19Ci0KLWZ1bmN0aW9uIGluaXRfZGVmYXVsdF9nb29nbGVfbmF2dHJlZSh0b3Jvb3QpIHsKLSAgaW5pdF9nb29nbGVfbmF2dHJlZSgiZ21zLXRyZWUtbGlzdCIsIHRvcm9vdCwgR01TX05BVlRSRUVfREFUQSk7Ci19Ci0KLWZ1bmN0aW9uIGluaXRfZGVmYXVsdF9nY21fbmF2dHJlZSh0b3Jvb3QpIHsKLSAgaW5pdF9nb29nbGVfbmF2dHJlZSgiZ2NtLXRyZWUtbGlzdCIsIHRvcm9vdCwgR0NNX05BVlRSRUVfREFUQSk7Ci19Ci0KLWZ1bmN0aW9uIGluaXRfZGVmYXVsdF90cmFkZWZlZF9uYXZ0cmVlKHRvcm9vdCkgewotICBpbml0X2dvb2dsZV9uYXZ0cmVlKCJ0cmFkZWZlZC10cmVlLWxpc3QiLCB0b3Jvb3QsIE5BVlRSRUVfREFUQSk7Ci19Ci0KLS8qIFRPR0dMRSBJTkhFUklURUQgTUVNQkVSUyAqLwotCi0vKiBUb2dnbGUgYW4gaW5oZXJpdGVkIGNsYXNzIChhcnJvdyB0b2dnbGUpCi0gKiBAcGFyYW0gbGlua09iaiAgVGhlIGxpbmsgdGhhdCB3YXMgY2xpY2tlZC4KLSAqIEBwYXJhbSBleHBhbmQgICd0cnVlJyB0byBlbnN1cmUgaXQncyBleHBhbmRlZC4gJ2ZhbHNlJyB0byBlbnN1cmUgaXQncyBjbG9zZWQuCi0gKiAgICAgICAgICAgICAgICAnbnVsbCcgdG8gc2ltcGx5IHRvZ2dsZS4KLSAqLwotZnVuY3Rpb24gdG9nZ2xlSW5oZXJpdGVkKGxpbmtPYmosIGV4cGFuZCkgewotICAgIHZhciBiYXNlID0gbGlua09iai5nZXRBdHRyaWJ1dGUoImlkIik7Ci0gICAgdmFyIGxpc3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChiYXNlICsgIi1saXN0Iik7Ci0gICAgdmFyIHN1bW1hcnkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChiYXNlICsgIi1zdW1tYXJ5Iik7Ci0gICAgdmFyIHRyaWdnZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChiYXNlICsgIi10cmlnZ2VyIik7Ci0gICAgdmFyIGEgPSAkKGxpbmtPYmopOwotICAgIGlmICggKGV4cGFuZCA9PSBudWxsICYmIGEuaGFzQ2xhc3MoImNsb3NlZCIpKSB8fCBleHBhbmQgKSB7Ci0gICAgICAgIGxpc3Quc3R5bGUuZGlzcGxheSA9ICJub25lIjsKLSAgICAgICAgc3VtbWFyeS5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIjsKLSAgICAgICAgdHJpZ2dlci5zcmMgPSB0b1Jvb3QgKyAiYXNzZXRzL2ltYWdlcy90cmlhbmdsZS1vcGVuZWQucG5nIjsKLSAgICAgICAgYS5yZW1vdmVDbGFzcygiY2xvc2VkIik7Ci0gICAgICAgIGEuYWRkQ2xhc3MoIm9wZW5lZCIpOwotICAgIH0gZWxzZSBpZiAoIChleHBhbmQgPT0gbnVsbCAmJiBhLmhhc0NsYXNzKCJvcGVuZWQiKSkgfHwgKGV4cGFuZCA9PSBmYWxzZSkgKSB7Ci0gICAgICAgIGxpc3Quc3R5bGUuZGlzcGxheSA9ICJibG9jayI7Ci0gICAgICAgIHN1bW1hcnkuc3R5bGUuZGlzcGxheSA9ICJub25lIjsKLSAgICAgICAgdHJpZ2dlci5zcmMgPSB0b1Jvb3QgKyAiYXNzZXRzL2ltYWdlcy90cmlhbmdsZS1jbG9zZWQucG5nIjsKLSAgICAgICAgYS5yZW1vdmVDbGFzcygib3BlbmVkIik7Ci0gICAgICAgIGEuYWRkQ2xhc3MoImNsb3NlZCIpOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIFRvZ2dsZSBhbGwgaW5oZXJpdGVkIGNsYXNzZXMgaW4gYSBzaW5nbGUgdGFibGUgKGUuZy4gYWxsIGluaGVyaXRlZCBtZXRob2RzKQotICogQHBhcmFtIGxpbmtPYmogIFRoZSBsaW5rIHRoYXQgd2FzIGNsaWNrZWQuCi0gKiBAcGFyYW0gZXhwYW5kICAndHJ1ZScgdG8gZW5zdXJlIGl0J3MgZXhwYW5kZWQuICdmYWxzZScgdG8gZW5zdXJlIGl0J3MgY2xvc2VkLgotICogICAgICAgICAgICAgICAgJ251bGwnIHRvIHNpbXBseSB0b2dnbGUuCi0gKi8KLWZ1bmN0aW9uIHRvZ2dsZUFsbEluaGVyaXRlZChsaW5rT2JqLCBleHBhbmQpIHsKLSAgdmFyIGEgPSAkKGxpbmtPYmopOwotICB2YXIgdGFibGUgPSAkKGEucGFyZW50KCkucGFyZW50KCkucGFyZW50KCkpOyAvLyB1Z2x5IHdheSB0byBnZXQgdGFibGUvdGJvZHkKLSAgdmFyIGV4cGFuZG9zID0gJCgiLmpkLWV4cGFuZG8tdHJpZ2dlciIsIHRhYmxlKTsKLSAgaWYgKCAoZXhwYW5kID09IG51bGwgJiYgYS50ZXh0KCkgPT0gIltFeHBhbmRdIikgfHwgZXhwYW5kICkgewotICAgIGV4cGFuZG9zLmVhY2goZnVuY3Rpb24oaSkgewotICAgICAgdG9nZ2xlSW5oZXJpdGVkKHRoaXMsIHRydWUpOwotICAgIH0pOwotICAgIGEudGV4dCgiW0NvbGxhcHNlXSIpOwotICB9IGVsc2UgaWYgKCAoZXhwYW5kID09IG51bGwgJiYgYS50ZXh0KCkgPT0gIltDb2xsYXBzZV0iKSB8fCAoZXhwYW5kID09IGZhbHNlKSApIHsKLSAgICBleHBhbmRvcy5lYWNoKGZ1bmN0aW9uKGkpIHsKLSAgICAgIHRvZ2dsZUluaGVyaXRlZCh0aGlzLCBmYWxzZSk7Ci0gICAgfSk7Ci0gICAgYS50ZXh0KCJbRXhwYW5kXSIpOwotICB9Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogVG9nZ2xlIGFsbCBpbmhlcml0ZWQgbWVtYmVycyBpbiB0aGUgY2xhc3MgKGxpbmsgaW4gdGhlIGNsYXNzIHRpdGxlKQotICovCi1mdW5jdGlvbiB0b2dnbGVBbGxDbGFzc0luaGVyaXRlZCgpIHsKLSAgdmFyIGEgPSAkKCIjdG9nZ2xlQWxsQ2xhc3NJbmhlcml0ZWQiKTsgLy8gZ2V0IHRvZ2dsZSBsaW5rIGZyb20gY2xhc3MgdGl0bGUKLSAgdmFyIHRvZ2dsZXMgPSAkKCIudG9nZ2xlLWFsbCIsICQoIiNib2R5LWNvbnRlbnQiKSk7Ci0gIGlmIChhLnRleHQoKSA9PSAiW0V4cGFuZCBBbGxdIikgewotICAgIHRvZ2dsZXMuZWFjaChmdW5jdGlvbihpKSB7Ci0gICAgICB0b2dnbGVBbGxJbmhlcml0ZWQodGhpcywgdHJ1ZSk7Ci0gICAgfSk7Ci0gICAgYS50ZXh0KCJbQ29sbGFwc2UgQWxsXSIpOwotICB9IGVsc2UgewotICAgIHRvZ2dsZXMuZWFjaChmdW5jdGlvbihpKSB7Ci0gICAgICB0b2dnbGVBbGxJbmhlcml0ZWQodGhpcywgZmFsc2UpOwotICAgIH0pOwotICAgIGEudGV4dCgiW0V4cGFuZCBBbGxdIik7Ci0gIH0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBFeHBhbmQgYWxsIGluaGVyaXRlZCBtZW1iZXJzIGluIHRoZSBjbGFzcy4gVXNlZCB3aGVuIGluaXRpYXRpbmcgcGFnZSBzZWFyY2ggKi8KLWZ1bmN0aW9uIGVuc3VyZUFsbEluaGVyaXRlZEV4cGFuZGVkKCkgewotICB2YXIgdG9nZ2xlcyA9ICQoIi50b2dnbGUtYWxsIiwgJCgiI2JvZHktY29udGVudCIpKTsKLSAgdG9nZ2xlcy5lYWNoKGZ1bmN0aW9uKGkpIHsKLSAgICB0b2dnbGVBbGxJbmhlcml0ZWQodGhpcywgdHJ1ZSk7Ci0gIH0pOwotICAkKCIjdG9nZ2xlQWxsQ2xhc3NJbmhlcml0ZWQiKS50ZXh0KCJbQ29sbGFwc2UgQWxsXSIpOwotfQotCi0KLS8qIEhBTkRMRSBLRVkgRVZFTlRTCi0gKiAtIExpc3RlbiBmb3IgQ3RybCtGIChDbWQgb24gTWFjKSBhbmQgZXhwYW5kIGFsbCBpbmhlcml0ZWQgbWVtYmVycyAodG8gYWlkIHBhZ2Ugc2VhcmNoKQotICovCi12YXIgYWdlbnQgPSBuYXZpZ2F0b3JbJ3VzZXJBZ2VudCddLnRvTG93ZXJDYXNlKCk7Ci12YXIgbWFjID0gYWdlbnQuaW5kZXhPZigibWFjaW50b3NoIikgIT0gLTE7Ci0KLSQoZG9jdW1lbnQpLmtleWRvd24oIGZ1bmN0aW9uKGUpIHsKLXZhciBjb250cm9sID0gbWFjID8gZS5tZXRhS2V5ICYmICFlLmN0cmxLZXkgOiBlLmN0cmxLZXk7IC8vIGdldCBjdHJsIGtleQotICBpZiAoY29udHJvbCAmJiBlLndoaWNoID09IDcwKSB7ICAvLyA3MCBpcyAiRiIKLSAgICBlbnN1cmVBbGxJbmhlcml0ZWRFeHBhbmRlZCgpOwotICB9Ci19KTsKZGlmZiAtLWdpdCBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2pzL3ByZXR0aWZ5LmpzIGIvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvanMvcHJldHRpZnkuanMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlZjVhZDcuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvanMvcHJldHRpZnkuanMKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi12YXIgcT1udWxsO3dpbmRvdy5QUl9TSE9VTERfVVNFX0NPTlRJTlVBVElPTj0hMDsKLShmdW5jdGlvbigpe2Z1bmN0aW9uIEwoYSl7ZnVuY3Rpb24gbShhKXt2YXIgZj1hLmNoYXJDb2RlQXQoMCk7aWYoZiE9PTkyKXJldHVybiBmO3ZhciBiPWEuY2hhckF0KDEpO3JldHVybihmPXJbYl0pP2Y6IjAiPD1iJiZiPD0iNyI/cGFyc2VJbnQoYS5zdWJzdHJpbmcoMSksOCk6Yj09PSJ1Inx8Yj09PSJ4Ij9wYXJzZUludChhLnN1YnN0cmluZygyKSwxNik6YS5jaGFyQ29kZUF0KDEpfWZ1bmN0aW9uIGUoYSl7aWYoYTwzMilyZXR1cm4oYTwxNj8iXFx4MCI6IlxceCIpK2EudG9TdHJpbmcoMTYpO2E9U3RyaW5nLmZyb21DaGFyQ29kZShhKTtpZihhPT09IlxcInx8YT09PSItInx8YT09PSJbInx8YT09PSJdIilhPSJcXCIrYTtyZXR1cm4gYX1mdW5jdGlvbiBoKGEpe2Zvcih2YXIgZj1hLnN1YnN0cmluZygxLGEubGVuZ3RoLTEpLm1hdGNoKC9cXHVbXGRBLUZhLWZdezR9fFxceFtcZEEtRmEtZl17Mn18XFxbMC0zXVswLTddezAsMn18XFxbMC03XXsxLDJ9fFxcW1xTXHNdfFteXFxdL2cpLGE9Ci1bXSxiPVtdLG89ZlswXT09PSJeIixjPW8/MTowLGk9Zi5sZW5ndGg7YzxpOysrYyl7dmFyIGo9ZltjXTtpZigvXFxbYmRzd10vaS50ZXN0KGopKWEucHVzaChqKTtlbHNle3ZhciBqPW0oaiksZDtjKzI8aSYmIi0iPT09ZltjKzFdPyhkPW0oZltjKzJdKSxjKz0yKTpkPWo7Yi5wdXNoKFtqLGRdKTtkPDY1fHxqPjEyMnx8KGQ8NjV8fGo+OTB8fGIucHVzaChbTWF0aC5tYXgoNjUsail8MzIsTWF0aC5taW4oZCw5MCl8MzJdKSxkPDk3fHxqPjEyMnx8Yi5wdXNoKFtNYXRoLm1heCg5NyxqKSYtMzMsTWF0aC5taW4oZCwxMjIpJi0zM10pKX19Yi5zb3J0KGZ1bmN0aW9uKGEsZil7cmV0dXJuIGFbMF0tZlswXXx8ZlsxXS1hWzFdfSk7Zj1bXTtqPVtOYU4sTmFOXTtmb3IoYz0wO2M8Yi5sZW5ndGg7KytjKWk9YltjXSxpWzBdPD1qWzFdKzE/alsxXT1NYXRoLm1heChqWzFdLGlbMV0pOmYucHVzaChqPWkpO2I9WyJbIl07byYmYi5wdXNoKCJeIik7Yi5wdXNoLmFwcGx5KGIsYSk7Zm9yKGM9MDtjPAotZi5sZW5ndGg7KytjKWk9ZltjXSxiLnB1c2goZShpWzBdKSksaVsxXT5pWzBdJiYoaVsxXSsxPmlbMF0mJmIucHVzaCgiLSIpLGIucHVzaChlKGlbMV0pKSk7Yi5wdXNoKCJdIik7cmV0dXJuIGIuam9pbigiIil9ZnVuY3Rpb24geShhKXtmb3IodmFyIGY9YS5zb3VyY2UubWF0Y2goL1xbKD86W15cXFxdXXxcXFtcU1xzXSkqXXxcXHVbXGRBLUZhLWZdezR9fFxceFtcZEEtRmEtZl17Mn18XFxcZCt8XFxbXlxkdXhdfFwoXD9bITo9XXxbKCleXXxbXigpW1xcXl0rL2cpLGI9Zi5sZW5ndGgsZD1bXSxjPTAsaT0wO2M8YjsrK2Mpe3ZhciBqPWZbY107aj09PSIoIj8rK2k6IlxcIj09PWouY2hhckF0KDApJiYoaj0rai5zdWJzdHJpbmcoMSkpJiZqPD1pJiYoZFtqXT0tMSl9Zm9yKGM9MTtjPGQubGVuZ3RoOysrYyktMT09PWRbY10mJihkW2NdPSsrdCk7Zm9yKGk9Yz0wO2M8YjsrK2Mpaj1mW2NdLGo9PT0iKCI/KCsraSxkW2ldPT09dm9pZCAwJiYoZltjXT0iKD86IikpOiJcXCI9PT1qLmNoYXJBdCgwKSYmCi0oaj0rai5zdWJzdHJpbmcoMSkpJiZqPD1pJiYoZltjXT0iXFwiK2RbaV0pO2ZvcihpPWM9MDtjPGI7KytjKSJeIj09PWZbY10mJiJeIiE9PWZbYysxXSYmKGZbY109IiIpO2lmKGEuaWdub3JlQ2FzZSYmcylmb3IoYz0wO2M8YjsrK2Mpaj1mW2NdLGE9ai5jaGFyQXQoMCksai5sZW5ndGg+PTImJmE9PT0iWyI/ZltjXT1oKGopOmEhPT0iXFwiJiYoZltjXT1qLnJlcGxhY2UoL1tBLVphLXpdL2csZnVuY3Rpb24oYSl7YT1hLmNoYXJDb2RlQXQoMCk7cmV0dXJuIlsiK1N0cmluZy5mcm9tQ2hhckNvZGUoYSYtMzMsYXwzMikrIl0ifSkpO3JldHVybiBmLmpvaW4oIiIpfWZvcih2YXIgdD0wLHM9ITEsbD0hMSxwPTAsZD1hLmxlbmd0aDtwPGQ7KytwKXt2YXIgZz1hW3BdO2lmKGcuaWdub3JlQ2FzZSlsPSEwO2Vsc2UgaWYoL1thLXpdL2kudGVzdChnLnNvdXJjZS5yZXBsYWNlKC9cXHVbXGRhLWZdezR9fFxceFtcZGEtZl17Mn18XFxbXlVYdXhdL2dpLCIiKSkpe3M9ITA7bD0hMTticmVha319Zm9yKHZhciByPQote2I6OCx0OjksbjoxMCx2OjExLGY6MTIscjoxM30sbj1bXSxwPTAsZD1hLmxlbmd0aDtwPGQ7KytwKXtnPWFbcF07aWYoZy5nbG9iYWx8fGcubXVsdGlsaW5lKXRocm93IEVycm9yKCIiK2cpO24ucHVzaCgiKD86Iit5KGcpKyIpIil9cmV0dXJuIFJlZ0V4cChuLmpvaW4oInwiKSxsPyJnaSI6ImciKX1mdW5jdGlvbiBNKGEpe2Z1bmN0aW9uIG0oYSl7c3dpdGNoKGEubm9kZVR5cGUpe2Nhc2UgMTppZihlLnRlc3QoYS5jbGFzc05hbWUpKWJyZWFrO2Zvcih2YXIgZz1hLmZpcnN0Q2hpbGQ7ZztnPWcubmV4dFNpYmxpbmcpbShnKTtnPWEubm9kZU5hbWU7aWYoIkJSIj09PWd8fCJMSSI9PT1nKWhbc109IlxuIix0W3M8PDFdPXkrKyx0W3MrKzw8MXwxXT1hO2JyZWFrO2Nhc2UgMzpjYXNlIDQ6Zz1hLm5vZGVWYWx1ZSxnLmxlbmd0aCYmKGc9cD9nLnJlcGxhY2UoL1xyXG4/L2csIlxuIik6Zy5yZXBsYWNlKC9bXHRcblxyIF0rL2csIiAiKSxoW3NdPWcsdFtzPDwxXT15LHkrPWcubGVuZ3RoLAotdFtzKys8PDF8MV09YSl9fXZhciBlPS8oPzpefFxzKW5vY29kZSg/OlxzfCQpLyxoPVtdLHk9MCx0PVtdLHM9MCxsO2EuY3VycmVudFN0eWxlP2w9YS5jdXJyZW50U3R5bGUud2hpdGVTcGFjZTp3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSYmKGw9ZG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShhLHEpLmdldFByb3BlcnR5VmFsdWUoIndoaXRlLXNwYWNlIikpO3ZhciBwPWwmJiJwcmUiPT09bC5zdWJzdHJpbmcoMCwzKTttKGEpO3JldHVybnthOmguam9pbigiIikucmVwbGFjZSgvXG4kLywiIiksYzp0fX1mdW5jdGlvbiBCKGEsbSxlLGgpe20mJihhPXthOm0sZDphfSxlKGEpLGgucHVzaC5hcHBseShoLGEuZSkpfWZ1bmN0aW9uIHgoYSxtKXtmdW5jdGlvbiBlKGEpe2Zvcih2YXIgbD1hLmQscD1bbCwicGxuIl0sZD0wLGc9YS5hLm1hdGNoKHkpfHxbXSxyPXt9LG49MCx6PWcubGVuZ3RoO248ejsrK24pe3ZhciBmPWdbbl0sYj1yW2ZdLG89dm9pZCAwLGM7aWYodHlwZW9mIGI9PT0KLSJzdHJpbmciKWM9ITE7ZWxzZXt2YXIgaT1oW2YuY2hhckF0KDApXTtpZihpKW89Zi5tYXRjaChpWzFdKSxiPWlbMF07ZWxzZXtmb3IoYz0wO2M8dDsrK2MpaWYoaT1tW2NdLG89Zi5tYXRjaChpWzFdKSl7Yj1pWzBdO2JyZWFrfW98fChiPSJwbG4iKX1pZigoYz1iLmxlbmd0aD49NSYmImxhbmctIj09PWIuc3Vic3RyaW5nKDAsNSkpJiYhKG8mJnR5cGVvZiBvWzFdPT09InN0cmluZyIpKWM9ITEsYj0ic3JjIjtjfHwocltmXT1iKX1pPWQ7ZCs9Zi5sZW5ndGg7aWYoYyl7Yz1vWzFdO3ZhciBqPWYuaW5kZXhPZihjKSxrPWorYy5sZW5ndGg7b1syXSYmKGs9Zi5sZW5ndGgtb1syXS5sZW5ndGgsaj1rLWMubGVuZ3RoKTtiPWIuc3Vic3RyaW5nKDUpO0IobCtpLGYuc3Vic3RyaW5nKDAsaiksZSxwKTtCKGwraStqLGMsQyhiLGMpLHApO0IobCtpK2ssZi5zdWJzdHJpbmcoayksZSxwKX1lbHNlIHAucHVzaChsK2ksYil9YS5lPXB9dmFyIGg9e30seTsoZnVuY3Rpb24oKXtmb3IodmFyIGU9YS5jb25jYXQobSksCi1sPVtdLHA9e30sZD0wLGc9ZS5sZW5ndGg7ZDxnOysrZCl7dmFyIHI9ZVtkXSxuPXJbM107aWYobilmb3IodmFyIGs9bi5sZW5ndGg7LS1rPj0wOyloW24uY2hhckF0KGspXT1yO3I9clsxXTtuPSIiK3I7cC5oYXNPd25Qcm9wZXJ0eShuKXx8KGwucHVzaChyKSxwW25dPXEpfWwucHVzaCgvW1xTXHNdLyk7eT1MKGwpfSkoKTt2YXIgdD1tLmxlbmd0aDtyZXR1cm4gZX1mdW5jdGlvbiB1KGEpe3ZhciBtPVtdLGU9W107YS50cmlwbGVRdW90ZWRTdHJpbmdzP20ucHVzaChbInN0ciIsL14oPzonJycoPzpbXidcXF18XFxbXFNcc118Jyc/KD89W14nXSkpKig/OicnJ3wkKXwiIiIoPzpbXiJcXF18XFxbXFNcc118IiI/KD89W14iXSkpKig/OiIiInwkKXwnKD86W14nXFxdfFxcW1xTXHNdKSooPzonfCQpfCIoPzpbXiJcXF18XFxbXFNcc10pKig/OiJ8JCkpLyxxLCInXCIiXSk6YS5tdWx0aUxpbmVTdHJpbmdzP20ucHVzaChbInN0ciIsL14oPzonKD86W14nXFxdfFxcW1xTXHNdKSooPzonfCQpfCIoPzpbXiJcXF18XFxbXFNcc10pKig/OiJ8JCl8YCg/OlteXFxgXXxcXFtcU1xzXSkqKD86YHwkKSkvLAotcSwiJ1wiYCJdKTptLnB1c2goWyJzdHIiLC9eKD86Jyg/OlteXG5ccidcXF18XFwuKSooPzonfCQpfCIoPzpbXlxuXHIiXFxdfFxcLikqKD86InwkKSkvLHEsIlwiJyJdKTthLnZlcmJhdGltU3RyaW5ncyYmZS5wdXNoKFsic3RyIiwvXkAiKD86W14iXXwiIikqKD86InwkKS8scV0pO3ZhciBoPWEuaGFzaENvbW1lbnRzO2gmJihhLmNTdHlsZUNvbW1lbnRzPyhoPjE/bS5wdXNoKFsiY29tIiwvXiMoPzojIyg/OlteI118Iyg/ISMjKSkqKD86IyMjfCQpfC4qKS8scSwiIyJdKTptLnB1c2goWyJjb20iLC9eIyg/Oig/OmRlZmluZXxlbGlmfGVsc2V8ZW5kaWZ8ZXJyb3J8aWZkZWZ8aW5jbHVkZXxpZm5kZWZ8bGluZXxwcmFnbWF8dW5kZWZ8d2FybmluZylcYnxbXlxuXHJdKikvLHEsIiMiXSksZS5wdXNoKFsic3RyIiwvXjwoPzooPzooPzpcLlwuXC8pKnxcLz8pKD86W1x3LV0rKD86XC9bXHctXSspKyk/W1x3LV0rXC5ofFthLXpdXHcqKT4vLHFdKSk6bS5wdXNoKFsiY29tIiwvXiNbXlxuXHJdKi8sCi1xLCIjIl0pKTthLmNTdHlsZUNvbW1lbnRzJiYoZS5wdXNoKFsiY29tIiwvXlwvXC9bXlxuXHJdKi8scV0pLGUucHVzaChbImNvbSIsL15cL1wqW1xTXHNdKj8oPzpcKlwvfCQpLyxxXSkpO2EucmVnZXhMaXRlcmFscyYmZS5wdXNoKFsibGFuZy1yZWdleCIsL14oPzpeXlwuP3xbISstXXwhPXwhPT18I3wlfCU9fCZ8JiZ8JiY9fCY9fFwofFwqfFwqPXxcKz18LHwtPXwtPnxcL3xcLz18Onw6Onw7fDx8PDx8PDw9fDw9fD18PT18PT09fD58Pj18Pj58Pj49fD4+Pnw+Pj49fFs/QFteXXxcXj18XF5cXnxcXlxePXx7fFx8fFx8PXxcfFx8fFx8XHw9fH58YnJlYWt8Y2FzZXxjb250aW51ZXxkZWxldGV8ZG98ZWxzZXxmaW5hbGx5fGluc3RhbmNlb2Z8cmV0dXJufHRocm93fHRyeXx0eXBlb2YpXHMqKFwvKD89W14qL10pKD86W14vW1xcXXxcXFtcU1xzXXxcWyg/OlteXFxcXV18XFxbXFNcc10pKig/Ol18JCkpK1wvKS9dKTsoaD1hLnR5cGVzKSYmZS5wdXNoKFsidHlwIixoXSk7YT0oIiIrYS5rZXl3b3JkcykucmVwbGFjZSgvXiB8ICQvZywKLSIiKTthLmxlbmd0aCYmZS5wdXNoKFsia3dkIixSZWdFeHAoIl4oPzoiK2EucmVwbGFjZSgvW1xzLF0rL2csInwiKSsiKVxcYiIpLHFdKTttLnB1c2goWyJwbG4iLC9eXHMrLyxxLCIgXHJcblx0XHhhMCJdKTtlLnB1c2goWyJsaXQiLC9eQFskX2Etel1bXHckQF0qL2kscV0sWyJ0eXAiLC9eKD86W0BfXT9bQS1aXStbYS16XVtcdyRAXSp8XHcrX3RcYikvLHFdLFsicGxuIiwvXlskX2Etel1bXHckQF0qL2kscV0sWyJsaXQiLC9eKD86MHhbXGRhLWZdK3woPzpcZCg/Ol9cZCspKlxkKig/OlwuXGQqKT98XC5cZFwrKSg/OmVbKy1dP1xkKyk/KVthLXpdKi9pLHEsIjAxMjM0NTY3ODkiXSxbInBsbiIsL15cXFtcU1xzXT8vLHFdLFsicHVuIiwvXi5bXlxzXHciLSQnLi9AXFxgXSovLHFdKTtyZXR1cm4geChtLGUpfWZ1bmN0aW9uIEQoYSxtKXtmdW5jdGlvbiBlKGEpe3N3aXRjaChhLm5vZGVUeXBlKXtjYXNlIDE6aWYoay50ZXN0KGEuY2xhc3NOYW1lKSlicmVhaztpZigiQlIiPT09YS5ub2RlTmFtZSloKGEpLAotYS5wYXJlbnROb2RlJiZhLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYSk7ZWxzZSBmb3IoYT1hLmZpcnN0Q2hpbGQ7YTthPWEubmV4dFNpYmxpbmcpZShhKTticmVhaztjYXNlIDM6Y2FzZSA0OmlmKHApe3ZhciBiPWEubm9kZVZhbHVlLGQ9Yi5tYXRjaCh0KTtpZihkKXt2YXIgYz1iLnN1YnN0cmluZygwLGQuaW5kZXgpO2Eubm9kZVZhbHVlPWM7KGI9Yi5zdWJzdHJpbmcoZC5pbmRleCtkWzBdLmxlbmd0aCkpJiZhLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHMuY3JlYXRlVGV4dE5vZGUoYiksYS5uZXh0U2libGluZyk7aChhKTtjfHxhLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYSl9fX19ZnVuY3Rpb24gaChhKXtmdW5jdGlvbiBiKGEsZCl7dmFyIGU9ZD9hLmNsb25lTm9kZSghMSk6YSxmPWEucGFyZW50Tm9kZTtpZihmKXt2YXIgZj1iKGYsMSksZz1hLm5leHRTaWJsaW5nO2YuYXBwZW5kQ2hpbGQoZSk7Zm9yKHZhciBoPWc7aDtoPWcpZz1oLm5leHRTaWJsaW5nLGYuYXBwZW5kQ2hpbGQoaCl9cmV0dXJuIGV9Ci1mb3IoOyFhLm5leHRTaWJsaW5nOylpZihhPWEucGFyZW50Tm9kZSwhYSlyZXR1cm47Zm9yKHZhciBhPWIoYS5uZXh0U2libGluZywwKSxlOyhlPWEucGFyZW50Tm9kZSkmJmUubm9kZVR5cGU9PT0xOylhPWU7ZC5wdXNoKGEpfXZhciBrPS8oPzpefFxzKW5vY29kZSg/OlxzfCQpLyx0PS9cclxuP3xcbi8scz1hLm93bmVyRG9jdW1lbnQsbDthLmN1cnJlbnRTdHlsZT9sPWEuY3VycmVudFN0eWxlLndoaXRlU3BhY2U6d2luZG93LmdldENvbXB1dGVkU3R5bGUmJihsPXMuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShhLHEpLmdldFByb3BlcnR5VmFsdWUoIndoaXRlLXNwYWNlIikpO3ZhciBwPWwmJiJwcmUiPT09bC5zdWJzdHJpbmcoMCwzKTtmb3IobD1zLmNyZWF0ZUVsZW1lbnQoIkxJIik7YS5maXJzdENoaWxkOylsLmFwcGVuZENoaWxkKGEuZmlyc3RDaGlsZCk7Zm9yKHZhciBkPVtsXSxnPTA7ZzxkLmxlbmd0aDsrK2cpZShkW2ddKTttPT09KG18MCkmJmRbMF0uc2V0QXR0cmlidXRlKCJ2YWx1ZSIsCi1tKTt2YXIgcj1zLmNyZWF0ZUVsZW1lbnQoIk9MIik7ci5jbGFzc05hbWU9ImxpbmVudW1zIjtmb3IodmFyIG49TWF0aC5tYXgoMCxtLTF8MCl8fDAsZz0wLHo9ZC5sZW5ndGg7Zzx6OysrZylsPWRbZ10sbC5jbGFzc05hbWU9IkwiKyhnK24pJTEwLGwuZmlyc3RDaGlsZHx8bC5hcHBlbmRDaGlsZChzLmNyZWF0ZVRleHROb2RlKCJceGEwIikpLHIuYXBwZW5kQ2hpbGQobCk7YS5hcHBlbmRDaGlsZChyKX1mdW5jdGlvbiBrKGEsbSl7Zm9yKHZhciBlPW0ubGVuZ3RoOy0tZT49MDspe3ZhciBoPW1bZV07QS5oYXNPd25Qcm9wZXJ0eShoKT93aW5kb3cuY29uc29sZSYmY29uc29sZS53YXJuKCJjYW5ub3Qgb3ZlcnJpZGUgbGFuZ3VhZ2UgaGFuZGxlciAlcyIsaCk6QVtoXT1hfX1mdW5jdGlvbiBDKGEsbSl7aWYoIWF8fCFBLmhhc093blByb3BlcnR5KGEpKWE9L15ccyo8Ly50ZXN0KG0pPyJkZWZhdWx0LW1hcmt1cCI6ImRlZmF1bHQtY29kZSI7cmV0dXJuIEFbYV19ZnVuY3Rpb24gRShhKXt2YXIgbT0KLWEuZzt0cnl7dmFyIGU9TShhLmgpLGg9ZS5hO2EuYT1oO2EuYz1lLmM7YS5kPTA7QyhtLGgpKGEpO3ZhciBrPS9cYk1TSUVcYi8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSxtPS9cbi9nLHQ9YS5hLHM9dC5sZW5ndGgsZT0wLGw9YS5jLHA9bC5sZW5ndGgsaD0wLGQ9YS5lLGc9ZC5sZW5ndGgsYT0wO2RbZ109czt2YXIgcixuO2ZvcihuPXI9MDtuPGc7KWRbbl0hPT1kW24rMl0/KGRbcisrXT1kW24rK10sZFtyKytdPWRbbisrXSk6bis9MjtnPXI7Zm9yKG49cj0wO248Zzspe2Zvcih2YXIgej1kW25dLGY9ZFtuKzFdLGI9bisyO2IrMjw9ZyYmZFtiKzFdPT09ZjspYis9MjtkW3IrK109ejtkW3IrK109ZjtuPWJ9Zm9yKGQubGVuZ3RoPXI7aDxwOyl7dmFyIG89bFtoKzJdfHxzLGM9ZFthKzJdfHxzLGI9TWF0aC5taW4obyxjKSxpPWxbaCsxXSxqO2lmKGkubm9kZVR5cGUhPT0xJiYoaj10LnN1YnN0cmluZyhlLGIpKSl7ayYmKGo9ai5yZXBsYWNlKG0sIlxyIikpO2kubm9kZVZhbHVlPQotajt2YXIgdT1pLm93bmVyRG9jdW1lbnQsdj11LmNyZWF0ZUVsZW1lbnQoIlNQQU4iKTt2LmNsYXNzTmFtZT1kW2ErMV07dmFyIHg9aS5wYXJlbnROb2RlO3gucmVwbGFjZUNoaWxkKHYsaSk7di5hcHBlbmRDaGlsZChpKTtlPG8mJihsW2grMV09aT11LmNyZWF0ZVRleHROb2RlKHQuc3Vic3RyaW5nKGIsbykpLHguaW5zZXJ0QmVmb3JlKGksdi5uZXh0U2libGluZykpfWU9YjtlPj1vJiYoaCs9Mik7ZT49YyYmKGErPTIpfX1jYXRjaCh3KXsiY29uc29sZSJpbiB3aW5kb3cmJmNvbnNvbGUubG9nKHcmJncuc3RhY2s/dy5zdGFjazp3KX19dmFyIHY9WyJicmVhayxjb250aW51ZSxkbyxlbHNlLGZvcixpZixyZXR1cm4sd2hpbGUiXSx3PVtbdiwiYXV0byxjYXNlLGNoYXIsY29uc3QsZGVmYXVsdCxkb3VibGUsZW51bSxleHRlcm4sZmxvYXQsZ290byxpbnQsbG9uZyxyZWdpc3RlcixzaG9ydCxzaWduZWQsc2l6ZW9mLHN0YXRpYyxzdHJ1Y3Qsc3dpdGNoLHR5cGVkZWYsdW5pb24sdW5zaWduZWQsdm9pZCx2b2xhdGlsZSJdLAotImNhdGNoLGNsYXNzLGRlbGV0ZSxmYWxzZSxpbXBvcnQsbmV3LG9wZXJhdG9yLHByaXZhdGUscHJvdGVjdGVkLHB1YmxpYyx0aGlzLHRocm93LHRydWUsdHJ5LHR5cGVvZiJdLEY9W3csImFsaWdub2YsYWxpZ25fdW5pb24sYXNtLGF4aW9tLGJvb2wsY29uY2VwdCxjb25jZXB0X21hcCxjb25zdF9jYXN0LGNvbnN0ZXhwcixkZWNsdHlwZSxkeW5hbWljX2Nhc3QsZXhwbGljaXQsZXhwb3J0LGZyaWVuZCxpbmxpbmUsbGF0ZV9jaGVjayxtdXRhYmxlLG5hbWVzcGFjZSxudWxscHRyLHJlaW50ZXJwcmV0X2Nhc3Qsc3RhdGljX2Fzc2VydCxzdGF0aWNfY2FzdCx0ZW1wbGF0ZSx0eXBlaWQsdHlwZW5hbWUsdXNpbmcsdmlydHVhbCx3aGVyZSJdLEc9W3csImFic3RyYWN0LGJvb2xlYW4sYnl0ZSxleHRlbmRzLGZpbmFsLGZpbmFsbHksaW1wbGVtZW50cyxpbXBvcnQsaW5zdGFuY2VvZixudWxsLG5hdGl2ZSxwYWNrYWdlLHN0cmljdGZwLHN1cGVyLHN5bmNocm9uaXplZCx0aHJvd3MsdHJhbnNpZW50Il0sCi1IPVtHLCJhcyxiYXNlLGJ5LGNoZWNrZWQsZGVjaW1hbCxkZWxlZ2F0ZSxkZXNjZW5kaW5nLGR5bmFtaWMsZXZlbnQsZml4ZWQsZm9yZWFjaCxmcm9tLGdyb3VwLGltcGxpY2l0LGluLGludGVyZmFjZSxpbnRlcm5hbCxpbnRvLGlzLGxvY2ssb2JqZWN0LG91dCxvdmVycmlkZSxvcmRlcmJ5LHBhcmFtcyxwYXJ0aWFsLHJlYWRvbmx5LHJlZixzYnl0ZSxzZWFsZWQsc3RhY2thbGxvYyxzdHJpbmcsc2VsZWN0LHVpbnQsdWxvbmcsdW5jaGVja2VkLHVuc2FmZSx1c2hvcnQsdmFyIl0sdz1bdywiZGVidWdnZXIsZXZhbCxleHBvcnQsZnVuY3Rpb24sZ2V0LG51bGwsc2V0LHVuZGVmaW5lZCx2YXIsd2l0aCxJbmZpbml0eSxOYU4iXSxJPVt2LCJhbmQsYXMsYXNzZXJ0LGNsYXNzLGRlZixkZWwsZWxpZixleGNlcHQsZXhlYyxmaW5hbGx5LGZyb20sZ2xvYmFsLGltcG9ydCxpbixpcyxsYW1iZGEsbm9ubG9jYWwsbm90LG9yLHBhc3MscHJpbnQscmFpc2UsdHJ5LHdpdGgseWllbGQsRmFsc2UsVHJ1ZSxOb25lIl0sCi1KPVt2LCJhbGlhcyxhbmQsYmVnaW4sY2FzZSxjbGFzcyxkZWYsZGVmaW5lZCxlbHNpZixlbmQsZW5zdXJlLGZhbHNlLGluLG1vZHVsZSxuZXh0LG5pbCxub3Qsb3IscmVkbyxyZXNjdWUscmV0cnksc2VsZixzdXBlcix0aGVuLHRydWUsdW5kZWYsdW5sZXNzLHVudGlsLHdoZW4seWllbGQsQkVHSU4sRU5EIl0sdj1bdiwiY2FzZSxkb25lLGVsaWYsZXNhYyxldmFsLGZpLGZ1bmN0aW9uLGluLGxvY2FsLHNldCx0aGVuLHVudGlsIl0sSz0vXihESVJ8RklMRXx2ZWN0b3J8KGRlfHByaW9yaXR5Xyk/cXVldWV8bGlzdHxzdGFja3woY29uc3RfKT9pdGVyYXRvcnwobXVsdGkpPyhzZXR8bWFwKXxiaXRzZXR8dT8oaW50fGZsb2F0KVxkKikvLE49L1xTLyxPPXUoe2tleXdvcmRzOltGLEgsdywiY2FsbGVyLGRlbGV0ZSxkaWUsZG8sZHVtcCxlbHNpZixldmFsLGV4aXQsZm9yZWFjaCxmb3IsZ290byxpZixpbXBvcnQsbGFzdCxsb2NhbCxteSxuZXh0LG5vLG91cixwcmludCxwYWNrYWdlLHJlZG8scmVxdWlyZSxzdWIsdW5kZWYsdW5sZXNzLHVudGlsLHVzZSx3YW50YXJyYXksd2hpbGUsQkVHSU4sRU5EIisKLUksSix2XSxoYXNoQ29tbWVudHM6ITAsY1N0eWxlQ29tbWVudHM6ITAsbXVsdGlMaW5lU3RyaW5nczohMCxyZWdleExpdGVyYWxzOiEwfSksQT17fTtrKE8sWyJkZWZhdWx0LWNvZGUiXSk7ayh4KFtdLFtbInBsbiIsL15bXjw/XSsvXSxbImRlYyIsL148IVx3W14+XSooPzo+fCQpL10sWyJjb20iLC9ePFwhLS1bXFNcc10qPyg/Oi0tXD58JCkvXSxbImxhbmctIiwvXjxcPyhbXFNcc10rPykoPzpcPz58JCkvXSxbImxhbmctIiwvXjwlKFtcU1xzXSs/KSg/OiU+fCQpL10sWyJwdW4iLC9eKD86PFslP118WyU/XT4pL10sWyJsYW5nLSIsL148eG1wXGJbXj5dKj4oW1xTXHNdKz8pPFwveG1wXGJbXj5dKj4vaV0sWyJsYW5nLWpzIiwvXjxzY3JpcHRcYltePl0qPihbXFNcc10qPykoPFwvc2NyaXB0XGJbXj5dKj4pL2ldLFsibGFuZy1jc3MiLC9ePHN0eWxlXGJbXj5dKj4oW1xTXHNdKj8pKDxcL3N0eWxlXGJbXj5dKj4pL2ldLFsibGFuZy1pbi50YWciLC9eKDxcLz9bYS16XVtePD5dKj4pL2ldXSksCi1bImRlZmF1bHQtbWFya3VwIiwiaHRtIiwiaHRtbCIsIm14bWwiLCJ4aHRtbCIsInhtbCIsInhzbCJdKTtrKHgoW1sicGxuIiwvXlxzKy8scSwiIFx0XHJcbiJdLFsiYXR2IiwvXig/OiJbXiJdKiI/fCdbXiddKic/KS8scSwiXCInIl1dLFtbInRhZyIsL15ePFwvP1thLXpdKD86W1x3LS46XSpcdyk/fFwvPz4kL2ldLFsiYXRuIiwvXig/IXN0eWxlW1xzPV18b24pW2Etel0oPzpbXHc6LV0qXHcpPy9pXSxbImxhbmctdXEudmFsIiwvXj1ccyooW15ccyInPl0qKD86W15ccyInLz5dfFwvKD89XHMpKSkvXSxbInB1biIsL15bLzwtPl0rL10sWyJsYW5nLWpzIiwvXm9uXHcrXHMqPVxzKiIoW14iXSspIi9pXSxbImxhbmctanMiLC9eb25cdytccyo9XHMqJyhbXiddKyknL2ldLFsibGFuZy1qcyIsL15vblx3K1xzKj1ccyooW15ccyInPl0rKS9pXSxbImxhbmctY3NzIiwvXnN0eWxlXHMqPVxzKiIoW14iXSspIi9pXSxbImxhbmctY3NzIiwvXnN0eWxlXHMqPVxzKicoW14nXSspJy9pXSxbImxhbmctY3NzIiwKLS9ec3R5bGVccyo9XHMqKFteXHMiJz5dKykvaV1dKSxbImluLnRhZyJdKTtrKHgoW10sW1siYXR2IiwvXltcU1xzXSsvXV0pLFsidXEudmFsIl0pO2sodSh7a2V5d29yZHM6RixoYXNoQ29tbWVudHM6ITAsY1N0eWxlQ29tbWVudHM6ITAsdHlwZXM6S30pLFsiYyIsImNjIiwiY3BwIiwiY3h4IiwiY3ljIiwibSJdKTtrKHUoe2tleXdvcmRzOiJudWxsLHRydWUsZmFsc2UifSksWyJqc29uIl0pO2sodSh7a2V5d29yZHM6SCxoYXNoQ29tbWVudHM6ITAsY1N0eWxlQ29tbWVudHM6ITAsdmVyYmF0aW1TdHJpbmdzOiEwLHR5cGVzOkt9KSxbImNzIl0pO2sodSh7a2V5d29yZHM6RyxjU3R5bGVDb21tZW50czohMH0pLFsiamF2YSJdKTtrKHUoe2tleXdvcmRzOnYsaGFzaENvbW1lbnRzOiEwLG11bHRpTGluZVN0cmluZ3M6ITB9KSxbImJzaCIsImNzaCIsInNoIl0pO2sodSh7a2V5d29yZHM6SSxoYXNoQ29tbWVudHM6ITAsbXVsdGlMaW5lU3RyaW5nczohMCx0cmlwbGVRdW90ZWRTdHJpbmdzOiEwfSksCi1bImN2IiwicHkiXSk7ayh1KHtrZXl3b3JkczoiY2FsbGVyLGRlbGV0ZSxkaWUsZG8sZHVtcCxlbHNpZixldmFsLGV4aXQsZm9yZWFjaCxmb3IsZ290byxpZixpbXBvcnQsbGFzdCxsb2NhbCxteSxuZXh0LG5vLG91cixwcmludCxwYWNrYWdlLHJlZG8scmVxdWlyZSxzdWIsdW5kZWYsdW5sZXNzLHVudGlsLHVzZSx3YW50YXJyYXksd2hpbGUsQkVHSU4sRU5EIixoYXNoQ29tbWVudHM6ITAsbXVsdGlMaW5lU3RyaW5nczohMCxyZWdleExpdGVyYWxzOiEwfSksWyJwZXJsIiwicGwiLCJwbSJdKTtrKHUoe2tleXdvcmRzOkosaGFzaENvbW1lbnRzOiEwLG11bHRpTGluZVN0cmluZ3M6ITAscmVnZXhMaXRlcmFsczohMH0pLFsicmIiXSk7ayh1KHtrZXl3b3Jkczp3LGNTdHlsZUNvbW1lbnRzOiEwLHJlZ2V4TGl0ZXJhbHM6ITB9KSxbImpzIl0pO2sodSh7a2V5d29yZHM6ImFsbCxhbmQsYnksY2F0Y2gsY2xhc3MsZWxzZSxleHRlbmRzLGZhbHNlLGZpbmFsbHksZm9yLGlmLGluLGlzLGlzbnQsbG9vcCxuZXcsbm8sbm90LG51bGwsb2Ysb2ZmLG9uLG9yLHJldHVybixzdXBlcix0aGVuLHRydWUsdHJ5LHVubGVzcyx1bnRpbCx3aGVuLHdoaWxlLHllcyIsCi1oYXNoQ29tbWVudHM6MyxjU3R5bGVDb21tZW50czohMCxtdWx0aWxpbmVTdHJpbmdzOiEwLHRyaXBsZVF1b3RlZFN0cmluZ3M6ITAscmVnZXhMaXRlcmFsczohMH0pLFsiY29mZmVlIl0pO2soeChbXSxbWyJzdHIiLC9eW1xTXHNdKy9dXSksWyJyZWdleCJdKTt3aW5kb3cucHJldHR5UHJpbnRPbmU9ZnVuY3Rpb24oYSxtLGUpe3ZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIlBSRSIpO2guaW5uZXJIVE1MPWE7ZSYmRChoLGUpO0Uoe2c6bSxpOmUsaDpofSk7cmV0dXJuIGguaW5uZXJIVE1MfTt3aW5kb3cucHJldHR5UHJpbnQ9ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gbSgpe2Zvcih2YXIgZT13aW5kb3cuUFJfU0hPVUxEX1VTRV9DT05USU5VQVRJT04/bC5ub3coKSsyNTA6SW5maW5pdHk7cDxoLmxlbmd0aCYmbC5ub3coKTxlO3ArKyl7dmFyIG49aFtwXSxrPW4uY2xhc3NOYW1lO2lmKGsuaW5kZXhPZigicHJldHR5cHJpbnQiKT49MCl7dmFyIGs9ay5tYXRjaChnKSxmLGI7aWYoYj0KLSFrKXtiPW47Zm9yKHZhciBvPXZvaWQgMCxjPWIuZmlyc3RDaGlsZDtjO2M9Yy5uZXh0U2libGluZyl2YXIgaT1jLm5vZGVUeXBlLG89aT09PTE/bz9iOmM6aT09PTM/Ti50ZXN0KGMubm9kZVZhbHVlKT9iOm86bztiPShmPW89PT1iP3ZvaWQgMDpvKSYmIkNPREUiPT09Zi50YWdOYW1lfWImJihrPWYuY2xhc3NOYW1lLm1hdGNoKGcpKTtrJiYoaz1rWzFdKTtiPSExO2ZvcihvPW4ucGFyZW50Tm9kZTtvO289by5wYXJlbnROb2RlKWlmKChvLnRhZ05hbWU9PT0icHJlInx8by50YWdOYW1lPT09ImNvZGUifHxvLnRhZ05hbWU9PT0ieG1wIikmJm8uY2xhc3NOYW1lJiZvLmNsYXNzTmFtZS5pbmRleE9mKCJwcmV0dHlwcmludCIpPj0wKXtiPSEwO2JyZWFrfWJ8fCgoYj0oYj1uLmNsYXNzTmFtZS5tYXRjaCgvXGJsaW5lbnVtc1xiKD86OihcZCspKT8vKSk/YlsxXSYmYlsxXS5sZW5ndGg/K2JbMV06ITA6ITEpJiZEKG4sYiksZD17ZzprLGg6bixpOmJ9LEUoZCkpfX1wPGgubGVuZ3RoP3NldFRpbWVvdXQobSwKLTI1MCk6YSYmYSgpfWZvcih2YXIgZT1bZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInByZSIpLGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJjb2RlIiksZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInhtcCIpXSxoPVtdLGs9MDtrPGUubGVuZ3RoOysraylmb3IodmFyIHQ9MCxzPWVba10ubGVuZ3RoO3Q8czsrK3QpaC5wdXNoKGVba11bdF0pO3ZhciBlPXEsbD1EYXRlO2wubm93fHwobD17bm93OmZ1bmN0aW9uKCl7cmV0dXJuK25ldyBEYXRlfX0pO3ZhciBwPTAsZCxnPS9cYmxhbmcoPzp1YWdlKT8tKFtcdy5dKykoPyFcUykvO20oKX07d2luZG93LlBSPXtjcmVhdGVTaW1wbGVMZXhlcjp4LHJlZ2lzdGVyTGFuZ0hhbmRsZXI6ayxzb3VyY2VEZWNvcmF0b3I6dSxQUl9BVFRSSUJfTkFNRToiYXRuIixQUl9BVFRSSUJfVkFMVUU6ImF0diIsUFJfQ09NTUVOVDoiY29tIixQUl9ERUNMQVJBVElPTjoiZGVjIixQUl9LRVlXT1JEOiJrd2QiLFBSX0xJVEVSQUw6ImxpdCIsCi1QUl9OT0NPREU6Im5vY29kZSIsUFJfUExBSU46InBsbiIsUFJfUFVOQ1RVQVRJT046InB1biIsUFJfU09VUkNFOiJzcmMiLFBSX1NUUklORzoic3RyIixQUl9UQUc6InRhZyIsUFJfVFlQRToidHlwIn19KSgpOwpkaWZmIC0tZ2l0IGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9jbGFzcy5jcyBiL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvY2xhc3MuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4NjMzZmIuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9jbGFzcy5jcworKysgL2Rldi9udWxsCkBAIC0xLDY1OCArMCwwIEBACi08P2NzIGluY2x1ZGU6ImRvY3R5cGUuY3MiID8+Ci08P2NzIGluY2x1ZGU6Im1hY3Jvcy5jcyIgPz4KLTxodG1sPD9jcyBpZjpkZXZzaXRlID8+IGRldnNpdGU8P2NzIC9pZiA/Pj4KLTw/Y3MgaW5jbHVkZToiaGVhZF90YWcuY3MiID8+Ci08Ym9keSBjbGFzcz0iZ2MtZG9jdW1lbnRhdGlvbiA8P2NzIGlmOihyZWZlcmVuY2UuZ21zIHx8IHJlZmVyZW5jZS5nY20pID8+Z29vZ2xlPD9jcyAvaWYgPz4KLSAgPD9jcyBpZjooZ3VpZGV8fGRldmVsb3B8fHRyYWluaW5nfHxyZWZlcmVuY2V8fHRvb2xzfHxzZGspID8+ZGV2ZWxvcDw/Y3MKLSAgZWxpZjpkZXNpZ24gPz5kZXNpZ248P2NzCi0gIGVsaWY6ZGlzdHJpYnV0ZSA/PmRpc3RyaWJ1dGU8P2NzCi0gIC9pZiA/PiIgaXRlbXNjb3BlIGl0ZW10eXBlPSJodHRwOi8vc2NoZW1hLm9yZy9BcnRpY2xlIj4KLSAgPGRpdiBpZD0iZG9jLWFwaS1sZXZlbCIgY2xhc3M9Ijw/Y3MgdmFyOmNsYXNzLnNpbmNlID8+IiBzdHlsZT0iZGlzcGxheTpub25lIj48L2Rpdj4KLSAgPGEgbmFtZT0idG9wIj48L2E+Ci08P2NzIGluY2x1ZGU6ImhlYWRlci5jcyIgPz4KLQotPGRpdiBjbGFzcz0iY29sLTEyIiAgaWQ9ImRvYy1jb2wiPgotCi08ZGl2IGlkPSJhcGktaW5mby1ibG9jayI+Ci0KLTw/Y3MgIyBhcmUgdGhlcmUgaW5oZXJpdGVkIG1lbWJlcnMgPz4KLTw/Y3MgZWFjaDpjbD1jbGFzcy5pbmhlcml0ZWQgPz4KLSAgPD9jcyBpZjpzdWJjb3VudChjbC5tZXRob2RzKSA/PgotICAgPD9jcyBzZXQ6aW5obWV0aG9kcyA9ICMxID8+Ci0gIDw/Y3MgL2lmID8+Ci0gIDw/Y3MgaWY6c3ViY291bnQoY2wuY29uc3RhbnRzKSA/PgotICAgPD9jcyBzZXQ6aW5oY29uc3RhbnRzID0gIzEgPz4KLSAgPD9jcyAvaWYgPz4KLSAgPD9jcyBpZjpzdWJjb3VudChjbC5maWVsZHMpID8+Ci0gICA8P2NzIHNldDppbmhmaWVsZHMgPSAjMSA/PgotICA8P2NzIC9pZiA/PgotICA8P2NzIGlmOnN1YmNvdW50KGNsLmF0dHJzKSA/PgotICAgPD9jcyBzZXQ6aW5oYXR0cnMgPSAjMSA/PgotICA8P2NzIC9pZiA/PgotPD9jcyAvZWFjaCA/PgotCi08ZGl2IGNsYXNzPSJzdW0tZGV0YWlscy1saW5rcyI+Ci08P2NzIGlmOmluaGF0dHJzIHx8IGluaGNvbnN0YW50cyB8fCBpbmhmaWVsZHMgfHwgaW5obWV0aG9kcyB8fCAoIWNsYXNzLnN1YmNsYXNzZXMuaGlkZGVuICYmCi0gICAgIChzdWJjb3VudChjbGFzcy5zdWJjbGFzc2VzLmRpcmVjdCkgfHwgc3ViY291bnQoY2xhc3Muc3ViY2xhc3Nlcy5pbmRpcmVjdCkpKSA/PgotU3VtbWFyeToKLTw/Y3MgaWY6c3ViY291bnQoY2xhc3MuaW5uZXJzKSA/PgotICA8YSBocmVmPSIjbmVzdGVkY2xhc3NlcyI+TmVzdGVkIENsYXNzZXM8L2E+Ci0gIDw/Y3Mgc2V0Omxpbmtjb3VudCA9ICMxID8+Ci08P2NzIC9pZiA/PgotPD9jcyBpZjpzdWJjb3VudChjbGFzcy5hdHRycykgPz4KLSAgPD9jcyBpZjpsaW5rY291bnQgPz4mIzEyNDsgPD9jcyAvaWYgPz48YSBocmVmPSIjbGF0dHJzIj5YTUwgQXR0cnM8L2E+Ci0gIDw/Y3Mgc2V0Omxpbmtjb3VudCA9ICMxID8+Ci08P2NzIC9pZiA/PgotPD9jcyBpZjppbmhhdHRycyA/PgotICA8P2NzIGlmOmxpbmtjb3VudCA/PiYjMTI0OyA8P2NzIC9pZiA/PjxhIGhyZWY9IiNpbmhhdHRycyI+SW5oZXJpdGVkIFhNTCBBdHRyczwvYT4KLSAgPD9jcyBzZXQ6bGlua2NvdW50ID0gIzEgPz4KLTw/Y3MgL2lmID8+Ci08P2NzIGlmOnN1YmNvdW50KGNsYXNzLmVudW1Db25zdGFudHMpID8+Ci0gIDw/Y3MgaWY6bGlua2NvdW50ID8+JiMxMjQ7IDw/Y3MgL2lmID8+PGEgaHJlZj0iI2VudW1jb25zdGFudHMiPkVudW1zPC9hPgotICA8P2NzIHNldDpsaW5rY291bnQgPSAjMSA/PgotPD9jcyAvaWYgPz4KLTw/Y3MgaWY6c3ViY291bnQoY2xhc3MuY29uc3RhbnRzKSA/PgotICA8P2NzIGlmOmxpbmtjb3VudCA/PiYjMTI0OyA8P2NzIC9pZiA/PjxhIGhyZWY9IiNjb25zdGFudHMiPkNvbnN0YW50czwvYT4KLSAgPD9jcyBzZXQ6bGlua2NvdW50ID0gIzEgPz4KLTw/Y3MgL2lmID8+Ci08P2NzIGlmOmluaGNvbnN0YW50cyA/PgotICA8P2NzIGlmOmxpbmtjb3VudCA/PiYjMTI0OyA8P2NzIC9pZiA/PjxhIGhyZWY9IiNpbmhjb25zdGFudHMiPkluaGVyaXRlZCBDb25zdGFudHM8L2E+Ci0gIDw/Y3Mgc2V0Omxpbmtjb3VudCA9ICMxID8+Ci08P2NzIC9pZiA/PgotPD9jcyBpZjpzdWJjb3VudChjbGFzcy5maWVsZHMpID8+Ci0gIDw/Y3MgaWY6bGlua2NvdW50ID8+JiMxMjQ7IDw/Y3MgL2lmID8+PGEgaHJlZj0iI2xmaWVsZHMiPkZpZWxkczwvYT4KLSAgPD9jcyBzZXQ6bGlua2NvdW50ID0gIzEgPz4KLTw/Y3MgL2lmID8+Ci08P2NzIGlmOmluaGZpZWxkcyA/PgotICA8P2NzIGlmOmxpbmtjb3VudCA/PiYjMTI0OyA8P2NzIC9pZiA/PjxhIGhyZWY9IiNpbmhmaWVsZHMiPkluaGVyaXRlZCBGaWVsZHM8L2E+Ci0gIDw/Y3Mgc2V0Omxpbmtjb3VudCA9ICMxID8+Ci08P2NzIC9pZiA/PgotPD9jcyBpZjpzdWJjb3VudChjbGFzcy5jdG9ycy5wdWJsaWMpID8+Ci0gIDw/Y3MgaWY6bGlua2NvdW50ID8+JiMxMjQ7IDw/Y3MgL2lmID8+PGEgaHJlZj0iI3B1YmN0b3JzIj5DdG9yczwvYT4KLSAgPD9jcyBzZXQ6bGlua2NvdW50ID0gIzEgPz4KLTw/Y3MgL2lmID8+Ci08P2NzIGlmOnN1YmNvdW50KGNsYXNzLmN0b3JzLnByb3RlY3RlZCkgPz4KLSAgPD9jcyBpZjpsaW5rY291bnQgPz4mIzEyNDsgPD9jcyAvaWYgPz48YSBocmVmPSIjcHJvY3RvcnMiPlByb3RlY3RlZCBDdG9yczwvYT4KLSAgPD9jcyBzZXQ6bGlua2NvdW50ID0gIzEgPz4KLTw/Y3MgL2lmID8+Ci08P2NzIGlmOnN1YmNvdW50KGNsYXNzLm1ldGhvZHMucHVibGljKSA/PgotICA8P2NzIGlmOmxpbmtjb3VudCA/PiYjMTI0OyA8P2NzIC9pZiA/PjxhIGhyZWY9IiNwdWJtZXRob2RzIj5NZXRob2RzPC9hPgotICA8P2NzIHNldDpsaW5rY291bnQgPSAjMSA/PgotPD9jcyAvaWYgPz4KLTw/Y3MgaWY6c3ViY291bnQoY2xhc3MubWV0aG9kcy5wcm90ZWN0ZWQpID8+Ci0gIDw/Y3MgaWY6bGlua2NvdW50ID8+JiMxMjQ7IDw/Y3MgL2lmID8+PGEgaHJlZj0iI3Byb21ldGhvZHMiPlByb3RlY3RlZCBNZXRob2RzPC9hPgotICA8P2NzIHNldDpsaW5rY291bnQgPSAjMSA/PgotPD9jcyAvaWYgPz4KLTw/Y3MgaWY6aW5obWV0aG9kcyA/PgotICA8P2NzIGlmOmxpbmtjb3VudCA/PiYjMTI0OyA8P2NzIC9pZiA/PjxhIGhyZWY9IiNpbmhtZXRob2RzIj5Jbmhlcml0ZWQgTWV0aG9kczwvYT4KLTw/Y3MgL2lmID8+Ci0mIzEyNDsgPGEgaHJlZj0iIyIgb25jbGljaz0icmV0dXJuIHRvZ2dsZUFsbENsYXNzSW5oZXJpdGVkKCkiIGlkPSJ0b2dnbGVBbGxDbGFzc0luaGVyaXRlZCI+W0V4cGFuZCBBbGxdPC9hPgotPD9jcyAvaWYgPz4KLTwvZGl2PjwhLS0gZW5kIHN1bS1kZXRhaWxzLWxpbmtzIC0tPgotPGRpdiBjbGFzcz0iYXBpLWxldmVsIj4KLSAgPD9jcyBjYWxsOnNpbmNlX3RhZ3MoY2xhc3MpID8+PD9jcwotICBpZjpjbGFzcy5kZXByZWNhdGVkc2luY2UKLSAgICA/Pjxicj5EZXByZWNhdGVkIHNpbmNlIDxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/Pmd1aWRlL3RvcGljcy9tYW5pZmVzdC91c2VzLXNkay1lbGVtZW50Lmh0bWwjQXBpTGV2ZWxzIgotICAgICAgICA+QVBJIGxldmVsIDw/Y3MgdmFyOmNsYXNzLmRlcHJlY2F0ZWRzaW5jZSA/PjwvYT48P2NzCi0gIC9pZiA/PgotICA8P2NzIGNhbGw6ZmVkZXJhdGVkX3JlZnMoY2xhc3MpID8+Ci08L2Rpdj4KLTwvZGl2PjwhLS0gZW5kIGFwaS1pbmZvLWJsb2NrIC0tPgotCi08P2NzICMgdGhpcyBuZXh0IGxpbmUgbXVzdCBiZSBleGFjdGx5IGxpa2UgdGhpcyB0byBiZSBwYXJzZWQgYnkgZWNsaXBzZSA/PgotPCEtLSA9PT09PT09PSBTVEFSVCBPRiBDTEFTUyBEQVRBID09PT09PT09IC0tPgotCi08ZGl2IGlkPSJqZC1oZWFkZXIiPgotICAgIDw/Y3MgdmFyOmNsYXNzLnNjb3BlID8+Ci0gICAgPD9jcyB2YXI6Y2xhc3Muc3RhdGljID8+IAotICAgIDw/Y3MgdmFyOmNsYXNzLmZpbmFsID8+IAotICAgIDw/Y3MgdmFyOmNsYXNzLmFic3RyYWN0ID8+Ci0gICAgPD9jcyB2YXI6Y2xhc3Mua2luZCA/PgotPGgxIGl0ZW1wcm9wPSJuYW1lIj48P2NzIHZhcjpjbGFzcy5uYW1lID8+PC9oMT4KLQotPD9jcyBzZXQ6Y29sc3BhbiA9IHN1YmNvdW50KGNsYXNzLmluaGVyaXRhbmNlKSA/PgotPD9jcyBlYWNoOnN1cHIgPSBjbGFzcy5pbmhlcml0YW5jZSA/PgotICA8P2NzIGlmOmNvbHNwYW4gPT0gMiA/PgotICAgIGV4dGVuZHMgPD9jcyBjYWxsOnR5cGVfbGluayhzdXByLnNob3J0X2NsYXNzKSA/Pjxici8+Ci0gIDw/Y3MgL2lmID8+Ci0gIDw/Y3MgaWY6bGFzdChzdXByKSAmJiBzdWJjb3VudChzdXByLmludGVyZmFjZXMpID8+Ci0gICAgICBpbXBsZW1lbnRzIAotICAgICAgPD9jcyBlYWNoOnQ9c3Vwci5pbnRlcmZhY2VzID8+Ci0gICAgICAgIDw/Y3MgY2FsbDp0eXBlX2xpbmsodCkgPz4gCi0gICAgICA8P2NzIC9lYWNoID8+Ci0gIDw/Y3MgL2lmID8+Ci0gIDw/Y3Mgc2V0OmNvbHNwYW4gPSBjb2xzcGFuLTEgPz4KLTw/Y3MgL2VhY2ggPz4KLTw/Y3MgY2FsbDpzaG93X2Fubm90YXRpb25zX2xpc3QoY2xhc3MsICI8c3BhbiBjbGFzcz0nYW5ub3RhdGlvbi1tZXNzYWdlJz4iLCAiPC9zcGFuPjxzcGFuIGNsYXNzPSdhbm5vdGF0aW9uLW1lc3NhZ2UnPiIsICI8L3NwYW4+IikgPz4KLQotPC9kaXY+PCEtLSBlbmQgaGVhZGVyIC0tPgotCi08ZGl2IGlkPSJuYU1lc3NhZ2UiPjwvZGl2PgotCi08ZGl2IGlkPSJqZC1jb250ZW50IiBjbGFzcz0iYXBpIGFwaWxldmVsLTw/Y3MgdmFyOmNsYXNzLnNpbmNlID8+Ij4KLTx0YWJsZSBjbGFzcz0iamQtaW5oZXJpdGFuY2UtdGFibGUiPgotPD9jcyBzZXQ6Y29sc3BhbiA9IHN1YmNvdW50KGNsYXNzLmluaGVyaXRhbmNlKSA/PgotPD9jcyBlYWNoOnN1cHIgPSBjbGFzcy5pbmhlcml0YW5jZSA/PgotICAgIDx0cj4KLSAgICAgICAgPD9jcyBsb29wOmkgPSAxLCAoc3ViY291bnQoY2xhc3MuaW5oZXJpdGFuY2UpLWNvbHNwYW4pLCAxID8+Ci0gICAgICAgICAgICA8dGQgY2xhc3M9ImpkLWluaGVyaXRhbmNlLXNwYWNlIj4mbmJzcDs8P2NzIGlmOihzdWJjb3VudChjbGFzcy5pbmhlcml0YW5jZSktY29sc3BhbikgPT0gaSA/PiZuYnNwOyZuYnNwOyYjeDIxYjM7PD9jcyAvaWYgPz48L3RkPgotICAgICAgICA8P2NzIC9sb29wID8+IAkKLSAgICAgICAgPHRkIGNvbHNwYW49Ijw/Y3MgdmFyOmNvbHNwYW4gPz4iIGNsYXNzPSJqZC1pbmhlcml0YW5jZS1jbGFzcy1jZWxsIj48P2NzCi0gICAgICAgICAgICBpZjpjb2xzcGFuID09IDEKLSAgICAgICAgICAgICAgICA/Pjw/Y3MgY2FsbDpjbGFzc19uYW1lKGNsYXNzLnF1YWxpZmllZFR5cGUpID8+PD9jcyAKLSAgICAgICAgICAgIGVsc2UgCi0gICAgICAgICAgICAgICAgPz48P2NzIGNhbGw6dHlwZV9saW5rKHN1cHIuY2xhc3MpID8+PD9jcwotICAgICAgICAgICAgL2lmID8+PC90ZD4KLSAgICA8L3RyPgotICAgIDw/Y3Mgc2V0OmNvbHNwYW4gPSBjb2xzcGFuLTEgPz4KLTw/Y3MgL2VhY2ggPz4KLTwvdGFibGU+Ci0KLTw/Y3MgIyB0aGlzIG5leHQgbGluZSBtdXN0IGJlIGV4YWN0bHkgbGlrZSB0aGlzIHRvIGJlIHBhcnNlZCBieSBlY2xpcHNlID8+Ci0KLTw/Y3MgaWY6c3ViY291bnQoY2xhc3Muc3ViY2xhc3Nlcy5kaXJlY3QpICYmICFjbGFzcy5zdWJjbGFzc2VzLmhpZGRlbiA/PgotPHRhYmxlIGNsYXNzPSJqZC1zdW10YWJsZSBqZC1zdW10YWJsZS1zdWJjbGFzc2VzIj48dHI+PHRkIGNvbHNwYW49IjEyIiBzdHlsZT0iYm9yZGVyOm5vbmU7bWFyZ2luOjA7cGFkZGluZzowOyI+Ci08P2NzIGNhbGw6ZXhwYW5kb190cmlnZ2VyKCJzdWJjbGFzc2VzLWRpcmVjdCIsICJjbG9zZWQiKSA/Pktub3duIERpcmVjdCBTdWJjbGFzc2VzCi08P2NzIGNhbGw6ZXhwYW5kYWJsZV9jbGFzc19saXN0KCJzdWJjbGFzc2VzLWRpcmVjdCIsIGNsYXNzLnN1YmNsYXNzZXMuZGlyZWN0LCAibGlzdCIpID8+Ci08L3RkPjwvdHI+PC90YWJsZT4KLTw/Y3MgL2lmID8+Ci0KLTw/Y3MgaWY6c3ViY291bnQoY2xhc3Muc3ViY2xhc3Nlcy5pbmRpcmVjdCkgJiYgIWNsYXNzLnN1YmNsYXNzZXMuaGlkZGVuID8+Ci08dGFibGUgY2xhc3M9ImpkLXN1bXRhYmxlIGpkLXN1bXRhYmxlLXN1YmNsYXNzZXMiPjx0cj48dGQgY29sc3Bhbj0iMTIiIHN0eWxlPSJib3JkZXI6bm9uZTttYXJnaW46MDtwYWRkaW5nOjA7Ij4KLTw/Y3MgY2FsbDpleHBhbmRvX3RyaWdnZXIoInN1YmNsYXNzZXMtaW5kaXJlY3QiLCAiY2xvc2VkIikgPz5Lbm93biBJbmRpcmVjdCBTdWJjbGFzc2VzCi08P2NzIGNhbGw6ZXhwYW5kYWJsZV9jbGFzc19saXN0KCJzdWJjbGFzc2VzLWluZGlyZWN0IiwgY2xhc3Muc3ViY2xhc3Nlcy5pbmRpcmVjdCwgImxpc3QiKSA/PgotPC90ZD48L3RyPjwvdGFibGU+Ci08P2NzIC9pZiA/PgotCi08ZGl2IGNsYXNzPSJqZC1kZXNjciI+Ci08P2NzIGNhbGw6ZGVwcmVjYXRlZF93YXJuaW5nKGNsYXNzKSA/PgotPD9jcyBpZjpzdWJjb3VudChjbGFzcy5kZXNjcikgPz4KLTxoMj5DbGFzcyBPdmVydmlldzwvaDI+Ci08cCBpdGVtcHJvcD0iYXJ0aWNsZUJvZHkiPjw/Y3MgY2FsbDp0YWdfbGlzdChjbGFzcy5kZXNjcikgPz48L3A+Ci08P2NzIC9pZiA/PgotCi08P2NzIGNhbGw6c2VlX2Fsc29fdGFncyhjbGFzcy5zZWVBbHNvKSA/PgotCi08L2Rpdj48IS0tIGpkLWRlc2NyIC0tPgotCi0KLTw/Y3MgIyBzdW1tYXJ5IG1hY3JvcyA/PgotCi08P2NzIGRlZjp3cml0ZV9tZXRob2Rfc3VtbWFyeShtZXRob2RzLCBpbmNsdWRlZCkgPz4KLTw/Y3Mgc2V0OmNvdW50ID0gIzEgPz4KLTw/Y3MgZWFjaDptZXRob2QgPSBtZXRob2RzID8+Ci0JIDw/Y3MgIyBUaGUgYXBpbGV2ZWwtTiBjbGFzcyBNVVNUIEJFIExBU1QgaW4gdGhlIHNlcXVlbmNlIG9mIGNsYXNzIG5hbWVzID8+Ci0gICAgPHRyIGNsYXNzPSI8P2NzIGlmOmNvdW50ICUgIzIgPz5hbHQtY29sb3I8P2NzIC9pZiA/PiBhcGkgYXBpbGV2ZWwtPD9jcyB2YXI6bWV0aG9kLnNpbmNlID8+IiA+Ci0gICAgICAgIDx0ZCBjbGFzcz0iamQtdHlwZWNvbCI+PG5vYnI+Ci0gICAgICAgICAgICA8P2NzIHZhcjptZXRob2QuYWJzdHJhY3QgPz4KLSAgICAgICAgICAgIDw/Y3MgdmFyOm1ldGhvZC5kZWZhdWx0ID8+Ci0gICAgICAgICAgICA8P2NzIHZhcjptZXRob2Quc3RhdGljID8+Ci0gICAgICAgICAgICA8P2NzIHZhcjptZXRob2QuZmluYWwgPz4KLSAgICAgICAgICAgIDw/Y3MgY2FsbDp0eXBlX2xpbmsobWV0aG9kLmdlbmVyaWMpID8+Ci0gICAgICAgICAgICA8P2NzIGNhbGw6dHlwZV9saW5rKG1ldGhvZC5yZXR1cm5UeXBlKSA/Pjwvbm9icj4KLSAgICAgICAgPC90ZD4KLSAgICAgICAgPHRkIGNsYXNzPSJqZC1saW5rY29sIiB3aWR0aD0iMTAwJSI+PG5vYnI+Ci0gICAgICAgIDxzcGFuIGNsYXNzPSJzeW1wYWQiPjw/Y3MgY2FsbDpjb25kX2xpbmsobWV0aG9kLm5hbWUsIHRvcm9vdCwgbWV0aG9kLmhyZWYsIGluY2x1ZGVkKSA/Pjwvc3Bhbj4oPD9jcyBjYWxsOnBhcmFtZXRlcl9saXN0KG1ldGhvZC5wYXJhbXMpID8+KTwvbm9icj4KLSAgICAgICAgPD9jcyBpZjpzdWJjb3VudChtZXRob2Quc2hvcnREZXNjcikgfHwgc3ViY291bnQobWV0aG9kLmRlcHJlY2F0ZWQpID8+Ci0gICAgICAgIDxkaXYgY2xhc3M9ImpkLWRlc2NyZGl2Ij48P2NzIGNhbGw6c2hvcnRfZGVzY3IobWV0aG9kKSA/PjwvZGl2PgotICA8P2NzIC9pZiA/PgotICA8L3RkPjwvdHI+Ci08P2NzIHNldDpjb3VudCA9IGNvdW50ICsgIzEgPz4KLTw/Y3MgL2VhY2ggPz4KLTw/Y3MgL2RlZiA/PgotCi08P2NzIGRlZjp3cml0ZV9maWVsZF9zdW1tYXJ5KGZpZWxkcywgaW5jbHVkZWQpID8+Ci08P2NzIHNldDpjb3VudCA9ICMxID8+Ci0gICAgPD9jcyBlYWNoOmZpZWxkPWZpZWxkcyA/PgotICAgICAgPHRyIGNsYXNzPSI8P2NzIGlmOmNvdW50ICUgIzIgPz5hbHQtY29sb3I8P2NzIC9pZiA/PiBhcGkgYXBpbGV2ZWwtPD9jcyB2YXI6ZmllbGQuc2luY2UgPz4iID4KLSAgICAgICAgICA8dGQgY2xhc3M9ImpkLXR5cGVjb2wiPjxub2JyPgotICAgICAgICAgIDw/Y3MgdmFyOmZpZWxkLnNjb3BlID8+Ci0gICAgICAgICAgPD9jcyB2YXI6ZmllbGQuc3RhdGljID8+Ci0gICAgICAgICAgPD9jcyB2YXI6ZmllbGQuZmluYWwgPz4KLSAgICAgICAgICA8P2NzIGNhbGw6dHlwZV9saW5rKGZpZWxkLnR5cGUpID8+PC9ub2JyPjwvdGQ+Ci0gICAgICAgICAgPHRkIGNsYXNzPSJqZC1saW5rY29sIj48P2NzIGNhbGw6Y29uZF9saW5rKGZpZWxkLm5hbWUsIHRvcm9vdCwgZmllbGQuaHJlZiwgaW5jbHVkZWQpID8+PC90ZD4KLSAgICAgICAgICA8dGQgY2xhc3M9ImpkLWRlc2NyY29sIiB3aWR0aD0iMTAwJSI+PD9jcyBjYWxsOnNob3J0X2Rlc2NyKGZpZWxkKSA/PgotICAgICAgICAgICAgICA8P2NzIGVhY2g6YW5ubyA9IGZpZWxkLnNob3dBbm5vdGF0aW9ucyA/PgotICAgICAgICAgICAgICAgICAgPD9jcyBjYWxsOnNob3dfYW5ub3RhdGlvbnNfbGlzdChmaWVsZCwgIjxzcGFuIGNsYXNzPSdhbm5vdGF0aW9uLW1lc3NhZ2UnPiIsICI8L3NwYW4+PHNwYW4gY2xhc3M9J2Fubm90YXRpb24tbWVzc2FnZSc+IiwgIjwvc3Bhbj4iKSA/PgotICAgICAgICAgICAgICA8P2NzIC9lYWNoID8+PC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgICA8P2NzIHNldDpjb3VudCA9IGNvdW50ICsgIzEgPz4KLSAgICA8P2NzIC9lYWNoID8+Ci08P2NzIC9kZWYgPz4KLQotPD9jcyBkZWY6d3JpdGVfY29uc3RhbnRfc3VtbWFyeShmaWVsZHMsIGluY2x1ZGVkKSA/PgotPD9jcyBzZXQ6Y291bnQgPSAjMSA/PgotICAgIDw/Y3MgZWFjaDpmaWVsZD1maWVsZHMgPz4KLSAgICA8dHIgY2xhc3M9Ijw/Y3MgaWY6Y291bnQgJSAjMiA/PmFsdC1jb2xvcjw/Y3MgL2lmID8+IGFwaSBhcGlsZXZlbC08P2NzIHZhcjpmaWVsZC5zaW5jZSA/PiIgPgotICAgICAgICA8dGQgY2xhc3M9ImpkLXR5cGVjb2wiPjw/Y3MgY2FsbDp0eXBlX2xpbmsoZmllbGQudHlwZSkgPz48L3RkPgotICAgICAgICA8dGQgY2xhc3M9ImpkLWxpbmtjb2wiPjw/Y3MgY2FsbDpjb25kX2xpbmsoZmllbGQubmFtZSwgdG9yb290LCBmaWVsZC5ocmVmLCBpbmNsdWRlZCkgPz48L3RkPgotICAgICAgICA8dGQgY2xhc3M9ImpkLWRlc2NyY29sIiB3aWR0aD0iMTAwJSI+PD9jcyBjYWxsOnNob3J0X2Rlc2NyKGZpZWxkKSA/PjwvdGQ+Ci0gICAgPC90cj4KLSAgICA8P2NzIHNldDpjb3VudCA9IGNvdW50ICsgIzEgPz4KLSAgICA8P2NzIC9lYWNoID8+Ci08P2NzIC9kZWYgPz4KLQotPD9jcyBkZWY6d3JpdGVfYXR0cl9zdW1tYXJ5KGF0dHJzLCBpbmNsdWRlZCkgPz4KLTw/Y3Mgc2V0OmNvdW50ID0gIzEgPz4KLSAgICA8dHI+Ci0gICAgICAgIDx0ZD48bm9icj48ZW0+QXR0cmlidXRlIE5hbWU8L2VtPjwvbm9icj48L3RkPgotICAgICAgICA8dGQ+PG5vYnI+PGVtPlJlbGF0ZWQgTWV0aG9kPC9lbT48L25vYnI+PC90ZD4KLSAgICAgICAgPHRkPjxub2JyPjxlbT5EZXNjcmlwdGlvbjwvZW0+PC9ub2JyPjwvdGQ+Ci0gICAgPC90cj4KLSAgICA8P2NzIGVhY2g6YXR0cj1hdHRycyA/PgotICAgIDx0ciBjbGFzcz0iPD9jcyBpZjpjb3VudCAlICMyID8+YWx0LWNvbG9yPD9jcyAvaWYgPz4gYXBpIGFwaWxldmVsLTw/Y3MgdmFyOmF0dHIuc2luY2UgPz4iID4KLSAgICAgICAgPHRkIGNsYXNzPSJqZC1saW5rY29sIj48P2NzIGlmOmluY2x1ZGVkID8+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+PD9jcyB2YXI6YXR0ci5ocmVmID8+Ij48P2NzIC9pZiA/Pjw/Y3MgdmFyOmF0dHIubmFtZSA/Pjw/Y3MgaWY6aW5jbHVkZWQgPz48L2E+PD9jcyAvaWYgPz48L3RkPgotICAgICAgICA8dGQgY2xhc3M9ImpkLWxpbmtjb2wiPjw/Y3MgZWFjaDptPWF0dHIubWV0aG9kcyA/PgotICAgICAgICAgICAgPD9jcyBjYWxsOmNvbmRfbGluayhtLm5hbWUsIHRvcm9vdCwgbS5ocmVmLCBpbmNsdWRlZCkgPz4KLSAgICAgICAgICAgIDw/Y3MgL2VhY2ggPz4KLSAgICAgICAgPC90ZD4KLSAgICAgICAgPHRkIGNsYXNzPSJqZC1kZXNjcmNvbCIgd2lkdGg9IjEwMCUiPjw/Y3MgY2FsbDpzaG9ydF9kZXNjcihhdHRyKSA/PiZuYnNwOzwvdGQ+Ci0gICAgPC90cj4KLSAgICA8P2NzIHNldDpjb3VudCA9IGNvdW50ICsgIzEgPz4KLSAgICA8P2NzIC9lYWNoID8+Ci08P2NzIC9kZWYgPz4KLQotPD9jcyBkZWY6d3JpdGVfaW5uZXJzX3N1bW1hcnkoY2xhc3NlcykgPz4KLTw/Y3Mgc2V0OmNvdW50ID0gIzEgPz4KLSAgPD9jcyBlYWNoOmNsPWNsYXNzLmlubmVycyA/PgotICAgIDx0ciBjbGFzcz0iPD9jcyBpZjpjb3VudCAlICMyID8+YWx0LWNvbG9yPD9jcyAvaWYgPz4gYXBpIGFwaWxldmVsLTw/Y3MgdmFyOmNsLnNpbmNlID8+IiA+Ci0gICAgICA8dGQgY2xhc3M9ImpkLXR5cGVjb2wiPjxub2JyPgotICAgICAgICA8P2NzIHZhcjpjbC5zY29wZSA/PgotICAgICAgICA8P2NzIHZhcjpjbC5zdGF0aWMgPz4gCi0gICAgICAgIDw/Y3MgdmFyOmNsLmZpbmFsID8+IAotICAgICAgICA8P2NzIHZhcjpjbC5hYnN0cmFjdCA/PgotICAgICAgICA8P2NzIHZhcjpjbC5raW5kID8+PC9ub2JyPjwvdGQ+Ci0gICAgICA8dGQgY2xhc3M9ImpkLWxpbmtjb2wiPjw/Y3MgY2FsbDp0eXBlX2xpbmsoY2wudHlwZSkgPz48L3RkPgotICAgICAgPHRkIGNsYXNzPSJqZC1kZXNjcmNvbCIgd2lkdGg9IjEwMCUiPjw/Y3MgY2FsbDpzaG9ydF9kZXNjcihjbCkgPz4mbmJzcDs8L3RkPgotICAgIDwvdHI+Ci0gICAgPD9jcyBzZXQ6Y291bnQgPSBjb3VudCArICMxID8+Ci0gICAgPD9jcyAvZWFjaCA/PgotPD9jcyAvZGVmID8+Ci0KLTw/Y3MgIyBlbmQgbWFjcm9zID8+Ci0KLTxkaXYgY2xhc3M9ImpkLWRlc2NyIj4KLTw/Y3MgIyBtYWtlIHN1cmUgdGhlcmUncyBhIHN1bW1hcnkgdmlldyB0byBkaXNwbGF5ID8+Ci08P2NzIGlmOnN1YmNvdW50KGNsYXNzLmlubmVycykKLSAgICAgfHwgc3ViY291bnQoY2xhc3MuYXR0cnMpCi0gICAgIHx8IGluaGF0dHJzCi0gICAgIHx8IHN1YmNvdW50KGNsYXNzLmVudW1Db25zdGFudHMpCi0gICAgIHx8IHN1YmNvdW50KGNsYXNzLmNvbnN0YW50cykKLSAgICAgfHwgaW5oY29uc3RhbnRzCi0gICAgIHx8IHN1YmNvdW50KGNsYXNzLmZpZWxkcykKLSAgICAgfHwgaW5oZmllbGRzCi0gICAgIHx8IHN1YmNvdW50KGNsYXNzLmN0b3JzLnB1YmxpYykKLSAgICAgfHwgc3ViY291bnQoY2xhc3MuY3RvcnMucHJvdGVjdGVkKQotICAgICB8fCBzdWJjb3VudChjbGFzcy5tZXRob2RzLnB1YmxpYykKLSAgICAgfHwgc3ViY291bnQoY2xhc3MubWV0aG9kcy5wcm90ZWN0ZWQpCi0gICAgIHx8IGluaG1ldGhvZHMgPz4KLTxoMj5TdW1tYXJ5PC9oMj4KLQotPD9jcyBpZjpzdWJjb3VudChjbGFzcy5pbm5lcnMpID8+Ci08P2NzICMgdGhpcyBuZXh0IGxpbmUgbXVzdCBiZSBleGFjdGx5IGxpa2UgdGhpcyB0byBiZSBwYXJzZWQgYnkgZWNsaXBzZSA/PgotPCEtLSA9PT09PT09PSBORVNURUQgQ0xBU1MgU1VNTUFSWSA9PT09PT09PSAtLT4KLTx0YWJsZSBpZD0ibmVzdGVkY2xhc3NlcyIgY2xhc3M9ImpkLXN1bXRhYmxlIj48dHI+PHRoIGNvbHNwYW49IjEyIj5OZXN0ZWQgQ2xhc3NlczwvdGg+PC90cj4KLTw/Y3MgY2FsbDp3cml0ZV9pbm5lcnNfc3VtbWFyeShjbGFzcy5pbm5lcnMpID8+Ci08P2NzIC9pZiA/PgotCi08P2NzICMgdGhpcyBuZXh0IGxpbmUgbXVzdCBiZSBleGFjdGx5IGxpa2UgdGhpcyB0byBiZSBwYXJzZWQgYnkgZWNsaXBzZSA/PgotPD9jcyBpZjpzdWJjb3VudChjbGFzcy5hdHRycykgPz4KLTwhLS0gPT09PT09PT09PT0gRklFTEQgU1VNTUFSWSA9PT09PT09PT09PSAtLT4KLTx0YWJsZSBpZD0ibGF0dHJzIiBjbGFzcz0iamQtc3VtdGFibGUiPjx0cj48dGggY29sc3Bhbj0iMTIiPlhNTCBBdHRyaWJ1dGVzPC90aD48L3RyPgotPD9jcyBjYWxsOndyaXRlX2F0dHJfc3VtbWFyeShjbGFzcy5hdHRycywgMSkgPz4KLTw/Y3MgL2lmID8+Ci0KLTw/Y3MgIyBpZiB0aGVyZSBhcmUgaW5oZXJpdGVkIGF0dHJzLCB3cml0ZSB0aGUgdGFibGUgPz4KLTw/Y3MgaWY6aW5oYXR0cnMgPz4KLTw/Y3MgIyB0aGlzIG5leHQgbGluZSBtdXN0IGJlIGV4YWN0bHkgbGlrZSB0aGlzIHRvIGJlIHBhcnNlZCBieSBlY2xpcHNlID8+Ci08IS0tID09PT09PT09PT09IEZJRUxEIFNVTU1BUlkgPT09PT09PT09PT0gLS0+Ci08dGFibGUgaWQ9ImluaGF0dHJzIiBjbGFzcz0iamQtc3VtdGFibGUiPjx0cj48dGg+Ci0gIDxhIGhyZWY9IiMiIGNsYXNzPSJ0b2dnbGUtYWxsIiBvbmNsaWNrPSJyZXR1cm4gdG9nZ2xlQWxsSW5oZXJpdGVkKHRoaXMsIG51bGwpIj5bRXhwYW5kXTwvYT4KLSAgPGRpdiBzdHlsZT0iY2xlYXI6bGVmdDsiPkluaGVyaXRlZCBYTUwgQXR0cmlidXRlczwvZGl2PjwvdGg+PC90cj4KLTw/Y3MgZWFjaDpjbD1jbGFzcy5pbmhlcml0ZWQgPz4KLTw/Y3MgaWY6c3ViY291bnQoY2wuYXR0cnMpID8+Ci08dHIgY2xhc3M9ImFwaSBhcGlsZXZlbC08P2NzIHZhcjpjbC5zaW5jZSA/PiIgPgotPHRkIGNvbHNwYW49IjEyIj4KLTw/Y3MgY2FsbDpleHBhbmRvX3RyaWdnZXIoImluaGVyaXRlZC1hdHRycy0iK2NsLnF1YWxpZmllZCwgImNsb3NlZCIpID8+RnJvbSA8P2NzIHZhcjpjbC5raW5kID8+Ci08P2NzIGNhbGw6Y29uZF9saW5rKGNsLnF1YWxpZmllZCwgdG9yb290LCBjbC5saW5rLCBjbC5pbmNsdWRlZCkgPz4KLTxkaXYgaWQ9ImluaGVyaXRlZC1hdHRycy08P2NzIHZhcjpjbC5xdWFsaWZpZWQgPz4iPgotICA8ZGl2IGlkPSJpbmhlcml0ZWQtYXR0cnMtPD9jcyB2YXI6Y2wucXVhbGlmaWVkID8+LWxpc3QiCi0gICAgICAgIGNsYXNzPSJqZC1pbmhlcml0ZWRsaW5rcyI+Ci0gIDwvZGl2PgotICA8ZGl2IGlkPSJpbmhlcml0ZWQtYXR0cnMtPD9jcyB2YXI6Y2wucXVhbGlmaWVkID8+LXN1bW1hcnkiIHN0eWxlPSJkaXNwbGF5OiBub25lOyI+Ci0gICAgPHRhYmxlIGNsYXNzPSJqZC1zdW10YWJsZS1leHBhbmRvIj4KLSAgICA8P2NzIGNhbGw6d3JpdGVfYXR0cl9zdW1tYXJ5KGNsLmF0dHJzLCBjbC5pbmNsdWRlZCkgPz48L3RhYmxlPgotICA8L2Rpdj4KLTwvZGl2PgotPC90ZD48L3RyPgotPD9jcyAvaWYgPz4KLTw/Y3MgL2VhY2ggPz4KLTwvdGFibGU+Ci08P2NzIC9pZiA/PgotCi08P2NzIGlmOnN1YmNvdW50KGNsYXNzLmVudW1Db25zdGFudHMpID8+Ci08P2NzICMgdGhpcyBuZXh0IGxpbmUgbXVzdCBiZSBleGFjdGx5IGxpa2UgdGhpcyB0byBiZSBwYXJzZWQgYnkgZWNsaXBzZSA/PgotPCEtLSA9PT09PT09PT09PSBFTlVNIENPTlNUQU5UIFNVTU1BUlkgPT09PT09PT09PT0gLS0+Ci08dGFibGUgaWQ9ImVudW1jb25zdGFudHMiIGNsYXNzPSJqZC1zdW10YWJsZSI+PHRyPjx0aCBjb2xzcGFuPSIxMiI+RW51bSBWYWx1ZXM8L3RoPjwvdHI+Ci08P2NzIHNldDpjb3VudCA9ICMxID8+Ci0gICAgPD9jcyBlYWNoOmZpZWxkPWNsYXNzLmVudW1Db25zdGFudHMgPz4KLSAgICA8dHIgY2xhc3M9Ijw/Y3MgaWY6Y291bnQgJSAjMiA/PmFsdC1jb2xvcjw/Y3MgL2lmID8+IGFwaSBhcGlsZXZlbC08P2NzIHZhcjpmaWVsZC5zaW5jZSA/PiIgPgotICAgICAgICA8dGQgY2xhc3M9ImpkLWRlc2NyY29sIj48P2NzIGNhbGw6dHlwZV9saW5rKGZpZWxkLnR5cGUpID8+Jm5ic3A7PC90ZD4KLSAgICAgICAgPHRkIGNsYXNzPSJqZC1saW5rY29sIj48P2NzIGNhbGw6Y29uZF9saW5rKGZpZWxkLm5hbWUsIHRvcm9vdCwgZmllbGQuaHJlZiwgY2wuaW5jbHVkZWQpID8+Jm5ic3A7PC90ZD4KLSAgICAgICAgPHRkIGNsYXNzPSJqZC1kZXNjcmNvbCIgd2lkdGg9IjEwMCUiPjw/Y3MgY2FsbDpzaG9ydF9kZXNjcihmaWVsZCkgPz4mbmJzcDs8L3RkPgotICAgIDwvdHI+Ci0gICAgPD9jcyBzZXQ6Y291bnQgPSBjb3VudCArICMxID8+Ci0gICAgPD9jcyAvZWFjaCA/PgotPD9jcyAvaWYgPz4KLQotPD9jcyBpZjpzdWJjb3VudChjbGFzcy5jb25zdGFudHMpID8+Ci08P2NzICMgdGhpcyBuZXh0IGxpbmUgbXVzdCBiZSBleGFjdGx5IGxpa2UgdGhpcyB0byBiZSBwYXJzZWQgYnkgZWNsaXBzZSA/PgotPCEtLSA9PT09PT09PT09PSBFTlVNIENPTlNUQU5UIFNVTU1BUlkgPT09PT09PT09PT0gLS0+Ci08dGFibGUgaWQ9ImNvbnN0YW50cyIgY2xhc3M9ImpkLXN1bXRhYmxlIj48dHI+PHRoIGNvbHNwYW49IjEyIj5Db25zdGFudHM8L3RoPjwvdHI+Ci08P2NzIGNhbGw6d3JpdGVfY29uc3RhbnRfc3VtbWFyeShjbGFzcy5jb25zdGFudHMsIDEpID8+Ci08L3RhYmxlPgotPD9jcyAvaWYgPz4KLQotPD9jcyAjIGlmIHRoZXJlIGFyZSBpbmhlcml0ZWQgY29uc3RhbnRzLCB3cml0ZSB0aGUgdGFibGUgPz4KLTw/Y3MgaWY6aW5oY29uc3RhbnRzID8+Ci08P2NzICMgdGhpcyBuZXh0IGxpbmUgbXVzdCBiZSBleGFjdGx5IGxpa2UgdGhpcyB0byBiZSBwYXJzZWQgYnkgZWNsaXBzZSA/PgotPCEtLSA9PT09PT09PT09PSBFTlVNIENPTlNUQU5UIFNVTU1BUlkgPT09PT09PT09PT0gLS0+Ci08dGFibGUgaWQ9ImluaGNvbnN0YW50cyIgY2xhc3M9ImpkLXN1bXRhYmxlIj48dHI+PHRoPgotICA8YSBocmVmPSIjIiBjbGFzcz0idG9nZ2xlLWFsbCIgb25jbGljaz0icmV0dXJuIHRvZ2dsZUFsbEluaGVyaXRlZCh0aGlzLCBudWxsKSI+W0V4cGFuZF08L2E+Ci0gIDxkaXYgc3R5bGU9ImNsZWFyOmxlZnQ7Ij5Jbmhlcml0ZWQgQ29uc3RhbnRzPC9kaXY+PC90aD48L3RyPgotPD9jcyBlYWNoOmNsPWNsYXNzLmluaGVyaXRlZCA/PgotPD9jcyBpZjpzdWJjb3VudChjbC5jb25zdGFudHMpID8+Ci08dHIgY2xhc3M9ImFwaSBhcGlsZXZlbC08P2NzIHZhcjpjbC5zaW5jZSA/PiIgPgotPHRkIGNvbHNwYW49IjEyIj4KLTw/Y3MgY2FsbDpleHBhbmRvX3RyaWdnZXIoImluaGVyaXRlZC1jb25zdGFudHMtIitjbC5xdWFsaWZpZWQsICJjbG9zZWQiKSA/PkZyb20gPD9jcyB2YXI6Y2wua2luZCA/PgotPD9jcyBjYWxsOmNvbmRfbGluayhjbC5xdWFsaWZpZWQsIHRvcm9vdCwgY2wubGluaywgY2wuaW5jbHVkZWQpID8+Ci08ZGl2IGlkPSJpbmhlcml0ZWQtY29uc3RhbnRzLTw/Y3MgdmFyOmNsLnF1YWxpZmllZCA/PiI+Ci0gIDxkaXYgaWQ9ImluaGVyaXRlZC1jb25zdGFudHMtPD9jcyB2YXI6Y2wucXVhbGlmaWVkID8+LWxpc3QiCi0gICAgICAgIGNsYXNzPSJqZC1pbmhlcml0ZWRsaW5rcyI+Ci0gIDwvZGl2PgotICA8ZGl2IGlkPSJpbmhlcml0ZWQtY29uc3RhbnRzLTw/Y3MgdmFyOmNsLnF1YWxpZmllZCA/Pi1zdW1tYXJ5IiBzdHlsZT0iZGlzcGxheTogbm9uZTsiPgotICAgIDx0YWJsZSBjbGFzcz0iamQtc3VtdGFibGUtZXhwYW5kbyI+Ci0gICAgPD9jcyBjYWxsOndyaXRlX2NvbnN0YW50X3N1bW1hcnkoY2wuY29uc3RhbnRzLCBjbC5pbmNsdWRlZCkgPz48L3RhYmxlPgotICA8L2Rpdj4KLTwvZGl2PgotPC90ZD48L3RyPgotPD9jcyAvaWYgPz4KLTw/Y3MgL2VhY2ggPz4KLTwvdGFibGU+Ci08P2NzIC9pZiA/PgotCi08P2NzIGlmOnN1YmNvdW50KGNsYXNzLmZpZWxkcykgPz4KLTw/Y3MgIyB0aGlzIG5leHQgbGluZSBtdXN0IGJlIGV4YWN0bHkgbGlrZSB0aGlzIHRvIGJlIHBhcnNlZCBieSBlY2xpcHNlID8+Ci08IS0tID09PT09PT09PT09IEZJRUxEIFNVTU1BUlkgPT09PT09PT09PT0gLS0+Ci08dGFibGUgaWQ9ImxmaWVsZHMiIGNsYXNzPSJqZC1zdW10YWJsZSI+PHRyPjx0aCBjb2xzcGFuPSIxMiI+RmllbGRzPC90aD48L3RyPgotPD9jcyBjYWxsOndyaXRlX2ZpZWxkX3N1bW1hcnkoY2xhc3MuZmllbGRzLCAxKSA/PgotPC90YWJsZT4KLTw/Y3MgL2lmID8+Ci0KLTw/Y3MgIyBpZiB0aGVyZSBhcmUgaW5oZXJpdGVkIGZpZWxkcywgd3JpdGUgdGhlIHRhYmxlID8+Ci08P2NzIGlmOmluaGZpZWxkcyA/PgotPD9jcyAjIHRoaXMgbmV4dCBsaW5lIG11c3QgYmUgZXhhY3RseSBsaWtlIHRoaXMgdG8gYmUgcGFyc2VkIGJ5IGVjbGlwc2UgPz4KLTwhLS0gPT09PT09PT09PT0gRklFTEQgU1VNTUFSWSA9PT09PT09PT09PSAtLT4KLTx0YWJsZSBpZD0iaW5oZmllbGRzIiBjbGFzcz0iamQtc3VtdGFibGUiPjx0cj48dGg+Ci0gIDxhIGhyZWY9IiMiIGNsYXNzPSJ0b2dnbGUtYWxsIiBvbmNsaWNrPSJyZXR1cm4gdG9nZ2xlQWxsSW5oZXJpdGVkKHRoaXMsIG51bGwpIj5bRXhwYW5kXTwvYT4KLSAgPGRpdiBzdHlsZT0iY2xlYXI6bGVmdDsiPkluaGVyaXRlZCBGaWVsZHM8L2Rpdj48L3RoPjwvdHI+Ci08P2NzIGVhY2g6Y2w9Y2xhc3MuaW5oZXJpdGVkID8+Ci08P2NzIGlmOnN1YmNvdW50KGNsLmZpZWxkcykgPz4KLTx0ciBjbGFzcz0iYXBpIGFwaWxldmVsLTw/Y3MgdmFyOmNsLnNpbmNlID8+IiA+Ci08dGQgY29sc3Bhbj0iMTIiPgotPD9jcyBjYWxsOmV4cGFuZG9fdHJpZ2dlcigiaW5oZXJpdGVkLWZpZWxkcy0iK2NsLnF1YWxpZmllZCwgImNsb3NlZCIpID8+RnJvbSA8P2NzIHZhcjpjbC5raW5kID8+Ci08P2NzIGNhbGw6Y29uZF9saW5rKGNsLnF1YWxpZmllZCwgdG9yb290LCBjbC5saW5rLCBjbC5pbmNsdWRlZCkgPz4KLTxkaXYgaWQ9ImluaGVyaXRlZC1maWVsZHMtPD9jcyB2YXI6Y2wucXVhbGlmaWVkID8+Ij4KLSAgPGRpdiBpZD0iaW5oZXJpdGVkLWZpZWxkcy08P2NzIHZhcjpjbC5xdWFsaWZpZWQgPz4tbGlzdCIKLSAgICAgICAgY2xhc3M9ImpkLWluaGVyaXRlZGxpbmtzIj4KLSAgPC9kaXY+Ci0gIDxkaXYgaWQ9ImluaGVyaXRlZC1maWVsZHMtPD9jcyB2YXI6Y2wucXVhbGlmaWVkID8+LXN1bW1hcnkiIHN0eWxlPSJkaXNwbGF5OiBub25lOyI+Ci0gICAgPHRhYmxlIGNsYXNzPSJqZC1zdW10YWJsZS1leHBhbmRvIj4KLSAgICA8P2NzIGNhbGw6d3JpdGVfZmllbGRfc3VtbWFyeShjbC5maWVsZHMsIGNsLmluY2x1ZGVkKSA/PjwvdGFibGU+Ci0gIDwvZGl2PgotPC9kaXY+Ci08L3RkPjwvdHI+Ci08P2NzIC9pZiA/PgotPD9jcyAvZWFjaCA/PgotPC90YWJsZT4KLTw/Y3MgL2lmID8+Ci0KLTw/Y3MgaWY6c3ViY291bnQoY2xhc3MuY3RvcnMucHVibGljKSA/PgotPD9jcyAjIHRoaXMgbmV4dCBsaW5lIG11c3QgYmUgZXhhY3RseSBsaWtlIHRoaXMgdG8gYmUgcGFyc2VkIGJ5IGVjbGlwc2UgPz4KLTwhLS0gPT09PT09PT0gQ09OU1RSVUNUT1IgU1VNTUFSWSA9PT09PT09PSAtLT4KLTx0YWJsZSBpZD0icHViY3RvcnMiIGNsYXNzPSJqZC1zdW10YWJsZSI+PHRyPjx0aCBjb2xzcGFuPSIxMiI+UHVibGljIENvbnN0cnVjdG9yczwvdGg+PC90cj4KLTw/Y3MgY2FsbDp3cml0ZV9tZXRob2Rfc3VtbWFyeShjbGFzcy5jdG9ycy5wdWJsaWMsIDEpID8+Ci08L3RhYmxlPgotPD9jcyAvaWYgPz4KLQotPD9jcyBpZjpzdWJjb3VudChjbGFzcy5jdG9ycy5wcm90ZWN0ZWQpID8+Ci08P2NzICMgdGhpcyBuZXh0IGxpbmUgbXVzdCBiZSBleGFjdGx5IGxpa2UgdGhpcyB0byBiZSBwYXJzZWQgYnkgZWNsaXBzZSA/PgotPCEtLSA9PT09PT09PSBDT05TVFJVQ1RPUiBTVU1NQVJZID09PT09PT09IC0tPgotPHRhYmxlIGlkPSJwcm9jdG9ycyIgY2xhc3M9ImpkLXN1bXRhYmxlIj48dHI+PHRoIGNvbHNwYW49IjEyIj5Qcm90ZWN0ZWQgQ29uc3RydWN0b3JzPC90aD48L3RyPgotPD9jcyBjYWxsOndyaXRlX21ldGhvZF9zdW1tYXJ5KGNsYXNzLmN0b3JzLnByb3RlY3RlZCwgMSkgPz4KLTwvdGFibGU+Ci08P2NzIC9pZiA/PgotCi08P2NzIGlmOnN1YmNvdW50KGNsYXNzLm1ldGhvZHMucHVibGljKSA/PgotPD9jcyAjIHRoaXMgbmV4dCBsaW5lIG11c3QgYmUgZXhhY3RseSBsaWtlIHRoaXMgdG8gYmUgcGFyc2VkIGJ5IGVjbGlwc2UgPz4KLTwhLS0gPT09PT09PT09PSBNRVRIT0QgU1VNTUFSWSA9PT09PT09PT09PSAtLT4KLTx0YWJsZSBpZD0icHVibWV0aG9kcyIgY2xhc3M9ImpkLXN1bXRhYmxlIj48dHI+PHRoIGNvbHNwYW49IjEyIj5QdWJsaWMgTWV0aG9kczwvdGg+PC90cj4KLTw/Y3MgY2FsbDp3cml0ZV9tZXRob2Rfc3VtbWFyeShjbGFzcy5tZXRob2RzLnB1YmxpYywgMSkgPz4KLTwvdGFibGU+Ci08P2NzIC9pZiA/PgotCi08P2NzIGlmOnN1YmNvdW50KGNsYXNzLm1ldGhvZHMucHJvdGVjdGVkKSA/PgotPD9jcyAjIHRoaXMgbmV4dCBsaW5lIG11c3QgYmUgZXhhY3RseSBsaWtlIHRoaXMgdG8gYmUgcGFyc2VkIGJ5IGVjbGlwc2UgPz4KLTwhLS0gPT09PT09PT09PSBNRVRIT0QgU1VNTUFSWSA9PT09PT09PT09PSAtLT4KLTx0YWJsZSBpZD0icHJvbWV0aG9kcyIgY2xhc3M9ImpkLXN1bXRhYmxlIj48dHI+PHRoIGNvbHNwYW49IjEyIj5Qcm90ZWN0ZWQgTWV0aG9kczwvdGg+PC90cj4KLTw/Y3MgY2FsbDp3cml0ZV9tZXRob2Rfc3VtbWFyeShjbGFzcy5tZXRob2RzLnByb3RlY3RlZCwgMSkgPz4KLTwvdGFibGU+Ci08P2NzIC9pZiA/PgotCi08P2NzICMgaWYgdGhlcmUgYXJlIGluaGVyaXRlZCBtZXRob2RzLCB3cml0ZSB0aGUgdGFibGUgPz4KLTw/Y3MgaWY6aW5obWV0aG9kcyA/PgotPD9jcyAjIHRoaXMgbmV4dCBsaW5lIG11c3QgYmUgZXhhY3RseSBsaWtlIHRoaXMgdG8gYmUgcGFyc2VkIGJ5IGVjbGlwc2UgPz4KLTwhLS0gPT09PT09PT09PSBNRVRIT0QgU1VNTUFSWSA9PT09PT09PT09PSAtLT4KLTx0YWJsZSBpZD0iaW5obWV0aG9kcyIgY2xhc3M9ImpkLXN1bXRhYmxlIj48dHI+PHRoPgotICA8YSBocmVmPSIjIiBjbGFzcz0idG9nZ2xlLWFsbCIgb25jbGljaz0icmV0dXJuIHRvZ2dsZUFsbEluaGVyaXRlZCh0aGlzLCBudWxsKSI+W0V4cGFuZF08L2E+Ci0gIDxkaXYgc3R5bGU9ImNsZWFyOmxlZnQ7Ij5Jbmhlcml0ZWQgTWV0aG9kczwvZGl2PjwvdGg+PC90cj4KLTw/Y3MgZWFjaDpjbD1jbGFzcy5pbmhlcml0ZWQgPz4KLTw/Y3MgaWY6c3ViY291bnQoY2wubWV0aG9kcykgPz4KLTx0ciBjbGFzcz0iYXBpIGFwaWxldmVsLTw/Y3MgdmFyOmNsLnNpbmNlID8+IiA+Ci08dGQgY29sc3Bhbj0iMTIiPjw/Y3MgY2FsbDpleHBhbmRvX3RyaWdnZXIoImluaGVyaXRlZC1tZXRob2RzLSIrY2wucXVhbGlmaWVkLCAiY2xvc2VkIikgPz4KLUZyb20gPD9jcyB2YXI6Y2wua2luZCA/PgotPD9jcyBpZjpjbC5pbmNsdWRlZCA/PgotICA8YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz48P2NzIHZhcjpjbC5saW5rID8+Ij48P2NzIHZhcjpjbC5xdWFsaWZpZWQgPz48L2E+Ci08P2NzIGVsaWY6Y2wuZmVkZXJhdGVkID8+Ci0gIDxhIGhyZWY9Ijw/Y3MgdmFyOmNsLmxpbmsgPz4iPjw/Y3MgdmFyOmNsLnF1YWxpZmllZCA/PjwvYT4KLTw/Y3MgZWxzZSA/PgotICA8P2NzIHZhcjpjbC5xdWFsaWZpZWQgPz4KLTw/Y3MgL2lmID8+Ci08ZGl2IGlkPSJpbmhlcml0ZWQtbWV0aG9kcy08P2NzIHZhcjpjbC5xdWFsaWZpZWQgPz4iPgotICA8ZGl2IGlkPSJpbmhlcml0ZWQtbWV0aG9kcy08P2NzIHZhcjpjbC5xdWFsaWZpZWQgPz4tbGlzdCIKLSAgICAgICAgY2xhc3M9ImpkLWluaGVyaXRlZGxpbmtzIj4KLSAgPC9kaXY+Ci0gIDxkaXYgaWQ9ImluaGVyaXRlZC1tZXRob2RzLTw/Y3MgdmFyOmNsLnF1YWxpZmllZCA/Pi1zdW1tYXJ5IiBzdHlsZT0iZGlzcGxheTogbm9uZTsiPgotICAgIDx0YWJsZSBjbGFzcz0iamQtc3VtdGFibGUtZXhwYW5kbyI+Ci0gICAgPD9jcyBjYWxsOndyaXRlX21ldGhvZF9zdW1tYXJ5KGNsLm1ldGhvZHMsIGNsLmluY2x1ZGVkKSA/PjwvdGFibGU+Ci0gIDwvZGl2PgotPC9kaXY+Ci08L3RkPjwvdHI+Ci08P2NzIC9pZiA/PgotPD9jcyAvZWFjaCA/PgotPC90YWJsZT4KLTw/Y3MgL2lmID8+Ci08P2NzIC9pZiA/PgotPC9kaXY+PCEtLSBqZC1kZXNjciAoc3VtbWFyeSkgLS0+Ci0KLTwhLS0gRGV0YWlscyAtLT4KLQotPD9jcyBkZWY6d3JpdGVfZmllbGRfZGV0YWlscyhmaWVsZHMpID8+Ci08P2NzIGVhY2g6ZmllbGQ9ZmllbGRzID8+Ci08P2NzICMgdGhpcyBuZXh0IGxpbmUgbXVzdCBiZSBleGFjdGx5IGxpa2UgdGhpcyB0byBiZSBwYXJzZWQgYnkgZWNsaXBzZSA/PgotPD9jcyAjIHRoZSBBIHRhZyBpbiB0aGUgbmV4dCBsaW5lIG11c3QgcmVtYWluIHdoZXJlIGl0IGlzLCBzbyB0aGF0IEVjbGlwc2UgY2FuIHBhcnNlIHRoZSBkb2NzID8+Ci08QSBOQU1FPSI8P2NzIHZhcjpmaWVsZC5hbmNob3IgPz4iPjwvQT4KLTw/Y3MgIyBUaGUgYXBpbGV2ZWwtTiBjbGFzcyBNVVNUIEJFIExBU1QgaW4gdGhlIHNlcXVlbmNlIG9mIGNsYXNzIG5hbWVzID8+Ci08ZGl2IGNsYXNzPSJqZC1kZXRhaWxzIGFwaSBhcGlsZXZlbC08P2NzIHZhcjpmaWVsZC5zaW5jZSA/PiI+IAotICAgIDxoNCBjbGFzcz0iamQtZGV0YWlscy10aXRsZSI+Ci0gICAgICA8c3BhbiBjbGFzcz0ibm9ybWFsIj4KLSAgICAgICAgPD9jcyB2YXI6ZmllbGQuc2NvcGUgPz4gCi0gICAgICAgIDw/Y3MgdmFyOmZpZWxkLnN0YXRpYyA/PiAKLSAgICAgICAgPD9jcyB2YXI6ZmllbGQuZmluYWwgPz4gCi0gICAgICAgIDw/Y3MgY2FsbDp0eXBlX2xpbmsoZmllbGQudHlwZSkgPz4KLSAgICAgIDwvc3Bhbj4KLSAgICAgICAgPD9jcyB2YXI6ZmllbGQubmFtZSA/PgotICAgIDwvaDQ+Ci0gICAgICA8ZGl2IGNsYXNzPSJhcGktbGV2ZWwiPgotICAgICAgICA8P2NzIGNhbGw6c2luY2VfdGFncyhmaWVsZCkgPz4KLSAgICAgICAgPD9jcyBjYWxsOmZlZGVyYXRlZF9yZWZzKGZpZWxkKSA/PgotICAgICAgPC9kaXY+Ci0gICAgPGRpdiBjbGFzcz0iamQtZGV0YWlscy1kZXNjciI+Ci0gICAgICA8P2NzIGNhbGw6ZGVzY3JpcHRpb24oZmllbGQpID8+Ci0gICAgPD9jcyBpZjpzdWJjb3VudChmaWVsZC5jb25zdGFudFZhbHVlKSA/PgotICAgICAgICA8ZGl2IGNsYXNzPSJqZC10YWdkYXRhIj4KLSAgICAgICAgPHNwYW4gY2xhc3M9ImpkLXRhZ3RpdGxlIj5Db25zdGFudCBWYWx1ZTogPC9zcGFuPgotICAgICAgICA8c3Bhbj4KLSAgICAgICAgICAgIDw/Y3MgaWY6ZmllbGQuY29uc3RhbnRWYWx1ZS5pc1N0cmluZyA/PgotICAgICAgICAgICAgICAgIDw/Y3MgdmFyOmZpZWxkLmNvbnN0YW50VmFsdWUuc3RyID8+Ci0gICAgICAgICAgICA8P2NzIGVsc2UgPz4KLSAgICAgICAgICAgICAgICA8P2NzIHZhcjpmaWVsZC5jb25zdGFudFZhbHVlLmRlYyA/PgotICAgICAgICAgICAgICAgICg8P2NzIHZhcjpmaWVsZC5jb25zdGFudFZhbHVlLmhleCA/PikKLSAgICAgICAgICAgIDw/Y3MgL2lmID8+Ci0gICAgICAgIDwvc3Bhbj4KLSAgICAgICAgPC9kaXY+Ci0gICAgPD9jcyAvaWYgPz4KLSAgICA8L2Rpdj4KLTwvZGl2PgotPD9jcyAvZWFjaCA/PgotPD9jcyAvZGVmID8+Ci0KLTw/Y3MgZGVmOndyaXRlX21ldGhvZF9kZXRhaWxzKG1ldGhvZHMpID8+Ci08P2NzIGVhY2g6bWV0aG9kPW1ldGhvZHMgPz4KLTw/Y3MgIyB0aGUgQSB0YWcgaW4gdGhlIG5leHQgbGluZSBtdXN0IHJlbWFpbiB3aGVyZSBpdCBpcywgc28gdGhhdCBFY2xpcHNlIGNhbiBwYXJzZSB0aGUgZG9jcyA/PgotPEEgTkFNRT0iPD9jcyB2YXI6bWV0aG9kLmFuY2hvciA/PiI+PC9BPgotPD9jcyAjIFRoZSBhcGlsZXZlbC1OIGNsYXNzIE1VU1QgQkUgTEFTVCBpbiB0aGUgc2VxdWVuY2Ugb2YgY2xhc3MgbmFtZXMgPz4KLTxkaXYgY2xhc3M9ImpkLWRldGFpbHMgYXBpIGFwaWxldmVsLTw/Y3MgdmFyOm1ldGhvZC5zaW5jZSA/PiI+IAotICAgIDxoNCBjbGFzcz0iamQtZGV0YWlscy10aXRsZSI+Ci0gICAgICA8c3BhbiBjbGFzcz0ibm9ybWFsIj4KLSAgICAgICAgPD9jcyB2YXI6bWV0aG9kLnNjb3BlID8+Ci0gICAgICAgIDw/Y3MgdmFyOm1ldGhvZC5hYnN0cmFjdCA/PgotICAgICAgICA8P2NzIHZhcjptZXRob2QuZGVmYXVsdCA/PgotICAgICAgICA8P2NzIHZhcjptZXRob2Quc3RhdGljID8+Ci0gICAgICAgIDw/Y3MgdmFyOm1ldGhvZC5maW5hbCA/PgotICAgICAgICA8P2NzIGNhbGw6dHlwZV9saW5rKG1ldGhvZC5yZXR1cm5UeXBlKSA/PgotICAgICAgPC9zcGFuPgotICAgICAgPHNwYW4gY2xhc3M9InN5bXBhZCI+PD9jcyB2YXI6bWV0aG9kLm5hbWUgPz48L3NwYW4+Ci0gICAgICA8c3BhbiBjbGFzcz0ibm9ybWFsIj4oPD9jcyBjYWxsOnBhcmFtZXRlcl9saXN0KG1ldGhvZC5wYXJhbXMpID8+KTwvc3Bhbj4KLSAgICA8L2g0PgotICAgICAgPGRpdiBjbGFzcz0iYXBpLWxldmVsIj4KLSAgICAgICAgPGRpdj48P2NzIGNhbGw6c2luY2VfdGFncyhtZXRob2QpID8+PC9kaXY+Ci0gICAgICAgIDw/Y3MgY2FsbDpmZWRlcmF0ZWRfcmVmcyhtZXRob2QpID8+Ci0gICAgICA8L2Rpdj4KLSAgICA8ZGl2IGNsYXNzPSJqZC1kZXRhaWxzLWRlc2NyIj4KLSAgICAgIDw/Y3MgY2FsbDpkZXNjcmlwdGlvbihtZXRob2QpID8+Ci0gICAgPC9kaXY+Ci08L2Rpdj4KLTw/Y3MgL2VhY2ggPz4KLTw/Y3MgL2RlZiA/PgotCi08P2NzIGRlZjp3cml0ZV9hdHRyX2RldGFpbHMoYXR0cnMpID8+Ci08P2NzIGVhY2g6YXR0cj1hdHRycyA/PgotPD9jcyAjIHRoZSBBIHRhZyBpbiB0aGUgbmV4dCBsaW5lIG11c3QgcmVtYWluIHdoZXJlIGl0IGlzLCBzbyB0aGF0IEVjbGlwc2UgY2FuIHBhcnNlIHRoZSBkb2NzID8+Ci08QSBOQU1FPSI8P2NzIHZhcjphdHRyLmFuY2hvciA/PiI+PC9BPgotPGRpdiBjbGFzcz0iamQtZGV0YWlscyI+IAotICAgIDxoNCBjbGFzcz0iamQtZGV0YWlscy10aXRsZSI+PD9jcyB2YXI6YXR0ci5uYW1lID8+Ci0gICAgPC9oND4KLSAgICA8ZGl2IGNsYXNzPSJqZC1kZXRhaWxzLWRlc2NyIj4KLSAgICAgICAgPD9jcyBjYWxsOmRlc2NyaXB0aW9uKGF0dHIpID8+Ci0KLSAgICAgICAgPGRpdiBjbGFzcz0iamQtdGFnZGF0YSI+Ci0gICAgICAgICAgICA8aDUgY2xhc3M9ImpkLXRhZ3RpdGxlIj5SZWxhdGVkIE1ldGhvZHM8L2g1PgotICAgICAgICAgICAgPHVsIGNsYXNzPSJub2xpc3QiPgotICAgICAgICAgICAgPD9jcyBlYWNoOm09YXR0ci5tZXRob2RzID8+Ci0gICAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/Pjw/Y3MgdmFyOm0uaHJlZiA/PiI+PD9jcyB2YXI6bS5uYW1lID8+PC9hPjwvbGk+Ci0gICAgICAgICAgICA8P2NzIC9lYWNoID8+Ci0gICAgICAgICAgICA8L3VsPgotICAgICAgICA8L2Rpdj4KLSAgICA8L2Rpdj4KLTwvZGl2PgotPD9jcyAvZWFjaCA/PgotPD9jcyAvZGVmID8+Ci0KLQotPCEtLSBYTUwgQXR0cmlidXRlcyAtLT4KLTw/Y3MgaWY6c3ViY291bnQoY2xhc3MuYXR0cnMpID8+Ci08P2NzICMgdGhpcyBuZXh0IGxpbmUgbXVzdCBiZSBleGFjdGx5IGxpa2UgdGhpcyB0byBiZSBwYXJzZWQgYnkgZWNsaXBzZSA/PgotPCEtLSA9PT09PT09PT0gRklFTEQgREVUQUlMID09PT09PT09IC0tPgotPGgyPlhNTCBBdHRyaWJ1dGVzPC9oMj4KLTw/Y3MgY2FsbDp3cml0ZV9hdHRyX2RldGFpbHMoY2xhc3MuYXR0cnMpID8+Ci08P2NzIC9pZiA/PgotCi08IS0tIEVudW0gVmFsdWVzIC0tPgotPD9jcyBpZjpzdWJjb3VudChjbGFzcy5lbnVtQ29uc3RhbnRzKSA/PgotPD9jcyAjIHRoaXMgbmV4dCBsaW5lIG11c3QgYmUgZXhhY3RseSBsaWtlIHRoaXMgdG8gYmUgcGFyc2VkIGJ5IGVjbGlwc2UgPz4KLTwhLS0gPT09PT09PT09IEVOVU0gQ09OU1RBTlRTIERFVEFJTCA9PT09PT09PSAtLT4KLTxoMj5FbnVtIFZhbHVlczwvaDI+Ci08P2NzIGNhbGw6d3JpdGVfZmllbGRfZGV0YWlscyhjbGFzcy5lbnVtQ29uc3RhbnRzKSA/PgotPD9jcyAvaWYgPz4KLQotPCEtLSBDb25zdGFudHMgLS0+Ci08P2NzIGlmOnN1YmNvdW50KGNsYXNzLmNvbnN0YW50cykgPz4KLTw/Y3MgIyB0aGlzIG5leHQgbGluZSBtdXN0IGJlIGV4YWN0bHkgbGlrZSB0aGlzIHRvIGJlIHBhcnNlZCBieSBlY2xpcHNlID8+Ci08IS0tID09PT09PT09PSBFTlVNIENPTlNUQU5UUyBERVRBSUwgPT09PT09PT0gLS0+Ci08aDI+Q29uc3RhbnRzPC9oMj4KLTw/Y3MgY2FsbDp3cml0ZV9maWVsZF9kZXRhaWxzKGNsYXNzLmNvbnN0YW50cykgPz4KLTw/Y3MgL2lmID8+Ci0KLTwhLS0gRmllbGRzIC0tPgotPD9jcyBpZjpzdWJjb3VudChjbGFzcy5maWVsZHMpID8+Ci08P2NzICMgdGhpcyBuZXh0IGxpbmUgbXVzdCBiZSBleGFjdGx5IGxpa2UgdGhpcyB0byBiZSBwYXJzZWQgYnkgZWNsaXBzZSA/PgotPCEtLSA9PT09PT09PT0gRklFTEQgREVUQUlMID09PT09PT09IC0tPgotPGgyPkZpZWxkczwvaDI+Ci08P2NzIGNhbGw6d3JpdGVfZmllbGRfZGV0YWlscyhjbGFzcy5maWVsZHMpID8+Ci08P2NzIC9pZiA/PgotCi08IS0tIFB1YmxpYyBjdG9ycyAtLT4KLTw/Y3MgaWY6c3ViY291bnQoY2xhc3MuY3RvcnMucHVibGljKSA/PgotPD9jcyAjIHRoaXMgbmV4dCBsaW5lIG11c3QgYmUgZXhhY3RseSBsaWtlIHRoaXMgdG8gYmUgcGFyc2VkIGJ5IGVjbGlwc2UgPz4KLTwhLS0gPT09PT09PT09IENPTlNUUlVDVE9SIERFVEFJTCA9PT09PT09PSAtLT4KLTxoMj5QdWJsaWMgQ29uc3RydWN0b3JzPC9oMj4KLTw/Y3MgY2FsbDp3cml0ZV9tZXRob2RfZGV0YWlscyhjbGFzcy5jdG9ycy5wdWJsaWMpID8+Ci08P2NzIC9pZiA/PgotCi08P2NzICMgdGhpcyBuZXh0IGxpbmUgbXVzdCBiZSBleGFjdGx5IGxpa2UgdGhpcyB0byBiZSBwYXJzZWQgYnkgZWNsaXBzZSA/PgotPCEtLSA9PT09PT09PT0gQ09OU1RSVUNUT1IgREVUQUlMID09PT09PT09IC0tPgotPCEtLSBQcm90ZWN0ZWQgY3RvcnMgLS0+Ci08P2NzIGlmOnN1YmNvdW50KGNsYXNzLmN0b3JzLnByb3RlY3RlZCkgPz4KLTxoMj5Qcm90ZWN0ZWQgQ29uc3RydWN0b3JzPC9oMj4KLTw/Y3MgY2FsbDp3cml0ZV9tZXRob2RfZGV0YWlscyhjbGFzcy5jdG9ycy5wcm90ZWN0ZWQpID8+Ci08P2NzIC9pZiA/PgotCi08P2NzICMgdGhpcyBuZXh0IGxpbmUgbXVzdCBiZSBleGFjdGx5IGxpa2UgdGhpcyB0byBiZSBwYXJzZWQgYnkgZWNsaXBzZSA/PgotPCEtLSA9PT09PT09PT0gTUVUSE9EIERFVEFJTCA9PT09PT09PSAtLT4KLTwhLS0gUHVibGljIG1ldGhkb3MgLS0+Ci08P2NzIGlmOnN1YmNvdW50KGNsYXNzLm1ldGhvZHMucHVibGljKSA/PgotPGgyPlB1YmxpYyBNZXRob2RzPC9oMj4KLTw/Y3MgY2FsbDp3cml0ZV9tZXRob2RfZGV0YWlscyhjbGFzcy5tZXRob2RzLnB1YmxpYykgPz4KLTw/Y3MgL2lmID8+Ci0KLTw/Y3MgIyB0aGlzIG5leHQgbGluZSBtdXN0IGJlIGV4YWN0bHkgbGlrZSB0aGlzIHRvIGJlIHBhcnNlZCBieSBlY2xpcHNlID8+Ci08IS0tID09PT09PT09PSBNRVRIT0QgREVUQUlMID09PT09PT09IC0tPgotPD9jcyBpZjpzdWJjb3VudChjbGFzcy5tZXRob2RzLnByb3RlY3RlZCkgPz4KLTxoMj5Qcm90ZWN0ZWQgTWV0aG9kczwvaDI+Ci08P2NzIGNhbGw6d3JpdGVfbWV0aG9kX2RldGFpbHMoY2xhc3MubWV0aG9kcy5wcm90ZWN0ZWQpID8+Ci08P2NzIC9pZiA/PgotCi08P2NzICMgdGhlIG5leHQgdHdvIGxpbmVzIG11c3QgYmUgZXhhY3RseSBsaWtlIHRoaXMgdG8gYmUgcGFyc2VkIGJ5IGVjbGlwc2UgPz4KLTwhLS0gPT09PT09PT09IEVORCBPRiBDTEFTUyBEQVRBID09PT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwvQT4KLQotPD9jcyBpbmNsdWRlOiJmb290ZXIuY3MiID8+Ci08L2Rpdj4gPCEtLSBqZC1jb250ZW50IC0tPgotCi08L2Rpdj48IS0tIGVuZCBkb2MtY29udGVudCAtLT4KLQotPD9jcyBpbmNsdWRlOiJ0cmFpbGVyLmNzIiA/PgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2NsYXNzZXMuY3MgYi90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2NsYXNzZXMuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3NjlmNDcuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9jbGFzc2VzLmNzCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotPD9jcyBpbmNsdWRlOiJkb2N0eXBlLmNzIiA/PgotPD9jcyBpbmNsdWRlOiJtYWNyb3MuY3MiID8+Ci08aHRtbDw/Y3MgaWY6ZGV2c2l0ZSA/PiBkZXZzaXRlPD9jcyAvaWYgPz4+Ci08P2NzIGluY2x1ZGU6ImhlYWRfdGFnLmNzIiA/PgotPGJvZHkgY2xhc3M9ImdjLWRvY3VtZW50YXRpb24gPD9jcyBpZjoocmVmZXJlbmNlLmdtcyB8fCByZWZlcmVuY2UuZ2NtKSA/Pmdvb2dsZTw/Y3MgL2lmID8+Ci0gIDw/Y3MgaWY6KGd1aWRlfHxkZXZlbG9wfHx0cmFpbmluZ3x8cmVmZXJlbmNlfHx0b29sc3x8c2RrKSA/PmRldmVsb3A8P2NzCi0gIGVsaWY6ZGVzaWduID8+ZGVzaWduPD9jcwotICBlbGlmOmRpc3RyaWJ1dGUgPz5kaXN0cmlidXRlPD9jcwotICAvaWYgPz4iIGl0ZW1zY29wZSBpdGVtdHlwZT0iaHR0cDovL3NjaGVtYS5vcmcvQXJ0aWNsZSI+Ci0gIDxhIG5hbWU9InRvcCI+PC9hPgotPD9jcyBpbmNsdWRlOiJoZWFkZXIuY3MiID8+Ci0KLTxkaXYgY2xhc3M9ImNvbC0xMiIgaWQ9ImRvYy1jb2wiPgotCi08ZGl2IGlkPSJqZC1oZWFkZXIiPgotPGgxPjw/Y3MgdmFyOnBhZ2UudGl0bGUgPz48L2gxPgotPC9kaXY+Ci0KLTxkaXYgaWQ9ImpkLWNvbnRlbnQiPgotPHA+VGhlc2UgYXJlIHRoZSBBbmRyb2lkIEFQSSBjbGFzc2VzLiBTZWUgYWxsIDxhIGhyZWY9InBhY2thZ2VzLmh0bWwiPkFQSSBwYWNrYWdlczwvYT4uPC9wPgotPGRpdiBjbGFzcz0iamQtbGV0dGVybGlzdCI+PD9jcyBlYWNoOmxldHRlcj1kb2NzLmNsYXNzZXMgPz4KLSAgICA8YSBocmVmPSIjbGV0dGVyXzw/Y3MgbmFtZTpsZXR0ZXIgPz4iPjw/Y3MgbmFtZTpsZXR0ZXIgPz48L2E+Jm5ic3A7Jm5ic3A7PD9jcyAvZWFjaD8+Ci08L2Rpdj4KLQotPD9jcyBlYWNoOmxldHRlcj1kb2NzLmNsYXNzZXMgPz4KLTw/Y3Mgc2V0OmNvdW50ID0gIzEgPz4KLTxoMiBpZD0ibGV0dGVyXzw/Y3MgbmFtZTpsZXR0ZXIgPz4iPjw/Y3MgbmFtZTpsZXR0ZXIgPz48L2gyPgotPHRhYmxlIGNsYXNzPSJqZC1zdW10YWJsZSI+Ci0gICAgPD9jcyBzZXQ6Y3VyX3JvdyA9ICMwID8+Ci0gICAgPD9jcyBlYWNoOmNsID0gbGV0dGVyID8+Ci0gICAgICAgIDx0ciBjbGFzcz0iPD9jcyBpZjpjb3VudCAlICMyID8+YWx0LWNvbG9yPD9jcyAvaWYgPz4gYXBpIGFwaWxldmVsLTw/Y3MgdmFyOmNsLnNpbmNlID8+IiA+Ci0gICAgICAgICAgICA8dGQgY2xhc3M9ImpkLWxpbmtjb2wiPjw/Y3MgY2FsbDp0eXBlX2xpbmsoY2wudHlwZSkgPz48L3RkPgotICAgICAgICAgICAgPHRkIGNsYXNzPSJqZC1kZXNjcmNvbCIgd2lkdGg9IjEwMCUiPjw/Y3MgY2FsbDpzaG9ydF9kZXNjcihjbCkgPz4mbmJzcDs8L3RkPgotICAgICAgICA8L3RyPgotICAgIDw/Y3Mgc2V0OmNvdW50ID0gY291bnQgKyAjMSA/PgotICAgIDw/Y3MgL2VhY2ggPz4KLTwvdGFibGU+Ci08P2NzIC9lYWNoID8+Ci0KLTw/Y3MgaW5jbHVkZToiZm9vdGVyLmNzIiA/PgotPC9kaXY+PCEtLSBlbmQgamQtY29udGVudCAtLT4KLTwvZGl2PjwhLS0gZW5kIGRvYy1jb250ZW50IC0tPgotCi08P2NzIGluY2x1ZGU6InRyYWlsZXIuY3MiID8+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2NvbXBvbmVudHMvbWFzdGhlYWQuY3MgYi90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2NvbXBvbmVudHMvbWFzdGhlYWQuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlMjU4MmYuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9jb21wb25lbnRzL21hc3RoZWFkLmNzCisrKyAvZGV2L251bGwKQEAgLTEsMzM0ICswLDAgQEAKLTw/Y3MgZGVmOmN1c3RvbV9tYXN0aGVhZCgpID8+Ci0gICAgPCEtLSBIZWFkZXIgLS0+Ci0gICAgPGRpdiBpZD0iaGVhZGVyIj4KLSAgICAgICAgPGRpdiBjbGFzcz0id3JhcCIgaWQ9ImhlYWRlci13cmFwIj4KLSAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2wtMyBsb2dvIj4KLSAgICAgICAgICA8YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5pbmRleC5odG1sIj4KLSAgICAgICAgICAgIDxpbWcgc3JjPSI8P2NzIHZhcjp0b3Jvb3QgPz5hc3NldHMvaW1hZ2VzL2RhY19sb2dvLnBuZyIgd2lkdGg9IjEyMyIgaGVpZ2h0PSIyNSIgYWx0PSJBbmRyb2lkIERldmVsb3BlcnMiIC8+Ci0gICAgICAgICAgPC9hPgotICAgICAgICAgIDxkaXYgY2xhc3M9ImJ0bi1xdWlja25hdiIgaWQ9ImJ0bi1xdWlja25hdiI+Ci0gICAgICAgICAgCTxhIGhyZWY9IiMiIGNsYXNzPSJhcnJvdy1pbmFjdGl2ZSI+UXVpY2tuYXY8L2E+Ci0JCQkgICAgICA8YSBocmVmPSIjIiBjbGFzcz0iYXJyb3ctYWN0aXZlIj5RdWlja25hdjwvYT4KLSAgICAgICAgICA8L2Rpdj4KLSAgICAgICAgICA8L2Rpdj4KLSAgICAgICAgICAgIDx1bCBjbGFzcz0ibmF2LXggY29sLTkiPgotICAgICAgICAgICAgICAgIDxsaSBjbGFzcz0iZGVzaWduIj4KLSAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PmRlc2lnbi9pbmRleC5odG1sIgotICAgICAgICAgICAgICAgICAgemgtVFctbGFuZz0i6Kit6KiIIgotICAgICAgICAgICAgICAgICAgemgtQ04tbGFuZz0i6K6+6K6hIgotICAgICAgICAgICAgICAgICAgcnUtbGFuZz0i0J/RgNC+0LXQutGC0LjRgNC+0LLQsNC90LjQtSIKLSAgICAgICAgICAgICAgICAgIGtvLWxhbmc9IuuUlOyekOyduCIKLSAgICAgICAgICAgICAgICAgIGphLWxhbmc9IuioreioiCIKLSAgICAgICAgICAgICAgICAgIGVzLWxhbmc9IkRpc2XDsWFyIgotICAgICAgICAgICAgICAgICAgPkRlc2lnbjwvYT48L2xpPgotICAgICAgICAgICAgICAgIDxsaSBjbGFzcz0iZGV2ZWxvcCI+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+ZGV2ZWxvcC9pbmRleC5odG1sIgotICAgICAgICAgICAgICAgICAgemgtVFctbGFuZz0i6ZaL55m8IgotICAgICAgICAgICAgICAgICAgemgtQ04tbGFuZz0i5byA5Y+RIgotICAgICAgICAgICAgICAgICAgcnUtbGFuZz0i0KDQsNC30YDQsNCx0L7RgtC60LAiCi0gICAgICAgICAgICAgICAgICBrby1sYW5nPSLqsJzrsJwiCi0gICAgICAgICAgICAgICAgICBqYS1sYW5nPSLplovnmboiCi0gICAgICAgICAgICAgICAgICBlcy1sYW5nPSJEZXNhcnJvbGxhciIKLSAgICAgICAgICAgICAgICAgID5EZXZlbG9wPC9hPjwvbGk+Ci0gICAgICAgICAgICAgICAgPGxpIGNsYXNzPSJkaXN0cmlidXRlIGxhc3QiPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PmRpc3RyaWJ1dGUvaW5kZXguaHRtbCIKLSAgICAgICAgICAgICAgICAgIHpoLVRXLWxhbmc9IueZvOS9iCIKLSAgICAgICAgICAgICAgICAgIHpoLUNOLWxhbmc9IuWIhuWPkSIKLSAgICAgICAgICAgICAgICAgIHJ1LWxhbmc9ItCg0LDRgdC/0YDQvtGB0YLRgNCw0L3QtdC90LjQtSIKLSAgICAgICAgICAgICAgICAgIGtvLWxhbmc9IuuwsO2PrCIKLSAgICAgICAgICAgICAgICAgIGphLWxhbmc9IumFjeW4gyIKLSAgICAgICAgICAgICAgICAgIGVzLWxhbmc9IkRpc3RyaWJ1aXIiCi0gICAgICAgICAgICAgICAgICA+RGlzdHJpYnV0ZTwvYT48L2xpPgotICAgICAgICAgICAgPC91bD4KLQotICAgICAgICAgICAgPCEtLSBOZXcgU2VhcmNoIC0tPgotICAgICAgICAgICAgPGRpdiBjbGFzcz0ibWVudS1jb250YWluZXIiPgotICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9yZW1lbnUiPgotICAgIDxkaXYgaWQ9Im1vcmUtYnRuIj48L2Rpdj4KLSAgPC9kaXY+Ci0gIDxkaXYgY2xhc3M9Im1vcmVob3ZlciIgaWQ9Im1vcmVtZW51Ij4KLSAgICA8ZGl2IGNsYXNzPSJ0b3AiPjwvZGl2PgotICAgIDxkaXYgY2xhc3M9Im1pZCI+Ci0gICAgICA8ZGl2IGNsYXNzPSJoZWFkZXIiPkxpbmtzPC9kaXY+Ci0gICAgICA8dWw+Ci0gICAgICAgIDxsaT48YSBocmVmPSJodHRwczovL3BsYXkuZ29vZ2xlLmNvbS9hcHBzL3B1Ymxpc2gvIj5Hb29nbGUgUGxheSBEZXZlbG9wZXIgQ29uc29sZTwvYT48L2xpPgotICAgICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL2FuZHJvaWQtZGV2ZWxvcGVycy5ibG9nc3BvdC5jb20vIj5BbmRyb2lkIERldmVsb3BlcnMgQmxvZzwvYT48L2xpPgotICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+YWJvdXQvaW5kZXguaHRtbCI+QWJvdXQgQW5kcm9pZDwvYT48L2xpPgotICAgICAgPC91bD4KLSAgICAgIDxkaXYgY2xhc3M9ImhlYWRlciI+QW5kcm9pZCBTaXRlczwvZGl2PgotICAgICAgPHVsPgotICAgICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL3d3dy5hbmRyb2lkLmNvbSI+QW5kcm9pZC5jb208L2E+PC9saT4KLSAgICAgICAgPGxpIGNsYXNzPSJhY3RpdmUiPjxhPkFuZHJvaWQgRGV2ZWxvcGVyczwvYT48L2xpPgotICAgICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL3NvdXJjZS5hbmRyb2lkLmNvbSI+QW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0PC9hPjwvbGk+Ci0gICAgICA8L3VsPgotCi08P2NzICMjIyMjIyMjIyMjIyBUT0RPOiBSZW1vdmUgd2hlbiB3ZSdyZSBoYXBweSB3aXRoIERldnNpdGUgIyMjIyMjIyMjIyMjIyA/PgotICAgICAgPD9jcyAjIFVzZSBkaWZmZXJlbmMgbGFuZyBzd2l0Y2hlciBmb3IgZGV2c2l0ZSBhbmQgZ2FlIHNlcnZlciA/PgotICAgICAgPD9jcyBpZjpkZXZzaXRlID8+Ci0gICAgICA8ZGl2IGNsYXNzPSJoZWFkZXIiPkxhbmd1YWdlPC9kaXY+Ci0gICAgICA8P2NzIGVsaWY6YW5kcm9pZC53aGljaGRvYyA9PSAib25saW5lIiA/PgotICAgICAgICA8ZGl2IGNsYXNzPSJoZWFkZXIiPkxhbmd1YWdlPC9kaXY+Ci0gICAgICAgICAgPGRpdiBpZD0ibGFuZ3VhZ2UiIGNsYXNzPSJsb2NhbGVzIj4KLSAgICAgICAgICAgIDxzZWxlY3QgbmFtZT0ibGFuZ3VhZ2UiIG9uQ2hhbmdlPSJjaGFuZ2VMYW5nUHJlZih0aGlzLnZhbHVlLCB0cnVlKSI+Ci0gICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iZW4iPkVuZ2xpc2g8L29wdGlvbj4KLSAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJlcyI+RXNwYcOxb2w8L29wdGlvbj4KLSAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJqYSI+5pel5pys6KqePC9vcHRpb24+Ci0gICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0ia28iPu2VnOq1reyWtDwvb3B0aW9uPgotICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9InJ1Ij7QoNGD0YHRgdC60LjQuTwvb3B0aW9uPgotICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9InpoLUNOIj7kuK3mlocgKOS4reWbvSk8L29wdGlvbj4KLSAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJ6aC1UVyI+5Lit5paHICjlj7DngaMpPC9vcHRpb24+Ci0gICAgICAgICAgICA8L3NlbGVjdD4KLSAgICAgICAgICA8L2Rpdj4KLSAgICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICAgICAgICAgIDwhLS0KLSAgICAgICAgICBsb2FkTGFuZ1ByZWYoKTsKLSAgICAgICAgICAgIC8vLS0+Ci0gICAgICAgIDwvc2NyaXB0PgotICAgICAgPD9jcyAvaWYgPz4KLSAgICAgIDw/Y3MgIyBFbmQgb2YgZGV2c2l0ZSB2cy4gZ2FlIHZlcnNpb24gb2YgbGFuZyBzd2l0Y2hlciA/PgotCi0KLSAgICAgIDxiciBjbGFzcz0iY2xlYXJmaXgiIC8+Ci0gICAgPC9kaXY+Ci0gICAgPGRpdiBjbGFzcz0iYm90dG9tIj48L2Rpdj4KLSAgPC9kaXY+Ci0gIDxkaXYgY2xhc3M9InNlYXJjaCIgaWQ9InNlYXJjaC1jb250YWluZXIiPgotICAgIDxkaXYgY2xhc3M9InNlYXJjaC1pbm5lciI+Ci0gICAgICA8ZGl2IGlkPSJzZWFyY2gtYnRuIj48L2Rpdj4KLSAgICAgIDxkaXYgY2xhc3M9ImxlZnQiPjwvZGl2PgotICAgICAgPGZvcm0gb25zdWJtaXQ9InJldHVybiBzdWJtaXRfc2VhcmNoKCkiPgotICAgICAgICA8aW5wdXQgaWQ9InNlYXJjaF9hdXRvY29tcGxldGUiIHR5cGU9InRleHQiIHZhbHVlPSIiIGF1dG9jb21wbGV0ZT0ib2ZmIiBuYW1lPSJxIgotb25mb2N1cz0ic2VhcmNoX2ZvY3VzX2NoYW5nZWQodGhpcywgdHJ1ZSkiIG9uYmx1cj0ic2VhcmNoX2ZvY3VzX2NoYW5nZWQodGhpcywgZmFsc2UpIgotb25rZXlkb3duPSJyZXR1cm4gc2VhcmNoX2NoYW5nZWQoZXZlbnQsIHRydWUsICc8P2NzIHZhcjp0b3Jvb3QgPz4nKSIKLW9ua2V5dXA9InJldHVybiBzZWFyY2hfY2hhbmdlZChldmVudCwgZmFsc2UsICc8P2NzIHZhcjp0b3Jvb3QgPz4nKSIgLz4KLSAgICAgIDwvZm9ybT4KLSAgICAgIDxkaXYgY2xhc3M9InJpZ2h0Ij48L2Rpdj4KLSAgICAgICAgPGEgY2xhc3M9ImNsb3NlIGhpZGUiPmNsb3NlPC9hPgotICAgICAgICA8ZGl2IGNsYXNzPSJsZWZ0Ij48L2Rpdj4KLSAgICAgICAgPGRpdiBjbGFzcz0icmlnaHQiPjwvZGl2PgotICAgIDwvZGl2PgotICA8L2Rpdj4KLSAgPGRpdiBpZD0ic2VhcmNoX2ZpbHRlcmVkX3dyYXBwZXIiPgotICAgIDxkaXYgaWQ9InNlYXJjaF9maWx0ZXJlZF9kaXYiIGNsYXNzPSJuby1kaXNwbGF5Ij4KLSAgICAgICAgPHVsIGlkPSJzZWFyY2hfZmlsdGVyZWQiPgotICAgICAgICA8L3VsPgotICAgIDwvZGl2PgotICA8L2Rpdj4KLQotICA8L2Rpdj4KLSAgPCEtLSAvTmV3IFNlYXJjaD4KLQotCi0gICAgICAgICAgPCEtLSBFeHBhbmRlZCBxdWlja25hdiAtLT4KLSAgICAgICAgICAgPGRpdiBpZD0icXVpY2tuYXYiIGNsYXNzPSJjb2wtOSI+Ci0gICAgICAgICAgICAgICAgPHVsPgotICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9ImRlc2lnbiI+Ci0gICAgICAgICAgICAgICAgICAgICAgPHVsPgotICAgICAgICAgICAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PmRlc2lnbi9pbmRleC5odG1sIj5HZXQgU3RhcnRlZDwvYT48L2xpPgotICAgICAgICAgICAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PmRlc2lnbi9zdHlsZS9pbmRleC5odG1sIj5TdHlsZTwvYT48L2xpPgotICAgICAgICAgICAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PmRlc2lnbi9wYXR0ZXJucy9pbmRleC5odG1sIj5QYXR0ZXJuczwvYT48L2xpPgotICAgICAgICAgICAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PmRlc2lnbi9idWlsZGluZy1ibG9ja3MvaW5kZXguaHRtbCI+QnVpbGRpbmcgQmxvY2tzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+ZGVzaWduL2Rvd25sb2Fkcy9pbmRleC5odG1sIj5Eb3dubG9hZHM8L2E+PC9saT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5kZXNpZ24vdmlkZW9zL2luZGV4Lmh0bWwiPlZpZGVvczwvYT48L2xpPgotICAgICAgICAgICAgICAgICAgICAgIDwvdWw+Ci0gICAgICAgICAgICAgICAgICAgIDwvbGk+Ci0gICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz0iZGV2ZWxvcCI+Ci0gICAgICAgICAgICAgICAgICAgICAgPHVsPgotICAgICAgICAgICAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnRyYWluaW5nL2luZGV4Lmh0bWwiCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHpoLVRXLWxhbmc9Iuiok+e3tOiqsueoiyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgemgtQ04tbGFuZz0i5Z+56K6tIgotICAgICAgICAgICAgICAgICAgICAgICAgICBydS1sYW5nPSLQmtGD0YDRgdGLIgotICAgICAgICAgICAgICAgICAgICAgICAgICBrby1sYW5nPSLqtZDsnKEiCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGphLWxhbmc9IuODiOODrOODvOODi+ODs+OCsCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZXMtbGFuZz0iQ2FwYWNpdGFjacOzbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgPlRyYWluaW5nPC9hPjwvbGk+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+Z3VpZGUvY29tcG9uZW50cy9pbmRleC5odG1sIgotICAgICAgICAgICAgICAgICAgICAgICAgICB6aC1UVy1sYW5nPSJBUEkg5oyH5Y2XIgotICAgICAgICAgICAgICAgICAgICAgICAgICB6aC1DTi1sYW5nPSJBUEkg5oyH5Y2XIgotICAgICAgICAgICAgICAgICAgICAgICAgICBydS1sYW5nPSLQoNGD0LrQvtCy0L7QtNGB0YLQstCwINC/0L4gQVBJIgotICAgICAgICAgICAgICAgICAgICAgICAgICBrby1sYW5nPSJBUEkg6rCA7J2065OcIgotICAgICAgICAgICAgICAgICAgICAgICAgICBqYS1sYW5nPSJBUEkg44Ks44Kk44OJIgotICAgICAgICAgICAgICAgICAgICAgICAgICBlcy1sYW5nPSJHdcOtYXMgZGUgbGEgQVBJIgotICAgICAgICAgICAgICAgICAgICAgICAgICA+QVBJIEd1aWRlczwvYT48L2xpPgotICAgICAgICAgICAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlZmVyZW5jZS9wYWNrYWdlcy5odG1sIgotICAgICAgICAgICAgICAgICAgICAgICAgICB6aC1UVy1sYW5nPSLlj4PogIPos4fmupAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHpoLUNOLWxhbmc9IuWPguiAgyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcnUtbGFuZz0i0KHQv9GA0LDQstC+0YfQvdC40LoiCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGtvLWxhbmc9IuywuOyhsOusuOyEnCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgamEtbGFuZz0i44Oq44OV44Kh44Os44Oz44K5IgotICAgICAgICAgICAgICAgICAgICAgICAgICBlcy1sYW5nPSJSZWZlcmVuY2lhIgotICAgICAgICAgICAgICAgICAgICAgICAgICA+UmVmZXJlbmNlPC9hPjwvbGk+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+dG9vbHMvaW5kZXguaHRtbCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgemgtVFctbGFuZz0i55u46Zec5bel5YW3IgotICAgICAgICAgICAgICAgICAgICAgICAgICB6aC1DTi1sYW5nPSLlt6XlhbciCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1LWxhbmc9ItCY0L3RgdGC0YDRg9C80LXQvdGC0YsiCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGtvLWxhbmc9IuuPhOq1rCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgamEtbGFuZz0i44OE44O844OrIgotICAgICAgICAgICAgICAgICAgICAgICAgICBlcy1sYW5nPSJIZXJyYW1pZW50YXMiCi0gICAgICAgICAgICAgICAgICAgICAgICAgID5Ub29sczwvYT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgPHVsPjxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5zZGsvaW5kZXguaHRtbCI+R2V0IHRoZSBTREs8L2E+PC9saT48L3VsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5nb29nbGUvaW5kZXguaHRtbCI+R29vZ2xlIFNlcnZpY2VzPC9hPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KLSAgICAgICAgICAgICAgICAgICAgICA8L3VsPgotICAgICAgICAgICAgICAgICAgICA8L2xpPgotICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9ImRpc3RyaWJ1dGUgbGFzdCI+Ci0gICAgICAgICAgICAgICAgICAgICAgPHVsPgotICAgICAgICAgICAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PmRpc3RyaWJ1dGUvaW5kZXguaHRtbCI+R29vZ2xlIFBsYXk8L2E+PC9saT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5kaXN0cmlidXRlL2dvb2dsZXBsYXkvcHVibGlzaC9pbmRleC5odG1sIj5QdWJsaXNoaW5nPC9hPjwvbGk+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+ZGlzdHJpYnV0ZS9nb29nbGVwbGF5L3Byb21vdGUvaW5kZXguaHRtbCI+UHJvbW90aW5nPC9hPjwvbGk+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+ZGlzdHJpYnV0ZS9nb29nbGVwbGF5L3F1YWxpdHkvaW5kZXguaHRtbCI+QXBwIFF1YWxpdHk8L2E+PC9saT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5kaXN0cmlidXRlL2dvb2dsZXBsYXkvc3BvdGxpZ2h0L2luZGV4Lmh0bWwiPlNwb3RsaWdodDwvYT48L2xpPgotICAgICAgICAgICAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PmRpc3RyaWJ1dGUvb3Blbi5odG1sIj5PcGVuIERpc3RyaWJ1dGlvbjwvYT48L2xpPgotICAgICAgICAgICAgICAgICAgICAgIDwvdWw+Ci0gICAgICAgICAgICAgICAgICAgIDwvbGk+Ci0gICAgICAgICAgICAgICAgPC91bD4KLSAgICAgICAgICA8L2Rpdj4KLSAgICAgICAgICA8IS0tIC9FeHBhbmRlZCBxdWlja25hdiAtLT4KLSAgICAgICAgPC9kaXY+Ci0gICAgPC9kaXY+Ci0gICAgPCEtLSAvSGVhZGVyIC0tPgotCi0KLSAgPGRpdiBpZD0ic2VhcmNoUmVzdWx0cyIgY2xhc3M9IndyYXAiIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij4KLSAgICAgICAgICA8aDIgaWQ9InNlYXJjaFRpdGxlIj5SZXN1bHRzPC9oMj4KLSAgICAgICAgICA8ZGl2IGlkPSJsZWZ0U2VhcmNoQ29udHJvbCIgY2xhc3M9InNlYXJjaC1jb250cm9sIj5Mb2FkaW5nLi4uPC9kaXY+Ci0gIDwvZGl2PgotCi0KLQotPD9jcyBpZjp0cmFpbmluZyB8fCBndWlkZSB8fCByZWZlcmVuY2UgfHwgdG9vbHMgfHwgZGV2ZWxvcCB8fCBnb29nbGUgPz4KLSAgICA8IS0tIFNlY29uZGFyeSB4LW5hdiAtLT4KLSAgICA8ZGl2IGlkPSJuYXYteCI+Ci0gICAgICAgIDxkaXYgY2xhc3M9IndyYXAiPgotICAgICAgICAgICAgPHVsIGNsYXNzPSJuYXYteCBjb2wtOSBkZXZlbG9wIiBzdHlsZT0id2lkdGg6MTAwJSI+Ci0gICAgICAgICAgICAgICAgPGxpIGNsYXNzPSJ0cmFpbmluZyI+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+dHJhaW5pbmcvaW5kZXguaHRtbCIKLSAgICAgICAgICAgICAgICAgIHpoLVRXLWxhbmc9Iuiok+e3tOiqsueoiyIKLSAgICAgICAgICAgICAgICAgIHpoLUNOLWxhbmc9IuWfueiurSIKLSAgICAgICAgICAgICAgICAgIHJ1LWxhbmc9ItCa0YPRgNGB0YsiCi0gICAgICAgICAgICAgICAgICBrby1sYW5nPSLqtZDsnKEiCi0gICAgICAgICAgICAgICAgICBqYS1sYW5nPSLjg4jjg6zjg7zjg4vjg7PjgrAiCi0gICAgICAgICAgICAgICAgICBlcy1sYW5nPSJDYXBhY2l0YWNpw7NuIgotICAgICAgICAgICAgICAgICAgPlRyYWluaW5nPC9hPjwvbGk+Ci0gICAgICAgICAgICAgICAgPGxpIGNsYXNzPSJndWlkZSI+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+Z3VpZGUvY29tcG9uZW50cy9pbmRleC5odG1sIgotICAgICAgICAgICAgICAgICAgemgtVFctbGFuZz0iQVBJIOaMh+WNlyIKLSAgICAgICAgICAgICAgICAgIHpoLUNOLWxhbmc9IkFQSSDmjIfljZciCi0gICAgICAgICAgICAgICAgICBydS1sYW5nPSLQoNGD0LrQvtCy0L7QtNGB0YLQstCwINC/0L4gQVBJIgotICAgICAgICAgICAgICAgICAga28tbGFuZz0iQVBJIOqwgOydtOuTnCIKLSAgICAgICAgICAgICAgICAgIGphLWxhbmc9IkFQSSDjgqzjgqTjg4kiCi0gICAgICAgICAgICAgICAgICBlcy1sYW5nPSJHdcOtYXMgZGUgbGEgQVBJIgotICAgICAgICAgICAgICAgICAgPkFQSSBHdWlkZXM8L2E+PC9saT4KLSAgICAgICAgICAgICAgICA8bGkgY2xhc3M9InJlZmVyZW5jZSI+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVmZXJlbmNlL3BhY2thZ2VzLmh0bWwiCi0gICAgICAgICAgICAgICAgICB6aC1UVy1sYW5nPSLlj4PogIPos4fmupAiCi0gICAgICAgICAgICAgICAgICB6aC1DTi1sYW5nPSLlj4LogIMiCi0gICAgICAgICAgICAgICAgICBydS1sYW5nPSLQodC/0YDQsNCy0L7Rh9C90LjQuiIKLSAgICAgICAgICAgICAgICAgIGtvLWxhbmc9IuywuOyhsOusuOyEnCIKLSAgICAgICAgICAgICAgICAgIGphLWxhbmc9IuODquODleOCoeODrOODs+OCuSIKLSAgICAgICAgICAgICAgICAgIGVzLWxhbmc9IlJlZmVyZW5jaWEiCi0gICAgICAgICAgICAgICAgICA+UmVmZXJlbmNlPC9hPjwvbGk+Ci0gICAgICAgICAgICAgICAgPGxpIGNsYXNzPSJ0b29scyI+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+dG9vbHMvaW5kZXguaHRtbCIKLSAgICAgICAgICAgICAgICAgIHpoLVRXLWxhbmc9IuebuOmXnOW3peWFtyIKLSAgICAgICAgICAgICAgICAgIHpoLUNOLWxhbmc9IuW3peWFtyIKLSAgICAgICAgICAgICAgICAgIHJ1LWxhbmc9ItCY0L3RgdGC0YDRg9C80LXQvdGC0YsiCi0gICAgICAgICAgICAgICAgICBrby1sYW5nPSLrj4TqtawiCi0gICAgICAgICAgICAgICAgICBqYS1sYW5nPSLjg4Tjg7zjg6siCi0gICAgICAgICAgICAgICAgICBlcy1sYW5nPSJIZXJyYW1pZW50YXMiCi0gICAgICAgICAgICAgICAgICA+VG9vbHM8L2E+PC9saT4KLSAgICAgICAgICAgICAgICA8bGkgY2xhc3M9Imdvb2dsZSI+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+Z29vZ2xlL2luZGV4Lmh0bWwiCi0gICAgICAgICAgICAgICAgICA+R29vZ2xlIFNlcnZpY2VzPC9hPgotICAgICAgICAgICAgICAgIDwvbGk+Ci0gICAgICAgICAgICA8L3VsPgotICAgICAgICA8L2Rpdj4KLQotICAgIDwvZGl2PgotICAgIDwhLS0gL1NlbmRvbmRhcnkgeC1uYXYgLS0+Ci08P2NzIC9pZiA/PgotICA8P2NzCi0vZGVmID8+Ci0KLQotCi0KLTw/Y3MgZGVmOnNhY19tYXN0aGVhZCgpID8+Ci0gICAgPCEtLSBIZWFkZXIgLS0+Ci0gICAgPGRpdiBpZD0iaGVhZGVyIj4KLSAgICAgICAgPGRpdiBjbGFzcz0id3JhcCIgaWQ9ImhlYWRlci13cmFwIj4KLSAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2wtMyBzYWNsb2dvIj4KLSAgICAgICAgICA8YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5pbmRleC5odG1sIj4KLSAgICAgICAgICAgIDxpbWcgc3JjPSI8P2NzIHZhcjp0b3Jvb3QgPz5hc3NldHMvaW1hZ2VzL3NhY19sb2dvLnBuZyIKLSAgICAgICAgICAgICAgICBzcmNzZXQ9Ijw/Y3MgdmFyOnRvcm9vdCA/PmFzc2V0cy9pbWFnZXMvc2FjX2xvZ29AMngucG5nIDJ4IgotICAgICAgICAgICAgICAgIHdpZHRoPSIxMjMiIGhlaWdodD0iMjUiIGFsdD0iQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0IiAvPgotICAgICAgICAgIDwvYT4KLSAgICAgICAgICA8L2Rpdj4KLSAgICAgICAgICAgIDx1bCBjbGFzcz0ibmF2LXggY29sLTkiPgotICAgICAgICAgICAgICAgIDxsaSBjbGFzcz0ic291cmNlIj4KLSAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnNvdXJjZS9pbmRleC5odG1sIiA8P2NzCi0gICAgICAgICAgICAgICAgICBpZjpzb3VyY2UgPz5jbGFzcz0ic2VsZWN0ZWQiPD9jcyAvaWYgPz4KLSAgICAgICAgICAgICAgICAgID5Tb3VyY2U8L2E+PC9saT4KLSAgICAgICAgICAgICAgICA8bGkgY2xhc3M9ImRldmljZXMiPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PmRldmljZXMvaW5kZXguaHRtbCIgPD9jcwotICAgICAgICAgICAgICAgICAgaWY6ZGV2aWNlcyA/PmNsYXNzPSJzZWxlY3RlZCI8P2NzIC9pZiA/PgotICAgICAgICAgICAgICAgICAgPkRldmljZXM8L2E+PC9saT4KLSAgICAgICAgICAgICAgICA8bGkgY2xhc3M9InNlY3VyaXR5Ij48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5zZWN1cml0eS9pbmRleC5odG1sIiA8P2NzCi0gICAgICAgICAgICAgICAgICBpZjpzZWN1cml0eSA/PmNsYXNzPSJzZWxlY3RlZCI8P2NzIC9pZiA/PgotICAgICAgICAgICAgICAgICAgPlNlY3VyaXR5PC9hPjwvbGk+Ci0gICAgICAgICAgICAgICAgPGxpIGNsYXNzPSJjb21wYXRpYmlsaXR5IGxhc3QiPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PmNvbXBhdGliaWxpdHkvaW5kZXguaHRtbCIgPD9jcwotICAgICAgICAgICAgICAgICAgaWY6Y29tcGF0aWJpbGl0eSA/PmNsYXNzPSJzZWxlY3RlZCI8P2NzIC9pZiA/PgotICAgICAgICAgICAgICAgICAgPkNvbXBhdGliaWxpdHk8L2E+PC9saT4KLSAgICAgICAgICAgIDwvdWw+Ci0gICAgICAgICAgICA8IS0tIE5ldyBTZWFyY2ggLS0+Ci0gICAgICAgICAgICA8ZGl2IGNsYXNzPSJtZW51LWNvbnRhaW5lciI+Ci0gICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb3JlbWVudSI+Ci0gICAgPGRpdiBpZD0ibW9yZS1idG4iPjwvZGl2PgotICA8L2Rpdj4KLSAgPGRpdiBjbGFzcz0ibW9yZWhvdmVyIiBpZD0ibW9yZW1lbnUiPgotICAgIDxkaXYgY2xhc3M9InRvcCI+PC9kaXY+Ci0gICAgPGRpdiBjbGFzcz0ibWlkIj4KLSAgICAgIDxkaXYgY2xhc3M9ImhlYWRlciI+QW5kcm9pZCBTaXRlczwvZGl2PgotICAgICAgPHVsPgotICAgICAgICA8bGkgY2xhc3M9ImFjdGl2ZSI+PGE+QW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0PC9hPjwvbGk+Ci0gICAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vd3d3LmFuZHJvaWQuY29tIj5BbmRyb2lkLmNvbTwvYT48L2xpPgotICAgICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL2RldmVsb3Blci5hbmRyb2lkLmNvbSI+QW5kcm9pZCBEZXZlbG9wZXJzPC9hPjwvbGk+Ci0gICAgICA8L3VsPgotICAgICAgPCEtLSA8ZGl2IGNsYXNzPSJoZWFkZXIiPlN1cHBvcnQ8L2Rpdj4KLSAgICAgIDx1bD4KLSAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnN1cHBvcnQuaHRtbCI+RGV2ZWxvcGVyIFN1cHBvcnQ8L2E+PC9saT4KLSAgICAgIDwvdWw+IC0tPgotICAgICAgPGJyIGNsYXNzPSJjbGVhcmZpeCIgLz4KLSAgICA8L2Rpdj4KLSAgICA8ZGl2IGNsYXNzPSJib3R0b20iPjwvZGl2PgotICA8L2Rpdj4KLQotICA8ZGl2IGNsYXNzPSJzZWFyY2giIGlkPSJzZWFyY2gtY29udGFpbmVyIj4KLSAgICA8ZGl2IGNsYXNzPSJzZWFyY2gtaW5uZXIiPgotICAgICAgPGRpdiBpZD0ic2VhcmNoLWJ0biI+PC9kaXY+Ci0gICAgICA8ZGl2IGNsYXNzPSJsZWZ0Ij48L2Rpdj4KLSAgICAgIDxmb3JtIG9uc3VibWl0PSJyZXR1cm4gc3VibWl0X3NlYXJjaCgpIj4KLSAgICAgICAgPGlucHV0IGlkPSJzZWFyY2hfYXV0b2NvbXBsZXRlIiB0eXBlPSJ0ZXh0IiB2YWx1ZT0iIiBhdXRvY29tcGxldGU9Im9mZiIgbmFtZT0icSIKLW9uZm9jdXM9InNlYXJjaF9mb2N1c19jaGFuZ2VkKHRoaXMsIHRydWUpIiBvbmJsdXI9InNlYXJjaF9mb2N1c19jaGFuZ2VkKHRoaXMsIGZhbHNlKSIKLW9ua2V5ZG93bj0icmV0dXJuIHNlYXJjaF9jaGFuZ2VkKGV2ZW50LCB0cnVlLCAnPD9jcyB2YXI6dG9yb290ID8+JykiCi1vbmtleXVwPSJyZXR1cm4gc2VhcmNoX2NoYW5nZWQoZXZlbnQsIGZhbHNlLCAnPD9jcyB2YXI6dG9yb290ID8+JykiIC8+Ci0gICAgICA8L2Zvcm0+Ci0gICAgICA8ZGl2IGNsYXNzPSJyaWdodCI+PC9kaXY+Ci0gICAgICAgIDxhIGNsYXNzPSJjbG9zZSBoaWRlIj5jbG9zZTwvYT4KLSAgICAgICAgPGRpdiBjbGFzcz0ibGVmdCI+PC9kaXY+Ci0gICAgICAgIDxkaXYgY2xhc3M9InJpZ2h0Ij48L2Rpdj4KLSAgICA8L2Rpdj4KLSAgPC9kaXY+Ci0gIDxkaXYgaWQ9InNlYXJjaF9maWx0ZXJlZF93cmFwcGVyIj4KLSAgICA8ZGl2IGlkPSJzZWFyY2hfZmlsdGVyZWRfZGl2IiBjbGFzcz0ibm8tZGlzcGxheSI+Ci0gICAgICAgIDx1bCBpZD0ic2VhcmNoX2ZpbHRlcmVkIj4KLSAgICAgICAgPC91bD4KLSAgICA8L2Rpdj4KLSAgPC9kaXY+Ci0KLSAgPC9kaXY+Ci0gIDwhLS0gL05ldyBTZWFyY2g+IC0tPgotICAgICAgICA8L2Rpdj4KLSAgICA8L2Rpdj4KLSAgICA8IS0tIC9IZWFkZXIgLS0+Ci0KLSAgPGRpdiBpZD0ic2VhcmNoUmVzdWx0cyIgY2xhc3M9IndyYXAiIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij4KLSAgICAgICAgICA8aDIgaWQ9InNlYXJjaFRpdGxlIj5SZXN1bHRzPC9oMj4KLSAgICAgICAgICA8ZGl2IGlkPSJsZWZ0U2VhcmNoQ29udHJvbCIgY2xhc3M9InNlYXJjaC1jb250cm9sIj5Mb2FkaW5nLi4uPC9kaXY+Ci0gIDwvZGl2PgotCi0gIDw/Y3MKLS9kZWYgPz4KZGlmZiAtLWdpdCBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvY3VzdG9taXphdGlvbnMuY3MgYi90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2N1c3RvbWl6YXRpb25zLmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMWQzZDcyLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvY3VzdG9taXphdGlvbnMuY3MKKysrIC9kZXYvbnVsbApAQCAtMSw0NzEgKzAsMCBAQAotPD9jcyAKLWRlZjpmdWxscGFnZSgpID8+Ci0gIDxkaXYgaWQ9ImJvZHktY29udGVudCI+Ci08P2NzIC9kZWYgPz4KLTw/Y3MgCi1kZWY6c2RrX25hdigpID8+Ci0gIDxkaXYgY2xhc3M9IndyYXAgY2xlYXJmaXgiIGlkPSJib2R5LWNvbnRlbnQiPgotICAgIDxkaXYgY2xhc3M9ImNvbC00IiBpZD0ic2lkZS1uYXYiIGl0ZW1zY29wZSBpdGVtdHlwZT0iaHR0cDovL3NjaGVtYS5vcmcvU2l0ZU5hdmlnYXRpb25FbGVtZW50Ij4KLSAgICAgIDxkaXYgaWQ9ImRldmRvYy1uYXYiIGNsYXNzPSJzY3JvbGwtcGFuZSI+Ci08YSBjbGFzcz0idG90b3AiIGhyZWY9IiN0b3AiIGRhdGEtZy1ldmVudD0ibGVmdC1uYXYtdG9wIj50byB0b3A8L2E+Ci0KLTw/Y3MgCi0gICAgICAgIGluY2x1ZGU6Ii4uLy4uLy4uLy4uLy4uL2ZyYW1ld29ya3MvYmFzZS9kb2NzL2h0bWwvc2RrL3Nka190b2MuY3MiID8+Ci0KLQotICAgICAgPC9kaXY+Ci0gICAgPC9kaXY+IDwhLS0gZW5kIHNpZGUtbmF2IC0tPgotPD9jcyAvZGVmID8+Ci08P2NzIAotZGVmOnJlc291cmNlc190YWJfbmF2KCkgPz4KLSAgPGRpdiBjbGFzcz0id3JhcCBjbGVhcmZpeCIgaWQ9ImJvZHktY29udGVudCI+Ci0gICAgPGEKLSAgICA8ZGl2IGNsYXNzPSJjb2wtNCIgaWQ9InNpZGUtbmF2IiBpdGVtc2NvcGUgaXRlbXR5cGU9Imh0dHA6Ly9zY2hlbWEub3JnL1NpdGVOYXZpZ2F0aW9uRWxlbWVudCI+Ci0gICAgICA8ZGl2IGlkPSJkZXZkb2MtbmF2IiBjbGFzcz0ic2Nyb2xsLXBhbmUiPgotPGEgY2xhc3M9InRvdG9wIiBocmVmPSIjdG9wIiBkYXRhLWctZXZlbnQ9ImxlZnQtbmF2LXRvcCI+dG8gdG9wPC9hPgotCi08P2NzIAotICAgICAgICBpbmNsdWRlOiIuLi8uLi8uLi8uLi8uLi9mcmFtZXdvcmtzL2Jhc2UvZG9jcy9odG1sL3Jlc291cmNlcy9yZXNvdXJjZXNfdG9jLmNzIiA/PgotCi0KLSAgICAgIDwvZGl2PgotICAgIDwvZGl2PiA8IS0tIGVuZCBzaWRlLW5hdiAtLT4KLSAgICA8c2NyaXB0PgotICAgICAgJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24oKSB7Ci0gICAgICAgIHNjcm9sbEludG9WaWV3KCJkZXZkb2MtbmF2Iik7Ci0gICAgICAgIH0pOwotICAgIDwvc2NyaXB0PgotPD9jcyAvZGVmID8+Ci08P2NzCi1kZWY6dG9vbHNfbmF2KCkgPz4KLSAgPGRpdiBjbGFzcz0id3JhcCBjbGVhcmZpeCIgaWQ9ImJvZHktY29udGVudCI+Ci0gICAgPGRpdiBjbGFzcz0iY29sLTMiIGlkPSJzaWRlLW5hdiIgaXRlbXNjb3BlIGl0ZW10eXBlPSJodHRwOi8vc2NoZW1hLm9yZy9TaXRlTmF2aWdhdGlvbkVsZW1lbnQiPgotICAgICAgPGRpdiBpZD0iZGV2ZG9jLW5hdiIgY2xhc3M9InNjcm9sbC1wYW5lIj4KLTxhIGNsYXNzPSJ0b3RvcCIgaHJlZj0iI3RvcCIgZGF0YS1nLWV2ZW50PSJsZWZ0LW5hdi10b3AiPnRvIHRvcDwvYT4KLTw/Y3MgCi0gICAgICAgIGluY2x1ZGU6Ii4uLy4uLy4uLy4uLy4uL2ZyYW1ld29ya3MvYmFzZS9kb2NzL2h0bWwvdG9vbHMvdG9vbHNfdG9jLmNzIiA/PgotICAgICAgICAKLSAgICAgICAgCi0gICAgICA8L2Rpdj4KLSAgICA8L2Rpdj4gPCEtLSBlbmQgc2lkZS1uYXYgLS0+Ci0gICAgPHNjcmlwdD4KLSAgICAgICQoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uKCkgewotICAgICAgICBzY3JvbGxJbnRvVmlldygiZGV2ZG9jLW5hdiIpOwotICAgICAgICB9KTsKLSAgICA8L3NjcmlwdD4KLTw/Y3MgL2RlZiA/PgotPD9jcwotZGVmOnRyYWluaW5nX25hdigpID8+Ci0gIDxkaXYgY2xhc3M9IndyYXAgY2xlYXJmaXgiIGlkPSJib2R5LWNvbnRlbnQiPgotICAgIDxkaXYgY2xhc3M9ImNvbC00IiBpZD0ic2lkZS1uYXYiIGl0ZW1zY29wZSBpdGVtdHlwZT0iaHR0cDovL3NjaGVtYS5vcmcvU2l0ZU5hdmlnYXRpb25FbGVtZW50Ij4KLSAgICAgIDxkaXYgaWQ9ImRldmRvYy1uYXYiIGNsYXNzPSJzY3JvbGwtcGFuZSI+Ci08YSBjbGFzcz0idG90b3AiIGhyZWY9IiN0b3AiIGRhdGEtZy1ldmVudD0ibGVmdC1uYXYtdG9wIj50byB0b3A8L2E+Ci0KLQotPD9jcyAKLSAgICAgICAgaW5jbHVkZToiLi4vLi4vLi4vLi4vLi4vZnJhbWV3b3Jrcy9iYXNlL2RvY3MvaHRtbC90cmFpbmluZy90cmFpbmluZ190b2MuY3MiID8+Ci0gICAgICAgIAotCi0gICAgICA8L2Rpdj4KLSAgICA8L2Rpdj4gPCEtLSBlbmQgc2lkZS1uYXYgLS0+Ci0gICAgPHNjcmlwdD4KLSAgICAgICQoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uKCkgewotICAgICAgICBzY3JvbGxJbnRvVmlldygiZGV2ZG9jLW5hdiIpOwotICAgICAgICB9KTsKLSAgICA8L3NjcmlwdD4KLTw/Y3MgL2RlZiA/PgotPD9jcyAKLWRlZjpndWlkZV9uYXYoKSA/PgotICA8ZGl2IGNsYXNzPSJ3cmFwIGNsZWFyZml4IiBpZD0iYm9keS1jb250ZW50Ij4KLSAgICA8ZGl2IGNsYXNzPSJjb2wtNCIgaWQ9InNpZGUtbmF2IiBpdGVtc2NvcGUgaXRlbXR5cGU9Imh0dHA6Ly9zY2hlbWEub3JnL1NpdGVOYXZpZ2F0aW9uRWxlbWVudCI+Ci0gICAgICA8ZGl2IGlkPSJkZXZkb2MtbmF2IiBjbGFzcz0ic2Nyb2xsLXBhbmUiPgotPGEgY2xhc3M9InRvdG9wIiBocmVmPSIjdG9wIiBkYXRhLWctZXZlbnQ9ImxlZnQtbmF2LXRvcCI+dG8gdG9wPC9hPgotCi0KLTw/Y3MgCi0gICAgICAgIGluY2x1ZGU6Ii4uLy4uLy4uLy4uLy4uL2ZyYW1ld29ya3MvYmFzZS9kb2NzL2h0bWwvZ3VpZGUvZ3VpZGVfdG9jLmNzIiA/PgotICAgICAgICAKLQotICAgICAgPC9kaXY+Ci0gICAgPC9kaXY+IDwhLS0gZW5kIHNpZGUtbmF2IC0tPgotICAgIDxzY3JpcHQ+Ci0gICAgICAkKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpIHsKLSAgICAgICAgc2Nyb2xsSW50b1ZpZXcoImRldmRvYy1uYXYiKTsKLSAgICAgICAgfSk7Ci0gICAgPC9zY3JpcHQ+Ci08P2NzIC9kZWYgPz4KLTw/Y3MKLWRlZjpkZXNpZ25fbmF2KCkgPz4KLSAgPGRpdiBjbGFzcz0id3JhcCBjbGVhcmZpeCIgaWQ9ImJvZHktY29udGVudCI+Ci0gICAgPGRpdiBjbGFzcz0iY29sLTMiIGlkPSJzaWRlLW5hdiIgaXRlbXNjb3BlIGl0ZW10eXBlPSJodHRwOi8vc2NoZW1hLm9yZy9TaXRlTmF2aWdhdGlvbkVsZW1lbnQiPgotICAgICAgPGRpdiBpZD0iZGV2ZG9jLW5hdiIgY2xhc3M9InNjcm9sbC1wYW5lIj4KLTxhIGNsYXNzPSJ0b3RvcCIgaHJlZj0iI3RvcCIgZGF0YS1nLWV2ZW50PSJsZWZ0LW5hdi10b3AiPnRvIHRvcDwvYT4KLQotCi08P2NzCi0gICAgICAgIGluY2x1ZGU6Ii4uLy4uLy4uLy4uLy4uL2ZyYW1ld29ya3MvYmFzZS9kb2NzL2h0bWwvZGVzaWduL2Rlc2lnbl90b2MuY3MiID8+Ci0gICAgICAgCi0KLSAgICAgIDwvZGl2PgotICAgIDwvZGl2PiA8IS0tIGVuZCBzaWRlLW5hdiAtLT4KLSAgICA8c2NyaXB0PgotICAgICAgJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24oKSB7Ci0gICAgICAgIHNjcm9sbEludG9WaWV3KCJkZXZkb2MtbmF2Iik7Ci0gICAgICAgIH0pOwotICAgIDwvc2NyaXB0PgotPD9jcyAvZGVmID8+Ci08P2NzCi1kZWY6ZGlzdHJpYnV0ZV9uYXYoKSA/PgotICA8ZGl2IGNsYXNzPSJ3cmFwIGNsZWFyZml4IiBpZD0iYm9keS1jb250ZW50Ij4KLSAgICA8ZGl2IGNsYXNzPSJjb2wtMyIgaWQ9InNpZGUtbmF2IiBpdGVtc2NvcGUgaXRlbXR5cGU9Imh0dHA6Ly9zY2hlbWEub3JnL1NpdGVOYXZpZ2F0aW9uRWxlbWVudCI+Ci0gICAgICA8ZGl2IGlkPSJkZXZkb2MtbmF2IiBjbGFzcz0ic2Nyb2xsLXBhbmUiPgotPGEgY2xhc3M9InRvdG9wIiBocmVmPSIjdG9wIiBkYXRhLWctZXZlbnQ9ImxlZnQtbmF2LXRvcCI+dG8gdG9wPC9hPgotCi08P2NzCi0gICAgICAgIGluY2x1ZGU6Ii4uLy4uLy4uLy4uLy4uL2ZyYW1ld29ya3MvYmFzZS9kb2NzL2h0bWwvZGlzdHJpYnV0ZS9kaXN0cmlidXRlX3RvYy5jcyIgPz4KLSAgICAgICAgCi0KLSAgICAgIDwvZGl2PgotICAgIDwvZGl2PiA8IS0tIGVuZCBzaWRlLW5hdiAtLT4KLSAgICA8c2NyaXB0PgotICAgICAgJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24oKSB7Ci0gICAgICAgIHNjcm9sbEludG9WaWV3KCJkZXZkb2MtbmF2Iik7Ci0gICAgICAgIH0pOwotICAgIDwvc2NyaXB0PgotPD9jcyAvZGVmID8+Ci0KLTw/Y3MKLWRlZjpnb29nbGVfbmF2KCkgPz4KLSAgPGRpdiBjbGFzcz0id3JhcCBjbGVhcmZpeCIgaWQ9ImJvZHktY29udGVudCI+Ci0gICAgPGRpdiBjbGFzcz0iY29sLTQiIGlkPSJzaWRlLW5hdiIgaXRlbXNjb3BlIGl0ZW10eXBlPSJodHRwOi8vc2NoZW1hLm9yZy9TaXRlTmF2aWdhdGlvbkVsZW1lbnQiPgotICAgICAgPGRpdiBpZD0iZGV2ZG9jLW5hdiIgY2xhc3M9InNjcm9sbC1wYW5lIj4KLTxhIGNsYXNzPSJ0b3RvcCIgaHJlZj0iI3RvcCIgZGF0YS1nLWV2ZW50PSJsZWZ0LW5hdi10b3AiPnRvIHRvcDwvYT4KLQotPD9jcwotICAgICAgICBpbmNsdWRlOiIuLi8uLi8uLi8uLi8uLi9mcmFtZXdvcmtzL2Jhc2UvZG9jcy9odG1sL2dvb2dsZS9nb29nbGVfdG9jLmNzIiA/PgotICAgICAgICAKLQotICAgICAgPC9kaXY+Ci0gICAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gICAgICAgc2hvd0dvb2dsZVJlZlRyZWUoKTsKLSAgICAKLSAgICAgIDwvc2NyaXB0PgotICAgIDwvZGl2PiA8IS0tIGVuZCBzaWRlLW5hdiAtLT4KLSAgICA8c2NyaXB0PgotICAgICAgJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24oKSB7Ci0gICAgICAgIHNjcm9sbEludG9WaWV3KCJkZXZkb2MtbmF2Iik7Ci0gICAgICAgIH0pOwotICAgIDwvc2NyaXB0PgotPD9jcyAvZGVmID8+Ci0KLTw/Y3MKLWRlZjphYm91dF9uYXYoKSA/PgotICA8ZGl2IGNsYXNzPSJ3cmFwIGNsZWFyZml4IiBpZD0iYm9keS1jb250ZW50Ij4KLSAgICA8ZGl2IGNsYXNzPSJjb2wtMyIgaWQ9InNpZGUtbmF2IiBpdGVtc2NvcGUgaXRlbXR5cGU9Imh0dHA6Ly9zY2hlbWEub3JnL1NpdGVOYXZpZ2F0aW9uRWxlbWVudCI+Ci0gICAgICA8ZGl2IGlkPSJkZXZkb2MtbmF2IiBjbGFzcz0ic2Nyb2xsLXBhbmUiPgotPGEgY2xhc3M9InRvdG9wIiBocmVmPSIjdG9wIiBkYXRhLWctZXZlbnQ9ImxlZnQtbmF2LXRvcCI+dG8gdG9wPC9hPgotCi08P2NzCi0gICAgICAgIGluY2x1ZGU6Ii4uLy4uLy4uLy4uLy4uL2ZyYW1ld29ya3MvYmFzZS9kb2NzL2h0bWwvYWJvdXQvYWJvdXRfdG9jLmNzIiA/PgotICAgICAgICAKLQotICAgICAgPC9kaXY+Ci0gICAgPC9kaXY+IDwhLS0gZW5kIHNpZGUtbmF2IC0tPgotICAgIDxzY3JpcHQ+Ci0gICAgICAkKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpIHsKLSAgICAgICAgc2Nyb2xsSW50b1ZpZXcoImRldmRvYy1uYXYiKTsKLSAgICAgICAgfSk7Ci0gICAgPC9zY3JpcHQ+Ci08P2NzIC9kZWYgPz4KLTw/Y3MKLWRlZjpkaXN0X21vcmVfbmF2KCkgPz4KLSAgPGRpdiBjbGFzcz0id3JhcCBjbGVhcmZpeCIgaWQ9ImJvZHktY29udGVudCI+Ci0gICAgPGRpdiBjbGFzcz0iY29sLTQiIGlkPSJzaWRlLW5hdiIgaXRlbXNjb3BlIGl0ZW10eXBlPSJodHRwOi8vc2NoZW1hLm9yZy9TaXRlTmF2aWdhdGlvbkVsZW1lbnQiPgotICAgICAgPGRpdiBpZD0iZGV2ZG9jLW5hdiIgY2xhc3M9InNjcm9sbC1wYW5lIj4KLTxhIGNsYXNzPSJ0b3RvcCIgaHJlZj0iI3RvcCIgZGF0YS1nLWV2ZW50PSJsZWZ0LW5hdi10b3AiPnRvIHRvcDwvYT4KLQotCi08P2NzIAotICAgICAgICBpbmNsdWRlOiIuLi8uLi8uLi8uLi8uLi9mcmFtZXdvcmtzL2Jhc2UvZG9jcy9odG1sL2Rpc3RyaWJ1dGUvbW9yZS9tb3JlX3RvYy5jcyIgPz4KLSAgICAgICAgCi0KLSAgICAgIDwvZGl2PgotICAgIDwvZGl2PiA8IS0tIGVuZCBzaWRlLW5hdiAtLT4KLSAgICA8c2NyaXB0PgotICAgICAgJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24oKSB7Ci0gICAgICAgIHNjcm9sbEludG9WaWV3KCJkZXZkb2MtbmF2Iik7Ci0gICAgICAgIH0pOwotICAgIDwvc2NyaXB0PgotOgotCi08P2NzIC9kZWYgPz4KLQotPD9jcyAjIFRoZSBkZWZhdWx0IHNpZGUgbmF2aWdhdGlvbiBmb3IgdGhlIHJlZmVyZW5jZSBkb2NzID8+PD9jcyAKLWRlZjpkZWZhdWx0X2xlZnRfbmF2KCkgPz4KLTw/Y3MgaWY6cmVmZXJlbmNlLmdjbSB8fCByZWZlcmVuY2UuZ21zID8+Ci0gIDw/Y3MgY2FsbDpnb29nbGVfbmF2KCkgPz4KLTw/Y3MgZWxzZSA/PgotICA8ZGl2IGNsYXNzPSJ3cmFwIGNsZWFyZml4IiBpZD0iYm9keS1jb250ZW50Ij4KLSAgICA8ZGl2IGNsYXNzPSJjb2wtNCIgaWQ9InNpZGUtbmF2IiBpdGVtc2NvcGUgaXRlbXR5cGU9Imh0dHA6Ly9zY2hlbWEub3JnL1NpdGVOYXZpZ2F0aW9uRWxlbWVudCI+Ci0gICAgICA8ZGl2IGlkPSJkZXZkb2MtbmF2Ij4KLQotPGEgY2xhc3M9InRvdG9wIiBocmVmPSIjdG9wIiBkYXRhLWctZXZlbnQ9ImxlZnQtbmF2LXRvcCI+dG8gdG9wPC9hPgotICAgICAgPGRpdiBpZD0iYXBpLW5hdi1oZWFkZXIiPgotICAgICAgICA8ZGl2IGlkPSJhcGktbGV2ZWwtdG9nZ2xlIj4KLSAgICAgICAgICA8bGFiZWwgZm9yPSJhcGlMZXZlbENoZWNrYm94IiBjbGFzcz0iZGlzYWJsZWQiPkFQSSBsZXZlbDogPC9sYWJlbD4KLSAgICAgICAgICA8ZGl2IGNsYXNzPSJzZWxlY3Qtd3JhcHBlciI+Ci0gICAgICAgICAgICA8c2VsZWN0IGlkPSJhcGlMZXZlbFNlbGVjdG9yIj4KLSAgICAgICAgICAgICAgPCEtLSBvcHRpb24gZWxlbWVudHMgYWRkZWQgYnkgYnVpbGRBcGlMZXZlbFNlbGVjdG9yKCkgLS0+Ci0gICAgICAgICAgICA8L3NlbGVjdD4KLSAgICAgICAgICA8L2Rpdj4KLSAgICAgICAgPC9kaXY+PCEtLSBlbmQgdG9nZ2xlIC0tPgotICAgICAgICA8ZGl2IGlkPSJhcGktbmF2LXRpdGxlIj5BbmRyb2lkIEFQSXM8L2Rpdj4KLSAgICAgICAgPC9kaXY+PCEtLSBlbmQgbmF2IGhlYWRlciAtLT4KLSAgICAgIDxzY3JpcHQ+Ci0gICAgICAgIHZhciBTSU5DRV9EQVRBID0gWyA8P2NzIAotICAgICAgICAgIGVhY2g6c2luY2UgPSBzaW5jZSA/Pic8P2NzIAotICAgICAgICAgICAgdmFyOnNpbmNlLm5hbWUgPz4nPD9jcyAKLSAgICAgICAgICAgIGlmOiFsYXN0KHNpbmNlKSA/PiwgPD9jcyAvaWYgPz48P2NzCi0gICAgICAgICAgL2VhY2ggCi0gICAgICAgID8+IF07Ci0gICAgICAgIGJ1aWxkQXBpTGV2ZWxTZWxlY3RvcigpOwotICAgICAgPC9zY3JpcHQ+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgIDxkaXYgaWQ9InN3YXBwZXIiPgotICAgICAgICA8ZGl2IGlkPSJuYXYtcGFuZWxzIj4KLSAgICAgICAgICA8ZGl2IGlkPSJyZXNpemUtcGFja2FnZXMtbmF2Ij4KLSAgICAgICAgICAgIDxkaXYgaWQ9InBhY2thZ2VzLW5hdiIgY2xhc3M9InNjcm9sbC1wYW5lIj4KLQotICAgICAgICAgICAgICA8dWw+Ci0gICAgICAgICAgICAgIAk8P2NzIGNhbGw6cGFja2FnZV9saW5rX2xpc3QoZG9jcy5wYWNrYWdlcykgPz4KLSAgICAgICAgICAgICAgPC91bD48YnIvPgotCi0gICAgICAgICAgICA8L2Rpdj4gPCEtLSBlbmQgcGFja2FnZXMtbmF2IC0tPgotICAgICAgICAgIDwvZGl2PiA8IS0tIGVuZCByZXNpemUtcGFja2FnZXMgLS0+Ci0gICAgICAgICAgPGRpdiBpZD0iY2xhc3Nlcy1uYXYiIGNsYXNzPSJzY3JvbGwtcGFuZSI+Ci0KLQotPD9jcyAKLSAgICAgICAgICAgIGlmOnN1YmNvdW50KGNsYXNzLnBhY2thZ2UpID8+Ci0gICAgICAgICAgICA8dWw+Ci0gICAgICAgICAgICAgIDw/Y3MgY2FsbDpsaXN0KCJJbnRlcmZhY2VzIiwgY2xhc3MucGFja2FnZS5pbnRlcmZhY2VzKSA/PgotICAgICAgICAgICAgICA8P2NzIGNhbGw6bGlzdCgiQ2xhc3NlcyIsIGNsYXNzLnBhY2thZ2UuY2xhc3NlcykgPz4KLSAgICAgICAgICAgICAgPD9jcyBjYWxsOmxpc3QoIkVudW1zIiwgY2xhc3MucGFja2FnZS5lbnVtcykgPz4KLSAgICAgICAgICAgICAgPD9jcyBjYWxsOmxpc3QoIkV4Y2VwdGlvbnMiLCBjbGFzcy5wYWNrYWdlLmV4Y2VwdGlvbnMpID8+Ci0gICAgICAgICAgICAgIDw/Y3MgY2FsbDpsaXN0KCJFcnJvcnMiLCBjbGFzcy5wYWNrYWdlLmVycm9ycykgPz4KLSAgICAgICAgICAgIDwvdWw+PD9jcyAKLSAgICAgICAgICAgIGVsaWY6c3ViY291bnQocGFja2FnZSkgPz4KLSAgICAgICAgICAgIDx1bD4KLSAgICAgICAgICAgICAgPD9jcyBjYWxsOmNsYXNzX2xpbmtfbGlzdCgiSW50ZXJmYWNlcyIsIHBhY2thZ2UuaW50ZXJmYWNlcykgPz4KLSAgICAgICAgICAgICAgPD9jcyBjYWxsOmNsYXNzX2xpbmtfbGlzdCgiQ2xhc3NlcyIsIHBhY2thZ2UuY2xhc3NlcykgPz4KLSAgICAgICAgICAgICAgPD9jcyBjYWxsOmNsYXNzX2xpbmtfbGlzdCgiRW51bXMiLCBwYWNrYWdlLmVudW1zKSA/PgotICAgICAgICAgICAgICA8P2NzIGNhbGw6Y2xhc3NfbGlua19saXN0KCJFeGNlcHRpb25zIiwgcGFja2FnZS5leGNlcHRpb25zKSA/PgotICAgICAgICAgICAgICA8P2NzIGNhbGw6Y2xhc3NfbGlua19saXN0KCJFcnJvcnMiLCBwYWNrYWdlLmVycm9ycykgPz4KLSAgICAgICAgICAgIDwvdWw+PD9jcyAKLSAgICAgICAgICAgIGVsc2UgPz4KLSAgICAgICAgICAgICAgPHAgc3R5bGU9InBhZGRpbmc6MTBweCI+U2VsZWN0IGEgcGFja2FnZSB0byB2aWV3IGl0cyBtZW1iZXJzPC9wPjw/Y3MgCi0gICAgICAgICAgICAvaWYgPz48YnIvPgotICAgICAgICAKLQotICAgICAgICAgIDwvZGl2PjwhLS0gZW5kIGNsYXNzZXMgLS0+Ci0gICAgICAgIDwvZGl2PjwhLS0gZW5kIG5hdi1wYW5lbHMgLS0+Ci0gICAgICAgIDxkaXYgaWQ9Im5hdi10cmVlIiBzdHlsZT0iZGlzcGxheTpub25lIiBjbGFzcz0ic2Nyb2xsLXBhbmUiPgotICAgICAgICAgIDxkaXYgaWQ9InRyZWUtbGlzdCI+PC9kaXY+Ci0gICAgICAgIDwvZGl2PjwhLS0gZW5kIG5hdi10cmVlIC0tPgotICAgICAgPC9kaXY+PCEtLSBlbmQgc3dhcHBlciAtLT4KLSAgICAgIDxkaXYgaWQ9Im5hdi1zd2FwIj4KLSAgICAgIDxhIGNsYXNzPSJmdWxsc2NyZWVuIj5mdWxsc2NyZWVuPC9hPgotICAgICAgPGEgaHJlZj0nIycgb25jbGljaz0nc3dhcE5hdigpO3JldHVybiBmYWxzZTsnPjxzcGFuIGlkPSd0cmVlLWxpbmsnPlVzZSBUcmVlIE5hdmlnYXRpb248L3NwYW4+PHNwYW4gaWQ9J3BhbmVsLWxpbmsnIHN0eWxlPSdkaXNwbGF5Om5vbmUnPlVzZSBQYW5lbCBOYXZpZ2F0aW9uPC9zcGFuPjwvYT4KLSAgICAgIDwvZGl2PgotICAgIDwvZGl2PiA8IS0tIGVuZCBkZXZkb2MtbmF2IC0tPgotICAgIDwvZGl2PiA8IS0tIGVuZCBzaWRlLW5hdiAtLT4KLSAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gICAgICAvLyBpbml0IGZ1bGxzY3JlZW4gYmFzZWQgb24gdXNlciBwcmVmCi0gICAgICB2YXIgZnVsbHNjcmVlbiA9IHJlYWRDb29raWUoImZ1bGxzY3JlZW4iKTsKLSAgICAgIGlmIChmdWxsc2NyZWVuICE9IDApIHsKLSAgICAgICAgaWYgKGZ1bGxzY3JlZW4gPT0gImZhbHNlIikgewotICAgICAgICAgIHRvZ2dsZUZ1bGxzY3JlZW4oZmFsc2UpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHRvZ2dsZUZ1bGxzY3JlZW4odHJ1ZSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIC8vIGluaXQgbmF2IHZlcnNpb24gZm9yIG1vYmlsZQotICAgICAgaWYgKGlzTW9iaWxlKSB7Ci0gICAgICAgIHN3YXBOYXYoKTsgLy8gdHJlZSB2aWV3IHNob3VsZCBiZSB1c2VkIG9uIG1vYmlsZQotICAgICAgICAkKCcjbmF2LXN3YXAnKS5oaWRlKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBjaG9vc2VEZWZhdWx0TmF2KCk7Ci0gICAgICAgIGlmICgkKCIjbmF2LXRyZWUiKS5pcygnOnZpc2libGUnKSkgewotICAgICAgICAgIGluaXRfZGVmYXVsdF9uYXZ0cmVlKCI8P2NzIHZhcjp0b3Jvb3QgPz4iKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgLy8gc2Nyb2xsIHRoZSBzZWxlY3RlZCBwYWdlIGludG8gdmlldwotICAgICAgJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24oKSB7Ci0gICAgICAgIHNjcm9sbEludG9WaWV3KCJwYWNrYWdlcy1uYXYiKTsKLSAgICAgICAgc2Nyb2xsSW50b1ZpZXcoImNsYXNzZXMtbmF2Iik7Ci0gICAgICAgIH0pOwotICAgIDwvc2NyaXB0PgotPD9jcyAvaWYgPz4KLSAgICA8P2NzIAotL2RlZiA/PgotCi08P2NzIAotZGVmOmN1c3RvbV9sZWZ0X25hdigpID8+PD9jcwotICBpZjpmdWxscGFnZSA/Pjw/Y3MgCi0gICAgY2FsbDpmdWxscGFnZSgpID8+PD9jcyAKLSAgZWxpZjpndWlkZSA/Pjw/Y3MgCi0gICAgY2FsbDpndWlkZV9uYXYoKSA/Pjw/Y3MgCi0gIGVsaWY6ZGVzaWduID8+PD9jcwotICAgIGNhbGw6ZGVzaWduX25hdigpID8+PD9jcyAKLSAgZWxpZjp0cmFpbmluZyA/Pjw/Y3MgCi0gICAgY2FsbDp0cmFpbmluZ19uYXYoKSA/Pjw/Y3MgCi0gIGVsaWY6dG9vbHMgPz48P2NzIAotICAgIGNhbGw6dG9vbHNfbmF2KCkgPz48P2NzCi0gIGVsaWY6Z29vZ2xlID8+PD9jcyAKLSAgICBjYWxsOmdvb2dsZV9uYXYoKSA/Pjw/Y3MgCi0gIGVsaWY6bW9yZSA/Pjw/Y3MgCi0gICAgY2FsbDpkaXN0X21vcmVfbmF2KCkgPz48P2NzCi0gIGVsaWY6ZGlzdHJpYnV0ZSA/Pjw/Y3MgCi0gICAgY2FsbDpkaXN0cmlidXRlX25hdigpID8+PD9jcyAKLSAgZWxpZjphYm91dCA/Pjw/Y3MgCi0gICAgY2FsbDphYm91dF9uYXYoKSA/Pjw/Y3MgCi0gIGVsc2UgPz48P2NzIAotICAgIGNhbGw6ZGVmYXVsdF9sZWZ0X25hdigpID8+IDw/Y3MgCi0gIC9pZiA/Pjw/Y3MgCi0vZGVmID8+Ci0KLTw/Y3MgIyBhcHBlYXJzIGF0IHRoZSBib3R0b20gb2YgZXZlcnkgcGFnZSA/Pjw/Y3MgCi1kZWY6Y3VzdG9tX2NjX2NvcHlyaWdodCgpID8+Ci0gIEV4Y2VwdCBhcyBub3RlZCwgdGhpcyBjb250ZW50IGlzIAotICBsaWNlbnNlZCB1bmRlciA8YSBocmVmPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9ieS8yLjUvIj4KLSAgQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbiAyLjU8L2E+LiBGb3IgZGV0YWlscyBhbmQgCi0gIHJlc3RyaWN0aW9ucywgc2VlIHRoZSA8YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5saWNlbnNlLmh0bWwiPkNvbnRlbnQgCi0gIExpY2Vuc2U8L2E+Ljw/Y3MgCi0vZGVmID8+Ci0KLTw/Y3MgCi1kZWY6Y3VzdG9tX2NvcHlyaWdodCgpID8+Ci0gIEV4Y2VwdCBhcyBub3RlZCwgdGhpcyBjb250ZW50IGlzIGxpY2Vuc2VkIHVuZGVyIDxhCi0gIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+QXBhY2hlIDIuMDwvYT4uIAotICBGb3IgZGV0YWlscyBhbmQgcmVzdHJpY3Rpb25zLCBzZWUgdGhlIDxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PmxpY2Vuc2UuaHRtbCI+Ci0gIENvbnRlbnQgTGljZW5zZTwvYT4uPD9jcyAKLS9kZWYgPz4KLQotPD9jcyAKLWRlZjpjdXN0b21fZm9vdGVybGlua3MoKSA/PgotICA8cD4KLSAgICA8YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5zb3VyY2UvaW5kZXguaHRtbCI+QWJvdXQgQW5kcm9pZDwvYT4mbmJzcDsmbmJzcDt8Jm5ic3A7Ci0gICAgPGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+c291cmNlL2NvbW11bml0eS5odG1sIj5Db21tdW5pdHk8L2E+Jm5ic3A7Jm5ic3A7fCZuYnNwOwotICAgIDxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PmxlZ2FsLmh0bWwiPkxlZ2FsPC9hPiZuYnNwOyZuYnNwO3wmbmJzcDsKLSAgPC9wPjw/Y3MgCi0vZGVmID8+Ci0KLTw/Y3MgIyBhcHBlYXJzIG9uIHRoZSByaWdodCBzaWRlIG9mIHRoZSBibHVlIGJhciBhdCB0aGUgYm90dG9tIG9mZiBldmVyeSBwYWdlID8+PD9jcyAKLQotZGVmOmN1c3RvbV9idWlsZGluZm8oKSA/Pjw/Y3MKLSAgaWY6IWdvb2dsZSAmJiAhcmVmZXJlbmNlLmdtcyAmJiAhcmVmZXJlbmNlLmdjbT8+Ci0gICAgQW5kcm9pZCA8P2NzIHZhcjpzZGsudmVyc2lvbiA/PiZuYnNwO3I8P2NzIHZhcjpzZGsucmVsLmlkID8+ICZtZGFzaDsgPD9jcwotICAvaWYgPz4KLTxzY3JpcHQgc3JjPSI8P2NzIHZhcjp0b3Jvb3QgPz50aW1lc3RhbXAuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+Ci08c2NyaXB0PmRvY3VtZW50LndyaXRlKEJVSUxEX1RJTUVTVEFNUCk8L3NjcmlwdD4KLTw/Y3MgL2RlZiA/PgotCi0KLQotPD9jcyAjLS0tLS0tLS0tLS0tLS0tLS0tLSBzLmEuYyBzcGVjaWZpYyB0ZW1wbGF0aW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT8+Ci0KLTw/Y3MgCi1kZWY6c2FjX2xlZnRfbmF2KCkgPz4KLSAgPD9jcyBpZjpkZXZpY2VzID8+Ci0gICAgPD9jcyBjYWxsOmRldmljZXNfbmF2KCkgPz4KLSAgPD9jcyBlbGlmOmNvbXBhdGliaWxpdHkgPz4KLSAgICA8P2NzIGNhbGw6Y29tcGF0aWJpbGl0eV9uYXYoKSA/PgotICA8P2NzIGVsaWY6c291cmNlID8+Ci0gICAgPD9jcyBjYWxsOnNvdXJjZV9uYXYoKSA/PgotICA8P2NzIGVsaWY6c2VjdXJpdHkgPz4KLSAgICA8P2NzIGNhbGw6c2VjdXJpdHlfbmF2KCkgPz4KLSAgPD9jcyBlbGlmOnJlZmVyZW5jZSA/PgotICAgIDw/Y3MgY2FsbDpkZWZhdWx0X2xlZnRfbmF2KCkgPz4KLSAgPD9jcyAvaWYgPz4KLTw/Y3MgL2RlZiA/PgotCi08P2NzCi1kZWY6ZGV2aWNlc19uYXYoKSA/PgotICA8ZGl2IGNsYXNzPSJ3cmFwIGNsZWFyZml4IiBpZD0iYm9keS1jb250ZW50Ij4KLSAgICA8ZGl2IGNsYXNzPSJjb2wtNCIgaWQ9InNpZGUtbmF2IiBpdGVtc2NvcGUgaXRlbXR5cGU9Imh0dHA6Ly9zY2hlbWEub3JnL1NpdGVOYXZpZ2F0aW9uRWxlbWVudCI+Ci0gICAgICA8ZGl2IGlkPSJkZXZkb2MtbmF2IiBjbGFzcz0ic2Nyb2xsLXBhbmUiPgotPGEgY2xhc3M9InRvdG9wIiBocmVmPSIjdG9wIiBkYXRhLWctZXZlbnQ9ImxlZnQtbmF2LXRvcCI+dG8gdG9wPC9hPgotCi08P2NzIAotICAgICAgICBpbmNsdWRlOiIuLi8uLi8uLi8uLi8uLi9kb2NzL3NvdXJjZS5hbmRyb2lkLmNvbS9zcmMvZGV2aWNlcy9kZXZpY2VzX3RvYy5jcyIgPz4KLQotICAgICAgPC9kaXY+Ci0gICAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gICAgICAgIHNob3dUcmFkZWZlZFJlZlRyZWUoKTsKLSAgICAgIDwvc2NyaXB0PgotICAgIDwvZGl2PiA8IS0tIGVuZCBzaWRlLW5hdiAtLT4KLSAgICA8c2NyaXB0PgotICAgICAgJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24oKSB7Ci0gICAgICAgIHNjcm9sbEludG9WaWV3KCJkZXZkb2MtbmF2Iik7Ci0gICAgICAgIH0pOwotICAgIDwvc2NyaXB0PgotPD9jcyAvZGVmID8+Ci0KLTw/Y3MKLWRlZjpjb21wYXRpYmlsaXR5X25hdigpID8+Ci0gIDxkaXYgY2xhc3M9IndyYXAgY2xlYXJmaXgiIGlkPSJib2R5LWNvbnRlbnQiPgotICAgIDxkaXYgY2xhc3M9ImNvbC00IiBpZD0ic2lkZS1uYXYiIGl0ZW1zY29wZSBpdGVtdHlwZT0iaHR0cDovL3NjaGVtYS5vcmcvU2l0ZU5hdmlnYXRpb25FbGVtZW50Ij4KLSAgICAgIDxkaXYgaWQ9ImRldmRvYy1uYXYiIGNsYXNzPSJzY3JvbGwtcGFuZSI+Ci08YSBjbGFzcz0idG90b3AiIGhyZWY9IiN0b3AiIGRhdGEtZy1ldmVudD0ibGVmdC1uYXYtdG9wIj50byB0b3A8L2E+Ci0KLTw/Y3MgCi0gICAgICAgIGluY2x1ZGU6Ii4uLy4uLy4uLy4uLy4uL2RvY3Mvc291cmNlLmFuZHJvaWQuY29tL3NyYy9jb21wYXRpYmlsaXR5L2NvbXBhdGliaWxpdHlfdG9jLmNzIiA/PgotCi0gICAgICA8L2Rpdj4KLSAgICA8L2Rpdj4gPCEtLSBlbmQgc2lkZS1uYXYgLS0+Ci0gICAgPHNjcmlwdD4KLSAgICAgICQoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uKCkgewotICAgICAgICBzY3JvbGxJbnRvVmlldygiZGV2ZG9jLW5hdiIpOwotICAgICAgICB9KTsKLSAgICA8L3NjcmlwdD4KLTw/Y3MgL2RlZiA/PgotCi08P2NzCi1kZWY6c291cmNlX25hdigpID8+Ci0gIDxkaXYgY2xhc3M9IndyYXAgY2xlYXJmaXgiIGlkPSJib2R5LWNvbnRlbnQiPgotICAgIDxkaXYgY2xhc3M9ImNvbC00IiBpZD0ic2lkZS1uYXYiIGl0ZW1zY29wZSBpdGVtdHlwZT0iaHR0cDovL3NjaGVtYS5vcmcvU2l0ZU5hdmlnYXRpb25FbGVtZW50Ij4KLSAgICAgIDxkaXYgaWQ9ImRldmRvYy1uYXYiIGNsYXNzPSJzY3JvbGwtcGFuZSI+Ci08YSBjbGFzcz0idG90b3AiIGhyZWY9IiN0b3AiIGRhdGEtZy1ldmVudD0ibGVmdC1uYXYtdG9wIj50byB0b3A8L2E+Ci0KLTw/Y3MgCi0gICAgICAgIGluY2x1ZGU6Ii4uLy4uLy4uLy4uLy4uL2RvY3Mvc291cmNlLmFuZHJvaWQuY29tL3NyYy9zb3VyY2Uvc291cmNlX3RvYy5jcyIgPz4KLQotICAgICAgPC9kaXY+Ci0gICAgPC9kaXY+IDwhLS0gZW5kIHNpZGUtbmF2IC0tPgotICAgIDxzY3JpcHQ+Ci0gICAgICAkKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpIHsKLSAgICAgICAgc2Nyb2xsSW50b1ZpZXcoImRldmRvYy1uYXYiKTsKLSAgICAgICAgfSk7Ci0gICAgPC9zY3JpcHQ+Ci08P2NzIC9kZWYgPz4KLQotPD9jcwotZGVmOnNlY3VyaXR5X25hdigpID8+Ci0gIDxkaXYgY2xhc3M9IndyYXAgY2xlYXJmaXgiIGlkPSJib2R5LWNvbnRlbnQiPgotICAgIDxkaXYgY2xhc3M9ImNvbC00IiBpZD0ic2lkZS1uYXYiIGl0ZW1zY29wZSBpdGVtdHlwZT0iaHR0cDovL3NjaGVtYS5vcmcvU2l0ZU5hdmlnYXRpb25FbGVtZW50Ij4KLSAgICAgIDxkaXYgaWQ9ImRldmRvYy1uYXYiIGNsYXNzPSJzY3JvbGwtcGFuZSI+Ci08YSBjbGFzcz0idG90b3AiIGhyZWY9IiN0b3AiIGRhdGEtZy1ldmVudD0ibGVmdC1uYXYtdG9wIj50byB0b3A8L2E+Ci0KLTw/Y3MgCi0gICAgICAgIGluY2x1ZGU6Ii4uLy4uLy4uLy4uLy4uL2RvY3Mvc291cmNlLmFuZHJvaWQuY29tL3NyYy9zZWN1cml0eS9zZWN1cml0eV90b2MuY3MiID8+Ci0KLSAgICAgIDwvZGl2PgotICAgIDwvZGl2PiA8IS0tIGVuZCBzaWRlLW5hdiAtLT4KLSAgICA8c2NyaXB0PgotICAgICAgJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24oKSB7Ci0gICAgICAgIHNjcm9sbEludG9WaWV3KCJkZXZkb2MtbmF2Iik7Ci0gICAgICAgIH0pOwotICAgIDwvc2NyaXB0PgotPD9jcyAvZGVmID8+Ci0KLQpkaWZmIC0tZ2l0IGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9kYXRhLmhkZiBiL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvZGF0YS5oZGYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0MTFiNzguLjAwMDAwMDAKLS0tIGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9kYXRhLmhkZgorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotdGVtcGxhdGUgewotICAgIHdoaWNoID0gbm9ybWFsCi19Ci0KZGlmZiAtLWdpdCBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvZGVzaWducGFnZS5jcyBiL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvZGVzaWducGFnZS5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVmMDNmZi4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Rlc2lnbnBhZ2UuY3MKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi08IURPQ1RZUEUgaHRtbD4KLTw/Y3MgaW5jbHVkZToibWFjcm9zLmNzIiA/PgotPGh0bWwgbGFuZz0iZW4iPgotICA8aGVhZD4KLSAgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCI+Ci0gICAgPHRpdGxlPgotICAgICAgQW5kcm9pZCBEZXNpZ248P2NzIGlmOnBhZ2UudGl0bGUgPz4gLSA8P2NzIHZhcjpwYWdlLnRpdGxlID8+PD9jcyAvaWYgPz4KLSAgICA8L3RpdGxlPgotICAgIDxsaW5rIHJlbD0ic2hvcnRjdXQgaWNvbiIgdHlwZT0iaW1hZ2UveC1pY29uIiBocmVmPSIvZmF2aWNvbi5pY28iPgotICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cDovL2ZvbnRzLmdvb2dsZWFwaXMuY29tL2Nzcz9mYW1pbHk9Um9ib3RvOnJlZ3VsYXIsbWVkaXVtLHRoaW4saXRhbGljLG1lZGl1bWl0YWxpYyI+Ci0gICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5hc3NldHMveXVpLTMuMy4wLXJlc2V0LW1pbi5jc3MiPgotICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+YXNzZXRzL2Rlc2lnbi9kZWZhdWx0LmNzcyI+Ci0gICAgPHNjcmlwdCBzcmM9Ijw/Y3MgdmFyOnRvcm9vdCA/PmFzc2V0cy9qcXVlcnktMS42LjIubWluLmpzIj48L3NjcmlwdD4KLSAgICA8c2NyaXB0PnZhciBTSVRFX1JPT1QgPSAnPD9jcyB2YXI6dG9yb290ID8+ZGVzaWduJzs8L3NjcmlwdD4KLSAgICA8c2NyaXB0IHNyYz0iPD9jcyB2YXI6dG9yb290ID8+YXNzZXRzL2Rlc2lnbi9kZWZhdWx0LmpzIj48L3NjcmlwdD4KLSAgPC9oZWFkPgotICA8Ym9keSBjbGFzcz0iZ2MtZG9jdW1lbnRhdGlvbiAKLSAgICA8P2NzIGlmOihndWlkZXx8ZGV2ZWxvcHx8dHJhaW5pbmd8fHJlZmVyZW5jZXx8dG9vbHN8fHNkaykgPz5kZXZlbG9wPD9jcwotICAgIGVsaWY6ZGVzaWduID8+ZGVzaWduPD9jcwotICAgIGVsaWY6ZGlzdHJpYnV0ZSA/PmRpc3RyaWJ1dGU8P2NzCi0gICAgL2lmID8+IiBpdGVtc2NvcGUgaXRlbXR5cGU9Imh0dHA6Ly9zY2hlbWEub3JnL0FydGljbGUiPgotICAgIDxhIG5hbWU9InRvcCI+PC9hPgotCi0gICAgPGRpdiBpZD0icGFnZS1jb250YWluZXIiPgotCi0gICAgICA8ZGl2IGlkPSJwYWdlLWhlYWRlciIgaXRlbXNjb3BlIGl0ZW10eXBlPSJodHRwOi8vc2NoZW1hLm9yZy9XUEhlYWRlciI+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+ZGVzaWduL2luZGV4Lmh0bWwiPkFuZHJvaWQgRGVzaWduPC9hPjwvZGl2PgotCi0gICAgICA8ZGl2IGlkPSJtYWluLXJvdyI+Ci0KLSAgICAgICAgPGRpdiBpZD0ibmF2LWNvbnRhaW5lciIgaXRlbXNjb3BlIGl0ZW10eXBlPSJodHRwOi8vc2NoZW1hLm9yZy9TaXRlTmF2aWdhdGlvbkVsZW1lbnQiPgotCi0gICAgICAgIDw/Y3MgY2FsbDpkZXNpZ25fbmF2KCkgPz4KLQotICAgICAgICA8L2Rpdj4KLQotICAgICAgICA8ZGl2IGlkPSJjb250ZW50Ij4KLQotPD9jcyBpZjpoZWFkZXIuaGlkZSA/PgotPD9jcyBlbHNlID8+Ci08ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1yb3cgY29udGVudC1oZWFkZXIgPD9jcyBpZjpoZWFkZXIuanVzdExpbmtzID8+anVzdC1saW5rczw/Y3MgL2lmID8+Ij4KLSAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tOSI+Ci0gICAgPD9jcyBpZjpoZWFkZXIuanVzdExpbmtzID8+Jm5ic3A7Ci0gICAgICA8P2NzIGVsaWY6aGVhZGVyLnRpdGxlID8+PGgyPjw/Y3MgdmFyOmhlYWRlci50aXRsZSA/PjwvaDI+Ci0gICAgICAgICAgICAgICAgICAgPD9jcyBlbHNlID8+PGgyPjw/Y3MgdmFyOnBhZ2UudGl0bGUgPz48L2gyPgotICAgIDw/Y3MgL2lmID8+Ci0gIDwvZGl2PgotICA8ZGl2IGNsYXNzPSJwYWdpbmctbGlua3MgbGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNCIgaXRlbXNjb3BlIGl0ZW10eXBlPSJodHRwOi8vc2NoZW1hLm9yZy9TaXRlTmF2aWdhdGlvbkVsZW1lbnQiPgotICAgIDxhIGhyZWY9IiMiIGNsYXNzPSJwcmV2LXBhZ2UtbGluayI+UHJldmlvdXM8L2E+Ci0gICAgPGEgaHJlZj0iIyIgY2xhc3M9Im5leHQtcGFnZS1saW5rIj5OZXh0PC9hPgotICA8L2Rpdj4KLTwvZGl2PgotPD9jcyAvaWYgPz4KLQotPD9jcyBjYWxsOnRhZ19saXN0KHJvb3QuZGVzY3IpID8+Ci0KLTw/Y3MgaWY6Zm9vdGVyLmhpZGUgPz4KLTw/Y3MgZWxzZSA/PgotPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtcm93IGNvbnRlbnQtZm9vdGVyIiBpdGVtc2NvcGUgaXRlbXR5cGU9Imh0dHA6Ly9zY2hlbWEub3JnL1NpdGVOYXZpZ2F0aW9uRWxlbWVudCI+Ci0gIDxkaXYgY2xhc3M9InBhZ2luZy1saW5rcyBsYXlvdXQtY29udGVudC1jb2wgc3Bhbi05Ij4mbmJzcDs8L2Rpdj4KLSAgPGRpdiBjbGFzcz0icGFnaW5nLWxpbmtzIGxheW91dC1jb250ZW50LWNvbCBzcGFuLTQiPgotICAgIDxhIGhyZWY9IiMiIGNsYXNzPSJwcmV2LXBhZ2UtbGluayI+UHJldmlvdXM8L2E+Ci0gICAgPGEgaHJlZj0iIyIgY2xhc3M9Im5leHQtcGFnZS1saW5rIj5OZXh0PC9hPgotICA8L2Rpdj4KLTwvZGl2PgotPD9jcyAvaWYgPz4KLQotICAgICAgICA8L2Rpdj4KLQotICAgICAgPC9kaXY+Ci0KLSAgICAgIDxkaXYgaWQ9InBhZ2UtZm9vdGVyIiBpdGVtc2NvcGUgaXRlbXR5cGU9Imh0dHA6Ly9zY2hlbWEub3JnL1dQRm9vdGVyIj4KLQotICAgICAgICA8cCBpZD0iY29weXJpZ2h0Ij4KLSAgICAgICAgICBFeGNlcHQgYXMgbm90ZWQsIHRoaXMgY29udGVudCBpcyBsaWNlbnNlZCB1bmRlcgotICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2J5LzIuNS8iPgotICAgICAgICAgIENyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24gMi41PC9hPi48YnI+Ci0gICAgICAgICAgRm9yIGRldGFpbHMgYW5kIHJlc3RyaWN0aW9ucywgc2VlIHRoZQotICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vbGljZW5zZS5odG1sIj5Db250ZW50IExpY2Vuc2U8L2E+LgotICAgICAgICA8L3A+Ci0KLSAgICAgICAgPHA+Ci0gICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5hbmRyb2lkLmNvbS90ZXJtcy5odG1sIj5TaXRlIFRlcm1zIG9mIFNlcnZpY2U8L2E+ICZuZGFzaDsKLSAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LmFuZHJvaWQuY29tL3ByaXZhY3kuaHRtbCI+UHJpdmFjeSBQb2xpY3k8L2E+ICZuZGFzaDsKLSAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LmFuZHJvaWQuY29tL2JyYW5kaW5nLmh0bWwiPkJyYW5kIEd1aWRlbGluZXM8L2E+Ci0gICAgICAgIDwvcD4KLQotICAgICAgPC9kaXY+Ci0gICAgPC9kaXY+Ci0gIDwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvZG9jcGFnZS5jcyBiL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvZG9jcGFnZS5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2QxMjBiNi4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2RvY3BhZ2UuY3MKKysrIC9kZXYvbnVsbApAQCAtMSwxNjQgKzAsMCBAQAotPD9jcyBpbmNsdWRlOiJkb2N0eXBlLmNzIiA/PgotPD9jcyBpbmNsdWRlOiJtYWNyb3MuY3MiID8+Ci08aHRtbDw/Y3MgaWY6ZGV2c2l0ZSA/PiBkZXZzaXRlPD9jcyAvaWYgPz4+Ci08P2NzIGluY2x1ZGU6ImhlYWRfdGFnLmNzIiA/PgotPGJvZHkgY2xhc3M9ImdjLWRvY3VtZW50YXRpb24gPD9jcyBpZjooZ29vZ2xlIHx8IHJlZmVyZW5jZS5nbXMgfHwgcmVmZXJlbmNlLmdjbSkgPz5nb29nbGU8P2NzIC9pZiA/PgotICA8P2NzIGlmOihndWlkZXx8ZGV2ZWxvcHx8dHJhaW5pbmd8fHJlZmVyZW5jZXx8dG9vbHN8fHNkaykgPz5kZXZlbG9wPD9jcyBpZjpndWlkZSA/PiBndWlkZTw/Y3MgL2lmID8+PD9jcwotICBlbGlmOmFib3V0ID8+YWJvdXQ8P2NzCi0gIGVsaWY6ZGVzaWduID8+ZGVzaWduPD9jcwotICBlbGlmOmRpc3RyaWJ1dGUgPz5kaXN0cmlidXRlPD9jcwotICAvaWYgPz48P2NzCi0gIGlmOnBhZ2UudHJhaW5pbmdjb3Vyc2UgPz4gdHJhaW5pbmdjb3Vyc2U8P2NzIC9pZiA/PiIgaXRlbXNjb3BlIGl0ZW10eXBlPSJodHRwOi8vc2NoZW1hLm9yZy9BcnRpY2xlIj4KLTxhIG5hbWU9InRvcCI+PC9hPgotPD9jcyBpbmNsdWRlOiJoZWFkZXIuY3MiID8+Ci0KLTxkaXYgPD9jcyBpZjpmdWxscGFnZQotPz5jbGFzcz0iZnVsbHBhZ2UiPD9jcyBlbGlmOmRlc2lnbnx8dG9vbHN8fGFib3V0fHxzZGt8fGRpc3RyaWJ1dGUKLT8+Y2xhc3M9ImNvbC0xMyIgaWQ9ImRvYy1jb2wiPD9jcyBlbHNlIAotPz5jbGFzcz0iY29sLTEyIiBpZD0iZG9jLWNvbCI8P2NzIC9pZiA/PiA+Ci0KLTw/Y3MgaWY6KGRlc2lnbnx8dHJhaW5pbmd8fHdhbGt0aHJ1KSAmJiAhcGFnZS50cmFpbmluZ2NvdXJzZSAmJiAhcGFnZS5hcnRpY2xlID8+PD9jcyAjIGhlYWRlciBsb2dpYyBmb3IgZG9jcyB0aGF0IHByb3ZpZGUgcHJldmlvdXMvbmV4dCBidXR0b25zID8+Ci0gIDw/Y3MgaWY6aGVhZGVyLmhpZGUgPz4KLSAgPD9jcyBlbHNlID8+Ci0gIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LXJvdyBjb250ZW50LWhlYWRlciA8P2NzIGlmOmhlYWRlci5qdXN0TGlua3MgPz5qdXN0LWxpbmtzPD9jcyAvaWYgPz4iPgotICAgIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCA8P2NzIGlmOnRyYWluaW5nID8+c3Bhbi03PD9jcyBlbHNlID8+c3Bhbi05PD9jcyAvaWYgPz4iPgotICAgICAgPD9jcyBpZjpoZWFkZXIuanVzdExpbmtzID8+Jm5ic3A7Ci0gICAgICA8P2NzIGVsc2UgPz48aDEgaXRlbXByb3A9Im5hbWUiPjw/Y3MgdmFyOnBhZ2UudGl0bGUgPz48L2gxPgotICAgICAgPD9jcyAvaWYgPz4KLSAgICA8L2Rpdj4KLSAgICA8P2NzIGlmOnRyYWluaW5nID8+Ci0gICAgICA8ZGl2IGNsYXNzPSJ0cmFpbmluZy1uYXYtdG9wIGxheW91dC1jb250ZW50LWNvbCBzcGFuLTUiIGl0ZW1zY29wZSBpdGVtdHlwZT0iaHR0cDovL3NjaGVtYS5vcmcvU2l0ZU5hdmlnYXRpb25FbGVtZW50Ij4KLSAgICAgICAgPGEgaHJlZj0iIyIgY2xhc3M9InByZXYtcGFnZS1saW5rIGhpZGUiCi0gICAgICAgICAgICB6aC1UVy1sYW5nPSLkuIrkuIDloILoqrIiCi0gICAgICAgICAgICB6aC1DTi1sYW5nPSLkuIrkuIDor74iCi0gICAgICAgICAgICBydS1sYW5nPSLQn9GA0LXQtNGL0LTRg9GJ0LjQuSIKLSAgICAgICAgICAgIGtvLWxhbmc9IuydtOyghCIKLSAgICAgICAgICAgIGphLWxhbmc9IuWJjeOBuCIKLSAgICAgICAgICAgIGVzLWxhbmc9IkFudGVyaW9yIgotICAgICAgICAgICAgPlByZXZpb3VzPC9hPgotICAgICAgICA8YSBocmVmPSIjIiBjbGFzcz0ibmV4dC1wYWdlLWxpbmsgaGlkZSIKLSAgICAgICAgICAgIHpoLVRXLWxhbmc9IuS4i+S4gOWgguiqsiIKLSAgICAgICAgICAgIHpoLUNOLWxhbmc9IuS4i+S4gOivviIKLSAgICAgICAgICAgIHJ1LWxhbmc9ItCh0LvQtdC00YPRjtGJ0LjQuSIKLSAgICAgICAgICAgIGtvLWxhbmc9IuuLpOydjCIKLSAgICAgICAgICAgIGphLWxhbmc9IuasoeOBuCIKLSAgICAgICAgICAgIGVzLWxhbmc9IlNpZ3VpZW50ZSIKLSAgICAgICAgICAgID5OZXh0PC9hPgotICAgICAgICA8YSBocmVmPSIjIiBjbGFzcz0ic3RhcnQtY2xhc3MtbGluayBoaWRlIgotICAgICAgICAgICAgemgtVFctbGFuZz0i6ZaL5aeL5LiK6KqyIgotICAgICAgICAgICAgemgtQ04tbGFuZz0i5byA5aeLIgotICAgICAgICAgICAgcnUtbGFuZz0i0J3QsNGH0LDQu9C+INGA0LDQsdC+0YLRiyIKLSAgICAgICAgICAgIGtvLWxhbmc9IuyLnOyeke2VmOq4sCIKLSAgICAgICAgICAgIGphLWxhbmc9IumWi+Wni+OBmeOCiyIKLSAgICAgICAgICAgIGVzLWxhbmc9IkVtcGV6YXIiCi0gICAgICAgICAgICA+R2V0IHN0YXJ0ZWQ8L2E+Ci0gICAgICA8L2Rpdj4KLSAgICA8P2NzIGVsaWY6IXBhZ2UudHJhaW5pbmdjb3Vyc2UgPz4KLSAgICAgIDxkaXYgY2xhc3M9InBhZ2luZy1saW5rcyBsYXlvdXQtY29udGVudC1jb2wgc3Bhbi00IiBpdGVtc2NvcGUgaXRlbXR5cGU9Imh0dHA6Ly9zY2hlbWEub3JnL1NpdGVOYXZpZ2F0aW9uRWxlbWVudCI+Ci0gICAgICAgIDxhIGhyZWY9IiMiIGNsYXNzPSJwcmV2LXBhZ2UtbGluayBoaWRlIgotICAgICAgICAgICAgemgtVFctbGFuZz0i5LiK5LiA5aCC6KqyIgotICAgICAgICAgICAgemgtQ04tbGFuZz0i5LiK5LiA6K++IgotICAgICAgICAgICAgcnUtbGFuZz0i0J/RgNC10LTRi9C00YPRidC40LkiCi0gICAgICAgICAgICBrby1sYW5nPSLsnbTsoIQiCi0gICAgICAgICAgICBqYS1sYW5nPSLliY3jgbgiCi0gICAgICAgICAgICBlcy1sYW5nPSJBbnRlcmlvciIKLSAgICAgICAgICAgID5QcmV2aW91czwvYT4KLSAgICAgICAgPGEgaHJlZj0iIyIgY2xhc3M9Im5leHQtcGFnZS1saW5rIGhpZGUiCi0gICAgICAgICAgICB6aC1UVy1sYW5nPSLkuIvkuIDloILoqrIiCi0gICAgICAgICAgICB6aC1DTi1sYW5nPSLkuIvkuIDor74iCi0gICAgICAgICAgICBydS1sYW5nPSLQodC70LXQtNGD0Y7RidC40LkiCi0gICAgICAgICAgICBrby1sYW5nPSLri6TsnYwiCi0gICAgICAgICAgICBqYS1sYW5nPSLmrKHjgbgiCi0gICAgICAgICAgICBlcy1sYW5nPSJTaWd1aWVudGUiCi0gICAgICAgICAgICA+TmV4dDwvYT4KLSAgICAgIDwvZGl2PgotICAgIDw/Y3MgL2lmID8+PD9jcyAjIGVuZCBpZiB0cmFpbmluZyA/PgotICA8L2Rpdj4KLSAgPD9jcyAvaWYgPz4KLTw/Y3MgZWxzZSA/PgotICA8P2NzIGlmOighZnVsbHBhZ2UgJiYgIWhlYWRlci5oaWRlKSA/PgotICAgIDw/Y3MgaWY6cGFnZS5sYW5kaW5nID8+PD9jcyAjIGhlYWRlciBsb2dpYyBmb3IgZG9jcyB0aGF0IGFyZSBsYW5kaW5nIHBhZ2VzID8+Ci0gICAgICA8ZGl2IGNsYXNzPSJsYW5kaW5nLWJhbm5lciI+Ci0gICAgICAgIDw/Y3MgaWY6cGFnZS5sYW5kaW5nLmltYWdlID8+PD9jcyAjIHVzZSB0d28tY29sdW1uIGxheW91dCBvbmx5IGlmIHRoZXJlJ3MgYW4gaW1hZ2UgPz4KLSAgICAgICAgPGRpdiBjbGFzcz0iY29sLTYiPgotICAgICAgICAgIDxpbWcgc3JjPSI8P2NzIHZhcjp0b3Jvb3QgPz48P2NzIHZhcjpwYWdlLmxhbmRpbmcuaW1hZ2UgPz4iIGFsdD0iIiAvPgotICAgICAgICA8L2Rpdj4KLSAgICAgICAgPGRpdiBjbGFzcz0iY29sLTYiPgotICAgICAgICA8P2NzIC9pZiA/PgotICAgICAgICAgIDxoMSBpdGVtcHJvcD0ibmFtZSIgc3R5bGU9Im1hcmdpbi1ib3R0b206MDsiPjw/Y3MgdmFyOnBhZ2UudGl0bGUgPz48L2gxPgotICAgICAgICAgIDxwIGl0ZW1wcm9wPSJkZXNjcmlwdGlvbiI+PD9jcyB2YXI6cGFnZS5sYW5kaW5nLmludHJvID8+PC9wPgotICAgICAgICAgIDxwPjxhIGNsYXNzPSJuZXh0LXBhZ2UtbGluayB0b3BpYy1zdGFydC1saW5rIj48L2E+PC9wPgotICAgICAgICA8P2NzIGlmOnBhZ2UubGFuZGluZy5pbWFnZSA/PgotICAgICAgICA8L2Rpdj4KLSAgICAgICAgPD9jcyAvaWYgPz4KLSAgICAgIDwvZGl2PgotICAgIDw/Y3MgZWxzZSA/PgotICAgICAgPD9jcyBpZjp0YWIxID8+PGRpdiBpZD0idGl0bGUtdGFicy13cmFwcGVyIj48P2NzIC9pZiA/PgotICAgICAgICA8aDEgaXRlbXByb3A9Im5hbWUiIDw/Y3MgaWY6dGFiMSA/PmNsYXNzPSJ3aXRoLXRpdGxlLXRhYnMiPD9jcyAvaWYgPz4+PD9jcyB2YXI6cGFnZS50aXRsZSA/PjwvaDE+PD9jcwotICAgICAgICAgIGlmOnRhYjEgPz48dWwgaWQ9InRpdGxlLXRhYnMiPgotICAgICAgICAgICAgICA8bGkgY2xhc3M9InNlbGVjdGVkIj48YSBocmVmPSI8P2NzIHZhcjp0YWIxLmxpbmsgPz4iPjw/Y3MgdmFyOnRhYjEgPz48L2E+PC9saT4KLSAgICAgICAgICAgICAgPD9jcyBpZjp0YWIyID8+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0YWIyLmxpbmsgPz4iPjw/Y3MgdmFyOnRhYjIgPz48L2E+PC9saT48P2NzIC9pZiA/PgotICAgICAgICAgICAgICA8P2NzIGlmOnRhYjMgPz4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRhYjMubGluayA/PiI+PD9jcyB2YXI6dGFiMyA/PjwvYT48L2xpPjw/Y3MgL2lmID8+Ci0gICAgICAgICAgICA8L3VsPgotICAgICAgICAgIDw/Y3MgL2lmID8+Ci0gICAgICA8P2NzIGlmOnRhYjEgPz48L2Rpdj48IS0tIGVuZCB0YWItd3JhcHBlciAtLT48P2NzIC9pZiA/PgotICAgIDw/Y3MgL2lmID8+Ci0gIDw/Y3MgL2lmID8+Ci08P2NzIC9pZiA/Pjw/Y3MgIyBlbmQgaWYgZGVzaWduID8+Ci0KLSAgPD9jcyAjIFRISVMgSVMgVEhFIE1BSU4gRE9DIENPTlRFTlQgPz4KLSAgPGRpdiBpZD0iamQtY29udGVudCI+Ci0KLSAgICA8ZGl2IGNsYXNzPSJqZC1kZXNjciIgaXRlbXByb3A9ImFydGljbGVCb2R5Ij4KLSAgICA8P2NzIGNhbGw6dGFnX2xpc3Qocm9vdC5kZXNjcikgPz4KLSAgICA8L2Rpdj4KLQotICAgICAgPGRpdiBjbGFzcz0iY29udGVudC1mb290ZXItc2FjIgotICAgICAgICAgICAgICAgICAgICBpdGVtc2NvcGUgaXRlbXR5cGU9Imh0dHA6Ly9zY2hlbWEub3JnL1NpdGVOYXZpZ2F0aW9uRWxlbWVudCI+Ci0gICAgICAgIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCA8P2NzIAotICAgICAgICAgICAgICAgICAgICBpZjpmdWxscGFnZSA/PmNvbC0xNjw/Y3MgCi0gICAgICAgICAgICAgICAgICAgIGVsaWY6dHJhaW5pbmd8fGd1aWRlID8+Y29sLTg8P2NzIAotICAgICAgICAgICAgICAgICAgICBlbHNlID8+Y29sLTk8P2NzIC9pZiA/PiIgc3R5bGU9InBhZGRpbmctdG9wOjRweCI+Ci0gICAgICAgIDwvZGl2PgotICAgICAgICA8P2NzIGlmOiFmdWxsc2NyZWVuID8+Ci0gICAgICAgIDxkaXYgY2xhc3M9InBhZ2luZy1saW5rcyBsYXlvdXQtY29udGVudC1jb2wgY29sLTQiPgotICAgICAgICAgIDw/Y3MgaWY6KGRlc2lnbnx8dHJhaW5pbmd8fGd1aWRlfHx3YWxrdGhydSkgJiYgIXBhZ2UubGFuZGluZyAmJiAhcGFnZS50cmFpbmluZ2NvdXJzZSAmJiAhZm9vdGVyLmhpZGUgPz4KLSAgICAgICAgICAgIDxhIGhyZWY9IiMiIGNsYXNzPSJwcmV2LXBhZ2UtbGluayBoaWRlIgotICAgICAgICAgICAgICAgIHpoLVRXLWxhbmc9IuS4iuS4gOWgguiqsiIKLSAgICAgICAgICAgICAgICB6aC1DTi1sYW5nPSLkuIrkuIDor74iCi0gICAgICAgICAgICAgICAgcnUtbGFuZz0i0J/RgNC10LTRi9C00YPRidC40LkiCi0gICAgICAgICAgICAgICAga28tbGFuZz0i7J207KCEIgotICAgICAgICAgICAgICAgIGphLWxhbmc9IuWJjeOBuCIKLSAgICAgICAgICAgICAgICBlcy1sYW5nPSJBbnRlcmlvciIKLSAgICAgICAgICAgICAgICA+UHJldmlvdXM8L2E+Ci0gICAgICAgICAgICA8YSBocmVmPSIjIiBjbGFzcz0ibmV4dC1wYWdlLWxpbmsgaGlkZSIKLSAgICAgICAgICAgICAgICB6aC1UVy1sYW5nPSLkuIvkuIDloILoqrIiCi0gICAgICAgICAgICAgICAgemgtQ04tbGFuZz0i5LiL5LiA6K++IgotICAgICAgICAgICAgICAgIHJ1LWxhbmc9ItCh0LvQtdC00YPRjtGJ0LjQuSIKLSAgICAgICAgICAgICAgICBrby1sYW5nPSLri6TsnYwiCi0gICAgICAgICAgICAgICAgamEtbGFuZz0i5qyh44G4IgotICAgICAgICAgICAgICAgIGVzLWxhbmc9IlNpZ3VpZW50ZSIKLSAgICAgICAgICAgICAgICA+TmV4dDwvYT4KLSAgICAgICAgICA8P2NzIC9pZiA/PgotICAgICAgICA8L2Rpdj4KLSAgICAgICAgPD9jcyAvaWYgPz4KLSAgICAgIDwvZGl2PgotICAgICAgPD9jcyAjIGZvciB0cmFpbmluZyBjbGFzc2VzLCBwcm92aWRlIGEgZGlmZmVyZW50IGtpbmQgb2YgbGluayB3aGVuIHRoZSBuZXh0IHBhZ2UgaXMgYSBkaWZmZXJlbnQgY2xhc3MgPz4KLSAgICAgIDw/Y3MgaWY6dHJhaW5pbmcgJiYgIXBhZ2UuYXJ0aWNsZSA/PgotICAgICAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtcm93IGNvbnRlbnQtZm9vdGVyIG5leHQtY2xhc3MiIHN0eWxlPSJkaXNwbGF5Om5vbmUiIGl0ZW1zY29wZSBpdGVtdHlwZT0iaHR0cDovL3NjaGVtYS5vcmcvU2l0ZU5hdmlnYXRpb25FbGVtZW50Ij4KLSAgICAgICAgICA8YSBocmVmPSIjIiBjbGFzcz0ibmV4dC1jbGFzcy1saW5rIGhpZGUiPk5leHQgY2xhc3M6IDwvYT4KLSAgICAgIDwvZGl2PgotICAgICAgPD9jcyAvaWYgPz4KLSAgICA8L2Rpdj4gPCEtLSBlbmQgamQtY29udGVudCAtLT4KLSAgPD9jcyBpbmNsdWRlOiJmb290ZXIuY3MiID8+Ci08L2Rpdj48IS0tIGVuZCBkb2MtY29udGVudCAtLT4KLQotPD9jcyBpbmNsdWRlOiJ0cmFpbGVyLmNzIiA/PgotCi08L2JvZHk+Ci08L2h0bWw+Ci0KLQotCmRpZmYgLS1naXQgYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Zvb3Rlci5jcyBiL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvZm9vdGVyLmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDNhZGIwLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvZm9vdGVyLmNzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotPGRpdiBpZD0iZm9vdGVyIiBjbGFzcz0id3JhcCIgPD9jcyBpZjpmdWxscGFnZSA/PnN0eWxlPSJ3aWR0aDo5NDBweCI8P2NzIC9pZiA/Pj4KLSAgPHN0eWxlPi5mZWVkYmFjayB7IGZsb2F0OiByaWdodCAhSW1wb3J0YW50IH08L3N0eWxlPgotICA8ZGl2IGNsYXNzPSJmZWVkYmFjayI+Ci0gICAgPGEgaHJlZj0iIyIgY2xhc3M9ImJ1dHRvbiIgb25jbGljaz0iIHRyeSB7Ci0gICAgICB1c2VyZmVlZGJhY2suYXBpLnN0YXJ0RmVlZGJhY2soeydwcm9kdWN0SWQnOic3MTU1NzEnLCdhdXRodXNlcic6JzEnfSk7cmV0dXJuIGZhbHNlO31jYXRjaChlKXt9Ij5TaXRlIEZlZWRiYWNrPC9hPgotICA8L2Rpdj4KLSAgPGRpdiBpZD0iY29weXJpZ2h0Ij4KLSAgICA8P2NzIGNhbGw6Y3VzdG9tX2NjX2NvcHlyaWdodCgpID8+Ci0gIDwvZGl2PgotICAgIDxkaXYgaWQ9ImZvb3RlcmxpbmtzIj4KLSAgICA8P2NzIGNhbGw6Y3VzdG9tX2Zvb3RlcmxpbmtzKCkgPz4KLSAgPC9kaXY+CmRpZmYgLS1naXQgYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2djbV9uYXZ0cmVlX2RhdGEuY3MgYi90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2djbV9uYXZ0cmVlX2RhdGEuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmMzNkODguLjAwMDAwMDAKLS0tIGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9nY21fbmF2dHJlZV9kYXRhLmNzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi12YXIgR0NNX05BVlRSRUVfREFUQSA9Ci08P2NzIHZhcjpyZWZlcmVuY2VfdHJlZSA/PgotOwpkaWZmIC0tZ2l0IGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9nbXNfbmF2dHJlZV9kYXRhLmNzIGIvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9nbXNfbmF2dHJlZV9kYXRhLmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NmI3ZDU1Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvZ21zX25hdnRyZWVfZGF0YS5jcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotdmFyIEdNU19OQVZUUkVFX0RBVEEgPQotPD9jcyB2YXI6cmVmZXJlbmNlX3RyZWUgPz4KLTsKZGlmZiAtLWdpdCBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvaGVhZF90YWcuY3MgYi90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2hlYWRfdGFnLmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjcyYjI1Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvaGVhZF90YWcuY3MKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Ij4KLTw/Y3MgaWY6cGFnZS5tZXRhRGVzY3JpcHRpb24gPz4KLTxtZXRhIG5hbWU9IkRlc2NyaXB0aW9uIiBjb250ZW50PSI8P2NzIHZhcjpwYWdlLm1ldGFEZXNjcmlwdGlvbiA/PiI+Ci08P2NzIC9pZiA/PgotPGxpbmsgcmVsPSJzaG9ydGN1dCBpY29uIiB0eXBlPSJpbWFnZS94LWljb24iIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PmZhdmljb24uaWNvIiAvPgotPHRpdGxlPjw/Y3MgCi0gIGlmOnBhZ2UudGl0bGUgPz48P2NzIAotICAgIHZhcjpwYWdlLnRpdGxlID8+IHwgPD9jcwotICAvaWYgPz5BbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3Q8L3RpdGxlPgotCi08IS0tIFNUWUxFU0hFRVRTIC0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IgotaHJlZj0iPD9jcyBpZjphbmRyb2lkLndoaWNoZG9jICE9ICdvbmxpbmUnID8+aHR0cDo8P2NzIC9pZiA/Pi8vZm9udHMuZ29vZ2xlYXBpcy5jb20vY3NzP2ZhbWlseT1Sb2JvdG86cmVndWxhcixtZWRpdW0sdGhpbixpdGFsaWMsbWVkaXVtaXRhbGljLGJvbGQiIHRpdGxlPSJyb2JvdG8iPgotPGxpbmsgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+YXNzZXRzL2Nzcy9kZWZhdWx0LmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+Ci0KLTw/Y3MgaWY6cmVmZXJlbmNlICYmICEocmVmZXJlbmNlLmdtcyB8fCByZWZlcmVuY2UuZ2NtIHx8IHNhYykgPz4KLTwhLS0gRlVMTFNDUkVFTiBTVFlMRVNIRUVUIC0tPgotPGxpbmsgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+YXNzZXRzL2Nzcy9mdWxsc2NyZWVuLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiBjbGFzcz0iZnVsbHNjcmVlbiIKLXR5cGU9InRleHQvY3NzIj4KLTw/Y3MgL2lmID8+Ci0KLTwhLS0gSkFWQVNDUklQVCAtLT4KLTxzY3JpcHQgc3JjPSI8P2NzIGlmOmFuZHJvaWQud2hpY2hkb2MgIT0gJ29ubGluZScgPz5odHRwOjw/Y3MgL2lmID8+Ly93d3cuZ29vZ2xlLmNvbS9qc2FwaSIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48L3NjcmlwdD4KLTw/Y3MKLWlmOmRldnNpdGUKLSAgPz48c2NyaXB0IHNyYz0iPD9jcyB2YXI6dG9yb290ID8+X3N0YXRpYy9qcy9hbmRyb2lkXzNwLWJ1bmRsZS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48L3NjcmlwdD48P2NzCi1lbHNlCi0gID8+PHNjcmlwdCBzcmM9Ijw/Y3MgdmFyOnRvcm9vdCA/PmFzc2V0cy9qcy9hbmRyb2lkXzNwLWJ1bmRsZS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48L3NjcmlwdD48P2NzCi0vaWYgPz4KLTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgdmFyIHRvUm9vdCA9ICI8P2NzIHZhcjp0b3Jvb3QgPz4iOwotICA8P2NzIGlmOmRldnNpdGUgPz4KLSAgdmFyIGRldnNpdGUgPSB0cnVlOwotICA8P2NzIGVsc2UgPz4KLSAgdmFyIGRldnNpdGUgPSBmYWxzZTsKLSAgPD9jcyAvaWYgPz4KLTwvc2NyaXB0PgotPHNjcmlwdCBzcmM9Ijw/Y3MgdmFyOnRvcm9vdCA/PmFzc2V0cy9qcy9kb2NzLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0PgotPD9jcyBpZjpyZWZlcmVuY2UuZ21zIHx8IHJlZmVyZW5jZS5nY20gfHwgZ29vZ2xlPz4KLTxzY3JpcHQgc3JjPSI8P2NzIHZhcjp0b3Jvb3QgPz5nbXNfbmF2dHJlZV9kYXRhLmpzIiBhc3luYyB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0PgotPHNjcmlwdCBzcmM9Ijw/Y3MgdmFyOnRvcm9vdCA/PmdjbV9uYXZ0cmVlX2RhdGEuanMiIGFzeW5jIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+Ci08P2NzIGVsaWY6ZGV2aWNlcyA/PgotPHNjcmlwdCBzcmM9Ijw/Y3MgdmFyOnRvcm9vdCA/Pm5hdnRyZWVfZGF0YS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48L3NjcmlwdD4KLTw/Y3MgZWxpZjpyZWZlcmVuY2UgPz4KLTxzY3JpcHQgc3JjPSI8P2NzIHZhcjp0b3Jvb3QgPz5uYXZ0cmVlX2RhdGEuanMiIGFzeW5jIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+Ci08P2NzIC9pZiA/PgotCi08c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIvL3d3dy5nc3RhdGljLmNvbS9mZWVkYmFjay9hcGkuanMiPjwvc2NyaXB0PgotCi08c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIHZhciBfZ2FxID0gX2dhcSB8fCBbXTsKLSAgX2dhcS5wdXNoKFsnX3NldEFjY291bnQnLCAnVUEtNDU0NTUyOTctMSddKTsKLSAgX2dhcS5wdXNoKFsnX3RyYWNrUGFnZXZpZXcnXSk7Ci0KLSAgKGZ1bmN0aW9uKCkgewotICAgIHZhciBnYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpOyBnYS50eXBlID0gJ3RleHQvamF2YXNjcmlwdCc7IGdhLmFzeW5jID0gdHJ1ZTsKLSAgICBnYS5zcmMgPSAoJ2h0dHBzOicgPT0gZG9jdW1lbnQubG9jYXRpb24ucHJvdG9jb2wgPyAnaHR0cHM6Ly9zc2wnIDogJ2h0dHA6Ly93d3cnKSArICcuZ29vZ2xlLWFuYWx5dGljcy5jb20vZ2EuanMnOwotICAgIHZhciBzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3NjcmlwdCcpWzBdOyBzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGdhLCBzKTsKLSAgfSkoKTsKLTwvc2NyaXB0PgotPC9oZWFkPgpkaWZmIC0tZ2l0IGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9oZWFkZXIuY3MgYi90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2hlYWRlci5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWJiN2JjMC4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2hlYWRlci5jcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD9jcyBpZjpzYWMgPz4KLSAgPD9jcyBjYWxsOnNhY19tYXN0aGVhZCgpID8+Ci0gIDw/Y3MgY2FsbDpzYWNfbGVmdF9uYXYoKSA/PgotPD9jcyBlbHNlID8+Ci0gIDw/Y3MgY2FsbDpjdXN0b21fbWFzdGhlYWQoKSA/PgotICA8P2NzIGNhbGw6Y3VzdG9tX2xlZnRfbmF2KCkgPz4KLTw/Y3MgL2lmID8+CmRpZmYgLS1naXQgYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2hlYWRlcl90YWJzLmNzIGIvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9oZWFkZXJfdGFicy5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzhjOWRhOC4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2hlYWRlcl90YWJzLmNzCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0KLTwhLS0gQ1VSUkVOVExZIE5PVCBVU0VELi4uIEFMTCBUQUJTIEFSRSBJTiBtYXN0aGVhZC5jcyAtLT4KZGlmZiAtLWdpdCBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvamRfbGlzdHNfdW5pZmllZC5jcyBiL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvamRfbGlzdHNfdW5pZmllZC5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDE3YTVjMS4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2pkX2xpc3RzX3VuaWZpZWQuY3MKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi08P2NzIHZhcjpyZWZlcmVuY2VfdHJlZSA/PgpkaWZmIC0tZ2l0IGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9uYXZ0cmVlX2RhdGEuY3MgYi90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL25hdnRyZWVfZGF0YS5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzNhYTE5OS4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL25hdnRyZWVfZGF0YS5jcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotdmFyIE5BVlRSRUVfREFUQSA9Ci08P2NzIHZhcjpyZWZlcmVuY2VfdHJlZSA/PgotOwpkaWZmIC0tZ2l0IGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9ub3NpZGVuYXZwYWdlLmNzIGIvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9ub3NpZGVuYXZwYWdlLmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTU5NjkzLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvbm9zaWRlbmF2cGFnZS5jcworKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTw/Y3MgaW5jbHVkZToiZG9jdHlwZS5jcyIgPz4KLTw/Y3MgaW5jbHVkZToibWFjcm9zLmNzIiA/PgotPGh0bWw8P2NzIGlmOmRldnNpdGUgPz4gZGV2c2l0ZTw/Y3MgL2lmID8+PgotPD9jcyBpbmNsdWRlOiJoZWFkX3RhZy5jcyIgPz4KLTxib2R5IGNsYXNzPSJnYy1kb2N1bWVudGF0aW9uIAotICA8P2NzIGlmOihndWlkZXx8ZGV2ZWxvcHx8dHJhaW5pbmd8fHJlZmVyZW5jZXx8dG9vbHN8fHNkaykgPz5kZXZlbG9wPD9jcwotICBlbGlmOmRlc2lnbiA/PmRlc2lnbjw/Y3MKLSAgZWxpZjpkaXN0cmlidXRlID8+ZGlzdHJpYnV0ZTw/Y3MKLSAgL2lmID8+IiBpdGVtc2NvcGUgaXRlbXR5cGU9Imh0dHA6Ly9zY2hlbWEub3JnL0FydGljbGUiPgotPGEgbmFtZT0idG9wIj48L2E+Ci08P2NzIGNhbGw6Y3VzdG9tX21hc3RoZWFkKCkgPz4KLQotPGRpdiBpZD0iYm9keS1jb250ZW50Ij4KLTxkaXYgaWQ9ImRvYy1jb250ZW50IiBzdHlsZT0icG9zaXRpb246cmVsYXRpdmU7Ij4KLQotPD9jcyBjYWxsOnRhZ19saXN0KHJvb3QuZGVzY3IpID8+Ci0KLTw/Y3MgaW5jbHVkZToiZm9vdGVyLmNzIiA/PgotPC9kaXY+PCEtLSBlbmQgZG9jLWNvbnRlbnQgLS0+Ci0KLTw/Y3MgaW5jbHVkZToidHJhaWxlci5jcyIgPz4KLQotPC9ib2R5PgotPC9odG1sPgotCi0KLQpkaWZmIC0tZ2l0IGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9wYWNrYWdlLmNzIGIvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9wYWNrYWdlLmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmQ0OWYxLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvcGFja2FnZS5jcworKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLTw/Y3MgaW5jbHVkZToiZG9jdHlwZS5jcyIgPz4KLTw/Y3MgaW5jbHVkZToibWFjcm9zLmNzIiA/PgotPGh0bWw8P2NzIGlmOmRldnNpdGUgPz4gZGV2c2l0ZTw/Y3MgL2lmID8+PgotPD9jcyBpbmNsdWRlOiJoZWFkX3RhZy5jcyIgPz4KLQotPGJvZHkgY2xhc3M9ImdjLWRvY3VtZW50YXRpb24gPD9jcyBpZjoocmVmZXJlbmNlLmdtcyB8fCByZWZlcmVuY2UuZ2NtKSA/Pmdvb2dsZTw/Y3MgL2lmID8+Ci0gIDw/Y3MgaWY6KGd1aWRlfHxkZXZlbG9wfHx0cmFpbmluZ3x8cmVmZXJlbmNlfHx0b29sc3x8c2RrKSA/PmRldmVsb3A8P2NzCi0gIGVsaWY6ZGVzaWduID8+ZGVzaWduPD9jcwotICBlbGlmOmRpc3RyaWJ1dGUgPz5kaXN0cmlidXRlPD9jcwotICAvaWYgPz4iPgotICA8ZGl2IGlkPSJkb2MtYXBpLWxldmVsIiBjbGFzcz0iPD9jcyB2YXI6cGFja2FnZS5zaW5jZSA/PiIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+PC9kaXY+Ci0gIDxhIG5hbWU9InRvcCI+PC9hPgotPD9jcyBpbmNsdWRlOiJoZWFkZXIuY3MiID8+Ci0KLTxkaXYgY2xhc3M9ImNvbC0xMiIgaWQ9ImRvYy1jb2wiPgotCi08ZGl2IGlkPSJhcGktaW5mby1ibG9jayI+Ci08ZGl2IGNsYXNzPSJhcGktbGV2ZWwiPgotICA8P2NzIGNhbGw6c2luY2VfdGFncyhwYWNrYWdlKSA/PgotICA8P2NzIGNhbGw6ZmVkZXJhdGVkX3JlZnMocGFja2FnZSkgPz4KLTwvZGl2PgotPC9kaXY+Ci0KLTxkaXYgaWQ9ImpkLWhlYWRlciI+Ci0gIHBhY2thZ2UKLSAgPGgxPjw/Y3MgdmFyOnBhY2thZ2UubmFtZSA/PjwvaDE+Ci08L2Rpdj48IS0tIGVuZCBoZWFkZXIgLS0+Ci0KLTxkaXYgaWQ9Im5hTWVzc2FnZSI+PC9kaXY+Ci0KLTxkaXYgaWQ9ImpkLWNvbnRlbnQiIGNsYXNzPSJhcGkgYXBpbGV2ZWwtPD9jcyB2YXI6cGFja2FnZS5zaW5jZSA/PiI+Ci0KLTw/Y3MgaWY6c3ViY291bnQocGFja2FnZS5kZXNjcikgPz4KLSAgPGRpdiBjbGFzcz0iamQtZGVzY3IiPgotICAgIDw/Y3MgY2FsbDp0YWdfbGlzdChwYWNrYWdlLmRlc2NyKSA/PgotICA8L2Rpdj4KLTw/Y3MgL2lmID8+Ci0KLTw/Y3MgZGVmOmNsYXNzX3RhYmxlKGxhYmVsLCBjbGFzc2VzKSA/PgotICA8P2NzIGlmOnN1YmNvdW50KGNsYXNzZXMpID8+Ci0gICAgPGgyPjw/Y3MgdmFyOmxhYmVsID8+PC9oMj4KLSAgICA8ZGl2IGNsYXNzPSJqZC1zdW10YWJsZSI+Ci0gICAgPD9jcyBjYWxsOmNsYXNzX2xpbmtfdGFibGUoY2xhc3NlcykgPz4KLSAgICA8L2Rpdj4KLSAgPD9jcyAvaWYgPz4KLTw/Y3MgL2RlZiA/PgotCi08P2NzIGNhbGw6Y2xhc3NfdGFibGUoIkFubm90YXRpb25zIiwgcGFja2FnZS5hbm5vdGF0aW9ucykgPz4KLTw/Y3MgY2FsbDpjbGFzc190YWJsZSgiSW50ZXJmYWNlcyIsIHBhY2thZ2UuaW50ZXJmYWNlcykgPz4KLTw/Y3MgY2FsbDpjbGFzc190YWJsZSgiQ2xhc3NlcyIsIHBhY2thZ2UuY2xhc3NlcykgPz4KLTw/Y3MgY2FsbDpjbGFzc190YWJsZSgiRW51bXMiLCBwYWNrYWdlLmVudW1zKSA/PgotPD9jcyBjYWxsOmNsYXNzX3RhYmxlKCJFeGNlcHRpb25zIiwgcGFja2FnZS5leGNlcHRpb25zKSA/PgotPD9jcyBjYWxsOmNsYXNzX3RhYmxlKCJFcnJvcnMiLCBwYWNrYWdlLmVycm9ycykgPz4KLQotPD9jcyBpbmNsdWRlOiJmb290ZXIuY3MiID8+Ci08L2Rpdj48IS0tIGVuZCBqZC1jb250ZW50IC0tPgotPC9kaXY+PCEtLSBkb2MtY29udGVudCAtLT4KLQotPD9jcyBpbmNsdWRlOiJ0cmFpbGVyLmNzIiA/PgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL3BhY2thZ2VzLmNzIGIvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9wYWNrYWdlcy5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQ2ODBjMy4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL3BhY2thZ2VzLmNzCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotPD9jcyBpbmNsdWRlOiJkb2N0eXBlLmNzIiA/PgotPD9jcyBpbmNsdWRlOiJtYWNyb3MuY3MiID8+Ci08aHRtbDw/Y3MgaWY6ZGV2c2l0ZSA/PiBkZXZzaXRlPD9jcyAvaWYgPz4+Ci08P2NzIGluY2x1ZGU6ImhlYWRfdGFnLmNzIiA/PgotPGJvZHkgY2xhc3M9ImdjLWRvY3VtZW50YXRpb24gPD9jcyBpZjoocmVmZXJlbmNlLmdtcyB8fCByZWZlcmVuY2UuZ2NtKSA/Pmdvb2dsZTw/Y3MgL2lmID8+Ci0gIDw/Y3MgaWY6KGd1aWRlfHxkZXZlbG9wfHx0cmFpbmluZ3x8cmVmZXJlbmNlfHx0b29sc3x8c2RrKSA/PmRldmVsb3A8P2NzCi0gIGVsaWY6ZGVzaWduID8+ZGVzaWduPD9jcwotICBlbGlmOmRpc3RyaWJ1dGUgPz5kaXN0cmlidXRlPD9jcwotICAvaWYgPz4iPgotICA8YSBuYW1lPSJ0b3AiPjwvYT4KLTw/Y3MgaW5jbHVkZToiaGVhZGVyLmNzIiA/PgotCi08ZGl2IGNsYXNzPSJjb2wtMTIiIGlkPSJkb2MtY29sIj4KLQotPGRpdiBpZD0iamQtaGVhZGVyIj4KLTxoMT48P2NzIHZhcjpwYWdlLnRpdGxlID8+PC9oMT4KLTwvZGl2PgotCi08ZGl2IGlkPSJqZC1jb250ZW50Ij4KLQotPGRpdiBjbGFzcz0iamQtZGVzY3IiPgotPHA+PD9jcyBjYWxsOnRhZ19saXN0KHJvb3QuZGVzY3IpID8+PC9wPgotPC9kaXY+Ci0KLTw/Y3Mgc2V0OmNvdW50ID0gIzEgPz4KLTx0YWJsZSBjbGFzcz0iamQtc3VtdGFibGUiPgotPD9jcyBlYWNoOnBrZyA9IGRvY3MucGFja2FnZXMgPz4KLSAgICA8dHIgY2xhc3M9Ijw/Y3MgaWY6Y291bnQgJSAjMiA/PmFsdC1jb2xvcjw/Y3MgL2lmID8+IGFwaSBhcGlsZXZlbC08P2NzIHZhcjpwa2cuc2luY2UgPz4iID4KLSAgICAgICAgPHRkIGNsYXNzPSJqZC1saW5rY29sIj48P2NzIGNhbGw6cGFja2FnZV9saW5rKHBrZykgPz48L3RkPgotICAgICAgICA8dGQgY2xhc3M9ImpkLWRlc2NyY29sIiB3aWR0aD0iMTAwJSI+PD9jcyBjYWxsOnRhZ19saXN0KHBrZy5zaG9ydERlc2NyKSA/PjwvdGQ+Ci0gICAgPC90cj4KLTw/Y3Mgc2V0OmNvdW50ID0gY291bnQgKyAjMSA/PgotPD9jcyAvZWFjaCA/PgotPC90YWJsZT4KLQotPD9jcyBpbmNsdWRlOiJmb290ZXIuY3MiID8+Ci08L2Rpdj48IS0tIGVuZCBqZC1jb250ZW50IC0tPgotPC9kaXY+IDwhLS0gZW5kIGRvYy1jb250ZW50IC0tPgotCi08P2NzIGluY2x1ZGU6InRyYWlsZXIuY3MiID8+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvc2FtcGxlaW5kZXguY3MgYi90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL3NhbXBsZWluZGV4LmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTczMzYzLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvc2FtcGxlaW5kZXguY3MKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi08P2NzIGluY2x1ZGU6ImRvY3R5cGUuY3MiID8+Ci08P2NzIGluY2x1ZGU6Im1hY3Jvcy5jcyIgPz4KLTw/Y3Mgc2V0OnJlc291cmNlcz0idHJ1ZSIgPz4KLTxodG1sPD9jcyBpZjpkZXZzaXRlID8+IGRldnNpdGU8P2NzIC9pZiA/Pj4KLTw/Y3MgaW5jbHVkZToiaGVhZF90YWcuY3MiID8+Ci08P2NzIGluY2x1ZGU6ImhlYWRlci5jcyIgPz4KLTxib2R5IGNsYXNzPSJnYy1kb2N1bWVudGF0aW9uIj4KLQotCi08YSBuYW1lPSJ0b3AiPjwvYT4KLTxkaXYgY2xhc3M9ImctdW5pdCIgaWQ9ImRvYy1jb250ZW50Ij4KLSA8ZGl2IGlkPSJqZC1oZWFkZXIiIGNsYXNzPSJndWlkZS1oZWFkZXIiPgotICAgIDxzcGFuIGNsYXNzPSJjcnVtYiI+Ci0gICAgICA8YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvYnJvd3Nlci5odG1sP3RhZz1zYW1wbGUiPlNhbXBsZSBDb2RlPC9hPiA+Ci0gICAgPC9zcGFuPgotICA8aDE+PD9jcyB2YXI6cGFnZS50aXRsZSA/PjwvaDE+Ci0gPC9kaXY+Ci0KLTxkaXYgaWQ9ImpkLWNvbnRlbnQiPgotPHA+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+JmxhcnI7IEJhY2s8L2E+PC9wPgotCi08P2NzIHZhcjpzdW1tYXJ5ID8+Ci0KLSAgPD9jcyBpZjpzdWJjb3VudChzdWJkaXJzKSA/PgotICAgICAgPGgyPlN1YmRpcmVjdG9yaWVzPC9oMj4KLSAgICAgIDx1bCBjbGFzcz0ibm9saXN0Ij4KLSAgICAgIDw/Y3MgZWFjaDpkaXI9c3ViZGlycyA/PgotICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6ZGlyLm5hbWUgPz4vaW5kZXguaHRtbCI+PD9jcwotICAgICAgICAgIHZhcjpkaXIubmFtZSA/Pi88L2E+PC9saT4KLSAgICAgIDw/Y3MgL2VhY2ggPz4KLSAgICAgIDwvdWw+Ci0gIDw/Y3MgL2lmID8+Ci0KLSAgPD9jcyBpZjpzdWJjb3VudChmaWxlcykgPz4KLSAgICAgIDxoMj5GaWxlczwvaDI+Ci0gICAgICA8dWwgY2xhc3M9Im5vbGlzdCI+Ci0gICAgICA8P2NzIGVhY2g6ZmlsZT1maWxlcyA/PgotICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6ZmlsZS5ocmVmID8+Ij48P2NzCi0gICAgICAgICAgdmFyOmZpbGUubmFtZSA/PjwvYT48L2xpPgotICAgICAgPD9jcyAvZWFjaCA/PgotICAgICAgPC91bD4KLSAgPD9jcyAvaWYgPz4KLQotPC9kaXY+PCEtLSBlbmQgamQtY29udGVudCAtLT4KLQotPD9jcyBpbmNsdWRlOiJmb290ZXIuY3MiID8+Ci0KLTwvZGl2PjwhLS0gZW5kIGRvYy1jb250ZW50IC0tPgotCi08P2NzIGluY2x1ZGU6InRyYWlsZXIuY3MiID8+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvc2RrcGFnZS5jcyBiL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvc2RrcGFnZS5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGVjZmQyNi4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL3Nka3BhZ2UuY3MKKysrIC9kZXYvbnVsbApAQCAtMSw0OTEgKzAsMCBAQAotPD9jcyBpbmNsdWRlOiJkb2N0eXBlLmNzIiA/PgotPD9jcyBpbmNsdWRlOiJtYWNyb3MuY3MiID8+Ci08aHRtbDw/Y3MgaWY6ZGV2c2l0ZSA/PiBkZXZzaXRlPD9jcyAvaWYgPz4+Ci08P2NzIGlmOnNkay5yZWRpcmVjdCA/PgotICA8aGVhZD4KLSAgICA8dGl0bGU+UmVkaXJlY3RpbmcuLi48L3RpdGxlPgotICAgIDxtZXRhIGh0dHAtZXF1aXY9InJlZnJlc2giIGNvbnRlbnQ9IjA7dXJsPTw/Y3MgdmFyOnRvcm9vdCA/PnNkay88P2NzCi0gICAgICBpZjpzZGsucmVkaXJlY3QucGF0aCA/Pjw/Y3MgdmFyOnNkay5yZWRpcmVjdC5wYXRoID8+PD9jcwotICAgICAgZWxzZSA/PmluZGV4Lmh0bWw8P2NzIC9pZiA/PiI+Ci0gIDwvaGVhZD4KLTw/Y3MgZWxzZSA/PgotICA8P2NzIGluY2x1ZGU6ImhlYWRfdGFnLmNzIiA/PgotPD9jcyAvaWYgPz4KLTxib2R5IGNsYXNzPSJnYy1kb2N1bWVudGF0aW9uIAotICA8P2NzIGlmOihndWlkZXx8ZGV2ZWxvcHx8dHJhaW5pbmd8fHJlZmVyZW5jZXx8dG9vbHN8fHNkaykgPz5kZXZlbG9wPD9jcwotICBlbGlmOmRlc2lnbiA/PmRlc2lnbjw/Y3MKLSAgZWxpZjpkaXN0cmlidXRlID8+ZGlzdHJpYnV0ZTw/Y3MKLSAgL2lmID8+IiBpdGVtc2NvcGUgaXRlbXR5cGU9Imh0dHA6Ly9zY2hlbWEub3JnL0NyZWF0aXZlV29yayI+Ci0gIDxhIG5hbWU9InRvcCI+PC9hPgotPD9jcyBpbmNsdWRlOiJoZWFkZXIuY3MiID8+Ci0KLQotPGRpdiA8P2NzIGlmOmZ1bGxwYWdlCi0/Pjw/Y3MgZWxzZQotPz5jbGFzcz0iY29sLTEzIiBpZD0iZG9jLWNvbCI8P2NzIC9pZiA/PiA+Ci0KLTw/Y3MgaWY6c2RrLnJlZGlyZWN0ID8+Ci0KLTxkaXYgY2xhc3M9ImctdW5pdCI+Ci0gIDxkaXYgaWQ9ImpkLWNvbnRlbnQiPgotICAgIDxwPlJlZGlyZWN0aW5nIHRvCi0gICAgPGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+c2RrLzw/Y3MKLSAgICAgIGlmOnNkay5yZWRpcmVjdC5wYXRoID8+PD9jcyB2YXI6c2RrLnJlZGlyZWN0LnBhdGggPz48P2NzCi0gICAgICBlbHNlID8+aW5kZXguaHRtbDw/Y3MgL2lmID8+Ij48P2NzCi0gICAgICBpZjpzZGsucmVkaXJlY3QucGF0aCA/Pjw/Y3MgdmFyOnNkay5yZWRpcmVjdC5wYXRoID8+PD9jcwotICAgICAgZWxzZSA/PkRvd25sb2FkIHRoZSBTREs8P2NzIC9pZiA/PgotICAgIDwvYT4gLi4uPC9wPgotCi08P2NzIGVsc2UgPz4KLTw/Y3MgIyBlbHNlLCBpZiBOT1QgcmVkaXJlY3QgLi4uCi0jCi0jCi0jIFRoZSBmb2xsb3dpbmcgaXMgZm9yIFNESy9OREsgcGFnZXMKLSMKLSMKLT8+Ci0KLTw/Y3MgaWY6aGVhZGVyLmhpZGUgPz48P2NzIGVsc2UgPz4KLTxoMSBpdGVtcHJvcD0ibmFtZSI+PD9jcyB2YXI6cGFnZS50aXRsZSA/PjwvaDE+Ci08P2NzIC9pZiA/PgotICA8ZGl2IGlkPSJqZC1jb250ZW50IiBpdGVtcHJvcD0iZGVzY3JpcHRpb24iPgotCi08P2NzIGlmOnNkay5ub3RfbGF0ZXN0X3ZlcnNpb24gPz4KLSAgPGRpdiBjbGFzcz0ic3BlY2lhbCI+Ci0gICAgPHA+PHN0cm9uZz5UaGlzIGlzIE5PVCB0aGUgY3VycmVudCBBbmRyb2lkIFNESyByZWxlYXNlLjwvc3Ryb25nPjwvcD4KLSAgICA8cD48YSBocmVmPSIvc2RrL2luZGV4Lmh0bWwiPkRvd25sb2FkIHRoZSBjdXJyZW50IEFuZHJvaWQgU0RLPC9hPjwvcD4KLSAgPC9kaXY+Ci08P2NzIC9pZiA/PgotCi0KLTw/Y3MgaWY6bmRrID8+Ci08P2NzICMKLSMKLSMKLSMKLSMKLSMKLSMKLSMgdGhlIGZvbGxvd2luZyBpcyBmb3IgdGhlIE5ESwotIwotIyAobmVzdGVkIGluIGlmL2Vsc2UgcmVkaXJlY3QpCi0jCi0jCi0jCi0jCi0/PgotCi0gIDx0YWJsZSBjbGFzcz0iZG93bmxvYWQiIGlkPSJkb3dubG9hZC10YWJsZSI+Ci0gICAgPHRyPgotICAgICAgPHRoPlBsYXRmb3JtPC90aD4KLSAgICAgIDx0aD5QYWNrYWdlPC90aD4KLSAgICAgIDx0aD5TaXplPC90aD4KLSAgICAgIDx0aD5NRDUgQ2hlY2tzdW08L3RoPgotICA8L3RyPgotICA8dHI+Ci0gICAgPHRkPldpbmRvd3M8L3RkPgotICAgIDx0ZD4KLSAgPGEgb25DbGljaz0icmV0dXJuIG9uRG93bmxvYWQodGhpcykiCi0gICAgIGhyZWY9Imh0dHA6Ly9kbC5nb29nbGUuY29tL2FuZHJvaWQvbmRrLzw/Y3MgdmFyOm5kay53aW5fZG93bmxvYWQgPz4iPjw/Y3MgdmFyOm5kay53aW5fZG93bmxvYWQgPz48L2E+Ci0gICAgPC90ZD4KLSAgICA8dGQ+PD9jcyB2YXI6bmRrLndpbl9ieXRlcyA/PiBieXRlczwvdGQ+Ci0gICAgPHRkPjw/Y3MgdmFyOm5kay53aW5fY2hlY2tzdW0gPz48L3RkPgotICA8L3RyPgotICA8dHI+Ci0gICAgPHRkPk1hYyBPUyBYIChpbnRlbCk8L3RkPgotICAgIDx0ZD4KLSAgPGEgb25DbGljaz0icmV0dXJuIG9uRG93bmxvYWQodGhpcykiCi0gICAgIGhyZWY9Imh0dHA6Ly9kbC5nb29nbGUuY29tL2FuZHJvaWQvbmRrLzw/Y3MgdmFyOm5kay5tYWNfZG93bmxvYWQgPz4iPjw/Y3MgdmFyOm5kay5tYWNfZG93bmxvYWQgPz48L2E+Ci0gICAgPC90ZD4KLSAgICA8dGQ+PD9jcyB2YXI6bmRrLm1hY19ieXRlcyA/PiBieXRlczwvdGQ+Ci0gICAgPHRkPjw/Y3MgdmFyOm5kay5tYWNfY2hlY2tzdW0gPz48L3RkPgotICA8L3RyPgotICA8dHI+Ci0gICAgPHRkPkxpbnV4IDMyLzY0LWJpdCAoeDg2KTwvdGQ+Ci0gICAgPHRkPgotICA8YSBvbkNsaWNrPSJyZXR1cm4gb25Eb3dubG9hZCh0aGlzKSIKLSAgICAgaHJlZj0iaHR0cDovL2RsLmdvb2dsZS5jb20vYW5kcm9pZC9uZGsvPD9jcyB2YXI6bmRrLmxpbnV4X2Rvd25sb2FkID8+Ij48P2NzIHZhcjpuZGsubGludXhfZG93bmxvYWQgPz48L2E+Ci0gICAgPC90ZD4KLSAgICA8dGQ+PD9jcyB2YXI6bmRrLmxpbnV4X2J5dGVzID8+IGJ5dGVzPC90ZD4KLSAgICA8dGQ+PD9jcyB2YXI6bmRrLmxpbnV4X2NoZWNrc3VtID8+PC90ZD4KLSAgPC90cj4KLSAgPC90YWJsZT4KLSAgCi0gIDw/Y3MgIyMjIyMjIyMgIEhFUkUgSVMgVEhFIEpEIERPQyBDT05URU5UICMjIyMjIyMjIyA/PgotICA8P2NzIGNhbGw6dGFnX2xpc3Qocm9vdC5kZXNjcikgPz4KLQotCi0gIAotPHNjcmlwdD4KLSAgZnVuY3Rpb24gb25Eb3dubG9hZChsaW5rKSB7Ci0KLSAgICAkKCIjZG93bmxvYWRGb3JSZWFseiIpLmh0bWwoIkRvd25sb2FkICIgKyAkKGxpbmspLnRleHQoKSk7Ci0gICAgJCgiI2Rvd25sb2FkRm9yUmVhbHoiKS5hdHRyKCdocmVmJywkKGxpbmspLmF0dHIoJ2hyZWYnKSk7Ci0KLSAgICAkKCIjdG9zIikuZmFkZUluKCdzbG93Jyk7Ci0KLSAgICBsb2NhdGlvbi5oYXNoID0gImRvd25sb2FkIjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotCi0gIGZ1bmN0aW9uIG9uQWdyZWVDaGVja2VkKCkgewotICAgIGlmICgkKCJpbnB1dCNhZ3JlZSIpLmlzKCI6Y2hlY2tlZCIpKSB7Ci0gICAgICAkKCJhI2Rvd25sb2FkRm9yUmVhbHoiKS5yZW1vdmVDbGFzcygnZGlzYWJsZWQnKTsKLSAgICB9IGVsc2UgewotICAgICAgJCgiYSNkb3dubG9hZEZvclJlYWx6IikuYWRkQ2xhc3MoJ2Rpc2FibGVkJyk7Ci0gICAgfQotICB9Ci0KLSAgZnVuY3Rpb24gb25Eb3dubG9hZE5ka0ZvclJlYWx6KGxpbmspIHsKLSAgICBpZiAoJCgiaW5wdXQjYWdyZWUiKS5pcygnOmNoZWNrZWQnKSkgewotICAgICAgJCgiI3RvcyIpLmZhZGVPdXQoJ3Nsb3cnKTsKLSAgICAgIAotICAgICAgJCgnaHRtbCwgYm9keScpLmFuaW1hdGUoewotICAgICAgICAgIHNjcm9sbFRvcDogJCgiI0luc3RhbGxpbmciKS5vZmZzZXQoKS50b3AKLSAgICAgICAgfSwgODAwLCBmdW5jdGlvbigpIHsKLSAgICAgICAgICAkKCIjSW5zdGFsbGluZyIpLmNsaWNrKCk7Ci0gICAgICB9KTsKLSAgICAgCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9IGVsc2UgewotICAgICAgJCgibGFiZWwjYWdyZWVMYWJlbCIpLnBhcmVudCgpLnN0b3AoKS5hbmltYXRlKHtjb2xvcjogIiMyNThBQUYifSwgMjAwLAotICAgICAgICBmdW5jdGlvbigpIHskKCJsYWJlbCNhZ3JlZUxhYmVsIikucGFyZW50KCkuc3RvcCgpLmFuaW1hdGUoe2NvbG9yOiAiIzIyMiJ9LCAyMDApfQotICAgICAgKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0KLQotICAkKHdpbmRvdykuaGFzaGNoYW5nZSggZnVuY3Rpb24oKXsKLSAgICBpZiAobG9jYXRpb24uaGFzaCA9PSAiIikgewotICAgICAgbG9jYXRpb24ucmVsb2FkKCk7Ci0gICAgfQotICB9KTsKLQotPC9zY3JpcHQ+Ci0KLSAgPD9jcyBlbHNlID8+Ci08P2NzICMgZW5kIGlmIE5ESyAuLi4gCi0jCi0jCi0jCi0jCi0jCi0jCi0jIHRoZSBmb2xsb3dpbmcgaXMgZm9yIHRoZSBTREsKLSMKLSMgKG5lc3RlZCBpbiBpZi9lbHNlIHJlZGlyZWN0IGFuZCBpZi9lbHNlIE5ESykKLSMKLSMKLSMKLSMKLT8+Ci0gIDw/Y3MgaWY6YW5kcm9pZC53aGljaGRvYyA9PSAib25saW5lIiA/PgotCi0KLTw/Y3MgIyMjIyMjIyMgIEhFUkUgSVMgVEhFIEpEIERPQyBDT05URU5UIEZPUiBPTkxJTkUgIyMjIyMjIyMjID8+Ci08P2NzIGNhbGw6dGFnX2xpc3Qocm9vdC5kZXNjcikgPz4KLQotCi0KLQotPGg0PjxhIGhyZWY9JycgY2xhc3M9ImV4cGFuZGFibGUiCi0gIG9uY2xpY2s9InRvZ2dsZUV4cGFuZGFibGUodGhpcywnLnBheCcpO2hpZGVFeHBhbmRhYmxlKCcubXlpZGUsLnJlcXMnKTtyZXR1cm4gZmFsc2U7IgotICA+RE9XTkxPQUQgRk9SIE9USEVSIFBMQVRGT1JNUzwvYT48L2g0PgotICAKLSAgCi08ZGl2IGNsYXNzPSJwYXggY29sLTEzIG9ubGluZSIgc3R5bGU9ImRpc3BsYXk6bm9uZTttYXJnaW46MDsiPgotCi0gIAotPHAgY2xhc3M9InRhYmxlLWNhcHRpb24iPjxzdHJvbmc+QURUIEJ1bmRsZTwvc3Ryb25nPjwvcD4KLSAgPHRhYmxlIGNsYXNzPSJkb3dubG9hZCI+Ci0gICAgPHRyPgotICAgICAgPHRoPlBsYXRmb3JtPC90aD4KLSAgICAgIDx0aD5QYWNrYWdlPC90aD4KLSAgICAgIDx0aD5TaXplPC90aD4KLSAgICAgIDx0aD5NRDUgQ2hlY2tzdW08L3RoPgotICA8L3RyPgotICA8dHI+Ci0gICAgPHRkPldpbmRvd3MgMzItYml0PC90ZD4KLSAgICA8dGQ+Ci0gIDxhIG9uQ2xpY2s9InJldHVybiBvbkRvd25sb2FkKHRoaXMpIiBpZD0id2luLWJ1bmRsZTMyIgotICAgICBocmVmPSJodHRwOi8vZGwuZ29vZ2xlLmNvbS9hbmRyb2lkL2FkdC88P2NzIHZhcjpzZGsud2luMzJfYnVuZGxlX2Rvd25sb2FkID8+Ij48P2NzIHZhcjpzZGsud2luMzJfYnVuZGxlX2Rvd25sb2FkID8+PC9hPgotICAgIDwvdGQ+Ci0gICAgPHRkPjw/Y3MgdmFyOnNkay53aW4zMl9idW5kbGVfYnl0ZXMgPz4gYnl0ZXM8L3RkPgotICAgIDx0ZD48P2NzIHZhcjpzZGsud2luMzJfYnVuZGxlX2NoZWNrc3VtID8+PC90ZD4KLSAgPC90cj4KLSAgPHRyPgotICAgIDx0ZD5XaW5kb3dzIDY0LWJpdDwvdGQ+Ci0gICAgPHRkPgotICA8YSBvbkNsaWNrPSJyZXR1cm4gb25Eb3dubG9hZCh0aGlzKSIgaWQ9Indpbi1idW5kbGU2NCIKLSAgICAgaHJlZj0iaHR0cDovL2RsLmdvb2dsZS5jb20vYW5kcm9pZC9hZHQvPD9jcyB2YXI6c2RrLndpbjY0X2J1bmRsZV9kb3dubG9hZCA/PiI+PD9jcyB2YXI6c2RrLndpbjY0X2J1bmRsZV9kb3dubG9hZCA/PjwvYT4KLSAgICA8L3RkPgotICAgIDx0ZD48P2NzIHZhcjpzZGsud2luNjRfYnVuZGxlX2J5dGVzID8+IGJ5dGVzPC90ZD4KLSAgICA8dGQ+PD9jcyB2YXI6c2RrLndpbjY0X2J1bmRsZV9jaGVja3N1bSA/PjwvdGQ+Ci0gIDwvdHI+Ci0gIDx0cj4KLSAgICA8dGQ+PG5vYnI+TWFjIE9TIFggNjQtYml0PC9ub2JyPjwvdGQ+Ci0gICAgPHRkPgotICA8YSBvbkNsaWNrPSJyZXR1cm4gb25Eb3dubG9hZCh0aGlzKSIgaWQ9Im1hYy1idW5kbGU2NCIKLSAgICAgaHJlZj0iaHR0cDovL2RsLmdvb2dsZS5jb20vYW5kcm9pZC9hZHQvPD9jcyB2YXI6c2RrLm1hYzY0X2J1bmRsZV9kb3dubG9hZCA/PiI+PD9jcyB2YXI6c2RrLm1hYzY0X2J1bmRsZV9kb3dubG9hZCA/PjwvYT4KLSAgICA8L3RkPgotICAgIDx0ZD48P2NzIHZhcjpzZGsubWFjNjRfYnVuZGxlX2J5dGVzID8+IGJ5dGVzPC90ZD4KLSAgICA8dGQ+PD9jcyB2YXI6c2RrLm1hYzY0X2J1bmRsZV9jaGVja3N1bSA/PjwvdGQ+Ci0gIDwvdHI+Ci0gIDx0cj4KLSAgICA8dGQ+TGludXggMzItYml0PC90ZD4KLSAgICA8dGQ+Ci0gIDxhIG9uQ2xpY2s9InJldHVybiBvbkRvd25sb2FkKHRoaXMpIiBpZD0ibGludXgtYnVuZGxlMzIiCi0gICAgIGhyZWY9Imh0dHA6Ly9kbC5nb29nbGUuY29tL2FuZHJvaWQvYWR0Lzw/Y3MgdmFyOnNkay5saW51eDMyX2J1bmRsZV9kb3dubG9hZCA/PiI+PD9jcyB2YXI6c2RrLmxpbnV4MzJfYnVuZGxlX2Rvd25sb2FkID8+PC9hPgotICAgIDwvdGQ+Ci0gICAgPHRkPjw/Y3MgdmFyOnNkay5saW51eDMyX2J1bmRsZV9ieXRlcyA/PiBieXRlczwvdGQ+Ci0gICAgPHRkPjw/Y3MgdmFyOnNkay5saW51eDMyX2J1bmRsZV9jaGVja3N1bSA/PjwvdGQ+Ci0gIDwvdHI+Ci0gIDx0cj4KLSAgICA8dGQ+TGludXggNjQtYml0PC90ZD4KLSAgICA8dGQ+Ci0gIDxhIG9uQ2xpY2s9InJldHVybiBvbkRvd25sb2FkKHRoaXMpIiBpZD0ibGludXgtYnVuZGxlNjQiCi0gICAgIGhyZWY9Imh0dHA6Ly9kbC5nb29nbGUuY29tL2FuZHJvaWQvYWR0Lzw/Y3MgdmFyOnNkay5saW51eDY0X2J1bmRsZV9kb3dubG9hZCA/PiI+PD9jcyB2YXI6c2RrLmxpbnV4NjRfYnVuZGxlX2Rvd25sb2FkID8+PC9hPgotICAgIDwvdGQ+Ci0gICAgPHRkPjw/Y3MgdmFyOnNkay5saW51eDY0X2J1bmRsZV9ieXRlcyA/PiBieXRlczwvdGQ+Ci0gICAgPHRkPjw/Y3MgdmFyOnNkay5saW51eDY0X2J1bmRsZV9jaGVja3N1bSA/PjwvdGQ+Ci0gIDwvdHI+Ci0gIDwvdGFibGU+Ci0KLQotPHAgY2xhc3M9InRhYmxlLWNhcHRpb24iPjxzdHJvbmc+U0RLIFRvb2xzIE9ubHk8L3N0cm9uZz48L3A+Ci0gIDx0YWJsZSBjbGFzcz0iZG93bmxvYWQiPgotICAgIDx0cj4KLSAgICAgIDx0aD5QbGF0Zm9ybTwvdGg+Ci0gICAgICA8dGg+UGFja2FnZTwvdGg+Ci0gICAgICA8dGg+U2l6ZTwvdGg+Ci0gICAgICA8dGg+TUQ1IENoZWNrc3VtPC90aD4KLSAgPC90cj4KLSAgPHRyPgotICAgIDx0ZCByb3dzcGFuPSIyIj5XaW5kb3dzPC90ZD4KLSAgICA8dGQ+Ci0gIDxhIG9uY2xpY2s9InJldHVybiBvbkRvd25sb2FkKHRoaXMpIiBocmVmPSJodHRwOi8vZGwuZ29vZ2xlLmNvbS9hbmRyb2lkLzw/Y3MgdmFyOnNkay53aW5fZG93bmxvYWQKLT8+Ij48P2NzIHZhcjpzZGsud2luX2Rvd25sb2FkID8+PC9hPgotICAgIDwvdGQ+Ci0gICAgPHRkPjw/Y3MgdmFyOnNkay53aW5fYnl0ZXMgPz4gYnl0ZXM8L3RkPgotICAgIDx0ZD48P2NzIHZhcjpzZGsud2luX2NoZWNrc3VtID8+PC90ZD4KLSAgPC90cj4KLSAgPHRyPgotICAgIDwhLS0gYmxhbmsgVEQgZnJvbSBXaW5kb3dzIHJvd3NwYW4gLS0+Ci0gICAgPHRkPgotICA8YSBvbmNsaWNrPSJyZXR1cm4gb25Eb3dubG9hZCh0aGlzKSIgaWQ9Indpbi10b29scyIgaHJlZj0iaHR0cDovL2RsLmdvb2dsZS5jb20vYW5kcm9pZC88P2NzCi12YXI6c2RrLndpbl9pbnN0YWxsZXIKLT8+Ij48P2NzIHZhcjpzZGsud2luX2luc3RhbGxlciA/PjwvYT4gKFJlY29tbWVuZGVkKQotICAgIDwvdGQ+Ci0gICAgPHRkPjw/Y3MgdmFyOnNkay53aW5faW5zdGFsbGVyX2J5dGVzID8+IGJ5dGVzPC90ZD4KLSAgICA8dGQ+PD9jcyB2YXI6c2RrLndpbl9pbnN0YWxsZXJfY2hlY2tzdW0gPz48L3RkPgotICA8L3RyPgotICA8dHI+Ci0gICAgPHRkPk1hYyBPUyBYPC90ZD4KLSAgICA8dGQ+Ci0gIDxhIG9uY2xpY2s9InJldHVybiBvbkRvd25sb2FkKHRoaXMpIiBpZD0ibWFjLXRvb2xzIiBocmVmPSJodHRwOi8vZGwuZ29vZ2xlLmNvbS9hbmRyb2lkLzw/Y3MKLXZhcjpzZGsubWFjX2Rvd25sb2FkCi0/PiI+PD9jcyB2YXI6c2RrLm1hY19kb3dubG9hZCA/PjwvYT4KLSAgICA8L3RkPgotICAgIDx0ZD48P2NzIHZhcjpzZGsubWFjX2J5dGVzID8+IGJ5dGVzPC90ZD4KLSAgICA8dGQ+PD9jcyB2YXI6c2RrLm1hY19jaGVja3N1bSA/PjwvdGQ+Ci0gIDwvdHI+Ci0gIDx0cj4KLSAgICA8dGQ+TGludXg8L3RkPgotICAgIDx0ZD4KLSAgPGEgb25jbGljaz0icmV0dXJuIG9uRG93bmxvYWQodGhpcykiIGlkPSJsaW51eC10b29scyIgaHJlZj0iaHR0cDovL2RsLmdvb2dsZS5jb20vYW5kcm9pZC88P2NzCi12YXI6c2RrLmxpbnV4X2Rvd25sb2FkCi0/PiI+PD9jcyB2YXI6c2RrLmxpbnV4X2Rvd25sb2FkID8+PC9hPgotICAgIDwvdGQ+Ci0gICAgPHRkPjw/Y3MgdmFyOnNkay5saW51eF9ieXRlcyA/PiBieXRlczwvdGQ+Ci0gICAgPHRkPjw/Y3MgdmFyOnNkay5saW51eF9jaGVja3N1bSA/PjwvdGQ+Ci0gIDwvdHI+Ci0gIDwvdGFibGU+Ci0KLTwvZGl2PjwhLS0gZW5kIHBheCAtLT4KLQotCi0KLTwvZGl2PjwhLS0gZW5kIGNvbC0xMyBmb3IgbG93ZXItaGFsZiBjb250ZW50IC0tPgotICAKLSAgCi0gIAotICAKLTxzY3JpcHQ+Ci0gIGlmIChsb2NhdGlvbi5oYXNoID09ICIjUmVxdWlyZW1lbnRzIikgewotICAgICQoJy5yZXFzJykuc2hvdygpOwotICB9IGVsc2UgaWYgKGxvY2F0aW9uLmhhc2ggPT0gIiNFeGlzdGluZ0lERSIpIHsKLQkgJCgnLmlkZScpLnNob3coKTsKLSAgfQotCi0gIHZhciBvczsKLSAgdmFyIGJ1bmRsZW5hbWU7Ci0gIHZhciAkdG9vbHNsaW5rOwotCi0gIGlmIChuYXZpZ2F0b3IuYXBwVmVyc2lvbi5pbmRleE9mKCJXaW4iKSE9LTEpIHsKLSAgICBvcyA9ICJXaW5kb3dzIjsKLSAgICBidW5kbGVuYW1lID0gJyN3aW4tYnVuZGxlJzsKLSAgICAkdG9vbHNsaW5rID0gJCgnI3dpbi10b29scycpOwotICB9IGVsc2UgaWYgKG5hdmlnYXRvci5hcHBWZXJzaW9uLmluZGV4T2YoIk1hYyIpIT0tMSkgewotICAgIG9zID0gIk1hYyI7Ci0gICAgYnVuZGxlbmFtZSA9ICcjbWFjLWJ1bmRsZSc7Ci0gICAgJHRvb2xzbGluayA9ICQoJyNtYWMtdG9vbHMnKTsKLSAgfSBlbHNlIGlmIChuYXZpZ2F0b3IuYXBwVmVyc2lvbi5pbmRleE9mKCJMaW51eCIpIT0tMSkgewotICAgIG9zID0gIkxpbnV4IjsKLSAgICBidW5kbGVuYW1lID0gJyNsaW51eC1idW5kbGUnOwotICAgICR0b29sc2xpbmsgPSAkKCcjbGludXgtdG9vbHMnKTsKLSAgfQotCi0gIGlmIChvcykgewotICAgICQoJyNub3Qtc3VwcG9ydGVkJykuaGlkZSgpOwotCi0gICAgLyogc2V0IHVwIHByaW1hcnkgYWR0IGRvd25sb2FkIGJ1dHRvbiAqLwotICAgICQoJyNkb3dubG9hZC1idW5kbGUtYnV0dG9uJykuc2hvdygpOwotICAgICQoJyNkb3dubG9hZC1idW5kbGUtYnV0dG9uJykuYXBwZW5kKCJEb3dubG9hZCB0aGUgU0RLIDxici8+PHNwYW4gY2xhc3M9J3NtYWxsJz5BRFQgQnVuZGxlIGZvciAiICsgb3MgKyAiPC9zcGFuPiIpOwotICAgICQoJyNkb3dubG9hZC1idW5kbGUtYnV0dG9uJykuY2xpY2soZnVuY3Rpb24oKSB7cmV0dXJuIG9uRG93bmxvYWQodGhpcyx0cnVlLHRydWUpO30pLmF0dHIoJ2hyZWYnLCBidW5kbGVuYW1lKTsKLQotICAgIC8qIHNldCB1cCBzZGsgdG9vbHMgb25seSBidXR0b24gKi8KLSAgICAkKCcjZG93bmxvYWQtdG9vbHMtYnV0dG9uJykuc2hvdygpOwotICAgICQoJyNkb3dubG9hZC10b29scy1idXR0b24nKS5hcHBlbmQoIkRvd25sb2FkIHRoZSBTREsgVG9vbHMgZm9yICIgKyBvcyk7Ci0gICAgJCgnI2Rvd25sb2FkLXRvb2xzLWJ1dHRvbicpLmNsaWNrKGZ1bmN0aW9uKCkge3JldHVybiBvbkRvd25sb2FkKHRoaXMsdHJ1ZSk7fSkuYXR0cignaHJlZicsICR0b29sc2xpbmsuYXR0cignaHJlZicpKTsKLSAgfSBlbHNlIHsKLSAgICAkKCcucGF4Jykuc2hvdygpOwotICB9Ci0gIAotICAKLSAgZnVuY3Rpb24gb25Eb3dubG9hZChsaW5rLCBidXR0b24sIGJ1bmRsZSkgewotICAKLSAgICAvKiBzZXQgdGV4dCBmb3IgZG93bmxvYWQgYnV0dG9uICovCi0gICAgaWYgKGJ1dHRvbikgewotICAgICAgJCgiI2Rvd25sb2FkRm9yUmVhbHoiKS5odG1sKCQobGluaykudGV4dCgpKTsKLSAgICB9IGVsc2UgewotICAgICAgJCgiI2Rvd25sb2FkRm9yUmVhbHoiKS5odG1sKCJEb3dubG9hZCAiICsgJChsaW5rKS50ZXh0KCkpOwotICAgIH0KLSAgICAKLSAgICAvKiBpZiBpdCdzIGEgYnVuZGxlLCBzaG93IHRoZSAzMi82NC1iaXQgcGlja2VyICovCi0gICAgaWYgKGJ1bmRsZSkgewotICAgICAgJCgiI2Rvd25sb2FkRm9yUmVhbHoiKS5hdHRyKCdidW5kbGUnLCd0cnVlJyk7Ci0gICAgICBpZiAoJCgiI2Rvd25sb2FkRm9yUmVhbHoiKS50ZXh0KCkuaW5kZXhPZigiTWFjIikgPT0gLTEpIHsKLSAgICAgICAgJCgicCNiaXRwaWNrZXIiKS5zaG93KCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAvKiBtYWMgaXMgYWx3YXlzIDY0IGJpdCwgc28gc2V0IGl0IGNoZWNrZWQgKi8KLSAgICAgICAgJCgicCNiaXRwaWNrZXIgaW5wdXRbdmFsdWU9NjRdIikuYXR0cignY2hlY2tlZCcsIHRydWUpOwotICAgICAgfQotICAgICAgLyogc2F2ZSBsaW5rIG5hbWUgdW50aWwgdGhlIGJpdCB2ZXJzaW9uIGlzIGNob3NlbiAqLwotICAgICAgJCgiI2Rvd25sb2FkRm9yUmVhbHoiKS5hdHRyKCduYW1lJywkKGxpbmspLmF0dHIoJ2hyZWYnKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8qIGlmIG5vdCB1c2luZyBidW5kbGUsIHNldCBkb3dubG9hZCBidXR0b24gdG8gaWdub3JlIGJpdHBpY2tlciBhbmQgc2V0IHVybCAqLwotICAgICAgJCgiI2Rvd25sb2FkRm9yUmVhbHoiKS5hdHRyKCdidW5kbGUnLCdmYWxzZScpOwotICAgICAgJCgiI2Rvd25sb2FkRm9yUmVhbHoiKS5hdHRyKCdocmVmJywkKGxpbmspLmF0dHIoJ2hyZWYnKSk7Ci0gICAgICAvKiBzZXQgcGlja2VyIGNoZWNrZWQgYXMgYSBmYWtlIGRlZmF1bHQgKi8KLSAgICAgICQoInAjYml0cGlja2VyIGlucHV0W3ZhbHVlPTY0XSIpLmF0dHIoJ2NoZWNrZWQnLCB0cnVlKTsKLSAgICAgICQoImEjbmV4dC1saW5rIikuaHRtbCgiU2V0dGluZyBVcCBhbiBFeGlzdGluZyBJREUiKS5hdHRyKCdocmVmJyx0b1Jvb3QgKyAnc2RrL2luc3RhbGxpbmcvaW5kZXguaHRtbCcpOwotICAgIH0KLQotICAgICQoIiN0b3MiKS5mYWRlSW4oJ2Zhc3QnKTsKLSAgICAkKCIjbGFuZGluZyIpLmZhZGVPdXQoJ2Zhc3QnKTsKLQotICAgIGxvY2F0aW9uLmhhc2ggPSAiZG93bmxvYWQiOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0KLSAgZnVuY3Rpb24gb25BZ3JlZUNoZWNrZWQoKSB7Ci0gICAgLyogdmVyaWZ5IHRoYXQgdGhlIFRPUyBpcyBhZ3JlZWQgYW5kIGEgYml0IHZlcnNpb24gaXMgY2hvc2VuICovCi0gICAgaWYgKCQoImlucHV0I2FncmVlIikuaXMoIjpjaGVja2VkIikgJiYgJCgiI2JpdHBpY2tlciBpbnB1dDpjaGVja2VkIikubGVuZ3RoKSB7Ci0gICAgICAKLSAgICAgIC8qIGlmIGRvd25sb2FkaW5nIHRoZSBidW5kbGUgKi8KLSAgICAgIGlmICgkKCIjZG93bmxvYWRGb3JSZWFseiIpLmF0dHIoJ2J1bmRsZScpKSB7Ci0gICAgICAgIC8qIGNvbnN0cnVjdCB0aGUgbmFtZSBvZiB0aGUgbGluayB3ZSB3YW50IGJhc2VkIG9uIHRoZSBiaXQgdmVyc2lvbiAqLwotICAgICAgICBsaW5rSWQgPSAkKCJhI2Rvd25sb2FkRm9yUmVhbHoiKS5hdHRyKCJuYW1lIikgKyAkKCIjYml0cGlja2VyIGlucHV0OmNoZWNrZWQiKS52YWwoKTsKLSAgICAgICAgLyogc2V0IHRoZSByZWFsIHVybCBmb3IgZG93bmxvYWQgKi8KLSAgICAgICAgJCgiYSNkb3dubG9hZEZvclJlYWx6IikuYXR0cigiaHJlZiIsICQobGlua0lkKS5hdHRyKCJocmVmIikpOwotICAgICAgfQotICAgICAgCi0gICAgICAvKiByZXZlYWwgdGhlIGRvd25sb2FkIGJ1dHRvbiAqLwotICAgICAgJCgiYSNkb3dubG9hZEZvclJlYWx6IikucmVtb3ZlQ2xhc3MoJ2Rpc2FibGVkJyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICQoImEjZG93bmxvYWRGb3JSZWFseiIpLmFkZENsYXNzKCdkaXNhYmxlZCcpOwotICAgIH0KLSAgfQotCi0gIGZ1bmN0aW9uIG9uRG93bmxvYWRGb3JSZWFseihsaW5rKSB7Ci0gICAgaWYgKCQoImlucHV0I2FncmVlIikuaXMoJzpjaGVja2VkJykgJiYgJCgiI2JpdHBpY2tlciBpbnB1dDpjaGVja2VkIikubGVuZ3RoKSB7Ci0gICAgICAkKCJkaXYuc2RrLXRlcm1zIikuc2xpZGVVcCgpOwotICAgICAgJCgiI3Nkay10ZXJtcy1mb3JtLC5zZGstdGVybXMtaW50cm8iKS5mYWRlT3V0KCdzbG93Jyk7Ci0gICAgICAkKCIjbmV4dC1zdGVwcyIpLmZhZGVJbignc2xvdycpOwotICAgICAgJCgiaDEjdG9zLWhlYWRlciIpLnRleHQoJ0dldCBSZWFkeSB0byBDb2RlIScpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfSBlbHNlIHsKLSAgICAgICQoImxhYmVsI2FncmVlTGFiZWwsI2JpdHBpY2tlciBpbnB1dCIpLnBhcmVudCgpLnN0b3AoKS5hbmltYXRlKHtjb2xvcjogIiMyNThBQUYifSwgMjAwLAotICAgICAgICBmdW5jdGlvbigpIHskKCJsYWJlbCNhZ3JlZUxhYmVsLCNiaXRwaWNrZXIgaW5wdXQiKS5wYXJlbnQoKS5zdG9wKCkuYW5pbWF0ZSh7Y29sb3I6ICIjMjIyIn0sIDIwMCl9Ci0gICAgICApOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotCi0gICQod2luZG93KS5oYXNoY2hhbmdlKCBmdW5jdGlvbigpewotICAgIGlmIChsb2NhdGlvbi5oYXNoID09ICIiKSB7Ci0gICAgICBsb2NhdGlvbi5yZWxvYWQoKTsKLSAgICB9Ci0gIH0pOwotCi08L3NjcmlwdD4KLQotCi0KLTwvZGl2PjwhLS0gZW5kIHRoZSB3cmFwcGVyIHVzZWQgZm9yIHJlbGF0aXZlL2Fic29sdXRlIHBvc2l0aW9ucyAgLS0+Ci08P2NzICMgVEhJUyBESVYgV0FTIE9QRU5FRCBJTiBJTkRFWC5KRCA/PgotCi0KLQotCi0gIDw/Y3MgZWxzZSA/PiA8P2NzICMgZW5kIGlmIG9ubGluZSA/PgotCi0gICAgPD9jcyBpZjpzZGsucHJldmlldyA/Pjw/Y3MgIyBpdCdzIHByZXZpZXcgb2ZmbGluZSBkb2NzID8+Ci0gICAgICA8cD5XZWxjb21lIGRldmVsb3BlcnMhIFdlIGFyZSBwbGVhc2VkIHRvIHByb3ZpZGUgeW91IHdpdGggYSBwcmV2aWV3IFNESyBmb3IgdGhlIHVwY29taW5nCi0gICAgQW5kcm9pZCAzLjAgcmVsZWFzZSwgdG8gZ2l2ZSB5b3UgYSBoZWFkLXN0YXJ0IG9uIGRldmVsb3BpbmcgYXBwbGljYXRpb25zIGZvciBpdC4KLSAgICA8L3A+Ci0gICAgCi0gICAgICA8cD5TZWUgdGhlIDxhCi0gICAgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+c2RrL3ByZXZpZXcvc3RhcnQuaHRtbCI+R2V0dGluZyBTdGFydGVkPC9hPiBkb2N1bWVudCBmb3IgbW9yZSBpbmZvcm1hdGlvbgotICAgIGFib3V0IGhvdyB0byBzZXQgdXAgdGhlIHByZXZpZXcgU0RLIGFuZCBnZXQgc3RhcnRlZC48L3A+Ci0gICAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KLSAgICAubm9uLXByZXZpZXcgeyBkaXNwbGF5Om5vbmU7IH0KLSAgICA8L3N0eWxlPgotICAgIAotICAgIDw/Y3MgZWxzZSA/Pjw/Y3MgIyBpdCdzIG5vcm1hbCBvZmZsaW5lIGRvY3MgPz4KLSAgICAgIAotICAgICAgPD9jcyAjIyMjIyMjIyAgSEVSRSBJUyBUSEUgSkQgRE9DIENPTlRFTlQgRk9SIE9GRkxJTkUgIyMjIyMjIyMjID8+Ci0gICAgICA8P2NzIGNhbGw6dGFnX2xpc3Qocm9vdC5kZXNjcikgPz4KLSAgICAgIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Ci0gICAgICAgIGJvZHkgLm9mZmxpbmUgeyBkaXNwbGF5OmJsb2NrOyB9Ci0gICAgICAgIGJvZHkgLm9ubGluZSB7IGRpc3BsYXk6bm9uZTsgfQotICAgICAgPC9zdHlsZT4gICAgICAKLSAgICAgIDxzY3JpcHQ+Ci0gICAgICAgICQoJy5yZXFzJykuc2hvdygpOwotICAgICAgPC9zY3JpcHQ+Ci0gICAgPD9jcyAvaWYgPz4KLSAgICAKLSAgPD9jcyAvaWYgPz4gPD9jcyAjIGVuZCBpZi9lbHNlIG9ubGluZSA/PgotICAKLTw/Y3MgL2lmID8+IDw/Y3MgIyBlbmQgaWYvZWxzZSBOREsgPz4KLQotPD9jcyAvaWYgPz4gPD9jcyAjIGVuZCBpZi9lbHNlIHJlZGlyZWN0ID8+Ci0KLQotPC9kaXY+PCEtLSBlbmQgamQtY29udGVudCAtLT4KLQotPD9jcyBpZjohc2RrLnJlZGlyZWN0ID8+Ci08P2NzIGluY2x1ZGU6ImZvb3Rlci5jcyIgPz4KLTw/Y3MgL2lmID8+Ci0KLTwvZGl2PjwhLS0gZW5kIGctdW5pdCAtLT4KLQotPD9jcyBpbmNsdWRlOiJ0cmFpbGVyLmNzIiA/PgotCi08L2JvZHk+Ci08L2h0bWw+Ci0KLQotCmRpZmYgLS1naXQgYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL3RpbWVzdGFtcC5jcyBiL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvdGltZXN0YW1wLmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmY1MDJhLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvdGltZXN0YW1wLmNzCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotdmFyIEJVSUxEX1RJTUVTVEFNUCA9ICI8P2NzIHZhcjpwYWdlLm5vdyA/PiI7CmRpZmYgLS1naXQgYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL3RyYWlsZXIuY3MgYi90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL3RyYWlsZXIuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzN2Y4ZDMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy90cmFpbGVyLmNzCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotPC9kaXY+IDwhLS0gZW5kIGJvZHktY29udGVudCAtLT4gPD9jcyAjIG5vcm1hbGx5IG9wZW5lZCBieSBoZWFkZXIuY3MgPz4KLQotPD9jcyBpZjpjYXJvdXNlbCA/PgotPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotJCgnLnNsaWRlc2hvdy1jb250YWluZXInKS5kYWNTbGlkZXNob3coewotICAgIGJ0blByZXY6ICcuc2xpZGVzaG93LXByZXYnLAotICAgIGJ0bk5leHQ6ICcuc2xpZGVzaG93LW5leHQnLAotICAgIGJ0blBhdXNlOiAnI3BhdXNlQnV0dG9uJwotfSk7Ci08L3NjcmlwdD4KLTw/Y3MgL2lmID8+Ci08P2NzIGlmOnRhYmJlZExpc3QgPz4KLTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSQoIi5mZWVkIikuZGFjVGFiYmVkTGlzdCh7Ci0gICAgbmF2X2lkOiAnLmZlZWQtbmF2JywKLSAgICBmcmFtZV9pZDogJy5mZWVkLWZyYW1lJwotfSk7Ci08L3NjcmlwdD4KLTw/Y3MgL2lmID8+Ci0KZGlmZiAtLWdpdCBhL3Rvb2xzL2Ryb2lkZG9jL3Rlc3Qvc3R1YnMvcnVuLnNoIGIvdG9vbHMvZHJvaWRkb2MvdGVzdC9zdHVicy9ydW4uc2gKaW5kZXggMmVhMTVhNi4uN2M4YTg5NCAxMDA3NTUKLS0tIGEvdG9vbHMvZHJvaWRkb2MvdGVzdC9zdHVicy9ydW4uc2gKKysrIGIvdG9vbHMvZHJvaWRkb2MvdGVzdC9zdHVicy9ydW4uc2gKQEAgLTE0LDcgKzE0LDcgQEAKICMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAotRElSPWJ1aWxkL3Rvb2xzL2Ryb2lkZG9jL3Rlc3Qvc3R1YnMKK0RJUj1idWlsZC9tYWtlL3Rvb2xzL2Ryb2lkZG9jL3Rlc3Qvc3R1YnMKIAogcHVzaGQgJFRPUAogCmRpZmYgLS1naXQgYS90b29scy9mc19jb25maWcvQW5kcm9pZC5icCBiL3Rvb2xzL2ZzX2NvbmZpZy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5N2NmZTIKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9mc19jb25maWcvQW5kcm9pZC5icApAQCAtMCwwICsxLDYzIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworY2NfYmluYXJ5X2hvc3QgeworICAgIG5hbWU6ICJmc19jb25maWciLAorICAgIHNyY3M6IFsiZnNfY29uZmlnLmMiXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYnNlbGludXgiLAorICAgIF0sCisgICAgY2ZsYWdzOiBbIi1XZXJyb3IiXSwKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFVuaXQgdGVzdHMuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0ZXN0X2NfZmxhZ3MgPSBbCisgICAgIi1mc3RhY2stcHJvdGVjdG9yLWFsbCIsCisgICAgIi1nIiwKKyAgICAiLVdhbGwiLAorICAgICItV2V4dHJhIiwKKyAgICAiLVdlcnJvciIsCisgICAgIi1mbm8tYnVpbHRpbiIsCisgICAgIi1EQU5EUk9JRF9GSUxFU1lTVEVNX0NPTkZJRz1cImFuZHJvaWRfZmlsZXN5c3RlbV9jb25maWdfdGVzdF9kYXRhLmhcIiIsCitdCisKKy8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisvLyB0ZXN0IGV4ZWN1dGFibGUKK2NjX3Rlc3RfaG9zdCB7CisgICAgbmFtZTogImZzX2NvbmZpZ19nZW5lcmF0ZV90ZXN0IiwKKyAgICBzcmNzOiBbImZzX2NvbmZpZ19nZW5lcmF0ZS5jIl0sCisgICAgc2hhcmVkX2xpYnM6IFsibGliY3V0aWxzIl0sCisgICAgY2ZsYWdzOiB0ZXN0X2NfZmxhZ3MsCisgICAgcmVsYXRpdmVfaW5zdGFsbF9wYXRoOiAiZnNfY29uZmlnLXVuaXQtdGVzdHMiLAorICAgIG5vX25hbWVkX2luc3RhbGxfZGlyZWN0b3J5OiB0cnVlLAorICAgIGd0ZXN0OiBmYWxzZSwKKworfQorCisvLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworLy8gZ1Rlc3QgdG9vbAorY2NfdGVzdF9ob3N0IHsKKyAgICBuYW1lOiAiZnNfY29uZmlnLXVuaXQtdGVzdHMiLAorICAgIGNmbGFnczogdGVzdF9jX2ZsYWdzICsgWyItREhPU1QiXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJiYXNlIiwKKyAgICBdLAorICAgIHNyY3M6IFsiZnNfY29uZmlnX3Rlc3QuY3BwIl0sCit9CmRpZmYgLS1naXQgYS90b29scy9mc19jb25maWcvQW5kcm9pZC5tayBiL3Rvb2xzL2ZzX2NvbmZpZy9BbmRyb2lkLm1rCmluZGV4IGFiN2Y5MmQuLmEwMWU3MDIgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2ZzX2NvbmZpZy9BbmRyb2lkLm1rCisrKyBiL3Rvb2xzL2ZzX2NvbmZpZy9BbmRyb2lkLm1rCkBAIC0xNCwxNSArMTQsNiBAQAogCiBMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCiAKLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9TUkNfRklMRVMgOj0gZnNfY29uZmlnLmMKLUxPQ0FMX01PRFVMRSA6PSBmc19jb25maWcKLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliY3V0aWxzIGxpYnNlbGludXgKLUxPQ0FMX0NGTEFHUyA6PSAtV2Vycm9yCi0KLWluY2x1ZGUgJChCVUlMRF9IT1NUX0VYRUNVVEFCTEUpCi0KICMgT25lIGNhbiBvdmVycmlkZSB0aGUgZGVmYXVsdCBhbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmggZmlsZSBpbiBvbmUgb2YgdHdvIHdheXM6CiAjCiAjIDEuIFRoZSBvbGQgd2F5OgpAQCAtMjUzLDIzICsyNDQsMjQgQEAKIGlmbmVxICgkKFRBUkdFVF9GU19DT05GSUdfR0VOKSwpCiAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQnVpbGQgdGhlIG9lbWFpZCBsaWJyYXJ5IHdoZW4gZnMgY29uZmlnIGZpbGVzIGFyZSBwcmVzZW50LgotIyBJbnRlbnRpb25hbGx5IGJyZWFrIGJ1aWxkIGlmIHlvdSByZXF1aXJlIGdlbmVyYXRlZCBBSURTCisjIEJ1aWxkIHRoZSBvZW1haWQgaGVhZGVyIGxpYnJhcnkgd2hlbiBmcyBjb25maWcgZmlsZXMgYXJlIHByZXNlbnQuCisjIEludGVudGlvbmFsbHkgYnJlYWsgYnVpbGQgaWYgeW91IHJlcXVpcmUgZ2VuZXJhdGVkIEFJRHMKICMgaGVhZGVyIGZpbGUsIGJ1dCBhcmUgbm90IHVzaW5nIGFueSBmcyBjb25maWcgZmlsZXMuCiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKLUxPQ0FMX01PRFVMRSA6PSBsaWJvZW1haWRzCitMT0NBTF9NT0RVTEUgOj0gb2VtYWlkc19oZWFkZXJzCiBMT0NBTF9FWFBPUlRfQ19JTkNMVURFX0RJUlMgOj0gJChkaXIgJChteV9nZW5fb2VtX2FpZCkpCiBMT0NBTF9FWFBPUlRfQ19JTkNMVURFX0RFUFMgOj0gJChteV9nZW5fb2VtX2FpZCkKLWluY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkKK2luY2x1ZGUgJChCVUlMRF9IRUFERVJfTElCUkFSWSkKIAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBHZW5lcmF0ZSB0aGUgc3lzdGVtL2V0Yy9wYXNzd2QgdGV4dCBmaWxlIGZvciB0aGUgdGFyZ2V0CisjIEdlbmVyYXRlIHRoZSB2ZW5kb3IvZXRjL3Bhc3N3ZCB0ZXh0IGZpbGUgZm9yIHRoZSB0YXJnZXQKICMgVGhpcyBmaWxlIG1heSBiZSBlbXB0eSBpZiBubyBBSURzIGFyZSBkZWZpbmVkIGluCiAjIFRBUkdFVF9GU19DT05GSUdfR0VOIGZpbGVzLgogaW5jbHVkZSAkKENMRUFSX1ZBUlMpCiAKIExPQ0FMX01PRFVMRSA6PSBwYXNzd2QKIExPQ0FMX01PRFVMRV9DTEFTUyA6PSBFVEMKK0xPQ0FMX1ZFTkRPUl9NT0RVTEUgOj0gdHJ1ZQogCiBpbmNsdWRlICQoQlVJTERfU1lTVEVNKS9iYXNlX3J1bGVzLm1rCiAKQEAgLTI3OCwxNiArMjcwLDE3IEBACiAkKExPQ0FMX0JVSUxUX01PRFVMRSk6IFBSSVZBVEVfQU5EUk9JRF9GU19IRFIgOj0gJChzeXN0ZW1fYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZykKICQoTE9DQUxfQlVJTFRfTU9EVUxFKTogJChMT0NBTF9QQVRIKS9mc19jb25maWdfZ2VuZXJhdG9yLnB5ICQoVEFSR0VUX0ZTX0NPTkZJR19HRU4pICQoc3lzdGVtX2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcpCiAJQG1rZGlyIC1wICQoZGlyICRAKQotCSQoaGlkZSkgJDwgcGFzc3dkIC0tYWlkLWhlYWRlcj0kKFBSSVZBVEVfQU5EUk9JRF9GU19IRFIpICQoUFJJVkFURV9UQVJHRVRfRlNfQ09ORklHX0dFTikgPiAkQAorCSQoaGlkZSkgJDwgcGFzc3dkIC0tcmVxdWlyZWQtcHJlZml4PXZlbmRvcl8gLS1haWQtaGVhZGVyPSQoUFJJVkFURV9BTkRST0lEX0ZTX0hEUikgJChQUklWQVRFX1RBUkdFVF9GU19DT05GSUdfR0VOKSA+ICRACiAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgR2VuZXJhdGUgdGhlIHN5c3RlbS9ldGMvZ3JvdXAgdGV4dCBmaWxlIGZvciB0aGUgdGFyZ2V0CisjIEdlbmVyYXRlIHRoZSB2ZW5kb3IvZXRjL2dyb3VwIHRleHQgZmlsZSBmb3IgdGhlIHRhcmdldAogIyBUaGlzIGZpbGUgbWF5IGJlIGVtcHR5IGlmIG5vIEFJRHMgYXJlIGRlZmluZWQgaW4KICMgVEFSR0VUX0ZTX0NPTkZJR19HRU4gZmlsZXMuCiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIAogTE9DQUxfTU9EVUxFIDo9IGdyb3VwCiBMT0NBTF9NT0RVTEVfQ0xBU1MgOj0gRVRDCitMT0NBTF9WRU5ET1JfTU9EVUxFIDo9IHRydWUKIAogaW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvYmFzZV9ydWxlcy5tawogCkBAIC0yOTYsNyArMjg5LDcgQEAKICQoTE9DQUxfQlVJTFRfTU9EVUxFKTogUFJJVkFURV9BTkRST0lEX0ZTX0hEUiA6PSAkKHN5c3RlbV9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnKQogJChMT0NBTF9CVUlMVF9NT0RVTEUpOiAkKExPQ0FMX1BBVEgpL2ZzX2NvbmZpZ19nZW5lcmF0b3IucHkgJChUQVJHRVRfRlNfQ09ORklHX0dFTikgJChzeXN0ZW1fYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZykKIAlAbWtkaXIgLXAgJChkaXIgJEApCi0JJChoaWRlKSAkPCBncm91cCAtLWFpZC1oZWFkZXI9JChQUklWQVRFX0FORFJPSURfRlNfSERSKSAkKFBSSVZBVEVfVEFSR0VUX0ZTX0NPTkZJR19HRU4pID4gJEAKKwkkKGhpZGUpICQ8IGdyb3VwIC0tcmVxdWlyZWQtcHJlZml4PXZlbmRvcl8gLS1haWQtaGVhZGVyPSQoUFJJVkFURV9BTkRST0lEX0ZTX0hEUikgJChQUklWQVRFX1RBUkdFVF9GU19DT05GSUdfR0VOKSA+ICRACiAKIHN5c3RlbV9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnIDo9CiBlbmRpZgpAQCAtMzA2LDM2ICsyOTksMyBAQAogZnNfY29uZmlnX2dlbmVyYXRlX2JpbiA6PQogbXlfZ2VuX29lbV9haWQgOj0KIGZzX2NvbmZpZ19nZW5lcmF0ZV9leHRyYV9wYXJ0aXRpb25fbGlzdCA6PQotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIFVuaXQgdGVzdHMuCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXRlc3RfY19mbGFncyA6PSBcCi0gICAgLWZzdGFjay1wcm90ZWN0b3ItYWxsIFwKLSAgICAtZyBcCi0gICAgLVdhbGwgXAotICAgIC1XZXh0cmEgXAotICAgIC1XZXJyb3IgXAotICAgIC1mbm8tYnVpbHRpbiBcCi0gICAgLURBTkRST0lEX0ZJTEVTWVNURU1fQ09ORklHPSciYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZ190ZXN0X2RhdGEuaCInCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgdGVzdCBleGVjdXRhYmxlCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLUxPQ0FMX01PRFVMRSA6PSBmc19jb25maWdfZ2VuZXJhdGVfdGVzdAotTE9DQUxfU1JDX0ZJTEVTIDo9IGZzX2NvbmZpZ19nZW5lcmF0ZS5jCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmN1dGlscwotTE9DQUxfQ0ZMQUdTIDo9ICQodGVzdF9jX2ZsYWdzKQotTE9DQUxfTU9EVUxFX1JFTEFUSVZFX1BBVEggOj0gZnNfY29uZmlnLXVuaXQtdGVzdHMKLUxPQ0FMX0dURVNUIDo9IGZhbHNlCi1pbmNsdWRlICQoQlVJTERfSE9TVF9OQVRJVkVfVEVTVCkKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBnVGVzdCB0b29sCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLUxPQ0FMX01PRFVMRSA6PSBmc19jb25maWctdW5pdC10ZXN0cwotTE9DQUxfQ0ZMQUdTICs9ICQodGVzdF9jX2ZsYWdzKSAtREhPU1QKLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGlibG9nIGxpYmN1dGlscyBsaWJiYXNlCi1MT0NBTF9TUkNfRklMRVMgOj0gZnNfY29uZmlnX3Rlc3QuY3BwCi1pbmNsdWRlICQoQlVJTERfSE9TVF9OQVRJVkVfVEVTVCkKZGlmZiAtLWdpdCBhL3Rvb2xzL2ZzX2NvbmZpZy9SRUFETUUgYi90b29scy9mc19jb25maWcvUkVBRE1FCmluZGV4IDVhZjQwN2YuLmNjMmE2OGYgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2ZzX2NvbmZpZy9SRUFETUUKKysrIGIvdG9vbHMvZnNfY29uZmlnL1JFQURNRQpAQCAtMTIyLDcgKzEyMiw3IEBACiBGb3IgT0VNcyB3aXNoaW5nIHRvIHVzZSB0aGUgZGVmaW5lIEFJRHMgaW4gdGhlaXIgbmF0aXZlIGNvZGUsIG9uZSBjYW4gYWNjZXNzIHRoZSBnZW5lcmF0ZWQgaGVhZGVyCiBmaWxlIGxpa2Ugc286CiAgIDEuIEluIHlvdXIgQyBjb2RlIGp1c3QgI2luY2x1ZGUgImdlbmVyYXRlZF9vZW1fYWlkLmgiIGFuZCBzdGFydCB1c2luZyB0aGUgZGVjbGFyZWQgaWRlbnRpZmllcnMuCi0gIDIuIEluIHlvdXIgTWFrZWZpbGUgYWRkIHRoaXMgc3RhdGljIGxpYnJhcnkgbGlrZSBzbzogTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBsaWJvZW1haWRzCisgIDIuIEluIHlvdXIgTWFrZWZpbGUgYWRkIHRoaXMgc3RhdGljIGxpYnJhcnkgbGlrZSBzbzogTE9DQUxfSEVBREVSX0xJQlJBUklFUyA6PSBvZW1haWRzX2hlYWRlcnMKIAogVW5pdCBUZXN0czoKIApkaWZmIC0tZ2l0IGEvdG9vbHMvZnNfY29uZmlnL2ZzX2NvbmZpZy5jIGIvdG9vbHMvZnNfY29uZmlnL2ZzX2NvbmZpZy5jCmluZGV4IDQ4ZjMwMGIuLjI5NTI4NzUgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2ZzX2NvbmZpZy9mc19jb25maWcuYworKysgYi90b29scy9mc19jb25maWcvZnNfY29uZmlnLmMKQEAgLTY3LDE3ICs2NywxOCBAQAogfQogCiBzdGF0aWMgdm9pZCB1c2FnZSgpIHsKLSAgZnByaW50ZihzdGRlcnIsICJVc2FnZTogZnNfY29uZmlnIFstRCBwcm9kdWN0X291dF9wYXRoXSBbLVMgY29udGV4dF9maWxlXSBbLUNdXG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICJVc2FnZTogZnNfY29uZmlnIFstRCBwcm9kdWN0X291dF9wYXRoXSBbLVMgY29udGV4dF9maWxlXSBbLVIgcm9vdF0gWy1DXVxuIik7CiB9CiAKIGludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgewogICBjaGFyIGJ1ZmZlclsxMDI0XTsKICAgY29uc3QgY2hhciogY29udGV4dF9maWxlID0gTlVMTDsKICAgY29uc3QgY2hhciogcHJvZHVjdF9vdXRfcGF0aCA9IE5VTEw7CisgIGNoYXIqIHJvb3RfcGF0aCA9IE5VTEw7CiAgIHN0cnVjdCBzZWxhYmVsX2hhbmRsZSogc2VobmQgPSBOVUxMOwogICBpbnQgcHJpbnRfY2FwYWJpbGl0aWVzID0gMDsKICAgaW50IG9wdDsKLSAgd2hpbGUoKG9wdCA9IGdldG9wdChhcmdjLCBhcmd2LCAiQ1M6RDoiKSkgIT0gLTEpIHsKKyAgd2hpbGUoKG9wdCA9IGdldG9wdChhcmdjLCBhcmd2LCAiQ1M6UjpEOiIpKSAhPSAtMSkgewogICAgIHN3aXRjaChvcHQpIHsKICAgICBjYXNlICdDJzoKICAgICAgIHByaW50X2NhcGFiaWxpdGllcyA9IDE7CkBAIC04NSw2ICs4Niw5IEBACiAgICAgY2FzZSAnUyc6CiAgICAgICBjb250ZXh0X2ZpbGUgPSBvcHRhcmc7CiAgICAgICBicmVhazsKKyAgICBjYXNlICdSJzoKKyAgICAgIHJvb3RfcGF0aCA9IG9wdGFyZzsKKyAgICAgIGJyZWFrOwogICAgIGNhc2UgJ0QnOgogICAgICAgcHJvZHVjdF9vdXRfcGF0aCA9IG9wdGFyZzsKICAgICAgIGJyZWFrOwpAQCAtOTgsNiArMTAyLDE0IEBACiAgICAgc2VobmQgPSBnZXRfc2VobmQoY29udGV4dF9maWxlKTsKICAgfQogCisgIGlmIChyb290X3BhdGggIT0gTlVMTCkgeworICAgIHNpemVfdCByb290X2xlbiA9IHN0cmxlbihyb290X3BhdGgpOworICAgIC8qIFRyaW0gYW55IHRyYWlsaW5nIHNsYXNoZXMgZnJvbSB0aGUgcm9vdCBwYXRoLiAqLworICAgIHdoaWxlIChyb290X2xlbiAmJiByb290X3BhdGhbLS1yb290X2xlbl0gPT0gJy8nKSB7CisgICAgICByb290X3BhdGhbcm9vdF9sZW5dID0gJ1wwJzsKKyAgICB9CisgIH0KKwogICB3aGlsZSAoZmdldHMoYnVmZmVyLCAxMDIzLCBzdGRpbikgIT0gTlVMTCkgewogICAgIGludCBpc19kaXIgPSAwOwogICAgIGludCBpOwpAQCAtMTIyLDYgKzEzNCwxMCBAQAogICAgIHVuc2lnbmVkIHVpZCA9IDAsIGdpZCA9IDAsIG1vZGUgPSAwOwogICAgIHVpbnQ2NF90IGNhcGFiaWxpdGllczsKICAgICBmc19jb25maWcoYnVmZmVyLCBpc19kaXIsIHByb2R1Y3Rfb3V0X3BhdGgsICZ1aWQsICZnaWQsICZtb2RlLCAmY2FwYWJpbGl0aWVzKTsKKyAgICBpZiAocm9vdF9wYXRoICE9IE5VTEwgJiYgc3RyY21wKGJ1ZmZlciwgcm9vdF9wYXRoKSA9PSAwKSB7CisgICAgICAvKiBUaGUgcm9vdCBvZiB0aGUgZmlsZXN5c3RlbSBuZWVkcyB0byBiZSBhbiBlbXB0eSBzdHJpbmcuICovCisgICAgICBzdHJjcHkoYnVmZmVyLCAiIik7CisgICAgfQogICAgIHByaW50ZigiJXMgJWQgJWQgJW8iLCBidWZmZXIsIHVpZCwgZ2lkLCBtb2RlKTsKIAogICAgIGlmIChzZWhuZCAhPSBOVUxMKSB7CmRpZmYgLS1naXQgYS90b29scy9mc19jb25maWcvZnNfY29uZmlnX2dlbmVyYXRvci5weSBiL3Rvb2xzL2ZzX2NvbmZpZy9mc19jb25maWdfZ2VuZXJhdG9yLnB5CmluZGV4IGM4ZDFkZDMuLjQ4Mzk1NzggMTAwNzU1Ci0tLSBhL3Rvb2xzL2ZzX2NvbmZpZy9mc19jb25maWdfZ2VuZXJhdG9yLnB5CisrKyBiL3Rvb2xzL2ZzX2NvbmZpZy9mc19jb25maWdfZ2VuZXJhdG9yLnB5CkBAIC0xNDYsMTggKzE0NiwyNyBAQAogICAgICAgICAgICAgZm91bmQgKHN0cik6IFRoZSBmaWxlIGZvdW5kIGluLCBub3QgcmVxdWlyZWQgdG8gYmUgc3BlY2lmaWVkLgogCiAgICAgICAgIFJhaXNlczoKKyAgICAgICAgICAgIFZhbHVlRXJyb3I6IGlmIHRoZSBmcmllbmRseSBuYW1lIGlzIGxvbmdlciB0aGFuIDMxIGNoYXJhY3RlcnMgYXMKKyAgICAgICAgICAgICAgICB0aGF0IGlzIGJpb25pYydzIGludGVybmFsIGJ1ZmZlciBzaXplIGZvciBuYW1lLgogICAgICAgICAgICAgVmFsdWVFcnJvcjogaWYgdmFsdWUgaXMgbm90IGEgdmFsaWQgc3RyaW5nIG51bWJlciBhcyBwcm9jZXNzZWQgYnkKICAgICAgICAgICAgICAgICBpbnQoeCwgMCkKICAgICAgICAgIiIiCiAgICAgICAgIHNlbGYuaWRlbnRpZmllciA9IGlkZW50aWZpZXIKICAgICAgICAgc2VsZi52YWx1ZSA9IHZhbHVlCiAgICAgICAgIHNlbGYuZm91bmQgPSBmb3VuZAotICAgICAgICBzZWxmLm5vcm1hbGl6ZWRfdmFsdWUgPSBzdHIoaW50KHZhbHVlLCAwKSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5ub3JtYWxpemVkX3ZhbHVlID0gc3RyKGludCh2YWx1ZSwgMCkpCisgICAgICAgIGV4Y2VwdCBWYWx1ZUV4Y2VwdGlvbjoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ0ludmFsaWQgInZhbHVlIiwgbm90IGFpZCBudW1iZXIsIGdvdDogXCIlc1wiJyAlIHZhbHVlKQogCiAgICAgICAgICMgV2hlcmUgd2UgY2FsY3VsYXRlIHRoZSBmcmllbmRseSBuYW1lCiAgICAgICAgIGZyaWVuZGx5ID0gaWRlbnRpZmllcltsZW4oQUlELlBSRUZJWCk6XS5sb3dlcigpCiAgICAgICAgIHNlbGYuZnJpZW5kbHkgPSBBSUQuX2ZpeHVwX2ZyaWVuZGx5KGZyaWVuZGx5KQogCisgICAgICAgIGlmIGxlbihzZWxmLmZyaWVuZGx5KSA+IDMxOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignQUlEIG5hbWVzIG11c3QgYmUgdW5kZXIgMzIgY2hhcmFjdGVycyAiJXMiJyAlIHNlbGYuZnJpZW5kbHkpCisKKwogICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgogCiAgICAgICAgIHJldHVybiBzZWxmLmlkZW50aWZpZXIgPT0gb3RoZXIuaWRlbnRpZmllciBcCkBAIC02MzksMTAgKzY0OCw4IEBACiAKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgYWlkID0gQUlEKHNlY3Rpb25fbmFtZSwgdmFsdWUsIGZpbGVfbmFtZSkKLSAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6Ci0gICAgICAgICAgICBzeXMuZXhpdCgKLSAgICAgICAgICAgICAgICBlcnJvcl9tZXNzYWdlKCdJbnZhbGlkICJ2YWx1ZSIsIG5vdCBhaWQgbnVtYmVyLCBnb3Q6IFwiJXNcIicgJQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUpKQorICAgICAgICBleGNlcHQgVmFsdWVFcnJvciBhcyBleGNlcHRpb246CisgICAgICAgICAgICBzeXMuZXhpdChlcnJvcl9tZXNzYWdlKGV4Y2VwdGlvbikpCiAKICAgICAgICAgIyBWYWx1ZXMgbXVzdCBiZSB3aXRoaW4gT0VNIHJhbmdlCiAgICAgICAgIGlmIG5vdCBVdGlscy5pbl9hbnlfcmFuZ2UoaW50KGFpZC52YWx1ZSwgMCksIHNlbGYuX29lbV9yYW5nZXMpOgpAQCAtMTIwOSwxMCArMTIxNiw2IEBACiBjbGFzcyBQYXNzd2RHZW4oQmFzZUdlbmVyYXRvcik6CiAgICAgIiIiR2VuZXJhdGVzIHRoZSAvZXRjL3Bhc3N3ZCBmaWxlIHBlciBtYW4gKDUpIHBhc3N3ZC4iIiIKIAotICAgIF9HRU5FUkFURUQgPSAoJyNcbiMgVEhJUyBJUyBBTiBBVVRPR0VORVJBVEVEIEZJTEUhIERPIE5PVCBNT0RJRlkhXG4jJykKLQotICAgIF9GSUxFX0NPTU1FTlQgPSAnIyBEZWZpbmVkIGluIGZpbGU6IFwiJXNcIicKLQogICAgIGRlZiBfX2luaXRfXyhzZWxmKToKIAogICAgICAgICBzZWxmLl9vbGRfZmlsZSA9IE5vbmUKQEAgLTEyMjgsMjIgKzEyMzEsMzEgQEAKICAgICAgICAgICAgIGhlbHA9J0FuIGFuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcuaCBmaWxlJwogICAgICAgICAgICAgJ3RvIHBhcnNlIEFJRHMgYW5kIE9FTSBSYW5nZXMgZnJvbScpCiAKKyAgICAgICAgb3B0X2dyb3VwLmFkZF9hcmd1bWVudCgKKyAgICAgICAgICAgICctLXJlcXVpcmVkLXByZWZpeCcsCisgICAgICAgICAgICByZXF1aXJlZD1GYWxzZSwKKyAgICAgICAgICAgIGhlbHA9J0EgcHJlZml4IHRoYXQgdGhlIG5hbWVzIGFyZSByZXF1aXJlZCB0byBjb250YWluLicpCisKICAgICBkZWYgX19jYWxsX18oc2VsZiwgYXJncyk6CiAKICAgICAgICAgaGRyX3BhcnNlciA9IEFJREhlYWRlclBhcnNlcihhcmdzWydhaWRfaGVhZGVyJ10pCiAKICAgICAgICAgcGFyc2VyID0gRlNDb25maWdGaWxlUGFyc2VyKGFyZ3NbJ2ZzY29uZmlnJ10sIGhkcl9wYXJzZXIub2VtX3JhbmdlcykKIAorICAgICAgICByZXF1aXJlZF9wcmVmaXggPSBhcmdzWydyZXF1aXJlZF9wcmVmaXgnXQorCiAgICAgICAgIGFpZHMgPSBwYXJzZXIuYWlkcwogCiAgICAgICAgICMgbm90aGluZyB0byBkbyBpZiBubyBhaWRzIGRlZmluZWQKICAgICAgICAgaWYgbGVuKGFpZHMpID09IDA6CiAgICAgICAgICAgICByZXR1cm4KIAotICAgICAgICBwcmludCBQYXNzd2RHZW4uX0dFTkVSQVRFRAotCiAgICAgICAgIGZvciBhaWQgaW4gYWlkczoKLSAgICAgICAgICAgIHNlbGYuX3ByaW50X2Zvcm1hdHRlZF9saW5lKGFpZCkKKyAgICAgICAgICAgIGlmIHJlcXVpcmVkX3ByZWZpeCBpcyBOb25lIG9yIGFpZC5mcmllbmRseS5zdGFydHN3aXRoKHJlcXVpcmVkX3ByZWZpeCk6CisgICAgICAgICAgICAgICAgc2VsZi5fcHJpbnRfZm9ybWF0dGVkX2xpbmUoYWlkKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzeXMuZXhpdCgiJXM6IEFJRCAnJXMnIG11c3Qgc3RhcnQgd2l0aCAnJXMnIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgKGFyZ3NbJ2ZzY29uZmlnJ10sIGFpZC5mcmllbmRseSwgcmVxdWlyZWRfcHJlZml4KSkKIAogICAgIGRlZiBfcHJpbnRfZm9ybWF0dGVkX2xpbmUoc2VsZiwgYWlkKToKICAgICAgICAgIiIiUHJpbnRzIHRoZSBhaWQgdG8gc3Rkb3V0IGluIHRoZSBwYXNzd2QgZm9ybWF0LiBJbnRlcm5hbCB1c2Ugb25seS4KQEAgLTEyNjIsNyArMTI3NCw2IEBACiAgICAgICAgICIiIgogICAgICAgICBpZiBzZWxmLl9vbGRfZmlsZSAhPSBhaWQuZm91bmQ6CiAgICAgICAgICAgICBzZWxmLl9vbGRfZmlsZSA9IGFpZC5mb3VuZAotICAgICAgICAgICAgcHJpbnQgUGFzc3dkR2VuLl9GSUxFX0NPTU1FTlQgJSBhaWQuZm91bmQKIAogICAgICAgICB0cnk6CiAgICAgICAgICAgICBsb2dvbiwgdWlkID0gVXRpbHMuZ2V0X2xvZ2luX2FuZF91aWRfY2xlYW5zZWQoYWlkKQpAQCAtMTI4OCw3ICsxMjk5LDYgQEAKICAgICAgICAgIiIiCiAgICAgICAgIGlmIHNlbGYuX29sZF9maWxlICE9IGFpZC5mb3VuZDoKICAgICAgICAgICAgIHNlbGYuX29sZF9maWxlID0gYWlkLmZvdW5kCi0gICAgICAgICAgICBwcmludCBQYXNzd2RHZW4uX0ZJTEVfQ09NTUVOVCAlIGFpZC5mb3VuZAogCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIGxvZ29uLCB1aWQgPSBVdGlscy5nZXRfbG9naW5fYW5kX3VpZF9jbGVhbnNlZChhaWQpCmRpZmYgLS1naXQgYS90b29scy9mc19nZXRfc3RhdHMvQW5kcm9pZC5icCBiL3Rvb2xzL2ZzX2dldF9zdGF0cy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3NzQyYjgKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9mc19nZXRfc3RhdHMvQW5kcm9pZC5icApAQCAtMCwwICsxLDkgQEAKK2NjX2JpbmFyeV9ob3N0IHsKKyAgICBuYW1lOiAiZnNfZ2V0X3N0YXRzIiwKKyAgICBzcmNzOiBbImZzX2dldF9zdGF0cy5jIl0sCisgICAgY2ZsYWdzOiBbIi1XYWxsIiwgIi1XZXJyb3IiXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2ZzX2dldF9zdGF0cy9BbmRyb2lkLm1rIGIvdG9vbHMvZnNfZ2V0X3N0YXRzL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1MDFjMWYuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZnNfZ2V0X3N0YXRzL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi1MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX1NSQ19GSUxFUyA6PSBmc19nZXRfc3RhdHMuYwotCi1MT0NBTF9NT0RVTEUgOj0gZnNfZ2V0X3N0YXRzCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliY3V0aWxzIGxpYmxvZwotCi1pbmNsdWRlICQoQlVJTERfSE9TVF9FWEVDVVRBQkxFKQpkaWZmIC0tZ2l0IGEvdG9vbHMvZ2VuZXJhdGUtbm90aWNlLWZpbGVzLnB5IGIvdG9vbHMvZ2VuZXJhdGUtbm90aWNlLWZpbGVzLnB5CmluZGV4IGFkYmY3YzIuLmI3NTQxNzQgMTAwNzU1Ci0tLSBhL3Rvb2xzL2dlbmVyYXRlLW5vdGljZS1maWxlcy5weQorKysgYi90b29scy9nZW5lcmF0ZS1ub3RpY2UtZmlsZXMucHkKQEAgLTI1MywxNSArMjUzLDEyIEBACiAKICAgICBmaWxlc2V0cyA9IFtzb3J0ZWQoZmlsZXNfd2l0aF9zYW1lX2hhc2hbbWQ1XSkgZm9yIG1kNSBpbiBzb3J0ZWQoZmlsZXNfd2l0aF9zYW1lX2hhc2gua2V5cygpKV0KIAotICAgIHByaW50ICJDb21iaW5pbmcgTk9USUNFIGZpbGVzIGludG8gdGV4dCIKICAgICBjb21iaW5lX25vdGljZV9maWxlc190ZXh0KGZpbGVzZXRzLCBpbnB1dF9kaXIsIHR4dF9vdXRwdXRfZmlsZSwgZmlsZV90aXRsZSkKIAogICAgIGlmIGh0bWxfb3V0cHV0X2ZpbGUgaXMgbm90IE5vbmU6Ci0gICAgICAgIHByaW50ICJDb21iaW5pbmcgTk9USUNFIGZpbGVzIGludG8gSFRNTCIKICAgICAgICAgY29tYmluZV9ub3RpY2VfZmlsZXNfaHRtbChmaWxlc2V0cywgaW5wdXRfZGlyLCBodG1sX291dHB1dF9maWxlKQogCiAgICAgaWYgeG1sX291dHB1dF9maWxlIGlzIG5vdCBOb25lOgotICAgICAgICBwcmludCAiQ29tYmluaW5nIE5PVElDRSBmaWxlcyBpbnRvIFhNTCIKICAgICAgICAgY29tYmluZV9ub3RpY2VfZmlsZXNfeG1sKGZpbGVzX3dpdGhfc2FtZV9oYXNoLCBpbnB1dF9kaXIsIHhtbF9vdXRwdXRfZmlsZSkKIAogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKZGlmZiAtLWdpdCBhL3Rvb2xzL2lqYXIvQW5kcm9pZC5icCBiL3Rvb2xzL2lqYXIvQW5kcm9pZC5icApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI0NGEyZC4uMDAwMDAwMAotLS0gYS90b29scy9pamFyL0FuZHJvaWQuYnAKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0vLwotLy8gVGhlIHJlc3Qgb2YgZmlsZXMgaW4gdGhpcyBkaXJlY3RvcnkgY29tZXMgZnJvbQotLy8gaHR0cHM6Ly9naXRodWIuY29tL2JhemVsYnVpbGQvYmF6ZWwvdHJlZS9tYXN0ZXIvdGhpcmRfcGFydHkvaWphcgotCi1jY19iaW5hcnlfaG9zdCB7Ci0gICAgc3JjczogWwotICAgICAgICAiY2xhc3NmaWxlLmNjIiwKLSAgICAgICAgImlqYXIuY2MiLAotICAgICAgICAiemlwLmNjIiwKLSAgICBdLAotICAgIGNmbGFnczogWwotICAgICAgICAiLVdhbGwiLAotICAgICAgICAiLVdlcnJvciIsCi0gICAgXSwKLSAgICBob3N0X2xkbGliczogWyItbHoiXSwKLSAgICBuYW1lOiAiaWphciIsCi19CmRpZmYgLS1naXQgYS90b29scy9pamFyL0xJQ0VOU0UgYi90b29scy9pamFyL0xJQ0VOU0UKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiMGIxMjcuLjAwMDAwMDAKLS0tIGEvdG9vbHMvaWphci9MSUNFTlNFCisrKyAvZGV2L251bGwKQEAgLTEsMjAzICswLDAgQEAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KLQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCi0KLSAgIDEuIERlZmluaXRpb25zLgotCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCi0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5Ci0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCi0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCi0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KLQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KLQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yawotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KLQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucwotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KLQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgotCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KLQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCi0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91Ci0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgotCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0Ci0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKLQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcwotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAotCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAotCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0Ci0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90Ci0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cwotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgotCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCi0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCi0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgotCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCi0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5Ci0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5Ci0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KLQotICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCi0KLSAgIEFQUEVORElYOiBIb3cgdG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yay4KLQotICAgICAgVG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yaywgYXR0YWNoIHRoZSBmb2xsb3dpbmcKLSAgICAgIGJvaWxlcnBsYXRlIG5vdGljZSwgd2l0aCB0aGUgZmllbGRzIGVuY2xvc2VkIGJ5IGJyYWNrZXRzICJbXSIKLSAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCi0gICAgICB0aGUgYnJhY2tldHMhKSAgVGhlIHRleHQgc2hvdWxkIGJlIGVuY2xvc2VkIGluIHRoZSBhcHByb3ByaWF0ZQotICAgICAgY29tbWVudCBzeW50YXggZm9yIHRoZSBmaWxlIGZvcm1hdC4gV2UgYWxzbyByZWNvbW1lbmQgdGhhdCBhCi0gICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCi0gICAgICBzYW1lICJwcmludGVkIHBhZ2UiIGFzIHRoZSBjb3B5cmlnaHQgbm90aWNlIGZvciBlYXNpZXIKLSAgICAgIGlkZW50aWZpY2F0aW9uIHdpdGhpbiB0aGlyZC1wYXJ0eSBhcmNoaXZlcy4KLQotICAgQ29weXJpZ2h0IFt5eXl5XSBbbmFtZSBvZiBjb3B5cmlnaHQgb3duZXJdCi0KLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KZGlmZiAtLWdpdCBhL3Rvb2xzL2lqYXIvUkVBRE1FLnR4dCBiL3Rvb2xzL2lqYXIvUkVBRE1FLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDVhNmEwZi4uMDAwMDAwMAotLS0gYS90b29scy9pamFyL1JFQURNRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotCi1pamFyOiBBIHRvb2wgZm9yIGdlbmVyYXRpbmcgaW50ZXJmYWNlIC5qYXJzIGZyb20gbm9ybWFsIC5qYXJzCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLUFsYW4gRG9ub3ZhbiwgMjYgTWF5IDIwMDcuCi0KLVJhdGlvbmFsZToKLQotICBJbiBvcmRlciB0byBpbXByb3ZlIHRoZSBzcGVlZCBvZiBjb21waWxhdGlvbiBvZiBKYXZhIHByb2dyYW1zIGluCi0gIEJhemVsLCB0aGUgb3V0cHV0IG9mIGJ1aWxkIHN0ZXBzIGlzIGNhY2hlZC4KLQotICBUaGlzIHdvcmtzIHZlcnkgbmljZWx5IGZvciBDKysgY29tcGlsYXRpb246IGEgY29tcGlsYXRpb24gdW5pdAotICBpbmNsdWRlcyBhIC5jYyBzb3VyY2UgZmlsZSBhbmQgdHlwaWNhbGx5IGRvemVucyBvZiBoZWFkZXIgZmlsZXMuCi0gIEhlYWRlciBmaWxlcyBjaGFuZ2UgcmVsYXRpdmVseSBpbmZyZXF1ZW50bHksIHNvIHRoZSBuZWVkIGZvciBhCi0gIHJlYnVpbGQgaXMgdXN1YWxseSBkcml2ZW4gYnkgYSBjaGFuZ2UgaW4gdGhlIC5jYyBmaWxlLiAgRXZlbiBhZnRlcgotICBzeW5jaW5nIGEgc2xpZ2h0bHkgbmV3ZXIgdmVyc2lvbiBvZiB0aGUgdHJlZSBhbmQgZG9pbmcgYSByZWJ1aWxkLAotICBtYW55IGhpdHMgaW4gdGhlIGNhY2hlIGFyZSBzdGlsbCBvYnNlcnZlZC4KLQotICBJbiBKYXZhLCBieSBjb250cmFzdCwgYSBjb21waWxhdGlvbiB1bml0IGludm9sdmVzIGEgc2V0IG9mIC5qYXZhCi0gIHNvdXJjZSBmaWxlcywgcGx1cyBhIHNldCBvZiAuamFyIGZpbGVzIGNvbnRhaW5pbmcgYWxyZWFkeS1jb21waWxlZAotICBKVk0gLmNsYXNzIGZpbGVzLiAgQ2xhc3MgZmlsZXMgc2VydmUgYSBkdWFsIHB1cnBvc2U6IGZyb20gdGhlIEpWTSdzCi0gIHBlcnNwZWN0aXZlLCB0aGV5IGFyZSBjb250YWluZXJzIG9mIGV4ZWN1dGFibGUgY29kZSwgYnV0IGZyb20gdGhlCi0gIGNvbXBpbGVyJ3MgcGVyc3BlY3RpdmUsIHRoZXkgYXJlIGludGVyZmFjZSBkZWZpbml0aW9ucy4gIFRoZSBwcm9ibGVtCi0gIGhlcmUgaXMgdGhhdCAuamFyIGZpbGVzIGFyZSB2ZXJ5IG11Y2ggbW9yZSBzZW5zaXRpdmUgdG8gY2hhbmdlIHRoYW4KLSAgQysrIGhlYWRlciBmaWxlcywgc28gZXZlbiBhIGNoYW5nZSB0aGF0IGlzIGluc2lnbmlmaWNhbnQgdG8gdGhlCi0gIGNvbXBpbGVyIChzdWNoIGFzIHRoZSBhZGRpdGlvbiBvZiBhIHByaW50IHN0YXRlbWVudCB0byBhIG1ldGhvZCBpbiBhCi0gIHByZXJlcXVpc2l0ZSBjbGFzcykgd2lsbCBjYXVzZSB0aGUgamFyIHRvIGNoYW5nZSwgYW5kIGFueSBjb2RlIHRoYXQKLSAgZGVwZW5kcyBvbiB0aGlzIGphcidzIGludGVyZmFjZSB3aWxsIGJlIHJlY29tcGlsZWQgdW5uZWNlc3NhcmlseS4KLQotICBUaGUgcHVycG9zZSBvZiBpamFyIGlzIHRvIHByb2R1Y2UsIGZyb20gYSAuamFyIGZpbGUsIGEgbXVjaCBzbWFsbGVyLAotICBzaW1wbGVyIC5qYXIgZmlsZSBjb250YWluaW5nIG9ubHkgdGhlIHBhcnRzIHRoYXQgYXJlIHNpZ25pZmljYW50IGZvcgotICB0aGUgcHVycG9zZXMgb2YgY29tcGlsYXRpb24uICBJbiBvdGhlciB3b3JkcywgYW4gaW50ZXJmYWNlIC5qYXIKLSAgZmlsZS4gIEJ5IGNoYW5naW5nIG9uZXMgY29tcGlsYXRpb24gZGVwZW5kZW5jaWVzIHRvIGJlIHRoZSBpbnRlcmZhY2UKLSAgamFyIGZpbGVzLCB1bm5lY2Vzc2FyeSByZWNvbXBpbGF0aW9uIGlzIGF2b2lkZWQgd2hlbiB1cHN0cmVhbQotICBjaGFuZ2VzIGRvbid0IGFmZmVjdCB0aGUgaW50ZXJmYWNlLgotCi1EZXRhaWxzOgotCi0gIGlqYXIgaXMgYSB0b29sIHRoYXQgcmVhZHMgYSAuamFyIGZpbGUgYW5kIGVtaXRzIGEgLmphciBmaWxlCi0gIGNvbnRhaW5pbmcgb25seSB0aGUgcGFydHMgdGhhdCBhcmUgcmVsZXZhbnQgdG8gSmF2YSBjb21waWxhdGlvbi4KLSAgRm9yIGV4YW1wbGUsIGl0IHRocm93cyBhd2F5OgotCi0gIC0gRmlsZXMgd2hvc2UgbmFtZSBkb2VzIG5vdCBlbmQgaW4gIi5jbGFzcyIuCi0gIC0gQWxsIGV4ZWN1dGFibGUgbWV0aG9kIGNvZGUuCi0gIC0gQWxsIHByaXZhdGUgbWV0aG9kcyBhbmQgZmllbGRzLgotICAtIEFsbCBjb25zdGFudHMgYW5kIGF0dHJpYnV0ZXMgZXhjZXB0IHRoZSBtaW5pbWFsIHNldCBuZWNlc3NhcnkgdG8KLSAgICBkZXNjcmliZSB0aGUgY2xhc3MgaW50ZXJmYWNlLgotICAtIEFsbCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24KLSAgICAoTGluZU51bWJlclRhYmxlLCBTb3VyY2VGaWxlLCBMb2NhbFZhcmlhYmxlVGFibGVzIGF0dHJpYnV0ZXMpLgotCi0gIEl0IGFsc28gc2V0cyB0byB6ZXJvIHRoZSBmaWxlIG1vZGlmaWNhdGlvbiB0aW1lcyBpbiB0aGUgaW5kZXggb2YgdGhlCi0gIC5qYXIgZmlsZS4KLQotSW1wbGVtZW50YXRpb246Ci0KLSAgaWphciBpcyBpbXBsZW1lbnRlZCBpbiBDKyssIGFuZCBydW5zIHZlcnkgcXVpY2tseS4gIEZvciBleGFtcGxlCi0gICh3aGVuIG9wdGltaXplZCkgaXQgdGFrZXMgb25seSA1MzBtcyB0byBwcm9jZXNzIGEgNDJNQgotICAuamFyIGZpbGUgY29udGFpbmluZyA1ODc4IGNsYXNzZSwgcmVzdWx0aW5nIGluIGFuIGludGVyZmFjZSAuamFyCi0gIGZpbGUgb2Ygb25seSAxMS40TUIgaW4gc2l6ZS4gIEZvciBtb3JlIHVzdWFsIC5qYXIgc2l6ZXMgb2YgYSBmZXcKLSAgbWVnYWJ5dGVzLCBhIHJ1bnRpbWUgb2YgNTBtcyBpcyB0eXBpY2FsLgotCi0gIFRoZSBpbXBsZW1lbnRhdGlvbiBzdHJhdGVneSBpcyB0byBtbWFwIGJvdGggdGhlIGlucHV0IGphciBhbmQgdGhlCi0gIG5ld2x5LWNyZWF0ZWQgX2ludGVyZmFjZS5qYXIsIGFuZCB0byBzY2FuIHRocm91Z2ggdGhlIGZvcm1lciBhbmQKLSAgZW1pdCB0aGUgbGF0dGVyIGluIGEgc2luZ2xlIHBhc3MuIFRoZXJlIGFyZSBhIGNvdXBsZSBvZiBsb2NhdGlvbnMKLSAgd2hlcmUgc29tZSBraW5kIG9mICJiYWNrcGF0Y2hpbmciIGlzIHJlcXVpcmVkOgotCi0gIC0gaW4gdGhlIC56aXAgZmlsZSBmb3JtYXQsIGZvciBlYWNoIGZpbGUsIHRoZSBzaXplIGZpZWxkIHByZWNlZGVzCi0gICAgdGhlIGRhdGEuICBXZSBlbWl0IGEgemVybyBidXQgbm90ZSBpdHMgbG9jYXRpb24sIGdlbmVyYXRlIGFuZCBlbWl0Ci0gICAgdGhlIHN0cmlwcGVkIGNsYXNzZmlsZSwgdGhlbiBwb2tlIHRoZSBjb3JyZWN0IHNpemUgaW50byB0aGUKLSAgICBsb2NhdGlvbi4KLQotICAtIGZvciBKVk0gLmNsYXNzIGZpbGVzLCB0aGUgaGVhZGVyIChpbmNsdWRpbmcgdGhlIGNvbnN0YW50IHRhYmxlKQotICAgIHByZWNlZGVzIHRoZSBib2R5LCBidXQgY2Fubm90IGJlIGVtaXR0ZWQgYmVmb3JlIGl0IGJlY2F1c2UgaXQncwotICAgIG5vdCB1bnRpbCB3ZSBlbWl0IHRoZSBib2R5IHRoYXQgd2Uga25vdyB3aGljaCBjb25zdGFudHMgYXJlCi0gICAgcmVmZXJlbmNlZCBhbmQgd2hpY2ggYXJlIGdhcmJhZ2UuICBTbyB3ZSBlbWl0IHRoZSBib2R5IGludG8gYQotICAgIHRlbXBvcmFyeSBidWZmZXIsIHRoZW4gZW1pdCB0aGUgaGVhZGVyIHRvIHRoZSBvdXRwdXQgamFyLCBmb2xsb3dlZAotICAgIGJ5IHRoZSBjb250ZW50cyBvZiB0aGUgdGVtcCBidWZmZXIuCi0KLSAgQWxzbyBub3RlIHRoYXQgdGhlIHppcCBmaWxlIGZvcm1hdCBoYXMgdW5uZWNlc3NhcnkgZHVwbGljYXRpb24gb2YKLSAgdGhlIGluZGV4IG1ldGFkYXRhOiBpdCBoYXMgaGVhZGVyK2RhdGEgZm9yIGVhY2ggZmlsZSwgdGhlbiBhbm90aGVyCi0gIHNldCBvZiAoc2ltaWxhcikgaGVhZGVycyBhdCB0aGUgZW5kLiAgUmF0aGVyIHRoYW4gc2F2ZSB0aGUgbWV0YWRhdGEKLSAgZXhwbGljaXRseSBpbiBzb21lIGRhdGFzdHJ1Y3R1cmUsIHdlIGp1c3QgcmVjb3JkIHRoZSBhZGRyZXNzZXMgb2YKLSAgdGhlIGFscmVhZHktZW1pdHRlZCB6aXAgbWV0YWRhdGEgZW50cmllcyBpbiB0aGUgb3V0cHV0IGZpbGUsIGFuZAotICB0aGVuIHJlYWQgZnJvbSB0aGVyZSBhcyBuZWNlc3NhcnkuCi0KLU5vdGVzOgotCi0gIFRoaXMgY29kZSBoYXMgbm8gZGVwZW5kZW5jeSBleGNlcHQgb24gdGhlIFNUTCBhbmQgb24gemxpYi4KLQotICBBbG1vc3QgYWxsIG9mIHRoZSBnZXRYL3B1dFgvUmVhZFgvV3JpdGVYIGZ1bmN0aW9ucyBpbiB0aGUgY29kZQotICBhZHZhbmNlIHRoZWlyIGZpcnN0IGFyZ3VtZW50IHBvaW50ZXIsIHdoaWNoIGlzIHBhc3NlZCBieSByZWZlcmVuY2UuCi0KLSAgSXQncyB0ZW1wdGluZyB0byBkaXNjYXJkIHBhY2thZ2UtcHJpdmF0ZSBjbGFzc2VzIGFuZCBjbGFzcyBtZW1iZXJzLgotICBIb3dldmVyLCB0aGlzIHdvdWxkIGJlIGluY29ycmVjdCBiZWNhdXNlIHRoZXkgYXJlIGEgbmVjZXNzYXJ5IHBhcnQKLSAgb2YgdGhlIHBhY2thZ2UgaW50ZXJmYWNlLCBhcyBhIEphdmEgcGFja2FnZSBpcyBvZnRlbiBjb21waWxlZCBpbgotICBtdWx0aXBsZSBzdGFnZXMuICBGb3IgZXhhbXBsZTogaW4gQmF6ZWwsIGJvdGggamF2YSB0ZXN0cyBhbmQgamF2YQotICBjb2RlIGluaGFiaXQgdGhlIHNhbWUgSmF2YSBwYWNrYWdlIGJ1dCBhcmUgY29tcGlsZWQgc2VwYXJhdGVseS4KLQotQXNzdW1wdGlvbnM6Ci0KLSAgV2UgYXNzdW1lIHRoYXQgamFyIGZpbGVzIGFyZSB1bmNvbXByZXNzZWQgdjEuMCB6aXAgZmlsZXMgKGNyZWF0ZWQKLSAgd2l0aCAnamFyIGMwZicpIHdpdGggYSB6ZXJvIGdlbmVyYWxfcHVycG9zZV9iaXRfZmxhZy4KLQotICBXZSBhc3N1bWUgdGhhdCBqYXZhcC9qYXZhYyBkb24ndCBuZWVkIHRoZSBjb3JyZWN0IENSQyBjaGVja3N1bXMgaW4KLSAgdGhlIC5qYXIgZmlsZS4KLQotICBXZSBhc3N1bWUgdGhhdCBpdCdzIGJldHRlciBzaW1wbHkgdG8gYWJvcnQgaW4gdGhlIGZhY2Ugb2YgdW5rbm93bgotICBpbnB1dCB0aGFuIHRvIHJpc2sgbGVhdmluZyBvdXQgc29tZXRoaW5nIGltcG9ydGFudCBmcm9tIHRoZSBvdXRwdXQKLSAgKGFsdGhvdWdoIGluIHRoZSBjYXNlIG9mIGFubm90YXRpb25zLCBpdCBzaG91bGQgYmUgc2FmZSB0byBpZ25vcmUKLSAgb25lcyB3ZSBkb24ndCB1bmRlcnN0YW5kKS4KLQotVE9ETzoKLSAgTWF5YmU6IGVuc3VyZSBhIGNhbm9uaWNhbCBzb3J0IG9yZGVyIGlzIHVzZWQgZm9yIGV2ZXJ5IGxpc3QgKGphcgotICBlbnRyaWVzLCBjbGFzcyBtZW1iZXJzLCBhdHRyaWJ1dGVzLCBldGMuKSAgVGhpcyBpc24ndCBlc3NlbnRpYWwKLSAgYmVjYXVzZSB3ZSBjYW4gYXNzdW1lIHRoZSBjb21waWxlciBpcyBkZXRlcm1pbmlzdGljIGFuZCB0aGUgb3JkZXIgaW4KLSAgdGhlIHNvdXJjZSBmaWxlcyBjaGFuZ2VzIGxpdHRsZS4gIEFsc28sIGl0IHdvdWxkIHJlcXVpcmUgdHdvIHBhc3Nlcy4gOigKLQotICBNYXliZTogZGVsZXRlIGR5bmFtaWNhbGx5LWFsbG9jYXRlZCBtZW1vcnkuCi0KLSAgQWRkIChhIGxvdCkgbW9yZSB0ZXN0cy4gIEluY2x1ZGUgYSB0ZXN0IG9mIGlkZW1wb3RlbmN5LgpkaWZmIC0tZ2l0IGEvdG9vbHMvaWphci9jbGFzc2ZpbGUuY2MgYi90b29scy9pamFyL2NsYXNzZmlsZS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDMzZTBkYi4uMDAwMDAwMAotLS0gYS90b29scy9pamFyL2NsYXNzZmlsZS5jYworKysgL2Rldi9udWxsCkBAIC0xLDE3ODggKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMDEsMjAwNyBBbGFuIERvbm92YW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLwotLy8gQXV0aG9yOiBBbGFuIERvbm92YW4gPGFkb25vdmFuQGdvb2dsZS5jb20+Ci0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vCi0vLyBjbGFzc2ZpbGUuY2MgLS0gY2xhc3NmaWxlIHBhcnNpbmcgYW5kIHN0cmlwcGluZy4KLS8vCi0KLS8vIFRPRE8oYWRvbm92YW4pIGRvbid0IHBhc3MgcG9pbnRlcnMgYnkgcmVmZXJlbmNlOyB0aGlzIGlzIG5vdAotLy8gY29tcGF0aWJsZSB3aXRoIEdvb2dsZSBDKysgc3R5bGUuCi0KLS8vIFNlZSBSRUFETUUudHh0IGZvciBkZXRhaWxzLgotLy8KLS8vIEZvciBkZWZpbml0aW9uIG9mIEpWTSBjbGFzcyBmaWxlIGZvcm1hdCwgc2VlOgotLy8gSmF2YSBTRSA4IEVkaXRpb246Ci0vLyBodHRwOi8vZG9jcy5vcmFjbGUuY29tL2phdmFzZS9zcGVjcy9qdm1zL3NlOC9odG1sL2p2bXMtNC5odG1sI2p2bXMtNAotCi0jZGVmaW5lIF9fU1REQ19GT1JNQVRfTUFDUk9TIDEKLSNkZWZpbmUgX19TVERDX0xJTUlUX01BQ1JPUyAxCi0jaW5jbHVkZSA8aW50dHlwZXMuaD4gLy8gZm9yIFBSSXgzMgotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlIDxzZXQ+Ci0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgImNvbW1vbi5oIgotCi1uYW1lc3BhY2UgZGV2dG9vbHNfaWphciB7Ci0KLS8vIFNlZSBUYWJsZSA0LjMgaW4gSlZNIFNwZWMuCi1lbnVtIENPTlNUQU5UIHsKLSAgQ09OU1RBTlRfQ2xhc3MgICAgICAgICAgICAgID0gNywKLSAgQ09OU1RBTlRfRmllbGRSZWYgICAgICAgICAgID0gOSwKLSAgQ09OU1RBTlRfTWV0aG9kcmVmICAgICAgICAgID0gMTAsCi0gIENPTlNUQU5UX0ludGVyZmFjZW1ldGhvZHJlZiA9IDExLAotICBDT05TVEFOVF9TdHJpbmcgICAgICAgICAgICAgPSA4LAotICBDT05TVEFOVF9JbnRlZ2VyICAgICAgICAgICAgPSAzLAotICBDT05TVEFOVF9GbG9hdCAgICAgICAgICAgICAgPSA0LAotICBDT05TVEFOVF9Mb25nICAgICAgICAgICAgICAgPSA1LAotICBDT05TVEFOVF9Eb3VibGUgICAgICAgICAgICAgPSA2LAotICBDT05TVEFOVF9OYW1lQW5kVHlwZSAgICAgICAgPSAxMiwKLSAgQ09OU1RBTlRfVXRmOCAgICAgICAgICAgICAgID0gMSwKLSAgQ09OU1RBTlRfTWV0aG9kSGFuZGxlICAgICAgID0gMTUsCi0gIENPTlNUQU5UX01ldGhvZFR5cGUgICAgICAgICA9IDE2LAotICBDT05TVEFOVF9JbnZva2VEeW5hbWljICAgICAgPSAxOAotfTsKLQotLy8gU2VlIFRhYmxlcyA0LjEsIDQuNCwgNC41IGluIEpWTSBTcGVjLgotZW51bSBBQ0NFU1MgIHsKLSAgQUNDX1BVQkxJQyAgICAgICAgICA9IDB4MDAwMSwKLSAgQUNDX1BSSVZBVEUgICAgICAgICA9IDB4MDAwMiwKLSAgQUNDX1BST1RFQ1RFRCAgICAgICA9IDB4MDAwNCwKLSAgQUNDX1NUQVRJQyAgICAgICAgICA9IDB4MDAwOCwKLSAgQUNDX0ZJTkFMICAgICAgICAgICA9IDB4MDAxMCwKLSAgQUNDX1NZTkNIUk9OSVpFRCAgICA9IDB4MDAyMCwKLSAgQUNDX1ZPTEFUSUxFICAgICAgICA9IDB4MDA0MCwKLSAgQUNDX1RSQU5TSUVOVCAgICAgICA9IDB4MDA4MCwKLSAgQUNDX0lOVEVSRkFDRSAgICAgICA9IDB4MDIwMCwKLSAgQUNDX0FCU1RSQUNUICAgICAgICA9IDB4MDQwMAotfTsKLQotLy8gU2VlIFRhYmxlIDQuNy4yMC1BIGluIEphdmEgOCBKVk0gU3BlYy4KLWVudW0gVEFSR0VUX1RZUEUgewotICAvLyBUYXJnZXRzIGZvciB0eXBlIHBhcmFtZXRlciBkZWNsYXJhdGlvbnMgKEVsZW1lbnRUeXBlLlRZUEVfUEFSQU1FVEVSKToKLSAgQ0xBU1NfVFlQRV9QQVJBTUVURVIgICAgICAgID0gMHgwMCwKLSAgTUVUSE9EX1RZUEVfUEFSQU1FVEVSICAgICAgID0gMHgwMSwKLQotICAvLyBUYXJnZXRzIGZvciB0eXBlIHVzZXMgdGhhdCBtYXkgYmUgZXh0ZXJuYWxseSB2aXNpYmxlIGluIGNsYXNzZXMgYW5kIG1lbWJlcnMKLSAgLy8gKEVsZW1lbnRUeXBlLlRZUEVfVVNFKToKLSAgQ0xBU1NfRVhURU5EUyAgICAgICAgICAgICAgID0gMHgxMCwKLSAgQ0xBU1NfVFlQRV9QQVJBTUVURVJfQk9VTkQgID0gMHgxMSwKLSAgTUVUSE9EX1RZUEVfUEFSQU1FVEVSX0JPVU5EID0gMHgxMiwKLSAgRklFTEQgICAgICAgICAgICAgICAgICAgICAgID0gMHgxMywKLSAgTUVUSE9EX1JFVFVSTiAgICAgICAgICAgICAgID0gMHgxNCwKLSAgTUVUSE9EX1JFQ0VJVkVSICAgICAgICAgICAgID0gMHgxNSwKLSAgTUVUSE9EX0ZPUk1BTF9QQVJBTUVURVIgICAgID0gMHgxNiwKLSAgVEhST1dTICAgICAgICAgICAgICAgICAgICAgID0gMHgxNywKLQotICAvLyBUQVJHRVRfVFlQRSA+PSAweDQwIGlzIHJlc2VydmVkIGZvciB0eXBlIHVzZXMgdGhhdCBvY2N1ciBvbmx5IHdpdGhpbiBjb2RlCi0gIC8vIGJsb2Nrcy4gSWphciBkb2Vzbid0IG5lZWQgdG8ga25vdyBhYm91dCB0aGVzZS4KLX07Ci0KLXN0cnVjdCBDb25zdGFudDsKLQotLy8gVE9ETyhhZG9ub3ZhbikgdGhlc2UgZ2xvYmFscyBhcmUgdW5mb3J0dW5hdGUKLXN0YXRpYyBzdGQ6OnZlY3RvcjxDb25zdGFudCo+ICAgICAgICBjb25zdF9wb29sX2luOyAvLyBpbnB1dCBjb25zdGFudCBwb29sCi1zdGF0aWMgc3RkOjp2ZWN0b3I8Q29uc3RhbnQqPiAgICAgICAgY29uc3RfcG9vbF9vdXQ7IC8vIG91dHB1dCBjb25zdGFudF9wb29sCi1zdGF0aWMgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+ICAgICAgICAgdXNlZF9jbGFzc19uYW1lczsKLXN0YXRpYyBDb25zdGFudCAqICAgICAgICAgICAgICAgICAgICBjbGFzc19uYW1lOwotCi0vLyBSZXR1cm5zIHRoZSBDb25zdGFudCBvYmplY3QsIGdpdmVuIGFuIGluZGV4IGludG8gdGhlIGlucHV0IGNvbnN0YW50IHBvb2wuCi0vLyBOb3RlOiBjb25zdGFudCgwKSA9PSBOVUxMOyB0aGlzIGludmFyaWFudCBpcyBleHBsb2l0ZWQgYnkgdGhlCi0vLyBJbm5lckNsYXNzZXNBdHRyaWJ1dGUsIGludGVyIGFsaWEuCi1pbmxpbmUgQ29uc3RhbnQgKmNvbnN0YW50KGludCBpZHgpIHsKLSAgaWYgKGlkeCA8IDAgfHwgKHVuc2lnbmVkKWlkeCA+PSBjb25zdF9wb29sX2luLnNpemUoKSkgewotICAgIGZwcmludGYoc3RkZXJyLCAiSWxsZWdhbCBjb25zdGFudCBwb29sIGluZGV4OiAlZFxuIiwgaWR4KTsKLSAgICBhYm9ydCgpOwotICB9Ci0gIHJldHVybiBjb25zdF9wb29sX2luW2lkeF07Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLy8gU2VlIHNlYy40LjQgb2YgSlZNIHNwZWMuCi1zdHJ1Y3QgQ29uc3RhbnQgewotCi0gIGV4cGxpY2l0IENvbnN0YW50KHUxIHRhZykgOgotICAgICAgc2xvdF8oMCksCi0gICAgICB0YWdfKHRhZykge30KLQotICB2aXJ0dWFsIH5Db25zdGFudCgpIHt9Ci0KLSAgLy8gRm9yIFVURi04IHN0cmluZyBjb25zdGFudHMsIHJldHVybnMgdGhlIGVuY29kZWQgc3RyaW5nLgotICAvLyBPdGhlcndpc2UsIHJldHVybnMgYW4gdW5kZWZpbmVkIHN0cmluZyB2YWx1ZSBzdWl0YWJsZSBmb3IgZGVidWdnaW5nLgotICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIERpc3BsYXkoKSA9IDA7Ci0KLSAgdmlydHVhbCB2b2lkIFdyaXRlKHUxIComcCkgPSAwOwotCi0gIC8vIENhbGxlZCBieSBzbG90KCkgd2hlbiBhIGNvbnN0YW50IGhhcyBiZWVuIGlkZW50aWZpZWQgYXMgcmVxdWlyZWQKLSAgLy8gaW4gdGhlIG91dHB1dCBjbGFzc2ZpbGUncyBjb25zdGFudCBwb29sLiAgVGhpcyBpcyBhIGhvb2sgYWxsb3dpbmcKLSAgLy8gY29uc3RhbnRzIHRvIHJlZ2lzdGVyIHRoZWlyIGRlcGVuZGVuY3kgb24gb3RoZXIgY29uc3RhbnRzLCBieQotICAvLyBjYWxsaW5nIHNsb3QoKSBvbiB0aGVtIGluIHR1cm4uCi0gIHZpcnR1YWwgdm9pZCBLZWVwKCkge30KLQotICBib29sIEtlcHQoKSB7Ci0gICAgcmV0dXJuIHNsb3RfICE9IDA7Ci0gIH0KLQotICAvLyBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGlzIGNvbnN0YW50IGluIHRoZSBvdXRwdXQgY2xhc3MncyBjb25zdGFudAotICAvLyBwb29sLCBhc3NpZ25pbmcgYSBzbG90IGlmIG5vdCBhbHJlYWR5IGRvbmUuCi0gIHUyIHNsb3QoKSB7Ci0gICAgaWYgKHNsb3RfID09IDApIHsKLSAgICAgIEtlZXAoKTsKLSAgICAgIHNsb3RfID0gY29uc3RfcG9vbF9vdXQuc2l6ZSgpOyAvLyBCdWdCb3QncyAibmFycm93aW5nIiB3YXJuaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXMgYm9ndXMuICBUaGUgbnVtYmVyIG9mCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3V0cHV0IGNvbnN0YW50cyBjYW4ndCBleGNlZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgbnVtYmVyIG9mIGlucHV0IGNvbnN0YW50cy4KLSAgICAgIGlmIChzbG90XyA9PSAwKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiQ29uc3RhbnQ6OnNsb3QoKSBjYWxsZWQgYmVmb3JlIG91dHB1dCBwaGFzZS5cbiIpOwotICAgICAgICBhYm9ydCgpOwotICAgICAgfQotICAgICAgY29uc3RfcG9vbF9vdXQucHVzaF9iYWNrKHRoaXMpOwotICAgICAgaWYgKHRhZ18gPT0gQ09OU1RBTlRfTG9uZyB8fCB0YWdfID09IENPTlNUQU5UX0RvdWJsZSkgewotICAgICAgICBjb25zdF9wb29sX291dC5wdXNoX2JhY2soTlVMTCk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBzbG90XzsKLSAgfQotCi0gIHUyIHNsb3RfOyAvLyB6ZXJvID0+ICJ0aGlzIGNvbnN0YW50IGlzIHVucmVhY2hhYmxlIGdhcmJhZ2UiCi0gIHUxIHRhZ187Ci19OwotCi0vLyBFeHRyYWN0cyBjbGFzcyBuYW1lcyBmcm9tIGEgc2lnbmF0dXJlIGFuZCBwdXRzIHRoZW0gaW50byB0aGUgZ2xvYmFsCi0vLyB2YXJpYWJsZSB1c2VkX2NsYXNzX25hbWVzLgotLy8KLS8vIGRlc2M6IHRoZSBkZXNjcmlwdG9yIGNsYXNzIG5hbWVzIHNob3VsZCBiZSBleHRyYWN0ZWQgZnJvbS4KLS8vIHA6IHRoZSBwb3NpdGlvbiB3aGVyZSB0aGUgZXh0cmFjdGlvbiBzaG91bGQgdGFydC4KLXZvaWQgRXh0cmFjdENsYXNzTmFtZXMoY29uc3Qgc3RkOjpzdHJpbmcmIGRlc2MsIHNpemVfdCogcCk7Ci0KLS8vIFNlZSBzZWMuNC40LjEgb2YgSlZNIHNwZWMuCi1zdHJ1Y3QgQ29uc3RhbnRfQ2xhc3MgOiBDb25zdGFudAotewotICBleHBsaWNpdCBDb25zdGFudF9DbGFzcyh1MiBuYW1lX2luZGV4KSA6Ci0gICAgICBDb25zdGFudChDT05TVEFOVF9DbGFzcyksCi0gICAgICBuYW1lX2luZGV4XyhuYW1lX2luZGV4KSB7fQotCi0gIHZvaWQgV3JpdGUodTEgKiZwKSB7Ci0gICAgcHV0X3UxKHAsIHRhZ18pOwotICAgIHB1dF91MmJlKHAsIGNvbnN0YW50KG5hbWVfaW5kZXhfKS0+c2xvdCgpKTsKLSAgfQotCi0gIHN0ZDo6c3RyaW5nIERpc3BsYXkoKSB7Ci0gICAgcmV0dXJuIGNvbnN0YW50KG5hbWVfaW5kZXhfKS0+RGlzcGxheSgpOwotICB9Ci0KLSAgdm9pZCBLZWVwKCkgeyBjb25zdGFudChuYW1lX2luZGV4XyktPnNsb3QoKTsgfQotCi0gIHUyIG5hbWVfaW5kZXhfOwotfTsKLQotLy8gU2VlIHNlYy40LjQuMiBvZiBKVk0gc3BlYy4KLXN0cnVjdCBDb25zdGFudF9GTUlyZWYgOiBDb25zdGFudAotewotICBDb25zdGFudF9GTUlyZWYodTEgdGFnLAotICAgICAgICAgICAgICAgICAgdTIgY2xhc3NfaW5kZXgsCi0gICAgICAgICAgICAgICAgICB1MiBuYW1lX3R5cGVfaW5kZXgpIDoKLSAgICAgIENvbnN0YW50KHRhZyksCi0gICAgICBjbGFzc19pbmRleF8oY2xhc3NfaW5kZXgpLAotICAgICAgbmFtZV90eXBlX2luZGV4XyhuYW1lX3R5cGVfaW5kZXgpIHt9Ci0KLSAgdm9pZCBXcml0ZSh1MSAqJnApIHsKLSAgICBwdXRfdTEocCwgdGFnXyk7Ci0gICAgcHV0X3UyYmUocCwgY29uc3RhbnQoY2xhc3NfaW5kZXhfKS0+c2xvdCgpKTsKLSAgICBwdXRfdTJiZShwLCBjb25zdGFudChuYW1lX3R5cGVfaW5kZXhfKS0+c2xvdCgpKTsKLSAgfQotCi0gIHN0ZDo6c3RyaW5nIERpc3BsYXkoKSB7Ci0gICAgcmV0dXJuIGNvbnN0YW50KGNsYXNzX2luZGV4XyktPkRpc3BsYXkoKSArICI6OiIgKwotICAgICAgICBjb25zdGFudChuYW1lX3R5cGVfaW5kZXhfKS0+RGlzcGxheSgpOwotICB9Ci0KLSAgdm9pZCBLZWVwKCkgewotICAgIGNvbnN0YW50KGNsYXNzX2luZGV4XyktPnNsb3QoKTsKLSAgICBjb25zdGFudChuYW1lX3R5cGVfaW5kZXhfKS0+c2xvdCgpOwotICB9Ci0KLSAgdTIgY2xhc3NfaW5kZXhfOwotICB1MiBuYW1lX3R5cGVfaW5kZXhfOwotfTsKLQotLy8gU2VlIHNlYy40LjQuMyBvZiBKVk0gc3BlYy4KLXN0cnVjdCBDb25zdGFudF9TdHJpbmcgOiBDb25zdGFudAotewotICBleHBsaWNpdCBDb25zdGFudF9TdHJpbmcodTIgc3RyaW5nX2luZGV4KSA6Ci0gICAgICBDb25zdGFudChDT05TVEFOVF9TdHJpbmcpLAotICAgICAgc3RyaW5nX2luZGV4XyhzdHJpbmdfaW5kZXgpIHt9Ci0KLSAgdm9pZCBXcml0ZSh1MSAqJnApIHsKLSAgICBwdXRfdTEocCwgdGFnXyk7Ci0gICAgcHV0X3UyYmUocCwgY29uc3RhbnQoc3RyaW5nX2luZGV4XyktPnNsb3QoKSk7Ci0gIH0KLQotICBzdGQ6OnN0cmluZyBEaXNwbGF5KCkgewotICAgIHJldHVybiAiXCIiICsgY29uc3RhbnQoc3RyaW5nX2luZGV4XyktPkRpc3BsYXkoKSArICJcIiI7Ci0gIH0KLQotICB2b2lkIEtlZXAoKSB7IGNvbnN0YW50KHN0cmluZ19pbmRleF8pLT5zbG90KCk7IH0KLQotICB1MiBzdHJpbmdfaW5kZXhfOwotfTsKLQotLy8gU2VlIHNlYy40LjQuNCBvZiBKVk0gc3BlYy4KLXN0cnVjdCBDb25zdGFudF9JbnRlZ2VyT3JGbG9hdCA6IENvbnN0YW50Ci17Ci0gIENvbnN0YW50X0ludGVnZXJPckZsb2F0KHUxIHRhZywgdTQgYnl0ZXMpIDoKLSAgICAgIENvbnN0YW50KHRhZyksCi0gICAgICBieXRlc18oYnl0ZXMpIHt9Ci0KLSAgdm9pZCBXcml0ZSh1MSAqJnApIHsKLSAgICBwdXRfdTEocCwgdGFnXyk7Ci0gICAgcHV0X3U0YmUocCwgYnl0ZXNfKTsKLSAgfQotCi0gIHN0ZDo6c3RyaW5nIERpc3BsYXkoKSB7IHJldHVybiAiaW50L2Zsb2F0IjsgfQotCi0gIHU0IGJ5dGVzXzsKLX07Ci0KLS8vIFNlZSBzZWMuNC40LjUgb2YgSlZNIHNwZWMuCi1zdHJ1Y3QgQ29uc3RhbnRfTG9uZ09yRG91YmxlIDogQ29uc3RhbnRfSW50ZWdlck9yRmxvYXQKLXsKLSAgQ29uc3RhbnRfTG9uZ09yRG91YmxlKHUxIHRhZywgdTQgaGlnaF9ieXRlcywgdTQgbG93X2J5dGVzKSA6Ci0gICAgICBDb25zdGFudF9JbnRlZ2VyT3JGbG9hdCh0YWcsIGhpZ2hfYnl0ZXMpLAotICAgICAgbG93X2J5dGVzXyhsb3dfYnl0ZXMpIHt9Ci0KLSAgdm9pZCBXcml0ZSh1MSAqJnApIHsKLSAgICBwdXRfdTEocCwgdGFnXyk7Ci0gICAgcHV0X3U0YmUocCwgYnl0ZXNfKTsKLSAgICBwdXRfdTRiZShwLCBsb3dfYnl0ZXNfKTsKLSAgfQotCi0gIHN0ZDo6c3RyaW5nIERpc3BsYXkoKSB7IHJldHVybiAibG9uZy9kb3VibGUiOyB9Ci0KLSAgdTQgbG93X2J5dGVzXzsKLX07Ci0KLS8vIFNlZSBzZWMuNC40LjYgb2YgSlZNIHNwZWMuCi1zdHJ1Y3QgQ29uc3RhbnRfTmFtZUFuZFR5cGUgOiBDb25zdGFudAotewotICBDb25zdGFudF9OYW1lQW5kVHlwZSh1MiBuYW1lX2luZGV4LCB1MiBkZXNjcl9pbmRleCkgOgotICAgICAgQ29uc3RhbnQoQ09OU1RBTlRfTmFtZUFuZFR5cGUpLAotICAgICAgbmFtZV9pbmRleF8obmFtZV9pbmRleCksCi0gICAgICBkZXNjcl9pbmRleF8oZGVzY3JfaW5kZXgpIHt9Ci0KLSAgdm9pZCBXcml0ZSh1MSAqJnApIHsKLSAgICBwdXRfdTEocCwgdGFnXyk7Ci0gICAgcHV0X3UyYmUocCwgY29uc3RhbnQobmFtZV9pbmRleF8pLT5zbG90KCkpOwotICAgIHB1dF91MmJlKHAsIGNvbnN0YW50KGRlc2NyX2luZGV4XyktPnNsb3QoKSk7Ci0gIH0KLQotICBzdGQ6OnN0cmluZyBEaXNwbGF5KCkgewotICAgIHJldHVybiBjb25zdGFudChuYW1lX2luZGV4XyktPkRpc3BsYXkoKSArICI6OiIgKwotICAgICAgICBjb25zdGFudChkZXNjcl9pbmRleF8pLT5EaXNwbGF5KCk7Ci0gIH0KLQotICB2b2lkIEtlZXAoKSB7Ci0gICAgY29uc3RhbnQobmFtZV9pbmRleF8pLT5zbG90KCk7Ci0gICAgY29uc3RhbnQoZGVzY3JfaW5kZXhfKS0+c2xvdCgpOwotICB9Ci0KLSAgdTIgbmFtZV9pbmRleF87Ci0gIHUyIGRlc2NyX2luZGV4XzsKLX07Ci0KLS8vIFNlZSBzZWMuNC40Ljcgb2YgSlZNIHNwZWMuCi1zdHJ1Y3QgQ29uc3RhbnRfVXRmOCA6IENvbnN0YW50Ci17Ci0gIENvbnN0YW50X1V0ZjgodTQgbGVuZ3RoLCBjb25zdCB1MSAqdXRmOCkgOgotICAgICAgQ29uc3RhbnQoQ09OU1RBTlRfVXRmOCksCi0gICAgICBsZW5ndGhfKGxlbmd0aCksCi0gICAgICB1dGY4Xyh1dGY4KSB7fQotCi0gIHZvaWQgV3JpdGUodTEgKiZwKSB7Ci0gICAgcHV0X3UxKHAsIHRhZ18pOwotICAgIHB1dF91MmJlKHAsIGxlbmd0aF8pOwotICAgIHB1dF9uKHAsIHV0ZjhfLCBsZW5ndGhfKTsKLSAgfQotCi0gIHN0ZDo6c3RyaW5nIERpc3BsYXkoKSB7Ci0gICAgcmV0dXJuIHN0ZDo6c3RyaW5nKChjb25zdCBjaGFyKikgdXRmOF8sIGxlbmd0aF8pOwotICB9Ci0KLSAgdTQgbGVuZ3RoXzsKLSAgY29uc3QgdTEgKnV0ZjhfOwotfTsKLQotLy8gU2VlIHNlYy40LjQuOCBvZiBKVk0gc3BlYy4KLXN0cnVjdCBDb25zdGFudF9NZXRob2RIYW5kbGUgOiBDb25zdGFudAotewotICBDb25zdGFudF9NZXRob2RIYW5kbGUodTEgcmVmZXJlbmNlX2tpbmQsIHUyIHJlZmVyZW5jZV9pbmRleCkgOgotICAgICAgQ29uc3RhbnQoQ09OU1RBTlRfTWV0aG9kSGFuZGxlKSwKLSAgICAgIHJlZmVyZW5jZV9raW5kXyhyZWZlcmVuY2Vfa2luZCksCi0gICAgICByZWZlcmVuY2VfaW5kZXhfKHJlZmVyZW5jZV9pbmRleCkge30KLQotICB2b2lkIFdyaXRlKHUxIComcCkgewotICAgIHB1dF91MShwLCB0YWdfKTsKLSAgICBwdXRfdTEocCwgcmVmZXJlbmNlX2tpbmRfKTsKLSAgICBwdXRfdTJiZShwLCByZWZlcmVuY2VfaW5kZXhfKTsKLSAgfQotCi0gIHN0ZDo6c3RyaW5nIERpc3BsYXkoKSB7Ci0gICAgcmV0dXJuICJDb25zdGFudF9NZXRob2RIYW5kbGU6OiIgKyBzdGQ6OnRvX3N0cmluZyhyZWZlcmVuY2Vfa2luZF8pICsgIjo6IgotICAgICAgICArIGNvbnN0YW50KHJlZmVyZW5jZV9pbmRleF8pLT5EaXNwbGF5KCk7Ci0gIH0KLQotICB1MSByZWZlcmVuY2Vfa2luZF87Ci0gIHUyIHJlZmVyZW5jZV9pbmRleF87Ci19OwotCi0vLyBTZWUgc2VjLjQuNC45IG9mIEpWTSBzcGVjLgotc3RydWN0IENvbnN0YW50X01ldGhvZFR5cGUgOiBDb25zdGFudAotewotICBleHBsaWNpdCBDb25zdGFudF9NZXRob2RUeXBlKHUyIGRlc2NyaXB0b3JfaW5kZXgpIDoKLSAgICAgIENvbnN0YW50KENPTlNUQU5UX01ldGhvZFR5cGUpLAotICAgICAgZGVzY3JpcHRvcl9pbmRleF8oZGVzY3JpcHRvcl9pbmRleCkge30KLQotICB2b2lkIFdyaXRlKHUxIComcCkgewotICAgIHB1dF91MShwLCB0YWdfKTsKLSAgICBwdXRfdTJiZShwLCBkZXNjcmlwdG9yX2luZGV4Xyk7Ci0gIH0KLQotICBzdGQ6OnN0cmluZyBEaXNwbGF5KCkgewotICAgIHJldHVybiAgIkNvbnN0YW50X01ldGhvZFR5cGU6OiIgKyBjb25zdGFudChkZXNjcmlwdG9yX2luZGV4XyktPkRpc3BsYXkoKTsKLSAgfQotCi0gIHUyIGRlc2NyaXB0b3JfaW5kZXhfOwotfTsKLQotLy8gU2VlIHNlYy40LjQuMTAgb2YgSlZNIHNwZWMuCi1zdHJ1Y3QgQ29uc3RhbnRfSW52b2tlRHluYW1pYyA6IENvbnN0YW50Ci17Ci0gIENvbnN0YW50X0ludm9rZUR5bmFtaWModTIgYm9vdHN0cmFwX21ldGhvZF9hdHRyX2luZGV4LCB1MiBuYW1lX2FuZF90eXBlX2luZGV4KSA6Ci0gICAgICBDb25zdGFudChDT05TVEFOVF9JbnZva2VEeW5hbWljKSwKLSAgICAgIGJvb3RzdHJhcF9tZXRob2RfYXR0cl9pbmRleF8oYm9vdHN0cmFwX21ldGhvZF9hdHRyX2luZGV4KSwKLSAgICAgIG5hbWVfYW5kX3R5cGVfaW5kZXhfKG5hbWVfYW5kX3R5cGVfaW5kZXgpIHt9Ci0KLSAgdm9pZCBXcml0ZSh1MSAqJnApIHsKLSAgICBwdXRfdTEocCwgdGFnXyk7Ci0gICAgcHV0X3UyYmUocCwgYm9vdHN0cmFwX21ldGhvZF9hdHRyX2luZGV4Xyk7Ci0gICAgcHV0X3UyYmUocCwgbmFtZV9hbmRfdHlwZV9pbmRleF8pOwotICB9Ci0KLSAgc3RkOjpzdHJpbmcgRGlzcGxheSgpIHsKLSAgICByZXR1cm4gICJDb25zdGFudF9JbnZva2VEeW5hbWljOjoiCi0gICAgICAgICsgc3RkOjp0b19zdHJpbmcoYm9vdHN0cmFwX21ldGhvZF9hdHRyX2luZGV4XykgKyAiOjoiCi0gICAgICAgICsgY29uc3RhbnQobmFtZV9hbmRfdHlwZV9pbmRleF8pLT5EaXNwbGF5KCk7Ci0gIH0KLQotICB1MiBib290c3RyYXBfbWV0aG9kX2F0dHJfaW5kZXhfOwotICB1MiBuYW1lX2FuZF90eXBlX2luZGV4XzsKLX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLy8gU2VlIHNlYy40Ljcgb2YgSlZNIHNwZWMuCi1zdHJ1Y3QgQXR0cmlidXRlIHsKLQotICB2aXJ0dWFsIH5BdHRyaWJ1dGUoKSB7fQotICB2aXJ0dWFsIHZvaWQgV3JpdGUodTEgKiZwKSA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBFeHRyYWN0Q2xhc3NOYW1lcygpIHt9Ci0KLSAgdm9pZCBXcml0ZVByb2xvZyh1MSAqJnAsIHUyIGxlbmd0aCkgewotICAgIHB1dF91MmJlKHAsIGF0dHJpYnV0ZV9uYW1lXy0+c2xvdCgpKTsKLSAgICBwdXRfdTRiZShwLCBsZW5ndGgpOwotICB9Ci0KLSAgQ29uc3RhbnQgKmF0dHJpYnV0ZV9uYW1lXzsKLX07Ci0KLS8vIFNlZSBzZWMuNC43LjUgb2YgSlZNIHNwZWMuCi1zdHJ1Y3QgRXhjZXB0aW9uc0F0dHJpYnV0ZSA6IEF0dHJpYnV0ZSB7Ci0KLSAgc3RhdGljIEV4Y2VwdGlvbnNBdHRyaWJ1dGUqIFJlYWQoY29uc3QgdTEgKiZwLCBDb25zdGFudCAqYXR0cmlidXRlX25hbWUpIHsKLSAgICBFeGNlcHRpb25zQXR0cmlidXRlICphdHRyID0gbmV3IEV4Y2VwdGlvbnNBdHRyaWJ1dGU7Ci0gICAgYXR0ci0+YXR0cmlidXRlX25hbWVfID0gYXR0cmlidXRlX25hbWU7Ci0gICAgdTIgbnVtYmVyX29mX2V4Y2VwdGlvbnMgPSBnZXRfdTJiZShwKTsKLSAgICBmb3IgKGludCBpaSA9IDA7IGlpIDwgbnVtYmVyX29mX2V4Y2VwdGlvbnM7ICsraWkpIHsKLSAgICAgIGF0dHItPmV4Y2VwdGlvbnNfLnB1c2hfYmFjayhjb25zdGFudChnZXRfdTJiZShwKSkpOwotICAgIH0KLSAgICByZXR1cm4gYXR0cjsKLSAgfQotCi0gIHZvaWQgV3JpdGUodTEgKiZwKSB7Ci0gICAgV3JpdGVQcm9sb2cocCwgZXhjZXB0aW9uc18uc2l6ZSgpICogMiArIDIpOwotICAgIHB1dF91MmJlKHAsIGV4Y2VwdGlvbnNfLnNpemUoKSk7Ci0gICAgZm9yIChzaXplX3QgaWkgPSAwOyBpaSA8IGV4Y2VwdGlvbnNfLnNpemUoKTsgKytpaSkgewotICAgICAgcHV0X3UyYmUocCwgZXhjZXB0aW9uc19baWldLT5zbG90KCkpOwotICAgIH0KLSAgfQotCi0gIHN0ZDo6dmVjdG9yPENvbnN0YW50Kj4gZXhjZXB0aW9uc187Ci19OwotCi0vLyBTZWUgc2VjLjQuNy42IG9mIEpWTSBzcGVjLgotc3RydWN0IElubmVyQ2xhc3Nlc0F0dHJpYnV0ZSA6IEF0dHJpYnV0ZSB7Ci0KLSAgc3RydWN0IEVudHJ5IHsKLSAgICBDb25zdGFudCAqaW5uZXJfY2xhc3NfaW5mbzsKLSAgICBDb25zdGFudCAqb3V0ZXJfY2xhc3NfaW5mbzsKLSAgICBDb25zdGFudCAqaW5uZXJfbmFtZTsKLSAgICB1MiBpbm5lcl9jbGFzc19hY2Nlc3NfZmxhZ3M7Ci0gIH07Ci0KLSAgdmlydHVhbCB+SW5uZXJDbGFzc2VzQXR0cmlidXRlKCkgewotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZW50cmllc18uc2l6ZSgpOyBpKyspIHsKLSAgICAgIGRlbGV0ZSBlbnRyaWVzX1tpXTsKLSAgICB9Ci0gIH0KLQotICBzdGF0aWMgSW5uZXJDbGFzc2VzQXR0cmlidXRlKiBSZWFkKGNvbnN0IHUxIComcCwgQ29uc3RhbnQgKmF0dHJpYnV0ZV9uYW1lKSB7Ci0gICAgSW5uZXJDbGFzc2VzQXR0cmlidXRlICphdHRyID0gbmV3IElubmVyQ2xhc3Nlc0F0dHJpYnV0ZTsKLSAgICBhdHRyLT5hdHRyaWJ1dGVfbmFtZV8gPSBhdHRyaWJ1dGVfbmFtZTsKLQotICAgIHUyIG51bWJlcl9vZl9jbGFzc2VzID0gZ2V0X3UyYmUocCk7Ci0gICAgZm9yIChpbnQgaWkgPSAwOyBpaSA8IG51bWJlcl9vZl9jbGFzc2VzOyArK2lpKSB7Ci0gICAgICBFbnRyeSAqZW50cnkgPSBuZXcgRW50cnk7Ci0gICAgICBlbnRyeS0+aW5uZXJfY2xhc3NfaW5mbyA9IGNvbnN0YW50KGdldF91MmJlKHApKTsKLSAgICAgIGVudHJ5LT5vdXRlcl9jbGFzc19pbmZvID0gY29uc3RhbnQoZ2V0X3UyYmUocCkpOwotICAgICAgZW50cnktPmlubmVyX25hbWUgPSBjb25zdGFudChnZXRfdTJiZShwKSk7Ci0gICAgICBlbnRyeS0+aW5uZXJfY2xhc3NfYWNjZXNzX2ZsYWdzID0gZ2V0X3UyYmUocCk7Ci0KLSAgICAgIGF0dHItPmVudHJpZXNfLnB1c2hfYmFjayhlbnRyeSk7Ci0gICAgfQotICAgIHJldHVybiBhdHRyOwotICB9Ci0KLSAgdm9pZCBXcml0ZSh1MSAqJnApIHsKLSAgICBzdGQ6OnNldDxpbnQ+IGtlcHRfZW50cmllczsKLSAgICAvLyBXZSBrZWVwIGFuIGVudHJ5IGlmIHRoZSBjb25zdGFudCByZWZlcnJpbmcgdG8gdGhlIGlubmVyIGNsYXNzIGlzIGFscmVhZHkKLSAgICAvLyBrZXB0LiBUaGVuIHdlIG1hcmsgaXRzIG91dGVyIGNsYXNzIGFuZCBpdHMgY2xhc3MgbmFtZSBhcyBrZXB0LCB0b28sIHRoZW4KLSAgICAvLyBpdGVyYXRlIHVudGlsIGEgZml4ZWQgcG9pbnQgaXMgcmVhY2hlZC4KLSAgICBzaXplX3QgZW50cnlfY291bnQ7Ci0gICAgaW50IGl0ZXJhdGlvbiA9IDA7Ci0KLSAgICBkbyB7Ci0gICAgICBlbnRyeV9jb3VudCA9IGtlcHRfZW50cmllcy5zaXplKCk7Ci0gICAgICBmb3IgKHNpemVfdCBpX2VudHJ5ID0gMDsgaV9lbnRyeSA8IGVudHJpZXNfLnNpemUoKTsgKytpX2VudHJ5KSB7Ci0gICAgICAgIEVudHJ5KiBlbnRyeSA9IGVudHJpZXNfW2lfZW50cnldOwotICAgICAgICBpZiAoZW50cnktPmlubmVyX2NsYXNzX2luZm8tPktlcHQoKSB8fAotICAgICAgICAgICAgdXNlZF9jbGFzc19uYW1lcy5maW5kKGVudHJ5LT5pbm5lcl9jbGFzc19pbmZvLT5EaXNwbGF5KCkpCi0gICAgICAgICAgICAgICAgIT0gdXNlZF9jbGFzc19uYW1lcy5lbmQoKSB8fAotICAgICAgICAgICAgZW50cnktPm91dGVyX2NsYXNzX2luZm8gPT0gY2xhc3NfbmFtZSB8fAotICAgICAgICAgICAgZW50cnktPm91dGVyX2NsYXNzX2luZm8gPT0gTlVMTCB8fAotICAgICAgICAgICAgZW50cnktPmlubmVyX25hbWUgPT0gTlVMTCkgewotICAgICAgICAgIGtlcHRfZW50cmllcy5pbnNlcnQoaV9lbnRyeSk7Ci0KLSAgICAgICAgICAvLyBUaGVzZSBhcmUgemVybyBmb3IgYW5vbnltb3VzIGlubmVyIGNsYXNzZXMKLSAgICAgICAgICBpZiAoZW50cnktPm91dGVyX2NsYXNzX2luZm8gIT0gTlVMTCkgewotICAgICAgICAgICAgZW50cnktPm91dGVyX2NsYXNzX2luZm8tPnNsb3QoKTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBpZiAoZW50cnktPmlubmVyX25hbWUgIT0gTlVMTCkgewotICAgICAgICAgICAgZW50cnktPmlubmVyX25hbWUtPnNsb3QoKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGl0ZXJhdGlvbiArPSAxOwotICAgIH0gd2hpbGUgKGVudHJ5X2NvdW50ICE9IGtlcHRfZW50cmllcy5zaXplKCkpOwotCi0gICAgaWYgKGtlcHRfZW50cmllcy5zaXplKCkgPT0gMCkgewotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIFdyaXRlUHJvbG9nKHAsIDIgKyBrZXB0X2VudHJpZXMuc2l6ZSgpICogOCk7Ci0gICAgcHV0X3UyYmUocCwga2VwdF9lbnRyaWVzLnNpemUoKSk7Ci0KLSAgICBmb3IgKHN0ZDo6c2V0PGludD46Oml0ZXJhdG9yIGl0ID0ga2VwdF9lbnRyaWVzLmJlZ2luKCk7Ci0gICAgICAgICBpdCAhPSBrZXB0X2VudHJpZXMuZW5kKCk7Ci0gICAgICAgICArK2l0KSB7Ci0gICAgICBFbnRyeSAqZW50cnkgPSBlbnRyaWVzX1sqaXRdOwotICAgICAgcHV0X3UyYmUocCwgZW50cnktPmlubmVyX2NsYXNzX2luZm8gPT0gTlVMTAotICAgICAgICAgICAgICAgPyAwCi0gICAgICAgICAgICAgICA6IGVudHJ5LT5pbm5lcl9jbGFzc19pbmZvLT5zbG90KCkpOwotICAgICAgcHV0X3UyYmUocCwgZW50cnktPm91dGVyX2NsYXNzX2luZm8gPT0gTlVMTAotICAgICAgICAgICAgICAgPyAwCi0gICAgICAgICAgICAgICA6IGVudHJ5LT5vdXRlcl9jbGFzc19pbmZvLT5zbG90KCkpOwotICAgICAgcHV0X3UyYmUocCwgZW50cnktPmlubmVyX25hbWUgPT0gTlVMTAotICAgICAgICAgICAgICAgPyAwCi0gICAgICAgICAgICAgICA6IGVudHJ5LT5pbm5lcl9uYW1lLT5zbG90KCkpOwotICAgICAgcHV0X3UyYmUocCwgZW50cnktPmlubmVyX2NsYXNzX2FjY2Vzc19mbGFncyk7Ci0gICAgfQotICB9Ci0KLSAgc3RkOjp2ZWN0b3I8RW50cnkqPiBlbnRyaWVzXzsKLX07Ci0KLS8vIFNlZSBzZWMuNC43Ljcgb2YgSlZNIHNwZWMuCi0vLyBXZSBwcmVzZXJ2ZSBFbmNsb3NpbmdNZXRob2QgYXR0cmlidXRlcyB0byBiZSBhYmxlIHRvIGlkZW50aWZ5IGxvY2FsIGFuZAotLy8gYW5vbnltb3VzIGNsYXNzZXMuIFRoZXNlIGNsYXNzZXMgd2lsbCBiZSBzdHJpcHBlZCBvZiBtb3N0IGNvbnRlbnQsIGFzIHRoZXkKLS8vIHJlcHJlc2VudCBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzIHRoYXQgc2hvdWRuJ3QgbGVhayBpbnRvIHRoZSBpamFycy4gT21pdHRpbmcKLS8vIEVuY2xvc2luZ01ldGhvZCBhdHRyaWJ1dGVzIGNhbiBsZWFkIHRvIHR5cGUtY2hlY2tpbmcgZmFpbHVyZXMgaW4gdGhlIHByZXNlbmNlCi0vLyBvZiBnZW5lcmljcyAoc2VlIGIvOTA3MDkzOSkuCi1zdHJ1Y3QgRW5jbG9zaW5nTWV0aG9kQXR0cmlidXRlIDogQXR0cmlidXRlIHsKLQotICBzdGF0aWMgRW5jbG9zaW5nTWV0aG9kQXR0cmlidXRlKiBSZWFkKGNvbnN0IHUxIComcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudCAqYXR0cmlidXRlX25hbWUpIHsKLSAgICBFbmNsb3NpbmdNZXRob2RBdHRyaWJ1dGUgKmF0dHIgPSBuZXcgRW5jbG9zaW5nTWV0aG9kQXR0cmlidXRlOwotICAgIGF0dHItPmF0dHJpYnV0ZV9uYW1lXyA9IGF0dHJpYnV0ZV9uYW1lOwotICAgIGF0dHItPmNsYXNzXyA9IGNvbnN0YW50KGdldF91MmJlKHApKTsKLSAgICBhdHRyLT5tZXRob2RfID0gY29uc3RhbnQoZ2V0X3UyYmUocCkpOwotICAgIHJldHVybiBhdHRyOwotICB9Ci0KLSAgdm9pZCBXcml0ZSh1MSAqJnApIHsKLSAgICBXcml0ZVByb2xvZyhwLCA0KTsKLSAgICBwdXRfdTJiZShwLCBjbGFzc18tPnNsb3QoKSk7Ci0gICAgcHV0X3UyYmUocCwgbWV0aG9kXyA9PSBOVUxMID8gMCA6IG1ldGhvZF8tPnNsb3QoKSk7Ci0gIH0KLQotICBDb25zdGFudCAqY2xhc3NfOwotICBDb25zdGFudCAqbWV0aG9kXzsKLX07Ci0KLS8vIFNlZSBzZWMuNC43LjE2LjEgb2YgSlZNIHNwZWMuCi0vLyBVc2VkIGJ5IEFubm90YXRpb25EZWZhdWx0IGFuZCBvdGhlciBhdHRyaWJ1dGVzLgotc3RydWN0IEVsZW1lbnRWYWx1ZSB7Ci0gIHZpcnR1YWwgfkVsZW1lbnRWYWx1ZSgpIHt9Ci0gIHZpcnR1YWwgdm9pZCBXcml0ZSh1MSAqJnApID0gMDsKLSAgdmlydHVhbCB2b2lkIEV4dHJhY3RDbGFzc05hbWVzKCkge30KLSAgc3RhdGljIEVsZW1lbnRWYWx1ZSogUmVhZChjb25zdCB1MSAqJnApOwotICB1MSB0YWdfOwotICB1NCBsZW5ndGhfOwotfTsKLQotc3RydWN0IEJhc2VUeXBlRWxlbWVudFZhbHVlIDogRWxlbWVudFZhbHVlIHsKLSAgdm9pZCBXcml0ZSh1MSAqJnApIHsKLSAgICBwdXRfdTEocCwgdGFnXyk7Ci0gICAgcHV0X3UyYmUocCwgY29uc3RfdmFsdWVfLT5zbG90KCkpOwotICB9Ci0gIHN0YXRpYyBCYXNlVHlwZUVsZW1lbnRWYWx1ZSAqUmVhZChjb25zdCB1MSAqJnApIHsKLSAgICBCYXNlVHlwZUVsZW1lbnRWYWx1ZSAqdmFsdWUgPSBuZXcgQmFzZVR5cGVFbGVtZW50VmFsdWU7Ci0gICAgdmFsdWUtPmNvbnN0X3ZhbHVlXyA9IGNvbnN0YW50KGdldF91MmJlKHApKTsKLSAgICByZXR1cm4gdmFsdWU7Ci0gIH0KLSAgQ29uc3RhbnQgKmNvbnN0X3ZhbHVlXzsKLX07Ci0KLXN0cnVjdCBFbnVtVHlwZUVsZW1lbnRWYWx1ZSA6IEVsZW1lbnRWYWx1ZSB7Ci0gIHZvaWQgV3JpdGUodTEgKiZwKSB7Ci0gICAgcHV0X3UxKHAsIHRhZ18pOwotICAgIHB1dF91MmJlKHAsIHR5cGVfbmFtZV8tPnNsb3QoKSk7Ci0gICAgcHV0X3UyYmUocCwgY29uc3RfbmFtZV8tPnNsb3QoKSk7Ci0gIH0KLSAgc3RhdGljIEVudW1UeXBlRWxlbWVudFZhbHVlICpSZWFkKGNvbnN0IHUxIComcCkgewotICAgIEVudW1UeXBlRWxlbWVudFZhbHVlICp2YWx1ZSA9IG5ldyBFbnVtVHlwZUVsZW1lbnRWYWx1ZTsKLSAgICB2YWx1ZS0+dHlwZV9uYW1lXyA9IGNvbnN0YW50KGdldF91MmJlKHApKTsKLSAgICB2YWx1ZS0+Y29uc3RfbmFtZV8gPSBjb25zdGFudChnZXRfdTJiZShwKSk7Ci0gICAgcmV0dXJuIHZhbHVlOwotICB9Ci0gIENvbnN0YW50ICp0eXBlX25hbWVfOwotICBDb25zdGFudCAqY29uc3RfbmFtZV87Ci19OwotCi1zdHJ1Y3QgQ2xhc3NUeXBlRWxlbWVudFZhbHVlIDogRWxlbWVudFZhbHVlIHsKLSAgdm9pZCBXcml0ZSh1MSAqJnApIHsKLSAgICBwdXRfdTEocCwgdGFnXyk7Ci0gICAgcHV0X3UyYmUocCwgY2xhc3NfaW5mb18tPnNsb3QoKSk7Ci0gIH0KLQotICB2aXJ0dWFsIHZvaWQgRXh0cmFjdENsYXNzTmFtZXMoKSB7Ci0gICAgc2l6ZV90IGlkeCA9IDA7Ci0gICAgZGV2dG9vbHNfaWphcjo6RXh0cmFjdENsYXNzTmFtZXMoY2xhc3NfaW5mb18tPkRpc3BsYXkoKSwgJmlkeCk7Ci0gIH0KLQotICBzdGF0aWMgQ2xhc3NUeXBlRWxlbWVudFZhbHVlICpSZWFkKGNvbnN0IHUxIComcCkgewotICAgIENsYXNzVHlwZUVsZW1lbnRWYWx1ZSAqdmFsdWUgPSBuZXcgQ2xhc3NUeXBlRWxlbWVudFZhbHVlOwotICAgIHZhbHVlLT5jbGFzc19pbmZvXyA9IGNvbnN0YW50KGdldF91MmJlKHApKTsKLSAgICByZXR1cm4gdmFsdWU7Ci0gIH0KLSAgQ29uc3RhbnQgKmNsYXNzX2luZm9fOwotfTsKLQotc3RydWN0IEFycmF5VHlwZUVsZW1lbnRWYWx1ZSA6IEVsZW1lbnRWYWx1ZSB7Ci0gIHZpcnR1YWwgfkFycmF5VHlwZUVsZW1lbnRWYWx1ZSgpIHsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHZhbHVlc18uc2l6ZSgpOyBpKyspIHsKLSAgICAgIGRlbGV0ZSB2YWx1ZXNfW2ldOwotICAgIH0KLSAgfQotCi0gIHZpcnR1YWwgdm9pZCBFeHRyYWN0Q2xhc3NOYW1lcygpIHsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHZhbHVlc18uc2l6ZSgpOyBpKyspIHsKLSAgICAgIHZhbHVlc19baV0tPkV4dHJhY3RDbGFzc05hbWVzKCk7Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBXcml0ZSh1MSAqJnApIHsKLSAgICBwdXRfdTEocCwgdGFnXyk7Ci0gICAgcHV0X3UyYmUocCwgdmFsdWVzXy5zaXplKCkpOwotICAgIGZvciAoc2l6ZV90IGlpID0gMDsgaWkgPCB2YWx1ZXNfLnNpemUoKTsgKytpaSkgewotICAgICAgdmFsdWVzX1tpaV0tPldyaXRlKHApOwotICAgIH0KLSAgfQotICBzdGF0aWMgQXJyYXlUeXBlRWxlbWVudFZhbHVlICpSZWFkKGNvbnN0IHUxIComcCkgewotICAgIEFycmF5VHlwZUVsZW1lbnRWYWx1ZSAqdmFsdWUgPSBuZXcgQXJyYXlUeXBlRWxlbWVudFZhbHVlOwotICAgIHUyIG51bV92YWx1ZXMgPSBnZXRfdTJiZShwKTsKLSAgICBmb3IgKGludCBpaSA9IDA7IGlpIDwgbnVtX3ZhbHVlczsgKytpaSkgewotICAgICAgdmFsdWUtPnZhbHVlc18ucHVzaF9iYWNrKEVsZW1lbnRWYWx1ZTo6UmVhZChwKSk7Ci0gICAgfQotICAgIHJldHVybiB2YWx1ZTsKLSAgfQotICBzdGQ6OnZlY3RvcjxFbGVtZW50VmFsdWUqPiB2YWx1ZXNfOwotfTsKLQotLy8gU2VlIHNlYy40LjcuMTYgb2YgSlZNIHNwZWMuCi1zdHJ1Y3QgQW5ub3RhdGlvbiB7Ci0gIHZpcnR1YWwgfkFubm90YXRpb24oKSB7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBlbGVtZW50X3ZhbHVlX3BhaXJzXy5zaXplKCk7IGkrKykgewotICAgICAgZGVsZXRlIGVsZW1lbnRfdmFsdWVfcGFpcnNfW2ldLT5lbGVtZW50X3ZhbHVlXzsKLSAgICAgIGRlbGV0ZSBlbGVtZW50X3ZhbHVlX3BhaXJzX1tpXTsKLSAgICB9Ci0gIH0KLQotICB2b2lkIEV4dHJhY3RDbGFzc05hbWVzKCkgewotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZWxlbWVudF92YWx1ZV9wYWlyc18uc2l6ZSgpOyBpKyspIHsKLSAgICAgIGVsZW1lbnRfdmFsdWVfcGFpcnNfW2ldLT5lbGVtZW50X3ZhbHVlXy0+RXh0cmFjdENsYXNzTmFtZXMoKTsKLSAgICB9Ci0gIH0KLQotICB2b2lkIFdyaXRlKHUxIComcCkgewotICAgIHB1dF91MmJlKHAsIHR5cGVfLT5zbG90KCkpOwotICAgIHB1dF91MmJlKHAsIGVsZW1lbnRfdmFsdWVfcGFpcnNfLnNpemUoKSk7Ci0gICAgZm9yIChzaXplX3QgaWkgPSAwOyBpaSA8IGVsZW1lbnRfdmFsdWVfcGFpcnNfLnNpemUoKTsgKytpaSkgewotICAgICAgcHV0X3UyYmUocCwgZWxlbWVudF92YWx1ZV9wYWlyc19baWldLT5lbGVtZW50X25hbWVfLT5zbG90KCkpOwotICAgICAgZWxlbWVudF92YWx1ZV9wYWlyc19baWldLT5lbGVtZW50X3ZhbHVlXy0+V3JpdGUocCk7Ci0gICAgfQotICB9Ci0gIHN0YXRpYyBBbm5vdGF0aW9uICpSZWFkKGNvbnN0IHUxIComcCkgewotICAgIEFubm90YXRpb24gKnZhbHVlID0gbmV3IEFubm90YXRpb247Ci0gICAgdmFsdWUtPnR5cGVfID0gY29uc3RhbnQoZ2V0X3UyYmUocCkpOwotICAgIHUyIG51bV9lbGVtZW50X3ZhbHVlX3BhaXJzID0gZ2V0X3UyYmUocCk7Ci0gICAgZm9yIChpbnQgaWkgPSAwOyBpaSA8IG51bV9lbGVtZW50X3ZhbHVlX3BhaXJzOyArK2lpKSB7Ci0gICAgICBFbGVtZW50VmFsdWVQYWlyICpwYWlyID0gbmV3IEVsZW1lbnRWYWx1ZVBhaXI7Ci0gICAgICBwYWlyLT5lbGVtZW50X25hbWVfID0gY29uc3RhbnQoZ2V0X3UyYmUocCkpOwotICAgICAgcGFpci0+ZWxlbWVudF92YWx1ZV8gPSBFbGVtZW50VmFsdWU6OlJlYWQocCk7Ci0gICAgICB2YWx1ZS0+ZWxlbWVudF92YWx1ZV9wYWlyc18ucHVzaF9iYWNrKHBhaXIpOwotICAgIH0KLSAgICByZXR1cm4gdmFsdWU7Ci0gIH0KLSAgQ29uc3RhbnQgKnR5cGVfOwotICBzdHJ1Y3QgRWxlbWVudFZhbHVlUGFpciB7Ci0gICAgQ29uc3RhbnQgKmVsZW1lbnRfbmFtZV87Ci0gICAgRWxlbWVudFZhbHVlICplbGVtZW50X3ZhbHVlXzsKLSAgfTsKLSAgc3RkOjp2ZWN0b3I8RWxlbWVudFZhbHVlUGFpcio+IGVsZW1lbnRfdmFsdWVfcGFpcnNfOwotfTsKLQotLy8gU2VlIHNlYyA0LjcuMjAgb2YgSmF2YSA4IEpWTSBTcGVjCi0vLwotLy8gRWFjaCBlbnRyeSBpbiB0aGUgYW5ub3RhdGlvbnMgdGFibGUgcmVwcmVzZW50cyBhIHNpbmdsZSBydW4tdGltZSB2aXNpYmxlCi0vLyBhbm5vdGF0aW9uIG9uIGEgdHlwZSB1c2VkIGluIGEgZGVjbGFyYXRpb24gb3IgZXhwcmVzc2lvbi4gVGhlIHR5cGVfYW5ub3RhdGlvbgotLy8gc3RydWN0dXJlIGhhcyB0aGUgZm9sbG93aW5nIGZvcm1hdDoKLS8vCi0vLyB0eXBlX2Fubm90YXRpb24gewotLy8gICB1MSB0YXJnZXRfdHlwZTsKLS8vICAgdW5pb24gewotLy8gICAgIHR5cGVfcGFyYW1ldGVyX3RhcmdldDsKLS8vICAgICBzdXBlcnR5cGVfdGFyZ2V0OwotLy8gICAgIHR5cGVfcGFyYW1ldGVyX2JvdW5kX3RhcmdldDsKLS8vICAgICBlbXB0eV90YXJnZXQ7Ci0vLyAgICAgbWV0aG9kX2Zvcm1hbF9wYXJhbWV0ZXJfdGFyZ2V0OwotLy8gICAgIHRocm93c190YXJnZXQ7Ci0vLyAgICAgbG9jYWx2YXJfdGFyZ2V0OwotLy8gICAgIGNhdGNoX3RhcmdldDsKLS8vICAgICBvZmZzZXRfdGFyZ2V0OwotLy8gICAgIHR5cGVfYXJndW1lbnRfdGFyZ2V0OwotLy8gICB9IHRhcmdldF9pbmZvOwotLy8gICB0eXBlX3BhdGggdGFyZ2V0X3BhdGg7Ci0vLyAgIHUyICAgICAgICB0eXBlX2luZGV4OwotLy8gICB1MiAgICAgICAgbnVtX2VsZW1lbnRfdmFsdWVfcGFpcnM7Ci0vLyAgIHsKLS8vICAgICB1MiAgICAgICAgICAgIGVsZW1lbnRfbmFtZV9pbmRleDsKLS8vICAgICBlbGVtZW50X3ZhbHVlIHZhbHVlOwotLy8gICB9Ci0vLyAgIGVsZW1lbnRfdmFsdWVfcGFpcnNbbnVtX2VsZW1lbnRfdmFsdWVfcGFpcnNdOwotLy8gfQotLy8KLXN0cnVjdCBUeXBlQW5ub3RhdGlvbiB7Ci0gIHZpcnR1YWwgflR5cGVBbm5vdGF0aW9uKCkgewotICAgIGRlbGV0ZSB0YXJnZXRfaW5mb187Ci0gICAgZGVsZXRlIHR5cGVfcGF0aF87Ci0gICAgZGVsZXRlIGFubm90YXRpb25fOwotICB9Ci0KLSAgdm9pZCBFeHRyYWN0Q2xhc3NOYW1lcygpIHsKLSAgICBhbm5vdGF0aW9uXy0+RXh0cmFjdENsYXNzTmFtZXMoKTsKLSAgfQotCi0gIHZvaWQgV3JpdGUodTEgKiZwKSB7Ci0gICAgcHV0X3UxKHAsIHRhcmdldF90eXBlXyk7Ci0gICAgdGFyZ2V0X2luZm9fLT5Xcml0ZShwKTsKLSAgICB0eXBlX3BhdGhfLT5Xcml0ZShwKTsKLSAgICBhbm5vdGF0aW9uXy0+V3JpdGUocCk7Ci0gIH0KLQotICBzdGF0aWMgVHlwZUFubm90YXRpb24gKlJlYWQoY29uc3QgdTEgKiZwKSB7Ci0gICAgVHlwZUFubm90YXRpb24gKnZhbHVlID0gbmV3IFR5cGVBbm5vdGF0aW9uOwotICAgIHZhbHVlLT50YXJnZXRfdHlwZV8gPSBnZXRfdTEocCk7Ci0gICAgdmFsdWUtPnRhcmdldF9pbmZvXyA9IFJlYWRUYXJnZXRJbmZvKHAsIHZhbHVlLT50YXJnZXRfdHlwZV8pOwotICAgIHZhbHVlLT50eXBlX3BhdGhfID0gVHlwZVBhdGg6OlJlYWQocCk7Ci0gICAgdmFsdWUtPmFubm90YXRpb25fID0gQW5ub3RhdGlvbjo6UmVhZChwKTsKLSAgICByZXR1cm4gdmFsdWU7Ci0gIH0KLQotICBzdHJ1Y3QgVGFyZ2V0SW5mbyB7Ci0gICAgdmlydHVhbCB+VGFyZ2V0SW5mbygpIHt9Ci0gICAgdmlydHVhbCB2b2lkIFdyaXRlKHUxIComcCkgPSAwOwotICB9OwotCi0gIHN0cnVjdCBUeXBlUGFyYW1ldGVyVGFyZ2V0SW5mbyA6IFRhcmdldEluZm8gewotICAgIHZvaWQgV3JpdGUodTEgKiZwKSB7Ci0gICAgICBwdXRfdTEocCwgdHlwZV9wYXJhbWV0ZXJfaW5kZXhfKTsKLSAgICB9Ci0gICAgc3RhdGljIFR5cGVQYXJhbWV0ZXJUYXJnZXRJbmZvICpSZWFkKGNvbnN0IHUxIComcCkgewotICAgICAgVHlwZVBhcmFtZXRlclRhcmdldEluZm8gKnZhbHVlID0gbmV3IFR5cGVQYXJhbWV0ZXJUYXJnZXRJbmZvOwotICAgICAgdmFsdWUtPnR5cGVfcGFyYW1ldGVyX2luZGV4XyA9IGdldF91MShwKTsKLSAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9Ci0gICAgdTEgdHlwZV9wYXJhbWV0ZXJfaW5kZXhfOwotICB9OwotCi0gIHN0cnVjdCBDbGFzc0V4dGVuZHNJbmZvIDogVGFyZ2V0SW5mbyB7Ci0gICAgdm9pZCBXcml0ZSh1MSAqJnApIHsKLSAgICAgIHB1dF91MmJlKHAsIHN1cGVydHlwZV9pbmRleF8pOwotICAgIH0KLSAgICBzdGF0aWMgQ2xhc3NFeHRlbmRzSW5mbyAqUmVhZChjb25zdCB1MSAqJnApIHsKLSAgICAgIENsYXNzRXh0ZW5kc0luZm8gKnZhbHVlID0gbmV3IENsYXNzRXh0ZW5kc0luZm87Ci0gICAgICB2YWx1ZS0+c3VwZXJ0eXBlX2luZGV4XyA9IGdldF91MmJlKHApOwotICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0KLSAgICB1MiBzdXBlcnR5cGVfaW5kZXhfOwotICB9OwotCi0gIHN0cnVjdCBUeXBlUGFyYW1ldGVyQm91bmRJbmZvIDogVGFyZ2V0SW5mbyB7Ci0gICAgdm9pZCBXcml0ZSh1MSAqJnApIHsKLSAgICAgIHB1dF91MShwLCB0eXBlX3BhcmFtZXRlcl9pbmRleF8pOwotICAgICAgcHV0X3UxKHAsIGJvdW5kX2luZGV4Xyk7Ci0gICAgfQotICAgIHN0YXRpYyBUeXBlUGFyYW1ldGVyQm91bmRJbmZvICpSZWFkKGNvbnN0IHUxIComcCkgewotICAgICAgVHlwZVBhcmFtZXRlckJvdW5kSW5mbyAqdmFsdWUgPSBuZXcgVHlwZVBhcmFtZXRlckJvdW5kSW5mbzsKLSAgICAgIHZhbHVlLT50eXBlX3BhcmFtZXRlcl9pbmRleF8gPSBnZXRfdTEocCk7Ci0gICAgICB2YWx1ZS0+Ym91bmRfaW5kZXhfID0gZ2V0X3UxKHApOwotICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0KLSAgICB1MSB0eXBlX3BhcmFtZXRlcl9pbmRleF87Ci0gICAgdTEgYm91bmRfaW5kZXhfOwotICB9OwotCi0gIHN0cnVjdCBFbXB0eUluZm8gOiBUYXJnZXRJbmZvIHsKLSAgICB2b2lkIFdyaXRlKHUxIComKSB7fQotICAgIHN0YXRpYyBFbXB0eUluZm8gKlJlYWQoY29uc3QgdTEgKiYpIHsKLSAgICAgIHJldHVybiBuZXcgRW1wdHlJbmZvOwotICAgIH0KLSAgfTsKLQotICBzdHJ1Y3QgTWV0aG9kRm9ybWFsUGFyYW1ldGVySW5mbyA6IFRhcmdldEluZm8gewotICAgIHZvaWQgV3JpdGUodTEgKiZwKSB7Ci0gICAgICBwdXRfdTEocCwgbWV0aG9kX2Zvcm1hbF9wYXJhbWV0ZXJfaW5kZXhfKTsKLSAgICB9Ci0gICAgc3RhdGljIE1ldGhvZEZvcm1hbFBhcmFtZXRlckluZm8gKlJlYWQoY29uc3QgdTEgKiZwKSB7Ci0gICAgICBNZXRob2RGb3JtYWxQYXJhbWV0ZXJJbmZvICp2YWx1ZSA9IG5ldyBNZXRob2RGb3JtYWxQYXJhbWV0ZXJJbmZvOwotICAgICAgdmFsdWUtPm1ldGhvZF9mb3JtYWxfcGFyYW1ldGVyX2luZGV4XyA9IGdldF91MShwKTsKLSAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9Ci0gICAgdTEgbWV0aG9kX2Zvcm1hbF9wYXJhbWV0ZXJfaW5kZXhfOwotICB9OwotCi0gIHN0cnVjdCBUaHJvd3NUeXBlSW5mbyA6IFRhcmdldEluZm8gewotICAgIHZvaWQgV3JpdGUodTEgKiZwKSB7Ci0gICAgICBwdXRfdTJiZShwLCB0aHJvd3NfdHlwZV9pbmRleF8pOwotICAgIH0KLSAgICBzdGF0aWMgVGhyb3dzVHlwZUluZm8gKlJlYWQoY29uc3QgdTEgKiZwKSB7Ci0gICAgICBUaHJvd3NUeXBlSW5mbyAqdmFsdWUgPSBuZXcgVGhyb3dzVHlwZUluZm87Ci0gICAgICB2YWx1ZS0+dGhyb3dzX3R5cGVfaW5kZXhfID0gZ2V0X3UyYmUocCk7Ci0gICAgICByZXR1cm4gdmFsdWU7Ci0gICAgfQotICAgIHUyIHRocm93c190eXBlX2luZGV4XzsKLSAgfTsKLQotICBzdGF0aWMgVGFyZ2V0SW5mbyAqUmVhZFRhcmdldEluZm8oY29uc3QgdTEgKiZwLCB1MSB0YXJnZXRfdHlwZSkgewotICAgIHN3aXRjaCAodGFyZ2V0X3R5cGUpIHsKLSAgICAgIGNhc2UgQ0xBU1NfVFlQRV9QQVJBTUVURVI6Ci0gICAgICBjYXNlIE1FVEhPRF9UWVBFX1BBUkFNRVRFUjoKLSAgICAgICAgcmV0dXJuIFR5cGVQYXJhbWV0ZXJUYXJnZXRJbmZvOjpSZWFkKHApOwotICAgICAgY2FzZSBDTEFTU19FWFRFTkRTOgotICAgICAgICByZXR1cm4gQ2xhc3NFeHRlbmRzSW5mbzo6UmVhZChwKTsKLSAgICAgIGNhc2UgQ0xBU1NfVFlQRV9QQVJBTUVURVJfQk9VTkQ6Ci0gICAgICBjYXNlIE1FVEhPRF9UWVBFX1BBUkFNRVRFUl9CT1VORDoKLSAgICAgICAgcmV0dXJuIFR5cGVQYXJhbWV0ZXJCb3VuZEluZm86OlJlYWQocCk7Ci0gICAgICBjYXNlIEZJRUxEOgotICAgICAgY2FzZSBNRVRIT0RfUkVUVVJOOgotICAgICAgY2FzZSBNRVRIT0RfUkVDRUlWRVI6Ci0gICAgICAgIHJldHVybiBuZXcgRW1wdHlJbmZvOwotICAgICAgY2FzZSBNRVRIT0RfRk9STUFMX1BBUkFNRVRFUjoKLSAgICAgICAgcmV0dXJuIE1ldGhvZEZvcm1hbFBhcmFtZXRlckluZm86OlJlYWQocCk7Ci0gICAgICBjYXNlIFRIUk9XUzoKLSAgICAgICAgcmV0dXJuIFRocm93c1R5cGVJbmZvOjpSZWFkKHApOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJJbGxlZ2FsIHR5cGUgYW5ub3RhdGlvbiB0YXJnZXQgdHlwZTogJWRcbiIsCi0gICAgICAgICAgICAgICAgdGFyZ2V0X3R5cGUpOwotICAgICAgICBhYm9ydCgpOwotICAgIH0KLSAgfQotCi0gIHN0cnVjdCBUeXBlUGF0aCB7Ci0gICAgdm9pZCBXcml0ZSh1MSAqJnApIHsKLSAgICAgIHB1dF91MShwLCBwYXRoXy5zaXplKCkpOwotICAgICAgZm9yIChUeXBlUGF0aEVudHJ5IGVudHJ5IDogcGF0aF8pIHsKLSAgICAgICAgcHV0X3UxKHAsIGVudHJ5LnR5cGVfcGF0aF9raW5kXyk7Ci0gICAgICAgIHB1dF91MShwLCBlbnRyeS50eXBlX2FyZ3VtZW50X2luZGV4Xyk7Ci0gICAgICB9Ci0gICAgfQotICAgIHN0YXRpYyBUeXBlUGF0aCAqUmVhZChjb25zdCB1MSAqJnApIHsKLSAgICAgIFR5cGVQYXRoICp2YWx1ZSA9IG5ldyBUeXBlUGF0aDsKLSAgICAgIHUxIHBhdGhfbGVuZ3RoID0gZ2V0X3UxKHApOwotICAgICAgZm9yIChpbnQgaWkgPSAwOyBpaSA8IHBhdGhfbGVuZ3RoOyArK2lpKSB7Ci0gICAgICAgIFR5cGVQYXRoRW50cnkgZW50cnk7Ci0gICAgICAgIGVudHJ5LnR5cGVfcGF0aF9raW5kXyA9IGdldF91MShwKTsKLSAgICAgICAgZW50cnkudHlwZV9hcmd1bWVudF9pbmRleF8gPSBnZXRfdTEocCk7Ci0gICAgICAgIHZhbHVlLT5wYXRoXy5wdXNoX2JhY2soZW50cnkpOwotICAgICAgfQotICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0KLQotICAgIHN0cnVjdCBUeXBlUGF0aEVudHJ5IHsKLSAgICAgIHUxIHR5cGVfcGF0aF9raW5kXzsKLSAgICAgIHUxIHR5cGVfYXJndW1lbnRfaW5kZXhfOwotICAgIH07Ci0gICAgc3RkOjp2ZWN0b3I8VHlwZVBhdGhFbnRyeT4gcGF0aF87Ci0gIH07Ci0KLSAgdTEgdGFyZ2V0X3R5cGVfOwotICBUYXJnZXRJbmZvICp0YXJnZXRfaW5mb187Ci0gIFR5cGVQYXRoICp0eXBlX3BhdGhfOwotICBBbm5vdGF0aW9uICphbm5vdGF0aW9uXzsKLX07Ci0KLXN0cnVjdCBBbm5vdGF0aW9uVHlwZUVsZW1lbnRWYWx1ZSA6IEVsZW1lbnRWYWx1ZSB7Ci0gIHZpcnR1YWwgfkFubm90YXRpb25UeXBlRWxlbWVudFZhbHVlKCkgewotICAgIGRlbGV0ZSBhbm5vdGF0aW9uXzsKLSAgfQotCi0gIHZvaWQgV3JpdGUodTEgKiZwKSB7Ci0gICAgcHV0X3UxKHAsIHRhZ18pOwotICAgIGFubm90YXRpb25fLT5Xcml0ZShwKTsKLSAgfQotICBzdGF0aWMgQW5ub3RhdGlvblR5cGVFbGVtZW50VmFsdWUgKlJlYWQoY29uc3QgdTEgKiZwKSB7Ci0gICAgQW5ub3RhdGlvblR5cGVFbGVtZW50VmFsdWUgKnZhbHVlID0gbmV3IEFubm90YXRpb25UeXBlRWxlbWVudFZhbHVlOwotICAgIHZhbHVlLT5hbm5vdGF0aW9uXyA9IEFubm90YXRpb246OlJlYWQocCk7Ci0gICAgcmV0dXJuIHZhbHVlOwotICB9Ci0KLSAgQW5ub3RhdGlvbiAqYW5ub3RhdGlvbl87Ci19OwotCi1FbGVtZW50VmFsdWUqIEVsZW1lbnRWYWx1ZTo6UmVhZChjb25zdCB1MSAqJnApIHsKLSAgY29uc3QgdTEqIHN0YXJ0ID0gcDsKLSAgRWxlbWVudFZhbHVlICpyZXN1bHQ7Ci0gIHUxIHRhZyA9IGdldF91MShwKTsKLSAgaWYgKHRhZyAhPSAwICYmIHN0cmNocigiQkNERklKU1pzIiwgKGNoYXIpIHRhZykgIT0gTlVMTCkgewotICAgIHJlc3VsdCA9IEJhc2VUeXBlRWxlbWVudFZhbHVlOjpSZWFkKHApOwotICB9IGVsc2UgaWYgKChjaGFyKSB0YWcgPT0gJ2UnKSB7Ci0gICAgcmVzdWx0ID0gRW51bVR5cGVFbGVtZW50VmFsdWU6OlJlYWQocCk7Ci0gIH0gZWxzZSBpZiAoKGNoYXIpIHRhZyA9PSAnYycpIHsKLSAgICByZXN1bHQgPSBDbGFzc1R5cGVFbGVtZW50VmFsdWU6OlJlYWQocCk7Ci0gIH0gZWxzZSBpZiAoKGNoYXIpIHRhZyA9PSAnWycpIHsKLSAgICByZXN1bHQgPSBBcnJheVR5cGVFbGVtZW50VmFsdWU6OlJlYWQocCk7Ci0gIH0gZWxzZSBpZiAoKGNoYXIpIHRhZyA9PSAnQCcpIHsKLSAgICByZXN1bHQgPSBBbm5vdGF0aW9uVHlwZUVsZW1lbnRWYWx1ZTo6UmVhZChwKTsKLSAgfSBlbHNlIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIklsbGVnYWwgZWxlbWVudF92YWx1ZTo6dGFnOiAlZFxuIiwgdGFnKTsKLSAgICBhYm9ydCgpOwotICB9Ci0gIHJlc3VsdC0+dGFnXyA9IHRhZzsKLSAgcmVzdWx0LT5sZW5ndGhfID0gcCAtIHN0YXJ0OwotICByZXR1cm4gcmVzdWx0OwotfQotCi0vLyBTZWUgc2VjLjQuNy4yMCBvZiBKVk0gc3BlYy4KLS8vIFdlIHByZXNlcnZlIEFubm90YXRpb25EZWZhdWx0IGF0dHJpYnV0ZXMgYmVjYXVzZSB0aGV5IGFyZSByZXF1aXJlZAotLy8gaW4gb3JkZXIgdG8gbWFrZSB1c2Ugb2YgYW4gYW5ub3RhdGlvbiBpbiBuZXcgY29kZS4KLXN0cnVjdCBBbm5vdGF0aW9uRGVmYXVsdEF0dHJpYnV0ZSA6IEF0dHJpYnV0ZSB7Ci0gIHZpcnR1YWwgfkFubm90YXRpb25EZWZhdWx0QXR0cmlidXRlKCkgewotICAgIGRlbGV0ZSBkZWZhdWx0X3ZhbHVlXzsKLSAgfQotCi0gIHN0YXRpYyBBbm5vdGF0aW9uRGVmYXVsdEF0dHJpYnV0ZSogUmVhZChjb25zdCB1MSAqJnAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudCAqYXR0cmlidXRlX25hbWUpIHsKLSAgICBBbm5vdGF0aW9uRGVmYXVsdEF0dHJpYnV0ZSAqYXR0ciA9IG5ldyBBbm5vdGF0aW9uRGVmYXVsdEF0dHJpYnV0ZTsKLSAgICBhdHRyLT5hdHRyaWJ1dGVfbmFtZV8gPSBhdHRyaWJ1dGVfbmFtZTsKLSAgICBhdHRyLT5kZWZhdWx0X3ZhbHVlXyA9IEVsZW1lbnRWYWx1ZTo6UmVhZChwKTsKLSAgICByZXR1cm4gYXR0cjsKLSAgfQotCi0gIHZvaWQgV3JpdGUodTEgKiZwKSB7Ci0gICAgV3JpdGVQcm9sb2cocCwgZGVmYXVsdF92YWx1ZV8tPmxlbmd0aF8pOwotICAgIGRlZmF1bHRfdmFsdWVfLT5Xcml0ZShwKTsKLSAgfQotCi0gIHZpcnR1YWwgdm9pZCBFeHRyYWN0Q2xhc3NOYW1lcygpIHsKLSAgICBkZWZhdWx0X3ZhbHVlXy0+RXh0cmFjdENsYXNzTmFtZXMoKTsKLSAgfQotCi0gIEVsZW1lbnRWYWx1ZSAqZGVmYXVsdF92YWx1ZV87Ci19OwotCi0vLyBTZWUgc2VjLjQuNy4yIG9mIEpWTSBzcGVjLgotLy8gV2UgcHJlc2VydmUgQ29uc3RhbnRWYWx1ZSBhdHRyaWJ1dGVzIGJlY2F1c2UgdGhleSBhcmUgcmVxdWlyZWQgZm9yCi0vLyBjb21waWxlLXRpbWUgY29uc3RhbnQgcHJvcGFnYXRpb24uCi1zdHJ1Y3QgQ29uc3RhbnRWYWx1ZUF0dHJpYnV0ZSA6IEF0dHJpYnV0ZSB7Ci0KLSAgc3RhdGljIENvbnN0YW50VmFsdWVBdHRyaWJ1dGUqIFJlYWQoY29uc3QgdTEgKiZwLCBDb25zdGFudCAqYXR0cmlidXRlX25hbWUpIHsKLSAgICBDb25zdGFudFZhbHVlQXR0cmlidXRlICphdHRyID0gbmV3IENvbnN0YW50VmFsdWVBdHRyaWJ1dGU7Ci0gICAgYXR0ci0+YXR0cmlidXRlX25hbWVfID0gYXR0cmlidXRlX25hbWU7Ci0gICAgYXR0ci0+Y29uc3RhbnR2YWx1ZV8gPSBjb25zdGFudChnZXRfdTJiZShwKSk7Ci0gICAgcmV0dXJuIGF0dHI7Ci0gIH0KLQotICB2b2lkIFdyaXRlKHUxIComcCkgewotICAgIFdyaXRlUHJvbG9nKHAsIDIpOwotICAgIHB1dF91MmJlKHAsIGNvbnN0YW50dmFsdWVfLT5zbG90KCkpOwotICB9Ci0KLSAgQ29uc3RhbnQgKmNvbnN0YW50dmFsdWVfOwotfTsKLQotLy8gU2VlIHNlYy40LjcuOSBvZiBKVk0gc3BlYy4KLS8vIFdlIHByZXNlcnZlIFNpZ25hdHVyZSBhdHRyaWJ1dGVzIGJlY2F1c2UgdGhleSBhcmUgcmVxdWlyZWQgYnkgdGhlCi0vLyBjb21waWxlciBmb3IgdHlwZS1jaGVja2luZyBvZiBnZW5lcmljcy4KLXN0cnVjdCBTaWduYXR1cmVBdHRyaWJ1dGUgOiBBdHRyaWJ1dGUgewotCi0gIHN0YXRpYyBTaWduYXR1cmVBdHRyaWJ1dGUqIFJlYWQoY29uc3QgdTEgKiZwLCBDb25zdGFudCAqYXR0cmlidXRlX25hbWUpIHsKLSAgICBTaWduYXR1cmVBdHRyaWJ1dGUgKmF0dHIgPSBuZXcgU2lnbmF0dXJlQXR0cmlidXRlOwotICAgIGF0dHItPmF0dHJpYnV0ZV9uYW1lXyA9IGF0dHJpYnV0ZV9uYW1lOwotICAgIGF0dHItPnNpZ25hdHVyZV8gID0gY29uc3RhbnQoZ2V0X3UyYmUocCkpOwotICAgIHJldHVybiBhdHRyOwotICB9Ci0KLSAgdm9pZCBXcml0ZSh1MSAqJnApIHsKLSAgICBXcml0ZVByb2xvZyhwLCAyKTsKLSAgICBwdXRfdTJiZShwLCBzaWduYXR1cmVfLT5zbG90KCkpOwotICB9Ci0KLSAgdmlydHVhbCB2b2lkIEV4dHJhY3RDbGFzc05hbWVzKCkgewotICAgIHNpemVfdCBzaWduYXR1cmVfaWR4ID0gMDsKLSAgICBkZXZ0b29sc19pamFyOjpFeHRyYWN0Q2xhc3NOYW1lcyhzaWduYXR1cmVfLT5EaXNwbGF5KCksICZzaWduYXR1cmVfaWR4KTsKLSAgfQotCi0gIENvbnN0YW50ICpzaWduYXR1cmVfOwotfTsKLQotLy8gU2VlIHNlYy40LjcuMTUgb2YgSlZNIHNwZWMuCi0vLyBXZSBwcmVzZXJ2ZSBEZXByZWNhdGVkIGF0dHJpYnV0ZXMgYmVjYXVzZSB0aGV5IGFyZSByZXF1aXJlZCBieSB0aGUKLS8vIGNvbXBpbGVyIHRvIGdlbmVyYXRlIHdhcm5pbmcgbWVzc2FnZXMuCi1zdHJ1Y3QgRGVwcmVjYXRlZEF0dHJpYnV0ZSA6IEF0dHJpYnV0ZSB7Ci0KLSAgc3RhdGljIERlcHJlY2F0ZWRBdHRyaWJ1dGUqIFJlYWQoY29uc3QgdTEgKiYsIENvbnN0YW50ICphdHRyaWJ1dGVfbmFtZSkgewotICAgIERlcHJlY2F0ZWRBdHRyaWJ1dGUgKmF0dHIgPSBuZXcgRGVwcmVjYXRlZEF0dHJpYnV0ZTsKLSAgICBhdHRyLT5hdHRyaWJ1dGVfbmFtZV8gPSBhdHRyaWJ1dGVfbmFtZTsKLSAgICByZXR1cm4gYXR0cjsKLSAgfQotCi0gIHZvaWQgV3JpdGUodTEgKiZwKSB7Ci0gICAgV3JpdGVQcm9sb2cocCwgMCk7Ci0gIH0KLX07Ci0KLS8vIFNlZSBzZWMuNC43LjE2LTE3IG9mIEpWTSBzcGVjIHYzLiAgSW5jbHVkZXMgUnVudGltZVZpc2libGUgYW5kCi0vLyBSdW50aW1lSW52aXNpYmxlLgotLy8KLS8vIFdlIHByZXNlcnZlIGFsbCBhbm5vdGF0aW9ucy4KLXN0cnVjdCBBbm5vdGF0aW9uc0F0dHJpYnV0ZSA6IEF0dHJpYnV0ZSB7Ci0gIHZpcnR1YWwgfkFubm90YXRpb25zQXR0cmlidXRlKCkgewotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYW5ub3RhdGlvbnNfLnNpemUoKTsgaSsrKSB7Ci0gICAgICBkZWxldGUgYW5ub3RhdGlvbnNfW2ldOwotICAgIH0KLSAgfQotCi0gIHN0YXRpYyBBbm5vdGF0aW9uc0F0dHJpYnV0ZSogUmVhZChjb25zdCB1MSAqJnAsIENvbnN0YW50ICphdHRyaWJ1dGVfbmFtZSkgewotICAgIEFubm90YXRpb25zQXR0cmlidXRlICphdHRyID0gbmV3IEFubm90YXRpb25zQXR0cmlidXRlOwotICAgIGF0dHItPmF0dHJpYnV0ZV9uYW1lXyA9IGF0dHJpYnV0ZV9uYW1lOwotICAgIHUyIG51bV9hbm5vdGF0aW9ucyA9IGdldF91MmJlKHApOwotICAgIGZvciAoaW50IGlpID0gMDsgaWkgPCBudW1fYW5ub3RhdGlvbnM7ICsraWkpIHsKLSAgICAgIEFubm90YXRpb24gKmFubm90YXRpb24gPSBBbm5vdGF0aW9uOjpSZWFkKHApOwotICAgICAgYXR0ci0+YW5ub3RhdGlvbnNfLnB1c2hfYmFjayhhbm5vdGF0aW9uKTsKLSAgICB9Ci0gICAgcmV0dXJuIGF0dHI7Ci0gIH0KLQotICB2aXJ0dWFsIHZvaWQgRXh0cmFjdENsYXNzTmFtZXMoKSB7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhbm5vdGF0aW9uc18uc2l6ZSgpOyBpKyspIHsKLSAgICAgIGFubm90YXRpb25zX1tpXS0+RXh0cmFjdENsYXNzTmFtZXMoKTsKLSAgICB9Ci0gIH0KLQotICB2b2lkIFdyaXRlKHUxIComcCkgewotICAgIFdyaXRlUHJvbG9nKHAsIC0xKTsKLSAgICB1MSAqcGF5bG9hZF9zdGFydCA9IHAgLSA0OwotICAgIHB1dF91MmJlKHAsIGFubm90YXRpb25zXy5zaXplKCkpOwotICAgIGZvciAoc2l6ZV90IGlpID0gMDsgaWkgPCBhbm5vdGF0aW9uc18uc2l6ZSgpOyArK2lpKSB7Ci0gICAgICBhbm5vdGF0aW9uc19baWldLT5Xcml0ZShwKTsKLSAgICB9Ci0gICAgcHV0X3U0YmUocGF5bG9hZF9zdGFydCwgcCAtIDQgLSBwYXlsb2FkX3N0YXJ0KTsgIC8vIGJhY2twYXRjaCBsZW5ndGgKLSAgfQotCi0gIHN0ZDo6dmVjdG9yPEFubm90YXRpb24qPiBhbm5vdGF0aW9uc187Ci19OwotCi0vLyBTZWUgc2VjLjQuNy4xOC0xOSBvZiBKVk0gc3BlYy4gIEluY2x1ZGVzIFJ1bnRpbWVWaXNpYmxlIGFuZAotLy8gUnVudGltZUludmlzaWJsZS4KLS8vCi0vLyBXZSBwcmVzZXJ2ZSBhbGwgYW5ub3RhdGlvbnMuCi1zdHJ1Y3QgUGFyYW1ldGVyQW5ub3RhdGlvbnNBdHRyaWJ1dGUgOiBBdHRyaWJ1dGUgewotCi0gIHN0YXRpYyBQYXJhbWV0ZXJBbm5vdGF0aW9uc0F0dHJpYnV0ZSogUmVhZChjb25zdCB1MSAqJnAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudCAqYXR0cmlidXRlX25hbWUpIHsKLSAgICBQYXJhbWV0ZXJBbm5vdGF0aW9uc0F0dHJpYnV0ZSAqYXR0ciA9IG5ldyBQYXJhbWV0ZXJBbm5vdGF0aW9uc0F0dHJpYnV0ZTsKLSAgICBhdHRyLT5hdHRyaWJ1dGVfbmFtZV8gPSBhdHRyaWJ1dGVfbmFtZTsKLSAgICB1MSBudW1fcGFyYW1ldGVycyA9IGdldF91MShwKTsKLSAgICBmb3IgKGludCBpaSA9IDA7IGlpIDwgbnVtX3BhcmFtZXRlcnM7ICsraWkpIHsKLSAgICAgIHN0ZDo6dmVjdG9yPEFubm90YXRpb24qPiBhbm5vdGF0aW9uczsKLSAgICAgIHUyIG51bV9hbm5vdGF0aW9ucyA9IGdldF91MmJlKHApOwotICAgICAgZm9yIChpbnQgaWkgPSAwOyBpaSA8IG51bV9hbm5vdGF0aW9uczsgKytpaSkgewotICAgICAgICBBbm5vdGF0aW9uICphbm5vdGF0aW9uID0gQW5ub3RhdGlvbjo6UmVhZChwKTsKLSAgICAgICAgYW5ub3RhdGlvbnMucHVzaF9iYWNrKGFubm90YXRpb24pOwotICAgICAgfQotICAgICAgYXR0ci0+cGFyYW1ldGVyX2Fubm90YXRpb25zXy5wdXNoX2JhY2soYW5ub3RhdGlvbnMpOwotICAgIH0KLSAgICByZXR1cm4gYXR0cjsKLSAgfQotCi0gIHZpcnR1YWwgdm9pZCBFeHRyYWN0Q2xhc3NOYW1lcygpIHsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBhcmFtZXRlcl9hbm5vdGF0aW9uc18uc2l6ZSgpOyBpKyspIHsKLSAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEFubm90YXRpb24qPiYgYW5ub3RhdGlvbnMgPSBwYXJhbWV0ZXJfYW5ub3RhdGlvbnNfW2ldOwotICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBhbm5vdGF0aW9ucy5zaXplKCk7IGorKykgewotICAgICAgICBhbm5vdGF0aW9uc1tqXS0+RXh0cmFjdENsYXNzTmFtZXMoKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICB2b2lkIFdyaXRlKHUxIComcCkgewotICAgIFdyaXRlUHJvbG9nKHAsIC0xKTsKLSAgICB1MSAqcGF5bG9hZF9zdGFydCA9IHAgLSA0OwotICAgIHB1dF91MShwLCBwYXJhbWV0ZXJfYW5ub3RhdGlvbnNfLnNpemUoKSk7Ci0gICAgZm9yIChzaXplX3QgaWkgPSAwOyBpaSA8IHBhcmFtZXRlcl9hbm5vdGF0aW9uc18uc2l6ZSgpOyArK2lpKSB7Ci0gICAgICBzdGQ6OnZlY3RvcjxBbm5vdGF0aW9uICo+ICZhbm5vdGF0aW9ucyA9IHBhcmFtZXRlcl9hbm5vdGF0aW9uc19baWldOwotICAgICAgcHV0X3UyYmUocCwgYW5ub3RhdGlvbnMuc2l6ZSgpKTsKLSAgICAgIGZvciAoc2l6ZV90IGpqID0gMDsgamogPCBhbm5vdGF0aW9ucy5zaXplKCk7ICsramopIHsKLSAgICAgICAgYW5ub3RhdGlvbnNbampdLT5Xcml0ZShwKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcHV0X3U0YmUocGF5bG9hZF9zdGFydCwgcCAtIDQgLSBwYXlsb2FkX3N0YXJ0KTsgIC8vIGJhY2twYXRjaCBsZW5ndGgKLSAgfQotCi0gIHN0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPEFubm90YXRpb24qPiA+IHBhcmFtZXRlcl9hbm5vdGF0aW9uc187Ci19OwotCi0vLyBTZWUgc2VjLjQuNy4yMCBvZiBKYXZhIDggSlZNIHNwZWMuIEluY2x1ZGVzIFJ1bnRpbWVWaXNpYmxlVHlwZUFubm90YXRpb25zCi0vLyBhbmQgUnVudGltZUludmlzaWJsZVR5cGVBbm5vdGF0aW9ucy4KLXN0cnVjdCBUeXBlQW5ub3RhdGlvbnNBdHRyaWJ1dGUgOiBBdHRyaWJ1dGUgewotICBzdGF0aWMgVHlwZUFubm90YXRpb25zQXR0cmlidXRlKiBSZWFkKGNvbnN0IHUxIComcCwgQ29uc3RhbnQgKmF0dHJpYnV0ZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU0KSB7Ci0gICAgYXV0byBhdHRyID0gbmV3IFR5cGVBbm5vdGF0aW9uc0F0dHJpYnV0ZTsKLSAgICBhdHRyLT5hdHRyaWJ1dGVfbmFtZV8gPSBhdHRyaWJ1dGVfbmFtZTsKLSAgICB1MiBudW1fYW5ub3RhdGlvbnMgPSBnZXRfdTJiZShwKTsKLSAgICBmb3IgKGludCBpaSA9IDA7IGlpIDwgbnVtX2Fubm90YXRpb25zOyArK2lpKSB7Ci0gICAgICBUeXBlQW5ub3RhdGlvbiAqYW5ub3RhdGlvbiA9IFR5cGVBbm5vdGF0aW9uOjpSZWFkKHApOwotICAgICAgYXR0ci0+dHlwZV9hbm5vdGF0aW9uc18ucHVzaF9iYWNrKGFubm90YXRpb24pOwotICAgIH0KLSAgICByZXR1cm4gYXR0cjsKLSAgfQotCi0gIHZpcnR1YWwgdm9pZCBFeHRyYWN0Q2xhc3NOYW1lcygpIHsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHR5cGVfYW5ub3RhdGlvbnNfLnNpemUoKTsgaSsrKSB7Ci0gICAgICB0eXBlX2Fubm90YXRpb25zX1tpXS0+RXh0cmFjdENsYXNzTmFtZXMoKTsKLSAgICB9Ci0gIH0KLQotICB2b2lkIFdyaXRlKHUxIComcCkgewotICAgIFdyaXRlUHJvbG9nKHAsIC0xKTsKLSAgICB1MSAqcGF5bG9hZF9zdGFydCA9IHAgLSA0OwotICAgIHB1dF91MmJlKHAsIHR5cGVfYW5ub3RhdGlvbnNfLnNpemUoKSk7Ci0gICAgZm9yIChUeXBlQW5ub3RhdGlvbiAqYW5ub3RhdGlvbiA6IHR5cGVfYW5ub3RhdGlvbnNfKSB7Ci0gICAgICBhbm5vdGF0aW9uLT5Xcml0ZShwKTsKLSAgICB9Ci0gICAgcHV0X3U0YmUocGF5bG9hZF9zdGFydCwgcCAtIDQgLSBwYXlsb2FkX3N0YXJ0KTsgIC8vIGJhY2twYXRjaCBsZW5ndGgKLSAgfQotCi0gIHN0ZDo6dmVjdG9yPFR5cGVBbm5vdGF0aW9uKj4gdHlwZV9hbm5vdGF0aW9uc187Ci19OwotCi1zdHJ1Y3QgR2VuZXJhbEF0dHJpYnV0ZSA6IEF0dHJpYnV0ZSB7Ci0gIHN0YXRpYyBHZW5lcmFsQXR0cmlidXRlKiBSZWFkKGNvbnN0IHUxIComcCwgQ29uc3RhbnQgKmF0dHJpYnV0ZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1NCBhdHRyaWJ1dGVfbGVuZ3RoKSB7Ci0gICAgYXV0byBhdHRyID0gbmV3IEdlbmVyYWxBdHRyaWJ1dGU7Ci0gICAgYXR0ci0+YXR0cmlidXRlX25hbWVfID0gYXR0cmlidXRlX25hbWU7Ci0gICAgYXR0ci0+YXR0cmlidXRlX2xlbmd0aF8gPSBhdHRyaWJ1dGVfbGVuZ3RoOwotICAgIGF0dHItPmF0dHJpYnV0ZV9jb250ZW50XyA9IHA7Ci0gICAgcCArPSBhdHRyaWJ1dGVfbGVuZ3RoOwotICAgIHJldHVybiBhdHRyOwotICB9Ci0KLSAgdm9pZCBXcml0ZSh1MSAqJnApIHsKLSAgICBXcml0ZVByb2xvZyhwLCBhdHRyaWJ1dGVfbGVuZ3RoXyk7Ci0gICAgcHV0X24ocCwgYXR0cmlidXRlX2NvbnRlbnRfLCBhdHRyaWJ1dGVfbGVuZ3RoXyk7Ci0gIH0KLQotICB1NCBhdHRyaWJ1dGVfbGVuZ3RoXzsKLSAgY29uc3QgdTEgKmF0dHJpYnV0ZV9jb250ZW50XzsKLX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzRmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RydWN0IEhhc0F0dHJzIHsKLSAgc3RkOjp2ZWN0b3I8QXR0cmlidXRlKj4gYXR0cmlidXRlczsKLQotICB2b2lkIFdyaXRlQXR0cnModTEgKiZwKTsKLSAgdm9pZCBSZWFkQXR0cnMoY29uc3QgdTEgKiZwKTsKLQotICB2aXJ0dWFsIH5IYXNBdHRycygpIHsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGF0dHJpYnV0ZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgIGRlbGV0ZSBhdHRyaWJ1dGVzW2ldOwotICAgIH0KLSAgfQotCi0gIHZvaWQgRXh0cmFjdENsYXNzTmFtZXMoKSB7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhdHRyaWJ1dGVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICBhdHRyaWJ1dGVzW2ldLT5FeHRyYWN0Q2xhc3NOYW1lcygpOwotICAgIH0KLSAgfQotfTsKLQotLy8gQSBmaWVsZCBvciBtZXRob2QuCi0vLyBTZWUgc2VjLjQuNSBhbmQgNC42IG9mIEpWTSBzcGVjLgotc3RydWN0IE1lbWJlciA6IEhhc0F0dHJzIHsKLSAgdTIgYWNjZXNzX2ZsYWdzOwotICBDb25zdGFudCAqbmFtZTsKLSAgQ29uc3RhbnQgKmRlc2NyaXB0b3I7Ci0KLSAgc3RhdGljIE1lbWJlciogUmVhZChjb25zdCB1MSAqJnApIHsKLSAgICBNZW1iZXIgKm0gPSBuZXcgTWVtYmVyOwotICAgIG0tPmFjY2Vzc19mbGFncyA9IGdldF91MmJlKHApOwotICAgIG0tPm5hbWUgPSBjb25zdGFudChnZXRfdTJiZShwKSk7Ci0gICAgbS0+ZGVzY3JpcHRvciA9IGNvbnN0YW50KGdldF91MmJlKHApKTsKLSAgICBtLT5SZWFkQXR0cnMocCk7Ci0gICAgcmV0dXJuIG07Ci0gIH0KLQotICB2b2lkIFdyaXRlKHUxIComcCkgewotICAgIHB1dF91MmJlKHAsIGFjY2Vzc19mbGFncyk7Ci0gICAgcHV0X3UyYmUocCwgbmFtZS0+c2xvdCgpKTsKLSAgICBwdXRfdTJiZShwLCBkZXNjcmlwdG9yLT5zbG90KCkpOwotICAgIFdyaXRlQXR0cnMocCk7Ci0gIH0KLX07Ci0KLS8vIFNlZSBzZWMuNC4xIG9mIEpWTSBzcGVjLgotc3RydWN0IENsYXNzRmlsZSA6IEhhc0F0dHJzIHsKLQotICBzaXplX3QgbGVuZ3RoOwotCi0gIC8vIEhlYWRlcjoKLSAgdTQgbWFnaWM7Ci0gIHUyIG1ham9yOwotICB1MiBtaW5vcjsKLQotICAvLyBCb2R5OgotICB1MiBhY2Nlc3NfZmxhZ3M7Ci0gIENvbnN0YW50ICp0aGlzX2NsYXNzOwotICBDb25zdGFudCAqc3VwZXJfY2xhc3M7Ci0gIHN0ZDo6dmVjdG9yPENvbnN0YW50Kj4gaW50ZXJmYWNlczsKLSAgc3RkOjp2ZWN0b3I8TWVtYmVyKj4gZmllbGRzOwotICBzdGQ6OnZlY3RvcjxNZW1iZXIqPiBtZXRob2RzOwotCi0gIHZpcnR1YWwgfkNsYXNzRmlsZSgpIHsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGZpZWxkcy5zaXplKCk7IGkrKykgewotICAgICAgZGVsZXRlIGZpZWxkc1tpXTsKLSAgICB9Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1ldGhvZHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgIGRlbGV0ZSBtZXRob2RzW2ldOwotICAgIH0KLQotICAgIC8vIENvbnN0YW50cyBkbyBub3QgbmVlZCB0byBiZSBkZWxldGVkOyB0aGV5IGFyZSBvd25lZCBieSB0aGUgY29uc3RhbnQgcG9vbC4KLSAgfQotCi0gIHZvaWQgV3JpdGVDbGFzcyh1MSAqJnApOwotCi0gIGJvb2wgUmVhZENvbnN0YW50UG9vbChjb25zdCB1MSAqJnApOwotCi0gIHZvaWQgU3RyaXBJZkFub255bW91cygpOwotCi0gIHZvaWQgV3JpdGVIZWFkZXIodTEgKiZwKSB7Ci0gICAgcHV0X3U0YmUocCwgbWFnaWMpOwotICAgIHB1dF91MmJlKHAsIG1ham9yKTsKLSAgICBwdXRfdTJiZShwLCBtaW5vcik7Ci0KLSAgICBwdXRfdTJiZShwLCBjb25zdF9wb29sX291dC5zaXplKCkpOwotICAgIGZvciAodTIgaWkgPSAxOyBpaSA8IGNvbnN0X3Bvb2xfb3V0LnNpemUoKTsgKytpaSkgewotICAgICAgaWYgKGNvbnN0X3Bvb2xfb3V0W2lpXSAhPSBOVUxMKSB7IC8vIE5COiBOVUxMcyBhcHBlYXIgYWZ0ZXIgbG9uZy9kb3VibGUuCi0gICAgICAgIGNvbnN0X3Bvb2xfb3V0W2lpXS0+V3JpdGUocCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBXcml0ZUJvZHkodTEgKiZwKSB7Ci0gICAgcHV0X3UyYmUocCwgYWNjZXNzX2ZsYWdzKTsKLSAgICBwdXRfdTJiZShwLCB0aGlzX2NsYXNzLT5zbG90KCkpOwotICAgIHB1dF91MmJlKHAsIHN1cGVyX2NsYXNzID09IE5VTEwgPyAwIDogc3VwZXJfY2xhc3MtPnNsb3QoKSk7Ci0gICAgcHV0X3UyYmUocCwgaW50ZXJmYWNlcy5zaXplKCkpOwotICAgIGZvciAoc2l6ZV90IGlpID0gMDsgaWkgPCBpbnRlcmZhY2VzLnNpemUoKTsgKytpaSkgewotICAgICAgcHV0X3UyYmUocCwgaW50ZXJmYWNlc1tpaV0tPnNsb3QoKSk7Ci0gICAgfQotICAgIHB1dF91MmJlKHAsIGZpZWxkcy5zaXplKCkpOwotICAgIGZvciAoc2l6ZV90IGlpID0gMDsgaWkgPCBmaWVsZHMuc2l6ZSgpOyArK2lpKSB7Ci0gICAgICBmaWVsZHNbaWldLT5Xcml0ZShwKTsKLSAgICB9Ci0gICAgcHV0X3UyYmUocCwgbWV0aG9kcy5zaXplKCkpOwotICAgIGZvciAoc2l6ZV90IGlpID0gMDsgaWkgPCBtZXRob2RzLnNpemUoKTsgKytpaSkgewotICAgICAgbWV0aG9kc1tpaV0tPldyaXRlKHApOwotICAgIH0KLQotICAgIEF0dHJpYnV0ZSogaW5uZXJfY2xhc3NlcyA9IE5VTEw7Ci0KLSAgICAvLyBNYWtlIHRoZSBpbm5lciBjbGFzc2VzIGF0dHJpYnV0ZSB0aGUgbGFzdCwgc28gdGhhdCBpdCBjYW4ga25vdyB3aGljaAotICAgIC8vIGNvbnN0YW50cyB3ZXJlIG5lZWRlZAotICAgIGZvciAoc2l6ZV90IGlpID0gMDsgaWkgPCBhdHRyaWJ1dGVzLnNpemUoKTsgaWkrKykgewotICAgICAgaWYgKGF0dHJpYnV0ZXNbaWldLT5hdHRyaWJ1dGVfbmFtZV8tPkRpc3BsYXkoKSA9PSAiSW5uZXJDbGFzc2VzIikgewotICAgICAgICBpbm5lcl9jbGFzc2VzID0gYXR0cmlidXRlc1tpaV07Ci0gICAgICAgIGF0dHJpYnV0ZXMuZXJhc2UoYXR0cmlidXRlcy5iZWdpbigpICsgaWkpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoaW5uZXJfY2xhc3NlcyAhPSBOVUxMKSB7Ci0gICAgICBhdHRyaWJ1dGVzLnB1c2hfYmFjayhpbm5lcl9jbGFzc2VzKTsKLSAgICB9Ci0KLSAgICBXcml0ZUF0dHJzKHApOwotICB9Ci0KLX07Ci0KLXZvaWQgSGFzQXR0cnM6OlJlYWRBdHRycyhjb25zdCB1MSAqJnApIHsKLSAgdTIgYXR0cmlidXRlc19jb3VudCA9IGdldF91MmJlKHApOwotICBmb3IgKGludCBpaSA9IDA7IGlpIDwgYXR0cmlidXRlc19jb3VudDsgaWkrKykgewotICAgIENvbnN0YW50ICphdHRyaWJ1dGVfbmFtZSA9IGNvbnN0YW50KGdldF91MmJlKHApKTsKLSAgICB1NCBhdHRyaWJ1dGVfbGVuZ3RoID0gZ2V0X3U0YmUocCk7Ci0KLSAgICBzdGQ6OnN0cmluZyBhdHRyX25hbWUgPSBhdHRyaWJ1dGVfbmFtZS0+RGlzcGxheSgpOwotICAgIGlmIChhdHRyX25hbWUgPT0gIlNvdXJjZUZpbGUiIHx8Ci0gICAgICAgIGF0dHJfbmFtZSA9PSAiTGluZU51bWJlclRhYmxlIiB8fAotICAgICAgICBhdHRyX25hbWUgPT0gIkxvY2FsVmFyaWFibGVUYWJsZSIgfHwKLSAgICAgICAgYXR0cl9uYW1lID09ICJMb2NhbFZhcmlhYmxlVHlwZVRhYmxlIiB8fAotICAgICAgICBhdHRyX25hbWUgPT0gIkNvZGUiIHx8Ci0gICAgICAgIGF0dHJfbmFtZSA9PSAiU3ludGhldGljIiB8fAotICAgICAgICBhdHRyX25hbWUgPT0gIkJvb3RzdHJhcE1ldGhvZHMiKSB7Ci0gICAgICBwICs9IGF0dHJpYnV0ZV9sZW5ndGg7IC8vIGRyb3AgdGhlc2UgYXR0cmlidXRlcwotICAgIH0gZWxzZSBpZiAoYXR0cl9uYW1lID09ICJFeGNlcHRpb25zIikgewotICAgICAgYXR0cmlidXRlcy5wdXNoX2JhY2soRXhjZXB0aW9uc0F0dHJpYnV0ZTo6UmVhZChwLCBhdHRyaWJ1dGVfbmFtZSkpOwotICAgIH0gZWxzZSBpZiAoYXR0cl9uYW1lID09ICJTaWduYXR1cmUiKSB7Ci0gICAgICBhdHRyaWJ1dGVzLnB1c2hfYmFjayhTaWduYXR1cmVBdHRyaWJ1dGU6OlJlYWQocCwgYXR0cmlidXRlX25hbWUpKTsKLSAgICB9IGVsc2UgaWYgKGF0dHJfbmFtZSA9PSAiRGVwcmVjYXRlZCIpIHsKLSAgICAgIGF0dHJpYnV0ZXMucHVzaF9iYWNrKERlcHJlY2F0ZWRBdHRyaWJ1dGU6OlJlYWQocCwgYXR0cmlidXRlX25hbWUpKTsKLSAgICB9IGVsc2UgaWYgKGF0dHJfbmFtZSA9PSAiRW5jbG9zaW5nTWV0aG9kIikgewotICAgICAgYXR0cmlidXRlcy5wdXNoX2JhY2soRW5jbG9zaW5nTWV0aG9kQXR0cmlidXRlOjpSZWFkKHAsIGF0dHJpYnV0ZV9uYW1lKSk7Ci0gICAgfSBlbHNlIGlmIChhdHRyX25hbWUgPT0gIklubmVyQ2xhc3NlcyIpIHsKLSAgICAgIC8vIFRPRE8oYmF6ZWwtdGVhbSk6IG9taXQgcHJpdmF0ZSBpbm5lciBjbGFzc2VzCi0gICAgICBhdHRyaWJ1dGVzLnB1c2hfYmFjayhJbm5lckNsYXNzZXNBdHRyaWJ1dGU6OlJlYWQocCwgYXR0cmlidXRlX25hbWUpKTsKLSAgICB9IGVsc2UgaWYgKGF0dHJfbmFtZSA9PSAiQW5ub3RhdGlvbkRlZmF1bHQiKSB7Ci0gICAgICBhdHRyaWJ1dGVzLnB1c2hfYmFjayhBbm5vdGF0aW9uRGVmYXVsdEF0dHJpYnV0ZTo6UmVhZChwLCBhdHRyaWJ1dGVfbmFtZSkpOwotICAgIH0gZWxzZSBpZiAoYXR0cl9uYW1lID09ICJDb25zdGFudFZhbHVlIikgewotICAgICAgYXR0cmlidXRlcy5wdXNoX2JhY2soQ29uc3RhbnRWYWx1ZUF0dHJpYnV0ZTo6UmVhZChwLCBhdHRyaWJ1dGVfbmFtZSkpOwotICAgIH0gZWxzZSBpZiAoYXR0cl9uYW1lID09ICJSdW50aW1lVmlzaWJsZUFubm90YXRpb25zIiB8fAotICAgICAgICAgICAgICAgYXR0cl9uYW1lID09ICJSdW50aW1lSW52aXNpYmxlQW5ub3RhdGlvbnMiKSB7Ci0gICAgICBhdHRyaWJ1dGVzLnB1c2hfYmFjayhBbm5vdGF0aW9uc0F0dHJpYnV0ZTo6UmVhZChwLCBhdHRyaWJ1dGVfbmFtZSkpOwotICAgIH0gZWxzZSBpZiAoYXR0cl9uYW1lID09ICJSdW50aW1lVmlzaWJsZVBhcmFtZXRlckFubm90YXRpb25zIiB8fAotICAgICAgICAgICAgICAgYXR0cl9uYW1lID09ICJSdW50aW1lSW52aXNpYmxlUGFyYW1ldGVyQW5ub3RhdGlvbnMiKSB7Ci0gICAgICBhdHRyaWJ1dGVzLnB1c2hfYmFjaygKLSAgICAgICAgICBQYXJhbWV0ZXJBbm5vdGF0aW9uc0F0dHJpYnV0ZTo6UmVhZChwLCBhdHRyaWJ1dGVfbmFtZSkpOwotICAgIH0gZWxzZSBpZiAoYXR0cl9uYW1lID09ICJTY2FsYSIgfHwKLSAgICAgICAgICAgICAgIGF0dHJfbmFtZSA9PSAiU2NhbGFTaWciIHx8Ci0gICAgICAgICAgICAgICBhdHRyX25hbWUgPT0gIlNjYWxhSW5saW5lSW5mbyIpIHsKLSAgICAgIC8vIFRoZXNlIGFyZSBvcGFxdWUgYmxvYnMsIHNvIGNhbiBiZSBoYW5kbGVkIHdpdGggYSBnZW5lcmFsCi0gICAgICAvLyBhdHRyaWJ1dGUgaGFuZGxlcgotICAgICAgYXR0cmlidXRlcy5wdXNoX2JhY2soR2VuZXJhbEF0dHJpYnV0ZTo6UmVhZChwLCBhdHRyaWJ1dGVfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlX2xlbmd0aCkpOwotICAgIH0gZWxzZSBpZiAoYXR0cl9uYW1lID09ICJSdW50aW1lVmlzaWJsZVR5cGVBbm5vdGF0aW9ucyIgfHwKLSAgICAgICAgICAgICAgIGF0dHJfbmFtZSA9PSAiUnVudGltZUludmlzaWJsZVR5cGVBbm5vdGF0aW9ucyIpIHsKLSAgICAgIC8vIEpTUiAzMDg6IGFubm90YXRpb25zIG9uIHR5cGVzLiBKREsgNyBoYXMgbm8gdXNlIGZvciB0aGVzZSB5ZXQsIGJ1dCB0aGUKLSAgICAgIC8vIENoZWNrZXJzIEZyYW1ld29yayByZWxpZXMgb24gdGhlbS4KLSAgICAgIGF0dHJpYnV0ZXMucHVzaF9iYWNrKFR5cGVBbm5vdGF0aW9uc0F0dHJpYnV0ZTo6UmVhZChwLCBhdHRyaWJ1dGVfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVfbGVuZ3RoKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8vIFNraXAgb3ZlciB1bmtub3duIGF0dHJpYnV0ZXMgd2l0aCBhIHdhcm5pbmcuICBUaGUgSlZNIHNwZWMKLSAgICAgIC8vIHNheXMgdGhpcyBpcyBvaywgc28gbG9uZyBhcyB3ZSBoYW5kbGUgdGhlIG1hbmRhdG9yeSBhdHRyaWJ1dGVzLgotICAgICAgZnByaW50ZihzdGRlcnIsICJpamFyOiBza2lwcGluZyB1bmtub3duIGF0dHJpYnV0ZTogXCIlc1wiLlxuIiwKLSAgICAgICAgICAgICAgYXR0cl9uYW1lLmNfc3RyKCkpOwotICAgICAgcCArPSBhdHRyaWJ1dGVfbGVuZ3RoOwotICAgIH0KLSAgfQotfQotCi12b2lkIEhhc0F0dHJzOjpXcml0ZUF0dHJzKHUxIComcCkgewotICB1MSogcF9zaXplID0gcDsKLQotICBwdXRfdTJiZShwLCAwKTsKLSAgaW50IG5fd3JpdHRlbl9hdHRycyA9IDA7Ci0gIGZvciAoc2l6ZV90IGlpID0gMDsgaWkgPCBhdHRyaWJ1dGVzLnNpemUoKTsgaWkrKykgewotICAgIHUxKiBiZWZvcmUgPSBwOwotICAgIGF0dHJpYnV0ZXNbaWldLT5Xcml0ZShwKTsKLSAgICBpZiAocCAhPSBiZWZvcmUpIHsKLSAgICAgIG5fd3JpdHRlbl9hdHRycysrOwotICAgIH0KLSAgfQotCi0gIHB1dF91MmJlKHBfc2l6ZSwgbl93cml0dGVuX2F0dHJzKTsKLX0KLQotLy8gU2VlIHNlYy40LjQgb2YgSlZNIHNwZWMuCi1ib29sIENsYXNzRmlsZTo6UmVhZENvbnN0YW50UG9vbChjb25zdCB1MSAqJnApIHsKLQotICBjb25zdF9wb29sX2luLmNsZWFyKCk7Ci0gIGNvbnN0X3Bvb2xfaW4ucHVzaF9iYWNrKE5VTEwpOyAvLyBkdW1teSBmaXJzdCBpdGVtCi0KLSAgdTIgY3BfY291bnQgPSBnZXRfdTJiZShwKTsKLSAgZm9yIChpbnQgaWkgPSAxOyBpaSA8IGNwX2NvdW50OyArK2lpKSB7Ci0gICAgdTEgdGFnID0gZ2V0X3UxKHApOwotCi0gICAgaWYgKGRldnRvb2xzX2lqYXI6OnZlcmJvc2UpIHsKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiY3BbJWQvJWRdID0gdGFnICVkXG4iLCBpaSwgY3BfY291bnQsIHRhZyk7Ci0gICAgfQotCi0gICAgc3dpdGNoKHRhZykgewotICAgICAgY2FzZSBDT05TVEFOVF9DbGFzczogewotICAgICAgICB1MiBuYW1lX2luZGV4ID0gZ2V0X3UyYmUocCk7Ci0gICAgICAgIGNvbnN0X3Bvb2xfaW4ucHVzaF9iYWNrKG5ldyBDb25zdGFudF9DbGFzcyhuYW1lX2luZGV4KSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBDT05TVEFOVF9GaWVsZFJlZjoKLSAgICAgIGNhc2UgQ09OU1RBTlRfTWV0aG9kcmVmOgotICAgICAgY2FzZSBDT05TVEFOVF9JbnRlcmZhY2VtZXRob2RyZWY6IHsKLSAgICAgICAgdTIgY2xhc3NfaW5kZXggPSBnZXRfdTJiZShwKTsKLSAgICAgICAgdTIgbnRpID0gZ2V0X3UyYmUocCk7Ci0gICAgICAgIGNvbnN0X3Bvb2xfaW4ucHVzaF9iYWNrKG5ldyBDb25zdGFudF9GTUlyZWYodGFnLCBjbGFzc19pbmRleCwgbnRpKSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBDT05TVEFOVF9TdHJpbmc6IHsKLSAgICAgICAgdTIgc3RyaW5nX2luZGV4ID0gZ2V0X3UyYmUocCk7Ci0gICAgICAgIGNvbnN0X3Bvb2xfaW4ucHVzaF9iYWNrKG5ldyBDb25zdGFudF9TdHJpbmcoc3RyaW5nX2luZGV4KSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBDT05TVEFOVF9OYW1lQW5kVHlwZTogewotICAgICAgICB1MiBuYW1lX2luZGV4ID0gZ2V0X3UyYmUocCk7Ci0gICAgICAgIHUyIGRlc2NyaXB0b3JfaW5kZXggPSBnZXRfdTJiZShwKTsKLSAgICAgICAgY29uc3RfcG9vbF9pbi5wdXNoX2JhY2soCi0gICAgICAgICAgICBuZXcgQ29uc3RhbnRfTmFtZUFuZFR5cGUobmFtZV9pbmRleCwgZGVzY3JpcHRvcl9pbmRleCkpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgQ09OU1RBTlRfVXRmODogewotICAgICAgICB1MiBsZW5ndGggPSBnZXRfdTJiZShwKTsKLSAgICAgICAgaWYgKGRldnRvb2xzX2lqYXI6OnZlcmJvc2UpIHsKLSAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlV0Zjg6IFwiJXNcIiAoJWQpXG4iLAotICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcoKGNvbnN0IGNoYXIqKSBwLCBsZW5ndGgpLmNfc3RyKCksIGxlbmd0aCk7Ci0gICAgICAgIH0KLQotICAgICAgICBjb25zdF9wb29sX2luLnB1c2hfYmFjayhuZXcgQ29uc3RhbnRfVXRmOChsZW5ndGgsIHApKTsKLSAgICAgICAgcCArPSBsZW5ndGg7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBDT05TVEFOVF9JbnRlZ2VyOgotICAgICAgY2FzZSBDT05TVEFOVF9GbG9hdDogewotICAgICAgICB1NCBieXRlcyA9IGdldF91NGJlKHApOwotICAgICAgICBjb25zdF9wb29sX2luLnB1c2hfYmFjayhuZXcgQ29uc3RhbnRfSW50ZWdlck9yRmxvYXQodGFnLCBieXRlcykpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgQ09OU1RBTlRfTG9uZzoKLSAgICAgIGNhc2UgQ09OU1RBTlRfRG91YmxlOiB7Ci0gICAgICAgIHU0IGhpZ2hfYnl0ZXMgPSBnZXRfdTRiZShwKTsKLSAgICAgICAgdTQgbG93X2J5dGVzID0gZ2V0X3U0YmUocCk7Ci0gICAgICAgIGNvbnN0X3Bvb2xfaW4ucHVzaF9iYWNrKAotICAgICAgICAgICAgbmV3IENvbnN0YW50X0xvbmdPckRvdWJsZSh0YWcsIGhpZ2hfYnl0ZXMsIGxvd19ieXRlcykpOwotICAgICAgICAvLyBMb25ncyBhbmQgZG91YmxlcyBvY2N1cHkgdHdvIGNvbnN0YW50IHBvb2wgc2xvdHMuCi0gICAgICAgIC8vICgiSW4gcmV0cm9zcGVjdCwgbWFraW5nIDgtYnl0ZSBjb25zdGFudHMgdGFrZSB0d28gImNvbnN0YW50Ci0gICAgICAgIC8vIHBvb2wgZW50cmllcyB3YXMgYSBwb29yIGNob2ljZS4iIC0tSlZNIFNwZWMuKQotICAgICAgICBjb25zdF9wb29sX2luLnB1c2hfYmFjayhOVUxMKTsKLSAgICAgICAgaWkrKzsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIENPTlNUQU5UX01ldGhvZEhhbmRsZTogewotICAgICAgICB1MSByZWZlcmVuY2Vfa2luZCA9IGdldF91MShwKTsKLSAgICAgICAgdTIgcmVmZXJlbmNlX2luZGV4ID0gZ2V0X3UyYmUocCk7Ci0gICAgICAgIGNvbnN0X3Bvb2xfaW4ucHVzaF9iYWNrKAotICAgICAgICAgICAgbmV3IENvbnN0YW50X01ldGhvZEhhbmRsZShyZWZlcmVuY2Vfa2luZCwgcmVmZXJlbmNlX2luZGV4KSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBDT05TVEFOVF9NZXRob2RUeXBlOiB7Ci0gICAgICAgIHUyIGRlc2NyaXB0b3JfaW5kZXggPSBnZXRfdTJiZShwKTsKLSAgICAgICAgY29uc3RfcG9vbF9pbi5wdXNoX2JhY2sobmV3IENvbnN0YW50X01ldGhvZFR5cGUoZGVzY3JpcHRvcl9pbmRleCkpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgQ09OU1RBTlRfSW52b2tlRHluYW1pYzogewotICAgICAgICB1MiBib290c3RyYXBfbWV0aG9kX2F0dHIgPSBnZXRfdTJiZShwKTsKLSAgICAgICAgdTIgbmFtZV9uYW1lX3R5cGVfaW5kZXggPSBnZXRfdTJiZShwKTsKLSAgICAgICAgY29uc3RfcG9vbF9pbi5wdXNoX2JhY2sobmV3IENvbnN0YW50X0ludm9rZUR5bmFtaWMoCi0gICAgICAgICAgICBib290c3RyYXBfbWV0aG9kX2F0dHIsIG5hbWVfbmFtZV90eXBlX2luZGV4KSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgZGVmYXVsdDogewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlVua25vd24gY29uc3RhbnQ6ICUwMnguIFBhc3NpbmcgY2xhc3MgdGhyb3VnaC5cbiIsCi0gICAgICAgICAgICAgICAgdGFnKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vLyBBbm9ueW1vdXMgaW5uZXIgY2xhc3NlcyBhcmUgc3RyaXBwZWQgdG8gb3BhcXVlIGNsYXNzZXMgdGhhdCBvbmx5IGV4dGVuZAotLy8gT2JqZWN0LiBOb25lIG9mIHRoZWlyIG1ldGhvZHMgb3IgZmllbGRzIGFyZSBhY2Nlc3NpYmxlIGFueXdheS4KLXZvaWQgQ2xhc3NGaWxlOjpTdHJpcElmQW5vbnltb3VzKCkgewotICBpbnQgZW5jbG9zaW5nX2luZGV4ID0gLTE7Ci0gIGludCBpbm5lcl9jbGFzc2VzX2luZGV4ID0gLTE7Ci0KLSAgZm9yIChzaXplX3QgaWkgPSAwOyBpaSA8IGF0dHJpYnV0ZXMuc2l6ZSgpOyArK2lpKSB7Ci0gICAgaWYgKGF0dHJpYnV0ZXNbaWldLT5hdHRyaWJ1dGVfbmFtZV8tPkRpc3BsYXkoKSA9PSAiRW5jbG9zaW5nTWV0aG9kIikgewotICAgICAgZW5jbG9zaW5nX2luZGV4ID0gaWk7Ci0gICAgfSBlbHNlIGlmIChhdHRyaWJ1dGVzW2lpXS0+YXR0cmlidXRlX25hbWVfLT5EaXNwbGF5KCkgPT0gIklubmVyQ2xhc3NlcyIpIHsKLSAgICAgIGlubmVyX2NsYXNzZXNfaW5kZXggPSBpaTsKLSAgICB9Ci0gIH0KLQotICAvLyBQcmVzZW5jZSBvZiBhbiBFbmNsb3NpbmdNZXRob2QgYXR0cmlidXRlIGluZGljYXRlcyBhIGxvY2FsIG9yIGFub255bW91cwotICAvLyBjbGFzcywgd2hpY2ggY2FuIGJlIHN0cmlwcGVkLgotICBpZiAoZW5jbG9zaW5nX2luZGV4ID4gLTEpIHsKLSAgICAvLyBDbGVhciB0aGUgc2lnbmF0dXJlIHRvIG9ubHkgZXh0ZW5kIGphdmEubGFuZy5PYmplY3QuCi0gICAgc3VwZXJfY2xhc3MgPSBOVUxMOwotICAgIGludGVyZmFjZXMuY2xlYXIoKTsKLQotICAgIC8vIENsZWFyIGF3YXkgYWxsIGZpZWxkcyAoaW1wbGVtZW50YXRpb24gZGV0YWlscykuCi0gICAgZm9yIChzaXplX3QgaWkgPSAwOyBpaSA8IGZpZWxkcy5zaXplKCk7ICsraWkpIHsKLSAgICAgIGRlbGV0ZSBmaWVsZHNbaWldOwotICAgIH0KLSAgICBmaWVsZHMuY2xlYXIoKTsKLQotICAgIC8vIENsZWFyIGF3YXkgYWxsIG1ldGhvZHMgKGltcGxlbWVudGF0aW9uIGRldGFpbHMpLgotICAgIGZvciAoc2l6ZV90IGlpID0gMDsgaWkgPCBtZXRob2RzLnNpemUoKTsgKytpaSkgewotICAgICAgZGVsZXRlIG1ldGhvZHNbaWldOwotICAgIH0KLSAgICBtZXRob2RzLmNsZWFyKCk7Ci0KLSAgICAvLyBPbmx5IHByZXNlcnZlIHRoZSBJbm5lckNsYXNzZXMgYXR0cmlidXRlIHRvIGNvbXBseSB3aXRoIHRoZSBzcGVjLgotICAgIEF0dHJpYnV0ZSAqYXR0ciA9IE5VTEw7Ci0gICAgZm9yIChzaXplX3QgaWkgPSAwOyBpaSA8IGF0dHJpYnV0ZXMuc2l6ZSgpOyArK2lpKSB7Ci0gICAgICBpZiAoc3RhdGljX2Nhc3Q8aW50PihpaSkgIT0gaW5uZXJfY2xhc3Nlc19pbmRleCkgewotICAgICAgICBkZWxldGUgYXR0cmlidXRlc1tpaV07Ci0gICAgICB9IGVsc2UgewotICAgICAgICBhdHRyID0gYXR0cmlidXRlc1tpaV07Ci0gICAgICB9Ci0gICAgfQotICAgIGF0dHJpYnV0ZXMuY2xlYXIoKTsKLSAgICBpZiAoYXR0ciAhPSBOVUxMKSB7Ci0gICAgICBhdHRyaWJ1dGVzLnB1c2hfYmFjayhhdHRyKTsKLSAgICB9Ci0gIH0KLX0KLQotc3RhdGljIENsYXNzRmlsZSAqUmVhZENsYXNzKGNvbnN0IHZvaWQgKmNsYXNzZGF0YSwgc2l6ZV90IGxlbmd0aCkgewotICBjb25zdCB1MSAqcCA9ICh1MSopIGNsYXNzZGF0YTsKLQotICBDbGFzc0ZpbGUgKmNsYXp6ID0gbmV3IENsYXNzRmlsZTsKLQotICBjbGF6ei0+bGVuZ3RoID0gbGVuZ3RoOwotCi0gIGNsYXp6LT5tYWdpYyA9IGdldF91NGJlKHApOwotICBpZiAoY2xhenotPm1hZ2ljICE9IDB4Q0FGRUJBQkUpIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIkJhZCBtYWdpYyAlIiBQUkl4MzIgIlxuIiwgY2xhenotPm1hZ2ljKTsKLSAgICBhYm9ydCgpOwotICB9Ci0gIGNsYXp6LT5tYWpvciA9IGdldF91MmJlKHApOwotICBjbGF6ei0+bWlub3IgPSBnZXRfdTJiZShwKTsKLQotICBpZiAoIWNsYXp6LT5SZWFkQ29uc3RhbnRQb29sKHApKSB7Ci0gICAgZGVsZXRlIGNsYXp6OwotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgY2xhenotPmFjY2Vzc19mbGFncyA9IGdldF91MmJlKHApOwotICBjbGF6ei0+dGhpc19jbGFzcyA9IGNvbnN0YW50KGdldF91MmJlKHApKTsKLSAgY2xhc3NfbmFtZSA9IGNsYXp6LT50aGlzX2NsYXNzOwotCi0gIHUyIHN1cGVyX2NsYXNzX2lkID0gZ2V0X3UyYmUocCk7Ci0gIGNsYXp6LT5zdXBlcl9jbGFzcyA9IHN1cGVyX2NsYXNzX2lkID09IDAgPyBOVUxMIDogY29uc3RhbnQoc3VwZXJfY2xhc3NfaWQpOwotCi0gIHUyIGludGVyZmFjZXNfY291bnQgPSBnZXRfdTJiZShwKTsKLSAgZm9yIChpbnQgaWkgPSAwOyBpaSA8IGludGVyZmFjZXNfY291bnQ7ICsraWkpIHsKLSAgICBjbGF6ei0+aW50ZXJmYWNlcy5wdXNoX2JhY2soY29uc3RhbnQoZ2V0X3UyYmUocCkpKTsKLSAgfQotCi0gIHUyIGZpZWxkc19jb3VudCA9IGdldF91MmJlKHApOwotICBmb3IgKGludCBpaSA9IDA7IGlpIDwgZmllbGRzX2NvdW50OyArK2lpKSB7Ci0gICAgTWVtYmVyICpmaWVsZCA9IE1lbWJlcjo6UmVhZChwKTsKLQotICAgIGlmICghKGZpZWxkLT5hY2Nlc3NfZmxhZ3MgJiBBQ0NfUFJJVkFURSkpIHsgLy8gZHJvcCBwcml2YXRlIGZpZWxkcwotICAgICAgY2xhenotPmZpZWxkcy5wdXNoX2JhY2soZmllbGQpOwotICAgIH0KLSAgfQotCi0gIHUyIG1ldGhvZHNfY291bnQgPSBnZXRfdTJiZShwKTsKLSAgZm9yIChpbnQgaWkgPSAwOyBpaSA8IG1ldGhvZHNfY291bnQ7ICsraWkpIHsKLSAgICBNZW1iZXIgKm1ldGhvZCA9IE1lbWJlcjo6UmVhZChwKTsKLQotICAgIC8vIGRyb3AgY2xhc3MgaW5pdGlhbGl6ZXJzCi0gICAgaWYgKG1ldGhvZC0+bmFtZS0+RGlzcGxheSgpID09ICI8Y2xpbml0PiIpIGNvbnRpbnVlOwotCi0gICAgaWYgKCEobWV0aG9kLT5hY2Nlc3NfZmxhZ3MgJiBBQ0NfUFJJVkFURSkpIHsgLy8gZHJvcCBwcml2YXRlIG1ldGhvZHMKLSAgICAgIGNsYXp6LT5tZXRob2RzLnB1c2hfYmFjayhtZXRob2QpOwotICAgIH0KLSAgfQotCi0gIGNsYXp6LT5SZWFkQXR0cnMocCk7Ci0gIGNsYXp6LT5TdHJpcElmQW5vbnltb3VzKCk7Ci0KLSAgcmV0dXJuIGNsYXp6OwotfQotCi0vLyBJbiB0aGVvcnksICcvJyBpcyBhbHNvIHJlc2VydmVkLCBidXQgaXQncyBva2F5IGlmIHdlIGp1c3QgcGFyc2UgcGFja2FnZQotLy8gaWRlbnRpZmllcnMgYXMgcGFydCBvZiB0aGUgY2xhc3MgbmFtZS4gTm90ZSB0aGF0IHNpZ25hdHVyZXMgYXJlIFVURi04LCBidXQKLS8vIHRoaXMgd29ya3MganVzdCBhcyB3ZWxsIGFzIGluIHBsYWluIEFTQ0lJLgotc3RhdGljIGNvbnN0IGNoYXIgKlNJR05BVFVSRV9OT05fSURFTlRJRklFUl9DSEFSUyA9ICIuO1s8PjoiOwotCi12b2lkIEV4cGVjdChjb25zdCBzdGQ6OnN0cmluZyYgZGVzYywgc2l6ZV90KiBwLCBjaGFyIGV4cGVjdGVkKSB7Ci0gIGlmIChkZXNjWypwXSAhPSBleHBlY3RlZCkgewotICAgIGZwcmludGYoc3RkZXJyLCAiRXhwZWN0ZWQgJyVjJyBpbiAnJXMnIGF0ICV6ZCBpbiBzaWduYXR1cmVcbiIsCi0gICAgICAgICAgICBleHBlY3RlZCwgZGVzYy5zdWJzdHIoKnApLmNfc3RyKCksICpwKTsKLSAgICBleGl0KDEpOwotICB9Ci0KLSAgKnAgKz0gMTsKLX0KLQotLy8gVGhlc2UgZnVuY3Rpb25zIGZvcm0gYSBjcnVkZSByZWN1cnNpdmUgZGVzY2VudCBwYXJzZXIgZm9yIGRlc2NyaXB0b3JzIGFuZAotLy8gc2lnbmF0dXJlcyBpbiBjbGFzcyBmaWxlcyAoc2VlIEpWTSBzcGVjIDQuMykuCi0vLwotLy8gVGhpcyBwYXJzZXIgaXMgYSBiaXQgbW9yZSBsaWJlcmFsIHRoYW4gdGhlIHNwZWMsIGJ1dCB0aGlzIHNob3VsZCBiZSBmaW5lLAotLy8gYmVjYXVzZSBpdCBhY2NlcHRzIGFsbCB2YWxpZCBjbGFzcyBmaWxlcyBhbmQgY3JvYWtzIG9ubHkgb24gaW52YWxpZCBvbmVzLgotdm9pZCBQYXJzZUZyb21DbGFzc1R5cGVTaWduYXR1cmUoY29uc3Qgc3RkOjpzdHJpbmcmIGRlc2MsIHNpemVfdCogcCk7Ci12b2lkIFBhcnNlU2ltcGxlQ2xhc3NUeXBlU2lnbmF0dXJlKGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXNjLCBzaXplX3QqIHApOwotdm9pZCBQYXJzZUNsYXNzVHlwZVNpZ25hdHVyZVN1ZmZpeChjb25zdCBzdGQ6OnN0cmluZyYgZGVzYywgc2l6ZV90KiBwKTsKLXZvaWQgUGFyc2VJZGVudGlmaWVyKGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXNjLCBzaXplX3QqIHApOwotdm9pZCBQYXJzZVR5cGVBcmd1bWVudHNPcHQoY29uc3Qgc3RkOjpzdHJpbmcmIGRlc2MsIHNpemVfdCogcCk7Ci12b2lkIFBhcnNlTWV0aG9kRGVzY3JpcHRvcihjb25zdCBzdGQ6OnN0cmluZyYgZGVzYywgc2l6ZV90KiBwKTsKLQotdm9pZCBQYXJzZUNsYXNzVHlwZVNpZ25hdHVyZShjb25zdCBzdGQ6OnN0cmluZyYgZGVzYywgc2l6ZV90KiBwKSB7Ci0gIEV4cGVjdChkZXNjLCBwLCAnTCcpOwotICBQYXJzZVNpbXBsZUNsYXNzVHlwZVNpZ25hdHVyZShkZXNjLCBwKTsKLSAgUGFyc2VDbGFzc1R5cGVTaWduYXR1cmVTdWZmaXgoZGVzYywgcCk7Ci0gIEV4cGVjdChkZXNjLCBwLCAnOycpOwotfQotCi12b2lkIFBhcnNlU2ltcGxlQ2xhc3NUeXBlU2lnbmF0dXJlKGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXNjLCBzaXplX3QqIHApIHsKLSAgUGFyc2VJZGVudGlmaWVyKGRlc2MsIHApOwotICBQYXJzZVR5cGVBcmd1bWVudHNPcHQoZGVzYywgcCk7Ci19Ci0KLXZvaWQgUGFyc2VDbGFzc1R5cGVTaWduYXR1cmVTdWZmaXgoY29uc3Qgc3RkOjpzdHJpbmcmIGRlc2MsIHNpemVfdCogcCkgewotICB3aGlsZSAoZGVzY1sqcF0gPT0gJy4nKSB7Ci0gICAgKnAgKz0gMTsKLSAgICBQYXJzZVNpbXBsZUNsYXNzVHlwZVNpZ25hdHVyZShkZXNjLCBwKTsKLSAgfQotfQotCi12b2lkIFBhcnNlSWRlbnRpZmllcihjb25zdCBzdGQ6OnN0cmluZyYgZGVzYywgc2l6ZV90KiBwKSB7Ci0gIHNpemVfdCBuZXh0ID0gZGVzYy5maW5kX2ZpcnN0X29mKFNJR05BVFVSRV9OT05fSURFTlRJRklFUl9DSEFSUywgKnApOwotICBzdGQ6OnN0cmluZyBpZCA9IGRlc2Muc3Vic3RyKCpwLCBuZXh0IC0gKnApOwotICB1c2VkX2NsYXNzX25hbWVzLmluc2VydChpZCk7Ci0gICpwID0gbmV4dDsKLX0KLQotdm9pZCBQYXJzZVR5cGVBcmd1bWVudHNPcHQoY29uc3Qgc3RkOjpzdHJpbmcmIGRlc2MsIHNpemVfdCogcCkgewotICBpZiAoZGVzY1sqcF0gIT0gJzwnKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgKnAgKz0gMTsKLSAgd2hpbGUgKGRlc2NbKnBdICE9ICc+JykgewotICAgIHN3aXRjaCAoZGVzY1sqcF0pIHsKLSAgICAgIGNhc2UgJyonOgotICAgICAgICAqcCArPSAxOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSAnKyc6Ci0gICAgICBjYXNlICctJzoKLSAgICAgICAgKnAgKz0gMTsKLSAgICAgICAgRXh0cmFjdENsYXNzTmFtZXMoZGVzYywgcCk7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBkZWZhdWx0OgotICAgICAgICBFeHRyYWN0Q2xhc3NOYW1lcyhkZXNjLCBwKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0KLSAgKnAgKz0gMTsKLX0KLQotdm9pZCBQYXJzZU1ldGhvZERlc2NyaXB0b3IoY29uc3Qgc3RkOjpzdHJpbmcmIGRlc2MsIHNpemVfdCogcCkgewotICBFeHBlY3QoZGVzYywgcCwgJygnKTsKLSAgd2hpbGUgKGRlc2NbKnBdICE9ICcpJykgewotICAgIEV4dHJhY3RDbGFzc05hbWVzKGRlc2MsIHApOwotICB9Ci0KLSAgRXhwZWN0KGRlc2MsIHAsICcpJyk7Ci0gIEV4dHJhY3RDbGFzc05hbWVzKGRlc2MsIHApOwotfQotCi12b2lkIFBhcnNlRm9ybWFsVHlwZVBhcmFtZXRlcnMoY29uc3Qgc3RkOjpzdHJpbmcmIGRlc2MsIHNpemVfdCogcCkgewotICBFeHBlY3QoZGVzYywgcCwgJzwnKTsKLSAgd2hpbGUgKGRlc2NbKnBdICE9ICc+JykgewotICAgIFBhcnNlSWRlbnRpZmllcihkZXNjLCBwKTsKLSAgICBFeHBlY3QoZGVzYywgcCwgJzonKTsKLSAgICBpZiAoZGVzY1sqcF0gIT0gJzonICYmIGRlc2NbKnBdICE9ICc+JykgewotICAgICAgRXh0cmFjdENsYXNzTmFtZXMoZGVzYywgcCk7Ci0gICAgfQotCi0gICAgd2hpbGUgKGRlc2NbKnBdID09ICc6JykgewotICAgICAgRXhwZWN0KGRlc2MsIHAsICc6Jyk7Ci0gICAgICBFeHRyYWN0Q2xhc3NOYW1lcyhkZXNjLCBwKTsKLSAgICB9Ci0gIH0KLQotICBFeHBlY3QoZGVzYywgcCwgJz4nKTsKLX0KLQotdm9pZCBFeHRyYWN0Q2xhc3NOYW1lcyhjb25zdCBzdGQ6OnN0cmluZyYgZGVzYywgc2l6ZV90KiBwKSB7Ci0gIHN3aXRjaCAoZGVzY1sqcF0pIHsKLSAgICBjYXNlICc8JzoKLSAgICAgIFBhcnNlRm9ybWFsVHlwZVBhcmFtZXRlcnMoZGVzYywgcCk7Ci0gICAgICBFeHRyYWN0Q2xhc3NOYW1lcyhkZXNjLCBwKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnTCc6Ci0gICAgICBQYXJzZUNsYXNzVHlwZVNpZ25hdHVyZShkZXNjLCBwKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnWyc6Ci0gICAgICAqcCArPSAxOwotICAgICAgRXh0cmFjdENsYXNzTmFtZXMoZGVzYywgcCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ1QnOgotICAgICAgKnAgKz0gMTsKLSAgICAgIFBhcnNlSWRlbnRpZmllcihkZXNjLCBwKTsKLSAgICAgIEV4cGVjdChkZXNjLCBwLCAnOycpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICcoJzoKLSAgICAgIFBhcnNlTWV0aG9kRGVzY3JpcHRvcihkZXNjLCBwKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnQic6Ci0gICAgY2FzZSAnQyc6Ci0gICAgY2FzZSAnRCc6Ci0gICAgY2FzZSAnRic6Ci0gICAgY2FzZSAnSSc6Ci0gICAgY2FzZSAnSic6Ci0gICAgY2FzZSAnUyc6Ci0gICAgY2FzZSAnWic6Ci0gICAgY2FzZSAnVic6Ci0gICAgICAqcCArPSAxOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgZnByaW50ZihzdGRlcnIsICJJbnZhbGlkIHNpZ25hdHVyZSAlc1xuIiwgZGVzYy5zdWJzdHIoKnApLmNfc3RyKCkpOwotICB9Ci19Ci0KLXZvaWQgQ2xhc3NGaWxlOjpXcml0ZUNsYXNzKHUxIComcCkgewotICB1c2VkX2NsYXNzX25hbWVzLmNsZWFyKCk7Ci0gIHN0ZDo6dmVjdG9yPE1lbWJlciAqPiBtZW1iZXJzOwotICBtZW1iZXJzLmluc2VydChtZW1iZXJzLmVuZCgpLCBmaWVsZHMuYmVnaW4oKSwgZmllbGRzLmVuZCgpKTsKLSAgbWVtYmVycy5pbnNlcnQobWVtYmVycy5lbmQoKSwgbWV0aG9kcy5iZWdpbigpLCBtZXRob2RzLmVuZCgpKTsKLSAgRXh0cmFjdENsYXNzTmFtZXMoKTsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtZW1iZXJzLnNpemUoKTsgaSsrKSB7Ci0gICAgTWVtYmVyICptZW1iZXIgPSBtZW1iZXJzW2ldOwotICAgIHNpemVfdCBpZHggPSAwOwotICAgIGRldnRvb2xzX2lqYXI6OkV4dHJhY3RDbGFzc05hbWVzKG1lbWJlci0+ZGVzY3JpcHRvci0+RGlzcGxheSgpLCAmaWR4KTsKLSAgICBtZW1iZXItPkV4dHJhY3RDbGFzc05hbWVzKCk7Ci0gIH0KLQotICAvLyBXZSBoYXZlIHRvIHdyaXRlIHRoZSBib2R5IG91dCBiZWZvcmUgdGhlIGhlYWRlciBpbiBvcmRlciB0byByZWZlcmVuY2UKLSAgLy8gdGhlIGVzc2VudGlhbCBjb25zdGFudHMgYW5kIHBvcHVsYXRlIHRoZSBvdXRwdXQgY29uc3RhbnQgcG9vbDoKLSAgdTEgKmJvZHkgPSBuZXcgdTFbbGVuZ3RoXTsKLSAgdTEgKnEgPSBib2R5OwotICBXcml0ZUJvZHkocSk7IC8vIGFkdmFuY2VzIHEKLSAgdTQgYm9keV9sZW5ndGggPSBxIC0gYm9keTsKLQotICBXcml0ZUhlYWRlcihwKTsgLy8gYWR2YW5jZXMgcAotICBwdXRfbihwLCBib2R5LCBib2R5X2xlbmd0aCk7Ci0gIGRlbGV0ZVtdIGJvZHk7Ci19Ci0KLQotdm9pZCBTdHJpcENsYXNzKHUxIComY2xhc3NkYXRhX291dCwgY29uc3QgdTEgKmNsYXNzZGF0YV9pbiwgc2l6ZV90IGluX2xlbmd0aCkgewotICBDbGFzc0ZpbGUgKmNsYXp6ID0gUmVhZENsYXNzKGNsYXNzZGF0YV9pbiwgaW5fbGVuZ3RoKTsKLSAgaWYgKGNsYXp6ID09IE5VTEwpIHsKLSAgICAvLyBDbGFzcyBpcyBpbnZhbGlkLiBTaW1wbHkgY29weSBpdCB0byB0aGUgb3V0cHV0IGFuZCBjYWxsIGl0IGEgZGF5LgotICAgIHB1dF9uKGNsYXNzZGF0YV9vdXQsIGNsYXNzZGF0YV9pbiwgaW5fbGVuZ3RoKTsKLSAgfSBlbHNlIHsKLQotICAgIC8vIENvbnN0YW50IHBvb2wgaXRlbSB6ZXJvIGlzIGEgZHVtbXkgZW50cnkuICBTZXR0aW5nIGl0IG1hcmtzIHRoZQotICAgIC8vIGJlZ2lubmluZyBvZiB0aGUgb3V0cHV0IHBoYXNlOyBjYWxscyB0byBDb25zdGFudDo6c2xvdCgpIHdpbGwKLSAgICAvLyBmYWlsIGlmIGNhbGxlZCBwcmlvciB0byB0aGlzLgotICAgIGNvbnN0X3Bvb2xfb3V0LnB1c2hfYmFjayhOVUxMKTsKLSAgICBjbGF6ei0+V3JpdGVDbGFzcyhjbGFzc2RhdGFfb3V0KTsKLQotICAgIGRlbGV0ZSBjbGF6ejsKLSAgfQotCi0gIC8vIE5vdyBjbGVhbiB1cCBhbGwgdGhlIG1lc3Mgd2UgbGVmdCBiZWhpbmQuCi0KLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb25zdF9wb29sX2luLnNpemUoKTsgaSsrKSB7Ci0gICAgZGVsZXRlIGNvbnN0X3Bvb2xfaW5baV07Ci0gIH0KLQotICBjb25zdF9wb29sX2luLmNsZWFyKCk7Ci0gIGNvbnN0X3Bvb2xfb3V0LmNsZWFyKCk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBkZXZ0b29sc19pamFyCmRpZmYgLS1naXQgYS90b29scy9pamFyL2NvbW1vbi5oIGIvdG9vbHMvaWphci9jb21tb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE4MDQxYi4uMDAwMDAwMAotLS0gYS90b29scy9pamFyL2NvbW1vbi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDAxLDIwMDcgQWxhbiBEb25vdmFuLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8KLS8vIEF1dGhvcjogQWxhbiBEb25vdmFuIDxhZG9ub3ZhbkBnb29nbGUuY29tPgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLwotLy8gY29tbW9uLmggLS0gY29tbW9uIGRlZmluaXRpb25zLgotLy8KLQotI2lmbmRlZiBJTkNMVURFRF9ERVZUT09MU19JSkFSX0NPTU1PTl9ICi0jZGVmaW5lIElOQ0xVREVEX0RFVlRPT0xTX0lKQVJfQ09NTU9OX0gKLQotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi1uYW1lc3BhY2UgZGV2dG9vbHNfaWphciB7Ci0KLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIHU4OwotdHlwZWRlZiB1aW50MzJfdCB1NDsKLXR5cGVkZWYgdWludDE2X3QgdTI7Ci10eXBlZGVmIHVpbnQ4X3QgIHUxOwotCi0vLyBiZSA9IGJpZyBlbmRpYW4sIGxlID0gbGl0dGxlIGVuZGlhbgotCi1pbmxpbmUgdTEgZ2V0X3UxKGNvbnN0IHUxIComcCkgewotICAgIHJldHVybiAqcCsrOwotfQotCi1pbmxpbmUgdTIgZ2V0X3UyYmUoY29uc3QgdTEgKiZwKSB7Ci0gICAgdTQgeCA9IChwWzBdIDw8IDgpIHwgcFsxXTsKLSAgICBwICs9IDI7Ci0gICAgcmV0dXJuIHg7Ci19Ci0KLWlubGluZSB1MiBnZXRfdTJsZShjb25zdCB1MSAqJnApIHsKLSAgICB1NCB4ID0gKHBbMV0gPDwgOCkgfCBwWzBdOwotICAgIHAgKz0gMjsKLSAgICByZXR1cm4geDsKLX0KLQotaW5saW5lIHU0IGdldF91NGJlKGNvbnN0IHUxIComcCkgewotICAgIHU0IHggPSAocFswXSA8PCAyNCkgfCAocFsxXSA8PCAxNikgfCAocFsyXSA8PCA4KSB8IHBbM107Ci0gICAgcCArPSA0OwotICAgIHJldHVybiB4OwotfQotCi1pbmxpbmUgdTQgZ2V0X3U0bGUoY29uc3QgdTEgKiZwKSB7Ci0gICAgdTQgeCA9IChwWzNdIDw8IDI0KSB8IChwWzJdIDw8IDE2KSB8IChwWzFdIDw8IDgpIHwgcFswXTsKLSAgICBwICs9IDQ7Ci0gICAgcmV0dXJuIHg7Ci19Ci0KLWlubGluZSB2b2lkIHB1dF91MSh1MSAqJnAsIHUxIHgpIHsKLSAgICAqcCsrID0geDsKLX0KLQotaW5saW5lIHZvaWQgcHV0X3UyYmUodTEgKiZwLCB1MiB4KSB7Ci0gICAgKnArKyA9IHggPj4gODsKLSAgICAqcCsrID0geCAmIDB4ZmY7Ci19Ci0KLWlubGluZSB2b2lkIHB1dF91MmxlKHUxIComcCwgdTIgeCkgewotICAgICpwKysgPSB4ICYgMHhmZjsKLSAgICAqcCsrID0geCA+PiA4OzsKLX0KLQotaW5saW5lIHZvaWQgcHV0X3U0YmUodTEgKiZwLCB1NCB4KSB7Ci0gICAgKnArKyA9IHggPj4gMjQ7Ci0gICAgKnArKyA9ICh4ID4+IDE2KSAmIDB4ZmY7Ci0gICAgKnArKyA9ICh4ID4+IDgpICYgMHhmZjsKLSAgICAqcCsrID0geCAmIDB4ZmY7Ci19Ci0KLWlubGluZSB2b2lkIHB1dF91NGxlKHUxIComcCwgdTQgeCkgewotICAgICpwKysgPSB4ICYgMHhmZjsKLSAgICAqcCsrID0gKHggPj4gOCkgJiAweGZmOwotICAgICpwKysgPSAoeCA+PiAxNikgJiAweGZmOwotICAgICpwKysgPSB4ID4+IDI0OwotfQotCi0vLyBDb3B5IG4gYnl0ZXMgZnJvbSBzcmMgdG8gcCwgYW5kIGFkdmFuY2UgcC4KLWlubGluZSB2b2lkIHB1dF9uKHUxIComcCwgY29uc3QgdTEgKnNyYywgc2l6ZV90IG4pIHsKLSAgbWVtY3B5KHAsIHNyYywgbik7Ci0gIHAgKz0gbjsKLX0KLQotZXh0ZXJuIGJvb2wgdmVyYm9zZTsKLQotfSAgLy8gbmFtZXNwYWNlIGRldnRvb2xzX2lqYXIKLQotI2VuZGlmIC8vIElOQ0xVREVEX0RFVlRPT0xTX0lKQVJfQ09NTU9OX0gKZGlmZiAtLWdpdCBhL3Rvb2xzL2lqYXIvaWphci5jYyBiL3Rvb2xzL2lqYXIvaWphci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTkyNWI0OC4uMDAwMDAwMAotLS0gYS90b29scy9pamFyL2lqYXIuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxODIgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMDEsMjAwNyBBbGFuIERvbm92YW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLwotLy8gQXV0aG9yOiBBbGFuIERvbm92YW4gPGFkb25vdmFuQGdvb2dsZS5jb20+Ci0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vCi0vLyBpamFyLmNwcCAtLSAuamFyIC0+IF9pbnRlcmZhY2UuamFyIHRvb2wuCi0vLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxsaW1pdHMuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPG1lbW9yeT4KLQotI2luY2x1ZGUgInppcC5oIgotCi1uYW1lc3BhY2UgZGV2dG9vbHNfaWphciB7Ci0KLWJvb2wgdmVyYm9zZSA9IGZhbHNlOwotCi0vLyBSZWFkcyBhIEpWTSBjbGFzcyBmcm9tIGNsYXNzZGF0YV9pbiAob2YgdGhlIHNwZWNpZmllZCBsZW5ndGgpLCBhbmQKLS8vIHdyaXRlcyBvdXQgYSBzaW1wbGlmaWVkIGNsYXNzIHRvIGNsYXNzZGF0YV9vdXQsIGFkdmFuY2luZyB0aGUKLS8vIHBvaW50ZXIuCi12b2lkIFN0cmlwQ2xhc3ModTEgKiZjbGFzc2RhdGFfb3V0LCBjb25zdCB1MSAqY2xhc3NkYXRhX2luLCBzaXplX3QgaW5fbGVuZ3RoKTsKLQotY29uc3QgY2hhciogQ0xBU1NfRVhURU5TSU9OID0gIi5jbGFzcyI7Ci1jb25zdCBzaXplX3QgQ0xBU1NfRVhURU5TSU9OX0xFTkdUSCA9IHN0cmxlbihDTEFTU19FWFRFTlNJT04pOwotCi0vLyBaaXBFeHRyYWN0b3JQcm9jZXNzb3IgdGhhdCBzZWxlY3Qgb25seSAuY2xhc3MgZmlsZSBhbmQgdXNlCi0vLyBTdHJpcENsYXNzIHRvIGdlbmVyYXRlIGFuIGludGVyZmFjZSBjbGFzcywgc3RvcmluZyBhcyBhIG5ldyBmaWxlCi0vLyBpbiB0aGUgc3BlY2lmaWVkIFppcEJ1aWxkZXIuCi1jbGFzcyBKYXJTdHJpcHBlclByb2Nlc3NvciA6IHB1YmxpYyBaaXBFeHRyYWN0b3JQcm9jZXNzb3IgewotIHB1YmxpYzoKLSAgSmFyU3RyaXBwZXJQcm9jZXNzb3IoKSB7fQotICB2aXJ0dWFsIH5KYXJTdHJpcHBlclByb2Nlc3NvcigpIHt9Ci0KLSAgdmlydHVhbCB2b2lkIFByb2Nlc3MoY29uc3QgY2hhciogZmlsZW5hbWUsIGNvbnN0IHU0IGF0dHIsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHUxKiBkYXRhLCBjb25zdCBzaXplX3Qgc2l6ZSk7Ci0gIHZpcnR1YWwgYm9vbCBBY2NlcHQoY29uc3QgY2hhciogZmlsZW5hbWUsIGNvbnN0IHU0IGF0dHIpOwotCi0gcHJpdmF0ZToKLSAgLy8gTm90IG93bmVkIGJ5IEphclN0cmlwcGVyUHJvY2Vzc29yLCBzZWUgU2V0WmlwQnVpbGRlcigpLgotICBaaXBCdWlsZGVyKiBidWlsZGVyOwotCi0gcHVibGljOgotICAvLyBTZXQgdGhlIFppcEJ1aWxkZXIgdG8gYWRkIHRoZSBpamFyIGNsYXNzIHRvIHRoZSBvdXRwdXQgemlwIGZpbGUuCi0gIC8vIFRoaXMgcG9pbnRlciBzaG91bGQgbm90IGJlIGRlbGV0ZWQgd2hpbGUgdGhpcyBjbGFzcyBpcyBzdGlsbCBpbiB1c2UgYW5kCi0gIC8vIGl0IHNob3VsZCBiZSBzZXQgYmVmb3JlIGFueSBjYWxsIHRvIHRoZSBQcm9jZXNzKCkgbWV0aG9kLgotICB2b2lkIFNldFppcEJ1aWxkZXIoWmlwQnVpbGRlciogYnVpbGRlcikgewotICAgIHRoaXMtPmJ1aWxkZXIgPSBidWlsZGVyOwotICB9Ci19OwotCi1ib29sIEphclN0cmlwcGVyUHJvY2Vzc29yOjpBY2NlcHQoY29uc3QgY2hhciogZmlsZW5hbWUsIGNvbnN0IHU0KSB7Ci0gIHNzaXplX3Qgb2Zmc2V0ID0gc3RybGVuKGZpbGVuYW1lKSAtIENMQVNTX0VYVEVOU0lPTl9MRU5HVEg7Ci0gIGlmIChvZmZzZXQgPj0gMCkgewotICAgIHJldHVybiBzdHJjbXAoZmlsZW5hbWUgKyBvZmZzZXQsIENMQVNTX0VYVEVOU0lPTikgPT0gMDsKLSAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLXZvaWQgSmFyU3RyaXBwZXJQcm9jZXNzb3I6OlByb2Nlc3MoY29uc3QgY2hhciogZmlsZW5hbWUsIGNvbnN0IHU0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1MSogZGF0YSwgY29uc3Qgc2l6ZV90IHNpemUpIHsKLSAgaWYgKHZlcmJvc2UpIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIklORk86IFN0cmlwQ2xhc3M6ICVzXG4iLCBmaWxlbmFtZSk7Ci0gIH0KLSAgdTEgKnEgPSBidWlsZGVyLT5OZXdGaWxlKGZpbGVuYW1lLCAwKTsKLSAgdTEgKmNsYXNzZGF0YV9vdXQgPSBxOwotICBTdHJpcENsYXNzKHEsIGRhdGEsIHNpemUpOyAgLy8gYWN0dWFsbHkgcHJvY2VzcyBpdAotICBzaXplX3Qgb3V0X2xlbmd0aCA9IHEgLSBjbGFzc2RhdGFfb3V0OwotICBidWlsZGVyLT5GaW5pc2hGaWxlKG91dF9sZW5ndGgpOwotfQotCi0vLyBPcGVucyAiZmlsZV9pbiIgKGEgLmphciBmaWxlKSBmb3IgcmVhZGluZywgYW5kIHdyaXRlcyBhbiBpbnRlcmZhY2UKLS8vIC5qYXIgdG8gImZpbGVfb3V0Ii4KLXZvaWQgT3BlbkZpbGVzQW5kUHJvY2Vzc0phcihjb25zdCBjaGFyICpmaWxlX291dCwgY29uc3QgY2hhciAqZmlsZV9pbikgewotICBKYXJTdHJpcHBlclByb2Nlc3NvciBwcm9jZXNzb3I7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxaaXBFeHRyYWN0b3I+IGluKFppcEV4dHJhY3Rvcjo6Q3JlYXRlKGZpbGVfaW4sICZwcm9jZXNzb3IpKTsKLSAgaWYgKGluLmdldCgpID09IE5VTEwpIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIlVuYWJsZSB0byBvcGVuIFppcCBmaWxlICVzOiAlc1xuIiwgZmlsZV9pbiwKLSAgICAgICAgICAgIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgYWJvcnQoKTsKLSAgfQotICB1OCBvdXRwdXRfbGVuZ3RoID0gaW4tPkNhbGN1bGF0ZU91dHB1dExlbmd0aCgpOwotICBzdGQ6OnVuaXF1ZV9wdHI8WmlwQnVpbGRlcj4gb3V0KFppcEJ1aWxkZXI6OkNyZWF0ZShmaWxlX291dCwgb3V0cHV0X2xlbmd0aCkpOwotICBpZiAob3V0LmdldCgpID09IE5VTEwpIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIlVuYWJsZSB0byBvcGVuIG91dHB1dCBmaWxlICVzOiAlc1xuIiwgZmlsZV9vdXQsCi0gICAgICAgICAgICBzdHJlcnJvcihlcnJubykpOwotICAgIGFib3J0KCk7Ci0gIH0KLSAgcHJvY2Vzc29yLlNldFppcEJ1aWxkZXIob3V0LmdldCgpKTsKLQotICAvLyBQcm9jZXNzIGFsbCBmaWxlcyBpbiB0aGUgemlwCi0gIGlmIChpbi0+UHJvY2Vzc0FsbCgpIDwgMCkgewotICAgIGZwcmludGYoc3RkZXJyLCAiJXNcbiIsIGluLT5HZXRFcnJvcigpKTsKLSAgICBhYm9ydCgpOwotICB9Ci0KLSAgLy8gQWRkIGR1bW15IGZpbGUsIHNpbmNlIGphdmFjIGRvZXNuJ3QgbGlrZSB0cnVseSBlbXB0eSBqYXJzLgotICBpZiAob3V0LT5HZXROdW1iZXJGaWxlcygpID09IDApIHsKLSAgICBvdXQtPldyaXRlRW1wdHlGaWxlKCJkdW1teSIpOwotICB9Ci0gIC8vIEZpbmlzaCB3cml0aW5nIHRoZSBvdXRwdXQgZmlsZQotICBpZiAob3V0LT5GaW5pc2goKSA8IDApIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIiVzXG4iLCBvdXQtPkdldEVycm9yKCkpOwotICAgIGFib3J0KCk7Ci0gIH0KLSAgLy8gR2V0IGFsbCBmaWxlIHNpemUKLSAgc2l6ZV90IGluX2xlbmd0aCA9IGluLT5HZXRTaXplKCk7Ci0gIHNpemVfdCBvdXRfbGVuZ3RoID0gb3V0LT5HZXRTaXplKCk7Ci0gIGlmICh2ZXJib3NlKSB7Ci0gICAgZnByaW50ZihzdGRlcnIsICJJTkZPOiBwcm9kdWNlZCBpbnRlcmZhY2UgamFyOiAlcyAtPiAlcyAoJWQlJSkuXG4iLAotICAgICAgICAgICAgZmlsZV9pbiwgZmlsZV9vdXQsCi0gICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KDEwMC4wICogb3V0X2xlbmd0aCAvIGluX2xlbmd0aCkpOwotICB9Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBkZXZ0b29sc19pamFyCi0KLS8vCi0vLyBtYWluIG1ldGhvZAotLy8KLXN0YXRpYyB2b2lkIHVzYWdlKCkgewotICBmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiBpamFyIFstdl0geC5qYXIgW3hfaW50ZXJmYWNlLmphcj5dXG4iKTsKLSAgZnByaW50ZihzdGRlcnIsICJDcmVhdGVzIGFuIGludGVyZmFjZSBqYXIgZnJvbSB0aGUgc3BlY2lmaWVkIGphciBmaWxlLlxuIik7Ci0gIGV4aXQoMSk7Ci19Ci0KLWludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgewotICBjb25zdCBjaGFyICpmaWxlbmFtZV9pbiA9IE5VTEw7Ci0gIGNvbnN0IGNoYXIgKmZpbGVuYW1lX291dCA9IE5VTEw7Ci0KLSAgZm9yIChpbnQgaWkgPSAxOyBpaSA8IGFyZ2M7ICsraWkpIHsKLSAgICBpZiAoc3RyY21wKGFyZ3ZbaWldLCAiLXYiKSA9PSAwKSB7Ci0gICAgICBkZXZ0b29sc19pamFyOjp2ZXJib3NlID0gdHJ1ZTsKLSAgICB9IGVsc2UgaWYgKGZpbGVuYW1lX2luID09IE5VTEwpIHsKLSAgICAgIGZpbGVuYW1lX2luID0gYXJndltpaV07Ci0gICAgfSBlbHNlIGlmIChmaWxlbmFtZV9vdXQgPT0gTlVMTCkgewotICAgICAgZmlsZW5hbWVfb3V0ID0gYXJndltpaV07Ci0gICAgfSBlbHNlIHsKLSAgICAgIHVzYWdlKCk7Ci0gICAgfQotICB9Ci0KLSAgaWYgKGZpbGVuYW1lX2luID09IE5VTEwpIHsKLSAgICB1c2FnZSgpOwotICB9Ci0KLSAgLy8gR3Vlc3Mgb3V0cHV0IGZpbGVuYW1lIGZyb20gaW5wdXQ6Ci0gIGNoYXIgZmlsZW5hbWVfb3V0X2J1ZltQQVRIX01BWF07Ci0gIGlmIChmaWxlbmFtZV9vdXQgPT0gTlVMTCkgewotICAgIHNpemVfdCBsZW4gPSBzdHJsZW4oZmlsZW5hbWVfaW4pOwotICAgIGlmIChsZW4gPiA0ICYmIHN0cm5jbXAoZmlsZW5hbWVfaW4gKyBsZW4gLSA0LCAiLmphciIsIDQpID09IDApIHsKLSAgICAgIHN0cmNweShmaWxlbmFtZV9vdXRfYnVmLCBmaWxlbmFtZV9pbik7Ci0gICAgICBzdHJjcHkoZmlsZW5hbWVfb3V0X2J1ZiArIGxlbiAtIDQsICItaW50ZXJmYWNlLmphciIpOwotICAgICAgZmlsZW5hbWVfb3V0ID0gZmlsZW5hbWVfb3V0X2J1ZjsKLSAgICB9IGVsc2UgewotICAgICAgZnByaW50ZihzdGRlcnIsICJDYW4ndCBkZXRlcm1pbmUgb3V0cHV0IGZpbGVuYW1lIHNpbmNlIGlucHV0IGZpbGVuYW1lICIKLSAgICAgICAgICAgICAgImRvZXNuJ3QgZW5kIHdpdGggJy5qYXInLlxuIik7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0gIH0KLQotICBpZiAoZGV2dG9vbHNfaWphcjo6dmVyYm9zZSkgewotICAgIGZwcmludGYoc3RkZXJyLCAiSU5GTzogd3JpdGluZyB0byAnJXMnLlxuIiwgZmlsZW5hbWVfb3V0KTsKLSAgfQotCi0gIGRldnRvb2xzX2lqYXI6Ok9wZW5GaWxlc0FuZFByb2Nlc3NKYXIoZmlsZW5hbWVfb3V0LCBmaWxlbmFtZV9pbik7Ci0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvaWphci96aXAuY2MgYi90b29scy9pamFyL3ppcC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2FhMDZkYi4uMDAwMDAwMAotLS0gYS90b29scy9pamFyL3ppcC5jYworKysgL2Rldi9udWxsCkBAIC0xLDEwMzIgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMDcgQWxhbiBEb25vdmFuLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8KLS8vIEF1dGhvcjogQWxhbiBEb25vdmFuIDxhZG9ub3ZhbkBnb29nbGUuY29tPgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLwotLy8gemlwLmNjIC0tIC56aXAgKC5qYXIpIGZpbGUgcmVhZGluZy93cml0aW5nIHJvdXRpbmVzLgotLy8KLQotLy8gU2VlIFJFQURNRS50eHQgZm9yIGRldGFpbHMuCi0vLwotLy8gU2VlIGh0dHA6Ly93d3cucGt3YXJlLmNvbS9kb2N1bWVudHMvY2FzZXN0dWRpZXMvQVBQTk9URS5UWFQKLS8vIGZvciBkZWZpbml0aW9uIG9mIFBLWklQIGZpbGUgZm9ybWF0LgotCi0jZGVmaW5lIF9GSUxFX09GRlNFVF9CSVRTIDY0ICAvLyBTdXBwb3J0IHppcCBmaWxlcyBsYXJnZXIgdGhhbiAyR0IKLQotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN5cy9tbWFuLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8bGltaXRzLmg+Ci0jaW5jbHVkZSA8bGltaXRzPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgInppcC5oIgotI2luY2x1ZGUgPHpsaWIuaD4KLQotI2RlZmluZSBMT0NBTF9GSUxFX0hFQURFUl9TSUdOQVRVUkUgICAgICAgICAgIDB4MDQwMzRiNTAKLSNkZWZpbmUgQ0VOVFJBTF9GSUxFX0hFQURFUl9TSUdOQVRVUkUgICAgICAgICAweDAyMDE0YjUwCi0jZGVmaW5lIEVORF9PRl9DRU5UUkFMX0RJUl9TSUdOQVRVUkUgICAgICAgICAgMHgwNjA1NGI1MAotI2RlZmluZSBEQVRBX0RFU0NSSVBUT1JfU0lHTkFUVVJFICAgICAgICAgICAgIDB4MDgwNzRiNTAKLQotLy8gdmVyc2lvbiB0byBleHRyYWN0OiAxLjAgLSBkZWZhdWx0IHZhbHVlIGZyb20gQVBQTk9URS5UWFQuCi0vLyBPdXRwdXQgSkFSIGZpbGVzIGNvbnRhaW4gbm8gZXh0cmEgWklQIGZlYXR1cmVzLCBzbyB0aGlzIGlzIGVub3VnaC4KLSNkZWZpbmUgWklQX1ZFUlNJT05fVE9fRVhUUkFDVCAgICAgICAgICAgICAgICAxMAotI2RlZmluZSBDT01QUkVTU0lPTl9NRVRIT0RfU1RPUkVEICAgICAgICAgICAgIDAgICAvLyBubyBjb21wcmVzc2lvbgotI2RlZmluZSBDT01QUkVTU0lPTl9NRVRIT0RfREVGTEFURUQgICAgICAgICAgIDgKLQotI2RlZmluZSBHRU5FUkFMX1BVUlBPU0VfQklUX0ZMQUdfQ09NUFJFU1NFRCAoMSA8PCAzKQotI2RlZmluZSBHRU5FUkFMX1BVUlBPU0VfQklUX0ZMQUdfVVRGOF9FTkNPREVEICgxIDw8IDExKQotI2RlZmluZSBHRU5FUkFMX1BVUlBPU0VfQklUX0ZMQUdfQ09NUFJFU1NJT05fU1BFRUQgKCgxIDw8IDIpIHwgKDEgPDwgMSkpCi0jZGVmaW5lIEdFTkVSQUxfUFVSUE9TRV9CSVRfRkxBR19TVVBQT1JURUQgXAotICAoR0VORVJBTF9QVVJQT1NFX0JJVF9GTEFHX0NPTVBSRVNTRUQgXAotICB8IEdFTkVSQUxfUFVSUE9TRV9CSVRfRkxBR19VVEY4X0VOQ09ERUQgXAotICB8IEdFTkVSQUxfUFVSUE9TRV9CSVRfRkxBR19DT01QUkVTU0lPTl9TUEVFRCkKLQotbmFtZXNwYWNlIGRldnRvb2xzX2lqYXIgewotLy8gSW4gdGhlIGFic2VuY2Ugb2YgWklQNjQgc3VwcG9ydCwgemlwIGZpbGVzIGFyZSBsaW1pdGVkIHRvIDRHQi4KLS8vIGh0dHA6Ly93d3cuaW5mby16aXAub3JnL0ZBUS5odG1sI2xpbWl0cwotc3RhdGljIGNvbnN0IHU4IGtNYXhpbXVtT3V0cHV0U2l6ZSA9IHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDMyX3Q+OjptYXgoKTsKLQotc3RhdGljIGJvb2wgUHJvY2Vzc0NlbnRyYWxEaXJFbnRyeShjb25zdCB1MSAqJnAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqY29tcHJlc3NlZF9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKnVuY29tcHJlc3NlZF9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpmaWxlbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGZpbGVuYW1lX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU0ICphdHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1NCAqb2Zmc2V0KTsKLQotLy8KLS8vIEEgY2xhc3MgcmVwcmVzZW50aW5nIGEgWmlwRmlsZSBmb3IgcmVhZGluZy4gSXRzIHB1YmxpYyBBUEkgaXMgZXhwb3NlZAotLy8gdXNpbmcgdGhlIFppcEV4dHJhY3RvciBhYnN0cmFjdCBjbGFzcy4KLS8vCi1jbGFzcyBJbnB1dFppcEZpbGUgOiBwdWJsaWMgWmlwRXh0cmFjdG9yIHsKLSBwdWJsaWM6Ci0gIElucHV0WmlwRmlsZShaaXBFeHRyYWN0b3JQcm9jZXNzb3IgKnByb2Nlc3NvciwgaW50IGZkLCBvZmZfdCBpbl9sZW5ndGgsCi0gICAgICAgICAgICAgICBvZmZfdCBpbl9vZmZzZXQsIGNvbnN0IHUxKiB6aXBkYXRhX2luLCBjb25zdCB1MSogY2VudHJhbF9kaXIpOwotICB2aXJ0dWFsIH5JbnB1dFppcEZpbGUoKTsKLQotICB2aXJ0dWFsIGNvbnN0IGNoYXIqIEdldEVycm9yKCkgewotICAgIGlmIChlcnJtc2dbMF0gPT0gMCkgewotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHJldHVybiBlcnJtc2c7Ci0gIH0KLQotICB2aXJ0dWFsIGJvb2wgUHJvY2Vzc05leHQoKTsKLSAgdmlydHVhbCB2b2lkIFJlc2V0KCk7Ci0gIHZpcnR1YWwgc2l6ZV90IEdldFNpemUoKSB7Ci0gICAgcmV0dXJuIGluX2xlbmd0aF87Ci0gIH0KLQotICB2aXJ0dWFsIHU4IENhbGN1bGF0ZU91dHB1dExlbmd0aCgpOwotCi0gcHJpdmF0ZToKLSAgWmlwRXh0cmFjdG9yUHJvY2Vzc29yICpwcm9jZXNzb3I7Ci0KLSAgaW50IGZkX2luOyAgLy8gSW5wdXQgZmlsZSBkZXNjcmlwb3IKLQotICAvLyBJbnB1dFppcEZpbGUgaXMgcmVzcG9uc2libGUgZm9yIG1haW50YWluaW5nIHRoZSBmb2xsb3dpbmcKLSAgLy8gcG9pbnRlcnMuIFRoZXkgYXJlIGFsbG9jYXRlZCBieSB0aGUgQ3JlYXRlKCkgbWV0aG9kIGJlZm9yZQotICAvLyB0aGUgb2JqZWN0IGlzIGFjdHVhbGx5IGNyZWF0ZWQgdXNpbmcgbW1hcC4KLSAgY29uc3QgdTEgKiBjb25zdCB6aXBkYXRhX2luXzsgICAvLyBzdGFydCBvZiBpbnB1dCBmaWxlIG1tYXAKLSAgY29uc3QgdTEgKiB6aXBkYXRhX2luX21hcHBlZF87ICAvLyBzdGFydCBvZiBzdGlsbCBtYXBwZWQgcmVnaW9uCi0gIGNvbnN0IHUxICogY29uc3QgY2VudHJhbF9kaXJfOyAgLy8gY2VudHJhbCBkaXJlY3RvcnkgaW4gaW5wdXQgZmlsZQotCi0gIHNpemVfdCBpbl9sZW5ndGhfOyAgLy8gc2l6ZSBvZiB0aGUgaW5wdXQgZmlsZQotICBzaXplX3QgaW5fb2Zmc2V0XzsgIC8vIG9mZnNldCAgdGhlIGlucHV0IGZpbGUKLQotICBjb25zdCB1MSAqcDsgIC8vIGlucHV0IGN1cnNvcgotCi0gIGNvbnN0IHUxKiBjZW50cmFsX2Rpcl9jdXJyZW50XzsgIC8vIGNlbnRyYWwgZGlyIGlucHV0IGN1cnNvcgotCi0gIC8vIEJ1ZmZlciBzaXplIGlzIGluaXRpYWxseSBJTklUSUFMX0JVRkZFUl9TSVpFLiBJdCBkb3VibGVzIGluIHNpemUgZXZlcnkKLSAgLy8gdGltZSBpdCBpcyBmb3VuZCB0b28gc21hbGwsIHVudGlsIGl0IHJlYWNoZXMgTUFYX0JVRkZFUl9TSVpFLiBJZiB0aGF0IGlzCi0gIC8vIG5vdCBlbm91Z2gsIHdlIGJhaWwgb3V0LiBXZSBvbmx5IGRlY29tcHJlc3MgY2xhc3MgZmlsZXMsIHNvIHRoZXkgc2hvdWxkCi0gIC8vIGJlIHNtYWxsZXIgdGhhbiA2NEsgYW55d2F5LCBidXQgd2UgZ2l2ZSBhIGxpdHRsZSBsZWV3YXkuCi0gIC8vIE1BWF9CVUZGRVJfU0laRSBtdXN0IGJlIGJpZ2dlciB0aGFuIHRoZSBzaXplIG9mIHRoZSBiaWdnZXN0IGZpbGUgaW4gdGhlCi0gIC8vIFpJUC4gSXQgaXMgc2V0IHRvIDEyOE0gaGVyZSBzbyB3ZSBjYW4gdW5jb21wcmVzcyB0aGUgQmF6ZWwgc2VydmVyIHdpdGgKLSAgLy8gdGhpcyBsaWJyYXJ5LgotICBzdGF0aWMgY29uc3Qgc2l6ZV90IElOSVRJQUxfQlVGRkVSX1NJWkUgPSAyNTYgKiAxMDI0OyAgLy8gMjU2SwotICBzdGF0aWMgY29uc3Qgc2l6ZV90IE1BWF9CVUZGRVJfU0laRSA9IDEyOCAqIDEwMjQgKiAxMDI0OwotICBzdGF0aWMgY29uc3Qgc2l6ZV90IE1BWF9NQVBQRURfUkVHSU9OID0gMzIgKiAxMDI0ICogMTAyNDsKLQotICAvLyBUaGVzZSBtZXRhZGF0YSBmaWVsZHMgYXJlIHRoZSBmaWVsZHMgb2YgdGhlIFpJUCBoZWFkZXIgb2YgdGhlIGZpbGUgYmVpbmcKLSAgLy8gcHJvY2Vzc2VkLgotICB1MiBleHRyYWN0X3ZlcnNpb25fOwotICB1MiBnZW5lcmFsX3B1cnBvc2VfYml0X2ZsYWdfOwotICB1MiBjb21wcmVzc2lvbl9tZXRob2RfOwotICB1NCB1bmNvbXByZXNzZWRfc2l6ZV87Ci0gIHU0IGNvbXByZXNzZWRfc2l6ZV87Ci0gIHUyIGZpbGVfbmFtZV9sZW5ndGhfOwotICB1MiBleHRyYV9maWVsZF9sZW5ndGhfOwotICBjb25zdCB1MSAqZmlsZV9uYW1lXzsKLSAgY29uc3QgdTEgKmV4dHJhX2ZpZWxkXzsKLQotICAvLyBBZG1pbmlzdHJhdGlvbiBvZiBtZW1vcnkgcmVzZXJ2ZWQgZm9yIGRlY29tcHJlc3NlZCBkYXRhLiBXZSB1c2UgdGhlIHNhbWUKLSAgLy8gYnVmZmVyIGZvciBlYWNoIGZpbGUgdG8gYXZvaWQgc29tZSBtYWxsb2MoKS9mcmVlKCkgY2FsbHMgYW5kIGZyZWUgdGhlCi0gIC8vIG1lbW9yeSBvbmx5IGluIHRoZSBkdG9yLiBDLXN0eWxlIG1lbW9yeSBtYW5hZ2VtZW50IGlzIHVzZWQgc28gdGhhdCB3ZQotICAvLyBjYW4gY2FsbCByZWFsbG9jLgotICB1MSAqdW5jb21wcmVzc2VkX2RhdGFfOwotICBzaXplX3QgdW5jb21wcmVzc2VkX2RhdGFfYWxsb2NhdGVkXzsKLQotICAvLyBDb3B5IG9mIHRoZSBsYXN0IGZpbGVuYW1lIGVudHJ5IC0gTnVsbC10ZXJtaW5hdGVkLgotICBjaGFyIGZpbGVuYW1lW1BBVEhfTUFYXTsKLSAgLy8gVGhlIGV4dGVybmFsIGZpbGUgYXR0cmlidXRlIGZpZWxkCi0gIHU0IGF0dHI7Ci0KLSAgLy8gbGFzdCBlcnJvcgotICBjaGFyIGVycm1zZ1s0KlBBVEhfTUFYXTsKLQotICBpbnQgZXJyb3IoY29uc3QgY2hhciAqZm10LCAuLi4pIHsKLSAgICB2YV9saXN0IGFwOwotICAgIHZhX3N0YXJ0KGFwLCBmbXQpOwotICAgIHZzbnByaW50ZihlcnJtc2csIDQqUEFUSF9NQVgsIGZtdCwgYXApOwotICAgIHZhX2VuZChhcCk7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0KLSAgLy8gQ2hlY2sgdGhhdCBhdCBsZWFzdCBuIGJ5dGVzIHJlbWFpbiBpbiB0aGUgaW5wdXQgZmlsZSwgb3RoZXJ3aXNlCi0gIC8vIGFib3J0IHdpdGggYW4gZXJyb3IgbWVzc2FnZS4gICJzdGF0ZSIgaXMgdGhlIG5hbWUgb2YgdGhlIGZpZWxkCi0gIC8vIHdlJ3JlIGFib3V0IHRvIHJlYWQsIGZvciBkaWFnbm9zdGljcy4KLSAgaW50IEVuc3VyZVJlbWFpbmluZyhzaXplX3QgbiwgY29uc3QgY2hhciAqc3RhdGUpIHsKLSAgICBzaXplX3QgaW5fb2Zmc2V0ID0gcCAtIHppcGRhdGFfaW5fOwotICAgIHNpemVfdCByZW1haW5pbmcgPSBpbl9sZW5ndGhfIC0gaW5fb2Zmc2V0OwotICAgIGlmIChuID4gcmVtYWluaW5nKSB7Ci0gICAgICByZXR1cm4gZXJyb3IoIlByZW1hdHVyZSBlbmQgb2YgZmlsZSAoYXQgb2Zmc2V0ICV6ZCwgc3RhdGU9JXMpOyAiCi0gICAgICAgICAgICAgICAgICAgImV4cGVjdGVkICV6ZCBtb3JlIGJ5dGVzIGJ1dCBmb3VuZCAlemQuXG4iLAotICAgICAgICAgICAgICAgICAgIGluX29mZnNldCwgc3RhdGUsIG4sIHJlbWFpbmluZyk7Ci0gICAgfQotICAgIHJldHVybiAwOwotICB9Ci0KLSAgLy8gUmVhZCBvbmUgZW50cnkgZnJvbSBpbnB1dCB6aXAgZmlsZQotICBpbnQgUHJvY2Vzc0xvY2FsRmlsZUVudHJ5KHNpemVfdCBjb21wcmVzc2VkX3NpemUsIHNpemVfdCB1bmNvbXByZXNzZWRfc2l6ZSk7Ci0KLSAgLy8gVW5jb21wcmVzcyBhIGZpbGUgZnJvbSB0aGUgYXJjaGl2ZSB1c2luZyB6bGliLiBUaGUgcG9pbnRlciByZXR1cm5lZAotICAvLyBpcyBvd25lZCBieSBJbnB1dFppcEZpbGUsIHNvIGl0IG11c3Qgbm90IGJlIGZyZWVkLiBBZHZhbmNlcyB0aGUgaW5wdXQKLSAgLy8gY3Vyc29yIHRvIHRoZSBmaXJzdCBieXRlIGFmdGVyIHRoZSBjb21wcmVzc2VkIGRhdGEuCi0gIHUxKiBVbmNvbXByZXNzRmlsZSgpOwotCi0gIC8vIFNraXAgYSBmaWxlCi0gIGludCBTa2lwRmlsZShjb25zdCBib29sIGNvbXByZXNzZWQpOwotCi0gIC8vIFByb2Nlc3MgYSBmaWxlCi0gIGludCBQcm9jZXNzRmlsZShjb25zdCBib29sIGNvbXByZXNzZWQpOwotfTsKLQotLy8KLS8vIEEgY2xhc3MgaW1wbGVtZW50aW5nIFppcEJ1aWxkZXIgdGhhdCByZXByZXNlbnQgYW4gb3BlbiB6aXAgZmlsZSBmb3Igd3JpdGluZy4KLS8vCi1jbGFzcyBPdXRwdXRaaXBGaWxlIDogcHVibGljIFppcEJ1aWxkZXIgewotIHB1YmxpYzoKLSAgT3V0cHV0WmlwRmlsZShpbnQgZmQsIHUxICogY29uc3QgemlwZGF0YV9vdXQpIDoKLSAgICAgIGZkX291dChmZCksCi0gICAgICB6aXBkYXRhX291dF8oemlwZGF0YV9vdXQpLAotICAgICAgcSh6aXBkYXRhX291dCkgewotICAgIGVycm1zZ1swXSA9IDA7Ci0gIH0KLQotICB2aXJ0dWFsIGNvbnN0IGNoYXIqIEdldEVycm9yKCkgewotICAgIGlmIChlcnJtc2dbMF0gPT0gMCkgewotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHJldHVybiBlcnJtc2c7Ci0gIH0KLQotICB2aXJ0dWFsIH5PdXRwdXRaaXBGaWxlKCkgeyBGaW5pc2goKTsgfQotICB2aXJ0dWFsIHUxKiBOZXdGaWxlKGNvbnN0IGNoYXIqIGZpbGVuYW1lLCBjb25zdCB1NCBhdHRyKTsKLSAgdmlydHVhbCBpbnQgRmluaXNoRmlsZShzaXplX3QgZmlsZWxlbmd0aCwgYm9vbCBjb21wcmVzcyA9IGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgY29tcHV0ZV9jcmMgPSBmYWxzZSk7Ci0gIHZpcnR1YWwgaW50IFdyaXRlRW1wdHlGaWxlKGNvbnN0IGNoYXIgKmZpbGVuYW1lKTsKLSAgdmlydHVhbCBzaXplX3QgR2V0U2l6ZSgpIHsKLSAgICByZXR1cm4gT2Zmc2V0KHEpOwotICB9Ci0gIHZpcnR1YWwgaW50IEdldE51bWJlckZpbGVzKCkgewotICAgIHJldHVybiBlbnRyaWVzXy5zaXplKCk7Ci0gIH0KLSAgdmlydHVhbCBpbnQgRmluaXNoKCk7Ci0KLSBwcml2YXRlOgotICBzdHJ1Y3QgTG9jYWxGaWxlRW50cnkgewotICAgIC8vIFN0YXJ0IG9mIHRoZSBsb2NhbCBoZWFkZXIgKGluIHRoZSBvdXRwdXQgYnVmZmVyKS4KLSAgICBzaXplX3QgbG9jYWxfaGVhZGVyX29mZnNldDsKLQotICAgIC8vIFNpemVzIG9mIHRoZSBmaWxlIGVudHJ5Ci0gICAgc2l6ZV90IHVuY29tcHJlc3NlZF9sZW5ndGg7Ci0gICAgc2l6ZV90IGNvbXByZXNzZWRfbGVuZ3RoOwotCi0gICAgLy8gQ29tcHJlc3Npb24gbWV0aG9kCi0gICAgdTIgY29tcHJlc3Npb25fbWV0aG9kOwotCi0gICAgLy8gQ1JDMzIKLSAgICB1NCBjcmMzMjsKLQotICAgIC8vIGV4dGVybmFsIGF0dHJpYnV0ZXMgZmllbGQKLSAgICB1NCBleHRlcm5hbF9hdHRyOwotCi0gICAgLy8gU3RhcnQvbGVuZ3RoIG9mIHRoZSBmaWxlX25hbWUgaW4gdGhlIGxvY2FsIGhlYWRlci4KLSAgICB1MSAqZmlsZV9uYW1lOwotICAgIHUyIGZpbGVfbmFtZV9sZW5ndGg7Ci0KLSAgICAvLyBTdGFydC9sZW5ndGggb2YgdGhlIGV4dHJhX2ZpZWxkIGluIHRoZSBsb2NhbCBoZWFkZXIuCi0gICAgY29uc3QgdTEgKmV4dHJhX2ZpZWxkOwotICAgIHUyIGV4dHJhX2ZpZWxkX2xlbmd0aDsKLSAgfTsKLQotICBpbnQgZmRfb3V0OyAgLy8gZmlsZSBkZXNjcmlwdG9yIGZvciB0aGUgb3V0cHV0IGZpbGUKLQotICAvLyBPdXRwdXRaaXBGaWxlIGlzIHJlc3BvbnNpYmxlIGZvciBtYWludGFpbmluZyB0aGUgZm9sbG93aW5nCi0gIC8vIHBvaW50ZXJzLiBUaGV5IGFyZSBhbGxvY2F0ZWQgYnkgdGhlIENyZWF0ZSgpIG1ldGhvZCBiZWZvcmUKLSAgLy8gdGhlIG9iamVjdCBpcyBhY3R1YWxseSBjcmVhdGVkIHVzaW5nIG1tYXAuCi0gIHUxICogY29uc3QgemlwZGF0YV9vdXRfOyAgICAgICAgLy8gc3RhcnQgb2Ygb3V0cHV0IGZpbGUgbW1hcAotICB1MSAqcTsgIC8vIG91dHB1dCBjdXJzb3IKLQotICB1MSAqaGVhZGVyX3B0cjsgIC8vIEN1cnJlbnQgcG9pbnRlciB0byAiY29tcHJlc3Npb24gbWV0aG9kIiBlbnRyeS4KLQotICAvLyBMaXN0IG9mIGVudHJpZXMgdG8gd3JpdGUgdGhlIGNlbnRyYWwgZGlyZWN0b3J5Ci0gIHN0ZDo6dmVjdG9yPExvY2FsRmlsZUVudHJ5Kj4gZW50cmllc187Ci0KLSAgLy8gbGFzdCBlcnJvcgotICBjaGFyIGVycm1zZ1s0KlBBVEhfTUFYXTsKLQotICBpbnQgZXJyb3IoY29uc3QgY2hhciAqZm10LCAuLi4pIHsKLSAgICB2YV9saXN0IGFwOwotICAgIHZhX3N0YXJ0KGFwLCBmbXQpOwotICAgIHZzbnByaW50ZihlcnJtc2csIDQqUEFUSF9NQVgsIGZtdCwgYXApOwotICAgIHZhX2VuZChhcCk7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0KLSAgLy8gV3JpdGUgdGhlIFpJUCBjZW50cmFsIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgZm9yIGVhY2ggbG9jYWwgZmlsZQotICAvLyBlbnRyeSBpbiAiZW50cmllcyIuCi0gIHZvaWQgV3JpdGVDZW50cmFsRGlyZWN0b3J5KCk7Ci0KLSAgLy8gUmV0dXJucyB0aGUgb2Zmc2V0IG9mIHRoZSBwb2ludGVyIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0aGUKLSAgLy8gb3V0cHV0IHppcCBmaWxlLgotICBzaXplX3QgT2Zmc2V0KGNvbnN0IHUxICpjb25zdCB4KSB7Ci0gICAgcmV0dXJuIHggLSB6aXBkYXRhX291dF87Ci0gIH0KLQotICAvLyBXcml0ZSBaSVAgZmlsZSBoZWFkZXIgaW4gdGhlIG91dHB1dC4gU2luY2UgdGhlIGNvbXByZXNzZWQgc2l6ZSBpcyBub3QKLSAgLy8ga25vd24gaW4gYWR2YW5jZSwgaXQgbXVzdCBiZSByZWNvcmRlZCBsYXRlci4gVGhpcyBtZXRob2QgcmV0dXJucyBhIHBvaW50ZXIKLSAgLy8gdG8gImNvbXByZXNzZWQgc2l6ZSIgaW4gdGhlIGZpbGUgaGVhZGVyIHRoYXQgc2hvdWxkIGJlIHBhc3NlZCB0bwotICAvLyBXcml0ZUZpbGVTaXplSW5Mb2NhbEZpbGVIZWFkZXIoKSBsYXRlci4KLSAgdTEqIFdyaXRlTG9jYWxGaWxlSGVhZGVyKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBjb25zdCB1NCBhdHRyKTsKLQotICAvLyBGaWxsIGluIHRoZSAiY29tcHJlc3NlZCBzaXplIiBhbmQgInVuY29tcHJlc3NlZCBzaXplIiBmaWVsZHMgaW4gYSBsb2NhbAotICAvLyBmaWxlIGhlYWRlciBwcmV2aW91c2x5IHdyaXR0ZW4gYnkgV3JpdGVMb2NhbEZpbGVIZWFkZXIoKS4KLSAgc2l6ZV90IFdyaXRlRmlsZVNpemVJbkxvY2FsRmlsZUhlYWRlcih1MSAqaGVhZGVyX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgb3V0X2xlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGNvbXByZXNzID0gZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdTQgY3JjID0gMCk7Ci19OwotCi0vLwotLy8gSW1wbGVtZW50YXRpb24gb2YgSW5wdXRaaXBGaWxlCi0vLwotYm9vbCBJbnB1dFppcEZpbGU6OlByb2Nlc3NOZXh0KCkgewotICAvLyBQcm9jZXNzIHRoZSBuZXh0IGVudHJ5IGluIHRoZSBjZW50cmFsIGRpcmVjdG9yeS4gQWxzbyBtYWtlIHN1cmUgdGhhdCB0aGUKLSAgLy8gY29udGVudCBwb2ludGVyIGlzIGluIHN5bmMuCi0gIHNpemVfdCBjb21wcmVzc2VkLCB1bmNvbXByZXNzZWQ7Ci0gIHU0IG9mZnNldDsKLSAgaWYgKCFQcm9jZXNzQ2VudHJhbERpckVudHJ5KGNlbnRyYWxfZGlyX2N1cnJlbnRfLCAmY29tcHJlc3NlZCwgJnVuY29tcHJlc3NlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lLCBQQVRIX01BWCwgJmF0dHIsICZvZmZzZXQpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLy8gVGhlcmUgbWlnaHQgYmUgYW4gb2Zmc2V0IHNwZWNpZmllZCBpbiB0aGUgY2VudHJhbCBkaXJlY3RvcnkgdGhhdCBkb2VzCi0gIC8vIG5vdCBtYXRjaCB0aGUgZmlsZSBvZmZzZXQsIGlmIHNvLCBjb3JyZWN0IHRoZSBwb2ludGVyLgotICBpZiAob2Zmc2V0ICE9IDAgJiYgKHAgIT0gKHppcGRhdGFfaW5fICsgaW5fb2Zmc2V0XyArIG9mZnNldCkpKSB7Ci0gICAgcCA9IHppcGRhdGFfaW5fICsgb2Zmc2V0OwotICB9Ci0KLSAgaWYgKEVuc3VyZVJlbWFpbmluZyg0LCAic2lnbmF0dXJlIikgPCAwKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHU0IHNpZ25hdHVyZSA9IGdldF91NGxlKHApOwotICBpZiAoc2lnbmF0dXJlID09IExPQ0FMX0ZJTEVfSEVBREVSX1NJR05BVFVSRSkgewotICAgIGlmIChQcm9jZXNzTG9jYWxGaWxlRW50cnkoY29tcHJlc3NlZCwgdW5jb21wcmVzc2VkKSA8IDApIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgZXJyb3IoImxvY2FsIGZpbGUgaGVhZGVyIHNpZ25hdHVyZSBmb3IgZmlsZSAlcyBub3QgZm91bmRcbiIsIGZpbGVuYW1lKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotaW50IElucHV0WmlwRmlsZTo6UHJvY2Vzc0xvY2FsRmlsZUVudHJ5KAotICAgIHNpemVfdCBjb21wcmVzc2VkX3NpemUsIHNpemVfdCB1bmNvbXByZXNzZWRfc2l6ZSkgewotICBpZiAoRW5zdXJlUmVtYWluaW5nKDI2LCAiZXh0cmFjdF92ZXJzaW9uIikgPCAwKSB7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0gIGV4dHJhY3RfdmVyc2lvbl8gPSBnZXRfdTJsZShwKTsKLSAgZ2VuZXJhbF9wdXJwb3NlX2JpdF9mbGFnXyA9IGdldF91MmxlKHApOwotCi0gIGlmICgoZ2VuZXJhbF9wdXJwb3NlX2JpdF9mbGFnXyAmIH5HRU5FUkFMX1BVUlBPU0VfQklUX0ZMQUdfU1VQUE9SVEVEKSAhPSAwKSB7Ci0gICAgcmV0dXJuIGVycm9yKCJVbnN1cHBvcnRlZCB2YWx1ZSAoMHglMDR4KSBpbiBnZW5lcmFsIHB1cnBvc2UgYml0IGZsYWcuXG4iLAotICAgICAgICAgICAgICAgICBnZW5lcmFsX3B1cnBvc2VfYml0X2ZsYWdfKTsKLSAgfQotCi0gIGNvbXByZXNzaW9uX21ldGhvZF8gPSBnZXRfdTJsZShwKTsKLQotICBpZiAoY29tcHJlc3Npb25fbWV0aG9kXyAhPSBDT01QUkVTU0lPTl9NRVRIT0RfREVGTEFURUQgJiYKLSAgICAgIGNvbXByZXNzaW9uX21ldGhvZF8gIT0gQ09NUFJFU1NJT05fTUVUSE9EX1NUT1JFRCkgewotICAgIHJldHVybiBlcnJvcigiVW5zdXBwb3J0ZWQgY29tcHJlc3Npb24gbWV0aG9kICglZCkuXG4iLAotICAgICAgICAgICAgICAgICBjb21wcmVzc2lvbl9tZXRob2RfKTsKLSAgfQotCi0gIC8vIHNraXAgb3ZlcjogbGFzdF9tb2RfZmlsZV90aW1lLCBsYXN0X21vZF9maWxlX2RhdGUsIGNyYzMyCi0gIHAgKz0gMiArIDIgKyA0OwotICBjb21wcmVzc2VkX3NpemVfID0gZ2V0X3U0bGUocCk7Ci0gIHVuY29tcHJlc3NlZF9zaXplXyA9IGdldF91NGxlKHApOwotICBmaWxlX25hbWVfbGVuZ3RoXyA9IGdldF91MmxlKHApOwotICBleHRyYV9maWVsZF9sZW5ndGhfID0gZ2V0X3UybGUocCk7Ci0KLSAgaWYgKEVuc3VyZVJlbWFpbmluZyhmaWxlX25hbWVfbGVuZ3RoXywgImZpbGVfbmFtZSIpIDwgMCkgewotICAgIHJldHVybiAtMTsKLSAgfQotICBmaWxlX25hbWVfID0gcDsKLSAgcCArPSBmaWxlX25hbWVfbGVuZ3RoXzsKLQotICBpZiAoRW5zdXJlUmVtYWluaW5nKGV4dHJhX2ZpZWxkX2xlbmd0aF8sICJleHRyYV9maWVsZCIpIDwgMCkgewotICAgIHJldHVybiAtMTsKLSAgfQotICBleHRyYV9maWVsZF8gPSBwOwotICBwICs9IGV4dHJhX2ZpZWxkX2xlbmd0aF87Ci0KLSAgYm9vbCBpc19jb21wcmVzc2VkID0gY29tcHJlc3Npb25fbWV0aG9kXyA9PSBDT01QUkVTU0lPTl9NRVRIT0RfREVGTEFURUQ7Ci0KLSAgLy8gSWYgdGhlIHppcCBpcyBjb21wcmVzc2VkLCBjb21wcmVzc2VkIGFuZCB1bmNvbXByZXNzZWQgc2l6ZSBtZW1iZXJzIGFyZQotICAvLyB6ZXJvIGluIHRoZSBsb2NhbCBmaWxlIGhlYWRlci4gSWYgbm90LCBjaGVjayB0aGF0IHRoZXkgYXJlIHRoZSBzYW1lIGFzIHRoZQotICAvLyBsZW5ndGhzIGZyb20gdGhlIGNlbnRyYWwgZGlyZWN0b3J5LCBvdGhlcndpc2UsIGp1c3QgYmVsaWV2ZSB0aGUgY2VudHJhbAotICAvLyBkaXJlY3RvcnkKLSAgaWYgKGNvbXByZXNzZWRfc2l6ZV8gPT0gMCkgewotICAgIGNvbXByZXNzZWRfc2l6ZV8gPSBjb21wcmVzc2VkX3NpemU7Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKGNvbXByZXNzZWRfc2l6ZV8gIT0gY29tcHJlc3NlZF9zaXplKSB7Ci0gICAgICByZXR1cm4gZXJyb3IoImNlbnRyYWwgZGlyZWN0b3J5IGFuZCBmaWxlIGhlYWRlciBpbmNvbnNpc3RlbnRcbiIpOwotICAgIH0KLSAgfQotCi0gIGlmICh1bmNvbXByZXNzZWRfc2l6ZV8gPT0gMCkgewotICAgIHVuY29tcHJlc3NlZF9zaXplXyA9IHVuY29tcHJlc3NlZF9zaXplOwotICB9IGVsc2UgewotICAgIGlmICh1bmNvbXByZXNzZWRfc2l6ZV8gIT0gdW5jb21wcmVzc2VkX3NpemUpIHsKLSAgICAgIHJldHVybiBlcnJvcigiY2VudHJhbCBkaXJlY3RvcnkgYW5kIGZpbGUgaGVhZGVyIGluY29uc2lzdGVudFxuIik7Ci0gICAgfQotICB9Ci0KLSAgaWYgKHByb2Nlc3Nvci0+QWNjZXB0KGZpbGVuYW1lLCBhdHRyKSkgewotICAgIGlmIChQcm9jZXNzRmlsZShpc19jb21wcmVzc2VkKSA8IDApIHsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKFNraXBGaWxlKGlzX2NvbXByZXNzZWQpIDwgMCkgewotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgfQotCi0gIGlmIChnZW5lcmFsX3B1cnBvc2VfYml0X2ZsYWdfICYgR0VORVJBTF9QVVJQT1NFX0JJVF9GTEFHX0NPTVBSRVNTRUQpIHsKLSAgICAvLyBTa2lwIHRoZSBkYXRhIGRlc2NyaXB0b3IuIFNvbWUgaW1wbGVtZW50YXRpb25zIGRvIG5vdCBwdXQgdGhlIHNpZ25hdHVyZQotICAgIC8vIGhlcmUsIHNvIGNoZWNrIGlmIHRoZSBuZXh0IDQgYnl0ZXMgYXJlIGEgc2lnbmF0dXJlLCBhbmQgaWYgc28sIHNraXAgdGhlCi0gICAgLy8gbmV4dCAxMiBieXRlcyAoZm9yIENSQywgY29tcHJlc3NlZC91bmNvbXByZXNzZWQgc2l6ZSksIG90aGVyd2lzZSBza2lwCi0gICAgLy8gdGhlIG5leHQgOCBieXRlcyAoYmVjYXVzZSB0aGUgdmFsdWUganVzdCByZWFkIHdhcyB0aGUgQ1JDKS4KLSAgICB1NCBzaWduYXR1cmUgPSBnZXRfdTRsZShwKTsKLSAgICBpZiAoc2lnbmF0dXJlID09IERBVEFfREVTQ1JJUFRPUl9TSUdOQVRVUkUpIHsKLSAgICAgIHAgKz0gNCAqIDM7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHAgKz0gNCAqIDI7Ci0gICAgfQotICB9Ci0KLSAgaWYgKHAgPiB6aXBkYXRhX2luX21hcHBlZF8gKyBNQVhfTUFQUEVEX1JFR0lPTikgewotICAgIG11bm1hcChjb25zdF9jYXN0PHUxICo+KHppcGRhdGFfaW5fbWFwcGVkXyksIE1BWF9NQVBQRURfUkVHSU9OKTsKLSAgICB6aXBkYXRhX2luX21hcHBlZF8gKz0gTUFYX01BUFBFRF9SRUdJT047Ci0gIH0KLQotICByZXR1cm4gMDsKLX0KLQotaW50IElucHV0WmlwRmlsZTo6U2tpcEZpbGUoY29uc3QgYm9vbCBjb21wcmVzc2VkKSB7Ci0gIGlmICghY29tcHJlc3NlZCkgewotICAgIC8vIEluIHRoaXMgY2FzZSwgY29tcHJlc3NlZF9zaXplXyA9PSB1bmNvbXByZXNzZWRfc2l6ZV8gKHNpbmNlIHRoZSBmaWxlIGlzCi0gICAgLy8gdW5jb21wcmVzc2VkKSwgc28gd2UgY2FuIHVzZSBlaXRoZXIuCi0gICAgaWYgKGNvbXByZXNzZWRfc2l6ZV8gIT0gdW5jb21wcmVzc2VkX3NpemVfKSB7Ci0gICAgICByZXR1cm4gZXJyb3IoImNvbXByZXNzZWQgc2l6ZSAhPSB1bmNvbXByZXNzZWQgc2l6ZSwgYWx0aG91Z2ggdGhlIGZpbGUgIgotICAgICAgICAgICAgICAgICAgICJpcyB1bmNvbXByZXNzZWQuXG4iKTsKLSAgICB9Ci0gIH0KLQotICBpZiAoRW5zdXJlUmVtYWluaW5nKGNvbXByZXNzZWRfc2l6ZV8sICJmaWxlX2RhdGEiKSA8IDApIHsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLSAgcCArPSBjb21wcmVzc2VkX3NpemVfOwotICByZXR1cm4gMDsKLX0KLQotdTEqIElucHV0WmlwRmlsZTo6VW5jb21wcmVzc0ZpbGUoKSB7Ci0gIHNpemVfdCBpbl9vZmZzZXQgPSBwIC0gemlwZGF0YV9pbl87Ci0gIHNpemVfdCByZW1haW5pbmcgPSBpbl9sZW5ndGhfIC0gaW5fb2Zmc2V0OwotICB6X3N0cmVhbSBzdHJlYW07Ci0KLSAgc3RyZWFtLnphbGxvYyA9IFpfTlVMTDsKLSAgc3RyZWFtLnpmcmVlID0gWl9OVUxMOwotICBzdHJlYW0ub3BhcXVlID0gWl9OVUxMOwotICBzdHJlYW0uYXZhaWxfaW4gPSByZW1haW5pbmc7Ci0gIHN0cmVhbS5uZXh0X2luID0gKEJ5dGVmICopIHA7Ci0KLSAgaW50IHJldCA9IGluZmxhdGVJbml0Migmc3RyZWFtLCAtTUFYX1dCSVRTKTsKLSAgaWYgKHJldCAhPSBaX09LKSB7Ci0gICAgZXJyb3IoImluZmxhdGVJbml0OiAlZFxuIiwgcmV0KTsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIGludCB1bmNvbXByZXNzZWRfdW50aWxfbm93ID0gMDsKLQotICB3aGlsZSAodHJ1ZSkgewotICAgIHN0cmVhbS5hdmFpbF9vdXQgPSB1bmNvbXByZXNzZWRfZGF0YV9hbGxvY2F0ZWRfIC0gdW5jb21wcmVzc2VkX3VudGlsX25vdzsKLSAgICBzdHJlYW0ubmV4dF9vdXQgPSB1bmNvbXByZXNzZWRfZGF0YV8gKyB1bmNvbXByZXNzZWRfdW50aWxfbm93OwotICAgIGludCBvbGRfYXZhaWxfb3V0ID0gc3RyZWFtLmF2YWlsX291dDsKLQotICAgIHJldCA9IGluZmxhdGUoJnN0cmVhbSwgWl9TWU5DX0ZMVVNIKTsKLSAgICBpbnQgdW5jb21wcmVzc2VkX25vdyA9IG9sZF9hdmFpbF9vdXQgLSBzdHJlYW0uYXZhaWxfb3V0OwotICAgIHVuY29tcHJlc3NlZF91bnRpbF9ub3cgKz0gdW5jb21wcmVzc2VkX25vdzsKLQotICAgIHN3aXRjaCAocmV0KSB7Ci0gICAgICBjYXNlIFpfU1RSRUFNX0VORDogewotICAgICAgICAvLyB6bGliIHNhaWQgdGhhdCB0aGVyZSBpcyBubyBtb3JlIGRhdGEgdG8gZGVjb21wcmVzcy4KLQotICAgICAgICB1MSAqbmV3X3AgPSByZWludGVycHJldF9jYXN0PHUxKj4oc3RyZWFtLm5leHRfaW4pOwotICAgICAgICBjb21wcmVzc2VkX3NpemVfID0gbmV3X3AgLSBwOwotICAgICAgICB1bmNvbXByZXNzZWRfc2l6ZV8gPSB1bmNvbXByZXNzZWRfdW50aWxfbm93OwotICAgICAgICBwID0gbmV3X3A7Ci0gICAgICAgIGluZmxhdGVFbmQoJnN0cmVhbSk7Ci0gICAgICAgIHJldHVybiB1bmNvbXByZXNzZWRfZGF0YV87Ci0gICAgICB9Ci0KLSAgICAgIGNhc2UgWl9PSzogewotICAgICAgICAvLyB6bGliIHNhaWQgdGhhdCB0aGVyZSBpcyBubyBtb3JlIHJvb20gaW4gdGhlIGJ1ZmZlciBhbGxvY2F0ZWQgZm9yCi0gICAgICAgIC8vIHRoZSBkZWNvbXByZXNzZWQgZGF0YS4gRW5sYXJnZSB0aGF0IGJ1ZmZlciBhbmQgdHJ5IGFnYWluLgotCi0gICAgICAgIGlmICh1bmNvbXByZXNzZWRfZGF0YV9hbGxvY2F0ZWRfID09IE1BWF9CVUZGRVJfU0laRSkgewotICAgICAgICAgIGVycm9yKCJpamFyIGRvZXMgbm90IHN1cHBvcnQgZGVjb21wcmVzc2luZyBmaWxlcyAiCi0gICAgICAgICAgICAgICAgImxhcmdlciB0aGFuICVkTUIuXG4iLAotICAgICAgICAgICAgICAgIChpbnQpIChNQVhfQlVGRkVSX1NJWkUvKDEwMjQqMTAyNCkpKTsKLSAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgIHVuY29tcHJlc3NlZF9kYXRhX2FsbG9jYXRlZF8gKj0gMjsKLSAgICAgICAgaWYgKHVuY29tcHJlc3NlZF9kYXRhX2FsbG9jYXRlZF8gPiBNQVhfQlVGRkVSX1NJWkUpIHsKLSAgICAgICAgICB1bmNvbXByZXNzZWRfZGF0YV9hbGxvY2F0ZWRfID0gTUFYX0JVRkZFUl9TSVpFOwotICAgICAgICB9Ci0KLSAgICAgICAgdW5jb21wcmVzc2VkX2RhdGFfID0gcmVpbnRlcnByZXRfY2FzdDx1MSo+KAotICAgICAgICAgICAgcmVhbGxvYyh1bmNvbXByZXNzZWRfZGF0YV8sIHVuY29tcHJlc3NlZF9kYXRhX2FsbG9jYXRlZF8pKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGNhc2UgWl9EQVRBX0VSUk9SOgotICAgICAgY2FzZSBaX0JVRl9FUlJPUjoKLSAgICAgIGNhc2UgWl9TVFJFQU1fRVJST1I6Ci0gICAgICBjYXNlIFpfTkVFRF9ESUNUOgotICAgICAgZGVmYXVsdDogewotICAgICAgICBlcnJvcigiemxpYiByZXR1cm5lZCBlcnJvciBjb2RlICVkIGR1cmluZyBpbmZsYXRlLlxuIiwgcmV0KTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19Ci0KLWludCBJbnB1dFppcEZpbGU6OlByb2Nlc3NGaWxlKGNvbnN0IGJvb2wgY29tcHJlc3NlZCkgewotICBjb25zdCB1MSAqZmlsZV9kYXRhOwotICBpZiAoY29tcHJlc3NlZCkgewotICAgIGZpbGVfZGF0YSA9IFVuY29tcHJlc3NGaWxlKCk7Ci0gICAgaWYgKGZpbGVfZGF0YSA9PSBOVUxMKSB7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotICB9IGVsc2UgewotICAgIC8vIEluIHRoaXMgY2FzZSwgY29tcHJlc3NlZF9zaXplXyA9PSB1bmNvbXByZXNzZWRfc2l6ZV8gKHNpbmNlIHRoZSBmaWxlIGlzCi0gICAgLy8gdW5jb21wcmVzc2VkKSwgc28gd2UgY2FuIHVzZSBlaXRoZXIuCi0gICAgaWYgKGNvbXByZXNzZWRfc2l6ZV8gIT0gdW5jb21wcmVzc2VkX3NpemVfKSB7Ci0gICAgICByZXR1cm4gZXJyb3IoImNvbXByZXNzZWQgc2l6ZSAhPSB1bmNvbXByZXNzZWQgc2l6ZSwgYWx0aG91Z2ggdGhlIGZpbGUgIgotICAgICAgICAgICAgICAgICAgICJpcyB1bmNvbXByZXNzZWQuXG4iKTsKLSAgICB9Ci0KLSAgICBpZiAoRW5zdXJlUmVtYWluaW5nKGNvbXByZXNzZWRfc2l6ZV8sICJmaWxlX2RhdGEiKSA8IDApIHsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgZmlsZV9kYXRhID0gcDsKLSAgICBwICs9IGNvbXByZXNzZWRfc2l6ZV87Ci0gIH0KLSAgcHJvY2Vzc29yLT5Qcm9jZXNzKGZpbGVuYW1lLCBhdHRyLCBmaWxlX2RhdGEsIHVuY29tcHJlc3NlZF9zaXplXyk7Ci0gIHJldHVybiAwOwotfQotCi0KLS8vIFJlYWRzIGFuZCByZXR1cm5zIHNvbWUgbWV0YWRhdGEgb2YgdGhlIG5leHQgZmlsZSBmcm9tIHRoZSBjZW50cmFsIGRpcmVjdG9yeToKLS8vIC0gY29tcHJlc3NlZCBzaXplCi0vLyAtIHVuY29tcHJlc3NlZCBzaXplCi0vLyAtIHdoZXRoZXIgdGhlIGVudHJ5IGlzIGEgY2xhc3MgZmlsZSAodG8gYmUgaW5jbHVkZWQgaW4gdGhlIG91dHB1dCkuCi0vLyBQcmVjb25kaXRpb246IHAgcG9pbnRzIHRvIHRoZSBiZWdpbm5pbmcgb2YgYW4gZW50cnkgaW4gdGhlIGNlbnRyYWwgZGlyCi0vLyBQb3N0Y29uZGl0aW9uOiBwIHBvaW50cyB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBuZXh0IGVudHJ5IGluIHRoZSBjZW50cmFsIGRpcgotLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBjZW50cmFsIGRpcmVjdG9yeSBjb250YWlucyBhbm90aGVyIGZpbGUgYW5kIGZhbHNlIGlmIG5vdC4KLS8vIE9mIGNvdXJzZSwgaW4gdGhlIGxhdHRlciBjYXNlLCB0aGUgc2l6ZSBvdXRwdXQgdmFyaWFibGVzIGFyZSBub3QgY2hhbmdlZC4KLS8vIE5vdGUgdGhhdCB0aGUgY2VudHJhbCBkaXJlY3RvcnkgaXMgYWx3YXlzIGZvbGxvd2VkIGJ5IGFub3RoZXIgZGF0YSBzdHJ1Y3R1cmUKLS8vIHRoYXQgaGFzIGEgc2lnbmF0dXJlLCBzbyBwYXJzaW5nIGl0IHRoaXMgd2F5IGlzIHNhZmUuCi1zdGF0aWMgYm9vbCBQcm9jZXNzQ2VudHJhbERpckVudHJ5KAotICAgIGNvbnN0IHUxIComcCwgc2l6ZV90ICpjb21wcmVzc2VkX3NpemUsIHNpemVfdCAqdW5jb21wcmVzc2VkX3NpemUsCi0gICAgY2hhciAqZmlsZW5hbWUsIHNpemVfdCBmaWxlbmFtZV9zaXplLCB1NCAqYXR0ciwgdTQgKm9mZnNldCkgewotICB1NCBzaWduYXR1cmUgPSBnZXRfdTRsZShwKTsKLSAgaWYgKHNpZ25hdHVyZSAhPSBDRU5UUkFMX0ZJTEVfSEVBREVSX1NJR05BVFVSRSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHAgKz0gMTY7ICAvLyBza2lwIHRvICdjb21wcmVzc2VkIHNpemUnIGZpZWxkCi0gICpjb21wcmVzc2VkX3NpemUgPSBnZXRfdTRsZShwKTsKLSAgKnVuY29tcHJlc3NlZF9zaXplID0gZ2V0X3U0bGUocCk7Ci0gIHUyIGZpbGVfbmFtZV9sZW5ndGggPSBnZXRfdTJsZShwKTsKLSAgdTIgZXh0cmFfZmllbGRfbGVuZ3RoID0gZ2V0X3UybGUocCk7Ci0gIHUyIGZpbGVfY29tbWVudF9sZW5ndGggPSBnZXRfdTJsZShwKTsKLSAgcCArPSA0OyAgLy8gc2tpcCB0byBleHRlcm5hbCBmaWxlIGF0dHJpYnV0ZXMgZmllbGQKLSAgKmF0dHIgPSBnZXRfdTRsZShwKTsKLSAgKm9mZnNldCA9IGdldF91NGxlKHApOwotICB7Ci0gICAgc2l6ZV90IGxlbiA9IChmaWxlX25hbWVfbGVuZ3RoIDwgZmlsZW5hbWVfc2l6ZSkKLSAgICAgID8gZmlsZV9uYW1lX2xlbmd0aAotICAgICAgOiAoZmlsZW5hbWVfc2l6ZSAtIDEpOwotICAgIG1lbWNweShyZWludGVycHJldF9jYXN0PHZvaWQqPihmaWxlbmFtZSksIHAsIGxlbik7Ci0gICAgZmlsZW5hbWVbbGVuXSA9IDA7Ci0gIH0KLSAgcCArPSBmaWxlX25hbWVfbGVuZ3RoOwotICBwICs9IGV4dHJhX2ZpZWxkX2xlbmd0aDsKLSAgcCArPSBmaWxlX2NvbW1lbnRfbGVuZ3RoOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLy8gR2l2ZXMgYSBtYXhpbXVtIGJvdW5kIG9uIHRoZSBzaXplIG9mIHRoZSBpbnRlcmZhY2UgSkFSLiBCYXNpY2FsbHksIGFkZHMKLS8vIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGNvbXByZXNzZWQgYW5kIHVuY29tcHJlc3NlZCBzaXplcyB0byB0aGUgc2l6ZQotLy8gb2YgdGhlIGlucHV0IGZpbGUuCi11OCBJbnB1dFppcEZpbGU6OkNhbGN1bGF0ZU91dHB1dExlbmd0aCgpIHsKLSAgY29uc3QgdTEqIGN1cnJlbnQgPSBjZW50cmFsX2Rpcl87Ci0KLSAgdTggY29tcHJlc3NlZF9zaXplID0gMDsKLSAgdTggdW5jb21wcmVzc2VkX3NpemUgPSAwOwotICB1OCBza2lwcGVkX2NvbXByZXNzZWRfc2l6ZSA9IDA7Ci0gIHU0IGF0dHI7Ci0gIHU0IG9mZnNldDsKLSAgY2hhciBmaWxlbmFtZVtQQVRIX01BWF07Ci0KLSAgd2hpbGUgKHRydWUpIHsKLSAgICBzaXplX3QgZmlsZV9jb21wcmVzc2VkLCBmaWxlX3VuY29tcHJlc3NlZDsKLSAgICBpZiAoIVByb2Nlc3NDZW50cmFsRGlyRW50cnkoY3VycmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpbGVfY29tcHJlc3NlZCwgJmZpbGVfdW5jb21wcmVzc2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSwgUEFUSF9NQVgsICZhdHRyLCAmb2Zmc2V0KSkgewotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgaWYgKHByb2Nlc3Nvci0+QWNjZXB0KGZpbGVuYW1lLCBhdHRyKSkgewotICAgICAgY29tcHJlc3NlZF9zaXplICs9ICh1OCkgZmlsZV9jb21wcmVzc2VkOwotICAgICAgdW5jb21wcmVzc2VkX3NpemUgKz0gKHU4KSBmaWxlX3VuY29tcHJlc3NlZDsKLSAgICB9IGVsc2UgewotICAgICAgc2tpcHBlZF9jb21wcmVzc2VkX3NpemUgKz0gZmlsZV9jb21wcmVzc2VkOwotICAgIH0KLSAgfQotCi0gIC8vIFRoZSB3b3JzdCBjYXNlIGlzIHdoZW4gdGhlIG91dHB1dCBpcyBzaW1wbHkgdGhlIGlucHV0IHVuY29tcHJlc3NlZC4gVGhlCi0gIC8vIG1ldGFkYXRhIGluIHRoZSB6aXAgZmlsZSB3aWxsIHN0YXkgdGhlIHNhbWUsIHNvIHRoZSBmaWxlIHdpbGwgZ3JvdyBieSB0aGUKLSAgLy8gZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBjb21wcmVzc2VkIGFuZCB1bmNvbXByZXNzZWQgc2l6ZXMuCi0gIHJldHVybiAodTgpIGluX2xlbmd0aF8gLSBza2lwcGVkX2NvbXByZXNzZWRfc2l6ZQotICAgICAgKyAodW5jb21wcmVzc2VkX3NpemUgLSBjb21wcmVzc2VkX3NpemUpOwotfQotCi0vLyBHaXZlbiB0aGUgZGF0YSBpbiB0aGUgemlwIGZpbGUsIHJldHVybnMgdGhlIG9mZnNldCBvZiB0aGUgY2VudHJhbCBkaXJlY3RvcnkKLS8vIGFuZCB0aGUgbnVtYmVyIG9mIGZpbGVzIGNvbnRhaW5lZCBpbiBpdC4KLWJvb2wgRmluZFppcENlbnRyYWxEaXJlY3RvcnkoY29uc3QgdTEqIGJ5dGVzLCBzaXplX3QgaW5fbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1NCogb2Zmc2V0LCBjb25zdCB1MSoqIGNlbnRyYWxfZGlyKSB7Ci0gIHN0YXRpYyBjb25zdCBpbnQgTUFYX0NPTU1FTlRfTEVOR1RIID0gMHhmZmZmOwotICBzdGF0aWMgY29uc3QgaW50IENFTlRSQUxfRElSX0xPQ0FUT1JfU0laRSA9IDIyOwotICAvLyBNYXhpbXVtIGRpc3RhbmNlIG9mIHN0YXJ0IG9mIGNlbnRyYWwgZGlyIGxvY2F0b3IgZnJvbSBlbmQgb2YgZmlsZQotICBzdGF0aWMgY29uc3QgaW50IE1BWF9ERUxUQSA9IE1BWF9DT01NRU5UX0xFTkdUSCArIENFTlRSQUxfRElSX0xPQ0FUT1JfU0laRTsKLSAgY29uc3QgdTEqIGxhc3RfcG9zX3RvX2NoZWNrID0gaW5fbGVuZ3RoIDwgTUFYX0RFTFRBCi0gICAgICA/IGJ5dGVzCi0gICAgICA6IGJ5dGVzICsgKGluX2xlbmd0aCAtIE1BWF9ERUxUQSk7Ci0gIGNvbnN0IHUxKiBjdXJyZW50OwotICBib29sIGZvdW5kID0gZmFsc2U7Ci0KLSAgZm9yIChjdXJyZW50ID0gYnl0ZXMgKyBpbl9sZW5ndGggLSBDRU5UUkFMX0RJUl9MT0NBVE9SX1NJWkU7Ci0gICAgICAgY3VycmVudCA+PSBsYXN0X3Bvc190b19jaGVjazsKLSAgICAgICBjdXJyZW50LS0gKSB7Ci0gICAgY29uc3QgdTEqIHAgPSBjdXJyZW50OwotICAgIGlmIChnZXRfdTRsZShwKSAhPSBFTkRfT0ZfQ0VOVFJBTF9ESVJfU0lHTkFUVVJFKSB7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0KLSAgICBwICs9IDE2OyAgLy8gc2tpcCB0byBjb21tZW50IGxlbmd0aCBmaWVsZAotICAgIHUyIGNvbW1lbnRfbGVuZ3RoID0gZ2V0X3UybGUocCk7Ci0KLSAgICAvLyBEb2VzIHRoZSBjb21tZW50IGdvIGV4YWN0bHkgdGlsbCB0aGUgZW5kIG9mIHRoZSBmaWxlPwotICAgIGlmIChjdXJyZW50ICsgY29tbWVudF9sZW5ndGggKyBDRU5UUkFMX0RJUl9MT0NBVE9SX1NJWkUKLSAgICAgICAgIT0gYnl0ZXMgKyBpbl9sZW5ndGgpIHsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLQotICAgIC8vIEhvb3JheSwgd2UgZm91bmQgaXQhCi0gICAgZm91bmQgPSB0cnVlOwotICAgIGJyZWFrOwotICB9Ci0KLSAgaWYgKCFmb3VuZCkgewotICAgIGZwcmludGYoc3RkZXJyLCAiZmlsZSBpcyBpbnZhbGlkIG9yIGNvcnJ1cHRlZCAobWlzc2luZyBlbmQgb2YgY2VudHJhbCAiCi0gICAgICAgICAgICAgICAgICAgICJkaXJlY3RvcnkgcmVjb3JkKVxuIik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgY29uc3QgdTEqIGVuZF9vZl9jZW50cmFsX2RpciA9IGN1cnJlbnQ7Ci0gIGdldF91NGxlKGN1cnJlbnQpOyAgLy8gY2VudHJhbCBkaXJlY3RvcnkgbG9jYXRvciBzaWduYXR1cmUsIGFscmVhZHkgY2hlY2tlZAotICB1MiBudW1iZXJfb2ZfdGhpc19kaXNrID0gZ2V0X3UybGUoY3VycmVudCk7Ci0gIHUyIGRpc2tfd2l0aF9jZW50cmFsX2RpciA9IGdldF91MmxlKGN1cnJlbnQpOwotICB1MiBjZW50cmFsX2Rpcl9lbnRyaWVzX29uX3RoaXNfZGlzayA9IGdldF91MmxlKGN1cnJlbnQpOwotICB1MiBjZW50cmFsX2Rpcl9lbnRyaWVzID0gZ2V0X3UybGUoY3VycmVudCk7Ci0gIHU0IGNlbnRyYWxfZGlyX3NpemUgPSBnZXRfdTRsZShjdXJyZW50KTsKLSAgdTQgY2VudHJhbF9kaXJfb2Zmc2V0ID0gZ2V0X3U0bGUoY3VycmVudCk7Ci0gIHUyIGZpbGVfY29tbWVudF9sZW5ndGggPSBnZXRfdTJsZShjdXJyZW50KTsKLSAgY3VycmVudCArPSBmaWxlX2NvbW1lbnRfbGVuZ3RoOyAgLy8gc2V0IGN1cnJlbnQgdG8gdGhlIGVuZCBvZiB0aGUgY2VudHJhbCBkaXIKLQotICBpZiAobnVtYmVyX29mX3RoaXNfZGlzayAhPSAwCi0gICAgfHwgZGlza193aXRoX2NlbnRyYWxfZGlyICE9IDAKLSAgICB8fCBjZW50cmFsX2Rpcl9lbnRyaWVzX29uX3RoaXNfZGlzayAhPSBjZW50cmFsX2Rpcl9lbnRyaWVzKSB7Ci0gICAgZnByaW50ZihzdGRlcnIsICJtdWx0aS1kaXNrIEpBUiBmaWxlcyBhcmUgbm90IHN1cHBvcnRlZFxuIik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLy8gRG8gbm90IGNoYW5nZSBvdXRwdXQgdmFsdWVzIGJlZm9yZSBkZXRlcm1pbmluZyB0aGF0IHRoZXkgYXJlIE9LLgotICAqb2Zmc2V0ID0gY2VudHJhbF9kaXJfb2Zmc2V0OwotICAvLyBDZW50cmFsIGRpcmVjdG9yeSBzdGFydCBjYW4gdGhlbiBiZSB1c2VkIHRvIGRldGVybWluZSB0aGUgYWN0dWFsCi0gIC8vIHN0YXJ0cyBvZiB0aGUgemlwIGZpbGUgKHdoaWNoIGNhbiBiZSBkaWZmZXJlbnQgaW4gY2FzZSBvZiBhIG5vbi16aXAKLSAgLy8gaGVhZGVyIGxpa2UgZm9yIGF1dG8tZXh0cmFjdGFibGUgYmluYXJpZXMpLgotICAqY2VudHJhbF9kaXIgPSBlbmRfb2ZfY2VudHJhbF9kaXIgLSBjZW50cmFsX2Rpcl9zaXplOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBJbnB1dFppcEZpbGU6OlJlc2V0KCkgewotICBjZW50cmFsX2Rpcl9jdXJyZW50XyA9IGNlbnRyYWxfZGlyXzsKLSAgemlwZGF0YV9pbl9tYXBwZWRfID0gemlwZGF0YV9pbl87Ci0gIHAgPSB6aXBkYXRhX2luXyArIGluX29mZnNldF87Ci19Ci0KLWludCBaaXBFeHRyYWN0b3I6OlByb2Nlc3NBbGwoKSB7Ci0gIHdoaWxlIChQcm9jZXNzTmV4dCgpKSB7fQotICBpZiAoR2V0RXJyb3IoKSAhPSBOVUxMKSB7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0gIHJldHVybiAwOwotfQotCi1aaXBFeHRyYWN0b3IqIFppcEV4dHJhY3Rvcjo6Q3JlYXRlKGNvbnN0IGNoYXIqIGZpbGVuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaaXBFeHRyYWN0b3JQcm9jZXNzb3IgKnByb2Nlc3NvcikgewotICBpbnQgZmRfaW4gPSBvcGVuKGZpbGVuYW1lLCBPX1JET05MWSk7Ci0gIGlmIChmZF9pbiA8IDApIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIG9mZl90IGxlbmd0aCA9IGxzZWVrKGZkX2luLCAwLCBTRUVLX0VORCk7Ci0gIGlmIChsZW5ndGggPCAwKSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotICB2b2lkICp6aXBkYXRhX2luID0gbW1hcChOVUxMLCBsZW5ndGgsIFBST1RfUkVBRCwgTUFQX1BSSVZBVEUsIGZkX2luLCAwKTsKLSAgaWYgKHppcGRhdGFfaW4gPT0gTUFQX0ZBSUxFRCkgewotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgdTQgY2VudHJhbF9kaXJfb2Zmc2V0OwotICBjb25zdCB1MSAqY2VudHJhbF9kaXIgPSBOVUxMOwotCi0gIGlmICghZGV2dG9vbHNfaWphcjo6RmluZFppcENlbnRyYWxEaXJlY3RvcnkoCi0gICAgICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgdTEqPih6aXBkYXRhX2luKSwgbGVuZ3RoLAotICAgICAgICAgICZjZW50cmFsX2Rpcl9vZmZzZXQsICZjZW50cmFsX2RpcikpIHsKLSAgICBlcnJubyA9IEVJTzsgIC8vIHdlIGRvbid0IHJlYWxseSBoYXZlIGEgZ29vZCBlcnJvciBudW1iZXIKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotICBjb25zdCB1MSAqemlwZGF0YV9zdGFydCA9IHN0YXRpY19jYXN0PGNvbnN0IHUxKj4oemlwZGF0YV9pbik7Ci0gIG9mZl90IG9mZnNldCA9IC0gc3RhdGljX2Nhc3Q8b2ZmX3Q+KHppcGRhdGFfc3RhcnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBjZW50cmFsX2Rpcl9vZmZzZXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBjZW50cmFsX2Rpcik7Ci0KLSAgcmV0dXJuIG5ldyBJbnB1dFppcEZpbGUocHJvY2Vzc29yLCBmZF9pbiwgbGVuZ3RoLCBvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHppcGRhdGFfc3RhcnQsIGNlbnRyYWxfZGlyKTsKLX0KLQotSW5wdXRaaXBGaWxlOjpJbnB1dFppcEZpbGUoWmlwRXh0cmFjdG9yUHJvY2Vzc29yICpwcm9jZXNzb3IsIGludCBmZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZl90IGluX2xlbmd0aCwgb2ZmX3QgaW5fb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdTEqIHppcGRhdGFfaW4sIGNvbnN0IHUxKiBjZW50cmFsX2RpcikKLSAgOiBwcm9jZXNzb3IocHJvY2Vzc29yKSwgZmRfaW4oZmQpLAotICAgIHppcGRhdGFfaW5fKHppcGRhdGFfaW4pLCB6aXBkYXRhX2luX21hcHBlZF8oemlwZGF0YV9pbiksCi0gICAgY2VudHJhbF9kaXJfKGNlbnRyYWxfZGlyKSwgaW5fbGVuZ3RoXyhpbl9sZW5ndGgpLCBpbl9vZmZzZXRfKGluX29mZnNldCksCi0gICAgcCh6aXBkYXRhX2luICsgaW5fb2Zmc2V0KSwgY2VudHJhbF9kaXJfY3VycmVudF8oY2VudHJhbF9kaXIpIHsKLSAgdW5jb21wcmVzc2VkX2RhdGFfYWxsb2NhdGVkXyA9IElOSVRJQUxfQlVGRkVSX1NJWkU7Ci0gIHVuY29tcHJlc3NlZF9kYXRhXyA9Ci0gICAgcmVpbnRlcnByZXRfY2FzdDx1MSo+KG1hbGxvYyh1bmNvbXByZXNzZWRfZGF0YV9hbGxvY2F0ZWRfKSk7Ci0gIGVycm1zZ1swXSA9IDA7Ci19Ci0KLUlucHV0WmlwRmlsZTo6fklucHV0WmlwRmlsZSgpIHsKLSAgZnJlZSh1bmNvbXByZXNzZWRfZGF0YV8pOwotICBjbG9zZShmZF9pbik7Ci19Ci0KLQotLy8KLS8vIEltcGxlbWVudGF0aW9uIG9mIE91dHB1dFppcEZpbGUKLS8vCi1pbnQgT3V0cHV0WmlwRmlsZTo6V3JpdGVFbXB0eUZpbGUoY29uc3QgY2hhciAqZmlsZW5hbWUpIHsKLSAgY29uc3QgdTEqIGZpbGVfbmFtZSA9IChjb25zdCB1MSopIGZpbGVuYW1lOwotICBzaXplX3QgZmlsZV9uYW1lX2xlbmd0aCA9IHN0cmxlbihmaWxlbmFtZSk7Ci0KLSAgTG9jYWxGaWxlRW50cnkgKmVudHJ5ID0gbmV3IExvY2FsRmlsZUVudHJ5OwotICBlbnRyeS0+bG9jYWxfaGVhZGVyX29mZnNldCA9IE9mZnNldChxKTsKLSAgZW50cnktPmV4dGVybmFsX2F0dHIgPSAwOwotICBlbnRyeS0+Y3JjMzIgPSAwOwotCi0gIC8vIE91dHB1dCB0aGUgWklQIGxvY2FsX2ZpbGVfaGVhZGVyOgotICBwdXRfdTRsZShxLCBMT0NBTF9GSUxFX0hFQURFUl9TSUdOQVRVUkUpOwotICBwdXRfdTJsZShxLCAxMCk7ICAvLyBleHRyYWN0X3ZlcnNpb24KLSAgcHV0X3UybGUocSwgMCk7ICAvLyBnZW5lcmFsX3B1cnBvc2VfYml0X2ZsYWcKLSAgcHV0X3UybGUocSwgMCk7ICAvLyBjb21wcmVzc2lvbl9tZXRob2QKLSAgcHV0X3UybGUocSwgMCk7ICAvLyBsYXN0X21vZF9maWxlX3RpbWUKLSAgcHV0X3UybGUocSwgMCk7ICAvLyBsYXN0X21vZF9maWxlX2RhdGUKLSAgcHV0X3U0bGUocSwgZW50cnktPmNyYzMyKTsgIC8vIGNyYzMyCi0gIHB1dF91NGxlKHEsIDApOyAgLy8gY29tcHJlc3NlZF9zaXplCi0gIHB1dF91NGxlKHEsIDApOyAgLy8gdW5jb21wcmVzc2VkX3NpemUKLSAgcHV0X3UybGUocSwgZmlsZV9uYW1lX2xlbmd0aCk7Ci0gIHB1dF91MmxlKHEsIDApOyAgLy8gZXh0cmFfZmllbGRfbGVuZ3RoCi0gIHB1dF9uKHEsIGZpbGVfbmFtZSwgZmlsZV9uYW1lX2xlbmd0aCk7Ci0KLSAgZW50cnktPmZpbGVfbmFtZV9sZW5ndGggPSBmaWxlX25hbWVfbGVuZ3RoOwotICBlbnRyeS0+ZXh0cmFfZmllbGRfbGVuZ3RoID0gMDsKLSAgZW50cnktPmNvbXByZXNzZWRfbGVuZ3RoID0gMDsKLSAgZW50cnktPnVuY29tcHJlc3NlZF9sZW5ndGggPSAwOwotICBlbnRyeS0+Y29tcHJlc3Npb25fbWV0aG9kID0gMDsKLSAgZW50cnktPmV4dHJhX2ZpZWxkID0gKGNvbnN0IHUxICopIiI7Ci0gIGVudHJ5LT5maWxlX25hbWUgPSAodTEqKSBzdHJkdXAoKGNvbnN0IGNoYXIgKikgZmlsZV9uYW1lKTsKLSAgZW50cmllc18ucHVzaF9iYWNrKGVudHJ5KTsKLQotICByZXR1cm4gMDsKLX0KLQotdm9pZCBPdXRwdXRaaXBGaWxlOjpXcml0ZUNlbnRyYWxEaXJlY3RvcnkoKSB7Ci0gIC8vIGNlbnRyYWwgZGlyZWN0b3J5OgotICBjb25zdCB1MSAqY2VudHJhbF9kaXJlY3Rvcnlfc3RhcnQgPSBxOwotICBmb3IgKHNpemVfdCBpaSA9IDA7IGlpIDwgZW50cmllc18uc2l6ZSgpOyArK2lpKSB7Ci0gICAgTG9jYWxGaWxlRW50cnkgKmVudHJ5ID0gZW50cmllc19baWldOwotICAgIHB1dF91NGxlKHEsIENFTlRSQUxfRklMRV9IRUFERVJfU0lHTkFUVVJFKTsKLSAgICBwdXRfdTJsZShxLCAwKTsgIC8vIHZlcnNpb24gbWFkZSBieQotCi0gICAgcHV0X3UybGUocSwgWklQX1ZFUlNJT05fVE9fRVhUUkFDVCk7ICAvLyB2ZXJzaW9uIHRvIGV4dHJhY3QKLSAgICBwdXRfdTJsZShxLCAwKTsgIC8vIGdlbmVyYWwgcHVycG9zZSBiaXQgZmxhZwotICAgIHB1dF91MmxlKHEsIGVudHJ5LT5jb21wcmVzc2lvbl9tZXRob2QpOyAgLy8gY29tcHJlc3Npb24gbWV0aG9kOgotICAgIHB1dF91MmxlKHEsIDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGFzdF9tb2RfZmlsZV90aW1lCi0gICAgcHV0X3UybGUocSwgMCk7ICAvLyBsYXN0X21vZF9maWxlX2RhdGUKLSAgICBwdXRfdTRsZShxLCBlbnRyeS0+Y3JjMzIpOyAgLy8gY3JjMzIKLSAgICBwdXRfdTRsZShxLCBlbnRyeS0+Y29tcHJlc3NlZF9sZW5ndGgpOyAgICAvLyBjb21wcmVzc2VkX3NpemUKLSAgICBwdXRfdTRsZShxLCBlbnRyeS0+dW5jb21wcmVzc2VkX2xlbmd0aCk7ICAvLyB1bmNvbXByZXNzZWRfc2l6ZQotICAgIHB1dF91MmxlKHEsIGVudHJ5LT5maWxlX25hbWVfbGVuZ3RoKTsKLSAgICBwdXRfdTJsZShxLCBlbnRyeS0+ZXh0cmFfZmllbGRfbGVuZ3RoKTsKLQotICAgIHB1dF91MmxlKHEsIDApOyAgLy8gZmlsZSBjb21tZW50IGxlbmd0aAotICAgIHB1dF91MmxlKHEsIDApOyAgLy8gZGlzayBudW1iZXIgc3RhcnQKLSAgICBwdXRfdTJsZShxLCAwKTsgIC8vIGludGVybmFsIGZpbGUgYXR0cmlidXRlcwotICAgIHB1dF91NGxlKHEsIGVudHJ5LT5leHRlcm5hbF9hdHRyKTsgIC8vIGV4dGVybmFsIGZpbGUgYXR0cmlidXRlcwotICAgIC8vIHJlbGF0aXZlIG9mZnNldCBvZiBsb2NhbCBoZWFkZXI6Ci0gICAgcHV0X3U0bGUocSwgZW50cnktPmxvY2FsX2hlYWRlcl9vZmZzZXQpOwotCi0gICAgcHV0X24ocSwgZW50cnktPmZpbGVfbmFtZSwgZW50cnktPmZpbGVfbmFtZV9sZW5ndGgpOwotICAgIHB1dF9uKHEsIGVudHJ5LT5leHRyYV9maWVsZCwgZW50cnktPmV4dHJhX2ZpZWxkX2xlbmd0aCk7Ci0gIH0KLSAgdTQgY2VudHJhbF9kaXJlY3Rvcnlfc2l6ZSA9IHEgLSBjZW50cmFsX2RpcmVjdG9yeV9zdGFydDsKLQotICBwdXRfdTRsZShxLCBFTkRfT0ZfQ0VOVFJBTF9ESVJfU0lHTkFUVVJFKTsKLSAgcHV0X3UybGUocSwgMCk7ICAvLyBudW1iZXIgb2YgdGhpcyBkaXNrCi0gIHB1dF91MmxlKHEsIDApOyAgLy8gbnVtYmVyIG9mIHRoZSBkaXNrIHdpdGggdGhlIHN0YXJ0IG9mIHRoZSBjZW50cmFsIGRpcmVjdG9yeQotICBwdXRfdTJsZShxLCBlbnRyaWVzXy5zaXplKCkpOyAgLy8gIyBjZW50cmFsIGRpciBlbnRyaWVzIG9uIHRoaXMgZGlzawotICBwdXRfdTJsZShxLCBlbnRyaWVzXy5zaXplKCkpOyAgLy8gdG90YWwgIyBlbnRyaWVzIGluIHRoZSBjZW50cmFsIGRpcmVjdG9yeQotICBwdXRfdTRsZShxLCBjZW50cmFsX2RpcmVjdG9yeV9zaXplKTsgIC8vIHNpemUgb2YgdGhlIGNlbnRyYWwgZGlyZWN0b3J5Ci0gIHB1dF91NGxlKHEsIE9mZnNldChjZW50cmFsX2RpcmVjdG9yeV9zdGFydCkpOyAgLy8gb2Zmc2V0IG9mIHN0YXJ0IG9mIGNlbnRyYWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkaXJlY3Rvcnkgd3J0IHN0YXJ0aW5nIGRpc2sKLSAgcHV0X3UybGUocSwgMCk7ICAvLyAuWklQIGZpbGUgY29tbWVudCBsZW5ndGgKLX0KLQotdTEqIE91dHB1dFppcEZpbGU6OldyaXRlTG9jYWxGaWxlSGVhZGVyKGNvbnN0IGNoYXIqIGZpbGVuYW1lLCBjb25zdCB1NCBhdHRyKSB7Ci0gIG9mZl90IGZpbGVfbmFtZV9sZW5ndGhfID0gc3RybGVuKGZpbGVuYW1lKTsKLSAgTG9jYWxGaWxlRW50cnkgKmVudHJ5ID0gbmV3IExvY2FsRmlsZUVudHJ5OwotICBlbnRyeS0+bG9jYWxfaGVhZGVyX29mZnNldCA9IE9mZnNldChxKTsKLSAgZW50cnktPmZpbGVfbmFtZV9sZW5ndGggPSBmaWxlX25hbWVfbGVuZ3RoXzsKLSAgZW50cnktPmZpbGVfbmFtZSA9IG5ldyB1MVtmaWxlX25hbWVfbGVuZ3RoX107Ci0gIGVudHJ5LT5leHRlcm5hbF9hdHRyID0gYXR0cjsKLSAgbWVtY3B5KGVudHJ5LT5maWxlX25hbWUsIGZpbGVuYW1lLCBmaWxlX25hbWVfbGVuZ3RoXyk7Ci0gIGVudHJ5LT5leHRyYV9maWVsZF9sZW5ndGggPSAwOwotICBlbnRyeS0+ZXh0cmFfZmllbGQgPSAoY29uc3QgdTEgKikiIjsKLSAgZW50cnktPmNyYzMyID0gMDsKLQotICAvLyBPdXRwdXQgdGhlIFpJUCBsb2NhbF9maWxlX2hlYWRlcjoKLSAgcHV0X3U0bGUocSwgTE9DQUxfRklMRV9IRUFERVJfU0lHTkFUVVJFKTsKLSAgcHV0X3UybGUocSwgWklQX1ZFUlNJT05fVE9fRVhUUkFDVCk7ICAgICAvLyB2ZXJzaW9uIHRvIGV4dHJhY3QKLSAgcHV0X3UybGUocSwgMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBnZW5lcmFsIHB1cnBvc2UgYml0IGZsYWcKLSAgdTEgKmhlYWRlcl9wdHIgPSBxOwotICBwdXRfdTJsZShxLCBDT01QUkVTU0lPTl9NRVRIT0RfU1RPUkVEKTsgIC8vIGNvbXByZXNzaW9uIG1ldGhvZCA9IHBsYWNlaG9sZGVyCi0gIHB1dF91MmxlKHEsIDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGFzdF9tb2RfZmlsZV90aW1lCi0gIHB1dF91MmxlKHEsIDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGFzdF9tb2RfZmlsZV9kYXRlCi0gIHB1dF91NGxlKHEsIGVudHJ5LT5jcmMzMik7ICAgICAgICAgICAgICAgLy8gY3JjMzIKLSAgcHV0X3U0bGUocSwgMCk7ICAvLyBjb21wcmVzc2VkX3NpemUgPSBwbGFjZWhvbGRlcgotICBwdXRfdTRsZShxLCAwKTsgIC8vIHVuY29tcHJlc3NlZF9zaXplID0gcGxhY2Vob2xkZXIKLSAgcHV0X3UybGUocSwgZW50cnktPmZpbGVfbmFtZV9sZW5ndGgpOwotICBwdXRfdTJsZShxLCBlbnRyeS0+ZXh0cmFfZmllbGRfbGVuZ3RoKTsKLQotICBwdXRfbihxLCBlbnRyeS0+ZmlsZV9uYW1lLCBlbnRyeS0+ZmlsZV9uYW1lX2xlbmd0aCk7Ci0gIHB1dF9uKHEsIGVudHJ5LT5leHRyYV9maWVsZCwgZW50cnktPmV4dHJhX2ZpZWxkX2xlbmd0aCk7Ci0gIGVudHJpZXNfLnB1c2hfYmFjayhlbnRyeSk7Ci0KLSAgcmV0dXJuIGhlYWRlcl9wdHI7Ci19Ci0KLS8vIFRyeSB0byBjb21wcmVzcyBhIGZpbGUgZW50cnkgaW4gbWVtb3J5IHVzaW5nIHRoZSBkZWZsYXRlIGFsZ29yaXRobS4KLS8vIEl0IHdpbGwgY29tcHJlc3MgYnVmIChvZiBzaXplIGxlbmd0aCkgdW5sZXNzIHRoZSBjb21wcmVzc2VkIHNpemUgaXMgYmlnZ2VyCi0vLyB0aGFuIHRoZSBpbnB1dCBzaXplLiBUaGUgcmVzdWx0IHdpbGwgb3ZlcndyaXRlIHRoZSBjb250ZW50IG9mIGJ1ZiBhbmQgdGhlCi0vLyBmaW5hbCBzaXplIGlzIHJldHVybmVkLgotc2l6ZV90IFRyeURlZmxhdGUodTEgKmJ1Ziwgc2l6ZV90IGxlbmd0aCkgewotICB1MSAqb3V0YnVmID0gcmVpbnRlcnByZXRfY2FzdDx1MSAqPihtYWxsb2MobGVuZ3RoKSk7Ci0gIHpfc3RyZWFtIHN0cmVhbTsKLQotICAvLyBJbml0aWFsaXplIHRoZSB6X3N0cmVhbSBzdHJjdXQgZm9yIHJlYWRpbmcgZnJvbSBidWYgYW5kIHdyaW50aW5nIGluIG91dGJ1Zi4KLSAgc3RyZWFtLnphbGxvYyA9IFpfTlVMTDsKLSAgc3RyZWFtLnpmcmVlID0gWl9OVUxMOwotICBzdHJlYW0ub3BhcXVlID0gWl9OVUxMOwotICBzdHJlYW0udG90YWxfaW4gPSBsZW5ndGg7Ci0gIHN0cmVhbS5hdmFpbF9pbiA9IGxlbmd0aDsKLSAgc3RyZWFtLnRvdGFsX291dCA9IGxlbmd0aDsKLSAgc3RyZWFtLmF2YWlsX291dCA9IGxlbmd0aDsKLSAgc3RyZWFtLm5leHRfaW4gPSBidWY7Ci0gIHN0cmVhbS5uZXh0X291dCA9IG91dGJ1ZjsKLQotICAvLyBkZWZsYXRlSW5pdDIgbmVnYXRpdmUgd2luZG93cyBzaXplIHByZXZlbnQgdGhlIHpsaWIgd3JhcHBlciB0byBiZSB1c2VkLgotICBpZiAoZGVmbGF0ZUluaXQyKCZzdHJlYW0sIFpfREVGQVVMVF9DT01QUkVTU0lPTiwgWl9ERUZMQVRFRCwKLSAgICAgICAgICAgICAgICAgIC1NQVhfV0JJVFMsIDgsIFpfREVGQVVMVF9TVFJBVEVHWSkgIT0gWl9PSykgewotICAgIC8vIEZhaWx1cmUgdG8gY29tcHJlc3MgPT4gcmV0dXJuIHRoZSBidWZmZXIgdW5jb21wcmVzc2VkCi0gICAgZnJlZShvdXRidWYpOwotICAgIHJldHVybiBsZW5ndGg7Ci0gIH0KLQotICBpZiAoZGVmbGF0ZSgmc3RyZWFtLCBaX0ZJTklTSCkgPT0gWl9TVFJFQU1fRU5EKSB7Ci0gICAgLy8gQ29tcHJlc3Npb24gc3VjY2Vzc2Z1bCBhbmQgZml0cyBpbiBvdXRidWYsIGxldCdzIGNvcHkgdGhlIHJlc3VsdCBpbiBidWYuCi0gICAgbGVuZ3RoID0gc3RyZWFtLnRvdGFsX291dDsKLSAgICBtZW1jcHkoYnVmLCBvdXRidWYsIGxlbmd0aCk7Ci0gIH0KLQotICBkZWZsYXRlRW5kKCZzdHJlYW0pOwotICBmcmVlKG91dGJ1Zik7Ci0KLSAgLy8gUmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIHJlc3VsdGluZyBidWZmZXIKLSAgcmV0dXJuIGxlbmd0aDsKLX0KLQotc2l6ZV90IE91dHB1dFppcEZpbGU6OldyaXRlRmlsZVNpemVJbkxvY2FsRmlsZUhlYWRlcih1MSAqaGVhZGVyX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG91dF9sZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgY29tcHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHU0IGNyYykgewotICBzaXplX3QgY29tcHJlc3NlZF9zaXplID0gb3V0X2xlbmd0aDsKLSAgaWYgKGNvbXByZXNzKSB7Ci0gICAgY29tcHJlc3NlZF9zaXplID0gVHJ5RGVmbGF0ZShxLCBvdXRfbGVuZ3RoKTsKLSAgfQotICAvLyBjb21wcmVzc2lvbiBtZXRob2QKLSAgaWYgKGNvbXByZXNzZWRfc2l6ZSA8IG91dF9sZW5ndGgpIHsKLSAgICBwdXRfdTJsZShoZWFkZXJfcHRyLCBDT01QUkVTU0lPTl9NRVRIT0RfREVGTEFURUQpOwotICB9IGVsc2UgewotICAgIHB1dF91MmxlKGhlYWRlcl9wdHIsIENPTVBSRVNTSU9OX01FVEhPRF9TVE9SRUQpOwotICB9Ci0gIGhlYWRlcl9wdHIgKz0gNDsKLSAgcHV0X3U0bGUoaGVhZGVyX3B0ciwgY3JjKTsgICAgICAgICAgICAgIC8vIGNyYzMyCi0gIHB1dF91NGxlKGhlYWRlcl9wdHIsIGNvbXByZXNzZWRfc2l6ZSk7ICAvLyBjb21wcmVzc2VkX3NpemUKLSAgcHV0X3U0bGUoaGVhZGVyX3B0ciwgb3V0X2xlbmd0aCk7ICAgICAgIC8vIHVuY29tcHJlc3NlZF9zaXplCi0gIHJldHVybiBjb21wcmVzc2VkX3NpemU7Ci19Ci0KLWludCBPdXRwdXRaaXBGaWxlOjpGaW5pc2goKSB7Ci0gIGlmIChmZF9vdXQgPiAwKSB7Ci0gICAgV3JpdGVDZW50cmFsRGlyZWN0b3J5KCk7Ci0gICAgaWYgKGZ0cnVuY2F0ZShmZF9vdXQsIEdldFNpemUoKSkgPCAwKSB7Ci0gICAgICByZXR1cm4gZXJyb3IoImZ0cnVuY2F0ZShmZF9vdXQsIEdldFNpemUoKSk6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICB9Ci0gICAgaWYgKGNsb3NlKGZkX291dCkgPCAwKSB7Ci0gICAgICByZXR1cm4gZXJyb3IoImNsb3NlKGZkX291dCk6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICB9Ci0gICAgZmRfb3V0ID0gLTE7Ci0gIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLXUxKiBPdXRwdXRaaXBGaWxlOjpOZXdGaWxlKGNvbnN0IGNoYXIqIGZpbGVuYW1lLCBjb25zdCB1NCBhdHRyKSB7Ci0gIGhlYWRlcl9wdHIgPSBXcml0ZUxvY2FsRmlsZUhlYWRlcihmaWxlbmFtZSwgYXR0cik7Ci0gIHJldHVybiBxOwotfQotCi1pbnQgT3V0cHV0WmlwRmlsZTo6RmluaXNoRmlsZShzaXplX3QgZmlsZWxlbmd0aCwgYm9vbCBjb21wcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgY29tcHV0ZV9jcmMpIHsKLSAgdTQgY3JjID0gMDsKLSAgaWYgKGNvbXB1dGVfY3JjKSB7Ci0gICAgY3JjID0gY3JjMzIoY3JjLCBxLCBmaWxlbGVuZ3RoKTsKLSAgfQotICBzaXplX3QgY29tcHJlc3NlZF9zaXplID0KLSAgICAgIFdyaXRlRmlsZVNpemVJbkxvY2FsRmlsZUhlYWRlcihoZWFkZXJfcHRyLCBmaWxlbGVuZ3RoLCBjb21wcmVzcywgY3JjKTsKLSAgZW50cmllc18uYmFjaygpLT5jcmMzMiA9IGNyYzsKLSAgZW50cmllc18uYmFjaygpLT5jb21wcmVzc2VkX2xlbmd0aCA9IGNvbXByZXNzZWRfc2l6ZTsKLSAgZW50cmllc18uYmFjaygpLT51bmNvbXByZXNzZWRfbGVuZ3RoID0gZmlsZWxlbmd0aDsKLSAgaWYgKGNvbXByZXNzZWRfc2l6ZSA8IGZpbGVsZW5ndGgpIHsKLSAgICBlbnRyaWVzXy5iYWNrKCktPmNvbXByZXNzaW9uX21ldGhvZCA9IENPTVBSRVNTSU9OX01FVEhPRF9ERUZMQVRFRDsKLSAgfSBlbHNlIHsKLSAgICBlbnRyaWVzXy5iYWNrKCktPmNvbXByZXNzaW9uX21ldGhvZCA9IENPTVBSRVNTSU9OX01FVEhPRF9TVE9SRUQ7Ci0gIH0KLSAgcSArPSBjb21wcmVzc2VkX3NpemU7Ci0gIHJldHVybiAwOwotfQotCi1aaXBCdWlsZGVyKiBaaXBCdWlsZGVyOjpDcmVhdGUoY29uc3QgY2hhciogemlwX2ZpbGUsIHU4IGVzdGltYXRlZF9zaXplKSB7Ci0gIGlmIChlc3RpbWF0ZWRfc2l6ZSA+IGtNYXhpbXVtT3V0cHV0U2l6ZSkgewotICAgIGZwcmludGYoc3RkZXJyLAotICAgICAgICAgICAgIlVuY29tcHJlc3NlZCBpbnB1dCBqYXIgaGFzIHNpemUgJWxsdSwgIgotICAgICAgICAgICAgIndoaWNoIGV4Y2VlZHMgdGhlIG1heGltdW0gc3VwcG9ydGVkIG91dHB1dCBzaXplICVsbHUuXG4iCi0gICAgICAgICAgICAiQXNzdW1pbmcgdGhhdCBpamFyIHdpbGwgYmUgc21hbGxlciBhbmQgaG9waW5nIGZvciB0aGUgYmVzdC5cbiIsCi0gICAgICAgICAgICBlc3RpbWF0ZWRfc2l6ZSwga01heGltdW1PdXRwdXRTaXplKTsKLSAgICBlc3RpbWF0ZWRfc2l6ZSA9IGtNYXhpbXVtT3V0cHV0U2l6ZTsKLSAgfQotCi0gIGludCBmZF9vdXQgPSBvcGVuKHppcF9maWxlLCBPX0NSRUFUfE9fUkRXUnxPX1RSVU5DLCAwNjQ0KTsKLSAgaWYgKGZkX291dCA8IDApIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIC8vIENyZWF0ZSBtbWFwLWFibGUgc3BhcnNlIGZpbGUKLSAgaWYgKGZ0cnVuY2F0ZShmZF9vdXQsIGVzdGltYXRlZF9zaXplKSA8IDApIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIC8vIEVuc3VyZSB0aGF0IGFueSBidWZmZXIgb3ZlcmZsb3cgaW4gSmFyU3RyaXBwZXIgd2lsbCByZXN1bHQgaW4KLSAgLy8gU0lHU0VHViBvciBTSUdCVVMgYnkgb3Zlci1hbGxvY2F0aW5nIGJleW9uZCB0aGUgZW5kIG9mIHRoZSBmaWxlLgotICBzaXplX3QgbW1hcF9sZW5ndGggPSBzdGQ6Om1pbihlc3RpbWF0ZWRfc2l6ZSArIHN5c2NvbmYoX1NDX1BBR0VTSVpFKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHU4KSBzdGQ6Om51bWVyaWNfbGltaXRzPHNpemVfdD46Om1heCgpKTsKLQotICB2b2lkICp6aXBkYXRhX291dCA9IG1tYXAoTlVMTCwgbW1hcF9sZW5ndGgsIFBST1RfV1JJVEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBNQVBfU0hBUkVELCBmZF9vdXQsIDApOwotICBpZiAoemlwZGF0YV9vdXQgPT0gTUFQX0ZBSUxFRCkgewotICAgIGZwcmludGYoc3RkZXJyLCAib3V0cHV0X2xlbmd0aD0lbGx1XG4iLCBlc3RpbWF0ZWRfc2l6ZSk7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotICByZXR1cm4gbmV3IE91dHB1dFppcEZpbGUoZmRfb3V0LCAodTEqKSB6aXBkYXRhX291dCk7Ci19Ci0KLXU4IFppcEJ1aWxkZXI6OkVzdGltYXRlU2l6ZShjaGFyICoqZmlsZXMpIHsKLSAgc3RydWN0IHN0YXQgc3RhdHN0OwotICAvLyBEaWdpdGFsIHNpZ25hdHVyZSBmaWVsZCBzaXplID0gNiwgRW5kIG9mIGNlbnRyYWwgZGlyZWN0b3J5ID0gMjIsIFRvdGFsID0gMjgKLSAgdTggc2l6ZSA9IDI4OwotICAvLyBDb3VudCB0aGUgc2l6ZSBvZiBhbGwgdGhlIGZpbGVzIGluIHRoZSBpbnB1dCB0byBlc3RpbWF0ZSB0aGUgc2l6ZSBvZiB0aGUKLSAgLy8gb3V0cHV0LgotICBmb3IgKGludCBpID0gMDsgZmlsZXNbaV0gIT0gTlVMTDsgaSsrKSB7Ci0gICAgaWYgKHN0YXQoZmlsZXNbaV0sICZzdGF0c3QpICE9IDApIHsKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiRmlsZSAlcyBkb2VzIG5vdCBzZWVtIHRvIGV4aXN0LiIsIGZpbGVzW2ldKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBzaXplICs9IHN0YXRzdC5zdF9zaXplOwotICAgIC8vIEFkZCBzaXplcyBvZiBaaXAgbWV0YSBkYXRhCi0gICAgLy8gbG9jYWwgZmlsZSBoZWFkZXIgPSAzMCBieXRlcwotICAgIC8vIGRhdGEgZGVzY3JpcHRvciA9IDEyIGJ5dGVzCi0gICAgLy8gY2VudHJhbCBkaXJlY3RvcnkgZGVzY3JpcHRvciA9IDQ2IGJ5dGVzCi0gICAgLy8gICAgVG90YWw6IDg4Ynl0ZXMKLSAgICBzaXplICs9IDg4OwotICAgIC8vIFRoZSBmaWxlbmFtZSBpcyBzdG9yZWQgdHdpY2UgKG9uY2UgaW4gdGhlIGNlbnRyYWwgZGlyZWN0b3J5Ci0gICAgLy8gYW5kIG9uY2UgaW4gdGhlIGxvY2FsIGZpbGUgaGVhZGVyKS4KLSAgICBzaXplICs9IHN0cmxlbihmaWxlc1tpXSkgKiAyOwotICB9Ci0gIHJldHVybiBzaXplOwotfQotCi19ICAvLyBuYW1lc3BhY2UgZGV2dG9vbHNfaWphcgpkaWZmIC0tZ2l0IGEvdG9vbHMvaWphci96aXAuaCBiL3Rvb2xzL2lqYXIvemlwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkYTJjNmUuLjAwMDAwMDAKLS0tIGEvdG9vbHMvaWphci96aXAuaAorKysgL2Rldi9udWxsCkBAIC0xLDE3MyArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLwotLy8gemlwLmggLS0gLnppcCAoLmphcikgZmlsZSByZWFkaW5nL3dyaXRpbmcgcm91dGluZXMuCi0vLwotLy8gVGhpcyBmaWxlIHNwZWNpZmllcyB0aGUgaW50ZXJmYWNlIHRvIHVzZSB0aGUgWklQIGltcGxlbWVudGF0aW9uIG9mIGlqYXIuCi0vLwotCi0jaWZuZGVmIElOQ0xVREVEX1RISVJEX1BBUlRZX0lKQVJfWklQX0gKLSNkZWZpbmUgSU5DTFVERURfVEhJUkRfUEFSVFlfSUpBUl9aSVBfSAotCi0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLQotI2luY2x1ZGUgImNvbW1vbi5oIgotCi1uYW1lc3BhY2UgZGV2dG9vbHNfaWphciB7Ci0KLS8vIFRlbGxzIGlmIHRoaXMgaXMgYSBkaXJlY3RvcnkgZW50cnkgZnJvbSB0aGUgbW9kZS4gVGhpcyBtZXRob2QKLS8vIGlzIHNhZmVyIHRoYW4gemlwYXR0cl90b19tb2RlKGF0dHIpICYgU19JRkRJUiBiZWNhdXNlIHRoZSB1bml4Ci0vLyBtb2RlIG1pZ2h0IG5vdCBiZSBzZXQgaW4gRE9TIHppcCBmaWxlcy4KLWlubGluZSBib29sIHppcGF0dHJfaXNfZGlyKHU0IGF0dHIpIHsgcmV0dXJuIChhdHRyICYgMHgxMCkgIT0gMDsgfQotCi0vLyBDb252ZXJ0IGEgVW5peCBmaWxlIG1vZGUgdG8gYSBaSVAgZmlsZSBhdHRyaWJ1dGUKLWlubGluZSB1NCBtb2RlX3RvX3ppcGF0dHIobW9kZV90IG0pIHsKLSAgcmV0dXJuICgoKHU0KSBtKSA8PCAxNikgKyAoKG0gJiBTX0lGRElSKSAhPSAwID8gMHgxMCA6IDApOwotfQotCi0vLyBDb252ZXJ0IGEgWklQIGZpbGUgYXR0cmlidXRlIHRvIGEgVW5peCBmaWxlIG1vZGUKLWlubGluZSBtb2RlX3QgemlwYXR0cl90b19tb2RlKHU0IGF0dHIpIHsKLSAgcmV0dXJuICgobW9kZV90KSAoKGF0dHIgPj4gMTYpICYgMHhmZmZmKSk7Ci19Ci0KLS8vCi0vLyBDbGFzcyBpbnRlcmZhY2UgZm9yIGJ1aWxkaW5nIFpJUCBmaWxlcwotLy8KLWNsYXNzIFppcEJ1aWxkZXIgewotIHB1YmxpYzoKLSAgdmlydHVhbCB+WmlwQnVpbGRlcigpIHt9Ci0KLSAgLy8gUmV0dXJucyB0aGUgdGV4dCBmb3IgdGhlIGxhc3QgZXJyb3IsIG9yIG51bGwgb24gbm8gbGFzdCBlcnJvci4KLSAgdmlydHVhbCBjb25zdCBjaGFyKiBHZXRFcnJvcigpID0gMDsKLQotICAvLyBBZGQgYSBuZXcgZmlsZSB0byB0aGUgWklQLCB0aGUgZmlsZSB3aWxsIGhhdmUgcGF0aCAiZmlsZW5hbWUiCi0gIC8vIGFuZCBleHRlcm5hbCBhdHRyaWJ1dGVzICJhdHRyIi4gVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgcG9pbnRlcgotICAvLyB0byBhIG1lbW9yeSBidWZmZXIgdG8gd3JpdGUgdGhlIGRhdGEgb2YgdGhlIGZpbGUgaW50by4gVGhpcyBidWZmZXIKLSAgLy8gaXMgb3duZWQgYnkgWmlwQnVpbGRlciBhbmQgc2hvdWxkIG5vdCBiZSBmcmVlJ2QgYnkgdGhlIGNhbGxlci4gVGhlCi0gIC8vIGZpbGUgbGVuZ3RoIGlzIHRoZW4gc3BlY2lmaWVkIHdoZW4gdGhlIGZpbGVzIGlzIGZpbmlzaGVkIHdyaXR0ZW4KLSAgLy8gdXNpbmcgdGhlIEZpbmlzaEZpbGUoc2l6ZV90KSBmdW5jdGlvbi4KLSAgLy8gT24gZmFpbHVyZSwgcmV0dXJucyBOVUxMIGFuZCBHZXRFcnJvcigpIHdpbGwgcmV0dXJuIGFuIG5vbi1lbXB0eSBtZXNzYWdlLgotICB2aXJ0dWFsIHUxKiBOZXdGaWxlKGNvbnN0IGNoYXIqIGZpbGVuYW1lLCBjb25zdCB1NCBhdHRyKSA9IDA7Ci0KLSAgLy8gRmluaXNoIHdyaXRpbmcgYSBmaWxlIGFuZCBzcGVjaWZ5IGl0cyBsZW5ndGguIEFmdGVyIGNhbGxpbmcgdGhpcyBtZXRob2QKLSAgLy8gb25lIHNob3VsZCBub3QgcmV1c2UgdGhlIHBvaW50ZXIgZ2l2ZW4gYnkgTmV3RmlsZS4gVGhlIGZpbGUgY2FuIGJlCi0gIC8vIGNvbXByZXNzZWQgdXNpbmcgdGhlIGRlZmxhdGUgYWxnb3JpdGhtIGJ5IHNldHRpbmcgYGNvbXByZXNzYCB0byB0cnVlLgotICAvLyBCeSBkZWZhdWx0LCBDUkMzMiBhcmUgbm90IGNvbXB1dGVkIGFzIGphdmEgdG9vbGluZyBkb2Vzbid0IGNhcmUsIGJ1dAotICAvLyBjb21wdXRpbmcgaXQgY2FuIGJlIGFjdGl2YXRlZCBieSBzZXR0aW5nIGBjb21wdXRlX2NyY2AgdG8gdHJ1ZS4KLSAgLy8gT24gZmFpbHVyZSwgcmV0dXJucyAtMSBhbmQgR2V0RXJyb3IoKSB3aWxsIHJldHVybiBhbiBub24tZW1wdHkgbWVzc2FnZS4KLSAgdmlydHVhbCBpbnQgRmluaXNoRmlsZShzaXplX3QgZmlsZWxlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGNvbXByZXNzID0gZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBjb21wdXRlX2NyYyA9IGZhbHNlKSA9IDA7Ci0KLSAgLy8gV3JpdGUgYW4gZW1wdHkgZmlsZSwgaXQgaXMgZXF1aXZhbGVudCB0bzoKLSAgLy8gICBOZXdGaWxlKGZpbGVuYW1lLCAwKTsKLSAgLy8gICBGaW5pc2hGaWxlKDApOwotICAvLyBPbiBmYWlsdXJlLCByZXR1cm5zIC0xIGFuZCBHZXRFcnJvcigpIHdpbGwgcmV0dXJuIGFuIG5vbi1lbXB0eSBtZXNzYWdlLgotICB2aXJ0dWFsIGludCBXcml0ZUVtcHR5RmlsZShjb25zdCBjaGFyKiBmaWxlbmFtZSkgPSAwOwotCi0gIC8vIEZpbmlzaCB3cml0aW5nIHRoZSBaSVAgZmlsZS4gVGhpcyBtZXRob2QgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2UKLSAgLy8gKHN1YnNlcXVlbnQgY2FsbHMgd2lsbCBkbyBub3RoaW5nKSBhbmQgbm9uZSBvZgotICAvLyBOZXdGaWxlL0ZpbmlzaEZpbGUvV3JpdGVFbXB0eUZpbGUgc2hvdWxkIGJlIGNhbGxlZCBhZnRlciBjYWxsaW5nIEZpbmlzaC4gSWYKLSAgLy8gdGhpcyBtZXRob2Qgd2FzIG5vdCBjYWxsZWQgd2hlbiB0aGUgb2JqZWN0IGlzIGRlc3Ryb3llZCwgaXQgd2lsbCBiZSBjYWxsZWQuCi0gIC8vIEl0IGlzIGhlcmUgYXMgYSBjb252ZW5pZW5jZSB0byBnZXQgaW5mb3JtYXRpb24gb24gdGhlIGZpbmFsIGdlbmVyYXRlZCBaSVAKLSAgLy8gZmlsZS4KLSAgLy8gT24gZmFpbHVyZSwgcmV0dXJucyAtMSBhbmQgR2V0RXJyb3IoKSB3aWxsIHJldHVybiBhbiBub24tZW1wdHkgbWVzc2FnZS4KLSAgdmlydHVhbCBpbnQgRmluaXNoKCkgPSAwOwotCi0gIC8vIEdldCB0aGUgY3VycmVudCBzaXplIG9mIHRoZSBaSVAgZmlsZS4gVGhpcyBzaXplIHdpbGwgbm90IGJlIG1hdGNoaW5nIHRoZQotICAvLyBmaW5hbCBaSVAgZmlsZSB1bnRpbCBGaW5pc2goKSBoYXMgYmVlbiBjYWxsZWQgYmVjYXVzZSBGaW5pc2goKSBpcyBhY3R1YWxseQotICAvLyB3cml0aW5nIHRoZSBjZW50cmFsIGRpcmVjdG9yeSBvZiB0aGUgWklQIEZpbGUuCi0gIHZpcnR1YWwgc2l6ZV90IEdldFNpemUoKSA9IDA7Ci0KLSAgLy8gUmV0dXJucyB0aGUgY3VycmVudCBudW1iZXIgb2YgZmlsZXMgc3RvcmVkIGluIHRoZSBaSVAuCi0gIHZpcnR1YWwgaW50IEdldE51bWJlckZpbGVzKCkgPSAwOwotCi0gIC8vIENyZWF0ZSBhIG5ldyBaaXBCdWlsZGVyIHdyaXRpbmcgdGhlIGZpbGUgemlwX2ZpbGUgYW5kIHRoZSBzaXplIG9mIHRoZQotICAvLyBvdXRwdXQgd2lsbCBiZSBhdCBtb3N0IGVzdGltYXRlZF9zaXplLiBVc2UgWmlwQnVpbGRlcjo6RXN0aW1hdGVTaXplKCkgb3IKLSAgLy8gWmlwRXh0cmFjdG9yOjpDYWxjdWxhdGVPdXB1dExlbmd0aCgpIHRvIGhhdmUgYW4gZXN0aW1hdGVkX3NpemUgZGVwZW5kaW5nIG9uCi0gIC8vIGEgbGlzdCBvZiBmaWxlIHRvIHN0b3JlLgotICAvLyBPbiBmYWlsdXJlLCByZXR1cm5zIE5VTEwuIFJlZmVyIHRvIGVycm5vIGZvciBlcnJvciBjb2RlLgotICBzdGF0aWMgWmlwQnVpbGRlciogQ3JlYXRlKGNvbnN0IGNoYXIqIHppcF9maWxlLCB1OCBlc3RpbWF0ZWRfc2l6ZSk7Ci0KLSAgLy8gRXN0aW1hdGUgdGhlIG1heGltdW0gc2l6ZSBvZiB0aGUgWklQIGZpbGVzIGNvbnRhaW5pbmcgZmlsZXMgaW4gdGhlICJmaWxlcyIKLSAgLy8gbnVsbC10ZXJtaW5hdGVkIGFycmF5LgotICAvLyBSZXR1cm5zIDAgb24gZXJyb3IuCi0gIHN0YXRpYyB1OCBFc3RpbWF0ZVNpemUoY2hhciAqKmZpbGVzKTsKLX07Ci0KLS8vCi0vLyBBbiBhYnN0cmFjdCBjbGFzcyB0byBwcm9jZXNzIGRhdGEgZnJvbSBhIFppcEV4dHJhY3Rvci4KLS8vIERlcml2ZSBmcm9tIHRoaXMgY2xhc3MgaWYgeW91IHdpc2ggdG8gcHJvY2VzcyBkYXRhIGZyb20gYSBaaXBFeHRyYWN0b3IuCi0vLwotY2xhc3MgWmlwRXh0cmFjdG9yUHJvY2Vzc29yIHsKLSBwdWJsaWM6Ci0gIHZpcnR1YWwgflppcEV4dHJhY3RvclByb2Nlc3NvcigpIHt9Ci0KLSAgLy8gVGVsbHMgd2hldGhlciB0byBza2lwIG9yIHByb2Nlc3MgdGhlIGZpbGUgImZpbGVuYW1lIi4gImF0dHIiIGlzIHRoZQotICAvLyBleHRlcm5hbCBmaWxlIGF0dHJpYnV0ZXMgYW5kIGNhbiBiZSBjb252ZXJ0ZWQgdG8gdW5peCBtb2RlIHVzaW5nIHRoZQotICAvLyB6aXBhdHRyX3RvX21vZGUoKSBmdW5jdGlvbi4gVGhpcyBtZXRob2QgaXMgc3VwcG9lZCB0byByZXR1cm5zIHRydWUKLSAgLy8gaWYgdGhlIGZpbGUgc2hvdWxkIGJlIHByb2Nlc3NlZCBhbmQgZmFsc2UgaWYgaXQgc2hvdWxkIGJlIHNraXBwZWQuCi0gIHZpcnR1YWwgYm9vbCBBY2NlcHQoY29uc3QgY2hhciogZmlsZW5hbWUsIGNvbnN0IHU0IGF0dHIpID0gMDsKLQotICAvLyBQcm9jZXNzIGEgZmlsZSBhY2NlcHRlZCBieSBBY2NlcHQuIFRoZSBmaWxlICJmaWxlbmFtZSIgaGFzIGV4dGVybmFsCi0gIC8vIGF0dHJpYnV0ZXMgImF0dHIiIGFuZCBsZW5ndGggInNpemUiLiBUaGUgZmlsZSBjb250ZW50IGlzIGFjY2Vzc2libGUKLSAgLy8gaW4gdGhlIGJ1ZmZlciBwb2ludGVkIGJ5ICJkYXRhIi4KLSAgdmlydHVhbCB2b2lkIFByb2Nlc3MoY29uc3QgY2hhciogZmlsZW5hbWUsIGNvbnN0IHU0IGF0dHIsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHUxKiBkYXRhLCBjb25zdCBzaXplX3Qgc2l6ZSkgPSAwOwotfTsKLQotLy8KLS8vIENsYXNzIGludGVyZmFjZSBmb3IgcmVhZGluZyBaSVAgZmlsZXMKLS8vCi1jbGFzcyBaaXBFeHRyYWN0b3IgewotIHB1YmxpYzoKLSAgdmlydHVhbCB+WmlwRXh0cmFjdG9yKCkge30KLQotICAvLyBSZXR1cm5zIHRoZSB0ZXh0IGZvciB0aGUgbGFzdCBlcnJvciwgb3IgbnVsbCBvbiBubyBsYXN0IGVycm9yLgotICB2aXJ0dWFsIGNvbnN0IGNoYXIqIEdldEVycm9yKCkgPSAwOwotCi0gIC8vIFByb2Nlc3MgdGhlIG5leHQgZmlsZXMsIHJldHVybnMgZmFsc2UgaWYgdGhlIGVuZCBvZiBaSVAgZmlsZSBoYXMgYmVlbgotICAvLyByZWFjaGVkLiBUaGUgcHJvY2Vzc29yIHByb3ZpZGVkIGJ5IHRoZSBDcmVhdGUgbWV0aG9kIHdpbGwgYmUgY2FsbGVkCi0gIC8vIGlmIGEgZmlsZSBpcyBlbmNvdW50ZXJlZC4gSWYgZmFsc2UgaXMgcmV0dXJuZWQsIGNoZWNrIHRoZSByZXR1cm4gdmFsdWUKLSAgLy8gb2YgR2V0RXJyb3IoKSBmb3IgcG90ZW50aWFsIGVycm9ycy4KLSAgdmlydHVhbCBib29sIFByb2Nlc3NOZXh0KCkgPSAwOwotCi0gIC8vIFByb2Nlc3MgdGhlIGFsbCBmaWxlcywgcmV0dXJucyAtMSBvbiBlcnJvciAoR2V0RXJyb3IoKSB3aWxsIGJlIHBvcHVsYXRlZAotICAvLyBvbiBlcnJvcikuCi0gIHZpcnR1YWwgaW50IFByb2Nlc3NBbGwoKTsKLQotICAvLyBSZXNldCB0aGUgZmlsZSBwb2ludGVyIHRvIHRoZSBiZWdpbm5pbmcuCi0gIHZpcnR1YWwgdm9pZCBSZXNldCgpID0gMDsKLQotICAvLyBSZXR1cm4gdGhlIHNpemUgb2YgdGhlIFpJUCBmaWxlLgotICB2aXJ0dWFsIHNpemVfdCBHZXRTaXplKCkgPSAwOwotCi0gIC8vIFJldHVybiB0aGUgc2l6ZSBvZiB0aGUgcmVzdWx0aW5nIHppcCBmaWxlIGJ5IGtlZXBpbmcgb25seSBmaWxlCi0gIC8vIGFjY2VwdGVkIGJ5IHRoZSBwcm9jZXNzb3IgYW5kIHN0b3JpbmcgdGhlbSB1bmNvbXByZXNzZWQuIFRoaXMKLSAgLy8gbWV0aG9kIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBhIFppcEJ1aWxkZXIgZm9yIHN0b3JpbmcgYSBzdWJzZXQKLSAgLy8gb2YgdGhlIGlucHV0IGZpbGVzLgotICAvLyBPbiBlcnJvciwgMCBpcyByZXR1cm5lZCBhbmQgR2V0RXJyb3IoKSByZXR1cm5zIGEgbm9uLWVtcHR5IG1lc3NhZ2UuCi0gIHZpcnR1YWwgdTggQ2FsY3VsYXRlT3V0cHV0TGVuZ3RoKCkgPSAwOwotCi0gIC8vIENyZWF0ZSBhIFppcEV4dHJhY3RvciB0aGF0IGV4dHJhY3QgdGhlIHppcCBmaWxlICJmaWxlbmFtZSIgYW5kIHByb2Nlc3MKLSAgLy8gaXQgd2l0aCAicHJvY2Vzc29yIi4KLSAgLy8gT24gZXJyb3IsIGEgbnVsbCBwb2ludGVyIGlzIHJldHVybmVkIGFuZCB0aGUgdmFsdWUgb2YgZXJybm8gc2hvdWxkIGJlCi0gIC8vIGNoZWNrZWQuCi0gIHN0YXRpYyBaaXBFeHRyYWN0b3IqIENyZWF0ZShjb25zdCBjaGFyKiBmaWxlbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFppcEV4dHJhY3RvclByb2Nlc3NvciAqcHJvY2Vzc29yKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBkZXZ0b29sc19pamFyCi0KLSNlbmRpZiAgLy8gSU5DTFVERURfVEhJUkRfUEFSVFlfSUpBUl9aSVBfSApkaWZmIC0tZ2l0IGEvdG9vbHMvaWphci96aXBfbWFpbi5jYyBiL3Rvb2xzL2lqYXIvemlwX21haW4uY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmNGE1MGMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvaWphci96aXBfbWFpbi5jYworKysgL2Rldi9udWxsCkBAIC0xLDMxMiArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8KLS8vIEF1dGhvcjogQWxhbiBEb25vdmFuIDxhZG9ub3ZhbkBnb29nbGUuY29tPgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLS8vCi0vLyBaaXAgLyBVbnppcCBmaWxlIHVzaW5nIGlqYXIgemlwIGltcGxlbWVudGF0aW9uLgotLy8KLS8vIE5vdGUgdGhhdCB0aGlzIFppcCBpbXBsZW1lbnRhdGlvbiBpbnRlbnRpb25hbGx5IGRvbid0IGNvbXB1dGUgQ1JDLTMyCi0vLyBiZWNhdXNlIGl0IGlzIHVzZWxlc3MgY29tcHV0YXRpb24gZm9yIGphciBiZWNhdXNlIEphdmEgZG9lc24ndCBjYXJlLgotLy8gQ1JDLTMyIG9mIGFsbCBmaWxlcyBpbiB0aGUgemlwIGZpbGUgd2lsbCBiZSBzZXQgdG8gMC4KLS8vCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPGxpbWl0cy5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8c3lzL21tYW4uaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPG1lbW9yeT4KLQotI2luY2x1ZGUgInppcC5oIgotCi1uYW1lc3BhY2UgZGV2dG9vbHNfaWphciB7Ci0KLSNkZWZpbmUgU1lTQ0FMTChleHByKSAgZG8geyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChleHByKSA8IDApIHsgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVycm9yKCNleHByKTsgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJvcnQoKTsgXAotICAgICAgICAgICAgICAgICAgICAgICAgIH0gXAotICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlICgwKQotCi0vLwotLy8gQSBaaXBFeHRyYWN0b3JQcm9jZXNzb3IgdGhhdCBleHRyYWN0IGFsbCBmaWxlcyBpbiB0aGUgWklQIGZpbGUuCi0vLwotY2xhc3MgVW56aXBQcm9jZXNzb3IgOiBwdWJsaWMgWmlwRXh0cmFjdG9yUHJvY2Vzc29yIHsKLSBwdWJsaWM6Ci0gIC8vIENyZWF0ZSBhIHByb2Nlc3NvciB3aG8gd2lsbCBleHRyYWN0IHRoZSBmaWxlcyBpbnRvIG91dHB1dF9yb290Ci0gIC8vIGlmICJleHRyYWN0IiBpcyBzZXQgdG8gdHJ1ZSBhbmQgd2lsbCBwcmludCB0aGUgbGlzdCBvZiBmaWxlcyBhbmQKLSAgLy8gdGhlaXIgdW5peCBtb2RlcyBpZiAidmVyYm9zZSIgaXMgc2V0IHRvIHRydWUuCi0gIFVuemlwUHJvY2Vzc29yKGNvbnN0IGNoYXIgKm91dHB1dF9yb290LCBib29sIHZlcmJvc2UsIGJvb2wgZXh0cmFjdCkKLSAgICA6IG91dHB1dF9yb290XyhvdXRwdXRfcm9vdCksIHZlcmJvc2VfKHZlcmJvc2UpLCBleHRyYWN0XyhleHRyYWN0KSB7fQotICB2aXJ0dWFsIH5VbnppcFByb2Nlc3NvcigpIHt9Ci0KLSAgdmlydHVhbCB2b2lkIFByb2Nlc3MoY29uc3QgY2hhciogZmlsZW5hbWUsIGNvbnN0IHU0IGF0dHIsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHUxKiBkYXRhLCBjb25zdCBzaXplX3Qgc2l6ZSk7Ci0gIHZpcnR1YWwgYm9vbCBBY2NlcHQoY29uc3QgY2hhciogZmlsZW5hbWUsIGNvbnN0IHU0IGF0dHIpIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgY29uc3QgY2hhciAqb3V0cHV0X3Jvb3RfOwotICBjb25zdCBib29sIHZlcmJvc2VfOwotICBjb25zdCBib29sIGV4dHJhY3RfOwotfTsKLQotLy8gQ29uY2F0ZW5lIDIgcGF0aCwgcGF0aDEgYW5kIHBhdGgyLCB1c2luZyAvIGFzIGEgZGlyZWN0b3J5IHNlcGFyYXRvciBhbmQKLS8vIHB1dGluZyB0aGUgcmVzdWx0IGluICJvdXQiLiAic2l6ZSIgc3BlY2lmeSB0aGUgc2l6ZSBvZiB0aGUgb3V0cHV0IGJ1ZmZlcgotdm9pZCBjb25jYXRfcGF0aChjaGFyKiBvdXQsIGNvbnN0IHNpemVfdCBzaXplLAotICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpwYXRoMSwgY29uc3QgY2hhciAqcGF0aDIpIHsKLSAgaW50IGxlbjEgPSBzdHJsZW4ocGF0aDEpOwotICBzaXplX3QgbCA9IGxlbjE7Ci0gIHN0cm5jcHkob3V0LCBwYXRoMSwgc2l6ZSAtIDEpOwotICBvdXRbc2l6ZS0xXSA9IDA7Ci0gIGlmIChsIDwgc2l6ZSAtIDEgJiYgcGF0aDFbbGVuMV0gIT0gJy8nICYmIHBhdGgyWzBdICE9ICcvJykgewotICAgIG91dFtsXSA9ICcvJzsKLSAgICBsKys7Ci0gICAgb3V0W2xdID0gMDsKLSAgfQotICBpZiAobCA8IHNpemUgLSAxKSB7Ci0gICAgc3RybmNhdChvdXQsIHBhdGgyLCBzaXplIC0gMSAtIGwpOwotICB9Ci19Ci0KLS8vIERvIGEgcmVjdXJzaXZlIG1rZGlyIG9mIGFsbCBmb2xkZXJzIG9mIHBhdGggZXhjZXB0IHRoZSBsYXN0IHBhdGgKLS8vIHNlZ21lbnQgKGlmIHBhdGggZW5kcyB3aXRoIGEgLyB0aGVuIHRoZSBsYXN0IHBhdGggc2VnbWVudCBpcyBlbXB0eSkuCi0vLyBBbGwgZm9sZGVycyBhcmUgY3JlYXRlZCB1c2luZyAibW9kZSIgZm9yIGNyZWF0aW9uIG1vZGUuCi12b2lkIG1rZGlycyhjb25zdCBjaGFyICpwYXRoLCBtb2RlX3QgbW9kZSkgewotICBjaGFyIHBhdGhfW1BBVEhfTUFYXTsKLSAgc3RydWN0IHN0YXQgc3RhdHN0OwotICBzdHJuY3B5KHBhdGhfLCBwYXRoLCBQQVRIX01BWCk7Ci0gIHBhdGhfW1BBVEhfTUFYLTFdID0gMDsKLSAgY2hhciAqcG9pbnRlciA9IHBhdGhfOwotICB3aGlsZSAoKHBvaW50ZXIgPSBzdHJjaHIocG9pbnRlciwgJy8nKSkgIT0gTlVMTCkgewotICAgIGlmIChwYXRoXyAhPSBwb2ludGVyKSB7ICAvLyBza2lwIGxlYWRpbmcgc2xhc2gKLSAgICAgICpwb2ludGVyID0gMDsKLSAgICAgIGlmIChzdGF0KHBhdGhfLCAmc3RhdHN0KSAhPSAwKSB7Ci0gICAgICAgIGlmIChta2RpcihwYXRoXywgbW9kZSkgPCAwKSB7Ci0gICAgICAgICAgZnByaW50ZihzdGRlcnIsICJDYW5ub3QgY3JlYXRlIGZvbGRlciAlczogJXNcbiIsCi0gICAgICAgICAgICAgICAgICBwYXRoXywgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgICBhYm9ydCgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAqcG9pbnRlciA9ICcvJzsKLSAgICB9Ci0gICAgcG9pbnRlcisrOwotICB9Ci19Ci0KLXZvaWQgVW56aXBQcm9jZXNzb3I6OlByb2Nlc3MoY29uc3QgY2hhciogZmlsZW5hbWUsIGNvbnN0IHU0IGF0dHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHUxKiBkYXRhLCBjb25zdCBzaXplX3Qgc2l6ZSkgewotICBtb2RlX3QgbW9kZSA9IHppcGF0dHJfdG9fbW9kZShhdHRyKTsKLSAgbW9kZV90IHBlcm0gPSBtb2RlICYgMDc3NzsKLSAgYm9vbCBpc2RpciA9IChtb2RlICYgU19JRkRJUikgIT0gMDsKLSAgaWYgKGF0dHIgPT0gMCkgewotICAgIC8vIEZhbGxiYWNrIHdoZW4gdGhlIGV4dGVybmFsIGF0dHJpYnV0ZSBpcyBub3Qgc2V0LgotICAgIGlzZGlyID0gZmlsZW5hbWVbc3RybGVuKGZpbGVuYW1lKS0xXSA9PSAnLyc7Ci0gICAgcGVybSA9IDA3Nzc7Ci0gIH0KLSAgaWYgKHZlcmJvc2VfKSB7Ci0gICAgcHJpbnRmKCIlYyAlbyAlc1xuIiwgaXNkaXIgPyAnZCcgOiAnZicsIHBlcm0sIGZpbGVuYW1lKTsKLSAgfQotICBpZiAoZXh0cmFjdF8pIHsKLSAgICBjaGFyIHBhdGhbUEFUSF9NQVhdOwotICAgIGludCBmZDsKLSAgICBjb25jYXRfcGF0aChwYXRoLCBQQVRIX01BWCwgb3V0cHV0X3Jvb3RfLCBmaWxlbmFtZSk7Ci0gICAgbWtkaXJzKHBhdGgsIHBlcm0pOwotICAgIGlmICghaXNkaXIpIHsKLSAgICAgIGZkID0gb3BlbihwYXRoLCBPX0NSRUFUIHwgT19XUk9OTFksIHBlcm0pOwotICAgICAgaWYgKGZkIDwgMCkgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNhbm5vdCBvcGVuIGZpbGUgJXMgZm9yIHdyaXRpbmc6ICVzXG4iLAotICAgICAgICAgICAgICAgIHBhdGgsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgIGFib3J0KCk7Ci0gICAgICB9Ci0gICAgICBTWVNDQUxMKHdyaXRlKGZkLCBkYXRhLCBzaXplKSk7Ci0gICAgICBTWVNDQUxMKGNsb3NlKGZkKSk7Ci0gICAgfQotICB9Ci19Ci0KLS8vIEdldCB0aGUgYmFzZW5hbWUgb2YgcGF0aCBhbmQgc3RvcmUgaXQgaW4gb3V0cHV0LiBvdXRwdXRfc2l6ZQotLy8gaXMgdGhlIHNpemUgb2YgdGhlIG91dHB1dCBidWZmZXIuCi12b2lkIGJhc2VuYW1lKGNvbnN0IGNoYXIgKnBhdGgsIGNoYXIgKm91dHB1dCwgc2l6ZV90IG91dHB1dF9zaXplKSB7Ci0gIGNvbnN0IGNoYXIgKnBvaW50ZXIgPSBzdHJyY2hyKHBhdGgsICcvJyk7Ci0gIGlmIChwb2ludGVyID09IE5VTEwpIHsKLSAgICBwb2ludGVyID0gcGF0aDsKLSAgfSBlbHNlIHsKLSAgICBwb2ludGVyKys7ICAvLyBTa2lwIHRoZSBsZWFkaW5nIHNsYXNoLgotICB9Ci0gIHN0cm5jcHkob3V0cHV0LCBwb2ludGVyLCBvdXRwdXRfc2l6ZSk7Ci0gIG91dHB1dFtvdXRwdXRfc2l6ZS0xXSA9IDA7Ci19Ci0KLQotLy8gRXhlY3V0ZSB0aGUgZXh0cmFjdGlvbiAob3IganVzdCBsaXN0aW5nIGlmIGp1c3QgdiBpcyBwcm92aWRlZCkKLWludCBleHRyYWN0KGNoYXIgKnppcGZpbGUsIGJvb2wgdmVyYm9zZSwgYm9vbCBleHRyYWN0KSB7Ci0gIGNoYXIgb3V0cHV0X3Jvb3RbUEFUSF9NQVhdOwotICBnZXRjd2Qob3V0cHV0X3Jvb3QsIFBBVEhfTUFYKTsKLQotICBVbnppcFByb2Nlc3NvciBwcm9jZXNzb3Iob3V0cHV0X3Jvb3QsIHZlcmJvc2UsIGV4dHJhY3QpOwotICBzdGQ6OnVuaXF1ZV9wdHI8WmlwRXh0cmFjdG9yPiBleHRyYWN0b3IoWmlwRXh0cmFjdG9yOjpDcmVhdGUoemlwZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwcm9jZXNzb3IpKTsKLSAgaWYgKGV4dHJhY3Rvci5nZXQoKSA9PSBOVUxMKSB7Ci0gICAgZnByaW50ZihzdGRlcnIsICJVbmFibGUgdG8gb3BlbiB6aXAgZmlsZSAlczogJXMuXG4iLCB6aXBmaWxlLAotICAgICAgICAgICAgc3RyZXJyb3IoZXJybm8pKTsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLQotICBpZiAoZXh0cmFjdG9yLT5Qcm9jZXNzQWxsKCkgPCAwKSB7Ci0gICAgZnByaW50ZihzdGRlcnIsICIlcy5cbiIsIGV4dHJhY3Rvci0+R2V0RXJyb3IoKSk7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0gIHJldHVybiAwOwotfQotCi0vLyBFeGVjdXRlIHRoZSBjcmVhdGUgb3BlcmF0aW9uCi1pbnQgY3JlYXRlKGNoYXIgKnppcGZpbGUsIGNoYXIgKipmaWxlcywgYm9vbCBmbGF0dGVuLCBib29sIHZlcmJvc2UsCi0gICAgICAgICAgIGJvb2wgY29tcHJlc3MpIHsKLSAgc3RydWN0IHN0YXQgc3RhdHN0OwotICB1OCBzaXplID0gWmlwQnVpbGRlcjo6RXN0aW1hdGVTaXplKGZpbGVzKTsKLSAgaWYgKHNpemUgPT0gMCkgewotICAgIHJldHVybiAtMTsKLSAgfQotICBzdGQ6OnVuaXF1ZV9wdHI8WmlwQnVpbGRlcj4gYnVpbGRlcihaaXBCdWlsZGVyOjpDcmVhdGUoemlwZmlsZSwgc2l6ZSkpOwotICBpZiAoYnVpbGRlci5nZXQoKSA9PSBOVUxMKSB7Ci0gICAgZnByaW50ZihzdGRlcnIsICJVbmFibGUgdG8gY3JlYXRlIHppcCBmaWxlICVzOiAlcy5cbiIsCi0gICAgICAgICAgICB6aXBmaWxlLCBzdHJlcnJvcihlcnJubykpOwotICAgIHJldHVybiAtMTsKLSAgfQotICBmb3IgKGludCBpID0gMDsgZmlsZXNbaV0gIT0gTlVMTDsgaSsrKSB7Ci0gICAgc3RhdChmaWxlc1tpXSwgJnN0YXRzdCk7Ci0gICAgY2hhciBwYXRoW1BBVEhfTUFYXTsKLSAgICBib29sIGlzZGlyID0gKHN0YXRzdC5zdF9tb2RlICYgU19JRkRJUikgIT0gMDsKLQotICAgIGlmIChmbGF0dGVuICYmIGlzZGlyKSB7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0KLSAgICAvLyBDb21wdXRlIHRoZSBwYXRoLCBmbGF0dGVuaW5nIGl0IGlmIHJlcXVlc3RlZAotICAgIGlmIChmbGF0dGVuKSB7Ci0gICAgICBiYXNlbmFtZShmaWxlc1tpXSwgcGF0aCwgUEFUSF9NQVgpOwotICAgIH0gZWxzZSB7Ci0gICAgICBzdHJuY3B5KHBhdGgsIGZpbGVzW2ldLCBQQVRIX01BWCk7Ci0gICAgICBwYXRoW1BBVEhfTUFYLTFdID0gMDsKLSAgICAgIHNpemVfdCBsZW4gPSBzdHJsZW4ocGF0aCk7Ci0gICAgICBpZiAoaXNkaXIgJiYgbGVuIDwgUEFUSF9NQVggLSAxKSB7Ci0gICAgICAgIC8vIEFkZCB0aGUgdHJhaWxpbmcgc2xhc2ggZm9yIGZvbGRlcnMKLSAgICAgICAgcGF0aFtsZW5dID0gJy8nOwotICAgICAgICBwYXRoW2xlbisxXSA9IDA7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKHZlcmJvc2UpIHsKLSAgICAgIG1vZGVfdCBwZXJtID0gc3RhdHN0LnN0X21vZGUgJiAwNzc3OwotICAgICAgcHJpbnRmKCIlYyAlbyAlc1xuIiwgaXNkaXIgPyAnZCcgOiAnZicsIHBlcm0sIHBhdGgpOwotICAgIH0KLQotICAgIHUxICpidWZmZXIgPSBidWlsZGVyLT5OZXdGaWxlKHBhdGgsIG1vZGVfdG9femlwYXR0cihzdGF0c3Quc3RfbW9kZSkpOwotICAgIGlmIChpc2RpciB8fCBzdGF0c3Quc3Rfc2l6ZSA9PSAwKSB7Ci0gICAgICBidWlsZGVyLT5GaW5pc2hGaWxlKDApOwotICAgIH0gZWxzZSB7Ci0gICAgICAvLyBtbWFwIHRoZSBpbnB1dCBmaWxlIGFuZCBtZW1jcHkKLSAgICAgIGludCBmZCA9IG9wZW4oZmlsZXNbaV0sIE9fUkRPTkxZKTsKLSAgICAgIGlmIChmZCA8IDApIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJDYW4ndCBvcGVuIGZpbGUgJXMgZm9yIHJlYWRpbmc6ICVzLlxuIiwKLSAgICAgICAgICAgICAgICBmaWxlc1tpXSwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgICAgfQotICAgICAgdm9pZCAqZGF0YSA9IG1tYXAoTlVMTCwgc3RhdHN0LnN0X3NpemUsIFBST1RfUkVBRCwgTUFQX1BSSVZBVEUsIGZkLCAwKTsKLSAgICAgIGlmIChkYXRhID09IE1BUF9GQUlMRUQpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJDYW4ndCBtbWFwIGZpbGUgJXMgZm9yIHJlYWRpbmc6ICVzLlxuIiwKLSAgICAgICAgICAgICAgICBmaWxlc1tpXSwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgICAgfQotICAgICAgbWVtY3B5KGJ1ZmZlciwgZGF0YSwgc3RhdHN0LnN0X3NpemUpOwotICAgICAgbXVubWFwKGRhdGEsIHN0YXRzdC5zdF9zaXplKTsKLSAgICAgIGJ1aWxkZXItPkZpbmlzaEZpbGUoc3RhdHN0LnN0X3NpemUsIGNvbXByZXNzLCB0cnVlKTsKLSAgICB9Ci0gIH0KLSAgaWYgKGJ1aWxkZXItPkZpbmlzaCgpIDwgMCkgewotICAgIGZwcmludGYoc3RkZXJyLCAiJXNcbiIsIGJ1aWxkZXItPkdldEVycm9yKCkpOwotICAgIHJldHVybiAtMTsKLSAgfQotICByZXR1cm4gMDsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGRldnRvb2xzX2lqYXIKLQotLy8KLS8vIG1haW4gbWV0aG9kCi0vLwotc3RhdGljIHZvaWQgdXNhZ2UoY2hhciAqcHJvZ25hbWUpIHsKLSAgZnByaW50ZihzdGRlcnIsICJVc2FnZTogJXMgW3Z4Y1tmQ11dIHguemlwIFtmaWxlMS4uLmZpbGVuXVxuIiwgcHJvZ25hbWUpOwotICBmcHJpbnRmKHN0ZGVyciwgIiAgdiB2ZXJib3NlIC0gbGlzdCBhbGwgZmlsZSBpbiB4LnppcFxuIik7Ci0gIGZwcmludGYoc3RkZXJyLCAiICB4IGV4dHJhY3QgLSBleHRyYWN0IGZpbGUgaW4geC56aXAgaW4gY3VycmVudCBkaXJlY3RvcnlcbiIpOwotICBmcHJpbnRmKHN0ZGVyciwgIiAgYyBjcmVhdGUgIC0gYWRkIGZpbGVzIHRvIHguemlwXG4iKTsKLSAgZnByaW50ZihzdGRlcnIsICIgIGYgZmxhdHRlbiAtIGZsYXR0ZW4gZmlsZXMgdG8gdXNlIHdpdGggY3JlYXRlIG9wZXJhdGlvblxuIik7Ci0gIGZwcmludGYoc3RkZXJyLAotICAgICAgICAgICIgIEMgY29tcHJlc3MgLSBjb21wcmVzcyBmaWxlcyB3aGVuIHVzaW5nIHRoZSBjcmVhdGUgb3BlcmF0aW9uXG4iKTsKLSAgZnByaW50ZihzdGRlcnIsICJ4IGFuZCBjIGNhbm5vdCBiZSB1c2VkIGluIHRoZSBzYW1lIGNvbW1hbmQtbGluZS5cbiIpOwotICBleGl0KDEpOwotfQotCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKLSAgYm9vbCBleHRyYWN0ID0gZmFsc2U7Ci0gIGJvb2wgdmVyYm9zZSA9IGZhbHNlOwotICBib29sIGNyZWF0ZSA9IGZhbHNlOwotICBib29sIGNvbXByZXNzID0gZmFsc2U7Ci0gIGJvb2wgZmxhdHRlbiA9IGZhbHNlOwotCi0gIGlmIChhcmdjIDwgMykgewotICAgIHVzYWdlKGFyZ3ZbMF0pOwotICB9Ci0KLSAgZm9yIChpbnQgaSA9IDA7IGFyZ3ZbMV1baV0gIT0gMDsgaSsrKSB7Ci0gICAgc3dpdGNoIChhcmd2WzFdW2ldKSB7Ci0gICAgY2FzZSAneCc6Ci0gICAgICBleHRyYWN0ID0gdHJ1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ3YnOgotICAgICAgdmVyYm9zZSA9IHRydWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdjJzoKLSAgICAgIGNyZWF0ZSA9IHRydWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdmJzoKLSAgICAgIGZsYXR0ZW4gPSB0cnVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnQyc6Ci0gICAgICBjb21wcmVzcyA9IHRydWU7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgdXNhZ2UoYXJndlswXSk7Ci0gICAgfQotICB9Ci0gIGlmIChjcmVhdGUpIHsKLSAgICBpZiAoZXh0cmFjdCkgewotICAgICAgdXNhZ2UoYXJndlswXSk7Ci0gICAgfQotICAgIC8vIENyZWF0ZSBhIHppcAotICAgIHJldHVybiBkZXZ0b29sc19pamFyOjpjcmVhdGUoYXJndlsyXSwgYXJndiArIDMsIGZsYXR0ZW4sIHZlcmJvc2UsIGNvbXByZXNzKTsKLSAgfSBlbHNlIHsKLSAgICBpZiAoZmxhdHRlbikgewotICAgICAgdXNhZ2UoYXJndlswXSk7Ci0gICAgfQotICAgIC8vIEV4dHJhY3Rpb24gLyBsaXN0IG1vZGUKLSAgICByZXR1cm4gZGV2dG9vbHNfaWphcjo6ZXh0cmFjdChhcmd2WzJdLCB2ZXJib3NlLCBleHRyYWN0KTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvamF2YS1ldmVudC1sb2ctdGFncy5weSBiL3Rvb2xzL2phdmEtZXZlbnQtbG9nLXRhZ3MucHkKaW5kZXggZjM2NDc1MS4uMzdjZDcxMiAxMDA3NTUKLS0tIGEvdG9vbHMvamF2YS1ldmVudC1sb2ctdGFncy5weQorKysgYi90b29scy9qYXZhLWV2ZW50LWxvZy10YWdzLnB5CkBAIC01MSwzMCArNTEsMzcgQEAKICAgICBwcmludCA+PiBzeXMuc3RkZXJyLCAidW5oYW5kbGVkIG9wdGlvbiAlcyIgJSAobywpCiAgICAgc3lzLmV4aXQoMSkKIAotaWYgbGVuKGFyZ3MpICE9IDI6Ci0gIHByaW50ICJuZWVkIGV4YWN0bHkgdHdvIGlucHV0IGZpbGVzLCBub3QgJWQiICUgKGxlbihhcmdzKSwpCitpZiBsZW4oYXJncykgIT0gMSBhbmQgbGVuKGFyZ3MpICE9IDI6CisgIHByaW50ICJuZWVkIG9uZSBvciB0d28gaW5wdXQgZmlsZXMsIG5vdCAlZCIgJSAobGVuKGFyZ3MpLCkKICAgcHJpbnQgX19kb2NfXwogICBzeXMuZXhpdCgxKQogCiBmbiA9IGFyZ3NbMF0KIHRhZ2ZpbGUgPSBldmVudF9sb2dfdGFncy5UYWdGaWxlKGZuKQogCi0jIExvYWQgdGhlIG1lcmdlZCB0YWcgZmlsZSAod2hpY2ggc2hvdWxkIGhhdmUgbnVtYmVycyBhc3NpZ25lZCBmb3IgYWxsCi0jIHRhZ3MuICBVc2UgdGhlIG51bWJlcnMgZnJvbSB0aGUgbWVyZ2VkIGZpbGUgdG8gZmlsbCBpbiBhbnkgbWlzc2luZwotIyBudW1iZXJzIGZyb20gdGhlIGlucHV0IGZpbGUuCi1tZXJnZWRfZm4gPSBhcmdzWzFdCi1tZXJnZWRfdGFnZmlsZSA9IGV2ZW50X2xvZ190YWdzLlRhZ0ZpbGUobWVyZ2VkX2ZuKQotbWVyZ2VkX2J5X25hbWUgPSBkaWN0KFsodC50YWduYW1lLCB0KSBmb3IgdCBpbiBtZXJnZWRfdGFnZmlsZS50YWdzXSkKLWZvciB0IGluIHRhZ2ZpbGUudGFnczoKLSAgaWYgdC50YWdudW0gaXMgTm9uZToKLSAgICBpZiB0LnRhZ25hbWUgaW4gbWVyZ2VkX2J5X25hbWU6Ci0gICAgICB0LnRhZ251bSA9IG1lcmdlZF9ieV9uYW1lW3QudGFnbmFtZV0udGFnbnVtCi0gICAgZWxzZToKLSAgICAgICMgV2UncmUgYnVpbGRpbmcgc29tZXRoaW5nIHRoYXQncyBub3QgYmVpbmcgaW5jbHVkZWQgaW4gdGhlCi0gICAgICAjIHByb2R1Y3QsIHNvIGl0cyB0YWdzIGRvbid0IGFwcGVhciBpbiB0aGUgbWVyZ2VkIGZpbGUuICBBc3NpZ24KLSAgICAgICMgdGhlbSBhbGwgYW4gYXJiaXRyYXJ5IG51bWJlciBzbyB3ZSBjYW4gZW1pdCB0aGUgamF2YSBhbmQKLSAgICAgICMgY29tcGlsZSB0aGUgKHVudXNlZCkgcGFja2FnZS4KLSAgICAgIHQudGFnbnVtID0gOTk5OTk5CitpZiBsZW4oYXJncykgPiAxOgorICAjIExvYWQgdGhlIG1lcmdlZCB0YWcgZmlsZSAod2hpY2ggc2hvdWxkIGhhdmUgbnVtYmVycyBhc3NpZ25lZCBmb3IgYWxsCisgICMgdGFncy4gIFVzZSB0aGUgbnVtYmVycyBmcm9tIHRoZSBtZXJnZWQgZmlsZSB0byBmaWxsIGluIGFueSBtaXNzaW5nCisgICMgbnVtYmVycyBmcm9tIHRoZSBpbnB1dCBmaWxlLgorICBtZXJnZWRfZm4gPSBhcmdzWzFdCisgIG1lcmdlZF90YWdmaWxlID0gZXZlbnRfbG9nX3RhZ3MuVGFnRmlsZShtZXJnZWRfZm4pCisgIG1lcmdlZF9ieV9uYW1lID0gZGljdChbKHQudGFnbmFtZSwgdCkgZm9yIHQgaW4gbWVyZ2VkX3RhZ2ZpbGUudGFnc10pCisgIGZvciB0IGluIHRhZ2ZpbGUudGFnczoKKyAgICBpZiB0LnRhZ251bSBpcyBOb25lOgorICAgICAgaWYgdC50YWduYW1lIGluIG1lcmdlZF9ieV9uYW1lOgorICAgICAgICB0LnRhZ251bSA9IG1lcmdlZF9ieV9uYW1lW3QudGFnbmFtZV0udGFnbnVtCisgICAgICBlbHNlOgorICAgICAgICAjIFdlJ3JlIGJ1aWxkaW5nIHNvbWV0aGluZyB0aGF0J3Mgbm90IGJlaW5nIGluY2x1ZGVkIGluIHRoZQorICAgICAgICAjIHByb2R1Y3QsIHNvIGl0cyB0YWdzIGRvbid0IGFwcGVhciBpbiB0aGUgbWVyZ2VkIGZpbGUuICBBc3NpZ24KKyAgICAgICAgIyB0aGVtIGFsbCBhbiBhcmJpdHJhcnkgbnVtYmVyIHNvIHdlIGNhbiBlbWl0IHRoZSBqYXZhIGFuZAorICAgICAgICAjIGNvbXBpbGUgdGhlICh1bnVzZWQpIHBhY2thZ2UuCisgICAgICAgIHQudGFnbnVtID0gOTk5OTk5CitlbHNlOgorICAjIE5vdCB1c2luZyB0aGUgbWVyZ2VkIHRhZyBmaWxlLCBzbyBhbGwgdGFncyBtdXN0IGhhdmUgbWFudWFsbHkgYXNzaWduZWQKKyAgIyBudW1iZXJzCisgIGZvciB0IGluIHRhZ2ZpbGUudGFnczoKKyAgICBpZiB0LnRhZ251bSBpcyBOb25lOgorICAgICAgdGFnZmlsZWYuQWRkRXJyb3IoInRhZyBcIiVzXCIgaGFzIG5vIG51bWJlciIgJSAodGFnbmFtZSwpLCB0YWcubGluZW51bSkKIAogaWYgImphdmFfcGFja2FnZSIgbm90IGluIHRhZ2ZpbGUub3B0aW9uczoKICAgdGFnZmlsZS5BZGRFcnJvcigiamF2YV9wYWNrYWdlIG9wdGlvbiBub3Qgc3BlY2lmaWVkIiwgbGluZW51bT0wKQpkaWZmIC0tZ2l0IGEvdG9vbHMvbGliaG9zdC9BbmRyb2lkLmJwIGIvdG9vbHMvbGliaG9zdC9BbmRyb2lkLmJwCmluZGV4IGU1YTVlY2YuLjRjOTEwMGYgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2xpYmhvc3QvQW5kcm9pZC5icAorKysgYi90b29scy9saWJob3N0L0FuZHJvaWQuYnAKQEAgLTEwLDYgKzEwLDcgQEAKICAgICBuYW1lOiAibGliaG9zdCIsCiAgICAgdGFyZ2V0OiB7CiAgICAgICAgIHdpbmRvd3M6IHsKKyAgICAgICAgICAgIGNmbGFnczogWyItV25vLXVudXNlZC1wYXJhbWV0ZXIiXSwKICAgICAgICAgICAgIGVuYWJsZWQ6IHRydWUsCiAgICAgICAgIH0sCiAgICAgfSwKZGlmZiAtLWdpdCBhL3Rvb2xzL2xpYmhvc3QvQ29weUZpbGUuYyBiL3Rvb2xzL2xpYmhvc3QvQ29weUZpbGUuYwppbmRleCBiZDY1ZjFlLi5mOWJkYTg2IDEwMDY0NAotLS0gYS90b29scy9saWJob3N0L0NvcHlGaWxlLmMKKysrIGIvdG9vbHMvbGliaG9zdC9Db3B5RmlsZS5jCkBAIC0zNTIsNyArMzUyLDEyIEBACiAgKiBuZWVkIHRvIHRyYXNoIGl0IHNvIHdlIGNhbiBjcmVhdGUgb25lLgogICovCiAjaWYgZGVmaW5lZChfV0lOMzIpCi1leHRlcm4gaW50IGNvcHlTeW1saW5rKGNvbnN0IGNoYXIqIHNyYywgY29uc3QgY2hhciogZHN0LCBjb25zdCBzdHJ1Y3Qgc3RhdCogcFNyY1N0YXQsIHVuc2lnbmVkIGludCBvcHRpb25zKSBfX2F0dHJpYnV0ZV9fKChlcnJvcigibm8gc3ltbGlua3Mgb24gV2luZG93cyIpKSk7CitleHRlcm4gaW50IGNvcHlTeW1saW5rKGNvbnN0IGNoYXIqIHNyYywgY29uc3QgY2hhciogZHN0LCBjb25zdCBzdHJ1Y3Qgc3RhdCogcFNyY1N0YXQsIHVuc2lnbmVkIGludCBvcHRpb25zKQorI2lmZGVmIF9fY2xhbmdfXworICBfX2F0dHJpYnV0ZV9fKCh1bmF2YWlsYWJsZSgibm8gc3ltbGlua3Mgb24gV2luZG93cyIpKSk7CisjZWxzZQorICBfX2F0dHJpYnV0ZV9fKChlcnJvcigibm8gc3ltbGlua3Mgb24gV2luZG93cyIpKSk7CisjZW5kaWYKICNlbHNlCiBzdGF0aWMgaW50IGNvcHlTeW1saW5rKGNvbnN0IGNoYXIqIHNyYywgY29uc3QgY2hhciogZHN0LCBjb25zdCBzdHJ1Y3Qgc3RhdCogcFNyY1N0YXQsIHVuc2lnbmVkIGludCBvcHRpb25zKQogewpAQCAtNTc0LDggKzU3OSwxMCBAQAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgcmV0VmFsID0gY29weURpcmVjdG9yeShzcmMsIGRzdCwgJnNyY1N0YXQsIG9wdGlvbnMpOwogICAgICAgICB9CisjaWYgIWRlZmluZWQoX1dJTjMyKQogICAgIH0gZWxzZSBpZiAoU19JU0xOSyhzcmNTdGF0LnN0X21vZGUpKSB7CiAgICAgICAgIHJldFZhbCA9IGNvcHlTeW1saW5rKHNyYywgZHN0LCAmc3JjU3RhdCwgb3B0aW9ucyk7CisjZW5kaWYKICAgICB9IGVsc2UgaWYgKFNfSVNSRUcoc3JjU3RhdC5zdF9tb2RlKSkgewogICAgICAgICByZXRWYWwgPSBjb3B5UmVndWxhcihzcmMsIGRzdCwgJnNyY1N0YXQsIG9wdGlvbnMpOwogICAgIH0gZWxzZSB7CmRpZmYgLS1naXQgYS90b29scy9tYWtlcGFyYWxsZWwvQW5kcm9pZC5icCBiL3Rvb2xzL21ha2VwYXJhbGxlbC9BbmRyb2lkLmJwCmluZGV4IGNiODE4MTcuLjg5OGRiNjggMTAwNjQ0Ci0tLSBhL3Rvb2xzL21ha2VwYXJhbGxlbC9BbmRyb2lkLmJwCisrKyBiL3Rvb2xzL21ha2VwYXJhbGxlbC9BbmRyb2lkLmJwCkBAIC0xOCw5ICsxOCw0IEBACiAgICAgICAgICJtYWtlcGFyYWxsZWwuY3BwIiwKICAgICBdLAogICAgIGNmbGFnczogWyItV2FsbCIsICItV2Vycm9yIl0sCi0gICAgdGFyZ2V0OiB7Ci0gICAgICAgIGxpbnV4OiB7Ci0gICAgICAgICAgICBob3N0X2xkbGliczogWyItbHJ0IiwgIi1scHRocmVhZCJdLAotICAgICAgICB9LAotICAgIH0sCiB9CmRpZmYgLS1naXQgYS90b29scy9wb3N0X3Byb2Nlc3NfcHJvcHMucHkgYi90b29scy9wb3N0X3Byb2Nlc3NfcHJvcHMucHkKaW5kZXggOTM1NWU0Yi4uOWRkZDVkNyAxMDA3NTUKLS0tIGEvdG9vbHMvcG9zdF9wcm9jZXNzX3Byb3BzLnB5CisrKyBiL3Rvb2xzL3Bvc3RfcHJvY2Vzc19wcm9wcy5weQpAQCAtNjQsNyArNjQsNyBAQAogICBidWlsZHByb3BzID0gcHJvcC50b19kaWN0KCkKICAgZm9yIGtleSwgdmFsdWUgaW4gYnVpbGRwcm9wcy5pdGVyaXRlbXMoKToKICAgICAjIENoZWNrIGJ1aWxkIHByb3BlcnRpZXMnIGxlbmd0aC4KLSAgICBpZiBsZW4odmFsdWUpID4gUFJPUF9WQUxVRV9NQVg6CisgICAgaWYgbGVuKHZhbHVlKSA+IFBST1BfVkFMVUVfTUFYIGFuZCBub3Qga2V5LnN0YXJ0c3dpdGgoInJvLiIpOgogICAgICAgY2hlY2tfcGFzcyA9IEZhbHNlCiAgICAgICBzeXMuc3RkZXJyLndyaXRlKCJlcnJvcjogJXMgY2Fubm90IGV4Y2VlZCAlZCBieXRlczogIiAlCiAgICAgICAgICAgICAgICAgICAgICAgIChrZXksIFBST1BfVkFMVUVfTUFYKSkKZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbGVhc2V0b29scy9hZGRfaW1nX3RvX3RhcmdldF9maWxlcy5weSBiL3Rvb2xzL3JlbGVhc2V0b29scy9hZGRfaW1nX3RvX3RhcmdldF9maWxlcy5weQppbmRleCAxYTA4Y2I2Li5mNjg5NzZlIDEwMDc1NQotLS0gYS90b29scy9yZWxlYXNldG9vbHMvYWRkX2ltZ190b190YXJnZXRfZmlsZXMucHkKKysrIGIvdG9vbHMvcmVsZWFzZXRvb2xzL2FkZF9pbWdfdG9fdGFyZ2V0X2ZpbGVzLnB5CkBAIC00NSwyMCArNDUsMTIgQEAKIAogZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBwcmludF9mdW5jdGlvbgogCi1pbXBvcnQgc3lzCi0KLWlmIHN5cy5oZXh2ZXJzaW9uIDwgMHgwMjA3MDAwMDoKLSAgcHJpbnQoIlB5dGhvbiAyLjcgb3IgbmV3ZXIgaXMgcmVxdWlyZWQuIiwgZmlsZT1zeXMuc3RkZXJyKQotICBzeXMuZXhpdCgxKQotCiBpbXBvcnQgZGF0ZXRpbWUKLWltcG9ydCBlcnJubwotaW1wb3J0IGhhc2hsaWIKIGltcG9ydCBvcwogaW1wb3J0IHNobGV4CiBpbXBvcnQgc2h1dGlsCiBpbXBvcnQgc3VicHJvY2VzcwotaW1wb3J0IHRlbXBmaWxlCitpbXBvcnQgc3lzCiBpbXBvcnQgdXVpZAogaW1wb3J0IHppcGZpbGUKIApAQCAtNjcsNiArNTksMTAgQEAKIGltcG9ydCByYW5nZWxpYgogaW1wb3J0IHNwYXJzZV9pbWcKIAoraWYgc3lzLmhleHZlcnNpb24gPCAweDAyMDcwMDAwOgorICBwcmludCgiUHl0aG9uIDIuNyBvciBuZXdlciBpcyByZXF1aXJlZC4iLCBmaWxlPXN5cy5zdGRlcnIpCisgIHN5cy5leGl0KDEpCisKIE9QVElPTlMgPSBjb21tb24uT1BUSU9OUwogCiBPUFRJT05TLmFkZF9taXNzaW5nID0gRmFsc2UKQEAgLTc3LDYgKzczLDEwIEBACiBPUFRJT05TLmlzX3NpZ25pbmcgPSBGYWxzZQogCiAKKyMgUGFydGl0aW9ucyB0aGF0IHNob3VsZCBoYXZlIHRoZWlyIGNhcmVfbWFwIGFkZGVkIHRvIE1FVEEvY2FyZV9tYXAudHh0LgorUEFSVElUSU9OU19XSVRIX0NBUkVfTUFQID0gKCdzeXN0ZW0nLCAndmVuZG9yJywgJ3Byb2R1Y3QnKQorCisKIGNsYXNzIE91dHB1dEZpbGUob2JqZWN0KToKICAgZGVmIF9faW5pdF9fKHNlbGYsIG91dHB1dF96aXAsIGlucHV0X2RpciwgcHJlZml4LCBuYW1lKToKICAgICBzZWxmLl9vdXRwdXRfemlwID0gb3V0cHV0X3ppcApAQCAtOTYsMTMgKzk2LDE5IEBACiAKIAogZGVmIEdldENhcmVNYXAod2hpY2gsIGltZ25hbWUpOgotICAiIiJHZW5lcmF0ZSBjYXJlX21hcCBvZiBzeXN0ZW0gKG9yIHZlbmRvcikgcGFydGl0aW9uIiIiCisgICIiIlJldHVybnMgdGhlIGNhcmVfbWFwIHN0cmluZyBmb3IgdGhlIGdpdmVuIHBhcnRpdGlvbi4KIAotICBhc3NlcnQgd2hpY2ggaW4gKCJzeXN0ZW0iLCAidmVuZG9yIikKKyAgQXJnczoKKyAgICB3aGljaDogVGhlIHBhcnRpdGlvbiBuYW1lLCBtdXN0IGJlIGxpc3RlZCBpbiBQQVJUSVRJT05TX1dJVEhfQ0FSRV9NQVAuCisgICAgaW1nbmFtZTogVGhlIGZpbGVuYW1lIG9mIHRoZSBpbWFnZS4KKworICBSZXR1cm5zOgorICAgICh3aGljaCwgY2FyZV9tYXBfcmFuZ2VzKTogY2FyZV9tYXBfcmFuZ2VzIGlzIHRoZSByYXcgc3RyaW5nIG9mIHRoZSBjYXJlX21hcAorICAgIFJhbmdlU2V0LgorICAiIiIKKyAgYXNzZXJ0IHdoaWNoIGluIFBBUlRJVElPTlNfV0lUSF9DQVJFX01BUAogCiAgIHNpbWcgPSBzcGFyc2VfaW1nLlNwYXJzZUltYWdlKGltZ25hbWUpCi0gIGNhcmVfbWFwX2xpc3QgPSBbd2hpY2hdCi0KICAgY2FyZV9tYXBfcmFuZ2VzID0gc2ltZy5jYXJlX21hcAogICBrZXkgPSB3aGljaCArICJfYWRqdXN0ZWRfcGFydGl0aW9uX3NpemUiCiAgIGFkanVzdGVkX2Jsb2NrcyA9IE9QVElPTlMuaW5mb19kaWN0LmdldChrZXkpCkBAIC0xMTEsMTcgKzExNywxNiBAQAogICAgIGNhcmVfbWFwX3JhbmdlcyA9IGNhcmVfbWFwX3Jhbmdlcy5pbnRlcnNlY3QocmFuZ2VsaWIuUmFuZ2VTZXQoCiAgICAgICAgICIwLSVkIiAlIChhZGp1c3RlZF9ibG9ja3MsKSkpCiAKLSAgY2FyZV9tYXBfbGlzdC5hcHBlbmQoY2FyZV9tYXBfcmFuZ2VzLnRvX3N0cmluZ19yYXcoKSkKLSAgcmV0dXJuIGNhcmVfbWFwX2xpc3QKKyAgcmV0dXJuIFt3aGljaCwgY2FyZV9tYXBfcmFuZ2VzLnRvX3N0cmluZ19yYXcoKV0KIAogCi1kZWYgQWRkU3lzdGVtKG91dHB1dF96aXAsIHByZWZpeD0iSU1BR0VTLyIsIHJlY292ZXJ5X2ltZz1Ob25lLCBib290X2ltZz1Ob25lKToKK2RlZiBBZGRTeXN0ZW0ob3V0cHV0X3ppcCwgcmVjb3ZlcnlfaW1nPU5vbmUsIGJvb3RfaW1nPU5vbmUpOgogICAiIiJUdXJuIHRoZSBjb250ZW50cyBvZiBTWVNURU0gaW50byBhIHN5c3RlbSBpbWFnZSBhbmQgc3RvcmUgaXQgaW4KICAgb3V0cHV0X3ppcC4gUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgc3lzdGVtIGltYWdlIGZpbGUuIiIiCiAKLSAgaW1nID0gT3V0cHV0RmlsZShvdXRwdXRfemlwLCBPUFRJT05TLmlucHV0X3RtcCwgcHJlZml4LCAic3lzdGVtLmltZyIpCisgIGltZyA9IE91dHB1dEZpbGUob3V0cHV0X3ppcCwgT1BUSU9OUy5pbnB1dF90bXAsICJJTUFHRVMiLCAic3lzdGVtLmltZyIpCiAgIGlmIG9zLnBhdGguZXhpc3RzKGltZy5pbnB1dF9uYW1lKToKLSAgICBwcmludCgic3lzdGVtLmltZyBhbHJlYWR5IGV4aXN0cyBpbiAlcywgbm8gbmVlZCB0byByZWJ1aWxkLi4uIiAlIChwcmVmaXgsKSkKKyAgICBwcmludCgic3lzdGVtLmltZyBhbHJlYWR5IGV4aXN0czsgbm8gbmVlZCB0byByZWJ1aWxkLi4uIikKICAgICByZXR1cm4gaW1nLmlucHV0X25hbWUKIAogICBkZWYgb3V0cHV0X3NpbmsoZm4sIGRhdGEpOgpAQCAtMTQwLDUxICsxNDUsNjYgQEAKICAgICBjb21tb24uTWFrZVJlY292ZXJ5UGF0Y2goT1BUSU9OUy5pbnB1dF90bXAsIG91dHB1dF9zaW5rLCByZWNvdmVyeV9pbWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb3RfaW1nLCBpbmZvX2RpY3Q9T1BUSU9OUy5pbmZvX2RpY3QpCiAKLSAgYmxvY2tfbGlzdCA9IE91dHB1dEZpbGUob3V0cHV0X3ppcCwgT1BUSU9OUy5pbnB1dF90bXAsIHByZWZpeCwgInN5c3RlbS5tYXAiKQorICBibG9ja19saXN0ID0gT3V0cHV0RmlsZShvdXRwdXRfemlwLCBPUFRJT05TLmlucHV0X3RtcCwgIklNQUdFUyIsICJzeXN0ZW0ubWFwIikKICAgQ3JlYXRlSW1hZ2UoT1BUSU9OUy5pbnB1dF90bXAsIE9QVElPTlMuaW5mb19kaWN0LCAic3lzdGVtIiwgaW1nLAogICAgICAgICAgICAgICBibG9ja19saXN0PWJsb2NrX2xpc3QpCiAKICAgcmV0dXJuIGltZy5uYW1lCiAKIAotZGVmIEFkZFN5c3RlbU90aGVyKG91dHB1dF96aXAsIHByZWZpeD0iSU1BR0VTLyIpOgorZGVmIEFkZFN5c3RlbU90aGVyKG91dHB1dF96aXApOgogICAiIiJUdXJuIHRoZSBjb250ZW50cyBvZiBTWVNURU1fT1RIRVIgaW50byBhIHN5c3RlbV9vdGhlciBpbWFnZQogICBhbmQgc3RvcmUgaXQgaW4gb3V0cHV0X3ppcC4iIiIKIAotICBpbWcgPSBPdXRwdXRGaWxlKG91dHB1dF96aXAsIE9QVElPTlMuaW5wdXRfdG1wLCBwcmVmaXgsICJzeXN0ZW1fb3RoZXIuaW1nIikKKyAgaW1nID0gT3V0cHV0RmlsZShvdXRwdXRfemlwLCBPUFRJT05TLmlucHV0X3RtcCwgIklNQUdFUyIsICJzeXN0ZW1fb3RoZXIuaW1nIikKICAgaWYgb3MucGF0aC5leGlzdHMoaW1nLmlucHV0X25hbWUpOgotICAgIHByaW50KCJzeXN0ZW1fb3RoZXIuaW1nIGFscmVhZHkgZXhpc3RzIGluICVzLCBubyBuZWVkIHRvIHJlYnVpbGQuLi4iICUgKAotICAgICAgICBwcmVmaXgsKSkKKyAgICBwcmludCgic3lzdGVtX290aGVyLmltZyBhbHJlYWR5IGV4aXN0czsgbm8gbmVlZCB0byByZWJ1aWxkLi4uIikKICAgICByZXR1cm4KIAogICBDcmVhdGVJbWFnZShPUFRJT05TLmlucHV0X3RtcCwgT1BUSU9OUy5pbmZvX2RpY3QsICJzeXN0ZW1fb3RoZXIiLCBpbWcpCiAKIAotZGVmIEFkZFZlbmRvcihvdXRwdXRfemlwLCBwcmVmaXg9IklNQUdFUy8iKToKK2RlZiBBZGRWZW5kb3Iob3V0cHV0X3ppcCk6CiAgICIiIlR1cm4gdGhlIGNvbnRlbnRzIG9mIFZFTkRPUiBpbnRvIGEgdmVuZG9yIGltYWdlIGFuZCBzdG9yZSBpbiBpdAogICBvdXRwdXRfemlwLiIiIgogCi0gIGltZyA9IE91dHB1dEZpbGUob3V0cHV0X3ppcCwgT1BUSU9OUy5pbnB1dF90bXAsIHByZWZpeCwgInZlbmRvci5pbWciKQorICBpbWcgPSBPdXRwdXRGaWxlKG91dHB1dF96aXAsIE9QVElPTlMuaW5wdXRfdG1wLCAiSU1BR0VTIiwgInZlbmRvci5pbWciKQogICBpZiBvcy5wYXRoLmV4aXN0cyhpbWcuaW5wdXRfbmFtZSk6Ci0gICAgcHJpbnQoInZlbmRvci5pbWcgYWxyZWFkeSBleGlzdHMgaW4gJXMsIG5vIG5lZWQgdG8gcmVidWlsZC4uLiIgJSAocHJlZml4LCkpCisgICAgcHJpbnQoInZlbmRvci5pbWcgYWxyZWFkeSBleGlzdHM7IG5vIG5lZWQgdG8gcmVidWlsZC4uLiIpCiAgICAgcmV0dXJuIGltZy5pbnB1dF9uYW1lCiAKLSAgYmxvY2tfbGlzdCA9IE91dHB1dEZpbGUob3V0cHV0X3ppcCwgT1BUSU9OUy5pbnB1dF90bXAsIHByZWZpeCwgInZlbmRvci5tYXAiKQorICBibG9ja19saXN0ID0gT3V0cHV0RmlsZShvdXRwdXRfemlwLCBPUFRJT05TLmlucHV0X3RtcCwgIklNQUdFUyIsICJ2ZW5kb3IubWFwIikKICAgQ3JlYXRlSW1hZ2UoT1BUSU9OUy5pbnB1dF90bXAsIE9QVElPTlMuaW5mb19kaWN0LCAidmVuZG9yIiwgaW1nLAogICAgICAgICAgICAgICBibG9ja19saXN0PWJsb2NrX2xpc3QpCiAgIHJldHVybiBpbWcubmFtZQogCiAKLWRlZiBBZGREdGJvKG91dHB1dF96aXAsIHByZWZpeD0iSU1BR0VTLyIpOgorZGVmIEFkZFByb2R1Y3Qob3V0cHV0X3ppcCk6CisgICIiIlR1cm4gdGhlIGNvbnRlbnRzIG9mIFBST0RVQ1QgaW50byBhIHByb2R1Y3QgaW1hZ2UgYW5kIHN0b3JlIGl0IGluCisgIG91dHB1dF96aXAuIiIiCisKKyAgaW1nID0gT3V0cHV0RmlsZShvdXRwdXRfemlwLCBPUFRJT05TLmlucHV0X3RtcCwgIklNQUdFUyIsICJwcm9kdWN0LmltZyIpCisgIGlmIG9zLnBhdGguZXhpc3RzKGltZy5pbnB1dF9uYW1lKToKKyAgICBwcmludCgicHJvZHVjdC5pbWcgYWxyZWFkeSBleGlzdHM7IG5vIG5lZWQgdG8gcmVidWlsZC4uLiIpCisgICAgcmV0dXJuIGltZy5pbnB1dF9uYW1lCisKKyAgYmxvY2tfbGlzdCA9IE91dHB1dEZpbGUoCisgICAgICBvdXRwdXRfemlwLCBPUFRJT05TLmlucHV0X3RtcCwgIklNQUdFUyIsICJwcm9kdWN0Lm1hcCIpCisgIENyZWF0ZUltYWdlKAorICAgICAgT1BUSU9OUy5pbnB1dF90bXAsIE9QVElPTlMuaW5mb19kaWN0LCAicHJvZHVjdCIsIGltZywKKyAgICAgIGJsb2NrX2xpc3Q9YmxvY2tfbGlzdCkKKyAgcmV0dXJuIGltZy5uYW1lCisKKworZGVmIEFkZER0Ym8ob3V0cHV0X3ppcCk6CiAgICIiIkFkZHMgdGhlIERUQk8gaW1hZ2UuCiAKLSAgVXNlcyB0aGUgaW1hZ2UgdW5kZXIgcHJlZml4IGlmIGl0IGFscmVhZHkgZXhpc3RzLiBPdGhlcndpc2UgbG9va3MgZm9yIHRoZQorICBVc2VzIHRoZSBpbWFnZSB1bmRlciBJTUFHRVMvIGlmIGl0IGFscmVhZHkgZXhpc3RzLiBPdGhlcndpc2UgbG9va3MgZm9yIHRoZQogICBpbWFnZSB1bmRlciBQUkVCVUlMVF9JTUFHRVMvLCBzaWducyBpdCBhcyBuZWVkZWQsIGFuZCByZXR1cm5zIHRoZSBpbWFnZSBuYW1lLgogICAiIiIKLQotICBpbWcgPSBPdXRwdXRGaWxlKG91dHB1dF96aXAsIE9QVElPTlMuaW5wdXRfdG1wLCBwcmVmaXgsICJkdGJvLmltZyIpCisgIGltZyA9IE91dHB1dEZpbGUob3V0cHV0X3ppcCwgT1BUSU9OUy5pbnB1dF90bXAsICJJTUFHRVMiLCAiZHRiby5pbWciKQogICBpZiBvcy5wYXRoLmV4aXN0cyhpbWcuaW5wdXRfbmFtZSk6Ci0gICAgcHJpbnQoImR0Ym8uaW1nIGFscmVhZHkgZXhpc3RzIGluICVzLCBubyBuZWVkIHRvIHJlYnVpbGQuLi4iICUgKHByZWZpeCwpKQorICAgIHByaW50KCJkdGJvLmltZyBhbHJlYWR5IGV4aXN0czsgbm8gbmVlZCB0byByZWJ1aWxkLi4uIikKICAgICByZXR1cm4gaW1nLmlucHV0X25hbWUKIAogICBkdGJvX3ByZWJ1aWx0X3BhdGggPSBvcy5wYXRoLmpvaW4oCkBAIC0yMTUsMjIgKzIzNSw2IEBACiBkZWYgQ3JlYXRlSW1hZ2UoaW5wdXRfZGlyLCBpbmZvX2RpY3QsIHdoYXQsIG91dHB1dF9maWxlLCBibG9ja19saXN0PU5vbmUpOgogICBwcmludCgiY3JlYXRpbmcgIiArIHdoYXQgKyAiLmltZy4uLiIpCiAKLSAgIyBUaGUgbmFtZSBvZiB0aGUgZGlyZWN0b3J5IGl0IGlzIG1ha2luZyBhbiBpbWFnZSBvdXQgb2YgbWF0dGVycyB0bwotICAjIG1reWFmZnMyaW1hZ2UuICBJdCB3YW50cyAic3lzdGVtIiBidXQgd2UgaGF2ZSBhIGRpcmVjdG9yeSBuYW1lZAotICAjICJTWVNURU0iLCBzbyBjcmVhdGUgYSBzeW1saW5rLgotICB0ZW1wX2RpciA9IHRlbXBmaWxlLm1rZHRlbXAoKQotICBPUFRJT05TLnRlbXBmaWxlcy5hcHBlbmQodGVtcF9kaXIpCi0gIHRyeToKLSAgICBvcy5zeW1saW5rKG9zLnBhdGguam9pbihpbnB1dF9kaXIsIHdoYXQudXBwZXIoKSksCi0gICAgICAgICAgICAgICBvcy5wYXRoLmpvaW4odGVtcF9kaXIsIHdoYXQpKQotICBleGNlcHQgT1NFcnJvciBhcyBlOgotICAgICMgYm9ndXMgZXJyb3Igb24gbXkgbWFjIHZlcnNpb24/Ci0gICAgIyAgIEZpbGUgIi4vYnVpbGQvdG9vbHMvcmVsZWFzZXRvb2xzL2ltZ19mcm9tX3RhcmdldF9maWxlcyIKLSAgICAjICAgICBvcy5wYXRoLmpvaW4oT1BUSU9OUy5pbnB1dF90bXAsICJzeXN0ZW0iKSkKLSAgICAjIE9TRXJyb3I6IFtFcnJubyAxN10gRmlsZSBleGlzdHMKLSAgICBpZiBlLmVycm5vID09IGVycm5vLkVFWElTVDoKLSAgICAgIHBhc3MKLQogICBpbWFnZV9wcm9wcyA9IGJ1aWxkX2ltYWdlLkltYWdlUHJvcEZyb21HbG9iYWxEaWN0KGluZm9fZGljdCwgd2hhdCkKICAgZnN0YWIgPSBpbmZvX2RpY3RbImZzdGFiIl0KICAgbW91bnRfcG9pbnQgPSAiLyIgKyB3aGF0CkBAIC0yNzIsNyArMjc2LDcgQEAKICAgaGFzaF9zZWVkID0gImhhc2hfc2VlZC0iICsgdXVpZF9zZWVkCiAgIGltYWdlX3Byb3BzWyJoYXNoX3NlZWQiXSA9IHN0cih1dWlkLnV1aWQ1KHV1aWQuTkFNRVNQQUNFX1VSTCwgaGFzaF9zZWVkKSkKIAotICBzdWNjID0gYnVpbGRfaW1hZ2UuQnVpbGRJbWFnZShvcy5wYXRoLmpvaW4odGVtcF9kaXIsIHdoYXQpLAorICBzdWNjID0gYnVpbGRfaW1hZ2UuQnVpbGRJbWFnZShvcy5wYXRoLmpvaW4oaW5wdXRfZGlyLCB3aGF0LnVwcGVyKCkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZV9wcm9wcywgb3V0cHV0X2ZpbGUubmFtZSkKICAgYXNzZXJ0IHN1Y2MsICJidWlsZCAiICsgd2hhdCArICIuaW1nIGltYWdlIGZhaWxlZCIKIApAQCAtMjk0LDcgKzI5OCw3IEBACiAgICAgICBpbmZvX2RpY3RbYWRqdXN0ZWRfYmxvY2tzX2tleV0gPSBpbnQoYWRqdXN0ZWRfYmxvY2tzX3ZhbHVlKS80MDk2IC0gMQogCiAKLWRlZiBBZGRVc2VyZGF0YShvdXRwdXRfemlwLCBwcmVmaXg9IklNQUdFUy8iKToKK2RlZiBBZGRVc2VyZGF0YShvdXRwdXRfemlwKToKICAgIiIiQ3JlYXRlIGEgdXNlcmRhdGEgaW1hZ2UgYW5kIHN0b3JlIGl0IGluIG91dHB1dF96aXAuCiAKICAgSW4gbW9zdCBjYXNlIHdlIGp1c3QgY3JlYXRlIGFuZCBzdG9yZSBhbiBlbXB0eSB1c2VyZGF0YS5pbWc7CkBAIC0zMDMsMTAgKzMwNyw5IEBACiAgIGluIE9QVElPTlMuaW5mb19kaWN0LgogICAiIiIKIAotICBpbWcgPSBPdXRwdXRGaWxlKG91dHB1dF96aXAsIE9QVElPTlMuaW5wdXRfdG1wLCBwcmVmaXgsICJ1c2VyZGF0YS5pbWciKQorICBpbWcgPSBPdXRwdXRGaWxlKG91dHB1dF96aXAsIE9QVElPTlMuaW5wdXRfdG1wLCAiSU1BR0VTIiwgInVzZXJkYXRhLmltZyIpCiAgIGlmIG9zLnBhdGguZXhpc3RzKGltZy5pbnB1dF9uYW1lKToKLSAgICBwcmludCgidXNlcmRhdGEuaW1nIGFscmVhZHkgZXhpc3RzIGluICVzLCBubyBuZWVkIHRvIHJlYnVpbGQuLi4iICUgKAotICAgICAgICBwcmVmaXgsKSkKKyAgICBwcmludCgidXNlcmRhdGEuaW1nIGFscmVhZHkgZXhpc3RzOyBubyBuZWVkIHRvIHJlYnVpbGQuLi4iKQogICAgIHJldHVybgogCiAgICMgU2tpcCB1c2VyZGF0YS5pbWcgaWYgbm8gc2l6ZS4KQEAgLTMyMiwyMSArMzI1LDEwIEBACiAgIHRpbWVzdGFtcCA9IChkYXRldGltZS5kYXRldGltZSgyMDA5LCAxLCAxKSAtIGVwb2NoKS50b3RhbF9zZWNvbmRzKCkKICAgaW1hZ2VfcHJvcHNbInRpbWVzdGFtcCJdID0gaW50KHRpbWVzdGFtcCkKIAotICAjIFRoZSBuYW1lIG9mIHRoZSBkaXJlY3RvcnkgaXQgaXMgbWFraW5nIGFuIGltYWdlIG91dCBvZiBtYXR0ZXJzIHRvCi0gICMgbWt5YWZmczJpbWFnZS4gIFNvIHdlIGNyZWF0ZSBhIHRlbXAgZGlyLCBhbmQgd2l0aGluIGl0IHdlIGNyZWF0ZSBhbgotICAjIGVtcHR5IGRpciBuYW1lZCAiZGF0YSIsIG9yIGEgc3ltbGluayB0byB0aGUgREFUQSBkaXIsCi0gICMgYW5kIGJ1aWxkIHRoZSBpbWFnZSBmcm9tIHRoYXQuCi0gIHRlbXBfZGlyID0gdGVtcGZpbGUubWtkdGVtcCgpCi0gIE9QVElPTlMudGVtcGZpbGVzLmFwcGVuZCh0ZW1wX2RpcikKLSAgdXNlcl9kaXIgPSBvcy5wYXRoLmpvaW4odGVtcF9kaXIsICJkYXRhIikKLSAgZW1wdHkgPSAoT1BUSU9OUy5pbmZvX2RpY3QuZ2V0KCJ1c2VyZGF0YV9pbWdfd2l0aF9kYXRhIikgIT0gInRydWUiKQotICBpZiBlbXB0eToKLSAgICAjIENyZWF0ZSBhbiBlbXB0eSBkaXIuCi0gICAgb3MubWtkaXIodXNlcl9kaXIpCisgIGlmIE9QVElPTlMuaW5mb19kaWN0LmdldCgidXNlcmRhdGFfaW1nX3dpdGhfZGF0YSIpID09ICJ0cnVlIjoKKyAgICB1c2VyX2RpciA9IG9zLnBhdGguam9pbihPUFRJT05TLmlucHV0X3RtcCwgIkRBVEEiKQogICBlbHNlOgotICAgICMgU3ltbGluayB0byB0aGUgREFUQSBkaXIuCi0gICAgb3Muc3ltbGluayhvcy5wYXRoLmpvaW4oT1BUSU9OUy5pbnB1dF90bXAsICJEQVRBIiksCi0gICAgICAgICAgICAgICB1c2VyX2RpcikKKyAgICB1c2VyX2RpciA9IGNvbW1vbi5NYWtlVGVtcERpcigpCiAKICAgZnN0YWIgPSBPUFRJT05TLmluZm9fZGljdFsiZnN0YWIiXQogICBpZiBmc3RhYjoKQEAgLTM3MywyMSArMzY1LDMxIEBACiAgICAgY21kLmV4dGVuZChbIi0taW5jbHVkZV9kZXNjcmlwdG9yc19mcm9tX2ltYWdlIiwgaW1nX3BhdGhdKQogCiAKLWRlZiBBZGRWQk1ldGEob3V0cHV0X3ppcCwgYm9vdF9pbWdfcGF0aCwgc3lzdGVtX2ltZ19wYXRoLCB2ZW5kb3JfaW1nX3BhdGgsCi0gICAgICAgICAgICAgIGR0Ym9faW1nX3BhdGgsIHByZWZpeD0iSU1BR0VTLyIpOgotICAiIiJDcmVhdGUgYSBWQk1ldGEgaW1hZ2UgYW5kIHN0b3JlIGl0IGluIG91dHB1dF96aXAuIiIiCi0gIGltZyA9IE91dHB1dEZpbGUob3V0cHV0X3ppcCwgT1BUSU9OUy5pbnB1dF90bXAsIHByZWZpeCwgInZibWV0YS5pbWciKQorZGVmIEFkZFZCTWV0YShvdXRwdXRfemlwLCBwYXJ0aXRpb25zKToKKyAgIiIiQ3JlYXRlcyBhIFZCTWV0YSBpbWFnZSBhbmQgc3RvcmUgaXQgaW4gb3V0cHV0X3ppcC4KKworICBBcmdzOgorICAgIG91dHB1dF96aXA6IFRoZSBvdXRwdXQgemlwIGZpbGUsIHdoaWNoIG5lZWRzIHRvIGJlIGFscmVhZHkgb3Blbi4KKyAgICBwYXJ0aXRpb25zOiBBIGRpY3QgdGhhdCdzIGtleWVkIGJ5IHBhcnRpdGlvbiBuYW1lcyB3aXRoIGltYWdlIHBhdGhzIGFzCisgICAgICAgIHZhbHVlcy4gT25seSB2YWxpZCBwYXJ0aXRpb24gbmFtZXMgYXJlIGFjY2VwdGVkLCB3aGljaCBpbmNsdWRlICdib290JywKKyAgICAgICAgJ3JlY292ZXJ5JywgJ3N5c3RlbScsICd2ZW5kb3InLCAnZHRibycuCisgICIiIgorICBpbWcgPSBPdXRwdXRGaWxlKG91dHB1dF96aXAsIE9QVElPTlMuaW5wdXRfdG1wLCAiSU1BR0VTIiwgInZibWV0YS5pbWciKQorICBpZiBvcy5wYXRoLmV4aXN0cyhpbWcuaW5wdXRfbmFtZSk6CisgICAgcHJpbnQoInZibWV0YS5pbWcgYWxyZWFkeSBleGlzdHM7IG5vdCByZWJ1aWxkaW5nLi4uIikKKyAgICByZXR1cm4gaW1nLmlucHV0X25hbWUKKwogICBhdmJ0b29sID0gb3MuZ2V0ZW52KCdBVkJUT09MJykgb3IgT1BUSU9OUy5pbmZvX2RpY3RbImF2Yl9hdmJ0b29sIl0KICAgY21kID0gW2F2YnRvb2wsICJtYWtlX3ZibWV0YV9pbWFnZSIsICItLW91dHB1dCIsIGltZy5uYW1lXQogICBjb21tb24uQXBwZW5kQVZCU2lnbmluZ0FyZ3MoY21kLCAidmJtZXRhIikKIAotICBwdWJsaWNfa2V5X2RpciA9IHRlbXBmaWxlLm1rZHRlbXAocHJlZml4PSJhdmJwdWJrZXktIikKLSAgT1BUSU9OUy50ZW1wZmlsZXMuYXBwZW5kKHB1YmxpY19rZXlfZGlyKQotCi0gIEFwcGVuZFZCTWV0YUFyZ3NGb3JQYXJ0aXRpb24oY21kLCAiYm9vdCIsIGJvb3RfaW1nX3BhdGgsIHB1YmxpY19rZXlfZGlyKQotICBBcHBlbmRWQk1ldGFBcmdzRm9yUGFydGl0aW9uKGNtZCwgInN5c3RlbSIsIHN5c3RlbV9pbWdfcGF0aCwgcHVibGljX2tleV9kaXIpCi0gIEFwcGVuZFZCTWV0YUFyZ3NGb3JQYXJ0aXRpb24oY21kLCAidmVuZG9yIiwgdmVuZG9yX2ltZ19wYXRoLCBwdWJsaWNfa2V5X2RpcikKLSAgQXBwZW5kVkJNZXRhQXJnc0ZvclBhcnRpdGlvbihjbWQsICJkdGJvIiwgZHRib19pbWdfcGF0aCwgcHVibGljX2tleV9kaXIpCisgIHB1YmxpY19rZXlfZGlyID0gY29tbW9uLk1ha2VUZW1wRGlyKHByZWZpeD0iYXZicHVia2V5LSIpCisgIGZvciBwYXJ0aXRpb24sIHBhdGggaW4gcGFydGl0aW9ucy5pdGVtcygpOgorICAgIGFzc2VydCBwYXJ0aXRpb24gaW4gY29tbW9uLkFWQl9QQVJUSVRJT05TLCAnVW5rbm93biBwYXJ0aXRpb246ICVzJyAlICgKKyAgICAgICAgcGFydGl0aW9uLCkKKyAgICBhc3NlcnQgb3MucGF0aC5leGlzdHMocGF0aCksICdGYWlsZWQgdG8gZmluZCAlcyBmb3IgcGFydGl0aW9uICVzJyAlICgKKyAgICAgICAgcGF0aCwgcGFydGl0aW9uKQorICAgIEFwcGVuZFZCTWV0YUFyZ3NGb3JQYXJ0aXRpb24oY21kLCBwYXJ0aXRpb24sIHBhdGgsIHB1YmxpY19rZXlfZGlyKQogCiAgIGFyZ3MgPSBPUFRJT05TLmluZm9fZGljdC5nZXQoImF2Yl92Ym1ldGFfYXJncyIpCiAgIGlmIGFyZ3MgYW5kIGFyZ3Muc3RyaXAoKToKQEAgLTQwMyw5ICs0MDUsOSBAQAogICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhpbWFnZV9wYXRoKToKICAgICAgICAgICBjb250aW51ZQogICAgICAgICBmb3VuZCA9IEZhbHNlCi0gICAgICAgIGZvciBkaXIgaW4gWydJTUFHRVMnLCAnUkFESU8nLCAnVkVORE9SX0lNQUdFUycsICdQUkVCVUlMVF9JTUFHRVMnXToKKyAgICAgICAgZm9yIGRpcl9uYW1lIGluIFsnSU1BR0VTJywgJ1JBRElPJywgJ1ZFTkRPUl9JTUFHRVMnLCAnUFJFQlVJTFRfSU1BR0VTJ106CiAgICAgICAgICAgYWx0X3BhdGggPSBvcy5wYXRoLmpvaW4oCi0gICAgICAgICAgICAgIE9QVElPTlMuaW5wdXRfdG1wLCBkaXIsIG9zLnBhdGguYmFzZW5hbWUoaW1hZ2VfcGF0aCkpCisgICAgICAgICAgICAgIE9QVElPTlMuaW5wdXRfdG1wLCBkaXJfbmFtZSwgb3MucGF0aC5iYXNlbmFtZShpbWFnZV9wYXRoKSkKICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhhbHRfcGF0aCk6CiAgICAgICAgICAgICBzcGxpdF9hcmdzW2luZGV4ICsgMV0gPSBhbHRfcGF0aAogICAgICAgICAgICAgZm91bmQgPSBUcnVlCkBAIC00MTksMTEgKzQyMSwxMyBAQAogICBpbWcuV3JpdGUoKQogCiAKLWRlZiBBZGRQYXJ0aXRpb25UYWJsZShvdXRwdXRfemlwLCBwcmVmaXg9IklNQUdFUy8iKToKK2RlZiBBZGRQYXJ0aXRpb25UYWJsZShvdXRwdXRfemlwKToKICAgIiIiQ3JlYXRlIGEgcGFydGl0aW9uIHRhYmxlIGltYWdlIGFuZCBzdG9yZSBpdCBpbiBvdXRwdXRfemlwLiIiIgogCi0gIGltZyA9IE91dHB1dEZpbGUob3V0cHV0X3ppcCwgT1BUSU9OUy5pbnB1dF90bXAsIHByZWZpeCwgInBhcnRpdGlvbi10YWJsZS5pbWciKQotICBicHQgPSBPdXRwdXRGaWxlKG91dHB1dF96aXAsIE9QVElPTlMuaW5wdXRfdG1wLCBwcmVmaXgsICJwYXJ0aXRpb24tdGFibGUuYnB0IikKKyAgaW1nID0gT3V0cHV0RmlsZSgKKyAgICAgIG91dHB1dF96aXAsIE9QVElPTlMuaW5wdXRfdG1wLCAiSU1BR0VTIiwgInBhcnRpdGlvbi10YWJsZS5pbWciKQorICBicHQgPSBPdXRwdXRGaWxlKAorICAgICAgb3V0cHV0X3ppcCwgT1BUSU9OUy5pbnB1dF90bXAsICJJTUFHRVMiLCAicGFydGl0aW9uLXRhYmxlLmJwdCIpCiAKICAgIyB1c2UgQlBUVE9PTCBmcm9tIGVudmlyb24sIG9yICJicHR0b29sIiBpZiBlbXB0eSBvciBub3Qgc2V0LgogICBicHR0b29sID0gb3MuZ2V0ZW52KCJCUFRUT09MIikgb3IgImJwdHRvb2wiCkBAIC00NDgsMTIgKzQ1MiwxMiBAQAogICBicHQuV3JpdGUoKQogCiAKLWRlZiBBZGRDYWNoZShvdXRwdXRfemlwLCBwcmVmaXg9IklNQUdFUy8iKToKK2RlZiBBZGRDYWNoZShvdXRwdXRfemlwKToKICAgIiIiQ3JlYXRlIGFuIGVtcHR5IGNhY2hlIGltYWdlIGFuZCBzdG9yZSBpdCBpbiBvdXRwdXRfemlwLiIiIgogCi0gIGltZyA9IE91dHB1dEZpbGUob3V0cHV0X3ppcCwgT1BUSU9OUy5pbnB1dF90bXAsIHByZWZpeCwgImNhY2hlLmltZyIpCisgIGltZyA9IE91dHB1dEZpbGUob3V0cHV0X3ppcCwgT1BUSU9OUy5pbnB1dF90bXAsICJJTUFHRVMiLCAiY2FjaGUuaW1nIikKICAgaWYgb3MucGF0aC5leGlzdHMoaW1nLmlucHV0X25hbWUpOgotICAgIHByaW50KCJjYWNoZS5pbWcgYWxyZWFkeSBleGlzdHMgaW4gJXMsIG5vIG5lZWQgdG8gcmVidWlsZC4uLiIgJSAocHJlZml4LCkpCisgICAgcHJpbnQoImNhY2hlLmltZyBhbHJlYWR5IGV4aXN0czsgbm8gbmVlZCB0byByZWJ1aWxkLi4uIikKICAgICByZXR1cm4KIAogICBpbWFnZV9wcm9wcyA9IGJ1aWxkX2ltYWdlLkltYWdlUHJvcEZyb21HbG9iYWxEaWN0KE9QVElPTlMuaW5mb19kaWN0LCAiY2FjaGUiKQpAQCAtNDY5LDEzICs0NzMsNyBAQAogICB0aW1lc3RhbXAgPSAoZGF0ZXRpbWUuZGF0ZXRpbWUoMjAwOSwgMSwgMSkgLSBlcG9jaCkudG90YWxfc2Vjb25kcygpCiAgIGltYWdlX3Byb3BzWyJ0aW1lc3RhbXAiXSA9IGludCh0aW1lc3RhbXApCiAKLSAgIyBUaGUgbmFtZSBvZiB0aGUgZGlyZWN0b3J5IGl0IGlzIG1ha2luZyBhbiBpbWFnZSBvdXQgb2YgbWF0dGVycyB0bwotICAjIG1reWFmZnMyaW1hZ2UuICBTbyB3ZSBjcmVhdGUgYSB0ZW1wIGRpciwgYW5kIHdpdGhpbiBpdCB3ZSBjcmVhdGUgYW4KLSAgIyBlbXB0eSBkaXIgbmFtZWQgImNhY2hlIiwgYW5kIGJ1aWxkIHRoZSBpbWFnZSBmcm9tIHRoYXQuCi0gIHRlbXBfZGlyID0gdGVtcGZpbGUubWtkdGVtcCgpCi0gIE9QVElPTlMudGVtcGZpbGVzLmFwcGVuZCh0ZW1wX2RpcikKLSAgdXNlcl9kaXIgPSBvcy5wYXRoLmpvaW4odGVtcF9kaXIsICJjYWNoZSIpCi0gIG9zLm1rZGlyKHVzZXJfZGlyKQorICB1c2VyX2RpciA9IGNvbW1vbi5NYWtlVGVtcERpcigpCiAKICAgZnN0YWIgPSBPUFRJT05TLmluZm9fZGljdFsiZnN0YWIiXQogICBpZiBmc3RhYjoKQEAgLTQ4NywxNyArNDg1LDEzMyBAQAogICBpbWcuV3JpdGUoKQogCiAKK2RlZiBBZGRSYWRpb0ltYWdlc0ZvckFiT3RhKG91dHB1dF96aXAsIGFiX3BhcnRpdGlvbnMpOgorICAiIiJBZGRzIHRoZSByYWRpbyBpbWFnZXMgbmVlZGVkIGZvciBBL0IgT1RBIHRvIHRoZSBvdXRwdXQgZmlsZS4KKworICBJdCBwYXJzZXMgdGhlIGxpc3Qgb2YgQS9CIHBhcnRpdGlvbnMsIGxvb2tzIGZvciB0aGUgbWlzc2luZyBvbmVzIGZyb20gUkFESU8vCisgIG9yIFZFTkRPUl9JTUFHRVMvIGRpcnMsIGFuZCBjb3BpZXMgdGhlbSB0byBJTUFHRVMvIG9mIHRoZSBvdXRwdXQgZmlsZSAob3IKKyAgZGlyKS4KKworICBJdCBhbHNvIGVuc3VyZXMgdGhhdCBvbiByZXR1cm5pbmcgZnJvbSB0aGUgZnVuY3Rpb24gYWxsIHRoZSBsaXN0ZWQgQS9CCisgIHBhcnRpdGlvbnMgbXVzdCBoYXZlIHRoZWlyIGltYWdlcyBhdmFpbGFibGUgdW5kZXIgSU1BR0VTLy4KKworICBBcmdzOgorICAgIG91dHB1dF96aXA6IFRoZSBvdXRwdXQgemlwIGZpbGUgKG5lZWRzIHRvIGJlIGFscmVhZHkgb3BlbiksIG9yIE5vbmUgdG8KKyAgICAgICAgd3JpdGUgaW1hZ2VzIHRvIE9QVElPTlMuaW5wdXRfdG1wLy4KKyAgICBhYl9wYXJ0aXRpb25zOiBUaGUgbGlzdCBvZiBBL0IgcGFydGl0aW9ucy4KKworICBSYWlzZXM6CisgICAgQXNzZXJ0aW9uRXJyb3I6IElmIGl0IGNhbid0IGZpbmQgYW4gaW1hZ2UuCisgICIiIgorICBmb3IgcGFydGl0aW9uIGluIGFiX3BhcnRpdGlvbnM6CisgICAgaW1nX25hbWUgPSBwYXJ0aXRpb24uc3RyaXAoKSArICIuaW1nIgorICAgIHByZWJ1aWx0X3BhdGggPSBvcy5wYXRoLmpvaW4oT1BUSU9OUy5pbnB1dF90bXAsICJJTUFHRVMiLCBpbWdfbmFtZSkKKyAgICBpZiBvcy5wYXRoLmV4aXN0cyhwcmVidWlsdF9wYXRoKToKKyAgICAgIHByaW50KCIlcyBhbHJlYWR5IGV4aXN0cywgbm8gbmVlZCB0byBvdmVyd3JpdGUuLi4iICUgKGltZ19uYW1lLCkpCisgICAgICBjb250aW51ZQorCisgICAgaW1nX3JhZGlvX3BhdGggPSBvcy5wYXRoLmpvaW4oT1BUSU9OUy5pbnB1dF90bXAsICJSQURJTyIsIGltZ19uYW1lKQorICAgIGlmIG9zLnBhdGguZXhpc3RzKGltZ19yYWRpb19wYXRoKToKKyAgICAgIGlmIG91dHB1dF96aXA6CisgICAgICAgIGNvbW1vbi5aaXBXcml0ZShvdXRwdXRfemlwLCBpbWdfcmFkaW9fcGF0aCwgIklNQUdFUy8iICsgaW1nX25hbWUpCisgICAgICBlbHNlOgorICAgICAgICBzaHV0aWwuY29weShpbWdfcmFkaW9fcGF0aCwgcHJlYnVpbHRfcGF0aCkKKyAgICAgIGNvbnRpbnVlCisKKyAgICAjIFdhbGsgdGhyb3VnaCBWRU5ET1JfSU1BR0VTLyBzaW5jZSBmaWxlcyBjb3VsZCBiZSB1bmRlciBzdWJkaXJzLgorICAgIGltZ192ZW5kb3JfZGlyID0gb3MucGF0aC5qb2luKE9QVElPTlMuaW5wdXRfdG1wLCAiVkVORE9SX0lNQUdFUyIpCisgICAgZm9yIHJvb3QsIF8sIGZpbGVzIGluIG9zLndhbGsoaW1nX3ZlbmRvcl9kaXIpOgorICAgICAgaWYgaW1nX25hbWUgaW4gZmlsZXM6CisgICAgICAgIGlmIG91dHB1dF96aXA6CisgICAgICAgICAgY29tbW9uLlppcFdyaXRlKG91dHB1dF96aXAsIG9zLnBhdGguam9pbihyb290LCBpbWdfbmFtZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJJTUFHRVMvIiArIGltZ19uYW1lKQorICAgICAgICBlbHNlOgorICAgICAgICAgIHNodXRpbC5jb3B5KG9zLnBhdGguam9pbihyb290LCBpbWdfbmFtZSksIHByZWJ1aWx0X3BhdGgpCisgICAgICAgIGJyZWFrCisKKyAgICAjIEFzc2VydCB0aGF0IHRoZSBpbWFnZSBpcyBwcmVzZW50IHVuZGVyIElNQUdFUy8gbm93LgorICAgIGlmIG91dHB1dF96aXA6CisgICAgICAjIFppcCBzcGVjIHNheXM6IEFsbCBzbGFzaGVzIE1VU1QgYmUgZm9yd2FyZCBzbGFzaGVzLgorICAgICAgaW1nX3BhdGggPSAnSU1BR0VTLycgKyBpbWdfbmFtZQorICAgICAgYXNzZXJ0IGltZ19wYXRoIGluIG91dHB1dF96aXAubmFtZWxpc3QoKSwgImNhbm5vdCBmaW5kICIgKyBpbWdfbmFtZQorICAgIGVsc2U6CisgICAgICBpbWdfcGF0aCA9IG9zLnBhdGguam9pbihPUFRJT05TLmlucHV0X3RtcCwgIklNQUdFUyIsIGltZ19uYW1lKQorICAgICAgYXNzZXJ0IG9zLnBhdGguZXhpc3RzKGltZ19wYXRoKSwgImNhbm5vdCBmaW5kICIgKyBpbWdfbmFtZQorCisKK2RlZiBBZGRDYXJlTWFwVHh0Rm9yQWJPdGEob3V0cHV0X3ppcCwgYWJfcGFydGl0aW9ucywgaW1hZ2VfcGF0aHMpOgorICAiIiJHZW5lcmF0ZXMgYW5kIGFkZHMgY2FyZV9tYXAudHh0IGZvciBzeXN0ZW0gYW5kIHZlbmRvciBwYXJ0aXRpb25zLgorCisgIEFyZ3M6CisgICAgb3V0cHV0X3ppcDogVGhlIG91dHB1dCB6aXAgZmlsZSAobmVlZHMgdG8gYmUgYWxyZWFkeSBvcGVuKSwgb3IgTm9uZSB0bworICAgICAgICB3cml0ZSBpbWFnZXMgdG8gT1BUSU9OUy5pbnB1dF90bXAvLgorICAgIGFiX3BhcnRpdGlvbnM6IFRoZSBsaXN0IG9mIEEvQiBwYXJ0aXRpb25zLgorICAgIGltYWdlX3BhdGhzOiBBIG1hcCBmcm9tIHRoZSBwYXJ0aXRpb24gbmFtZSB0byB0aGUgaW1hZ2UgcGF0aC4KKyAgIiIiCisgIGNhcmVfbWFwX2xpc3QgPSBbXQorICBmb3IgcGFydGl0aW9uIGluIGFiX3BhcnRpdGlvbnM6CisgICAgcGFydGl0aW9uID0gcGFydGl0aW9uLnN0cmlwKCkKKyAgICBpZiBwYXJ0aXRpb24gbm90IGluIFBBUlRJVElPTlNfV0lUSF9DQVJFX01BUDoKKyAgICAgIGNvbnRpbnVlCisKKyAgICB2ZXJpdHlfYmxvY2tfZGV2aWNlID0gInt9X3Zlcml0eV9ibG9ja19kZXZpY2UiLmZvcm1hdChwYXJ0aXRpb24pCisgICAgYXZiX2hhc2h0cmVlX2VuYWJsZSA9ICJhdmJfe31faGFzaHRyZWVfZW5hYmxlIi5mb3JtYXQocGFydGl0aW9uKQorICAgIGlmICh2ZXJpdHlfYmxvY2tfZGV2aWNlIGluIE9QVElPTlMuaW5mb19kaWN0IG9yCisgICAgICAgIE9QVElPTlMuaW5mb19kaWN0LmdldChhdmJfaGFzaHRyZWVfZW5hYmxlKSA9PSAidHJ1ZSIpOgorICAgICAgaW1hZ2VfcGF0aCA9IGltYWdlX3BhdGhzW3BhcnRpdGlvbl0KKyAgICAgIGFzc2VydCBvcy5wYXRoLmV4aXN0cyhpbWFnZV9wYXRoKQorICAgICAgY2FyZV9tYXBfbGlzdCArPSBHZXRDYXJlTWFwKHBhcnRpdGlvbiwgaW1hZ2VfcGF0aCkKKworICBpZiBjYXJlX21hcF9saXN0OgorICAgIGNhcmVfbWFwX3BhdGggPSAiTUVUQS9jYXJlX21hcC50eHQiCisgICAgaWYgb3V0cHV0X3ppcCBhbmQgY2FyZV9tYXBfcGF0aCBub3QgaW4gb3V0cHV0X3ppcC5uYW1lbGlzdCgpOgorICAgICAgY29tbW9uLlppcFdyaXRlU3RyKG91dHB1dF96aXAsIGNhcmVfbWFwX3BhdGgsICdcbicuam9pbihjYXJlX21hcF9saXN0KSkKKyAgICBlbHNlOgorICAgICAgd2l0aCBvcGVuKG9zLnBhdGguam9pbihPUFRJT05TLmlucHV0X3RtcCwgY2FyZV9tYXBfcGF0aCksICd3JykgYXMgZnA6CisgICAgICAgIGZwLndyaXRlKCdcbicuam9pbihjYXJlX21hcF9saXN0KSkKKyAgICAgIGlmIG91dHB1dF96aXA6CisgICAgICAgIE9QVElPTlMucmVwbGFjZV91cGRhdGVkX2ZpbGVzX2xpc3QuYXBwZW5kKGNhcmVfbWFwX3BhdGgpCisKKworZGVmIEFkZFBhY2tSYWRpb0ltYWdlcyhvdXRwdXRfemlwLCBpbWFnZXMpOgorICAiIiJDb3BpZXMgaW1hZ2VzIGxpc3RlZCBpbiBNRVRBL3BhY2tfcmFkaW9pbWFnZXMudHh0IGZyb20gUkFESU8vIHRvIElNQUdFUy8uCisKKyAgQXJnczoKKyAgICBvdXRwdXRfemlwOiBUaGUgb3V0cHV0IHppcCBmaWxlIChuZWVkcyB0byBiZSBhbHJlYWR5IG9wZW4pLCBvciBOb25lIHRvCisgICAgICAgIHdyaXRlIGltYWdlcyB0byBPUFRJT05TLmlucHV0X3RtcC8uCisgICAgaW1hZ2VzOiBBIGxpc3Qgb2YgaW1hZ2UgbmFtZXMuCisKKyAgUmFpc2VzOgorICAgIEFzc2VydGlvbkVycm9yOiBJZiBhIGxpc3RlZCBpbWFnZSBjYW4ndCBiZSBmb3VuZC4KKyAgIiIiCisgIGZvciBpbWFnZSBpbiBpbWFnZXM6CisgICAgaW1nX25hbWUgPSBpbWFnZS5zdHJpcCgpCisgICAgXywgZXh0ID0gb3MucGF0aC5zcGxpdGV4dChpbWdfbmFtZSkKKyAgICBpZiBub3QgZXh0OgorICAgICAgaW1nX25hbWUgKz0gIi5pbWciCisKKyAgICBwcmVidWlsdF9wYXRoID0gb3MucGF0aC5qb2luKE9QVElPTlMuaW5wdXRfdG1wLCAiSU1BR0VTIiwgaW1nX25hbWUpCisgICAgaWYgb3MucGF0aC5leGlzdHMocHJlYnVpbHRfcGF0aCk6CisgICAgICBwcmludCgiJXMgYWxyZWFkeSBleGlzdHMsIG5vIG5lZWQgdG8gb3ZlcndyaXRlLi4uIiAlIChpbWdfbmFtZSwpKQorICAgICAgY29udGludWUKKworICAgIGltZ19yYWRpb19wYXRoID0gb3MucGF0aC5qb2luKE9QVElPTlMuaW5wdXRfdG1wLCAiUkFESU8iLCBpbWdfbmFtZSkKKyAgICBhc3NlcnQgb3MucGF0aC5leGlzdHMoaW1nX3JhZGlvX3BhdGgpLCBcCisgICAgICAgICJGYWlsZWQgdG8gZmluZCAlcyBhdCAlcyIgJSAoaW1nX25hbWUsIGltZ19yYWRpb19wYXRoKQorCisgICAgaWYgb3V0cHV0X3ppcDoKKyAgICAgIGNvbW1vbi5aaXBXcml0ZShvdXRwdXRfemlwLCBpbWdfcmFkaW9fcGF0aCwgIklNQUdFUy8iICsgaW1nX25hbWUpCisgICAgZWxzZToKKyAgICAgIHNodXRpbC5jb3B5KGltZ19yYWRpb19wYXRoLCBwcmVidWlsdF9wYXRoKQorCisKIGRlZiBSZXBsYWNlVXBkYXRlZEZpbGVzKHppcF9maWxlbmFtZSwgZmlsZXNfbGlzdCk6Ci0gICIiIlVwZGF0ZSBhbGwgdGhlIHppcCBlbnRyaWVzIGxpc3RlZCBpbiB0aGUgZmlsZXNfbGlzdC4KKyAgIiIiVXBkYXRlcyBhbGwgdGhlIFpJUCBlbnRyaWVzIGxpc3RlZCBpbiBmaWxlc19saXN0LgogCiAgIEZvciBub3cgdGhlIGxpc3QgaW5jbHVkZXMgTUVUQS9jYXJlX21hcC50eHQsIGFuZCB0aGUgcmVsYXRlZCBmaWxlcyB1bmRlcgogICBTWVNURU0vIGFmdGVyIHJlYnVpbGRpbmcgcmVjb3ZlcnkuCiAgICIiIgotCi0gIGNtZCA9IFsiemlwIiwgIi1kIiwgemlwX2ZpbGVuYW1lXSArIGZpbGVzX2xpc3QKLSAgcCA9IGNvbW1vbi5SdW4oY21kLCBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLCBzdGRlcnI9c3VicHJvY2Vzcy5TVERPVVQpCi0gIHAuY29tbXVuaWNhdGUoKQotCisgIGNvbW1vbi5aaXBEZWxldGUoemlwX2ZpbGVuYW1lLCBmaWxlc19saXN0KQogICBvdXRwdXRfemlwID0gemlwZmlsZS5aaXBGaWxlKHppcF9maWxlbmFtZSwgImEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzaW9uPXppcGZpbGUuWklQX0RFRkxBVEVELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93WmlwNjQ9VHJ1ZSkKQEAgLTUwOSwxMTYgKzYyMywxMjEgQEAKIAogCiBkZWYgQWRkSW1hZ2VzVG9UYXJnZXRGaWxlcyhmaWxlbmFtZSk6CisgICIiIkNyZWF0ZXMgYW5kIGFkZHMgaW1hZ2VzIChib290L3JlY292ZXJ5L3N5c3RlbS8uLi4pIHRvIGEgdGFyZ2V0X2ZpbGVzLnppcC4KKworICBJdCB3b3JrcyB3aXRoIGVpdGhlciBhIHppcCBmaWxlICh6aXAgbW9kZSksIG9yIGEgZGlyZWN0b3J5IHRoYXQgY29udGFpbnMgdGhlCisgIGZpbGVzIHRvIGJlIHBhY2tlZCBpbnRvIGEgdGFyZ2V0X2ZpbGVzLnppcCAoZGlyIG1vZGUpLiBUaGUgbGF0dGVyIGlzIHVzZWQgd2hlbgorICBiZWluZyBjYWxsZWQgZnJvbSBidWlsZC9tYWtlL2NvcmUvTWFrZWZpbGUuCisKKyAgVGhlIGltYWdlcyB3aWxsIGJlIGNyZWF0ZWQgdW5kZXIgSU1BR0VTLyBpbiB0aGUgaW5wdXQgdGFyZ2V0X2ZpbGVzLnppcC4KKworICBBcmdzOgorICAgIGZpbGVuYW1lOiB0aGUgdGFyZ2V0X2ZpbGVzLnppcCwgb3IgdGhlIHppcCByb290IGRpcmVjdG9yeS4KKyAgIiIiCiAgIGlmIG9zLnBhdGguaXNkaXIoZmlsZW5hbWUpOgogICAgIE9QVElPTlMuaW5wdXRfdG1wID0gb3MucGF0aC5hYnNwYXRoKGZpbGVuYW1lKQotICAgIGlucHV0X3ppcCA9IE5vbmUKICAgZWxzZToKLSAgICBPUFRJT05TLmlucHV0X3RtcCwgaW5wdXRfemlwID0gY29tbW9uLlVuemlwVGVtcChmaWxlbmFtZSkKKyAgICBPUFRJT05TLmlucHV0X3RtcCA9IGNvbW1vbi5VbnppcFRlbXAoZmlsZW5hbWUpCiAKICAgaWYgbm90IE9QVElPTlMuYWRkX21pc3Npbmc6CiAgICAgaWYgb3MucGF0aC5pc2Rpcihvcy5wYXRoLmpvaW4oT1BUSU9OUy5pbnB1dF90bXAsICJJTUFHRVMiKSk6CiAgICAgICBwcmludCgidGFyZ2V0X2ZpbGVzIGFwcGVhcnMgdG8gYWxyZWFkeSBjb250YWluIGltYWdlcy4iKQogICAgICAgc3lzLmV4aXQoMSkKIAotICAjIHZlbmRvci5pbWcgaXMgdW5saWtlIHN5c3RlbS5pbWcgb3Igc3lzdGVtX290aGVyLmltZy4gQmVjYXVzZSBpdCBjb3VsZCBiZQotICAjIGJ1aWx0IGZyb20gc291cmNlLCBvciBkcm9wcGVkIGludG8gdGFyZ2V0X2ZpbGVzLnppcCBhcyBhIHByZWJ1aWx0IGJsb2IuIFdlCi0gICMgY29uc2lkZXIgZWl0aGVyIG9mIHRoZW0gYXMgdmVuZG9yLmltZyBiZWluZyBhdmFpbGFibGUsIHdoaWNoIGNvdWxkIGJlIHVzZWQKLSAgIyB3aGVuIGdlbmVyYXRpbmcgdmJtZXRhLmltZyBmb3IgQVZCLgorICBPUFRJT05TLmluZm9fZGljdCA9IGNvbW1vbi5Mb2FkSW5mb0RpY3QoT1BUSU9OUy5pbnB1dF90bXAsIE9QVElPTlMuaW5wdXRfdG1wKQorCisgIGhhc19yZWNvdmVyeSA9IE9QVElPTlMuaW5mb19kaWN0LmdldCgibm9fcmVjb3ZlcnkiKSAhPSAidHJ1ZSIKKworICAjIHt2ZW5kb3IscHJvZHVjdH0uaW1nIGlzIHVubGlrZSBzeXN0ZW0uaW1nIG9yIHN5c3RlbV9vdGhlci5pbWcuIEJlY2F1c2UgaXQKKyAgIyBjb3VsZCBiZSBidWlsdCBmcm9tIHNvdXJjZSwgb3IgZHJvcHBlZCBpbnRvIHRhcmdldF9maWxlcy56aXAgYXMgYSBwcmVidWlsdAorICAjIGJsb2IuIFdlIGNvbnNpZGVyIGVpdGhlciBvZiB0aGVtIGFzIHt2ZW5kb3IscHJvZHVjdH0uaW1nIGJlaW5nIGF2YWlsYWJsZSwKKyAgIyB3aGljaCBjb3VsZCBiZSB1c2VkIHdoZW4gZ2VuZXJhdGluZyB2Ym1ldGEuaW1nIGZvciBBVkIuCiAgIGhhc192ZW5kb3IgPSAob3MucGF0aC5pc2Rpcihvcy5wYXRoLmpvaW4oT1BUSU9OUy5pbnB1dF90bXAsICJWRU5ET1IiKSkgb3IKICAgICAgICAgICAgICAgICBvcy5wYXRoLmV4aXN0cyhvcy5wYXRoLmpvaW4oT1BUSU9OUy5pbnB1dF90bXAsICJJTUFHRVMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmVuZG9yLmltZyIpKSkKKyAgaGFzX3Byb2R1Y3QgPSAob3MucGF0aC5pc2Rpcihvcy5wYXRoLmpvaW4oT1BUSU9OUy5pbnB1dF90bXAsICJQUk9EVUNUIikpIG9yCisgICAgICAgICAgICAgICAgIG9zLnBhdGguZXhpc3RzKG9zLnBhdGguam9pbihPUFRJT05TLmlucHV0X3RtcCwgIklNQUdFUyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJvZHVjdC5pbWciKSkpCiAgIGhhc19zeXN0ZW1fb3RoZXIgPSBvcy5wYXRoLmlzZGlyKG9zLnBhdGguam9pbihPUFRJT05TLmlucHV0X3RtcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTWVNURU1fT1RIRVIiKSkKIAotICBpZiBpbnB1dF96aXA6Ci0gICAgT1BUSU9OUy5pbmZvX2RpY3QgPSBjb21tb24uTG9hZEluZm9EaWN0KGlucHV0X3ppcCwgT1BUSU9OUy5pbnB1dF90bXApCi0KLSAgICBjb21tb24uWmlwQ2xvc2UoaW5wdXRfemlwKQorICAjIFNldCB1cCB0aGUgb3V0cHV0IGRlc3RpbmF0aW9uLiBJdCB3cml0ZXMgdG8gdGhlIGdpdmVuIGRpcmVjdG9yeSBmb3IgZGlyCisgICMgbW9kZTsgb3RoZXJ3aXNlIGFwcGVuZHMgdG8gdGhlIGdpdmVuIFpJUC4KKyAgaWYgb3MucGF0aC5pc2RpcihmaWxlbmFtZSk6CisgICAgb3V0cHV0X3ppcCA9IE5vbmUKKyAgZWxzZToKICAgICBvdXRwdXRfemlwID0gemlwZmlsZS5aaXBGaWxlKGZpbGVuYW1lLCAiYSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wcmVzc2lvbj16aXBmaWxlLlpJUF9ERUZMQVRFRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93WmlwNjQ9VHJ1ZSkKLSAgZWxzZToKLSAgICBPUFRJT05TLmluZm9fZGljdCA9IGNvbW1vbi5Mb2FkSW5mb0RpY3QoZmlsZW5hbWUsIGZpbGVuYW1lKQotICAgIG91dHB1dF96aXAgPSBOb25lCi0gICAgaW1hZ2VzX2RpciA9IG9zLnBhdGguam9pbihPUFRJT05TLmlucHV0X3RtcCwgIklNQUdFUyIpCi0gICAgaWYgbm90IG9zLnBhdGguaXNkaXIoaW1hZ2VzX2Rpcik6Ci0gICAgICBvcy5tYWtlZGlycyhpbWFnZXNfZGlyKQotICAgIGltYWdlc19kaXIgPSBOb25lCiAKLSAgaGFzX3JlY292ZXJ5ID0gKE9QVElPTlMuaW5mb19kaWN0LmdldCgibm9fcmVjb3ZlcnkiKSAhPSAidHJ1ZSIpCisgICMgQWx3YXlzIG1ha2UgaW5wdXRfdG1wL0lNQUdFUyBhdmFpbGFibGUsIHNpbmNlIHdlIG1heSBzdGFnZSBib290IC8gcmVjb3ZlcnkKKyAgIyBpbWFnZXMgdGhlcmUgZXZlbiB1bmRlciB6aXAgbW9kZS4gVGhlIGRpcmVjdG9yeSB3aWxsIGJlIGNsZWFuZWQgdXAgYXMgcGFydAorICAjIG9mIE9QVElPTlMuaW5wdXRfdG1wLgorICBpbWFnZXNfZGlyID0gb3MucGF0aC5qb2luKE9QVElPTlMuaW5wdXRfdG1wLCAiSU1BR0VTIikKKyAgaWYgbm90IG9zLnBhdGguaXNkaXIoaW1hZ2VzX2Rpcik6CisgICAgb3MubWFrZWRpcnMoaW1hZ2VzX2RpcikKIAotICBpZiBPUFRJT05TLmluZm9fZGljdC5nZXQoImF2Yl9lbmFibGUiKSA9PSAidHJ1ZSI6Ci0gICAgZnAgPSBOb25lCi0gICAgaWYgImJ1aWxkLnByb3AiIGluIE9QVElPTlMuaW5mb19kaWN0OgotICAgICAgYnVpbGRfcHJvcCA9IE9QVElPTlMuaW5mb19kaWN0WyJidWlsZC5wcm9wIl0KLSAgICAgIGlmICJyby5idWlsZC5maW5nZXJwcmludCIgaW4gYnVpbGRfcHJvcDoKLSAgICAgICAgZnAgPSBidWlsZF9wcm9wWyJyby5idWlsZC5maW5nZXJwcmludCJdCi0gICAgICBlbGlmICJyby5idWlsZC50aHVtYnByaW50IiBpbiBidWlsZF9wcm9wOgotICAgICAgICBmcCA9IGJ1aWxkX3Byb3BbInJvLmJ1aWxkLnRodW1icHJpbnQiXQotICAgIGlmIGZwOgotICAgICAgT1BUSU9OUy5pbmZvX2RpY3RbImF2Yl9zYWx0Il0gPSBoYXNobGliLnNoYTI1NihmcCkuaGV4ZGlnZXN0KCkKKyAgIyBBIG1hcCBiZXR3ZWVuIHBhcnRpdGlvbiBuYW1lcyBhbmQgdGhlaXIgcGF0aHMsIHdoaWNoIGNvdWxkIGJlIHVzZWQgd2hlbgorICAjIGdlbmVyYXRpbmcgQVZCIHZibWV0YSBpbWFnZS4KKyAgcGFydGl0aW9ucyA9IGRpY3QoKQogCiAgIGRlZiBiYW5uZXIocyk6CiAgICAgcHJpbnQoIlxuXG4rKysrICIgKyBzICsgIiArKysrXG5cbiIpCiAKLSAgcHJlYnVpbHRfcGF0aCA9IG9zLnBhdGguam9pbihPUFRJT05TLmlucHV0X3RtcCwgIklNQUdFUyIsICJib290LmltZyIpCi0gIGJvb3RfaW1hZ2UgPSBOb25lCi0gIGlmIG9zLnBhdGguZXhpc3RzKHByZWJ1aWx0X3BhdGgpOgotICAgIGJhbm5lcigiYm9vdCIpCi0gICAgcHJpbnQoImJvb3QuaW1nIGFscmVhZHkgZXhpc3RzIGluIElNQUdFUy8sIG5vIG5lZWQgdG8gcmVidWlsZC4uLiIpCi0gICAgaWYgT1BUSU9OUy5yZWJ1aWxkX3JlY292ZXJ5OgotICAgICAgYm9vdF9pbWFnZSA9IGNvbW1vbi5HZXRCb290YWJsZUltYWdlKAotICAgICAgICAgICJJTUFHRVMvYm9vdC5pbWciLCAiYm9vdC5pbWciLCBPUFRJT05TLmlucHV0X3RtcCwgIkJPT1QiKQotICBlbHNlOgotICAgIGJhbm5lcigiYm9vdCIpCi0gICAgYm9vdF9pbWFnZSA9IGNvbW1vbi5HZXRCb290YWJsZUltYWdlKAotICAgICAgICAiSU1BR0VTL2Jvb3QuaW1nIiwgImJvb3QuaW1nIiwgT1BUSU9OUy5pbnB1dF90bXAsICJCT09UIikKLSAgICBpZiBib290X2ltYWdlOgorICBiYW5uZXIoImJvb3QiKQorICAjIGNvbW1vbi5HZXRCb290YWJsZUltYWdlKCkgcmV0dXJucyB0aGUgaW1hZ2UgZGlyZWN0bHkgaWYgcHJlc2VudC4KKyAgYm9vdF9pbWFnZSA9IGNvbW1vbi5HZXRCb290YWJsZUltYWdlKAorICAgICAgIklNQUdFUy9ib290LmltZyIsICJib290LmltZyIsIE9QVElPTlMuaW5wdXRfdG1wLCAiQk9PVCIpCisgICMgYm9vdC5pbWcgbWF5IGJlIHVuYXZhaWxhYmxlIGluIHNvbWUgdGFyZ2V0cyAoZS5nLiBhb3NwX2FybTY0KS4KKyAgaWYgYm9vdF9pbWFnZToKKyAgICBwYXJ0aXRpb25zWydib290J10gPSBvcy5wYXRoLmpvaW4oT1BUSU9OUy5pbnB1dF90bXAsICJJTUFHRVMiLCAiYm9vdC5pbWciKQorICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhwYXJ0aXRpb25zWydib290J10pOgorICAgICAgYm9vdF9pbWFnZS5Xcml0ZVRvRGlyKE9QVElPTlMuaW5wdXRfdG1wKQogICAgICAgaWYgb3V0cHV0X3ppcDoKICAgICAgICAgYm9vdF9pbWFnZS5BZGRUb1ppcChvdXRwdXRfemlwKQotICAgICAgZWxzZToKLSAgICAgICAgYm9vdF9pbWFnZS5Xcml0ZVRvRGlyKE9QVElPTlMuaW5wdXRfdG1wKQogCiAgIHJlY292ZXJ5X2ltYWdlID0gTm9uZQogICBpZiBoYXNfcmVjb3Zlcnk6CiAgICAgYmFubmVyKCJyZWNvdmVyeSIpCi0gICAgcHJlYnVpbHRfcGF0aCA9IG9zLnBhdGguam9pbihPUFRJT05TLmlucHV0X3RtcCwgIklNQUdFUyIsICJyZWNvdmVyeS5pbWciKQotICAgIGlmIG9zLnBhdGguZXhpc3RzKHByZWJ1aWx0X3BhdGgpOgotICAgICAgcHJpbnQoInJlY292ZXJ5LmltZyBhbHJlYWR5IGV4aXN0cyBpbiBJTUFHRVMvLCBubyBuZWVkIHRvIHJlYnVpbGQuLi4iKQotICAgICAgaWYgT1BUSU9OUy5yZWJ1aWxkX3JlY292ZXJ5OgotICAgICAgICByZWNvdmVyeV9pbWFnZSA9IGNvbW1vbi5HZXRCb290YWJsZUltYWdlKAotICAgICAgICAgICAgIklNQUdFUy9yZWNvdmVyeS5pbWciLCAicmVjb3ZlcnkuaW1nIiwgT1BUSU9OUy5pbnB1dF90bXAsCi0gICAgICAgICAgICAiUkVDT1ZFUlkiKQotICAgIGVsc2U6Ci0gICAgICByZWNvdmVyeV9pbWFnZSA9IGNvbW1vbi5HZXRCb290YWJsZUltYWdlKAotICAgICAgICAgICJJTUFHRVMvcmVjb3ZlcnkuaW1nIiwgInJlY292ZXJ5LmltZyIsIE9QVElPTlMuaW5wdXRfdG1wLCAiUkVDT1ZFUlkiKQotICAgICAgaWYgcmVjb3ZlcnlfaW1hZ2U6Ci0gICAgICAgIGlmIG91dHB1dF96aXA6Ci0gICAgICAgICAgcmVjb3ZlcnlfaW1hZ2UuQWRkVG9aaXAob3V0cHV0X3ppcCkKLSAgICAgICAgZWxzZToKLSAgICAgICAgICByZWNvdmVyeV9pbWFnZS5Xcml0ZVRvRGlyKE9QVElPTlMuaW5wdXRfdG1wKQorICAgIHJlY292ZXJ5X2ltYWdlID0gY29tbW9uLkdldEJvb3RhYmxlSW1hZ2UoCisgICAgICAgICJJTUFHRVMvcmVjb3ZlcnkuaW1nIiwgInJlY292ZXJ5LmltZyIsIE9QVElPTlMuaW5wdXRfdG1wLCAiUkVDT1ZFUlkiKQorICAgIGFzc2VydCByZWNvdmVyeV9pbWFnZSwgIkZhaWxlZCB0byBjcmVhdGUgcmVjb3ZlcnkuaW1nLiIKKyAgICBwYXJ0aXRpb25zWydyZWNvdmVyeSddID0gb3MucGF0aC5qb2luKAorICAgICAgICBPUFRJT05TLmlucHV0X3RtcCwgIklNQUdFUyIsICJyZWNvdmVyeS5pbWciKQorICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhwYXJ0aXRpb25zWydyZWNvdmVyeSddKToKKyAgICAgIHJlY292ZXJ5X2ltYWdlLldyaXRlVG9EaXIoT1BUSU9OUy5pbnB1dF90bXApCisgICAgICBpZiBvdXRwdXRfemlwOgorICAgICAgICByZWNvdmVyeV9pbWFnZS5BZGRUb1ppcChvdXRwdXRfemlwKQogCiAgICAgICBiYW5uZXIoInJlY292ZXJ5ICh0d28tc3RlcCBpbWFnZSkiKQogICAgICAgIyBUaGUgc3BlY2lhbCByZWNvdmVyeS5pbWcgZm9yIHR3by1zdGVwIHBhY2thZ2UgdXNlLgogICAgICAgcmVjb3ZlcnlfdHdvX3N0ZXBfaW1hZ2UgPSBjb21tb24uR2V0Qm9vdGFibGVJbWFnZSgKICAgICAgICAgICAiSU1BR0VTL3JlY292ZXJ5LXR3by1zdGVwLmltZyIsICJyZWNvdmVyeS10d28tc3RlcC5pbWciLAogICAgICAgICAgIE9QVElPTlMuaW5wdXRfdG1wLCAiUkVDT1ZFUlkiLCB0d29fc3RlcF9pbWFnZT1UcnVlKQotICAgICAgaWYgcmVjb3ZlcnlfdHdvX3N0ZXBfaW1hZ2U6CisgICAgICBhc3NlcnQgcmVjb3ZlcnlfdHdvX3N0ZXBfaW1hZ2UsICJGYWlsZWQgdG8gY3JlYXRlIHJlY292ZXJ5LXR3by1zdGVwLmltZy4iCisgICAgICByZWNvdmVyeV90d29fc3RlcF9pbWFnZV9wYXRoID0gb3MucGF0aC5qb2luKAorICAgICAgICAgIE9QVElPTlMuaW5wdXRfdG1wLCAiSU1BR0VTIiwgInJlY292ZXJ5LXR3by1zdGVwLmltZyIpCisgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMocmVjb3ZlcnlfdHdvX3N0ZXBfaW1hZ2VfcGF0aCk6CisgICAgICAgIHJlY292ZXJ5X3R3b19zdGVwX2ltYWdlLldyaXRlVG9EaXIoT1BUSU9OUy5pbnB1dF90bXApCiAgICAgICAgIGlmIG91dHB1dF96aXA6CiAgICAgICAgICAgcmVjb3ZlcnlfdHdvX3N0ZXBfaW1hZ2UuQWRkVG9aaXAob3V0cHV0X3ppcCkKLSAgICAgICAgZWxzZToKLSAgICAgICAgICByZWNvdmVyeV90d29fc3RlcF9pbWFnZS5Xcml0ZVRvRGlyKE9QVElPTlMuaW5wdXRfdG1wKQogCiAgIGJhbm5lcigic3lzdGVtIikKLSAgc3lzdGVtX2ltZ19wYXRoID0gQWRkU3lzdGVtKAorICBwYXJ0aXRpb25zWydzeXN0ZW0nXSA9IEFkZFN5c3RlbSgKICAgICAgIG91dHB1dF96aXAsIHJlY292ZXJ5X2ltZz1yZWNvdmVyeV9pbWFnZSwgYm9vdF9pbWc9Ym9vdF9pbWFnZSkKLSAgdmVuZG9yX2ltZ19wYXRoID0gTm9uZQorCiAgIGlmIGhhc192ZW5kb3I6CiAgICAgYmFubmVyKCJ2ZW5kb3IiKQotICAgIHZlbmRvcl9pbWdfcGF0aCA9IEFkZFZlbmRvcihvdXRwdXRfemlwKQorICAgIHBhcnRpdGlvbnNbJ3ZlbmRvciddID0gQWRkVmVuZG9yKG91dHB1dF96aXApCisKKyAgaWYgaGFzX3Byb2R1Y3Q6CisgICAgYmFubmVyKCJwcm9kdWN0IikKKyAgICBwYXJ0aXRpb25zWydwcm9kdWN0J10gPSBBZGRQcm9kdWN0KG91dHB1dF96aXApCisKICAgaWYgaGFzX3N5c3RlbV9vdGhlcjoKICAgICBiYW5uZXIoInN5c3RlbV9vdGhlciIpCiAgICAgQWRkU3lzdGVtT3RoZXIob3V0cHV0X3ppcCkKKwogICBpZiBub3QgT1BUSU9OUy5pc19zaWduaW5nOgogICAgIGJhbm5lcigidXNlcmRhdGEiKQogICAgIEFkZFVzZXJkYXRhKG91dHB1dF96aXApCkBAIC02MjksMTA3ICs3NDgsMzYgQEAKICAgICBiYW5uZXIoInBhcnRpdGlvbi10YWJsZSIpCiAgICAgQWRkUGFydGl0aW9uVGFibGUob3V0cHV0X3ppcCkKIAotICBkdGJvX2ltZ19wYXRoID0gTm9uZQogICBpZiBPUFRJT05TLmluZm9fZGljdC5nZXQoImhhc19kdGJvIikgPT0gInRydWUiOgogICAgIGJhbm5lcigiZHRibyIpCi0gICAgZHRib19pbWdfcGF0aCA9IEFkZER0Ym8ob3V0cHV0X3ppcCkKKyAgICBwYXJ0aXRpb25zWydkdGJvJ10gPSBBZGREdGJvKG91dHB1dF96aXApCiAKICAgaWYgT1BUSU9OUy5pbmZvX2RpY3QuZ2V0KCJhdmJfZW5hYmxlIikgPT0gInRydWUiOgogICAgIGJhbm5lcigidmJtZXRhIikKLSAgICBib290X2NvbnRlbnRzID0gYm9vdF9pbWFnZS5Xcml0ZVRvVGVtcCgpCi0gICAgQWRkVkJNZXRhKG91dHB1dF96aXAsIGJvb3RfY29udGVudHMubmFtZSwgc3lzdGVtX2ltZ19wYXRoLAotICAgICAgICAgICAgICB2ZW5kb3JfaW1nX3BhdGgsIGR0Ym9faW1nX3BhdGgpCisgICAgQWRkVkJNZXRhKG91dHB1dF96aXAsIHBhcnRpdGlvbnMpCiAKLSAgIyBGb3IgZGV2aWNlcyB1c2luZyBBL0IgdXBkYXRlLCBjb3B5IG92ZXIgaW1hZ2VzIGZyb20gUkFESU8vIGFuZC9vcgotICAjIFZFTkRPUl9JTUFHRVMvIHRvIElNQUdFUy8gYW5kIG1ha2Ugc3VyZSB3ZSBoYXZlIGFsbCB0aGUgbmVlZGVkCi0gICMgaW1hZ2VzIHJlYWR5IHVuZGVyIElNQUdFUy8uIEFsbCBpbWFnZXMgc2hvdWxkIGhhdmUgJy5pbWcnIGFzIGV4dGVuc2lvbi4KICAgYmFubmVyKCJyYWRpbyIpCi0gIGFiX3BhcnRpdGlvbnMgPSBvcy5wYXRoLmpvaW4oT1BUSU9OUy5pbnB1dF90bXAsICJNRVRBIiwgImFiX3BhcnRpdGlvbnMudHh0IikKLSAgaWYgb3MucGF0aC5leGlzdHMoYWJfcGFydGl0aW9ucyk6Ci0gICAgd2l0aCBvcGVuKGFiX3BhcnRpdGlvbnMsICdyJykgYXMgZjoKLSAgICAgIGxpbmVzID0gZi5yZWFkbGluZXMoKQotICAgICMgRm9yIGRldmljZXMgdXNpbmcgQS9CIHVwZGF0ZSwgZ2VuZXJhdGUgY2FyZV9tYXAgZm9yIHN5c3RlbSBhbmQgdmVuZG9yCi0gICAgIyBwYXJ0aXRpb25zIChpZiBwcmVzZW50KSwgdGhlbiB3cml0ZSB0aGlzIGZpbGUgdG8gdGFyZ2V0X2ZpbGVzIHBhY2thZ2UuCi0gICAgY2FyZV9tYXBfbGlzdCA9IFtdCi0gICAgZm9yIGxpbmUgaW4gbGluZXM6Ci0gICAgICBpZiBsaW5lLnN0cmlwKCkgPT0gInN5c3RlbSIgYW5kICgKLSAgICAgICAgICAic3lzdGVtX3Zlcml0eV9ibG9ja19kZXZpY2UiIGluIE9QVElPTlMuaW5mb19kaWN0IG9yCi0gICAgICAgICAgT1BUSU9OUy5pbmZvX2RpY3QuZ2V0KCJhdmJfc3lzdGVtX2hhc2h0cmVlX2VuYWJsZSIpID09ICJ0cnVlIik6Ci0gICAgICAgIGFzc2VydCBvcy5wYXRoLmV4aXN0cyhzeXN0ZW1faW1nX3BhdGgpCi0gICAgICAgIGNhcmVfbWFwX2xpc3QgKz0gR2V0Q2FyZU1hcCgic3lzdGVtIiwgc3lzdGVtX2ltZ19wYXRoKQotICAgICAgaWYgbGluZS5zdHJpcCgpID09ICJ2ZW5kb3IiIGFuZCAoCi0gICAgICAgICAgInZlbmRvcl92ZXJpdHlfYmxvY2tfZGV2aWNlIiBpbiBPUFRJT05TLmluZm9fZGljdCBvcgotICAgICAgICAgIE9QVElPTlMuaW5mb19kaWN0LmdldCgiYXZiX3ZlbmRvcl9oYXNodHJlZV9lbmFibGUiKSA9PSAidHJ1ZSIpOgotICAgICAgICBhc3NlcnQgb3MucGF0aC5leGlzdHModmVuZG9yX2ltZ19wYXRoKQotICAgICAgICBjYXJlX21hcF9saXN0ICs9IEdldENhcmVNYXAoInZlbmRvciIsIHZlbmRvcl9pbWdfcGF0aCkKKyAgYWJfcGFydGl0aW9uc190eHQgPSBvcy5wYXRoLmpvaW4oT1BUSU9OUy5pbnB1dF90bXAsICJNRVRBIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFiX3BhcnRpdGlvbnMudHh0IikKKyAgaWYgb3MucGF0aC5leGlzdHMoYWJfcGFydGl0aW9uc190eHQpOgorICAgIHdpdGggb3BlbihhYl9wYXJ0aXRpb25zX3R4dCwgJ3InKSBhcyBmOgorICAgICAgYWJfcGFydGl0aW9ucyA9IGYucmVhZGxpbmVzKCkKIAotICAgICAgaW1nX25hbWUgPSBsaW5lLnN0cmlwKCkgKyAiLmltZyIKLSAgICAgIHByZWJ1aWx0X3BhdGggPSBvcy5wYXRoLmpvaW4oT1BUSU9OUy5pbnB1dF90bXAsICJJTUFHRVMiLCBpbWdfbmFtZSkKLSAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHByZWJ1aWx0X3BhdGgpOgotICAgICAgICBwcmludCgiJXMgYWxyZWFkeSBleGlzdHMsIG5vIG5lZWQgdG8gb3ZlcndyaXRlLi4uIiAlIChpbWdfbmFtZSwpKQotICAgICAgICBjb250aW51ZQorICAgICMgRm9yIGRldmljZXMgdXNpbmcgQS9CIHVwZGF0ZSwgY29weSBvdmVyIGltYWdlcyBmcm9tIFJBRElPLyBhbmQvb3IKKyAgICAjIFZFTkRPUl9JTUFHRVMvIHRvIElNQUdFUy8gYW5kIG1ha2Ugc3VyZSB3ZSBoYXZlIGFsbCB0aGUgbmVlZGVkCisgICAgIyBpbWFnZXMgcmVhZHkgdW5kZXIgSU1BR0VTLy4gQWxsIGltYWdlcyBzaG91bGQgaGF2ZSAnLmltZycgYXMgZXh0ZW5zaW9uLgorICAgIEFkZFJhZGlvSW1hZ2VzRm9yQWJPdGEob3V0cHV0X3ppcCwgYWJfcGFydGl0aW9ucykKIAotICAgICAgaW1nX3JhZGlvX3BhdGggPSBvcy5wYXRoLmpvaW4oT1BUSU9OUy5pbnB1dF90bXAsICJSQURJTyIsIGltZ19uYW1lKQotICAgICAgaW1nX3ZlbmRvcl9kaXIgPSBvcy5wYXRoLmpvaW4oCi0gICAgICAgIE9QVElPTlMuaW5wdXRfdG1wLCAiVkVORE9SX0lNQUdFUyIpCi0gICAgICBpZiBvcy5wYXRoLmV4aXN0cyhpbWdfcmFkaW9fcGF0aCk6Ci0gICAgICAgIGlmIG91dHB1dF96aXA6Ci0gICAgICAgICAgY29tbW9uLlppcFdyaXRlKG91dHB1dF96aXAsIGltZ19yYWRpb19wYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmpvaW4oIklNQUdFUyIsIGltZ19uYW1lKSkKLSAgICAgICAgZWxzZToKLSAgICAgICAgICBzaHV0aWwuY29weShpbWdfcmFkaW9fcGF0aCwgcHJlYnVpbHRfcGF0aCkKLSAgICAgIGVsc2U6Ci0gICAgICAgIGZvciByb290LCBfLCBmaWxlcyBpbiBvcy53YWxrKGltZ192ZW5kb3JfZGlyKToKLSAgICAgICAgICBpZiBpbWdfbmFtZSBpbiBmaWxlczoKLSAgICAgICAgICAgIGlmIG91dHB1dF96aXA6Ci0gICAgICAgICAgICAgIGNvbW1vbi5aaXBXcml0ZShvdXRwdXRfemlwLCBvcy5wYXRoLmpvaW4ocm9vdCwgaW1nX25hbWUpLAotICAgICAgICAgICAgICAgIG9zLnBhdGguam9pbigiSU1BR0VTIiwgaW1nX25hbWUpKQotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgc2h1dGlsLmNvcHkob3MucGF0aC5qb2luKHJvb3QsIGltZ19uYW1lKSwgcHJlYnVpbHRfcGF0aCkKLSAgICAgICAgICAgIGJyZWFrCi0KLSAgICAgIGlmIG91dHB1dF96aXA6Ci0gICAgICAgICMgWmlwIHNwZWMgc2F5czogQWxsIHNsYXNoZXMgTVVTVCBiZSBmb3J3YXJkIHNsYXNoZXMuCi0gICAgICAgIGltZ19wYXRoID0gJ0lNQUdFUy8nICsgaW1nX25hbWUKLSAgICAgICAgYXNzZXJ0IGltZ19wYXRoIGluIG91dHB1dF96aXAubmFtZWxpc3QoKSwgImNhbm5vdCBmaW5kICIgKyBpbWdfbmFtZQotICAgICAgZWxzZToKLSAgICAgICAgaW1nX3BhdGggPSBvcy5wYXRoLmpvaW4oT1BUSU9OUy5pbnB1dF90bXAsICJJTUFHRVMiLCBpbWdfbmFtZSkKLSAgICAgICAgYXNzZXJ0IG9zLnBhdGguZXhpc3RzKGltZ19wYXRoKSwgImNhbm5vdCBmaW5kICIgKyBpbWdfbmFtZQotCi0gICAgaWYgY2FyZV9tYXBfbGlzdDoKLSAgICAgIGNhcmVfbWFwX3BhdGggPSAiTUVUQS9jYXJlX21hcC50eHQiCi0gICAgICBpZiBvdXRwdXRfemlwIGFuZCBjYXJlX21hcF9wYXRoIG5vdCBpbiBvdXRwdXRfemlwLm5hbWVsaXN0KCk6Ci0gICAgICAgIGNvbW1vbi5aaXBXcml0ZVN0cihvdXRwdXRfemlwLCBjYXJlX21hcF9wYXRoLCAnXG4nLmpvaW4oY2FyZV9tYXBfbGlzdCkpCi0gICAgICBlbHNlOgotICAgICAgICB3aXRoIG9wZW4ob3MucGF0aC5qb2luKE9QVElPTlMuaW5wdXRfdG1wLCBjYXJlX21hcF9wYXRoKSwgJ3cnKSBhcyBmcDoKLSAgICAgICAgICBmcC53cml0ZSgnXG4nLmpvaW4oY2FyZV9tYXBfbGlzdCkpCi0gICAgICAgIGlmIG91dHB1dF96aXA6Ci0gICAgICAgICAgT1BUSU9OUy5yZXBsYWNlX3VwZGF0ZWRfZmlsZXNfbGlzdC5hcHBlbmQoY2FyZV9tYXBfcGF0aCkKKyAgICAjIEdlbmVyYXRlIGNhcmVfbWFwLnR4dCBmb3Igc3lzdGVtIGFuZCB2ZW5kb3IgcGFydGl0aW9ucyAoaWYgcHJlc2VudCksIHRoZW4KKyAgICAjIHdyaXRlIHRoaXMgZmlsZSB0byB0YXJnZXRfZmlsZXMgcGFja2FnZS4KKyAgICBBZGRDYXJlTWFwVHh0Rm9yQWJPdGEob3V0cHV0X3ppcCwgYWJfcGFydGl0aW9ucywgcGFydGl0aW9ucykKIAogICAjIFJhZGlvIGltYWdlcyB0aGF0IG5lZWQgdG8gYmUgcGFja2VkIGludG8gSU1BR0VTLywgYW5kIHByb2R1Y3QtaW1nLnppcC4KLSAgcGFja19yYWRpb2ltYWdlcyA9IG9zLnBhdGguam9pbigKKyAgcGFja19yYWRpb2ltYWdlc190eHQgPSBvcy5wYXRoLmpvaW4oCiAgICAgICBPUFRJT05TLmlucHV0X3RtcCwgIk1FVEEiLCAicGFja19yYWRpb2ltYWdlcy50eHQiKQotICBpZiBvcy5wYXRoLmV4aXN0cyhwYWNrX3JhZGlvaW1hZ2VzKToKLSAgICB3aXRoIG9wZW4ocGFja19yYWRpb2ltYWdlcywgJ3InKSBhcyBmOgotICAgICAgbGluZXMgPSBmLnJlYWRsaW5lcygpCi0gICAgZm9yIGxpbmUgaW4gbGluZXM6Ci0gICAgICBpbWdfbmFtZSA9IGxpbmUuc3RyaXAoKQotICAgICAgXywgZXh0ID0gb3MucGF0aC5zcGxpdGV4dChpbWdfbmFtZSkKLSAgICAgIGlmIG5vdCBleHQ6Ci0gICAgICAgIGltZ19uYW1lICs9ICIuaW1nIgotICAgICAgcHJlYnVpbHRfcGF0aCA9IG9zLnBhdGguam9pbihPUFRJT05TLmlucHV0X3RtcCwgIklNQUdFUyIsIGltZ19uYW1lKQotICAgICAgaWYgb3MucGF0aC5leGlzdHMocHJlYnVpbHRfcGF0aCk6Ci0gICAgICAgIHByaW50KCIlcyBhbHJlYWR5IGV4aXN0cywgbm8gbmVlZCB0byBvdmVyd3JpdGUuLi4iICUgKGltZ19uYW1lLCkpCi0gICAgICAgIGNvbnRpbnVlCi0KLSAgICAgIGltZ19yYWRpb19wYXRoID0gb3MucGF0aC5qb2luKE9QVElPTlMuaW5wdXRfdG1wLCAiUkFESU8iLCBpbWdfbmFtZSkKLSAgICAgIGFzc2VydCBvcy5wYXRoLmV4aXN0cyhpbWdfcmFkaW9fcGF0aCksIFwKLSAgICAgICAgICAiRmFpbGVkIHRvIGZpbmQgJXMgYXQgJXMiICUgKGltZ19uYW1lLCBpbWdfcmFkaW9fcGF0aCkKLSAgICAgIGlmIG91dHB1dF96aXA6Ci0gICAgICAgIGNvbW1vbi5aaXBXcml0ZShvdXRwdXRfemlwLCBpbWdfcmFkaW9fcGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgIG9zLnBhdGguam9pbigiSU1BR0VTIiwgaW1nX25hbWUpKQotICAgICAgZWxzZToKLSAgICAgICAgc2h1dGlsLmNvcHkoaW1nX3JhZGlvX3BhdGgsIHByZWJ1aWx0X3BhdGgpCisgIGlmIG9zLnBhdGguZXhpc3RzKHBhY2tfcmFkaW9pbWFnZXNfdHh0KToKKyAgICB3aXRoIG9wZW4ocGFja19yYWRpb2ltYWdlc190eHQsICdyJykgYXMgZjoKKyAgICAgIEFkZFBhY2tSYWRpb0ltYWdlcyhvdXRwdXRfemlwLCBmLnJlYWRsaW5lcygpKQogCiAgIGlmIG91dHB1dF96aXA6CiAgICAgY29tbW9uLlppcENsb3NlKG91dHB1dF96aXApCmRpZmYgLS1naXQgYS90b29scy9yZWxlYXNldG9vbHMvYmxvY2tpbWdkaWZmLnB5IGIvdG9vbHMvcmVsZWFzZXRvb2xzL2Jsb2NraW1nZGlmZi5weQppbmRleCBiODEyM2MwLi4yNGM1YjJkIDEwMDY0NAotLS0gYS90b29scy9yZWxlYXNldG9vbHMvYmxvY2tpbWdkaWZmLnB5CisrKyBiL3Rvb2xzL3JlbGVhc2V0b29scy9ibG9ja2ltZ2RpZmYucHkKQEAgLTE1LDcgKzE1LDcgQEAKIGZyb20gX19mdXR1cmVfXyBpbXBvcnQgcHJpbnRfZnVuY3Rpb24KIAogaW1wb3J0IGFycmF5Ci1pbXBvcnQgY29tbW9uCitpbXBvcnQgY29weQogaW1wb3J0IGZ1bmN0b29scwogaW1wb3J0IGhlYXBxCiBpbXBvcnQgaXRlcnRvb2xzCkBAIC0yNiw5ICsyNiwxMCBAQAogaW1wb3J0IHN1YnByb2Nlc3MKIGltcG9ydCBzeXMKIGltcG9ydCB0aHJlYWRpbmcKLQogZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgZGVxdWUsIE9yZGVyZWREaWN0CiBmcm9tIGhhc2hsaWIgaW1wb3J0IHNoYTEKKworaW1wb3J0IGNvbW1vbgogZnJvbSByYW5nZWxpYiBpbXBvcnQgUmFuZ2VTZXQKIAogCkBAIC0xOTAsOCArMTkxLDYgQEAKICAgICBzZWxmLnRndF9zaGExID0gdGd0X3NoYTEKICAgICBzZWxmLnNyY19zaGExID0gc3JjX3NoYTEKICAgICBzZWxmLnN0eWxlID0gc3R5bGUKLSAgICBzZWxmLmludGFjdCA9IChnZXRhdHRyKHRndF9yYW5nZXMsICJtb25vdG9uaWMiLCBGYWxzZSkgYW5kCi0gICAgICAgICAgICAgICAgICAgZ2V0YXR0cihzcmNfcmFuZ2VzLCAibW9ub3RvbmljIiwgRmFsc2UpKQogCiAgICAgIyBXZSB1c2UgT3JkZXJlZERpY3QgcmF0aGVyIHRoYW4gZGljdCBzbyB0aGF0IHRoZSBvdXRwdXQgaXMgcmVwZWF0YWJsZTsKICAgICAjIG90aGVyd2lzZSBpdCB3b3VsZCBkZXBlbmQgb24gdGhlIGhhc2ggdmFsdWVzIG9mIHRoZSBUcmFuc2ZlciBvYmplY3RzLgpAQCAtMjA0LDYgKzIwMywxOCBAQAogICAgIHNlbGYuaWQgPSBsZW4oYnlfaWQpCiAgICAgYnlfaWQuYXBwZW5kKHNlbGYpCiAKKyAgICBzZWxmLl9wYXRjaCA9IE5vbmUKKworICBAcHJvcGVydHkKKyAgZGVmIHBhdGNoKHNlbGYpOgorICAgIHJldHVybiBzZWxmLl9wYXRjaAorCisgIEBwYXRjaC5zZXR0ZXIKKyAgZGVmIHBhdGNoKHNlbGYsIHBhdGNoKToKKyAgICBpZiBwYXRjaDoKKyAgICAgIGFzc2VydCBzZWxmLnN0eWxlID09ICJkaWZmIgorICAgIHNlbGYuX3BhdGNoID0gcGF0Y2gKKwogICBkZWYgTmV0U3Rhc2hDaGFuZ2Uoc2VsZik6CiAgICAgcmV0dXJuIChzdW0oc3Iuc2l6ZSgpIGZvciAoXywgc3IpIGluIHNlbGYuc3Rhc2hfYmVmb3JlKSAtCiAgICAgICAgICAgICBzdW0oc3Iuc2l6ZSgpIGZvciAoXywgc3IpIGluIHNlbGYudXNlX3N0YXNoKSkKQEAgLTIxMyw2ICsyMjQsNyBAQAogICAgIHNlbGYudXNlX3N0YXNoID0gW10KICAgICBzZWxmLnN0eWxlID0gIm5ldyIKICAgICBzZWxmLnNyY19yYW5nZXMgPSBSYW5nZVNldCgpCisgICAgc2VsZi5wYXRjaCA9IE5vbmUKIAogICBkZWYgX19zdHJfXyhzZWxmKToKICAgICByZXR1cm4gKHN0cihzZWxmLmlkKSArICI6IDwiICsgc3RyKHNlbGYuc3JjX3JhbmdlcykgKyAiICIgKyBzZWxmLnN0eWxlICsKQEAgLTIyMywxOSArMjM1LDkzIEBACiBjbGFzcyBIZWFwSXRlbShvYmplY3QpOgogICBkZWYgX19pbml0X18oc2VsZiwgaXRlbSk6CiAgICAgc2VsZi5pdGVtID0gaXRlbQotICAgICMgTmVnYXRlIHRoZSBzY29yZSBzaW5jZSBweXRob24ncyBoZWFwIGlzIGEgbWluLWhlYXAgYW5kIHdlIHdhbnQKLSAgICAjIHRoZSBtYXhpbXVtIHNjb3JlLgorICAgICMgTmVnYXRlIHRoZSBzY29yZSBzaW5jZSBweXRob24ncyBoZWFwIGlzIGEgbWluLWhlYXAgYW5kIHdlIHdhbnQgdGhlCisgICAgIyBtYXhpbXVtIHNjb3JlLgogICAgIHNlbGYuc2NvcmUgPSAtaXRlbS5zY29yZQorCiAgIGRlZiBjbGVhcihzZWxmKToKICAgICBzZWxmLml0ZW0gPSBOb25lCisKICAgZGVmIF9fYm9vbF9fKHNlbGYpOgotICAgIHJldHVybiBzZWxmLml0ZW0gaXMgTm9uZQorICAgIHJldHVybiBzZWxmLml0ZW0gaXMgbm90IE5vbmUKKworICAjIFB5dGhvbiAyIHVzZXMgX19ub256ZXJvX18sIHdoaWxlIFB5dGhvbiAzIHVzZXMgX19ib29sX18uCisgIF9fbm9uemVyb19fID0gX19ib29sX18KKworICAjIFRoZSByZXN0IG9wZXJhdGlvbnMgYXJlIGdlbmVyYXRlZCBieSBmdW5jdG9vbHMudG90YWxfb3JkZXJpbmcgZGVjb3JhdG9yLgogICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKICAgICByZXR1cm4gc2VsZi5zY29yZSA9PSBvdGhlci5zY29yZQorCiAgIGRlZiBfX2xlX18oc2VsZiwgb3RoZXIpOgogICAgIHJldHVybiBzZWxmLnNjb3JlIDw9IG90aGVyLnNjb3JlCiAKIAorY2xhc3MgSW1nZGlmZlN0YXRzKG9iamVjdCk6CisgICIiIkEgY2xhc3MgdGhhdCBjb2xsZWN0cyBpbWdkaWZmIHN0YXRzLgorCisgIEl0IGtlZXBzIHRyYWNrIG9mIHRoZSBmaWxlcyB0aGF0IHdpbGwgYmUgYXBwbGllZCBpbWdkaWZmIHdoaWxlIGdlbmVyYXRpbmcKKyAgQmxvY2tJbWFnZURpZmYuIEl0IGFsc28gbG9ncyB0aGUgb25lcyB0aGF0IGNhbm5vdCB1c2UgaW1nZGlmZiwgd2l0aCBzcGVjaWZpYworICByZWFzb25zLiBUaGUgc3RhdHMgaXMgb25seSBtZWFuaW5nZnVsIHdoZW4gaW1nZGlmZiBub3QgYmVpbmcgZGlzYWJsZWQgYnkgdGhlCisgIGNhbGxlciBvZiBCbG9ja0ltYWdlRGlmZi4gSW4gYWRkaXRpb24sIG9ubHkgZmlsZXMgd2l0aCBzdXBwb3J0ZWQgdHlwZXMKKyAgKEJsb2NrSW1hZ2VEaWZmLkZpbGVUeXBlU3VwcG9ydGVkQnlJbWdkaWZmKCkpIGFyZSBhbGxvd2VkIHRvIGJlIGxvZ2dlZC4KKyAgIiIiCisKKyAgVVNFRF9JTUdESUZGID0gIkFQSyBmaWxlcyBkaWZmJ2Qgd2l0aCBpbWdkaWZmIgorICBVU0VEX0lNR0RJRkZfTEFSR0VfQVBLID0gIkxhcmdlIEFQSyBmaWxlcyBzcGxpdCBhbmQgZGlmZidkIHdpdGggaW1nZGlmZiIKKworICAjIFJlYXNvbnMgZm9yIG5vdCBhcHBseWluZyBpbWdkaWZmIG9uIEFQS3MuCisgIFNLSVBQRURfVFJJTU1FRCA9ICJOb3QgdXNlZCBpbWdkaWZmIGR1ZSB0byB0cmltbWVkIFJhbmdlU2V0IgorICBTS0lQUEVEX05PTk1PTk9UT05JQyA9ICJOb3QgdXNlZCBpbWdkaWZmIGR1ZSB0byBoYXZpbmcgbm9uLW1vbm90b25pYyByYW5nZXMiCisgIFNLSVBQRURfU0hBUkVEX0JMT0NLUyA9ICJOb3QgdXNlZCBpbWdkaWZmIGR1ZSB0byB1c2luZyBzaGFyZWQgYmxvY2tzIgorICBTS0lQUEVEX0lOQ09NUExFVEUgPSAiTm90IHVzZWQgaW1nZGlmZiBkdWUgdG8gaW5jb21wbGV0ZSBSYW5nZVNldCIKKworICAjIFRoZSBsaXN0IG9mIHZhbGlkIHJlYXNvbnMsIHdoaWNoIHdpbGwgYWxzbyBiZSB0aGUgZHVtcGVkIG9yZGVyIGluIGEgcmVwb3J0LgorICBSRUFTT05TID0gKAorICAgICAgVVNFRF9JTUdESUZGLAorICAgICAgVVNFRF9JTUdESUZGX0xBUkdFX0FQSywKKyAgICAgIFNLSVBQRURfVFJJTU1FRCwKKyAgICAgIFNLSVBQRURfTk9OTU9OT1RPTklDLAorICAgICAgU0tJUFBFRF9TSEFSRURfQkxPQ0tTLAorICAgICAgU0tJUFBFRF9JTkNPTVBMRVRFLAorICApCisKKyAgZGVmICBfX2luaXRfXyhzZWxmKToKKyAgICBzZWxmLnN0YXRzID0ge30KKworICBkZWYgTG9nKHNlbGYsIGZpbGVuYW1lLCByZWFzb24pOgorICAgICIiIkxvZ3Mgd2h5IGltZ2RpZmYgY2FuIG9yIGNhbm5vdCBiZSBhcHBsaWVkIHRvIHRoZSBnaXZlbiBmaWxlbmFtZS4KKworICAgIEFyZ3M6CisgICAgICBmaWxlbmFtZTogVGhlIGZpbGVuYW1lIHN0cmluZy4KKyAgICAgIHJlYXNvbjogT25lIG9mIHRoZSByZWFzb24gY29uc3RhbnRzIGxpc3RlZCBpbiBSRUFTT05TLgorCisgICAgUmFpc2VzOgorICAgICAgQXNzZXJ0aW9uRXJyb3I6IE9uIHVuc3VwcG9ydGVkIGZpbGV0eXBlcyBvciBpbnZhbGlkIHJlYXNvbi4KKyAgICAiIiIKKyAgICBhc3NlcnQgQmxvY2tJbWFnZURpZmYuRmlsZVR5cGVTdXBwb3J0ZWRCeUltZ2RpZmYoZmlsZW5hbWUpCisgICAgYXNzZXJ0IHJlYXNvbiBpbiBzZWxmLlJFQVNPTlMKKworICAgIGlmIHJlYXNvbiBub3QgaW4gc2VsZi5zdGF0czoKKyAgICAgIHNlbGYuc3RhdHNbcmVhc29uXSA9IHNldCgpCisgICAgc2VsZi5zdGF0c1tyZWFzb25dLmFkZChmaWxlbmFtZSkKKworICBkZWYgUmVwb3J0KHNlbGYpOgorICAgICIiIlByaW50cyBhIHJlcG9ydCBvZiB0aGUgY29sbGVjdGVkIGltZ2RpZmYgc3RhdHMuIiIiCisKKyAgICBkZWYgcHJpbnRfaGVhZGVyKGhlYWRlciwgc2VwYXJhdG9yKToKKyAgICAgIHByaW50KGhlYWRlcikKKyAgICAgIHByaW50KHNlcGFyYXRvciAqIGxlbihoZWFkZXIpICsgJ1xuJykKKworICAgIHByaW50X2hlYWRlcignICBJbWdkaWZmIFN0YXRzIFJlcG9ydCAgJywgJz0nKQorICAgIGZvciBrZXkgaW4gc2VsZi5SRUFTT05TOgorICAgICAgaWYga2V5IG5vdCBpbiBzZWxmLnN0YXRzOgorICAgICAgICBjb250aW51ZQorICAgICAgdmFsdWVzID0gc2VsZi5zdGF0c1trZXldCisgICAgICBzZWN0aW9uX2hlYWRlciA9ICcge30gKGNvdW50OiB7fSkgJy5mb3JtYXQoa2V5LCBsZW4odmFsdWVzKSkKKyAgICAgIHByaW50X2hlYWRlcihzZWN0aW9uX2hlYWRlciwgJy0nKQorICAgICAgcHJpbnQoJycuam9pbihbJyAge31cbicuZm9ybWF0KG5hbWUpIGZvciBuYW1lIGluIHZhbHVlc10pKQorCisKICMgQmxvY2tJbWFnZURpZmYgd29ya3Mgb24gdHdvIGltYWdlIG9iamVjdHMuICBBbiBpbWFnZSBvYmplY3QgaXMKICMgYW55dGhpbmcgdGhhdCBwcm92aWRlcyB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6CiAjCkBAIC0yOTEsNiArMzc3LDcgQEAKICAgICBzZWxmLnRvdWNoZWRfc3JjX3JhbmdlcyA9IFJhbmdlU2V0KCkKICAgICBzZWxmLnRvdWNoZWRfc3JjX3NoYTEgPSBOb25lCiAgICAgc2VsZi5kaXNhYmxlX2ltZ2RpZmYgPSBkaXNhYmxlX2ltZ2RpZmYKKyAgICBzZWxmLmltZ2RpZmZfc3RhdHMgPSBJbWdkaWZmU3RhdHMoKSBpZiBub3QgZGlzYWJsZV9pbWdkaWZmIGVsc2UgTm9uZQogCiAgICAgYXNzZXJ0IHZlcnNpb24gaW4gKDMsIDQpCiAKQEAgLTMxMiw2ICszOTksNjUgQEAKICAgZGVmIG1heF9zdGFzaGVkX3NpemUoc2VsZik6CiAgICAgcmV0dXJuIHNlbGYuX21heF9zdGFzaGVkX3NpemUKIAorICBAc3RhdGljbWV0aG9kCisgIGRlZiBGaWxlVHlwZVN1cHBvcnRlZEJ5SW1nZGlmZihmaWxlbmFtZSk6CisgICAgIiIiUmV0dXJucyB3aGV0aGVyIHRoZSBmaWxlIHR5cGUgaXMgc3VwcG9ydGVkIGJ5IGltZ2RpZmYuIiIiCisgICAgcmV0dXJuIGZpbGVuYW1lLmxvd2VyKCkuZW5kc3dpdGgoKCcuYXBrJywgJy5qYXInLCAnLnppcCcpKQorCisgIGRlZiBDYW5Vc2VJbWdkaWZmKHNlbGYsIG5hbWUsIHRndF9yYW5nZXMsIHNyY19yYW5nZXMsIGxhcmdlX2Fwaz1GYWxzZSk6CisgICAgIiIiQ2hlY2tzIHdoZXRoZXIgd2UgY2FuIGFwcGx5IGltZ2RpZmYgZm9yIHRoZSBnaXZlbiBSYW5nZVNldHMuCisKKyAgICBGb3IgZmlsZXMgaW4gWklQIGZvcm1hdCAoZS5nLiwgQVBLcywgSkFScywgZXRjLikgd2Ugd291bGQgbGlrZSB0byB1c2UKKyAgICAnaW1nZGlmZiAteicgaWYgcG9zc2libGUuIEJlY2F1c2UgaXQgdXN1YWxseSBwcm9kdWNlcyBzaWduaWZpY2FudGx5IHNtYWxsZXIKKyAgICBwYXRjaGVzIHRoYW4gYnNkaWZmLgorCisgICAgVGhpcyBpcyBwZXJtaXNzaWJsZSBpZiBhbGwgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGhvbGQuCisgICAgICAtIFRoZSBpbWdkaWZmIGhhc24ndCBiZWVuIGRpc2FibGVkIGJ5IHRoZSBjYWxsZXIgKGUuZy4gc3F1YXNoZnMpOworICAgICAgLSBUaGUgZmlsZSB0eXBlIGlzIHN1cHBvcnRlZCBieSBpbWdkaWZmOworICAgICAgLSBUaGUgc291cmNlIGFuZCB0YXJnZXQgYmxvY2tzIGFyZSBtb25vdG9uaWMgKGkuZS4gdGhlIGRhdGEgaXMgc3RvcmVkIHdpdGgKKyAgICAgICAgYmxvY2tzIGluIGluY3JlYXNpbmcgb3JkZXIpOworICAgICAgLSBCb3RoIGZpbGVzIGRvbid0IGNvbnRhaW4gc2hhcmVkIGJsb2NrczsKKyAgICAgIC0gQm90aCBmaWxlcyBoYXZlIGNvbXBsZXRlIGxpc3RzIG9mIGJsb2NrczsKKyAgICAgIC0gV2UgaGF2ZW4ndCByZW1vdmVkIGFueSBibG9ja3MgZnJvbSB0aGUgc291cmNlIHNldC4KKworICAgIElmIGFsbCB0aGVzZSBjb25kaXRpb25zIGFyZSBzYXRpc2ZpZWQsIGNvbmNhdGVuYXRpbmcgYWxsIHRoZSBibG9ja3MgaW4gdGhlCisgICAgUmFuZ2VTZXQgaW4gb3JkZXIgd2lsbCBwcm9kdWNlIGEgdmFsaWQgWklQIGZpbGUgKHBsdXMgcG9zc2libHkgZXh0cmEgemVyb3MKKyAgICBpbiB0aGUgbGFzdCBibG9jaykuIGltZ2RpZmYgaXMgZmluZSB3aXRoIGV4dHJhIHplcm9zIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUuCisKKyAgICBBcmdzOgorICAgICAgbmFtZTogVGhlIGZpbGVuYW1lIHRvIGJlIGRpZmYnZC4KKyAgICAgIHRndF9yYW5nZXM6IFRoZSB0YXJnZXQgUmFuZ2VTZXQuCisgICAgICBzcmNfcmFuZ2VzOiBUaGUgc291cmNlIFJhbmdlU2V0LgorICAgICAgbGFyZ2VfYXBrOiBXaGV0aGVyIHRoaXMgaXMgdG8gc3BsaXQgYSBsYXJnZSBBUEsuCisKKyAgICBSZXR1cm5zOgorICAgICAgQSBib29sZWFuIHJlc3VsdC4KKyAgICAiIiIKKyAgICBpZiBzZWxmLmRpc2FibGVfaW1nZGlmZiBvciBub3Qgc2VsZi5GaWxlVHlwZVN1cHBvcnRlZEJ5SW1nZGlmZihuYW1lKToKKyAgICAgIHJldHVybiBGYWxzZQorCisgICAgaWYgbm90IHRndF9yYW5nZXMubW9ub3RvbmljIG9yIG5vdCBzcmNfcmFuZ2VzLm1vbm90b25pYzoKKyAgICAgIHNlbGYuaW1nZGlmZl9zdGF0cy5Mb2cobmFtZSwgSW1nZGlmZlN0YXRzLlNLSVBQRURfTk9OTU9OT1RPTklDKQorICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICBpZiAodGd0X3Jhbmdlcy5leHRyYS5nZXQoJ3VzZXNfc2hhcmVkX2Jsb2NrcycpIG9yCisgICAgICAgIHNyY19yYW5nZXMuZXh0cmEuZ2V0KCd1c2VzX3NoYXJlZF9ibG9ja3MnKSk6CisgICAgICBzZWxmLmltZ2RpZmZfc3RhdHMuTG9nKG5hbWUsIEltZ2RpZmZTdGF0cy5TS0lQUEVEX1NIQVJFRF9CTE9DS1MpCisgICAgICByZXR1cm4gRmFsc2UKKworICAgIGlmIHRndF9yYW5nZXMuZXh0cmEuZ2V0KCdpbmNvbXBsZXRlJykgb3Igc3JjX3Jhbmdlcy5leHRyYS5nZXQoJ2luY29tcGxldGUnKToKKyAgICAgIHNlbGYuaW1nZGlmZl9zdGF0cy5Mb2cobmFtZSwgSW1nZGlmZlN0YXRzLlNLSVBQRURfSU5DT01QTEVURSkKKyAgICAgIHJldHVybiBGYWxzZQorCisgICAgaWYgdGd0X3Jhbmdlcy5leHRyYS5nZXQoJ3RyaW1tZWQnKSBvciBzcmNfcmFuZ2VzLmV4dHJhLmdldCgndHJpbW1lZCcpOgorICAgICAgc2VsZi5pbWdkaWZmX3N0YXRzLkxvZyhuYW1lLCBJbWdkaWZmU3RhdHMuU0tJUFBFRF9UUklNTUVEKQorICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICByZWFzb24gPSAoSW1nZGlmZlN0YXRzLlVTRURfSU1HRElGRl9MQVJHRV9BUEsgaWYgbGFyZ2VfYXBrCisgICAgICAgICAgICAgIGVsc2UgSW1nZGlmZlN0YXRzLlVTRURfSU1HRElGRikKKyAgICBzZWxmLmltZ2RpZmZfc3RhdHMuTG9nKG5hbWUsIHJlYXNvbikKKyAgICByZXR1cm4gVHJ1ZQorCiAgIGRlZiBDb21wdXRlKHNlbGYsIHByZWZpeCk6CiAgICAgIyBXaGVuIGxvb2tpbmcgZm9yIGEgc291cmNlIGZpbGUgdG8gdXNlIGFzIHRoZSBkaWZmIGlucHV0IGZvciBhCiAgICAgIyB0YXJnZXQgZmlsZSwgd2UgdHJ5OgpAQCAtMzQwLDEwICs0ODYsMTUgQEAKIAogICAgICMgRG91YmxlLWNoZWNrIG91ciB3b3JrLgogICAgIHNlbGYuQXNzZXJ0U2VxdWVuY2VHb29kKCkKKyAgICBzZWxmLkFzc2VydFNoYTFHb29kKCkKIAogICAgIHNlbGYuQ29tcHV0ZVBhdGNoZXMocHJlZml4KQogICAgIHNlbGYuV3JpdGVUcmFuc2ZlcnMocHJlZml4KQogCisgICAgIyBSZXBvcnQgdGhlIGltZ2RpZmYgc3RhdHMuCisgICAgaWYgY29tbW9uLk9QVElPTlMudmVyYm9zZSBhbmQgbm90IHNlbGYuZGlzYWJsZV9pbWdkaWZmOgorICAgICAgc2VsZi5pbWdkaWZmX3N0YXRzLlJlcG9ydCgpCisKICAgZGVmIFdyaXRlVHJhbnNmZXJzKHNlbGYsIHByZWZpeCk6CiAgICAgZGVmIFdyaXRlU3BsaXRUcmFuc2ZlcnMob3V0LCBzdHlsZSwgdGFyZ2V0X2Jsb2Nrcyk6CiAgICAgICAiIiJMaW1pdCB0aGUgc2l6ZSBvZiBvcGVyYW5kIGluIGNvbW1hbmQgJ25ldycgYW5kICd6ZXJvJyB0byAxMDI0IGJsb2Nrcy4KQEAgLTM5Niw3ICs1NDcsNyBAQAogICAgICAgIyAgIDwjIGJsb2Nrcz4gLSA8c3Rhc2ggcmVmcy4uLj4KIAogICAgICAgc2l6ZSA9IHhmLnNyY19yYW5nZXMuc2l6ZSgpCi0gICAgICBzcmNfc3RyID0gW3N0cihzaXplKV0KKyAgICAgIHNyY19zdHJfYnVmZmVyID0gW3N0cihzaXplKV0KIAogICAgICAgdW5zdGFzaGVkX3NyY19yYW5nZXMgPSB4Zi5zcmNfcmFuZ2VzCiAgICAgICBtYXBwZWRfc3Rhc2hlcyA9IFtdCkBAIC00MDYsNyArNTU3LDcgQEAKICAgICAgICAgc3IgPSB4Zi5zcmNfcmFuZ2VzLm1hcF93aXRoaW4oc3IpCiAgICAgICAgIG1hcHBlZF9zdGFzaGVzLmFwcGVuZChzcikKICAgICAgICAgYXNzZXJ0IHNoIGluIHN0YXNoZXMKLSAgICAgICAgc3JjX3N0ci5hcHBlbmQoIiVzOiVzIiAlIChzaCwgc3IudG9fc3RyaW5nX3JhdygpKSkKKyAgICAgICAgc3JjX3N0cl9idWZmZXIuYXBwZW5kKCIlczolcyIgJSAoc2gsIHNyLnRvX3N0cmluZ19yYXcoKSkpCiAgICAgICAgIHN0YXNoZXNbc2hdIC09IDEKICAgICAgICAgaWYgc3Rhc2hlc1tzaF0gPT0gMDoKICAgICAgICAgICBmcmVlX3N0cmluZy5hcHBlbmQoImZyZWUgJXNcbiIgJSAoc2gsKSkKQEAgLTQxNCwxNyArNTY1LDE3IEBACiAgICAgICAgICAgc3Rhc2hlcy5wb3Aoc2gpCiAKICAgICAgIGlmIHVuc3Rhc2hlZF9zcmNfcmFuZ2VzOgotICAgICAgICBzcmNfc3RyLmluc2VydCgxLCB1bnN0YXNoZWRfc3JjX3Jhbmdlcy50b19zdHJpbmdfcmF3KCkpCisgICAgICAgIHNyY19zdHJfYnVmZmVyLmluc2VydCgxLCB1bnN0YXNoZWRfc3JjX3Jhbmdlcy50b19zdHJpbmdfcmF3KCkpCiAgICAgICAgIGlmIHhmLnVzZV9zdGFzaDoKICAgICAgICAgICBtYXBwZWRfdW5zdGFzaGVkID0geGYuc3JjX3Jhbmdlcy5tYXBfd2l0aGluKHVuc3Rhc2hlZF9zcmNfcmFuZ2VzKQotICAgICAgICAgIHNyY19zdHIuaW5zZXJ0KDIsIG1hcHBlZF91bnN0YXNoZWQudG9fc3RyaW5nX3JhdygpKQorICAgICAgICAgIHNyY19zdHJfYnVmZmVyLmluc2VydCgyLCBtYXBwZWRfdW5zdGFzaGVkLnRvX3N0cmluZ19yYXcoKSkKICAgICAgICAgICBtYXBwZWRfc3Rhc2hlcy5hcHBlbmQobWFwcGVkX3Vuc3Rhc2hlZCkKICAgICAgICAgICBzZWxmLkFzc2VydFBhcnRpdGlvbihSYW5nZVNldChkYXRhPSgwLCBzaXplKSksIG1hcHBlZF9zdGFzaGVzKQogICAgICAgZWxzZToKLSAgICAgICAgc3JjX3N0ci5pbnNlcnQoMSwgIi0iKQorICAgICAgICBzcmNfc3RyX2J1ZmZlci5pbnNlcnQoMSwgIi0iKQogICAgICAgICBzZWxmLkFzc2VydFBhcnRpdGlvbihSYW5nZVNldChkYXRhPSgwLCBzaXplKSksIG1hcHBlZF9zdGFzaGVzKQogCi0gICAgICBzcmNfc3RyID0gIiAiLmpvaW4oc3JjX3N0cikKKyAgICAgIHNyY19zdHIgPSAiICIuam9pbihzcmNfc3RyX2J1ZmZlcikKIAogICAgICAgIyB2ZXJzaW9uIDMrOgogICAgICAgIyAgIHplcm8gPHJhbmdlc2V0PgpAQCAtNTQ1LDExICs2OTYsMTEgQEAKICAgICAgIG1heF9hbGxvd2VkID0gT1BUSU9OUy5jYWNoZV9zaXplICogT1BUSU9OUy5zdGFzaF90aHJlc2hvbGQKICAgICAgIHByaW50KCJtYXggc3Rhc2hlZCBibG9ja3M6ICVkICAoJWQgYnl0ZXMpLCAiCiAgICAgICAgICAgICAibGltaXQ6ICVkIGJ5dGVzICglLjJmJSUpXG4iICUgKAotICAgICAgICAgICAgbWF4X3N0YXNoZWRfYmxvY2tzLCBzZWxmLl9tYXhfc3Rhc2hlZF9zaXplLCBtYXhfYWxsb3dlZCwKLSAgICAgICAgICAgIHNlbGYuX21heF9zdGFzaGVkX3NpemUgKiAxMDAuMCAvIG1heF9hbGxvd2VkKSkKKyAgICAgICAgICAgICAgICBtYXhfc3Rhc2hlZF9ibG9ja3MsIHNlbGYuX21heF9zdGFzaGVkX3NpemUsIG1heF9hbGxvd2VkLAorICAgICAgICAgICAgICAgIHNlbGYuX21heF9zdGFzaGVkX3NpemUgKiAxMDAuMCAvIG1heF9hbGxvd2VkKSkKICAgICBlbHNlOgogICAgICAgcHJpbnQoIm1heCBzdGFzaGVkIGJsb2NrczogJWQgICglZCBieXRlcyksIGxpbWl0OiA8dW5rbm93bj5cbiIgJSAoCi0gICAgICAgICAgICBtYXhfc3Rhc2hlZF9ibG9ja3MsIHNlbGYuX21heF9zdGFzaGVkX3NpemUpKQorICAgICAgICAgIG1heF9zdGFzaGVkX2Jsb2Nrcywgc2VsZi5fbWF4X3N0YXNoZWRfc2l6ZSkpCiAKICAgZGVmIFJldmlzZVN0YXNoU2l6ZShzZWxmKToKICAgICBwcmludCgiUmV2aXNpbmcgc3Rhc2ggc2l6ZS4uLiIpCkBAIC02NzUsNiArODI2LDcgQEAKICAgICAgICAgICAgICMgVGhlc2UgYXJlIGlkZW50aWNhbDsgd2UgZG9uJ3QgbmVlZCB0byBnZW5lcmF0ZSBhIHBhdGNoLAogICAgICAgICAgICAgIyBqdXN0IGlzc3VlIGNvcHkgY29tbWFuZHMgb24gdGhlIGRldmljZS4KICAgICAgICAgICAgIHhmLnN0eWxlID0gIm1vdmUiCisgICAgICAgICAgICB4Zi5wYXRjaCA9IE5vbmUKICAgICAgICAgICAgIHRndF9zaXplID0geGYudGd0X3Jhbmdlcy5zaXplKCkgKiBzZWxmLnRndC5ibG9ja3NpemUKICAgICAgICAgICAgIGlmIHhmLnNyY19yYW5nZXMgIT0geGYudGd0X3JhbmdlczoKICAgICAgICAgICAgICAgcHJpbnQoIiUxMGQgJTEwZCAoJTYuMmYlJSkgJTdzICVzICVzIChmcm9tICVzKSIgJSAoCkBAIC02ODMsMjQgKzgzNSwxOCBAQAogICAgICAgICAgICAgICAgICAgICAgIHhmLnRndF9uYW1lICsgIiAoZnJvbSAiICsgeGYuc3JjX25hbWUgKyAiKSIpLAogICAgICAgICAgICAgICAgICAgc3RyKHhmLnRndF9yYW5nZXMpLCBzdHIoeGYuc3JjX3JhbmdlcykpKQogICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAjIEZvciBmaWxlcyBpbiB6aXAgZm9ybWF0IChlZywgQVBLcywgSkFScywgZXRjLikgd2Ugd291bGQKLSAgICAgICAgICAgICMgbGlrZSB0byB1c2UgaW1nZGlmZiAteiBpZiBwb3NzaWJsZSAoYmVjYXVzZSBpdCB1c3VhbGx5Ci0gICAgICAgICAgICAjIHByb2R1Y2VzIHNpZ25pZmljYW50bHkgc21hbGxlciBwYXRjaGVzIHRoYW4gYnNkaWZmKS4KLSAgICAgICAgICAgICMgVGhpcyBpcyBwZXJtaXNzaWJsZSBpZjoKLSAgICAgICAgICAgICMKLSAgICAgICAgICAgICMgIC0gaW1nZGlmZiBpcyBub3QgZGlzYWJsZWQsIGFuZAotICAgICAgICAgICAgIyAgLSB0aGUgc291cmNlIGFuZCB0YXJnZXQgZmlsZXMgYXJlIG1vbm90b25pYyAoaWUsIHRoZQotICAgICAgICAgICAgIyAgICBkYXRhIGlzIHN0b3JlZCB3aXRoIGJsb2NrcyBpbiBpbmNyZWFzaW5nIG9yZGVyKSwgYW5kCi0gICAgICAgICAgICAjICAtIHdlIGhhdmVuJ3QgcmVtb3ZlZCBhbnkgYmxvY2tzIGZyb20gdGhlIHNvdXJjZSBzZXQuCi0gICAgICAgICAgICAjCi0gICAgICAgICAgICAjIElmIHRoZXNlIGNvbmRpdGlvbnMgYXJlIHNhdGlzZmllZCB0aGVuIGFwcGVuZGluZyBhbGwgdGhlCi0gICAgICAgICAgICAjIGJsb2NrcyBpbiB0aGUgc2V0IHRvZ2V0aGVyIGluIG9yZGVyIHdpbGwgcHJvZHVjZSBhIHZhbGlkCi0gICAgICAgICAgICAjIHppcCBmaWxlIChwbHVzIHBvc3NpYmx5IGV4dHJhIHplcm9zIGluIHRoZSBsYXN0IGJsb2NrKSwKLSAgICAgICAgICAgICMgd2hpY2ggaXMgd2hhdCBpbWdkaWZmIG5lZWRzIHRvIG9wZXJhdGUuICAoaW1nZGlmZiBpcwotICAgICAgICAgICAgIyBmaW5lIHdpdGggZXh0cmEgemVyb3MgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZS4pCi0gICAgICAgICAgICBpbWdkaWZmID0gKG5vdCBzZWxmLmRpc2FibGVfaW1nZGlmZiBhbmQgeGYuaW50YWN0IGFuZAotICAgICAgICAgICAgICAgICAgICAgICB4Zi50Z3RfbmFtZS5zcGxpdCgiLiIpWy0xXS5sb3dlcigpCi0gICAgICAgICAgICAgICAgICAgICAgIGluICgiYXBrIiwgImphciIsICJ6aXAiKSkKKyAgICAgICAgICAgIGlmIHhmLnBhdGNoOgorICAgICAgICAgICAgICAjIFdlIGhhdmUgYWxyZWFkeSBnZW5lcmF0ZWQgdGhlIHBhdGNoIHdpdGggaW1nZGlmZi4gQ2hlY2sgaWYgdGhlCisgICAgICAgICAgICAgICMgdHJhbnNmZXIgaXMgaW50YWN0LgorICAgICAgICAgICAgICBhc3NlcnQgbm90IHNlbGYuZGlzYWJsZV9pbWdkaWZmCisgICAgICAgICAgICAgIGltZ2RpZmYgPSBUcnVlCisgICAgICAgICAgICAgIGlmICh4Zi5zcmNfcmFuZ2VzLmV4dHJhLmdldCgndHJpbW1lZCcpIG9yCisgICAgICAgICAgICAgICAgICB4Zi50Z3RfcmFuZ2VzLmV4dHJhLmdldCgndHJpbW1lZCcpKToKKyAgICAgICAgICAgICAgICBpbWdkaWZmID0gRmFsc2UKKyAgICAgICAgICAgICAgICB4Zi5wYXRjaCA9IE5vbmUKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgIGltZ2RpZmYgPSBzZWxmLkNhblVzZUltZ2RpZmYoCisgICAgICAgICAgICAgICAgICB4Zi50Z3RfbmFtZSwgeGYudGd0X3JhbmdlcywgeGYuc3JjX3JhbmdlcykKICAgICAgICAgICAgIHhmLnN0eWxlID0gImltZ2RpZmYiIGlmIGltZ2RpZmYgZWxzZSAiYnNkaWZmIgogICAgICAgICAgICAgZGlmZl9xdWV1ZS5hcHBlbmQoKGluZGV4LCBpbWdkaWZmLCBwYXRjaF9udW0pKQogICAgICAgICAgICAgcGF0Y2hfbnVtICs9IDEKQEAgLTcxNyw5ICs4NjMsNiBAQAogICAgICAgZGlmZl90b3RhbCA9IGxlbihkaWZmX3F1ZXVlKQogICAgICAgcGF0Y2hlcyA9IFtOb25lXSAqIGRpZmZfdG90YWwKICAgICAgIGVycm9yX21lc3NhZ2VzID0gW10KLSAgICAgIGlmIHN5cy5zdGRvdXQuaXNhdHR5KCk6Ci0gICAgICAgIGdsb2JhbCBkaWZmX2RvbmUKLSAgICAgICAgZGlmZl9kb25lID0gMAogCiAgICAgICAjIFVzaW5nIG11bHRpcHJvY2Vzc2luZyBkb2Vzbid0IGdpdmUgYWRkaXRpb25hbCBiZW5lZml0cywgZHVlIHRvIHRoZQogICAgICAgIyBwYXR0ZXJuIG9mIHRoZSBjb2RlLiBUaGUgZGlmZmluZyB3b3JrIGlzIGRvbmUgYnkgc3VicHJvY2Vzcy5jYWxsLCB3aGljaApAQCAtNzM1LDEzICs4NzgsMjAgQEAKICAgICAgICAgICAgIGlmIG5vdCBkaWZmX3F1ZXVlOgogICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgIHhmX2luZGV4LCBpbWdkaWZmLCBwYXRjaF9pbmRleCA9IGRpZmZfcXVldWUucG9wKCkKKyAgICAgICAgICAgIHhmID0gc2VsZi50cmFuc2ZlcnNbeGZfaW5kZXhdCiAKLSAgICAgICAgICB4ZiA9IHNlbGYudHJhbnNmZXJzW3hmX2luZGV4XQotICAgICAgICAgIHNyY19yYW5nZXMgPSB4Zi5zcmNfcmFuZ2VzCi0gICAgICAgICAgdGd0X3JhbmdlcyA9IHhmLnRndF9yYW5nZXMKKyAgICAgICAgICAgIGlmIHN5cy5zdGRvdXQuaXNhdHR5KCk6CisgICAgICAgICAgICAgIGRpZmZfbGVmdCA9IGxlbihkaWZmX3F1ZXVlKQorICAgICAgICAgICAgICBwcm9ncmVzcyA9IChkaWZmX3RvdGFsIC0gZGlmZl9sZWZ0KSAqIDEwMCAvIGRpZmZfdG90YWwKKyAgICAgICAgICAgICAgIyAnXDAzM1tLJyBpcyB0byBjbGVhciB0byBFT0wuCisgICAgICAgICAgICAgIHByaW50KCcgWyUzZCUlXSAlc1wwMzNbSycgJSAocHJvZ3Jlc3MsIHhmLnRndF9uYW1lKSwgZW5kPSdccicpCisgICAgICAgICAgICAgIHN5cy5zdGRvdXQuZmx1c2goKQogCi0gICAgICAgICAgIyBOZWVkcyBsb2NrIHNpbmNlIFdyaXRlUmFuZ2VEYXRhVG9GZCgpIGlzIHN0YXRlZnVsIChjYWxsaW5nIHNlZWspLgotICAgICAgICAgIHdpdGggbG9jazoKKyAgICAgICAgICBwYXRjaCA9IHhmLnBhdGNoCisgICAgICAgICAgaWYgbm90IHBhdGNoOgorICAgICAgICAgICAgc3JjX3JhbmdlcyA9IHhmLnNyY19yYW5nZXMKKyAgICAgICAgICAgIHRndF9yYW5nZXMgPSB4Zi50Z3RfcmFuZ2VzCisKICAgICAgICAgICAgIHNyY19maWxlID0gY29tbW9uLk1ha2VUZW1wRmlsZShwcmVmaXg9InNyYy0iKQogICAgICAgICAgICAgd2l0aCBvcGVuKHNyY19maWxlLCAid2IiKSBhcyBmZDoKICAgICAgICAgICAgICAgc2VsZi5zcmMuV3JpdGVSYW5nZURhdGFUb0ZkKHNyY19yYW5nZXMsIGZkKQpAQCAtNzUwLDI2ICs5MDAsMjIgQEAKICAgICAgICAgICAgIHdpdGggb3Blbih0Z3RfZmlsZSwgIndiIikgYXMgZmQ6CiAgICAgICAgICAgICAgIHNlbGYudGd0LldyaXRlUmFuZ2VEYXRhVG9GZCh0Z3RfcmFuZ2VzLCBmZCkKIAotICAgICAgICAgIHRyeToKLSAgICAgICAgICAgIHBhdGNoID0gY29tcHV0ZV9wYXRjaChzcmNfZmlsZSwgdGd0X2ZpbGUsIGltZ2RpZmYpCi0gICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3IgYXMgZToKLSAgICAgICAgICAgIHdpdGggbG9jazoKLSAgICAgICAgICAgICAgZXJyb3JfbWVzc2FnZXMuYXBwZW5kKAorICAgICAgICAgICAgbWVzc2FnZSA9IFtdCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgIHBhdGNoID0gY29tcHV0ZV9wYXRjaChzcmNfZmlsZSwgdGd0X2ZpbGUsIGltZ2RpZmYpCisgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvciBhcyBlOgorICAgICAgICAgICAgICBtZXNzYWdlLmFwcGVuZCgKICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gZ2VuZXJhdGUgJXMgZm9yICVzOiB0Z3Q9JXMsIHNyYz0lczpcbiVzIiAlICgKICAgICAgICAgICAgICAgICAgICAgICAiaW1nZGlmZiIgaWYgaW1nZGlmZiBlbHNlICJic2RpZmYiLAogICAgICAgICAgICAgICAgICAgICAgIHhmLnRndF9uYW1lIGlmIHhmLnRndF9uYW1lID09IHhmLnNyY19uYW1lIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgeGYudGd0X25hbWUgKyAiIChmcm9tICIgKyB4Zi5zcmNfbmFtZSArICIpIiwKKyAgICAgICAgICAgICAgICAgICAgICB4Zi50Z3RfbmFtZSArICIgKGZyb20gIiArIHhmLnNyY19uYW1lICsgIikiLAogICAgICAgICAgICAgICAgICAgICAgIHhmLnRndF9yYW5nZXMsIHhmLnNyY19yYW5nZXMsIGUubWVzc2FnZSkpCisgICAgICAgICAgICBpZiBtZXNzYWdlOgorICAgICAgICAgICAgICB3aXRoIGxvY2s6CisgICAgICAgICAgICAgICAgZXJyb3JfbWVzc2FnZXMuZXh0ZW5kKG1lc3NhZ2UpCiAKICAgICAgICAgICB3aXRoIGxvY2s6CiAgICAgICAgICAgICBwYXRjaGVzW3BhdGNoX2luZGV4XSA9ICh4Zl9pbmRleCwgcGF0Y2gpCi0gICAgICAgICAgICBpZiBzeXMuc3Rkb3V0LmlzYXR0eSgpOgotICAgICAgICAgICAgICBnbG9iYWwgZGlmZl9kb25lCi0gICAgICAgICAgICAgIGRpZmZfZG9uZSArPSAxCi0gICAgICAgICAgICAgIHByb2dyZXNzID0gZGlmZl9kb25lICogMTAwIC8gZGlmZl90b3RhbAotICAgICAgICAgICAgICAjICdcMDMzW0snIGlzIHRvIGNsZWFyIHRvIEVPTC4KLSAgICAgICAgICAgICAgcHJpbnQoJyBbJWQlJV0gJXNcMDMzW0snICUgKHByb2dyZXNzLCB4Zi50Z3RfbmFtZSksIGVuZD0nXHInKQotICAgICAgICAgICAgICBzeXMuc3Rkb3V0LmZsdXNoKCkKIAogICAgICAgdGhyZWFkcyA9IFt0aHJlYWRpbmcuVGhyZWFkKHRhcmdldD1kaWZmX3dvcmtlcikKICAgICAgICAgICAgICAgICAgZm9yIF8gaW4gcmFuZ2Uoc2VsZi50aHJlYWRzKV0KQEAgLTc4Miw3ICs5MjgsOSBAQAogICAgICAgICBwcmludCgnXG4nKQogCiAgICAgICBpZiBlcnJvcl9tZXNzYWdlczoKKyAgICAgICAgcHJpbnQoJ0VSUk9SOicpCiAgICAgICAgIHByaW50KCdcbicuam9pbihlcnJvcl9tZXNzYWdlcykpCisgICAgICAgIHByaW50KCdcblxuXG4nKQogICAgICAgICBzeXMuZXhpdCgxKQogICAgIGVsc2U6CiAgICAgICBwYXRjaGVzID0gW10KQEAgLTc5OSwxMSArOTQ3LDI2IEBACiAgICAgICAgIGlmIGNvbW1vbi5PUFRJT05TLnZlcmJvc2U6CiAgICAgICAgICAgdGd0X3NpemUgPSB4Zi50Z3RfcmFuZ2VzLnNpemUoKSAqIHNlbGYudGd0LmJsb2Nrc2l6ZQogICAgICAgICAgIHByaW50KCIlMTBkICUxMGQgKCU2LjJmJSUpICU3cyAlcyAlcyAlcyIgJSAoCi0gICAgICAgICAgICAgICAgeGYucGF0Y2hfbGVuLCB0Z3Rfc2l6ZSwgeGYucGF0Y2hfbGVuICogMTAwLjAgLyB0Z3Rfc2l6ZSwKLSAgICAgICAgICAgICAgICB4Zi5zdHlsZSwKLSAgICAgICAgICAgICAgICB4Zi50Z3RfbmFtZSBpZiB4Zi50Z3RfbmFtZSA9PSB4Zi5zcmNfbmFtZSBlbHNlICgKLSAgICAgICAgICAgICAgICAgICAgeGYudGd0X25hbWUgKyAiIChmcm9tICIgKyB4Zi5zcmNfbmFtZSArICIpIiksCi0gICAgICAgICAgICAgICAgeGYudGd0X3JhbmdlcywgeGYuc3JjX3JhbmdlcykpCisgICAgICAgICAgICAgIHhmLnBhdGNoX2xlbiwgdGd0X3NpemUsIHhmLnBhdGNoX2xlbiAqIDEwMC4wIC8gdGd0X3NpemUsCisgICAgICAgICAgICAgIHhmLnN0eWxlLAorICAgICAgICAgICAgICB4Zi50Z3RfbmFtZSBpZiB4Zi50Z3RfbmFtZSA9PSB4Zi5zcmNfbmFtZSBlbHNlICgKKyAgICAgICAgICAgICAgICAgIHhmLnRndF9uYW1lICsgIiAoZnJvbSAiICsgeGYuc3JjX25hbWUgKyAiKSIpLAorICAgICAgICAgICAgICB4Zi50Z3RfcmFuZ2VzLCB4Zi5zcmNfcmFuZ2VzKSkKKworICBkZWYgQXNzZXJ0U2hhMUdvb2Qoc2VsZik6CisgICAgIiIiQ2hlY2sgdGhlIFNIQS0xIG9mIHRoZSBzcmMgJiB0Z3QgYmxvY2tzIGluIHRoZSB0cmFuc2ZlciBsaXN0LgorCisgICAgRG91YmxlIGNoZWNrIHRoZSBTSEEtMSB2YWx1ZSB0byBhdm9pZCB0aGUgaXNzdWUgaW4gYi83MTkwODcxMywgd2hlcmUKKyAgICBTcGFyc2VJbWFnZS5SYW5nZVNoYTEoKSBtZXNzZWQgdXAgd2l0aCB0aGUgaGFzaCBjYWxjdWxhdGlvbiBpbiBtdWx0aS10aHJlYWQKKyAgICBlbnZpcm9ubWVudC4gVGhhdCBzcGVjaWZpYyBwcm9ibGVtIGhhcyBiZWVuIGZpeGVkIGJ5IHByb3RlY3RpbmcgdGhlCisgICAgdW5kZXJseWluZyBnZW5lcmF0b3IgZnVuY3Rpb24gJ1NwYXJzZUltYWdlLl9HZXRSYW5nZURhdGEoKScgd2l0aCBsb2NrLgorICAgICIiIgorICAgIGZvciB4ZiBpbiBzZWxmLnRyYW5zZmVyczoKKyAgICAgIHRndF9zaGExID0gc2VsZi50Z3QuUmFuZ2VTaGExKHhmLnRndF9yYW5nZXMpCisgICAgICBhc3NlcnQgeGYudGd0X3NoYTEgPT0gdGd0X3NoYTEKKyAgICAgIGlmIHhmLnN0eWxlID09ICJkaWZmIjoKKyAgICAgICAgc3JjX3NoYTEgPSBzZWxmLnNyYy5SYW5nZVNoYTEoeGYuc3JjX3JhbmdlcykKKyAgICAgICAgYXNzZXJ0IHhmLnNyY19zaGExID09IHNyY19zaGExCiAKICAgZGVmIEFzc2VydFNlcXVlbmNlR29vZChzZWxmKToKICAgICAjIFNpbXVsYXRlIHRoZSBzZXF1ZW5jZXMgb2YgdHJhbnNmZXJzIHdlIHdpbGwgb3V0cHV0LCBhbmQgY2hlY2sgdGhhdDoKQEAgLTkwMiw3ICsxMDY1LDcgQEAKICAgICAgICAgICBvdXRfb2Zfb3JkZXIgKz0gMQogICAgICAgICAgIGFzc2VydCB4Zi5zcmNfcmFuZ2VzLm92ZXJsYXBzKHUudGd0X3JhbmdlcykKICAgICAgICAgICB4Zi5zcmNfcmFuZ2VzID0geGYuc3JjX3Jhbmdlcy5zdWJ0cmFjdCh1LnRndF9yYW5nZXMpCi0gICAgICAgICAgeGYuaW50YWN0ID0gRmFsc2UKKyAgICAgICAgICB4Zi5zcmNfcmFuZ2VzLmV4dHJhWyd0cmltbWVkJ10gPSBUcnVlCiAKICAgICAgIGlmIHhmLnN0eWxlID09ICJkaWZmIiBhbmQgbm90IHhmLnNyY19yYW5nZXM6CiAgICAgICAgICMgbm90aGluZyBsZWZ0IHRvIGRpZmYgZnJvbTsgdHJlYXQgYXMgbmV3IGRhdGEKQEAgLTEwMjEsNyArMTE4NCw4IEBACiAgICAgICB3aGlsZSBzaW5rczoKICAgICAgICAgbmV3X3NpbmtzID0gT3JkZXJlZERpY3QoKQogICAgICAgICBmb3IgdSBpbiBzaW5rczoKLSAgICAgICAgICBpZiB1IG5vdCBpbiBHOiBjb250aW51ZQorICAgICAgICAgIGlmIHUgbm90IGluIEc6CisgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgIHMyLmFwcGVuZGxlZnQodSkKICAgICAgICAgICBkZWwgR1t1XQogICAgICAgICAgIGZvciBpdSBpbiB1LmluY29taW5nOgpAQCAtMTAzNCw3ICsxMTk4LDggQEAKICAgICAgIHdoaWxlIHNvdXJjZXM6CiAgICAgICAgIG5ld19zb3VyY2VzID0gT3JkZXJlZERpY3QoKQogICAgICAgICBmb3IgdSBpbiBzb3VyY2VzOgotICAgICAgICAgIGlmIHUgbm90IGluIEc6IGNvbnRpbnVlCisgICAgICAgICAgaWYgdSBub3QgaW4gRzoKKyAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgczEuYXBwZW5kKHUpCiAgICAgICAgICAgZGVsIEdbdV0KICAgICAgICAgICBmb3IgaXUgaW4gdS5vdXRnb2luZzoKQEAgLTEwNDMsNyArMTIwOCw4IEBACiAgICAgICAgICAgICAgIG5ld19zb3VyY2VzW2l1XSA9IE5vbmUKICAgICAgICAgc291cmNlcyA9IG5ld19zb3VyY2VzCiAKLSAgICAgIGlmIG5vdCBHOiBicmVhaworICAgICAgaWYgbm90IEc6CisgICAgICAgIGJyZWFrCiAKICAgICAgICMgRmluZCB0aGUgImJlc3QiIHZlcnRleCB0byBwdXQgbmV4dC4gICJCZXN0IiBpcyB0aGUgb25lIHRoYXQKICAgICAgICMgbWF4aW1pemVzIHRoZSBuZXQgZGlmZmVyZW5jZSBpbiBzb3VyY2UgYmxvY2tzIHNhdmVkIHdlIGdldCBieQpAQCAtMTEwMCwxNCArMTI2NiwxNiBAQAogICAgICAgaW50ZXJzZWN0aW9ucyA9IE9yZGVyZWREaWN0KCkKICAgICAgIGZvciBzLCBlIGluIGEudGd0X3JhbmdlczoKICAgICAgICAgZm9yIGkgaW4gcmFuZ2UocywgZSk6Ci0gICAgICAgICAgaWYgaSA+PSBsZW4oc291cmNlX3Jhbmdlcyk6IGJyZWFrCisgICAgICAgICAgaWYgaSA+PSBsZW4oc291cmNlX3Jhbmdlcyk6CisgICAgICAgICAgICBicmVhawogICAgICAgICAgICMgQWRkIGFsbCB0aGUgVHJhbnNmZXJzIGluIHNvdXJjZV9yYW5nZXNbaV0gdG8gdGhlIChvcmRlcmVkKSBzZXQuCiAgICAgICAgICAgaWYgc291cmNlX3Jhbmdlc1tpXSBpcyBub3QgTm9uZToKICAgICAgICAgICAgIGZvciBqIGluIHNvdXJjZV9yYW5nZXNbaV06CiAgICAgICAgICAgICAgIGludGVyc2VjdGlvbnNbal0gPSBOb25lCiAKICAgICAgIGZvciBiIGluIGludGVyc2VjdGlvbnM6Ci0gICAgICAgIGlmIGEgaXMgYjogY29udGludWUKKyAgICAgICAgaWYgYSBpcyBiOgorICAgICAgICAgIGNvbnRpbnVlCiAKICAgICAgICAgIyBJZiB0aGUgYmxvY2tzIHdyaXR0ZW4gYnkgQSBhcmUgcmVhZCBieSBCLCB0aGVuIEIgbmVlZHMgdG8gZ28gYmVmb3JlIEEuCiAgICAgICAgIGkgPSBhLnRndF9yYW5nZXMuaW50ZXJzZWN0KGIuc3JjX3JhbmdlcykKQEAgLTExMjQsOCArMTI5Miw4IEBACiAgIGRlZiBGaW5kVHJhbnNmZXJzKHNlbGYpOgogICAgICIiIlBhcnNlIHRoZSBmaWxlX21hcCB0byBnZW5lcmF0ZSBhbGwgdGhlIHRyYW5zZmVycy4iIiIKIAotICAgIGRlZiBBZGRTcGxpdFRyYW5zZmVycyh0Z3RfbmFtZSwgc3JjX25hbWUsIHRndF9yYW5nZXMsIHNyY19yYW5nZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlLCBieV9pZCk6CisgICAgZGVmIEFkZFNwbGl0VHJhbnNmZXJzV2l0aEZpeGVkU2l6ZUNodW5rcyh0Z3RfbmFtZSwgc3JjX25hbWUsIHRndF9yYW5nZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfcmFuZ2VzLCBzdHlsZSwgYnlfaWQpOgogICAgICAgIiIiQWRkIG9uZSBvciBtdWx0aXBsZSBUcmFuc2ZlcigpcyBieSBzcGxpdHRpbmcgbGFyZ2UgZmlsZXMuCiAKICAgICAgIEZvciBCQk9UQSB2Mywgd2UgbmVlZCB0byBzdGFzaCBzb3VyY2UgYmxvY2tzIGZvciByZXN1bWFibGUgZmVhdHVyZS4KQEAgLTExNDAsMjEgKzEzMDgsNyBAQAogICAgICAgQ29tcGFyZWQgdG8gdGhlIGZpeGVkIDEwMjQtYmxvY2sgbGltaXQsIGl0IHJlZHVjZXMgdGhlIG92ZXJhbGwgcGFja2FnZQogICAgICAgc2l6ZSBieSAzMCUgZm9yIHZvbGFudGlzLCBhbmQgMjAlIGZvciBhbmdsZXIgYW5kIGJ1bGxoZWFkLiIiIgogCi0gICAgICAjIFBvc3NpYmx5IHNwbGl0IGxhcmdlIGZpbGVzIGludG8gc21hbGxlciBjaHVua3MuCiAgICAgICBwaWVjZXMgPSAwCi0gICAgICBjYWNoZV9zaXplID0gY29tbW9uLk9QVElPTlMuY2FjaGVfc2l6ZQotICAgICAgc3BsaXRfdGhyZXNob2xkID0gMC4xMjUKLSAgICAgIG1heF9ibG9ja3NfcGVyX3RyYW5zZmVyID0gaW50KGNhY2hlX3NpemUgKiBzcGxpdF90aHJlc2hvbGQgLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50Z3QuYmxvY2tzaXplKQotCi0gICAgICAjIENoYW5nZSBub3RoaW5nIGZvciBzbWFsbCBmaWxlcy4KLSAgICAgIGlmICh0Z3RfcmFuZ2VzLnNpemUoKSA8PSBtYXhfYmxvY2tzX3Blcl90cmFuc2ZlciBhbmQKLSAgICAgICAgICBzcmNfcmFuZ2VzLnNpemUoKSA8PSBtYXhfYmxvY2tzX3Blcl90cmFuc2Zlcik6Ci0gICAgICAgIFRyYW5zZmVyKHRndF9uYW1lLCBzcmNfbmFtZSwgdGd0X3Jhbmdlcywgc3JjX3JhbmdlcywKLSAgICAgICAgICAgICAgICAgc2VsZi50Z3QuUmFuZ2VTaGExKHRndF9yYW5nZXMpLCBzZWxmLnNyYy5SYW5nZVNoYTEoc3JjX3JhbmdlcyksCi0gICAgICAgICAgICAgICAgIHN0eWxlLCBieV9pZCkKLSAgICAgICAgcmV0dXJuCi0KICAgICAgIHdoaWxlICh0Z3RfcmFuZ2VzLnNpemUoKSA+IG1heF9ibG9ja3NfcGVyX3RyYW5zZmVyIGFuZAogICAgICAgICAgICAgIHNyY19yYW5nZXMuc2l6ZSgpID4gbWF4X2Jsb2Nrc19wZXJfdHJhbnNmZXIpOgogICAgICAgICB0Z3Rfc3BsaXRfbmFtZSA9ICIlcy0lZCIgJSAodGd0X25hbWUsIHBpZWNlcykKQEAgLTExODAsNiArMTMzNCwzOCBAQAogICAgICAgICAgICAgICAgICBzZWxmLnRndC5SYW5nZVNoYTEodGd0X3JhbmdlcyksIHNlbGYuc3JjLlJhbmdlU2hhMShzcmNfcmFuZ2VzKSwKICAgICAgICAgICAgICAgICAgc3R5bGUsIGJ5X2lkKQogCisgICAgZGVmIEFkZFNwbGl0VHJhbnNmZXJzKHRndF9uYW1lLCBzcmNfbmFtZSwgdGd0X3Jhbmdlcywgc3JjX3Jhbmdlcywgc3R5bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5X2lkKToKKyAgICAgICIiIkZpbmQgYWxsIHRoZSB6aXAgZmlsZXMgYW5kIHNwbGl0IHRoZSBvdGhlcnMgd2l0aCBhIGZpeGVkIGNodW5rIHNpemUuCisKKyAgICAgIFRoaXMgZnVuY3Rpb24gd2lsbCBjb25zdHJ1Y3QgYSBsaXN0IG9mIHppcCBhcmNoaXZlcywgd2hpY2ggd2lsbCBsYXRlciBiZQorICAgICAgc3BsaXQgYnkgaW1nZGlmZiB0byByZWR1Y2UgdGhlIGZpbmFsIHBhdGNoIHNpemUuIEZvciB0aGUgb3RoZXIgZmlsZXMsCisgICAgICB3ZSB3aWxsIHBsYWlubHkgc3BsaXQgdGhlbSBiYXNlZCBvbiBhIGZpeGVkIGNodW5rIHNpemUgd2l0aCB0aGUgcG90ZW50aWFsCisgICAgICBwYXRjaCBzaXplIHBlbmFsdHkuCisgICAgICAiIiIKKworICAgICAgYXNzZXJ0IHN0eWxlID09ICJkaWZmIgorCisgICAgICAjIENoYW5nZSBub3RoaW5nIGZvciBzbWFsbCBmaWxlcy4KKyAgICAgIGlmICh0Z3RfcmFuZ2VzLnNpemUoKSA8PSBtYXhfYmxvY2tzX3Blcl90cmFuc2ZlciBhbmQKKyAgICAgICAgICBzcmNfcmFuZ2VzLnNpemUoKSA8PSBtYXhfYmxvY2tzX3Blcl90cmFuc2Zlcik6CisgICAgICAgIFRyYW5zZmVyKHRndF9uYW1lLCBzcmNfbmFtZSwgdGd0X3Jhbmdlcywgc3JjX3JhbmdlcywKKyAgICAgICAgICAgICAgICAgc2VsZi50Z3QuUmFuZ2VTaGExKHRndF9yYW5nZXMpLCBzZWxmLnNyYy5SYW5nZVNoYTEoc3JjX3JhbmdlcyksCisgICAgICAgICAgICAgICAgIHN0eWxlLCBieV9pZCkKKyAgICAgICAgcmV0dXJuCisKKyAgICAgICMgU3BsaXQgbGFyZ2UgQVBLcyB3aXRoIGltZ2RpZmYsIGlmIHBvc3NpYmxlLiBXZSdyZSBpbnRlbnRpb25hbGx5IGNoZWNraW5nCisgICAgICAjIGZpbGUgdHlwZXMgb25lIG1vcmUgdGltZSAoQ2FuVXNlSW1nZGlmZigpIGNoZWNrcyB0aGF0IGFzIHdlbGwpLCBiZWZvcmUKKyAgICAgICMgY2FsbGluZyB0aGUgY29zdGx5IFJhbmdlU2hhMSgpcy4KKyAgICAgIGlmIChzZWxmLkZpbGVUeXBlU3VwcG9ydGVkQnlJbWdkaWZmKHRndF9uYW1lKSBhbmQKKyAgICAgICAgICBzZWxmLnRndC5SYW5nZVNoYTEodGd0X3JhbmdlcykgIT0gc2VsZi5zcmMuUmFuZ2VTaGExKHNyY19yYW5nZXMpKToKKyAgICAgICAgaWYgc2VsZi5DYW5Vc2VJbWdkaWZmKHRndF9uYW1lLCB0Z3RfcmFuZ2VzLCBzcmNfcmFuZ2VzLCBUcnVlKToKKyAgICAgICAgICBsYXJnZV9hcGtzLmFwcGVuZCgodGd0X25hbWUsIHNyY19uYW1lLCB0Z3RfcmFuZ2VzLCBzcmNfcmFuZ2VzKSkKKyAgICAgICAgICByZXR1cm4KKworICAgICAgQWRkU3BsaXRUcmFuc2ZlcnNXaXRoRml4ZWRTaXplQ2h1bmtzKHRndF9uYW1lLCBzcmNfbmFtZSwgdGd0X3JhbmdlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfcmFuZ2VzLCBzdHlsZSwgYnlfaWQpCisKICAgICBkZWYgQWRkVHJhbnNmZXIodGd0X25hbWUsIHNyY19uYW1lLCB0Z3RfcmFuZ2VzLCBzcmNfcmFuZ2VzLCBzdHlsZSwgYnlfaWQsCiAgICAgICAgICAgICAgICAgICAgIHNwbGl0PUZhbHNlKToKICAgICAgICIiIldyYXBwZXIgZnVuY3Rpb24gZm9yIGFkZGluZyBhIFRyYW5zZmVyKCkuIiIiCkBAIC0xMjI2LDggKzE0MTIsOSBAQAogCiAgICAgICAgIGlmIHRndF9jaGFuZ2VkIDwgdGd0X3NpemUgKiBjcm9wX3RocmVzaG9sZDoKICAgICAgICAgICBhc3NlcnQgdGd0X2NoYW5nZWQgKyB0Z3Rfc2tpcHBlZC5zaXplKCkgPT0gdGd0X3NpemUKLSAgICAgICAgICBwcmludCgnJTEwZCAlMTBkICglNi4yZiUlKSAlcycgJSAodGd0X3NraXBwZWQuc2l6ZSgpLCB0Z3Rfc2l6ZSwKLSAgICAgICAgICAgICAgICB0Z3Rfc2tpcHBlZC5zaXplKCkgKiAxMDAuMCAvIHRndF9zaXplLCB0Z3RfbmFtZSkpCisgICAgICAgICAgcHJpbnQoJyUxMGQgJTEwZCAoJTYuMmYlJSkgJXMnICUgKAorICAgICAgICAgICAgICB0Z3Rfc2tpcHBlZC5zaXplKCksIHRndF9zaXplLAorICAgICAgICAgICAgICB0Z3Rfc2tpcHBlZC5zaXplKCkgKiAxMDAuMCAvIHRndF9zaXplLCB0Z3RfbmFtZSkpCiAgICAgICAgICAgQWRkU3BsaXRUcmFuc2ZlcnMoCiAgICAgICAgICAgICAgICIlcy1za2lwcGVkIiAlICh0Z3RfbmFtZSwpLAogICAgICAgICAgICAgICAiJXMtc2tpcHBlZCIgJSAoc3JjX25hbWUsKSwKQEAgLTEyNDgsMTAgKzE0MzUsMTM2IEBACiAgICAgICBBZGRTcGxpdFRyYW5zZmVycygKICAgICAgICAgICB0Z3RfbmFtZSwgc3JjX25hbWUsIHRndF9yYW5nZXMsIHNyY19yYW5nZXMsIHN0eWxlLCBieV9pZCkKIAorICAgIGRlZiBQYXJzZUFuZFZhbGlkYXRlU3BsaXRJbmZvKHBhdGNoX3NpemUsIHRndF9yYW5nZXMsIHNyY19yYW5nZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BsaXRfaW5mbyk6CisgICAgICAiIiJQYXJzZSB0aGUgc3BsaXRfaW5mbyBhbmQgcmV0dXJuIGEgbGlzdCBvZiBpbmZvIHR1cGxlcy4KKworICAgICAgQXJnczoKKyAgICAgICAgcGF0Y2hfc2l6ZTogdG90YWwgc2l6ZSBvZiB0aGUgcGF0Y2ggZmlsZS4KKyAgICAgICAgdGd0X3JhbmdlczogUmFuZ2VzIG9mIHRoZSB0YXJnZXQgZmlsZSB3aXRoaW4gdGhlIG9yaWdpbmFsIGltYWdlLgorICAgICAgICBzcmNfcmFuZ2VzOiBSYW5nZXMgb2YgdGhlIHNvdXJjZSBmaWxlIHdpdGhpbiB0aGUgb3JpZ2luYWwgaW1hZ2UuCisgICAgICAgIHNwbGl0X2luZm8gZm9ybWF0OgorICAgICAgICAgIGltZ2RpZmYgdmVyc2lvbiMKKyAgICAgICAgICBjb3VudCBvZiBwaWVjZXMKKyAgICAgICAgICA8cGF0Y2hfc2l6ZV8xPiA8dGd0X3NpemVfMT4gPHNyY19yYW5nZXNfMT4KKyAgICAgICAgICAuLi4KKyAgICAgICAgICA8cGF0Y2hfc2l6ZV9uPiA8dGd0X3NpemVfbj4gPHNyY19yYW5nZXNfbj4KKworICAgICAgUmV0dXJuczoKKyAgICAgICAgW3BhdGNoX3N0YXJ0LCBwYXRjaF9sZW4sIHNwbGl0X3RndF9yYW5nZXMsIHNwbGl0X3NyY19yYW5nZXNdCisgICAgICAiIiIKKworICAgICAgdmVyc2lvbiA9IGludChzcGxpdF9pbmZvWzBdKQorICAgICAgYXNzZXJ0IHZlcnNpb24gPT0gMgorICAgICAgY291bnQgPSBpbnQoc3BsaXRfaW5mb1sxXSkKKyAgICAgIGFzc2VydCBsZW4oc3BsaXRfaW5mbykgLSAyID09IGNvdW50CisKKyAgICAgIHNwbGl0X2luZm9fbGlzdCA9IFtdCisgICAgICBwYXRjaF9zdGFydCA9IDAKKyAgICAgIHRndF9yZW1haW4gPSBjb3B5LmRlZXBjb3B5KHRndF9yYW5nZXMpCisgICAgICAjIGVhY2ggbGluZSBoYXMgdGhlIGZvcm1hdCA8cGF0Y2hfc2l6ZT4sIDx0Z3Rfc2l6ZT4sIDxzcmNfcmFuZ2VzPgorICAgICAgZm9yIGxpbmUgaW4gc3BsaXRfaW5mb1syOl06CisgICAgICAgIGluZm8gPSBsaW5lLnNwbGl0KCkKKyAgICAgICAgYXNzZXJ0IGxlbihpbmZvKSA9PSAzCisgICAgICAgIHBhdGNoX2xlbmd0aCA9IGludChpbmZvWzBdKQorCisgICAgICAgIHNwbGl0X3RndF9zaXplID0gaW50KGluZm9bMV0pCisgICAgICAgIGFzc2VydCBzcGxpdF90Z3Rfc2l6ZSAlIDQwOTYgPT0gMAorICAgICAgICBhc3NlcnQgc3BsaXRfdGd0X3NpemUgLyA0MDk2IDw9IHRndF9yZW1haW4uc2l6ZSgpCisgICAgICAgIHNwbGl0X3RndF9yYW5nZXMgPSB0Z3RfcmVtYWluLmZpcnN0KHNwbGl0X3RndF9zaXplIC8gNDA5NikKKyAgICAgICAgdGd0X3JlbWFpbiA9IHRndF9yZW1haW4uc3VidHJhY3Qoc3BsaXRfdGd0X3JhbmdlcykKKworICAgICAgICAjIEZpbmQgdGhlIHNwbGl0X3NyY19yYW5nZXMgd2l0aGluIHRoZSBpbWFnZSBmaWxlIGZyb20gaXRzIHJlbGF0aXZlCisgICAgICAgICMgcG9zaXRpb24gaW4gZmlsZS4KKyAgICAgICAgc3BsaXRfc3JjX2luZGljZXMgPSBSYW5nZVNldC5wYXJzZV9yYXcoaW5mb1syXSkKKyAgICAgICAgc3BsaXRfc3JjX3JhbmdlcyA9IFJhbmdlU2V0KCkKKyAgICAgICAgZm9yIHIgaW4gc3BsaXRfc3JjX2luZGljZXM6CisgICAgICAgICAgY3Vycl9yYW5nZSA9IHNyY19yYW5nZXMuZmlyc3QoclsxXSkuc3VidHJhY3Qoc3JjX3Jhbmdlcy5maXJzdChyWzBdKSkKKyAgICAgICAgICBhc3NlcnQgbm90IHNwbGl0X3NyY19yYW5nZXMub3ZlcmxhcHMoY3Vycl9yYW5nZSkKKyAgICAgICAgICBzcGxpdF9zcmNfcmFuZ2VzID0gc3BsaXRfc3JjX3Jhbmdlcy51bmlvbihjdXJyX3JhbmdlKQorCisgICAgICAgIHNwbGl0X2luZm9fbGlzdC5hcHBlbmQoKHBhdGNoX3N0YXJ0LCBwYXRjaF9sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwbGl0X3RndF9yYW5nZXMsIHNwbGl0X3NyY19yYW5nZXMpKQorICAgICAgICBwYXRjaF9zdGFydCArPSBwYXRjaF9sZW5ndGgKKworICAgICAgIyBDaGVjayB0aGF0IHRoZSBzaXplcyBvZiBhbGwgdGhlIHNwbGl0IHBpZWNlcyBhZGQgdXAgdG8gdGhlIGZpbmFsIGZpbGUKKyAgICAgICMgc2l6ZSBmb3IgcGF0Y2ggYW5kIHRhcmdldC4KKyAgICAgIGFzc2VydCB0Z3RfcmVtYWluLnNpemUoKSA9PSAwCisgICAgICBhc3NlcnQgcGF0Y2hfc3RhcnQgPT0gcGF0Y2hfc2l6ZQorICAgICAgcmV0dXJuIHNwbGl0X2luZm9fbGlzdAorCisgICAgZGVmIFNwbGl0TGFyZ2VBcGtzKCk6CisgICAgICAiIiJTcGxpdCB0aGUgbGFyZ2UgYXBrcyBmaWxlcy4KKworICAgICAgRXhhbXBsZTogQ2hyb21lLmFwayB3aWxsIGJlIHNwbGl0IGludG8KKyAgICAgICAgc3JjLTA6IENocm9tZS5hcGstMCwgdGd0LTA6IENocm9tZS5hcGstMAorICAgICAgICBzcmMtMTogQ2hyb21lLmFway0xLCB0Z3QtMTogQ2hyb21lLmFway0xCisgICAgICAgIC4uLgorCisgICAgICBBZnRlciB0aGUgc3BsaXQsIHRoZSB0YXJnZXQgcGllY2VzIGFyZSBjb250aW51b3VzIGFuZCBibG9jayBhbGlnbmVkOyBhbmQKKyAgICAgIHRoZSBzb3VyY2UgcGllY2VzIGFyZSBtdXR1YWxseSBleGNsdXNpdmUuIER1cmluZyB0aGUgc3BsaXQsIHdlIGFsc28KKyAgICAgIGdlbmVyYXRlIGFuZCBzYXZlIHRoZSBpbWFnZSBwYXRjaCBiZXR3ZWVuIHNyYy1YICYgdGd0LVguIFRoaXMgcGF0Y2ggd2lsbAorICAgICAgYmUgdmFsaWQgYmVjYXVzZSB0aGUgYmxvY2sgcmFuZ2VzIG9mIHNyYy1YICYgdGd0LVggd2lsbCBhbHdheXMgc3RheSB0aGUKKyAgICAgIHNhbWUgYWZ0ZXJ3YXJkczsgYnV0IHRoZXJlJ3MgYSBjaGFuY2Ugd2UgZG9uJ3QgdXNlIHRoZSBwYXRjaCBpZiB3ZQorICAgICAgY29udmVydCB0aGUgImRpZmYiIGNvbW1hbmQgaW50byAibmV3IiBvciAibW92ZSIgbGF0ZXIuCisgICAgICAiIiIKKworICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgd2l0aCB0cmFuc2Zlcl9sb2NrOgorICAgICAgICAgIGlmIG5vdCBsYXJnZV9hcGtzOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgdGd0X25hbWUsIHNyY19uYW1lLCB0Z3RfcmFuZ2VzLCBzcmNfcmFuZ2VzID0gbGFyZ2VfYXBrcy5wb3AoMCkKKworICAgICAgICBzcmNfZmlsZSA9IGNvbW1vbi5NYWtlVGVtcEZpbGUocHJlZml4PSJzcmMtIikKKyAgICAgICAgdGd0X2ZpbGUgPSBjb21tb24uTWFrZVRlbXBGaWxlKHByZWZpeD0idGd0LSIpCisgICAgICAgIHdpdGggb3BlbihzcmNfZmlsZSwgIndiIikgYXMgc3JjX2ZkOgorICAgICAgICAgIHNlbGYuc3JjLldyaXRlUmFuZ2VEYXRhVG9GZChzcmNfcmFuZ2VzLCBzcmNfZmQpCisgICAgICAgIHdpdGggb3Blbih0Z3RfZmlsZSwgIndiIikgYXMgdGd0X2ZkOgorICAgICAgICAgIHNlbGYudGd0LldyaXRlUmFuZ2VEYXRhVG9GZCh0Z3RfcmFuZ2VzLCB0Z3RfZmQpCisKKyAgICAgICAgcGF0Y2hfZmlsZSA9IGNvbW1vbi5NYWtlVGVtcEZpbGUocHJlZml4PSJwYXRjaC0iKQorICAgICAgICBwYXRjaF9pbmZvX2ZpbGUgPSBjb21tb24uTWFrZVRlbXBGaWxlKHByZWZpeD0ic3BsaXRfaW5mby0iKQorICAgICAgICBjbWQgPSBbImltZ2RpZmYiLCAiLXoiLAorICAgICAgICAgICAgICAgIi0tYmxvY2stbGltaXQ9e30iLmZvcm1hdChtYXhfYmxvY2tzX3Blcl90cmFuc2ZlciksCisgICAgICAgICAgICAgICAiLS1zcGxpdC1pbmZvPSIgKyBwYXRjaF9pbmZvX2ZpbGUsCisgICAgICAgICAgICAgICBzcmNfZmlsZSwgdGd0X2ZpbGUsIHBhdGNoX2ZpbGVdCisgICAgICAgIHAgPSBjb21tb24uUnVuKGNtZCwgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwgc3RkZXJyPXN1YnByb2Nlc3MuU1RET1VUKQorICAgICAgICBpbWdkaWZmX291dHB1dCwgXyA9IHAuY29tbXVuaWNhdGUoKQorICAgICAgICBhc3NlcnQgcC5yZXR1cm5jb2RlID09IDAsIFwKKyAgICAgICAgICAgICJGYWlsZWQgdG8gY3JlYXRlIGltZ2RpZmYgcGF0Y2ggYmV0d2VlbiB7fSBhbmQge306XG57fSIuZm9ybWF0KAorICAgICAgICAgICAgICAgIHNyY19uYW1lLCB0Z3RfbmFtZSwgaW1nZGlmZl9vdXRwdXQpCisKKyAgICAgICAgd2l0aCBvcGVuKHBhdGNoX2luZm9fZmlsZSkgYXMgcGF0Y2hfaW5mbzoKKyAgICAgICAgICBsaW5lcyA9IHBhdGNoX2luZm8ucmVhZGxpbmVzKCkKKworICAgICAgICBwYXRjaF9zaXplX3RvdGFsID0gb3MucGF0aC5nZXRzaXplKHBhdGNoX2ZpbGUpCisgICAgICAgIHNwbGl0X2luZm9fbGlzdCA9IFBhcnNlQW5kVmFsaWRhdGVTcGxpdEluZm8ocGF0Y2hfc2l6ZV90b3RhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Z3RfcmFuZ2VzLCBzcmNfcmFuZ2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVzKQorICAgICAgICBmb3IgaW5kZXgsIChwYXRjaF9zdGFydCwgcGF0Y2hfbGVuZ3RoLCBzcGxpdF90Z3RfcmFuZ2VzLAorICAgICAgICAgICAgICAgICAgICBzcGxpdF9zcmNfcmFuZ2VzKSBpbiBlbnVtZXJhdGUoc3BsaXRfaW5mb19saXN0KToKKyAgICAgICAgICB3aXRoIG9wZW4ocGF0Y2hfZmlsZSkgYXMgZjoKKyAgICAgICAgICAgIGYuc2VlayhwYXRjaF9zdGFydCkKKyAgICAgICAgICAgIHBhdGNoX2NvbnRlbnQgPSBmLnJlYWQocGF0Y2hfbGVuZ3RoKQorCisgICAgICAgICAgc3BsaXRfc3JjX25hbWUgPSAie30te30iLmZvcm1hdChzcmNfbmFtZSwgaW5kZXgpCisgICAgICAgICAgc3BsaXRfdGd0X25hbWUgPSAie30te30iLmZvcm1hdCh0Z3RfbmFtZSwgaW5kZXgpCisgICAgICAgICAgc3BsaXRfbGFyZ2VfYXBrcy5hcHBlbmQoKHNwbGl0X3RndF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGxpdF9zcmNfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BsaXRfdGd0X3JhbmdlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BsaXRfc3JjX3JhbmdlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2hfY29udGVudCkpCisKICAgICBwcmludCgiRmluZGluZyB0cmFuc2ZlcnMuLi4iKQogCisgICAgbGFyZ2VfYXBrcyA9IFtdCisgICAgc3BsaXRfbGFyZ2VfYXBrcyA9IFtdCisgICAgY2FjaGVfc2l6ZSA9IGNvbW1vbi5PUFRJT05TLmNhY2hlX3NpemUKKyAgICBzcGxpdF90aHJlc2hvbGQgPSAwLjEyNQorICAgIG1heF9ibG9ja3NfcGVyX3RyYW5zZmVyID0gaW50KGNhY2hlX3NpemUgKiBzcGxpdF90aHJlc2hvbGQgLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudGd0LmJsb2Nrc2l6ZSkKICAgICBlbXB0eSA9IFJhbmdlU2V0KCkKLSAgICBmb3IgdGd0X2ZuLCB0Z3RfcmFuZ2VzIGluIHNlbGYudGd0LmZpbGVfbWFwLml0ZW1zKCk6CisgICAgZm9yIHRndF9mbiwgdGd0X3JhbmdlcyBpbiBzb3J0ZWQoc2VsZi50Z3QuZmlsZV9tYXAuaXRlbXMoKSk6CiAgICAgICBpZiB0Z3RfZm4gPT0gIl9fWkVSTyI6CiAgICAgICAgICMgdGhlIHNwZWNpYWwgIl9fWkVSTyIgZG9tYWluIGlzIGFsbCB0aGUgYmxvY2tzIG5vdCBjb250YWluZWQKICAgICAgICAgIyBpbiBhbnkgZmlsZSBhbmQgdGhhdCBhcmUgZmlsbGVkIHdpdGggemVyb3MuICBXZSBoYXZlIGEKQEAgLTEyOTQsNiArMTYwNywyNCBAQAogCiAgICAgICBBZGRUcmFuc2Zlcih0Z3RfZm4sIE5vbmUsIHRndF9yYW5nZXMsIGVtcHR5LCAibmV3Iiwgc2VsZi50cmFuc2ZlcnMpCiAKKyAgICB0cmFuc2Zlcl9sb2NrID0gdGhyZWFkaW5nLkxvY2soKQorICAgIHRocmVhZHMgPSBbdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9U3BsaXRMYXJnZUFwa3MpCisgICAgICAgICAgICAgICBmb3IgXyBpbiByYW5nZShzZWxmLnRocmVhZHMpXQorICAgIGZvciB0aCBpbiB0aHJlYWRzOgorICAgICAgdGguc3RhcnQoKQorICAgIHdoaWxlIHRocmVhZHM6CisgICAgICB0aHJlYWRzLnBvcCgpLmpvaW4oKQorCisgICAgIyBTb3J0IHRoZSBzcGxpdCB0cmFuc2ZlcnMgZm9yIGxhcmdlIGFwa3MgdG8gZ2VuZXJhdGUgYSBkZXRlcm1pbmF0ZSBwYWNrYWdlLgorICAgIHNwbGl0X2xhcmdlX2Fwa3Muc29ydCgpCisgICAgZm9yICh0Z3RfbmFtZSwgc3JjX25hbWUsIHRndF9yYW5nZXMsIHNyY19yYW5nZXMsCisgICAgICAgICBwYXRjaCkgaW4gc3BsaXRfbGFyZ2VfYXBrczoKKyAgICAgIHRyYW5zZmVyX3NwbGl0ID0gVHJhbnNmZXIodGd0X25hbWUsIHNyY19uYW1lLCB0Z3RfcmFuZ2VzLCBzcmNfcmFuZ2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRndC5SYW5nZVNoYTEodGd0X3JhbmdlcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc3JjLlJhbmdlU2hhMShzcmNfcmFuZ2VzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRpZmYiLCBzZWxmLnRyYW5zZmVycykKKyAgICAgIHRyYW5zZmVyX3NwbGl0LnBhdGNoID0gcGF0Y2gKKwogICBkZWYgQWJicmV2aWF0ZVNvdXJjZU5hbWVzKHNlbGYpOgogICAgIGZvciBrIGluIHNlbGYuc3JjLmZpbGVfbWFwLmtleXMoKToKICAgICAgIGIgPSBvcy5wYXRoLmJhc2VuYW1lKGspCmRpZmYgLS1naXQgYS90b29scy9yZWxlYXNldG9vbHMvYnVpbGRfaW1hZ2UucHkgYi90b29scy9yZWxlYXNldG9vbHMvYnVpbGRfaW1hZ2UucHkKaW5kZXggY2NmYTM1Zi4uY2E5NmQwMSAxMDA3NTUKLS0tIGEvdG9vbHMvcmVsZWFzZXRvb2xzL2J1aWxkX2ltYWdlLnB5CisrKyBiL3Rvb2xzL3JlbGVhc2V0b29scy9idWlsZF9pbWFnZS5weQpAQCAtMTUsNjMgKzE1LDc5IEBACiAjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAiIiIKLUJ1aWxkIGltYWdlIG91dHB1dF9pbWFnZV9maWxlIGZyb20gaW5wdXRfZGlyZWN0b3J5LCBwcm9wZXJ0aWVzX2ZpbGUsIGFuZCB0YXJnZXRfb3V0X2RpcgorQnVpbGRzIG91dHB1dF9pbWFnZSBmcm9tIHRoZSBnaXZlbiBpbnB1dF9kaXJlY3RvcnksIHByb3BlcnRpZXNfZmlsZSwKK2FuZCB3cml0ZXMgdGhlIGltYWdlIHRvIHRhcmdldF9vdXRwdXRfZGlyZWN0b3J5LgogCi1Vc2FnZTogIGJ1aWxkX2ltYWdlIGlucHV0X2RpcmVjdG9yeSBwcm9wZXJ0aWVzX2ZpbGUgb3V0cHV0X2ltYWdlX2ZpbGUgdGFyZ2V0X291dF9kaXIKLQorVXNhZ2U6ICBidWlsZF9pbWFnZS5weSBpbnB1dF9kaXJlY3RvcnkgcHJvcGVydGllc19maWxlIG91dHB1dF9pbWFnZSBcXAorICAgICAgICAgICAgdGFyZ2V0X291dHB1dF9kaXJlY3RvcnkKICIiIgorCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHByaW50X2Z1bmN0aW9uCisKIGltcG9ydCBvcwogaW1wb3J0IG9zLnBhdGgKIGltcG9ydCByZQotaW1wb3J0IHN1YnByb2Nlc3MKLWltcG9ydCBzeXMKLWltcG9ydCBjb21tb24KIGltcG9ydCBzaGxleAogaW1wb3J0IHNodXRpbAoraW1wb3J0IHN1YnByb2Nlc3MKK2ltcG9ydCBzeXMKKworaW1wb3J0IGNvbW1vbgogaW1wb3J0IHNwYXJzZV9pbWcKLWltcG9ydCB0ZW1wZmlsZQorCiAKIE9QVElPTlMgPSBjb21tb24uT1BUSU9OUwogCiBGSVhFRF9TQUxUID0gImFlZTA4N2E1YmUzYjk4Mjk3OGM5MjNmNTY2YTk0NjEzNDk2YjQxN2YyYWY1OTI2MzliYzgwZDE0MWUzNGRmZTciCiBCTE9DS19TSVpFID0gNDA5NgogCi1kZWYgUnVuQ29tbWFuZChjbWQpOgorCitkZWYgUnVuQ29tbWFuZChjbWQsIHZlcmJvc2U9Tm9uZSk6CiAgICIiIkVjaG8gYW5kIHJ1biB0aGUgZ2l2ZW4gY29tbWFuZC4KIAogICBBcmdzOgogICAgIGNtZDogdGhlIGNvbW1hbmQgcmVwcmVzZW50ZWQgYXMgYSBsaXN0IG9mIHN0cmluZ3MuCisgICAgdmVyYm9zZTogc2hvdyBjb21tYW5kcyBiZWluZyBleGVjdXRlZC4KICAgUmV0dXJuczoKICAgICBBIHR1cGxlIG9mIHRoZSBvdXRwdXQgYW5kIHRoZSBleGl0IGNvZGUuCiAgICIiIgotICBwcmludCAiUnVubmluZzogIiwgIiAiLmpvaW4oY21kKQorICBpZiB2ZXJib3NlIGlzIE5vbmU6CisgICAgdmVyYm9zZSA9IE9QVElPTlMudmVyYm9zZQorICBpZiB2ZXJib3NlOgorICAgIHByaW50KCJSdW5uaW5nOiAiICsgIiAiLmpvaW4oY21kKSkKICAgcCA9IHN1YnByb2Nlc3MuUG9wZW4oY21kLCBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLCBzdGRlcnI9c3VicHJvY2Vzcy5TVERPVVQpCiAgIG91dHB1dCwgXyA9IHAuY29tbXVuaWNhdGUoKQotICBwcmludCAiJXMiICUgKG91dHB1dC5yc3RyaXAoKSwpCisKKyAgaWYgdmVyYm9zZToKKyAgICBwcmludChvdXRwdXQucnN0cmlwKCkpCiAgIHJldHVybiAob3V0cHV0LCBwLnJldHVybmNvZGUpCiAKKwogZGVmIEdldFZlcml0eUZFQ1NpemUocGFydGl0aW9uX3NpemUpOgogICBjbWQgPSBbImZlYyIsICItcyIsIHN0cihwYXJ0aXRpb25fc2l6ZSldCi0gIG91dHB1dCwgZXhpdF9jb2RlID0gUnVuQ29tbWFuZChjbWQpCisgIG91dHB1dCwgZXhpdF9jb2RlID0gUnVuQ29tbWFuZChjbWQsIEZhbHNlKQogICBpZiBleGl0X2NvZGUgIT0gMDoKICAgICByZXR1cm4gRmFsc2UsIDAKICAgcmV0dXJuIFRydWUsIGludChvdXRwdXQpCiAKKwogZGVmIEdldFZlcml0eVRyZWVTaXplKHBhcnRpdGlvbl9zaXplKToKICAgY21kID0gWyJidWlsZF92ZXJpdHlfdHJlZSIsICItcyIsIHN0cihwYXJ0aXRpb25fc2l6ZSldCi0gIG91dHB1dCwgZXhpdF9jb2RlID0gUnVuQ29tbWFuZChjbWQpCisgIG91dHB1dCwgZXhpdF9jb2RlID0gUnVuQ29tbWFuZChjbWQsIEZhbHNlKQogICBpZiBleGl0X2NvZGUgIT0gMDoKICAgICByZXR1cm4gRmFsc2UsIDAKICAgcmV0dXJuIFRydWUsIGludChvdXRwdXQpCiAKKwogZGVmIEdldFZlcml0eU1ldGFkYXRhU2l6ZShwYXJ0aXRpb25fc2l6ZSk6CiAgIGNtZCA9IFsic3lzdGVtL2V4dHJhcy92ZXJpdHkvYnVpbGRfdmVyaXR5X21ldGFkYXRhLnB5IiwgInNpemUiLAogICAgICAgICAgc3RyKHBhcnRpdGlvbl9zaXplKV0KLSAgb3V0cHV0LCBleGl0X2NvZGUgPSBSdW5Db21tYW5kKGNtZCkKKyAgb3V0cHV0LCBleGl0X2NvZGUgPSBSdW5Db21tYW5kKGNtZCwgRmFsc2UpCiAgIGlmIGV4aXRfY29kZSAhPSAwOgogICAgIHJldHVybiBGYWxzZSwgMAogICByZXR1cm4gVHJ1ZSwgaW50KG91dHB1dCkKIAorCiBkZWYgR2V0VmVyaXR5U2l6ZShwYXJ0aXRpb25fc2l6ZSwgZmVjX3N1cHBvcnRlZCk6CiAgIHN1Y2Nlc3MsIHZlcml0eV90cmVlX3NpemUgPSBHZXRWZXJpdHlUcmVlU2l6ZShwYXJ0aXRpb25fc2l6ZSkKICAgaWYgbm90IHN1Y2Nlc3M6CkBAIC04NywxNiArMTAzLDE5IEBACiAgICAgcmV0dXJuIHZlcml0eV9zaXplICsgZmVjX3NpemUKICAgcmV0dXJuIHZlcml0eV9zaXplCiAKKwogZGVmIEdldFNpbWdTaXplKGltYWdlX2ZpbGUpOgogICBzaW1nID0gc3BhcnNlX2ltZy5TcGFyc2VJbWFnZShpbWFnZV9maWxlLCBidWlsZF9tYXA9RmFsc2UpCiAgIHJldHVybiBzaW1nLmJsb2Nrc2l6ZSAqIHNpbWcudG90YWxfYmxvY2tzCiAKKwogZGVmIFplcm9QYWRTaW1nKGltYWdlX2ZpbGUsIHBhZF9zaXplKToKICAgYmxvY2tzID0gcGFkX3NpemUgLy8gQkxPQ0tfU0laRQogICBwcmludCgiUGFkZGluZyAlZCBibG9ja3MgKCVkIGJ5dGVzKSIgJSAoYmxvY2tzLCBwYWRfc2l6ZSkpCiAgIHNpbWcgPSBzcGFyc2VfaW1nLlNwYXJzZUltYWdlKGltYWdlX2ZpbGUsIG1vZGU9InIrYiIsIGJ1aWxkX21hcD1GYWxzZSkKICAgc2ltZy5BcHBlbmRGaWxsQ2h1bmsoMCwgYmxvY2tzKQogCisKIGRlZiBBVkJDYWxjTWF4SW1hZ2VTaXplKGF2YnRvb2wsIGZvb3Rlcl90eXBlLCBwYXJ0aXRpb25fc2l6ZSwgYWRkaXRpb25hbF9hcmdzKToKICAgIiIiQ2FsY3VsYXRlcyBtYXggaW1hZ2Ugc2l6ZSBmb3IgYSBnaXZlbiBwYXJ0aXRpb24gc2l6ZS4KIApAQCAtMTA5LDggKzEyOCw4IEBACiAgIFJldHVybnM6CiAgICAgVGhlIG1heGltdW0gaW1hZ2Ugc2l6ZSBvciAwIGlmIGFuIGVycm9yIG9jY3VycmVkLgogICAiIiIKLSAgY21kID1bYXZidG9vbCwgImFkZF8lc19mb290ZXIiICUgZm9vdGVyX3R5cGUsCi0gICAgICAgICItLXBhcnRpdGlvbl9zaXplIiwgcGFydGl0aW9uX3NpemUsICItLWNhbGNfbWF4X2ltYWdlX3NpemUiXQorICBjbWQgPSBbYXZidG9vbCwgImFkZF8lc19mb290ZXIiICUgZm9vdGVyX3R5cGUsCisgICAgICAgICAiLS1wYXJ0aXRpb25fc2l6ZSIsIHBhcnRpdGlvbl9zaXplLCAiLS1jYWxjX21heF9pbWFnZV9zaXplIl0KICAgY21kLmV4dGVuZChzaGxleC5zcGxpdChhZGRpdGlvbmFsX2FyZ3MpKQogCiAgIChvdXRwdXQsIGV4aXRfY29kZSkgPSBSdW5Db21tYW5kKGNtZCkKQEAgLTExOSw2ICsxMzgsNyBAQAogICBlbHNlOgogICAgIHJldHVybiBpbnQob3V0cHV0KQogCisKIGRlZiBBVkJBZGRGb290ZXIoaW1hZ2VfcGF0aCwgYXZidG9vbCwgZm9vdGVyX3R5cGUsIHBhcnRpdGlvbl9zaXplLAogICAgICAgICAgICAgICAgICBwYXJ0aXRpb25fbmFtZSwga2V5X3BhdGgsIGFsZ29yaXRobSwgc2FsdCwKICAgICAgICAgICAgICAgICAgYWRkaXRpb25hbF9hcmdzKToKQEAgLTEzNCwxNCArMTU0LDE1IEBACiAgICAgYWxnb3JpdGhtOiBOYW1lIG9mIGFsZ29yaXRobSB0byB1c2Ugb3IgTm9uZS4KICAgICBzYWx0OiBUaGUgc2FsdCB0byB1c2UgKGEgaGV4YWRlY2ltYWwgc3RyaW5nKSBvciBOb25lLgogICAgIGFkZGl0aW9uYWxfYXJnczogQWRkaXRpb25hbCBhcmd1bWVudHMgdG8gcGFzcyB0byAnYXZidG9vbAotICAgICAgYWRkX2hhc2h0cmVlX2ltYWdlJy4KKyAgICAgICAgYWRkX2hhc2h0cmVlX2ltYWdlJy4KKwogICBSZXR1cm5zOgogICAgIFRydWUgaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkZWQuCiAgICIiIgotICBjbWQgPVthdmJ0b29sLCAiYWRkXyVzX2Zvb3RlciIgJSBmb290ZXJfdHlwZSwKLSAgICAgICAgIi0tcGFydGl0aW9uX3NpemUiLCBwYXJ0aXRpb25fc2l6ZSwKLSAgICAgICAgIi0tcGFydGl0aW9uX25hbWUiLCBwYXJ0aXRpb25fbmFtZSwKLSAgICAgICAgIi0taW1hZ2UiLCBpbWFnZV9wYXRoXQorICBjbWQgPSBbYXZidG9vbCwgImFkZF8lc19mb290ZXIiICUgZm9vdGVyX3R5cGUsCisgICAgICAgICAiLS1wYXJ0aXRpb25fc2l6ZSIsIHBhcnRpdGlvbl9zaXplLAorICAgICAgICAgIi0tcGFydGl0aW9uX25hbWUiLCBwYXJ0aXRpb25fbmFtZSwKKyAgICAgICAgICItLWltYWdlIiwgaW1hZ2VfcGF0aF0KIAogICBpZiBrZXlfcGF0aCBhbmQgYWxnb3JpdGhtOgogICAgIGNtZC5leHRlbmQoWyItLWtleSIsIGtleV9wYXRoLCAiLS1hbGdvcml0aG0iLCBhbGdvcml0aG1dKQpAQCAtMTUzLDEyICsxNzQsMTUgQEAKICAgKF8sIGV4aXRfY29kZSkgPSBSdW5Db21tYW5kKGNtZCkKICAgcmV0dXJuIGV4aXRfY29kZSA9PSAwCiAKKwogZGVmIEFkanVzdFBhcnRpdGlvblNpemVGb3JWZXJpdHkocGFydGl0aW9uX3NpemUsIGZlY19zdXBwb3J0ZWQpOgogICAiIiJNb2RpZmllcyB0aGUgcHJvdmlkZWQgcGFydGl0aW9uIHNpemUgdG8gYWNjb3VudCBmb3IgdGhlIHZlcml0eSBtZXRhZGF0YS4KIAogICBUaGlzIGluZm9ybWF0aW9uIGlzIHVzZWQgdG8gc2l6ZSB0aGUgY3JlYXRlZCBpbWFnZSBhcHByb3ByaWF0ZWx5LgorCiAgIEFyZ3M6CiAgICAgcGFydGl0aW9uX3NpemU6IHRoZSBzaXplIG9mIHRoZSBwYXJ0aXRpb24gdG8gYmUgdmVyaWZpZWQuCisKICAgUmV0dXJuczoKICAgICBBIHR1cGxlIG9mIHRoZSBzaXplIG9mIHRoZSBwYXJ0aXRpb24gYWRqdXN0ZWQgZm9yIHZlcml0eSBtZXRhZGF0YSwgYW5kCiAgICAgdGhlIHNpemUgb2YgdmVyaXR5IG1ldGFkYXRhLgpAQCAtMTg5LDQ2ICsyMTMsNTcgQEAKICAgICBlbHNlOgogICAgICAgaGkgPSBpCiAKKyAgaWYgT1BUSU9OUy52ZXJib3NlOgorICAgIHByaW50KCJBZGp1c3RlZCBwYXJ0aXRpb24gc2l6ZSBmb3IgdmVyaXR5LCBwYXJ0aXRpb25fc2l6ZToge30sIgorICAgICAgICAgICIgdmVyaXR5X3NpemU6IHt9Ii5mb3JtYXQocmVzdWx0LCB2ZXJpdHlfc2l6ZSkpCiAgIEFkanVzdFBhcnRpdGlvblNpemVGb3JWZXJpdHkucmVzdWx0c1trZXldID0gKHJlc3VsdCwgdmVyaXR5X3NpemUpCiAgIHJldHVybiAocmVzdWx0LCB2ZXJpdHlfc2l6ZSkKIAorCiBBZGp1c3RQYXJ0aXRpb25TaXplRm9yVmVyaXR5LnJlc3VsdHMgPSB7fQogCisKIGRlZiBCdWlsZFZlcml0eUZFQyhzcGFyc2VfaW1hZ2VfcGF0aCwgdmVyaXR5X3BhdGgsIHZlcml0eV9mZWNfcGF0aCwKICAgICAgICAgICAgICAgICAgICBwYWRkaW5nX3NpemUpOgogICBjbWQgPSBbImZlYyIsICItZSIsICItcCIsIHN0cihwYWRkaW5nX3NpemUpLCBzcGFyc2VfaW1hZ2VfcGF0aCwKICAgICAgICAgIHZlcml0eV9wYXRoLCB2ZXJpdHlfZmVjX3BhdGhdCiAgIG91dHB1dCwgZXhpdF9jb2RlID0gUnVuQ29tbWFuZChjbWQpCiAgIGlmIGV4aXRfY29kZSAhPSAwOgotICAgIHByaW50ICJDb3VsZCBub3QgYnVpbGQgRkVDIGRhdGEhIEVycm9yOiAlcyIgJSBvdXRwdXQKKyAgICBwcmludCgiQ291bGQgbm90IGJ1aWxkIEZFQyBkYXRhISBFcnJvcjogJXMiICUgb3V0cHV0KQogICAgIHJldHVybiBGYWxzZQogICByZXR1cm4gVHJ1ZQogCisKIGRlZiBCdWlsZFZlcml0eVRyZWUoc3BhcnNlX2ltYWdlX3BhdGgsIHZlcml0eV9pbWFnZV9wYXRoLCBwcm9wX2RpY3QpOgogICBjbWQgPSBbImJ1aWxkX3Zlcml0eV90cmVlIiwgIi1BIiwgRklYRURfU0FMVCwgc3BhcnNlX2ltYWdlX3BhdGgsCiAgICAgICAgICB2ZXJpdHlfaW1hZ2VfcGF0aF0KICAgb3V0cHV0LCBleGl0X2NvZGUgPSBSdW5Db21tYW5kKGNtZCkKICAgaWYgZXhpdF9jb2RlICE9IDA6Ci0gICAgcHJpbnQgIkNvdWxkIG5vdCBidWlsZCB2ZXJpdHkgdHJlZSEgRXJyb3I6ICVzIiAlIG91dHB1dAorICAgIHByaW50KCJDb3VsZCBub3QgYnVpbGQgdmVyaXR5IHRyZWUhIEVycm9yOiAlcyIgJSBvdXRwdXQpCiAgICAgcmV0dXJuIEZhbHNlCiAgIHJvb3QsIHNhbHQgPSBvdXRwdXQuc3BsaXQoKQogICBwcm9wX2RpY3RbInZlcml0eV9yb290X2hhc2giXSA9IHJvb3QKICAgcHJvcF9kaWN0WyJ2ZXJpdHlfc2FsdCJdID0gc2FsdAogICByZXR1cm4gVHJ1ZQogCisKIGRlZiBCdWlsZFZlcml0eU1ldGFkYXRhKGltYWdlX3NpemUsIHZlcml0eV9tZXRhZGF0YV9wYXRoLCByb290X2hhc2gsIHNhbHQsCi0gICAgICAgICAgICAgICAgICAgICAgICBibG9ja19kZXZpY2UsIHNpZ25lcl9wYXRoLCBrZXksIHNpZ25lcl9hcmdzKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrX2RldmljZSwgc2lnbmVyX3BhdGgsIGtleSwgc2lnbmVyX2FyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICB2ZXJpdHlfZGlzYWJsZSk6CiAgIGNtZCA9IFsic3lzdGVtL2V4dHJhcy92ZXJpdHkvYnVpbGRfdmVyaXR5X21ldGFkYXRhLnB5IiwgImJ1aWxkIiwKICAgICAgICAgIHN0cihpbWFnZV9zaXplKSwgdmVyaXR5X21ldGFkYXRhX3BhdGgsIHJvb3RfaGFzaCwgc2FsdCwgYmxvY2tfZGV2aWNlLAogICAgICAgICAgc2lnbmVyX3BhdGgsIGtleV0KICAgaWYgc2lnbmVyX2FyZ3M6CiAgICAgY21kLmFwcGVuZCgiLS1zaWduZXJfYXJncz1cIiVzXCIiICUgKCcgJy5qb2luKHNpZ25lcl9hcmdzKSwpKQorICBpZiB2ZXJpdHlfZGlzYWJsZToKKyAgICBjbWQuYXBwZW5kKCItLXZlcml0eV9kaXNhYmxlIikKICAgb3V0cHV0LCBleGl0X2NvZGUgPSBSdW5Db21tYW5kKGNtZCkKICAgaWYgZXhpdF9jb2RlICE9IDA6Ci0gICAgcHJpbnQgIkNvdWxkIG5vdCBidWlsZCB2ZXJpdHkgbWV0YWRhdGEhIEVycm9yOiAlcyIgJSBvdXRwdXQKKyAgICBwcmludCgiQ291bGQgbm90IGJ1aWxkIHZlcml0eSBtZXRhZGF0YSEgRXJyb3I6ICVzIiAlIG91dHB1dCkKICAgICByZXR1cm4gRmFsc2UKICAgcmV0dXJuIFRydWUKIAorCiBkZWYgQXBwZW5kMlNpbWcoc3BhcnNlX2ltYWdlX3BhdGgsIHVuc3BhcnNlX2ltYWdlX3BhdGgsIGVycm9yX21lc3NhZ2UpOgogICAiIiJBcHBlbmRzIHRoZSB1bnNwYXJzZSBpbWFnZSB0byB0aGUgZ2l2ZW4gc3BhcnNlIGltYWdlLgogCkBAIC0yNDEsMTggKzI3NiwyMyBAQAogICBjbWQgPSBbImFwcGVuZDJzaW1nIiwgc3BhcnNlX2ltYWdlX3BhdGgsIHVuc3BhcnNlX2ltYWdlX3BhdGhdCiAgIG91dHB1dCwgZXhpdF9jb2RlID0gUnVuQ29tbWFuZChjbWQpCiAgIGlmIGV4aXRfY29kZSAhPSAwOgotICAgIHByaW50ICIlczogJXMiICUgKGVycm9yX21lc3NhZ2UsIG91dHB1dCkKKyAgICBwcmludCgiJXM6ICVzIiAlIChlcnJvcl9tZXNzYWdlLCBvdXRwdXQpKQogICAgIHJldHVybiBGYWxzZQogICByZXR1cm4gVHJ1ZQogCisKIGRlZiBBcHBlbmQodGFyZ2V0LCBmaWxlX3RvX2FwcGVuZCwgZXJyb3JfbWVzc2FnZSk6Ci0gIHByaW50ICJhcHBlbmRpbmcgJXMgdG8gJXMiICUgKGZpbGVfdG9fYXBwZW5kLCB0YXJnZXQpCi0gIHdpdGggb3Blbih0YXJnZXQsICJhIikgYXMgb3V0X2ZpbGU6Ci0gICAgd2l0aCBvcGVuKGZpbGVfdG9fYXBwZW5kLCAiciIpIGFzIGlucHV0X2ZpbGU6CisgICIiIkFwcGVuZHMgZmlsZV90b19hcHBlbmQgdG8gdGFyZ2V0LiIiIgorICB0cnk6CisgICAgd2l0aCBvcGVuKHRhcmdldCwgImEiKSBhcyBvdXRfZmlsZSwgb3BlbihmaWxlX3RvX2FwcGVuZCwgInIiKSBhcyBpbnB1dF9maWxlOgogICAgICAgZm9yIGxpbmUgaW4gaW5wdXRfZmlsZToKICAgICAgICAgb3V0X2ZpbGUud3JpdGUobGluZSkKKyAgZXhjZXB0IElPRXJyb3I6CisgICAgcHJpbnQoZXJyb3JfbWVzc2FnZSkKKyAgICByZXR1cm4gRmFsc2UKICAgcmV0dXJuIFRydWUKIAorCiBkZWYgQnVpbGRWZXJpZmllZEltYWdlKGRhdGFfaW1hZ2VfcGF0aCwgdmVyaXR5X2ltYWdlX3BhdGgsCiAgICAgICAgICAgICAgICAgICAgICAgIHZlcml0eV9tZXRhZGF0YV9wYXRoLCB2ZXJpdHlfZmVjX3BhdGgsCiAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmdfc2l6ZSwgZmVjX3N1cHBvcnRlZCk6CkBAIC0yNzQsNiArMzE0LDcgQEAKICAgICByZXR1cm4gRmFsc2UKICAgcmV0dXJuIFRydWUKIAorCiBkZWYgVW5zcGFyc2VJbWFnZShzcGFyc2VfaW1hZ2VfcGF0aCwgcmVwbGFjZT1UcnVlKToKICAgaW1nX2RpciA9IG9zLnBhdGguZGlybmFtZShzcGFyc2VfaW1hZ2VfcGF0aCkKICAgdW5zcGFyc2VfaW1hZ2VfcGF0aCA9ICJ1bnNwYXJzZV8iICsgb3MucGF0aC5iYXNlbmFtZShzcGFyc2VfaW1hZ2VfcGF0aCkKQEAgLTI4NCwxMiArMzI1LDE1IEBACiAgICAgZWxzZToKICAgICAgIHJldHVybiBUcnVlLCB1bnNwYXJzZV9pbWFnZV9wYXRoCiAgIGluZmxhdGVfY29tbWFuZCA9IFsic2ltZzJpbWciLCBzcGFyc2VfaW1hZ2VfcGF0aCwgdW5zcGFyc2VfaW1hZ2VfcGF0aF0KLSAgKF8sIGV4aXRfY29kZSkgPSBSdW5Db21tYW5kKGluZmxhdGVfY29tbWFuZCkKKyAgKGluZmxhdGVfb3V0cHV0LCBleGl0X2NvZGUpID0gUnVuQ29tbWFuZChpbmZsYXRlX2NvbW1hbmQpCiAgIGlmIGV4aXRfY29kZSAhPSAwOgorICAgIHByaW50KCJFcnJvcjogJyVzJyBmYWlsZWQgd2l0aCBleGl0IGNvZGUgJWQ6XG4lcyIgJSAoCisgICAgICAgIGluZmxhdGVfY29tbWFuZCwgZXhpdF9jb2RlLCBpbmZsYXRlX291dHB1dCkpCiAgICAgb3MucmVtb3ZlKHVuc3BhcnNlX2ltYWdlX3BhdGgpCiAgICAgcmV0dXJuIEZhbHNlLCBOb25lCiAgIHJldHVybiBUcnVlLCB1bnNwYXJzZV9pbWFnZV9wYXRoCiAKKwogZGVmIE1ha2VWZXJpdHlFbmFibGVkSW1hZ2Uob3V0X2ZpbGUsIGZlY19zdXBwb3J0ZWQsIHByb3BfZGljdCk6CiAgICIiIkNyZWF0ZXMgYW4gaW1hZ2UgdGhhdCBpcyB2ZXJpZmlhYmxlIHVzaW5nIGRtLXZlcml0eS4KIApAQCAtMzExLDcgKzM1NSw3IEBACiAgIHNpZ25lcl9hcmdzID0gT1BUSU9OUy52ZXJpdHlfc2lnbmVyX2FyZ3MKIAogICAjIG1ha2UgYSB0ZW1wZGlyCi0gIHRlbXBkaXJfbmFtZSA9IHRlbXBmaWxlLm1rZHRlbXAoc3VmZml4PSJfdmVyaXR5X2ltYWdlcyIpCisgIHRlbXBkaXJfbmFtZSA9IGNvbW1vbi5NYWtlVGVtcERpcihzdWZmaXg9Il92ZXJpdHlfaW1hZ2VzIikKIAogICAjIGdldCBwYXJ0aWFsIGltYWdlIHBhdGhzCiAgIHZlcml0eV9pbWFnZV9wYXRoID0gb3MucGF0aC5qb2luKHRlbXBkaXJfbmFtZSwgInZlcml0eS5pbWciKQpAQCAtMzIwLDE1ICszNjQsMTUgQEAKIAogICAjIGJ1aWxkIHRoZSB2ZXJpdHkgdHJlZSBhbmQgZ2V0IHRoZSByb290IGhhc2ggYW5kIHNhbHQKICAgaWYgbm90IEJ1aWxkVmVyaXR5VHJlZShvdXRfZmlsZSwgdmVyaXR5X2ltYWdlX3BhdGgsIHByb3BfZGljdCk6Ci0gICAgc2h1dGlsLnJtdHJlZSh0ZW1wZGlyX25hbWUsIGlnbm9yZV9lcnJvcnM9VHJ1ZSkKICAgICByZXR1cm4gRmFsc2UKIAogICAjIGJ1aWxkIHRoZSBtZXRhZGF0YSBibG9ja3MKICAgcm9vdF9oYXNoID0gcHJvcF9kaWN0WyJ2ZXJpdHlfcm9vdF9oYXNoIl0KICAgc2FsdCA9IHByb3BfZGljdFsidmVyaXR5X3NhbHQiXQorICB2ZXJpdHlfZGlzYWJsZSA9ICJ2ZXJpdHlfZGlzYWJsZSIgaW4gcHJvcF9kaWN0CiAgIGlmIG5vdCBCdWlsZFZlcml0eU1ldGFkYXRhKGltYWdlX3NpemUsIHZlcml0eV9tZXRhZGF0YV9wYXRoLCByb290X2hhc2gsIHNhbHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrX2Rldiwgc2lnbmVyX3BhdGgsIHNpZ25lcl9rZXksIHNpZ25lcl9hcmdzKToKLSAgICBzaHV0aWwucm10cmVlKHRlbXBkaXJfbmFtZSwgaWdub3JlX2Vycm9ycz1UcnVlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja19kZXYsIHNpZ25lcl9wYXRoLCBzaWduZXJfa2V5LCBzaWduZXJfYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyaXR5X2Rpc2FibGUpOgogICAgIHJldHVybiBGYWxzZQogCiAgICMgYnVpbGQgdGhlIGZ1bGwgdmVyaWZpZWQgaW1hZ2UKQEAgLTM0NCwyMyArMzg4LDU5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyaXR5X2ZlY19wYXRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmdfc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZWNfc3VwcG9ydGVkKToKLSAgICBzaHV0aWwucm10cmVlKHRlbXBkaXJfbmFtZSwgaWdub3JlX2Vycm9ycz1UcnVlKQogICAgIHJldHVybiBGYWxzZQogCi0gIHNodXRpbC5ybXRyZWUodGVtcGRpcl9uYW1lLCBpZ25vcmVfZXJyb3JzPVRydWUpCiAgIHJldHVybiBUcnVlCiAKLWRlZiBDb252ZXJ0QmxvY2tNYXBUb0Jhc2VGcyhibG9ja19tYXBfZmlsZSk6Ci0gIGZkLCBiYXNlX2ZzX2ZpbGUgPSB0ZW1wZmlsZS5ta3N0ZW1wKHByZWZpeD0ic2NyaXB0X2dlbl8iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWZmaXg9Ii5iYXNlX2ZzIikKLSAgb3MuY2xvc2UoZmQpCiAKK2RlZiBDb252ZXJ0QmxvY2tNYXBUb0Jhc2VGcyhibG9ja19tYXBfZmlsZSk6CisgIGJhc2VfZnNfZmlsZSA9IGNvbW1vbi5NYWtlVGVtcEZpbGUocHJlZml4PSJzY3JpcHRfZ2VuXyIsIHN1ZmZpeD0iLmJhc2VfZnMiKQogICBjb252ZXJ0X2NvbW1hbmQgPSBbImJsa19hbGxvY190b19iYXNlX2ZzIiwgYmxvY2tfbWFwX2ZpbGUsIGJhc2VfZnNfZmlsZV0KICAgKF8sIGV4aXRfY29kZSkgPSBSdW5Db21tYW5kKGNvbnZlcnRfY29tbWFuZCkKLSAgaWYgZXhpdF9jb2RlICE9IDA6Ci0gICAgb3MucmVtb3ZlKGJhc2VfZnNfZmlsZSkKLSAgICByZXR1cm4gTm9uZQotICByZXR1cm4gYmFzZV9mc19maWxlCisgIHJldHVybiBiYXNlX2ZzX2ZpbGUgaWYgZXhpdF9jb2RlID09IDAgZWxzZSBOb25lCisKKworZGVmIENoZWNrSGVhZHJvb20oZXh0NGZzX291dHB1dCwgcHJvcF9kaWN0KToKKyAgIiIiQ2hlY2tzIGlmIHRoZXJlJ3MgZW5vdWdoIGhlYWRyb29tIHNwYWNlIGF2YWlsYWJsZS4KKworICBIZWFkcm9vbSBpcyB0aGUgcmVzZXJ2ZWQgc3BhY2Ugb24gc3lzdGVtIGltYWdlICh2aWEgUFJPRFVDVF9TWVNURU1fSEVBRFJPT00pLAorICB3aGljaCBpcyB1c2VmdWwgZm9yIGRldmljZXMgd2l0aCBsb3cgZGlzayBzcGFjZSB0aGF0IGhhdmUgc3lzdGVtIGltYWdlCisgIHZhcmlhdGlvbiBiZXR3ZWVuIGJ1aWxkcy4gVGhlICdwYXJ0aXRpb25faGVhZHJvb20nIGluIHByb3BfZGljdCBpcyB0aGUgc2l6ZQorICBpbiBieXRlcywgd2hpbGUgdGhlIG51bWJlcnMgaW4gJ2V4dDRmc19vdXRwdXQnIGFyZSBmb3IgNEstYmxvY2tzLgorCisgIEFyZ3M6CisgICAgZXh0NGZzX291dHB1dDogVGhlIG91dHB1dCBzdHJpbmcgZnJvbSBta2UyZnMgY29tbWFuZC4KKyAgICBwcm9wX2RpY3Q6IFRoZSBwcm9wZXJ0eSBkaWN0LgorCisgIFJldHVybnM6CisgICAgVGhlIGNoZWNrIHJlc3VsdC4KKworICBSYWlzZXM6CisgICAgQXNzZXJ0aW9uRXJyb3I6IE9uIGludmFsaWQgaW5wdXQuCisgICIiIgorICBhc3NlcnQgZXh0NGZzX291dHB1dCBpcyBub3QgTm9uZQorICBhc3NlcnQgcHJvcF9kaWN0LmdldCgnZnNfdHlwZScsICcnKS5zdGFydHN3aXRoKCdleHQ0JykKKyAgYXNzZXJ0ICdwYXJ0aXRpb25faGVhZHJvb20nIGluIHByb3BfZGljdAorICBhc3NlcnQgJ21vdW50X3BvaW50JyBpbiBwcm9wX2RpY3QKKworICBleHQ0ZnNfc3RhdHMgPSByZS5jb21waWxlKAorICAgICAgcidDcmVhdGVkIGZpbGVzeXN0ZW0gd2l0aCAuKiAoP1A8dXNlZF9ibG9ja3M+WzAtOV0rKS8nCisgICAgICByJyg/UDx0b3RhbF9ibG9ja3M+WzAtOV0rKSBibG9ja3MnKQorICBsYXN0X2xpbmUgPSBleHQ0ZnNfb3V0cHV0LnN0cmlwKCkuc3BsaXQoJ1xuJylbLTFdCisgIG0gPSBleHQ0ZnNfc3RhdHMubWF0Y2gobGFzdF9saW5lKQorICB1c2VkX2Jsb2NrcyA9IGludChtLmdyb3VwZGljdCgpLmdldCgndXNlZF9ibG9ja3MnKSkKKyAgdG90YWxfYmxvY2tzID0gaW50KG0uZ3JvdXBkaWN0KCkuZ2V0KCd0b3RhbF9ibG9ja3MnKSkKKyAgaGVhZHJvb21fYmxvY2tzID0gaW50KHByb3BfZGljdFsncGFydGl0aW9uX2hlYWRyb29tJ10pIC8gQkxPQ0tfU0laRQorICBhZGp1c3RlZF9ibG9ja3MgPSB0b3RhbF9ibG9ja3MgLSBoZWFkcm9vbV9ibG9ja3MKKyAgaWYgdXNlZF9ibG9ja3MgPiBhZGp1c3RlZF9ibG9ja3M6CisgICAgbW91bnRfcG9pbnQgPSBwcm9wX2RpY3RbIm1vdW50X3BvaW50Il0KKyAgICBwcmludCgiRXJyb3I6IE5vdCBlbm91Z2ggcm9vbSBvbiAlcyAodG90YWw6ICVkIGJsb2NrcywgdXNlZDogJWQgYmxvY2tzLCAiCisgICAgICAgICAgImhlYWRyb29tOiAlZCBibG9ja3MsIGF2YWlsYWJsZTogJWQgYmxvY2tzKSIgJSAoCisgICAgICAgICAgICAgIG1vdW50X3BvaW50LCB0b3RhbF9ibG9ja3MsIHVzZWRfYmxvY2tzLCBoZWFkcm9vbV9ibG9ja3MsCisgICAgICAgICAgICAgIGFkanVzdGVkX2Jsb2NrcykpCisgICAgcmV0dXJuIEZhbHNlCisgIHJldHVybiBUcnVlCisKIAogZGVmIEJ1aWxkSW1hZ2UoaW5fZGlyLCBwcm9wX2RpY3QsIG91dF9maWxlLCB0YXJnZXRfb3V0PU5vbmUpOgogICAiIiJCdWlsZCBhbiBpbWFnZSB0byBvdXRfZmlsZSBmcm9tIGluX2RpciB3aXRoIHByb3BlcnR5IHByb3BfZGljdC4KQEAgLTM2OSw3ICs0NDksOCBAQAogICAgIGluX2RpcjogcGF0aCBvZiBpbnB1dCBkaXJlY3RvcnkuCiAgICAgcHJvcF9kaWN0OiBwcm9wZXJ0eSBkaWN0aW9uYXJ5LgogICAgIG91dF9maWxlOiBwYXRoIG9mIHRoZSBvdXRwdXQgaW1hZ2UgZmlsZS4KLSAgICB0YXJnZXRfb3V0OiBwYXRoIG9mIHRoZSBwcm9kdWN0IG91dCBkaXJlY3RvcnkgdG8gcmVhZCBkZXZpY2Ugc3BlY2lmaWMgRlMgY29uZmlnIGZpbGVzLgorICAgIHRhcmdldF9vdXQ6IHBhdGggb2YgdGhlIHByb2R1Y3Qgb3V0IGRpcmVjdG9yeSB0byByZWFkIGRldmljZSBzcGVjaWZpYyBGUworICAgICAgICBjb25maWcgZmlsZXMuCiAKICAgUmV0dXJuczoKICAgICBUcnVlIGlmZiB0aGUgaW1hZ2UgaXMgYnVpbHQgc3VjY2Vzc2Z1bGx5LgpAQCAtMzc4LDE3ICs0NTksMTUgQEAKICAgIyAvc3lzdGVtIGFuZCB0aGUgcmFtZGlzaywgYW5kIGNhbiBiZSBtb3VudGVkIGF0IHRoZSByb290IG9mIHRoZSBmaWxlIHN5c3RlbS4KICAgb3JpZ2luX2luID0gaW5fZGlyCiAgIGZzX2NvbmZpZyA9IHByb3BfZGljdC5nZXQoImZzX2NvbmZpZyIpCi0gIGJhc2VfZnNfZmlsZSA9IE5vbmUKLSAgaWYgKHByb3BfZGljdC5nZXQoInN5c3RlbV9yb290X2ltYWdlIikgPT0gInRydWUiCi0gICAgICBhbmQgcHJvcF9kaWN0WyJtb3VudF9wb2ludCJdID09ICJzeXN0ZW0iKToKLSAgICBpbl9kaXIgPSB0ZW1wZmlsZS5ta2R0ZW1wKCkKLSAgICAjIENoYW5nZSB0aGUgbW91bnQgcG9pbnQgdG8gIi8iCisgIGlmIChwcm9wX2RpY3QuZ2V0KCJzeXN0ZW1fcm9vdF9pbWFnZSIpID09ICJ0cnVlIiBhbmQKKyAgICAgIHByb3BfZGljdFsibW91bnRfcG9pbnQiXSA9PSAic3lzdGVtIik6CisgICAgaW5fZGlyID0gY29tbW9uLk1ha2VUZW1wRGlyKCkKKyAgICAjIENoYW5nZSB0aGUgbW91bnQgcG9pbnQgdG8gIi8iLgogICAgIHByb3BfZGljdFsibW91bnRfcG9pbnQiXSA9ICIvIgogICAgIGlmIGZzX2NvbmZpZzoKICAgICAgICMgV2UgbmVlZCB0byBtZXJnZSB0aGUgZnNfY29uZmlnIGZpbGVzIG9mIHN5c3RlbSBhbmQgcmFtZGlzay4KLSAgICAgIGZkLCBtZXJnZWRfZnNfY29uZmlnID0gdGVtcGZpbGUubWtzdGVtcChwcmVmaXg9InJvb3RfZnNfY29uZmlnIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWZmaXg9Ii50eHQiKQotICAgICAgb3MuY2xvc2UoZmQpCisgICAgICBtZXJnZWRfZnNfY29uZmlnID0gY29tbW9uLk1ha2VUZW1wRmlsZShwcmVmaXg9InJvb3RfZnNfY29uZmlnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1ZmZpeD0iLnR4dCIpCiAgICAgICB3aXRoIG9wZW4obWVyZ2VkX2ZzX2NvbmZpZywgInciKSBhcyBmdzoKICAgICAgICAgaWYgInJhbWRpc2tfZnNfY29uZmlnIiBpbiBwcm9wX2RpY3Q6CiAgICAgICAgICAgd2l0aCBvcGVuKHByb3BfZGljdFsicmFtZGlza19mc19jb25maWciXSkgYXMgZnI6CkBAIC0zOTksNyArNDc4LDcgQEAKIAogICBidWlsZF9jb21tYW5kID0gW10KICAgZnNfdHlwZSA9IHByb3BfZGljdC5nZXQoImZzX3R5cGUiLCAiIikKLSAgcnVuX2ZzY2sgPSBGYWxzZQorICBydW5fZTJmc2NrID0gRmFsc2UKIAogICBmc19zcGFuc19wYXJ0aXRpb24gPSBUcnVlCiAgIGlmIGZzX3R5cGUuc3RhcnRzd2l0aCgic3F1YXNoIik6CkBAIC00MTMsOCArNDkyLDggQEAKICAgIyB2ZXJpZmllZC4KICAgaWYgdmVyaXR5X3N1cHBvcnRlZCBhbmQgaXNfdmVyaXR5X3BhcnRpdGlvbjoKICAgICBwYXJ0aXRpb25fc2l6ZSA9IGludChwcm9wX2RpY3QuZ2V0KCJwYXJ0aXRpb25fc2l6ZSIpKQotICAgIChhZGp1c3RlZF9zaXplLCB2ZXJpdHlfc2l6ZSkgPSBBZGp1c3RQYXJ0aXRpb25TaXplRm9yVmVyaXR5KHBhcnRpdGlvbl9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcml0eV9mZWNfc3VwcG9ydGVkKQorICAgIChhZGp1c3RlZF9zaXplLCB2ZXJpdHlfc2l6ZSkgPSBBZGp1c3RQYXJ0aXRpb25TaXplRm9yVmVyaXR5KAorICAgICAgICBwYXJ0aXRpb25fc2l6ZSwgdmVyaXR5X2ZlY19zdXBwb3J0ZWQpCiAgICAgaWYgbm90IGFkanVzdGVkX3NpemU6CiAgICAgICByZXR1cm4gRmFsc2UKICAgICBwcm9wX2RpY3RbInBhcnRpdGlvbl9zaXplIl0gPSBzdHIoYWRqdXN0ZWRfc2l6ZSkKQEAgLTQzMyw4ICs1MTIsOCBAQAogICAgIHBhcnRpdGlvbl9zaXplID0gcHJvcF9kaWN0WyJwYXJ0aXRpb25fc2l6ZSJdCiAgICAgIyBhdmJfYWRkX2hhc2hfZm9vdGVyX2FyZ3Mgb3IgYXZiX2FkZF9oYXNodHJlZV9mb290ZXJfYXJncy4KICAgICBhZGRpdGlvbmFsX2FyZ3MgPSBwcm9wX2RpY3RbImF2Yl9hZGRfIiArIGF2Yl9mb290ZXJfdHlwZSArICJfZm9vdGVyX2FyZ3MiXQotICAgIG1heF9pbWFnZV9zaXplID0gQVZCQ2FsY01heEltYWdlU2l6ZShhdmJ0b29sLCBhdmJfZm9vdGVyX3R5cGUsIHBhcnRpdGlvbl9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRpdGlvbmFsX2FyZ3MpCisgICAgbWF4X2ltYWdlX3NpemUgPSBBVkJDYWxjTWF4SW1hZ2VTaXplKGF2YnRvb2wsIGF2Yl9mb290ZXJfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydGl0aW9uX3NpemUsIGFkZGl0aW9uYWxfYXJncykKICAgICBpZiBtYXhfaW1hZ2Vfc2l6ZSA9PSAwOgogICAgICAgcmV0dXJuIEZhbHNlCiAgICAgcHJvcF9kaWN0WyJwYXJ0aXRpb25fc2l6ZSJdID0gc3RyKG1heF9pbWFnZV9zaXplKQpAQCAtNDQ0LDcgKzUyMyw3IEBACiAgICAgYnVpbGRfY29tbWFuZCA9IFtwcm9wX2RpY3RbImV4dF9ta3VzZXJpbWciXV0KICAgICBpZiAiZXh0ZnNfc3BhcnNlX2ZsYWciIGluIHByb3BfZGljdDoKICAgICAgIGJ1aWxkX2NvbW1hbmQuYXBwZW5kKHByb3BfZGljdFsiZXh0ZnNfc3BhcnNlX2ZsYWciXSkKLSAgICAgIHJ1bl9mc2NrID0gVHJ1ZQorICAgICAgcnVuX2UyZnNjayA9IFRydWUKICAgICBidWlsZF9jb21tYW5kLmV4dGVuZChbaW5fZGlyLCBvdXRfZmlsZSwgZnNfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcF9kaWN0WyJtb3VudF9wb2ludCJdXSkKICAgICBidWlsZF9jb21tYW5kLmFwcGVuZChwcm9wX2RpY3RbInBhcnRpdGlvbl9zaXplIl0pCkBAIC00NjYsNiArNTQ1LDggQEAKICAgICBidWlsZF9jb21tYW5kLmV4dGVuZChbIi1MIiwgcHJvcF9kaWN0WyJtb3VudF9wb2ludCJdXSkKICAgICBpZiAiZXh0ZnNfaW5vZGVfY291bnQiIGluIHByb3BfZGljdDoKICAgICAgIGJ1aWxkX2NvbW1hbmQuZXh0ZW5kKFsiLWkiLCBwcm9wX2RpY3RbImV4dGZzX2lub2RlX2NvdW50Il1dKQorICAgIGlmICJleHRmc19yc3ZfcGN0IiBpbiBwcm9wX2RpY3Q6CisgICAgICBidWlsZF9jb21tYW5kLmV4dGVuZChbIi1NIiwgcHJvcF9kaWN0WyJleHRmc19yc3ZfcGN0Il1dKQogICAgIGlmICJmbGFzaF9lcmFzZV9ibG9ja19zaXplIiBpbiBwcm9wX2RpY3Q6CiAgICAgICBidWlsZF9jb21tYW5kLmV4dGVuZChbIi1lIiwgcHJvcF9kaWN0WyJmbGFzaF9lcmFzZV9ibG9ja19zaXplIl1dKQogICAgIGlmICJmbGFzaF9sb2dpY2FsX2Jsb2NrX3NpemUiIGluIHByb3BfZGljdDoKQEAgLTQ3Niw2ICs1NTcsOCBAQAogICAgICAgICBidWlsZF9jb21tYW5kLmV4dGVuZChbIi1VIiwgcHJvcF9kaWN0WyJ1dWlkIl1dKQogICAgICAgaWYgImhhc2hfc2VlZCIgaW4gcHJvcF9kaWN0OgogICAgICAgICBidWlsZF9jb21tYW5kLmV4dGVuZChbIi1TIiwgcHJvcF9kaWN0WyJoYXNoX3NlZWQiXV0pCisgICAgaWYgImV4dDRfc2hhcmVfZHVwX2Jsb2NrcyIgaW4gcHJvcF9kaWN0OgorICAgICAgYnVpbGRfY29tbWFuZC5hcHBlbmQoIi1jIikKICAgICBpZiAic2VsaW51eF9mYyIgaW4gcHJvcF9kaWN0OgogICAgICAgYnVpbGRfY29tbWFuZC5hcHBlbmQocHJvcF9kaWN0WyJzZWxpbnV4X2ZjIl0pCiAgIGVsaWYgZnNfdHlwZS5zdGFydHN3aXRoKCJzcXVhc2giKToKQEAgLTQ5MiwxNyArNTc1LDI4IEBACiAgICAgICBidWlsZF9jb21tYW5kLmV4dGVuZChbIi1jIiwgcHJvcF9kaWN0WyJzZWxpbnV4X2ZjIl1dKQogICAgIGlmICJibG9ja19saXN0IiBpbiBwcm9wX2RpY3Q6CiAgICAgICBidWlsZF9jb21tYW5kLmV4dGVuZChbIi1CIiwgcHJvcF9kaWN0WyJibG9ja19saXN0Il1dKQorICAgIGlmICJzcXVhc2hmc19ibG9ja19zaXplIiBpbiBwcm9wX2RpY3Q6CisgICAgICBidWlsZF9jb21tYW5kLmV4dGVuZChbIi1iIiwgcHJvcF9kaWN0WyJzcXVhc2hmc19ibG9ja19zaXplIl1dKQogICAgIGlmICJzcXVhc2hmc19jb21wcmVzc29yIiBpbiBwcm9wX2RpY3Q6CiAgICAgICBidWlsZF9jb21tYW5kLmV4dGVuZChbIi16IiwgcHJvcF9kaWN0WyJzcXVhc2hmc19jb21wcmVzc29yIl1dKQogICAgIGlmICJzcXVhc2hmc19jb21wcmVzc29yX29wdCIgaW4gcHJvcF9kaWN0OgogICAgICAgYnVpbGRfY29tbWFuZC5leHRlbmQoWyItem8iLCBwcm9wX2RpY3RbInNxdWFzaGZzX2NvbXByZXNzb3Jfb3B0Il1dKQotICAgIGlmICJzcXVhc2hmc19ibG9ja19zaXplIiBpbiBwcm9wX2RpY3Q6Ci0gICAgICBidWlsZF9jb21tYW5kLmV4dGVuZChbIi1iIiwgcHJvcF9kaWN0WyJzcXVhc2hmc19ibG9ja19zaXplIl1dKQotICAgIGlmICJzcXVhc2hmc19kaXNhYmxlXzRrX2FsaWduIiBpbiBwcm9wX2RpY3QgYW5kIHByb3BfZGljdC5nZXQoInNxdWFzaGZzX2Rpc2FibGVfNGtfYWxpZ24iKSA9PSAidHJ1ZSI6CisgICAgaWYgcHJvcF9kaWN0LmdldCgic3F1YXNoZnNfZGlzYWJsZV80a19hbGlnbiIpID09ICJ0cnVlIjoKICAgICAgIGJ1aWxkX2NvbW1hbmQuZXh0ZW5kKFsiLWEiXSkKICAgZWxpZiBmc190eXBlLnN0YXJ0c3dpdGgoImYyZnMiKToKICAgICBidWlsZF9jb21tYW5kID0gWyJta2YyZnN1c2VyaW1nLnNoIl0KICAgICBidWlsZF9jb21tYW5kLmV4dGVuZChbb3V0X2ZpbGUsIHByb3BfZGljdFsicGFydGl0aW9uX3NpemUiXV0pCisgICAgaWYgZnNfY29uZmlnOgorICAgICAgYnVpbGRfY29tbWFuZC5leHRlbmQoWyItQyIsIGZzX2NvbmZpZ10pCisgICAgYnVpbGRfY29tbWFuZC5leHRlbmQoWyItZiIsIGluX2Rpcl0pCisgICAgaWYgdGFyZ2V0X291dDoKKyAgICAgIGJ1aWxkX2NvbW1hbmQuZXh0ZW5kKFsiLUQiLCB0YXJnZXRfb3V0XSkKKyAgICBpZiAic2VsaW51eF9mYyIgaW4gcHJvcF9kaWN0OgorICAgICAgYnVpbGRfY29tbWFuZC5leHRlbmQoWyItcyIsIHByb3BfZGljdFsic2VsaW51eF9mYyJdXSkKKyAgICBidWlsZF9jb21tYW5kLmV4dGVuZChbIi10IiwgcHJvcF9kaWN0WyJtb3VudF9wb2ludCJdXSkKKyAgICBpZiAidGltZXN0YW1wIiBpbiBwcm9wX2RpY3Q6CisgICAgICBidWlsZF9jb21tYW5kLmV4dGVuZChbIi1UIiwgc3RyKHByb3BfZGljdFsidGltZXN0YW1wIl0pXSkKKyAgICBidWlsZF9jb21tYW5kLmV4dGVuZChbIi1MIiwgcHJvcF9kaWN0WyJtb3VudF9wb2ludCJdXSkKICAgZWxzZToKICAgICBwcmludCgiRXJyb3I6IHVua25vd24gZmlsZXN5c3RlbSB0eXBlICclcyciICUgKGZzX3R5cGUpKQogICAgIHJldHVybiBGYWxzZQpAQCAtNTE3LDU2ICs2MTEsMTUgQEAKICAgICBzaHV0aWwucm10cmVlKHN0YWdpbmdfc3lzdGVtLCBpZ25vcmVfZXJyb3JzPVRydWUpCiAgICAgc2h1dGlsLmNvcHl0cmVlKG9yaWdpbl9pbiwgc3RhZ2luZ19zeXN0ZW0sIHN5bWxpbmtzPVRydWUpCiAKLSAgaGFzX3Jlc2VydmVkX2Jsb2NrcyA9IHByb3BfZGljdC5nZXQoImhhc19leHQ0X3Jlc2VydmVkX2Jsb2NrcyIpID09ICJ0cnVlIgotICBleHQ0ZnNfb3V0cHV0ID0gTm9uZQotCi0gIHRyeToKLSAgICBpZiBmc190eXBlLnN0YXJ0c3dpdGgoImV4dDQiKToKLSAgICAgIChleHQ0ZnNfb3V0cHV0LCBleGl0X2NvZGUpID0gUnVuQ29tbWFuZChidWlsZF9jb21tYW5kKQotICAgIGVsc2U6Ci0gICAgICAoXywgZXhpdF9jb2RlKSA9IFJ1bkNvbW1hbmQoYnVpbGRfY29tbWFuZCkKLSAgZmluYWxseToKLSAgICBpZiBpbl9kaXIgIT0gb3JpZ2luX2luOgotICAgICAgIyBDbGVhbiB1cCB0ZW1wb3JhcnkgZGlyZWN0b3JpZXMgYW5kIGZpbGVzLgotICAgICAgc2h1dGlsLnJtdHJlZShpbl9kaXIsIGlnbm9yZV9lcnJvcnM9VHJ1ZSkKLSAgICAgIGlmIGZzX2NvbmZpZzoKLSAgICAgICAgb3MucmVtb3ZlKGZzX2NvbmZpZykKLSAgICBpZiBiYXNlX2ZzX2ZpbGUgaXMgbm90IE5vbmU6Ci0gICAgICBvcy5yZW1vdmUoYmFzZV9mc19maWxlKQorICAobWtmc19vdXRwdXQsIGV4aXRfY29kZSkgPSBSdW5Db21tYW5kKGJ1aWxkX2NvbW1hbmQpCiAgIGlmIGV4aXRfY29kZSAhPSAwOgorICAgIHByaW50KCJFcnJvcjogJyVzJyBmYWlsZWQgd2l0aCBleGl0IGNvZGUgJWQ6XG4lcyIgJSAoCisgICAgICAgIGJ1aWxkX2NvbW1hbmQsIGV4aXRfY29kZSwgbWtmc19vdXRwdXQpKQogICAgIHJldHVybiBGYWxzZQogCi0gICMgQnVnOiAyMTUyMjcxOSwgMjIwMjM0NjUKLSAgIyBUaGVyZSBhcmUgc29tZSByZXNlcnZlZCBibG9ja3Mgb24gZXh0NCBGUyAobGVzc2VyIG9mIDQwOTYgYmxvY2tzIGFuZCAyJSkuCi0gICMgV2UgbmVlZCB0byBkZWR1Y3QgdGhvc2UgYmxvY2tzIGZyb20gdGhlIGF2YWlsYWJsZSBzcGFjZSwgc2luY2UgdGhleSBhcmUKLSAgIyBub3Qgd3JpdGFibGUgZXZlbiB3aXRoIHJvb3QgcHJpdmlsZWdlLiBJdCBvbmx5IGFmZmVjdHMgZGV2aWNlcyB1c2luZwotICAjIGZpbGUtYmFzZWQgT1RBIGFuZCBhIGtlcm5lbCB2ZXJzaW9uIG9mIDMuMTAgb3IgZ3JlYXRlciAoY3VycmVudGx5IGp1c3QKLSAgIyBzcHJvdXQpLgotICAjIFNlcGFyYXRlbHksIGNoZWNrIGlmIHRoZXJlJ3MgZW5vdWdoIGhlYWRyb29tIHNwYWNlIGF2YWlsYWJsZS4gVGhpcyBpcyB1c2VmdWwgZm9yCi0gICMgZGV2aWNlcyB3aXRoIGxvdyBkaXNrIHNwYWNlIHRoYXQgaGF2ZSBzeXN0ZW0gaW1hZ2UgdmFyaWF0aW9uIGJldHdlZW4gYnVpbGRzLgotICBpZiAoaGFzX3Jlc2VydmVkX2Jsb2NrcyBvciAicGFydGl0aW9uX2hlYWRyb29tIiBpbiBwcm9wX2RpY3QpIGFuZCBmc190eXBlLnN0YXJ0c3dpdGgoImV4dDQiKToKLSAgICBhc3NlcnQgZXh0NGZzX291dHB1dCBpcyBub3QgTm9uZQotICAgIGV4dDRmc19zdGF0cyA9IHJlLmNvbXBpbGUoCi0gICAgICAgIHInQ3JlYXRlZCBmaWxlc3lzdGVtIHdpdGggLiogKD9QPHVzZWRfYmxvY2tzPlswLTldKykvJwotICAgICAgICByJyg/UDx0b3RhbF9ibG9ja3M+WzAtOV0rKSBibG9ja3MnKQotICAgIG0gPSBleHQ0ZnNfc3RhdHMubWF0Y2goZXh0NGZzX291dHB1dC5zdHJpcCgpLnNwbGl0KCdcbicpWy0xXSkKLSAgICB1c2VkX2Jsb2NrcyA9IGludChtLmdyb3VwZGljdCgpLmdldCgndXNlZF9ibG9ja3MnKSkKLSAgICB0b3RhbF9ibG9ja3MgPSBpbnQobS5ncm91cGRpY3QoKS5nZXQoJ3RvdGFsX2Jsb2NrcycpKQotICAgIHJlc2VydmVkX2Jsb2NrcyA9IDAKLSAgICBoZWFkcm9vbV9ibG9ja3MgPSAwCi0gICAgYWRqdXN0ZWRfYmxvY2tzID0gdG90YWxfYmxvY2tzCi0gICAgaWYgaGFzX3Jlc2VydmVkX2Jsb2NrczoKLSAgICAgIHJlc2VydmVkX2Jsb2NrcyA9IG1pbig0MDk2LCBpbnQodG90YWxfYmxvY2tzICogMC4wMikpCi0gICAgICBhZGp1c3RlZF9ibG9ja3MgLT0gcmVzZXJ2ZWRfYmxvY2tzCi0gICAgaWYgInBhcnRpdGlvbl9oZWFkcm9vbSIgaW4gcHJvcF9kaWN0OgotICAgICAgaGVhZHJvb21fYmxvY2tzID0gaW50KHByb3BfZGljdC5nZXQoJ3BhcnRpdGlvbl9oZWFkcm9vbScpKSAvIEJMT0NLX1NJWkUKLSAgICAgIGFkanVzdGVkX2Jsb2NrcyAtPSBoZWFkcm9vbV9ibG9ja3MKLSAgICBpZiB1c2VkX2Jsb2NrcyA+IGFkanVzdGVkX2Jsb2NrczoKLSAgICAgIG1vdW50X3BvaW50ID0gcHJvcF9kaWN0LmdldCgibW91bnRfcG9pbnQiKQotICAgICAgcHJpbnQoIkVycm9yOiBOb3QgZW5vdWdoIHJvb20gb24gJXMgKHRvdGFsOiAlZCBibG9ja3MsIHVzZWQ6ICVkIGJsb2NrcywgIgotICAgICAgICAgICAgInJlc2VydmVkOiAlZCBibG9ja3MsIGhlYWRyb29tOiAlZCBibG9ja3MsIGF2YWlsYWJsZTogJWQgYmxvY2tzKSIgJSAoCi0gICAgICAgICAgICAgICAgbW91bnRfcG9pbnQsIHRvdGFsX2Jsb2NrcywgdXNlZF9ibG9ja3MsIHJlc2VydmVkX2Jsb2NrcywKLSAgICAgICAgICAgICAgICBoZWFkcm9vbV9ibG9ja3MsIGFkanVzdGVkX2Jsb2NrcykpCisgICMgQ2hlY2sgaWYgdGhlcmUncyBlbm91Z2ggaGVhZHJvb20gc3BhY2UgYXZhaWxhYmxlIGZvciBleHQ0IGltYWdlLgorICBpZiAicGFydGl0aW9uX2hlYWRyb29tIiBpbiBwcm9wX2RpY3QgYW5kIGZzX3R5cGUuc3RhcnRzd2l0aCgiZXh0NCIpOgorICAgIGlmIG5vdCBDaGVja0hlYWRyb29tKG1rZnNfb3V0cHV0LCBwcm9wX2RpY3QpOgogICAgICAgcmV0dXJuIEZhbHNlCiAKICAgaWYgbm90IGZzX3NwYW5zX3BhcnRpdGlvbjoKQEAgLTU4MCw3ICs2MzMsNyBAQAogICAgIGlmIHZlcml0eV9zdXBwb3J0ZWQgYW5kIGlzX3Zlcml0eV9wYXJ0aXRpb246CiAgICAgICBaZXJvUGFkU2ltZyhvdXRfZmlsZSwgcGFydGl0aW9uX3NpemUgLSBpbWFnZV9zaXplKQogCi0gICMgY3JlYXRlIHRoZSB2ZXJpZmllZCBpbWFnZSBpZiB0aGlzIGlzIHRvIGJlIHZlcmlmaWVkCisgICMgQ3JlYXRlIHRoZSB2ZXJpZmllZCBpbWFnZSBpZiB0aGlzIGlzIHRvIGJlIHZlcmlmaWVkLgogICBpZiB2ZXJpdHlfc3VwcG9ydGVkIGFuZCBpc192ZXJpdHlfcGFydGl0aW9uOgogICAgIGlmIG5vdCBNYWtlVmVyaXR5RW5hYmxlZEltYWdlKG91dF9maWxlLCB2ZXJpdHlfZmVjX3N1cHBvcnRlZCwgcHJvcF9kaWN0KToKICAgICAgIHJldHVybiBGYWxzZQpAQCAtNTk2LDIyICs2NDksMjggQEAKICAgICBzYWx0ID0gcHJvcF9kaWN0LmdldCgiYXZiX3NhbHQiKQogICAgICMgYXZiX2FkZF9oYXNoX2Zvb3Rlcl9hcmdzIG9yIGF2Yl9hZGRfaGFzaHRyZWVfZm9vdGVyX2FyZ3MKICAgICBhZGRpdGlvbmFsX2FyZ3MgPSBwcm9wX2RpY3RbImF2Yl9hZGRfIiArIGF2Yl9mb290ZXJfdHlwZSArICJfZm9vdGVyX2FyZ3MiXQotICAgIGlmIG5vdCBBVkJBZGRGb290ZXIob3V0X2ZpbGUsIGF2YnRvb2wsIGF2Yl9mb290ZXJfdHlwZSwgb3JpZ2luYWxfcGFydGl0aW9uX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICBwYXJ0aXRpb25fbmFtZSwga2V5X3BhdGgsIGFsZ29yaXRobSwgc2FsdCwgYWRkaXRpb25hbF9hcmdzKToKKyAgICBpZiBub3QgQVZCQWRkRm9vdGVyKG91dF9maWxlLCBhdmJ0b29sLCBhdmJfZm9vdGVyX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbF9wYXJ0aXRpb25fc2l6ZSwgcGFydGl0aW9uX25hbWUsIGtleV9wYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgYWxnb3JpdGhtLCBzYWx0LCBhZGRpdGlvbmFsX2FyZ3MpOgogICAgICAgcmV0dXJuIEZhbHNlCiAKLSAgaWYgcnVuX2ZzY2sgYW5kIHByb3BfZGljdC5nZXQoInNraXBfZnNjayIpICE9ICJ0cnVlIjoKKyAgaWYgcnVuX2UyZnNjayBhbmQgcHJvcF9kaWN0LmdldCgic2tpcF9mc2NrIikgIT0gInRydWUiOgogICAgIHN1Y2Nlc3MsIHVuc3BhcnNlX2ltYWdlID0gVW5zcGFyc2VJbWFnZShvdXRfZmlsZSwgcmVwbGFjZT1GYWxzZSkKICAgICBpZiBub3Qgc3VjY2VzczoKICAgICAgIHJldHVybiBGYWxzZQogCiAgICAgIyBSdW4gZTJmc2NrIG9uIHRoZSBpbmZsYXRlZCBpbWFnZSBmaWxlCiAgICAgZTJmc2NrX2NvbW1hbmQgPSBbImUyZnNjayIsICItZiIsICItbiIsIHVuc3BhcnNlX2ltYWdlXQotICAgIChfLCBleGl0X2NvZGUpID0gUnVuQ29tbWFuZChlMmZzY2tfY29tbWFuZCkKKyAgICAoZTJmc2NrX291dHB1dCwgZXhpdF9jb2RlKSA9IFJ1bkNvbW1hbmQoZTJmc2NrX2NvbW1hbmQpCiAKICAgICBvcy5yZW1vdmUodW5zcGFyc2VfaW1hZ2UpCiAKLSAgcmV0dXJuIGV4aXRfY29kZSA9PSAwCisgICAgaWYgZXhpdF9jb2RlICE9IDA6CisgICAgICBwcmludCgiRXJyb3I6ICclcycgZmFpbGVkIHdpdGggZXhpdCBjb2RlICVkOlxuJXMiICUgKAorICAgICAgICAgIGUyZnNja19jb21tYW5kLCBleGl0X2NvZGUsIGUyZnNja19vdXRwdXQpKQorICAgICAgcmV0dXJuIEZhbHNlCisKKyAgcmV0dXJuIFRydWUKIAogCiBkZWYgSW1hZ2VQcm9wRnJvbUdsb2JhbERpY3QoZ2xvYl9kaWN0LCBtb3VudF9wb2ludCk6CkBAIC02MjksOCArNjg4LDE4IEBACiAgICAgICBkWyJ0aW1lc3RhbXAiXSA9IGJwWyJyby5idWlsZC5kYXRlLnV0YyJdCiAKICAgZGVmIGNvcHlfcHJvcChzcmNfcCwgZGVzdF9wKToKKyAgICAiIiJDb3B5IGEgcHJvcGVydHkgZnJvbSB0aGUgZ2xvYmFsIGRpY3Rpb25hcnkuCisKKyAgICBBcmdzOgorICAgICAgc3JjX3A6IFRoZSBzb3VyY2UgcHJvcGVydHkgaW4gdGhlIGdsb2JhbCBkaWN0aW9uYXJ5LgorICAgICAgZGVzdF9wOiBUaGUgZGVzdGluYXRpb24gcHJvcGVydHkuCisgICAgUmV0dXJuczoKKyAgICAgIFRydWUgaWYgcHJvcGVydHkgd2FzIGZvdW5kIGFuZCBjb3BpZWQsIEZhbHNlIG90aGVyd2lzZS4KKyAgICAiIiIKICAgICBpZiBzcmNfcCBpbiBnbG9iX2RpY3Q6CiAgICAgICBkW2Rlc3RfcF0gPSBzdHIoZ2xvYl9kaWN0W3NyY19wXSkKKyAgICAgIHJldHVybiBUcnVlCisgICAgcmV0dXJuIEZhbHNlCiAKICAgY29tbW9uX3Byb3BzID0gKAogICAgICAgImV4dGZzX3NwYXJzZV9mbGFnIiwKQEAgLTY0Miw2ICs3MTEsNyBAQAogICAgICAgInZlcml0eV9rZXkiLAogICAgICAgInZlcml0eV9zaWduZXJfY21kIiwKICAgICAgICJ2ZXJpdHlfZmVjIiwKKyAgICAgICJ2ZXJpdHlfZGlzYWJsZSIsCiAgICAgICAiYXZiX2VuYWJsZSIsCiAgICAgICAiYXZiX2F2YnRvb2wiLAogICAgICAgImF2Yl9zYWx0IiwKQEAgLTY2MiwyMCArNzMyLDI0IEBACiAgICAgY29weV9wcm9wKCJzeXN0ZW1fZnNfdHlwZSIsICJmc190eXBlIikKICAgICBjb3B5X3Byb3AoInN5c3RlbV9oZWFkcm9vbSIsICJwYXJ0aXRpb25faGVhZHJvb20iKQogICAgIGNvcHlfcHJvcCgic3lzdGVtX3NpemUiLCAicGFydGl0aW9uX3NpemUiKQotICAgIGNvcHlfcHJvcCgic3lzdGVtX2pvdXJuYWxfc2l6ZSIsICJqb3VybmFsX3NpemUiKQorICAgIGlmIG5vdCBjb3B5X3Byb3AoInN5c3RlbV9qb3VybmFsX3NpemUiLCAiam91cm5hbF9zaXplIik6CisgICAgICBkWyJqb3VybmFsX3NpemUiXSA9ICIwIgogICAgIGNvcHlfcHJvcCgic3lzdGVtX3Zlcml0eV9ibG9ja19kZXZpY2UiLCAidmVyaXR5X2Jsb2NrX2RldmljZSIpCiAgICAgY29weV9wcm9wKCJzeXN0ZW1fcm9vdF9pbWFnZSIsICJzeXN0ZW1fcm9vdF9pbWFnZSIpCiAgICAgY29weV9wcm9wKCJyYW1kaXNrX2RpciIsICJyYW1kaXNrX2RpciIpCiAgICAgY29weV9wcm9wKCJyYW1kaXNrX2ZzX2NvbmZpZyIsICJyYW1kaXNrX2ZzX2NvbmZpZyIpCi0gICAgY29weV9wcm9wKCJoYXNfZXh0NF9yZXNlcnZlZF9ibG9ja3MiLCAiaGFzX2V4dDRfcmVzZXJ2ZWRfYmxvY2tzIikKKyAgICBjb3B5X3Byb3AoImV4dDRfc2hhcmVfZHVwX2Jsb2NrcyIsICJleHQ0X3NoYXJlX2R1cF9ibG9ja3MiKQogICAgIGNvcHlfcHJvcCgic3lzdGVtX3NxdWFzaGZzX2NvbXByZXNzb3IiLCAic3F1YXNoZnNfY29tcHJlc3NvciIpCiAgICAgY29weV9wcm9wKCJzeXN0ZW1fc3F1YXNoZnNfY29tcHJlc3Nvcl9vcHQiLCAic3F1YXNoZnNfY29tcHJlc3Nvcl9vcHQiKQogICAgIGNvcHlfcHJvcCgic3lzdGVtX3NxdWFzaGZzX2Jsb2NrX3NpemUiLCAic3F1YXNoZnNfYmxvY2tfc2l6ZSIpCiAgICAgY29weV9wcm9wKCJzeXN0ZW1fc3F1YXNoZnNfZGlzYWJsZV80a19hbGlnbiIsICJzcXVhc2hmc19kaXNhYmxlXzRrX2FsaWduIikKICAgICBjb3B5X3Byb3AoInN5c3RlbV9iYXNlX2ZzX2ZpbGUiLCAiYmFzZV9mc19maWxlIikKICAgICBjb3B5X3Byb3AoInN5c3RlbV9leHRmc19pbm9kZV9jb3VudCIsICJleHRmc19pbm9kZV9jb3VudCIpCisgICAgaWYgbm90IGNvcHlfcHJvcCgic3lzdGVtX2V4dGZzX3Jzdl9wY3QiLCAiZXh0ZnNfcnN2X3BjdCIpOgorICAgICAgZFsiZXh0ZnNfcnN2X3BjdCJdID0gIjAiCiAgIGVsaWYgbW91bnRfcG9pbnQgPT0gInN5c3RlbV9vdGhlciI6Ci0gICAgIyBXZSBpbmhlcml0IHRoZSBzZWxpbnV4IHBvbGljaWVzIG9mIC9zeXN0ZW0gc2luY2Ugd2UgY29udGFpbiBzb21lIG9mIGl0cyBmaWxlcy4KKyAgICAjIFdlIGluaGVyaXQgdGhlIHNlbGludXggcG9saWNpZXMgb2YgL3N5c3RlbSBzaW5jZSB3ZSBjb250YWluIHNvbWUgb2YgaXRzCisgICAgIyBmaWxlcy4KICAgICBkWyJtb3VudF9wb2ludCJdID0gInN5c3RlbSIKICAgICBjb3B5X3Byb3AoImF2Yl9zeXN0ZW1faGFzaHRyZWVfZW5hYmxlIiwgImF2Yl9oYXNodHJlZV9lbmFibGUiKQogICAgIGNvcHlfcHJvcCgiYXZiX3N5c3RlbV9hZGRfaGFzaHRyZWVfZm9vdGVyX2FyZ3MiLApAQCAtNjg1LDIwICs3NTksMjIgQEAKICAgICBjb3B5X3Byb3AoImZzX3R5cGUiLCAiZnNfdHlwZSIpCiAgICAgY29weV9wcm9wKCJzeXN0ZW1fZnNfdHlwZSIsICJmc190eXBlIikKICAgICBjb3B5X3Byb3AoInN5c3RlbV9zaXplIiwgInBhcnRpdGlvbl9zaXplIikKLSAgICBjb3B5X3Byb3AoInN5c3RlbV9qb3VybmFsX3NpemUiLCAiam91cm5hbF9zaXplIikKKyAgICBpZiBub3QgY29weV9wcm9wKCJzeXN0ZW1fam91cm5hbF9zaXplIiwgImpvdXJuYWxfc2l6ZSIpOgorICAgICAgZFsiam91cm5hbF9zaXplIl0gPSAiMCIKICAgICBjb3B5X3Byb3AoInN5c3RlbV92ZXJpdHlfYmxvY2tfZGV2aWNlIiwgInZlcml0eV9ibG9ja19kZXZpY2UiKQotICAgIGNvcHlfcHJvcCgiaGFzX2V4dDRfcmVzZXJ2ZWRfYmxvY2tzIiwgImhhc19leHQ0X3Jlc2VydmVkX2Jsb2NrcyIpCiAgICAgY29weV9wcm9wKCJzeXN0ZW1fc3F1YXNoZnNfY29tcHJlc3NvciIsICJzcXVhc2hmc19jb21wcmVzc29yIikKICAgICBjb3B5X3Byb3AoInN5c3RlbV9zcXVhc2hmc19jb21wcmVzc29yX29wdCIsICJzcXVhc2hmc19jb21wcmVzc29yX29wdCIpCiAgICAgY29weV9wcm9wKCJzeXN0ZW1fc3F1YXNoZnNfYmxvY2tfc2l6ZSIsICJzcXVhc2hmc19ibG9ja19zaXplIikKICAgICBjb3B5X3Byb3AoInN5c3RlbV9iYXNlX2ZzX2ZpbGUiLCAiYmFzZV9mc19maWxlIikKICAgICBjb3B5X3Byb3AoInN5c3RlbV9leHRmc19pbm9kZV9jb3VudCIsICJleHRmc19pbm9kZV9jb3VudCIpCisgICAgaWYgbm90IGNvcHlfcHJvcCgic3lzdGVtX2V4dGZzX3Jzdl9wY3QiLCAiZXh0ZnNfcnN2X3BjdCIpOgorICAgICAgZFsiZXh0ZnNfcnN2X3BjdCJdID0gIjAiCiAgIGVsaWYgbW91bnRfcG9pbnQgPT0gImRhdGEiOgogICAgICMgQ29weSB0aGUgZ2VuZXJpYyBmcyB0eXBlIGZpcnN0LCBvdmVycmlkZSB3aXRoIHNwZWNpZmljIG9uZSBpZiBhdmFpbGFibGUuCiAgICAgY29weV9wcm9wKCJmc190eXBlIiwgImZzX3R5cGUiKQogICAgIGNvcHlfcHJvcCgidXNlcmRhdGFfZnNfdHlwZSIsICJmc190eXBlIikKICAgICBjb3B5X3Byb3AoInVzZXJkYXRhX3NpemUiLCAicGFydGl0aW9uX3NpemUiKQotICAgIGNvcHlfcHJvcCgiZmxhc2hfbG9naWNhbF9ibG9ja19zaXplIiwiZmxhc2hfbG9naWNhbF9ibG9ja19zaXplIikKKyAgICBjb3B5X3Byb3AoImZsYXNoX2xvZ2ljYWxfYmxvY2tfc2l6ZSIsICJmbGFzaF9sb2dpY2FsX2Jsb2NrX3NpemUiKQogICAgIGNvcHlfcHJvcCgiZmxhc2hfZXJhc2VfYmxvY2tfc2l6ZSIsICJmbGFzaF9lcmFzZV9ibG9ja19zaXplIikKICAgZWxpZiBtb3VudF9wb2ludCA9PSAiY2FjaGUiOgogICAgIGNvcHlfcHJvcCgiY2FjaGVfZnNfdHlwZSIsICJmc190eXBlIikKQEAgLTcxMSwyMSArNzg3LDQ1IEBACiAgICAgY29weV9wcm9wKCJhdmJfdmVuZG9yX2FsZ29yaXRobSIsICJhdmJfYWxnb3JpdGhtIikKICAgICBjb3B5X3Byb3AoInZlbmRvcl9mc190eXBlIiwgImZzX3R5cGUiKQogICAgIGNvcHlfcHJvcCgidmVuZG9yX3NpemUiLCAicGFydGl0aW9uX3NpemUiKQotICAgIGNvcHlfcHJvcCgidmVuZG9yX2pvdXJuYWxfc2l6ZSIsICJqb3VybmFsX3NpemUiKQorICAgIGlmIG5vdCBjb3B5X3Byb3AoInZlbmRvcl9qb3VybmFsX3NpemUiLCAiam91cm5hbF9zaXplIik6CisgICAgICBkWyJqb3VybmFsX3NpemUiXSA9ICIwIgogICAgIGNvcHlfcHJvcCgidmVuZG9yX3Zlcml0eV9ibG9ja19kZXZpY2UiLCAidmVyaXR5X2Jsb2NrX2RldmljZSIpCi0gICAgY29weV9wcm9wKCJoYXNfZXh0NF9yZXNlcnZlZF9ibG9ja3MiLCAiaGFzX2V4dDRfcmVzZXJ2ZWRfYmxvY2tzIikKKyAgICBjb3B5X3Byb3AoImV4dDRfc2hhcmVfZHVwX2Jsb2NrcyIsICJleHQ0X3NoYXJlX2R1cF9ibG9ja3MiKQogICAgIGNvcHlfcHJvcCgidmVuZG9yX3NxdWFzaGZzX2NvbXByZXNzb3IiLCAic3F1YXNoZnNfY29tcHJlc3NvciIpCiAgICAgY29weV9wcm9wKCJ2ZW5kb3Jfc3F1YXNoZnNfY29tcHJlc3Nvcl9vcHQiLCAic3F1YXNoZnNfY29tcHJlc3Nvcl9vcHQiKQogICAgIGNvcHlfcHJvcCgidmVuZG9yX3NxdWFzaGZzX2Jsb2NrX3NpemUiLCAic3F1YXNoZnNfYmxvY2tfc2l6ZSIpCiAgICAgY29weV9wcm9wKCJ2ZW5kb3Jfc3F1YXNoZnNfZGlzYWJsZV80a19hbGlnbiIsICJzcXVhc2hmc19kaXNhYmxlXzRrX2FsaWduIikKICAgICBjb3B5X3Byb3AoInZlbmRvcl9iYXNlX2ZzX2ZpbGUiLCAiYmFzZV9mc19maWxlIikKICAgICBjb3B5X3Byb3AoInZlbmRvcl9leHRmc19pbm9kZV9jb3VudCIsICJleHRmc19pbm9kZV9jb3VudCIpCisgICAgaWYgbm90IGNvcHlfcHJvcCgidmVuZG9yX2V4dGZzX3Jzdl9wY3QiLCAiZXh0ZnNfcnN2X3BjdCIpOgorICAgICAgZFsiZXh0ZnNfcnN2X3BjdCJdID0gIjAiCisgIGVsaWYgbW91bnRfcG9pbnQgPT0gInByb2R1Y3QiOgorICAgIGNvcHlfcHJvcCgiYXZiX3Byb2R1Y3RfaGFzaHRyZWVfZW5hYmxlIiwgImF2Yl9oYXNodHJlZV9lbmFibGUiKQorICAgIGNvcHlfcHJvcCgiYXZiX3Byb2R1Y3RfYWRkX2hhc2h0cmVlX2Zvb3Rlcl9hcmdzIiwKKyAgICAgICAgICAgICAgImF2Yl9hZGRfaGFzaHRyZWVfZm9vdGVyX2FyZ3MiKQorICAgIGNvcHlfcHJvcCgiYXZiX3Byb2R1Y3Rfa2V5X3BhdGgiLCAiYXZiX2tleV9wYXRoIikKKyAgICBjb3B5X3Byb3AoImF2Yl9wcm9kdWN0X2FsZ29yaXRobSIsICJhdmJfYWxnb3JpdGhtIikKKyAgICBjb3B5X3Byb3AoInByb2R1Y3RfZnNfdHlwZSIsICJmc190eXBlIikKKyAgICBjb3B5X3Byb3AoInByb2R1Y3Rfc2l6ZSIsICJwYXJ0aXRpb25fc2l6ZSIpCisgICAgaWYgbm90IGNvcHlfcHJvcCgicHJvZHVjdF9qb3VybmFsX3NpemUiLCAiam91cm5hbF9zaXplIik6CisgICAgICBkWyJqb3VybmFsX3NpemUiXSA9ICIwIgorICAgIGNvcHlfcHJvcCgicHJvZHVjdF92ZXJpdHlfYmxvY2tfZGV2aWNlIiwgInZlcml0eV9ibG9ja19kZXZpY2UiKQorICAgIGNvcHlfcHJvcCgicHJvZHVjdF9zcXVhc2hmc19jb21wcmVzc29yIiwgInNxdWFzaGZzX2NvbXByZXNzb3IiKQorICAgIGNvcHlfcHJvcCgicHJvZHVjdF9zcXVhc2hmc19jb21wcmVzc29yX29wdCIsICJzcXVhc2hmc19jb21wcmVzc29yX29wdCIpCisgICAgY29weV9wcm9wKCJwcm9kdWN0X3NxdWFzaGZzX2Jsb2NrX3NpemUiLCAic3F1YXNoZnNfYmxvY2tfc2l6ZSIpCisgICAgY29weV9wcm9wKCJwcm9kdWN0X3NxdWFzaGZzX2Rpc2FibGVfNGtfYWxpZ24iLCAic3F1YXNoZnNfZGlzYWJsZV80a19hbGlnbiIpCisgICAgY29weV9wcm9wKCJwcm9kdWN0X2Jhc2VfZnNfZmlsZSIsICJiYXNlX2ZzX2ZpbGUiKQorICAgIGNvcHlfcHJvcCgicHJvZHVjdF9leHRmc19pbm9kZV9jb3VudCIsICJleHRmc19pbm9kZV9jb3VudCIpCisgICAgaWYgbm90IGNvcHlfcHJvcCgicHJvZHVjdF9leHRmc19yc3ZfcGN0IiwgImV4dGZzX3Jzdl9wY3QiKToKKyAgICAgIGRbImV4dGZzX3Jzdl9wY3QiXSA9ICIwIgogICBlbGlmIG1vdW50X3BvaW50ID09ICJvZW0iOgogICAgIGNvcHlfcHJvcCgiZnNfdHlwZSIsICJmc190eXBlIikKICAgICBjb3B5X3Byb3AoIm9lbV9zaXplIiwgInBhcnRpdGlvbl9zaXplIikKLSAgICBjb3B5X3Byb3AoIm9lbV9qb3VybmFsX3NpemUiLCAiam91cm5hbF9zaXplIikKLSAgICBjb3B5X3Byb3AoImhhc19leHQ0X3Jlc2VydmVkX2Jsb2NrcyIsICJoYXNfZXh0NF9yZXNlcnZlZF9ibG9ja3MiKQorICAgIGlmIG5vdCBjb3B5X3Byb3AoIm9lbV9qb3VybmFsX3NpemUiLCAiam91cm5hbF9zaXplIik6CisgICAgICBkWyJqb3VybmFsX3NpemUiXSA9ICIwIgogICAgIGNvcHlfcHJvcCgib2VtX2V4dGZzX2lub2RlX2NvdW50IiwgImV4dGZzX2lub2RlX2NvdW50IikKKyAgICBpZiBub3QgY29weV9wcm9wKCJvZW1fZXh0ZnNfcnN2X3BjdCIsICJleHRmc19yc3ZfcGN0Iik6CisgICAgICBkWyJleHRmc19yc3ZfcGN0Il0gPSAiMCIKICAgZFsicGFydGl0aW9uX25hbWUiXSA9IG1vdW50X3BvaW50CiAgIHJldHVybiBkCiAKQEAgLTc0Niw3ICs4NDYsNyBAQAogCiBkZWYgbWFpbihhcmd2KToKICAgaWYgbGVuKGFyZ3YpICE9IDQ6Ci0gICAgcHJpbnQgX19kb2NfXworICAgIHByaW50KF9fZG9jX18pCiAgICAgc3lzLmV4aXQoMSkKIAogICBpbl9kaXIgPSBhcmd2WzBdCkBAIC03NzQsMTcgKzg3NCwyMiBAQAogICAgICAgbW91bnRfcG9pbnQgPSAidmVuZG9yIgogICAgIGVsaWYgaW1hZ2VfZmlsZW5hbWUgPT0gIm9lbS5pbWciOgogICAgICAgbW91bnRfcG9pbnQgPSAib2VtIgorICAgIGVsaWYgaW1hZ2VfZmlsZW5hbWUgPT0gInByb2R1Y3QuaW1nIjoKKyAgICAgIG1vdW50X3BvaW50ID0gInByb2R1Y3QiCiAgICAgZWxzZToKLSAgICAgIHByaW50ID4+IHN5cy5zdGRlcnIsICJlcnJvcjogdW5rbm93biBpbWFnZSBmaWxlIG5hbWUgIiwgaW1hZ2VfZmlsZW5hbWUKLSAgICAgIGV4aXQoMSkKKyAgICAgIHByaW50KCJlcnJvcjogdW5rbm93biBpbWFnZSBmaWxlIG5hbWUgIiwgaW1hZ2VfZmlsZW5hbWUsIGZpbGU9c3lzLnN0ZGVycikKKyAgICAgIHN5cy5leGl0KDEpCiAKICAgICBpbWFnZV9wcm9wZXJ0aWVzID0gSW1hZ2VQcm9wRnJvbUdsb2JhbERpY3QoZ2xvYl9kaWN0LCBtb3VudF9wb2ludCkKIAogICBpZiBub3QgQnVpbGRJbWFnZShpbl9kaXIsIGltYWdlX3Byb3BlcnRpZXMsIG91dF9maWxlLCB0YXJnZXRfb3V0KToKLSAgICBwcmludCA+PiBzeXMuc3RkZXJyLCAiZXJyb3I6IGZhaWxlZCB0byBidWlsZCAlcyBmcm9tICVzIiAlIChvdXRfZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbl9kaXIpCi0gICAgZXhpdCgxKQorICAgIHByaW50KCJlcnJvcjogZmFpbGVkIHRvIGJ1aWxkICVzIGZyb20gJXMiICUgKG91dF9maWxlLCBpbl9kaXIpLAorICAgICAgICAgIGZpbGU9c3lzLnN0ZGVycikKKyAgICBzeXMuZXhpdCgxKQogCiAKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6Ci0gIG1haW4oc3lzLmFyZ3ZbMTpdKQorICB0cnk6CisgICAgbWFpbihzeXMuYXJndlsxOl0pCisgIGZpbmFsbHk6CisgICAgY29tbW9uLkNsZWFudXAoKQpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVsZWFzZXRvb2xzL2NoZWNrX290YV9wYWNrYWdlX3NpZ25hdHVyZS5weSBiL3Rvb2xzL3JlbGVhc2V0b29scy9jaGVja19vdGFfcGFja2FnZV9zaWduYXR1cmUucHkKaW5kZXggNTQ4YjYxOS4uM2NhYzkwYSAxMDA3NTUKLS0tIGEvdG9vbHMvcmVsZWFzZXRvb2xzL2NoZWNrX290YV9wYWNrYWdlX3NpZ25hdHVyZS5weQorKysgYi90b29scy9yZWxlYXNldG9vbHMvY2hlY2tfb3RhX3BhY2thZ2Vfc2lnbmF0dXJlLnB5CkBAIC0yMSwxNiArMjEsMTkgQEAKIGZyb20gX19mdXR1cmVfXyBpbXBvcnQgcHJpbnRfZnVuY3Rpb24KIAogaW1wb3J0IGFyZ3BhcnNlCi1pbXBvcnQgY29tbW9uCiBpbXBvcnQgcmUKIGltcG9ydCBzdWJwcm9jZXNzCiBpbXBvcnQgc3lzCitpbXBvcnQgdGVtcGZpbGUKK2ltcG9ydCB6aXBmaWxlCiAKIGZyb20gaGFzaGxpYiBpbXBvcnQgc2hhMQogZnJvbSBoYXNobGliIGltcG9ydCBzaGEyNTYKIAoraW1wb3J0IGNvbW1vbgogCi1kZWYgY2VydF91c2VzX3NoYTI1NihjZXJ0KToKKworZGVmIENlcnRVc2VzU2hhMjU2KGNlcnQpOgogICAiIiJDaGVjayBpZiB0aGUgY2VydCB1c2VzIFNIQS0yNTYgaGFzaGluZyBhbGdvcml0aG0uIiIiCiAKICAgY21kID0gWydvcGVuc3NsJywgJ3g1MDknLCAnLXRleHQnLCAnLW5vb3V0JywgJy1pbicsIGNlcnRdCkBAIC00Niw3ICs0OSw3IEBACiAgIHJldHVybiBhbGdvcml0aG0uZ3JvdXAoMSkuc3RhcnRzd2l0aCgnc2hhMjU2JykKIAogCi1kZWYgdmVyaWZ5X3BhY2thZ2UoY2VydCwgcGFja2FnZSk6CitkZWYgVmVyaWZ5UGFja2FnZShjZXJ0LCBwYWNrYWdlKToKICAgIiIiVmVyaWZ5IHRoZSBnaXZlbiBwYWNrYWdlIHdpdGggdGhlIGNlcnRpZmljYXRlLgogCiAgIChDb21tZW50cyBmcm9tIGJvb3RhYmxlL3JlY292ZXJ5L3ZlcmlmaWVyLmNwcDopCkBAIC05MCwxNyArOTMsMTQgQEAKICAgcHJpbnQoJ1NpZ25lZCBkYXRhIGxlbmd0aDogJWQnICUgKHNpZ25lZF9sZW4sKSkKICAgcHJpbnQoJ1NpZ25hdHVyZSBzdGFydDogJWQnICUgKHNpZ25hdHVyZV9zdGFydCwpKQogCi0gIHVzZV9zaGEyNTYgPSBjZXJ0X3VzZXNfc2hhMjU2KGNlcnQpCisgIHVzZV9zaGEyNTYgPSBDZXJ0VXNlc1NoYTI1NihjZXJ0KQogICBwcmludCgnVXNlIFNIQS0yNTY6ICVzJyAlICh1c2Vfc2hhMjU2LCkpCiAKLSAgaWYgdXNlX3NoYTI1NjoKLSAgICBoID0gc2hhMjU2KCkKLSAgZWxzZToKLSAgICBoID0gc2hhMSgpCisgIGggPSBzaGEyNTYoKSBpZiB1c2Vfc2hhMjU2IGVsc2Ugc2hhMSgpCiAgIGgudXBkYXRlKHBhY2thZ2VfYnl0ZXNbOnNpZ25lZF9sZW5dKQogICBwYWNrYWdlX2RpZ2VzdCA9IGguaGV4ZGlnZXN0KCkubG93ZXIoKQogCi0gIHByaW50KCdEaWdlc3Q6ICVzXG4nICUgKHBhY2thZ2VfZGlnZXN0LCkpCisgIHByaW50KCdEaWdlc3Q6ICVzJyAlIChwYWNrYWdlX2RpZ2VzdCwpKQogCiAgICMgR2V0IHRoZSBzaWduYXR1cmUgZnJvbSB0aGUgaW5wdXQgcGFja2FnZS4KICAgc2lnbmF0dXJlID0gcGFja2FnZV9ieXRlc1tzaWduYXR1cmVfc3RhcnQ6LTZdCkBAIC0xNDEsNyArMTQxLDM5IEBACiAgIGFzc2VydCBwYWNrYWdlX2RpZ2VzdCA9PSBkaWdlc3Rfc3RyaW5nLCAiVmVyaWZpY2F0aW9uIGZhaWxlZC4iCiAKICAgIyBWZXJpZmllZCBzdWNjZXNzZnVsbHkgdXBvbiByZWFjaGluZyBoZXJlLgotICBwcmludCgnVkVSSUZJRURcbicpCisgIHByaW50KCdcbldob2xlIHBhY2thZ2Ugc2lnbmF0dXJlIFZFUklGSUVEXG4nKQorCisKK2RlZiBWZXJpZnlBYk90YVBheWxvYWQoY2VydCwgcGFja2FnZSk6CisgICIiIlZlcmlmaWVzIHRoZSBwYXlsb2FkIGFuZCBtZXRhZGF0YSBzaWduYXR1cmVzIGluIGFuIEEvQiBPVEEgcGF5bG9hZC4iIiIKKyAgcGFja2FnZV96aXAgPSB6aXBmaWxlLlppcEZpbGUocGFja2FnZSwgJ3InKQorICBpZiAncGF5bG9hZC5iaW4nIG5vdCBpbiBwYWNrYWdlX3ppcC5uYW1lbGlzdCgpOgorICAgIGNvbW1vbi5aaXBDbG9zZShwYWNrYWdlX3ppcCkKKyAgICByZXR1cm4KKworICBwcmludCgnVmVyaWZ5aW5nIEEvQiBPVEEgcGF5bG9hZCBzaWduYXR1cmVzLi4uJykKKworICAjIER1bXAgcHVia2V5IGZyb20gdGhlIGNlcnRpZmljYXRlLgorICBwdWJrZXkgPSBjb21tb24uTWFrZVRlbXBGaWxlKHByZWZpeD0ia2V5LSIsIHN1ZmZpeD0iLnBlbSIpCisgIHdpdGggb3BlbihwdWJrZXksICd3YicpIGFzIHB1YmtleV9mcDoKKyAgICBwdWJrZXlfZnAud3JpdGUoY29tbW9uLkV4dHJhY3RQdWJsaWNLZXkoY2VydCkpCisKKyAgcGFja2FnZV9kaXIgPSBjb21tb24uTWFrZVRlbXBEaXIocHJlZml4PSdwYWNrYWdlLScpCisKKyAgIyBTaWduYXR1cmUgdmVyaWZpY2F0aW9uIHdpdGggZGVsdGFfZ2VuZXJhdG9yLgorICBwYXlsb2FkX2ZpbGUgPSBwYWNrYWdlX3ppcC5leHRyYWN0KCdwYXlsb2FkLmJpbicsIHBhY2thZ2VfZGlyKQorICBjbWQgPSBbJ2RlbHRhX2dlbmVyYXRvcicsCisgICAgICAgICAnLS1pbl9maWxlPScgKyBwYXlsb2FkX2ZpbGUsCisgICAgICAgICAnLS1wdWJsaWNfa2V5PScgKyBwdWJrZXldCisgIHByb2MgPSBjb21tb24uUnVuKGNtZCwgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwgc3RkZXJyPXN1YnByb2Nlc3MuU1RET1VUKQorICBzdGRvdXRkYXRhLCBfID0gcHJvYy5jb21tdW5pY2F0ZSgpCisgIGFzc2VydCBwcm9jLnJldHVybmNvZGUgPT0gMCwgXAorICAgICAgJ0ZhaWxlZCB0byB2ZXJpZnkgcGF5bG9hZCB3aXRoIGRlbHRhX2dlbmVyYXRvcjogJXNcbiVzJyAlIChwYWNrYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRvdXRkYXRhKQorICBjb21tb24uWmlwQ2xvc2UocGFja2FnZV96aXApCisKKyAgIyBWZXJpZmllZCBzdWNjZXNzZnVsbHkgdXBvbiByZWFjaGluZyBoZXJlLgorICBwcmludCgnXG5QYXlsb2FkIHNpZ25hdHVyZXMgVkVSSUZJRURcblxuJykKIAogCiBkZWYgbWFpbigpOgpAQCAtMTUwLDcgKzE4Miw4IEBACiAgIHBhcnNlci5hZGRfYXJndW1lbnQoJ3BhY2thZ2UnLCBoZWxwPSdUaGUgT1RBIHBhY2thZ2UgdG8gYmUgdmVyaWZpZWQuJykKICAgYXJncyA9IHBhcnNlci5wYXJzZV9hcmdzKCkKIAotICB2ZXJpZnlfcGFja2FnZShhcmdzLmNlcnRpZmljYXRlLCBhcmdzLnBhY2thZ2UpCisgIFZlcmlmeVBhY2thZ2UoYXJncy5jZXJ0aWZpY2F0ZSwgYXJncy5wYWNrYWdlKQorICBWZXJpZnlBYk90YVBheWxvYWQoYXJncy5jZXJ0aWZpY2F0ZSwgYXJncy5wYWNrYWdlKQogCiAKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CkBAIC0xNTksMyArMTkyLDUgQEAKICAgZXhjZXB0IEFzc2VydGlvbkVycm9yIGFzIGVycjoKICAgICBwcmludCgnXG4gICAgRVJST1I6ICVzXG4nICUgKGVyciwpKQogICAgIHN5cy5leGl0KDEpCisgIGZpbmFsbHk6CisgICAgY29tbW9uLkNsZWFudXAoKQpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVsZWFzZXRvb2xzL2NoZWNrX3RhcmdldF9maWxlc19zaWduYXR1cmVzLnB5IGIvdG9vbHMvcmVsZWFzZXRvb2xzL2NoZWNrX3RhcmdldF9maWxlc19zaWduYXR1cmVzLnB5CmluZGV4IGM0ODc3ZTAuLmI5ZjM5YTYgMTAwNzU1Ci0tLSBhL3Rvb2xzL3JlbGVhc2V0b29scy9jaGVja190YXJnZXRfZmlsZXNfc2lnbmF0dXJlcy5weQorKysgYi90b29scy9yZWxlYXNldG9vbHMvY2hlY2tfdGFyZ2V0X2ZpbGVzX3NpZ25hdHVyZXMucHkKQEAgLTM5LDI1ICszOSwyNiBAQAogCiAiIiIKIAoraW1wb3J0IG9zCitpbXBvcnQgcmUKK2ltcG9ydCBzdWJwcm9jZXNzCiBpbXBvcnQgc3lzCitpbXBvcnQgemlwZmlsZQorCitpbXBvcnQgY29tbW9uCiAKIGlmIHN5cy5oZXh2ZXJzaW9uIDwgMHgwMjA3MDAwMDoKICAgcHJpbnQgPj4gc3lzLnN0ZGVyciwgIlB5dGhvbiAyLjcgb3IgbmV3ZXIgaXMgcmVxdWlyZWQuIgogICBzeXMuZXhpdCgxKQogCi1pbXBvcnQgb3MKLWltcG9ydCByZQotaW1wb3J0IHNodXRpbAotaW1wb3J0IHN1YnByb2Nlc3MKLWltcG9ydCB6aXBmaWxlCiAKLWltcG9ydCBjb21tb24KLQotIyBXb3JrIGFyb3VuZCBhIGJ1ZyBpbiBweXRob24ncyB6aXBmaWxlIG1vZHVsZSB0aGF0IHByZXZlbnRzIG9wZW5pbmcKLSMgb2YgemlwZmlsZXMgaWYgYW55IGVudHJ5IGhhcyBhbiBleHRyYSBmaWVsZCBvZiBiZXR3ZWVuIDEgYW5kIDMgYnl0ZXMKLSMgKHdoaWNoIGlzIGNvbW1vbiB3aXRoIHppcGFsaWduZWQgQVBLcykuICBUaGlzIG92ZXJyaWRlcyB0aGUKLSMgWmlwSW5mby5fZGVjb2RlRXh0cmEoKSBtZXRob2QgKHdoaWNoIGNvbnRhaW5zIHRoZSBidWcpIHdpdGggYW4gZW1wdHkKLSMgdmVyc2lvbiAoc2luY2Ugd2UgZG9uJ3QgbmVlZCB0byBkZWNvZGUgdGhlIGV4dHJhIGZpZWxkIGFueXdheSkuCisjIFdvcmsgYXJvdW5kIGEgYnVnIGluIFB5dGhvbidzIHppcGZpbGUgbW9kdWxlIHRoYXQgcHJldmVudHMgb3BlbmluZyBvZiB6aXBmaWxlcworIyBpZiBhbnkgZW50cnkgaGFzIGFuIGV4dHJhIGZpZWxkIG9mIGJldHdlZW4gMSBhbmQgMyBieXRlcyAod2hpY2ggaXMgY29tbW9uIHdpdGgKKyMgemlwYWxpZ25lZCBBUEtzKS4gVGhpcyBvdmVycmlkZXMgdGhlIFppcEluZm8uX2RlY29kZUV4dHJhKCkgbWV0aG9kICh3aGljaAorIyBjb250YWlucyB0aGUgYnVnKSB3aXRoIGFuIGVtcHR5IHZlcnNpb24gKHNpbmNlIHdlIGRvbid0IG5lZWQgdG8gZGVjb2RlIHRoZQorIyBleHRyYSBmaWVsZCBhbnl3YXkpLgorIyBJc3N1ZSAjMTQzMTU6IGh0dHBzOi8vYnVncy5weXRob24ub3JnL2lzc3VlMTQzMTUsIGZpeGVkIGluIFB5dGhvbiAyLjcuOCBhbmQKKyMgUHl0aG9uIDMuNS4wIGFscGhhIDEuCiBjbGFzcyBNeVppcEluZm8oemlwZmlsZS5aaXBJbmZvKToKICAgZGVmIF9kZWNvZGVFeHRyYShzZWxmKToKICAgICBwYXNzCkBAIC0yNDIsNDYgKzI0Myw0MSBAQAogICAgICMgVGhpcyBpcyB0aGUgbGlzdCBvZiB3aWxkY2FyZHMgb2YgZmlsZXMgd2UgZXh0cmFjdCBmcm9tIHxmaWxlbmFtZXwuCiAgICAgYXBrX2V4dGVuc2lvbnMgPSBbJyouYXBrJ10KIAotICAgIHNlbGYuY2VydG1hcCwgY29tcHJlc3NlZF9leHRlbnNpb24gPSBjb21tb24uUmVhZEFwa0NlcnRzKHppcGZpbGUuWmlwRmlsZShmaWxlbmFtZSwgInIiKSkKKyAgICBzZWxmLmNlcnRtYXAsIGNvbXByZXNzZWRfZXh0ZW5zaW9uID0gY29tbW9uLlJlYWRBcGtDZXJ0cygKKyAgICAgICAgemlwZmlsZS5aaXBGaWxlKGZpbGVuYW1lLCAiciIpKQogICAgIGlmIGNvbXByZXNzZWRfZXh0ZW5zaW9uOgogICAgICAgYXBrX2V4dGVuc2lvbnMuYXBwZW5kKCIqLmFwayIgKyBjb21wcmVzc2VkX2V4dGVuc2lvbikKIAotICAgIGQsIHogPSBjb21tb24uVW56aXBUZW1wKGZpbGVuYW1lLCBhcGtfZXh0ZW5zaW9ucykKLSAgICB0cnk6Ci0gICAgICBzZWxmLmFwa3MgPSB7fQotICAgICAgc2VsZi5hcGtzX2J5X2Jhc2VuYW1lID0ge30KLSAgICAgIGZvciBkaXJwYXRoLCBfLCBmaWxlbmFtZXMgaW4gb3Mud2FsayhkKToKLSAgICAgICAgZm9yIGZuIGluIGZpbGVuYW1lczoKLSAgICAgICAgICAjIERlY29tcHJlc3MgY29tcHJlc3NlZCBBUEtzIGJlZm9yZSB3ZSBiZWdpbiBwcm9jZXNzaW5nIHRoZW0uCi0gICAgICAgICAgaWYgY29tcHJlc3NlZF9leHRlbnNpb24gYW5kIGZuLmVuZHN3aXRoKGNvbXByZXNzZWRfZXh0ZW5zaW9uKToKLSAgICAgICAgICAgICMgRmlyc3Qgc3RyaXAgdGhlIGNvbXByZXNzZWQgZXh0ZW5zaW9uIGZyb20gdGhlIGZpbGUuCi0gICAgICAgICAgICB1bmNvbXByZXNzZWRfZm4gPSBmbls6LWxlbihjb21wcmVzc2VkX2V4dGVuc2lvbildCisgICAgZCA9IGNvbW1vbi5VbnppcFRlbXAoZmlsZW5hbWUsIGFwa19leHRlbnNpb25zKQorICAgIHNlbGYuYXBrcyA9IHt9CisgICAgc2VsZi5hcGtzX2J5X2Jhc2VuYW1lID0ge30KKyAgICBmb3IgZGlycGF0aCwgXywgZmlsZW5hbWVzIGluIG9zLndhbGsoZCk6CisgICAgICBmb3IgZm4gaW4gZmlsZW5hbWVzOgorICAgICAgICAjIERlY29tcHJlc3MgY29tcHJlc3NlZCBBUEtzIGJlZm9yZSB3ZSBiZWdpbiBwcm9jZXNzaW5nIHRoZW0uCisgICAgICAgIGlmIGNvbXByZXNzZWRfZXh0ZW5zaW9uIGFuZCBmbi5lbmRzd2l0aChjb21wcmVzc2VkX2V4dGVuc2lvbik6CisgICAgICAgICAgIyBGaXJzdCBzdHJpcCB0aGUgY29tcHJlc3NlZCBleHRlbnNpb24gZnJvbSB0aGUgZmlsZS4KKyAgICAgICAgICB1bmNvbXByZXNzZWRfZm4gPSBmbls6LWxlbihjb21wcmVzc2VkX2V4dGVuc2lvbildCiAKLSAgICAgICAgICAgICMgRGVjb21wcmVzcyB0aGUgY29tcHJlc3NlZCBmaWxlIHRvIHRoZSBvdXRwdXQgZmlsZS4KLSAgICAgICAgICAgIGNvbW1vbi5HdW56aXAob3MucGF0aC5qb2luKGRpcnBhdGgsIGZuKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5qb2luKGRpcnBhdGgsIHVuY29tcHJlc3NlZF9mbikpCisgICAgICAgICAgIyBEZWNvbXByZXNzIHRoZSBjb21wcmVzc2VkIGZpbGUgdG8gdGhlIG91dHB1dCBmaWxlLgorICAgICAgICAgIGNvbW1vbi5HdW56aXAob3MucGF0aC5qb2luKGRpcnBhdGgsIGZuKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG9zLnBhdGguam9pbihkaXJwYXRoLCB1bmNvbXByZXNzZWRfZm4pKQogCi0gICAgICAgICAgICAjIEZpbmFsbHksIGRlbGV0ZSB0aGUgY29tcHJlc3NlZCBmaWxlIGFuZCB1c2UgdGhlIHVuY29tcHJlc3NlZCBmaWxlCi0gICAgICAgICAgICAjIGZvciBmdXJ0aGVyIHByb2Nlc3NpbmcuIE5vdGUgdGhhdCB0aGUgZGVsZXRpb24gaXMgbm90IHN0cmljdGx5IHJlcXVpcmVkLAotICAgICAgICAgICAgIyBidXQgaXMgZG9uZSBoZXJlIHRvIGVuc3VyZSB0aGF0IHdlJ3JlIG5vdCB1c2luZyB0b28gbXVjaCBzcGFjZSBpbgotICAgICAgICAgICAgIyB0aGUgdGVtcG9yYXJ5IGRpcmVjdG9yeS4KLSAgICAgICAgICAgIG9zLnJlbW92ZShvcy5wYXRoLmpvaW4oZGlycGF0aCwgZm4pKQotICAgICAgICAgICAgZm4gPSB1bmNvbXByZXNzZWRfZm4KKyAgICAgICAgICAjIEZpbmFsbHksIGRlbGV0ZSB0aGUgY29tcHJlc3NlZCBmaWxlIGFuZCB1c2UgdGhlIHVuY29tcHJlc3NlZCBmaWxlCisgICAgICAgICAgIyBmb3IgZnVydGhlciBwcm9jZXNzaW5nLiBOb3RlIHRoYXQgdGhlIGRlbGV0aW9uIGlzIG5vdCBzdHJpY3RseQorICAgICAgICAgICMgcmVxdWlyZWQsIGJ1dCBpcyBkb25lIGhlcmUgdG8gZW5zdXJlIHRoYXQgd2UncmUgbm90IHVzaW5nIHRvbyBtdWNoCisgICAgICAgICAgIyBzcGFjZSBpbiB0aGUgdGVtcG9yYXJ5IGRpcmVjdG9yeS4KKyAgICAgICAgICBvcy5yZW1vdmUob3MucGF0aC5qb2luKGRpcnBhdGgsIGZuKSkKKyAgICAgICAgICBmbiA9IHVuY29tcHJlc3NlZF9mbgogCisgICAgICAgIGlmIGZuLmVuZHN3aXRoKCIuYXBrIik6CisgICAgICAgICAgZnVsbG5hbWUgPSBvcy5wYXRoLmpvaW4oZGlycGF0aCwgZm4pCisgICAgICAgICAgZGlzcGxheW5hbWUgPSBmdWxsbmFtZVtsZW4oZCkrMTpdCisgICAgICAgICAgYXBrID0gQVBLKGZ1bGxuYW1lLCBkaXNwbGF5bmFtZSkKKyAgICAgICAgICBzZWxmLmFwa3NbYXBrLmZpbGVuYW1lXSA9IGFwaworICAgICAgICAgIHNlbGYuYXBrc19ieV9iYXNlbmFtZVtvcy5wYXRoLmJhc2VuYW1lKGFway5maWxlbmFtZSldID0gYXBrCiAKLSAgICAgICAgICBpZiBmbi5lbmRzd2l0aCgiLmFwayIpOgotICAgICAgICAgICAgZnVsbG5hbWUgPSBvcy5wYXRoLmpvaW4oZGlycGF0aCwgZm4pCi0gICAgICAgICAgICBkaXNwbGF5bmFtZSA9IGZ1bGxuYW1lW2xlbihkKSsxOl0KLSAgICAgICAgICAgIGFwayA9IEFQSyhmdWxsbmFtZSwgZGlzcGxheW5hbWUpCi0gICAgICAgICAgICBzZWxmLmFwa3NbYXBrLmZpbGVuYW1lXSA9IGFwawotICAgICAgICAgICAgc2VsZi5hcGtzX2J5X2Jhc2VuYW1lW29zLnBhdGguYmFzZW5hbWUoYXBrLmZpbGVuYW1lKV0gPSBhcGsKLQotICAgICAgICAgICAgc2VsZi5tYXhfcGtnX2xlbiA9IG1heChzZWxmLm1heF9wa2dfbGVuLCBsZW4oYXBrLnBhY2thZ2UpKQotICAgICAgICAgICAgc2VsZi5tYXhfZm5fbGVuID0gbWF4KHNlbGYubWF4X2ZuX2xlbiwgbGVuKGFway5maWxlbmFtZSkpCi0gICAgZmluYWxseToKLSAgICAgIHNodXRpbC5ybXRyZWUoZCkKLQotICAgIHouY2xvc2UoKQorICAgICAgICAgIHNlbGYubWF4X3BrZ19sZW4gPSBtYXgoc2VsZi5tYXhfcGtnX2xlbiwgbGVuKGFway5wYWNrYWdlKSkKKyAgICAgICAgICBzZWxmLm1heF9mbl9sZW4gPSBtYXgoc2VsZi5tYXhfZm5fbGVuLCBsZW4oYXBrLmZpbGVuYW1lKSkKIAogICBkZWYgQ2hlY2tTaGFyZWRVaWRzKHNlbGYpOgogICAgICIiIkxvb2sgZm9yIGFueSBpbnN0YW5jZXMgd2hlcmUgcGFja2FnZXMgc2lnbmVkIHdpdGggZGlmZmVyZW50CkBAIC0yOTEsNyArMjg3LDcgQEAKICAgICAgIGlmIGFway5zaGFyZWRfdWlkOgogICAgICAgICBhcGtzX2J5X3VpZC5zZXRkZWZhdWx0KGFway5zaGFyZWRfdWlkLCBbXSkuYXBwZW5kKGFwaykKIAotICAgIGZvciB1aWQgaW4gc29ydGVkKGFwa3NfYnlfdWlkLmtleXMoKSk6CisgICAgZm9yIHVpZCBpbiBzb3J0ZWQoYXBrc19ieV91aWQpOgogICAgICAgYXBrcyA9IGFwa3NfYnlfdWlkW3VpZF0KICAgICAgIGZvciBhcGsgaW4gYXBrc1sxOl06CiAgICAgICAgIGlmIGFway5jZXJ0cyAhPSBhcGtzWzBdLmNlcnRzOgpAQCAtNDY2LDMgKzQ2Miw1IEBACiAgICAgcHJpbnQgIiAgIEVSUk9SOiAlcyIgJSAoZSwpCiAgICAgcHJpbnQKICAgICBzeXMuZXhpdCgxKQorICBmaW5hbGx5OgorICAgIGNvbW1vbi5DbGVhbnVwKCkKZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbGVhc2V0b29scy9jb21tb24ucHkgYi90b29scy9yZWxlYXNldG9vbHMvY29tbW9uLnB5CmluZGV4IGYzMDk2YzkuLjZkZWZiMmIgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3JlbGVhc2V0b29scy9jb21tb24ucHkKKysrIGIvdG9vbHMvcmVsZWFzZXRvb2xzL2NvbW1vbi5weQpAQCAtMjUsMTcgKzI1LDE3IEBACiBpbXBvcnQgcmUKIGltcG9ydCBzaGxleAogaW1wb3J0IHNodXRpbAoraW1wb3J0IHN0cmluZwogaW1wb3J0IHN1YnByb2Nlc3MKIGltcG9ydCBzeXMKIGltcG9ydCB0ZW1wZmlsZQogaW1wb3J0IHRocmVhZGluZwogaW1wb3J0IHRpbWUKIGltcG9ydCB6aXBmaWxlCitmcm9tIGhhc2hsaWIgaW1wb3J0IHNoYTEsIHNoYTI1NgogCiBpbXBvcnQgYmxvY2tpbWdkaWZmCi0KLWZyb20gaGFzaGxpYiBpbXBvcnQgc2hhMSBhcyBzaGExCi0KK2ltcG9ydCBzcGFyc2VfaW1nCiAKIGNsYXNzIE9wdGlvbnMob2JqZWN0KToKICAgZGVmIF9faW5pdF9fKHNlbGYpOgpAQCAtNzYsNiArNzYsMTEgQEAKICMgVmFsdWVzIGZvciAiY2VydGlmaWNhdGUiIGluIGFwa2NlcnRzIHRoYXQgbWVhbiBzcGVjaWFsIHRoaW5ncy4KIFNQRUNJQUxfQ0VSVF9TVFJJTkdTID0gKCJQUkVTSUdORUQiLCAiRVhURVJOQUwiKQogCisKKyMgVGhlIHBhcnRpdGlvbnMgYWxsb3dlZCB0byBiZSBzaWduZWQgYnkgQVZCIChBbmRyb2lkIHZlcmlmaWVkIGJvb3QgMi4wKS4KK0FWQl9QQVJUSVRJT05TID0gKCdib290JywgJ3JlY292ZXJ5JywgJ3N5c3RlbScsICd2ZW5kb3InLCAncHJvZHVjdCcsICdkdGJvJykKKworCiBjbGFzcyBFcnJvckNvZGUob2JqZWN0KToKICAgIiIiRGVmaW5lIGVycm9yX2NvZGVzIGZvciBmYWlsdXJlcyB0aGF0IGhhcHBlbiBkdXJpbmcgdGhlIGFjdHVhbAogICB1cGRhdGUgcGFja2FnZSBpbnN0YWxsYXRpb24uCkBAIC0xMjEsNiArMTI2LDExIEBACiAgIHJldHVybiBzdWJwcm9jZXNzLlBvcGVuKGFyZ3MsICoqa3dhcmdzKQogCiAKK2RlZiBSb3VuZFVwVG80Syh2YWx1ZSk6CisgIHJvdW5kZWRfdXAgPSB2YWx1ZSArIDQwOTUKKyAgcmV0dXJuIHJvdW5kZWRfdXAgLSAocm91bmRlZF91cCAlIDQwOTYpCisKKwogZGVmIENsb3NlSW5oZXJpdGVkUGlwZXMoKToKICAgIiIiIEdtYWtlIGluIE1BQyBPUyBoYXMgZmlsZSBkZXNjcmlwdG9yIChQSVBFKSBsZWFrLiBXZSBjbG9zZSB0aG9zZSBmZHMKICAgYmVmb3JlIGRvaW5nIG90aGVyIHdvcmsuIiIiCkBAIC0yMTEsMjEgKzIyMSw2IEBACiAgICAgICAgICAgICB2ZW5kb3JfYmFzZV9mc19maWxlLCkpCiAgICAgICAgIGRlbCBkWyJ2ZW5kb3JfYmFzZV9mc19maWxlIl0KIAotICB0cnk6Ci0gICAgZGF0YSA9IHJlYWRfaGVscGVyKCJNRVRBL2ltYWdlc2l6ZXMudHh0IikKLSAgICBmb3IgbGluZSBpbiBkYXRhLnNwbGl0KCJcbiIpOgotICAgICAgaWYgbm90IGxpbmU6Ci0gICAgICAgIGNvbnRpbnVlCi0gICAgICBuYW1lLCB2YWx1ZSA9IGxpbmUuc3BsaXQoIiAiLCAxKQotICAgICAgaWYgbm90IHZhbHVlOgotICAgICAgICBjb250aW51ZQotICAgICAgaWYgbmFtZSA9PSAiYmxvY2tzaXplIjoKLSAgICAgICAgZFtuYW1lXSA9IHZhbHVlCi0gICAgICBlbHNlOgotICAgICAgICBkW25hbWUgKyAiX3NpemUiXSA9IHZhbHVlCi0gIGV4Y2VwdCBLZXlFcnJvcjoKLSAgICBwYXNzCi0KICAgZGVmIG1ha2VpbnQoa2V5KToKICAgICBpZiBrZXkgaW4gZDoKICAgICAgIGRba2V5XSA9IGludChkW2tleV0sIDApCkBAIC0yNTIsMTUgKzI0NywzMCBAQAogICBlbHNlOgogICAgIGRbImZzdGFiIl0gPSBOb25lCiAKLSAgZFsiYnVpbGQucHJvcCJdID0gTG9hZEJ1aWxkUHJvcChyZWFkX2hlbHBlcikKKyAgZFsiYnVpbGQucHJvcCJdID0gTG9hZEJ1aWxkUHJvcChyZWFkX2hlbHBlciwgJ1NZU1RFTS9idWlsZC5wcm9wJykKKyAgZFsidmVuZG9yLmJ1aWxkLnByb3AiXSA9IExvYWRCdWlsZFByb3AocmVhZF9oZWxwZXIsICdWRU5ET1IvYnVpbGQucHJvcCcpCisKKyAgIyBTZXQgdXAgdGhlIHNhbHQgKGJhc2VkIG9uIGZpbmdlcnByaW50IG9yIHRodW1icHJpbnQpIHRoYXQgd2lsbCBiZSB1c2VkIHdoZW4KKyAgIyBhZGRpbmcgQVZCIGZvb3Rlci4KKyAgaWYgZC5nZXQoImF2Yl9lbmFibGUiKSA9PSAidHJ1ZSI6CisgICAgZnAgPSBOb25lCisgICAgaWYgImJ1aWxkLnByb3AiIGluIGQ6CisgICAgICBidWlsZF9wcm9wID0gZFsiYnVpbGQucHJvcCJdCisgICAgICBpZiAicm8uYnVpbGQuZmluZ2VycHJpbnQiIGluIGJ1aWxkX3Byb3A6CisgICAgICAgIGZwID0gYnVpbGRfcHJvcFsicm8uYnVpbGQuZmluZ2VycHJpbnQiXQorICAgICAgZWxpZiAicm8uYnVpbGQudGh1bWJwcmludCIgaW4gYnVpbGRfcHJvcDoKKyAgICAgICAgZnAgPSBidWlsZF9wcm9wWyJyby5idWlsZC50aHVtYnByaW50Il0KKyAgICBpZiBmcDoKKyAgICAgIGRbImF2Yl9zYWx0Il0gPSBzaGEyNTYoZnApLmhleGRpZ2VzdCgpCisKICAgcmV0dXJuIGQKIAogCi1kZWYgTG9hZEJ1aWxkUHJvcChyZWFkX2hlbHBlcik6CitkZWYgTG9hZEJ1aWxkUHJvcChyZWFkX2hlbHBlciwgcHJvcF9maWxlKToKICAgdHJ5OgotICAgIGRhdGEgPSByZWFkX2hlbHBlcigiU1lTVEVNL2J1aWxkLnByb3AiKQorICAgIGRhdGEgPSByZWFkX2hlbHBlcihwcm9wX2ZpbGUpCiAgIGV4Y2VwdCBLZXlFcnJvcjoKLSAgICBwcmludCgiV2FybmluZzogY291bGQgbm90IGZpbmQgU1lTVEVNL2J1aWxkLnByb3AgaW4gJXMiICUgKHppcCwpKQorICAgIHByaW50KCJXYXJuaW5nOiBjb3VsZCBub3QgcmVhZCAlcyIgJSAocHJvcF9maWxlLCkpCiAgICAgZGF0YSA9ICIiCiAgIHJldHVybiBMb2FkRGljdGlvbmFyeUZyb21MaW5lcyhkYXRhLnNwbGl0KCJcbiIpKQogCkBAIC00NDcsMTAgKzQ1NywxNyBAQAogICBlbHNlOgogICAgIGNtZC5leHRlbmQoWyItLW91dHB1dCIsIGltZy5uYW1lXSkKIAorICAjICJib290IiBvciAicmVjb3ZlcnkiLCB3aXRob3V0IGV4dGVuc2lvbi4KKyAgcGFydGl0aW9uX25hbWUgPSBvcy5wYXRoLmJhc2VuYW1lKHNvdXJjZWRpcikubG93ZXIoKQorCisgIGlmIChwYXJ0aXRpb25fbmFtZSA9PSAicmVjb3ZlcnkiIGFuZAorICAgICAgaW5mb19kaWN0LmdldCgiaW5jbHVkZV9yZWNvdmVyeV9kdGJvIikgPT0gInRydWUiKToKKyAgICBmbiA9IG9zLnBhdGguam9pbihzb3VyY2VkaXIsICJyZWNvdmVyeV9kdGJvIikKKyAgICBjbWQuZXh0ZW5kKFsiLS1yZWNvdmVyeV9kdGJvIiwgZm5dKQorCiAgIHAgPSBSdW4oY21kLCBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFKQogICBwLmNvbW11bmljYXRlKCkKLSAgYXNzZXJ0IHAucmV0dXJuY29kZSA9PSAwLCAibWtib290aW1nIG9mICVzIGltYWdlIGZhaWxlZCIgJSAoCi0gICAgICBvcy5wYXRoLmJhc2VuYW1lKHNvdXJjZWRpciksKQorICBhc3NlcnQgcC5yZXR1cm5jb2RlID09IDAsICJta2Jvb3RpbWcgb2YgJXMgaW1hZ2UgZmFpbGVkIiAlIChwYXJ0aXRpb25fbmFtZSwpCiAKICAgaWYgKGluZm9fZGljdC5nZXQoImJvb3Rfc2lnbmVyIiwgTm9uZSkgPT0gInRydWUiIGFuZAogICAgICAgaW5mb19kaWN0LmdldCgidmVyaXR5X2tleSIsIE5vbmUpKToKQEAgLTQ1OSw3ICs0NzYsNyBAQAogICAgIGlmIHR3b19zdGVwX2ltYWdlOgogICAgICAgcGF0aCA9ICIvYm9vdCIKICAgICBlbHNlOgotICAgICAgcGF0aCA9ICIvIiArIG9zLnBhdGguYmFzZW5hbWUoc291cmNlZGlyKS5sb3dlcigpCisgICAgICBwYXRoID0gIi8iICsgcGFydGl0aW9uX25hbWUKICAgICBjbWQgPSBbT1BUSU9OUy5ib290X3NpZ25lcl9wYXRoXQogICAgIGNtZC5leHRlbmQoT1BUSU9OUy5ib290X3NpZ25lcl9hcmdzKQogICAgIGNtZC5leHRlbmQoW3BhdGgsIGltZy5uYW1lLApAQCAtNDcxLDcgKzQ4OCw3IEBACiAKICAgIyBTaWduIHRoZSBpbWFnZSBpZiB2Ym9vdCBpcyBub24tZW1wdHkuCiAgIGVsaWYgaW5mb19kaWN0LmdldCgidmJvb3QiLCBOb25lKToKLSAgICBwYXRoID0gIi8iICsgb3MucGF0aC5iYXNlbmFtZShzb3VyY2VkaXIpLmxvd2VyKCkKKyAgICBwYXRoID0gIi8iICsgcGFydGl0aW9uX25hbWUKICAgICBpbWdfa2V5YmxvY2sgPSB0ZW1wZmlsZS5OYW1lZFRlbXBvcmFyeUZpbGUoKQogICAgICMgV2UgaGF2ZSBzd2l0Y2hlZCBmcm9tIHRoZSBwcmVidWlsdCBmdXRpbGl0eSBiaW5hcnkgdG8gdXNpbmcgdGhlIHRvb2wKICAgICAjIChmdXRpbGl0eS1ob3N0KSBidWlsdCBmcm9tIHRoZSBzb3VyY2UuIE92ZXJyaWRlIHRoZSBzZXR0aW5nIGluIHRoZSBvbGQKQEAgLTQ5MywyMCArNTEwLDIxIEBACiAgICAgaW1nX3Vuc2lnbmVkLmNsb3NlKCkKICAgICBpbWdfa2V5YmxvY2suY2xvc2UoKQogCi0gICMgQVZCOiBpZiBlbmFibGVkLCBjYWxjdWxhdGUgYW5kIGFkZCBoYXNoIHRvIGJvb3QuaW1nLgorICAjIEFWQjogaWYgZW5hYmxlZCwgY2FsY3VsYXRlIGFuZCBhZGQgaGFzaCB0byBib290LmltZyBvciByZWNvdmVyeS5pbWcuCiAgIGlmIGluZm9fZGljdC5nZXQoImF2Yl9lbmFibGUiKSA9PSAidHJ1ZSI6CiAgICAgYXZidG9vbCA9IG9zLmdldGVudignQVZCVE9PTCcpIG9yIGluZm9fZGljdFsiYXZiX2F2YnRvb2wiXQotICAgIHBhcnRfc2l6ZSA9IGluZm9fZGljdFsiYm9vdF9zaXplIl0KKyAgICBwYXJ0X3NpemUgPSBpbmZvX2RpY3RbcGFydGl0aW9uX25hbWUgKyAiX3NpemUiXQogICAgIGNtZCA9IFthdmJ0b29sLCAiYWRkX2hhc2hfZm9vdGVyIiwgIi0taW1hZ2UiLCBpbWcubmFtZSwKLSAgICAgICAgICAgIi0tcGFydGl0aW9uX3NpemUiLCBzdHIocGFydF9zaXplKSwgIi0tcGFydGl0aW9uX25hbWUiLCAiYm9vdCJdCi0gICAgQXBwZW5kQVZCU2lnbmluZ0FyZ3MoY21kLCAiYm9vdCIpCi0gICAgYXJncyA9IGluZm9fZGljdC5nZXQoImF2Yl9ib290X2FkZF9oYXNoX2Zvb3Rlcl9hcmdzIikKKyAgICAgICAgICAgIi0tcGFydGl0aW9uX3NpemUiLCBzdHIocGFydF9zaXplKSwgIi0tcGFydGl0aW9uX25hbWUiLAorICAgICAgICAgICBwYXJ0aXRpb25fbmFtZV0KKyAgICBBcHBlbmRBVkJTaWduaW5nQXJncyhjbWQsIHBhcnRpdGlvbl9uYW1lKQorICAgIGFyZ3MgPSBpbmZvX2RpY3QuZ2V0KCJhdmJfIiArIHBhcnRpdGlvbl9uYW1lICsgIl9hZGRfaGFzaF9mb290ZXJfYXJncyIpCiAgICAgaWYgYXJncyBhbmQgYXJncy5zdHJpcCgpOgogICAgICAgY21kLmV4dGVuZChzaGxleC5zcGxpdChhcmdzKSkKICAgICBwID0gUnVuKGNtZCwgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSkKICAgICBwLmNvbW11bmljYXRlKCkKICAgICBhc3NlcnQgcC5yZXR1cm5jb2RlID09IDAsICJhdmJ0b29sIGFkZF9oYXNoX2Zvb3RlciBvZiAlcyBmYWlsZWQiICUgKAotICAgICAgICBvcy5wYXRoLmJhc2VuYW1lKE9QVElPTlMuaW5wdXRfdG1wKSkKKyAgICAgICAgcGFydGl0aW9uX25hbWUsKQogCiAgIGltZy5zZWVrKG9zLlNFRUtfU0VULCAwKQogICBkYXRhID0gaW1nLnJlYWQoKQpAQCAtNTY1LDE4ICs1ODMsMTUgQEAKIAogCiBkZWYgVW56aXBUZW1wKGZpbGVuYW1lLCBwYXR0ZXJuPU5vbmUpOgotICAiIiJVbnppcCB0aGUgZ2l2ZW4gYXJjaGl2ZSBpbnRvIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSBhbmQgcmV0dXJuIHRoZSBuYW1lLgorICAiIiJVbnppcHMgdGhlIGdpdmVuIGFyY2hpdmUgaW50byBhIHRlbXBvcmFyeSBkaXJlY3RvcnkgYW5kIHJldHVybnMgdGhlIG5hbWUuCiAKLSAgSWYgZmlsZW5hbWUgaXMgb2YgdGhlIGZvcm0gImZvby56aXArYmFyLnppcCIsIHVuemlwIGZvby56aXAgaW50byBhCi0gIHRlbXAgZGlyLCB0aGVuIHVuemlwIGJhci56aXAgaW50byB0aGF0X2Rpci9CT09UQUJMRV9JTUFHRVMuCisgIElmIGZpbGVuYW1lIGlzIG9mIHRoZSBmb3JtICJmb28uemlwK2Jhci56aXAiLCB1bnppcCBmb28uemlwIGludG8gYSB0ZW1wIGRpciwKKyAgdGhlbiB1bnppcCBiYXIuemlwIGludG8gdGhhdF9kaXIvQk9PVEFCTEVfSU1BR0VTLgogCi0gIFJldHVybnMgKHRlbXBkaXIsIHppcG9iaikgd2hlcmUgemlwb2JqIGlzIGEgemlwZmlsZS5aaXBGaWxlIChvZiB0aGUKLSAgbWFpbiBmaWxlKSwgb3BlbiBmb3IgcmVhZGluZy4KKyAgUmV0dXJuczoKKyAgICBUaGUgbmFtZSBvZiB0aGUgdGVtcG9yYXJ5IGRpcmVjdG9yeS4KICAgIiIiCiAKLSAgdG1wID0gdGVtcGZpbGUubWtkdGVtcChwcmVmaXg9InRhcmdldGZpbGVzLSIpCi0gIE9QVElPTlMudGVtcGZpbGVzLmFwcGVuZCh0bXApCi0KICAgZGVmIHVuemlwX3RvX2RpcihmaWxlbmFtZSwgZGlybmFtZSk6CiAgICAgY21kID0gWyJ1bnppcCIsICItbyIsICItcSIsIGZpbGVuYW1lLCAiLWQiLCBkaXJuYW1lXQogICAgIGlmIHBhdHRlcm4gaXMgbm90IE5vbmU6CkBAIC01ODcsNiArNjAyLDcgQEAKICAgICAgIHJhaXNlIEV4dGVybmFsRXJyb3IoImZhaWxlZCB0byB1bnppcCBpbnB1dCB0YXJnZXQtZmlsZXMgXCIlc1wiIiAlCiAgICAgICAgICAgICAgICAgICAgICAgICAgIChmaWxlbmFtZSwpKQogCisgIHRtcCA9IE1ha2VUZW1wRGlyKHByZWZpeD0idGFyZ2V0ZmlsZXMtIikKICAgbSA9IHJlLm1hdGNoKHIiXiguKlsuXXppcClcKyguKlsuXXppcCkkIiwgZmlsZW5hbWUsIHJlLklHTk9SRUNBU0UpCiAgIGlmIG06CiAgICAgdW56aXBfdG9fZGlyKG0uZ3JvdXAoMSksIHRtcCkKQEAgLTU5NSw3ICs2MTEsNjYgQEAKICAgZWxzZToKICAgICB1bnppcF90b19kaXIoZmlsZW5hbWUsIHRtcCkKIAotICByZXR1cm4gdG1wLCB6aXBmaWxlLlppcEZpbGUoZmlsZW5hbWUsICJyIikKKyAgcmV0dXJuIHRtcAorCisKK2RlZiBHZXRTcGFyc2VJbWFnZSh3aGljaCwgdG1wZGlyLCBpbnB1dF96aXAsIGFsbG93X3NoYXJlZF9ibG9ja3MpOgorICAiIiJSZXR1cm5zIGEgU3BhcnNlSW1hZ2Ugb2JqZWN0IHN1aXRhYmxlIGZvciBwYXNzaW5nIHRvIEJsb2NrSW1hZ2VEaWZmLgorCisgIFRoaXMgZnVuY3Rpb24gbG9hZHMgdGhlIHNwZWNpZmllZCBzcGFyc2UgaW1hZ2UgZnJvbSB0aGUgZ2l2ZW4gcGF0aCwgYW5kCisgIHBlcmZvcm1zIGFkZGl0aW9uYWwgcHJvY2Vzc2luZyBmb3IgT1RBIHB1cnBvc2UuIEZvciBleGFtcGxlLCBpdCBhbHdheXMgYWRkcworICBibG9jayAwIHRvIGNsb2JiZXJlZCBibG9ja3MgbGlzdC4gSXQgYWxzbyBkZXRlY3RzIGZpbGVzIHRoYXQgY2Fubm90IGJlCisgIHJlY29uc3RydWN0ZWQgZnJvbSB0aGUgYmxvY2sgbGlzdCwgZm9yIHdob20gd2Ugc2hvdWxkIGF2b2lkIGFwcGx5aW5nIGltZ2RpZmYuCisKKyAgQXJnczoKKyAgICB3aGljaDogVGhlIHBhcnRpdGlvbiBuYW1lLCB3aGljaCBtdXN0IGJlICJzeXN0ZW0iIG9yICJ2ZW5kb3IiLgorICAgIHRtcGRpcjogVGhlIGRpcmVjdG9yeSB0aGF0IGNvbnRhaW5zIHRoZSBwcmVidWlsdCBpbWFnZSBhbmQgYmxvY2sgbWFwIGZpbGUuCisgICAgaW5wdXRfemlwOiBUaGUgdGFyZ2V0LWZpbGVzIFpJUCBhcmNoaXZlLgorICAgIGFsbG93X3NoYXJlZF9ibG9ja3M6IFdoZXRoZXIgaGF2aW5nIHNoYXJlZCBibG9ja3MgaXMgYWxsb3dlZC4KKworICBSZXR1cm5zOgorICAgIEEgU3BhcnNlSW1hZ2Ugb2JqZWN0LCB3aXRoIGZpbGVfbWFwIGluZm8gbG9hZGVkLgorICAiIiIKKyAgYXNzZXJ0IHdoaWNoIGluICgic3lzdGVtIiwgInZlbmRvciIpCisKKyAgcGF0aCA9IG9zLnBhdGguam9pbih0bXBkaXIsICJJTUFHRVMiLCB3aGljaCArICIuaW1nIikKKyAgbWFwcGF0aCA9IG9zLnBhdGguam9pbih0bXBkaXIsICJJTUFHRVMiLCB3aGljaCArICIubWFwIikKKworICAjIFRoZSBpbWFnZSBhbmQgbWFwIGZpbGVzIG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQgcHJpb3IgdG8gY2FsbGluZworICAjIG90YV9mcm9tX3RhcmdldF9maWxlcy5weSAoc2luY2UgTE1QKS4KKyAgYXNzZXJ0IG9zLnBhdGguZXhpc3RzKHBhdGgpIGFuZCBvcy5wYXRoLmV4aXN0cyhtYXBwYXRoKQorCisgICMgSW4gZXh0NCBmaWxlc3lzdGVtcywgYmxvY2sgMCBtaWdodCBiZSBjaGFuZ2VkIGV2ZW4gYmVpbmcgbW91bnRlZCBSL08uIFdlIGFkZAorICAjIGl0IHRvIGNsb2JiZXJlZF9ibG9ja3Mgc28gdGhhdCBpdCB3aWxsIGJlIHdyaXR0ZW4gdG8gdGhlIHRhcmdldAorICAjIHVuY29uZGl0aW9uYWxseS4gTm90ZSB0aGF0IHRoZXkgYXJlIHN0aWxsIHBhcnQgb2YgY2FyZV9tYXAuIChCdWc6IDIwOTM5MTMxKQorICBjbG9iYmVyZWRfYmxvY2tzID0gIjAiCisKKyAgaW1hZ2UgPSBzcGFyc2VfaW1nLlNwYXJzZUltYWdlKHBhdGgsIG1hcHBhdGgsIGNsb2JiZXJlZF9ibG9ja3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19zaGFyZWRfYmxvY2tzPWFsbG93X3NoYXJlZF9ibG9ja3MpCisKKyAgIyBibG9jay5tYXAgbWF5IGNvbnRhaW4gbGVzcyBibG9ja3MsIGJlY2F1c2UgbWtlMmZzIG1heSBza2lwIGFsbG9jYXRpbmcgYmxvY2tzCisgICMgaWYgdGhleSBjb250YWluIGFsbCB6ZXJvcy4gV2UgY2FuJ3QgcmVjb25zdHJ1Y3Qgc3VjaCBhIGZpbGUgZnJvbSBpdHMgYmxvY2sKKyAgIyBsaXN0LiBUYWcgc3VjaCBlbnRyaWVzIGFjY29yZGluZ2x5LiAoQnVnOiA2NTIxMzYxNikKKyAgZm9yIGVudHJ5IGluIGltYWdlLmZpbGVfbWFwOgorICAgICMgIi9zeXN0ZW0vZnJhbWV3b3JrL2FtLmphciIgPT4gIlNZU1RFTS9mcmFtZXdvcmsvYW0uamFyIi4KKyAgICBhcmNuYW1lID0gc3RyaW5nLnJlcGxhY2UoZW50cnksIHdoaWNoLCB3aGljaC51cHBlcigpLCAxKVsxOl0KKyAgICAjIFNraXAgYXJ0aWZpY2lhbCBuYW1lcywgc3VjaCBhcyAiX19aRVJPIiwgIl9fTk9OWkVSTy0xIi4KKyAgICBpZiBhcmNuYW1lIG5vdCBpbiBpbnB1dF96aXAubmFtZWxpc3QoKToKKyAgICAgIGNvbnRpbnVlCisKKyAgICBpbmZvID0gaW5wdXRfemlwLmdldGluZm8oYXJjbmFtZSkKKyAgICByYW5nZXMgPSBpbWFnZS5maWxlX21hcFtlbnRyeV0KKworICAgICMgSWYgYSBSYW5nZVNldCBoYXMgYmVlbiB0YWdnZWQgYXMgdXNpbmcgc2hhcmVkIGJsb2NrcyB3aGlsZSBsb2FkaW5nIHRoZQorICAgICMgaW1hZ2UsIGl0cyBibG9jayBsaXN0IG11c3QgYmUgYWxyZWFkeSBpbmNvbXBsZXRlIGR1ZSB0byB0aGF0IHJlYXNvbi4gRG9uJ3QKKyAgICAjIGdpdmUgaXQgJ2luY29tcGxldGUnIHRhZyB0byBhdm9pZCBtZXNzaW5nIHVwIHRoZSBpbWdkaWZmIHN0YXRzLgorICAgIGlmIHJhbmdlcy5leHRyYS5nZXQoJ3VzZXNfc2hhcmVkX2Jsb2NrcycpOgorICAgICAgY29udGludWUKKworICAgIGlmIFJvdW5kVXBUbzRLKGluZm8uZmlsZV9zaXplKSA+IHJhbmdlcy5zaXplKCkgKiA0MDk2OgorICAgICAgcmFuZ2VzLmV4dHJhWydpbmNvbXBsZXRlJ10gPSBUcnVlCisKKyAgcmV0dXJuIGltYWdlCiAKIAogZGVmIEdldEtleVBhc3N3b3JkcyhrZXlsaXN0KToKQEAgLTczNCwxMCArODA5LDE4IEBACiAKIAogZGVmIENoZWNrU2l6ZShkYXRhLCB0YXJnZXQsIGluZm9fZGljdCk6Ci0gICIiIkNoZWNrIHRoZSBkYXRhIHN0cmluZyBwYXNzZWQgYWdhaW5zdCB0aGUgbWF4IHNpemUgbGltaXQsIGlmCi0gIGFueSwgZm9yIHRoZSBnaXZlbiB0YXJnZXQuICBSYWlzZSBleGNlcHRpb24gaWYgdGhlIGRhdGEgaXMgdG9vIGJpZy4KLSAgUHJpbnQgYSB3YXJuaW5nIGlmIHRoZSBkYXRhIGlzIG5lYXJpbmcgdGhlIG1heGltdW0gc2l6ZS4iIiIKKyAgIiIiQ2hlY2tzIHRoZSBkYXRhIHN0cmluZyBwYXNzZWQgYWdhaW5zdCB0aGUgbWF4IHNpemUgbGltaXQuCiAKKyAgRm9yIG5vbi1BVkIgaW1hZ2VzLCByYWlzZSBleGNlcHRpb24gaWYgdGhlIGRhdGEgaXMgdG9vIGJpZy4gUHJpbnQgYSB3YXJuaW5nCisgIGlmIHRoZSBkYXRhIGlzIG5lYXJpbmcgdGhlIG1heGltdW0gc2l6ZS4KKworICBGb3IgQVZCIGltYWdlcywgdGhlIGFjdHVhbCBpbWFnZSBzaXplIHNob3VsZCBiZSBpZGVudGljYWwgdG8gdGhlIGxpbWl0LgorCisgIEFyZ3M6CisgICAgZGF0YTogQSBzdHJpbmcgdGhhdCBjb250YWlucyBhbGwgdGhlIGRhdGEgZm9yIHRoZSBwYXJ0aXRpb24uCisgICAgdGFyZ2V0OiBUaGUgcGFydGl0aW9uIG5hbWUuIFRoZSAiLmltZyIgc3VmZml4IGlzIG9wdGlvbmFsLgorICAgIGluZm9fZGljdDogVGhlIGRpY3QgdG8gYmUgbG9va2VkIHVwIGZvciByZWxldmFudCBpbmZvLgorICAiIiIKICAgaWYgdGFyZ2V0LmVuZHN3aXRoKCIuaW1nIik6CiAgICAgdGFyZ2V0ID0gdGFyZ2V0WzotNF0KICAgbW91bnRfcG9pbnQgPSAiLyIgKyB0YXJnZXQKQEAgLTc1NywyMiArODQwLDQxIEBACiAgICAgcmV0dXJuCiAKICAgc2l6ZSA9IGxlbihkYXRhKQotICBwY3QgPSBmbG9hdChzaXplKSAqIDEwMC4wIC8gbGltaXQKLSAgbXNnID0gIiVzIHNpemUgKCVkKSBpcyAlLjJmJSUgb2YgbGltaXQgKCVkKSIgJSAodGFyZ2V0LCBzaXplLCBwY3QsIGxpbWl0KQotICBpZiBwY3QgPj0gOTkuMDoKLSAgICByYWlzZSBFeHRlcm5hbEVycm9yKG1zZykKLSAgZWxpZiBwY3QgPj0gOTUuMDoKLSAgICBwcmludCgiXG4gIFdBUk5JTkc6ICVzXG4iICUgKG1zZywpKQotICBlbGlmIE9QVElPTlMudmVyYm9zZToKLSAgICBwcmludCgiICAiLCBtc2cpCisgICMgdGFyZ2V0IGNvdWxkIGJlICd1c2VyZGF0YScgb3IgJ2NhY2hlJy4gVGhleSBzaG91bGQgZm9sbG93IHRoZSBub24tQVZCIGltYWdlCisgICMgcGF0aC4KKyAgaWYgaW5mb19kaWN0LmdldCgiYXZiX2VuYWJsZSIpID09ICJ0cnVlIiBhbmQgdGFyZ2V0IGluIEFWQl9QQVJUSVRJT05TOgorICAgIGlmIHNpemUgIT0gbGltaXQ6CisgICAgICByYWlzZSBFeHRlcm5hbEVycm9yKAorICAgICAgICAgICJNaXNtYXRjaGluZyBpbWFnZSBzaXplIGZvciAlczogZXhwZWN0ZWQgJWQgYWN0dWFsICVkIiAlICgKKyAgICAgICAgICAgICAgdGFyZ2V0LCBsaW1pdCwgc2l6ZSkpCisgIGVsc2U6CisgICAgcGN0ID0gZmxvYXQoc2l6ZSkgKiAxMDAuMCAvIGxpbWl0CisgICAgbXNnID0gIiVzIHNpemUgKCVkKSBpcyAlLjJmJSUgb2YgbGltaXQgKCVkKSIgJSAodGFyZ2V0LCBzaXplLCBwY3QsIGxpbWl0KQorICAgIGlmIHBjdCA+PSA5OS4wOgorICAgICAgcmFpc2UgRXh0ZXJuYWxFcnJvcihtc2cpCisgICAgZWxpZiBwY3QgPj0gOTUuMDoKKyAgICAgIHByaW50KCJcbiAgV0FSTklORzogJXNcbiIgJSAobXNnLCkpCisgICAgZWxpZiBPUFRJT05TLnZlcmJvc2U6CisgICAgICBwcmludCgiICAiLCBtc2cpCiAKIAogZGVmIFJlYWRBcGtDZXJ0cyh0Zl96aXApOgotICAiIiJHaXZlbiBhIHRhcmdldF9maWxlcyBaaXBGaWxlLCBwYXJzZSB0aGUgTUVUQS9hcGtjZXJ0cy50eHQgZmlsZQotICBhbmQgcmV0dXJuIGEgdHVwbGUgd2l0aCB0aGUgZm9sbG93aW5nIGVsZW1lbnRzOiAoMSkgYSBkaWN0aW9uYXJ5IHRoYXQgbWFwcwotICBwYWNrYWdlcyB0byBjZXJ0cyAoYmFzZWQgb24gdGhlICJjZXJ0aWZpY2F0ZSIgYW5kICJwcml2YXRlX2tleSIgYXR0cmlidXRlcwotICBpbiB0aGUgZmlsZS4gKDIpIEEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgZXh0ZW5zaW9uIG9mIGNvbXByZXNzZWQgQVBLcyBpbgotICB0aGUgdGFyZ2V0IGZpbGVzIChlLmcgIi5neiIgIi5icm8iKS4iIiIKKyAgIiIiUGFyc2VzIHRoZSBBUEsgY2VydHMgaW5mbyBmcm9tIGEgZ2l2ZW4gdGFyZ2V0LWZpbGVzIHppcC4KKworICBHaXZlbiBhIHRhcmdldC1maWxlcyBaaXBGaWxlLCBwYXJzZXMgdGhlIE1FVEEvYXBrY2VydHMudHh0IGVudHJ5IGFuZCByZXR1cm5zIGEKKyAgdHVwbGUgd2l0aCB0aGUgZm9sbG93aW5nIGVsZW1lbnRzOiAoMSkgYSBkaWN0aW9uYXJ5IHRoYXQgbWFwcyBwYWNrYWdlcyB0bworICBjZXJ0cyAoYmFzZWQgb24gdGhlICJjZXJ0aWZpY2F0ZSIgYW5kICJwcml2YXRlX2tleSIgYXR0cmlidXRlcyBpbiB0aGUgZmlsZTsKKyAgKDIpIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgZXh0ZW5zaW9uIG9mIGNvbXByZXNzZWQgQVBLcyBpbiB0aGUgdGFyZ2V0IGZpbGVzCisgIChlLmcgIi5neiIsICIuYnJvIikuCisKKyAgQXJnczoKKyAgICB0Zl96aXA6IFRoZSBpbnB1dCB0YXJnZXRfZmlsZXMgWmlwRmlsZSAoYWxyZWFkeSBvcGVuKS4KKworICBSZXR1cm5zOgorICAgIChjZXJ0bWFwLCBleHQpOiBjZXJ0bWFwIGlzIGEgZGljdGlvbmFyeSB0aGF0IG1hcHMgcGFja2FnZXMgdG8gY2VydHM7IGV4dCBpcworICAgICAgICB0aGUgZXh0ZW5zaW9uIHN0cmluZyBvZiBjb21wcmVzc2VkIEFQS3MgKGUuZy4gIi5neiIpLCBvciBOb25lIGlmIHRoZXJlJ3MKKyAgICAgICAgbm8gY29tcHJlc3NlZCBBUEtzLgorICAiIiIKICAgY2VydG1hcCA9IHt9CiAgIGNvbXByZXNzZWRfZXh0ZW5zaW9uID0gTm9uZQogCkBAIC03ODgsNDEgKzg5MCw1MSBAQAogICAgIGxpbmUgPSBsaW5lLnN0cmlwKCkKICAgICBpZiBub3QgbGluZToKICAgICAgIGNvbnRpbnVlCi0gICAgbSA9IHJlLm1hdGNoKHInXm5hbWU9Iig/UDxOQU1FPi4qKSJccytjZXJ0aWZpY2F0ZT0iKD9QPENFUlQ+LiopIlxzKycKLSAgICAgICAgICAgICAgICAgcidwcml2YXRlX2tleT0iKD9QPFBSSVZLRVk+Lio/KSIoXHMrY29tcHJlc3NlZD0iKD9QPENPTVBSRVNTRUQ+LiopIik/JCcsCi0gICAgICAgICAgICAgICAgIGxpbmUpCi0gICAgaWYgbToKLSAgICAgIG1hdGNoZXMgPSBtLmdyb3VwZGljdCgpCi0gICAgICBjZXJ0ID0gbWF0Y2hlc1siQ0VSVCJdCi0gICAgICBwcml2a2V5ID0gbWF0Y2hlc1siUFJJVktFWSJdCi0gICAgICBuYW1lID0gbWF0Y2hlc1siTkFNRSJdCi0gICAgICB0aGlzX2NvbXByZXNzZWRfZXh0ZW5zaW9uID0gbWF0Y2hlc1siQ09NUFJFU1NFRCJdCi0gICAgICBwdWJsaWNfa2V5X3N1ZmZpeF9sZW4gPSBsZW4oT1BUSU9OUy5wdWJsaWNfa2V5X3N1ZmZpeCkKLSAgICAgIHByaXZhdGVfa2V5X3N1ZmZpeF9sZW4gPSBsZW4oT1BUSU9OUy5wcml2YXRlX2tleV9zdWZmaXgpCi0gICAgICBpZiBjZXJ0IGluIFNQRUNJQUxfQ0VSVF9TVFJJTkdTIGFuZCBub3QgcHJpdmtleToKLSAgICAgICAgY2VydG1hcFtuYW1lXSA9IGNlcnQKLSAgICAgIGVsaWYgKGNlcnQuZW5kc3dpdGgoT1BUSU9OUy5wdWJsaWNfa2V5X3N1ZmZpeCkgYW5kCi0gICAgICAgICAgICBwcml2a2V5LmVuZHN3aXRoKE9QVElPTlMucHJpdmF0ZV9rZXlfc3VmZml4KSBhbmQKLSAgICAgICAgICAgIGNlcnRbOi1wdWJsaWNfa2V5X3N1ZmZpeF9sZW5dID09IHByaXZrZXlbOi1wcml2YXRlX2tleV9zdWZmaXhfbGVuXSk6Ci0gICAgICAgIGNlcnRtYXBbbmFtZV0gPSBjZXJ0WzotcHVibGljX2tleV9zdWZmaXhfbGVuXQotICAgICAgZWxzZToKLSAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiZmFpbGVkIHRvIHBhcnNlIGxpbmUgZnJvbSBhcGtjZXJ0cy50eHQ6XG4iICsgbGluZSkKLSAgICAgIGlmIHRoaXNfY29tcHJlc3NlZF9leHRlbnNpb246Ci0gICAgICAgICMgT25seSBjb3VudCB0aGUgaW5zdGFsbGVkIGZpbGVzLgotICAgICAgICBmaWxlbmFtZSA9IG5hbWUgKyAnLicgKyB0aGlzX2NvbXByZXNzZWRfZXh0ZW5zaW9uCi0gICAgICAgIGlmIGZpbGVuYW1lIG5vdCBpbiBpbnN0YWxsZWRfZmlsZXM6Ci0gICAgICAgICAgY29udGludWUKLSAgICAgICAgIyBNYWtlIHN1cmUgdGhhdCBhbGwgdGhlIHZhbHVlcyBpbiB0aGUgY29tcHJlc3Npb24gbWFwIGhhdmUgdGhlIHNhbWUKLSAgICAgICAgIyBleHRlbnNpb24uIFdlIGRvbid0IHN1cHBvcnQgbXVsdGlwbGUgY29tcHJlc3Npb24gbWV0aG9kcyBpbiB0aGUgc2FtZQotICAgICAgICAjIHN5c3RlbSBpbWFnZS4KLSAgICAgICAgaWYgY29tcHJlc3NlZF9leHRlbnNpb246Ci0gICAgICAgICAgaWYgdGhpc19jb21wcmVzc2VkX2V4dGVuc2lvbiAhPSBjb21wcmVzc2VkX2V4dGVuc2lvbjoKLSAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIm11bHRpcGxlIGNvbXByZXNzZWQgZXh0ZW5zaW9ucyA6ICVzIHZzICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbXByZXNzZWRfZXh0ZW5zaW9uLCB0aGlzX2NvbXByZXNzZWRfZXh0ZW5zaW9uKSkKLSAgICAgICAgZWxzZToKLSAgICAgICAgICBjb21wcmVzc2VkX2V4dGVuc2lvbiA9IHRoaXNfY29tcHJlc3NlZF9leHRlbnNpb24KKyAgICBtID0gcmUubWF0Y2goCisgICAgICAgIHInXm5hbWU9Iig/UDxOQU1FPi4qKSJccytjZXJ0aWZpY2F0ZT0iKD9QPENFUlQ+LiopIlxzKycKKyAgICAgICAgcidwcml2YXRlX2tleT0iKD9QPFBSSVZLRVk+Lio/KSIoXHMrY29tcHJlc3NlZD0iKD9QPENPTVBSRVNTRUQ+LiopIik/JCcsCisgICAgICAgIGxpbmUpCisgICAgaWYgbm90IG06CisgICAgICBjb250aW51ZQogCi0gIHJldHVybiAoY2VydG1hcCwgKCIuIiArIGNvbXByZXNzZWRfZXh0ZW5zaW9uKSBpZiBjb21wcmVzc2VkX2V4dGVuc2lvbiBlbHNlIE5vbmUpCisgICAgbWF0Y2hlcyA9IG0uZ3JvdXBkaWN0KCkKKyAgICBjZXJ0ID0gbWF0Y2hlc1siQ0VSVCJdCisgICAgcHJpdmtleSA9IG1hdGNoZXNbIlBSSVZLRVkiXQorICAgIG5hbWUgPSBtYXRjaGVzWyJOQU1FIl0KKyAgICB0aGlzX2NvbXByZXNzZWRfZXh0ZW5zaW9uID0gbWF0Y2hlc1siQ09NUFJFU1NFRCJdCisKKyAgICBwdWJsaWNfa2V5X3N1ZmZpeF9sZW4gPSBsZW4oT1BUSU9OUy5wdWJsaWNfa2V5X3N1ZmZpeCkKKyAgICBwcml2YXRlX2tleV9zdWZmaXhfbGVuID0gbGVuKE9QVElPTlMucHJpdmF0ZV9rZXlfc3VmZml4KQorICAgIGlmIGNlcnQgaW4gU1BFQ0lBTF9DRVJUX1NUUklOR1MgYW5kIG5vdCBwcml2a2V5OgorICAgICAgY2VydG1hcFtuYW1lXSA9IGNlcnQKKyAgICBlbGlmIChjZXJ0LmVuZHN3aXRoKE9QVElPTlMucHVibGljX2tleV9zdWZmaXgpIGFuZAorICAgICAgICAgIHByaXZrZXkuZW5kc3dpdGgoT1BUSU9OUy5wcml2YXRlX2tleV9zdWZmaXgpIGFuZAorICAgICAgICAgIGNlcnRbOi1wdWJsaWNfa2V5X3N1ZmZpeF9sZW5dID09IHByaXZrZXlbOi1wcml2YXRlX2tleV9zdWZmaXhfbGVuXSk6CisgICAgICBjZXJ0bWFwW25hbWVdID0gY2VydFs6LXB1YmxpY19rZXlfc3VmZml4X2xlbl0KKyAgICBlbHNlOgorICAgICAgcmFpc2UgVmFsdWVFcnJvcigiRmFpbGVkIHRvIHBhcnNlIGxpbmUgZnJvbSBhcGtjZXJ0cy50eHQ6XG4iICsgbGluZSkKKworICAgIGlmIG5vdCB0aGlzX2NvbXByZXNzZWRfZXh0ZW5zaW9uOgorICAgICAgY29udGludWUKKworICAgICMgT25seSBjb3VudCB0aGUgaW5zdGFsbGVkIGZpbGVzLgorICAgIGZpbGVuYW1lID0gbmFtZSArICcuJyArIHRoaXNfY29tcHJlc3NlZF9leHRlbnNpb24KKyAgICBpZiBmaWxlbmFtZSBub3QgaW4gaW5zdGFsbGVkX2ZpbGVzOgorICAgICAgY29udGludWUKKworICAgICMgTWFrZSBzdXJlIHRoYXQgYWxsIHRoZSB2YWx1ZXMgaW4gdGhlIGNvbXByZXNzaW9uIG1hcCBoYXZlIHRoZSBzYW1lCisgICAgIyBleHRlbnNpb24uIFdlIGRvbid0IHN1cHBvcnQgbXVsdGlwbGUgY29tcHJlc3Npb24gbWV0aG9kcyBpbiB0aGUgc2FtZQorICAgICMgc3lzdGVtIGltYWdlLgorICAgIGlmIGNvbXByZXNzZWRfZXh0ZW5zaW9uOgorICAgICAgaWYgdGhpc19jb21wcmVzc2VkX2V4dGVuc2lvbiAhPSBjb21wcmVzc2VkX2V4dGVuc2lvbjoKKyAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigKKyAgICAgICAgICAgICJNdWx0aXBsZSBjb21wcmVzc2VkIGV4dGVuc2lvbnM6IHt9IHZzIHt9Ii5mb3JtYXQoCisgICAgICAgICAgICAgICAgY29tcHJlc3NlZF9leHRlbnNpb24sIHRoaXNfY29tcHJlc3NlZF9leHRlbnNpb24pKQorICAgIGVsc2U6CisgICAgICBjb21wcmVzc2VkX2V4dGVuc2lvbiA9IHRoaXNfY29tcHJlc3NlZF9leHRlbnNpb24KKworICByZXR1cm4gKGNlcnRtYXAsCisgICAgICAgICAgKCIuIiArIGNvbXByZXNzZWRfZXh0ZW5zaW9uKSBpZiBjb21wcmVzc2VkX2V4dGVuc2lvbiBlbHNlIE5vbmUpCiAKIAogQ09NTU9OX0RPQ1NUUklORyA9ICIiIgpAQCAtOTMwLDEyICsxMDQyLDI0IEBACiAgIHJldHVybiBmbgogCiAKK2RlZiBNYWtlVGVtcERpcihwcmVmaXg9J3RtcCcsIHN1ZmZpeD0nJyk6CisgICIiIk1ha2VzIGEgdGVtcG9yYXJ5IGRpciB0aGF0IHdpbGwgYmUgY2xlYW5lZCB1cCB3aXRoIGEgY2FsbCB0byBDbGVhbnVwKCkuCisKKyAgUmV0dXJuczoKKyAgICBUaGUgYWJzb2x1dGUgcGF0aG5hbWUgb2YgdGhlIG5ldyBkaXJlY3RvcnkuCisgICIiIgorICBkaXJfbmFtZSA9IHRlbXBmaWxlLm1rZHRlbXAoc3VmZml4PXN1ZmZpeCwgcHJlZml4PXByZWZpeCkKKyAgT1BUSU9OUy50ZW1wZmlsZXMuYXBwZW5kKGRpcl9uYW1lKQorICByZXR1cm4gZGlyX25hbWUKKworCiBkZWYgQ2xlYW51cCgpOgogICBmb3IgaSBpbiBPUFRJT05TLnRlbXBmaWxlczoKICAgICBpZiBvcy5wYXRoLmlzZGlyKGkpOgotICAgICAgc2h1dGlsLnJtdHJlZShpKQorICAgICAgc2h1dGlsLnJtdHJlZShpLCBpZ25vcmVfZXJyb3JzPVRydWUpCiAgICAgZWxzZToKICAgICAgIG9zLnJlbW92ZShpKQorICBkZWwgT1BUSU9OUy50ZW1wZmlsZXNbOl0KIAogCiBjbGFzcyBQYXNzd29yZE1hbmFnZXIob2JqZWN0KToKQEAgLTExMjIsNiArMTI0NiwyOCBAQAogICB6aXBmaWxlLlpJUDY0X0xJTUlUID0gc2F2ZWRfemlwNjRfbGltaXQKIAogCitkZWYgWmlwRGVsZXRlKHppcF9maWxlbmFtZSwgZW50cmllcyk6CisgICIiIkRlbGV0ZXMgZW50cmllcyBmcm9tIGEgWklQIGZpbGUuCisKKyAgU2luY2UgZGVsZXRpbmcgZW50cmllcyBmcm9tIGEgWklQIGZpbGUgaXMgbm90IHN1cHBvcnRlZCwgaXQgc2hlbGxzIG91dCB0bworICAnemlwIC1kJy4KKworICBBcmdzOgorICAgIHppcF9maWxlbmFtZTogVGhlIG5hbWUgb2YgdGhlIFpJUCBmaWxlLgorICAgIGVudHJpZXM6IFRoZSBuYW1lIG9mIHRoZSBlbnRyeSwgb3IgdGhlIGxpc3Qgb2YgbmFtZXMgdG8gYmUgZGVsZXRlZC4KKworICBSYWlzZXM6CisgICAgQXNzZXJ0aW9uRXJyb3I6IEluIGNhc2Ugb2Ygbm9uLXplcm8gcmV0dXJuIGZyb20gJ3ppcCcuCisgICIiIgorICBpZiBpc2luc3RhbmNlKGVudHJpZXMsIGJhc2VzdHJpbmcpOgorICAgIGVudHJpZXMgPSBbZW50cmllc10KKyAgY21kID0gWyJ6aXAiLCAiLWQiLCB6aXBfZmlsZW5hbWVdICsgZW50cmllcworICBwcm9jID0gUnVuKGNtZCwgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwgc3RkZXJyPXN1YnByb2Nlc3MuU1RET1VUKQorICBzdGRvdXRkYXRhLCBfID0gcHJvYy5jb21tdW5pY2F0ZSgpCisgIGFzc2VydCBwcm9jLnJldHVybmNvZGUgPT0gMCwgIkZhaWxlZCB0byBkZWxldGUgJXM6XG4lcyIgJSAoZW50cmllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRvdXRkYXRhKQorCisKIGRlZiBaaXBDbG9zZSh6aXBfZmlsZSk6CiAgICMgaHR0cDovL2IvMTgwMTUyNDYKICAgIyB6aXBmaWxlIGFsc28gcmVmZXJzIHRvIFpJUDY0X0xJTUlUIGR1cmluZyBjbG9zZSgpIHdoZW4gaXQgd3JpdGVzIG91dCB0aGUKQEAgLTEzMDYsNyArMTQ1Miw3IEBACiAgICAgICAgICAgcC5raWxsKCkKICAgICAgICAgICB0aC5qb2luKCkKIAotICAgICAgaWYgZXJyIG9yIHAucmV0dXJuY29kZSAhPSAwOgorICAgICAgaWYgcC5yZXR1cm5jb2RlICE9IDA6CiAgICAgICAgIHByaW50KCJXQVJOSU5HOiBmYWlsdXJlIHJ1bm5pbmcgJXM6XG4lc1xuIiAlICgKICAgICAgICAgICAgIGRpZmZfcHJvZ3JhbSwgIiIuam9pbihlcnIpKSkKICAgICAgICAgc2VsZi5wYXRjaCA9IE5vbmUKQEAgLTEzODQsMjAgKzE1MzAsMTYgQEAKICAgICBzZWxmLmRpc2FibGVfaW1nZGlmZiA9IGRpc2FibGVfaW1nZGlmZgogCiAgICAgaWYgdmVyc2lvbiBpcyBOb25lOgotICAgICAgdmVyc2lvbiA9IDEKLSAgICAgIGlmIE9QVElPTlMuaW5mb19kaWN0OgotICAgICAgICB2ZXJzaW9uID0gbWF4KAotICAgICAgICAgICAgaW50KGkpIGZvciBpIGluCi0gICAgICAgICAgICBPUFRJT05TLmluZm9fZGljdC5nZXQoImJsb2NraW1nZGlmZl92ZXJzaW9ucyIsICIxIikuc3BsaXQoIiwiKSkKKyAgICAgIHZlcnNpb24gPSBtYXgoCisgICAgICAgICAgaW50KGkpIGZvciBpIGluCisgICAgICAgICAgT1BUSU9OUy5pbmZvX2RpY3QuZ2V0KCJibG9ja2ltZ2RpZmZfdmVyc2lvbnMiLCAiMSIpLnNwbGl0KCIsIikpCiAgICAgYXNzZXJ0IHZlcnNpb24gPj0gMwogICAgIHNlbGYudmVyc2lvbiA9IHZlcnNpb24KIAogICAgIGIgPSBibG9ja2ltZ2RpZmYuQmxvY2tJbWFnZURpZmYodGd0LCBzcmMsIHRocmVhZHM9T1BUSU9OUy53b3JrZXJfdGhyZWFkcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb249c2VsZi52ZXJzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZV9pbWdkaWZmPXNlbGYuZGlzYWJsZV9pbWdkaWZmKQotICAgIHRtcGRpciA9IHRlbXBmaWxlLm1rZHRlbXAoKQotICAgIE9QVElPTlMudGVtcGZpbGVzLmFwcGVuZCh0bXBkaXIpCi0gICAgc2VsZi5wYXRoID0gb3MucGF0aC5qb2luKHRtcGRpciwgcGFydGl0aW9uKQorICAgIHNlbGYucGF0aCA9IG9zLnBhdGguam9pbihNYWtlVGVtcERpcigpLCBwYXJ0aXRpb24pCiAgICAgYi5Db21wdXRlKHNlbGYucGF0aCkKICAgICBzZWxmLl9yZXF1aXJlZF9jYWNoZSA9IGIubWF4X3N0YXNoZWRfc2l6ZQogICAgIHNlbGYudG91Y2hlZF9zcmNfcmFuZ2VzID0gYi50b3VjaGVkX3NyY19yYW5nZXMKQEAgLTE1NzAsMTEgKzE3MTIsMTEgQEAKICAgICAjICAgZGVjb21wcmVzc2lvbl90aW1lOiAxNXMgIHwgMjVzICAgICAgICAgICAgICAgIHwgMjVzCiAKICAgICBpZiBub3Qgc2VsZi5zcmM6Ci0gICAgICBicm9fY21kID0gWydicm8nLCAnLS1xdWFsaXR5JywgJzYnLAotICAgICAgICAgICAgICAgICAnLS1pbnB1dCcsICd7fS5uZXcuZGF0Jy5mb3JtYXQoc2VsZi5wYXRoKSwKLSAgICAgICAgICAgICAgICAgJy0tb3V0cHV0JywgJ3t9Lm5ldy5kYXQuYnInLmZvcm1hdChzZWxmLnBhdGgpXQorICAgICAgYnJvdGxpX2NtZCA9IFsnYnJvdGxpJywgJy0tcXVhbGl0eT02JywKKyAgICAgICAgICAgICAgICAgICAgJy0tb3V0cHV0PXt9Lm5ldy5kYXQuYnInLmZvcm1hdChzZWxmLnBhdGgpLAorICAgICAgICAgICAgICAgICAgICAne30ubmV3LmRhdCcuZm9ybWF0KHNlbGYucGF0aCldCiAgICAgICBwcmludCgiQ29tcHJlc3Npbmcge30ubmV3LmRhdCB3aXRoIGJyb3RsaSIuZm9ybWF0KHNlbGYucGFydGl0aW9uKSkKLSAgICAgIHAgPSBSdW4oYnJvX2NtZCwgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSkKKyAgICAgIHAgPSBSdW4oYnJvdGxpX2NtZCwgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSkKICAgICAgIHAuY29tbXVuaWNhdGUoKQogICAgICAgYXNzZXJ0IHAucmV0dXJuY29kZSA9PSAwLFwKICAgICAgICAgICAnY29tcHJlc3Npb24gb2Yge30ubmV3LmRhdCBmYWlsZWQnLmZvcm1hdChzZWxmLnBhcnRpdGlvbikKQEAgLTE2NDUsNTAgKzE3ODcsOTMgQEAKIAogCiBkZWYgUGFyc2VDZXJ0aWZpY2F0ZShkYXRhKToKLSAgIiIiUGFyc2UgYSBQRU0tZm9ybWF0IGNlcnRpZmljYXRlLiIiIgotICBjZXJ0ID0gW10KKyAgIiIiUGFyc2VzIGFuZCBjb252ZXJ0cyBhIFBFTS1lbmNvZGVkIGNlcnRpZmljYXRlIGludG8gREVSLWVuY29kZWQuCisKKyAgVGhpcyBnaXZlcyB0aGUgc2FtZSByZXN1bHQgYXMgYG9wZW5zc2wgeDUwOSAtaW4gPGZpbGVuYW1lPiAtb3V0Zm9ybSBERVJgLgorCisgIFJldHVybnM6CisgICAgVGhlIGRlY29kZWQgY2VydGlmaWNhdGUgc3RyaW5nLgorICAiIiIKKyAgY2VydF9idWZmZXIgPSBbXQogICBzYXZlID0gRmFsc2UKICAgZm9yIGxpbmUgaW4gZGF0YS5zcGxpdCgiXG4iKToKICAgICBpZiAiLS1FTkQgQ0VSVElGSUNBVEUtLSIgaW4gbGluZToKICAgICAgIGJyZWFrCiAgICAgaWYgc2F2ZToKLSAgICAgIGNlcnQuYXBwZW5kKGxpbmUpCisgICAgICBjZXJ0X2J1ZmZlci5hcHBlbmQobGluZSkKICAgICBpZiAiLS1CRUdJTiBDRVJUSUZJQ0FURS0tIiBpbiBsaW5lOgogICAgICAgc2F2ZSA9IFRydWUKLSAgY2VydCA9ICIiLmpvaW4oY2VydCkuZGVjb2RlKCdiYXNlNjQnKQorICBjZXJ0ID0gIiIuam9pbihjZXJ0X2J1ZmZlcikuZGVjb2RlKCdiYXNlNjQnKQogICByZXR1cm4gY2VydAogCisKK2RlZiBFeHRyYWN0UHVibGljS2V5KGNlcnQpOgorICAiIiJFeHRyYWN0cyB0aGUgcHVibGljIGtleSAoUEVNLWVuY29kZWQpIGZyb20gdGhlIGdpdmVuIGNlcnRpZmljYXRlIGZpbGUuCisKKyAgQXJnczoKKyAgICBjZXJ0OiBUaGUgY2VydGlmaWNhdGUgZmlsZW5hbWUuCisKKyAgUmV0dXJuczoKKyAgICBUaGUgcHVibGljIGtleSBzdHJpbmcuCisKKyAgUmFpc2VzOgorICAgIEFzc2VydGlvbkVycm9yOiBPbiBub24temVybyByZXR1cm4gZnJvbSAnb3BlbnNzbCcuCisgICIiIgorICAjIFRoZSBiZWhhdmlvciB3aXRoICctb3V0JyBpcyBkaWZmZXJlbnQgYmV0d2VlbiBvcGVuc3NsIDEuMSBhbmQgb3BlbnNzbCAxLjAuCisgICMgV2hpbGUgb3BlbnNzbCAxLjEgd3JpdGVzIHRoZSBrZXkgaW50byB0aGUgZ2l2ZW4gZmlsZW5hbWUgZm9sbG93ZWQgYnkgJy1vdXQnLAorICAjIG9wZW5zc2wgMS4wIChib3RoIG9mIDEuMC4xIGFuZCAxLjAuMikgZG9lc24ndC4gU28gd2UgY29sbGVjdCB0aGUgb3V0cHV0IGZyb20KKyAgIyBzdGRvdXQgaW5zdGVhZC4KKyAgY21kID0gWydvcGVuc3NsJywgJ3g1MDknLCAnLXB1YmtleScsICctbm9vdXQnLCAnLWluJywgY2VydF0KKyAgcHJvYyA9IFJ1bihjbWQsIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsIHN0ZGVycj1zdWJwcm9jZXNzLlBJUEUpCisgIHB1YmtleSwgc3RkZXJyZGF0YSA9IHByb2MuY29tbXVuaWNhdGUoKQorICBhc3NlcnQgcHJvYy5yZXR1cm5jb2RlID09IDAsIFwKKyAgICAgICdGYWlsZWQgdG8gZHVtcCBwdWJsaWMga2V5IGZyb20gY2VydGlmaWNhdGU6ICVzXG4lcycgJSAoY2VydCwgc3RkZXJyZGF0YSkKKyAgcmV0dXJuIHB1YmtleQorCisKIGRlZiBNYWtlUmVjb3ZlcnlQYXRjaChpbnB1dF9kaXIsIG91dHB1dF9zaW5rLCByZWNvdmVyeV9pbWcsIGJvb3RfaW1nLAogICAgICAgICAgICAgICAgICAgICAgIGluZm9fZGljdD1Ob25lKToKLSAgIiIiR2VuZXJhdGUgYSBiaW5hcnkgcGF0Y2ggdGhhdCBjcmVhdGVzIHRoZSByZWNvdmVyeSBpbWFnZSBzdGFydGluZwotICB3aXRoIHRoZSBib290IGltYWdlLiAgKE1vc3Qgb2YgdGhlIHNwYWNlIGluIHRoZXNlIGltYWdlcyBpcyBqdXN0IHRoZQotICBrZXJuZWwsIHdoaWNoIGlzIGlkZW50aWNhbCBmb3IgdGhlIHR3bywgc28gdGhlIHJlc3VsdGluZyBwYXRjaAotICBzaG91bGQgYmUgZWZmaWNpZW50LikgIEFkZCBpdCB0byB0aGUgb3V0cHV0IHppcCwgYWxvbmcgd2l0aCBhIHNoZWxsCi0gIHNjcmlwdCB0aGF0IGlzIHJ1biBmcm9tIGluaXQucmMgb24gZmlyc3QgYm9vdCB0byBhY3R1YWxseSBkbyB0aGUKLSAgcGF0Y2hpbmcgYW5kIGluc3RhbGwgdGhlIG5ldyByZWNvdmVyeSBpbWFnZS4KKyAgIiIiR2VuZXJhdGVzIHRoZSByZWNvdmVyeS1mcm9tLWJvb3QgcGF0Y2ggYW5kIHdyaXRlcyB0aGUgc2NyaXB0IHRvIG91dHB1dC4KIAotICByZWNvdmVyeV9pbWcgYW5kIGJvb3RfaW1nIHNob3VsZCBiZSBGaWxlIG9iamVjdHMgZm9yIHRoZQotICBjb3JyZXNwb25kaW5nIGltYWdlcy4gIGluZm8gc2hvdWxkIGJlIHRoZSBkaWN0aW9uYXJ5IHJldHVybmVkIGJ5Ci0gIGNvbW1vbi5Mb2FkSW5mb0RpY3QoKSBvbiB0aGUgaW5wdXQgdGFyZ2V0X2ZpbGVzLgorICBNb3N0IG9mIHRoZSBzcGFjZSBpbiB0aGUgYm9vdCBhbmQgcmVjb3ZlcnkgaW1hZ2VzIGlzIGp1c3QgdGhlIGtlcm5lbCwgd2hpY2ggaXMKKyAgaWRlbnRpY2FsIGZvciB0aGUgdHdvLCBzbyB0aGUgcmVzdWx0aW5nIHBhdGNoIHNob3VsZCBiZSBlZmZpY2llbnQuIEFkZCBpdCB0bworICB0aGUgb3V0cHV0IHppcCwgYWxvbmcgd2l0aCBhIHNoZWxsIHNjcmlwdCB0aGF0IGlzIHJ1biBmcm9tIGluaXQucmMgb24gZmlyc3QKKyAgYm9vdCB0byBhY3R1YWxseSBkbyB0aGUgcGF0Y2hpbmcgYW5kIGluc3RhbGwgdGhlIG5ldyByZWNvdmVyeSBpbWFnZS4KKworICBBcmdzOgorICAgIGlucHV0X2RpcjogVGhlIHRvcC1sZXZlbCBpbnB1dCBkaXJlY3Rvcnkgb2YgdGhlIHRhcmdldC1maWxlcy56aXAuCisgICAgb3V0cHV0X3Npbms6IFRoZSBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IHdyaXRlcyB0aGUgcmVzdWx0LgorICAgIHJlY292ZXJ5X2ltZzogRmlsZSBvYmplY3QgZm9yIHRoZSByZWNvdmVyeSBpbWFnZS4KKyAgICBib290X2ltZzogRmlsZSBvYmplY3RzIGZvciB0aGUgYm9vdCBpbWFnZS4KKyAgICBpbmZvX2RpY3Q6IEEgZGljdCByZXR1cm5lZCBieSBjb21tb24uTG9hZEluZm9EaWN0KCkgb24gdGhlIGlucHV0CisgICAgICAgIHRhcmdldF9maWxlcy4gV2lsbCB1c2UgT1BUSU9OUy5pbmZvX2RpY3QgaWYgTm9uZSBoYXMgYmVlbiBnaXZlbi4KICAgIiIiCi0KICAgaWYgaW5mb19kaWN0IGlzIE5vbmU6CiAgICAgaW5mb19kaWN0ID0gT1BUSU9OUy5pbmZvX2RpY3QKIAotICBmdWxsX3JlY292ZXJ5X2ltYWdlID0gaW5mb19kaWN0LmdldCgiZnVsbF9yZWNvdmVyeV9pbWFnZSIsIE5vbmUpID09ICJ0cnVlIgorICBmdWxsX3JlY292ZXJ5X2ltYWdlID0gaW5mb19kaWN0LmdldCgiZnVsbF9yZWNvdmVyeV9pbWFnZSIpID09ICJ0cnVlIgogCiAgIGlmIGZ1bGxfcmVjb3ZlcnlfaW1hZ2U6CiAgICAgb3V0cHV0X3NpbmsoImV0Yy9yZWNvdmVyeS5pbWciLCByZWNvdmVyeV9pbWcuZGF0YSkKIAogICBlbHNlOgotICAgIGRpZmZfcHJvZ3JhbSA9IFsiaW1nZGlmZiJdCisgICAgc3lzdGVtX3Jvb3RfaW1hZ2UgPSBpbmZvX2RpY3QuZ2V0KCJzeXN0ZW1fcm9vdF9pbWFnZSIpID09ICJ0cnVlIgogICAgIHBhdGggPSBvcy5wYXRoLmpvaW4oaW5wdXRfZGlyLCAiU1lTVEVNIiwgImV0YyIsICJyZWNvdmVyeS1yZXNvdXJjZS5kYXQiKQotICAgIGlmIG9zLnBhdGguZXhpc3RzKHBhdGgpOgotICAgICAgZGlmZl9wcm9ncmFtLmFwcGVuZCgiLWIiKQotICAgICAgZGlmZl9wcm9ncmFtLmFwcGVuZChwYXRoKQotICAgICAgYm9udXNfYXJncyA9ICItYiAvc3lzdGVtL2V0Yy9yZWNvdmVyeS1yZXNvdXJjZS5kYXQiCi0gICAgZWxzZToKKyAgICAjIFdpdGggc3lzdGVtLXJvb3QtaW1hZ2UsIGJvb3QgYW5kIHJlY292ZXJ5IGltYWdlcyB3aWxsIGhhdmUgbWlzbWF0Y2hpbmcKKyAgICAjIGVudHJpZXMgKG9ubHkgcmVjb3ZlcnkgaGFzIHRoZSByYW1kaXNrIGVudHJ5KSAoQnVnOiA3MjczMTUwNikuIFVzZSBic2RpZmYKKyAgICAjIHRvIGhhbmRsZSBzdWNoIGEgY2FzZS4KKyAgICBpZiBzeXN0ZW1fcm9vdF9pbWFnZToKKyAgICAgIGRpZmZfcHJvZ3JhbSA9IFsiYnNkaWZmIl0KICAgICAgIGJvbnVzX2FyZ3MgPSAiIgorICAgICAgYXNzZXJ0IG5vdCBvcy5wYXRoLmV4aXN0cyhwYXRoKQorICAgIGVsc2U6CisgICAgICBkaWZmX3Byb2dyYW0gPSBbImltZ2RpZmYiXQorICAgICAgaWYgb3MucGF0aC5leGlzdHMocGF0aCk6CisgICAgICAgIGRpZmZfcHJvZ3JhbS5hcHBlbmQoIi1iIikKKyAgICAgICAgZGlmZl9wcm9ncmFtLmFwcGVuZChwYXRoKQorICAgICAgICBib251c19hcmdzID0gIi1iIC9zeXN0ZW0vZXRjL3JlY292ZXJ5LXJlc291cmNlLmRhdCIKKyAgICAgIGVsc2U6CisgICAgICAgIGJvbnVzX2FyZ3MgPSAiIgogCiAgICAgZCA9IERpZmZlcmVuY2UocmVjb3ZlcnlfaW1nLCBib290X2ltZywgZGlmZl9wcm9ncmFtPWRpZmZfcHJvZ3JhbSkKICAgICBfLCBfLCBwYXRjaCA9IGQuQ29tcHV0ZVBhdGNoKCkKZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbGVhc2V0b29scy9lZGlmeV9nZW5lcmF0b3IucHkgYi90b29scy9yZWxlYXNldG9vbHMvZWRpZnlfZ2VuZXJhdG9yLnB5CmluZGV4IDBjNDRmYWYuLjdhODE5MjggMTAwNjQ0Ci0tLSBhL3Rvb2xzL3JlbGVhc2V0b29scy9lZGlmeV9nZW5lcmF0b3IucHkKKysrIGIvdG9vbHMvcmVsZWFzZXRvb2xzL2VkaWZ5X2dlbmVyYXRvci5weQpAQCAtNzcsMTQgKzc3LDE0IEBACiAgICAgd2l0aCB0ZW1wb3Jhcnk9VHJ1ZSkgdG8gdGhpcyBvbmUuIiIiCiAgICAgc2VsZi5zY3JpcHQuZXh0ZW5kKG90aGVyLnNjcmlwdCkKIAotICBkZWYgQXNzZXJ0T2VtUHJvcGVydHkoc2VsZiwgbmFtZSwgdmFsdWVzKToKKyAgZGVmIEFzc2VydE9lbVByb3BlcnR5KHNlbGYsIG5hbWUsIHZhbHVlcywgb2VtX25vX21vdW50KToKICAgICAiIiJBc3NlcnQgdGhhdCBhIHByb3BlcnR5IG9uIHRoZSBPRU0gcGFyaXRpdGlvbiBtYXRjaGVzIGFsbG93ZWQgdmFsdWVzLiIiIgogICAgIGlmIG5vdCBuYW1lOgogICAgICAgcmFpc2UgVmFsdWVFcnJvcigibXVzdCBzcGVjaWZ5IGFuIE9FTSBwcm9wZXJ0eSIpCiAgICAgaWYgbm90IHZhbHVlczoKICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIm11c3Qgc3BlY2lmeSB0aGUgT0VNIHZhbHVlIikKLSAgICBnZXRfcHJvcF9jb21tYW5kID0gTm9uZQotICAgIGlmIGNvbW1vbi5PUFRJT05TLm9lbV9ub19tb3VudDoKKworICAgIGlmIG9lbV9ub19tb3VudDoKICAgICAgIGdldF9wcm9wX2NvbW1hbmQgPSAnZ2V0cHJvcCgiJXMiKScgJSBuYW1lCiAgICAgZWxzZToKICAgICAgIGdldF9wcm9wX2NvbW1hbmQgPSAnZmlsZV9nZXRwcm9wKCIvb2VtL29lbS5wcm9wIiwgIiVzIiknICUgbmFtZQpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVsZWFzZXRvb2xzL2ltZ19mcm9tX3RhcmdldF9maWxlcy5weSBiL3Rvb2xzL3JlbGVhc2V0b29scy9pbWdfZnJvbV90YXJnZXRfZmlsZXMucHkKaW5kZXggNDQyMmI1My4uZTZlOGM5ZiAxMDA3NTUKLS0tIGEvdG9vbHMvcmVsZWFzZXRvb2xzL2ltZ19mcm9tX3RhcmdldF9maWxlcy5weQorKysgYi90b29scy9yZWxlYXNldG9vbHMvaW1nX2Zyb21fdGFyZ2V0X2ZpbGVzLnB5CkBAIC03MSw4ICs3MSw3IEBACiAgICAgY29tbW9uLlVzYWdlKF9fZG9jX18pCiAgICAgc3lzLmV4aXQoMSkKIAotICBPUFRJT05TLmlucHV0X3RtcCwgaW5wdXRfemlwID0gY29tbW9uLlVuemlwVGVtcCgKLSAgICAgIGFyZ3NbMF0sIFsiSU1BR0VTLyoiLCAiT1RBLyoiXSkKKyAgT1BUSU9OUy5pbnB1dF90bXAgPSBjb21tb24uVW56aXBUZW1wKGFyZ3NbMF0sIFsiSU1BR0VTLyoiLCAiT1RBLyoiXSkKICAgb3V0cHV0X3ppcCA9IHppcGZpbGUuWmlwRmlsZShhcmdzWzFdLCAidyIsIGNvbXByZXNzaW9uPXppcGZpbGUuWklQX0RFRkxBVEVEKQogICBDb3B5SW5mbyhvdXRwdXRfemlwKQogCmRpZmYgLS1naXQgYS90b29scy9yZWxlYXNldG9vbHMvb3RhX2Zyb21fdGFyZ2V0X2ZpbGVzLnB5IGIvdG9vbHMvcmVsZWFzZXRvb2xzL290YV9mcm9tX3RhcmdldF9maWxlcy5weQppbmRleCAzYmFhY2RjLi4xMGExOWIzIDEwMDc1NQotLS0gYS90b29scy9yZWxlYXNldG9vbHMvb3RhX2Zyb21fdGFyZ2V0X2ZpbGVzLnB5CisrKyBiL3Rvb2xzL3JlbGVhc2V0b29scy9vdGFfZnJvbV90YXJnZXRfZmlsZXMucHkKQEAgLTIxLDkgKzIxLDYgQEAKIAogVXNhZ2U6ICBvdGFfZnJvbV90YXJnZXRfZmlsZXMgW2ZsYWdzXSBpbnB1dF90YXJnZXRfZmlsZXMgb3V0cHV0X290YV9wYWNrYWdlCiAKLSAgLS1ib2FyZF9jb25maWcgIDxmaWxlPgotICAgICAgRGVwcmVjYXRlZC4KLQogICAtayAoLS1wYWNrYWdlX2tleSkgPGtleT4gS2V5IHRvIHVzZSB0byBzaWduIHRoZSBwYWNrYWdlIChkZWZhdWx0IGlzCiAgICAgICB0aGUgdmFsdWUgb2YgZGVmYXVsdF9zeXN0ZW1fZGV2X2NlcnRpZmljYXRlIGZyb20gdGhlIGlucHV0CiAgICAgICB0YXJnZXQtZmlsZXMncyBNRVRBL21pc2NfaW5mby50eHQsIG9yCkBAIC00NiwxNCArNDMsMTYgQEAKICAgICAgIFNpbWlsYXIgdG8gLS1mdWxsX3JhZGlvLiBXaGVuIGdlbmVyYXRpbmcgYW4gaW5jcmVtZW50YWwgT1RBLCBhbHdheXMKICAgICAgIGluY2x1ZGUgYSBmdWxsIGNvcHkgb2YgYm9vdGxvYWRlciBpbWFnZS4KIAotICAtdiAgKC0tdmVyaWZ5KQotICAgICAgUmVtb3VudCBhbmQgdmVyaWZ5IHRoZSBjaGVja3N1bXMgb2YgdGhlIGZpbGVzIHdyaXR0ZW4gdG8gdGhlCi0gICAgICBzeXN0ZW0gYW5kIHZlbmRvciAoaWYgdXNlZCkgcGFydGl0aW9ucy4gIEluY3JlbWVudGFsIGJ1aWxkcyBvbmx5LgorICAtLXZlcmlmeQorICAgICAgUmVtb3VudCBhbmQgdmVyaWZ5IHRoZSBjaGVja3N1bXMgb2YgdGhlIGZpbGVzIHdyaXR0ZW4gdG8gdGhlIHN5c3RlbSBhbmQKKyAgICAgIHZlbmRvciAoaWYgdXNlZCkgcGFydGl0aW9ucy4gTm9uLUEvQiBpbmNyZW1lbnRhbCBPVEFzIG9ubHkuCiAKICAgLW8gICgtLW9lbV9zZXR0aW5ncykgIDxtYWluX2ZpbGVbLGFkZGl0aW9uYWxfZmlsZXMuLi5dPgogICAgICAgQ29tbWEgc2VwZXJhdGVkIGxpc3Qgb2YgZmlsZXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBleHBlY3RlZCBPRU0tc3BlY2lmaWMKLSAgICAgIHByb3BlcnRpZXMgb24gdGhlIE9FTSBwYXJ0aXRpb24gb2YgdGhlIGludGVuZGVkIGRldmljZS4KLSAgICAgIE11bHRpcGxlIGV4cGVjdGVkIHZhbHVlcyBjYW4gYmUgdXNlZCBieSBwcm92aWRpbmcgbXVsdGlwbGUgZmlsZXMuCisgICAgICBwcm9wZXJ0aWVzIG9uIHRoZSBPRU0gcGFydGl0aW9uIG9mIHRoZSBpbnRlbmRlZCBkZXZpY2UuIE11bHRpcGxlIGV4cGVjdGVkCisgICAgICB2YWx1ZXMgY2FuIGJlIHVzZWQgYnkgcHJvdmlkaW5nIG11bHRpcGxlIGZpbGVzLiBPbmx5IHRoZSBmaXJzdCBkaWN0IHdpbGwKKyAgICAgIGJlIHVzZWQgdG8gY29tcHV0ZSBmaW5nZXJwcmludCwgd2hpbGUgdGhlIHJlc3Qgd2lsbCBiZSB1c2VkIHRvIGFzc2VydAorICAgICAgT0VNLXNwZWNpZmljIHByb3BlcnRpZXMuCiAKICAgLS1vZW1fbm9fbW91bnQKICAgICAgIEZvciBkZXZpY2VzIHdpdGggT0VNLXNwZWNpZmljIHByb3BlcnRpZXMgYnV0IHdpdGhvdXQgYW4gT0VNIHBhcnRpdGlvbiwKQEAgLTYxLDI5ICs2MCwzNCBAQAogICAgICAgdmVyeSByYXJlbHkgdXNlZCwgc2luY2UgaXQncyBleHBlY3RlZCB0byBoYXZlIGEgZGVkaWNhdGVkIE9FTSBwYXJ0aXRpb24KICAgICAgIGZvciBPRU0tc3BlY2lmaWMgcHJvcGVydGllcy4gT25seSBtZWFuaW5nZnVsIHdoZW4gLW8gaXMgc3BlY2lmaWVkLgogCi0gIC13ICAoLS13aXBlX3VzZXJfZGF0YSkKKyAgLS13aXBlX3VzZXJfZGF0YQogICAgICAgR2VuZXJhdGUgYW4gT1RBIHBhY2thZ2UgdGhhdCB3aWxsIHdpcGUgdGhlIHVzZXIgZGF0YSBwYXJ0aXRpb24KICAgICAgIHdoZW4gaW5zdGFsbGVkLgogCiAgIC0tZG93bmdyYWRlCi0gICAgICBJbnRlbnRpb25hbGx5IGdlbmVyYXRlIGFuIGluY3JlbWVudGFsIE9UQSB0aGF0IHVwZGF0ZXMgZnJvbSBhIG5ld2VyCi0gICAgICBidWlsZCB0byBhbiBvbGRlciBvbmUgKGJhc2VkIG9uIHRpbWVzdGFtcCBjb21wYXJpc29uKS4gInBvc3QtdGltZXN0YW1wIgotICAgICAgd2lsbCBiZSByZXBsYWNlZCBieSAib3RhLWRvd25ncmFkZT15ZXMiIGluIHRoZSBtZXRhZGF0YSBmaWxlLiBBIGRhdGEKLSAgICAgIHdpcGUgd2lsbCBhbHdheXMgYmUgZW5mb3JjZWQsIHNvICJvdGEtd2lwZT15ZXMiIHdpbGwgYWxzbyBiZSBpbmNsdWRlZCBpbgotICAgICAgdGhlIG1ldGFkYXRhIGZpbGUuIFRoZSB1cGRhdGUtYmluYXJ5IGluIHRoZSBzb3VyY2UgYnVpbGQgd2lsbCBiZSB1c2VkIGluCi0gICAgICB0aGUgT1RBIHBhY2thZ2UsIHVubGVzcyAtLWJpbmFyeSBmbGFnIGlzIHNwZWNpZmllZC4gUGxlYXNlIGFsc28gY2hlY2sgdGhlCi0gICAgICBkb2MgZm9yIC0tb3ZlcnJpZGVfdGltZXN0YW1wIGJlbG93LgorICAgICAgSW50ZW50aW9uYWxseSBnZW5lcmF0ZSBhbiBpbmNyZW1lbnRhbCBPVEEgdGhhdCB1cGRhdGVzIGZyb20gYSBuZXdlciBidWlsZAorICAgICAgdG8gYW4gb2xkZXIgb25lIChlLmcuIGRvd25ncmFkaW5nIGZyb20gUCBwcmV2aWV3IGJhY2sgdG8gTyBNUjEpLgorICAgICAgIm90YS1kb3duZ3JhZGU9eWVzIiB3aWxsIGJlIHNldCBpbiB0aGUgcGFja2FnZSBtZXRhZGF0YSBmaWxlLiBBIGRhdGEgd2lwZQorICAgICAgd2lsbCBhbHdheXMgYmUgZW5mb3JjZWQgd2hlbiB1c2luZyB0aGlzIGZsYWcsIHNvICJvdGEtd2lwZT15ZXMiIHdpbGwgYWxzbworICAgICAgYmUgaW5jbHVkZWQgaW4gdGhlIG1ldGFkYXRhIGZpbGUuIFRoZSB1cGRhdGUtYmluYXJ5IGluIHRoZSBzb3VyY2UgYnVpbGQKKyAgICAgIHdpbGwgYmUgdXNlZCBpbiB0aGUgT1RBIHBhY2thZ2UsIHVubGVzcyAtLWJpbmFyeSBmbGFnIGlzIHNwZWNpZmllZC4gUGxlYXNlCisgICAgICBhbHNvIGNoZWNrIHRoZSBjb21tZW50IGZvciAtLW92ZXJyaWRlX3RpbWVzdGFtcCBiZWxvdy4KIAogICAtLW92ZXJyaWRlX3RpbWVzdGFtcAotICAgICAgSW50ZW50aW9uYWxseSBnZW5lcmF0ZSBhbiBpbmNyZW1lbnRhbCBPVEEgdGhhdCB1cGRhdGVzIGZyb20gYSBuZXdlcgotICAgICAgYnVpbGQgdG8gYW4gb2xkZXIgb25lIChiYXNlZCBvbiB0aW1lc3RhbXAgY29tcGFyaXNvbiksIGJ5IG92ZXJyaWRpbmcgdGhlCi0gICAgICB0aW1lc3RhbXAgaW4gcGFja2FnZSBtZXRhZGF0YS4gVGhpcyBkaWZmZXJzIGZyb20gLS1kb3duZ3JhZGUgZmxhZzogd2UKLSAgICAgIGtub3cgZm9yIHN1cmUgdGhpcyBpcyBOT1QgYW4gYWN0dWFsIGRvd25ncmFkZSBjYXNlLCBidXQgdHdvIGJ1aWxkcyBhcmUKLSAgICAgIGN1dCBpbiBhIHJldmVyc2Ugb3JkZXIuIEEgbGVnaXQgdXNlIGNhc2UgaXMgdGhhdCB3ZSBjdXQgYSBuZXcgYnVpbGQgQwotICAgICAgKGFmdGVyIGhhdmluZyBBIGFuZCBCKSwgYnV0IHdhbnQgdG8gZW5mb3JlIGFuIHVwZGF0ZSBwYXRoIG9mIEEgLT4gQyAtPiBCLgotICAgICAgU3BlY2lmeWluZyAtLWRvd25ncmFkZSBtYXkgbm90IGhlbHAgc2luY2UgdGhhdCB3b3VsZCBlbmZvcmNlIGEgZGF0YSB3aXBlCi0gICAgICBmb3IgQyAtPiBCIHVwZGF0ZS4gVGhlIHZhbHVlIG9mICJwb3N0LXRpbWVzdGFtcCIgd2lsbCBiZSBzZXQgdG8gdGhlIG5ld2VyCi0gICAgICB0aW1lc3RhbXAgcGx1cyBvbmUsIHNvIHRoYXQgdGhlIHBhY2thZ2UgY2FuIGJlIHB1c2hlZCBhbmQgYXBwbGllZC4KKyAgICAgIEludGVudGlvbmFsbHkgZ2VuZXJhdGUgYW4gaW5jcmVtZW50YWwgT1RBIHRoYXQgdXBkYXRlcyBmcm9tIGEgbmV3ZXIgYnVpbGQKKyAgICAgIHRvIGFuIG9sZGVyIG9uZSAoYmFzZWQgb24gdGltZXN0YW1wIGNvbXBhcmlzb24pLCBieSBzZXR0aW5nIHRoZSBkb3duZ3JhZGUKKyAgICAgIGZsYWcgaW4gdGhlIHBhY2thZ2UgbWV0YWRhdGEuIFRoaXMgZGlmZmVycyBmcm9tIC0tZG93bmdyYWRlIGZsYWcsIGFzIHdlCisgICAgICBkb24ndCBlbmZvcmNlIGEgZGF0YSB3aXBlIHdpdGggdGhpcyBmbGFnLiBCZWNhdXNlIHdlIGtub3cgZm9yIHN1cmUgdGhpcyBpcworICAgICAgTk9UIGFuIGFjdHVhbCBkb3duZ3JhZGUgY2FzZSwgYnV0IHR3byBidWlsZHMgaGFwcGVuIHRvIGJlIGN1dCBpbiBhIHJldmVyc2UKKyAgICAgIG9yZGVyIChlLmcuIGZyb20gdHdvIGJyYW5jaGVzKS4gQSBsZWdpdCB1c2UgY2FzZSBpcyB0aGF0IHdlIGN1dCBhIG5ldworICAgICAgYnVpbGQgQyAoYWZ0ZXIgaGF2aW5nIEEgYW5kIEIpLCBidXQgd2FudCB0byBlbmZvcmUgYW4gdXBkYXRlIHBhdGggb2YgQSAtPgorICAgICAgQyAtPiBCLiBTcGVjaWZ5aW5nIC0tZG93bmdyYWRlIG1heSBub3QgaGVscCBzaW5jZSB0aGF0IHdvdWxkIGVuZm9yY2UgYQorICAgICAgZGF0YSB3aXBlIGZvciBDIC0+IEIgdXBkYXRlLgorCisgICAgICBXZSB1c2VkIHRvIHNldCBhIGZha2UgdGltZXN0YW1wIGluIHRoZSBwYWNrYWdlIG1ldGFkYXRhIGZvciB0aGlzIGZsb3cuIEJ1dAorICAgICAgbm93IHdlIGNvbnNvbGlkYXRlIHRoZSB0d28gY2FzZXMgKGkuZS4gYW4gYWN0dWFsIGRvd25ncmFkZSwgb3IgYSBkb3duZ3JhZGUKKyAgICAgIGJhc2VkIG9uIHRpbWVzdGFtcCkgd2l0aCB0aGUgc2FtZSAib3RhLWRvd25ncmFkZT15ZXMiIGZsYWcsIHdpdGggdGhlCisgICAgICBkaWZmZXJlbmNlIGJlaW5nIHdoZXRoZXIgIm90YS13aXBlPXllcyIgaXMgc2V0LgogCiAgIC1lICAoLS1leHRyYV9zY3JpcHQpICA8ZmlsZT4KICAgICAgIEluc2VydCB0aGUgY29udGVudHMgb2YgZmlsZSBhdCB0aGUgZW5kIG9mIHRoZSB1cGRhdGUgc2NyaXB0LgpAQCAtOTMsNiArOTcsMjQgQEAKICAgICAgIGZpcnN0LCBzbyB0aGF0IGFueSBjaGFuZ2VzIG1hZGUgdG8gdGhlIHN5c3RlbSBwYXJ0aXRpb24gYXJlIGRvbmUKICAgICAgIHVzaW5nIHRoZSBuZXcgcmVjb3ZlcnkgKG5ldyBrZXJuZWwsIGV0Yy4pLgogCisgIC0taW5jbHVkZV9zZWNvbmRhcnkKKyAgICAgIEFkZGl0aW9uYWxseSBpbmNsdWRlIHRoZSBwYXlsb2FkIGZvciBzZWNvbmRhcnkgc2xvdCBpbWFnZXMgKGRlZmF1bHQ6CisgICAgICBGYWxzZSkuIE9ubHkgbWVhbmluZ2Z1bCB3aGVuIGdlbmVyYXRpbmcgQS9CIE9UQXMuCisKKyAgICAgIEJ5IGRlZmF1bHQsIGFuIEEvQiBPVEEgcGFja2FnZSBkb2Vzbid0IGNvbnRhaW4gdGhlIGltYWdlcyBmb3IgdGhlCisgICAgICBzZWNvbmRhcnkgc2xvdCAoZS5nLiBzeXN0ZW1fb3RoZXIuaW1nKS4gU3BlY2lmeWluZyB0aGlzIGZsYWcgYWxsb3dzCisgICAgICBnZW5lcmF0aW5nIGEgc2VwYXJhdGUgcGF5bG9hZCB0aGF0IHdpbGwgaW5zdGFsbCBzZWNvbmRhcnkgc2xvdCBpbWFnZXMuCisKKyAgICAgIFN1Y2ggYSBwYWNrYWdlIG5lZWRzIHRvIGJlIGFwcGxpZWQgaW4gYSB0d28tc3RhZ2UgbWFubmVyLCB3aXRoIGEgcmVib290CisgICAgICBpbi1iZXR3ZWVuLiBEdXJpbmcgdGhlIGZpcnN0IHN0YWdlLCB0aGUgdXBkYXRlciBhcHBsaWVzIHRoZSBwcmltYXJ5CisgICAgICBwYXlsb2FkIG9ubHkuIFVwb24gZmluaXNoaW5nLCBpdCByZWJvb3RzIHRoZSBkZXZpY2UgaW50byB0aGUgbmV3bHkgdXBkYXRlZAorICAgICAgc2xvdC4gSXQgdGhlbiBjb250aW51ZXMgdG8gaW5zdGFsbCB0aGUgc2Vjb25kYXJ5IHBheWxvYWQgdG8gdGhlIGluYWN0aXZlCisgICAgICBzbG90LCBidXQgd2l0aG91dCBzd2l0Y2hpbmcgdGhlIGFjdGl2ZSBzbG90IGF0IHRoZSBlbmQgKG5lZWRzIHRoZSBtYXRjaGluZworICAgICAgc3VwcG9ydCBpbiB1cGRhdGVfZW5naW5lLCBpLmUuIFNXSVRDSF9TTE9UX09OX1JFQk9PVCBmbGFnKS4KKworICAgICAgRHVlIHRvIHRoZSBzcGVjaWFsIGluc3RhbGwgcHJvY2VkdXJlLCB0aGUgc2Vjb25kYXJ5IHBheWxvYWQgd2lsbCBiZSBhbHdheXMKKyAgICAgIGdlbmVyYXRlZCBhcyBhIGZ1bGwgcGF5bG9hZC4KKwogICAtLWJsb2NrCiAgICAgICBHZW5lcmF0ZSBhIGJsb2NrLWJhc2VkIE9UQSBmb3Igbm9uLUEvQiBkZXZpY2UuIFdlIGhhdmUgZGVwcmVjYXRlZCB0aGUKICAgICAgIHN1cHBvcnQgZm9yIGZpbGUtYmFzZWQgT1RBIHNpbmNlIE8uIEJsb2NrLWJhc2VkIE9UQSB3aWxsIGJlIHVzZWQgYnkKQEAgLTExMiw5ICsxMzQsNiBAQAogICAgICAgU3BlY2lmaWVzIHRoZSB0aHJlc2hvbGQgdGhhdCB3aWxsIGJlIHVzZWQgdG8gY29tcHV0ZSB0aGUgbWF4aW11bQogICAgICAgYWxsb3dlZCBzdGFzaCBzaXplIChkZWZhdWx0cyB0byAwLjgpLgogCi0gIC0tZ2VuX3ZlcmlmeQotICAgICAgR2VuZXJhdGUgYW4gT1RBIHBhY2thZ2UgdGhhdCB2ZXJpZmllcyB0aGUgcGFydGl0aW9ucy4KLQogICAtLWxvZ19kaWZmIDxmaWxlPgogICAgICAgR2VuZXJhdGUgYSBsb2cgZmlsZSB0aGF0IHNob3dzIHRoZSBkaWZmZXJlbmNlcyBpbiB0aGUgc291cmNlIGFuZCB0YXJnZXQKICAgICAgIGJ1aWxkcyBmb3IgYW4gaW5jcmVtZW50YWwgcGFja2FnZS4gVGhpcyBvcHRpb24gaXMgb25seSBtZWFuaW5nZnVsIHdoZW4KQEAgLTEzMCwyNyArMTQ5LDM0IEBACiAKICAgLS1wYXlsb2FkX3NpZ25lcl9hcmdzIDxhcmdzPgogICAgICAgU3BlY2lmeSB0aGUgYXJndW1lbnRzIG5lZWRlZCBmb3IgcGF5bG9hZCBzaWduZXIuCisKKyAgLS1za2lwX3Bvc3RpbnN0YWxsCisgICAgICBTa2lwIHRoZSBwb3N0aW5zdGFsbCBob29rcyB3aGVuIGdlbmVyYXRpbmcgYW4gQS9CIE9UQSBwYWNrYWdlIChkZWZhdWx0OgorICAgICAgRmFsc2UpLiBOb3RlIHRoYXQgdGhpcyBkaXNjYXJkcyBBTEwgdGhlIGhvb2tzLCBpbmNsdWRpbmcgbm9uLW9wdGlvbmFsCisgICAgICBvbmVzLiBTaG91bGQgb25seSBiZSB1c2VkIGlmIGNhbGxlciBrbm93cyBpdCdzIHNhZmUgdG8gZG8gc28gKGUuZy4gYWxsIHRoZQorICAgICAgcG9zdGluc3RhbGwgd29yayBpcyB0byBkZXhvcHQgYXBwcyBhbmQgYSBkYXRhIHdpcGUgd2lsbCBoYXBwZW4gaW1tZWRpYXRlbHkKKyAgICAgIGFmdGVyKS4gT25seSBtZWFuaW5nZnVsIHdoZW4gZ2VuZXJhdGluZyBBL0IgT1RBcy4KICIiIgogCiBmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHByaW50X2Z1bmN0aW9uCiAKLWltcG9ydCBzeXMKLQotaWYgc3lzLmhleHZlcnNpb24gPCAweDAyMDcwMDAwOgotICBwcmludCgiUHl0aG9uIDIuNyBvciBuZXdlciBpcyByZXF1aXJlZC4iLCBmaWxlPXN5cy5zdGRlcnIpCi0gIHN5cy5leGl0KDEpCi0KLWltcG9ydCBjb3B5CiBpbXBvcnQgbXVsdGlwcm9jZXNzaW5nCiBpbXBvcnQgb3MucGF0aAotaW1wb3J0IHN1YnByb2Nlc3MKIGltcG9ydCBzaGxleAoraW1wb3J0IHNodXRpbAoraW1wb3J0IHN0cnVjdAoraW1wb3J0IHN1YnByb2Nlc3MKK2ltcG9ydCBzeXMKIGltcG9ydCB0ZW1wZmlsZQogaW1wb3J0IHppcGZpbGUKIAogaW1wb3J0IGNvbW1vbgogaW1wb3J0IGVkaWZ5X2dlbmVyYXRvcgotaW1wb3J0IHNwYXJzZV9pbWcKKworaWYgc3lzLmhleHZlcnNpb24gPCAweDAyMDcwMDAwOgorICBwcmludCgiUHl0aG9uIDIuNyBvciBuZXdlciBpcyByZXF1aXJlZC4iLCBmaWxlPXN5cy5zdGRlcnIpCisgIHN5cy5leGl0KDEpCisKIAogT1BUSU9OUyA9IGNvbW1vbi5PUFRJT05TCiBPUFRJT05TLnBhY2thZ2Vfa2V5ID0gTm9uZQpAQCAtMTU5LDM0ICsxODUsMzUwIEBACiBPUFRJT05TLnBhdGNoX3RocmVzaG9sZCA9IDAuOTUKIE9QVElPTlMud2lwZV91c2VyX2RhdGEgPSBGYWxzZQogT1BUSU9OUy5kb3duZ3JhZGUgPSBGYWxzZQotT1BUSU9OUy50aW1lc3RhbXAgPSBGYWxzZQogT1BUSU9OUy5leHRyYV9zY3JpcHQgPSBOb25lCiBPUFRJT05TLndvcmtlcl90aHJlYWRzID0gbXVsdGlwcm9jZXNzaW5nLmNwdV9jb3VudCgpIC8vIDIKIGlmIE9QVElPTlMud29ya2VyX3RocmVhZHMgPT0gMDoKICAgT1BUSU9OUy53b3JrZXJfdGhyZWFkcyA9IDEKIE9QVElPTlMudHdvX3N0ZXAgPSBGYWxzZQorT1BUSU9OUy5pbmNsdWRlX3NlY29uZGFyeSA9IEZhbHNlCiBPUFRJT05TLm5vX3NpZ25pbmcgPSBGYWxzZQogT1BUSU9OUy5ibG9ja19iYXNlZCA9IFRydWUKIE9QVElPTlMudXBkYXRlcl9iaW5hcnkgPSBOb25lCiBPUFRJT05TLm9lbV9zb3VyY2UgPSBOb25lCiBPUFRJT05TLm9lbV9ub19tb3VudCA9IEZhbHNlCi1PUFRJT05TLmZhbGxiYWNrX3RvX2Z1bGwgPSBUcnVlCiBPUFRJT05TLmZ1bGxfcmFkaW8gPSBGYWxzZQogT1BUSU9OUy5mdWxsX2Jvb3Rsb2FkZXIgPSBGYWxzZQogIyBTdGFzaCBzaXplIGNhbm5vdCBleGNlZWQgY2FjaGVfc2l6ZSAqIHRocmVzaG9sZC4KIE9QVElPTlMuY2FjaGVfc2l6ZSA9IE5vbmUKIE9QVElPTlMuc3Rhc2hfdGhyZXNob2xkID0gMC44Ci1PUFRJT05TLmdlbl92ZXJpZnkgPSBGYWxzZQogT1BUSU9OUy5sb2dfZGlmZiA9IE5vbmUKIE9QVElPTlMucGF5bG9hZF9zaWduZXIgPSBOb25lCiBPUFRJT05TLnBheWxvYWRfc2lnbmVyX2FyZ3MgPSBbXQogT1BUSU9OUy5leHRyYWN0ZWRfaW5wdXQgPSBOb25lCiBPUFRJT05TLmtleV9wYXNzd29yZHMgPSBbXQorT1BUSU9OUy5za2lwX3Bvc3RpbnN0YWxsID0gRmFsc2UKKwogCiBNRVRBREFUQV9OQU1FID0gJ01FVEEtSU5GL2NvbS9hbmRyb2lkL21ldGFkYXRhJworUE9TVElOU1RBTExfQ09ORklHID0gJ01FVEEvcG9zdGluc3RhbGxfY29uZmlnLnR4dCcKIFVOWklQX1BBVFRFUk4gPSBbJ0lNQUdFUy8qJywgJ01FVEEvKiddCiAKIAorY2xhc3MgQnVpbGRJbmZvKG9iamVjdCk6CisgICIiIkEgY2xhc3MgdGhhdCBob2xkcyB0aGUgaW5mb3JtYXRpb24gZm9yIGEgZ2l2ZW4gYnVpbGQuCisKKyAgVGhpcyBjbGFzcyB3cmFwcyB1cCB0aGUgcHJvcGVydHkgcXVlcnlpbmcgZm9yIGEgZ2l2ZW4gc291cmNlIG9yIHRhcmdldCBidWlsZC4KKyAgSXQgYWJzdHJhY3RzIGF3YXkgdGhlIGxvZ2ljIG9mIGhhbmRsaW5nIE9FTS1zcGVjaWZpYyBwcm9wZXJ0aWVzLCBhbmQgY2FjaGVzCisgIHRoZSBjb21tb25seSB1c2VkIHByb3BlcnRpZXMgc3VjaCBhcyBmaW5nZXJwcmludC4KKworICBUaGVyZSBhcmUgdHdvIHR5cGVzIG9mIGluZm8gZGljdHM6IGEpIGJ1aWxkLXRpbWUgaW5mbyBkaWN0LCB3aGljaCBpcyBnZW5lcmF0ZWQKKyAgYXQgYnVpbGQgdGltZSAoaS5lLiBpbmNsdWRlZCBpbiBhIHRhcmdldF9maWxlcyB6aXApOyBiKSBPRU0gaW5mbyBkaWN0IHRoYXQgaXMKKyAgc3BlY2lmaWVkIGF0IHBhY2thZ2UgZ2VuZXJhdGlvbiB0aW1lICh2aWEgY29tbWFuZCBsaW5lIGFyZ3VtZW50CisgICctLW9lbV9zZXR0aW5ncycpLiBJZiBhIGJ1aWxkIGRvZXNuJ3QgdXNlIE9FTS1zcGVjaWZpYyBwcm9wZXJ0aWVzIChpLmUuIG5vdAorICBoYXZpbmcgIm9lbV9maW5nZXJwcmludF9wcm9wZXJ0aWVzIiBpbiBidWlsZC10aW1lIGluZm8gZGljdCksIGFsbCB0aGUgcXVlcmllcworICB3b3VsZCBiZSBhbnN3ZXJlZCBiYXNlZCBvbiBidWlsZC10aW1lIGluZm8gZGljdCBvbmx5LiBPdGhlcndpc2UgaWYgdXNpbmcKKyAgT0VNLXNwZWNpZmljIHByb3BlcnRpZXMsIHNvbWUgb2YgdGhlbSB3aWxsIGJlIGNhbGN1bGF0ZWQgZnJvbSB0d28gaW5mbyBkaWN0cy4KKworICBVc2VycyBjYW4gcXVlcnkgcHJvcGVydGllcyBzaW1pbGFybHkgYXMgdXNpbmcgYSBkaWN0KCkgKGUuZy4gaW5mb1snZnN0YWInXSksCisgIG9yIHRvIHF1ZXJ5IGJ1aWxkIHByb3BlcnRpZXMgdmlhIEdldEJ1aWxkUHJvcCgpIG9yIEdldFZlbmRvckJ1aWxkUHJvcCgpLgorCisgIEF0dHJpYnV0ZXM6CisgICAgaW5mb19kaWN0OiBUaGUgYnVpbGQtdGltZSBpbmZvIGRpY3QuCisgICAgaXNfYWI6IFdoZXRoZXIgaXQncyBhIGJ1aWxkIHRoYXQgdXNlcyBBL0IgT1RBLgorICAgIG9lbV9kaWN0czogQSBsaXN0IG9mIE9FTSBkaWN0cy4KKyAgICBvZW1fcHJvcHM6IEEgbGlzdCBvZiBPRU0gcHJvcGVydGllcyB0aGF0IHNob3VsZCBiZSByZWFkIGZyb20gT0VNIGRpY3RzOyBOb25lCisgICAgICAgIGlmIHRoZSBidWlsZCBkb2Vzbid0IHVzZSBhbnkgT0VNLXNwZWNpZmljIHByb3BlcnR5LgorICAgIGZpbmdlcnByaW50OiBUaGUgZmluZ2VycHJpbnQgb2YgdGhlIGJ1aWxkLCB3aGljaCB3b3VsZCBiZSBjYWxjdWxhdGVkIGJhc2VkCisgICAgICAgIG9uIE9FTSBwcm9wZXJ0aWVzIGlmIGFwcGxpY2FibGUuCisgICAgZGV2aWNlOiBUaGUgZGV2aWNlIG5hbWUsIHdoaWNoIGNvdWxkIGNvbWUgZnJvbSBPRU0gZGljdHMgaWYgYXBwbGljYWJsZS4KKyAgIiIiCisKKyAgZGVmIF9faW5pdF9fKHNlbGYsIGluZm9fZGljdCwgb2VtX2RpY3RzKToKKyAgICAiIiJJbml0aWFsaXplcyBhIEJ1aWxkSW5mbyBpbnN0YW5jZSB3aXRoIHRoZSBnaXZlbiBkaWN0cy4KKworICAgIEFyZ3VtZW50czoKKyAgICAgIGluZm9fZGljdDogVGhlIGJ1aWxkLXRpbWUgaW5mbyBkaWN0LgorICAgICAgb2VtX2RpY3RzOiBBIGxpc3Qgb2YgT0VNIGRpY3RzICh3aGljaCBpcyBwYXJzZWQgZnJvbSAtLW9lbV9zZXR0aW5ncykuIE5vdGUKKyAgICAgICAgICB0aGF0IGl0IGFsd2F5cyB1c2VzIHRoZSBmaXJzdCBkaWN0IHRvIGNhbGN1bGF0ZSB0aGUgZmluZ2VycHJpbnQgb3IgdGhlCisgICAgICAgICAgZGV2aWNlIG5hbWUuIFRoZSByZXN0IHdvdWxkIGJlIHVzZWQgZm9yIGFzc2VydGluZyBPRU0gcHJvcGVydGllcyBvbmx5CisgICAgICAgICAgKGUuZy4gIG9uZSBwYWNrYWdlIGNhbiBiZSBpbnN0YWxsZWQgb24gb25lIG9mIHRoZXNlIGRldmljZXMpLgorICAgICIiIgorICAgIHNlbGYuaW5mb19kaWN0ID0gaW5mb19kaWN0CisgICAgc2VsZi5vZW1fZGljdHMgPSBvZW1fZGljdHMKKworICAgIHNlbGYuX2lzX2FiID0gaW5mb19kaWN0LmdldCgiYWJfdXBkYXRlIikgPT0gInRydWUiCisgICAgc2VsZi5fb2VtX3Byb3BzID0gaW5mb19kaWN0LmdldCgib2VtX2ZpbmdlcnByaW50X3Byb3BlcnRpZXMiKQorCisgICAgaWYgc2VsZi5fb2VtX3Byb3BzOgorICAgICAgYXNzZXJ0IG9lbV9kaWN0cywgIk9FTSBzb3VyY2UgcmVxdWlyZWQgZm9yIHRoaXMgYnVpbGQiCisKKyAgICAjIFRoZXNlIHR3byBzaG91bGQgYmUgY29tcHV0ZWQgb25seSBhZnRlciBzZXR0aW5nIHNlbGYuX29lbV9wcm9wcy4KKyAgICBzZWxmLl9kZXZpY2UgPSBzZWxmLkdldE9lbVByb3BlcnR5KCJyby5wcm9kdWN0LmRldmljZSIpCisgICAgc2VsZi5fZmluZ2VycHJpbnQgPSBzZWxmLkNhbGN1bGF0ZUZpbmdlcnByaW50KCkKKworICBAcHJvcGVydHkKKyAgZGVmIGlzX2FiKHNlbGYpOgorICAgIHJldHVybiBzZWxmLl9pc19hYgorCisgIEBwcm9wZXJ0eQorICBkZWYgZGV2aWNlKHNlbGYpOgorICAgIHJldHVybiBzZWxmLl9kZXZpY2UKKworICBAcHJvcGVydHkKKyAgZGVmIGZpbmdlcnByaW50KHNlbGYpOgorICAgIHJldHVybiBzZWxmLl9maW5nZXJwcmludAorCisgIEBwcm9wZXJ0eQorICBkZWYgb2VtX3Byb3BzKHNlbGYpOgorICAgIHJldHVybiBzZWxmLl9vZW1fcHJvcHMKKworICBkZWYgX19nZXRpdGVtX18oc2VsZiwga2V5KToKKyAgICByZXR1cm4gc2VsZi5pbmZvX2RpY3Rba2V5XQorCisgIGRlZiBnZXQoc2VsZiwga2V5LCBkZWZhdWx0PU5vbmUpOgorICAgIHJldHVybiBzZWxmLmluZm9fZGljdC5nZXQoa2V5LCBkZWZhdWx0KQorCisgIGRlZiBHZXRCdWlsZFByb3Aoc2VsZiwgcHJvcCk6CisgICAgIiIiUmV0dXJucyB0aGUgaW5xdWlyZWQgYnVpbGQgcHJvcGVydHkuIiIiCisgICAgdHJ5OgorICAgICAgcmV0dXJuIHNlbGYuaW5mb19kaWN0LmdldCgiYnVpbGQucHJvcCIsIHt9KVtwcm9wXQorICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgIHJhaXNlIGNvbW1vbi5FeHRlcm5hbEVycm9yKCJjb3VsZG4ndCBmaW5kICVzIGluIGJ1aWxkLnByb3AiICUgKHByb3AsKSkKKworICBkZWYgR2V0VmVuZG9yQnVpbGRQcm9wKHNlbGYsIHByb3ApOgorICAgICIiIlJldHVybnMgdGhlIGlucXVpcmVkIHZlbmRvciBidWlsZCBwcm9wZXJ0eS4iIiIKKyAgICB0cnk6CisgICAgICByZXR1cm4gc2VsZi5pbmZvX2RpY3QuZ2V0KCJ2ZW5kb3IuYnVpbGQucHJvcCIsIHt9KVtwcm9wXQorICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgIHJhaXNlIGNvbW1vbi5FeHRlcm5hbEVycm9yKAorICAgICAgICAgICJjb3VsZG4ndCBmaW5kICVzIGluIHZlbmRvci5idWlsZC5wcm9wIiAlIChwcm9wLCkpCisKKyAgZGVmIEdldE9lbVByb3BlcnR5KHNlbGYsIGtleSk6CisgICAgaWYgc2VsZi5vZW1fcHJvcHMgaXMgbm90IE5vbmUgYW5kIGtleSBpbiBzZWxmLm9lbV9wcm9wczoKKyAgICAgIHJldHVybiBzZWxmLm9lbV9kaWN0c1swXVtrZXldCisgICAgcmV0dXJuIHNlbGYuR2V0QnVpbGRQcm9wKGtleSkKKworICBkZWYgQ2FsY3VsYXRlRmluZ2VycHJpbnQoc2VsZik6CisgICAgaWYgc2VsZi5vZW1fcHJvcHMgaXMgTm9uZToKKyAgICAgIHJldHVybiBzZWxmLkdldEJ1aWxkUHJvcCgicm8uYnVpbGQuZmluZ2VycHJpbnQiKQorICAgIHJldHVybiAiJXMvJXMvJXM6JXMiICUgKAorICAgICAgICBzZWxmLkdldE9lbVByb3BlcnR5KCJyby5wcm9kdWN0LmJyYW5kIiksCisgICAgICAgIHNlbGYuR2V0T2VtUHJvcGVydHkoInJvLnByb2R1Y3QubmFtZSIpLAorICAgICAgICBzZWxmLkdldE9lbVByb3BlcnR5KCJyby5wcm9kdWN0LmRldmljZSIpLAorICAgICAgICBzZWxmLkdldEJ1aWxkUHJvcCgicm8uYnVpbGQudGh1bWJwcmludCIpKQorCisgIGRlZiBXcml0ZU1vdW50T2VtU2NyaXB0KHNlbGYsIHNjcmlwdCk6CisgICAgYXNzZXJ0IHNlbGYub2VtX3Byb3BzIGlzIG5vdCBOb25lCisgICAgcmVjb3ZlcnlfbW91bnRfb3B0aW9ucyA9IHNlbGYuaW5mb19kaWN0LmdldCgicmVjb3ZlcnlfbW91bnRfb3B0aW9ucyIpCisgICAgc2NyaXB0Lk1vdW50KCIvb2VtIiwgcmVjb3ZlcnlfbW91bnRfb3B0aW9ucykKKworICBkZWYgV3JpdGVEZXZpY2VBc3NlcnRpb25zKHNlbGYsIHNjcmlwdCwgb2VtX25vX21vdW50KToKKyAgICAjIFJlYWQgdGhlIHByb3BlcnR5IGRpcmVjdGx5IGlmIG5vdCB1c2luZyBPRU0gcHJvcGVydGllcy4KKyAgICBpZiBub3Qgc2VsZi5vZW1fcHJvcHM6CisgICAgICBzY3JpcHQuQXNzZXJ0RGV2aWNlKHNlbGYuZGV2aWNlKQorICAgICAgcmV0dXJuCisKKyAgICAjIE90aGVyd2lzZSBhc3NlcnQgT0VNIHByb3BlcnRpZXMuCisgICAgaWYgbm90IHNlbGYub2VtX2RpY3RzOgorICAgICAgcmFpc2UgY29tbW9uLkV4dGVybmFsRXJyb3IoCisgICAgICAgICAgIk5vIE9FTSBmaWxlIHByb3ZpZGVkIHRvIGFuc3dlciBleHBlY3RlZCBhc3NlcnRpb25zIikKKworICAgIGZvciBwcm9wIGluIHNlbGYub2VtX3Byb3BzLnNwbGl0KCk6CisgICAgICB2YWx1ZXMgPSBbXQorICAgICAgZm9yIG9lbV9kaWN0IGluIHNlbGYub2VtX2RpY3RzOgorICAgICAgICBpZiBwcm9wIGluIG9lbV9kaWN0OgorICAgICAgICAgIHZhbHVlcy5hcHBlbmQob2VtX2RpY3RbcHJvcF0pCisgICAgICBpZiBub3QgdmFsdWVzOgorICAgICAgICByYWlzZSBjb21tb24uRXh0ZXJuYWxFcnJvcigKKyAgICAgICAgICAgICJUaGUgT0VNIGZpbGUgaXMgbWlzc2luZyB0aGUgcHJvcGVydHkgJXMiICUgKHByb3AsKSkKKyAgICAgIHNjcmlwdC5Bc3NlcnRPZW1Qcm9wZXJ0eShwcm9wLCB2YWx1ZXMsIG9lbV9ub19tb3VudCkKKworCitjbGFzcyBQYXlsb2FkU2lnbmVyKG9iamVjdCk6CisgICIiIkEgY2xhc3MgdGhhdCB3cmFwcyB0aGUgcGF5bG9hZCBzaWduaW5nIHdvcmtzLgorCisgIFdoZW4gZ2VuZXJhdGluZyBhIFBheWxvYWQsIGhhc2hlcyBvZiB0aGUgcGF5bG9hZCBhbmQgbWV0YWRhdGEgZmlsZXMgd2lsbCBiZQorICBzaWduZWQgd2l0aCB0aGUgZGV2aWNlIGtleSwgZWl0aGVyIGJ5IGNhbGxpbmcgYW4gZXh0ZXJuYWwgcGF5bG9hZCBzaWduZXIgb3IKKyAgYnkgY2FsbGluZyBvcGVuc3NsIHdpdGggdGhlIHBhY2thZ2Uga2V5LiBUaGlzIGNsYXNzIHByb3ZpZGVzIGEgdW5pZmllZAorICBpbnRlcmZhY2UsIHNvIHRoYXQgY2FsbGVycyBjYW4ganVzdCBjYWxsIFBheWxvYWRTaWduZXIuU2lnbigpLgorCisgIElmIGFuIGV4dGVybmFsIHBheWxvYWQgc2lnbmVyIGhhcyBiZWVuIHNwZWNpZmllZCAoT1BUSU9OUy5wYXlsb2FkX3NpZ25lciksIGl0CisgIGNhbGxzIHRoZSBzaWduZXIgd2l0aCB0aGUgcHJvdmlkZWQgYXJncyAoT1BUSU9OUy5wYXlsb2FkX3NpZ25lcl9hcmdzKS4gTm90ZQorICB0aGF0IHRoZSBzaWduaW5nIGtleSBzaG91bGQgYmUgcHJvdmlkZWQgYXMgcGFydCBvZiB0aGUgcGF5bG9hZF9zaWduZXJfYXJncy4KKyAgT3RoZXJ3aXNlIHdpdGhvdXQgYW4gZXh0ZXJuYWwgc2lnbmVyLCBpdCB1c2VzIHRoZSBwYWNrYWdlIGtleQorICAoT1BUSU9OUy5wYWNrYWdlX2tleSkgYW5kIGNhbGxzIG9wZW5zc2wgZm9yIHRoZSBzaWduaW5nIHdvcmtzLgorICAiIiIKKworICBkZWYgX19pbml0X18oc2VsZik6CisgICAgaWYgT1BUSU9OUy5wYXlsb2FkX3NpZ25lciBpcyBOb25lOgorICAgICAgIyBQcmVwYXJlIHRoZSBwYXlsb2FkIHNpZ25pbmcga2V5LgorICAgICAgcHJpdmF0ZV9rZXkgPSBPUFRJT05TLnBhY2thZ2Vfa2V5ICsgT1BUSU9OUy5wcml2YXRlX2tleV9zdWZmaXgKKyAgICAgIHB3ID0gT1BUSU9OUy5rZXlfcGFzc3dvcmRzW09QVElPTlMucGFja2FnZV9rZXldCisKKyAgICAgIGNtZCA9IFsib3BlbnNzbCIsICJwa2NzOCIsICItaW4iLCBwcml2YXRlX2tleSwgIi1pbmZvcm0iLCAiREVSIl0KKyAgICAgIGNtZC5leHRlbmQoWyItcGFzc2luIiwgInBhc3M6IiArIHB3XSBpZiBwdyBlbHNlIFsiLW5vY3J5cHQiXSkKKyAgICAgIHNpZ25pbmdfa2V5ID0gY29tbW9uLk1ha2VUZW1wRmlsZShwcmVmaXg9ImtleS0iLCBzdWZmaXg9Ii5rZXkiKQorICAgICAgY21kLmV4dGVuZChbIi1vdXQiLCBzaWduaW5nX2tleV0pCisKKyAgICAgIGdldF9zaWduaW5nX2tleSA9IGNvbW1vbi5SdW4oY21kLCB2ZXJib3NlPUZhbHNlLCBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRlcnI9c3VicHJvY2Vzcy5TVERPVVQpCisgICAgICBzdGRvdXRkYXRhLCBfID0gZ2V0X3NpZ25pbmdfa2V5LmNvbW11bmljYXRlKCkKKyAgICAgIGFzc2VydCBnZXRfc2lnbmluZ19rZXkucmV0dXJuY29kZSA9PSAwLCBcCisgICAgICAgICAgIkZhaWxlZCB0byBnZXQgc2lnbmluZyBrZXk6IHt9Ii5mb3JtYXQoc3Rkb3V0ZGF0YSkKKworICAgICAgc2VsZi5zaWduZXIgPSAib3BlbnNzbCIKKyAgICAgIHNlbGYuc2lnbmVyX2FyZ3MgPSBbInBrZXl1dGwiLCAiLXNpZ24iLCAiLWlua2V5Iiwgc2lnbmluZ19rZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICItcGtleW9wdCIsICJkaWdlc3Q6c2hhMjU2Il0KKyAgICBlbHNlOgorICAgICAgc2VsZi5zaWduZXIgPSBPUFRJT05TLnBheWxvYWRfc2lnbmVyCisgICAgICBzZWxmLnNpZ25lcl9hcmdzID0gT1BUSU9OUy5wYXlsb2FkX3NpZ25lcl9hcmdzCisKKyAgZGVmIFNpZ24oc2VsZiwgaW5fZmlsZSk6CisgICAgIiIiU2lnbnMgdGhlIGdpdmVuIGlucHV0IGZpbGUuIFJldHVybnMgdGhlIG91dHB1dCBmaWxlbmFtZS4iIiIKKyAgICBvdXRfZmlsZSA9IGNvbW1vbi5NYWtlVGVtcEZpbGUocHJlZml4PSJzaWduZWQtIiwgc3VmZml4PSIuYmluIikKKyAgICBjbWQgPSBbc2VsZi5zaWduZXJdICsgc2VsZi5zaWduZXJfYXJncyArIFsnLWluJywgaW5fZmlsZSwgJy1vdXQnLCBvdXRfZmlsZV0KKyAgICBzaWduaW5nID0gY29tbW9uLlJ1bihjbWQsIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsIHN0ZGVycj1zdWJwcm9jZXNzLlNURE9VVCkKKyAgICBzdGRvdXRkYXRhLCBfID0gc2lnbmluZy5jb21tdW5pY2F0ZSgpCisgICAgYXNzZXJ0IHNpZ25pbmcucmV0dXJuY29kZSA9PSAwLCBcCisgICAgICAgICJGYWlsZWQgdG8gc2lnbiB0aGUgaW5wdXQgZmlsZToge30iLmZvcm1hdChzdGRvdXRkYXRhKQorICAgIHJldHVybiBvdXRfZmlsZQorCisKK2NsYXNzIFBheWxvYWQob2JqZWN0KToKKyAgIiIiTWFuYWdlcyB0aGUgY3JlYXRpb24gYW5kIHRoZSBzaWduaW5nIG9mIGFuIEEvQiBPVEEgUGF5bG9hZC4iIiIKKworICBQQVlMT0FEX0JJTiA9ICdwYXlsb2FkLmJpbicKKyAgUEFZTE9BRF9QUk9QRVJUSUVTX1RYVCA9ICdwYXlsb2FkX3Byb3BlcnRpZXMudHh0JworICBTRUNPTkRBUllfUEFZTE9BRF9CSU4gPSAnc2Vjb25kYXJ5L3BheWxvYWQuYmluJworICBTRUNPTkRBUllfUEFZTE9BRF9QUk9QRVJUSUVTX1RYVCA9ICdzZWNvbmRhcnkvcGF5bG9hZF9wcm9wZXJ0aWVzLnR4dCcKKworICBkZWYgX19pbml0X18oc2VsZiwgc2Vjb25kYXJ5PUZhbHNlKToKKyAgICAiIiJJbml0aWFsaXplcyBhIFBheWxvYWQgaW5zdGFuY2UuCisKKyAgICBBcmdzOgorICAgICAgc2Vjb25kYXJ5OiBXaGV0aGVyIGl0J3MgZ2VuZXJhdGluZyBhIHNlY29uZGFyeSBwYXlsb2FkIChkZWZhdWx0OiBGYWxzZSkuCisgICAgIiIiCisgICAgIyBUaGUgcGxhY2Ugd2hlcmUgdGhlIG91dHB1dCBmcm9tIHRoZSBzdWJwcm9jZXNzIHNob3VsZCBnby4KKyAgICBzZWxmLl9sb2dfZmlsZSA9IHN5cy5zdGRvdXQgaWYgT1BUSU9OUy52ZXJib3NlIGVsc2Ugc3VicHJvY2Vzcy5QSVBFCisgICAgc2VsZi5wYXlsb2FkX2ZpbGUgPSBOb25lCisgICAgc2VsZi5wYXlsb2FkX3Byb3BlcnRpZXMgPSBOb25lCisgICAgc2VsZi5zZWNvbmRhcnkgPSBzZWNvbmRhcnkKKworICBkZWYgR2VuZXJhdGUoc2VsZiwgdGFyZ2V0X2ZpbGUsIHNvdXJjZV9maWxlPU5vbmUsIGFkZGl0aW9uYWxfYXJncz1Ob25lKToKKyAgICAiIiJHZW5lcmF0ZXMgYSBwYXlsb2FkIGZyb20gdGhlIGdpdmVuIHRhcmdldC1maWxlcyB6aXAocykuCisKKyAgICBBcmdzOgorICAgICAgdGFyZ2V0X2ZpbGU6IFRoZSBmaWxlbmFtZSBvZiB0aGUgdGFyZ2V0IGJ1aWxkIHRhcmdldC1maWxlcyB6aXAuCisgICAgICBzb3VyY2VfZmlsZTogVGhlIGZpbGVuYW1lIG9mIHRoZSBzb3VyY2UgYnVpbGQgdGFyZ2V0LWZpbGVzIHppcDsgb3IgTm9uZSBpZgorICAgICAgICAgIGdlbmVyYXRpbmcgYSBmdWxsIE9UQS4KKyAgICAgIGFkZGl0aW9uYWxfYXJnczogQSBsaXN0IG9mIGFkZGl0aW9uYWwgYXJncyB0aGF0IHNob3VsZCBiZSBwYXNzZWQgdG8KKyAgICAgICAgICBicmlsbG9fdXBkYXRlX3BheWxvYWQgc2NyaXB0OyBvciBOb25lLgorICAgICIiIgorICAgIGlmIGFkZGl0aW9uYWxfYXJncyBpcyBOb25lOgorICAgICAgYWRkaXRpb25hbF9hcmdzID0gW10KKworICAgIHBheWxvYWRfZmlsZSA9IGNvbW1vbi5NYWtlVGVtcEZpbGUocHJlZml4PSJwYXlsb2FkLSIsIHN1ZmZpeD0iLmJpbiIpCisgICAgY21kID0gWyJicmlsbG9fdXBkYXRlX3BheWxvYWQiLCAiZ2VuZXJhdGUiLAorICAgICAgICAgICAiLS1wYXlsb2FkIiwgcGF5bG9hZF9maWxlLAorICAgICAgICAgICAiLS10YXJnZXRfaW1hZ2UiLCB0YXJnZXRfZmlsZV0KKyAgICBpZiBzb3VyY2VfZmlsZSBpcyBub3QgTm9uZToKKyAgICAgIGNtZC5leHRlbmQoWyItLXNvdXJjZV9pbWFnZSIsIHNvdXJjZV9maWxlXSkKKyAgICBjbWQuZXh0ZW5kKGFkZGl0aW9uYWxfYXJncykKKyAgICBwID0gY29tbW9uLlJ1bihjbWQsIHN0ZG91dD1zZWxmLl9sb2dfZmlsZSwgc3RkZXJyPXN1YnByb2Nlc3MuU1RET1VUKQorICAgIHN0ZG91dGRhdGEsIF8gPSBwLmNvbW11bmljYXRlKCkKKyAgICBhc3NlcnQgcC5yZXR1cm5jb2RlID09IDAsIFwKKyAgICAgICAgImJyaWxsb191cGRhdGVfcGF5bG9hZCBnZW5lcmF0ZSBmYWlsZWQ6IHt9Ii5mb3JtYXQoc3Rkb3V0ZGF0YSkKKworICAgIHNlbGYucGF5bG9hZF9maWxlID0gcGF5bG9hZF9maWxlCisgICAgc2VsZi5wYXlsb2FkX3Byb3BlcnRpZXMgPSBOb25lCisKKyAgZGVmIFNpZ24oc2VsZiwgcGF5bG9hZF9zaWduZXIpOgorICAgICIiIkdlbmVyYXRlcyBhbmQgc2lnbnMgdGhlIGhhc2hlcyBvZiB0aGUgcGF5bG9hZCBhbmQgbWV0YWRhdGEuCisKKyAgICBBcmdzOgorICAgICAgcGF5bG9hZF9zaWduZXI6IEEgUGF5bG9hZFNpZ25lcigpIGluc3RhbmNlIHRoYXQgc2VydmVzIHRoZSBzaWduaW5nIHdvcmsuCisKKyAgICBSYWlzZXM6CisgICAgICBBc3NlcnRpb25FcnJvcjogT24gYW55IGZhaWx1cmUgd2hlbiBjYWxsaW5nIGJyaWxsb191cGRhdGVfcGF5bG9hZCBzY3JpcHQuCisgICAgIiIiCisgICAgYXNzZXJ0IGlzaW5zdGFuY2UocGF5bG9hZF9zaWduZXIsIFBheWxvYWRTaWduZXIpCisKKyAgICAjIDEuIEdlbmVyYXRlIGhhc2hlcyBvZiB0aGUgcGF5bG9hZCBhbmQgbWV0YWRhdGEgZmlsZXMuCisgICAgcGF5bG9hZF9zaWdfZmlsZSA9IGNvbW1vbi5NYWtlVGVtcEZpbGUocHJlZml4PSJzaWctIiwgc3VmZml4PSIuYmluIikKKyAgICBtZXRhZGF0YV9zaWdfZmlsZSA9IGNvbW1vbi5NYWtlVGVtcEZpbGUocHJlZml4PSJzaWctIiwgc3VmZml4PSIuYmluIikKKyAgICBjbWQgPSBbImJyaWxsb191cGRhdGVfcGF5bG9hZCIsICJoYXNoIiwKKyAgICAgICAgICAgIi0tdW5zaWduZWRfcGF5bG9hZCIsIHNlbGYucGF5bG9hZF9maWxlLAorICAgICAgICAgICAiLS1zaWduYXR1cmVfc2l6ZSIsICIyNTYiLAorICAgICAgICAgICAiLS1tZXRhZGF0YV9oYXNoX2ZpbGUiLCBtZXRhZGF0YV9zaWdfZmlsZSwKKyAgICAgICAgICAgIi0tcGF5bG9hZF9oYXNoX2ZpbGUiLCBwYXlsb2FkX3NpZ19maWxlXQorICAgIHAxID0gY29tbW9uLlJ1bihjbWQsIHN0ZG91dD1zZWxmLl9sb2dfZmlsZSwgc3RkZXJyPXN1YnByb2Nlc3MuU1RET1VUKQorICAgIHAxLmNvbW11bmljYXRlKCkKKyAgICBhc3NlcnQgcDEucmV0dXJuY29kZSA9PSAwLCAiYnJpbGxvX3VwZGF0ZV9wYXlsb2FkIGhhc2ggZmFpbGVkIgorCisgICAgIyAyLiBTaWduIHRoZSBoYXNoZXMuCisgICAgc2lnbmVkX3BheWxvYWRfc2lnX2ZpbGUgPSBwYXlsb2FkX3NpZ25lci5TaWduKHBheWxvYWRfc2lnX2ZpbGUpCisgICAgc2lnbmVkX21ldGFkYXRhX3NpZ19maWxlID0gcGF5bG9hZF9zaWduZXIuU2lnbihtZXRhZGF0YV9zaWdfZmlsZSkKKworICAgICMgMy4gSW5zZXJ0IHRoZSBzaWduYXR1cmVzIGJhY2sgaW50byB0aGUgcGF5bG9hZCBmaWxlLgorICAgIHNpZ25lZF9wYXlsb2FkX2ZpbGUgPSBjb21tb24uTWFrZVRlbXBGaWxlKHByZWZpeD0ic2lnbmVkLXBheWxvYWQtIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWZmaXg9Ii5iaW4iKQorICAgIGNtZCA9IFsiYnJpbGxvX3VwZGF0ZV9wYXlsb2FkIiwgInNpZ24iLAorICAgICAgICAgICAiLS11bnNpZ25lZF9wYXlsb2FkIiwgc2VsZi5wYXlsb2FkX2ZpbGUsCisgICAgICAgICAgICItLXBheWxvYWQiLCBzaWduZWRfcGF5bG9hZF9maWxlLAorICAgICAgICAgICAiLS1zaWduYXR1cmVfc2l6ZSIsICIyNTYiLAorICAgICAgICAgICAiLS1tZXRhZGF0YV9zaWduYXR1cmVfZmlsZSIsIHNpZ25lZF9tZXRhZGF0YV9zaWdfZmlsZSwKKyAgICAgICAgICAgIi0tcGF5bG9hZF9zaWduYXR1cmVfZmlsZSIsIHNpZ25lZF9wYXlsb2FkX3NpZ19maWxlXQorICAgIHAxID0gY29tbW9uLlJ1bihjbWQsIHN0ZG91dD1zZWxmLl9sb2dfZmlsZSwgc3RkZXJyPXN1YnByb2Nlc3MuU1RET1VUKQorICAgIHAxLmNvbW11bmljYXRlKCkKKyAgICBhc3NlcnQgcDEucmV0dXJuY29kZSA9PSAwLCAiYnJpbGxvX3VwZGF0ZV9wYXlsb2FkIHNpZ24gZmFpbGVkIgorCisgICAgIyA0LiBEdW1wIHRoZSBzaWduZWQgcGF5bG9hZCBwcm9wZXJ0aWVzLgorICAgIHByb3BlcnRpZXNfZmlsZSA9IGNvbW1vbi5NYWtlVGVtcEZpbGUocHJlZml4PSJwYXlsb2FkLXByb3BlcnRpZXMtIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1ZmZpeD0iLnR4dCIpCisgICAgY21kID0gWyJicmlsbG9fdXBkYXRlX3BheWxvYWQiLCAicHJvcGVydGllcyIsCisgICAgICAgICAgICItLXBheWxvYWQiLCBzaWduZWRfcGF5bG9hZF9maWxlLAorICAgICAgICAgICAiLS1wcm9wZXJ0aWVzX2ZpbGUiLCBwcm9wZXJ0aWVzX2ZpbGVdCisgICAgcDEgPSBjb21tb24uUnVuKGNtZCwgc3Rkb3V0PXNlbGYuX2xvZ19maWxlLCBzdGRlcnI9c3VicHJvY2Vzcy5TVERPVVQpCisgICAgcDEuY29tbXVuaWNhdGUoKQorICAgIGFzc2VydCBwMS5yZXR1cm5jb2RlID09IDAsICJicmlsbG9fdXBkYXRlX3BheWxvYWQgcHJvcGVydGllcyBmYWlsZWQiCisKKyAgICBpZiBzZWxmLnNlY29uZGFyeToKKyAgICAgIHdpdGggb3Blbihwcm9wZXJ0aWVzX2ZpbGUsICJhIikgYXMgZjoKKyAgICAgICAgZi53cml0ZSgiU1dJVENIX1NMT1RfT05fUkVCT09UPTBcbiIpCisKKyAgICBpZiBPUFRJT05TLndpcGVfdXNlcl9kYXRhOgorICAgICAgd2l0aCBvcGVuKHByb3BlcnRpZXNfZmlsZSwgImEiKSBhcyBmOgorICAgICAgICBmLndyaXRlKCJQT1dFUldBU0g9MVxuIikKKworICAgIHNlbGYucGF5bG9hZF9maWxlID0gc2lnbmVkX3BheWxvYWRfZmlsZQorICAgIHNlbGYucGF5bG9hZF9wcm9wZXJ0aWVzID0gcHJvcGVydGllc19maWxlCisKKyAgZGVmIFdyaXRlVG9aaXAoc2VsZiwgb3V0cHV0X3ppcCk6CisgICAgIiIiV3JpdGVzIHRoZSBwYXlsb2FkIHRvIHRoZSBnaXZlbiB6aXAuCisKKyAgICBBcmdzOgorICAgICAgb3V0cHV0X3ppcDogVGhlIG91dHB1dCBaaXBGaWxlIGluc3RhbmNlLgorICAgICIiIgorICAgIGFzc2VydCBzZWxmLnBheWxvYWRfZmlsZSBpcyBub3QgTm9uZQorICAgIGFzc2VydCBzZWxmLnBheWxvYWRfcHJvcGVydGllcyBpcyBub3QgTm9uZQorCisgICAgaWYgc2VsZi5zZWNvbmRhcnk6CisgICAgICBwYXlsb2FkX2FyY25hbWUgPSBQYXlsb2FkLlNFQ09OREFSWV9QQVlMT0FEX0JJTgorICAgICAgcGF5bG9hZF9wcm9wZXJ0aWVzX2FyY25hbWUgPSBQYXlsb2FkLlNFQ09OREFSWV9QQVlMT0FEX1BST1BFUlRJRVNfVFhUCisgICAgZWxzZToKKyAgICAgIHBheWxvYWRfYXJjbmFtZSA9IFBheWxvYWQuUEFZTE9BRF9CSU4KKyAgICAgIHBheWxvYWRfcHJvcGVydGllc19hcmNuYW1lID0gUGF5bG9hZC5QQVlMT0FEX1BST1BFUlRJRVNfVFhUCisKKyAgICAjIEFkZCB0aGUgc2lnbmVkIHBheWxvYWQgZmlsZSBhbmQgcHJvcGVydGllcyBpbnRvIHRoZSB6aXAuIEluIG9yZGVyIHRvCisgICAgIyBzdXBwb3J0IHN0cmVhbWluZywgd2UgcGFjayB0aGVtIGFzIFpJUF9TVE9SRUQuIFNvIHRoZXNlIGVudHJpZXMgY2FuIGJlCisgICAgIyByZWFkIGRpcmVjdGx5IHdpdGggdGhlIG9mZnNldCBhbmQgbGVuZ3RoIHBhaXJzLgorICAgIGNvbW1vbi5aaXBXcml0ZShvdXRwdXRfemlwLCBzZWxmLnBheWxvYWRfZmlsZSwgYXJjbmFtZT1wYXlsb2FkX2FyY25hbWUsCisgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzX3R5cGU9emlwZmlsZS5aSVBfU1RPUkVEKQorICAgIGNvbW1vbi5aaXBXcml0ZShvdXRwdXRfemlwLCBzZWxmLnBheWxvYWRfcHJvcGVydGllcywKKyAgICAgICAgICAgICAgICAgICAgYXJjbmFtZT1wYXlsb2FkX3Byb3BlcnRpZXNfYXJjbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgY29tcHJlc3NfdHlwZT16aXBmaWxlLlpJUF9TVE9SRUQpCisKKwogZGVmIFNpZ25PdXRwdXQodGVtcF96aXBfbmFtZSwgb3V0cHV0X3ppcF9uYW1lKToKICAgcHcgPSBPUFRJT05TLmtleV9wYXNzd29yZHNbT1BUSU9OUy5wYWNrYWdlX2tleV0KIApAQCAtMTk0LDM3ICs1MzYsMTUgQEAKICAgICAgICAgICAgICAgICAgIHdob2xlX2ZpbGU9VHJ1ZSkKIAogCi1kZWYgQXBwZW5kQXNzZXJ0aW9ucyhzY3JpcHQsIGluZm9fZGljdCwgb2VtX2RpY3RzPU5vbmUpOgotICBvZW1fcHJvcHMgPSBpbmZvX2RpY3QuZ2V0KCJvZW1fZmluZ2VycHJpbnRfcHJvcGVydGllcyIpCi0gIGlmIG5vdCBvZW1fcHJvcHM6Ci0gICAgZGV2aWNlID0gR2V0QnVpbGRQcm9wKCJyby5wcm9kdWN0LmRldmljZSIsIGluZm9fZGljdCkKLSAgICBzY3JpcHQuQXNzZXJ0RGV2aWNlKGRldmljZSkKLSAgZWxzZToKLSAgICBpZiBub3Qgb2VtX2RpY3RzOgotICAgICAgcmFpc2UgY29tbW9uLkV4dGVybmFsRXJyb3IoCi0gICAgICAgICAgIk5vIE9FTSBmaWxlIHByb3ZpZGVkIHRvIGFuc3dlciBleHBlY3RlZCBhc3NlcnRpb25zIikKLSAgICBmb3IgcHJvcCBpbiBvZW1fcHJvcHMuc3BsaXQoKToKLSAgICAgIHZhbHVlcyA9IFtdCi0gICAgICBmb3Igb2VtX2RpY3QgaW4gb2VtX2RpY3RzOgotICAgICAgICBpZiBvZW1fZGljdC5nZXQocHJvcCk6Ci0gICAgICAgICAgdmFsdWVzLmFwcGVuZChvZW1fZGljdFtwcm9wXSkKLSAgICAgIGlmIG5vdCB2YWx1ZXM6Ci0gICAgICAgIHJhaXNlIGNvbW1vbi5FeHRlcm5hbEVycm9yKAotICAgICAgICAgICAgIlRoZSBPRU0gZmlsZSBpcyBtaXNzaW5nIHRoZSBwcm9wZXJ0eSAlcyIgJSBwcm9wKQotICAgICAgc2NyaXB0LkFzc2VydE9lbVByb3BlcnR5KHByb3AsIHZhbHVlcykKLQotCi1kZWYgX0xvYWRPZW1EaWN0cyhzY3JpcHQsIHJlY292ZXJ5X21vdW50X29wdGlvbnM9Tm9uZSk6CitkZWYgX0xvYWRPZW1EaWN0cyhvZW1fc291cmNlKToKICAgIiIiUmV0dXJucyB0aGUgbGlzdCBvZiBsb2FkZWQgT0VNIHByb3BlcnRpZXMgZGljdC4iIiIKLSAgb2VtX2RpY3RzID0gTm9uZQotICBpZiBPUFRJT05TLm9lbV9zb3VyY2UgaXMgTm9uZToKLSAgICByYWlzZSBjb21tb24uRXh0ZXJuYWxFcnJvcigiT0VNIHNvdXJjZSByZXF1aXJlZCBmb3IgdGhpcyBidWlsZCIpCi0gIGlmIG5vdCBPUFRJT05TLm9lbV9ub19tb3VudCBhbmQgc2NyaXB0OgotICAgIHNjcmlwdC5Nb3VudCgiL29lbSIsIHJlY292ZXJ5X21vdW50X29wdGlvbnMpCisgIGlmIG5vdCBvZW1fc291cmNlOgorICAgIHJldHVybiBOb25lCisKICAgb2VtX2RpY3RzID0gW10KLSAgZm9yIG9lbV9maWxlIGluIE9QVElPTlMub2VtX3NvdXJjZToKLSAgICBvZW1fZGljdHMuYXBwZW5kKGNvbW1vbi5Mb2FkRGljdGlvbmFyeUZyb21MaW5lcygKLSAgICAgICAgb3BlbihvZW1fZmlsZSkucmVhZGxpbmVzKCkpKQorICBmb3Igb2VtX2ZpbGUgaW4gb2VtX3NvdXJjZToKKyAgICB3aXRoIG9wZW4ob2VtX2ZpbGUpIGFzIGZwOgorICAgICAgb2VtX2RpY3RzLmFwcGVuZChjb21tb24uTG9hZERpY3Rpb25hcnlGcm9tTGluZXMoZnAucmVhZGxpbmVzKCkpKQogICByZXR1cm4gb2VtX2RpY3RzCiAKIApAQCAtMjc1LDEyNiArNTk1LDE0NSBAQAogICAgIHJldHVybiBGYWxzZQogCiAKLWRlZiBHZXRPZW1Qcm9wZXJ0eShuYW1lLCBvZW1fcHJvcHMsIG9lbV9kaWN0LCBpbmZvX2RpY3QpOgotICBpZiBvZW1fcHJvcHMgaXMgbm90IE5vbmUgYW5kIG5hbWUgaW4gb2VtX3Byb3BzOgotICAgIHJldHVybiBvZW1fZGljdFtuYW1lXQotICByZXR1cm4gR2V0QnVpbGRQcm9wKG5hbWUsIGluZm9fZGljdCkKK2RlZiBIYXNUcmVibGVFbmFibGVkKHRhcmdldF9maWxlc196aXAsIHRhcmdldF9pbmZvKToKKyAgcmV0dXJuIChIYXNWZW5kb3JQYXJ0aXRpb24odGFyZ2V0X2ZpbGVzX3ppcCkgYW5kCisgICAgICAgICAgdGFyZ2V0X2luZm8uR2V0QnVpbGRQcm9wKCJyby50cmVibGUuZW5hYmxlZCIpID09ICJ0cnVlIikKIAogCi1kZWYgQ2FsY3VsYXRlRmluZ2VycHJpbnQob2VtX3Byb3BzLCBvZW1fZGljdCwgaW5mb19kaWN0KToKLSAgaWYgb2VtX3Byb3BzIGlzIE5vbmU6Ci0gICAgcmV0dXJuIEdldEJ1aWxkUHJvcCgicm8uYnVpbGQuZmluZ2VycHJpbnQiLCBpbmZvX2RpY3QpCi0gIHJldHVybiAiJXMvJXMvJXM6JXMiICUgKAotICAgICAgR2V0T2VtUHJvcGVydHkoInJvLnByb2R1Y3QuYnJhbmQiLCBvZW1fcHJvcHMsIG9lbV9kaWN0LCBpbmZvX2RpY3QpLAotICAgICAgR2V0T2VtUHJvcGVydHkoInJvLnByb2R1Y3QubmFtZSIsIG9lbV9wcm9wcywgb2VtX2RpY3QsIGluZm9fZGljdCksCi0gICAgICBHZXRPZW1Qcm9wZXJ0eSgicm8ucHJvZHVjdC5kZXZpY2UiLCBvZW1fcHJvcHMsIG9lbV9kaWN0LCBpbmZvX2RpY3QpLAotICAgICAgR2V0QnVpbGRQcm9wKCJyby5idWlsZC50aHVtYnByaW50IiwgaW5mb19kaWN0KSkKK2RlZiBXcml0ZUZpbmdlcnByaW50QXNzZXJ0aW9uKHNjcmlwdCwgdGFyZ2V0X2luZm8sIHNvdXJjZV9pbmZvKToKKyAgc291cmNlX29lbV9wcm9wcyA9IHNvdXJjZV9pbmZvLm9lbV9wcm9wcworICB0YXJnZXRfb2VtX3Byb3BzID0gdGFyZ2V0X2luZm8ub2VtX3Byb3BzCisKKyAgaWYgc291cmNlX29lbV9wcm9wcyBpcyBOb25lIGFuZCB0YXJnZXRfb2VtX3Byb3BzIGlzIE5vbmU6CisgICAgc2NyaXB0LkFzc2VydFNvbWVGaW5nZXJwcmludCgKKyAgICAgICAgc291cmNlX2luZm8uZmluZ2VycHJpbnQsIHRhcmdldF9pbmZvLmZpbmdlcnByaW50KQorICBlbGlmIHNvdXJjZV9vZW1fcHJvcHMgaXMgbm90IE5vbmUgYW5kIHRhcmdldF9vZW1fcHJvcHMgaXMgbm90IE5vbmU6CisgICAgc2NyaXB0LkFzc2VydFNvbWVUaHVtYnByaW50KAorICAgICAgICB0YXJnZXRfaW5mby5HZXRCdWlsZFByb3AoInJvLmJ1aWxkLnRodW1icHJpbnQiKSwKKyAgICAgICAgc291cmNlX2luZm8uR2V0QnVpbGRQcm9wKCJyby5idWlsZC50aHVtYnByaW50IikpCisgIGVsaWYgc291cmNlX29lbV9wcm9wcyBpcyBOb25lIGFuZCB0YXJnZXRfb2VtX3Byb3BzIGlzIG5vdCBOb25lOgorICAgIHNjcmlwdC5Bc3NlcnRGaW5nZXJwcmludE9yVGh1bWJwcmludCgKKyAgICAgICAgc291cmNlX2luZm8uZmluZ2VycHJpbnQsCisgICAgICAgIHRhcmdldF9pbmZvLkdldEJ1aWxkUHJvcCgicm8uYnVpbGQudGh1bWJwcmludCIpKQorICBlbHNlOgorICAgIHNjcmlwdC5Bc3NlcnRGaW5nZXJwcmludE9yVGh1bWJwcmludCgKKyAgICAgICAgdGFyZ2V0X2luZm8uZmluZ2VycHJpbnQsCisgICAgICAgIHNvdXJjZV9pbmZvLkdldEJ1aWxkUHJvcCgicm8uYnVpbGQudGh1bWJwcmludCIpKQogCiAKLWRlZiBHZXRJbWFnZSh3aGljaCwgdG1wZGlyKToKLSAgIiIiUmV0dXJucyBhbiBpbWFnZSBvYmplY3Qgc3VpdGFibGUgZm9yIHBhc3NpbmcgdG8gQmxvY2tJbWFnZURpZmYuCi0KLSAgJ3doaWNoJyBwYXJ0aXRpb24gbXVzdCBiZSAic3lzdGVtIiBvciAidmVuZG9yIi4gQSBwcmVidWlsdCBpbWFnZSBhbmQgZmlsZQotICBtYXAgbXVzdCBhbHJlYWR5IGV4aXN0IGluIHRtcGRpci4KLSAgIiIiCi0KLSAgYXNzZXJ0IHdoaWNoIGluICgic3lzdGVtIiwgInZlbmRvciIpCi0KLSAgcGF0aCA9IG9zLnBhdGguam9pbih0bXBkaXIsICJJTUFHRVMiLCB3aGljaCArICIuaW1nIikKLSAgbWFwcGF0aCA9IG9zLnBhdGguam9pbih0bXBkaXIsICJJTUFHRVMiLCB3aGljaCArICIubWFwIikKLQotICAjIFRoZSBpbWFnZSBhbmQgbWFwIGZpbGVzIG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQgcHJpb3IgdG8gY2FsbGluZwotICAjIG90YV9mcm9tX3RhcmdldF9maWxlcy5weSAoc2luY2UgTE1QKS4KLSAgYXNzZXJ0IG9zLnBhdGguZXhpc3RzKHBhdGgpIGFuZCBvcy5wYXRoLmV4aXN0cyhtYXBwYXRoKQotCi0gICMgQnVnOiBodHRwOi8vYi8yMDkzOTEzMQotICAjIEluIGV4dDQgZmlsZXN5c3RlbXMsIGJsb2NrIDAgbWlnaHQgYmUgY2hhbmdlZCBldmVuIGJlaW5nIG1vdW50ZWQKLSAgIyBSL08uIFdlIGFkZCBpdCB0byBjbG9iYmVyZWRfYmxvY2tzIHNvIHRoYXQgaXQgd2lsbCBiZSB3cml0dGVuIHRvIHRoZQotICAjIHRhcmdldCB1bmNvbmRpdGlvbmFsbHkuIE5vdGUgdGhhdCB0aGV5IGFyZSBzdGlsbCBwYXJ0IG9mIGNhcmVfbWFwLgotICBjbG9iYmVyZWRfYmxvY2tzID0gIjAiCi0KLSAgcmV0dXJuIHNwYXJzZV9pbWcuU3BhcnNlSW1hZ2UocGF0aCwgbWFwcGF0aCwgY2xvYmJlcmVkX2Jsb2NrcykKLQotCi1kZWYgQWRkQ29tcGF0aWJpbGl0eUFyY2hpdmUodGFyZ2V0X3ppcCwgb3V0cHV0X3ppcCwgc3lzdGVtX2luY2x1ZGVkPVRydWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVuZG9yX2luY2x1ZGVkPVRydWUpOgotICAiIiJBZGRzIGNvbXBhdGliaWxpdHkgaW5mbyBmcm9tIHRhcmdldCBmaWxlcyBpbnRvIHRoZSBvdXRwdXQgemlwLgorZGVmIEFkZENvbXBhdGliaWxpdHlBcmNoaXZlSWZUcmVibGVFbmFibGVkKHRhcmdldF96aXAsIG91dHB1dF96aXAsIHRhcmdldF9pbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZV9pbmZvPU5vbmUpOgorICAiIiJBZGRzIGNvbXBhdGliaWxpdHkgaW5mbyBpbnRvIHRoZSBvdXRwdXQgemlwIGlmIGl0J3MgVHJlYmxlLWVuYWJsZWQgdGFyZ2V0LgogCiAgIE1ldGFkYXRhIHVzZWQgZm9yIG9uLWRldmljZSBjb21wYXRpYmlsaXR5IHZlcmlmaWNhdGlvbiBpcyByZXRyaWV2ZWQgZnJvbQogICB0YXJnZXRfemlwIHRoZW4gYWRkZWQgdG8gY29tcGF0aWJpbGl0eS56aXAgd2hpY2ggaXMgYWRkZWQgdG8gdGhlIG91dHB1dF96aXAKICAgYXJjaGl2ZS4KIAotICBDb21wYXRpYmlsaXR5IGFyY2hpdmUgc2hvdWxkIG9ubHkgYmUgaW5jbHVkZWQgZm9yIGRldmljZXMgd2l0aCBhIHZlbmRvcgotICBwYXJ0aXRpb24gYXMgY2hlY2tpbmcgcHJvdmlkZXMgdmFsdWUgd2hlbiBzeXN0ZW0gYW5kIHZlbmRvciBhcmUgaW5kZXBlbmRlbnRseQotICB2ZXJzaW9uZWQuCisgIENvbXBhdGliaWxpdHkgYXJjaGl2ZSBzaG91bGQgb25seSBiZSBpbmNsdWRlZCBmb3IgZGV2aWNlcyB0aGF0IGhhdmUgZW5hYmxlZAorICBUcmVibGUgc3VwcG9ydC4KIAogICBBcmdzOgogICAgIHRhcmdldF96aXA6IFppcCBmaWxlIGNvbnRhaW5pbmcgdGhlIHNvdXJjZSBmaWxlcyB0byBiZSBpbmNsdWRlZCBmb3IgT1RBLgogICAgIG91dHB1dF96aXA6IFppcCBmaWxlIHRoYXQgd2lsbCBiZSBzZW50IGZvciBPVEEuCi0gICAgc3lzdGVtX2luY2x1ZGVkOiBJZiBUcnVlLCB0aGUgc3lzdGVtIGltYWdlIHdpbGwgYmUgdXBkYXRlZCBhbmQgdGhlcmVmb3JlCi0gICAgICAgIGl0cyBtZXRhZGF0YSBzaG91bGQgYmUgaW5jbHVkZWQuCi0gICAgdmVuZG9yX2luY2x1ZGVkOiBJZiBUcnVlLCB0aGUgdmVuZG9yIGltYWdlIHdpbGwgYmUgdXBkYXRlZCBhbmQgdGhlcmVmb3JlCi0gICAgICAgIGl0cyBtZXRhZGF0YSBzaG91bGQgYmUgaW5jbHVkZWQuCisgICAgdGFyZ2V0X2luZm86IFRoZSBCdWlsZEluZm8gaW5zdGFuY2UgdGhhdCBob2xkcyB0aGUgdGFyZ2V0IGJ1aWxkIGluZm8uCisgICAgc291cmNlX2luZm86IFRoZSBCdWlsZEluZm8gaW5zdGFuY2UgdGhhdCBob2xkcyB0aGUgc291cmNlIGJ1aWxkIGluZm8sIGlmCisgICAgICAgIGdlbmVyYXRpbmcgYW4gaW5jcmVtZW50YWwgT1RBOyBOb25lIG90aGVyd2lzZS4KICAgIiIiCiAKLSAgIyBEZXRlcm1pbmUgd2hhdCBtZXRhZGF0YSB3ZSBuZWVkLiBGaWxlcyBhcmUgbmFtZXMgcmVsYXRpdmUgdG8gTUVUQS8uCi0gIGNvbXBhdGliaWxpdHlfZmlsZXMgPSBbXQotICB2ZW5kb3JfbWV0YWRhdGEgPSAoInZlbmRvcl9tYW5pZmVzdC54bWwiLCAidmVuZG9yX21hdHJpeC54bWwiKQotICBzeXN0ZW1fbWV0YWRhdGEgPSAoInN5c3RlbV9tYW5pZmVzdC54bWwiLCAic3lzdGVtX21hdHJpeC54bWwiKQotICBpZiB2ZW5kb3JfaW5jbHVkZWQ6Ci0gICAgY29tcGF0aWJpbGl0eV9maWxlcyArPSB2ZW5kb3JfbWV0YWRhdGEKLSAgaWYgc3lzdGVtX2luY2x1ZGVkOgotICAgIGNvbXBhdGliaWxpdHlfZmlsZXMgKz0gc3lzdGVtX21ldGFkYXRhCisgIGRlZiBBZGRDb21wYXRpYmlsaXR5QXJjaGl2ZShzeXN0ZW1fdXBkYXRlZCwgdmVuZG9yX3VwZGF0ZWQpOgorICAgICIiIkFkZHMgY29tcGF0aWJpbGl0eSBpbmZvIGJhc2VkIG9uIHN5c3RlbS92ZW5kb3IgdXBkYXRlIHN0YXR1cy4KIAotICAjIENyZWF0ZSBuZXcgYXJjaGl2ZS4KLSAgY29tcGF0aWJpbGl0eV9hcmNoaXZlID0gdGVtcGZpbGUuTmFtZWRUZW1wb3JhcnlGaWxlKCkKLSAgY29tcGF0aWJpbGl0eV9hcmNoaXZlX3ppcCA9IHppcGZpbGUuWmlwRmlsZShjb21wYXRpYmlsaXR5X2FyY2hpdmUsICJ3IiwKLSAgICAgIGNvbXByZXNzaW9uPXppcGZpbGUuWklQX0RFRkxBVEVEKQorICAgIEFyZ3M6CisgICAgICBzeXN0ZW1fdXBkYXRlZDogSWYgVHJ1ZSwgdGhlIHN5c3RlbSBpbWFnZSB3aWxsIGJlIHVwZGF0ZWQgYW5kIHRoZXJlZm9yZQorICAgICAgICAgIGl0cyBtZXRhZGF0YSBzaG91bGQgYmUgaW5jbHVkZWQuCisgICAgICB2ZW5kb3JfdXBkYXRlZDogSWYgVHJ1ZSwgdGhlIHZlbmRvciBpbWFnZSB3aWxsIGJlIHVwZGF0ZWQgYW5kIHRoZXJlZm9yZQorICAgICAgICAgIGl0cyBtZXRhZGF0YSBzaG91bGQgYmUgaW5jbHVkZWQuCisgICAgIiIiCisgICAgIyBEZXRlcm1pbmUgd2hhdCBtZXRhZGF0YSB3ZSBuZWVkLiBGaWxlcyBhcmUgbmFtZXMgcmVsYXRpdmUgdG8gTUVUQS8uCisgICAgY29tcGF0aWJpbGl0eV9maWxlcyA9IFtdCisgICAgdmVuZG9yX21ldGFkYXRhID0gKCJ2ZW5kb3JfbWFuaWZlc3QueG1sIiwgInZlbmRvcl9tYXRyaXgueG1sIikKKyAgICBzeXN0ZW1fbWV0YWRhdGEgPSAoInN5c3RlbV9tYW5pZmVzdC54bWwiLCAic3lzdGVtX21hdHJpeC54bWwiKQorICAgIGlmIHZlbmRvcl91cGRhdGVkOgorICAgICAgY29tcGF0aWJpbGl0eV9maWxlcyArPSB2ZW5kb3JfbWV0YWRhdGEKKyAgICBpZiBzeXN0ZW1fdXBkYXRlZDoKKyAgICAgIGNvbXBhdGliaWxpdHlfZmlsZXMgKz0gc3lzdGVtX21ldGFkYXRhCiAKLSAgIyBBZGQgbWV0YWRhdGEuCi0gIGZvciBmaWxlX25hbWUgaW4gY29tcGF0aWJpbGl0eV9maWxlczoKLSAgICB0YXJnZXRfZmlsZV9uYW1lID0gIk1FVEEvIiArIGZpbGVfbmFtZQorICAgICMgQ3JlYXRlIG5ldyBhcmNoaXZlLgorICAgIGNvbXBhdGliaWxpdHlfYXJjaGl2ZSA9IHRlbXBmaWxlLk5hbWVkVGVtcG9yYXJ5RmlsZSgpCisgICAgY29tcGF0aWJpbGl0eV9hcmNoaXZlX3ppcCA9IHppcGZpbGUuWmlwRmlsZSgKKyAgICAgICAgY29tcGF0aWJpbGl0eV9hcmNoaXZlLCAidyIsIGNvbXByZXNzaW9uPXppcGZpbGUuWklQX0RFRkxBVEVEKQogCi0gICAgaWYgdGFyZ2V0X2ZpbGVfbmFtZSBpbiB0YXJnZXRfemlwLm5hbWVsaXN0KCk6Ci0gICAgICBkYXRhID0gdGFyZ2V0X3ppcC5yZWFkKHRhcmdldF9maWxlX25hbWUpCi0gICAgICBjb21tb24uWmlwV3JpdGVTdHIoY29tcGF0aWJpbGl0eV9hcmNoaXZlX3ppcCwgZmlsZV9uYW1lLCBkYXRhKQorICAgICMgQWRkIG1ldGFkYXRhLgorICAgIGZvciBmaWxlX25hbWUgaW4gY29tcGF0aWJpbGl0eV9maWxlczoKKyAgICAgIHRhcmdldF9maWxlX25hbWUgPSAiTUVUQS8iICsgZmlsZV9uYW1lCiAKLSAgIyBFbnN1cmUgZmlsZXMgYXJlIHdyaXR0ZW4gYmVmb3JlIHdlIGNvcHkgaW50byBvdXRwdXRfemlwLgotICBjb21wYXRpYmlsaXR5X2FyY2hpdmVfemlwLmNsb3NlKCkKKyAgICAgIGlmIHRhcmdldF9maWxlX25hbWUgaW4gdGFyZ2V0X3ppcC5uYW1lbGlzdCgpOgorICAgICAgICBkYXRhID0gdGFyZ2V0X3ppcC5yZWFkKHRhcmdldF9maWxlX25hbWUpCisgICAgICAgIGNvbW1vbi5aaXBXcml0ZVN0cihjb21wYXRpYmlsaXR5X2FyY2hpdmVfemlwLCBmaWxlX25hbWUsIGRhdGEpCiAKLSAgIyBPbmx5IGFkZCB0aGUgYXJjaGl2ZSBpZiB3ZSBoYXZlIGFueSBjb21wYXRpYmlsaXR5IGluZm8uCi0gIGlmIGNvbXBhdGliaWxpdHlfYXJjaGl2ZV96aXAubmFtZWxpc3QoKToKLSAgICBjb21tb24uWmlwV3JpdGUob3V0cHV0X3ppcCwgY29tcGF0aWJpbGl0eV9hcmNoaXZlLm5hbWUsCi0gICAgICAgICAgICAgICAgICAgIGFyY25hbWU9ImNvbXBhdGliaWxpdHkuemlwIiwKLSAgICAgICAgICAgICAgICAgICAgY29tcHJlc3NfdHlwZT16aXBmaWxlLlpJUF9TVE9SRUQpCisgICAgIyBFbnN1cmUgZmlsZXMgYXJlIHdyaXR0ZW4gYmVmb3JlIHdlIGNvcHkgaW50byBvdXRwdXRfemlwLgorICAgIGNvbXBhdGliaWxpdHlfYXJjaGl2ZV96aXAuY2xvc2UoKQorCisgICAgIyBPbmx5IGFkZCB0aGUgYXJjaGl2ZSBpZiB3ZSBoYXZlIGFueSBjb21wYXRpYmlsaXR5IGluZm8uCisgICAgaWYgY29tcGF0aWJpbGl0eV9hcmNoaXZlX3ppcC5uYW1lbGlzdCgpOgorICAgICAgY29tbW9uLlppcFdyaXRlKG91dHB1dF96aXAsIGNvbXBhdGliaWxpdHlfYXJjaGl2ZS5uYW1lLAorICAgICAgICAgICAgICAgICAgICAgIGFyY25hbWU9ImNvbXBhdGliaWxpdHkuemlwIiwKKyAgICAgICAgICAgICAgICAgICAgICBjb21wcmVzc190eXBlPXppcGZpbGUuWklQX1NUT1JFRCkKKworICAjIFdpbGwgb25seSBwcm9jZWVkIGlmIHRoZSB0YXJnZXQgaGFzIGVuYWJsZWQgdGhlIFRyZWJsZSBzdXBwb3J0IChhcyB3ZWxsIGFzCisgICMgaGF2aW5nIGEgL3ZlbmRvciBwYXJ0aXRpb24pLgorICBpZiBub3QgSGFzVHJlYmxlRW5hYmxlZCh0YXJnZXRfemlwLCB0YXJnZXRfaW5mbyk6CisgICAgcmV0dXJuCisKKyAgIyBXZSBkb24ndCBzdXBwb3J0IE9FTSB0aHVtYnByaW50IGluIFRyZWJsZSB3b3JsZCAod2hpY2ggY2FsY3VsYXRlcworICAjIGZpbmdlcnByaW50cyBpbiBhIGRpZmZlcmVudCB3YXkgYXMgc2hvd24gaW4gQ2FsY3VsYXRlRmluZ2VycHJpbnQoKSkuCisgIGFzc2VydCBub3QgdGFyZ2V0X2luZm8ub2VtX3Byb3BzCisKKyAgIyBGdWxsIE9UQSBjYXJyaWVzIHRoZSBpbmZvIGZvciBzeXN0ZW0vdmVuZG9yIGJvdGguCisgIGlmIHNvdXJjZV9pbmZvIGlzIE5vbmU6CisgICAgQWRkQ29tcGF0aWJpbGl0eUFyY2hpdmUoVHJ1ZSwgVHJ1ZSkKKyAgICByZXR1cm4KKworICBhc3NlcnQgbm90IHNvdXJjZV9pbmZvLm9lbV9wcm9wcworCisgIHNvdXJjZV9mcCA9IHNvdXJjZV9pbmZvLmZpbmdlcnByaW50CisgIHRhcmdldF9mcCA9IHRhcmdldF9pbmZvLmZpbmdlcnByaW50CisgIHN5c3RlbV91cGRhdGVkID0gc291cmNlX2ZwICE9IHRhcmdldF9mcAorCisgIHNvdXJjZV9mcF92ZW5kb3IgPSBzb3VyY2VfaW5mby5HZXRWZW5kb3JCdWlsZFByb3AoCisgICAgICAicm8udmVuZG9yLmJ1aWxkLmZpbmdlcnByaW50IikKKyAgdGFyZ2V0X2ZwX3ZlbmRvciA9IHRhcmdldF9pbmZvLkdldFZlbmRvckJ1aWxkUHJvcCgKKyAgICAgICJyby52ZW5kb3IuYnVpbGQuZmluZ2VycHJpbnQiKQorICB2ZW5kb3JfdXBkYXRlZCA9IHNvdXJjZV9mcF92ZW5kb3IgIT0gdGFyZ2V0X2ZwX3ZlbmRvcgorCisgIEFkZENvbXBhdGliaWxpdHlBcmNoaXZlKHN5c3RlbV91cGRhdGVkLCB2ZW5kb3JfdXBkYXRlZCkKIAogCi1kZWYgV3JpdGVGdWxsT1RBUGFja2FnZShpbnB1dF96aXAsIG91dHB1dF96aXApOgotICAjIFRPRE86IGhvdyB0byBkZXRlcm1pbmUgdGhpcz8gIFdlIGRvbid0IGtub3cgd2hhdCB2ZXJzaW9uIGl0IHdpbGwKLSAgIyBiZSBpbnN0YWxsZWQgb24gdG9wIG9mLiBGb3Igbm93LCB3ZSBleHBlY3QgdGhlIEFQSSBqdXN0IHdvbid0Ci0gICMgY2hhbmdlIHZlcnkgb2Z0ZW4uIFNpbWlsYXJseSBmb3IgZnN0YWIsIGl0IG1pZ2h0IGhhdmUgY2hhbmdlZAotICAjIGluIHRoZSB0YXJnZXQgYnVpbGQuCi0gIHNjcmlwdCA9IGVkaWZ5X2dlbmVyYXRvci5FZGlmeUdlbmVyYXRvcigzLCBPUFRJT05TLmluZm9fZGljdCkKK2RlZiBXcml0ZUZ1bGxPVEFQYWNrYWdlKGlucHV0X3ppcCwgb3V0cHV0X2ZpbGUpOgorICB0YXJnZXRfaW5mbyA9IEJ1aWxkSW5mbyhPUFRJT05TLmluZm9fZGljdCwgT1BUSU9OUy5vZW1fZGljdHMpCiAKLSAgcmVjb3ZlcnlfbW91bnRfb3B0aW9ucyA9IE9QVElPTlMuaW5mb19kaWN0LmdldCgicmVjb3ZlcnlfbW91bnRfb3B0aW9ucyIpCi0gIG9lbV9wcm9wcyA9IE9QVElPTlMuaW5mb19kaWN0LmdldCgib2VtX2ZpbmdlcnByaW50X3Byb3BlcnRpZXMiKQotICBvZW1fZGljdHMgPSBOb25lCi0gIGlmIG9lbV9wcm9wczoKLSAgICBvZW1fZGljdHMgPSBfTG9hZE9lbURpY3RzKHNjcmlwdCwgcmVjb3ZlcnlfbW91bnRfb3B0aW9ucykKKyAgIyBXZSBkb24ndCBrbm93IHdoYXQgdmVyc2lvbiBpdCB3aWxsIGJlIGluc3RhbGxlZCBvbiB0b3Agb2YuIFdlIGV4cGVjdCB0aGUgQVBJCisgICMganVzdCB3b24ndCBjaGFuZ2UgdmVyeSBvZnRlbi4gU2ltaWxhcmx5IGZvciBmc3RhYiwgaXQgbWlnaHQgaGF2ZSBjaGFuZ2VkIGluCisgICMgdGhlIHRhcmdldCBidWlsZC4KKyAgdGFyZ2V0X2FwaV92ZXJzaW9uID0gdGFyZ2V0X2luZm9bInJlY292ZXJ5X2FwaV92ZXJzaW9uIl0KKyAgc2NyaXB0ID0gZWRpZnlfZ2VuZXJhdG9yLkVkaWZ5R2VuZXJhdG9yKHRhcmdldF9hcGlfdmVyc2lvbiwgdGFyZ2V0X2luZm8pCiAKLSAgdGFyZ2V0X2ZwID0gQ2FsY3VsYXRlRmluZ2VycHJpbnQob2VtX3Byb3BzLCBvZW1fZGljdHMgYW5kIG9lbV9kaWN0c1swXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BUSU9OUy5pbmZvX2RpY3QpCi0gIG1ldGFkYXRhID0gewotICAgICAgInBvc3QtYnVpbGQiOiB0YXJnZXRfZnAsCi0gICAgICAicHJlLWRldmljZSI6IEdldE9lbVByb3BlcnR5KCJyby5wcm9kdWN0LmRldmljZSIsIG9lbV9wcm9wcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2VtX2RpY3RzIGFuZCBvZW1fZGljdHNbMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QVElPTlMuaW5mb19kaWN0KSwKLSAgICAgICJwb3N0LXRpbWVzdGFtcCI6IEdldEJ1aWxkUHJvcCgicm8uYnVpbGQuZGF0ZS51dGMiLCBPUFRJT05TLmluZm9fZGljdCksCi0gIH0KKyAgaWYgdGFyZ2V0X2luZm8ub2VtX3Byb3BzIGFuZCBub3QgT1BUSU9OUy5vZW1fbm9fbW91bnQ6CisgICAgdGFyZ2V0X2luZm8uV3JpdGVNb3VudE9lbVNjcmlwdChzY3JpcHQpCisKKyAgbWV0YWRhdGEgPSBHZXRQYWNrYWdlTWV0YWRhdGEodGFyZ2V0X2luZm8pCisKKyAgaWYgbm90IE9QVElPTlMubm9fc2lnbmluZzoKKyAgICBzdGFnaW5nX2ZpbGUgPSBjb21tb24uTWFrZVRlbXBGaWxlKHN1ZmZpeD0nLnppcCcpCisgIGVsc2U6CisgICAgc3RhZ2luZ19maWxlID0gb3V0cHV0X2ZpbGUKKworICBvdXRwdXRfemlwID0gemlwZmlsZS5aaXBGaWxlKAorICAgICAgc3RhZ2luZ19maWxlLCAidyIsIGNvbXByZXNzaW9uPXppcGZpbGUuWklQX0RFRkxBVEVEKQogCiAgIGRldmljZV9zcGVjaWZpYyA9IGNvbW1vbi5EZXZpY2VTcGVjaWZpY1BhcmFtcygKICAgICAgIGlucHV0X3ppcD1pbnB1dF96aXAsCi0gICAgICBpbnB1dF92ZXJzaW9uPU9QVElPTlMuaW5mb19kaWN0WyJyZWNvdmVyeV9hcGlfdmVyc2lvbiJdLAorICAgICAgaW5wdXRfdmVyc2lvbj10YXJnZXRfYXBpX3ZlcnNpb24sCiAgICAgICBvdXRwdXRfemlwPW91dHB1dF96aXAsCiAgICAgICBzY3JpcHQ9c2NyaXB0LAogICAgICAgaW5wdXRfdG1wPU9QVElPTlMuaW5wdXRfdG1wLApAQCAtNDAzLDEzICs3NDIsMTIgQEAKIAogICBhc3NlcnQgSGFzUmVjb3ZlcnlQYXRjaChpbnB1dF96aXApCiAKLSAgbWV0YWRhdGFbIm90YS10eXBlIl0gPSAiQkxPQ0siCi0KLSAgdHMgPSBHZXRCdWlsZFByb3AoInJvLmJ1aWxkLmRhdGUudXRjIiwgT1BUSU9OUy5pbmZvX2RpY3QpCi0gIHRzX3RleHQgPSBHZXRCdWlsZFByb3AoInJvLmJ1aWxkLmRhdGUiLCBPUFRJT05TLmluZm9fZGljdCkKKyAgIyBBc3NlcnRpb25zIChlLmcuIGRvd25ncmFkZSBjaGVjaywgZGV2aWNlIHByb3BlcnRpZXMgY2hlY2spLgorICB0cyA9IHRhcmdldF9pbmZvLkdldEJ1aWxkUHJvcCgicm8uYnVpbGQuZGF0ZS51dGMiKQorICB0c190ZXh0ID0gdGFyZ2V0X2luZm8uR2V0QnVpbGRQcm9wKCJyby5idWlsZC5kYXRlIikKICAgc2NyaXB0LkFzc2VydE9sZGVyQnVpbGQodHMsIHRzX3RleHQpCiAKLSAgQXBwZW5kQXNzZXJ0aW9ucyhzY3JpcHQsIE9QVElPTlMuaW5mb19kaWN0LCBvZW1fZGljdHMpCisgIHRhcmdldF9pbmZvLldyaXRlRGV2aWNlQXNzZXJ0aW9ucyhzY3JpcHQsIE9QVElPTlMub2VtX25vX21vdW50KQogICBkZXZpY2Vfc3BlY2lmaWMuRnVsbE9UQV9Bc3NlcnRpb25zKCkKIAogICAjIFR3by1zdGVwIHBhY2thZ2Ugc3RyYXRlZ3kgKGluIGNocm9ub2xvZ2ljYWwgb3JkZXIsIHdoaWNoIGlzICpub3QqCkBAIC00MzUsOSArNzczLDkgQEAKICAgcmVjb3ZlcnlfaW1nID0gY29tbW9uLkdldEJvb3RhYmxlSW1hZ2UoInJlY292ZXJ5LmltZyIsICJyZWNvdmVyeS5pbWciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUFRJT05TLmlucHV0X3RtcCwgIlJFQ09WRVJZIikKICAgaWYgT1BUSU9OUy50d29fc3RlcDoKLSAgICBpZiBub3QgT1BUSU9OUy5pbmZvX2RpY3QuZ2V0KCJtdWx0aXN0YWdlX3N1cHBvcnQiLCBOb25lKToKKyAgICBpZiBub3QgdGFyZ2V0X2luZm8uZ2V0KCJtdWx0aXN0YWdlX3N1cHBvcnQiKToKICAgICAgIGFzc2VydCBGYWxzZSwgInR3by1zdGVwIHBhY2thZ2VzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBidWlsZCIKLSAgICBmcyA9IE9QVElPTlMuaW5mb19kaWN0WyJmc3RhYiJdWyIvbWlzYyJdCisgICAgZnMgPSB0YXJnZXRfaW5mb1siZnN0YWIiXVsiL21pc2MiXQogICAgIGFzc2VydCBmcy5mc190eXBlLnVwcGVyKCkgPT0gIkVNTUMiLCBcCiAgICAgICAgICJ0d28tc3RlcCBwYWNrYWdlcyBvbmx5IHN1cHBvcnRlZCBvbiBkZXZpY2VzIHdpdGggRU1NQyAvbWlzYyBwYXJ0aXRpb25zIgogICAgIGJjYl9kZXYgPSB7ImJjYl9kZXYiOiBmcy5kZXZpY2V9CkBAIC00NTksNyArNzk3LDcgQEAKICAgICBzY3JpcHQuQ29tbWVudCgiU3RhZ2UgMy8zIikKIAogICAjIER1bXAgZmluZ2VycHJpbnRzCi0gIHNjcmlwdC5QcmludCgiVGFyZ2V0OiAlcyIgJSB0YXJnZXRfZnApCisgIHNjcmlwdC5QcmludCgiVGFyZ2V0OiB7fSIuZm9ybWF0KHRhcmdldF9pbmZvLmZpbmdlcnByaW50KSkKIAogICBkZXZpY2Vfc3BlY2lmaWMuRnVsbE9UQV9JbnN0YWxsQmVnaW4oKQogCkBAIC00NzAsMjAgKzgwOCwxNyBAQAogICBpZiBIYXNWZW5kb3JQYXJ0aXRpb24oaW5wdXRfemlwKToKICAgICBzeXN0ZW1fcHJvZ3Jlc3MgLT0gMC4xCiAKLSAgIyBQbGFjZSBhIGNvcHkgb2YgZmlsZV9jb250ZXh0cy5iaW4gaW50byB0aGUgT1RBIHBhY2thZ2Ugd2hpY2ggd2lsbCBiZSB1c2VkCi0gICMgYnkgdGhlIHJlY292ZXJ5IHByb2dyYW0uCi0gIGlmICJzZWxpbnV4X2ZjIiBpbiBPUFRJT05TLmluZm9fZGljdDoKLSAgICBXcml0ZVBvbGljeUNvbmZpZyhPUFRJT05TLmluZm9fZGljdFsic2VsaW51eF9mYyJdLCBvdXRwdXRfemlwKQotCi0gIHJlY292ZXJ5X21vdW50X29wdGlvbnMgPSBPUFRJT05TLmluZm9fZGljdC5nZXQoInJlY292ZXJ5X21vdW50X29wdGlvbnMiKQotCiAgIHNjcmlwdC5TaG93UHJvZ3Jlc3Moc3lzdGVtX3Byb2dyZXNzLCAwKQogCisgICMgU2VlIHRoZSBub3RlcyBpbiBXcml0ZUJsb2NrSW5jcmVtZW50YWxPVEFQYWNrYWdlKCkuCisgIGFsbG93X3NoYXJlZF9ibG9ja3MgPSB0YXJnZXRfaW5mby5nZXQoJ2V4dDRfc2hhcmVfZHVwX2Jsb2NrcycpID09ICJ0cnVlIgorCiAgICMgRnVsbCBPVEEgaXMgZG9uZSBhcyBhbiAiaW5jcmVtZW50YWwiIGFnYWluc3QgYW4gZW1wdHkgc291cmNlIGltYWdlLiBUaGlzCiAgICMgaGFzIHRoZSBlZmZlY3Qgb2Ygd3JpdGluZyBuZXcgZGF0YSBmcm9tIHRoZSBwYWNrYWdlIHRvIHRoZSBlbnRpcmUKICAgIyBwYXJ0aXRpb24sIGJ1dCBsZXRzIHVzIHJldXNlIHRoZSB1cGRhdGVyIGNvZGUgdGhhdCB3cml0ZXMgaW5jcmVtZW50YWxzIHRvCiAgICMgZG8gaXQuCi0gIHN5c3RlbV90Z3QgPSBHZXRJbWFnZSgic3lzdGVtIiwgT1BUSU9OUy5pbnB1dF90bXApCisgIHN5c3RlbV90Z3QgPSBjb21tb24uR2V0U3BhcnNlSW1hZ2UoInN5c3RlbSIsIE9QVElPTlMuaW5wdXRfdG1wLCBpbnB1dF96aXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfc2hhcmVkX2Jsb2NrcykKICAgc3lzdGVtX3RndC5SZXNldEZpbGVNYXAoKQogICBzeXN0ZW1fZGlmZiA9IGNvbW1vbi5CbG9ja0RpZmZlcmVuY2UoInN5c3RlbSIsIHN5c3RlbV90Z3QsIHNyYz1Ob25lKQogICBzeXN0ZW1fZGlmZi5Xcml0ZVNjcmlwdChzY3JpcHQsIG91dHB1dF96aXApCkBAIC00OTQsMTIgKzgyOSwxNSBAQAogICBpZiBIYXNWZW5kb3JQYXJ0aXRpb24oaW5wdXRfemlwKToKICAgICBzY3JpcHQuU2hvd1Byb2dyZXNzKDAuMSwgMCkKIAotICAgIHZlbmRvcl90Z3QgPSBHZXRJbWFnZSgidmVuZG9yIiwgT1BUSU9OUy5pbnB1dF90bXApCisgICAgdmVuZG9yX3RndCA9IGNvbW1vbi5HZXRTcGFyc2VJbWFnZSgidmVuZG9yIiwgT1BUSU9OUy5pbnB1dF90bXAsIGlucHV0X3ppcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3NoYXJlZF9ibG9ja3MpCiAgICAgdmVuZG9yX3RndC5SZXNldEZpbGVNYXAoKQogICAgIHZlbmRvcl9kaWZmID0gY29tbW9uLkJsb2NrRGlmZmVyZW5jZSgidmVuZG9yIiwgdmVuZG9yX3RndCkKICAgICB2ZW5kb3JfZGlmZi5Xcml0ZVNjcmlwdChzY3JpcHQsIG91dHB1dF96aXApCiAKLSAgY29tbW9uLkNoZWNrU2l6ZShib290X2ltZy5kYXRhLCAiYm9vdC5pbWciLCBPUFRJT05TLmluZm9fZGljdCkKKyAgQWRkQ29tcGF0aWJpbGl0eUFyY2hpdmVJZlRyZWJsZUVuYWJsZWQoaW5wdXRfemlwLCBvdXRwdXRfemlwLCB0YXJnZXRfaW5mbykKKworICBjb21tb24uQ2hlY2tTaXplKGJvb3RfaW1nLmRhdGEsICJib290LmltZyIsIHRhcmdldF9pbmZvKQogICBjb21tb24uWmlwV3JpdGVTdHIob3V0cHV0X3ppcCwgImJvb3QuaW1nIiwgYm9vdF9pbWcuZGF0YSkKIAogICBzY3JpcHQuU2hvd1Byb2dyZXNzKDAuMDUsIDUpCkBAIC01MzcsMTEgKzg3NSwxNSBAQAogICBzY3JpcHQuU2V0UHJvZ3Jlc3MoMSkKICAgc2NyaXB0LkFkZFRvWmlwKGlucHV0X3ppcCwgb3V0cHV0X3ppcCwgaW5wdXRfcGF0aD1PUFRJT05TLnVwZGF0ZXJfYmluYXJ5KQogICBtZXRhZGF0YVsib3RhLXJlcXVpcmVkLWNhY2hlIl0gPSBzdHIoc2NyaXB0LnJlcXVpcmVkX2NhY2hlKQotICBXcml0ZU1ldGFkYXRhKG1ldGFkYXRhLCBvdXRwdXRfemlwKQogCisgICMgV2UgaGF2ZW4ndCB3cml0dGVuIHRoZSBtZXRhZGF0YSBlbnRyeSwgd2hpY2ggd2lsbCBiZSBkb25lIGluCisgICMgRmluYWxpemVNZXRhZGF0YS4KKyAgY29tbW9uLlppcENsb3NlKG91dHB1dF96aXApCiAKLWRlZiBXcml0ZVBvbGljeUNvbmZpZyhmaWxlX25hbWUsIG91dHB1dF96aXApOgotICBjb21tb24uWmlwV3JpdGUob3V0cHV0X3ppcCwgZmlsZV9uYW1lLCBvcy5wYXRoLmJhc2VuYW1lKGZpbGVfbmFtZSkpCisgIG5lZWRlZF9wcm9wZXJ0eV9maWxlcyA9ICgKKyAgICAgIE5vbkFiT3RhUHJvcGVydHlGaWxlcygpLAorICApCisgIEZpbmFsaXplTWV0YWRhdGEobWV0YWRhdGEsIHN0YWdpbmdfZmlsZSwgb3V0cHV0X2ZpbGUsIG5lZWRlZF9wcm9wZXJ0eV9maWxlcykKIAogCiBkZWYgV3JpdGVNZXRhZGF0YShtZXRhZGF0YSwgb3V0cHV0X3ppcCk6CkBAIC01NTAsMTE5ICs4OTIsNTA0IEBACiAgICAgICAgICAgICAgICAgICAgICBjb21wcmVzc190eXBlPXppcGZpbGUuWklQX1NUT1JFRCkKIAogCi1kZWYgR2V0QnVpbGRQcm9wKHByb3AsIGluZm9fZGljdCk6Ci0gICIiIlJldHVybiB0aGUgZmluZ2VycHJpbnQgb2YgdGhlIGJ1aWxkIG9mIGEgZ2l2ZW4gdGFyZ2V0LWZpbGVzIGluZm9fZGljdC4iIiIKLSAgdHJ5OgotICAgIHJldHVybiBpbmZvX2RpY3QuZ2V0KCJidWlsZC5wcm9wIiwge30pW3Byb3BdCi0gIGV4Y2VwdCBLZXlFcnJvcjoKLSAgICByYWlzZSBjb21tb24uRXh0ZXJuYWxFcnJvcigiY291bGRuJ3QgZmluZCAlcyBpbiBidWlsZC5wcm9wIiAlIChwcm9wLCkpCi0KLQotZGVmIEhhbmRsZURvd25ncmFkZU1ldGFkYXRhKG1ldGFkYXRhKToKK2RlZiBIYW5kbGVEb3duZ3JhZGVNZXRhZGF0YShtZXRhZGF0YSwgdGFyZ2V0X2luZm8sIHNvdXJjZV9pbmZvKToKICAgIyBPbmx5IGluY3JlbWVudGFsIE9UQXMgYXJlIGFsbG93ZWQgdG8gcmVhY2ggaGVyZS4KICAgYXNzZXJ0IE9QVElPTlMuaW5jcmVtZW50YWxfc291cmNlIGlzIG5vdCBOb25lCiAKLSAgcG9zdF90aW1lc3RhbXAgPSBHZXRCdWlsZFByb3AoInJvLmJ1aWxkLmRhdGUudXRjIiwgT1BUSU9OUy50YXJnZXRfaW5mb19kaWN0KQotICBwcmVfdGltZXN0YW1wID0gR2V0QnVpbGRQcm9wKCJyby5idWlsZC5kYXRlLnV0YyIsIE9QVElPTlMuc291cmNlX2luZm9fZGljdCkKKyAgcG9zdF90aW1lc3RhbXAgPSB0YXJnZXRfaW5mby5HZXRCdWlsZFByb3AoInJvLmJ1aWxkLmRhdGUudXRjIikKKyAgcHJlX3RpbWVzdGFtcCA9IHNvdXJjZV9pbmZvLkdldEJ1aWxkUHJvcCgicm8uYnVpbGQuZGF0ZS51dGMiKQogICBpc19kb3duZ3JhZGUgPSBsb25nKHBvc3RfdGltZXN0YW1wKSA8IGxvbmcocHJlX3RpbWVzdGFtcCkKIAogICBpZiBPUFRJT05TLmRvd25ncmFkZToKICAgICBpZiBub3QgaXNfZG93bmdyYWRlOgotICAgICAgcmFpc2UgUnVudGltZUVycm9yKCItLWRvd25ncmFkZSBzcGVjaWZpZWQgYnV0IG5vIGRvd25ncmFkZSBkZXRlY3RlZDogIgotICAgICAgICAgICAgICAgICAgICAgICAgICJwcmU6ICVzLCBwb3N0OiAlcyIgJSAocHJlX3RpbWVzdGFtcCwgcG9zdF90aW1lc3RhbXApKQorICAgICAgcmFpc2UgUnVudGltZUVycm9yKAorICAgICAgICAgICItLWRvd25ncmFkZSBvciAtLW92ZXJyaWRlX3RpbWVzdGFtcCBzcGVjaWZpZWQgYnV0IG5vIGRvd25ncmFkZSAiCisgICAgICAgICAgImRldGVjdGVkOiBwcmU6ICVzLCBwb3N0OiAlcyIgJSAocHJlX3RpbWVzdGFtcCwgcG9zdF90aW1lc3RhbXApKQogICAgIG1ldGFkYXRhWyJvdGEtZG93bmdyYWRlIl0gPSAieWVzIgotICBlbGlmIE9QVElPTlMudGltZXN0YW1wOgotICAgIGlmIG5vdCBpc19kb3duZ3JhZGU6Ci0gICAgICByYWlzZSBSdW50aW1lRXJyb3IoIi0tdGltZXN0YW1wIHNwZWNpZmllZCBidXQgbm8gdGltZXN0YW1wIGhhY2sgbmVlZGVkOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgInByZTogJXMsIHBvc3Q6ICVzIiAlIChwcmVfdGltZXN0YW1wLCBwb3N0X3RpbWVzdGFtcCkpCi0gICAgbWV0YWRhdGFbInBvc3QtdGltZXN0YW1wIl0gPSBzdHIobG9uZyhwcmVfdGltZXN0YW1wKSArIDEpCiAgIGVsc2U6CiAgICAgaWYgaXNfZG93bmdyYWRlOgotICAgICAgcmFpc2UgUnVudGltZUVycm9yKCJEb3duZ3JhZGUgZGV0ZWN0ZWQgYmFzZWQgb24gdGltZXN0YW1wIGNoZWNrOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgInByZTogJXMsIHBvc3Q6ICVzLiBOZWVkIHRvIHNwZWNpZnkgLS10aW1lc3RhbXAgT1IgIgotICAgICAgICAgICAgICAgICAgICAgICAgICItLWRvd25ncmFkZSB0byBhbGxvdyBidWlsZGluZyB0aGUgaW5jcmVtZW50YWwuIiAlICgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlX3RpbWVzdGFtcCwgcG9zdF90aW1lc3RhbXApKQotICAgIG1ldGFkYXRhWyJwb3N0LXRpbWVzdGFtcCJdID0gcG9zdF90aW1lc3RhbXAKKyAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigKKyAgICAgICAgICAiRG93bmdyYWRlIGRldGVjdGVkIGJhc2VkIG9uIHRpbWVzdGFtcCBjaGVjazogcHJlOiAlcywgcG9zdDogJXMuICIKKyAgICAgICAgICAiTmVlZCB0byBzcGVjaWZ5IC0tb3ZlcnJpZGVfdGltZXN0YW1wIE9SIC0tZG93bmdyYWRlIHRvIGFsbG93ICIKKyAgICAgICAgICAiYnVpbGRpbmcgdGhlIGluY3JlbWVudGFsLiIgJSAocHJlX3RpbWVzdGFtcCwgcG9zdF90aW1lc3RhbXApKQogCiAKLWRlZiBXcml0ZUJsb2NrSW5jcmVtZW50YWxPVEFQYWNrYWdlKHRhcmdldF96aXAsIHNvdXJjZV96aXAsIG91dHB1dF96aXApOgotICBzb3VyY2VfdmVyc2lvbiA9IE9QVElPTlMuc291cmNlX2luZm9fZGljdFsicmVjb3ZlcnlfYXBpX3ZlcnNpb24iXQotICB0YXJnZXRfdmVyc2lvbiA9IE9QVElPTlMudGFyZ2V0X2luZm9fZGljdFsicmVjb3ZlcnlfYXBpX3ZlcnNpb24iXQorZGVmIEdldFBhY2thZ2VNZXRhZGF0YSh0YXJnZXRfaW5mbywgc291cmNlX2luZm89Tm9uZSk6CisgICIiIkdlbmVyYXRlcyBhbmQgcmV0dXJucyB0aGUgbWV0YWRhdGEgZGljdC4KIAotICBpZiBzb3VyY2VfdmVyc2lvbiA9PSAwOgotICAgIHByaW50KCJXQVJOSU5HOiBnZW5lcmF0aW5nIGVkaWZ5IHNjcmlwdCBmb3IgYSBzb3VyY2UgdGhhdCAiCi0gICAgICAgICAgImNhbid0IGluc3RhbGwgaXQuIikKLSAgc2NyaXB0ID0gZWRpZnlfZ2VuZXJhdG9yLkVkaWZ5R2VuZXJhdG9yKAotICAgICAgc291cmNlX3ZlcnNpb24sIE9QVElPTlMudGFyZ2V0X2luZm9fZGljdCwKLSAgICAgIGZzdGFiPU9QVElPTlMuc291cmNlX2luZm9fZGljdFsiZnN0YWIiXSkKKyAgSXQgZ2VuZXJhdGVzIGEgZGljdCgpIHRoYXQgY29udGFpbnMgdGhlIGluZm8gdG8gYmUgd3JpdHRlbiBpbnRvIGFuIE9UQQorICBwYWNrYWdlIChNRVRBLUlORi9jb20vYW5kcm9pZC9tZXRhZGF0YSkuIEl0IGFsc28gaGFuZGxlcyB0aGUgZGV0ZWN0aW9uIG9mCisgIGRvd25ncmFkZSAvIGRhdGEgd2lwZSBiYXNlZCBvbiB0aGUgZ2xvYmFsIG9wdGlvbnMuCiAKLSAgcmVjb3ZlcnlfbW91bnRfb3B0aW9ucyA9IE9QVElPTlMuc291cmNlX2luZm9fZGljdC5nZXQoCi0gICAgICAicmVjb3ZlcnlfbW91bnRfb3B0aW9ucyIpCi0gIHNvdXJjZV9vZW1fcHJvcHMgPSBPUFRJT05TLnNvdXJjZV9pbmZvX2RpY3QuZ2V0KCJvZW1fZmluZ2VycHJpbnRfcHJvcGVydGllcyIpCi0gIHRhcmdldF9vZW1fcHJvcHMgPSBPUFRJT05TLnRhcmdldF9pbmZvX2RpY3QuZ2V0KCJvZW1fZmluZ2VycHJpbnRfcHJvcGVydGllcyIpCi0gIG9lbV9kaWN0cyA9IE5vbmUKLSAgaWYgc291cmNlX29lbV9wcm9wcyBhbmQgdGFyZ2V0X29lbV9wcm9wczoKLSAgICBvZW1fZGljdHMgPSBfTG9hZE9lbURpY3RzKHNjcmlwdCwgcmVjb3ZlcnlfbW91bnRfb3B0aW9ucykKKyAgQXJnczoKKyAgICB0YXJnZXRfaW5mbzogVGhlIEJ1aWxkSW5mbyBpbnN0YW5jZSB0aGF0IGhvbGRzIHRoZSB0YXJnZXQgYnVpbGQgaW5mby4KKyAgICBzb3VyY2VfaW5mbzogVGhlIEJ1aWxkSW5mbyBpbnN0YW5jZSB0aGF0IGhvbGRzIHRoZSBzb3VyY2UgYnVpbGQgaW5mbywgb3IKKyAgICAgICAgTm9uZSBpZiBnZW5lcmF0aW5nIGZ1bGwgT1RBLgorCisgIFJldHVybnM6CisgICAgQSBkaWN0IHRvIGJlIHdyaXR0ZW4gaW50byBwYWNrYWdlIG1ldGFkYXRhIGVudHJ5LgorICAiIiIKKyAgYXNzZXJ0IGlzaW5zdGFuY2UodGFyZ2V0X2luZm8sIEJ1aWxkSW5mbykKKyAgYXNzZXJ0IHNvdXJjZV9pbmZvIGlzIE5vbmUgb3IgaXNpbnN0YW5jZShzb3VyY2VfaW5mbywgQnVpbGRJbmZvKQogCiAgIG1ldGFkYXRhID0gewotICAgICAgInByZS1kZXZpY2UiOiBHZXRPZW1Qcm9wZXJ0eSgicm8ucHJvZHVjdC5kZXZpY2UiLCBzb3VyY2Vfb2VtX3Byb3BzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZW1fZGljdHMgYW5kIG9lbV9kaWN0c1swXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BUSU9OUy5zb3VyY2VfaW5mb19kaWN0KSwKLSAgICAgICJvdGEtdHlwZSI6ICJCTE9DSyIsCisgICAgICAncG9zdC1idWlsZCcgOiB0YXJnZXRfaW5mby5maW5nZXJwcmludCwKKyAgICAgICdwb3N0LWJ1aWxkLWluY3JlbWVudGFsJyA6IHRhcmdldF9pbmZvLkdldEJ1aWxkUHJvcCgKKyAgICAgICAgICAncm8uYnVpbGQudmVyc2lvbi5pbmNyZW1lbnRhbCcpLAorICAgICAgJ3Bvc3Qtc2RrLWxldmVsJyA6IHRhcmdldF9pbmZvLkdldEJ1aWxkUHJvcCgKKyAgICAgICAgICAncm8uYnVpbGQudmVyc2lvbi5zZGsnKSwKKyAgICAgICdwb3N0LXNlY3VyaXR5LXBhdGNoLWxldmVsJyA6IHRhcmdldF9pbmZvLkdldEJ1aWxkUHJvcCgKKyAgICAgICAgICAncm8uYnVpbGQudmVyc2lvbi5zZWN1cml0eV9wYXRjaCcpLAogICB9CiAKLSAgSGFuZGxlRG93bmdyYWRlTWV0YWRhdGEobWV0YWRhdGEpCisgIGlmIHRhcmdldF9pbmZvLmlzX2FiOgorICAgIG1ldGFkYXRhWydvdGEtdHlwZSddID0gJ0FCJworICAgIG1ldGFkYXRhWydvdGEtcmVxdWlyZWQtY2FjaGUnXSA9ICcwJworICBlbHNlOgorICAgIG1ldGFkYXRhWydvdGEtdHlwZSddID0gJ0JMT0NLJworCisgIGlmIE9QVElPTlMud2lwZV91c2VyX2RhdGE6CisgICAgbWV0YWRhdGFbJ290YS13aXBlJ10gPSAneWVzJworCisgIGlzX2luY3JlbWVudGFsID0gc291cmNlX2luZm8gaXMgbm90IE5vbmUKKyAgaWYgaXNfaW5jcmVtZW50YWw6CisgICAgbWV0YWRhdGFbJ3ByZS1idWlsZCddID0gc291cmNlX2luZm8uZmluZ2VycHJpbnQKKyAgICBtZXRhZGF0YVsncHJlLWJ1aWxkLWluY3JlbWVudGFsJ10gPSBzb3VyY2VfaW5mby5HZXRCdWlsZFByb3AoCisgICAgICAgICdyby5idWlsZC52ZXJzaW9uLmluY3JlbWVudGFsJykKKyAgICBtZXRhZGF0YVsncHJlLWRldmljZSddID0gc291cmNlX2luZm8uZGV2aWNlCisgIGVsc2U6CisgICAgbWV0YWRhdGFbJ3ByZS1kZXZpY2UnXSA9IHRhcmdldF9pbmZvLmRldmljZQorCisgICMgVXNlIHRoZSBhY3R1YWwgcG9zdC10aW1lc3RhbXAsIGV2ZW4gZm9yIGEgZG93bmdyYWRlIGNhc2UuCisgIG1ldGFkYXRhWydwb3N0LXRpbWVzdGFtcCddID0gdGFyZ2V0X2luZm8uR2V0QnVpbGRQcm9wKCdyby5idWlsZC5kYXRlLnV0YycpCisKKyAgIyBEZXRlY3QgZG93bmdyYWRlcyBhbmQgc2V0IHVwIGRvd25ncmFkZSBmbGFncyBhY2NvcmRpbmdseS4KKyAgaWYgaXNfaW5jcmVtZW50YWw6CisgICAgSGFuZGxlRG93bmdyYWRlTWV0YWRhdGEobWV0YWRhdGEsIHRhcmdldF9pbmZvLCBzb3VyY2VfaW5mbykKKworICByZXR1cm4gbWV0YWRhdGEKKworCitjbGFzcyBQcm9wZXJ0eUZpbGVzKG9iamVjdCk6CisgICIiIkEgY2xhc3MgdGhhdCBjb21wdXRlcyB0aGUgcHJvcGVydHktZmlsZXMgc3RyaW5nIGZvciBhbiBPVEEgcGFja2FnZS4KKworICBBIHByb3BlcnR5LWZpbGVzIHN0cmluZyBpcyBhIGNvbW1hLXNlcGFyYXRlZCBzdHJpbmcgdGhhdCBjb250YWlucyB0aGUKKyAgb2Zmc2V0L3NpemUgaW5mbyBmb3IgYW4gT1RBIHBhY2thZ2UuIFRoZSBlbnRyaWVzLCB3aGljaCBtdXN0IGJlIFpJUF9TVE9SRUQsCisgIGNhbiBiZSBmZXRjaGVkIGRpcmVjdGx5IHdpdGggdGhlIHBhY2thZ2UgVVJMIGFsb25nIHdpdGggdGhlIG9mZnNldC9zaXplIGluZm8uCisgIFRoZXNlIHN0cmluZ3MgY2FuIGJlIHVzZWQgZm9yIHN0cmVhbWluZyBBL0IgT1RBcywgb3IgYWxsb3dpbmcgYW4gdXBkYXRlciB0bworICBkb3dubG9hZCBwYWNrYWdlIG1ldGFkYXRhIGVudHJ5IGRpcmVjdGx5LCB3aXRob3V0IHBheWluZyB0aGUgY29zdCBvZgorICBkb3dubG9hZGluZyBlbnRpcmUgcGFja2FnZS4KKworICBDb21wdXRpbmcgdGhlIGZpbmFsIHByb3BlcnR5LWZpbGVzIHN0cmluZyByZXF1aXJlcyB0d28gcGFzc2VzLiBCZWNhdXNlIGRvaW5nCisgIHRoZSB3aG9sZSBwYWNrYWdlIHNpZ25pbmcgKHdpdGggc2lnbmFway5qYXIpIHdpbGwgcG9zc2libHkgcmVvcmRlciB0aGUgWklQCisgIGVudHJpZXMsIHdoaWNoIG1heSBpbiB0dXJuIGludmFsaWRhdGUgZWFybGllciBjb21wdXRlZCBaSVAgZW50cnkgb2Zmc2V0L3NpemUKKyAgdmFsdWVzLgorCisgIFRoaXMgY2xhc3MgcHJvdmlkZXMgZnVuY3Rpb25zIHRvIGJlIGNhbGxlZCBmb3IgZWFjaCBwYXNzLiBUaGUgZ2VuZXJhbCBmbG93IGlzCisgIGFzIGZvbGxvd3MuCisKKyAgICBwcm9wZXJ0eV9maWxlcyA9IFByb3BlcnR5RmlsZXMoKQorICAgICMgVGhlIGZpcnN0IHBhc3MsIHdoaWNoIHdyaXRlcyBwbGFjZWhvbGRlcnMgYmVmb3JlIGRvaW5nIGluaXRpYWwgc2lnbmluZy4KKyAgICBwcm9wZXJ0eV9maWxlcy5Db21wdXRlKCkKKyAgICBTaWduT3V0cHV0KCkKKworICAgICMgVGhlIHNlY29uZCBwYXNzLCBieSByZXBsYWNpbmcgdGhlIHBsYWNlaG9sZGVycyB3aXRoIGFjdHVhbCBkYXRhLgorICAgIHByb3BlcnR5X2ZpbGVzLkZpbmFsaXplKCkKKyAgICBTaWduT3V0cHV0KCkKKworICBBbmQgdGhlIGNhbGxlciBjYW4gYWRkaXRpb25hbGx5IHZlcmlmeSB0aGUgZmluYWwgcmVzdWx0LgorCisgICAgcHJvcGVydHlfZmlsZXMuVmVyaWZ5KCkKKyAgIiIiCisKKyAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgIHNlbGYubmFtZSA9IE5vbmUKKyAgICBzZWxmLnJlcXVpcmVkID0gKCkKKyAgICBzZWxmLm9wdGlvbmFsID0gKCkKKworICBkZWYgQ29tcHV0ZShzZWxmLCBpbnB1dF96aXApOgorICAgICIiIkNvbXB1dGVzIGFuZCByZXR1cm5zIGEgcHJvcGVydHktZmlsZXMgc3RyaW5nIHdpdGggcGxhY2Vob2xkZXJzLgorCisgICAgV2UgcmVzZXJ2ZSBleHRyYSBzcGFjZSBmb3IgdGhlIG9mZnNldCBhbmQgc2l6ZSBvZiB0aGUgbWV0YWRhdGEgZW50cnkgaXRzZWxmLAorICAgIGFsdGhvdWdoIHdlIGRvbid0IGtub3cgdGhlIGZpbmFsIHZhbHVlcyB1bnRpbCB0aGUgcGFja2FnZSBnZXRzIHNpZ25lZC4KKworICAgIEFyZ3M6CisgICAgICBpbnB1dF96aXA6IFRoZSBpbnB1dCBaSVAgZmlsZS4KKworICAgIFJldHVybnM6CisgICAgICBBIHN0cmluZyB3aXRoIHBsYWNlaG9sZGVycyBmb3IgdGhlIG1ldGFkYXRhIG9mZnNldC9zaXplIGluZm8sIGUuZy4KKyAgICAgICJwYXlsb2FkLmJpbjo2Nzk6MzQzLHBheWxvYWRfcHJvcGVydGllcy50eHQ6Mzc4OjQ1LG1ldGFkYXRhOiAgICAgICAgIi4KKyAgICAiIiIKKyAgICByZXR1cm4gc2VsZi5fR2V0UHJvcGVydHlGaWxlc1N0cmluZyhpbnB1dF96aXAsIHJlc2VydmVfc3BhY2U9VHJ1ZSkKKworICBjbGFzcyBJbnN1ZmZpY2llbnRTcGFjZUV4Y2VwdGlvbihFeGNlcHRpb24pOgorICAgIHBhc3MKKworICBkZWYgRmluYWxpemUoc2VsZiwgaW5wdXRfemlwLCByZXNlcnZlZF9sZW5ndGgpOgorICAgICIiIkZpbmFsaXplcyBhIHByb3BlcnR5LWZpbGVzIHN0cmluZyB3aXRoIGFjdHVhbCBNRVRBREFUQSBvZmZzZXQvc2l6ZSBpbmZvLgorCisgICAgVGhlIGlucHV0IFpJUCBmaWxlIGhhcyBiZWVuIHNpZ25lZCwgd2l0aCB0aGUgWklQIGVudHJpZXMgaW4gdGhlIGRlc2lyZWQKKyAgICBwbGFjZSAoc2lnbmFway5qYXIgd2lsbCBwb3NzaWJseSByZW9yZGVyIHRoZSBaSVAgZW50cmllcykuIE5vdyB3ZSBjb21wdXRlCisgICAgdGhlIFpJUCBlbnRyeSBvZmZzZXRzIGFuZCBjb25zdHJ1Y3QgdGhlIHByb3BlcnR5LWZpbGVzIHN0cmluZyB3aXRoIGFjdHVhbAorICAgIGRhdGEuIE5vdGUgdGhhdCBkdXJpbmcgdGhpcyBwcm9jZXNzLCB3ZSBtdXN0IHBhZCB0aGUgcHJvcGVydHktZmlsZXMgc3RyaW5nCisgICAgdG8gdGhlIHJlc2VydmVkIGxlbmd0aCwgc28gdGhhdCB0aGUgTUVUQURBVEEgZW50cnkgc2l6ZSByZW1haW5zIHRoZSBzYW1lLgorICAgIE90aGVyd2lzZSB0aGUgZW50cmllcycgb2Zmc2V0cyBhbmQgc2l6ZXMgbWF5IGNoYW5nZSBhZ2Fpbi4KKworICAgIEFyZ3M6CisgICAgICBpbnB1dF96aXA6IFRoZSBpbnB1dCBaSVAgZmlsZS4KKyAgICAgIHJlc2VydmVkX2xlbmd0aDogVGhlIHJlc2VydmVkIGxlbmd0aCBvZiB0aGUgcHJvcGVydHktZmlsZXMgc3RyaW5nIGR1cmluZworICAgICAgICAgIHRoZSBjYWxsIHRvIENvbXB1dGUoKS4gVGhlIGZpbmFsIHN0cmluZyBtdXN0IGJlIG5vIG1vcmUgdGhhbiB0aGlzCisgICAgICAgICAgc2l6ZS4KKworICAgIFJldHVybnM6CisgICAgICBBIHByb3BlcnR5LWZpbGVzIHN0cmluZyBpbmNsdWRpbmcgdGhlIG1ldGFkYXRhIG9mZnNldC9zaXplIGluZm8sIGUuZy4KKyAgICAgICJwYXlsb2FkLmJpbjo2Nzk6MzQzLHBheWxvYWRfcHJvcGVydGllcy50eHQ6Mzc4OjQ1LG1ldGFkYXRhOjY5OjM3OSAgIi4KKworICAgIFJhaXNlczoKKyAgICAgIEluc3VmZmljaWVudFNwYWNlRXhjZXB0aW9uOiBJZiB0aGUgcmVzZXJ2ZWQgbGVuZ3RoIGlzIGluc3VmZmljaWVudCB0byBob2xkCisgICAgICAgICAgdGhlIGZpbmFsIHN0cmluZy4KKyAgICAiIiIKKyAgICByZXN1bHQgPSBzZWxmLl9HZXRQcm9wZXJ0eUZpbGVzU3RyaW5nKGlucHV0X3ppcCwgcmVzZXJ2ZV9zcGFjZT1GYWxzZSkKKyAgICBpZiBsZW4ocmVzdWx0KSA+IHJlc2VydmVkX2xlbmd0aDoKKyAgICAgIHJhaXNlIHNlbGYuSW5zdWZmaWNpZW50U3BhY2VFeGNlcHRpb24oCisgICAgICAgICAgJ0luc3VmZmljaWVudCByZXNlcnZlZCBzcGFjZTogcmVzZXJ2ZWQ9e30sIGFjdHVhbD17fScuZm9ybWF0KAorICAgICAgICAgICAgICByZXNlcnZlZF9sZW5ndGgsIGxlbihyZXN1bHQpKSkKKworICAgIHJlc3VsdCArPSAnICcgKiAocmVzZXJ2ZWRfbGVuZ3RoIC0gbGVuKHJlc3VsdCkpCisgICAgcmV0dXJuIHJlc3VsdAorCisgIGRlZiBWZXJpZnkoc2VsZiwgaW5wdXRfemlwLCBleHBlY3RlZCk6CisgICAgIiIiVmVyaWZpZXMgdGhlIGlucHV0IFpJUCBmaWxlIGNvbnRhaW5zIHRoZSBleHBlY3RlZCBwcm9wZXJ0eS1maWxlcyBzdHJpbmcuCisKKyAgICBBcmdzOgorICAgICAgaW5wdXRfemlwOiBUaGUgaW5wdXQgWklQIGZpbGUuCisgICAgICBleHBlY3RlZDogVGhlIHByb3BlcnR5LWZpbGVzIHN0cmluZyB0aGF0J3MgY29tcHV0ZWQgZnJvbSBGaW5hbGl6ZSgpLgorCisgICAgUmFpc2VzOgorICAgICAgQXNzZXJ0aW9uRXJyb3I6IE9uIGZpbmRpbmcgYSBtaXNtYXRjaC4KKyAgICAiIiIKKyAgICBhY3R1YWwgPSBzZWxmLl9HZXRQcm9wZXJ0eUZpbGVzU3RyaW5nKGlucHV0X3ppcCkKKyAgICBhc3NlcnQgYWN0dWFsID09IGV4cGVjdGVkLCBcCisgICAgICAgICJNaXNtYXRjaGluZyBzdHJlYW1pbmcgbWV0YWRhdGE6IHt9IHZzIHt9LiIuZm9ybWF0KGFjdHVhbCwgZXhwZWN0ZWQpCisKKyAgZGVmIF9HZXRQcm9wZXJ0eUZpbGVzU3RyaW5nKHNlbGYsIHppcF9maWxlLCByZXNlcnZlX3NwYWNlPUZhbHNlKToKKyAgICAiIiJDb25zdHJ1Y3RzIHRoZSBwcm9wZXJ0eS1maWxlcyBzdHJpbmcgcGVyIHJlcXVlc3QuIiIiCisKKyAgICBkZWYgQ29tcHV0ZUVudHJ5T2Zmc2V0U2l6ZShuYW1lKToKKyAgICAgICIiIkNvbXB1dGVzIHRoZSB6aXAgZW50cnkgb2Zmc2V0IGFuZCBzaXplLiIiIgorICAgICAgaW5mbyA9IHppcF9maWxlLmdldGluZm8obmFtZSkKKyAgICAgIG9mZnNldCA9IGluZm8uaGVhZGVyX29mZnNldCArIGxlbihpbmZvLkZpbGVIZWFkZXIoKSkKKyAgICAgIHNpemUgPSBpbmZvLmZpbGVfc2l6ZQorICAgICAgcmV0dXJuICclczolZDolZCcgJSAob3MucGF0aC5iYXNlbmFtZShuYW1lKSwgb2Zmc2V0LCBzaXplKQorCisgICAgdG9rZW5zID0gW10KKyAgICB0b2tlbnMuZXh0ZW5kKHNlbGYuX0dldFByZWNvbXB1dGVkKHppcF9maWxlKSkKKyAgICBmb3IgZW50cnkgaW4gc2VsZi5yZXF1aXJlZDoKKyAgICAgIHRva2Vucy5hcHBlbmQoQ29tcHV0ZUVudHJ5T2Zmc2V0U2l6ZShlbnRyeSkpCisgICAgZm9yIGVudHJ5IGluIHNlbGYub3B0aW9uYWw6CisgICAgICBpZiBlbnRyeSBpbiB6aXBfZmlsZS5uYW1lbGlzdCgpOgorICAgICAgICB0b2tlbnMuYXBwZW5kKENvbXB1dGVFbnRyeU9mZnNldFNpemUoZW50cnkpKQorCisgICAgIyAnTUVUQS1JTkYvY29tL2FuZHJvaWQvbWV0YWRhdGEnIGlzIHJlcXVpcmVkLiBXZSBkb24ndCBrbm93IGl0cyBhY3R1YWwKKyAgICAjIG9mZnNldCBhbmQgbGVuZ3RoIChhcyB3ZWxsIGFzIHRoZSB2YWx1ZXMgZm9yIG90aGVyIGVudHJpZXMpLiBTbyB3ZSByZXNlcnZlCisgICAgIyAxNS1ieXRlIGFzIGEgcGxhY2Vob2xkZXIgKCdvZmZzZXQ6bGVuZ3RoJyksIHdoaWNoIGlzIHN1ZmZpY2llbnQgdG8gY292ZXIKKyAgICAjIHRoZSBzcGFjZSBmb3IgbWV0YWRhdGEgZW50cnkuIEJlY2F1c2UgJ29mZnNldCcgYWxsb3dzIGEgbWF4IG9mIDEwLWRpZ2l0CisgICAgIyAoaS5lLiB+OSBHaUIpLCB3aXRoIGEgbWF4IG9mIDQtZGlnaXQgZm9yIHRoZSBsZW5ndGguIE5vdGUgdGhhdCBhbGwgdGhlCisgICAgIyByZXNlcnZlZCBzcGFjZSBzZXJ2ZXMgdGhlIG1ldGFkYXRhIGVudHJ5IG9ubHkuCisgICAgaWYgcmVzZXJ2ZV9zcGFjZToKKyAgICAgIHRva2Vucy5hcHBlbmQoJ21ldGFkYXRhOicgKyAnICcgKiAxNSkKKyAgICBlbHNlOgorICAgICAgdG9rZW5zLmFwcGVuZChDb21wdXRlRW50cnlPZmZzZXRTaXplKE1FVEFEQVRBX05BTUUpKQorCisgICAgcmV0dXJuICcsJy5qb2luKHRva2VucykKKworICBkZWYgX0dldFByZWNvbXB1dGVkKHNlbGYsIGlucHV0X3ppcCk6CisgICAgIiIiQ29tcHV0ZXMgdGhlIGFkZGl0aW9uYWwgdG9rZW5zIHRvIGJlIGluY2x1ZGVkIGludG8gdGhlIHByb3BlcnR5LWZpbGVzLgorCisgICAgVGhpcyBhcHBsaWVzIHRvIHRva2VucyB3aXRob3V0IGFjdHVhbCBaSVAgZW50cmllcywgc3VjaCBhcworICAgIHBheWxvYWRfbWV0YWRhZGF0YS5iaW4uIFdlIHdhbnQgdG8gZXhwb3NlIHRoZSBvZmZzZXQvc2l6ZSB0byB1cGRhdGVycywgc28KKyAgICB0aGF0IHRoZXkgY2FuIGRvd25sb2FkIHRoZSBwYXlsb2FkIG1ldGFkYXRhIGRpcmVjdGx5IHdpdGggdGhlIGluZm8uCisKKyAgICBBcmdzOgorICAgICAgaW5wdXRfemlwOiBUaGUgaW5wdXQgemlwIGZpbGUuCisKKyAgICBSZXR1cm5zOgorICAgICAgQSBsaXN0IG9mIHN0cmluZ3MgKHRva2VucykgdG8gYmUgYWRkZWQgdG8gdGhlIHByb3BlcnR5LWZpbGVzIHN0cmluZy4KKyAgICAiIiIKKyAgICAjIHB5bGludDogZGlzYWJsZT1uby1zZWxmLXVzZQorICAgICMgcHlsaW50OiBkaXNhYmxlPXVudXNlZC1hcmd1bWVudAorICAgIHJldHVybiBbXQorCisKK2NsYXNzIFN0cmVhbWluZ1Byb3BlcnR5RmlsZXMoUHJvcGVydHlGaWxlcyk6CisgICIiIkEgc3ViY2xhc3MgZm9yIGNvbXB1dGluZyB0aGUgcHJvcGVydHktZmlsZXMgZm9yIHN0cmVhbWluZyBBL0IgT1RBcy4iIiIKKworICBkZWYgX19pbml0X18oc2VsZik6CisgICAgc3VwZXIoU3RyZWFtaW5nUHJvcGVydHlGaWxlcywgc2VsZikuX19pbml0X18oKQorICAgIHNlbGYubmFtZSA9ICdvdGEtc3RyZWFtaW5nLXByb3BlcnR5LWZpbGVzJworICAgIHNlbGYucmVxdWlyZWQgPSAoCisgICAgICAgICMgcGF5bG9hZC5iaW4gYW5kIHBheWxvYWRfcHJvcGVydGllcy50eHQgbXVzdCBleGlzdC4KKyAgICAgICAgJ3BheWxvYWQuYmluJywKKyAgICAgICAgJ3BheWxvYWRfcHJvcGVydGllcy50eHQnLAorICAgICkKKyAgICBzZWxmLm9wdGlvbmFsID0gKAorICAgICAgICAjIGNhcmVfbWFwLnR4dCBpcyBhdmFpbGFibGUgb25seSBpZiBkbS12ZXJpdHkgaXMgZW5hYmxlZC4KKyAgICAgICAgJ2NhcmVfbWFwLnR4dCcsCisgICAgICAgICMgY29tcGF0aWJpbGl0eS56aXAgaXMgYXZhaWxhYmxlIG9ubHkgaWYgdGFyZ2V0IHN1cHBvcnRzIFRyZWJsZS4KKyAgICAgICAgJ2NvbXBhdGliaWxpdHkuemlwJywKKyAgICApCisKKworY2xhc3MgQWJPdGFQcm9wZXJ0eUZpbGVzKFN0cmVhbWluZ1Byb3BlcnR5RmlsZXMpOgorICAiIiJUaGUgcHJvcGVydHktZmlsZXMgZm9yIEEvQiBPVEEgdGhhdCBpbmNsdWRlcyBwYXlsb2FkX21ldGFkYXRhLmJpbiBpbmZvLgorCisgIFNpbmNlIFAsIHdlIGV4cG9zZSBvbmUgbW9yZSB0b2tlbiAoYWthIHByb3BlcnR5LWZpbGUpLCBpbiBhZGRpdGlvbiB0byB0aGUgb25lcworICBmb3Igc3RyZWFtaW5nIEEvQiBPVEEsIGZvciBhIHZpcnR1YWwgZW50cnkgb2YgJ3BheWxvYWRfbWV0YWRhdGEuYmluJy4KKyAgJ3BheWxvYWRfbWV0YWRhdGEuYmluJyBpcyB0aGUgaGVhZGVyIHBhcnQgb2YgYSBwYXlsb2FkICgncGF5bG9hZC5iaW4nKSwgd2hpY2gKKyAgZG9lc24ndCBleGlzdCBhcyBhIHNlcGFyYXRlIFpJUCBlbnRyeSwgYnV0IGNhbiBiZSB1c2VkIHRvIHZlcmlmeSBpZiB0aGUKKyAgcGF5bG9hZCBjYW4gYmUgYXBwbGllZCBvbiB0aGUgZ2l2ZW4gZGV2aWNlLgorCisgIEZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LCB3ZSBrZWVwIGJvdGggb2YgdGhlICdvdGEtc3RyZWFtaW5nLXByb3BlcnR5LWZpbGVzJworICBhbmQgdGhlIG5ld2x5IGFkZGVkICdvdGEtcHJvcGVydHktZmlsZXMnIGluIFAuIFRoZSBuZXcgdG9rZW4gd2lsbCBvbmx5IGJlCisgIGF2YWlsYWJsZSBpbiAnb3RhLXByb3BlcnR5LWZpbGVzJy4KKyAgIiIiCisKKyAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgIHN1cGVyKEFiT3RhUHJvcGVydHlGaWxlcywgc2VsZikuX19pbml0X18oKQorICAgIHNlbGYubmFtZSA9ICdvdGEtcHJvcGVydHktZmlsZXMnCisKKyAgZGVmIF9HZXRQcmVjb21wdXRlZChzZWxmLCBpbnB1dF96aXApOgorICAgIG9mZnNldCwgc2l6ZSA9IHNlbGYuX0dldFBheWxvYWRNZXRhZGF0YU9mZnNldEFuZFNpemUoaW5wdXRfemlwKQorICAgIHJldHVybiBbJ3BheWxvYWRfbWV0YWRhdGEuYmluOnt9Ont9Jy5mb3JtYXQob2Zmc2V0LCBzaXplKV0KKworICBAc3RhdGljbWV0aG9kCisgIGRlZiBfR2V0UGF5bG9hZE1ldGFkYXRhT2Zmc2V0QW5kU2l6ZShpbnB1dF96aXApOgorICAgICIiIkNvbXB1dGVzIHRoZSBvZmZzZXQgYW5kIHNpemUgb2YgdGhlIHBheWxvYWQgbWV0YWRhdGEgZm9yIGEgZ2l2ZW4gcGFja2FnZS4KKworICAgIChGcm9tIHN5c3RlbS91cGRhdGVfZW5naW5lL3VwZGF0ZV9tZXRhZGF0YS5wcm90bykKKyAgICBBIGRlbHRhIHVwZGF0ZSBmaWxlIGNvbnRhaW5zIGFsbCB0aGUgZGVsdGFzIG5lZWRlZCB0byB1cGRhdGUgYSBzeXN0ZW0gZnJvbQorICAgIG9uZSBzcGVjaWZpYyB2ZXJzaW9uIHRvIGFub3RoZXIgc3BlY2lmaWMgdmVyc2lvbi4gVGhlIHVwZGF0ZSBmb3JtYXQgaXMKKyAgICByZXByZXNlbnRlZCBieSB0aGlzIHN0cnVjdCBwc2V1ZG9jb2RlOgorCisgICAgc3RydWN0IGRlbHRhX3VwZGF0ZV9maWxlIHsKKyAgICAgIGNoYXIgbWFnaWNbNF0gPSAiQ3JBVSI7CisgICAgICB1aW50NjQgZmlsZV9mb3JtYXRfdmVyc2lvbjsKKyAgICAgIHVpbnQ2NCBtYW5pZmVzdF9zaXplOyAgLy8gU2l6ZSBvZiBwcm90b2J1ZiBEZWx0YUFyY2hpdmVNYW5pZmVzdAorCisgICAgICAvLyBPbmx5IHByZXNlbnQgaWYgZm9ybWF0X3ZlcnNpb24gPiAxOgorICAgICAgdWludDMyIG1ldGFkYXRhX3NpZ25hdHVyZV9zaXplOworCisgICAgICAvLyBUaGUgQnppcDIgY29tcHJlc3NlZCBEZWx0YUFyY2hpdmVNYW5pZmVzdAorICAgICAgY2hhciBtYW5pZmVzdFttZXRhZGF0YV9zaWduYXR1cmVfc2l6ZV07CisKKyAgICAgIC8vIFRoZSBzaWduYXR1cmUgb2YgdGhlIG1ldGFkYXRhIChmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHBheWxvYWQgdXAgdG8KKyAgICAgIC8vIHRoaXMgbG9jYXRpb24sIG5vdCBpbmNsdWRpbmcgdGhlIHNpZ25hdHVyZSBpdHNlbGYpLiBUaGlzIGlzIGEKKyAgICAgIC8vIHNlcmlhbGl6ZWQgU2lnbmF0dXJlcyBtZXNzYWdlLgorICAgICAgY2hhciBtZWRhdGFkYV9zaWduYXR1cmVfbWVzc2FnZVttZXRhZGF0YV9zaWduYXR1cmVfc2l6ZV07CisKKyAgICAgIC8vIERhdGEgYmxvYnMgZm9yIGZpbGVzLCBubyBzcGVjaWZpYyBmb3JtYXQuIFRoZSBzcGVjaWZpYyBvZmZzZXQKKyAgICAgIC8vIGFuZCBsZW5ndGggb2YgZWFjaCBkYXRhIGJsb2IgaXMgcmVjb3JkZWQgaW4gdGhlIERlbHRhQXJjaGl2ZU1hbmlmZXN0LgorICAgICAgc3RydWN0IHsKKyAgICAgICAgY2hhciBkYXRhW107CisgICAgICB9IGJsb2JzW107CisKKyAgICAgIC8vIFRoZXNlIHR3byBhcmUgbm90IHNpZ25lZDoKKyAgICAgIHVpbnQ2NCBwYXlsb2FkX3NpZ25hdHVyZXNfbWVzc2FnZV9zaXplOworICAgICAgY2hhciBwYXlsb2FkX3NpZ25hdHVyZXNfbWVzc2FnZVtdOworICAgIH07CisKKyAgICAncGF5bG9hZC1tZXRhZGF0YS5iaW4nIGNvbnRhaW5zIGFsbCB0aGUgYnl0ZXMgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZQorICAgIHBheWxvYWQsIHRpbGwgdGhlIGVuZCBvZiAnbWVkYXRhZGFfc2lnbmF0dXJlX21lc3NhZ2UnLgorICAgICIiIgorICAgIHBheWxvYWRfaW5mbyA9IGlucHV0X3ppcC5nZXRpbmZvKCdwYXlsb2FkLmJpbicpCisgICAgcGF5bG9hZF9vZmZzZXQgPSBwYXlsb2FkX2luZm8uaGVhZGVyX29mZnNldCArIGxlbihwYXlsb2FkX2luZm8uRmlsZUhlYWRlcigpKQorICAgIHBheWxvYWRfc2l6ZSA9IHBheWxvYWRfaW5mby5maWxlX3NpemUKKworICAgIHdpdGggaW5wdXRfemlwLm9wZW4oJ3BheWxvYWQuYmluJywgJ3InKSBhcyBwYXlsb2FkX2ZwOgorICAgICAgaGVhZGVyX2JpbiA9IHBheWxvYWRfZnAucmVhZCgyNCkKKworICAgICMgbmV0d29yayBieXRlIG9yZGVyIChiaWctZW5kaWFuKQorICAgIGhlYWRlciA9IHN0cnVjdC51bnBhY2soIiFJUVFMIiwgaGVhZGVyX2JpbikKKworICAgICMgJ0NyQVUnCisgICAgbWFnaWMgPSBoZWFkZXJbMF0KKyAgICBhc3NlcnQgbWFnaWMgPT0gMHg0MzcyNDE1NSwgIkludmFsaWQgbWFnaWM6IHs6eH0iLmZvcm1hdChtYWdpYykKKworICAgIG1hbmlmZXN0X3NpemUgPSBoZWFkZXJbMl0KKyAgICBtZXRhZGF0YV9zaWduYXR1cmVfc2l6ZSA9IGhlYWRlclszXQorICAgIG1ldGFkYXRhX3RvdGFsID0gMjQgKyBtYW5pZmVzdF9zaXplICsgbWV0YWRhdGFfc2lnbmF0dXJlX3NpemUKKyAgICBhc3NlcnQgbWV0YWRhdGFfdG90YWwgPCBwYXlsb2FkX3NpemUKKworICAgIHJldHVybiAocGF5bG9hZF9vZmZzZXQsIG1ldGFkYXRhX3RvdGFsKQorCisKK2NsYXNzIE5vbkFiT3RhUHJvcGVydHlGaWxlcyhQcm9wZXJ0eUZpbGVzKToKKyAgIiIiVGhlIHByb3BlcnR5LWZpbGVzIGZvciBub24tQS9CIE9UQS4KKworICBGb3Igbm9uLUEvQiBPVEEsIHRoZSBwcm9wZXJ0eS1maWxlcyBzdHJpbmcgY29udGFpbnMgdGhlIGluZm8gZm9yIE1FVEFEQVRBCisgIGVudHJ5LCB3aXRoIHdoaWNoIGEgc3lzdGVtIHVwZGF0ZXIgY2FuIGJlIGZldGNoZWQgdGhlIHBhY2thZ2UgbWV0YWRhdGEgcHJpb3IKKyAgdG8gZG93bmxvYWRpbmcgdGhlIGVudGlyZSBwYWNrYWdlLgorICAiIiIKKworICBkZWYgX19pbml0X18oc2VsZik6CisgICAgc3VwZXIoTm9uQWJPdGFQcm9wZXJ0eUZpbGVzLCBzZWxmKS5fX2luaXRfXygpCisgICAgc2VsZi5uYW1lID0gJ290YS1wcm9wZXJ0eS1maWxlcycKKworCitkZWYgRmluYWxpemVNZXRhZGF0YShtZXRhZGF0YSwgaW5wdXRfZmlsZSwgb3V0cHV0X2ZpbGUsIG5lZWRlZF9wcm9wZXJ0eV9maWxlcyk6CisgICIiIkZpbmFsaXplcyB0aGUgbWV0YWRhdGEgYW5kIHNpZ25zIGFuIEEvQiBPVEEgcGFja2FnZS4KKworICBJbiBvcmRlciB0byBzdHJlYW0gYW4gQS9CIE9UQSBwYWNrYWdlLCB3ZSBuZWVkICdvdGEtc3RyZWFtaW5nLXByb3BlcnR5LWZpbGVzJworICB0aGF0IGNvbnRhaW5zIHRoZSBvZmZzZXRzIGFuZCBzaXplcyBmb3IgdGhlIFpJUCBlbnRyaWVzLiBBbiBleGFtcGxlCisgIHByb3BlcnR5LWZpbGVzIHN0cmluZyBpcyBhcyBmb2xsb3dzLgorCisgICAgInBheWxvYWQuYmluOjY3OTozNDMscGF5bG9hZF9wcm9wZXJ0aWVzLnR4dDozNzg6NDUsbWV0YWRhdGE6Njk6Mzc5IgorCisgIE9UQSBzZXJ2ZXIgY2FuIHBhc3MgZG93biB0aGlzIHN0cmluZywgaW4gYWRkaXRpb24gdG8gdGhlIHBhY2thZ2UgVVJMLCB0byB0aGUKKyAgc3lzdGVtIHVwZGF0ZSBjbGllbnQuIFN5c3RlbSB1cGRhdGUgY2xpZW50IGNhbiB0aGVuIGZldGNoIGluZGl2aWR1YWwgWklQCisgIGVudHJpZXMgKFpJUF9TVE9SRUQpIGRpcmVjdGx5IGF0IHRoZSBnaXZlbiBvZmZzZXQgb2YgdGhlIFVSTC4KKworICBBcmdzOgorICAgIG1ldGFkYXRhOiBUaGUgbWV0YWRhdGEgZGljdCBmb3IgdGhlIHBhY2thZ2UuCisgICAgaW5wdXRfZmlsZTogVGhlIGlucHV0IFpJUCBmaWxlbmFtZSB0aGF0IGRvZXNuJ3QgY29udGFpbiB0aGUgcGFja2FnZSBNRVRBREFUQQorICAgICAgICBlbnRyeSB5ZXQuCisgICAgb3V0cHV0X2ZpbGU6IFRoZSBmaW5hbCBvdXRwdXQgWklQIGZpbGVuYW1lLgorICAgIG5lZWRlZF9wcm9wZXJ0eV9maWxlczogVGhlIGxpc3Qgb2YgUHJvcGVydHlGaWxlcycgdG8gYmUgZ2VuZXJhdGVkLgorICAiIiIKKworICBkZWYgQ29tcHV0ZUFsbFByb3BlcnR5RmlsZXMoaW5wdXRfZmlsZSwgbmVlZGVkX3Byb3BlcnR5X2ZpbGVzKToKKyAgICAjIFdyaXRlIHRoZSBjdXJyZW50IG1ldGFkYXRhIGVudHJ5IHdpdGggcGxhY2Vob2xkZXJzLgorICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKGlucHV0X2ZpbGUpIGFzIGlucHV0X3ppcDoKKyAgICAgIGZvciBwcm9wZXJ0eV9maWxlcyBpbiBuZWVkZWRfcHJvcGVydHlfZmlsZXM6CisgICAgICAgIG1ldGFkYXRhW3Byb3BlcnR5X2ZpbGVzLm5hbWVdID0gcHJvcGVydHlfZmlsZXMuQ29tcHV0ZShpbnB1dF96aXApCisgICAgICBuYW1lbGlzdCA9IGlucHV0X3ppcC5uYW1lbGlzdCgpCisKKyAgICBpZiBNRVRBREFUQV9OQU1FIGluIG5hbWVsaXN0OgorICAgICAgY29tbW9uLlppcERlbGV0ZShpbnB1dF9maWxlLCBNRVRBREFUQV9OQU1FKQorICAgIG91dHB1dF96aXAgPSB6aXBmaWxlLlppcEZpbGUoaW5wdXRfZmlsZSwgJ2EnKQorICAgIFdyaXRlTWV0YWRhdGEobWV0YWRhdGEsIG91dHB1dF96aXApCisgICAgY29tbW9uLlppcENsb3NlKG91dHB1dF96aXApCisKKyAgICBpZiBPUFRJT05TLm5vX3NpZ25pbmc6CisgICAgICByZXR1cm4gaW5wdXRfZmlsZQorCisgICAgcHJlbGltX3NpZ25pbmcgPSBjb21tb24uTWFrZVRlbXBGaWxlKHN1ZmZpeD0nLnppcCcpCisgICAgU2lnbk91dHB1dChpbnB1dF9maWxlLCBwcmVsaW1fc2lnbmluZykKKyAgICByZXR1cm4gcHJlbGltX3NpZ25pbmcKKworICBkZWYgRmluYWxpemVBbGxQcm9wZXJ0eUZpbGVzKHByZWxpbV9zaWduaW5nLCBuZWVkZWRfcHJvcGVydHlfZmlsZXMpOgorICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKHByZWxpbV9zaWduaW5nKSBhcyBwcmVsaW1fc2lnbmluZ196aXA6CisgICAgICBmb3IgcHJvcGVydHlfZmlsZXMgaW4gbmVlZGVkX3Byb3BlcnR5X2ZpbGVzOgorICAgICAgICBtZXRhZGF0YVtwcm9wZXJ0eV9maWxlcy5uYW1lXSA9IHByb3BlcnR5X2ZpbGVzLkZpbmFsaXplKAorICAgICAgICAgICAgcHJlbGltX3NpZ25pbmdfemlwLCBsZW4obWV0YWRhdGFbcHJvcGVydHlfZmlsZXMubmFtZV0pKQorCisgICMgU2lnbk91dHB1dCgpLCB3aGljaCBpbiB0dXJuIGNhbGxzIHNpZ25hcGsuamFyLCB3aWxsIHBvc3NpYmx5IHJlb3JkZXIgdGhlIFpJUAorICAjIGVudHJpZXMsIGFzIHdlbGwgYXMgcGFkZGluZyB0aGUgZW50cnkgaGVhZGVycy4gV2UgZG8gYSBwcmVsaW1pbmFyeSBzaWduaW5nCisgICMgKHdpdGggYW4gaW5jb21wbGV0ZSBtZXRhZGF0YSBlbnRyeSkgdG8gYWxsb3cgdGhhdCB0byBoYXBwZW4uIFRoZW4gY29tcHV0ZQorICAjIHRoZSBaSVAgZW50cnkgb2Zmc2V0cywgd3JpdGUgYmFjayB0aGUgZmluYWwgbWV0YWRhdGEgYW5kIGRvIHRoZSBmaW5hbAorICAjIHNpZ25pbmcuCisgIHByZWxpbV9zaWduaW5nID0gQ29tcHV0ZUFsbFByb3BlcnR5RmlsZXMoaW5wdXRfZmlsZSwgbmVlZGVkX3Byb3BlcnR5X2ZpbGVzKQorICB0cnk6CisgICAgRmluYWxpemVBbGxQcm9wZXJ0eUZpbGVzKHByZWxpbV9zaWduaW5nLCBuZWVkZWRfcHJvcGVydHlfZmlsZXMpCisgIGV4Y2VwdCBQcm9wZXJ0eUZpbGVzLkluc3VmZmljaWVudFNwYWNlRXhjZXB0aW9uOgorICAgICMgRXZlbiB3aXRoIHRoZSBwcmVsaW1pbmFyeSBzaWduaW5nLCB0aGUgZW50cnkgb3JkZXJzIG1heSBjaGFuZ2UKKyAgICAjIGRyYW1hdGljYWxseSwgd2hpY2ggbGVhZHMgdG8gaW5zdWZmaWNpZW50bHkgcmVzZXJ2ZWQgc3BhY2UgZHVyaW5nIHRoZQorICAgICMgZmlyc3QgY2FsbCB0byBDb21wdXRlQWxsUHJvcGVydHlGaWxlcygpLiBJbiB0aGF0IGNhc2UsIHdlIHJlZG8gYWxsIHRoZQorICAgICMgcHJlbGltaW5hcnkgc2lnbmluZyB3b3JrcywgYmFzZWQgb24gdGhlIGFscmVhZHkgb3JkZXJlZCBaSVAgZW50cmllcywgdG8KKyAgICAjIGFkZHJlc3MgdGhlIGlzc3VlLgorICAgIHByZWxpbV9zaWduaW5nID0gQ29tcHV0ZUFsbFByb3BlcnR5RmlsZXMoCisgICAgICAgIHByZWxpbV9zaWduaW5nLCBuZWVkZWRfcHJvcGVydHlfZmlsZXMpCisgICAgRmluYWxpemVBbGxQcm9wZXJ0eUZpbGVzKHByZWxpbV9zaWduaW5nLCBuZWVkZWRfcHJvcGVydHlfZmlsZXMpCisKKyAgIyBSZXBsYWNlIHRoZSBNRVRBREFUQSBlbnRyeS4KKyAgY29tbW9uLlppcERlbGV0ZShwcmVsaW1fc2lnbmluZywgTUVUQURBVEFfTkFNRSkKKyAgb3V0cHV0X3ppcCA9IHppcGZpbGUuWmlwRmlsZShwcmVsaW1fc2lnbmluZywgJ2EnKQorICBXcml0ZU1ldGFkYXRhKG1ldGFkYXRhLCBvdXRwdXRfemlwKQorICBjb21tb24uWmlwQ2xvc2Uob3V0cHV0X3ppcCkKKworICAjIFJlLXNpZ24gdGhlIHBhY2thZ2UgYWZ0ZXIgdXBkYXRpbmcgdGhlIG1ldGFkYXRhIGVudHJ5LgorICBpZiBPUFRJT05TLm5vX3NpZ25pbmc6CisgICAgb3V0cHV0X2ZpbGUgPSBwcmVsaW1fc2lnbmluZworICBlbHNlOgorICAgIFNpZ25PdXRwdXQocHJlbGltX3NpZ25pbmcsIG91dHB1dF9maWxlKQorCisgICMgUmVvcGVuIHRoZSBmaW5hbCBzaWduZWQgemlwIHRvIGRvdWJsZSBjaGVjayB0aGUgc3RyZWFtaW5nIG1ldGFkYXRhLgorICB3aXRoIHppcGZpbGUuWmlwRmlsZShvdXRwdXRfZmlsZSkgYXMgb3V0cHV0X3ppcDoKKyAgICBmb3IgcHJvcGVydHlfZmlsZXMgaW4gbmVlZGVkX3Byb3BlcnR5X2ZpbGVzOgorICAgICAgcHJvcGVydHlfZmlsZXMuVmVyaWZ5KG91dHB1dF96aXAsIG1ldGFkYXRhW3Byb3BlcnR5X2ZpbGVzLm5hbWVdLnN0cmlwKCkpCisKKworZGVmIFdyaXRlQmxvY2tJbmNyZW1lbnRhbE9UQVBhY2thZ2UodGFyZ2V0X3ppcCwgc291cmNlX3ppcCwgb3V0cHV0X2ZpbGUpOgorICB0YXJnZXRfaW5mbyA9IEJ1aWxkSW5mbyhPUFRJT05TLnRhcmdldF9pbmZvX2RpY3QsIE9QVElPTlMub2VtX2RpY3RzKQorICBzb3VyY2VfaW5mbyA9IEJ1aWxkSW5mbyhPUFRJT05TLnNvdXJjZV9pbmZvX2RpY3QsIE9QVElPTlMub2VtX2RpY3RzKQorCisgIHRhcmdldF9hcGlfdmVyc2lvbiA9IHRhcmdldF9pbmZvWyJyZWNvdmVyeV9hcGlfdmVyc2lvbiJdCisgIHNvdXJjZV9hcGlfdmVyc2lvbiA9IHNvdXJjZV9pbmZvWyJyZWNvdmVyeV9hcGlfdmVyc2lvbiJdCisgIGlmIHNvdXJjZV9hcGlfdmVyc2lvbiA9PSAwOgorICAgIHByaW50KCJXQVJOSU5HOiBnZW5lcmF0aW5nIGVkaWZ5IHNjcmlwdCBmb3IgYSBzb3VyY2UgdGhhdCAiCisgICAgICAgICAgImNhbid0IGluc3RhbGwgaXQuIikKKworICBzY3JpcHQgPSBlZGlmeV9nZW5lcmF0b3IuRWRpZnlHZW5lcmF0b3IoCisgICAgICBzb3VyY2VfYXBpX3ZlcnNpb24sIHRhcmdldF9pbmZvLCBmc3RhYj1zb3VyY2VfaW5mb1siZnN0YWIiXSkKKworICBpZiB0YXJnZXRfaW5mby5vZW1fcHJvcHMgb3Igc291cmNlX2luZm8ub2VtX3Byb3BzOgorICAgIGlmIG5vdCBPUFRJT05TLm9lbV9ub19tb3VudDoKKyAgICAgIHNvdXJjZV9pbmZvLldyaXRlTW91bnRPZW1TY3JpcHQoc2NyaXB0KQorCisgIG1ldGFkYXRhID0gR2V0UGFja2FnZU1ldGFkYXRhKHRhcmdldF9pbmZvLCBzb3VyY2VfaW5mbykKKworICBpZiBub3QgT1BUSU9OUy5ub19zaWduaW5nOgorICAgIHN0YWdpbmdfZmlsZSA9IGNvbW1vbi5NYWtlVGVtcEZpbGUoc3VmZml4PScuemlwJykKKyAgZWxzZToKKyAgICBzdGFnaW5nX2ZpbGUgPSBvdXRwdXRfZmlsZQorCisgIG91dHB1dF96aXAgPSB6aXBmaWxlLlppcEZpbGUoCisgICAgICBzdGFnaW5nX2ZpbGUsICJ3IiwgY29tcHJlc3Npb249emlwZmlsZS5aSVBfREVGTEFURUQpCiAKICAgZGV2aWNlX3NwZWNpZmljID0gY29tbW9uLkRldmljZVNwZWNpZmljUGFyYW1zKAogICAgICAgc291cmNlX3ppcD1zb3VyY2VfemlwLAotICAgICAgc291cmNlX3ZlcnNpb249c291cmNlX3ZlcnNpb24sCisgICAgICBzb3VyY2VfdmVyc2lvbj1zb3VyY2VfYXBpX3ZlcnNpb24sCiAgICAgICB0YXJnZXRfemlwPXRhcmdldF96aXAsCi0gICAgICB0YXJnZXRfdmVyc2lvbj10YXJnZXRfdmVyc2lvbiwKKyAgICAgIHRhcmdldF92ZXJzaW9uPXRhcmdldF9hcGlfdmVyc2lvbiwKICAgICAgIG91dHB1dF96aXA9b3V0cHV0X3ppcCwKICAgICAgIHNjcmlwdD1zY3JpcHQsCiAgICAgICBtZXRhZGF0YT1tZXRhZGF0YSwKLSAgICAgIGluZm9fZGljdD1PUFRJT05TLnNvdXJjZV9pbmZvX2RpY3QpCi0KLSAgc291cmNlX2ZwID0gQ2FsY3VsYXRlRmluZ2VycHJpbnQoc291cmNlX29lbV9wcm9wcywgb2VtX2RpY3RzIGFuZCBvZW1fZGljdHNbMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QVElPTlMuc291cmNlX2luZm9fZGljdCkKLSAgdGFyZ2V0X2ZwID0gQ2FsY3VsYXRlRmluZ2VycHJpbnQodGFyZ2V0X29lbV9wcm9wcywgb2VtX2RpY3RzIGFuZCBvZW1fZGljdHNbMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QVElPTlMudGFyZ2V0X2luZm9fZGljdCkKLSAgbWV0YWRhdGFbInByZS1idWlsZCJdID0gc291cmNlX2ZwCi0gIG1ldGFkYXRhWyJwb3N0LWJ1aWxkIl0gPSB0YXJnZXRfZnAKLSAgbWV0YWRhdGFbInByZS1idWlsZC1pbmNyZW1lbnRhbCJdID0gR2V0QnVpbGRQcm9wKAotICAgICAgInJvLmJ1aWxkLnZlcnNpb24uaW5jcmVtZW50YWwiLCBPUFRJT05TLnNvdXJjZV9pbmZvX2RpY3QpCi0gIG1ldGFkYXRhWyJwb3N0LWJ1aWxkLWluY3JlbWVudGFsIl0gPSBHZXRCdWlsZFByb3AoCi0gICAgICAicm8uYnVpbGQudmVyc2lvbi5pbmNyZW1lbnRhbCIsIE9QVElPTlMudGFyZ2V0X2luZm9fZGljdCkKKyAgICAgIGluZm9fZGljdD1zb3VyY2VfaW5mbykKIAogICBzb3VyY2VfYm9vdCA9IGNvbW1vbi5HZXRCb290YWJsZUltYWdlKAotICAgICAgIi90bXAvYm9vdC5pbWciLCAiYm9vdC5pbWciLCBPUFRJT05TLnNvdXJjZV90bXAsICJCT09UIiwKLSAgICAgIE9QVElPTlMuc291cmNlX2luZm9fZGljdCkKKyAgICAgICIvdG1wL2Jvb3QuaW1nIiwgImJvb3QuaW1nIiwgT1BUSU9OUy5zb3VyY2VfdG1wLCAiQk9PVCIsIHNvdXJjZV9pbmZvKQogICB0YXJnZXRfYm9vdCA9IGNvbW1vbi5HZXRCb290YWJsZUltYWdlKAotICAgICAgIi90bXAvYm9vdC5pbWciLCAiYm9vdC5pbWciLCBPUFRJT05TLnRhcmdldF90bXAsICJCT09UIikKKyAgICAgICIvdG1wL2Jvb3QuaW1nIiwgImJvb3QuaW1nIiwgT1BUSU9OUy50YXJnZXRfdG1wLCAiQk9PVCIsIHRhcmdldF9pbmZvKQogICB1cGRhdGluZ19ib290ID0gKG5vdCBPUFRJT05TLnR3b19zdGVwIGFuZAogICAgICAgICAgICAgICAgICAgIChzb3VyY2VfYm9vdC5kYXRhICE9IHRhcmdldF9ib290LmRhdGEpKQogCiAgIHRhcmdldF9yZWNvdmVyeSA9IGNvbW1vbi5HZXRCb290YWJsZUltYWdlKAogICAgICAgIi90bXAvcmVjb3ZlcnkuaW1nIiwgInJlY292ZXJ5LmltZyIsIE9QVElPTlMudGFyZ2V0X3RtcCwgIlJFQ09WRVJZIikKIAotICBzeXN0ZW1fc3JjID0gR2V0SW1hZ2UoInN5c3RlbSIsIE9QVElPTlMuc291cmNlX3RtcCkKLSAgc3lzdGVtX3RndCA9IEdldEltYWdlKCJzeXN0ZW0iLCBPUFRJT05TLnRhcmdldF90bXApCisgICMgV2hlbiB0YXJnZXQgdXNlcyAnQk9BUkRfRVhUNF9TSEFSRV9EVVBfQkxPQ0tTIDo9IHRydWUnLCBpbWFnZXMgbWF5IGNvbnRhaW4KKyAgIyBzaGFyZWQgYmxvY2tzIChpLmUuIHNvbWUgYmxvY2tzIHdpbGwgc2hvdyB1cCBpbiBtdWx0aXBsZSBmaWxlcycgYmxvY2sKKyAgIyBsaXN0KS4gV2UgY2FuIG9ubHkgYWxsb2NhdGUgc3VjaCBzaGFyZWQgYmxvY2tzIHRvIHRoZSBmaXJzdCAib3duZXIiLCBhbmQKKyAgIyBkaXNhYmxlIGltZ2RpZmYgZm9yIGFsbCBsYXRlciBvY2N1cnJlbmNlcy4KKyAgYWxsb3dfc2hhcmVkX2Jsb2NrcyA9IChzb3VyY2VfaW5mby5nZXQoJ2V4dDRfc2hhcmVfZHVwX2Jsb2NrcycpID09ICJ0cnVlIiBvcgorICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9pbmZvLmdldCgnZXh0NF9zaGFyZV9kdXBfYmxvY2tzJykgPT0gInRydWUiKQorICBzeXN0ZW1fc3JjID0gY29tbW9uLkdldFNwYXJzZUltYWdlKCJzeXN0ZW0iLCBPUFRJT05TLnNvdXJjZV90bXAsIHNvdXJjZV96aXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfc2hhcmVkX2Jsb2NrcykKKyAgc3lzdGVtX3RndCA9IGNvbW1vbi5HZXRTcGFyc2VJbWFnZSgic3lzdGVtIiwgT1BUSU9OUy50YXJnZXRfdG1wLCB0YXJnZXRfemlwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3NoYXJlZF9ibG9ja3MpCiAKLSAgYmxvY2tpbWdkaWZmX3ZlcnNpb24gPSAxCi0gIGlmIE9QVElPTlMuaW5mb19kaWN0OgotICAgIGJsb2NraW1nZGlmZl92ZXJzaW9uID0gbWF4KAotICAgICAgICBpbnQoaSkgZm9yIGkgaW4KLSAgICAgICAgT1BUSU9OUy5pbmZvX2RpY3QuZ2V0KCJibG9ja2ltZ2RpZmZfdmVyc2lvbnMiLCAiMSIpLnNwbGl0KCIsIikpCisgIGJsb2NraW1nZGlmZl92ZXJzaW9uID0gbWF4KAorICAgICAgaW50KGkpIGZvciBpIGluIHRhcmdldF9pbmZvLmdldCgiYmxvY2tpbWdkaWZmX3ZlcnNpb25zIiwgIjEiKS5zcGxpdCgiLCIpKQorICBhc3NlcnQgYmxvY2tpbWdkaWZmX3ZlcnNpb24gPj0gMwogCiAgICMgQ2hlY2sgdGhlIGZpcnN0IGJsb2NrIG9mIHRoZSBzb3VyY2Ugc3lzdGVtIHBhcnRpdGlvbiBmb3IgcmVtb3VudCBSL1cgb25seQogICAjIGlmIHRoZSBmaWxlc3lzdGVtIGlzIGV4dDQuCi0gIHN5c3RlbV9zcmNfcGFydGl0aW9uID0gT1BUSU9OUy5zb3VyY2VfaW5mb19kaWN0WyJmc3RhYiJdWyIvc3lzdGVtIl0KKyAgc3lzdGVtX3NyY19wYXJ0aXRpb24gPSBzb3VyY2VfaW5mb1siZnN0YWIiXVsiL3N5c3RlbSJdCiAgIGNoZWNrX2ZpcnN0X2Jsb2NrID0gc3lzdGVtX3NyY19wYXJ0aXRpb24uZnNfdHlwZSA9PSAiZXh0NCIKICAgIyBEaXNhYmxlIHVzaW5nIGltZ2RpZmYgZm9yIHNxdWFzaGZzLiAnaW1nZGlmZiAteicgZXhwZWN0cyBpbnB1dCBmaWxlcyB0byBiZQogICAjIGluIHppcCBmb3JtYXRzLiBIb3dldmVyIHdpdGggc3F1YXNoZnMsIGEpIGFsbCBmaWxlcyBhcmUgY29tcHJlc3NlZCBpbiBMWjQ7CiAgICMgYikgdGhlIGJsb2NrcyBsaXN0ZWQgaW4gYmxvY2sgbWFwIG1heSBub3QgY29udGFpbiBhbGwgdGhlIGJ5dGVzIGZvciBhIGdpdmVuCiAgICMgZmlsZSAoYmVjYXVzZSB0aGV5J3JlIHJvdW5kZWQgdG8gYmUgNEstYWxpZ25lZCkuCi0gIHN5c3RlbV90Z3RfcGFydGl0aW9uID0gT1BUSU9OUy50YXJnZXRfaW5mb19kaWN0WyJmc3RhYiJdWyIvc3lzdGVtIl0KKyAgc3lzdGVtX3RndF9wYXJ0aXRpb24gPSB0YXJnZXRfaW5mb1siZnN0YWIiXVsiL3N5c3RlbSJdCiAgIGRpc2FibGVfaW1nZGlmZiA9IChzeXN0ZW1fc3JjX3BhcnRpdGlvbi5mc190eXBlID09ICJzcXVhc2hmcyIgb3IKICAgICAgICAgICAgICAgICAgICAgIHN5c3RlbV90Z3RfcGFydGl0aW9uLmZzX3R5cGUgPT0gInNxdWFzaGZzIikKICAgc3lzdGVtX2RpZmYgPSBjb21tb24uQmxvY2tEaWZmZXJlbmNlKCJzeXN0ZW0iLCBzeXN0ZW1fdGd0LCBzeXN0ZW1fc3JjLApAQCAtNjczLDEyICsxNDAwLDE0IEBACiAgIGlmIEhhc1ZlbmRvclBhcnRpdGlvbih0YXJnZXRfemlwKToKICAgICBpZiBub3QgSGFzVmVuZG9yUGFydGl0aW9uKHNvdXJjZV96aXApOgogICAgICAgcmFpc2UgUnVudGltZUVycm9yKCJjYW4ndCBnZW5lcmF0ZSBpbmNyZW1lbnRhbCB0aGF0IGFkZHMgL3ZlbmRvciIpCi0gICAgdmVuZG9yX3NyYyA9IEdldEltYWdlKCJ2ZW5kb3IiLCBPUFRJT05TLnNvdXJjZV90bXApCi0gICAgdmVuZG9yX3RndCA9IEdldEltYWdlKCJ2ZW5kb3IiLCBPUFRJT05TLnRhcmdldF90bXApCisgICAgdmVuZG9yX3NyYyA9IGNvbW1vbi5HZXRTcGFyc2VJbWFnZSgidmVuZG9yIiwgT1BUSU9OUy5zb3VyY2VfdG1wLCBzb3VyY2VfemlwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfc2hhcmVkX2Jsb2NrcykKKyAgICB2ZW5kb3JfdGd0ID0gY29tbW9uLkdldFNwYXJzZUltYWdlKCJ2ZW5kb3IiLCBPUFRJT05TLnRhcmdldF90bXAsIHRhcmdldF96aXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19zaGFyZWRfYmxvY2tzKQogCiAgICAgIyBDaGVjayBmaXJzdCBibG9jayBvZiB2ZW5kb3IgcGFydGl0aW9uIGZvciByZW1vdW50IFIvVyBvbmx5IGlmCiAgICAgIyBkaXNrIHR5cGUgaXMgZXh0NAotICAgIHZlbmRvcl9wYXJ0aXRpb24gPSBPUFRJT05TLnNvdXJjZV9pbmZvX2RpY3RbImZzdGFiIl1bIi92ZW5kb3IiXQorICAgIHZlbmRvcl9wYXJ0aXRpb24gPSBzb3VyY2VfaW5mb1siZnN0YWIiXVsiL3ZlbmRvciJdCiAgICAgY2hlY2tfZmlyc3RfYmxvY2sgPSB2ZW5kb3JfcGFydGl0aW9uLmZzX3R5cGUgPT0gImV4dDQiCiAgICAgZGlzYWJsZV9pbWdkaWZmID0gdmVuZG9yX3BhcnRpdGlvbi5mc190eXBlID09ICJzcXVhc2hmcyIKICAgICB2ZW5kb3JfZGlmZiA9IGNvbW1vbi5CbG9ja0RpZmZlcmVuY2UoInZlbmRvciIsIHZlbmRvcl90Z3QsIHZlbmRvcl9zcmMsCkBAIC02ODgsNyArMTQxNywxMSBAQAogICBlbHNlOgogICAgIHZlbmRvcl9kaWZmID0gTm9uZQogCi0gIEFwcGVuZEFzc2VydGlvbnMoc2NyaXB0LCBPUFRJT05TLnRhcmdldF9pbmZvX2RpY3QsIG9lbV9kaWN0cykKKyAgQWRkQ29tcGF0aWJpbGl0eUFyY2hpdmVJZlRyZWJsZUVuYWJsZWQoCisgICAgICB0YXJnZXRfemlwLCBvdXRwdXRfemlwLCB0YXJnZXRfaW5mbywgc291cmNlX2luZm8pCisKKyAgIyBBc3NlcnRpb25zIChlLmcuIGRldmljZSBwcm9wZXJ0aWVzIGNoZWNrKS4KKyAgdGFyZ2V0X2luZm8uV3JpdGVEZXZpY2VBc3NlcnRpb25zKHNjcmlwdCwgT1BUSU9OUy5vZW1fbm9fbW91bnQpCiAgIGRldmljZV9zcGVjaWZpYy5JbmNyZW1lbnRhbE9UQV9Bc3NlcnRpb25zKCkKIAogICAjIFR3by1zdGVwIGluY3JlbWVudGFsIHBhY2thZ2Ugc3RyYXRlZ3kgKGluIGNocm9ub2xvZ2ljYWwgb3JkZXIsCkBAIC03MTQsMTIgKzE0NDcsMTIgQEAKICAgIyAgICAoYWxsb3cgcmVjb3ZlcnkgdG8gbWFyayBpdHNlbGYgZmluaXNoZWQgYW5kIHJlYm9vdCkKIAogICBpZiBPUFRJT05TLnR3b19zdGVwOgotICAgIGlmIG5vdCBPUFRJT05TLnNvdXJjZV9pbmZvX2RpY3QuZ2V0KCJtdWx0aXN0YWdlX3N1cHBvcnQiLCBOb25lKToKKyAgICBpZiBub3Qgc291cmNlX2luZm8uZ2V0KCJtdWx0aXN0YWdlX3N1cHBvcnQiKToKICAgICAgIGFzc2VydCBGYWxzZSwgInR3by1zdGVwIHBhY2thZ2VzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBidWlsZCIKLSAgICBmcyA9IE9QVElPTlMuc291cmNlX2luZm9fZGljdFsiZnN0YWIiXVsiL21pc2MiXQorICAgIGZzID0gc291cmNlX2luZm9bImZzdGFiIl1bIi9taXNjIl0KICAgICBhc3NlcnQgZnMuZnNfdHlwZS51cHBlcigpID09ICJFTU1DIiwgXAogICAgICAgICAidHdvLXN0ZXAgcGFja2FnZXMgb25seSBzdXBwb3J0ZWQgb24gZGV2aWNlcyB3aXRoIEVNTUMgL21pc2MgcGFydGl0aW9ucyIKLSAgICBiY2JfZGV2ID0geyJiY2JfZGV2IjogZnMuZGV2aWNlfQorICAgIGJjYl9kZXYgPSB7ImJjYl9kZXYiIDogZnMuZGV2aWNlfQogICAgIGNvbW1vbi5aaXBXcml0ZVN0cihvdXRwdXRfemlwLCAicmVjb3ZlcnkuaW1nIiwgdGFyZ2V0X3JlY292ZXJ5LmRhdGEpCiAgICAgc2NyaXB0LkFwcGVuZEV4dHJhKCIiIgogaWYgZ2V0X3N0YWdlKCIlKGJjYl9kZXYpcyIpID09ICIyLzMiIHRoZW4KQEAgLTczOSwzOSArMTQ3MiwxNCBAQAogICAgIHNjcmlwdC5Db21tZW50KCJTdGFnZSAxLzMiKQogCiAgICMgRHVtcCBmaW5nZXJwcmludHMKLSAgc2NyaXB0LlByaW50KCJTb3VyY2U6ICVzIiAlIChzb3VyY2VfZnAsKSkKLSAgc2NyaXB0LlByaW50KCJUYXJnZXQ6ICVzIiAlICh0YXJnZXRfZnAsKSkKKyAgc2NyaXB0LlByaW50KCJTb3VyY2U6IHt9Ii5mb3JtYXQoc291cmNlX2luZm8uZmluZ2VycHJpbnQpKQorICBzY3JpcHQuUHJpbnQoIlRhcmdldDoge30iLmZvcm1hdCh0YXJnZXRfaW5mby5maW5nZXJwcmludCkpCiAKICAgc2NyaXB0LlByaW50KCJWZXJpZnlpbmcgY3VycmVudCBzeXN0ZW0uLi4iKQogCiAgIGRldmljZV9zcGVjaWZpYy5JbmNyZW1lbnRhbE9UQV9WZXJpZnlCZWdpbigpCiAKLSAgIyBXaGVuIGJsb2NraW1nZGlmZiB2ZXJzaW9uIGlzIGxlc3MgdGhhbiAzIChub24tcmVzdW1hYmxlIGJsb2NrLWJhc2VkIE9UQSksCi0gICMgcGF0Y2hpbmcgb24gYSBkZXZpY2UgdGhhdCdzIGFscmVhZHkgb24gdGhlIHRhcmdldCBidWlsZCB3aWxsIGRhbWFnZSB0aGUKLSAgIyBzeXN0ZW0uIEJlY2F1c2Ugb3BlcmF0aW9ucyBsaWtlIG1vdmUgZG9uJ3QgY2hlY2sgdGhlIGJsb2NrIHN0YXRlLCB0aGV5Ci0gICMgYWx3YXlzIGFwcGx5IHRoZSBjaGFuZ2VzIHVuY29uZGl0aW9uYWxseS4KLSAgaWYgYmxvY2tpbWdkaWZmX3ZlcnNpb24gPD0gMjoKLSAgICBpZiBzb3VyY2Vfb2VtX3Byb3BzIGlzIE5vbmU6Ci0gICAgICBzY3JpcHQuQXNzZXJ0U29tZUZpbmdlcnByaW50KHNvdXJjZV9mcCkKLSAgICBlbHNlOgotICAgICAgc2NyaXB0LkFzc2VydFNvbWVUaHVtYnByaW50KAotICAgICAgICAgIEdldEJ1aWxkUHJvcCgicm8uYnVpbGQudGh1bWJwcmludCIsIE9QVElPTlMuc291cmNlX2luZm9fZGljdCkpCi0KLSAgZWxzZTogIyBibG9ja2ltZ2RpZmZfdmVyc2lvbiA+IDIKLSAgICBpZiBzb3VyY2Vfb2VtX3Byb3BzIGlzIE5vbmUgYW5kIHRhcmdldF9vZW1fcHJvcHMgaXMgTm9uZToKLSAgICAgIHNjcmlwdC5Bc3NlcnRTb21lRmluZ2VycHJpbnQoc291cmNlX2ZwLCB0YXJnZXRfZnApCi0gICAgZWxpZiBzb3VyY2Vfb2VtX3Byb3BzIGlzIG5vdCBOb25lIGFuZCB0YXJnZXRfb2VtX3Byb3BzIGlzIG5vdCBOb25lOgotICAgICAgc2NyaXB0LkFzc2VydFNvbWVUaHVtYnByaW50KAotICAgICAgICAgIEdldEJ1aWxkUHJvcCgicm8uYnVpbGQudGh1bWJwcmludCIsIE9QVElPTlMudGFyZ2V0X2luZm9fZGljdCksCi0gICAgICAgICAgR2V0QnVpbGRQcm9wKCJyby5idWlsZC50aHVtYnByaW50IiwgT1BUSU9OUy5zb3VyY2VfaW5mb19kaWN0KSkKLSAgICBlbGlmIHNvdXJjZV9vZW1fcHJvcHMgaXMgTm9uZSBhbmQgdGFyZ2V0X29lbV9wcm9wcyBpcyBub3QgTm9uZToKLSAgICAgIHNjcmlwdC5Bc3NlcnRGaW5nZXJwcmludE9yVGh1bWJwcmludCgKLSAgICAgICAgICBzb3VyY2VfZnAsCi0gICAgICAgICAgR2V0QnVpbGRQcm9wKCJyby5idWlsZC50aHVtYnByaW50IiwgT1BUSU9OUy50YXJnZXRfaW5mb19kaWN0KSkKLSAgICBlbHNlOgotICAgICAgc2NyaXB0LkFzc2VydEZpbmdlcnByaW50T3JUaHVtYnByaW50KAotICAgICAgICAgIHRhcmdldF9mcCwKLSAgICAgICAgICBHZXRCdWlsZFByb3AoInJvLmJ1aWxkLnRodW1icHJpbnQiLCBPUFRJT05TLnNvdXJjZV9pbmZvX2RpY3QpKQorICBXcml0ZUZpbmdlcnByaW50QXNzZXJ0aW9uKHNjcmlwdCwgdGFyZ2V0X2luZm8sIHNvdXJjZV9pbmZvKQogCiAgICMgQ2hlY2sgdGhlIHJlcXVpcmVkIGNhY2hlIHNpemUgKGkuZS4gc3Rhc2hlZCBibG9ja3MpLgogICBzaXplID0gW10KQEAgLTc4MSw4ICsxNDg5LDcgQEAKICAgICBzaXplLmFwcGVuZCh2ZW5kb3JfZGlmZi5yZXF1aXJlZF9jYWNoZSkKIAogICBpZiB1cGRhdGluZ19ib290OgotICAgIGJvb3RfdHlwZSwgYm9vdF9kZXZpY2UgPSBjb21tb24uR2V0VHlwZUFuZERldmljZSgKLSAgICAgICAgIi9ib290IiwgT1BUSU9OUy5zb3VyY2VfaW5mb19kaWN0KQorICAgIGJvb3RfdHlwZSwgYm9vdF9kZXZpY2UgPSBjb21tb24uR2V0VHlwZUFuZERldmljZSgiL2Jvb3QiLCBzb3VyY2VfaW5mbykKICAgICBkID0gY29tbW9uLkRpZmZlcmVuY2UodGFyZ2V0X2Jvb3QsIHNvdXJjZV9ib290KQogICAgIF8sIF8sIGQgPSBkLkNvbXB1dGVQYXRjaCgpCiAgICAgaWYgZCBpcyBOb25lOgpAQCAtODcyLDcgKzE1NzksNiBAQAogICBpZiBPUFRJT05TLndpcGVfdXNlcl9kYXRhOgogICAgIHNjcmlwdC5QcmludCgiRXJhc2luZyB1c2VyIGRhdGEuLi4iKQogICAgIHNjcmlwdC5Gb3JtYXRQYXJ0aXRpb24oIi9kYXRhIikKLSAgICBtZXRhZGF0YVsib3RhLXdpcGUiXSA9ICJ5ZXMiCiAKICAgaWYgT1BUSU9OUy50d29fc3RlcDoKICAgICBzY3JpcHQuQXBwZW5kRXh0cmEoIiIiCkBAIC04ODksMzg2ICsxNTk1LDE4NyBAQAogICBlbHNlOgogICAgIHNjcmlwdC5BZGRUb1ppcCh0YXJnZXRfemlwLCBvdXRwdXRfemlwLCBpbnB1dF9wYXRoPU9QVElPTlMudXBkYXRlcl9iaW5hcnkpCiAgIG1ldGFkYXRhWyJvdGEtcmVxdWlyZWQtY2FjaGUiXSA9IHN0cihzY3JpcHQucmVxdWlyZWRfY2FjaGUpCi0gIFdyaXRlTWV0YWRhdGEobWV0YWRhdGEsIG91dHB1dF96aXApCisKKyAgIyBXZSBoYXZlbid0IHdyaXR0ZW4gdGhlIG1ldGFkYXRhIGVudHJ5IHlldCwgd2hpY2ggd2lsbCBiZSBoYW5kbGVkIGluCisgICMgRmluYWxpemVNZXRhZGF0YSgpLgorICBjb21tb24uWmlwQ2xvc2Uob3V0cHV0X3ppcCkKKworICAjIFNpZ24gdGhlIGdlbmVyYXRlZCB6aXAgcGFja2FnZSB1bmxlc3Mgbm9fc2lnbmluZyBpcyBzcGVjaWZpZWQuCisgIG5lZWRlZF9wcm9wZXJ0eV9maWxlcyA9ICgKKyAgICAgIE5vbkFiT3RhUHJvcGVydHlGaWxlcygpLAorICApCisgIEZpbmFsaXplTWV0YWRhdGEobWV0YWRhdGEsIHN0YWdpbmdfZmlsZSwgb3V0cHV0X2ZpbGUsIG5lZWRlZF9wcm9wZXJ0eV9maWxlcykKIAogCi1kZWYgV3JpdGVWZXJpZnlQYWNrYWdlKGlucHV0X3ppcCwgb3V0cHV0X3ppcCk6Ci0gIHNjcmlwdCA9IGVkaWZ5X2dlbmVyYXRvci5FZGlmeUdlbmVyYXRvcigzLCBPUFRJT05TLmluZm9fZGljdCkKK2RlZiBHZXRUYXJnZXRGaWxlc1ppcEZvclNlY29uZGFyeUltYWdlcyhpbnB1dF9maWxlLCBza2lwX3Bvc3RpbnN0YWxsPUZhbHNlKToKKyAgIiIiUmV0dXJucyBhIHRhcmdldC1maWxlcy56aXAgZmlsZSBmb3IgZ2VuZXJhdGluZyBzZWNvbmRhcnkgcGF5bG9hZC4KIAotICBvZW1fcHJvcHMgPSBPUFRJT05TLmluZm9fZGljdC5nZXQoIm9lbV9maW5nZXJwcmludF9wcm9wZXJ0aWVzIikKLSAgcmVjb3ZlcnlfbW91bnRfb3B0aW9ucyA9IE9QVElPTlMuaW5mb19kaWN0LmdldCgKLSAgICAgICJyZWNvdmVyeV9tb3VudF9vcHRpb25zIikKLSAgb2VtX2RpY3RzID0gTm9uZQotICBpZiBvZW1fcHJvcHM6Ci0gICAgb2VtX2RpY3RzID0gX0xvYWRPZW1EaWN0cyhzY3JpcHQsIHJlY292ZXJ5X21vdW50X29wdGlvbnMpCisgIEFsdGhvdWdoIHRoZSBvcmlnaW5hbCB0YXJnZXQtZmlsZXMuemlwIGFscmVhZHkgY29udGFpbnMgc2Vjb25kYXJ5IHNsb3QKKyAgaW1hZ2VzIChpLmUuIElNQUdFUy9zeXN0ZW1fb3RoZXIuaW1nKSwgd2UgbmVlZCB0byByZW5hbWUgdGhlIGZpbGVzIHRvIHRoZQorICBvbmVzIHdpdGhvdXQgX290aGVyIHN1ZmZpeC4gTm90ZSB0aGF0IHdlIGNhbm5vdCBpbnN0ZWFkIG1vZGlmeSB0aGUgbmFtZXMgaW4KKyAgTUVUQS9hYl9wYXJ0aXRpb25zLnR4dCwgYmVjYXVzZSB0aGVyZSBhcmUgbm8gbWF0Y2hpbmcgcGFydGl0aW9ucyBvbiBkZXZpY2UuCiAKLSAgdGFyZ2V0X2ZwID0gQ2FsY3VsYXRlRmluZ2VycHJpbnQob2VtX3Byb3BzLCBvZW1fZGljdHMgYW5kIG9lbV9kaWN0c1swXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BUSU9OUy5pbmZvX2RpY3QpCi0gIG1ldGFkYXRhID0gewotICAgICAgInBvc3QtYnVpbGQiOiB0YXJnZXRfZnAsCi0gICAgICAicHJlLWRldmljZSI6IEdldE9lbVByb3BlcnR5KCJyby5wcm9kdWN0LmRldmljZSIsIG9lbV9wcm9wcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2VtX2RpY3RzIGFuZCBvZW1fZGljdHNbMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QVElPTlMuaW5mb19kaWN0KSwKLSAgICAgICJwb3N0LXRpbWVzdGFtcCI6IEdldEJ1aWxkUHJvcCgicm8uYnVpbGQuZGF0ZS51dGMiLCBPUFRJT05TLmluZm9fZGljdCksCi0gIH0KKyAgRm9yIHRoZSBwYXJ0aXRpb25zIHRoYXQgZG9uJ3QgaGF2ZSBzZWNvbmRhcnkgaW1hZ2VzLCB0aGUgb25lcyBmb3IgcHJpbWFyeQorICBzbG90IHdpbGwgYmUgdXNlZC4gVGhpcyBpcyB0byBlbnN1cmUgdGhhdCB3ZSBhbHdheXMgaGF2ZSB2YWxpZCBib290LCB2Ym1ldGEsCisgIGJvb3Rsb2FkZXIgaW1hZ2VzIGluIHRoZSBpbmFjdGl2ZSBzbG90LgogCi0gIGRldmljZV9zcGVjaWZpYyA9IGNvbW1vbi5EZXZpY2VTcGVjaWZpY1BhcmFtcygKLSAgICAgIGlucHV0X3ppcD1pbnB1dF96aXAsCi0gICAgICBpbnB1dF92ZXJzaW9uPU9QVElPTlMuaW5mb19kaWN0WyJyZWNvdmVyeV9hcGlfdmVyc2lvbiJdLAotICAgICAgb3V0cHV0X3ppcD1vdXRwdXRfemlwLAotICAgICAgc2NyaXB0PXNjcmlwdCwKLSAgICAgIGlucHV0X3RtcD1PUFRJT05TLmlucHV0X3RtcCwKLSAgICAgIG1ldGFkYXRhPW1ldGFkYXRhLAotICAgICAgaW5mb19kaWN0PU9QVElPTlMuaW5mb19kaWN0KQorICBBcmdzOgorICAgIGlucHV0X2ZpbGU6IFRoZSBpbnB1dCB0YXJnZXQtZmlsZXMuemlwIGZpbGUuCisgICAgc2tpcF9wb3N0aW5zdGFsbDogV2hldGhlciB0byBza2lwIGNvcHlpbmcgdGhlIHBvc3RpbnN0YWxsIGNvbmZpZyBmaWxlLgogCi0gIEFwcGVuZEFzc2VydGlvbnMoc2NyaXB0LCBPUFRJT05TLmluZm9fZGljdCwgb2VtX2RpY3RzKQorICBSZXR1cm5zOgorICAgIFRoZSBmaWxlbmFtZSBvZiB0aGUgdGFyZ2V0LWZpbGVzLnppcCBmb3IgZ2VuZXJhdGluZyBzZWNvbmRhcnkgcGF5bG9hZC4KKyAgIiIiCisgIHRhcmdldF9maWxlID0gY29tbW9uLk1ha2VUZW1wRmlsZShwcmVmaXg9InRhcmdldGZpbGVzLSIsIHN1ZmZpeD0iLnppcCIpCisgIHRhcmdldF96aXAgPSB6aXBmaWxlLlppcEZpbGUodGFyZ2V0X2ZpbGUsICd3JywgYWxsb3daaXA2ND1UcnVlKQogCi0gIHNjcmlwdC5QcmludCgiVmVyaWZ5aW5nIGRldmljZSBpbWFnZXMgYWdhaW5zdCAlcy4uLiIgJSB0YXJnZXRfZnApCi0gIHNjcmlwdC5BcHBlbmRFeHRyYSgiIikKKyAgaW5wdXRfdG1wID0gY29tbW9uLlVuemlwVGVtcChpbnB1dF9maWxlLCBVTlpJUF9QQVRURVJOKQorICB3aXRoIHppcGZpbGUuWmlwRmlsZShpbnB1dF9maWxlLCAncicpIGFzIGlucHV0X3ppcDoKKyAgICBpbmZvbGlzdCA9IGlucHV0X3ppcC5pbmZvbGlzdCgpCiAKLSAgc2NyaXB0LlByaW50KCJWZXJpZnlpbmcgYm9vdC4uLiIpCi0gIGJvb3RfaW1nID0gY29tbW9uLkdldEJvb3RhYmxlSW1hZ2UoCi0gICAgICAiYm9vdC5pbWciLCAiYm9vdC5pbWciLCBPUFRJT05TLmlucHV0X3RtcCwgIkJPT1QiKQotICBib290X3R5cGUsIGJvb3RfZGV2aWNlID0gY29tbW9uLkdldFR5cGVBbmREZXZpY2UoCi0gICAgICAiL2Jvb3QiLCBPUFRJT05TLmluZm9fZGljdCkKLSAgc2NyaXB0LlZlcmlmeSgiJXM6JXM6JWQ6JXMiICUgKAotICAgICAgYm9vdF90eXBlLCBib290X2RldmljZSwgYm9vdF9pbWcuc2l6ZSwgYm9vdF9pbWcuc2hhMSkpCi0gIHNjcmlwdC5BcHBlbmRFeHRyYSgiIikKKyAgZm9yIGluZm8gaW4gaW5mb2xpc3Q6CisgICAgdW56aXBwZWRfZmlsZSA9IG9zLnBhdGguam9pbihpbnB1dF90bXAsICppbmZvLmZpbGVuYW1lLnNwbGl0KCcvJykpCisgICAgaWYgaW5mby5maWxlbmFtZSA9PSAnSU1BR0VTL3N5c3RlbV9vdGhlci5pbWcnOgorICAgICAgY29tbW9uLlppcFdyaXRlKHRhcmdldF96aXAsIHVuemlwcGVkX2ZpbGUsIGFyY25hbWU9J0lNQUdFUy9zeXN0ZW0uaW1nJykKIAotICBzY3JpcHQuUHJpbnQoIlZlcmlmeWluZyByZWNvdmVyeS4uLiIpCi0gIHJlY292ZXJ5X2ltZyA9IGNvbW1vbi5HZXRCb290YWJsZUltYWdlKAotICAgICAgInJlY292ZXJ5LmltZyIsICJyZWNvdmVyeS5pbWciLCBPUFRJT05TLmlucHV0X3RtcCwgIlJFQ09WRVJZIikKLSAgcmVjb3ZlcnlfdHlwZSwgcmVjb3ZlcnlfZGV2aWNlID0gY29tbW9uLkdldFR5cGVBbmREZXZpY2UoCi0gICAgICAiL3JlY292ZXJ5IiwgT1BUSU9OUy5pbmZvX2RpY3QpCi0gIHNjcmlwdC5WZXJpZnkoIiVzOiVzOiVkOiVzIiAlICgKLSAgICAgIHJlY292ZXJ5X3R5cGUsIHJlY292ZXJ5X2RldmljZSwgcmVjb3ZlcnlfaW1nLnNpemUsIHJlY292ZXJ5X2ltZy5zaGExKSkKLSAgc2NyaXB0LkFwcGVuZEV4dHJhKCIiKQorICAgICMgUHJpbWFyeSBpbWFnZXMgYW5kIGZyaWVuZHMgbmVlZCB0byBiZSBza2lwcGVkIGV4cGxpY2l0bHkuCisgICAgZWxpZiBpbmZvLmZpbGVuYW1lIGluICgnSU1BR0VTL3N5c3RlbS5pbWcnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0lNQUdFUy9zeXN0ZW0ubWFwJyk6CisgICAgICBwYXNzCiAKLSAgc3lzdGVtX3RndCA9IEdldEltYWdlKCJzeXN0ZW0iLCBPUFRJT05TLmlucHV0X3RtcCkKLSAgc3lzdGVtX3RndC5SZXNldEZpbGVNYXAoKQotICBzeXN0ZW1fZGlmZiA9IGNvbW1vbi5CbG9ja0RpZmZlcmVuY2UoInN5c3RlbSIsIHN5c3RlbV90Z3QsIHNyYz1Ob25lKQotICBzeXN0ZW1fZGlmZi5Xcml0ZVN0cmljdFZlcmlmeVNjcmlwdChzY3JpcHQpCisgICAgIyBTa2lwIGNvcHlpbmcgdGhlIHBvc3RpbnN0YWxsIGNvbmZpZyBpZiByZXF1ZXN0ZWQuCisgICAgZWxpZiBza2lwX3Bvc3RpbnN0YWxsIGFuZCBpbmZvLmZpbGVuYW1lID09IFBPU1RJTlNUQUxMX0NPTkZJRzoKKyAgICAgIHBhc3MKIAotICBpZiBIYXNWZW5kb3JQYXJ0aXRpb24oaW5wdXRfemlwKToKLSAgICB2ZW5kb3JfdGd0ID0gR2V0SW1hZ2UoInZlbmRvciIsIE9QVElPTlMuaW5wdXRfdG1wKQotICAgIHZlbmRvcl90Z3QuUmVzZXRGaWxlTWFwKCkKLSAgICB2ZW5kb3JfZGlmZiA9IGNvbW1vbi5CbG9ja0RpZmZlcmVuY2UoInZlbmRvciIsIHZlbmRvcl90Z3QsIHNyYz1Ob25lKQotICAgIHZlbmRvcl9kaWZmLldyaXRlU3RyaWN0VmVyaWZ5U2NyaXB0KHNjcmlwdCkKKyAgICBlbGlmIGluZm8uZmlsZW5hbWUuc3RhcnRzd2l0aCgoJ01FVEEvJywgJ0lNQUdFUy8nKSk6CisgICAgICBjb21tb24uWmlwV3JpdGUodGFyZ2V0X3ppcCwgdW56aXBwZWRfZmlsZSwgYXJjbmFtZT1pbmZvLmZpbGVuYW1lKQogCi0gICMgRGV2aWNlIHNwZWNpZmljIHBhcnRpdGlvbnMsIHN1Y2ggYXMgcmFkaW8sIGJvb3Rsb2FkZXIgYW5kIGV0Yy4KLSAgZGV2aWNlX3NwZWNpZmljLlZlcmlmeU9UQV9Bc3NlcnRpb25zKCkKKyAgY29tbW9uLlppcENsb3NlKHRhcmdldF96aXApCiAKLSAgc2NyaXB0LlNldFByb2dyZXNzKDEuMCkKLSAgc2NyaXB0LkFkZFRvWmlwKGlucHV0X3ppcCwgb3V0cHV0X3ppcCwgaW5wdXRfcGF0aD1PUFRJT05TLnVwZGF0ZXJfYmluYXJ5KQotICBtZXRhZGF0YVsib3RhLXJlcXVpcmVkLWNhY2hlIl0gPSBzdHIoc2NyaXB0LnJlcXVpcmVkX2NhY2hlKQotICBXcml0ZU1ldGFkYXRhKG1ldGFkYXRhLCBvdXRwdXRfemlwKQorICByZXR1cm4gdGFyZ2V0X2ZpbGUKKworCitkZWYgR2V0VGFyZ2V0RmlsZXNaaXBXaXRob3V0UG9zdGluc3RhbGxDb25maWcoaW5wdXRfZmlsZSk6CisgICIiIlJldHVybnMgYSB0YXJnZXQtZmlsZXMuemlwIHRoYXQncyBub3QgY29udGFpbmluZyBwb3N0aW5zdGFsbF9jb25maWcudHh0LgorCisgIFRoaXMgYWxsb3dzIGJyaWxsb191cGRhdGVfcGF5bG9hZCBzY3JpcHQgdG8gc2tpcCB3cml0aW5nIGFsbCB0aGUgcG9zdGluc3RhbGwKKyAgaG9va3MgaW4gdGhlIGdlbmVyYXRlZCBwYXlsb2FkLiBUaGUgaW5wdXQgdGFyZ2V0LWZpbGVzLnppcCBmaWxlIHdpbGwgYmUKKyAgZHVwbGljYXRlZCwgd2l0aCAnTUVUQS9wb3N0aW5zdGFsbF9jb25maWcudHh0JyBza2lwcGVkLiBJZiBpbnB1dF9maWxlIGRvZXNuJ3QKKyAgY29udGFpbiB0aGUgcG9zdGluc3RhbGxfY29uZmlnLnR4dCBlbnRyeSwgdGhlIGlucHV0IGZpbGUgd2lsbCBiZSByZXR1cm5lZC4KKworICBBcmdzOgorICAgIGlucHV0X2ZpbGU6IFRoZSBpbnB1dCB0YXJnZXQtZmlsZXMuemlwIGZpbGVuYW1lLgorCisgIFJldHVybnM6CisgICAgVGhlIGZpbGVuYW1lIG9mIHRhcmdldC1maWxlcy56aXAgdGhhdCBkb2Vzbid0IGNvbnRhaW4gcG9zdGluc3RhbGwgY29uZmlnLgorICAiIiIKKyAgIyBXZSBzaG91bGQgb25seSBtYWtlIGEgY29weSBpZiBwb3N0aW5zdGFsbF9jb25maWcgZW50cnkgZXhpc3RzLgorICB3aXRoIHppcGZpbGUuWmlwRmlsZShpbnB1dF9maWxlLCAncicpIGFzIGlucHV0X3ppcDoKKyAgICBpZiBQT1NUSU5TVEFMTF9DT05GSUcgbm90IGluIGlucHV0X3ppcC5uYW1lbGlzdCgpOgorICAgICAgcmV0dXJuIGlucHV0X2ZpbGUKKworICB0YXJnZXRfZmlsZSA9IGNvbW1vbi5NYWtlVGVtcEZpbGUocHJlZml4PSJ0YXJnZXRmaWxlcy0iLCBzdWZmaXg9Ii56aXAiKQorICBzaHV0aWwuY29weWZpbGUoaW5wdXRfZmlsZSwgdGFyZ2V0X2ZpbGUpCisgIGNvbW1vbi5aaXBEZWxldGUodGFyZ2V0X2ZpbGUsIFBPU1RJTlNUQUxMX0NPTkZJRykKKyAgcmV0dXJuIHRhcmdldF9maWxlCiAKIAogZGVmIFdyaXRlQUJPVEFQYWNrYWdlV2l0aEJyaWxsb1NjcmlwdCh0YXJnZXRfZmlsZSwgb3V0cHV0X2ZpbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZV9maWxlPU5vbmUpOgotICAiIiJHZW5lcmF0ZSBhbiBBbmRyb2lkIE9UQSBwYWNrYWdlIHRoYXQgaGFzIEEvQiB1cGRhdGUgcGF5bG9hZC4iIiIKLQotICBkZWYgQ29tcHV0ZVN0cmVhbWluZ01ldGFkYXRhKHppcF9maWxlLCByZXNlcnZlX3NwYWNlPUZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkX2xlbmd0aD1Ob25lKToKLSAgICAiIiJDb21wdXRlIHRoZSBzdHJlYW1pbmcgbWV0YWRhdGEgZm9yIGEgZ2l2ZW4gemlwLgotCi0gICAgV2hlbiAncmVzZXJ2ZV9zcGFjZScgaXMgVHJ1ZSwgd2UgcmVzZXJ2ZSBleHRyYSBzcGFjZSBmb3IgdGhlIG9mZnNldCBhbmQKLSAgICBsZW5ndGggb2YgdGhlIG1ldGFkYXRhIGVudHJ5IGl0c2VsZiwgYWx0aG91Z2ggd2UgZG9uJ3Qga25vdyB0aGUgZmluYWwKLSAgICB2YWx1ZXMgdW50aWwgdGhlIHBhY2thZ2UgZ2V0cyBzaWduZWQuIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgYWdhaW4KLSAgICBhZnRlciBzaWduaW5nLiBXZSB0aGVuIHdyaXRlIHRoZSBhY3R1YWwgdmFsdWVzIGFuZCBwYWQgdGhlIHN0cmluZyB0byB0aGUKLSAgICBsZW5ndGggd2Ugc2V0IGVhcmxpZXIuIE5vdGUgdGhhdCB3ZSBjYW4ndCB1c2UgdGhlIGFjdHVhbCBsZW5ndGggb2YgdGhlCi0gICAgbWV0YWRhdGEgZW50cnkgaW4gdGhlIHNlY29uZCBydW4uIE90aGVyd2lzZSB0aGUgb2Zmc2V0cyBmb3Igb3RoZXIgZW50cmllcwotICAgIHdpbGwgYmUgY2hhbmdpbmcgYWdhaW4uCi0gICAgIiIiCi0KLSAgICBkZWYgQ29tcHV0ZUVudHJ5T2Zmc2V0U2l6ZShuYW1lKToKLSAgICAgICIiIkNvbXB1dGUgdGhlIHppcCBlbnRyeSBvZmZzZXQgYW5kIHNpemUuIiIiCi0gICAgICBpbmZvID0gemlwX2ZpbGUuZ2V0aW5mbyhuYW1lKQotICAgICAgb2Zmc2V0ID0gaW5mby5oZWFkZXJfb2Zmc2V0ICsgbGVuKGluZm8uRmlsZUhlYWRlcigpKQotICAgICAgc2l6ZSA9IGluZm8uZmlsZV9zaXplCi0gICAgICByZXR1cm4gJyVzOiVkOiVkJyAlIChvcy5wYXRoLmJhc2VuYW1lKG5hbWUpLCBvZmZzZXQsIHNpemUpCi0KLSAgICAjIHBheWxvYWQuYmluIGFuZCBwYXlsb2FkX3Byb3BlcnRpZXMudHh0IG11c3QgZXhpc3QuCi0gICAgb2Zmc2V0cyA9IFtDb21wdXRlRW50cnlPZmZzZXRTaXplKCdwYXlsb2FkLmJpbicpLAotICAgICAgICAgICAgICAgQ29tcHV0ZUVudHJ5T2Zmc2V0U2l6ZSgncGF5bG9hZF9wcm9wZXJ0aWVzLnR4dCcpXQotCi0gICAgIyBjYXJlX21hcC50eHQgaXMgYXZhaWxhYmxlIG9ubHkgaWYgZG0tdmVyaXR5IGlzIGVuYWJsZWQuCi0gICAgaWYgJ2NhcmVfbWFwLnR4dCcgaW4gemlwX2ZpbGUubmFtZWxpc3QoKToKLSAgICAgIG9mZnNldHMuYXBwZW5kKENvbXB1dGVFbnRyeU9mZnNldFNpemUoJ2NhcmVfbWFwLnR4dCcpKQotCi0gICAgaWYgJ2NvbXBhdGliaWxpdHkuemlwJyBpbiB6aXBfZmlsZS5uYW1lbGlzdCgpOgotICAgICAgb2Zmc2V0cy5hcHBlbmQoQ29tcHV0ZUVudHJ5T2Zmc2V0U2l6ZSgnY29tcGF0aWJpbGl0eS56aXAnKSkKLQotICAgICMgJ01FVEEtSU5GL2NvbS9hbmRyb2lkL21ldGFkYXRhJyBpcyByZXF1aXJlZC4gV2UgZG9uJ3Qga25vdyBpdHMgYWN0dWFsCi0gICAgIyBvZmZzZXQgYW5kIGxlbmd0aCAoYXMgd2VsbCBhcyB0aGUgdmFsdWVzIGZvciBvdGhlciBlbnRyaWVzKS4gU28gd2UKLSAgICAjIHJlc2VydmUgMTAtYnl0ZSBhcyBhIHBsYWNlaG9sZGVyLCB3aGljaCBpcyB0byBjb3ZlciB0aGUgc3BhY2UgZm9yIG1ldGFkYXRhCi0gICAgIyBlbnRyeSAoJ3h4Onh4eCcsIHNpbmNlIGl0J3MgWklQX1NUT1JFRCB3aGljaCBzaG91bGQgYXBwZWFyIGF0IHRoZQotICAgICMgYmVnaW5uaW5nIG9mIHRoZSB6aXApLCBhcyB3ZWxsIGFzIHRoZSBwb3NzaWJsZSB2YWx1ZSBjaGFuZ2VzIGluIG90aGVyCi0gICAgIyBlbnRyaWVzLgotICAgIGlmIHJlc2VydmVfc3BhY2U6Ci0gICAgICBvZmZzZXRzLmFwcGVuZCgnbWV0YWRhdGE6JyArICcgJyAqIDEwKQotICAgIGVsc2U6Ci0gICAgICBvZmZzZXRzLmFwcGVuZChDb21wdXRlRW50cnlPZmZzZXRTaXplKE1FVEFEQVRBX05BTUUpKQotCi0gICAgdmFsdWUgPSAnLCcuam9pbihvZmZzZXRzKQotICAgIGlmIGV4cGVjdGVkX2xlbmd0aCBpcyBub3QgTm9uZToKLSAgICAgIGFzc2VydCBsZW4odmFsdWUpIDw9IGV4cGVjdGVkX2xlbmd0aCwgXAotICAgICAgICAgICdJbnN1ZmZpY2llbnQgcmVzZXJ2ZWQgc3BhY2U6IHJlc2VydmVkPSVkLCBhY3R1YWw9JWQnICUgKAotICAgICAgICAgICAgICBleHBlY3RlZF9sZW5ndGgsIGxlbih2YWx1ZSkpCi0gICAgICB2YWx1ZSArPSAnICcgKiAoZXhwZWN0ZWRfbGVuZ3RoIC0gbGVuKHZhbHVlKSkKLSAgICByZXR1cm4gdmFsdWUKLQotICAjIFRoZSBwbGFjZSB3aGVyZSB0aGUgb3V0cHV0IGZyb20gdGhlIHN1YnByb2Nlc3Mgc2hvdWxkIGdvLgotICBsb2dfZmlsZSA9IHN5cy5zdGRvdXQgaWYgT1BUSU9OUy52ZXJib3NlIGVsc2Ugc3VicHJvY2Vzcy5QSVBFCi0KLSAgIyBBL0IgdXBkYXRlciBleHBlY3RzIGEgc2lnbmluZyBrZXkgaW4gUlNBIGZvcm1hdC4gR2V0cyB0aGUga2V5IHJlYWR5IGZvcgotICAjIGxhdGVyIHVzZSBpbiBzdGVwIDMsIHVubGVzcyBhIHBheWxvYWRfc2lnbmVyIGhhcyBiZWVuIHNwZWNpZmllZC4KLSAgaWYgT1BUSU9OUy5wYXlsb2FkX3NpZ25lciBpcyBOb25lOgotICAgIGNtZCA9IFsib3BlbnNzbCIsICJwa2NzOCIsCi0gICAgICAgICAgICItaW4iLCBPUFRJT05TLnBhY2thZ2Vfa2V5ICsgT1BUSU9OUy5wcml2YXRlX2tleV9zdWZmaXgsCi0gICAgICAgICAgICItaW5mb3JtIiwgIkRFUiJdCi0gICAgcHcgPSBPUFRJT05TLmtleV9wYXNzd29yZHNbT1BUSU9OUy5wYWNrYWdlX2tleV0KLSAgICBjbWQuZXh0ZW5kKFsiLXBhc3NpbiIsICJwYXNzOiIgKyBwd10gaWYgcHcgZWxzZSBbIi1ub2NyeXB0Il0pCi0gICAgcnNhX2tleSA9IGNvbW1vbi5NYWtlVGVtcEZpbGUocHJlZml4PSJrZXktIiwgc3VmZml4PSIua2V5IikKLSAgICBjbWQuZXh0ZW5kKFsiLW91dCIsIHJzYV9rZXldKQotICAgIHAxID0gY29tbW9uLlJ1bihjbWQsIHZlcmJvc2U9RmFsc2UsIHN0ZG91dD1sb2dfZmlsZSwgc3RkZXJyPXN1YnByb2Nlc3MuU1RET1VUKQotICAgIHAxLmNvbW11bmljYXRlKCkKLSAgICBhc3NlcnQgcDEucmV0dXJuY29kZSA9PSAwLCAib3BlbnNzbCBwa2NzOCBmYWlsZWQiCi0KKyAgIiIiR2VuZXJhdGVzIGFuIEFuZHJvaWQgT1RBIHBhY2thZ2UgdGhhdCBoYXMgQS9CIHVwZGF0ZSBwYXlsb2FkLiIiIgogICAjIFN0YWdlIHRoZSBvdXRwdXQgemlwIHBhY2thZ2UgZm9yIHBhY2thZ2Ugc2lnbmluZy4KLSAgdGVtcF96aXBfZmlsZSA9IHRlbXBmaWxlLk5hbWVkVGVtcG9yYXJ5RmlsZSgpCi0gIG91dHB1dF96aXAgPSB6aXBmaWxlLlppcEZpbGUodGVtcF96aXBfZmlsZSwgInciLAorICBpZiBub3QgT1BUSU9OUy5ub19zaWduaW5nOgorICAgIHN0YWdpbmdfZmlsZSA9IGNvbW1vbi5NYWtlVGVtcEZpbGUoc3VmZml4PScuemlwJykKKyAgZWxzZToKKyAgICBzdGFnaW5nX2ZpbGUgPSBvdXRwdXRfZmlsZQorICBvdXRwdXRfemlwID0gemlwZmlsZS5aaXBGaWxlKHN0YWdpbmdfZmlsZSwgInciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzaW9uPXppcGZpbGUuWklQX0RFRkxBVEVEKQogCi0gICMgTWV0YWRhdGEgdG8gY29tcGx5IHdpdGggQW5kcm9pZCBPVEEgcGFja2FnZSBmb3JtYXQuCi0gIG9lbV9wcm9wcyA9IE9QVElPTlMuaW5mb19kaWN0LmdldCgib2VtX2ZpbmdlcnByaW50X3Byb3BlcnRpZXMiLCBOb25lKQotICBvZW1fZGljdHMgPSBOb25lCi0gIGlmIG9lbV9wcm9wczoKLSAgICBvZW1fZGljdHMgPSBfTG9hZE9lbURpY3RzKE5vbmUpCi0KLSAgbWV0YWRhdGEgPSB7Ci0gICAgICAicG9zdC1idWlsZCI6IENhbGN1bGF0ZUZpbmdlcnByaW50KG9lbV9wcm9wcywgb2VtX2RpY3RzIGFuZCBvZW1fZGljdHNbMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QVElPTlMuaW5mb19kaWN0KSwKLSAgICAgICJwb3N0LWJ1aWxkLWluY3JlbWVudGFsIiA6IEdldEJ1aWxkUHJvcCgicm8uYnVpbGQudmVyc2lvbi5pbmNyZW1lbnRhbCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BUSU9OUy5pbmZvX2RpY3QpLAotICAgICAgInByZS1kZXZpY2UiOiBHZXRPZW1Qcm9wZXJ0eSgicm8ucHJvZHVjdC5kZXZpY2UiLCBvZW1fcHJvcHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9lbV9kaWN0cyBhbmQgb2VtX2RpY3RzWzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUFRJT05TLmluZm9fZGljdCksCi0gICAgICAib3RhLXJlcXVpcmVkLWNhY2hlIjogIjAiLAotICAgICAgIm90YS10eXBlIjogIkFCIiwKLSAgfQotCiAgIGlmIHNvdXJjZV9maWxlIGlzIG5vdCBOb25lOgotICAgIG1ldGFkYXRhWyJwcmUtYnVpbGQiXSA9IENhbGN1bGF0ZUZpbmdlcnByaW50KG9lbV9wcm9wcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZW1fZGljdHMgYW5kIG9lbV9kaWN0c1swXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUFRJT05TLnNvdXJjZV9pbmZvX2RpY3QpCi0gICAgbWV0YWRhdGFbInByZS1idWlsZC1pbmNyZW1lbnRhbCJdID0gR2V0QnVpbGRQcm9wKAotICAgICAgICAicm8uYnVpbGQudmVyc2lvbi5pbmNyZW1lbnRhbCIsIE9QVElPTlMuc291cmNlX2luZm9fZGljdCkKLQotICAgIEhhbmRsZURvd25ncmFkZU1ldGFkYXRhKG1ldGFkYXRhKQorICAgIHRhcmdldF9pbmZvID0gQnVpbGRJbmZvKE9QVElPTlMudGFyZ2V0X2luZm9fZGljdCwgT1BUSU9OUy5vZW1fZGljdHMpCisgICAgc291cmNlX2luZm8gPSBCdWlsZEluZm8oT1BUSU9OUy5zb3VyY2VfaW5mb19kaWN0LCBPUFRJT05TLm9lbV9kaWN0cykKICAgZWxzZToKLSAgICBtZXRhZGF0YVsicG9zdC10aW1lc3RhbXAiXSA9IEdldEJ1aWxkUHJvcCgKLSAgICAgICAgInJvLmJ1aWxkLmRhdGUudXRjIiwgT1BUSU9OUy5pbmZvX2RpY3QpCisgICAgdGFyZ2V0X2luZm8gPSBCdWlsZEluZm8oT1BUSU9OUy5pbmZvX2RpY3QsIE9QVElPTlMub2VtX2RpY3RzKQorICAgIHNvdXJjZV9pbmZvID0gTm9uZQogCi0gICMgMS4gR2VuZXJhdGUgcGF5bG9hZC4KLSAgcGF5bG9hZF9maWxlID0gY29tbW9uLk1ha2VUZW1wRmlsZShwcmVmaXg9InBheWxvYWQtIiwgc3VmZml4PSIuYmluIikKLSAgY21kID0gWyJicmlsbG9fdXBkYXRlX3BheWxvYWQiLCAiZ2VuZXJhdGUiLAotICAgICAgICAgIi0tcGF5bG9hZCIsIHBheWxvYWRfZmlsZSwKLSAgICAgICAgICItLXRhcmdldF9pbWFnZSIsIHRhcmdldF9maWxlXQotICBpZiBzb3VyY2VfZmlsZSBpcyBub3QgTm9uZToKLSAgICBjbWQuZXh0ZW5kKFsiLS1zb3VyY2VfaW1hZ2UiLCBzb3VyY2VfZmlsZV0pCisgICMgTWV0YWRhdGEgdG8gY29tcGx5IHdpdGggQW5kcm9pZCBPVEEgcGFja2FnZSBmb3JtYXQuCisgIG1ldGFkYXRhID0gR2V0UGFja2FnZU1ldGFkYXRhKHRhcmdldF9pbmZvLCBzb3VyY2VfaW5mbykKKworICBpZiBPUFRJT05TLnNraXBfcG9zdGluc3RhbGw6CisgICAgdGFyZ2V0X2ZpbGUgPSBHZXRUYXJnZXRGaWxlc1ppcFdpdGhvdXRQb3N0aW5zdGFsbENvbmZpZyh0YXJnZXRfZmlsZSkKKworICAjIEdlbmVyYXRlIHBheWxvYWQuCisgIHBheWxvYWQgPSBQYXlsb2FkKCkKKworICAjIEVuZm9yY2UgYSBtYXggdGltZXN0YW1wIHRoaXMgcGF5bG9hZCBjYW4gYmUgYXBwbGllZCBvbiB0b3Agb2YuCiAgIGlmIE9QVElPTlMuZG93bmdyYWRlOgotICAgIG1heF90aW1lc3RhbXAgPSBHZXRCdWlsZFByb3AoInJvLmJ1aWxkLmRhdGUudXRjIiwgT1BUSU9OUy5zb3VyY2VfaW5mb19kaWN0KQorICAgIG1heF90aW1lc3RhbXAgPSBzb3VyY2VfaW5mby5HZXRCdWlsZFByb3AoInJvLmJ1aWxkLmRhdGUudXRjIikKICAgZWxzZToKICAgICBtYXhfdGltZXN0YW1wID0gbWV0YWRhdGFbInBvc3QtdGltZXN0YW1wIl0KLSAgY21kLmV4dGVuZChbIi0tbWF4X3RpbWVzdGFtcCIsIG1heF90aW1lc3RhbXBdKQotICBwMSA9IGNvbW1vbi5SdW4oY21kLCBzdGRvdXQ9bG9nX2ZpbGUsIHN0ZGVycj1zdWJwcm9jZXNzLlNURE9VVCkKLSAgcDEuY29tbXVuaWNhdGUoKQotICBhc3NlcnQgcDEucmV0dXJuY29kZSA9PSAwLCAiYnJpbGxvX3VwZGF0ZV9wYXlsb2FkIGdlbmVyYXRlIGZhaWxlZCIKKyAgYWRkaXRpb25hbF9hcmdzID0gWyItLW1heF90aW1lc3RhbXAiLCBtYXhfdGltZXN0YW1wXQogCi0gICMgMi4gR2VuZXJhdGUgaGFzaGVzIG9mIHRoZSBwYXlsb2FkIGFuZCBtZXRhZGF0YSBmaWxlcy4KLSAgcGF5bG9hZF9zaWdfZmlsZSA9IGNvbW1vbi5NYWtlVGVtcEZpbGUocHJlZml4PSJzaWctIiwgc3VmZml4PSIuYmluIikKLSAgbWV0YWRhdGFfc2lnX2ZpbGUgPSBjb21tb24uTWFrZVRlbXBGaWxlKHByZWZpeD0ic2lnLSIsIHN1ZmZpeD0iLmJpbiIpCi0gIGNtZCA9IFsiYnJpbGxvX3VwZGF0ZV9wYXlsb2FkIiwgImhhc2giLAotICAgICAgICAgIi0tdW5zaWduZWRfcGF5bG9hZCIsIHBheWxvYWRfZmlsZSwKLSAgICAgICAgICItLXNpZ25hdHVyZV9zaXplIiwgIjI1NiIsCi0gICAgICAgICAiLS1tZXRhZGF0YV9oYXNoX2ZpbGUiLCBtZXRhZGF0YV9zaWdfZmlsZSwKLSAgICAgICAgICItLXBheWxvYWRfaGFzaF9maWxlIiwgcGF5bG9hZF9zaWdfZmlsZV0KLSAgcDEgPSBjb21tb24uUnVuKGNtZCwgc3Rkb3V0PWxvZ19maWxlLCBzdGRlcnI9c3VicHJvY2Vzcy5TVERPVVQpCi0gIHAxLmNvbW11bmljYXRlKCkKLSAgYXNzZXJ0IHAxLnJldHVybmNvZGUgPT0gMCwgImJyaWxsb191cGRhdGVfcGF5bG9hZCBoYXNoIGZhaWxlZCIKKyAgcGF5bG9hZC5HZW5lcmF0ZSh0YXJnZXRfZmlsZSwgc291cmNlX2ZpbGUsIGFkZGl0aW9uYWxfYXJncykKIAotICAjIDMuIFNpZ24gdGhlIGhhc2hlcyBhbmQgaW5zZXJ0IHRoZW0gYmFjayBpbnRvIHRoZSBwYXlsb2FkIGZpbGUuCi0gIHNpZ25lZF9wYXlsb2FkX3NpZ19maWxlID0gY29tbW9uLk1ha2VUZW1wRmlsZShwcmVmaXg9InNpZ25lZC1zaWctIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1ZmZpeD0iLmJpbiIpCi0gIHNpZ25lZF9tZXRhZGF0YV9zaWdfZmlsZSA9IGNvbW1vbi5NYWtlVGVtcEZpbGUocHJlZml4PSJzaWduZWQtc2lnLSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VmZml4PSIuYmluIikKLSAgIyAzYS4gU2lnbiB0aGUgcGF5bG9hZCBoYXNoLgotICBpZiBPUFRJT05TLnBheWxvYWRfc2lnbmVyIGlzIG5vdCBOb25lOgotICAgIGNtZCA9IFtPUFRJT05TLnBheWxvYWRfc2lnbmVyXQotICAgIGNtZC5leHRlbmQoT1BUSU9OUy5wYXlsb2FkX3NpZ25lcl9hcmdzKQotICBlbHNlOgotICAgIGNtZCA9IFsib3BlbnNzbCIsICJwa2V5dXRsIiwgIi1zaWduIiwKLSAgICAgICAgICAgIi1pbmtleSIsIHJzYV9rZXksCi0gICAgICAgICAgICItcGtleW9wdCIsICJkaWdlc3Q6c2hhMjU2Il0KLSAgY21kLmV4dGVuZChbIi1pbiIsIHBheWxvYWRfc2lnX2ZpbGUsCi0gICAgICAgICAgICAgICItb3V0Iiwgc2lnbmVkX3BheWxvYWRfc2lnX2ZpbGVdKQotICBwMSA9IGNvbW1vbi5SdW4oY21kLCBzdGRvdXQ9bG9nX2ZpbGUsIHN0ZGVycj1zdWJwcm9jZXNzLlNURE9VVCkKLSAgcDEuY29tbXVuaWNhdGUoKQotICBhc3NlcnQgcDEucmV0dXJuY29kZSA9PSAwLCAib3BlbnNzbCBzaWduIHBheWxvYWQgZmFpbGVkIgorICAjIFNpZ24gdGhlIHBheWxvYWQuCisgIHBheWxvYWRfc2lnbmVyID0gUGF5bG9hZFNpZ25lcigpCisgIHBheWxvYWQuU2lnbihwYXlsb2FkX3NpZ25lcikKIAotICAjIDNiLiBTaWduIHRoZSBtZXRhZGF0YSBoYXNoLgotICBpZiBPUFRJT05TLnBheWxvYWRfc2lnbmVyIGlzIG5vdCBOb25lOgotICAgIGNtZCA9IFtPUFRJT05TLnBheWxvYWRfc2lnbmVyXQotICAgIGNtZC5leHRlbmQoT1BUSU9OUy5wYXlsb2FkX3NpZ25lcl9hcmdzKQotICBlbHNlOgotICAgIGNtZCA9IFsib3BlbnNzbCIsICJwa2V5dXRsIiwgIi1zaWduIiwKLSAgICAgICAgICAgIi1pbmtleSIsIHJzYV9rZXksCi0gICAgICAgICAgICItcGtleW9wdCIsICJkaWdlc3Q6c2hhMjU2Il0KLSAgY21kLmV4dGVuZChbIi1pbiIsIG1ldGFkYXRhX3NpZ19maWxlLAotICAgICAgICAgICAgICAiLW91dCIsIHNpZ25lZF9tZXRhZGF0YV9zaWdfZmlsZV0pCi0gIHAxID0gY29tbW9uLlJ1bihjbWQsIHN0ZG91dD1sb2dfZmlsZSwgc3RkZXJyPXN1YnByb2Nlc3MuU1RET1VUKQotICBwMS5jb21tdW5pY2F0ZSgpCi0gIGFzc2VydCBwMS5yZXR1cm5jb2RlID09IDAsICJvcGVuc3NsIHNpZ24gbWV0YWRhdGEgZmFpbGVkIgorICAjIFdyaXRlIHRoZSBwYXlsb2FkIGludG8gb3V0cHV0IHppcC4KKyAgcGF5bG9hZC5Xcml0ZVRvWmlwKG91dHB1dF96aXApCiAKLSAgIyAzYy4gSW5zZXJ0IHRoZSBzaWduYXR1cmVzIGJhY2sgaW50byB0aGUgcGF5bG9hZCBmaWxlLgotICBzaWduZWRfcGF5bG9hZF9maWxlID0gY29tbW9uLk1ha2VUZW1wRmlsZShwcmVmaXg9InNpZ25lZC1wYXlsb2FkLSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1ZmZpeD0iLmJpbiIpCi0gIGNtZCA9IFsiYnJpbGxvX3VwZGF0ZV9wYXlsb2FkIiwgInNpZ24iLAotICAgICAgICAgIi0tdW5zaWduZWRfcGF5bG9hZCIsIHBheWxvYWRfZmlsZSwKLSAgICAgICAgICItLXBheWxvYWQiLCBzaWduZWRfcGF5bG9hZF9maWxlLAotICAgICAgICAgIi0tc2lnbmF0dXJlX3NpemUiLCAiMjU2IiwKLSAgICAgICAgICItLW1ldGFkYXRhX3NpZ25hdHVyZV9maWxlIiwgc2lnbmVkX21ldGFkYXRhX3NpZ19maWxlLAotICAgICAgICAgIi0tcGF5bG9hZF9zaWduYXR1cmVfZmlsZSIsIHNpZ25lZF9wYXlsb2FkX3NpZ19maWxlXQotICBwMSA9IGNvbW1vbi5SdW4oY21kLCBzdGRvdXQ9bG9nX2ZpbGUsIHN0ZGVycj1zdWJwcm9jZXNzLlNURE9VVCkKLSAgcDEuY29tbXVuaWNhdGUoKQotICBhc3NlcnQgcDEucmV0dXJuY29kZSA9PSAwLCAiYnJpbGxvX3VwZGF0ZV9wYXlsb2FkIHNpZ24gZmFpbGVkIgotCi0gICMgNC4gRHVtcCB0aGUgc2lnbmVkIHBheWxvYWQgcHJvcGVydGllcy4KLSAgcHJvcGVydGllc19maWxlID0gY29tbW9uLk1ha2VUZW1wRmlsZShwcmVmaXg9InBheWxvYWQtcHJvcGVydGllcy0iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1ZmZpeD0iLnR4dCIpCi0gIGNtZCA9IFsiYnJpbGxvX3VwZGF0ZV9wYXlsb2FkIiwgInByb3BlcnRpZXMiLAotICAgICAgICAgIi0tcGF5bG9hZCIsIHNpZ25lZF9wYXlsb2FkX2ZpbGUsCi0gICAgICAgICAiLS1wcm9wZXJ0aWVzX2ZpbGUiLCBwcm9wZXJ0aWVzX2ZpbGVdCi0gIHAxID0gY29tbW9uLlJ1bihjbWQsIHN0ZG91dD1sb2dfZmlsZSwgc3RkZXJyPXN1YnByb2Nlc3MuU1RET1VUKQotICBwMS5jb21tdW5pY2F0ZSgpCi0gIGFzc2VydCBwMS5yZXR1cm5jb2RlID09IDAsICJicmlsbG9fdXBkYXRlX3BheWxvYWQgcHJvcGVydGllcyBmYWlsZWQiCi0KLSAgaWYgT1BUSU9OUy53aXBlX3VzZXJfZGF0YToKLSAgICB3aXRoIG9wZW4ocHJvcGVydGllc19maWxlLCAiYSIpIGFzIGY6Ci0gICAgICBmLndyaXRlKCJQT1dFUldBU0g9MVxuIikKLSAgICBtZXRhZGF0YVsib3RhLXdpcGUiXSA9ICJ5ZXMiCi0KLSAgIyBBZGQgdGhlIHNpZ25lZCBwYXlsb2FkIGZpbGUgYW5kIHByb3BlcnRpZXMgaW50byB0aGUgemlwLiBJbiBvcmRlciB0bwotICAjIHN1cHBvcnQgc3RyZWFtaW5nLCB3ZSBwYWNrIHBheWxvYWQuYmluLCBwYXlsb2FkX3Byb3BlcnRpZXMudHh0IGFuZAotICAjIGNhcmVfbWFwLnR4dCBhcyBaSVBfU1RPUkVELiBTbyB0aGVzZSBlbnRyaWVzIGNhbiBiZSByZWFkIGRpcmVjdGx5IHdpdGgKLSAgIyB0aGUgb2Zmc2V0IGFuZCBsZW5ndGggcGFpcnMuCi0gIGNvbW1vbi5aaXBXcml0ZShvdXRwdXRfemlwLCBzaWduZWRfcGF5bG9hZF9maWxlLCBhcmNuYW1lPSJwYXlsb2FkLmJpbiIsCi0gICAgICAgICAgICAgICAgICBjb21wcmVzc190eXBlPXppcGZpbGUuWklQX1NUT1JFRCkKLSAgY29tbW9uLlppcFdyaXRlKG91dHB1dF96aXAsIHByb3BlcnRpZXNfZmlsZSwKLSAgICAgICAgICAgICAgICAgIGFyY25hbWU9InBheWxvYWRfcHJvcGVydGllcy50eHQiLAotICAgICAgICAgICAgICAgICAgY29tcHJlc3NfdHlwZT16aXBmaWxlLlpJUF9TVE9SRUQpCisgICMgR2VuZXJhdGUgYW5kIGluY2x1ZGUgdGhlIHNlY29uZGFyeSBwYXlsb2FkIHRoYXQgaW5zdGFsbHMgc2Vjb25kYXJ5IGltYWdlcworICAjIChlLmcuIHN5c3RlbV9vdGhlci5pbWcpLgorICBpZiBPUFRJT05TLmluY2x1ZGVfc2Vjb25kYXJ5OgorICAgICMgV2UgYWx3YXlzIGluY2x1ZGUgYSBmdWxsIHBheWxvYWQgZm9yIHRoZSBzZWNvbmRhcnkgc2xvdCwgZXZlbiB3aGVuCisgICAgIyBidWlsZGluZyBhbiBpbmNyZW1lbnRhbCBPVEEuIFNlZSB0aGUgY29tbWVudHMgZm9yICItLWluY2x1ZGVfc2Vjb25kYXJ5Ii4KKyAgICBzZWNvbmRhcnlfdGFyZ2V0X2ZpbGUgPSBHZXRUYXJnZXRGaWxlc1ppcEZvclNlY29uZGFyeUltYWdlcygKKyAgICAgICAgdGFyZ2V0X2ZpbGUsIE9QVElPTlMuc2tpcF9wb3N0aW5zdGFsbCkKKyAgICBzZWNvbmRhcnlfcGF5bG9hZCA9IFBheWxvYWQoc2Vjb25kYXJ5PVRydWUpCisgICAgc2Vjb25kYXJ5X3BheWxvYWQuR2VuZXJhdGUoc2Vjb25kYXJ5X3RhcmdldF9maWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZGl0aW9uYWxfYXJncz1hZGRpdGlvbmFsX2FyZ3MpCisgICAgc2Vjb25kYXJ5X3BheWxvYWQuU2lnbihwYXlsb2FkX3NpZ25lcikKKyAgICBzZWNvbmRhcnlfcGF5bG9hZC5Xcml0ZVRvWmlwKG91dHB1dF96aXApCiAKICAgIyBJZiBkbS12ZXJpdHkgaXMgc3VwcG9ydGVkIGZvciB0aGUgZGV2aWNlLCBjb3B5IGNvbnRlbnRzIG9mIGNhcmVfbWFwCiAgICMgaW50byBBL0IgT1RBIHBhY2thZ2UuCiAgIHRhcmdldF96aXAgPSB6aXBmaWxlLlppcEZpbGUodGFyZ2V0X2ZpbGUsICJyIikKLSAgaWYgKE9QVElPTlMuaW5mb19kaWN0LmdldCgidmVyaXR5IikgPT0gInRydWUiIG9yCi0gICAgICBPUFRJT05TLmluZm9fZGljdC5nZXQoImF2Yl9lbmFibGUiKSA9PSAidHJ1ZSIpOgorICBpZiAodGFyZ2V0X2luZm8uZ2V0KCJ2ZXJpdHkiKSA9PSAidHJ1ZSIgb3IKKyAgICAgIHRhcmdldF9pbmZvLmdldCgiYXZiX2VuYWJsZSIpID09ICJ0cnVlIik6CiAgICAgY2FyZV9tYXBfcGF0aCA9ICJNRVRBL2NhcmVfbWFwLnR4dCIKICAgICBuYW1lbGlzdCA9IHRhcmdldF96aXAubmFtZWxpc3QoKQogICAgIGlmIGNhcmVfbWFwX3BhdGggaW4gbmFtZWxpc3Q6CiAgICAgICBjYXJlX21hcF9kYXRhID0gdGFyZ2V0X3ppcC5yZWFkKGNhcmVfbWFwX3BhdGgpCisgICAgICAjIEluIG9yZGVyIHRvIHN1cHBvcnQgc3RyZWFtaW5nLCBjYXJlX21hcC50eHQgbmVlZHMgdG8gYmUgcGFja2VkIGFzCisgICAgICAjIFpJUF9TVE9SRUQuCiAgICAgICBjb21tb24uWmlwV3JpdGVTdHIob3V0cHV0X3ppcCwgImNhcmVfbWFwLnR4dCIsIGNhcmVfbWFwX2RhdGEsCi0gICAgICAgICAgY29tcHJlc3NfdHlwZT16aXBmaWxlLlpJUF9TVE9SRUQpCisgICAgICAgICAgICAgICAgICAgICAgICAgY29tcHJlc3NfdHlwZT16aXBmaWxlLlpJUF9TVE9SRUQpCiAgICAgZWxzZToKICAgICAgIHByaW50KCJXYXJuaW5nOiBjYW5ub3QgZmluZCBjYXJlIG1hcCBmaWxlIGluIHRhcmdldF9maWxlIHBhY2thZ2UiKQogCi0gIGlmIEhhc1ZlbmRvclBhcnRpdGlvbih0YXJnZXRfemlwKToKLSAgICB1cGRhdGVfdmVuZG9yID0gVHJ1ZQotICAgIHVwZGF0ZV9zeXN0ZW0gPSBUcnVlCisgIEFkZENvbXBhdGliaWxpdHlBcmNoaXZlSWZUcmVibGVFbmFibGVkKAorICAgICAgdGFyZ2V0X3ppcCwgb3V0cHV0X3ppcCwgdGFyZ2V0X2luZm8sIHNvdXJjZV9pbmZvKQogCi0gICAgIyBJZiBpbmNyZW1lbnRhbCB0aGVuIGZpZ3VyZSBvdXQgd2hhdCBpcyBiZWluZyB1cGRhdGVkIHNvIG1ldGFkYXRhIG9ubHkgZm9yCi0gICAgIyB0aGUgdXBkYXRlZCBpbWFnZSBpcyBpbmNsdWRlZC4KLSAgICBpZiBzb3VyY2VfZmlsZSBpcyBub3QgTm9uZToKLSAgICAgIGlucHV0X3RtcCwgaW5wdXRfemlwID0gY29tbW9uLlVuemlwVGVtcCgKLSAgICAgICAgICB0YXJnZXRfZmlsZSwgVU5aSVBfUEFUVEVSTikKLSAgICAgIHNvdXJjZV90bXAsIHNvdXJjZV96aXAgPSBjb21tb24uVW56aXBUZW1wKAotICAgICAgICAgIHNvdXJjZV9maWxlLCBVTlpJUF9QQVRURVJOKQotCi0gICAgICB2ZW5kb3Jfc3JjID0gR2V0SW1hZ2UoInZlbmRvciIsIHNvdXJjZV90bXApCi0gICAgICB2ZW5kb3JfdGd0ID0gR2V0SW1hZ2UoInZlbmRvciIsIGlucHV0X3RtcCkKLSAgICAgIHN5c3RlbV9zcmMgPSBHZXRJbWFnZSgic3lzdGVtIiwgc291cmNlX3RtcCkKLSAgICAgIHN5c3RlbV90Z3QgPSBHZXRJbWFnZSgic3lzdGVtIiwgaW5wdXRfdG1wKQotCi0gICAgICB1cGRhdGVfc3lzdGVtID0gc3lzdGVtX3NyYy5Ub3RhbFNoYTEoKSAhPSBzeXN0ZW1fdGd0LlRvdGFsU2hhMSgpCi0gICAgICB1cGRhdGVfdmVuZG9yID0gdmVuZG9yX3NyYy5Ub3RhbFNoYTEoKSAhPSB2ZW5kb3JfdGd0LlRvdGFsU2hhMSgpCi0KLSAgICAgIGlucHV0X3ppcC5jbG9zZSgpCi0gICAgICBzb3VyY2VfemlwLmNsb3NlKCkKLQotICAgIHRhcmdldF96aXAgPSB6aXBmaWxlLlppcEZpbGUodGFyZ2V0X2ZpbGUsICJyIikKLSAgICBBZGRDb21wYXRpYmlsaXR5QXJjaGl2ZSh0YXJnZXRfemlwLCBvdXRwdXRfemlwLCB1cGRhdGVfc3lzdGVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZV92ZW5kb3IpCiAgIGNvbW1vbi5aaXBDbG9zZSh0YXJnZXRfemlwKQogCi0gICMgV3JpdGUgdGhlIGN1cnJlbnQgbWV0YWRhdGEgZW50cnkgd2l0aCBwbGFjZWhvbGRlcnMuCi0gIG1ldGFkYXRhWydvdGEtc3RyZWFtaW5nLXByb3BlcnR5LWZpbGVzJ10gPSBDb21wdXRlU3RyZWFtaW5nTWV0YWRhdGEoCi0gICAgICBvdXRwdXRfemlwLCByZXNlcnZlX3NwYWNlPVRydWUpCi0gIFdyaXRlTWV0YWRhdGEobWV0YWRhdGEsIG91dHB1dF96aXApCisgICMgV2UgaGF2ZW4ndCB3cml0dGVuIHRoZSBtZXRhZGF0YSBlbnRyeSB5ZXQsIHdoaWNoIHdpbGwgYmUgaGFuZGxlZCBpbgorICAjIEZpbmFsaXplTWV0YWRhdGEoKS4KICAgY29tbW9uLlppcENsb3NlKG91dHB1dF96aXApCiAKLSAgIyBTaWduT3V0cHV0KCksIHdoaWNoIGluIHR1cm4gY2FsbHMgc2lnbmFway5qYXIsIHdpbGwgcG9zc2libHkgcmVvcmRlciB0aGUKLSAgIyB6aXAgZW50cmllcywgYXMgd2VsbCBhcyBwYWRkaW5nIHRoZSBlbnRyeSBoZWFkZXJzLiBXZSBkbyBhIHByZWxpbWluYXJ5Ci0gICMgc2lnbmluZyAod2l0aCBhbiBpbmNvbXBsZXRlIG1ldGFkYXRhIGVudHJ5KSB0byBhbGxvdyB0aGF0IHRvIGhhcHBlbi4gVGhlbgotICAjIGNvbXB1dGUgdGhlIHppcCBlbnRyeSBvZmZzZXRzLCB3cml0ZSBiYWNrIHRoZSBmaW5hbCBtZXRhZGF0YSBhbmQgZG8gdGhlCi0gICMgZmluYWwgc2lnbmluZy4KLSAgcHJlbGltX3NpZ25pbmcgPSB0ZW1wZmlsZS5OYW1lZFRlbXBvcmFyeUZpbGUoKQotICBTaWduT3V0cHV0KHRlbXBfemlwX2ZpbGUubmFtZSwgcHJlbGltX3NpZ25pbmcubmFtZSkKLSAgY29tbW9uLlppcENsb3NlKHRlbXBfemlwX2ZpbGUpCi0KLSAgIyBPcGVuIHRoZSBzaWduZWQgemlwLiBDb21wdXRlIHRoZSBmaW5hbCBtZXRhZGF0YSB0aGF0J3MgbmVlZGVkIGZvciBzdHJlYW1pbmcuCi0gIHByZWxpbV96aXAgPSB6aXBmaWxlLlppcEZpbGUocHJlbGltX3NpZ25pbmcsICJyIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wcmVzc2lvbj16aXBmaWxlLlpJUF9ERUZMQVRFRCkKLSAgZXhwZWN0ZWRfbGVuZ3RoID0gbGVuKG1ldGFkYXRhWydvdGEtc3RyZWFtaW5nLXByb3BlcnR5LWZpbGVzJ10pCi0gIG1ldGFkYXRhWydvdGEtc3RyZWFtaW5nLXByb3BlcnR5LWZpbGVzJ10gPSBDb21wdXRlU3RyZWFtaW5nTWV0YWRhdGEoCi0gICAgICBwcmVsaW1femlwLCByZXNlcnZlX3NwYWNlPUZhbHNlLCBleHBlY3RlZF9sZW5ndGg9ZXhwZWN0ZWRfbGVuZ3RoKQotCi0gICMgQ29weSB0aGUgemlwIGVudHJpZXMsIGFzIHdlIGNhbm5vdCB1cGRhdGUgLyBkZWxldGUgZW50cmllcyB3aXRoIHppcGZpbGUuCi0gIGZpbmFsX3NpZ25pbmcgPSB0ZW1wZmlsZS5OYW1lZFRlbXBvcmFyeUZpbGUoKQotICBvdXRwdXRfemlwID0gemlwZmlsZS5aaXBGaWxlKGZpbmFsX3NpZ25pbmcsICJ3IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wcmVzc2lvbj16aXBmaWxlLlpJUF9ERUZMQVRFRCkKLSAgZm9yIGl0ZW0gaW4gcHJlbGltX3ppcC5pbmZvbGlzdCgpOgotICAgIGlmIGl0ZW0uZmlsZW5hbWUgPT0gTUVUQURBVEFfTkFNRToKLSAgICAgIGNvbnRpbnVlCi0KLSAgICBkYXRhID0gcHJlbGltX3ppcC5yZWFkKGl0ZW0uZmlsZW5hbWUpCi0gICAgb3V0X2luZm8gPSBjb3B5LmNvcHkoaXRlbSkKLSAgICBjb21tb24uWmlwV3JpdGVTdHIob3V0cHV0X3ppcCwgb3V0X2luZm8sIGRhdGEpCi0KLSAgIyBOb3cgd3JpdGUgdGhlIGZpbmFsIG1ldGFkYXRhIGVudHJ5LgotICBXcml0ZU1ldGFkYXRhKG1ldGFkYXRhLCBvdXRwdXRfemlwKQotICBjb21tb24uWmlwQ2xvc2UocHJlbGltX3ppcCkKLSAgY29tbW9uLlppcENsb3NlKG91dHB1dF96aXApCi0KLSAgIyBSZS1zaWduIHRoZSBwYWNrYWdlIGFmdGVyIHVwZGF0aW5nIHRoZSBtZXRhZGF0YSBlbnRyeS4KLSAgU2lnbk91dHB1dChmaW5hbF9zaWduaW5nLm5hbWUsIG91dHB1dF9maWxlKQotICBmaW5hbF9zaWduaW5nLmNsb3NlKCkKLQotICAjIFJlb3BlbiB0aGUgZmluYWwgc2lnbmVkIHppcCB0byBkb3VibGUgY2hlY2sgdGhlIHN0cmVhbWluZyBtZXRhZGF0YS4KLSAgb3V0cHV0X3ppcCA9IHppcGZpbGUuWmlwRmlsZShvdXRwdXRfZmlsZSwgInIiKQotICBhY3R1YWwgPSBtZXRhZGF0YVsnb3RhLXN0cmVhbWluZy1wcm9wZXJ0eS1maWxlcyddLnN0cmlwKCkKLSAgZXhwZWN0ZWQgPSBDb21wdXRlU3RyZWFtaW5nTWV0YWRhdGEob3V0cHV0X3ppcCkKLSAgYXNzZXJ0IGFjdHVhbCA9PSBleHBlY3RlZCwgXAotICAgICAgIk1pc21hdGNoaW5nIHN0cmVhbWluZyBtZXRhZGF0YTogJXMgdnMgJXMuIiAlIChhY3R1YWwsIGV4cGVjdGVkKQotICBjb21tb24uWmlwQ2xvc2Uob3V0cHV0X3ppcCkKKyAgIyBBYk90YVByb3BlcnR5RmlsZXMgaW50ZW5kcyB0byByZXBsYWNlIFN0cmVhbWluZ1Byb3BlcnR5RmlsZXMsIGFzIGl0IGNvdmVycworICAjIGFsbCB0aGUgaW5mbyBvZiB0aGUgbGF0dGVyLiBIb3dldmVyLCBzeXN0ZW0gdXBkYXRlcnMgYW5kIE9UQSBzZXJ2ZXJzIG5lZWQgdG8KKyAgIyB0YWtlIHRpbWUgdG8gc3dpdGNoIHRvIHRoZSBuZXcgZmxhZy4gV2Uga2VlcCBib3RoIG9mIHRoZSBmbGFncyBmb3IKKyAgIyBQLXRpbWVmcmFtZSwgYW5kIHdpbGwgcmVtb3ZlIFN0cmVhbWluZ1Byb3BlcnR5RmlsZXMgaW4gbGF0ZXIgcmVsZWFzZS4KKyAgbmVlZGVkX3Byb3BlcnR5X2ZpbGVzID0gKAorICAgICAgQWJPdGFQcm9wZXJ0eUZpbGVzKCksCisgICAgICBTdHJlYW1pbmdQcm9wZXJ0eUZpbGVzKCksCisgICkKKyAgRmluYWxpemVNZXRhZGF0YShtZXRhZGF0YSwgc3RhZ2luZ19maWxlLCBvdXRwdXRfZmlsZSwgbmVlZGVkX3Byb3BlcnR5X2ZpbGVzKQogCiAKIGRlZiBtYWluKGFyZ3YpOgogCiAgIGRlZiBvcHRpb25faGFuZGxlcihvLCBhKToKLSAgICBpZiBvID09ICItLWJvYXJkX2NvbmZpZyI6Ci0gICAgICBwYXNzICAgIyBkZXByZWNhdGVkCi0gICAgZWxpZiBvIGluICgiLWsiLCAiLS1wYWNrYWdlX2tleSIpOgorICAgIGlmIG8gaW4gKCItayIsICItLXBhY2thZ2Vfa2V5Iik6CiAgICAgICBPUFRJT05TLnBhY2thZ2Vfa2V5ID0gYQogICAgIGVsaWYgbyBpbiAoIi1pIiwgIi0taW5jcmVtZW50YWxfZnJvbSIpOgogICAgICAgT1BUSU9OUy5pbmNyZW1lbnRhbF9zb3VyY2UgPSBhCkBAIC0xMjc2LDEzICsxNzgzLDEzIEBACiAgICAgICBPUFRJT05TLmZ1bGxfcmFkaW8gPSBUcnVlCiAgICAgZWxpZiBvID09ICItLWZ1bGxfYm9vdGxvYWRlciI6CiAgICAgICBPUFRJT05TLmZ1bGxfYm9vdGxvYWRlciA9IFRydWUKLSAgICBlbGlmIG8gaW4gKCItdyIsICItLXdpcGVfdXNlcl9kYXRhIik6CisgICAgZWxpZiBvID09ICItLXdpcGVfdXNlcl9kYXRhIjoKICAgICAgIE9QVElPTlMud2lwZV91c2VyX2RhdGEgPSBUcnVlCiAgICAgZWxpZiBvID09ICItLWRvd25ncmFkZSI6CiAgICAgICBPUFRJT05TLmRvd25ncmFkZSA9IFRydWUKICAgICAgIE9QVElPTlMud2lwZV91c2VyX2RhdGEgPSBUcnVlCiAgICAgZWxpZiBvID09ICItLW92ZXJyaWRlX3RpbWVzdGFtcCI6Ci0gICAgICBPUFRJT05TLnRpbWVzdGFtcCA9IFRydWUKKyAgICAgIE9QVElPTlMuZG93bmdyYWRlID0gVHJ1ZQogICAgIGVsaWYgbyBpbiAoIi1vIiwgIi0tb2VtX3NldHRpbmdzIik6CiAgICAgICBPUFRJT05TLm9lbV9zb3VyY2UgPSBhLnNwbGl0KCcsJykKICAgICBlbGlmIG8gPT0gIi0tb2VtX25vX21vdW50IjoKQEAgLTEyOTcsNiArMTgwNCw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgImludGVnZXJzIGFyZSBhbGxvd2VkLiIgJSAoYSwgbykpCiAgICAgZWxpZiBvIGluICgiLTIiLCAiLS10d29fc3RlcCIpOgogICAgICAgT1BUSU9OUy50d29fc3RlcCA9IFRydWUKKyAgICBlbGlmIG8gPT0gIi0taW5jbHVkZV9zZWNvbmRhcnkiOgorICAgICAgT1BUSU9OUy5pbmNsdWRlX3NlY29uZGFyeSA9IFRydWUKICAgICBlbGlmIG8gPT0gIi0tbm9fc2lnbmluZyI6CiAgICAgICBPUFRJT05TLm5vX3NpZ25pbmcgPSBUcnVlCiAgICAgZWxpZiBvID09ICItLXZlcmlmeSI6CkBAIC0xMzA1LDE2ICsxODE0LDEyIEBACiAgICAgICBPUFRJT05TLmJsb2NrX2Jhc2VkID0gVHJ1ZQogICAgIGVsaWYgbyBpbiAoIi1iIiwgIi0tYmluYXJ5Iik6CiAgICAgICBPUFRJT05TLnVwZGF0ZXJfYmluYXJ5ID0gYQotICAgIGVsaWYgbyBpbiAoIi0tbm9fZmFsbGJhY2tfdG9fZnVsbCIsKToKLSAgICAgIE9QVElPTlMuZmFsbGJhY2tfdG9fZnVsbCA9IEZhbHNlCiAgICAgZWxpZiBvID09ICItLXN0YXNoX3RocmVzaG9sZCI6CiAgICAgICB0cnk6CiAgICAgICAgIE9QVElPTlMuc3Rhc2hfdGhyZXNob2xkID0gZmxvYXQoYSkKICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJDYW5ub3QgcGFyc2UgdmFsdWUgJXIgZm9yIG9wdGlvbiAlciAtIGV4cGVjdGluZyAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgImEgZmxvYXQiICUgKGEsIG8pKQotICAgIGVsaWYgbyA9PSAiLS1nZW5fdmVyaWZ5IjoKLSAgICAgIE9QVElPTlMuZ2VuX3ZlcmlmeSA9IFRydWUKICAgICBlbGlmIG8gPT0gIi0tbG9nX2RpZmYiOgogICAgICAgT1BUSU9OUy5sb2dfZGlmZiA9IGEKICAgICBlbGlmIG8gPT0gIi0tcGF5bG9hZF9zaWduZXIiOgpAQCAtMTMyMywxNCArMTgyOCwxNSBAQAogICAgICAgT1BUSU9OUy5wYXlsb2FkX3NpZ25lcl9hcmdzID0gc2hsZXguc3BsaXQoYSkKICAgICBlbGlmIG8gPT0gIi0tZXh0cmFjdGVkX2lucHV0X3RhcmdldF9maWxlcyI6CiAgICAgICBPUFRJT05TLmV4dHJhY3RlZF9pbnB1dCA9IGEKKyAgICBlbGlmIG8gPT0gIi0tc2tpcF9wb3N0aW5zdGFsbCI6CisgICAgICBPUFRJT05TLnNraXBfcG9zdGluc3RhbGwgPSBUcnVlCiAgICAgZWxzZToKICAgICAgIHJldHVybiBGYWxzZQogICAgIHJldHVybiBUcnVlCiAKICAgYXJncyA9IGNvbW1vbi5QYXJzZU9wdGlvbnMoYXJndiwgX19kb2NfXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFfb3B0cz0iYjprOmk6ZDp3ZTp0OjJvOiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhX29wdHM9ImI6azppOmQ6ZTp0OjJvOiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhX2xvbmdfb3B0cz1bCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYm9hcmRfY29uZmlnPSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFja2FnZV9rZXk9IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbmNyZW1lbnRhbF9mcm9tPSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZnVsbF9yYWRpbyIsCkBAIC0xMzQxLDE5ICsxODQ3LDE5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXh0cmFfc2NyaXB0PSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid29ya2VyX3RocmVhZHM9IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0d29fc3RlcCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5jbHVkZV9zZWNvbmRhcnkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5vX3NpZ25pbmciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJsb2NrIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiaW5hcnk9IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvZW1fc2V0dGluZ3M9IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvZW1fbm9fbW91bnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZlcmlmeSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibm9fZmFsbGJhY2tfdG9fZnVsbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3Rhc2hfdGhyZXNob2xkPSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ2VuX3ZlcmlmeSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibG9nX2RpZmY9IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYXlsb2FkX3NpZ25lcj0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBheWxvYWRfc2lnbmVyX2FyZ3M9IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleHRyYWN0ZWRfaW5wdXRfdGFyZ2V0X2ZpbGVzPSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2tpcF9wb3N0aW5zdGFsbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sIGV4dHJhX29wdGlvbl9oYW5kbGVyPW9wdGlvbl9oYW5kbGVyKQogCiAgIGlmIGxlbihhcmdzKSAhPSAyOgpAQCAtMTM2MSwyNyArMTg2Nyw0MSBAQAogICAgIHN5cy5leGl0KDEpCiAKICAgaWYgT1BUSU9OUy5kb3duZ3JhZGU6Ci0gICAgIyBTYW5pdHkgY2hlY2sgdG8gZW5mb3JjZSBhIGRhdGEgd2lwZS4KLSAgICBpZiBub3QgT1BUSU9OUy53aXBlX3VzZXJfZGF0YToKLSAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkNhbm5vdCBkb3duZ3JhZGUgd2l0aG91dCBhIGRhdGEgd2lwZSIpCi0KICAgICAjIFdlIHNob3VsZCBvbmx5IGFsbG93IGRvd25ncmFkaW5nIGluY3JlbWVudGFscyAoYXMgb3Bwb3NlZCB0byBmdWxsKS4KICAgICAjIE90aGVyd2lzZSB0aGUgZGV2aWNlIG1heSBnbyBiYWNrIGZyb20gYXJiaXRyYXJ5IGJ1aWxkIHdpdGggdGhpcyBmdWxsCiAgICAgIyBPVEEgcGFja2FnZS4KICAgICBpZiBPUFRJT05TLmluY3JlbWVudGFsX3NvdXJjZSBpcyBOb25lOgogICAgICAgcmFpc2UgVmFsdWVFcnJvcigiQ2Fubm90IGdlbmVyYXRlIGRvd25ncmFkYWJsZSBmdWxsIE9UQXMiKQogCi0gIGFzc2VydCBub3QgKE9QVElPTlMuZG93bmdyYWRlIGFuZCBPUFRJT05TLnRpbWVzdGFtcCksIFwKLSAgICAgICJDYW5ub3QgaGF2ZSAtLWRvd25ncmFkZSBBTkQgLS1vdmVycmlkZV90aW1lc3RhbXAgYm90aCIKLQotICAjIExvYWQgdGhlIGRpY3QgZmlsZSBmcm9tIHRoZSB6aXAgZGlyZWN0bHkgdG8gaGF2ZSBhIHBlZWsgYXQgdGhlIE9UQSB0eXBlLgotICAjIEZvciBwYWNrYWdlcyB1c2luZyBBL0IgdXBkYXRlLCB1bnppcHBpbmcgaXMgbm90IG5lZWRlZC4KKyAgIyBMb2FkIHRoZSBidWlsZCBpbmZvIGRpY3RzIGZyb20gdGhlIHppcCBkaXJlY3RseSBvciB0aGUgZXh0cmFjdGVkIGlucHV0CisgICMgZGlyZWN0b3J5LiBXZSBkb24ndCBuZWVkIHRvIHVuemlwIHRoZSBlbnRpcmUgdGFyZ2V0LWZpbGVzIHppcHMsIGJlY2F1c2UgdGhleQorICAjIHdvbid0IGJlIG5lZWRlZCBmb3IgQS9CIE9UQXMgKGJyaWxsb191cGRhdGVfcGF5bG9hZCBkb2VzIHRoYXQgb24gaXRzIG93bikuCisgICMgV2hlbiBsb2FkaW5nIHRoZSBpbmZvIGRpY3RzLCB3ZSBkb24ndCBuZWVkIHRvIHByb3ZpZGUgdGhlIHNlY29uZCBwYXJhbWV0ZXIKKyAgIyB0byBjb21tb24uTG9hZEluZm9EaWN0KCkuIFNwZWNpZnlpbmcgdGhlIHNlY29uZCBwYXJhbWV0ZXIgYWxsb3dzIHJlcGxhY2luZworICAjIHNvbWUgcHJvcGVydGllcyB3aXRoIHRoZWlyIGFjdHVhbCBwYXRocywgc3VjaCBhcyAnc2VsaW51eF9mYycsCisgICMgJ3JhbWRpc2tfZGlyJywgd2hpY2ggd29uJ3QgYmUgdXNlZCBkdXJpbmcgT1RBIGdlbmVyYXRpb24uCiAgIGlmIE9QVElPTlMuZXh0cmFjdGVkX2lucHV0IGlzIG5vdCBOb25lOgotICAgIE9QVElPTlMuaW5mb19kaWN0ID0gY29tbW9uLkxvYWRJbmZvRGljdChPUFRJT05TLmV4dHJhY3RlZF9pbnB1dCwgT1BUSU9OUy5leHRyYWN0ZWRfaW5wdXQpCisgICAgT1BUSU9OUy5pbmZvX2RpY3QgPSBjb21tb24uTG9hZEluZm9EaWN0KE9QVElPTlMuZXh0cmFjdGVkX2lucHV0KQogICBlbHNlOgotICAgIGlucHV0X3ppcCA9IHppcGZpbGUuWmlwRmlsZShhcmdzWzBdLCAiciIpCi0gICAgT1BUSU9OUy5pbmZvX2RpY3QgPSBjb21tb24uTG9hZEluZm9EaWN0KGlucHV0X3ppcCkKLSAgICBjb21tb24uWmlwQ2xvc2UoaW5wdXRfemlwKQorICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKGFyZ3NbMF0sICdyJykgYXMgaW5wdXRfemlwOgorICAgICAgT1BUSU9OUy5pbmZvX2RpY3QgPSBjb21tb24uTG9hZEluZm9EaWN0KGlucHV0X3ppcCkKKworICBpZiBPUFRJT05TLnZlcmJvc2U6CisgICAgcHJpbnQoIi0tLSB0YXJnZXQgaW5mbyAtLS0iKQorICAgIGNvbW1vbi5EdW1wSW5mb0RpY3QoT1BUSU9OUy5pbmZvX2RpY3QpCisKKyAgIyBMb2FkIHRoZSBzb3VyY2UgYnVpbGQgZGljdCBpZiBhcHBsaWNhYmxlLgorICBpZiBPUFRJT05TLmluY3JlbWVudGFsX3NvdXJjZSBpcyBub3QgTm9uZToKKyAgICBPUFRJT05TLnRhcmdldF9pbmZvX2RpY3QgPSBPUFRJT05TLmluZm9fZGljdAorICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKE9QVElPTlMuaW5jcmVtZW50YWxfc291cmNlLCAncicpIGFzIHNvdXJjZV96aXA6CisgICAgICBPUFRJT05TLnNvdXJjZV9pbmZvX2RpY3QgPSBjb21tb24uTG9hZEluZm9EaWN0KHNvdXJjZV96aXApCisKKyAgICBpZiBPUFRJT05TLnZlcmJvc2U6CisgICAgICBwcmludCgiLS0tIHNvdXJjZSBpbmZvIC0tLSIpCisgICAgICBjb21tb24uRHVtcEluZm9EaWN0KE9QVElPTlMuc291cmNlX2luZm9fZGljdCkKKworICAjIExvYWQgT0VNIGRpY3RzIGlmIHByb3ZpZGVkLgorICBPUFRJT05TLm9lbV9kaWN0cyA9IF9Mb2FkT2VtRGljdHMoT1BUSU9OUy5vZW1fc291cmNlKQogCiAgIGFiX3VwZGF0ZSA9IE9QVElPTlMuaW5mb19kaWN0LmdldCgiYWJfdXBkYXRlIikgPT0gInRydWUiCiAKQEAgLTEzOTcsMjAgKzE5MTcsNiBAQAogICAgIE9QVElPTlMua2V5X3Bhc3N3b3JkcyA9IGNvbW1vbi5HZXRLZXlQYXNzd29yZHMoW09QVElPTlMucGFja2FnZV9rZXldKQogCiAgIGlmIGFiX3VwZGF0ZToKLSAgICBpZiBPUFRJT05TLmluY3JlbWVudGFsX3NvdXJjZSBpcyBub3QgTm9uZToKLSAgICAgIE9QVElPTlMudGFyZ2V0X2luZm9fZGljdCA9IE9QVElPTlMuaW5mb19kaWN0Ci0gICAgICBzb3VyY2VfemlwID0gemlwZmlsZS5aaXBGaWxlKE9QVElPTlMuaW5jcmVtZW50YWxfc291cmNlLCAiciIpCi0gICAgICBPUFRJT05TLnNvdXJjZV9pbmZvX2RpY3QgPSBjb21tb24uTG9hZEluZm9EaWN0KHNvdXJjZV96aXApCi0gICAgICBjb21tb24uWmlwQ2xvc2Uoc291cmNlX3ppcCkKLQotICAgIGlmIE9QVElPTlMudmVyYm9zZToKLSAgICAgIHByaW50KCItLS0gdGFyZ2V0IGluZm8gLS0tIikKLSAgICAgIGNvbW1vbi5EdW1wSW5mb0RpY3QoT1BUSU9OUy5pbmZvX2RpY3QpCi0KLSAgICAgIGlmIE9QVElPTlMuaW5jcmVtZW50YWxfc291cmNlIGlzIG5vdCBOb25lOgotICAgICAgICBwcmludCgiLS0tIHNvdXJjZSBpbmZvIC0tLSIpCi0gICAgICAgIGNvbW1vbi5EdW1wSW5mb0RpY3QoT1BUSU9OUy5zb3VyY2VfaW5mb19kaWN0KQotCiAgICAgV3JpdGVBQk9UQVBhY2thZ2VXaXRoQnJpbGxvU2NyaXB0KAogICAgICAgICB0YXJnZXRfZmlsZT1hcmdzWzBdLAogICAgICAgICBvdXRwdXRfZmlsZT1hcmdzWzFdLApAQCAtMTQxOSwxMDkgKzE5MjUsNjcgQEAKICAgICBwcmludCgiZG9uZS4iKQogICAgIHJldHVybgogCisgICMgU2FuaXR5IGNoZWNrIHRoZSBsb2FkZWQgaW5mbyBkaWN0cyBmaXJzdC4KKyAgaWYgT1BUSU9OUy5pbmZvX2RpY3QuZ2V0KCJub19yZWNvdmVyeSIpID09ICJ0cnVlIjoKKyAgICByYWlzZSBjb21tb24uRXh0ZXJuYWxFcnJvcigKKyAgICAgICAgIi0tLSB0YXJnZXQgYnVpbGQgaGFzIHNwZWNpZmllZCBubyByZWNvdmVyeSAtLS0iKQorCisgICMgTm9uLUEvQiBPVEFzIHJlbHkgb24gL2NhY2hlIHBhcnRpdGlvbiB0byBzdG9yZSB0ZW1wb3JhcnkgZmlsZXMuCisgIGNhY2hlX3NpemUgPSBPUFRJT05TLmluZm9fZGljdC5nZXQoImNhY2hlX3NpemUiKQorICBpZiBjYWNoZV9zaXplIGlzIE5vbmU6CisgICAgcHJpbnQoIi0tLSBjYW4ndCBkZXRlcm1pbmUgdGhlIGNhY2hlIHBhcnRpdGlvbiBzaXplIC0tLSIpCisgIE9QVElPTlMuY2FjaGVfc2l6ZSA9IGNhY2hlX3NpemUKKwogICBpZiBPUFRJT05TLmV4dHJhX3NjcmlwdCBpcyBub3QgTm9uZToKICAgICBPUFRJT05TLmV4dHJhX3NjcmlwdCA9IG9wZW4oT1BUSU9OUy5leHRyYV9zY3JpcHQpLnJlYWQoKQogCiAgIGlmIE9QVElPTlMuZXh0cmFjdGVkX2lucHV0IGlzIG5vdCBOb25lOgogICAgIE9QVElPTlMuaW5wdXRfdG1wID0gT1BUSU9OUy5leHRyYWN0ZWRfaW5wdXQKLSAgICBPUFRJT05TLnRhcmdldF90bXAgPSBPUFRJT05TLmlucHV0X3RtcAotICAgIE9QVElPTlMuaW5mb19kaWN0ID0gY29tbW9uLkxvYWRJbmZvRGljdChPUFRJT05TLmlucHV0X3RtcCwgT1BUSU9OUy5pbnB1dF90bXApCi0gICAgaW5wdXRfemlwID0gemlwZmlsZS5aaXBGaWxlKGFyZ3NbMF0sICJyIikKICAgZWxzZToKICAgICBwcmludCgidW56aXBwaW5nIHRhcmdldCB0YXJnZXQtZmlsZXMuLi4iKQotICAgIE9QVElPTlMuaW5wdXRfdG1wLCBpbnB1dF96aXAgPSBjb21tb24uVW56aXBUZW1wKAotICAgICAgICBhcmdzWzBdLCBVTlpJUF9QQVRURVJOKQorICAgIE9QVElPTlMuaW5wdXRfdG1wID0gY29tbW9uLlVuemlwVGVtcChhcmdzWzBdLCBVTlpJUF9QQVRURVJOKQorICBPUFRJT05TLnRhcmdldF90bXAgPSBPUFRJT05TLmlucHV0X3RtcAogCi0gICAgT1BUSU9OUy50YXJnZXRfdG1wID0gT1BUSU9OUy5pbnB1dF90bXAKLSAgICBPUFRJT05TLmluZm9fZGljdCA9IGNvbW1vbi5Mb2FkSW5mb0RpY3QoaW5wdXRfemlwLCBPUFRJT05TLnRhcmdldF90bXApCi0KLSAgaWYgT1BUSU9OUy52ZXJib3NlOgotICAgIHByaW50KCItLS0gdGFyZ2V0IGluZm8gLS0tIikKLSAgICBjb21tb24uRHVtcEluZm9EaWN0KE9QVElPTlMuaW5mb19kaWN0KQotCi0gICMgSWYgdGhlIGNhbGxlciBleHBsaWNpdGx5IHNwZWNpZmllZCB0aGUgZGV2aWNlLXNwZWNpZmljIGV4dGVuc2lvbnMKLSAgIyBwYXRoIHZpYSAtcy8tLWRldmljZV9zcGVjaWZpYywgdXNlIHRoYXQuICBPdGhlcndpc2UsIHVzZQotICAjIE1FVEEvcmVsZWFzZXRvb2xzLnB5IGlmIGl0IGlzIHByZXNlbnQgaW4gdGhlIHRhcmdldCB0YXJnZXRfZmlsZXMuCi0gICMgT3RoZXJ3aXNlLCB0YWtlIHRoZSBwYXRoIG9mIHRoZSBmaWxlIGZyb20gJ3Rvb2xfZXh0ZW5zaW9ucycgaW4gdGhlCi0gICMgaW5mbyBkaWN0IGFuZCBsb29rIGZvciB0aGF0IGluIHRoZSBsb2NhbCBmaWxlc3lzdGVtLCByZWxhdGl2ZSB0bwotICAjIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4KLQorICAjIElmIHRoZSBjYWxsZXIgZXhwbGljaXRseSBzcGVjaWZpZWQgdGhlIGRldmljZS1zcGVjaWZpYyBleHRlbnNpb25zIHBhdGggdmlhCisgICMgLXMgLyAtLWRldmljZV9zcGVjaWZpYywgdXNlIHRoYXQuIE90aGVyd2lzZSwgdXNlIE1FVEEvcmVsZWFzZXRvb2xzLnB5IGlmIGl0CisgICMgaXMgcHJlc2VudCBpbiB0aGUgdGFyZ2V0IHRhcmdldF9maWxlcy4gT3RoZXJ3aXNlLCB0YWtlIHRoZSBwYXRoIG9mIHRoZSBmaWxlCisgICMgZnJvbSAndG9vbF9leHRlbnNpb25zJyBpbiB0aGUgaW5mbyBkaWN0IGFuZCBsb29rIGZvciB0aGF0IGluIHRoZSBsb2NhbAorICAjIGZpbGVzeXN0ZW0sIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4KICAgaWYgT1BUSU9OUy5kZXZpY2Vfc3BlY2lmaWMgaXMgTm9uZToKICAgICBmcm9tX2lucHV0ID0gb3MucGF0aC5qb2luKE9QVElPTlMuaW5wdXRfdG1wLCAiTUVUQSIsICJyZWxlYXNldG9vbHMucHkiKQogICAgIGlmIG9zLnBhdGguZXhpc3RzKGZyb21faW5wdXQpOgogICAgICAgcHJpbnQoIih1c2luZyBkZXZpY2Utc3BlY2lmaWMgZXh0ZW5zaW9ucyBmcm9tIHRhcmdldF9maWxlcykiKQogICAgICAgT1BUSU9OUy5kZXZpY2Vfc3BlY2lmaWMgPSBmcm9tX2lucHV0CiAgICAgZWxzZToKLSAgICAgIE9QVElPTlMuZGV2aWNlX3NwZWNpZmljID0gT1BUSU9OUy5pbmZvX2RpY3QuZ2V0KCJ0b29sX2V4dGVuc2lvbnMiLCBOb25lKQorICAgICAgT1BUSU9OUy5kZXZpY2Vfc3BlY2lmaWMgPSBPUFRJT05TLmluZm9fZGljdC5nZXQoInRvb2xfZXh0ZW5zaW9ucyIpCiAKICAgaWYgT1BUSU9OUy5kZXZpY2Vfc3BlY2lmaWMgaXMgbm90IE5vbmU6CiAgICAgT1BUSU9OUy5kZXZpY2Vfc3BlY2lmaWMgPSBvcy5wYXRoLmFic3BhdGgoT1BUSU9OUy5kZXZpY2Vfc3BlY2lmaWMpCiAKLSAgaWYgT1BUSU9OUy5pbmZvX2RpY3QuZ2V0KCJub19yZWNvdmVyeSIpID09ICJ0cnVlIjoKLSAgICByYWlzZSBjb21tb24uRXh0ZXJuYWxFcnJvcigKLSAgICAgICAgIi0tLSB0YXJnZXQgYnVpbGQgaGFzIHNwZWNpZmllZCBubyByZWNvdmVyeSAtLS0iKQotCi0gICMgU2V0IHVwIHRoZSBvdXRwdXQgemlwLiBDcmVhdGUgYSB0ZW1wb3JhcnkgemlwIGZpbGUgaWYgc2lnbmluZyBpcyBuZWVkZWQuCi0gIGlmIE9QVElPTlMubm9fc2lnbmluZzoKLSAgICBpZiBvcy5wYXRoLmV4aXN0cyhhcmdzWzFdKToKLSAgICAgIG9zLnVubGluayhhcmdzWzFdKQotICAgIG91dHB1dF96aXAgPSB6aXBmaWxlLlppcEZpbGUoYXJnc1sxXSwgInciLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcHJlc3Npb249emlwZmlsZS5aSVBfREVGTEFURUQpCi0gIGVsc2U6Ci0gICAgdGVtcF96aXBfZmlsZSA9IHRlbXBmaWxlLk5hbWVkVGVtcG9yYXJ5RmlsZSgpCi0gICAgb3V0cHV0X3ppcCA9IHppcGZpbGUuWmlwRmlsZSh0ZW1wX3ppcF9maWxlLCAidyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wcmVzc2lvbj16aXBmaWxlLlpJUF9ERUZMQVRFRCkKLQotICAjIE5vbiBBL0IgT1RBcyByZWx5IG9uIC9jYWNoZSBwYXJ0aXRpb24gdG8gc3RvcmUgdGVtcG9yYXJ5IGZpbGVzLgotICBjYWNoZV9zaXplID0gT1BUSU9OUy5pbmZvX2RpY3QuZ2V0KCJjYWNoZV9zaXplIiwgTm9uZSkKLSAgaWYgY2FjaGVfc2l6ZSBpcyBOb25lOgotICAgIHByaW50KCItLS0gY2FuJ3QgZGV0ZXJtaW5lIHRoZSBjYWNoZSBwYXJ0aXRpb24gc2l6ZSAtLS0iKQotICBPUFRJT05TLmNhY2hlX3NpemUgPSBjYWNoZV9zaXplCi0KLSAgIyBHZW5lcmF0ZSBhIHZlcmlmeSBwYWNrYWdlLgotICBpZiBPUFRJT05TLmdlbl92ZXJpZnk6Ci0gICAgV3JpdGVWZXJpZnlQYWNrYWdlKGlucHV0X3ppcCwgb3V0cHV0X3ppcCkKLQogICAjIEdlbmVyYXRlIGEgZnVsbCBPVEEuCi0gIGVsaWYgT1BUSU9OUy5pbmNyZW1lbnRhbF9zb3VyY2UgaXMgTm9uZToKLSAgICBXcml0ZUZ1bGxPVEFQYWNrYWdlKGlucHV0X3ppcCwgb3V0cHV0X3ppcCkKKyAgaWYgT1BUSU9OUy5pbmNyZW1lbnRhbF9zb3VyY2UgaXMgTm9uZToKKyAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShhcmdzWzBdLCAncicpIGFzIGlucHV0X3ppcDoKKyAgICAgIFdyaXRlRnVsbE9UQVBhY2thZ2UoCisgICAgICAgICAgaW5wdXRfemlwLAorICAgICAgICAgIG91dHB1dF9maWxlPWFyZ3NbMV0pCiAKLSAgIyBHZW5lcmF0ZSBhbiBpbmNyZW1lbnRhbCBPVEEuIEl0IHdpbGwgZmFsbCBiYWNrIHRvIGdlbmVyYXRlIGEgZnVsbCBPVEEgb24KLSAgIyBmYWlsdXJlIHVubGVzcyBub19mYWxsYmFja190b19mdWxsIGlzIHNwZWNpZmllZC4KKyAgIyBHZW5lcmF0ZSBhbiBpbmNyZW1lbnRhbCBPVEEuCiAgIGVsc2U6CiAgICAgcHJpbnQoInVuemlwcGluZyBzb3VyY2UgdGFyZ2V0LWZpbGVzLi4uIikKLSAgICBPUFRJT05TLnNvdXJjZV90bXAsIHNvdXJjZV96aXAgPSBjb21tb24uVW56aXBUZW1wKAotICAgICAgICBPUFRJT05TLmluY3JlbWVudGFsX3NvdXJjZSwKLSAgICAgICAgVU5aSVBfUEFUVEVSTikKLSAgICBPUFRJT05TLnRhcmdldF9pbmZvX2RpY3QgPSBPUFRJT05TLmluZm9fZGljdAotICAgIE9QVElPTlMuc291cmNlX2luZm9fZGljdCA9IGNvbW1vbi5Mb2FkSW5mb0RpY3Qoc291cmNlX3ppcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QVElPTlMuc291cmNlX3RtcCkKLSAgICBpZiBPUFRJT05TLnZlcmJvc2U6Ci0gICAgICBwcmludCgiLS0tIHNvdXJjZSBpbmZvIC0tLSIpCi0gICAgICBjb21tb24uRHVtcEluZm9EaWN0KE9QVElPTlMuc291cmNlX2luZm9fZGljdCkKLSAgICB0cnk6Ci0gICAgICBXcml0ZUJsb2NrSW5jcmVtZW50YWxPVEFQYWNrYWdlKGlucHV0X3ppcCwgc291cmNlX3ppcCwgb3V0cHV0X3ppcCkKLSAgICAgIGlmIE9QVElPTlMubG9nX2RpZmY6Ci0gICAgICAgIG91dF9maWxlID0gb3BlbihPUFRJT05TLmxvZ19kaWZmLCAndycpCisgICAgT1BUSU9OUy5zb3VyY2VfdG1wID0gY29tbW9uLlVuemlwVGVtcCgKKyAgICAgICAgT1BUSU9OUy5pbmNyZW1lbnRhbF9zb3VyY2UsIFVOWklQX1BBVFRFUk4pCisgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoYXJnc1swXSwgJ3InKSBhcyBpbnB1dF96aXAsIFwKKyAgICAgICAgemlwZmlsZS5aaXBGaWxlKE9QVElPTlMuaW5jcmVtZW50YWxfc291cmNlLCAncicpIGFzIHNvdXJjZV96aXA6CisgICAgICBXcml0ZUJsb2NrSW5jcmVtZW50YWxPVEFQYWNrYWdlKAorICAgICAgICAgIGlucHV0X3ppcCwKKyAgICAgICAgICBzb3VyY2VfemlwLAorICAgICAgICAgIG91dHB1dF9maWxlPWFyZ3NbMV0pCisKKyAgICBpZiBPUFRJT05TLmxvZ19kaWZmOgorICAgICAgd2l0aCBvcGVuKE9QVElPTlMubG9nX2RpZmYsICd3JykgYXMgb3V0X2ZpbGU6CiAgICAgICAgIGltcG9ydCB0YXJnZXRfZmlsZXNfZGlmZgotICAgICAgICB0YXJnZXRfZmlsZXNfZGlmZi5yZWN1cnNpdmVEaWZmKCcnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QVElPTlMuc291cmNlX3RtcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUFRJT05TLmlucHV0X3RtcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRfZmlsZSkKLSAgICAgICAgb3V0X2ZpbGUuY2xvc2UoKQotICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgotICAgICAgaWYgbm90IE9QVElPTlMuZmFsbGJhY2tfdG9fZnVsbDoKLSAgICAgICAgcmFpc2UKLSAgICAgIHByaW50KCItLS0gZmFpbGVkIHRvIGJ1aWxkIGluY3JlbWVudGFsOyBmYWxsaW5nIGJhY2sgdG8gZnVsbCAtLS0iKQotICAgICAgT1BUSU9OUy5pbmNyZW1lbnRhbF9zb3VyY2UgPSBOb25lCi0gICAgICBXcml0ZUZ1bGxPVEFQYWNrYWdlKGlucHV0X3ppcCwgb3V0cHV0X3ppcCkKLQotICBjb21tb24uWmlwQ2xvc2Uob3V0cHV0X3ppcCkKLQotICAjIFNpZ24gdGhlIGdlbmVyYXRlZCB6aXAgcGFja2FnZSB1bmxlc3Mgbm9fc2lnbmluZyBpcyBzcGVjaWZpZWQuCi0gIGlmIG5vdCBPUFRJT05TLm5vX3NpZ25pbmc6Ci0gICAgU2lnbk91dHB1dCh0ZW1wX3ppcF9maWxlLm5hbWUsIGFyZ3NbMV0pCi0gICAgdGVtcF96aXBfZmlsZS5jbG9zZSgpCisgICAgICAgIHRhcmdldF9maWxlc19kaWZmLnJlY3Vyc2l2ZURpZmYoCisgICAgICAgICAgICAnJywgT1BUSU9OUy5zb3VyY2VfdG1wLCBPUFRJT05TLmlucHV0X3RtcCwgb3V0X2ZpbGUpCiAKICAgcHJpbnQoImRvbmUuIikKIApkaWZmIC0tZ2l0IGEvdG9vbHMvcmVsZWFzZXRvb2xzL3B5bGludHJjIGIvdG9vbHMvcmVsZWFzZXRvb2xzL3B5bGludHJjCmluZGV4IDkwZGUxYWYuLjdiMzQwNWMgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3JlbGVhc2V0b29scy9weWxpbnRyYworKysgYi90b29scy9yZWxlYXNldG9vbHMvcHlsaW50cmMKQEAgLTE0NCw5ICsxNDQsNiBAQAogCiBbQkFTSUNdCiAKLSMgUmVxdWlyZWQgYXR0cmlidXRlcyBmb3IgbW9kdWxlLCBzZXBhcmF0ZWQgYnkgYSBjb21tYQotcmVxdWlyZWQtYXR0cmlidXRlcz0KLQogIyBMaXN0IG9mIGJ1aWx0aW5zIGZ1bmN0aW9uIG5hbWVzIHRoYXQgc2hvdWxkIG5vdCBiZSB1c2VkLCBzZXBhcmF0ZWQgYnkgYSBjb21tYQogYmFkLWZ1bmN0aW9ucz1tYXAsZmlsdGVyLGlucHV0CiAKQEAgLTM1NywxMCArMzU0LDYgQEAKIAogW0NMQVNTRVNdCiAKLSMgTGlzdCBvZiBpbnRlcmZhY2UgbWV0aG9kcyB0byBpZ25vcmUsIHNlcGFyYXRlZCBieSBhIGNvbW1hLiBUaGlzIGlzIHVzZWQgZm9yCi0jIGluc3RhbmNlIHRvIG5vdCBjaGVjayBtZXRob2RzIGRlZmluZXMgaW4gWm9wZSdzIEludGVyZmFjZSBiYXNlIGNsYXNzLgotaWdub3JlLWlmYWNlLW1ldGhvZHM9aXNJbXBsZW1lbnRlZEJ5LGRlZmVycmVkLGV4dGVuZHMsbmFtZXMsbmFtZXNBbmREZXNjcmlwdGlvbnMscXVlcnlEZXNjcmlwdGlvbkZvcixnZXRCYXNlcyxnZXREZXNjcmlwdGlvbkZvcixnZXREb2MsZ2V0TmFtZSxnZXRUYWdnZWRWYWx1ZSxnZXRUYWdnZWRWYWx1ZVRhZ3MsaXNFcXVhbE9yRXh0ZW5kZWRCeSxzZXRUYWdnZWRWYWx1ZSxpc0ltcGxlbWVudGVkQnlJbnN0YW5jZXNPZixhZGFwdFdpdGgsaXNfaW1wbGVtZW50ZWRfYnkKLQogIyBMaXN0IG9mIG1ldGhvZCBuYW1lcyB1c2VkIHRvIGRlY2xhcmUgKGkuZS4gYXNzaWduKSBpbnN0YW5jZSBhdHRyaWJ1dGVzLgogZGVmaW5pbmctYXR0ci1tZXRob2RzPV9faW5pdF9fLF9fbmV3X18sc2V0VXAKIApkaWZmIC0tZ2l0IGEvdG9vbHMvcmVsZWFzZXRvb2xzL3JhbmdlbGliLnB5IGIvdG9vbHMvcmVsZWFzZXRvb2xzL3JhbmdlbGliLnB5CmluZGV4IGZhNmVlYzEuLjM2YmVjZjQgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3JlbGVhc2V0b29scy9yYW5nZWxpYi5weQorKysgYi90b29scy9yZWxlYXNldG9vbHMvcmFuZ2VsaWIucHkKQEAgLTEzLDE4ICsxMywyNiBAQAogIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBwcmludF9mdW5jdGlvbgorCiBpbXBvcnQgaGVhcHEKIGltcG9ydCBpdGVydG9vbHMKIAorCiBfX2FsbF9fID0gWyJSYW5nZVNldCJdCiAKKwogY2xhc3MgUmFuZ2VTZXQob2JqZWN0KToKLSAgIiIiQSBSYW5nZVNldCByZXByZXNlbnRzIGEgc2V0IG9mIG5vbm92ZXJsYXBwaW5nIHJhbmdlcyBvbiB0aGUKLSAgaW50ZWdlcnMgKGllLCBhIHNldCBvZiBpbnRlZ2VycywgYnV0IGVmZmljaWVudCB3aGVuIHRoZSBzZXQgY29udGFpbnMKLSAgbG90cyBvZiBydW5zLiIiIgorICAiIiJBIFJhbmdlU2V0IHJlcHJlc2VudHMgYSBzZXQgb2Ygbm9uLW92ZXJsYXBwaW5nIHJhbmdlcyBvbiBpbnRlZ2Vycy4KKworICBBdHRyaWJ1dGVzOgorICAgIG1vbm90b25pYzogV2hldGhlciB0aGUgaW5wdXQgaGFzIGFsbCBpdHMgaW50ZWdlcnMgaW4gaW5jcmVhc2luZyBvcmRlci4KKyAgICBleHRyYTogQSBkaWN0IHRoYXQgY2FuIGJlIHVzZWQgYnkgdGhlIGNhbGxlciwgZS5nLiB0byBzdG9yZSBpbmZvIHRoYXQncworICAgICAgICBvbmx5IG1lYW5pbmdmdWwgdG8gY2FsbGVyLgorICAiIiIKIAogICBkZWYgX19pbml0X18oc2VsZiwgZGF0YT1Ob25lKToKICAgICBzZWxmLm1vbm90b25pYyA9IEZhbHNlCisgICAgc2VsZi5fZXh0cmEgPSB7fQogICAgIGlmIGlzaW5zdGFuY2UoZGF0YSwgc3RyKToKICAgICAgIHNlbGYuX3BhcnNlX2ludGVybmFsKGRhdGEpCiAgICAgZWxpZiBkYXRhOgpAQCAtNTYsMTggKzY0LDI0IEBACiAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICByZXR1cm4gJzxSYW5nZVNldCgiJyArIHNlbGYudG9fc3RyaW5nKCkgKyAnIik+JwogCisgIEBwcm9wZXJ0eQorICBkZWYgZXh0cmEoc2VsZik6CisgICAgcmV0dXJuIHNlbGYuX2V4dHJhCisKICAgQGNsYXNzbWV0aG9kCiAgIGRlZiBwYXJzZShjbHMsIHRleHQpOgotICAgICIiIlBhcnNlIGEgdGV4dCBzdHJpbmcgY29uc2lzdGluZyBvZiBhIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mCi0gICAgYmxvY2tzIGFuZCByYW5nZXMsIGVnICIxMC0yMCAzMCAzNS00MCIuICBSYW5nZXMgYXJlIGludGVycHJldGVkIHRvCi0gICAgaW5jbHVkZSBib3RoIHRoZWlyIGVuZHMgKHNvIHRoZSBhYm92ZSBleGFtcGxlIHJlcHJlc2VudHMgMTgKLSAgICBpbmRpdmlkdWFsIGJsb2Nrcy4gIFJldHVybnMgYSBSYW5nZVNldCBvYmplY3QuCisgICAgIiIiUGFyc2VzIGEgdGV4dCBzdHJpbmcgaW50byBhIFJhbmdlU2V0LgogCi0gICAgSWYgdGhlIGlucHV0IGhhcyBhbGwgaXRzIGJsb2NrcyBpbiBpbmNyZWFzaW5nIG9yZGVyLCB0aGVuIHJldHVybmVkCi0gICAgUmFuZ2VTZXQgd2lsbCBoYXZlIGFuIGV4dHJhIGF0dHJpYnV0ZSAnbW9ub3RvbmljJyB0aGF0IGlzIHNldCB0bwotICAgIFRydWUuICBGb3IgZXhhbXBsZSB0aGUgaW5wdXQgIjEwLTIwIDMwIiBpcyBtb25vdG9uaWMsIGJ1dCB0aGUgaW5wdXQKLSAgICAiMTUtMjAgMzAgMTAtMTQiIGlzIG5vdCwgZXZlbiB0aG91Z2ggdGhleSByZXByZXNlbnQgdGhlIHNhbWUgc2V0Ci0gICAgb2YgYmxvY2tzIChhbmQgdGhlIHR3byBSYW5nZVNldHMgd2lsbCBjb21wYXJlIGVxdWFsIHdpdGggPT0pLgorICAgIFRoZSBpbnB1dCB0ZXh0IHN0cmluZyBjb25zaXN0cyBvZiBhIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIGJsb2NrcyBhbmQKKyAgICByYW5nZXMsIGUuZy4gIjEwLTIwIDMwIDM1LTQwIi4gUmFuZ2VzIGFyZSBpbnRlcnByZXRlZCB0byBpbmNsdWRlIGJvdGggdGhlaXIKKyAgICBlbmRzIChzbyB0aGUgYWJvdmUgZXhhbXBsZSByZXByZXNlbnRzIDE4IGluZGl2aWR1YWwgYmxvY2tzKS4gUmV0dXJucyBhCisgICAgUmFuZ2VTZXQgb2JqZWN0LgorCisgICAgSWYgdGhlIGlucHV0IGhhcyBhbGwgaXRzIGJsb2NrcyBpbiBpbmNyZWFzaW5nIG9yZGVyLCB0aGVuIHRoZSAnbW9ub3RvbmljJworICAgIGF0dHJpYnV0ZSBvZiB0aGUgcmV0dXJuZWQgUmFuZ2VTZXQgd2lsbCBiZSBzZXQgdG8gVHJ1ZS4gRm9yIGV4YW1wbGUgdGhlCisgICAgaW5wdXQgIjEwLTIwIDMwIiBpcyBtb25vdG9uaWMsIGJ1dCB0aGUgaW5wdXQgIjE1LTIwIDMwIDEwLTE0IiBpcyBub3QsIGV2ZW4KKyAgICB0aG91Z2ggdGhleSByZXByZXNlbnQgdGhlIHNhbWUgc2V0IG9mIGJsb2NrcyAoYW5kIHRoZSB0d28gUmFuZ2VTZXRzIHdpbGwKKyAgICBjb21wYXJlIGVxdWFsIHdpdGggPT0pLgogICAgICIiIgogICAgIHJldHVybiBjbHModGV4dCkKIApAQCAtMzIwLDcgKzMzNCw3IEBACiAgICAgWzAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDldCiAgICAgPj4+IGxpc3QoUmFuZ2VTZXQoIjEwLTE5IDMtNSIpLm5leHRfaXRlbSgpKQogICAgIFszLCA0LCA1LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LCAxNiwgMTcsIDE4LCAxOV0KLSAgICA+Pj4gbGlzdChyYW5nZWxpYi5SYW5nZVNldCgiMTAtMTkgMyA1IDciKS5uZXh0X2l0ZW0oKSkKKyAgICA+Pj4gbGlzdChSYW5nZVNldCgiMTAtMTkgMyA1IDciKS5uZXh0X2l0ZW0oKSkKICAgICBbMywgNSwgNywgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwgMTYsIDE3LCAxOCwgMTldCiAgICAgIiIiCiAgICAgZm9yIHMsIGUgaW4gc2VsZjoKZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbGVhc2V0b29scy9zaWduX3RhcmdldF9maWxlc19hcGtzLnB5IGIvdG9vbHMvcmVsZWFzZXRvb2xzL3NpZ25fdGFyZ2V0X2ZpbGVzX2Fwa3MucHkKaW5kZXggODNjMjQ4Ny4uZmE2MmM4ZiAxMDA3NTUKLS0tIGEvdG9vbHMvcmVsZWFzZXRvb2xzL3NpZ25fdGFyZ2V0X2ZpbGVzX2Fwa3MucHkKKysrIGIvdG9vbHMvcmVsZWFzZXRvb2xzL3NpZ25fdGFyZ2V0X2ZpbGVzX2Fwa3MucHkKQEAgLTkwLDE0ICs5MCw5IEBACiAgICAgICB0aGUgZXhpc3Rpbmcgb25lcyBpbiBpbmZvIGRpY3QuCiAiIiIKIAotaW1wb3J0IHN5cwotCi1pZiBzeXMuaGV4dmVyc2lvbiA8IDB4MDIwNzAwMDA6Ci0gIHByaW50ID4+IHN5cy5zdGRlcnIsICJQeXRob24gMi43IG9yIG5ld2VyIGlzIHJlcXVpcmVkLiIKLSAgc3lzLmV4aXQoMSkKK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgcHJpbnRfZnVuY3Rpb24KIAogaW1wb3J0IGJhc2U2NAotaW1wb3J0IGNTdHJpbmdJTwogaW1wb3J0IGNvcHkKIGltcG9ydCBlcnJubwogaW1wb3J0IGd6aXAKQEAgLTEwNiwxMiArMTAxLDIwIEBACiBpbXBvcnQgc2h1dGlsCiBpbXBvcnQgc3RhdAogaW1wb3J0IHN1YnByb2Nlc3MKK2ltcG9ydCBzeXMKIGltcG9ydCB0ZW1wZmlsZQogaW1wb3J0IHppcGZpbGUKK2Zyb20geG1sLmV0cmVlIGltcG9ydCBFbGVtZW50VHJlZQogCiBpbXBvcnQgYWRkX2ltZ190b190YXJnZXRfZmlsZXMKIGltcG9ydCBjb21tb24KIAorCitpZiBzeXMuaGV4dmVyc2lvbiA8IDB4MDIwNzAwMDA6CisgIHByaW50KCJQeXRob24gMi43IG9yIG5ld2VyIGlzIHJlcXVpcmVkLiIsIGZpbGU9c3lzLnN0ZGVycikKKyAgc3lzLmV4aXQoMSkKKworCiBPUFRJT05TID0gY29tbW9uLk9QVElPTlMKIAogT1BUSU9OUy5leHRyYV9hcGtzID0ge30KQEAgLTEyNiw2ICsxMjksNyBAQAogT1BUSU9OUy5hdmJfYWxnb3JpdGhtcyA9IHt9CiBPUFRJT05TLmF2Yl9leHRyYV9hcmdzID0ge30KIAorCiBkZWYgR2V0QXBrQ2VydHMoY2VydG1hcCk6CiAgICMgYXBwbHkgdGhlIGtleSByZW1hcHBpbmcgdG8gdGhlIGNvbnRlbnRzIG9mIHRoZSBmaWxlCiAgIGZvciBhcGssIGNlcnQgaW4gY2VydG1hcC5pdGVyaXRlbXMoKToKQEAgLTE0OSwxNyArMTUzLDE4IEBACiAgICAgY29tcHJlc3NlZF9hcGtfZXh0ZW5zaW9uID0gIi5hcGsiICsgY29tcHJlc3NlZF9leHRlbnNpb24KICAgZm9yIGluZm8gaW4gaW5wdXRfdGZfemlwLmluZm9saXN0KCk6CiAgICAgaWYgKGluZm8uZmlsZW5hbWUuZW5kc3dpdGgoIi5hcGsiKSBvcgotICAgICAgICAoY29tcHJlc3NlZF9hcGtfZXh0ZW5zaW9uIGFuZCBpbmZvLmZpbGVuYW1lLmVuZHN3aXRoKGNvbXByZXNzZWRfYXBrX2V4dGVuc2lvbikpKToKKyAgICAgICAgKGNvbXByZXNzZWRfYXBrX2V4dGVuc2lvbiBhbmQKKyAgICAgICAgIGluZm8uZmlsZW5hbWUuZW5kc3dpdGgoY29tcHJlc3NlZF9hcGtfZXh0ZW5zaW9uKSkpOgogICAgICAgbmFtZSA9IG9zLnBhdGguYmFzZW5hbWUoaW5mby5maWxlbmFtZSkKICAgICAgIGlmIGNvbXByZXNzZWRfYXBrX2V4dGVuc2lvbiBhbmQgbmFtZS5lbmRzd2l0aChjb21wcmVzc2VkX2Fwa19leHRlbnNpb24pOgogICAgICAgICBuYW1lID0gbmFtZVs6LWxlbihjb21wcmVzc2VkX2V4dGVuc2lvbildCiAgICAgICBpZiBuYW1lIG5vdCBpbiBhcGtfa2V5X21hcDoKICAgICAgICAgdW5rbm93bl9hcGtzLmFwcGVuZChuYW1lKQogICBpZiB1bmtub3duX2Fwa3M6Ci0gICAgcHJpbnQgIkVSUk9SOiBubyBrZXkgc3BlY2lmaWVkIGZvcjpcblxuICIsCi0gICAgcHJpbnQgIlxuICAiLmpvaW4odW5rbm93bl9hcGtzKQotICAgIHByaW50ICJcblVzZSAnLWUgPGFwa25hbWU+PScgdG8gc3BlY2lmeSBhIGtleSAod2hpY2ggbWF5IGJlIGFuIgotICAgIHByaW50ICJlbXB0eSBzdHJpbmcgdG8gbm90IHNpZ24gdGhpcyBhcGspLiIKKyAgICBwcmludCgiRVJST1I6IG5vIGtleSBzcGVjaWZpZWQgZm9yOlxuIikKKyAgICBwcmludCgiICAiICsgIlxuICAiLmpvaW4odW5rbm93bl9hcGtzKSkKKyAgICBwcmludCgiXG5Vc2UgJy1lIDxhcGtuYW1lPj0nIHRvIHNwZWNpZnkgYSBrZXkgKHdoaWNoIG1heSBiZSBhbiBlbXB0eSAiCisgICAgICAgICAgInN0cmluZyB0byBub3Qgc2lnbiB0aGlzIGFwaykuIikKICAgICBzeXMuZXhpdCgxKQogCiAKQEAgLTE3MSw3ICsxNzYsOCBAQAogCiAgIGlmIGlzX2NvbXByZXNzZWQ6CiAgICAgdW5jb21wcmVzc2VkID0gdGVtcGZpbGUuTmFtZWRUZW1wb3JhcnlGaWxlKCkKLSAgICB3aXRoIGd6aXAub3Blbih1bnNpZ25lZC5uYW1lLCAicmIiKSBhcyBpbl9maWxlLCBvcGVuKHVuY29tcHJlc3NlZC5uYW1lLCAid2IiKSBhcyBvdXRfZmlsZToKKyAgICB3aXRoIGd6aXAub3Blbih1bnNpZ25lZC5uYW1lLCAicmIiKSBhcyBpbl9maWxlLCBcCisgICAgICAgICBvcGVuKHVuY29tcHJlc3NlZC5uYW1lLCAid2IiKSBhcyBvdXRfZmlsZToKICAgICAgIHNodXRpbC5jb3B5ZmlsZW9iaihpbl9maWxlLCBvdXRfZmlsZSkKIAogICAgICMgRmluYWxseSwgY2xvc2UgdGhlICJ1bnNpZ25lZCIgZmlsZSAod2hpY2ggaXMgZ3ppcCBjb21wcmVzc2VkKSwgYW5kIHRoZW4KQEAgLTIwMywxNCArMjA5LDE1IEBACiAgICAgbWluX2FwaV9sZXZlbCA9IDEKIAogICBjb21tb24uU2lnbkZpbGUodW5zaWduZWQubmFtZSwgc2lnbmVkLm5hbWUsIGtleW5hbWUsIHB3LAotICAgICAgbWluX2FwaV9sZXZlbD1taW5fYXBpX2xldmVsLAotICAgICAgY29kZW5hbWVfdG9fYXBpX2xldmVsX21hcD1jb2RlbmFtZV90b19hcGlfbGV2ZWxfbWFwKQorICAgICAgICAgICAgICAgICAgbWluX2FwaV9sZXZlbD1taW5fYXBpX2xldmVsLAorICAgICAgICAgICAgICAgICAgY29kZW5hbWVfdG9fYXBpX2xldmVsX21hcD1jb2RlbmFtZV90b19hcGlfbGV2ZWxfbWFwKQogCi0gIGRhdGEgPSBOb25lOworICBkYXRhID0gTm9uZQogICBpZiBpc19jb21wcmVzc2VkOgogICAgICMgUmVjb21wcmVzcyB0aGUgZmlsZSBhZnRlciBpdCBoYXMgYmVlbiBzaWduZWQuCiAgICAgY29tcHJlc3NlZCA9IHRlbXBmaWxlLk5hbWVkVGVtcG9yYXJ5RmlsZSgpCi0gICAgd2l0aCBvcGVuKHNpZ25lZC5uYW1lLCAicmIiKSBhcyBpbl9maWxlLCBnemlwLm9wZW4oY29tcHJlc3NlZC5uYW1lLCAid2IiKSBhcyBvdXRfZmlsZToKKyAgICB3aXRoIG9wZW4oc2lnbmVkLm5hbWUsICJyYiIpIGFzIGluX2ZpbGUsIFwKKyAgICAgICAgIGd6aXAub3Blbihjb21wcmVzc2VkLm5hbWUsICJ3YiIpIGFzIG91dF9maWxlOgogICAgICAgc2h1dGlsLmNvcHlmaWxlb2JqKGluX2ZpbGUsIG91dF9maWxlKQogCiAgICAgZGF0YSA9IGNvbXByZXNzZWQucmVhZCgpCkBAIC0yMzMsMTAgKzI0MCwxMSBAQAogICBpZiBjb21wcmVzc2VkX2V4dGVuc2lvbjoKICAgICBjb21wcmVzc2VkX2Fwa19leHRlbnNpb24gPSAiLmFwayIgKyBjb21wcmVzc2VkX2V4dGVuc2lvbgogCi0gIG1heHNpemUgPSBtYXgoW2xlbihvcy5wYXRoLmJhc2VuYW1lKGkuZmlsZW5hbWUpKQotICAgICAgICAgICAgICAgICBmb3IgaSBpbiBpbnB1dF90Zl96aXAuaW5mb2xpc3QoKQotICAgICAgICAgICAgICAgICBpZiBpLmZpbGVuYW1lLmVuZHN3aXRoKCcuYXBrJykgb3IKLSAgICAgICAgICAgICAgICAgKGNvbXByZXNzZWRfYXBrX2V4dGVuc2lvbiBhbmQgaS5maWxlbmFtZS5lbmRzd2l0aChjb21wcmVzc2VkX2Fwa19leHRlbnNpb24pKV0pCisgIG1heHNpemUgPSBtYXgoCisgICAgICBbbGVuKG9zLnBhdGguYmFzZW5hbWUoaS5maWxlbmFtZSkpIGZvciBpIGluIGlucHV0X3RmX3ppcC5pbmZvbGlzdCgpCisgICAgICAgaWYgKGkuZmlsZW5hbWUuZW5kc3dpdGgoJy5hcGsnKSBvcgorICAgICAgICAgICAoY29tcHJlc3NlZF9hcGtfZXh0ZW5zaW9uIGFuZAorICAgICAgICAgICAgaS5maWxlbmFtZS5lbmRzd2l0aChjb21wcmVzc2VkX2Fwa19leHRlbnNpb24pKSldKQogICBzeXN0ZW1fcm9vdF9pbWFnZSA9IG1pc2NfaW5mby5nZXQoInN5c3RlbV9yb290X2ltYWdlIikgPT0gInRydWUiCiAKICAgZm9yIGluZm8gaW4gaW5wdXRfdGZfemlwLmluZm9saXN0KCk6CkBAIC0yNDgsMjEgKzI1NiwyMyBAQAogCiAgICAgIyBTaWduIEFQS3MuCiAgICAgaWYgKGluZm8uZmlsZW5hbWUuZW5kc3dpdGgoIi5hcGsiKSBvcgotICAgICAgICAoY29tcHJlc3NlZF9hcGtfZXh0ZW5zaW9uIGFuZCBpbmZvLmZpbGVuYW1lLmVuZHN3aXRoKGNvbXByZXNzZWRfYXBrX2V4dGVuc2lvbikpKToKLSAgICAgIGlzX2NvbXByZXNzZWQgPSBjb21wcmVzc2VkX2V4dGVuc2lvbiBhbmQgaW5mby5maWxlbmFtZS5lbmRzd2l0aChjb21wcmVzc2VkX2Fwa19leHRlbnNpb24pCisgICAgICAgIChjb21wcmVzc2VkX2Fwa19leHRlbnNpb24gYW5kCisgICAgICAgICBpbmZvLmZpbGVuYW1lLmVuZHN3aXRoKGNvbXByZXNzZWRfYXBrX2V4dGVuc2lvbikpKToKKyAgICAgIGlzX2NvbXByZXNzZWQgPSAoY29tcHJlc3NlZF9leHRlbnNpb24gYW5kCisgICAgICAgICAgICAgICAgICAgICAgIGluZm8uZmlsZW5hbWUuZW5kc3dpdGgoY29tcHJlc3NlZF9hcGtfZXh0ZW5zaW9uKSkKICAgICAgIG5hbWUgPSBvcy5wYXRoLmJhc2VuYW1lKGluZm8uZmlsZW5hbWUpCiAgICAgICBpZiBpc19jb21wcmVzc2VkOgogICAgICAgICBuYW1lID0gbmFtZVs6LWxlbihjb21wcmVzc2VkX2V4dGVuc2lvbildCiAKICAgICAgIGtleSA9IGFwa19rZXlfbWFwW25hbWVdCiAgICAgICBpZiBrZXkgbm90IGluIGNvbW1vbi5TUEVDSUFMX0NFUlRfU1RSSU5HUzoKLSAgICAgICAgcHJpbnQgIiAgICBzaWduaW5nOiAlLSpzICglcykiICUgKG1heHNpemUsIG5hbWUsIGtleSkKKyAgICAgICAgcHJpbnQoIiAgICBzaWduaW5nOiAlLSpzICglcykiICUgKG1heHNpemUsIG5hbWUsIGtleSkpCiAgICAgICAgIHNpZ25lZF9kYXRhID0gU2lnbkFwayhkYXRhLCBrZXksIGtleV9wYXNzd29yZHNba2V5XSwgcGxhdGZvcm1fYXBpX2xldmVsLAotICAgICAgICAgICAgY29kZW5hbWVfdG9fYXBpX2xldmVsX21hcCwgaXNfY29tcHJlc3NlZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVuYW1lX3RvX2FwaV9sZXZlbF9tYXAsIGlzX2NvbXByZXNzZWQpCiAgICAgICAgIGNvbW1vbi5aaXBXcml0ZVN0cihvdXRwdXRfdGZfemlwLCBvdXRfaW5mbywgc2lnbmVkX2RhdGEpCiAgICAgICBlbHNlOgogICAgICAgICAjIGFuIEFQSyB3ZSdyZSBub3Qgc3VwcG9zZWQgdG8gc2lnbi4KLSAgICAgICAgcHJpbnQgIk5PVCBzaWduaW5nOiAlcyIgJSAobmFtZSwpCisgICAgICAgIHByaW50KCJOT1Qgc2lnbmluZzogJXMiICUgKG5hbWUsKSkKICAgICAgICAgY29tbW9uLlppcFdyaXRlU3RyKG91dHB1dF90Zl96aXAsIG91dF9pbmZvLCBkYXRhKQogCiAgICAgIyBTeXN0ZW0gcHJvcGVydGllcy4KQEAgLTI3NCwxNSArMjg0LDE3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUk9PVC9kZWZhdWx0LnByb3AiLCAgIyBsZWdhY3kKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSRUNPVkVSWS9SQU1ESVNLL3Byb3AuZGVmYXVsdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUkVDT1ZFUlkvUkFNRElTSy9kZWZhdWx0LnByb3AiKTogICMgbGVnYWN5Ci0gICAgICBwcmludCAicmV3cml0aW5nICVzOiIgJSAoaW5mby5maWxlbmFtZSwpCisgICAgICBwcmludCgiUmV3cml0aW5nICVzOiIgJSAoaW5mby5maWxlbmFtZSwpKQogICAgICAgaWYgc3RhdC5TX0lTTE5LKGluZm8uZXh0ZXJuYWxfYXR0ciA+PiAxNik6CiAgICAgICAgIG5ld19kYXRhID0gZGF0YQogICAgICAgZWxzZToKLSAgICAgICAgbmV3X2RhdGEgPSBSZXdyaXRlUHJvcHMoZGF0YSwgbWlzY19pbmZvKQorICAgICAgICBuZXdfZGF0YSA9IFJld3JpdGVQcm9wcyhkYXRhKQogICAgICAgY29tbW9uLlppcFdyaXRlU3RyKG91dHB1dF90Zl96aXAsIG91dF9pbmZvLCBuZXdfZGF0YSkKIAorICAgICMgUmVwbGFjZSB0aGUgY2VydHMgaW4gKm1hY19wZXJtaXNzaW9ucy54bWwgKHRoZXJlIGNvdWxkIGJlIG11bHRpcGxlLCBzdWNoCisgICAgIyBhcyB7c3lzdGVtLHZlbmRvcn0vZXRjL3NlbGludXgve3BsYXQsbm9ucGxhdH1fbWFjX3Blcm1pc3Npb25zLnhtbCkuCiAgICAgZWxpZiBpbmZvLmZpbGVuYW1lLmVuZHN3aXRoKCJtYWNfcGVybWlzc2lvbnMueG1sIik6Ci0gICAgICBwcmludCAicmV3cml0aW5nICVzIHdpdGggbmV3IGtleXMuIiAlIChpbmZvLmZpbGVuYW1lLCkKKyAgICAgIHByaW50KCJSZXdyaXRpbmcgJXMgd2l0aCBuZXcga2V5cy4iICUgKGluZm8uZmlsZW5hbWUsKSkKICAgICAgIG5ld19kYXRhID0gUmVwbGFjZUNlcnRzKGRhdGEpCiAgICAgICBjb21tb24uWmlwV3JpdGVTdHIob3V0cHV0X3RmX3ppcCwgb3V0X2luZm8sIG5ld19kYXRhKQogCkBAIC0zMzMsMTAgKzM0NSw3IEBACiAgICAgUmVwbGFjZVZlcml0eVByaXZhdGVLZXkobWlzY19pbmZvLCBPUFRJT05TLnJlcGxhY2VfdmVyaXR5X3ByaXZhdGVfa2V5WzFdKQogCiAgIGlmIE9QVElPTlMucmVwbGFjZV92ZXJpdHlfcHVibGljX2tleToKLSAgICBpZiBzeXN0ZW1fcm9vdF9pbWFnZToKLSAgICAgIGRlc3QgPSAiUk9PVC92ZXJpdHlfa2V5IgotICAgIGVsc2U6Ci0gICAgICBkZXN0ID0gIkJPT1QvUkFNRElTSy92ZXJpdHlfa2V5IgorICAgIGRlc3QgPSAiUk9PVC92ZXJpdHlfa2V5IiBpZiBzeXN0ZW1fcm9vdF9pbWFnZSBlbHNlICJCT09UL1JBTURJU0svdmVyaXR5X2tleSIKICAgICAjIFdlIGFyZSByZXBsYWNpbmcgdGhlIG9uZSBpbiBib290IGltYWdlIG9ubHksIHNpbmNlIHRoZSBvbmUgdW5kZXIKICAgICAjIHJlY292ZXJ5IHdvbid0IGV2ZXIgYmUgbmVlZGVkLgogICAgIFJlcGxhY2VWZXJpdHlQdWJsaWNLZXkoCkBAIC0zNTUsMzggKzM2NCw2NyBAQAogCiAKIGRlZiBSZXBsYWNlQ2VydHMoZGF0YSk6Ci0gICIiIkdpdmVuIGEgc3RyaW5nIG9mIGRhdGEsIHJlcGxhY2UgYWxsIG9jY3VyZW5jZXMgb2YgYSBzZXQKLSAgb2YgWDUwOSBjZXJ0cyB3aXRoIGEgbmV3ZXIgc2V0IG9mIFg1MDkgY2VydHMgYW5kIHJldHVybgotICB0aGUgdXBkYXRlZCBkYXRhIHN0cmluZy4iIiIKLSAgZm9yIG9sZCwgbmV3IGluIE9QVElPTlMua2V5X21hcC5pdGVyaXRlbXMoKToKLSAgICB0cnk6Ci0gICAgICBpZiBPUFRJT05TLnZlcmJvc2U6Ci0gICAgICAgIHByaW50ICIgICAgUmVwbGFjaW5nICVzLng1MDkucGVtIHdpdGggJXMueDUwOS5wZW0iICUgKG9sZCwgbmV3KQotICAgICAgZiA9IG9wZW4ob2xkICsgIi54NTA5LnBlbSIpCi0gICAgICBvbGRfY2VydDE2ID0gYmFzZTY0LmIxNmVuY29kZShjb21tb24uUGFyc2VDZXJ0aWZpY2F0ZShmLnJlYWQoKSkpLmxvd2VyKCkKLSAgICAgIGYuY2xvc2UoKQotICAgICAgZiA9IG9wZW4obmV3ICsgIi54NTA5LnBlbSIpCi0gICAgICBuZXdfY2VydDE2ID0gYmFzZTY0LmIxNmVuY29kZShjb21tb24uUGFyc2VDZXJ0aWZpY2F0ZShmLnJlYWQoKSkpLmxvd2VyKCkKLSAgICAgIGYuY2xvc2UoKQotICAgICAgIyBPbmx5IG1hdGNoIGVudGlyZSBjZXJ0cy4KLSAgICAgIHBhdHRlcm4gPSAiXFxiIitvbGRfY2VydDE2KyJcXGIiCi0gICAgICAoZGF0YSwgbnVtKSA9IHJlLnN1Ym4ocGF0dGVybiwgbmV3X2NlcnQxNiwgZGF0YSwgZmxhZ3M9cmUuSUdOT1JFQ0FTRSkKLSAgICAgIGlmIE9QVElPTlMudmVyYm9zZToKLSAgICAgICAgcHJpbnQgIiAgICBSZXBsYWNlZCAlZCBvY2N1cmVuY2Uocykgb2YgJXMueDUwOS5wZW0gd2l0aCAiIFwKLSAgICAgICAgICAgICIlcy54NTA5LnBlbSIgJSAobnVtLCBvbGQsIG5ldykKLSAgICBleGNlcHQgSU9FcnJvciBhcyBlOgotICAgICAgaWYgZS5lcnJubyA9PSBlcnJuby5FTk9FTlQgYW5kIG5vdCBPUFRJT05TLnZlcmJvc2U6Ci0gICAgICAgIGNvbnRpbnVlCisgICIiIlJlcGxhY2VzIGFsbCB0aGUgb2NjdXJlbmNlcyBvZiBYLjUwOSBjZXJ0cyB3aXRoIHRoZSBuZXcgb25lcy4KIAotICAgICAgcHJpbnQgIiAgICBFcnJvciBhY2Nlc3NpbmcgJXMuICVzLiBTa2lwIHJlcGxhY2luZyAlcy54NTA5LnBlbSAiIFwKLSAgICAgICAgICAid2l0aCAlcy54NTA5LnBlbS4iICUgKGUuZmlsZW5hbWUsIGUuc3RyZXJyb3IsIG9sZCwgbmV3KQorICBUaGUgbWFwcGluZyBpbmZvIGlzIHJlYWQgZnJvbSBPUFRJT05TLmtleV9tYXAuIE5vbi1leGlzdGVudCBjZXJ0aWZpY2F0ZSB3aWxsCisgIGJlIHNraXBwZWQuIEFmdGVyIHRoZSByZXBsYWNlbWVudCwgaXQgYWRkaXRpb25hbGx5IGNoZWNrcyBmb3IgZHVwbGljYXRlCisgIGVudHJpZXMsIHdoaWNoIHdvdWxkIG90aGVyd2lzZSBmYWlsIHRoZSBwb2xpY3kgbG9hZGluZyBjb2RlIGluCisgIGZyYW1ld29ya3MvYmFzZS9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3BtL1NFTGludXhNTUFDLmphdmEuCisKKyAgQXJnczoKKyAgICBkYXRhOiBJbnB1dCBzdHJpbmcgdGhhdCBjb250YWlucyBhIHNldCBvZiBYLjUwOSBjZXJ0cy4KKworICBSZXR1cm5zOgorICAgIEEgc3RyaW5nIGFmdGVyIHRoZSByZXBsYWNlbWVudC4KKworICBSYWlzZXM6CisgICAgQXNzZXJ0aW9uRXJyb3I6IE9uIGZpbmRpbmcgZHVwbGljYXRlIGVudHJpZXMuCisgICIiIgorICBmb3Igb2xkLCBuZXcgaW4gT1BUSU9OUy5rZXlfbWFwLml0ZXJpdGVtcygpOgorICAgIGlmIE9QVElPTlMudmVyYm9zZToKKyAgICAgIHByaW50KCIgICAgUmVwbGFjaW5nICVzLng1MDkucGVtIHdpdGggJXMueDUwOS5wZW0iICUgKG9sZCwgbmV3KSkKKworICAgIHRyeToKKyAgICAgIHdpdGggb3BlbihvbGQgKyAiLng1MDkucGVtIikgYXMgb2xkX2ZwOgorICAgICAgICBvbGRfY2VydDE2ID0gYmFzZTY0LmIxNmVuY29kZSgKKyAgICAgICAgICAgIGNvbW1vbi5QYXJzZUNlcnRpZmljYXRlKG9sZF9mcC5yZWFkKCkpKS5sb3dlcigpCisgICAgICB3aXRoIG9wZW4obmV3ICsgIi54NTA5LnBlbSIpIGFzIG5ld19mcDoKKyAgICAgICAgbmV3X2NlcnQxNiA9IGJhc2U2NC5iMTZlbmNvZGUoCisgICAgICAgICAgICBjb21tb24uUGFyc2VDZXJ0aWZpY2F0ZShuZXdfZnAucmVhZCgpKSkubG93ZXIoKQorICAgIGV4Y2VwdCBJT0Vycm9yIGFzIGU6CisgICAgICBpZiBPUFRJT05TLnZlcmJvc2Ugb3IgZS5lcnJubyAhPSBlcnJuby5FTk9FTlQ6CisgICAgICAgIHByaW50KCIgICAgRXJyb3IgYWNjZXNzaW5nICVzOiAlcy5cblNraXAgcmVwbGFjaW5nICVzLng1MDkucGVtIHdpdGggIgorICAgICAgICAgICAgICAiJXMueDUwOS5wZW0uIiAlIChlLmZpbGVuYW1lLCBlLnN0cmVycm9yLCBvbGQsIG5ldykpCisgICAgICBjb250aW51ZQorCisgICAgIyBPbmx5IG1hdGNoIGVudGlyZSBjZXJ0cy4KKyAgICBwYXR0ZXJuID0gIlxcYiIgKyBvbGRfY2VydDE2ICsgIlxcYiIKKyAgICAoZGF0YSwgbnVtKSA9IHJlLnN1Ym4ocGF0dGVybiwgbmV3X2NlcnQxNiwgZGF0YSwgZmxhZ3M9cmUuSUdOT1JFQ0FTRSkKKworICAgIGlmIE9QVElPTlMudmVyYm9zZToKKyAgICAgIHByaW50KCIgICAgUmVwbGFjZWQgJWQgb2NjdXJlbmNlKHMpIG9mICVzLng1MDkucGVtIHdpdGggJXMueDUwOS5wZW0iICUgKAorICAgICAgICAgIG51bSwgb2xkLCBuZXcpKQorCisgICMgVmVyaWZ5IHRoYXQgdGhlcmUncmUgbm8gZHVwbGljYXRlIGVudHJpZXMgYWZ0ZXIgdGhlIHJlcGxhY2VtZW50LiBOb3RlIHRoYXQKKyAgIyBpdCdzIG9ubHkgY2hlY2tpbmcgZW50cmllcyB3aXRoIGdsb2JhbCBzZWluZm8gYXQgdGhlIG1vbWVudCAoaS5lLiBpZ25vcmluZworICAjIHRoZSBvbmVzIHdpdGggaW5uZXIgcGFja2FnZXMpLiAoQnVnOiA2OTQ3OTM2NikKKyAgcm9vdCA9IEVsZW1lbnRUcmVlLmZyb21zdHJpbmcoZGF0YSkKKyAgc2lnbmF0dXJlcyA9IFtzaWduZXIuYXR0cmliWydzaWduYXR1cmUnXSBmb3Igc2lnbmVyIGluIHJvb3QuZmluZGFsbCgnc2lnbmVyJyldCisgIGFzc2VydCBsZW4oc2lnbmF0dXJlcykgPT0gbGVuKHNldChzaWduYXR1cmVzKSksIFwKKyAgICAgICJGb3VuZCBkdXBsaWNhdGUgZW50cmllcyBhZnRlciBjZXJ0IHJlcGxhY2VtZW50OiB7fSIuZm9ybWF0KGRhdGEpCiAKICAgcmV0dXJuIGRhdGEKIAogCiBkZWYgRWRpdFRhZ3ModGFncyk6Ci0gICIiIkdpdmVuIGEgc3RyaW5nIGNvbnRhaW5pbmcgY29tbWEtc2VwYXJhdGVkIHRhZ3MsIGFwcGx5IHRoZSBlZGl0cwotICBzcGVjaWZpZWQgaW4gT1BUSU9OUy50YWdfY2hhbmdlcyBhbmQgcmV0dXJuIHRoZSB1cGRhdGVkIHN0cmluZy4iIiIKKyAgIiIiQXBwbGllcyB0aGUgZWRpdHMgdG8gdGhlIHRhZyBzdHJpbmcgYXMgc3BlY2lmaWVkIGluIE9QVElPTlMudGFnX2NoYW5nZXMuCisKKyAgQXJnczoKKyAgICB0YWdzOiBUaGUgaW5wdXQgc3RyaW5nIHRoYXQgY29udGFpbnMgY29tbWEtc2VwYXJhdGVkIHRhZ3MuCisKKyAgUmV0dXJuczoKKyAgICBUaGUgdXBkYXRlZCB0YWdzIChjb21tYS1zZXBhcmF0ZWQgYW5kIHNvcnRlZCkuCisgICIiIgogICB0YWdzID0gc2V0KHRhZ3Muc3BsaXQoIiwiKSkKICAgZm9yIGNoIGluIE9QVElPTlMudGFnX2NoYW5nZXM6CiAgICAgaWYgY2hbMF0gPT0gIi0iOgpAQCAtMzk2LDIwICs0MzQsMjcgQEAKICAgcmV0dXJuICIsIi5qb2luKHNvcnRlZCh0YWdzKSkKIAogCi1kZWYgUmV3cml0ZVByb3BzKGRhdGEsIG1pc2NfaW5mbyk6CitkZWYgUmV3cml0ZVByb3BzKGRhdGEpOgorICAiIiJSZXdyaXRlcyB0aGUgc3lzdGVtIHByb3BlcnRpZXMgaW4gdGhlIGdpdmVuIHN0cmluZy4KKworICBFYWNoIHByb3BlcnR5IGlzIGV4cGVjdGVkIGluICdrZXk9dmFsdWUnIGZvcm1hdC4gVGhlIHByb3BlcnRpZXMgdGhhdCBjb250YWluCisgIGJ1aWxkIHRhZ3MgKGkuZS4gdGVzdC1rZXlzLCBkZXYta2V5cykgd2lsbCBiZSB1cGRhdGVkIGFjY29yZGluZ2x5IGJ5IGNhbGxpbmcKKyAgRWRpdFRhZ3MoKS4KKworICBBcmdzOgorICAgIGRhdGE6IElucHV0IHN0cmluZywgc2VwYXJhdGVkIGJ5IG5ld2xpbmVzLgorCisgIFJldHVybnM6CisgICAgVGhlIHN0cmluZyB3aXRoIG1vZGlmaWVkIHByb3BlcnRpZXMuCisgICIiIgogICBvdXRwdXQgPSBbXQogICBmb3IgbGluZSBpbiBkYXRhLnNwbGl0KCJcbiIpOgogICAgIGxpbmUgPSBsaW5lLnN0cmlwKCkKICAgICBvcmlnaW5hbF9saW5lID0gbGluZQogICAgIGlmIGxpbmUgYW5kIGxpbmVbMF0gIT0gJyMnIGFuZCAiPSIgaW4gbGluZToKICAgICAgIGtleSwgdmFsdWUgPSBsaW5lLnNwbGl0KCI9IiwgMSkKLSAgICAgIGlmIChrZXkgaW4gKCJyby5idWlsZC5maW5nZXJwcmludCIsICJyby52ZW5kb3IuYnVpbGQuZmluZ2VycHJpbnQiKQotICAgICAgICAgIGFuZCBtaXNjX2luZm8uZ2V0KCJvZW1fZmluZ2VycHJpbnRfcHJvcGVydGllcyIpIGlzIE5vbmUpOgotICAgICAgICBwaWVjZXMgPSB2YWx1ZS5zcGxpdCgiLyIpCi0gICAgICAgIHBpZWNlc1stMV0gPSBFZGl0VGFncyhwaWVjZXNbLTFdKQotICAgICAgICB2YWx1ZSA9ICIvIi5qb2luKHBpZWNlcykKLSAgICAgIGVsaWYgKGtleSBpbiAoInJvLmJ1aWxkLnRodW1icHJpbnQiLCAicm8udmVuZG9yLmJ1aWxkLnRodW1icHJpbnQiKQotICAgICAgICAgICAgYW5kIG1pc2NfaW5mby5nZXQoIm9lbV9maW5nZXJwcmludF9wcm9wZXJ0aWVzIikgaXMgbm90IE5vbmUpOgorICAgICAgaWYga2V5IGluICgicm8uYnVpbGQuZmluZ2VycHJpbnQiLCAicm8uYnVpbGQudGh1bWJwcmludCIsCisgICAgICAgICAgICAgICAgICJyby52ZW5kb3IuYnVpbGQuZmluZ2VycHJpbnQiLCAicm8udmVuZG9yLmJ1aWxkLnRodW1icHJpbnQiKToKICAgICAgICAgcGllY2VzID0gdmFsdWUuc3BsaXQoIi8iKQogICAgICAgICBwaWVjZXNbLTFdID0gRWRpdFRhZ3MocGllY2VzWy0xXSkKICAgICAgICAgdmFsdWUgPSAiLyIuam9pbihwaWVjZXMpCkBAIC00MzIsOCArNDc3LDggQEAKICAgICAgICAgdmFsdWUgPSAiICIuam9pbih2YWx1ZSkKICAgICAgIGxpbmUgPSBrZXkgKyAiPSIgKyB2YWx1ZQogICAgIGlmIGxpbmUgIT0gb3JpZ2luYWxfbGluZToKLSAgICAgIHByaW50ICIgIHJlcGxhY2U6ICIsIG9yaWdpbmFsX2xpbmUKLSAgICAgIHByaW50ICIgICAgIHdpdGg6ICIsIGxpbmUKKyAgICAgIHByaW50KCIgIHJlcGxhY2U6ICIsIG9yaWdpbmFsX2xpbmUpCisgICAgICBwcmludCgiICAgICB3aXRoOiAiLCBsaW5lKQogICAgIG91dHB1dC5hcHBlbmQobGluZSkKICAgcmV0dXJuICJcbiIuam9pbihvdXRwdXQpICsgIlxuIgogCkBAIC00NDQsMTIgKzQ4OSwxMiBAQAogICBleGNlcHQgS2V5RXJyb3I6CiAgICAgcmFpc2UgY29tbW9uLkV4dGVybmFsRXJyb3IoImNhbid0IHJlYWQgTUVUQS9vdGFrZXlzLnR4dCBmcm9tIGlucHV0IikKIAotICBleHRyYV9yZWNvdmVyeV9rZXlzID0gbWlzY19pbmZvLmdldCgiZXh0cmFfcmVjb3Zlcnlfa2V5cyIsIE5vbmUpCisgIGV4dHJhX3JlY292ZXJ5X2tleXMgPSBtaXNjX2luZm8uZ2V0KCJleHRyYV9yZWNvdmVyeV9rZXlzIikKICAgaWYgZXh0cmFfcmVjb3Zlcnlfa2V5czoKICAgICBleHRyYV9yZWNvdmVyeV9rZXlzID0gW09QVElPTlMua2V5X21hcC5nZXQoaywgaykgKyAiLng1MDkucGVtIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGsgaW4gZXh0cmFfcmVjb3Zlcnlfa2V5cy5zcGxpdCgpXQogICAgIGlmIGV4dHJhX3JlY292ZXJ5X2tleXM6Ci0gICAgICBwcmludCAiZXh0cmEgcmVjb3Zlcnktb25seSBrZXkocyk6ICIgKyAiLCAiLmpvaW4oZXh0cmFfcmVjb3Zlcnlfa2V5cykKKyAgICAgIHByaW50KCJleHRyYSByZWNvdmVyeS1vbmx5IGtleShzKTogIiArICIsICIuam9pbihleHRyYV9yZWNvdmVyeV9rZXlzKSkKICAgZWxzZToKICAgICBleHRyYV9yZWNvdmVyeV9rZXlzID0gW10KIApAQCAtNDYzLDEzICs1MDgsMTUgQEAKICAgICBtYXBwZWRfa2V5cy5hcHBlbmQoT1BUSU9OUy5rZXlfbWFwLmdldChrLCBrKSArICIueDUwOS5wZW0iKQogCiAgIGlmIG1hcHBlZF9rZXlzOgotICAgIHByaW50ICJ1c2luZzpcbiAgICIsICJcbiAgICIuam9pbihtYXBwZWRfa2V5cykKLSAgICBwcmludCAiZm9yIE9UQSBwYWNrYWdlIHZlcmlmaWNhdGlvbiIKKyAgICBwcmludCgidXNpbmc6XG4gICAiLCAiXG4gICAiLmpvaW4obWFwcGVkX2tleXMpKQorICAgIHByaW50KCJmb3IgT1RBIHBhY2thZ2UgdmVyaWZpY2F0aW9uIikKICAgZWxzZToKICAgICBkZXZrZXkgPSBtaXNjX2luZm8uZ2V0KCJkZWZhdWx0X3N5c3RlbV9kZXZfY2VydGlmaWNhdGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImJ1aWxkL3RhcmdldC9wcm9kdWN0L3NlY3VyaXR5L3Rlc3RrZXkiKQotICAgIG1hcHBlZF9rZXlzLmFwcGVuZCgKLSAgICAgICAgT1BUSU9OUy5rZXlfbWFwLmdldChkZXZrZXksIGRldmtleSkgKyAiLng1MDkucGVtIikKKyAgICBtYXBwZWRfZGV2a2V5ID0gT1BUSU9OUy5rZXlfbWFwLmdldChkZXZrZXksIGRldmtleSkKKyAgICBpZiBtYXBwZWRfZGV2a2V5ICE9IGRldmtleToKKyAgICAgIG1pc2NfaW5mb1siZGVmYXVsdF9zeXN0ZW1fZGV2X2NlcnRpZmljYXRlIl0gPSBtYXBwZWRfZGV2a2V5CisgICAgbWFwcGVkX2tleXMuYXBwZW5kKG1hcHBlZF9kZXZrZXkgKyAiLng1MDkucGVtIikKICAgICBwcmludCgiTUVUQS9vdGFrZXlzLnR4dCBoYXMgbm8ga2V5czsgdXNpbmcgJXMgZm9yIE9UQSBwYWNrYWdlIgogICAgICAgICAgICIgdmVyaWZpY2F0aW9uLiIgJSAobWFwcGVkX2tleXNbMF0sKSkKIApAQCAtNDk2LDcgKzU0MywxMSBAQAogICAjIHB1dCBpbnRvIGEgemlwZmlsZSBzeXN0ZW0vZXRjL3NlY3VyaXR5L290YWNlcnRzLnppcC4KICAgIyBXZSBETyBOT1QgaW5jbHVkZSB0aGUgZXh0cmFfcmVjb3Zlcnlfa2V5cyAoaWYgYW55KSBoZXJlLgogCi0gIHRlbXBfZmlsZSA9IGNTdHJpbmdJTy5TdHJpbmdJTygpCisgIHRyeToKKyAgICBmcm9tIFN0cmluZ0lPIGltcG9ydCBTdHJpbmdJTworICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgZnJvbSBpbyBpbXBvcnQgU3RyaW5nSU8KKyAgdGVtcF9maWxlID0gU3RyaW5nSU8oKQogICBjZXJ0c196aXAgPSB6aXBmaWxlLlppcEZpbGUodGVtcF9maWxlLCAidyIpCiAgIGZvciBrIGluIG1hcHBlZF9rZXlzOgogICAgIGNvbW1vbi5aaXBXcml0ZShjZXJ0c196aXAsIGspCkBAIC01MTIsMTEgKzU2Myw4IEBACiAgICAgICBwcmludCgiXG4gIFdBUk5JTkc6IEZvdW5kIG1vcmUgdGhhbiBvbmUgT1RBIGtleXM7IFVzaW5nIHRoZSBmaXJzdCBvbmUiCiAgICAgICAgICAgICAiIGFzIHBheWxvYWQgdmVyaWZpY2F0aW9uIGtleS5cblxuIikKIAotICAgIHByaW50ICJVc2luZyAlcyBmb3IgcGF5bG9hZCB2ZXJpZmljYXRpb24uIiAlIChtYXBwZWRfa2V5c1swXSwpCi0gICAgY21kID0gY29tbW9uLlJ1bigKLSAgICAgICAgWyJvcGVuc3NsIiwgIng1MDkiLCAiLXB1YmtleSIsICItbm9vdXQiLCAiLWluIiwgbWFwcGVkX2tleXNbMF1dLAotICAgICAgICBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFKQotICAgIHB1YmtleSwgXyA9IGNtZC5jb21tdW5pY2F0ZSgpCisgICAgcHJpbnQoIlVzaW5nICVzIGZvciBwYXlsb2FkIHZlcmlmaWNhdGlvbi4iICUgKG1hcHBlZF9rZXlzWzBdLCkpCisgICAgcHVia2V5ID0gY29tbW9uLkV4dHJhY3RQdWJsaWNLZXkobWFwcGVkX2tleXNbMF0pCiAgICAgY29tbW9uLlppcFdyaXRlU3RyKAogICAgICAgICBvdXRwdXRfdGZfemlwLAogICAgICAgICAiU1lTVEVNL2V0Yy91cGRhdGVfZW5naW5lL3VwZGF0ZS1wYXlsb2FkLWtleS5wdWIucGVtIiwKQEAgLTUyOSw0MSArNTc3LDYyIEBACiAgIHJldHVybiBuZXdfcmVjb3Zlcnlfa2V5cwogCiAKLWRlZiBSZXBsYWNlVmVyaXR5UHVibGljS2V5KHRhcmdldGZpbGVfemlwLCBmaWxlbmFtZSwga2V5X3BhdGgpOgotICBwcmludCAiUmVwbGFjaW5nIHZlcml0eSBwdWJsaWMga2V5IHdpdGggJXMiICUgKGtleV9wYXRoLCkKLSAgY29tbW9uLlppcFdyaXRlKHRhcmdldGZpbGVfemlwLCBrZXlfcGF0aCwgYXJjbmFtZT1maWxlbmFtZSkKK2RlZiBSZXBsYWNlVmVyaXR5UHVibGljS2V5KG91dHB1dF96aXAsIGZpbGVuYW1lLCBrZXlfcGF0aCk6CisgICIiIlJlcGxhY2VzIHRoZSB2ZXJpdHkgcHVibGljIGtleSBhdCB0aGUgZ2l2ZW4gcGF0aCBpbiB0aGUgZ2l2ZW4gemlwLgorCisgIEFyZ3M6CisgICAgb3V0cHV0X3ppcDogVGhlIG91dHB1dCB0YXJnZXRfZmlsZXMgemlwLgorICAgIGZpbGVuYW1lOiBUaGUgYXJjaGl2ZSBuYW1lIGluIHRoZSBvdXRwdXQgemlwLgorICAgIGtleV9wYXRoOiBUaGUgcGF0aCB0byB0aGUgcHVibGljIGtleS4KKyAgIiIiCisgIHByaW50KCJSZXBsYWNpbmcgdmVyaXR5IHB1YmxpYyBrZXkgd2l0aCAlcyIgJSAoa2V5X3BhdGgsKSkKKyAgY29tbW9uLlppcFdyaXRlKG91dHB1dF96aXAsIGtleV9wYXRoLCBhcmNuYW1lPWZpbGVuYW1lKQogCiAKIGRlZiBSZXBsYWNlVmVyaXR5UHJpdmF0ZUtleShtaXNjX2luZm8sIGtleV9wYXRoKToKLSAgcHJpbnQgIlJlcGxhY2luZyB2ZXJpdHkgcHJpdmF0ZSBrZXkgd2l0aCAlcyIgJSAoa2V5X3BhdGgsKQorICAiIiJSZXBsYWNlcyB0aGUgdmVyaXR5IHByaXZhdGUga2V5IGluIG1pc2NfaW5mbyBkaWN0LgorCisgIEFyZ3M6CisgICAgbWlzY19pbmZvOiBUaGUgaW5mbyBkaWN0LgorICAgIGtleV9wYXRoOiBUaGUgcGF0aCB0byB0aGUgcHJpdmF0ZSBrZXkgaW4gUEtDUyM4IGZvcm1hdC4KKyAgIiIiCisgIHByaW50KCJSZXBsYWNpbmcgdmVyaXR5IHByaXZhdGUga2V5IHdpdGggJXMiICUgKGtleV9wYXRoLCkpCiAgIG1pc2NfaW5mb1sidmVyaXR5X2tleSJdID0ga2V5X3BhdGgKIAogCi1kZWYgUmVwbGFjZVZlcml0eUtleUlkKHRhcmdldGZpbGVfaW5wdXRfemlwLCB0YXJnZXRmaWxlX291dHB1dF96aXAsIGtleXBhdGgpOgotICBpbl9jbWRsaW5lID0gdGFyZ2V0ZmlsZV9pbnB1dF96aXAucmVhZCgiQk9PVC9jbWRsaW5lIikKLSAgIyBjb3B5IGluX2NtZGxpbmUgdG8gb3V0cHV0X3ppcCBpZiB2ZXJpdHlrZXlpZCBpcyBub3QgcHJlc2VudCBpbiBpbl9jbWRsaW5lCi0gIGlmICJ2ZXJpdHlrZXlpZCIgbm90IGluIGluX2NtZGxpbmU6Ci0gICAgY29tbW9uLlppcFdyaXRlU3RyKHRhcmdldGZpbGVfb3V0cHV0X3ppcCwgIkJPT1QvY21kbGluZSIsIGluX2NtZGxpbmUpCi0gICAgcmV0dXJuIGluX2NtZGxpbmUKLSAgb3V0X2NtZGxpbmUgPSBbXQotICBmb3IgcGFyYW0gaW4gaW5fY21kbGluZS5zcGxpdCgpOgotICAgIGlmICJ2ZXJpdHlrZXlpZCIgaW4gcGFyYW06Ci0gICAgICAjIGV4dHJhY3Qga2V5aWQgdXNpbmcgb3BlbnNzbCBjb21tYW5kCi0gICAgICBwID0gY29tbW9uLlJ1bigKLSAgICAgICAgICBbIm9wZW5zc2wiLCAieDUwOSIsICItaW4iLCBrZXlwYXRoLCAiLXRleHQiXSwKLSAgICAgICAgICBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFKQotICAgICAga2V5aWQsIHN0ZGVyciA9IHAuY29tbXVuaWNhdGUoKQotICAgICAga2V5aWQgPSByZS5zZWFyY2goCi0gICAgICAgICAgcidrZXlpZDooWzAtOWEtZkEtRjpdKiknLCBrZXlpZCkuZ3JvdXAoMSkucmVwbGFjZSgnOicsICcnKS5sb3dlcigpCi0gICAgICBwcmludCAiUmVwbGFjaW5nIHZlcml0eSBrZXlpZCB3aXRoICVzIGVycm9yPSVzIiAlIChrZXlpZCwgc3RkZXJyKQotICAgICAgb3V0X2NtZGxpbmUuYXBwZW5kKCJ2ZXJpdHlrZXlpZD1pZDolcyIgJSAoa2V5aWQsKSkKLSAgICBlbHNlOgotICAgICAgb3V0X2NtZGxpbmUuYXBwZW5kKHBhcmFtKQorZGVmIFJlcGxhY2VWZXJpdHlLZXlJZChpbnB1dF96aXAsIG91dHB1dF96aXAsIGtleV9wYXRoKToKKyAgIiIiUmVwbGFjZXMgdGhlIHZlcml0eWtleWlkIHBhcmFtZXRlciBpbiBCT09UL2NtZGxpbmUuCiAKLSAgb3V0X2NtZGxpbmUgPSAnICcuam9pbihvdXRfY21kbGluZSkKLSAgb3V0X2NtZGxpbmUgPSBvdXRfY21kbGluZS5zdHJpcCgpCi0gIHByaW50ICJvdXRfY21kbGluZSAlcyIgJSAob3V0X2NtZGxpbmUpCi0gIGNvbW1vbi5aaXBXcml0ZVN0cih0YXJnZXRmaWxlX291dHB1dF96aXAsICJCT09UL2NtZGxpbmUiLCBvdXRfY21kbGluZSkKKyAgQXJnczoKKyAgICBpbnB1dF96aXA6IFRoZSBpbnB1dCB0YXJnZXRfZmlsZXMgemlwLCB3aGljaCBzaG91bGQgYmUgYWxyZWFkeSBvcGVuLgorICAgIG91dHB1dF96aXA6IFRoZSBvdXRwdXQgdGFyZ2V0X2ZpbGVzIHppcCwgd2hpY2ggc2hvdWxkIGJlIGFscmVhZHkgb3BlbiBhbmQKKyAgICAgICAgd3JpdGFibGUuCisgICAga2V5X3BhdGg6IFRoZSBwYXRoIHRvIHRoZSBQRU0gZW5jb2RlZCBYLjUwOSBjZXJ0aWZpY2F0ZS4KKyAgIiIiCisgIGluX2NtZGxpbmUgPSBpbnB1dF96aXAucmVhZCgiQk9PVC9jbWRsaW5lIikKKyAgIyBDb3B5IGluX2NtZGxpbmUgdG8gb3V0cHV0X3ppcCBpZiB2ZXJpdHlrZXlpZCBpcyBub3QgcHJlc2VudC4KKyAgaWYgInZlcml0eWtleWlkIiBub3QgaW4gaW5fY21kbGluZToKKyAgICBjb21tb24uWmlwV3JpdGVTdHIob3V0cHV0X3ppcCwgIkJPT1QvY21kbGluZSIsIGluX2NtZGxpbmUpCisgICAgcmV0dXJuCisKKyAgb3V0X2J1ZmZlciA9IFtdCisgIGZvciBwYXJhbSBpbiBpbl9jbWRsaW5lLnNwbGl0KCk6CisgICAgaWYgInZlcml0eWtleWlkIiBub3QgaW4gcGFyYW06CisgICAgICBvdXRfYnVmZmVyLmFwcGVuZChwYXJhbSkKKyAgICAgIGNvbnRpbnVlCisKKyAgICAjIEV4dHJhY3Qga2V5aWQgdXNpbmcgb3BlbnNzbCBjb21tYW5kLgorICAgIHAgPSBjb21tb24uUnVuKFsib3BlbnNzbCIsICJ4NTA5IiwgIi1pbiIsIGtleV9wYXRoLCAiLXRleHQiXSwKKyAgICAgICAgICAgICAgICAgICBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLCBzdGRlcnI9c3VicHJvY2Vzcy5QSVBFKQorICAgIGtleWlkLCBzdGRlcnIgPSBwLmNvbW11bmljYXRlKCkKKyAgICBhc3NlcnQgcC5yZXR1cm5jb2RlID09IDAsICJGYWlsZWQgdG8gZHVtcCBjZXJ0aWZpY2F0ZToge30iLmZvcm1hdChzdGRlcnIpCisgICAga2V5aWQgPSByZS5zZWFyY2goCisgICAgICAgIHIna2V5aWQ6KFswLTlhLWZBLUY6XSopJywga2V5aWQpLmdyb3VwKDEpLnJlcGxhY2UoJzonLCAnJykubG93ZXIoKQorICAgIHByaW50KCJSZXBsYWNpbmcgdmVyaXR5IGtleWlkIHdpdGgge30iLmZvcm1hdChrZXlpZCkpCisgICAgb3V0X2J1ZmZlci5hcHBlbmQoInZlcml0eWtleWlkPWlkOiVzIiAlIChrZXlpZCwpKQorCisgIG91dF9jbWRsaW5lID0gJyAnLmpvaW4ob3V0X2J1ZmZlcikuc3RyaXAoKSArICdcbicKKyAgY29tbW9uLlppcFdyaXRlU3RyKG91dHB1dF96aXAsICJCT09UL2NtZGxpbmUiLCBvdXRfY21kbGluZSkKIAogCiBkZWYgUmVwbGFjZU1pc2NJbmZvVHh0KGlucHV0X3ppcCwgb3V0cHV0X3ppcCwgbWlzY19pbmZvKToKQEAgLTU4NSwxMSArNjU0LDEyIEBACiAgICIiIlJlcGxhY2VzIHRoZSBBVkIgc2lnbmluZyBrZXlzLiIiIgogCiAgIEFWQl9GT09URVJfQVJHU19CWV9QQVJUSVRJT04gPSB7Ci0gICAgJ2Jvb3QnIDogJ2F2Yl9ib290X2FkZF9oYXNoX2Zvb3Rlcl9hcmdzJywKLSAgICAnZHRibycgOiAnYXZiX2R0Ym9fYWRkX2hhc2hfZm9vdGVyX2FyZ3MnLAotICAgICdzeXN0ZW0nIDogJ2F2Yl9zeXN0ZW1fYWRkX2hhc2h0cmVlX2Zvb3Rlcl9hcmdzJywKLSAgICAndmVuZG9yJyA6ICdhdmJfdmVuZG9yX2FkZF9oYXNodHJlZV9mb290ZXJfYXJncycsCi0gICAgJ3ZibWV0YScgOiAnYXZiX3ZibWV0YV9hcmdzJywKKyAgICAgICdib290JyA6ICdhdmJfYm9vdF9hZGRfaGFzaF9mb290ZXJfYXJncycsCisgICAgICAnZHRibycgOiAnYXZiX2R0Ym9fYWRkX2hhc2hfZm9vdGVyX2FyZ3MnLAorICAgICAgJ3JlY292ZXJ5JyA6ICdhdmJfcmVjb3ZlcnlfYWRkX2hhc2hfZm9vdGVyX2FyZ3MnLAorICAgICAgJ3N5c3RlbScgOiAnYXZiX3N5c3RlbV9hZGRfaGFzaHRyZWVfZm9vdGVyX2FyZ3MnLAorICAgICAgJ3ZlbmRvcicgOiAnYXZiX3ZlbmRvcl9hZGRfaGFzaHRyZWVfZm9vdGVyX2FyZ3MnLAorICAgICAgJ3ZibWV0YScgOiAnYXZiX3ZibWV0YV9hcmdzJywKICAgfQogCiAgIGRlZiBSZXBsYWNlQXZiUGFydGl0aW9uU2lnbmluZ0tleShwYXJ0aXRpb24pOgpAQCAtNjAwLDE1ICs2NzAsMTUgQEAKICAgICBhbGdvcml0aG0gPSBPUFRJT05TLmF2Yl9hbGdvcml0aG1zLmdldChwYXJ0aXRpb24pCiAgICAgYXNzZXJ0IGFsZ29yaXRobSwgJ01pc3NpbmcgQVZCIHNpZ25pbmcgYWxnb3JpdGhtIGZvciAlcycgJSAocGFydGl0aW9uLCkKIAotICAgIHByaW50ICdSZXBsYWNpbmcgQVZCIHNpZ25pbmcga2V5IGZvciAlcyB3aXRoICIlcyIgKCVzKScgJSAoCi0gICAgICAgIHBhcnRpdGlvbiwga2V5LCBhbGdvcml0aG0pCisgICAgcHJpbnQoJ1JlcGxhY2luZyBBVkIgc2lnbmluZyBrZXkgZm9yICVzIHdpdGggIiVzIiAoJXMpJyAlICgKKyAgICAgICAgcGFydGl0aW9uLCBrZXksIGFsZ29yaXRobSkpCiAgICAgbWlzY19pbmZvWydhdmJfJyArIHBhcnRpdGlvbiArICdfYWxnb3JpdGhtJ10gPSBhbGdvcml0aG0KICAgICBtaXNjX2luZm9bJ2F2Yl8nICsgcGFydGl0aW9uICsgJ19rZXlfcGF0aCddID0ga2V5CiAKICAgICBleHRyYV9hcmdzID0gT1BUSU9OUy5hdmJfZXh0cmFfYXJncy5nZXQocGFydGl0aW9uKQogICAgIGlmIGV4dHJhX2FyZ3M6Ci0gICAgICBwcmludCAnU2V0dGluZyBleHRyYSBBVkIgc2lnbmluZyBhcmdzIGZvciAlcyB0byAiJXMiJyAlICgKLSAgICAgICAgICBwYXJ0aXRpb24sIGV4dHJhX2FyZ3MpCisgICAgICBwcmludCgnU2V0dGluZyBleHRyYSBBVkIgc2lnbmluZyBhcmdzIGZvciAlcyB0byAiJXMiJyAlICgKKyAgICAgICAgICBwYXJ0aXRpb24sIGV4dHJhX2FyZ3MpKQogICAgICAgYXJnc19rZXkgPSBBVkJfRk9PVEVSX0FSR1NfQllfUEFSVElUSU9OW3BhcnRpdGlvbl0KICAgICAgIG1pc2NfaW5mb1thcmdzX2tleV0gPSAobWlzY19pbmZvLmdldChhcmdzX2tleSwgJycpICsgJyAnICsgZXh0cmFfYXJncykKIApAQCAtNzUxLDI5ICs4MjEsMjkgQEAKICAgICAgIGFyZ3YsIF9fZG9jX18sCiAgICAgICBleHRyYV9vcHRzPSJlOmQ6azpvdDoiLAogICAgICAgZXh0cmFfbG9uZ19vcHRzPVsKLSAgICAgICAgImV4dHJhX2Fwa3M9IiwKLSAgICAgICAgImRlZmF1bHRfa2V5X21hcHBpbmdzPSIsCi0gICAgICAgICJrZXlfbWFwcGluZz0iLAotICAgICAgICAicmVwbGFjZV9vdGFfa2V5cyIsCi0gICAgICAgICJ0YWdfY2hhbmdlcz0iLAotICAgICAgICAicmVwbGFjZV92ZXJpdHlfcHVibGljX2tleT0iLAotICAgICAgICAicmVwbGFjZV92ZXJpdHlfcHJpdmF0ZV9rZXk9IiwKLSAgICAgICAgInJlcGxhY2VfdmVyaXR5X2tleWlkPSIsCi0gICAgICAgICJhdmJfdmJtZXRhX2FsZ29yaXRobT0iLAotICAgICAgICAiYXZiX3ZibWV0YV9rZXk9IiwKLSAgICAgICAgImF2Yl92Ym1ldGFfZXh0cmFfYXJncz0iLAotICAgICAgICAiYXZiX2Jvb3RfYWxnb3JpdGhtPSIsCi0gICAgICAgICJhdmJfYm9vdF9rZXk9IiwKLSAgICAgICAgImF2Yl9ib290X2V4dHJhX2FyZ3M9IiwKLSAgICAgICAgImF2Yl9kdGJvX2FsZ29yaXRobT0iLAotICAgICAgICAiYXZiX2R0Ym9fa2V5PSIsCi0gICAgICAgICJhdmJfZHRib19leHRyYV9hcmdzPSIsCi0gICAgICAgICJhdmJfc3lzdGVtX2FsZ29yaXRobT0iLAotICAgICAgICAiYXZiX3N5c3RlbV9rZXk9IiwKLSAgICAgICAgImF2Yl9zeXN0ZW1fZXh0cmFfYXJncz0iLAotICAgICAgICAiYXZiX3ZlbmRvcl9hbGdvcml0aG09IiwKLSAgICAgICAgImF2Yl92ZW5kb3Jfa2V5PSIsCi0gICAgICAgICJhdmJfdmVuZG9yX2V4dHJhX2FyZ3M9IiwKKyAgICAgICAgICAiZXh0cmFfYXBrcz0iLAorICAgICAgICAgICJkZWZhdWx0X2tleV9tYXBwaW5ncz0iLAorICAgICAgICAgICJrZXlfbWFwcGluZz0iLAorICAgICAgICAgICJyZXBsYWNlX290YV9rZXlzIiwKKyAgICAgICAgICAidGFnX2NoYW5nZXM9IiwKKyAgICAgICAgICAicmVwbGFjZV92ZXJpdHlfcHVibGljX2tleT0iLAorICAgICAgICAgICJyZXBsYWNlX3Zlcml0eV9wcml2YXRlX2tleT0iLAorICAgICAgICAgICJyZXBsYWNlX3Zlcml0eV9rZXlpZD0iLAorICAgICAgICAgICJhdmJfdmJtZXRhX2FsZ29yaXRobT0iLAorICAgICAgICAgICJhdmJfdmJtZXRhX2tleT0iLAorICAgICAgICAgICJhdmJfdmJtZXRhX2V4dHJhX2FyZ3M9IiwKKyAgICAgICAgICAiYXZiX2Jvb3RfYWxnb3JpdGhtPSIsCisgICAgICAgICAgImF2Yl9ib290X2tleT0iLAorICAgICAgICAgICJhdmJfYm9vdF9leHRyYV9hcmdzPSIsCisgICAgICAgICAgImF2Yl9kdGJvX2FsZ29yaXRobT0iLAorICAgICAgICAgICJhdmJfZHRib19rZXk9IiwKKyAgICAgICAgICAiYXZiX2R0Ym9fZXh0cmFfYXJncz0iLAorICAgICAgICAgICJhdmJfc3lzdGVtX2FsZ29yaXRobT0iLAorICAgICAgICAgICJhdmJfc3lzdGVtX2tleT0iLAorICAgICAgICAgICJhdmJfc3lzdGVtX2V4dHJhX2FyZ3M9IiwKKyAgICAgICAgICAiYXZiX3ZlbmRvcl9hbGdvcml0aG09IiwKKyAgICAgICAgICAiYXZiX3ZlbmRvcl9rZXk9IiwKKyAgICAgICAgICAiYXZiX3ZlbmRvcl9leHRyYV9hcmdzPSIsCiAgICAgICBdLAogICAgICAgZXh0cmFfb3B0aW9uX2hhbmRsZXI9b3B0aW9uX2hhbmRsZXIpCiAKQEAgLTgxNiwxNiArODg2LDE0IEBACiAgIG5ld19hcmdzLmFwcGVuZChhcmdzWzFdKQogICBhZGRfaW1nX3RvX3RhcmdldF9maWxlcy5tYWluKG5ld19hcmdzKQogCi0gIHByaW50ICJkb25lLiIKKyAgcHJpbnQoImRvbmUuIikKIAogCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICB0cnk6CiAgICAgbWFpbihzeXMuYXJndlsxOl0pCi0gIGV4Y2VwdCBjb21tb24uRXh0ZXJuYWxFcnJvciwgZToKLSAgICBwcmludAotICAgIHByaW50ICIgICBFUlJPUjogJXMiICUgKGUsKQotICAgIHByaW50CisgIGV4Y2VwdCBjb21tb24uRXh0ZXJuYWxFcnJvciBhcyBlOgorICAgIHByaW50KCJcbiAgIEVSUk9SOiAlc1xuIiAlIChlLCkpCiAgICAgc3lzLmV4aXQoMSkKICAgZmluYWxseToKICAgICBjb21tb24uQ2xlYW51cCgpCmRpZmYgLS1naXQgYS90b29scy9yZWxlYXNldG9vbHMvc3BhcnNlX2ltZy5weSBiL3Rvb2xzL3JlbGVhc2V0b29scy9zcGFyc2VfaW1nLnB5CmluZGV4IDdlYjYwZDkuLjA4M2RhN2EgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3JlbGVhc2V0b29scy9zcGFyc2VfaW1nLnB5CisrKyBiL3Rvb2xzL3JlbGVhc2V0b29scy9zcGFyc2VfaW1nLnB5CkBAIC0xNSw2ICsxNSw3IEBACiBpbXBvcnQgYmlzZWN0CiBpbXBvcnQgb3MKIGltcG9ydCBzdHJ1Y3QKK2ltcG9ydCB0aHJlYWRpbmcKIGZyb20gaGFzaGxpYiBpbXBvcnQgc2hhMQogCiBpbXBvcnQgcmFuZ2VsaWIKQEAgLTMyLDcgKzMzLDcgQEAKICAgIiIiCiAKICAgZGVmIF9faW5pdF9fKHNlbGYsIHNpbWdfZm4sIGZpbGVfbWFwX2ZuPU5vbmUsIGNsb2JiZXJlZF9ibG9ja3M9Tm9uZSwKLSAgICAgICAgICAgICAgIG1vZGU9InJiIiwgYnVpbGRfbWFwPVRydWUpOgorICAgICAgICAgICAgICAgbW9kZT0icmIiLCBidWlsZF9tYXA9VHJ1ZSwgYWxsb3dfc2hhcmVkX2Jsb2Nrcz1GYWxzZSk6CiAgICAgc2VsZi5zaW1nX2YgPSBmID0gb3BlbihzaW1nX2ZuLCBtb2RlKQogCiAgICAgaGVhZGVyX2JpbiA9IGYucmVhZCgyOCkKQEAgLTExMSw2ICsxMTIsOCBAQAogICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJVbmtub3duIGNodW5rIHR5cGUgMHglMDRYIG5vdCBzdXBwb3J0ZWQiICUKICAgICAgICAgICAgICAgICAgICAgICAgICAoY2h1bmtfdHlwZSwpKQogCisgICAgc2VsZi5nZW5lcmF0b3JfbG9jayA9IHRocmVhZGluZy5Mb2NrKCkKKwogICAgIHNlbGYuY2FyZV9tYXAgPSByYW5nZWxpYi5SYW5nZVNldChjYXJlX2RhdGEpCiAgICAgc2VsZi5vZmZzZXRfaW5kZXggPSBbaVswXSBmb3IgaSBpbiBvZmZzZXRfbWFwXQogCkBAIC0xMjYsNyArMTI5LDggQEAKICAgICBzZWxmLmV4dGVuZGVkID0gZXh0ZW5kZWQKIAogICAgIGlmIGZpbGVfbWFwX2ZuOgotICAgICAgc2VsZi5Mb2FkRmlsZUJsb2NrTWFwKGZpbGVfbWFwX2ZuLCBzZWxmLmNsb2JiZXJlZF9ibG9ja3MpCisgICAgICBzZWxmLkxvYWRGaWxlQmxvY2tNYXAoZmlsZV9tYXBfZm4sIHNlbGYuY2xvYmJlcmVkX2Jsb2NrcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19zaGFyZWRfYmxvY2tzKQogICAgIGVsc2U6CiAgICAgICBzZWxmLmZpbGVfbWFwID0geyJfX0RBVEEiOiBzZWxmLmNhcmVfbWFwfQogCkBAIC0xNzMsNDAgKzE3Nyw0NyBAQAogICAgIHBhcnRpY3VsYXIgaXMgbm90IG5lY2Vzc2FyaWx5IGVxdWFsIHRvIHRoZSBudW1iZXIgb2YgcmFuZ2VzIGluCiAgICAgJ3JhbmdlcycuCiAKLSAgICBUaGlzIGdlbmVyYXRvciBpcyBzdGF0ZWZ1bCAtLSBpdCBkZXBlbmRzIG9uIHRoZSBvcGVuIGZpbGUgb2JqZWN0Ci0gICAgY29udGFpbmVkIGluIHRoaXMgU3BhcnNlSW1hZ2UsIHNvIHlvdSBzaG91bGQgbm90IHRyeSB0byBydW4gdHdvCisgICAgVXNlIGEgbG9jayB0byBwcm90ZWN0IHRoZSBnZW5lcmF0b3Igc28gdGhhdCB3ZSB3aWxsIG5vdCBydW4gdHdvCiAgICAgaW5zdGFuY2VzIG9mIHRoaXMgZ2VuZXJhdG9yIG9uIHRoZSBzYW1lIG9iamVjdCBzaW11bHRhbmVvdXNseS4iIiIKIAogICAgIGYgPSBzZWxmLnNpbWdfZgotICAgIGZvciBzLCBlIGluIHJhbmdlczoKLSAgICAgIHRvX3JlYWQgPSBlLXMKLSAgICAgIGlkeCA9IGJpc2VjdC5iaXNlY3RfcmlnaHQoc2VsZi5vZmZzZXRfaW5kZXgsIHMpIC0gMQotICAgICAgY2h1bmtfc3RhcnQsIGNodW5rX2xlbiwgZmlsZXBvcywgZmlsbF9kYXRhID0gc2VsZi5vZmZzZXRfbWFwW2lkeF0KLQotICAgICAgIyBmb3IgdGhlIGZpcnN0IGNodW5rIHdlIG1heSBiZSBzdGFydGluZyBwYXJ0d2F5IHRocm91Z2ggaXQuCi0gICAgICByZW1haW4gPSBjaHVua19sZW4gLSAocyAtIGNodW5rX3N0YXJ0KQotICAgICAgdGhpc19yZWFkID0gbWluKHJlbWFpbiwgdG9fcmVhZCkKLSAgICAgIGlmIGZpbGVwb3MgaXMgbm90IE5vbmU6Ci0gICAgICAgIHAgPSBmaWxlcG9zICsgKChzIC0gY2h1bmtfc3RhcnQpICogc2VsZi5ibG9ja3NpemUpCi0gICAgICAgIGYuc2VlayhwLCBvcy5TRUVLX1NFVCkKLSAgICAgICAgeWllbGQgZi5yZWFkKHRoaXNfcmVhZCAqIHNlbGYuYmxvY2tzaXplKQotICAgICAgZWxzZToKLSAgICAgICAgeWllbGQgZmlsbF9kYXRhICogKHRoaXNfcmVhZCAqIChzZWxmLmJsb2Nrc2l6ZSA+PiAyKSkKLSAgICAgIHRvX3JlYWQgLT0gdGhpc19yZWFkCi0KLSAgICAgIHdoaWxlIHRvX3JlYWQgPiAwOgotICAgICAgICAjIGNvbnRpbnVlIHdpdGggZm9sbG93aW5nIGNodW5rcyBpZiB0aGlzIHJhbmdlIHNwYW5zIG11bHRpcGxlIGNodW5rcy4KLSAgICAgICAgaWR4ICs9IDEKKyAgICB3aXRoIHNlbGYuZ2VuZXJhdG9yX2xvY2s6CisgICAgICBmb3IgcywgZSBpbiByYW5nZXM6CisgICAgICAgIHRvX3JlYWQgPSBlLXMKKyAgICAgICAgaWR4ID0gYmlzZWN0LmJpc2VjdF9yaWdodChzZWxmLm9mZnNldF9pbmRleCwgcykgLSAxCiAgICAgICAgIGNodW5rX3N0YXJ0LCBjaHVua19sZW4sIGZpbGVwb3MsIGZpbGxfZGF0YSA9IHNlbGYub2Zmc2V0X21hcFtpZHhdCi0gICAgICAgIHRoaXNfcmVhZCA9IG1pbihjaHVua19sZW4sIHRvX3JlYWQpCisKKyAgICAgICAgIyBmb3IgdGhlIGZpcnN0IGNodW5rIHdlIG1heSBiZSBzdGFydGluZyBwYXJ0d2F5IHRocm91Z2ggaXQuCisgICAgICAgIHJlbWFpbiA9IGNodW5rX2xlbiAtIChzIC0gY2h1bmtfc3RhcnQpCisgICAgICAgIHRoaXNfcmVhZCA9IG1pbihyZW1haW4sIHRvX3JlYWQpCiAgICAgICAgIGlmIGZpbGVwb3MgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgZi5zZWVrKGZpbGVwb3MsIG9zLlNFRUtfU0VUKQorICAgICAgICAgIHAgPSBmaWxlcG9zICsgKChzIC0gY2h1bmtfc3RhcnQpICogc2VsZi5ibG9ja3NpemUpCisgICAgICAgICAgZi5zZWVrKHAsIG9zLlNFRUtfU0VUKQogICAgICAgICAgIHlpZWxkIGYucmVhZCh0aGlzX3JlYWQgKiBzZWxmLmJsb2Nrc2l6ZSkKICAgICAgICAgZWxzZToKICAgICAgICAgICB5aWVsZCBmaWxsX2RhdGEgKiAodGhpc19yZWFkICogKHNlbGYuYmxvY2tzaXplID4+IDIpKQogICAgICAgICB0b19yZWFkIC09IHRoaXNfcmVhZAogCi0gIGRlZiBMb2FkRmlsZUJsb2NrTWFwKHNlbGYsIGZuLCBjbG9iYmVyZWRfYmxvY2tzKToKKyAgICAgICAgd2hpbGUgdG9fcmVhZCA+IDA6CisgICAgICAgICAgIyBjb250aW51ZSB3aXRoIGZvbGxvd2luZyBjaHVua3MgaWYgdGhpcyByYW5nZSBzcGFucyBtdWx0aXBsZSBjaHVua3MuCisgICAgICAgICAgaWR4ICs9IDEKKyAgICAgICAgICBjaHVua19zdGFydCwgY2h1bmtfbGVuLCBmaWxlcG9zLCBmaWxsX2RhdGEgPSBzZWxmLm9mZnNldF9tYXBbaWR4XQorICAgICAgICAgIHRoaXNfcmVhZCA9IG1pbihjaHVua19sZW4sIHRvX3JlYWQpCisgICAgICAgICAgaWYgZmlsZXBvcyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGYuc2VlayhmaWxlcG9zLCBvcy5TRUVLX1NFVCkKKyAgICAgICAgICAgIHlpZWxkIGYucmVhZCh0aGlzX3JlYWQgKiBzZWxmLmJsb2Nrc2l6ZSkKKyAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgeWllbGQgZmlsbF9kYXRhICogKHRoaXNfcmVhZCAqIChzZWxmLmJsb2Nrc2l6ZSA+PiAyKSkKKyAgICAgICAgICB0b19yZWFkIC09IHRoaXNfcmVhZAorCisgIGRlZiBMb2FkRmlsZUJsb2NrTWFwKHNlbGYsIGZuLCBjbG9iYmVyZWRfYmxvY2tzLCBhbGxvd19zaGFyZWRfYmxvY2tzKToKKyAgICAiIiJMb2FkcyB0aGUgZ2l2ZW4gYmxvY2sgbWFwIGZpbGUuCisKKyAgICBBcmdzOgorICAgICAgZm46IFRoZSBmaWxlbmFtZSBvZiB0aGUgYmxvY2sgbWFwIGZpbGUuCisgICAgICBjbG9iYmVyZWRfYmxvY2tzOiBBIFJhbmdlU2V0IGluc3RhbmNlIGZvciB0aGUgY2xvYmJlcmVkIGJsb2Nrcy4KKyAgICAgIGFsbG93X3NoYXJlZF9ibG9ja3M6IFdoZXRoZXIgaGF2aW5nIHNoYXJlZCBibG9ja3MgaXMgYWxsb3dlZC4KKyAgICAiIiIKICAgICByZW1haW5pbmcgPSBzZWxmLmNhcmVfbWFwCiAgICAgc2VsZi5maWxlX21hcCA9IG91dCA9IHt9CiAKQEAgLTIxNCw2ICsyMjUsMTggQEAKICAgICAgIGZvciBsaW5lIGluIGY6CiAgICAgICAgIGZuLCByYW5nZXMgPSBsaW5lLnNwbGl0KE5vbmUsIDEpCiAgICAgICAgIHJhbmdlcyA9IHJhbmdlbGliLlJhbmdlU2V0LnBhcnNlKHJhbmdlcykKKworICAgICAgICBpZiBhbGxvd19zaGFyZWRfYmxvY2tzOgorICAgICAgICAgICMgRmluZCB0aGUgc2hhcmVkIGJsb2NrcyB0aGF0IGhhdmUgYmVlbiBjbGFpbWVkIGJ5IG90aGVycy4KKyAgICAgICAgICBzaGFyZWRfYmxvY2tzID0gcmFuZ2VzLnN1YnRyYWN0KHJlbWFpbmluZykKKyAgICAgICAgICBpZiBzaGFyZWRfYmxvY2tzOgorICAgICAgICAgICAgcmFuZ2VzID0gcmFuZ2VzLnN1YnRyYWN0KHNoYXJlZF9ibG9ja3MpCisgICAgICAgICAgICBpZiBub3QgcmFuZ2VzOgorICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICAjIFRhZyB0aGUgZW50cnkgc28gdGhhdCB3ZSBjYW4gc2tpcCBhcHBseWluZyBpbWdkaWZmIG9uIHRoaXMgZmlsZS4KKyAgICAgICAgICAgIHJhbmdlcy5leHRyYVsndXNlc19zaGFyZWRfYmxvY2tzJ10gPSBUcnVlCisKICAgICAgICAgb3V0W2ZuXSA9IHJhbmdlcwogICAgICAgICBhc3NlcnQgcmFuZ2VzLnNpemUoKSA9PSByYW5nZXMuaW50ZXJzZWN0KHJlbWFpbmluZykuc2l6ZSgpCiAKZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbGVhc2V0b29scy90ZXN0X2FkZF9pbWdfdG9fdGFyZ2V0X2ZpbGVzLnB5IGIvdG9vbHMvcmVsZWFzZXRvb2xzL3Rlc3RfYWRkX2ltZ190b190YXJnZXRfZmlsZXMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWEwZjc4ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3JlbGVhc2V0b29scy90ZXN0X2FkZF9pbWdfdG9fdGFyZ2V0X2ZpbGVzLnB5CkBAIC0wLDAgKzEsMzM5IEBACisjCisjIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitpbXBvcnQgb3MKK2ltcG9ydCBvcy5wYXRoCitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCB6aXBmaWxlCisKK2ltcG9ydCBjb21tb24KK2ltcG9ydCB0ZXN0X3V0aWxzCitmcm9tIGFkZF9pbWdfdG9fdGFyZ2V0X2ZpbGVzIGltcG9ydCAoCisgICAgQWRkQ2FyZU1hcFR4dEZvckFiT3RhLCBBZGRQYWNrUmFkaW9JbWFnZXMsIEFkZFJhZGlvSW1hZ2VzRm9yQWJPdGEsCisgICAgR2V0Q2FyZU1hcCkKK2Zyb20gcmFuZ2VsaWIgaW1wb3J0IFJhbmdlU2V0CisKKworT1BUSU9OUyA9IGNvbW1vbi5PUFRJT05TCisKKworY2xhc3MgQWRkSW1hZ2VzVG9UYXJnZXRGaWxlc1Rlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgIGRlZiBzZXRVcChzZWxmKToKKyAgICBPUFRJT05TLmlucHV0X3RtcCA9IGNvbW1vbi5NYWtlVGVtcERpcigpCisKKyAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgIGNvbW1vbi5DbGVhbnVwKCkKKworICBAc3RhdGljbWV0aG9kCisgIGRlZiBfY3JlYXRlX2ltYWdlcyhpbWFnZXMsIHByZWZpeCk6CisgICAgIiIiQ3JlYXRlcyBpbWFnZXMgdW5kZXIgT1BUSU9OUy5pbnB1dF90bXAvcHJlZml4LiIiIgorICAgIHBhdGggPSBvcy5wYXRoLmpvaW4oT1BUSU9OUy5pbnB1dF90bXAsIHByZWZpeCkKKyAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMocGF0aCk6CisgICAgICBvcy5ta2RpcihwYXRoKQorCisgICAgZm9yIGltYWdlIGluIGltYWdlczoKKyAgICAgIGltYWdlX3BhdGggPSBvcy5wYXRoLmpvaW4ocGF0aCwgaW1hZ2UgKyAnLmltZycpCisgICAgICB3aXRoIG9wZW4oaW1hZ2VfcGF0aCwgJ3diJykgYXMgaW1hZ2VfZnA6CisgICAgICAgIGltYWdlX2ZwLndyaXRlKGltYWdlLmVuY29kZSgpKQorCisgICAgaW1hZ2VzX3BhdGggPSBvcy5wYXRoLmpvaW4oT1BUSU9OUy5pbnB1dF90bXAsICdJTUFHRVMnKQorICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhpbWFnZXNfcGF0aCk6CisgICAgICBvcy5ta2RpcihpbWFnZXNfcGF0aCkKKyAgICByZXR1cm4gaW1hZ2VzLCBpbWFnZXNfcGF0aAorCisgIGRlZiB0ZXN0X0FkZFJhZGlvSW1hZ2VzRm9yQWJPdGFfaW1hZ2VFeGlzdHMoc2VsZik6CisgICAgIiIiVGVzdHMgdGhlIGNhc2Ugd2l0aCBleGlzdGluZyBpbWFnZXMgdW5kZXIgSU1BR0VTLy4iIiIKKyAgICBpbWFnZXMsIGltYWdlc19wYXRoID0gc2VsZi5fY3JlYXRlX2ltYWdlcyhbJ2Fib290JywgJ3hibCddLCAnSU1BR0VTJykKKyAgICBBZGRSYWRpb0ltYWdlc0ZvckFiT3RhKE5vbmUsIGltYWdlcykKKworICAgIGZvciBpbWFnZSBpbiBpbWFnZXM6CisgICAgICBzZWxmLmFzc2VydFRydWUoCisgICAgICAgICAgb3MucGF0aC5leGlzdHMob3MucGF0aC5qb2luKGltYWdlc19wYXRoLCBpbWFnZSArICcuaW1nJykpKQorCisgIGRlZiB0ZXN0X0FkZFJhZGlvSW1hZ2VzRm9yQWJPdGFfY29weUZyb21SYWRpbyhzZWxmKToKKyAgICAiIiJUZXN0cyB0aGUgY2FzZSB0aGF0IGNvcGllcyBpbWFnZXMgZnJvbSBSQURJTy8uIiIiCisgICAgaW1hZ2VzLCBpbWFnZXNfcGF0aCA9IHNlbGYuX2NyZWF0ZV9pbWFnZXMoWydhYm9vdCcsICd4YmwnXSwgJ1JBRElPJykKKyAgICBBZGRSYWRpb0ltYWdlc0ZvckFiT3RhKE5vbmUsIGltYWdlcykKKworICAgIGZvciBpbWFnZSBpbiBpbWFnZXM6CisgICAgICBzZWxmLmFzc2VydFRydWUoCisgICAgICAgICAgb3MucGF0aC5leGlzdHMob3MucGF0aC5qb2luKGltYWdlc19wYXRoLCBpbWFnZSArICcuaW1nJykpKQorCisgIGRlZiB0ZXN0X0FkZFJhZGlvSW1hZ2VzRm9yQWJPdGFfY29weUZyb21SYWRpb196aXBPdXRwdXQoc2VsZik6CisgICAgaW1hZ2VzLCBfID0gc2VsZi5fY3JlYXRlX2ltYWdlcyhbJ2Fib290JywgJ3hibCddLCAnUkFESU8nKQorCisgICAgIyBTZXQgdXAgdGhlIG91dHB1dCB6aXAuCisgICAgb3V0cHV0X2ZpbGUgPSBjb21tb24uTWFrZVRlbXBGaWxlKHN1ZmZpeD0nLnppcCcpCisgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUob3V0cHV0X2ZpbGUsICd3JykgYXMgb3V0cHV0X3ppcDoKKyAgICAgIEFkZFJhZGlvSW1hZ2VzRm9yQWJPdGEob3V0cHV0X3ppcCwgaW1hZ2VzKQorCisgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUob3V0cHV0X2ZpbGUsICdyJykgYXMgdmVyaWZ5X3ppcDoKKyAgICAgIGZvciBpbWFnZSBpbiBpbWFnZXM6CisgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ0lNQUdFUy8nICsgaW1hZ2UgKyAnLmltZycsIHZlcmlmeV96aXAubmFtZWxpc3QoKSkKKworICBkZWYgdGVzdF9BZGRSYWRpb0ltYWdlc0ZvckFiT3RhX2NvcHlGcm9tVmVuZG9ySW1hZ2VzKHNlbGYpOgorICAgICIiIlRlc3RzIHRoZSBjYXNlIHRoYXQgY29waWVzIGltYWdlcyBmcm9tIFZFTkRPUl9JTUFHRVMvLiIiIgorICAgIHZlbmRvcl9pbWFnZXNfcGF0aCA9IG9zLnBhdGguam9pbihPUFRJT05TLmlucHV0X3RtcCwgJ1ZFTkRPUl9JTUFHRVMnKQorICAgIG9zLm1rZGlyKHZlbmRvcl9pbWFnZXNfcGF0aCkKKworICAgIHBhcnRpdGlvbnMgPSBbJ2Fib290JywgJ3hibCddCisgICAgZm9yIGluZGV4LCBwYXJ0aXRpb24gaW4gZW51bWVyYXRlKHBhcnRpdGlvbnMpOgorICAgICAgc3ViZGlyID0gb3MucGF0aC5qb2luKHZlbmRvcl9pbWFnZXNfcGF0aCwgJ3N1YmRpci17fScuZm9ybWF0KGluZGV4KSkKKyAgICAgIG9zLm1rZGlyKHN1YmRpcikKKworICAgICAgcGFydGl0aW9uX2ltYWdlX3BhdGggPSBvcy5wYXRoLmpvaW4oc3ViZGlyLCBwYXJ0aXRpb24gKyAnLmltZycpCisgICAgICB3aXRoIG9wZW4ocGFydGl0aW9uX2ltYWdlX3BhdGgsICd3YicpIGFzIHBhcnRpdGlvbl9mcDoKKyAgICAgICAgcGFydGl0aW9uX2ZwLndyaXRlKHBhcnRpdGlvbi5lbmNvZGUoKSkKKworICAgICMgU2V0IHVwIHRoZSBvdXRwdXQgZGlyLgorICAgIGltYWdlc19wYXRoID0gb3MucGF0aC5qb2luKE9QVElPTlMuaW5wdXRfdG1wLCAnSU1BR0VTJykKKyAgICBvcy5ta2RpcihpbWFnZXNfcGF0aCkKKworICAgIEFkZFJhZGlvSW1hZ2VzRm9yQWJPdGEoTm9uZSwgcGFydGl0aW9ucykKKworICAgIGZvciBwYXJ0aXRpb24gaW4gcGFydGl0aW9uczoKKyAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICBvcy5wYXRoLmV4aXN0cyhvcy5wYXRoLmpvaW4oaW1hZ2VzX3BhdGgsIHBhcnRpdGlvbiArICcuaW1nJykpKQorCisgIGRlZiB0ZXN0X0FkZFJhZGlvSW1hZ2VzRm9yQWJPdGFfbWlzc2luZ0ltYWdlcyhzZWxmKToKKyAgICBpbWFnZXMsIF8gPSBzZWxmLl9jcmVhdGVfaW1hZ2VzKFsnYWJvb3QnLCAneGJsJ10sICdSQURJTycpCisgICAgc2VsZi5hc3NlcnRSYWlzZXMoQXNzZXJ0aW9uRXJyb3IsIEFkZFJhZGlvSW1hZ2VzRm9yQWJPdGEsIE5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VzICsgWydiYXonXSkKKworICBkZWYgdGVzdF9BZGRSYWRpb0ltYWdlc0ZvckFiT3RhX21pc3NpbmdJbWFnZXNfemlwT3V0cHV0KHNlbGYpOgorICAgIGltYWdlcywgXyA9IHNlbGYuX2NyZWF0ZV9pbWFnZXMoWydhYm9vdCcsICd4YmwnXSwgJ1JBRElPJykKKworICAgICMgU2V0IHVwIHRoZSBvdXRwdXQgemlwLgorICAgIG91dHB1dF9maWxlID0gY29tbW9uLk1ha2VUZW1wRmlsZShzdWZmaXg9Jy56aXAnKQorICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKG91dHB1dF9maWxlLCAndycpIGFzIG91dHB1dF96aXA6CisgICAgICBzZWxmLmFzc2VydFJhaXNlcyhBc3NlcnRpb25FcnJvciwgQWRkUmFkaW9JbWFnZXNGb3JBYk90YSwgb3V0cHV0X3ppcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlcyArIFsnYmF6J10pCisKKyAgZGVmIHRlc3RfQWRkUGFja1JhZGlvSW1hZ2VzKHNlbGYpOgorICAgIGltYWdlcywgaW1hZ2VzX3BhdGggPSBzZWxmLl9jcmVhdGVfaW1hZ2VzKFsnZm9vJywgJ2JhciddLCAnUkFESU8nKQorICAgIEFkZFBhY2tSYWRpb0ltYWdlcyhOb25lLCBpbWFnZXMpCisKKyAgICBmb3IgaW1hZ2UgaW4gaW1hZ2VzOgorICAgICAgc2VsZi5hc3NlcnRUcnVlKAorICAgICAgICAgIG9zLnBhdGguZXhpc3RzKG9zLnBhdGguam9pbihpbWFnZXNfcGF0aCwgaW1hZ2UgKyAnLmltZycpKSkKKworICBkZWYgdGVzdF9BZGRQYWNrUmFkaW9JbWFnZXNfd2l0aF9zdWZmaXgoc2VsZik6CisgICAgaW1hZ2VzLCBpbWFnZXNfcGF0aCA9IHNlbGYuX2NyZWF0ZV9pbWFnZXMoWydmb28nLCAnYmFyJ10sICdSQURJTycpCisgICAgaW1hZ2VzX3dpdGhfc3VmZml4ID0gW2ltYWdlICsgJy5pbWcnIGZvciBpbWFnZSBpbiBpbWFnZXNdCisgICAgQWRkUGFja1JhZGlvSW1hZ2VzKE5vbmUsIGltYWdlc193aXRoX3N1ZmZpeCkKKworICAgIGZvciBpbWFnZSBpbiBpbWFnZXM6CisgICAgICBzZWxmLmFzc2VydFRydWUoCisgICAgICAgICAgb3MucGF0aC5leGlzdHMob3MucGF0aC5qb2luKGltYWdlc19wYXRoLCBpbWFnZSArICcuaW1nJykpKQorCisgIGRlZiB0ZXN0X0FkZFBhY2tSYWRpb0ltYWdlc196aXBPdXRwdXQoc2VsZik6CisgICAgaW1hZ2VzLCBfID0gc2VsZi5fY3JlYXRlX2ltYWdlcyhbJ2ZvbycsICdiYXInXSwgJ1JBRElPJykKKworICAgICMgU2V0IHVwIHRoZSBvdXRwdXQgemlwLgorICAgIG91dHB1dF9maWxlID0gY29tbW9uLk1ha2VUZW1wRmlsZShzdWZmaXg9Jy56aXAnKQorICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKG91dHB1dF9maWxlLCAndycpIGFzIG91dHB1dF96aXA6CisgICAgICBBZGRQYWNrUmFkaW9JbWFnZXMob3V0cHV0X3ppcCwgaW1hZ2VzKQorCisgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUob3V0cHV0X2ZpbGUsICdyJykgYXMgdmVyaWZ5X3ppcDoKKyAgICAgIGZvciBpbWFnZSBpbiBpbWFnZXM6CisgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ0lNQUdFUy8nICsgaW1hZ2UgKyAnLmltZycsIHZlcmlmeV96aXAubmFtZWxpc3QoKSkKKworICBkZWYgdGVzdF9BZGRQYWNrUmFkaW9JbWFnZXNfaW1hZ2VFeGlzdHMoc2VsZik6CisgICAgaW1hZ2VzLCBpbWFnZXNfcGF0aCA9IHNlbGYuX2NyZWF0ZV9pbWFnZXMoWydmb28nLCAnYmFyJ10sICdSQURJTycpCisKKyAgICAjIEFkZGl0aW9uYWxseSBjcmVhdGUgaW1hZ2VzIHVuZGVyIElNQUdFUy8gc28gdGhhdCB0aGV5IHNob3VsZCBiZSBza2lwcGVkLgorICAgIGltYWdlcywgaW1hZ2VzX3BhdGggPSBzZWxmLl9jcmVhdGVfaW1hZ2VzKFsnZm9vJywgJ2JhciddLCAnSU1BR0VTJykKKworICAgIEFkZFBhY2tSYWRpb0ltYWdlcyhOb25lLCBpbWFnZXMpCisKKyAgICBmb3IgaW1hZ2UgaW4gaW1hZ2VzOgorICAgICAgc2VsZi5hc3NlcnRUcnVlKAorICAgICAgICAgIG9zLnBhdGguZXhpc3RzKG9zLnBhdGguam9pbihpbWFnZXNfcGF0aCwgaW1hZ2UgKyAnLmltZycpKSkKKworICBkZWYgdGVzdF9BZGRQYWNrUmFkaW9JbWFnZXNfbWlzc2luZ0ltYWdlcyhzZWxmKToKKyAgICBpbWFnZXMsIF8gPSBzZWxmLl9jcmVhdGVfaW1hZ2VzKFsnZm9vJywgJ2JhciddLCAnUkFESU8nKQorICAgIEFkZFBhY2tSYWRpb0ltYWdlcyhOb25lLCBpbWFnZXMpCisKKyAgICBzZWxmLmFzc2VydFJhaXNlcyhBc3NlcnRpb25FcnJvciwgQWRkUGFja1JhZGlvSW1hZ2VzLCBOb25lLAorICAgICAgICAgICAgICAgICAgICAgIGltYWdlcyArIFsnYmF6J10pCisKKyAgQHN0YXRpY21ldGhvZAorICBkZWYgX3Rlc3RfQWRkQ2FyZU1hcFR4dEZvckFiT3RhKCk6CisgICAgIiIiSGVscGVyIGZ1bmN0aW9uIHRvIHNldCB1cCB0aGUgdGVzdCBmb3IgdGVzdF9BZGRDYXJlTWFwVHh0Rm9yQWJPdGEoKS4iIiIKKyAgICBPUFRJT05TLmluZm9fZGljdCA9IHsKKyAgICAgICAgJ3N5c3RlbV92ZXJpdHlfYmxvY2tfZGV2aWNlJyA6ICcvZGV2L2Jsb2NrL3N5c3RlbScsCisgICAgICAgICd2ZW5kb3JfdmVyaXR5X2Jsb2NrX2RldmljZScgOiAnL2Rldi9ibG9jay92ZW5kb3InLAorICAgIH0KKworICAgICMgUHJlcGFyZSB0aGUgTUVUQS8gZm9sZGVyLgorICAgIG1ldGFfcGF0aCA9IG9zLnBhdGguam9pbihPUFRJT05TLmlucHV0X3RtcCwgJ01FVEEnKQorICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhtZXRhX3BhdGgpOgorICAgICAgb3MubWtkaXIobWV0YV9wYXRoKQorCisgICAgc3lzdGVtX2ltYWdlID0gdGVzdF91dGlscy5jb25zdHJ1Y3Rfc3BhcnNlX2ltYWdlKFsKKyAgICAgICAgKDB4Q0FDMSwgNiksCisgICAgICAgICgweENBQzMsIDQpLAorICAgICAgICAoMHhDQUMxLCA2KV0pCisgICAgdmVuZG9yX2ltYWdlID0gdGVzdF91dGlscy5jb25zdHJ1Y3Rfc3BhcnNlX2ltYWdlKFsKKyAgICAgICAgKDB4Q0FDMiwgMTApXSkKKworICAgIGltYWdlX3BhdGhzID0geworICAgICAgICAnc3lzdGVtJyA6IHN5c3RlbV9pbWFnZSwKKyAgICAgICAgJ3ZlbmRvcicgOiB2ZW5kb3JfaW1hZ2UsCisgICAgfQorICAgIHJldHVybiBpbWFnZV9wYXRocworCisgIGRlZiB0ZXN0X0FkZENhcmVNYXBUeHRGb3JBYk90YShzZWxmKToKKyAgICBpbWFnZV9wYXRocyA9IHNlbGYuX3Rlc3RfQWRkQ2FyZU1hcFR4dEZvckFiT3RhKCkKKworICAgIEFkZENhcmVNYXBUeHRGb3JBYk90YShOb25lLCBbJ3N5c3RlbScsICd2ZW5kb3InXSwgaW1hZ2VfcGF0aHMpCisKKyAgICBjYXJlX21hcF9maWxlID0gb3MucGF0aC5qb2luKE9QVElPTlMuaW5wdXRfdG1wLCAnTUVUQScsICdjYXJlX21hcC50eHQnKQorICAgIHdpdGggb3BlbihjYXJlX21hcF9maWxlLCAncicpIGFzIHZlcmlmeV9mcDoKKyAgICAgIGNhcmVfbWFwID0gdmVyaWZ5X2ZwLnJlYWQoKQorCisgICAgbGluZXMgPSBjYXJlX21hcC5zcGxpdCgnXG4nKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoNCwgbGVuKGxpbmVzKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKCdzeXN0ZW0nLCBsaW5lc1swXSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKFJhbmdlU2V0KCIwLTUgMTAtMTUiKS50b19zdHJpbmdfcmF3KCksIGxpbmVzWzFdKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3ZlbmRvcicsIGxpbmVzWzJdKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoUmFuZ2VTZXQoIjAtOSIpLnRvX3N0cmluZ19yYXcoKSwgbGluZXNbM10pCisKKyAgZGVmIHRlc3RfQWRkQ2FyZU1hcFR4dEZvckFiT3RhX3dpdGhOb25DYXJlTWFwUGFydGl0aW9ucyhzZWxmKToKKyAgICAiIiJQYXJ0aXRpb25zIHdpdGhvdXQgY2FyZV9tYXAgc2hvdWxkIGJlIGlnbm9yZWQuIiIiCisgICAgaW1hZ2VfcGF0aHMgPSBzZWxmLl90ZXN0X0FkZENhcmVNYXBUeHRGb3JBYk90YSgpCisKKyAgICBBZGRDYXJlTWFwVHh0Rm9yQWJPdGEoCisgICAgICAgIE5vbmUsIFsnYm9vdCcsICdzeXN0ZW0nLCAndmVuZG9yJywgJ3ZibWV0YSddLCBpbWFnZV9wYXRocykKKworICAgIGNhcmVfbWFwX2ZpbGUgPSBvcy5wYXRoLmpvaW4oT1BUSU9OUy5pbnB1dF90bXAsICdNRVRBJywgJ2NhcmVfbWFwLnR4dCcpCisgICAgd2l0aCBvcGVuKGNhcmVfbWFwX2ZpbGUsICdyJykgYXMgdmVyaWZ5X2ZwOgorICAgICAgY2FyZV9tYXAgPSB2ZXJpZnlfZnAucmVhZCgpCisKKyAgICBsaW5lcyA9IGNhcmVfbWFwLnNwbGl0KCdcbicpCisgICAgc2VsZi5hc3NlcnRFcXVhbCg0LCBsZW4obGluZXMpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3N5c3RlbScsIGxpbmVzWzBdKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoUmFuZ2VTZXQoIjAtNSAxMC0xNSIpLnRvX3N0cmluZ19yYXcoKSwgbGluZXNbMV0pCisgICAgc2VsZi5hc3NlcnRFcXVhbCgndmVuZG9yJywgbGluZXNbMl0pCisgICAgc2VsZi5hc3NlcnRFcXVhbChSYW5nZVNldCgiMC05IikudG9fc3RyaW5nX3JhdygpLCBsaW5lc1szXSkKKworICBkZWYgdGVzdF9BZGRDYXJlTWFwVHh0Rm9yQWJPdGFfd2l0aEF2YihzZWxmKToKKyAgICAiIiJUZXN0cyB0aGUgY2FzZSBmb3IgZGV2aWNlIHVzaW5nIEFWQi4iIiIKKyAgICBpbWFnZV9wYXRocyA9IHNlbGYuX3Rlc3RfQWRkQ2FyZU1hcFR4dEZvckFiT3RhKCkKKyAgICBPUFRJT05TLmluZm9fZGljdCA9IHsKKyAgICAgICAgJ2F2Yl9zeXN0ZW1faGFzaHRyZWVfZW5hYmxlJyA6ICd0cnVlJywKKyAgICAgICAgJ2F2Yl92ZW5kb3JfaGFzaHRyZWVfZW5hYmxlJyA6ICd0cnVlJywKKyAgICB9CisKKyAgICBBZGRDYXJlTWFwVHh0Rm9yQWJPdGEoTm9uZSwgWydzeXN0ZW0nLCAndmVuZG9yJ10sIGltYWdlX3BhdGhzKQorCisgICAgY2FyZV9tYXBfZmlsZSA9IG9zLnBhdGguam9pbihPUFRJT05TLmlucHV0X3RtcCwgJ01FVEEnLCAnY2FyZV9tYXAudHh0JykKKyAgICB3aXRoIG9wZW4oY2FyZV9tYXBfZmlsZSwgJ3InKSBhcyB2ZXJpZnlfZnA6CisgICAgICBjYXJlX21hcCA9IHZlcmlmeV9mcC5yZWFkKCkKKworICAgIGxpbmVzID0gY2FyZV9tYXAuc3BsaXQoJ1xuJykKKyAgICBzZWxmLmFzc2VydEVxdWFsKDQsIGxlbihsaW5lcykpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgnc3lzdGVtJywgbGluZXNbMF0pCisgICAgc2VsZi5hc3NlcnRFcXVhbChSYW5nZVNldCgiMC01IDEwLTE1IikudG9fc3RyaW5nX3JhdygpLCBsaW5lc1sxXSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKCd2ZW5kb3InLCBsaW5lc1syXSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKFJhbmdlU2V0KCIwLTkiKS50b19zdHJpbmdfcmF3KCksIGxpbmVzWzNdKQorCisgIGRlZiB0ZXN0X0FkZENhcmVNYXBUeHRGb3JBYk90YV92ZXJpdHlOb3RFbmFibGVkKHNlbGYpOgorICAgICIiIk5vIGNhcmVfbWFwLnR4dCBzaG91bGQgYmUgZ2VuZXJhdGVkIGlmIHZlcml0eSBub3QgZW5hYmxlZC4iIiIKKyAgICBpbWFnZV9wYXRocyA9IHNlbGYuX3Rlc3RfQWRkQ2FyZU1hcFR4dEZvckFiT3RhKCkKKyAgICBPUFRJT05TLmluZm9fZGljdCA9IHt9CisgICAgQWRkQ2FyZU1hcFR4dEZvckFiT3RhKE5vbmUsIFsnc3lzdGVtJywgJ3ZlbmRvciddLCBpbWFnZV9wYXRocykKKworICAgIGNhcmVfbWFwX2ZpbGUgPSBvcy5wYXRoLmpvaW4oT1BUSU9OUy5pbnB1dF90bXAsICdNRVRBJywgJ2NhcmVfbWFwLnR4dCcpCisgICAgc2VsZi5hc3NlcnRGYWxzZShvcy5wYXRoLmV4aXN0cyhjYXJlX21hcF9maWxlKSkKKworICBkZWYgdGVzdF9BZGRDYXJlTWFwVHh0Rm9yQWJPdGFfbWlzc2luZ0ltYWdlRmlsZShzZWxmKToKKyAgICAiIiJNaXNzaW5nIGltYWdlIGZpbGUgc2hvdWxkIGJlIGNvbnNpZGVyZWQgZmF0YWwuIiIiCisgICAgaW1hZ2VfcGF0aHMgPSBzZWxmLl90ZXN0X0FkZENhcmVNYXBUeHRGb3JBYk90YSgpCisgICAgaW1hZ2VfcGF0aHNbJ3ZlbmRvciddID0gJycKKyAgICBzZWxmLmFzc2VydFJhaXNlcyhBc3NlcnRpb25FcnJvciwgQWRkQ2FyZU1hcFR4dEZvckFiT3RhLCBOb25lLAorICAgICAgICAgICAgICAgICAgICAgIFsnc3lzdGVtJywgJ3ZlbmRvciddLCBpbWFnZV9wYXRocykKKworICBkZWYgdGVzdF9BZGRDYXJlTWFwVHh0Rm9yQWJPdGFfemlwT3V0cHV0KHNlbGYpOgorICAgICIiIlRlc3RzIHRoZSBjYXNlIHdpdGggWklQIG91dHB1dC4iIiIKKyAgICBpbWFnZV9wYXRocyA9IHNlbGYuX3Rlc3RfQWRkQ2FyZU1hcFR4dEZvckFiT3RhKCkKKworICAgIG91dHB1dF9maWxlID0gY29tbW9uLk1ha2VUZW1wRmlsZShzdWZmaXg9Jy56aXAnKQorICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKG91dHB1dF9maWxlLCAndycpIGFzIG91dHB1dF96aXA6CisgICAgICBBZGRDYXJlTWFwVHh0Rm9yQWJPdGEob3V0cHV0X3ppcCwgWydzeXN0ZW0nLCAndmVuZG9yJ10sIGltYWdlX3BhdGhzKQorCisgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUob3V0cHV0X2ZpbGUsICdyJykgYXMgdmVyaWZ5X3ppcDoKKyAgICAgIGNhcmVfbWFwID0gdmVyaWZ5X3ppcC5yZWFkKCdNRVRBL2NhcmVfbWFwLnR4dCcpLmRlY29kZSgnYXNjaWknKQorCisgICAgbGluZXMgPSBjYXJlX21hcC5zcGxpdCgnXG4nKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoNCwgbGVuKGxpbmVzKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKCdzeXN0ZW0nLCBsaW5lc1swXSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKFJhbmdlU2V0KCIwLTUgMTAtMTUiKS50b19zdHJpbmdfcmF3KCksIGxpbmVzWzFdKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3ZlbmRvcicsIGxpbmVzWzJdKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoUmFuZ2VTZXQoIjAtOSIpLnRvX3N0cmluZ19yYXcoKSwgbGluZXNbM10pCisKKyAgZGVmIHRlc3RfQWRkQ2FyZU1hcFR4dEZvckFiT3RhX3ppcE91dHB1dF9jYXJlTWFwRW50cnlFeGlzdHMoc2VsZik6CisgICAgIiIiVGVzdHMgdGhlIGNhc2Ugd2l0aCBaSVAgb3V0cHV0IHdoaWNoIGFscmVhZHkgaGFzIGNhcmVfbWFwIGVudHJ5LiIiIgorICAgIGltYWdlX3BhdGhzID0gc2VsZi5fdGVzdF9BZGRDYXJlTWFwVHh0Rm9yQWJPdGEoKQorCisgICAgb3V0cHV0X2ZpbGUgPSBjb21tb24uTWFrZVRlbXBGaWxlKHN1ZmZpeD0nLnppcCcpCisgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUob3V0cHV0X2ZpbGUsICd3JykgYXMgb3V0cHV0X3ppcDoKKyAgICAgICMgQ3JlYXRlIGFuIGV4aXN0aW5nIE1FVEEvY2FyZV9tYXAudHh0IGVudHJ5LgorICAgICAgY29tbW9uLlppcFdyaXRlU3RyKG91dHB1dF96aXAsICdNRVRBL2NhcmVfbWFwLnR4dCcsICdkdW1teSBjYXJlX21hcC50eHQnKQorCisgICAgICAjIFJlcXVlc3QgdG8gYWRkIE1FVEEvY2FyZV9tYXAudHh0IGFnYWluLgorICAgICAgQWRkQ2FyZU1hcFR4dEZvckFiT3RhKG91dHB1dF96aXAsIFsnc3lzdGVtJywgJ3ZlbmRvciddLCBpbWFnZV9wYXRocykKKworICAgICMgVGhlIG9uZSB1bmRlciBPUFRJT05TLmlucHV0X3RtcCBtdXN0IGhhdmUgYmVlbiByZXBsYWNlZC4KKyAgICBjYXJlX21hcF9maWxlID0gb3MucGF0aC5qb2luKE9QVElPTlMuaW5wdXRfdG1wLCAnTUVUQScsICdjYXJlX21hcC50eHQnKQorICAgIHdpdGggb3BlbihjYXJlX21hcF9maWxlLCAncicpIGFzIHZlcmlmeV9mcDoKKyAgICAgIGNhcmVfbWFwID0gdmVyaWZ5X2ZwLnJlYWQoKQorCisgICAgbGluZXMgPSBjYXJlX21hcC5zcGxpdCgnXG4nKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoNCwgbGVuKGxpbmVzKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKCdzeXN0ZW0nLCBsaW5lc1swXSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKFJhbmdlU2V0KCIwLTUgMTAtMTUiKS50b19zdHJpbmdfcmF3KCksIGxpbmVzWzFdKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3ZlbmRvcicsIGxpbmVzWzJdKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoUmFuZ2VTZXQoIjAtOSIpLnRvX3N0cmluZ19yYXcoKSwgbGluZXNbM10pCisKKyAgICAjIFRoZSBleGlzdGluZyBlbnRyeSBzaG91bGQgYmUgc2NoZWR1bGVkIHRvIGJlIHJlcGxhY2VkLgorICAgIHNlbGYuYXNzZXJ0SW4oJ01FVEEvY2FyZV9tYXAudHh0JywgT1BUSU9OUy5yZXBsYWNlX3VwZGF0ZWRfZmlsZXNfbGlzdCkKKworICBkZWYgdGVzdF9HZXRDYXJlTWFwKHNlbGYpOgorICAgIHNwYXJzZV9pbWFnZSA9IHRlc3RfdXRpbHMuY29uc3RydWN0X3NwYXJzZV9pbWFnZShbCisgICAgICAgICgweENBQzEsIDYpLAorICAgICAgICAoMHhDQUMzLCA0KSwKKyAgICAgICAgKDB4Q0FDMSwgNildKQorICAgIE9QVElPTlMuaW5mb19kaWN0ID0geworICAgICAgICAnc3lzdGVtX2FkanVzdGVkX3BhcnRpdGlvbl9zaXplJyA6IDEyLAorICAgIH0KKyAgICBuYW1lLCBjYXJlX21hcCA9IEdldENhcmVNYXAoJ3N5c3RlbScsIHNwYXJzZV9pbWFnZSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKCdzeXN0ZW0nLCBuYW1lKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoUmFuZ2VTZXQoIjAtNSAxMC0xMiIpLnRvX3N0cmluZ19yYXcoKSwgY2FyZV9tYXApCisKKyAgZGVmIHRlc3RfR2V0Q2FyZU1hcF9pbnZhbGlkUGFydGl0aW9uKHNlbGYpOgorICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEFzc2VydGlvbkVycm9yLCBHZXRDYXJlTWFwLCAnb2VtJywgTm9uZSkKKworICBkZWYgdGVzdF9HZXRDYXJlTWFwX2ludmFsaWRBZGp1c3RlZFBhcnRpdGlvblNpemUoc2VsZik6CisgICAgc3BhcnNlX2ltYWdlID0gdGVzdF91dGlscy5jb25zdHJ1Y3Rfc3BhcnNlX2ltYWdlKFsKKyAgICAgICAgKDB4Q0FDMSwgNiksCisgICAgICAgICgweENBQzMsIDQpLAorICAgICAgICAoMHhDQUMxLCA2KV0pCisgICAgT1BUSU9OUy5pbmZvX2RpY3QgPSB7CisgICAgICAgICdzeXN0ZW1fYWRqdXN0ZWRfcGFydGl0aW9uX3NpemUnIDogLTEyLAorICAgIH0KKyAgICBzZWxmLmFzc2VydFJhaXNlcyhBc3NlcnRpb25FcnJvciwgR2V0Q2FyZU1hcCwgJ3N5c3RlbScsIHNwYXJzZV9pbWFnZSkKZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbGVhc2V0b29scy90ZXN0X2Jsb2NraW1nZGlmZi5weSBiL3Rvb2xzL3JlbGVhc2V0b29scy90ZXN0X2Jsb2NraW1nZGlmZi5weQppbmRleCBlNWEzNjk0Li5jZWFkYTE4IDEwMDY0NAotLS0gYS90b29scy9yZWxlYXNldG9vbHMvdGVzdF9ibG9ja2ltZ2RpZmYucHkKKysrIGIvdG9vbHMvcmVsZWFzZXRvb2xzL3Rlc3RfYmxvY2tpbWdkaWZmLnB5CkBAIC0xNiwxMiArMTYsNDQgQEAKIAogZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBwcmludF9mdW5jdGlvbgogCi1pbXBvcnQgY29tbW9uCiBpbXBvcnQgdW5pdHRlc3QKIAotZnJvbSBibG9ja2ltZ2RpZmYgaW1wb3J0IEJsb2NrSW1hZ2VEaWZmLCBFbXB0eUltYWdlLCBUcmFuc2ZlcgoraW1wb3J0IGNvbW1vbgorZnJvbSBibG9ja2ltZ2RpZmYgaW1wb3J0IChCbG9ja0ltYWdlRGlmZiwgRW1wdHlJbWFnZSwgSGVhcEl0ZW0sIEltZ2RpZmZTdGF0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNmZXIpCiBmcm9tIHJhbmdlbGliIGltcG9ydCBSYW5nZVNldAogCisKK2NsYXNzIEhlYWxwSXRlbVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgIGNsYXNzIEl0ZW0ob2JqZWN0KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgc2NvcmUpOgorICAgICAgc2VsZi5zY29yZSA9IHNjb3JlCisKKyAgZGVmIHRlc3RfaW5pdChzZWxmKToKKyAgICBpdGVtMSA9IEhlYXBJdGVtKHNlbGYuSXRlbSgxNSkpCisgICAgaXRlbTIgPSBIZWFwSXRlbShzZWxmLkl0ZW0oMjApKQorICAgIGl0ZW0zID0gSGVhcEl0ZW0oc2VsZi5JdGVtKDE1KSkKKyAgICBzZWxmLmFzc2VydFRydWUoaXRlbTEpCisgICAgc2VsZi5hc3NlcnRUcnVlKGl0ZW0yKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShpdGVtMykKKworICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoaXRlbTEsIGl0ZW0yKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoaXRlbTEsIGl0ZW0zKQorICAgICMgSGVhcEl0ZW0gdXNlcyBuZWdhdGVkIHNjb3Jlcy4KKyAgICBzZWxmLmFzc2VydEdyZWF0ZXIoaXRlbTEsIGl0ZW0yKQorICAgIHNlbGYuYXNzZXJ0TGVzc0VxdWFsKGl0ZW0xLCBpdGVtMykKKyAgICBzZWxmLmFzc2VydFRydWUoaXRlbTEgPD0gaXRlbTMpCisgICAgc2VsZi5hc3NlcnRGYWxzZShpdGVtMiA+PSBpdGVtMSkKKworICBkZWYgdGVzdF9jbGVhcihzZWxmKToKKyAgICBpdGVtID0gSGVhcEl0ZW0oc2VsZi5JdGVtKDE1KSkKKyAgICBzZWxmLmFzc2VydFRydWUoaXRlbSkKKworICAgIGl0ZW0uY2xlYXIoKQorICAgIHNlbGYuYXNzZXJ0RmFsc2UoaXRlbSkKKworCiBjbGFzcyBCbG9ja0ltYWdlRGlmZlRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgogCiAgIGRlZiB0ZXN0X0dlbmVyYXRlRGlncmFwaE9yZGVyKHNlbGYpOgpAQCAtMTQxLDMgKzE3MywxMDIgQEAKICAgICAjIEluc3VmZmljaWVudCBjYWNoZSB0byBzdGFzaCAxNSBibG9ja3MgKHNpemUgKiAwLjggPCAxNSkuCiAgICAgY29tbW9uLk9QVElPTlMuY2FjaGVfc2l6ZSA9IDE1ICogNDA5NgogICAgIHNlbGYuYXNzZXJ0RXF1YWwoMTUsIGJsb2NrX2ltYWdlX2RpZmYuUmV2aXNlU3Rhc2hTaXplKCkpCisKKyAgZGVmIHRlc3RfRmlsZVR5cGVTdXBwb3J0ZWRCeUltZ2RpZmYoc2VsZik6CisgICAgc2VsZi5hc3NlcnRUcnVlKAorICAgICAgICBCbG9ja0ltYWdlRGlmZi5GaWxlVHlwZVN1cHBvcnRlZEJ5SW1nZGlmZigKKyAgICAgICAgICAgICIvc3lzdGVtL3ByaXYtYXBwL1NldHRpbmdzL1NldHRpbmdzLmFwayIpKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZSgKKyAgICAgICAgQmxvY2tJbWFnZURpZmYuRmlsZVR5cGVTdXBwb3J0ZWRCeUltZ2RpZmYoCisgICAgICAgICAgICAiL3N5c3RlbS9mcmFtZXdvcmsvYW0uamFyIikpCisgICAgc2VsZi5hc3NlcnRUcnVlKAorICAgICAgICBCbG9ja0ltYWdlRGlmZi5GaWxlVHlwZVN1cHBvcnRlZEJ5SW1nZGlmZigKKyAgICAgICAgICAgICIvc3lzdGVtL2V0Yy9zZWN1cml0eS9vdGFjZXJ0cy56aXAiKSkKKworICAgIHNlbGYuYXNzZXJ0RmFsc2UoCisgICAgICAgIEJsb2NrSW1hZ2VEaWZmLkZpbGVUeXBlU3VwcG9ydGVkQnlJbWdkaWZmKAorICAgICAgICAgICAgIi9zeXN0ZW0vZnJhbWV3b3JrL2FybS9ib290Lm9hdCIpKQorICAgIHNlbGYuYXNzZXJ0RmFsc2UoCisgICAgICAgIEJsb2NrSW1hZ2VEaWZmLkZpbGVUeXBlU3VwcG9ydGVkQnlJbWdkaWZmKAorICAgICAgICAgICAgIi9zeXN0ZW0vcHJpdi1hcHAvbm90YW5hcGsiKSkKKworICBkZWYgdGVzdF9DYW5Vc2VJbWdkaWZmKHNlbGYpOgorICAgIGJsb2NrX2ltYWdlX2RpZmYgPSBCbG9ja0ltYWdlRGlmZihFbXB0eUltYWdlKCksIEVtcHR5SW1hZ2UoKSkKKyAgICBzZWxmLmFzc2VydFRydWUoCisgICAgICAgIGJsb2NrX2ltYWdlX2RpZmYuQ2FuVXNlSW1nZGlmZigKKyAgICAgICAgICAgICIvc3lzdGVtL2FwcC9hcHAxLmFwayIsIFJhbmdlU2V0KCIxMC0xNSIpLCBSYW5nZVNldCgiMC01IikpKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZSgKKyAgICAgICAgYmxvY2tfaW1hZ2VfZGlmZi5DYW5Vc2VJbWdkaWZmKAorICAgICAgICAgICAgIi92ZW5kb3IvYXBwL2FwcDIuYXBrIiwgUmFuZ2VTZXQoIjIwIDI1IiksIFJhbmdlU2V0KCIzMC0zMSIpLCBUcnVlKSkKKworICAgIHNlbGYuYXNzZXJ0RGljdEVxdWFsKAorICAgICAgICB7CisgICAgICAgICAgICBJbWdkaWZmU3RhdHMuVVNFRF9JTUdESUZGIDogeyIvc3lzdGVtL2FwcC9hcHAxLmFwayJ9LAorICAgICAgICAgICAgSW1nZGlmZlN0YXRzLlVTRURfSU1HRElGRl9MQVJHRV9BUEsgOiB7Ii92ZW5kb3IvYXBwL2FwcDIuYXBrIn0sCisgICAgICAgIH0sCisgICAgICAgIGJsb2NrX2ltYWdlX2RpZmYuaW1nZGlmZl9zdGF0cy5zdGF0cykKKworCisgIGRlZiB0ZXN0X0NhblVzZUltZ2RpZmZfaW5lbGlnaWJsZShzZWxmKToKKyAgICAjIERpc2FibGVkIGJ5IGNhbGxlci4KKyAgICBibG9ja19pbWFnZV9kaWZmID0gQmxvY2tJbWFnZURpZmYoRW1wdHlJbWFnZSgpLCBFbXB0eUltYWdlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVfaW1nZGlmZj1UcnVlKQorICAgIHNlbGYuYXNzZXJ0RmFsc2UoCisgICAgICAgIGJsb2NrX2ltYWdlX2RpZmYuQ2FuVXNlSW1nZGlmZigKKyAgICAgICAgICAgICIvc3lzdGVtL2FwcC9hcHAxLmFwayIsIFJhbmdlU2V0KCIxMC0xNSIpLCBSYW5nZVNldCgiMC01IikpKQorCisgICAgIyBVbnN1cHBvcnRlZCBmaWxlIHR5cGUuCisgICAgYmxvY2tfaW1hZ2VfZGlmZiA9IEJsb2NrSW1hZ2VEaWZmKEVtcHR5SW1hZ2UoKSwgRW1wdHlJbWFnZSgpKQorICAgIHNlbGYuYXNzZXJ0RmFsc2UoCisgICAgICAgIGJsb2NrX2ltYWdlX2RpZmYuQ2FuVXNlSW1nZGlmZigKKyAgICAgICAgICAgICIvc3lzdGVtL2Jpbi9nemlwIiwgUmFuZ2VTZXQoIjEwLTE1IiksIFJhbmdlU2V0KCIwLTUiKSkpCisKKyAgICAjIEF0IGxlYXN0IG9uZSBvZiB0aGUgcmFuZ2VzIGlzIGluIG5vbi1tb25vdG9uaWMgb3JkZXIuCisgICAgc2VsZi5hc3NlcnRGYWxzZSgKKyAgICAgICAgYmxvY2tfaW1hZ2VfZGlmZi5DYW5Vc2VJbWdkaWZmKAorICAgICAgICAgICAgIi9zeXN0ZW0vYXBwL2FwcDIuYXBrIiwgUmFuZ2VTZXQoIjEwLTE1IiksCisgICAgICAgICAgICBSYW5nZVNldCgiMTUtMjAgMzAgMTAtMTQiKSkpCisKKyAgICAjIEF0IGxlYXN0IG9uZSBvZiB0aGUgcmFuZ2VzIGhhcyBiZWVuIG1vZGlmaWVkLgorICAgIHNyY19yYW5nZXMgPSBSYW5nZVNldCgiMC01IikKKyAgICBzcmNfcmFuZ2VzLmV4dHJhWyd0cmltbWVkJ10gPSBUcnVlCisgICAgc2VsZi5hc3NlcnRGYWxzZSgKKyAgICAgICAgYmxvY2tfaW1hZ2VfZGlmZi5DYW5Vc2VJbWdkaWZmKAorICAgICAgICAgICAgIi92ZW5kb3IvYXBwL2FwcDMuYXBrIiwgUmFuZ2VTZXQoIjEwLTE1IiksIHNyY19yYW5nZXMpKQorCisgICAgIyBBdCBsZWFzdCBvbmUgb2YgdGhlIHJhbmdlcyBpcyBpbmNvbXBsZXRlLgorICAgIHNyY19yYW5nZXMgPSBSYW5nZVNldCgiMC01IikKKyAgICBzcmNfcmFuZ2VzLmV4dHJhWydpbmNvbXBsZXRlJ10gPSBUcnVlCisgICAgc2VsZi5hc3NlcnRGYWxzZSgKKyAgICAgICAgYmxvY2tfaW1hZ2VfZGlmZi5DYW5Vc2VJbWdkaWZmKAorICAgICAgICAgICAgIi92ZW5kb3IvYXBwL2FwcDQuYXBrIiwgUmFuZ2VTZXQoIjEwLTE1IiksIHNyY19yYW5nZXMpKQorCisgICAgIyBUaGUgc3RhdHMgYXJlIGNvcnJlY3RseSBsb2dnZWQuCisgICAgc2VsZi5hc3NlcnREaWN0RXF1YWwoCisgICAgICAgIHsKKyAgICAgICAgICAgIEltZ2RpZmZTdGF0cy5TS0lQUEVEX05PTk1PTk9UT05JQyA6IHsnL3N5c3RlbS9hcHAvYXBwMi5hcGsnfSwKKyAgICAgICAgICAgIEltZ2RpZmZTdGF0cy5TS0lQUEVEX1RSSU1NRUQgOiB7Jy92ZW5kb3IvYXBwL2FwcDMuYXBrJ30sCisgICAgICAgICAgICBJbWdkaWZmU3RhdHMuU0tJUFBFRF9JTkNPTVBMRVRFOiB7Jy92ZW5kb3IvYXBwL2FwcDQuYXBrJ30sCisgICAgICAgIH0sCisgICAgICAgIGJsb2NrX2ltYWdlX2RpZmYuaW1nZGlmZl9zdGF0cy5zdGF0cykKKworCitjbGFzcyBJbWdkaWZmU3RhdHNUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICBkZWYgdGVzdF9Mb2coc2VsZik6CisgICAgaW1nZGlmZl9zdGF0cyA9IEltZ2RpZmZTdGF0cygpCisgICAgaW1nZGlmZl9zdGF0cy5Mb2coIi9zeXN0ZW0vYXBwL2FwcDIuYXBrIiwgSW1nZGlmZlN0YXRzLlVTRURfSU1HRElGRikKKyAgICBzZWxmLmFzc2VydERpY3RFcXVhbCgKKyAgICAgICAgeworICAgICAgICAgICAgSW1nZGlmZlN0YXRzLlVTRURfSU1HRElGRjogeycvc3lzdGVtL2FwcC9hcHAyLmFwayd9LAorICAgICAgICB9LAorICAgICAgICBpbWdkaWZmX3N0YXRzLnN0YXRzKQorCisgIGRlZiB0ZXN0X0xvZ19pbnZhbGlkSW5wdXRzKHNlbGYpOgorICAgIGltZ2RpZmZfc3RhdHMgPSBJbWdkaWZmU3RhdHMoKQorCisgICAgc2VsZi5hc3NlcnRSYWlzZXMoQXNzZXJ0aW9uRXJyb3IsIGltZ2RpZmZfc3RhdHMuTG9nLCAiL3N5c3RlbS9iaW4vZ3ppcCIsCisgICAgICAgICAgICAgICAgICAgICAgSW1nZGlmZlN0YXRzLlVTRURfSU1HRElGRikKKworICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEFzc2VydGlvbkVycm9yLCBpbWdkaWZmX3N0YXRzLkxvZywgIi9zeXN0ZW0vYXBwL2FwcDEuYXBrIiwKKyAgICAgICAgICAgICAgICAgICAgICAiaW52YWxpZCByZWFzb24iKQpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVsZWFzZXRvb2xzL3Rlc3RfYnVpbGRfaW1hZ2UucHkgYi90b29scy9yZWxlYXNldG9vbHMvdGVzdF9idWlsZF9pbWFnZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjFmYWZmCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcmVsZWFzZXRvb2xzL3Rlc3RfYnVpbGRfaW1hZ2UucHkKQEAgLTAsMCArMSw5NCBAQAorIworIyBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworaW1wb3J0IHVuaXR0ZXN0CisKK2ltcG9ydCBjb21tb24KK2Zyb20gYnVpbGRfaW1hZ2UgaW1wb3J0IENoZWNrSGVhZHJvb20sIFJ1bkNvbW1hbmQKKworCitjbGFzcyBCdWlsZEltYWdlVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgIyBBdmFpbGFibGU6IDEwMDAgYmxvY2tzLgorICBFWFQ0RlNfT1VUUFVUID0gKAorICAgICAgIkNyZWF0ZWQgZmlsZXN5c3RlbSB3aXRoIDI3NzcvMTI5MDI0IGlub2RlcyBhbmQgNTE1MDk5LzUxNjA5OSBibG9ja3MiKQorCisgIGRlZiB0ZXN0X0NoZWNrSGVhZHJvb21fU2l6ZVVuZGVyTGltaXQoc2VsZik6CisgICAgIyBSZXF1aXJlZCBoZWFkcm9vbTogMTAwMCBibG9ja3MuCisgICAgcHJvcF9kaWN0ID0geworICAgICAgICAnZnNfdHlwZScgOiAnZXh0NCcsCisgICAgICAgICdwYXJ0aXRpb25faGVhZHJvb20nIDogJzQwOTYwMDAnLAorICAgICAgICAnbW91bnRfcG9pbnQnIDogJ3N5c3RlbScsCisgICAgfQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShDaGVja0hlYWRyb29tKHNlbGYuRVhUNEZTX09VVFBVVCwgcHJvcF9kaWN0KSkKKworICBkZWYgdGVzdF9DaGVja0hlYWRyb29tX0luc3VmZmljaWVudEhlYWRyb29tKHNlbGYpOgorICAgICMgUmVxdWlyZWQgaGVhZHJvb206IDEwMDEgYmxvY2tzLgorICAgIHByb3BfZGljdCA9IHsKKyAgICAgICAgJ2ZzX3R5cGUnIDogJ2V4dDQnLAorICAgICAgICAncGFydGl0aW9uX2hlYWRyb29tJyA6ICc0MTAwMDk2JywKKyAgICAgICAgJ21vdW50X3BvaW50JyA6ICdzeXN0ZW0nLAorICAgIH0KKyAgICBzZWxmLmFzc2VydEZhbHNlKENoZWNrSGVhZHJvb20oc2VsZi5FWFQ0RlNfT1VUUFVULCBwcm9wX2RpY3QpKQorCisgIGRlZiB0ZXN0X0NoZWNrSGVhZHJvb21fV3JvbmdGc1R5cGUoc2VsZik6CisgICAgcHJvcF9kaWN0ID0geworICAgICAgICAnZnNfdHlwZScgOiAnZjJmcycsCisgICAgICAgICdwYXJ0aXRpb25faGVhZHJvb20nIDogJzQxMDAwOTYnLAorICAgICAgICAnbW91bnRfcG9pbnQnIDogJ3N5c3RlbScsCisgICAgfQorICAgIHNlbGYuYXNzZXJ0UmFpc2VzKAorICAgICAgICBBc3NlcnRpb25FcnJvciwgQ2hlY2tIZWFkcm9vbSwgc2VsZi5FWFQ0RlNfT1VUUFVULCBwcm9wX2RpY3QpCisKKyAgZGVmIHRlc3RfQ2hlY2tIZWFkcm9vbV9NaXNzaW5nUHJvcGVydGllcyhzZWxmKToKKyAgICBwcm9wX2RpY3QgPSB7CisgICAgICAgICdmc190eXBlJyA6ICdleHQ0JywKKyAgICAgICAgJ3BhcnRpdGlvbl9oZWFkcm9vbScgOiAnNDEwMDA5NicsCisgICAgfQorICAgIHNlbGYuYXNzZXJ0UmFpc2VzKAorICAgICAgICBBc3NlcnRpb25FcnJvciwgQ2hlY2tIZWFkcm9vbSwgc2VsZi5FWFQ0RlNfT1VUUFVULCBwcm9wX2RpY3QpCisKKyAgICBwcm9wX2RpY3QgPSB7CisgICAgICAgICdmc190eXBlJyA6ICdleHQ0JywKKyAgICAgICAgJ21vdW50X3BvaW50JyA6ICdzeXN0ZW0nLAorICAgIH0KKyAgICBzZWxmLmFzc2VydFJhaXNlcygKKyAgICAgICAgQXNzZXJ0aW9uRXJyb3IsIENoZWNrSGVhZHJvb20sIHNlbGYuRVhUNEZTX09VVFBVVCwgcHJvcF9kaWN0KQorCisgIGRlZiB0ZXN0X0NoZWNrSGVhZHJvb21fV2l0aE1rZTJmc091dHB1dChzZWxmKToKKyAgICAiIiJUZXN0cyB0aGUgcmVzdWx0IHBhcnNpbmcgZnJvbSBhY3R1YWwgY2FsbCB0byBta2UyZnMuIiIiCisgICAgaW5wdXRfZGlyID0gY29tbW9uLk1ha2VUZW1wRGlyKCkKKyAgICBvdXRwdXRfaW1hZ2UgPSBjb21tb24uTWFrZVRlbXBGaWxlKHN1ZmZpeD0nLmltZycpCisgICAgY29tbWFuZCA9IFsnbWt1c2VyaW1nX21rZTJmcy5zaCcsIGlucHV0X2Rpciwgb3V0cHV0X2ltYWdlLCAnZXh0NCcsCisgICAgICAgICAgICAgICAnL3N5c3RlbScsICc0MDk2MDAnLCAnLWonLCAnMCddCisgICAgZXh0NGZzX291dHB1dCwgZXhpdF9jb2RlID0gUnVuQ29tbWFuZChjb21tYW5kKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgZXhpdF9jb2RlKQorCisgICAgcHJvcF9kaWN0ID0geworICAgICAgICAnZnNfdHlwZScgOiAnZXh0NCcsCisgICAgICAgICdwYXJ0aXRpb25faGVhZHJvb20nIDogJzQwOTYwJywKKyAgICAgICAgJ21vdW50X3BvaW50JyA6ICdzeXN0ZW0nLAorICAgIH0KKyAgICBzZWxmLmFzc2VydFRydWUoQ2hlY2tIZWFkcm9vbShleHQ0ZnNfb3V0cHV0LCBwcm9wX2RpY3QpKQorCisgICAgcHJvcF9kaWN0ID0geworICAgICAgICAnZnNfdHlwZScgOiAnZXh0NCcsCisgICAgICAgICdwYXJ0aXRpb25faGVhZHJvb20nIDogJzQxMzY5NicsCisgICAgICAgICdtb3VudF9wb2ludCcgOiAnc3lzdGVtJywKKyAgICB9CisgICAgc2VsZi5hc3NlcnRGYWxzZShDaGVja0hlYWRyb29tKGV4dDRmc19vdXRwdXQsIHByb3BfZGljdCkpCisKKyAgICBjb21tb24uQ2xlYW51cCgpCmRpZmYgLS1naXQgYS90b29scy9yZWxlYXNldG9vbHMvdGVzdF9jb21tb24ucHkgYi90b29scy9yZWxlYXNldG9vbHMvdGVzdF9jb21tb24ucHkKaW5kZXggMzZmMjU2ZC4uZmIyNmI2NiAxMDA2NDQKLS0tIGEvdG9vbHMvcmVsZWFzZXRvb2xzL3Rlc3RfY29tbW9uLnB5CisrKyBiL3Rvb2xzL3JlbGVhc2V0b29scy90ZXN0X2NvbW1vbi5weQpAQCAtMTMsMzkgKzEzLDM4IEBACiAjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCisKIGltcG9ydCBvcwotaW1wb3J0IHNodXRpbAoraW1wb3J0IHN1YnByb2Nlc3MKIGltcG9ydCB0ZW1wZmlsZQogaW1wb3J0IHRpbWUKIGltcG9ydCB1bml0dGVzdAogaW1wb3J0IHppcGZpbGUKK2Zyb20gaGFzaGxpYiBpbXBvcnQgc2hhMQogCiBpbXBvcnQgY29tbW9uCitpbXBvcnQgdGVzdF91dGlscwogaW1wb3J0IHZhbGlkYXRlX3RhcmdldF9maWxlcworZnJvbSByYW5nZWxpYiBpbXBvcnQgUmFuZ2VTZXQKIAogCi1kZWYgcmFuZG9tX3N0cmluZ193aXRoX2hvbGVzKHNpemUsIGJsb2NrX3NpemUsIHN0ZXBfc2l6ZSk6Ci0gIGRhdGEgPSBbIlwwIl0gKiBzaXplCi0gIGZvciBiZWdpbiBpbiByYW5nZSgwLCBzaXplLCBzdGVwX3NpemUpOgotICAgIGVuZCA9IGJlZ2luICsgYmxvY2tfc2l6ZQotICAgIGRhdGFbYmVnaW46ZW5kXSA9IG9zLnVyYW5kb20oYmxvY2tfc2l6ZSkKLSAgcmV0dXJuICIiLmpvaW4oZGF0YSkKK0tpQiA9IDEwMjQKK01pQiA9IDEwMjQgKiBLaUIKK0dpQiA9IDEwMjQgKiBNaUIKKwogCiBkZWYgZ2V0XzJnYl9zdHJpbmcoKToKLSAga2lsb2J5dGVzID0gMTAyNAotICBtZWdhYnl0ZXMgPSAxMDI0ICoga2lsb2J5dGVzCi0gIGdpZ2FieXRlcyA9IDEwMjQgKiBtZWdhYnl0ZXMKLQotICBzaXplID0gaW50KDIgKiBnaWdhYnl0ZXMgKyAxKQotICBibG9ja19zaXplID0gNCAqIGtpbG9ieXRlcwotICBzdGVwX3NpemUgPSA0ICogbWVnYWJ5dGVzCi0gIHR3b19nYl9zdHJpbmcgPSByYW5kb21fc3RyaW5nX3dpdGhfaG9sZXMoCi0gICAgICAgIHNpemUsIGJsb2NrX3NpemUsIHN0ZXBfc2l6ZSkKLSAgcmV0dXJuIHR3b19nYl9zdHJpbmcKKyAgc2l6ZSA9IGludCgyICogR2lCICsgMSkKKyAgYmxvY2tfc2l6ZSA9IDQgKiBLaUIKKyAgc3RlcF9zaXplID0gNCAqIE1pQgorICAjIEdlbmVyYXRlIGEgbG9uZyBzdHJpbmcgd2l0aCBob2xlcywgZS5nLiAneHl6XHgwMGFiY1x4MDAuLi4nLgorICBmb3IgXyBpbiByYW5nZSgwLCBzaXplLCBzdGVwX3NpemUpOgorICAgIHlpZWxkIG9zLnVyYW5kb20oYmxvY2tfc2l6ZSkKKyAgICB5aWVsZCAnXDAnICogKHN0ZXBfc2l6ZSAtIGJsb2NrX3NpemUpCiAKIAogY2xhc3MgQ29tbW9uWmlwVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6Ci0gIGRlZiBfdmVyaWZ5KHNlbGYsIHppcF9maWxlLCB6aXBfZmlsZV9uYW1lLCBhcmNuYW1lLCBjb250ZW50cywKKyAgZGVmIF92ZXJpZnkoc2VsZiwgemlwX2ZpbGUsIHppcF9maWxlX25hbWUsIGFyY25hbWUsIGV4cGVjdGVkX2hhc2gsCiAgICAgICAgICAgICAgIHRlc3RfZmlsZV9uYW1lPU5vbmUsIGV4cGVjdGVkX3N0YXQ9Tm9uZSwgZXhwZWN0ZWRfbW9kZT0wbzY0NCwKICAgICAgICAgICAgICAgZXhwZWN0ZWRfY29tcHJlc3NfdHlwZT16aXBmaWxlLlpJUF9TVE9SRUQpOgogICAgICMgVmVyaWZ5IHRoZSBzdGF0IGlmIHByZXNlbnQuCkBAIC02OSw3ICs2OCwxMSBAQAogICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW5mby5jb21wcmVzc190eXBlLCBleHBlY3RlZF9jb21wcmVzc190eXBlKQogCiAgICAgIyBWZXJpZnkgdGhlIHppcCBjb250ZW50cy4KLSAgICBzZWxmLmFzc2VydEVxdWFsKHppcF9maWxlLnJlYWQoYXJjbmFtZSksIGNvbnRlbnRzKQorICAgIGVudHJ5ID0gemlwX2ZpbGUub3BlbihhcmNuYW1lKQorICAgIHNoYTFfaGFzaCA9IHNoYTEoKQorICAgIGZvciBjaHVuayBpbiBpdGVyKGxhbWJkYTogZW50cnkucmVhZCg0ICogTWlCKSwgJycpOgorICAgICAgc2hhMV9oYXNoLnVwZGF0ZShjaHVuaykKKyAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdGVkX2hhc2gsIHNoYTFfaGFzaC5oZXhkaWdlc3QoKSkKICAgICBzZWxmLmFzc2VydElzTm9uZSh6aXBfZmlsZS50ZXN0emlwKCkpCiAKICAgZGVmIF90ZXN0X1ppcFdyaXRlKHNlbGYsIGNvbnRlbnRzLCBleHRyYV96aXB3cml0ZV9hcmdzPU5vbmUpOgpAQCAtOTAsNyArOTMsMTAgQEAKICAgICB6aXBfZmlsZSA9IHppcGZpbGUuWmlwRmlsZSh6aXBfZmlsZV9uYW1lLCAidyIpCiAKICAgICB0cnk6Ci0gICAgICB0ZXN0X2ZpbGUud3JpdGUoY29udGVudHMpCisgICAgICBzaGExX2hhc2ggPSBzaGExKCkKKyAgICAgIGZvciBkYXRhIGluIGNvbnRlbnRzOgorICAgICAgICBzaGExX2hhc2gudXBkYXRlKGRhdGEpCisgICAgICAgIHRlc3RfZmlsZS53cml0ZShkYXRhKQogICAgICAgdGVzdF9maWxlLmNsb3NlKCkKIAogICAgICAgZXhwZWN0ZWRfc3RhdCA9IG9zLnN0YXQodGVzdF9maWxlX25hbWUpCkBAIC0xMDIsOCArMTA4LDkgQEAKICAgICAgIGNvbW1vbi5aaXBXcml0ZSh6aXBfZmlsZSwgdGVzdF9maWxlX25hbWUsICoqZXh0cmFfemlwd3JpdGVfYXJncykKICAgICAgIGNvbW1vbi5aaXBDbG9zZSh6aXBfZmlsZSkKIAotICAgICAgc2VsZi5fdmVyaWZ5KHppcF9maWxlLCB6aXBfZmlsZV9uYW1lLCBhcmNuYW1lLCBjb250ZW50cywgdGVzdF9maWxlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRfc3RhdCwgZXhwZWN0ZWRfbW9kZSwgZXhwZWN0ZWRfY29tcHJlc3NfdHlwZSkKKyAgICAgIHNlbGYuX3ZlcmlmeSh6aXBfZmlsZSwgemlwX2ZpbGVfbmFtZSwgYXJjbmFtZSwgc2hhMV9oYXNoLmhleGRpZ2VzdCgpLAorICAgICAgICAgICAgICAgICAgIHRlc3RfZmlsZV9uYW1lLCBleHBlY3RlZF9zdGF0LCBleHBlY3RlZF9tb2RlLAorICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkX2NvbXByZXNzX3R5cGUpCiAgICAgZmluYWxseToKICAgICAgIG9zLnJlbW92ZSh0ZXN0X2ZpbGVfbmFtZSkKICAgICAgIG9zLnJlbW92ZSh6aXBfZmlsZV9uYW1lKQpAQCAtMTMzLDcgKzE0MCw3IEBACiAgICAgICBjb21tb24uWmlwV3JpdGVTdHIoemlwX2ZpbGUsIHppbmZvX29yX2FyY25hbWUsIGNvbnRlbnRzLCAqKmV4dHJhX2FyZ3MpCiAgICAgICBjb21tb24uWmlwQ2xvc2UoemlwX2ZpbGUpCiAKLSAgICAgIHNlbGYuX3ZlcmlmeSh6aXBfZmlsZSwgemlwX2ZpbGVfbmFtZSwgYXJjbmFtZSwgY29udGVudHMsCisgICAgICBzZWxmLl92ZXJpZnkoemlwX2ZpbGUsIHppcF9maWxlX25hbWUsIGFyY25hbWUsIHNoYTEoY29udGVudHMpLmhleGRpZ2VzdCgpLAogICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkX21vZGU9ZXhwZWN0ZWRfbW9kZSwKICAgICAgICAgICAgICAgICAgICBleHBlY3RlZF9jb21wcmVzc190eXBlPWV4cGVjdGVkX2NvbXByZXNzX3R5cGUpCiAgICAgZmluYWxseToKQEAgLTE1OSw3ICsxNjYsMTAgQEAKICAgICB6aXBfZmlsZSA9IHppcGZpbGUuWmlwRmlsZSh6aXBfZmlsZV9uYW1lLCAidyIpCiAKICAgICB0cnk6Ci0gICAgICB0ZXN0X2ZpbGUud3JpdGUobGFyZ2UpCisgICAgICBzaGExX2hhc2ggPSBzaGExKCkKKyAgICAgIGZvciBkYXRhIGluIGxhcmdlOgorICAgICAgICBzaGExX2hhc2gudXBkYXRlKGRhdGEpCisgICAgICAgIHRlc3RfZmlsZS53cml0ZShkYXRhKQogICAgICAgdGVzdF9maWxlLmNsb3NlKCkKIAogICAgICAgZXhwZWN0ZWRfc3RhdCA9IG9zLnN0YXQodGVzdF9maWxlX25hbWUpCkBAIC0xNzMsMTIgKzE4MywxMyBAQAogICAgICAgY29tbW9uLlppcENsb3NlKHppcF9maWxlKQogCiAgICAgICAjIFZlcmlmeSB0aGUgY29udGVudHMgd3JpdHRlbiBieSBaaXBXcml0ZSgpLgotICAgICAgc2VsZi5fdmVyaWZ5KHppcF9maWxlLCB6aXBfZmlsZV9uYW1lLCBhcmNuYW1lX2xhcmdlLCBsYXJnZSwKLSAgICAgICAgICAgICAgICAgICB0ZXN0X2ZpbGVfbmFtZSwgZXhwZWN0ZWRfc3RhdCwgZXhwZWN0ZWRfbW9kZSwKLSAgICAgICAgICAgICAgICAgICBleHBlY3RlZF9jb21wcmVzc190eXBlKQorICAgICAgc2VsZi5fdmVyaWZ5KHppcF9maWxlLCB6aXBfZmlsZV9uYW1lLCBhcmNuYW1lX2xhcmdlLAorICAgICAgICAgICAgICAgICAgIHNoYTFfaGFzaC5oZXhkaWdlc3QoKSwgdGVzdF9maWxlX25hbWUsIGV4cGVjdGVkX3N0YXQsCisgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRfbW9kZSwgZXhwZWN0ZWRfY29tcHJlc3NfdHlwZSkKIAogICAgICAgIyBWZXJpZnkgdGhlIGNvbnRlbnRzIHdyaXR0ZW4gYnkgWmlwV3JpdGVTdHIoKS4KLSAgICAgIHNlbGYuX3ZlcmlmeSh6aXBfZmlsZSwgemlwX2ZpbGVfbmFtZSwgYXJjbmFtZV9zbWFsbCwgc21hbGwsCisgICAgICBzZWxmLl92ZXJpZnkoemlwX2ZpbGUsIHppcF9maWxlX25hbWUsIGFyY25hbWVfc21hbGwsCisgICAgICAgICAgICAgICAgICAgc2hhMShzbWFsbCkuaGV4ZGlnZXN0KCksCiAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRfY29tcHJlc3NfdHlwZT1leHBlY3RlZF9jb21wcmVzc190eXBlKQogICAgIGZpbmFsbHk6CiAgICAgICBvcy5yZW1vdmUoemlwX2ZpbGVfbmFtZSkKQEAgLTI4NywzMSArMjk4LDM3OSBAQAogICAgICAgY29tbW9uLlppcFdyaXRlU3RyKHppcF9maWxlLCB6aW5mbywgcmFuZG9tX3N0cmluZywgcGVybXM9MG80MDApCiAgICAgICBjb21tb24uWmlwQ2xvc2UoemlwX2ZpbGUpCiAKLSAgICAgIHNlbGYuX3ZlcmlmeSh6aXBfZmlsZSwgemlwX2ZpbGVfbmFtZSwgImZvbyIsIHJhbmRvbV9zdHJpbmcsCisgICAgICBzZWxmLl92ZXJpZnkoemlwX2ZpbGUsIHppcF9maWxlX25hbWUsICJmb28iLAorICAgICAgICAgICAgICAgICAgIHNoYTEocmFuZG9tX3N0cmluZykuaGV4ZGlnZXN0KCksCiAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRfbW9kZT0wbzY0NCkKLSAgICAgIHNlbGYuX3ZlcmlmeSh6aXBfZmlsZSwgemlwX2ZpbGVfbmFtZSwgImJhciIsIHJhbmRvbV9zdHJpbmcsCisgICAgICBzZWxmLl92ZXJpZnkoemlwX2ZpbGUsIHppcF9maWxlX25hbWUsICJiYXIiLAorICAgICAgICAgICAgICAgICAgIHNoYTEocmFuZG9tX3N0cmluZykuaGV4ZGlnZXN0KCksCiAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRfbW9kZT0wbzc1NSkKLSAgICAgIHNlbGYuX3ZlcmlmeSh6aXBfZmlsZSwgemlwX2ZpbGVfbmFtZSwgImJheiIsIHJhbmRvbV9zdHJpbmcsCisgICAgICBzZWxmLl92ZXJpZnkoemlwX2ZpbGUsIHppcF9maWxlX25hbWUsICJiYXoiLAorICAgICAgICAgICAgICAgICAgIHNoYTEocmFuZG9tX3N0cmluZykuaGV4ZGlnZXN0KCksCiAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRfbW9kZT0wbzc0MCkKLSAgICAgIHNlbGYuX3ZlcmlmeSh6aXBfZmlsZSwgemlwX2ZpbGVfbmFtZSwgInF1eCIsIHJhbmRvbV9zdHJpbmcsCisgICAgICBzZWxmLl92ZXJpZnkoemlwX2ZpbGUsIHppcF9maWxlX25hbWUsICJxdXgiLAorICAgICAgICAgICAgICAgICAgIHNoYTEocmFuZG9tX3N0cmluZykuaGV4ZGlnZXN0KCksCiAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRfbW9kZT0wbzQwMCkKICAgICBmaW5hbGx5OgogICAgICAgb3MucmVtb3ZlKHppcF9maWxlX25hbWUpCiAKLWNsYXNzIEluc3RhbGxSZWNvdmVyeVNjcmlwdEZvcm1hdFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgotICAiIiJDaGVjayB0aGUgZm9ybWF0IG9mIGluc3RhbGwtcmVjb3Zlcnkuc2gKKyAgZGVmIHRlc3RfWmlwRGVsZXRlKHNlbGYpOgorICAgIHppcF9maWxlID0gdGVtcGZpbGUuTmFtZWRUZW1wb3JhcnlGaWxlKGRlbGV0ZT1GYWxzZSwgc3VmZml4PScuemlwJykKKyAgICBvdXRwdXRfemlwID0gemlwZmlsZS5aaXBGaWxlKHppcF9maWxlLm5hbWUsICd3JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzaW9uPXppcGZpbGUuWklQX0RFRkxBVEVEKQorICAgIHdpdGggdGVtcGZpbGUuTmFtZWRUZW1wb3JhcnlGaWxlKCkgYXMgZW50cnlfZmlsZToKKyAgICAgIGVudHJ5X2ZpbGUud3JpdGUob3MudXJhbmRvbSgxMDI0KSkKKyAgICAgIGNvbW1vbi5aaXBXcml0ZShvdXRwdXRfemlwLCBlbnRyeV9maWxlLm5hbWUsIGFyY25hbWU9J1Rlc3QxJykKKyAgICAgIGNvbW1vbi5aaXBXcml0ZShvdXRwdXRfemlwLCBlbnRyeV9maWxlLm5hbWUsIGFyY25hbWU9J1Rlc3QyJykKKyAgICAgIGNvbW1vbi5aaXBXcml0ZShvdXRwdXRfemlwLCBlbnRyeV9maWxlLm5hbWUsIGFyY25hbWU9J1Rlc3QzJykKKyAgICAgIGNvbW1vbi5aaXBDbG9zZShvdXRwdXRfemlwKQorICAgIHppcF9maWxlLmNsb3NlKCkKIAotICBJdHMgZm9ybWF0IHNob3VsZCBtYXRjaCBiZXR3ZWVuIGNvbW1vbi5weSBhbmQgdmFsaWRhdGVfdGFyZ2V0X2ZpbGVzLnB5LiIiIgorICAgIHRyeToKKyAgICAgIGNvbW1vbi5aaXBEZWxldGUoemlwX2ZpbGUubmFtZSwgJ1Rlc3QyJykKKyAgICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKHppcF9maWxlLm5hbWUsICdyJykgYXMgY2hlY2tfemlwOgorICAgICAgICBlbnRyaWVzID0gY2hlY2tfemlwLm5hbWVsaXN0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCdUZXN0MScgaW4gZW50cmllcykKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSgnVGVzdDInIGluIGVudHJpZXMpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgnVGVzdDMnIGluIGVudHJpZXMpCisKKyAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEFzc2VydGlvbkVycm9yLCBjb21tb24uWmlwRGVsZXRlLCB6aXBfZmlsZS5uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgJ1Rlc3QyJykKKyAgICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKHppcF9maWxlLm5hbWUsICdyJykgYXMgY2hlY2tfemlwOgorICAgICAgICBlbnRyaWVzID0gY2hlY2tfemlwLm5hbWVsaXN0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCdUZXN0MScgaW4gZW50cmllcykKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSgnVGVzdDInIGluIGVudHJpZXMpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgnVGVzdDMnIGluIGVudHJpZXMpCisKKyAgICAgIGNvbW1vbi5aaXBEZWxldGUoemlwX2ZpbGUubmFtZSwgWydUZXN0MyddKQorICAgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoemlwX2ZpbGUubmFtZSwgJ3InKSBhcyBjaGVja196aXA6CisgICAgICAgIGVudHJpZXMgPSBjaGVja196aXAubmFtZWxpc3QoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoJ1Rlc3QxJyBpbiBlbnRyaWVzKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKCdUZXN0MicgaW4gZW50cmllcykKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSgnVGVzdDMnIGluIGVudHJpZXMpCisKKyAgICAgIGNvbW1vbi5aaXBEZWxldGUoemlwX2ZpbGUubmFtZSwgWydUZXN0MScsICdUZXN0MiddKQorICAgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoemlwX2ZpbGUubmFtZSwgJ3InKSBhcyBjaGVja196aXA6CisgICAgICAgIGVudHJpZXMgPSBjaGVja196aXAubmFtZWxpc3QoKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKCdUZXN0MScgaW4gZW50cmllcykKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSgnVGVzdDInIGluIGVudHJpZXMpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoJ1Rlc3QzJyBpbiBlbnRyaWVzKQorICAgIGZpbmFsbHk6CisgICAgICBvcy5yZW1vdmUoemlwX2ZpbGUubmFtZSkKKworCitjbGFzcyBDb21tb25BcGtVdGlsc1Rlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAiIiJUZXN0cyB0aGUgQVBLIHV0aWxzIHJlbGF0ZWQgZnVuY3Rpb25zLiIiIgorCisgIEFQS0NFUlRTX1RYVDEgPSAoCisgICAgICAnbmFtZT0iUmVjb3ZlcnlMb2NhbGl6ZXIuYXBrIiBjZXJ0aWZpY2F0ZT0iY2VydHMvZGV2a2V5Lng1MDkucGVtIicKKyAgICAgICcgcHJpdmF0ZV9rZXk9ImNlcnRzL2RldmtleS5wazgiXG4nCisgICAgICAnbmFtZT0iU2V0dGluZ3MuYXBrIicKKyAgICAgICcgY2VydGlmaWNhdGU9ImJ1aWxkL3RhcmdldC9wcm9kdWN0L3NlY3VyaXR5L3BsYXRmb3JtLng1MDkucGVtIicKKyAgICAgICcgcHJpdmF0ZV9rZXk9ImJ1aWxkL3RhcmdldC9wcm9kdWN0L3NlY3VyaXR5L3BsYXRmb3JtLnBrOCJcbicKKyAgICAgICduYW1lPSJUVi5hcGsiIGNlcnRpZmljYXRlPSJQUkVTSUdORUQiIHByaXZhdGVfa2V5PSIiXG4nCisgICkKKworICBBUEtDRVJUU19DRVJUTUFQMSA9IHsKKyAgICAgICdSZWNvdmVyeUxvY2FsaXplci5hcGsnIDogJ2NlcnRzL2RldmtleScsCisgICAgICAnU2V0dGluZ3MuYXBrJyA6ICdidWlsZC90YXJnZXQvcHJvZHVjdC9zZWN1cml0eS9wbGF0Zm9ybScsCisgICAgICAnVFYuYXBrJyA6ICdQUkVTSUdORUQnLAorICB9CisKKyAgQVBLQ0VSVFNfVFhUMiA9ICgKKyAgICAgICduYW1lPSJDb21wcmVzc2VkMS5hcGsiIGNlcnRpZmljYXRlPSJjZXJ0cy9jb21wcmVzc2VkMS54NTA5LnBlbSInCisgICAgICAnIHByaXZhdGVfa2V5PSJjZXJ0cy9jb21wcmVzc2VkMS5wazgiIGNvbXByZXNzZWQ9Imd6IlxuJworICAgICAgJ25hbWU9IkNvbXByZXNzZWQyYS5hcGsiIGNlcnRpZmljYXRlPSJjZXJ0cy9jb21wcmVzc2VkMi54NTA5LnBlbSInCisgICAgICAnIHByaXZhdGVfa2V5PSJjZXJ0cy9jb21wcmVzc2VkMi5wazgiIGNvbXByZXNzZWQ9Imd6IlxuJworICAgICAgJ25hbWU9IkNvbXByZXNzZWQyYi5hcGsiIGNlcnRpZmljYXRlPSJjZXJ0cy9jb21wcmVzc2VkMi54NTA5LnBlbSInCisgICAgICAnIHByaXZhdGVfa2V5PSJjZXJ0cy9jb21wcmVzc2VkMi5wazgiIGNvbXByZXNzZWQ9Imd6IlxuJworICAgICAgJ25hbWU9IkNvbXByZXNzZWQzLmFwayIgY2VydGlmaWNhdGU9ImNlcnRzL2NvbXByZXNzZWQzLng1MDkucGVtIicKKyAgICAgICcgcHJpdmF0ZV9rZXk9ImNlcnRzL2NvbXByZXNzZWQzLnBrOCIgY29tcHJlc3NlZD0iZ3oiXG4nCisgICkKKworICBBUEtDRVJUU19DRVJUTUFQMiA9IHsKKyAgICAgICdDb21wcmVzc2VkMS5hcGsnIDogJ2NlcnRzL2NvbXByZXNzZWQxJywKKyAgICAgICdDb21wcmVzc2VkMmEuYXBrJyA6ICdjZXJ0cy9jb21wcmVzc2VkMicsCisgICAgICAnQ29tcHJlc3NlZDJiLmFwaycgOiAnY2VydHMvY29tcHJlc3NlZDInLAorICAgICAgJ0NvbXByZXNzZWQzLmFwaycgOiAnY2VydHMvY29tcHJlc3NlZDMnLAorICB9CisKKyAgQVBLQ0VSVFNfVFhUMyA9ICgKKyAgICAgICduYW1lPSJDb21wcmVzc2VkNC5hcGsiIGNlcnRpZmljYXRlPSJjZXJ0cy9jb21wcmVzc2VkNC54NTA5LnBlbSInCisgICAgICAnIHByaXZhdGVfa2V5PSJjZXJ0cy9jb21wcmVzc2VkNC5wazgiIGNvbXByZXNzZWQ9Inh6IlxuJworICApCisKKyAgQVBLQ0VSVFNfQ0VSVE1BUDMgPSB7CisgICAgICAnQ29tcHJlc3NlZDQuYXBrJyA6ICdjZXJ0cy9jb21wcmVzc2VkNCcsCisgIH0KIAogICBkZWYgc2V0VXAoc2VsZik6Ci0gICAgc2VsZi5fdGVtcGRpciA9IHRlbXBmaWxlLm1rZHRlbXAoKQorICAgIHNlbGYudGVzdGRhdGFfZGlyID0gdGVzdF91dGlscy5nZXRfdGVzdGRhdGFfZGlyKCkKKworICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgY29tbW9uLkNsZWFudXAoKQorCisgIEBzdGF0aWNtZXRob2QKKyAgZGVmIF93cml0ZV9hcGtjZXJ0c190eHQoYXBrY2VydHNfdHh0LCBhZGRpdGlvbmFsPU5vbmUpOgorICAgIGlmIGFkZGl0aW9uYWwgaXMgTm9uZToKKyAgICAgIGFkZGl0aW9uYWwgPSBbXQorICAgIHRhcmdldF9maWxlcyA9IGNvbW1vbi5NYWtlVGVtcEZpbGUoc3VmZml4PScuemlwJykKKyAgICB3aXRoIHppcGZpbGUuWmlwRmlsZSh0YXJnZXRfZmlsZXMsICd3JykgYXMgdGFyZ2V0X2ZpbGVzX3ppcDoKKyAgICAgIHRhcmdldF9maWxlc196aXAud3JpdGVzdHIoJ01FVEEvYXBrY2VydHMudHh0JywgYXBrY2VydHNfdHh0KQorICAgICAgZm9yIGVudHJ5IGluIGFkZGl0aW9uYWw6CisgICAgICAgIHRhcmdldF9maWxlc196aXAud3JpdGVzdHIoZW50cnksICcnKQorICAgIHJldHVybiB0YXJnZXRfZmlsZXMKKworICBkZWYgdGVzdF9SZWFkQXBrQ2VydHNfTm9uY29tcHJlc3NlZEFwa3Moc2VsZik6CisgICAgdGFyZ2V0X2ZpbGVzID0gc2VsZi5fd3JpdGVfYXBrY2VydHNfdHh0KHNlbGYuQVBLQ0VSVFNfVFhUMSkKKyAgICB3aXRoIHppcGZpbGUuWmlwRmlsZSh0YXJnZXRfZmlsZXMsICdyJykgYXMgaW5wdXRfemlwOgorICAgICAgY2VydG1hcCwgZXh0ID0gY29tbW9uLlJlYWRBcGtDZXJ0cyhpbnB1dF96aXApCisKKyAgICBzZWxmLmFzc2VydERpY3RFcXVhbChzZWxmLkFQS0NFUlRTX0NFUlRNQVAxLCBjZXJ0bWFwKQorICAgIHNlbGYuYXNzZXJ0SXNOb25lKGV4dCkKKworICBkZWYgdGVzdF9SZWFkQXBrQ2VydHNfQ29tcHJlc3NlZEFwa3Moc2VsZik6CisgICAgIyBXZSBoYXZlICJpbnN0YWxsZWQiIENvbXByZXNzZWQxLmFway5neiBvbmx5LiBOb3RlIHRoYXQgQ29tcHJlc3NlZDMuYXBrIGlzCisgICAgIyBub3Qgc3RvcmVkIGluICcuZ3onIGZvcm1hdCwgc28gaXQgc2hvdWxkbid0IGJlIGNvbnNpZGVyZWQgYXMgaW5zdGFsbGVkLgorICAgIHRhcmdldF9maWxlcyA9IHNlbGYuX3dyaXRlX2Fwa2NlcnRzX3R4dCgKKyAgICAgICAgc2VsZi5BUEtDRVJUU19UWFQyLAorICAgICAgICBbJ0NvbXByZXNzZWQxLmFway5neicsICdDb21wcmVzc2VkMy5hcGsnXSkKKworICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKHRhcmdldF9maWxlcywgJ3InKSBhcyBpbnB1dF96aXA6CisgICAgICBjZXJ0bWFwLCBleHQgPSBjb21tb24uUmVhZEFwa0NlcnRzKGlucHV0X3ppcCkKKworICAgIHNlbGYuYXNzZXJ0RGljdEVxdWFsKHNlbGYuQVBLQ0VSVFNfQ0VSVE1BUDIsIGNlcnRtYXApCisgICAgc2VsZi5hc3NlcnRFcXVhbCgnLmd6JywgZXh0KQorCisgICAgIyBBbHRlcm5hdGl2ZSBjYXNlIHdpdGggJy54eicuCisgICAgdGFyZ2V0X2ZpbGVzID0gc2VsZi5fd3JpdGVfYXBrY2VydHNfdHh0KAorICAgICAgICBzZWxmLkFQS0NFUlRTX1RYVDMsIFsnQ29tcHJlc3NlZDQuYXBrLnh6J10pCisKKyAgICB3aXRoIHppcGZpbGUuWmlwRmlsZSh0YXJnZXRfZmlsZXMsICdyJykgYXMgaW5wdXRfemlwOgorICAgICAgY2VydG1hcCwgZXh0ID0gY29tbW9uLlJlYWRBcGtDZXJ0cyhpbnB1dF96aXApCisKKyAgICBzZWxmLmFzc2VydERpY3RFcXVhbChzZWxmLkFQS0NFUlRTX0NFUlRNQVAzLCBjZXJ0bWFwKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoJy54eicsIGV4dCkKKworICBkZWYgdGVzdF9SZWFkQXBrQ2VydHNfQ29tcHJlc3NlZEFuZE5vbmNvbXByZXNzZWRBcGtzKHNlbGYpOgorICAgIHRhcmdldF9maWxlcyA9IHNlbGYuX3dyaXRlX2Fwa2NlcnRzX3R4dCgKKyAgICAgICAgc2VsZi5BUEtDRVJUU19UWFQxICsgc2VsZi5BUEtDRVJUU19UWFQyLAorICAgICAgICBbJ0NvbXByZXNzZWQxLmFway5neicsICdDb21wcmVzc2VkMy5hcGsnXSkKKworICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKHRhcmdldF9maWxlcywgJ3InKSBhcyBpbnB1dF96aXA6CisgICAgICBjZXJ0bWFwLCBleHQgPSBjb21tb24uUmVhZEFwa0NlcnRzKGlucHV0X3ppcCkKKworICAgIGNlcnRtYXBfbWVyZ2VkID0gc2VsZi5BUEtDRVJUU19DRVJUTUFQMS5jb3B5KCkKKyAgICBjZXJ0bWFwX21lcmdlZC51cGRhdGUoc2VsZi5BUEtDRVJUU19DRVJUTUFQMikKKyAgICBzZWxmLmFzc2VydERpY3RFcXVhbChjZXJ0bWFwX21lcmdlZCwgY2VydG1hcCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKCcuZ3onLCBleHQpCisKKyAgZGVmIHRlc3RfUmVhZEFwa0NlcnRzX011bHRpcGxlQ29tcHJlc3Npb25NZXRob2RzKHNlbGYpOgorICAgIHRhcmdldF9maWxlcyA9IHNlbGYuX3dyaXRlX2Fwa2NlcnRzX3R4dCgKKyAgICAgICAgc2VsZi5BUEtDRVJUU19UWFQyICsgc2VsZi5BUEtDRVJUU19UWFQzLAorICAgICAgICBbJ0NvbXByZXNzZWQxLmFway5neicsICdDb21wcmVzc2VkNC5hcGsueHonXSkKKworICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKHRhcmdldF9maWxlcywgJ3InKSBhcyBpbnB1dF96aXA6CisgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBjb21tb24uUmVhZEFwa0NlcnRzLCBpbnB1dF96aXApCisKKyAgZGVmIHRlc3RfUmVhZEFwa0NlcnRzX01pc21hdGNoaW5nS2V5cyhzZWxmKToKKyAgICBtYWxmb3JtZWRfYXBrY2VydHNfdHh0ID0gKAorICAgICAgICAnbmFtZT0iQXBwMS5hcGsiIGNlcnRpZmljYXRlPSJjZXJ0cy9jZXJ0MS54NTA5LnBlbSInCisgICAgICAgICcgcHJpdmF0ZV9rZXk9ImNlcnRzL2NlcnQyLnBrOCJcbicKKyAgICApCisgICAgdGFyZ2V0X2ZpbGVzID0gc2VsZi5fd3JpdGVfYXBrY2VydHNfdHh0KG1hbGZvcm1lZF9hcGtjZXJ0c190eHQpCisKKyAgICB3aXRoIHppcGZpbGUuWmlwRmlsZSh0YXJnZXRfZmlsZXMsICdyJykgYXMgaW5wdXRfemlwOgorICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgY29tbW9uLlJlYWRBcGtDZXJ0cywgaW5wdXRfemlwKQorCisgIGRlZiB0ZXN0X0V4dHJhY3RQdWJsaWNLZXkoc2VsZik6CisgICAgY2VydCA9IG9zLnBhdGguam9pbihzZWxmLnRlc3RkYXRhX2RpciwgJ3Rlc3RrZXkueDUwOS5wZW0nKQorICAgIHB1YmtleSA9IG9zLnBhdGguam9pbihzZWxmLnRlc3RkYXRhX2RpciwgJ3Rlc3RrZXkucHVia2V5LnBlbScpCisgICAgd2l0aCBvcGVuKHB1YmtleSwgJ3JiJykgYXMgcHVia2V5X2ZwOgorICAgICAgc2VsZi5hc3NlcnRFcXVhbChwdWJrZXlfZnAucmVhZCgpLCBjb21tb24uRXh0cmFjdFB1YmxpY0tleShjZXJ0KSkKKworICBkZWYgdGVzdF9FeHRyYWN0UHVibGljS2V5X2ludmFsaWRJbnB1dChzZWxmKToKKyAgICB3cm9uZ19pbnB1dCA9IG9zLnBhdGguam9pbihzZWxmLnRlc3RkYXRhX2RpciwgJ3Rlc3RrZXkucGs4JykKKyAgICBzZWxmLmFzc2VydFJhaXNlcyhBc3NlcnRpb25FcnJvciwgY29tbW9uLkV4dHJhY3RQdWJsaWNLZXksIHdyb25nX2lucHV0KQorCisgIGRlZiB0ZXN0X1BhcnNlQ2VydGlmaWNhdGUoc2VsZik6CisgICAgY2VydCA9IG9zLnBhdGguam9pbihzZWxmLnRlc3RkYXRhX2RpciwgJ3Rlc3RrZXkueDUwOS5wZW0nKQorCisgICAgY21kID0gWydvcGVuc3NsJywgJ3g1MDknLCAnLWluJywgY2VydCwgJy1vdXRmb3JtJywgJ0RFUiddCisgICAgcHJvYyA9IGNvbW1vbi5SdW4oY21kLCBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLCBzdGRlcnI9c3VicHJvY2Vzcy5QSVBFKQorICAgIGV4cGVjdGVkLCBfID0gcHJvYy5jb21tdW5pY2F0ZSgpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBwcm9jLnJldHVybmNvZGUpCisKKyAgICB3aXRoIG9wZW4oY2VydCkgYXMgY2VydF9mcDoKKyAgICAgIGFjdHVhbCA9IGNvbW1vbi5QYXJzZUNlcnRpZmljYXRlKGNlcnRfZnAucmVhZCgpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwZWN0ZWQsIGFjdHVhbCkKKworCitjbGFzcyBDb21tb25VdGlsc1Rlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICBjb21tb24uQ2xlYW51cCgpCisKKyAgZGVmIHRlc3RfR2V0U3BhcnNlSW1hZ2VfZW1wdHlCbG9ja01hcEZpbGUoc2VsZik6CisgICAgdGFyZ2V0X2ZpbGVzID0gY29tbW9uLk1ha2VUZW1wRmlsZShwcmVmaXg9J3RhcmdldF9maWxlcy0nLCBzdWZmaXg9Jy56aXAnKQorICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKHRhcmdldF9maWxlcywgJ3cnKSBhcyB0YXJnZXRfZmlsZXNfemlwOgorICAgICAgdGFyZ2V0X2ZpbGVzX3ppcC53cml0ZSgKKyAgICAgICAgICB0ZXN0X3V0aWxzLmNvbnN0cnVjdF9zcGFyc2VfaW1hZ2UoWworICAgICAgICAgICAgICAoMHhDQUMxLCA2KSwKKyAgICAgICAgICAgICAgKDB4Q0FDMywgMyksCisgICAgICAgICAgICAgICgweENBQzEsIDQpXSksCisgICAgICAgICAgYXJjbmFtZT0nSU1BR0VTL3N5c3RlbS5pbWcnKQorICAgICAgdGFyZ2V0X2ZpbGVzX3ppcC53cml0ZXN0cignSU1BR0VTL3N5c3RlbS5tYXAnLCAnJykKKyAgICAgIHRhcmdldF9maWxlc196aXAud3JpdGVzdHIoJ1NZU1RFTS9maWxlMScsIG9zLnVyYW5kb20oNDA5NiAqIDgpKQorICAgICAgdGFyZ2V0X2ZpbGVzX3ppcC53cml0ZXN0cignU1lTVEVNL2ZpbGUyJywgb3MudXJhbmRvbSg0MDk2ICogMykpCisKKyAgICB0ZW1wZGlyID0gY29tbW9uLlVuemlwVGVtcCh0YXJnZXRfZmlsZXMpCisgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUodGFyZ2V0X2ZpbGVzLCAncicpIGFzIGlucHV0X3ppcDoKKyAgICAgIHNwYXJzZV9pbWFnZSA9IGNvbW1vbi5HZXRTcGFyc2VJbWFnZSgnc3lzdGVtJywgdGVtcGRpciwgaW5wdXRfemlwLCBGYWxzZSkKKworICAgIHNlbGYuYXNzZXJ0RGljdEVxdWFsKAorICAgICAgICB7CisgICAgICAgICAgICAnX19DT1BZJzogUmFuZ2VTZXQoIjAiKSwKKyAgICAgICAgICAgICdfX05PTlpFUk8tMCc6IFJhbmdlU2V0KCIxLTUgOS0xMiIpLAorICAgICAgICB9LAorICAgICAgICBzcGFyc2VfaW1hZ2UuZmlsZV9tYXApCisKKyAgZGVmIHRlc3RfR2V0U3BhcnNlSW1hZ2VfaW52YWxpZEltYWdlTmFtZShzZWxmKToKKyAgICBzZWxmLmFzc2VydFJhaXNlcygKKyAgICAgICAgQXNzZXJ0aW9uRXJyb3IsIGNvbW1vbi5HZXRTcGFyc2VJbWFnZSwgJ3N5c3RlbTInLCBOb25lLCBOb25lLCBGYWxzZSkKKyAgICBzZWxmLmFzc2VydFJhaXNlcygKKyAgICAgICAgQXNzZXJ0aW9uRXJyb3IsIGNvbW1vbi5HZXRTcGFyc2VJbWFnZSwgJ3Vua25vd24nLCBOb25lLCBOb25lLCBGYWxzZSkKKworICBkZWYgdGVzdF9HZXRTcGFyc2VJbWFnZV9taXNzaW5nQmxvY2tNYXBGaWxlKHNlbGYpOgorICAgIHRhcmdldF9maWxlcyA9IGNvbW1vbi5NYWtlVGVtcEZpbGUocHJlZml4PSd0YXJnZXRfZmlsZXMtJywgc3VmZml4PScuemlwJykKKyAgICB3aXRoIHppcGZpbGUuWmlwRmlsZSh0YXJnZXRfZmlsZXMsICd3JykgYXMgdGFyZ2V0X2ZpbGVzX3ppcDoKKyAgICAgIHRhcmdldF9maWxlc196aXAud3JpdGUoCisgICAgICAgICAgdGVzdF91dGlscy5jb25zdHJ1Y3Rfc3BhcnNlX2ltYWdlKFsKKyAgICAgICAgICAgICAgKDB4Q0FDMSwgNiksCisgICAgICAgICAgICAgICgweENBQzMsIDMpLAorICAgICAgICAgICAgICAoMHhDQUMxLCA0KV0pLAorICAgICAgICAgIGFyY25hbWU9J0lNQUdFUy9zeXN0ZW0uaW1nJykKKyAgICAgIHRhcmdldF9maWxlc196aXAud3JpdGVzdHIoJ1NZU1RFTS9maWxlMScsIG9zLnVyYW5kb20oNDA5NiAqIDgpKQorICAgICAgdGFyZ2V0X2ZpbGVzX3ppcC53cml0ZXN0cignU1lTVEVNL2ZpbGUyJywgb3MudXJhbmRvbSg0MDk2ICogMykpCisKKyAgICB0ZW1wZGlyID0gY29tbW9uLlVuemlwVGVtcCh0YXJnZXRfZmlsZXMpCisgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUodGFyZ2V0X2ZpbGVzLCAncicpIGFzIGlucHV0X3ppcDoKKyAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKAorICAgICAgICAgIEFzc2VydGlvbkVycm9yLCBjb21tb24uR2V0U3BhcnNlSW1hZ2UsICdzeXN0ZW0nLCB0ZW1wZGlyLCBpbnB1dF96aXAsCisgICAgICAgICAgRmFsc2UpCisKKyAgZGVmIHRlc3RfR2V0U3BhcnNlSW1hZ2Vfc2hhcmVkQmxvY2tzX25vdEFsbG93ZWQoc2VsZik6CisgICAgIiIiVGVzdHMgdGhlIGNhc2Ugb2YgaGF2aW5nIG92ZXJsYXBwaW5nIGJsb2NrcyBidXQgZGlzYWxsb3dlZC4iIiIKKyAgICB0YXJnZXRfZmlsZXMgPSBjb21tb24uTWFrZVRlbXBGaWxlKHByZWZpeD0ndGFyZ2V0X2ZpbGVzLScsIHN1ZmZpeD0nLnppcCcpCisgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUodGFyZ2V0X2ZpbGVzLCAndycpIGFzIHRhcmdldF9maWxlc196aXA6CisgICAgICB0YXJnZXRfZmlsZXNfemlwLndyaXRlKAorICAgICAgICAgIHRlc3RfdXRpbHMuY29uc3RydWN0X3NwYXJzZV9pbWFnZShbKDB4Q0FDMiwgMTYpXSksCisgICAgICAgICAgYXJjbmFtZT0nSU1BR0VTL3N5c3RlbS5pbWcnKQorICAgICAgIyBCbG9jayAxMCBpcyBzaGFyZWQgYmV0d2VlbiB0d28gZmlsZXMuCisgICAgICB0YXJnZXRfZmlsZXNfemlwLndyaXRlc3RyKAorICAgICAgICAgICdJTUFHRVMvc3lzdGVtLm1hcCcsCisgICAgICAgICAgJ1xuJy5qb2luKFsKKyAgICAgICAgICAgICAgJy9zeXN0ZW0vZmlsZTEgMS01IDktMTAnLAorICAgICAgICAgICAgICAnL3N5c3RlbS9maWxlMiAxMC0xMiddKSkKKyAgICAgIHRhcmdldF9maWxlc196aXAud3JpdGVzdHIoJ1NZU1RFTS9maWxlMScsIG9zLnVyYW5kb20oNDA5NiAqIDcpKQorICAgICAgdGFyZ2V0X2ZpbGVzX3ppcC53cml0ZXN0cignU1lTVEVNL2ZpbGUyJywgb3MudXJhbmRvbSg0MDk2ICogMykpCisKKyAgICB0ZW1wZGlyID0gY29tbW9uLlVuemlwVGVtcCh0YXJnZXRfZmlsZXMpCisgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUodGFyZ2V0X2ZpbGVzLCAncicpIGFzIGlucHV0X3ppcDoKKyAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKAorICAgICAgICAgIEFzc2VydGlvbkVycm9yLCBjb21tb24uR2V0U3BhcnNlSW1hZ2UsICdzeXN0ZW0nLCB0ZW1wZGlyLCBpbnB1dF96aXAsCisgICAgICAgICAgRmFsc2UpCisKKyAgZGVmIHRlc3RfR2V0U3BhcnNlSW1hZ2Vfc2hhcmVkQmxvY2tzX2FsbG93ZWQoc2VsZik6CisgICAgIiIiVGVzdHMgdGhlIGNhc2UgZm9yIHRhcmdldCB1c2luZyBCT0FSRF9FWFQ0X1NIQVJFX0RVUF9CTE9DS1MgOj0gdHJ1ZS4iIiIKKyAgICB0YXJnZXRfZmlsZXMgPSBjb21tb24uTWFrZVRlbXBGaWxlKHByZWZpeD0ndGFyZ2V0X2ZpbGVzLScsIHN1ZmZpeD0nLnppcCcpCisgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUodGFyZ2V0X2ZpbGVzLCAndycpIGFzIHRhcmdldF9maWxlc196aXA6CisgICAgICAjIENvbnN0cnVjdCBhbiBpbWFnZSB3aXRoIGEgY2FyZV9tYXAgb2YgIjAtNSA5LTEyIi4KKyAgICAgIHRhcmdldF9maWxlc196aXAud3JpdGUoCisgICAgICAgICAgdGVzdF91dGlscy5jb25zdHJ1Y3Rfc3BhcnNlX2ltYWdlKFsoMHhDQUMyLCAxNildKSwKKyAgICAgICAgICBhcmNuYW1lPSdJTUFHRVMvc3lzdGVtLmltZycpCisgICAgICAjIEJsb2NrIDEwIGlzIHNoYXJlZCBiZXR3ZWVuIHR3byBmaWxlcy4KKyAgICAgIHRhcmdldF9maWxlc196aXAud3JpdGVzdHIoCisgICAgICAgICAgJ0lNQUdFUy9zeXN0ZW0ubWFwJywKKyAgICAgICAgICAnXG4nLmpvaW4oWworICAgICAgICAgICAgICAnL3N5c3RlbS9maWxlMSAxLTUgOS0xMCcsCisgICAgICAgICAgICAgICcvc3lzdGVtL2ZpbGUyIDEwLTEyJ10pKQorICAgICAgdGFyZ2V0X2ZpbGVzX3ppcC53cml0ZXN0cignU1lTVEVNL2ZpbGUxJywgb3MudXJhbmRvbSg0MDk2ICogNykpCisgICAgICB0YXJnZXRfZmlsZXNfemlwLndyaXRlc3RyKCdTWVNURU0vZmlsZTInLCBvcy51cmFuZG9tKDQwOTYgKiAzKSkKKworICAgIHRlbXBkaXIgPSBjb21tb24uVW56aXBUZW1wKHRhcmdldF9maWxlcykKKyAgICB3aXRoIHppcGZpbGUuWmlwRmlsZSh0YXJnZXRfZmlsZXMsICdyJykgYXMgaW5wdXRfemlwOgorICAgICAgc3BhcnNlX2ltYWdlID0gY29tbW9uLkdldFNwYXJzZUltYWdlKCdzeXN0ZW0nLCB0ZW1wZGlyLCBpbnB1dF96aXAsIFRydWUpCisKKyAgICBzZWxmLmFzc2VydERpY3RFcXVhbCgKKyAgICAgICAgeworICAgICAgICAgICAgJ19fQ09QWSc6IFJhbmdlU2V0KCIwIiksCisgICAgICAgICAgICAnX19OT05aRVJPLTAnOiBSYW5nZVNldCgiNi04IDEzLTE1IiksCisgICAgICAgICAgICAnL3N5c3RlbS9maWxlMSc6IFJhbmdlU2V0KCIxLTUgOS0xMCIpLAorICAgICAgICAgICAgJy9zeXN0ZW0vZmlsZTInOiBSYW5nZVNldCgiMTEtMTIiKSwKKyAgICAgICAgfSwKKyAgICAgICAgc3BhcnNlX2ltYWdlLmZpbGVfbWFwKQorCisgICAgIyAnL3N5c3RlbS9maWxlMicgc2hvdWxkIGJlIG1hcmtlZCB3aXRoICd1c2VzX3NoYXJlZF9ibG9ja3MnLCBidXQgbm90IHdpdGgKKyAgICAjICdpbmNvbXBsZXRlJy4KKyAgICBzZWxmLmFzc2VydFRydWUoCisgICAgICAgIHNwYXJzZV9pbWFnZS5maWxlX21hcFsnL3N5c3RlbS9maWxlMiddLmV4dHJhWyd1c2VzX3NoYXJlZF9ibG9ja3MnXSkKKyAgICBzZWxmLmFzc2VydE5vdEluKAorICAgICAgICAnaW5jb21wbGV0ZScsIHNwYXJzZV9pbWFnZS5maWxlX21hcFsnL3N5c3RlbS9maWxlMiddLmV4dHJhKQorCisgICAgIyBBbGwgb3RoZXIgZW50cmllcyBzaG91bGQgbG9vayBub3JtYWwgd2l0aG91dCBhbnkgdGFncy4KKyAgICBzZWxmLmFzc2VydEZhbHNlKHNwYXJzZV9pbWFnZS5maWxlX21hcFsnX19DT1BZJ10uZXh0cmEpCisgICAgc2VsZi5hc3NlcnRGYWxzZShzcGFyc2VfaW1hZ2UuZmlsZV9tYXBbJ19fTk9OWkVSTy0wJ10uZXh0cmEpCisgICAgc2VsZi5hc3NlcnRGYWxzZShzcGFyc2VfaW1hZ2UuZmlsZV9tYXBbJy9zeXN0ZW0vZmlsZTEnXS5leHRyYSkKKworICBkZWYgdGVzdF9HZXRTcGFyc2VJbWFnZV9pbmNvbXBsZXRlUmFuZ2VzKHNlbGYpOgorICAgICIiIlRlc3RzIHRoZSBjYXNlIG9mIGV4dDQgaW1hZ2VzIHdpdGggaG9sZXMuIiIiCisgICAgdGFyZ2V0X2ZpbGVzID0gY29tbW9uLk1ha2VUZW1wRmlsZShwcmVmaXg9J3RhcmdldF9maWxlcy0nLCBzdWZmaXg9Jy56aXAnKQorICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKHRhcmdldF9maWxlcywgJ3cnKSBhcyB0YXJnZXRfZmlsZXNfemlwOgorICAgICAgdGFyZ2V0X2ZpbGVzX3ppcC53cml0ZSgKKyAgICAgICAgICB0ZXN0X3V0aWxzLmNvbnN0cnVjdF9zcGFyc2VfaW1hZ2UoWygweENBQzIsIDE2KV0pLAorICAgICAgICAgIGFyY25hbWU9J0lNQUdFUy9zeXN0ZW0uaW1nJykKKyAgICAgIHRhcmdldF9maWxlc196aXAud3JpdGVzdHIoCisgICAgICAgICAgJ0lNQUdFUy9zeXN0ZW0ubWFwJywKKyAgICAgICAgICAnXG4nLmpvaW4oWworICAgICAgICAgICAgICAnL3N5c3RlbS9maWxlMSAxLTUgOS0xMCcsCisgICAgICAgICAgICAgICcvc3lzdGVtL2ZpbGUyIDExLTEyJ10pKQorICAgICAgdGFyZ2V0X2ZpbGVzX3ppcC53cml0ZXN0cignU1lTVEVNL2ZpbGUxJywgb3MudXJhbmRvbSg0MDk2ICogNykpCisgICAgICAjICcvc3lzdGVtL2ZpbGUyJyBoYXMgbGVzcyBibG9ja3MgbGlzdGVkICgyKSB0aGFuIGFjdHVhbCAoMykuCisgICAgICB0YXJnZXRfZmlsZXNfemlwLndyaXRlc3RyKCdTWVNURU0vZmlsZTInLCBvcy51cmFuZG9tKDQwOTYgKiAzKSkKKworICAgIHRlbXBkaXIgPSBjb21tb24uVW56aXBUZW1wKHRhcmdldF9maWxlcykKKyAgICB3aXRoIHppcGZpbGUuWmlwRmlsZSh0YXJnZXRfZmlsZXMsICdyJykgYXMgaW5wdXRfemlwOgorICAgICAgc3BhcnNlX2ltYWdlID0gY29tbW9uLkdldFNwYXJzZUltYWdlKCdzeXN0ZW0nLCB0ZW1wZGlyLCBpbnB1dF96aXAsIEZhbHNlKQorCisgICAgc2VsZi5hc3NlcnRGYWxzZShzcGFyc2VfaW1hZ2UuZmlsZV9tYXBbJy9zeXN0ZW0vZmlsZTEnXS5leHRyYSkKKyAgICBzZWxmLmFzc2VydFRydWUoc3BhcnNlX2ltYWdlLmZpbGVfbWFwWycvc3lzdGVtL2ZpbGUyJ10uZXh0cmFbJ2luY29tcGxldGUnXSkKKworCitjbGFzcyBJbnN0YWxsUmVjb3ZlcnlTY3JpcHRGb3JtYXRUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgIiIiQ2hlY2tzIHRoZSBmb3JtYXQgb2YgaW5zdGFsbC1yZWNvdmVyeS5zaC4KKworICBJdHMgZm9ybWF0IHNob3VsZCBtYXRjaCBiZXR3ZWVuIGNvbW1vbi5weSBhbmQgdmFsaWRhdGVfdGFyZ2V0X2ZpbGVzLnB5LgorICAiIiIKKworICBkZWYgc2V0VXAoc2VsZik6CisgICAgc2VsZi5fdGVtcGRpciA9IGNvbW1vbi5NYWtlVGVtcERpcigpCiAgICAgIyBDcmVhdGUgYSBkdW1teSBkaWN0IHRoYXQgY29udGFpbnMgdGhlIGZzdGFiIGluZm8gZm9yIGJvb3QmcmVjb3ZlcnkuCiAgICAgc2VsZi5faW5mbyA9IHsiZnN0YWIiIDoge319Ci0gICAgZHVtbXlfZnN0YWIgPSBcCi0gICAgICAgIFsiL2Rldi9zb2MuMC9ieS1uYW1lL2Jvb3QgL2Jvb3QgZW1tYyBkZWZhdWx0cyBkZWZhdWx0cyIsCi0gICAgICAgICAiL2Rldi9zb2MuMC9ieS1uYW1lL3JlY292ZXJ5IC9yZWNvdmVyeSBlbW1jIGRlZmF1bHRzIGRlZmF1bHRzIl0KLSAgICBzZWxmLl9pbmZvWyJmc3RhYiJdID0gY29tbW9uLkxvYWRSZWNvdmVyeUZTVGFiKGxhbWJkYSB4IDogIlxuIi5qb2luKHgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiwgZHVtbXlfZnN0YWIpCisgICAgZHVtbXlfZnN0YWIgPSBbCisgICAgICAgICIvZGV2L3NvYy4wL2J5LW5hbWUvYm9vdCAvYm9vdCBlbW1jIGRlZmF1bHRzIGRlZmF1bHRzIiwKKyAgICAgICAgIi9kZXYvc29jLjAvYnktbmFtZS9yZWNvdmVyeSAvcmVjb3ZlcnkgZW1tYyBkZWZhdWx0cyBkZWZhdWx0cyJdCisgICAgc2VsZi5faW5mb1siZnN0YWIiXSA9IGNvbW1vbi5Mb2FkUmVjb3ZlcnlGU1RhYigiXG4iLmpvaW4sIDIsIGR1bW15X2ZzdGFiKQorICAgICMgQ29uc3RydWN0IHRoZSBnemlwcGVkIHJlY292ZXJ5LmltZyBhbmQgYm9vdC5pbWcKKyAgICBzZWxmLnJlY292ZXJ5X2RhdGEgPSBieXRlYXJyYXkoWworICAgICAgICAweDFmLCAweDhiLCAweDA4LCAweDAwLCAweDgxLCAweDExLCAweDAyLCAweDVhLCAweDAwLCAweDAzLCAweDJiLCAweDRhLAorICAgICAgICAweDRkLCAweGNlLCAweDJmLCAweDRiLCAweDJkLCAweGFhLCAweDA0LCAweDAwLCAweGM5LCAweDkzLCAweDQzLCAweGYzLAorICAgICAgICAweDA4LCAweDAwLCAweDAwLCAweDAwCisgICAgXSkKKyAgICAjIGVjaG8gLW4gImJvb3QiIHwgZ3ppcCAtZiB8IGhkCisgICAgc2VsZi5ib290X2RhdGEgPSBieXRlYXJyYXkoWworICAgICAgICAweDFmLCAweDhiLCAweDA4LCAweDAwLCAweDhjLCAweDEyLCAweDAyLCAweDVhLCAweDAwLCAweDAzLCAweDRiLCAweGNhLAorICAgICAgICAweGNmLCAweDJmLCAweDAxLCAweDAwLCAweGM0LCAweGFlLCAweGVkLCAweDQ2LCAweDA0LCAweDAwLCAweDAwLCAweDAwCisgICAgXSkKIAogICBkZWYgX291dF90bXBfc2luayhzZWxmLCBuYW1lLCBkYXRhLCBwcmVmaXg9IlNZU1RFTSIpOgogICAgIGxvYyA9IG9zLnBhdGguam9pbihzZWxmLl90ZW1wZGlyLCBwcmVmaXgsIG5hbWUpCkBAIC0zMjEsOCArNjgwLDggQEAKICAgICAgIGYud3JpdGUoZGF0YSkKIAogICBkZWYgdGVzdF9mdWxsX3JlY292ZXJ5KHNlbGYpOgotICAgIHJlY292ZXJ5X2ltYWdlID0gY29tbW9uLkZpbGUoInJlY292ZXJ5LmltZyIsICJyZWNvdmVyeSIpOwotICAgIGJvb3RfaW1hZ2UgPSBjb21tb24uRmlsZSgiYm9vdC5pbWciLCAiYm9vdCIpOworICAgIHJlY292ZXJ5X2ltYWdlID0gY29tbW9uLkZpbGUoInJlY292ZXJ5LmltZyIsIHNlbGYucmVjb3ZlcnlfZGF0YSkKKyAgICBib290X2ltYWdlID0gY29tbW9uLkZpbGUoImJvb3QuaW1nIiwgc2VsZi5ib290X2RhdGEpCiAgICAgc2VsZi5faW5mb1siZnVsbF9yZWNvdmVyeV9pbWFnZSJdID0gInRydWUiCiAKICAgICBjb21tb24uTWFrZVJlY292ZXJ5UGF0Y2goc2VsZi5fdGVtcGRpciwgc2VsZi5fb3V0X3RtcF9zaW5rLApAQCAtMzMxLDkgKzY5MCw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2luZm8pCiAKICAgZGVmIHRlc3RfcmVjb3ZlcnlfZnJvbV9ib290KHNlbGYpOgotICAgIHJlY292ZXJ5X2ltYWdlID0gY29tbW9uLkZpbGUoInJlY292ZXJ5LmltZyIsICJyZWNvdmVyeSIpOworICAgIHJlY292ZXJ5X2ltYWdlID0gY29tbW9uLkZpbGUoInJlY292ZXJ5LmltZyIsIHNlbGYucmVjb3ZlcnlfZGF0YSkKICAgICBzZWxmLl9vdXRfdG1wX3NpbmsoInJlY292ZXJ5LmltZyIsIHJlY292ZXJ5X2ltYWdlLmRhdGEsICJJTUFHRVMiKQotICAgIGJvb3RfaW1hZ2UgPSBjb21tb24uRmlsZSgiYm9vdC5pbWciLCAiYm9vdCIpOworICAgIGJvb3RfaW1hZ2UgPSBjb21tb24uRmlsZSgiYm9vdC5pbWciLCBzZWxmLmJvb3RfZGF0YSkKICAgICBzZWxmLl9vdXRfdG1wX3NpbmsoImJvb3QuaW1nIiwgYm9vdF9pbWFnZS5kYXRhLCAiSU1BR0VTIikKIAogICAgIGNvbW1vbi5NYWtlUmVjb3ZlcnlQYXRjaChzZWxmLl90ZW1wZGlyLCBzZWxmLl9vdXRfdG1wX3NpbmssCkBAIC0zNDgsNCArNzA3LDQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5faW5mbykKIAogICBkZWYgdGVhckRvd24oc2VsZik6Ci0gICAgc2h1dGlsLnJtdHJlZShzZWxmLl90ZW1wZGlyKQorICAgIGNvbW1vbi5DbGVhbnVwKCkKZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbGVhc2V0b29scy90ZXN0X290YV9mcm9tX3RhcmdldF9maWxlcy5weSBiL3Rvb2xzL3JlbGVhc2V0b29scy90ZXN0X290YV9mcm9tX3RhcmdldF9maWxlcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjJlNzAxCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcmVsZWFzZXRvb2xzL3Rlc3Rfb3RhX2Zyb21fdGFyZ2V0X2ZpbGVzLnB5CkBAIC0wLDAgKzEsMTMzNiBAQAorIworIyBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworaW1wb3J0IGNvcHkKK2ltcG9ydCBvcworaW1wb3J0IG9zLnBhdGgKK2ltcG9ydCBzdWJwcm9jZXNzCitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCB6aXBmaWxlCisKK2ltcG9ydCBjb21tb24KK2ltcG9ydCB0ZXN0X3V0aWxzCitmcm9tIG90YV9mcm9tX3RhcmdldF9maWxlcyBpbXBvcnQgKAorICAgIF9Mb2FkT2VtRGljdHMsIEFiT3RhUHJvcGVydHlGaWxlcywgQnVpbGRJbmZvLCBGaW5hbGl6ZU1ldGFkYXRhLAorICAgIEdldFBhY2thZ2VNZXRhZGF0YSwgR2V0VGFyZ2V0RmlsZXNaaXBGb3JTZWNvbmRhcnlJbWFnZXMsCisgICAgR2V0VGFyZ2V0RmlsZXNaaXBXaXRob3V0UG9zdGluc3RhbGxDb25maWcsIE5vbkFiT3RhUHJvcGVydHlGaWxlcywKKyAgICBQYXlsb2FkLCBQYXlsb2FkU2lnbmVyLCBQT1NUSU5TVEFMTF9DT05GSUcsIFByb3BlcnR5RmlsZXMsCisgICAgU3RyZWFtaW5nUHJvcGVydHlGaWxlcywgV3JpdGVGaW5nZXJwcmludEFzc2VydGlvbikKKworCitkZWYgY29uc3RydWN0X3RhcmdldF9maWxlcyhzZWNvbmRhcnk9RmFsc2UpOgorICAiIiJSZXR1cm5zIGEgdGFyZ2V0LWZpbGVzLnppcCBmaWxlIGZvciBnZW5lcmF0aW5nIE9UQSBwYWNrYWdlcy4iIiIKKyAgdGFyZ2V0X2ZpbGVzID0gY29tbW9uLk1ha2VUZW1wRmlsZShwcmVmaXg9J3RhcmdldF9maWxlcy0nLCBzdWZmaXg9Jy56aXAnKQorICB3aXRoIHppcGZpbGUuWmlwRmlsZSh0YXJnZXRfZmlsZXMsICd3JykgYXMgdGFyZ2V0X2ZpbGVzX3ppcDoKKyAgICAjIE1FVEEvdXBkYXRlX2VuZ2luZV9jb25maWcudHh0CisgICAgdGFyZ2V0X2ZpbGVzX3ppcC53cml0ZXN0cigKKyAgICAgICAgJ01FVEEvdXBkYXRlX2VuZ2luZV9jb25maWcudHh0JywKKyAgICAgICAgIlBBWUxPQURfTUFKT1JfVkVSU0lPTj0yXG5QQVlMT0FEX01JTk9SX1ZFUlNJT049NFxuIikKKworICAgICMgTUVUQS9wb3N0aW5zdGFsbF9jb25maWcudHh0CisgICAgdGFyZ2V0X2ZpbGVzX3ppcC53cml0ZXN0cigKKyAgICAgICAgUE9TVElOU1RBTExfQ09ORklHLAorICAgICAgICAnXG4nLmpvaW4oWworICAgICAgICAgICAgIlJVTl9QT1NUSU5TVEFMTF9zeXN0ZW09dHJ1ZSIsCisgICAgICAgICAgICAiUE9TVElOU1RBTExfUEFUSF9zeXN0ZW09c3lzdGVtL2Jpbi9vdGFwcmVvcHRfc2NyaXB0IiwKKyAgICAgICAgICAgICJGSUxFU1lTVEVNX1RZUEVfc3lzdGVtPWV4dDQiLAorICAgICAgICAgICAgIlBPU1RJTlNUQUxMX09QVElPTkFMX3N5c3RlbT10cnVlIiwKKyAgICAgICAgXSkpCisKKyAgICAjIE1FVEEvYWJfcGFydGl0aW9ucy50eHQKKyAgICBhYl9wYXJ0aXRpb25zID0gWydib290JywgJ3N5c3RlbScsICd2ZW5kb3InXQorICAgIHRhcmdldF9maWxlc196aXAud3JpdGVzdHIoCisgICAgICAgICdNRVRBL2FiX3BhcnRpdGlvbnMudHh0JywKKyAgICAgICAgJ1xuJy5qb2luKGFiX3BhcnRpdGlvbnMpKQorCisgICAgIyBDcmVhdGUgZHVtbXkgaW1hZ2VzIGZvciBlYWNoIG9mIHRoZW0uCisgICAgZm9yIHBhcnRpdGlvbiBpbiBhYl9wYXJ0aXRpb25zOgorICAgICAgdGFyZ2V0X2ZpbGVzX3ppcC53cml0ZXN0cignSU1BR0VTLycgKyBwYXJ0aXRpb24gKyAnLmltZycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zLnVyYW5kb20obGVuKHBhcnRpdGlvbikpKQorCisgICAgaWYgc2Vjb25kYXJ5OgorICAgICAgdGFyZ2V0X2ZpbGVzX3ppcC53cml0ZXN0cignSU1BR0VTL3N5c3RlbV9vdGhlci5pbWcnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcy51cmFuZG9tKGxlbigic3lzdGVtX290aGVyIikpKQorCisgIHJldHVybiB0YXJnZXRfZmlsZXMKKworCitjbGFzcyBNb2NrU2NyaXB0V3JpdGVyKG9iamVjdCk6CisgICIiIkEgY2xhc3MgdGhhdCBtb2NrcyBlZGlmeV9nZW5lcmF0b3IuRWRpZnlHZW5lcmF0b3IuCisKKyAgSXQgc2ltcGx5IHB1c2hlcyB0aGUgaW5jb21pbmcgYXJndW1lbnRzIG9udG8gc2NyaXB0IHN0YWNrLCB3aGljaCBpcyB0byBhc3NlcnQKKyAgdGhlIGNhbGxzIHRvIEVkaWZ5R2VuZXJhdG9yIGZ1bmN0aW9ucy4KKyAgIiIiCisKKyAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgIHNlbGYuc2NyaXB0ID0gW10KKworICBkZWYgTW91bnQoc2VsZiwgKmFyZ3MpOgorICAgIHNlbGYuc2NyaXB0LmFwcGVuZCgoJ01vdW50JywpICsgYXJncykKKworICBkZWYgQXNzZXJ0RGV2aWNlKHNlbGYsICphcmdzKToKKyAgICBzZWxmLnNjcmlwdC5hcHBlbmQoKCdBc3NlcnREZXZpY2UnLCkgKyBhcmdzKQorCisgIGRlZiBBc3NlcnRPZW1Qcm9wZXJ0eShzZWxmLCAqYXJncyk6CisgICAgc2VsZi5zY3JpcHQuYXBwZW5kKCgnQXNzZXJ0T2VtUHJvcGVydHknLCkgKyBhcmdzKQorCisgIGRlZiBBc3NlcnRGaW5nZXJwcmludE9yVGh1bWJwcmludChzZWxmLCAqYXJncyk6CisgICAgc2VsZi5zY3JpcHQuYXBwZW5kKCgnQXNzZXJ0RmluZ2VycHJpbnRPclRodW1icHJpbnQnLCkgKyBhcmdzKQorCisgIGRlZiBBc3NlcnRTb21lRmluZ2VycHJpbnQoc2VsZiwgKmFyZ3MpOgorICAgIHNlbGYuc2NyaXB0LmFwcGVuZCgoJ0Fzc2VydFNvbWVGaW5nZXJwcmludCcsKSArIGFyZ3MpCisKKyAgZGVmIEFzc2VydFNvbWVUaHVtYnByaW50KHNlbGYsICphcmdzKToKKyAgICBzZWxmLnNjcmlwdC5hcHBlbmQoKCdBc3NlcnRTb21lVGh1bWJwcmludCcsKSArIGFyZ3MpCisKKworY2xhc3MgQnVpbGRJbmZvVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgVEVTVF9JTkZPX0RJQ1QgPSB7CisgICAgICAnYnVpbGQucHJvcCcgOiB7CisgICAgICAgICAgJ3JvLnByb2R1Y3QuZGV2aWNlJyA6ICdwcm9kdWN0LWRldmljZScsCisgICAgICAgICAgJ3JvLnByb2R1Y3QubmFtZScgOiAncHJvZHVjdC1uYW1lJywKKyAgICAgICAgICAncm8uYnVpbGQuZmluZ2VycHJpbnQnIDogJ2J1aWxkLWZpbmdlcnByaW50JywKKyAgICAgICAgICAncm8uYnVpbGQuZm9vJyA6ICdidWlsZC1mb28nLAorICAgICAgfSwKKyAgICAgICd2ZW5kb3IuYnVpbGQucHJvcCcgOiB7CisgICAgICAgICAgJ3JvLnZlbmRvci5idWlsZC5maW5nZXJwcmludCcgOiAndmVuZG9yLWJ1aWxkLWZpbmdlcnByaW50JywKKyAgICAgIH0sCisgICAgICAncHJvcGVydHkxJyA6ICd2YWx1ZTEnLAorICAgICAgJ3Byb3BlcnR5MicgOiA0MDk2LAorICB9CisKKyAgVEVTVF9JTkZPX0RJQ1RfVVNFU19PRU1fUFJPUFMgPSB7CisgICAgICAnYnVpbGQucHJvcCcgOiB7CisgICAgICAgICAgJ3JvLnByb2R1Y3QubmFtZScgOiAncHJvZHVjdC1uYW1lJywKKyAgICAgICAgICAncm8uYnVpbGQudGh1bWJwcmludCcgOiAnYnVpbGQtdGh1bWJwcmludCcsCisgICAgICAgICAgJ3JvLmJ1aWxkLmJhcicgOiAnYnVpbGQtYmFyJywKKyAgICAgIH0sCisgICAgICAndmVuZG9yLmJ1aWxkLnByb3AnIDogeworICAgICAgICAgICdyby52ZW5kb3IuYnVpbGQuZmluZ2VycHJpbnQnIDogJ3ZlbmRvci1idWlsZC1maW5nZXJwcmludCcsCisgICAgICB9LAorICAgICAgJ3Byb3BlcnR5MScgOiAndmFsdWUxJywKKyAgICAgICdwcm9wZXJ0eTInIDogNDA5NiwKKyAgICAgICdvZW1fZmluZ2VycHJpbnRfcHJvcGVydGllcycgOiAncm8ucHJvZHVjdC5kZXZpY2Ugcm8ucHJvZHVjdC5icmFuZCcsCisgIH0KKworICBURVNUX09FTV9ESUNUUyA9IFsKKyAgICAgIHsKKyAgICAgICAgICAncm8ucHJvZHVjdC5icmFuZCcgOiAnYnJhbmQxJywKKyAgICAgICAgICAncm8ucHJvZHVjdC5kZXZpY2UnIDogJ2RldmljZTEnLAorICAgICAgfSwKKyAgICAgIHsKKyAgICAgICAgICAncm8ucHJvZHVjdC5icmFuZCcgOiAnYnJhbmQyJywKKyAgICAgICAgICAncm8ucHJvZHVjdC5kZXZpY2UnIDogJ2RldmljZTInLAorICAgICAgfSwKKyAgICAgIHsKKyAgICAgICAgICAncm8ucHJvZHVjdC5icmFuZCcgOiAnYnJhbmQzJywKKyAgICAgICAgICAncm8ucHJvZHVjdC5kZXZpY2UnIDogJ2RldmljZTMnLAorICAgICAgfSwKKyAgXQorCisgIGRlZiB0ZXN0X2luaXQoc2VsZik6CisgICAgdGFyZ2V0X2luZm8gPSBCdWlsZEluZm8oc2VsZi5URVNUX0lORk9fRElDVCwgTm9uZSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKCdwcm9kdWN0LWRldmljZScsIHRhcmdldF9pbmZvLmRldmljZSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKCdidWlsZC1maW5nZXJwcmludCcsIHRhcmdldF9pbmZvLmZpbmdlcnByaW50KQorICAgIHNlbGYuYXNzZXJ0RmFsc2UodGFyZ2V0X2luZm8uaXNfYWIpCisgICAgc2VsZi5hc3NlcnRJc05vbmUodGFyZ2V0X2luZm8ub2VtX3Byb3BzKQorCisgIGRlZiB0ZXN0X2luaXRfd2l0aF9vZW1fcHJvcHMoc2VsZik6CisgICAgdGFyZ2V0X2luZm8gPSBCdWlsZEluZm8oc2VsZi5URVNUX0lORk9fRElDVF9VU0VTX09FTV9QUk9QUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLlRFU1RfT0VNX0RJQ1RTKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ2RldmljZTEnLCB0YXJnZXRfaW5mby5kZXZpY2UpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgnYnJhbmQxL3Byb2R1Y3QtbmFtZS9kZXZpY2UxOmJ1aWxkLXRodW1icHJpbnQnLAorICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X2luZm8uZmluZ2VycHJpbnQpCisKKyAgICAjIFN3YXAgdGhlIG9yZGVyIGluIG9lbV9kaWN0cywgd2hpY2ggd291bGQgbGVhZCB0byBkaWZmZXJlbnQgQnVpbGRJbmZvLgorICAgIG9lbV9kaWN0cyA9IGNvcHkuY29weShzZWxmLlRFU1RfT0VNX0RJQ1RTKQorICAgIG9lbV9kaWN0c1swXSwgb2VtX2RpY3RzWzJdID0gb2VtX2RpY3RzWzJdLCBvZW1fZGljdHNbMF0KKyAgICB0YXJnZXRfaW5mbyA9IEJ1aWxkSW5mbyhzZWxmLlRFU1RfSU5GT19ESUNUX1VTRVNfT0VNX1BST1BTLCBvZW1fZGljdHMpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgnZGV2aWNlMycsIHRhcmdldF9pbmZvLmRldmljZSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKCdicmFuZDMvcHJvZHVjdC1uYW1lL2RldmljZTM6YnVpbGQtdGh1bWJwcmludCcsCisgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfaW5mby5maW5nZXJwcmludCkKKworICAgICMgTWlzc2luZyBvZW1fZGljdCBzaG91bGQgYmUgcmVqZWN0ZWQuCisgICAgc2VsZi5hc3NlcnRSYWlzZXMoQXNzZXJ0aW9uRXJyb3IsIEJ1aWxkSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICBzZWxmLlRFU1RfSU5GT19ESUNUX1VTRVNfT0VNX1BST1BTLCBOb25lKQorCisgIGRlZiB0ZXN0X19fZ2V0aXRlbV9fKHNlbGYpOgorICAgIHRhcmdldF9pbmZvID0gQnVpbGRJbmZvKHNlbGYuVEVTVF9JTkZPX0RJQ1QsIE5vbmUpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgndmFsdWUxJywgdGFyZ2V0X2luZm9bJ3Byb3BlcnR5MSddKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoNDA5NiwgdGFyZ2V0X2luZm9bJ3Byb3BlcnR5MiddKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ2J1aWxkLWZvbycsIHRhcmdldF9pbmZvWydidWlsZC5wcm9wJ11bJ3JvLmJ1aWxkLmZvbyddKQorCisgIGRlZiB0ZXN0X19fZ2V0aXRlbV9fd2l0aF9vZW1fcHJvcHMoc2VsZik6CisgICAgdGFyZ2V0X2luZm8gPSBCdWlsZEluZm8oc2VsZi5URVNUX0lORk9fRElDVF9VU0VTX09FTV9QUk9QUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLlRFU1RfT0VNX0RJQ1RTKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3ZhbHVlMScsIHRhcmdldF9pbmZvWydwcm9wZXJ0eTEnXSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDQwOTYsIHRhcmdldF9pbmZvWydwcm9wZXJ0eTInXSkKKyAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICBsYW1iZGE6IHRhcmdldF9pbmZvWydidWlsZC5wcm9wJ11bJ3JvLmJ1aWxkLmZvbyddKQorCisgIGRlZiB0ZXN0X2dldChzZWxmKToKKyAgICB0YXJnZXRfaW5mbyA9IEJ1aWxkSW5mbyhzZWxmLlRFU1RfSU5GT19ESUNULCBOb25lKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3ZhbHVlMScsIHRhcmdldF9pbmZvLmdldCgncHJvcGVydHkxJykpCisgICAgc2VsZi5hc3NlcnRFcXVhbCg0MDk2LCB0YXJnZXRfaW5mby5nZXQoJ3Byb3BlcnR5MicpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoNDA5NiwgdGFyZ2V0X2luZm8uZ2V0KCdwcm9wZXJ0eTInLCAxMDI0KSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDEwMjQsIHRhcmdldF9pbmZvLmdldCgncHJvcGVydHktbm9uZXhpc3RlbnQnLCAxMDI0KSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKCdidWlsZC1mb28nLCB0YXJnZXRfaW5mby5nZXQoJ2J1aWxkLnByb3AnKVsncm8uYnVpbGQuZm9vJ10pCisKKyAgZGVmIHRlc3RfZ2V0X3dpdGhfb2VtX3Byb3BzKHNlbGYpOgorICAgIHRhcmdldF9pbmZvID0gQnVpbGRJbmZvKHNlbGYuVEVTVF9JTkZPX0RJQ1RfVVNFU19PRU1fUFJPUFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5URVNUX09FTV9ESUNUUykKKyAgICBzZWxmLmFzc2VydEVxdWFsKCd2YWx1ZTEnLCB0YXJnZXRfaW5mby5nZXQoJ3Byb3BlcnR5MScpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoNDA5NiwgdGFyZ2V0X2luZm8uZ2V0KCdwcm9wZXJ0eTInKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDQwOTYsIHRhcmdldF9pbmZvLmdldCgncHJvcGVydHkyJywgMTAyNCkpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgxMDI0LCB0YXJnZXRfaW5mby5nZXQoJ3Byb3BlcnR5LW5vbmV4aXN0ZW50JywgMTAyNCkpCisgICAgc2VsZi5hc3NlcnRJc05vbmUodGFyZ2V0X2luZm8uZ2V0KCdidWlsZC5wcm9wJykuZ2V0KCdyby5idWlsZC5mb28nKSkKKyAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICBsYW1iZGE6IHRhcmdldF9pbmZvLmdldCgnYnVpbGQucHJvcCcpWydyby5idWlsZC5mb28nXSkKKworICBkZWYgdGVzdF9HZXRCdWlsZFByb3Aoc2VsZik6CisgICAgdGFyZ2V0X2luZm8gPSBCdWlsZEluZm8oc2VsZi5URVNUX0lORk9fRElDVCwgTm9uZSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKCdidWlsZC1mb28nLCB0YXJnZXRfaW5mby5HZXRCdWlsZFByb3AoJ3JvLmJ1aWxkLmZvbycpKQorICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGNvbW1vbi5FeHRlcm5hbEVycm9yLCB0YXJnZXRfaW5mby5HZXRCdWlsZFByb3AsCisgICAgICAgICAgICAgICAgICAgICAgJ3JvLmJ1aWxkLm5vbmV4aXN0ZW50JykKKworICBkZWYgdGVzdF9HZXRCdWlsZFByb3Bfd2l0aF9vZW1fcHJvcHMoc2VsZik6CisgICAgdGFyZ2V0X2luZm8gPSBCdWlsZEluZm8oc2VsZi5URVNUX0lORk9fRElDVF9VU0VTX09FTV9QUk9QUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLlRFU1RfT0VNX0RJQ1RTKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ2J1aWxkLWJhcicsIHRhcmdldF9pbmZvLkdldEJ1aWxkUHJvcCgncm8uYnVpbGQuYmFyJykpCisgICAgc2VsZi5hc3NlcnRSYWlzZXMoY29tbW9uLkV4dGVybmFsRXJyb3IsIHRhcmdldF9pbmZvLkdldEJ1aWxkUHJvcCwKKyAgICAgICAgICAgICAgICAgICAgICAncm8uYnVpbGQubm9uZXhpc3RlbnQnKQorCisgIGRlZiB0ZXN0X0dldFZlbmRvckJ1aWxkUHJvcChzZWxmKToKKyAgICB0YXJnZXRfaW5mbyA9IEJ1aWxkSW5mbyhzZWxmLlRFU1RfSU5GT19ESUNULCBOb25lKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3ZlbmRvci1idWlsZC1maW5nZXJwcmludCcsCisgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfaW5mby5HZXRWZW5kb3JCdWlsZFByb3AoCisgICAgICAgICAgICAgICAgICAgICAgICAgJ3JvLnZlbmRvci5idWlsZC5maW5nZXJwcmludCcpKQorICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGNvbW1vbi5FeHRlcm5hbEVycm9yLCB0YXJnZXRfaW5mby5HZXRWZW5kb3JCdWlsZFByb3AsCisgICAgICAgICAgICAgICAgICAgICAgJ3JvLmJ1aWxkLm5vbmV4aXN0ZW50JykKKworICBkZWYgdGVzdF9HZXRWZW5kb3JCdWlsZFByb3Bfd2l0aF9vZW1fcHJvcHMoc2VsZik6CisgICAgdGFyZ2V0X2luZm8gPSBCdWlsZEluZm8oc2VsZi5URVNUX0lORk9fRElDVF9VU0VTX09FTV9QUk9QUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLlRFU1RfT0VNX0RJQ1RTKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3ZlbmRvci1idWlsZC1maW5nZXJwcmludCcsCisgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfaW5mby5HZXRWZW5kb3JCdWlsZFByb3AoCisgICAgICAgICAgICAgICAgICAgICAgICAgJ3JvLnZlbmRvci5idWlsZC5maW5nZXJwcmludCcpKQorICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGNvbW1vbi5FeHRlcm5hbEVycm9yLCB0YXJnZXRfaW5mby5HZXRWZW5kb3JCdWlsZFByb3AsCisgICAgICAgICAgICAgICAgICAgICAgJ3JvLmJ1aWxkLm5vbmV4aXN0ZW50JykKKworICBkZWYgdGVzdF9Xcml0ZU1vdW50T2VtU2NyaXB0KHNlbGYpOgorICAgIHRhcmdldF9pbmZvID0gQnVpbGRJbmZvKHNlbGYuVEVTVF9JTkZPX0RJQ1RfVVNFU19PRU1fUFJPUFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5URVNUX09FTV9ESUNUUykKKyAgICBzY3JpcHRfd3JpdGVyID0gTW9ja1NjcmlwdFdyaXRlcigpCisgICAgdGFyZ2V0X2luZm8uV3JpdGVNb3VudE9lbVNjcmlwdChzY3JpcHRfd3JpdGVyKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoWygnTW91bnQnLCAnL29lbScsIE5vbmUpXSwgc2NyaXB0X3dyaXRlci5zY3JpcHQpCisKKyAgZGVmIHRlc3RfV3JpdGVEZXZpY2VBc3NlcnRpb25zKHNlbGYpOgorICAgIHRhcmdldF9pbmZvID0gQnVpbGRJbmZvKHNlbGYuVEVTVF9JTkZPX0RJQ1QsIE5vbmUpCisgICAgc2NyaXB0X3dyaXRlciA9IE1vY2tTY3JpcHRXcml0ZXIoKQorICAgIHRhcmdldF9pbmZvLldyaXRlRGV2aWNlQXNzZXJ0aW9ucyhzY3JpcHRfd3JpdGVyLCBGYWxzZSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKFsoJ0Fzc2VydERldmljZScsICdwcm9kdWN0LWRldmljZScpXSwgc2NyaXB0X3dyaXRlci5zY3JpcHQpCisKKyAgZGVmIHRlc3RfV3JpdGVEZXZpY2VBc3NlcnRpb25zX3dpdGhfb2VtX3Byb3BzKHNlbGYpOgorICAgIHRhcmdldF9pbmZvID0gQnVpbGRJbmZvKHNlbGYuVEVTVF9JTkZPX0RJQ1RfVVNFU19PRU1fUFJPUFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5URVNUX09FTV9ESUNUUykKKyAgICBzY3JpcHRfd3JpdGVyID0gTW9ja1NjcmlwdFdyaXRlcigpCisgICAgdGFyZ2V0X2luZm8uV3JpdGVEZXZpY2VBc3NlcnRpb25zKHNjcmlwdF93cml0ZXIsIEZhbHNlKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgIFsKKyAgICAgICAgICAgICgnQXNzZXJ0T2VtUHJvcGVydHknLCAncm8ucHJvZHVjdC5kZXZpY2UnLAorICAgICAgICAgICAgIFsnZGV2aWNlMScsICdkZXZpY2UyJywgJ2RldmljZTMnXSwgRmFsc2UpLAorICAgICAgICAgICAgKCdBc3NlcnRPZW1Qcm9wZXJ0eScsICdyby5wcm9kdWN0LmJyYW5kJywKKyAgICAgICAgICAgICBbJ2JyYW5kMScsICdicmFuZDInLCAnYnJhbmQzJ10sIEZhbHNlKSwKKyAgICAgICAgXSwKKyAgICAgICAgc2NyaXB0X3dyaXRlci5zY3JpcHQpCisKKyAgZGVmIHRlc3RfV3JpdGVGaW5nZXJwcmludEFzc2VydGlvbl93aXRob3V0X29lbV9wcm9wcyhzZWxmKToKKyAgICB0YXJnZXRfaW5mbyA9IEJ1aWxkSW5mbyhzZWxmLlRFU1RfSU5GT19ESUNULCBOb25lKQorICAgIHNvdXJjZV9pbmZvX2RpY3QgPSBjb3B5LmRlZXBjb3B5KHNlbGYuVEVTVF9JTkZPX0RJQ1QpCisgICAgc291cmNlX2luZm9fZGljdFsnYnVpbGQucHJvcCddWydyby5idWlsZC5maW5nZXJwcmludCddID0gKAorICAgICAgICAnc291cmNlLWJ1aWxkLWZpbmdlcnByaW50JykKKyAgICBzb3VyY2VfaW5mbyA9IEJ1aWxkSW5mbyhzb3VyY2VfaW5mb19kaWN0LCBOb25lKQorCisgICAgc2NyaXB0X3dyaXRlciA9IE1vY2tTY3JpcHRXcml0ZXIoKQorICAgIFdyaXRlRmluZ2VycHJpbnRBc3NlcnRpb24oc2NyaXB0X3dyaXRlciwgdGFyZ2V0X2luZm8sIHNvdXJjZV9pbmZvKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgIFsoJ0Fzc2VydFNvbWVGaW5nZXJwcmludCcsICdzb3VyY2UtYnVpbGQtZmluZ2VycHJpbnQnLAorICAgICAgICAgICdidWlsZC1maW5nZXJwcmludCcpXSwKKyAgICAgICAgc2NyaXB0X3dyaXRlci5zY3JpcHQpCisKKyAgZGVmIHRlc3RfV3JpdGVGaW5nZXJwcmludEFzc2VydGlvbl93aXRoX3NvdXJjZV9vZW1fcHJvcHMoc2VsZik6CisgICAgdGFyZ2V0X2luZm8gPSBCdWlsZEluZm8oc2VsZi5URVNUX0lORk9fRElDVCwgTm9uZSkKKyAgICBzb3VyY2VfaW5mbyA9IEJ1aWxkSW5mbyhzZWxmLlRFU1RfSU5GT19ESUNUX1VTRVNfT0VNX1BST1BTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuVEVTVF9PRU1fRElDVFMpCisKKyAgICBzY3JpcHRfd3JpdGVyID0gTW9ja1NjcmlwdFdyaXRlcigpCisgICAgV3JpdGVGaW5nZXJwcmludEFzc2VydGlvbihzY3JpcHRfd3JpdGVyLCB0YXJnZXRfaW5mbywgc291cmNlX2luZm8pCisgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgWygnQXNzZXJ0RmluZ2VycHJpbnRPclRodW1icHJpbnQnLCAnYnVpbGQtZmluZ2VycHJpbnQnLAorICAgICAgICAgICdidWlsZC10aHVtYnByaW50JyldLAorICAgICAgICBzY3JpcHRfd3JpdGVyLnNjcmlwdCkKKworICBkZWYgdGVzdF9Xcml0ZUZpbmdlcnByaW50QXNzZXJ0aW9uX3dpdGhfdGFyZ2V0X29lbV9wcm9wcyhzZWxmKToKKyAgICB0YXJnZXRfaW5mbyA9IEJ1aWxkSW5mbyhzZWxmLlRFU1RfSU5GT19ESUNUX1VTRVNfT0VNX1BST1BTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuVEVTVF9PRU1fRElDVFMpCisgICAgc291cmNlX2luZm8gPSBCdWlsZEluZm8oc2VsZi5URVNUX0lORk9fRElDVCwgTm9uZSkKKworICAgIHNjcmlwdF93cml0ZXIgPSBNb2NrU2NyaXB0V3JpdGVyKCkKKyAgICBXcml0ZUZpbmdlcnByaW50QXNzZXJ0aW9uKHNjcmlwdF93cml0ZXIsIHRhcmdldF9pbmZvLCBzb3VyY2VfaW5mbykKKyAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICBbKCdBc3NlcnRGaW5nZXJwcmludE9yVGh1bWJwcmludCcsICdidWlsZC1maW5nZXJwcmludCcsCisgICAgICAgICAgJ2J1aWxkLXRodW1icHJpbnQnKV0sCisgICAgICAgIHNjcmlwdF93cml0ZXIuc2NyaXB0KQorCisgIGRlZiB0ZXN0X1dyaXRlRmluZ2VycHJpbnRBc3NlcnRpb25fd2l0aF9ib3RoX29lbV9wcm9wcyhzZWxmKToKKyAgICB0YXJnZXRfaW5mbyA9IEJ1aWxkSW5mbyhzZWxmLlRFU1RfSU5GT19ESUNUX1VTRVNfT0VNX1BST1BTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuVEVTVF9PRU1fRElDVFMpCisgICAgc291cmNlX2luZm9fZGljdCA9IGNvcHkuZGVlcGNvcHkoc2VsZi5URVNUX0lORk9fRElDVF9VU0VTX09FTV9QUk9QUykKKyAgICBzb3VyY2VfaW5mb19kaWN0WydidWlsZC5wcm9wJ11bJ3JvLmJ1aWxkLnRodW1icHJpbnQnXSA9ICgKKyAgICAgICAgJ3NvdXJjZS1idWlsZC10aHVtYnByaW50JykKKyAgICBzb3VyY2VfaW5mbyA9IEJ1aWxkSW5mbyhzb3VyY2VfaW5mb19kaWN0LCBzZWxmLlRFU1RfT0VNX0RJQ1RTKQorCisgICAgc2NyaXB0X3dyaXRlciA9IE1vY2tTY3JpcHRXcml0ZXIoKQorICAgIFdyaXRlRmluZ2VycHJpbnRBc3NlcnRpb24oc2NyaXB0X3dyaXRlciwgdGFyZ2V0X2luZm8sIHNvdXJjZV9pbmZvKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgIFsoJ0Fzc2VydFNvbWVUaHVtYnByaW50JywgJ2J1aWxkLXRodW1icHJpbnQnLAorICAgICAgICAgICdzb3VyY2UtYnVpbGQtdGh1bWJwcmludCcpXSwKKyAgICAgICAgc2NyaXB0X3dyaXRlci5zY3JpcHQpCisKKworY2xhc3MgTG9hZE9lbURpY3RzVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgIGNvbW1vbi5DbGVhbnVwKCkKKworICBkZWYgdGVzdF9Ob25lRGljdChzZWxmKToKKyAgICBzZWxmLmFzc2VydElzTm9uZShfTG9hZE9lbURpY3RzKE5vbmUpKQorCisgIGRlZiB0ZXN0X1NpbmdsZURpY3Qoc2VsZik6CisgICAgZGljdF9maWxlID0gY29tbW9uLk1ha2VUZW1wRmlsZSgpCisgICAgd2l0aCBvcGVuKGRpY3RfZmlsZSwgJ3cnKSBhcyBkaWN0X2ZwOgorICAgICAgZGljdF9mcC53cml0ZSgnYWJjPTFcbmRlZj0yXG54eXo9Zm9vXG5hLmIuYz1iYXJcbicpCisKKyAgICBvZW1fZGljdHMgPSBfTG9hZE9lbURpY3RzKFtkaWN0X2ZpbGVdKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMSwgbGVuKG9lbV9kaWN0cykpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgnZm9vJywgb2VtX2RpY3RzWzBdWyd4eXonXSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKCdiYXInLCBvZW1fZGljdHNbMF1bJ2EuYi5jJ10pCisKKyAgZGVmIHRlc3RfTXVsdGlwbGVEaWN0cyhzZWxmKToKKyAgICBvZW1fc291cmNlID0gW10KKyAgICBmb3IgaSBpbiByYW5nZSgzKToKKyAgICAgIGRpY3RfZmlsZSA9IGNvbW1vbi5NYWtlVGVtcEZpbGUoKQorICAgICAgd2l0aCBvcGVuKGRpY3RfZmlsZSwgJ3cnKSBhcyBkaWN0X2ZwOgorICAgICAgICBkaWN0X2ZwLndyaXRlKAorICAgICAgICAgICAgJ3JvLmJ1aWxkLmluZGV4PXt9XG5kZWY9MlxueHl6PWZvb1xuYS5iLmM9YmFyXG4nLmZvcm1hdChpKSkKKyAgICAgIG9lbV9zb3VyY2UuYXBwZW5kKGRpY3RfZmlsZSkKKworICAgIG9lbV9kaWN0cyA9IF9Mb2FkT2VtRGljdHMob2VtX3NvdXJjZSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDMsIGxlbihvZW1fZGljdHMpKQorICAgIGZvciBpLCBvZW1fZGljdCBpbiBlbnVtZXJhdGUob2VtX2RpY3RzKToKKyAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJzInLCBvZW1fZGljdFsnZGVmJ10pCisgICAgICBzZWxmLmFzc2VydEVxdWFsKCdmb28nLCBvZW1fZGljdFsneHl6J10pCisgICAgICBzZWxmLmFzc2VydEVxdWFsKCdiYXInLCBvZW1fZGljdFsnYS5iLmMnXSkKKyAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3t9Jy5mb3JtYXQoaSksIG9lbV9kaWN0Wydyby5idWlsZC5pbmRleCddKQorCisKK2NsYXNzIE90YUZyb21UYXJnZXRGaWxlc1Rlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgIFRFU1RfVEFSR0VUX0lORk9fRElDVCA9IHsKKyAgICAgICdidWlsZC5wcm9wJyA6IHsKKyAgICAgICAgICAncm8ucHJvZHVjdC5kZXZpY2UnIDogJ3Byb2R1Y3QtZGV2aWNlJywKKyAgICAgICAgICAncm8uYnVpbGQuZmluZ2VycHJpbnQnIDogJ2J1aWxkLWZpbmdlcnByaW50LXRhcmdldCcsCisgICAgICAgICAgJ3JvLmJ1aWxkLnZlcnNpb24uaW5jcmVtZW50YWwnIDogJ2J1aWxkLXZlcnNpb24taW5jcmVtZW50YWwtdGFyZ2V0JywKKyAgICAgICAgICAncm8uYnVpbGQudmVyc2lvbi5zZGsnIDogJzI3JywKKyAgICAgICAgICAncm8uYnVpbGQudmVyc2lvbi5zZWN1cml0eV9wYXRjaCcgOiAnMjAxNy0xMi0wMScsCisgICAgICAgICAgJ3JvLmJ1aWxkLmRhdGUudXRjJyA6ICcxNTAwMDAwMDAwJywKKyAgICAgIH0sCisgIH0KKworICBURVNUX1NPVVJDRV9JTkZPX0RJQ1QgPSB7CisgICAgICAnYnVpbGQucHJvcCcgOiB7CisgICAgICAgICAgJ3JvLnByb2R1Y3QuZGV2aWNlJyA6ICdwcm9kdWN0LWRldmljZScsCisgICAgICAgICAgJ3JvLmJ1aWxkLmZpbmdlcnByaW50JyA6ICdidWlsZC1maW5nZXJwcmludC1zb3VyY2UnLAorICAgICAgICAgICdyby5idWlsZC52ZXJzaW9uLmluY3JlbWVudGFsJyA6ICdidWlsZC12ZXJzaW9uLWluY3JlbWVudGFsLXNvdXJjZScsCisgICAgICAgICAgJ3JvLmJ1aWxkLnZlcnNpb24uc2RrJyA6ICcyNScsCisgICAgICAgICAgJ3JvLmJ1aWxkLnZlcnNpb24uc2VjdXJpdHlfcGF0Y2gnIDogJzIwMTYtMTItMDEnLAorICAgICAgICAgICdyby5idWlsZC5kYXRlLnV0YycgOiAnMTQwMDAwMDAwMCcsCisgICAgICB9LAorICB9CisKKyAgZGVmIHNldFVwKHNlbGYpOgorICAgIHNlbGYudGVzdGRhdGFfZGlyID0gdGVzdF91dGlscy5nZXRfdGVzdGRhdGFfZGlyKCkKKyAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5leGlzdHMoc2VsZi50ZXN0ZGF0YV9kaXIpKQorCisgICAgIyBSZXNldCB0aGUgZ2xvYmFsIG9wdGlvbnMgYXMgaW4gb3RhX2Zyb21fdGFyZ2V0X2ZpbGVzLnB5LgorICAgIGNvbW1vbi5PUFRJT05TLmluY3JlbWVudGFsX3NvdXJjZSA9IE5vbmUKKyAgICBjb21tb24uT1BUSU9OUy5kb3duZ3JhZGUgPSBGYWxzZQorICAgIGNvbW1vbi5PUFRJT05TLnRpbWVzdGFtcCA9IEZhbHNlCisgICAgY29tbW9uLk9QVElPTlMud2lwZV91c2VyX2RhdGEgPSBGYWxzZQorICAgIGNvbW1vbi5PUFRJT05TLm5vX3NpZ25pbmcgPSBGYWxzZQorICAgIGNvbW1vbi5PUFRJT05TLnBhY2thZ2Vfa2V5ID0gb3MucGF0aC5qb2luKHNlbGYudGVzdGRhdGFfZGlyLCAndGVzdGtleScpCisgICAgY29tbW9uLk9QVElPTlMua2V5X3Bhc3N3b3JkcyA9IHsKKyAgICAgICAgY29tbW9uLk9QVElPTlMucGFja2FnZV9rZXkgOiBOb25lLAorICAgIH0KKworICAgIGNvbW1vbi5PUFRJT05TLnNlYXJjaF9wYXRoID0gdGVzdF91dGlscy5nZXRfc2VhcmNoX3BhdGgoKQorICAgIHNlbGYuYXNzZXJ0SXNOb3ROb25lKGNvbW1vbi5PUFRJT05TLnNlYXJjaF9wYXRoKQorCisgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICBjb21tb24uQ2xlYW51cCgpCisKKyAgZGVmIHRlc3RfR2V0UGFja2FnZU1ldGFkYXRhX2FiT3RhX2Z1bGwoc2VsZik6CisgICAgdGFyZ2V0X2luZm9fZGljdCA9IGNvcHkuZGVlcGNvcHkoc2VsZi5URVNUX1RBUkdFVF9JTkZPX0RJQ1QpCisgICAgdGFyZ2V0X2luZm9fZGljdFsnYWJfdXBkYXRlJ10gPSAndHJ1ZScKKyAgICB0YXJnZXRfaW5mbyA9IEJ1aWxkSW5mbyh0YXJnZXRfaW5mb19kaWN0LCBOb25lKQorICAgIG1ldGFkYXRhID0gR2V0UGFja2FnZU1ldGFkYXRhKHRhcmdldF9pbmZvKQorICAgIHNlbGYuYXNzZXJ0RGljdEVxdWFsKAorICAgICAgICB7CisgICAgICAgICAgICAnb3RhLXR5cGUnIDogJ0FCJywKKyAgICAgICAgICAgICdvdGEtcmVxdWlyZWQtY2FjaGUnIDogJzAnLAorICAgICAgICAgICAgJ3Bvc3QtYnVpbGQnIDogJ2J1aWxkLWZpbmdlcnByaW50LXRhcmdldCcsCisgICAgICAgICAgICAncG9zdC1idWlsZC1pbmNyZW1lbnRhbCcgOiAnYnVpbGQtdmVyc2lvbi1pbmNyZW1lbnRhbC10YXJnZXQnLAorICAgICAgICAgICAgJ3Bvc3Qtc2RrLWxldmVsJyA6ICcyNycsCisgICAgICAgICAgICAncG9zdC1zZWN1cml0eS1wYXRjaC1sZXZlbCcgOiAnMjAxNy0xMi0wMScsCisgICAgICAgICAgICAncG9zdC10aW1lc3RhbXAnIDogJzE1MDAwMDAwMDAnLAorICAgICAgICAgICAgJ3ByZS1kZXZpY2UnIDogJ3Byb2R1Y3QtZGV2aWNlJywKKyAgICAgICAgfSwKKyAgICAgICAgbWV0YWRhdGEpCisKKyAgZGVmIHRlc3RfR2V0UGFja2FnZU1ldGFkYXRhX2FiT3RhX2luY3JlbWVudGFsKHNlbGYpOgorICAgIHRhcmdldF9pbmZvX2RpY3QgPSBjb3B5LmRlZXBjb3B5KHNlbGYuVEVTVF9UQVJHRVRfSU5GT19ESUNUKQorICAgIHRhcmdldF9pbmZvX2RpY3RbJ2FiX3VwZGF0ZSddID0gJ3RydWUnCisgICAgdGFyZ2V0X2luZm8gPSBCdWlsZEluZm8odGFyZ2V0X2luZm9fZGljdCwgTm9uZSkKKyAgICBzb3VyY2VfaW5mbyA9IEJ1aWxkSW5mbyhzZWxmLlRFU1RfU09VUkNFX0lORk9fRElDVCwgTm9uZSkKKyAgICBjb21tb24uT1BUSU9OUy5pbmNyZW1lbnRhbF9zb3VyY2UgPSAnJworICAgIG1ldGFkYXRhID0gR2V0UGFja2FnZU1ldGFkYXRhKHRhcmdldF9pbmZvLCBzb3VyY2VfaW5mbykKKyAgICBzZWxmLmFzc2VydERpY3RFcXVhbCgKKyAgICAgICAgeworICAgICAgICAgICAgJ290YS10eXBlJyA6ICdBQicsCisgICAgICAgICAgICAnb3RhLXJlcXVpcmVkLWNhY2hlJyA6ICcwJywKKyAgICAgICAgICAgICdwb3N0LWJ1aWxkJyA6ICdidWlsZC1maW5nZXJwcmludC10YXJnZXQnLAorICAgICAgICAgICAgJ3Bvc3QtYnVpbGQtaW5jcmVtZW50YWwnIDogJ2J1aWxkLXZlcnNpb24taW5jcmVtZW50YWwtdGFyZ2V0JywKKyAgICAgICAgICAgICdwb3N0LXNkay1sZXZlbCcgOiAnMjcnLAorICAgICAgICAgICAgJ3Bvc3Qtc2VjdXJpdHktcGF0Y2gtbGV2ZWwnIDogJzIwMTctMTItMDEnLAorICAgICAgICAgICAgJ3Bvc3QtdGltZXN0YW1wJyA6ICcxNTAwMDAwMDAwJywKKyAgICAgICAgICAgICdwcmUtZGV2aWNlJyA6ICdwcm9kdWN0LWRldmljZScsCisgICAgICAgICAgICAncHJlLWJ1aWxkJyA6ICdidWlsZC1maW5nZXJwcmludC1zb3VyY2UnLAorICAgICAgICAgICAgJ3ByZS1idWlsZC1pbmNyZW1lbnRhbCcgOiAnYnVpbGQtdmVyc2lvbi1pbmNyZW1lbnRhbC1zb3VyY2UnLAorICAgICAgICB9LAorICAgICAgICBtZXRhZGF0YSkKKworICBkZWYgdGVzdF9HZXRQYWNrYWdlTWV0YWRhdGFfbm9uQWJPdGFfZnVsbChzZWxmKToKKyAgICB0YXJnZXRfaW5mbyA9IEJ1aWxkSW5mbyhzZWxmLlRFU1RfVEFSR0VUX0lORk9fRElDVCwgTm9uZSkKKyAgICBtZXRhZGF0YSA9IEdldFBhY2thZ2VNZXRhZGF0YSh0YXJnZXRfaW5mbykKKyAgICBzZWxmLmFzc2VydERpY3RFcXVhbCgKKyAgICAgICAgeworICAgICAgICAgICAgJ290YS10eXBlJyA6ICdCTE9DSycsCisgICAgICAgICAgICAncG9zdC1idWlsZCcgOiAnYnVpbGQtZmluZ2VycHJpbnQtdGFyZ2V0JywKKyAgICAgICAgICAgICdwb3N0LWJ1aWxkLWluY3JlbWVudGFsJyA6ICdidWlsZC12ZXJzaW9uLWluY3JlbWVudGFsLXRhcmdldCcsCisgICAgICAgICAgICAncG9zdC1zZGstbGV2ZWwnIDogJzI3JywKKyAgICAgICAgICAgICdwb3N0LXNlY3VyaXR5LXBhdGNoLWxldmVsJyA6ICcyMDE3LTEyLTAxJywKKyAgICAgICAgICAgICdwb3N0LXRpbWVzdGFtcCcgOiAnMTUwMDAwMDAwMCcsCisgICAgICAgICAgICAncHJlLWRldmljZScgOiAncHJvZHVjdC1kZXZpY2UnLAorICAgICAgICB9LAorICAgICAgICBtZXRhZGF0YSkKKworICBkZWYgdGVzdF9HZXRQYWNrYWdlTWV0YWRhdGFfbm9uQWJPdGFfaW5jcmVtZW50YWwoc2VsZik6CisgICAgdGFyZ2V0X2luZm8gPSBCdWlsZEluZm8oc2VsZi5URVNUX1RBUkdFVF9JTkZPX0RJQ1QsIE5vbmUpCisgICAgc291cmNlX2luZm8gPSBCdWlsZEluZm8oc2VsZi5URVNUX1NPVVJDRV9JTkZPX0RJQ1QsIE5vbmUpCisgICAgY29tbW9uLk9QVElPTlMuaW5jcmVtZW50YWxfc291cmNlID0gJycKKyAgICBtZXRhZGF0YSA9IEdldFBhY2thZ2VNZXRhZGF0YSh0YXJnZXRfaW5mbywgc291cmNlX2luZm8pCisgICAgc2VsZi5hc3NlcnREaWN0RXF1YWwoCisgICAgICAgIHsKKyAgICAgICAgICAgICdvdGEtdHlwZScgOiAnQkxPQ0snLAorICAgICAgICAgICAgJ3Bvc3QtYnVpbGQnIDogJ2J1aWxkLWZpbmdlcnByaW50LXRhcmdldCcsCisgICAgICAgICAgICAncG9zdC1idWlsZC1pbmNyZW1lbnRhbCcgOiAnYnVpbGQtdmVyc2lvbi1pbmNyZW1lbnRhbC10YXJnZXQnLAorICAgICAgICAgICAgJ3Bvc3Qtc2RrLWxldmVsJyA6ICcyNycsCisgICAgICAgICAgICAncG9zdC1zZWN1cml0eS1wYXRjaC1sZXZlbCcgOiAnMjAxNy0xMi0wMScsCisgICAgICAgICAgICAncG9zdC10aW1lc3RhbXAnIDogJzE1MDAwMDAwMDAnLAorICAgICAgICAgICAgJ3ByZS1kZXZpY2UnIDogJ3Byb2R1Y3QtZGV2aWNlJywKKyAgICAgICAgICAgICdwcmUtYnVpbGQnIDogJ2J1aWxkLWZpbmdlcnByaW50LXNvdXJjZScsCisgICAgICAgICAgICAncHJlLWJ1aWxkLWluY3JlbWVudGFsJyA6ICdidWlsZC12ZXJzaW9uLWluY3JlbWVudGFsLXNvdXJjZScsCisgICAgICAgIH0sCisgICAgICAgIG1ldGFkYXRhKQorCisgIGRlZiB0ZXN0X0dldFBhY2thZ2VNZXRhZGF0YV93aXBlKHNlbGYpOgorICAgIHRhcmdldF9pbmZvID0gQnVpbGRJbmZvKHNlbGYuVEVTVF9UQVJHRVRfSU5GT19ESUNULCBOb25lKQorICAgIGNvbW1vbi5PUFRJT05TLndpcGVfdXNlcl9kYXRhID0gVHJ1ZQorICAgIG1ldGFkYXRhID0gR2V0UGFja2FnZU1ldGFkYXRhKHRhcmdldF9pbmZvKQorICAgIHNlbGYuYXNzZXJ0RGljdEVxdWFsKAorICAgICAgICB7CisgICAgICAgICAgICAnb3RhLXR5cGUnIDogJ0JMT0NLJywKKyAgICAgICAgICAgICdvdGEtd2lwZScgOiAneWVzJywKKyAgICAgICAgICAgICdwb3N0LWJ1aWxkJyA6ICdidWlsZC1maW5nZXJwcmludC10YXJnZXQnLAorICAgICAgICAgICAgJ3Bvc3QtYnVpbGQtaW5jcmVtZW50YWwnIDogJ2J1aWxkLXZlcnNpb24taW5jcmVtZW50YWwtdGFyZ2V0JywKKyAgICAgICAgICAgICdwb3N0LXNkay1sZXZlbCcgOiAnMjcnLAorICAgICAgICAgICAgJ3Bvc3Qtc2VjdXJpdHktcGF0Y2gtbGV2ZWwnIDogJzIwMTctMTItMDEnLAorICAgICAgICAgICAgJ3Bvc3QtdGltZXN0YW1wJyA6ICcxNTAwMDAwMDAwJywKKyAgICAgICAgICAgICdwcmUtZGV2aWNlJyA6ICdwcm9kdWN0LWRldmljZScsCisgICAgICAgIH0sCisgICAgICAgIG1ldGFkYXRhKQorCisgIEBzdGF0aWNtZXRob2QKKyAgZGVmIF90ZXN0X0dldFBhY2thZ2VNZXRhZGF0YV9zd2FwQnVpbGRUaW1lc3RhbXBzKHRhcmdldF9pbmZvLCBzb3VyY2VfaW5mbyk6CisgICAgKHRhcmdldF9pbmZvWydidWlsZC5wcm9wJ11bJ3JvLmJ1aWxkLmRhdGUudXRjJ10sCisgICAgIHNvdXJjZV9pbmZvWydidWlsZC5wcm9wJ11bJ3JvLmJ1aWxkLmRhdGUudXRjJ10pID0gKAorICAgICAgICAgc291cmNlX2luZm9bJ2J1aWxkLnByb3AnXVsncm8uYnVpbGQuZGF0ZS51dGMnXSwKKyAgICAgICAgIHRhcmdldF9pbmZvWydidWlsZC5wcm9wJ11bJ3JvLmJ1aWxkLmRhdGUudXRjJ10pCisKKyAgZGVmIHRlc3RfR2V0UGFja2FnZU1ldGFkYXRhX3VuaW50ZW50aW9uYWxEb3duZ3JhZGVEZXRlY3RlZChzZWxmKToKKyAgICB0YXJnZXRfaW5mb19kaWN0ID0gY29weS5kZWVwY29weShzZWxmLlRFU1RfVEFSR0VUX0lORk9fRElDVCkKKyAgICBzb3VyY2VfaW5mb19kaWN0ID0gY29weS5kZWVwY29weShzZWxmLlRFU1RfU09VUkNFX0lORk9fRElDVCkKKyAgICBzZWxmLl90ZXN0X0dldFBhY2thZ2VNZXRhZGF0YV9zd2FwQnVpbGRUaW1lc3RhbXBzKAorICAgICAgICB0YXJnZXRfaW5mb19kaWN0LCBzb3VyY2VfaW5mb19kaWN0KQorCisgICAgdGFyZ2V0X2luZm8gPSBCdWlsZEluZm8odGFyZ2V0X2luZm9fZGljdCwgTm9uZSkKKyAgICBzb3VyY2VfaW5mbyA9IEJ1aWxkSW5mbyhzb3VyY2VfaW5mb19kaWN0LCBOb25lKQorICAgIGNvbW1vbi5PUFRJT05TLmluY3JlbWVudGFsX3NvdXJjZSA9ICcnCisgICAgc2VsZi5hc3NlcnRSYWlzZXMoUnVudGltZUVycm9yLCBHZXRQYWNrYWdlTWV0YWRhdGEsIHRhcmdldF9pbmZvLAorICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZV9pbmZvKQorCisgIGRlZiB0ZXN0X0dldFBhY2thZ2VNZXRhZGF0YV9kb3duZ3JhZGUoc2VsZik6CisgICAgdGFyZ2V0X2luZm9fZGljdCA9IGNvcHkuZGVlcGNvcHkoc2VsZi5URVNUX1RBUkdFVF9JTkZPX0RJQ1QpCisgICAgc291cmNlX2luZm9fZGljdCA9IGNvcHkuZGVlcGNvcHkoc2VsZi5URVNUX1NPVVJDRV9JTkZPX0RJQ1QpCisgICAgc2VsZi5fdGVzdF9HZXRQYWNrYWdlTWV0YWRhdGFfc3dhcEJ1aWxkVGltZXN0YW1wcygKKyAgICAgICAgdGFyZ2V0X2luZm9fZGljdCwgc291cmNlX2luZm9fZGljdCkKKworICAgIHRhcmdldF9pbmZvID0gQnVpbGRJbmZvKHRhcmdldF9pbmZvX2RpY3QsIE5vbmUpCisgICAgc291cmNlX2luZm8gPSBCdWlsZEluZm8oc291cmNlX2luZm9fZGljdCwgTm9uZSkKKyAgICBjb21tb24uT1BUSU9OUy5pbmNyZW1lbnRhbF9zb3VyY2UgPSAnJworICAgIGNvbW1vbi5PUFRJT05TLmRvd25ncmFkZSA9IFRydWUKKyAgICBjb21tb24uT1BUSU9OUy53aXBlX3VzZXJfZGF0YSA9IFRydWUKKyAgICBtZXRhZGF0YSA9IEdldFBhY2thZ2VNZXRhZGF0YSh0YXJnZXRfaW5mbywgc291cmNlX2luZm8pCisgICAgc2VsZi5hc3NlcnREaWN0RXF1YWwoCisgICAgICAgIHsKKyAgICAgICAgICAgICdvdGEtZG93bmdyYWRlJyA6ICd5ZXMnLAorICAgICAgICAgICAgJ290YS10eXBlJyA6ICdCTE9DSycsCisgICAgICAgICAgICAnb3RhLXdpcGUnIDogJ3llcycsCisgICAgICAgICAgICAncG9zdC1idWlsZCcgOiAnYnVpbGQtZmluZ2VycHJpbnQtdGFyZ2V0JywKKyAgICAgICAgICAgICdwb3N0LWJ1aWxkLWluY3JlbWVudGFsJyA6ICdidWlsZC12ZXJzaW9uLWluY3JlbWVudGFsLXRhcmdldCcsCisgICAgICAgICAgICAncG9zdC1zZGstbGV2ZWwnIDogJzI3JywKKyAgICAgICAgICAgICdwb3N0LXNlY3VyaXR5LXBhdGNoLWxldmVsJyA6ICcyMDE3LTEyLTAxJywKKyAgICAgICAgICAgICdwb3N0LXRpbWVzdGFtcCcgOiAnMTQwMDAwMDAwMCcsCisgICAgICAgICAgICAncHJlLWRldmljZScgOiAncHJvZHVjdC1kZXZpY2UnLAorICAgICAgICAgICAgJ3ByZS1idWlsZCcgOiAnYnVpbGQtZmluZ2VycHJpbnQtc291cmNlJywKKyAgICAgICAgICAgICdwcmUtYnVpbGQtaW5jcmVtZW50YWwnIDogJ2J1aWxkLXZlcnNpb24taW5jcmVtZW50YWwtc291cmNlJywKKyAgICAgICAgfSwKKyAgICAgICAgbWV0YWRhdGEpCisKKyAgZGVmIHRlc3RfR2V0VGFyZ2V0RmlsZXNaaXBGb3JTZWNvbmRhcnlJbWFnZXMoc2VsZik6CisgICAgaW5wdXRfZmlsZSA9IGNvbnN0cnVjdF90YXJnZXRfZmlsZXMoc2Vjb25kYXJ5PVRydWUpCisgICAgdGFyZ2V0X2ZpbGUgPSBHZXRUYXJnZXRGaWxlc1ppcEZvclNlY29uZGFyeUltYWdlcyhpbnB1dF9maWxlKQorCisgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUodGFyZ2V0X2ZpbGUpIGFzIHZlcmlmeV96aXA6CisgICAgICBuYW1lbGlzdCA9IHZlcmlmeV96aXAubmFtZWxpc3QoKQorCisgICAgc2VsZi5hc3NlcnRJbignTUVUQS9hYl9wYXJ0aXRpb25zLnR4dCcsIG5hbWVsaXN0KQorICAgIHNlbGYuYXNzZXJ0SW4oJ0lNQUdFUy9ib290LmltZycsIG5hbWVsaXN0KQorICAgIHNlbGYuYXNzZXJ0SW4oJ0lNQUdFUy9zeXN0ZW0uaW1nJywgbmFtZWxpc3QpCisgICAgc2VsZi5hc3NlcnRJbignSU1BR0VTL3ZlbmRvci5pbWcnLCBuYW1lbGlzdCkKKyAgICBzZWxmLmFzc2VydEluKFBPU1RJTlNUQUxMX0NPTkZJRywgbmFtZWxpc3QpCisKKyAgICBzZWxmLmFzc2VydE5vdEluKCdJTUFHRVMvc3lzdGVtX290aGVyLmltZycsIG5hbWVsaXN0KQorICAgIHNlbGYuYXNzZXJ0Tm90SW4oJ0lNQUdFUy9zeXN0ZW0ubWFwJywgbmFtZWxpc3QpCisKKyAgZGVmIHRlc3RfR2V0VGFyZ2V0RmlsZXNaaXBGb3JTZWNvbmRhcnlJbWFnZXNfc2tpcFBvc3RpbnN0YWxsKHNlbGYpOgorICAgIGlucHV0X2ZpbGUgPSBjb25zdHJ1Y3RfdGFyZ2V0X2ZpbGVzKHNlY29uZGFyeT1UcnVlKQorICAgIHRhcmdldF9maWxlID0gR2V0VGFyZ2V0RmlsZXNaaXBGb3JTZWNvbmRhcnlJbWFnZXMoCisgICAgICAgIGlucHV0X2ZpbGUsIHNraXBfcG9zdGluc3RhbGw9VHJ1ZSkKKworICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKHRhcmdldF9maWxlKSBhcyB2ZXJpZnlfemlwOgorICAgICAgbmFtZWxpc3QgPSB2ZXJpZnlfemlwLm5hbWVsaXN0KCkKKworICAgIHNlbGYuYXNzZXJ0SW4oJ01FVEEvYWJfcGFydGl0aW9ucy50eHQnLCBuYW1lbGlzdCkKKyAgICBzZWxmLmFzc2VydEluKCdJTUFHRVMvYm9vdC5pbWcnLCBuYW1lbGlzdCkKKyAgICBzZWxmLmFzc2VydEluKCdJTUFHRVMvc3lzdGVtLmltZycsIG5hbWVsaXN0KQorICAgIHNlbGYuYXNzZXJ0SW4oJ0lNQUdFUy92ZW5kb3IuaW1nJywgbmFtZWxpc3QpCisKKyAgICBzZWxmLmFzc2VydE5vdEluKCdJTUFHRVMvc3lzdGVtX290aGVyLmltZycsIG5hbWVsaXN0KQorICAgIHNlbGYuYXNzZXJ0Tm90SW4oJ0lNQUdFUy9zeXN0ZW0ubWFwJywgbmFtZWxpc3QpCisgICAgc2VsZi5hc3NlcnROb3RJbihQT1NUSU5TVEFMTF9DT05GSUcsIG5hbWVsaXN0KQorCisgIGRlZiB0ZXN0X0dldFRhcmdldEZpbGVzWmlwV2l0aG91dFBvc3RpbnN0YWxsQ29uZmlnKHNlbGYpOgorICAgIGlucHV0X2ZpbGUgPSBjb25zdHJ1Y3RfdGFyZ2V0X2ZpbGVzKCkKKyAgICB0YXJnZXRfZmlsZSA9IEdldFRhcmdldEZpbGVzWmlwV2l0aG91dFBvc3RpbnN0YWxsQ29uZmlnKGlucHV0X2ZpbGUpCisgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUodGFyZ2V0X2ZpbGUpIGFzIHZlcmlmeV96aXA6CisgICAgICBzZWxmLmFzc2VydE5vdEluKFBPU1RJTlNUQUxMX0NPTkZJRywgdmVyaWZ5X3ppcC5uYW1lbGlzdCgpKQorCisgIGRlZiB0ZXN0X0dldFRhcmdldEZpbGVzWmlwV2l0aG91dFBvc3RpbnN0YWxsQ29uZmlnX21pc3NpbmdFbnRyeShzZWxmKToKKyAgICBpbnB1dF9maWxlID0gY29uc3RydWN0X3RhcmdldF9maWxlcygpCisgICAgY29tbW9uLlppcERlbGV0ZShpbnB1dF9maWxlLCBQT1NUSU5TVEFMTF9DT05GSUcpCisgICAgdGFyZ2V0X2ZpbGUgPSBHZXRUYXJnZXRGaWxlc1ppcFdpdGhvdXRQb3N0aW5zdGFsbENvbmZpZyhpbnB1dF9maWxlKQorICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKHRhcmdldF9maWxlKSBhcyB2ZXJpZnlfemlwOgorICAgICAgc2VsZi5hc3NlcnROb3RJbihQT1NUSU5TVEFMTF9DT05GSUcsIHZlcmlmeV96aXAubmFtZWxpc3QoKSkKKworICBkZWYgX3Rlc3RfRmluYWxpemVNZXRhZGF0YShzZWxmLCBsYXJnZV9lbnRyeT1GYWxzZSk6CisgICAgZW50cmllcyA9IFsKKyAgICAgICAgJ3JlcXVpcmVkLWVudHJ5MScsCisgICAgICAgICdyZXF1aXJlZC1lbnRyeTInLAorICAgIF0KKyAgICB6aXBfZmlsZSA9IFByb3BlcnR5RmlsZXNUZXN0LmNvbnN0cnVjdF96aXBfcGFja2FnZShlbnRyaWVzKQorICAgICMgQWRkIGEgbGFyZ2UgZW50cnkgb2YgMSBHaUIgaWYgcmVxdWVzdGVkLgorICAgIGlmIGxhcmdlX2VudHJ5OgorICAgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoemlwX2ZpbGUsICdhJykgYXMgemlwX2ZwOgorICAgICAgICB6aXBfZnAud3JpdGVzdHIoCisgICAgICAgICAgICAjIFVzaW5nICd6b28nIHNvIHRoYXQgdGhlIGVudHJ5IHN0YXlzIGJlaGluZCBvdGhlcnMgYWZ0ZXIgc2lnbmluZy4KKyAgICAgICAgICAgICd6b28nLAorICAgICAgICAgICAgJ0EnICogMTAyNCAqIDEwMjQgKiAxMDI0LAorICAgICAgICAgICAgemlwZmlsZS5aSVBfU1RPUkVEKQorCisgICAgbWV0YWRhdGEgPSB7fQorICAgIG91dHB1dF9maWxlID0gY29tbW9uLk1ha2VUZW1wRmlsZShzdWZmaXg9Jy56aXAnKQorICAgIG5lZWRlZF9wcm9wZXJ0eV9maWxlcyA9ICgKKyAgICAgICAgVGVzdFByb3BlcnR5RmlsZXMoKSwKKyAgICApCisgICAgRmluYWxpemVNZXRhZGF0YShtZXRhZGF0YSwgemlwX2ZpbGUsIG91dHB1dF9maWxlLCBuZWVkZWRfcHJvcGVydHlfZmlsZXMpCisgICAgc2VsZi5hc3NlcnRJbignb3RhLXRlc3QtcHJvcGVydHktZmlsZXMnLCBtZXRhZGF0YSkKKworICBkZWYgdGVzdF9GaW5hbGl6ZU1ldGFkYXRhKHNlbGYpOgorICAgIHNlbGYuX3Rlc3RfRmluYWxpemVNZXRhZGF0YSgpCisKKyAgZGVmIHRlc3RfRmluYWxpemVNZXRhZGF0YV93aXRoTm9TaWduaW5nKHNlbGYpOgorICAgIGNvbW1vbi5PUFRJT05TLm5vX3NpZ25pbmcgPSBUcnVlCisgICAgc2VsZi5fdGVzdF9GaW5hbGl6ZU1ldGFkYXRhKCkKKworICBkZWYgdGVzdF9GaW5hbGl6ZU1ldGFkYXRhX2xhcmdlRW50cnkoc2VsZik6CisgICAgc2VsZi5fdGVzdF9GaW5hbGl6ZU1ldGFkYXRhKGxhcmdlX2VudHJ5PVRydWUpCisKKyAgZGVmIHRlc3RfRmluYWxpemVNZXRhZGF0YV9sYXJnZUVudHJ5X3dpdGhOb1NpZ25pbmcoc2VsZik6CisgICAgY29tbW9uLk9QVElPTlMubm9fc2lnbmluZyA9IFRydWUKKyAgICBzZWxmLl90ZXN0X0ZpbmFsaXplTWV0YWRhdGEobGFyZ2VfZW50cnk9VHJ1ZSkKKworICBkZWYgdGVzdF9GaW5hbGl6ZU1ldGFkYXRhX2luc3VmZmljaWVudFNwYWNlKHNlbGYpOgorICAgIGVudHJpZXMgPSBbCisgICAgICAgICdyZXF1aXJlZC1lbnRyeTEnLAorICAgICAgICAncmVxdWlyZWQtZW50cnkyJywKKyAgICAgICAgJ29wdGlvbmFsLWVudHJ5MScsCisgICAgICAgICdvcHRpb25hbC1lbnRyeTInLAorICAgIF0KKyAgICB6aXBfZmlsZSA9IFByb3BlcnR5RmlsZXNUZXN0LmNvbnN0cnVjdF96aXBfcGFja2FnZShlbnRyaWVzKQorICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKHppcF9maWxlLCAnYScpIGFzIHppcF9mcDoKKyAgICAgIHppcF9mcC53cml0ZXN0cigKKyAgICAgICAgICAjICdmb28tZW50cnkxJyB3aWxsIGFwcGVhciBhaGVhZCBvZiBhbGwgb3RoZXIgZW50cmllcyAoaW4gYWxwaGFiZXRpY2FsCisgICAgICAgICAgIyBvcmRlcikgYWZ0ZXIgdGhlIHNpZ25pbmcsIHdoaWNoIHdpbGwgaW4gdHVybiB0cmlnZ2VyIHRoZQorICAgICAgICAgICMgSW5zdWZmaWNpZW50U3BhY2VFeGNlcHRpb24gYW5kIGFuIGF1dG9tYXRpYyByZXRyeS4KKyAgICAgICAgICAnZm9vLWVudHJ5MScsCisgICAgICAgICAgJ0EnICogMTAyNCAqIDEwMjQsCisgICAgICAgICAgemlwZmlsZS5aSVBfU1RPUkVEKQorCisgICAgbWV0YWRhdGEgPSB7fQorICAgIG5lZWRlZF9wcm9wZXJ0eV9maWxlcyA9ICgKKyAgICAgICAgVGVzdFByb3BlcnR5RmlsZXMoKSwKKyAgICApCisgICAgb3V0cHV0X2ZpbGUgPSBjb21tb24uTWFrZVRlbXBGaWxlKHN1ZmZpeD0nLnppcCcpCisgICAgRmluYWxpemVNZXRhZGF0YShtZXRhZGF0YSwgemlwX2ZpbGUsIG91dHB1dF9maWxlLCBuZWVkZWRfcHJvcGVydHlfZmlsZXMpCisgICAgc2VsZi5hc3NlcnRJbignb3RhLXRlc3QtcHJvcGVydHktZmlsZXMnLCBtZXRhZGF0YSkKKworCitjbGFzcyBUZXN0UHJvcGVydHlGaWxlcyhQcm9wZXJ0eUZpbGVzKToKKyAgIiIiQSBjbGFzcyB0aGF0IGV4dGVuZHMgUHJvcGVydHlGaWxlcyBmb3IgdGVzdGluZyBwdXJwb3NlLiIiIgorCisgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICBzdXBlcihUZXN0UHJvcGVydHlGaWxlcywgc2VsZikuX19pbml0X18oKQorICAgIHNlbGYubmFtZSA9ICdvdGEtdGVzdC1wcm9wZXJ0eS1maWxlcycKKyAgICBzZWxmLnJlcXVpcmVkID0gKAorICAgICAgICAncmVxdWlyZWQtZW50cnkxJywKKyAgICAgICAgJ3JlcXVpcmVkLWVudHJ5MicsCisgICAgKQorICAgIHNlbGYub3B0aW9uYWwgPSAoCisgICAgICAgICdvcHRpb25hbC1lbnRyeTEnLAorICAgICAgICAnb3B0aW9uYWwtZW50cnkyJywKKyAgICApCisKKworY2xhc3MgUHJvcGVydHlGaWxlc1Rlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgIGRlZiBzZXRVcChzZWxmKToKKyAgICBjb21tb24uT1BUSU9OUy5ub19zaWduaW5nID0gRmFsc2UKKworICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgY29tbW9uLkNsZWFudXAoKQorCisgIEBzdGF0aWNtZXRob2QKKyAgZGVmIGNvbnN0cnVjdF96aXBfcGFja2FnZShlbnRyaWVzKToKKyAgICB6aXBfZmlsZSA9IGNvbW1vbi5NYWtlVGVtcEZpbGUoc3VmZml4PScuemlwJykKKyAgICB3aXRoIHppcGZpbGUuWmlwRmlsZSh6aXBfZmlsZSwgJ3cnKSBhcyB6aXBfZnA6CisgICAgICBmb3IgZW50cnkgaW4gZW50cmllczoKKyAgICAgICAgemlwX2ZwLndyaXRlc3RyKAorICAgICAgICAgICAgZW50cnksCisgICAgICAgICAgICBlbnRyeS5yZXBsYWNlKCcuJywgJy0nKS51cHBlcigpLAorICAgICAgICAgICAgemlwZmlsZS5aSVBfU1RPUkVEKQorICAgIHJldHVybiB6aXBfZmlsZQorCisgIEBzdGF0aWNtZXRob2QKKyAgZGVmIF9wYXJzZV9wcm9wZXJ0eV9maWxlc19zdHJpbmcoZGF0YSk6CisgICAgcmVzdWx0ID0ge30KKyAgICBmb3IgdG9rZW4gaW4gZGF0YS5zcGxpdCgnLCcpOgorICAgICAgbmFtZSwgaW5mbyA9IHRva2VuLnNwbGl0KCc6JywgMSkKKyAgICAgIHJlc3VsdFtuYW1lXSA9IGluZm8KKyAgICByZXR1cm4gcmVzdWx0CisKKyAgZGVmIF92ZXJpZnlfZW50cmllcyhzZWxmLCBpbnB1dF9maWxlLCB0b2tlbnMsIGVudHJpZXMpOgorICAgIGZvciBlbnRyeSBpbiBlbnRyaWVzOgorICAgICAgb2Zmc2V0LCBzaXplID0gbWFwKGludCwgdG9rZW5zW2VudHJ5XS5zcGxpdCgnOicpKQorICAgICAgd2l0aCBvcGVuKGlucHV0X2ZpbGUsICdyYicpIGFzIGlucHV0X2ZwOgorICAgICAgICBpbnB1dF9mcC5zZWVrKG9mZnNldCkKKyAgICAgICAgaWYgZW50cnkgPT0gJ21ldGFkYXRhJzoKKyAgICAgICAgICBleHBlY3RlZCA9IGInTUVUQS1JTkYvQ09NL0FORFJPSUQvTUVUQURBVEEnCisgICAgICAgIGVsc2U6CisgICAgICAgICAgZXhwZWN0ZWQgPSBlbnRyeS5yZXBsYWNlKCcuJywgJy0nKS51cHBlcigpLmVuY29kZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwZWN0ZWQsIGlucHV0X2ZwLnJlYWQoc2l6ZSkpCisKKyAgZGVmIHRlc3RfQ29tcHV0ZShzZWxmKToKKyAgICBlbnRyaWVzID0gKAorICAgICAgICAncmVxdWlyZWQtZW50cnkxJywKKyAgICAgICAgJ3JlcXVpcmVkLWVudHJ5MicsCisgICAgKQorICAgIHppcF9maWxlID0gc2VsZi5jb25zdHJ1Y3RfemlwX3BhY2thZ2UoZW50cmllcykKKyAgICBwcm9wZXJ0eV9maWxlcyA9IFRlc3RQcm9wZXJ0eUZpbGVzKCkKKyAgICB3aXRoIHppcGZpbGUuWmlwRmlsZSh6aXBfZmlsZSwgJ3InKSBhcyB6aXBfZnA6CisgICAgICBwcm9wZXJ0eV9maWxlc19zdHJpbmcgPSBwcm9wZXJ0eV9maWxlcy5Db21wdXRlKHppcF9mcCkKKworICAgIHRva2VucyA9IHNlbGYuX3BhcnNlX3Byb3BlcnR5X2ZpbGVzX3N0cmluZyhwcm9wZXJ0eV9maWxlc19zdHJpbmcpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgzLCBsZW4odG9rZW5zKSkKKyAgICBzZWxmLl92ZXJpZnlfZW50cmllcyh6aXBfZmlsZSwgdG9rZW5zLCBlbnRyaWVzKQorCisgIGRlZiB0ZXN0X0NvbXB1dGVfd2l0aE9wdGlvbmFsRW50cmllcyhzZWxmKToKKyAgICBlbnRyaWVzID0gKAorICAgICAgICAncmVxdWlyZWQtZW50cnkxJywKKyAgICAgICAgJ3JlcXVpcmVkLWVudHJ5MicsCisgICAgICAgICdvcHRpb25hbC1lbnRyeTEnLAorICAgICAgICAnb3B0aW9uYWwtZW50cnkyJywKKyAgICApCisgICAgemlwX2ZpbGUgPSBzZWxmLmNvbnN0cnVjdF96aXBfcGFja2FnZShlbnRyaWVzKQorICAgIHByb3BlcnR5X2ZpbGVzID0gVGVzdFByb3BlcnR5RmlsZXMoKQorICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKHppcF9maWxlLCAncicpIGFzIHppcF9mcDoKKyAgICAgIHByb3BlcnR5X2ZpbGVzX3N0cmluZyA9IHByb3BlcnR5X2ZpbGVzLkNvbXB1dGUoemlwX2ZwKQorCisgICAgdG9rZW5zID0gc2VsZi5fcGFyc2VfcHJvcGVydHlfZmlsZXNfc3RyaW5nKHByb3BlcnR5X2ZpbGVzX3N0cmluZykKKyAgICBzZWxmLmFzc2VydEVxdWFsKDUsIGxlbih0b2tlbnMpKQorICAgIHNlbGYuX3ZlcmlmeV9lbnRyaWVzKHppcF9maWxlLCB0b2tlbnMsIGVudHJpZXMpCisKKyAgZGVmIHRlc3RfQ29tcHV0ZV9taXNzaW5nUmVxdWlyZWRFbnRyeShzZWxmKToKKyAgICBlbnRyaWVzID0gKAorICAgICAgICAncmVxdWlyZWQtZW50cnkyJywKKyAgICApCisgICAgemlwX2ZpbGUgPSBzZWxmLmNvbnN0cnVjdF96aXBfcGFja2FnZShlbnRyaWVzKQorICAgIHByb3BlcnR5X2ZpbGVzID0gVGVzdFByb3BlcnR5RmlsZXMoKQorICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKHppcF9maWxlLCAncicpIGFzIHppcF9mcDoKKyAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yLCBwcm9wZXJ0eV9maWxlcy5Db21wdXRlLCB6aXBfZnApCisKKyAgZGVmIHRlc3RfRmluYWxpemUoc2VsZik6CisgICAgZW50cmllcyA9IFsKKyAgICAgICAgJ3JlcXVpcmVkLWVudHJ5MScsCisgICAgICAgICdyZXF1aXJlZC1lbnRyeTInLAorICAgICAgICAnTUVUQS1JTkYvY29tL2FuZHJvaWQvbWV0YWRhdGEnLAorICAgIF0KKyAgICB6aXBfZmlsZSA9IHNlbGYuY29uc3RydWN0X3ppcF9wYWNrYWdlKGVudHJpZXMpCisgICAgcHJvcGVydHlfZmlsZXMgPSBUZXN0UHJvcGVydHlGaWxlcygpCisgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoemlwX2ZpbGUsICdyJykgYXMgemlwX2ZwOgorICAgICAgIyBweWxpbnQ6IGRpc2FibGU9cHJvdGVjdGVkLWFjY2VzcworICAgICAgcmF3X21ldGFkYXRhID0gcHJvcGVydHlfZmlsZXMuX0dldFByb3BlcnR5RmlsZXNTdHJpbmcoCisgICAgICAgICAgemlwX2ZwLCByZXNlcnZlX3NwYWNlPUZhbHNlKQorICAgICAgc3RyZWFtaW5nX21ldGFkYXRhID0gcHJvcGVydHlfZmlsZXMuRmluYWxpemUoemlwX2ZwLCBsZW4ocmF3X21ldGFkYXRhKSkKKyAgICB0b2tlbnMgPSBzZWxmLl9wYXJzZV9wcm9wZXJ0eV9maWxlc19zdHJpbmcoc3RyZWFtaW5nX21ldGFkYXRhKQorCisgICAgc2VsZi5hc3NlcnRFcXVhbCgzLCBsZW4odG9rZW5zKSkKKyAgICAjICdNRVRBLUlORi9jb20vYW5kcm9pZC9tZXRhZGF0YScgd2lsbCBiZSBrZXknZCBhcyAnbWV0YWRhdGEnIGluIHRoZQorICAgICMgc3RyZWFtaW5nIG1ldGFkYXRhLgorICAgIGVudHJpZXNbMl0gPSAnbWV0YWRhdGEnCisgICAgc2VsZi5fdmVyaWZ5X2VudHJpZXMoemlwX2ZpbGUsIHRva2VucywgZW50cmllcykKKworICBkZWYgdGVzdF9GaW5hbGl6ZV9hc3NlcnRSZXNlcnZlZExlbmd0aChzZWxmKToKKyAgICBlbnRyaWVzID0gKAorICAgICAgICAncmVxdWlyZWQtZW50cnkxJywKKyAgICAgICAgJ3JlcXVpcmVkLWVudHJ5MicsCisgICAgICAgICdvcHRpb25hbC1lbnRyeTEnLAorICAgICAgICAnb3B0aW9uYWwtZW50cnkyJywKKyAgICAgICAgJ01FVEEtSU5GL2NvbS9hbmRyb2lkL21ldGFkYXRhJywKKyAgICApCisgICAgemlwX2ZpbGUgPSBzZWxmLmNvbnN0cnVjdF96aXBfcGFja2FnZShlbnRyaWVzKQorICAgIHByb3BlcnR5X2ZpbGVzID0gVGVzdFByb3BlcnR5RmlsZXMoKQorICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKHppcF9maWxlLCAncicpIGFzIHppcF9mcDoKKyAgICAgICMgRmlyc3QgZ2V0IHRoZSByYXcgbWV0YWRhdGEgc3RyaW5nIChpLmUuIHdpdGhvdXQgcGFkZGluZyBzcGFjZSkuCisgICAgICAjIHB5bGludDogZGlzYWJsZT1wcm90ZWN0ZWQtYWNjZXNzCisgICAgICByYXdfbWV0YWRhdGEgPSBwcm9wZXJ0eV9maWxlcy5fR2V0UHJvcGVydHlGaWxlc1N0cmluZygKKyAgICAgICAgICB6aXBfZnAsIHJlc2VydmVfc3BhY2U9RmFsc2UpCisgICAgICByYXdfbGVuZ3RoID0gbGVuKHJhd19tZXRhZGF0YSkKKworICAgICAgIyBOb3cgcGFzcyBpbiB0aGUgZXhhY3QgZXhwZWN0ZWQgbGVuZ3RoLgorICAgICAgc3RyZWFtaW5nX21ldGFkYXRhID0gcHJvcGVydHlfZmlsZXMuRmluYWxpemUoemlwX2ZwLCByYXdfbGVuZ3RoKQorICAgICAgc2VsZi5hc3NlcnRFcXVhbChyYXdfbGVuZ3RoLCBsZW4oc3RyZWFtaW5nX21ldGFkYXRhKSkKKworICAgICAgIyBPciBwYXNzIGluIGluc3VmZmljaWVudCBsZW5ndGguCisgICAgICBzZWxmLmFzc2VydFJhaXNlcygKKyAgICAgICAgICBQcm9wZXJ0eUZpbGVzLkluc3VmZmljaWVudFNwYWNlRXhjZXB0aW9uLAorICAgICAgICAgIHByb3BlcnR5X2ZpbGVzLkZpbmFsaXplLAorICAgICAgICAgIHppcF9mcCwKKyAgICAgICAgICByYXdfbGVuZ3RoIC0gMSkKKworICAgICAgIyBPciBwYXNzIGluIGEgbXVjaCBsYXJnZXIgc2l6ZS4KKyAgICAgIHN0cmVhbWluZ19tZXRhZGF0YSA9IHByb3BlcnR5X2ZpbGVzLkZpbmFsaXplKAorICAgICAgICAgIHppcF9mcCwKKyAgICAgICAgICByYXdfbGVuZ3RoICsgMjApCisgICAgICBzZWxmLmFzc2VydEVxdWFsKHJhd19sZW5ndGggKyAyMCwgbGVuKHN0cmVhbWluZ19tZXRhZGF0YSkpCisgICAgICBzZWxmLmFzc2VydEVxdWFsKCcgJyAqIDIwLCBzdHJlYW1pbmdfbWV0YWRhdGFbcmF3X2xlbmd0aDpdKQorCisgIGRlZiB0ZXN0X1ZlcmlmeShzZWxmKToKKyAgICBlbnRyaWVzID0gKAorICAgICAgICAncmVxdWlyZWQtZW50cnkxJywKKyAgICAgICAgJ3JlcXVpcmVkLWVudHJ5MicsCisgICAgICAgICdvcHRpb25hbC1lbnRyeTEnLAorICAgICAgICAnb3B0aW9uYWwtZW50cnkyJywKKyAgICAgICAgJ01FVEEtSU5GL2NvbS9hbmRyb2lkL21ldGFkYXRhJywKKyAgICApCisgICAgemlwX2ZpbGUgPSBzZWxmLmNvbnN0cnVjdF96aXBfcGFja2FnZShlbnRyaWVzKQorICAgIHByb3BlcnR5X2ZpbGVzID0gVGVzdFByb3BlcnR5RmlsZXMoKQorICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKHppcF9maWxlLCAncicpIGFzIHppcF9mcDoKKyAgICAgICMgRmlyc3QgZ2V0IHRoZSByYXcgbWV0YWRhdGEgc3RyaW5nIChpLmUuIHdpdGhvdXQgcGFkZGluZyBzcGFjZSkuCisgICAgICAjIHB5bGludDogZGlzYWJsZT1wcm90ZWN0ZWQtYWNjZXNzCisgICAgICByYXdfbWV0YWRhdGEgPSBwcm9wZXJ0eV9maWxlcy5fR2V0UHJvcGVydHlGaWxlc1N0cmluZygKKyAgICAgICAgICB6aXBfZnAsIHJlc2VydmVfc3BhY2U9RmFsc2UpCisKKyAgICAgICMgU2hvdWxkIHBhc3MgdGhlIHRlc3QgaWYgdmVyaWZpY2F0aW9uIHBhc3Nlcy4KKyAgICAgIHByb3BlcnR5X2ZpbGVzLlZlcmlmeSh6aXBfZnAsIHJhd19tZXRhZGF0YSkKKworICAgICAgIyBPciByYWlzZSBvbiB2ZXJpZmljYXRpb24gZmFpbHVyZS4KKyAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKAorICAgICAgICAgIEFzc2VydGlvbkVycm9yLCBwcm9wZXJ0eV9maWxlcy5WZXJpZnksIHppcF9mcCwgcmF3X21ldGFkYXRhICsgJ3gnKQorCisKK2NsYXNzIFN0cmVhbWluZ1Byb3BlcnR5RmlsZXNUZXN0KFByb3BlcnR5RmlsZXNUZXN0KToKKyAgIiIiQWRkaXRpb25hbCBzYW5pdHkgY2hlY2tzIHNwZWNpYWxpemVkIGZvciBTdHJlYW1pbmdQcm9wZXJ0eUZpbGVzLiIiIgorCisgIGRlZiB0ZXN0X2luaXQoc2VsZik6CisgICAgcHJvcGVydHlfZmlsZXMgPSBTdHJlYW1pbmdQcm9wZXJ0eUZpbGVzKCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKCdvdGEtc3RyZWFtaW5nLXByb3BlcnR5LWZpbGVzJywgcHJvcGVydHlfZmlsZXMubmFtZSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAoCisgICAgICAgICAgICAncGF5bG9hZC5iaW4nLAorICAgICAgICAgICAgJ3BheWxvYWRfcHJvcGVydGllcy50eHQnLAorICAgICAgICApLAorICAgICAgICBwcm9wZXJ0eV9maWxlcy5yZXF1aXJlZCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAoCisgICAgICAgICAgICAnY2FyZV9tYXAudHh0JywKKyAgICAgICAgICAgICdjb21wYXRpYmlsaXR5LnppcCcsCisgICAgICAgICksCisgICAgICAgIHByb3BlcnR5X2ZpbGVzLm9wdGlvbmFsKQorCisgIGRlZiB0ZXN0X0NvbXB1dGUoc2VsZik6CisgICAgZW50cmllcyA9ICgKKyAgICAgICAgJ3BheWxvYWQuYmluJywKKyAgICAgICAgJ3BheWxvYWRfcHJvcGVydGllcy50eHQnLAorICAgICAgICAnY2FyZV9tYXAudHh0JywKKyAgICAgICAgJ2NvbXBhdGliaWxpdHkuemlwJywKKyAgICApCisgICAgemlwX2ZpbGUgPSBzZWxmLmNvbnN0cnVjdF96aXBfcGFja2FnZShlbnRyaWVzKQorICAgIHByb3BlcnR5X2ZpbGVzID0gU3RyZWFtaW5nUHJvcGVydHlGaWxlcygpCisgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoemlwX2ZpbGUsICdyJykgYXMgemlwX2ZwOgorICAgICAgcHJvcGVydHlfZmlsZXNfc3RyaW5nID0gcHJvcGVydHlfZmlsZXMuQ29tcHV0ZSh6aXBfZnApCisKKyAgICB0b2tlbnMgPSBzZWxmLl9wYXJzZV9wcm9wZXJ0eV9maWxlc19zdHJpbmcocHJvcGVydHlfZmlsZXNfc3RyaW5nKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoNSwgbGVuKHRva2VucykpCisgICAgc2VsZi5fdmVyaWZ5X2VudHJpZXMoemlwX2ZpbGUsIHRva2VucywgZW50cmllcykKKworICBkZWYgdGVzdF9GaW5hbGl6ZShzZWxmKToKKyAgICBlbnRyaWVzID0gWworICAgICAgICAncGF5bG9hZC5iaW4nLAorICAgICAgICAncGF5bG9hZF9wcm9wZXJ0aWVzLnR4dCcsCisgICAgICAgICdjYXJlX21hcC50eHQnLAorICAgICAgICAnY29tcGF0aWJpbGl0eS56aXAnLAorICAgICAgICAnTUVUQS1JTkYvY29tL2FuZHJvaWQvbWV0YWRhdGEnLAorICAgIF0KKyAgICB6aXBfZmlsZSA9IHNlbGYuY29uc3RydWN0X3ppcF9wYWNrYWdlKGVudHJpZXMpCisgICAgcHJvcGVydHlfZmlsZXMgPSBTdHJlYW1pbmdQcm9wZXJ0eUZpbGVzKCkKKyAgICB3aXRoIHppcGZpbGUuWmlwRmlsZSh6aXBfZmlsZSwgJ3InKSBhcyB6aXBfZnA6CisgICAgICAjIHB5bGludDogZGlzYWJsZT1wcm90ZWN0ZWQtYWNjZXNzCisgICAgICByYXdfbWV0YWRhdGEgPSBwcm9wZXJ0eV9maWxlcy5fR2V0UHJvcGVydHlGaWxlc1N0cmluZygKKyAgICAgICAgICB6aXBfZnAsIHJlc2VydmVfc3BhY2U9RmFsc2UpCisgICAgICBzdHJlYW1pbmdfbWV0YWRhdGEgPSBwcm9wZXJ0eV9maWxlcy5GaW5hbGl6ZSh6aXBfZnAsIGxlbihyYXdfbWV0YWRhdGEpKQorICAgIHRva2VucyA9IHNlbGYuX3BhcnNlX3Byb3BlcnR5X2ZpbGVzX3N0cmluZyhzdHJlYW1pbmdfbWV0YWRhdGEpCisKKyAgICBzZWxmLmFzc2VydEVxdWFsKDUsIGxlbih0b2tlbnMpKQorICAgICMgJ01FVEEtSU5GL2NvbS9hbmRyb2lkL21ldGFkYXRhJyB3aWxsIGJlIGtleSdkIGFzICdtZXRhZGF0YScgaW4gdGhlCisgICAgIyBzdHJlYW1pbmcgbWV0YWRhdGEuCisgICAgZW50cmllc1s0XSA9ICdtZXRhZGF0YScKKyAgICBzZWxmLl92ZXJpZnlfZW50cmllcyh6aXBfZmlsZSwgdG9rZW5zLCBlbnRyaWVzKQorCisgIGRlZiB0ZXN0X1ZlcmlmeShzZWxmKToKKyAgICBlbnRyaWVzID0gKAorICAgICAgICAncGF5bG9hZC5iaW4nLAorICAgICAgICAncGF5bG9hZF9wcm9wZXJ0aWVzLnR4dCcsCisgICAgICAgICdjYXJlX21hcC50eHQnLAorICAgICAgICAnY29tcGF0aWJpbGl0eS56aXAnLAorICAgICAgICAnTUVUQS1JTkYvY29tL2FuZHJvaWQvbWV0YWRhdGEnLAorICAgICkKKyAgICB6aXBfZmlsZSA9IHNlbGYuY29uc3RydWN0X3ppcF9wYWNrYWdlKGVudHJpZXMpCisgICAgcHJvcGVydHlfZmlsZXMgPSBTdHJlYW1pbmdQcm9wZXJ0eUZpbGVzKCkKKyAgICB3aXRoIHppcGZpbGUuWmlwRmlsZSh6aXBfZmlsZSwgJ3InKSBhcyB6aXBfZnA6CisgICAgICAjIEZpcnN0IGdldCB0aGUgcmF3IG1ldGFkYXRhIHN0cmluZyAoaS5lLiB3aXRob3V0IHBhZGRpbmcgc3BhY2UpLgorICAgICAgIyBweWxpbnQ6IGRpc2FibGU9cHJvdGVjdGVkLWFjY2VzcworICAgICAgcmF3X21ldGFkYXRhID0gcHJvcGVydHlfZmlsZXMuX0dldFByb3BlcnR5RmlsZXNTdHJpbmcoCisgICAgICAgICAgemlwX2ZwLCByZXNlcnZlX3NwYWNlPUZhbHNlKQorCisgICAgICAjIFNob3VsZCBwYXNzIHRoZSB0ZXN0IGlmIHZlcmlmaWNhdGlvbiBwYXNzZXMuCisgICAgICBwcm9wZXJ0eV9maWxlcy5WZXJpZnkoemlwX2ZwLCByYXdfbWV0YWRhdGEpCisKKyAgICAgICMgT3IgcmFpc2Ugb24gdmVyaWZpY2F0aW9uIGZhaWx1cmUuCisgICAgICBzZWxmLmFzc2VydFJhaXNlcygKKyAgICAgICAgICBBc3NlcnRpb25FcnJvciwgcHJvcGVydHlfZmlsZXMuVmVyaWZ5LCB6aXBfZnAsIHJhd19tZXRhZGF0YSArICd4JykKKworCitjbGFzcyBBYk90YVByb3BlcnR5RmlsZXNUZXN0KFByb3BlcnR5RmlsZXNUZXN0KToKKyAgIiIiQWRkaXRpb25hbCBzYW5pdHkgY2hlY2tzIHNwZWNpYWxpemVkIGZvciBBYk90YVByb3BlcnR5RmlsZXMuIiIiCisKKyAgIyBUaGUgc2l6ZSBmb3IgcGF5bG9hZCBhbmQgbWV0YWRhdGEgc2lnbmF0dXJlIHNpemUuCisgIFNJR05BVFVSRV9TSVpFID0gMjU2CisKKyAgZGVmIHNldFVwKHNlbGYpOgorICAgIHNlbGYudGVzdGRhdGFfZGlyID0gdGVzdF91dGlscy5nZXRfdGVzdGRhdGFfZGlyKCkKKyAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5leGlzdHMoc2VsZi50ZXN0ZGF0YV9kaXIpKQorCisgICAgY29tbW9uLk9QVElPTlMud2lwZV91c2VyX2RhdGEgPSBGYWxzZQorICAgIGNvbW1vbi5PUFRJT05TLnBheWxvYWRfc2lnbmVyID0gTm9uZQorICAgIGNvbW1vbi5PUFRJT05TLnBheWxvYWRfc2lnbmVyX2FyZ3MgPSBOb25lCisgICAgY29tbW9uLk9QVElPTlMucGFja2FnZV9rZXkgPSBvcy5wYXRoLmpvaW4oc2VsZi50ZXN0ZGF0YV9kaXIsICd0ZXN0a2V5JykKKyAgICBjb21tb24uT1BUSU9OUy5rZXlfcGFzc3dvcmRzID0geworICAgICAgICBjb21tb24uT1BUSU9OUy5wYWNrYWdlX2tleSA6IE5vbmUsCisgICAgfQorCisgIGRlZiB0ZXN0X2luaXQoc2VsZik6CisgICAgcHJvcGVydHlfZmlsZXMgPSBBYk90YVByb3BlcnR5RmlsZXMoKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ290YS1wcm9wZXJ0eS1maWxlcycsIHByb3BlcnR5X2ZpbGVzLm5hbWUpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgKAorICAgICAgICAgICAgJ3BheWxvYWQuYmluJywKKyAgICAgICAgICAgICdwYXlsb2FkX3Byb3BlcnRpZXMudHh0JywKKyAgICAgICAgKSwKKyAgICAgICAgcHJvcGVydHlfZmlsZXMucmVxdWlyZWQpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgKAorICAgICAgICAgICAgJ2NhcmVfbWFwLnR4dCcsCisgICAgICAgICAgICAnY29tcGF0aWJpbGl0eS56aXAnLAorICAgICAgICApLAorICAgICAgICBwcm9wZXJ0eV9maWxlcy5vcHRpb25hbCkKKworICBkZWYgdGVzdF9HZXRQYXlsb2FkTWV0YWRhdGFPZmZzZXRBbmRTaXplKHNlbGYpOgorICAgIHRhcmdldF9maWxlID0gY29uc3RydWN0X3RhcmdldF9maWxlcygpCisgICAgcGF5bG9hZCA9IFBheWxvYWQoKQorICAgIHBheWxvYWQuR2VuZXJhdGUodGFyZ2V0X2ZpbGUpCisKKyAgICBwYXlsb2FkX3NpZ25lciA9IFBheWxvYWRTaWduZXIoKQorICAgIHBheWxvYWQuU2lnbihwYXlsb2FkX3NpZ25lcikKKworICAgIG91dHB1dF9maWxlID0gY29tbW9uLk1ha2VUZW1wRmlsZShzdWZmaXg9Jy56aXAnKQorICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKG91dHB1dF9maWxlLCAndycpIGFzIG91dHB1dF96aXA6CisgICAgICBwYXlsb2FkLldyaXRlVG9aaXAob3V0cHV0X3ppcCkKKworICAgICMgRmluZCBvdXQgdGhlIHBheWxvYWQgbWV0YWRhdGEgb2Zmc2V0IGFuZCBzaXplLgorICAgIHByb3BlcnR5X2ZpbGVzID0gQWJPdGFQcm9wZXJ0eUZpbGVzKCkKKyAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShvdXRwdXRfZmlsZSkgYXMgaW5wdXRfemlwOgorICAgICAgIyBweWxpbnQ6IGRpc2FibGU9cHJvdGVjdGVkLWFjY2VzcworICAgICAgcGF5bG9hZF9vZmZzZXQsIG1ldGFkYXRhX3RvdGFsID0gKAorICAgICAgICAgIHByb3BlcnR5X2ZpbGVzLl9HZXRQYXlsb2FkTWV0YWRhdGFPZmZzZXRBbmRTaXplKGlucHV0X3ppcCkpCisKKyAgICAjIFJlYWQgaW4gdGhlIG1ldGFkYXRhIHNpZ25hdHVyZSBkaXJlY3RseS4KKyAgICB3aXRoIG9wZW4ob3V0cHV0X2ZpbGUsICdyYicpIGFzIHZlcmlmeV9mcDoKKyAgICAgIHZlcmlmeV9mcC5zZWVrKHBheWxvYWRfb2Zmc2V0ICsgbWV0YWRhdGFfdG90YWwgLSBzZWxmLlNJR05BVFVSRV9TSVpFKQorICAgICAgbWV0YWRhdGFfc2lnbmF0dXJlID0gdmVyaWZ5X2ZwLnJlYWQoc2VsZi5TSUdOQVRVUkVfU0laRSkKKworICAgICMgTm93IHdlIGV4dHJhY3QgdGhlIG1ldGFkYXRhIGhhc2ggdmlhIGJyaWxsb191cGRhdGVfcGF5bG9hZCBzY3JpcHQsIHdoaWNoCisgICAgIyB3aWxsIHNlcnZlIGFzIHRoZSBvcmFjbGUgcmVzdWx0LgorICAgIHBheWxvYWRfc2lnX2ZpbGUgPSBjb21tb24uTWFrZVRlbXBGaWxlKHByZWZpeD0ic2lnLSIsIHN1ZmZpeD0iLmJpbiIpCisgICAgbWV0YWRhdGFfc2lnX2ZpbGUgPSBjb21tb24uTWFrZVRlbXBGaWxlKHByZWZpeD0ic2lnLSIsIHN1ZmZpeD0iLmJpbiIpCisgICAgY21kID0gWydicmlsbG9fdXBkYXRlX3BheWxvYWQnLCAnaGFzaCcsCisgICAgICAgICAgICctLXVuc2lnbmVkX3BheWxvYWQnLCBwYXlsb2FkLnBheWxvYWRfZmlsZSwKKyAgICAgICAgICAgJy0tc2lnbmF0dXJlX3NpemUnLCBzdHIoc2VsZi5TSUdOQVRVUkVfU0laRSksCisgICAgICAgICAgICctLW1ldGFkYXRhX2hhc2hfZmlsZScsIG1ldGFkYXRhX3NpZ19maWxlLAorICAgICAgICAgICAnLS1wYXlsb2FkX2hhc2hfZmlsZScsIHBheWxvYWRfc2lnX2ZpbGVdCisgICAgcHJvYyA9IGNvbW1vbi5SdW4oY21kLCBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLCBzdGRlcnI9c3VicHJvY2Vzcy5TVERPVVQpCisgICAgc3Rkb3V0ZGF0YSwgXyA9IHByb2MuY29tbXVuaWNhdGUoKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgIDAsIHByb2MucmV0dXJuY29kZSwKKyAgICAgICAgJ0ZhaWxlZCB0byBydW4gYnJpbGxvX3VwZGF0ZV9wYXlsb2FkOiB7fScuZm9ybWF0KHN0ZG91dGRhdGEpKQorCisgICAgc2lnbmVkX21ldGFkYXRhX3NpZ19maWxlID0gcGF5bG9hZF9zaWduZXIuU2lnbihtZXRhZGF0YV9zaWdfZmlsZSkKKworICAgICMgRmluYWxseSB3ZSBjYW4gY29tcGFyZSB0aGUgdHdvIHNpZ25hdHVyZXMuCisgICAgd2l0aCBvcGVuKHNpZ25lZF9tZXRhZGF0YV9zaWdfZmlsZSwgJ3JiJykgYXMgdmVyaWZ5X2ZwOgorICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2ZXJpZnlfZnAucmVhZCgpLCBtZXRhZGF0YV9zaWduYXR1cmUpCisKKyAgQHN0YXRpY21ldGhvZAorICBkZWYgY29uc3RydWN0X3ppcF9wYWNrYWdlX3dpdGhWYWxpZFBheWxvYWQod2l0aF9tZXRhZGF0YT1GYWxzZSk6CisgICAgIyBDYW5ub3QgdXNlIGNvbnN0cnVjdF96aXBfcGFja2FnZSgpIHNpbmNlIHdlIG5lZWQgYSAidmFsaWQiIHBheWxvYWQuYmluLgorICAgIHRhcmdldF9maWxlID0gY29uc3RydWN0X3RhcmdldF9maWxlcygpCisgICAgcGF5bG9hZCA9IFBheWxvYWQoKQorICAgIHBheWxvYWQuR2VuZXJhdGUodGFyZ2V0X2ZpbGUpCisKKyAgICBwYXlsb2FkX3NpZ25lciA9IFBheWxvYWRTaWduZXIoKQorICAgIHBheWxvYWQuU2lnbihwYXlsb2FkX3NpZ25lcikKKworICAgIHppcF9maWxlID0gY29tbW9uLk1ha2VUZW1wRmlsZShzdWZmaXg9Jy56aXAnKQorICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKHppcF9maWxlLCAndycpIGFzIHppcF9mcDoKKyAgICAgICMgJ3BheWxvYWQuYmluJywKKyAgICAgIHBheWxvYWQuV3JpdGVUb1ppcCh6aXBfZnApCisKKyAgICAgICMgT3RoZXIgZW50cmllcy4KKyAgICAgIGVudHJpZXMgPSBbJ2NhcmVfbWFwLnR4dCcsICdjb21wYXRpYmlsaXR5LnppcCddCisKKyAgICAgICMgUHV0IE1FVEEtSU5GL2NvbS9hbmRyb2lkL21ldGFkYXRhIGlmIG5lZWRlZC4KKyAgICAgIGlmIHdpdGhfbWV0YWRhdGE6CisgICAgICAgIGVudHJpZXMuYXBwZW5kKCdNRVRBLUlORi9jb20vYW5kcm9pZC9tZXRhZGF0YScpCisKKyAgICAgIGZvciBlbnRyeSBpbiBlbnRyaWVzOgorICAgICAgICB6aXBfZnAud3JpdGVzdHIoCisgICAgICAgICAgICBlbnRyeSwgZW50cnkucmVwbGFjZSgnLicsICctJykudXBwZXIoKSwgemlwZmlsZS5aSVBfU1RPUkVEKQorCisgICAgcmV0dXJuIHppcF9maWxlCisKKyAgZGVmIHRlc3RfQ29tcHV0ZShzZWxmKToKKyAgICB6aXBfZmlsZSA9IHNlbGYuY29uc3RydWN0X3ppcF9wYWNrYWdlX3dpdGhWYWxpZFBheWxvYWQoKQorICAgIHByb3BlcnR5X2ZpbGVzID0gQWJPdGFQcm9wZXJ0eUZpbGVzKCkKKyAgICB3aXRoIHppcGZpbGUuWmlwRmlsZSh6aXBfZmlsZSwgJ3InKSBhcyB6aXBfZnA6CisgICAgICBwcm9wZXJ0eV9maWxlc19zdHJpbmcgPSBwcm9wZXJ0eV9maWxlcy5Db21wdXRlKHppcF9mcCkKKworICAgIHRva2VucyA9IHNlbGYuX3BhcnNlX3Byb3BlcnR5X2ZpbGVzX3N0cmluZyhwcm9wZXJ0eV9maWxlc19zdHJpbmcpCisgICAgIyAiNiIgaW5kY2x1ZGVzIHRoZSBmb3VyIGVudHJpZXMgYWJvdmUsIG9uZSBtZXRhZGF0YSBlbnRyeSwgYW5kIG9uZSBlbnRyeQorICAgICMgZm9yIHBheWxvYWQtbWV0YWRhdGEuYmluLgorICAgIHNlbGYuYXNzZXJ0RXF1YWwoNiwgbGVuKHRva2VucykpCisgICAgc2VsZi5fdmVyaWZ5X2VudHJpZXMoCisgICAgICAgIHppcF9maWxlLCB0b2tlbnMsICgnY2FyZV9tYXAudHh0JywgJ2NvbXBhdGliaWxpdHkuemlwJykpCisKKyAgZGVmIHRlc3RfRmluYWxpemUoc2VsZik6CisgICAgemlwX2ZpbGUgPSBzZWxmLmNvbnN0cnVjdF96aXBfcGFja2FnZV93aXRoVmFsaWRQYXlsb2FkKHdpdGhfbWV0YWRhdGE9VHJ1ZSkKKyAgICBwcm9wZXJ0eV9maWxlcyA9IEFiT3RhUHJvcGVydHlGaWxlcygpCisgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoemlwX2ZpbGUsICdyJykgYXMgemlwX2ZwOgorICAgICAgIyBweWxpbnQ6IGRpc2FibGU9cHJvdGVjdGVkLWFjY2VzcworICAgICAgcmF3X21ldGFkYXRhID0gcHJvcGVydHlfZmlsZXMuX0dldFByb3BlcnR5RmlsZXNTdHJpbmcoCisgICAgICAgICAgemlwX2ZwLCByZXNlcnZlX3NwYWNlPUZhbHNlKQorICAgICAgcHJvcGVydHlfZmlsZXNfc3RyaW5nID0gcHJvcGVydHlfZmlsZXMuRmluYWxpemUoemlwX2ZwLCBsZW4ocmF3X21ldGFkYXRhKSkKKworICAgIHRva2VucyA9IHNlbGYuX3BhcnNlX3Byb3BlcnR5X2ZpbGVzX3N0cmluZyhwcm9wZXJ0eV9maWxlc19zdHJpbmcpCisgICAgIyAiNiIgaW5kY2x1ZGVzIHRoZSBmb3VyIGVudHJpZXMgYWJvdmUsIG9uZSBtZXRhZGF0YSBlbnRyeSwgYW5kIG9uZSBlbnRyeQorICAgICMgZm9yIHBheWxvYWQtbWV0YWRhdGEuYmluLgorICAgIHNlbGYuYXNzZXJ0RXF1YWwoNiwgbGVuKHRva2VucykpCisgICAgc2VsZi5fdmVyaWZ5X2VudHJpZXMoCisgICAgICAgIHppcF9maWxlLCB0b2tlbnMsICgnY2FyZV9tYXAudHh0JywgJ2NvbXBhdGliaWxpdHkuemlwJykpCisKKyAgZGVmIHRlc3RfVmVyaWZ5KHNlbGYpOgorICAgIHppcF9maWxlID0gc2VsZi5jb25zdHJ1Y3RfemlwX3BhY2thZ2Vfd2l0aFZhbGlkUGF5bG9hZCh3aXRoX21ldGFkYXRhPVRydWUpCisgICAgcHJvcGVydHlfZmlsZXMgPSBBYk90YVByb3BlcnR5RmlsZXMoKQorICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKHppcF9maWxlLCAncicpIGFzIHppcF9mcDoKKyAgICAgICMgcHlsaW50OiBkaXNhYmxlPXByb3RlY3RlZC1hY2Nlc3MKKyAgICAgIHJhd19tZXRhZGF0YSA9IHByb3BlcnR5X2ZpbGVzLl9HZXRQcm9wZXJ0eUZpbGVzU3RyaW5nKAorICAgICAgICAgIHppcF9mcCwgcmVzZXJ2ZV9zcGFjZT1GYWxzZSkKKworICAgICAgcHJvcGVydHlfZmlsZXMuVmVyaWZ5KHppcF9mcCwgcmF3X21ldGFkYXRhKQorCisKK2NsYXNzIE5vbkFiT3RhUHJvcGVydHlGaWxlc1Rlc3QoUHJvcGVydHlGaWxlc1Rlc3QpOgorICAiIiJBZGRpdGlvbmFsIHNhbml0eSBjaGVja3Mgc3BlY2lhbGl6ZWQgZm9yIE5vbkFiT3RhUHJvcGVydHlGaWxlcy4iIiIKKworICBkZWYgdGVzdF9pbml0KHNlbGYpOgorICAgIHByb3BlcnR5X2ZpbGVzID0gTm9uQWJPdGFQcm9wZXJ0eUZpbGVzKCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKCdvdGEtcHJvcGVydHktZmlsZXMnLCBwcm9wZXJ0eV9maWxlcy5uYW1lKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoKCksIHByb3BlcnR5X2ZpbGVzLnJlcXVpcmVkKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoKCksIHByb3BlcnR5X2ZpbGVzLm9wdGlvbmFsKQorCisgIGRlZiB0ZXN0X0NvbXB1dGUoc2VsZik6CisgICAgZW50cmllcyA9ICgpCisgICAgemlwX2ZpbGUgPSBzZWxmLmNvbnN0cnVjdF96aXBfcGFja2FnZShlbnRyaWVzKQorICAgIHByb3BlcnR5X2ZpbGVzID0gTm9uQWJPdGFQcm9wZXJ0eUZpbGVzKCkKKyAgICB3aXRoIHppcGZpbGUuWmlwRmlsZSh6aXBfZmlsZSkgYXMgemlwX2ZwOgorICAgICAgcHJvcGVydHlfZmlsZXNfc3RyaW5nID0gcHJvcGVydHlfZmlsZXMuQ29tcHV0ZSh6aXBfZnApCisKKyAgICB0b2tlbnMgPSBzZWxmLl9wYXJzZV9wcm9wZXJ0eV9maWxlc19zdHJpbmcocHJvcGVydHlfZmlsZXNfc3RyaW5nKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMSwgbGVuKHRva2VucykpCisgICAgc2VsZi5fdmVyaWZ5X2VudHJpZXMoemlwX2ZpbGUsIHRva2VucywgZW50cmllcykKKworICBkZWYgdGVzdF9GaW5hbGl6ZShzZWxmKToKKyAgICBlbnRyaWVzID0gWworICAgICAgICAnTUVUQS1JTkYvY29tL2FuZHJvaWQvbWV0YWRhdGEnLAorICAgIF0KKyAgICB6aXBfZmlsZSA9IHNlbGYuY29uc3RydWN0X3ppcF9wYWNrYWdlKGVudHJpZXMpCisgICAgcHJvcGVydHlfZmlsZXMgPSBOb25BYk90YVByb3BlcnR5RmlsZXMoKQorICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKHppcF9maWxlKSBhcyB6aXBfZnA6CisgICAgICAjIHB5bGludDogZGlzYWJsZT1wcm90ZWN0ZWQtYWNjZXNzCisgICAgICByYXdfbWV0YWRhdGEgPSBwcm9wZXJ0eV9maWxlcy5fR2V0UHJvcGVydHlGaWxlc1N0cmluZygKKyAgICAgICAgICB6aXBfZnAsIHJlc2VydmVfc3BhY2U9RmFsc2UpCisgICAgICBwcm9wZXJ0eV9maWxlc19zdHJpbmcgPSBwcm9wZXJ0eV9maWxlcy5GaW5hbGl6ZSh6aXBfZnAsIGxlbihyYXdfbWV0YWRhdGEpKQorICAgIHRva2VucyA9IHNlbGYuX3BhcnNlX3Byb3BlcnR5X2ZpbGVzX3N0cmluZyhwcm9wZXJ0eV9maWxlc19zdHJpbmcpCisKKyAgICBzZWxmLmFzc2VydEVxdWFsKDEsIGxlbih0b2tlbnMpKQorICAgICMgJ01FVEEtSU5GL2NvbS9hbmRyb2lkL21ldGFkYXRhJyB3aWxsIGJlIGtleSdkIGFzICdtZXRhZGF0YScuCisgICAgZW50cmllc1swXSA9ICdtZXRhZGF0YScKKyAgICBzZWxmLl92ZXJpZnlfZW50cmllcyh6aXBfZmlsZSwgdG9rZW5zLCBlbnRyaWVzKQorCisgIGRlZiB0ZXN0X1ZlcmlmeShzZWxmKToKKyAgICBlbnRyaWVzID0gKAorICAgICAgICAnTUVUQS1JTkYvY29tL2FuZHJvaWQvbWV0YWRhdGEnLAorICAgICkKKyAgICB6aXBfZmlsZSA9IHNlbGYuY29uc3RydWN0X3ppcF9wYWNrYWdlKGVudHJpZXMpCisgICAgcHJvcGVydHlfZmlsZXMgPSBOb25BYk90YVByb3BlcnR5RmlsZXMoKQorICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKHppcF9maWxlKSBhcyB6aXBfZnA6CisgICAgICAjIHB5bGludDogZGlzYWJsZT1wcm90ZWN0ZWQtYWNjZXNzCisgICAgICByYXdfbWV0YWRhdGEgPSBwcm9wZXJ0eV9maWxlcy5fR2V0UHJvcGVydHlGaWxlc1N0cmluZygKKyAgICAgICAgICB6aXBfZnAsIHJlc2VydmVfc3BhY2U9RmFsc2UpCisKKyAgICAgIHByb3BlcnR5X2ZpbGVzLlZlcmlmeSh6aXBfZnAsIHJhd19tZXRhZGF0YSkKKworCitjbGFzcyBQYXlsb2FkU2lnbmVyVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgU0lHRklMRSA9ICdzaWdmaWxlLmJpbicKKyAgU0lHTkVEX1NJR0ZJTEUgPSAnc2lnbmVkLXNpZ2ZpbGUuYmluJworCisgIGRlZiBzZXRVcChzZWxmKToKKyAgICBzZWxmLnRlc3RkYXRhX2RpciA9IHRlc3RfdXRpbHMuZ2V0X3Rlc3RkYXRhX2RpcigpCisgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguZXhpc3RzKHNlbGYudGVzdGRhdGFfZGlyKSkKKworICAgIGNvbW1vbi5PUFRJT05TLnBheWxvYWRfc2lnbmVyID0gTm9uZQorICAgIGNvbW1vbi5PUFRJT05TLnBheWxvYWRfc2lnbmVyX2FyZ3MgPSBbXQorICAgIGNvbW1vbi5PUFRJT05TLnBhY2thZ2Vfa2V5ID0gb3MucGF0aC5qb2luKHNlbGYudGVzdGRhdGFfZGlyLCAndGVzdGtleScpCisgICAgY29tbW9uLk9QVElPTlMua2V5X3Bhc3N3b3JkcyA9IHsKKyAgICAgICAgY29tbW9uLk9QVElPTlMucGFja2FnZV9rZXkgOiBOb25lLAorICAgIH0KKworICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgY29tbW9uLkNsZWFudXAoKQorCisgIGRlZiBfYXNzZXJ0RmlsZXNFcXVhbChzZWxmLCBmaWxlMSwgZmlsZTIpOgorICAgIHdpdGggb3BlbihmaWxlMSwgJ3JiJykgYXMgZnAxLCBvcGVuKGZpbGUyLCAncmInKSBhcyBmcDI6CisgICAgICBzZWxmLmFzc2VydEVxdWFsKGZwMS5yZWFkKCksIGZwMi5yZWFkKCkpCisKKyAgZGVmIHRlc3RfaW5pdChzZWxmKToKKyAgICBwYXlsb2FkX3NpZ25lciA9IFBheWxvYWRTaWduZXIoKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ29wZW5zc2wnLCBwYXlsb2FkX3NpZ25lci5zaWduZXIpCisKKyAgZGVmIHRlc3RfaW5pdF93aXRoUGFzc3dvcmQoc2VsZik6CisgICAgY29tbW9uLk9QVElPTlMucGFja2FnZV9rZXkgPSBvcy5wYXRoLmpvaW4oCisgICAgICAgIHNlbGYudGVzdGRhdGFfZGlyLCAndGVzdGtleV93aXRoX3Bhc3N3ZCcpCisgICAgY29tbW9uLk9QVElPTlMua2V5X3Bhc3N3b3JkcyA9IHsKKyAgICAgICAgY29tbW9uLk9QVElPTlMucGFja2FnZV9rZXkgOiAnZm9vJywKKyAgICB9CisgICAgcGF5bG9hZF9zaWduZXIgPSBQYXlsb2FkU2lnbmVyKCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKCdvcGVuc3NsJywgcGF5bG9hZF9zaWduZXIuc2lnbmVyKQorCisgIGRlZiB0ZXN0X2luaXRfd2l0aEV4dGVybmFsU2lnbmVyKHNlbGYpOgorICAgIGNvbW1vbi5PUFRJT05TLnBheWxvYWRfc2lnbmVyID0gJ2FiYycKKyAgICBjb21tb24uT1BUSU9OUy5wYXlsb2FkX3NpZ25lcl9hcmdzID0gWydhcmcxJywgJ2FyZzInXQorICAgIHBheWxvYWRfc2lnbmVyID0gUGF5bG9hZFNpZ25lcigpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgnYWJjJywgcGF5bG9hZF9zaWduZXIuc2lnbmVyKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoWydhcmcxJywgJ2FyZzInXSwgcGF5bG9hZF9zaWduZXIuc2lnbmVyX2FyZ3MpCisKKyAgZGVmIHRlc3RfU2lnbihzZWxmKToKKyAgICBwYXlsb2FkX3NpZ25lciA9IFBheWxvYWRTaWduZXIoKQorICAgIGlucHV0X2ZpbGUgPSBvcy5wYXRoLmpvaW4oc2VsZi50ZXN0ZGF0YV9kaXIsIHNlbGYuU0lHRklMRSkKKyAgICBzaWduZWRfZmlsZSA9IHBheWxvYWRfc2lnbmVyLlNpZ24oaW5wdXRfZmlsZSkKKworICAgIHZlcmlmeV9maWxlID0gb3MucGF0aC5qb2luKHNlbGYudGVzdGRhdGFfZGlyLCBzZWxmLlNJR05FRF9TSUdGSUxFKQorICAgIHNlbGYuX2Fzc2VydEZpbGVzRXF1YWwodmVyaWZ5X2ZpbGUsIHNpZ25lZF9maWxlKQorCisgIGRlZiB0ZXN0X1NpZ25fd2l0aEV4dGVybmFsU2lnbmVyX29wZW5zc2woc2VsZik6CisgICAgIiIiVXNlcyBvcGVuc3NsIGFzIHRoZSBleHRlcm5hbCBwYXlsb2FkIHNpZ25lci4iIiIKKyAgICBjb21tb24uT1BUSU9OUy5wYXlsb2FkX3NpZ25lciA9ICdvcGVuc3NsJworICAgIGNvbW1vbi5PUFRJT05TLnBheWxvYWRfc2lnbmVyX2FyZ3MgPSBbCisgICAgICAgICdwa2V5dXRsJywgJy1zaWduJywgJy1rZXlmb3JtJywgJ0RFUicsICctaW5rZXknLAorICAgICAgICBvcy5wYXRoLmpvaW4oc2VsZi50ZXN0ZGF0YV9kaXIsICd0ZXN0a2V5LnBrOCcpLAorICAgICAgICAnLXBrZXlvcHQnLCAnZGlnZXN0OnNoYTI1NiddCisgICAgcGF5bG9hZF9zaWduZXIgPSBQYXlsb2FkU2lnbmVyKCkKKyAgICBpbnB1dF9maWxlID0gb3MucGF0aC5qb2luKHNlbGYudGVzdGRhdGFfZGlyLCBzZWxmLlNJR0ZJTEUpCisgICAgc2lnbmVkX2ZpbGUgPSBwYXlsb2FkX3NpZ25lci5TaWduKGlucHV0X2ZpbGUpCisKKyAgICB2ZXJpZnlfZmlsZSA9IG9zLnBhdGguam9pbihzZWxmLnRlc3RkYXRhX2Rpciwgc2VsZi5TSUdORURfU0lHRklMRSkKKyAgICBzZWxmLl9hc3NlcnRGaWxlc0VxdWFsKHZlcmlmeV9maWxlLCBzaWduZWRfZmlsZSkKKworICBkZWYgdGVzdF9TaWduX3dpdGhFeHRlcm5hbFNpZ25lcl9zY3JpcHQoc2VsZik6CisgICAgIiIiVXNlcyB0ZXN0ZGF0YS9wYXlsb2FkX3NpZ25lci5zaCBhcyB0aGUgZXh0ZXJuYWwgcGF5bG9hZCBzaWduZXIuIiIiCisgICAgY29tbW9uLk9QVElPTlMucGF5bG9hZF9zaWduZXIgPSBvcy5wYXRoLmpvaW4oCisgICAgICAgIHNlbGYudGVzdGRhdGFfZGlyLCAncGF5bG9hZF9zaWduZXIuc2gnKQorICAgIGNvbW1vbi5PUFRJT05TLnBheWxvYWRfc2lnbmVyX2FyZ3MgPSBbCisgICAgICAgIG9zLnBhdGguam9pbihzZWxmLnRlc3RkYXRhX2RpciwgJ3Rlc3RrZXkucGs4JyldCisgICAgcGF5bG9hZF9zaWduZXIgPSBQYXlsb2FkU2lnbmVyKCkKKyAgICBpbnB1dF9maWxlID0gb3MucGF0aC5qb2luKHNlbGYudGVzdGRhdGFfZGlyLCBzZWxmLlNJR0ZJTEUpCisgICAgc2lnbmVkX2ZpbGUgPSBwYXlsb2FkX3NpZ25lci5TaWduKGlucHV0X2ZpbGUpCisKKyAgICB2ZXJpZnlfZmlsZSA9IG9zLnBhdGguam9pbihzZWxmLnRlc3RkYXRhX2Rpciwgc2VsZi5TSUdORURfU0lHRklMRSkKKyAgICBzZWxmLl9hc3NlcnRGaWxlc0VxdWFsKHZlcmlmeV9maWxlLCBzaWduZWRfZmlsZSkKKworCitjbGFzcyBQYXlsb2FkVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgZGVmIHNldFVwKHNlbGYpOgorICAgIHNlbGYudGVzdGRhdGFfZGlyID0gdGVzdF91dGlscy5nZXRfdGVzdGRhdGFfZGlyKCkKKyAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5leGlzdHMoc2VsZi50ZXN0ZGF0YV9kaXIpKQorCisgICAgY29tbW9uLk9QVElPTlMud2lwZV91c2VyX2RhdGEgPSBGYWxzZQorICAgIGNvbW1vbi5PUFRJT05TLnBheWxvYWRfc2lnbmVyID0gTm9uZQorICAgIGNvbW1vbi5PUFRJT05TLnBheWxvYWRfc2lnbmVyX2FyZ3MgPSBOb25lCisgICAgY29tbW9uLk9QVElPTlMucGFja2FnZV9rZXkgPSBvcy5wYXRoLmpvaW4oc2VsZi50ZXN0ZGF0YV9kaXIsICd0ZXN0a2V5JykKKyAgICBjb21tb24uT1BUSU9OUy5rZXlfcGFzc3dvcmRzID0geworICAgICAgICBjb21tb24uT1BUSU9OUy5wYWNrYWdlX2tleSA6IE5vbmUsCisgICAgfQorCisgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICBjb21tb24uQ2xlYW51cCgpCisKKyAgQHN0YXRpY21ldGhvZAorICBkZWYgX2NyZWF0ZV9wYXlsb2FkX2Z1bGwoc2Vjb25kYXJ5PUZhbHNlKToKKyAgICB0YXJnZXRfZmlsZSA9IGNvbnN0cnVjdF90YXJnZXRfZmlsZXMoc2Vjb25kYXJ5KQorICAgIHBheWxvYWQgPSBQYXlsb2FkKHNlY29uZGFyeSkKKyAgICBwYXlsb2FkLkdlbmVyYXRlKHRhcmdldF9maWxlKQorICAgIHJldHVybiBwYXlsb2FkCisKKyAgQHN0YXRpY21ldGhvZAorICBkZWYgX2NyZWF0ZV9wYXlsb2FkX2luY3JlbWVudGFsKCk6CisgICAgdGFyZ2V0X2ZpbGUgPSBjb25zdHJ1Y3RfdGFyZ2V0X2ZpbGVzKCkKKyAgICBzb3VyY2VfZmlsZSA9IGNvbnN0cnVjdF90YXJnZXRfZmlsZXMoKQorICAgIHBheWxvYWQgPSBQYXlsb2FkKCkKKyAgICBwYXlsb2FkLkdlbmVyYXRlKHRhcmdldF9maWxlLCBzb3VyY2VfZmlsZSkKKyAgICByZXR1cm4gcGF5bG9hZAorCisgIGRlZiB0ZXN0X0dlbmVyYXRlX2Z1bGwoc2VsZik6CisgICAgcGF5bG9hZCA9IHNlbGYuX2NyZWF0ZV9wYXlsb2FkX2Z1bGwoKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5wYXRoLmV4aXN0cyhwYXlsb2FkLnBheWxvYWRfZmlsZSkpCisKKyAgZGVmIHRlc3RfR2VuZXJhdGVfaW5jcmVtZW50YWwoc2VsZik6CisgICAgcGF5bG9hZCA9IHNlbGYuX2NyZWF0ZV9wYXlsb2FkX2luY3JlbWVudGFsKCkKKyAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5leGlzdHMocGF5bG9hZC5wYXlsb2FkX2ZpbGUpKQorCisgIGRlZiB0ZXN0X0dlbmVyYXRlX2FkZGl0aW9uYWxBcmdzKHNlbGYpOgorICAgIHRhcmdldF9maWxlID0gY29uc3RydWN0X3RhcmdldF9maWxlcygpCisgICAgc291cmNlX2ZpbGUgPSBjb25zdHJ1Y3RfdGFyZ2V0X2ZpbGVzKCkKKyAgICBwYXlsb2FkID0gUGF5bG9hZCgpCisgICAgIyBUaGlzIHNob3VsZCB3b3JrIHRoZSBzYW1lIGFzIGNhbGxpbmcgcGF5bG9hZC5HZW5lcmF0ZSh0YXJnZXRfZmlsZSwKKyAgICAjIHNvdXJjZV9maWxlKS4KKyAgICBwYXlsb2FkLkdlbmVyYXRlKAorICAgICAgICB0YXJnZXRfZmlsZSwgYWRkaXRpb25hbF9hcmdzPVsiLS1zb3VyY2VfaW1hZ2UiLCBzb3VyY2VfZmlsZV0pCisgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguZXhpc3RzKHBheWxvYWQucGF5bG9hZF9maWxlKSkKKworICBkZWYgdGVzdF9HZW5lcmF0ZV9pbnZhbGlkSW5wdXQoc2VsZik6CisgICAgdGFyZ2V0X2ZpbGUgPSBjb25zdHJ1Y3RfdGFyZ2V0X2ZpbGVzKCkKKyAgICBjb21tb24uWmlwRGVsZXRlKHRhcmdldF9maWxlLCAnSU1BR0VTL3ZlbmRvci5pbWcnKQorICAgIHBheWxvYWQgPSBQYXlsb2FkKCkKKyAgICBzZWxmLmFzc2VydFJhaXNlcyhBc3NlcnRpb25FcnJvciwgcGF5bG9hZC5HZW5lcmF0ZSwgdGFyZ2V0X2ZpbGUpCisKKyAgZGVmIHRlc3RfU2lnbl9mdWxsKHNlbGYpOgorICAgIHBheWxvYWQgPSBzZWxmLl9jcmVhdGVfcGF5bG9hZF9mdWxsKCkKKyAgICBwYXlsb2FkLlNpZ24oUGF5bG9hZFNpZ25lcigpKQorCisgICAgb3V0cHV0X2ZpbGUgPSBjb21tb24uTWFrZVRlbXBGaWxlKHN1ZmZpeD0nLnppcCcpCisgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUob3V0cHV0X2ZpbGUsICd3JykgYXMgb3V0cHV0X3ppcDoKKyAgICAgIHBheWxvYWQuV3JpdGVUb1ppcChvdXRwdXRfemlwKQorCisgICAgaW1wb3J0IGNoZWNrX290YV9wYWNrYWdlX3NpZ25hdHVyZQorICAgIGNoZWNrX290YV9wYWNrYWdlX3NpZ25hdHVyZS5WZXJpZnlBYk90YVBheWxvYWQoCisgICAgICAgIG9zLnBhdGguam9pbihzZWxmLnRlc3RkYXRhX2RpciwgJ3Rlc3RrZXkueDUwOS5wZW0nKSwKKyAgICAgICAgb3V0cHV0X2ZpbGUpCisKKyAgZGVmIHRlc3RfU2lnbl9pbmNyZW1lbnRhbChzZWxmKToKKyAgICBwYXlsb2FkID0gc2VsZi5fY3JlYXRlX3BheWxvYWRfaW5jcmVtZW50YWwoKQorICAgIHBheWxvYWQuU2lnbihQYXlsb2FkU2lnbmVyKCkpCisKKyAgICBvdXRwdXRfZmlsZSA9IGNvbW1vbi5NYWtlVGVtcEZpbGUoc3VmZml4PScuemlwJykKKyAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShvdXRwdXRfZmlsZSwgJ3cnKSBhcyBvdXRwdXRfemlwOgorICAgICAgcGF5bG9hZC5Xcml0ZVRvWmlwKG91dHB1dF96aXApCisKKyAgICBpbXBvcnQgY2hlY2tfb3RhX3BhY2thZ2Vfc2lnbmF0dXJlCisgICAgY2hlY2tfb3RhX3BhY2thZ2Vfc2lnbmF0dXJlLlZlcmlmeUFiT3RhUGF5bG9hZCgKKyAgICAgICAgb3MucGF0aC5qb2luKHNlbGYudGVzdGRhdGFfZGlyLCAndGVzdGtleS54NTA5LnBlbScpLAorICAgICAgICBvdXRwdXRfZmlsZSkKKworICBkZWYgdGVzdF9TaWduX3dpdGhEYXRhV2lwZShzZWxmKToKKyAgICBjb21tb24uT1BUSU9OUy53aXBlX3VzZXJfZGF0YSA9IFRydWUKKyAgICBwYXlsb2FkID0gc2VsZi5fY3JlYXRlX3BheWxvYWRfZnVsbCgpCisgICAgcGF5bG9hZC5TaWduKFBheWxvYWRTaWduZXIoKSkKKworICAgIHdpdGggb3BlbihwYXlsb2FkLnBheWxvYWRfcHJvcGVydGllcykgYXMgcHJvcGVydGllc19mcDoKKyAgICAgIHNlbGYuYXNzZXJ0SW4oIlBPV0VSV0FTSD0xIiwgcHJvcGVydGllc19mcC5yZWFkKCkpCisKKyAgZGVmIHRlc3RfU2lnbl9zZWNvbmRhcnkoc2VsZik6CisgICAgcGF5bG9hZCA9IHNlbGYuX2NyZWF0ZV9wYXlsb2FkX2Z1bGwoc2Vjb25kYXJ5PVRydWUpCisgICAgcGF5bG9hZC5TaWduKFBheWxvYWRTaWduZXIoKSkKKworICAgIHdpdGggb3BlbihwYXlsb2FkLnBheWxvYWRfcHJvcGVydGllcykgYXMgcHJvcGVydGllc19mcDoKKyAgICAgIHNlbGYuYXNzZXJ0SW4oIlNXSVRDSF9TTE9UX09OX1JFQk9PVD0wIiwgcHJvcGVydGllc19mcC5yZWFkKCkpCisKKyAgZGVmIHRlc3RfU2lnbl9iYWRTaWduZXIoc2VsZik6CisgICAgIiIiVGVzdHMgdGhhdCBzaWduaW5nIGZhaWx1cmUgY2FuIGJlIGNhcHR1cmVkLiIiIgorICAgIHBheWxvYWQgPSBzZWxmLl9jcmVhdGVfcGF5bG9hZF9mdWxsKCkKKyAgICBwYXlsb2FkX3NpZ25lciA9IFBheWxvYWRTaWduZXIoKQorICAgIHBheWxvYWRfc2lnbmVyLnNpZ25lcl9hcmdzLmFwcGVuZCgnYmFkLW9wdGlvbicpCisgICAgc2VsZi5hc3NlcnRSYWlzZXMoQXNzZXJ0aW9uRXJyb3IsIHBheWxvYWQuU2lnbiwgcGF5bG9hZF9zaWduZXIpCisKKyAgZGVmIHRlc3RfV3JpdGVUb1ppcChzZWxmKToKKyAgICBwYXlsb2FkID0gc2VsZi5fY3JlYXRlX3BheWxvYWRfZnVsbCgpCisgICAgcGF5bG9hZC5TaWduKFBheWxvYWRTaWduZXIoKSkKKworICAgIG91dHB1dF9maWxlID0gY29tbW9uLk1ha2VUZW1wRmlsZShzdWZmaXg9Jy56aXAnKQorICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKG91dHB1dF9maWxlLCAndycpIGFzIG91dHB1dF96aXA6CisgICAgICBwYXlsb2FkLldyaXRlVG9aaXAob3V0cHV0X3ppcCkKKworICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKG91dHB1dF9maWxlKSBhcyB2ZXJpZnlfemlwOgorICAgICAgIyBGaXJzdCBtYWtlIHN1cmUgd2UgaGF2ZSB0aGUgZXNzZW50aWFsIGVudHJpZXMuCisgICAgICBuYW1lbGlzdCA9IHZlcmlmeV96aXAubmFtZWxpc3QoKQorICAgICAgc2VsZi5hc3NlcnRJbihQYXlsb2FkLlBBWUxPQURfQklOLCBuYW1lbGlzdCkKKyAgICAgIHNlbGYuYXNzZXJ0SW4oUGF5bG9hZC5QQVlMT0FEX1BST1BFUlRJRVNfVFhULCBuYW1lbGlzdCkKKworICAgICAgIyBUaGVuIGFzc2VydCB0aGVzZSBlbnRyaWVzIGFyZSBzdG9yZWQuCisgICAgICBmb3IgZW50cnlfaW5mbyBpbiB2ZXJpZnlfemlwLmluZm9saXN0KCk6CisgICAgICAgIGlmIGVudHJ5X2luZm8uZmlsZW5hbWUgbm90IGluIChQYXlsb2FkLlBBWUxPQURfQklOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGF5bG9hZC5QQVlMT0FEX1BST1BFUlRJRVNfVFhUKToKKyAgICAgICAgICBjb250aW51ZQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHppcGZpbGUuWklQX1NUT1JFRCwgZW50cnlfaW5mby5jb21wcmVzc190eXBlKQorCisgIGRlZiB0ZXN0X1dyaXRlVG9aaXBfdW5zaWduZWRQYXlsb2FkKHNlbGYpOgorICAgICIiIlVuc2lnbmVkIHBheWxvYWRzIHNob3VsZCBub3QgYmUgYWxsb3dlZCB0byBiZSB3cml0dGVuIHRvIHppcC4iIiIKKyAgICBwYXlsb2FkID0gc2VsZi5fY3JlYXRlX3BheWxvYWRfZnVsbCgpCisKKyAgICBvdXRwdXRfZmlsZSA9IGNvbW1vbi5NYWtlVGVtcEZpbGUoc3VmZml4PScuemlwJykKKyAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShvdXRwdXRfZmlsZSwgJ3cnKSBhcyBvdXRwdXRfemlwOgorICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoQXNzZXJ0aW9uRXJyb3IsIHBheWxvYWQuV3JpdGVUb1ppcCwgb3V0cHV0X3ppcCkKKworICAgICMgQWxzbyB0ZXN0IHdpdGggaW5jcmVtZW50YWwgcGF5bG9hZC4KKyAgICBwYXlsb2FkID0gc2VsZi5fY3JlYXRlX3BheWxvYWRfaW5jcmVtZW50YWwoKQorCisgICAgb3V0cHV0X2ZpbGUgPSBjb21tb24uTWFrZVRlbXBGaWxlKHN1ZmZpeD0nLnppcCcpCisgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUob3V0cHV0X2ZpbGUsICd3JykgYXMgb3V0cHV0X3ppcDoKKyAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEFzc2VydGlvbkVycm9yLCBwYXlsb2FkLldyaXRlVG9aaXAsIG91dHB1dF96aXApCisKKyAgZGVmIHRlc3RfV3JpdGVUb1ppcF9zZWNvbmRhcnkoc2VsZik6CisgICAgcGF5bG9hZCA9IHNlbGYuX2NyZWF0ZV9wYXlsb2FkX2Z1bGwoc2Vjb25kYXJ5PVRydWUpCisgICAgcGF5bG9hZC5TaWduKFBheWxvYWRTaWduZXIoKSkKKworICAgIG91dHB1dF9maWxlID0gY29tbW9uLk1ha2VUZW1wRmlsZShzdWZmaXg9Jy56aXAnKQorICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKG91dHB1dF9maWxlLCAndycpIGFzIG91dHB1dF96aXA6CisgICAgICBwYXlsb2FkLldyaXRlVG9aaXAob3V0cHV0X3ppcCkKKworICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKG91dHB1dF9maWxlKSBhcyB2ZXJpZnlfemlwOgorICAgICAgIyBGaXJzdCBtYWtlIHN1cmUgd2UgaGF2ZSB0aGUgZXNzZW50aWFsIGVudHJpZXMuCisgICAgICBuYW1lbGlzdCA9IHZlcmlmeV96aXAubmFtZWxpc3QoKQorICAgICAgc2VsZi5hc3NlcnRJbihQYXlsb2FkLlNFQ09OREFSWV9QQVlMT0FEX0JJTiwgbmFtZWxpc3QpCisgICAgICBzZWxmLmFzc2VydEluKFBheWxvYWQuU0VDT05EQVJZX1BBWUxPQURfUFJPUEVSVElFU19UWFQsIG5hbWVsaXN0KQorCisgICAgICAjIFRoZW4gYXNzZXJ0IHRoZXNlIGVudHJpZXMgYXJlIHN0b3JlZC4KKyAgICAgIGZvciBlbnRyeV9pbmZvIGluIHZlcmlmeV96aXAuaW5mb2xpc3QoKToKKyAgICAgICAgaWYgZW50cnlfaW5mby5maWxlbmFtZSBub3QgaW4gKAorICAgICAgICAgICAgUGF5bG9hZC5TRUNPTkRBUllfUEFZTE9BRF9CSU4sCisgICAgICAgICAgICBQYXlsb2FkLlNFQ09OREFSWV9QQVlMT0FEX1BST1BFUlRJRVNfVFhUKToKKyAgICAgICAgICBjb250aW51ZQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHppcGZpbGUuWklQX1NUT1JFRCwgZW50cnlfaW5mby5jb21wcmVzc190eXBlKQpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVsZWFzZXRvb2xzL3Rlc3Rfc2lnbl90YXJnZXRfZmlsZXNfYXBrcy5weSBiL3Rvb2xzL3JlbGVhc2V0b29scy90ZXN0X3NpZ25fdGFyZ2V0X2ZpbGVzX2Fwa3MucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZmOWUxMAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3JlbGVhc2V0b29scy90ZXN0X3NpZ25fdGFyZ2V0X2ZpbGVzX2Fwa3MucHkKQEAgLTAsMCArMSwyMTMgQEAKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgcHJpbnRfZnVuY3Rpb24KKworaW1wb3J0IGJhc2U2NAoraW1wb3J0IG9zLnBhdGgKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IHppcGZpbGUKKworaW1wb3J0IGNvbW1vbgoraW1wb3J0IHRlc3RfdXRpbHMKK2Zyb20gc2lnbl90YXJnZXRfZmlsZXNfYXBrcyBpbXBvcnQgKAorICAgIEVkaXRUYWdzLCBSZXBsYWNlQ2VydHMsIFJlcGxhY2VWZXJpdHlLZXlJZCwgUmV3cml0ZVByb3BzKQorCisKK2NsYXNzIFNpZ25UYXJnZXRGaWxlc0Fwa3NUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICBNQUNfUEVSTUlTU0lPTlNfWE1MID0gIiIiPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/PgorPHBvbGljeT4KKyAgPHNpZ25lciBzaWduYXR1cmU9Int9Ij48c2VpbmZvIHZhbHVlPSJwbGF0Zm9ybSIvPjwvc2lnbmVyPgorICA8c2lnbmVyIHNpZ25hdHVyZT0ie30iPjxzZWluZm8gdmFsdWU9Im1lZGlhIi8+PC9zaWduZXI+Cis8L3BvbGljeT4iIiIKKworICBkZWYgc2V0VXAoc2VsZik6CisgICAgc2VsZi50ZXN0ZGF0YV9kaXIgPSB0ZXN0X3V0aWxzLmdldF90ZXN0ZGF0YV9kaXIoKQorCisgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICBjb21tb24uQ2xlYW51cCgpCisKKyAgZGVmIHRlc3RfRWRpdFRhZ3Moc2VsZik6CisgICAgc2VsZi5hc3NlcnRFcXVhbChFZGl0VGFncygnZGV2LWtleXMnKSwgKCdyZWxlYXNlLWtleXMnKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKEVkaXRUYWdzKCd0ZXN0LWtleXMnKSwgKCdyZWxlYXNlLWtleXMnKSkKKworICAgICMgTXVsdGlwbGUgdGFncy4KKyAgICBzZWxmLmFzc2VydEVxdWFsKEVkaXRUYWdzKCdhYmMsZGV2LWtleXMseHl6JyksICgnYWJjLHJlbGVhc2Uta2V5cyx4eXonKSkKKworICAgICMgVGFncyBhcmUgc29ydGVkLgorICAgIHNlbGYuYXNzZXJ0RXF1YWwoRWRpdFRhZ3MoJ3h5eixhYmMsZGV2LWtleXMseHl6JyksICgnYWJjLHJlbGVhc2Uta2V5cyx4eXonKSkKKworICBkZWYgdGVzdF9SZXdyaXRlUHJvcHMoc2VsZik6CisgICAgcHJvcHMgPSAoCisgICAgICAgICgnJywgJ1xuJyksCisgICAgICAgICgncm8uYnVpbGQuZmluZ2VycHJpbnQ9Zm9vL2Jhci9kZXYta2V5cycsCisgICAgICAgICAncm8uYnVpbGQuZmluZ2VycHJpbnQ9Zm9vL2Jhci9yZWxlYXNlLWtleXNcbicpLAorICAgICAgICAoJ3JvLmJ1aWxkLnRodW1icHJpbnQ9Zm9vL2Jhci9kZXYta2V5cycsCisgICAgICAgICAncm8uYnVpbGQudGh1bWJwcmludD1mb28vYmFyL3JlbGVhc2Uta2V5c1xuJyksCisgICAgICAgICgncm8udmVuZG9yLmJ1aWxkLmZpbmdlcnByaW50PWZvby9iYXIvZGV2LWtleXMnLAorICAgICAgICAgJ3JvLnZlbmRvci5idWlsZC5maW5nZXJwcmludD1mb28vYmFyL3JlbGVhc2Uta2V5c1xuJyksCisgICAgICAgICgncm8udmVuZG9yLmJ1aWxkLnRodW1icHJpbnQ9Zm9vL2Jhci9kZXYta2V5cycsCisgICAgICAgICAncm8udmVuZG9yLmJ1aWxkLnRodW1icHJpbnQ9Zm9vL2Jhci9yZWxlYXNlLWtleXNcbicpLAorICAgICAgICAoJyMgY29tbWVudCBsaW5lIDEnLCAnIyBjb21tZW50IGxpbmUgMVxuJyksCisgICAgICAgICgncm8uYm9vdGltYWdlLmJ1aWxkLmZpbmdlcnByaW50PWZvby9iYXIvZGV2LWtleXMnLAorICAgICAgICAgJ3JvLmJvb3RpbWFnZS5idWlsZC5maW5nZXJwcmludD1mb28vYmFyL3JlbGVhc2Uta2V5c1xuJyksCisgICAgICAgICgncm8uYnVpbGQuZGVzY3JpcHRpb249JworICAgICAgICAgJ3NhaWxmaXNoLXVzZXIgOC4wLjAgT1BSNi4xNzA2MjMuMDEyIDQyODM0MjggZGV2LWtleXMnLAorICAgICAgICAgJ3JvLmJ1aWxkLmRlc2NyaXB0aW9uPScKKyAgICAgICAgICdzYWlsZmlzaC11c2VyIDguMC4wIE9QUjYuMTcwNjIzLjAxMiA0MjgzNDI4IHJlbGVhc2Uta2V5c1xuJyksCisgICAgICAgICgncm8uYnVpbGQudGFncz1kZXYta2V5cycsICdyby5idWlsZC50YWdzPXJlbGVhc2Uta2V5c1xuJyksCisgICAgICAgICgnIyBjb21tZW50IGxpbmUgMicsICcjIGNvbW1lbnQgbGluZSAyXG4nKSwKKyAgICAgICAgKCdyby5idWlsZC5kaXNwbGF5LmlkPU9QUjYuMTcwNjIzLjAxMiBkZXYta2V5cycsCisgICAgICAgICAncm8uYnVpbGQuZGlzcGxheS5pZD1PUFI2LjE3MDYyMy4wMTJcbicpLAorICAgICAgICAoJyMgY29tbWVudCBsaW5lIDMnLCAnIyBjb21tZW50IGxpbmUgM1xuJyksCisgICAgKQorCisgICAgIyBBc3NlcnQgdGhlIGNhc2UgZm9yIGVhY2ggaW5kaXZpZHVhbCBsaW5lLgorICAgIGZvciBwcm9wLCBvdXRwdXQgaW4gcHJvcHM6CisgICAgICBzZWxmLmFzc2VydEVxdWFsKFJld3JpdGVQcm9wcyhwcm9wKSwgb3V0cHV0KQorCisgICAgIyBDb25jYXRlbmF0ZSBhbGwgdGhlIGlucHV0IGxpbmVzLgorICAgIHNlbGYuYXNzZXJ0RXF1YWwoUmV3cml0ZVByb3BzKCdcbicuam9pbihbcHJvcFswXSBmb3IgcHJvcCBpbiBwcm9wc10pKSwKKyAgICAgICAgICAgICAgICAgICAgICcnLmpvaW4oW3Byb3BbMV0gZm9yIHByb3AgaW4gcHJvcHNdKSkKKworICBkZWYgdGVzdF9SZXBsYWNlVmVyaXR5S2V5SWQoc2VsZik6CisgICAgQk9PVF9DTURMSU5FMSA9ICgKKyAgICAgICAgImNvbnNvbGU9dHR5SFNMMCwxMTUyMDAsbjggYW5kcm9pZGJvb3QuY29uc29sZT10dHlIU0wwICIKKyAgICAgICAgImFuZHJvaWRib290LmhhcmR3YXJlPW1hcmxpbiB1c2VyX2RlYnVnPTMxIGVoY2ktaGNkLnBhcms9MyAiCisgICAgICAgICJscG1fbGV2ZWxzLnNsZWVwX2Rpc2FibGVkPTEgY21hPTMyTUAwLTB4ZmZmZmZmZmYgbG9vcC5tYXhfcGFydD03ICIKKyAgICAgICAgImJ1aWxkdmFyaWFudD11c2VyZGVidWcgIgorICAgICAgICAidmVyaXR5a2V5aWQ9aWQ6N2U0MzMzZjliYmEwMGFkZmUwZWRlOTc5ZTI4ZWQxOTIwNDkyYjQwZlxuIikKKworICAgIEJPT1RfQ01ETElORTIgPSAoCisgICAgICAgICJjb25zb2xlPXR0eUhTTDAsMTE1MjAwLG44IGFuZHJvaWRib290LmNvbnNvbGU9dHR5SFNMMCAiCisgICAgICAgICJhbmRyb2lkYm9vdC5oYXJkd2FyZT1tYXJsaW4gdXNlcl9kZWJ1Zz0zMSBlaGNpLWhjZC5wYXJrPTMgIgorICAgICAgICAibHBtX2xldmVscy5zbGVlcF9kaXNhYmxlZD0xIGNtYT0zMk1AMC0weGZmZmZmZmZmIGxvb3AubWF4X3BhcnQ9NyAiCisgICAgICAgICJidWlsZHZhcmlhbnQ9dXNlcmRlYnVnICIKKyAgICAgICAgInZlcml0eWtleWlkPWlkOmQyNGYyNTkwZTlhYmFiNWNmZjVmNTlkYTRjNGYwMzY2ZTNmNDNlOTRcbiIpCisKKyAgICBpbnB1dF9maWxlID0gY29tbW9uLk1ha2VUZW1wRmlsZShzdWZmaXg9Jy56aXAnKQorICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKGlucHV0X2ZpbGUsICd3JykgYXMgaW5wdXRfemlwOgorICAgICAgaW5wdXRfemlwLndyaXRlc3RyKCdCT09UL2NtZGxpbmUnLCBCT09UX0NNRExJTkUxKQorCisgICAgIyBUZXN0IHdpdGggdGhlIGZpcnN0IGNlcnRpZmljYXRlLgorICAgIGNlcnRfZmlsZSA9IG9zLnBhdGguam9pbihzZWxmLnRlc3RkYXRhX2RpciwgJ3Zlcml0eS54NTA5LnBlbScpCisKKyAgICBvdXRwdXRfZmlsZSA9IGNvbW1vbi5NYWtlVGVtcEZpbGUoc3VmZml4PScuemlwJykKKyAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShpbnB1dF9maWxlLCAncicpIGFzIGlucHV0X3ppcCwgXAorICAgICAgICAgemlwZmlsZS5aaXBGaWxlKG91dHB1dF9maWxlLCAndycpIGFzIG91dHB1dF96aXA6CisgICAgICBSZXBsYWNlVmVyaXR5S2V5SWQoaW5wdXRfemlwLCBvdXRwdXRfemlwLCBjZXJ0X2ZpbGUpCisKKyAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShvdXRwdXRfZmlsZSkgYXMgb3V0cHV0X3ppcDoKKyAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoQk9PVF9DTURMSU5FMSwgb3V0cHV0X3ppcC5yZWFkKCdCT09UL2NtZGxpbmUnKSkKKworICAgICMgVGVzdCB3aXRoIHRoZSBzZWNvbmQgY2VydGlmaWNhdGUuCisgICAgY2VydF9maWxlID0gb3MucGF0aC5qb2luKHNlbGYudGVzdGRhdGFfZGlyLCAndGVzdGtleS54NTA5LnBlbScpCisKKyAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShpbnB1dF9maWxlLCAncicpIGFzIGlucHV0X3ppcCwgXAorICAgICAgICAgemlwZmlsZS5aaXBGaWxlKG91dHB1dF9maWxlLCAndycpIGFzIG91dHB1dF96aXA6CisgICAgICBSZXBsYWNlVmVyaXR5S2V5SWQoaW5wdXRfemlwLCBvdXRwdXRfemlwLCBjZXJ0X2ZpbGUpCisKKyAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShvdXRwdXRfZmlsZSkgYXMgb3V0cHV0X3ppcDoKKyAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoQk9PVF9DTURMSU5FMiwgb3V0cHV0X3ppcC5yZWFkKCdCT09UL2NtZGxpbmUnKSkKKworICBkZWYgdGVzdF9SZXBsYWNlVmVyaXR5S2V5SWRfbm9fdmVyaXR5a2V5aWQoc2VsZik6CisgICAgQk9PVF9DTURMSU5FID0gKAorICAgICAgICAiY29uc29sZT10dHlIU0wwLDExNTIwMCxuOCBhbmRyb2lkYm9vdC5oYXJkd2FyZT1idWxsaGVhZCBib290X2NwdXM9MC01ICIKKyAgICAgICAgImxwbV9sZXZlbHMuc2xlZXBfZGlzYWJsZWQ9MSBtc21fcG93ZXJvZmYuZG93bmxvYWRfbW9kZT0wICIKKyAgICAgICAgImxvb3AubWF4X3BhcnQ9N1xuIikKKworICAgIGlucHV0X2ZpbGUgPSBjb21tb24uTWFrZVRlbXBGaWxlKHN1ZmZpeD0nLnppcCcpCisgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoaW5wdXRfZmlsZSwgJ3cnKSBhcyBpbnB1dF96aXA6CisgICAgICBpbnB1dF96aXAud3JpdGVzdHIoJ0JPT1QvY21kbGluZScsIEJPT1RfQ01ETElORSkKKworICAgIG91dHB1dF9maWxlID0gY29tbW9uLk1ha2VUZW1wRmlsZShzdWZmaXg9Jy56aXAnKQorICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKGlucHV0X2ZpbGUsICdyJykgYXMgaW5wdXRfemlwLCBcCisgICAgICAgICB6aXBmaWxlLlppcEZpbGUob3V0cHV0X2ZpbGUsICd3JykgYXMgb3V0cHV0X3ppcDoKKyAgICAgIFJlcGxhY2VWZXJpdHlLZXlJZChpbnB1dF96aXAsIG91dHB1dF96aXAsIE5vbmUpCisKKyAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShvdXRwdXRfZmlsZSkgYXMgb3V0cHV0X3ppcDoKKyAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoQk9PVF9DTURMSU5FLCBvdXRwdXRfemlwLnJlYWQoJ0JPT1QvY21kbGluZScpKQorCisgIGRlZiB0ZXN0X1JlcGxhY2VDZXJ0cyhzZWxmKToKKyAgICBjZXJ0MV9wYXRoID0gb3MucGF0aC5qb2luKHNlbGYudGVzdGRhdGFfZGlyLCAncGxhdGZvcm0ueDUwOS5wZW0nKQorICAgIHdpdGggb3BlbihjZXJ0MV9wYXRoKSBhcyBjZXJ0MV9mcDoKKyAgICAgIGNlcnQxID0gY2VydDFfZnAucmVhZCgpCisgICAgY2VydDJfcGF0aCA9IG9zLnBhdGguam9pbihzZWxmLnRlc3RkYXRhX2RpciwgJ21lZGlhLng1MDkucGVtJykKKyAgICB3aXRoIG9wZW4oY2VydDJfcGF0aCkgYXMgY2VydDJfZnA6CisgICAgICBjZXJ0MiA9IGNlcnQyX2ZwLnJlYWQoKQorICAgIGNlcnQzX3BhdGggPSBvcy5wYXRoLmpvaW4oc2VsZi50ZXN0ZGF0YV9kaXIsICd0ZXN0a2V5Lng1MDkucGVtJykKKyAgICB3aXRoIG9wZW4oY2VydDNfcGF0aCkgYXMgY2VydDNfZnA6CisgICAgICBjZXJ0MyA9IGNlcnQzX2ZwLnJlYWQoKQorCisgICAgIyBSZXBsYWNlIGNlcnQxIHdpdGggY2VydDMuCisgICAgaW5wdXRfeG1sID0gc2VsZi5NQUNfUEVSTUlTU0lPTlNfWE1MLmZvcm1hdCgKKyAgICAgICAgYmFzZTY0LmIxNmVuY29kZShjb21tb24uUGFyc2VDZXJ0aWZpY2F0ZShjZXJ0MSkpLmxvd2VyKCksCisgICAgICAgIGJhc2U2NC5iMTZlbmNvZGUoY29tbW9uLlBhcnNlQ2VydGlmaWNhdGUoY2VydDIpKS5sb3dlcigpKQorCisgICAgb3V0cHV0X3htbCA9IHNlbGYuTUFDX1BFUk1JU1NJT05TX1hNTC5mb3JtYXQoCisgICAgICAgIGJhc2U2NC5iMTZlbmNvZGUoY29tbW9uLlBhcnNlQ2VydGlmaWNhdGUoY2VydDMpKS5sb3dlcigpLAorICAgICAgICBiYXNlNjQuYjE2ZW5jb2RlKGNvbW1vbi5QYXJzZUNlcnRpZmljYXRlKGNlcnQyKSkubG93ZXIoKSkKKworICAgIGNvbW1vbi5PUFRJT05TLmtleV9tYXAgPSB7CisgICAgICAgIGNlcnQxX3BhdGhbOi05XSA6IGNlcnQzX3BhdGhbOi05XSwKKyAgICB9CisKKyAgICBzZWxmLmFzc2VydEVxdWFsKG91dHB1dF94bWwsIFJlcGxhY2VDZXJ0cyhpbnB1dF94bWwpKQorCisgIGRlZiB0ZXN0X1JlcGxhY2VDZXJ0c19kdXBsaWNhdGVFbnRyaWVzKHNlbGYpOgorICAgIGNlcnQxX3BhdGggPSBvcy5wYXRoLmpvaW4oc2VsZi50ZXN0ZGF0YV9kaXIsICdwbGF0Zm9ybS54NTA5LnBlbScpCisgICAgd2l0aCBvcGVuKGNlcnQxX3BhdGgpIGFzIGNlcnQxX2ZwOgorICAgICAgY2VydDEgPSBjZXJ0MV9mcC5yZWFkKCkKKyAgICBjZXJ0Ml9wYXRoID0gb3MucGF0aC5qb2luKHNlbGYudGVzdGRhdGFfZGlyLCAnbWVkaWEueDUwOS5wZW0nKQorICAgIHdpdGggb3BlbihjZXJ0Ml9wYXRoKSBhcyBjZXJ0Ml9mcDoKKyAgICAgIGNlcnQyID0gY2VydDJfZnAucmVhZCgpCisKKyAgICAjIFJlcGxhY2UgY2VydDEgd2l0aCBjZXJ0Miwgd2hpY2ggbGVhZHMgdG8gZHVwbGljYXRlIGVudHJpZXMuCisgICAgaW5wdXRfeG1sID0gc2VsZi5NQUNfUEVSTUlTU0lPTlNfWE1MLmZvcm1hdCgKKyAgICAgICAgYmFzZTY0LmIxNmVuY29kZShjb21tb24uUGFyc2VDZXJ0aWZpY2F0ZShjZXJ0MSkpLmxvd2VyKCksCisgICAgICAgIGJhc2U2NC5iMTZlbmNvZGUoY29tbW9uLlBhcnNlQ2VydGlmaWNhdGUoY2VydDIpKS5sb3dlcigpKQorCisgICAgY29tbW9uLk9QVElPTlMua2V5X21hcCA9IHsKKyAgICAgICAgY2VydDFfcGF0aFs6LTldIDogY2VydDJfcGF0aFs6LTldLAorICAgIH0KKyAgICBzZWxmLmFzc2VydFJhaXNlcyhBc3NlcnRpb25FcnJvciwgUmVwbGFjZUNlcnRzLCBpbnB1dF94bWwpCisKKyAgZGVmIHRlc3RfUmVwbGFjZUNlcnRzX3NraXBOb25FeGlzdGVudENlcnRzKHNlbGYpOgorICAgIGNlcnQxX3BhdGggPSBvcy5wYXRoLmpvaW4oc2VsZi50ZXN0ZGF0YV9kaXIsICdwbGF0Zm9ybS54NTA5LnBlbScpCisgICAgd2l0aCBvcGVuKGNlcnQxX3BhdGgpIGFzIGNlcnQxX2ZwOgorICAgICAgY2VydDEgPSBjZXJ0MV9mcC5yZWFkKCkKKyAgICBjZXJ0Ml9wYXRoID0gb3MucGF0aC5qb2luKHNlbGYudGVzdGRhdGFfZGlyLCAnbWVkaWEueDUwOS5wZW0nKQorICAgIHdpdGggb3BlbihjZXJ0Ml9wYXRoKSBhcyBjZXJ0Ml9mcDoKKyAgICAgIGNlcnQyID0gY2VydDJfZnAucmVhZCgpCisgICAgY2VydDNfcGF0aCA9IG9zLnBhdGguam9pbihzZWxmLnRlc3RkYXRhX2RpciwgJ3Rlc3RrZXkueDUwOS5wZW0nKQorICAgIHdpdGggb3BlbihjZXJ0M19wYXRoKSBhcyBjZXJ0M19mcDoKKyAgICAgIGNlcnQzID0gY2VydDNfZnAucmVhZCgpCisKKyAgICBpbnB1dF94bWwgPSBzZWxmLk1BQ19QRVJNSVNTSU9OU19YTUwuZm9ybWF0KAorICAgICAgICBiYXNlNjQuYjE2ZW5jb2RlKGNvbW1vbi5QYXJzZUNlcnRpZmljYXRlKGNlcnQxKSkubG93ZXIoKSwKKyAgICAgICAgYmFzZTY0LmIxNmVuY29kZShjb21tb24uUGFyc2VDZXJ0aWZpY2F0ZShjZXJ0MikpLmxvd2VyKCkpCisKKyAgICBvdXRwdXRfeG1sID0gc2VsZi5NQUNfUEVSTUlTU0lPTlNfWE1MLmZvcm1hdCgKKyAgICAgICAgYmFzZTY0LmIxNmVuY29kZShjb21tb24uUGFyc2VDZXJ0aWZpY2F0ZShjZXJ0MykpLmxvd2VyKCksCisgICAgICAgIGJhc2U2NC5iMTZlbmNvZGUoY29tbW9uLlBhcnNlQ2VydGlmaWNhdGUoY2VydDIpKS5sb3dlcigpKQorCisgICAgY29tbW9uLk9QVElPTlMua2V5X21hcCA9IHsKKyAgICAgICAgY2VydDFfcGF0aFs6LTldIDogY2VydDNfcGF0aFs6LTldLAorICAgICAgICAnbm9uLWV4aXN0ZW50JyA6IGNlcnQzX3BhdGhbOi05XSwKKyAgICAgICAgY2VydDJfcGF0aFs6LTldIDogJ25vbi1leGlzdGVudCcsCisgICAgfQorICAgIHNlbGYuYXNzZXJ0RXF1YWwob3V0cHV0X3htbCwgUmVwbGFjZUNlcnRzKGlucHV0X3htbCkpCmRpZmYgLS1naXQgYS90b29scy9yZWxlYXNldG9vbHMvdGVzdF91dGlscy5weSBiL3Rvb2xzL3JlbGVhc2V0b29scy90ZXN0X3V0aWxzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExNWZmNWIKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9yZWxlYXNldG9vbHMvdGVzdF91dGlscy5weQpAQCAtMCwwICsxLDExMiBAQAorIworIyBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworIiIiCitVdGlscyBmb3IgcnVubmluZyB1bml0dGVzdHMuCisiIiIKKworaW1wb3J0IG9zCitpbXBvcnQgb3MucGF0aAoraW1wb3J0IHN0cnVjdAorCitpbXBvcnQgY29tbW9uCisKKworZGVmIGdldF90ZXN0ZGF0YV9kaXIoKToKKyAgIiIiUmV0dXJucyB0aGUgdGVzdGRhdGEgZGlyLCBpbiByZWxhdGl2ZSB0byB0aGUgc2NyaXB0IGRpci4iIiIKKyAgIyBUaGUgc2NyaXB0IGRpciBpcyB0aGUgb25lIHdlIHdhbnQsIHdoaWNoIGNvdWxkIGJlIGRpZmZlcmVudCBmcm9tIHB3ZC4KKyAgY3VycmVudF9kaXIgPSBvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5yZWFscGF0aChfX2ZpbGVfXykpCisgIHJldHVybiBvcy5wYXRoLmpvaW4oY3VycmVudF9kaXIsICd0ZXN0ZGF0YScpCisKKworZGVmIGdldF9zZWFyY2hfcGF0aCgpOgorICAiIiJSZXR1cm5zIHRoZSBzZWFyY2ggcGF0aCB0aGF0IGhhcyAnZnJhbWV3b3JrL3NpZ25hcGsuamFyJyB1bmRlci4iIiIKKyAgY3VycmVudF9kaXIgPSBvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5yZWFscGF0aChfX2ZpbGVfXykpCisgIGZvciBwYXRoIGluICgKKyAgICAgICMgSW4gcmVsYXRpdmUgdG8gJ2J1aWxkL21ha2UvdG9vbHMvcmVsZWFzZXRvb2xzJyBpbiB0aGUgQW5kcm9pZCBzb3VyY2UuCisgICAgICBbJy4uJ10gKiA0ICsgWydvdXQnLCAnaG9zdCcsICdsaW51eC14ODYnXSwKKyAgICAgICMgT3IgcnVubmluZyB0aGUgc2NyaXB0IHVucGFja2VkIGZyb20gb3RhdG9vbHMuemlwLgorICAgICAgWycuLiddKToKKyAgICBmdWxsX3BhdGggPSBvcy5wYXRoLnJlYWxwYXRoKG9zLnBhdGguam9pbihjdXJyZW50X2RpciwgKnBhdGgpKQorICAgIHNpZ25hcGtfcGF0aCA9IG9zLnBhdGgucmVhbHBhdGgoCisgICAgICAgIG9zLnBhdGguam9pbihmdWxsX3BhdGgsICdmcmFtZXdvcmsnLCAnc2lnbmFway5qYXInKSkKKyAgICBpZiBvcy5wYXRoLmV4aXN0cyhzaWduYXBrX3BhdGgpOgorICAgICAgcmV0dXJuIGZ1bGxfcGF0aAorICByZXR1cm4gTm9uZQorCisKK2RlZiBjb25zdHJ1Y3Rfc3BhcnNlX2ltYWdlKGNodW5rcyk6CisgICIiIlJldHVybnMgYSBzcGFyc2UgaW1hZ2UgZmlsZSBjb25zdHJ1Y3RlZCBmcm9tIHRoZSBnaXZlbiBjaHVua3MuCisKKyAgRnJvbSBzeXN0ZW0vY29yZS9saWJzcGFyc2Uvc3BhcnNlX2Zvcm1hdC5oLgorICB0eXBlZGVmIHN0cnVjdCBzcGFyc2VfaGVhZGVyIHsKKyAgICBfX2xlMzIgbWFnaWM7ICAvLyAweGVkMjZmZjNhCisgICAgX19sZTE2IG1ham9yX3ZlcnNpb247ICAvLyAoMHgxKSAtIHJlamVjdCBpbWFnZXMgd2l0aCBoaWdoZXIgbWFqb3IgdmVyc2lvbnMKKyAgICBfX2xlMTYgbWlub3JfdmVyc2lvbjsgIC8vICgweDApIC0gYWxsb3cgaW1hZ2VzIHdpdGggaGlnZXIgbWlub3IgdmVyc2lvbnMKKyAgICBfX2xlMTYgZmlsZV9oZHJfc3o7ICAvLyAyOCBieXRlcyBmb3IgZmlyc3QgcmV2aXNpb24gb2YgdGhlIGZpbGUgZm9ybWF0CisgICAgX19sZTE2IGNodW5rX2hkcl9zejsgIC8vIDEyIGJ5dGVzIGZvciBmaXJzdCByZXZpc2lvbiBvZiB0aGUgZmlsZSBmb3JtYXQKKyAgICBfX2xlMzIgYmxrX3N6OyAgLy8gYmxvY2sgc2l6ZSBpbiBieXRlcywgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQgKDQwOTYpCisgICAgX19sZTMyIHRvdGFsX2Jsa3M7ICAvLyB0b3RhbCBibG9ja3MgaW4gdGhlIG5vbi1zcGFyc2Ugb3V0cHV0IGltYWdlCisgICAgX19sZTMyIHRvdGFsX2NodW5rczsgIC8vIHRvdGFsIGNodW5rcyBpbiB0aGUgc3BhcnNlIGlucHV0IGltYWdlCisgICAgX19sZTMyIGltYWdlX2NoZWNrc3VtOyAgLy8gQ1JDMzIgY2hlY2tzdW0gb2YgdGhlIG9yaWdpbmFsIGRhdGEsIGNvdW50aW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gImRvbid0IGNhcmUiIGFzIDAuIFN0YW5kYXJkIDgwMi4zIHBvbHlub21pYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXNlIGEgUHVibGljIERvbWFpbiB0YWJsZSBpbXBsZW1lbnRhdGlvbgorICB9IHNwYXJzZV9oZWFkZXJfdDsKKworICB0eXBlZGVmIHN0cnVjdCBjaHVua19oZWFkZXIgeworICAgIF9fbGUxNiBjaHVua190eXBlOyAgLy8gMHhDQUMxIC0+IHJhdzsgMHhDQUMyIC0+IGZpbGw7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyAweENBQzMgLT4gZG9uJ3QgY2FyZQorICAgIF9fbGUxNiByZXNlcnZlZDE7CisgICAgX19sZTMyIGNodW5rX3N6OyAgLy8gaW4gYmxvY2tzIGluIG91dHB1dCBpbWFnZQorICAgIF9fbGUzMiB0b3RhbF9zejsgIC8vIGluIGJ5dGVzIG9mIGNodW5rIGlucHV0IGZpbGUgaW5jbHVkaW5nIGNodW5rIGhlYWRlcgorICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBkYXRhCisgIH0gY2h1bmtfaGVhZGVyX3Q7CisKKyAgQXJnczoKKyAgICBjaHVua3M6IEEgbGlzdCBvZiBjaHVua3MgdG8gYmUgd3JpdHRlbi4gRWFjaCBlbnRyeSBzaG91bGQgYmUgYSB0dXBsZSBvZgorICAgICAgICAoY2h1bmtfdHlwZSwgYmxvY2tfbnVtYmVyKS4KKworICBSZXR1cm5zOgorICAgIEZpbGVuYW1lIG9mIHRoZSBjcmVhdGVkIHNwYXJzZSBpbWFnZS4KKyAgIiIiCisgIFNQQVJTRV9IRUFERVJfTUFHSUMgPSAweEVEMjZGRjNBCisgIFNQQVJTRV9IRUFERVJfRk9STUFUID0gIjxJNEg0SSIKKyAgQ0hVTktfSEVBREVSX0ZPUk1BVCA9ICI8MkgySSIKKworICBzcGFyc2VfaW1hZ2UgPSBjb21tb24uTWFrZVRlbXBGaWxlKHByZWZpeD0nc3BhcnNlLScsIHN1ZmZpeD0nLmltZycpCisgIHdpdGggb3BlbihzcGFyc2VfaW1hZ2UsICd3YicpIGFzIGZwOgorICAgIGZwLndyaXRlKHN0cnVjdC5wYWNrKAorICAgICAgICBTUEFSU0VfSEVBREVSX0ZPUk1BVCwgU1BBUlNFX0hFQURFUl9NQUdJQywgMSwgMCwgMjgsIDEyLCA0MDk2LAorICAgICAgICBzdW0oY2h1bmtbMV0gZm9yIGNodW5rIGluIGNodW5rcyksCisgICAgICAgIGxlbihjaHVua3MpLCAwKSkKKworICAgIGZvciBjaHVuayBpbiBjaHVua3M6CisgICAgICBkYXRhX3NpemUgPSAwCisgICAgICBpZiBjaHVua1swXSA9PSAweENBQzE6CisgICAgICAgIGRhdGFfc2l6ZSA9IDQwOTYgKiBjaHVua1sxXQorICAgICAgZWxpZiBjaHVua1swXSA9PSAweENBQzI6CisgICAgICAgIGRhdGFfc2l6ZSA9IDQKKyAgICAgIGVsaWYgY2h1bmtbMF0gPT0gMHhDQUMzOgorICAgICAgICBwYXNzCisgICAgICBlbHNlOgorICAgICAgICBhc3NlcnQgRmFsc2UsICJVbnN1cHBvcnRlZCBjaHVuayB0eXBlOiB7fSIuZm9ybWF0KGNodW5rWzBdKQorCisgICAgICBmcC53cml0ZShzdHJ1Y3QucGFjaygKKyAgICAgICAgICBDSFVOS19IRUFERVJfRk9STUFULCBjaHVua1swXSwgMCwgY2h1bmtbMV0sIGRhdGFfc2l6ZSArIDEyKSkKKyAgICAgIGlmIGRhdGFfc2l6ZSAhPSAwOgorICAgICAgICBmcC53cml0ZShvcy51cmFuZG9tKGRhdGFfc2l6ZSkpCisKKyAgcmV0dXJuIHNwYXJzZV9pbWFnZQpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVsZWFzZXRvb2xzL3Rlc3RkYXRhL21lZGlhLng1MDkucGVtIGIvdG9vbHMvcmVsZWFzZXRvb2xzL3Rlc3RkYXRhL21lZGlhLng1MDkucGVtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4Y2Q0NDMKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9yZWxlYXNldG9vbHMvdGVzdGRhdGEvbWVkaWEueDUwOS5wZW0KQEAgLTAsMCArMSwyNyBAQAorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlFcURDQ0E1Q2dBd0lCQWdJSkFQSzVqbUVqVnl4T01BMEdDU3FHU0liM0RRRUJCQVVBTUlHVU1Rc3dDUVlECitWUVFHRXdKVlV6RVRNQkVHQTFVRUNCTUtRMkZzYVdadmNtNXBZVEVXTUJRR0ExVUVCeE1OVFc5MWJuUmhhVzRnCitWbWxsZHpFUU1BNEdBMVVFQ2hNSFFXNWtjbTlwWkRFUU1BNEdBMVVFQ3hNSFFXNWtjbTlwWkRFUU1BNEdBMVVFCitBeE1IUVc1a2NtOXBaREVpTUNBR0NTcUdTSWIzRFFFSkFSWVRZVzVrY205cFpFQmhibVJ5YjJsa0xtTnZiVEFlCitGdzB3T0RBME1UVXlNelF3TlRkYUZ3MHpOVEE1TURFeU16UXdOVGRhTUlHVU1Rc3dDUVlEVlFRR0V3SlZVekVUCitNQkVHQTFVRUNCTUtRMkZzYVdadmNtNXBZVEVXTUJRR0ExVUVCeE1OVFc5MWJuUmhhVzRnVm1sbGR6RVFNQTRHCitBMVVFQ2hNSFFXNWtjbTlwWkRFUU1BNEdBMVVFQ3hNSFFXNWtjbTlwWkRFUU1BNEdBMVVFQXhNSFFXNWtjbTlwCitaREVpTUNBR0NTcUdTSWIzRFFFSkFSWVRZVzVrY205cFpFQmhibVJ5YjJsa0xtTnZiVENDQVNBd0RRWUpLb1pJCitodmNOQVFFQkJRQURnZ0VOQURDQ0FRZ0NnZ0VCQUs0bERGb1c3NWY4S0dtc1pSc3lGOHcydWc2R2xrRm8xWW9FCituMERPaFlaeEk2UC90UGJaU2NNODh0bzZCY0krcktwWDJBT0lteGRadlBXZWZHOGhpUXJpVUlXMzdWYXFZbXdKCitpZStjelRZMkxLRG8wYmxnUDlUWU1vZG5rbXpNQ1F4b3QzV3VmL01KTk13Mm52S0ZXaVpuM3d4bWY5REh6MTJPCit1bVZZQm5OekE3dGlSeWJxdXUzN2N2QisxNmRxczh1YU9CeExmYzJBbXhRTmlSOEFJVHZrQWZXTmFnYW1IcTNECitxY0x4eGxaeWhiQ2E0Sk5DcG0ra0llcjVPdDkxYzZBb3d6SFhCZ0dyT3ZmTWhBTSt6bngzS2pwYmhyRGI2ZGQzCit3NlNLcVlBZTNPNG5nVmlmUk5ua0VUbDVZQVYycVpRUXVvRUpFbG5hMll4c2FQOTRTNDhDQVFPamdmd3dnZmt3CitIUVlEVlIwT0JCWUVGTW9wUEtxTHdPMCtWQzd2UWdXaXYvSzFmazExTUlISkJnTlZIU01FZ2NFd2diNkFGTW9wCitQS3FMd08wK1ZDN3ZRZ1dpdi9LMWZrMTFvWUdhcElHWE1JR1VNUXN3Q1FZRFZRUUdFd0pWVXpFVE1CRUdBMVVFCitDQk1LUTJGc2FXWnZjbTVwWVRFV01CUUdBMVVFQnhNTlRXOTFiblJoYVc0Z1ZtbGxkekVRTUE0R0ExVUVDaE1ICitRVzVrY205cFpERVFNQTRHQTFVRUN4TUhRVzVrY205cFpERVFNQTRHQTFVRUF4TUhRVzVrY205cFpERWlNQ0FHCitDU3FHU0liM0RRRUpBUllUWVc1a2NtOXBaRUJoYm1SeWIybGtMbU52YllJSkFQSzVqbUVqVnl4T01Bd0dBMVVkCitFd1FGTUFNQkFmOHdEUVlKS29aSWh2Y05BUUVFQlFBRGdnRUJBSVRlbFJiVjVLaHlGNmM5cUVod1NQVXpjNlgzCitNL09RMWh2ZlBNbmxKUllsdjhxbnd4V2NyaWRkRnlxYTRlaDIxVVdCSjZ4VUwyZ3BEZFVRd0FLZGoxSGc3aFZyCitlM3RhemJPVUpCdU94NHQwNWNRc1hLK3VGV3l2VzlHWm9qb25VazJnY3Q2NzQzaEdTbE0yTUxEazBQKzM0STdMCitjQit0dGplY2RFWi9iZ0RHN1lpRmxUZ0hrZ09IVmdCNGNzampBSHIwSTZWNkxLczZLQ2hwdGt4TGU5WDhHSDBLCitmaVFWbGwxYXJrNEhwdDkxRzBwMTZYazhrWXBoSzRITkMyS0s3Z0ZvM0VUa2V4RFRXVEpnaEoxcTMyMXlmY0pFCitSTUloMC9uc3cyakswSG1aOHJnUVc4SHlEVGpVRUdiTUZCSENWNmx1cERTZlYwWldWUWZrNkFJS0dvRT0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbGVhc2V0b29scy90ZXN0ZGF0YS9wYXlsb2FkX3NpZ25lci5zaCBiL3Rvb2xzL3JlbGVhc2V0b29scy90ZXN0ZGF0YS9wYXlsb2FkX3NpZ25lci5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hNDRlZjM0Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcmVsZWFzZXRvb2xzL3Rlc3RkYXRhL3BheWxvYWRfc2lnbmVyLnNoCkBAIC0wLDAgKzEsNCBAQAorIyEvYmluL3NoCisKKyMgVGhlIHNjcmlwdCB3aWxsIGJlIGNhbGxlZCB3aXRoICdwYXlsb2FkX3NpZ25lci5zaCA8a2V5PiAtaW4gPGlucHV0PiAtb3V0IDxvdXRwdXQ+Jy4KK29wZW5zc2wgcGtleXV0bCAtc2lnbiAta2V5Zm9ybSBERVIgLWlua2V5ICQxIC1wa2V5b3B0IGRpZ2VzdDpzaGEyNTYgLWluICQzIC1vdXQgJDUKZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbGVhc2V0b29scy90ZXN0ZGF0YS9wbGF0Zm9ybS54NTA5LnBlbSBiL3Rvb2xzL3JlbGVhc2V0b29scy90ZXN0ZGF0YS9wbGF0Zm9ybS54NTA5LnBlbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODdmMDJlCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcmVsZWFzZXRvb2xzL3Rlc3RkYXRhL3BsYXRmb3JtLng1MDkucGVtCkBAIC0wLDAgKzEsMjcgQEAKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJRXFEQ0NBNUNnQXdJQkFnSUpBTE9aZ0liUVZzLzZNQTBHQ1NxR1NJYjNEUUVCQkFVQU1JR1VNUXN3Q1FZRAorVlFRR0V3SlZVekVUTUJFR0ExVUVDQk1LUTJGc2FXWnZjbTVwWVRFV01CUUdBMVVFQnhNTlRXOTFiblJoYVc0ZworVm1sbGR6RVFNQTRHQTFVRUNoTUhRVzVrY205cFpERVFNQTRHQTFVRUN4TUhRVzVrY205cFpERVFNQTRHQTFVRQorQXhNSFFXNWtjbTlwWkRFaU1DQUdDU3FHU0liM0RRRUpBUllUWVc1a2NtOXBaRUJoYm1SeWIybGtMbU52YlRBZQorRncwd09EQTBNVFV5TWpRd05UQmFGdzB6TlRBNU1ERXlNalF3TlRCYU1JR1VNUXN3Q1FZRFZRUUdFd0pWVXpFVAorTUJFR0ExVUVDQk1LUTJGc2FXWnZjbTVwWVRFV01CUUdBMVVFQnhNTlRXOTFiblJoYVc0Z1ZtbGxkekVRTUE0RworQTFVRUNoTUhRVzVrY205cFpERVFNQTRHQTFVRUN4TUhRVzVrY205cFpERVFNQTRHQTFVRUF4TUhRVzVrY205cAorWkRFaU1DQUdDU3FHU0liM0RRRUpBUllUWVc1a2NtOXBaRUJoYm1SeWIybGtMbU52YlRDQ0FTQXdEUVlKS29aSQoraHZjTkFRRUJCUUFEZ2dFTkFEQ0NBUWdDZ2dFQkFKeDRCWktzRFYwNEhONnFaZXpJcGdCdU5rZ01iWElIc1NBUgordmxDR09xdml0VjBBbXQ5eFJ0YnlJQ0tBeDgxTmU5c21KRHVLZ0d3bXMwc1RkU09ra21naVNRVGNBVWsrZkFyUAorR2dYSWRQYWJBM3RnTUoyUWROSkNnT0ZyclNxSE5EWVpVZXIzS2tndENiSUVzWWRlRXF5WXdhcDNQV2dBdWVyOQorNVcxWXZ0am8yaGI1bzJBSm5EZW9OS2JmN2JlMnRFb0VuZ2VpYWZ6UExGU1c4czgyMWszNUNqdU5qelNqdXF0TQorOVROeHF5ZHhtenVsaDFTdERGUDhGT0hiUmRVZUkwKzc2VHlicE8zNXpsUW1FMURzVTFZSHYybWkvMHFnZmJYMworNmlBTkNhYkJ0SjRoUUMrSjdSR1FpVHFyV3BHQThWTG9MNFdrVjFQUFg4R1FjY1h1eUNjQ0FRT2pnZnd3Z2ZrdworSFFZRFZSME9CQllFRkUva29MUGRuTG9wOXgxeWg4VG53NDhnaHNLWk1JSEpCZ05WSFNNRWdjRXdnYjZBRkUvaworb0xQZG5Mb3A5eDF5aDhUbnc0OGdoc0tab1lHYXBJR1hNSUdVTVFzd0NRWURWUVFHRXdKVlV6RVRNQkVHQTFVRQorQ0JNS1EyRnNhV1p2Y201cFlURVdNQlFHQTFVRUJ4TU5UVzkxYm5SaGFXNGdWbWxsZHpFUU1BNEdBMVVFQ2hNSAorUVc1a2NtOXBaREVRTUE0R0ExVUVDeE1IUVc1a2NtOXBaREVRTUE0R0ExVUVBeE1IUVc1a2NtOXBaREVpTUNBRworQ1NxR1NJYjNEUUVKQVJZVFlXNWtjbTlwWkVCaGJtUnliMmxrTG1OdmJZSUpBTE9aZ0liUVZzLzZNQXdHQTFVZAorRXdRRk1BTUJBZjh3RFFZSktvWklodmNOQVFFRUJRQURnZ0VCQUZjbFVialpPaDl6M2c5dFJwK0cydFp3RkFBcAorUElpZ3pYelhlTGM5cjh3WmY2dDI1aUV1VnNISFljL0VMOWN6M2xMRkN1Q0lGTTc4Q2p0YUdrTkdCVTJDbngyQwordENzZ1NMK0l0ZEZKS2UrRjlnN2RFdGN0VldWK0l1UG9YUVRJTWRZVDBaazR1NG1DSkgraklTVnJvUzBkYW8rUworNmgyeHczTXhlNkRBTi9EUnIvWkZydklrbDUrNmJub1V2QUpjY2JtQk9NN3ozZndGbGhmUEpJUmM5N1FOWTRMMworSjE3WE9FbGF0dVdURzVRaGRseEpHM0w3YU9DQTI5dFl3Z0tkTkh5TE1vemtQdmFvc1ZVejdmdnBpYjFxU04xTAorSUM3YWxNYXJqZFc0T1pJRDJxNHUxRVlqTGsvcHZaWVRsTVl3RGxFNDQ4L1NoZWJrNUlOVGpMaXhzMWM9CistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCmRpZmYgLS1naXQgYS90b29scy9yZWxlYXNldG9vbHMvdGVzdGRhdGEvc2lnZmlsZS5iaW4gYi90b29scy9yZWxlYXNldG9vbHMvdGVzdGRhdGEvc2lnZmlsZS5iaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODY4MjIxNgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3JlbGVhc2V0b29scy90ZXN0ZGF0YS9zaWdmaWxlLmJpbgpAQCAtMCwwICsxIEBACisHulHgwtyilKG9qEdw+KPV+RD5sNTWJ1s0S+kQTKEIYwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbGVhc2V0b29scy90ZXN0ZGF0YS9zaWduZWQtc2lnZmlsZS5iaW4gYi90b29scy9yZWxlYXNldG9vbHMvdGVzdGRhdGEvc2lnbmVkLXNpZ2ZpbGUuYmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2ZDJmOWUKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9yZWxlYXNldG9vbHMvdGVzdGRhdGEvc2lnbmVkLXNpZ2ZpbGUuYmluCkBAIC0wLDAgKzEsMiBAQAorUqEFE50mi0X/c8ERJfg/uXyknCaPzYDxemJTikFb33Rx5xuGV0vSkWwUpuDZ2eVzpdJ+RmPmCY8OYJ6vvs0jCitUe93X271GrQbSwZ94g/gxiR82zIs9UbCVjFbmGl5U37DYDnhYo7Yv/iOp6kkn3BfudGNMBBxwk5OsBq2f6292etGSUuE69fNX/jkoucEEMjbbzKzhHWLCQlAxuDYW427S37FR1UOpZ5BoO3KJsk99ECXEvfWIkBjhbzYU45RkE5PqAhS0yeMH5TJZYKbVDNu8qqVfUpNPckNhLOhJIm4oYJbtbvHc0GJhafa5xajUGuRThNfKKWueHE9bYDZjrGUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90b29scy9yZWxlYXNldG9vbHMvdGVzdGRhdGEvdGVzdGtleS5wazggYi90b29scy9yZWxlYXNldG9vbHMvdGVzdGRhdGEvdGVzdGtleS5wazgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTliZTI5MQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3JlbGVhc2V0b29scy90ZXN0ZGF0YS90ZXN0a2V5LnBrOApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9yZWxlYXNldG9vbHMvdGVzdGRhdGEvdGVzdGtleS5wdWJrZXkucGVtIGIvdG9vbHMvcmVsZWFzZXRvb2xzL3Rlc3RkYXRhL3Rlc3RrZXkucHVia2V5LnBlbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MThhZTYwCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcmVsZWFzZXRvb2xzL3Rlc3RkYXRhL3Rlc3RrZXkucHVia2V5LnBlbQpAQCAtMCwwICsxLDkgQEAKKy0tLS0tQkVHSU4gUFVCTElDIEtFWS0tLS0tCitNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQXZqdnlPMkx3V2dtUU55cTd6K3hLCiswNGVnMHQzQUw0eTJOaHBBQU96Vm5GeUNBckZjRmpMVEdRRER2a2JaUDZOMTJPNitkd0pvUExudG5tOUErVm5QCitJRkZSSGcwSFVXU2JITStRazhKZ3YyLzJBVmtBVWo1SjFyOXQ0WCsyV0kwZVJ6SlAxNVpqbjY4cFFLR21jeWNpCityeTBnYnZtWXZYTDJaVW1UbTU2RG1FZkNVQ1JJWTJJR0ovQ2NNbkZlSXRWVTBMeEtzVjVNbHQ1Qk8wVnYvQ1Y0CitFYWlPTHd5Q25vWnVVaFl0bzdkSGxPLzQ3di9IOXpoa0pDNTRPQTFka0QzOEVQZ081R25maEdGU05YUVJtSkRUCitYckZnZDZPK1FPNHlVTlg4bFlQMTBNemltVXBJdFphMDV0NjhOQURxd1lsM1Q3bld6dnVDOXI0SXFaRHlQZjIxCitUUUlEQVFBQgorLS0tLS1FTkQgUFVCTElDIEtFWS0tLS0tCmRpZmYgLS1naXQgYS90b29scy9yZWxlYXNldG9vbHMvdGVzdGRhdGEvdGVzdGtleS54NTA5LnBlbSBiL3Rvb2xzL3JlbGVhc2V0b29scy90ZXN0ZGF0YS90ZXN0a2V5Lng1MDkucGVtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1YzgwODUKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9yZWxlYXNldG9vbHMvdGVzdGRhdGEvdGVzdGtleS54NTA5LnBlbQpAQCAtMCwwICsxLDI0IEBACistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUVBRENDQXVpZ0F3SUJBZ0lKQU4vRnZqWXpHTk9LTUEwR0NTcUdTSWIzRFFFQkN3VUFNSUdVTVFzd0NRWUQKK1ZRUUdFd0pWVXpFVE1CRUdBMVVFQ0F3S1EyRnNhV1p2Y201cFlURVdNQlFHQTFVRUJ3d05UVzkxYm5SaGFXNGcKK1ZtbGxkekVRTUE0R0ExVUVDZ3dIUVc1a2NtOXBaREVRTUE0R0ExVUVDd3dIUVc1a2NtOXBaREVRTUE0R0ExVUUKK0F3d0hRVzVrY205cFpERWlNQ0FHQ1NxR1NJYjNEUUVKQVJZVFlXNWtjbTlwWkVCaGJtUnliMmxrTG1OdmJUQWUKK0Z3MHhPREF4TVRnd01ETTBOVEZhRncwME5UQTJNRFV3TURNME5URmFNSUdVTVFzd0NRWURWUVFHRXdKVlV6RVQKK01CRUdBMVVFQ0F3S1EyRnNhV1p2Y201cFlURVdNQlFHQTFVRUJ3d05UVzkxYm5SaGFXNGdWbWxsZHpFUU1BNEcKK0ExVUVDZ3dIUVc1a2NtOXBaREVRTUE0R0ExVUVDd3dIUVc1a2NtOXBaREVRTUE0R0ExVUVBd3dIUVc1a2NtOXAKK1pERWlNQ0FHQ1NxR1NJYjNEUUVKQVJZVFlXNWtjbTlwWkVCaGJtUnliMmxrTG1OdmJUQ0NBU0l3RFFZSktvWkkKK2h2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTDQ3OGp0aThGb0prRGNxdTgvc1N0T0hvTkxkd0MrTXRqWWEKK1FBRHMxWnhjZ2dLeFhCWXkweGtBdzc1RzJUK2pkZGp1dm5jQ2FEeTU3WjV2UVBsWnp5QlJVUjROQjFGa214elAKK2tKUENZTDl2OWdGWkFGSStTZGEvYmVGL3RsaU5Ia2N5VDllV1k1K3ZLVUNocG5NbklxOHRJRzc1bUwxeTltVkoKK2s1dWVnNWhId2xBa1NHTmlCaWZ3bkRKeFhpTFZWTkM4U3JGZVRKYmVRVHRGYi93bGVCR29qaThNZ3A2R2JsSVcKK0xhTzNSNVR2K083L3gvYzRaQ1F1ZURnTlhaQTkvQkQ0RHVScDM0UmhValYwRVppUTAxNnhZSGVqdmtEdU1sRFYKKy9KV0Q5ZERNNHBsS1NMV1d0T2JldkRRQTZzR0pkMCs1MXM3N2d2YStDS21ROGozOXRVMENBd0VBQWFOVE1GRXcKK0hRWURWUjBPQkJZRUZOSlBKWkRwcTZ0Yy8xOVoya3hQQTJiajlENlVNQjhHQTFVZEl3UVlNQmFBRk5KUEpaRHAKK3E2dGMvMTlaMmt4UEEyYmo5RDZVTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3RFFZSktvWklodmNOQVFFTEJRQUQKK2dnRUJBQlNVRzlxcndWM1djQ2xESndxa05MTjR5ZVZWWXprUk1HQTgvWHFPaVlyVzR6aDBtS0RMZnI2T2VVMUMKK0FLd1pCTGhocWw1OVBvMjVyNGdjd1BpVE4yRGtvQ2ZiM1Q1OVhHOEo1NFBBZ1RRaklBWjNKK21HWnBsbm11RDMKK3dqK1VHVXBQZTBxVHIzM1pQb0pmd3hWbzRSVm5PdC9VQ3NJR1hjaDBIUy9CSWRwZWNocVAwdzRyT0hVYnE2RUEKKzhVRWk1aXJLU0RPVTliLzVyRC90WDJmNG5Hd0psS1FFSFdyc2o5TExLbGFMN2ZYMzZnaG9TeE4vcEJKT2hlZGcKKy9WalQ2eGJhRXdmeWhDNlpqOWF2NVhsN1VkcFl0K3JCTXJvQUdlbnowT1N4S2hJcGhkY3g0Wk1odmZrQm9ZRzkKK0NydXBkcWUra1VzZmcyUmxQYjVnclEza2xNbz0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbGVhc2V0b29scy90ZXN0ZGF0YS90ZXN0a2V5X3dpdGhfcGFzc3dkLnBrOCBiL3Rvb2xzL3JlbGVhc2V0b29scy90ZXN0ZGF0YS90ZXN0a2V5X3dpdGhfcGFzc3dkLnBrOApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDU2N2RlCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcmVsZWFzZXRvb2xzL3Rlc3RkYXRhL3Rlc3RrZXlfd2l0aF9wYXNzd2QucGs4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbGVhc2V0b29scy90ZXN0ZGF0YS90ZXN0a2V5X3dpdGhfcGFzc3dkLng1MDkucGVtIGIvdG9vbHMvcmVsZWFzZXRvb2xzL3Rlc3RkYXRhL3Rlc3RrZXlfd2l0aF9wYXNzd2QueDUwOS5wZW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQ5Mzk2ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3JlbGVhc2V0b29scy90ZXN0ZGF0YS90ZXN0a2V5X3dpdGhfcGFzc3dkLng1MDkucGVtCkBAIC0wLDAgKzEsMjQgQEAKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJRUFEQ0NBdWlnQXdJQkFnSUpBTmVmVWQzUGl1MHlNQTBHQ1NxR1NJYjNEUUVCQ3dVQU1JR1VNUXN3Q1FZRAorVlFRR0V3SlZVekVUTUJFR0ExVUVDQXdLUTJGc2FXWnZjbTVwWVRFV01CUUdBMVVFQnd3TlRXOTFiblJoYVc0ZworVm1sbGR6RVFNQTRHQTFVRUNnd0hRVzVrY205cFpERVFNQTRHQTFVRUN3d0hRVzVrY205cFpERVFNQTRHQTFVRQorQXd3SFFXNWtjbTlwWkRFaU1DQUdDU3FHU0liM0RRRUpBUllUWVc1a2NtOXBaRUJoYm1SeWIybGtMbU52YlRBZQorRncweE9EQXhNVGd3TURJM05EUmFGdzAwTlRBMk1EVXdNREkzTkRSYU1JR1VNUXN3Q1FZRFZRUUdFd0pWVXpFVAorTUJFR0ExVUVDQXdLUTJGc2FXWnZjbTVwWVRFV01CUUdBMVVFQnd3TlRXOTFiblJoYVc0Z1ZtbGxkekVRTUE0RworQTFVRUNnd0hRVzVrY205cFpERVFNQTRHQTFVRUN3d0hRVzVrY205cFpERVFNQTRHQTFVRUF3d0hRVzVrY205cAorWkRFaU1DQUdDU3FHU0liM0RRRUpBUllUWVc1a2NtOXBaRUJoYm1SeWIybGtMbU52YlRDQ0FTSXdEUVlKS29aSQoraHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFMQm9BNGMrcUNRS2FwUUFWR2NsYm91c0M1Si9MMFROWkpFZAorS1NXMm56WFVISXdnVFEzcjgyMjI3eGtJdmpucVhNQ3NjMHEzL04yZ0dLUjRzSHFBMzBKTzlEeWZnc3gxSVNhUgorR1hlNWNHMDQ4bTVVNXNucGxRZ3ZQb3Z0YWg5Wnl2d05QeldQWUMzdWNlSmFEeEtRS3dWZHNWK21PV002V21wUQorYmRMTzM3anhmeXR5QWJ6YXozc0c1SEEzRlNCOHJYL3hETTZJZjE4TnN4U0hwY2phT2paWEM0Rmc2d2xwMGtsWQorNS9xaEZFZG1pZXUyelFWZWxYam9KZktTa3U4dFBhN2taZURVL0YzdUxVcS9VL3h2Rms3TlZzUlYrUXZZT2RRSworMVFFQ2MvM3l2MVRLTkFOM2h1V1RnekNYNmJNSG1pMDlOcHczTVFhR1kwb1MzNGNIOXgwQ0F3RUFBYU5UTUZFdworSFFZRFZSME9CQllFRk5zSlowbjlPcGVlYTByVkF6TCsxandrREt6UE1COEdBMVVkSXdRWU1CYUFGTnNKWjBuOQorT3BlZWEwclZBekwrMWp3a0RLelBNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdEUVlKS29aSWh2Y05BUUVMQlFBRAorZ2dFQkFKL2J6SXpBK05yWXdQRXY1NlhLZjZWdWo4MStNMXJUSEFzSDlQcWJPdkpUN2lNN2FVN3dBbDZ2bVhBbworRFF0dktvT0JNZElYcHJhcHdlMHF1SENRbTdQR3hnK1JSZWdyK2RjVFNWSkZ2MXBsbk9ET0JPRUFWbEVmRnd1VworQ3owVVNGMmpyTnErNGNpSDV6UEwxYTMxT05iMXJNa3hKWFEvdEFpMHg4bTZ0WnoranNiRTB3TzZxQjgwVW1rQQorNFdZMlR1L2duQXZGcEQ4cGxraVUwRUt3ZWRCSEFjYUZGWmtRcDIzTUtzVlozVUJxc3F6emZYRFlWMU9hNnJJeQorWElacEkyR3g3NXB2QWI1N1QyYXAveWwwREJFQXU3Tm1wbGwwR0NzZ2VKVmR5N3RTNExOajk2UXV5YTNDSFdRdworV05UVnVhbjBLWnF3REltNFhuMW9IVUZROXZjPQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVsZWFzZXRvb2xzL3Rlc3RkYXRhL3Zlcml0eS54NTA5LnBlbSBiL3Rvb2xzL3JlbGVhc2V0b29scy90ZXN0ZGF0YS92ZXJpdHkueDUwOS5wZW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODYzOTljMwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3JlbGVhc2V0b29scy90ZXN0ZGF0YS92ZXJpdHkueDUwOS5wZW0KQEAgLTAsMCArMSwyNCBAQAorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlEL1RDQ0F1V2dBd0lCQWdJSkFKY1BtRGtKcW9sSk1BMEdDU3FHU0liM0RRRUJCUVVBTUlHVU1Rc3dDUVlECitWUVFHRXdKVlV6RVRNQkVHQTFVRUNBd0tRMkZzYVdadmNtNXBZVEVXTUJRR0ExVUVCd3dOVFc5MWJuUmhhVzRnCitWbWxsZHpFUU1BNEdBMVVFQ2d3SFFXNWtjbTlwWkRFUU1BNEdBMVVFQ3d3SFFXNWtjbTlwWkRFUU1BNEdBMVVFCitBd3dIUVc1a2NtOXBaREVpTUNBR0NTcUdTSWIzRFFFSkFSWVRZVzVrY205cFpFQmhibVJ5YjJsa0xtTnZiVEFlCitGdzB4TkRFeE1EWXhPVEEzTkRCYUZ3MDBNakF6TWpReE9UQTNOREJhTUlHVU1Rc3dDUVlEVlFRR0V3SlZVekVUCitNQkVHQTFVRUNBd0tRMkZzYVdadmNtNXBZVEVXTUJRR0ExVUVCd3dOVFc5MWJuUmhhVzRnVm1sbGR6RVFNQTRHCitBMVVFQ2d3SFFXNWtjbTlwWkRFUU1BNEdBMVVFQ3d3SFFXNWtjbTlwWkRFUU1BNEdBMVVFQXd3SFFXNWtjbTlwCitaREVpTUNBR0NTcUdTSWIzRFFFSkFSWVRZVzVrY205cFpFQmhibVJ5YjJsa0xtTnZiVENDQVNJd0RRWUpLb1pJCitodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQU9qcmVFMHZUVlNSZW51ek85dm5hV2ZrMGVRellhYjBncXBpCis2eEF6aTZkbUQrdWdvRUtKbWJQaXVFNUR3ZjIxaXNaOXVoVVV1MGRRTTQ2ZEs0b2NLeE1ScmNubUd4eWRGbjZvCitmczNPREpNWE9rdjJnS1hML0ZkYkVQZERieHpkdTh6M3lrK1c2N3VkTS9mVzdXYmFRM0RPMGtudStpekthay8zCitUNDFjNXVvWG1RODFVTnRBelJHekdjaE5WWE1tV3VUR09rZzZVKzBJMlRkN0s4eXZVTVdoQVdQUHBLTHRWSDlyCitBTDVUempZTlI5Mml6ZEtjejNBalJzSTNDVGp0cGlWQUJHZVgwVGNqUlN1WkI3SzlFSzU2SFYrT0ZOUzZJMU5QCitqZEQ3RklTaHlHbHFxWmRVT2tBVVpZYW5icGdlVDVON1FMNnV1cWNHcG9UT2thbHU2a2tDQXdFQUFhTlFNRTR3CitIUVlEVlIwT0JCWUVGSDVETS9tN29BcmY0TzNwZWVLTzBaSUVrclFQTUI4R0ExVWRJd1FZTUJhQUZINURNL203CitvQXJmNE8zcGVlS08wWklFa3JRUE1Bd0dBMVVkRXdRRk1BTUJBZjh3RFFZSktvWklodmNOQVFFRkJRQURnZ0VCCitBSE8zTlN2REU1akZ2TWVoR0d0UzhCbkZZZEZLUklnbERNYzRuaVdTemh6T1ZZUkg0V2FqeGR0QldjNWZ4MGl4CitORi8raFZLVmhQNkFJT1FhKysrc2srSElpN1J2aW9QUGJoamNzVmxaZTdjVUVHckxTU3ZlR291UXljK2owK202CitKRjg0a3N6SWw1R0dOTVRueDBYUlBPK2c4dDZoNUxXZm5WeWRnWmZwR1JSZytXSGV3azFVMkhsdlRqSWNlYjBOCitkY29KOFdLSkFGV2RjdUU3VkltNHcrdkYvRFlYL0EyT3l6cjIrUVJobVlTdjFjdXNnQWVDMXR2SDRhcCtKMUxnCitVbk91NUtoL0ZxUExMU3dOVlFwNEJ1N2I5UUZmcUs4TW9qODRiajg4TnFSR1pnRHlxenVUckZ4bjZGVzdkbXlBCit5dHR1QUpBRUF5bWsxbWlwZDkrenAzOD0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbGVhc2V0b29scy92YWxpZGF0ZV90YXJnZXRfZmlsZXMucHkgYi90b29scy9yZWxlYXNldG9vbHMvdmFsaWRhdGVfdGFyZ2V0X2ZpbGVzLnB5CmluZGV4IGIwNjVhMjEuLjhjOWUwN2MgMTAwNzU1Ci0tLSBhL3Rvb2xzL3JlbGVhc2V0b29scy92YWxpZGF0ZV90YXJnZXRfZmlsZXMucHkKKysrIGIvdG9vbHMvcmVsZWFzZXRvb2xzL3ZhbGlkYXRlX3RhcmdldF9maWxlcy5weQpAQCAtMjMsNDAgKzIzLDI0IEBACiAgICBzYW1lIGNoZWNrIGFsc28gYXBwbGllcyB0byB0aGUgdmVuZG9yIGltYWdlIGlmIHByZXNlbnQuCiAiIiIKIAotaW1wb3J0IGNvbW1vbgogaW1wb3J0IGxvZ2dpbmcKIGltcG9ydCBvcy5wYXRoCiBpbXBvcnQgcmUKLWltcG9ydCBzcGFyc2VfaW1nCiBpbXBvcnQgc3lzCitpbXBvcnQgemlwZmlsZQogCi0KLWRlZiBfR2V0SW1hZ2Uod2hpY2gsIHRtcGRpcik6Ci0gIGFzc2VydCB3aGljaCBpbiAoJ3N5c3RlbScsICd2ZW5kb3InKQotCi0gIHBhdGggPSBvcy5wYXRoLmpvaW4odG1wZGlyLCAnSU1BR0VTJywgd2hpY2ggKyAnLmltZycpCi0gIG1hcHBhdGggPSBvcy5wYXRoLmpvaW4odG1wZGlyLCAnSU1BR0VTJywgd2hpY2ggKyAnLm1hcCcpCi0KLSAgIyBNYXAgZmlsZSBtdXN0IGV4aXN0IChhbGxvd2VkIHRvIGJlIGVtcHR5KS4KLSAgYXNzZXJ0IG9zLnBhdGguZXhpc3RzKHBhdGgpIGFuZCBvcy5wYXRoLmV4aXN0cyhtYXBwYXRoKQotCi0gIGNsb2JiZXJlZF9ibG9ja3MgPSAnMCcKLSAgcmV0dXJuIHNwYXJzZV9pbWcuU3BhcnNlSW1hZ2UocGF0aCwgbWFwcGF0aCwgY2xvYmJlcmVkX2Jsb2NrcykKK2ltcG9ydCBjb21tb24KIAogCiBkZWYgX1JlYWRGaWxlKGZpbGVfbmFtZSwgdW5wYWNrZWRfbmFtZSwgcm91bmRfdXA9RmFsc2UpOgogICAiIiJDb25zdHJ1Y3RzIGFuZCByZXR1cm5zIGEgRmlsZSBvYmplY3QuIFJvdW5kcyB1cCBpdHMgc2l6ZSBpZiBuZWVkZWQuIiIiCiAKLSAgZGVmIFJvdW5kVXBUbzRLKHZhbHVlKToKLSAgICByb3VuZGVkX3VwID0gdmFsdWUgKyA0MDk1Ci0gICAgcmV0dXJuIHJvdW5kZWRfdXAgLSAocm91bmRlZF91cCAlIDQwOTYpCi0KICAgYXNzZXJ0IG9zLnBhdGguZXhpc3RzKHVucGFja2VkX25hbWUpCiAgIHdpdGggb3Blbih1bnBhY2tlZF9uYW1lLCAncicpIGFzIGY6CiAgICAgZmlsZV9kYXRhID0gZi5yZWFkKCkKICAgZmlsZV9zaXplID0gbGVuKGZpbGVfZGF0YSkKICAgaWYgcm91bmRfdXA6Ci0gICAgZmlsZV9zaXplX3JvdW5kZWRfdXAgPSBSb3VuZFVwVG80SyhmaWxlX3NpemUpCisgICAgZmlsZV9zaXplX3JvdW5kZWRfdXAgPSBjb21tb24uUm91bmRVcFRvNEsoZmlsZV9zaXplKQogICAgIGZpbGVfZGF0YSArPSAnXDAnICogKGZpbGVfc2l6ZV9yb3VuZGVkX3VwIC0gZmlsZV9zaXplKQogICByZXR1cm4gY29tbW9uLkZpbGUoZmlsZV9uYW1lLCBmaWxlX2RhdGEpCiAKQEAgLTY0LDIzICs0OCwyNyBAQAogZGVmIFZhbGlkYXRlRmlsZUFnYWluc3RTaGExKGlucHV0X3RtcCwgZmlsZV9uYW1lLCBmaWxlX3BhdGgsIGV4cGVjdGVkX3NoYTEpOgogICAiIiJDaGVjayBpZiB0aGUgZmlsZSBoYXMgdGhlIGV4cGVjdGVkIFNIQS0xLiIiIgogCi0gIGxvZ2dpbmcuaW5mbygnVmFsaWRhdGluZyB0aGUgU0hBLTEgb2Yge30nLmZvcm1hdChmaWxlX25hbWUpKQorICBsb2dnaW5nLmluZm8oJ1ZhbGlkYXRpbmcgdGhlIFNIQS0xIG9mICVzJywgZmlsZV9uYW1lKQogICB1bnBhY2tlZF9uYW1lID0gb3MucGF0aC5qb2luKGlucHV0X3RtcCwgZmlsZV9wYXRoKQogICBhc3NlcnQgb3MucGF0aC5leGlzdHModW5wYWNrZWRfbmFtZSkKICAgYWN0dWFsX3NoYTEgPSBfUmVhZEZpbGUoZmlsZV9uYW1lLCB1bnBhY2tlZF9uYW1lLCBGYWxzZSkuc2hhMQogICBhc3NlcnQgYWN0dWFsX3NoYTEgPT0gZXhwZWN0ZWRfc2hhMSwgXAogICAgICAgJ1NIQS0xIG1pc21hdGNoZXMgZm9yIHt9LiBhY3R1YWwge30sIGV4cGVjdGVkIHt9Jy5mb3JtYXQoCi0gICAgICBmaWxlX25hbWUsIGFjdHVhbF9zaGExLCBleHBlY3RlZF9zaGExKQorICAgICAgICAgIGZpbGVfbmFtZSwgYWN0dWFsX3NoYTEsIGV4cGVjdGVkX3NoYTEpCiAKIAotZGVmIFZhbGlkYXRlRmlsZUNvbnNpc3RlbmN5KGlucHV0X3ppcCwgaW5wdXRfdG1wKToKK2RlZiBWYWxpZGF0ZUZpbGVDb25zaXN0ZW5jeShpbnB1dF96aXAsIGlucHV0X3RtcCwgaW5mb19kaWN0KToKICAgIiIiQ29tcGFyZSB0aGUgZmlsZXMgZnJvbSBpbWFnZSBmaWxlcyBhbmQgdW5wYWNrZWQgZm9sZGVycy4iIiIKIAogICBkZWYgQ2hlY2tBbGxGaWxlcyh3aGljaCk6CiAgICAgbG9nZ2luZy5pbmZvKCdDaGVja2luZyAlcyBpbWFnZS4nLCB3aGljaCkKLSAgICBpbWFnZSA9IF9HZXRJbWFnZSh3aGljaCwgaW5wdXRfdG1wKQorICAgICMgQWxsb3cgaGF2aW5nIHNoYXJlZCBibG9ja3Mgd2hlbiBsb2FkaW5nIHRoZSBzcGFyc2UgaW1hZ2UsIGJlY2F1c2UgYWxsb3dpbmcKKyAgICAjIHRoYXQgZG9lc24ndCBhZmZlY3QgdGhlIGNoZWNrcyBiZWxvdyAod2Ugd2lsbCBoYXZlIGFsbCB0aGUgYmxvY2tzIG9uIGZpbGUsCisgICAgIyB1bmxlc3MgaXQncyBza2lwcGVkIGR1ZSB0byB0aGUgaG9sZXMpLgorICAgIGltYWdlID0gY29tbW9uLkdldFNwYXJzZUltYWdlKHdoaWNoLCBpbnB1dF90bXAsIGlucHV0X3ppcCwgVHJ1ZSkKICAgICBwcmVmaXggPSAnLycgKyB3aGljaAogICAgIGZvciBlbnRyeSBpbiBpbWFnZS5maWxlX21hcDoKKyAgICAgICMgU2tpcCBlbnRyaWVzIGxpa2UgJ19fTk9OWkVSTy0wJy4KICAgICAgIGlmIG5vdCBlbnRyeS5zdGFydHN3aXRoKHByZWZpeCk6CiAgICAgICAgIGNvbnRpbnVlCiAKQEAgLTg4LDYgKzc2LDExIEBACiAgICAgICAjIGJ5dGVzIHBhc3QgdGhlIGZpbGUgbGVuZ3RoLCB3aGljaCBpcyBleHBlY3RlZCB0byBiZSBwYWRkZWQgd2l0aCAnXDAncy4KICAgICAgIHJhbmdlcyA9IGltYWdlLmZpbGVfbWFwW2VudHJ5XQogCisgICAgICBpbmNvbXBsZXRlID0gcmFuZ2VzLmV4dHJhLmdldCgnaW5jb21wbGV0ZScsIEZhbHNlKQorICAgICAgaWYgaW5jb21wbGV0ZToKKyAgICAgICAgbG9nZ2luZy53YXJuaW5nKCdTa2lwcGluZyAlcyB0aGF0IGhhcyBpbmNvbXBsZXRlIGJsb2NrIGxpc3QnLCBlbnRyeSkKKyAgICAgICAgY29udGludWUKKwogICAgICAgIyBUT0RPKGIvNzk5NTE2NTApOiBIYW5kbGUgZmlsZXMgd2l0aCBub24tbW9ub3RvbmljIHJhbmdlcy4KICAgICAgIGlmIG5vdCByYW5nZXMubW9ub3RvbmljOgogICAgICAgICBsb2dnaW5nLndhcm5pbmcoCkBAIC0xMDAsMTggKzkzLDYgQEAKICAgICAgIHVucGFja2VkX25hbWUgPSBvcy5wYXRoLmpvaW4oCiAgICAgICAgICAgaW5wdXRfdG1wLCB3aGljaC51cHBlcigpLCBlbnRyeVsobGVuKHByZWZpeCkgKyAxKTpdKQogICAgICAgdW5wYWNrZWRfZmlsZSA9IF9SZWFkRmlsZShlbnRyeSwgdW5wYWNrZWRfbmFtZSwgVHJ1ZSkKLSAgICAgIGZpbGVfc2l6ZSA9IHVucGFja2VkX2ZpbGUuc2l6ZQotCi0gICAgICAjIGJsb2NrLm1hcCBtYXkgY29udGFpbiBsZXNzIGJsb2NrcywgYmVjYXVzZSBta2UyZnMgbWF5IHNraXAgYWxsb2NhdGluZwotICAgICAgIyBibG9ja3MgaWYgdGhleSBjb250YWluIGFsbCB6ZXJvcy4gV2UgY2FuJ3QgcmVjb25zdHJ1Y3Qgc3VjaCBhIGZpbGUgZnJvbQotICAgICAgIyBpdHMgYmxvY2sgbGlzdC4gKEJ1ZzogNjUyMTM2MTYpCi0gICAgICBpZiBmaWxlX3NpemUgPiByYW5nZXMuc2l6ZSgpICogNDA5NjoKLSAgICAgICAgbG9nZ2luZy53YXJuaW5nKAotICAgICAgICAgICAgJ1NraXBwaW5nICVzIHRoYXQgaGFzIGxlc3MgYmxvY2tzOiBmaWxlIHNpemUgJWQtYnl0ZSwnCi0gICAgICAgICAgICAnIHJhbmdlcyAlcyAoJWQtYnl0ZSknLCBlbnRyeSwgZmlsZV9zaXplLCByYW5nZXMsCi0gICAgICAgICAgICByYW5nZXMuc2l6ZSgpICogNDA5NikKLSAgICAgICAgY29udGludWUKLQogICAgICAgZmlsZV9zaGExID0gdW5wYWNrZWRfZmlsZS5zaGExCiAgICAgICBhc3NlcnQgYmxvY2tzX3NoYTEgPT0gZmlsZV9zaGExLCBcCiAgICAgICAgICAgJ2ZpbGU6ICVzLCByYW5nZTogJXMsIGJsb2Nrc19zaGExOiAlcywgZmlsZV9zaGExOiAlcycgJSAoCkBAIC0xMTksNiArMTAwLDExIEBACiAKICAgbG9nZ2luZy5pbmZvKCdWYWxpZGF0aW5nIGZpbGUgY29uc2lzdGVuY3kuJykKIAorICAjIFRPRE8oYi83OTYxNzM0Mik6IFZhbGlkYXRlIG5vbi1zcGFyc2UgaW1hZ2VzLgorICBpZiBpbmZvX2RpY3QuZ2V0KCdleHRmc19zcGFyc2VfZmxhZycpICE9ICctcyc6CisgICAgbG9nZ2luZy53YXJuaW5nKCdTa2lwcGVkIGR1ZSB0byB0YXJnZXQgdXNpbmcgbm9uLXNwYXJzZSBpbWFnZXMnKQorICAgIHJldHVybgorCiAgICMgVmVyaWZ5IElNQUdFUy9zeXN0ZW0uaW1nLgogICBDaGVja0FsbEZpbGVzKCdzeXN0ZW0nKQogCkBAIC0xNTQsMTAgKzE0MCwxMCBAQAogCiAgIHNjcmlwdF9wYXRoID0gJ1NZU1RFTS9iaW4vaW5zdGFsbC1yZWNvdmVyeS5zaCcKICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKG9zLnBhdGguam9pbihpbnB1dF90bXAsIHNjcmlwdF9wYXRoKSk6Ci0gICAgbG9nZ2luZy5pbmZvKCd7fSBkb2VzIG5vdCBleGlzdCBpbiBpbnB1dF90bXAnLmZvcm1hdChzY3JpcHRfcGF0aCkpCisgICAgbG9nZ2luZy5pbmZvKCclcyBkb2VzIG5vdCBleGlzdCBpbiBpbnB1dF90bXAnLCBzY3JpcHRfcGF0aCkKICAgICByZXR1cm4KIAotICBsb2dnaW5nLmluZm8oJ0NoZWNraW5nIHt9Jy5mb3JtYXQoc2NyaXB0X3BhdGgpKQorICBsb2dnaW5nLmluZm8oJ0NoZWNraW5nICVzJywgc2NyaXB0X3BhdGgpCiAgIHdpdGggb3Blbihvcy5wYXRoLmpvaW4oaW5wdXRfdG1wLCBzY3JpcHRfcGF0aCksICdyJykgYXMgc2NyaXB0OgogICAgIGxpbmVzID0gc2NyaXB0LnJlYWQoKS5zdHJpcCgpLnNwbGl0KCdcbicpCiAgIGFzc2VydCBsZW4obGluZXMpID49IDYKQEAgLTE3NSw3ICsxNjEsNyBAQAogICAgIGV4cGVjdGVkX3JlY292ZXJ5X3NoYTEgPSBhcHBseXBhdGNoX2FyZ3ZbM10uc3RyaXAoKQogICAgIGFzc2VydCBleHBlY3RlZF9yZWNvdmVyeV9jaGVja19zaGExID09IGV4cGVjdGVkX3JlY292ZXJ5X3NoYTEKICAgICBWYWxpZGF0ZUZpbGVBZ2FpbnN0U2hhMShpbnB1dF90bXAsICdyZWNvdmVyeS5pbWcnLAotICAgICAgICAnU1lTVEVNL2V0Yy9yZWNvdmVyeS5pbWcnLCBleHBlY3RlZF9yZWNvdmVyeV9zaGExKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICdTWVNURU0vZXRjL3JlY292ZXJ5LmltZycsIGV4cGVjdGVkX3JlY292ZXJ5X3NoYTEpCiAgIGVsc2U6CiAgICAgIyBXZSdyZSBwYXRjaGluZyBib290LmltZyB0byBnZXQgcmVjb3ZlcnkuaW1nIHdoZXJlIGJvbnVzX2FyZ3MgaXMgb3B0aW9uYWwKICAgICBpZiBhcHBseXBhdGNoX2FyZ3ZbMV0gPT0gIi1iIjoKQEAgLTE4OSwxNiArMTc1LDE3IEBACiAgICAgYm9vdF9pbmZvID0gYXBwbHlwYXRjaF9hcmd2W2Jvb3RfaW5mb19pbmRleF0uc3RyaXAoKS5zcGxpdCgnOicpCiAgICAgYXNzZXJ0IGxlbihib290X2luZm8pID09IDQKICAgICBWYWxpZGF0ZUZpbGVBZ2FpbnN0U2hhMShpbnB1dF90bXAsIGZpbGVfbmFtZT0nYm9vdC5pbWcnLAotICAgICAgICBmaWxlX3BhdGg9J0lNQUdFUy9ib290LmltZycsIGV4cGVjdGVkX3NoYTE9Ym9vdF9pbmZvWzNdKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfcGF0aD0nSU1BR0VTL2Jvb3QuaW1nJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZF9zaGExPWJvb3RfaW5mb1szXSkKIAogICAgIHJlY292ZXJ5X3NoYTFfaW5kZXggPSBib290X2luZm9faW5kZXggKyAyCiAgICAgZXhwZWN0ZWRfcmVjb3Zlcnlfc2hhMSA9IGFwcGx5cGF0Y2hfYXJndltyZWNvdmVyeV9zaGExX2luZGV4XQogICAgIGFzc2VydCBleHBlY3RlZF9yZWNvdmVyeV9jaGVja19zaGExID09IGV4cGVjdGVkX3JlY292ZXJ5X3NoYTEKICAgICBWYWxpZGF0ZUZpbGVBZ2FpbnN0U2hhMShpbnB1dF90bXAsIGZpbGVfbmFtZT0ncmVjb3ZlcnkuaW1nJywKLSAgICAgICAgZmlsZV9wYXRoPSdJTUFHRVMvcmVjb3ZlcnkuaW1nJywKLSAgICAgICAgZXhwZWN0ZWRfc2hhMT1leHBlY3RlZF9yZWNvdmVyeV9zaGExKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfcGF0aD0nSU1BR0VTL3JlY292ZXJ5LmltZycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRfc2hhMT1leHBlY3RlZF9yZWNvdmVyeV9zaGExKQogCi0gIGxvZ2dpbmcuaW5mbygnRG9uZSBjaGVja2luZyB7fScuZm9ybWF0KHNjcmlwdF9wYXRoKSkKKyAgbG9nZ2luZy5pbmZvKCdEb25lIGNoZWNraW5nICVzJywgc2NyaXB0X3BhdGgpCiAKIAogZGVmIG1haW4oYXJndik6CkBAIC0yMjAsMTEgKzIwNywxMiBAQAogICAgICAgICAgICAgICAgICAgICAgIGRhdGVmbXQ9ZGF0ZV9mb3JtYXQpCiAKICAgbG9nZ2luZy5pbmZvKCJVbnppcHBpbmcgdGhlIGlucHV0IHRhcmdldF9maWxlcy56aXA6ICVzIiwgYXJnc1swXSkKLSAgaW5wdXRfdG1wLCBpbnB1dF96aXAgPSBjb21tb24uVW56aXBUZW1wKGFyZ3NbMF0pCi0KLSAgVmFsaWRhdGVGaWxlQ29uc2lzdGVuY3koaW5wdXRfemlwLCBpbnB1dF90bXApCisgIGlucHV0X3RtcCA9IGNvbW1vbi5VbnppcFRlbXAoYXJnc1swXSkKIAogICBpbmZvX2RpY3QgPSBjb21tb24uTG9hZEluZm9EaWN0KGlucHV0X3RtcCkKKyAgd2l0aCB6aXBmaWxlLlppcEZpbGUoYXJnc1swXSwgJ3InKSBhcyBpbnB1dF96aXA6CisgICAgVmFsaWRhdGVGaWxlQ29uc2lzdGVuY3koaW5wdXRfemlwLCBpbnB1dF90bXAsIGluZm9fZGljdCkKKwogICBWYWxpZGF0ZUluc3RhbGxSZWNvdmVyeVNjcmlwdChpbnB1dF90bXAsIGluZm9fZGljdCkKIAogICAjIFRPRE86IENoZWNrIGlmIHRoZSBPVEEga2V5cyBoYXZlIGJlZW4gcHJvcGVybHkgdXBkYXRlZCAodGhlIG9uZXMgb24gL3N5c3RlbSwKZGlmZiAtLWdpdCBhL3Rvb2xzL3NpZ25hcGsvQW5kcm9pZC5icCBiL3Rvb2xzL3NpZ25hcGsvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTU0Y2Y1Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvc2lnbmFway9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMzEgQEAKKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy8vCisKKy8vIHRoZSBzaWduYXBrIHRvb2wgKGEgLmphciBhcHBsaWNhdGlvbiB1c2VkIHRvIHNpZ24gcGFja2FnZXMpCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK2phdmFfbGlicmFyeV9ob3N0IHsKKyAgICBuYW1lOiAic2lnbmFwayIsCisgICAgc3JjczogWyJzcmMvKiovKi5qYXZhIl0sCisgICAgbWFuaWZlc3Q6ICJTaWduQXBrLm1mIiwKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAiYXBrc2lnIiwKKyAgICAgICAgImJvdW5jeWNhc3RsZSIsCisgICAgICAgICJib3VuY3ljYXN0bGUtYmNwa2l4IiwKKyAgICAgICAgImNvbnNjcnlwdCIsCisgICAgXSwKKworICAgIHJlcXVpcmVkOiBbImxpYmNvbnNjcnlwdF9vcGVuamRrX2puaSJdLAorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvc2lnbmFway9BbmRyb2lkLm1rIGIvdG9vbHMvc2lnbmFway9BbmRyb2lkLm1rCmluZGV4IDA1MWE1MWQuLmZmNTRkNmQgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3NpZ25hcGsvQW5kcm9pZC5taworKysgYi90b29scy9zaWduYXBrL0FuZHJvaWQubWsKQEAgLTE1LDI0ICsxNSwxMCBAQAogIwogTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQogCi0jIHRoZSBzaWduYXBrIHRvb2wgKGEgLmphciBhcHBsaWNhdGlvbiB1c2VkIHRvIHNpZ24gcGFja2FnZXMpCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi1MT0NBTF9NT0RVTEUgOj0gc2lnbmFwawotTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKQotTE9DQUxfSkFSX01BTklGRVNUIDo9IFNpZ25BcGsubWYKLUxPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBcCi0gICAgYXBrc2lnIFwKLSAgICBib3VuY3ljYXN0bGUtaG9zdCBcCi0gICAgYm91bmN5Y2FzdGxlLWJjcGtpeC1ob3N0IFwKLSAgICBjb25zY3J5cHQtaG9zdAotTE9DQUxfUkVRVUlSRURfTU9EVUxFUyA6PSBsaWJjb25zY3J5cHRfb3Blbmpka19qbmkKLWluY2x1ZGUgJChCVUlMRF9IT1NUX0pBVkFfTElCUkFSWSkKLQogaWZlcSAoJChUQVJHRVRfQlVJTERfQVBQUyksKQogIyBUaGUgcG9zdC1idWlsZCBzaWduaW5nIHRvb2xzIG5lZWQgc2lnbmFway5qYXIgYW5kIGl0cyBzaGFyZWQgbGlicmFyaWVzLAogIyBidXQgd2UgZG9uJ3QgbmVlZCB0aGlzIGlmIHdlJ3JlIGp1c3QgZG9pbmcgdW5idW5kbGVkIGFwcHMuCi1teV9kaXN0X2ZpbGVzIDo9ICQoTE9DQUxfSU5TVEFMTEVEX01PRFVMRSkgXAorbXlfZGlzdF9maWxlcyA6PSAkKEhPU1RfT1VUX0pBVkFfTElCUkFSSUVTKS9zaWduYXBrLmphciBcCiAgICAgJChIT1NUX09VVF9TSEFSRURfTElCUkFSSUVTKS9saWJjb25zY3J5cHRfb3Blbmpka19qbmkkKEhPU1RfU0hMSUJfU1VGRklYKQogCiAkKGNhbGwgZGlzdC1mb3ItZ29hbHMsZHJvaWRjb3JlLCQobXlfZGlzdF9maWxlcykpCmRpZmYgLS1naXQgYS90b29scy9zaWduYXBrL09XTkVSUyBiL3Rvb2xzL3NpZ25hcGsvT1dORVJTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiOGQzOTgKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9zaWduYXBrL09XTkVSUwpAQCAtMCwwICsxLDIgQEAKK2NicnViYWtlckBnb29nbGUuY29tCitrbHl1YmluQGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL3Rvb2xzL3NpZ25hcGsvc3JjL2NvbS9hbmRyb2lkL3NpZ25hcGsvU2lnbkFway5qYXZhIGIvdG9vbHMvc2lnbmFway9zcmMvY29tL2FuZHJvaWQvc2lnbmFway9TaWduQXBrLmphdmEKaW5kZXggM2IwMDU5OS4uZmRmNjI4MyAxMDA2NDQKLS0tIGEvdG9vbHMvc2lnbmFway9zcmMvY29tL2FuZHJvaWQvc2lnbmFway9TaWduQXBrLmphdmEKKysrIGIvdG9vbHMvc2lnbmFway9zcmMvY29tL2FuZHJvaWQvc2lnbmFway9TaWduQXBrLmphdmEKQEAgLTEwODIsMTQgKzEwODIsMTUgQEAKICAgICAgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlcltdIG91dHB1dENodW5rcyA9IG5ldyBCeXRlQnVmZmVyW10ge3YxU2lnbmVkQXBrfTsKIAogICAgICAgICAgICAgICAgICAgICBaaXBTZWN0aW9ucyB6aXBTZWN0aW9ucyA9IGZpbmRNYWluWmlwU2VjdGlvbnModjFTaWduZWRBcGspOwotICAgICAgICAgICAgICAgICAgICBBcGtTaWduZXJFbmdpbmUuT3V0cHV0QXBrU2lnbmluZ0Jsb2NrUmVxdWVzdCBhZGRWMlNpZ25hdHVyZVJlcXVlc3QgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwa1NpZ25lci5vdXRwdXRaaXBTZWN0aW9ucygKKyAgICAgICAgICAgICAgICAgICAgQXBrU2lnbmVyRW5naW5lLk91dHB1dEFwa1NpZ25pbmdCbG9ja1JlcXVlc3QyIGFkZFYyU2lnbmF0dXJlUmVxdWVzdCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBrU2lnbmVyLm91dHB1dFppcFNlY3Rpb25zMigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGFTb3VyY2VzLmFzRGF0YVNvdXJjZSh6aXBTZWN0aW9ucy5iZWZvcmVDZW50cmFsRGlyKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGFTb3VyY2VzLmFzRGF0YVNvdXJjZSh6aXBTZWN0aW9ucy5jZW50cmFsRGlyKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGFTb3VyY2VzLmFzRGF0YVNvdXJjZSh6aXBTZWN0aW9ucy5lb2NkKSk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChhZGRWMlNpZ25hdHVyZVJlcXVlc3QgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgLy8gTmVlZCB0byBpbnNlcnQgdGhlIHJldHVybmVkIEFQSyBTaWduaW5nIEJsb2NrIGJlZm9yZSBaSVAgQ2VudHJhbAogICAgICAgICAgICAgICAgICAgICAgICAgLy8gRGlyZWN0b3J5LgorICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBhZGRpbmcgPSBhZGRWMlNpZ25hdHVyZVJlcXVlc3QuZ2V0UGFkZGluZ1NpemVCZWZvcmVBcGtTaWduaW5nQmxvY2soKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBhcGtTaWduaW5nQmxvY2sgPSBhZGRWMlNpZ25hdHVyZVJlcXVlc3QuZ2V0QXBrU2lnbmluZ0Jsb2NrKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBCZWNhdXNlIHRoZSBBUEsgU2lnbmluZyBCbG9jayBpcyBpbnNlcnRlZCBiZWZvcmUgdGhlIENlbnRyYWwgRGlyZWN0b3J5LAogICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgbmVlZCB0byBhZGp1c3QgYWNjb3JkaW5nbHkgdGhlIG9mZnNldCBvZiBDZW50cmFsIERpcmVjdG9yeSBpbnNpZGUgdGhlCkBAIC0xMTAwLDEwICsxMTAxLDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICBtb2RpZmllZEVvY2Qub3JkZXIoQnl0ZU9yZGVyLkxJVFRMRV9FTkRJQU4pOwogICAgICAgICAgICAgICAgICAgICAgICAgQXBrVXRpbHMuc2V0WmlwRW9jZENlbnRyYWxEaXJlY3RvcnlPZmZzZXQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVkRW9jZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemlwU2VjdGlvbnMuYmVmb3JlQ2VudHJhbERpci5yZW1haW5pbmcoKSArIGFwa1NpZ25pbmdCbG9jay5sZW5ndGgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6aXBTZWN0aW9ucy5iZWZvcmVDZW50cmFsRGlyLnJlbWFpbmluZygpICsgcGFkZGluZyArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwa1NpZ25pbmdCbG9jay5sZW5ndGgpOwogICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0Q2h1bmtzID0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEJ5dGVCdWZmZXJbXSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemlwU2VjdGlvbnMuYmVmb3JlQ2VudHJhbERpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlQnVmZmVyLmFsbG9jYXRlKHBhZGRpbmcpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXIud3JhcChhcGtTaWduaW5nQmxvY2spLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHppcFNlY3Rpb25zLmNlbnRyYWxEaXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kaWZpZWRFb2NkfTsKZGlmZiAtLWdpdCBhL3Rvb2xzL3NpZ250b3MvQW5kcm9pZC5icCBiL3Rvb2xzL3NpZ250b3MvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjY2MzFmCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvc2lnbnRvcy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMjcgQEAKKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy8vCisKKy8vIHRoZSBzaWdudG9zIHRvb2wgLSBzaWducyBUcnVzdHkgaW1hZ2VzCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK2phdmFfbGlicmFyeV9ob3N0IHsKKyAgICBuYW1lOiAic2lnbnRvcyIsCisgICAgc3JjczogWyJTaWduVG9zLmphdmEiXSwKKyAgICBtYW5pZmVzdDogIlNpZ25Ub3MubWYiLAorICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJib3VuY3ljYXN0bGUiLAorICAgICAgICAiYm91bmN5Y2FzdGxlLWJjcGtpeCIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL3NpZ250b3MvQW5kcm9pZC5tayBiL3Rvb2xzL3NpZ250b3MvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTRhYjk0NC4uMDAwMDAwMAotLS0gYS90b29scy9zaWdudG9zL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0jCi0jIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQotCi0jIHRoZSBzaWdudG9zIHRvb2wgLSBzaWducyBUcnVzdHkgaW1hZ2VzCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi1MT0NBTF9NT0RVTEUgOj0gc2lnbnRvcwotTE9DQUxfU1JDX0ZJTEVTIDo9IFNpZ25Ub3MuamF2YQotTE9DQUxfSkFSX01BTklGRVNUIDo9IFNpZ25Ub3MubWYKLUxPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBib3VuY3ljYXN0bGUtaG9zdCBib3VuY3ljYXN0bGUtYmNwa2l4LWhvc3QKLWluY2x1ZGUgJChCVUlMRF9IT1NUX0pBVkFfTElCUkFSWSkKZGlmZiAtLWdpdCBhL3Rvb2xzL3Nvb25nX3RvX2NvbnZlcnQucHkgYi90b29scy9zb29uZ190b19jb252ZXJ0LnB5CmluZGV4IDNkNjJkNDMuLjA4M2Y2ZjcgMTAwNzU1Ci0tLSBhL3Rvb2xzL3Nvb25nX3RvX2NvbnZlcnQucHkKKysrIGIvdG9vbHMvc29vbmdfdG9fY29udmVydC5weQpAQCAtNzYsOCArNzYsMTAgQEAKICAgICBwcm9ibGVtcyA9IGRpY3QoKQogICAgIGRlcHMgPSBkaWN0KCkKICAgICByZXZlcnNlX2RlcHMgPSBkaWN0KCkKKyAgICBtb2R1bGVfdHlwZXMgPSBkaWN0KCkKIAotICAgIGZvciAobW9kdWxlLCBwcm9ibGVtLCBkZXBlbmRlbmNpZXMpIGluIHJlYWRlcjoKKyAgICBmb3IgKG1vZHVsZSwgbW9kdWxlX3R5cGUsIHByb2JsZW0sIGRlcGVuZGVuY2llcykgaW4gcmVhZGVyOgorICAgICAgICBtb2R1bGVfdHlwZXNbbW9kdWxlXSA9IG1vZHVsZV90eXBlCiAgICAgICAgIHByb2JsZW1zW21vZHVsZV0gPSBwcm9ibGVtCiAgICAgICAgIGRlcHNbbW9kdWxlXSA9IFtkIGZvciBkIGluIGRlcGVuZGVuY2llcy5zdHJpcCgpLnNwbGl0KCcgJykgaWYgZCAhPSAiIl0KICAgICAgICAgZm9yIGRlcCBpbiBkZXBzW21vZHVsZV06CkBAIC05NCwxNiArOTYsMTkgQEAKICAgICAgICAgZXh0cmEgPSAiIgogICAgICAgICBpZiBsZW4ocHJvYmxlbXNbbW9kdWxlXSkgPiAwOgogICAgICAgICAgICAgZXh0cmEgPSAiICh7fSkiLmZvcm1hdChwcm9ibGVtc1ttb2R1bGVdKQotICAgICAgICByZXN1bHRzLmFwcGVuZCgoY291bnRfZGVwcyhyZXZlcnNlX2RlcHMsIG1vZHVsZSwgW10pLCBtb2R1bGUgKyBleHRyYSkpCisgICAgICAgIHJlc3VsdHMuYXBwZW5kKChjb3VudF9kZXBzKHJldmVyc2VfZGVwcywgbW9kdWxlLCBbXSksIG1vZHVsZSArIGV4dHJhLCBtb2R1bGVfdHlwZXNbbW9kdWxlXSkpCiAKICAgICByZXR1cm4gc29ydGVkKHJlc3VsdHMsIGtleT1sYW1iZGEgcmVzdWx0OiAoLXJlc3VsdFswXSwgcmVzdWx0WzFdKSkKIAorZGVmIGZpbHRlcihyZXN1bHRzLCBtb2R1bGVfdHlwZSk6CisgICAgcmV0dXJuIFt4IGZvciB4IGluIHJlc3VsdHMgaWYgeFsyXSA9PSBtb2R1bGVfdHlwZV0KKwogZGVmIGRpc3BsYXkocmVzdWx0cyk6CiAgICAgIiIiRGlzcGxheXMgdGhlIHJlc3VsdHMiIiIKICAgICBjb3VudF9oZWFkZXIgPSAiIyBCbG9ja2VkIG9uIgogICAgIGNvdW50X3dpZHRoID0gbGVuKGNvdW50X2hlYWRlcikKICAgICBwcmludCgie30gTW9kdWxlIChwb3RlbnRpYWwgcHJvYmxlbXMpIi5mb3JtYXQoY291bnRfaGVhZGVyKSkKLSAgICBmb3IgKGNvdW50LCBtb2R1bGUpIGluIHJlc3VsdHM6CisgICAgZm9yIChjb3VudCwgbW9kdWxlLCBtb2R1bGVfdHlwZSkgaW4gcmVzdWx0czoKICAgICAgICAgcHJpbnQoIns6Pnt9fSB7fSIuZm9ybWF0KGNvdW50LCBjb3VudF93aWR0aCwgbW9kdWxlKSkKIAogZGVmIG1haW4oZmlsZW5hbWUpOgpAQCAtMTExLDcgKzExNiwxNSBAQAogICAgIHdpdGggb3BlbihmaWxlbmFtZSwgJ3JiJykgYXMgY3N2ZmlsZToKICAgICAgICAgcmVzdWx0cyA9IHByb2Nlc3MoY3N2LnJlYWRlcihjc3ZmaWxlKSkKIAotICAgIGRpc3BsYXkocmVzdWx0cykKKyAgICBuYXRpdmVfcmVzdWx0cyA9IGZpbHRlcihyZXN1bHRzLCAibmF0aXZlIikKKyAgICBqYXZhX3Jlc3VsdHMgPSBmaWx0ZXIocmVzdWx0cywgImphdmEiKQorCisgICAgcHJpbnQoIm5hdGl2ZSBtb2R1bGVzIHJlYWR5IHRvIGNvbnZlcnQiKQorICAgIGRpc3BsYXkobmF0aXZlX3Jlc3VsdHMpCisKKyAgICBwcmludCgiIikKKyAgICBwcmludCgiamF2YSBtb2R1bGVzIHJlYWR5IHRvIGNvbnZlcnQiKQorICAgIGRpc3BsYXkoamF2YV9yZXN1bHRzKQogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgIGlmIGxlbihzeXMuYXJndikgIT0gMjoKZGlmZiAtLWdpdCBhL3Rvb2xzL3ZlbmRvcl9idWlsZGluZm8uc2ggYi90b29scy92ZW5kb3JfYnVpbGRpbmZvLnNoCmluZGV4IDQ4NWFkYTMuLmMxMmY3Y2IgMTAwNzU1Ci0tLSBhL3Rvb2xzL3ZlbmRvcl9idWlsZGluZm8uc2gKKysrIGIvdG9vbHMvdmVuZG9yX2J1aWxkaW5mby5zaApAQCAtNiwxMCArNiwxMCBAQAogZWNobyAicm8ucHJvZHVjdC5ib2FyZD0kVEFSR0VUX0JPT1RMT0FERVJfQk9BUkRfTkFNRSIKIGVjaG8gInJvLmJvYXJkLnBsYXRmb3JtPSRUQVJHRVRfQk9BUkRfUExBVEZPUk0iCiAKLWVjaG8gInJvLnZlbmRvci5wcm9kdWN0Lm1hbnVmYWN0dXJlcj0kUFJPRFVDVF9NQU5VRkFDVFVSRVIiCi1lY2hvICJyby52ZW5kb3IucHJvZHVjdC5tb2RlbD0kUFJPRFVDVF9NT0RFTCIKLWVjaG8gInJvLnZlbmRvci5wcm9kdWN0LmJyYW5kPSRQUk9EVUNUX0JSQU5EIgotZWNobyAicm8udmVuZG9yLnByb2R1Y3QubmFtZT0kUFJPRFVDVF9OQU1FIgotZWNobyAicm8udmVuZG9yLnByb2R1Y3QuZGV2aWNlPSRUQVJHRVRfREVWSUNFIgorZWNobyAicm8ucHJvZHVjdC52ZW5kb3IubWFudWZhY3R1cmVyPSRQUk9EVUNUX01BTlVGQUNUVVJFUiIKK2VjaG8gInJvLnByb2R1Y3QudmVuZG9yLm1vZGVsPSRQUk9EVUNUX01PREVMIgorZWNobyAicm8ucHJvZHVjdC52ZW5kb3IuYnJhbmQ9JFBST0RVQ1RfQlJBTkQiCitlY2hvICJyby5wcm9kdWN0LnZlbmRvci5uYW1lPSRQUk9EVUNUX05BTUUiCitlY2hvICJyby5wcm9kdWN0LnZlbmRvci5kZXZpY2U9JFRBUkdFVF9ERVZJQ0UiCiAKIGVjaG8gIiMgZW5kIGJ1aWxkIHByb3BlcnRpZXMiCmRpZmYgLS1naXQgYS90b29scy93YXJuLnB5IGIvdG9vbHMvd2Fybi5weQppbmRleCA0NGFkMzY4Li4wMTM5OGJlIDEwMDc1NQotLS0gYS90b29scy93YXJuLnB5CisrKyBiL3Rvb2xzL3dhcm4ucHkKQEAgLTUwOSw2ICs1MDksMjYgQEAKICAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAogICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5MT1csCiAgICAgICdkZXNjcmlwdGlvbic6CisgICAgICAgICAnSmF2YTogRmllbGRzIHRoYXQgY2FuIGJlIG51bGwgc2hvdWxkIGJlIGFubm90YXRlZCBATnVsbGFibGUnLAorICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtGaWVsZE1pc3NpbmdOdWxsYWJsZVxdIC4rIl19LAorICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCisgICAgICdzZXZlcml0eSc6IFNldmVyaXR5LkxPVywKKyAgICAgJ2Rlc2NyaXB0aW9uJzoKKyAgICAgICAgICdKYXZhOiBNZXRob2QgcGFyYW1ldGVycyB0aGF0IGFyZW5cJ3QgY2hlY2tlZCBmb3IgbnVsbCBzaG91bGRuXCd0IGJlIGFubm90YXRlZCBATnVsbGFibGUnLAorICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtQYXJhbWV0ZXJOb3ROdWxsYWJsZVxdIC4rIl19LAorICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCisgICAgICdzZXZlcml0eSc6IFNldmVyaXR5LkxPVywKKyAgICAgJ2Rlc2NyaXB0aW9uJzoKKyAgICAgICAgICdKYXZhOiBNZXRob2RzIHRoYXQgY2FuIHJldHVybiBudWxsIHNob3VsZCBiZSBhbm5vdGF0ZWQgQE51bGxhYmxlJywKKyAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbUmV0dXJuTWlzc2luZ051bGxhYmxlXF0gLisiXX0sCisgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKKyAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuTE9XLAorICAgICAnZGVzY3JpcHRpb24nOgorICAgICAgICAgJ0phdmE6IFVzZSBwYXJhbWV0ZXIgY29tbWVudHMgdG8gZG9jdW1lbnQgYW1iaWd1b3VzIGxpdGVyYWxzJywKKyAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbQm9vbGVhblBhcmFtZXRlclxdIC4rIl19LAorICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCisgICAgICdzZXZlcml0eSc6IFNldmVyaXR5LkxPVywKKyAgICAgJ2Rlc2NyaXB0aW9uJzoKICAgICAgICAgICdKYXZhOiBGaWVsZCBuYW1lIGlzIENPTlNUQU5UIENBU0UsIGJ1dCBmaWVsZCBpcyBub3Qgc3RhdGljIGFuZCBmaW5hbCcsCiAgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW0NvbnN0YW50RmllbGRcXSAuKyJdfSwKICAgICB7J2NhdGVnb3J5JzogJ2phdmEnLApAQCAtNTE5LDExICs1MzksMjEgQEAKICAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAogICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5MT1csCiAgICAgICdkZXNjcmlwdGlvbic6CisgICAgICAgICAnSmF2YTogVXNlIEphdmFcJ3MgdXRpbGl0eSBmdW5jdGlvbmFsIGludGVyZmFjZXMgaW5zdGVhZCBvZiBGdW5jdGlvblx1MDAzY0EsIEI+IGZvciBwcmltaXRpdmUgdHlwZXMuJywKKyAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbTGFtYmRhRnVuY3Rpb25hbEludGVyZmFjZVxdIC4rIl19LAorICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCisgICAgICdzZXZlcml0eSc6IFNldmVyaXR5LkxPVywKKyAgICAgJ2Rlc2NyaXB0aW9uJzoKICAgICAgICAgICdKYXZhOiBQcmVmZXIgXCdMXCcgdG8gXCdsXCcgZm9yIHRoZSBzdWZmaXggdG8gbG9uZyBsaXRlcmFscycsCiAgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW0xvbmdMaXRlcmFsTG93ZXJDYXNlU3VmZml4XF0gLisiXX0sCiAgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKICAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuTE9XLAogICAgICAnZGVzY3JpcHRpb24nOgorICAgICAgICAgJ0phdmE6IEEgcHJpdmF0ZSBtZXRob2QgdGhhdCBkb2VzIG5vdCByZWZlcmVuY2UgdGhlIGVuY2xvc2luZyBpbnN0YW5jZSBjYW4gYmUgc3RhdGljJywKKyAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbTWV0aG9kQ2FuQmVTdGF0aWNcXSAuKyJdfSwKKyAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAorICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5MT1csCisgICAgICdkZXNjcmlwdGlvbic6CiAgICAgICAgICAnSmF2YTogQy1zdHlsZSBhcnJheSBkZWNsYXJhdGlvbnMgc2hvdWxkIG5vdCBiZSB1c2VkJywKICAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbTWl4ZWRBcnJheURpbWVuc2lvbnNcXSAuKyJdfSwKICAgICB7J2NhdGVnb3J5JzogJ2phdmEnLApAQCAtNTM5LDExICs1NjksMjEgQEAKICAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAogICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5MT1csCiAgICAgICdkZXNjcmlwdGlvbic6CisgICAgICAgICAnSmF2YTogQXZvaWQgaGF2aW5nIG11bHRpcGxlIHVuYXJ5IG9wZXJhdG9ycyBhY3Rpbmcgb24gdGhlIHNhbWUgdmFyaWFibGUgaW4gYSBtZXRob2QgY2FsbCcsCisgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW011bHRpcGxlVW5hcnlPcGVyYXRvcnNJbk1ldGhvZENhbGxcXSAuKyJdfSwKKyAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAorICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5MT1csCisgICAgICdkZXNjcmlwdGlvbic6CiAgICAgICAgICAnSmF2YTogUGFja2FnZSBuYW1lcyBzaG91bGQgbWF0Y2ggdGhlIGRpcmVjdG9yeSB0aGV5IGFyZSBkZWNsYXJlZCBpbicsCiAgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW1BhY2thZ2VMb2NhdGlvblxdIC4rIl19LAogICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCiAgICAgICdzZXZlcml0eSc6IFNldmVyaXR5LkxPVywKICAgICAgJ2Rlc2NyaXB0aW9uJzoKKyAgICAgICAgICdKYXZhOiBOb24tc3RhbmRhcmQgcGFyYW1ldGVyIGNvbW1lbnQ7IHByZWZlciBgLypwYXJhbU5hbWU9Ki8gYXJnYCcsCisgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW1BhcmFtZXRlckNvbW1lbnRcXSAuKyJdfSwKKyAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAorICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5MT1csCisgICAgICdkZXNjcmlwdGlvbic6CiAgICAgICAgICAnSmF2YTogVXRpbGl0eSBjbGFzc2VzIChvbmx5IHN0YXRpYyBtZW1iZXJzKSBhcmUgbm90IGRlc2lnbmVkIHRvIGJlIGluc3RhbnRpYXRlZCBhbmQgc2hvdWxkIGJlIG1hZGUgbm9uaW5zdGFudGlhYmxlIHdpdGggYSBkZWZhdWx0IGNvbnN0cnVjdG9yLicsCiAgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW1ByaXZhdGVDb25zdHJ1Y3RvckZvclV0aWxpdHlDbGFzc1xdIC4rIl19LAogICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCkBAIC01NTQsMTEgKzU5NCwzMSBAQAogICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCiAgICAgICdzZXZlcml0eSc6IFNldmVyaXR5LkxPVywKICAgICAgJ2Rlc2NyaXB0aW9uJzoKKyAgICAgICAgICdKYXZhOiBUaGUgZGVmYXVsdCBjYXNlIG9mIGEgc3dpdGNoIHNob3VsZCBhcHBlYXIgYXQgdGhlIGVuZCBvZiB0aGUgbGFzdCBzdGF0ZW1lbnQgZ3JvdXAnLAorICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtTd2l0Y2hEZWZhdWx0XF0gLisiXX0sCisgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKKyAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuTE9XLAorICAgICAnZGVzY3JpcHRpb24nOgogICAgICAgICAgJ0phdmE6IFVuY2hlY2tlZCBleGNlcHRpb25zIGRvIG5vdCBuZWVkIHRvIGJlIGRlY2xhcmVkIGluIHRoZSBtZXRob2Qgc2lnbmF0dXJlLicsCiAgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW1Rocm93c1VuY2hlY2tlZEV4Y2VwdGlvblxdIC4rIl19LAogICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCiAgICAgICdzZXZlcml0eSc6IFNldmVyaXR5LkxPVywKICAgICAgJ2Rlc2NyaXB0aW9uJzoKKyAgICAgICAgICdKYXZhOiBUeXBlIHBhcmFtZXRlcnMgbXVzdCBiZSBhIHNpbmdsZSBsZXR0ZXIgd2l0aCBhbiBvcHRpb25hbCBudW1lcmljIHN1ZmZpeCwgb3IgYW4gVXBwZXJDYW1lbENhc2UgbmFtZSBmb2xsb3dlZCBieSB0aGUgbGV0dGVyIFwnVFwnLicsCisgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW1R5cGVQYXJhbWV0ZXJOYW1pbmdcXSAuKyJdfSwKKyAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAorICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5MT1csCisgICAgICdkZXNjcmlwdGlvbic6CisgICAgICAgICAnSmF2YTogQ29uc3RydWN0b3JzIGFuZCBtZXRob2RzIHdpdGggdGhlIHNhbWUgbmFtZSBzaG91bGQgYXBwZWFyIHNlcXVlbnRpYWxseSB3aXRoIG5vIG90aGVyIGNvZGUgaW4gYmV0d2VlbicsCisgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW1VuZ3JvdXBlZE92ZXJsb2Fkc1xdIC4rIl19LAorICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCisgICAgICdzZXZlcml0eSc6IFNldmVyaXR5LkxPVywKKyAgICAgJ2Rlc2NyaXB0aW9uJzoKKyAgICAgICAgICdKYXZhOiBVbm5lY2Vzc2FyeSBjYWxsIHRvIE51bGxQb2ludGVyVGVzdGVyI3NldERlZmF1bHQnLAorICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtVbm5lY2Vzc2FyeVNldERlZmF1bHRcXSAuKyJdfSwKKyAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAorICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5MT1csCisgICAgICdkZXNjcmlwdGlvbic6CiAgICAgICAgICAnSmF2YTogVXNpbmcgc3RhdGljIGltcG9ydHMgZm9yIHR5cGVzIGlzIHVubmVjZXNzYXJ5JywKICAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbVW5uZWNlc3NhcnlTdGF0aWNJbXBvcnRcXSAuKyJdfSwKICAgICB7J2NhdGVnb3J5JzogJ2phdmEnLApAQCAtNTY3LDYgKzYyNyw2MSBAQAogICAgICAgICAgJ0phdmE6IFdpbGRjYXJkIGltcG9ydHMsIHN0YXRpYyBvciBvdGhlcndpc2UsIHNob3VsZCBub3QgYmUgdXNlZCcsCiAgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW1dpbGRjYXJkSW1wb3J0XF0gLisiXX0sCiAgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKKyAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuTE9XLAorICAgICAnZGVzY3JpcHRpb24nOgorICAgICAgICAgJ0phdmE6ICcsCisgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW1JlbW92ZUZpZWxkUHJlZml4ZXNcXSAuKyJdfSwKKyAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAorICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5MT1csCisgICAgICdkZXNjcmlwdGlvbic6CisgICAgICAgICAnSmF2YTogUHJlZmVyIGFzc2VydFRocm93cyB0byBFeHBlY3RlZEV4Y2VwdGlvbicsCisgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW0V4cGVjdGVkRXhjZXB0aW9uTWlncmF0aW9uXF0gLisiXX0sCisgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKKyAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuTE9XLAorICAgICAnZGVzY3JpcHRpb24nOgorICAgICAgICAgJ0phdmE6IExvZ2dlciBpbnN0YW5jZXMgYXJlIG5vdCBjb25zdGFudHMgLS0gdGhleSBhcmUgbXV0YWJsZSBhbmQgaGF2ZSBzaWRlIGVmZmVjdHMgLS0gYW5kIHNob3VsZCBub3QgYmUgbmFtZWQgdXNpbmcgQ09OU1RBTlQgQ0FTRScsCisgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW0xvZ2dlclZhcmlhYmxlQ2FzZVxdIC4rIl19LAorICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCisgICAgICdzZXZlcml0eSc6IFNldmVyaXR5LkxPVywKKyAgICAgJ2Rlc2NyaXB0aW9uJzoKKyAgICAgICAgICdKYXZhOiBQcmVmZXIgYXNzZXJ0VGhyb3dzIHRvIEBUZXN0KGV4cGVjdGVkPS4uLiknLAorICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtUZXN0RXhjZXB0aW9uTWlncmF0aW9uXF0gLisiXX0sCisgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKKyAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuTUVESVVNLAorICAgICAnZGVzY3JpcHRpb24nOgorICAgICAgICAgJ0phdmE6IFB1YmxpYyBmaWVsZHMgbXVzdCBiZSBmaW5hbC4nLAorICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtOb25GaW5hbFB1YmxpY0ZpZWxkc1xdIC4rIl19LAorICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCisgICAgICdzZXZlcml0eSc6IFNldmVyaXR5Lk1FRElVTSwKKyAgICAgJ2Rlc2NyaXB0aW9uJzoKKyAgICAgICAgICdKYXZhOiBQcml2YXRlIGZpZWxkcyB0aGF0IGFyZSBvbmx5IGFzc2lnbmVkIGluIHRoZSBpbml0aWFsaXplciBzaG91bGQgYmUgbWFkZSBmaW5hbC4nLAorICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtQcml2YXRlRmllbGRzTm90QXNzaWduZWRcXSAuKyJdfSwKKyAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAorICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5NRURJVU0sCisgICAgICdkZXNjcmlwdGlvbic6CisgICAgICAgICAnSmF2YTogTGlzdHMgcmV0dXJuZWQgYnkgbWV0aG9kcyBzaG91bGQgYmUgaW1tdXRhYmxlLicsCisgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW1JldHVybmVkTGlzdE5vdEltbXV0YWJsZVxdIC4rIl19LAorICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCisgICAgICdzZXZlcml0eSc6IFNldmVyaXR5Lk1FRElVTSwKKyAgICAgJ2Rlc2NyaXB0aW9uJzoKKyAgICAgICAgICdKYXZhOiBQYXJhbWV0ZXJzIHRvIGxvZyBtZXRob2RzIHNob3VsZCBub3QgYmUgZ2VuZXJhdGVkIGJ5IGEgY2FsbCB0byBTdHJpbmcuZm9ybWF0KCkgb3IgTWVzc2FnZUZvcm1hdC5mb3JtYXQoKS4nLAorICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtTYWZlckxvZ2dlckZvcm1hdFxdIC4rIl19LAorICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCisgICAgICdzZXZlcml0eSc6IFNldmVyaXR5Lk1FRElVTSwKKyAgICAgJ2Rlc2NyaXB0aW9uJzoKKyAgICAgICAgICdKYXZhOiBQYXJhbWV0ZXJzIHRvIGxvZyBtZXRob2RzIHNob3VsZCBub3QgYmUgZ2VuZXJhdGVkIGJ5IGEgY2FsbCB0byB0b1N0cmluZygpOyBzZWUgYi8yMjk4NjY2NS4nLAorICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtTYWZlckxvZ2dlclRvU3RyaW5nXF0gLisiXX0sCisgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKKyAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuTUVESVVNLAorICAgICAnZGVzY3JpcHRpb24nOgorICAgICAgICAgJ0phdmE6IEEgY2FsbCB0byBCaW5kZXIuY2xlYXJDYWxsaW5nSWRlbnRpdHkoKSBzaG91bGQgYmUgZm9sbG93ZWQgYnkgQmluZGVyLnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkoKSBpbiBhIGZpbmFsbHkgYmxvY2suIE90aGVyd2lzZSB0aGUgd3JvbmcgQmluZGVyIGlkZW50aXR5IG1heSBiZSB1c2VkIGJ5IHN1YnNlcXVlbnQgY29kZS4nLAorICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtCaW5kZXJJZGVudGl0eVJlc3RvcmVkRGFuZ2Vyb3VzbHlcXSAuKyJdfSwKKyAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAorICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5NRURJVU0sCisgICAgICdkZXNjcmlwdGlvbic6CisgICAgICAgICAnSmF2YTogQ2xhc3NlcyBleHRlbmRpbmcgUHJlZmVyZW5jZUFjdGl2aXR5IG11c3QgaW1wbGVtZW50IGlzVmFsaWRGcmFnbWVudCBzdWNoIHRoYXQgaXQgZG9lcyBub3QgdW5jb25kaXRpb25hbGx5IHJldHVybiB0cnVlIHRvIHByZXZlbnQgdnVsbmVyYWJpbGl0eSB0byBmcmFnbWVudCBpbmplY3Rpb24gYXR0YWNrcy4nLAorICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtGcmFnbWVudEluamVjdGlvblxdIC4rIl19LAorICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCiAgICAgICdzZXZlcml0eSc6IFNldmVyaXR5Lk1FRElVTSwKICAgICAgJ2Rlc2NyaXB0aW9uJzoKICAgICAgICAgICdKYXZhOiBTdWJjbGFzc2VzIG9mIEZyYWdtZW50IG11c3QgYmUgaW5zdGFudGlhYmxlIHZpYSBDbGFzcyNuZXdJbnN0YW5jZSgpOiB0aGUgY2xhc3MgbXVzdCBiZSBwdWJsaWMsIHN0YXRpYyBhbmQgaGF2ZSBhIHB1YmxpYyBudWxsYXJ5IGNvbnN0cnVjdG9yJywKQEAgLTU3OSw2ICs2OTQsMjYgQEAKICAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAogICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5NRURJVU0sCiAgICAgICdkZXNjcmlwdGlvbic6CisgICAgICAgICAnSmF2YTogQSB3YWtlbG9jayBhY3F1aXJlZCB3aXRoIGEgdGltZW91dCBtYXkgYmUgcmVsZWFzZWQgYnkgdGhlIHN5c3RlbSBiZWZvcmUgY2FsbGluZyBgcmVsZWFzZWAsIGV2ZW4gYWZ0ZXIgY2hlY2tpbmcgYGlzSGVsZCgpYC4gSWYgc28sIGl0IHdpbGwgdGhyb3cgYSBSdW50aW1lRXhjZXB0aW9uLiBQbGVhc2Ugd3JhcCBpbiBhIHRyeS9jYXRjaCBibG9jay4nLAorICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtXYWtlbG9ja1JlbGVhc2VkRGFuZ2Vyb3VzbHlcXSAuKyJdfSwKKyAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAorICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5NRURJVU0sCisgICAgICdkZXNjcmlwdGlvbic6CisgICAgICAgICAnSmF2YTogQXJndW1lbnRzIGFyZSBpbiB0aGUgd3Jvbmcgb3JkZXIgb3IgY291bGQgYmUgY29tbWVudGVkIGZvciBjbGFyaXR5LicsCisgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW0FyZ3VtZW50U2VsZWN0aW9uRGVmZWN0Q2hlY2tlclxdIC4rIl19LAorICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCisgICAgICdzZXZlcml0eSc6IFNldmVyaXR5Lk1FRElVTSwKKyAgICAgJ2Rlc2NyaXB0aW9uJzoKKyAgICAgICAgICdKYXZhOiBBcmd1bWVudHMgYXJlIHN3YXBwZWQgaW4gYXNzZXJ0RXF1YWxzLWxpa2UgY2FsbCcsCisgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW0Fzc2VydEVxdWFsc0FyZ3VtZW50T3JkZXJDaGVja2VyXF0gLisiXX0sCisgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKKyAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuTUVESVVNLAorICAgICAnZGVzY3JpcHRpb24nOgorICAgICAgICAgJ0phdmE6IEFuIGVxdWFsaXR5IHRlc3QgYmV0d2VlbiBvYmplY3RzIHdpdGggaW5jb21wYXRpYmxlIHR5cGVzIGFsd2F5cyByZXR1cm5zIGZhbHNlJywKKyAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbRXF1YWxzSW5jb21wYXRpYmxlVHlwZVxdIC4rIl19LAorICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCisgICAgICdzZXZlcml0eSc6IFNldmVyaXR5Lk1FRElVTSwKKyAgICAgJ2Rlc2NyaXB0aW9uJzoKICAgICAgICAgICdKYXZhOiBAQXNzaXN0ZWRJbmplY3QgYW5kIEBJbmplY3Qgc2hvdWxkIG5vdCBiZSB1c2VkIG9uIGRpZmZlcmVudCBjb25zdHJ1Y3RvcnMgaW4gdGhlIHNhbWUgY2xhc3MuJywKICAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbQXNzaXN0ZWRJbmplY3RBbmRJbmplY3RPbkNvbnN0cnVjdG9yc1xdIC4rIl19LAogICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCkBAIC02MDQsMTEgKzczOSwyMSBAQAogICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCiAgICAgICdzZXZlcml0eSc6IFNldmVyaXR5Lk1FRElVTSwKICAgICAgJ2Rlc2NyaXB0aW9uJzoKKyAgICAgICAgICdKYXZhOiBUaGUgb3JkZXJpbmcgb2YgcGFyYW1ldGVycyBpbiBvdmVybG9hZGVkIG1ldGhvZHMgc2hvdWxkIGJlIGFzIGNvbnNpc3RlbnQgYXMgcG9zc2libGUgKHdoZW4gdmlld2VkIGZyb20gbGVmdCB0byByaWdodCknLAorICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtJbmNvbnNpc3RlbnRPdmVybG9hZHNcXSAuKyJdfSwKKyAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAorICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5NRURJVU0sCisgICAgICdkZXNjcmlwdGlvbic6CiAgICAgICAgICAnSmF2YTogRG91YmxlLWNoZWNrZWQgbG9ja2luZyBvbiBub24tdm9sYXRpbGUgZmllbGRzIGlzIHVuc2FmZScsCiAgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW0RvdWJsZUNoZWNrZWRMb2NraW5nXF0gLisiXX0sCiAgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKICAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuTUVESVVNLAogICAgICAnZGVzY3JpcHRpb24nOgorICAgICAgICAgJ0phdmE6IEFubm90YXRpb25zIHNob3VsZCBhbHdheXMgYmUgaW1tdXRhYmxlJywKKyAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbSW1tdXRhYmxlQW5ub3RhdGlvbkNoZWNrZXJcXSAuKyJdfSwKKyAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAorICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5NRURJVU0sCisgICAgICdkZXNjcmlwdGlvbic6CiAgICAgICAgICAnSmF2YTogRW51bXMgc2hvdWxkIGFsd2F5cyBiZSBpbW11dGFibGUnLAogICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtJbW11dGFibGVFbnVtQ2hlY2tlclxdIC4rIl19LAogICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCkBAIC02MjksMTMgKzc3NCwxMyBAQAogICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCiAgICAgICdzZXZlcml0eSc6IFNldmVyaXR5Lk1FRElVTSwKICAgICAgJ2Rlc2NyaXB0aW9uJzoKLSAgICAgICAgICdKYXZhOiBBIGRpZmZlcmVudCBwb3RlbnRpYWwgYXJndW1lbnQgaXMgbW9yZSBzaW1pbGFyIHRvIHRoZSBuYW1lIG9mIHRoZSBwYXJhbWV0ZXIgdGhhbiB0aGUgZXhpc3RpbmcgYXJndW1lbnQ7IHRoaXMgbWF5IGJlIGFuIGVycm9yJywKLSAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbQXJndW1lbnRQYXJhbWV0ZXJNaXNtYXRjaFxdIC4rIl19LAorICAgICAgICAgJ0phdmE6IEFzc2VydGlvbnMgbWF5IGJlIGRpc2FibGVkIGF0IHJ1bnRpbWUgYW5kIGRvIG5vdCBndWFyYW50ZWUgdGhhdCBleGVjdXRpb24gd2lsbCBoYWx0IGhlcmU7IGNvbnNpZGVyIHRocm93aW5nIGFuIGV4Y2VwdGlvbiBpbnN0ZWFkJywKKyAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbQXNzZXJ0RmFsc2VcXSAuKyJdfSwKICAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAogICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5NRURJVU0sCiAgICAgICdkZXNjcmlwdGlvbic6Ci0gICAgICAgICAnSmF2YTogQXNzZXJ0aW9ucyBtYXkgYmUgZGlzYWJsZWQgYXQgcnVudGltZSBhbmQgZG8gbm90IGd1YXJhbnRlZSB0aGF0IGV4ZWN1dGlvbiB3aWxsIGhhbHQgaGVyZTsgY29uc2lkZXIgdGhyb3dpbmcgYW4gZXhjZXB0aW9uIGluc3RlYWQnLAotICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtBc3NlcnRGYWxzZVxdIC4rIl19LAorICAgICAgICAgJ0phdmE6IFRoaXMgYXNzZXJ0aW9uIHRocm93cyBhbiBBc3NlcnRpb25FcnJvciBpZiBpdCBmYWlscywgd2hpY2ggd2lsbCBiZSBjYXVnaHQgYnkgYW4gZW5jbG9zaW5nIHRyeSBibG9jay4nLAorICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtBc3NlcnRpb25GYWlsdXJlSWdub3JlZFxdIC4rIl19LAogICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCiAgICAgICdzZXZlcml0eSc6IFNldmVyaXR5Lk1FRElVTSwKICAgICAgJ2Rlc2NyaXB0aW9uJzoKQEAgLTY2NCwyMyArODA5LDYzIEBACiAgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKICAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuTUVESVVNLAogICAgICAnZGVzY3JpcHRpb24nOgorICAgICAgICAgJ0phdmE6IER1cmF0aW9uIGNhbiBiZSBleHByZXNzZWQgbW9yZSBjbGVhcmx5IHdpdGggZGlmZmVyZW50IHVuaXRzJywKKyAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbQ2Fub25pY2FsRHVyYXRpb25cXSAuKyJdfSwKKyAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAorICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5NRURJVU0sCisgICAgICdkZXNjcmlwdGlvbic6CisgICAgICAgICAnSmF2YTogTG9nZ2luZyBvciByZXRocm93aW5nIGV4Y2VwdGlvbnMgc2hvdWxkIHVzdWFsbHkgYmUgcHJlZmVycmVkIHRvIGNhdGNoaW5nIGFuZCBjYWxsaW5nIHByaW50U3RhY2tUcmFjZScsCisgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW0NhdGNoQW5kUHJpbnRTdGFja1RyYWNlXF0gLisiXX0sCisgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKKyAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuTUVESVVNLAorICAgICAnZGVzY3JpcHRpb24nOgorICAgICAgICAgJ0phdmE6IElnbm9yaW5nIGV4Y2VwdGlvbnMgYW5kIGNhbGxpbmcgZmFpbCgpIGlzIHVubmVjZXNzYXJ5LCBhbmQgbWFrZXMgdGVzdCBvdXRwdXQgbGVzcyB1c2VmdWwnLAorICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtDYXRjaEZhaWxcXSAuKyJdfSwKKyAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAorICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5NRURJVU0sCisgICAgICdkZXNjcmlwdGlvbic6CiAgICAgICAgICAnSmF2YTogSW5uZXIgY2xhc3MgaXMgbm9uLXN0YXRpYyBidXQgZG9lcyBub3QgcmVmZXJlbmNlIGVuY2xvc2luZyBjbGFzcycsCiAgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW0NsYXNzQ2FuQmVTdGF0aWNcXSAuKyJdfSwKICAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAogICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5NRURJVU0sCiAgICAgICdkZXNjcmlwdGlvbic6Ci0gICAgICAgICAnSmF2YTogQ2xhc3MubmV3SW5zdGFuY2UoKSBieXBhc3NlcyBleGNlcHRpb24gY2hlY2tpbmc7IHByZWZlciBnZXRDb25zdHJ1Y3RvcigpLm5ld0luc3RhbmNlKCknLAorICAgICAgICAgJ0phdmE6IENsYXNzLm5ld0luc3RhbmNlKCkgYnlwYXNzZXMgZXhjZXB0aW9uIGNoZWNraW5nOyBwcmVmZXIgZ2V0RGVjbGFyZWRDb25zdHJ1Y3RvcigpLm5ld0luc3RhbmNlKCknLAogICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtDbGFzc05ld0luc3RhbmNlXF0gLisiXX0sCiAgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKICAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuTUVESVVNLAogICAgICAnZGVzY3JpcHRpb24nOgotICAgICAgICAgJ0phdmE6IEltcGxpY2l0IHVzZSBvZiB0aGUgcGxhdGZvcm0gZGVmYXVsdCBjaGFyc2V0LCB3aGljaCBjYW4gcmVzdWx0IGluIGUuZy4gbm9uLUFTQ0lJIGNoYXJhY3RlcnMgYmVpbmcgc2lsZW50bHkgcmVwbGFjZWQgd2l0aCBcJz9cJyBpbiBtYW55IGVudmlyb25tZW50cycsCi0gICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW0RlZmF1bHRDaGFyc2V0XF0gLisiXX0sCisgICAgICAgICAnSmF2YTogVGhlIHR5cGUgb2YgdGhlIGFycmF5IHBhcmFtZXRlciBvZiBDb2xsZWN0aW9uLnRvQXJyYXkgbmVlZHMgdG8gYmUgY29tcGF0aWJsZSB3aXRoIHRoZSBhcnJheSB0eXBlJywKKyAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbQ29sbGVjdGlvblRvQXJyYXlTYWZlUGFyYW1ldGVyXF0gLisiXX0sCiAgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKICAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuTUVESVVNLAogICAgICAnZGVzY3JpcHRpb24nOgotICAgICAgICAgJ0phdmE6IFRoaXMgY29kZSwgd2hpY2ggY291bnRzIGVsZW1lbnRzIHVzaW5nIGEgbG9vcCwgY2FuIGJlIHJlcGxhY2VkIGJ5IGEgc2ltcGxlciBsaWJyYXJ5IG1ldGhvZCcsCi0gICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW0VsZW1lbnRzQ291bnRlZEluTG9vcFxdIC4rIl19LAorICAgICAgICAgJ0phdmE6IENvbGxlY3Rvci5vZigpIHNob3VsZCBub3QgdXNlIHN0YXRlJywKKyAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbQ29sbGVjdG9yU2hvdWxkTm90VXNlU3RhdGVcXSAuKyJdfSwKKyAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAorICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5NRURJVU0sCisgICAgICdkZXNjcmlwdGlvbic6CisgICAgICAgICAnSmF2YTogQ2xhc3Mgc2hvdWxkIG5vdCBpbXBsZW1lbnQgYm90aCBgQ29tcGFyYWJsZWAgYW5kIGBDb21wYXJhdG9yYCcsCisgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW0NvbXBhcmFibGVBbmRDb21wYXJhdG9yXF0gLisiXX0sCisgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKKyAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuTUVESVVNLAorICAgICAnZGVzY3JpcHRpb24nOgorICAgICAgICAgJ0phdmE6IENvbnN0cnVjdG9ycyBzaG91bGQgbm90IGludm9rZSBvdmVycmlkYWJsZSBtZXRob2RzLicsCisgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW0NvbnN0cnVjdG9ySW52b2tlc092ZXJyaWRhYmxlXF0gLisiXX0sCisgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKKyAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuTUVESVVNLAorICAgICAnZGVzY3JpcHRpb24nOgorICAgICAgICAgJ0phdmE6IENvbnN0cnVjdG9ycyBzaG91bGQgbm90IHBhc3MgdGhlIFwndGhpc1wnIHJlZmVyZW5jZSBvdXQgaW4gbWV0aG9kIGludm9jYXRpb25zLCBzaW5jZSB0aGUgb2JqZWN0IG1heSBub3QgYmUgZnVsbHkgY29uc3RydWN0ZWQuJywKKyAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbQ29uc3RydWN0b3JMZWFrc1RoaXNcXSAuKyJdfSwKKyAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAorICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5NRURJVU0sCisgICAgICdkZXNjcmlwdGlvbic6CisgICAgICAgICAnSmF2YTogRGF0ZUZvcm1hdCBpcyBub3QgdGhyZWFkLXNhZmUsIGFuZCBzaG91bGQgbm90IGJlIHVzZWQgYXMgYSBjb25zdGFudCBmaWVsZC4nLAorICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtEYXRlRm9ybWF0Q29uc3RhbnRcXSAuKyJdfSwKKyAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAorICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5NRURJVU0sCisgICAgICdkZXNjcmlwdGlvbic6CisgICAgICAgICAnSmF2YTogSW1wbGljaXQgdXNlIG9mIHRoZSBwbGF0Zm9ybSBkZWZhdWx0IGNoYXJzZXQsIHdoaWNoIGNhbiByZXN1bHQgaW4gZGlmZmVyaW5nIGJlaGF2aW9yIGJldHdlZW4gSlZNIGV4ZWN1dGlvbnMgb3IgaW5jb3JyZWN0IGJlaGF2aW9yIGlmIHRoZSBlbmNvZGluZyBvZiB0aGUgZGF0YSBzb3VyY2UgZG9lc25cJ3QgbWF0Y2ggZXhwZWN0YXRpb25zLicsCisgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW0RlZmF1bHRDaGFyc2V0XF0gLisiXX0sCiAgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKICAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuTUVESVVNLAogICAgICAnZGVzY3JpcHRpb24nOgpAQCAtNjk0LDggKzg3OSwxMyBAQAogICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCiAgICAgICdzZXZlcml0eSc6IFNldmVyaXR5Lk1FRElVTSwKICAgICAgJ2Rlc2NyaXB0aW9uJzoKLSAgICAgICAgICdKYXZhOiBBbiBlcXVhbGl0eSB0ZXN0IGJldHdlZW4gb2JqZWN0cyB3aXRoIGluY29tcGF0aWJsZSB0eXBlcyBhbHdheXMgcmV0dXJucyBmYWxzZScsCi0gICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW0VxdWFsc0luY29tcGF0aWJsZVR5cGVcXSAuKyJdfSwKKyAgICAgICAgICdKYXZhOiBDYWxscyB0byBFeHBlY3RlZEV4Y2VwdGlvbiNleHBlY3Qgc2hvdWxkIGFsd2F5cyBiZSBmb2xsb3dlZCBieSBleGFjdGx5IG9uZSBzdGF0ZW1lbnQuJywKKyAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbRXhwZWN0ZWRFeGNlcHRpb25DaGVja2VyXF0gLisiXX0sCisgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKKyAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuTUVESVVNLAorICAgICAnZGVzY3JpcHRpb24nOgorICAgICAgICAgJ0phdmE6IFN3aXRjaCBjYXNlIG1heSBmYWxsIHRocm91Z2gnLAorICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtGYWxsVGhyb3VnaFxdIC4rIl19LAogICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCiAgICAgICdzZXZlcml0eSc6IFNldmVyaXR5Lk1FRElVTSwKICAgICAgJ2Rlc2NyaXB0aW9uJzoKQEAgLTcwNCwyNiArODk0LDYxIEBACiAgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKICAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuTUVESVVNLAogICAgICAnZGVzY3JpcHRpb24nOgorICAgICAgICAgJ0phdmE6IFVzZSBwYXJlbnRoZXNlcyB0byBtYWtlIHRoZSBwcmVjZWRlbmNlIGV4cGxpY2l0JywKKyAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbRmxvYXRDYXN0XF0gLisiXX0sCisgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKKyAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuTUVESVVNLAorICAgICAnZGVzY3JpcHRpb24nOgorICAgICAgICAgJ0phdmE6IEZsb2F0aW5nIHBvaW50IGxpdGVyYWwgbG9zZXMgcHJlY2lzaW9uJywKKyAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbRmxvYXRpbmdQb2ludExpdGVyYWxQcmVjaXNpb25cXSAuKyJdfSwKKyAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAorICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5NRURJVU0sCisgICAgICdkZXNjcmlwdGlvbic6CiAgICAgICAgICAnSmF2YTogT3ZlcmxvYWRzIHdpbGwgYmUgYW1iaWd1b3VzIHdoZW4gcGFzc2luZyBsYW1iZGEgYXJndW1lbnRzJywKICAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbRnVuY3Rpb25hbEludGVyZmFjZUNsYXNoXF0gLisiXX0sCiAgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKICAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuTUVESVVNLAogICAgICAnZGVzY3JpcHRpb24nOgorICAgICAgICAgJ0phdmE6IFJldHVybiB2YWx1ZSBvZiBtZXRob2RzIHJldHVybmluZyBGdXR1cmUgbXVzdCBiZSBjaGVja2VkLiBJZ25vcmluZyByZXR1cm5lZCBGdXR1cmVzIHN1cHByZXNzZXMgZXhjZXB0aW9ucyB0aHJvd24gZnJvbSB0aGUgY29kZSB0aGF0IGNvbXBsZXRlcyB0aGUgRnV0dXJlLicsCisgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW0Z1dHVyZVJldHVyblZhbHVlSWdub3JlZFxdIC4rIl19LAorICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCisgICAgICdzZXZlcml0eSc6IFNldmVyaXR5Lk1FRElVTSwKKyAgICAgJ2Rlc2NyaXB0aW9uJzoKICAgICAgICAgICdKYXZhOiBDYWxsaW5nIGdldENsYXNzKCkgb24gYW4gZW51bSBtYXkgcmV0dXJuIGEgc3ViY2xhc3Mgb2YgdGhlIGVudW0gdHlwZScsCiAgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW0dldENsYXNzT25FbnVtXF0gLisiXX0sCiAgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKICAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuTUVESVVNLAogICAgICAnZGVzY3JpcHRpb24nOgorICAgICAgICAgJ0phdmE6IEhpZGluZyBmaWVsZHMgb2Ygc3VwZXJjbGFzc2VzIG1heSBjYXVzZSBjb25mdXNpb24gYW5kIGVycm9ycycsCisgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW0hpZGluZ0ZpZWxkXF0gLisiXX0sCisgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKKyAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuTUVESVVNLAorICAgICAnZGVzY3JpcHRpb24nOgogICAgICAgICAgJ0phdmE6IFRoaXMgYW5ub3RhdGlvbiBoYXMgaW5jb21wYXRpYmxlIG1vZGlmaWVycyBhcyBzcGVjaWZpZWQgYnkgaXRzIEBJbmNvbXBhdGlibGVNb2RpZmllcnMgYW5ub3RhdGlvbicsCiAgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW0luY29tcGF0aWJsZU1vZGlmaWVyc1xdIC4rIl19LAogICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCiAgICAgICdzZXZlcml0eSc6IFNldmVyaXR5Lk1FRElVTSwKICAgICAgJ2Rlc2NyaXB0aW9uJzoKKyAgICAgICAgICdKYXZhOiBUaGlzIGZvciBsb29wIGluY3JlbWVudHMgdGhlIHNhbWUgdmFyaWFibGUgaW4gdGhlIGhlYWRlciBhbmQgaW4gdGhlIGJvZHknLAorICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtJbmNyZW1lbnRJbkZvckxvb3BBbmRIZWFkZXJcXSAuKyJdfSwKKyAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAorICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5NRURJVU0sCisgICAgICdkZXNjcmlwdGlvbic6CiAgICAgICAgICAnSmF2YTogUGxlYXNlIGFsc28gb3ZlcnJpZGUgaW50IHJlYWQoYnl0ZVtdLCBpbnQsIGludCksIG90aGVyd2lzZSBtdWx0aS1ieXRlIHJlYWRzIGZyb20gdGhpcyBpbnB1dCBzdHJlYW0gYXJlIGxpa2VseSB0byBiZSBzbG93LicsCiAgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW0lucHV0U3RyZWFtU2xvd011bHRpYnl0ZVJlYWRcXSAuKyJdfSwKICAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAogICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5NRURJVU0sCiAgICAgICdkZXNjcmlwdGlvbic6CisgICAgICAgICAnSmF2YTogQ2FzdGluZyBpbnNpZGUgYW4gaWYgYmxvY2sgc2hvdWxkIGJlIHBsYXVzaWJseSBjb25zaXN0ZW50IHdpdGggdGhlIGluc3RhbmNlb2YgdHlwZScsCisgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW0luc3RhbmNlT2ZBbmRDYXN0TWF0Y2hXcm9uZ1R5cGVcXSAuKyJdfSwKKyAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAorICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5NRURJVU0sCisgICAgICdkZXNjcmlwdGlvbic6CisgICAgICAgICAnSmF2YTogRXhwcmVzc2lvbiBvZiB0eXBlIGludCBtYXkgb3ZlcmZsb3cgYmVmb3JlIGJlaW5nIGFzc2lnbmVkIHRvIGEgbG9uZycsCisgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW0ludExvbmdNYXRoXF0gLisiXX0sCisgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKKyAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuTUVESVVNLAorICAgICAnZGVzY3JpcHRpb24nOgogICAgICAgICAgJ0phdmE6IENsYXNzIHNob3VsZCBub3QgaW1wbGVtZW50IGJvdGggYEl0ZXJhYmxlYCBhbmQgYEl0ZXJhdG9yYCcsCiAgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW0l0ZXJhYmxlQW5kSXRlcmF0b3JcXSAuKyJdfSwKICAgICB7J2NhdGVnb3J5JzogJ2phdmEnLApAQCAtNzM0LDE2ICs5NTksNDEgQEAKICAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAogICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5NRURJVU0sCiAgICAgICdkZXNjcmlwdGlvbic6CisgICAgICAgICAnSmF2YTogU29tZSBKVW5pdDQgY29uc3RydWN0IGNhbm5vdCBiZSB1c2VkIGluIGEgSlVuaXQzIGNvbnRleHQuIENvbnZlcnQgeW91ciBjbGFzcyB0byBKVW5pdDQgc3R5bGUgdG8gdXNlIHRoZW0uJywKKyAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbSlVuaXQ0Q2xhc3NVc2VkSW5KVW5pdDNcXSAuKyJdfSwKKyAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAorICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5NRURJVU0sCisgICAgICdkZXNjcmlwdGlvbic6CiAgICAgICAgICAnSmF2YTogVGVzdCBjbGFzcyBpbmhlcml0cyBmcm9tIEpVbml0IDNcJ3MgVGVzdENhc2UgYnV0IGhhcyBKVW5pdCA0IEBUZXN0IGFubm90YXRpb25zLicsCiAgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW0pVbml0QW1iaWd1b3VzVGVzdENsYXNzXF0gLisiXX0sCiAgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKICAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuTUVESVVNLAogICAgICAnZGVzY3JpcHRpb24nOgotICAgICAgICAgJ0phdmE6IFRoZSBHb29nbGUgSmF2YSBTdHlsZSBHdWlkZSByZXF1aXJlcyBzd2l0Y2ggc3RhdGVtZW50cyB0byBoYXZlIGFuIGV4cGxpY2l0IGRlZmF1bHQnLAorICAgICAgICAgJ0phdmE6IE5ldmVyIHJldXNlIGNsYXNzIG5hbWVzIGZyb20gamF2YS5sYW5nJywKKyAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbSmF2YUxhbmdDbGFzaFxdIC4rIl19LAorICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCisgICAgICdzZXZlcml0eSc6IFNldmVyaXR5Lk1FRElVTSwKKyAgICAgJ2Rlc2NyaXB0aW9uJzoKKyAgICAgICAgICdKYXZhOiBTdWdnZXN0cyBhbHRlcm5hdGl2ZXMgdG8gb2Jzb2xldGUgSkRLIGNsYXNzZXMuJywKKyAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbSmRrT2Jzb2xldGVcXSAuKyJdfSwKKyAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAorICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5NRURJVU0sCisgICAgICdkZXNjcmlwdGlvbic6CisgICAgICAgICAnSmF2YTogQXNzaWdubWVudCB3aGVyZSBhIGJvb2xlYW4gZXhwcmVzc2lvbiB3YXMgZXhwZWN0ZWQ7IHVzZSA9PSBpZiB0aGlzIGFzc2lnbm1lbnQgd2FzblwndCBleHBlY3RlZCBvciBhZGQgcGFyZW50aGVzZXMgZm9yIGNsYXJpdHkuJywKKyAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbTG9naWNhbEFzc2lnbm1lbnRcXSAuKyJdfSwKKyAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAorICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5NRURJVU0sCisgICAgICdkZXNjcmlwdGlvbic6CisgICAgICAgICAnSmF2YTogU3dpdGNoZXMgb24gZW51bSB0eXBlcyBzaG91bGQgZWl0aGVyIGhhbmRsZSBhbGwgdmFsdWVzLCBvciBoYXZlIGEgZGVmYXVsdCBjYXNlLicsCiAgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW01pc3NpbmdDYXNlc0luRW51bVN3aXRjaFxdIC4rIl19LAogICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCiAgICAgICdzZXZlcml0eSc6IFNldmVyaXR5Lk1FRElVTSwKICAgICAgJ2Rlc2NyaXB0aW9uJzoKKyAgICAgICAgICdKYXZhOiBUaGUgR29vZ2xlIEphdmEgU3R5bGUgR3VpZGUgcmVxdWlyZXMgdGhhdCBlYWNoIHN3aXRjaCBzdGF0ZW1lbnQgaW5jbHVkZXMgYSBkZWZhdWx0IHN0YXRlbWVudCBncm91cCwgZXZlbiBpZiBpdCBjb250YWlucyBubyBjb2RlLiAoVGhpcyByZXF1aXJlbWVudCBpcyBsaWZ0ZWQgZm9yIGFueSBzd2l0Y2ggc3RhdGVtZW50IHRoYXQgY292ZXJzIGFsbCB2YWx1ZXMgb2YgYW4gZW51bS4pJywKKyAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbTWlzc2luZ0RlZmF1bHRcXSAuKyJdfSwKKyAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAorICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5NRURJVU0sCisgICAgICdkZXNjcmlwdGlvbic6CiAgICAgICAgICAnSmF2YTogTm90IGNhbGxpbmcgZmFpbCgpIHdoZW4gZXhwZWN0aW5nIGFuIGV4Y2VwdGlvbiBtYXNrcyBidWdzJywKICAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbTWlzc2luZ0ZhaWxcXSAuKyJdfSwKICAgICB7J2NhdGVnb3J5JzogJ2phdmEnLApAQCAtNzU0LDExICsxMDA0LDM2IEBACiAgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKICAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuTUVESVVNLAogICAgICAnZGVzY3JpcHRpb24nOgotICAgICAgICAgJ0phdmE6IENvbXBvdW5kIGFzc2lnbm1lbnRzIHRvIGJ5dGVzLCBzaG9ydHMsIGNoYXJzLCBhbmQgZmxvYXRzIGhpZGUgZGFuZ2Vyb3VzIGNhc3RzJywKKyAgICAgICAgICdKYXZhOiBNb2RpZnlpbmcgYSBjb2xsZWN0aW9uIHdoaWxlIGl0ZXJhdGluZyBvdmVyIGl0IGluIGEgbG9vcCBtYXkgY2F1c2UgYSBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uIHRvIGJlIHRocm93bi4nLAorICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtNb2RpZnlDb2xsZWN0aW9uSW5FbmhhbmNlZEZvckxvb3BcXSAuKyJdfSwKKyAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAorICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5NRURJVU0sCisgICAgICdkZXNjcmlwdGlvbic6CisgICAgICAgICAnSmF2YTogTXVsdGlwbGUgY2FsbHMgdG8gZWl0aGVyIHBhcmFsbGVsIG9yIHNlcXVlbnRpYWwgYXJlIHVubmVjZXNzYXJ5IGFuZCBjYXVzZSBjb25mdXNpb24uJywKKyAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbTXVsdGlwbGVQYXJhbGxlbE9yU2VxdWVudGlhbENhbGxzXF0gLisiXX0sCisgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKKyAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuTUVESVVNLAorICAgICAnZGVzY3JpcHRpb24nOgorICAgICAgICAgJ0phdmE6IENvbnN0YW50IGZpZWxkIGRlY2xhcmF0aW9ucyBzaG91bGQgdXNlIHRoZSBpbW11dGFibGUgdHlwZSAoc3VjaCBhcyBJbW11dGFibGVMaXN0KSBpbnN0ZWFkIG9mIHRoZSBnZW5lcmFsIGNvbGxlY3Rpb24gaW50ZXJmYWNlIHR5cGUgKHN1Y2ggYXMgTGlzdCknLAorICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtNdXRhYmxlQ29uc3RhbnRGaWVsZFxdIC4rIl19LAorICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCisgICAgICdzZXZlcml0eSc6IFNldmVyaXR5Lk1FRElVTSwKKyAgICAgJ2Rlc2NyaXB0aW9uJzoKKyAgICAgICAgICdKYXZhOiBNZXRob2QgcmV0dXJuIHR5cGUgc2hvdWxkIHVzZSB0aGUgaW1tdXRhYmxlIHR5cGUgKHN1Y2ggYXMgSW1tdXRhYmxlTGlzdCkgaW5zdGVhZCBvZiB0aGUgZ2VuZXJhbCBjb2xsZWN0aW9uIGludGVyZmFjZSB0eXBlIChzdWNoIGFzIExpc3QpJywKKyAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbTXV0YWJsZU1ldGhvZFJldHVyblR5cGVcXSAuKyJdfSwKKyAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAorICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5NRURJVU0sCisgICAgICdkZXNjcmlwdGlvbic6CisgICAgICAgICAnSmF2YTogQ29tcG91bmQgYXNzaWdubWVudHMgbWF5IGhpZGUgZGFuZ2Vyb3VzIGNhc3RzJywKICAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbTmFycm93aW5nQ29tcG91bmRBc3NpZ25tZW50XF0gLisiXX0sCiAgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKICAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuTUVESVVNLAogICAgICAnZGVzY3JpcHRpb24nOgorICAgICAgICAgJ0phdmE6IE5lc3RlZCBpbnN0YW5jZU9mIGNvbmRpdGlvbnMgb2YgZGlzam9pbnQgdHlwZXMgY3JlYXRlIGJsb2NrcyBvZiBjb2RlIHRoYXQgbmV2ZXIgZXhlY3V0ZScsCisgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW05lc3RlZEluc3RhbmNlT2ZDb25kaXRpb25zXF0gLisiXX0sCisgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKKyAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuTUVESVVNLAorICAgICAnZGVzY3JpcHRpb24nOgogICAgICAgICAgJ0phdmE6IFRoaXMgdXBkYXRlIG9mIGEgdm9sYXRpbGUgdmFyaWFibGUgaXMgbm9uLWF0b21pYycsCiAgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW05vbkF0b21pY1ZvbGF0aWxlVXBkYXRlXF0gLisiXX0sCiAgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKQEAgLTc5NCw2ICsxMDY5LDMxIEBACiAgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKICAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuTUVESVVNLAogICAgICAnZGVzY3JpcHRpb24nOgorICAgICAgICAgJ0phdmE6IE9uZSBzaG91bGQgbm90IGNhbGwgb3B0aW9uYWwuZ2V0KCkgaW5zaWRlIGFuIGlmIHN0YXRlbWVudCB0aGF0IGNoZWNrcyAhb3B0aW9uYWwuaXNQcmVzZW50JywKKyAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbT3B0aW9uYWxOb3RQcmVzZW50XF0gLisiXX0sCisgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKKyAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuTUVESVVNLAorICAgICAnZGVzY3JpcHRpb24nOgorICAgICAgICAgJ0phdmE6IFN0cmluZyBsaXRlcmFsIGNvbnRhaW5zIGZvcm1hdCBzcGVjaWZpZXJzLCBidXQgaXMgbm90IHBhc3NlZCB0byBhIGZvcm1hdCBtZXRob2QnLAorICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtPcnBoYW5lZEZvcm1hdFN0cmluZ1xdIC4rIl19LAorICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCisgICAgICdzZXZlcml0eSc6IFNldmVyaXR5Lk1FRElVTSwKKyAgICAgJ2Rlc2NyaXB0aW9uJzoKKyAgICAgICAgICdKYXZhOiBUbyByZXR1cm4gYSBjdXN0b20gbWVzc2FnZSB3aXRoIGEgVGhyb3dhYmxlIGNsYXNzLCBvbmUgc2hvdWxkIG92ZXJyaWRlIGdldE1lc3NhZ2UoKSBpbnN0ZWFkIG9mIHRvU3RyaW5nKCkgZm9yIFRocm93YWJsZS4nLAorICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtPdmVycmlkZVRocm93YWJsZVRvU3RyaW5nXF0gLisiXX0sCisgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKKyAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuTUVESVVNLAorICAgICAnZGVzY3JpcHRpb24nOgorICAgICAgICAgJ0phdmE6IFZhcmFyZ3MgZG9lc25cJ3QgYWdyZWUgZm9yIG92ZXJyaWRkZW4gbWV0aG9kJywKKyAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbT3ZlcnJpZGVzXF0gLisiXX0sCisgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKKyAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuTUVESVVNLAorICAgICAnZGVzY3JpcHRpb24nOgorICAgICAgICAgJ0phdmE6IERldGVjdHMgYC8qIG5hbWU9ICovYC1zdHlsZSBjb21tZW50cyBvbiBhY3R1YWwgcGFyYW1ldGVycyB3aGVyZSB0aGUgbmFtZSBkb2VzblwndCBtYXRjaCB0aGUgZm9ybWFsIHBhcmFtZXRlcicsCisgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW1BhcmFtZXRlck5hbWVcXSAuKyJdfSwKKyAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAorICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5NRURJVU0sCisgICAgICdkZXNjcmlwdGlvbic6CiAgICAgICAgICAnSmF2YTogUHJlY29uZGl0aW9ucyBvbmx5IGFjY2VwdHMgdGhlICVzIHBsYWNlaG9sZGVyIGluIGVycm9yIG1lc3NhZ2Ugc3RyaW5ncycsCiAgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW1ByZWNvbmRpdGlvbnNJbnZhbGlkUGxhY2Vob2xkZXJcXSAuKyJdfSwKICAgICB7J2NhdGVnb3J5JzogJ2phdmEnLApAQCAtODA5LDYgKzExMDksMTYgQEAKICAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAogICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5NRURJVU0sCiAgICAgICdkZXNjcmlwdGlvbic6CisgICAgICAgICAnSmF2YTogQnVnQ2hlY2tlciBoYXMgaW5jb3JyZWN0IFByb3ZpZGVzRml4IHRhZywgcGxlYXNlIHVwZGF0ZScsCisgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW1Byb3ZpZGVzRml4XF0gLisiXX0sCisgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKKyAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuTUVESVVNLAorICAgICAnZGVzY3JpcHRpb24nOgorICAgICAgICAgJ0phdmE6IHJlYWNoYWJpbGl0eUZlbmNlIHNob3VsZCBhbHdheXMgYmUgY2FsbGVkIGluc2lkZSBhIGZpbmFsbHkgYmxvY2snLAorICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtSZWFjaGFiaWxpdHlGZW5jZVVzYWdlXF0gLisiXX0sCisgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKKyAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuTUVESVVNLAorICAgICAnZGVzY3JpcHRpb24nOgogICAgICAgICAgJ0phdmE6IFRocm93biBleGNlcHRpb24gaXMgYSBzdWJ0eXBlIG9mIGFub3RoZXInLAogICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtSZWR1bmRhbnRUaHJvd3NcXSAuKyJdfSwKICAgICB7J2NhdGVnb3J5JzogJ2phdmEnLApAQCAtODI0LDggKzExMzQsMTggQEAKICAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAogICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5NRURJVU0sCiAgICAgICdkZXNjcmlwdGlvbic6Ci0gICAgICAgICAnSmF2YTogQSBzdGF0aWMgdmFyaWFibGUgb3IgbWV0aG9kIHNob3VsZCBub3QgYmUgYWNjZXNzZWQgZnJvbSBhbiBvYmplY3QgaW5zdGFuY2UnLAotICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtTdGF0aWNBY2Nlc3NlZEZyb21JbnN0YW5jZVxdIC4rIl19LAorICAgICAgICAgJ0phdmE6IFByZWZlciB0aGUgc2hvcnQtY2lyY3VpdGluZyBib29sZWFuIG9wZXJhdG9ycyBcdTAwMjZcdTAwMjYgYW5kIHx8IHRvIFx1MDAyNiBhbmQgfC4nLAorICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtTaG9ydENpcmN1aXRCb29sZWFuXF0gLisiXX0sCisgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKKyAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuTUVESVVNLAorICAgICAnZGVzY3JpcHRpb24nOgorICAgICAgICAgJ0phdmE6IEEgc3RhdGljIHZhcmlhYmxlIG9yIG1ldGhvZCBzaG91bGQgYmUgcXVhbGlmaWVkIHdpdGggYSBjbGFzcyBuYW1lLCBub3QgZXhwcmVzc2lvbicsCisgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW1N0YXRpY1F1YWxpZmllZFVzaW5nRXhwcmVzc2lvblxdIC4rIl19LAorICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCisgICAgICdzZXZlcml0eSc6IFNldmVyaXR5Lk1FRElVTSwKKyAgICAgJ2Rlc2NyaXB0aW9uJzoKKyAgICAgICAgICdKYXZhOiBTdHJlYW1zIHRoYXQgZW5jYXBzdWxhdGUgYSBjbG9zZWFibGUgcmVzb3VyY2Ugc2hvdWxkIGJlIGNsb3NlZCB1c2luZyB0cnktd2l0aC1yZXNvdXJjZXMnLAorICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtTdHJlYW1SZXNvdXJjZUxlYWtcXSAuKyJdfSwKICAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAogICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5NRURJVU0sCiAgICAgICdkZXNjcmlwdGlvbic6CkBAIC04MzQsMTMgKzExNTQsNDMgQEAKICAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAogICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5NRURJVU0sCiAgICAgICdkZXNjcmlwdGlvbic6CisgICAgICAgICAnSmF2YTogU3RyaW5nLnNwbGl0IHNob3VsZCBuZXZlciB0YWtlIG9ubHkgYSBzaW5nbGUgYXJndW1lbnQ7IGl0IGhhcyBzdXJwcmlzaW5nIGJlaGF2aW9yJywKKyAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbU3RyaW5nU3BsaXRcXSAuKyJdfSwKKyAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAorICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5NRURJVU0sCisgICAgICdkZXNjcmlwdGlvbic6CisgICAgICAgICAnSmF2YTogUHJlZmVyIFNwbGl0dGVyIHRvIFN0cmluZy5zcGxpdCcsCisgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW1N0cmluZ1NwbGl0dGVyXF0gLisiXX0sCisgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKKyAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuTUVESVVNLAorICAgICAnZGVzY3JpcHRpb24nOgorICAgICAgICAgJ0phdmE6IFVzaW5nIEBUZXN0KGV4cGVjdGVkPS4uLikgaXMgZGlzY291cmFnZWQsIHNpbmNlIHRoZSB0ZXN0IHdpbGwgcGFzcyBpZiAqYW55KiBzdGF0ZW1lbnQgaW4gdGhlIHRlc3QgbWV0aG9kIHRocm93cyB0aGUgZXhwZWN0ZWQgZXhjZXB0aW9uJywKKyAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbVGVzdEV4Y2VwdGlvbkNoZWNrZXJcXSAuKyJdfSwKKyAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAorICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5NRURJVU0sCisgICAgICdkZXNjcmlwdGlvbic6CisgICAgICAgICAnSmF2YTogVGhyZWFkLmpvaW4gbmVlZHMgdG8gYmUgc3Vycm91bmRlZCBieSBhIGxvb3AgdW50aWwgaXQgc3VjY2VlZHMsIGFzIGluIFVuaW50ZXJydXB0aWJsZXMuam9pblVuaW50ZXJydXB0aWJseS4nLAorICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtUaHJlYWRKb2luTG9vcFxdIC4rIl19LAorICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCisgICAgICdzZXZlcml0eSc6IFNldmVyaXR5Lk1FRElVTSwKKyAgICAgJ2Rlc2NyaXB0aW9uJzoKKyAgICAgICAgICdKYXZhOiBUaHJlYWRMb2NhbHMgc2hvdWxkIGJlIHN0b3JlZCBpbiBzdGF0aWMgZmllbGRzJywKKyAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbVGhyZWFkTG9jYWxVc2FnZVxdIC4rIl19LAorICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCisgICAgICdzZXZlcml0eSc6IFNldmVyaXR5Lk1FRElVTSwKKyAgICAgJ2Rlc2NyaXB0aW9uJzoKKyAgICAgICAgICdKYXZhOiBUaHJlZS1sZXR0ZXIgdGltZSB6b25lIGlkZW50aWZpZXJzIGFyZSBkZXByZWNhdGVkLCBtYXkgYmUgYW1iaWd1b3VzLCBhbmQgbWlnaHQgbm90IGRvIHdoYXQgeW91IGludGVuZDsgdGhlIGZ1bGwgSUFOQSB0aW1lIHpvbmUgSUQgc2hvdWxkIGJlIHVzZWQgaW5zdGVhZC4nLAorICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtUaHJlZUxldHRlclRpbWVab25lSURcXSAuKyJdfSwKKyAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAorICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5NRURJVU0sCisgICAgICdkZXNjcmlwdGlvbic6CiAgICAgICAgICAnSmF2YTogVHJ1dGggTGlicmFyeSBhc3NlcnQgaXMgY2FsbGVkIG9uIGEgY29uc3RhbnQuJywKICAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbVHJ1dGhDb25zdGFudEFzc2VydHNcXSAuKyJdfSwKICAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAogICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5NRURJVU0sCiAgICAgICdkZXNjcmlwdGlvbic6Ci0gICAgICAgICAnSmF2YTogQW4gb2JqZWN0IGlzIHRlc3RlZCBmb3IgZXF1YWxpdHkgdG8gaXRzZWxmIHVzaW5nIFRydXRoIExpYnJhcmllcy4nLAotICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtUcnV0aFNlbGZFcXVhbHNcXSAuKyJdfSwKKyAgICAgICAgICdKYXZhOiBUeXBlIHBhcmFtZXRlciBkZWNsYXJhdGlvbiBvdmVycmlkZXMgYW5vdGhlciB0eXBlIHBhcmFtZXRlciBhbHJlYWR5IGRlY2xhcmVkJywKKyAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbVHlwZVBhcmFtZXRlclNoYWRvd2luZ1xdIC4rIl19LAogICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCiAgICAgICdzZXZlcml0eSc6IFNldmVyaXR5Lk1FRElVTSwKICAgICAgJ2Rlc2NyaXB0aW9uJzoKQEAgLTg0OSwxMSArMTE5OSwzMSBAQAogICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCiAgICAgICdzZXZlcml0eSc6IFNldmVyaXR5Lk1FRElVTSwKICAgICAgJ2Rlc2NyaXB0aW9uJzoKKyAgICAgICAgICdKYXZhOiBDcmVhdGlvbiBvZiBhIFNldC9IYXNoU2V0L0hhc2hNYXAgb2YgamF2YS5uZXQuVVJMLiBlcXVhbHMoKSBhbmQgaGFzaENvZGUoKSBvZiBqYXZhLm5ldC5VUkwgY2xhc3MgbWFrZSBibG9ja2luZyBpbnRlcm5ldCBjb25uZWN0aW9ucy4nLAorICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtVUkxFcXVhbHNIYXNoQ29kZVxdIC4rIl19LAorICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCisgICAgICdzZXZlcml0eSc6IFNldmVyaXR5Lk1FRElVTSwKKyAgICAgJ2Rlc2NyaXB0aW9uJzoKKyAgICAgICAgICdKYXZhOiBTd2l0Y2ggaGFuZGxlcyBhbGwgZW51bSB2YWx1ZXM7IGFuIGV4cGxpY2l0IGRlZmF1bHQgY2FzZSBpcyB1bm5lY2Vzc2FyeSBhbmQgZGVmZWF0cyBlcnJvciBjaGVja2luZyBmb3Igbm9uLWV4aGF1c3RpdmUgc3dpdGNoZXMuJywKKyAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbVW5uZWNlc3NhcnlEZWZhdWx0SW5FbnVtU3dpdGNoXF0gLisiXX0sCisgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKKyAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuTUVESVVNLAorICAgICAnZGVzY3JpcHRpb24nOgorICAgICAgICAgJ0phdmE6IEZpbmFsaXplciBtYXkgcnVuIGJlZm9yZSBuYXRpdmUgY29kZSBmaW5pc2hlcyBleGVjdXRpb24nLAorICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtVbnNhZmVGaW5hbGl6YXRpb25cXSAuKyJdfSwKKyAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAorICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5NRURJVU0sCisgICAgICdkZXNjcmlwdGlvbic6CiAgICAgICAgICAnSmF2YTogVW5zeW5jaHJvbml6ZWQgbWV0aG9kIG92ZXJyaWRlcyBhIHN5bmNocm9uaXplZCBtZXRob2QuJywKICAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbVW5zeW5jaHJvbml6ZWRPdmVycmlkZXNTeW5jaHJvbml6ZWRcXSAuKyJdfSwKICAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAogICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5NRURJVU0sCiAgICAgICdkZXNjcmlwdGlvbic6CisgICAgICAgICAnSmF2YTogSmF2YSBhc3NlcnQgaXMgdXNlZCBpbiB0ZXN0LiBGb3IgdGVzdGluZyBwdXJwb3NlcyBBc3NlcnQuKiBtYXRjaGVycyBzaG91bGQgYmUgdXNlZC4nLAorICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtVc2VDb3JyZWN0QXNzZXJ0SW5UZXN0c1xdIC4rIl19LAorICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCisgICAgICdzZXZlcml0eSc6IFNldmVyaXR5Lk1FRElVTSwKKyAgICAgJ2Rlc2NyaXB0aW9uJzoKICAgICAgICAgICdKYXZhOiBOb24tY29uc3RhbnQgdmFyaWFibGUgbWlzc2luZyBAVmFyIGFubm90YXRpb24nLAogICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtWYXJcXSAuKyJdfSwKICAgICB7J2NhdGVnb3J5JzogJ2phdmEnLApAQCAtODYyLDYgKzEyMzIsMTUxIEBACiAgICAgICAgICAnSmF2YTogQmVjYXVzZSBvZiBzcHVyaW91cyB3YWtldXBzLCBPYmplY3Qud2FpdCgpIGFuZCBDb25kaXRpb24uYXdhaXQoKSBtdXN0IGFsd2F5cyBiZSBjYWxsZWQgaW4gYSBsb29wJywKICAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbV2FpdE5vdEluTG9vcFxdIC4rIl19LAogICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCisgICAgICdzZXZlcml0eSc6IFNldmVyaXR5Lk1FRElVTSwKKyAgICAgJ2Rlc2NyaXB0aW9uJzoKKyAgICAgICAgICdKYXZhOiBQbHVnZ2FibGUgVHlwZSBjaGVja2VyIGludGVybmFsIGVycm9yJywKKyAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbUGx1Z2dhYmxlVHlwZUNoZWNrZXJcXSAuKyJdfSwKKyAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAorICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5NRURJVU0sCisgICAgICdkZXNjcmlwdGlvbic6CisgICAgICAgICAnSmF2YTogSW52YWxpZCBtZXNzYWdlIGZvcm1hdC1zdHlsZSBmb3JtYXQgc3BlY2lmaWVyICh7MH0pLCBleHBlY3RlZCBwcmludGYtc3R5bGUgKCVzKScsCisgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW0Zsb2dnZXJNZXNzYWdlRm9ybWF0XF0gLisiXX0sCisgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKKyAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuTUVESVVNLAorICAgICAnZGVzY3JpcHRpb24nOgorICAgICAgICAgJ0phdmE6IExvZ2dlciBsZXZlbCBjaGVjayBpcyBhbHJlYWR5IGltcGxpZWQgaW4gdGhlIGxvZygpIGNhbGwuIEFuIGV4cGxpY2l0IGF0W0xldmVsXSgpLmlzRW5hYmxlZCgpIGNoZWNrIGlzIHJlZHVuZGFudC4nLAorICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtGbG9nZ2VyUmVkdW5kYW50SXNFbmFibGVkXF0gLisiXX0sCisgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKKyAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuTUVESVVNLAorICAgICAnZGVzY3JpcHRpb24nOgorICAgICAgICAgJ0phdmE6IENhbGxpbmcgd2l0aENhdXNlKFRocm93YWJsZSkgd2l0aCBhbiBpbmxpbmUgYWxsb2NhdGVkIFRocm93YWJsZSBpcyBkaXNjb3VyYWdlZC4gQ29uc2lkZXIgdXNpbmcgd2l0aFN0YWNrVHJhY2UoU3RhY2tTaXplKSBpbnN0ZWFkLCBhbmQgc3BlY2lmeWluZyBhIHJlZHVjZWQgc3RhY2sgc2l6ZSAoZS5nLiBTTUFMTCwgTUVESVVNIG9yIExBUkdFKSBpbnN0ZWFkIG9mIEZVTEwsIHRvIGltcHJvdmUgcGVyZm9ybWFuY2UuJywKKyAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbRmxvZ2dlcldpdGhDYXVzZVxdIC4rIl19LAorICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCisgICAgICdzZXZlcml0eSc6IFNldmVyaXR5Lk1FRElVTSwKKyAgICAgJ2Rlc2NyaXB0aW9uJzoKKyAgICAgICAgICdKYXZhOiBVc2Ugd2l0aENhdXNlIHRvIGFzc29jaWF0ZSBFeGNlcHRpb25zIHdpdGggbG9nIHN0YXRlbWVudHMnLAorICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtGbG9nZ2VyV2l0aG91dENhdXNlXF0gLisiXX0sCisgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKKyAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuTUVESVVNLAorICAgICAnZGVzY3JpcHRpb24nOgorICAgICAgICAgJ0phdmE6IE5vIGJ1ZyBleGlzdHMgdG8gdHJhY2sgYW4gaWdub3JlZCB0ZXN0JywKKyAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbSWdub3JlZFRlc3RXaXRob3V0QnVnXF0gLisiXX0sCisgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKKyAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuTUVESVVNLAorICAgICAnZGVzY3JpcHRpb24nOgorICAgICAgICAgJ0phdmE6IEBJZ25vcmUgaXMgcHJlZmVycmVkIHRvIEBTdXBwcmVzcyBmb3IgSlVuaXQ0IHRlc3RzLiBAU3VwcHJlc3MgbWF5IHNpbGVudGx5IGZhaWwgaW4gSlVuaXQ0ICh0aGF0IGlzLCB0ZXN0cyBtYXkgcnVuIGFueXdheS4pJywKKyAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbSlVuaXQ0U3VwcHJlc3NXaXRob3V0SWdub3JlXF0gLisiXX0sCisgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKKyAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuTUVESVVNLAorICAgICAnZGVzY3JpcHRpb24nOgorICAgICAgICAgJ0phdmE6IE1lZGl1bSBhbmQgbGFyZ2UgdGVzdCBjbGFzc2VzIHNob3VsZCBkb2N1bWVudCB3aHkgdGhleSBhcmUgbWVkaXVtIG9yIGxhcmdlJywKKyAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbSlVuaXQ0VGVzdEF0dHJpYnV0ZU1pc3NpbmdcXSAuKyJdfSwKKyAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAorICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5NRURJVU0sCisgICAgICdkZXNjcmlwdGlvbic6CisgICAgICAgICAnSmF2YTogamF2YS5uZXQuSUROIGltcGxlbWVudHMgdGhlIG9sZGVyIElETkEyMDAzIHN0YW5kYXJkLiBQcmVmZXIgY29tLmdvb2dsZS5pMThuLklkbiwgd2hpY2ggaW1wbGVtZW50cyB0aGUgbmV3ZXIgVVRTICM0NiBzdGFuZGFyZCcsCisgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW0phdmFOZXRJZG5cXSAuKyJdfSwKKyAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAorICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5NRURJVU0sCisgICAgICdkZXNjcmlwdGlvbic6CisgICAgICAgICAnSmF2YTogQ29uc2lkZXIgcmVxdWlyaW5nIHN0cmljdCBwYXJzaW5nIG9uIEpvZGFEdXJhdGlvbkZsYWcgaW5zdGFuY2VzLiBCZWZvcmUgYWRqdXN0aW5nIGV4aXN0aW5nIGZsYWdzLCBjaGVjayB0aGUgZG9jdW1lbnRhdGlvbiBhbmQgeW91ciBleGlzdGluZyBjb25maWd1cmF0aW9uIHRvIGF2b2lkIGNyYXNoZXMhJywKKyAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbSm9kYUR1cmF0aW9uRmxhZ1N0cmljdFBhcnNpbmdcXSAuKyJdfSwKKyAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAorICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5NRURJVU0sCisgICAgICdkZXNjcmlwdGlvbic6CisgICAgICAgICAnSmF2YTogTG9nZ2luZyBhbiBleGNlcHRpb24gYW5kIHRocm93aW5nIGl0IChvciBhIG5ldyBleGNlcHRpb24pIGZvciB0aGUgc2FtZSBleGNlcHRpb25hbCBzaXR1YXRpb24gaXMgYW4gYW50aS1wYXR0ZXJuLicsCisgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW0xvZ0FuZFRocm93XF0gLisiXX0sCisgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKKyAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuTUVESVVNLAorICAgICAnZGVzY3JpcHRpb24nOgorICAgICAgICAgJ0phdmE6IEZvcm1hdHRpbmdMb2dnZXIgdXNlcyB3cm9uZyBvciBtaXNtYXRjaGVkIGZvcm1hdCBzdHJpbmcnLAorICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtNaXN1c2VkRm9ybWF0dGluZ0xvZ2dlclxdIC4rIl19LAorICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCisgICAgICdzZXZlcml0eSc6IFNldmVyaXR5Lk1FRElVTSwKKyAgICAgJ2Rlc2NyaXB0aW9uJzoKKyAgICAgICAgICdKYXZhOiBGbGFncyBzaG91bGQgYmUgZmluYWwnLAorICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtOb25GaW5hbEZsYWdcXSAuKyJdfSwKKyAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAorICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5NRURJVU0sCisgICAgICdkZXNjcmlwdGlvbic6CisgICAgICAgICAnSmF2YTogUmVhZGluZyBhIGZsYWcgZnJvbSBhIHN0YXRpYyBmaWVsZCBvciBpbml0aWFsaXplciBibG9jayB3aWxsIGNhdXNlIGl0IHRvIGFsd2F5cyByZWNlaXZlIHRoZSBkZWZhdWx0IHZhbHVlIGFuZCB3aWxsIGNhdXNlIGFuIElsbGVnYWxGbGFnU3RhdGVFeGNlcHRpb24gaWYgdGhlIGZsYWcgaXMgZXZlciBzZXQuJywKKyAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbU3RhdGljRmxhZ1VzYWdlXF0gLisiXX0sCisgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKKyAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuTUVESVVNLAorICAgICAnZGVzY3JpcHRpb24nOgorICAgICAgICAgJ0phdmE6IEFwcHMgbXVzdCB1c2UgQnVpbGRDb21wYXQuaXNBdExlYXN0TyB0byBjaGVjayB3aGV0aGVyIHRoZXlcJ3JlIHJ1bm5pbmcgb24gQW5kcm9pZCBPJywKKyAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbVW5zYWZlU2RrVmVyc2lvbkNoZWNrXF0gLisiXX0sCisgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKKyAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuSElHSCwKKyAgICAgJ2Rlc2NyaXB0aW9uJzoKKyAgICAgICAgICdKYXZhOiBMb2dnaW5nIHRhZyBjYW5ub3QgYmUgbG9uZ2VyIHRoYW4gMjMgY2hhcmFjdGVycy4nLAorICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtMb2dUYWdMZW5ndGhcXSAuKyJdfSwKKyAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAorICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5ISUdILAorICAgICAnZGVzY3JpcHRpb24nOgorICAgICAgICAgJ0phdmE6IFJlbGF0aXZlIGNsYXNzIG5hbWUgcGFzc2VkIHRvIENvbXBvbmVudE5hbWUgY29uc3RydWN0b3InLAorICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtSZWxhdGl2ZUNvbXBvbmVudE5hbWVcXSAuKyJdfSwKKyAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAorICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5ISUdILAorICAgICAnZGVzY3JpcHRpb24nOgorICAgICAgICAgJ0phdmE6IEV4cGxpY2l0bHkgZW51bWVyYXRlIGFsbCBjYXNlcyBpbiBzd2l0Y2ggc3RhdGVtZW50cyBmb3IgY2VydGFpbiBlbnVtIHR5cGVzLicsCisgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW0VudW1lcmF0ZUFsbENhc2VzSW5FbnVtU3dpdGNoXF0gLisiXX0sCisgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKKyAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuSElHSCwKKyAgICAgJ2Rlc2NyaXB0aW9uJzoKKyAgICAgICAgICdKYXZhOiBEbyBub3QgY2FsbCBhc3N1bWVUcnVlKHRlc3Rlci5nZXRFeHBlcmltZW50VmFsdWVGb3IoLi4uKSkuIFVzZSBAUmVxdWlyZUVuZFRvRW5kVGVzdEV4cGVyaW1lbnQgaW5zdGVhZC4nLAorICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtKVW5pdEFzc3VtZUV4cGVyaW1lbnRcXSAuKyJdfSwKKyAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAorICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5ISUdILAorICAgICAnZGVzY3JpcHRpb24nOgorICAgICAgICAgJ0phdmE6IFRoZSBhY2Nlc3NlZCBmaWVsZCBvciBtZXRob2QgaXMgbm90IHZpc2libGUgaGVyZS4gTm90ZSB0aGF0IHRoZSBkZWZhdWx0IHByb2R1Y3Rpb24gdmlzaWJpbGl0eSBmb3IgQFZpc2libGVGb3JUZXN0aW5nIGlzIFZpc2liaWxpdHkuUFJJVkFURS4nLAorICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtWaXNpYmxlRm9yVGVzdGluZ0NoZWNrZXJcXSAuKyJdfSwKKyAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAorICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5ISUdILAorICAgICAnZGVzY3JpcHRpb24nOgorICAgICAgICAgJ0phdmE6IERldGVjdHMgZXJyb3JzIGVuY291bnRlcmVkIGJ1aWxkaW5nIEVycm9yIFByb25lIHBsdWdpbnMnLAorICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtFcnJvclByb25lUGx1Z2luQ29ycmVjdG5lc3NcXSAuKyJdfSwKKyAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAorICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5ISUdILAorICAgICAnZGVzY3JpcHRpb24nOgorICAgICAgICAgJ0phdmE6IFBhcmNlbGFibGUgQ1JFQVRPUiBmaWVsZHMgc2hvdWxkIGJlIENyZWF0b3JcdTAwM2NUPicsCisgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW1BhcmNlbGFibGVDcmVhdG9yVHlwZVxdIC4rIl19LAorICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCisgICAgICdzZXZlcml0eSc6IFNldmVyaXR5LkhJR0gsCisgICAgICdkZXNjcmlwdGlvbic6CisgICAgICAgICAnSmF2YTogRW5mb3JjZSByZWZsZWN0ZWQgUGFyY2VsYWJsZXMgYXJlIGtlcHQgYnkgUHJvZ3VhcmQnLAorICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtSZWZsZWN0ZWRQYXJjZWxhYmxlXF0gLisiXX0sCisgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKKyAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuSElHSCwKKyAgICAgJ2Rlc2NyaXB0aW9uJzoKKyAgICAgICAgICdKYXZhOiBBbnkgY2xhc3MgdGhhdCBleHRlbmRzIEludGVudFNlcnZpY2Ugc2hvdWxkIGhhdmUgQE51bGxhYmxlIG5vdGF0aW9uIG9uIG1ldGhvZCBvbkhhbmRsZUludGVudChATnVsbGFibGUgSW50ZW50IGludGVudCkgYW5kIGhhbmRsZSB0aGUgY2FzZSBpZiBpbnRlbnQgaXMgbnVsbC4nLAorICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtPbkhhbmRsZUludGVudE51bGxhYmxlQ2hlY2tlclxdIC4rIl19LAorICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCisgICAgICdzZXZlcml0eSc6IFNldmVyaXR5LkhJR0gsCisgICAgICdkZXNjcmlwdGlvbic6CisgICAgICAgICAnSmF2YTogSW4gbWFueSBjYXNlcywgcmFuZG9tVVVJRCBpcyBub3QgbmVjZXNzYXJ5LCBhbmQgaXQgc2xvd3MgdGhlIHBlcmZvcm1hbmNlLCB3aGljaCBjYW4gYmUgcXVpdGUgc2V2ZXJlIGVzcGVjaWFsbHkgd2hlbiB0aGlzIG9wZXJhdGlvbiBoYXBwZW5zIGF0IHN0YXJ0IHVwIHRpbWUuIENvbnNpZGVyIHJlcGxhY2luZyBpdCB3aXRoIGNoZWFwZXIgYWx0ZXJuYXRpdmVzLCBsaWtlIG9iamVjdC5oYXNoQ29kZSgpIG9yIElkR2VuZXJhdG9yLklOU1RBTkNFLmdldFJhbmRvbUlkKCknLAorICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtVVUlEQ2hlY2tlclxdIC4rIl19LAorICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCisgICAgICdzZXZlcml0eSc6IFNldmVyaXR5LkhJR0gsCisgICAgICdkZXNjcmlwdGlvbic6CisgICAgICAgICAnSmF2YTogRHluYW1pY0FjdGl2aXR5LmZpbmRWaWV3QnlJZChpbnQpIGlzIHNsb3cgYW5kIHNob3VsZCBub3QgYmUgdXNlZCBpbnNpZGUgVmlldy5vbkRyYXcoQ2FudmFzKSEnLAorICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtOb0ZpbmRWaWV3QnlJZEluT25EcmF3Q2hlY2tlclxdIC4rIl19LAorICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCisgICAgICdzZXZlcml0eSc6IFNldmVyaXR5LkhJR0gsCisgICAgICdkZXNjcmlwdGlvbic6CisgICAgICAgICAnSmF2YTogUGFzc2luZyBUaHJvd2FibGUvRXhjZXB0aW9uIGFyZ3VtZW50IHRvIHRoZSBtZXNzYWdlIGZvcm1hdCBMLngoKS4gQ2FsbGluZyBMLncodGFnLCBtZXNzYWdlLCBleCkgaW5zdGVhZCBvZiBMLncodGFnLCBleCwgbWVzc2FnZSknLAorICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtXcm9uZ1Rocm93YWJsZUFyZ3VtZW50SW5Mb2dDaGVja2VyXF0gLisiXX0sCisgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKKyAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuSElHSCwKKyAgICAgJ2Rlc2NyaXB0aW9uJzoKKyAgICAgICAgICdKYXZhOiBOZXcgc3BsaWNlcnMgYXJlIGRpc2FsbG93ZWQgb24gcGF0aHMgdGhhdCBhcmUgYmVpbmcgTGlic2VhcmNoZWQnLAorICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtCbGFja2xpc3RlZFNwbGljZXJQYXRoQ2hlY2tlclxdIC4rIl19LAorICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCisgICAgICdzZXZlcml0eSc6IFNldmVyaXR5LkhJR0gsCisgICAgICdkZXNjcmlwdGlvbic6CisgICAgICAgICAnSmF2YTogT2JqZWN0IHNlcmlhbGl6ZWQgaW4gQnVuZGxlIG1heSBoYXZlIGJlZW4gZmxhdHRlbmVkIHRvIGJhc2UgdHlwZS4nLAorICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtCdW5kbGVEZXNlcmlhbGl6YXRpb25DYXN0XF0gLisiXX0sCisgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKICAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuSElHSCwKICAgICAgJ2Rlc2NyaXB0aW9uJzoKICAgICAgICAgICdKYXZhOiBMb2cgdGFnIHRvbyBsb25nLCBjYW5ub3QgZXhjZWVkIDIzIGNoYXJhY3RlcnMuJywKQEAgLTg3OSwxMSArMTM5NCw2IEBACiAgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKICAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuSElHSCwKICAgICAgJ2Rlc2NyaXB0aW9uJzoKLSAgICAgICAgICdKYXZhOiBTdGF0aWMgYW5kIGRlZmF1bHQgbWV0aG9kcyBpbiBpbnRlcmZhY2VzIGFyZSBub3QgYWxsb3dlZCBpbiBhbmRyb2lkIGJ1aWxkcy4nLAotICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtTdGF0aWNPckRlZmF1bHRJbnRlcmZhY2VNZXRob2RcXSAuKyJdfSwKLSAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAotICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5ISUdILAotICAgICAnZGVzY3JpcHRpb24nOgogICAgICAgICAgJ0phdmE6IEluY29tcGF0aWJsZSB0eXBlIGFzIGFyZ3VtZW50IHRvIE9iamVjdC1hY2NlcHRpbmcgSmF2YSBjb2xsZWN0aW9ucyBtZXRob2QnLAogICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtDb2xsZWN0aW9uSW5jb21wYXRpYmxlVHlwZVxdIC4rIl19LAogICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCkBAIC05MDksMTEzICsxNDE5LDggQEAKICAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAogICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5ISUdILAogICAgICAnZGVzY3JpcHRpb24nOgotICAgICAgICAgJ0phdmE6IEBBc3Npc3RlZEluamVjdCBhbmQgQEluamVjdCBjYW5ub3QgYmUgdXNlZCBvbiB0aGUgc2FtZSBjb25zdHJ1Y3Rvci4nLAotICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtBc3Npc3RlZEluamVjdEFuZEluamVjdE9uU2FtZUNvbnN0cnVjdG9yXF0gLisiXX0sCi0gICAgeydjYXRlZ29yeSc6ICdqYXZhJywKLSAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuSElHSCwKLSAgICAgJ2Rlc2NyaXB0aW9uJzoKLSAgICAgICAgICdKYXZhOiBAQXV0b0ZhY3RvcnkgYW5kIEBJbmplY3Qgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBzYW1lIHR5cGUuJywKLSAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbQXV0b0ZhY3RvcnlBdEluamVjdFxdIC4rIl19LAotICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCi0gICAgICdzZXZlcml0eSc6IFNldmVyaXR5LkhJR0gsCi0gICAgICdkZXNjcmlwdGlvbic6Ci0gICAgICAgICAnSmF2YTogSW5qZWN0ZWQgY29uc3RydWN0b3JzIGNhbm5vdCBiZSBvcHRpb25hbCBub3IgaGF2ZSBiaW5kaW5nIGFubm90YXRpb25zJywKLSAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbSW5qZWN0ZWRDb25zdHJ1Y3RvckFubm90YXRpb25zXF0gLisiXX0sCi0gICAgeydjYXRlZ29yeSc6ICdqYXZhJywKLSAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuSElHSCwKLSAgICAgJ2Rlc2NyaXB0aW9uJzoKLSAgICAgICAgICdKYXZhOiBBIHNjb3BpbmcgYW5ub3RhdGlvblwncyBUYXJnZXQgc2hvdWxkIGluY2x1ZGUgVFlQRSBhbmQgTUVUSE9ELicsCi0gICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW0luamVjdEludmFsaWRUYXJnZXRpbmdPblNjb3BpbmdBbm5vdGF0aW9uXF0gLisiXX0sCi0gICAgeydjYXRlZ29yeSc6ICdqYXZhJywKLSAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuSElHSCwKLSAgICAgJ2Rlc2NyaXB0aW9uJzoKLSAgICAgICAgICdKYXZhOiBBYnN0cmFjdCBhbmQgZGVmYXVsdCBtZXRob2RzIGFyZSBub3QgaW5qZWN0YWJsZSB3aXRoIGphdmF4LmluamVjdC5JbmplY3QnLAotICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtKYXZheEluamVjdE9uQWJzdHJhY3RNZXRob2RcXSAuKyJdfSwKLSAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAotICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5ISUdILAotICAgICAnZGVzY3JpcHRpb24nOgotICAgICAgICAgJ0phdmE6IEBqYXZheC5pbmplY3QuSW5qZWN0IGNhbm5vdCBiZSBwdXQgb24gYSBmaW5hbCBmaWVsZC4nLAotICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtKYXZheEluamVjdE9uRmluYWxGaWVsZFxdIC4rIl19LAotICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCi0gICAgICdzZXZlcml0eSc6IFNldmVyaXR5LkhJR0gsCi0gICAgICdkZXNjcmlwdGlvbic6Ci0gICAgICAgICAnSmF2YTogVGhpcyBjbGFzcyBoYXMgbW9yZSB0aGFuIG9uZSBASW5qZWN0LWFubm90YXRlZCBjb25zdHJ1Y3Rvci4gUGxlYXNlIHJlbW92ZSB0aGUgQEluamVjdCBhbm5vdGF0aW9uIGZyb20gYWxsIGJ1dCBvbmUgb2YgdGhlbS4nLAotICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtNb3JlVGhhbk9uZUluamVjdGFibGVDb25zdHJ1Y3RvclxdIC4rIl19LAotICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCi0gICAgICdzZXZlcml0eSc6IFNldmVyaXR5LkhJR0gsCi0gICAgICdkZXNjcmlwdGlvbic6Ci0gICAgICAgICAnSmF2YTogVXNpbmcgbW9yZSB0aGFuIG9uZSBxdWFsaWZpZXIgYW5ub3RhdGlvbiBvbiB0aGUgc2FtZSBlbGVtZW50IGlzIG5vdCBhbGxvd2VkLicsCi0gICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW0luamVjdE1vcmVUaGFuT25lUXVhbGlmaWVyXF0gLisiXX0sCi0gICAgeydjYXRlZ29yeSc6ICdqYXZhJywKLSAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuSElHSCwKLSAgICAgJ2Rlc2NyaXB0aW9uJzoKLSAgICAgICAgICdKYXZhOiBBIGNsYXNzIGNhbiBiZSBhbm5vdGF0ZWQgd2l0aCBhdCBtb3N0IG9uZSBzY29wZSBhbm5vdGF0aW9uLicsCi0gICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW0luamVjdE1vcmVUaGFuT25lU2NvcGVBbm5vdGF0aW9uT25DbGFzc1xdIC4rIl19LAotICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCi0gICAgICdzZXZlcml0eSc6IFNldmVyaXR5LkhJR0gsCi0gICAgICdkZXNjcmlwdGlvbic6Ci0gICAgICAgICAnSmF2YTogQW5ub3RhdGlvbnMgY2Fubm90IGJlIGJvdGggU2NvcGUgYW5ub3RhdGlvbnMgYW5kIFF1YWxpZmllciBhbm5vdGF0aW9uczogdGhpcyBjYXVzZXMgY29uZnVzaW9uIHdoZW4gdHJ5aW5nIHRvIHVzZSB0aGVtLicsCi0gICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW092ZXJsYXBwaW5nUXVhbGlmaWVyQW5kU2NvcGVBbm5vdGF0aW9uXF0gLisiXX0sCi0gICAgeydjYXRlZ29yeSc6ICdqYXZhJywKLSAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuSElHSCwKLSAgICAgJ2Rlc2NyaXB0aW9uJzoKLSAgICAgICAgICdKYXZhOiBRdWFsaWZpZXIgYXBwbGllZCB0byBhIG1ldGhvZCB0aGF0IGlzblwndCBhIEBQcm92aWRlcyBtZXRob2QuIFRoaXMgbWV0aG9kIHdvblwndCBiZSB1c2VkIGZvciBkZXBlbmRlbmN5IGluamVjdGlvbicsCi0gICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW1F1YWxpZmllck9uTWV0aG9kV2l0aG91dFByb3ZpZGVzXF0gLisiXX0sCi0gICAgeydjYXRlZ29yeSc6ICdqYXZhJywKLSAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuSElHSCwKLSAgICAgJ2Rlc2NyaXB0aW9uJzoKLSAgICAgICAgICdKYXZhOiBTY29wZSBhbm5vdGF0aW9uIG9uIGFuIGludGVyZmFjZSBvciBhYnN0YWN0IGNsYXNzIGlzIG5vdCBhbGxvd2VkJywKLSAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbSW5qZWN0U2NvcGVBbm5vdGF0aW9uT25JbnRlcmZhY2VPckFic3RyYWN0Q2xhc3NcXSAuKyJdfSwKLSAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAotICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5ISUdILAotICAgICAnZGVzY3JpcHRpb24nOgotICAgICAgICAgJ0phdmE6IFNjb3BpbmcgYW5kIHF1YWxpZmllciBhbm5vdGF0aW9ucyBtdXN0IGhhdmUgcnVudGltZSByZXRlbnRpb24uJywKLSAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbSW5qZWN0U2NvcGVPclF1YWxpZmllckFubm90YXRpb25SZXRlbnRpb25cXSAuKyJdfSwKLSAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAotICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5ISUdILAotICAgICAnZGVzY3JpcHRpb24nOgotICAgICAgICAgJ0phdmE6IGBATXVsdGliaW5kc2AgaXMgdGhlIG5ldyB3YXkgdG8gZGVjbGFyZSBtdWx0aWJpbmRpbmdzLicsCi0gICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW011bHRpYmluZHNJbnN0ZWFkT2ZNdWx0aWJpbmRpbmdzXF0gLisiXX0sCi0gICAgeydjYXRlZ29yeSc6ICdqYXZhJywKLSAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuSElHSCwKLSAgICAgJ2Rlc2NyaXB0aW9uJzoKLSAgICAgICAgICdKYXZhOiBEYWdnZXIgQFByb3ZpZGVzIG1ldGhvZHMgbWF5IG5vdCByZXR1cm4gbnVsbCB1bmxlc3MgYW5ub3RhdGVkIHdpdGggQE51bGxhYmxlJywKLSAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbRGFnZ2VyUHJvdmlkZXNOdWxsXF0gLisiXX0sCi0gICAgeydjYXRlZ29yeSc6ICdqYXZhJywKLSAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuSElHSCwKLSAgICAgJ2Rlc2NyaXB0aW9uJzoKLSAgICAgICAgICdKYXZhOiBTY29wZSBhbm5vdGF0aW9uIG9uIGltcGxlbWVudGF0aW9uIGNsYXNzIG9mIEFzc2lzdGVkSW5qZWN0IGZhY3RvcnkgaXMgbm90IGFsbG93ZWQnLAotICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtHdWljZUFzc2lzdGVkSW5qZWN0U2NvcGluZ1xdIC4rIl19LAotICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCi0gICAgICdzZXZlcml0eSc6IFNldmVyaXR5LkhJR0gsCi0gICAgICdkZXNjcmlwdGlvbic6Ci0gICAgICAgICAnSmF2YTogQSBjb25zdHJ1Y3RvciBjYW5ub3QgaGF2ZSB0d28gQEFzc2lzdGVkIHBhcmFtZXRlcnMgb2YgdGhlIHNhbWUgdHlwZSB1bmxlc3MgdGhleSBhcmUgZGlzYW1iaWd1YXRlZCB3aXRoIG5hbWVkIEBBc3Npc3RlZCBhbm5vdGF0aW9ucy4nLAotICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtHdWljZUFzc2lzdGVkUGFyYW1ldGVyc1xdIC4rIl19LAotICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCi0gICAgICdzZXZlcml0eSc6IFNldmVyaXR5LkhJR0gsCi0gICAgICdkZXNjcmlwdGlvbic6Ci0gICAgICAgICAnSmF2YTogQWx0aG91Z2ggR3VpY2UgYWxsb3dzIGluamVjdGluZyBmaW5hbCBmaWVsZHMsIGRvaW5nIHNvIGlzIGRpc2FsbG93ZWQgYmVjYXVzZSB0aGUgaW5qZWN0ZWQgdmFsdWUgbWF5IG5vdCBiZSB2aXNpYmxlIHRvIG90aGVyIHRocmVhZHMuJywKLSAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbR3VpY2VJbmplY3RPbkZpbmFsRmllbGRcXSAuKyJdfSwKLSAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAotICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5ISUdILAotICAgICAnZGVzY3JpcHRpb24nOgotICAgICAgICAgJ0phdmE6IFRoaXMgbWV0aG9kIGlzIG5vdCBhbm5vdGF0ZWQgd2l0aCBASW5qZWN0LCBidXQgaXQgb3ZlcnJpZGVzIGEgbWV0aG9kIHRoYXQgaXMgIGFubm90YXRlZCB3aXRoIEBqYXZheC5pbmplY3QuSW5qZWN0LiBUaGUgbWV0aG9kIHdpbGwgbm90IGJlIEluamVjdGVkLicsCi0gICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW092ZXJyaWRlc0phdmF4SW5qZWN0YWJsZU1ldGhvZFxdIC4rIl19LAotICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCi0gICAgICdzZXZlcml0eSc6IFNldmVyaXR5LkhJR0gsCi0gICAgICdkZXNjcmlwdGlvbic6Ci0gICAgICAgICAnSmF2YTogQFByb3ZpZGVzIG1ldGhvZHMgbmVlZCB0byBiZSBkZWNsYXJlZCBpbiBhIE1vZHVsZSB0byBoYXZlIGFueSBlZmZlY3QuJywKLSAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbUHJvdmlkZXNNZXRob2RPdXRzaWRlT2ZNb2R1bGVcXSAuKyJdfSwKLSAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAotICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5ISUdILAotICAgICAnZGVzY3JpcHRpb24nOgogICAgICAgICAgJ0phdmE6IENoZWNrcyBmb3IgdW5ndWFyZGVkIGFjY2Vzc2VzIHRvIGZpZWxkcyBhbmQgbWV0aG9kcyB3aXRoIEBHdWFyZGVkQnkgYW5ub3RhdGlvbnMnLAotICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtHdWFyZGVkQnlDaGVja2VyXF0gLisiXX0sCi0gICAgeydjYXRlZ29yeSc6ICdqYXZhJywKLSAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuSElHSCwKLSAgICAgJ2Rlc2NyaXB0aW9uJzoKLSAgICAgICAgICdKYXZhOiBJbnZhbGlkIEBHdWFyZGVkQnkgZXhwcmVzc2lvbicsCi0gICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW0d1YXJkZWRCeVZhbGlkYXRvclxdIC4rIl19LAorICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtHdWFyZGVkQnlcXSAuKyJdfSwKICAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAogICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5ISUdILAogICAgICAnZGVzY3JpcHRpb24nOgpAQCAtMTAzNCwxMyArMTQzOSwxMyBAQAogICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCiAgICAgICdzZXZlcml0eSc6IFNldmVyaXR5LkhJR0gsCiAgICAgICdkZXNjcmlwdGlvbic6Ci0gICAgICAgICAnSmF2YTogQW4gYXJndW1lbnQgaXMgbW9yZSBzaW1pbGFyIHRvIGEgZGlmZmVyZW50IHBhcmFtZXRlcjsgdGhlIGFyZ3VtZW50cyBtYXkgaGF2ZSBiZWVuIHN3YXBwZWQuJywKLSAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbQXJndW1lbnRQYXJhbWV0ZXJTd2FwXF0gLisiXX0sCisgICAgICAgICAnSmF2YTogUmVmZXJlbmNlIGVxdWFsaXR5IHVzZWQgdG8gY29tcGFyZSBhcnJheXMnLAorICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtBcnJheUVxdWFsc1xdIC4rIl19LAogICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCiAgICAgICdzZXZlcml0eSc6IFNldmVyaXR5LkhJR0gsCiAgICAgICdkZXNjcmlwdGlvbic6Ci0gICAgICAgICAnSmF2YTogUmVmZXJlbmNlIGVxdWFsaXR5IHVzZWQgdG8gY29tcGFyZSBhcnJheXMnLAotICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtBcnJheUVxdWFsc1xdIC4rIl19LAorICAgICAgICAgJ0phdmE6IEFycmF5cy5maWxsKE9iamVjdFtdLCBPYmplY3QpIGNhbGxlZCB3aXRoIGluY29tcGF0aWJsZSB0eXBlcy4nLAorICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtBcnJheUZpbGxJbmNvbXBhdGlibGVUeXBlXF0gLisiXX0sCiAgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKICAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuSElHSCwKICAgICAgJ2Rlc2NyaXB0aW9uJzoKQEAgLTEwODksNiArMTQ5NCwxMSBAQAogICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCiAgICAgICdzZXZlcml0eSc6IFNldmVyaXR5LkhJR0gsCiAgICAgICdkZXNjcmlwdGlvbic6CisgICAgICAgICAnSmF2YTogIEltcGxlbWVudGluZyBcJ0NvbXBhcmFibGVcdTAwM2NUPlwnIHdoZXJlIFQgaXMgbm90IGNvbXBhdGlibGUgd2l0aCB0aGUgaW1wbGVtZW50aW5nIGNsYXNzLicsCisgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW0NvbXBhcmFibGVUeXBlXF0gLisiXX0sCisgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKKyAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuSElHSCwKKyAgICAgJ2Rlc2NyaXB0aW9uJzoKICAgICAgICAgICdKYXZhOiBUaGlzIGNvbXBhcmlzb24gbWV0aG9kIHZpb2xhdGVzIHRoZSBjb250cmFjdCcsCiAgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW0NvbXBhcmlzb25Db250cmFjdFZpb2xhdGVkXF0gLisiXX0sCiAgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKQEAgLTExMDQsNiArMTUxNCwxNiBAQAogICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCiAgICAgICdzZXZlcml0eSc6IFNldmVyaXR5LkhJR0gsCiAgICAgICdkZXNjcmlwdGlvbic6CisgICAgICAgICAnSmF2YTogTm9uLXRyaXZpYWwgY29tcGlsZSB0aW1lIGNvbnN0YW50IGJvb2xlYW4gZXhwcmVzc2lvbnMgc2hvdWxkblwndCBiZSB1c2VkLicsCisgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW0NvbXBsZXhCb29sZWFuQ29uc3RhbnRcXSAuKyJdfSwKKyAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAorICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5ISUdILAorICAgICAnZGVzY3JpcHRpb24nOgorICAgICAgICAgJ0phdmE6IEEgY29uZGl0aW9uYWwgZXhwcmVzc2lvbiB3aXRoIG51bWVyaWMgb3BlcmFuZHMgb2YgZGlmZmVyaW5nIHR5cGVzIHdpbGwgcGVyZm9ybSBiaW5hcnkgbnVtZXJpYyBwcm9tb3Rpb24gb2YgdGhlIG9wZXJhbmRzOyB3aGVuIHRoZXNlIG9wZXJhbmRzIGFyZSBvZiByZWZlcmVuY2UgdHlwZXMsIHRoZSBleHByZXNzaW9uXCdzIHJlc3VsdCBtYXkgbm90IGJlIG9mIHRoZSBleHBlY3RlZCB0eXBlLicsCisgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW0NvbmRpdGlvbmFsRXhwcmVzc2lvbk51bWVyaWNQcm9tb3Rpb25cXSAuKyJdfSwKKyAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAorICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5ISUdILAorICAgICAnZGVzY3JpcHRpb24nOgogICAgICAgICAgJ0phdmE6IENvbXBpbGUtdGltZSBjb25zdGFudCBleHByZXNzaW9uIG92ZXJmbG93cycsCiAgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW0NvbnN0YW50T3ZlcmZsb3dcXSAuKyJdfSwKICAgICB7J2NhdGVnb3J5JzogJ2phdmEnLApAQCAtMTExNCwxMSArMTUzNCwyMSBAQAogICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCiAgICAgICdzZXZlcml0eSc6IFNldmVyaXR5LkhJR0gsCiAgICAgICdkZXNjcmlwdGlvbic6CisgICAgICAgICAnSmF2YTogVGhyZWFkIGNyZWF0ZWQgYnV0IG5vdCBzdGFydGVkJywKKyAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbRGVhZFRocmVhZFxdIC4rIl19LAorICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCisgICAgICdzZXZlcml0eSc6IFNldmVyaXR5LkhJR0gsCisgICAgICdkZXNjcmlwdGlvbic6CiAgICAgICAgICAnSmF2YTogRGl2aXNpb24gYnkgaW50ZWdlciBsaXRlcmFsIHplcm8nLAogICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtEaXZaZXJvXF0gLisiXX0sCiAgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKICAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuSElHSCwKICAgICAgJ2Rlc2NyaXB0aW9uJzoKKyAgICAgICAgICdKYXZhOiBUaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIGNhbGxlZC4nLAorICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtEb05vdENhbGxcXSAuKyJdfSwKKyAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAorICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5ISUdILAorICAgICAnZGVzY3JpcHRpb24nOgogICAgICAgICAgJ0phdmE6IEVtcHR5IHN0YXRlbWVudCBhZnRlciBpZicsCiAgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW0VtcHR5SWZcXSAuKyJdfSwKICAgICB7J2NhdGVnb3J5JzogJ2phdmEnLApAQCAtMTEyOSw3ICsxNTU5LDEyIEBACiAgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKICAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuSElHSCwKICAgICAgJ2Rlc2NyaXB0aW9uJzoKLSAgICAgICAgICdKYXZhOiBNZXRob2QgYW5ub3RhdGVkIEBGb3JPdmVycmlkZSBtdXN0IGJlIHByb3RlY3RlZCBvciBwYWNrYWdlLXByaXZhdGUgYW5kIG9ubHkgaW52b2tlZCBmcm9tIGRlY2xhcmluZyBjbGFzcycsCisgICAgICAgICAnSmF2YTogPT0gbXVzdCBiZSB1c2VkIGluIGVxdWFscyBtZXRob2QgdG8gY2hlY2sgZXF1YWxpdHkgdG8gaXRzZWxmIG9yIGFuIGluZmluaXRlIGxvb3Agd2lsbCBvY2N1ci4nLAorICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtFcXVhbHNSZWZlcmVuY2VcXSAuKyJdfSwKKyAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAorICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5ISUdILAorICAgICAnZGVzY3JpcHRpb24nOgorICAgICAgICAgJ0phdmE6IE1ldGhvZCBhbm5vdGF0ZWQgQEZvck92ZXJyaWRlIG11c3QgYmUgcHJvdGVjdGVkIG9yIHBhY2thZ2UtcHJpdmF0ZSBhbmQgb25seSBpbnZva2VkIGZyb20gZGVjbGFyaW5nIGNsYXNzLCBvciBmcm9tIGFuIG92ZXJyaWRlIG9mIHRoZSBtZXRob2QnLAogICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtGb3JPdmVycmlkZVxdIC4rIl19LAogICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCiAgICAgICdzZXZlcml0eSc6IFNldmVyaXR5LkhJR0gsCkBAIC0xMTQ0LDYgKzE1NzksMTEgQEAKICAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAogICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5ISUdILAogICAgICAnZGVzY3JpcHRpb24nOgorICAgICAgICAgJ0phdmE6IERvdWJsZU1hdGguZnV6enlFcXVhbHMgc2hvdWxkIG5ldmVyIGJlIHVzZWQgaW4gYW4gT2JqZWN0LmVxdWFscygpIG1ldGhvZCcsCisgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW0Z1enp5RXF1YWxzU2hvdWxkTm90QmVVc2VkSW5FcXVhbHNNZXRob2RcXSAuKyJdfSwKKyAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAorICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5ISUdILAorICAgICAnZGVzY3JpcHRpb24nOgogICAgICAgICAgJ0phdmE6IENhbGxpbmcgZ2V0Q2xhc3MoKSBvbiBhbiBhbm5vdGF0aW9uIG1heSByZXR1cm4gYSBwcm94eSBjbGFzcycsCiAgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW0dldENsYXNzT25Bbm5vdGF0aW9uXF0gLisiXX0sCiAgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKQEAgLTExNTQsMTcgKzE1OTQsMTIgQEAKICAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAogICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5ISUdILAogICAgICAnZGVzY3JpcHRpb24nOgotICAgICAgICAgJ0phdmE6IEFuIG9iamVjdCBpcyB0ZXN0ZWQgZm9yIGVxdWFsaXR5IHRvIGl0c2VsZiB1c2luZyBHdWF2YSBMaWJyYXJpZXMnLAotICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtHdWF2YVNlbGZFcXVhbHNcXSAuKyJdfSwKLSAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAotICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5ISUdILAotICAgICAnZGVzY3JpcHRpb24nOgogICAgICAgICAgJ0phdmE6IGNvbnRhaW5zKCkgaXMgYSBsZWdhY3kgbWV0aG9kIHRoYXQgaXMgZXF1aXZhbGVudCB0byBjb250YWluc1ZhbHVlKCknLAogICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtIYXNodGFibGVDb250YWluc1xdIC4rIl19LAogICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCiAgICAgICdzZXZlcml0eSc6IFNldmVyaXR5LkhJR0gsCiAgICAgICdkZXNjcmlwdGlvbic6Ci0gICAgICAgICAnSmF2YTogV3JpdGluZyAiYSAmJiBhIiwgImEgfHwgYSIsICJhICYgYSIsIG9yICJhIHwgYSIgaXMgZXF1aXZhbGVudCB0byAiYSIuJywKKyAgICAgICAgICdKYXZhOiBBIGJpbmFyeSBleHByZXNzaW9uIHdoZXJlIGJvdGggb3BlcmFuZHMgYXJlIHRoZSBzYW1lIGlzIHVzdWFsbHkgaW5jb3JyZWN0LicsCiAgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW0lkZW50aXR5QmluYXJ5RXhwcmVzc2lvblxdIC4rIl19LAogICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCiAgICAgICdzZXZlcml0eSc6IFNldmVyaXR5LkhJR0gsCkBAIC0xMTc0LDYgKzE2MDksMTYgQEAKICAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAogICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5ISUdILAogICAgICAnZGVzY3JpcHRpb24nOgorICAgICAgICAgJ0phdmE6IFRoZSBmaXJzdCBhcmd1bWVudCB0byBpbmRleE9mIGlzIGEgVW5pY29kZSBjb2RlIHBvaW50LCBhbmQgdGhlIHNlY29uZCBpcyB0aGUgaW5kZXggdG8gc3RhcnQgdGhlIHNlYXJjaCBmcm9tJywKKyAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbSW5kZXhPZkNoYXJcXSAuKyJdfSwKKyAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAorICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5ISUdILAorICAgICAnZGVzY3JpcHRpb24nOgorICAgICAgICAgJ0phdmE6IENvbmRpdGlvbmFsIGV4cHJlc3Npb24gaW4gdmFyYXJncyBjYWxsIGNvbnRhaW5zIGFycmF5IGFuZCBub24tYXJyYXkgYXJndW1lbnRzJywKKyAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbSW5leGFjdFZhcmFyZ3NDb25kaXRpb25hbFxdIC4rIl19LAorICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCisgICAgICdzZXZlcml0eSc6IFNldmVyaXR5LkhJR0gsCisgICAgICdkZXNjcmlwdGlvbic6CiAgICAgICAgICAnSmF2YTogVGhpcyBtZXRob2QgYWx3YXlzIHJlY3Vyc2VzLCBhbmQgd2lsbCBjYXVzZSBhIFN0YWNrT3ZlcmZsb3dFcnJvcicsCiAgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW0luZmluaXRlUmVjdXJzaW9uXF0gLisiXX0sCiAgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKQEAgLTExODksMzYgKzE2MzQsNzEgQEAKICAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAogICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5ISUdILAogICAgICAnZGVzY3JpcHRpb24nOgorICAgICAgICAgJ0phdmE6IEludmFsaWQgdGltZSB6b25lIGlkZW50aWZpZXIuIFRpbWVab25lLmdldFRpbWVab25lKFN0cmluZykgd2lsbCBzaWxlbnRseSByZXR1cm4gR01UIGluc3RlYWQgb2YgdGhlIHRpbWUgem9uZSB5b3UgaW50ZW5kZWQuJywKKyAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbSW52YWxpZFRpbWVab25lSURcXSAuKyJdfSwKKyAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAorICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5ISUdILAorICAgICAnZGVzY3JpcHRpb24nOgogICAgICAgICAgJ0phdmE6IFRoZSBhcmd1bWVudCB0byBDbGFzcyNpc0luc3RhbmNlKE9iamVjdCkgc2hvdWxkIG5vdCBiZSBhIENsYXNzJywKICAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbSXNJbnN0YW5jZU9mQ2xhc3NcXSAuKyJdfSwKICAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAogICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5ISUdILAogICAgICAnZGVzY3JpcHRpb24nOgorICAgICAgICAgJ0phdmE6IFBhdGggaW1wbGVtZW50cyBJdGVyYWJsZVx1MDAzY1BhdGg+OyBwcmVmZXIgQ29sbGVjdGlvblx1MDAzY1BhdGg+IGZvciBjbGFyaXR5JywKKyAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbSXRlcmFibGVQYXRoUGFyYW1ldGVyXF0gLisiXX0sCisgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKKyAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuSElHSCwKKyAgICAgJ2Rlc2NyaXB0aW9uJzoKICAgICAgICAgICdKYXZhOiBqTW9jayB0ZXN0cyBtdXN0IGhhdmUgYSBAUnVuV2l0aChKTW9jay5jbGFzcykgYW5ub3RhdGlvbiwgb3IgdGhlIE1vY2tlcnkgZmllbGQgbXVzdCBoYXZlIGEgQFJ1bGUgSlVuaXQgYW5ub3RhdGlvbicsCiAgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW0pNb2NrVGVzdFdpdGhvdXRSdW5XaXRoT3JSdWxlQW5ub3RhdGlvblxdIC4rIl19LAogICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCiAgICAgICdzZXZlcml0eSc6IFNldmVyaXR5LkhJR0gsCiAgICAgICdkZXNjcmlwdGlvbic6Ci0gICAgICAgICAnSmF2YTogVGVzdCBtZXRob2Qgd2lsbCBub3QgYmUgcnVuOyBwbGVhc2UgcHJlZml4IG5hbWUgd2l0aCAidGVzdCInLAorICAgICAgICAgJ0phdmE6IFRlc3QgbWV0aG9kIHdpbGwgbm90IGJlIHJ1bjsgcGxlYXNlIGNvcnJlY3QgbWV0aG9kIHNpZ25hdHVyZSAoU2hvdWxkIGJlIHB1YmxpYywgbm9uLXN0YXRpYywgYW5kIG1ldGhvZCBuYW1lIHNob3VsZCBiZWdpbiB3aXRoICJ0ZXN0IikuJywKICAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbSlVuaXQzVGVzdE5vdFJ1blxdIC4rIl19LAogICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCiAgICAgICdzZXZlcml0eSc6IFNldmVyaXR5LkhJR0gsCiAgICAgICdkZXNjcmlwdGlvbic6Ci0gICAgICAgICAnSmF2YTogc2V0VXAoKSBtZXRob2Qgd2lsbCBub3QgYmUgcnVuOyBQbGVhc2UgYWRkIGEgQEJlZm9yZSBhbm5vdGF0aW9uJywKKyAgICAgICAgICdKYXZhOiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgc3RhdGljJywKKyAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbSlVuaXQ0Q2xhc3NBbm5vdGF0aW9uTm9uU3RhdGljXF0gLisiXX0sCisgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKKyAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuSElHSCwKKyAgICAgJ2Rlc2NyaXB0aW9uJzoKKyAgICAgICAgICdKYXZhOiBzZXRVcCgpIG1ldGhvZCB3aWxsIG5vdCBiZSBydW47IHBsZWFzZSBhZGQgSlVuaXRcJ3MgQEJlZm9yZSBhbm5vdGF0aW9uJywKICAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbSlVuaXQ0U2V0VXBOb3RSdW5cXSAuKyJdfSwKICAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAogICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5ISUdILAogICAgICAnZGVzY3JpcHRpb24nOgotICAgICAgICAgJ0phdmE6IHRlYXJEb3duKCkgbWV0aG9kIHdpbGwgbm90IGJlIHJ1bjsgUGxlYXNlIGFkZCBhbiBAQWZ0ZXIgYW5ub3RhdGlvbicsCisgICAgICAgICAnSmF2YTogdGVhckRvd24oKSBtZXRob2Qgd2lsbCBub3QgYmUgcnVuOyBwbGVhc2UgYWRkIEpVbml0XCdzIEBBZnRlciBhbm5vdGF0aW9uJywKICAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbSlVuaXQ0VGVhckRvd25Ob3RSdW5cXSAuKyJdfSwKICAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAogICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5ISUdILAogICAgICAnZGVzY3JpcHRpb24nOgotICAgICAgICAgJ0phdmE6IFRlc3QgbWV0aG9kIHdpbGwgbm90IGJlIHJ1bjsgcGxlYXNlIGFkZCBAVGVzdCBhbm5vdGF0aW9uJywKKyAgICAgICAgICdKYXZhOiBUaGlzIGxvb2tzIGxpa2UgYSB0ZXN0IG1ldGhvZCBidXQgaXMgbm90IHJ1bjsgcGxlYXNlIGFkZCBAVGVzdCBvciBASWdub3JlLCBvciwgaWYgdGhpcyBpcyBhIGhlbHBlciBtZXRob2QsIHJlZHVjZSBpdHMgdmlzaWJpbGl0eS4nLAogICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtKVW5pdDRUZXN0Tm90UnVuXF0gLisiXX0sCiAgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKICAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuSElHSCwKICAgICAgJ2Rlc2NyaXB0aW9uJzoKKyAgICAgICAgICdKYXZhOiBBbiBvYmplY3QgaXMgdGVzdGVkIGZvciByZWZlcmVuY2UgZXF1YWxpdHkgdG8gaXRzZWxmIHVzaW5nIEpVbml0IGxpYnJhcnkuJywKKyAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbSlVuaXRBc3NlcnRTYW1lQ2hlY2tcXSAuKyJdfSwKKyAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAorICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5ISUdILAorICAgICAnZGVzY3JpcHRpb24nOgorICAgICAgICAgJ0phdmE6IFRoaXMgcGF0dGVybiB3aWxsIHNpbGVudGx5IGNvcnJ1cHQgY2VydGFpbiBieXRlIHNlcXVlbmNlcyBmcm9tIHRoZSBzZXJpYWxpemVkIHByb3RvY29sIG1lc3NhZ2UuIFVzZSBCeXRlU3RyaW5nIG9yIGJ5dGVbXSBkaXJlY3RseScsCisgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW0xpdGVCeXRlU3RyaW5nVXRmOFxdIC4rIl19LAorICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCisgICAgICdzZXZlcml0eSc6IFNldmVyaXR5LkhJR0gsCisgICAgICdkZXNjcmlwdGlvbic6CisgICAgICAgICAnSmF2YTogTG9vcCBjb25kaXRpb24gaXMgbmV2ZXIgbW9kaWZpZWQgaW4gbG9vcCBib2R5LicsCisgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW0xvb3BDb25kaXRpb25DaGVja2VyXF0gLisiXX0sCisgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKKyAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuSElHSCwKKyAgICAgJ2Rlc2NyaXB0aW9uJzoKKyAgICAgICAgICdKYXZhOiBPdmVycmlkaW5nIG1ldGhvZCBpcyBtaXNzaW5nIGEgY2FsbCB0byBvdmVycmlkZGVuIHN1cGVyIG1ldGhvZCcsCisgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW01pc3NpbmdTdXBlckNhbGxcXSAuKyJdfSwKKyAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAorICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5ISUdILAorICAgICAnZGVzY3JpcHRpb24nOgogICAgICAgICAgJ0phdmE6IFVzZSBvZiAiWVlZWSIgKHdlZWsgeWVhcikgaW4gYSBkYXRlIHBhdHRlcm4gd2l0aG91dCAid3ciICh3ZWVrIGluIHllYXIpLiBZb3UgcHJvYmFibHkgbWVhbnQgdG8gdXNlICJ5eXl5IiAoeWVhcikgaW5zdGVhZC4nLAogICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtNaXN1c2VkV2Vla1llYXJcXSAuKyJdfSwKICAgICB7J2NhdGVnb3J5JzogJ2phdmEnLApAQCAtMTIzOSw2ICsxNzE5LDE2IEBACiAgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKICAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuSElHSCwKICAgICAgJ2Rlc2NyaXB0aW9uJzoKKyAgICAgICAgICdKYXZhOiBUaGUgcmVzdWx0IG9mIHRoaXMgbWV0aG9kIG11c3QgYmUgY2xvc2VkLicsCisgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW011c3RCZUNsb3NlZENoZWNrZXJcXSAuKyJdfSwKKyAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAorICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5ISUdILAorICAgICAnZGVzY3JpcHRpb24nOgorICAgICAgICAgJ0phdmE6IFRoZSBmaXJzdCBhcmd1bWVudCB0byBuQ29waWVzIGlzIHRoZSBudW1iZXIgb2YgY29waWVzLCBhbmQgdGhlIHNlY29uZCBpcyB0aGUgaXRlbSB0byBjb3B5JywKKyAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbTkNvcGllc09mQ2hhclxdIC4rIl19LAorICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCisgICAgICdzZXZlcml0eSc6IFNldmVyaXR5LkhJR0gsCisgICAgICdkZXNjcmlwdGlvbic6CiAgICAgICAgICAnSmF2YTogQE5vQWxsb2NhdGlvbiB3YXMgc3BlY2lmaWVkIG9uIHRoaXMgbWV0aG9kLCBidXQgc29tZXRoaW5nIHdhcyBmb3VuZCB0aGF0IHdvdWxkIHRyaWdnZXIgYW4gYWxsb2NhdGlvbicsCiAgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW05vQWxsb2NhdGlvblxdIC4rIl19LAogICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCkBAIC0xMjU5LDYgKzE3NDksMTEgQEAKICAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAogICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5ISUdILAogICAgICAnZGVzY3JpcHRpb24nOgorICAgICAgICAgJ0phdmE6IFRoaXMgY29uZGl0aW9uYWwgZXhwcmVzc2lvbiBtYXkgZXZhbHVhdGUgdG8gbnVsbCwgd2hpY2ggd2lsbCByZXN1bHQgaW4gYW4gTlBFIHdoZW4gdGhlIHJlc3VsdCBpcyB1bmJveGVkLicsCisgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW051bGxUZXJuYXJ5XF0gLisiXX0sCisgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKKyAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuSElHSCwKKyAgICAgJ2Rlc2NyaXB0aW9uJzoKICAgICAgICAgICdKYXZhOiBOdW1lcmljIGNvbXBhcmlzb24gdXNpbmcgcmVmZXJlbmNlIGVxdWFsaXR5IGluc3RlYWQgb2YgdmFsdWUgZXF1YWxpdHknLAogICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtOdW1lcmljRXF1YWxpdHlcXSAuKyJdfSwKICAgICB7J2NhdGVnb3J5JzogJ2phdmEnLApAQCAtMTI2OSwxMSArMTc2NCw2IEBACiAgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKICAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuSElHSCwKICAgICAgJ2Rlc2NyaXB0aW9uJzoKLSAgICAgICAgICdKYXZhOiBWYXJhcmdzIGRvZXNuXCd0IGFncmVlIGZvciBvdmVycmlkZGVuIG1ldGhvZCcsCi0gICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW092ZXJyaWRlc1xdIC4rIl19LAotICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCi0gICAgICdzZXZlcml0eSc6IFNldmVyaXR5LkhJR0gsCi0gICAgICdkZXNjcmlwdGlvbic6CiAgICAgICAgICAnSmF2YTogRGVjbGFyaW5nIHR5cGVzIGluc2lkZSBwYWNrYWdlLWluZm8uamF2YSBmaWxlcyBpcyB2ZXJ5IGJhZCBmb3JtJywKICAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbUGFja2FnZUluZm9cXSAuKyJdfSwKICAgICB7J2NhdGVnb3J5JzogJ2phdmEnLApAQCAtMTI4OSw2ICsxNzc5LDE2IEBACiAgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKICAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuSElHSCwKICAgICAgJ2Rlc2NyaXB0aW9uJzoKKyAgICAgICAgICdKYXZhOiBVc2luZyA6OmVxdWFscyBhcyBhbiBpbmNvbXBhdGlibGUgUHJlZGljYXRlOyB0aGUgcHJlZGljYXRlIHdpbGwgYWx3YXlzIHJldHVybiBmYWxzZScsCisgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW1ByZWRpY2F0ZUluY29tcGF0aWJsZVR5cGVcXSAuKyJdfSwKKyAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAorICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5ISUdILAorICAgICAnZGVzY3JpcHRpb24nOgorICAgICAgICAgJ0phdmE6IEFjY2VzcyB0byBhIHByaXZhdGUgcHJvdG9jb2wgYnVmZmVyIGZpZWxkIGlzIGZvcmJpZGRlbi4gVGhpcyBwcm90b2NvbCBidWZmZXIgY2FycmllcyBhIHNlY3VyaXR5IGNvbnRyYWN0LCBhbmQgY2FuIG9ubHkgYmUgY3JlYXRlZCB1c2luZyBhbiBhcHByb3ZlZCBsaWJyYXJ5LiBEaXJlY3QgYWNjZXNzIHRvIHRoZSBmaWVsZHMgaXMgZm9yYmlkZGVuLicsCisgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW1ByaXZhdGVTZWN1cml0eUNvbnRyYWN0UHJvdG9BY2Nlc3NcXSAuKyJdfSwKKyAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAorICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5ISUdILAorICAgICAnZGVzY3JpcHRpb24nOgogICAgICAgICAgJ0phdmE6IFByb3RvYnVmIGZpZWxkcyBjYW5ub3QgYmUgbnVsbCcsCiAgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW1Byb3RvRmllbGROdWxsQ29tcGFyaXNvblxdIC4rIl19LAogICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCkBAIC0xMjk5LDYgKzE3OTksMTYgQEAKICAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAogICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5ISUdILAogICAgICAnZGVzY3JpcHRpb24nOgorICAgICAgICAgJ0phdmE6IFRvIGdldCB0aGUgdGFnIG51bWJlciBvZiBhIHByb3RvY29sIGJ1ZmZlciBlbnVtLCB1c2UgZ2V0TnVtYmVyKCkgaW5zdGVhZC4nLAorICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtQcm90b2NvbEJ1ZmZlck9yZGluYWxcXSAuKyJdfSwKKyAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAorICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5ISUdILAorICAgICAnZGVzY3JpcHRpb24nOgorICAgICAgICAgJ0phdmE6IENhc3RpbmcgYSByYW5kb20gbnVtYmVyIGluIHRoZSByYW5nZSBbMC4wLCAxLjApIHRvIGFuIGludGVnZXIgb3IgbG9uZyBhbHdheXMgcmVzdWx0cyBpbiAwLicsCisgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW1JhbmRvbUNhc3RcXSAuKyJdfSwKKyAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAorICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5ISUdILAorICAgICAnZGVzY3JpcHRpb24nOgogICAgICAgICAgJ0phdmE6IFVzZSBSYW5kb20ubmV4dEludChpbnQpLiAgUmFuZG9tLm5leHRJbnQoKSAlIG4gY2FuIGhhdmUgbmVnYXRpdmUgcmVzdWx0cycsCiAgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW1JhbmRvbU1vZEludGVnZXJcXSAuKyJdfSwKICAgICB7J2NhdGVnb3J5JzogJ2phdmEnLApAQCAtMTMyNCwxMyArMTgzNCwxMyBAQAogICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCiAgICAgICdzZXZlcml0eSc6IFNldmVyaXR5LkhJR0gsCiAgICAgICdkZXNjcmlwdGlvbic6Ci0gICAgICAgICAnSmF2YTogVmFyaWFibGUgY29tcGFyZWQgdG8gaXRzZWxmJywKLSAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbU2VsZkVxdWFsaXR5XF0gLisiXX0sCisgICAgICAgICAnSmF2YTogVGVzdGluZyBhbiBvYmplY3QgZm9yIGVxdWFsaXR5IHdpdGggaXRzZWxmIHdpbGwgYWx3YXlzIGJlIHRydWUuJywKKyAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbU2VsZkVxdWFsc1xdIC4rIl19LAogICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCiAgICAgICdzZXZlcml0eSc6IFNldmVyaXR5LkhJR0gsCiAgICAgICdkZXNjcmlwdGlvbic6Ci0gICAgICAgICAnSmF2YTogQW4gb2JqZWN0IGlzIHRlc3RlZCBmb3IgZXF1YWxpdHkgdG8gaXRzZWxmJywKLSAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbU2VsZkVxdWFsc1xdIC4rIl19LAorICAgICAgICAgJ0phdmE6IFRoaXMgbWV0aG9kIG11c3QgYmUgY2FsbGVkIHdpdGggYW4gZXZlbiBudW1iZXIgb2YgYXJndW1lbnRzLicsCisgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW1Nob3VsZEhhdmVFdmVuQXJnc1xdIC4rIl19LAogICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCiAgICAgICdzZXZlcml0eSc6IFNldmVyaXR5LkhJR0gsCiAgICAgICdkZXNjcmlwdGlvbic6CkBAIC0xMzU5LDYgKzE4NjksMTYgQEAKICAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAogICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5ISUdILAogICAgICAnZGVzY3JpcHRpb24nOgorICAgICAgICAgJ0phdmE6IFRocm93aW5nIFwnbnVsbFwnIGFsd2F5cyByZXN1bHRzIGluIGEgTnVsbFBvaW50ZXJFeGNlcHRpb24gYmVpbmcgdGhyb3duLicsCisgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW1Rocm93TnVsbFxdIC4rIl19LAorICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCisgICAgICdzZXZlcml0eSc6IFNldmVyaXR5LkhJR0gsCisgICAgICdkZXNjcmlwdGlvbic6CisgICAgICAgICAnSmF2YTogaXNFcXVhbFRvIHNob3VsZCBub3QgYmUgdXNlZCB0byB0ZXN0IGFuIG9iamVjdCBmb3IgZXF1YWxpdHkgd2l0aCBpdHNlbGY7IHRoZSBhc3NlcnRpb24gd2lsbCBuZXZlciBmYWlsLicsCisgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW1RydXRoU2VsZkVxdWFsc1xdIC4rIl19LAorICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCisgICAgICdzZXZlcml0eSc6IFNldmVyaXR5LkhJR0gsCisgICAgICdkZXNjcmlwdGlvbic6CiAgICAgICAgICAnSmF2YTogQ2F0Y2hpbmcgVGhyb3dhYmxlL0Vycm9yIG1hc2tzIGZhaWx1cmVzIGZyb20gZmFpbCgpIG9yIGFzc2VydCooKSBpbiB0aGUgdHJ5IGJsb2NrJywKICAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbVHJ5RmFpbFRocm93YWJsZVxdIC4rIl19LAogICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCkBAIC0xMzg0LDggKzE5MDQsMTkzIEBACiAgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKICAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuSElHSCwKICAgICAgJ2Rlc2NyaXB0aW9uJzoKKyAgICAgICAgICdKYXZhOiBgdmFyYCBzaG91bGQgbm90IGJlIHVzZWQgYXMgYSB0eXBlIG5hbWUuJywKKyAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbVmFyVHlwZU5hbWVcXSAuKyJdfSwKKyAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAorICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5ISUdILAorICAgICAnZGVzY3JpcHRpb24nOgogICAgICAgICAgJ0phdmE6IE1ldGhvZCBwYXJhbWV0ZXIgaGFzIHdyb25nIHBhY2thZ2UnLAogICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtQYXJhbWV0ZXJQYWNrYWdlXF0gLisiXX0sCisgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKKyAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuSElHSCwKKyAgICAgJ2Rlc2NyaXB0aW9uJzoKKyAgICAgICAgICdKYXZhOiBUeXBlIGRlY2xhcmF0aW9uIGFubm90YXRlZCB3aXRoIEBUaHJlYWRTYWZlIGlzIG5vdCB0aHJlYWQgc2FmZScsCisgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW1RocmVhZFNhZmVcXSAuKyJdfSwKKyAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAorICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5ISUdILAorICAgICAnZGVzY3JpcHRpb24nOgorICAgICAgICAgJ0phdmE6IFVzZSBvZiBjbGFzcywgZmllbGQsIG9yIG1ldGhvZCB0aGF0IGlzIG5vdCBjb21wYXRpYmxlIHdpdGggbGVnYWN5IEFuZHJvaWQgZGV2aWNlcycsCisgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW0FuZHJvaWRBcGlDaGVja2VyXF0gLisiXX0sCisgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKKyAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuSElHSCwKKyAgICAgJ2Rlc2NyaXB0aW9uJzoKKyAgICAgICAgICdKYXZhOiBJbnZhbGlkIHVzZSBvZiBGbG9nZ2VyIGZvcm1hdCBzdHJpbmcnLAorICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtBbmRyb2lkRmxvZ2dlckZvcm1hdFN0cmluZ1xdIC4rIl19LAorICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCisgICAgICdzZXZlcml0eSc6IFNldmVyaXR5LkhJR0gsCisgICAgICdkZXNjcmlwdGlvbic6CisgICAgICAgICAnSmF2YTogVXNlIFR1bm5lbEV4Y2VwdGlvbi5nZXRDYXVzZUFzKENsYXNzKSBpbnN0ZWFkIG9mIGNhc3RpbmcgdGhlIHJlc3VsdCBvZiBUdW5uZWxFeGNlcHRpb24uZ2V0Q2F1c2UoKS4nLAorICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtEb05vdENhc3RUdW5uZWxFeGNlcHRpb25DYXVzZVxdIC4rIl19LAorICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCisgICAgICdzZXZlcml0eSc6IFNldmVyaXR5LkhJR0gsCisgICAgICdkZXNjcmlwdGlvbic6CisgICAgICAgICAnSmF2YTogSWRlbnRpZmllcyB1bmRlc2lyYWJsZSBtb2Nrcy4nLAorICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtEb05vdE1vY2tfRm9ySmF2YUJ1aWxkZXJcXSAuKyJdfSwKKyAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAorICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5ISUdILAorICAgICAnZGVzY3JpcHRpb24nOgorICAgICAgICAgJ0phdmE6IER1cmF0aW9uIEZsYWcgc2hvdWxkIE5PVCBoYXZlIHVuaXRzIGluIHRoZSB2YXJpYWJsZSBuYW1lIG9yIHRoZSBARmxhZ1NwZWNcJ3MgbmFtZSBvciBhbHROYW1lIGZpZWxkLicsCisgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW0R1cmF0aW9uRmxhZ1dpdGhVbml0c1xdIC4rIl19LAorICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCisgICAgICdzZXZlcml0eSc6IFNldmVyaXR5LkhJR0gsCisgICAgICdkZXNjcmlwdGlvbic6CisgICAgICAgICAnSmF2YTogRHVyYXRpb24uZ2V0KCkgb25seSB3b3JrcyB3aXRoIFNFQ09ORFMgb3IgTkFOT1MuJywKKyAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbRHVyYXRpb25HZXRUZW1wb3JhbFVuaXRcXSAuKyJdfSwKKyAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAorICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5ISUdILAorICAgICAnZGVzY3JpcHRpb24nOgorICAgICAgICAgJ0phdmE6IEludmFsaWQgcHJpbnRmLXN0eWxlIGZvcm1hdCBzdHJpbmcnLAorICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtGbG9nZ2VyRm9ybWF0U3RyaW5nXF0gLisiXX0sCisgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKKyAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuSElHSCwKKyAgICAgJ2Rlc2NyaXB0aW9uJzoKKyAgICAgICAgICdKYXZhOiBUZXN0IGNsYXNzIG1heSBub3QgYmUgcnVuIGJlY2F1c2UgaXQgaXMgbWlzc2luZyBhIEBSdW5XaXRoIGFubm90YXRpb24nLAorICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtKVW5pdDRSdW5XaXRoTWlzc2luZ1xdIC4rIl19LAorICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCisgICAgICdzZXZlcml0eSc6IFNldmVyaXR5LkhJR0gsCisgICAgICdkZXNjcmlwdGlvbic6CisgICAgICAgICAnSmF2YTogVXNlIG9mIGNsYXNzLCBmaWVsZCwgb3IgbWV0aG9kIHRoYXQgaXMgbm90IGNvbXBhdGlibGUgd2l0aCBKREsgNycsCisgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW0phdmE3QXBpQ2hlY2tlclxdIC4rIl19LAorICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCisgICAgICdzZXZlcml0eSc6IFNldmVyaXR5LkhJR0gsCisgICAgICdkZXNjcmlwdGlvbic6CisgICAgICAgICAnSmF2YTogVXNlIG9mIGphdmEudGltZS5EdXJhdGlvbi53aXRoTmFub3MoaW50KSBpcyBub3QgYWxsb3dlZC4nLAorICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtKYXZhRHVyYXRpb25XaXRoTmFub3NcXSAuKyJdfSwKKyAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAorICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5ISUdILAorICAgICAnZGVzY3JpcHRpb24nOgorICAgICAgICAgJ0phdmE6IFVzZSBvZiBqYXZhLnRpbWUuRHVyYXRpb24ud2l0aFNlY29uZHMobG9uZykgaXMgbm90IGFsbG93ZWQuJywKKyAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbSmF2YUR1cmF0aW9uV2l0aFNlY29uZHNcXSAuKyJdfSwKKyAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAorICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5ISUdILAorICAgICAnZGVzY3JpcHRpb24nOgorICAgICAgICAgJ0phdmE6IGphdmEudGltZSBBUElzIHRoYXQgc2lsZW50bHkgdXNlIHRoZSBkZWZhdWx0IHN5c3RlbSB0aW1lLXpvbmUgYXJlIG5vdCBhbGxvd2VkLicsCisgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW0phdmFUaW1lRGVmYXVsdFRpbWVab25lXF0gLisiXX0sCisgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKKyAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuSElHSCwKKyAgICAgJ2Rlc2NyaXB0aW9uJzoKKyAgICAgICAgICdKYXZhOiBVc2Ugb2YgbmV3IER1cmF0aW9uKGxvbmcpIGlzIG5vdCBhbGxvd2VkLiBQbGVhc2UgdXNlIER1cmF0aW9uLm1pbGxpcyhsb25nKSBpbnN0ZWFkLicsCisgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW0pvZGFEdXJhdGlvbkNvbnN0cnVjdG9yXF0gLisiXX0sCisgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKKyAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuSElHSCwKKyAgICAgJ2Rlc2NyaXB0aW9uJzoKKyAgICAgICAgICdKYXZhOiBVc2Ugb2YgZHVyYXRpb24ud2l0aE1pbGxpcyhsb25nKSBpcyBub3QgYWxsb3dlZC4gUGxlYXNlIHVzZSBEdXJhdGlvbi5taWxsaXMobG9uZykgaW5zdGVhZC4nLAorICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtKb2RhRHVyYXRpb25XaXRoTWlsbGlzXF0gLisiXX0sCisgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKKyAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuSElHSCwKKyAgICAgJ2Rlc2NyaXB0aW9uJzoKKyAgICAgICAgICdKYXZhOiBVc2Ugb2YgaW5zdGFudC53aXRoTWlsbGlzKGxvbmcpIGlzIG5vdCBhbGxvd2VkLiBQbGVhc2UgdXNlIG5ldyBJbnN0YW50KGxvbmcpIGluc3RlYWQuJywKKyAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbSm9kYUluc3RhbnRXaXRoTWlsbGlzXF0gLisiXX0sCisgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKKyAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuSElHSCwKKyAgICAgJ2Rlc2NyaXB0aW9uJzoKKyAgICAgICAgICdKYXZhOiBVc2Ugb2YgSm9kYVRpbWVcJ3MgdHlwZS5wbHVzKGxvbmcpIG9yIHR5cGUubWludXMobG9uZykgaXMgbm90IGFsbG93ZWQgKHdoZXJlIFx1MDAzY3R5cGU+ID0ge0R1cmF0aW9uLEluc3RhbnQsRGF0ZVRpbWUsRGF0ZU1pZG5pZ2h0fSkuIFBsZWFzZSB1c2UgdHlwZS5wbHVzKER1cmF0aW9uLm1pbGxpcyhsb25nKSkgb3IgdHlwZS5taW51cyhEdXJhdGlvbi5taWxsaXMobG9uZykpIGluc3RlYWQuJywKKyAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbSm9kYVBsdXNNaW51c0xvbmdcXSAuKyJdfSwKKyAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAorICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5ISUdILAorICAgICAnZGVzY3JpcHRpb24nOgorICAgICAgICAgJ0phdmE6IENoYW5naW5nIEpvZGFUaW1lXCdzIGN1cnJlbnQgdGltZSBpcyBub3QgYWxsb3dlZCBpbiBub24tdGVzdG9ubHkgY29kZS4nLAorICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtKb2RhU2V0Q3VycmVudE1pbGxpc1xdIC4rIl19LAorICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCisgICAgICdzZXZlcml0eSc6IFNldmVyaXR5LkhJR0gsCisgICAgICdkZXNjcmlwdGlvbic6CisgICAgICAgICAnSmF2YTogVXNlIG9mIEpvZGEtVGltZVwncyBEYXRlVGltZS50b0RhdGVUaW1lKCksIER1cmF0aW9uLnRvRHVyYXRpb24oKSwgSW5zdGFudC50b0luc3RhbnQoKSwgSW50ZXJ2YWwudG9JbnRlcnZhbCgpLCBhbmQgUGVyaW9kLnRvUGVyaW9kKCkgYXJlIG5vdCBhbGxvd2VkLicsCisgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW0pvZGFUb1NlbGZcXSAuKyJdfSwKKyAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAorICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5ISUdILAorICAgICAnZGVzY3JpcHRpb24nOgorICAgICAgICAgJ0phdmE6IFVzZSBvZiBKb2RhVGltZVwncyB0eXBlLndpdGhEdXJhdGlvbkFkZGVkKGxvbmcsIGludCkgKHdoZXJlIFx1MDAzY3R5cGU+ID0ge0R1cmF0aW9uLEluc3RhbnQsRGF0ZVRpbWV9KS4gUGxlYXNlIHVzZSB0eXBlLndpdGhEdXJhdGlvbkFkZGVkKER1cmF0aW9uLm1pbGxpcyhsb25nKSwgaW50KSBpbnN0ZWFkLicsCisgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW0pvZGFXaXRoRHVyYXRpb25BZGRlZExvbmdcXSAuKyJdfSwKKyAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAorICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5ISUdILAorICAgICAnZGVzY3JpcHRpb24nOgorICAgICAgICAgJ0phdmE6IExhbmd1YWdlQ29kZSBjb21wYXJpc29uIHVzaW5nIHJlZmVyZW5jZSBlcXVhbGl0eSBpbnN0ZWFkIG9mIHZhbHVlIGVxdWFsaXR5JywKKyAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbTGFuZ3VhZ2VDb2RlRXF1YWxpdHlcXSAuKyJdfSwKKyAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAorICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5ISUdILAorICAgICAnZGVzY3JpcHRpb24nOgorICAgICAgICAgJ0phdmE6IFRoZSB6ZXJvIGFyZ3VtZW50IHRvU3RyaW5nIGlzIG5vdCBwYXJ0IG9mIHRoZSBMb2NhbGl6YWJsZSBpbnRlcmZhY2UgYW5kIGxpa2VseSBpcyBqdXN0IHRoZSBqYXZhIE9iamVjdCB0b1N0cmluZy4gIFlvdSBwcm9iYWJseSB3YW50IHRvIGNhbGwgdG9TdHJpbmcoTG9jYWxlKS4nLAorICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtMb2NhbGl6YWJsZVdyb25nVG9TdHJpbmdcXSAuKyJdfSwKKyAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAorICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5ISUdILAorICAgICAnZGVzY3JpcHRpb24nOgorICAgICAgICAgJ0phdmE6IFBlcmlvZC5nZXQoKSBvbmx5IHdvcmtzIHdpdGggWUVBUlMsIE1PTlRIUywgb3IgREFZUy4nLAorICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtQZXJpb2RHZXRUZW1wb3JhbFVuaXRcXSAuKyJdfSwKKyAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAorICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5ISUdILAorICAgICAnZGVzY3JpcHRpb24nOgorICAgICAgICAgJ0phdmE6IFJldHVybiB2YWx1ZSBvZiBtZXRob2RzIHJldHVybmluZyBQcm9taXNlIG11c3QgYmUgY2hlY2tlZC4gSWdub3JpbmcgcmV0dXJuZWQgUHJvbWlzZXMgc3VwcHJlc3NlcyBleGNlcHRpb25zIHRocm93biBmcm9tIHRoZSBjb2RlIHRoYXQgY29tcGxldGVzIHRoZSBQcm9taXNlcy4nLAorICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtQcm9taXNlUmV0dXJuVmFsdWVJZ25vcmVkXF0gLisiXX0sCisgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKKyAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuSElHSCwKKyAgICAgJ2Rlc2NyaXB0aW9uJzoKKyAgICAgICAgICdKYXZhOiBXaGVuIHJldHVybmluZyBhIFByb21pc2UsIHVzZSB0aGVuQ2hhaW4oKSBpbnN0ZWFkIG9mIHRoZW4oKScsCisgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW1Byb21pc2VUaGVuUmV0dXJuaW5nUHJvbWlzZVxdIC4rIl19LAorICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCisgICAgICdzZXZlcml0eSc6IFNldmVyaXR5LkhJR0gsCisgICAgICdkZXNjcmlwdGlvbic6CisgICAgICAgICAnSmF2YTogU3RyZWFtcy5pdGVyYXRpbmcoKSBpcyB1bnNhZmUgZm9yIHVzZSBleGNlcHQgaW4gdGhlIGhlYWRlciBvZiBhIGZvci1lYWNoIGxvb3A7IHBsZWFzZSBzZWUgaXRzIEphdmFkb2MgZm9yIGRldGFpbHMuJywKKyAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbU3RyZWFtc0l0ZXJhdGluZ05vdEluTG9vcFxdIC4rIl19LAorICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCisgICAgICdzZXZlcml0eSc6IFNldmVyaXR5LkhJR0gsCisgICAgICdkZXNjcmlwdGlvbic6CisgICAgICAgICAnSmF2YTogVGVtcG9yYWxBY2Nlc3Nvci5nZXQoKSBvbmx5IHdvcmtzIGZvciBjZXJ0YWluIHZhbHVlcyBvZiBDaHJvbm9GaWVsZC4nLAorICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtUZW1wb3JhbEFjY2Vzc29yR2V0Q2hyb25vRmllbGRcXSAuKyJdfSwKKyAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAorICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5ISUdILAorICAgICAnZGVzY3JpcHRpb24nOgorICAgICAgICAgJ0phdmE6IFRyeS13aXRoLXJlc291cmNlcyBpcyBub3Qgc3VwcG9ydGVkIGluIHRoaXMgY29kZSwgdXNlIHRyeS9maW5hbGx5IGluc3RlYWQnLAorICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtUcnlXaXRoUmVzb3VyY2VzXF0gLisiXX0sCisgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKKyAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuSElHSCwKKyAgICAgJ2Rlc2NyaXB0aW9uJzoKKyAgICAgICAgICdKYXZhOiBBZGRzIGNoZWNrT3JUaHJvdyBjYWxscyB3aGVyZSBuZWVkZWQnLAorICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtBZGRDaGVja09yVGhyb3dcXSAuKyJdfSwKKyAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAorICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5ISUdILAorICAgICAnZGVzY3JpcHRpb24nOgorICAgICAgICAgJ0phdmE6IEVxdWFsaXR5IG9uIE5hbm8gcHJvdG9zICg9PSBvciAuZXF1YWxzKSBtaWdodCBub3QgYmUgdGhlIHNhbWUgaW4gTGl0ZScsCisgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW0ZvcmJpZE5hbm9FcXVhbGl0eVxdIC4rIl19LAorICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCisgICAgICdzZXZlcml0eSc6IFNldmVyaXR5LkhJR0gsCisgICAgICdkZXNjcmlwdGlvbic6CisgICAgICAgICAnSmF2YTogU3VibWVzc2FnZXMgb2YgYSBwcm90byBjYW5ub3QgYmUgbXV0YXRlZCcsCisgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW0ZvcmJpZFN1Ym1lc3NhZ2VNdXRhdGlvblxdIC4rIl19LAorICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCisgICAgICdzZXZlcml0eSc6IFNldmVyaXR5LkhJR0gsCisgICAgICdkZXNjcmlwdGlvbic6CisgICAgICAgICAnSmF2YTogUmVwZWF0ZWQgZmllbGRzIG9uIHByb3RvIG1lc3NhZ2VzIGNhbm5vdCBiZSBkaXJlY3RseSByZWZlcmVuY2VkJywKKyAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbTmFub1Vuc2FmZVJlcGVhdGVkRmllbGRVc2FnZVxdIC4rIl19LAorICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCisgICAgICdzZXZlcml0eSc6IFNldmVyaXR5LkhJR0gsCisgICAgICdkZXNjcmlwdGlvbic6CisgICAgICAgICAnSmF2YTogUmVxdWlyZXMgdGhhdCBub24tQGVudW0gaW50IGFzc2lnbm1lbnRzIHRvIEBlbnVtIGludHMgaXMgd3JhcHBlZCBpbiBhIGNoZWNrT3JUaHJvdycsCisgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW1JlcXVpcmVDaGVja09yVGhyb3dcXSAuKyJdfSwKKyAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAorICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5ISUdILAorICAgICAnZGVzY3JpcHRpb24nOgorICAgICAgICAgJ0phdmE6IEFzc2lnbm1lbnRzIGludG8gcmVwZWF0ZWQgZmllbGQgZWxlbWVudHMgbXVzdCBiZSBzZXF1ZW50aWFsJywKKyAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbUmVxdWlyZVNlcXVlbnRpYWxSZXBlYXRlZEZpZWxkc1xdIC4rIl19LAorICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCisgICAgICdzZXZlcml0eSc6IFNldmVyaXR5LkhJR0gsCisgICAgICdkZXNjcmlwdGlvbic6CisgICAgICAgICAnSmF2YTogRnV0dXJlLmdldCBpbiBHb29nbGUgTm93IFByb2R1Y2VycyBjb2RlJywKKyAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbRnV0dXJlR2V0SW5Ob3dQcm9kdWNlcnNcXSAuKyJdfSwKKyAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAorICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5ISUdILAorICAgICAnZGVzY3JpcHRpb24nOgorICAgICAgICAgJ0phdmE6IEBTaW1wbGVFbnVtIGFwcGxpZWQgdG8gbm9uLWVudW0gdHlwZScsCisgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW1NpbXBsZUVudW1Vc2FnZVxdIC4rIl19LAogCiAgICAgIyBFbmQgd2FybmluZ3MgZ2VuZXJhdGVkIGJ5IEVycm9yIFByb25lCiAKQEAgLTE4MDcsNiArMjUxMiw3IEBACiAgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBJbiBmaWxlIGluY2x1ZGVkIGZyb20gLissIl19LAogCiAgICAgIyB3YXJuaW5ncyBmcm9tIGNsYW5nLXRpZHkKKyAgICBncm91cF90aWR5X3dhcm5fcGF0dGVybignYW5kcm9pZCcpLAogICAgIGdyb3VwX3RpZHlfd2Fybl9wYXR0ZXJuKCdjZXJ0JyksCiAgICAgZ3JvdXBfdGlkeV93YXJuX3BhdHRlcm4oJ2NsYW5nLWRpYWdub3N0aWMnKSwKICAgICBncm91cF90aWR5X3dhcm5fcGF0dGVybignY3BwY29yZWd1aWRlbGluZXMnKSwKQEAgLTIzNzAsNyArMzA3Niw3IEBACiAgIGZvciBpZHggaW4gcmV2ZXJzZWQocmFuZ2UoMiwgbGVuKHBhcnRzKSkpOgogICAgIHJvb3RfcGF0aCA9ICcvJy5qb2luKHBhcnRzWzppZHhdKQogICAgICMgQW5kcm9pZCByb290IGRpcmVjdG9yeSBzaG91bGQgY29udGFpbiB0aGlzIHNjcmlwdC4KLSAgICBpZiBvcy5wYXRoLmV4aXN0cyhyb290X3BhdGggKyAnL2J1aWxkL3Rvb2xzL3dhcm4ucHknKToKKyAgICBpZiBvcy5wYXRoLmV4aXN0cyhyb290X3BhdGggKyAnL2J1aWxkL21ha2UvdG9vbHMvd2Fybi5weScpOgogICAgICAgYW5kcm9pZF9yb290ID0gcm9vdF9wYXRoCiAgICAgICByZXR1cm4gcm9vdF9wYXRoCiAgIHJldHVybiAnJwpkaWZmIC0tZ2l0IGEvdG9vbHMvemlwYWxpZ24vQW5kcm9pZC5icCBiL3Rvb2xzL3ppcGFsaWduL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGU2MTk2ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3ppcGFsaWduL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwzNiBAQAorLy8KKy8vIENvcHlyaWdodCAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBaaXAgYWxpZ25tZW50IHRvb2wKKy8vCisKK2NjX2JpbmFyeV9ob3N0IHsKKyAgICBuYW1lOiAiemlwYWxpZ24iLAorCisgICAgc3JjczogWworICAgICAgICAiWmlwQWxpZ24uY3BwIiwKKyAgICAgICAgIlppcEVudHJ5LmNwcCIsCisgICAgICAgICJaaXBGaWxlLmNwcCIsCisgICAgXSwKKworICAgIGNmbGFnczogWyItV2FsbCIsICItV2Vycm9yIl0sCisKKyAgICAvLyBOT1RFOiBEbyBub3QgYWRkIGFueSBzaGFyZWRfbGlicyBkZXBlbmRlbmNpZXMgYmVjYXVzZSB0aGV5IHdpbGwgYnJlYWsgdGhlCisgICAgLy8gc3RhdGljX3Nka190b29scyB0YXJnZXQuCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGliemlwYXJjaGl2ZSIsCisgICAgICAgICJsaWJ6IiwKKyAgICAgICAgImxpYmJhc2UiLAorICAgICAgICAibGliem9wZmxpIiwKKyAgICBdLAorCisgICAgdGFyZ2V0OiB7CisgICAgICAgIHdpbmRvd3M6IHsKKyAgICAgICAgICAgIGhvc3RfbGRsaWJzOiBbIi1scHRocmVhZCJdLAorICAgICAgICAgICAgZW5hYmxlZDogdHJ1ZSwKKyAgICAgICAgfSwKKyAgICB9LAorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvemlwYWxpZ24vQW5kcm9pZC5tayBiL3Rvb2xzL3ppcGFsaWduL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjMDI0MGEuLjAwMDAwMDAKLS0tIGEvdG9vbHMvemlwYWxpZ24vQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLSMgCi0jIENvcHlyaWdodCAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgWmlwIGFsaWdubWVudCB0b29sCi0jCi0KLUxPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX1NSQ19GSUxFUyA6PSBcCi0JWmlwQWxpZ24uY3BwIFwKLQlaaXBFbnRyeS5jcHAgXAotCVppcEZpbGUuY3BwCi0KLUxPQ0FMX0NfSU5DTFVERVMgKz0gZXh0ZXJuYWwvemxpYiBcCi0JZXh0ZXJuYWwvem9wZmxpL3NyYwotCi1MT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IFwKLQlsaWJhbmRyb2lkZncgXAotCWxpYnV0aWxzIFwKLQlsaWJjdXRpbHMgXAotCWxpYmxvZyBcCi0JbGliem9wZmxpCi0KLUxPQ0FMX0xETElCU19saW51eCArPSAtbHJ0Ci0KLUxPQ0FMX1NUQVRJQ19MSUJSQVJJRVNfd2luZG93cyArPSBsaWJ6Ci1MT0NBTF9MRExJQlNfbGludXggKz0gLWx6Ci1MT0NBTF9MRExJQlNfZGFyd2luICs9IC1segotCi1pZm5lcSAoJChzdHJpcCAkKEJVSUxEX0hPU1Rfc3RhdGljKSksKQotTE9DQUxfTERMSUJTICs9IC1scHRocmVhZAotZW5kaWYgIyBCVUlMRF9IT1NUX3N0YXRpYwotCi1MT0NBTF9NT0RVTEUgOj0gemlwYWxpZ24KLUxPQ0FMX01PRFVMRV9IT1NUX09TIDo9IGRhcndpbiBsaW51eCB3aW5kb3dzCi0KLWluY2x1ZGUgJChCVUlMRF9IT1NUX0VYRUNVVEFCTEUpCmRpZmYgLS1naXQgYS90b29scy96aXBhbGlnbi9aaXBGaWxlLmNwcCBiL3Rvb2xzL3ppcGFsaWduL1ppcEZpbGUuY3BwCmluZGV4IDFiMzk5MDIuLjQzYmM5YmYgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3ppcGFsaWduL1ppcEZpbGUuY3BwCisrKyBiL3Rvb2xzL3ppcGFsaWduL1ppcEZpbGUuY3BwCkBAIC0yMCwxMyArMjAsMTIgQEAKIAogI2RlZmluZSBMT0dfVEFHICJ6aXAiCiAKLSNpbmNsdWRlIDxhbmRyb2lkZncvWmlwVXRpbHMuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx6aXBhcmNoaXZlL3ppcF9hcmNoaXZlLmg+CiAKICNpbmNsdWRlICJaaXBGaWxlLmgiCiAKICNpbmNsdWRlIDx6bGliLmg+Ci0jZGVmaW5lIERFRl9NRU1fTEVWRUwgOCAgICAgICAgICAgICAgICAvLyBub3JtYWxseSBpbiB6dXRpbC5oPwogCiAjaW5jbHVkZSAiem9wZmxpL2RlZmxhdGUuaCIKIApAQCAtMTM1LDcgKzEzNCw3IEBACiAvKgogICogUmV0dXJuIHRoZSBOdGggZW50cnkgaW4gdGhlIGFyY2hpdmUuCiAgKi8KLVppcEVudHJ5KiBaaXBGaWxlOjpnZXRFbnRyeUJ5SW5kZXgoaW50IGlkeCkgY29uc3QKK2FuZHJvaWQ6OlppcEVudHJ5KiBaaXBGaWxlOjpnZXRFbnRyeUJ5SW5kZXgoaW50IGlkeCkgY29uc3QKIHsKICAgICBpZiAoaWR4IDwgMCB8fCBpZHggPj0gKGludCkgbUVudHJpZXMuc2l6ZSgpKQogICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTE0Niw3ICsxNDUsNyBAQAogLyoKICAqIEZpbmQgYW4gZW50cnkgYnkgbmFtZS4KICAqLwotWmlwRW50cnkqIFppcEZpbGU6OmdldEVudHJ5QnlOYW1lKGNvbnN0IGNoYXIqIGZpbGVOYW1lKSBjb25zdAorYW5kcm9pZDo6WmlwRW50cnkqIFppcEZpbGU6OmdldEVudHJ5QnlOYW1lKGNvbnN0IGNoYXIqIGZpbGVOYW1lKSBjb25zdAogewogICAgIC8qCiAgICAgICogRG8gYSBzdHVwaWQgbGluZWFyIHN0cmluZy1jb21wYXJlIHNlYXJjaC4KQEAgLTc4NSw4ICs3ODQsNiBAQAogc3RhdHVzX3QgWmlwRmlsZTo6Y29weURhdGFUb0ZwKEZJTEUqIGRzdEZwLAogICAgIGNvbnN0IHZvaWQqIGRhdGEsIHNpemVfdCBzaXplLCB1aW50MzJfdCogcENSQzMyKQogewotICAgIHNpemVfdCBjb3VudDsKLQogICAgICpwQ1JDMzIgPSBjcmMzMigwTCwgWl9OVUxMLCAwKTsKICAgICBpZiAoc2l6ZSA+IDApIHsKICAgICAgICAgKnBDUkMzMiA9IGNyYzMyKCpwQ1JDMzIsIChjb25zdCB1bnNpZ25lZCBjaGFyKilkYXRhLCBzaXplKTsKQEAgLTExOTgsNiArMTE5NSw1OCBAQAogfQogI2VuZGlmCiAKK2NsYXNzIEJ1ZmZlcldyaXRlciA6IHB1YmxpYyB6aXBfYXJjaGl2ZTo6V3JpdGVyIHsKKyAgcHVibGljOgorICAgIEJ1ZmZlcldyaXRlcih2b2lkKiBidWYsIHNpemVfdCBzaXplKSA6IFdyaXRlcigpLAorICAgICAgICBidWZfKHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KGJ1ZikpLCBzaXplXyhzaXplKSwgYnl0ZXNfd3JpdHRlbl8oMCkge30KKworICAgIGJvb2wgQXBwZW5kKHVpbnQ4X3QqIGJ1Ziwgc2l6ZV90IGJ1Zl9zaXplKSBvdmVycmlkZSB7CisgICAgICAgIGlmIChieXRlc193cml0dGVuXyArIGJ1Zl9zaXplID4gc2l6ZV8pIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIG1lbWNweShidWZfICsgYnl0ZXNfd3JpdHRlbl8sIGJ1ZiwgYnVmX3NpemUpOworICAgICAgICBieXRlc193cml0dGVuXyArPSBidWZfc2l6ZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgIHByaXZhdGU6CisgICAgdWludDhfdCogY29uc3QgYnVmXzsKKyAgICBjb25zdCBzaXplX3Qgc2l6ZV87CisgICAgc2l6ZV90IGJ5dGVzX3dyaXR0ZW5fOworfTsKKworY2xhc3MgRmlsZVJlYWRlciA6IHB1YmxpYyB6aXBfYXJjaGl2ZTo6UmVhZGVyIHsKKyAgcHVibGljOgorICAgIEZpbGVSZWFkZXIoRklMRSogZnApIDogUmVhZGVyKCksIGZwXyhmcCksIGN1cnJlbnRfb2Zmc2V0XygwKSB7CisgICAgfQorCisgICAgYm9vbCBSZWFkQXRPZmZzZXQodWludDhfdCogYnVmLCBzaXplX3QgbGVuLCB1aW50MzJfdCBvZmZzZXQpIGNvbnN0IHsKKyAgICAgICAgLy8gRGF0YSBpcyB1c3VhbGx5IHJlcXVlc3RlZCBzZXF1ZW50aWFsbHksIHNvIHRoaXMgaGVscHMgYXZvaWQgcG9pbnRsZXNzCisgICAgICAgIC8vIGZzZWVrcyBldmVyeSB0aW1lIHdlIHBlcmZvcm0gYSByZWFkLiBUaGVyZSdzIGFuIGltcGVkZW5jZSBtaXNtYXRjaAorICAgICAgICAvLyBoZXJlIGJlY2F1c2UgdGhlIG9yaWdpbmFsIEFQSSB3YXMgZGVzaWduZWQgYXJvdW5kIHByZWFkIGFuZCBwd3JpdGUuCisgICAgICAgIGlmIChvZmZzZXQgIT0gY3VycmVudF9vZmZzZXRfKSB7CisgICAgICAgICAgICBpZiAoZnNlZWsoZnBfLCBvZmZzZXQsIFNFRUtfU0VUKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjdXJyZW50X29mZnNldF8gPSBvZmZzZXQ7CisgICAgICAgIH0KKworICAgICAgICBzaXplX3QgcmVhZCA9IGZyZWFkKGJ1ZiwgMSwgbGVuLCBmcF8pOworICAgICAgICBpZiAocmVhZCAhPSBsZW4pIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGN1cnJlbnRfb2Zmc2V0XyArPSByZWFkOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICBGSUxFKiBmcF87CisgICAgbXV0YWJsZSB1aW50MzJfdCBjdXJyZW50X29mZnNldF87Cit9OworCiAvLyBmcmVlIHRoZSBtZW1vcnkgd2hlbiB5b3UncmUgZG9uZQogdm9pZCogWmlwRmlsZTo6dW5jb21wcmVzcyhjb25zdCBaaXBFbnRyeSogZW50cnkpIGNvbnN0CiB7CkBAIC0xMjQwLDExICsxMjg5LDEzIEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBaaXBFbnRyeTo6a0NvbXByZXNzRGVmbGF0ZWQ6IHsKLSAgICAgICAgICAgIGlmICghWmlwVXRpbHM6OmluZmxhdGVUb0J1ZmZlcihtWmlwRnAsIGJ1ZiwgdW5sZW4sIGNsZW4pKSB7CisgICAgICAgICAgICBjb25zdCBGaWxlUmVhZGVyIHJlYWRlcihtWmlwRnApOworICAgICAgICAgICAgQnVmZmVyV3JpdGVyIHdyaXRlcihidWYsIHVubGVuKTsKKyAgICAgICAgICAgIGlmICh6aXBfYXJjaGl2ZTo6SW5mbGF0ZShyZWFkZXIsIGNsZW4sIHVubGVuLCAmd3JpdGVyLCBudWxscHRyKSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgZ290byBiYWlsOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIGdvdG8gYmFpbDsKICAgICB9CmRpZmYgLS1naXQgYS90b29scy96aXB0aW1lL0FuZHJvaWQuYnAgYi90b29scy96aXB0aW1lL0FuZHJvaWQuYnAKaW5kZXggODc0ZDM0Ni4uNWVmNDVlZCAxMDA2NDQKLS0tIGEvdG9vbHMvemlwdGltZS9BbmRyb2lkLmJwCisrKyBiL3Rvb2xzL3ppcHRpbWUvQW5kcm9pZC5icApAQCAtMjcsNiArMjcsNyBAQAogICAgIF0sCiAKICAgICBuYW1lOiAiemlwdGltZSIsCisgICAgY2ZsYWdzOiBbIi1XYWxsIiwgIi1XZXJyb3IiXSwKICAgICB0YXJnZXQ6IHsKICAgICAgICAgd2luZG93czogewogICAgICAgICAgICAgZW5hYmxlZDogdHJ1ZSwKZGlmZiAtLWdpdCBhL3Rvb2xzL3ppcHRpbWUvWmlwRW50cnkuY3BwIGIvdG9vbHMvemlwdGltZS9aaXBFbnRyeS5jcHAKaW5kZXggNTFjZTA5Zi4uZTdiNTJlZCAxMDA2NDQKLS0tIGEvdG9vbHMvemlwdGltZS9aaXBFbnRyeS5jcHAKKysrIGIvdG9vbHMvemlwdGltZS9aaXBFbnRyeS5jcHAKQEAgLTg2LDcgKzg2LDYgQEAKICAqLwogc3RhdHVzX3QgWmlwRW50cnk6OkxvY2FsRmlsZUhlYWRlcjo6cmV3cml0ZShGSUxFKiBmcCkKIHsKLSAgICBzdGF0dXNfdCByZXN1bHQgPSAwOwogICAgIHVpbnQ4X3QgYnVmW2tMRkhMZW5dOwogCiAgICAgaWYgKGZyZWFkKGJ1ZiwgMSwga0xGSExlbiwgZnApICE9IGtMRkhMZW4pCkBAIC0xMjQsNyArMTIzLDYgQEAKICAqLwogc3RhdHVzX3QgWmlwRW50cnk6OkNlbnRyYWxEaXJFbnRyeTo6cmV3cml0ZShGSUxFKiBmcCkKIHsKLSAgICBzdGF0dXNfdCByZXN1bHQgPSAwOwogICAgIHVpbnQ4X3QgYnVmW2tDREVMZW5dOwogICAgIHVpbnQxNl90IGZpbGVOYW1lTGVuZ3RoLCBleHRyYUZpZWxkTGVuZ3RoLCBmaWxlQ29tbWVudExlbmd0aDsKIAo=