ZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9jb21tb24vQW5kcm9pZC5tayBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9jb21tb24vQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWU3OTYxCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2NvbW1vbi9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMTYgQEAKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCitpbmNsdWRlICQoY2FsbCBhbGwtc3ViZGlyLW1ha2VmaWxlcykKZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9jb21tb24vdXRpbC9BbmRyb2lkLm1rIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2NvbW1vbi91dGlsL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTVkZGE4MAotLS0gL2Rldi9udWxsCisrKyBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9jb21tb24vdXRpbC9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsNTIgQEAKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSBcCisgICAgc3JjL01pbWVUeXBlVXRpbC5jcHAKKworTE9DQUxfTU9EVUxFIDo9IGxpYmRybXV0aWxpdHkKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSAgXAorICAgIGxpYnV0aWxzIFwKKyAgICBsaWJkbCBcCisgICAgbGliZHZtIFwKKyAgICBsaWJhbmRyb2lkX3J1bnRpbWUgXAorICAgIGxpYm5hdGl2ZWhlbHBlciBcCisgICAgbGlibG9nCisKKworYmFzZSA6PSBmcmFtZXdvcmtzL2Jhc2UKKworTE9DQUxfQ19JTkNMVURFUyArPSBcCisgICAgJChKTklfSF9JTkNMVURFKSBcCisgICAgJChiYXNlKS9pbmNsdWRlIFwKKyAgICAkKGJhc2UpL2luY2x1ZGUvZHJtIFwKKyAgICAkKGJhc2UpL2luY2x1ZGUvZHJtL3BsdWdpbnMgXAorICAgICQoTE9DQUxfUEFUSCkvaW5jbHVkZQorCisKK2lmbmVxICgkKFRBUkdFVF9CVUlMRF9WQVJJQU5UKSx1c2VyKQorTE9DQUxfQ19JTkNMVURFUyArPSBcCisgICAgJChMT0NBTF9QQVRIKS90b29scworCitlbmRpZgorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorCitpbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvY29tbW9uL3V0aWwvaW5jbHVkZS9NaW1lVHlwZVV0aWwuaCBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9jb21tb24vdXRpbC9pbmNsdWRlL01pbWVUeXBlVXRpbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkMTJhNjEKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvY29tbW9uL3V0aWwvaW5jbHVkZS9NaW1lVHlwZVV0aWwuaApAQCAtMCwwICsxLDQ2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfX01JTUVUWVBFVVRJTF9IX18KKyNkZWZpbmUgX19NSU1FVFlQRVVUSUxfSF9fCisKKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgTWltZVR5cGVVdGlsIHsKKworcHVibGljOgorCisgICAgTWltZVR5cGVVdGlsKCkge30KKworICAgIHZpcnR1YWwgfk1pbWVUeXBlVXRpbCgpIHt9CisKKy8qKgorICogTWF5IGNvbnZlcnQgdGhlIG1pbWV0eXBlIGlmIHRoZXJlIGlzIGEgd2VsbCBrbm93bgorICogcmVwbGFjZW1lbnQgbWltZXR5cGUgb3RoZXJ3aXNlIHRoZSBvcmlnaW5hbCBtaW1ldHlwZQorICogaXMgcmV0dXJuZWQuCisgKgorICogQHBhcmFtIG1pbWVUeXBlIC0gbWltZXR5cGUgaW4gbG93ZXIgY2FzZSB0byBjb252ZXJ0LgorICoKKyAqIEByZXR1cm4gbWltZXR5cGUgb3IgbnVsbC4KKyAqLworc3RhdGljIFN0cmluZzggY29udmVydE1pbWVUeXBlKFN0cmluZzgmIG1pbWVUeXBlKTsKKworfTsKK307CisKKyNlbmRpZiAvKiBfX01JTUVUWVBFVVRJTF9IX18gKi8KZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9jb21tb24vdXRpbC9pbmNsdWRlL1Nlc3Npb25NYXAuaCBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9jb21tb24vdXRpbC9pbmNsdWRlL1Nlc3Npb25NYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZGZmNThjCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2NvbW1vbi91dGlsL2luY2x1ZGUvU2Vzc2lvbk1hcC5oCkBAIC0wLDAgKzEsMTU1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfX1NFU1NJT05NQVBfSF9fCisjZGVmaW5lIF9fU0VTU0lPTk1BUF9IX18KKworI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyoqCisgKiBBIHdyYXBwZXIgdGVtcGxhdGUgY2xhc3MgZm9yIGhhbmRsaW5nIERSTSBFbmdpbmUgc2Vzc2lvbnMuCisgKi8KK3RlbXBsYXRlIDx0eXBlbmFtZSBOT0RFPgorY2xhc3MgU2Vzc2lvbk1hcCB7CisKK3B1YmxpYzoKKyAgICBLZXllZFZlY3RvcjxpbnQsIE5PREU+IG1hcDsKKworICAgIFNlc3Npb25NYXAoKSB7fQorCisgICAgdmlydHVhbCB+U2Vzc2lvbk1hcCgpIHsKKyAgICAgICAgZGVzdHJveU1hcCgpOworICAgIH0KKworLyoqCisgKiBBZGRzIGEgbmV3IHZhbHVlIGluIHRoZSBzZXNzaW9uIG1hcCB0YWJsZS4gSXQgZXhwZWN0cyBtZW1vcnkgdG8gYmUgYWxsb2NhdGVkIGFscmVhZHkKKyAqIGZvciB0aGUgc2Vzc2lvbiBvYmplY3QKKyAqCisgKiBAcGFyYW0ga2V5IC0ga2V5IG9yIFNlc3Npb24gSUQKKyAqIEBwYXJhbSB2YWx1ZSAtIHNlc3Npb24gb2JqZWN0IHRvIGFkZAorICoKKyAqIEByZXR1cm4gYm9vbGVhbiByZXN1bHQgb2YgYWRkaW5nIHZhbHVlLiByZXR1cm5zIGZhbHNlIGlmIGtleSBpcyBhbHJlYWR5IGV4aXN0LgorICovCitib29sIGFkZFZhbHVlKGludCBrZXksIE5PREUgdmFsdWUpIHsKKyAgICBib29sIHJlc3VsdCA9IGZhbHNlOworCisgICAgaWYgKCFpc0NyZWF0ZWQoa2V5KSkgeworICAgICAgICBtYXAuYWRkKGtleSwgdmFsdWUpOworICAgICAgICByZXN1bHQgPSB0cnVlOworICAgIH0KKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKworLyoqCisgKiByZXR1cm5zIHRoZSBzZXNzaW9uIG9iamVjdCBieSB0aGUga2V5CisgKgorICogQHBhcmFtIGtleSAtIGtleSBvciBTZXNzaW9uIElECisgKgorICogQHJldHVybiBzZXNzaW9uIG9iamVjdCBhcyBwZXIgdGhlIGtleQorICovCitOT0RFIGdldFZhbHVlKGludCBrZXkpIHsKKyAgICBOT0RFIHZhbHVlID0gTlVMTDsKKworICAgIGlmIChpc0NyZWF0ZWQoa2V5KSkgeworICAgICAgICB2YWx1ZSA9IChOT0RFKSBtYXAudmFsdWVGb3Ioa2V5KTsKKyAgICB9CisKKyAgICByZXR1cm4gdmFsdWU7Cit9CisKKy8qKgorICogcmV0dXJucyB0aGUgbnVtYmVyIG9mIG9iamVjdHMgaW4gdGhlIHNlc3Npb24gbWFwIHRhYmxlCisgKgorICogQHJldHVybiBjb3VudCBvZiBudW1iZXIgb2Ygc2Vzc2lvbiBvYmplY3RzLgorICovCitpbnQgZ2V0U2l6ZSgpIHsKKyAgICByZXR1cm4gbWFwLnNpemUoKTsKK30KKworLyoqCisgKiByZXR1cm5zIHRoZSBzZXNzaW9uIG9iamVjdCBieSB0aGUgaW5kZXggaW4gdGhlIHNlc3Npb24gbWFwIHRhYmxlCisgKgorICogQHBhcmFtIGluZGV4IC0gaW5kZXggb2YgdGhlIHZhbHVlIHJlcXVpcmVkCisgKgorICogQHJldHVybiBzZXNzaW9uIG9iamVjdCBhcyBwZXIgdGhlIGluZGV4CisgKi8KK05PREUgZ2V0VmFsdWVBdCh1bnNpZ25lZCBpbnQgaW5kZXgpIHsKKyAgICBOT0RFIHZhbHVlID0gTlVMTDsKKworICAgIGlmIChtYXAuc2l6ZSgpID4gaW5kZXgpIHsKKyAgICAgIHZhbHVlID0gbWFwLnZhbHVlQXQoaW5kZXgpOworICAgIH0KKworICAgIHJldHVybiB2YWx1ZTsKK30KKworLyoqCisgKiBkZWxldGVzIHRoZSBvYmplY3QgZnJvbSBzZXNzaW9uIG1hcC4gSXQgYWxzbyBmcmVlcyB1cCBtZW1vcnkgZm9yIHRoZSBzZXNzaW9uIG9iamVjdC4KKyAqCisgKiBAcGFyYW0ga2V5IC0ga2V5IG9mIHRoZSB2YWx1ZSB0byBiZSBkZWxldGVkCisgKgorICovCit2b2lkIHJlbW92ZVZhbHVlKGludCBrZXkpIHsKKyAgICBkZWxldGVWYWx1ZShnZXRWYWx1ZShrZXkpKTsKKyAgICBtYXAucmVtb3ZlSXRlbShrZXkpOworfQorCisvKioKKyAqIGRlY2lkZXMgaWYgc2Vzc2lvbiBpcyBhbHJlYWR5IGNyZWF0ZWQuCisgKgorICogQHBhcmFtIGtleSAtIGtleSBvZiB0aGUgdmFsdWUgZm9yIHRoZSBzZXNzaW9uCisgKgorICogQHJldHVybiBib29sZWFuIHJlc3VsdCBvZiB3aGV0aGVyIHNlc3Npb24gaXMgY3JlYXRlZAorICovCitib29sIGlzQ3JlYXRlZChpbnQga2V5KSB7CisgICAgcmV0dXJuICgwIDw9IG1hcC5pbmRleE9mS2V5KGtleSkpOworfQorCisvKioKKyAqIGVtcHR5IHRoZSBlbnRpcmUgc2Vzc2lvbiB0YWJsZS4gSXQgcmVsZWFzZXMgYWxsIHRoZSBtZW1vcnkgZm9yIHNlc3Npb24gb2JqZWN0cy4KKyAqLwordm9pZCBkZXN0cm95TWFwKCkgeworICAgIGludCBzaXplID0gbWFwLnNpemUoKTsKKyAgICBpbnQgaSA9IDA7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgIGRlbGV0ZVZhbHVlKG1hcC52YWx1ZUF0KGkpKTsKKyAgICB9CisKKyAgICBtYXAuY2xlYXIoKTsKK30KKworLyoqCisgKiBmcmVlIHVwIHRoZSBtZW1vcnkgZm9yIHRoZSBzZXNzaW9uIG9iamVjdC4KKyAqIE1ha2Ugc3VyZSBpZiBhbnkgcmVmZXJlbmNlIHRvIHRoZSBzZXNzaW9uIG9iamVjdCBhbnl3aGVyZSwgb3RoZXJ3aXNlIGl0IHdpbGwgYmUgYQorICogZGFuZ2xlIHBvaW50ZXIgYWZ0ZXIgdGhpcyBjYWxsLgorICoKKyAqIEBwYXJhbSB2YWx1ZSAtIHNlc3Npb24gb2JqZWN0IHRvIGZyZWUKKyAqCisgKi8KK3ZvaWQgZGVsZXRlVmFsdWUoTk9ERSB2YWx1ZSkgeworICAgIGRlbGV0ZSB2YWx1ZTsKK30KKworfTsKKworfTsKKworI2VuZGlmIC8qIF9fU0VTU0lPTk1BUF9IX18gKi8KZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9jb21tb24vdXRpbC9zcmMvTWltZVR5cGVVdGlsLmNwcCBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9jb21tb24vdXRpbC9zcmMvTWltZVR5cGVVdGlsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWU5MDNlCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2NvbW1vbi91dGlsL3NyYy9NaW1lVHlwZVV0aWwuY3BwCkBAIC0wLDAgKzEsMTU0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPE1pbWVUeXBlVXRpbC5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKyN1bmRlZiBMT0dfVEFHCisjZGVmaW5lIExPR19UQUcgIk1pbWVUeXBlVXRpbCIKKworZW51bSB7CisgICAgTUlNRVRZUEVfQVVESU8gICAgICAgPSAwLAorICAgIE1JTUVUWVBFX0FQUExJQ0FUSU9OID0gMSwKKyAgICBNSU1FVFlQRV9JTUFHRSAgICAgICA9IDIsCisgICAgTUlNRVRZUEVfVklERU8gICAgICAgPSAzLAorICAgIE1JTUVUWVBFX0xBU1QgICAgICAgID0gLTEsCit9OworCitzdHJ1Y3QgTWltZUdyb3VweworICAgIGludCAgICAgICAgIHR5cGU7ICAgICAvLyBBdWRpbywgdmlkZW8sLi4gdXNlIHRoZSBlbnVtIHZhbHVlcworICAgIGNvbnN0IGNoYXIqIHBHcm91cDsgICAvLyAiYXVkaW8vIiwgInZpZGVvLyIsLi4gc2hvdWxkIGNvbnRhaW4gdGhlIGxhc3QgIi8iCisgICAgaW50ICAgICAgICAgc2l6ZTsgICAgIC8vIE51bWJlciBvZiBieXRlcy4gZS5nLiAiYXVkaW8vIiA9IDYgYnl0ZXMKK307CisKK3N0cnVjdCBNaW1lVHlwZUxpc3R7CisgICAgaW50ICAgICAgICAgdHlwZTsKKyAgICBjb25zdCBjaGFyKiBwTWltZUV4dDsgIC8vIEV2ZXJ5dGhpbmcgYWZ0ZXIgdGhlICcvJyBlLmcuIGF1ZGlvL3gtbXBlZyAtPiAieC1tcGVnIgorICAgIGludCAgICAgICAgIHNpemU7ICAgICAgLy8gTnVtYmVyIG9mIGJ5dGVzLiBlLmcuICJ4LW1wZWciID0gNiBieXRlcworICAgIGNvbnN0IGNoYXIqIHBNaW1lVHlwZTsgLy8gTWltZXR5cGUgdGhhdCBzaG91bGQgYmUgcmV0dXJuZWQKK307CisKKworLy8gS25vd24gbWltZXR5cGVzIGJ5IGFuZHJvaWQKK3N0YXRpYyBjb25zdCBjaGFyIG1pbWVfdHlwZV9hdWRpb19tcGVnW10gID0gImF1ZGlvL21wZWciOworc3RhdGljIGNvbnN0IGNoYXIgbWltZV90eXBlX2F1ZGlvXzNncHBbXSAgPSAiYXVkaW8vM2dwcCI7CitzdGF0aWMgY29uc3QgY2hhciBtaW1lX3R5cGVfYXVkaW9fYW1yW10gICA9ICJhdWRpby9hbXItd2IiOworc3RhdGljIGNvbnN0IGNoYXIgbWltZV90eXBlX2F1ZGlvX2FhY1tdICAgPSAiYXVkaW8vbXA0YS1sYXRtIjsKK3N0YXRpYyBjb25zdCBjaGFyIG1pbWVfdHlwZV9hdWRpb193YXZbXSAgID0gImF1ZGlvL3dhdiI7CisKK3N0YXRpYyBjb25zdCBjaGFyIG1pbWVfdHlwZV92aWRlb19tcGVnNFtdID0gInZpZGVvL21wZWc0IjsKK3N0YXRpYyBjb25zdCBjaGFyIG1pbWVfdHlwZV92aWRlb18zZ3BwW10gID0gInZpZGVvLzNncHAiOworCisvLyBLbm93biBtaW1ldHlwZSBncm91cHMKK3N0YXRpYyBjb25zdCBjaGFyIG1pbWVfZ3JvdXBfYXVkaW9bXSAgICAgICA9ICJhdWRpby8iOworc3RhdGljIGNvbnN0IGNoYXIgbWltZV9ncm91cF9hcHBsaWNhdGlvbltdID0gImFwcGxpY2F0aW9uLyI7CitzdGF0aWMgY29uc3QgY2hhciBtaW1lX2dyb3VwX2ltYWdlW10gICAgICAgPSAiaW1hZ2UvIjsKK3N0YXRpYyBjb25zdCBjaGFyIG1pbWVfZ3JvdXBfdmlkZW9bXSAgICAgICA9ICJ2aWRlby8iOworCitzdGF0aWMgc3RydWN0IE1pbWVHcm91cCBtaW1lR3JvdXBbXSA9IHsKKyAgICB7TUlNRVRZUEVfQVVESU8sICAgICAgIG1pbWVfZ3JvdXBfYXVkaW8sICAgICAgICBzaXplb2YobWltZV9ncm91cF9hdWRpbyktMX0sCisgICAge01JTUVUWVBFX0FQUExJQ0FUSU9OLCBtaW1lX2dyb3VwX2FwcGxpY2F0aW9uLCAgc2l6ZW9mKG1pbWVfZ3JvdXBfYXBwbGljYXRpb24pLTF9LAorICAgIHtNSU1FVFlQRV9JTUFHRSwgICAgICAgbWltZV9ncm91cF9pbWFnZSwgICAgICAgIHNpemVvZihtaW1lX2dyb3VwX2ltYWdlKS0xfSwKKyAgICB7TUlNRVRZUEVfVklERU8sICAgICAgIG1pbWVfZ3JvdXBfdmlkZW8sICAgICAgICBzaXplb2YobWltZV9ncm91cF92aWRlbyktMX0sCisgICAge01JTUVUWVBFX0xBU1QsICAgICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgMH0gLy8gTXVzdCBiZSBsYXN0IGVudHJ5Cit9OworCisvLyBMaXN0IG9mIGFsbCBtaW1ldHlwZXMgdGhhdCBzaG91bGQgYmUgY29udmVydGVkLgorc3RhdGljIHN0cnVjdCBNaW1lVHlwZUxpc3QgbWltZVR5cGVMaXN0W10gPSB7CisgICAgLy8gTXAzIG1pbWUgdHlwZXMKKyAgICB7TUlNRVRZUEVfQVVESU8sICJtcDMiLCAgICAgICAgICBzaXplb2YoIm1wMyIpLTEsICAgICAgICAgbWltZV90eXBlX2F1ZGlvX21wZWd9LAorICAgIHtNSU1FVFlQRV9BVURJTywgIngtbXBlZyIsICAgICAgIHNpemVvZigieC1tcGVnIiktMSwgICAgICBtaW1lX3R5cGVfYXVkaW9fbXBlZ30sCisgICAge01JTUVUWVBFX0FVRElPLCAieC1tcDMiLCAgICAgICAgc2l6ZW9mKCJ4LW1wMyIpLTEsICAgICAgIG1pbWVfdHlwZV9hdWRpb19tcGVnfSwKKyAgICB7TUlNRVRZUEVfQVVESU8sICJtcGciLCAgICAgICAgICBzaXplb2YoIm1wZyIpLTEsICAgICAgICAgbWltZV90eXBlX2F1ZGlvX21wZWd9LAorICAgIHtNSU1FVFlQRV9BVURJTywgIm1wZzMiLCAgICAgICAgIHNpemVvZigibXBnIiktMSwgICAgICAgICBtaW1lX3R5cGVfYXVkaW9fbXBlZ30sCisgICAge01JTUVUWVBFX0FVRElPLCAieC1tcGciLCAgICAgICAgc2l6ZW9mKCJ4LW1wZyIpLTEsICAgICAgIG1pbWVfdHlwZV9hdWRpb19tcGVnfSwKKyAgICB7TUlNRVRZUEVfQVVESU8sICJ4LW1wZWdhdWRpbyIsICBzaXplb2YoIngtbXBlZ2F1ZGlvIiktMSwgbWltZV90eXBlX2F1ZGlvX21wZWd9LAorCisgICAgLy8gM2dwcCBhdWRpbyBtaW1lIHR5cGVzCisgICAge01JTUVUWVBFX0FVRElPLCAiM2dwIiwgICAgICAgICAgc2l6ZW9mKCIzZ3AiKS0xLCAgICAgICAgIG1pbWVfdHlwZV9hdWRpb18zZ3BwfSwKKworICAgIC8vIEFtciBhdWRpbyBtaW1lIHR5cGVzCisgICAge01JTUVUWVBFX0FVRElPLCAiYW1yIiwgICAgICAgICAgc2l6ZW9mKCJhbXIiKS0xLCAgICAgICAgIG1pbWVfdHlwZV9hdWRpb19hbXJ9LAorCisgICAgLy8gQWFjIGF1ZGlvIG1pbWUgdHlwZXMKKyAgICB7TUlNRVRZUEVfQVVESU8sICJhYWMiLCAgICAgICAgICBzaXplb2YoImFhYyIpLTEsICAgICAgICAgbWltZV90eXBlX2F1ZGlvX2FhY30sCisKKyAgICAvLyBXYXYgYXVkaW8gbWltZSB0eXBlcworICAgIHtNSU1FVFlQRV9BVURJTywgIngtd2F2IiwgICAgICAgIHNpemVvZigieC13YXYiKS0xLCAgICAgICBtaW1lX3R5cGVfYXVkaW9fd2F2fSwKKworICAgIC8vIE1wZWc0IHZpZGVvIG1pbWUgdHlwZXMKKyAgICB7TUlNRVRZUEVfVklERU8sICJtcGc0IiwgICAgICAgICBzaXplb2YoIm1wZzQiKS0xLCAgICAgICAgbWltZV90eXBlX3ZpZGVvX21wZWc0fSwKKyAgICB7TUlNRVRZUEVfVklERU8sICJtcDR2LWVzIiwgICAgICBzaXplb2YoIm1wNHYtZXMiKS0xLCAgICAgbWltZV90eXBlX3ZpZGVvX21wZWc0fSwKKworICAgIC8vIDNncHAgdmlkZW8gbWltZSB0eXBlcworICAgIHtNSU1FVFlQRV9WSURFTywgIjNncCIsICAgICAgICAgIHNpemVvZigiM2dwIiktMSwgICAgICAgICBtaW1lX3R5cGVfdmlkZW9fM2dwcH0sCisKKyAgICAvLyBNdXN0IGJlIGxhc3QgZW50cnkKKyAgICB7TUlNRVRZUEVfTEFTVCwgIE5VTEwsICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgTlVMTH0KK307CisKKy8qKgorICogTWF5IGNvbnZlcnQgdGhlIG1pbWV0eXBlIGlmIHRoZXJlIGlzIGEgd2VsbCBrbm93bgorICogcmVwbGFjZW1lbnQgbWltZXR5cGUgb3RoZXJ3aXNlIHRoZSBvcmlnaW5hbCBtaW1ldHlwZQorICogaXMgcmV0dXJuZWQuCisgKgorICogQHBhcmFtIG1pbWVUeXBlIC0gbWltZXR5cGUgaW4gbG93ZXIgY2FzZSB0byBjb252ZXJ0LgorICoKKyAqIEByZXR1cm4gbWltZXR5cGUgb3IgbnVsbC4KKyAqLworU3RyaW5nOCBNaW1lVHlwZVV0aWw6OmNvbnZlcnRNaW1lVHlwZShTdHJpbmc4JiBtaW1lVHlwZSkgeworICAgIFN0cmluZzggcmVzdWx0ID0gbWltZVR5cGU7CisgICAgY29uc3QgY2hhciogcFRtcDsKKyAgICBjb25zdCBjaGFyKiBwTWltZVR5cGU7CisgICAgc3RydWN0IE1pbWVHcm91cCogcEdyb3VwOworICAgIHN0cnVjdCBNaW1lVHlwZUxpc3QqIHBNaW1lSXRlbTsKKyAgICBpbnQgbGVuOworCisgICAgcE1pbWVUeXBlID0gbWltZVR5cGUuc3RyaW5nKCk7CisgICAgaWYgKE5VTEwgIT0gcE1pbWVUeXBlKSB7CisgICAgICAgIC8qIENoZWNrIHdoaWNoIGdyb3VwIHRoZSBtaW1ldHlwZSBpcyAqLworICAgICAgICBwR3JvdXAgPSBtaW1lR3JvdXA7CisKKyAgICAgICAgd2hpbGUgKE1JTUVUWVBFX0xBU1QgIT0gcEdyb3VwLT50eXBlKSB7CisgICAgICAgICAgICBpZiAoMCA9PSBzdHJuY21wKHBNaW1lVHlwZSwgcEdyb3VwLT5wR3JvdXAsIHBHcm91cC0+c2l6ZSkpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBHcm91cCsrOworICAgICAgICB9CisKKyAgICAgICAgLyogR28gdGhyb3VnaCB0aGUgbWltZXR5cGUgbGlzdC4gT25seSBjaGVjayBpdGVtcyBvZiB0aGUgY29ycmVjdCBncm91cCAqLworICAgICAgICBpZiAoTUlNRVRZUEVfTEFTVCAhPSBwR3JvdXAtPnR5cGUpIHsKKyAgICAgICAgICAgIHBNaW1lSXRlbSA9IG1pbWVUeXBlTGlzdDsKKyAgICAgICAgICAgIGxlbiA9IHN0cmxlbiAocE1pbWVUeXBlK3BHcm91cC0+c2l6ZSk7CisKKyAgICAgICAgICAgIHdoaWxlIChNSU1FVFlQRV9MQVNUICE9IHBNaW1lSXRlbS0+dHlwZSkgeworICAgICAgICAgICAgICAgIGlmICgobGVuID09IHBNaW1lSXRlbS0+c2l6ZSkgJiYKKyAgICAgICAgICAgICAgICAgICAgKDAgPT0gc3RyY21wKHBNaW1lVHlwZStwR3JvdXAtPnNpemUsIHBNaW1lSXRlbS0+cE1pbWVFeHQpKSkgeworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBTdHJpbmc4KHBNaW1lSXRlbS0+cE1pbWVUeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBNaW1lSXRlbSsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIExPR0koImNvbnZlcnRNaW1lVHlwZSBnb3QgbWltZXR5cGUgJXMsIGNvbnZlcnRlZCBpbnRvIG1pbWV0eXBlICVzIiwKKyAgICAgICAgICAgICBwTWltZVR5cGUsIHJlc3VsdC5zdHJpbmcoKSk7CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKK30KK307CmRpZmYgLS1naXQgYS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL0FuZHJvaWQubWsgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWVlNzk2MQotLS0gL2Rldi9udWxsCisrKyBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svQW5kcm9pZC5tawpAQCAtMCwwICsxLDE2IEBACisjCisjIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworaW5jbHVkZSAkKGNhbGwgYWxsLXN1YmRpci1tYWtlZmlsZXMpCmRpZmYgLS1naXQgYS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL0Z3ZExvY2tFbmdpbmUvQW5kcm9pZC5tayBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svRndkTG9ja0VuZ2luZS9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0YTZmMTgKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL0Z3ZExvY2tFbmdpbmUvQW5kcm9pZC5tawpAQCAtMCwwICsxLDY3IEBACisjCisjIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworYmFzZSA6PSBmcmFtZXdvcmtzL2Jhc2UKKworIyBEZXRlcm1pbmUgd2hldGhlciB0aGUgRFJNIGZyYW1ld29yayB1c2VzIDY0LWJpdCBkYXRhIHR5cGVzIGZvciBmaWxlIG9mZnNldHMgYW5kIGRvIHRoZSBzYW1lLgoraWZuZXEgKCQoc2hlbGwgZ3JlcCAtYyAnb2ZmNjRfdCBvZmZzZXQnICQoYmFzZSkvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2NvbW1vbi9pbmNsdWRlL0lEcm1FbmdpbmUuaCksIDApCitMT0NBTF9DRkxBR1MgKz0gLURVU0VfNjRCSVRfRFJNX0FQSQorZW5kaWYKKworTE9DQUxfU1JDX0ZJTEVTOj0gXAorICAgIHNyYy9Gd2RMb2NrRW5naW5lLmNwcAorCitMT0NBTF9NT0RVTEUgOj0gbGliZndkbG9ja2VuZ2luZQorCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKKyAgICBsaWJpY3VpMThuIFwKKyAgICBsaWJpY3V1YyBcCisgICAgbGlidXRpbHMgXAorICAgIGxpYmRsIFwKKyAgICBsaWJhbmRyb2lkX3J1bnRpbWUgXAorICAgIGxpYm5hdGl2ZWhlbHBlciBcCisgICAgbGliY3J5cHRvIFwKKyAgICBsaWJzc2wgXAorICAgIGxpYmRybWZyYW1ld29yaworCitMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IFwKKyAgICBsaWJkcm11dGlsaXR5IFwKKyAgICBsaWJkcm1mcmFtZXdvcmtjb21tb24gXAorICAgIGxpYmZ3ZGxvY2stY29tbW9uIFwKKyAgICBsaWJmd2Rsb2NrLWNvbnZlcnRlciBcCisgICAgbGliZndkbG9jay1kZWNvZGVyCisKK0xPQ0FMX1BSRUxJTktfTU9EVUxFIDo9IGZhbHNlCisKK0xPQ0FMX0NfSU5DTFVERVMgKz0gXAorICAgICQoSk5JX0hfSU5DTFVERSkgXAorICAgICQoYmFzZSkvaW5jbHVkZS9kcm0gXAorICAgICQoYmFzZSkvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2NvbW1vbi9pbmNsdWRlIFwKKyAgICAkKGJhc2UpL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9jb21tb24vdXRpbC9pbmNsdWRlIFwKKyAgICAkKGJhc2UpL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L2NvbW1vbiBcCisgICAgJChiYXNlKS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9jb252ZXJ0ZXIgXAorICAgICQoYmFzZSkvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9pbnRlcm5hbC1mb3JtYXQvZGVjb2RlciBcCisgICAgJChMT0NBTF9QQVRIKS9pbmNsdWRlIFwKKyAgICBleHRlcm5hbC9vcGVuc3NsL2luY2x1ZGUKKworTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX1NIQVJFRF9MSUJSQVJJRVMpL2RybS9wbHVnaW5zL25hdGl2ZQorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorCitpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL0Z3ZExvY2tFbmdpbmUvaW5jbHVkZS9Gd2RMb2NrRW5naW5lLmggYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL0Z3ZExvY2tFbmdpbmUvaW5jbHVkZS9Gd2RMb2NrRW5naW5lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ4MDRjZgotLS0gL2Rldi9udWxsCisrKyBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svRndkTG9ja0VuZ2luZS9pbmNsdWRlL0Z3ZExvY2tFbmdpbmUuaApAQCAtMCwwICsxLDU1OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX19GV0RMT0NLRU5HSU5FX0hfXworI2RlZmluZSBfX0ZXRExPQ0tFTkdJTkVfSF9fCisKKyNpbmNsdWRlIDxEcm1FbmdpbmVCYXNlLmg+CisjaW5jbHVkZSA8RHJtQ29uc3RyYWludHMuaD4KKyNpbmNsdWRlIDxEcm1SaWdodHMuaD4KKyNpbmNsdWRlIDxEcm1JbmZvLmg+CisjaW5jbHVkZSA8RHJtSW5mb1N0YXR1cy5oPgorI2luY2x1ZGUgPERybUNvbnZlcnRlZFN0YXR1cy5oPgorI2luY2x1ZGUgPERybUluZm9SZXF1ZXN0Lmg+CisjaW5jbHVkZSA8RHJtU3VwcG9ydEluZm8uaD4KKyNpbmNsdWRlIDxEcm1JbmZvRXZlbnQuaD4KKworI2luY2x1ZGUgIlNlc3Npb25NYXAuaCIKKyNpbmNsdWRlICJGd2RMb2NrQ29udi5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qKgorICogRm9yd2FyZCBMb2NrIEVuZ2luZSBjbGFzcy4KKyAqLworY2xhc3MgRndkTG9ja0VuZ2luZSA6IHB1YmxpYyBhbmRyb2lkOjpEcm1FbmdpbmVCYXNlIHsKKworcHVibGljOgorICAgIEZ3ZExvY2tFbmdpbmUoKTsKKyAgICB2aXJ0dWFsIH5Gd2RMb2NrRW5naW5lKCk7CisKK3Byb3RlY3RlZDoKKy8qKgorICogR2V0IGNvbnN0cmFpbnQgaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIGlucHV0IGNvbnRlbnQuCisgKgorICogQHBhcmFtIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAqIEBwYXJhbSBwYXRoIFBhdGggb2YgdGhlIHByb3RlY3RlZCBjb250ZW50CisgKiBAcGFyYW0gYWN0aW9uIEFjdGlvbnMgZGVmaW5lZCBzdWNoIGFzLAorICogICAgIEFjdGlvbjo6REVGQVVMVCwgQWN0aW9uOjpQTEFZLCBldGMKKyAqIEByZXR1cm4gRHJtQ29uc3RyYWludHMKKyAqICAgICBrZXktdmFsdWUgcGFpcnMgb2YgY29uc3RyYWludCBhcmUgZW1iZWRkZWQgaW4gaXQKKyAqIEBub3RlCisgKiAgICAgSW4gY2FzZSBvZiBlcnJvciwgcmV0dXJuIE5VTEwKKyAqLworRHJtQ29uc3RyYWludHMqIG9uR2V0Q29uc3RyYWludHMoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4KiBwYXRoLCBpbnQgYWN0aW9uKTsKKworLyoqCisgKiBHZXQgbWV0YWRhdGEgaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIGlucHV0IGNvbnRlbnQuCisgKgorICogQHBhcmFtIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAqIEBwYXJhbSBwYXRoIFBhdGggb2YgdGhlIHByb3RlY3RlZCBjb250ZW50CisgKiBAcmV0dXJuIERybU1ldGFkYXRhCisgKiAgICAgIEZvciBGb3J3YXJkIExvY2sgZW5naW5lLCBpdCByZXR1cm5zIGFuIGVtcHR5IG9iamVjdAorICogQG5vdGUKKyAqICAgICBJbiBjYXNlIG9mIGVycm9yLCByZXR1cm5zIE5VTEwKKyAqLworRHJtTWV0YWRhdGEqIG9uR2V0TWV0YWRhdGEoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4KiBwYXRoKTsKKworLyoqCisgKiBJbml0aWFsaXplIHBsdWctaW4uCisgKgorICogQHBhcmFtIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAqIEByZXR1cm4gc3RhdHVzX3QKKyAqICAgICBSZXR1cm5zIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcywgRFJNX0VSUk9SX1VOS05PV04gZm9yIGZhaWx1cmUKKyAqLworc3RhdHVzX3Qgb25Jbml0aWFsaXplKGludCB1bmlxdWVJZCk7CisKKy8qKgorICogUmVnaXN0ZXIgYSBjYWxsYmFjayB0byBiZSBpbnZva2VkIHdoZW4gdGhlIGNhbGxlciByZXF1aXJlZCB0bworICogcmVjZWl2ZSBuZWNlc3NhcnkgaW5mb3JtYXRpb24uCisgKgorICogQHBhcmFtIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAqIEBwYXJhbSBpbmZvTGlzdGVuZXIgTGlzdGVuZXIKKyAqIEByZXR1cm4gc3RhdHVzX3QKKyAqICAgICBSZXR1cm5zIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcywgRFJNX0VSUk9SX1VOS05PV04gZm9yIGZhaWx1cmUKKyAqLworc3RhdHVzX3Qgb25TZXRPbkluZm9MaXN0ZW5lcihpbnQgdW5pcXVlSWQsIGNvbnN0IElEcm1FbmdpbmU6Ok9uSW5mb0xpc3RlbmVyKiBpbmZvTGlzdGVuZXIpOworCisvKioKKyAqIFRlcm1pbmF0ZSB0aGUgcGx1Zy1pbiBhbmQgcmVsZWFzZSByZXNvdXJjZXMgYm91bmQgdG8gaXQuCisgKgorICogQHBhcmFtIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAqIEByZXR1cm4gc3RhdHVzX3QKKyAqICAgICBSZXR1cm5zIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcywgRFJNX0VSUk9SX1VOS05PV04gZm9yIGZhaWx1cmUKKyAqLworc3RhdHVzX3Qgb25UZXJtaW5hdGUoaW50IHVuaXF1ZUlkKTsKKworLyoqCisgKiBHZXQgd2hldGhlciB0aGUgZ2l2ZW4gY29udGVudCBjYW4gYmUgaGFuZGxlZCBieSB0aGlzIHBsdWdpbiBvciBub3QuCisgKgorICogQHBhcmFtIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAqIEBwYXJhbSBwYXRoIFBhdGggdG8gdGhlIHByb3RlY3RlZCBvYmplY3QKKyAqIEByZXR1cm4gYm9vbAorICogICAgICBSZXR1cm5zIHRydWUgaWYgdGhpcyBwbHVnaW4gY2FuIGhhbmRsZSAsIGZhbHNlIGluIGNhc2Ugb2Ygbm90IGFibGUgdG8gaGFuZGxlCisgKi8KK2Jvb2wgb25DYW5IYW5kbGUoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoKTsKKworLyoqCisgKiBQcm9jZXNzZXMgdGhlIGdpdmVuIERSTSBpbmZvcm1hdGlvbiBhcyBhcHByb3ByaWF0ZSBmb3IgaXRzIHR5cGUuCisgKiBOb3QgdXNlZCBmb3IgRm9yd2FyZCBMb2NrIEVuZ2luZS4KKyAqCisgKiBAcGFyYW0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICogQHBhcmFtIGRybUluZm8gSW5mb3JtYXRpb24gdGhhdCBuZWVkcyB0byBiZSBwcm9jZXNzZWQKKyAqIEByZXR1cm4gRHJtSW5mb1N0YXR1cworICogICAgICBpbnN0YW5jZSBhcyBhIHJlc3VsdCBvZiBwcm9jZXNzaW5nIGdpdmVuIGlucHV0CisgKi8KK0RybUluZm9TdGF0dXMqIG9uUHJvY2Vzc0RybUluZm8oaW50IHVuaXF1ZUlkLCBjb25zdCBEcm1JbmZvKiBkcm1JbmZvKTsKKworLyoqCisgKiBTYXZlIERSTSByaWdodHMgdG8gc3BlY2lmaWVkIHJpZ2h0cyBwYXRoCisgKiBhbmQgbWFrZSBhc3NvY2lhdGlvbiB3aXRoIGNvbnRlbnQgcGF0aC4KKyAqCisgKiBAcGFyYW0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICogQHBhcmFtIGRybVJpZ2h0cyBEcm1SaWdodHMgdG8gYmUgc2F2ZWQKKyAqIEBwYXJhbSByaWdodHNQYXRoIEZpbGUgcGF0aCB3aGVyZSByaWdodHMgdG8gYmUgc2F2ZWQKKyAqIEBwYXJhbSBjb250ZW50UGF0aCBGaWxlIHBhdGggd2hlcmUgY29udGVudCB3YXMgc2F2ZWQKKyAqIEByZXR1cm4gc3RhdHVzX3QKKyAqICAgICBSZXR1cm5zIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcywgRFJNX0VSUk9SX1VOS05PV04gZm9yIGZhaWx1cmUKKyAqLworc3RhdHVzX3Qgb25TYXZlUmlnaHRzKGludCB1bmlxdWVJZCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEcm1SaWdodHMmIGRybVJpZ2h0cywKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiByaWdodHNQYXRoLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGNvbnRlbnRQYXRoKTsKKworLyoqCisgKiBSZXRyaWV2ZXMgbmVjZXNzYXJ5IGluZm9ybWF0aW9uIGZvciByZWdpc3RyYXRpb24sIHVucmVnaXN0cmF0aW9uIG9yIHJpZ2h0cworICogYWNxdWlzaXRpb24gaW5mb3JtYXRpb24uCisgKgorICogQHBhcmFtIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAqIEBwYXJhbSBkcm1JbmZvUmVxdWVzdCBSZXF1ZXN0IGluZm9ybWF0aW9uIHRvIHJldHJpZXZlIGRybUluZm8KKyAqIEByZXR1cm4gRHJtSW5mbworICogICAgICBpbnN0YW5jZSBhcyBhIHJlc3VsdCBvZiBwcm9jZXNzaW5nIGdpdmVuIGlucHV0CisgKi8KK0RybUluZm8qIG9uQWNxdWlyZURybUluZm8oaW50IHVuaXF1ZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEcm1JbmZvUmVxdWVzdCogZHJtSW5mb1JlcXVlc3QpOworCisvKioKKyAqIFJldHJpZXZlcyB0aGUgbWltZSB0eXBlIGVtYmVkZGVkIGluc2lkZSB0aGUgb3JpZ2luYWwgY29udGVudC4KKyAqCisgKiBAcGFyYW0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICogQHBhcmFtIHBhdGggUGF0aCBvZiB0aGUgcHJvdGVjdGVkIGNvbnRlbnQKKyAqIEByZXR1cm4gU3RyaW5nOAorICogICAgICAgUmV0dXJucyBtaW1lLXR5cGUgb2YgdGhlIG9yaWdpbmFsIGNvbnRlbnQsIHN1Y2ggYXMgInZpZGVvL21wZWciCisgKi8KK1N0cmluZzggb25HZXRPcmlnaW5hbE1pbWVUeXBlKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCk7CisKKy8qKgorICogUmV0cmlldmVzIHRoZSB0eXBlIG9mIHRoZSBwcm90ZWN0ZWQgb2JqZWN0IChjb250ZW50LCByaWdodHMsIGV0Yy4uKQorICogdXNpbmcgc3BlY2lmaWVkIHBhdGggb3IgbWltZXR5cGUuIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgc2hvdWxkIGJlIG5vbiBudWxsCisgKiB0byByZXRyaWV2ZSBEUk0gb2JqZWN0IHR5cGUuCisgKgorICogQHBhcmFtIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAqIEBwYXJhbSBwYXRoIFBhdGggb2YgdGhlIGNvbnRlbnQgb3IgbnVsbC4KKyAqIEBwYXJhbSBtaW1lVHlwZSBNaW1lIHR5cGUgb2YgdGhlIGNvbnRlbnQgb3IgbnVsbC4KKyAqIEByZXR1cm4gdHlwZSBvZiB0aGUgRFJNIGNvbnRlbnQsCisgKiAgICAgc3VjaCBhcyBEcm1PYmplY3RUeXBlOjpDT05URU5ULCBEcm1PYmplY3RUeXBlOjpSSUdIVFNfT0JKRUNUCisgKi8KK2ludCBvbkdldERybU9iamVjdFR5cGUoaW50IHVuaXF1ZUlkLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBtaW1lVHlwZSk7CisKKy8qKgorICogQ2hlY2sgd2hldGhlciB0aGUgZ2l2ZW4gY29udGVudCBoYXMgdmFsaWQgcmlnaHRzIG9yIG5vdC4KKyAqCisgKiBAcGFyYW0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICogQHBhcmFtIHBhdGggUGF0aCBvZiB0aGUgcHJvdGVjdGVkIGNvbnRlbnQKKyAqIEBwYXJhbSBhY3Rpb24gQWN0aW9uIHRvIHBlcmZvcm0gKEFjdGlvbjo6REVGQVVMVCwgQWN0aW9uOjpQTEFZLCBldGMpCisgKiBAcmV0dXJuIHRoZSBzdGF0dXMgb2YgdGhlIHJpZ2h0cyBmb3IgdGhlIHByb3RlY3RlZCBjb250ZW50LAorICogICAgIHN1Y2ggYXMgUmlnaHRzU3RhdHVzOjpSSUdIVFNfVkFMSUQsIFJpZ2h0c1N0YXR1czo6UklHSFRTX0VYUElSRUQsIGV0Yy4KKyAqLworaW50IG9uQ2hlY2tSaWdodHNTdGF0dXMoaW50IHVuaXF1ZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBhY3Rpb24pOworCisvKioKKyAqIENvbnN1bWVzIHRoZSByaWdodHMgZm9yIGEgY29udGVudC4KKyAqIElmIHRoZSByZXNlcnZlIHBhcmFtZXRlciBpcyB0cnVlIHRoZSByaWdodHMgYXJlIHJlc2VydmVkIHVudGlsIHRoZSBzYW1lCisgKiBhcHBsaWNhdGlvbiBjYWxscyB0aGlzIGFwaSBhZ2FpbiB3aXRoIHRoZSByZXNlcnZlIHBhcmFtZXRlciBzZXQgdG8gZmFsc2UuCisgKgorICogQHBhcmFtIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAqIEBwYXJhbSBkZWNyeXB0SGFuZGxlIEhhbmRsZSBmb3IgdGhlIGRlY3J5cHRpb24gc2Vzc2lvbgorICogQHBhcmFtIGFjdGlvbiBBY3Rpb24gdG8gcGVyZm9ybS4gKEFjdGlvbjo6REVGQVVMVCwgQWN0aW9uOjpQTEFZLCBldGMpCisgKiBAcGFyYW0gcmVzZXJ2ZSBUcnVlIGlmIHRoZSByaWdodHMgc2hvdWxkIGJlIHJlc2VydmVkLgorICogQHJldHVybiBzdGF0dXNfdAorICogICAgIFJldHVybnMgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzLCBEUk1fRVJST1JfVU5LTk9XTiBmb3IgZmFpbHVyZQorICovCitzdGF0dXNfdCBvbkNvbnN1bWVSaWdodHMoaW50IHVuaXF1ZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHJlc2VydmUpOworCisvKioKKyAqIEluZm9ybXMgdGhlIERSTSBFbmdpbmUgYWJvdXQgdGhlIHBsYXliYWNrIGFjdGlvbnMgcGVyZm9ybWVkIG9uIHRoZSBEUk0gZmlsZXMuCisgKgorICogQHBhcmFtIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAqIEBwYXJhbSBkZWNyeXB0SGFuZGxlIEhhbmRsZSBmb3IgdGhlIGRlY3J5cHRpb24gc2Vzc2lvbgorICogQHBhcmFtIHBsYXliYWNrU3RhdHVzIFBsYXliYWNrIGFjdGlvbiAoUGxheWJhY2s6OlNUQVJULCBQbGF5YmFjazo6U1RPUCwgUGxheWJhY2s6OlBBVVNFKQorICogQHBhcmFtIHBvc2l0aW9uIFBvc2l0aW9uIGluIHRoZSBmaWxlIChpbiBtaWxsaXNlY29uZHMpIHdoZXJlIHRoZSBzdGFydCBvY2N1cnMuCisgKiAgICAgT25seSB2YWxpZCB0b2dldGhlciB3aXRoIFBsYXliYWNrOjpTVEFSVC4KKyAqIEByZXR1cm4gc3RhdHVzX3QKKyAqICAgICBSZXR1cm5zIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcywgRFJNX0VSUk9SX1VOS05PV04gZm9yIGZhaWx1cmUKKyAqLworI2lmZGVmIFVTRV82NEJJVF9EUk1fQVBJCitzdGF0dXNfdCBvblNldFBsYXliYWNrU3RhdHVzKGludCB1bmlxdWVJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBsYXliYWNrU3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHBvc2l0aW9uKTsKKyNlbHNlCitzdGF0dXNfdCBvblNldFBsYXliYWNrU3RhdHVzKGludCB1bmlxdWVJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBsYXliYWNrU3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcG9zaXRpb24pOworI2VuZGlmCisKKy8qKgorICogIFZhbGlkYXRlcyB3aGV0aGVyIGFuIGFjdGlvbiBvbiB0aGUgRFJNIGNvbnRlbnQgaXMgYWxsb3dlZCBvciBub3QuCisgKgorICogQHBhcmFtIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAqIEBwYXJhbSBwYXRoIFBhdGggb2YgdGhlIHByb3RlY3RlZCBjb250ZW50CisgKiBAcGFyYW0gYWN0aW9uIEFjdGlvbiB0byB2YWxpZGF0ZSAoQWN0aW9uOjpQTEFZLCBBY3Rpb246OlRSQU5TRkVSLCBldGMpCisgKiBAcGFyYW0gZGVzY3JpcHRpb24gRGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgdGhlIGFjdGlvbgorICogQHJldHVybiB0cnVlIGlmIHRoZSBhY3Rpb24gaXMgYWxsb3dlZC4KKyAqLworYm9vbCBvblZhbGlkYXRlQWN0aW9uKGludCB1bmlxdWVJZCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBwYXRoLAorICAgICAgICAgICAgICAgICAgICAgIGludCBhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWN0aW9uRGVzY3JpcHRpb24mIGRlc2NyaXB0aW9uKTsKKworLyoqCisgKiBSZW1vdmVzIHRoZSByaWdodHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBwcm90ZWN0ZWQgY29udGVudC4KKyAqIE5vdCB1c2VkIGZvciBGb3J3YXJkIExvY2sgRW5naW5lLgorICoKKyAqIEBwYXJhbSB1bmlxdWVJZCBVbmlxdWUgaWRlbnRpZmllciBmb3IgYSBzZXNzaW9uCisgKiBAcGFyYW0gcGF0aCBQYXRoIG9mIHRoZSBwcm90ZWN0ZWQgY29udGVudAorICogQHJldHVybiBzdGF0dXNfdAorICogICAgIFJldHVybnMgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzLCBEUk1fRVJST1JfVU5LTk9XTiBmb3IgZmFpbHVyZQorICovCitzdGF0dXNfdCBvblJlbW92ZVJpZ2h0cyhpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgpOworCisvKioKKyAqIFJlbW92ZXMgYWxsIHRoZSByaWdodHMgaW5mb3JtYXRpb24gb2YgZWFjaCBwbHVnLWluIGFzc29jaWF0ZWQgd2l0aAorICogRFJNIGZyYW1ld29yay4gV2lsbCBiZSB1c2VkIGluIG1hc3RlciByZXNldCBidXQgZG9lcyBub3RoaW5nIGZvcgorICogRm9yd2FyZCBMb2NrIEVuZ2luZS4KKyAqCisgKiBAcGFyYW0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICogQHJldHVybiBzdGF0dXNfdAorICogICAgIFJldHVybnMgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzLCBEUk1fRVJST1JfVU5LTk9XTiBmb3IgZmFpbHVyZQorICovCitzdGF0dXNfdCBvblJlbW92ZUFsbFJpZ2h0cyhpbnQgdW5pcXVlSWQpOworCisvKioKKyAqIFN0YXJ0cyB0aGUgRm9yd2FyZCBMb2NrIGZpbGUgY29udmVyc2lvbiBzZXNzaW9uLgorICogRWFjaCB0aW1lIHRoZSBhcHBsaWNhdGlvbiB0cmllcyB0byBkb3dubG9hZCBhIG5ldyBEUk0gZmlsZQorICogd2hpY2ggbmVlZHMgdG8gYmUgY29udmVydGVkLCB0aGVuIHRoZSBhcHBsaWNhdGlvbiBoYXMgdG8KKyAqIGJlZ2luIHdpdGggY2FsbGluZyB0aGlzIEFQSS4gVGhlIGNvbnZlcnRJZCBpcyB1c2VkIGFzIHRoZSBjb252ZXJzaW9uIHNlc3Npb24ga2V5CisgKiBhbmQgbXVzdCBub3QgYmUgdGhlIHNhbWUgZm9yIGRpZmZlcmVudCBjb252ZXJ0IHNlc3Npb25zLgorICoKKyAqIEBwYXJhbSB1bmlxdWVJZCBVbmlxdWUgaWRlbnRpZmllciBmb3IgYSBzZXNzaW9uCisgKiBAcGFyYW0gY29udmVydElkIEhhbmRsZSBmb3IgdGhlIGNvbnZlcnQgc2Vzc2lvbgorICogQHJldHVybiBzdGF0dXNfdAorICogICAgIFJldHVybnMgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzLCBEUk1fRVJST1JfVU5LTk9XTiBmb3IgZmFpbHVyZQorICovCitzdGF0dXNfdCBvbk9wZW5Db252ZXJ0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIGludCBjb252ZXJ0SWQpOworCisvKioKKyAqIEFjY2VwdHMgYW5kIGNvbnZlcnRzIHRoZSBpbnB1dCBkYXRhIHdoaWNoIGlzIHBhcnQgb2YgRFJNIGZpbGUuCisgKiBUaGUgcmVzdWx0YW50IGNvbnZlcnRlZCBkYXRhIGFuZCB0aGUgc3RhdHVzIGlzIHJldHVybmVkIGluIHRoZSBEcm1Db252ZXJ0ZWRJbmZvCisgKiBvYmplY3QuIFRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIGVhY2ggdGltZSB0aGVyZSBpcyBhIG5ldyBibG9jaworICogb2YgZGF0YSByZWNlaXZlZCBieSB0aGUgYXBwbGljYXRpb24uCisgKgorICogQHBhcmFtIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAqIEBwYXJhbSBjb252ZXJ0SWQgSGFuZGxlIGZvciB0aGUgY29udmVydCBzZXNzaW9uCisgKiBAcGFyYW0gaW5wdXREYXRhIElucHV0IERhdGEgd2hpY2ggbmVlZCB0byBiZSBjb252ZXJ0ZWQKKyAqIEByZXR1cm4gUmV0dXJuIG9iamVjdCBjb250YWlucyB0aGUgc3RhdHVzIG9mIHRoZSBkYXRhIGNvbnZlcnNpb24sCisgKiAgICAgICB0aGUgb3V0cHV0IGNvbnZlcnRlZCBkYXRhIGFuZCBvZmZzZXQuIEluIHRoaXMgY2FzZSB0aGUKKyAqICAgICAgYXBwbGljYXRpb24gd2lsbCBpZ25vcmUgdGhlIG9mZnNldCBpbmZvcm1hdGlvbi4KKyAqLworRHJtQ29udmVydGVkU3RhdHVzKiBvbkNvbnZlcnREYXRhKGludCB1bmlxdWVJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29udmVydElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERybUJ1ZmZlciogaW5wdXREYXRhKTsKKworLyoqCisgKiBDbG9zZXMgdGhlIGNvbnZlcnQgc2Vzc2lvbiBpbiBjYXNlIG9mIGRhdGEgc3VwcGx5IGNvbXBsZXRlZCBvciBlcnJvciBvY2N1cnJlZC4KKyAqIFVwb24gc3VjY2Vzc2Z1bCBjb252ZXJzaW9uIG9mIHRoZSBjb21wbGV0ZSBkYXRhLCBpdCByZXR1cm5zIHNpZ25hdHVyZSBjYWxjdWxhdGVkIG92ZXIKKyAqIHRoZSBlbnRpcmUgZGF0YSB1c2VkIG92ZXIgYSBjb252ZXJzaW9uIHNlc3Npb24uIFRoaXMgc2lnbmF0dXJlIG11c3QgYmUgY29waWVkIHRvIHRoZSBvZmZzZXQKKyAqIG1lbnRpb25lZCBpbiB0aGUgRHJtQ29udmVydGVkU3RhdHVzLiBTaWduYXR1cmUgaXMgdXNlZCBmb3IgZGF0YSBpbnRlZ3JpdHkgcHJvdGVjdGlvbi4KKyAqCisgKiBAcGFyYW0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICogQHBhcmFtIGNvbnZlcnRJZCBIYW5kbGUgZm9yIHRoZSBjb252ZXJ0IHNlc3Npb24KKyAqIEByZXR1cm4gUmV0dXJuIG9iamVjdCBjb250YWlucyB0aGUgc3RhdHVzIG9mIHRoZSBkYXRhIGNvbnZlcnNpb24sCisgKiAgICAgIHRoZSBoZWFkZXIgYW5kIGJvZHkgc2lnbmF0dXJlIGRhdGEuIEl0IGFsc28gaW5mb3JtcworICogICAgICB0aGUgYXBwbGljYXRpb24gYWJvdXQgdGhlIGZpbGUgb2Zmc2V0IGF0IHdoaWNoIHRoaXMKKyAqICAgICAgc2lnbmF0dXJlIGRhdGEgc2hvdWxkIGJlIHdyaXR0ZW4uCisgKi8KK0RybUNvbnZlcnRlZFN0YXR1cyogb25DbG9zZUNvbnZlcnRTZXNzaW9uKGludCB1bmlxdWVJZCwgaW50IGNvbnZlcnRJZCk7CisKKy8qKgorICogUmV0dXJucyB0aGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIERybSBFbmdpbmUgY2FwYWJpbGl0aWVzIHdoaWNoIGluY2x1ZGVzCisgKiBzdXBwb3J0ZWQgTWltZVR5cGVzIGFuZCBmaWxlIHN1ZmZpeGVzLgorICoKKyAqIEBwYXJhbSB1bmlxdWVJZCBVbmlxdWUgaWRlbnRpZmllciBmb3IgYSBzZXNzaW9uCisgKiBAcmV0dXJuIERybVN1cHBvcnRJbmZvCisgKiAgICAgIGluc3RhbmNlIHdoaWNoIGhvbGRzIHRoZSBjYXBhYmlsaXRpZXMgb2YgYSBwbHVnLWluCisgKi8KK0RybVN1cHBvcnRJbmZvKiBvbkdldFN1cHBvcnRJbmZvKGludCB1bmlxdWVJZCk7CisKKy8qKgorICogT3BlbiB0aGUgZGVjcnlwdCBzZXNzaW9uIHRvIGRlY3J5cHQgdGhlIGdpdmVuIHByb3RlY3RlZCBjb250ZW50LgorICoKKyAqIEBwYXJhbSB1bmlxdWVJZCBVbmlxdWUgaWRlbnRpZmllciBmb3IgYSBzZXNzaW9uCisgKiBAcGFyYW0gZGVjcnlwdEhhbmRsZSBIYW5kbGUgZm9yIHRoZSBjdXJyZW50IGRlY3J5cHRpb24gc2Vzc2lvbgorICogQHBhcmFtIGZkIEZpbGUgZGVzY3JpcHRvciBvZiB0aGUgcHJvdGVjdGVkIGNvbnRlbnQgdG8gYmUgZGVjcnlwdGVkCisgKiBAcGFyYW0gb2Zmc2V0IFN0YXJ0IHBvc2l0aW9uIG9mIHRoZSBjb250ZW50CisgKiBAcGFyYW0gbGVuZ3RoIFRoZSBsZW5ndGggb2YgdGhlIHByb3RlY3RlZCBjb250ZW50CisgKiBAcmV0dXJuCisgKiAgICAgRFJNX0VSUk9SX0NBTk5PVF9IQU5ETEUgZm9yIGZhaWx1cmUgYW5kIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcworICovCisjaWZkZWYgVVNFXzY0QklUX0RSTV9BUEkKK3N0YXR1c190IG9uT3BlbkRlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmQsIG9mZjY0X3Qgb2Zmc2V0LCBvZmY2NF90IGxlbmd0aCk7CisjZWxzZQorc3RhdHVzX3Qgb25PcGVuRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmZCwgaW50IG9mZnNldCwgaW50IGxlbmd0aCk7CisjZW5kaWYKKworLyoqCisgKiBPcGVuIHRoZSBkZWNyeXB0IHNlc3Npb24gdG8gZGVjcnlwdCB0aGUgZ2l2ZW4gcHJvdGVjdGVkIGNvbnRlbnQuCisgKgorICogQHBhcmFtIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAqIEBwYXJhbSBkZWNyeXB0SGFuZGxlIEhhbmRsZSBmb3IgdGhlIGN1cnJlbnQgZGVjcnlwdGlvbiBzZXNzaW9uCisgKiBAcGFyYW0gdXJpIFBhdGggb2YgdGhlIHByb3RlY3RlZCBjb250ZW50IHRvIGJlIGRlY3J5cHRlZAorICogQHJldHVybgorICogICAgIERSTV9FUlJPUl9DQU5OT1RfSEFORExFIGZvciBmYWlsdXJlIGFuZCBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MKKyAqLworc3RhdHVzX3Qgb25PcGVuRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHVyaSk7CisKKy8qKgorICogQ2xvc2UgdGhlIGRlY3J5cHQgc2Vzc2lvbiBmb3IgdGhlIGdpdmVuIGhhbmRsZS4KKyAqCisgKiBAcGFyYW0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICogQHBhcmFtIGRlY3J5cHRIYW5kbGUgSGFuZGxlIGZvciB0aGUgZGVjcnlwdGlvbiBzZXNzaW9uCisgKiBAcmV0dXJuIHN0YXR1c190CisgKiAgICAgUmV0dXJucyBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MsIERSTV9FUlJPUl9VTktOT1dOIGZvciBmYWlsdXJlCisgKi8KK3N0YXR1c190IG9uQ2xvc2VEZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSk7CisKKy8qKgorICogSW5pdGlhbGl6ZSBkZWNyeXB0aW9uIGZvciB0aGUgZ2l2ZW4gdW5pdCBvZiB0aGUgcHJvdGVjdGVkIGNvbnRlbnQuCisgKgorICogQHBhcmFtIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAqIEBwYXJhbSBkZWNyeXB0SGFuZGxlIEhhbmRsZSBmb3IgdGhlIGRlY3J5cHRpb24gc2Vzc2lvbgorICogQHBhcmFtIGRlY3J5cHRVbml0SWQgSUQgd2hpY2ggc3BlY2lmaWVzIGRlY3J5cHRpb24gdW5pdCwgc3VjaCBhcyB0cmFjayBJRAorICogQHBhcmFtIGhlYWRlckluZm8gSW5mb3JtYXRpb24gZm9yIGluaXRpYWxpemluZyBkZWNyeXB0aW9uIG9mIHRoaXMgZGVjcnlwVW5pdAorICogQHJldHVybgorICogICAgIERSTV9FUlJPUl9DQU5OT1RfSEFORExFIGZvciBmYWlsdXJlIGFuZCBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MKKyAqLworc3RhdHVzX3Qgb25Jbml0aWFsaXplRGVjcnlwdFVuaXQoaW50IHVuaXF1ZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWNyeXB0VW5pdElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRHJtQnVmZmVyKiBoZWFkZXJJbmZvKTsKKworLyoqCisgKiBEZWNyeXB0IHRoZSBwcm90ZWN0ZWQgY29udGVudCBidWZmZXJzIGZvciB0aGUgZ2l2ZW4gdW5pdC4KKyAqIFRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIGFueSBudW1iZXIgb2YgdGltZXMsIGJhc2VkIG9uIG51bWJlciBvZgorICogZW5jcnlwdGVkIHN0cmVhbXMgcmVjZWl2ZWQgZnJvbSBhcHBsaWNhdGlvbi4KKyAqCisgKiBAcGFyYW0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICogQHBhcmFtIGRlY3J5cHRIYW5kbGUgSGFuZGxlIGZvciB0aGUgZGVjcnlwdGlvbiBzZXNzaW9uCisgKiBAcGFyYW0gZGVjcnlwdFVuaXRJZCBJRCB3aGljaCBzcGVjaWZpZXMgZGVjcnlwdGlvbiB1bml0LCBzdWNoIGFzIHRyYWNrIElECisgKiBAcGFyYW0gZW5jQnVmZmVyIEVuY3J5cHRlZCBkYXRhIGJsb2NrCisgKiBAcGFyYW0gZGVjQnVmZmVyIERlY3J5cHRlZCBkYXRhIGJsb2NrCisgKiBAcmV0dXJuIHN0YXR1c190CisgKiAgICAgUmV0dXJucyB0aGUgZXJyb3IgY29kZSBmb3IgdGhpcyBBUEkKKyAqICAgICBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MsIGFuZCBvbmUgb2YgRFJNX0VSUk9SX1VOS05PV04sIERSTV9FUlJPUl9MSUNFTlNFX0VYUElSRUQKKyAqICAgICBEUk1fRVJST1JfU0VTU0lPTl9OT1RfT1BFTkVELCBEUk1fRVJST1JfREVDUllQVF9VTklUX05PVF9JTklUSUFMSVpFRCwKKyAqICAgICBEUk1fRVJST1JfREVDUllQVCBmb3IgZmFpbHVyZS4KKyAqLworc3RhdHVzX3Qgb25EZWNyeXB0KGludCB1bmlxdWVJZCwKKyAgICAgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgICAgIGludCBkZWNyeXB0VW5pdElkLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IERybUJ1ZmZlciogZW5jQnVmZmVyLAorICAgICAgICAgICAgICAgICAgIERybUJ1ZmZlcioqIGRlY0J1ZmZlcik7CisKKy8qKgorICogRGVjcnlwdCB0aGUgcHJvdGVjdGVkIGNvbnRlbnQgYnVmZmVycyBmb3IgdGhlIGdpdmVuIHVuaXQuCisgKiBUaGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCBhbnkgbnVtYmVyIG9mIHRpbWVzLCBiYXNlZCBvbiBudW1iZXIgb2YKKyAqIGVuY3J5cHRlZCBzdHJlYW1zIHJlY2VpdmVkIGZyb20gYXBwbGljYXRpb24uCisgKgorICogQHBhcmFtIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAqIEBwYXJhbSBkZWNyeXB0SWQgSGFuZGxlIGZvciB0aGUgZGVjcnlwdGlvbiBzZXNzaW9uCisgKiBAcGFyYW0gZGVjcnlwdFVuaXRJZCBJRCBTcGVjaWZpZXMgZGVjcnlwdGlvbiB1bml0LCBzdWNoIGFzIHRyYWNrIElECisgKiBAcGFyYW0gZW5jQnVmZmVyIEVuY3J5cHRlZCBkYXRhIGJsb2NrCisgKiBAcGFyYW0gZGVjQnVmZmVyIERlY3J5cHRlZCBkYXRhIGJsb2NrCisgKiBAcGFyYW0gSVYgT3B0aW9uYWwgYnVmZmVyCisgKiBAcmV0dXJuIHN0YXR1c190CisgKiAgICAgUmV0dXJucyB0aGUgZXJyb3IgY29kZSBmb3IgdGhpcyBBUEkKKyAqICAgICBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MsIGFuZCBvbmUgb2YgRFJNX0VSUk9SX1VOS05PV04sIERSTV9FUlJPUl9MSUNFTlNFX0VYUElSRUQKKyAqICAgICBEUk1fRVJST1JfU0VTU0lPTl9OT1RfT1BFTkVELCBEUk1fRVJST1JfREVDUllQVF9VTklUX05PVF9JTklUSUFMSVpFRCwKKyAqICAgICBEUk1fRVJST1JfREVDUllQVCBmb3IgZmFpbHVyZS4KKyAqLworc3RhdHVzX3Qgb25EZWNyeXB0KGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICBpbnQgZGVjcnlwdFVuaXRJZCwgY29uc3QgRHJtQnVmZmVyKiBlbmNCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgRHJtQnVmZmVyKiogZGVjQnVmZmVyLCBEcm1CdWZmZXIqIElWKTsKKworLyoqCisgKiBGaW5hbGl6ZSBkZWNyeXB0aW9uIGZvciB0aGUgZ2l2ZW4gdW5pdCBvZiB0aGUgcHJvdGVjdGVkIGNvbnRlbnQuCisgKgorICogQHBhcmFtIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAqIEBwYXJhbSBkZWNyeXB0SGFuZGxlIEhhbmRsZSBmb3IgdGhlIGRlY3J5cHRpb24gc2Vzc2lvbgorICogQHBhcmFtIGRlY3J5cHRVbml0SWQgSUQgU3BlY2lmaWVzIGRlY3J5cHRpb24gdW5pdCwgc3VjaCBhcyB0cmFjayBJRAorICogQHJldHVybgorICogICAgIERSTV9FUlJPUl9DQU5OT1RfSEFORExFIGZvciBmYWlsdXJlIGFuZCBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MKKyAqLworc3RhdHVzX3Qgb25GaW5hbGl6ZURlY3J5cHRVbml0KGludCB1bmlxdWVJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWNyeXB0VW5pdElkKTsKKworLyoqCisgKiBSZWFkcyB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBieXRlcyBmcm9tIGFuIG9wZW4gRFJNIGZpbGUuCisgKgorICogQHBhcmFtIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAqIEBwYXJhbSBkZWNyeXB0SGFuZGxlIEhhbmRsZSBmb3IgdGhlIGRlY3J5cHRpb24gc2Vzc2lvbgorICogQHBhcmFtIGJ1ZmZlciBSZWZlcmVuY2UgdG8gdGhlIGJ1ZmZlciB0aGF0IHNob3VsZCByZWNlaXZlIHRoZSByZWFkIGRhdGEuCisgKiBAcGFyYW0gbnVtQnl0ZXMgTnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQuCisgKgorICogQHJldHVybiBOdW1iZXIgb2YgYnl0ZXMgcmVhZC4KKyAqIEByZXR2YWwgLTEgRmFpbHVyZS4KKyAqLworc3NpemVfdCBvblJlYWQoaW50IHVuaXF1ZUlkLAorICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgIHZvaWQqIHBCdWZmZXIsCisgICAgICAgICAgICAgICBpbnQgbnVtQnl0ZXMpOworCisvKioKKyAqIFVwZGF0ZXMgdGhlIGZpbGUgcG9zaXRpb24gd2l0aGluIGFuIG9wZW4gRFJNIGZpbGUuCisgKgorICogQHBhcmFtIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAqIEBwYXJhbSBkZWNyeXB0SGFuZGxlIEhhbmRsZSBmb3IgdGhlIGRlY3J5cHRpb24gc2Vzc2lvbgorICogQHBhcmFtIG9mZnNldCBPZmZzZXQgd2l0aCB3aGljaCB0byB1cGRhdGUgdGhlIGZpbGUgcG9zaXRpb24uCisgKiBAcGFyYW0gd2hlbmNlIE9uZSBvZiBTRUVLX1NFVCwgU0VFS19DVVIsIGFuZCBTRUVLX0VORC4KKyAqICAgICAgICAgICBUaGVzZSBjb25zdGFudHMgYXJlIGRlZmluZWQgaW4gdW5pc3RkLmguCisgKgorICogQHJldHVybiBOZXcgZmlsZSBwb3NpdGlvbi4KKyAqIEByZXR2YWwgKChvZmZfdCktMSkgRmFpbHVyZS4KKyAqLworI2lmZGVmIFVTRV82NEJJVF9EUk1fQVBJCitvZmY2NF90IG9uTHNlZWsoaW50IHVuaXF1ZUlkLAorICAgICAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICAgICAgb2ZmNjRfdCBvZmZzZXQsCisgICAgICAgICAgICAgICAgaW50IHdoZW5jZSk7CisjZWxzZQorb2ZmX3Qgb25Mc2VlayhpbnQgdW5pcXVlSWQsCisgICAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICAgIG9mZl90IG9mZnNldCwKKyAgICAgICAgICAgICAgaW50IHdoZW5jZSk7CisjZW5kaWYKKworLyoqCisgKiBSZWFkcyB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBieXRlcyBmcm9tIGFuIG9wZW4gRFJNIGZpbGUuCisgKgorICogQHBhcmFtIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAqIEBwYXJhbSBkZWNyeXB0SGFuZGxlIEhhbmRsZSBmb3IgdGhlIGRlY3J5cHRpb24gc2Vzc2lvbgorICogQHBhcmFtIGJ1ZmZlciBSZWZlcmVuY2UgdG8gdGhlIGJ1ZmZlciB0aGF0IHNob3VsZCByZWNlaXZlIHRoZSByZWFkIGRhdGEuCisgKiBAcGFyYW0gbnVtQnl0ZXMgTnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQuCisgKiBAcGFyYW0gb2Zmc2V0IE9mZnNldCB3aXRoIHdoaWNoIHRvIHVwZGF0ZSB0aGUgZmlsZSBwb3NpdGlvbi4KKyAqCisgKiBAcmV0dXJuIE51bWJlciBvZiBieXRlcyByZWFkLiBSZXR1cm5zIC0xIGZvciBGYWlsdXJlLgorICovCisjaWZkZWYgVVNFXzY0QklUX0RSTV9BUEkKK3NzaXplX3Qgb25QcmVhZChpbnQgdW5pcXVlSWQsCisgICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICB2b2lkKiBidWZmZXIsCisgICAgICAgICAgICAgICAgc3NpemVfdCBudW1CeXRlcywKKyAgICAgICAgICAgICAgICBvZmY2NF90IG9mZnNldCk7CisjZWxzZQorc3NpemVfdCBvblByZWFkKGludCB1bmlxdWVJZCwKKyAgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICBzc2l6ZV90IG51bUJ5dGVzLAorICAgICAgICAgICAgICAgIG9mZl90IG9mZnNldCk7CisjZW5kaWYKKworcHJpdmF0ZToKKworLyoqCisgKiBTZXNzaW9uIENsYXNzIGZvciBGb3J3YXJkIExvY2sgQ29udmVyc2lvbi4gQW4gb2JqZWN0IG9mIHRoaXMgY2xhc3MgaXMgY3JlYXRlZAorICogZm9yIGV2ZXJ5IGNvbnZlcnNpb24uCisgKi8KK2NsYXNzIENvbnZlcnRTZXNzaW9uIHsKKyAgICBwdWJsaWMgOgorICAgICAgICBpbnQgdW5pcXVlSWQ7CisgICAgICAgIEZ3ZExvY2tDb252X091dHB1dF90IG91dHB1dDsKKworICAgICAgICBDb252ZXJ0U2Vzc2lvbigpIHsKKyAgICAgICAgICAgIHVuaXF1ZUlkID0gMDsKKyAgICAgICAgICAgIG1lbXNldCgmb3V0cHV0LCAwLCBzaXplb2YoRndkTG9ja0NvbnZfT3V0cHV0X3QpKTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgfkNvbnZlcnRTZXNzaW9uKCkge30KK307CisKKy8qKgorICogU2Vzc2lvbiBDbGFzcyBmb3IgRm9yd2FyZCBMb2NrIGRlY29kZXIuIEFuIG9iamVjdCBvZiB0aGlzIGNsYXNzIGlzIGNyZWF0ZWQKKyAqIGZvciBldmVyeSBkZWNvZGluZyBzZXNzaW9uLgorICovCitjbGFzcyBEZWNvZGVTZXNzaW9uIHsKKyAgICBwdWJsaWMgOgorICAgICAgICBpbnQgZmlsZURlc2M7CisgICAgICAgIG9mZl90IG9mZnNldDsKKworICAgICAgICBEZWNvZGVTZXNzaW9uKCkgeworICAgICAgICAgICAgZmlsZURlc2MgPSAtMTsKKyAgICAgICAgICAgIG9mZnNldCA9IDA7CisgICAgICAgIH0KKworICAgICAgICBEZWNvZGVTZXNzaW9uKGludCBmZCkgeworICAgICAgICAgICAgZmlsZURlc2MgPSBmZDsKKyAgICAgICAgICAgIG9mZnNldCA9IDA7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIH5EZWNvZGVTZXNzaW9uKCkge30KK307CisKKy8qKgorICogU2Vzc2lvbiBNYXAgVGFibGVzIGZvciBDb252ZXJzaW9uIGFuZCBEZWNvZGluZyBvZiBmb3J3YXJkIGxvY2sgZmlsZXMuCisgKi8KK1Nlc3Npb25NYXA8Q29udmVydFNlc3Npb24qPiBjb252ZXJ0U2Vzc2lvbk1hcDsKK1Nlc3Npb25NYXA8RGVjb2RlU2Vzc2lvbio+IGRlY29kZVNlc3Npb25NYXA7CisKKy8qKgorICogQ29udmVydHMgdGhlIGVycm9yIGNvZGUgZnJvbSBGb3J3YXJkIExvY2sgQ29udmVydGVyIHRvIERybUNvbnZlcnRTdGF0dXMgZXJyb3IgY29kZS4KKyAqCisgKiBAcGFyYW0gRm9yd2FyZCBMb2NrIENvbnZlcnRlciBlcnJvciBjb2RlCisgKgorICogQHJldHVybiBTdGF0dXMgY29kZSBmcm9tIERybUNvbnZlcnRTdGF0dXMuCisgKi8KK3N0YXRpYyBpbnQgZ2V0Q29udmVydGVkU3RhdHVzKEZ3ZExvY2tDb252X1N0YXR1c190IHN0YXR1cyk7Cit9OworCit9OworCisjZW5kaWYgLyogX19GV0RMT0NLRU5HSU5FX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9Gd2RMb2NrRW5naW5lL2luY2x1ZGUvRndkTG9ja0VuZ2luZUNvbnN0LmggYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL0Z3ZExvY2tFbmdpbmUvaW5jbHVkZS9Gd2RMb2NrRW5naW5lQ29uc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTk1ZDYwCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9Gd2RMb2NrRW5naW5lL2luY2x1ZGUvRndkTG9ja0VuZ2luZUNvbnN0LmgKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX19GV0RMT0NLRU5HSU5FQ09OU1RfSF9fCisjZGVmaW5lIF9fRldETE9DS0VOR0lORUNPTlNUX0hfXworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qKgorICogQ29uc3RhbnRzIGZvciBmb3J3YXJkIExvY2sgRW5naW5lIHVzZWQgZm9yIGV4cG9zaW5nIGVuZ2luZSdzIGNhcGFiaWxpdGllcy4KKyAqLworI2RlZmluZSBGV0RMT0NLX0VYVEVOU0lPTl9GTCAgICAgICAgICAgKCJGTCIpCisjZGVmaW5lIEZXRExPQ0tfRE9URVhURU5TSU9OX0ZMICAgICAgICAoIi5mbCIpCisjZGVmaW5lIEZXRExPQ0tfTUlNRVRZUEVfRkwgICAgICAgICAgICAoImFwcGxpY2F0aW9uL3gtYW5kcm9pZC1kcm0tZmwiKQorCisjZGVmaW5lIEZXRExPQ0tfRVhURU5TSU9OX0RNICAgICAgICAgICAoIkRNIikKKyNkZWZpbmUgRldETE9DS19ET1RFWFRFTlNJT05fRE0gICAgICAgICgiLmRtIikKKyNkZWZpbmUgRldETE9DS19NSU1FVFlQRV9ETSAgICAgICAgICAgICgiYXBwbGljYXRpb24vdm5kLm9tYS5kcm0ubWVzc2FnZSIpCisKKyNkZWZpbmUgRldETE9DS19ERVNDUklQVElPTiAgICAgICAgICAgICgiT01BIFYxIEZvcndhcmQgTG9jayIpCisKK307CisKKyNlbmRpZiAvKiBfX0ZXRExPQ0tFTkdJTkVDT05TVF9IX18gKi8KZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svRndkTG9ja0VuZ2luZS9zcmMvRndkTG9ja0VuZ2luZS5jcHAgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL0Z3ZExvY2tFbmdpbmUvc3JjL0Z3ZExvY2tFbmdpbmUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0MzBmNzIKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL0Z3ZExvY2tFbmdpbmUvc3JjL0Z3ZExvY2tFbmdpbmUuY3BwCkBAIC0wLDAgKzEsNjI4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIlNlc3Npb25NYXAuaCIKKyNpbmNsdWRlICJGd2RMb2NrRW5naW5lLmgiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgImRybV9mcmFtZXdvcmtfY29tbW9uLmgiCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxEcm1SaWdodHMuaD4KKyNpbmNsdWRlIDxEcm1Db25zdHJhaW50cy5oPgorI2luY2x1ZGUgPERybU1ldGFkYXRhLmg+CisjaW5jbHVkZSA8RHJtSW5mby5oPgorI2luY2x1ZGUgPERybUluZm9TdGF0dXMuaD4KKyNpbmNsdWRlIDxEcm1JbmZvUmVxdWVzdC5oPgorI2luY2x1ZGUgPERybVN1cHBvcnRJbmZvLmg+CisjaW5jbHVkZSA8RHJtQ29udmVydGVkU3RhdHVzLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorI2luY2x1ZGUgIkZ3ZExvY2tDb252LmgiCisjaW5jbHVkZSAiRndkTG9ja0ZpbGUuaCIKKyNpbmNsdWRlICJGd2RMb2NrR2x1ZS5oIgorI2luY2x1ZGUgIkZ3ZExvY2tFbmdpbmVDb25zdC5oIgorI2luY2x1ZGUgIk1pbWVUeXBlVXRpbC5oIgorCisjdW5kZWYgTE9HX1RBRworI2RlZmluZSBMT0dfVEFHICJGd2RMb2NrRW5naW5lIgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKy8vIFRoaXMgZXh0ZXJuICJDIiBpcyBtYW5kYXRvcnkgdG8gYmUgbWFuYWdlZCBieSBUUGx1Z0luTWFuYWdlcgorZXh0ZXJuICJDIiBJRHJtRW5naW5lKiBjcmVhdGUoKSB7CisgICAgcmV0dXJuIG5ldyBGd2RMb2NrRW5naW5lKCk7Cit9CisKKy8vIFRoaXMgZXh0ZXJuICJDIiBpcyBtYW5kYXRvcnkgdG8gYmUgbWFuYWdlZCBieSBUUGx1Z0luTWFuYWdlcgorZXh0ZXJuICJDIiB2b2lkIGRlc3Ryb3koSURybUVuZ2luZSogcGx1Z0luKSB7CisgICAgZGVsZXRlIHBsdWdJbjsKK30KKworRndkTG9ja0VuZ2luZTo6RndkTG9ja0VuZ2luZSgpIHsKKyAgICBMT0dEKCJGd2RMb2NrRW5naW5lIENvbnN0cnVjdGlvbiIpOworfQorCitGd2RMb2NrRW5naW5lOjp+RndkTG9ja0VuZ2luZSgpIHsKKyAgICBMT0dEKCJGd2RMb2NrRW5naW5lIERlc3RydWN0aW9uIik7CisKKyAgICBjb252ZXJ0U2Vzc2lvbk1hcC5kZXN0cm95TWFwKCk7CisgICAgZGVjb2RlU2Vzc2lvbk1hcC5kZXN0cm95TWFwKCk7Cit9CisKK2ludCBGd2RMb2NrRW5naW5lOjpnZXRDb252ZXJ0ZWRTdGF0dXMoRndkTG9ja0NvbnZfU3RhdHVzX3Qgc3RhdHVzKSB7CisgICAgaW50IHJldFN0YXR1cyA9IERybUNvbnZlcnRlZFN0YXR1czo6U1RBVFVTX0VSUk9SOworCisgICAgc3dpdGNoKHN0YXR1cykgeworICAgICAgICBjYXNlIEZ3ZExvY2tDb252X1N0YXR1c19PSzoKKyAgICAgICAgICAgIHJldFN0YXR1cyA9IERybUNvbnZlcnRlZFN0YXR1czo6U1RBVFVTX09LOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRndkTG9ja0NvbnZfU3RhdHVzX1N5bnRheEVycm9yOgorICAgICAgICBjYXNlIEZ3ZExvY2tDb252X1N0YXR1c19JbnZhbGlkQXJndW1lbnQ6CisgICAgICAgIGNhc2UgRndkTG9ja0NvbnZfU3RhdHVzX1Vuc3VwcG9ydGVkRmlsZUZvcm1hdDoKKyAgICAgICAgY2FzZSBGd2RMb2NrQ29udl9TdGF0dXNfVW5zdXBwb3J0ZWRDb250ZW50VHJhbnNmZXJFbmNvZGluZzoKKyAgICAgICAgICAgIExPR0QoIkZ3ZExvY2tFbmdpbmUgZ2V0Q29udmVydGVkU3RhdHVzOiBmaWxlIGNvbnZlcnNpb24gRXJyb3IgJWQuICIgXAorICAgICAgICAgICAgICAgICAgIlJldHVybmluZyBTVEFUVVNfSU5QVVREQVRBX0VSUk9SIiwgc3RhdHVzKTsKKyAgICAgICAgICAgIHJldFN0YXR1cyA9IERybUNvbnZlcnRlZFN0YXR1czo6U1RBVFVTX0lOUFVUREFUQV9FUlJPUjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgTE9HRCgiRndkTG9ja0VuZ2luZSBnZXRDb252ZXJ0ZWRTdGF0dXM6IGZpbGUgY29udmVyc2lvbiBFcnJvciAlZC4gIiBcCisgICAgICAgICAgICAgICAgICAiUmV0dXJuaW5nIFNUQVRVU19FUlJPUiIsIHN0YXR1cyk7CisgICAgICAgICAgICByZXRTdGF0dXMgPSBEcm1Db252ZXJ0ZWRTdGF0dXM6OlNUQVRVU19FUlJPUjsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiByZXRTdGF0dXM7Cit9CisKK0RybUNvbnN0cmFpbnRzKiBGd2RMb2NrRW5naW5lOjpvbkdldENvbnN0cmFpbnRzKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCogcGF0aCwgaW50IGFjdGlvbikgeworICAgIERybUNvbnN0cmFpbnRzKiBkcm1Db25zdHJhaW50cyA9IE5VTEw7CisKKyAgICBMT0dEKCJGd2RMb2NrRW5naW5lOjpvbkdldENvbnN0cmFpbnRzIik7CisKKyAgICBpZiAoTlVMTCAhPSBwYXRoICYmCisgICAgICAgIChSaWdodHNTdGF0dXM6OlJJR0hUU19WQUxJRCA9PSBvbkNoZWNrUmlnaHRzU3RhdHVzKHVuaXF1ZUlkLCAqcGF0aCwgYWN0aW9uKSkpIHsKKyAgICAgICAgLy8gUmV0dXJuIHRoZSBlbXB0eSBjb25zdHJhaW50cyB0byBzaG93IG5vIGVycm9yIGNvbmRpdGlvbi4KKyAgICAgICAgZHJtQ29uc3RyYWludHMgPSBuZXcgRHJtQ29uc3RyYWludHMoKTsKKyAgICB9CisKKyAgICByZXR1cm4gZHJtQ29uc3RyYWludHM7Cit9CisKK0RybU1ldGFkYXRhKiBGd2RMb2NrRW5naW5lOjpvbkdldE1ldGFkYXRhKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCogcGF0aCkgeworICAgIERybU1ldGFkYXRhKiBkcm1NZXRhZGF0YSA9IE5VTEw7CisKKyAgICBMT0dEKCJGd2RMb2NrRW5naW5lOjpvbkdldE1ldGFkYXRhIik7CisKKyAgICBpZiAoTlVMTCAhPSBwYXRoKSB7CisgICAgICAgIC8vIFJldHVybnMgZW1wdHkgbWV0YWRhdGEgdG8gc2hvdyBubyBlcnJvciBjb25kaXRpb24uCisgICAgICAgIGRybU1ldGFkYXRhID0gbmV3IERybU1ldGFkYXRhKCk7CisgICAgfQorCisgICAgcmV0dXJuIGRybU1ldGFkYXRhOworfQorCithbmRyb2lkOjpzdGF0dXNfdCBGd2RMb2NrRW5naW5lOjpvbkluaXRpYWxpemUoaW50IHVuaXF1ZUlkKSB7CisgICAgTE9HRCgiRndkTG9ja0VuZ2luZTo6b25Jbml0aWFsaXplIik7CisKKworICAgIGlmIChGd2RMb2NrR2x1ZV9Jbml0aWFsaXplS2V5RW5jcnlwdGlvbigpKSB7CisgICAgICAgIExPR0QoIkZ3ZExvY2tFbmdpbmU6Om9uSW5pdGlhbGl6ZSAtLSBGd2RMb2NrR2x1ZV9Jbml0aWFsaXplS2V5RW5jcnlwdGlvbiBzdWNjZWVkZWQiKTsKKyAgICB9IGVsc2UgeworICAgICAgICBMT0dEKCJGd2RMb2NrRW5naW5lOjpvbkluaXRpYWxpemUgLS0gRndkTG9ja0dsdWVfSW5pdGlhbGl6ZUtleUVuY3J5cHRpb24gZmFpbGVkOiIKKyAgICAgICAgICAgICAiZXJybm8gPSAlZCIsIGVycm5vKTsKKyAgICB9CisKKyAgICByZXR1cm4gRFJNX05PX0VSUk9SOworfQorCithbmRyb2lkOjpzdGF0dXNfdAorRndkTG9ja0VuZ2luZTo6b25TZXRPbkluZm9MaXN0ZW5lcihpbnQgdW5pcXVlSWQsIGNvbnN0IElEcm1FbmdpbmU6Ok9uSW5mb0xpc3RlbmVyKiBpbmZvTGlzdGVuZXIpIHsKKyAgICAvLyBOb3QgdXNlZAorICAgIExPR0QoIkZ3ZExvY2tFbmdpbmU6Om9uU2V0T25JbmZvTGlzdGVuZXIiKTsKKworICAgIHJldHVybiBEUk1fTk9fRVJST1I7Cit9CisKK2FuZHJvaWQ6OnN0YXR1c190IEZ3ZExvY2tFbmdpbmU6Om9uVGVybWluYXRlKGludCB1bmlxdWVJZCkgeworICAgIExPR0QoIkZ3ZExvY2tFbmdpbmU6Om9uVGVybWluYXRlIik7CisKKyAgICByZXR1cm4gRFJNX05PX0VSUk9SOworfQorCitEcm1TdXBwb3J0SW5mbyogRndkTG9ja0VuZ2luZTo6b25HZXRTdXBwb3J0SW5mbyhpbnQgdW5pcXVlSWQpIHsKKyAgICBEcm1TdXBwb3J0SW5mbyogcFN1cHBvcnRJbmZvID0gbmV3IERybVN1cHBvcnRJbmZvKCk7CisKKyAgICBMT0dEKCJGd2RMb2NrRW5naW5lOjpvbkdldFN1cHBvcnRJbmZvIik7CisKKyAgICAvLyBmaWxsIGFsbCBGb3J3YXJkIExvY2sgbWltZXR5cGVzIGFuZCBleHRlbnNpb25zCisgICAgaWYgKE5VTEwgIT0gcFN1cHBvcnRJbmZvKSB7CisgICAgICAgIHBTdXBwb3J0SW5mby0+YWRkTWltZVR5cGUoU3RyaW5nOChGV0RMT0NLX01JTUVUWVBFX0ZMKSk7CisgICAgICAgIHBTdXBwb3J0SW5mby0+YWRkRmlsZVN1ZmZpeChTdHJpbmc4KEZXRExPQ0tfRE9URVhURU5TSU9OX0ZMKSk7CisgICAgICAgIHBTdXBwb3J0SW5mby0+YWRkTWltZVR5cGUoU3RyaW5nOChGV0RMT0NLX01JTUVUWVBFX0RNKSk7CisgICAgICAgIHBTdXBwb3J0SW5mby0+YWRkRmlsZVN1ZmZpeChTdHJpbmc4KEZXRExPQ0tfRE9URVhURU5TSU9OX0RNKSk7CisKKyAgICAgICAgcFN1cHBvcnRJbmZvLT5zZXREZXNjcmlwdGlvbihTdHJpbmc4KEZXRExPQ0tfREVTQ1JJUFRJT04pKTsKKyAgICB9CisKKyAgICByZXR1cm4gcFN1cHBvcnRJbmZvOworfQorCitib29sIEZ3ZExvY2tFbmdpbmU6Om9uQ2FuSGFuZGxlKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCkgeworICAgIGJvb2wgcmVzdWx0ID0gZmFsc2U7CisKKyAgICBTdHJpbmc4IGV4dFN0cmluZyA9IHBhdGguZ2V0UGF0aEV4dGVuc2lvbigpOworCisgICAgZXh0U3RyaW5nLnRvTG93ZXIoKTsKKworICAgIGlmICgoZXh0U3RyaW5nID09IFN0cmluZzgoRldETE9DS19ET1RFWFRFTlNJT05fRkwpKSB8fAorICAgICAgICAoZXh0U3RyaW5nID09IFN0cmluZzgoRldETE9DS19ET1RFWFRFTlNJT05fRE0pKSkgeworICAgICAgICByZXN1bHQgPSB0cnVlOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitEcm1JbmZvU3RhdHVzKiBGd2RMb2NrRW5naW5lOjpvblByb2Nlc3NEcm1JbmZvKGludCB1bmlxdWVJZCwgY29uc3QgRHJtSW5mbyogZHJtSW5mbykgeworICAgIERybUluZm9TdGF0dXMgKmRybUluZm9TdGF0dXMgPSBOVUxMOworCisgICAgLy8gTm90aGluZyB0byBwcm9jZXNzCisKKyAgICBkcm1JbmZvU3RhdHVzID0gbmV3IERybUluZm9TdGF0dXMoKGludClEcm1JbmZvU3RhdHVzOjpTVEFUVVNfT0ssIDAsIE5VTEwsIFN0cmluZzgoIiIpKTsKKworICAgIExPR0QoIkZ3ZExvY2tFbmdpbmU6Om9uUHJvY2Vzc0RybUluZm8iKTsKKworICAgIHJldHVybiBkcm1JbmZvU3RhdHVzOworfQorCitzdGF0dXNfdCBGd2RMb2NrRW5naW5lOjpvblNhdmVSaWdodHMoCisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsCisgICAgICAgICAgICBjb25zdCBEcm1SaWdodHMmIGRybVJpZ2h0cywKKyAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIHJpZ2h0c1BhdGgsCisgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBjb250ZW50UGF0aCkgeworICAgIC8vIE5vIHJpZ2h0cyB0byBzYXZlLiBSZXR1cm4KKyAgICBMT0dEKCJGd2RMb2NrRW5naW5lOjpvblNhdmVSaWdodHMiKTsKKyAgICByZXR1cm4gRFJNX0VSUk9SX1VOS05PV047Cit9CisKK0RybUluZm8qIEZ3ZExvY2tFbmdpbmU6Om9uQWNxdWlyZURybUluZm8oaW50IHVuaXF1ZUlkLCBjb25zdCBEcm1JbmZvUmVxdWVzdCogZHJtSW5mb1JlcXVlc3QpIHsKKyAgICBEcm1JbmZvKiBkcm1JbmZvID0gTlVMTDsKKworICAgIC8vIE5vdGhpbmcgdG8gYmUgZG9uZSBmb3IgRm9yd2FyZCBMb2NrIGZpbGUKKyAgICBMT0dEKCJGd2RMb2NrRW5naW5lOjpvbkFjcXVpcmVEcm1JbmZvIik7CisKKyAgICByZXR1cm4gZHJtSW5mbzsKK30KKworaW50IEZ3ZExvY2tFbmdpbmU6Om9uQ2hlY2tSaWdodHNTdGF0dXMoaW50IHVuaXF1ZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhY3Rpb24pIHsKKyAgICBpbnQgcmVzdWx0ID0gUmlnaHRzU3RhdHVzOjpSSUdIVFNfSU5WQUxJRDsKKworICAgIExPR0QoIkZ3ZExvY2tFbmdpbmU6Om9uQ2hlY2tSaWdodHNTdGF0dXMiKTsKKworICAgIC8vIE9ubHkgVHJhbnNmZXIgYWN0aW9uIGlzIG5vdCBhbGxvd2VkIGZvciBmb3J3YXJkIExvY2sgZmlsZXMuCisgICAgaWYgKG9uQ2FuSGFuZGxlKHVuaXF1ZUlkLCBwYXRoKSkgeworICAgICAgICBzd2l0Y2goYWN0aW9uKSB7CisgICAgICAgICAgICBjYXNlIEFjdGlvbjo6REVGQVVMVDoKKyAgICAgICAgICAgIGNhc2UgQWN0aW9uOjpQTEFZOgorICAgICAgICAgICAgY2FzZSBBY3Rpb246OlJJTkdUT05FOgorICAgICAgICAgICAgY2FzZSBBY3Rpb246Ok9VVFBVVDoKKyAgICAgICAgICAgIGNhc2UgQWN0aW9uOjpQUkVWSUVXOgorICAgICAgICAgICAgY2FzZSBBY3Rpb246OkVYRUNVVEU6CisgICAgICAgICAgICBjYXNlIEFjdGlvbjo6RElTUExBWToKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBSaWdodHNTdGF0dXM6OlJJR0hUU19WQUxJRDsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBBY3Rpb246OlRSQU5TRkVSOgorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBSaWdodHNTdGF0dXM6OlJJR0hUU19JTlZBTElEOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdHVzX3QgRndkTG9ja0VuZ2luZTo6b25Db25zdW1lUmlnaHRzKGludCB1bmlxdWVJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCByZXNlcnZlKSB7CisgICAgLy8gTm8gcmlnaHRzIGNvbnN1bXB0aW9uCisgICAgTE9HRCgiRndkTG9ja0VuZ2luZTo6b25Db25zdW1lUmlnaHRzIik7CisgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKK30KKworYm9vbCBGd2RMb2NrRW5naW5lOjpvblZhbGlkYXRlQWN0aW9uKGludCB1bmlxdWVJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWN0aW9uRGVzY3JpcHRpb24mIGRlc2NyaXB0aW9uKSB7CisgICAgTE9HRCgiRndkTG9ja0VuZ2luZTo6b25WYWxpZGF0ZUFjdGlvbiIpOworCisgICAgLy8gRm9yIHRoZSBmb3J3YXJkbG9jayBlbmdpbmUgY2hlY2tSaWdodHMgYW5kIFZhbGlkYXRlQWN0aW9uIGFyZSB0aGUgc2FtZS4KKyAgICByZXR1cm4gKG9uQ2hlY2tSaWdodHNTdGF0dXModW5pcXVlSWQsIHBhdGgsIGFjdGlvbikgPT0gUmlnaHRzU3RhdHVzOjpSSUdIVFNfVkFMSUQpOworfQorCitTdHJpbmc4IEZ3ZExvY2tFbmdpbmU6Om9uR2V0T3JpZ2luYWxNaW1lVHlwZShpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgpIHsKKyAgICBMT0dEKCJGd2RMb2NrRW5naW5lOjpvbkdldE9yaWdpbmFsTWltZVR5cGUiKTsKKyAgICBTdHJpbmc4IG1pbWVTdHJpbmcgPSBTdHJpbmc4KCIiKTsKKyAgICBpbnQgZmlsZURlc2MgPSBGd2RMb2NrRmlsZV9vcGVuKHBhdGguc3RyaW5nKCkpOworCisgICAgaWYgKC0xIDwgZmlsZURlc2MpIHsKKyAgICAgICAgY29uc3QgY2hhciogcE1pbWVUeXBlID0gRndkTG9ja0ZpbGVfR2V0Q29udGVudFR5cGUoZmlsZURlc2MpOworCisgICAgICAgIGlmIChOVUxMICE9IHBNaW1lVHlwZSkgeworICAgICAgICAgICAgU3RyaW5nOCBjb250ZW50VHlwZSA9IFN0cmluZzgocE1pbWVUeXBlKTsKKyAgICAgICAgICAgIGNvbnRlbnRUeXBlLnRvTG93ZXIoKTsKKyAgICAgICAgICAgIG1pbWVTdHJpbmcgPSBNaW1lVHlwZVV0aWw6OmNvbnZlcnRNaW1lVHlwZShjb250ZW50VHlwZSk7CisgICAgICAgIH0KKworICAgICAgICBGd2RMb2NrRmlsZV9jbG9zZShmaWxlRGVzYyk7CisgICAgfQorCisgICAgcmV0dXJuIG1pbWVTdHJpbmc7Cit9CisKK2ludCBGd2RMb2NrRW5naW5lOjpvbkdldERybU9iamVjdFR5cGUoaW50IHVuaXF1ZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBtaW1lVHlwZSkgeworICAgIFN0cmluZzggbWltZVN0ciA9IFN0cmluZzgobWltZVR5cGUpOworCisgICAgTE9HRCgiRndkTG9ja0VuZ2luZTo6b25HZXREcm1PYmplY3RUeXBlIik7CisKKyAgICBtaW1lU3RyLnRvTG93ZXIoKTsKKworICAgIC8qIENoZWNrcyB3aGV0aGVyCisgICAgKiAxLiBwYXRoIGFuZCBtaW1lIHR5cGUgYm90aCBhcmUgbm90IGVtcHR5IHN0cmluZ3MgKG1lYW5pbmcgdW5hdmFpbGFibGUpIGVsc2UgY29udGVudCBpcyB1bmtub3duCisgICAgKiAyLiBpZiBvbmUgb2YgdGhlbSBpcyBlbXB0eSBzdHJpbmcgYW5kIGlmIG90aGVyIGlzIGtub3duIHRoZW4gaXRzIGEgRFJNIENvbnRlbnQgT2JqZWN0LgorICAgICogMy4gaWYgYm90aCBvZiB0aGVtIGFyZSBhdmFpbGFibGUsIHRoZW4gYm90aCBtYXkgYmUgb2Yga25vd24gdHlwZQorICAgICogICAgKHJlZ2FyZGxlc3Mgb2YgdGhlIHJlbGF0aW9uIGJldHdlZW4gdGhlbSB0byBtYWtlIGl0IGNvbXBhdGlibGUgd2l0aCBvdGhlciBEUk0gRW5naW5lcykKKyAgICAqLworICAgIGlmICgoKDAgPT0gcGF0aC5sZW5ndGgoKSkgfHwgb25DYW5IYW5kbGUodW5pcXVlSWQsIHBhdGgpKSAmJgorICAgICAgICAoKDAgPT0gbWltZVR5cGUubGVuZ3RoKCkpIHx8ICgobWltZVN0ciA9PSBTdHJpbmc4KEZXRExPQ0tfTUlNRVRZUEVfRkwpKSB8fAorICAgICAgICAobWltZVN0ciA9PSBTdHJpbmc4KEZXRExPQ0tfTUlNRVRZUEVfRE0pKSkpICYmIChtaW1lVHlwZSAhPSBwYXRoKSApIHsKKyAgICAgICAgICAgIHJldHVybiBEcm1PYmplY3RUeXBlOjpDT05URU5UOworICAgIH0KKworICAgIHJldHVybiBEcm1PYmplY3RUeXBlOjpVTktOT1dOOworfQorCitzdGF0dXNfdCBGd2RMb2NrRW5naW5lOjpvblJlbW92ZVJpZ2h0cyhpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgpIHsKKyAgICAvLyBObyBSaWdodHMgdG8gcmVtb3ZlCisgICAgTE9HRCgiRndkTG9ja0VuZ2luZTo6b25SZW1vdmVSaWdodHMiKTsKKyAgICByZXR1cm4gRFJNX05PX0VSUk9SOworfQorCitzdGF0dXNfdCBGd2RMb2NrRW5naW5lOjpvblJlbW92ZUFsbFJpZ2h0cyhpbnQgdW5pcXVlSWQpIHsKKyAgICAvLyBObyByaWdodHMgdG8gcmVtb3ZlCisgICAgTE9HRCgiRndkTG9ja0VuZ2luZTo6b25SZW1vdmVBbGxSaWdodHMiKTsKKyAgICByZXR1cm4gRFJNX05PX0VSUk9SOworfQorCisjaWZkZWYgVVNFXzY0QklUX0RSTV9BUEkKK3N0YXR1c190IEZ3ZExvY2tFbmdpbmU6Om9uU2V0UGxheWJhY2tTdGF0dXMoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGxheWJhY2tTdGF0dXMsIGludDY0X3QgcG9zaXRpb24pIHsKKyNlbHNlCitzdGF0dXNfdCBGd2RMb2NrRW5naW5lOjpvblNldFBsYXliYWNrU3RhdHVzKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBsYXliYWNrU3RhdHVzLCBpbnQgcG9zaXRpb24pIHsKKyNlbmRpZgorICAgIC8vIE5vdCB1c2VkCisgICAgTE9HRCgiRndkTG9ja0VuZ2luZTo6b25TZXRQbGF5YmFja1N0YXR1cyIpOworICAgIHJldHVybiBEUk1fTk9fRVJST1I7Cit9CisKK3N0YXR1c190IEZ3ZExvY2tFbmdpbmU6Om9uT3BlbkNvbnZlcnRTZXNzaW9uKGludCB1bmlxdWVJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvbnZlcnRJZCkgeworICAgIHN0YXR1c190IHJlc3VsdCA9IERSTV9FUlJPUl9VTktOT1dOOworICAgIExPR0QoIkZ3ZExvY2tFbmdpbmU6Om9uT3BlbkNvbnZlcnRTZXNzaW9uIik7CisgICAgaWYgKCFjb252ZXJ0U2Vzc2lvbk1hcC5pc0NyZWF0ZWQoY29udmVydElkKSkgeworICAgICAgICBDb252ZXJ0U2Vzc2lvbiAqbmV3U2Vzc2lvbiA9IG5ldyBDb252ZXJ0U2Vzc2lvbigpOworICAgICAgICBpZiAoRndkTG9ja0NvbnZfU3RhdHVzX09LID09CisgICAgICAgICAgICBGd2RMb2NrQ29udl9PcGVuU2Vzc2lvbigmKG5ld1Nlc3Npb24tPnVuaXF1ZUlkKSwgJihuZXdTZXNzaW9uLT5vdXRwdXQpKSkgeworICAgICAgICAgICAgY29udmVydFNlc3Npb25NYXAuYWRkVmFsdWUoY29udmVydElkLCBuZXdTZXNzaW9uKTsKKyAgICAgICAgICAgIHJlc3VsdCA9IERSTV9OT19FUlJPUjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExPR0QoIkZ3ZExvY2tFbmdpbmU6Om9uT3BlbkNvbnZlcnRTZXNzaW9uIC0tIEZ3ZExvY2tDb252X09wZW5TZXNzaW9uIGZhaWxlZC4iKTsKKyAgICAgICAgICAgIGRlbGV0ZSBuZXdTZXNzaW9uOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK0RybUNvbnZlcnRlZFN0YXR1cyogRndkTG9ja0VuZ2luZTo6b25Db252ZXJ0RGF0YShpbnQgdW5pcXVlSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvbnZlcnRJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEcm1CdWZmZXIqIGlucHV0RGF0YSkgeworICAgIEZ3ZExvY2tDb252X1N0YXR1c190IHJldFN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19JbnZhbGlkQXJndW1lbnQ7CisgICAgRHJtQnVmZmVyICpjb252UmVzdWx0ID0gbmV3IERybUJ1ZmZlcihOVUxMLCAwKTsKKyAgICBpbnQgb2Zmc2V0ID0gLTE7CisKKyAgICBpZiAoTlVMTCAhPSBpbnB1dERhdGEgJiYgY29udmVydFNlc3Npb25NYXAuaXNDcmVhdGVkKGNvbnZlcnRJZCkpIHsKKyAgICAgICAgQ29udmVydFNlc3Npb24gKmNvbnZTZXNzaW9uID0gY29udmVydFNlc3Npb25NYXAuZ2V0VmFsdWUoY29udmVydElkKTsKKworICAgICAgICBpZiAoTlVMTCAhPSBjb252U2Vzc2lvbikgeworICAgICAgICAgICAgcmV0U3RhdHVzID0gRndkTG9ja0NvbnZfQ29udmVydERhdGEoY29udlNlc3Npb24tPnVuaXF1ZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXREYXRhLT5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXREYXRhLT5sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKGNvbnZTZXNzaW9uLT5vdXRwdXQpKTsKKworICAgICAgICAgICAgaWYgKEZ3ZExvY2tDb252X1N0YXR1c19PSyA9PSByZXRTdGF0dXMpIHsKKyAgICAgICAgICAgICAgICAvLyByZXR1cm4gYnl0ZXMgZnJvbSBjb252ZXJzaW9uIGlmIGF2YWlsYWJsZQorICAgICAgICAgICAgICAgIGlmIChjb252U2Vzc2lvbi0+b3V0cHV0LmZyb21Db252ZXJ0RGF0YS5udW1CeXRlcyA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgY29udlJlc3VsdC0+ZGF0YSA9IG5ldyBjaGFyW2NvbnZTZXNzaW9uLT5vdXRwdXQuZnJvbUNvbnZlcnREYXRhLm51bUJ5dGVzXTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoTlVMTCAhPSBjb252UmVzdWx0LT5kYXRhKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb252UmVzdWx0LT5sZW5ndGggPSBjb252U2Vzc2lvbi0+b3V0cHV0LmZyb21Db252ZXJ0RGF0YS5udW1CeXRlczsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweShjb252UmVzdWx0LT5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopY29udlNlc3Npb24tPm91dHB1dC5mcm9tQ29udmVydERhdGEucEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252UmVzdWx0LT5sZW5ndGgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBvZmZzZXQgPSBjb252U2Vzc2lvbi0+b3V0cHV0LmZyb21Db252ZXJ0RGF0YS5lcnJvclBvczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbmV3IERybUNvbnZlcnRlZFN0YXR1cyhnZXRDb252ZXJ0ZWRTdGF0dXMocmV0U3RhdHVzKSwgY29udlJlc3VsdCwgb2Zmc2V0KTsKK30KKworRHJtQ29udmVydGVkU3RhdHVzKiBGd2RMb2NrRW5naW5lOjpvbkNsb3NlQ29udmVydFNlc3Npb24oaW50IHVuaXF1ZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvbnZlcnRJZCkgeworICAgIEZ3ZExvY2tDb252X1N0YXR1c190IHJldFN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19JbnZhbGlkQXJndW1lbnQ7CisgICAgRHJtQnVmZmVyICpjb252UmVzdWx0ID0gbmV3IERybUJ1ZmZlcihOVUxMLCAwKTsKKyAgICBpbnQgb2Zmc2V0ID0gLTE7CisKKyAgICBMT0dEKCJGd2RMb2NrRW5naW5lOjpvbkNsb3NlQ29udmVydFNlc3Npb24iKTsKKworICAgIGlmIChjb252ZXJ0U2Vzc2lvbk1hcC5pc0NyZWF0ZWQoY29udmVydElkKSkgeworICAgICAgICBDb252ZXJ0U2Vzc2lvbiAqY29udlNlc3Npb24gPSBjb252ZXJ0U2Vzc2lvbk1hcC5nZXRWYWx1ZShjb252ZXJ0SWQpOworCisgICAgICAgIGlmIChOVUxMICE9IGNvbnZTZXNzaW9uKSB7CisgICAgICAgICAgICByZXRTdGF0dXMgPSBGd2RMb2NrQ29udl9DbG9zZVNlc3Npb24oY29udlNlc3Npb24tPnVuaXF1ZUlkLCAmKGNvbnZTZXNzaW9uLT5vdXRwdXQpKTsKKworICAgICAgICAgICAgaWYgKEZ3ZExvY2tDb252X1N0YXR1c19PSyA9PSByZXRTdGF0dXMpIHsKKyAgICAgICAgICAgICAgICBvZmZzZXQgPSBjb252U2Vzc2lvbi0+b3V0cHV0LmZyb21DbG9zZVNlc3Npb24uZmlsZU9mZnNldDsKKyAgICAgICAgICAgICAgICBjb252UmVzdWx0LT5kYXRhID0gbmV3IGNoYXJbRldEX0xPQ0tfU0lHTkFUVVJFU19TSVpFXTsKKworICAgICAgICAgICAgICAgIGlmIChOVUxMICE9IGNvbnZSZXN1bHQtPmRhdGEpIHsKKyAgICAgICAgICAgICAgICAgICAgICBjb252UmVzdWx0LT5sZW5ndGggPSBGV0RfTE9DS19TSUdOQVRVUkVTX1NJWkU7CisgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KGNvbnZSZXN1bHQtPmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopY29udlNlc3Npb24tPm91dHB1dC5mcm9tQ2xvc2VTZXNzaW9uLnNpZ25hdHVyZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZSZXN1bHQtPmxlbmd0aCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNvbnZlcnRTZXNzaW9uTWFwLnJlbW92ZVZhbHVlKGNvbnZlcnRJZCk7CisgICAgfQorICAgIHJldHVybiBuZXcgRHJtQ29udmVydGVkU3RhdHVzKGdldENvbnZlcnRlZFN0YXR1cyhyZXRTdGF0dXMpLCBjb252UmVzdWx0LCBvZmZzZXQpOworfQorCisjaWZkZWYgVVNFXzY0QklUX0RSTV9BUEkKK3N0YXR1c190IEZ3ZExvY2tFbmdpbmU6Om9uT3BlbkRlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmY2NF90IG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZjY0X3QgbGVuZ3RoKSB7CisjZWxzZQorc3RhdHVzX3QgRndkTG9ja0VuZ2luZTo6b25PcGVuRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuZ3RoKSB7CisjZW5kaWYKKyAgICBzdGF0dXNfdCByZXN1bHQgPSBEUk1fRVJST1JfQ0FOTk9UX0hBTkRMRTsKKyAgICBpbnQgZmlsZURlc2MgPSAtMTsKKworICAgIExPR0QoIkZ3ZExvY2tFbmdpbmU6Om9uT3BlbkRlY3J5cHRTZXNzaW9uIik7CisKKyAgICBpZiAoKC0xIDwgZmQpICYmCisgICAgICAgIChOVUxMICE9IGRlY3J5cHRIYW5kbGUpICYmCisgICAgICAgICghZGVjb2RlU2Vzc2lvbk1hcC5pc0NyZWF0ZWQoZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdElkKSkpIHsKKyAgICAgICAgZmlsZURlc2MgPSBkdXAoZmQpOworICAgIH0gZWxzZSB7CisgICAgICAgIExPR0QoIkZ3ZExvY2tFbmdpbmU6Om9uT3BlbkRlY3J5cHRTZXNzaW9uIHBhcmFtZXRlciBlcnJvciIpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIGlmICgtMSA8IGZpbGVEZXNjICYmCisgICAgICAgIC0xIDwgOjpsc2VlayhmaWxlRGVzYywgb2Zmc2V0LCBTRUVLX1NFVCkgJiYKKyAgICAgICAgLTEgPCBGd2RMb2NrRmlsZV9hdHRhY2goZmlsZURlc2MpKSB7CisgICAgICAgIC8vIGNoZWNrIGZvciBmaWxlIGludGVncml0eS4gVGhpcyBtdXN0IGJlIGRvbmUgdG8gcHJvdGVjdCB0aGUgY29udGVudCBtYW5nbGluZy4KKyAgICAgICAgaW50IHJldFZhbCA9IEZ3ZExvY2tGaWxlX0NoZWNrSGVhZGVySW50ZWdyaXR5KGZpbGVEZXNjKTsKKyAgICAgICAgRGVjb2RlU2Vzc2lvbiogZGVjb2RlU2Vzc2lvbiA9IG5ldyBEZWNvZGVTZXNzaW9uKGZpbGVEZXNjKTsKKworICAgICAgICBpZiAocmV0VmFsICYmIE5VTEwgIT0gZGVjb2RlU2Vzc2lvbikgeworICAgICAgICAgICAgZGVjb2RlU2Vzc2lvbk1hcC5hZGRWYWx1ZShkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SWQsIGRlY29kZVNlc3Npb24pOworICAgICAgICAgICAgY29uc3QgY2hhciAqcG1pbWU9IEZ3ZExvY2tGaWxlX0dldENvbnRlbnRUeXBlKGZpbGVEZXNjKTsKKyAgICAgICAgICAgIFN0cmluZzggY29udGVudFR5cGUgPSBTdHJpbmc4KHBtaW1lID09IE5VTEwgPyAiIiA6IHBtaW1lKTsKKyAgICAgICAgICAgIGNvbnRlbnRUeXBlLnRvTG93ZXIoKTsKKyAgICAgICAgICAgIGRlY3J5cHRIYW5kbGUtPm1pbWVUeXBlID0gTWltZVR5cGVVdGlsOjpjb252ZXJ0TWltZVR5cGUoY29udGVudFR5cGUpOworICAgICAgICAgICAgZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdEFwaVR5cGUgPSBEZWNyeXB0QXBpVHlwZTo6Q09OVEFJTkVSX0JBU0VEOworICAgICAgICAgICAgZGVjcnlwdEhhbmRsZS0+c3RhdHVzID0gUmlnaHRzU3RhdHVzOjpSSUdIVFNfVkFMSUQ7CisgICAgICAgICAgICBkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SW5mbyA9IE5VTEw7CisgICAgICAgICAgICByZXN1bHQgPSBEUk1fTk9fRVJST1I7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMT0dEKCJGd2RMb2NrRW5naW5lOjpvbk9wZW5EZWNyeXB0U2Vzc2lvbiBJbnRlZ3JpdHkgQ2hlY2sgZmFpbGVkIGZvciB0aGUgZmQiKTsKKyAgICAgICAgICAgIEZ3ZExvY2tGaWxlX2RldGFjaChmaWxlRGVzYyk7CisgICAgICAgICAgICA6OmNsb3NlKGZpbGVEZXNjKTsKKyAgICAgICAgICAgIGRlbGV0ZSBkZWNvZGVTZXNzaW9uOworICAgICAgICB9CisgICAgfQorCisgICAgTE9HRCgiRndkTG9ja0VuZ2luZTo6b25PcGVuRGVjcnlwdFNlc3Npb24gRXhpdC4gcmVzdWx0ID0gJWQiLCByZXN1bHQpOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdHVzX3QgRndkTG9ja0VuZ2luZTo6b25PcGVuRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHVyaSkgeworICAgIHN0YXR1c190IHJlc3VsdCA9IERSTV9FUlJPUl9DQU5OT1RfSEFORExFOworICAgIGNvbnN0IGNoYXIgZmlsZVRhZyBbXSA9ICJmaWxlOi8vIjsKKworICAgIGlmIChOVUxMICE9IGRlY3J5cHRIYW5kbGUgJiYgTlVMTCAhPSB1cmkgJiYgc3RybGVuKHVyaSkgPiBzaXplb2YoZmlsZVRhZykpIHsKKyAgICAgICAgU3RyaW5nOCB1cmlUYWcgPSBTdHJpbmc4KHVyaSk7CisgICAgICAgIHVyaVRhZy50b0xvd2VyKCk7CisKKyAgICAgICAgaWYgKDAgPT0gc3RybmNtcCh1cmlUYWcuc3RyaW5nKCksIGZpbGVUYWcsIHNpemVvZihmaWxlVGFnKSAtIDEpKSB7CisgICAgICAgICAgICBjb25zdCBjaGFyICpmaWxlUGF0aCA9IHN0cmNocih1cmkgKyBzaXplb2YoZmlsZVRhZykgLSAxLCAnLycpOworICAgICAgICAgICAgaWYgKE5VTEwgIT0gZmlsZVBhdGggJiYgb25DYW5IYW5kbGUodW5pcXVlSWQsIFN0cmluZzgoZmlsZVBhdGgpKSkgeworICAgICAgICAgICAgICAgIGludCBmZCA9IG9wZW4oZmlsZVBhdGgsIE9fUkRPTkxZKTsKKworICAgICAgICAgICAgICAgIGlmICgtMSA8IGZkKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIG9mZnNldCBpcyBhbHdheXMgMCBhbmQgbGVuZ3RoIGlzIG5vdCB1c2VkLiBzbyBhbnkgcG9zaXRpdmUgc2l6ZS4KKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gb25PcGVuRGVjcnlwdFNlc3Npb24odW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUsIGZkLCAwLCAxKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBmZCBpcyBkdXBsaWNhdGVkIGFscmVhZHkgaWYgc3VjY2Vzcy4gY2xvc2luZyB0aGUgZmlsZQorICAgICAgICAgICAgICAgICAgICBjbG9zZShmZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdHVzX3QgRndkTG9ja0VuZ2luZTo6b25DbG9zZURlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlKSB7CisgICAgc3RhdHVzX3QgcmVzdWx0ID0gRFJNX0VSUk9SX1VOS05PV047CisgICAgTE9HRCgiRndkTG9ja0VuZ2luZTo6b25DbG9zZURlY3J5cHRTZXNzaW9uIik7CisKKyAgICBpZiAoTlVMTCAhPSBkZWNyeXB0SGFuZGxlICYmIGRlY29kZVNlc3Npb25NYXAuaXNDcmVhdGVkKGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJZCkpIHsKKyAgICAgICAgRGVjb2RlU2Vzc2lvbiogc2Vzc2lvbiA9IGRlY29kZVNlc3Npb25NYXAuZ2V0VmFsdWUoZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdElkKTsKKyAgICAgICAgaWYgKE5VTEwgIT0gc2Vzc2lvbiAmJiBzZXNzaW9uLT5maWxlRGVzYyA+IC0xKSB7CisgICAgICAgICAgICBGd2RMb2NrRmlsZV9kZXRhY2goc2Vzc2lvbi0+ZmlsZURlc2MpOworICAgICAgICAgICAgOjpjbG9zZShzZXNzaW9uLT5maWxlRGVzYyk7CisgICAgICAgICAgICBkZWNvZGVTZXNzaW9uTWFwLnJlbW92ZVZhbHVlKGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJZCk7CisgICAgICAgICAgICByZXN1bHQgPSBEUk1fTk9fRVJST1I7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBMT0dEKCJGd2RMb2NrRW5naW5lOjpvbkNsb3NlRGVjcnlwdFNlc3Npb24gRXhpdCIpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXR1c190IEZ3ZExvY2tFbmdpbmU6Om9uSW5pdGlhbGl6ZURlY3J5cHRVbml0KGludCB1bmlxdWVJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVjcnlwdFVuaXRJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERybUJ1ZmZlciogaGVhZGVySW5mbykgeworICAgIExPR0QoIkZ3ZExvY2tFbmdpbmU6Om9uSW5pdGlhbGl6ZURlY3J5cHRVbml0Iik7CisgICAgcmV0dXJuIERSTV9FUlJPUl9VTktOT1dOOworfQorCitzdGF0dXNfdCBGd2RMb2NrRW5naW5lOjpvbkRlY3J5cHQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCwKKyAgICAgICAgICAgIGNvbnN0IERybUJ1ZmZlciogZW5jQnVmZmVyLCBEcm1CdWZmZXIqKiBkZWNCdWZmZXIsIERybUJ1ZmZlciogSVYpIHsKKyAgICBMT0dEKCJGd2RMb2NrRW5naW5lOjpvbkRlY3J5cHQiKTsKKyAgICByZXR1cm4gRFJNX0VSUk9SX1VOS05PV047Cit9CisKK3N0YXR1c190IEZ3ZExvY2tFbmdpbmU6Om9uRGVjcnlwdChpbnQgdW5pcXVlSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVjcnlwdFVuaXRJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEcm1CdWZmZXIqIGVuY0J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEcm1CdWZmZXIqKiBkZWNCdWZmZXIpIHsKKyAgICBMT0dEKCJGd2RMb2NrRW5naW5lOjpvbkRlY3J5cHQiKTsKKyAgICByZXR1cm4gRFJNX0VSUk9SX1VOS05PV047Cit9CisKK3N0YXR1c190IEZ3ZExvY2tFbmdpbmU6Om9uRmluYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVjcnlwdFVuaXRJZCkgeworICAgIExPR0QoIkZ3ZExvY2tFbmdpbmU6Om9uRmluYWxpemVEZWNyeXB0VW5pdCIpOworICAgIHJldHVybiBEUk1fRVJST1JfVU5LTk9XTjsKK30KKworc3NpemVfdCBGd2RMb2NrRW5naW5lOjpvblJlYWQoaW50IHVuaXF1ZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1CeXRlcykgeworICAgIHNzaXplX3Qgc2l6ZSA9IC0xOworCisgICAgaWYgKE5VTEwgIT0gZGVjcnlwdEhhbmRsZSAmJgorICAgICAgIGRlY29kZVNlc3Npb25NYXAuaXNDcmVhdGVkKGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJZCkgJiYKKyAgICAgICAgTlVMTCAhPSBidWZmZXIgJiYKKyAgICAgICAgbnVtQnl0ZXMgPiAtMSkgeworICAgICAgICBEZWNvZGVTZXNzaW9uKiBzZXNzaW9uID0gZGVjb2RlU2Vzc2lvbk1hcC5nZXRWYWx1ZShkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SWQpOworICAgICAgICBpZiAoTlVMTCAhPSBzZXNzaW9uICYmIHNlc3Npb24tPmZpbGVEZXNjID4gLTEpIHsKKyAgICAgICAgICAgIHNpemUgPSBGd2RMb2NrRmlsZV9yZWFkKHNlc3Npb24tPmZpbGVEZXNjLCBidWZmZXIsIG51bUJ5dGVzKTsKKworICAgICAgICAgICAgaWYgKDAgPiBzaXplKSB7CisgICAgICAgICAgICAgICAgc2Vzc2lvbi0+b2Zmc2V0ID0gKChvZmZfdCktMSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNlc3Npb24tPm9mZnNldCArPSBzaXplOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHNpemU7Cit9CisKKyNpZmRlZiBVU0VfNjRCSVRfRFJNX0FQSQorb2ZmNjRfdCBGd2RMb2NrRW5naW5lOjpvbkxzZWVrKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmY2NF90IG9mZnNldCwgaW50IHdoZW5jZSkgeworI2Vsc2UKK29mZl90IEZ3ZExvY2tFbmdpbmU6Om9uTHNlZWsoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZfdCBvZmZzZXQsIGludCB3aGVuY2UpIHsKKyNlbmRpZgorICAgIG9mZl90IG9mZnZhbCA9IC0xOworCisgICAgaWYgKE5VTEwgIT0gZGVjcnlwdEhhbmRsZSAmJiBkZWNvZGVTZXNzaW9uTWFwLmlzQ3JlYXRlZChkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SWQpKSB7CisgICAgICAgIERlY29kZVNlc3Npb24qIHNlc3Npb24gPSBkZWNvZGVTZXNzaW9uTWFwLmdldFZhbHVlKGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJZCk7CisgICAgICAgIGlmIChOVUxMICE9IHNlc3Npb24gJiYgc2Vzc2lvbi0+ZmlsZURlc2MgPiAtMSkgeworICAgICAgICAgICAgb2ZmdmFsID0gRndkTG9ja0ZpbGVfbHNlZWsoc2Vzc2lvbi0+ZmlsZURlc2MsIG9mZnNldCwgd2hlbmNlKTsKKyAgICAgICAgICAgIHNlc3Npb24tPm9mZnNldCA9IG9mZnZhbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBvZmZ2YWw7Cit9CisKKyNpZmRlZiBVU0VfNjRCSVRfRFJNX0FQSQorc3NpemVfdCBGd2RMb2NrRW5naW5lOjpvblByZWFkKGludCB1bmlxdWVJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc2l6ZV90IG51bUJ5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZjY0X3Qgb2Zmc2V0KSB7CisjZWxzZQorc3NpemVfdCBGd2RMb2NrRW5naW5lOjpvblByZWFkKGludCB1bmlxdWVJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc2l6ZV90IG51bUJ5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZl90IG9mZnNldCkgeworI2VuZGlmCisgICAgc3NpemVfdCBieXRlc1JlYWQgPSAtMTsKKworICAgIERlY29kZVNlc3Npb24qIGRlY29kZXJTZXNzaW9uID0gTlVMTDsKKworICAgIGlmICgoTlVMTCAhPSBkZWNyeXB0SGFuZGxlKSAmJgorICAgICAgICAoTlVMTCAhPSAoZGVjb2RlclNlc3Npb24gPSBkZWNvZGVTZXNzaW9uTWFwLmdldFZhbHVlKGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJZCkpKSAmJgorICAgICAgICAoTlVMTCAhPSBidWZmZXIpICYmCisgICAgICAgIChudW1CeXRlcyA+IC0xKSAmJgorICAgICAgICAob2Zmc2V0ID4gLTEpKSB7CisgICAgICAgIGlmIChvZmZzZXQgIT0gZGVjb2RlclNlc3Npb24tPm9mZnNldCkgeworICAgICAgICAgICAgZGVjb2RlclNlc3Npb24tPm9mZnNldCA9IG9uTHNlZWsodW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUsIG9mZnNldCwgU0VFS19TRVQpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCgob2ZmX3QpLTEpICE9IGRlY29kZXJTZXNzaW9uLT5vZmZzZXQpIHsKKyAgICAgICAgICAgIGJ5dGVzUmVhZCA9IG9uUmVhZCh1bmlxdWVJZCwgZGVjcnlwdEhhbmRsZSwgYnVmZmVyLCBudW1CeXRlcyk7CisgICAgICAgICAgICBpZiAoYnl0ZXNSZWFkIDwgMCkgeworICAgICAgICAgICAgICAgIExPR0QoIkZ3ZExvY2tFbmdpbmU6Om9uUHJlYWQgZXJyb3IgcmVhZGluZyIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HRCgiRndkTG9ja0VuZ2luZTo6b25QcmVhZCBkZWNyeXB0SWQgbm90IGZvdW5kIik7CisgICAgfQorCisgICAgcmV0dXJuIGJ5dGVzUmVhZDsKK30KZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L0FuZHJvaWQubWsgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllZTc5NjEKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMTYgQEAKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCitpbmNsdWRlICQoY2FsbCBhbGwtc3ViZGlyLW1ha2VmaWxlcykKZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L2NvbW1vbi9BbmRyb2lkLm1rIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9pbnRlcm5hbC1mb3JtYXQvY29tbW9uL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM1ZDNjZgotLS0gL2Rldi9udWxsCisrKyBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L2NvbW1vbi9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMzIgQEAKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVMgOj0gXAorICAgIEZ3ZExvY2tHbHVlLmMKKworTE9DQUxfQ19JTkNMVURFUyA6PSBcCisgICAgZXh0ZXJuYWwvb3BlbnNzbC9pbmNsdWRlCisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliY3J5cHRvCisKK0xPQ0FMX01PRFVMRSA6PSBsaWJmd2Rsb2NrLWNvbW1vbgorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorCitpbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9jb21tb24vRndkTG9ja0dsdWUuYyBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L2NvbW1vbi9Gd2RMb2NrR2x1ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyYmRhOGYKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9jb21tb24vRndkTG9ja0dsdWUuYwpAQCAtMCwwICsxLDE5MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8cHRocmVhZC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9hZXMuaD4KKworI2luY2x1ZGUgIkZ3ZExvY2tHbHVlLmgiCisKKyNkZWZpbmUgVFJVRSAxCisjZGVmaW5lIEZBTFNFIDAKKworI2RlZmluZSBLRVlfU0laRSAxNgorI2RlZmluZSBLRVlfU0laRV9JTl9CSVRTIChLRVlfU0laRSAqIDgpCisKK3N0YXRpYyBpbnQgaXNJbml0aWFsaXplZCA9IEZBTFNFOworCitzdGF0aWMgY29uc3QgY2hhciBzdHJLZXlGaWxlbmFtZVtdID0gIi9kYXRhL2RybS9md2Rsb2NrL2tlay5kYXQiOworCitzdGF0aWMgQUVTX0tFWSBlbmNyeXB0aW9uUm91bmRLZXlzOworc3RhdGljIEFFU19LRVkgZGVjcnlwdGlvblJvdW5kS2V5czsKKworLyoqCisgKiBDcmVhdGVzIGFsbCBkaXJlY3RvcmllcyBhbG9uZyB0aGUgZnVsbHkgcXVhbGlmaWVkIHBhdGggb2YgdGhlIGdpdmVuIGZpbGUuCisgKgorICogQHBhcmFtW2luXSBwYXRoIEEgcmVmZXJlbmNlIHRvIHRoZSBmdWxseSBxdWFsaWZpZWQgcGF0aCBvZiBhIGZpbGUuCisgKiBAcGFyYW1baW5dIG1vZGUgVGhlIGFjY2VzcyBtb2RlIHRvIHVzZSBmb3IgdGhlIGRpcmVjdG9yaWVzIGJlaW5nIGNyZWF0ZWQuCisgKgorICogQHJldHVybiBBIEJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBvcGVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwuCisgKi8KK3N0YXRpYyBpbnQgRndkTG9ja0dsdWVfQ3JlYXRlRGlyZWN0b3JpZXMoY29uc3QgY2hhciAqcGF0aCwgbW9kZV90IG1vZGUpIHsKKyAgICBpbnQgcmVzdWx0ID0gVFJVRTsKKyAgICBzaXplX3QgcGFydGlhbFBhdGhMZW5ndGggPSBzdHJsZW4ocGF0aCk7CisgICAgY2hhciAqcGFydGlhbFBhdGggPSBtYWxsb2MocGFydGlhbFBhdGhMZW5ndGggKyAxKTsKKyAgICBpZiAocGFydGlhbFBhdGggPT0gTlVMTCkgeworICAgICAgICByZXN1bHQgPSBGQUxTRTsKKyAgICB9IGVsc2UgeworICAgICAgICBzaXplX3QgaTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHBhcnRpYWxQYXRoTGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgIGlmIChwYXRoW2ldID09ICcvJyAmJiBpID4gMCkgeworICAgICAgICAgICAgICAgIHBhcnRpYWxQYXRoW2ldID0gJ1wwJzsKKyAgICAgICAgICAgICAgICBpZiAobWtkaXIocGFydGlhbFBhdGgsIG1vZGUpICE9IDAgJiYgZXJybm8gIT0gRUVYSVNUKSB7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IEZBTFNFOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwYXJ0aWFsUGF0aFtpXSA9IHBhdGhbaV07CisgICAgICAgIH0KKyAgICAgICAgZnJlZShwYXJ0aWFsUGF0aCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogSW5pdGlhbGl6ZXMgdGhlIHJvdW5kIGtleXMgdXNlZCBmb3IgZW5jcnlwdGlvbiBhbmQgZGVjcnlwdGlvbiBvZiBzZXNzaW9uIGtleXMuIEZpcnN0IGNyZWF0ZXMgYQorICogZGV2aWNlLXVuaXF1ZSBrZXktZW5jcnlwdGlvbiBrZXkgaWYgbm9uZSBleGlzdHMgeWV0LgorICovCitzdGF0aWMgdm9pZCBGd2RMb2NrR2x1ZV9Jbml0aWFsaXplUm91bmRLZXlzKCkgeworICAgIHVuc2lnbmVkIGNoYXIga2V5RW5jcnlwdGlvbktleVtLRVlfU0laRV07CisgICAgaW50IGZpbGVEZXNjID0gb3BlbihzdHJLZXlGaWxlbmFtZSwgT19SRE9OTFkpOworICAgIGlmIChmaWxlRGVzYyA+PSAwKSB7CisgICAgICAgIGlmIChyZWFkKGZpbGVEZXNjLCBrZXlFbmNyeXB0aW9uS2V5LCBLRVlfU0laRSkgPT0gS0VZX1NJWkUpIHsKKyAgICAgICAgICAgIGlzSW5pdGlhbGl6ZWQgPSBUUlVFOworICAgICAgICB9CisgICAgICAgICh2b2lkKWNsb3NlKGZpbGVEZXNjKTsKKyAgICB9IGVsc2UgaWYgKGVycm5vID09IEVOT0VOVCAmJgorICAgICAgICAgICAgICAgRndkTG9ja0dsdWVfR2V0UmFuZG9tTnVtYmVyKGtleUVuY3J5cHRpb25LZXksIEtFWV9TSVpFKSAmJgorICAgICAgICAgICAgICAgRndkTG9ja0dsdWVfQ3JlYXRlRGlyZWN0b3JpZXMoc3RyS2V5RmlsZW5hbWUsIFNfSVJXWFUpKSB7CisgICAgICAgIGZpbGVEZXNjID0gb3BlbihzdHJLZXlGaWxlbmFtZSwgT19DUkVBVCB8IE9fVFJVTkMgfCBPX1dST05MWSwgU19JUlVTUik7CisgICAgICAgIGlmIChmaWxlRGVzYyA+PSAwKSB7CisgICAgICAgICAgICBpZiAod3JpdGUoZmlsZURlc2MsIGtleUVuY3J5cHRpb25LZXksIEtFWV9TSVpFKSA9PSBLRVlfU0laRSkgeworICAgICAgICAgICAgICAgIGlzSW5pdGlhbGl6ZWQgPSBUUlVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKHZvaWQpY2xvc2UoZmlsZURlc2MpOworICAgICAgICB9CisgICAgfQorICAgIGlmIChpc0luaXRpYWxpemVkKSB7CisgICAgICAgIGlmIChBRVNfc2V0X2VuY3J5cHRfa2V5KGtleUVuY3J5cHRpb25LZXksIEtFWV9TSVpFX0lOX0JJVFMsICZlbmNyeXB0aW9uUm91bmRLZXlzKSAhPSAwIHx8CisgICAgICAgICAgICBBRVNfc2V0X2RlY3J5cHRfa2V5KGtleUVuY3J5cHRpb25LZXksIEtFWV9TSVpFX0lOX0JJVFMsICZkZWNyeXB0aW9uUm91bmRLZXlzKSAhPSAwKSB7CisgICAgICAgICAgICBpc0luaXRpYWxpemVkID0gRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisgICAgbWVtc2V0KGtleUVuY3J5cHRpb25LZXksIDAsIEtFWV9TSVpFKTsgLy8gWmVybyBvdXQga2V5IGRhdGEuCit9CisKKy8qKgorICogVmFsaWRhdGVzIHRoZSBwYWRkaW5nIG9mIGEgZGVjcnlwdGVkIGtleS4KKyAqCisgKiBAcGFyYW1baW5dIHBEYXRhIEEgcmVmZXJlbmNlIHRvIHRoZSBidWZmZXIgY29udGFpbmluZyB0aGUgZGVjcnlwdGVkIGtleSBhbmQgcGFkZGluZy4KKyAqIEBwYXJhbVtpbl0gZGVjcnlwdGVkS2V5TGVuZ3RoIFRoZSBsZW5ndGggaW4gYnl0ZXMgb2YgdGhlIGRlY3J5cHRlZCBrZXkuCisgKgorICogQHJldHVybiBBIEJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBwYWRkaW5nIHdhcyB2YWxpZC4KKyAqLworc3RhdGljIGludCBGd2RMb2NrR2x1ZV9WYWxpZGF0ZVBhZGRpbmcoY29uc3QgdW5zaWduZWQgY2hhciAqcERhdGEsIHNpemVfdCBkZWNyeXB0ZWRLZXlMZW5ndGgpIHsKKyAgICBzaXplX3QgaTsKKyAgICBzaXplX3QgcGFkZGluZyA9IEFFU19CTE9DS19TSVpFIC0gKGRlY3J5cHRlZEtleUxlbmd0aCAlIEFFU19CTE9DS19TSVpFKTsKKyAgICBwRGF0YSArPSBkZWNyeXB0ZWRLZXlMZW5ndGg7CisgICAgZm9yIChpID0gMDsgaSA8IHBhZGRpbmc7ICsraSkgeworICAgICAgICBpZiAoKHNpemVfdCkqcERhdGEgIT0gcGFkZGluZykgeworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICAgICsrcERhdGE7CisgICAgfQorICAgIHJldHVybiBUUlVFOworfQorCitpbnQgRndkTG9ja0dsdWVfR2V0UmFuZG9tTnVtYmVyKHZvaWQgKnBCdWZmZXIsIHNpemVfdCBudW1CeXRlcykgeworICAgIC8vIEdlbmVyYXRlICdjcnlwdG9ncmFwaGljYWxseSBzZWN1cmUnIHJhbmRvbSBieXRlcyBieSByZWFkaW5nIHRoZW0gZnJvbSAiL2Rldi91cmFuZG9tIiAodGhlCisgICAgLy8gbm9uLWJsb2NraW5nIHZlcnNpb24gb2YgIi9kZXYvcmFuZG9tIikuCisgICAgc3NpemVfdCBudW1CeXRlc1JlYWQgPSAwOworICAgIGludCBmaWxlRGVzYyA9IG9wZW4oIi9kZXYvdXJhbmRvbSIsIE9fUkRPTkxZKTsKKyAgICBpZiAoZmlsZURlc2MgPj0gMCkgeworICAgICAgICBudW1CeXRlc1JlYWQgPSByZWFkKGZpbGVEZXNjLCBwQnVmZmVyLCBudW1CeXRlcyk7CisgICAgICAgICh2b2lkKWNsb3NlKGZpbGVEZXNjKTsKKyAgICB9CisgICAgcmV0dXJuIG51bUJ5dGVzUmVhZCA+PSAwICYmIChzaXplX3QpbnVtQnl0ZXNSZWFkID09IG51bUJ5dGVzOworfQorCitpbnQgRndkTG9ja0dsdWVfSW5pdGlhbGl6ZUtleUVuY3J5cHRpb24oKSB7CisgICAgc3RhdGljIHB0aHJlYWRfb25jZV90IG9uY2UgPSBQVEhSRUFEX09OQ0VfSU5JVDsKKyAgICBwdGhyZWFkX29uY2UoJm9uY2UsIEZ3ZExvY2tHbHVlX0luaXRpYWxpemVSb3VuZEtleXMpOworICAgIHJldHVybiBpc0luaXRpYWxpemVkOworfQorCitzaXplX3QgRndkTG9ja0dsdWVfR2V0RW5jcnlwdGVkS2V5TGVuZ3RoKHNpemVfdCBwbGFpbnRleHRLZXlMZW5ndGgpIHsKKyAgICByZXR1cm4gKChwbGFpbnRleHRLZXlMZW5ndGggLyBBRVNfQkxPQ0tfU0laRSkgKyAyKSAqIEFFU19CTE9DS19TSVpFOworfQorCitpbnQgRndkTG9ja0dsdWVfRW5jcnlwdEtleShjb25zdCB2b2lkICpwUGxhaW50ZXh0S2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHBsYWludGV4dEtleUxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnBFbmNyeXB0ZWRLZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZW5jcnlwdGVkS2V5TGVuZ3RoKSB7CisgICAgaW50IHJlc3VsdCA9IEZBTFNFOworICAgIGFzc2VydChlbmNyeXB0ZWRLZXlMZW5ndGggPT0gRndkTG9ja0dsdWVfR2V0RW5jcnlwdGVkS2V5TGVuZ3RoKHBsYWludGV4dEtleUxlbmd0aCkpOworICAgIGlmIChGd2RMb2NrR2x1ZV9Jbml0aWFsaXplS2V5RW5jcnlwdGlvbigpKSB7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgaW5pdFZlY3RvcltBRVNfQkxPQ0tfU0laRV07CisgICAgICAgIGlmIChGd2RMb2NrR2x1ZV9HZXRSYW5kb21OdW1iZXIoaW5pdFZlY3RvciwgQUVTX0JMT0NLX1NJWkUpKSB7CisgICAgICAgICAgICBzaXplX3QgcGFkZGluZyA9IEFFU19CTE9DS19TSVpFIC0gKHBsYWludGV4dEtleUxlbmd0aCAlIEFFU19CTE9DS19TSVpFKTsKKyAgICAgICAgICAgIHNpemVfdCBkYXRhTGVuZ3RoID0gZW5jcnlwdGVkS2V5TGVuZ3RoIC0gQUVTX0JMT0NLX1NJWkU7CisgICAgICAgICAgICBtZW1jcHkocEVuY3J5cHRlZEtleSwgcFBsYWludGV4dEtleSwgcGxhaW50ZXh0S2V5TGVuZ3RoKTsKKyAgICAgICAgICAgIG1lbXNldCgodW5zaWduZWQgY2hhciAqKXBFbmNyeXB0ZWRLZXkgKyBwbGFpbnRleHRLZXlMZW5ndGgsIChpbnQpcGFkZGluZywgcGFkZGluZyk7CisgICAgICAgICAgICBtZW1jcHkoKHVuc2lnbmVkIGNoYXIgKilwRW5jcnlwdGVkS2V5ICsgZGF0YUxlbmd0aCwgaW5pdFZlY3RvciwgQUVTX0JMT0NLX1NJWkUpOworICAgICAgICAgICAgQUVTX2NiY19lbmNyeXB0KHBFbmNyeXB0ZWRLZXksIHBFbmNyeXB0ZWRLZXksIGRhdGFMZW5ndGgsICZlbmNyeXB0aW9uUm91bmRLZXlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRWZWN0b3IsIEFFU19FTkNSWVBUKTsKKyAgICAgICAgICAgIHJlc3VsdCA9IFRSVUU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworaW50IEZ3ZExvY2tHbHVlX0RlY3J5cHRLZXkoY29uc3Qgdm9pZCAqcEVuY3J5cHRlZEtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBlbmNyeXB0ZWRLZXlMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpwRGVjcnlwdGVkS2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGRlY3J5cHRlZEtleUxlbmd0aCkgeworICAgIGludCByZXN1bHQgPSBGQUxTRTsKKyAgICBhc3NlcnQoZW5jcnlwdGVkS2V5TGVuZ3RoID09IEZ3ZExvY2tHbHVlX0dldEVuY3J5cHRlZEtleUxlbmd0aChkZWNyeXB0ZWRLZXlMZW5ndGgpKTsKKyAgICBpZiAoRndkTG9ja0dsdWVfSW5pdGlhbGl6ZUtleUVuY3J5cHRpb24oKSkgeworICAgICAgICBzaXplX3QgZGF0YUxlbmd0aCA9IGVuY3J5cHRlZEtleUxlbmd0aCAtIEFFU19CTE9DS19TSVpFOworICAgICAgICB1bnNpZ25lZCBjaGFyICpwRGF0YSA9IG1hbGxvYyhkYXRhTGVuZ3RoKTsKKyAgICAgICAgaWYgKHBEYXRhICE9IE5VTEwpIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgaW5pdFZlY3RvcltBRVNfQkxPQ0tfU0laRV07CisgICAgICAgICAgICBtZW1jcHkocERhdGEsIHBFbmNyeXB0ZWRLZXksIGRhdGFMZW5ndGgpOworICAgICAgICAgICAgbWVtY3B5KGluaXRWZWN0b3IsIChjb25zdCB1bnNpZ25lZCBjaGFyICopcEVuY3J5cHRlZEtleSArIGRhdGFMZW5ndGgsIEFFU19CTE9DS19TSVpFKTsKKyAgICAgICAgICAgIEFFU19jYmNfZW5jcnlwdChwRGF0YSwgcERhdGEsIGRhdGFMZW5ndGgsICZkZWNyeXB0aW9uUm91bmRLZXlzLCBpbml0VmVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFFU19ERUNSWVBUKTsKKyAgICAgICAgICAgIG1lbWNweShwRGVjcnlwdGVkS2V5LCBwRGF0YSwgZGVjcnlwdGVkS2V5TGVuZ3RoKTsKKyAgICAgICAgICAgIHJlc3VsdCA9IEZ3ZExvY2tHbHVlX1ZhbGlkYXRlUGFkZGluZyhwRGF0YSwgZGVjcnlwdGVkS2V5TGVuZ3RoKTsKKyAgICAgICAgICAgIGZyZWUocERhdGEpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CmRpZmYgLS1naXQgYS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9jb21tb24vRndkTG9ja0dsdWUuaCBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L2NvbW1vbi9Gd2RMb2NrR2x1ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzNmY2ZWEKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9jb21tb24vRndkTG9ja0dsdWUuaApAQCAtMCwwICsxLDg1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfX0ZXRExPQ0tHTFVFX0hfXworI2RlZmluZSBfX0ZXRExPQ0tHTFVFX0hfXworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qKgorICogR2VuZXJhdGVzIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGNyeXB0b2dyYXBoaWNhbGx5IHNlY3VyZSByYW5kb20gYnl0ZXMuCisgKgorICogQHBhcmFtW291dF0gcEJ1ZmZlciBBIHJlZmVyZW5jZSB0byB0aGUgYnVmZmVyIHRoYXQgc2hvdWxkIHJlY2VpdmUgdGhlIHJhbmRvbSBkYXRhLgorICogQHBhcmFtW2luXSBudW1CeXRlcyBUaGUgbnVtYmVyIG9mIHJhbmRvbSBieXRlcyB0byBnZW5lcmF0ZS4KKyAqCisgKiBAcmV0dXJuIEEgQm9vbGVhbiB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bC4KKyAqLworaW50IEZ3ZExvY2tHbHVlX0dldFJhbmRvbU51bWJlcih2b2lkICpwQnVmZmVyLCBzaXplX3QgbnVtQnl0ZXMpOworCisvKioKKyAqIFBlcmZvcm1zIGluaXRpYWxpemF0aW9uIG9mIHRoZSBrZXktZW5jcnlwdGlvbiBrZXkuIFNob3VsZCBiZSBjYWxsZWQgb25jZSBkdXJpbmcgc3RhcnR1cCB0bworICogZmFjaWxpdGF0ZSBlbmNyeXB0aW9uIGFuZCBkZWNyeXB0aW9uIG9mIHNlc3Npb24ga2V5cy4KKyAqCisgKiBAcmV0dXJuIEEgQm9vbGVhbiB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bC4KKyAqLworaW50IEZ3ZExvY2tHbHVlX0luaXRpYWxpemVLZXlFbmNyeXB0aW9uKCk7CisKKy8qKgorICogUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBlbmNyeXB0ZWQga2V5LCBnaXZlbiB0aGUgbGVuZ3RoIG9mIHRoZSBwbGFpbnRleHQga2V5LgorICoKKyAqIEBwYXJhbVtpbl0gcGxhaW50ZXh0S2V5TGVuZ3RoIFRoZSBsZW5ndGggaW4gYnl0ZXMgb2YgdGhlIHBsYWludGV4dCBrZXkuCisgKgorICogQHJldHVybiBUaGUgbGVuZ3RoIGluIGJ5dGVzIG9mIHRoZSBlbmNyeXB0ZWQga2V5LgorICovCitzaXplX3QgRndkTG9ja0dsdWVfR2V0RW5jcnlwdGVkS2V5TGVuZ3RoKHNpemVfdCBwbGFpbnRleHRLZXlMZW5ndGgpOworCisvKioKKyAqIEVuY3J5cHRzIHRoZSBnaXZlbiBzZXNzaW9uIGtleSB1c2luZyBhIGtleS1lbmNyeXB0aW9uIGtleSB1bmlxdWUgdG8gdGhpcyBkZXZpY2UuCisgKgorICogQHBhcmFtW2luXSBwUGxhaW50ZXh0S2V5IEEgcmVmZXJlbmNlIHRvIHRoZSBidWZmZXIgY29udGFpbmluZyB0aGUgcGxhaW50ZXh0IGtleS4KKyAqIEBwYXJhbVtpbl0gcGxhaW50ZXh0S2V5TGVuZ3RoIFRoZSBsZW5ndGggaW4gYnl0ZXMgb2YgdGhlIHBsYWludGV4dCBrZXkuCisgKiBAcGFyYW1bb3V0XSBwRW5jcnlwdGVkS2V5IEEgcmVmZXJlbmNlIHRvIHRoZSBidWZmZXIgY29udGFpbmluZyB0aGUgZW5jcnlwdGVkIGtleS4KKyAqIEBwYXJhbVtpbl0gZW5jcnlwdGVkS2V5TGVuZ3RoIFRoZSBsZW5ndGggaW4gYnl0ZXMgb2YgdGhlIGVuY3J5cHRlZCBrZXkuCisgKgorICogQHJldHVybiBBIEJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBvcGVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwuCisgKi8KK2ludCBGd2RMb2NrR2x1ZV9FbmNyeXB0S2V5KGNvbnN0IHZvaWQgKnBQbGFpbnRleHRLZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgcGxhaW50ZXh0S2V5TGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcEVuY3J5cHRlZEtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBlbmNyeXB0ZWRLZXlMZW5ndGgpOworCisvKioKKyAqIERlY3J5cHRzIHRoZSBnaXZlbiBzZXNzaW9uIGtleSB1c2luZyBhIGtleS1lbmNyeXB0aW9uIGtleSB1bmlxdWUgdG8gdGhpcyBkZXZpY2UuCisgKgorICogQHBhcmFtW2luXSBwRW5jcnlwdGVkS2V5IEEgcmVmZXJlbmNlIHRvIHRoZSBidWZmZXIgY29udGFpbmluZyB0aGUgZW5jcnlwdGVkIGtleS4KKyAqIEBwYXJhbVtpbl0gZW5jcnlwdGVkS2V5TGVuZ3RoIFRoZSBsZW5ndGggaW4gYnl0ZXMgb2YgdGhlIGVuY3J5cHRlZCBrZXkuCisgKiBAcGFyYW1bb3V0XSBwRGVjcnlwdGVkS2V5IEEgcmVmZXJlbmNlIHRvIHRoZSBidWZmZXIgY29udGFpbmluZyB0aGUgZGVjcnlwdGVkIGtleS4KKyAqIEBwYXJhbVtpbl0gZGVjcnlwdGVkS2V5TGVuZ3RoIFRoZSBsZW5ndGggaW4gYnl0ZXMgb2YgdGhlIGRlY3J5cHRlZCBrZXkuCisgKgorICogQHJldHVybiBBIEJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBvcGVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwuCisgKi8KK2ludCBGd2RMb2NrR2x1ZV9EZWNyeXB0S2V5KGNvbnN0IHZvaWQgKnBFbmNyeXB0ZWRLZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZW5jcnlwdGVkS2V5TGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcERlY3J5cHRlZEtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBkZWNyeXB0ZWRLZXlMZW5ndGgpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLy8gX19GV0RMT0NLR0xVRV9IX18KZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L2NvbnZlcnRlci9BbmRyb2lkLm1rIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9pbnRlcm5hbC1mb3JtYXQvY29udmVydGVyL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDBiYjc4OAotLS0gL2Rldi9udWxsCisrKyBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L2NvbnZlcnRlci9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMzcgQEAKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVMgOj0gXAorICAgIEZ3ZExvY2tDb252LmMKKworTE9DQUxfQ19JTkNMVURFUyA6PSBcCisgICAgZnJhbWV3b3Jrcy9iYXNlL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L2NvbW1vbiBcCisgICAgZXh0ZXJuYWwvb3BlbnNzbC9pbmNsdWRlCisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliY3J5cHRvCisKK0xPQ0FMX1dIT0xFX1NUQVRJQ19MSUJSQVJJRVMgOj0gbGliZndkbG9jay1jb21tb24KKworTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBsaWJmd2Rsb2NrLWNvbW1vbgorCitMT0NBTF9NT0RVTEUgOj0gbGliZndkbG9jay1jb252ZXJ0ZXIKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKKworaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9pbnRlcm5hbC1mb3JtYXQvY29udmVydGVyL0Z3ZExvY2tDb252LmMgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9jb252ZXJ0ZXIvRndkTG9ja0NvbnYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNGVhOWU5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9pbnRlcm5hbC1mb3JtYXQvY29udmVydGVyL0Z3ZExvY2tDb252LmMKQEAgLTAsMCArMSwxMzM5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2Flcy5oPgorI2luY2x1ZGUgPG9wZW5zc2wvaG1hYy5oPgorCisjaW5jbHVkZSAiRndkTG9ja0NvbnYuaCIKKyNpbmNsdWRlICJGd2RMb2NrR2x1ZS5oIgorCisjZGVmaW5lIFRSVUUgMQorI2RlZmluZSBGQUxTRSAwCisKKyNkZWZpbmUgSU5WQUxJRF9PRkZTRVQgKChvZmY2NF90KS0xKQorCisjZGVmaW5lIE1BWF9OVU1fU0VTU0lPTlMgMzIKKworI2RlZmluZSBPVVRQVVRfQlVGRkVSX1NJWkVfSU5DUkVNRU5UIDEwMjQKKyNkZWZpbmUgUkVBRF9CVUZGRVJfU0laRSAxMDI0CisKKyNkZWZpbmUgTUFYX0JPVU5EQVJZX0xFTkdUSCA3MAorI2RlZmluZSBNQVhfREVMSU1JVEVSX0xFTkdUSCAoTUFYX0JPVU5EQVJZX0xFTkdUSCArIDQpCisKKyNkZWZpbmUgU1RSSU5HX0xFTkdUSF9JTkNSRU1FTlQgMjUKKworI2RlZmluZSBLRVlfU0laRSBBRVNfQkxPQ0tfU0laRQorI2RlZmluZSBLRVlfU0laRV9JTl9CSVRTIChLRVlfU0laRSAqIDgpCisKKyNkZWZpbmUgU0hBMV9IQVNIX1NJWkUgMjAKKworI2RlZmluZSBGV0RfTE9DS19WRVJTSU9OIDAKKyNkZWZpbmUgRldEX0xPQ0tfU1VCRk9STUFUIDAKKyNkZWZpbmUgVVNBR0VfUkVTVFJJQ1RJT05fRkxBR1MgMAorI2RlZmluZSBDT05URU5UX1RZUEVfTEVOR1RIX1BPUyA3CisjZGVmaW5lIFRPUF9IRUFERVJfU0laRSA4CisKKy8qKgorICogRGF0YSB0eXBlIGZvciB0aGUgcGFyc2VyIHN0YXRlcyBvZiB0aGUgY29udmVydGVyLgorICovCit0eXBlZGVmIGVudW0gRndkTG9ja0NvbnZfUGFyc2VyU3RhdGUgeworICAgIEZ3ZExvY2tDb252X1BhcnNlclN0YXRlX1dhbnRzT3BlbkRlbGltaXRlciwKKyAgICBGd2RMb2NrQ29udl9QYXJzZXJTdGF0ZV9XYW50c01pbWVIZWFkZXJzLAorICAgIEZ3ZExvY2tDb252X1BhcnNlclN0YXRlX1dhbnRzQmluYXJ5RW5jb2RlZERhdGEsCisgICAgRndkTG9ja0NvbnZfUGFyc2VyU3RhdGVfV2FudHNCYXNlNjRFbmNvZGVkRGF0YSwKKyAgICBGd2RMb2NrQ29udl9QYXJzZXJTdGF0ZV9Eb25lCit9IEZ3ZExvY2tDb252X1BhcnNlclN0YXRlX3Q7CisKKy8qKgorICogRGF0YSB0eXBlIGZvciB0aGUgc2Nhbm5lciBzdGF0ZXMgb2YgdGhlIGNvbnZlcnRlci4KKyAqLwordHlwZWRlZiBlbnVtIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZSB7CisgICAgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzRmlyc3REYXNoLAorICAgIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c1NlY29uZERhc2gsCisgICAgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzQ1IsCisgICAgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzTEYsCisgICAgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzQm91bmRhcnksCisgICAgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzQm91bmRhcnlFbmQsCisgICAgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzTWltZUhlYWRlck5hbWVTdGFydCwKKyAgICBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNNaW1lSGVhZGVyTmFtZSwKKyAgICBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNNaW1lSGVhZGVyTmFtZUVuZCwKKyAgICBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNDb250ZW50VHlwZVN0YXJ0LAorICAgIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0NvbnRlbnRUeXBlLAorICAgIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0NvbnRlbnRUcmFuc2ZlckVuY29kaW5nU3RhcnQsCisgICAgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzX0FfT1JfSSwKKyAgICBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNfTiwKKyAgICBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNfQSwKKyAgICBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNfUiwKKyAgICBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNfWSwKKyAgICBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNfUywKKyAgICBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNfRSwKKyAgICBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNfNiwKKyAgICBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNfNCwKKyAgICBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNfQiwKKyAgICBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNfSSwKKyAgICBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNfVCwKKyAgICBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNDb250ZW50VHJhbnNmZXJFbmNvZGluZ0VuZCwKKyAgICBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNNaW1lSGVhZGVyVmFsdWVFbmQsCisgICAgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzTWltZUhlYWRlcnNFbmQsCisgICAgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzQnl0ZTEsCisgICAgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzQnl0ZTFfQWZ0ZXJDUkxGLAorICAgIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0J5dGUyLAorICAgIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0J5dGUzLAorICAgIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0J5dGU0LAorICAgIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c1BhZGRpbmcsCisgICAgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzV2hpdGVzcGFjZSwKKyAgICBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNXaGl0ZXNwYWNlX0FmdGVyQ1JMRiwKKyAgICBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNEZWxpbWl0ZXIKK30gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX3Q7CisKKy8qKgorICogRGF0YSB0eXBlIGZvciB0aGUgY29udGVudCB0cmFuc2ZlciBlbmNvZGluZy4KKyAqLwordHlwZWRlZiBlbnVtIEZ3ZExvY2tDb252X0NvbnRlbnRUcmFuc2ZlckVuY29kaW5nIHsKKyAgICBGd2RMb2NrQ29udl9Db250ZW50VHJhbnNmZXJFbmNvZGluZ19VbmRlZmluZWQsCisgICAgRndkTG9ja0NvbnZfQ29udGVudFRyYW5zZmVyRW5jb2RpbmdfQmluYXJ5LAorICAgIEZ3ZExvY2tDb252X0NvbnRlbnRUcmFuc2ZlckVuY29kaW5nX0Jhc2U2NAorfSBGd2RMb2NrQ29udl9Db250ZW50VHJhbnNmZXJFbmNvZGluZ190OworCisvKioKKyAqIERhdGEgdHlwZSBmb3IgYSBkeW5hbWljYWxseSBncm93aW5nIHN0cmluZy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgRndkTG9ja0NvbnZfU3RyaW5nIHsKKyAgICBjaGFyICpwdHI7CisgICAgc2l6ZV90IGxlbmd0aDsKKyAgICBzaXplX3QgbWF4TGVuZ3RoOworICAgIHNpemVfdCBsZW5ndGhJbmNyZW1lbnQ7Cit9IEZ3ZExvY2tDb252X1N0cmluZ190OworCisvKioKKyAqIERhdGEgdHlwZSBmb3IgdGhlIHBlci1maWxlIHN0YXRlIGluZm9ybWF0aW9uIG5lZWRlZCBieSB0aGUgY29udmVydGVyLgorICovCit0eXBlZGVmIHN0cnVjdCBGd2RMb2NrQ29udl9TZXNzaW9uIHsKKyAgICBGd2RMb2NrQ29udl9QYXJzZXJTdGF0ZV90IHBhcnNlclN0YXRlOworICAgIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV90IHNjYW5uZXJTdGF0ZTsKKyAgICBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfdCBzYXZlZFNjYW5uZXJTdGF0ZTsKKyAgICBvZmY2NF90IG51bUNoYXJzQ29uc3VtZWQ7CisgICAgY2hhciBkZWxpbWl0ZXJbTUFYX0RFTElNSVRFUl9MRU5HVEhdOworICAgIHNpemVfdCBkZWxpbWl0ZXJMZW5ndGg7CisgICAgc2l6ZV90IGRlbGltaXRlck1hdGNoUG9zOworICAgIEZ3ZExvY2tDb252X1N0cmluZ190IG1pbWVIZWFkZXJOYW1lOworICAgIEZ3ZExvY2tDb252X1N0cmluZ190IGNvbnRlbnRUeXBlOworICAgIEZ3ZExvY2tDb252X0NvbnRlbnRUcmFuc2ZlckVuY29kaW5nX3QgY29udGVudFRyYW5zZmVyRW5jb2Rpbmc7CisgICAgdW5zaWduZWQgY2hhciBzZXNzaW9uS2V5W0tFWV9TSVpFXTsKKyAgICB2b2lkICpwRW5jcnlwdGVkU2Vzc2lvbktleTsKKyAgICBzaXplX3QgZW5jcnlwdGVkU2Vzc2lvbktleUxlbmd0aDsKKyAgICBBRVNfS0VZIGVuY3J5cHRpb25Sb3VuZEtleXM7CisgICAgSE1BQ19DVFggc2lnbmluZ0NvbnRleHQ7CisgICAgdW5zaWduZWQgY2hhciB0b3BIZWFkZXJbVE9QX0hFQURFUl9TSVpFXTsKKyAgICB1bnNpZ25lZCBjaGFyIGNvdW50ZXJbQUVTX0JMT0NLX1NJWkVdOworICAgIHVuc2lnbmVkIGNoYXIga2V5U3RyZWFtW0FFU19CTE9DS19TSVpFXTsKKyAgICBpbnQga2V5U3RyZWFtSW5kZXg7CisgICAgdW5zaWduZWQgY2hhciBjaDsKKyAgICBzaXplX3Qgb3V0cHV0QnVmZmVyU2l6ZTsKKyAgICBzaXplX3QgZGF0YU9mZnNldDsKKyAgICBzaXplX3QgbnVtRGF0YUJ5dGVzOworfSBGd2RMb2NrQ29udl9TZXNzaW9uX3Q7CisKK3N0YXRpYyBGd2RMb2NrQ29udl9TZXNzaW9uX3QgKnNlc3Npb25QdHJzW01BWF9OVU1fU0VTU0lPTlNdID0geyBOVUxMIH07CisKK3N0YXRpYyBwdGhyZWFkX211dGV4X3Qgc2Vzc2lvbkFjcXVpc2l0aW9uTXV0ZXggPSBQVEhSRUFEX01VVEVYX0lOSVRJQUxJWkVSOworCitzdGF0aWMgY29uc3QgRndkTG9ja0NvbnZfU3RyaW5nX3QgbnVsbFN0cmluZyA9IHsgTlVMTCwgMCwgMCwgU1RSSU5HX0xFTkdUSF9JTkNSRU1FTlQgfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgdG9wSGVhZGVyVGVtcGxhdGVbXSA9CisgICAgeyAnRicsICdXJywgJ0wnLCAnSycsIEZXRF9MT0NLX1ZFUlNJT04sIEZXRF9MT0NLX1NVQkZPUk1BVCwgVVNBR0VfUkVTVFJJQ1RJT05fRkxBR1MgfTsKKworc3RhdGljIGNvbnN0IGNoYXIgc3RyQ29udGVudFtdID0gImNvbnRlbnQtIjsKK3N0YXRpYyBjb25zdCBjaGFyIHN0clR5cGVbXSA9ICJ0eXBlIjsKK3N0YXRpYyBjb25zdCBjaGFyIHN0clRyYW5zZmVyRW5jb2RpbmdbXSA9ICJ0cmFuc2Zlci1lbmNvZGluZyI7CitzdGF0aWMgY29uc3QgY2hhciBzdHJUZXh0UGxhaW5bXSA9ICJ0ZXh0L3BsYWluIjsKK3N0YXRpYyBjb25zdCBjaGFyIHN0ckFwcGxpY2F0aW9uVm5kT21hRHJtUmlnaHRzWG1sW10gPSAiYXBwbGljYXRpb24vdm5kLm9tYS5kcm0ucmlnaHRzK3htbCI7CitzdGF0aWMgY29uc3QgY2hhciBzdHJBcHBsaWNhdGlvblZuZE9tYURybUNvbnRlbnRbXSA9ICJhcHBsaWNhdGlvbi92bmQub21hLmRybS5jb250ZW50IjsKKworc3RhdGljIGNvbnN0IHNpemVfdCBzdHJsZW5Db250ZW50ID0gc2l6ZW9mIHN0ckNvbnRlbnQgLSAxOworc3RhdGljIGNvbnN0IHNpemVfdCBzdHJsZW5UZXh0UGxhaW4gPSBzaXplb2Ygc3RyVGV4dFBsYWluIC0gMTsKKworc3RhdGljIGNvbnN0IHNpZ25lZCBjaGFyIGJhc2U2NFZhbHVlc1tdID0geworICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgNjIsIC0xLCAtMSwgLTEsIDYzLAorICAgIDUyLCA1MywgNTQsIDU1LCA1NiwgNTcsIDU4LCA1OSwgNjAsIDYxLCAtMSwgLTEsIC0xLCAtMiwgLTEsIC0xLAorICAgIC0xLCAgMCwgIDEsICAyLCAgMywgIDQsICA1LCAgNiwgIDcsICA4LCAgOSwgMTAsIDExLCAxMiwgMTMsIDE0LAorICAgIDE1LCAxNiwgMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiwgMjMsIDI0LCAyNSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorICAgIC0xLCAyNiwgMjcsIDI4LCAyOSwgMzAsIDMxLCAzMiwgMzMsIDM0LCAzNSwgMzYsIDM3LCAzOCwgMzksIDQwLAorICAgIDQxLCA0MiwgNDMsIDQ0LCA0NSwgNDYsIDQ3LCA0OCwgNDksIDUwLCA1MQorfTsKKworLyoqCisgKiBBY3F1aXJlcyBhbiB1bnVzZWQgY29udmVydGVyIHNlc3Npb24uCisgKgorICogQHJldHVybiBBIHNlc3Npb24gSUQuCisgKi8KK3N0YXRpYyBpbnQgRndkTG9ja0NvbnZfQWNxdWlyZVNlc3Npb24oKSB7CisgICAgaW50IHNlc3Npb25JZCA9IC0xOworICAgIGludCBpOworICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmc2Vzc2lvbkFjcXVpc2l0aW9uTXV0ZXgpOworICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfTlVNX1NFU1NJT05TOyArK2kpIHsKKyAgICAgICAgaWYgKHNlc3Npb25QdHJzW2ldID09IE5VTEwpIHsKKyAgICAgICAgICAgIHNlc3Npb25QdHJzW2ldID0gbWFsbG9jKHNpemVvZiAqc2Vzc2lvblB0cnNbaV0pOworICAgICAgICAgICAgaWYgKHNlc3Npb25QdHJzW2ldICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBzZXNzaW9uSWQgPSBpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcHRocmVhZF9tdXRleF91bmxvY2soJnNlc3Npb25BY3F1aXNpdGlvbk11dGV4KTsKKyAgICByZXR1cm4gc2Vzc2lvbklkOworfQorCisvKioKKyAqIENoZWNrcyB3aGV0aGVyIGEgc2Vzc2lvbiBJRCBpcyBpbiByYW5nZSBhbmQgY3VycmVudGx5IGluIHVzZS4KKyAqCisgKiBAcGFyYW1baW5dIHNlc3Npb25JRCBBIHNlc3Npb24gSUQuCisgKgorICogQHJldHVybiBBIEJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBzZXNzaW9uIElEIGlzIGluIHJhbmdlIGFuZCBjdXJyZW50bHkgaW4gdXNlLgorICovCitzdGF0aWMgaW50IEZ3ZExvY2tDb252X0lzVmFsaWRTZXNzaW9uKGludCBzZXNzaW9uSWQpIHsKKyAgICByZXR1cm4gMCA8PSBzZXNzaW9uSWQgJiYgc2Vzc2lvbklkIDwgTUFYX05VTV9TRVNTSU9OUyAmJiBzZXNzaW9uUHRyc1tzZXNzaW9uSWRdICE9IE5VTEw7Cit9CisKKy8qKgorICogUmVsZWFzZXMgYSBjb252ZXJ0ZXIgc2Vzc2lvbi4KKyAqCisgKiBAcGFyYW1baW5dIHNlc3Npb25JRCBBIHNlc3Npb24gSUQuCisgKi8KK3N0YXRpYyB2b2lkIEZ3ZExvY2tDb252X1JlbGVhc2VTZXNzaW9uKGludCBzZXNzaW9uSWQpIHsKKyAgICBwdGhyZWFkX211dGV4X2xvY2soJnNlc3Npb25BY3F1aXNpdGlvbk11dGV4KTsKKyAgICBhc3NlcnQoRndkTG9ja0NvbnZfSXNWYWxpZFNlc3Npb24oc2Vzc2lvbklkKSk7CisgICAgbWVtc2V0KHNlc3Npb25QdHJzW3Nlc3Npb25JZF0sIDAsIHNpemVvZiAqc2Vzc2lvblB0cnNbc2Vzc2lvbklkXSk7IC8vIFplcm8gb3V0IGtleSBkYXRhLgorICAgIGZyZWUoc2Vzc2lvblB0cnNbc2Vzc2lvbklkXSk7CisgICAgc2Vzc2lvblB0cnNbc2Vzc2lvbklkXSA9IE5VTEw7CisgICAgcHRocmVhZF9tdXRleF91bmxvY2soJnNlc3Npb25BY3F1aXNpdGlvbk11dGV4KTsKK30KKworLyoqCisgKiBEZXJpdmVzIGNyeXB0b2dyYXBoaWNhbGx5IGluZGVwZW5kZW50IGtleXMgZm9yIGVuY3J5cHRpb24gYW5kIHNpZ25pbmcgZnJvbSB0aGUgc2Vzc2lvbiBrZXkuCisgKgorICogQHBhcmFtW2luLG91dF0gcFNlc3Npb24gQSByZWZlcmVuY2UgdG8gYSBjb252ZXJ0ZXIgc2Vzc2lvbi4KKyAqCisgKiBAcmV0dXJuIEEgc3RhdHVzIGNvZGUuCisgKi8KK3N0YXRpYyBpbnQgRndkTG9ja0NvbnZfRGVyaXZlS2V5cyhGd2RMb2NrQ29udl9TZXNzaW9uX3QgKnBTZXNzaW9uKSB7CisgICAgRndkTG9ja0NvbnZfU3RhdHVzX3Qgc3RhdHVzOworICAgIHN0cnVjdCBGd2RMb2NrQ29udl9EZXJpdmVLZXlzX0RhdGEgeworICAgICAgICBBRVNfS0VZIHNlc3Npb25Sb3VuZEtleXM7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgdmFsdWVbS0VZX1NJWkVdOworICAgICAgICB1bnNpZ25lZCBjaGFyIGtleVtLRVlfU0laRV07CisgICAgfSAqcERhdGEgPSBtYWxsb2Moc2l6ZW9mICpwRGF0YSk7CisgICAgaWYgKHBEYXRhID09IE5VTEwpIHsKKyAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX091dE9mTWVtb3J5OworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChBRVNfc2V0X2VuY3J5cHRfa2V5KHBTZXNzaW9uLT5zZXNzaW9uS2V5LCBLRVlfU0laRV9JTl9CSVRTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcERhdGEtPnNlc3Npb25Sb3VuZEtleXMpICE9IDApIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19Qcm9ncmFtRXJyb3I7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBFbmNyeXB0IHRoZSAxNi1ieXRlIHZhbHVlIHswLCAwLCAuLi4sIDB9IHRvIHByb2R1Y2UgdGhlIGVuY3J5cHRpb24ga2V5LgorICAgICAgICAgICAgbWVtc2V0KHBEYXRhLT52YWx1ZSwgMCwgS0VZX1NJWkUpOworICAgICAgICAgICAgQUVTX2VuY3J5cHQocERhdGEtPnZhbHVlLCBwRGF0YS0+a2V5LCAmcERhdGEtPnNlc3Npb25Sb3VuZEtleXMpOworICAgICAgICAgICAgaWYgKEFFU19zZXRfZW5jcnlwdF9rZXkocERhdGEtPmtleSwgS0VZX1NJWkVfSU5fQklUUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwU2Vzc2lvbi0+ZW5jcnlwdGlvblJvdW5kS2V5cykgIT0gMCkgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19Qcm9ncmFtRXJyb3I7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIEVuY3J5cHQgdGhlIDE2LWJ5dGUgdmFsdWUgezEsIDAsIC4uLiwgMH0gdG8gcHJvZHVjZSB0aGUgc2lnbmluZyBrZXkuCisgICAgICAgICAgICAgICAgKytwRGF0YS0+dmFsdWVbMF07CisgICAgICAgICAgICAgICAgQUVTX2VuY3J5cHQocERhdGEtPnZhbHVlLCBwRGF0YS0+a2V5LCAmcERhdGEtPnNlc3Npb25Sb3VuZEtleXMpOworICAgICAgICAgICAgICAgIEhNQUNfQ1RYX2luaXQoJnBTZXNzaW9uLT5zaWduaW5nQ29udGV4dCk7CisgICAgICAgICAgICAgICAgSE1BQ19Jbml0X2V4KCZwU2Vzc2lvbi0+c2lnbmluZ0NvbnRleHQsIHBEYXRhLT5rZXksIEtFWV9TSVpFLCBFVlBfc2hhMSgpLCBOVUxMKTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfT0s7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbWVtc2V0KHBEYXRhLCAwLCBzaXplb2YgcERhdGEpOyAvLyBaZXJvIG91dCBrZXkgZGF0YS4KKyAgICAgICAgZnJlZShwRGF0YSk7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICogQ2hlY2tzIHdoZXRoZXIgYSBnaXZlbiBjaGFyYWN0ZXIgaXMgdmFsaWQgaW4gYSBib3VuZGFyeS4gTm90ZSB0aGF0IHRoZSBib3VuZGFyeSBtYXkgY29udGFpbgorICogbGVhZGluZyBhbmQgaW50ZXJuYWwgc3BhY2VzLgorICoKKyAqIEBwYXJhbVtpbl0gY2ggVGhlIGNoYXJhY3RlciB0byBjaGVjay4KKyAqCisgKiBAcmV0dXJuIEEgQm9vbGVhbiB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGdpdmVuIGNoYXJhY3RlciBpcyB2YWxpZCBpbiBhIGJvdW5kYXJ5LgorICovCitzdGF0aWMgaW50IEZ3ZExvY2tDb252X0lzQm91bmRhcnlDaGFyKGludCBjaCkgeworICAgIHJldHVybiBpc2FsbnVtKGNoKSB8fCBjaCA9PSAnXCcnIHx8CisgICAgICAgICAgICBjaCA9PSAnKCcgfHwgY2ggPT0gJyknIHx8IGNoID09ICcrJyB8fCBjaCA9PSAnXycgfHwgY2ggPT0gJywnIHx8IGNoID09ICctJyB8fAorICAgICAgICAgICAgY2ggPT0gJy4nIHx8IGNoID09ICcvJyB8fCBjaCA9PSAnOicgfHwgY2ggPT0gJz0nIHx8IGNoID09ICc/JyB8fCBjaCA9PSAnICc7Cit9CisKKy8qKgorICogQ2hlY2tzIHdoZXRoZXIgYSBnaXZlbiBjaGFyYWN0ZXIgc2hvdWxkIGJlIGNvbnNpZGVyZWQgd2hpdGVzcGFjZSwgdXNpbmcgYSBuYXJyb3dlciBkZWZpbml0aW9uCisgKiB0aGFuIHRoZSBzdGFuZGFyZC1saWJyYXJ5IGlzc3BhY2UoKSBmdW5jdGlvbi4KKyAqCisgKiBAcGFyYW1baW5dIGNoIFRoZSBjaGFyYWN0ZXIgdG8gY2hlY2suCisgKgorICogQHJldHVybiBBIEJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBnaXZlbiBjaGFyYWN0ZXIgc2hvdWxkIGJlIGNvbnNpZGVyZWQgd2hpdGVzcGFjZS4KKyAqLworc3RhdGljIGludCBGd2RMb2NrQ29udl9Jc1doaXRlc3BhY2UoaW50IGNoKSB7CisgICAgcmV0dXJuIGNoID09ICcgJyB8fCBjaCA9PSAnXHQnOworfQorCisvKioKKyAqIFJlbW92ZXMgdHJhaWxpbmcgc3BhY2VzIGZyb20gdGhlIGRlbGltaXRlci4KKyAqCisgKiBAcGFyYW1baW4sb3V0XSBwU2Vzc2lvbiBBIHJlZmVyZW5jZSB0byBhIGNvbnZlcnRlciBzZXNzaW9uLgorICoKKyAqIEByZXR1cm4gQSBzdGF0dXMgY29kZS4KKyAqLworc3RhdGljIEZ3ZExvY2tDb252X1N0YXR1c190IEZ3ZExvY2tDb252X1JpZ2h0VHJpbURlbGltaXRlcihGd2RMb2NrQ29udl9TZXNzaW9uX3QgKnBTZXNzaW9uKSB7CisgICAgd2hpbGUgKHBTZXNzaW9uLT5kZWxpbWl0ZXJMZW5ndGggPiA0ICYmCisgICAgICAgICAgIHBTZXNzaW9uLT5kZWxpbWl0ZXJbcFNlc3Npb24tPmRlbGltaXRlckxlbmd0aCAtIDFdID09ICcgJykgeworICAgICAgICAtLXBTZXNzaW9uLT5kZWxpbWl0ZXJMZW5ndGg7CisgICAgfQorICAgIGlmIChwU2Vzc2lvbi0+ZGVsaW1pdGVyTGVuZ3RoID4gNCkgeworICAgICAgICByZXR1cm4gRndkTG9ja0NvbnZfU3RhdHVzX09LOworICAgIH0KKyAgICByZXR1cm4gRndkTG9ja0NvbnZfU3RhdHVzX1N5bnRheEVycm9yOworfQorCisvKioKKyAqIE1hdGNoZXMgdGhlIG9wZW4gZGVsaW1pdGVyLgorICoKKyAqIEBwYXJhbVtpbixvdXRdIHBTZXNzaW9uIEEgcmVmZXJlbmNlIHRvIGEgY29udmVydGVyIHNlc3Npb24uCisgKiBAcGFyYW1baW5dIGNoIEEgY2hhcmFjdGVyLgorICoKKyAqIEByZXR1cm4gQSBzdGF0dXMgY29kZS4KKyAqLworc3RhdGljIEZ3ZExvY2tDb252X1N0YXR1c190IEZ3ZExvY2tDb252X01hdGNoT3BlbkRlbGltaXRlcihGd2RMb2NrQ29udl9TZXNzaW9uX3QgKnBTZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2gpIHsKKyAgICBGd2RMb2NrQ29udl9TdGF0dXNfdCBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfT0s7CisgICAgc3dpdGNoIChwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlKSB7CisgICAgY2FzZSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNGaXJzdERhc2g6CisgICAgICAgIGlmIChjaCA9PSAnLScpIHsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5zY2FubmVyU3RhdGUgPSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNTZWNvbmREYXNoOworICAgICAgICB9IGVsc2UgaWYgKGNoID09ICdccicpIHsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5zY2FubmVyU3RhdGUgPSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNMRjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5zY2FubmVyU3RhdGUgPSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNDUjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c1NlY29uZERhc2g6CisgICAgICAgIGlmIChjaCA9PSAnLScpIHsKKyAgICAgICAgICAgIC8vIFRoZSBkZWxpbWl0ZXIgc3RhcnRzIHdpdGggIlxyXG4tLSIgKHRoZSBvcGVuIGRlbGltaXRlciBtYXkgb21pdCB0aGUgaW5pdGlhbCAiXHJcbiIpLgorICAgICAgICAgICAgLy8gVGhlIHJlc3QgaXMgdGhlIHVzZXItZGVmaW5lZCBib3VuZGFyeSB0aGF0IHNob3VsZCBjb21lIG5leHQuCisgICAgICAgICAgICBwU2Vzc2lvbi0+ZGVsaW1pdGVyWzBdID0gJ1xyJzsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5kZWxpbWl0ZXJbMV0gPSAnXG4nOworICAgICAgICAgICAgcFNlc3Npb24tPmRlbGltaXRlclsyXSA9ICctJzsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5kZWxpbWl0ZXJbM10gPSAnLSc7CisgICAgICAgICAgICBwU2Vzc2lvbi0+ZGVsaW1pdGVyTGVuZ3RoID0gNDsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5zY2FubmVyU3RhdGUgPSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNCb3VuZGFyeTsKKyAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnXHInKSB7CisgICAgICAgICAgICBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlID0gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzTEY7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlID0gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzQ1I7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNDUjoKKyAgICAgICAgaWYgKGNoID09ICdccicpIHsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5zY2FubmVyU3RhdGUgPSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNMRjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0xGOgorICAgICAgICBpZiAoY2ggPT0gJ1xuJykgeworICAgICAgICAgICAgcFNlc3Npb24tPnNjYW5uZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0ZpcnN0RGFzaDsKKyAgICAgICAgfSBlbHNlIGlmIChjaCAhPSAnXHInKSB7CisgICAgICAgICAgICBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlID0gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzQ1I7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNCb3VuZGFyeToKKyAgICAgICAgaWYgKEZ3ZExvY2tDb252X0lzQm91bmRhcnlDaGFyKGNoKSkgeworICAgICAgICAgICAgLy8gVGhlIGJvdW5kYXJ5IG1heSBjb250YWluIGxlYWRpbmcgYW5kIGludGVybmFsIHNwYWNlcywgc28gdHJhaWxpbmcgc3BhY2VzIHdpbGwgYWxzbyBiZQorICAgICAgICAgICAgLy8gbWF0Y2hlZCBoZXJlLiBUaGVzZSB3aWxsIGJlIHJlbW92ZWQgbGF0ZXIuCisgICAgICAgICAgICBpZiAocFNlc3Npb24tPmRlbGltaXRlckxlbmd0aCA8IE1BWF9ERUxJTUlURVJfTEVOR1RIKSB7CisgICAgICAgICAgICAgICAgcFNlc3Npb24tPmRlbGltaXRlcltwU2Vzc2lvbi0+ZGVsaW1pdGVyTGVuZ3RoKytdID0gY2g7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGNoICE9ICcgJykgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19TeW50YXhFcnJvcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnXHInKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9SaWdodFRyaW1EZWxpbWl0ZXIocFNlc3Npb24pOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBGd2RMb2NrQ29udl9TdGF0dXNfT0spIHsKKyAgICAgICAgICAgICAgICBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlID0gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzQm91bmRhcnlFbmQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJ1x0JykgeworICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfUmlnaHRUcmltRGVsaW1pdGVyKHBTZXNzaW9uKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gRndkTG9ja0NvbnZfU3RhdHVzX09LKSB7CisgICAgICAgICAgICAgICAgcFNlc3Npb24tPnNjYW5uZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c1doaXRlc3BhY2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfU3ludGF4RXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNXaGl0ZXNwYWNlOgorICAgICAgICBpZiAoY2ggPT0gJ1xyJykgeworICAgICAgICAgICAgcFNlc3Npb24tPnNjYW5uZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0JvdW5kYXJ5RW5kOworICAgICAgICB9IGVsc2UgaWYgKCFGd2RMb2NrQ29udl9Jc1doaXRlc3BhY2UoY2gpKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfU3ludGF4RXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNCb3VuZGFyeUVuZDoKKyAgICAgICAgaWYgKGNoID09ICdcbicpIHsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5wYXJzZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1BhcnNlclN0YXRlX1dhbnRzTWltZUhlYWRlcnM7CisgICAgICAgICAgICBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlID0gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzTWltZUhlYWRlck5hbWVTdGFydDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19TeW50YXhFcnJvcjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfUHJvZ3JhbUVycm9yOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBDaGVja3Mgd2hldGhlciBhIGdpdmVuIGNoYXJhY3RlciBpcyB2YWxpZCBpbiBhIE1JTUUgaGVhZGVyIG5hbWUuCisgKgorICogQHBhcmFtW2luXSBjaCBUaGUgY2hhcmFjdGVyIHRvIGNoZWNrLgorICoKKyAqIEByZXR1cm4gQSBCb29sZWFuIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGUgZ2l2ZW4gY2hhcmFjdGVyIGlzIHZhbGlkIGluIGEgTUlNRSBoZWFkZXIgbmFtZS4KKyAqLworc3RhdGljIGludCBGd2RMb2NrQ29udl9Jc01pbWVIZWFkZXJOYW1lQ2hhcihpbnQgY2gpIHsKKyAgICByZXR1cm4gaXNncmFwaChjaCkgJiYgY2ggIT0gJzonOworfQorCisvKioKKyAqIENoZWNrcyB3aGV0aGVyIGEgZ2l2ZW4gY2hhcmFjdGVyIGlzIHZhbGlkIGluIGEgTUlNRSBoZWFkZXIgdmFsdWUuCisgKgorICogQHBhcmFtW2luXSBjaCBUaGUgY2hhcmFjdGVyIHRvIGNoZWNrLgorICoKKyAqIEByZXR1cm4gQSBCb29sZWFuIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGUgZ2l2ZW4gY2hhcmFjdGVyIGlzIHZhbGlkIGluIGEgTUlNRSBoZWFkZXIgdmFsdWUuCisgKi8KK3N0YXRpYyBpbnQgRndkTG9ja0NvbnZfSXNNaW1lSGVhZGVyVmFsdWVDaGFyKGludCBjaCkgeworICAgIHJldHVybiBpc2dyYXBoKGNoKSAmJiBjaCAhPSAnOyc7Cit9CisKKy8qKgorICogQXBwZW5kcyBhIGNoYXJhY3RlciB0byB0aGUgc3BlY2lmaWVkIGR5bmFtaWNhbGx5IGdyb3dpbmcgc3RyaW5nLgorICoKKyAqIEBwYXJhbVtpbixvdXRdIHBTdHJpbmcgQSByZWZlcmVuY2UgdG8gYSBkeW5hbWljYWxseSBncm93aW5nIHN0cmluZy4KKyAqIEBwYXJhbVtpbl0gY2ggVGhlIGNoYXJhY3RlciB0byBhcHBlbmQuCisgKgorICogQHJldHVybiBBIHN0YXR1cyBjb2RlLgorICovCitzdGF0aWMgRndkTG9ja0NvbnZfU3RhdHVzX3QgRndkTG9ja0NvbnZfU3RyaW5nQXBwZW5kKEZ3ZExvY2tDb252X1N0cmluZ190ICpwU3RyaW5nLCBpbnQgY2gpIHsKKyAgICBpZiAocFN0cmluZy0+bGVuZ3RoID09IHBTdHJpbmctPm1heExlbmd0aCkgeworICAgICAgICBzaXplX3QgbmV3TWF4TGVuZ3RoID0gcFN0cmluZy0+bWF4TGVuZ3RoICsgcFN0cmluZy0+bGVuZ3RoSW5jcmVtZW50OworICAgICAgICBjaGFyICpuZXdQdHIgPSByZWFsbG9jKHBTdHJpbmctPnB0ciwgbmV3TWF4TGVuZ3RoICsgMSk7CisgICAgICAgIGlmIChuZXdQdHIgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIEZ3ZExvY2tDb252X1N0YXR1c19PdXRPZk1lbW9yeTsKKyAgICAgICAgfQorICAgICAgICBwU3RyaW5nLT5wdHIgPSBuZXdQdHI7CisgICAgICAgIHBTdHJpbmctPm1heExlbmd0aCA9IG5ld01heExlbmd0aDsKKyAgICB9CisgICAgcFN0cmluZy0+cHRyW3BTdHJpbmctPmxlbmd0aCsrXSA9IGNoOworICAgIHBTdHJpbmctPnB0cltwU3RyaW5nLT5sZW5ndGhdID0gJ1wwJzsKKyAgICByZXR1cm4gRndkTG9ja0NvbnZfU3RhdHVzX09LOworfQorCisvKioKKyAqIEF0dGVtcHRzIHRvIHJlY29nbml6ZSB0aGUgTUlNRSBoZWFkZXIgbmFtZSBhbmQgY2hhbmdlcyB0aGUgc2Nhbm5lciBzdGF0ZSBhY2NvcmRpbmdseS4KKyAqCisgKiBAcGFyYW1baW4sb3V0XSBwU2Vzc2lvbiBBIHJlZmVyZW5jZSB0byBhIGNvbnZlcnRlciBzZXNzaW9uLgorICoKKyAqIEByZXR1cm4gQSBzdGF0dXMgY29kZS4KKyAqLworc3RhdGljIEZ3ZExvY2tDb252X1N0YXR1c190IEZ3ZExvY2tDb252X1JlY29nbml6ZU1pbWVIZWFkZXJOYW1lKEZ3ZExvY2tDb252X1Nlc3Npb25fdCAqcFNlc3Npb24pIHsKKyAgICBGd2RMb2NrQ29udl9TdGF0dXNfdCBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfT0s7CisgICAgaWYgKHN0cm5jbXAocFNlc3Npb24tPm1pbWVIZWFkZXJOYW1lLnB0ciwgc3RyQ29udGVudCwgc3RybGVuQ29udGVudCkgPT0gMCkgeworICAgICAgICBpZiAoc3RyY21wKHBTZXNzaW9uLT5taW1lSGVhZGVyTmFtZS5wdHIgKyBzdHJsZW5Db250ZW50LCBzdHJUeXBlKSA9PSAwKSB7CisgICAgICAgICAgICBpZiAocFNlc3Npb24tPmNvbnRlbnRUeXBlLnB0ciA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcFNlc3Npb24tPnNjYW5uZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0NvbnRlbnRUeXBlU3RhcnQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19TeW50YXhFcnJvcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAocFNlc3Npb24tPm1pbWVIZWFkZXJOYW1lLnB0ciArIHN0cmxlbkNvbnRlbnQsIHN0clRyYW5zZmVyRW5jb2RpbmcpID09IDApIHsKKyAgICAgICAgICAgIGlmIChwU2Vzc2lvbi0+Y29udGVudFRyYW5zZmVyRW5jb2RpbmcgPT0KKyAgICAgICAgICAgICAgICAgICAgRndkTG9ja0NvbnZfQ29udGVudFRyYW5zZmVyRW5jb2RpbmdfVW5kZWZpbmVkKSB7CisgICAgICAgICAgICAgICAgcFNlc3Npb24tPnNjYW5uZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0NvbnRlbnRUcmFuc2ZlckVuY29kaW5nU3RhcnQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19TeW50YXhFcnJvcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5zY2FubmVyU3RhdGUgPSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNDUjsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHBTZXNzaW9uLT5zY2FubmVyU3RhdGUgPSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNDUjsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBBcHBsaWVzIGRlZmF1bHRzIHRvIG1pc3NpbmcgTUlNRSBoZWFkZXIgdmFsdWVzLgorICoKKyAqIEBwYXJhbVtpbixvdXRdIHBTZXNzaW9uIEEgcmVmZXJlbmNlIHRvIGEgY29udmVydGVyIHNlc3Npb24uCisgKgorICogQHJldHVybiBBIHN0YXR1cyBjb2RlLgorICovCitzdGF0aWMgRndkTG9ja0NvbnZfU3RhdHVzX3QgRndkTG9ja0NvbnZfQXBwbHlEZWZhdWx0cyhGd2RMb2NrQ29udl9TZXNzaW9uX3QgKnBTZXNzaW9uKSB7CisgICAgaWYgKHBTZXNzaW9uLT5jb250ZW50VHlwZS5wdHIgPT0gTlVMTCkgeworICAgICAgICAvLyBDb250ZW50IHR5cGUgaXMgbWlzc2luZzogZGVmYXVsdCB0byAidGV4dC9wbGFpbiIuCisgICAgICAgIHBTZXNzaW9uLT5jb250ZW50VHlwZS5wdHIgPSBtYWxsb2Moc2l6ZW9mIHN0clRleHRQbGFpbik7CisgICAgICAgIGlmIChwU2Vzc2lvbi0+Y29udGVudFR5cGUucHRyID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBGd2RMb2NrQ29udl9TdGF0dXNfT3V0T2ZNZW1vcnk7CisgICAgICAgIH0KKyAgICAgICAgbWVtY3B5KHBTZXNzaW9uLT5jb250ZW50VHlwZS5wdHIsIHN0clRleHRQbGFpbiwgc2l6ZW9mIHN0clRleHRQbGFpbik7CisgICAgICAgIHBTZXNzaW9uLT5jb250ZW50VHlwZS5sZW5ndGggPSBzdHJsZW5UZXh0UGxhaW47CisgICAgICAgIHBTZXNzaW9uLT5jb250ZW50VHlwZS5tYXhMZW5ndGggPSBzdHJsZW5UZXh0UGxhaW47CisgICAgfQorICAgIGlmIChwU2Vzc2lvbi0+Y29udGVudFRyYW5zZmVyRW5jb2RpbmcgPT0gRndkTG9ja0NvbnZfQ29udGVudFRyYW5zZmVyRW5jb2RpbmdfVW5kZWZpbmVkKSB7CisgICAgICAgIC8vIENvbnRlbnQgdHJhbnNmZXIgZW5jb2RpbmcgaXMgbWlzc2luZzogZGVmYXVsdCB0byBiaW5hcnkuCisgICAgICAgIHBTZXNzaW9uLT5jb250ZW50VHJhbnNmZXJFbmNvZGluZyA9IEZ3ZExvY2tDb252X0NvbnRlbnRUcmFuc2ZlckVuY29kaW5nX0JpbmFyeTsKKyAgICB9CisgICAgcmV0dXJuIEZ3ZExvY2tDb252X1N0YXR1c19PSzsKK30KKworLyoqCisgKiBWZXJpZmllcyB0aGF0IHRoZSBjb250ZW50IHR5cGUgaXMgc3VwcG9ydGVkLgorICoKKyAqIEBwYXJhbVtpbixvdXRdIHBTZXNzaW9uIEEgcmVmZXJlbmNlIHRvIGEgY29udmVydGVyIHNlc3Npb24uCisgKgorICogQHJldHVybiBBIHN0YXR1cyBjb2RlLgorICovCitzdGF0aWMgRndkTG9ja0NvbnZfU3RhdHVzX3QgRndkTG9ja0NvbnZfVmVyaWZ5Q29udGVudFR5cGUoRndkTG9ja0NvbnZfU2Vzc2lvbl90ICpwU2Vzc2lvbikgeworICAgIEZ3ZExvY2tDb252X1N0YXR1c190IHN0YXR1czsKKyAgICBpZiAocFNlc3Npb24tPmNvbnRlbnRUeXBlLnB0ciA9PSBOVUxMKSB7CisgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19Qcm9ncmFtRXJyb3I7CisgICAgfSBlbHNlIGlmIChzdHJjbXAocFNlc3Npb24tPmNvbnRlbnRUeXBlLnB0ciwgc3RyQXBwbGljYXRpb25WbmRPbWFEcm1SaWdodHNYbWwpID09IDAgfHwKKyAgICAgICAgICAgICAgIHN0cmNtcChwU2Vzc2lvbi0+Y29udGVudFR5cGUucHRyLCBzdHJBcHBsaWNhdGlvblZuZE9tYURybUNvbnRlbnQpID09IDApIHsKKyAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX1Vuc3VwcG9ydGVkRmlsZUZvcm1hdDsKKyAgICB9IGVsc2UgeworICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfT0s7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICogV3JpdGVzIHRoZSBoZWFkZXIgb2YgdGhlIG91dHB1dCBmaWxlLgorICoKKyAqIEBwYXJhbVtpbixvdXRdIHBTZXNzaW9uIEEgcmVmZXJlbmNlIHRvIGEgY29udmVydGVyIHNlc3Npb24uCisgKiBAcGFyYW1bb3V0XSBwT3V0cHV0IFRoZSBvdXRwdXQgZnJvbSB0aGUgY29udmVyc2lvbiBwcm9jZXNzLgorICoKKyAqIEByZXR1cm4gQSBzdGF0dXMgY29kZS4KKyAqLworc3RhdGljIEZ3ZExvY2tDb252X1N0YXR1c190IEZ3ZExvY2tDb252X1dyaXRlSGVhZGVyKEZ3ZExvY2tDb252X1Nlc3Npb25fdCAqcFNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRndkTG9ja0NvbnZfT3V0cHV0X3QgKnBPdXRwdXQpIHsKKyAgICBGd2RMb2NrQ29udl9TdGF0dXNfdCBzdGF0dXM7CisgICAgaWYgKHBTZXNzaW9uLT5jb250ZW50VHlwZS5sZW5ndGggPiBVQ0hBUl9NQVgpIHsKKyAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX1N5bnRheEVycm9yOworICAgIH0gZWxzZSB7CisgICAgICAgIHBTZXNzaW9uLT5vdXRwdXRCdWZmZXJTaXplID0gT1VUUFVUX0JVRkZFUl9TSVpFX0lOQ1JFTUVOVDsKKyAgICAgICAgcE91dHB1dC0+ZnJvbUNvbnZlcnREYXRhLnBCdWZmZXIgPSBtYWxsb2MocFNlc3Npb24tPm91dHB1dEJ1ZmZlclNpemUpOworICAgICAgICBpZiAocE91dHB1dC0+ZnJvbUNvbnZlcnREYXRhLnBCdWZmZXIgPT0gTlVMTCkgeworICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX091dE9mTWVtb3J5OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2l6ZV90IGVuY3J5cHRlZFNlc3Npb25LZXlQb3MgPSBUT1BfSEVBREVSX1NJWkUgKyBwU2Vzc2lvbi0+Y29udGVudFR5cGUubGVuZ3RoOworICAgICAgICAgICAgc2l6ZV90IGRhdGFTaWduYXR1cmVQb3MgPSBlbmNyeXB0ZWRTZXNzaW9uS2V5UG9zICsgcFNlc3Npb24tPmVuY3J5cHRlZFNlc3Npb25LZXlMZW5ndGg7CisgICAgICAgICAgICBzaXplX3QgaGVhZGVyU2lnbmF0dXJlUG9zID0gZGF0YVNpZ25hdHVyZVBvcyArIFNIQTFfSEFTSF9TSVpFOworICAgICAgICAgICAgcFNlc3Npb24tPmRhdGFPZmZzZXQgPSBoZWFkZXJTaWduYXR1cmVQb3MgKyBTSEExX0hBU0hfU0laRTsKKyAgICAgICAgICAgIG1lbWNweShwU2Vzc2lvbi0+dG9wSGVhZGVyLCB0b3BIZWFkZXJUZW1wbGF0ZSwgc2l6ZW9mIHRvcEhlYWRlclRlbXBsYXRlKTsKKyAgICAgICAgICAgIHBTZXNzaW9uLT50b3BIZWFkZXJbQ09OVEVOVF9UWVBFX0xFTkdUSF9QT1NdID0KKyAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGNoYXIpcFNlc3Npb24tPmNvbnRlbnRUeXBlLmxlbmd0aDsKKyAgICAgICAgICAgIG1lbWNweShwT3V0cHV0LT5mcm9tQ29udmVydERhdGEucEJ1ZmZlciwgcFNlc3Npb24tPnRvcEhlYWRlciwgVE9QX0hFQURFUl9TSVpFKTsKKyAgICAgICAgICAgIG1lbWNweSgoY2hhciAqKXBPdXRwdXQtPmZyb21Db252ZXJ0RGF0YS5wQnVmZmVyICsgVE9QX0hFQURFUl9TSVpFLAorICAgICAgICAgICAgICAgICAgIHBTZXNzaW9uLT5jb250ZW50VHlwZS5wdHIsIHBTZXNzaW9uLT5jb250ZW50VHlwZS5sZW5ndGgpOworICAgICAgICAgICAgbWVtY3B5KChjaGFyICopcE91dHB1dC0+ZnJvbUNvbnZlcnREYXRhLnBCdWZmZXIgKyBlbmNyeXB0ZWRTZXNzaW9uS2V5UG9zLAorICAgICAgICAgICAgICAgICAgIHBTZXNzaW9uLT5wRW5jcnlwdGVkU2Vzc2lvbktleSwgcFNlc3Npb24tPmVuY3J5cHRlZFNlc3Npb25LZXlMZW5ndGgpOworCisgICAgICAgICAgICAvLyBTZXQgdGhlIHNpZ25hdHVyZXMgdG8gYWxsIHplcm9zIGZvciBub3c7IHRoZXkgd2lsbCBoYXZlIHRvIGJlIHVwZGF0ZWQgbGF0ZXIuCisgICAgICAgICAgICBtZW1zZXQoKGNoYXIgKilwT3V0cHV0LT5mcm9tQ29udmVydERhdGEucEJ1ZmZlciArIGRhdGFTaWduYXR1cmVQb3MsIDAsCisgICAgICAgICAgICAgICAgICAgU0hBMV9IQVNIX1NJWkUpOworICAgICAgICAgICAgbWVtc2V0KChjaGFyICopcE91dHB1dC0+ZnJvbUNvbnZlcnREYXRhLnBCdWZmZXIgKyBoZWFkZXJTaWduYXR1cmVQb3MsIDAsCisgICAgICAgICAgICAgICAgICAgU0hBMV9IQVNIX1NJWkUpOworCisgICAgICAgICAgICBwT3V0cHV0LT5mcm9tQ29udmVydERhdGEubnVtQnl0ZXMgPSBwU2Vzc2lvbi0+ZGF0YU9mZnNldDsKKyAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19PSzsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqIE1hdGNoZXMgdGhlIE1JTUUgaGVhZGVycy4KKyAqCisgKiBAcGFyYW1baW4sb3V0XSBwU2Vzc2lvbiBBIHJlZmVyZW5jZSB0byBhIGNvbnZlcnRlciBzZXNzaW9uLgorICogQHBhcmFtW2luXSBjaCBBIGNoYXJhY3Rlci4KKyAqIEBwYXJhbVtvdXRdIHBPdXRwdXQgVGhlIG91dHB1dCBmcm9tIHRoZSBjb252ZXJzaW9uIHByb2Nlc3MuCisgKgorICogQHJldHVybiBBIHN0YXR1cyBjb2RlLgorICovCitzdGF0aWMgRndkTG9ja0NvbnZfU3RhdHVzX3QgRndkTG9ja0NvbnZfTWF0Y2hNaW1lSGVhZGVycyhGd2RMb2NrQ29udl9TZXNzaW9uX3QgKnBTZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRndkTG9ja0NvbnZfT3V0cHV0X3QgKnBPdXRwdXQpIHsKKyAgICBGd2RMb2NrQ29udl9TdGF0dXNfdCBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfT0s7CisgICAgc3dpdGNoIChwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlKSB7CisgICAgY2FzZSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNNaW1lSGVhZGVyTmFtZVN0YXJ0OgorICAgICAgICBpZiAoRndkTG9ja0NvbnZfSXNNaW1lSGVhZGVyTmFtZUNoYXIoY2gpKSB7CisgICAgICAgICAgICBwU2Vzc2lvbi0+bWltZUhlYWRlck5hbWUubGVuZ3RoID0gMDsKKyAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0cmluZ0FwcGVuZCgmcFNlc3Npb24tPm1pbWVIZWFkZXJOYW1lLCB0b2xvd2VyKGNoKSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IEZ3ZExvY2tDb252X1N0YXR1c19PSykgeworICAgICAgICAgICAgICAgIHBTZXNzaW9uLT5zY2FubmVyU3RhdGUgPSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNNaW1lSGVhZGVyTmFtZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnXHInKSB7CisgICAgICAgICAgICBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlID0gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzTWltZUhlYWRlcnNFbmQ7CisgICAgICAgIH0gZWxzZSBpZiAoIUZ3ZExvY2tDb252X0lzV2hpdGVzcGFjZShjaCkpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19TeW50YXhFcnJvcjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c01pbWVIZWFkZXJOYW1lOgorICAgICAgICBpZiAoRndkTG9ja0NvbnZfSXNNaW1lSGVhZGVyTmFtZUNoYXIoY2gpKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdHJpbmdBcHBlbmQoJnBTZXNzaW9uLT5taW1lSGVhZGVyTmFtZSwgdG9sb3dlcihjaCkpOworICAgICAgICB9IGVsc2UgaWYgKGNoID09ICc6JykgeworICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfUmVjb2duaXplTWltZUhlYWRlck5hbWUocFNlc3Npb24pOworICAgICAgICB9IGVsc2UgaWYgKEZ3ZExvY2tDb252X0lzV2hpdGVzcGFjZShjaCkpIHsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5zY2FubmVyU3RhdGUgPSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNNaW1lSGVhZGVyTmFtZUVuZDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19TeW50YXhFcnJvcjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c01pbWVIZWFkZXJOYW1lRW5kOgorICAgICAgICBpZiAoY2ggPT0gJzonKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9SZWNvZ25pemVNaW1lSGVhZGVyTmFtZShwU2Vzc2lvbik7CisgICAgICAgIH0gZWxzZSBpZiAoIUZ3ZExvY2tDb252X0lzV2hpdGVzcGFjZShjaCkpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19TeW50YXhFcnJvcjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0NvbnRlbnRUeXBlU3RhcnQ6CisgICAgICAgIGlmIChGd2RMb2NrQ29udl9Jc01pbWVIZWFkZXJWYWx1ZUNoYXIoY2gpKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdHJpbmdBcHBlbmQoJnBTZXNzaW9uLT5jb250ZW50VHlwZSwgdG9sb3dlcihjaCkpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBGd2RMb2NrQ29udl9TdGF0dXNfT0spIHsKKyAgICAgICAgICAgICAgICBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlID0gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzQ29udGVudFR5cGU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoIUZ3ZExvY2tDb252X0lzV2hpdGVzcGFjZShjaCkpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19TeW50YXhFcnJvcjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0NvbnRlbnRUeXBlOgorICAgICAgICBpZiAoRndkTG9ja0NvbnZfSXNNaW1lSGVhZGVyVmFsdWVDaGFyKGNoKSkgeworICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RyaW5nQXBwZW5kKCZwU2Vzc2lvbi0+Y29udGVudFR5cGUsIHRvbG93ZXIoY2gpKTsKKyAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnOycpIHsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5zY2FubmVyU3RhdGUgPSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNDUjsKKyAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnXHInKSB7CisgICAgICAgICAgICBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlID0gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzTEY7CisgICAgICAgIH0gZWxzZSBpZiAoRndkTG9ja0NvbnZfSXNXaGl0ZXNwYWNlKGNoKSkgeworICAgICAgICAgICAgcFNlc3Npb24tPnNjYW5uZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c01pbWVIZWFkZXJWYWx1ZUVuZDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19TeW50YXhFcnJvcjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0NvbnRlbnRUcmFuc2ZlckVuY29kaW5nU3RhcnQ6CisgICAgICAgIGlmIChjaCA9PSAnYicgfHwgY2ggPT0gJ0InKSB7CisgICAgICAgICAgICBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlID0gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzX0FfT1JfSTsKKyAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnNycgfHwgY2ggPT0gJzgnKSB7CisgICAgICAgICAgICBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlID0gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzX0I7CisgICAgICAgIH0gZWxzZSBpZiAoIUZ3ZExvY2tDb252X0lzV2hpdGVzcGFjZShjaCkpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19VbnN1cHBvcnRlZENvbnRlbnRUcmFuc2ZlckVuY29kaW5nOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzX0FfT1JfSToKKyAgICAgICAgaWYgKGNoID09ICdpJyB8fCBjaCA9PSAnSScpIHsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5zY2FubmVyU3RhdGUgPSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNfTjsKKyAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnYScgfHwgY2ggPT0gJ0EnKSB7CisgICAgICAgICAgICBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlID0gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzX1M7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfVW5zdXBwb3J0ZWRDb250ZW50VHJhbnNmZXJFbmNvZGluZzsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c19OOgorICAgICAgICBpZiAoY2ggPT0gJ24nIHx8IGNoID09ICdOJykgeworICAgICAgICAgICAgcFNlc3Npb24tPnNjYW5uZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c19BOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX1Vuc3VwcG9ydGVkQ29udGVudFRyYW5zZmVyRW5jb2Rpbmc7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNfQToKKyAgICAgICAgaWYgKGNoID09ICdhJyB8fCBjaCA9PSAnQScpIHsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5zY2FubmVyU3RhdGUgPSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNfUjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19VbnN1cHBvcnRlZENvbnRlbnRUcmFuc2ZlckVuY29kaW5nOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzX1I6CisgICAgICAgIGlmIChjaCA9PSAncicgfHwgY2ggPT0gJ1InKSB7CisgICAgICAgICAgICBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlID0gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzX1k7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfVW5zdXBwb3J0ZWRDb250ZW50VHJhbnNmZXJFbmNvZGluZzsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c19ZOgorICAgICAgICBpZiAoY2ggPT0gJ3knIHx8IGNoID09ICdZJykgeworICAgICAgICAgICAgcFNlc3Npb24tPmNvbnRlbnRUcmFuc2ZlckVuY29kaW5nID0gRndkTG9ja0NvbnZfQ29udGVudFRyYW5zZmVyRW5jb2RpbmdfQmluYXJ5OworICAgICAgICAgICAgcFNlc3Npb24tPnNjYW5uZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0NvbnRlbnRUcmFuc2ZlckVuY29kaW5nRW5kOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX1Vuc3VwcG9ydGVkQ29udGVudFRyYW5zZmVyRW5jb2Rpbmc7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNfUzoKKyAgICAgICAgaWYgKGNoID09ICdzJyB8fCBjaCA9PSAnUycpIHsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5zY2FubmVyU3RhdGUgPSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNfRTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19VbnN1cHBvcnRlZENvbnRlbnRUcmFuc2ZlckVuY29kaW5nOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzX0U6CisgICAgICAgIGlmIChjaCA9PSAnZScgfHwgY2ggPT0gJ0UnKSB7CisgICAgICAgICAgICBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlID0gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzXzY7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfVW5zdXBwb3J0ZWRDb250ZW50VHJhbnNmZXJFbmNvZGluZzsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c182OgorICAgICAgICBpZiAoY2ggPT0gJzYnKSB7CisgICAgICAgICAgICBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlID0gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzXzQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfVW5zdXBwb3J0ZWRDb250ZW50VHJhbnNmZXJFbmNvZGluZzsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c180OgorICAgICAgICBpZiAoY2ggPT0gJzQnKSB7CisgICAgICAgICAgICBwU2Vzc2lvbi0+Y29udGVudFRyYW5zZmVyRW5jb2RpbmcgPSBGd2RMb2NrQ29udl9Db250ZW50VHJhbnNmZXJFbmNvZGluZ19CYXNlNjQ7CisgICAgICAgICAgICBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlID0gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzQ29udGVudFRyYW5zZmVyRW5jb2RpbmdFbmQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfVW5zdXBwb3J0ZWRDb250ZW50VHJhbnNmZXJFbmNvZGluZzsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c19COgorICAgICAgICBpZiAoY2ggPT0gJ2InIHx8IGNoID09ICdCJykgeworICAgICAgICAgICAgcFNlc3Npb24tPnNjYW5uZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c19JOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX1Vuc3VwcG9ydGVkQ29udGVudFRyYW5zZmVyRW5jb2Rpbmc7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNfSToKKyAgICAgICAgaWYgKGNoID09ICdpJyB8fCBjaCA9PSAnSScpIHsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5zY2FubmVyU3RhdGUgPSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNfVDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19VbnN1cHBvcnRlZENvbnRlbnRUcmFuc2ZlckVuY29kaW5nOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzX1Q6CisgICAgICAgIGlmIChjaCA9PSAndCcgfHwgY2ggPT0gJ1QnKSB7CisgICAgICAgICAgICBwU2Vzc2lvbi0+Y29udGVudFRyYW5zZmVyRW5jb2RpbmcgPSBGd2RMb2NrQ29udl9Db250ZW50VHJhbnNmZXJFbmNvZGluZ19CaW5hcnk7CisgICAgICAgICAgICBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlID0gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzQ29udGVudFRyYW5zZmVyRW5jb2RpbmdFbmQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfVW5zdXBwb3J0ZWRDb250ZW50VHJhbnNmZXJFbmNvZGluZzsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0NvbnRlbnRUcmFuc2ZlckVuY29kaW5nRW5kOgorICAgICAgICBpZiAoY2ggPT0gJzsnKSB7CisgICAgICAgICAgICBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlID0gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzQ1I7CisgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJ1xyJykgeworICAgICAgICAgICAgcFNlc3Npb24tPnNjYW5uZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0xGOworICAgICAgICB9IGVsc2UgaWYgKEZ3ZExvY2tDb252X0lzV2hpdGVzcGFjZShjaCkpIHsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5zY2FubmVyU3RhdGUgPSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNNaW1lSGVhZGVyVmFsdWVFbmQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfVW5zdXBwb3J0ZWRDb250ZW50VHJhbnNmZXJFbmNvZGluZzsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c01pbWVIZWFkZXJWYWx1ZUVuZDoKKyAgICAgICAgaWYgKGNoID09ICc7JykgeworICAgICAgICAgICAgcFNlc3Npb24tPnNjYW5uZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0NSOworICAgICAgICB9IGVsc2UgaWYgKGNoID09ICdccicpIHsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5zY2FubmVyU3RhdGUgPSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNMRjsKKyAgICAgICAgfSBlbHNlIGlmICghRndkTG9ja0NvbnZfSXNXaGl0ZXNwYWNlKGNoKSkgeworICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX1N5bnRheEVycm9yOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzQ1I6CisgICAgICAgIGlmIChjaCA9PSAnXHInKSB7CisgICAgICAgICAgICBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlID0gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzTEY7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNMRjoKKyAgICAgICAgaWYgKGNoID09ICdcbicpIHsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5zY2FubmVyU3RhdGUgPSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNNaW1lSGVhZGVyTmFtZVN0YXJ0OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX1N5bnRheEVycm9yOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzTWltZUhlYWRlcnNFbmQ6CisgICAgICAgIGlmIChjaCA9PSAnXG4nKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9BcHBseURlZmF1bHRzKHBTZXNzaW9uKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gRndkTG9ja0NvbnZfU3RhdHVzX09LKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfVmVyaWZ5Q29udGVudFR5cGUocFNlc3Npb24pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBGd2RMb2NrQ29udl9TdGF0dXNfT0spIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9Xcml0ZUhlYWRlcihwU2Vzc2lvbiwgcE91dHB1dCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IEZ3ZExvY2tDb252X1N0YXR1c19PSykgeworICAgICAgICAgICAgICAgIGlmIChwU2Vzc2lvbi0+Y29udGVudFRyYW5zZmVyRW5jb2RpbmcgPT0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZ3ZExvY2tDb252X0NvbnRlbnRUcmFuc2ZlckVuY29kaW5nX0JpbmFyeSkgeworICAgICAgICAgICAgICAgICAgICBwU2Vzc2lvbi0+cGFyc2VyU3RhdGUgPSBGd2RMb2NrQ29udl9QYXJzZXJTdGF0ZV9XYW50c0JpbmFyeUVuY29kZWREYXRhOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHBTZXNzaW9uLT5wYXJzZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1BhcnNlclN0YXRlX1dhbnRzQmFzZTY0RW5jb2RlZERhdGE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBTZXNzaW9uLT5zY2FubmVyU3RhdGUgPSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNCeXRlMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19TeW50YXhFcnJvcjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfUHJvZ3JhbUVycm9yOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBJbmNyZW1lbnRzIHRoZSBjb3VudGVyLCB0cmVhdGVkIGFzIGEgMTYtYnl0ZSBsaXR0bGUtZW5kaWFuIG51bWJlciwgYnkgb25lLgorICoKKyAqIEBwYXJhbVtpbixvdXRdIHBTZXNzaW9uIEEgcmVmZXJlbmNlIHRvIGEgY29udmVydGVyIHNlc3Npb24uCisgKi8KK3N0YXRpYyB2b2lkIEZ3ZExvY2tDb252X0luY3JlbWVudENvdW50ZXIoRndkTG9ja0NvbnZfU2Vzc2lvbl90ICpwU2Vzc2lvbikgeworICAgIHNpemVfdCBpID0gMDsKKyAgICB3aGlsZSAoKCsrcFNlc3Npb24tPmNvdW50ZXJbaV0gPT0gMCkgJiYgKCsraSA8IEFFU19CTE9DS19TSVpFKSkKKyAgICAgICAgOworfQorCisvKioKKyAqIEVuY3J5cHRzIHRoZSBnaXZlbiBjaGFyYWN0ZXIgYW5kIHdyaXRlcyBpdCB0byB0aGUgb3V0cHV0IGJ1ZmZlci4KKyAqCisgKiBAcGFyYW1baW4sb3V0XSBwU2Vzc2lvbiBBIHJlZmVyZW5jZSB0byBhIGNvbnZlcnRlciBzZXNzaW9uLgorICogQHBhcmFtW2luXSBjaCBUaGUgY2hhcmFjdGVyIHRvIGVuY3J5cHQgYW5kIHdyaXRlLgorICogQHBhcmFtW2luLG91dF0gcE91dHB1dCBUaGUgb3V0cHV0IGZyb20gdGhlIGNvbnZlcnNpb24gcHJvY2Vzcy4KKyAqCisgKiBAcmV0dXJuIEEgc3RhdHVzIGNvZGUuCisgKi8KK3N0YXRpYyBGd2RMb2NrQ29udl9TdGF0dXNfdCBGd2RMb2NrQ29udl9Xcml0ZUVuY3J5cHRlZENoYXIoRndkTG9ja0NvbnZfU2Vzc2lvbl90ICpwU2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRndkTG9ja0NvbnZfT3V0cHV0X3QgKnBPdXRwdXQpIHsKKyAgICBpZiAocE91dHB1dC0+ZnJvbUNvbnZlcnREYXRhLm51bUJ5dGVzID09IHBTZXNzaW9uLT5vdXRwdXRCdWZmZXJTaXplKSB7CisgICAgICAgIHZvaWQgKnBCdWZmZXI7CisgICAgICAgIHBTZXNzaW9uLT5vdXRwdXRCdWZmZXJTaXplICs9IE9VVFBVVF9CVUZGRVJfU0laRV9JTkNSRU1FTlQ7CisgICAgICAgIHBCdWZmZXIgPSByZWFsbG9jKHBPdXRwdXQtPmZyb21Db252ZXJ0RGF0YS5wQnVmZmVyLCBwU2Vzc2lvbi0+b3V0cHV0QnVmZmVyU2l6ZSk7CisgICAgICAgIGlmIChwQnVmZmVyID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBGd2RMb2NrQ29udl9TdGF0dXNfT3V0T2ZNZW1vcnk7CisgICAgICAgIH0KKyAgICAgICAgcE91dHB1dC0+ZnJvbUNvbnZlcnREYXRhLnBCdWZmZXIgPSBwQnVmZmVyOworICAgIH0KKyAgICBpZiAoKytwU2Vzc2lvbi0+a2V5U3RyZWFtSW5kZXggPT0gQUVTX0JMT0NLX1NJWkUpIHsKKyAgICAgICAgRndkTG9ja0NvbnZfSW5jcmVtZW50Q291bnRlcihwU2Vzc2lvbik7CisgICAgICAgIHBTZXNzaW9uLT5rZXlTdHJlYW1JbmRleCA9IDA7CisgICAgfQorICAgIGlmIChwU2Vzc2lvbi0+a2V5U3RyZWFtSW5kZXggPT0gMCkgeworICAgICAgICBBRVNfZW5jcnlwdChwU2Vzc2lvbi0+Y291bnRlciwgcFNlc3Npb24tPmtleVN0cmVhbSwgJnBTZXNzaW9uLT5lbmNyeXB0aW9uUm91bmRLZXlzKTsKKyAgICB9CisgICAgY2ggXj0gcFNlc3Npb24tPmtleVN0cmVhbVtwU2Vzc2lvbi0+a2V5U3RyZWFtSW5kZXhdOworICAgICgodW5zaWduZWQgY2hhciAqKXBPdXRwdXQtPmZyb21Db252ZXJ0RGF0YS5wQnVmZmVyKVtwT3V0cHV0LT5mcm9tQ29udmVydERhdGEubnVtQnl0ZXMrK10gPSBjaDsKKyAgICArK3BTZXNzaW9uLT5udW1EYXRhQnl0ZXM7CisgICAgcmV0dXJuIEZ3ZExvY2tDb252X1N0YXR1c19PSzsKK30KKworLyoqCisgKiBNYXRjaGVzIGJpbmFyeS1lbmNvZGVkIGNvbnRlbnQgZGF0YSBhbmQgZW5jcnlwdHMgaXQsIHdoaWxlIGxvb2tpbmcgb3V0IGZvciB0aGUgY2xvc2UgZGVsaW1pdGVyLgorICoKKyAqIEBwYXJhbVtpbixvdXRdIHBTZXNzaW9uIEEgcmVmZXJlbmNlIHRvIGEgY29udmVydGVyIHNlc3Npb24uCisgKiBAcGFyYW1baW5dIGNoIEEgY2hhcmFjdGVyLgorICogQHBhcmFtW2luLG91dF0gcE91dHB1dCBUaGUgb3V0cHV0IGZyb20gdGhlIGNvbnZlcnNpb24gcHJvY2Vzcy4KKyAqCisgKiBAcmV0dXJuIEEgc3RhdHVzIGNvZGUuCisgKi8KK3N0YXRpYyBGd2RMb2NrQ29udl9TdGF0dXNfdCBGd2RMb2NrQ29udl9NYXRjaEJpbmFyeUVuY29kZWREYXRhKEZ3ZExvY2tDb252X1Nlc3Npb25fdCAqcFNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGd2RMb2NrQ29udl9PdXRwdXRfdCAqcE91dHB1dCkgeworICAgIEZ3ZExvY2tDb252X1N0YXR1c190IHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19PSzsKKyAgICBzd2l0Y2ggKHBTZXNzaW9uLT5zY2FubmVyU3RhdGUpIHsKKyAgICBjYXNlIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0J5dGUxOgorICAgICAgICBpZiAoY2ggIT0gcFNlc3Npb24tPmRlbGltaXRlcltwU2Vzc2lvbi0+ZGVsaW1pdGVyTWF0Y2hQb3NdKSB7CisgICAgICAgICAgICAvLyBUaGUgcGFydGlhbCBtYXRjaCBvZiB0aGUgZGVsaW1pdGVyIHR1cm5lZCBvdXQgdG8gYmUgc3B1cmlvdXMuIEZsdXNoIHRoZSBtYXRjaGVkIGJ5dGVzCisgICAgICAgICAgICAvLyB0byB0aGUgb3V0cHV0IGJ1ZmZlciBhbmQgc3RhcnQgb3Zlci4KKyAgICAgICAgICAgIHNpemVfdCBpOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBTZXNzaW9uLT5kZWxpbWl0ZXJNYXRjaFBvczsgKytpKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfV3JpdGVFbmNyeXB0ZWRDaGFyKHBTZXNzaW9uLCBwU2Vzc2lvbi0+ZGVsaW1pdGVyW2ldLCBwT3V0cHV0KTsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IEZ3ZExvY2tDb252X1N0YXR1c19PSykgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBTZXNzaW9uLT5kZWxpbWl0ZXJNYXRjaFBvcyA9IDA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNoICE9IHBTZXNzaW9uLT5kZWxpbWl0ZXJbcFNlc3Npb24tPmRlbGltaXRlck1hdGNoUG9zXSkgeworICAgICAgICAgICAgLy8gVGhlIGN1cnJlbnQgY2hhcmFjdGVyIGlzbid0IHBhcnQgb2YgdGhlIGRlbGltaXRlci4gV3JpdGUgaXQgdG8gdGhlIG91dHB1dCBidWZmZXIuCisgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9Xcml0ZUVuY3J5cHRlZENoYXIocFNlc3Npb24sIGNoLCBwT3V0cHV0KTsKKyAgICAgICAgfSBlbHNlIGlmICgrK3BTZXNzaW9uLT5kZWxpbWl0ZXJNYXRjaFBvcyA9PSBwU2Vzc2lvbi0+ZGVsaW1pdGVyTGVuZ3RoKSB7CisgICAgICAgICAgICAvLyBUaGUgZW50aXJlIGRlbGltaXRlciBoYXMgYmVlbiBtYXRjaGVkLiBUaGUgb25seSB2YWxpZCBjaGFyYWN0ZXJzIG5vdyBhcmUgdGhlICItLSIKKyAgICAgICAgICAgIC8vIHRoYXQgY29tcGxldGUgdGhlIGNsb3NlIGRlbGltaXRlciAobm8gbW9yZSBtZXNzYWdlIHBhcnRzIGFyZSBleHBlY3RlZCkuCisgICAgICAgICAgICBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlID0gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzRmlyc3REYXNoOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzRmlyc3REYXNoOgorICAgICAgICBpZiAoY2ggPT0gJy0nKSB7CisgICAgICAgICAgICBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlID0gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzU2Vjb25kRGFzaDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19TeW50YXhFcnJvcjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c1NlY29uZERhc2g6CisgICAgICAgIGlmIChjaCA9PSAnLScpIHsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5wYXJzZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1BhcnNlclN0YXRlX0RvbmU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfU3ludGF4RXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX1Byb2dyYW1FcnJvcjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICogQ2hlY2tzIHdoZXRoZXIgYSBnaXZlbiBjaGFyYWN0ZXIgaXMgdmFsaWQgaW4gYmFzZTY0LWVuY29kZWQgZGF0YS4KKyAqCisgKiBAcGFyYW1baW5dIGNoIFRoZSBjaGFyYWN0ZXIgdG8gY2hlY2suCisgKgorICogQHJldHVybiBBIEJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBnaXZlbiBjaGFyYWN0ZXIgaXMgdmFsaWQgaW4gYmFzZTY0LWVuY29kZWQgZGF0YS4KKyAqLworc3RhdGljIGludCBGd2RMb2NrQ29udl9Jc0Jhc2U2NENoYXIoaW50IGNoKSB7CisgICAgcmV0dXJuIDAgPD0gY2ggJiYgY2ggPD0gJ3onICYmIGJhc2U2NFZhbHVlc1tjaF0gPj0gMDsKK30KKworLyoqCisgKiBNYXRjaGVzIGJhc2U2NC1lbmNvZGVkIGNvbnRlbnQgZGF0YSBhbmQgZW5jcnlwdHMgaXQsIHdoaWxlIGxvb2tpbmcgb3V0IGZvciB0aGUgY2xvc2UgZGVsaW1pdGVyLgorICoKKyAqIEBwYXJhbVtpbixvdXRdIHBTZXNzaW9uIEEgcmVmZXJlbmNlIHRvIGEgY29udmVydGVyIHNlc3Npb24uCisgKiBAcGFyYW1baW5dIGNoIEEgY2hhcmFjdGVyLgorICogQHBhcmFtW2luLG91dF0gcE91dHB1dCBUaGUgb3V0cHV0IGZyb20gdGhlIGNvbnZlcnNpb24gcHJvY2Vzcy4KKyAqCisgKiBAcmV0dXJuIEEgc3RhdHVzIGNvZGUuCisgKi8KK3N0YXRpYyBGd2RMb2NrQ29udl9TdGF0dXNfdCBGd2RMb2NrQ29udl9NYXRjaEJhc2U2NEVuY29kZWREYXRhKEZ3ZExvY2tDb252X1Nlc3Npb25fdCAqcFNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGd2RMb2NrQ29udl9PdXRwdXRfdCAqcE91dHB1dCkgeworICAgIEZ3ZExvY2tDb252X1N0YXR1c190IHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19PSzsKKyAgICBzd2l0Y2ggKHBTZXNzaW9uLT5zY2FubmVyU3RhdGUpIHsKKyAgICBjYXNlIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0J5dGUxOgorICAgIGNhc2UgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzQnl0ZTFfQWZ0ZXJDUkxGOgorICAgICAgICBpZiAoRndkTG9ja0NvbnZfSXNCYXNlNjRDaGFyKGNoKSkgeworICAgICAgICAgICAgcFNlc3Npb24tPmNoID0gYmFzZTY0VmFsdWVzW2NoXSA8PCAyOworICAgICAgICAgICAgcFNlc3Npb24tPnNjYW5uZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0J5dGUyOworICAgICAgICB9IGVsc2UgaWYgKGNoID09ICdccicpIHsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5zYXZlZFNjYW5uZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0J5dGUxX0FmdGVyQ1JMRjsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5zY2FubmVyU3RhdGUgPSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNMRjsKKyAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnLScpIHsKKyAgICAgICAgICAgIGlmIChwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlID09IEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0J5dGUxX0FmdGVyQ1JMRikgeworICAgICAgICAgICAgICAgIHBTZXNzaW9uLT5kZWxpbWl0ZXJNYXRjaFBvcyA9IDM7CisgICAgICAgICAgICAgICAgcFNlc3Npb24tPnNjYW5uZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0RlbGltaXRlcjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX1N5bnRheEVycm9yOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKCFGd2RMb2NrQ29udl9Jc1doaXRlc3BhY2UoY2gpKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfU3ludGF4RXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNCeXRlMjoKKyAgICAgICAgaWYgKEZ3ZExvY2tDb252X0lzQmFzZTY0Q2hhcihjaCkpIHsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5jaCB8PSBiYXNlNjRWYWx1ZXNbY2hdID4+IDQ7CisgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9Xcml0ZUVuY3J5cHRlZENoYXIocFNlc3Npb24sIHBTZXNzaW9uLT5jaCwgcE91dHB1dCk7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IEZ3ZExvY2tDb252X1N0YXR1c19PSykgeworICAgICAgICAgICAgICAgIHBTZXNzaW9uLT5jaCA9IGJhc2U2NFZhbHVlc1tjaF0gPDwgNDsKKyAgICAgICAgICAgICAgICBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlID0gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzQnl0ZTM7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJ1xyJykgeworICAgICAgICAgICAgcFNlc3Npb24tPnNhdmVkU2Nhbm5lclN0YXRlID0gcFNlc3Npb24tPnNjYW5uZXJTdGF0ZTsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5zY2FubmVyU3RhdGUgPSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNMRjsKKyAgICAgICAgfSBlbHNlIGlmICghRndkTG9ja0NvbnZfSXNXaGl0ZXNwYWNlKGNoKSkgeworICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX1N5bnRheEVycm9yOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzQnl0ZTM6CisgICAgICAgIGlmIChGd2RMb2NrQ29udl9Jc0Jhc2U2NENoYXIoY2gpKSB7CisgICAgICAgICAgICBwU2Vzc2lvbi0+Y2ggfD0gYmFzZTY0VmFsdWVzW2NoXSA+PiAyOworICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfV3JpdGVFbmNyeXB0ZWRDaGFyKHBTZXNzaW9uLCBwU2Vzc2lvbi0+Y2gsIHBPdXRwdXQpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBGd2RMb2NrQ29udl9TdGF0dXNfT0spIHsKKyAgICAgICAgICAgICAgICBwU2Vzc2lvbi0+Y2ggPSBiYXNlNjRWYWx1ZXNbY2hdIDw8IDY7CisgICAgICAgICAgICAgICAgcFNlc3Npb24tPnNjYW5uZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0J5dGU0OworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGNoID09ICdccicpIHsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5zYXZlZFNjYW5uZXJTdGF0ZSA9IHBTZXNzaW9uLT5zY2FubmVyU3RhdGU7CisgICAgICAgICAgICBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlID0gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzTEY7CisgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJz0nKSB7CisgICAgICAgICAgICBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlID0gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzUGFkZGluZzsKKyAgICAgICAgfSBlbHNlIGlmICghRndkTG9ja0NvbnZfSXNXaGl0ZXNwYWNlKGNoKSkgeworICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX1N5bnRheEVycm9yOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzQnl0ZTQ6CisgICAgICAgIGlmIChGd2RMb2NrQ29udl9Jc0Jhc2U2NENoYXIoY2gpKSB7CisgICAgICAgICAgICBwU2Vzc2lvbi0+Y2ggfD0gYmFzZTY0VmFsdWVzW2NoXTsKKyAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1dyaXRlRW5jcnlwdGVkQ2hhcihwU2Vzc2lvbiwgcFNlc3Npb24tPmNoLCBwT3V0cHV0KTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gRndkTG9ja0NvbnZfU3RhdHVzX09LKSB7CisgICAgICAgICAgICAgICAgcFNlc3Npb24tPnNjYW5uZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0J5dGUxOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGNoID09ICdccicpIHsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5zYXZlZFNjYW5uZXJTdGF0ZSA9IHBTZXNzaW9uLT5zY2FubmVyU3RhdGU7CisgICAgICAgICAgICBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlID0gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzTEY7CisgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJz0nKSB7CisgICAgICAgICAgICBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlID0gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzV2hpdGVzcGFjZTsKKyAgICAgICAgfSBlbHNlIGlmICghRndkTG9ja0NvbnZfSXNXaGl0ZXNwYWNlKGNoKSkgeworICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX1N5bnRheEVycm9yOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzTEY6CisgICAgICAgIGlmIChjaCA9PSAnXG4nKSB7CisgICAgICAgICAgICBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlID0gcFNlc3Npb24tPnNhdmVkU2Nhbm5lclN0YXRlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX1N5bnRheEVycm9yOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzUGFkZGluZzoKKyAgICAgICAgaWYgKGNoID09ICc9JykgeworICAgICAgICAgICAgcFNlc3Npb24tPnNjYW5uZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c1doaXRlc3BhY2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfU3ludGF4RXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNXaGl0ZXNwYWNlOgorICAgIGNhc2UgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzV2hpdGVzcGFjZV9BZnRlckNSTEY6CisgICAgICAgIGlmIChjaCA9PSAnXHInKSB7CisgICAgICAgICAgICBwU2Vzc2lvbi0+c2F2ZWRTY2FubmVyU3RhdGUgPSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNXaGl0ZXNwYWNlX0FmdGVyQ1JMRjsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5zY2FubmVyU3RhdGUgPSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNMRjsKKyAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnLScpIHsKKyAgICAgICAgICAgIGlmIChwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlID09IEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c1doaXRlc3BhY2VfQWZ0ZXJDUkxGKSB7CisgICAgICAgICAgICAgICAgcFNlc3Npb24tPmRlbGltaXRlck1hdGNoUG9zID0gMzsKKyAgICAgICAgICAgICAgICBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlID0gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzRGVsaW1pdGVyOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfU3ludGF4RXJyb3I7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoRndkTG9ja0NvbnZfSXNXaGl0ZXNwYWNlKGNoKSkgeworICAgICAgICAgICAgcFNlc3Npb24tPnNjYW5uZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c1doaXRlc3BhY2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfU3ludGF4RXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNEZWxpbWl0ZXI6CisgICAgICAgIGlmIChjaCAhPSBwU2Vzc2lvbi0+ZGVsaW1pdGVyW3BTZXNzaW9uLT5kZWxpbWl0ZXJNYXRjaFBvc10pIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19TeW50YXhFcnJvcjsKKyAgICAgICAgfSBlbHNlIGlmICgrK3BTZXNzaW9uLT5kZWxpbWl0ZXJNYXRjaFBvcyA9PSBwU2Vzc2lvbi0+ZGVsaW1pdGVyTGVuZ3RoKSB7CisgICAgICAgICAgICBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlID0gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzRmlyc3REYXNoOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzRmlyc3REYXNoOgorICAgICAgICBpZiAoY2ggPT0gJy0nKSB7CisgICAgICAgICAgICBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlID0gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzU2Vjb25kRGFzaDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19TeW50YXhFcnJvcjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c1NlY29uZERhc2g6CisgICAgICAgIGlmIChjaCA9PSAnLScpIHsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5wYXJzZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1BhcnNlclN0YXRlX0RvbmU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfU3ludGF4RXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX1Byb2dyYW1FcnJvcjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICogUHVzaGVzIGEgc2luZ2xlIGNoYXJhY3RlciBpbnRvIHRoZSBjb252ZXJ0ZXIncyBzdGF0ZSBtYWNoaW5lLgorICoKKyAqIEBwYXJhbVtpbixvdXRdIHBTZXNzaW9uIEEgcmVmZXJlbmNlIHRvIGEgY29udmVydGVyIHNlc3Npb24uCisgKiBAcGFyYW1baW5dIGNoIEEgY2hhcmFjdGVyLgorICogQHBhcmFtW2luLG91dF0gcE91dHB1dCBUaGUgb3V0cHV0IGZyb20gdGhlIGNvbnZlcnNpb24gcHJvY2Vzcy4KKyAqCisgKiBAcmV0dXJuIEEgc3RhdHVzIGNvZGUuCisgKi8KK3N0YXRpYyBGd2RMb2NrQ29udl9TdGF0dXNfdCBGd2RMb2NrQ29udl9QdXNoQ2hhcihGd2RMb2NrQ29udl9TZXNzaW9uX3QgKnBTZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGd2RMb2NrQ29udl9PdXRwdXRfdCAqcE91dHB1dCkgeworICAgIEZ3ZExvY2tDb252X1N0YXR1c190IHN0YXR1czsKKyAgICArK3BTZXNzaW9uLT5udW1DaGFyc0NvbnN1bWVkOworICAgIHN3aXRjaCAocFNlc3Npb24tPnBhcnNlclN0YXRlKSB7CisgICAgY2FzZSBGd2RMb2NrQ29udl9QYXJzZXJTdGF0ZV9XYW50c09wZW5EZWxpbWl0ZXI6CisgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X01hdGNoT3BlbkRlbGltaXRlcihwU2Vzc2lvbiwgY2gpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEZ3ZExvY2tDb252X1BhcnNlclN0YXRlX1dhbnRzTWltZUhlYWRlcnM6CisgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X01hdGNoTWltZUhlYWRlcnMocFNlc3Npb24sIGNoLCBwT3V0cHV0KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGd2RMb2NrQ29udl9QYXJzZXJTdGF0ZV9XYW50c0JpbmFyeUVuY29kZWREYXRhOgorICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9NYXRjaEJpbmFyeUVuY29kZWREYXRhKHBTZXNzaW9uLCBjaCwgcE91dHB1dCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRndkTG9ja0NvbnZfUGFyc2VyU3RhdGVfV2FudHNCYXNlNjRFbmNvZGVkRGF0YToKKyAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfTWF0Y2hCYXNlNjRFbmNvZGVkRGF0YShwU2Vzc2lvbiwgY2gsIHBPdXRwdXQpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEZ3ZExvY2tDb252X1BhcnNlclN0YXRlX0RvbmU6CisgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19PSzsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX1Byb2dyYW1FcnJvcjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK0Z3ZExvY2tDb252X1N0YXR1c190IEZ3ZExvY2tDb252X09wZW5TZXNzaW9uKGludCAqcFNlc3Npb25JZCwgRndkTG9ja0NvbnZfT3V0cHV0X3QgKnBPdXRwdXQpIHsKKyAgICBGd2RMb2NrQ29udl9TdGF0dXNfdCBzdGF0dXM7CisgICAgaWYgKHBTZXNzaW9uSWQgPT0gTlVMTCB8fCBwT3V0cHV0ID09IE5VTEwpIHsKKyAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX0ludmFsaWRBcmd1bWVudDsKKyAgICB9IGVsc2UgeworICAgICAgICAqcFNlc3Npb25JZCA9IEZ3ZExvY2tDb252X0FjcXVpcmVTZXNzaW9uKCk7CisgICAgICAgIGlmICgqcFNlc3Npb25JZCA8IDApIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19Ub29NYW55U2Vzc2lvbnM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBGd2RMb2NrQ29udl9TZXNzaW9uX3QgKnBTZXNzaW9uID0gc2Vzc2lvblB0cnNbKnBTZXNzaW9uSWRdOworICAgICAgICAgICAgcFNlc3Npb24tPmVuY3J5cHRlZFNlc3Npb25LZXlMZW5ndGggPSBGd2RMb2NrR2x1ZV9HZXRFbmNyeXB0ZWRLZXlMZW5ndGgoS0VZX1NJWkUpOworICAgICAgICAgICAgaWYgKHBTZXNzaW9uLT5lbmNyeXB0ZWRTZXNzaW9uS2V5TGVuZ3RoIDwgQUVTX0JMT0NLX1NJWkUpIHsKKyAgICAgICAgICAgICAgICAvLyBUaGUgZW5jcnlwdGVkIHNlc3Npb24ga2V5IGlzIHVzZWQgYXMgdGhlIENUUi1tb2RlIG5vbmNlLCBzbyBpdCBtdXN0IGJlIGF0IGxlYXN0CisgICAgICAgICAgICAgICAgLy8gdGhlIHNpemUgb2YgYSBzaW5nbGUgQUVTIGJsb2NrLgorICAgICAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19Qcm9ncmFtRXJyb3I7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHBTZXNzaW9uLT5wRW5jcnlwdGVkU2Vzc2lvbktleSA9IG1hbGxvYyhwU2Vzc2lvbi0+ZW5jcnlwdGVkU2Vzc2lvbktleUxlbmd0aCk7CisgICAgICAgICAgICAgICAgaWYgKHBTZXNzaW9uLT5wRW5jcnlwdGVkU2Vzc2lvbktleSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19PdXRPZk1lbW9yeTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAoIUZ3ZExvY2tHbHVlX0dldFJhbmRvbU51bWJlcihwU2Vzc2lvbi0+c2Vzc2lvbktleSwgS0VZX1NJWkUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfUmFuZG9tTnVtYmVyR2VuZXJhdGlvbkZhaWxlZDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghRndkTG9ja0dsdWVfRW5jcnlwdEtleShwU2Vzc2lvbi0+c2Vzc2lvbktleSwgS0VZX1NJWkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNlc3Npb24tPnBFbmNyeXB0ZWRTZXNzaW9uS2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZXNzaW9uLT5lbmNyeXB0ZWRTZXNzaW9uS2V5TGVuZ3RoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX0tleUVuY3J5cHRpb25GYWlsZWQ7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9EZXJpdmVLZXlzKHBTZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IEZ3ZExvY2tDb252X1N0YXR1c19PSykgeworICAgICAgICAgICAgICAgICAgICAgICAgbWVtc2V0KHBTZXNzaW9uLT5zZXNzaW9uS2V5LCAwLCBLRVlfU0laRSk7IC8vIFplcm8gb3V0IGtleSBkYXRhLgorICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KHBTZXNzaW9uLT5jb3VudGVyLCBwU2Vzc2lvbi0+cEVuY3J5cHRlZFNlc3Npb25LZXksIEFFU19CTE9DS19TSVpFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBTZXNzaW9uLT5wYXJzZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1BhcnNlclN0YXRlX1dhbnRzT3BlbkRlbGltaXRlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBTZXNzaW9uLT5zY2FubmVyU3RhdGUgPSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNGaXJzdERhc2g7CisgICAgICAgICAgICAgICAgICAgICAgICBwU2Vzc2lvbi0+bnVtQ2hhcnNDb25zdW1lZCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBwU2Vzc2lvbi0+ZGVsaW1pdGVyTWF0Y2hQb3MgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgcFNlc3Npb24tPm1pbWVIZWFkZXJOYW1lID0gbnVsbFN0cmluZzsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBTZXNzaW9uLT5jb250ZW50VHlwZSA9IG51bGxTdHJpbmc7CisgICAgICAgICAgICAgICAgICAgICAgICBwU2Vzc2lvbi0+Y29udGVudFRyYW5zZmVyRW5jb2RpbmcgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGd2RMb2NrQ29udl9Db250ZW50VHJhbnNmZXJFbmNvZGluZ19VbmRlZmluZWQ7CisgICAgICAgICAgICAgICAgICAgICAgICBwU2Vzc2lvbi0+a2V5U3RyZWFtSW5kZXggPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBPdXRwdXQtPmZyb21Db252ZXJ0RGF0YS5wQnVmZmVyID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBPdXRwdXQtPmZyb21Db252ZXJ0RGF0YS5lcnJvclBvcyA9IElOVkFMSURfT0ZGU0VUOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShwU2Vzc2lvbi0+cEVuY3J5cHRlZFNlc3Npb25LZXkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBGd2RMb2NrQ29udl9TdGF0dXNfT0spIHsKKyAgICAgICAgICAgICAgICBGd2RMb2NrQ29udl9SZWxlYXNlU2Vzc2lvbigqcFNlc3Npb25JZCk7CisgICAgICAgICAgICAgICAgKnBTZXNzaW9uSWQgPSAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitGd2RMb2NrQ29udl9TdGF0dXNfdCBGd2RMb2NrQ29udl9Db252ZXJ0RGF0YShpbnQgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqcEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBudW1CeXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ3ZExvY2tDb252X091dHB1dF90ICpwT3V0cHV0KSB7CisgICAgRndkTG9ja0NvbnZfU3RhdHVzX3Qgc3RhdHVzOworICAgIGlmICghRndkTG9ja0NvbnZfSXNWYWxpZFNlc3Npb24oc2Vzc2lvbklkKSB8fCBwQnVmZmVyID09IE5VTEwgfHwgcE91dHB1dCA9PSBOVUxMKSB7CisgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19JbnZhbGlkQXJndW1lbnQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc2l6ZV90IGk7CisgICAgICAgIEZ3ZExvY2tDb252X1Nlc3Npb25fdCAqcFNlc3Npb24gPSBzZXNzaW9uUHRyc1tzZXNzaW9uSWRdOworICAgICAgICBwU2Vzc2lvbi0+ZGF0YU9mZnNldCA9IDA7CisgICAgICAgIHBTZXNzaW9uLT5udW1EYXRhQnl0ZXMgPSAwOworICAgICAgICBwT3V0cHV0LT5mcm9tQ29udmVydERhdGEubnVtQnl0ZXMgPSAwOworICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfT0s7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bUJ5dGVzOyArK2kpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1B1c2hDaGFyKHBTZXNzaW9uLCAoKGNoYXIgKilwQnVmZmVyKVtpXSwgcE91dHB1dCk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IEZ3ZExvY2tDb252X1N0YXR1c19PSykgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChzdGF0dXMgPT0gRndkTG9ja0NvbnZfU3RhdHVzX09LKSB7CisgICAgICAgICAgICAvLyBVcGRhdGUgdGhlIGRhdGEgc2lnbmF0dXJlLgorICAgICAgICAgICAgSE1BQ19VcGRhdGUoJnBTZXNzaW9uLT5zaWduaW5nQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICYoKHVuc2lnbmVkIGNoYXIgKilwT3V0cHV0LT5mcm9tQ29udmVydERhdGEucEJ1ZmZlcilbcFNlc3Npb24tPmRhdGFPZmZzZXRdLAorICAgICAgICAgICAgICAgICAgICAgICAgcFNlc3Npb24tPm51bURhdGFCeXRlcyk7CisgICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09IEZ3ZExvY2tDb252X1N0YXR1c19TeW50YXhFcnJvcikgeworICAgICAgICAgICAgcE91dHB1dC0+ZnJvbUNvbnZlcnREYXRhLmVycm9yUG9zID0gcFNlc3Npb24tPm51bUNoYXJzQ29uc3VtZWQ7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworRndkTG9ja0NvbnZfU3RhdHVzX3QgRndkTG9ja0NvbnZfQ2xvc2VTZXNzaW9uKGludCBzZXNzaW9uSWQsIEZ3ZExvY2tDb252X091dHB1dF90ICpwT3V0cHV0KSB7CisgICAgRndkTG9ja0NvbnZfU3RhdHVzX3Qgc3RhdHVzOworICAgIGlmICghRndkTG9ja0NvbnZfSXNWYWxpZFNlc3Npb24oc2Vzc2lvbklkKSB8fCBwT3V0cHV0ID09IE5VTEwpIHsKKyAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX0ludmFsaWRBcmd1bWVudDsKKyAgICB9IGVsc2UgeworICAgICAgICBGd2RMb2NrQ29udl9TZXNzaW9uX3QgKnBTZXNzaW9uID0gc2Vzc2lvblB0cnNbc2Vzc2lvbklkXTsKKyAgICAgICAgZnJlZShwT3V0cHV0LT5mcm9tQ29udmVydERhdGEucEJ1ZmZlcik7CisgICAgICAgIGlmIChwU2Vzc2lvbi0+cGFyc2VyU3RhdGUgIT0gRndkTG9ja0NvbnZfUGFyc2VyU3RhdGVfRG9uZSkgeworICAgICAgICAgICAgcE91dHB1dC0+ZnJvbUNsb3NlU2Vzc2lvbi5lcnJvclBvcyA9IHBTZXNzaW9uLT5udW1DaGFyc0NvbnN1bWVkOworICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX1N5bnRheEVycm9yOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gRmluYWxpemUgdGhlIGRhdGEgc2lnbmF0dXJlLgorICAgICAgICAgICAgc2l6ZV90IHNpZ25hdHVyZVNpemU7CisgICAgICAgICAgICBITUFDX0ZpbmFsKCZwU2Vzc2lvbi0+c2lnbmluZ0NvbnRleHQsIHBPdXRwdXQtPmZyb21DbG9zZVNlc3Npb24uc2lnbmF0dXJlcywKKyAgICAgICAgICAgICAgICAgICAgICAgJnNpZ25hdHVyZVNpemUpOworICAgICAgICAgICAgaWYgKHNpZ25hdHVyZVNpemUgIT0gU0hBMV9IQVNIX1NJWkUpIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfUHJvZ3JhbUVycm9yOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBDYWxjdWxhdGUgdGhlIGhlYWRlciBzaWduYXR1cmUsIHdoaWNoIGlzIGEgc2lnbmF0dXJlIG9mIHRoZSByZXN0IG9mIHRoZSBoZWFkZXIKKyAgICAgICAgICAgICAgICAvLyBpbmNsdWRpbmcgdGhlIGRhdGEgc2lnbmF0dXJlLgorICAgICAgICAgICAgICAgIEhNQUNfSW5pdF9leCgmcFNlc3Npb24tPnNpZ25pbmdDb250ZXh0LCBOVUxMLCBLRVlfU0laRSwgTlVMTCwgTlVMTCk7CisgICAgICAgICAgICAgICAgSE1BQ19VcGRhdGUoJnBTZXNzaW9uLT5zaWduaW5nQ29udGV4dCwgcFNlc3Npb24tPnRvcEhlYWRlciwgVE9QX0hFQURFUl9TSVpFKTsKKyAgICAgICAgICAgICAgICBITUFDX1VwZGF0ZSgmcFNlc3Npb24tPnNpZ25pbmdDb250ZXh0LCAodW5zaWduZWQgY2hhciAqKXBTZXNzaW9uLT5jb250ZW50VHlwZS5wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNlc3Npb24tPmNvbnRlbnRUeXBlLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgSE1BQ19VcGRhdGUoJnBTZXNzaW9uLT5zaWduaW5nQ29udGV4dCwgcFNlc3Npb24tPnBFbmNyeXB0ZWRTZXNzaW9uS2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZXNzaW9uLT5lbmNyeXB0ZWRTZXNzaW9uS2V5TGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBITUFDX1VwZGF0ZSgmcFNlc3Npb24tPnNpZ25pbmdDb250ZXh0LCBwT3V0cHV0LT5mcm9tQ2xvc2VTZXNzaW9uLnNpZ25hdHVyZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlU2l6ZSk7CisgICAgICAgICAgICAgICAgSE1BQ19GaW5hbCgmcFNlc3Npb24tPnNpZ25pbmdDb250ZXh0LCAmcE91dHB1dC0+ZnJvbUNsb3NlU2Vzc2lvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25hdHVyZXNbc2lnbmF0dXJlU2l6ZV0sICZzaWduYXR1cmVTaXplKTsKKyAgICAgICAgICAgICAgICBpZiAoc2lnbmF0dXJlU2l6ZSAhPSBTSEExX0hBU0hfU0laRSkgeworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfUHJvZ3JhbUVycm9yOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHBPdXRwdXQtPmZyb21DbG9zZVNlc3Npb24uZmlsZU9mZnNldCA9IFRPUF9IRUFERVJfU0laRSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNlc3Npb24tPmNvbnRlbnRUeXBlLmxlbmd0aCArIHBTZXNzaW9uLT5lbmNyeXB0ZWRTZXNzaW9uS2V5TGVuZ3RoOworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfT0s7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcE91dHB1dC0+ZnJvbUNsb3NlU2Vzc2lvbi5lcnJvclBvcyA9IElOVkFMSURfT0ZGU0VUOworICAgICAgICB9CisgICAgICAgIGZyZWUocFNlc3Npb24tPm1pbWVIZWFkZXJOYW1lLnB0cik7CisgICAgICAgIGZyZWUocFNlc3Npb24tPmNvbnRlbnRUeXBlLnB0cik7CisgICAgICAgIGZyZWUocFNlc3Npb24tPnBFbmNyeXB0ZWRTZXNzaW9uS2V5KTsKKyAgICAgICAgSE1BQ19DVFhfY2xlYW51cCgmcFNlc3Npb24tPnNpZ25pbmdDb250ZXh0KTsKKyAgICAgICAgRndkTG9ja0NvbnZfUmVsZWFzZVNlc3Npb24oc2Vzc2lvbklkKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworRndkTG9ja0NvbnZfU3RhdHVzX3QgRndkTG9ja0NvbnZfQ29udmVydE9wZW5GaWxlKGludCBpbnB1dEZpbGVEZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ3ZExvY2tDb252X1JlYWRGdW5jX3QgKmZwUmVhZEZ1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG91dHB1dEZpbGVEZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ3ZExvY2tDb252X1dyaXRlRnVuY190ICpmcFdyaXRlRnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGd2RMb2NrQ29udl9MU2Vla0Z1bmNfdCAqZnBMU2Vla0Z1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2ZmNjRfdCAqcEVycm9yUG9zKSB7CisgICAgRndkTG9ja0NvbnZfU3RhdHVzX3Qgc3RhdHVzOworICAgIGlmIChwRXJyb3JQb3MgIT0gTlVMTCkgeworICAgICAgICAqcEVycm9yUG9zID0gSU5WQUxJRF9PRkZTRVQ7CisgICAgfQorICAgIGlmIChmcFJlYWRGdW5jID09IE5VTEwgfHwgZnBXcml0ZUZ1bmMgPT0gTlVMTCB8fCBmcExTZWVrRnVuYyA9PSBOVUxMIHx8IGlucHV0RmlsZURlc2MgPCAwIHx8CisgICAgICAgIG91dHB1dEZpbGVEZXNjIDwgMCkgeworICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfSW52YWxpZEFyZ3VtZW50OworICAgIH0gZWxzZSB7CisgICAgICAgIGNoYXIgKnBSZWFkQnVmZmVyID0gbWFsbG9jKFJFQURfQlVGRkVSX1NJWkUpOworICAgICAgICBpZiAocFJlYWRCdWZmZXIgPT0gTlVMTCkgeworICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX091dE9mTWVtb3J5OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW50IHNlc3Npb25JZDsKKyAgICAgICAgICAgIEZ3ZExvY2tDb252X091dHB1dF90IG91dHB1dDsKKyAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X09wZW5TZXNzaW9uKCZzZXNzaW9uSWQsICZvdXRwdXQpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBGd2RMb2NrQ29udl9TdGF0dXNfT0spIHsKKyAgICAgICAgICAgICAgICBzc2l6ZV90IG51bUJ5dGVzUmVhZDsKKyAgICAgICAgICAgICAgICBGd2RMb2NrQ29udl9TdGF0dXNfdCBjbG9zZVN0YXR1czsKKyAgICAgICAgICAgICAgICB3aGlsZSAoKG51bUJ5dGVzUmVhZCA9CisgICAgICAgICAgICAgICAgICAgICAgICBmcFJlYWRGdW5jKGlucHV0RmlsZURlc2MsIHBSZWFkQnVmZmVyLCBSRUFEX0JVRkZFUl9TSVpFKSkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X0NvbnZlcnREYXRhKHNlc3Npb25JZCwgcFJlYWRCdWZmZXIsIChzaXplX3QpbnVtQnl0ZXNSZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBGd2RMb2NrQ29udl9TdGF0dXNfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvdXRwdXQuZnJvbUNvbnZlcnREYXRhLnBCdWZmZXIgIT0gTlVMTCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC5mcm9tQ29udmVydERhdGEubnVtQnl0ZXMgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3NpemVfdCBudW1CeXRlc1dyaXR0ZW4gPSBmcFdyaXRlRnVuYyhvdXRwdXRGaWxlRGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC5mcm9tQ29udmVydERhdGEucEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC5mcm9tQ29udmVydERhdGEubnVtQnl0ZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudW1CeXRlc1dyaXR0ZW4gIT0gKHNzaXplX3Qpb3V0cHV0LmZyb21Db252ZXJ0RGF0YS5udW1CeXRlcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfRmlsZVdyaXRlRXJyb3I7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gRndkTG9ja0NvbnZfU3RhdHVzX1N5bnRheEVycm9yICYmIHBFcnJvclBvcyAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBFcnJvclBvcyA9IG91dHB1dC5mcm9tQ29udmVydERhdGEuZXJyb3JQb3M7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gLy8gZW5kIHdoaWxlCisgICAgICAgICAgICAgICAgaWYgKG51bUJ5dGVzUmVhZCA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX0ZpbGVSZWFkRXJyb3I7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNsb3NlU3RhdHVzID0gRndkTG9ja0NvbnZfQ2xvc2VTZXNzaW9uKHNlc3Npb25JZCwgJm91dHB1dCk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBGd2RMb2NrQ29udl9TdGF0dXNfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsb3NlU3RhdHVzICE9IEZ3ZExvY2tDb252X1N0YXR1c19PSykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsb3NlU3RhdHVzID09IEZ3ZExvY2tDb252X1N0YXR1c19TeW50YXhFcnJvciAmJiBwRXJyb3JQb3MgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwRXJyb3JQb3MgPSBvdXRwdXQuZnJvbUNsb3NlU2Vzc2lvbi5lcnJvclBvczsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IGNsb3NlU3RhdHVzOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZwTFNlZWtGdW5jKG91dHB1dEZpbGVEZXNjLCBvdXRwdXQuZnJvbUNsb3NlU2Vzc2lvbi5maWxlT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFRUtfU0VUKSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19GaWxlU2Vla0Vycm9yOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZwV3JpdGVGdW5jKG91dHB1dEZpbGVEZXNjLCBvdXRwdXQuZnJvbUNsb3NlU2Vzc2lvbi5zaWduYXR1cmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZXRF9MT0NLX1NJR05BVFVSRVNfU0laRSkgIT0gRldEX0xPQ0tfU0lHTkFUVVJFU19TSVpFKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfRmlsZVdyaXRlRXJyb3I7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmcmVlKHBSZWFkQnVmZmVyKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitGd2RMb2NrQ29udl9TdGF0dXNfdCBGd2RMb2NrQ29udl9Db252ZXJ0RmlsZShjb25zdCBjaGFyICpwSW5wdXRGaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnBPdXRwdXRGaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZjY0X3QgKnBFcnJvclBvcykgeworICAgIEZ3ZExvY2tDb252X1N0YXR1c190IHN0YXR1czsKKyAgICBpZiAocEVycm9yUG9zICE9IE5VTEwpIHsKKyAgICAgICAgKnBFcnJvclBvcyA9IElOVkFMSURfT0ZGU0VUOworICAgIH0KKyAgICBpZiAocElucHV0RmlsZW5hbWUgPT0gTlVMTCB8fCBwT3V0cHV0RmlsZW5hbWUgPT0gTlVMTCkgeworICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfSW52YWxpZEFyZ3VtZW50OworICAgIH0gZWxzZSB7CisgICAgICAgIGludCBpbnB1dEZpbGVEZXNjID0gb3BlbihwSW5wdXRGaWxlbmFtZSwgT19SRE9OTFkpOworICAgICAgICBpZiAoaW5wdXRGaWxlRGVzYyA8IDApIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19GaWxlTm90Rm91bmQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbnQgb3V0cHV0RmlsZURlc2MgPSBvcGVuKHBPdXRwdXRGaWxlbmFtZSwgT19DUkVBVCB8IE9fVFJVTkMgfCBPX1dST05MWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU19JUlVTUiB8IFNfSVdVU1IgfCBTX0lSR1JQIHwgU19JUk9USCk7CisgICAgICAgICAgICBpZiAob3V0cHV0RmlsZURlc2MgPCAwKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX0ZpbGVDcmVhdGlvbkZhaWxlZDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfQ29udmVydE9wZW5GaWxlKGlucHV0RmlsZURlc2MsIHJlYWQsIG91dHB1dEZpbGVEZXNjLCB3cml0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHNlZWs2NCwgcEVycm9yUG9zKTsKKyAgICAgICAgICAgICAgICBpZiAoY2xvc2Uob3V0cHV0RmlsZURlc2MpID09IDAgJiYgc3RhdHVzICE9IEZ3ZExvY2tDb252X1N0YXR1c19PSykgeworICAgICAgICAgICAgICAgICAgICByZW1vdmUocE91dHB1dEZpbGVuYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAodm9pZCljbG9zZShpbnB1dEZpbGVEZXNjKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQpkaWZmIC0tZ2l0IGEvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9pbnRlcm5hbC1mb3JtYXQvY29udmVydGVyL0Z3ZExvY2tDb252LmggYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9jb252ZXJ0ZXIvRndkTG9ja0NvbnYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjBjMGMzCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9pbnRlcm5hbC1mb3JtYXQvY29udmVydGVyL0Z3ZExvY2tDb252LmgKQEAgLTAsMCArMSwyODIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9fRldETE9DS0NPTlZfSF9fCisjZGVmaW5lIF9fRldETE9DS0NPTlZfSF9fCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisvKioKKyAqIFRoZSBzaXplIG9mIHRoZSBkYXRhIGFuZCBoZWFkZXIgc2lnbmF0dXJlcyBjb21iaW5lZC4gVGhlIHNpZ25hdHVyZXMgYXJlIGFkamFjZW50IHRvIGVhY2ggb3RoZXIgaW4KKyAqIHRoZSBwcm9kdWNlZCBvdXRwdXQgZmlsZS4KKyAqLworI2RlZmluZSBGV0RfTE9DS19TSUdOQVRVUkVTX1NJWkUgKDIgKiAyMCkKKworLyoqCisgKiBEYXRhIHR5cGUgZm9yIHRoZSBvdXRwdXQgZnJvbSBGd2RMb2NrQ29udl9Db252ZXJ0RGF0YS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgRndkTG9ja0NvbnZfQ29udmVydERhdGFfT3V0cHV0IHsKKyAgICAvLy8gVGhlIGNvbnZlcnRlZCBkYXRhLgorICAgIHZvaWQgKnBCdWZmZXI7CisKKyAgICAvLy8gVGhlIHNpemUgb2YgdGhlIGNvbnZlcnRlZCBkYXRhLgorICAgIHNpemVfdCBudW1CeXRlczsKKworICAgIC8vLyBUaGUgZmlsZSBwb3NpdGlvbiB3aGVyZSB0aGUgZXJyb3Igb2NjdXJyZWQsIGluIHRoZSBjYXNlIG9mIGEgc3ludGF4IGVycm9yLgorICAgIG9mZjY0X3QgZXJyb3JQb3M7Cit9IEZ3ZExvY2tDb252X0NvbnZlcnREYXRhX091dHB1dF90OworCisvKioKKyAqIERhdGEgdHlwZSBmb3IgdGhlIG91dHB1dCBmcm9tIEZ3ZExvY2tDb252X0Nsb3NlU2Vzc2lvbi4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgRndkTG9ja0NvbnZfQ2xvc2VTZXNzaW9uX091dHB1dCB7CisgICAgLy8vIFRoZSBmaW5hbCBzZXQgb2Ygc2lnbmF0dXJlcy4KKyAgICB1bnNpZ25lZCBjaGFyIHNpZ25hdHVyZXNbRldEX0xPQ0tfU0lHTkFUVVJFU19TSVpFXTsKKworICAgIC8vLyBUaGUgb2Zmc2V0IGluIHRoZSBwcm9kdWNlZCBvdXRwdXQgZmlsZSB3aGVyZSB0aGUgc2lnbmF0dXJlcyBhcmUgbG9jYXRlZC4KKyAgICBvZmY2NF90IGZpbGVPZmZzZXQ7CisKKyAgICAvLy8gVGhlIGZpbGUgcG9zaXRpb24gd2hlcmUgdGhlIGVycm9yIG9jY3VycmVkLCBpbiB0aGUgY2FzZSBvZiBhIHN5bnRheCBlcnJvci4KKyAgICBvZmY2NF90IGVycm9yUG9zOworfSBGd2RMb2NrQ29udl9DbG9zZVNlc3Npb25fT3V0cHV0X3Q7CisKKy8qKgorICogRGF0YSB0eXBlIGZvciB0aGUgb3V0cHV0IGZyb20gdGhlIGNvbnZlcnNpb24gcHJvY2Vzcy4KKyAqLwordHlwZWRlZiB1bmlvbiBGd2RMb2NrQ29udl9PdXRwdXQgeworICAgIEZ3ZExvY2tDb252X0NvbnZlcnREYXRhX091dHB1dF90IGZyb21Db252ZXJ0RGF0YTsKKyAgICBGd2RMb2NrQ29udl9DbG9zZVNlc3Npb25fT3V0cHV0X3QgZnJvbUNsb3NlU2Vzc2lvbjsKK30gRndkTG9ja0NvbnZfT3V0cHV0X3Q7CisKKy8qKgorICogRGF0YSB0eXBlIGZvciB0aGUgUG9zaXgtc3R5bGUgcmVhZCBmdW5jdGlvbiB1c2VkIGJ5IHRoZSBjb252ZXJ0ZXIgaW4gcHVsbCBtb2RlLgorICoKKyAqIEBwYXJhbVtpbl0gZmlsZURlc2MgVGhlIGZpbGUgZGVzY3JpcHRvciBvZiBhIGZpbGUgb3BlbmVkIGZvciByZWFkaW5nLgorICogQHBhcmFtW291dF0gcEJ1ZmZlciBBIHJlZmVyZW5jZSB0byB0aGUgYnVmZmVyIHRoYXQgc2hvdWxkIHJlY2VpdmUgdGhlIHJlYWQgZGF0YS4KKyAqIEBwYXJhbVtpbl0gbnVtQnl0ZXMgVGhlIG51bWJlciBvZiBieXRlcyB0byByZWFkLgorICoKKyAqIEByZXR1cm4gVGhlIG51bWJlciBvZiBieXRlcyByZWFkLgorICogQHJldHZhbCAtMSBGYWlsdXJlLgorICovCit0eXBlZGVmIHNzaXplX3QgRndkTG9ja0NvbnZfUmVhZEZ1bmNfdChpbnQgZmlsZURlc2MsIHZvaWQgKnBCdWZmZXIsIHNpemVfdCBudW1CeXRlcyk7CisKKy8qKgorICogRGF0YSB0eXBlIGZvciB0aGUgUG9zaXgtc3R5bGUgd3JpdGUgZnVuY3Rpb24gdXNlZCBieSB0aGUgY29udmVydGVyIGluIHB1bGwgbW9kZS4KKyAqCisgKiBAcGFyYW1baW5dIGZpbGVEZXNjIFRoZSBmaWxlIGRlc2NyaXB0b3Igb2YgYSBmaWxlIG9wZW5lZCBmb3Igd3JpdGluZy4KKyAqIEBwYXJhbVtpbl0gcEJ1ZmZlciBBIHJlZmVyZW5jZSB0byB0aGUgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIGRhdGEgdG8gYmUgd3JpdHRlbi4KKyAqIEBwYXJhbVtpbl0gbnVtQnl0ZXMgVGhlIG51bWJlciBvZiBieXRlcyB0byB3cml0ZS4KKyAqCisgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbi4KKyAqIEByZXR2YWwgLTEgRmFpbHVyZS4KKyAqLwordHlwZWRlZiBzc2l6ZV90IEZ3ZExvY2tDb252X1dyaXRlRnVuY190KGludCBmaWxlRGVzYywgY29uc3Qgdm9pZCAqcEJ1ZmZlciwgc2l6ZV90IG51bUJ5dGVzKTsKKworLyoqCisgKiBEYXRhIHR5cGUgZm9yIHRoZSBQb3NpeC1zdHlsZSBsc2VlayBmdW5jdGlvbiB1c2VkIGJ5IHRoZSBjb252ZXJ0ZXIgaW4gcHVsbCBtb2RlLgorICoKKyAqIEBwYXJhbVtpbl0gZmlsZURlc2MgVGhlIGZpbGUgZGVzY3JpcHRvciBvZiBhIGZpbGUgb3BlbmVkIGZvciB3cml0aW5nLgorICogQHBhcmFtW2luXSBvZmZzZXQgVGhlIG9mZnNldCB3aXRoIHdoaWNoIHRvIHVwZGF0ZSB0aGUgZmlsZSBwb3NpdGlvbi4KKyAqIEBwYXJhbVtpbl0gd2hlbmNlIE9uZSBvZiBTRUVLX1NFVCwgU0VFS19DVVIsIGFuZCBTRUVLX0VORC4KKyAqCisgKiBAcmV0dXJuIFRoZSBuZXcgZmlsZSBwb3NpdGlvbi4KKyAqIEByZXR2YWwgKChvZmY2NF90KS0xKSBGYWlsdXJlLgorICovCit0eXBlZGVmIG9mZjY0X3QgRndkTG9ja0NvbnZfTFNlZWtGdW5jX3QoaW50IGZpbGVEZXNjLCBvZmY2NF90IG9mZnNldCwgaW50IHdoZW5jZSk7CisKKy8qKgorICogVGhlIHN0YXR1cyBjb2RlcyByZXR1cm5lZCBieSB0aGUgY29udmVydGVyIGZ1bmN0aW9ucy4KKyAqLwordHlwZWRlZiBlbnVtIEZ3ZExvY2tDb252X1N0YXR1cyB7CisgICAgLy8vIFRoZSBvcGVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwuCisgICAgRndkTG9ja0NvbnZfU3RhdHVzX09LID0gMCwKKworICAgIC8vLyBBbiBhY3R1YWwgYXJndW1lbnQgdG8gdGhlIGZ1bmN0aW9uIGlzIGludmFsaWQgKGEgcHJvZ3JhbSBlcnJvciBvbiB0aGUgY2FsbGVyJ3MgcGFydCkuCisgICAgRndkTG9ja0NvbnZfU3RhdHVzX0ludmFsaWRBcmd1bWVudCA9IDEsCisKKyAgICAvLy8gVGhlcmUgaXMgbm90IGVub3VnaCBmcmVlIGR5bmFtaWMgbWVtb3J5IHRvIGNvbXBsZXRlIHRoZSBvcGVyYXRpb24uCisgICAgRndkTG9ja0NvbnZfU3RhdHVzX091dE9mTWVtb3J5ID0gMiwKKworICAgIC8vLyBBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBvcGVuaW5nIHRoZSBpbnB1dCBmaWxlLgorICAgIEZ3ZExvY2tDb252X1N0YXR1c19GaWxlTm90Rm91bmQgPSAzLAorCisgICAgLy8vIEFuIGVycm9yIG9jY3VycmVkIHdoaWxlIGNyZWF0aW5nIHRoZSBvdXRwdXQgZmlsZS4KKyAgICBGd2RMb2NrQ29udl9TdGF0dXNfRmlsZUNyZWF0aW9uRmFpbGVkID0gNCwKKworICAgIC8vLyBBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSByZWFkaW5nIGZyb20gdGhlIGlucHV0IGZpbGUuCisgICAgRndkTG9ja0NvbnZfU3RhdHVzX0ZpbGVSZWFkRXJyb3IgPSA1LAorCisgICAgLy8vIEFuIGVycm9yIG9jY3VycmVkIHdoaWxlIHdyaXRpbmcgdG8gdGhlIG91dHB1dCBmaWxlLgorICAgIEZ3ZExvY2tDb252X1N0YXR1c19GaWxlV3JpdGVFcnJvciA9IDYsCisKKyAgICAvLy8gQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgc2Vla2luZyB0byBhIG5ldyBmaWxlIHBvc2l0aW9uIHdpdGhpbiB0aGUgb3V0cHV0IGZpbGUuCisgICAgRndkTG9ja0NvbnZfU3RhdHVzX0ZpbGVTZWVrRXJyb3IgPSA3LAorCisgICAgLy8vIFRoZSBpbnB1dCBmaWxlIGlzIG5vdCBhIHN5bnRhY3RpY2FsbHkgY29ycmVjdCBPTUEgRFJNIHYxIEZvcndhcmQgTG9jayBmaWxlLgorICAgIEZ3ZExvY2tDb252X1N0YXR1c19TeW50YXhFcnJvciA9IDgsCisKKyAgICAvLy8gU3VwcG9ydCBmb3IgdGhpcyBEUk0gZmlsZSBmb3JtYXQgaGFzIGJlZW4gZGlzYWJsZWQgaW4gdGhlIGN1cnJlbnQgcHJvZHVjdCBjb25maWd1cmF0aW9uLgorICAgIEZ3ZExvY2tDb252X1N0YXR1c19VbnN1cHBvcnRlZEZpbGVGb3JtYXQgPSA5LAorCisgICAgLy8vIFRoZSBjb250ZW50IHRyYW5zZmVyIGVuY29kaW5nIGlzIG5vdCBvbmUgb2YgImJpbmFyeSIsICJiYXNlNjQiLCAiN2JpdCIsIG9yICI4Yml0IgorICAgIC8vLyAoY2FzZS1pbnNlbnNpdGl2ZSkuCisgICAgRndkTG9ja0NvbnZfU3RhdHVzX1Vuc3VwcG9ydGVkQ29udGVudFRyYW5zZmVyRW5jb2RpbmcgPSAxMCwKKworICAgIC8vLyBUaGUgZ2VuZXJhdGlvbiBvZiBhIHJhbmRvbSBudW1iZXIgZmFpbGVkLgorICAgIEZ3ZExvY2tDb252X1N0YXR1c19SYW5kb21OdW1iZXJHZW5lcmF0aW9uRmFpbGVkID0gMTEsCisKKyAgICAvLy8gS2V5IGVuY3J5cHRpb24gZmFpbGVkLgorICAgIEZ3ZExvY2tDb252X1N0YXR1c19LZXlFbmNyeXB0aW9uRmFpbGVkID0gMTIsCisKKyAgICAvLy8gVGhlIGNhbGN1bGF0aW9uIG9mIGEga2V5ZWQgaGFzaCBmb3IgaW50ZWdyaXR5IHByb3RlY3Rpb24gZmFpbGVkLgorICAgIEZ3ZExvY2tDb252X1N0YXR1c19JbnRlZ3JpdHlQcm90ZWN0aW9uRmFpbGVkID0gMTMsCisKKyAgICAvLy8gVGhlcmUgYXJlIHRvbyBtYW55IG9uZ29pbmcgc2Vzc2lvbnMgZm9yIGFub3RoZXIgb25lIHRvIGJlIG9wZW5lZC4KKyAgICBGd2RMb2NrQ29udl9TdGF0dXNfVG9vTWFueVNlc3Npb25zID0gMTQsCisKKyAgICAvLy8gQW4gdW5leHBlY3RlZCBlcnJvciBvY2N1cnJlZC4KKyAgICBGd2RMb2NrQ29udl9TdGF0dXNfUHJvZ3JhbUVycm9yID0gMTUKK30gRndkTG9ja0NvbnZfU3RhdHVzX3Q7CisKKy8qKgorICogT3BlbnMgYSBzZXNzaW9uIGZvciBjb252ZXJ0aW5nIGFuIE9NQSBEUk0gdjEgRm9yd2FyZCBMb2NrIGZpbGUgdG8gdGhlIGludGVybmFsIEZvcndhcmQgTG9jayBmaWxlCisgKiBmb3JtYXQuCisgKgorICogQHBhcmFtW291dF0gcFNlc3Npb25JZCBUaGUgc2Vzc2lvbiBJRC4KKyAqIEBwYXJhbVtvdXRdIHBPdXRwdXQgVGhlIG91dHB1dCBmcm9tIHRoZSBjb252ZXJzaW9uIHByb2Nlc3MgKGluaXRpYWxpemVkKS4KKyAqCisgKiBAcmV0dXJuIEEgc3RhdHVzIGNvZGUuCisgKiBAcmV0dmFsIEZ3ZExvY2tDb252X1N0YXR1c19PSworICogQHJldHZhbCBGd2RMb2NrQ29udl9TdGF0dXNfSW52YWxpZEFyZ3VtZW50CisgKiBAcmV0dmFsIEZ3ZExvY2tDb252X1N0YXR1c19Ub29NYW55U2Vzc2lvbnMKKyAqLworRndkTG9ja0NvbnZfU3RhdHVzX3QgRndkTG9ja0NvbnZfT3BlblNlc3Npb24oaW50ICpwU2Vzc2lvbklkLCBGd2RMb2NrQ29udl9PdXRwdXRfdCAqcE91dHB1dCk7CisKKy8qKgorICogU3VwcGxpZXMgdGhlIGNvbnZlcnRlciB3aXRoIGRhdGEgdG8gY29udmVydC4gVGhlIGNhbGxlciBpcyBleHBlY3RlZCB0byB3cml0ZSB0aGUgY29udmVydGVkIGRhdGEKKyAqIHRvIGZpbGUuIENhbiBiZSBjYWxsZWQgYW4gYXJiaXRyYXJ5IG51bWJlciBvZiB0aW1lcy4KKyAqCisgKiBAcGFyYW1baW5dIHNlc3Npb25JZCBUaGUgc2Vzc2lvbiBJRC4KKyAqIEBwYXJhbVtpbl0gcEJ1ZmZlciBBIHJlZmVyZW5jZSB0byBhIGJ1ZmZlciBjb250YWluaW5nIHRoZSBkYXRhIHRvIGNvbnZlcnQuCisgKiBAcGFyYW1baW5dIG51bUJ5dGVzIFRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gY29udmVydC4KKyAqIEBwYXJhbVtpbixvdXRdIHBPdXRwdXQgVGhlIG91dHB1dCBmcm9tIHRoZSBjb252ZXJzaW9uIHByb2Nlc3MgKGFsbG9jYXRlZC9yZWFsbG9jYXRlZCkuCisgKgorICogQHJldHVybiBBIHN0YXR1cyBjb2RlLgorICogQHJldHZhbCBGd2RMb2NrQ29udl9TdGF0dXNfT0sKKyAqIEByZXR2YWwgRndkTG9ja0NvbnZfU3RhdHVzX0ludmFsaWRBcmd1bWVudAorICogQHJldHZhbCBGd2RMb2NrQ29udl9TdGF0dXNfT3V0T2ZNZW1vcnkKKyAqIEByZXR2YWwgRndkTG9ja0NvbnZfU3RhdHVzX1N5bnRheEVycm9yCisgKiBAcmV0dmFsIEZ3ZExvY2tDb252X1N0YXR1c19VbnN1cHBvcnRlZEZpbGVGb3JtYXQKKyAqIEByZXR2YWwgRndkTG9ja0NvbnZfU3RhdHVzX1Vuc3VwcG9ydGVkQ29udGVudFRyYW5zZmVyRW5jb2RpbmcKKyAqIEByZXR2YWwgRndkTG9ja0NvbnZfU3RhdHVzX1JhbmRvbU51bWJlckdlbmVyYXRpb25GYWlsZWQKKyAqIEByZXR2YWwgRndkTG9ja0NvbnZfU3RhdHVzX0tleUVuY3J5cHRpb25GYWlsZWQKKyAqIEByZXR2YWwgRndkTG9ja0NvbnZfU3RhdHVzX0RhdGFFbmNyeXB0aW9uRmFpbGVkCisgKi8KK0Z3ZExvY2tDb252X1N0YXR1c190IEZ3ZExvY2tDb252X0NvbnZlcnREYXRhKGludCBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpwQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG51bUJ5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRndkTG9ja0NvbnZfT3V0cHV0X3QgKnBPdXRwdXQpOworCisvKioKKyAqIENsb3NlcyBhIHNlc3Npb24gZm9yIGNvbnZlcnRpbmcgYW4gT01BIERSTSB2MSBGb3J3YXJkIExvY2sgZmlsZSB0byB0aGUgaW50ZXJuYWwgRm9yd2FyZCBMb2NrCisgKiBmaWxlIGZvcm1hdC4gVGhlIGNhbGxlciBtdXN0IHVwZGF0ZSB0aGUgcHJvZHVjZWQgb3V0cHV0IGZpbGUgYXQgdGhlIGluZGljYXRlZCBmaWxlIG9mZnNldCB3aXRoCisgKiB0aGUgZmluYWwgc2V0IG9mIHNpZ25hdHVyZXMuCisgKgorICogQHBhcmFtW2luXSBzZXNzaW9uSWQgVGhlIHNlc3Npb24gSUQuCisgKiBAcGFyYW1baW4sb3V0XSBwT3V0cHV0IFRoZSBvdXRwdXQgZnJvbSB0aGUgY29udmVyc2lvbiBwcm9jZXNzIChkZWFsbG9jYXRlZCBhbmQgb3ZlcndyaXR0ZW4pLgorICoKKyAqIEByZXR1cm4gQSBzdGF0dXMgY29kZS4KKyAqIEByZXR2YWwgRndkTG9ja0NvbnZfU3RhdHVzX09LCisgKiBAcmV0dmFsIEZ3ZExvY2tDb252X1N0YXR1c19JbnZhbGlkQXJndW1lbnQKKyAqIEByZXR2YWwgRndkTG9ja0NvbnZfU3RhdHVzX091dE9mTWVtb3J5CisgKiBAcmV0dmFsIEZ3ZExvY2tDb252X1N0YXR1c19JbnRlZ3JpdHlQcm90ZWN0aW9uRmFpbGVkCisgKi8KK0Z3ZExvY2tDb252X1N0YXR1c190IEZ3ZExvY2tDb252X0Nsb3NlU2Vzc2lvbihpbnQgc2Vzc2lvbklkLCBGd2RMb2NrQ29udl9PdXRwdXRfdCAqcE91dHB1dCk7CisKKy8qKgorICogQ29udmVydHMgYW4gb3BlbiBPTUEgRFJNIHYxIEZvcndhcmQgTG9jayBmaWxlIHRvIHRoZSBpbnRlcm5hbCBGb3J3YXJkIExvY2sgZmlsZSBmb3JtYXQgaW4gcHVsbAorICogbW9kZS4KKyAqCisgKiBAcGFyYW1baW5dIGlucHV0RmlsZURlc2MgVGhlIGZpbGUgZGVzY3JpcHRvciBvZiB0aGUgb3BlbiBpbnB1dCBmaWxlLgorICogQHBhcmFtW2luXSBmcFJlYWRGdW5jIEEgcmVmZXJlbmNlIHRvIGEgcmVhZCBmdW5jdGlvbiB0aGF0IGNhbiBvcGVyYXRlIG9uIHRoZSBvcGVuIGlucHV0IGZpbGUuCisgKiBAcGFyYW1baW5dIG91dHB1dEZpbGVEZXNjIFRoZSBmaWxlIGRlc2NyaXB0b3Igb2YgdGhlIG9wZW4gb3V0cHV0IGZpbGUuCisgKiBAcGFyYW1baW5dIGZwV3JpdGVGdW5jIEEgcmVmZXJlbmNlIHRvIGEgd3JpdGUgZnVuY3Rpb24gdGhhdCBjYW4gb3BlcmF0ZSBvbiB0aGUgb3BlbiBvdXRwdXQgZmlsZS4KKyAqIEBwYXJhbVtpbl0gZnBMU2Vla0Z1bmMgQSByZWZlcmVuY2UgdG8gYW4gbHNlZWsgZnVuY3Rpb24gdGhhdCBjYW4gb3BlcmF0ZSBvbiB0aGUgb3BlbiBvdXRwdXQgZmlsZS4KKyAqIEBwYXJhbVtvdXRdIHBFcnJvclBvcworICogICBUaGUgZmlsZSBwb3NpdGlvbiB3aGVyZSB0aGUgZXJyb3Igb2NjdXJyZWQsIGluIHRoZSBjYXNlIG9mIGEgc3ludGF4IGVycm9yLiBNYXkgYmUgTlVMTC4KKyAqCisgKiBAcmV0dXJuIEEgc3RhdHVzIGNvZGUuCisgKiBAcmV0dmFsIEZ3ZExvY2tDb252X1N0YXR1c19PSworICogQHJldHZhbCBGd2RMb2NrQ29udl9TdGF0dXNfSW52YWxpZEFyZ3VtZW50CisgKiBAcmV0dmFsIEZ3ZExvY2tDb252X1N0YXR1c19PdXRPZk1lbW9yeQorICogQHJldHZhbCBGd2RMb2NrQ29udl9TdGF0dXNfRmlsZVJlYWRFcnJvcgorICogQHJldHZhbCBGd2RMb2NrQ29udl9TdGF0dXNfRmlsZVdyaXRlRXJyb3IKKyAqIEByZXR2YWwgRndkTG9ja0NvbnZfU3RhdHVzX0ZpbGVTZWVrRXJyb3IKKyAqIEByZXR2YWwgRndkTG9ja0NvbnZfU3RhdHVzX1N5bnRheEVycm9yCisgKiBAcmV0dmFsIEZ3ZExvY2tDb252X1N0YXR1c19VbnN1cHBvcnRlZEZpbGVGb3JtYXQKKyAqIEByZXR2YWwgRndkTG9ja0NvbnZfU3RhdHVzX1Vuc3VwcG9ydGVkQ29udGVudFRyYW5zZmVyRW5jb2RpbmcKKyAqIEByZXR2YWwgRndkTG9ja0NvbnZfU3RhdHVzX1JhbmRvbU51bWJlckdlbmVyYXRpb25GYWlsZWQKKyAqIEByZXR2YWwgRndkTG9ja0NvbnZfU3RhdHVzX0tleUVuY3J5cHRpb25GYWlsZWQKKyAqIEByZXR2YWwgRndkTG9ja0NvbnZfU3RhdHVzX0RhdGFFbmNyeXB0aW9uRmFpbGVkCisgKiBAcmV0dmFsIEZ3ZExvY2tDb252X1N0YXR1c19JbnRlZ3JpdHlQcm90ZWN0aW9uRmFpbGVkCisgKiBAcmV0dmFsIEZ3ZExvY2tDb252X1N0YXR1c19Ub29NYW55U2Vzc2lvbnMKKyAqLworRndkTG9ja0NvbnZfU3RhdHVzX3QgRndkTG9ja0NvbnZfQ29udmVydE9wZW5GaWxlKGludCBpbnB1dEZpbGVEZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ3ZExvY2tDb252X1JlYWRGdW5jX3QgKmZwUmVhZEZ1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG91dHB1dEZpbGVEZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ3ZExvY2tDb252X1dyaXRlRnVuY190ICpmcFdyaXRlRnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGd2RMb2NrQ29udl9MU2Vla0Z1bmNfdCAqZnBMU2Vla0Z1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2ZmNjRfdCAqcEVycm9yUG9zKTsKKworLyoqCisgKiBDb252ZXJ0cyBhbiBPTUEgRFJNIHYxIEZvcndhcmQgTG9jayBmaWxlIHRvIHRoZSBpbnRlcm5hbCBGb3J3YXJkIExvY2sgZmlsZSBmb3JtYXQgaW4gcHVsbCBtb2RlLgorICoKKyAqIEBwYXJhbVtpbl0gcElucHV0RmlsZW5hbWUgQSByZWZlcmVuY2UgdG8gdGhlIGlucHV0IGZpbGVuYW1lLgorICogQHBhcmFtW2luXSBwT3V0cHV0RmlsZW5hbWUgQSByZWZlcmVuY2UgdG8gdGhlIG91dHB1dCBmaWxlbmFtZS4KKyAqIEBwYXJhbVtvdXRdIHBFcnJvclBvcworICogICBUaGUgZmlsZSBwb3NpdGlvbiB3aGVyZSB0aGUgZXJyb3Igb2NjdXJyZWQsIGluIHRoZSBjYXNlIG9mIGEgc3ludGF4IGVycm9yLiBNYXkgYmUgTlVMTC4KKyAqCisgKiBAcmV0dXJuIEEgc3RhdHVzIGNvZGUuCisgKiBAcmV0dmFsIEZ3ZExvY2tDb252X1N0YXR1c19PSworICogQHJldHZhbCBGd2RMb2NrQ29udl9TdGF0dXNfSW52YWxpZEFyZ3VtZW50CisgKiBAcmV0dmFsIEZ3ZExvY2tDb252X1N0YXR1c19PdXRPZk1lbW9yeQorICogQHJldHZhbCBGd2RMb2NrQ29udl9TdGF0dXNfRmlsZU5vdEZvdW5kCisgKiBAcmV0dmFsIEZ3ZExvY2tDb252X1N0YXR1c19GaWxlQ3JlYXRpb25GYWlsZWQKKyAqIEByZXR2YWwgRndkTG9ja0NvbnZfU3RhdHVzX0ZpbGVSZWFkRXJyb3IKKyAqIEByZXR2YWwgRndkTG9ja0NvbnZfU3RhdHVzX0ZpbGVXcml0ZUVycm9yCisgKiBAcmV0dmFsIEZ3ZExvY2tDb252X1N0YXR1c19GaWxlU2Vla0Vycm9yCisgKiBAcmV0dmFsIEZ3ZExvY2tDb252X1N0YXR1c19TeW50YXhFcnJvcgorICogQHJldHZhbCBGd2RMb2NrQ29udl9TdGF0dXNfVW5zdXBwb3J0ZWRGaWxlRm9ybWF0CisgKiBAcmV0dmFsIEZ3ZExvY2tDb252X1N0YXR1c19VbnN1cHBvcnRlZENvbnRlbnRUcmFuc2ZlckVuY29kaW5nCisgKiBAcmV0dmFsIEZ3ZExvY2tDb252X1N0YXR1c19SYW5kb21OdW1iZXJHZW5lcmF0aW9uRmFpbGVkCisgKiBAcmV0dmFsIEZ3ZExvY2tDb252X1N0YXR1c19LZXlFbmNyeXB0aW9uRmFpbGVkCisgKiBAcmV0dmFsIEZ3ZExvY2tDb252X1N0YXR1c19EYXRhRW5jcnlwdGlvbkZhaWxlZAorICogQHJldHZhbCBGd2RMb2NrQ29udl9TdGF0dXNfSW50ZWdyaXR5UHJvdGVjdGlvbkZhaWxlZAorICogQHJldHZhbCBGd2RMb2NrQ29udl9TdGF0dXNfVG9vTWFueVNlc3Npb25zCisgKi8KK0Z3ZExvY2tDb252X1N0YXR1c190IEZ3ZExvY2tDb252X0NvbnZlcnRGaWxlKGNvbnN0IGNoYXIgKnBJbnB1dEZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcE91dHB1dEZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2ZmNjRfdCAqcEVycm9yUG9zKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8vIF9fRldETE9DS0NPTlZfSF9fCmRpZmYgLS1naXQgYS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9kZWNvZGVyL0FuZHJvaWQubWsgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9kZWNvZGVyL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjYyNWVkZgotLS0gL2Rldi9udWxsCisrKyBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L2RlY29kZXIvQW5kcm9pZC5tawpAQCAtMCwwICsxLDM3IEBACisjCisjIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfU1JDX0ZJTEVTIDo9IFwKKyAgICBGd2RMb2NrRmlsZS5jCisKK0xPQ0FMX0NfSU5DTFVERVMgOj0gXAorICAgIGZyYW1ld29ya3MvYmFzZS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9jb21tb24gXAorICAgIGV4dGVybmFsL29wZW5zc2wvaW5jbHVkZQorCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmNyeXB0bworCitMT0NBTF9XSE9MRV9TVEFUSUNfTElCUkFSSUVTIDo9IGxpYmZ3ZGxvY2stY29tbW9uCisKK0xPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gbGliZndkbG9jay1jb21tb24KKworTE9DQUxfTU9EVUxFIDo9IGxpYmZ3ZGxvY2stZGVjb2RlcgorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorCitpbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9kZWNvZGVyL0Z3ZExvY2tGaWxlLmMgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9kZWNvZGVyL0Z3ZExvY2tGaWxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTgyODRlNwotLS0gL2Rldi9udWxsCisrKyBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L2RlY29kZXIvRndkTG9ja0ZpbGUuYwpAQCAtMCwwICsxLDQ0NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8cHRocmVhZC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvYWVzLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9obWFjLmg+CisKKyNpbmNsdWRlICJGd2RMb2NrRmlsZS5oIgorI2luY2x1ZGUgIkZ3ZExvY2tHbHVlLmgiCisKKyNkZWZpbmUgVFJVRSAxCisjZGVmaW5lIEZBTFNFIDAKKworI2RlZmluZSBJTlZBTElEX09GRlNFVCAoKG9mZjY0X3QpLTEpCisKKyNkZWZpbmUgSU5WQUxJRF9CTE9DS19JTkRFWCAoKHVpbnQ2NF90KS0xKQorCisjZGVmaW5lIE1BWF9OVU1fU0VTU0lPTlMgMTI4CisKKyNkZWZpbmUgS0VZX1NJWkUgQUVTX0JMT0NLX1NJWkUKKyNkZWZpbmUgS0VZX1NJWkVfSU5fQklUUyAoS0VZX1NJWkUgKiA4KQorCisjZGVmaW5lIFNIQTFfSEFTSF9TSVpFIDIwCisjZGVmaW5lIFNIQTFfQkxPQ0tfU0laRSA2NAorCisjZGVmaW5lIEZXRF9MT0NLX1ZFUlNJT04gMAorI2RlZmluZSBGV0RfTE9DS19TVUJGT1JNQVQgMAorI2RlZmluZSBVU0FHRV9SRVNUUklDVElPTl9GTEFHUyAwCisjZGVmaW5lIENPTlRFTlRfVFlQRV9MRU5HVEhfUE9TIDcKKyNkZWZpbmUgVE9QX0hFQURFUl9TSVpFIDgKKworI2RlZmluZSBTSUdfQ0FMQ19CVUZGRVJfU0laRSAoMTYgKiBTSEExX0JMT0NLX1NJWkUpCisKKy8qKgorICogRGF0YSB0eXBlIGZvciB0aGUgcGVyLWZpbGUgc3RhdGUgaW5mb3JtYXRpb24gbmVlZGVkIGJ5IHRoZSBkZWNvZGVyLgorICovCit0eXBlZGVmIHN0cnVjdCBGd2RMb2NrRmlsZV9TZXNzaW9uIHsKKyAgICBpbnQgZmlsZURlc2M7CisgICAgdW5zaWduZWQgY2hhciB0b3BIZWFkZXJbVE9QX0hFQURFUl9TSVpFXTsKKyAgICBjaGFyICpwQ29udGVudFR5cGU7CisgICAgc2l6ZV90IGNvbnRlbnRUeXBlTGVuZ3RoOworICAgIHZvaWQgKnBFbmNyeXB0ZWRTZXNzaW9uS2V5OworICAgIHNpemVfdCBlbmNyeXB0ZWRTZXNzaW9uS2V5TGVuZ3RoOworICAgIHVuc2lnbmVkIGNoYXIgZGF0YVNpZ25hdHVyZVtTSEExX0hBU0hfU0laRV07CisgICAgdW5zaWduZWQgY2hhciBoZWFkZXJTaWduYXR1cmVbU0hBMV9IQVNIX1NJWkVdOworICAgIG9mZjY0X3QgZGF0YU9mZnNldDsKKyAgICBvZmY2NF90IGZpbGVQb3M7CisgICAgQUVTX0tFWSBlbmNyeXB0aW9uUm91bmRLZXlzOworICAgIEhNQUNfQ1RYIHNpZ25pbmdDb250ZXh0OworICAgIHVuc2lnbmVkIGNoYXIga2V5U3RyZWFtW0FFU19CTE9DS19TSVpFXTsKKyAgICB1aW50NjRfdCBibG9ja0luZGV4OworfSBGd2RMb2NrRmlsZV9TZXNzaW9uX3Q7CisKK3N0YXRpYyBGd2RMb2NrRmlsZV9TZXNzaW9uX3QgKnNlc3Npb25QdHJzW01BWF9OVU1fU0VTU0lPTlNdID0geyBOVUxMIH07CisKK3N0YXRpYyBwdGhyZWFkX211dGV4X3Qgc2Vzc2lvbkFjcXVpc2l0aW9uTXV0ZXggPSBQVEhSRUFEX01VVEVYX0lOSVRJQUxJWkVSOworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciB0b3BIZWFkZXJUZW1wbGF0ZVtdID0KKyAgICB7ICdGJywgJ1cnLCAnTCcsICdLJywgRldEX0xPQ0tfVkVSU0lPTiwgRldEX0xPQ0tfU1VCRk9STUFULCBVU0FHRV9SRVNUUklDVElPTl9GTEFHUyB9OworCisvKioKKyAqIEFjcXVpcmVzIGFuIHVudXNlZCBmaWxlIHNlc3Npb24gZm9yIHRoZSBnaXZlbiBmaWxlIGRlc2NyaXB0b3IuCisgKgorICogQHBhcmFtW2luXSBmaWxlRGVzYyBBIGZpbGUgZGVzY3JpcHRvci4KKyAqCisgKiBAcmV0dXJuIEEgc2Vzc2lvbiBJRC4KKyAqLworc3RhdGljIGludCBGd2RMb2NrRmlsZV9BY3F1aXJlU2Vzc2lvbihpbnQgZmlsZURlc2MpIHsKKyAgICBpbnQgc2Vzc2lvbklkID0gLTE7CisgICAgaWYgKGZpbGVEZXNjIDwgMCkgeworICAgICAgICBlcnJubyA9IEVCQURGOworICAgIH0gZWxzZSB7CisgICAgICAgIGludCBpOworICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJnNlc3Npb25BY3F1aXNpdGlvbk11dGV4KTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IE1BWF9OVU1fU0VTU0lPTlM7ICsraSkgeworICAgICAgICAgICAgaW50IGNhbmRpZGF0ZVNlc3Npb25JZCA9IChmaWxlRGVzYyArIGkpICUgTUFYX05VTV9TRVNTSU9OUzsKKyAgICAgICAgICAgIGlmIChzZXNzaW9uUHRyc1tjYW5kaWRhdGVTZXNzaW9uSWRdID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBzZXNzaW9uUHRyc1tjYW5kaWRhdGVTZXNzaW9uSWRdID0gbWFsbG9jKHNpemVvZiAqKnNlc3Npb25QdHJzKTsKKyAgICAgICAgICAgICAgICBpZiAoc2Vzc2lvblB0cnNbY2FuZGlkYXRlU2Vzc2lvbklkXSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIHNlc3Npb25QdHJzW2NhbmRpZGF0ZVNlc3Npb25JZF0tPmZpbGVEZXNjID0gZmlsZURlc2M7CisgICAgICAgICAgICAgICAgICAgIHNlc3Npb25QdHJzW2NhbmRpZGF0ZVNlc3Npb25JZF0tPnBDb250ZW50VHlwZSA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgIHNlc3Npb25QdHJzW2NhbmRpZGF0ZVNlc3Npb25JZF0tPnBFbmNyeXB0ZWRTZXNzaW9uS2V5ID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbklkID0gY2FuZGlkYXRlU2Vzc2lvbklkOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmc2Vzc2lvbkFjcXVpc2l0aW9uTXV0ZXgpOworICAgICAgICBpZiAoaSA9PSBNQVhfTlVNX1NFU1NJT05TKSB7CisgICAgICAgICAgICBlcnJubyA9IEVORklMRTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc2Vzc2lvbklkOworfQorCisvKioKKyAqIEZpbmRzIHRoZSBmaWxlIHNlc3Npb24gYXNzb2NpYXRlZCB0byB0aGUgZ2l2ZW4gZmlsZSBkZXNjcmlwdG9yLgorICoKKyAqIEBwYXJhbVtpbl0gZmlsZURlc2MgQSBmaWxlIGRlc2NyaXB0b3IuCisgKgorICogQHJldHVybiBBIHNlc3Npb24gSUQuCisgKi8KK3N0YXRpYyBpbnQgRndkTG9ja0ZpbGVfRmluZFNlc3Npb24oaW50IGZpbGVEZXNjKSB7CisgICAgaW50IHNlc3Npb25JZCA9IC0xOworICAgIGlmIChmaWxlRGVzYyA8IDApIHsKKyAgICAgICAgZXJybm8gPSBFQkFERjsKKyAgICB9IGVsc2UgeworICAgICAgICBpbnQgaTsKKyAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZzZXNzaW9uQWNxdWlzaXRpb25NdXRleCk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfTlVNX1NFU1NJT05TOyArK2kpIHsKKyAgICAgICAgICAgIGludCBjYW5kaWRhdGVTZXNzaW9uSWQgPSAoZmlsZURlc2MgKyBpKSAlIE1BWF9OVU1fU0VTU0lPTlM7CisgICAgICAgICAgICBpZiAoc2Vzc2lvblB0cnNbY2FuZGlkYXRlU2Vzc2lvbklkXSAhPSBOVUxMICYmCisgICAgICAgICAgICAgICAgc2Vzc2lvblB0cnNbY2FuZGlkYXRlU2Vzc2lvbklkXS0+ZmlsZURlc2MgPT0gZmlsZURlc2MpIHsKKyAgICAgICAgICAgICAgICBzZXNzaW9uSWQgPSBjYW5kaWRhdGVTZXNzaW9uSWQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJnNlc3Npb25BY3F1aXNpdGlvbk11dGV4KTsKKyAgICAgICAgaWYgKGkgPT0gTUFYX05VTV9TRVNTSU9OUykgeworICAgICAgICAgICAgZXJybm8gPSBFQkFERjsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc2Vzc2lvbklkOworfQorCisvKioKKyAqIFJlbGVhc2VzIGEgZmlsZSBzZXNzaW9uLgorICoKKyAqIEBwYXJhbVtpbl0gc2Vzc2lvbklEIEEgc2Vzc2lvbiBJRC4KKyAqLworc3RhdGljIHZvaWQgRndkTG9ja0ZpbGVfUmVsZWFzZVNlc3Npb24oaW50IHNlc3Npb25JZCkgeworICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmc2Vzc2lvbkFjcXVpc2l0aW9uTXV0ZXgpOworICAgIGFzc2VydCgwIDw9IHNlc3Npb25JZCAmJiBzZXNzaW9uSWQgPCBNQVhfTlVNX1NFU1NJT05TICYmIHNlc3Npb25QdHJzW3Nlc3Npb25JZF0gIT0gTlVMTCk7CisgICAgZnJlZShzZXNzaW9uUHRyc1tzZXNzaW9uSWRdLT5wQ29udGVudFR5cGUpOworICAgIGZyZWUoc2Vzc2lvblB0cnNbc2Vzc2lvbklkXS0+cEVuY3J5cHRlZFNlc3Npb25LZXkpOworICAgIG1lbXNldChzZXNzaW9uUHRyc1tzZXNzaW9uSWRdLCAwLCBzaXplb2YgKnNlc3Npb25QdHJzW3Nlc3Npb25JZF0pOyAvLyBaZXJvIG91dCBrZXkgZGF0YS4KKyAgICBmcmVlKHNlc3Npb25QdHJzW3Nlc3Npb25JZF0pOworICAgIHNlc3Npb25QdHJzW3Nlc3Npb25JZF0gPSBOVUxMOworICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZzZXNzaW9uQWNxdWlzaXRpb25NdXRleCk7Cit9CisKKy8qKgorICogRGVyaXZlcyBrZXlzIGZvciBlbmNyeXB0aW9uIGFuZCBzaWduaW5nIGZyb20gdGhlIGVuY3J5cHRlZCBzZXNzaW9uIGtleS4KKyAqCisgKiBAcGFyYW1baW4sb3V0XSBwU2Vzc2lvbiBBIHJlZmVyZW5jZSB0byBhIGZpbGUgc2Vzc2lvbi4KKyAqCisgKiBAcmV0dXJuIEEgQm9vbGVhbiB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIga2V5IGRlcml2YXRpb24gd2FzIHN1Y2Nlc3NmdWwuCisgKi8KK3N0YXRpYyBpbnQgRndkTG9ja0ZpbGVfRGVyaXZlS2V5cyhGd2RMb2NrRmlsZV9TZXNzaW9uX3QgKiBwU2Vzc2lvbikgeworICAgIGludCByZXN1bHQ7CisgICAgc3RydWN0IEZ3ZExvY2tGaWxlX0Rlcml2ZUtleXNfRGF0YSB7CisgICAgICAgIEFFU19LRVkgc2Vzc2lvblJvdW5kS2V5czsKKyAgICAgICAgdW5zaWduZWQgY2hhciB2YWx1ZVtLRVlfU0laRV07CisgICAgICAgIHVuc2lnbmVkIGNoYXIga2V5W0tFWV9TSVpFXTsKKyAgICB9ICpwRGF0YSA9IG1hbGxvYyhzaXplb2YgKnBEYXRhKTsKKyAgICBpZiAocERhdGEgPT0gTlVMTCkgeworICAgICAgICByZXN1bHQgPSBGQUxTRTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXN1bHQgPSBGd2RMb2NrR2x1ZV9EZWNyeXB0S2V5KHBTZXNzaW9uLT5wRW5jcnlwdGVkU2Vzc2lvbktleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2Vzc2lvbi0+ZW5jcnlwdGVkU2Vzc2lvbktleUxlbmd0aCwgcERhdGEtPmtleSwgS0VZX1NJWkUpOworICAgICAgICBpZiAocmVzdWx0KSB7CisgICAgICAgICAgICBpZiAoQUVTX3NldF9lbmNyeXB0X2tleShwRGF0YS0+a2V5LCBLRVlfU0laRV9JTl9CSVRTLCAmcERhdGEtPnNlc3Npb25Sb3VuZEtleXMpICE9IDApIHsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBGQUxTRTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gRW5jcnlwdCB0aGUgMTYtYnl0ZSB2YWx1ZSB7MCwgMCwgLi4uLCAwfSB0byBwcm9kdWNlIHRoZSBlbmNyeXB0aW9uIGtleS4KKyAgICAgICAgICAgICAgICBtZW1zZXQocERhdGEtPnZhbHVlLCAwLCBLRVlfU0laRSk7CisgICAgICAgICAgICAgICAgQUVTX2VuY3J5cHQocERhdGEtPnZhbHVlLCBwRGF0YS0+a2V5LCAmcERhdGEtPnNlc3Npb25Sb3VuZEtleXMpOworICAgICAgICAgICAgICAgIGlmIChBRVNfc2V0X2VuY3J5cHRfa2V5KHBEYXRhLT5rZXksIEtFWV9TSVpFX0lOX0JJVFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBTZXNzaW9uLT5lbmNyeXB0aW9uUm91bmRLZXlzKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IEZBTFNFOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIEVuY3J5cHQgdGhlIDE2LWJ5dGUgdmFsdWUgezEsIDAsIC4uLiwgMH0gdG8gcHJvZHVjZSB0aGUgc2lnbmluZyBrZXkuCisgICAgICAgICAgICAgICAgICAgICsrcERhdGEtPnZhbHVlWzBdOworICAgICAgICAgICAgICAgICAgICBBRVNfZW5jcnlwdChwRGF0YS0+dmFsdWUsIHBEYXRhLT5rZXksICZwRGF0YS0+c2Vzc2lvblJvdW5kS2V5cyk7CisgICAgICAgICAgICAgICAgICAgIEhNQUNfQ1RYX2luaXQoJnBTZXNzaW9uLT5zaWduaW5nQ29udGV4dCk7CisgICAgICAgICAgICAgICAgICAgIEhNQUNfSW5pdF9leCgmcFNlc3Npb24tPnNpZ25pbmdDb250ZXh0LCBwRGF0YS0+a2V5LCBLRVlfU0laRSwgRVZQX3NoYTEoKSwgTlVMTCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghcmVzdWx0KSB7CisgICAgICAgICAgICBlcnJubyA9IEVOT1NZUzsKKyAgICAgICAgfQorICAgICAgICBtZW1zZXQocERhdGEsIDAsIHNpemVvZiBwRGF0YSk7IC8vIFplcm8gb3V0IGtleSBkYXRhLgorICAgICAgICBmcmVlKHBEYXRhKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBDYWxjdWxhdGVzIHRoZSBjb3VudGVyLCB0cmVhdGVkIGFzIGEgMTYtYnl0ZSBsaXR0bGUtZW5kaWFuIG51bWJlciwgdXNlZCB0byBnZW5lcmF0ZSB0aGUga2V5c3RyZWFtCisgKiBmb3IgdGhlIGdpdmVuIGJsb2NrLgorICoKKyAqIEBwYXJhbVtpbl0gcE5vbmNlIEEgcmVmZXJlbmNlIHRvIHRoZSBub25jZS4KKyAqIEBwYXJhbVtpbl0gYmxvY2tJbmRleCBUaGUgaW5kZXggbnVtYmVyIG9mIHRoZSBibG9jay4KKyAqIEBwYXJhbVtvdXRdIHBDb3VudGVyIEEgcmVmZXJlbmNlIHRvIHRoZSBjb3VudGVyLgorICovCitzdGF0aWMgdm9pZCBGd2RMb2NrRmlsZV9DYWxjdWxhdGVDb3VudGVyKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnBOb25jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgYmxvY2tJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqcENvdW50ZXIpIHsKKyAgICB1bnNpZ25lZCBjaGFyIGNhcnJ5ID0gMDsKKyAgICBzaXplX3QgaSA9IDA7CisgICAgZm9yICg7IGkgPCBzaXplb2YgYmxvY2tJbmRleDsgKytpKSB7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgcGFydCA9IHBOb25jZVtpXSArICh1bnNpZ25lZCBjaGFyKShibG9ja0luZGV4ID4+IChpICogQ0hBUl9CSVQpKTsKKyAgICAgICAgcENvdW50ZXJbaV0gPSBwYXJ0ICsgY2Fycnk7CisgICAgICAgIGNhcnJ5ID0gKHBhcnQgPCBwTm9uY2VbaV0gfHwgcENvdW50ZXJbaV0gPCBwYXJ0KSA/IDEgOiAwOworICAgIH0KKyAgICBmb3IgKDsgaSA8IEFFU19CTE9DS19TSVpFOyArK2kpIHsKKyAgICAgICAgcENvdW50ZXJbaV0gPSBwTm9uY2VbaV0gKyBjYXJyeTsKKyAgICAgICAgY2FycnkgPSAocENvdW50ZXJbaV0gPCBwTm9uY2VbaV0pID8gMSA6IDA7CisgICAgfQorfQorCisvKioKKyAqIERlY3J5cHRzIHRoZSBieXRlIGF0IHRoZSBjdXJyZW50IGZpbGUgcG9zaXRpb24gdXNpbmcgQUVTLTEyOC1DVFIuIEluIENUUiAob3IgImNvdW50ZXIiKSBtb2RlLAorICogZW5jcnlwdGlvbiBhbmQgZGVjcnlwdGlvbiBhcmUgcGVyZm9ybWVkIHVzaW5nIHRoZSBzYW1lIGFsZ29yaXRobS4KKyAqCisgKiBAcGFyYW1baW4sb3V0XSBwU2Vzc2lvbiBBIHJlZmVyZW5jZSB0byBhIGZpbGUgc2Vzc2lvbi4KKyAqIEBwYXJhbVtpbl0gcEJ5dGUgVGhlIGJ5dGUgdG8gZGVjcnlwdC4KKyAqLwordm9pZCBGd2RMb2NrRmlsZV9EZWNyeXB0Qnl0ZShGd2RMb2NrRmlsZV9TZXNzaW9uX3QgKiBwU2Vzc2lvbiwgdW5zaWduZWQgY2hhciAqcEJ5dGUpIHsKKyAgICB1aW50NjRfdCBibG9ja0luZGV4ID0gcFNlc3Npb24tPmZpbGVQb3MgLyBBRVNfQkxPQ0tfU0laRTsKKyAgICB1aW50NjRfdCBibG9ja09mZnNldCA9IHBTZXNzaW9uLT5maWxlUG9zICUgQUVTX0JMT0NLX1NJWkU7CisgICAgaWYgKGJsb2NrSW5kZXggIT0gcFNlc3Npb24tPmJsb2NrSW5kZXgpIHsKKyAgICAgICAgLy8gVGhlIGZpcnN0IDE2IGJ5dGVzIG9mIHRoZSBlbmNyeXB0ZWQgc2Vzc2lvbiBrZXkgaXMgdXNlZCBhcyB0aGUgbm9uY2UuCisgICAgICAgIHVuc2lnbmVkIGNoYXIgY291bnRlcltBRVNfQkxPQ0tfU0laRV07CisgICAgICAgIEZ3ZExvY2tGaWxlX0NhbGN1bGF0ZUNvdW50ZXIocFNlc3Npb24tPnBFbmNyeXB0ZWRTZXNzaW9uS2V5LCBibG9ja0luZGV4LCBjb3VudGVyKTsKKyAgICAgICAgQUVTX2VuY3J5cHQoY291bnRlciwgcFNlc3Npb24tPmtleVN0cmVhbSwgJnBTZXNzaW9uLT5lbmNyeXB0aW9uUm91bmRLZXlzKTsKKyAgICAgICAgcFNlc3Npb24tPmJsb2NrSW5kZXggPSBibG9ja0luZGV4OworICAgIH0KKyAgICAqcEJ5dGUgXj0gcFNlc3Npb24tPmtleVN0cmVhbVtibG9ja09mZnNldF07Cit9CisKK2ludCBGd2RMb2NrRmlsZV9hdHRhY2goaW50IGZpbGVEZXNjKSB7CisgICAgaW50IHNlc3Npb25JZCA9IEZ3ZExvY2tGaWxlX0FjcXVpcmVTZXNzaW9uKGZpbGVEZXNjKTsKKyAgICBpZiAoc2Vzc2lvbklkID49IDApIHsKKyAgICAgICAgRndkTG9ja0ZpbGVfU2Vzc2lvbl90ICpwU2Vzc2lvbiA9IHNlc3Npb25QdHJzW3Nlc3Npb25JZF07CisgICAgICAgIGludCBpc1N1Y2Nlc3MgPSBGQUxTRTsKKyAgICAgICAgaWYgKHJlYWQoZmlsZURlc2MsIHBTZXNzaW9uLT50b3BIZWFkZXIsIFRPUF9IRUFERVJfU0laRSkgPT0gVE9QX0hFQURFUl9TSVpFICYmCisgICAgICAgICAgICAgICAgbWVtY21wKHBTZXNzaW9uLT50b3BIZWFkZXIsIHRvcEhlYWRlclRlbXBsYXRlLCBzaXplb2YgdG9wSGVhZGVyVGVtcGxhdGUpID09IDApIHsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5jb250ZW50VHlwZUxlbmd0aCA9IHBTZXNzaW9uLT50b3BIZWFkZXJbQ09OVEVOVF9UWVBFX0xFTkdUSF9QT1NdOworICAgICAgICAgICAgYXNzZXJ0KHBTZXNzaW9uLT5jb250ZW50VHlwZUxlbmd0aCA8PSBVQ0hBUl9NQVgpOyAvLyBVbnRhaW50IHNjYWxhciBmb3IgY29kZSBjaGVja2Vycy4KKyAgICAgICAgICAgIHBTZXNzaW9uLT5wQ29udGVudFR5cGUgPSBtYWxsb2MocFNlc3Npb24tPmNvbnRlbnRUeXBlTGVuZ3RoICsgMSk7CisgICAgICAgICAgICBpZiAocFNlc3Npb24tPnBDb250ZW50VHlwZSAhPSBOVUxMICYmCisgICAgICAgICAgICAgICAgICAgIHJlYWQoZmlsZURlc2MsIHBTZXNzaW9uLT5wQ29udGVudFR5cGUsIHBTZXNzaW9uLT5jb250ZW50VHlwZUxlbmd0aCkgPT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3NpemVfdClwU2Vzc2lvbi0+Y29udGVudFR5cGVMZW5ndGgpIHsKKyAgICAgICAgICAgICAgICBwU2Vzc2lvbi0+cENvbnRlbnRUeXBlW3BTZXNzaW9uLT5jb250ZW50VHlwZUxlbmd0aF0gPSAnXDAnOworICAgICAgICAgICAgICAgIHBTZXNzaW9uLT5lbmNyeXB0ZWRTZXNzaW9uS2V5TGVuZ3RoID0gRndkTG9ja0dsdWVfR2V0RW5jcnlwdGVkS2V5TGVuZ3RoKEtFWV9TSVpFKTsKKyAgICAgICAgICAgICAgICBwU2Vzc2lvbi0+cEVuY3J5cHRlZFNlc3Npb25LZXkgPSBtYWxsb2MocFNlc3Npb24tPmVuY3J5cHRlZFNlc3Npb25LZXlMZW5ndGgpOworICAgICAgICAgICAgICAgIGlmIChwU2Vzc2lvbi0+cEVuY3J5cHRlZFNlc3Npb25LZXkgIT0gTlVMTCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgcmVhZChmaWxlRGVzYywgcFNlc3Npb24tPnBFbmNyeXB0ZWRTZXNzaW9uS2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2Vzc2lvbi0+ZW5jcnlwdGVkU2Vzc2lvbktleUxlbmd0aCkgPT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNzaXplX3QpcFNlc3Npb24tPmVuY3J5cHRlZFNlc3Npb25LZXlMZW5ndGggJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlYWQoZmlsZURlc2MsIHBTZXNzaW9uLT5kYXRhU2lnbmF0dXJlLCBTSEExX0hBU0hfU0laRSkgPT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0hBMV9IQVNIX1NJWkUgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlYWQoZmlsZURlc2MsIHBTZXNzaW9uLT5oZWFkZXJTaWduYXR1cmUsIFNIQTFfSEFTSF9TSVpFKSA9PQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSEExX0hBU0hfU0laRSkgeworICAgICAgICAgICAgICAgICAgICBpc1N1Y2Nlc3MgPSBGd2RMb2NrRmlsZV9EZXJpdmVLZXlzKHBTZXNzaW9uKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlzU3VjY2VzcykgeworICAgICAgICAgICAgcFNlc3Npb24tPmRhdGFPZmZzZXQgPSBwU2Vzc2lvbi0+Y29udGVudFR5cGVMZW5ndGggKworICAgICAgICAgICAgICAgICAgICBwU2Vzc2lvbi0+ZW5jcnlwdGVkU2Vzc2lvbktleUxlbmd0aCArIFRPUF9IRUFERVJfU0laRSArIDIgKiBTSEExX0hBU0hfU0laRTsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5maWxlUG9zID0gMDsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5ibG9ja0luZGV4ID0gSU5WQUxJRF9CTE9DS19JTkRFWDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEZ3ZExvY2tGaWxlX1JlbGVhc2VTZXNzaW9uKHNlc3Npb25JZCk7CisgICAgICAgICAgICBzZXNzaW9uSWQgPSAtMTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gKHNlc3Npb25JZCA+PSAwKSA/IDAgOiAtMTsKK30KKworaW50IEZ3ZExvY2tGaWxlX29wZW4oY29uc3QgY2hhciAqcEZpbGVuYW1lKSB7CisgICAgaW50IGZpbGVEZXNjID0gb3BlbihwRmlsZW5hbWUsIE9fUkRPTkxZKTsKKyAgICBpZiAoZmlsZURlc2MgPj0gMCAmJiBGd2RMb2NrRmlsZV9hdHRhY2goZmlsZURlc2MpIDwgMCkgeworICAgICAgICAodm9pZCljbG9zZShmaWxlRGVzYyk7CisgICAgICAgIGZpbGVEZXNjID0gLTE7CisgICAgfQorICAgIHJldHVybiBmaWxlRGVzYzsKK30KKworc3NpemVfdCBGd2RMb2NrRmlsZV9yZWFkKGludCBmaWxlRGVzYywgdm9pZCAqcEJ1ZmZlciwgc2l6ZV90IG51bUJ5dGVzKSB7CisgICAgc3NpemVfdCBudW1CeXRlc1JlYWQ7CisgICAgaW50IHNlc3Npb25JZCA9IEZ3ZExvY2tGaWxlX0ZpbmRTZXNzaW9uKGZpbGVEZXNjKTsKKyAgICBpZiAoc2Vzc2lvbklkIDwgMCkgeworICAgICAgICBudW1CeXRlc1JlYWQgPSAtMTsKKyAgICB9IGVsc2UgeworICAgICAgICBGd2RMb2NrRmlsZV9TZXNzaW9uX3QgKnBTZXNzaW9uID0gc2Vzc2lvblB0cnNbc2Vzc2lvbklkXTsKKyAgICAgICAgc3NpemVfdCBpOworICAgICAgICBudW1CeXRlc1JlYWQgPSByZWFkKHBTZXNzaW9uLT5maWxlRGVzYywgcEJ1ZmZlciwgbnVtQnl0ZXMpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtQnl0ZXNSZWFkOyArK2kpIHsKKyAgICAgICAgICAgIEZ3ZExvY2tGaWxlX0RlY3J5cHRCeXRlKHBTZXNzaW9uLCAmKCh1bnNpZ25lZCBjaGFyICopcEJ1ZmZlcilbaV0pOworICAgICAgICAgICAgKytwU2Vzc2lvbi0+ZmlsZVBvczsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbnVtQnl0ZXNSZWFkOworfQorCitvZmY2NF90IEZ3ZExvY2tGaWxlX2xzZWVrKGludCBmaWxlRGVzYywgb2ZmNjRfdCBvZmZzZXQsIGludCB3aGVuY2UpIHsKKyAgICBvZmY2NF90IG5ld0ZpbGVQb3M7CisgICAgaW50IHNlc3Npb25JZCA9IEZ3ZExvY2tGaWxlX0ZpbmRTZXNzaW9uKGZpbGVEZXNjKTsKKyAgICBpZiAoc2Vzc2lvbklkIDwgMCkgeworICAgICAgICBuZXdGaWxlUG9zID0gSU5WQUxJRF9PRkZTRVQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgRndkTG9ja0ZpbGVfU2Vzc2lvbl90ICpwU2Vzc2lvbiA9IHNlc3Npb25QdHJzW3Nlc3Npb25JZF07CisgICAgICAgIHN3aXRjaCAod2hlbmNlKSB7CisgICAgICAgIGNhc2UgU0VFS19TRVQ6CisgICAgICAgICAgICBuZXdGaWxlUG9zID0gbHNlZWs2NChwU2Vzc2lvbi0+ZmlsZURlc2MsIHBTZXNzaW9uLT5kYXRhT2Zmc2V0ICsgb2Zmc2V0LCB3aGVuY2UpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU0VFS19DVVI6CisgICAgICAgIGNhc2UgU0VFS19FTkQ6CisgICAgICAgICAgICBuZXdGaWxlUG9zID0gbHNlZWs2NChwU2Vzc2lvbi0+ZmlsZURlc2MsIG9mZnNldCwgd2hlbmNlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZXJybm8gPSBFSU5WQUw7CisgICAgICAgICAgICBuZXdGaWxlUG9zID0gSU5WQUxJRF9PRkZTRVQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAobmV3RmlsZVBvcyAhPSBJTlZBTElEX09GRlNFVCkgeworICAgICAgICAgICAgaWYgKG5ld0ZpbGVQb3MgPCBwU2Vzc2lvbi0+ZGF0YU9mZnNldCkgeworICAgICAgICAgICAgICAgIC8vIFRoZSBuZXcgZmlsZSBwb3NpdGlvbiBpcyBpbGxlZ2FsIGZvciBhbiBpbnRlcm5hbCBGb3J3YXJkIExvY2sgZmlsZS4gUmVzdG9yZSB0aGUKKyAgICAgICAgICAgICAgICAvLyBvcmlnaW5hbCBmaWxlIHBvc2l0aW9uLgorICAgICAgICAgICAgICAgICh2b2lkKWxzZWVrNjQocFNlc3Npb24tPmZpbGVEZXNjLCBwU2Vzc2lvbi0+ZGF0YU9mZnNldCArIHBTZXNzaW9uLT5maWxlUG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VFS19TRVQpOworICAgICAgICAgICAgICAgIGVycm5vID0gRUlOVkFMOworICAgICAgICAgICAgICAgIG5ld0ZpbGVQb3MgPSBJTlZBTElEX09GRlNFVDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gVGhlIHJldHVybiB2YWx1ZSBzaG91bGQgYmUgdGhlIGZpbGUgcG9zaXRpb24gdGhhdCBsc2VlazY0KCkgd291bGQgaGF2ZSByZXR1cm5lZAorICAgICAgICAgICAgICAgIC8vIGZvciB0aGUgZW1iZWRkZWQgY29udGVudCBmaWxlLgorICAgICAgICAgICAgICAgIHBTZXNzaW9uLT5maWxlUG9zID0gbmV3RmlsZVBvcyAtIHBTZXNzaW9uLT5kYXRhT2Zmc2V0OworICAgICAgICAgICAgICAgIG5ld0ZpbGVQb3MgPSBwU2Vzc2lvbi0+ZmlsZVBvczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbmV3RmlsZVBvczsKK30KKworaW50IEZ3ZExvY2tGaWxlX2RldGFjaChpbnQgZmlsZURlc2MpIHsKKyAgICBpbnQgc2Vzc2lvbklkID0gRndkTG9ja0ZpbGVfRmluZFNlc3Npb24oZmlsZURlc2MpOworICAgIGlmIChzZXNzaW9uSWQgPCAwKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgSE1BQ19DVFhfY2xlYW51cCgmc2Vzc2lvblB0cnNbc2Vzc2lvbklkXS0+c2lnbmluZ0NvbnRleHQpOworICAgIEZ3ZExvY2tGaWxlX1JlbGVhc2VTZXNzaW9uKHNlc3Npb25JZCk7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBGd2RMb2NrRmlsZV9jbG9zZShpbnQgZmlsZURlc2MpIHsKKyAgICByZXR1cm4gKEZ3ZExvY2tGaWxlX2RldGFjaChmaWxlRGVzYykgPT0gMCkgPyBjbG9zZShmaWxlRGVzYykgOiAtMTsKK30KKworaW50IEZ3ZExvY2tGaWxlX0NoZWNrRGF0YUludGVncml0eShpbnQgZmlsZURlc2MpIHsKKyAgICBpbnQgcmVzdWx0OworICAgIGludCBzZXNzaW9uSWQgPSBGd2RMb2NrRmlsZV9GaW5kU2Vzc2lvbihmaWxlRGVzYyk7CisgICAgaWYgKHNlc3Npb25JZCA8IDApIHsKKyAgICAgICAgcmVzdWx0ID0gRkFMU0U7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3RydWN0IEZ3ZExvY2tGaWxlX0NoZWNrRGF0YUludGVncml0eV9EYXRhIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgc2lnbmF0dXJlW1NIQTFfSEFTSF9TSVpFXTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgYnVmZmVyW1NJR19DQUxDX0JVRkZFUl9TSVpFXTsKKyAgICAgICAgfSAqcERhdGEgPSBtYWxsb2Moc2l6ZW9mICpwRGF0YSk7CisgICAgICAgIGlmIChwRGF0YSA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXN1bHQgPSBGQUxTRTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEZ3ZExvY2tGaWxlX1Nlc3Npb25fdCAqcFNlc3Npb24gPSBzZXNzaW9uUHRyc1tzZXNzaW9uSWRdOworICAgICAgICAgICAgaWYgKGxzZWVrNjQocFNlc3Npb24tPmZpbGVEZXNjLCBwU2Vzc2lvbi0+ZGF0YU9mZnNldCwgU0VFS19TRVQpICE9CisgICAgICAgICAgICAgICAgICAgIHBTZXNzaW9uLT5kYXRhT2Zmc2V0KSB7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gRkFMU0U7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNzaXplX3QgbnVtQnl0ZXNSZWFkOworICAgICAgICAgICAgICAgIHNpemVfdCBzaWduYXR1cmVTaXplID0gU0hBMV9IQVNIX1NJWkU7CisgICAgICAgICAgICAgICAgd2hpbGUgKChudW1CeXRlc1JlYWQgPQorICAgICAgICAgICAgICAgICAgICAgICAgcmVhZChwU2Vzc2lvbi0+ZmlsZURlc2MsIHBEYXRhLT5idWZmZXIsIFNJR19DQUxDX0JVRkZFUl9TSVpFKSkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIEhNQUNfVXBkYXRlKCZwU2Vzc2lvbi0+c2lnbmluZ0NvbnRleHQsIHBEYXRhLT5idWZmZXIsIChzaXplX3QpbnVtQnl0ZXNSZWFkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG51bUJ5dGVzUmVhZCA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gRkFMU0U7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgSE1BQ19GaW5hbCgmcFNlc3Npb24tPnNpZ25pbmdDb250ZXh0LCBwRGF0YS0+c2lnbmF0dXJlLCAmc2lnbmF0dXJlU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydChzaWduYXR1cmVTaXplID09IFNIQTFfSEFTSF9TSVpFKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gbWVtY21wKHBEYXRhLT5zaWduYXR1cmUsIHBTZXNzaW9uLT5kYXRhU2lnbmF0dXJlLCBzaWduYXR1cmVTaXplKSA9PSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBITUFDX0luaXRfZXgoJnBTZXNzaW9uLT5zaWduaW5nQ29udGV4dCwgTlVMTCwgS0VZX1NJWkUsIE5VTEwsIE5VTEwpOworICAgICAgICAgICAgICAgICh2b2lkKWxzZWVrNjQocFNlc3Npb24tPmZpbGVEZXNjLCBwU2Vzc2lvbi0+ZGF0YU9mZnNldCArIHBTZXNzaW9uLT5maWxlUG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VFS19TRVQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZnJlZShwRGF0YSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworaW50IEZ3ZExvY2tGaWxlX0NoZWNrSGVhZGVySW50ZWdyaXR5KGludCBmaWxlRGVzYykgeworICAgIGludCByZXN1bHQ7CisgICAgaW50IHNlc3Npb25JZCA9IEZ3ZExvY2tGaWxlX0ZpbmRTZXNzaW9uKGZpbGVEZXNjKTsKKyAgICBpZiAoc2Vzc2lvbklkIDwgMCkgeworICAgICAgICByZXN1bHQgPSBGQUxTRTsKKyAgICB9IGVsc2UgeworICAgICAgICBGd2RMb2NrRmlsZV9TZXNzaW9uX3QgKnBTZXNzaW9uID0gc2Vzc2lvblB0cnNbc2Vzc2lvbklkXTsKKyAgICAgICAgdW5zaWduZWQgY2hhciBzaWduYXR1cmVbU0hBMV9IQVNIX1NJWkVdOworICAgICAgICBzaXplX3Qgc2lnbmF0dXJlU2l6ZSA9IFNIQTFfSEFTSF9TSVpFOworICAgICAgICBITUFDX1VwZGF0ZSgmcFNlc3Npb24tPnNpZ25pbmdDb250ZXh0LCBwU2Vzc2lvbi0+dG9wSGVhZGVyLCBUT1BfSEVBREVSX1NJWkUpOworICAgICAgICBITUFDX1VwZGF0ZSgmcFNlc3Npb24tPnNpZ25pbmdDb250ZXh0LCAodW5zaWduZWQgY2hhciAqKXBTZXNzaW9uLT5wQ29udGVudFR5cGUsCisgICAgICAgICAgICAgICAgICAgIHBTZXNzaW9uLT5jb250ZW50VHlwZUxlbmd0aCk7CisgICAgICAgIEhNQUNfVXBkYXRlKCZwU2Vzc2lvbi0+c2lnbmluZ0NvbnRleHQsIHBTZXNzaW9uLT5wRW5jcnlwdGVkU2Vzc2lvbktleSwKKyAgICAgICAgICAgICAgICAgICAgcFNlc3Npb24tPmVuY3J5cHRlZFNlc3Npb25LZXlMZW5ndGgpOworICAgICAgICBITUFDX1VwZGF0ZSgmcFNlc3Npb24tPnNpZ25pbmdDb250ZXh0LCBwU2Vzc2lvbi0+ZGF0YVNpZ25hdHVyZSwgc2lnbmF0dXJlU2l6ZSk7CisgICAgICAgIEhNQUNfRmluYWwoJnBTZXNzaW9uLT5zaWduaW5nQ29udGV4dCwgc2lnbmF0dXJlLCAmc2lnbmF0dXJlU2l6ZSk7CisgICAgICAgIGFzc2VydChzaWduYXR1cmVTaXplID09IFNIQTFfSEFTSF9TSVpFKTsKKyAgICAgICAgcmVzdWx0ID0gbWVtY21wKHNpZ25hdHVyZSwgcFNlc3Npb24tPmhlYWRlclNpZ25hdHVyZSwgc2lnbmF0dXJlU2l6ZSkgPT0gMDsKKyAgICAgICAgSE1BQ19Jbml0X2V4KCZwU2Vzc2lvbi0+c2lnbmluZ0NvbnRleHQsIE5VTEwsIEtFWV9TSVpFLCBOVUxMLCBOVUxMKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworaW50IEZ3ZExvY2tGaWxlX0NoZWNrSW50ZWdyaXR5KGludCBmaWxlRGVzYykgeworICAgIHJldHVybiBGd2RMb2NrRmlsZV9DaGVja0hlYWRlckludGVncml0eShmaWxlRGVzYykgJiYgRndkTG9ja0ZpbGVfQ2hlY2tEYXRhSW50ZWdyaXR5KGZpbGVEZXNjKTsKK30KKworY29uc3QgY2hhciAqRndkTG9ja0ZpbGVfR2V0Q29udGVudFR5cGUoaW50IGZpbGVEZXNjKSB7CisgICAgaW50IHNlc3Npb25JZCA9IEZ3ZExvY2tGaWxlX0ZpbmRTZXNzaW9uKGZpbGVEZXNjKTsKKyAgICBpZiAoc2Vzc2lvbklkIDwgMCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIHNlc3Npb25QdHJzW3Nlc3Npb25JZF0tPnBDb250ZW50VHlwZTsKK30KZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L2RlY29kZXIvRndkTG9ja0ZpbGUuaCBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L2RlY29kZXIvRndkTG9ja0ZpbGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzY0MDUwCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9pbnRlcm5hbC1mb3JtYXQvZGVjb2Rlci9Gd2RMb2NrRmlsZS5oCkBAIC0wLDAgKzEsMTM1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfX0ZXRExPQ0tGSUxFX0hfXworI2RlZmluZSBfX0ZXRExPQ0tGSUxFX0hfXworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworLyoqCisgKiBBdHRhY2hlcyB0byBhbiBvcGVuIEZvcndhcmQgTG9jayBmaWxlLiBUaGUgZmlsZSBwb3NpdGlvbiBpcyBhc3N1bWVkIHRvIGJlIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlCisgKiBmaWxlLgorICoKKyAqIEBwYXJhbVtpbl0gZmlsZURlc2MgVGhlIGZpbGUgZGVzY3JpcHRvciBvZiBhbiBvcGVuIEZvcndhcmQgTG9jayBmaWxlLgorICoKKyAqIEByZXR1cm4gQSBzdGF0dXMgY29kZS4KKyAqIEByZXR2YWwgMCBTdWNjZXNzLgorICogQHJldHZhbCAtMSBGYWlsdXJlLgorICovCitpbnQgRndkTG9ja0ZpbGVfYXR0YWNoKGludCBmaWxlRGVzYyk7CisKKy8qKgorICogT3BlbnMgYSBGb3J3YXJkIExvY2sgZmlsZSBmb3IgcmVhZGluZy4KKyAqCisgKiBAcGFyYW1baW5dIHBGaWxlbmFtZSBBIHJlZmVyZW5jZSB0byBhIGZpbGVuYW1lLgorICoKKyAqIEByZXR1cm4gQSBmaWxlIGRlc2NyaXB0b3IuCisgKiBAcmV0dmFsIC0xIEZhaWx1cmUuCisgKi8KK2ludCBGd2RMb2NrRmlsZV9vcGVuKGNvbnN0IGNoYXIgKnBGaWxlbmFtZSk7CisKKy8qKgorICogUmVhZHMgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgYnl0ZXMgZnJvbSBhbiBvcGVuIEZvcndhcmQgTG9jayBmaWxlLgorICoKKyAqIEBwYXJhbVtpbl0gZmlsZURlc2MgVGhlIGZpbGUgZGVzY3JpcHRvciBvZiBhbiBvcGVuIEZvcndhcmQgTG9jayBmaWxlLgorICogQHBhcmFtW291dF0gcEJ1ZmZlciBBIHJlZmVyZW5jZSB0byB0aGUgYnVmZmVyIHRoYXQgc2hvdWxkIHJlY2VpdmUgdGhlIHJlYWQgZGF0YS4KKyAqIEBwYXJhbVtpbl0gbnVtQnl0ZXMgVGhlIG51bWJlciBvZiBieXRlcyB0byByZWFkLgorICoKKyAqIEByZXR1cm4gVGhlIG51bWJlciBvZiBieXRlcyByZWFkLgorICogQHJldHZhbCAtMSBGYWlsdXJlLgorICovCitzc2l6ZV90IEZ3ZExvY2tGaWxlX3JlYWQoaW50IGZpbGVEZXNjLCB2b2lkICpwQnVmZmVyLCBzaXplX3QgbnVtQnl0ZXMpOworCisvKioKKyAqIFVwZGF0ZXMgdGhlIGZpbGUgcG9zaXRpb24gd2l0aGluIGFuIG9wZW4gRm9yd2FyZCBMb2NrIGZpbGUuCisgKgorICogQHBhcmFtW2luXSBmaWxlRGVzYyBUaGUgZmlsZSBkZXNjcmlwdG9yIG9mIGFuIG9wZW4gRm9yd2FyZCBMb2NrIGZpbGUuCisgKiBAcGFyYW1baW5dIG9mZnNldCBUaGUgb2Zmc2V0IHdpdGggd2hpY2ggdG8gdXBkYXRlIHRoZSBmaWxlIHBvc2l0aW9uLgorICogQHBhcmFtW2luXSB3aGVuY2UgT25lIG9mIFNFRUtfU0VULCBTRUVLX0NVUiwgYW5kIFNFRUtfRU5ELgorICoKKyAqIEByZXR1cm4gVGhlIG5ldyBmaWxlIHBvc2l0aW9uLgorICogQHJldHZhbCAoKG9mZjY0X3QpLTEpIEZhaWx1cmUuCisgKi8KK29mZjY0X3QgRndkTG9ja0ZpbGVfbHNlZWsoaW50IGZpbGVEZXNjLCBvZmY2NF90IG9mZnNldCwgaW50IHdoZW5jZSk7CisKKy8qKgorICogRGV0YWNoZXMgZnJvbSBhbiBvcGVuIEZvcndhcmQgTG9jayBmaWxlLgorICoKKyAqIEBwYXJhbVtpbl0gZmlsZURlc2MgVGhlIGZpbGUgZGVzY3JpcHRvciBvZiBhbiBvcGVuIEZvcndhcmQgTG9jayBmaWxlLgorICoKKyAqIEByZXR1cm4gQSBzdGF0dXMgY29kZS4KKyAqIEByZXR2YWwgMCBTdWNjZXNzLgorICogQHJldHZhbCAtMSBGYWlsdXJlLgorICovCitpbnQgRndkTG9ja0ZpbGVfZGV0YWNoKGludCBmaWxlRGVzYyk7CisKKy8qKgorICogQ2xvc2VzIGFuIG9wZW4gRm9yd2FyZCBMb2NrIGZpbGUuCisgKgorICogQHBhcmFtW2luXSBmaWxlRGVzYyBUaGUgZmlsZSBkZXNjcmlwdG9yIG9mIGFuIG9wZW4gRm9yd2FyZCBMb2NrIGZpbGUuCisgKgorICogQHJldHVybiBBIHN0YXR1cyBjb2RlLgorICogQHJldHZhbCAwIFN1Y2Nlc3MuCisgKiBAcmV0dmFsIC0xIEZhaWx1cmUuCisgKi8KK2ludCBGd2RMb2NrRmlsZV9jbG9zZShpbnQgZmlsZURlc2MpOworCisvKioKKyAqIENoZWNrcyB0aGUgZGF0YSBpbnRlZ3JpdHkgb2YgYW4gb3BlbiBGb3J3YXJkIExvY2sgZmlsZS4KKyAqCisgKiBAcGFyYW1baW5dIGZpbGVEZXNjIFRoZSBmaWxlIGRlc2NyaXB0b3Igb2YgYW4gb3BlbiBGb3J3YXJkIExvY2sgZmlsZS4KKyAqCisgKiBAcmV0dXJuIEEgQm9vbGVhbiB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGludGVncml0eSBjaGVjayB3YXMgc3VjY2Vzc2Z1bC4KKyAqLworaW50IEZ3ZExvY2tGaWxlX0NoZWNrRGF0YUludGVncml0eShpbnQgZmlsZURlc2MpOworCisvKioKKyAqIENoZWNrcyB0aGUgaGVhZGVyIGludGVncml0eSBvZiBhbiBvcGVuIEZvcndhcmQgTG9jayBmaWxlLgorICoKKyAqIEBwYXJhbVtpbl0gZmlsZURlc2MgVGhlIGZpbGUgZGVzY3JpcHRvciBvZiBhbiBvcGVuIEZvcndhcmQgTG9jayBmaWxlLgorICoKKyAqIEByZXR1cm4gQSBCb29sZWFuIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGUgaW50ZWdyaXR5IGNoZWNrIHdhcyBzdWNjZXNzZnVsLgorICovCitpbnQgRndkTG9ja0ZpbGVfQ2hlY2tIZWFkZXJJbnRlZ3JpdHkoaW50IGZpbGVEZXNjKTsKKworLyoqCisgKiBDaGVja3MgYm90aCB0aGUgZGF0YSBhbmQgaGVhZGVyIGludGVncml0eSBvZiBhbiBvcGVuIEZvcndhcmQgTG9jayBmaWxlLgorICoKKyAqIEBwYXJhbVtpbl0gZmlsZURlc2MgVGhlIGZpbGUgZGVzY3JpcHRvciBvZiBhbiBvcGVuIEZvcndhcmQgTG9jayBmaWxlLgorICoKKyAqIEByZXR1cm4gQSBCb29sZWFuIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGUgaW50ZWdyaXR5IGNoZWNrIHdhcyBzdWNjZXNzZnVsLgorICovCitpbnQgRndkTG9ja0ZpbGVfQ2hlY2tJbnRlZ3JpdHkoaW50IGZpbGVEZXNjKTsKKworLyoqCisgKiBSZXR1cm5zIHRoZSBjb250ZW50IHR5cGUgb2YgYW4gb3BlbiBGb3J3YXJkIExvY2sgZmlsZS4KKyAqCisgKiBAcGFyYW1baW5dIGZpbGVEZXNjIFRoZSBmaWxlIGRlc2NyaXB0b3Igb2YgYW4gb3BlbiBGb3J3YXJkIExvY2sgZmlsZS4KKyAqCisgKiBAcmV0dXJuCisgKiAgIEEgcmVmZXJlbmNlIHRvIHRoZSBjb250ZW50IHR5cGUuIFRoZSByZWZlcmVuY2UgcmVtYWlucyB2YWxpZCBhcyBsb25nIGFzIHRoZSBmaWxlIGlzIGtlcHQgb3Blbi4KKyAqLworY29uc3QgY2hhciAqRndkTG9ja0ZpbGVfR2V0Q29udGVudFR5cGUoaW50IGZpbGVEZXNjKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8vIF9fRldETE9DS0ZJTEVfSF9fCmRpZmYgLS1naXQgYS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9kb2MvRndkTG9jay5odG1sIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9pbnRlcm5hbC1mb3JtYXQvZG9jL0Z3ZExvY2suaHRtbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44Zjk1Y2QyCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9pbnRlcm5hbC1mb3JtYXQvZG9jL0Z3ZExvY2suaHRtbApAQCAtMCwwICsxLDEwMzkgQEAKKzxodG1sPgorCis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgorPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgMTIgKGZpbHRlcmVkKSI+Cis8dGl0bGU+Rm9yd2FyZCBMb2NrIENvbnZlcnRlciBhbmQgRGVjb2RlcjwvdGl0bGU+Cis8c3R5bGU+Cis8IS0tCisgLyogRm9udCBEZWZpbml0aW9ucyAqLworIEBmb250LWZhY2UKKwl7Zm9udC1mYW1pbHk6U2ltU3VuOworCXBhbm9zZS0xOjIgMSA2IDAgMyAxIDEgMSAxIDE7fQorQGZvbnQtZmFjZQorCXtmb250LWZhbWlseToiQ2FtYnJpYSBNYXRoIjsKKwlwYW5vc2UtMToyIDQgNSAzIDUgNCA2IDMgMiA0O30KK0Bmb250LWZhY2UKKwl7Zm9udC1mYW1pbHk6VGFob21hOworCXBhbm9zZS0xOjIgMTEgNiA0IDMgNSA0IDQgMiA0O30KK0Bmb250LWZhY2UKKwl7Zm9udC1mYW1pbHk6Ikx1Y2lkYSBDb25zb2xlIiwiRGVqYVZ1IFNhbnMgTW9ubyI7CisJcGFub3NlLTE6MiAxMSA2IDkgNCA1IDQgMiAyIDQ7fQorQGZvbnQtZmFjZQorCXtmb250LWZhbWlseToiXEBTaW1TdW4iOworCXBhbm9zZS0xOjIgMSA2IDAgMyAxIDEgMSAxIDE7fQorIC8qIFN0eWxlIERlZmluaXRpb25zICovCisgcC5Nc29Ob3JtYWwsIGxpLk1zb05vcm1hbCwgZGl2Lk1zb05vcm1hbAorCXttYXJnaW46MGNtOworCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKKwlmb250LXNpemU6MTIuMHB0OworCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iLCJzZXJpZiI7fQoraDEKKwl7bWFyZ2luLXJpZ2h0OjBjbTsKKwltYXJnaW4tbGVmdDoyMS42cHQ7CisJdGV4dC1pbmRlbnQ6LTIxLjZwdDsKKwlwYWdlLWJyZWFrLWFmdGVyOmF2b2lkOworCWZvbnQtc2l6ZToxNi4wcHQ7CisJZm9udC1mYW1pbHk6IkFyaWFsIiwic2Fucy1zZXJpZiI7fQoraDIKKwl7bWFyZ2luLXRvcDoxMi4wcHQ7CisJbWFyZ2luLXJpZ2h0OjBjbTsKKwltYXJnaW4tYm90dG9tOjMuMHB0OworCW1hcmdpbi1sZWZ0OjI4LjhwdDsKKwl0ZXh0LWluZGVudDotMjguOHB0OworCXBhZ2UtYnJlYWstYWZ0ZXI6YXZvaWQ7CisJZm9udC1zaXplOjE0LjBwdDsKKwlmb250LWZhbWlseToiQXJpYWwiLCJzYW5zLXNlcmlmIjsKKwlmb250LXN0eWxlOml0YWxpYzt9CitoMworCXttYXJnaW4tdG9wOjEyLjBwdDsKKwltYXJnaW4tcmlnaHQ6MGNtOworCW1hcmdpbi1ib3R0b206My4wcHQ7CisJbWFyZ2luLWxlZnQ6MzYuMHB0OworCXRleHQtaW5kZW50Oi0zNi4wcHQ7CisJcGFnZS1icmVhay1hZnRlcjphdm9pZDsKKwlmb250LXNpemU6MTMuMHB0OworCWZvbnQtZmFtaWx5OiJBcmlhbCIsInNhbnMtc2VyaWYiO30KK2g0CisJe21hcmdpbi10b3A6MTIuMHB0OworCW1hcmdpbi1yaWdodDowY207CisJbWFyZ2luLWJvdHRvbTozLjBwdDsKKwltYXJnaW4tbGVmdDo0My4ycHQ7CisJdGV4dC1pbmRlbnQ6LTQzLjJwdDsKKwlwYWdlLWJyZWFrLWFmdGVyOmF2b2lkOworCWZvbnQtc2l6ZToxNC4wcHQ7CisJZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiIsInNlcmlmIjt9CitoNQorCXttYXJnaW4tdG9wOjEyLjBwdDsKKwltYXJnaW4tcmlnaHQ6MGNtOworCW1hcmdpbi1ib3R0b206My4wcHQ7CisJbWFyZ2luLWxlZnQ6NTAuNHB0OworCXRleHQtaW5kZW50Oi01MC40cHQ7CisJZm9udC1zaXplOjEzLjBwdDsKKwlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIiwic2VyaWYiOworCWZvbnQtc3R5bGU6aXRhbGljO30KK2g2CisJe21hcmdpbi10b3A6MTIuMHB0OworCW1hcmdpbi1yaWdodDowY207CisJbWFyZ2luLWJvdHRvbTozLjBwdDsKKwltYXJnaW4tbGVmdDo1Ny42cHQ7CisJdGV4dC1pbmRlbnQ6LTU3LjZwdDsKKwlmb250LXNpemU6MTEuMHB0OworCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iLCJzZXJpZiI7fQorcC5Nc29IZWFkaW5nNywgbGkuTXNvSGVhZGluZzcsIGRpdi5Nc29IZWFkaW5nNworCXttYXJnaW4tdG9wOjEyLjBwdDsKKwltYXJnaW4tcmlnaHQ6MGNtOworCW1hcmdpbi1ib3R0b206My4wcHQ7CisJbWFyZ2luLWxlZnQ6NjQuOHB0OworCXRleHQtaW5kZW50Oi02NC44cHQ7CisJZm9udC1zaXplOjEyLjBwdDsKKwlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIiwic2VyaWYiO30KK3AuTXNvSGVhZGluZzgsIGxpLk1zb0hlYWRpbmc4LCBkaXYuTXNvSGVhZGluZzgKKwl7bWFyZ2luLXRvcDoxMi4wcHQ7CisJbWFyZ2luLXJpZ2h0OjBjbTsKKwltYXJnaW4tYm90dG9tOjMuMHB0OworCW1hcmdpbi1sZWZ0OjcyLjBwdDsKKwl0ZXh0LWluZGVudDotNzIuMHB0OworCWZvbnQtc2l6ZToxMi4wcHQ7CisJZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiIsInNlcmlmIjsKKwlmb250LXN0eWxlOml0YWxpYzt9CitwLk1zb0hlYWRpbmc5LCBsaS5Nc29IZWFkaW5nOSwgZGl2Lk1zb0hlYWRpbmc5CisJe21hcmdpbi10b3A6MTIuMHB0OworCW1hcmdpbi1yaWdodDowY207CisJbWFyZ2luLWJvdHRvbTozLjBwdDsKKwltYXJnaW4tbGVmdDo3OS4ycHQ7CisJdGV4dC1pbmRlbnQ6LTc5LjJwdDsKKwlmb250LXNpemU6MTEuMHB0OworCWZvbnQtZmFtaWx5OiJBcmlhbCIsInNhbnMtc2VyaWYiO30KK3AuTXNvVG9jMSwgbGkuTXNvVG9jMSwgZGl2Lk1zb1RvYzEKKwl7bWFyZ2luLXRvcDo2LjBwdDsKKwltYXJnaW4tcmlnaHQ6MGNtOworCW1hcmdpbi1ib3R0b206Ni4wcHQ7CisJbWFyZ2luLWxlZnQ6MGNtOworCWxpbmUtaGVpZ2h0OjE1MCU7CisJZm9udC1zaXplOjEwLjVwdDsKKwlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIiwic2VyaWYiOworCXRleHQtdHJhbnNmb3JtOnVwcGVyY2FzZTsKKwlmb250LXdlaWdodDpib2xkO30KK3AuTXNvVG9jMiwgbGkuTXNvVG9jMiwgZGl2Lk1zb1RvYzIKKwl7bWFyZ2luLXRvcDowY207CisJbWFyZ2luLXJpZ2h0OjBjbTsKKwltYXJnaW4tYm90dG9tOjBjbTsKKwltYXJnaW4tbGVmdDoxMi4wcHQ7CisJbWFyZ2luLWJvdHRvbTouMDAwMXB0OworCWxpbmUtaGVpZ2h0OjE1MCU7CisJZm9udC1zaXplOjEwLjVwdDsKKwlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIiwic2VyaWYiOworCWZvbnQtdmFyaWFudDpzbWFsbC1jYXBzO30KK3AuTXNvVG9jMywgbGkuTXNvVG9jMywgZGl2Lk1zb1RvYzMKKwl7bWFyZ2luLXRvcDowY207CisJbWFyZ2luLXJpZ2h0OjBjbTsKKwltYXJnaW4tYm90dG9tOjBjbTsKKwltYXJnaW4tbGVmdDoyNC4wcHQ7CisJbWFyZ2luLWJvdHRvbTouMDAwMXB0OworCWxpbmUtaGVpZ2h0OjE1MCU7CisJZm9udC1zaXplOjEwLjVwdDsKKwlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIiwic2VyaWYiOworCWZvbnQtc3R5bGU6aXRhbGljO30KK3AuTXNvVG9jNCwgbGkuTXNvVG9jNCwgZGl2Lk1zb1RvYzQKKwl7bWFyZ2luLXRvcDowY207CisJbWFyZ2luLXJpZ2h0OjBjbTsKKwltYXJnaW4tYm90dG9tOjBjbTsKKwltYXJnaW4tbGVmdDozNi4wcHQ7CisJbWFyZ2luLWJvdHRvbTouMDAwMXB0OworCWZvbnQtc2l6ZTo5LjBwdDsKKwlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIiwic2VyaWYiO30KK3AuTXNvVG9jNSwgbGkuTXNvVG9jNSwgZGl2Lk1zb1RvYzUKKwl7bWFyZ2luLXRvcDowY207CisJbWFyZ2luLXJpZ2h0OjBjbTsKKwltYXJnaW4tYm90dG9tOjBjbTsKKwltYXJnaW4tbGVmdDo0OC4wcHQ7CisJbWFyZ2luLWJvdHRvbTouMDAwMXB0OworCWZvbnQtc2l6ZTo5LjBwdDsKKwlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIiwic2VyaWYiO30KK3AuTXNvVG9jNiwgbGkuTXNvVG9jNiwgZGl2Lk1zb1RvYzYKKwl7bWFyZ2luLXRvcDowY207CisJbWFyZ2luLXJpZ2h0OjBjbTsKKwltYXJnaW4tYm90dG9tOjBjbTsKKwltYXJnaW4tbGVmdDo2MC4wcHQ7CisJbWFyZ2luLWJvdHRvbTouMDAwMXB0OworCWZvbnQtc2l6ZTo5LjBwdDsKKwlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIiwic2VyaWYiO30KK3AuTXNvVG9jNywgbGkuTXNvVG9jNywgZGl2Lk1zb1RvYzcKKwl7bWFyZ2luLXRvcDowY207CisJbWFyZ2luLXJpZ2h0OjBjbTsKKwltYXJnaW4tYm90dG9tOjBjbTsKKwltYXJnaW4tbGVmdDo3Mi4wcHQ7CisJbWFyZ2luLWJvdHRvbTouMDAwMXB0OworCWZvbnQtc2l6ZTo5LjBwdDsKKwlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIiwic2VyaWYiO30KK3AuTXNvVG9jOCwgbGkuTXNvVG9jOCwgZGl2Lk1zb1RvYzgKKwl7bWFyZ2luLXRvcDowY207CisJbWFyZ2luLXJpZ2h0OjBjbTsKKwltYXJnaW4tYm90dG9tOjBjbTsKKwltYXJnaW4tbGVmdDo4NC4wcHQ7CisJbWFyZ2luLWJvdHRvbTouMDAwMXB0OworCWZvbnQtc2l6ZTo5LjBwdDsKKwlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIiwic2VyaWYiO30KK3AuTXNvVG9jOSwgbGkuTXNvVG9jOSwgZGl2Lk1zb1RvYzkKKwl7bWFyZ2luLXRvcDowY207CisJbWFyZ2luLXJpZ2h0OjBjbTsKKwltYXJnaW4tYm90dG9tOjBjbTsKKwltYXJnaW4tbGVmdDo5Ni4wcHQ7CisJbWFyZ2luLWJvdHRvbTouMDAwMXB0OworCWZvbnQtc2l6ZTo5LjBwdDsKKwlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIiwic2VyaWYiO30KK3AuTXNvRm9vdG5vdGVUZXh0LCBsaS5Nc29Gb290bm90ZVRleHQsIGRpdi5Nc29Gb290bm90ZVRleHQKKwl7bWFyZ2luOjBjbTsKKwltYXJnaW4tYm90dG9tOi4wMDAxcHQ7CisJZm9udC1zaXplOjEwLjBwdDsKKwlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIiwic2VyaWYiO30KK3AuTXNvSGVhZGVyLCBsaS5Nc29IZWFkZXIsIGRpdi5Nc29IZWFkZXIKKwl7bWFyZ2luOjBjbTsKKwltYXJnaW4tYm90dG9tOi4wMDAxcHQ7CisJZm9udC1zaXplOjEyLjBwdDsKKwlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIiwic2VyaWYiO30KK3AuTXNvRm9vdGVyLCBsaS5Nc29Gb290ZXIsIGRpdi5Nc29Gb290ZXIKKwl7bWFyZ2luOjBjbTsKKwltYXJnaW4tYm90dG9tOi4wMDAxcHQ7CisJZm9udC1zaXplOjEyLjBwdDsKKwlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIiwic2VyaWYiO30KK3AuTXNvQ2FwdGlvbiwgbGkuTXNvQ2FwdGlvbiwgZGl2Lk1zb0NhcHRpb24KKwl7bWFyZ2luOjBjbTsKKwltYXJnaW4tYm90dG9tOi4wMDAxcHQ7CisJZm9udC1zaXplOjExLjBwdDsKKwlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIiwic2VyaWYiOworCWZvbnQtd2VpZ2h0OmJvbGQ7fQorc3Bhbi5Nc29Gb290bm90ZVJlZmVyZW5jZQorCXt2ZXJ0aWNhbC1hbGlnbjpzdXBlcjt9CitwLk1zb1RpdGxlLCBsaS5Nc29UaXRsZSwgZGl2Lk1zb1RpdGxlCisJe21hcmdpbi10b3A6MTIuMHB0OworCW1hcmdpbi1yaWdodDowY207CisJbWFyZ2luLWJvdHRvbToxMjAuMHB0OworCW1hcmdpbi1sZWZ0OjBjbTsKKwl0ZXh0LWFsaWduOmNlbnRlcjsKKwlmb250LXNpemU6MTYuMHB0OworCWZvbnQtZmFtaWx5OiJBcmlhbCIsInNhbnMtc2VyaWYiOworCWZvbnQtd2VpZ2h0OmJvbGQ7fQorcC5Nc29Cb2R5VGV4dCwgbGkuTXNvQm9keVRleHQsIGRpdi5Nc29Cb2R5VGV4dAorCXttc28tc3R5bGUtbGluazoiQm9keSBUZXh0IENoYXIiOworCW1hcmdpbi10b3A6MGNtOworCW1hcmdpbi1yaWdodDowY207CisJbWFyZ2luLWJvdHRvbTo2LjBwdDsKKwltYXJnaW4tbGVmdDowY207CisJZm9udC1zaXplOjEyLjBwdDsKKwlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIiwic2VyaWYiO30KK2E6bGluaywgc3Bhbi5Nc29IeXBlcmxpbmsKKwl7Y29sb3I6Ymx1ZTsKKwl0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lO30KK2E6dmlzaXRlZCwgc3Bhbi5Nc29IeXBlcmxpbmtGb2xsb3dlZAorCXtjb2xvcjpwdXJwbGU7CisJdGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTt9CitwLk1zb0FjZXRhdGUsIGxpLk1zb0FjZXRhdGUsIGRpdi5Nc29BY2V0YXRlCisJe21hcmdpbjowY207CisJbWFyZ2luLWJvdHRvbTouMDAwMXB0OworCWZvbnQtc2l6ZTo4LjBwdDsKKwlmb250LWZhbWlseToiVGFob21hIiwic2Fucy1zZXJpZiI7fQorc3Bhbi5Cb2R5VGV4dENoYXIKKwl7bXNvLXN0eWxlLW5hbWU6IkJvZHkgVGV4dCBDaGFyIjsKKwltc28tc3R5bGUtbGluazoiQm9keSBUZXh0Ijt9CisgLyogUGFnZSBEZWZpbml0aW9ucyAqLworIEBwYWdlIFdvcmRTZWN0aW9uMQorCXtzaXplOjU5NS40NXB0IDg0MS43cHQ7CisJbWFyZ2luOjcyLjBwdCA5MC4wcHQgNzIuMHB0IDkwLjBwdDt9CitkaXYuV29yZFNlY3Rpb24xCisJe3BhZ2U6V29yZFNlY3Rpb24xO30KK0BwYWdlIFdvcmRTZWN0aW9uMgorCXtzaXplOjU5NS40NXB0IDg0MS43cHQ7CisJbWFyZ2luOjcyLjBwdCA5MC4wcHQgNzIuMHB0IDkwLjBwdDt9CitkaXYuV29yZFNlY3Rpb24yCisJe3BhZ2U6V29yZFNlY3Rpb24yO30KKyAvKiBMaXN0IERlZmluaXRpb25zICovCisgb2wKKwl7bWFyZ2luLWJvdHRvbTowY207fQordWwKKwl7bWFyZ2luLWJvdHRvbTowY207fQorLS0+Cis8L3N0eWxlPgorCis8L2hlYWQ+CisKKzxib2R5IGxhbmc9RU4tVVMgbGluaz1ibHVlIHZsaW5rPXB1cnBsZT4KKworPGRpdiBjbGFzcz1Xb3JkU2VjdGlvbjE+CisKKzxwIGNsYXNzPU1zb1RpdGxlPkZvcndhcmQgTG9jayBDb252ZXJ0ZXIgQW5kIERlY29kZXI8L3A+CisKKzxwIGNsYXNzPU1zb1RvYzE+PHNwYW4KK2NsYXNzPU1zb0h5cGVybGluaz48YSBocmVmPSIjX1RvYzI3NjQ3MTQyMiI+MTxzcGFuIHN0eWxlPSdmb250LXNpemU6MTIuMHB0OworbGluZS1oZWlnaHQ6MTUwJTtjb2xvcjp3aW5kb3d0ZXh0O3RleHQtdHJhbnNmb3JtOm5vbmU7Zm9udC13ZWlnaHQ6bm9ybWFsOwordGV4dC1kZWNvcmF0aW9uOm5vbmUnPqCgoKCgIDwvc3Bhbj5JbnRyb2R1Y3Rpb248c3BhbiBzdHlsZT0nY29sb3I6d2luZG93dGV4dDsKK2Rpc3BsYXk6bm9uZTt0ZXh0LWRlY29yYXRpb246bm9uZSc+LiA8L3NwYW4+PHNwYW4KK3N0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0O2Rpc3BsYXk6bm9uZTt0ZXh0LWRlY29yYXRpb246bm9uZSc+Mzwvc3Bhbj48L2E+PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvVG9jMT48c3BhbiBjbGFzcz1Nc29IeXBlcmxpbms+PGEgaHJlZj0iI19Ub2MyNzY0NzE0MjMiPjI8c3Bhbgorc3R5bGU9J2ZvbnQtc2l6ZToxMi4wcHQ7bGluZS1oZWlnaHQ6MTUwJTtjb2xvcjp3aW5kb3d0ZXh0O3RleHQtdHJhbnNmb3JtOm5vbmU7Citmb250LXdlaWdodDpub3JtYWw7dGV4dC1kZWNvcmF0aW9uOm5vbmUnPqCgoKCgIDwvc3Bhbj5PdmVydmlldzxzcGFuCitzdHlsZT0nY29sb3I6d2luZG93dGV4dDtkaXNwbGF5Om5vbmU7dGV4dC1kZWNvcmF0aW9uOm5vbmUnPi4uLiA8L3NwYW4+PHNwYW4KK3N0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0O2Rpc3BsYXk6bm9uZTt0ZXh0LWRlY29yYXRpb246bm9uZSc+Mzwvc3Bhbj48L2E+PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvVG9jMT48c3BhbiBjbGFzcz1Nc29IeXBlcmxpbms+PGEgaHJlZj0iI19Ub2MyNzY0NzE0MjQiPjM8c3Bhbgorc3R5bGU9J2ZvbnQtc2l6ZToxMi4wcHQ7bGluZS1oZWlnaHQ6MTUwJTtjb2xvcjp3aW5kb3d0ZXh0O3RleHQtdHJhbnNmb3JtOm5vbmU7Citmb250LXdlaWdodDpub3JtYWw7dGV4dC1kZWNvcmF0aW9uOm5vbmUnPqCgoKCgIDwvc3Bhbj5Vc2UgQ2FzZXM8c3Bhbgorc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7ZGlzcGxheTpub25lO3RleHQtZGVjb3JhdGlvbjpub25lJz4uIDwvc3Bhbj48c3Bhbgorc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7ZGlzcGxheTpub25lO3RleHQtZGVjb3JhdGlvbjpub25lJz40PC9zcGFuPjwvYT48L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ub2MyPjxzcGFuIGNsYXNzPU1zb0h5cGVybGluaz48c3BhbiBzdHlsZT0nZm9udC12YXJpYW50Om5vcm1hbCAhaW1wb3J0YW50OwordGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlJz48YSBocmVmPSIjX1RvYzI3NjQ3MTQyNSI+My4xPHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToKKzEyLjBwdDtsaW5lLWhlaWdodDoxNTAlO2NvbG9yOndpbmRvd3RleHQ7dGV4dC10cmFuc2Zvcm06bm9uZTt0ZXh0LWRlY29yYXRpb246Citub25lJz6goKCgoKCgIDwvc3Bhbj5Db252ZXJ0ZXI8c3BhbiBzdHlsZT0nY29sb3I6d2luZG93dGV4dDtkaXNwbGF5Om5vbmU7Cit0ZXh0LWRlY29yYXRpb246bm9uZSc+LiA8L3NwYW4+PHNwYW4KK3N0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0O2Rpc3BsYXk6bm9uZTt0ZXh0LWRlY29yYXRpb246bm9uZSc+NDwvc3Bhbj48L2E+PC9zcGFuPjwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb1RvYzM+PHNwYW4gY2xhc3M9TXNvSHlwZXJsaW5rPjxhIGhyZWY9IiNfVG9jMjc2NDcxNDI2Ij4zLjEuMTxzcGFuCitzdHlsZT0nZm9udC1zaXplOjEyLjBwdDtsaW5lLWhlaWdodDoxNTAlO2NvbG9yOndpbmRvd3RleHQ7Zm9udC1zdHlsZTpub3JtYWw7Cit0ZXh0LWRlY29yYXRpb246bm9uZSc+oKCgoCA8L3NwYW4+Q29udmVydCBEYXRhIChQdXNoLU1vZGUgQ29udmVyc2lvbik8c3Bhbgorc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7ZGlzcGxheTpub25lO3RleHQtZGVjb3JhdGlvbjpub25lJz4gPC9zcGFuPjxzcGFuCitzdHlsZT0nY29sb3I6d2luZG93dGV4dDtkaXNwbGF5Om5vbmU7dGV4dC1kZWNvcmF0aW9uOm5vbmUnPjQ8L3NwYW4+PC9hPjwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb1RvYzM+PHNwYW4gY2xhc3M9TXNvSHlwZXJsaW5rPjxhIGhyZWY9IiNfVG9jMjc2NDcxNDI3Ij4zLjEuMjxzcGFuCitzdHlsZT0nZm9udC1zaXplOjEyLjBwdDtsaW5lLWhlaWdodDoxNTAlO2NvbG9yOndpbmRvd3RleHQ7Zm9udC1zdHlsZTpub3JtYWw7Cit0ZXh0LWRlY29yYXRpb246bm9uZSc+oKCgoCA8L3NwYW4+Q29udmVydCBGaWxlIChQdWxsLU1vZGUgQ29udmVyc2lvbik8c3Bhbgorc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7ZGlzcGxheTpub25lO3RleHQtZGVjb3JhdGlvbjpub25lJz4gPC9zcGFuPjxzcGFuCitzdHlsZT0nY29sb3I6d2luZG93dGV4dDtkaXNwbGF5Om5vbmU7dGV4dC1kZWNvcmF0aW9uOm5vbmUnPjY8L3NwYW4+PC9hPjwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb1RvYzI+PHNwYW4gY2xhc3M9TXNvSHlwZXJsaW5rPjxzcGFuIHN0eWxlPSdmb250LXZhcmlhbnQ6bm9ybWFsICFpbXBvcnRhbnQ7Cit0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2UnPjxhIGhyZWY9IiNfVG9jMjc2NDcxNDI4Ij4zLjI8c3BhbiBzdHlsZT0nZm9udC1zaXplOgorMTIuMHB0O2xpbmUtaGVpZ2h0OjE1MCU7Y29sb3I6d2luZG93dGV4dDt0ZXh0LXRyYW5zZm9ybTpub25lO3RleHQtZGVjb3JhdGlvbjoKK25vbmUnPqCgoKCgoKAgPC9zcGFuPkRlY29kZXI8c3BhbiBzdHlsZT0nY29sb3I6d2luZG93dGV4dDtkaXNwbGF5Om5vbmU7Cit0ZXh0LWRlY29yYXRpb246bm9uZSc+LiA8L3NwYW4+PHNwYW4KK3N0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0O2Rpc3BsYXk6bm9uZTt0ZXh0LWRlY29yYXRpb246bm9uZSc+Nzwvc3Bhbj48L2E+PC9zcGFuPjwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb1RvYzM+PHNwYW4gY2xhc3M9TXNvSHlwZXJsaW5rPjxhIGhyZWY9IiNfVG9jMjc2NDcxNDI5Ij4zLjIuMTxzcGFuCitzdHlsZT0nZm9udC1zaXplOjEyLjBwdDtsaW5lLWhlaWdodDoxNTAlO2NvbG9yOndpbmRvd3RleHQ7Zm9udC1zdHlsZTpub3JtYWw7Cit0ZXh0LWRlY29yYXRpb246bm9uZSc+oKCgoCA8L3NwYW4+Q2hlY2sgSW50ZWdyaXR5PHNwYW4gc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7CitkaXNwbGF5Om5vbmU7dGV4dC1kZWNvcmF0aW9uOm5vbmUnPi4gPC9zcGFuPjxzcGFuCitzdHlsZT0nY29sb3I6d2luZG93dGV4dDtkaXNwbGF5Om5vbmU7dGV4dC1kZWNvcmF0aW9uOm5vbmUnPjg8L3NwYW4+PC9hPjwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb1RvYzM+PHNwYW4gY2xhc3M9TXNvSHlwZXJsaW5rPjxhIGhyZWY9IiNfVG9jMjc2NDcxNDMwIj4zLjIuMjxzcGFuCitzdHlsZT0nZm9udC1zaXplOjEyLjBwdDtsaW5lLWhlaWdodDoxNTAlO2NvbG9yOndpbmRvd3RleHQ7Zm9udC1zdHlsZTpub3JtYWw7Cit0ZXh0LWRlY29yYXRpb246bm9uZSc+oKCgoCA8L3NwYW4+R2V0IENvbnRlbnQgVHlwZTxzcGFuIHN0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0OworZGlzcGxheTpub25lO3RleHQtZGVjb3JhdGlvbjpub25lJz4uIDwvc3Bhbj48c3Bhbgorc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7ZGlzcGxheTpub25lO3RleHQtZGVjb3JhdGlvbjpub25lJz45PC9zcGFuPjwvYT48L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ub2MzPjxzcGFuIGNsYXNzPU1zb0h5cGVybGluaz48YSBocmVmPSIjX1RvYzI3NjQ3MTQzMSI+My4yLjM8c3Bhbgorc3R5bGU9J2ZvbnQtc2l6ZToxMi4wcHQ7bGluZS1oZWlnaHQ6MTUwJTtjb2xvcjp3aW5kb3d0ZXh0O2ZvbnQtc3R5bGU6bm9ybWFsOwordGV4dC1kZWNvcmF0aW9uOm5vbmUnPqCgoKAgPC9zcGFuPkRlY29kZSBGaWxlPHNwYW4gc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7CitkaXNwbGF5Om5vbmU7dGV4dC1kZWNvcmF0aW9uOm5vbmUnPi4gPC9zcGFuPjxzcGFuCitzdHlsZT0nY29sb3I6d2luZG93dGV4dDtkaXNwbGF5Om5vbmU7dGV4dC1kZWNvcmF0aW9uOm5vbmUnPjEwPC9zcGFuPjwvYT48L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ub2MxPjxzcGFuIGNsYXNzPU1zb0h5cGVybGluaz48YSBocmVmPSIjX1RvYzI3NjQ3MTQzMiI+NDxzcGFuCitzdHlsZT0nZm9udC1zaXplOjEyLjBwdDtsaW5lLWhlaWdodDoxNTAlO2NvbG9yOndpbmRvd3RleHQ7dGV4dC10cmFuc2Zvcm06bm9uZTsKK2ZvbnQtd2VpZ2h0Om5vcm1hbDt0ZXh0LWRlY29yYXRpb246bm9uZSc+oKCgoKAgPC9zcGFuPkRlZmluaXRpb24gb2YgdGhlCitJbnRlcm5hbCBGb3J3YXJkIExvY2sgRmlsZSBGb3JtYXQ8c3BhbiBzdHlsZT0nY29sb3I6d2luZG93dGV4dDtkaXNwbGF5Om5vbmU7Cit0ZXh0LWRlY29yYXRpb246bm9uZSc+LiA8L3NwYW4+PHNwYW4KK3N0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0O2Rpc3BsYXk6bm9uZTt0ZXh0LWRlY29yYXRpb246bm9uZSc+MTE8L3NwYW4+PC9hPjwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb1RvYzI+PHNwYW4gY2xhc3M9TXNvSHlwZXJsaW5rPjxzcGFuIHN0eWxlPSdmb250LXZhcmlhbnQ6bm9ybWFsICFpbXBvcnRhbnQ7Cit0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2UnPjxhIGhyZWY9IiNfVG9jMjc2NDcxNDMzIj40LjE8c3BhbiBzdHlsZT0nZm9udC1zaXplOgorMTIuMHB0O2xpbmUtaGVpZ2h0OjE1MCU7Y29sb3I6d2luZG93dGV4dDt0ZXh0LXRyYW5zZm9ybTpub25lO3RleHQtZGVjb3JhdGlvbjoKK25vbmUnPqCgoKCgoKAgPC9zcGFuPktleSBEZXJpdmF0aW9uPHNwYW4gc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7ZGlzcGxheTpub25lOwordGV4dC1kZWNvcmF0aW9uOm5vbmUnPi4uIDwvc3Bhbj48c3Bhbgorc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7ZGlzcGxheTpub25lO3RleHQtZGVjb3JhdGlvbjpub25lJz4xMTwvc3Bhbj48L2E+PC9zcGFuPjwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb1RvYzI+PHNwYW4gY2xhc3M9TXNvSHlwZXJsaW5rPjxzcGFuIHN0eWxlPSdmb250LXZhcmlhbnQ6bm9ybWFsICFpbXBvcnRhbnQ7Cit0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2UnPjxhIGhyZWY9IiNfVG9jMjc2NDcxNDM0Ij40LjI8c3BhbiBzdHlsZT0nZm9udC1zaXplOgorMTIuMHB0O2xpbmUtaGVpZ2h0OjE1MCU7Y29sb3I6d2luZG93dGV4dDt0ZXh0LXRyYW5zZm9ybTpub25lO3RleHQtZGVjb3JhdGlvbjoKK25vbmUnPqCgoKCgoKAgPC9zcGFuPkNhbGN1bGF0aW9uIG9mIHRoZSBDb3VudGVyczxzcGFuIHN0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0OworZGlzcGxheTpub25lO3RleHQtZGVjb3JhdGlvbjpub25lJz4uIDwvc3Bhbj48c3Bhbgorc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7ZGlzcGxheTpub25lO3RleHQtZGVjb3JhdGlvbjpub25lJz4xMjwvc3Bhbj48L2E+PC9zcGFuPjwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb1RvYzE+PHNwYW4gY2xhc3M9TXNvSHlwZXJsaW5rPjxhIGhyZWY9IiNfVG9jMjc2NDcxNDM1Ij41PHNwYW4KK3N0eWxlPSdmb250LXNpemU6MTIuMHB0O2xpbmUtaGVpZ2h0OjE1MCU7Y29sb3I6d2luZG93dGV4dDt0ZXh0LXRyYW5zZm9ybTpub25lOworZm9udC13ZWlnaHQ6bm9ybWFsO3RleHQtZGVjb3JhdGlvbjpub25lJz6goKCgoCA8L3NwYW4+VW5pdCBUZXN0IENhc2VzPHNwYW4KK3N0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0O2Rpc3BsYXk6bm9uZTt0ZXh0LWRlY29yYXRpb246bm9uZSc+LiA8L3NwYW4+PHNwYW4KK3N0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0O2Rpc3BsYXk6bm9uZTt0ZXh0LWRlY29yYXRpb246bm9uZSc+MTI8L3NwYW4+PC9hPjwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb1RvYzE+PHNwYW4gY2xhc3M9TXNvSHlwZXJsaW5rPjxhIGhyZWY9IiNfVG9jMjc2NDcxNDM2Ij42PHNwYW4KK3N0eWxlPSdmb250LXNpemU6MTIuMHB0O2xpbmUtaGVpZ2h0OjE1MCU7Y29sb3I6d2luZG93dGV4dDt0ZXh0LXRyYW5zZm9ybTpub25lOworZm9udC13ZWlnaHQ6bm9ybWFsO3RleHQtZGVjb3JhdGlvbjpub25lJz6goKCgoCA8L3NwYW4+UmVmZXJlbmNlczxzcGFuCitzdHlsZT0nY29sb3I6d2luZG93dGV4dDtkaXNwbGF5Om5vbmU7dGV4dC1kZWNvcmF0aW9uOm5vbmUnPi4gPC9zcGFuPjxzcGFuCitzdHlsZT0nY29sb3I6d2luZG93dGV4dDtkaXNwbGF5Om5vbmU7dGV4dC1kZWNvcmF0aW9uOm5vbmUnPjEyPC9zcGFuPjwvYT48L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Cb2R5VGV4dD48L3A+CisKKzwvZGl2PgorCis8c3BhbiBzdHlsZT0nZm9udC1zaXplOjEyLjBwdDtmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIiwic2VyaWYiJz48YnIKK2NsZWFyPWFsbCBzdHlsZT0ncGFnZS1icmVhay1iZWZvcmU6cmlnaHQnPgorPC9zcGFuPgorCis8ZGl2IGNsYXNzPVdvcmRTZWN0aW9uMj4KKworPGgxPjxhIG5hbWU9Il9Ub2MyNzY0NzE0MjIiPjwvYT48YSBuYW1lPSJfUmVmMjYzMDg1NDc0Ij4xPHNwYW4KK3N0eWxlPSdmb250OjcuMHB0ICJUaW1lcyBOZXcgUm9tYW4iJz4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgPC9zcGFuPkludHJvZHVjdGlvbjwvYT48L2gxPgorCis8cCBjbGFzcz1Nc29Cb2R5VGV4dD5UaGUgaW50ZXJuYWwgRm9yd2FyZCBMb2NrIGZpbGUgZm9ybWF0IGlzIHVzZWQgZm9yIGVuY3J5cHRpbmcKK2luaGVyZW50bHkgdW5lbmNyeXB0ZWQgT01BIERSTSB2ZXJzaW9uIDEgRm9yd2FyZCBMb2NrIGFuZCBDb21iaW5lZCBEZWxpdmVyeQorZmlsZXMgc28gdGhleSBjYW4gYmUgc2VjdXJlbHkgc3RvcmVkIG9uIGV4dGVybmFsbHkgYWNjZXNzaWJsZSBmaWxlIHN5c3RlbSBwYXJ0aXRpb25zCitzdWNoIGFzIG1lbW9yeSBzdGljay48L3A+CisKKzxwIGNsYXNzPU1zb0JvZHlUZXh0Pk91ciBnZW5lcmFsIHN0cmF0ZWd5IGlzIHRvIGNvbnZlcnQgc3VjaCA8aT5PTUEgRFJNIE1lc3NhZ2U8L2k+CisokS5kbZIpIGZpbGVzIHRvIGludGVybmFsIEZvcndhcmQgTG9jayAokS5mbJIpIGZpbGVzIGFzIHNvb24gYXMgdGhleSBhcmUKK2Rvd25sb2FkZWQgb3Igb3RoZXJ3aXNlIHRyYW5zZmVycmVkIHRvIHRoZSBwaG9uZSwgYW5kIG5vdCBhY3R1YWxseSBwcm92aWRlIGFueQorZGVjb2RlcnMgZm9yIJEuZG2SIGZpbGVzLjwvcD4KKworPGgxPjxhIG5hbWU9Il9Ub2MyNzY0NzE0MjMiPjI8c3BhbiBzdHlsZT0nZm9udDo3LjBwdCAiVGltZXMgTmV3IFJvbWFuIic+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Cis8L3NwYW4+T3ZlcnZpZXc8L2E+PC9oMT4KKworPHAgY2xhc3M9TXNvQm9keVRleHQ+VGhlIDxpPkZvcndhcmQgTG9jayBDb252ZXJ0ZXI8L2k+IGNvbnZlcnRzIE9NQSBEUk0gTWVzc2FnZQorZmlsZXMgdG8gdGhlIGludGVybmFsIGZpbGUgZm9ybWF0LiBUaGUgPGk+Rm9yd2FyZCBMb2NrIERlY29kZXI8L2k+IHByb3ZpZGVzIGEKK1BPU0lYLWxldmVsIEFQSSBmb3IgdHJhbnNwYXJlbnQgcmVhZGluZyBhbmQgc2Vla2luZyB0aHJvdWdoIHN1Y2ggYSBjb252ZXJ0ZWQKK2ZpbGUgYXMgaWYgaXQgd2VyZSB1bmVuY3J5cHRlZC4gVGhlIEFQSSBhbHNvIGluY2x1ZGVzIGZ1bmN0aW9ucyBmb3IgY2hlY2tpbmcgYQorZmlsZZJzIGludGVncml0eSBhbmQgZ2V0dGluZyB0aGUgTUlNRSB0eXBlIG9mIGl0cyBlbWJlZGRlZCBjb250ZW50LjwvcD4KKworPHAgY2xhc3M9TXNvQm9keVRleHQgc3R5bGU9J21hcmdpbi1ib3R0b206MjQuMHB0Jz5UaGUgY29udmVydGVyIGFuZCBkZWNvZGVyIGFyZQorYnVpbHQgaW50byB0d28gc2VwYXJhdGUgbGlicmFyaWVzLCB3aGljaCBzaGFyZSBjb21tb24gY29kZSBmb3IgcmFuZG9tIG51bWJlcgorZ2VuZXJhdGlvbiBhbmQga2V5IGVuY3J5cHRpb24gaW4gYSB0aGlyZCBsaWJyYXJ5LiBGb3IgdGVzdCBwdXJwb3NlcyB0aGVyZSBpcworYWxzbyBhIHVuaXQgdGVzdCBhcHBsaWNhdGlvbi4gU2VlIEZpZ3VyZSAxLjwvcD4KKworPHAgY2xhc3M9TXNvQm9keVRleHQgc3R5bGU9J3BhZ2UtYnJlYWstYWZ0ZXI6YXZvaWQnPjxpbWcgd2lkdGg9Mjg4IGhlaWdodD0zNjQKK3NyYz0iaW1hZ2VzL2ltYWdlMDAxLmdpZiI+PC9wPgorCis8cCBjbGFzcz1Nc29DYXB0aW9uIHN0eWxlPSdtYXJnaW4tdG9wOjEyLjBwdDttYXJnaW4tcmlnaHQ6MGNtO21hcmdpbi1ib3R0b206CisxMi4wcHQ7bWFyZ2luLWxlZnQ6MGNtJz48YSBuYW1lPSJfUmVmMjYyNzMwODg1Ij5GaWd1cmUgPC9hPjEuIEJsb2NrIGRpYWdyYW0gaWxsdXN0cmF0aW5nIHRoZSBkZXBlbmRlbmNpZXMgYmV0d2VlbiB0aGUgZXhlY3V0YWJsZSBtb2R1bGVzLjwvcD4KKworPGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxNi4wcHQ7Zm9udC1mYW1pbHk6IkFyaWFsIiwic2Fucy1zZXJpZiInPjxicgorY2xlYXI9YWxsIHN0eWxlPSdwYWdlLWJyZWFrLWJlZm9yZTphbHdheXMnPgorPC9zcGFuPjwvYj4KKworPGgxPjxhIG5hbWU9Il9Ub2MyNzY0NzE0MjQiPjM8c3BhbiBzdHlsZT0nZm9udDo3LjBwdCAiVGltZXMgTmV3IFJvbWFuIic+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Cis8L3NwYW4+VXNlIENhc2VzPC9hPjwvaDE+CisKKzxwIGNsYXNzPU1zb0JvZHlUZXh0PlRoaXMgc2VjdGlvbiBkZXNjcmliZXMgYWxsIHRoZSB1c2UgY2FzZXMgZm9yIHRoZSBjb252ZXJ0ZXIKK2FuZCBkZWNvZGVyLiBJdCBzaG93cyB0aGUgc2VxdWVuY2Ugb2YgQVBJIGNhbGxzIHRoYXQgc2hvdWxkIGJlIHVzZWQgdG8gc29sdmUKK3RoZXNlIHVzZSBjYXNlcy48L3A+CisKKzxoMj48YSBuYW1lPSJfVG9jMjc2NDcxNDI1Ij4zLjE8c3BhbiBzdHlsZT0nZm9udDo3LjBwdCAiVGltZXMgTmV3IFJvbWFuIic+Jm5ic3A7Jm5ic3A7Jm5ic3A7Cis8L3NwYW4+Q29udmVydGVyPC9hPjwvaDI+CisKKzxwIGNsYXNzPU1zb0JvZHlUZXh0PlRocm91Z2ggdGhlIGNvbnZlcnRlciBBUEksIGNvbnZlcnNpb24gY2FuIGJlIHBlcmZvcm1lZCBpbiBvbmUKK29mIHR3byB3YXlzOjwvcD4KKworPHAgY2xhc3M9TXNvQm9keVRleHQgc3R5bGU9J21hcmdpbi1sZWZ0OjM2LjBwdDt0ZXh0LWluZGVudDotMTguMHB0Jz4xLjxzcGFuCitzdHlsZT0nZm9udDo3LjBwdCAiVGltZXMgTmV3IFJvbWFuIic+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IDwvc3Bhbj48aT5QdXNoLW1vZGUKK2NvbnZlcnNpb248L2k+IGlzIHdoZW4gdGhlIGNsaWVudCBwcm9ncmVzc2l2ZWx5IGZlZWRzIGRhdGEgdG8gdGhlIGNvbnZlcnRlciBhcworaXQgYXJyaXZlcy4gVGhpcyBpcyBhcHByb3ByaWF0ZSB3aGVuIGRhdGEgYXJyaXZlcyBncmFkdWFsbHkgaW4gY2h1bmtzLCB3aXRoCitpZGxlIHRpbWUgaW4gYmV0d2Vlbi4gQ29uc2VxdWVudGx5LCBwdXNoIG1vZGUgaXMgdXNlZCBmb3IgY29udmVydGluZyBmaWxlcworYmVpbmcgZG93bmxvYWRlZCB0aHJvdWdoIEhUVFAuIFNlZSBzZWN0aW9uIDMuMS4xLjwvcD4KKworPHAgY2xhc3M9TXNvQm9keVRleHQgc3R5bGU9J21hcmdpbi1sZWZ0OjM2LjBwdDt0ZXh0LWluZGVudDotMTguMHB0Jz4yLjxzcGFuCitzdHlsZT0nZm9udDo3LjBwdCAiVGltZXMgTmV3IFJvbWFuIic+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IDwvc3Bhbj48aT5QdWxsLW1vZGUKK2NvbnZlcnNpb248L2k+IGlzIHdoZW4gdGhlIGNvbnZlcnRlciBkcml2ZXMgdGhlIHByb2Nlc3MgYW5kIGNvbnN1bWVzIGRhdGEgZnJvbQordGhlIGNsaWVudCBhcyBpdCBuZWVkcyBpdC4gVGhpcyBpcyBhcHByb3ByaWF0ZSB3aGVuIHRoZSBlbnRpcmUgZmlsZSB0byBiZQorY29udmVydGVkIGlzIHJlYWRpbHkgYXZhaWxhYmxlLiBIZW5jZSwgcHVsbCBtb2RlIGlzIHVzZWQgYnkgdGhlIHVuaXQgdGVzdCBhcHBsaWNhdGlvbi4KK1NlZSBzZWN0aW9uIDMuMS4yLjwvcD4KKworPHAgY2xhc3M9TXNvQm9keVRleHQ+SW50ZXJuYWxseSwgcHVsbC1tb2RlIGNvbnZlcnNpb24gaXMgaW1wbGVtZW50ZWQgaW4gdGVybXMKK29mIHRoZSBBUEkgZm9yIHB1c2gtbW9kZSBjb252ZXJzaW9uLjwvcD4KKworPGgzPjxhIG5hbWU9Il9Ub2MyNzY0NzE0MjYiPjwvYT48YSBuYW1lPSJfUmVmMjYzMDg1NDc4Ij4zLjEuMTxzcGFuCitzdHlsZT0nZm9udDo3LjBwdCAiVGltZXMgTmV3IFJvbWFuIic+Jm5ic3A7Jm5ic3A7Jm5ic3A7IDwvc3Bhbj5Db252ZXJ0IERhdGEKKyhQdXNoLU1vZGUgQ29udmVyc2lvbik8L2E+PC9oMz4KKworPHAgY2xhc3M9TXNvQm9keVRleHQ+UHVzaC1tb2RlIGNvbnZlcnNpb24gaXMgcGVyZm9ybWVkIGFzIGZvbGxvd3MgKHNlZSBhbHNvIEZpZ3VyZSAyKTo8L3A+CisKKzxwIGNsYXNzPU1zb0JvZHlUZXh0IHN0eWxlPSdtYXJnaW4tbGVmdDozNi4wcHQ7dGV4dC1pbmRlbnQ6LTE4LjBwdCc+MS48c3Bhbgorc3R5bGU9J2ZvbnQ6Ny4wcHQgIlRpbWVzIE5ldyBSb21hbiInPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA8L3NwYW4+PHNwYW4KK3N0eWxlPSdmb250LXNpemU6MTAuMHB0O2ZvbnQtZmFtaWx5OiJMdWNpZGEgQ29uc29sZSIsIkRlamFWdSBTYW5zIE1vbm8iJz5Gd2RMb2NrQ29udl9PcGVuU2Vzc2lvbjwvc3Bhbj4KK2luaXRpYWxpemVzIHRoZSBvdXRwdXQgcGFyYW1ldGVyIGFuZCByZXR1cm5zIGEgPGk+c2Vzc2lvbiBJRDwvaT4gdG8gYmUgdXNlZCBpbgorc3Vic2VxdWVudCBjYWxscyB0byB0aGUgQVBJLiBUaGUgb3V0cHV0IHBhcmFtZXRlciBpcyBhIHVuaW9uIG9mIHJldHVybiB2YWx1ZXMKK3dob3NlIGNvcnJlY3QgdXNlIGF0IGFueSBnaXZlbiBtb21lbnQgaXMgZGV0ZXJtaW5lZCBieSB0aGUgQVBJIGZ1bmN0aW9uIGxhc3QKK2NhbGxlZC48L3A+CisKKzxwIGNsYXNzPU1zb0JvZHlUZXh0IHN0eWxlPSdtYXJnaW4tbGVmdDozNi4wcHQ7dGV4dC1pbmRlbnQ6LTE4LjBwdCc+Mi48c3Bhbgorc3R5bGU9J2ZvbnQ6Ny4wcHQgIlRpbWVzIE5ldyBSb21hbiInPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA8L3NwYW4+PHNwYW4KK3N0eWxlPSdmb250LXNpemU6MTAuMHB0O2ZvbnQtZmFtaWx5OiJMdWNpZGEgQ29uc29sZSIsIkRlamFWdSBTYW5zIE1vbm8iJz5Gd2RMb2NrQ29udl9Db252ZXJ0RGF0YTwvc3Bhbj4KK2lzIGNhbGxlZCByZXBlYXRlZGx5IHVudGlsIG5vIG1vcmUgaW5wdXQgZGF0YSByZW1haW5zLiBFYWNoIGNhbGwgY29udmVydHMgdGhlCittYXhpbXVtIGFtb3VudCBvZiBkYXRhIHBvc3NpYmxlIGFuZCB3cml0ZXMgaXQgdG8gdGhlIG91dHB1dCBidWZmZXIuIFRoZSBjbGllbnQgdGhlbgord3JpdGVzIHRoaXMgZGF0YSB0byBmaWxlLjwvcD4KKworPHAgY2xhc3M9TXNvQm9keVRleHQgc3R5bGU9J21hcmdpbi1sZWZ0OjM2LjBwdDt0ZXh0LWluZGVudDotMTguMHB0Jz4zLjxzcGFuCitzdHlsZT0nZm9udDo3LjBwdCAiVGltZXMgTmV3IFJvbWFuIic+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IDwvc3Bhbj48c3Bhbgorc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7Zm9udC1mYW1pbHk6Ikx1Y2lkYSBDb25zb2xlIiwiRGVqYVZ1IFNhbnMgTW9ubyInPkZ3ZExvY2tDb252X0Nsb3NlU2Vzc2lvbjwvc3Bhbj4KK2NsZWFucyB1cCB0aGUgc2Vzc2lvbiBhbmQgZGVhbGxvY2F0ZXMgdGhlIG91dHB1dCBidWZmZXIuIElmIGFsbCBoYXMgZ29uZSB3ZWxsLCBhCit0d28tcGFydCBjcnlwdG9ncmFwaGljIHNpZ25hdHVyZSBvZiB0aGUgb3V0cHV0IGZpbGUgaXMgY2FsY3VsYXRlZC4gVGhlIGNsaWVudAorbXVzdCBnbyBiYWNrIGFuZCByZXdyaXRlIHBhcnQgb2YgdGhlIGZpbGUgaGVhZGVyIHdpdGggdGhpcyB1cGRhdGVkIHNpZ25hdHVyZQoraW5mb3JtYXRpb24uPC9wPgorCis8cCBjbGFzcz1Nc29Cb2R5VGV4dD5FdmVyeSB0aW1lIGEgZmlsZSBpcyBiZWluZyBjb252ZXJ0ZWQsIHRoZSBjb252ZXJ0ZXIgY2FsbHMgPHNwYW4KK3N0eWxlPSdmb250LXNpemU6MTAuMHB0O2ZvbnQtZmFtaWx5OiJMdWNpZGEgQ29uc29sZSIsIkRlamFWdSBTYW5zIE1vbm8iJz5Gd2RMb2NrR2x1ZV9HZXRSYW5kb21OdW1iZXI8L3NwYW4+Cit0byBnZW5lcmF0ZSBhIG5ldywgdW5pcXVlIHNlc3Npb24ga2V5LiBObyB0d28gY29udmVydGVkIGZpbGVzIGxvb2sgYWxpa2UsIGV2ZW4KK2lmIHRoZSBvcmlnaW5hbCBmaWxlcyBhcmUgdGhlIHNhbWUuPC9wPgorCis8cCBjbGFzcz1Nc29Cb2R5VGV4dD48Yj5Ob3RlOjwvYj4gVGhlIHJhbmRvbSBieXRlcyBjYW5ub3QgY29tZSBmcm9tIGFueSBiYXJlLW1pbmltdW0KK2ltcGxlbWVudGF0aW9uIG9mIHRoZSBDLWxpYnJhcnkgPHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7Zm9udC1mYW1pbHk6Ikx1Y2lkYSBDb25zb2xlIiwiRGVqYVZ1IFNhbnMgTW9ubyInPnJhbmQ8L3NwYW4+CitmdW5jdGlvbpd0aGV5IG11c3QgYmUgY3J5cHRvZ3JhcGhpY2FsbHkgc2VjdXJlLiBPdGhlcndpc2UsIHNlY3VyaXR5IHdpbGwgYmUKK2NvbXByb21pc2VkLjwvcD4KKworPHAgY2xhc3M9TXNvQm9keVRleHQ+VGhlIHNlc3Npb24ga2V5IGlzIGVuY3J5cHRlZCBhbmQgc3RvcmVkIHdpdGhpbiB0aGUKK2NvbnZlcnRlZCBmaWxlLiBLZXkgZW5jcnlwdGlvbiBpcyBwZXJmb3JtZWQgdXNpbmcgPHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7Citmb250LWZhbWlseToiTHVjaWRhIENvbnNvbGUiLCJEZWphVnUgU2FucyBNb25vIic+RndkTG9ja0dsdWVfR2V0RW5jcnlwdGVkS2V5TGVuZ3RoPC9zcGFuPiBhbmQgPHNwYW4KK3N0eWxlPSdmb250LXNpemU6MTAuMHB0O2ZvbnQtZmFtaWx5OiJMdWNpZGEgQ29uc29sZSIsIkRlamFWdSBTYW5zIE1vbm8iJz5Gd2RMb2NrR2x1ZV9FbmNyeXB0S2V5PC9zcGFuPi4KK1RoZXNlIHR3byBmdW5jdGlvbnMsIHRvZ2V0aGVyIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgZGVjcnlwdGlvbiBmdW5jdGlvbiAoPHNwYW4KK3N0eWxlPSdmb250LXNpemU6MTAuMHB0O2ZvbnQtZmFtaWx5OiJMdWNpZGEgQ29uc29sZSIsIkRlamFWdSBTYW5zIE1vbm8iJz5Gd2RMb2NrR2x1ZV9EZWNyeXB0S2V5PC9zcGFuPiksCithcmUgdGhlIGludGVncmF0aW9uIHBvaW50cyB3aGVyZSBhbiBPRU0gbWFudWZhY3R1cmVyIG1heSBpbXBsZW1lbnQgdGhlaXIgb3duCitrZXktZW5jcnlwdGlvbiBzY2hlbWUuPC9wPgorCis8cCBjbGFzcz1Nc29Cb2R5VGV4dD48Yj5Ob3RlOjwvYj4gVGhlIGtleS1lbmNyeXB0aW9uIGtleSBtdXN0IGJlIHVuaXF1ZSB0byBlYWNoCitkZXZpY2U7IHRoaXMgaXMgd2hhdCBtYWtlcyB0aGUgZmlsZXMgZm9yd2FyZCBsb2NrlnByb3RlY3RlZC4gSWRlYWxseSwgaXQgc2hvdWxkCitiZSBkZXJpdmVkIGZyb20gc2VjcmV0IGhhcmR3YXJlIHBhcmFtZXRlcnMsIGJ1dCBhdCB0aGUgdmVyeSBsZWFzdCBpdCBzaG91bGQgYmUKK3BlcnNpc3RlbnQgZnJvbSBvbmUgbWFzdGVyIHJlc2V0IHRvIHRoZSBuZXh0LjwvcD4KKworPGRpdiBzdHlsZT0nbWFyZ2luLWJvdHRvbToyNC4wcHQ7Ym9yZGVyOnNvbGlkIHdpbmRvd3RleHQgMS4wcHQ7cGFkZGluZzoxLjBwdCA0LjBwdCAxLjBwdCA0LjBwdDsKK2JhY2tncm91bmQ6I0YyRjJGMic+CisKKzxwIGNsYXNzPU1zb0JvZHlUZXh0IHN0eWxlPSdiYWNrZ3JvdW5kOiNGMkYyRjI7Ym9yZGVyOgorbm9uZTtwYWRkaW5nOjBjbSc+PGI+Tm90ZTo8L2I+IEluIHRoZSBvcGVuLXNvdXJjZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgPHNwYW4KK3N0eWxlPSdmb250LXNpemU6MTAuMHB0O2ZvbnQtZmFtaWx5OiJMdWNpZGEgQ29uc29sZSIsIkRlamFWdSBTYW5zIE1vbm8iJz5saWJmd2Rsb2NrLWNvbW1vbjwvc3Bhbj4KK2xpYnJhcnksIGEgcmFuZG9tIGtleS1lbmNyeXB0aW9uIGtleSBpcyBnZW5lcmF0ZWQgYW5kIHN0b3JlZCBpbiBwbGFpbnRleHQgaW4KK3RoZSBmaWxlIHN5c3RlbSwgd2l0aG91dCBiZWluZyBvYmZ1c2NhdGVkIGluIGFueSB3YXkgKGRvaW5nIHNvIHdvdWxkIGJlIGZ1dGlsZQorc2luY2UgdGhlIHNvdXJjZSBjb2RlIGlzIG9wZW5seSBhdmFpbGFibGUpLiBUaGlzIGtleSBtdXN0IGJlIGtlcHQgc2VjcmV0IGZyb20KK3RoZSB1c2VyLCBhbmQgc2hvdWxkbpJ0IGJlIHBvc3NpYmxlIHRvIGV4dHJhY3QgdGhyb3VnaCBiYWNrdXAtYW5kLXJlc3RvcmUKK2Z1bmN0aW9uYWxpdHkgb3IgdGhlIGxpa2UuIE9FTSBtYW51ZmFjdHVyZXJzIHdpbGwgcHJvYmFibHkgd2FudCB0byBpbXBsZW1lbnQgYQordHJ1bHkgaGFyZHdhcmUtYmFzZWQgZGV2aWNlLXVuaXF1ZSBrZXkuPC9wPgorCis8L2Rpdj4KKworPHAgY2xhc3M9TXNvQm9keVRleHQgc3R5bGU9J3BhZ2UtYnJlYWstYWZ0ZXI6YXZvaWQnPjxpbWcgd2lkdGg9NTMxIGhlaWdodD01NjMKK3NyYz0iaW1hZ2VzL2ltYWdlMDAyLmdpZiI+PC9wPgorCis8cCBjbGFzcz1Nc29DYXB0aW9uIHN0eWxlPSdtYXJnaW4tdG9wOjYuMHB0O21hcmdpbi1yaWdodDowY207bWFyZ2luLWJvdHRvbToKKzEyLjBwdDttYXJnaW4tbGVmdDowY20nPjxhIG5hbWU9Il9SZWYyNjMwODUxODciPkZpZ3VyZSA8L2E+Mi4gQ29udmVydGVyIFVDOiBDb252ZXJ0IERhdGEuPC9wPgorCis8Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEzLjBwdDtmb250LWZhbWlseToiQXJpYWwiLCJzYW5zLXNlcmlmIic+PGJyCitjbGVhcj1hbGwgc3R5bGU9J3BhZ2UtYnJlYWstYmVmb3JlOmFsd2F5cyc+Cis8L3NwYW4+PC9iPgorCis8aDM+PGEgbmFtZT0iX1RvYzI3NjQ3MTQyNyI+PC9hPjxhIG5hbWU9Il9SZWYyNjMxNjMwODIiPjMuMS4yPHNwYW4KK3N0eWxlPSdmb250OjcuMHB0ICJUaW1lcyBOZXcgUm9tYW4iJz4mbmJzcDsmbmJzcDsmbmJzcDsgPC9zcGFuPkNvbnZlcnQgRmlsZQorKFB1bGwtTW9kZSBDb252ZXJzaW9uKTwvYT48L2gzPgorCis8cCBjbGFzcz1Nc29Cb2R5VGV4dD5QdWxsLW1vZGUgY29udmVyc2lvbiBpcyBwZXJmb3JtZWQgYnkgY2FsbGluZyA8c3Bhbgorc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7Zm9udC1mYW1pbHk6Ikx1Y2lkYSBDb25zb2xlIiwiRGVqYVZ1IFNhbnMgTW9ubyInPkZ3ZExvY2tGaWxlX0NvbnZlcnRGaWxlPC9zcGFuPgord2l0aCB0aGUgZmlsZW5hbWUsIHVubGVzcyB0aGVyZSBpcyBuZWVkIGZvciBhIHNwZWNpYWxpemVkIDxzcGFuCitzdHlsZT0nZm9udC1zaXplOjEwLjBwdDtmb250LWZhbWlseToiTHVjaWRhIENvbnNvbGUiLCJEZWphVnUgU2FucyBNb25vIic+cmVhZDwvc3Bhbj4gZnVuY3Rpb24sIGluCit3aGljaCBjYXNlIDxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0O2ZvbnQtZmFtaWx5OiJMdWNpZGEgQ29uc29sZSIsIkRlamFWdSBTYW5zIE1vbm8iJz5Gd2RMb2NrRmlsZV9Db252ZXJ0T3BlbkZpbGU8L3NwYW4+CitzaG91bGQgYmUgdXNlZCBkaXJlY3RseSBpbnN0ZWFkLiBTZWUgRmlndXJlIDMuPC9wPgorCis8cCBjbGFzcz1Nc29Cb2R5VGV4dCBzdHlsZT0nbWFyZ2luLWJvdHRvbToyNC4wcHQnPkludGVybmFsbHksIDxzcGFuCitzdHlsZT0nZm9udC1zaXplOjEwLjBwdDtmb250LWZhbWlseToiTHVjaWRhIENvbnNvbGUiLCJEZWphVnUgU2FucyBNb25vIic+RndkTG9ja0ZpbGVfQ29udmVydEZpbGU8L3NwYW4+CitjYWxscyA8c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDtmb250LWZhbWlseToiTHVjaWRhIENvbnNvbGUiLCJEZWphVnUgU2FucyBNb25vIic+RndkTG9ja0ZpbGVfQ29udmVydE9wZW5GaWxlPC9zcGFuPi4KK1RoZSBsYXR0ZXIgdGhlbiBwcm9jZWVkcyB3aXRoIHRoZSBjb252ZXJzaW9uIHVzaW5nIHRoZSBwdXNoLW1vZGUgQVBJLCBhY3RpbmcgYXMKK3RoZSBjbGllbnQgaW4gdGhlIHByZXZpb3VzIHVzZSBjYXNlOyBzZWUgc2VjdGlvbiAzLjEuMS48L3A+CisKKzxwIGNsYXNzPU1zb0JvZHlUZXh0IHN0eWxlPSdwYWdlLWJyZWFrLWFmdGVyOmF2b2lkJz48aW1nIHdpZHRoPTUzMSBoZWlnaHQ9NzMxCitzcmM9ImltYWdlcy9pbWFnZTAwMy5naWYiPjwvcD4KKworPHAgY2xhc3M9TXNvQ2FwdGlvbiBzdHlsZT0nbWFyZ2luLXRvcDo2LjBwdDttYXJnaW4tcmlnaHQ6MGNtO21hcmdpbi1ib3R0b206CisxMi4wcHQ7bWFyZ2luLWxlZnQ6MGNtJz48YSBuYW1lPSJfUmVmMjYzMDg1MjA4Ij5GaWd1cmUgPC9hPjMuIENvbnZlcnRlciBVQzogQ29udmVydCBGaWxlLjwvcD4KKworPGI+PGk+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxNC4wcHQ7Zm9udC1mYW1pbHk6IkFyaWFsIiwic2Fucy1zZXJpZiInPjxicgorY2xlYXI9YWxsIHN0eWxlPSdwYWdlLWJyZWFrLWJlZm9yZTphbHdheXMnPgorPC9zcGFuPjwvaT48L2I+CisKKzxoMj48YSBuYW1lPSJfVG9jMjc2NDcxNDI4Ij4zLjI8c3BhbiBzdHlsZT0nZm9udDo3LjBwdCAiVGltZXMgTmV3IFJvbWFuIic+Jm5ic3A7Jm5ic3A7Jm5ic3A7Cis8L3NwYW4+RGVjb2RlcjwvYT48L2gyPgorCis8cCBjbGFzcz1Nc29Cb2R5VGV4dD5UaGUgZGVjb2RlciBBUEkgYWxsb3dzIHRoZSBjbGllbnQgdG8gZG8gdGhlIGZvbGxvd2luZzo8L3A+CisKKzxwIGNsYXNzPU1zb0JvZHlUZXh0IHN0eWxlPSdtYXJnaW4tbGVmdDozNi4wcHQ7dGV4dC1pbmRlbnQ6LTE4LjBwdCc+MS48c3Bhbgorc3R5bGU9J2ZvbnQ6Ny4wcHQgIlRpbWVzIE5ldyBSb21hbiInPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA8L3NwYW4+Q2hlY2sKK3RoZSBpbnRlZ3JpdHkgb2YgYW4gaW50ZXJuYWwgRm9yd2FyZCBMb2NrIGZpbGUsIGkuZS4sIGRldGVjdCB3aGV0aGVyIGl0IGhhcworYmVlbiBtYW5pcHVsYXRlZCBpbiBhbnkgd2F5OyBzZWUgc2VjdGlvbiAzLjIuMS48L3A+CisKKzxwIGNsYXNzPU1zb0JvZHlUZXh0IHN0eWxlPSdtYXJnaW4tbGVmdDozNi4wcHQ7dGV4dC1pbmRlbnQ6LTE4LjBwdCc+Mi48c3Bhbgorc3R5bGU9J2ZvbnQ6Ny4wcHQgIlRpbWVzIE5ldyBSb21hbiInPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA8L3NwYW4+R2V0Cit0aGUgTUlNRSB0eXBlIG9mIHRoZSBlbWJlZGRlZCBjb250ZW50ICh0aGUgk29yaWdpbmFslCBNSU1FIHR5cGUgYmVmb3JlIERSTSBwcm90ZWN0aW9uCit3YXMgYXBwbGllZCk7IHNlZSBzZWN0aW9uIDMuMi4yLjwvcD4KKworPHAgY2xhc3M9TXNvQm9keVRleHQgc3R5bGU9J21hcmdpbi1sZWZ0OjM2LjBwdDt0ZXh0LWluZGVudDotMTguMHB0Jz4zLjxzcGFuCitzdHlsZT0nZm9udDo3LjBwdCAiVGltZXMgTmV3IFJvbWFuIic+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IDwvc3Bhbj5EZWNvZGUKK3RoZSBmaWxlIGJ5IHJhbmRvbSBhY2Nlc3MsIGkuZS4sIHJlYWQgYW5kIHNlZWsgdGhyb3VnaCBpdCBpbiBhbiBhcmJpdHJhcnkKK21hbm5lcjsgc2VlIHNlY3Rpb24gMy4yLjMuPC9wPgorCis8cCBjbGFzcz1Nc29Cb2R5VGV4dD5BbGwgc3Vic2VxdWVudCBvcGVyYXRpb25zIG9uIGEgZmlsZSBmaXJzdCByZXF1aXJlIGl0IHRvIGJlCitvcGVuZWQuIE9wZW5pbmcgYSBmaWxlIHJldHVybnMgYSA8aT5maWxlIGRlc2NyaXB0b3I8L2k+l2EgaGFuZGxlIHRvIGJlIHVzZWQgaW4KK3RoZXNlIHN1YnNlcXVlbnQgb3BlcmF0aW9ucy48L3A+CisKKzxwIGNsYXNzPU1zb0JvZHlUZXh0PklmIHRoZSBmaWxlbmFtZSBpcyBrbm93biwgYW4gaW50ZXJuYWwgRm9yd2FyZCBMb2NrIGZpbGUKK2NhbiBiZSBvcGVuZWQgdXNpbmcgPHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7Zm9udC1mYW1pbHk6Ikx1Y2lkYSBDb25zb2xlIiwiRGVqYVZ1IFNhbnMgTW9ubyInPkZ3ZExvY2tGaWxlX29wZW48L3NwYW4+LgorSWYgb25seSB0aGUgZmlsZSBkZXNjcmlwdG9yIG9mIGFuIGFscmVhZHkgb3BlbiBmaWxlIGlzIGF2YWlsYWJsZSwgYSBkZWNvZGluZworc2Vzc2lvbiBjYW4gaW5zdGVhZCBiZSBpbml0aWFsaXplZCB1c2luZyA8c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDsKK2ZvbnQtZmFtaWx5OiJMdWNpZGEgQ29uc29sZSIsIkRlamFWdSBTYW5zIE1vbm8iJz5Gd2RMb2NrRmlsZV9hdHRhY2g8L3NwYW4+LjwvcD4KKworPHAgY2xhc3M9TXNvQm9keVRleHQ+SW50ZXJuYWxseSwgPHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7Zm9udC1mYW1pbHk6CisiTHVjaWRhIENvbnNvbGUiLCJEZWphVnUgU2FucyBNb25vIic+RndkTG9ja0ZpbGVfb3Blbjwvc3Bhbj4gY2FsbHMgPHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7Citmb250LWZhbWlseToiTHVjaWRhIENvbnNvbGUiLCJEZWphVnUgU2FucyBNb25vIic+RndkTG9ja0ZpbGVfYXR0YWNoPC9zcGFuPi4gRm9yIGVmZmljaWVuY3kKK3JlYXNvbnMsIDxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0O2ZvbnQtZmFtaWx5OiJMdWNpZGEgQ29uc29sZSIsIkRlamFWdSBTYW5zIE1vbm8iJz5Gd2RMb2NrRmlsZV9hdHRhY2g8L3NwYW4+Cit0aGVyZWZvcmUgYXNzdW1lcyB0aGF0IHRoZSBmaWxlIHBvc2l0aW9uIGlzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUgd2hlbgordGhlIGZ1bmN0aW9uIGdldHMgY2FsbGVkLiBBIGNsaWVudCB3aG8gY2FsbHMgaXQgZGlyZWN0bHkgbXVzdCBtYWtlIHN1cmUgdGhhdAordGhpcyBhc3N1bXB0aW9uIGhvbGRzLjwvcD4KKworPHAgY2xhc3M9TXNvQm9keVRleHQ+V2hlbiBhIGZpbGUgaXMgYmVpbmcgYXR0YWNoZWQsIHRoZSBzZXNzaW9uIGtleSBzdG9yZWQgaW4KK3RoZSBmaWxlIGR1cmluZyBjb252ZXJzaW9uIGlzIGRlY3J5cHRlZCB1c2luZyA8c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDsKK2ZvbnQtZmFtaWx5OiJMdWNpZGEgQ29uc29sZSIsIkRlamFWdSBTYW5zIE1vbm8iJz5Gd2RMb2NrR2x1ZV9HZXRFbmNyeXB0ZWRLZXlMZW5ndGg8L3NwYW4+IGFuZCA8c3Bhbgorc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7Zm9udC1mYW1pbHk6Ikx1Y2lkYSBDb25zb2xlIiwiRGVqYVZ1IFNhbnMgTW9ubyInPkZ3ZExvY2tHbHVlX0RlY3J5cHRLZXk8L3NwYW4+LAoraW4gb3JkZXIgdG8gc2V0IHVwIGZvciBkZWNvZGluZyBhbmQgaW50ZWdyaXR5IGNoZWNraW5nLjwvcD4KKworPHAgY2xhc3M9TXNvQm9keVRleHQ+Rm9yIGp1c3QgZ2V0dGluZyB0aGUgY29udGVudCB0eXBlLCBob3dldmVyLCByZXRyaWV2aW5nIHRoZQorc2Vzc2lvbiBrZXkgd291bGQgc3RyaWN0bHkgc3BlYWtpbmcgbm90IGJlIG5lY2Vzc2FyeSwgc28gdGhlcmUgaXMgYW4KK29wcG9ydHVuaXR5IGhlcmUgdG8gb3B0aW1pemUgZm9yIHRoYXQgaWYgaXQgcHJvdmVzIG5lY2Vzc2FyeSBsYXRlci48L3A+CisKKzxwIGNsYXNzPU1zb0JvZHlUZXh0PlN5bW1ldHJpY2FsIHRvIDxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0O2ZvbnQtZmFtaWx5OgorIkx1Y2lkYSBDb25zb2xlIiwiRGVqYVZ1IFNhbnMgTW9ubyInPkZ3ZExvY2tGaWxlX29wZW48L3NwYW4+IGFuZCA8c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDsKK2ZvbnQtZmFtaWx5OiJMdWNpZGEgQ29uc29sZSIsIkRlamFWdSBTYW5zIE1vbm8iJz5Gd2RMb2NrRmlsZV9hdHRhY2g8L3NwYW4+LCB0aGVyZSBhcmUgYWxzbyBmdW5jdGlvbnMKK2ZvciBjbG9zaW5nIGEgZmlsZSBvciBkZXRhY2hpbmcgZnJvbSBpdDo8L3A+CisKKzxwIGNsYXNzPU1zb0JvZHlUZXh0IHN0eWxlPSdtYXJnaW4tbGVmdDozNi4wcHQ7dGV4dC1pbmRlbnQ6LTE4LjBwdCc+MS48c3Bhbgorc3R5bGU9J2ZvbnQ6Ny4wcHQgIlRpbWVzIE5ldyBSb21hbiInPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA8L3NwYW4+SWYKK2l0IHdhcyBvcGVuZWQgd2l0aCA8c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDtmb250LWZhbWlseToiTHVjaWRhIENvbnNvbGUiLCJEZWphVnUgU2FucyBNb25vIic+RndkTG9ja0ZpbGVfb3Blbjwvc3Bhbj4KK2l0IHNob3VsZCBiZSBjbG9zZWQgd2l0aCA8c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDtmb250LWZhbWlseToiTHVjaWRhIENvbnNvbGUiLCJEZWphVnUgU2FucyBNb25vIic+RndkTG9ja0ZpbGVfY2xvc2U8L3NwYW4+LjwvcD4KKworPHAgY2xhc3M9TXNvQm9keVRleHQgc3R5bGU9J21hcmdpbi1sZWZ0OjM2LjBwdDt0ZXh0LWluZGVudDotMTguMHB0Jz4yLjxzcGFuCitzdHlsZT0nZm9udDo3LjBwdCAiVGltZXMgTmV3IFJvbWFuIic+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IDwvc3Bhbj5JZgoraXQgd2FzIGF0dGFjaGVkIHdpdGggPHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7Zm9udC1mYW1pbHk6Ikx1Y2lkYSBDb25zb2xlIiwiRGVqYVZ1IFNhbnMgTW9ubyInPkZ3ZExvY2tGaWxlX2F0dGFjaDwvc3Bhbj4KK2l0IHNob3VsZCBiZSBkZXRhY2hlZCB3aXRoIDxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0O2ZvbnQtZmFtaWx5OiJMdWNpZGEgQ29uc29sZSIsIkRlamFWdSBTYW5zIE1vbm8iJz5Gd2RMb2NrRmlsZV9kZXRhY2g8L3NwYW4+LjwvcD4KKworPGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMy4wcHQ7Zm9udC1mYW1pbHk6IkFyaWFsIiwic2Fucy1zZXJpZiInPjxicgorY2xlYXI9YWxsIHN0eWxlPSdwYWdlLWJyZWFrLWJlZm9yZTphbHdheXMnPgorPC9zcGFuPjwvYj4KKworPGgzPjxhIG5hbWU9Il9SZWYyNjMxNjMwOTkiPjwvYT48YSBuYW1lPSJfVG9jMjc2NDcxNDI5Ij4zLjIuMTxzcGFuCitzdHlsZT0nZm9udDo3LjBwdCAiVGltZXMgTmV3IFJvbWFuIic+Jm5ic3A7Jm5ic3A7Jm5ic3A7IDwvc3Bhbj5DaGVjayBJbnRlZ3JpdHk8L2E+PC9oMz4KKworPHAgY2xhc3M9TXNvQm9keVRleHQ+VGhlcmUgYXJlIHRocmVlIG1ldGhvZHMgZm9yIGNoZWNraW5nIHRoZSBpbnRlZ3JpdHkgb2YgYW4KK2ludGVybmFsIEZvcndhcmQgTG9jayBmaWxlLCBpbiB3aG9sZSBvciBpbiBwYXJ0IChzZWUgYWxzbyBGaWd1cmUgNCk6PC9wPgorCis8cCBjbGFzcz1Nc29Cb2R5VGV4dCBzdHlsZT0nbWFyZ2luLWxlZnQ6MzYuMHB0O3RleHQtaW5kZW50Oi0xOC4wcHQnPjEuPHNwYW4KK3N0eWxlPSdmb250OjcuMHB0ICJUaW1lcyBOZXcgUm9tYW4iJz4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgPC9zcGFuPjxzcGFuCitzdHlsZT0nZm9udC1zaXplOjEwLjBwdDtmb250LWZhbWlseToiTHVjaWRhIENvbnNvbGUiLCJEZWphVnUgU2FucyBNb25vIic+RndkTG9ja0ZpbGVfQ2hlY2tEYXRhSW50ZWdyaXR5PC9zcGFuPiwKK3doaWNoIGNoZWNrcyB0aGUgaW50ZWdyaXR5IG9mIHRoZSBlbmNyeXB0ZWQgY29udGVudCBkYXRhLjwvcD4KKworPHAgY2xhc3M9TXNvQm9keVRleHQgc3R5bGU9J21hcmdpbi1sZWZ0OjM2LjBwdDt0ZXh0LWluZGVudDotMTguMHB0Jz4yLjxzcGFuCitzdHlsZT0nZm9udDo3LjBwdCAiVGltZXMgTmV3IFJvbWFuIic+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IDwvc3Bhbj48c3Bhbgorc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7Zm9udC1mYW1pbHk6Ikx1Y2lkYSBDb25zb2xlIiwiRGVqYVZ1IFNhbnMgTW9ubyInPkZ3ZExvY2tGaWxlX0NoZWNrSGVhZGVySW50ZWdyaXR5PC9zcGFuPiwKK3doaWNoIGNoZWNrcyB0aGUgaW50ZWdyaXR5IG9mIHRoZSBmaWxlIGhlYWRlciwgaW5jbHVkaW5nIHRoZSBjb250ZW50IHR5cGUgYW5kCitvdGhlciBmaWVsZHMgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQgYnV0IHJlc2VydmVkIGZvciBmdXR1cmUgdXNlLjwvcD4KKworPHAgY2xhc3M9TXNvQm9keVRleHQgc3R5bGU9J21hcmdpbi1sZWZ0OjM2LjBwdDt0ZXh0LWluZGVudDotMTguMHB0Jz4zLjxzcGFuCitzdHlsZT0nZm9udDo3LjBwdCAiVGltZXMgTmV3IFJvbWFuIic+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IDwvc3Bhbj48c3Bhbgorc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7Zm9udC1mYW1pbHk6Ikx1Y2lkYSBDb25zb2xlIiwiRGVqYVZ1IFNhbnMgTW9ubyInPkZ3ZExvY2tGaWxlX0NoZWNrSW50ZWdyaXR5PC9zcGFuPiwKK3doaWNoIGludGVybmFsbHkgY2FsbHMgZmlyc3QgPHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7Zm9udC1mYW1pbHk6Ikx1Y2lkYSBDb25zb2xlIiwiRGVqYVZ1IFNhbnMgTW9ubyInPkZ3ZExvY2tGaWxlX0NoZWNrSGVhZGVySW50ZWdyaXR5PC9zcGFuPgorYW5kIHRoZW4gPHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7Zm9udC1mYW1pbHk6Ikx1Y2lkYSBDb25zb2xlIiwiRGVqYVZ1IFNhbnMgTW9ubyInPkZ3ZExvY2tGaWxlX0NoZWNrRGF0YUludGVncml0eTwvc3Bhbj4uPC9wPgorCis8cCBjbGFzcz1Nc29Cb2R5VGV4dCBzdHlsZT0nbWFyZ2luLWJvdHRvbToyNC4wcHQnPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0OworZm9udC1mYW1pbHk6Ikx1Y2lkYSBDb25zb2xlIiwiRGVqYVZ1IFNhbnMgTW9ubyInPkZ3ZExvY2tGaWxlX0NoZWNrSGVhZGVySW50ZWdyaXR5PC9zcGFuPiBpcworZ2VuZXJhbGx5IG11Y2ggZmFzdGVyIHRoYW4gPHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7Zm9udC1mYW1pbHk6Ikx1Y2lkYSBDb25zb2xlIiwiRGVqYVZ1IFNhbnMgTW9ubyInPkZ3ZExvY2tGaWxlX0NoZWNrRGF0YUludGVncml0eTwvc3Bhbj4sCit3aG9zZSBydW5uaW5nIHRpbWUgaXMgZGlyZWN0bHkgcHJvcG9ydGlvbmFsIHRvIHRoZSBzaXplIG9mIHRoZSBmaWxlLjwvcD4KKworPHAgY2xhc3M9TXNvQm9keVRleHQgc3R5bGU9J3BhZ2UtYnJlYWstYWZ0ZXI6YXZvaWQnPjxpbWcgd2lkdGg9NTQzIGhlaWdodD01NzUKK3NyYz0iaW1hZ2VzL2ltYWdlMDA0LmdpZiI+PC9wPgorCis8cCBjbGFzcz1Nc29DYXB0aW9uIHN0eWxlPSdtYXJnaW4tdG9wOjYuMHB0O21hcmdpbi1yaWdodDowY207bWFyZ2luLWJvdHRvbToKKzEyLjBwdDttYXJnaW4tbGVmdDowY20nPjxhIG5hbWU9Il9SZWYyNjMxNjMzMDgiPkZpZ3VyZSA8L2E+NC4gRGVjb2RlciBVQzogQ2hlY2sgSW50ZWdyaXR5LjwvcD4KKworPGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMy4wcHQ7Zm9udC1mYW1pbHk6IkFyaWFsIiwic2Fucy1zZXJpZiInPjxicgorY2xlYXI9YWxsIHN0eWxlPSdwYWdlLWJyZWFrLWJlZm9yZTphbHdheXMnPgorPC9zcGFuPjwvYj4KKworPGgzPjxhIG5hbWU9Il9Ub2MyNzY0NzE0MzAiPjwvYT48YSBuYW1lPSJfUmVmMjYzMTYzMTE3Ij4zLjIuMjxzcGFuCitzdHlsZT0nZm9udDo3LjBwdCAiVGltZXMgTmV3IFJvbWFuIic+Jm5ic3A7Jm5ic3A7Jm5ic3A7IDwvc3Bhbj5HZXQgQ29udGVudCBUeXBlPC9hPjwvaDM+CisKKzxwIGNsYXNzPU1zb0JvZHlUZXh0IHN0eWxlPSdtYXJnaW4tYm90dG9tOjI0LjBwdCc+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7Citmb250LWZhbWlseToiTHVjaWRhIENvbnNvbGUiLCJEZWphVnUgU2FucyBNb25vIic+RndkTG9ja0ZpbGVfR2V0Q29udGVudFR5cGU8L3NwYW4+IHJldHVybnMgYQorcmVhZC1vbmx5IHJlZmVyZW5jZSB0byBhbiBBU0NJSSBzdHJpbmcgY29udGFpbmluZyB0aGUgTUlNRSB0eXBlIG9mIHRoZQorZW1iZWRkZWQgY29udGVudC4gVGhpcyByZWZlcmVuY2UgaXMgdmFsaWQgYXMgbG9uZyBhcyB0aGUgZmlsZSBpcyBrZXB0IG9wZW4uCitDbGllbnRzIHdobyBuZWVkIGFjY2VzcyB0byB0aGUgY29udGVudCB0eXBlIGFmdGVyIGNsb3NpbmcgdGhlIGZpbGUgc2hvdWxkIG1ha2UKK2EgY29weSBvZiB0aGUgc3RyaW5nLiBTZWUgRmlndXJlIDUgYmVsb3cuPC9wPgorCis8cCBjbGFzcz1Nc29Cb2R5VGV4dCBzdHlsZT0ncGFnZS1icmVhay1hZnRlcjphdm9pZCc+PGltZyB3aWR0aD01NDMgaGVpZ2h0PTQ4OAorc3JjPSJpbWFnZXMvaW1hZ2UwMDUuZ2lmIj48L3A+CisKKzxwIGNsYXNzPU1zb0NhcHRpb24gc3R5bGU9J21hcmdpbi10b3A6Ni4wcHQ7bWFyZ2luLXJpZ2h0OjBjbTttYXJnaW4tYm90dG9tOgorMTIuMHB0O21hcmdpbi1sZWZ0OjBjbSc+PGEgbmFtZT0iX1JlZjI2MzE2MzM5MiI+RmlndXJlIDwvYT41LiBEZWNvZGVyIFVDOiBHZXQgQ29udGVudCBUeXBlLjwvcD4KKworPGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMy4wcHQ7Zm9udC1mYW1pbHk6IkFyaWFsIiwic2Fucy1zZXJpZiInPjxicgorY2xlYXI9YWxsIHN0eWxlPSdwYWdlLWJyZWFrLWJlZm9yZTphbHdheXMnPgorPC9zcGFuPjwvYj4KKworPGgzPjxhIG5hbWU9Il9Ub2MyNzY0NzE0MzEiPjwvYT48YSBuYW1lPSJfUmVmMjYzMTYzMTM3Ij4zLjIuMzxzcGFuCitzdHlsZT0nZm9udDo3LjBwdCAiVGltZXMgTmV3IFJvbWFuIic+Jm5ic3A7Jm5ic3A7Jm5ic3A7IDwvc3Bhbj5EZWNvZGUgRmlsZTwvYT48L2gzPgorCis8cCBjbGFzcz1Nc29Cb2R5VGV4dD5BZnRlciBvcGVuaW5nIGFuIGludGVybmFsIEZvcndhcmQgTG9jayBmaWxlIChvciBhdHRhY2hpbmcKK3RvIGFuIGFscmVhZHkgb3BlbiBvbmUpLCBpdCBjYW4gYmUgdHJhbnNwYXJlbnRseSByZWFkIGZyb20gYXMgaWYgaXQgd2VyZQordW5lbmNyeXB0ZWQuIEFueSBudW1iZXIgb2YgY2FsbHMgdG8gcmVhZCBkYXRhIGZyb20gdGhlIGN1cnJlbnQgZmlsZSBwb3NpdGlvbiBvcgorc2V0IGl0IHRvIGEgbmV3IG9uZSAod2hpY2ggaXMgd2hhdCA8c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDtmb250LWZhbWlseToKKyJMdWNpZGEgQ29uc29sZSIsIkRlamFWdSBTYW5zIE1vbm8iJz5sc2Vlazwvc3Bhbj4gZG9lcykgY2FuIGJlIG1hZGUgaW4gYW55IG9yZGVyOyB0aGlzIGlzIHdoYXQgd2UKK2NhbGwgPGk+cmFuZG9tIGFjY2VzczwvaT4uIFNlZSBGaWd1cmUgNi48L3A+CisKKzxwIGNsYXNzPU1zb0JvZHlUZXh0PlRoZSBGb3J3YXJkIExvY2sgRGVjb2RlciB2ZXJzaW9ucyBvZiB0aGUgPHNwYW4KK3N0eWxlPSdmb250LXNpemU6MTAuMHB0O2ZvbnQtZmFtaWx5OiJMdWNpZGEgQ29uc29sZSIsIkRlamFWdSBTYW5zIE1vbm8iJz5yZWFkPC9zcGFuPiwgPHNwYW4KK3N0eWxlPSdmb250LXNpemU6MTAuMHB0O2ZvbnQtZmFtaWx5OiJMdWNpZGEgQ29uc29sZSIsIkRlamFWdSBTYW5zIE1vbm8iJz5sc2Vlazwvc3Bhbj4sIGFuZCA8c3Bhbgorc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7Zm9udC1mYW1pbHk6Ikx1Y2lkYSBDb25zb2xlIiwiRGVqYVZ1IFNhbnMgTW9ubyInPmNsb3NlPC9zcGFuPiBmdW5jdGlvbnMKK2hhdmUgdGhlIGV4YWN0IHNhbWUgc2lnbmF0dXJlcyBhcyB0aGVpciBQT1NJWCBjb3VudGVycGFydHMuIFNvLCBmb3IgZXhhbXBsZSwKK3RoZSBjYWxsIDxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0O2ZvbnQtZmFtaWx5OiJMdWNpZGEgQ29uc29sZSIsIkRlamFWdSBTYW5zIE1vbm8iJz5Gd2RMb2NrRmlsZV9sc2VlayhmZCwKKzAsIFNFRUtfRU5EKTwvc3Bhbj4gcmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgZW1iZWRkZWQgY29udGVudCBkYXRhLCBpLmUuLCB0aGUKK3NpemUgb2YgdGhlIG9yaWdpbmFsIGZpbGUgYmVmb3JlIERSTSBwcm90ZWN0aW9uLjwvcD4KKworPHAgY2xhc3M9TXNvQm9keVRleHQgc3R5bGU9J21hcmdpbi1ib3R0b206MjQuMHB0Jz5Nb3Jlb3ZlciwgPHNwYW4KK3N0eWxlPSdmb250LXNpemU6MTAuMHB0O2ZvbnQtZmFtaWx5OiJMdWNpZGEgQ29uc29sZSIsIkRlamFWdSBTYW5zIE1vbm8iJz5Gd2RMb2NrRmlsZV9vcGVuPC9zcGFuPgoraXMgbGlrZSByZWd1bGFyIFBPU0lYIDxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0O2ZvbnQtZmFtaWx5OiJMdWNpZGEgQ29uc29sZSIsIkRlamFWdSBTYW5zIE1vbm8iJz5vcGVuPC9zcGFuPgorZXhjZXB0IGl0IHRha2VzIG9ubHkgdGhlIGZpbGVuYW1lIGFzIGEgcGFyYW1ldGVyl2FjY2VzcyBpcyBhbHdheXMgcmVhZC1vbmx5LjwvcD4KKworPHAgY2xhc3M9TXNvQm9keVRleHQgc3R5bGU9J3BhZ2UtYnJlYWstYWZ0ZXI6YXZvaWQnPjxpbWcgd2lkdGg9NTQzIGhlaWdodD01MjIKK3NyYz0iaW1hZ2VzL2ltYWdlMDA2LmdpZiI+PC9wPgorCis8cCBjbGFzcz1Nc29DYXB0aW9uIHN0eWxlPSdtYXJnaW4tdG9wOjYuMHB0O21hcmdpbi1yaWdodDowY207bWFyZ2luLWJvdHRvbToKKzEyLjBwdDttYXJnaW4tbGVmdDowY20nPjxhIG5hbWU9Il9SZWYyNjMxNjYzMDMiPkZpZ3VyZSA8L2E+Ni4gRGVjb2RlciBVQzogRGVjb2RlIEZpbGUuPC9wPgorCis8Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjE2LjBwdDtmb250LWZhbWlseToiQXJpYWwiLCJzYW5zLXNlcmlmIic+PGJyCitjbGVhcj1hbGwgc3R5bGU9J3BhZ2UtYnJlYWstYmVmb3JlOmFsd2F5cyc+Cis8L3NwYW4+PC9iPgorCis8aDE+PGEgbmFtZT0iX1RvYzI3NjQ3MTQzMiI+NDxzcGFuIHN0eWxlPSdmb250OjcuMHB0ICJUaW1lcyBOZXcgUm9tYW4iJz4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKKzwvc3Bhbj5EZWZpbml0aW9uIG9mIHRoZSBJbnRlcm5hbCBGb3J3YXJkIExvY2sgRmlsZSBGb3JtYXQ8L2E+PC9oMT4KKworPHAgY2xhc3M9TXNvQm9keVRleHQgc3R5bGU9J21hcmdpbi1ib3R0b206MTIuMHB0Jz5UaGUgaW5uZXIgc3RydWN0dXJlIG9mIGFuIGludGVybmFsCitGb3J3YXJkIExvY2sgZmlsZSBpcyBkZWZpbmVkIGluIFRhYmxlIDEgYmVsb3cuPC9wPgorCis8dGFibGUgY2xhc3M9TXNvTm9ybWFsVGFibGUgYm9yZGVyPTEgY2VsbHNwYWNpbmc9MCBjZWxscGFkZGluZz0wCisgc3R5bGU9J2JvcmRlci1jb2xsYXBzZTpjb2xsYXBzZTtib3JkZXI6bm9uZSc+CisgPHRyPgorICA8dGQgd2lkdGg9MTExIHZhbGlnbj10b3Agc3R5bGU9J3dpZHRoOjgzLjRwdDtib3JkZXI6c29saWQgd2luZG93dGV4dCAxLjBwdDsKKyAgcGFkZGluZzowY20gNS40cHQgMGNtIDUuNHB0Jz4KKyAgPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdwYWdlLWJyZWFrLWFmdGVyOmF2b2lkJz48Yj5PZmZzZXQgW2J5dGVzXTwvYj48L3A+CisgIDwvdGQ+CisgIDx0ZCB3aWR0aD05NiB2YWxpZ249dG9wIHN0eWxlPSd3aWR0aDo3Mi4wcHQ7Ym9yZGVyOnNvbGlkIHdpbmRvd3RleHQgMS4wcHQ7CisgIGJvcmRlci1sZWZ0Om5vbmU7cGFkZGluZzowY20gNS40cHQgMGNtIDUuNHB0Jz4KKyAgPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdwYWdlLWJyZWFrLWFmdGVyOmF2b2lkJz48Yj5TaXplIFtieXRlc108L2I+PC9wPgorICA8L3RkPgorICA8dGQgd2lkdGg9MzYxIHZhbGlnbj10b3Agc3R5bGU9J3dpZHRoOjI3MC44NXB0O2JvcmRlcjpzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0OworICBib3JkZXItbGVmdDpub25lO3BhZGRpbmc6MGNtIDUuNHB0IDBjbSA1LjRwdCc+CisgIDxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0ncGFnZS1icmVhay1hZnRlcjphdm9pZCc+PGI+RGVzY3JpcHRpb248L2I+PC9wPgorICA8L3RkPgorIDwvdHI+CisgPHRyPgorICA8dGQgd2lkdGg9MTExIHZhbGlnbj10b3Agc3R5bGU9J3dpZHRoOjgzLjRwdDtib3JkZXI6c29saWQgd2luZG93dGV4dCAxLjBwdDsKKyAgYm9yZGVyLXRvcDpub25lO3BhZGRpbmc6MGNtIDUuNHB0IDBjbSA1LjRwdCc+CisgIDxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0ncGFnZS1icmVhay1hZnRlcjphdm9pZCc+MDwvcD4KKyAgPC90ZD4KKyAgPHRkIHdpZHRoPTk2IHZhbGlnbj10b3Agc3R5bGU9J3dpZHRoOjcyLjBwdDtib3JkZXItdG9wOm5vbmU7Ym9yZGVyLWxlZnQ6bm9uZTsKKyAgYm9yZGVyLWJvdHRvbTpzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0O2JvcmRlci1yaWdodDpzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0OworICBwYWRkaW5nOjBjbSA1LjRwdCAwY20gNS40cHQnPgorICA8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3BhZ2UtYnJlYWstYWZ0ZXI6YXZvaWQnPjQ8L3A+CisgIDwvdGQ+CisgIDx0ZCB3aWR0aD0zNjEgdmFsaWduPXRvcCBzdHlsZT0nd2lkdGg6MjcwLjg1cHQ7Ym9yZGVyLXRvcDpub25lO2JvcmRlci1sZWZ0OgorICBub25lO2JvcmRlci1ib3R0b206c29saWQgd2luZG93dGV4dCAxLjBwdDtib3JkZXItcmlnaHQ6c29saWQgd2luZG93dGV4dCAxLjBwdDsKKyAgcGFkZGluZzowY20gNS40cHQgMGNtIDUuNHB0Jz4KKyAgPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdwYWdlLWJyZWFrLWFmdGVyOmF2b2lkJz5UaGUgZmlsZSBzaWduYXR1cmUgKHNvLWNhbGxlZAorICA8aT5tYWdpYyBudW1iZXI8L2k+KTogYSBmb3VyLWNoYXJhY3RlciBjb2RlIGNvbnNpc3Rpbmcgb2YgdGhlIGxldHRlcnMKKyAgRi1XLUwtSy48L3A+CisgIDwvdGQ+CisgPC90cj4KKyA8dHI+CisgIDx0ZCB3aWR0aD0xMTEgdmFsaWduPXRvcCBzdHlsZT0nd2lkdGg6ODMuNHB0O2JvcmRlcjpzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0OworICBib3JkZXItdG9wOm5vbmU7cGFkZGluZzowY20gNS40cHQgMGNtIDUuNHB0Jz4KKyAgPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdwYWdlLWJyZWFrLWFmdGVyOmF2b2lkJz40PC9wPgorICA8L3RkPgorICA8dGQgd2lkdGg9OTYgdmFsaWduPXRvcCBzdHlsZT0nd2lkdGg6NzIuMHB0O2JvcmRlci10b3A6bm9uZTtib3JkZXItbGVmdDpub25lOworICBib3JkZXItYm90dG9tOnNvbGlkIHdpbmRvd3RleHQgMS4wcHQ7Ym9yZGVyLXJpZ2h0OnNvbGlkIHdpbmRvd3RleHQgMS4wcHQ7CisgIHBhZGRpbmc6MGNtIDUuNHB0IDBjbSA1LjRwdCc+CisgIDxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0ncGFnZS1icmVhay1hZnRlcjphdm9pZCc+MTwvcD4KKyAgPC90ZD4KKyAgPHRkIHdpZHRoPTM2MSB2YWxpZ249dG9wIHN0eWxlPSd3aWR0aDoyNzAuODVwdDtib3JkZXItdG9wOm5vbmU7Ym9yZGVyLWxlZnQ6CisgIG5vbmU7Ym9yZGVyLWJvdHRvbTpzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0O2JvcmRlci1yaWdodDpzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0OworICBwYWRkaW5nOjBjbSA1LjRwdCAwY20gNS40cHQnPgorICA8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3BhZ2UtYnJlYWstYWZ0ZXI6YXZvaWQnPlZlcnNpb24gbnVtYmVyICgwIGZvciB0aGUKKyAgZmlyc3QgdmVyc2lvbikuPC9wPgorICA8L3RkPgorIDwvdHI+CisgPHRyPgorICA8dGQgd2lkdGg9MTExIHZhbGlnbj10b3Agc3R5bGU9J3dpZHRoOjgzLjRwdDtib3JkZXI6c29saWQgd2luZG93dGV4dCAxLjBwdDsKKyAgYm9yZGVyLXRvcDpub25lO3BhZGRpbmc6MGNtIDUuNHB0IDBjbSA1LjRwdCc+CisgIDxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0ncGFnZS1icmVhay1hZnRlcjphdm9pZCc+NTwvcD4KKyAgPC90ZD4KKyAgPHRkIHdpZHRoPTk2IHZhbGlnbj10b3Agc3R5bGU9J3dpZHRoOjcyLjBwdDtib3JkZXItdG9wOm5vbmU7Ym9yZGVyLWxlZnQ6bm9uZTsKKyAgYm9yZGVyLWJvdHRvbTpzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0O2JvcmRlci1yaWdodDpzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0OworICBwYWRkaW5nOjBjbSA1LjRwdCAwY20gNS40cHQnPgorICA8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3BhZ2UtYnJlYWstYWZ0ZXI6YXZvaWQnPjE8L3A+CisgIDwvdGQ+CisgIDx0ZCB3aWR0aD0zNjEgdmFsaWduPXRvcCBzdHlsZT0nd2lkdGg6MjcwLjg1cHQ7Ym9yZGVyLXRvcDpub25lO2JvcmRlci1sZWZ0OgorICBub25lO2JvcmRlci1ib3R0b206c29saWQgd2luZG93dGV4dCAxLjBwdDtib3JkZXItcmlnaHQ6c29saWQgd2luZG93dGV4dCAxLjBwdDsKKyAgcGFkZGluZzowY20gNS40cHQgMGNtIDUuNHB0Jz4KKyAgPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdwYWdlLWJyZWFrLWFmdGVyOmF2b2lkJz5JbmRpY2F0ZXMgdGhlIHN1YmZvcm1hdDo8L3A+CisgIDxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0ncGFnZS1icmVhay1hZnRlcjphdm9pZCc+PGk+MHgwMCBGb3J3YXJkIExvY2s8L2k+PC9wPgorICA8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3BhZ2UtYnJlYWstYWZ0ZXI6YXZvaWQnPjxpPjB4MDEgQ29tYmluZWQgRGVsaXZlcnk8L2k+PC9wPgorICA8L3RkPgorIDwvdHI+CisgPHRyPgorICA8dGQgd2lkdGg9MTExIHZhbGlnbj10b3Agc3R5bGU9J3dpZHRoOjgzLjRwdDtib3JkZXI6c29saWQgd2luZG93dGV4dCAxLjBwdDsKKyAgYm9yZGVyLXRvcDpub25lO3BhZGRpbmc6MGNtIDUuNHB0IDBjbSA1LjRwdCc+CisgIDxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0ncGFnZS1icmVhay1hZnRlcjphdm9pZCc+NjwvcD4KKyAgPC90ZD4KKyAgPHRkIHdpZHRoPTk2IHZhbGlnbj10b3Agc3R5bGU9J3dpZHRoOjcyLjBwdDtib3JkZXItdG9wOm5vbmU7Ym9yZGVyLWxlZnQ6bm9uZTsKKyAgYm9yZGVyLWJvdHRvbTpzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0O2JvcmRlci1yaWdodDpzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0OworICBwYWRkaW5nOjBjbSA1LjRwdCAwY20gNS40cHQnPgorICA8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3BhZ2UtYnJlYWstYWZ0ZXI6YXZvaWQnPjE8L3A+CisgIDwvdGQ+CisgIDx0ZCB3aWR0aD0zNjEgdmFsaWduPXRvcCBzdHlsZT0nd2lkdGg6MjcwLjg1cHQ7Ym9yZGVyLXRvcDpub25lO2JvcmRlci1sZWZ0OgorICBub25lO2JvcmRlci1ib3R0b206c29saWQgd2luZG93dGV4dCAxLjBwdDtib3JkZXItcmlnaHQ6c29saWQgd2luZG93dGV4dCAxLjBwdDsKKyAgcGFkZGluZzowY20gNS40cHQgMGNtIDUuNHB0Jz4KKyAgPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdwYWdlLWJyZWFrLWFmdGVyOmF2b2lkJz5Vc2FnZSByZXN0cmljdGlvbiBmbGFncyAocHJvaGliaXRpb25zCisgIGFnYWluc3QgdXNhZ2UgYXMgcmluZ3RvbmUgb3IgYXMgd2FsbHBhcGVyIGFuZCBzY3JlZW4gc2F2ZXIpLiBBbHNvIGluZGljYXRlcworICBpZiB0aGUgZmlsZSBpcyBib3VuZCB0byBhIHNwZWNpZmljIFNJTSBjYXJkLjwvcD4KKyAgPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdwYWdlLWJyZWFrLWFmdGVyOmF2b2lkJz48aT4weDAwIE5vIHVzYWdlCisgIHJlc3RyaWN0aW9uczwvaT48L3A+CisgIDxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0ncGFnZS1icmVhay1hZnRlcjphdm9pZCc+PGk+MHgwMSBSaW5ndG9uZSB1c2FnZQorICBwcm9oaWJpdGVkPC9pPjwvcD4KKyAgPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdwYWdlLWJyZWFrLWFmdGVyOmF2b2lkJz48aT4weDAyIFNjcmVlbiB1c2FnZQorICBwcm9oaWJpdGVkPC9pPjwvcD4KKyAgPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdwYWdlLWJyZWFrLWFmdGVyOmF2b2lkJz48aT4weDgwIEJvdW5kIHRvIFNJTTwvaT48L3A+CisgIDxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0ncGFnZS1icmVhay1hZnRlcjphdm9pZCc+KEFueSBudW1iZXIgb2YgdGhlc2UgbWF5IGJlCisgIE9SLWVkIHRvZ2V0aGVyLik8L3A+CisgIDwvdGQ+CisgPC90cj4KKyA8dHI+CisgIDx0ZCB3aWR0aD0xMTEgdmFsaWduPXRvcCBzdHlsZT0nd2lkdGg6ODMuNHB0O2JvcmRlcjpzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0OworICBib3JkZXItdG9wOm5vbmU7cGFkZGluZzowY20gNS40cHQgMGNtIDUuNHB0Jz4KKyAgPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdwYWdlLWJyZWFrLWFmdGVyOmF2b2lkJz43PC9wPgorICA8L3RkPgorICA8dGQgd2lkdGg9OTYgdmFsaWduPXRvcCBzdHlsZT0nd2lkdGg6NzIuMHB0O2JvcmRlci10b3A6bm9uZTtib3JkZXItbGVmdDpub25lOworICBib3JkZXItYm90dG9tOnNvbGlkIHdpbmRvd3RleHQgMS4wcHQ7Ym9yZGVyLXJpZ2h0OnNvbGlkIHdpbmRvd3RleHQgMS4wcHQ7CisgIHBhZGRpbmc6MGNtIDUuNHB0IDBjbSA1LjRwdCc+CisgIDxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0ncGFnZS1icmVhay1hZnRlcjphdm9pZCc+MTwvcD4KKyAgPC90ZD4KKyAgPHRkIHdpZHRoPTM2MSB2YWxpZ249dG9wIHN0eWxlPSd3aWR0aDoyNzAuODVwdDtib3JkZXItdG9wOm5vbmU7Ym9yZGVyLWxlZnQ6CisgIG5vbmU7Ym9yZGVyLWJvdHRvbTpzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0O2JvcmRlci1yaWdodDpzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0OworICBwYWRkaW5nOjBjbSA1LjRwdCAwY20gNS40cHQnPgorICA8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3BhZ2UtYnJlYWstYWZ0ZXI6YXZvaWQnPkxlbmd0aCBvZiB0aGUgTUlNRSBjb250ZW50CisgIHR5cGUgKDxpPms8L2k+KS48L3A+CisgIDwvdGQ+CisgPC90cj4KKyA8dHI+CisgIDx0ZCB3aWR0aD0xMTEgdmFsaWduPXRvcCBzdHlsZT0nd2lkdGg6ODMuNHB0O2JvcmRlcjpzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0OworICBib3JkZXItdG9wOm5vbmU7cGFkZGluZzowY20gNS40cHQgMGNtIDUuNHB0Jz4KKyAgPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdwYWdlLWJyZWFrLWFmdGVyOmF2b2lkJz44PC9wPgorICA8L3RkPgorICA8dGQgd2lkdGg9OTYgdmFsaWduPXRvcCBzdHlsZT0nd2lkdGg6NzIuMHB0O2JvcmRlci10b3A6bm9uZTtib3JkZXItbGVmdDpub25lOworICBib3JkZXItYm90dG9tOnNvbGlkIHdpbmRvd3RleHQgMS4wcHQ7Ym9yZGVyLXJpZ2h0OnNvbGlkIHdpbmRvd3RleHQgMS4wcHQ7CisgIHBhZGRpbmc6MGNtIDUuNHB0IDBjbSA1LjRwdCc+CisgIDxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0ncGFnZS1icmVhay1hZnRlcjphdm9pZCc+PGk+azwvaT48L3A+CisgIDwvdGQ+CisgIDx0ZCB3aWR0aD0zNjEgdmFsaWduPXRvcCBzdHlsZT0nd2lkdGg6MjcwLjg1cHQ7Ym9yZGVyLXRvcDpub25lO2JvcmRlci1sZWZ0OgorICBub25lO2JvcmRlci1ib3R0b206c29saWQgd2luZG93dGV4dCAxLjBwdDtib3JkZXItcmlnaHQ6c29saWQgd2luZG93dGV4dCAxLjBwdDsKKyAgcGFkZGluZzowY20gNS40cHQgMGNtIDUuNHB0Jz4KKyAgPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdwYWdlLWJyZWFrLWFmdGVyOmF2b2lkJz5UaGUgTUlNRSBjb250ZW50IHR5cGUKKyAgKEFTQ0lJLWVuY29kZWQgd2l0aG91dCBudWxsLWNoYXJhY3RlciB0ZXJtaW5hdGlvbikuPC9wPgorICA8L3RkPgorIDwvdHI+CisgPHRyPgorICA8dGQgd2lkdGg9MTExIHZhbGlnbj10b3Agc3R5bGU9J3dpZHRoOjgzLjRwdDtib3JkZXI6c29saWQgd2luZG93dGV4dCAxLjBwdDsKKyAgYm9yZGVyLXRvcDpub25lO3BhZGRpbmc6MGNtIDUuNHB0IDBjbSA1LjRwdCc+CisgIDxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0ncGFnZS1icmVhay1hZnRlcjphdm9pZCc+OCs8aT5rPC9pPjwvcD4KKyAgPC90ZD4KKyAgPHRkIHdpZHRoPTk2IHZhbGlnbj10b3Agc3R5bGU9J3dpZHRoOjcyLjBwdDtib3JkZXItdG9wOm5vbmU7Ym9yZGVyLWxlZnQ6bm9uZTsKKyAgYm9yZGVyLWJvdHRvbTpzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0O2JvcmRlci1yaWdodDpzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0OworICBwYWRkaW5nOjBjbSA1LjRwdCAwY20gNS40cHQnPgorICA8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3BhZ2UtYnJlYWstYWZ0ZXI6YXZvaWQnPjxpPmwgPC9pPj0gMCBvciAxNjwvcD4KKyAgPC90ZD4KKyAgPHRkIHdpZHRoPTM2MSB2YWxpZ249dG9wIHN0eWxlPSd3aWR0aDoyNzAuODVwdDtib3JkZXItdG9wOm5vbmU7Ym9yZGVyLWxlZnQ6CisgIG5vbmU7Ym9yZGVyLWJvdHRvbTpzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0O2JvcmRlci1yaWdodDpzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0OworICBwYWRkaW5nOjBjbSA1LjRwdCAwY20gNS40cHQnPgorICA8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3BhZ2UtYnJlYWstYWZ0ZXI6YXZvaWQnPklmIHRoZSBzdWJmb3JtYXQgaXMKKyAgQ29tYmluZWQgRGVsaXZlcnksIHRoaXMgZmllbGQgY29udGFpbnMgdGhlIGF1dG8tZ2VuZXJhdGVkIGNvbnRlbnQgSUQgKDE2Jm5ic3A7Ynl0ZXMpLgorICBJZiBub3QsIHRoaXMgZmllbGQgaXMgemVyby1zaXplLjwvcD4KKyAgPC90ZD4KKyA8L3RyPgorIDx0cj4KKyAgPHRkIHdpZHRoPTExMSB2YWxpZ249dG9wIHN0eWxlPSd3aWR0aDo4My40cHQ7Ym9yZGVyOnNvbGlkIHdpbmRvd3RleHQgMS4wcHQ7CisgIGJvcmRlci10b3A6bm9uZTtwYWRkaW5nOjBjbSA1LjRwdCAwY20gNS40cHQnPgorICA8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3BhZ2UtYnJlYWstYWZ0ZXI6YXZvaWQnPjgrPGk+azwvaT4rPGk+bDwvaT48L3A+CisgIDwvdGQ+CisgIDx0ZCB3aWR0aD05NiB2YWxpZ249dG9wIHN0eWxlPSd3aWR0aDo3Mi4wcHQ7Ym9yZGVyLXRvcDpub25lO2JvcmRlci1sZWZ0Om5vbmU7CisgIGJvcmRlci1ib3R0b206c29saWQgd2luZG93dGV4dCAxLjBwdDtib3JkZXItcmlnaHQ6c29saWQgd2luZG93dGV4dCAxLjBwdDsKKyAgcGFkZGluZzowY20gNS40cHQgMGNtIDUuNHB0Jz4KKyAgPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdwYWdlLWJyZWFrLWFmdGVyOmF2b2lkJz48aT5tIDwvaT49IDAgb3IgOTwvcD4KKyAgPC90ZD4KKyAgPHRkIHdpZHRoPTM2MSB2YWxpZ249dG9wIHN0eWxlPSd3aWR0aDoyNzAuODVwdDtib3JkZXItdG9wOm5vbmU7Ym9yZGVyLWxlZnQ6CisgIG5vbmU7Ym9yZGVyLWJvdHRvbTpzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0O2JvcmRlci1yaWdodDpzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0OworICBwYWRkaW5nOjBjbSA1LjRwdCAwY20gNS40cHQnPgorICA8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3BhZ2UtYnJlYWstYWZ0ZXI6YXZvaWQnPklmIHRoZSBmaWxlIGlzIGJvdW5kIHRvIGEKKyAgc3BlY2lmaWMgU0lNIGNhcmQsIHRoaXMgZmllbGQgY29udGFpbnMgdGhlIDktYnl0ZSBwYWNrZWQgSU1TSSBudW1iZXIuIElmIG5vdCwKKyAgdGhpcyBmaWVsZCBpcyB6ZXJvLXNpemUuPC9wPgorICA8L3RkPgorIDwvdHI+CisgPHRyPgorICA8dGQgd2lkdGg9MTExIHZhbGlnbj10b3Agc3R5bGU9J3dpZHRoOjgzLjRwdDtib3JkZXI6c29saWQgd2luZG93dGV4dCAxLjBwdDsKKyAgYm9yZGVyLXRvcDpub25lO3BhZGRpbmc6MGNtIDUuNHB0IDBjbSA1LjRwdCc+CisgIDxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0ncGFnZS1icmVhay1hZnRlcjphdm9pZCc+OCs8aT5rPC9pPis8aT5sPC9pPis8aT5tPC9pPjwvcD4KKyAgPC90ZD4KKyAgPHRkIHdpZHRoPTk2IHZhbGlnbj10b3Agc3R5bGU9J3dpZHRoOjcyLjBwdDtib3JkZXItdG9wOm5vbmU7Ym9yZGVyLWxlZnQ6bm9uZTsKKyAgYm9yZGVyLWJvdHRvbTpzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0O2JvcmRlci1yaWdodDpzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0OworICBwYWRkaW5nOjBjbSA1LjRwdCAwY20gNS40cHQnPgorICA8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3BhZ2UtYnJlYWstYWZ0ZXI6YXZvaWQnPjxpPm48L2k+ICYjODgwNTsgMTY8L3A+CisgIDwvdGQ+CisgIDx0ZCB3aWR0aD0zNjEgdmFsaWduPXRvcCBzdHlsZT0nd2lkdGg6MjcwLjg1cHQ7Ym9yZGVyLXRvcDpub25lO2JvcmRlci1sZWZ0OgorICBub25lO2JvcmRlci1ib3R0b206c29saWQgd2luZG93dGV4dCAxLjBwdDtib3JkZXItcmlnaHQ6c29saWQgd2luZG93dGV4dCAxLjBwdDsKKyAgcGFkZGluZzowY20gNS40cHQgMGNtIDUuNHB0Jz4KKyAgPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdwYWdlLWJyZWFrLWFmdGVyOmF2b2lkJz5UaGUgZW5jcnlwdGVkIHNlc3Npb24ga2V5LCB0aGUKKyAgZmlyc3Qgc2l4dGVlbiBieXRlcyBvZiB3aGljaCBhcmUgYWxzbyB1c2VkIGFzIHRoZSBDVFItbW9kZSA8aT5ub25jZTwvaT4gKHNpbWlsYXIKKyAgdG8gdGhlIENCQy1tb2RlIDxpPmluaXRpYWxpemF0aW9uIHZlY3RvcjwvaT4pLjwvcD4KKyAgPC90ZD4KKyA8L3RyPgorIDx0cj4KKyAgPHRkIHdpZHRoPTExMSB2YWxpZ249dG9wIHN0eWxlPSd3aWR0aDo4My40cHQ7Ym9yZGVyOnNvbGlkIHdpbmRvd3RleHQgMS4wcHQ7CisgIGJvcmRlci10b3A6bm9uZTtwYWRkaW5nOjBjbSA1LjRwdCAwY20gNS40cHQnPgorICA8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3BhZ2UtYnJlYWstYWZ0ZXI6YXZvaWQnPjgrPGk+azwvaT4rPGk+bDwvaT4rPGk+bTwvaT4rPGk+bjwvaT48L3A+CisgIDwvdGQ+CisgIDx0ZCB3aWR0aD05NiB2YWxpZ249dG9wIHN0eWxlPSd3aWR0aDo3Mi4wcHQ7Ym9yZGVyLXRvcDpub25lO2JvcmRlci1sZWZ0Om5vbmU7CisgIGJvcmRlci1ib3R0b206c29saWQgd2luZG93dGV4dCAxLjBwdDtib3JkZXItcmlnaHQ6c29saWQgd2luZG93dGV4dCAxLjBwdDsKKyAgcGFkZGluZzowY20gNS40cHQgMGNtIDUuNHB0Jz4KKyAgPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdwYWdlLWJyZWFrLWFmdGVyOmF2b2lkJz4yMDwvcD4KKyAgPC90ZD4KKyAgPHRkIHdpZHRoPTM2MSB2YWxpZ249dG9wIHN0eWxlPSd3aWR0aDoyNzAuODVwdDtib3JkZXItdG9wOm5vbmU7Ym9yZGVyLWxlZnQ6CisgIG5vbmU7Ym9yZGVyLWJvdHRvbTpzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0O2JvcmRlci1yaWdodDpzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0OworICBwYWRkaW5nOjBjbSA1LjRwdCAwY20gNS40cHQnPgorICA8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3BhZ2UtYnJlYWstYWZ0ZXI6YXZvaWQnPkRhdGEgc2lnbmF0dXJll3RoZSBTSEEtMQorICBITUFDIG9mIHRoZSBlbmNyeXB0ZWQgY29udGVudCBkYXRhLjwvcD4KKyAgPC90ZD4KKyA8L3RyPgorIDx0cj4KKyAgPHRkIHdpZHRoPTExMSB2YWxpZ249dG9wIHN0eWxlPSd3aWR0aDo4My40cHQ7Ym9yZGVyOnNvbGlkIHdpbmRvd3RleHQgMS4wcHQ7CisgIGJvcmRlci10b3A6bm9uZTtwYWRkaW5nOjBjbSA1LjRwdCAwY20gNS40cHQnPgorICA8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3BhZ2UtYnJlYWstYWZ0ZXI6YXZvaWQnPjI4KzxpPms8L2k+KzxpPmw8L2k+KzxpPm08L2k+KzxpPm48L2k+PC9wPgorICA8L3RkPgorICA8dGQgd2lkdGg9OTYgdmFsaWduPXRvcCBzdHlsZT0nd2lkdGg6NzIuMHB0O2JvcmRlci10b3A6bm9uZTtib3JkZXItbGVmdDpub25lOworICBib3JkZXItYm90dG9tOnNvbGlkIHdpbmRvd3RleHQgMS4wcHQ7Ym9yZGVyLXJpZ2h0OnNvbGlkIHdpbmRvd3RleHQgMS4wcHQ7CisgIHBhZGRpbmc6MGNtIDUuNHB0IDBjbSA1LjRwdCc+CisgIDxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0ncGFnZS1icmVhay1hZnRlcjphdm9pZCc+MjA8L3A+CisgIDwvdGQ+CisgIDx0ZCB3aWR0aD0zNjEgdmFsaWduPXRvcCBzdHlsZT0nd2lkdGg6MjcwLjg1cHQ7Ym9yZGVyLXRvcDpub25lO2JvcmRlci1sZWZ0OgorICBub25lO2JvcmRlci1ib3R0b206c29saWQgd2luZG93dGV4dCAxLjBwdDtib3JkZXItcmlnaHQ6c29saWQgd2luZG93dGV4dCAxLjBwdDsKKyAgcGFkZGluZzowY20gNS40cHQgMGNtIDUuNHB0Jz4KKyAgPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdwYWdlLWJyZWFrLWFmdGVyOmF2b2lkJz5IZWFkZXIgc2lnbmF0dXJll3RoZSBTSEEtMQorICBITUFDIG9mIGFsbCB0aGUgZmllbGRzIGFib3ZlLCBpbmNsdWRpbmcgdGhlIGVuY3J5cHRlZCBzZXNzaW9uIGtleSBhbmQgZGF0YQorICBzaWduYXR1cmUuPC9wPgorICA8L3RkPgorIDwvdHI+CisgPHRyPgorICA8dGQgd2lkdGg9MTExIHZhbGlnbj10b3Agc3R5bGU9J3dpZHRoOjgzLjRwdDtib3JkZXI6c29saWQgd2luZG93dGV4dCAxLjBwdDsKKyAgYm9yZGVyLXRvcDpub25lO3BhZGRpbmc6MGNtIDUuNHB0IDBjbSA1LjRwdCc+CisgIDxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0ncGFnZS1icmVhay1hZnRlcjphdm9pZCc+NDgrPGk+azwvaT4rPGk+bDwvaT4rPGk+bTwvaT4rPGk+bjwvaT48L3A+CisgIDwvdGQ+CisgIDx0ZCB3aWR0aD05NiB2YWxpZ249dG9wIHN0eWxlPSd3aWR0aDo3Mi4wcHQ7Ym9yZGVyLXRvcDpub25lO2JvcmRlci1sZWZ0Om5vbmU7CisgIGJvcmRlci1ib3R0b206c29saWQgd2luZG93dGV4dCAxLjBwdDtib3JkZXItcmlnaHQ6c29saWQgd2luZG93dGV4dCAxLjBwdDsKKyAgcGFkZGluZzowY20gNS40cHQgMGNtIDUuNHB0Jz4KKyAgPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdwYWdlLWJyZWFrLWFmdGVyOmF2b2lkJz48aT4mbHQ7dG8gdGhlIGVuZCBvZiB0aGUKKyAgZmlsZSZndDs8L2k+PC9wPgorICA8L3RkPgorICA8dGQgd2lkdGg9MzYxIHZhbGlnbj10b3Agc3R5bGU9J3dpZHRoOjI3MC44NXB0O2JvcmRlci10b3A6bm9uZTtib3JkZXItbGVmdDoKKyAgbm9uZTtib3JkZXItYm90dG9tOnNvbGlkIHdpbmRvd3RleHQgMS4wcHQ7Ym9yZGVyLXJpZ2h0OnNvbGlkIHdpbmRvd3RleHQgMS4wcHQ7CisgIHBhZGRpbmc6MGNtIDUuNHB0IDBjbSA1LjRwdCc+CisgIDxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0ncGFnZS1icmVhay1hZnRlcjphdm9pZCc+VGhlIGNvbnRlbnQgZGF0YSBlbmNyeXB0ZWQKKyAgdXNpbmcgMTI4LWJpdCBBRVMgaW4gQ1RSIG1vZGUuPC9wPgorICA8L3RkPgorIDwvdHI+Cis8L3RhYmxlPgorCis8cCBjbGFzcz1Nc29DYXB0aW9uIHN0eWxlPSdtYXJnaW4tdG9wOjYuMHB0O21hcmdpbi1yaWdodDowY207bWFyZ2luLWJvdHRvbToKKzEyLjBwdDttYXJnaW4tbGVmdDowY207cGFnZS1icmVhay1hZnRlcjphdm9pZCc+PGEgbmFtZT0iX1JlZjE1MTI2OTIwNiI+VGFibGUgPC9hPjEuIERlZmluaXRpb24gb2YgdGhlIGZpZWxkcyBvZiBhbiBpbnRlcm5hbCBGb3J3YXJkIExvY2sgZmlsZS48L3A+CisKKzxwIGNsYXNzPU1zb0JvZHlUZXh0PkFzIG9mIG5vdywgbmVpdGhlciBDb21iaW5lZCBEZWxpdmVyeSBub3IgdXNhZ2UKK3Jlc3RyaWN0aW9ucyAoaW5jbHVkaW5nIFNJTSBiaW5kaW5nKSBhcmUgc3VwcG9ydGVkLiBUaGVzZSBmaWVsZHMgYXJlIHJlc2VydmVkCitmb3IgZnV0dXJlIHVzZS48L3A+CisKKzxoMj48YSBuYW1lPSJfVG9jMjc2NDcxNDMzIj40LjE8c3BhbiBzdHlsZT0nZm9udDo3LjBwdCAiVGltZXMgTmV3IFJvbWFuIic+Jm5ic3A7Jm5ic3A7Jm5ic3A7Cis8L3NwYW4+S2V5IERlcml2YXRpb248L2E+PC9oMj4KKworPHAgY2xhc3M9TXNvQm9keVRleHQ+VGhlIHNlc3Npb24ga2V5IGNvbnNpc3RzIG9mIHNpeHRlZW4gYnl0ZXMgZmV0Y2hlZCBmcm9tIGEKK2NyeXB0b2dyYXBoaWNhbGx5IHNlY3VyZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvci4gRnJvbSB0aGUgc2Vzc2lvbiBrZXksIHR3bworc2VwYXJhdGUga2V5cyBhcmUgZGVyaXZlZDogb25lIHVzZWQgZm9yIGVuY3J5cHRpb24sIHRoZSBvdGhlciBmb3Igc2lnbmluZy48L3A+CisKKzxwIGNsYXNzPU1zb0JvZHlUZXh0PlRoZSBlbmNyeXB0aW9uIGtleSBpcyB0aGUgb3V0cHV0IGZyb20gZW5jcnlwdGluZyB0aGUKKzE2LWJ5dGUgYWxsLXplcm8gaW5wdXQgYmxvY2sgezAsIDAsIIUsIDB9IHVzaW5nIDEyOC1iaXQgQUVTIHdpdGggdGhlIHJhbmRvbSBzZXNzaW9uCitrZXkgYXMgdGhlIGtleS4gVGhlIHNpZ25pbmcga2V5IGlzIHRoZSBvdXRwdXQgZnJvbSBlbmNyeXB0aW5nIHRoZSAxNi1ieXRlIGlucHV0CitibG9jayB7MSwgMCwghSwgMH0gdGhlIHNhbWUgd2F5LiBUaGUga2V5cyBzbyBkZXJpdmVkIHdpbGwgYmUgY3J5cHRvZ3JhcGhpY2FsbHkKK2luZGVwZW5kZW50IGZyb20gZWFjaCBvdGhlci48L3A+CisKKzxwIGNsYXNzPU1zb0JvZHlUZXh0PlRoZSBzZXNzaW9uIGtleSBpcyBlbmNyeXB0ZWQgdXNpbmcgYSBoYXJkd2FyZS1kZXBlbmRlbnQKK2tleS1lbmNyeXB0aW9uIGtleSB1bmlxdWUgdG8gZWFjaCBkZXZpY2UuIFRoZSBlbmNyeXB0ZWQgc2Vzc2lvbiBrZXkgaXMgc3RvcmVkCitpbnNpZGUgdGhlIGZpbGUsIGFuZCBpdHMgZmlyc3Qgc2l4dGVlbiBieXRlcyBhcmUgYWxzbyB1c2VkIGFzIHRoZSA8aT5ub25jZTwvaT4KK2ZvciB0aGUgQ1RSLW1vZGUgZW5jcnlwdGlvbiBvZiB0aGUgY29udGVudCBkYXRhLjwvcD4KKworPGgyPjxhIG5hbWU9Il9Ub2MyNzY0NzE0MzQiPjQuMjxzcGFuIHN0eWxlPSdmb250OjcuMHB0ICJUaW1lcyBOZXcgUm9tYW4iJz4mbmJzcDsmbmJzcDsmbmJzcDsKKzwvc3Bhbj5DYWxjdWxhdGlvbiBvZiB0aGUgQ291bnRlcnM8L2E+PC9oMj4KKworPHAgY2xhc3M9TXNvQm9keVRleHQ+VXNpbmcgQ1RSICiTY291bnRlcpQpIG1vZGUsIGEgYmxvY2sgY2lwaGVyIHN1Y2ggYXMgQUVTIGNhbgorYmUgdHVybmVkIGludG8gYSBzdHJlYW0gY2lwaGVyLiBUaGUgcHJvY2VzcyBvZiBlbmNyeXB0aW9uIGFuZCBkZWNyeXB0aW9uIGlzCit3ZWxsIGRlZmluZWQgaW4gWzFdLCBleGNlcHQgZm9yIHRoZSBzcGVjaWZpY3Mgb2YgdGhlIGNhbGN1bGF0aW9uIG9mIHRoZQorY291bnRlcnMuIEZvciB0aGUgaW50ZXJuYWwgRm9yd2FyZCBMb2NrIGZpbGUgZm9ybWF0LCB0aGUgY291bnRlcnMgYXJlCitjYWxjdWxhdGVkIGFzIGZvbGxvd3M6PC9wPgorCis8cCBjbGFzcz1Nc29Cb2R5VGV4dCBzdHlsZT0nbWFyZ2luLWxlZnQ6MzYuMHB0O3RleHQtaW5kZW50Oi0xOC4wcHQnPjEuPHNwYW4KK3N0eWxlPSdmb250OjcuMHB0ICJUaW1lcyBOZXcgUm9tYW4iJz4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgPC9zcGFuPlRoZQorbm9uY2UgaXMgaW50ZXJwcmV0ZWQgYXMgYSAxMjgtYml0IHVuc2lnbmVkIGludGVnZXIgaW4gbGl0dGxlLWVuZGlhbiBmb3JtYXQuPC9wPgorCis8cCBjbGFzcz1Nc29Cb2R5VGV4dCBzdHlsZT0nbWFyZ2luLWxlZnQ6MzYuMHB0O3RleHQtaW5kZW50Oi0xOC4wcHQnPjIuPHNwYW4KK3N0eWxlPSdmb250OjcuMHB0ICJUaW1lcyBOZXcgUm9tYW4iJz4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgPC9zcGFuPlRoZQoremVyby1iYXNlZCBibG9jayBzZXF1ZW5jZSBudW1iZXIgKGFsc28gYSBsaXR0bGUtZW5kaWFuIHVuc2lnbmVkIGludGVnZXIpIGlzCithZGRlZCBtb2R1bG8gMjxzdXA+MTI4PC9zdXA+IHRvIHRoZSBub25jZSB0byBwcm9kdWNlIHRoZSBjb3VudGVyIGZvciBhIGdpdmVuCitibG9jay48L3A+CisKKzxoMT48YSBuYW1lPSJfVG9jMjc2NDcxNDM1Ij41PHNwYW4gc3R5bGU9J2ZvbnQ6Ny4wcHQgIlRpbWVzIE5ldyBSb21hbiInPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOworPC9zcGFuPlVuaXQgVGVzdCBDYXNlczwvYT48L2gxPgorCis8cCBjbGFzcz1Nc29Cb2R5VGV4dD5Vbml0IHRlc3QgY2FzZXMgZm9yIHRoZSBjb252ZXJ0ZXIgYW5kIGRlY29kZXIgY29tZSBpbiB0d28KK3ZhcmlldGllczo8L3A+CisKKzxwIGNsYXNzPU1zb0JvZHlUZXh0IHN0eWxlPSdtYXJnaW4tbGVmdDozNi4wcHQ7dGV4dC1pbmRlbnQ6LTE4LjBwdCc+MS48c3Bhbgorc3R5bGU9J2ZvbnQ6Ny4wcHQgIlRpbWVzIE5ldyBSb21hbiInPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA8L3NwYW4+PGk+QmxhY2stYm94PC9pPgordGVzdCBjYXNlcyBhaW0gdG8gdmVyaWZ5IHRoYXQgeW91IGdldCBzZW5zaWJsZSByZXN1bHRzIGZyb20gbWFsZm9ybWVkIG9yCiuTdHJpY2t5lCBpbnB1dCBkYXRhLjwvcD4KKworPHAgY2xhc3M9TXNvQm9keVRleHQgc3R5bGU9J21hcmdpbi1sZWZ0OjM2LjBwdDt0ZXh0LWluZGVudDotMTguMHB0Jz4yLjxzcGFuCitzdHlsZT0nZm9udDo3LjBwdCAiVGltZXMgTmV3IFJvbWFuIic+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IDwvc3Bhbj48aT5XaGl0ZS1ib3g8L2k+Cit0ZXN0IGNhc2VzIGFpbSB0byBtYXhpbWl6ZSBjb2RlIGNvdmVyYWdlIHVzaW5nIGtub3dsZWRnZSBvZiBjb2RlIGludGVybmFscy48L3A+CisKKzxwIGNsYXNzPU1zb0JvZHlUZXh0PlRoZSBibGFjay1ib3ggdGVzdCBjYXNlcyBhcmUgZGVwZW5kZW50IG9uIGEgc3BlY2lmaWNhbGx5CitkZXNpZ25lZCBzZXQgb2YgaW5wdXQgZmlsZXMgZm91bmQgaW4gdGhlIDxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0OworZm9udC1mYW1pbHk6Ikx1Y2lkYSBDb25zb2xlIiwiRGVqYVZ1IFNhbnMgTW9ubyInPmZvcndhcmQtbG9jay9pbnRlcm5hbC1mb3JtYXQvdGVzdC9yZXM8L3NwYW4+CitkaXJlY3RvcnkgaW4gdGhlIHJlcG9zaXRvcnkuIEZvciCRdGVzdHOSIHZhcmlhbnRzIG9mIHRoZSBzb2Z0d2FyZSwgdGhlc2UgaW5wdXQKK2ZpbGVzIHdpbGwgYmUgYXV0b21hdGljYWxseSBpbnN0YWxsZWQgaW4gdGhlIGZpbGUgc3lzdGVtIGltYWdlIGR1cmluZyBidWlsZC48L3A+CisKKzxwIGNsYXNzPU1zb0JvZHlUZXh0PlJ1biB0aGUgdGVzdCBjYXNlcyBmcm9tIHRoZSBBREIgc2hlbGwgY29tbWFuZCBsaW5lIGFzCitmb2xsb3dzOjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tdG9wOjBjbTttYXJnaW4tcmlnaHQ6MGNtO21hcmdpbi1ib3R0b206Ni4wcHQ7CittYXJnaW4tbGVmdDoyMS41NXB0Jz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDtmb250LWZhbWlseToiTHVjaWRhIENvbnNvbGUiLCJEZWphVnUgU2FucyBNb25vIic+IworZ3Rlc3RfZndkbG9jazwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb0JvZHlUZXh0PklmIGFsbCBibGFjay1ib3ggYnV0IG5vIHdoaXRlLWJveCB0ZXN0IGNhc2VzIGZhaWwsIHRoZQoraW5wdXQgZmlsZXMgcHJvYmFibHkgY2FuknQgYmUgZm91bmQgaW4gdGhlIHdvcmtpbmcgZGlyZWN0b3J5LjwvcD4KKworPGgxPjxhIG5hbWU9Il9Ub2MyNzY0NzE0MzYiPjY8c3BhbiBzdHlsZT0nZm9udDo3LjBwdCAiVGltZXMgTmV3IFJvbWFuIic+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Cis8L3NwYW4+UmVmZXJlbmNlczwvYT48L2gxPgorCis8cCBjbGFzcz1Nc29Cb2R5VGV4dCBzdHlsZT0nbWFyZ2luLWxlZnQ6MjguOXB0O3RleHQtaW5kZW50Oi0yOC45cHQnPlsxXTxzcGFuCitzdHlsZT0nZm9udDo3LjBwdCAiVGltZXMgTmV3IFJvbWFuIic+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Cis8L3NwYW4+PGEKK2hyZWY9Imh0dHA6Ly9jc3JjLm5pc3QuZ292L3B1YmxpY2F0aW9ucy9uaXN0cHVicy84MDAtMzhhL3NwODAwLTM4YS5wZGYiPkR3b3JraW4sCitNb3JyaXM6IJNSZWNvbW1lbmRhdGlvbiBmb3IgQmxvY2sgQ2lwaGVyIE1vZGVzIG9mIE9wZXJhdGlvbpdNZXRob2RzIGFuZAorVGVjaG5pcXVlcyyUIE5JU1QgU3BlY2lhbCBQdWJsaWNhdGlvbiA4MDAtMzhBLCBEZWNlbWJlciAyMDAxLjwvYT48YQorbmFtZT0iX1JlZjE1MTI2OTA3MyI+PC9hPjwvcD4KKworPC9kaXY+CisKKzwvYm9keT4KKworPC9odG1sPgpkaWZmIC0tZ2l0IGEvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9pbnRlcm5hbC1mb3JtYXQvZG9jL2ltYWdlcy9pbWFnZTAwMS5naWYgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9kb2MvaW1hZ2VzL2ltYWdlMDAxLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTk0NTEzCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9pbnRlcm5hbC1mb3JtYXQvZG9jL2ltYWdlcy9pbWFnZTAwMS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9pbnRlcm5hbC1mb3JtYXQvZG9jL2ltYWdlcy9pbWFnZTAwMi5naWYgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9kb2MvaW1hZ2VzL2ltYWdlMDAyLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzEyZjQ2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9pbnRlcm5hbC1mb3JtYXQvZG9jL2ltYWdlcy9pbWFnZTAwMi5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9pbnRlcm5hbC1mb3JtYXQvZG9jL2ltYWdlcy9pbWFnZTAwMy5naWYgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9kb2MvaW1hZ2VzL2ltYWdlMDAzLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTAxOWNhCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9pbnRlcm5hbC1mb3JtYXQvZG9jL2ltYWdlcy9pbWFnZTAwMy5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9pbnRlcm5hbC1mb3JtYXQvZG9jL2ltYWdlcy9pbWFnZTAwNC5naWYgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9kb2MvaW1hZ2VzL2ltYWdlMDA0LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYWUxZDAxCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9pbnRlcm5hbC1mb3JtYXQvZG9jL2ltYWdlcy9pbWFnZTAwNC5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9pbnRlcm5hbC1mb3JtYXQvZG9jL2ltYWdlcy9pbWFnZTAwNS5naWYgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9kb2MvaW1hZ2VzL2ltYWdlMDA1LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDg3YmU5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9pbnRlcm5hbC1mb3JtYXQvZG9jL2ltYWdlcy9pbWFnZTAwNS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9pbnRlcm5hbC1mb3JtYXQvZG9jL2ltYWdlcy9pbWFnZTAwNi5naWYgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9kb2MvaW1hZ2VzL2ltYWdlMDA2LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDQ1YjZiCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9pbnRlcm5hbC1mb3JtYXQvZG9jL2ltYWdlcy9pbWFnZTAwNi5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgo=